LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCgovKgogKiBTYW1wbGUgTUlESSBXaW5lIERyaXZlciBmb3IgTGludXgKICoKICogQ29weXJpZ2h0IDE5OTQgTWFydGluIEF5b3R0ZQogKi8KCi8qIAogKiBFcmljIFBPVUVDSCA6IAogKiA5OC83IGNoYW5nZXMgZm9yIG1ha2luZyB0aGlzIE1JREkgZHJpdmVyIHdvcmsgb24gT1NTCiAqIAljdXJyZW50IHN1cHBvcnQgaXMgbGltaXRlZCB0byBNSURJIHBvcnRzIG9mIE9TUyBzeXN0ZW1zCiAqIDk4LzkJcmV3cml0aW5nIE1DSSBjb2RlIGZvciBNSURJCiAqIDk4LzExIHNwbGl0dGVkIGluIG1pZGkuYyBhbmQgbWNpbWlkaS5jCiAqLwoKI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgIndpbmUvd2ludXNlcjE2LmgiCiNpbmNsdWRlICJsZHQuaCIKI2luY2x1ZGUgIm11bHRpbWVkaWEuaCIKI2luY2x1ZGUgInVzZXIuaCIKI2luY2x1ZGUgImRyaXZlci5oIgojaW5jbHVkZSAieG1hbGxvYy5oIgojaW5jbHVkZSAiZGVidWcuaCIKI2luY2x1ZGUgImNhbGxiYWNrLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJoZWFwLmgiCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBEV09SRAkJZHdGaXJzdDsJCS8qIG9mZnNldCBpbiBmaWxlIG9mIHRyYWNrICovCiAgICBEV09SRAkJZHdMYXN0OwkJCS8qIG51bWJlciBvZiBieXRlcyBpbiBmaWxlIG9mIHRyYWNrICovCiAgICBEV09SRAkJZHdJbmRleDsJCS8qIGN1cnJlbnQgaW5kZXggaW4gZmlsZSAoZHdGaXJzdCA8PSBkd0luZGV4IDwgZHdMYXN0KSAqLwogICAgRFdPUkQJCWR3TGVuZ3RoOwkJLyogbnVtYmVyIG9mIHB1bHNlcyBpbiB0aGlzIHRyYWNrICovCiAgICBEV09SRAkJZHdFdmVudFB1bHNlOwkJLyogY3VycmVudCBwdWxzZSAjIChldmVudCkgcG9pbnRlZCBieSBkd0luZGV4ICovCiAgICBEV09SRAkJZHdFdmVudERhdGE7CQkvKiBjdXJyZW50IGRhdGEgICAgKGV2ZW50KSBwb2ludGVkIGJ5IGR3SW5kZXggKi8KICAgIFdPUkQJCXdFdmVudExlbmd0aDsJCS8qIGN1cnJlbnQgbGVuZ3RoICAoZXZlbnQpIHBvaW50ZWQgYnkgZHdJbmRleCAqLwogICAgV09SRAkJd1N0YXR1cyA6IDEsCQkvKiAxIDogcGxheWluZywgMCA6IGRvbmUgKi8KCSAgICAgICAgICAgICAgICB3VHJhY2tOciA6IDcsCgkgICAgICAgICAgICAgICAgd0xhc3RDb21tYW5kIDogODsKfSBNQ0lfTUlESVRSQUNLOwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50CQkJblVzZUNvdW50OyAgICAgICAgICAJLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gICAgICAgICAgKi8KICAgIFdPUkQJCXdOb3RpZnlEZXZpY2VJRDsgICAgCS8qIE1DSSBkZXZpY2UgSUQgd2l0aCBhIHBlbmRpbmcgbm90aWZpY2F0aW9uICovCiAgICBIQU5ETEUxNiAJCWhDYWxsYmFjazsgICAgICAgICAJLyogQ2FsbGJhY2sgaGFuZGxlIGZvciBwZW5kaW5nIG5vdGlmaWNhdGlvbiAgKi8KICAgIEhNTUlPMzIJCWhGaWxlOwkgICAgICAgICAgICAJLyogbW1pbyBmaWxlIGhhbmRsZSBvcGVuIGFzIEVsZW1lbnQgICAgICAgICAgKi8KICAgIE1DSV9PUEVOX1BBUk1TMzJBIAlvcGVuUGFybXM7CiAgICBITE9DQUwxNgkJaE1pZGlIZHI7CiAgICBXT1JECQlkd1N0YXR1czsJCS8qIG9uZSBmcm9tIE1DSV9NT0RFX3h4eHggKi8KICAgIERXT1JECQlkd01jaVRpbWVGb3JtYXQ7CS8qIE9uZSBvZiB0aGUgc3VwcG9ydGVkIE1DSV9GT1JNQVRfeHh4eCAqLwkgICAgICAgCiAgICBXT1JECQl3Rm9ybWF0OwkJLyogRm9ybWF0IG9mIE1JREkgaEZpbGUgKDAsIDEgb3IgMikgKi8KICAgIFdPUkQJCW5UcmFja3M7CQkvKiBOdW1iZXIgb2YgdHJhY2tzIGluIGhGaWxlICovCiAgICBXT1JECQluRGl2aXNpb247CQkvKiBOdW1iZXIgb2YgZGl2aXNpb24gaW4gaEZpbGUgUFBRTiBvciBTTVBURSAqLwogICAgV09SRAkJd1N0YXJ0ZWRQbGF5aW5nOwogICAgRFdPUkQJCWR3VGVtcG87CQkvKiBUZW1wbyAoIyBvZiAxLzQgbm90ZSBwZXIgc2Vjb25kICovCiAgICBNQ0lfTUlESVRSQUNLKiAgICAgCXRyYWNrczsJCQkvKiBDb250ZW50IG9mIGVhY2ggdHJhY2sgKi8KICAgIERXT1JECQlkd1B1bHNlOwkJCiAgICBEV09SRAkJZHdQb3NpdGlvbk1TOwogICAgRFdPUkQJCWR3U3RhcnRUaWNrczsKfSBXSU5FX01DSU1JREk7CgpzdGF0aWMgV0lORV9NQ0lNSURJCU1DSU1pZGlEZXZbTUFYX01DSU1JRElEUlZdOwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KgogKiAgICAgICAgICAgICAgICAgIAkgICAgTUNJIE1JREkgaW1wbGVtYW50YXRpb24JCQkqCiAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojaWZkZWYgU05EQ1RMX01JRElfSU5GTwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpR2V0T3BlbkRldgkJW2ludGVybmFsXQkKICovCnN0YXRpYyBXSU5FX01DSU1JREkqICBNSURJX21jaUdldE9wZW5EZXYoVUlOVDE2IHdEZXZJRCkKewogICAgaWYgKHdEZXZJRCA+PSBNQVhfTUNJTUlESURSViB8fCBNQ0lNaWRpRGV2W3dEZXZJRF0ublVzZUNvdW50ID09IDApIHsKCVdBUk4obWNpbWlkaSwgIkludmFsaWQgd0RldklEPSV1XG4iLCB3RGV2SUQpOwoJcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gJk1DSU1pZGlEZXZbd0RldklEXTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRCeXRlCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZEJ5dGUoV0lORV9NQ0lNSURJKiB3bW0sIEJZVEUgKmxwYnl0KQp7CiAgICBEV09SRAlyZXQgPSAwOwoKICAgIGlmIChscGJ5dCA9PSBOVUxMIHx8IAoJbW1pb1JlYWQzMih3bW0tPmhGaWxlLCAoSFBTVFIpbHBieXQsIChsb25nKXNpemVvZihCWVRFKSkgIT0gKGxvbmcpc2l6ZW9mKEJZVEUpKSB7CglXQVJOKG1jaW1pZGksICJFcnJvciByZWFkaW5nIHdtbT0lcFxuIiwgd21tKTsKCXJldCA9IE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZFdvcmQJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkV29yZChXSU5FX01DSU1JREkqIHdtbSwgTFBXT1JEIGxwdykKewogICAgQllURQloaWJ5dGUsIGxvYnl0ZTsKICAgIERXT1JECXJldCA9IE1DSUVSUl9JTlRFUk5BTDsKCiAgICBpZiAobHB3ICE9IE5VTEwgJiYgCglNSURJX21jaVJlYWRCeXRlKHdtbSwgJmhpYnl0ZSkgPT0gMCAmJiAKCU1JRElfbWNpUmVhZEJ5dGUod21tLCAmbG9ieXRlKSA9PSAwKSB7CgkqbHB3ID0gKChXT1JEKWhpYnl0ZSA8PCA4KSArIGxvYnl0ZTsKCXJldCA9IDA7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZExvbmcJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkTG9uZyhXSU5FX01DSU1JREkqIHdtbSwgTFBEV09SRCBscGR3KQp7CiAgICBXT1JECWhpd29yZCwgbG93b3JkOwogICAgRFdPUkQJcmV0ID0gTUNJRVJSX0lOVEVSTkFMOwoKICAgIGlmIChscGR3ICE9IE5VTEwgJiYKCU1JRElfbWNpUmVhZFdvcmQod21tLCAmaGl3b3JkKSA9PSAwICYmCglNSURJX21jaVJlYWRXb3JkKHdtbSwgJmxvd29yZCkgPT0gMCkgewoJKmxwZHcgPSBNQUtFTE9ORyhsb3dvcmQsIGhpd29yZCk7CglyZXQgPSAwOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAJCQkJTUlESV9tY2lSZWFkVmFyeUxlbgkJW2ludGVybmFsXQkKICovCnN0YXRpYyBXT1JEIE1JRElfbWNpUmVhZFZhcnlMZW4oV0lORV9NQ0lNSURJKiB3bW0sIExQRFdPUkQgbHBkdykKewogICAgQllURQlieXRlOwogICAgRFdPUkQJdmFsdWUgPSAwOwogICAgV09SRAlyZXQgPSAwOwoKICAgIGlmIChscGR3ID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9JTlRFUk5BTDsKICAgIH0gZWxzZSB7CglkbyB7CgkgICAgaWYgKE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYnl0ZSkgIT0gMCkgewoJCXJldHVybiAwOwoJICAgIH0KCSAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA3KSArIChieXRlICYgMHg3Rik7CgkgICAgcmV0Kys7IAoJfSB3aGlsZSAoYnl0ZSAmIDB4ODApOwoJKmxwZHcgPSB2YWx1ZTsKCS8qCgkgIFRSQUNFKG1jaW1pZGksICJ2YWw9JTA4bFggXG4iLCB2YWx1ZSk7CgkqLwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWROZXh0RXZlbnQJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQJTUlESV9tY2lSZWFkTmV4dEV2ZW50KFdJTkVfTUNJTUlESSogd21tLCBNQ0lfTUlESVRSQUNLKiBtbXQpIAp7CiAgICBCWVRFCWIxLCBiMiA9IDAsIGIzOwogICAgV09SRAlodyA9IDA7CiAgICBEV09SRAlldnRQdWxzZTsKICAgIERXT1JECWV2dExlbmd0aDsKICAgIERXT1JECXRtcDsKCiAgICBpZiAobW1pb1NlZWszMih3bW0tPmhGaWxlLCBtbXQtPmR3SW5kZXgsIFNFRUtfU0VUKSAhPSBtbXQtPmR3SW5kZXgpIHsKCVdBUk4obWNpbWlkaSwgIkNhbid0IHNlZWsgYXQgJTA4bFggXG4iLCBtbXQtPmR3SW5kZXgpOwoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KICAgIGV2dExlbmd0aCA9IE1JRElfbWNpUmVhZFZhcnlMZW4od21tLCAmZXZ0UHVsc2UpICsgMTsJLyogPiAwICovCiAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIxKTsKICAgIHN3aXRjaCAoYjEpIHsKICAgIGNhc2UgMHhGMDoKICAgIGNhc2UgMHhGNzoKCWV2dExlbmd0aCArPSBNSURJX21jaVJlYWRWYXJ5TGVuKHdtbSwgJnRtcCk7CglldnRMZW5ndGggKz0gdG1wOwoJYnJlYWs7CiAgICBjYXNlIDB4RkY6CglNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIyKTsJZXZ0TGVuZ3RoKys7CgkKCWV2dExlbmd0aCArPSBNSURJX21jaVJlYWRWYXJ5TGVuKHdtbSwgJnRtcCk7CglpZiAoZXZ0TGVuZ3RoID49IDB4MTAwMDB1KSB7CgkgICAgLyogdGhpcyBsaW1pdGF0aW9uIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gKi8KCSAgICBXQVJOKG1jaW1pZGksICJPdWNoICEhIEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb24gdG8gNjRrIGJ5dGVzIGZvciBhIE1JREkgZXZlbnQgaXMgb3ZlcmZsb3dlZFxuIik7CgkgICAgaHcgPSAweEZGRkY7Cgl9IGVsc2UgewoJICAgIGh3ID0gTE9XT1JEKGV2dExlbmd0aCk7Cgl9CglldnRMZW5ndGggKz0gdG1wOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJaWYgKGIxICYgMHg4MCkgeyAvKiB1c2UgcnVubmluZyBzdGF0dXMgPyAqLwoJICAgIG1tdC0+d0xhc3RDb21tYW5kID0gYjE7CgkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZiMik7CWV2dExlbmd0aCsrOwoJfSBlbHNlIHsKCSAgICBiMiA9IGIxOwoJICAgIGIxID0gbW10LT53TGFzdENvbW1hbmQ7Cgl9Cglzd2l0Y2ggKChiMSA+PiA0KSAmIDB4MDcpIHsKCWNhc2UgMDoJY2FzZSAxOgljYXNlIDI6IGNhc2UgMzogY2FzZSA2OgoJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYjMpOwlldnRMZW5ndGgrKzsKCSAgICBodyA9IGIzOwoJICAgIGJyZWFrOwoJY2FzZSA0OgljYXNlIDU6CgkgICAgYnJlYWs7CgljYXNlIDc6CgkgICAgV0FSTihtY2ltaWRpLCAiU3RyYW5nZSBpbmRlZWQgYjE9MHglMDJ4XG4iLCBiMSk7Cgl9CglicmVhazsKICAgIH0KICAgIGlmIChtbXQtPmR3SW5kZXggKyBldnRMZW5ndGggPiBtbXQtPmR3TGFzdCkKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CgogICAgbW10LT5kd0V2ZW50UHVsc2UgKz0gZXZ0UHVsc2U7CiAgICBtbXQtPmR3RXZlbnREYXRhICAgPSAoaHcgPDwgMTYpICsgKGIyIDw8IDgpICsgYjE7CiAgICBtbXQtPndFdmVudExlbmd0aCAgPSBldnRMZW5ndGg7CgogICAgLyoKICAgIFRSQUNFKG1jaW1pZGksICJbJXVdID0+IHB1bHNlPSUwOGx4KCUwOGx4KSwgZGF0YT0lMDhseCwgbGVuZ3RoPSV1XG4iLCAKCSAgbW10LT53VHJhY2tOciwgbW10LT5kd0V2ZW50UHVsc2UsIGV2dFB1bHNlLCAKCSAgbW10LT5kd0V2ZW50RGF0YSwgbW10LT53RXZlbnRMZW5ndGgpOwogICAgKi8KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZE1UcmsJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkTVRyayhXSU5FX01DSU1JREkqIHdtbSwgTUNJX01JRElUUkFDSyogbW10KQp7CiAgICBEV09SRAkJdG9iZXJlYWQ7CiAgICBGT1VSQ0MJCWZvdXJjYzsKCiAgICBpZiAobW1pb1JlYWQzMih3bW0tPmhGaWxlLCAoSFBTVFIpJmZvdXJjYywgKGxvbmcpc2l6ZW9mKEZPVVJDQykpICE9IAoJKGxvbmcpc2l6ZW9mKEZPVVJDQykpIHsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CgogICAgaWYgKGZvdXJjYyAhPSBtbWlvRk9VUkNDKCdNJywgJ1QnLCAncicsICdrJykpIHsKCVdBUk4obWNpbWlkaSwgIkNhbid0IHN5bmNocm9uaXplIG9uICdNVHJrJyAhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CgogICAgaWYgKE1JRElfbWNpUmVhZExvbmcod21tLCAmdG9iZXJlYWQpICE9IDApIHsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CiAgICBtbXQtPmR3Rmlyc3QgPSBtbWlvU2VlazMyKHdtbS0+aEZpbGUsIDAsIFNFRUtfQ1VSKTsgLyogPj0gMCAqLwogICAgbW10LT5kd0xhc3QgPSBtbXQtPmR3Rmlyc3QgKyB0b2JlcmVhZDsKCiAgICAvKiBjb21wdXRlICMgb2YgcHVsc2VzIGluIHRoaXMgdHJhY2sgKi8KICAgIG1tdC0+ZHdJbmRleCA9IG1tdC0+ZHdGaXJzdDsKICAgIG1tdC0+ZHdFdmVudFB1bHNlID0gMDsKCiAgICB3aGlsZSAoTUlESV9tY2lSZWFkTmV4dEV2ZW50KHdtbSwgbW10KSA9PSAwICYmIAoJICAgTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpICE9IDB4MkZGRikgewkKCW1tdC0+ZHdJbmRleCArPSBtbXQtPndFdmVudExlbmd0aDsKICAgIH0KICAgIG1tdC0+ZHdMZW5ndGggPSBtbXQtPmR3RXZlbnRQdWxzZTsKCiAgICBUUkFDRShtY2ltaWRpLCAiVHJhY2sgJXUgaGFzICVsdSBieXRlcyBhbmQgJWx1IHB1bHNlc1xuIiwgbW10LT53VHJhY2tOciwgdG9iZXJlYWQsIG1tdC0+ZHdMZW5ndGgpOwoKICAgIC8qIHJlc2V0IHRyYWNrIGRhdGEgKi8KICAgIG1tdC0+d1N0YXR1cyA9IDE7CS8qIG9rLCBwbGF5aW5nICovCiAgICBtbXQtPmR3SW5kZXggPSBtbXQtPmR3Rmlyc3Q7CiAgICBtbXQtPmR3RXZlbnRQdWxzZSA9IDA7CgogICAgaWYgKG1taW9TZWVrMzIod21tLT5oRmlsZSwgMCwgU0VFS19DVVIpICE9IG1tdC0+ZHdMYXN0KSB7CglXQVJOKG1jaW1pZGksICJPdWNoLCBvdXQgb2Ygc3luYyBzZWVrPSVsdSB0cmFjaz0lbHVcbiIsIAoJICAgICBtbWlvU2VlazMyKHdtbS0+aEZpbGUsIDAsIFNFRUtfQ1VSKSwgbW10LT5kd0xhc3QpOwoJLyogcG9zaXRpb24gYXQgZW5kIG9mIHRoaXMgdHJhY2ssIHRvIGJlIHJlYWR5IHRvIHJlYWQgbmV4dCB0cmFjayAqLwoJbW1pb1NlZWszMih3bW0tPmhGaWxlLCBtbXQtPmR3TGFzdCwgU0VFS19TRVQpOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZE1UaGQJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkTVRoZChXSU5FX01DSU1JREkqIHdtbSwgRFdPUkQgZHdPZmZzZXQpCnsKICAgIERXT1JECXRvYmVyZWFkOwogICAgRk9VUkNDCWZvdXJjYzsKICAgIFdPUkQJbnQ7CgogICAgVFJBQ0UobWNpbWlkaSwgIiglcCwgJTA4bFgpO1xuIiwgd21tLCBkd09mZnNldCk7CgogICAgaWYgKG1taW9TZWVrMzIod21tLT5oRmlsZSwgZHdPZmZzZXQsIFNFRUtfU0VUKSAhPSBkd09mZnNldCkgewoJV0FSTihtY2ltaWRpLCAiQ2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfQogICAgaWYgKG1taW9SZWFkMzIod21tLT5oRmlsZSwgKEhQU1RSKSZmb3VyY2MsCgkJICAgKGxvbmcpIHNpemVvZihGT1VSQ0MpKSAhPSAobG9uZykgc2l6ZW9mKEZPVVJDQykpCglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwoKICAgIGlmIChmb3VyY2MgIT0gbW1pb0ZPVVJDQygnTScsICdUJywgJ2gnLCAnZCcpKSB7CglXQVJOKG1jaW1pZGksICJDYW4ndCBzeW5jaHJvbml6ZSBvbiAnTVRoZCcgIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfQoKICAgIGlmIChNSURJX21jaVJlYWRMb25nKHdtbSwgJnRvYmVyZWFkKSAhPSAwIHx8IHRvYmVyZWFkIDwgMyAqIHNpemVvZihXT1JEKSkKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CgogICAgaWYgKE1JRElfbWNpUmVhZFdvcmQod21tLCAmd21tLT53Rm9ybWF0KSAhPSAwIHx8CglNSURJX21jaVJlYWRXb3JkKHdtbSwgJndtbS0+blRyYWNrcykgIT0gMCB8fAoJTUlESV9tY2lSZWFkV29yZCh3bW0sICZ3bW0tPm5EaXZpc2lvbikgIT0gMCkgewoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KCiAgICBUUkFDRShtY2ltaWRpLCAidG9iZXJlYWQ9MHglMDhsWCwgd0Zvcm1hdD0weCUwNFggblRyYWNrcz0weCUwNFggbkRpdmlzaW9uPTB4JTA0WFxuIiwKCSAgdG9iZXJlYWQsIHdtbS0+d0Zvcm1hdCwgd21tLT5uVHJhY2tzLCB3bW0tPm5EaXZpc2lvbik7CgogICAgLyogTVMgZG9jIHNheXMgdGhhdCB0aGUgTUlESSBNQ0kgdGltZSBmb3JtYXQgbXVzdCBiZSBwdXQgYnkgZGVmYXVsdCB0byB0aGUgZm9ybWF0CiAgICAgKiBzdG9yZWQgaW4gdGhlIE1JREkgZmlsZS4uLgogICAgICovCiAgICBpZiAod21tLT5uRGl2aXNpb24gPiAweDgwMDApIHsKCS8qIGVyaWMucG91ZWNoQGxlbWVsLmZyIDk4LzExCgkgKiBJbiBkaWQgbm90IGNoZWNrIHRoaXMgdmVyeSBjb2RlIChwdWxzZXMgYXJlIGV4cHJlc3NlZCBhcyBTTVBURSBzdWItZnJhbWVzKS4KCSAqIEluIGFib3V0IDQwIE1CIG9mIE1JREkgZmlsZXMgSSBoYXZlLCBub25lIHdhcyBTTVBURSBiYXNlZC4uLgoJICogSSdtIGp1c3Qgd29uZGVyaW5nIGlmIHRoaXMgaXMgd2lkZWx5IHVzZWQgOi0pLiBTbywgaWYgc29tZW9uZSBoYXMgb25lIG9mIAoJICogdGhlc2UgZmlsZXMsIEknZCBsaWtlIHRvIGtub3cgYWJvdXQuCgkgKi8KCUZJWE1FKG1jaW1pZGksICJIYW5kbGluZyBTTVBURSB0aW1lIGluIE1JREkgZmlsZXMgaGFzIG5vdCBiZWVuIHRlc3RlZFxuIgoJICAgICAiUGxlYXNlIHJlcG9ydCB0byBjb21wLmVtdWxhdG9ycy5tcy13aW5kb3dzLndpbmUgd2l0aCBNSURJIGZpbGUgIVxuIik7CgoJc3dpdGNoIChISUJZVEUod21tLT5uRGl2aXNpb24pKSB7CgljYXNlIDB4RTg6CXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8yNDsJYnJlYWs7CS8qIC0yNCAqLwoJY2FzZSAweEU3Ogl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjU7CWJyZWFrOwkvKiAtMjUgKi8KCWNhc2UgMHhFMzoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzMwRFJPUDsJYnJlYWs7CS8qIC0yOSAqLyAvKiBpcyB0aGUgTUNJIGNvbnN0YW50IGNvcnJlY3QgPyAqLwoJY2FzZSAweEUyOgl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMzA7CWJyZWFrOwkvKiAtMzAgKi8KCWRlZmF1bHQ6CgkgICAgV0FSTihtY2ltaWRpLCAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGZyYW1lcyAlZFxuIiwgLShjaGFyKUhJQllURSh3bW0tPm5EaXZpc2lvbikpOwoJICAgIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Cgl9Cglzd2l0Y2ggKExPQllURSh3bW0tPm5EaXZpc2lvbikpIHsKCWNhc2UgNDoJLyogTUlESSBUaW1lIENvZGUgKi8KCWNhc2UgODoKCWNhc2UgMTA6CgljYXNlIDgwOiAvKiBTTVBURSBiaXQgcmVzb2x1dGlvbiAqLwoJY2FzZSAxMDA6CglkZWZhdWx0OgoJICAgIFdBUk4obWNpbWlkaSwgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBzdWItZnJhbWVzICVkXG4iLCBMT0JZVEUod21tLT5uRGl2aXNpb24pKTsKCSAgICByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwoJfQoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0gZWxzZSBpZiAod21tLT5uRGl2aXNpb24gPT0gMCkgewoJV0FSTihtY2ltaWRpLCAiTnVtYmVyIG9mIGRpdmlzaW9uIGlzIDAsIGNhbid0IHN1cHBvcnQgdGhhdCAhIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfSBlbHNlIHsKCXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CiAgICB9CgogICAgc3dpdGNoICh3bW0tPndGb3JtYXQpIHsKICAgIGNhc2UgMDoKCWlmICh3bW0tPm5UcmFja3MgIT0gMSkgewoJICAgIFdBUk4obWNpbWlkaSwgIkdvdCB0eXBlIDAgZmlsZSB3aG9zZSBudW1iZXIgb2YgdHJhY2sgaXMgbm90IDEuIFNldHRpbmcgaXQgdG8gMVxuIik7CgkgICAgd21tLT5uVHJhY2tzID0gMTsKCX0KCWJyZWFrOwogICAgY2FzZSAxOgogICAgY2FzZSAyOgoJYnJlYWs7CiAgICBkZWZhdWx0OgoJV0FSTihtY2ltaWRpLCAiSGFuZGxpbmcgTUlESSBmaWxlcyB3aGljaCBmb3JtYXQgPSAlZCBpcyBub3QgKHlldCkgc3VwcG9ydGVkXG4iCgkgICAgICAgICAgICJQbGVhc2UgcmVwb3J0IHdpdGggTUlESSBmaWxlICFcbiIsIHdtbS0+d0Zvcm1hdCk7CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfQoKICAgIGlmICh3bW0tPm5UcmFja3MgJiAweDgwMDApIHsKCS8qIHRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLiAqLwoJV0FSTihtY2ltaWRpLCAiT3VjaCAhISBJbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uIHRvIDMyayB0cmFja3MgcGVyIE1JREkgZmlsZSBpcyBvdmVyZmxvd2VkXG4iKTsKCXdtbS0+blRyYWNrcyA9IDB4N0ZGRjsKICAgIH0KCiAgICB3bW0tPnRyYWNrcyA9IHhtYWxsb2Moc2l6ZW9mKE1DSV9NSURJVFJBQ0spICogd21tLT5uVHJhY2tzKTsKCiAgICB0b2JlcmVhZCAtPSAzICogc2l6ZW9mKFdPUkQpOyAKICAgIGlmICh0b2JlcmVhZCA+IDApIHsKCVRSQUNFKG1jaW1pZGksICJTaXplIG9mIE1UaGQgPiA2LCBza2lwcGluZyAlbGQgZXh0cmEgYnl0ZXNcbiIsIHRvYmVyZWFkKTsKCW1taW9TZWVrMzIod21tLT5oRmlsZSwgdG9iZXJlYWQsIFNFRUtfQ1VSKTsKICAgIH0KCiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCXdtbS0+dHJhY2tzW250XS53VHJhY2tOciA9IG50OwoJaWYgKE1JRElfbWNpUmVhZE1Ucmsod21tLCAmd21tLT50cmFja3NbbnRdKSAhPSAwKSB7CgkgICAgV0FSTihtY2ltaWRpLCAiQ2FuJ3QgcmVhZCAnTVRyaycgaGVhZGVyIFxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKCX0KICAgIH0KCiAgICB3bW0tPmR3VGVtcG8gPSA1MDAwMDA7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0NvbnZlcnRQdWxzZVRvTVMJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9Db252ZXJ0UHVsc2VUb01TKFdJTkVfTUNJTUlESSogd21tLCBEV09SRCBwdWxzZSkKewogICAgRFdPUkQJcmV0ID0gMDsKCiAgICAvKiBGSVhNRTogdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGZhbHNlIHZhbHVlcyBzaW5jZSB0aGUgdGVtcG8gKHdtbS0+ZHdUZW1wbykKICAgICAqIG1heSBjaGFuZ2UgZHVyaW5nIGZpbGUgcGxheWluZwogICAgICovCiAgICBpZiAod21tLT5uRGl2aXNpb24gPT0gMCkgewoJRklYTUUobWNpbWlkaSwgIlNob3VsZG4ndCBoYXBwZW4uIHdtbS0+bkRpdmlzaW9uID0gMFxuIik7CiAgICB9IGVsc2UgaWYgKHdtbS0+bkRpdmlzaW9uID4gMHg4MDAwKSB7IC8qIFNNUFRFLCB1bmNoZWNrZWQgRklYTUU/ICovCglpbnQJbmYgPSAtKGNoYXIpSElCWVRFKHdtbS0+bkRpdmlzaW9uKTsJLyogbnVtYmVyIG9mIGZyYW1lcyAgICAgKi8KCWludAluc2YgPSBMT0JZVEUod21tLT5uRGl2aXNpb24pOwkJLyogbnVtYmVyIG9mIHN1Yi1mcmFtZXMgKi8KCXJldCA9IChwdWxzZSAqIDEwMDApIC8gKG5mICogbnNmKTsKICAgIH0gZWxzZSB7CglyZXQgPSAoRFdPUkQpKChkb3VibGUpcHVsc2UgKiAoKGRvdWJsZSl3bW0tPmR3VGVtcG8gLyAxMDAwKSAvCQoJCSAgICAgIChkb3VibGUpd21tLT5uRGl2aXNpb24pOwogICAgfQoKICAgIC8qCiAgICAgIFRSQUNFKG1jaW1pZGksICJwdWxzZT0lbHUgdGVtcG89JWx1IGRpdmlzaW9uPSV1PTB4JTA0eCA9PiBtcz0lbHVcbiIsIAogICAgICBwdWxzZSwgd21tLT5kd1RlbXBvLCB3bW0tPm5EaXZpc2lvbiwgd21tLT5uRGl2aXNpb24sIHJldCk7CiAgICAqLwoKICAgIHJldHVybiByZXQ7Cn0KCiNkZWZpbmUgVElNRV9NU19JTl9PTkVfSE9VUgkoNjAqNjAqMTAwMCkKI2RlZmluZSBUSU1FX01TX0lOX09ORV9NSU5VVEUJKDYwKjEwMDApCiNkZWZpbmUgVElNRV9NU19JTl9PTkVfU0VDT05ECSgxMDAwKQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCU1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMoV0lORV9NQ0lNSURJKiB3bW0sIERXT1JEIHZhbCkKewogICAgRFdPUkQJcmV0ID0gMDsKCiAgICBzd2l0Y2ggKHdtbS0+ZHdNY2lUaW1lRm9ybWF0KSB7CiAgICBjYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgkKCXJldCA9IHZhbDsJCQoJYnJlYWs7CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CglyZXQgPSAKCSAgICAoSElCWVRFKEhJV09SRCh2YWwpKSAqIDEyNSkgLyAzICsgICAgICAgICAgICAgTE9CWVRFKEhJV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX1NFQ09ORCArCgkgICAgSElCWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX01JTlVURSArIExPQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9IT1VSOwoJYnJlYWs7CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CQkKCXJldCA9IAoJICAgIEhJQllURShISVdPUkQodmFsKSkgKiA0MCArIAkJICAJICBMT0JZVEUoSElXT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfU0VDT05EICsKCSAgICBISUJZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfTUlOVVRFICsgTE9CWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX0hPVVI7CglicmVhazsKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8zMDoJCQoJcmV0ID0gCgkgICAgKEhJQllURShISVdPUkQodmFsKSkgKiAxMDApIC8gMyArIAkJICBMT0JZVEUoSElXT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfU0VDT05EICsKCSAgICBISUJZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfTUlOVVRFICsgTE9CWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX0hPVVI7CglicmVhazsKICAgIGRlZmF1bHQ6CglXQVJOKG1jaW1pZGksICJCYWQgdGltZSBmb3JtYXQgJWx1IVxuIiwgd21tLT5kd01jaVRpbWVGb3JtYXQpOwogICAgfQogICAgLyoKICAgICAgVFJBQ0UobWNpbWlkaSwgInZhbD0lbHU9MHglMDhseCBbdGY9JWx1XSA9PiByZXQ9JWx1XG4iLCB2YWwsIHZhbCwgd21tLT5kd01jaVRpbWVGb3JtYXQsIHJldCk7CiAgICAqLwogICAgcmV0dXJuIHJldDsKfQkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0NvbnZlcnRNU1RvVGltZUZvcm1hdAkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfQ29udmVydE1TVG9UaW1lRm9ybWF0KFdJTkVfTUNJTUlESSogd21tLCBEV09SRCBfdmFsKQp7CiAgICBEV09SRAlyZXQgPSAwLCB2YWwgPSBfdmFsOwogICAgRFdPUkQJaCwgbSwgcywgZjsKCiAgICBzd2l0Y2ggKHdtbS0+ZHdNY2lUaW1lRm9ybWF0KSB7CiAgICBjYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgkKCXJldCA9IHZhbDsJCQoJYnJlYWs7CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CQkKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8zMDoJCQoJaCA9IHZhbCAvIFRJTUVfTVNfSU5fT05FX0hPVVI7CQoJbSA9ICh2YWwgLT0gaCAqIFRJTUVfTVNfSU5fT05FX0hPVVIpICAgLyBUSU1FX01TX0lOX09ORV9NSU5VVEU7CQoJcyA9ICh2YWwgLT0gbSAqIFRJTUVfTVNfSU5fT05FX01JTlVURSkgLyBUSU1FX01TX0lOX09ORV9TRUNPTkQ7Cglzd2l0Y2ggKHdtbS0+ZHdNY2lUaW1lRm9ybWF0KSB7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CgkgICAgLyogb25lIGZyYW1lIGlzIDEwMDAvMjQgdmFsIGxvbmcsIDEwMDAvMjQgPT0gMTI1LzMgKi8KCSAgICBmID0gKHZhbCAqIDMpIC8gMTI1OyAJdmFsIC09IChmICogMTI1KSAvIDM7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CQkKCSAgICAvKiBvbmUgZnJhbWUgaXMgMTAwMC8yNSBtcyBsb25nLCAxMDAwLzI1ID09IDQwICovCgkgICAgZiA9IHZhbCAvIDQwOyAJCXZhbCAtPSBmICogNDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMzA6CQkKCSAgICAvKiBvbmUgZnJhbWUgaXMgMTAwMC8zMCBtcyBsb25nLCAxMDAwLzMwID09IDEwMC8zICovCgkgICAgZiA9ICh2YWwgKiAzKSAvIDEwMDsgCXZhbCAtPSAoZiAqIDEwMCkgLyAzOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGSVhNRShtY2ltaWRpLCAiVGhlcmUgbXVzdCBiZSBzb21lIGJhZCBiYWQgcHJvZ3JhbW1lclxuIik7CgkgICAgZiA9IDA7Cgl9CgkvKiB2YWwgY29udGFpbnMgdGhlIG51bWJlciBvZiBtcyB3aGljaCBjYW5ub3QgbWFrZSBhIGNvbXBsZXRlIGZyYW1lICovCgkvKiBGSVhNRTogaXMgdGhpcyBjb3JyZWN0ID8gcHJvZ3JhbXMgc2VlbSB0byBiZSBoYXBweSB3aXRoIHRoYXQgKi8KCXJldCA9IChmIDw8IDI0KSB8IChzIDw8IDE2KSB8IChtIDw8IDgpIHwgKGggPDwgMCk7CglicmVhazsKICAgIGRlZmF1bHQ6CglXQVJOKG1jaW1pZGksICJCYWQgdGltZSBmb3JtYXQgJWx1IVxuIiwgd21tLT5kd01jaVRpbWVGb3JtYXQpOwogICAgfQogICAgLyoKICAgICAgVFJBQ0UobWNpbWlkaSwgInZhbD0lbHUgW3RmPSVsdV0gPT4gcmV0PSVsdT0weCUwOGx4XG4iLCBfdmFsLCB3bW0tPmR3TWNpVGltZUZvcm1hdCwgcmV0LCByZXQpOwogICAgKi8KICAgIHJldHVybiByZXQ7Cn0JCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTUlESV9HZXRNVGhkTGVuZ3RoTVMJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9HZXRNVGhkTGVuZ3RoTVMoV0lORV9NQ0lNSURJKiB3bW0pCnsKICAgIFdPUkQJbnQ7CiAgICBEV09SRAlyZXQgPSAwOwogICAgCiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCWlmICh3bW0tPndGb3JtYXQgPT0gMikgewoJICAgIHJldCArPSB3bW0tPnRyYWNrc1tudF0uZHdMZW5ndGg7Cgl9IGVsc2UgaWYgKHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aCA+IHJldCkgewoJICAgIHJldCA9IHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aDsKCX0KICAgIH0KICAgIC8qIEZJWE1FOiB0aGlzIGlzIHdyb25nIGlmIHRoZXJlIGlzIGEgdGVtcG8gY2hhbmdlIGluc2lkZSB0aGUgZmlsZSAqLwogICAgcmV0dXJuIE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHJldCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lPcGVuCQkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaU9wZW4oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNUzMyQSBscFBhcm1zKQp7CiAgICBNSURJT1BFTkRFU0MgCW1pZGlPcGVuRGVzYzsKICAgIERXT1JECQlkd1JldCA9IDA7CiAgICBEV09SRAkJZHdEZXZpY2VJRDsKICAgIFdJTkVfTUNJTUlESSoJd21tOwoKICAgIFRSQUNFKG1jaW1pZGksICIoJTA0eCwgJTA4bFgsICVwKVxuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwpIAlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdEZXZJRCA+PSBNQVhfTUNJTUlESURSVikgewoJV0FSTihtY2ltaWRpLCAiSW52YWxpZCB3RGV2SUQ9JXVcbiIsIHdEZXZJRCk7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgfQogICAgd21tID0gJk1DSU1pZGlEZXZbd0RldklEXTsKCiAgICBpZiAod21tLT5uVXNlQ291bnQgPiAwKSB7CgkvKiBUaGUgZHJpdmVyIGlzIGFscmVhZHkgb3BlbmVkIG9uIHRoaXMgY2hhbm5lbAoJICogTUlESSBzZXF1ZW5jZXIgY2Fubm90IGJlIHNoYXJlZAoJICovCglyZXR1cm4gTUNJRVJSX0RFVklDRV9PUEVOOwogICAgfQogICAgd21tLT5uVXNlQ291bnQrKzsKICAgIAogICAgd21tLT5oRmlsZSA9IDA7CiAgICBkd0RldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwogICAgCiAgICBUUkFDRShtY2ltaWRpLCAid0RldklEPSUwNFggKGxwUGFyYW1zLT53RGV2aWNlSUQ9JTA4bFgpXG4iLCB3RGV2SUQsIGR3RGV2aWNlSUQpOwogICAgLyoJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOyovCgogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9FTEVNRU5UKSB7CglMUFNUUgkJbHBzdHJFbGVtZW50TmFtZTsKCglscHN0ckVsZW1lbnROYW1lID0gbHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZTsKCglUUkFDRShtY2ltaWRpLCAiTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsIGxwc3RyRWxlbWVudE5hbWUpOwoJaWYgKGxwc3RyRWxlbWVudE5hbWUgJiYgc3RybGVuKGxwc3RyRWxlbWVudE5hbWUpID4gMCkgewoJICAgIHdtbS0+aEZpbGUgPSBtbWlvT3BlbjMyQShscHN0ckVsZW1lbnROYW1lLCBOVUxMLCAKCQkJCSAgICAgTU1JT19BTExPQ0JVRiB8IE1NSU9fUkVBRFdSSVRFIHwgTU1JT19FWENMVVNJVkUpOwoJICAgIGlmICh3bW0tPmhGaWxlID09IDApIHsKCQlXQVJOKG1jaW1pZGksICJDYW4ndCBmaW5kIGZpbGU9JyVzJyAhXG4iLCBscHN0ckVsZW1lbnROYW1lKTsKCQl3bW0tPm5Vc2VDb3VudC0tOwoJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CgkgICAgfQoJfSBlbHNlIHsKCSAgICB3bW0tPmhGaWxlID0gMDsKCX0KICAgIH0KICAgIFRSQUNFKG1jaW1pZGksICJoRmlsZT0ldVxuIiwgd21tLT5oRmlsZSk7CgogICAgbWVtY3B5KCZ3bW0tPm9wZW5QYXJtcywgbHBQYXJtcywgc2l6ZW9mKE1DSV9PUEVOX1BBUk1TMzJBKSk7CgogICAgd21tLT53Tm90aWZ5RGV2aWNlSUQgPSBkd0RldmljZUlEOwogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX05PVF9SRUFEWTsJLyogd2hpbGUgbG9hZGluZyBmaWxlIGNvbnRlbnRzICovCiAgICAvKiBzcGVjIHNheXMgaXQgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGZvcm1hdCBmcm9tIHRoZSBNSURJIGZpbGUuLi4gKi8KICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CgogICAgbWlkaU9wZW5EZXNjLmhNaWRpID0gMDsKCiAgICBpZiAod21tLT5oRmlsZSAhPSAwKSB7CglNTUNLSU5GTwlja01haW5SSUZGOwoJTU1DS0lORk8JbW1ja0luZm87CglEV09SRAkJZHdPZmZzZXQgPSAwOwoKCWlmIChtbWlvRGVzY2VuZCh3bW0tPmhGaWxlLCAmY2tNYWluUklGRiwgTlVMTCwgMCkgIT0gMCkgewoJICAgIGR3UmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKCX0gZWxzZSB7CglUUkFDRShtY2ltaWRpLCJQYXJlbnRDaHVuayBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCgkgICAgICAoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsIGNrTWFpblJJRkYuY2tzaXplKTsKCgkgICAgaWYgKGNrTWFpblJJRkYuY2tpZCA9PSBGT1VSQ0NfUklGRiAmJiBja01haW5SSUZGLmZjY1R5cGUgPT0gbW1pb0ZPVVJDQygnUicsICdNJywgJ0knLCAnRCcpKSB7CgkJbW1ja0luZm8uY2tpZCA9IG1taW9GT1VSQ0MoJ2QnLCAnYScsICd0JywgJ2EnKTsKCQlpZiAobW1pb0Rlc2NlbmQod21tLT5oRmlsZSwgJm1tY2tJbmZvLCAmY2tNYWluUklGRiwgTU1JT19GSU5EQ0hVTkspID09IDApIHsKCSAgICBUUkFDRShtY2ltaWRpLCAiLi4uIGlzIGEgJ1JNSUQnIGZpbGUgXG4iKTsKCQkgICAgZHdPZmZzZXQgPSBtbWNrSW5mby5kd0RhdGFPZmZzZXQ7CgkJfSBlbHNlIHsKCQkgICAgZHdSZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJfQoJICAgIH0KCSAgICBpZiAoZHdSZXQgPT0gMCAmJiBNSURJX21jaVJlYWRNVGhkKHdtbSwgZHdPZmZzZXQpICE9IDApIHsKCSAgICBXQVJOKG1jaW1pZGksICJDYW4ndCByZWFkICdNVGhkJyBoZWFkZXIgXG4iKTsKCQlkd1JldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7Cgl9Cgl9CiAgICB9IGVsc2UgewoJVFJBQ0UobWNpbWlkaSwgImhGaWxlPT0wLCBzZXR0aW5nICN0cmFja3MgdG8gMDsgaXMgdGhpcyBjb3JyZWN0ID9cbiIpOwoJd21tLT5uVHJhY2tzID0gMDsKCXdtbS0+d0Zvcm1hdCA9IDA7Cgl3bW0tPm5EaXZpc2lvbiA9IDE7CiAgICB9CiAgICBpZiAoZHdSZXQgIT0gMCkgewoJd21tLT5uVXNlQ291bnQtLTsKCWlmICh3bW0tPmhGaWxlICE9IDApCgkgICAgbW1pb0Nsb3NlMzIod21tLT5oRmlsZSwgMCk7Cgl3bW0tPmhGaWxlID0gMDsKICAgIH0gZWxzZSB7CiAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDA7CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKCXdtbS0+aE1pZGlIZHIgPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKE1JRElIRFIpKTsKCiAgICBkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX09QRU4sIDAsIChEV09SRCkmbWlkaU9wZW5EZXNjLCBDQUxMQkFDS19OVUxMKTsKICAgIC8qCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fT1BFTiwgMCwgKERXT1JEKSZtaWRpT3BlbkRlc2MsIENBTExCQUNLX05VTEwpOyovCiAgICB9CiAgICByZXR1cm4gZHdSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTdG9wCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU3RvcChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCnsgICAgCiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwoKICAgIFRSQUNFKG1jaW1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CgogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwoKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogICAgVFJBQ0UobWNpbWlkaSwgIndtbS0+ZHdTdGF0dXM9JWRcbiIsIHdtbS0+ZHdTdGF0dXMpOwoKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKG1jaW1pZGksICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCSAgd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUNsb3NlCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpQ2xvc2UoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQp7CiAgICBEV09SRAkJZHdSZXQ7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwoKICAgIFRSQUNFKG1jaW1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CgogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwoKICAgIGlmICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKCU1JRElfbWNpU3RvcCh3RGV2SUQsIE1DSV9XQUlULCBscFBhcm1zKTsKICAgIH0KCiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIHdtbS0+blVzZUNvdW50LS07CiAgICBpZiAod21tLT5uVXNlQ291bnQgPT0gMCkgewoJaWYgKHdtbS0+aEZpbGUgIT0gMCkgewoJICAgIG1taW9DbG9zZTMyKHdtbS0+aEZpbGUsIDApOwoJICAgIHdtbS0+aEZpbGUgPSAwOwoJICAgIFRSQUNFKG1jaW1pZGksICJoRmlsZSBjbG9zZWQgIVxuIik7Cgl9CglVU0VSX0hFQVBfRlJFRSh3bW0tPmhNaWRpSGRyKTsKCWZyZWUod21tLT50cmFja3MpOwoJZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9DTE9TRSwgMCwgMEwsIDBMKTsKCWlmIChkd1JldCAhPSBNTVNZU0VSUl9OT0VSUk9SKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwoJLyoKCSAgZHdSZXQgPSBtaWRNZXNzYWdlKHdEZXZJRCwgTUlETV9DTE9TRSwgMCwgMEwsIDBMKTsKCSAgaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CgkqLwogICAgfSBlbHNlIHsKCVRSQUNFKG1jaW1pZGksICJTaG91bGRuJ3QgaGFwcGVuLi4uIG5Vc2VDb3VudD0lZFxuIiwgd21tLT5uVXNlQ291bnQpOwoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRShtY2ltaWRpLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpRmluZE5leHRFdmVudAkJW2ludGVybmFsXQogKi8Kc3RhdGljIE1DSV9NSURJVFJBQ0sqCU1JRElfbWNpRmluZE5leHRFdmVudChXSU5FX01DSU1JREkqIHdtbSwgTFBEV09SRCBoaVB1bHNlKSAKewogICAgV09SRAkJY250LCBudDsKICAgIE1DSV9NSURJVFJBQ0sqCW1tdDsKCiAgICAqaGlQdWxzZSA9IDB4RkZGRkZGRkZ1bDsKICAgIGNudCA9IDB4RkZGRnU7CiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCW1tdCA9ICZ3bW0tPnRyYWNrc1tudF07CgkgICAgCglpZiAobW10LT53U3RhdHVzID09IDApCgkgICAgY29udGludWU7CglpZiAobW10LT5kd0V2ZW50UHVsc2UgPCAqaGlQdWxzZSkgewoJICAgICpoaVB1bHNlID0gbW10LT5kd0V2ZW50UHVsc2U7CgkgICAgY250ID0gbnQ7Cgl9CiAgICB9CiAgICByZXR1cm4gKGNudCA9PSAweEZGRkZ1KSA/IDAgLyogbm8gbW9yZSBldmVudCBvbiBhbGwgdHJhY2tzICovCgk6ICZ3bW0tPnRyYWNrc1tjbnRdOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUGxheQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVBsYXkoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKQp7CiAgICBEV09SRAkJZHdTdGFydE1TLCBkd0VuZE1TLCBkd1JldDsKICAgIFdPUkQJCWRvUGxheSwgbnQ7CiAgICBNQ0lfTUlESVRSQUNLKgltbXQ7CiAgICBEV09SRAkJaGlQdWxzZTsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CgogICAgVFJBQ0UobWNpbWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CgogICAgaWYgKHdtbS0+aEZpbGUgPT0gMCkgewoJV0FSTihtY2ltaWRpLCAiQ2FuJ3QgcGxheTogbm8gZmlsZSAnJXMnICFcbiIsIHdtbS0+b3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwoJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKICAgIH0KCiAgICBpZiAod21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CglXQVJOKG1jaW1pZGksICJDYW4ndCBwbGF5OiBkZXZpY2UgaXMgbm90IHN0b3BwZWQgIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfQoKICAgIGlmICghKGR3RmxhZ3MgJiBNQ0lfV0FJVCkpIHsJCgkvKiogRklYTUU6IEknbSBub3QgMTAwJSBzdXJlIHRoYXQgd05vdGlmeURldmljZUlEIGlzIHRoZSByaWdodCB2YWx1ZSBpbiBhbGwgY2FzZXMgPz8/ICovCglyZXR1cm4gTUNJX1NlbmRDb21tYW5kQXN5bmMzMih3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX1BMQVksIGR3RmxhZ3MsIChEV09SRClscFBhcm1zKTsKICAgIH0KCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9GUk9NKSkgewoJZHdTdGFydE1TID0gTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMod21tLCBscFBhcm1zLT5kd0Zyb20pOyAKICAgIH0gZWxzZSB7Cglkd1N0YXJ0TVMgPSB3bW0tPmR3UG9zaXRpb25NUzsKICAgIH0KCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9UTykpIHsKCWR3RW5kTVMgPSBNSURJX0NvbnZlcnRUaW1lRm9ybWF0VG9NUyh3bW0sIGxwUGFybXMtPmR3VG8pOwogICAgfSBlbHNlIHsKCWR3RW5kTVMgPSAweEZGRkZGRkZGdWw7CiAgICB9CgogICAgVFJBQ0UobWNpbWlkaSwgIlBsYXlpbmcgZnJvbSAlbHUgdG8gJWx1XG4iLCBkd1N0YXJ0TVMsIGR3RW5kTVMpOwoKICAgIC8qIGluaXQgdHJhY2tzICovCiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCW1tdCA9ICZ3bW0tPnRyYWNrc1tudF07CgoJbW10LT53U3RhdHVzID0gMTsJLyogb2ssIHBsYXlpbmcgKi8KCW1tdC0+ZHdJbmRleCA9IG1tdC0+ZHdGaXJzdDsKCWlmICh3bW0tPndGb3JtYXQgPT0gMiAmJiBudCA+IDApIHsKCSAgICBtbXQtPmR3RXZlbnRQdWxzZSA9IHdtbS0+dHJhY2tzW250IC0gMV0uZHdMZW5ndGg7Cgl9IGVsc2UgewoJICAgIG1tdC0+ZHdFdmVudFB1bHNlID0gMDsKCX0KCU1JRElfbWNpUmVhZE5leHRFdmVudCh3bW0sIG1tdCk7IC8qIEZJWE1FID09IDAgKi8KICAgIH0KCQogICAgd21tLT5kd1B1bHNlID0gMDsKICAgIHdtbS0+ZHdUZW1wbyA9IDUwMDAwMDsKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9QTEFZOwogICAgd21tLT5kd1Bvc2l0aW9uTVMgPSAwOwogICAgd21tLT53U3RhcnRlZFBsYXlpbmcgPSBGQUxTRTsKCiAgICB3aGlsZSAod21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CgkvKiBpdCBzZWVtcyB0aGF0IGluIGNhc2Ugb2YgbXVsdGktdGhyZWFkaW5nLCBnY2MgaXMgb3B0aW1pemluZyBqdXN0IGEgbGl0dGxlIGJpdCAKCSAqIHRvbyBtdWNoLiBUZWxsIGdjYyBub3QgdG8gb3B0aW1pemUgc3RhdHVzIHZhbHVlIHVzaW5nIHZvbGF0aWxlLiAKCSAqLwoJd2hpbGUgKCgodm9sYXRpbGUgV0lORV9NQ0lNSURJKil3bW0pLT5kd1N0YXR1cyA9PSBNQ0lfTU9ERV9QQVVTRSk7CgoJZG9QbGF5ID0gKHdtbS0+ZHdQb3NpdGlvbk1TID49IGR3U3RhcnRNUyAmJiB3bW0tPmR3UG9zaXRpb25NUyA8PSBkd0VuZE1TKTsKCglUUkFDRShtY2ltaWRpLCAid21tLT5kd1N0YXR1cz0lZCwgZG9QbGF5PSVzXG4iLCB3bW0tPmR3U3RhdHVzLCBkb1BsYXkgPyAiVCIgOiAiRiIpOwoKCWlmICgobW10ID0gTUlESV9tY2lGaW5kTmV4dEV2ZW50KHdtbSwgJmhpUHVsc2UpKSA9PSBOVUxMKQoJICAgIGJyZWFrOyAgLyogbm8gbW9yZSBldmVudCBvbiB0cmFja3MgKi8KCgkvKiBpZiBzdGFydGluZyBwbGF5aW5nLCB0aGVuIHNldCBTdGFydFRpY2tzIHRvIHRoZSB2YWx1ZSBpdCB3b3VsZCBoYXZlIGhhZAoJICogaWYgcGxheSBoYWQgc3RhcnRlZCBhdCBwb3NpdGlvbiAwCgkgKi8KCWlmIChkb1BsYXkgJiYgIXdtbS0+d1N0YXJ0ZWRQbGF5aW5nKSB7CgkgICAgd21tLT5kd1N0YXJ0VGlja3MgPSBHZXRUaWNrQ291bnQoKSAtIE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHdtbS0+ZHdQdWxzZSk7CgkgICAgd21tLT53U3RhcnRlZFBsYXlpbmcgPSBUUlVFOwoJICAgIFRSQUNFKG1jaW1pZGksICJTZXR0aW5nIGR3U3RhcnRUaWNrcyB0byAlbHVcbiIsIHdtbS0+ZHdTdGFydFRpY2tzKTsKCX0KCQoJaWYgKGhpUHVsc2UgPiB3bW0tPmR3UHVsc2UpIHsKCSAgICBpZiAoZG9QbGF5KSB7CgkJRFdPUkQJdG9nbyA9IHdtbS0+ZHdTdGFydFRpY2tzICsgd21tLT5kd1Bvc2l0aW9uTVMgKyBNSURJX0NvbnZlcnRQdWxzZVRvTVMod21tLCBoaVB1bHNlIC0gd21tLT5kd1B1bHNlKTsKCQlEV09SRAl0YyA9IEdldFRpY2tDb3VudCgpOwoKCQlUUkFDRShtY2ltaWRpLCAiUHVsc2VzIGhpPTB4JTA4bHggPD4gY3VyPTB4JTA4bHhcbiIsIGhpUHVsc2UsIHdtbS0+ZHdQdWxzZSk7CgkJVFJBQ0UobWNpbWlkaSwgIldhaXQgdW50aWwgJWx1ID0+ICVsdSBtc1xuIiwgCQoJCSAgICAgIHRjIC0gd21tLT5kd1N0YXJ0VGlja3MsIHRvZ28gLSB3bW0tPmR3U3RhcnRUaWNrcyk7CgkJaWYgKHRjIDwgdG9nbykJCgkJICAgIFNsZWVwKHRvZ28gLSB0Yyk7CgkgICAgfQoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TICs9IE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIGhpUHVsc2UgLSB3bW0tPmR3UHVsc2UpOwoJICAgIHdtbS0+ZHdQdWxzZSA9IGhpUHVsc2U7Cgl9CgkgICAgCglzd2l0Y2ggKExPQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpKSB7CgljYXNlIDB4RjA6CgljYXNlIDB4Rjc6CS8qIHN5c2V4IGV2ZW50cyAqLwoJICAgIHsKCQlGSVhNRShtY2ltaWRpLCAiTm90IGhhbmRsaW5nIFN5c0V4IGV2ZW50cyAoeWV0KVxuIik7CgkgICAgfQoJICAgIGJyZWFrOwoJY2FzZSAweEZGOgoJICAgIC8qIHBvc2l0aW9uIGFmdGVyIG1ldGEgZGF0YSBoZWFkZXIgKi8KCSAgICBtbWlvU2VlazMyKHdtbS0+aEZpbGUsIG1tdC0+ZHdJbmRleCArIEhJV09SRChtbXQtPmR3RXZlbnREYXRhKSwgU0VFS19TRVQpOwoJICAgIHN3aXRjaCAoSElCWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkpIHsKCSAgICBjYXNlIDB4MDA6IC8qIDE2LWJpdCBzZXF1ZW5jZSBudW1iZXIgKi8KCQlpZiAoVFJBQ0VfT04obWlkaSkpIHsKCQkgICAgV09SRAl0d2Q7CgoJCSAgICBNSURJX21jaVJlYWRXb3JkKHdtbSwgJnR3ZCk7CS8qID09IDAgKi8KCQkgICAgVFJBQ0UobWNpbWlkaSwgIkdvdCBzZXF1ZW5jZSBudW1iZXIgJXVcbiIsIHR3ZCk7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHgwMTogLyogYW55IHRleHQgKi8KCSAgICBjYXNlIDB4MDI6IC8qIENvcHlyaWdodCBNZXNzYWdlIHRleHQgKi8KCSAgICBjYXNlIDB4MDM6IC8qIFNlcXVlbmNlL1RyYWNrIE5hbWUgdGV4dCAqLwoJICAgIGNhc2UgMHgwNDogLyogSW5zdHJ1bWVudCBOYW1lIHRleHQgKi8KCSAgICBjYXNlIDB4MDU6IC8qIEx5cmljIHRleHQgKi8KCSAgICBjYXNlIDB4MDY6IC8qIE1hcmtlciB0ZXh0ICovCgkgICAgY2FzZSAweDA3OiAvKiBDdWUtcG9pbnQgdGV4dCAqLwoJCWlmIChUUkFDRV9PTihtY2ltaWRpKSkgewoJCSAgICBjaGFyCWJ1ZlsxMDI0XTsKCQkgICAgV09SRAlsZW4gPSBtbXQtPndFdmVudExlbmd0aCAtIEhJV09SRChtbXQtPmR3RXZlbnREYXRhKTsKCQkgICAgc3RhdGljCWNoYXIqCWluZm9bOF0gPSB7IiIsICJUZXh0IiwgIkNvcHlyaWdodCIsICJTZXEvVHJrIG5hbWUiLCAKCQkJCQkJICAgIkluc3RydW1lbnQiLCAiTHlyaWMiLCAiTWFya2VyIiwgIkN1ZS1wb2ludCJ9OwoJCSAgICBXT1JECWlkeCA9IEhJQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpOwoKCQkgICAgaWYgKGxlbiA+PSBzaXplb2YoYnVmKSkgewoJCQlXQVJOKG1jaW1pZGksICJCdWZmZXIgZm9yIHRleHQgaXMgdG9vIHNtYWxsICglZCBieXRlcywgd2hlbiAldSBhcmUgbmVlZGVkKVxuIiwgc2l6ZW9mKGJ1ZikgLSAxLCBsZW4pOwoJCQlsZW4gPSBzaXplb2YoYnVmKSAtIDE7CgkJICAgIH0KCQkgICAgaWYgKG1taW9SZWFkMzIod21tLT5oRmlsZSwgKEhQU1RSKWJ1ZiwgbGVuKSA9PSBsZW4pIHsKCQkJYnVmW2xlbl0gPSAwOwkvKiBlbmQgc3RyaW5nIGluIGNhc2UgKi8KCQkJVFJBQ0UobWNpbWlkaSwgIiVzID0+IFwiJXNcIlxuIiwgKGlkeCA8IDggKSA/IGluZm9baWR4XSA6ICIiLCBidWYpOwoJCSAgICB9IGVsc2UgewoJCQlXQVJOKG1jaW1pZGksICJDb3VsZG4ndCByZWFkIGRhdGEgZm9yICVzXG4iLCAoaWR4IDwgOCApID8gaW5mb1tpZHhdIDogIiIpOwoJCSAgICB9CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHgyMDogCgkJLyogTUlESSBjaGFubmVsIChjYykgKi8KCQlpZiAoRklYTUVfT04obWNpbWlkaSkpIHsKCQkgICAgQllURQlidDsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYnQpOwkvKiA9PSAwICovCgkJICAgIEZJWE1FKG1jaW1pZGksICJOSVk6IE1JREkgY2hhbm5lbD0ldSwgdHJhY2s9JXVcbiIsIGJ0LCBtbXQtPndUcmFja05yKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDIxOgoJCS8qIE1JREkgcG9ydCAocHApICovCgkJaWYgKEZJWE1FX09OKG1jaW1pZGkpKSB7CgkJICAgIEJZVEUJYnQ7CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmJ0KTsJLyogPT0gMCAqLwoJCSAgICBGSVhNRShtY2ltaWRpLCAiTklZOiBNSURJIHBvcnQ9JXUsIHRyYWNrPSV1XG4iLCBidCwgbW10LT53VHJhY2tOcik7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHgyRjogLyogZW5kIG9mIHRyYWNrICovCgkJbW10LT53U3RhdHVzID0gMDsKCQlicmVhazsKCSAgICBjYXNlIDB4NTE6Lyogc2V0IHRlbXBvICovCgkJLyogVGVtcG8gaXMgZXhwcmVzc2VkIGluILUtc2Vjb25kcyBwZXIgbWlkaSBxdWFydGVyIG5vdGUKCQkgKiBmb3IgZm9ybWF0IDEgTUlESSBmaWxlcywgdGhpcyBjYW4gb25seSBiZSBwcmVzZW50IG9uIHRyYWNrICMwCgkJICovCgkJaWYgKG1tdC0+d1RyYWNrTnIgIT0gMCAmJiB3bW0tPndGb3JtYXQgPT0gMSkgewoJCSAgICBXQVJOKG1jaW1pZGksICJGb3IgZm9ybWF0ICMxIE1JREkgZmlsZXMsIHRlbXBvIGNhbiBvbmx5IGJlIGNoYW5nZWQgb24gdHJhY2sgIzAgKCV1KVxuIiwgbW10LT53VHJhY2tOcik7CgkJfSBlbHNlIHsgCgkJICAgIEJZVEUJdGJ0OwoJCSAgICBEV09SRAl2YWx1ZSA9IDA7CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnRidCk7CXZhbHVlICA9ICgoRFdPUkQpdGJ0KSA8PCAxNjsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZ0YnQpOwl2YWx1ZSB8PSAoKERXT1JEKXRidCkgPDwgODsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZ0YnQpOwl2YWx1ZSB8PSAoKERXT1JEKXRidCkgPDwgMDsKCQkgICAgVFJBQ0UobWNpbWlkaSwgIlNldHRpbmcgdGVtcG8gdG8gJWxkIChCUE09JWxkKVxuIiwgd21tLT5kd1RlbXBvLCAodmFsdWUpID8gKDYwMDAwMDAwbCAvIHZhbHVlKSA6IDApOwoJCSAgICB3bW0tPmR3VGVtcG8gPSB2YWx1ZTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDU0OiAvKiAoaG91cikgKG1pbikgKHNlY29uZCkgKGZyYW1lKSAoZnJhY3Rpb25hbC1mcmFtZSkgLSBTTVBURSB0cmFjayBzdGFydCAqLwoJCWlmIChtbXQtPndUcmFja05yICE9IDAgJiYgd21tLT53Rm9ybWF0ID09IDEpIHsKCQkgICAgV0FSTihtY2ltaWRpLCAiRm9yIGZvcm1hdCAjMSBNSURJIGZpbGVzLCBTTVBURSB0cmFjayBzdGFydCBjYW4gb25seSBiZSBleHByZXNzZWQgb24gdHJhY2sgIzAgKCV1KVxuIiwgbW10LT53VHJhY2tOcik7CgkJfSBpZiAobW10LT5kd0V2ZW50UHVsc2UgIT0gMCkgewoJCSAgICBXQVJOKG1jaW1pZGksICJTTVBURSB0cmFjayBzdGFydCBjYW4gb25seSBiZSBleHByZXNzZWQgYXQgc3RhcnQgb2YgdHJhY2sgKCVsdSlcbiIsIG1tdC0+ZHdFdmVudFB1bHNlKTsKCQl9IGVsc2UgewoJCSAgICBCWVRFCWgsIG0sIHMsIGYsIGZmOwoKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZoKTsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZtKTsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZzKTsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZmKTsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZmZik7CgkJICAgIEZJWE1FKG1jaW1pZGksICJOSVk6IFNNUFRFIHRyYWNrIHN0YXJ0ICV1OiV1OiV1ICV1LiV1XG4iLCBoLCBtLCBzLCBmLCBmZik7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHg1ODogLyogZmlsZSByeXRobSAqLwoJCWlmIChUUkFDRV9PTihtY2ltaWRpKSkgewoJCSAgICBCWVRFCW51bSwgZGVuLCBjcG1jLCBfMzJucHFuOwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZudW0pOwkKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZkZW4pOwkJLyogdG8gbm90YXRlIGUuZy4gNi84ICovCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmY3BtYyk7CQkvKiBudW1iZXIgb2YgTUlESSBjbG9ja3MgcGVyIG1ldHJvbm9tZSBjbGljayAqLyAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZfMzJucHFuKTsJLyogbnVtYmVyIG9mIG5vdGF0ZWQgMzJuZCBub3RlcyBwZXIgTUlESSBxdWFydGVyIG5vdGUgKi8KCgkJICAgIFRSQUNFKG1jaW1pZGksICIldS8ldSwgY2xvY2sgcGVyIG1ldHJvbm9tZSBjbGljaz0ldSwgMzJuZCBub3RlcyBieSAxLzQgbm90ZT0ldVxuIiwgbnVtLCAxIDw8IGRlbiwgY3BtYywgXzMybnBxbik7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHg1OTogLyoga2V5IHNpZ25hdHVyZSAqLwoJCWlmIChUUkFDRV9PTihtY2ltaWRpKSkgewoJCSAgICBCWVRFCXNmLCBtbTsKCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmc2YpOwkJCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmbW0pOwkKCgkJICAgIGlmIChzZiA+PSAweDgwKSAJVFJBQ0UobWNpbWlkaSwgIiVkIGZsYXRzXG4iLCAtKGNoYXIpc2YpOwkgCgkJICAgIGVsc2UgaWYgKHNmID4gMCkgCVRSQUNFKG1jaW1pZGksICIlZCBzaGFycHNcbiIsIChjaGFyKXNmKTsJIAoJCSAgICBlbHNlIAkJVFJBQ0UobWNpbWlkaSwgIktleSBvZiBDXG4iKTsKCQkgICAgVFJBQ0UobWNpbWlkaSwgIk1vZGU6ICVzXG4iLCAobW0gPSAwKSA/ICJtYWpvciIgOiAibWlub3IiKTsKCQl9CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQlXQVJOKG1jaW1pZGksICJVbmtub3duIE1JREkgbWV0YSBldmVudCAlMDJ4LiBTa2lwcGluZy4uLlxuIiwgSElCWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkpOwoJCWJyZWFrOwoJICAgIH0KCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgaWYgKGRvUGxheSkgewoJCWR3UmV0ID0gbW9kTWVzc2FnZSh3RGV2SUQsIE1PRE1fREFUQSwgMCwgbW10LT5kd0V2ZW50RGF0YSwgMCk7CgkgICAgfSBlbHNlIHsKCQlzd2l0Y2ggKExPQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpICYgMHhGMCkgewoJCWNhc2UgTUlESV9OT1RFT046CgkJY2FzZSBNSURJX05PVEVPRkY6CgkJICAgIGR3UmV0ID0gMDsJCgkJICAgIGJyZWFrOwoJCWRlZmF1bHQ6CgkJICAgIGR3UmV0ID0gbW9kTWVzc2FnZSh3RGV2SUQsIE1PRE1fREFUQSwgMCwgbW10LT5kd0V2ZW50RGF0YSwgMCk7CgkJfQoJICAgIH0KCX0KCW1tdC0+ZHdJbmRleCArPSBtbXQtPndFdmVudExlbmd0aDsKCWlmIChtbXQtPmR3SW5kZXggPCBtbXQtPmR3Rmlyc3QgfHwgbW10LT5kd0luZGV4ID49IG1tdC0+ZHdMYXN0KSB7CgkgICAgbW10LT53U3RhdHVzID0gMDsKCX0gCglpZiAobW10LT53U3RhdHVzKSB7CQoJICAgIE1JRElfbWNpUmVhZE5leHRFdmVudCh3bW0sIG1tdCk7Cgl9CiAgICB9CgogICAgLyogc3RvcCBhbGwgbm90ZXMgKi8KICAgIC8qIHNob3VsZCBiZSAoMHg3ODAwIHwgTUlESV9DVExfQ0hBTkdFKSBpbnN0ZWFkIG9mIDB4NzhCMCwKICAgICAqIGJ1dCBNSURJX0NUTF9DSEFOR0UgaXMgZGVmaW5lZCBpbiBPU1MncyBzb3VuZGNhcmQuaCBhbmQgTUNJIG11c3QgY29tcGlsZQogICAgICogd2l0aG91dCBhbnkgcmVmZXJlbmNlIHRvIE9TUwogICAgICovCiAgICAvKiBGSVhNRTogY2hlY2sgaWYgMHg3OEIwIGlzIGNoYW5uZWwgZGVwZW5kYW50IG9yIG5vdC4gSSBjb2RlZCBpdCBzbyB0aGF0IAogICAgICogaXQncyBjaGFubmVsIGRlcGVuZGVudC4uLgogICAgICovCiAgICB7Cgl1bnNpZ25lZCBjaG47Cglmb3IgKGNobiA9IDA7IGNobiA8IDE2OyBjaG4rKykKCSAgICBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9EQVRBLCAwLCAweDc4QjAgfCBjaG4sIDApOwogICAgfQoKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwoKICAgIC8qIHRvIHJlc3RhcnQgcGxheWluZyBhdCBiZWdpbm5pbmcgd2hlbiBpdCdzIG92ZXIgKi8KICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMDsKCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRShtY2ltaWRpLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVjb3JkCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVjb3JkKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1JFQ09SRF9QQVJNUyBscFBhcm1zKQp7CiAgICBpbnQJCQlzdGFydCwgZW5kOwogICAgTFBNSURJSERSCQlscE1pZGlIZHI7CiAgICBEV09SRAkJZHdSZXQ7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRShtY2ltaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwoKICAgIGlmICh3bW0gPT0gMCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKCiAgICBpZiAod21tLT5oRmlsZSA9PSAwKSB7CglXQVJOKG1jaW1pZGksICJDYW4ndCBmaW5kIGZpbGU9JyUwOGx4JyAhXG4iLCAKCSAgICAgKERXT1JEKXdtbS0+b3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwoJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKICAgIH0KICAgIHN0YXJ0ID0gMTsgCQllbmQgPSA5OTk5OTsKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX0ZST00pKSB7CglzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsgCglUUkFDRShtY2ltaWRpLCAiTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CiAgICB9CiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9UTykpIHsKCWVuZCA9IGxwUGFybXMtPmR3VG87CglUUkFDRShtY2ltaWRpLCAiTUNJX1RPPSVkIFxuIiwgZW5kKTsKICAgIH0KICAgIGxwTWlkaUhkciA9IFVTRVJfSEVBUF9MSU5fQUREUih3bW0tPmhNaWRpSGRyKTsKICAgIGxwTWlkaUhkci0+bHBEYXRhID0gKExQU1RSKSB4bWFsbG9jKDEyMDApOwogICAgbHBNaWRpSGRyLT5kd0J1ZmZlckxlbmd0aCA9IDEwMjQ7CiAgICBscE1pZGlIZHItPmR3VXNlciA9IDBMOwogICAgbHBNaWRpSGRyLT5kd0ZsYWdzID0gMEw7CiAgICBkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX1BSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CiAgICBUUkFDRShtY2ltaWRpLCAiQWZ0ZXIgTUlETV9QUkVQQVJFIFxuIik7CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfUkVDT1JEOwogICAgd2hpbGUgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJVFJBQ0UobWNpbWlkaSwgIndtbS0+ZHdTdGF0dXM9JXAgJWRcbiIsCgkgICAgICAmd21tLT5kd1N0YXR1cywgd21tLT5kd1N0YXR1cyk7CglscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Cglkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX1NUQVJULCAwLCAwTCwgMEwpOwoJVFJBQ0UobWNpbWlkaSwgIkFmdGVyIE1JRE1fU1RBUlQgbHBNaWRpSGRyPSVwIGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsCgkgICAgICBscE1pZGlIZHIsIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKCWlmIChscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9PSAwKSBicmVhazsKICAgIH0KICAgIFRSQUNFKG1jaW1pZGksICJCZWZvcmUgTUlETV9VTlBSRVBBUkUgXG4iKTsKICAgIGR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fVU5QUkVQQVJFLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOwogICAgVFJBQ0UobWNpbWlkaSwgIkFmdGVyIE1JRE1fVU5QUkVQQVJFIFxuIik7CiAgICBpZiAobHBNaWRpSGRyLT5scERhdGEgIT0gTlVMTCkgewoJZnJlZShscE1pZGlIZHItPmxwRGF0YSk7CglscE1pZGlIZHItPmxwRGF0YSA9IE5VTEw7CiAgICB9CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKG1jaW1pZGksICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCXdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lQYXVzZQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVBhdXNlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKCiAgICBUUkFDRShtY2ltaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwoKICAgIGlmICh3bW0gPT0gTlVMTCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKCiAgICBpZiAod21tLT5kd1N0YXR1cyA9PSBNQ0lfTU9ERV9QTEFZKSB7CgkvKiBzdG9wIGFsbCBub3RlcyAqLwoJLyogc2VlIG5vdGUgaW4gTUlESV9tY2lQbGF5ICovCgl1bnNpZ25lZCBjaG47Cglmb3IgKGNobiA9IDA7IGNobiA8IDE2OyBjaG4rKykKCSAgICBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9EQVRBLCAwLCAweDc4QjAgfCBjaG4sIDApOwoJd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1BBVVNFOwogICAgfSAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKG1jaW1pZGksICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCXdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQoJCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlc3VtZQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlc3VtZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CgogICAgVFJBQ0UobWNpbWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CgogICAgaWYgKHdtbS0+ZHdTdGF0dXMgPT0gTUNJX01PREVfUEFVU0UpIHsKCXdtbS0+d1N0YXJ0ZWRQbGF5aW5nID0gRkFMU0U7Cgl3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfUExBWTsKICAgIH0gCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRShtY2ltaWRpLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpU2V0CQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU2V0KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwoKICAgIFRSQUNFKG1jaW1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CgogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkJcmV0dXJuIE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIGlmICh3bW0gPT0gTlVMTCkJCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CgogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX1RJTUVfRk9STUFUKSB7Cglzd2l0Y2ggKGxwUGFybXMtPmR3VGltZUZvcm1hdCkgewoJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFMgIVxuIik7CgkgICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKCSAgICBicmVhazsKCWNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNDoKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX0ZPUk1BVF9TTVBURV8yNCAhXG4iKTsKCSAgICB3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9GT1JNQVRfU01QVEVfMjUgIVxuIik7CgkgICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzI1OwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfRk9STUFUX1NNUFRFXzMwICFcbiIpOwoJICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8zMDsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgV0FSTihtY2ltaWRpLCAiQmFkIHRpbWUgZm9ybWF0ICVsdSFcbiIsIGxwUGFybXMtPmR3VGltZUZvcm1hdCk7CgkgICAgcmV0dXJuIE1DSUVSUl9CQURfVElNRV9GT1JNQVQ7Cgl9CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfVklERU8pIHsKCVRSQUNFKG1jaW1pZGksICJObyBzdXBwb3J0IGZvciB2aWRlbyAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9PUEVOKSB7CglUUkFDRShtY2ltaWRpLCAiTm8gc3VwcG9ydCBmb3IgZG9vciBvcGVuICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9ET09SX0NMT1NFRCkgewoJVFJBQ0UobWNpbWlkaSwgIk5vIHN1cHBvcnQgZm9yIGRvb3IgY2xvc2UgIVxuIik7CglyZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogICAgfQogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0FVRElPKSB7CglpZiAoZHdGbGFncyAmIE1DSV9TRVRfT04pIHsKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX1NFVF9PTiBhdWRpbyAhXG4iKTsKCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9TRVRfT0ZGKSB7CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TRVRfT0ZGIGF1ZGlvICFcbiIpOwoJfSBlbHNlIHsKCSAgICBXQVJOKG1jaW1pZGksICJNQ0lfU0VUX0FVRElPIHdpdGhvdXQgU0VUX09OIG9yIFNFVF9PRkZcbiIpOwoJICAgIHJldHVybiBNQ0lFUlJfQkFEX0lOVEVHRVI7Cgl9CgkgICAgCglpZiAobHBQYXJtcy0+ZHdBdWRpbyAmIE1DSV9TRVRfQVVESU9fQUxMKQoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU0VUX0FVRElPX0FMTCAhXG4iKTsKCWlmIChscFBhcm1zLT5kd0F1ZGlvICYgTUNJX1NFVF9BVURJT19MRUZUKQoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU0VUX0FVRElPX0xFRlQgIVxuIik7CglpZiAobHBQYXJtcy0+ZHdBdWRpbyAmIE1DSV9TRVRfQVVESU9fUklHSFQpCgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TRVRfQVVESU9fUklHSFQgIVxuIik7CiAgICB9CgogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9NQVNURVIpCglUUkFDRShtY2ltaWRpLCAiTUNJX1NFUV9TRVRfTUFTVEVSICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9TTEFWRSkKCVRSQUNFKG1jaW1pZGksICJNQ0lfU0VRX1NFVF9TTEFWRSAhXG4iKTsKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfT0ZGU0VUKQoJVFJBQ0UobWNpbWlkaSwgIk1DSV9TRVFfU0VUX09GRlNFVCAhXG4iKTsKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfUE9SVCkKCVRSQUNFKG1jaW1pZGksICJNQ0lfU0VRX1NFVF9QT1JUICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9URU1QTykKCVRSQUNFKG1jaW1pZGksICJNQ0lfU0VRX1NFVF9URU1QTyAhXG4iKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpU3RhdHVzCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU3RhdHVzKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NUQVRVU19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwoKICAgIFRSQUNFKG1jaW1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CgogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwoKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19JVEVNKSB7Cglzd2l0Y2ggKGxwUGFybXMtPmR3SXRlbSkgewoJY2FzZSBNQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0s6CgkgICAgLyogRklYTUUgaW4gRm9ybWF0IDIgKi8KCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDE7CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TVEFUVVNfQ1VSUkVOVF9UUkFDSyA9PiAlbHVcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19MRU5HVEg6CgkgICAgaWYgKChkd0ZsYWdzICYgTUNJX1RSQUNLKSAmJiB3bW0tPndGb3JtYXQgPT0gMikgewoJCWlmIChscFBhcm1zLT5kd1RyYWNrID49IHdtbS0+blRyYWNrcykKCQkgICAgcmV0dXJuIE1DSUVSUl9CQURfSU5URUdFUjsKCQkvKiBGSVhNRTogdGhpcyBpcyB3cm9uZyBpZiB0aGVyZSBpcyBhIHRlbXBvIGNoYW5nZSBpbnNpZGUgdGhlIGZpbGUgKi8KCQlscFBhcm1zLT5kd1JldHVybiA9IE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHdtbS0+dHJhY2tzW2xwUGFybXMtPmR3VHJhY2tdLmR3TGVuZ3RoKTsKCSAgICB9IGVsc2UgewoJCWxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9HZXRNVGhkTGVuZ3RoTVMod21tKTsKCSAgICB9CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNSURJX0NvbnZlcnRNU1RvVGltZUZvcm1hdCh3bW0sIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX1NUQVRVU19MRU5HVEggPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfTU9ERToKIAkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSB3bW0tPmR3U3RhdHVzOwoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU1RBVFVTX01PREUgPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVDoKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UID0+IFRSVUVcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gKHdtbS0+d0Zvcm1hdCA9PSAyKSA/IHdtbS0+blRyYWNrcyA6IDE7CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUyA9PiAlbHVcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19QT1NJVElPTjoKCSAgICAvKiBGSVhNRTogZG8gSSBuZWVkIHRvIHVzZSBNQ0lfVFJBQ0sgPyAqLwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9Db252ZXJ0TVNUb1RpbWVGb3JtYXQod21tLCAKCQkJCQkJCSAgIChkd0ZsYWdzICYgTUNJX1NUQVRVU19TVEFSVCkgPyAwIDogd21tLT5kd1Bvc2l0aW9uTVMpOwoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU1RBVFVTX1BPU0lUSU9OICVzID0+ICVsdVxuIiwgCgkJICAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpID8gInN0YXJ0IiA6ICJjdXJyZW50IiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX1JFQURZOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfTk9UX1JFQURZKTsKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX1NUQVRVU19SRUFEWSA9ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gd21tLT5kd01jaVRpbWVGb3JtYXQ7CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TVEFUVVNfVElNRV9GT1JNQVQgPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX0RJVlRZUEU6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TRVFfU1RBVFVTX0RJVlRZUEUgIVxuIik7CgkgICAgaWYgKHdtbS0+bkRpdmlzaW9uID4gMHg4MDAwKSB7CgkJc3dpdGNoICh3bW0tPm5EaXZpc2lvbikgewoJCWNhc2UgMHhFODoJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9TTVBURV8yNDsJYnJlYWs7CS8qIC0yNCAqLwoJCWNhc2UgMHhFNzoJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9TTVBURV8yNTsJYnJlYWs7CS8qIC0yNSAqLwoJCWNhc2UgMHhFMzoJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9TTVBURV8zMERST1A7CWJyZWFrOwkvKiAtMjkgKi8gLyogaXMgdGhlIE1DSSBjb25zdGFudCBjb3JyZWN0ID8gKi8KCQljYXNlIDB4RTI6CWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfU01QVEVfMzA7CWJyZWFrOwkvKiAtMzAgKi8KCQlkZWZhdWx0OglGSVhNRShtY2ltaWRpLCAiVGhlcmUgaXMgYSBiYWQgYmFkIHByb2dyYW1tZXJcbiIpOwoJCX0KCSAgICB9IGVsc2UgewoJCWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfUFBRTjsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX01BU1RFUjoKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX1NFUV9TVEFUVVNfTUFTVEVSICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfU0xBVkU6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TRVFfU1RBVFVTX1NMQVZFICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfT0ZGU0VUOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU0VRX1NUQVRVU19PRkZTRVQgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19QT1JUOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU0VRX1NUQVRVU19QT1JUICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfVEVNUE86CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TRVFfU1RBVFVTX1RFTVBPICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gd21tLT5kd1RlbXBvOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBXQVJOKG1jaW1pZGksICJVbmtub3dtIGNvbW1hbmQgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdJdGVtKTsKCSAgICByZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwoJfQogICAgfSBlbHNlIHsKCVdBUk4obWNpbWlkaSwgIk5vIFN0YXR1cy1JdGVtIVxuIik7CglyZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwogICAgfQogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CglUUkFDRShtY2ltaWRpLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpR2V0RGV2Q2FwcwkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpR2V0RGV2Q2FwcyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCAKCQkJCUxQTUNJX0dFVERFVkNBUFNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKCiAgICBUUkFDRShtY2ltaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwoKICAgIGlmIChscFBhcm1zID09IE5VTEwpIAlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKCiAgICBpZiAoZHdGbGFncyAmIE1DSV9HRVRERVZDQVBTX0lURU0pIHsKCXN3aXRjaCAobHBQYXJtcy0+ZHdJdGVtKSB7CgljYXNlIE1DSV9HRVRERVZDQVBTX0RFVklDRV9UWVBFOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfR0VUREVWQ0FQU19ERVZJQ0VfVFlQRSAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1DSV9ERVZUWVBFX1NFUVVFTkNFUjsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfSEFTX0FVRElPOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfR0VUREVWQ0FQU19IQVNfQVVESU8gIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19IQVNfVklERU86CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9HRVRERVZDQVBTX0hBU19WSURFTyAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IEZBTFNFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19VU0VTX0ZJTEVTOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfR0VUREVWQ0FQU19VU0VTX0ZJTEVTICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ09NUE9VTkRfREVWSUNFOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfR0VUREVWQ0FQU19DT01QT1VORF9ERVZJQ0UgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fRUpFQ1Q6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9HRVRERVZDQVBTX0NBTl9FSkVDVCAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IEZBTFNFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUExBWToKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX0dFVERFVkNBUFNfQ0FOX1BMQVkgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUkVDT1JEOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfR0VUREVWQ0FQU19DQU5fUkVDT1JEICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX1NBVkU6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9HRVRERVZDQVBTX0NBTl9TQVZFICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gRkFMU0U7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIFRSQUNFKG1jaW1pZGksICJVbmtub3duIGNhcGFiaWxpdHkgKCUwOGx4KSAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOwoJICAgIHJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7Cgl9CiAgICB9IGVsc2UgewoJVFJBQ0UobWNpbWlkaSwgIk5vIEdldERldkNhcHMtSXRlbSAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUluZm8JCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lJbmZvKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVMzMkEgbHBQYXJtcykKewogICAgRFdPUkQJCXJldCA9IDA7CiAgICBMUFNUUgkJc3RyID0gMDsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CgogICAgVFJBQ0UobWNpbWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMIHx8IGxwUGFybXMtPmxwc3RyUmV0dXJuID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIH0gZWxzZSBpZiAod21tID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIH0gZWxzZSB7CglUUkFDRShtY2ltaWRpLCAiYnVmPSVwLCBsZW49JWx1XG4iLCBscFBhcm1zLT5scHN0clJldHVybiwgbHBQYXJtcy0+ZHdSZXRTaXplKTsKCglzd2l0Y2ggKGR3RmxhZ3MpIHsKCWNhc2UgTUNJX0lORk9fUFJPRFVDVDoKCSAgICBzdHIgPSAiV2luZSdzIE1JREkgc2VxdWVuY2VyIjsKCSAgICBicmVhazsKCWNhc2UgTUNJX0lORk9fRklMRToKCSAgICBzdHIgPSB3bW0tPm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lOwoJICAgIGJyZWFrOwojaWYgMAogICAgICAgIC8qIEZJWE1FOiB0aGUgZm9sbG93aW5nIG1hbmlmZXN0IGNvbnN0YW50cyBhcmUgbm90IGRlZmluZWQgaW4gPFdJTkU+L2luY2x1ZGUvbW1zeXN0ZW0uaCAqLwoJY2FzZSBNQ0lfSU5GT19DT1BZUklHSFQ6CgkgICAgYnJlYWs7CgljYXNlIE1DSV9JTkZPX05BTUU6CgkgICAgYnJlYWs7CiNlbmRpZgoJZGVmYXVsdDoKCSAgICBXQVJOKG1jaW1pZGksICJEb24ndCBrbm93IHRoaXMgaW5mbyBjb21tYW5kICglbHUpXG4iLCBkd0ZsYWdzKTsKCSAgICByZXQgPSBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7Cgl9CiAgICB9CiAgICBpZiAoc3RyKSB7CglyZXQgPSBNQ0lfV3JpdGVTdHJpbmcobHBQYXJtcy0+bHBzdHJSZXR1cm4sIGxwUGFybXMtPmR3UmV0U2l6ZSwgc3RyKTsKICAgIH0gZWxzZSB7CglscFBhcm1zLT5scHN0clJldHVyblswXSA9IDA7CiAgICB9CgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVNlZWsJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lTZWVrKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFRUtfUEFSTVMgbHBQYXJtcykKewogICAgRFdPUkQJCXJldCA9IDA7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwoKICAgIFRSQUNFKG1jaW1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CgogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgfSBlbHNlIGlmICh3bW0gPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgfSBlbHNlIHsKCU1JRElfbWNpU3RvcCh3RGV2SUQsIE1DSV9XQUlULCAwKTsKCQoJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VFS19UT19TVEFSVCkgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMDsKCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9TRUVLX1RPX0VORCkgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMHhGRkZGRkZGRjsgLyogZml4bWUgKi8KCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9UTykgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMod21tLCBscFBhcm1zLT5kd1RvKTsKCX0gZWxzZSB7CgkgICAgV0FSTihtY2ltaWRpLCAiZHdGbGFnIGRvZXNuJ3QgdGVsbCB3aGVyZSB0byBzZWVrIHRvLi4uXG4iKTsKCSAgICByZXR1cm4gTUNJRVJSX01JU1NJTkdfUEFSQU1FVEVSOwoJfQoJCglUUkFDRShtY2ltaWRpLCAiU2Vla2luZyB0byBwb3NpdGlvbj0lbHUgbXNcbiIsIHdtbS0+ZHdQb3NpdGlvbk1TKTsKCQoJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCSAgICBtY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCSAgICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKCX0KICAgIH0KICAgIHJldHVybiByZXQ7CQp9ICAgIAojZW5kaWYKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoKICogICAgICAgICAgICAgICAgICAJICAgIE1JREkgZW50cnkgcG9pbnRzIAkJCQkqCiAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1DSU1JRElfRHJpdmVyUHJvYzMyCVtzYW1wbGUgZHJpdmVyXQogKi8KTE9ORyBNQ0lNSURJX0RyaXZlclByb2MzMihEV09SRCBkd0RldklELCBIRFJWUjE2IGhEcml2LCBEV09SRCB3TXNnLCAKCQkJICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCnsKICAgIHN3aXRjaCAod01zZykgewogICAgY2FzZSBEUlZfTE9BRDoJCXJldHVybiAxOwogICAgY2FzZSBEUlZfRlJFRToJCXJldHVybiAxOwogICAgY2FzZSBEUlZfT1BFTjoJCXJldHVybiAxOwogICAgY2FzZSBEUlZfQ0xPU0U6CQlyZXR1cm4gMTsKICAgIGNhc2UgRFJWX0VOQUJMRToJCXJldHVybiAxOwogICAgY2FzZSBEUlZfRElTQUJMRToJCXJldHVybiAxOwogICAgY2FzZSBEUlZfUVVFUllDT05GSUdVUkU6CXJldHVybiAxOwogICAgY2FzZSBEUlZfQ09ORklHVVJFOgkJTWVzc2FnZUJveDE2KDAsICJTYW1wbGUgTWlkaSBMaW51eCBEcml2ZXIgISIsICJNTUxpbnV4IERyaXZlciIsIE1CX09LKTsgcmV0dXJuIDE7CiAgICBjYXNlIERSVl9JTlNUQUxMOgkJcmV0dXJuIERSVkNORl9SRVNUQVJUOwogICAgY2FzZSBEUlZfUkVNT1ZFOgkJcmV0dXJuIERSVkNORl9SRVNUQVJUOwojaWZkZWYgU05EQ1RMX01JRElfSU5GTwogICAgY2FzZSBNQ0lfT1BFTl9EUklWRVI6CXJldHVybiBNSURJX21jaU9wZW4gICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9PUEVOX1BBUk1TMzJBKSAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX0NMT1NFX0RSSVZFUjoJcmV0dXJuIE1JRElfbWNpQ2xvc2UgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfUExBWToJCXJldHVybiBNSURJX21jaVBsYXkgICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9QTEFZX1BBUk1TKSAgICAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1JFQ09SRDoJCXJldHVybiBNSURJX21jaVJlY29yZCAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9SRUNPUkRfUEFSTVMpICAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1NUT1A6CQlyZXR1cm4gTUlESV9tY2lTdG9wICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9TRVQ6CQlyZXR1cm4gTUlESV9tY2lTZXQgICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfU0VUX1BBUk1TKSAgICAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9QQVVTRToJCXJldHVybiBNSURJX21jaVBhdXNlICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKSAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1JFU1VNRToJCXJldHVybiBNSURJX21jaVJlc3VtZSAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKSAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1NUQVRVUzoJCXJldHVybiBNSURJX21jaVN0YXR1cyAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9TVEFUVVNfUEFSTVMpICAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX0dFVERFVkNBUFM6CXJldHVybiBNSURJX21jaUdldERldkNhcHMoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRVRERVZDQVBTX1BBUk1TKWR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX0lORk86CQlyZXR1cm4gTUlESV9tY2lJbmZvICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfSU5GT19QQVJNUzMyQSkgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9TRUVLOgkJcmV0dXJuIE1JRElfbWNpU2VlayAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1NFRUtfUEFSTVMpICAgICAgZHdQYXJhbTIpOwojZWxzZQogICAgY2FzZSBNQ0lfT1BFTl9EUklWRVI6CiAgICBjYXNlIE1DSV9DTE9TRV9EUklWRVI6CiAgICBjYXNlIE1DSV9QTEFZOgogICAgY2FzZSBNQ0lfUkVDT1JEOgogICAgY2FzZSBNQ0lfU1RPUDoKICAgIGNhc2UgTUNJX1NFVDoKICAgIGNhc2UgTUNJX1BBVVNFOgogICAgY2FzZSBNQ0lfUkVTVU1FOgogICAgY2FzZSBNQ0lfU1RBVFVTOgogICAgY2FzZSBNQ0lfR0VUREVWQ0FQUzoKICAgIGNhc2UgTUNJX0lORk86CiAgICBjYXNlIE1DSV9TRUVLOgojZW5kaWYKICAgIGNhc2UgTUNJX0xPQUQ6CQkKICAgIGNhc2UgTUNJX1NBVkU6CQkKICAgIGNhc2UgTUNJX0ZSRUVaRToJCQogICAgY2FzZSBNQ0lfUFVUOgkJCiAgICBjYXNlIE1DSV9SRUFMSVpFOgkJCiAgICBjYXNlIE1DSV9VTkZSRUVaRToJCQogICAgY2FzZSBNQ0lfVVBEQVRFOgkJCiAgICBjYXNlIE1DSV9XSEVSRToJCQogICAgY2FzZSBNQ0lfV0lORE9XOgkJCiAgICBjYXNlIE1DSV9TVEVQOgkJCiAgICBjYXNlIE1DSV9TUElOOgkJCiAgICBjYXNlIE1DSV9FU0NBUEU6CQkKICAgIGNhc2UgTUNJX0NPUFk6CQkKICAgIGNhc2UgTUNJX0NVVDoJCQogICAgY2FzZSBNQ0lfREVMRVRFOgkJCiAgICBjYXNlIE1DSV9QQVNURToJCQoJV0FSTihtY2ltaWRpLCAiVW5zdXBwb3J0ZWQgY29tbWFuZD0lc1xuIiwgTUNJX0NvbW1hbmRUb1N0cmluZyh3TXNnKSk7CglicmVhazsKICAgIGNhc2UgTUNJX09QRU46CiAgICBjYXNlIE1DSV9DTE9TRToKCUZJWE1FKG1jaW1pZGksICJTaG91bGRuJ3QgcmVjZWl2ZSBhIE1DSV9PUEVOIG9yIENMT1NFIG1lc3NhZ2VcbiIpOwoJYnJlYWs7CiAgICBkZWZhdWx0OgkJCQoJVFJBQ0UobWNpbWlkaSwgIlNlbmRpbmcgbXNnPSVzIHRvIGRlZmF1bHQgZHJpdmVyIHByb2NcbiIsIE1DSV9Db21tYW5kVG9TdHJpbmcod01zZykpOwoJcmV0dXJuIERlZkRyaXZlclByb2MzMihkd0RldklELCBoRHJpdiwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKICAgIH0KICAgIHJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwo=