LyoKICogQ29weXJpZ2h0IDE5OTggTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAwIEJyYWRsZXkgQmFldHoKICogQ29weXJpZ2h0IDIwMDMgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICoKICogRklYTUU6IFRoaXMgYWxsIGFzc3VtZXMgMzIgYml0IGNvZGVjcwogKgkJV2luOTUgYXBwZWFycyB0byBwcmVmZXIgMzIgYml0IGNvZGVjcywgZXZlbiBmcm9tIDE2IGJpdCBjb2RlLgogKgkJVGhlcmUgaXMgdGhlIElDT3BlbkZ1bmN0aW9uMTYgdG8gd29ycnkgYWJvdXQgc3RpbGwsIHRob3VnaC4KICogICAgICAKICogVE9ETwogKiAgICAgIC0gbm8gdGhyZWFkIHNhZmV0eQogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAibXN2aWRlb19wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2lucmVnLmgiCgojaW5jbHVkZSAid2luZG93c3guaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgovKiBEcml2ZXJzMzIgc2V0dGluZ3MgKi8KI2RlZmluZSBIS0xNX0RSSVZFUlMzMiAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93cyBOVFxcQ3VycmVudFZlcnNpb25cXERyaXZlcnMzMiIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKG1zdmlkZW8pOwoKc3RhdGljIGlubGluZSBjb25zdCBjaGFyICp3aW5lX2RiZ3N0cl9mY2MoIERXT1JEIGZjYyApCnsKICAgIHJldHVybiB3aW5lX2RiZ19zcHJpbnRmKCIlYyVjJWMlYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9CWVRFKExPV09SRChmY2MpKSwgSElCWVRFKExPV09SRChmY2MpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQllURShISVdPUkQoZmNjKSksIEhJQllURShISVdPUkQoZmNjKSkpOwp9CgpMUkVTVUxUIChDQUxMQkFDSyAqcEZuQ2FsbFRvMTYpKEhEUlZSLCBISUMsIFVJTlQsIExQQVJBTSwgTFBBUkFNKSA9IE5VTEw7CgpzdGF0aWMgV0lORV9ISUMqICAgICAgICBNU1ZJREVPX0ZpcnN0SGljIC8qID0gTlVMTCAqLzsKCnR5cGVkZWYgc3RydWN0IF9yZWdfZHJpdmVyIHJlZ19kcml2ZXI7CnN0cnVjdCBfcmVnX2RyaXZlcgp7CiAgICBEV09SRCAgICAgICBmY2NUeXBlOwogICAgRFdPUkQgICAgICAgZmNjSGFuZGxlcjsKICAgIERSSVZFUlBST0MgIHByb2M7CiAgICBMUFdTVFIgICAgICBuYW1lOwogICAgcmVnX2RyaXZlciogbmV4dDsKfTsKCnN0YXRpYyByZWdfZHJpdmVyKiByZWdfZHJpdmVyX2xpc3QgPSBOVUxMOwoKLyogVGhpcyBvbmUgaXMgYSBtYWNybyBzdWNoIHRoYXQgaXQgd29ya3MgZm9yIGJvdGggQVNDSUkgYW5kIFVuaWNvZGUgKi8KI2RlZmluZSBmb3VyY2NfdG9fc3RyaW5nKHN0ciwgZmNjKSBkbyB7IFwKCShzdHIpWzBdID0gTE9CWVRFKExPV09SRChmY2MpKTsgXAoJKHN0cilbMV0gPSBISUJZVEUoTE9XT1JEKGZjYykpOyBcCgkoc3RyKVsyXSA9IExPQllURShISVdPUkQoZmNjKSk7IFwKCShzdHIpWzNdID0gSElCWVRFKEhJV09SRChmY2MpKTsgXAoJfSB3aGlsZSgwKQoKSE1PRFVMRSBNU1ZGVzMyX2hNb2R1bGU7CgpCT09MIFdJTkFQSSBEbGxNYWluKCBISU5TVEFOQ0UgaGluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkICkKewogICAgVFJBQ0UoIiVwLCVseCwlcFxuIiwgaGluc3QsIHJlYXNvbiwgcmVzZXJ2ZWQpOwoKICAgIHN3aXRjaChyZWFzb24pCiAgICB7CiAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CiAgICAgICAgICAgIERpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMoaGluc3QpOwogICAgICAgICAgICBNU1ZGVzMyX2hNb2R1bGUgPSAoSE1PRFVMRSloaW5zdDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIGludCBjb21wYXJlX2ZvdXJjYyhEV09SRCBmY2MxLCBEV09SRCBmY2MyKQp7CiAgY2hhciBmY2Nfc3RyMVs0XTsKICBjaGFyIGZjY19zdHIyWzRdOwogIGZvdXJjY190b19zdHJpbmcoZmNjX3N0cjEsIGZjYzEpOwogIGZvdXJjY190b19zdHJpbmcoZmNjX3N0cjIsIGZjYzIpOwogIHJldHVybiBzdHJuY2FzZWNtcChmY2Nfc3RyMSwgZmNjX3N0cjIsIDQpOwp9Cgp0eXBlZGVmIEJPT0wgKCplbnVtX2hhbmRsZXJfdCkoY29uc3QgY2hhciosIGludCwgdm9pZCopOwoKc3RhdGljIEJPT0wgZW51bV9kcml2ZXJzKERXT1JEIGZjY1R5cGUsIGVudW1faGFuZGxlcl90IGhhbmRsZXIsIHZvaWQqIHBhcmFtKQp7CiAgICBDSEFSIGJ1ZlsyMDQ4XSwgZmNjVHlwZVN0cls1XSwgKnM7CiAgICBEV09SRCBpLCBjbnQgPSAwLCBidWZMZW4sIGxSZXQ7CiAgICBCT09MIHJlc3VsdCA9IEZBTFNFOwogICAgRklMRVRJTUUgbGFzdFdyaXRlOwogICAgSEtFWSBoS2V5OwoKICAgIGZvdXJjY190b19zdHJpbmcoZmNjVHlwZVN0ciwgZmNjVHlwZSk7CiAgICBmY2NUeXBlU3RyWzRdID0gJy4nOwoKICAgIC8qIGZpcnN0LCBnbyB0aHJvdWdoIHRoZSByZWdpc3RyeSBlbnRyaWVzICovCiAgICBsUmV0ID0gUmVnT3BlbktleUV4QShIS0VZX0xPQ0FMX01BQ0hJTkUsIEhLTE1fRFJJVkVSUzMyLCAwLCBLRVlfUVVFUllfVkFMVUUsICZoS2V5KTsKICAgIGlmIChsUmV0ID09IEVSUk9SX1NVQ0NFU1MpIAogICAgewoJUmVnUXVlcnlJbmZvS2V5QSggaEtleSwgMCwgMCwgMCwgJmNudCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7Cglmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIAoJewoJICAgIGJ1ZkxlbiA9IHNpemVvZihidWYpIC8gc2l6ZW9mKGJ1ZlswXSk7CgkgICAgbFJldCA9IFJlZ0VudW1LZXlFeEEoaEtleSwgaSwgYnVmLCAmYnVmTGVuLCAwLCAwLCAwLCAmbGFzdFdyaXRlKTsKCSAgICBpZiAobFJldCAhPSBFUlJPUl9TVUNDRVNTKSBjb250aW51ZTsKCSAgICBpZiAoc3RybmNhc2VjbXAoYnVmLCBmY2NUeXBlU3RyLCA1KSB8fCBidWZbOV0gIT0gJz0nKSBjb250aW51ZTsKCSAgICBpZiAoKHJlc3VsdCA9IGhhbmRsZXIoYnVmLCBpLCBwYXJhbSkpKSBicmVhazsKCX0KICAgIAlSZWdDbG9zZUtleSggaEtleSApOwogICAgfQogICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDsKCiAgICAvKiBpZiB0aGF0IGRpZG4ndCB3b3JrLCBnbyB0aHJvdWdoIHRoZSB2YWx1ZXMgaW4gc3lzdGVtLmluaSAqLwogICAgaWYgKEdldFByaXZhdGVQcm9maWxlU2VjdGlvbkEoImRyaXZlcnMzMiIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICJzeXN0ZW0uaW5pIikpIAogICAgewoJZm9yIChzID0gYnVmOyAqczsgY250KyssIHMgKz0gc3RybGVuKHMpICsgMSkKCXsKCSAgICBpZiAoc3RybmNhc2VjbXAocywgZmNjVHlwZVN0ciwgNSkgfHwgc1s5XSAhPSAnPScpIGNvbnRpbnVlOwoJICAgIGlmICgocmVzdWx0ID0gaGFuZGxlcihzLCBjbnQsIHBhcmFtKSkpIGJyZWFrOwoJfQogICAgfQoKICAgIHJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1TVklERU9fR2V0SGljUHRyCiAqCiAqCiAqLwpXSU5FX0hJQyogICBNU1ZJREVPX0dldEhpY1B0cihISUMgaGljKQp7CiAgICBXSU5FX0hJQyogICB3aGljOwoKICAgIGZvciAod2hpYyA9IE1TVklERU9fRmlyc3RIaWM7IHdoaWMgJiYgd2hpYy0+aGljICE9IGhpYzsgd2hpYyA9IHdoaWMtPm5leHQpOwogICAgcmV0dXJuIHdoaWM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbgkJW01TVkZXMzIuMl0KICoJCVZpZGVvRm9yV2luZG93c1ZlcnNpb24JCVtNU1ZJREVPLjJdCiAqIFJldHVybnMgdGhlIHZlcnNpb24gaW4gbWFqb3IubWlub3IgZm9ybS4KICogSW4gV2luZG93czk1IHRoaXMgcmV0dXJucyAweDA0MDAwM2I2ICg0Ljk1MCkKICovCkRXT1JEIFdJTkFQSSBWaWRlb0ZvcldpbmRvd3NWZXJzaW9uKHZvaWQpIAp7CiAgICByZXR1cm4gMHgwNDAwMDNCNjsgLyogNC45NTAgKi8KfQoKc3RhdGljIEJPT0wgSUNJbmZvX2VudW1faGFuZGxlcihjb25zdCBjaGFyICpkcnYsIGludCBuciwgdm9pZCAqcGFyYW0pCnsKICAgIElDSU5GTyAqbHBpY2luZm8gPSAoSUNJTkZPICopcGFyYW07CiAgICBEV09SRCBmY2NIYW5kbGVyID0gbW1pb1N0cmluZ1RvRk9VUkNDQShkcnYgKyA1LCAwKTsKCiAgICAvKiBleGFjdCBtYXRjaCBvZiBmY2NIYW5kbGVyIG9yIG50aCBkcml2ZXIgZm91bmQgKi8KICAgIGlmICgobHBpY2luZm8tPmZjY0hhbmRsZXIgIT0gbnIpICYmIChscGljaW5mby0+ZmNjSGFuZGxlciAhPSBmY2NIYW5kbGVyKSkKCXJldHVybiBGQUxTRTsKCiAgICBscGljaW5mby0+ZmNjVHlwZSA9IG1taW9TdHJpbmdUb0ZPVVJDQ0EoZHJ2LCAwKTsKICAgIGxwaWNpbmZvLT5mY2NIYW5kbGVyID0gZmNjSGFuZGxlcjsKICAgIGxwaWNpbmZvLT5kd0ZsYWdzID0gMDsKICAgIGxwaWNpbmZvLT5kd1ZlcnNpb24gPSAwOwogICAgbHBpY2luZm8tPmR3VmVyc2lvbklDTSA9IDB4MTA0OwogICAgbHBpY2luZm8tPnN6TmFtZVswXSA9IDA7CiAgICBscGljaW5mby0+c3pEZXNjcmlwdGlvblswXSA9IDA7CiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgZHJ2ICsgMTAsIC0xLCBscGljaW5mby0+c3pEcml2ZXIsIAoJCQlzaXplb2YobHBpY2luZm8tPnN6RHJpdmVyKS9zaXplb2YoV0NIQVIpKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0luZm8JCQkJW01TVkZXMzIuQF0KICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIGluc3RhbGxhYmxlIGNvbXByZXNzb3IuIFJldHVybiBUUlVFIGlmIHRoZXJlCiAqIGlzIG9uZS4KICoKICogUEFSQU1TCiAqICAgZmNjVHlwZSAgICAgW0ldIHR5cGUgb2YgY29tcHJlc3NvciAoZS5nLiAndmlkYycpCiAqICAgZmNjSGFuZGxlciAgW0ldIHJlYWwgZmNjIGZvciBoYW5kbGVyIG9yIDxuPnRoIGNvbXByZXNzb3IKICogICBscGljaW5mbyAgICBbT10gaW5mb3JtYXRpb24gYWJvdXQgY29tcHJlc3NvcgogKi8KQk9PTCBWRldBUEkgSUNJbmZvKCBEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBJQ0lORk8gKmxwaWNpbmZvKQp7CiAgICBUUkFDRSgiKCVzLCVzLyUwOGx4LCVwKVxuIiwgCiAgICAgICAgICB3aW5lX2RiZ3N0cl9mY2MoZmNjVHlwZSksIHdpbmVfZGJnc3RyX2ZjYyhmY2NIYW5kbGVyKSwgZmNjSGFuZGxlciwgbHBpY2luZm8pOwoKICAgIGxwaWNpbmZvLT5mY2NIYW5kbGVyID0gZmNjSGFuZGxlcjsKICAgIHJldHVybiBlbnVtX2RyaXZlcnMoZmNjVHlwZSwgSUNJbmZvX2VudW1faGFuZGxlciwgbHBpY2luZm8pOwp9CgpzdGF0aWMgRFdPUkQgSUNfSGFuZGxlUmVmID0gMTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNJbnN0YWxsCQkJW01TVkZXMzIuQF0KICovCkJPT0wgVkZXQVBJIElDSW5zdGFsbChEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBMUEFSQU0gbFBhcmFtLCBMUFNUUiBzekRlc2MsIFVJTlQgd0ZsYWdzKSAKewogICAgcmVnX2RyaXZlciogZHJpdmVyOwogICAgdW5zaWduZWQgbGVuOwoKICAgIFRSQUNFKCIoJXMsJXMsJXAsJXAsMHglMDh4KVxuIiwgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksICh2b2lkKilsUGFyYW0sIHN6RGVzYywgd0ZsYWdzKTsKCiAgICAvKiBDaGVjayBpZiBhIGRyaXZlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KICAgIGZvciAoZHJpdmVyID0gcmVnX2RyaXZlcl9saXN0OyBkcml2ZXI7IGRyaXZlciA9IGRyaXZlci0+bmV4dCkKICAgIHsKICAgICAgICBpZiAoIWNvbXBhcmVfZm91cmNjKGZjY1R5cGUsIGRyaXZlci0+ZmNjVHlwZSkgJiYKICAgICAgICAgICAgIWNvbXBhcmVfZm91cmNjKGZjY0hhbmRsZXIsIGRyaXZlci0+ZmNjSGFuZGxlcikpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGRyaXZlcikgcmV0dXJuIEZBTFNFOwoKICAgIC8qIFJlZ2lzdGVyIHRoZSBkcml2ZXIgKi8KICAgIGRyaXZlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YocmVnX2RyaXZlcikpOwogICAgaWYgKCFkcml2ZXIpIGdvdG8gb29tOwogICAgZHJpdmVyLT5mY2NUeXBlID0gZmNjVHlwZTsKICAgIGRyaXZlci0+ZmNjSGFuZGxlciA9IGZjY0hhbmRsZXI7CgogICAgc3dpdGNoKHdGbGFncykKICAgIHsKICAgIGNhc2UgSUNJTlNUQUxMX0ZVTkNUSU9OOgogICAgICAgIGRyaXZlci0+cHJvYyA9IChEUklWRVJQUk9DKWxQYXJhbTsKCWRyaXZlci0+bmFtZSA9IE5VTEw7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElDSU5TVEFMTF9EUklWRVI6Cglkcml2ZXItPnByb2MgPSBOVUxMOwogICAgICAgIGxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCAoY2hhciopbFBhcmFtLCAtMSwgTlVMTCwgMCk7CiAgICAgICAgZHJpdmVyLT5uYW1lID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbiAqIHNpemVvZihXQ0hBUikpOwogICAgICAgIGlmICghZHJpdmVyLT5uYW1lKSBnb3RvIG9vbTsKICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgKGNoYXIqKWxQYXJhbSwgLTEsIGRyaXZlci0+bmFtZSwgbGVuKTsKCWJyZWFrOwogICAgZGVmYXVsdDoKCUVSUigiSW52YWxpZCBmbGFncyFcbiIpOwoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHJpdmVyKTsKCXJldHVybiBGQUxTRTsKICAgfQoKICAgLyogSW5zZXJ0IG91ciBkcml2ZXIgaW4gdGhlIGxpc3QqLwogICBkcml2ZXItPm5leHQgPSByZWdfZHJpdmVyX2xpc3Q7CiAgIHJlZ19kcml2ZXJfbGlzdCA9IGRyaXZlcjsKICAgIAogICByZXR1cm4gVFJVRTsKIG9vbToKICAgaWYgKGRyaXZlcikgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHJpdmVyKTsKICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDUmVtb3ZlCQkJW01TVkZXMzIuQF0KICovCkJPT0wgVkZXQVBJIElDUmVtb3ZlKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIFVJTlQgd0ZsYWdzKSAKewogICAgcmVnX2RyaXZlcioqIHBkcml2ZXI7CiAgICAKICAgIFRSQUNFKCIoJXMsJXMsMHglMDh4KVxuIiwgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIHdGbGFncyk7CgogICAgLyogQ2hlY2sgaWYgYSBkcml2ZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCiAgICBmb3IgKHBkcml2ZXIgPSAmcmVnX2RyaXZlcl9saXN0OyAqcGRyaXZlcjsgcGRyaXZlciA9ICYoKnBkcml2ZXIpLT5uZXh0KQogICAgewogICAgICAgIGlmICghY29tcGFyZV9mb3VyY2MoZmNjVHlwZSwgKCpwZHJpdmVyKS0+ZmNjVHlwZSkgJiYKICAgICAgICAgICAgIWNvbXBhcmVfZm91cmNjKGZjY0hhbmRsZXIsICgqcGRyaXZlciktPmZjY0hhbmRsZXIpKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmICghKnBkcml2ZXIpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qIFJlbW92ZSB0aGUgZHJpdmVyIGZyb20gdGhlIGxpc3QgKi8KICAgICpwZHJpdmVyID0gKCpwZHJpdmVyKS0+bmV4dDsKICAgIGlmICgoKnBkcml2ZXIpLT5uYW1lKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICgqcGRyaXZlciktPm5hbWUpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKnBkcml2ZXIpOwogICAgCiAgICByZXR1cm4gVFJVRTsgIAp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ09wZW4JCQkJW01TVkZXMzIuQF0KICogT3BlbnMgYW4gaW5zdGFsbGFibGUgY29tcHJlc3Nvci4gUmV0dXJuIHNwZWNpYWwgaGFuZGxlLgogKi8KSElDIFZGV0FQSSBJQ09wZW4oRFdPUkQgZmNjVHlwZSwgRFdPUkQgZmNjSGFuZGxlciwgVUlOVCB3TW9kZSkgCnsKICAgIFdDSEFSCQljb2RlY25hbWVbMTBdOwogICAgSUNPUEVOCQlpY29wZW47CiAgICBIRFJWUgkJaGRydjsKICAgIFdJTkVfSElDKiAgICAgICAgICAgd2hpYzsKICAgIEJPT0wgICAgICAgICAgICAgICAgYklzMTY7CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgIGRydjMyV1tdID0geydkJywncicsJ2knLCd2JywnZScsJ3InLCdzJywnMycsJzInLCdcMCd9OwogICAgcmVnX2RyaXZlciogICAgICAgICBkcml2ZXI7CgogICAgVFJBQ0UoIiglcywlcywweCUwOHgpXG4iLCB3aW5lX2RiZ3N0cl9mY2MoZmNjVHlwZSksIHdpbmVfZGJnc3RyX2ZjYyhmY2NIYW5kbGVyKSwgd01vZGUpOwoKICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgcmVnaXN0ZXJlZCBkcml2ZXIgdGhhdCBtYXRjaGVzICovCiAgICBkcml2ZXIgPSByZWdfZHJpdmVyX2xpc3Q7CiAgICB3aGlsZShkcml2ZXIpCiAgICAgICAgaWYgKCFjb21wYXJlX2ZvdXJjYyhmY2NUeXBlLCBkcml2ZXItPmZjY1R5cGUpICYmCiAgICAgICAgICAgICFjb21wYXJlX2ZvdXJjYyhmY2NIYW5kbGVyLCBkcml2ZXItPmZjY0hhbmRsZXIpKQoJICAgIGJyZWFrOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZHJpdmVyID0gZHJpdmVyLT5uZXh0OwoKICAgIGlmIChkcml2ZXIgJiYgZHJpdmVyLT5wcm9jKQoJLyogVGhlIGRyaXZlciBoYXMgYmVlbiByZWdpc3RlcmVkIGF0IHJ1bnRpbWUgd2l0aCBpdHMgZHJpdmVycHJvYyAqLwogICAgICAgIHJldHVybiBNU1ZJREVPX09wZW5GdW5jdGlvbihmY2NUeXBlLCBmY2NIYW5kbGVyLCB3TW9kZSwgKERSSVZFUlBST0MpZHJpdmVyLT5wcm9jLCAoRFdPUkQpTlVMTCk7CiAgCiAgICAvKiBXZWxsLCBsUGFyYW0yIGlzIGluIGZhY3QgYSBMUFZJREVPX09QRU5fUEFSTVMsIGJ1dCBpdCBoYXMgdGhlCiAgICAgKiBzYW1lIGxheW91dCBhcyBJQ09QRU4KICAgICAqLwogICAgaWNvcGVuLmR3U2l6ZQkJPSBzaXplb2YoSUNPUEVOKTsKICAgIGljb3Blbi5mY2NUeXBlCQk9IGZjY1R5cGU7CiAgICBpY29wZW4uZmNjSGFuZGxlcgkgICAgICAgID0gZmNjSGFuZGxlcjsKICAgIGljb3Blbi5kd1ZlcnNpb24gICAgICAgICAgICA9IDB4MDAwMDEwMDA7IC8qIEZJWE1FICovCiAgICBpY29wZW4uZHdGbGFncwkJPSB3TW9kZTsKICAgIGljb3Blbi5kd0Vycm9yICAgICAgICAgICAgICA9IDA7CiAgICBpY29wZW4ucFYxUmVzZXJ2ZWQgICAgICAgICAgPSBOVUxMOwogICAgaWNvcGVuLnBWMlJlc2VydmVkICAgICAgICAgID0gTlVMTDsKICAgIGljb3Blbi5kbkRldk5vZGUgICAgICAgICAgICA9IDA7IC8qIEZJWE1FICovCgkKICAgIGlmICghZHJpdmVyKSB7CiAgICAgICAgLyogVGhlIGRyaXZlciBpcyByZWdpc3RlcmVkIGluIHRoZSByZWdpc3RyeSAqLwoJZm91cmNjX3RvX3N0cmluZyhjb2RlY25hbWUsIGZjY1R5cGUpOwogICAgICAgIGNvZGVjbmFtZVs0XSA9ICcuJzsKCWZvdXJjY190b19zdHJpbmcoY29kZWNuYW1lICsgNSwgZmNjSGFuZGxlcik7CiAgICAgICAgY29kZWNuYW1lWzldID0gJ1wwJzsKCiAgICAgICAgaGRydiA9IE9wZW5Ecml2ZXIoY29kZWNuYW1lLCBkcnYzMlcsIChMUEFSQU0pJmljb3Blbik7CiAgICAgICAgaWYgKCFoZHJ2KSAKICAgICAgICB7CiAgICAgICAgICAgIGlmIChmY2NUeXBlID09IHN0cmVhbXR5cGVWSURFTykgCiAgICAgICAgICAgIHsKCQljb2RlY25hbWVbMF0gPSAndic7CgkJY29kZWNuYW1lWzFdID0gJ2knOwoJCWNvZGVjbmFtZVsyXSA9ICdkJzsKCQljb2RlY25hbWVbM10gPSAnYyc7CgoJCWZjY1R5cGUgPSBJQ1RZUEVfVklERU87CiAgICAgICAgICAgICAgICBoZHJ2ID0gT3BlbkRyaXZlcihjb2RlY25hbWUsIGRydjMyVywgKExQQVJBTSkmaWNvcGVuKTsKCSAgICB9CiAgICAgICAgICAgIGlmICghaGRydikKICAgICAgICAgICAgICAgIHJldHVybiAwOwoJfQogICAgfSBlbHNlIHsKICAgICAgICAvKiBUaGUgZHJpdmVyIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYXQgcnVudGltZSB3aXRoIGl0cyBuYW1lICovCiAgICAgICAgaGRydiA9IE9wZW5Ecml2ZXIoZHJpdmVyLT5uYW1lLCBOVUxMLCAoTFBBUkFNKSZpY29wZW4pOwogICAgICAgIGlmICghaGRydikgCiAgICAgICAgICAgIHJldHVybiAwOyAKICAgIH0KICAgIGJJczE2ID0gR2V0RHJpdmVyRmxhZ3MoaGRydikgJiAweDEwMDAwMDAwOyAvKiB1bmRvY3VtZW50ZWQgZmxhZzogV0lORV9HREZfMTZCSVQgKi8KCiAgICBpZiAoYklzMTYgJiYgIXBGbkNhbGxUbzE2KQogICAgewogICAgICAgIEZJWE1FKCJHb3QgYSAxNiBiaXQgZHJpdmVyLCBidXQgbm8gMTYgYml0IHN1cHBvcnQgaW4gbXN2ZndcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgd2hpYyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoV0lORV9ISUMpKTsKICAgIGlmICghd2hpYykKICAgIHsKICAgICAgICBDbG9zZURyaXZlcihoZHJ2LCAwLCAwKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICB3aGljLT5oZHJ2ICAgICAgICAgID0gaGRydjsKICAgIC8qIEZJWE1FOiBpcyB0aGUgc2lnbmF0dXJlIHRoZSByZWFsIG9uZSA/ICovCiAgICB3aGljLT5kcml2ZXJwcm9jICAgID0gYklzMTYgPyAoRFJJVkVSUFJPQylwRm5DYWxsVG8xNiA6IE5VTEw7CiAgICB3aGljLT5kcml2ZXJwcm9jMTYgID0gMDsKICAgIHdoaWMtPnR5cGUgICAgICAgICAgPSBmY2NUeXBlOwogICAgd2hpYy0+aGFuZGxlciAgICAgICA9IGZjY0hhbmRsZXI7CiAgICB3aGlsZSAoTVNWSURFT19HZXRIaWNQdHIoSElDXzMyKElDX0hhbmRsZVJlZikpICE9IE5VTEwpIElDX0hhbmRsZVJlZisrOwogICAgd2hpYy0+aGljICAgICAgICAgICA9IEhJQ18zMihJQ19IYW5kbGVSZWYrKyk7CiAgICB3aGljLT5uZXh0ICAgICAgICAgID0gTVNWSURFT19GaXJzdEhpYzsKICAgIE1TVklERU9fRmlyc3RIaWMgPSB3aGljOwoKICAgIFRSQUNFKCI9PiAlcFxuIiwgd2hpYy0+aGljKTsKICAgIHJldHVybiB3aGljLT5oaWM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTVNWSURFT19PcGVuRnVuY3Rpb24KICovCkhJQyBNU1ZJREVPX09wZW5GdW5jdGlvbihEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBVSU5UIHdNb2RlLCAKICAgICAgICAgICAgICAgICAgICAgICAgIERSSVZFUlBST0MgbHBmbkhhbmRsZXIsIERXT1JEIGxwZm5IYW5kbGVyMTYpIAp7CiAgICBJQ09QRU4gICAgICBpY29wZW47CiAgICBXSU5FX0hJQyogICB3aGljOwoKICAgIFRSQUNFKCIoJXMsJXMsJWQsJXAsJTA4bHgpXG4iLCAKICAgICAgICAgIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCB3TW9kZSwgbHBmbkhhbmRsZXIsIGxwZm5IYW5kbGVyMTYpOwoKICAgIGljb3Blbi5kd1NpemUJCT0gc2l6ZW9mKElDT1BFTik7CiAgICBpY29wZW4uZmNjVHlwZQkJPSBmY2NUeXBlOwogICAgaWNvcGVuLmZjY0hhbmRsZXIJICAgICAgICA9IGZjY0hhbmRsZXI7CiAgICBpY29wZW4uZHdWZXJzaW9uICAgICAgICAgICAgPSAweDAwMDAxMDAwOyAvKiBGSVhNRSAqLwogICAgaWNvcGVuLmR3RmxhZ3MJCT0gd01vZGU7CiAgICBpY29wZW4uZHdFcnJvciAgICAgICAgICAgICAgPSAwOwogICAgaWNvcGVuLnBWMVJlc2VydmVkICAgICAgICAgID0gTlVMTDsKICAgIGljb3Blbi5wVjJSZXNlcnZlZCAgICAgICAgICA9IE5VTEw7CiAgICBpY29wZW4uZG5EZXZOb2RlICAgICAgICAgICAgPSAwOyAvKiBGSVhNRSAqLwoKICAgIHdoaWMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKFdJTkVfSElDKSk7CiAgICBpZiAoIXdoaWMpIHJldHVybiAwOwoKICAgIHdoaWMtPmRyaXZlcnByb2MgICA9IGxwZm5IYW5kbGVyOwogICAgd2hpYy0+ZHJpdmVycHJvYzE2ID0gbHBmbkhhbmRsZXIxNjsKICAgIHdoaWxlIChNU1ZJREVPX0dldEhpY1B0cihISUNfMzIoSUNfSGFuZGxlUmVmKSkgIT0gTlVMTCkgSUNfSGFuZGxlUmVmKys7CiAgICB3aGljLT5oaWMgICAgICAgICAgPSBISUNfMzIoSUNfSGFuZGxlUmVmKyspOwogICAgd2hpYy0+bmV4dCAgICAgICAgID0gTVNWSURFT19GaXJzdEhpYzsKICAgIE1TVklERU9fRmlyc3RIaWMgPSB3aGljOwoKICAgIC8qIE5vdyB0cnkgb3BlbmluZy9sb2FkaW5nIHRoZSBkcml2ZXIuIFRha2VuIGZyb20gRFJJVkVSX0FkZFRvTGlzdCAqLwogICAgLyogV2hhdCBpZiB0aGUgZnVuY3Rpb24gaXMgdXNlZCBtb3JlIHRoYW4gb25jZT8gKi8KCiAgICBpZiAoTVNWSURFT19TZW5kTWVzc2FnZSh3aGljLCBEUlZfTE9BRCwgMEwsIDBMKSAhPSBEUlZfU1VDQ0VTUykgCiAgICB7CiAgICAgICAgV0FSTigiRFJWX0xPQUQgZmFpbGVkIGZvciBoaWMgJXBcbiIsIHdoaWMtPmhpYyk7CiAgICAgICAgTVNWSURFT19GaXJzdEhpYyA9IHdoaWMtPm5leHQ7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2hpYyk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAvKiByZXR1cm4gdmFsdWUgaXMgbm90IGNoZWNrZWQgKi8KICAgIE1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX0VOQUJMRSwgMEwsIDBMKTsKCiAgICB3aGljLT5kcml2ZXJJZCA9IChEV09SRClNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIERSVl9PUEVOLCAwLCAoRFdPUkQpJmljb3Blbik7CiAgICAvKiBGSVhNRTogV2hhdCBzaG91bGQgd2UgcHV0IGhlcmU/ICovCiAgICB3aGljLT5oZHJ2ID0gKEhEUlZSKTA7CiAgICAKICAgIGlmICh3aGljLT5kcml2ZXJJZCA9PSAwKSAKICAgIHsKICAgICAgICBXQVJOKCJEUlZfT1BFTiBmYWlsZWQgZm9yIGhpYyAlcFxuIiwgd2hpYy0+aGljKTsKICAgICAgICBNU1ZJREVPX0ZpcnN0SGljID0gd2hpYy0+bmV4dDsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3aGljKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBUUkFDRSgiPT4gJXBcbiIsIHdoaWMtPmhpYyk7CiAgICByZXR1cm4gd2hpYy0+aGljOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDT3BlbkZ1bmN0aW9uCQkJW01TVkZXMzIuQF0KICovCkhJQyBWRldBUEkgSUNPcGVuRnVuY3Rpb24oRFdPUkQgZmNjVHlwZSwgRFdPUkQgZmNjSGFuZGxlciwgVUlOVCB3TW9kZSwgRkFSUFJPQyBscGZuSGFuZGxlcikgCnsKICAgIHJldHVybiBNU1ZJREVPX09wZW5GdW5jdGlvbihmY2NUeXBlLCBmY2NIYW5kbGVyLCB3TW9kZSwgKERSSVZFUlBST0MpbHBmbkhhbmRsZXIsIDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDR2V0SW5mbwkJCVtNU1ZGVzMyLkBdCiAqLwpMUkVTVUxUIFZGV0FQSSBJQ0dldEluZm8oSElDIGhpYywgSUNJTkZPICpwaWNpbmZvLCBEV09SRCBjYikgCnsKICAgIExSRVNVTFQJcmV0OwogICAgV0lORV9ISUMqICAgd2hpYyA9IE1TVklERU9fR2V0SGljUHRyKGhpYyk7CgogICAgVFJBQ0UoIiglcCwlcCwlbGQpXG4iLCBoaWMsIHBpY2luZm8sIGNiKTsKCiAgICB3aGljID0gTVNWSURFT19HZXRIaWNQdHIoaGljKTsKICAgIGlmICghd2hpYykgcmV0dXJuIElDRVJSX0JBREhBTkRMRTsKICAgIGlmICghcGljaW5mbykgcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CgogICAgLyogKFdTKSBUaGUgZmllbGQgc3pEcml2ZXIgc2hvdWxkIGJlIGluaXRpYWxpemVkIGJlY2F1c2UgdGhlIGRyaXZlciAKICAgICAqIGlzIG5vdCBvYmxpZ2VkIGFuZCBvZnRlbiB3aWxsIG5vdCBkbyBpdC4gU29tZSBhcHBsaWNhdGlvbnMsIGxpa2UKICAgICAqIFZpcnR1YWxEdWIsIHJlbHkgb24gdGhpcyBmaWVsZCBhbmQgd2lsbCBvY2Nhc2lvbmFsbHkgY3Jhc2ggaWYgaXQKICAgICAqIGdvZXMgdW5pdGlhbGl6ZWQuCiAgICAgKi8KICAgIGlmIChjYiA+PSBzaXplb2YoSUNJTkZPKSkgcGljaW5mby0+c3pEcml2ZXJbMF0gPSAnXDAnOwoKICAgIHJldCA9IElDU2VuZE1lc3NhZ2UoaGljLCBJQ01fR0VUSU5GTywgKERXT1JEKXBpY2luZm8sIGNiKTsKCiAgICAvKiAoV1MpIFdoZW4gc3pEcml2ZXIgd2FzIG5vdCBzdXBwbGllZCBieSB0aGUgZHJpdmVyIGl0c2VsZiwgYXBwYXJlbnRseSAKICAgICAqIFdpbmRvd3Mgd2lsbCBzZXQgaXRzIHZhbHVlIGVxdWFsIHRvIHRoZSBkcml2ZXIgZmlsZSBuYW1lLiBUaGlzIGNhbgogICAgICogYmUgb2J0YWluZWQgZnJvbSB0aGUgcmVnaXN0cnkgYXMgd2UgZG8gaGVyZS4KICAgICAqLwogICAgaWYgKGNiID49IHNpemVvZihJQ0lORk8pICYmIHBpY2luZm8tPnN6RHJpdmVyWzBdID09IDApCiAgICB7CiAgICAgICAgSUNJTkZPICBpaTsKCiAgICAgICAgbWVtc2V0KCZpaSwgMCwgc2l6ZW9mKGlpKSk7CiAgICAgICAgaWkuZHdTaXplID0gc2l6ZW9mKGlpKTsKICAgICAgICBJQ0luZm8ocGljaW5mby0+ZmNjVHlwZSwgcGljaW5mby0+ZmNjSGFuZGxlciwgJmlpKTsKICAgICAgICBsc3RyY3B5VyhwaWNpbmZvLT5zekRyaXZlciwgaWkuc3pEcml2ZXIpOwogICAgfQoKICAgIFRSQUNFKCIJLT4gMHglMDhseFxuIiwgcmV0KTsKICAgIHJldHVybiByZXQ7Cn0KCnR5cGVkZWYgc3RydWN0IHsKICAgIERXT1JEIGZjY1R5cGU7CiAgICBEV09SRCBmY2NIYW5kbGVyOwogICAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlJbjsKICAgIExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0OwogICAgV09SRCB3TW9kZTsKICAgIERXT1JEIHF1ZXJ5bXNnOwogICAgSElDIGhpYzsKfSBkcml2ZXJfaW5mb190OwoKc3RhdGljIEhJQyB0cnlfZHJpdmVyKGRyaXZlcl9pbmZvX3QgKmluZm8pCnsKICAgIEhJQyAgIGhpYzsKCiAgICBpZiAoKGhpYyA9IElDT3BlbihpbmZvLT5mY2NUeXBlLCBpbmZvLT5mY2NIYW5kbGVyLCBpbmZvLT53TW9kZSkpKSAKICAgIHsKCWlmICghSUNTZW5kTWVzc2FnZShoaWMsIGluZm8tPnF1ZXJ5bXNnLCAoRFdPUkQpaW5mby0+bHBiaUluLCAoRFdPUkQpaW5mby0+bHBiaU91dCkpCgkgICAgcmV0dXJuIGhpYzsKCUlDQ2xvc2UoaGljKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdGF0aWMgQk9PTCBJQ0xvY2F0ZV9lbnVtX2hhbmRsZXIoY29uc3QgY2hhciAqZHJ2LCBpbnQgbnIsIHZvaWQgKnBhcmFtKQp7CiAgICBkcml2ZXJfaW5mb190ICppbmZvID0gKGRyaXZlcl9pbmZvX3QgKilwYXJhbTsKICAgIGluZm8tPmZjY0hhbmRsZXIgPSBtbWlvU3RyaW5nVG9GT1VSQ0NBKGRydiArIDUsIDApOwogICAgaW5mby0+aGljID0gdHJ5X2RyaXZlcihpbmZvKTsKICAgIHJldHVybiBpbmZvLT5oaWMgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0xvY2F0ZQkJCVtNU1ZGVzMyLkBdCiAqLwpISUMgVkZXQVBJIElDTG9jYXRlKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIExQQklUTUFQSU5GT0hFQURFUiBscGJpSW4sCiAgICAgICAgICAgICAgICAgICAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQsIFdPUkQgd01vZGUpCnsKICAgIGRyaXZlcl9pbmZvX3QgaW5mbzsKCiAgICBUUkFDRSgiKCVzLCVzLCVwLCVwLDB4JTA0eClcbiIsIAogICAgICAgICAgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIGxwYmlJbiwgbHBiaU91dCwgd01vZGUpOwoKICAgIGluZm8uZmNjVHlwZSA9IGZjY1R5cGU7CiAgICBpbmZvLmZjY0hhbmRsZXIgPSBmY2NIYW5kbGVyOwogICAgaW5mby5scGJpSW4gPSBscGJpSW47CiAgICBpbmZvLmxwYmlPdXQgPSBscGJpT3V0OwogICAgaW5mby53TW9kZSA9IHdNb2RlOwoKICAgIHN3aXRjaCAod01vZGUpIAogICAgewogICAgY2FzZSBJQ01PREVfRkFTVENPTVBSRVNTOgogICAgY2FzZSBJQ01PREVfQ09NUFJFU1M6CiAgICAgICAgaW5mby5xdWVyeW1zZyA9IElDTV9DT01QUkVTU19RVUVSWTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSUNNT0RFX0ZBU1RERUNPTVBSRVNTOgogICAgY2FzZSBJQ01PREVfREVDT01QUkVTUzoKICAgICAgICBpbmZvLnF1ZXJ5bXNnID0gSUNNX0RFQ09NUFJFU1NfUVVFUlk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElDTU9ERV9EUkFXOgogICAgICAgIGluZm8ucXVlcnltc2cgPSBJQ01fRFJBV19RVUVSWTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgV0FSTigiVW5rbm93biBtb2RlICglZClcbiIsIHdNb2RlKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBFYXN5IGNhc2U6IGhhbmRsZXIvdHlwZSBtYXRjaCwgd2UganVzdCBmaXJlIGEgcXVlcnkgYW5kIHJldHVybiAqLwogICAgaW5mby5oaWMgPSB0cnlfZHJpdmVyKCZpbmZvKTsKICAgIC8qIElmIGl0IGRpZG4ndCB3b3JrLCB0cnkgZWFjaCBkcml2ZXIgaW4gdHVybi4gMzIgYml0IGNvZGVjcyBvbmx5LiAqLwogICAgLyogRklYTUU6IE1vdmUgdGhpcyB0byBhbiBpbml0IHJvdXRpbmU/ICovCiAgICBpZiAoIWluZm8uaGljKSBlbnVtX2RyaXZlcnMoZmNjVHlwZSwgSUNMb2NhdGVfZW51bV9oYW5kbGVyLCAmaW5mbyk7CgogICAgaWYgKGluZm8uaGljKSAKICAgIHsKICAgICAgICBUUkFDRSgiPT4gJXBcbiIsIGluZm8uaGljKTsKCXJldHVybiBpbmZvLmhpYzsKICAgIH0KCiAgICBpZiAoZmNjVHlwZSA9PSBzdHJlYW10eXBlVklERU8pIAogICAgICAgIHJldHVybiBJQ0xvY2F0ZShJQ1RZUEVfVklERU8sIGZjY0hhbmRsZXIsIGxwYmlJbiwgbHBiaU91dCwgd01vZGUpOwogICAgCiAgICBXQVJOKCIoJXMsJXMsJXAsJXAsMHglMDR4KSBub3QgZm91bmQhXG4iLAogICAgICAgICB3aW5lX2RiZ3N0cl9mY2MoZmNjVHlwZSksIHdpbmVfZGJnc3RyX2ZjYyhmY2NIYW5kbGVyKSwgbHBiaUluLCBscGJpT3V0LCB3TW9kZSk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0dldERpc3BsYXlGb3JtYXQJCQlbTVNWRlczMi5AXQogKi8KSElDIFZGV0FQSSBJQ0dldERpc3BsYXlGb3JtYXQoCglISUMgaGljLExQQklUTUFQSU5GT0hFQURFUiBscGJpSW4sTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQsCglJTlQgZGVwdGgsSU5UIGR4LElOVCBkeSkKewoJSElDCXRtcGhpYyA9IGhpYzsKCglUUkFDRSgiKCVwLCVwLCVwLCVkLCVkLCVkKSFcbiIsaGljLGxwYmlJbixscGJpT3V0LGRlcHRoLGR4LGR5KTsKCglpZiAoIXRtcGhpYykgewoJCXRtcGhpYz1JQ0xvY2F0ZShJQ1RZUEVfVklERU8sMCxscGJpSW4sTlVMTCxJQ01PREVfREVDT01QUkVTUyk7CgkJaWYgKCF0bXBoaWMpCgkJCXJldHVybiB0bXBoaWM7Cgl9CglpZiAoKGR5ID09IGxwYmlJbi0+YmlIZWlnaHQpICYmIChkeCA9PSBscGJpSW4tPmJpV2lkdGgpKQoJCWR5ID0gZHggPSAwOyAvKiBubyByZXNpemUgbmVlZGVkICovCgoJLyogQ2FuIHdlIGRlY29tcHJlc3MgaXQgPyAqLwoJaWYgKElDRGVjb21wcmVzc1F1ZXJ5KHRtcGhpYyxscGJpSW4sTlVMTCkgIT0gMCkKCQlnb3RvIGVycm91dDsgLyogbm8sIHNvcnJ5ICovCgoJSUNEZWNvbXByZXNzR2V0Rm9ybWF0KHRtcGhpYyxscGJpSW4sbHBiaU91dCk7CgoJaWYgKGxwYmlPdXQtPmJpQ29tcHJlc3Npb24gIT0gMCkgewoJICAgRklYTUUoIk9vY2gsIGhvdyBjb21lIGRlY29tcHJlc3NvciBvdXRwdXRzIGNvbXByZXNzZWQgZGF0YSAoJWxkKT8/XG4iLAoJCQkgbHBiaU91dC0+YmlDb21wcmVzc2lvbik7Cgl9CglpZiAobHBiaU91dC0+YmlTaXplIDwgc2l6ZW9mKCpscGJpT3V0KSkgewoJICAgRklYTUUoIk9vY2gsIHNpemUgb2Ygb3V0cHV0IEJJSCBpcyB0b28gc21hbGwgKCVsZClcbiIsCgkJCSBscGJpT3V0LT5iaVNpemUpOwoJICAgbHBiaU91dC0+YmlTaXplID0gc2l6ZW9mKCpscGJpT3V0KTsKCX0KCWlmICghZGVwdGgpIHsKCQlIREMJaGRjOwoKCQloZGMgPSBHZXREQygwKTsKCQlkZXB0aCA9IEdldERldmljZUNhcHMoaGRjLEJJVFNQSVhFTCkqR2V0RGV2aWNlQ2FwcyhoZGMsUExBTkVTKTsKCQlSZWxlYXNlREMoMCxoZGMpOwoJCWlmIChkZXB0aD09MTUpCWRlcHRoID0gMTY7CgkJaWYgKGRlcHRoPDgpCWRlcHRoID0gIDg7Cgl9CglpZiAobHBiaUluLT5iaUJpdENvdW50ID09IDgpCgkJZGVwdGggPSA4OwoKCVRSQUNFKCI9PiAlcFxuIiwgdG1waGljKTsKCXJldHVybiB0bXBoaWM7CmVycm91dDoKCWlmIChoaWMhPXRtcGhpYykKCQlJQ0Nsb3NlKHRtcGhpYyk7CgoJVFJBQ0UoIj0+IDBcbiIpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNDb21wcmVzcwkJCVtNU1ZGVzMyLkBdCiAqLwpEV09SRCBWRldBUElWCklDQ29tcHJlc3MoCglISUMgaGljLERXT1JEIGR3RmxhZ3MsTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXRwdXQsTFBWT0lEIGxwRGF0YSwKCUxQQklUTUFQSU5GT0hFQURFUiBscGJpSW5wdXQsTFBWT0lEIGxwQml0cyxMUERXT1JEIGxwY2tpZCwKCUxQRFdPUkQgbHBkd0ZsYWdzLExPTkcgbEZyYW1lTnVtLERXT1JEIGR3RnJhbWVTaXplLERXT1JEIGR3UXVhbGl0eSwKCUxQQklUTUFQSU5GT0hFQURFUiBscGJpUHJldixMUFZPSUQgbHBQcmV2KQp7CglJQ0NPTVBSRVNTCWljY21wOwoKCVRSQUNFKCIoJXAsJWxkLCVwLCVwLCVwLCVwLC4uLilcbiIsaGljLGR3RmxhZ3MsbHBiaU91dHB1dCxscERhdGEsbHBiaUlucHV0LGxwQml0cyk7CgoJaWNjbXAuZHdGbGFncwkJPSBkd0ZsYWdzOwoKCWljY21wLmxwYmlPdXRwdXQJPSBscGJpT3V0cHV0OwoJaWNjbXAubHBPdXRwdXQJCT0gbHBEYXRhOwoJaWNjbXAubHBiaUlucHV0CQk9IGxwYmlJbnB1dDsKCWljY21wLmxwSW5wdXQJCT0gbHBCaXRzOwoKCWljY21wLmxwY2tpZAkJPSBscGNraWQ7CglpY2NtcC5scGR3RmxhZ3MJCT0gbHBkd0ZsYWdzOwoJaWNjbXAubEZyYW1lTnVtCQk9IGxGcmFtZU51bTsKCWljY21wLmR3RnJhbWVTaXplCT0gZHdGcmFtZVNpemU7CglpY2NtcC5kd1F1YWxpdHkJCT0gZHdRdWFsaXR5OwoJaWNjbXAubHBiaVByZXYJCT0gbHBiaVByZXY7CglpY2NtcC5scFByZXYJCT0gbHBQcmV2OwoJcmV0dXJuIElDU2VuZE1lc3NhZ2UoaGljLElDTV9DT01QUkVTUywoRFdPUkQpJmljY21wLHNpemVvZihpY2NtcCkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDRGVjb21wcmVzcwkJCVtNU1ZGVzMyLkBdCiAqLwpEV09SRCBWRldBUElWICBJQ0RlY29tcHJlc3MoSElDIGhpYyxEV09SRCBkd0ZsYWdzLExQQklUTUFQSU5GT0hFQURFUiBscGJpRm9ybWF0LAoJCQkJTFBWT0lEIGxwRGF0YSxMUEJJVE1BUElORk9IRUFERVIgbHBiaSxMUFZPSUQgbHBCaXRzKQp7CglJQ0RFQ09NUFJFU1MJaWNkOwoJRFdPUkQgcmV0OwoKCVRSQUNFKCIoJXAsJWxkLCVwLCVwLCVwLCVwKVxuIixoaWMsZHdGbGFncyxscGJpRm9ybWF0LGxwRGF0YSxscGJpLGxwQml0cyk7CgoJVFJBQ0UoImxwQml0c1swXSA9PSAlbHhcbiIsKChMUERXT1JEKWxwQml0cylbMF0pOwoKCWljZC5kd0ZsYWdzCT0gZHdGbGFnczsKCWljZC5scGJpSW5wdXQJPSBscGJpRm9ybWF0OwoJaWNkLmxwSW5wdXQJPSBscERhdGE7CgoJaWNkLmxwYmlPdXRwdXQJPSBscGJpOwoJaWNkLmxwT3V0cHV0CT0gbHBCaXRzOwoJaWNkLmNraWQJPSAwOwoJcmV0ID0gSUNTZW5kTWVzc2FnZShoaWMsSUNNX0RFQ09NUFJFU1MsKERXT1JEKSZpY2Qsc2l6ZW9mKElDREVDT01QUkVTUykpOwoKCVRSQUNFKCJscEJpdHNbMF0gPT0gJWx4XG4iLCgoTFBEV09SRClscEJpdHMpWzBdKTsKCglUUkFDRSgiLT4gJWxkXG4iLHJldCk7CgoJcmV0dXJuIHJldDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNDb21wcmVzc29yQ2hvb3NlICAgW01TVkZXMzIuQF0KICovCkJPT0wgVkZXQVBJIElDQ29tcHJlc3NvckNob29zZShIV05EIGh3bmQsIFVJTlQgdWlGbGFncywgTFBWT0lEIHB2SW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBEYXRhLCBQQ09NUFZBUlMgcGMsIExQU1RSIGxwc3pUaXRsZSkKewogIEZJWE1FKCIoJXAsMHglWCwlcCwlcCwlcCwlcyksc3R1YiFcbiIsaHduZCx1aUZsYWdzLHB2SW4sbHBEYXRhLHBjLGxwc3pUaXRsZSk7CgogIGlmIChwYyA9PSBOVUxMIHx8IHBjLT5jYlNpemUgIT0gc2l6ZW9mKENPTVBWQVJTKSkKICAgIHJldHVybiBGQUxTRTsKCiAgaWYgKChwYy0+ZHdGbGFncyAmIElDTUZfQ09NUFZBUlNfVkFMSUQpID09IDApIHsKICAgIHBjLT5kd0ZsYWdzICAgPSAwOwogICAgcGMtPmZjY1R5cGUgICA9IHBjLT5mY2NIYW5kbGVyID0gMDsKICAgIHBjLT5oaWMgICAgICAgPSBOVUxMOwogICAgcGMtPmxwYmlPdXQgICA9IE5VTEw7CiAgICBwYy0+bHBCaXRzT3V0ID0gcGMtPmxwQml0c1ByZXYgPSBwYy0+bHBTdGF0ZSA9IE5VTEw7CiAgICBwYy0+bFEgICAgICAgID0gSUNRVUFMSVRZX0RFRkFVTFQ7CiAgICBwYy0+bEtleSAgICAgID0gLTE7CiAgICBwYy0+bERhdGFSYXRlID0gMzAwOyAvKiBrQiAqLwogICAgcGMtPmxwU3RhdGUgICA9IE5VTEw7CiAgICBwYy0+Y2JTdGF0ZSAgID0gMDsKICB9CiAgaWYgKHBjLT5mY2NUeXBlID09IDApCiAgICBwYy0+ZmNjVHlwZSA9IElDVFlQRV9WSURFTzsKCiAgLyogRklYTUUgKi8KICAKICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDQ29tcHJlc3NvckZyZWUgICBbTVNWRlczMi5AXQogKi8Kdm9pZCBWRldBUEkgSUNDb21wcmVzc29yRnJlZShQQ09NUFZBUlMgcGMpCnsKICBUUkFDRSgiKCVwKVxuIixwYyk7CgogIGlmIChwYyAhPSBOVUxMICYmIHBjLT5jYlNpemUgPT0gc2l6ZW9mKENPTVBWQVJTKSkgewogICAgaWYgKHBjLT5oaWMgIT0gTlVMTCkgewogICAgICBJQ0Nsb3NlKHBjLT5oaWMpOwogICAgICBwYy0+aGljID0gTlVMTDsKICAgIH0KICAgIGlmIChwYy0+bHBiaU91dCAhPSBOVUxMKSB7CiAgICAgIEdsb2JhbEZyZWVQdHIocGMtPmxwYmlPdXQpOwogICAgICBwYy0+bHBiaU91dCA9IE5VTEw7CiAgICB9CiAgICBpZiAocGMtPmxwQml0c091dCAhPSBOVUxMKSB7CiAgICAgIEdsb2JhbEZyZWVQdHIocGMtPmxwQml0c091dCk7CiAgICAgIHBjLT5scEJpdHNPdXQgPSBOVUxMOwogICAgfQogICAgaWYgKHBjLT5scEJpdHNQcmV2ICE9IE5VTEwpIHsKICAgICAgR2xvYmFsRnJlZVB0cihwYy0+bHBCaXRzUHJldik7CiAgICAgIHBjLT5scEJpdHNQcmV2ID0gTlVMTDsKICAgIH0KICAgIGlmIChwYy0+bHBTdGF0ZSAhPSBOVUxMKSB7CiAgICAgIEdsb2JhbEZyZWVQdHIocGMtPmxwQml0c1ByZXYpOwogICAgICBwYy0+bHBTdGF0ZSA9IE5VTEw7CiAgICB9CiAgICBwYy0+ZHdGbGFncyA9IDA7CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTVNWSURFT19TZW5kTWVzc2FnZQogKgogKgogKi8KTFJFU1VMVCBNU1ZJREVPX1NlbmRNZXNzYWdlKFdJTkVfSElDKiB3aGljLCBVSU5UIG1zZywgRFdPUkQgbFBhcmFtMSwgRFdPUkQgbFBhcmFtMikKewogICAgTFJFU1VMVCAgICAgcmV0OwogICAgCiNkZWZpbmUgWFgoeCkgY2FzZSB4OiBUUkFDRSgiKCVwLCIjeCIsMHglMDhseCwweCUwOGx4KVxuIix3aGljLGxQYXJhbTEsbFBhcmFtMik7IGJyZWFrOwogICAgCiAgICBzd2l0Y2ggKG1zZykgewogICAgICAgIC8qIERSVl8qICovCiAgICAgICAgWFgoRFJWX0xPQUQpOwogICAgICAgIFhYKERSVl9FTkFCTEUpOwogICAgICAgIFhYKERSVl9PUEVOKTsKICAgICAgICBYWChEUlZfQ0xPU0UpOwogICAgICAgIFhYKERSVl9ESVNBQkxFKTsKICAgICAgICBYWChEUlZfRlJFRSk7CiAgICAgICAgLyogSUNNX1JFU0VSVkVEK1ggKi8KICAgICAgICBYWChJQ01fQUJPVVQpOwogICAgICAgIFhYKElDTV9DT05GSUdVUkUpOwogICAgICAgIFhYKElDTV9HRVQpOwogICAgICAgIFhYKElDTV9HRVRJTkZPKTsKICAgICAgICBYWChJQ01fR0VUREVGQVVMVFFVQUxJVFkpOwogICAgICAgIFhYKElDTV9HRVRRVUFMSVRZKTsKICAgICAgICBYWChJQ01fR0VUU1RBVEUpOwogICAgICAgIFhYKElDTV9TRVRRVUFMSVRZKTsKICAgICAgICBYWChJQ01fU0VUKTsKICAgICAgICBYWChJQ01fU0VUU1RBVEUpOwogICAgICAgIC8qIElDTV9VU0VSK1ggKi8KICAgICAgICBYWChJQ01fQ09NUFJFU1NfRlJBTUVTX0lORk8pOwogICAgICAgIFhYKElDTV9DT01QUkVTU19HRVRfRk9STUFUKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1NfR0VUX1NJWkUpOwogICAgICAgIFhYKElDTV9DT01QUkVTU19RVUVSWSk7CiAgICAgICAgWFgoSUNNX0NPTVBSRVNTX0JFR0lOKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1MpOwogICAgICAgIFhYKElDTV9DT01QUkVTU19FTkQpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX0dFVF9GT1JNQVQpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX1FVRVJZKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19CRUdJTik7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1MpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX0VORCk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NfU0VUX1BBTEVUVEUpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX0dFVF9QQUxFVFRFKTsKICAgICAgICBYWChJQ01fRFJBV19RVUVSWSk7CiAgICAgICAgWFgoSUNNX0RSQVdfQkVHSU4pOwogICAgICAgIFhYKElDTV9EUkFXX0dFVF9QQUxFVFRFKTsKICAgICAgICBYWChJQ01fRFJBV19TVEFSVCk7CiAgICAgICAgWFgoSUNNX0RSQVdfU1RPUCk7CiAgICAgICAgWFgoSUNNX0RSQVdfRU5EKTsKICAgICAgICBYWChJQ01fRFJBV19HRVRUSU1FKTsKICAgICAgICBYWChJQ01fRFJBVyk7CiAgICAgICAgWFgoSUNNX0RSQVdfV0lORE9XKTsKICAgICAgICBYWChJQ01fRFJBV19TRVRUSU1FKTsKICAgICAgICBYWChJQ01fRFJBV19SRUFMSVpFKTsKICAgICAgICBYWChJQ01fRFJBV19GTFVTSCk7CiAgICAgICAgWFgoSUNNX0RSQVdfUkVOREVSQlVGRkVSKTsKICAgICAgICBYWChJQ01fRFJBV19TVEFSVF9QTEFZKTsKICAgICAgICBYWChJQ01fRFJBV19TVE9QX1BMQVkpOwogICAgICAgIFhYKElDTV9EUkFXX1NVR0dFU1RGT1JNQVQpOwogICAgICAgIFhYKElDTV9EUkFXX0NIQU5HRVBBTEVUVEUpOwogICAgICAgIFhYKElDTV9HRVRCVUZGRVJTV0FOVEVEKTsKICAgICAgICBYWChJQ01fR0VUREVGQVVMVEtFWUZSQU1FUkFURSk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NFWF9CRUdJTik7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NFWF9RVUVSWSk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NFWCk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NFWF9FTkQpOwogICAgICAgIFhYKElDTV9TRVRfU1RBVFVTX1BST0MpOwogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiKCVwLDB4JTA4bHgsMHglMDhseCwweCUwOGx4KSB1bmtub3duIG1lc3NhZ2VcbiIsd2hpYywoRFdPUkQpbXNnLGxQYXJhbTEsbFBhcmFtMik7CiAgICB9CiAgICAKI3VuZGVmIFhYCiAgICAKICAgIGlmICh3aGljLT5kcml2ZXJwcm9jKSB7CgkvKiBkd0RyaXZlcklkIHBhcmFtZXRlciBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIERSVl9PUEVOICovCiAgICAgICAgcmV0ID0gd2hpYy0+ZHJpdmVycHJvYyh3aGljLT5kcml2ZXJJZCwgd2hpYy0+aGRydiwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0ID0gU2VuZERyaXZlck1lc3NhZ2Uod2hpYy0+aGRydiwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKICAgIH0KCiAgICBUUkFDRSgiCS0+IDB4JTA4bHhcbiIsIHJldCk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDU2VuZE1lc3NhZ2UJCQlbTVNWRlczMi5AXQogKi8KTFJFU1VMVCBWRldBUEkgSUNTZW5kTWVzc2FnZShISUMgaGljLCBVSU5UIG1zZywgRFdPUkQgbFBhcmFtMSwgRFdPUkQgbFBhcmFtMikgCnsKICAgIFdJTkVfSElDKiAgIHdoaWMgPSBNU1ZJREVPX0dldEhpY1B0cihoaWMpOwoKICAgIGlmICghd2hpYykgcmV0dXJuIElDRVJSX0JBREhBTkRMRTsKICAgIHJldHVybiBNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNEcmF3QmVnaW4JCVtNU1ZGVzMyLkBdCiAqLwpEV09SRCBWRldBUElWIElDRHJhd0JlZ2luKAoJSElDICAgICAgICAgICAgICAgIGhpYywgICAgIC8qIFtpbl0gKi8KCURXT1JEICAgICAgICAgICAgICBkd0ZsYWdzLCAvKiBbaW5dIGZsYWdzICovCglIUEFMRVRURSAgICAgICAgICAgaHBhbCwgICAgLyogW2luXSBwYWxldHRlIHRvIGRyYXcgd2l0aCAqLwoJSFdORCAgICAgICAgICAgICAgIGh3bmQsICAgIC8qIFtpbl0gd2luZG93IHRvIGRyYXcgdG8gKi8KCUhEQyAgICAgICAgICAgICAgICBoZGMsICAgICAvKiBbaW5dIEhEQyB0byBkcmF3IHRvICovCglJTlQgICAgICAgICAgICAgICAgeERzdCwgICAgLyogW2luXSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgKi8KCUlOVCAgICAgICAgICAgICAgICB5RHN0LCAgICAvKiBbaW5dICovCglJTlQgICAgICAgICAgICAgICAgZHhEc3QsICAgLyogW2luXSAqLwoJSU5UICAgICAgICAgICAgICAgIGR5RHN0LCAgIC8qIFtpbl0gKi8KCUxQQklUTUFQSU5GT0hFQURFUiBscGJpLCAgICAvKiBbaW5dIGZvcm1hdCBvZiBmcmFtZSB0byBkcmF3ICovCglJTlQgICAgICAgICAgICAgICAgeFNyYywgICAgLyogW2luXSBzb3VyY2UgcmVjdGFuZ2xlICovCglJTlQgICAgICAgICAgICAgICAgeVNyYywgICAgLyogW2luXSAqLwoJSU5UICAgICAgICAgICAgICAgIGR4U3JjLCAgIC8qIFtpbl0gKi8KCUlOVCAgICAgICAgICAgICAgICBkeVNyYywgICAvKiBbaW5dICovCglEV09SRCAgICAgICAgICAgICAgZHdSYXRlLCAgLyogW2luXSBmcmFtZXMvc2Vjb25kID0gKGR3UmF0ZS9kd1NjYWxlKSAqLwoJRFdPUkQgICAgICAgICAgICAgIGR3U2NhbGUpIC8qIFtpbl0gKi8KewoKCUlDRFJBV0JFR0lOCWljZGI7CgoJVFJBQ0UoIiglcCwlbGQsJXAsJXAsJXAsJXUsJXUsJXUsJXUsJXAsJXUsJXUsJXUsJXUsJWxkLCVsZClcbiIsCgkJICBoaWMsIGR3RmxhZ3MsIGhwYWwsIGh3bmQsIGhkYywgeERzdCwgeURzdCwgZHhEc3QsIGR5RHN0LAoJCSAgbHBiaSwgeFNyYywgeVNyYywgZHhTcmMsIGR5U3JjLCBkd1JhdGUsIGR3U2NhbGUpOwoKCWljZGIuZHdGbGFncyA9IGR3RmxhZ3M7CglpY2RiLmhwYWwgPSBocGFsOwoJaWNkYi5od25kID0gaHduZDsKCWljZGIuaGRjID0gaGRjOwoJaWNkYi54RHN0ID0geERzdDsKCWljZGIueURzdCA9IHlEc3Q7CglpY2RiLmR4RHN0ID0gZHhEc3Q7CglpY2RiLmR5RHN0ID0gZHlEc3Q7CglpY2RiLmxwYmkgPSBscGJpOwoJaWNkYi54U3JjID0geFNyYzsKCWljZGIueVNyYyA9IHlTcmM7CglpY2RiLmR4U3JjID0gZHhTcmM7CglpY2RiLmR5U3JjID0gZHlTcmM7CglpY2RiLmR3UmF0ZSA9IGR3UmF0ZTsKCWljZGIuZHdTY2FsZSA9IGR3U2NhbGU7CglyZXR1cm4gSUNTZW5kTWVzc2FnZShoaWMsSUNNX0RSQVdfQkVHSU4sKERXT1JEKSZpY2RiLHNpemVvZihpY2RiKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNEcmF3CQkJW01TVkZXMzIuQF0KICovCkRXT1JEIFZGV0FQSVYgSUNEcmF3KEhJQyBoaWMsIERXT1JEIGR3RmxhZ3MsIExQVk9JRCBscEZvcm1hdCwgTFBWT0lEIGxwRGF0YSwgRFdPUkQgY2JEYXRhLCBMT05HIGxUaW1lKSB7CglJQ0RSQVcJaWNkOwoKCVRSQUNFKCIoJXAsJWxkLCVwLCVwLCVsZCwlbGQpXG4iLGhpYyxkd0ZsYWdzLGxwRm9ybWF0LGxwRGF0YSxjYkRhdGEsbFRpbWUpOwoKCWljZC5kd0ZsYWdzID0gZHdGbGFnczsKCWljZC5scEZvcm1hdCA9IGxwRm9ybWF0OwoJaWNkLmxwRGF0YSA9IGxwRGF0YTsKCWljZC5jYkRhdGEgPSBjYkRhdGE7CglpY2QubFRpbWUgPSBsVGltZTsKCglyZXR1cm4gSUNTZW5kTWVzc2FnZShoaWMsSUNNX0RSQVcsKERXT1JEKSZpY2Qsc2l6ZW9mKGljZCkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDQ2xvc2UJCQlbTVNWRlczMi5AXQogKi8KTFJFU1VMVCBXSU5BUEkgSUNDbG9zZShISUMgaGljKQp7CiAgICBXSU5FX0hJQyogd2hpYyA9IE1TVklERU9fR2V0SGljUHRyKGhpYyk7CiAgICBXSU5FX0hJQyoqIHA7CgogICAgVFJBQ0UoIiglcClcbiIsaGljKTsKCiAgICBpZiAoIXdoaWMpIHJldHVybiBJQ0VSUl9CQURIQU5ETEU7CgogICAgaWYgKHdoaWMtPmRyaXZlcnByb2MpIAogICAgewogICAgICAgIE1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX0NMT1NFLCAwLCAwKTsKICAgICAgICBNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIERSVl9ESVNBQkxFLCAwLCAwKTsKICAgICAgICBNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIERSVl9GUkVFLCAwLCAwKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBDbG9zZURyaXZlcih3aGljLT5oZHJ2LCAwLCAwKTsKICAgIH0KCiAgICAvKiByZW1vdmUgd2hpYyBmcm9tIGxpc3QgKi8KICAgIGZvciAocCA9ICZNU1ZJREVPX0ZpcnN0SGljOyAqcCAhPSBOVUxMOyBwID0gJigoKnApLT5uZXh0KSkKICAgIHsKICAgICAgICBpZiAoKCpwKSA9PSB3aGljKQogICAgICAgIHsKICAgICAgICAgICAgKnAgPSB3aGljLT5uZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2hpYyk7CiAgICByZXR1cm4gMDsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDSW1hZ2VDb21wcmVzcwlbTVNWRlczMi5AXQogKi8KSEFORExFIFZGV0FQSSBJQ0ltYWdlQ29tcHJlc3MoCglISUMgaGljLCBVSU5UIHVpRmxhZ3MsCglMUEJJVE1BUElORk8gbHBiaUluLCBMUFZPSUQgbHBCaXRzLAoJTFBCSVRNQVBJTkZPIGxwYmlPdXQsIExPTkcgbFF1YWxpdHksCglMT05HKiBwbFNpemUpCnsKCUZJWE1FKCIoJXAsJTA4eCwlcCwlcCwlcCwlbGQsJXApXG4iLAoJCWhpYywgdWlGbGFncywgbHBiaUluLCBscEJpdHMsIGxwYmlPdXQsIGxRdWFsaXR5LCBwbFNpemUpOwoKCXJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDSW1hZ2VEZWNvbXByZXNzCVtNU1ZGVzMyLkBdCiAqLwoKSEFORExFIFZGV0FQSSBJQ0ltYWdlRGVjb21wcmVzcygKCUhJQyBoaWMsIFVJTlQgdWlGbGFncywgTFBCSVRNQVBJTkZPIGxwYmlJbiwKCUxQVk9JRCBscEJpdHMsIExQQklUTUFQSU5GTyBscGJpT3V0KQp7CglIR0xPQkFMCWhNZW0gPSBOVUxMOwoJQllURSoJcE1lbSA9IE5VTEw7CglCT09MCWJSZWxlYXNlSUMgPSBGQUxTRTsKCUJZVEUqCXBIZHIgPSBOVUxMOwoJVUxPTkcJY2JIZHIgPSAwOwoJQk9PTAliU3VjY2VlZGVkID0gRkFMU0U7CglCT09MCWJJbkRlY29tcHJlc3MgPSBGQUxTRTsKCURXT1JECWJpU2l6ZUltYWdlOwoKCVRSQUNFKCIoJXAsJTA4eCwlcCwlcCwlcClcbiIsCgkJaGljLCB1aUZsYWdzLCBscGJpSW4sIGxwQml0cywgbHBiaU91dCk7CgoJaWYgKCBoaWMgPT0gTlVMTCApCgl7CgkJaGljID0gSUNEZWNvbXByZXNzT3BlbiggSUNUWVBFX1ZJREVPLCAwLCAmbHBiaUluLT5ibWlIZWFkZXIsIChscGJpT3V0ICE9IE5VTEwpID8gJmxwYmlPdXQtPmJtaUhlYWRlciA6IE5VTEwgKTsKCQlpZiAoIGhpYyA9PSBOVUxMICkKCQl7CgkJCVdBUk4oIm5vIGhhbmRsZXJcbiIgKTsKCQkJZ290byBlcnI7CgkJfQoJCWJSZWxlYXNlSUMgPSBUUlVFOwoJfQoJaWYgKCB1aUZsYWdzICE9IDAgKQoJewoJCUZJWE1FKCAidW5rbm93biBmbGFnICUwOHhcbiIsIHVpRmxhZ3MgKTsKCQlnb3RvIGVycjsKCX0KCWlmICggbHBiaUluID09IE5VTEwgfHwgbHBCaXRzID09IE5VTEwgKQoJewoJCVdBUk4oImludmFsaWQgYXJndW1lbnRcbiIpOwoJCWdvdG8gZXJyOwoJfQoKCWlmICggbHBiaU91dCAhPSBOVUxMICkKCXsKCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaVNpemUgIT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICkKCQkJZ290byBlcnI7CgkJY2JIZHIgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CgkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9PSAzICkKCQkJY2JIZHIgKz0gc2l6ZW9mKERXT1JEKSozOwoJCWVsc2UKCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50IDw9IDggKQoJCXsKCQkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkID09IDAgKQoJCQkJY2JIZHIgKz0gc2l6ZW9mKFJHQlFVQUQpICogKDE8PGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50KTsKCQkJZWxzZQoJCQkJY2JIZHIgKz0gc2l6ZW9mKFJHQlFVQUQpICogbHBiaU91dC0+Ym1pSGVhZGVyLmJpQ2xyVXNlZDsKCQl9Cgl9CgllbHNlCgl7CgkJVFJBQ0UoICJnZXQgZm9ybWF0XG4iICk7CgoJCWNiSGRyID0gSUNEZWNvbXByZXNzR2V0Rm9ybWF0U2l6ZShoaWMsbHBiaUluKTsKCQlpZiAoIGNiSGRyIDwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICkKCQkJZ290byBlcnI7CgkJcEhkciA9IChCWVRFKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGNiSGRyK3NpemVvZihSR0JRVUFEKSoyNTYpOwoJCWlmICggcEhkciA9PSBOVUxMICkKCQkJZ290byBlcnI7CgkJWmVyb01lbW9yeSggcEhkciwgY2JIZHIrc2l6ZW9mKFJHQlFVQUQpKjI1NiApOwoJCWlmICggSUNEZWNvbXByZXNzR2V0Rm9ybWF0KCBoaWMsIGxwYmlJbiwgKEJJVE1BUElORk8qKXBIZHIgKSAhPSBJQ0VSUl9PSyApCgkJCWdvdG8gZXJyOwoJCWxwYmlPdXQgPSAoQklUTUFQSU5GTyopcEhkcjsKCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50IDw9IDggJiYKCQkJIElDRGVjb21wcmVzc0dldFBhbGV0dGUoIGhpYywgbHBiaUluLCBscGJpT3V0ICkgIT0gSUNFUlJfT0sgJiYKCQkJIGxwYmlJbi0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gbHBiaU91dC0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKQoJCXsKCQkJaWYgKCBscGJpSW4tPmJtaUhlYWRlci5iaUNsclVzZWQgPT0gMCApCgkJCQltZW1jcHkoIGxwYmlPdXQtPmJtaUNvbG9ycywgbHBiaUluLT5ibWlDb2xvcnMsIHNpemVvZihSR0JRVUFEKSooMTw8bHBiaU91dC0+Ym1pSGVhZGVyLmJpQml0Q291bnQpICk7CgkJCWVsc2UKCQkJCW1lbWNweSggbHBiaU91dC0+Ym1pQ29sb3JzLCBscGJpSW4tPmJtaUNvbG9ycywgc2l6ZW9mKFJHQlFVQUQpKmxwYmlJbi0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCApOwoJCX0KCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50IDw9IDggJiYKCQkJIGxwYmlPdXQtPmJtaUhlYWRlci5iaUNsclVzZWQgPT0gMCApCgkJCWxwYmlPdXQtPmJtaUhlYWRlci5iaUNsclVzZWQgPSAxPDxscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudDsKCgkJbHBiaU91dC0+Ym1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKCQljYkhkciA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArIHNpemVvZihSR0JRVUFEKSpscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkOwoJfQoKCWJpU2l6ZUltYWdlID0gbHBiaU91dC0+Ym1pSGVhZGVyLmJpU2l6ZUltYWdlOwoJaWYgKCBiaVNpemVJbWFnZSA9PSAwICkKCQliaVNpemVJbWFnZSA9ICgoKChscGJpT3V0LT5ibWlIZWFkZXIuYmlXaWR0aCAqIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50ICsgNykgPj4gMykgKyAzKSAmICh+MykpICogYWJzKGxwYmlPdXQtPmJtaUhlYWRlci5iaUhlaWdodCk7CgoJVFJBQ0UoICJjYWxsIElDRGVjb21wcmVzc0JlZ2luXG4iICk7CgoJaWYgKCBJQ0RlY29tcHJlc3NCZWdpbiggaGljLCBscGJpSW4sIGxwYmlPdXQgKSAhPSBJQ0VSUl9PSyApCgkJZ290byBlcnI7CgliSW5EZWNvbXByZXNzID0gVFJVRTsKCglUUkFDRSggImNiSGRyICVsZCwgYmlTaXplSW1hZ2UgJWxkXG4iLCBjYkhkciwgYmlTaXplSW1hZ2UgKTsKCgloTWVtID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEV8R01FTV9aRVJPSU5JVCwgY2JIZHIgKyBiaVNpemVJbWFnZSApOwoJaWYgKCBoTWVtID09IE5VTEwgKQoJewoJCVdBUk4oICJvdXQgb2YgbWVtb3J5XG4iICk7CgkJZ290byBlcnI7Cgl9CglwTWVtID0gKEJZVEUqKUdsb2JhbExvY2soIGhNZW0gKTsKCWlmICggcE1lbSA9PSBOVUxMICkKCQlnb3RvIGVycjsKCW1lbWNweSggcE1lbSwgbHBiaU91dCwgY2JIZHIgKTsKCglUUkFDRSggImNhbGwgSUNEZWNvbXByZXNzXG4iICk7CglpZiAoIElDRGVjb21wcmVzcyggaGljLCAwLCAmbHBiaUluLT5ibWlIZWFkZXIsIGxwQml0cywgJmxwYmlPdXQtPmJtaUhlYWRlciwgcE1lbStjYkhkciApICE9IElDRVJSX09LICkKCQlnb3RvIGVycjsKCgliU3VjY2VlZGVkID0gVFJVRTsKZXJyOgoJaWYgKCBiSW5EZWNvbXByZXNzICkKCQlJQ0RlY29tcHJlc3NFbmQoIGhpYyApOwoJaWYgKCBiUmVsZWFzZUlDICkKCQlJQ0Nsb3NlKGhpYyk7CglpZiAoIHBIZHIgIT0gTlVMTCApCgkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHBIZHIpOwoJaWYgKCBwTWVtICE9IE5VTEwgKQoJCUdsb2JhbFVubG9jayggaE1lbSApOwoJaWYgKCAhYlN1Y2NlZWRlZCAmJiBoTWVtICE9IE5VTEwgKQoJewoJCUdsb2JhbEZyZWUoaE1lbSk7IGhNZW0gPSBOVUxMOwoJfQoKCXJldHVybiAoSEFORExFKWhNZW07Cn0KCnN0YXRpYyBCT09MIEdldEZpbGVOYW1lUHJldmlldyhMUFZPSUQgbHBvZm4sQk9PTCBiU2F2ZSxCT09MIGJVbmljb2RlKQp7CiAgQ0hBUiAgICBzekZ1bmN0aW9uTmFtZVsyMF07CiAgQk9PTCAgICAoKmZuR2V0RmlsZU5hbWUpKExQVk9JRCk7CiAgSE1PRFVMRSBoQ29tZGxnMzI7CiAgQk9PTCAgICByZXQ7CgogIEZJWE1FKCIoJXAsJWQsJWQpLCBzZW1pLXN0dWIhXG4iLGxwb2ZuLGJTYXZlLGJVbmljb2RlKTsKCiAgbHN0cmNweUEoc3pGdW5jdGlvbk5hbWUsIChiU2F2ZSA/ICJHZXRTYXZlRmlsZU5hbWUiIDogIkdldE9wZW5GaWxlTmFtZSIpKTsKICBsc3RyY2F0QShzekZ1bmN0aW9uTmFtZSwgKGJVbmljb2RlID8gIlciIDogIkEiKSk7CgogIGhDb21kbGczMiA9IExvYWRMaWJyYXJ5QSgiQ09NRExHMzIuRExMIik7CiAgaWYgKGhDb21kbGczMiA9PSBOVUxMKQogICAgcmV0dXJuIEZBTFNFOwoKICBmbkdldEZpbGVOYW1lID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoQ29tZGxnMzIsIHN6RnVuY3Rpb25OYW1lKTsKICBpZiAoZm5HZXRGaWxlTmFtZSA9PSBOVUxMKQogICAgcmV0dXJuIEZBTFNFOwoKICAvKiBGSVhNRTogbmVlZCB0byBhZGQgT0ZOX0VOQUJMRUhPT0sgYW5kIG91ciBvd24gaGFuZGxlciAqLwogIHJldCA9IGZuR2V0RmlsZU5hbWUobHBvZm4pOwoKICBGcmVlTGlicmFyeShoQ29tZGxnMzIpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0T3BlbkZpbGVOYW1lUHJldmlld0EJW01TVkZXMzIuQF0KICovCkJPT0wgV0lOQVBJIEdldE9wZW5GaWxlTmFtZVByZXZpZXdBKExQT1BFTkZJTEVOQU1FQSBscG9mbikKewogIEZJWE1FKCIoJXApLCBzZW1pLXN0dWIhXG4iLCBscG9mbik7CgogIHJldHVybiBHZXRGaWxlTmFtZVByZXZpZXcobHBvZm4sIEZBTFNFLCBGQUxTRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0T3BlbkZpbGVOYW1lUHJldmlld1cJW01TVkZXMzIuQF0KICovCkJPT0wgV0lOQVBJIEdldE9wZW5GaWxlTmFtZVByZXZpZXdXKExQT1BFTkZJTEVOQU1FVyBscG9mbikKewogIEZJWE1FKCIoJXApLCBzZW1pLXN0dWIhXG4iLCBscG9mbik7CgogIHJldHVybiBHZXRGaWxlTmFtZVByZXZpZXcobHBvZm4sIEZBTFNFLCBUUlVFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTYXZlRmlsZU5hbWVQcmV2aWV3QQlbTVNWRlczMi5AXQogKi8KQk9PTCBXSU5BUEkgR2V0U2F2ZUZpbGVOYW1lUHJldmlld0EoTFBPUEVORklMRU5BTUVBIGxwb2ZuKQp7CiAgRklYTUUoIiglcCksIHNlbWktc3R1YiFcbiIsIGxwb2ZuKTsKCiAgcmV0dXJuIEdldEZpbGVOYW1lUHJldmlldyhscG9mbiwgVFJVRSwgRkFMU0UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFNhdmVGaWxlTmFtZVByZXZpZXdXCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFdJTkFQSSBHZXRTYXZlRmlsZU5hbWVQcmV2aWV3VyhMUE9QRU5GSUxFTkFNRVcgbHBvZm4pCnsKICBGSVhNRSgiKCVwKSwgc2VtaS1zdHViIVxuIiwgbHBvZm4pOwoKICByZXR1cm4gR2V0RmlsZU5hbWVQcmV2aWV3KGxwb2ZuLCBUUlVFLCBUUlVFKTsKfQo=