LyoKICogTG9jYWxlLWRlcGVuZGVudCBmb3JtYXQgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggRGF2aWQgTGVlIExhbWJlcnQKICogQ29weXJpZ2h0IDIwMDAgSnVsaW8gQ+lzYXIgR+F6cXVlegogKiBDb3B5cmlnaHQgMjAwMyBKb24gR3JpZmZpdGhzCiAqIENvcHlyaWdodCAyMDA1IERtaXRyeSBUaW1vc2hrb3YKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKCiNpbmNsdWRlICJrZXJuZWxfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobmxzKTsKCiNkZWZpbmUgREFURV9EQVRFVkFSU09OTFkgMHgwMTAwICAvKiBvbmx5IGRhdGUgc3R1ZmY6IHlNZGcgKi8KI2RlZmluZSBUSU1FX1RJTUVWQVJTT05MWSAweDAyMDAgIC8qIG9ubHkgdGltZSBzdHVmZjogaEhtc3QgKi8KCi8qIFNpbmNlIGNhbGN1bGF0aW5nIHRoZSBmb3JtYXR0aW5nIGRhdGEgZm9yIGVhY2ggbG9jYWxlIGlzIHRpbWUtY29uc3VtaW5nLAogKiB3ZSBnZXQgdGhlIGZvcm1hdCBkYXRhIGZvciBlYWNoIGxvY2FsZSBvbmx5IG9uY2UgYW5kIGNhY2hlIGl0IGluIG1lbW9yeS4KICogV2UgY2FjaGUgYm90aCB0aGUgc3lzdGVtIGRlZmF1bHQgYW5kIHVzZXIgb3ZlcnJpZGRlbiBkYXRhLCBhZnRlciBjb252ZXJ0aW5nCiAqIHRoZW0gaW50byB0aGUgZm9ybWF0cyB0aGF0IHRoZSBmdW5jdGlvbnMgaGVyZSBleHBlY3QuIFNpbmNlIHRoZXNlIGZ1bmN0aW9ucwogKiB3aWxsIHR5cGljYWxseSBiZSBjYWxsZWQgd2l0aCBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHRoZSB0b3RhbCBsb2NhbGVzCiAqIGluc3RhbGxlZCwgdGhlIG1lbW9yeSBvdmVyaGVhZCBpcyBtaW5pbWFsIHdoaWxlIHRoZSBzcGVlZHVwIGlzIHNpZ25pZmljYW50LgogKgogKiBPdXIgY2FjaGUgdGFrZXMgdGhlIGZvcm0gb2YgYSBzaW5nbHkgbGlua2VkIGxpc3QsIHdob3NlIG5vZGUgaXMgYmVsb3c6CiAqLwojZGVmaW5lIE5MU19OVU1fQ0FDSEVEX1NUUklOR1MgNDUKCnR5cGVkZWYgc3RydWN0IF9OTFNfRk9STUFUX05PREUKewogIExDSUQgIGxjaWQ7ICAgICAgICAgLyogTG9jYWxlIElkICovCiAgRFdPUkQgZHdGbGFnczsgICAgICAvKiAwIG9yIExPQ0FMRV9OT1VTRVJPVkVSUklERSAqLwogIERXT1JEIGR3Q29kZVBhZ2U7ICAgLyogRGVmYXVsdCBjb2RlIHBhZ2UgKGlmIExPQ0FMRV9VU0VfQU5TSV9DUCBub3QgZ2l2ZW4pICovCiAgTlVNQkVSRk1UVyAgIGZtdDsgICAvKiBEZWZhdWx0IGZvcm1hdCBmb3IgbnVtYmVycyAqLwogIENVUlJFTkNZRk1UVyBjeWZtdDsgLyogRGVmYXVsdCBmb3JtYXQgZm9yIGN1cnJlbmNpZXMgKi8KICBMUFdTVFIgbHBwc3pTdHJpbmdzW05MU19OVU1fQ0FDSEVEX1NUUklOR1NdOyAvKiBEZWZhdWx0IGZvcm1hdHMsZGF5L21vbnRoIG5hbWVzICovCiAgV0NIQVIgc3pTaG9ydEFNWzJdOyAvKiBTaG9ydCAnQU0nIG1hcmtlciAqLwogIFdDSEFSIHN6U2hvcnRQTVsyXTsgLyogU2hvcnQgJ1BNJyBtYXJrZXIgKi8KICBzdHJ1Y3QgX05MU19GT1JNQVRfTk9ERSAqbmV4dDsKfSBOTFNfRk9STUFUX05PREU7CgovKiBNYWNyb3MgdG8gZ2V0IHBhcnRpY3VsYXIgZGF0YSBzdHJpbmdzIGZyb20gYSBmb3JtYXQgbm9kZSAqLwojZGVmaW5lIEdldE5lZ2F0aXZlKGZtdCkgIGZtdC0+bHBwc3pTdHJpbmdzWzBdCiNkZWZpbmUgR2V0TG9uZ0RhdGUoZm10KSAgZm10LT5scHBzelN0cmluZ3NbMV0KI2RlZmluZSBHZXRTaG9ydERhdGUoZm10KSBmbXQtPmxwcHN6U3RyaW5nc1syXQojZGVmaW5lIEdldFRpbWUoZm10KSAgICAgIGZtdC0+bHBwc3pTdHJpbmdzWzNdCiNkZWZpbmUgR2V0QU0oZm10KSAgICAgICAgZm10LT5scHBzelN0cmluZ3NbNDJdCiNkZWZpbmUgR2V0UE0oZm10KSAgICAgICAgZm10LT5scHBzelN0cmluZ3NbNDNdCiNkZWZpbmUgR2V0WWVhck1vbnRoKGZtdCkgZm10LT5scHBzelN0cmluZ3NbNDRdCgojZGVmaW5lIEdldExvbmdEYXkoZm10LGRheSkgICAgZm10LT5scHBzelN0cmluZ3NbNCArIGRheV0KI2RlZmluZSBHZXRTaG9ydERheShmbXQsZGF5KSAgIGZtdC0+bHBwc3pTdHJpbmdzWzExICsgZGF5XQojZGVmaW5lIEdldExvbmdNb250aChmbXQsbXRoKSAgZm10LT5scHBzelN0cmluZ3NbMTggKyBtdGhdCiNkZWZpbmUgR2V0U2hvcnRNb250aChmbXQsbXRoKSBmbXQtPmxwcHN6U3RyaW5nc1szMCArIG10aF0KCi8qIFdyaXRlIGFjY2VzcyB0byB0aGUgY2FjaGUgaXMgcHJvdGVjdGVkIGJ5IHRoaXMgY3JpdGljYWwgc2VjdGlvbiAqLwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBOTFNfRm9ybWF0c0NTOwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTl9ERUJVRyBOTFNfRm9ybWF0c0NTX2RlYnVnID0KewogICAgMCwgMCwgJk5MU19Gb3JtYXRzQ1MsCiAgICB7ICZOTFNfRm9ybWF0c0NTX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QsCiAgICAgICZOTFNfRm9ybWF0c0NTX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QgfSwKICAgICAgMCwgMCwgeyAoRFdPUkRfUFRSKShfX0ZJTEVfXyAiOiBOTFNfRm9ybWF0cyIpIH0KfTsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gTkxTX0Zvcm1hdHNDUyA9IHsgJk5MU19Gb3JtYXRzQ1NfZGVidWcsIC0xLCAwLCAwLCAwLCAwIH07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTkxTX0dldExvY2FsZU51bWJlciA8aW50ZXJuYWw+CiAqCiAqIEdldCBhIG51bWVyaWMgbG9jYWxlIGZvcm1hdCB2YWx1ZS4KICovCnN0YXRpYyBEV09SRCBOTFNfR2V0TG9jYWxlTnVtYmVyKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncykKewogIFdDSEFSIHN6QnVmZls4MF07CiAgRFdPUkQgZHdWYWwgPSAwOwoKICBzekJ1ZmZbMF0gPSAnXDAnOwogIEdldExvY2FsZUluZm9XKGxjaWQsIGR3RmxhZ3MsIHN6QnVmZiwgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpKTsKCiAgaWYgKHN6QnVmZlswXSAmJiBzekJ1ZmZbMV0gPT0gJzsnICYmIHN6QnVmZlsyXSAhPSAnMCcpCiAgICBkd1ZhbCA9IChzekJ1ZmZbMF0gLSAnMCcpICogMTAgKyAoc3pCdWZmWzJdIC0gJzAnKTsKICBlbHNlCiAgewogICAgY29uc3QgV0NIQVIqIGl0ZXIgPSBzekJ1ZmY7CiAgICBkd1ZhbCA9IDA7CiAgICB3aGlsZSgqaXRlciA+PSAnMCcgJiYgKml0ZXIgPD0gJzknKQogICAgICBkd1ZhbCA9IGR3VmFsICogMTAgKyAoKml0ZXIrKyAtICcwJyk7CiAgfQogIHJldHVybiBkd1ZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19HZXRMb2NhbGVTdHJpbmcgPGludGVybmFsPgogKgogKiBHZXQgYSBzdHJpbmcgbG9jYWxlIGZvcm1hdCB2YWx1ZS4KICovCnN0YXRpYyBXQ0hBUiogTkxTX0dldExvY2FsZVN0cmluZyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MpCnsKICBXQ0hBUiBzekJ1ZmZbODBdLCAqc3RyOwogIERXT1JEIGR3TGVuOwoKICBzekJ1ZmZbMF0gPSAnXDAnOwogIEdldExvY2FsZUluZm9XKGxjaWQsIGR3RmxhZ3MsIHN6QnVmZiwgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpKTsKICBkd0xlbiA9IHN0cmxlblcoc3pCdWZmKSArIDE7CiAgc3RyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGR3TGVuICogc2l6ZW9mKFdDSEFSKSk7CiAgaWYgKHN0cikKICAgIG1lbWNweShzdHIsIHN6QnVmZiwgZHdMZW4gKiBzaXplb2YoV0NIQVIpKTsKICByZXR1cm4gc3RyOwp9CgojZGVmaW5lIEdFVF9MT0NBTEVfTlVNQkVSKG51bSwgdHlwZSkgbnVtID0gTkxTX0dldExvY2FsZU51bWJlcihsY2lkLCB0eXBlfGR3RmxhZ3MpOyBcCiAgVFJBQ0UoICN0eXBlICI6ICVsZCAoJTA4bHgpXG4iLCAoRFdPUkQpbnVtLCAoRFdPUkQpbnVtKQoKI2RlZmluZSBHRVRfTE9DQUxFX1NUUklORyhzdHIsIHR5cGUpIHN0ciA9IE5MU19HZXRMb2NhbGVTdHJpbmcobGNpZCwgdHlwZXxkd0ZsYWdzKTsgXAogIFRSQUNFKCAjdHlwZSAiOiAnJXMnXG4iLCBkZWJ1Z3N0cl93KHN0cikpCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTkxTX0dldEZvcm1hdHMgPGludGVybmFsPgogKgogKiBDYWxjdWxhdGUgKGFuZCBjYWNoZSkgdGhlIG51bWJlciBmb3JtYXRzIGZvciBhIGxvY2FsZS4KICovCnN0YXRpYyBjb25zdCBOTFNfRk9STUFUX05PREUgKk5MU19HZXRGb3JtYXRzKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncykKewogIC8qIEdldExvY2FsZUluZm8oKSBpZGVudGlmaWVycyBmb3IgY2FjaGVkIGZvcm1hdHRpbmcgc3RyaW5ncyAqLwogIHN0YXRpYyBjb25zdCBVU0hPUlQgTkxTX0xvY2FsZUluZGljZXNbXSA9IHsKICAgIExPQ0FMRV9TTkVHQVRJVkVTSUdOLAogICAgTE9DQUxFX1NMT05HREFURSwgICBMT0NBTEVfU1NIT1JUREFURSwKICAgIExPQ0FMRV9TVElNRUZPUk1BVCwKICAgIExPQ0FMRV9TREFZTkFNRTEsIExPQ0FMRV9TREFZTkFNRTIsIExPQ0FMRV9TREFZTkFNRTMsCiAgICBMT0NBTEVfU0RBWU5BTUU0LCBMT0NBTEVfU0RBWU5BTUU1LCBMT0NBTEVfU0RBWU5BTUU2LCBMT0NBTEVfU0RBWU5BTUU3LAogICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywKICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsCiAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LAogICAgTE9DQUxFX1NNT05USE5BTUUxLCBMT0NBTEVfU01PTlRITkFNRTIsIExPQ0FMRV9TTU9OVEhOQU1FMywKICAgIExPQ0FMRV9TTU9OVEhOQU1FNCwgTE9DQUxFX1NNT05USE5BTUU1LCBMT0NBTEVfU01PTlRITkFNRTYsCiAgICBMT0NBTEVfU01PTlRITkFNRTcsIExPQ0FMRV9TTU9OVEhOQU1FOCwgTE9DQUxFX1NNT05USE5BTUU5LAogICAgTE9DQUxFX1NNT05USE5BTUUxMCwgTE9DQUxFX1NNT05USE5BTUUxMSwgTE9DQUxFX1NNT05USE5BTUUxMiwKICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsCiAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwgTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LAogICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwKICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsCiAgICBMT0NBTEVfUzExNTksIExPQ0FMRV9TMjM1OSwKICAgIExPQ0FMRV9TWUVBUk1PTlRICiAgfTsKICBzdGF0aWMgTkxTX0ZPUk1BVF9OT0RFICpOTFNfQ2FjaGVkRm9ybWF0cyA9IE5VTEw7CiAgTkxTX0ZPUk1BVF9OT0RFICpub2RlID0gTkxTX0NhY2hlZEZvcm1hdHM7CgogIGR3RmxhZ3MgJj0gTE9DQUxFX05PVVNFUk9WRVJSSURFOwoKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseClcbiIsIGxjaWQsIGR3RmxhZ3MpOwoKICAvKiBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGNhY2hlZCB0aGUgbG9jYWxlcyBudW1iZXIgZm9ybWF0ICovCiAgd2hpbGUgKG5vZGUgJiYgKG5vZGUtPmxjaWQgIT0gbGNpZCB8fCBub2RlLT5kd0ZsYWdzICE9IGR3RmxhZ3MpICYmIG5vZGUtPm5leHQpCiAgICBub2RlID0gbm9kZS0+bmV4dDsKCiAgaWYgKCFub2RlIHx8IG5vZGUtPmxjaWQgIT0gbGNpZCB8fCBub2RlLT5kd0ZsYWdzICE9IGR3RmxhZ3MpCiAgewogICAgTkxTX0ZPUk1BVF9OT0RFICpuZXdfbm9kZTsKICAgIERXT1JEIGk7CgogICAgVFJBQ0UoIkNyZWF0aW5nIG5ldyBjYWNoZSBlbnRyeVxuIik7CgogICAgaWYgKCEobmV3X25vZGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKE5MU19GT1JNQVRfTk9ERSkpKSkKICAgICAgcmV0dXJuIE5VTEw7CgogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmR3Q29kZVBhZ2UsIExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSk7CgogICAgLyogTnVtYmVyIEZvcm1hdCAqLwogICAgbmV3X25vZGUtPmxjaWQgPSBsY2lkOwogICAgbmV3X25vZGUtPmR3RmxhZ3MgPSBkd0ZsYWdzOwogICAgbmV3X25vZGUtPm5leHQgPSBOVUxMOwoKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5mbXQuTnVtRGlnaXRzLCBMT0NBTEVfSURJR0lUUyk7CiAgICBHRVRfTE9DQUxFX05VTUJFUihuZXdfbm9kZS0+Zm10LkxlYWRpbmdaZXJvLCBMT0NBTEVfSUxaRVJPKTsKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5mbXQuTmVnYXRpdmVPcmRlciwgTE9DQUxFX0lORUdOVU1CRVIpOwoKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5mbXQuR3JvdXBpbmcsIExPQ0FMRV9TR1JPVVBJTkcpOwogICAgaWYgKG5ld19ub2RlLT5mbXQuR3JvdXBpbmcgPiA5ICYmIG5ld19ub2RlLT5mbXQuR3JvdXBpbmcgIT0gMzIpCiAgICB7CiAgICAgIFdBUk4oIkxPQ0FMRV9TR1JPVVBJTkcgKCVkKSB1bmhhbmRsZWQsIHBsZWFzZSByZXBvcnQhXG4iLAogICAgICAgICAgIG5ld19ub2RlLT5mbXQuR3JvdXBpbmcpOwogICAgICBuZXdfbm9kZS0+Zm10Lkdyb3VwaW5nID0gMDsKICAgIH0KCiAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+Zm10LmxwRGVjaW1hbFNlcCwgTE9DQUxFX1NERUNJTUFMKTsKICAgIEdFVF9MT0NBTEVfU1RSSU5HKG5ld19ub2RlLT5mbXQubHBUaG91c2FuZFNlcCwgTE9DQUxFX1NUSE9VU0FORCk7CgogICAgLyogQ3VycmVuY3kgRm9ybWF0ICovCiAgICBuZXdfbm9kZS0+Y3lmbXQuTnVtRGlnaXRzID0gbmV3X25vZGUtPmZtdC5OdW1EaWdpdHM7CiAgICBuZXdfbm9kZS0+Y3lmbXQuTGVhZGluZ1plcm8gPSBuZXdfbm9kZS0+Zm10LkxlYWRpbmdaZXJvOwoKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZywgTE9DQUxFX1NHUk9VUElORyk7CgogICAgaWYgKG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZyA+IDkpCiAgICB7CiAgICAgIFdBUk4oIkxPQ0FMRV9TTU9OR1JPVVBJTkcgKCVkKSB1bmhhbmRsZWQsIHBsZWFzZSByZXBvcnQhXG4iLAogICAgICAgICAgIG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZyk7CiAgICAgIG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZyA9IDA7CiAgICB9CgogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmN5Zm10Lk5lZ2F0aXZlT3JkZXIsIExPQ0FMRV9JTkVHQ1VSUik7CiAgICBpZiAobmV3X25vZGUtPmN5Zm10Lk5lZ2F0aXZlT3JkZXIgPiAxNSkKICAgIHsKICAgICAgV0FSTigiTE9DQUxFX0lORUdDVVJSICglZCkgdW5oYW5kbGVkLCBwbGVhc2UgcmVwb3J0IVxuIiwKICAgICAgICAgICBuZXdfbm9kZS0+Y3lmbXQuTmVnYXRpdmVPcmRlcik7CiAgICAgIG5ld19ub2RlLT5jeWZtdC5OZWdhdGl2ZU9yZGVyID0gMDsKICAgIH0KICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5jeWZtdC5Qb3NpdGl2ZU9yZGVyLCBMT0NBTEVfSUNVUlJFTkNZKTsKICAgIGlmIChuZXdfbm9kZS0+Y3lmbXQuUG9zaXRpdmVPcmRlciA+IDMpCiAgICB7CiAgICAgIFdBUk4oIkxPQ0FMRV9JUE9TQ1VSUiAoJWQpIHVuaGFuZGxlZCxwbGVhc2UgcmVwb3J0IVxuIiwKICAgICAgICAgICBuZXdfbm9kZS0+Y3lmbXQuUG9zaXRpdmVPcmRlcik7CiAgICAgIG5ld19ub2RlLT5jeWZtdC5Qb3NpdGl2ZU9yZGVyID0gMDsKICAgIH0KICAgIEdFVF9MT0NBTEVfU1RSSU5HKG5ld19ub2RlLT5jeWZtdC5scERlY2ltYWxTZXAsIExPQ0FMRV9TTU9OREVDSU1BTFNFUCk7CiAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+Y3lmbXQubHBUaG91c2FuZFNlcCwgTE9DQUxFX1NNT05USE9VU0FORFNFUCk7CiAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+Y3lmbXQubHBDdXJyZW5jeVN5bWJvbCwgTE9DQUxFX1NDVVJSRU5DWSk7CgogICAgLyogRGF0ZS9UaW1lIEZvcm1hdCBpbmZvLCBuZWdhdGl2ZSBjaGFyYWN0ZXIsIGV0YyAqLwogICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihOTFNfTG9jYWxlSW5kaWNlcykvc2l6ZW9mKE5MU19Mb2NhbGVJbmRpY2VzWzBdKTsgaSsrKQogICAgewogICAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+bHBwc3pTdHJpbmdzW2ldLCBOTFNfTG9jYWxlSW5kaWNlc1tpXSk7CiAgICB9CiAgICBuZXdfbm9kZS0+c3pTaG9ydEFNWzBdID0gR2V0QU0obmV3X25vZGUpWzBdOyBuZXdfbm9kZS0+c3pTaG9ydEFNWzFdID0gJ1wwJzsKICAgIG5ld19ub2RlLT5zelNob3J0UE1bMF0gPSBHZXRQTShuZXdfbm9kZSlbMF07IG5ld19ub2RlLT5zelNob3J0UE1bMV0gPSAnXDAnOwoKICAgIC8qIE5vdyBhZGQgdGhlIGNvbXB1dGVkIGZvcm1hdCB0byB0aGUgY2FjaGUgKi8KICAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCZOTFNfRm9ybWF0c0NTKTsKCiAgICAvKiBTZWFyY2ggYWdhaW46IFdlIG1heSBoYXZlIHJhY2VkIHRvIGFkZCB0aGUgbm9kZSAqLwogICAgbm9kZSA9IE5MU19DYWNoZWRGb3JtYXRzOwogICAgd2hpbGUgKG5vZGUgJiYgKG5vZGUtPmxjaWQgIT0gbGNpZCB8fCBub2RlLT5kd0ZsYWdzICE9IGR3RmxhZ3MpICYmIG5vZGUtPm5leHQpCiAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwoKICAgIGlmICghbm9kZSkKICAgIHsKICAgICAgbm9kZSA9IE5MU19DYWNoZWRGb3JtYXRzID0gbmV3X25vZGU7IC8qIEVtcHR5IGxpc3QgKi8KICAgICAgbmV3X25vZGUgPSBOVUxMOwogICAgfQogICAgZWxzZSBpZiAobm9kZS0+bGNpZCAhPSBsY2lkIHx8IG5vZGUtPmR3RmxhZ3MgIT0gZHdGbGFncykKICAgIHsKICAgICAgbm9kZS0+bmV4dCA9IG5ld19ub2RlOyAvKiBOb3QgaW4gdGhlIGxpc3QsIGFkZCB0byBlbmQgKi8KICAgICAgbm9kZSA9IG5ld19ub2RlOwogICAgICBuZXdfbm9kZSA9IE5VTEw7CiAgICB9CgogICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oJk5MU19Gb3JtYXRzQ1MpOwoKICAgIGlmIChuZXdfbm9kZSkKICAgIHsKICAgICAgLyogV2UgcmFjZWQgYW5kIGxvc3Q6IFRoZSBub2RlIHdhcyBhbHJlYWR5IGFkZGVkIGJ5IGFub3RoZXIgdGhyZWFkLgogICAgICAgKiBub2RlIHBvaW50cyB0byB0aGUgY3VycmVudGx5IGNhY2hlZCBub2RlLCBzbyBmcmVlIG5ld19ub2RlLgogICAgICAgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihOTFNfTG9jYWxlSW5kaWNlcykvc2l6ZW9mKE5MU19Mb2NhbGVJbmRpY2VzWzBdKTsgaSsrKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5scHBzelN0cmluZ3NbaV0pOwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdfbm9kZS0+Zm10LmxwRGVjaW1hbFNlcCk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5mbXQubHBUaG91c2FuZFNlcCk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5jeWZtdC5scERlY2ltYWxTZXApOwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdfbm9kZS0+Y3lmbXQubHBUaG91c2FuZFNlcCk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5jeWZtdC5scEN1cnJlbmN5U3ltYm9sKTsKICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmV3X25vZGUpOwogICAgfQogIH0KICByZXR1cm4gbm9kZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19Jc1VuaWNvZGVPbmx5TGNpZCA8aW50ZXJuYWw+CiAqCiAqIERldGVybWluZSBpZiBhIGxvY2FsZSBpcyBVbmljb2RlIG9ubHksIGFuZCB0aHVzIGludmFsaWQgaW4gQVNDSUkgY2FsbHMuCiAqLwpCT09MIE5MU19Jc1VuaWNvZGVPbmx5TGNpZChMQ0lEIGxjaWQpCnsKICBzd2l0Y2ggKFBSSU1BUllMQU5HSUQobGNpZCkpCiAgewogIGNhc2UgTEFOR19BUk1FTklBTjoKICBjYXNlIExBTkdfRElWRUhJOgogIGNhc2UgTEFOR19HRU9SR0lBTjoKICBjYXNlIExBTkdfR1VKQVJBVEk6CiAgY2FzZSBMQU5HX0hJTkRJOgogIGNhc2UgTEFOR19LQU5OQURBOgogIGNhc2UgTEFOR19LT05LQU5JOgogIGNhc2UgTEFOR19NQVJBVEhJOgogIGNhc2UgTEFOR19QVU5KQUJJOgogIGNhc2UgTEFOR19TQU5TS1JJVDoKICAgIFRSQUNFKCJsY2lkIDB4JTA4bHg6IGxhbmdpZCAweCU0eCBpcyBVbmljb2RlIE9ubHlcbiIsIGxjaWQsIFBSSU1BUllMQU5HSUQobGNpZCkpOwogICAgcmV0dXJuIFRSVUU7CiAgZGVmYXVsdDoKICAgIHJldHVybiBGQUxTRTsKICB9Cn0KCi8qCiAqIEZvcm1hdHRpbmcgb2YgZGF0ZXMsIHRpbWVzLCBudW1iZXJzIGFuZCBjdXJyZW5jaWVzLgogKi8KCiNkZWZpbmUgSXNMaXRlcmFsTWFya2VyKHApIChwID09ICdcJycpCiNkZWZpbmUgSXNEYXRlRm10Q2hhcihwKSAgIChwID09ICdkJ3x8cCA9PSAnTSd8fHAgPT0gJ3knfHxwID09ICdnJykKI2RlZmluZSBJc1RpbWVGbXRDaGFyKHApICAgKHAgPT0gJ0gnfHxwID09ICdoJ3x8cCA9PSAnbSd8fHAgPT0gJ3MnfHxwID09ICd0JykKCi8qIE9ubHkgdGhlIGZvbGxvd2luZyBmbGFncyBjYW4gYmUgZ2l2ZW4gaWYgYSBkYXRlL3RpbWUgZm9ybWF0IGlzIHNwZWNpZmllZCAqLwojZGVmaW5lIERBVEVfRk9STUFUX0ZMQUdTIChEQVRFX0RBVEVWQVJTT05MWXxMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiNkZWZpbmUgVElNRV9GT1JNQVRfRkxBR1MgKFRJTUVfVElNRVZBUlNPTkxZfFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVR8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9OT01JTlVURVNPUlNFQ09ORFN8VElNRV9OT1NFQ09ORFN8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9OT1RJTUVNQVJLRVJ8TE9DQUxFX05PVVNFUk9WRVJSSURFKQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXIDxpbnRlcm5hbD4KICoKICogUGVyZm9ybXMgdGhlIGZvcm1hdHRpbmcgZm9yIEdldERhdGVGb3JtYXRXL0dldFRpbWVGb3JtYXRXLgogKgogKiBGSVhNRQogKiBEQVRFX1VTRV9BTFRfQ0FMRU5EQVIgICAgICAgICAgIC0gUmVxdWlyZXMgR2V0Q2FsZW5kYXJJbmZvIHRvIHdvcmsgZmlyc3QuCiAqIERBVEVfTFRSUkVBRElORy9EQVRFX1JUTFJFQURJTkcgLSBOb3QgeWV0IGltcGxlbWVudGVkLgogKi8Kc3RhdGljIElOVCBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNZU1RFTVRJTUUqIGxwVGltZSwgTFBDV1NUUiBscEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBscFN0ciwgSU5UIGNjaE91dCkKewogIGNvbnN0IE5MU19GT1JNQVRfTk9ERSAqbm9kZTsKICBTWVNURU1USU1FIHN0OwogIElOVCBjY2hXcml0dGVuID0gMDsKICBJTlQgbGFzdEZvcm1hdFBvcyA9IDA7CiAgQk9PTCBiU2tpcHBpbmcgPSBGQUxTRTsgLyogU2tpcHBpbmcgdGV4dCBhcm91bmQgbWFya2VyPyAqLwoKICAvKiBWZXJpZnkgb3VyIGFyZ3VtZW50cyAqLwogIGlmICgoY2NoT3V0ICYmICFscFN0cikgfHwgIShub2RlID0gTkxTX0dldEZvcm1hdHMobGNpZCwgZHdGbGFncykpKQogIHsKTkxTX0dldERhdGVUaW1lRm9ybWF0V19JbnZhbGlkUGFyYW1ldGVyOgogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKGR3RmxhZ3MgJiB+KERBVEVfREFURVZBUlNPTkxZfFRJTUVfVElNRVZBUlNPTkxZKSkKICB7CiAgICBpZiAobHBGb3JtYXQgJiYKICAgICAgICAoKGR3RmxhZ3MgJiBEQVRFX0RBVEVWQVJTT05MWSAmJiBkd0ZsYWdzICYgfkRBVEVfRk9STUFUX0ZMQUdTKSB8fAogICAgICAgICAoZHdGbGFncyAmIFRJTUVfVElNRVZBUlNPTkxZICYmIGR3RmxhZ3MgJiB+VElNRV9GT1JNQVRfRkxBR1MpKSkKICAgIHsKTkxTX0dldERhdGVUaW1lRm9ybWF0V19JbnZhbGlkRmxhZ3M6CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX0ZMQUdTKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKGR3RmxhZ3MgJiBEQVRFX0RBVEVWQVJTT05MWSkKICAgIHsKICAgICAgaWYgKChkd0ZsYWdzICYgKERBVEVfTFRSUkVBRElOR3xEQVRFX1JUTFJFQURJTkcpKSA9PSAoREFURV9MVFJSRUFESU5HfERBVEVfUlRMUkVBRElORykpCiAgICAgICAgZ290byBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX0ludmFsaWRGbGFnczsKICAgICAgZWxzZSBpZiAoZHdGbGFncyAmIChEQVRFX0xUUlJFQURJTkd8REFURV9SVExSRUFESU5HKSkKICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgZmxhZ3M6IERBVEVfTFRSUkVBRElORy9EQVRFX1JUTFJFQURJTkdcbiIpOwoKICAgICAgc3dpdGNoIChkd0ZsYWdzICYgKERBVEVfU0hPUlREQVRFfERBVEVfTE9OR0RBVEV8REFURV9ZRUFSTU9OVEgpKQogICAgICB7CiAgICAgIGNhc2UgMDoKICAgICAgICBicmVhazsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICBjYXNlIERBVEVfWUVBUk1PTlRIOgogICAgICAgIGlmIChscEZvcm1hdCkKICAgICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19JbnZhbGlkRmxhZ3M7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgZ290byBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX0ludmFsaWRGbGFnczsKICAgICAgfQogICAgfQogIH0KCiAgaWYgKCFscEZvcm1hdCkKICB7CiAgICAvKiBVc2UgdGhlIGFwcHJvcHJpYXRlIGRlZmF1bHQgZm9ybWF0ICovCiAgICBpZiAoZHdGbGFncyAmIERBVEVfREFURVZBUlNPTkxZKQogICAgewogICAgICBpZiAoZHdGbGFncyAmIERBVEVfWUVBUk1PTlRIKQogICAgICAgIGxwRm9ybWF0ID0gR2V0WWVhck1vbnRoKG5vZGUpOwogICAgICBlbHNlIGlmIChkd0ZsYWdzICYgREFURV9MT05HREFURSkKICAgICAgICBscEZvcm1hdCA9IEdldExvbmdEYXRlKG5vZGUpOwogICAgICBlbHNlCiAgICAgICAgbHBGb3JtYXQgPSBHZXRTaG9ydERhdGUobm9kZSk7CiAgICB9CiAgICBlbHNlCiAgICAgIGxwRm9ybWF0ID0gR2V0VGltZShub2RlKTsKICB9CgogIGlmICghbHBUaW1lKQogIHsKICAgIEdldExvY2FsVGltZSgmc3QpOyAvKiBEZWZhdWx0IHRvIGN1cnJlbnQgdGltZSAqLwogICAgbHBUaW1lID0gJnN0OwogIH0KICBlbHNlCiAgewogICAgaWYgKGR3RmxhZ3MgJiBEQVRFX0RBVEVWQVJTT05MWSkKICAgIHsKICAgICAgRklMRVRJTUUgZnRUbXA7CgogICAgICAvKiBWZXJpZnkgdGhlIGRhdGUgYW5kIGNvcnJlY3QgdGhlIEQuTy5XLiBpZiBuZWVkZWQgKi8KICAgICAgbWVtc2V0KCZzdCwgMCwgc2l6ZW9mKHN0KSk7CiAgICAgIHN0LndZZWFyID0gbHBUaW1lLT53WWVhcjsKICAgICAgc3Qud01vbnRoID0gbHBUaW1lLT53TW9udGg7CiAgICAgIHN0LndEYXkgPSBscFRpbWUtPndEYXk7CgogICAgICBpZiAoc3Qud0RheSA+IDMxIHx8IHN0LndNb250aCA+IDEyIHx8ICFTeXN0ZW1UaW1lVG9GaWxlVGltZSgmc3QsICZmdFRtcCkpCiAgICAgICAgZ290byBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX0ludmFsaWRQYXJhbWV0ZXI7CgogICAgICBGaWxlVGltZVRvU3lzdGVtVGltZSgmZnRUbXAsICZzdCk7CiAgICAgIGxwVGltZSA9ICZzdDsKICAgIH0KCiAgICBpZiAoZHdGbGFncyAmIFRJTUVfVElNRVZBUlNPTkxZKQogICAgewogICAgICAvKiBWZXJpZnkgdGhlIHRpbWUgKi8KICAgICAgaWYgKGxwVGltZS0+d0hvdXIgPiAyNCB8fCBscFRpbWUtPndNaW51dGUgPiA1OSB8fCBscFRpbWUtPndTZWNvbmQgPiA1OSkKICAgICAgICBnb3RvIE5MU19HZXREYXRlVGltZUZvcm1hdFdfSW52YWxpZFBhcmFtZXRlcjsKICAgIH0KICB9CgogIC8qIEZvcm1hdCB0aGUgb3V0cHV0ICovCiAgd2hpbGUgKCpscEZvcm1hdCkKICB7CiAgICBpZiAoSXNMaXRlcmFsTWFya2VyKCpscEZvcm1hdCkpCiAgICB7CiAgICAgIC8qIFN0YXJ0IG9mIGEgbGl0ZXJhbCBzdHJpbmcgKi8KICAgICAgbHBGb3JtYXQrKzsKCiAgICAgIC8qIExvb3AgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGl0ZXJhbCBtYXJrZXIgb3IgZW5kIG9mIHRoZSBzdHJpbmcgKi8KICAgICAgd2hpbGUgKCpscEZvcm1hdCkKICAgICAgewogICAgICAgIGlmIChJc0xpdGVyYWxNYXJrZXIoKmxwRm9ybWF0KSkKICAgICAgICB7CiAgICAgICAgICBscEZvcm1hdCsrOwogICAgICAgICAgaWYgKCFJc0xpdGVyYWxNYXJrZXIoKmxwRm9ybWF0KSkKICAgICAgICAgICAgYnJlYWs7IC8qIFRlcm1pbmF0aW5nIGxpdGVyYWwgbWFya2VyICovCiAgICAgICAgfQoKICAgICAgICBpZiAoIWNjaE91dCkKICAgICAgICAgIGNjaFdyaXR0ZW4rKzsgICAvKiBDb3VudCBzaXplIG9ubHkgKi8KICAgICAgICBlbHNlIGlmIChjY2hXcml0dGVuID49IGNjaE91dCkKICAgICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICAgICAgIGVsc2UgaWYgKCFiU2tpcHBpbmcpCiAgICAgICAgewogICAgICAgICAgbHBTdHJbY2NoV3JpdHRlbl0gPSAqbHBGb3JtYXQ7CiAgICAgICAgICBjY2hXcml0dGVuKys7CiAgICAgICAgfQogICAgICAgIGxwRm9ybWF0Kys7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKChkd0ZsYWdzICYgREFURV9EQVRFVkFSU09OTFkgJiYgSXNEYXRlRm10Q2hhcigqbHBGb3JtYXQpKSB8fAogICAgICAgICAgICAgKGR3RmxhZ3MgJiBUSU1FX1RJTUVWQVJTT05MWSAmJiBJc1RpbWVGbXRDaGFyKCpscEZvcm1hdCkpKQogICAgewogICAgICBjaGFyICBidWZmQVszMl07CiAgICAgIFdDSEFSIGJ1ZmZbMzJdLCBmbXRDaGFyOwogICAgICBMUENXU1RSIHN6QWRkID0gTlVMTDsKICAgICAgRFdPUkQgZHdWYWwgPSAwOwogICAgICBpbnQgICBjb3VudCA9IDAsIGR3TGVuOwoKICAgICAgYlNraXBwaW5nID0gRkFMU0U7CgogICAgICBmbXRDaGFyID0gKmxwRm9ybWF0OwogICAgICB3aGlsZSAoKmxwRm9ybWF0ID09IGZtdENoYXIpCiAgICAgIHsKICAgICAgICBjb3VudCsrOwogICAgICAgIGxwRm9ybWF0Kys7CiAgICAgIH0KICAgICAgYnVmZlswXSA9ICdcMCc7CgogICAgICBzd2l0Y2goZm10Q2hhcikKICAgICAgewogICAgICBjYXNlICdkJzoKICAgICAgICBpZiAoY291bnQgPj0gNCkKICAgICAgICAgIHN6QWRkID0gR2V0TG9uZ0RheShub2RlLCAobHBUaW1lLT53RGF5T2ZXZWVrICsgNikgJSA3KTsKICAgICAgICBlbHNlIGlmIChjb3VudCA9PSAzKQogICAgICAgICAgc3pBZGQgPSBHZXRTaG9ydERheShub2RlLCAobHBUaW1lLT53RGF5T2ZXZWVrICsgNikgJSA3KTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndEYXk7CiAgICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnTSc6CiAgICAgICAgaWYgKGNvdW50ID49IDQpCiAgICAgICAgICBzekFkZCA9IEdldExvbmdNb250aChub2RlLCBscFRpbWUtPndNb250aCAtIDEpOwogICAgICAgIGVsc2UgaWYgKGNvdW50ID09IDMpCiAgICAgICAgICBzekFkZCA9IEdldFNob3J0TW9udGgobm9kZSwgbHBUaW1lLT53TW9udGggLSAxKTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndNb250aDsKICAgICAgICAgIHN6QWRkID0gYnVmZjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICd5JzoKICAgICAgICBpZiAoY291bnQgPj0gNCkKICAgICAgICB7CiAgICAgICAgICBjb3VudCA9IDQ7CiAgICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d1llYXI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBjb3VudCA9IGNvdW50ID4gMiA/IDIgOiBjb3VudDsKICAgICAgICAgIGR3VmFsID0gbHBUaW1lLT53WWVhciAlIDEwMDsKICAgICAgICB9CiAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnZyc6CiAgICAgICAgaWYgKGNvdW50ID09IDIpCiAgICAgICAgewogICAgICAgICAgLyogRklYTUU6IE91ciBHZXRDYWxlbmRhckluZm8oKSBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBDQUxfU0VSQVNUUklORy4KICAgICAgICAgICAqICAgICAgICBXaGVuIGl0IGlzIGZpeGVkLCB0aGlzIHN0cmluZyBzaG91bGQgYmUgY2FjaGVkIGluICdub2RlJy4KICAgICAgICAgICAqLwogICAgICAgICAgRklYTUUoIlNob3VsZCBiZSB1c2luZyBHZXRDYWxlbmRhckluZm8oQ0FMX1NFUkFTVFJJTkcpLCBkZWZhdWx0aW5nIHRvICdBRCdcbiIpOwogICAgICAgICAgYnVmZlswXSA9ICdBJzsgYnVmZlsxXSA9ICdEJzsgYnVmZlsyXSA9ICdcMCc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBidWZmWzBdID0gJ2cnOyBidWZmWzFdID0gJ1wwJzsgLyogQWRkIGEgbGl0ZXJhbCAnZycgKi8KICAgICAgICB9CiAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnaCc6CiAgICAgICAgaWYgKCEoZHdGbGFncyAmIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQpKQogICAgICAgIHsKICAgICAgICAgIGNvdW50ID0gY291bnQgPiAyID8gMiA6IGNvdW50OwogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndIb3VyID09IDAgPyAxMiA6IChscFRpbWUtPndIb3VyIC0gMSkgJSAxMiArIDE7CiAgICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogLi4gZmFsbCB0aHJvdWdoIGlmIHdlIGFyZSBmb3JjZWQgdG8gb3V0cHV0IGluIDI0IGhvdXIgZm9ybWF0ICovCgogICAgICBjYXNlICdIJzoKICAgICAgICBjb3VudCA9IGNvdW50ID4gMiA/IDIgOiBjb3VudDsKICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d0hvdXI7CiAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnbSc6CiAgICAgICAgaWYgKGR3RmxhZ3MgJiBUSU1FX05PTUlOVVRFU09SU0VDT05EUykKICAgICAgICB7CiAgICAgICAgICBjY2hXcml0dGVuID0gbGFzdEZvcm1hdFBvczsgLyogU2tpcCAqLwogICAgICAgICAgYlNraXBwaW5nID0gVFJVRTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIGNvdW50ID0gY291bnQgPiAyID8gMiA6IGNvdW50OwogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndNaW51dGU7CiAgICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAncyc6CiAgICAgICAgaWYgKGR3RmxhZ3MgJiAoVElNRV9OT1NFQ09ORFN8VElNRV9OT01JTlVURVNPUlNFQ09ORFMpKQogICAgICAgIHsKICAgICAgICAgIGNjaFdyaXR0ZW4gPSBsYXN0Rm9ybWF0UG9zOyAvKiBTa2lwICovCiAgICAgICAgICBiU2tpcHBpbmcgPSBUUlVFOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgY291bnQgPSBjb3VudCA+IDIgPyAyIDogY291bnQ7CiAgICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d1NlY29uZDsKICAgICAgICAgIHN6QWRkID0gYnVmZjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICd0JzoKICAgICAgICBpZiAoZHdGbGFncyAmIFRJTUVfTk9USU1FTUFSS0VSKQogICAgICAgIHsKICAgICAgICAgIGNjaFdyaXR0ZW4gPSBsYXN0Rm9ybWF0UG9zOyAvKiBTa2lwICovCiAgICAgICAgICBiU2tpcHBpbmcgPSBUUlVFOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgaWYgKGNvdW50ID09IDEpCiAgICAgICAgICAgIHN6QWRkID0gbHBUaW1lLT53SG91ciA8IDEyID8gbm9kZS0+c3pTaG9ydEFNIDogbm9kZS0+c3pTaG9ydFBNOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBzekFkZCA9IGxwVGltZS0+d0hvdXIgPCAxMiA/IEdldEFNKG5vZGUpIDogR2V0UE0obm9kZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBpZiAoc3pBZGQgPT0gYnVmZiAmJiBidWZmWzBdID09ICdcMCcpCiAgICAgIHsKICAgICAgICAvKiBXZSBoYXZlIGEgbnVtZXJpYyB2YWx1ZSB0byBhZGQgKi8KICAgICAgICBzcHJpbnRmKGJ1ZmZBLCAiJS4qbGQiLCBjb3VudCwgZHdWYWwpOwogICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBidWZmQSwgLTEsIGJ1ZmYsIHNpemVvZihidWZmKS9zaXplb2YoV0NIQVIpKTsKICAgICAgfQoKICAgICAgZHdMZW4gPSBzekFkZCA/IHN0cmxlblcoc3pBZGQpIDogMDsKCiAgICAgIGlmIChjY2hPdXQgJiYgZHdMZW4pCiAgICAgIHsKICAgICAgICBpZiAoY2NoV3JpdHRlbiArIGR3TGVuIDwgY2NoT3V0KQogICAgICAgICAgbWVtY3B5KGxwU3RyICsgY2NoV3JpdHRlbiwgc3pBZGQsIGR3TGVuICogc2l6ZW9mKFdDSEFSKSk7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIG1lbWNweShscFN0ciArIGNjaFdyaXR0ZW4sIHN6QWRkLCAoY2NoT3V0IC0gY2NoV3JpdHRlbikgKiBzaXplb2YoV0NIQVIpKTsKICAgICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICAgICAgIH0KICAgICAgfQogICAgICBjY2hXcml0dGVuICs9IGR3TGVuOwogICAgICBsYXN0Rm9ybWF0UG9zID0gY2NoV3JpdHRlbjsgLyogU2F2ZSBwb3NpdGlvbiBvZiBsYXN0IG91dHB1dCBmb3JtYXQgdGV4dCAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBMaXRlcmFsIGNoYXJhY3RlciAqLwogICAgICBpZiAoIWNjaE91dCkKICAgICAgICBjY2hXcml0dGVuKys7ICAgLyogQ291bnQgc2l6ZSBvbmx5ICovCiAgICAgIGVsc2UgaWYgKGNjaFdyaXR0ZW4gPj0gY2NoT3V0KQogICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICAgICBlbHNlIGlmICghYlNraXBwaW5nIHx8ICpscEZvcm1hdCA9PSAnICcpCiAgICAgIHsKICAgICAgICBscFN0cltjY2hXcml0dGVuXSA9ICpscEZvcm1hdDsKICAgICAgICBjY2hXcml0dGVuKys7CiAgICAgIH0KICAgICAgbHBGb3JtYXQrKzsKICAgIH0KICB9CgogIC8qIEZpbmFsIHN0cmluZyB0ZXJtaW5hdG9yIGFuZCBzYW5pdHkgY2hlY2sgKi8KICBpZiAoY2NoT3V0KQogIHsKICAgaWYgKGNjaFdyaXR0ZW4gPj0gY2NoT3V0KQogICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICBlbHNlCiAgICAgbHBTdHJbY2NoV3JpdHRlbl0gPSAnXDAnOwogIH0KICBjY2hXcml0dGVuKys7IC8qIEluY2x1ZGUgdGVybWluYXRpbmcgTlVMICovCgogIFRSQUNFKCJyZXR1cm5pbmcgbGVuZ3RoPSVkLCBvdXB1dD0nJXMnXG4iLCBjY2hXcml0dGVuLCBkZWJ1Z3N0cl93KGxwU3RyKSk7CiAgcmV0dXJuIGNjaFdyaXR0ZW47CgpOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX092ZXJydW46CiAgVFJBQ0UoInJldHVybmluZyAwLCAoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUilcbiIpOwogIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRBIDxpbnRlcm5hbD4KICoKICogQVNDSUkgd3JhcHBlciBmb3IgR2V0RGF0ZUZvcm1hdEEvR2V0VGltZUZvcm1hdEEuCiAqLwpzdGF0aWMgSU5UIE5MU19HZXREYXRlVGltZUZvcm1hdEEoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1lTVEVNVElNRSogbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRm9ybWF0LCBMUFNUUiBscFN0ciwgSU5UIGNjaE91dCkKewogIERXT1JEIGNwID0gQ1BfQUNQOwogIFdDSEFSIHN6Rm9ybWF0WzEyOF0sIHN6T3V0WzEyOF07CiAgSU5UIGlSZXQ7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwgbGNpZCwgZHdGbGFncywgbHBUaW1lLAogICAgICAgIGRlYnVnc3RyX2EobHBGb3JtYXQpLCBscFN0ciwgY2NoT3V0KTsKCiAgaWYgKE5MU19Jc1VuaWNvZGVPbmx5TGNpZChsY2lkKSkKICB7CkdldERhdGVUaW1lRm9ybWF0QV9JbnZhbGlkUGFyYW1ldGVyOgogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCEoZHdGbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSkKICB7CiAgICBjb25zdCBOTFNfRk9STUFUX05PREUgKm5vZGUgPSBOTFNfR2V0Rm9ybWF0cyhsY2lkLCBkd0ZsYWdzKTsKICAgIGlmICghbm9kZSkKICAgICAgZ290byBHZXREYXRlVGltZUZvcm1hdEFfSW52YWxpZFBhcmFtZXRlcjsKICAgIGNwID0gbm9kZS0+ZHdDb2RlUGFnZTsKICB9CgogIGlmIChscEZvcm1hdCkKICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoY3AsIDAsIGxwRm9ybWF0LCAtMSwgc3pGb3JtYXQsIHNpemVvZihzekZvcm1hdCkvc2l6ZW9mKFdDSEFSKSk7CgogIGlmIChjY2hPdXQgPiAoaW50KShzaXplb2Yoc3pPdXQpL3NpemVvZihXQ0hBUikpKQogICAgY2NoT3V0ID0gc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpOwoKICBzek91dFswXSA9ICdcMCc7CgogIGlSZXQgPSBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXKGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwgbHBGb3JtYXQgPyBzekZvcm1hdCA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBTdHIgPyBzek91dCA6IE5VTEwsIGNjaE91dCk7CgogIGlmIChscFN0cikKICB7CiAgICBpZiAoc3pPdXRbMF0pCiAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoY3AsIDAsIHN6T3V0LCBpUmV0ID8gLTEgOiBjY2hPdXQsIGxwU3RyLCBjY2hPdXQsIDAsIDApOwogICAgZWxzZSBpZiAoY2NoT3V0ICYmIGlSZXQpCiAgICAgICpscFN0ciA9ICdcMCc7CiAgfQogIHJldHVybiBpUmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldERhdGVGb3JtYXRBIFtLRVJORUwzMi5AXQogKgogKiBGb3JtYXQgYSBkYXRlIGZvciBhIGdpdmVuIGxvY2FsZS4KICoKICogUEFSQU1TCiAqICBsY2lkICAgICAgW0ldIExvY2FsZSB0byBmb3JtYXQgZm9yCiAqICBkd0ZsYWdzICAgW0ldIExPQ0FMRV8gYW5kIERBVEVfIGZsYWdzIGZyb20gIndpbm5scy5oIgogKiAgbHBUaW1lICAgIFtJXSBEYXRlIHRvIGZvcm1hdAogKiAgbHBGb3JtYXQgIFtJXSBGb3JtYXQgc3RyaW5nLCBvciBOVUxMIHRvIHVzZSB0aGUgc3lzdGVtIGRlZmF1bHRzCiAqICBscERhdGVTdHIgW09dIERlc3RpbmF0aW9uIGZvciBmb3JtYXR0ZWQgc3RyaW5nCiAqICBjY2hPdXQgICAgW0ldIFNpemUgb2YgbHBEYXRlU3RyLCBvciAwIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0aW5nIHNpemUKICoKICogTk9URVMKICogIC0gSWYgbHBGb3JtYXQgaXMgTlVMTCwgbHBEYXRlU3RyIHdpbGwgYmUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgZm9ybWF0CiAqICAgIGRldGFpbHMgcmV0dXJuZWQgYnkgR2V0TG9jYWxlSW5mb0EoKSBhbmQgbW9kaWZpZWQgYnkgZHdGbGFncy4KICogIC0gbHBGb3JtYXQgaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyBhbmQgZm9ybWF0dGluZyB0b2tlbnMuIEFueSBjaGFyYWN0ZXJzCiAqICAgIGluIHRoZSBzdHJpbmcgYXJlIGNvcGllZCB2ZXJiYXRpbSB0byBscERhdGVTdHIsIHdpdGggdG9rZW5zIGJlaW5nIHJlcGxhY2VkCiAqICAgIGJ5IHRoZSBkYXRlIHZhbHVlcyB0aGV5IHJlcHJlc2VudC4KICogIC0gVGhlIGZvbGxvd2luZyB0b2tlbnMgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGluIGEgZGF0ZSBmb3JtYXQgc3RyaW5nOgogKnwgIFRva2VuICBNZWFuaW5nCiAqfCAgLS0tLS0gIC0tLS0tLS0KICp8ICBkICAgICAgU2luZ2xlIGRpZ2l0IGRheSBvZiB0aGUgbW9udGggKG5vIGxlYWRpbmcgMCkKICp8ICBkZCAgICAgRG91YmxlIGRpZ2l0IGRheSBvZiB0aGUgbW9udGgKICp8ICBkZGQgICAgU2hvcnQgbmFtZSBmb3IgdGhlIGRheSBvZiB0aGUgd2VlawogKnwgIGRkZGQgICBMb25nIG5hbWUgZm9yIHRoZSBkYXkgb2YgdGhlIHdlZWsKICp8ICBNICAgICAgU2luZ2xlIGRpZ2l0IG1vbnRoIG9mIHRoZSB5ZWFyIChubyBsZWFkaW5nIDApCiAqfCAgTU0gICAgIERvdWJsZSBkaWdpdCBtb250aCBvZiB0aGUgeWVhcgogKnwgIE1NTSAgICBTaG9ydCBuYW1lIGZvciB0aGUgbW9udGggb2YgdGhlIHllYXIKICp8ICBNTU1NICAgTG9uZyBuYW1lIGZvciB0aGUgbW9udGggb2YgdGhlIHllYXIKICp8ICB5ICAgICAgRG91YmxlIGRpZ2l0IHllYXIgbnVtYmVyIChubyBsZWFkaW5nIDApCiAqfCAgeXkgICAgIERvdWJsZSBkaWdpdCB5ZWFyIG51bWJlcgogKnwgIHl5eXkgICBGb3VyIGRpZ2l0IHllYXIgbnVtYmVyCiAqfCAgZ2cgICAgIEVyYSBzdHJpbmcsIGZvciBleGFtcGxlICdBRCcuCiAqICAtIFRvIG91dHB1dCBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgdGhhdCBjb3VsZCBiZSBtaXNpZGVudGlmaWVkIGFzIGEgdG9rZW4sCiAqICAgIGVuY2xvc2UgaXQgaW4gc2luZ2xlIHF1b3Rlcy4KICogIC0gVGhlIEFzY2lpIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBmYWlscyBpZiBsY2lkIGlzIFVuaWNvZGUgb25seS4KICoKICogUkVUVVJOUwogKiAgU3VjY2VzczogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgd3JpdHRlbiB0byBscERhdGVTdHIsIG9yIHRoYXQgd291bGQKICogICAgICAgICAgIGhhdmUgYmVlbiB3cml0dGVuLCBpZiBjY2hPdXQgaXMgMC4KICogIEZhaWx1cmU6IDAuIFVzZSBHZXRMYXN0RXJyb3IoKSB0byBkZXRlcm1pbmUgdGhlIGNhdXNlLgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0QSggTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLCBjb25zdCBTWVNURU1USU1FKiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscEZvcm1hdCwgTFBTVFIgbHBEYXRlU3RyLCBJTlQgY2NoT3V0KQp7CiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwKICAgICAgICBkZWJ1Z3N0cl9hKGxwRm9ybWF0KSwgbHBEYXRlU3RyLCBjY2hPdXQpOwoKICByZXR1cm4gTkxTX0dldERhdGVUaW1lRm9ybWF0QShsY2lkLCBkd0ZsYWdzIHwgREFURV9EQVRFVkFSU09OTFksIGxwVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEZvcm1hdCwgbHBEYXRlU3RyLCBjY2hPdXQpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXREYXRlRm9ybWF0VwlbS0VSTkVMMzIuQF0KICoKICogU2VlIEdldERhdGVGb3JtYXRBLgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0VyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MsIGNvbnN0IFNZU1RFTVRJTUUqIGxwVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwRm9ybWF0LCBMUFdTVFIgbHBEYXRlU3RyLCBJTlQgY2NoT3V0KQp7CiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLCBsY2lkLCBkd0ZsYWdzLCBscFRpbWUsCiAgICAgICAgZGVidWdzdHJfdyhscEZvcm1hdCksIGxwRGF0ZVN0ciwgY2NoT3V0KTsKCiAgcmV0dXJuIE5MU19HZXREYXRlVGltZUZvcm1hdFcobGNpZCwgZHdGbGFnc3xEQVRFX0RBVEVWQVJTT05MWSwgbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRm9ybWF0LCBscERhdGVTdHIsIGNjaE91dCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXRBCVtLRVJORUwzMi5AXQogKgogKiBGb3JtYXQgYSB0aW1lIGZvciBhIGdpdmVuIGxvY2FsZS4KICoKICogUEFSQU1TCiAqICBsY2lkICAgICAgW0ldIExvY2FsZSB0byBmb3JtYXQgZm9yCiAqICBkd0ZsYWdzICAgW0ldIExPQ0FMRV8gYW5kIFRJTUVfIGZsYWdzIGZyb20gIndpbm5scy5oIgogKiAgbHBUaW1lICAgIFtJXSBUaW1lIHRvIGZvcm1hdAogKiAgbHBGb3JtYXQgIFtJXSBGb3JtYXR0aW5nIG92ZXJyaWRlcwogKiAgbHBUaW1lU3RyIFtPXSBEZXN0aW5hdGlvbiBmb3IgZm9ybWF0dGVkIHN0cmluZwogKiAgY2NoT3V0ICAgIFtJXSBTaXplIG9mIGxwVGltZVN0ciwgb3IgMCB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzaXplCiAqCiAqIE5PVEVTCiAqICAtIElmIGxwRm9ybWF0IGlzIE5VTEwsIGxwc3pWYWx1ZSB3aWxsIGJlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdAogKiAgICBkZXRhaWxzIHJldHVybmVkIGJ5IEdldExvY2FsZUluZm9BKCkgYW5kIG1vZGlmaWVkIGJ5IGR3RmxhZ3MuCiAqICAtIGxwRm9ybWF0IGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgYW5kIGZvcm1hdHRpbmcgdG9rZW5zLiBBbnkgY2hhcmFjdGVycwogKiAgICBpbiB0aGUgc3RyaW5nIGFyZSBjb3BpZWQgdmVyYmF0aW0gdG8gbHBUaW1lU3RyLCB3aXRoIHRva2VucyBiZWluZyByZXBsYWNlZAogKiAgICBieSB0aGUgdGltZSB2YWx1ZXMgdGhleSByZXByZXNlbnQuCiAqICAtIFRoZSBmb2xsb3dpbmcgdG9rZW5zIGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBpbiBhIHRpbWUgZm9ybWF0IHN0cmluZzoKICp8ICBUb2tlbiAgTWVhbmluZwogKnwgIC0tLS0tICAtLS0tLS0tCiAqfCAgaCAgICAgIEhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyIGNsb2NrKQogKnwgIGhoICAgICBIb3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cyAoMTItaG91ciBjbG9jaykKICp8ICBIICAgICAgSG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIgY2xvY2spCiAqfCAgSEggICAgIEhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzICgyNC1ob3VyIGNsb2NrKQogKnwgIG0gICAgICBNaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqfCAgbW0gICAgIE1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICp8ICBzICAgICAgU2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKnwgIHNzICAgICBTZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqfCAgdCAgICAgIFNob3J0IHRpbWUgbWFya2VyIChlLmcuICJBIiBvciAiUCIpCiAqfCAgdHQgICAgIExvbmcgdGltZSBtYXJrZXIgKGUuZy4gIkFNIiwgIlBNIikKICogIC0gVG8gb3V0cHV0IGFueSBsaXRlcmFsIGNoYXJhY3RlciB0aGF0IGNvdWxkIGJlIG1pc2lkZW50aWZpZWQgYXMgYSB0b2tlbiwKICogICAgZW5jbG9zZSBpdCBpbiBzaW5nbGUgcXVvdGVzLgogKiAgLSBUaGUgQXNjaWkgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGZhaWxzIGlmIGxjaWQgaXMgVW5pY29kZSBvbmx5LgogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlciB3cml0dGVuIHRvIGxwVGltZVN0ciwgb3IgdGhhdCB3b3VsZAogKiAgICAgICAgICAgaGF2ZSBiZWVuIHdyaXR0ZW4sIGlmIGNjaE91dCBpcyAwLgogKiAgRmFpbHVyZTogMC4gVXNlIEdldExhc3RFcnJvcigpIHRvIGRldGVybWluZSB0aGUgY2F1c2UuCiAqLwpJTlQgV0lOQVBJIEdldFRpbWVGb3JtYXRBKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywgY29uc3QgU1lTVEVNVElNRSogbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscEZvcm1hdCwgTFBTVFIgbHBUaW1lU3RyLCBJTlQgY2NoT3V0KQp7CiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwKICAgICAgICBkZWJ1Z3N0cl9hKGxwRm9ybWF0KSwgbHBUaW1lU3RyLCBjY2hPdXQpOwoKICByZXR1cm4gTkxTX0dldERhdGVUaW1lRm9ybWF0QShsY2lkLCBkd0ZsYWdzfFRJTUVfVElNRVZBUlNPTkxZLCBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBGb3JtYXQsIGxwVGltZVN0ciwgY2NoT3V0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdFcJW0tFUk5FTDMyLkBdCiAqCiAqIFNlZSBHZXRUaW1lRm9ybWF0QS4KICovCklOVCBXSU5BUEkgR2V0VGltZUZvcm1hdFcoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLCBjb25zdCBTWVNURU1USU1FKiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBscEZvcm1hdCwgTFBXU1RSIGxwVGltZVN0ciwgSU5UIGNjaE91dCkKewogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsY2lkLCBkd0ZsYWdzLCBscFRpbWUsCiAgICAgICAgZGVidWdzdHJfdyhscEZvcm1hdCksIGxwVGltZVN0ciwgY2NoT3V0KTsKCiAgcmV0dXJuIE5MU19HZXREYXRlVGltZUZvcm1hdFcobGNpZCwgZHdGbGFnc3xUSU1FX1RJTUVWQVJTT05MWSwgbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRm9ybWF0LCBscFRpbWVTdHIsIGNjaE91dCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0QQkoS0VSTkVMMzIuQCkKICoKICogRm9ybWF0IGEgbnVtYmVyIHN0cmluZyBmb3IgYSBnaXZlbiBsb2NhbGUuCiAqCiAqIFBBUkFNUwogKiAgbGNpZCAgICAgICAgW0ldIExvY2FsZSB0byBmb3JtYXQgZm9yCiAqICBkd0ZsYWdzICAgICBbSV0gTE9DQUxFXyBmbGFncyBmcm9tICJ3aW5ubHMuaCIKICogIGxwc3pWYWx1ZSAgIFtJXSBTdHJpbmcgdG8gZm9ybWF0CiAqICBscEZvcm1hdCAgICBbSV0gRm9ybWF0dGluZyBvdmVycmlkZXMKICogIGxwTnVtYmVyU3RyIFtPXSBEZXN0aW5hdGlvbiBmb3IgZm9ybWF0dGVkIHN0cmluZwogKiAgY2NoT3V0ICAgICAgW0ldIFNpemUgb2YgbHBOdW1iZXJTdHIsIG9yIDAgdG8gY2FsY3VsYXRlIHRoZSByZXN1bHRpbmcgc2l6ZQogKgogKiBOT1RFUwogKiAgLSBscHN6VmFsdWUgY2FuIGNvbnRhaW4gb25seSAnMCcgLSAnOScsICctJyBhbmQgJy4nLgogKiAgLSBJZiBscEZvcm1hdCBpcyBub24tTlVMTCwgZHdGbGFncyBtdXN0IGJlIDAuIEluIHRoaXMgY2FzZSBscHN6VmFsdWUgd2lsbAogKiAgICBiZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgZGV0YWlscyByZXR1cm5lZCBieSBHZXRMb2NhbGVJbmZvQSgpLgogKiAgLSBUaGlzIGZ1bmN0aW9uIHJvdW5kcyB0aGUgbnVtYmVyIHN0cmluZyBpZiB0aGUgbnVtYmVyIG9mIGRlY2ltYWxzIGV4Y2VlZHMgdGhlCiAqICAgIGxvY2FsZXMgbm9ybWFsIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy4KICogIC0gSWYgY2NoT3V0IGlzIDAsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgd3JpdGUgdG8gbHBOdW1iZXJTdHIuCiAqICAtIFRoZSBBc2NpaSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gZmFpbHMgaWYgbGNpZCBpcyBVbmljb2RlIG9ubHkuCiAqCiAqIFJFVFVSTlMKICogIFN1Y2Nlc3M6IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIHdyaXR0ZW4gdG8gbHBOdW1iZXJTdHIsIG9yIHRoYXQgd291bGQKICogICAgICAgICAgIGhhdmUgYmVlbiB3cml0dGVuLCBpZiBjY2hPdXQgaXMgMC4KICogIEZhaWx1cmU6IDAuIFVzZSBHZXRMYXN0RXJyb3IoKSB0byBkZXRlcm1pbmUgdGhlIGNhdXNlLgogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRBKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscHN6VmFsdWUsICBjb25zdCBOVU1CRVJGTVRBICpscEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoT3V0KQp7CiAgRFdPUkQgY3AgPSBDUF9BQ1A7CiAgV0NIQVIgc3pEZWNbOF0sIHN6R3JwWzhdLCBzekluWzEyOF0sIHN6T3V0WzEyOF07CiAgTlVNQkVSRk1UVyBmbXQ7CiAgY29uc3QgTlVNQkVSRk1UVyAqcGZtdCA9IE5VTEw7CiAgSU5UIGlSZXQ7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVzLCVwLCVwLCVkKVxuIiwgbGNpZCwgZHdGbGFncywgZGVidWdzdHJfYShscHN6VmFsdWUpLAogICAgICAgIGxwRm9ybWF0LCBscE51bWJlclN0ciwgY2NoT3V0KTsKCiAgaWYgKE5MU19Jc1VuaWNvZGVPbmx5TGNpZChsY2lkKSkKICB7CkdldE51bWJlckZvcm1hdEFfSW52YWxpZFBhcmFtZXRlcjoKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmICghKGR3RmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCkpCiAgewogICAgY29uc3QgTkxTX0ZPUk1BVF9OT0RFICpub2RlID0gTkxTX0dldEZvcm1hdHMobGNpZCwgZHdGbGFncyk7CiAgICBpZiAoIW5vZGUpCiAgICAgIGdvdG8gR2V0TnVtYmVyRm9ybWF0QV9JbnZhbGlkUGFyYW1ldGVyOwogICAgY3AgPSBub2RlLT5kd0NvZGVQYWdlOwogIH0KCiAgaWYgKGxwRm9ybWF0KQogIHsKICAgIG1lbWNweSgmZm10LCBscEZvcm1hdCwgc2l6ZW9mKGZtdCkpOwogICAgcGZtdCA9ICZmbXQ7CiAgICBpZiAobHBGb3JtYXQtPmxwRGVjaW1hbFNlcCkKICAgIHsKICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCwgLTEsIHN6RGVjLCBzaXplb2Yoc3pEZWMpL3NpemVvZihXQ0hBUikpOwogICAgICBmbXQubHBEZWNpbWFsU2VwID0gc3pEZWM7CiAgICB9CiAgICBpZiAobHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApCiAgICB7CiAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoY3AsIDAsIGxwRm9ybWF0LT5scFRob3VzYW5kU2VwLCAtMSwgc3pHcnAsIHNpemVvZihzekdycCkvc2l6ZW9mKFdDSEFSKSk7CiAgICAgIGZtdC5scFRob3VzYW5kU2VwID0gc3pHcnA7CiAgICB9CiAgfQoKICBpZiAobHBzelZhbHVlKQogICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBzelZhbHVlLCAtMSwgc3pJbiwgc2l6ZW9mKHN6SW4pL3NpemVvZihXQ0hBUikpOwoKICBpZiAoY2NoT3V0ID4gKGludCkoc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpKSkKICAgIGNjaE91dCA9IHNpemVvZihzek91dCkvc2l6ZW9mKFdDSEFSKTsKCiAgc3pPdXRbMF0gPSAnXDAnOwoKICBpUmV0ID0gR2V0TnVtYmVyRm9ybWF0VyhsY2lkLCBkd0ZsYWdzLCBscHN6VmFsdWUgPyBzekluIDogTlVMTCwgcGZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBscE51bWJlclN0ciA/IHN6T3V0IDogTlVMTCwgY2NoT3V0KTsKCiAgaWYgKHN6T3V0WzBdICYmIGxwTnVtYmVyU3RyKQogICAgV2lkZUNoYXJUb011bHRpQnl0ZShjcCwgMCwgc3pPdXQsIC0xLCBscE51bWJlclN0ciwgY2NoT3V0LCAwLCAwKTsKICByZXR1cm4gaVJldDsKfQoKLyogTnVtYmVyIHBhcnNpbmcgc3RhdGUgZmxhZ3MgKi8KI2RlZmluZSBORl9JU05FR0FUSVZFIDB4MSAgLyogJy0nIGZvdW5kICovCiNkZWZpbmUgTkZfSVNSRUFMICAgICAweDIgIC8qICcuJyBmb3VuZCAqLwojZGVmaW5lIE5GX0RJR0lUUyAgICAgMHg0ICAvKiAnMCctJzknIGZvdW5kICovCiNkZWZpbmUgTkZfRElHSVRTX09VVCAweDggIC8qIERpZ2l0cyBiZWZvcmUgdGhlICcuJyBmb3VuZCAqLwojZGVmaW5lIE5GX1JPVU5EICAgICAgMHgxMCAvKiBOdW1iZXIgbmVlZHMgdG8gYmUgcm91bmRlZCAqLwoKLyogRm9ybWF0dGluZyBvcHRpb25zIGZvciBOdW1iZXJzICovCiNkZWZpbmUgTkxTX05FR19QQVJFTlMgICAgICAwIC8qICIoMS4xKSIgKi8KI2RlZmluZSBOTFNfTkVHX0xFRlQgICAgICAgIDEgLyogIi0xLjEiICAqLwojZGVmaW5lIE5MU19ORUdfTEVGVF9TUEFDRSAgMiAvKiAiLSAxLjEiICovCiNkZWZpbmUgTkxTX05FR19SSUdIVCAgICAgICAzIC8qICIxLjEtIiAgKi8KI2RlZmluZSBOTFNfTkVHX1JJR0hUX1NQQUNFIDQgLyogIjEuMSAtIiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXRXCShLRVJORUwzMi5AKQogKgogKiBTZWUgR2V0TnVtYmVyRm9ybWF0QS4KICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0VyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwc3pWYWx1ZSwgIGNvbnN0IE5VTUJFUkZNVFcgKmxwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoT3V0KQp7CiAgV0NIQVIgc3pCdWZmWzEyOF0sICpzek91dCA9IHN6QnVmZiArIHNpemVvZihzekJ1ZmYpIC8gc2l6ZW9mKFdDSEFSKSAtIDE7CiAgV0NIQVIgc3pOZWdCdWZmWzhdOwogIGNvbnN0IFdDSEFSICpscHN6TmVnID0gTlVMTCwgKmxwc3pOZWdTdGFydCwgKnN6U3JjOwogIERXT1JEIGR3U3RhdGUgPSAwLCBkd0RlY2ltYWxzID0gMCwgZHdHcm91cENvdW50ID0gMCwgZHdDdXJyZW50R3JvdXBDb3VudCA9IDA7CiAgSU5UIGlSZXQ7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVzLCVwLCVwLCVkKVxuIiwgbGNpZCwgZHdGbGFncywgZGVidWdzdHJfdyhscHN6VmFsdWUpLAogICAgICAgIGxwRm9ybWF0LCBscE51bWJlclN0ciwgY2NoT3V0KTsKCiAgaWYgKCFscHN6VmFsdWUgfHwgY2NoT3V0IDwgMCB8fCAoY2NoT3V0ID4gMCAmJiAhbHBOdW1iZXJTdHIpIHx8CiAgICAgICFJc1ZhbGlkTG9jYWxlKGxjaWQsIDApIHx8CiAgICAgIChscEZvcm1hdCAmJiAoZHdGbGFncyB8fCAhbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCB8fCAhbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApKSkKICB7CkdldE51bWJlckZvcm1hdFdfRXJyb3I6CiAgICBTZXRMYXN0RXJyb3IobHBGb3JtYXQgJiYgZHdGbGFncyA/IEVSUk9SX0lOVkFMSURfRkxBR1MgOiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmICghbHBGb3JtYXQpCiAgewogICAgY29uc3QgTkxTX0ZPUk1BVF9OT0RFICpub2RlID0gTkxTX0dldEZvcm1hdHMobGNpZCwgZHdGbGFncyk7CgogICAgaWYgKCFub2RlKQogICAgICBnb3RvIEdldE51bWJlckZvcm1hdFdfRXJyb3I7CiAgICBscEZvcm1hdCA9ICZub2RlLT5mbXQ7CiAgICBscHN6TmVnU3RhcnQgPSBscHN6TmVnID0gR2V0TmVnYXRpdmUobm9kZSk7CiAgfQogIGVsc2UKICB7CiAgICBHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU05FR0FUSVZFU0lHTnwoZHdGbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSksCiAgICAgICAgICAgICAgICAgICBzek5lZ0J1ZmYsIHNpemVvZihzek5lZ0J1ZmYpL3NpemVvZihXQ0hBUikpOwogICAgbHBzek5lZ1N0YXJ0ID0gbHBzek5lZyA9IHN6TmVnQnVmZjsKICB9CiAgbHBzek5lZyA9IGxwc3pOZWcgKyBzdHJsZW5XKGxwc3pOZWcpIC0gMTsKCiAgZHdGbGFncyAmPSAoTE9DQUxFX05PVVNFUk9WRVJSSURFfExPQ0FMRV9VU0VfQ1BfQUNQKTsKCiAgLyogRm9ybWF0IHRoZSBudW1iZXIgYmFja3dhcmRzIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyICovCgogIHN6U3JjID0gbHBzelZhbHVlOwogICpzek91dC0tID0gJ1wwJzsKCiAgLyogQ2hlY2sgdGhlIG51bWJlciBmb3IgdmFsaWRpdHkgKi8KICB3aGlsZSAoKnN6U3JjKQogIHsKICAgIGlmICgqc3pTcmMgPj0gJzAnICYmICpzelNyYyA8PSAnOScpCiAgICB7CiAgICAgIGR3U3RhdGUgfD0gTkZfRElHSVRTOwogICAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgICAgICBkd0RlY2ltYWxzKys7CiAgICB9CiAgICBlbHNlIGlmICgqc3pTcmMgPT0gJy0nKQogICAgewogICAgICBpZiAoZHdTdGF0ZSkKICAgICAgICBnb3RvIEdldE51bWJlckZvcm1hdFdfRXJyb3I7IC8qICctJyBub3QgZmlyc3QgY2hhcmFjdGVyICovCiAgICAgIGR3U3RhdGUgfD0gTkZfSVNORUdBVElWRTsKICAgIH0KICAgIGVsc2UgaWYgKCpzelNyYyA9PSAnLicpCiAgICB7CiAgICAgIGlmIChkd1N0YXRlICYgTkZfSVNSRUFMKQogICAgICAgIGdvdG8gR2V0TnVtYmVyRm9ybWF0V19FcnJvcjsgLyogTW9yZSB0aGFuIG9uZSAnLicgKi8KICAgICAgZHdTdGF0ZSB8PSBORl9JU1JFQUw7CiAgICB9CiAgICBlbHNlCiAgICAgIGdvdG8gR2V0TnVtYmVyRm9ybWF0V19FcnJvcjsgLyogSW52YWxpZCBjaGFyICovCiAgICBzelNyYysrOwogIH0KICBzelNyYy0tOyAvKiBQb2ludCB0byBsYXN0IGNoYXJhY3RlciAqLwoKICBpZiAoIShkd1N0YXRlICYgTkZfRElHSVRTKSkKICAgIGdvdG8gR2V0TnVtYmVyRm9ybWF0V19FcnJvcjsgLyogTm8gZGlnaXRzICovCgogIC8qIEFkZCBhbnkgdHJhaWxpbmcgbmVnYXRpdmUgc2lnbiAqLwogIGlmIChkd1N0YXRlICYgTkZfSVNORUdBVElWRSkKICB7CiAgICBzd2l0Y2ggKGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyKQogICAgewogICAgY2FzZSBOTFNfTkVHX1BBUkVOUzoKICAgICAgKnN6T3V0LS0gPSAnKSc7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOTFNfTkVHX1JJR0hUOgogICAgY2FzZSBOTFNfTkVHX1JJR0hUX1NQQUNFOgogICAgICB3aGlsZSAobHBzek5lZyA+PSBscHN6TmVnU3RhcnQpCiAgICAgICAgKnN6T3V0LS0gPSAqbHBzek5lZy0tOwogICAgIGlmIChscEZvcm1hdC0+TmVnYXRpdmVPcmRlciA9PSBOTFNfTkVHX1JJR0hUX1NQQUNFKQogICAgICAgKnN6T3V0LS0gPSAnICc7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgLyogQ29weSBhbGwgZGlnaXRzIHVwIHRvIHRoZSBkZWNpbWFsIHBvaW50ICovCiAgaWYgKCFscEZvcm1hdC0+TnVtRGlnaXRzKQogIHsKICAgIGlmIChkd1N0YXRlICYgTkZfSVNSRUFMKQogICAgewogICAgICB3aGlsZSAoKnN6U3JjICE9ICcuJykgLyogRG9uJ3Qgd3JpdGUgYW55IGRlY2ltYWxzIG9yIGEgc2VwYXJhdG9yICovCiAgICAgIHsKICAgICAgICBpZiAoKnN6U3JjID49ICc1JyB8fCAoKnN6U3JjID09ICc0JyAmJiAoZHdTdGF0ZSAmIE5GX1JPVU5EKSkpCiAgICAgICAgICBkd1N0YXRlIHw9IE5GX1JPVU5EOwogICAgICAgIGVsc2UKICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgIHN6U3JjLS07CiAgICAgIH0KICAgICAgc3pTcmMtLTsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIExQV1NUUiBscHN6RGVjID0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCArIHN0cmxlblcobHBGb3JtYXQtPmxwRGVjaW1hbFNlcCkgLSAxOwoKICAgIGlmIChkd0RlY2ltYWxzIDw9IGxwRm9ybWF0LT5OdW1EaWdpdHMpCiAgICB7CiAgICAgIGR3RGVjaW1hbHMgPSBscEZvcm1hdC0+TnVtRGlnaXRzIC0gZHdEZWNpbWFsczsKICAgICAgd2hpbGUgKGR3RGVjaW1hbHMtLSkKICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogUGFkIHRvIGNvcnJlY3QgbnVtYmVyIG9mIGRwICovCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGR3RGVjaW1hbHMgLT0gbHBGb3JtYXQtPk51bURpZ2l0czsKICAgICAgLyogU2tpcCBleGNlc3MgZGVjaW1hbHMsIGFuZCBkZXRlcm1pbmUgaWYgd2UgaGF2ZSB0byByb3VuZCB0aGUgbnVtYmVyICovCiAgICAgIHdoaWxlIChkd0RlY2ltYWxzLS0pCiAgICAgIHsKICAgICAgICBpZiAoKnN6U3JjID49ICc1JyB8fCAoKnN6U3JjID09ICc0JyAmJiAoZHdTdGF0ZSAmIE5GX1JPVU5EKSkpCiAgICAgICAgICBkd1N0YXRlIHw9IE5GX1JPVU5EOwogICAgICAgIGVsc2UKICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgIHN6U3JjLS07CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgIHsKICAgICAgd2hpbGUgKCpzelNyYyAhPSAnLicpCiAgICAgIHsKICAgICAgICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogICAgICAgIHsKICAgICAgICAgIGlmICgqc3pTcmMgPT0gJzknKQogICAgICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogY29udGludWUgcm91bmRpbmcgKi8KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgZHdTdGF0ZSAmPSB+TkZfUk9VTkQ7CiAgICAgICAgICAgICpzek91dC0tID0gKCpzelNyYykrMTsKICAgICAgICAgIH0KICAgICAgICAgIHN6U3JjLS07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICpzek91dC0tID0gKnN6U3JjLS07IC8qIFdyaXRlIGV4aXN0aW5nIGRlY2ltYWxzICovCiAgICAgIH0KICAgICAgc3pTcmMtLTsgLyogU2tpcCAnLicgKi8KICAgIH0KCiAgICB3aGlsZSAobHBzekRlYyA+PSBscEZvcm1hdC0+bHBEZWNpbWFsU2VwKQogICAgICAqc3pPdXQtLSA9ICpscHN6RGVjLS07IC8qIFdyaXRlIGRlY2ltYWwgc2VwYXJhdG9yICovCiAgfQoKICBkd0dyb3VwQ291bnQgPSBscEZvcm1hdC0+R3JvdXBpbmcgPT0gMzIgPyAzIDogbHBGb3JtYXQtPkdyb3VwaW5nOwoKICAvKiBXcml0ZSB0aGUgcmVtYWluaW5nIHdob2xlIG51bWJlciBkaWdpdHMsIGluY2x1ZGluZyBncm91cGluZyBjaGFycyAqLwogIHdoaWxlIChzelNyYyA+PSBscHN6VmFsdWUgJiYgKnN6U3JjID49ICcwJyAmJiAqc3pTcmMgPD0gJzknKQogIHsKICAgIGlmIChkd1N0YXRlICYgTkZfUk9VTkQpCiAgICB7CiAgICAgIGlmICgqc3pTcmMgPT0gJzknKQogICAgICAgICpzek91dC0tID0gJzAnOyAvKiBjb250aW51ZSByb3VuZGluZyAqLwogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBkd1N0YXRlICY9IH5ORl9ST1VORDsKICAgICAgICAqc3pPdXQtLSA9ICgqc3pTcmMpKzE7CiAgICAgIH0KICAgICAgc3pTcmMtLTsKICAgIH0KICAgIGVsc2UKICAgICAgKnN6T3V0LS0gPSAqc3pTcmMtLTsKCiAgICBkd1N0YXRlIHw9IE5GX0RJR0lUU19PVVQ7CiAgICBkd0N1cnJlbnRHcm91cENvdW50Kys7CiAgICBpZiAoc3pTcmMgPj0gbHBzelZhbHVlICYmIGR3Q3VycmVudEdyb3VwQ291bnQgPT0gZHdHcm91cENvdW50ICYmICpzelNyYyAhPSAnLScpCiAgICB7CiAgICAgIExQV1NUUiBscHN6R3JwID0gbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXAgKyBzdHJsZW5XKGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKSAtIDE7CgogICAgICB3aGlsZSAobHBzekdycCA+PSBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6R3JwLS07IC8qIFdyaXRlIGdyb3VwaW5nIGNoYXIgKi8KCiAgICAgIGR3Q3VycmVudEdyb3VwQ291bnQgPSAwOwogICAgICBpZiAobHBGb3JtYXQtPkdyb3VwaW5nID09IDMyKQogICAgICAgIGR3R3JvdXBDb3VudCA9IDI7IC8qIEluZGljIGdyb3VwaW5nOiAzIHRoZW4gMiAqLwogICAgfQogIH0KICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogIHsKICAgICpzek91dC0tID0gJzEnOyAvKiBlLmcuIC42ID4gMS4wICovCiAgfQogIGVsc2UgaWYgKCEoZHdTdGF0ZSAmIE5GX0RJR0lUU19PVVQpICYmIGxwRm9ybWF0LT5MZWFkaW5nWmVybykKICAgICpzek91dC0tID0gJzAnOyAvKiBBZGQgbGVhZGluZyAwIGlmIHdlIGhhdmUgbm8gZGlnaXRzIGJlZm9yZSB0aGUgZGVjaW1hbCBwb2ludCAqLwoKICAvKiBBZGQgYW55IGxlYWRpbmcgbmVnYXRpdmUgc2lnbiAqLwogIGlmIChkd1N0YXRlICYgTkZfSVNORUdBVElWRSkKICB7CiAgICBzd2l0Y2ggKGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyKQogICAgewogICAgY2FzZSBOTFNfTkVHX1BBUkVOUzoKICAgICAgKnN6T3V0LS0gPSAnKCc7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOTFNfTkVHX0xFRlRfU1BBQ0U6CiAgICAgICpzek91dC0tID0gJyAnOwogICAgICAvKiBGYWxsIHRocm91Z2ggKi8KICAgIGNhc2UgTkxTX05FR19MRUZUOgogICAgICB3aGlsZSAobHBzek5lZyA+PSBscHN6TmVnU3RhcnQpCiAgICAgICAgKnN6T3V0LS0gPSAqbHBzek5lZy0tOwogICAgICBicmVhazsKICAgIH0KICB9CiAgc3pPdXQrKzsKCiAgaVJldCA9IHN0cmxlblcoc3pPdXQpICsgMTsKICBpZiAoY2NoT3V0KQogIHsKICAgIGlmIChpUmV0IDw9IGNjaE91dCkKICAgICAgbWVtY3B5KGxwTnVtYmVyU3RyLCBzek91dCwgaVJldCAqIHNpemVvZihXQ0hBUikpOwogICAgZWxzZQogICAgewogICAgICBtZW1jcHkobHBOdW1iZXJTdHIsIHN6T3V0LCBjY2hPdXQgKiBzaXplb2YoV0NIQVIpKTsKICAgICAgbHBOdW1iZXJTdHJbY2NoT3V0IC0gMV0gPSAnXDAnOwogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIGlSZXQgPSAwOwogICAgfQogIH0KICByZXR1cm4gaVJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdEEJKEtFUk5FTDMyLkApCiAqCiAqIEZvcm1hdCBhIGN1cnJlbmN5IHN0cmluZyBmb3IgYSBnaXZlbiBsb2NhbGUuCiAqCiAqIFBBUkFNUwogKiAgbGNpZCAgICAgICAgICBbSV0gTG9jYWxlIHRvIGZvcm1hdCBmb3IKICogIGR3RmxhZ3MgICAgICAgW0ldIExPQ0FMRV8gZmxhZ3MgZnJvbSAid2lubmxzLmgiCiAqICBscHN6VmFsdWUgICAgIFtJXSBTdHJpbmcgdG8gZm9ybWF0CiAqICBscEZvcm1hdCAgICAgIFtJXSBGb3JtYXR0aW5nIG92ZXJyaWRlcwogKiAgbHBDdXJyZW5jeVN0ciBbT10gRGVzdGluYXRpb24gZm9yIGZvcm1hdHRlZCBzdHJpbmcKICogIGNjaE91dCAgICAgICAgW0ldIFNpemUgb2YgbHBDdXJyZW5jeVN0ciwgb3IgMCB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzaXplCiAqCiAqIE5PVEVTCiAqICAtIGxwc3pWYWx1ZSBjYW4gY29udGFpbiBvbmx5ICcwJyAtICc5JywgJy0nIGFuZCAnLicuCiAqICAtIElmIGxwRm9ybWF0IGlzIG5vbi1OVUxMLCBkd0ZsYWdzIG11c3QgYmUgMC4gSW4gdGhpcyBjYXNlIGxwc3pWYWx1ZSB3aWxsCiAqICAgIGJlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBkZXRhaWxzIHJldHVybmVkIGJ5IEdldExvY2FsZUluZm9BKCkuCiAqICAtIFRoaXMgZnVuY3Rpb24gcm91bmRzIHRoZSBjdXJyZW5jeSBpZiB0aGUgbnVtYmVyIG9mIGRlY2ltYWxzIGV4Y2VlZHMgdGhlCiAqICAgIGxvY2FsZXMgbnVtYmVyIG9mIGN1cnJlbmN5IGRlY2ltYWwgcGxhY2VzLgogKiAgLSBJZiBjY2hPdXQgaXMgMCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3cml0ZSB0byBscEN1cnJlbmN5U3RyLgogKiAgLSBUaGUgQXNjaWkgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGZhaWxzIGlmIGxjaWQgaXMgVW5pY29kZSBvbmx5LgogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlciB3cml0dGVuIHRvIGxwTnVtYmVyU3RyLCBvciB0aGF0IHdvdWxkCiAqICAgICAgICAgICBoYXZlIGJlZW4gd3JpdHRlbiwgaWYgY2NoT3V0IGlzIDAuCiAqICBGYWlsdXJlOiAwLiBVc2UgR2V0TGFzdEVycm9yKCkgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZS4KICovCklOVCBXSU5BUEkgR2V0Q3VycmVuY3lGb3JtYXRBKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwc3pWYWx1ZSwgIGNvbnN0IENVUlJFTkNZRk1UQSAqbHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwQ3VycmVuY3lTdHIsIGludCBjY2hPdXQpCnsKICBEV09SRCBjcCA9IENQX0FDUDsKICBXQ0hBUiBzekRlY1s4XSwgc3pHcnBbOF0sIHN6Q3lbOF0sIHN6SW5bMTI4XSwgc3pPdXRbMTI4XTsKICBDVVJSRU5DWUZNVFcgZm10OwogIGNvbnN0IENVUlJFTkNZRk1UVyAqcGZtdCA9IE5VTEw7CiAgSU5UIGlSZXQ7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVzLCVwLCVwLCVkKVxuIiwgbGNpZCwgZHdGbGFncywgZGVidWdzdHJfYShscHN6VmFsdWUpLAogICAgICAgIGxwRm9ybWF0LCBscEN1cnJlbmN5U3RyLCBjY2hPdXQpOwoKICBpZiAoTkxTX0lzVW5pY29kZU9ubHlMY2lkKGxjaWQpKQogIHsKR2V0Q3VycmVuY3lGb3JtYXRBX0ludmFsaWRQYXJhbWV0ZXI6CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQoKICBpZiAoIShkd0ZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApKQogIHsKICAgIGNvbnN0IE5MU19GT1JNQVRfTk9ERSAqbm9kZSA9IE5MU19HZXRGb3JtYXRzKGxjaWQsIGR3RmxhZ3MpOwogICAgaWYgKCFub2RlKQogICAgICBnb3RvIEdldEN1cnJlbmN5Rm9ybWF0QV9JbnZhbGlkUGFyYW1ldGVyOwogICAgY3AgPSBub2RlLT5kd0NvZGVQYWdlOwogIH0KCiAgaWYgKGxwRm9ybWF0KQogIHsKICAgIG1lbWNweSgmZm10LCBscEZvcm1hdCwgc2l6ZW9mKGZtdCkpOwogICAgcGZtdCA9ICZmbXQ7CiAgICBpZiAobHBGb3JtYXQtPmxwRGVjaW1hbFNlcCkKICAgIHsKICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCwgLTEsIHN6RGVjLCBzaXplb2Yoc3pEZWMpL3NpemVvZihXQ0hBUikpOwogICAgICBmbXQubHBEZWNpbWFsU2VwID0gc3pEZWM7CiAgICB9CiAgICBpZiAobHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApCiAgICB7CiAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoY3AsIDAsIGxwRm9ybWF0LT5scFRob3VzYW5kU2VwLCAtMSwgc3pHcnAsIHNpemVvZihzekdycCkvc2l6ZW9mKFdDSEFSKSk7CiAgICAgIGZtdC5scFRob3VzYW5kU2VwID0gc3pHcnA7CiAgICB9CiAgICBpZiAobHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wpCiAgICB7CiAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoY3AsIDAsIGxwRm9ybWF0LT5scEN1cnJlbmN5U3ltYm9sLCAtMSwgc3pDeSwgc2l6ZW9mKHN6Q3kpL3NpemVvZihXQ0hBUikpOwogICAgICBmbXQubHBDdXJyZW5jeVN5bWJvbCA9IHN6Q3k7CiAgICB9CiAgfQoKICBpZiAobHBzelZhbHVlKQogICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBzelZhbHVlLCAtMSwgc3pJbiwgc2l6ZW9mKHN6SW4pL3NpemVvZihXQ0hBUikpOwoKICBpZiAoY2NoT3V0ID4gKGludCkoc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpKSkKICAgIGNjaE91dCA9IHNpemVvZihzek91dCkvc2l6ZW9mKFdDSEFSKTsKCiAgc3pPdXRbMF0gPSAnXDAnOwoKICBpUmV0ID0gR2V0Q3VycmVuY3lGb3JtYXRXKGxjaWQsIGR3RmxhZ3MsIGxwc3pWYWx1ZSA/IHN6SW4gOiBOVUxMLCBwZm10LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDdXJyZW5jeVN0ciA/IHN6T3V0IDogTlVMTCwgY2NoT3V0KTsKCiAgaWYgKHN6T3V0WzBdICYmIGxwQ3VycmVuY3lTdHIpCiAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKGNwLCAwLCBzek91dCwgLTEsIGxwQ3VycmVuY3lTdHIsIGNjaE91dCwgMCwgMCk7CiAgcmV0dXJuIGlSZXQ7Cn0KCi8qIEZvcm1hdHRpbmcgc3RhdGVzIGZvciBDdXJyZW5jaWVzLiBXZSB1c2UgZmxhZ3MgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi4gKi8KI2RlZmluZSBDRl9QQVJFTlMgICAgICAgMHgxICAvKiBQYXJlbnRoZXNlcyAgICAgICovCiNkZWZpbmUgQ0ZfTUlOVVNfTEVGVCAgIDB4MiAgLyogJy0nIHRvIHRoZSBsZWZ0ICAqLwojZGVmaW5lIENGX01JTlVTX1JJR0hUICAweDQgIC8qICctJyB0byB0aGUgcmlnaHQgKi8KI2RlZmluZSBDRl9NSU5VU19CRUZPUkUgMHg4ICAvKiAnLScgYmVmb3JlICckJyAgICovCiNkZWZpbmUgQ0ZfQ1lfTEVGVCAgICAgIDB4MTAgLyogJyQnIHRvIHRoZSBsZWZ0ICAqLwojZGVmaW5lIENGX0NZX1JJR0hUICAgICAweDIwIC8qICckJyB0byB0aGUgcmlnaHQgKi8KI2RlZmluZSBDRl9DWV9TUEFDRSAgICAgMHg0MCAvKiAnICcgYnkgJyQnICAgICAgICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldEN1cnJlbmN5Rm9ybWF0VwkoS0VSTkVMMzIuQCkKICoKICogU2VlIEdldEN1cnJlbmN5Rm9ybWF0QS4KICovCklOVCBXSU5BUEkgR2V0Q3VycmVuY3lGb3JtYXRXKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBscHN6VmFsdWUsICBjb25zdCBDVVJSRU5DWUZNVFcgKmxwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdTVFIgbHBDdXJyZW5jeVN0ciwgaW50IGNjaE91dCkKewogIHN0YXRpYyBjb25zdCBCWVRFIE5MU19OZWdDeUZvcm1hdHNbMTZdID0KICB7CiAgICBDRl9QQVJFTlN8Q0ZfQ1lfTEVGVCwgICAgICAgICAgICAgICAgICAgICAgIC8qICgkMS4xKSAqLwogICAgQ0ZfTUlOVVNfTEVGVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfTEVGVCwgICAvKiAtJDEuMSAgKi8KICAgIENGX01JTlVTX0xFRlR8Q0ZfQ1lfTEVGVCwgICAgICAgICAgICAgICAgICAgLyogJC0xLjEgICovCiAgICBDRl9NSU5VU19SSUdIVHxDRl9DWV9MRUZULCAgICAgICAgICAgICAgICAgIC8qICQxLjEtICAqLwogICAgQ0ZfUEFSRU5TfENGX0NZX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAvKiAoMS4xJCkgKi8KICAgIENGX01JTlVTX0xFRlR8Q0ZfQ1lfUklHSFQsICAgICAgICAgICAgICAgICAgLyogLTEuMSQgICovCiAgICBDRl9NSU5VU19SSUdIVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfUklHSFQsIC8qIDEuMS0kICAqLwogICAgQ0ZfTUlOVVNfUklHSFR8Q0ZfQ1lfUklHSFQsICAgICAgICAgICAgICAgICAvKiAxLjEkLSAgKi8KICAgIENGX01JTlVTX0xFRlR8Q0ZfQ1lfUklHSFR8Q0ZfQ1lfU1BBQ0UsICAgICAgLyogLTEuMSAkICovCiAgICBDRl9NSU5VU19MRUZUfENGX01JTlVTX0JFRk9SRXxDRl9DWV9MRUZUfENGX0NZX1NQQUNFLCAgIC8qIC0kIDEuMSAqLwogICAgQ0ZfTUlOVVNfUklHSFR8Q0ZfQ1lfUklHSFR8Q0ZfQ1lfU1BBQ0UsICAgICAvKiAxLjEgJC0gICovCiAgICBDRl9NSU5VU19SSUdIVHxDRl9DWV9MRUZUfENGX0NZX1NQQUNFLCAgICAgIC8qICQgMS4xLSAgKi8KICAgIENGX01JTlVTX0xFRlR8Q0ZfQ1lfTEVGVHxDRl9DWV9TUEFDRSwgICAgICAgLyogJCAtMS4xICAqLwogICAgQ0ZfTUlOVVNfUklHSFR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX1JJR0hUfENGX0NZX1NQQUNFLCAvKiAxLjEtICQgKi8KICAgIENGX1BBUkVOU3xDRl9DWV9MRUZUfENGX0NZX1NQQUNFLCAgICAgICAgICAgLyogKCQgMS4xKSAqLwogICAgQ0ZfUEFSRU5TfENGX0NZX1JJR0hUfENGX0NZX1NQQUNFLCAgICAgICAgICAvKiAoMS4xICQpICovCiAgfTsKICBzdGF0aWMgY29uc3QgQllURSBOTFNfUG9zQ3lGb3JtYXRzWzRdID0KICB7CiAgICBDRl9DWV9MRUZULCAgICAgICAgICAgICAgLyogJDEuMSAgKi8KICAgIENGX0NZX1JJR0hULCAgICAgICAgICAgICAvKiAxLjEkICAqLwogICAgQ0ZfQ1lfTEVGVHxDRl9DWV9TUEFDRSwgIC8qICQgMS4xICovCiAgICBDRl9DWV9SSUdIVHxDRl9DWV9TUEFDRSwgLyogMS4xICQgKi8KICB9OwogIFdDSEFSIHN6QnVmZlsxMjhdLCAqc3pPdXQgPSBzekJ1ZmYgKyBzaXplb2Yoc3pCdWZmKSAvIHNpemVvZihXQ0hBUikgLSAxOwogIFdDSEFSIHN6TmVnQnVmZls4XTsKICBjb25zdCBXQ0hBUiAqbHBzek5lZyA9IE5VTEwsICpscHN6TmVnU3RhcnQsICpzelNyYywgKmxwc3pDeSwgKmxwc3pDeVN0YXJ0OwogIERXT1JEIGR3U3RhdGUgPSAwLCBkd0RlY2ltYWxzID0gMCwgZHdHcm91cENvdW50ID0gMCwgZHdDdXJyZW50R3JvdXBDb3VudCA9IDAsIGR3Rm10OwogIElOVCBpUmV0OwoKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseCwlcywlcCwlcCwlZClcbiIsIGxjaWQsIGR3RmxhZ3MsIGRlYnVnc3RyX3cobHBzelZhbHVlKSwKICAgICAgICBscEZvcm1hdCwgbHBDdXJyZW5jeVN0ciwgY2NoT3V0KTsKCiAgaWYgKCFscHN6VmFsdWUgfHwgY2NoT3V0IDwgMCB8fCAoY2NoT3V0ID4gMCAmJiAhbHBDdXJyZW5jeVN0cikgfHwKICAgICAgIUlzVmFsaWRMb2NhbGUobGNpZCwgMCkgfHwKICAgICAgKGxwRm9ybWF0ICYmIChkd0ZsYWdzIHx8ICFscEZvcm1hdC0+bHBEZWNpbWFsU2VwIHx8ICFscEZvcm1hdC0+bHBUaG91c2FuZFNlcCB8fAogICAgICAhbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wgfHwgbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXIgPiAxNSB8fAogICAgICBscEZvcm1hdC0+UG9zaXRpdmVPcmRlciA+IDMpKSkKICB7CkdldEN1cnJlbmN5Rm9ybWF0V19FcnJvcjoKICAgIFNldExhc3RFcnJvcihscEZvcm1hdCAmJiBkd0ZsYWdzID8gRVJST1JfSU5WQUxJRF9GTEFHUyA6IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCFscEZvcm1hdCkKICB7CiAgICBjb25zdCBOTFNfRk9STUFUX05PREUgKm5vZGUgPSBOTFNfR2V0Rm9ybWF0cyhsY2lkLCBkd0ZsYWdzKTsKCiAgICBpZiAoIW5vZGUpCiAgICAgIGdvdG8gR2V0Q3VycmVuY3lGb3JtYXRXX0Vycm9yOwogICAgbHBGb3JtYXQgPSAmbm9kZS0+Y3lmbXQ7CiAgICBscHN6TmVnU3RhcnQgPSBscHN6TmVnID0gR2V0TmVnYXRpdmUobm9kZSk7CiAgfQogIGVsc2UKICB7CiAgICBHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU05FR0FUSVZFU0lHTnwoZHdGbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSksCiAgICAgICAgICAgICAgICAgICBzek5lZ0J1ZmYsIHNpemVvZihzek5lZ0J1ZmYpL3NpemVvZihXQ0hBUikpOwogICAgbHBzek5lZ1N0YXJ0ID0gbHBzek5lZyA9IHN6TmVnQnVmZjsKICB9CiAgZHdGbGFncyAmPSAoTE9DQUxFX05PVVNFUk9WRVJSSURFfExPQ0FMRV9VU0VfQ1BfQUNQKTsKCiAgbHBzek5lZyA9IGxwc3pOZWcgKyBzdHJsZW5XKGxwc3pOZWcpIC0gMTsKICBscHN6Q3lTdGFydCA9IGxwRm9ybWF0LT5scEN1cnJlbmN5U3ltYm9sOwogIGxwc3pDeSA9IGxwc3pDeVN0YXJ0ICsgc3RybGVuVyhscHN6Q3lTdGFydCkgLSAxOwoKICAvKiBGb3JtYXQgdGhlIGN1cnJlbmN5IGJhY2t3YXJkcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciAqLwoKICBzelNyYyA9IGxwc3pWYWx1ZTsKICAqc3pPdXQtLSA9ICdcMCc7CgogIC8qIENoZWNrIHRoZSBudW1iZXIgZm9yIHZhbGlkaXR5ICovCiAgd2hpbGUgKCpzelNyYykKICB7CiAgICBpZiAoKnN6U3JjID49ICcwJyAmJiAqc3pTcmMgPD0gJzknKQogICAgewogICAgICBkd1N0YXRlIHw9IE5GX0RJR0lUUzsKICAgICAgaWYgKGR3U3RhdGUgJiBORl9JU1JFQUwpCiAgICAgICAgZHdEZWNpbWFscysrOwogICAgfQogICAgZWxzZSBpZiAoKnN6U3JjID09ICctJykKICAgIHsKICAgICAgaWYgKGR3U3RhdGUpCiAgICAgICAgZ290byBHZXRDdXJyZW5jeUZvcm1hdFdfRXJyb3I7IC8qICctJyBub3QgZmlyc3QgY2hhcmFjdGVyICovCiAgICAgIGR3U3RhdGUgfD0gTkZfSVNORUdBVElWRTsKICAgIH0KICAgIGVsc2UgaWYgKCpzelNyYyA9PSAnLicpCiAgICB7CiAgICAgIGlmIChkd1N0YXRlICYgTkZfSVNSRUFMKQogICAgICAgIGdvdG8gR2V0Q3VycmVuY3lGb3JtYXRXX0Vycm9yOyAvKiBNb3JlIHRoYW4gb25lICcuJyAqLwogICAgICBkd1N0YXRlIHw9IE5GX0lTUkVBTDsKICAgIH0KICAgIGVsc2UKICAgICAgZ290byBHZXRDdXJyZW5jeUZvcm1hdFdfRXJyb3I7IC8qIEludmFsaWQgY2hhciAqLwogICAgc3pTcmMrKzsKICB9CiAgc3pTcmMtLTsgLyogUG9pbnQgdG8gbGFzdCBjaGFyYWN0ZXIgKi8KCiAgaWYgKCEoZHdTdGF0ZSAmIE5GX0RJR0lUUykpCiAgICBnb3RvIEdldEN1cnJlbmN5Rm9ybWF0V19FcnJvcjsgLyogTm8gZGlnaXRzICovCgogIGlmIChkd1N0YXRlICYgTkZfSVNORUdBVElWRSkKICAgIGR3Rm10ID0gTkxTX05lZ0N5Rm9ybWF0c1tscEZvcm1hdC0+TmVnYXRpdmVPcmRlcl07CiAgZWxzZQogICAgZHdGbXQgPSBOTFNfUG9zQ3lGb3JtYXRzW2xwRm9ybWF0LT5Qb3NpdGl2ZU9yZGVyXTsKCiAgLyogQWRkIGFueSB0cmFpbGluZyBuZWdhdGl2ZSBvciBjdXJyZW5jeSBzaWducyAqLwogIGlmIChkd0ZtdCAmIENGX1BBUkVOUykKICAgICpzek91dC0tID0gJyknOwoKICB3aGlsZSAoZHdGbXQgJiAoQ0ZfTUlOVVNfUklHSFR8Q0ZfQ1lfUklHSFQpKQogIHsKICAgIHN3aXRjaCAoZHdGbXQgJiAoQ0ZfTUlOVVNfUklHSFR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX1JJR0hUKSkKICAgIHsKICAgIGNhc2UgQ0ZfTUlOVVNfUklHSFQ6CiAgICBjYXNlIENGX01JTlVTX1JJR0hUfENGX0NZX1JJR0hUOgogICAgICB3aGlsZSAobHBzek5lZyA+PSBscHN6TmVnU3RhcnQpCiAgICAgICAgKnN6T3V0LS0gPSAqbHBzek5lZy0tOwogICAgICBkd0ZtdCAmPSB+Q0ZfTUlOVVNfUklHSFQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgQ0ZfQ1lfUklHSFQ6CiAgICBjYXNlIENGX01JTlVTX0JFRk9SRXxDRl9DWV9SSUdIVDoKICAgIGNhc2UgQ0ZfTUlOVVNfUklHSFR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX1JJR0hUOgogICAgICB3aGlsZSAobHBzekN5ID49IGxwc3pDeVN0YXJ0KQogICAgICAgICpzek91dC0tID0gKmxwc3pDeS0tOwogICAgICBpZiAoZHdGbXQgJiBDRl9DWV9TUEFDRSkKICAgICAgICAqc3pPdXQtLSA9ICcgJzsKICAgICAgZHdGbXQgJj0gfihDRl9DWV9SSUdIVHxDRl9NSU5VU19CRUZPUkUpOwogICAgICBicmVhazsKICAgIH0KICB9CgogIC8qIENvcHkgYWxsIGRpZ2l0cyB1cCB0byB0aGUgZGVjaW1hbCBwb2ludCAqLwogIGlmICghbHBGb3JtYXQtPk51bURpZ2l0cykKICB7CiAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgIHsKICAgICAgd2hpbGUgKCpzelNyYyAhPSAnLicpIC8qIERvbid0IHdyaXRlIGFueSBkZWNpbWFscyBvciBhIHNlcGFyYXRvciAqLwogICAgICB7CiAgICAgICAgaWYgKCpzelNyYyA+PSAnNScgfHwgKCpzelNyYyA9PSAnNCcgJiYgKGR3U3RhdGUgJiBORl9ST1VORCkpKQogICAgICAgICAgZHdTdGF0ZSB8PSBORl9ST1VORDsKICAgICAgICBlbHNlCiAgICAgICAgICBkd1N0YXRlICY9IH5ORl9ST1VORDsKICAgICAgICBzelNyYy0tOwogICAgICB9CiAgICAgIHN6U3JjLS07CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBMUFdTVFIgbHBzekRlYyA9IGxwRm9ybWF0LT5scERlY2ltYWxTZXAgKyBzdHJsZW5XKGxwRm9ybWF0LT5scERlY2ltYWxTZXApIC0gMTsKCiAgICBpZiAoZHdEZWNpbWFscyA8PSBscEZvcm1hdC0+TnVtRGlnaXRzKQogICAgewogICAgICBkd0RlY2ltYWxzID0gbHBGb3JtYXQtPk51bURpZ2l0cyAtIGR3RGVjaW1hbHM7CiAgICAgIHdoaWxlIChkd0RlY2ltYWxzLS0pCiAgICAgICAgKnN6T3V0LS0gPSAnMCc7IC8qIFBhZCB0byBjb3JyZWN0IG51bWJlciBvZiBkcCAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICBkd0RlY2ltYWxzIC09IGxwRm9ybWF0LT5OdW1EaWdpdHM7CiAgICAgIC8qIFNraXAgZXhjZXNzIGRlY2ltYWxzLCBhbmQgZGV0ZXJtaW5lIGlmIHdlIGhhdmUgdG8gcm91bmQgdGhlIG51bWJlciAqLwogICAgICB3aGlsZSAoZHdEZWNpbWFscy0tKQogICAgICB7CiAgICAgICAgaWYgKCpzelNyYyA+PSAnNScgfHwgKCpzelNyYyA9PSAnNCcgJiYgKGR3U3RhdGUgJiBORl9ST1VORCkpKQogICAgICAgICAgZHdTdGF0ZSB8PSBORl9ST1VORDsKICAgICAgICBlbHNlCiAgICAgICAgICBkd1N0YXRlICY9IH5ORl9ST1VORDsKICAgICAgICBzelNyYy0tOwogICAgICB9CiAgICB9CgogICAgaWYgKGR3U3RhdGUgJiBORl9JU1JFQUwpCiAgICB7CiAgICAgIHdoaWxlICgqc3pTcmMgIT0gJy4nKQogICAgICB7CiAgICAgICAgaWYgKGR3U3RhdGUgJiBORl9ST1VORCkKICAgICAgICB7CiAgICAgICAgICBpZiAoKnN6U3JjID09ICc5JykKICAgICAgICAgICAgKnN6T3V0LS0gPSAnMCc7IC8qIGNvbnRpbnVlIHJvdW5kaW5nICovCiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgICAgICAqc3pPdXQtLSA9ICgqc3pTcmMpKzE7CiAgICAgICAgICB9CiAgICAgICAgICBzelNyYy0tOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAqc3pPdXQtLSA9ICpzelNyYy0tOyAvKiBXcml0ZSBleGlzdGluZyBkZWNpbWFscyAqLwogICAgICB9CiAgICAgIHN6U3JjLS07IC8qIFNraXAgJy4nICovCiAgICB9CiAgICB3aGlsZSAobHBzekRlYyA+PSBscEZvcm1hdC0+bHBEZWNpbWFsU2VwKQogICAgICAqc3pPdXQtLSA9ICpscHN6RGVjLS07IC8qIFdyaXRlIGRlY2ltYWwgc2VwYXJhdG9yICovCiAgfQoKICBkd0dyb3VwQ291bnQgPSBscEZvcm1hdC0+R3JvdXBpbmc7CgogIC8qIFdyaXRlIHRoZSByZW1haW5pbmcgd2hvbGUgbnVtYmVyIGRpZ2l0cywgaW5jbHVkaW5nIGdyb3VwaW5nIGNoYXJzICovCiAgd2hpbGUgKHN6U3JjID49IGxwc3pWYWx1ZSAmJiAqc3pTcmMgPj0gJzAnICYmICpzelNyYyA8PSAnOScpCiAgewogICAgaWYgKGR3U3RhdGUgJiBORl9ST1VORCkKICAgIHsKICAgICAgaWYgKCpzelNyYyA9PSAnOScpCiAgICAgICAgKnN6T3V0LS0gPSAnMCc7IC8qIGNvbnRpbnVlIHJvdW5kaW5nICovCiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgICpzek91dC0tID0gKCpzelNyYykrMTsKICAgICAgfQogICAgICBzelNyYy0tOwogICAgfQogICAgZWxzZQogICAgICAqc3pPdXQtLSA9ICpzelNyYy0tOwoKICAgIGR3U3RhdGUgfD0gTkZfRElHSVRTX09VVDsKICAgIGR3Q3VycmVudEdyb3VwQ291bnQrKzsKICAgIGlmIChzelNyYyA+PSBscHN6VmFsdWUgJiYgZHdDdXJyZW50R3JvdXBDb3VudCA9PSBkd0dyb3VwQ291bnQpCiAgICB7CiAgICAgIExQV1NUUiBscHN6R3JwID0gbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXAgKyBzdHJsZW5XKGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKSAtIDE7CgogICAgICB3aGlsZSAobHBzekdycCA+PSBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6R3JwLS07IC8qIFdyaXRlIGdyb3VwaW5nIGNoYXIgKi8KCiAgICAgIGR3Q3VycmVudEdyb3VwQ291bnQgPSAwOwogICAgfQogIH0KICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogICAgKnN6T3V0LS0gPSAnMSc7IC8qIGUuZy4gLjYgPiAxLjAgKi8KICBlbHNlIGlmICghKGR3U3RhdGUgJiBORl9ESUdJVFNfT1VUKSAmJiBscEZvcm1hdC0+TGVhZGluZ1plcm8pCiAgICAqc3pPdXQtLSA9ICcwJzsgLyogQWRkIGxlYWRpbmcgMCBpZiB3ZSBoYXZlIG5vIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQgKi8KCiAgLyogQWRkIGFueSBsZWFkaW5nIG5lZ2F0aXZlIG9yIGN1cnJlbmN5IHNpZ24gKi8KICB3aGlsZSAoZHdGbXQgJiAoQ0ZfTUlOVVNfTEVGVHxDRl9DWV9MRUZUKSkKICB7CiAgICBzd2l0Y2ggKGR3Rm10ICYgKENGX01JTlVTX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX0xFRlQpKQogICAgewogICAgY2FzZSBDRl9NSU5VU19MRUZUOgogICAgY2FzZSBDRl9NSU5VU19MRUZUfENGX0NZX0xFRlQ6CiAgICAgIHdoaWxlIChscHN6TmVnID49IGxwc3pOZWdTdGFydCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6TmVnLS07CiAgICAgIGR3Rm10ICY9IH5DRl9NSU5VU19MRUZUOwogICAgICBicmVhazsKCiAgICBjYXNlIENGX0NZX0xFRlQ6CiAgICBjYXNlIENGX0NZX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFOgogICAgY2FzZSBDRl9NSU5VU19MRUZUfENGX01JTlVTX0JFRk9SRXxDRl9DWV9MRUZUOgogICAgICBpZiAoZHdGbXQgJiBDRl9DWV9TUEFDRSkKICAgICAgICAqc3pPdXQtLSA9ICcgJzsKICAgICAgd2hpbGUgKGxwc3pDeSA+PSBscHN6Q3lTdGFydCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6Q3ktLTsKICAgICAgZHdGbXQgJj0gfihDRl9DWV9MRUZUfENGX01JTlVTX0JFRk9SRSk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoZHdGbXQgJiBDRl9QQVJFTlMpCiAgICAqc3pPdXQtLSA9ICcoJzsKICBzek91dCsrOwoKICBpUmV0ID0gc3RybGVuVyhzek91dCkgKyAxOwogIGlmIChjY2hPdXQpCiAgewogICAgaWYgKGlSZXQgPD0gY2NoT3V0KQogICAgICBtZW1jcHkobHBDdXJyZW5jeVN0ciwgc3pPdXQsIGlSZXQgKiBzaXplb2YoV0NIQVIpKTsKICAgIGVsc2UKICAgIHsKICAgICAgbWVtY3B5KGxwQ3VycmVuY3lTdHIsIHN6T3V0LCBjY2hPdXQgKiBzaXplb2YoV0NIQVIpKTsKICAgICAgbHBDdXJyZW5jeVN0cltjY2hPdXQgLSAxXSA9ICdcMCc7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgaVJldCA9IDA7CiAgICB9CiAgfQogIHJldHVybiBpUmV0Owp9CgovKiBGSVhNRTogRXZlcnl0aGluZyBiZWxvdyBoZXJlIG5lZWRzIHRvIG1vdmUgc29tZXdoZXJlIGVsc2UgYWxvbmcgd2l0aCB0aGUKICogICAgICAgIG90aGVyIEVudW1YWFggZnVuY3Rpb25zLCB3aGVuIGEgbWV0aG9kIGZvciBzdG9yaW5nIHJlc291cmNlcyBmb3IKICogICAgICAgIGFsdGVybmF0ZSBjYWxlbmRhcnMgaXMgZGV0ZXJtaW5lZC4KICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c0V4QSAgICAoS0VSTkVMMzIuQCkKICoKICogRklYTUU6IE1TRE4gbWVudGlvbnMgb25seSBMT0NBTEVfVVNFX0NQX0FDUCwgc2hvdWxkIHdlIGhhbmRsZQogKiBMT0NBTEVfTk9VU0VST1ZFUlJJREUgaGVyZSBhcyB3ZWxsPwogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzRXhBKERBVEVGTVRfRU5VTVBST0NFWEEgcHJvYywgTENJRCBsY2lkLCBEV09SRCBmbGFncykKewogICAgQ0FMSUQgY2FsX2lkOwogICAgY2hhciBidWZbMjU2XTsKCiAgICBpZiAoIXByb2MpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaWYgKCFHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfSUNBTEVOREFSVFlQRXxMT0NBTEVfUkVUVVJOX05VTUJFUiwgKExQV1NUUikmY2FsX2lkLCBzaXplb2YoY2FsX2lkKS9zaXplb2YoV0NIQVIpKSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgc3dpdGNoIChmbGFncyAmIH5MT0NBTEVfVVNFX0NQX0FDUCkKICAgIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgREFURV9TSE9SVERBVEU6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TU0hPUlREQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NMT05HREFURSB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1ZiwgY2FsX2lkKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfWUVBUk1PTlRIOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU1lFQVJNT05USCB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1ZiwgY2FsX2lkKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBmbGFncyk7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNFeFcgICAgKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNFeFcoREFURUZNVF9FTlVNUFJPQ0VYVyBwcm9jLCBMQ0lEIGxjaWQsIERXT1JEIGZsYWdzKQp7CiAgICBDQUxJRCBjYWxfaWQ7CiAgICBXQ0hBUiBidWZbMjU2XTsKCiAgICBpZiAoIXByb2MpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaWYgKCFHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfSUNBTEVOREFSVFlQRXxMT0NBTEVfUkVUVVJOX05VTUJFUiwgKExQV1NUUikmY2FsX2lkLCBzaXplb2YoY2FsX2lkKS9zaXplb2YoV0NIQVIpKSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgc3dpdGNoIChmbGFncyAmIH5MT0NBTEVfVVNFX0NQX0FDUCkKICAgIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgREFURV9TSE9SVERBVEU6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TU0hPUlREQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb1cobGNpZCwgTE9DQUxFX1NMT05HREFURSB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1ZiwgY2FsX2lkKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfWUVBUk1PTlRIOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU1lFQVJNT05USCB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1ZiwgY2FsX2lkKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBmbGFncyk7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNBCShLRVJORUwzMi5AKQogKgogKiBGSVhNRTogTVNETiBtZW50aW9ucyBvbmx5IExPQ0FMRV9VU0VfQ1BfQUNQLCBzaG91bGQgd2UgaGFuZGxlCiAqIExPQ0FMRV9OT1VTRVJPVkVSUklERSBoZXJlIGFzIHdlbGw/CiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNBKERBVEVGTVRfRU5VTVBST0NBIHByb2MsIExDSUQgbGNpZCwgRFdPUkQgZmxhZ3MpCnsKICAgIGNoYXIgYnVmWzI1Nl07CgogICAgaWYgKCFwcm9jKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHN3aXRjaCAoZmxhZ3MgJiB+TE9DQUxFX1VTRV9DUF9BQ1ApCiAgICB7CiAgICBjYXNlIDA6CiAgICBjYXNlIERBVEVfU0hPUlREQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU1NIT1JUREFURSB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0xPTkdEQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfWUVBUk1PTlRIOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU1lFQVJNT05USCB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZmxhZ3MpOwogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzVwkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c1coREFURUZNVF9FTlVNUFJPQ1cgcHJvYywgTENJRCBsY2lkLCBEV09SRCBmbGFncykKewogICAgV0NIQVIgYnVmWzI1Nl07CgogICAgaWYgKCFwcm9jKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHN3aXRjaCAoZmxhZ3MgJiB+TE9DQUxFX1VTRV9DUF9BQ1ApCiAgICB7CiAgICBjYXNlIDA6CiAgICBjYXNlIERBVEVfU0hPUlREQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU1NIT1JUREFURSB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU0xPTkdEQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfWUVBUk1PTlRIOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU1lFQVJNT05USCB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZmxhZ3MpOwogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzQQkoS0VSTkVMMzIuQCkKICoKICogRklYTUU6IE1TRE4gbWVudGlvbnMgb25seSBMT0NBTEVfVVNFX0NQX0FDUCwgc2hvdWxkIHdlIGhhbmRsZQogKiBMT0NBTEVfTk9VU0VST1ZFUlJJREUgaGVyZSBhcyB3ZWxsPwogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzQShUSU1FRk1UX0VOVU1QUk9DQSBwcm9jLCBMQ0lEIGxjaWQsIERXT1JEIGZsYWdzKQp7CiAgICBjaGFyIGJ1ZlsyNTZdOwoKICAgIGlmICghcHJvYykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBzd2l0Y2ggKGZsYWdzICYgfkxPQ0FMRV9VU0VfQ1BfQUNQKQogICAgewogICAgY2FzZSAwOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU1RJTUVGT1JNQVQgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVua25vd24gdGltZSBmb3JtYXQgKCVsZClcbiIsIGZsYWdzKTsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0c1cJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNXKFRJTUVGTVRfRU5VTVBST0NXIHByb2MsIExDSUQgbGNpZCwgRFdPUkQgZmxhZ3MpCnsKICAgIFdDSEFSIGJ1ZlsyNTZdOwoKICAgIGlmICghcHJvYykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBzd2l0Y2ggKGZsYWdzICYgfkxPQ0FMRV9VU0VfQ1BfQUNQKQogICAgewogICAgY2FzZSAwOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU1RJTUVGT1JNQVQgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVua25vd24gdGltZSBmb3JtYXQgKCVsZClcbiIsIGZsYWdzKTsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVcgPGludGVybmFsPgogKiBFbnVtZXJhdGVzIGNhbGVuZGFyIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmllZCBsb2NhbGUuCiAqCiAqIFBBUkFNUwogKiAgICBjYWxpbmZvcHJvYyBbSV0gUG9pbnRlciB0byB0aGUgY2FsbGJhY2sKICogICAgbG9jYWxlICAgICAgW0ldIFRoZSBsb2NhbGUgZm9yIHdoaWNoIHRvIHJldHJpZXZlIGNhbGVuZGFyIGluZm9ybWF0aW9uLgogKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCBieSB0aGUKICogICAgICAgICAgICAgICAgICAgIE1BS0VMQ0lEIG1hY3JvLCBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAqICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUxFX1NZU1RFTV9ERUZBVUxUCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgZGVmYXVsdCBzeXN0ZW0gbG9jYWxlLgogKiAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMRV9VU0VSX0RFRkFVTFQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBkZWZhdWx0IHVzZXIgbG9jYWxlLgogKiAgICBjYWxlbmRhciAgICBbSV0gVGhlIGNhbGVuZGFyIGZvciB3aGljaCBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQsIG9yCiAqICAgICAgICAgICAgICAgICAgICBFTlVNX0FMTF9DQUxFTkRBUlMuCiAqICAgIGNhbHR5cGUgICAgIFtJXSBUaGUgdHlwZSBvZiBjYWxlbmRhciBpbmZvcm1hdGlvbiB0byBiZSByZXR1cm5lZC4gTm90ZQogKiAgICAgICAgICAgICAgICAgICAgdGhhdCBvbmx5IG9uZSBDQUxUWVBFIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgcGVyIGNhbGwKICogICAgICAgICAgICAgICAgICAgIG9mIHRoaXMgZnVuY3Rpb24sIGV4Y2VwdCB3aGVyZSBub3RlZC4KICogICAgdW5pY29kZSAgICAgW0ldIFNwZWNpZmllcyBpZiB0aGUgY2FsbGJhY2sgZXhwZWN0cyBhIHVuaWNvZGUgc3RyaW5nLgogKiAgICBleCAgICAgICAgICBbSV0gU3BlY2lmaWVzIGlmIHRoZSBjYWxsYmFjayBuZWVkcyB0aGUgY2FsZW5kYXIgaWRlbnRpZmllci4KICoKICogUkVUVVJOUwogKiAgICBTdWNjZXNzOiBUUlVFLgogKiAgICBGYWlsdXJlOiBGQUxTRS4gVXNlIEdldExhc3RFcnJvcigpIHRvIGRldGVybWluZSB0aGUgY2F1c2UuCiAqCiAqIE5PVEVTCiAqICAgIFdoZW4gdGhlIEFOU0kgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aCBhIFVuaWNvZGUtb25seSBMQ0lELAogKiAgICB0aGUgY2FsbCBjYW4gc3VjY2VlZCBiZWNhdXNlIHRoZSBzeXN0ZW0gdXNlcyB0aGUgc3lzdGVtIGNvZGUgcGFnZS4KICogICAgSG93ZXZlciwgY2hhcmFjdGVycyB0aGF0IGFyZSB1bmRlZmluZWQgaW4gdGhlIHN5c3RlbSBjb2RlIHBhZ2UgYXBwZWFyCiAqICAgIGluIHRoZSBzdHJpbmcgYXMgYSBxdWVzdGlvbiBtYXJrICg/KS4KICoKICogVE9ETwogKiAgICBUaGUgYWJvdmUgbm90ZSBzaG91bGQgYmUgcmVzcGVjdGVkIGJ5IEdldENhbGVuZGFySW5mb0EuCiAqLwpzdGF0aWMgQk9PTCBOTFNfRW51bUNhbGVuZGFySW5mb0FXKHZvaWQgKmNhbGluZm9wcm9jLCBMQ0lEIGxvY2FsZSwKICAgICAgICAgICAgICAgICAgQ0FMSUQgY2FsZW5kYXIsIENBTFRZUEUgY2FsdHlwZSwgQk9PTCB1bmljb2RlLCBCT09MIGV4ICkKewogIFdDSEFSICpidWYsICpvcHQgPSBOVUxMLCAqaXRlciA9IE5VTEw7CiAgQk9PTCByZXQgPSBGQUxTRTsKICBpbnQgYnVmU3ogPSAyMDA7CQkvKiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyICovCgogIGlmIChjYWxpbmZvcHJvYyA9PSBOVUxMKQogIHsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBidWYgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmU3opOwogIGlmIChidWYgPT0gTlVMTCkKICB7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaWYgKGNhbGVuZGFyID09IEVOVU1fQUxMX0NBTEVOREFSUykKICB7CiAgICBpbnQgb3B0U3ogPSBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsIExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUiwgTlVMTCwgMCk7CiAgICBpZiAob3B0U3ogPiAxKQogICAgewogICAgICBvcHQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb3B0U3ogKiBzaXplb2YoV0NIQVIpKTsKICAgICAgaWYgKG9wdCA9PSBOVUxMKQogICAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICBnb3RvIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVdfQ2xlYW51cDsKICAgICAgfQogICAgICBpZiAoR2V0TG9jYWxlSW5mb1cobG9jYWxlLCBMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIsIG9wdCwgb3B0U3opKQogICAgICAgIGl0ZXIgPSBvcHQ7CiAgICB9CiAgICBjYWxlbmRhciA9IE5MU19HZXRMb2NhbGVOdW1iZXIobG9jYWxlLCBMT0NBTEVfSUNBTEVOREFSVFlQRSk7CiAgfQoKICB3aGlsZSAoVFJVRSkJCQkvKiBsb29wIHRocm91Z2ggY2FsZW5kYXJzICovCiAgewogICAgZG8JCQkJLyogbG9vcCB1bnRpbCB0aGVyZSdzIG5vIGVycm9yICovCiAgICB7CiAgICAgIGlmICh1bmljb2RlKQogICAgICAgIHJldCA9IEdldENhbGVuZGFySW5mb1cobG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSwgYnVmLCBidWZTeiAvIHNpemVvZihXQ0hBUiksIE5VTEwpOwogICAgICBlbHNlIHJldCA9IEdldENhbGVuZGFySW5mb0EobG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSwgKENIQVIqKWJ1ZiwgYnVmU3ogLyBzaXplb2YoQ0hBUiksIE5VTEwpOwoKICAgICAgaWYgKCFyZXQpCiAgICAgIHsKICAgICAgICBpZiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKICAgICAgICB7CQkJCS8qIHNvIHJlc2l6ZSBpdCAqLwogICAgICAgICAgaW50IG5ld1N6OwogICAgICAgICAgaWYgKHVuaWNvZGUpCiAgICAgICAgICAgIG5ld1N6ID0gR2V0Q2FsZW5kYXJJbmZvVyhsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCBOVUxMLCAwLCBOVUxMKSAqIHNpemVvZihXQ0hBUik7CiAgICAgICAgICBlbHNlIG5ld1N6ID0gR2V0Q2FsZW5kYXJJbmZvQShsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCBOVUxMLCAwLCBOVUxMKSAqIHNpemVvZihDSEFSKTsKICAgICAgICAgIGlmIChidWZTeiA+PSBuZXdTeikKICAgICAgICAgIHsKICAgICAgICAgICAgRVJSKCJCdWZmZXIgcmVzaXppbmcgZGlzb3JkZXI6IHdhcyAlZCwgcmVxdWVzdGVkICVkLlxuIiwgYnVmU3osIG5ld1N6KTsKICAgICAgICAgICAgZ290byBOTFNfRW51bUNhbGVuZGFySW5mb0FXX0NsZWFudXA7CiAgICAgICAgICB9CiAgICAgICAgICBidWZTeiA9IG5ld1N6OwogICAgICAgICAgV0FSTigiQnVmZmVyIHRvbyBzbWFsbDsgcmVzaXppbmcgdG8gJWQgYnl0ZXMuXG4iLCBidWZTeik7CiAgICAgICAgICBidWYgPSBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWYsIGJ1ZlN6KTsKICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkKICAgICAgICAgICAgZ290byBOTFNfRW51bUNhbGVuZGFySW5mb0FXX0NsZWFudXA7CiAgICAgICAgfSBlbHNlIGdvdG8gTkxTX0VudW1DYWxlbmRhckluZm9BV19DbGVhbnVwOwogICAgICB9CiAgICB9IHdoaWxlICghcmV0KTsKCiAgICAvKiBIZXJlIHdlIGFyZS4gV2UgcGFzcyB0aGUgYnVmZmVyIHRvIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YKICAgICAqIHRoZSBjYWxsYmFjay4gQmVjYXVzZSBpdCdzIG5vdCB0aGUgc2FtZSBudW1iZXIgb2YgcGFyYW1zLAogICAgICogd2UgbXVzdCBjaGVjayBmb3IgRXgsIGJ1dCB3ZSBkb24ndCBjYXJlIGFib3V0IFVuaWNvZGUKICAgICAqIGJlY2F1c2UgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGZvcm1hdC4KICAgICAqLwogICAgaWYgKGV4KSB7CiAgICAgIHJldCA9ICgoQ0FMSU5GT19FTlVNUFJPQ0VYVyljYWxpbmZvcHJvYykoYnVmLCBjYWxlbmRhcik7CiAgICB9IGVsc2UKICAgICAgcmV0ID0gKChDQUxJTkZPX0VOVU1QUk9DVyljYWxpbmZvcHJvYykoYnVmKTsKCiAgICBpZiAoIXJldCkgewkJCS8qIHRoZSBjYWxsYmFjayB0b2xkIHRvIHN0b3AgKi8KICAgICAgcmV0ID0gVFJVRTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKChpdGVyID09IE5VTEwpIHx8ICgqaXRlciA9PSAwKSkJLyogbm8gbW9yZSBjYWxlbmRhcnMgKi8KICAgICAgYnJlYWs7CgogICAgY2FsZW5kYXIgPSAwOwogICAgd2hpbGUgKCgqaXRlciA+PSAnMCcpICYmICgqaXRlciA8PSAnOScpKQogICAgICBjYWxlbmRhciA9IGNhbGVuZGFyICogMTAgKyAqaXRlcisrIC0gJzAnOwoKICAgIGlmICgqaXRlcisrICE9IDApCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9CQUREQik7CiAgICAgIHJldCA9IEZBTFNFOwogICAgICBicmVhazsKICAgIH0KICB9CgpOTFNfRW51bUNhbGVuZGFySW5mb0FXX0NsZWFudXA6CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb3B0KTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWYpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9BCVtLRVJORUwzMi5AXQogKgogKiBTZWUgRW51bUNhbGVuZGFySW5mb0FXLgogKi8KQk9PTCBXSU5BUEkgRW51bUNhbGVuZGFySW5mb0EoIENBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlICkKewogIFRSQUNFKCIoJXAsMHglMDhseCwweCUwOGx4LDB4JTA4bHgpXG4iLCBjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSk7CiAgcmV0dXJuIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVcoY2FsaW5mb3Byb2MsIGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUsIEZBTFNFLCBGQUxTRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9XCVtLRVJORUwzMi5AXQogKgogKiBTZWUgRW51bUNhbGVuZGFySW5mb0FXLgogKi8KQk9PTCBXSU5BUEkgRW51bUNhbGVuZGFySW5mb1coIENBTElORk9fRU5VTVBST0NXIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlICkKewogIFRSQUNFKCIoJXAsMHglMDhseCwweCUwOGx4LDB4JTA4bHgpXG4iLCBjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSk7CiAgcmV0dXJuIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVcoY2FsaW5mb3Byb2MsIGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUsIFRSVUUsIEZBTFNFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0V4QQlbS0VSTkVMMzIuQF0KICoKICogU2VlIEVudW1DYWxlbmRhckluZm9BVy4KICovCkJPT0wgV0lOQVBJIEVudW1DYWxlbmRhckluZm9FeEEoIENBTElORk9fRU5VTVBST0NFWEEgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZSApCnsKICBUUkFDRSgiKCVwLDB4JTA4bHgsMHglMDhseCwweCUwOGx4KVxuIiwgY2FsaW5mb3Byb2MsIGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUpOwogIHJldHVybiBOTFNfRW51bUNhbGVuZGFySW5mb0FXKGNhbGluZm9wcm9jLCBsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCBGQUxTRSwgVFJVRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9FeFcJW0tFUk5FTDMyLkBdCiAqCiAqIFNlZSBFbnVtQ2FsZW5kYXJJbmZvQVcuCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvRXhXKCBDQUxJTkZPX0VOVU1QUk9DRVhXIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxJRCBjYWxlbmRhcixDQUxUWVBFIGNhbHR5cGUgKQp7CiAgVFJBQ0UoIiglcCwweCUwOGx4LDB4JTA4bHgsMHglMDhseClcbiIsIGNhbGluZm9wcm9jLCBsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlKTsKICByZXR1cm4gTkxTX0VudW1DYWxlbmRhckluZm9BVyhjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSwgVFJVRSwgVFJVRSk7Cn0K