LyoKICoJTmF0aW9uYWwgTGFuZ3VhZ2UgU3VwcG9ydCBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib3B0aW9ucy5oIgojaW5jbHVkZSAid2ludmVyLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChzdHJpbmcpOwoKLyogTG9jYWxlIG5hbWUgdG8gaWQgbWFwLiB1c2VkIGJ5IEVudW1TeXN0ZW1Mb2NhbGVzLCBHZXRMb2NhbGVJbmZvQSAKICogTVVTVCBjb250YWluIGFsbCAjZGVmaW5lcyBmcm9tIHdpbm5scy5oCiAqIGxhc3QgZW50cnkgaGFzIE5VTEwgbmFtZSwgMCBpZC4KICovIAojZGVmaW5lIExPQ0FMRV9FTlRSWSh4KQl7I3gsTE9DQUxFXyMjeH0Kc3RhdGljIGNvbnN0IHN0cnVjdCB0YWdMT0NBTEVfTkFNRTJJRCB7CiAgICBjb25zdCBjaGFyCSpuYW1lOwogICAgTENUWVBFCWlkOwp9IGxvY2FsZV9uYW1lMmlkW109IHsKCUxPQ0FMRV9FTlRSWShJTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0VOR0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoSUNPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTRU5HQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRBTlNJQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTUFDQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKFNMSVNUKSwKCUxPQ0FMRV9FTlRSWShJTUVBU1VSRSksCglMT0NBTEVfRU5UUlkoU0RFQ0lNQUwpLAoJTE9DQUxFX0VOVFJZKFNUSE9VU0FORCksCglMT0NBTEVfRU5UUlkoU0dST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElORUdOVU1CRVIpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVESUdJVFMpLAoJTE9DQUxFX0VOVFJZKFNDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoU0lOVExTWU1CT0wpLAoJTE9DQUxFX0VOVFJZKFNNT05ERUNJTUFMU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhPVVNBTkRTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05HUk9VUElORyksCglMT0NBTEVfRU5UUlkoSUNVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElJTlRMQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUNVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShJTkVHQ1VSUiksCglMT0NBTEVfRU5UUlkoU0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FKSwKCUxPQ0FMRV9FTlRSWShTU0hPUlREQVRFKSwKCUxPQ0FMRV9FTlRSWShTTE9OR0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FRk9STUFUKSwKCUxPQ0FMRV9FTlRSWShJREFURSksCglMT0NBTEVfRU5UUlkoSUxEQVRFKSwKCUxPQ0FMRV9FTlRSWShJVElNRSksCglMT0NBTEVfRU5UUlkoSVRJTUVNQVJLUE9TTiksCglMT0NBTEVfRU5UUlkoSUNFTlRVUlkpLAoJTE9DQUxFX0VOVFJZKElUTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElEQVlMWkVSTyksCglMT0NBTEVfRU5UUlkoSU1PTkxaRVJPKSwKCUxPQ0FMRV9FTlRSWShTMTE1OSksCglMT0NBTEVfRU5UUlkoUzIzNTkpLAoJTE9DQUxFX0VOVFJZKElDQUxFTkRBUlRZUEUpLAoJTE9DQUxFX0VOVFJZKElPUFRJT05BTENBTEVOREFSKSwKCUxPQ0FMRV9FTlRSWShJRklSU1REQVlPRldFRUspLAoJTE9DQUxFX0VOVFJZKElGSVJTVFdFRUtPRllFQVIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU1BPU0lUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoU05FR0FUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoSVBPU1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElQT1NTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSVBPU1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKElORUdTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSU5FR1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKEZPTlRTSUdOQVRVUkUpLAoJTE9DQUxFX0VOVFJZKFNJU082MzlMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoU0lTTzMxNjZDVFJZTkFNRSksCgl7TlVMTCwwfQp9OwoKc3RhdGljIGNoYXIgKkdldExvY2FsZVN1YmtleU5hbWUoIERXT1JEIGxjdHlwZSApOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRVc2VyRGVmYXVsdExDSUQgKEtFUk5FTDMyLkApCiAqLwpMQ0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExDSUQodm9pZCkKewoJcmV0dXJuIE1BS0VMQ0lEKCBHZXRVc2VyRGVmYXVsdExhbmdJRCgpICwgU09SVF9ERUZBVUxUICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3lzdGVtRGVmYXVsdExDSUQgKEtFUk5FTDMyLkApCiAqLwpMQ0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TENJRCh2b2lkKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cn0KCiNkZWZpbmUgTkxTX01BWF9MQU5HVUFHRVMgMjAKdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciBsYW5nWzEyOF07CiAgICBjaGFyIGNvdW50cnlbMTI4XTsKICAgIExBTkdJRCBmb3VuZF9sYW5nX2lkW05MU19NQVhfTEFOR1VBR0VTXTsKICAgIGNoYXIgZm91bmRfbGFuZ3VhZ2VbTkxTX01BWF9MQU5HVUFHRVNdWzNdOwogICAgY2hhciBmb3VuZF9jb3VudHJ5W05MU19NQVhfTEFOR1VBR0VTXVszXTsKICAgIGludCBuX2ZvdW5kOwp9IExBTkdfRklORF9EQVRBOwoKc3RhdGljIEJPT0wgQ0FMTEJBQ0sgTkxTX0ZpbmRMYW5ndWFnZUlEX1Byb2NBKEhNT0RVTEUgaE1vZHVsZSwgTFBDU1RSIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbmFtZSwgV09SRCBMYW5nSUQsIExPTkcgbFBhcmFtKQp7CiAgICBMQU5HX0ZJTkRfREFUQSAqbF9kYXRhID0gKExBTkdfRklORF9EQVRBICopbFBhcmFtOwogICAgTENJRCBsY2lkID0gTUFLRUxDSUQoTGFuZ0lELCBTT1JUX0RFRkFVTFQpOwogICAgY2hhciBidWZfbGFuZ3VhZ2VbMTI4XTsKICAgIGNoYXIgYnVmX2NvdW50cnlbMTI4XTsKICAgIGNoYXIgYnVmX2VuX2xhbmd1YWdlWzEyOF07CgogICAgVFJBQ0UoIiUwNFhcbiIsIChVSU5UKUxhbmdJRCk7CiAgICBpZihQUklNQVJZTEFOR0lEKExhbmdJRCkgPT0gTEFOR19ORVVUUkFMKQogICAgICAgIHJldHVybiBUUlVFOyAvKiBjb250aW51ZSBzZWFyY2ggKi8KCiAgICBidWZfbGFuZ3VhZ2VbMF0gPSAwOwogICAgYnVmX2NvdW50cnlbMF0gPSAwOwoKICAgIEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TSVNPNjM5TEFOR05BTUV8TE9DQUxFX05PVVNFUk9WRVJSSURFLAogICAgICAgICAgICAgICAgICAgYnVmX2xhbmd1YWdlLCBzaXplb2YoYnVmX2xhbmd1YWdlKSk7CiAgICBUUkFDRSgiTE9DQUxFX1NJU082MzlMQU5HTkFNRTogJXNcbiIsIGJ1Zl9sYW5ndWFnZSk7CgogICAgR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NJU08zMTY2Q1RSWU5BTUV8TE9DQUxFX05PVVNFUk9WRVJSSURFLAogICAgICAgICAgICAgICAgICAgYnVmX2NvdW50cnksIHNpemVvZihidWZfY291bnRyeSkpOwogICAgVFJBQ0UoIkxPQ0FMRV9TSVNPMzE2NkNUUllOQU1FOiAlc1xuIiwgYnVmX2NvdW50cnkpOwoKICAgIGlmKGxfZGF0YS0+bGFuZyAmJiBzdHJsZW4obF9kYXRhLT5sYW5nKSA+IDAgJiYgIXN0cmNhc2VjbXAobF9kYXRhLT5sYW5nLCBidWZfbGFuZ3VhZ2UpKQogICAgewoJaWYobF9kYXRhLT5jb3VudHJ5ICYmIHN0cmxlbihsX2RhdGEtPmNvdW50cnkpID4gMCkKCXsKCSAgICBpZighc3RyY2FzZWNtcChsX2RhdGEtPmNvdW50cnksIGJ1Zl9jb3VudHJ5KSkKCSAgICB7CgkJbF9kYXRhLT5mb3VuZF9sYW5nX2lkWzBdID0gTGFuZ0lEOwoJCWxfZGF0YS0+bl9mb3VuZCA9IDE7CgkJVFJBQ0UoIkZvdW5kIGxhbmdfaWQgJTA0WCBmb3IgJXNfJXNcbiIsIExhbmdJRCwgbF9kYXRhLT5sYW5nLCBsX2RhdGEtPmNvdW50cnkpOwoJCXJldHVybiBGQUxTRTsgLyogc3RvcCBlbnVtZXJhdGlvbiAqLwoJICAgIH0KCX0KCWVsc2UgLyogbF9kYXRhLT5jb3VudHJ5IG5vdCBzcGVjaWZpZWQgKi8KCXsKCSAgICBpZihsX2RhdGEtPm5fZm91bmQgPCBOTFNfTUFYX0xBTkdVQUdFUykKCSAgICB7CgkJbF9kYXRhLT5mb3VuZF9sYW5nX2lkW2xfZGF0YS0+bl9mb3VuZF0gPSBMYW5nSUQ7CgkJc3RybmNweShsX2RhdGEtPmZvdW5kX2NvdW50cnlbbF9kYXRhLT5uX2ZvdW5kXSwgYnVmX2NvdW50cnksIDMpOwoJCXN0cm5jcHkobF9kYXRhLT5mb3VuZF9sYW5ndWFnZVtsX2RhdGEtPm5fZm91bmRdLCBidWZfbGFuZ3VhZ2UsIDMpOwoJCWxfZGF0YS0+bl9mb3VuZCsrOwoJCVRSQUNFKCJGb3VuZCBsYW5nX2lkICUwNFggZm9yICVzXG4iLCBMYW5nSUQsIGxfZGF0YS0+bGFuZyk7CgkJcmV0dXJuIFRSVUU7IC8qIGNvbnRpbnVlIHNlYXJjaCAqLwoJICAgIH0KCX0KICAgIH0KCiAgICAvKiBKdXN0IGluIGNhc2UsIGNoZWNrIExPQ0FMRV9TRU5HTEFOR1VBR0UgdG9vLAogICAgICogaW4gaG9wZSB0aGF0IHBvc3NpYmxlIGFsaWFzIG5hbWUgbWlnaHQgaGF2ZSB0aGF0IHZhbHVlLgogICAgICovCiAgICBidWZfZW5fbGFuZ3VhZ2VbMF0gPSAwOwogICAgR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NFTkdMQU5HVUFHRXxMT0NBTEVfTk9VU0VST1ZFUlJJREUsCiAgICAgICAgICAgICAgICAgICBidWZfZW5fbGFuZ3VhZ2UsIHNpemVvZihidWZfZW5fbGFuZ3VhZ2UpKTsKICAgIFRSQUNFKCJMT0NBTEVfU0VOR0xBTkdVQUdFOiAlc1xuIiwgYnVmX2VuX2xhbmd1YWdlKTsKCiAgICBpZihsX2RhdGEtPmxhbmcgJiYgc3RybGVuKGxfZGF0YS0+bGFuZykgPiAwICYmICFzdHJjYXNlY21wKGxfZGF0YS0+bGFuZywgYnVmX2VuX2xhbmd1YWdlKSkKICAgIHsKCWxfZGF0YS0+Zm91bmRfbGFuZ19pZFtsX2RhdGEtPm5fZm91bmRdID0gTGFuZ0lEOwoJc3RybmNweShsX2RhdGEtPmZvdW5kX2NvdW50cnlbbF9kYXRhLT5uX2ZvdW5kXSwgYnVmX2NvdW50cnksIDMpOwoJc3RybmNweShsX2RhdGEtPmZvdW5kX2xhbmd1YWdlW2xfZGF0YS0+bl9mb3VuZF0sIGJ1Zl9sYW5ndWFnZSwgMyk7CglsX2RhdGEtPm5fZm91bmQrKzsKCVRSQUNFKCJGb3VuZCBsYW5nX2lkICUwNFggZm9yICVzXG4iLCBMYW5nSUQsIGxfZGF0YS0+bGFuZyk7CiAgICB9CgogICAgcmV0dXJuIFRSVUU7IC8qIGNvbnRpbnVlIHNlYXJjaCAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5MU19HZXRMYW5ndWFnZUlECiAqCiAqIElOUFVUOgogKglMYW5nOiBhIHN0cmluZyB3aG9zZSB0d28gZmlyc3QgY2hhcnMgYXJlIHRoZSBpc28gbmFtZSBvZiBhIGxhbmd1YWdlLgogKglDb3VudHJ5OiBhIHN0cmluZyB3aG9zZSB0d28gZmlyc3QgY2hhcnMgYXJlIHRoZSBpc28gbmFtZSBvZiBjb3VudHJ5CiAqCUNoYXJzZXQ6IGEgc3RyaW5nIGRlZmluaW5nIHRoZSBjaG9zc2VuIGNoYXJzZXQgZW5jb2RpbmcKICoJRGlhbGVjdDogYSBzdHJpbmcgZGVmaW5pbmcgYSB2YXJpYXRpb24gb2YgdGhlIGxvY2FsZQogKgogKglhbGwgdGhvc2UgdmFsdWVzIGFyZSBmcm9tIHRoZSBzdGFuZGFyZGl6ZWQgZm9ybWF0IG9mIGxvY2FsZQogKgluYW1lIGluIHVuaXggd2hpY2ggaXM6IExhbmdbX0NvdW50cnldWy5DaGFyc2V0XVtARGlhbGVjdF0KICoKICogUkVUVVJOUzoKICoJdGhlIG51bWVyaWMgY29kZSBvZiB0aGUgbGFuZ3VhZ2UgdXNlZCBieSBXaW5kb3dzCiAqCiAqIEZJWE1FOiBDaGFyc2V0IGFuZCBEaWFsZWN0IGFyZSBub3QgaGFuZGxlZAogKi8Kc3RhdGljIExBTkdJRCBOTFNfR2V0TGFuZ3VhZ2VJRChMUENTVFIgTGFuZywgTFBDU1RSIENvdW50cnksIExQQ1NUUiBDaGFyc2V0LCBMUENTVFIgRGlhbGVjdCkKewogICAgTEFOR19GSU5EX0RBVEEgbF9kYXRhOwogICAgY2hhciBsYW5nX3N0cmluZ1syNTZdOwoKICAgIGlmKCFMYW5nKQogICAgewoJbF9kYXRhLmZvdW5kX2xhbmdfaWRbMF0gPSBNQUtFTEFOR0lEKExBTkdfRU5HTElTSCwgU1VCTEFOR19ERUZBVUxUKTsKCWdvdG8gRU5EOwogICAgfQoKICAgIG1lbXNldCgmbF9kYXRhLCAwLCBzaXplb2YoTEFOR19GSU5EX0RBVEEpKTsKICAgIHN0cm5jcHkobF9kYXRhLmxhbmcsIExhbmcsIHNpemVvZihsX2RhdGEubGFuZykpOwoKICAgIGlmKENvdW50cnkgJiYgc3RybGVuKENvdW50cnkpID4gMCkKCXN0cm5jcHkobF9kYXRhLmNvdW50cnksIENvdW50cnksIHNpemVvZihsX2RhdGEuY291bnRyeSkpOwoKICAgIEVudW1SZXNvdXJjZUxhbmd1YWdlc0EoR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgUlRfU1RSSU5HQSwKCShMUENTVFIpTE9DQUxFX0lMQU5HVUFHRSwgTkxTX0ZpbmRMYW5ndWFnZUlEX1Byb2NBLCAoTE9ORykmbF9kYXRhKTsKCiAgICBzdHJjcHkobGFuZ19zdHJpbmcsIGxfZGF0YS5sYW5nKTsKICAgIGlmKGxfZGF0YS5jb3VudHJ5ICYmIHN0cmxlbihsX2RhdGEuY291bnRyeSkgPiAwKQogICAgewoJc3RyY2F0KGxhbmdfc3RyaW5nLCAiXyIpOwoJc3RyY2F0KGxhbmdfc3RyaW5nLCBsX2RhdGEuY291bnRyeSk7CiAgICB9CgogICAgaWYoIWxfZGF0YS5uX2ZvdW5kKQogICAgewoJaWYobF9kYXRhLmNvdW50cnkgJiYgc3RybGVuKGxfZGF0YS5jb3VudHJ5KSA+IDApCgl7CgkgICAgTUVTU0FHRSgiV2FybmluZzogTGFuZ3VhZ2UgJyVzJyB3YXMgbm90IGZvdW5kLCByZXRyeWluZyB3aXRob3V0IGNvdW50cnkgbmFtZS4uLlxuIiwgbGFuZ19zdHJpbmcpOwoJICAgIGxfZGF0YS5jb3VudHJ5WzBdID0gMDsKCSAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXNBKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR0EsCgkJKExQQ1NUUilMT0NBTEVfSUxBTkdVQUdFLCBOTFNfRmluZExhbmd1YWdlSURfUHJvY0EsIChMT05HKSZsX2RhdGEpOwoJfQogICAgfQoKICAgIC8qIFJlLWV2YWx1YXRlIGxhbmdfc3RyaW5nICovCiAgICBzdHJjcHkobGFuZ19zdHJpbmcsIGxfZGF0YS5sYW5nKTsKICAgIGlmKGxfZGF0YS5jb3VudHJ5ICYmIHN0cmxlbihsX2RhdGEuY291bnRyeSkgPiAwKQogICAgewoJc3RyY2F0KGxhbmdfc3RyaW5nLCAiXyIpOwoJc3RyY2F0KGxhbmdfc3RyaW5nLCBsX2RhdGEuY291bnRyeSk7CiAgICB9CgogICAgaWYoIWxfZGF0YS5uX2ZvdW5kKQogICAgewoJTUVTU0FHRSgiV2FybmluZzogTGFuZ3VhZ2UgJyVzJyB3YXMgbm90IHJlY29nbml6ZWQsIGRlZmF1bHRpbmcgdG8gRW5nbGlzaFxuIiwgbGFuZ19zdHJpbmcpOwoJbF9kYXRhLmZvdW5kX2xhbmdfaWRbMF0gPSBNQUtFTEFOR0lEKExBTkdfRU5HTElTSCwgU1VCTEFOR19ERUZBVUxUKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWlmKGxfZGF0YS5uX2ZvdW5kID09IDEpCgkgICAgVFJBQ0UoIkZvciBsYW5ndWFnZSAnJXMnIGxhbmdfaWQgJTA0WCB3YXMgZm91bmRcbiIsIGxhbmdfc3RyaW5nLCBsX2RhdGEuZm91bmRfbGFuZ19pZFswXSk7CgllbHNlIC8qIGxfZGF0YS0+bl9mb3VuZCA+IDEgKi8KCXsKCSAgICBpbnQgaTsKCSAgICBNRVNTQUdFKCJGb3IgbGFuZ3VhZ2UgJyVzJyBzZXZlcmFsIGxhbmd1YWdlIGlkcyB3ZXJlIGZvdW5kOlxuIiwgbGFuZ19zdHJpbmcpOwoJICAgIGZvcihpID0gMDsgaSA8IGxfZGF0YS5uX2ZvdW5kOyBpKyspCgkJTUVTU0FHRSgiJXNfJXMgLSAlMDRYOyAiLCBsX2RhdGEuZm91bmRfbGFuZ3VhZ2VbaV0sIGxfZGF0YS5mb3VuZF9jb3VudHJ5W2ldLCBsX2RhdGEuZm91bmRfbGFuZ19pZFtpXSk7CgoJICAgIE1FU1NBR0UoIlxuSW5zdGVhZCBvZiB1c2luZyBmaXJzdCBpbiB0aGUgbGlzdCwgc3VnZ2VzdCB0byBkZWZpbmVcbiIKCQkgICAgInlvdXIgTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZSBsaWtlIHRoaXM6IExBTkc9JXNfJXNcbiIsCgkJICAgIGxfZGF0YS5mb3VuZF9sYW5ndWFnZVswXSwgbF9kYXRhLmZvdW5kX2NvdW50cnlbMF0pOwoJfQogICAgfQpFTkQ6CiAgICBUUkFDRSgiUmV0dXJuaW5nICUwNFhcbiIsIGxfZGF0YS5mb3VuZF9sYW5nX2lkWzBdKTsKICAgIHJldHVybiBsX2RhdGEuZm91bmRfbGFuZ19pZFswXTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRVc2VyRGVmYXVsdExhbmdJRCAoS0VSTkVMMzIuQCkKICovCkxBTkdJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMYW5nSUQodm9pZCkKewoJLyogY2FjaGluZyByZXN1bHQsIGlmIGRlZmluZWQgZnJvbSBlbnZpcm9ubWVudCwgd2hpY2ggc2hvdWxkICg/KSBub3QgY2hhbmdlIGR1cmluZyBhIFdJTkUgc2Vzc2lvbiAqLwoJc3RhdGljCUxBTkdJRAl1c2VyTENJRCA9IDA7CgoJaWYgKHVzZXJMQ0lEID09IDApCiAgICAgICAgewogICAgICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKCQljaGFyICpsYW5nLCpjb3VudHJ5LCpjaGFyc2V0LCpkaWFsZWN0LCpuZXh0OwoKCQlpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoICJMQU5HVUFHRSIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgKSkgZ290byBvazsKCQlpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoICJMQU5HIiwgYnVmLCBzaXplb2YoYnVmKSApKSBnb3RvIG9rOwoJCWlmIChHZXRFbnZpcm9ubWVudFZhcmlhYmxlQSggIkxDX0FMTCIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgKSkgZ290byBvazsKCQlpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoICJMQ19NRVNTQUdFUyIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgKSkgZ290byBvazsKCQlpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoICJMQ19DVFlQRSIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgKSkgZ290byBvazsKCgkJcmV0dXJuIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCiAgICAgICAgb2s6CgkJaWYgKCFzdHJjbXAoYnVmLCJQT1NJWCIpIHx8ICFzdHJjbXAoYnVmLCJDIikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQkKCQlsYW5nPWJ1ZjsKCQkKCQlkbyB7CgkJCW5leHQ9c3RyY2hyKGxhbmcsJzonKTsgaWYgKG5leHQpICpuZXh0Kys9J1wwJzsKCQkJZGlhbGVjdD1zdHJjaHIobGFuZywnQCcpOyBpZiAoZGlhbGVjdCkgKmRpYWxlY3QrKz0nXDAnOwoJCQljaGFyc2V0PXN0cmNocihsYW5nLCcuJyk7IGlmIChjaGFyc2V0KSAqY2hhcnNldCsrPSdcMCc7CgkJCWNvdW50cnk9c3RyY2hyKGxhbmcsJ18nKTsgaWYgKGNvdW50cnkpICpjb3VudHJ5Kys9J1wwJzsKCQkJCgkJCXVzZXJMQ0lEID0gTkxTX0dldExhbmd1YWdlSUQobGFuZywgY291bnRyeSwgY2hhcnNldCwgZGlhbGVjdCk7CgkJCQoJCQlsYW5nPW5leHQ7CgkJfSB3aGlsZSAobGFuZyAmJiAhdXNlckxDSUQpOwoKCQlpZiAoIXVzZXJMQ0lEKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE1FU1NBR0UoICJXYXJuaW5nOiBsYW5ndWFnZSAnJXMnIG5vdCByZWNvZ25pemVkLCBkZWZhdWx0aW5nIHRvIEVuZ2xpc2hcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICk7CiAgICAgICAgICAgICAgICAgICAgdXNlckxDSUQgPSBNQUtFTEFOR0lEKCBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCApOwogICAgICAgICAgICAgICAgfQoJfQoJcmV0dXJuIHVzZXJMQ0lEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN5c3RlbURlZmF1bHRMYW5nSUQgKEtFUk5FTDMyLkApCiAqLwpMQU5HSUQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMYW5nSUQodm9pZCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbnZlcnREZWZhdWx0TG9jYWxlIChLRVJORUwzMi5AKQogKi8KTENJRCBXSU5BUEkgQ29udmVydERlZmF1bHRMb2NhbGUgKExDSUQgbGNpZCkKewlzd2l0Y2ggKGxjaWQpCgl7ICBjYXNlIExPQ0FMRV9TWVNURU1fREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIExPQ0FMRV9VU0VSX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgTE9DQUxFX05FVVRSQUw6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfSAgCglyZXR1cm4gTUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsY2lkKSwgU1VCTEFOR19ORVVUUkFMKTsKfQoKLyogRW5oYW5jZWQgdmVyc2lvbiBvZiBMb2FkU3RyaW5nVy4KICogSXQgdGFrZXMgTGFuZ3VhZ2VJZCB0byBmaW5kIGFuZCBsb2FkIGxhbmd1YWdlIGRlcGVuZGFudCByZXNvdXJjZXMuCiAqIFJlc291cmNlIGlzIGNvcGllZCBhcyBpczogImJpbmFyeSIgc3RyaW5ncyBhcmUgbm90IHRydW5jYXRlZC4KICogUmV0dXJuOiBsZW5ndGggb2YgcmVzb3VyY2UgKyAxIHRvIGRpc3Rpbmd1aXNoIGFic2VudCByZXNvdXJjZXMKICogZnJvbSB0aGUgcmVzb3VyY2VzIHdpdGggemVybyBsZW5ndGguCiAqLwpzdGF0aWMgSU5UIE5MU19Mb2FkU3RyaW5nRXhXKEhNT0RVTEUgaE1vZHVsZSwgTEFOR0lEIGxhbmdfaWQsIFVJTlQgcmVzX2lkLCBMUFdTVFIgYnVmZmVyLCBJTlQgYnVmbGVuKQp7CiAgICBIUlNSQyBocnNyYzsKICAgIEhHTE9CQUwgaG1lbTsKICAgIFdDSEFSICpwOwogICAgaW50IHN0cmluZ19udW07CiAgICBpbnQgaTsKCiAgICAvKiBSZXBsYWNlIFNVQkxBTkdfTkVVVFJBTCBieSBTVUJMQU5HX0RFRkFVTFQgKi8KICAgIGlmKFNVQkxBTkdJRChsYW5nX2lkKSA9PSBTVUJMQU5HX05FVVRSQUwpCiAgICAgICAgbGFuZ19pZCA9IE1BS0VMQU5HSUQoUFJJTUFSWUxBTkdJRChsYW5nX2lkKSwgU1VCTEFOR19ERUZBVUxUKTsKCiAgICBocnNyYyA9IEZpbmRSZXNvdXJjZUV4VyhoTW9kdWxlLCBSVF9TVFJJTkdXLCAoTFBDV1NUUikoKHJlc19pZCA+PiA0KSArIDEpLCBsYW5nX2lkKTsKCiAgICBpZighaHJzcmMpIHJldHVybiAwOwogICAgaG1lbSA9IExvYWRSZXNvdXJjZShoTW9kdWxlLCBocnNyYyk7CiAgICBpZighaG1lbSkgcmV0dXJuIDA7CiAgICAKICAgIHAgPSBMb2NrUmVzb3VyY2UoaG1lbSk7CiAgICBzdHJpbmdfbnVtID0gcmVzX2lkICYgMHgwMDBmOwogICAgZm9yKGkgPSAwOyBpIDwgc3RyaW5nX251bTsgaSsrKQoJcCArPSAqcCArIDE7CiAgICAKICAgIFRSQUNFKCJzdHJsZW4gPSAlZFxuIiwgKGludCkqcCApOwogICAgCiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAqcDsKICAgIGkgPSBtaW4oYnVmbGVuIC0gMSwgKnApOwogICAgaWYgKGkgPiAwKSB7CgltZW1jcHkoYnVmZmVyLCBwICsgMSwgaSAqIHNpemVvZiAoV0NIQVIpKTsKCWJ1ZmZlcltpXSA9IChXQ0hBUikgMDsKICAgIH0gZWxzZSB7CglpZiAoYnVmbGVuID4gMSkKCSAgICBidWZmZXJbMF0gPSAoV0NIQVIpIDA7CiAgICB9CgogICAgRnJlZVJlc291cmNlKGhtZW0pOwogICAgVFJBQ0UoIiVzIGxvYWRlZCFcbiIsIGRlYnVnc3RyX3coYnVmZmVyKSk7CiAgICByZXR1cm4gKGkgKyAxKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0TG9jYWxlSW5mb0EgKEtFUk5FTDMyLkApCiAqCiAqIE5PVEVTIAogKiAgTEFOR19ORVVUUkFMIGlzIGVxdWFsIHRvIExPQ0FMRV9TWVNURU1fREVGQVVMVAogKgogKiAgTVMgb25saW5lIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgdGhlIHN0cmluZyByZXR1cm5lZCBpcyBOVUxMIHRlcm1pbmF0ZWQKICogIGV4Y2VwdCBmb3IgTE9DQUxFX0ZPTlRTSUdOQVRVUkUgIHdoaWNoICJ3aWxsIHJldHVybiBhIG5vbi1OVUxMCiAqICB0ZXJtaW5hdGVkIHN0cmluZyIuCiAqLwpJTlQgV0lOQVBJIEdldExvY2FsZUluZm9BKExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQU1RSIGJ1ZixJTlQgbGVuKQp7CiAgICBMUENTVFIgIHJldFN0cmluZyA9IE5VTEw7CiAgICBpbnQJZm91bmQgPSAwLCBpOwogICAgY2hhciAgICAqcGFjS2V5OwogICAgY2hhciAgICBhY0J1ZmZlclsxMjhdOwogICAgRFdPUkQgICBkd0J1ZmZlclNpemU9MTI4OwogICAgQk9PTCBOb1VzZXJPdmVycmlkZTsKCiAgVFJBQ0UoIihsY2lkPTB4JWx4LGxjdHlwZT0weCVseCwlcCwleClcbiIsbGNpZCxMQ1R5cGUsYnVmLGxlbik7CgogIGlmIChsZW4gJiYgKCEgYnVmKSApIHsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAobGNpZCA9PSBMT0NBTEVfTkVVVFJBTCB8fCBsY2lkID09IExBTkdfU1lTVEVNX0RFRkFVTFQpCgl7CiAgICAgICAgICAgIGxjaWQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJfSAKCWVsc2UgaWYgKGxjaWQgPT0gTEFOR19VU0VSX0RFRkFVTFQpIC8qMHg4MDAqLwoJewogICAgICAgICAgICBsY2lkID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cgl9CgogICAgLyogTE9DQUxFX05PVVNFUk9WRVJSSURFIG1lYW5zOiBkbyBub3QgZ2V0IHVzZXIgcmVkZWZpbmVkIHNldHRpbmdzCiAgICAgICBmcm9tIHRoZSByZWdpc3RyeS4gSW5zdGVhZCwgdXNlIHN5c3RlbSBkZWZhdWx0IHZhbHVlcy4gKi8KICAgIE5vVXNlck92ZXJyaWRlID0gKExDVHlwZSAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIT0gMDsKCglMQ1R5cGUgJj0gfihMT0NBTEVfTk9VU0VST1ZFUlJJREV8TE9DQUxFX1VTRV9DUF9BQ1ApOwoKICAgIC8qIEZpcnN0LCBjaGVjayBpZiBpdCdzIGluIHRoZSByZWdpc3RyeS4gKi8KICAgIC8qIEFsbCB1c2VyIGN1c3RvbWl6ZWQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHJlZ2lzdHJ5IGJ5IFNldExvY2FsZUluZm8gKi8KICAgIGlmICggIU5vVXNlck92ZXJyaWRlICYmIChwYWNLZXkgPSBHZXRMb2NhbGVTdWJrZXlOYW1lKExDVHlwZSkpICkKICAgIHsKICAgICAgICBjaGFyICAgIGFjUmVhbEtleVsxMjhdOwogICAgICAgIEhLRVkgICAgaEtleTsKCiAgICAgICAgc3ByaW50ZiggYWNSZWFsS2V5LCAiQ29udHJvbCBQYW5lbFxcSW50ZXJuYXRpb25hbFxcJXMiLCBwYWNLZXkgKTsKCiAgICAgICAgaWYgKCBSZWdPcGVuS2V5RXhBKCBIS0VZX0NVUlJFTlRfVVNFUiwgYWNSZWFsS2V5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEtFWV9SRUFELCAmaEtleSkgPT0gRVJST1JfU1VDQ0VTUyApCiAgICAgICAgewogICAgICAgICAgICBpZiAoIFJlZ1F1ZXJ5VmFsdWVFeEEoIGhLZXksIE5VTEwsIE5VTEwsIE5VTEwsIChMUEJZVEUpYWNCdWZmZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkd0J1ZmZlclNpemUgKSA9PSBFUlJPUl9TVUNDRVNTICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gYWNCdWZmZXI7CiAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUmVnQ2xvc2VLZXkoaEtleSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIElmIG5vdCBpbiB0aGUgcmVnaXN0cnksIGdldCBpdCBmcm9tIHRoZSBOTFMgZW50cmllcy4gKi8KICAgIGlmKCFmb3VuZCkgewoJV0NIQVIgd2NCdWZmZXJbMTI4XTsKCWludCByZXNfc2l6ZTsKCgkvKiBjaGVjayBpZiBsYW5ndWFnZSBpcyByZWdpc3RlcmVkIGluIHRoZSBrZXJuZWwzMiByZXNvdXJjZXMgKi8KCWlmKChyZXNfc2l6ZSA9IE5MU19Mb2FkU3RyaW5nRXhXKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIExBTkdJREZST01MQ0lEKGxjaWQpLAoJCUxDVHlwZSwgd2NCdWZmZXIsIHNpemVvZih3Y0J1ZmZlcikvc2l6ZW9mKHdjQnVmZmVyWzBdKSkpKSB7CgkgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHdjQnVmZmVyLCByZXNfc2l6ZSwgYWNCdWZmZXIsIGR3QnVmZmVyU2l6ZSwgTlVMTCwgTlVMTCk7CgkgICAgcmV0U3RyaW5nID0gYWNCdWZmZXI7CgkgICAgZm91bmQgPSAxOwoJfQogICAgfQoKICAgIC8qIGlmIG5vdCBmb3VuZCByZXBvcnQgYSBtb3N0IGRlc2NyaXB0aXZlIGVycm9yICovCiAgICBpZighZm91bmQpIHsKCXJldFN0cmluZz0wOwoJLyogSWYgd2UgYXJlIHRocm91Z2ggYWxsIG9mIHRoaXMsIHJldExlbiBzaG91bGQgbm90IGJlIHplcm8gYW55bW9yZS4KCSAgIElmIGl0IGlzLCB0aGUgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCAqLwoJaT0wOwoJd2hpbGUgKGxvY2FsZV9uYW1lMmlkW2ldLm5hbWUhPU5VTEwpIHsKCSAgICBpZiAoTENUeXBlID09IGxvY2FsZV9uYW1lMmlkW2ldLmlkKSB7CgkJcmV0U3RyaW5nID0gbG9jYWxlX25hbWUyaWRbaV0ubmFtZTsKCQlicmVhazsKCSAgICB9CgkgICAgaSsrOwoJfQoJaWYoIXJldFN0cmluZykKCSAgICBGSVhNRSgiVW5rb3duIExDIHR5cGUgJWxYXG4iLCBMQ1R5cGUpOwoJZWxzZQoJICAgIEZJWE1FKCInJXMnIGlzIG5vdCBkZWZpbmVkIGZvciB5b3VyIGxhbmd1YWdlICglMDRYKS5cbiIKCQkiUGxlYXNlIGRlZmluZSBpdCBpbiBkbGxzL2tlcm5lbC9ubHMvWW91ckxhbmd1YWdlLm5sc1xuIgoJCSJhbmQgc3VibWl0IHBhdGNoIGZvciBpbmNsdXNpb24gaW50byB0aGUgbmV4dCBXaW5lIHJlbGVhc2UuXG4iLAoJCQlyZXRTdHJpbmcsIExPV09SRChsY2lkKSk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIDA7CQkJCiAgICB9CgogICAgLyogYSBGT05UU0lHTkFUVVJFIGlzIG5vdCBhIHN0cmluZywganVzdCA2IERXT1JEcyAgKi8KICAgIGlmIChMQ1R5cGUgPT0gTE9DQUxFX0ZPTlRTSUdOQVRVUkUpIHsKICAgICAgICBpZiAobGVuKSB7CgkgICAgbGVuID0gKGxlbiA8IHNpemVvZihGT05UU0lHTkFUVVJFKSkgPyBsZW4gOiBzaXplb2YoRk9OVFNJR05BVFVSRSk7CiAgICAgICAgICAgIG1lbWNweShidWYsIHJldFN0cmluZywgbGVuKTsKCSAgICByZXR1cm4gbGVuOwoJfQogICAgICAgIHJldHVybiBzaXplb2YoRk9OVFNJR05BVFVSRSk7CiAgICB9CiAgICAvKiBpZiBsZW49MCByZXR1cm4gb25seSB0aGUgbGVuZ3RoLCBkb24ndCB0b3VjaCB0aGUgYnVmZmVyKi8KICAgIGlmIChsZW4pIHsKCWxzdHJjcHluQShidWYscmV0U3RyaW5nLGxlbik7CglyZXR1cm4gc3RybGVuKGJ1ZikgKyAxOwogICAgfQogICAgcmV0dXJuIHN0cmxlbihyZXRTdHJpbmcpKzE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldExvY2FsZUluZm9XIChLRVJORUwzMi5AKQogKgogKiBOT1RFUwogKiAgTVMgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCBsZW4gInNwZWNpZmllcyB0aGUgc2l6ZSwgaW4gYnl0ZXMgKEFOU0kgdmVyc2lvbikKICogIG9yIGNoYXJhY3RlcnMgKFVuaWNvZGUgdmVyc2lvbiksIG9mIiB3YnVmLiBUaHVzIHRoZSBudW1iZXIgcmV0dXJuZWQgaXMKICogIHRoZSBzYW1lIGJldHdlZW4gR2V0TG9jYWxlSW5mb1cgYW5kIEdldExvY2FsZUluZm9BLgogKi8KSU5UIFdJTkFQSSBHZXRMb2NhbGVJbmZvVyhMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFdTVFIgd2J1ZixJTlQgbGVuKQp7CVdPUkQgd2xlbjsKCUxQU1RSIGFidWY7CgkKCWlmIChsZW4gJiYgKCEgd2J1ZikgKQoJeyBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgIHJldHVybiAwOwoJfQoKCWFidWYgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwoJd2xlbiA9IEdldExvY2FsZUluZm9BKGxjaWQsIExDVHlwZSwgYWJ1ZiwgbGVuKTsKCglpZiAod2xlbiAmJiBsZW4pCS8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgqLwogICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIGFidWYsIC0xLCB3YnVmLCBsZW4gKTsKCglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsYWJ1Zik7CglyZXR1cm4gd2xlbjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKgkJR2V0TG9jYWxlU3Via2V5TmFtZSBbaGVscGVyIGZ1bmN0aW9uXQogKgogKiAgICAgICAgICAtIEZvciB1c2Ugd2l0aCB0aGUgcmVnaXN0cnkuCiAqICAgICAgICAgIC0gR2V0cyB0aGUgcmVnaXN0cnkgc3Via2V5IG5hbWUgZm9yIGEgZ2l2ZW4gbGN0eXBlLgogKi8Kc3RhdGljIGNoYXIgKkdldExvY2FsZVN1YmtleU5hbWUoIERXT1JEIGxjdHlwZSApCnsKICAgIGNoYXIgICAgKnBhY0tleT1OVUxMOwoKICAgIHN3aXRjaCAoIGxjdHlwZSApCiAgICB7CiAgICAvKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYnkgU2V0TG9jYWxlSW5mbyBhbmQgR2V0TG9jYWxlSW5mbywgYW5kCiAgICAgKiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHJlZ2lzdHJ5LCBjb25maXJtZWQgdW5kZXIgV2luZG93cywKICAgICAqIGZvciB0aGUgb25lcyB0aGF0IGFjdHVhbGx5IGFzc2lnbiBwYWNLZXkuIENhc2VzIHRoYXQgYXJlbid0IGZpbmlzaGVkCiAgICAgKiBoYXZlIG5vdCBiZWVuIGNvbmZpcm1lZCwgc28gdGhhdCBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZXkgY2FuIGJlCiAgICAgKiBhZGRlZC4KICAgICAqLwogICAgY2FzZSBMT0NBTEVfU0RBVEUgOiAgICAgICAgLyogVGhlIGRhdGUgc2VwYXJhdG9yLiAqLwogICAgICAgIHBhY0tleSA9ICJzRGF0ZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JQ1VSUkRJR0lUUzoKICAgICAgICBwYWNLZXkgPSAiaUN1cnJEaWdpdHMiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0RFQ0lNQUwgOgogICAgICAgIHBhY0tleSA9ICJzRGVjaW1hbCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JQ1VSUkVOQ1k6CiAgICAgICAgcGFjS2V5ID0gImlDdXJyZW5jeSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TR1JPVVBJTkcgOgogICAgICAgIHBhY0tleSA9ICJzR3JvdXBpbmciOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSURJR0lUUzoKICAgICAgICBwYWNLZXkgPSAiaURpZ2l0cyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTElTVCA6CiAgICAgICAgcGFjS2V5ID0gInNMaXN0IjsKICAgICAgICBicmVhazsKICAgIC8qIGNhc2UgTE9DQUxFX0lDQUxFTkRBUlRZUEU6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9JRklSU1REQVlPRldFRUs6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSOiAqLwogICAgLyogY2FzZSBMT0NBTEVfU1lFQVJNT05USCA6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9TUE9TSVRJVkVTSUdOIDogKi8KICAgIC8qIGNhc2UgTE9DQUxFX0lQQVBFUlNJWkU6ICovCiAgICAvKiAgICAgYnJlYWs7ICovCiAgICBjYXNlIExPQ0FMRV9TTE9OR0RBVEUgOgogICAgICAgIHBhY0tleSA9ICJzTG9uZ0RhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU01PTkRFQ0lNQUxTRVAgOgogICAgICAgIHBhY0tleSA9ICJzTW9uRGVjaW1hbFNlcCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTU9OR1JPVVBJTkc6CiAgICAgICAgcGFjS2V5ID0gInNNb25Hcm91cGluZyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTUVBU1VSRToKICAgICAgICBwYWNLZXkgPSAiaU1lYXN1cmUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU01PTlRIT1VTQU5EU0VQIDoKICAgICAgICBwYWNLZXkgPSAic01vblRob3VzYW5kU2VwIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lORUdDVVJSOgogICAgICAgIHBhY0tleSA9ICJpTmVnQ3VyciI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTkVHQVRJVkVTSUdOIDoKICAgICAgICBwYWNLZXkgPSAic05lZ2F0aXZlU2lnbiI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTkVHTlVNQkVSOgogICAgICAgIHBhY0tleSA9ICJpTmVnTnVtYmVyIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NTSE9SVERBVEUgOgogICAgICAgIHBhY0tleSA9ICJzU2hvcnREYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lMREFURTogICAgICAgIC8qIExvbmcgRGF0ZSBmb3JtYXQgb3JkZXJpbmcgc3BlY2lmaWVyLiAqLwogICAgICAgIHBhY0tleSA9ICJpTERhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUxaRVJPOgogICAgICAgIHBhY0tleSA9ICJpTFplcm8iOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSVRMWkVSTzoKICAgICAgICBwYWNLZXkgPSAiaVRMWmVybyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JVElNRTogICAgICAgIC8qIFRpbWUgZm9ybWF0IHNwZWNpZmllci4gKi8KICAgICAgICBwYWNLZXkgPSAiaVRpbWUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU1RIT1VTQU5EIDoKICAgICAgICBwYWNLZXkgPSAic1Rob3VzYW5kIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1MxMTU5OiAgICAgICAgLyogQU0gKi8KICAgICAgICBwYWNLZXkgPSAiczExNTkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU1RJTUU6CiAgICAgICAgcGFjS2V5ID0gInNUaW1lIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1MyMzU5OiAgICAgICAgLyogUE0gKi8KICAgICAgICBwYWNLZXkgPSAiczIzNTkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU1RJTUVGT1JNQVQgOgogICAgICAgIHBhY0tleSA9ICJzVGltZUZvcm1hdCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TQ1VSUkVOQ1k6CiAgICAgICAgcGFjS2V5ID0gInNDdXJyZW5jeSI7CiAgICAgICAgYnJlYWs7CgogICAgLyogVGhlIGZvbGxvd2luZyBhcmUgbm90IGxpc3RlZCB1bmRlciBNU0ROIGFzIHN1cHBvcnRlZCwgCiAgICAgKiBidXQgc2VlbSB0byBiZSB1c2VkIGFuZCBhbHNvIHN0b3JlZCBpbiB0aGUgcmVnaXN0cnkuCiAgICAgKi8KCiAgICBjYXNlIExPQ0FMRV9JREFURToKICAgICAgICBwYWNLZXkgPSAiaURhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0NPVU5UUlk6CiAgICAgICAgcGFjS2V5ID0gInNDb3VudHJ5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lDT1VOVFJZOgogICAgICAgIHBhY0tleSA9ICJpQ291bnRyeSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTEFOR1VBR0U6CiAgICAgICAgcGFjS2V5ID0gInNMYW5ndWFnZSI7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4oIHBhY0tleSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXRMb2NhbGVJbmZvQQlbS0VSTkVMMzIuQF0KICovCkJPT0wgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEhLRVkgICAgaEtleTsKICAgIGNoYXIgICAgKnBhY0tleTsKICAgIGNoYXIgICAgYWNSZWFsS2V5WzEyOF07CgogICAgaWYgKCAocGFjS2V5ID0gR2V0TG9jYWxlU3Via2V5TmFtZShsY3R5cGUpKSApCiAgICB7CiAgICAgICAgc3ByaW50ZiggYWNSZWFsS2V5LCAiQ29udHJvbCBQYW5lbFxcSW50ZXJuYXRpb25hbFxcJXMiLCBwYWNLZXkgKTsKICAgICAgICBpZiAoIFJlZ0NyZWF0ZUtleUEoIEhLRVlfQ1VSUkVOVF9VU0VSLCBhY1JlYWxLZXksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhLZXkgKSA9PSBFUlJPUl9TVUNDRVNTICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggUmVnU2V0VmFsdWVFeEEoIGhLZXksIE5VTEwsIDAsIFJFR19TWiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHN0cmxlbihkYXRhKSsxICkgIT0gRVJST1JfU1VDQ0VTUyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiU2V0TG9jYWxlSW5mb0E6ICVzIGRpZCBub3Qgd29ya1xuIiwgcGFjS2V5ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUmVnQ2xvc2VLZXkoIGhLZXkgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICBGSVhNRSgiKCVsZCwlbGQsJXMpOiBzdHViXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlzVmFsaWRMb2NhbGUJW0tFUk5FTDMyLkBdCiAqLwpCT09MIFdJTkFQSSBJc1ZhbGlkTG9jYWxlKExDSUQgbGNpZCxEV09SRCBmbGFncykKewogICAgLyogY2hlY2sgaWYgbGFuZ3VhZ2UgaXMgcmVnaXN0ZXJlZCBpbiB0aGUga2VybmVsMzIgcmVzb3VyY2VzICovCiAgICBpZighRmluZFJlc291cmNlRXhXKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR1csIChMUENXU1RSKUxPQ0FMRV9JTEFOR1VBR0UsIExPV09SRChsY2lkKSkpCglyZXR1cm4gRkFMU0U7CiAgICBlbHNlCglyZXR1cm4gVFJVRTsKfQoKc3RhdGljIEJPT0wgQ0FMTEJBQ0sgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY1coSE1PRFVMRSBoTW9kdWxlLCBMUENXU1RSIHR5cGUsCgkJTFBDV1NUUiBuYW1lLCBXT1JEIExhbmdJRCwgTE9ORyBsUGFyYW0pCnsKICAgIENIQVIgYnVmQVsyMF07CiAgICBXQ0hBUiBidWZXWzIwXTsKICAgIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0gPSAoTE9DQUxFX0VOVU1QUk9DVylsUGFyYW07CiAgICBzcHJpbnRmKGJ1ZkEsICIlMDhYIiwgKFVJTlQpTGFuZ0lEKTsKICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBidWZBLCAtMSwgYnVmVywgc2l6ZW9mKGJ1ZlcpL3NpemVvZihidWZXWzBdKSk7CiAgICByZXR1cm4gbHBmbkxvY2FsZUVudW0oYnVmVyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzVwlbS0VSTkVMMzIuQF0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzVyggTE9DQUxFX0VOVU1QUk9DVyBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MgKQp7CiAgICBUUkFDRSgiKCVwLCUwOGx4KVxuIiwgbHBmbkxvY2FsZUVudW0sZmxhZ3MpOwoKICAgIEVudW1SZXNvdXJjZUxhbmd1YWdlc1coR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgUlRfU1RSSU5HVywKCSAgICAoTFBDV1NUUilMT0NBTEVfSUxBTkdVQUdFLCBFbnVtUmVzb3VyY2VMYW5ndWFnZXNQcm9jVywKCSAgICAoTE9ORylscGZuTG9jYWxlRW51bSk7CgogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBCT09MIENBTExCQUNLIEVudW1SZXNvdXJjZUxhbmd1YWdlc1Byb2NBKEhNT0RVTEUgaE1vZHVsZSwgTFBDU1RSIHR5cGUsCgkJTFBDU1RSIG5hbWUsIFdPUkQgTGFuZ0lELCBMT05HIGxQYXJhbSkKewogICAgQ0hBUiBidWZBWzIwXTsKICAgIExPQ0FMRV9FTlVNUFJPQ0EgbHBmbkxvY2FsZUVudW0gPSAoTE9DQUxFX0VOVU1QUk9DQSlsUGFyYW07CiAgICBzcHJpbnRmKGJ1ZkEsICIlMDhYIiwgKFVJTlQpTGFuZ0lEKTsKICAgIHJldHVybiBscGZuTG9jYWxlRW51bShidWZBKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXNBCVtLRVJORUwzMi5AXQogKi8KQk9PTCBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXNBKExPQ0FMRV9FTlVNUFJPQ0EgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MpCnsKICAgIFRSQUNFKCIoJXAsJTA4bHgpXG4iLCBscGZuTG9jYWxlRW51bSxmbGFncyk7CgogICAgRW51bVJlc291cmNlTGFuZ3VhZ2VzQShHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCBSVF9TVFJJTkdBLAoJICAgIChMUENTVFIpTE9DQUxFX0lMQU5HVUFHRSwgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY0EsCgkgICAgKExPTkcpbHBmbkxvY2FsZUVudW0pOwoKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBDVF9DVHlwZTJfTFVUW10gPSB7CiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA4ICovCiAgQzJfU0VHTUVOVFNFUEFSQVRPUiwgLyogICAtICAgOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDExICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzEgKi8KICBDMl9XSElURVNQQUNFLCAvKiAgIC0gIDMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAhIC0gIDMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAjIC0gIDM1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJCAtICAzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICUgLSAgMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogJiAtICAzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogJyAtICAzOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKCAtICA0MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKSAtICA0MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKiAtICA0MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICsgLSAgNDMgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qICwgLSAgNDQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAtIC0gIDQ1ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAuIC0gIDQ2ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAvIC0gIDQ3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAwIC0gIDQ4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAxIC0gIDQ5ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAyIC0gIDUwICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAzIC0gIDUxICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA0IC0gIDUyICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA1IC0gIDUzICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA2IC0gIDU0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA3IC0gIDU1ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA4IC0gIDU2ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA5IC0gIDU3ICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiA6IC0gIDU4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA7IC0gIDU5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA8IC0gIDYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA9IC0gIDYxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA+IC0gIDYyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA/IC0gIDYzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEAgLSAgNjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQSAtICA2NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBCIC0gIDY2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEMgLSAgNjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRCAtICA2OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBFIC0gIDY5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEYgLSAgNzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRyAtICA3MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBIIC0gIDcyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEkgLSAgNzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSiAtICA3NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBLIC0gIDc1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEwgLSAgNzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTSAtICA3NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBOIC0gIDc4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE8gLSAgNzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUCAtICA4MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBRIC0gIDgxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFIgLSAgODIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUyAtICA4MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBUIC0gIDg0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFUgLSAgODUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogViAtICA4NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBXIC0gIDg3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFggLSAgODggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWSAtICA4OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBaIC0gIDkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBbIC0gIDkxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBcIC0gIDkyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBdIC0gIDkzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBeIC0gIDk0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBfIC0gIDk1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBgIC0gIDk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGEgLSAgOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYiAtICA5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBjIC0gIDk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGQgLSAxMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZSAtIDEwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBmIC0gMTAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGcgLSAxMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaCAtIDEwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBpIC0gMTA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGogLSAxMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogayAtIDEwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBsIC0gMTA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG0gLSAxMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbiAtIDExMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBvIC0gMTExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHAgLSAxMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcSAtIDExMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiByIC0gMTE0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHMgLSAxMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdCAtIDExNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB1IC0gMTE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHYgLSAxMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdyAtIDExOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB4IC0gMTIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHkgLSAxMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeiAtIDEyMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogeyAtIDEyMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfCAtIDEyNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfSAtIDEyNSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfiAtIDEyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIH8gLSAxMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCAIC0gMTI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggSAtIDEyOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoggiAtIDEzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCDIC0gMTMxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCEIC0gMTMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCFIC0gMTMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCGIC0gMTM0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCHIC0gMTM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIggLSAxMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCJIC0gMTM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIogLSAxMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIsgLSAxMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogjCAtIDE0MCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII0gLSAxNDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCOIC0gMTQyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjyAtIDE0MyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJAgLSAxNDQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJEgLSAxNDUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJIgLSAxNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJMgLSAxNDcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJQgLSAxNDggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJUgLSAxNDkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJYgLSAxNTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJcgLSAxNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmCAtIDE1MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmSAtIDE1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCaIC0gMTU0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCbIC0gMTU1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJwgLSAxNTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCdIC0gMTU3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogniAtIDE1OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCfIC0gMTU5ICovCiAgQzJfV0hJVEVTUEFDRSwgLyogoCAtIDE2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogoSAtIDE2MSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKIgLSAxNjIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCjIC0gMTYzICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpCAtIDE2NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKUgLSAxNjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKYgLSAxNjYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKcgLSAxNjcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKggLSAxNjggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKkgLSAxNjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKogLSAxNzAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKsgLSAxNzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKwgLSAxNzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK0gLSAxNzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK4gLSAxNzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK8gLSAxNzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCwIC0gMTc2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsSAtIDE3NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsiAtIDE3OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsyAtIDE3OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtCAtIDE4MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtSAtIDE4MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtiAtIDE4MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtyAtIDE4MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguCAtIDE4NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyoguSAtIDE4NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguiAtIDE4NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguyAtIDE4NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvCAtIDE4OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvSAtIDE4OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogviAtIDE5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvyAtIDE5MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDAIC0gMTkyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMEgLSAxOTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwiAtIDE5NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDDIC0gMTk1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMQgLSAxOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxSAtIDE5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDGIC0gMTk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMcgLSAxOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyCAtIDIwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDJIC0gMjAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMogLSAyMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyyAtIDIwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDMIC0gMjA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM0gLSAyMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogziAtIDIwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDPIC0gMjA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINAgLSAyMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0SAtIDIwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDSIC0gMjEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINMgLSAyMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1CAtIDIxMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDVIC0gMjEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINYgLSAyMTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qINcgLSAyMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2CAtIDIxNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDZIC0gMjE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINogLSAyMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2yAtIDIxOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDcIC0gMjIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN0gLSAyMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3iAtIDIyMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDfIC0gMjIzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOAgLSAyMjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4SAtIDIyNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDiIC0gMjI2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOMgLSAyMjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5CAtIDIyOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDlIC0gMjI5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOYgLSAyMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5yAtIDIzMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDoIC0gMjMyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOkgLSAyMzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6iAtIDIzNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDrIC0gMjM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOwgLSAyMzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7SAtIDIzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDuIC0gMjM4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO8gLSAyMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8CAtIDI0MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDxIC0gMjQxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPIgLSAyNDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8yAtIDI0MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD0IC0gMjQ0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPUgLSAyNDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9iAtIDI0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog9yAtIDI0NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD4IC0gMjQ4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPkgLSAyNDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+iAtIDI1MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD7IC0gMjUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPwgLSAyNTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/SAtIDI1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD+IC0gMjU0ICovCiAgQzJfTEVGVFRPUklHSFQgLyog/yAtIDI1NSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgT0xFMk5MU19DVF9DVHlwZTNfTFVUW10gPSB7IAogIDB4MDAwMCwgLyogICAtICAgMCAqLwogIDB4MDAwMCwgLyogICAtICAgMSAqLwogIDB4MDAwMCwgLyogICAtICAgMiAqLwogIDB4MDAwMCwgLyogICAtICAgMyAqLwogIDB4MDAwMCwgLyogICAtICAgNCAqLwogIDB4MDAwMCwgLyogICAtICAgNSAqLwogIDB4MDAwMCwgLyogICAtICAgNiAqLwogIDB4MDAwMCwgLyogICAtICAgNyAqLwogIDB4MDAwMCwgLyogICAtICAgOCAqLwogIDB4MDAwOCwgLyogICAtICAgOSAqLwogIDB4MDAwOCwgLyogICAtICAxMCAqLwogIDB4MDAwOCwgLyogICAtICAxMSAqLwogIDB4MDAwOCwgLyogICAtICAxMiAqLwogIDB4MDAwOCwgLyogICAtICAxMyAqLwogIDB4MDAwMCwgLyogICAtICAxNCAqLwogIDB4MDAwMCwgLyogICAtICAxNSAqLwogIDB4MDAwMCwgLyogICAtICAxNiAqLwogIDB4MDAwMCwgLyogICAtICAxNyAqLwogIDB4MDAwMCwgLyogICAtICAxOCAqLwogIDB4MDAwMCwgLyogICAtICAxOSAqLwogIDB4MDAwMCwgLyogICAtICAyMCAqLwogIDB4MDAwMCwgLyogICAtICAyMSAqLwogIDB4MDAwMCwgLyogICAtICAyMiAqLwogIDB4MDAwMCwgLyogICAtICAyMyAqLwogIDB4MDAwMCwgLyogICAtICAyNCAqLwogIDB4MDAwMCwgLyogICAtICAyNSAqLwogIDB4MDAwMCwgLyogICAtICAyNiAqLwogIDB4MDAwMCwgLyogICAtICAyNyAqLwogIDB4MDAwMCwgLyogICAtICAyOCAqLwogIDB4MDAwMCwgLyogICAtICAyOSAqLwogIDB4MDAwMCwgLyogICAtICAzMCAqLwogIDB4MDAwMCwgLyogICAtICAzMSAqLwogIDB4MDA0OCwgLyogICAtICAzMiAqLwogIDB4MDA0OCwgLyogISAtICAzMyAqLwogIDB4MDQ0OCwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgMHgwMDQ4LCAvKiAjIC0gIDM1ICovCiAgMHgwNDQ4LCAvKiAkIC0gIDM2ICovCiAgMHgwMDQ4LCAvKiAlIC0gIDM3ICovCiAgMHgwMDQ4LCAvKiAmIC0gIDM4ICovCiAgMHgwNDQwLCAvKiAnIC0gIDM5ICovCiAgMHgwMDQ4LCAvKiAoIC0gIDQwICovCiAgMHgwMDQ4LCAvKiApIC0gIDQxICovCiAgMHgwMDQ4LCAvKiAqIC0gIDQyICovCiAgMHgwMDQ4LCAvKiArIC0gIDQzICovCiAgMHgwMDQ4LCAvKiAsIC0gIDQ0ICovCiAgMHgwNDQwLCAvKiAtIC0gIDQ1ICovCiAgMHgwMDQ4LCAvKiAuIC0gIDQ2ICovCiAgMHgwNDQ4LCAvKiAvIC0gIDQ3ICovCiAgMHgwMDQwLCAvKiAwIC0gIDQ4ICovCiAgMHgwMDQwLCAvKiAxIC0gIDQ5ICovCiAgMHgwMDQwLCAvKiAyIC0gIDUwICovCiAgMHgwMDQwLCAvKiAzIC0gIDUxICovCiAgMHgwMDQwLCAvKiA0IC0gIDUyICovCiAgMHgwMDQwLCAvKiA1IC0gIDUzICovCiAgMHgwMDQwLCAvKiA2IC0gIDU0ICovCiAgMHgwMDQwLCAvKiA3IC0gIDU1ICovCiAgMHgwMDQwLCAvKiA4IC0gIDU2ICovCiAgMHgwMDQwLCAvKiA5IC0gIDU3ICovCiAgMHgwMDQ4LCAvKiA6IC0gIDU4ICovCiAgMHgwMDQ4LCAvKiA7IC0gIDU5ICovCiAgMHgwMDQ4LCAvKiA8IC0gIDYwICovCiAgMHgwNDQ4LCAvKiA9IC0gIDYxICovCiAgMHgwMDQ4LCAvKiA+IC0gIDYyICovCiAgMHgwMDQ4LCAvKiA/IC0gIDYzICovCiAgMHgwNDQ4LCAvKiBAIC0gIDY0ICovCiAgMHg4MDQwLCAvKiBBIC0gIDY1ICovCiAgMHg4MDQwLCAvKiBCIC0gIDY2ICovCiAgMHg4MDQwLCAvKiBDIC0gIDY3ICovCiAgMHg4MDQwLCAvKiBEIC0gIDY4ICovCiAgMHg4MDQwLCAvKiBFIC0gIDY5ICovCiAgMHg4MDQwLCAvKiBGIC0gIDcwICovCiAgMHg4MDQwLCAvKiBHIC0gIDcxICovCiAgMHg4MDQwLCAvKiBIIC0gIDcyICovCiAgMHg4MDQwLCAvKiBJIC0gIDczICovCiAgMHg4MDQwLCAvKiBKIC0gIDc0ICovCiAgMHg4MDQwLCAvKiBLIC0gIDc1ICovCiAgMHg4MDQwLCAvKiBMIC0gIDc2ICovCiAgMHg4MDQwLCAvKiBNIC0gIDc3ICovCiAgMHg4MDQwLCAvKiBOIC0gIDc4ICovCiAgMHg4MDQwLCAvKiBPIC0gIDc5ICovCiAgMHg4MDQwLCAvKiBQIC0gIDgwICovCiAgMHg4MDQwLCAvKiBRIC0gIDgxICovCiAgMHg4MDQwLCAvKiBSIC0gIDgyICovCiAgMHg4MDQwLCAvKiBTIC0gIDgzICovCiAgMHg4MDQwLCAvKiBUIC0gIDg0ICovCiAgMHg4MDQwLCAvKiBVIC0gIDg1ICovCiAgMHg4MDQwLCAvKiBWIC0gIDg2ICovCiAgMHg4MDQwLCAvKiBXIC0gIDg3ICovCiAgMHg4MDQwLCAvKiBYIC0gIDg4ICovCiAgMHg4MDQwLCAvKiBZIC0gIDg5ICovCiAgMHg4MDQwLCAvKiBaIC0gIDkwICovCiAgMHgwMDQ4LCAvKiBbIC0gIDkxICovCiAgMHgwNDQ4LCAvKiBcIC0gIDkyICovCiAgMHgwMDQ4LCAvKiBdIC0gIDkzICovCiAgMHgwNDQ4LCAvKiBeIC0gIDk0ICovCiAgMHgwNDQ4LCAvKiBfIC0gIDk1ICovCiAgMHgwNDQ4LCAvKiBgIC0gIDk2ICovCiAgMHg4MDQwLCAvKiBhIC0gIDk3ICovCiAgMHg4MDQwLCAvKiBiIC0gIDk4ICovCiAgMHg4MDQwLCAvKiBjIC0gIDk5ICovCiAgMHg4MDQwLCAvKiBkIC0gMTAwICovCiAgMHg4MDQwLCAvKiBlIC0gMTAxICovCiAgMHg4MDQwLCAvKiBmIC0gMTAyICovCiAgMHg4MDQwLCAvKiBnIC0gMTAzICovCiAgMHg4MDQwLCAvKiBoIC0gMTA0ICovCiAgMHg4MDQwLCAvKiBpIC0gMTA1ICovCiAgMHg4MDQwLCAvKiBqIC0gMTA2ICovCiAgMHg4MDQwLCAvKiBrIC0gMTA3ICovCiAgMHg4MDQwLCAvKiBsIC0gMTA4ICovCiAgMHg4MDQwLCAvKiBtIC0gMTA5ICovCiAgMHg4MDQwLCAvKiBuIC0gMTEwICovCiAgMHg4MDQwLCAvKiBvIC0gMTExICovCiAgMHg4MDQwLCAvKiBwIC0gMTEyICovCiAgMHg4MDQwLCAvKiBxIC0gMTEzICovCiAgMHg4MDQwLCAvKiByIC0gMTE0ICovCiAgMHg4MDQwLCAvKiBzIC0gMTE1ICovCiAgMHg4MDQwLCAvKiB0IC0gMTE2ICovCiAgMHg4MDQwLCAvKiB1IC0gMTE3ICovCiAgMHg4MDQwLCAvKiB2IC0gMTE4ICovCiAgMHg4MDQwLCAvKiB3IC0gMTE5ICovCiAgMHg4MDQwLCAvKiB4IC0gMTIwICovCiAgMHg4MDQwLCAvKiB5IC0gMTIxICovCiAgMHg4MDQwLCAvKiB6IC0gMTIyICovCiAgMHgwMDQ4LCAvKiB7IC0gMTIzICovCiAgMHgwMDQ4LCAvKiB8IC0gMTI0ICovCiAgMHgwMDQ4LCAvKiB9IC0gMTI1ICovCiAgMHgwNDQ4LCAvKiB+IC0gMTI2ICovCiAgMHgwMDAwLCAvKiB/IC0gMTI3ICovCiAgMHgwMDAwLCAvKiCAIC0gMTI4ICovCiAgMHgwMDAwLCAvKiCBIC0gMTI5ICovCiAgMHgwMDA4LCAvKiCCIC0gMTMwICovCiAgMHg4MDAwLCAvKiCDIC0gMTMxICovCiAgMHgwMDA4LCAvKiCEIC0gMTMyICovCiAgMHgwMDA4LCAvKiCFIC0gMTMzICovCiAgMHgwMDA4LCAvKiCGIC0gMTM0ICovCiAgMHgwMDA4LCAvKiCHIC0gMTM1ICovCiAgMHgwMDAxLCAvKiCIIC0gMTM2ICovCiAgMHgwMDA4LCAvKiCJIC0gMTM3ICovCiAgMHg4MDAzLCAvKiCKIC0gMTM4ICovCiAgMHgwMDA4LCAvKiCLIC0gMTM5ICovCiAgMHg4MDAwLCAvKiCMIC0gMTQwICovCiAgMHgwMDAwLCAvKiCNIC0gMTQxICovCiAgMHgwMDAwLCAvKiCOIC0gMTQyICovCiAgMHgwMDAwLCAvKiCPIC0gMTQzICovCiAgMHgwMDAwLCAvKiCQIC0gMTQ0ICovCiAgMHgwMDg4LCAvKiCRIC0gMTQ1ICovCiAgMHgwMDg4LCAvKiCSIC0gMTQ2ICovCiAgMHgwMDg4LCAvKiCTIC0gMTQ3ICovCiAgMHgwMDg4LCAvKiCUIC0gMTQ4ICovCiAgMHgwMDA4LCAvKiCVIC0gMTQ5ICovCiAgMHgwNDAwLCAvKiCWIC0gMTUwICovCiAgMHgwNDAwLCAvKiCXIC0gMTUxICovCiAgMHgwNDA4LCAvKiCYIC0gMTUyICovCiAgMHgwMDAwLCAvKiCZIC0gMTUzICovCiAgMHg4MDAzLCAvKiCaIC0gMTU0ICovCiAgMHgwMDA4LCAvKiCbIC0gMTU1ICovCiAgMHg4MDAwLCAvKiCcIC0gMTU2ICovCiAgMHgwMDAwLCAvKiCdIC0gMTU3ICovCiAgMHgwMDAwLCAvKiCeIC0gMTU4ICovCiAgMHg4MDAzLCAvKiCfIC0gMTU5ICovCiAgMHgwMDA4LCAvKiCgIC0gMTYwICovCiAgMHgwMDA4LCAvKiChIC0gMTYxICovCiAgMHgwMDQ4LCAvKiCiIC0gMTYyICovCiAgMHgwMDQ4LCAvKiCjIC0gMTYzICovCiAgMHgwMDA4LCAvKiCkIC0gMTY0ICovCiAgMHgwMDQ4LCAvKiClIC0gMTY1ICovCiAgMHgwMDQ4LCAvKiCmIC0gMTY2ICovCiAgMHgwMDA4LCAvKiCnIC0gMTY3ICovCiAgMHgwNDA4LCAvKiCoIC0gMTY4ICovCiAgMHgwMDA4LCAvKiCpIC0gMTY5ICovCiAgMHgwNDAwLCAvKiCqIC0gMTcwICovCiAgMHgwMDA4LCAvKiCrIC0gMTcxICovCiAgMHgwMDQ4LCAvKiCsIC0gMTcyICovCiAgMHgwNDA4LCAvKiCtIC0gMTczICovCiAgMHgwMDA4LCAvKiCuIC0gMTc0ICovCiAgMHgwNDQ4LCAvKiCvIC0gMTc1ICovCiAgMHgwMDA4LCAvKiCwIC0gMTc2ICovCiAgMHgwMDA4LCAvKiCxIC0gMTc3ICovCiAgMHgwMDAwLCAvKiCyIC0gMTc4ICovCiAgMHgwMDAwLCAvKiCzIC0gMTc5ICovCiAgMHgwNDA4LCAvKiC0IC0gMTgwICovCiAgMHgwMDA4LCAvKiC1IC0gMTgxICovCiAgMHgwMDA4LCAvKiC2IC0gMTgyICovCiAgMHgwMDA4LCAvKiC3IC0gMTgzICovCiAgMHgwNDA4LCAvKiC4IC0gMTg0ICovCiAgMHgwMDAwLCAvKiC5IC0gMTg1ICovCiAgMHgwNDAwLCAvKiC6IC0gMTg2ICovCiAgMHgwMDA4LCAvKiC7IC0gMTg3ICovCiAgMHgwMDAwLCAvKiC8IC0gMTg4ICovCiAgMHgwMDAwLCAvKiC9IC0gMTg5ICovCiAgMHgwMDAwLCAvKiC+IC0gMTkwICovCiAgMHgwMDA4LCAvKiC/IC0gMTkxICovCiAgMHg4MDAzLCAvKiDAIC0gMTkyICovCiAgMHg4MDAzLCAvKiDBIC0gMTkzICovCiAgMHg4MDAzLCAvKiDCIC0gMTk0ICovCiAgMHg4MDAzLCAvKiDDIC0gMTk1ICovCiAgMHg4MDAzLCAvKiDEIC0gMTk2ICovCiAgMHg4MDAzLCAvKiDFIC0gMTk3ICovCiAgMHg4MDAwLCAvKiDGIC0gMTk4ICovCiAgMHg4MDAzLCAvKiDHIC0gMTk5ICovCiAgMHg4MDAzLCAvKiDIIC0gMjAwICovCiAgMHg4MDAzLCAvKiDJIC0gMjAxICovCiAgMHg4MDAzLCAvKiDKIC0gMjAyICovCiAgMHg4MDAzLCAvKiDLIC0gMjAzICovCiAgMHg4MDAzLCAvKiDMIC0gMjA0ICovCiAgMHg4MDAzLCAvKiDNIC0gMjA1ICovCiAgMHg4MDAzLCAvKiDOIC0gMjA2ICovCiAgMHg4MDAzLCAvKiDPIC0gMjA3ICovCiAgMHg4MDAwLCAvKiDQIC0gMjA4ICovCiAgMHg4MDAzLCAvKiDRIC0gMjA5ICovCiAgMHg4MDAzLCAvKiDSIC0gMjEwICovCiAgMHg4MDAzLCAvKiDTIC0gMjExICovCiAgMHg4MDAzLCAvKiDUIC0gMjEyICovCiAgMHg4MDAzLCAvKiDVIC0gMjEzICovCiAgMHg4MDAzLCAvKiDWIC0gMjE0ICovCiAgMHgwMDA4LCAvKiDXIC0gMjE1ICovCiAgMHg4MDAzLCAvKiDYIC0gMjE2ICovCiAgMHg4MDAzLCAvKiDZIC0gMjE3ICovCiAgMHg4MDAzLCAvKiDaIC0gMjE4ICovCiAgMHg4MDAzLCAvKiDbIC0gMjE5ICovCiAgMHg4MDAzLCAvKiDcIC0gMjIwICovCiAgMHg4MDAzLCAvKiDdIC0gMjIxICovCiAgMHg4MDAwLCAvKiDeIC0gMjIyICovCiAgMHg4MDAwLCAvKiDfIC0gMjIzICovCiAgMHg4MDAzLCAvKiDgIC0gMjI0ICovCiAgMHg4MDAzLCAvKiDhIC0gMjI1ICovCiAgMHg4MDAzLCAvKiDiIC0gMjI2ICovCiAgMHg4MDAzLCAvKiDjIC0gMjI3ICovCiAgMHg4MDAzLCAvKiDkIC0gMjI4ICovCiAgMHg4MDAzLCAvKiDlIC0gMjI5ICovCiAgMHg4MDAwLCAvKiDmIC0gMjMwICovCiAgMHg4MDAzLCAvKiDnIC0gMjMxICovCiAgMHg4MDAzLCAvKiDoIC0gMjMyICovCiAgMHg4MDAzLCAvKiDpIC0gMjMzICovCiAgMHg4MDAzLCAvKiDqIC0gMjM0ICovCiAgMHg4MDAzLCAvKiDrIC0gMjM1ICovCiAgMHg4MDAzLCAvKiDsIC0gMjM2ICovCiAgMHg4MDAzLCAvKiDtIC0gMjM3ICovCiAgMHg4MDAzLCAvKiDuIC0gMjM4ICovCiAgMHg4MDAzLCAvKiDvIC0gMjM5ICovCiAgMHg4MDAwLCAvKiDwIC0gMjQwICovCiAgMHg4MDAzLCAvKiDxIC0gMjQxICovCiAgMHg4MDAzLCAvKiDyIC0gMjQyICovCiAgMHg4MDAzLCAvKiDzIC0gMjQzICovCiAgMHg4MDAzLCAvKiD0IC0gMjQ0ICovCiAgMHg4MDAzLCAvKiD1IC0gMjQ1ICovCiAgMHg4MDAzLCAvKiD2IC0gMjQ2ICovCiAgMHgwMDA4LCAvKiD3IC0gMjQ3ICovCiAgMHg4MDAzLCAvKiD4IC0gMjQ4ICovCiAgMHg4MDAzLCAvKiD5IC0gMjQ5ICovCiAgMHg4MDAzLCAvKiD6IC0gMjUwICovCiAgMHg4MDAzLCAvKiD7IC0gMjUxICovCiAgMHg4MDAzLCAvKiD8IC0gMjUyICovCiAgMHg4MDAzLCAvKiD9IC0gMjUzICovCiAgMHg4MDAwLCAvKiD+IC0gMjU0ICovCiAgMHg4MDAzICAvKiD/IC0gMjU1ICovCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlQQlbS0VSTkVMMzIuQF0KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4QShsb2NhbGUsZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZUV4QQlbS0VSTkVMMzIuQF0KICoKICogRklYTUU6IElnbm9yZXMgdGhlIGxvY2FsZS4KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVFeEEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJaW50CWk7CgkKCWlmICgoc3JjPT1OVUxMKSB8fCAoY2hhcnR5cGU9PU5VTEwpIHx8IChzcmM9PShMUFNUUiljaGFydHlwZSkpCgl7CgkgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkgIHJldHVybiBGQUxTRTsKCX0KCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPXN0cmxlbihzcmMpKzE7CgkgIAoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMToKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldID0gMDsKCSAgICBpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkgICAgaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJICAgIGlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCSAgICBpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkgICAgaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJICAgIGlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCSAgICBpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCgkgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkgICAgLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMjoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPShXT1JEKUNUX0NUeXBlMl9MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTM6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT1PTEUyTkxTX0NUX0NUeXBlM19MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJZGVmYXVsdDoKCSAgRVJSKCJVbmtub3duIGR3SW5mb1R5cGU6JWxkXG4iLGR3SW5mb1R5cGUpOwoJICByZXR1cm4gRkFMU0U7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVmVyTGFuZ3VhZ2VOYW1lQSAgICAgICAgICAgICAgW0tFUk5FTDMyLkBdCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lQSggVUlOVCB3TGFuZywgTFBTVFIgc3pMYW5nLCBVSU5UIG5TaXplICkKewogICAgaWYoIXN6TGFuZykKCXJldHVybiAwOwoKICAgIHJldHVybiBHZXRMb2NhbGVJbmZvQShNQUtFTENJRCh3TGFuZywgU09SVF9ERUZBVUxUKSwgTE9DQUxFX1NFTkdMQU5HVUFHRSwgc3pMYW5nLCBuU2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVmVyTGFuZ3VhZ2VOYW1lVyAgICAgICAgICAgICAgW0tFUk5FTDMyLkBdCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lVyggVUlOVCB3TGFuZywgTFBXU1RSIHN6TGFuZywgVUlOVCBuU2l6ZSApCnsKICAgIGlmKCFzekxhbmcpCglyZXR1cm4gMDsKCiAgICByZXR1cm4gR2V0TG9jYWxlSW5mb1coTUFLRUxDSUQod0xhbmcsIFNPUlRfREVGQVVMVCksIExPQ0FMRV9TRU5HTEFOR1VBR0UsIHN6TGFuZywgblNpemUpOwp9CgogCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0gewogIDYgICAgICAsICAgMywgLyogICAtICAgMSAqLyAgCiAgNiAgICAgICwgICA0LCAvKiAgIC0gICAyICovICAKICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8gIAogIDYgICAgICAsICAgNiwgLyogICAtICAgNCAqLyAgCiAgNiAgICAgICwgICA3LCAvKiAgIC0gICA1ICovICAKICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8gIAogIDYgICAgICAsICAgOSwgLyogICAtICAgNyAqLyAgCiAgNiAgICAgICwgIDEwLCAvKiAgIC0gICA4ICovICAKICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8gIAogIDcgICAgICAsICAgNiwgLyogICAtICAxMCAqLyAgCiAgNyAgICAgICwgICA3LCAvKiAgIC0gIDExICovICAKICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8gIAogIDcgICAgICAsICAgOSwgLyogICAtICAxMyAqLyAgCiAgNiAgICAgICwgIDExLCAvKiAgIC0gIDE0ICovICAKICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8gIAogIDYgICAgICAsICAxMywgLyogICAtICAxNiAqLyAgCiAgNiAgICAgICwgIDE0LCAvKiAgIC0gIDE3ICovICAKICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8gIAogIDYgICAgICAsICAxNiwgLyogICAtICAxOSAqLyAgCiAgNiAgICAgICwgIDE3LCAvKiAgIC0gIDIwICovICAKICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8gIAogIDYgICAgICAsICAxOSwgLyogICAtICAyMiAqLyAgCiAgNiAgICAgICwgIDIwLCAvKiAgIC0gIDIzICovICAKICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8gIAogIDYgICAgICAsICAyMiwgLyogICAtICAyNSAqLyAgCiAgNiAgICAgICwgIDIzLCAvKiAgIC0gIDI2ICovICAKICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8gIAogIDYgICAgICAsICAyNSwgLyogICAtICAyOCAqLyAgCiAgNiAgICAgICwgIDI2LCAvKiAgIC0gIDI5ICovICAKICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8gIAogIDYgICAgICAsICAyOCwgLyogICAtICAzMSAqLyAgCiAgNyAgICAgICwgICAyLCAvKiAgIC0gIDMyICovCiAgNyAgICAgICwgIDI4LCAvKiAhIC0gIDMzICovCiAgNyAgICAgICwgIDI5LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICA3ICAgICAgLCAgMzEsIC8qICMgLSAgMzUgKi8KICA3ICAgICAgLCAgMzMsIC8qICQgLSAgMzYgKi8KICA3ICAgICAgLCAgMzUsIC8qICUgLSAgMzcgKi8KICA3ICAgICAgLCAgMzcsIC8qICYgLSAgMzggKi8KICA2ICAgICAgLCAxMjgsIC8qICcgLSAgMzkgKi8KICA3ICAgICAgLCAgMzksIC8qICggLSAgNDAgKi8KICA3ICAgICAgLCAgNDIsIC8qICkgLSAgNDEgKi8KICA3ICAgICAgLCAgNDUsIC8qICogLSAgNDIgKi8KICA4ICAgICAgLCAgIDMsIC8qICsgLSAgNDMgKi8KICA3ICAgICAgLCAgNDcsIC8qICwgLSAgNDQgKi8KICA2ICAgICAgLCAxMzAsIC8qIC0gLSAgNDUgKi8KICA3ICAgICAgLCAgNTEsIC8qIC4gLSAgNDYgKi8KICA3ICAgICAgLCAgNTMsIC8qIC8gLSAgNDcgKi8KIDEyICAgICAgLCAgIDMsIC8qIDAgLSAgNDggKi8KIDEyICAgICAgLCAgMzMsIC8qIDEgLSAgNDkgKi8KIDEyICAgICAgLCAgNTEsIC8qIDIgLSAgNTAgKi8KIDEyICAgICAgLCAgNzAsIC8qIDMgLSAgNTEgKi8KIDEyICAgICAgLCAgODgsIC8qIDQgLSAgNTIgKi8KIDEyICAgICAgLCAxMDYsIC8qIDUgLSAgNTMgKi8KIDEyICAgICAgLCAxMjUsIC8qIDYgLSAgNTQgKi8KIDEyICAgICAgLCAxNDQsIC8qIDcgLSAgNTUgKi8KIDEyICAgICAgLCAxNjIsIC8qIDggLSAgNTYgKi8KIDEyICAgICAgLCAxODAsIC8qIDkgLSAgNTcgKi8KICA3ICAgICAgLCAgNTUsIC8qIDogLSAgNTggKi8KICA3ICAgICAgLCAgNTgsIC8qIDsgLSAgNTkgKi8KICA4ICAgICAgLCAgMTQsIC8qIDwgLSAgNjAgKi8KICA4ICAgICAgLCAgMTgsIC8qID0gLSAgNjEgKi8KICA4ICAgICAgLCAgMjAsIC8qID4gLSAgNjIgKi8KICA3ICAgICAgLCAgNjAsIC8qID8gLSAgNjMgKi8KICA3ICAgICAgLCAgNjIsIC8qIEAgLSAgNjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIEEgLSAgNjUgKi8KIDE0ICAgICAgLCAgIDksIC8qIEIgLSAgNjYgKi8KIDE0ICAgICAgLCAgMTAsIC8qIEMgLSAgNjcgKi8KIDE0ICAgICAgLCAgMjYsIC8qIEQgLSAgNjggKi8KIDE0ICAgICAgLCAgMzMsIC8qIEUgLSAgNjkgKi8KIDE0ICAgICAgLCAgMzUsIC8qIEYgLSAgNzAgKi8KIDE0ICAgICAgLCAgMzcsIC8qIEcgLSAgNzEgKi8KIDE0ICAgICAgLCAgNDQsIC8qIEggLSAgNzIgKi8KIDE0ICAgICAgLCAgNTAsIC8qIEkgLSAgNzMgKi8KIDE0ICAgICAgLCAgNTMsIC8qIEogLSAgNzQgKi8KIDE0ICAgICAgLCAgNTQsIC8qIEsgLSAgNzUgKi8KIDE0ICAgICAgLCAgNzIsIC8qIEwgLSAgNzYgKi8KIDE0ICAgICAgLCAgODEsIC8qIE0gLSAgNzcgKi8KIDE0ICAgICAgLCAxMTIsIC8qIE4gLSAgNzggKi8KIDE0ICAgICAgLCAxMjQsIC8qIE8gLSAgNzkgKi8KIDE0ICAgICAgLCAxMjYsIC8qIFAgLSAgODAgKi8KIDE0ICAgICAgLCAxMzcsIC8qIFEgLSAgODEgKi8KIDE0ICAgICAgLCAxMzgsIC8qIFIgLSAgODIgKi8KIDE0ICAgICAgLCAxNDUsIC8qIFMgLSAgODMgKi8KIDE0ICAgICAgLCAxNTMsIC8qIFQgLSAgODQgKi8KIDE0ICAgICAgLCAxNTksIC8qIFUgLSAgODUgKi8KIDE0ICAgICAgLCAxNjIsIC8qIFYgLSAgODYgKi8KIDE0ICAgICAgLCAxNjQsIC8qIFcgLSAgODcgKi8KIDE0ICAgICAgLCAxNjYsIC8qIFggLSAgODggKi8KIDE0ICAgICAgLCAxNjcsIC8qIFkgLSAgODkgKi8KIDE0ICAgICAgLCAxNjksIC8qIFogLSAgOTAgKi8KICA3ICAgICAgLCAgNjMsIC8qIFsgLSAgOTEgKi8KICA3ICAgICAgLCAgNjUsIC8qIFwgLSAgOTIgKi8KICA3ICAgICAgLCAgNjYsIC8qIF0gLSAgOTMgKi8KICA3ICAgICAgLCAgNjcsIC8qIF4gLSAgOTQgKi8KICA3ICAgICAgLCAgNjgsIC8qIF8gLSAgOTUgKi8KICA3ICAgICAgLCAgNzIsIC8qIGAgLSAgOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIGEgLSAgOTcgKi8KIDE0ICAgICAgLCAgIDksIC8qIGIgLSAgOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIGMgLSAgOTkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIGQgLSAxMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIGUgLSAxMDEgKi8KIDE0ICAgICAgLCAgMzUsIC8qIGYgLSAxMDIgKi8KIDE0ICAgICAgLCAgMzcsIC8qIGcgLSAxMDMgKi8KIDE0ICAgICAgLCAgNDQsIC8qIGggLSAxMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIGkgLSAxMDUgKi8KIDE0ICAgICAgLCAgNTMsIC8qIGogLSAxMDYgKi8KIDE0ICAgICAgLCAgNTQsIC8qIGsgLSAxMDcgKi8KIDE0ICAgICAgLCAgNzIsIC8qIGwgLSAxMDggKi8KIDE0ICAgICAgLCAgODEsIC8qIG0gLSAxMDkgKi8KIDE0ICAgICAgLCAxMTIsIC8qIG4gLSAxMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qIG8gLSAxMTEgKi8KIDE0ICAgICAgLCAxMjYsIC8qIHAgLSAxMTIgKi8KIDE0ICAgICAgLCAxMzcsIC8qIHEgLSAxMTMgKi8KIDE0ICAgICAgLCAxMzgsIC8qIHIgLSAxMTQgKi8KIDE0ICAgICAgLCAxNDUsIC8qIHMgLSAxMTUgKi8KIDE0ICAgICAgLCAxNTMsIC8qIHQgLSAxMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qIHUgLSAxMTcgKi8KIDE0ICAgICAgLCAxNjIsIC8qIHYgLSAxMTggKi8KIDE0ICAgICAgLCAxNjQsIC8qIHcgLSAxMTkgKi8KIDE0ICAgICAgLCAxNjYsIC8qIHggLSAxMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIHkgLSAxMjEgKi8KIDE0ICAgICAgLCAxNjksIC8qIHogLSAxMjIgKi8KICA3ICAgICAgLCAgNzQsIC8qIHsgLSAxMjMgKi8KICA3ICAgICAgLCAgNzYsIC8qIHwgLSAxMjQgKi8KICA3ICAgICAgLCAgNzgsIC8qIH0gLSAxMjUgKi8KICA3ICAgICAgLCAgODAsIC8qIH4gLSAxMjYgKi8KICA2ICAgICAgLCAgMjksIC8qIH8gLSAxMjcgKi8KICA2ICAgICAgLCAgMzAsIC8qIIAgLSAxMjggKi8KICA2ICAgICAgLCAgMzEsIC8qIIEgLSAxMjkgKi8KICA3ICAgICAgLCAxMjMsIC8qIIIgLSAxMzAgKi8KIDE0ICAgICAgLCAgMzUsIC8qIIMgLSAxMzEgKi8KICA3ICAgICAgLCAxMjcsIC8qIIQgLSAxMzIgKi8KIDEwICAgICAgLCAgMjEsIC8qIIUgLSAxMzMgKi8KIDEwICAgICAgLCAgMTUsIC8qIIYgLSAxMzQgKi8KIDEwICAgICAgLCAgMTYsIC8qIIcgLSAxMzUgKi8KICA3ICAgICAgLCAgNjcsIC8qIIggLSAxMzYgKi8KIDEwICAgICAgLCAgMjIsIC8qIIkgLSAxMzcgKi8KIDE0ICAgICAgLCAxNDUsIC8qIIogLSAxMzggKi8KICA3ICAgICAgLCAxMzYsIC8qIIsgLSAxMzkgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIIwgLSAxNDAgKi8KICA2ICAgICAgLCAgNDMsIC8qII0gLSAxNDEgKi8KICA2ICAgICAgLCAgNDQsIC8qII4gLSAxNDIgKi8KICA2ICAgICAgLCAgNDUsIC8qII8gLSAxNDMgKi8KICA2ICAgICAgLCAgNDYsIC8qIJAgLSAxNDQgKi8KICA3ICAgICAgLCAxMjEsIC8qIJEgLSAxNDUgKi8KICA3ICAgICAgLCAxMjIsIC8qIJIgLSAxNDYgKi8KICA3ICAgICAgLCAxMjUsIC8qIJMgLSAxNDcgKi8KICA3ICAgICAgLCAxMjYsIC8qIJQgLSAxNDggKi8KIDEwICAgICAgLCAgMTcsIC8qIJUgLSAxNDkgKi8KICA2ICAgICAgLCAxMzcsIC8qIJYgLSAxNTAgKi8KICA2ICAgICAgLCAxMzksIC8qIJcgLSAxNTEgKi8KICA3ICAgICAgLCAgOTMsIC8qIJggLSAxNTIgKi8KIDE0ICAgICAgLCAxNTYsIC8qIJkgLSAxNTMgKi8KIDE0ICAgICAgLCAxNDUsIC8qIJogLSAxNTQgKi8KICA3ICAgICAgLCAxMzcsIC8qIJsgLSAxNTUgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIJwgLSAxNTYgKi8KICA2ICAgICAgLCAgNTksIC8qIJ0gLSAxNTcgKi8KICA2ICAgICAgLCAgNjAsIC8qIJ4gLSAxNTggKi8KIDE0ICAgICAgLCAxNjcsIC8qIJ8gLSAxNTkgKi8KICA3ICAgICAgLCAgIDQsIC8qIKAgLSAxNjAgKi8KICA3ICAgICAgLCAgODEsIC8qIKEgLSAxNjEgKi8KIDEwICAgICAgLCAgIDIsIC8qIKIgLSAxNjIgKi8KIDEwICAgICAgLCAgIDMsIC8qIKMgLSAxNjMgKi8KIDEwICAgICAgLCAgIDQsIC8qIKQgLSAxNjQgKi8KIDEwICAgICAgLCAgIDUsIC8qIKUgLSAxNjUgKi8KICA3ICAgICAgLCAgODIsIC8qIKYgLSAxNjYgKi8KIDEwICAgICAgLCAgIDYsIC8qIKcgLSAxNjcgKi8KICA3ICAgICAgLCAgODMsIC8qIKggLSAxNjggKi8KIDEwICAgICAgLCAgIDcsIC8qIKkgLSAxNjkgKi8KIDE0ICAgICAgLCAgIDIsIC8qIKogLSAxNzAgKi8KICA4ICAgICAgLCAgMjQsIC8qIKsgLSAxNzEgKi8KIDEwICAgICAgLCAgIDgsIC8qIKwgLSAxNzIgKi8KICA2ICAgICAgLCAxMzEsIC8qIK0gLSAxNzMgKi8KIDEwICAgICAgLCAgIDksIC8qIK4gLSAxNzQgKi8KICA3ICAgICAgLCAgODQsIC8qIK8gLSAxNzUgKi8KIDEwICAgICAgLCAgMTAsIC8qILAgLSAxNzYgKi8KICA4ICAgICAgLCAgMjMsIC8qILEgLSAxNzcgKi8KIDEyICAgICAgLCAgNTEsIC8qILIgLSAxNzggKi8KIDEyICAgICAgLCAgNzAsIC8qILMgLSAxNzkgKi8KICA3ICAgICAgLCAgODUsIC8qILQgLSAxODAgKi8KIDEwICAgICAgLCAgMTEsIC8qILUgLSAxODEgKi8KIDEwICAgICAgLCAgMTIsIC8qILYgLSAxODIgKi8KIDEwICAgICAgLCAgMTMsIC8qILcgLSAxODMgKi8KICA3ICAgICAgLCAgODYsIC8qILggLSAxODQgKi8KIDEyICAgICAgLCAgMzMsIC8qILkgLSAxODUgKi8KIDE0ICAgICAgLCAxMjQsIC8qILogLSAxODYgKi8KICA4ICAgICAgLCAgMjYsIC8qILsgLSAxODcgKi8KIDEyICAgICAgLCAgMjEsIC8qILwgLSAxODggKi8KIDEyICAgICAgLCAgMjUsIC8qIL0gLSAxODkgKi8KIDEyICAgICAgLCAgMjksIC8qIL4gLSAxOTAgKi8KICA3ICAgICAgLCAgODcsIC8qIL8gLSAxOTEgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMAgLSAxOTIgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMEgLSAxOTMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMIgLSAxOTQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMMgLSAxOTUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMQgLSAxOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMUgLSAxOTcgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIMYgLSAxOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIMcgLSAxOTkgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMggLSAyMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMkgLSAyMDEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMogLSAyMDIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMsgLSAyMDMgKi8KIDE0ICAgICAgLCAgNTAsIC8qIMwgLSAyMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM0gLSAyMDUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM4gLSAyMDYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM8gLSAyMDcgKi8KIDE0ICAgICAgLCAgMjYsIC8qINAgLSAyMDggKi8KIDE0ICAgICAgLCAxMTIsIC8qINEgLSAyMDkgKi8KIDE0ICAgICAgLCAxMjQsIC8qINIgLSAyMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qINMgLSAyMTEgKi8KIDE0ICAgICAgLCAxMjQsIC8qINQgLSAyMTIgKi8KIDE0ICAgICAgLCAxMjQsIC8qINUgLSAyMTMgKi8KIDE0ICAgICAgLCAxMjQsIC8qINYgLSAyMTQgKi8KICA4ICAgICAgLCAgMjgsIC8qINcgLSAyMTUgKi8KIDE0ICAgICAgLCAxMjQsIC8qINggLSAyMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qINkgLSAyMTcgKi8KIDE0ICAgICAgLCAxNTksIC8qINogLSAyMTggKi8KIDE0ICAgICAgLCAxNTksIC8qINsgLSAyMTkgKi8KIDE0ICAgICAgLCAxNTksIC8qINwgLSAyMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIN0gLSAyMjEgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIN4gLSAyMjIgKi8KIDE0ICsgNDggLCAxNDUsIC8qIN8gLSAyMjMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOAgLSAyMjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOEgLSAyMjUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOIgLSAyMjYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOMgLSAyMjcgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOQgLSAyMjggKi8KIDE0ICAgICAgLCAgIDIsIC8qIOUgLSAyMjkgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIOYgLSAyMzAgKi8KIDE0ICAgICAgLCAgMTAsIC8qIOcgLSAyMzEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOggLSAyMzIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOkgLSAyMzMgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOogLSAyMzQgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOsgLSAyMzUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIOwgLSAyMzYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO0gLSAyMzcgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO4gLSAyMzggKi8KIDE0ICAgICAgLCAgNTAsIC8qIO8gLSAyMzkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIPAgLSAyNDAgKi8KIDE0ICAgICAgLCAxMTIsIC8qIPEgLSAyNDEgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPIgLSAyNDIgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPMgLSAyNDMgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPQgLSAyNDQgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPUgLSAyNDUgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPYgLSAyNDYgKi8KICA4ICAgICAgLCAgMjksIC8qIPcgLSAyNDcgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPggLSAyNDggKi8KIDE0ICAgICAgLCAxNTksIC8qIPkgLSAyNDkgKi8KIDE0ICAgICAgLCAxNTksIC8qIPogLSAyNTAgKi8KIDE0ICAgICAgLCAxNTksIC8qIPsgLSAyNTEgKi8KIDE0ICAgICAgLCAxNTksIC8qIPwgLSAyNTIgKi8KIDE0ICAgICAgLCAxNjcsIC8qIP0gLSAyNTMgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIP4gLSAyNTQgKi8KIDE0ICAgICAgLCAxNjcgIC8qIP8gLSAyNTUgKi8gfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVF8yW10gPSB7IDMzLCA0NCwgMTQ1IH07CgojZGVmaW5lIExDTV9EaWFjcml0aWNfU3RhcnQgMTMxCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fRGlhY3JpdGljX0xVVFtdID0geyAKMTIzLCAgLyoggyAtIDEzMSAqLwogIDIsICAvKiCEIC0gMTMyICovCiAgMiwgIC8qIIUgLSAxMzMgKi8KICAyLCAgLyoghiAtIDEzNCAqLwogIDIsICAvKiCHIC0gMTM1ICovCiAgMywgIC8qIIggLSAxMzYgKi8KICAyLCAgLyogiSAtIDEzNyAqLwogMjAsICAvKiCKIC0gMTM4ICovCiAgMiwgIC8qIIsgLSAxMzkgKi8KICAyLCAgLyogjCAtIDE0MCAqLwogIDIsICAvKiCNIC0gMTQxICovCiAgMiwgIC8qII4gLSAxNDIgKi8KICAyLCAgLyogjyAtIDE0MyAqLwogIDIsICAvKiCQIC0gMTQ0ICovCiAgMiwgIC8qIJEgLSAxNDUgKi8KICAyLCAgLyogkiAtIDE0NiAqLwogIDIsICAvKiCTIC0gMTQ3ICovCiAgMiwgIC8qIJQgLSAxNDggKi8KICAyLCAgLyoglSAtIDE0OSAqLwogIDIsICAvKiCWIC0gMTUwICovCiAgMiwgIC8qIJcgLSAxNTEgKi8KICAyLCAgLyogmCAtIDE1MiAqLwogIDIsICAvKiCZIC0gMTUzICovCiAyMCwgIC8qIJogLSAxNTQgKi8KICAyLCAgLyogmyAtIDE1NSAqLwogIDIsICAvKiCcIC0gMTU2ICovCiAgMiwgIC8qIJ0gLSAxNTcgKi8KICAyLCAgLyogniAtIDE1OCAqLwogMTksICAvKiCfIC0gMTU5ICovCiAgMiwgIC8qIKAgLSAxNjAgKi8KICAyLCAgLyogoSAtIDE2MSAqLwogIDIsICAvKiCiIC0gMTYyICovCiAgMiwgIC8qIKMgLSAxNjMgKi8KICAyLCAgLyogpCAtIDE2NCAqLwogIDIsICAvKiClIC0gMTY1ICovCiAgMiwgIC8qIKYgLSAxNjYgKi8KICAyLCAgLyogpyAtIDE2NyAqLwogIDIsICAvKiCoIC0gMTY4ICovCiAgMiwgIC8qIKkgLSAxNjkgKi8KICAzLCAgLyogqiAtIDE3MCAqLwogIDIsICAvKiCrIC0gMTcxICovCiAgMiwgIC8qIKwgLSAxNzIgKi8KICAyLCAgLyogrSAtIDE3MyAqLwogIDIsICAvKiCuIC0gMTc0ICovCiAgMiwgIC8qIK8gLSAxNzUgKi8KICAyLCAgLyogsCAtIDE3NiAqLwogIDIsICAvKiCxIC0gMTc3ICovCiAgMiwgIC8qILIgLSAxNzggKi8KICAyLCAgLyogsyAtIDE3OSAqLwogIDIsICAvKiC0IC0gMTgwICovCiAgMiwgIC8qILUgLSAxODEgKi8KICAyLCAgLyogtiAtIDE4MiAqLwogIDIsICAvKiC3IC0gMTgzICovCiAgMiwgIC8qILggLSAxODQgKi8KICAyLCAgLyoguSAtIDE4NSAqLwogIDMsICAvKiC6IC0gMTg2ICovCiAgMiwgIC8qILsgLSAxODcgKi8KICAyLCAgLyogvCAtIDE4OCAqLwogIDIsICAvKiC9IC0gMTg5ICovCiAgMiwgIC8qIL4gLSAxOTAgKi8KICAyLCAgLyogvyAtIDE5MSAqLwogMTUsICAvKiDAIC0gMTkyICovCiAxNCwgIC8qIMEgLSAxOTMgKi8KIDE4LCAgLyogwiAtIDE5NCAqLwogMjUsICAvKiDDIC0gMTk1ICovCiAxOSwgIC8qIMQgLSAxOTYgKi8KIDI2LCAgLyogxSAtIDE5NyAqLwogIDIsICAvKiDGIC0gMTk4ICovCiAyOCwgIC8qIMcgLSAxOTkgKi8KIDE1LCAgLyogyCAtIDIwMCAqLwogMTQsICAvKiDJIC0gMjAxICovCiAxOCwgIC8qIMogLSAyMDIgKi8KIDE5LCAgLyogyyAtIDIwMyAqLwogMTUsICAvKiDMIC0gMjA0ICovCiAxNCwgIC8qIM0gLSAyMDUgKi8KIDE4LCAgLyogziAtIDIwNiAqLwogMTksICAvKiDPIC0gMjA3ICovCjEwNCwgIC8qINAgLSAyMDggKi8KIDI1LCAgLyog0SAtIDIwOSAqLwogMTUsICAvKiDSIC0gMjEwICovCiAxNCwgIC8qINMgLSAyMTEgKi8KIDE4LCAgLyog1CAtIDIxMiAqLwogMjUsICAvKiDVIC0gMjEzICovCiAxOSwgIC8qINYgLSAyMTQgKi8KICAyLCAgLyog1yAtIDIxNSAqLwogMzMsICAvKiDYIC0gMjE2ICovCiAxNSwgIC8qINkgLSAyMTcgKi8KIDE0LCAgLyog2iAtIDIxOCAqLwogMTgsICAvKiDbIC0gMjE5ICovCiAxOSwgIC8qINwgLSAyMjAgKi8KIDE0LCAgLyog3SAtIDIyMSAqLwogIDIsICAvKiDeIC0gMjIyICovCiAgMiwgIC8qIN8gLSAyMjMgKi8KIDE1LCAgLyog4CAtIDIyNCAqLwogMTQsICAvKiDhIC0gMjI1ICovCiAxOCwgIC8qIOIgLSAyMjYgKi8KIDI1LCAgLyog4yAtIDIyNyAqLwogMTksICAvKiDkIC0gMjI4ICovCiAyNiwgIC8qIOUgLSAyMjkgKi8KICAyLCAgLyog5iAtIDIzMCAqLwogMjgsICAvKiDnIC0gMjMxICovCiAxNSwgIC8qIOggLSAyMzIgKi8KIDE0LCAgLyog6SAtIDIzMyAqLwogMTgsICAvKiDqIC0gMjM0ICovCiAxOSwgIC8qIOsgLSAyMzUgKi8KIDE1LCAgLyog7CAtIDIzNiAqLwogMTQsICAvKiDtIC0gMjM3ICovCiAxOCwgIC8qIO4gLSAyMzggKi8KIDE5LCAgLyog7yAtIDIzOSAqLwoxMDQsICAvKiDwIC0gMjQwICovCiAyNSwgIC8qIPEgLSAyNDEgKi8KIDE1LCAgLyog8iAtIDI0MiAqLwogMTQsICAvKiDzIC0gMjQzICovCiAxOCwgIC8qIPQgLSAyNDQgKi8KIDI1LCAgLyog9SAtIDI0NSAqLwogMTksICAvKiD2IC0gMjQ2ICovCiAgMiwgIC8qIPcgLSAyNDcgKi8KIDMzLCAgLyog+CAtIDI0OCAqLwogMTUsICAvKiD5IC0gMjQ5ICovCiAxNCwgIC8qIPogLSAyNTAgKi8KIDE4LCAgLyog+yAtIDI1MSAqLwogMTksICAvKiD8IC0gMjUyICovCiAxNCwgIC8qIP0gLSAyNTMgKi8KICAyLCAgLyog/iAtIDI1NCAqLwogMTksICAvKiD/IC0gMjU1ICovCn0gOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzUHVuY3R1YXRpb24gW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzUHVuY3R1YXRpb24odW5zaWduZWQgY2hhciBjKSAKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcyAKICAgICBjb25zaWRlcmVkICJsZXNzIGltcG9ydGFudCIgZHVyaW5nIHdvcmQgc29ydCBjb21wYXJpc29uLgogICAgIFNlZSBMQ01hcFN0cmluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiAKICAgICBvZiAibGVzcyBpbXBvcnRhbnQiLiAqLwoKICByZXR1cm4gKExDTV9Vbmljb2RlX0xVVFstMisyKmNdPT02KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzTm9uU3BhY2luZyBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNOb25TcGFjaW5nKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVOT05TUEFDRSAqLwogIHJldHVybiAoKGM9PTEzNikgfHwgKGM9PTE3MCkgfHwgKGM9PTE4NikpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNTeW1ib2wgW0lOVEVSTkFMXQogKiBGSVhNRTogaGFuZGxlIGN1cnJlbnQgbG9jYWxlCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNTeW1ib2wodW5zaWduZWQgY2hhciBjKSAKewogIC8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBMQ01hcFN0cmluZ0EuICBDaGFyYWN0ZXJzIAogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRVNZTUJPTFMgKi8KICByZXR1cm4gKCAoYyE9MCkgJiYgIShpc2FscGhhKGMpIHx8IGlzZGlnaXQoYykpICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCWlkZW50aXR5CVtJbnRlcm5hbF0KICovCnN0YXRpYyBpbnQgaWRlbnRpdHkoaW50IGMpCnsKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBJZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSwgdGhlIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUKICogYSBzb3J0IGtleSBmb3IgdGhlIHNvdXJjZSBzdHJpbmcuICBFbHNlLCBpdCB3aWxsIGNvbnZlcnQgaXQKICogYWNjb3JkaW5nbHkgdG8gdGhlIGZsYWdzIExDTUFQX1VQUEVSQ0FTRSwgTENNQVBfTE9XRVJDQVNFLC4uLgogKgogKiBSRVRVUk5TCiAqICAgIEVycm9yIDogMC4KICogICAgU3VjY2VzcyA6IGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZy4KICoKICogTk9URVMKICogICAgSWYgY2FsbGVkIHdpdGggc2NybGVuID0gLTEsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGxlbmd0aAogKiAgICAgIG9mIHRoZSAwLXRlcm1pbmF0ZWQgc3RyaW5nIHN0cnNyYyBieSBpdHNlbGYuICAgICAgCiAqIAogKiAgICBJZiBjYWxsZWQgd2l0aCBkc3RsZW4gPSAwLCByZXR1cm5zIHRoZSBidWZmZXIgbGVuZ3RoIHRoYXQgCiAqICAgICAgd291bGQgYmUgcmVxdWlyZWQuCiAqCiAqICAgIE5PUk1fSUdOT1JFV0lEVEggbWVhbnMgdG8gY29tcGFyZSBBU0NJSSBhbmQgd2lkZSBjaGFyYWN0ZXJzCiAqICAgIGFzIGlmIHRoZXkgYXJlIGVxdWFsLiAgCiAqICAgIEluIHRoZSBvbmx5IGNvZGUgcGFnZSBpbXBsZW1lbnRlZCBzbyBmYXIsIHRoZXJlIG1heSBub3QgYmUKICogICAgd2lkZSBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgcGFzc2VkIHRvIExDTWFwU3RyaW5nQSwKICogICAgc28gdGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIGZvciB0aGlzIGZsYWcuCiAqLwpJTlQgV0lOQVBJIExDTWFwU3RyaW5nQSgKCUxDSUQgbGNpZCwgICAgICAvKiBbaW5dIGxvY2FsZSBpZGVudGlmaWVyIGNyZWF0ZWQgd2l0aCBNQUtFTENJRDsgCgkJICAgICAgICAgICAgICAgIExPQ0FMRV9TWVNURU1fREVGQVVMVCBhbmQgTE9DQUxFX1VTRVJfREVGQVVMVCBhcmUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVmaW5lZCB2YWx1ZXMuICovCglEV09SRCBtYXBmbGFncywgLyogW2luXSBmbGFncyAqLwoJTFBDU1RSIHNyY3N0ciwgIC8qIFtpbl0gc291cmNlIGJ1ZmZlciAqLwoJSU5UIHNyY2xlbiwgICAgIC8qIFtpbl0gc291cmNlIGxlbmd0aCAqLwoJTFBTVFIgZHN0c3RyLCAgIC8qIFtvdXRdIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLwoJSU5UIGRzdGxlbikgICAgIC8qIFtpbl0gZGVzdGluYXRpb24gYnVmZmVyIGxlbmd0aCAqLwp7CiAgaW50IGk7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3MsZGVidWdzdHJfYW4oc3Jjc3RyLHNyY2xlbiksc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUigiKHNyYz0lcyxkZXN0PSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwKCWRlYnVnc3RyX2FuKHNyY3N0cixzcmNsZW4pLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuID09IC0xKSAKICAgIHNyY2xlbiA9IHN0cmxlbihzcmNzdHIpICsgMSA7ICAgIC8qIChpbmNsdWRlIGZpbmFsICdcMCcpICovCgojZGVmaW5lIExDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MgKExDTUFQX1VQUEVSQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01BUF9MT1dFUkNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENNQVBfU09SVEtFWSAgICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRU5PTlNQQUNFIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09SVF9TVFJJTkdTT1JUICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFV0lEVEggICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRUtBTkFUWVBFKQogIC8qIEZJWE1FOiBhcyBsb25nIGFzIHdlIGRvbid0IHN1cHBvcnQgS2F0YWthbmEgbm9yIEhpcmFnYW5hIAogICAqIGNoYXJhY3RlcnMsIHdlIGNhbiBzdXBwb3J0IE5PUk1fSUdOT1JFS0FOQVRZUEUKICAgKi8KICBpZiAobWFwZmxhZ3MgJiB+TENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUykKICB7CiAgICBGSVhNRSgiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZCk6ICIKCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCgkgIGxjaWQsCgkgIG1hcGZsYWdzLAoJICBzcmNzdHIsCgkgIHNyY2xlbiwKCSAgZHN0c3RyLAoJICBkc3RsZW4sCgkgIG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MKICAgICApOwogIH0KCiAgaWYgKCAhKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgKQogIHsKICAgIGludCBpLGo7CiAgICBpbnQgKCpmKShpbnQpID0gaWRlbnRpdHk7IAogICAgaW50IGZsYWdfaWdub3Jlbm9uc3BhY2UgPSBtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0U7CiAgICBpbnQgZmxhZ19pZ25vcmVzeW1ib2xzID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRVNZTUJPTFM7CgogICAgaWYgKGZsYWdfaWdub3Jlbm9uc3BhY2UgfHwgZmxhZ19pZ25vcmVzeW1ib2xzKQogICAgewogICAgICAvKiBGb3Igc29tZSB2YWx1ZXMgb2YgbWFwZmxhZ3MsIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyAKCSBzdHJpbmcgaXMgbm90IGtub3duIGF0IHRoaXMgcG9pbnQuICBXaW5kb3dzIGRvZXMgbWFwIHRoZSBzdHJpbmcKCSBhbmQgZG9lcyBub3QgU2V0TGFzdEVycm9yIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIgaW4KCSB0aGVzZSBjYXNlcy4gKi8KICAgICAgaWYgKGRzdGxlbj09MCkKICAgICAgewoJLyogQ29tcHV0ZSByZXF1aXJlZCBsZW5ndGggKi8KCWZvciAoaT1qPTA7IGkgPCBzcmNsZW47IGkrKykKCXsKCSAgaWYgKCAhKGZsYWdfaWdub3Jlbm9uc3BhY2UgJiYgT0xFMk5MU19pc05vblNwYWNpbmcoc3Jjc3RyW2ldKSkKCSAgICAgICAmJiAhKGZsYWdfaWdub3Jlc3ltYm9scyAmJiBPTEUyTkxTX2lzU3ltYm9sKHNyY3N0cltpXSkpICkKCSAgICBqKys7Cgl9CglyZXR1cm4gajsKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAoZHN0bGVuPT0wKQoJcmV0dXJuIHNyY2xlbjsgIAogICAgICBpZiAoZHN0bGVuPHNyY2xlbikgCgkgICB7CgkgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCSAgICAgcmV0dXJuIDA7CgkgICB9CiAgICB9CiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgLyogRklYTUU6IE5PUk1fSUdOT1JFTk9OU1BBQ0UgcmVxdWlyZXMgYW5vdGhlciBjb252ZXJzaW9uICovCiAgICBmb3IgKGk9aj0wOyAoaTxzcmNsZW4pICYmIChqPGRzdGxlbikgOyBpKyspCiAgICB7CiAgICAgIGlmICggIShmbGFnX2lnbm9yZW5vbnNwYWNlICYmIE9MRTJOTFNfaXNOb25TcGFjaW5nKHNyY3N0cltpXSkpCgkgICAmJiAhKGZsYWdfaWdub3Jlc3ltYm9scyAmJiBPTEUyTkxTX2lzU3ltYm9sKHNyY3N0cltpXSkpICkKICAgICAgewoJZHN0c3RyW2pdID0gKENIQVIpIGYoc3Jjc3RyW2ldKTsKCWorKzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGo7CiAgfQoKICAvKiBGSVhNRTogVGhpcyBmdW5jdGlvbiBjb21wbGV0ZWx5IGlnbm9yZXMgdGhlICJsY2lkIiBwYXJhbWV0ZXIuICovCiAgLyogZWxzZSAuLi4gKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgICovCiAgewogICAgaW50IHVuaWNvZGVfbGVuPTA7CiAgICBpbnQgY2FzZV9sZW49MDsKICAgIGludCBkaWFjcml0aWNfbGVuPTA7CiAgICBpbnQgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW49MDsKICAgIGNoYXIgKmNhc2VfY29tcG9uZW50OwogICAgY2hhciAqZGlhY3JpdGljX2NvbXBvbmVudDsKICAgIGNoYXIgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50OwogICAgaW50IHJvb20sY291bnQ7CiAgICBpbnQgZmxhZ19zdHJpbmdzb3J0ID0gbWFwZmxhZ3MgJiBTT1JUX1NUUklOR1NPUlQ7CgogICAgLyogY29tcHV0ZSBob3cgbXVjaCByb29tIHdlIHdpbGwgbmVlZCAqLwogICAgZm9yIChpPTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICBpbnQgb2ZzOwogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyID0gc3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpZiAoZmxhZ19zdHJpbmdzb3J0IHx8ICFPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKQoJewoJICB1bmljb2RlX2xlbisrOwoJICBpZiAoIExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXSAmIH4xNSApCgkgICAgdW5pY29kZV9sZW4rKzsgICAgICAgICAgICAgLyogZG91YmxlIGxldHRlciAqLwoJfQoJZWxzZQoJewoJICBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbisrOwoJfQkgIAogICAgICB9CgkgIAogICAgICBpZiAoaXN1cHBlcihzb3VyY2VfY2hhcikpCgljYXNlX2xlbj11bmljb2RlX2xlbjsgCgogICAgICBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CiAgICAgIGlmICgob2ZzPj0wKSAmJiAoTENNX0RpYWNyaXRpY19MVVRbb2ZzXSE9MikpCglkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKICAgICAgY2FzZV9sZW49MDsgICAgICAgICAgICAgICAgICAgCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQogICAgICBkaWFjcml0aWNfbGVuPTA7CgogICAgcm9vbSA9ICAyICogdW5pY29kZV9sZW4gICAgICAgICAgICAgIC8qICJ1bmljb2RlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgZGlhY3JpdGljX2xlbiAgICAgICAgICAgICAgICAvKiAiZGlhY3JpdGljIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgY2FzZV9sZW4gICAgICAgICAgICAgICAgICAgICAvKiAiY2FzZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIDQgKiBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbiAgLyogcHVuY3R1YXRpb24gaW4gd29yZCBzb3J0IG1vZGUgKi8KICAgICAgKyAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VyICdcMScgc2VwYXJhdG9ycyAqLwogICAgICArICAgICAxICA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmFsICdcMCcgKi8KICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiByb29tOyAgICAgIAogICAgZWxzZSBpZiAoZHN0bGVuPHJvb20pCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiNpZiAwCiAgICAvKkZJWE1FIHRoZSBQb2ludGVyY2hlY2sgc2hvdWxkIG5vdCBiZSBuZXNzZXNhcnkgKi8KICAgIGlmIChJc0JhZFdyaXRlUHRyIChkc3RzdHIscm9vbSkpCiAgICB7IEVSUigiYmFkIGRlc3RpbmF0aW9uIGJ1ZmZlciAoZHN0c3RyKSA6ICVwLCVkXG4iLGRzdHN0cixkc3RsZW4pOwogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIHJldHVybiAwOwogICAgfQojZW5kaWYKICAgIC8qIGxvY2F0ZSBlYWNoIGNvbXBvbmVudCwgd3JpdGUgc2VwYXJhdG9ycyAqLwogICAgZGlhY3JpdGljX2NvbXBvbmVudCA9IGRzdHN0ciArIDIqdW5pY29kZV9sZW4gOwogICAgKmRpYWNyaXRpY19jb21wb25lbnQrKyA9ICdcMSc7IAogICAgY2FzZV9jb21wb25lbnQgPSBkaWFjcml0aWNfY29tcG9uZW50ICsgZGlhY3JpdGljX2xlbiA7CiAgICAqY2FzZV9jb21wb25lbnQrKyA9ICdcMSc7IAogICAgZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQgPSBjYXNlX2NvbXBvbmVudCArIGNhc2VfbGVuIDsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKCiAgICAvKiByZWFkIHNvdXJjZSBzdHJpbmcgY2hhciBieSBjaGFyLCB3cml0ZSAKICAgICAgIGNvcnJlc3BvbmRpbmcgd2VpZ2h0IGluIGVhY2ggY29tcG9uZW50LiAqLwogICAgZm9yIChpPTAsY291bnQ9MDtpPHNyY2xlbjtpKyspCiAgICB7CiAgICAgIHVuc2lnbmVkIGNoYXIgc291cmNlX2NoYXI9c3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpbnQgdHlwZSxsb25nY29kZTsKCXR5cGUgPSBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl07Cglsb25nY29kZSA9IHR5cGUgPj4gNDsKCXR5cGUgJj0gMTU7CglpZiAoIWZsYWdfc3RyaW5nc29ydCAmJiBPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKSAKCXsKCSAgV09SRCBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uJjI1NSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQoJCQljb21wYXRpYmxlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb24gKi8KCgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKICAgICAgICAgICAgICAgICAgICAgLyogYXNzdW1wdGlvbiA6IGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyIGlzIG5ldmVyIGEgCgkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKCSAgaWYgKGxvbmdjb2RlKQoJICB7CgkgICAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gMjsgLyogYXNzdW1wdGlvbjogYSBkb3VibGUgbGV0dGVyCgkJCQkJCSBpcyBuZXZlciBhY2NlbnRlZCAqLwoJICAgIGNvdW50Kys7CgkgICAgCgkgICAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgICBkc3RzdHJbMipjb3VudCsxXSA9ICooTENNX1VuaWNvZGVfTFVUXzIgLSAxICsgbG9uZ2NvZGUpOyAKCSAgICAvKiAxNiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDEgCgkgICAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyIAoJICAgICAgIDQ4IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMyAqLwoJICB9CgoJICBpZiAoY291bnQ8Y2FzZV9sZW4pCgkgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgIHsKCSAgICBpbnQgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwoJICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gKG9mcz49MCA/IExDTV9EaWFjcml0aWNfTFVUW29mc10gOiAyKTsKCSAgfQoJICBjb3VudCsrOwoJfQogICAgICB9CiAgICB9CiAgICBkc3RzdHJbcm9vbS0xXSA9ICdcMCc7CiAgICByZXR1cm4gcm9vbTsKICB9Cn0KCQkgICAgIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmdXICAgICAgICAgICAgICAgIFtLRVJORUwzMi5AXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIE5PVEUKICoKICogU2VlIExDTWFwU3RyaW5nQSBmb3IgZG9jdW1lbnRhdGlvbgogKi8KSU5UIFdJTkFQSSBMQ01hcFN0cmluZ1coCglMQ0lEIGxjaWQsRFdPUkQgbWFwZmxhZ3MsTFBDV1NUUiBzcmNzdHIsSU5UIHNyY2xlbixMUFdTVFIgZHN0c3RyLAoJSU5UIGRzdGxlbikKewogIGludCBpOwogCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAogICAgICAgICAgICAgICAgIGxjaWQsIG1hcGZsYWdzLCBzcmNzdHIsIHNyY2xlbiwgZHN0c3RyLCBkc3RsZW4pOwogIAogIGlmICggKChkc3RsZW4hPTApICYmIChkc3RzdHI9PU5VTEwpKSB8fCAoc3Jjc3RyPT1OVUxMKSApCiAgewogICAgRVJSKCIoc3JjPSVwLGRzdD0lcCk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHNyY3N0ciwgZHN0c3RyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbj09LTEpIAogICAgc3JjbGVuID0gc3RybGVuVyhzcmNzdHIpKzE7CgogIC8qIEZJWE1FOiBCb3RoIHRoaXMgZnVuY3Rpb24gYW5kIGl0J3MgY29tcGFuaW9uIExDTWFwU3RyaW5nQSgpCiAgICogY29tcGxldGVseSBpZ25vcmUgdGhlICJsY2lkIiBwYXJhbWV0ZXIuICBJbiBwbGFjZSBvZiB0aGUgImxjaWQiCiAgICogcGFyYW1ldGVyIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCB0aGUgIkxDX0NPTExBVEUiIG9yICJMQ19BTEwiCiAgICogZW52aXJvbm1lbnQgdmFyaWFibGUgcHJpb3IgdG8gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gICovCiAgaWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgCiAgewogICAgICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgTENfQ09MTEFURS4gKi8KICAgICAgY2hhciAqbGNfY29sbGF0ZV9kZWZhdWx0ID0gMDsgLyogdmFsdWUgcHJpb3IgdG8gdGhpcyBmdW5jdGlvbiAqLwogICAgICBjaGFyICpsY19jb2xsYXRlX2VudiA9IDA7ICAgICAvKiB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KCiAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBpbmRleCBpbnRvIHN0cmluZ3Mgb2YgYW55IHR5cGUuICovCiAgICAgIGludCBzdHJfaWR4ID0gMDsKCiAgICAgIC8qIExlbmd0aHMgb2YgdmFyaW91cyBzdHJpbmdzIHdoZXJlIHRoZSBsZW5ndGggaXMgbWVhc3VyZWQgaW4KICAgICAgICogd2lkZSBjaGFyYWN0ZXJzIGZvciB3aWRlIGNoYXJhY3RlciBzdHJpbmdzIGFuZCBpbiBieXRlcyBmb3IKICAgICAgICogbmF0aXZlIHN0cmluZ3MuICBUaGUgbGVuZ3RocyBpbmNsdWRlIHRoZSBOVUxMIHRlcm1pbmF0b3IuICAqLwogICAgICBzaXplX3QgcmV0dXJuZWRfbGVuICAgID0gMDsKICAgICAgc2l6ZV90IHNyY19uYXRpdmVfbGVuICA9IDA7CiAgICAgIHNpemVfdCBkc3RfbmF0aXZlX2xlbiAgPSAwOwogICAgICBzaXplX3QgZHN0c3RyX2xpYmNfbGVuID0gMDsKCiAgICAgIC8qIE5hdGl2ZSAoY2hhcmFjdGVyIHNldCBkZXRlcm1pbmVkIGJ5IGxvY2FsZSkgdmVyc2lvbnMgb2YgdGhlCiAgICAgICAqIHN0cmluZ3Mgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdHJpbmdzLiAgKi8KICAgICAgTFBTVFIgc3JjX25hdGl2ZSA9IDA7CiAgICAgIExQU1RSIGRzdF9uYXRpdmUgPSAwOwoKICAgICAgLyogVmVyc2lvbiBvZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdHJpbmdzIHVzaW5nIHRoZQogICAgICAgKiAid2NoYXJfdCIgVW5pY29kZSBkYXRhIHR5cGUgbmVlZGVkIGJ5IHZhcmlvdXMgbGliYyBmdW5jdGlvbnMuICAqLwogICAgICB3Y2hhcl90ICpzcmNzdHJfbGliYyA9IDA7CiAgICAgIHdjaGFyX3QgKmRzdHN0cl9saWJjID0gMDsKCiAgICAgIGlmKCEoc3Jjc3RyX2xpYmMgPSAod2NoYXJfdCAqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNsZW4gKiBzaXplb2Yod2NoYXJfdCkpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIHNyY3N0cl9saWJjXG4iLAogICAgICAgICAgICAgIHNyY2xlbiAqIHNpemVvZih3Y2hhcl90KSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIENvbnZlcnQgc291cmNlIHN0cmluZyB0byBhIGxpYmMgVW5pY29kZSBzdHJpbmcuICovCiAgICAgIGZvcihzdHJfaWR4ID0gMDsgc3RyX2lkeCA8IHNyY2xlbjsgc3RyX2lkeCsrKQogICAgICB7CiAgICAgICAgICBzcmNzdHJfbGliY1tzdHJfaWR4XSA9IHNyY3N0cltzdHJfaWR4XTsKICAgICAgfQoKICAgICAgLyogc3JjX25hdGl2ZSBzaG91bGQgY29udGFpbiBhdCBtb3N0IDMgYnl0ZXMgZm9yIGVhY2gKICAgICAgICogbXVsdGlieXRlIGNoYXJhY3RlcnMgaW4gdGhlIG9yaWdpbmFsIHNyY3N0ciBzdHJpbmcuICAqLwogICAgICBzcmNfbmF0aXZlX2xlbiA9IDMgKiBzcmNsZW47CiAgICAgIGlmKCEoc3JjX25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIHNyY19uYXRpdmVcbiIsIHNyY19uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIEZJWE1FOiBQcmlvciB0byB0byBzZXR0aW5nIHRoZSBMQ19DT0xMQVRFIGxvY2FsZSBjYXRlZ29yeSB0aGUKICAgICAgICogY3VycmVudCB2YWx1ZSBpcyBiYWNrZWQgdXAgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGFmdGVyIHRoZQogICAgICAgKiBsYXN0IExDX0NPTExBVEUgc2Vuc2l0aXZlIGZ1bmN0aW9uIHJldHVybnMuCiAgICAgICAqIAogICAgICAgKiBFdmVuIHRob3VnaCB0aGUgbG9jYWxlIGlzIGFkanVzdGVkIGZvciBhIG1pbmltdW0gYW1vdW50IG9mCiAgICAgICAqIHRpbWUgYSByYWNlIGNvbmRpdGlvbiBleGlzdHMgd2hlcmUgb3RoZXIgdGhyZWFkcyBtYXkgYmUKICAgICAgICogYWZmZWN0ZWQgaWYgdGhleSBpbnZva2UgTENfQ09MTEFURSBzZW5zaXRpdmUgZnVuY3Rpb25zLiAgT25lCiAgICAgICAqIHBvc3NpYmxlIHNvbHV0aW9uIGlzIHRvIHdyYXAgYWxsIExDX0NPTExBVEUgc2Vuc2l0aXZlIFdpbmUKICAgICAgICogZnVuY3Rpb25zLCBsaWtlIExDTWFwU3RyaW5nVygpLCBpbiBhIG11dGV4LgogICAgICAgKgogICAgICAgKiBBbm90aGVyIGVuaGFuY2VtZW50IHRvIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgdG8gc2V0IHRoZQogICAgICAgKiBMQ19DT0xMQVRFIGxvY2FsZSBjYXRlZ29yeSBhcyBhIGZ1bmN0aW9uIG9mIHRoZSAibGNpZCIKICAgICAgICogcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlICJMQ19DT0xMQVRFIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gKi8KICAgICAgaWYoIShsY19jb2xsYXRlX2RlZmF1bHQgPSBzZXRsb2NhbGUoTENfQ09MTEFURSwgTlVMTCkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBxdWVyeSB0aGUgTENfQ09MTEFURSBjYXRhZ29yeVxuIik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIGlmKCEobGNfY29sbGF0ZV9lbnYgPSBzZXRsb2NhbGUoTENfQ09MTEFURSwgIiIpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gaW5oZXJpdCB0aGUgTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgZnJvbSB0aGUgIgogICAgICAgICAgICAgICJlbnZpcm9ubWVudC4gIFRoZSBcIkxDX0NPTExBVEVcIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyAiCiAgICAgICAgICAgICAgIlwiJXNcIi5cbiIsIGdldGVudigiTENfQ09MTEFURSIpID8KICAgICAgICAgICAgICBnZXRlbnYoIkxDX0NPTExBVEUiKSA6ICI8dW5zZXQ+Iik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIFRSQUNFKCJsY19jb2xsYXRlX2RlZmF1bHQgPSAlc1xuIiwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgVFJBQ0UoImxjX2NvbGxhdGVfZW52ID0gJXNcbiIsIGxjX2NvbGxhdGVfZW52KTsKCiAgICAgIC8qIENvbnZlcnQgdGhlIGxpYmMgVW5pY29kZSBzdHJpbmcgdG8gYSBuYXRpdmUgbXVsdGlieXRlIGNoYXJhY3RlcgogICAgICAgKiBzdHJpbmcuICovCiAgICAgIHJldHVybmVkX2xlbiA9IHdjc3RvbWJzKHNyY19uYXRpdmUsIHNyY3N0cl9saWJjLCBzcmNfbmF0aXZlX2xlbikgKyAxOwogICAgICBpZihyZXR1cm5lZF9sZW4gPT0gMCkKICAgICAgewogICAgICAgICAgTFBTVFIgc3Jjc3RyX2FzY2lpID0gKExQU1RSKUhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLAoJCQkJCSAgIDAsIHNyY3N0cik7CiAgICAgICAgICBFUlIoIndjc3RvbWJzIGZhaWxlZC4gIFRoZSBzdHJpbmcgc3BlY2lmaWVkICglcykgbWF5IGNvbnRhaW5zIGFuICIKICAgICAgICAgICAgICAiaW52YWxpZCBjaGFyYWN0ZXIuXG4iLCBzcmNzdHJfYXNjaWkpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9hc2NpaSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2FzY2lpKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgZWxzZSBpZihyZXR1cm5lZF9sZW4gPiBzcmNfbmF0aXZlX2xlbikKICAgICAgewogICAgICAgICAgc3JjX25hdGl2ZVtzcmNfbmF0aXZlX2xlbiAtIDFdID0gMDsKICAgICAgICAgIEVSUigid2NzdG9tYnMgcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiIAogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBzcmNfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHNyY19uYXRpdmVfbGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgVFJBQ0UoInNyY19uYXRpdmUgPSAlcyAgc3JjX25hdGl2ZV9sZW4gPSAlZFxuIiwKICAgICAgICAgICAgIHNyY19uYXRpdmUsIHNyY19uYXRpdmVfbGVuKTsKCiAgICAgIC8qIGRzdF9uYXRpdmUgc2VlbXMgdG8gY29udGFpbiBhdCBtb3N0IDQgYnl0ZXMgZm9yIGVhY2ggYnl0ZSBpbgogICAgICAgKiB0aGUgb3JpZ2luYWwgc3JjX25hdGl2ZSBzdHJpbmcuICBDaGFuZ2UgaWYgbmVlZCBiZSBzaW5jZSB0aGlzCiAgICAgICAqIGlzbid0IGRvY3VtZW50ZWQgYnkgdGhlIHN0cnhmcm0oKSBtYW4gcGFnZS4gKi8KICAgICAgZHN0X25hdGl2ZV9sZW4gPSA0ICogc3JjX25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0X25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdF9uYXRpdmVcbiIsIGRzdF9uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBUaGUgYWN0dWFsIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlIGZvbGxvd2luZyBjYWxsIHRvCiAgICAgICAqIHN0cnhmcm0oKS4gIFRoZSBzdXJyb3VuZGluZyBjb2RlIGNvdWxkIGhhdmUgYmVlbiBzaW1wbGlmaWVkCiAgICAgICAqIGJ5IGNhbGxpbmcgd2NzeGZybSgpIGluc3RlYWQgZXhjZXB0IHRoYXQgd2NzeGZybSgpIGlzIG5vdAogICAgICAgKiBhdmFpbGFibGUgb24gb2xkZXIgTGludXggc3lzdGVtcyAoUmVkSGF0IDQuMSB3aXRoCiAgICAgICAqIGxpYmMtNS4zLjEyLTE3KS4KICAgICAgICoKICAgICAgICogQWxzbywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdHJhbnNsYXRpb24gY291bGQgYmUgZG9uZSBieQogICAgICAgKiB2YXJpb3VzIHRhYmxlcyBhcyBpdCBpcyBkb25lIGluIExDTWFwU3RyaW5nQSgpLiAgSG93ZXZlciwgSSdtCiAgICAgICAqIG5vdCBzdXJlIHdoYXQgdGhvc2UgdGFibGVzIGFyZS4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gc3RyeGZybShkc3RfbmF0aXZlLCBzcmNfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwogICAgICAKICAgICAgaWYocmV0dXJuZWRfbGVuID4gZHN0X25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIGRzdF9uYXRpdmVbZHN0X25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoInN0cnhmcm0gcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiIAogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBkc3RfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgZHN0X25hdGl2ZV9sZW4gPSByZXR1cm5lZF9sZW47CiAgICAgIAogICAgICBUUkFDRSgiZHN0X25hdGl2ZSA9ICVzICBkc3RfbmF0aXZlX2xlbiA9ICVkXG4iLAogICAgICAgICAgICAgZHN0X25hdGl2ZSwgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgZHN0c3RyX2xpYmNfbGVuID0gZHN0X25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0c3RyX2xpYmMgPSAod2NoYXJfdCAqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RzdHJfbGliY19sZW4gKiBzaXplb2Yod2NoYXJfdCkpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdHN0cl9saWJjXG4iLAogICAgICAgICAgICAgIGRzdHN0cl9saWJjX2xlbiAqIHNpemVvZih3Y2hhcl90KSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBDb252ZXJ0IHRoZSBuYXRpdmUgbXVsdGlieXRlIHN0cmluZyB0byBhIGxpYmMgVW5pY29kZSBzdHJpbmcuICovCiAgICAgIHJldHVybmVkX2xlbiA9IG1ic3Rvd2NzKGRzdHN0cl9saWJjLCBkc3RfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwoKICAgICAgLyogUmVzdG9yZSBMQ19DT0xMQVRFIG5vdyB0aGF0IHRoZSBsYXN0IExDX0NPTExBVEUgc2Vuc2l0aXZlCiAgICAgICAqIGZ1bmN0aW9uIGhhcyByZXR1cm5lZC4gKi8KICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7IAoKICAgICAgaWYocmV0dXJuZWRfbGVuID09IDApCiAgICAgIHsKICAgICAgICAgIEVSUigibWJzdG93Y3MgZmFpbGVkLiAgVGhlIG5hdGl2ZSB2ZXJzaW9uIG9mIHRoZSB0cmFuc2xhdGVkIHN0cmluZyAiCiAgICAgICAgICAgICAgIiglcykgbWF5IGNvbnRhaW4gYW4gaW52YWxpZCBjaGFyYWN0ZXIuXG4iLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdHN0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RzdHJfbGliYyk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpZihkc3RsZW4pCiAgICAgIHsKICAgICAgICAgIGlmKHJldHVybmVkX2xlbiA+IGRzdGxlbikKICAgICAgICAgIHsKICAgICAgICAgICAgICBFUlIoIm1ic3Rvd2NzIHJldHVybmVkIGEgc3RyaW5nIHRoYXQgd2FzIGxvbmdlciAoJWQgY2hhcnMpICIgCiAgICAgICAgICAgICAgICAgICJ0aGFuIHRoZSBidWZmZXIgcHJvdmlkZWQgKCVkIGNoYXJzKS5cbiIsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICAgICAgZHN0bGVuKTsKICAgICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAKICAgICAgICAgIH0KICAgICAgICAgIGRzdGxlbiA9IHJldHVybmVkX2xlbjsKCiAgICAgICAgICAvKiBDb252ZXJ0IGEgbGliYyBVbmljb2RlIHN0cmluZyB0byB0aGUgZGVzdGluYXRpb24gc3RyaW5nLiAqLwogICAgICAgICAgZm9yKHN0cl9pZHggPSAwOyBzdHJfaWR4IDwgZHN0bGVuOyBzdHJfaWR4KyspCiAgICAgICAgICB7CiAgICAgICAgICAgICAgZHN0c3RyW3N0cl9pZHhdID0gZHN0c3RyX2xpYmNbc3RyX2lkeF07CiAgICAgICAgICB9CiAgICAgICAgICBUUkFDRSgiMXN0IDQgaW50IHNpemVkIGNodW5rcyBvZiBkc3RzdHIgPSAleCAleCAleCAleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMykpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgZHN0bGVuID0gcmV0dXJuZWRfbGVuOwogICAgICB9CiAgICAgIFRSQUNFKCJkc3RsZW4gKHJldHVybikgPSAlZFxuIiwgZHN0bGVuKTsKICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICByZXR1cm4gZHN0bGVuOwogIH0KICBlbHNlCiAgewogICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCgogICAgaWYgKGRzdGxlbj09MCkKICAgICAgICByZXR1cm4gc3JjbGVuOyAgCiAgICBpZiAoZHN0bGVuPHNyY2xlbikgCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICBmb3IgKGk9MDsgaSA8IHNyY2xlbjsgaSsrKQogICAgICBkc3RzdHJbaV0gPSAoV0NIQVIpIGYoc3Jjc3RyW2ldKTsKICAgIHJldHVybiBzcmNsZW47CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBPTEUyTkxTX0VzdGltYXRlTWFwcGluZ0xlbmd0aAogKgogKiBFc3RpbWF0ZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHN0cmluZwogKiBjb21wdXRlZCBieSBMQ01hcFN0cmluZ0EuCiAqCiAqIFRoZSBzaXplIGlzIGFsd2F5cyBvdmVyLWVzdGltYXRlZCwgd2l0aCBhIGZpeGVkIGxpbWl0IG9uIHRoZQogKiBhbW91bnQgb2YgZXN0aW1hdGlvbiBlcnJvci4KICoKICogTm90ZSB0aGF0IGxlbiA9PSAtMSBpcyBub3QgcGVybWl0dGVkLgogKi8Kc3RhdGljIGlubGluZSBpbnQgT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgoTENJRCBsY2lkLCBEV09SRCBkd01hcEZsYWdzLAoJCQkJCQlMUENTVFIgc3RyLCBEV09SRCBsZW4pCnsKICAgIC8qIEVzdGltYXRlIG9ubHkgZm9yIHNtYWxsIHN0cmluZ3MgdG8ga2VlcCB0aGUgZXN0aW1hdGlvbiBlcnJvciBmcm9tCiAgICAgKiBiZWNvbWluZyB0b28gbGFyZ2UuICovCiAgICBpZiAobGVuIDwgMTI4KSByZXR1cm4gbGVuICogOCArIDU7CiAgICBlbHNlIHJldHVybiBMQ01hcFN0cmluZ0EobGNpZCwgZHdNYXBGbGFncywgc3RyLCBsZW4sIE5VTEwsIDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDb21wYXJlU3RyaW5nQQlbS0VSTkVMMzIuQF0KICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgdXNpbmcgbG9jYWxlCiAqCiAqIFJFVFVSTlMKICoKICogc3VjY2VzczogQ1NUUl9MRVNTX1RIQU4sIENTVFJfRVFVQUwsIENTVFJfR1JFQVRFUl9USEFOCiAqIGZhaWx1cmU6IDAKICoKICogTk9URVMKICoKICogRGVmYXVsdHMgdG8gYSB3b3JkIHNvcnQsIGJ1dCB1c2VzIGEgc3RyaW5nIHNvcnQgaWYKICogU09SVF9TVFJJTkdTT1JUIGlzIHNldC4KICogQ2FsbHMgU2V0TGFzdEVycm9yIGZvciBFUlJPUl9JTlZBTElEX0ZMQUdTLCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUi4KICogCiAqIEJVR1MKICoKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICoKICogRklYTUUKICogCiAqIFF1aXRlIGluZWZmaWNpZW50LgogKi8KVUlOVCBXSU5BUEkgQ29tcGFyZVN0cmluZ0EoCiAgICBEV09SRCBsY2lkLCAgICAgLyogW2luXSBsb2NhbGUgSUQgKi8KICAgIERXT1JEIGZkd1N0eWxlLCAvKiBbaW5dIGNvbXBhcmlzb24tc3R5bGUgb3B0aW9ucyAqLwogICAgTFBDU1RSIHMxLCAgICAgIC8qIFtpbl0gZmlyc3Qgc3RyaW5nICovCiAgICBEV09SRCBsMSwgICAgICAgLyogW2luXSBsZW5ndGggb2YgZmlyc3Qgc3RyaW5nICovCiAgICBMUENTVFIgczIsICAgICAgLyogW2luXSBzZWNvbmQgc3RyaW5nICovCiAgICBEV09SRCBsMikgICAgICAgLyogW2luXSBsZW5ndGggb2Ygc2Vjb25kIHN0cmluZyAqLwp7CiAgaW50IG1hcHN0cmluZ19mbGFnczsKICBpbnQgbGVuMSxsZW4yOwogIGludCByZXN1bHQ7CiAgTFBTVFIgc2sxLHNrMjsKICBUUkFDRSgiJXMgYW5kICVzXG4iLAoJZGVidWdzdHJfYW4gKHMxLGwxKSwgZGVidWdzdHJfYW4gKHMyLGwyKSk7CgogIGlmICggKHMxPT1OVUxMKSB8fCAoczI9PU5VTEwpICkKICB7ICAgIAogICAgRVJSKCIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLAoJZGVidWdzdHJfYW4oczEsbDEpLCBkZWJ1Z3N0cl9hbihzMixsMikpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCiAgaWYgKGwxID09IC0xKSBsMSA9IHN0cmxlbihzMSk7CiAgaWYgKGwyID09IC0xKSBsMiA9IHN0cmxlbihzMik7CiAgCQogIG1hcHN0cmluZ19mbGFncyA9IExDTUFQX1NPUlRLRVkgfCBmZHdTdHlsZSA7CiAgbGVuMSA9IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKGxjaWQsIG1hcHN0cmluZ19mbGFncywgczEsIGwxKTsKICBsZW4yID0gT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgobGNpZCwgbWFwc3RyaW5nX2ZsYWdzLCBzMiwgbDIpOwoKICBpZiAoKGxlbjE9PTApfHwobGVuMj09MCkpCiAgICByZXR1cm4gMDsgICAgIC8qIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCAqLwoKICBzazEgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbjEgKyBsZW4yKTsKICBzazIgPSBzazEgKyBsZW4xOwogIGlmICggKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsc2sxLGxlbjEpKQoJIHx8ICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLHNrMixsZW4yKSkgKQogIHsKICAgIEVSUigiQnVnIGluIExDbWFwU3RyaW5nQS5cbiIpOwogICAgcmVzdWx0ID0gMDsKICB9CiAgZWxzZQogIHsKICAgIC8qIHN0cmNtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IHJldHVybiAtMSwgMCwgb3IgMSAqLwogICAgcmVzdWx0ID0gc3RyY21wKHNrMSxzazIpOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2sxKTsKCiAgaWYgKHJlc3VsdCA8IDApCiAgICByZXR1cm4gMTsKICBpZiAocmVzdWx0ID09IDApCiAgICByZXR1cm4gMjsKCiAgLyogbXVzdCBiZSBncmVhdGVyLCBpZiB3ZSByZWFjaCB0aGlzIHBvaW50ICovCiAgcmV0dXJuIDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmdXCVtLRVJORUwzMi5AXQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZ0EuCiAqLwpVSU5UIFdJTkFQSSBDb21wYXJlU3RyaW5nVyhEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIHMxLCBEV09SRCBsMSwgTFBDV1NUUiBzMixEV09SRCBsMikKewoJaW50IGxlbixyZXQ7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCgkJRklYTUUoIklHTk9SRU5PTlNQQUNFIG5vdCBzdXBwb3J0ZWRcbiIpOwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCgkJRklYTUUoIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CgoJLyogSXMgc3RyY21wIGRlZmF1bHRpbmcgdG8gc3RyaW5nIHNvcnQgb3IgdG8gd29yZCBzb3J0Pz8gKi8KCS8qIEZJWE1FOiBIYW5kbGUgTk9STV9TVFJJTkdTT1JUICovCglsMSA9IChsMT09LTEpP3N0cmxlblcoczEpOmwxOwoJbDIgPSAobDI9PS0xKT9zdHJsZW5XKHMyKTpsMjsKCWxlbiA9IGwxPGwyID8gbDE6bDI7CglyZXQgPSAoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRUNBU0UpID8gc3RybmNtcGlXKHMxLHMyLGxlbikgOiBzdHJuY21wVyhzMSxzMixsZW4pOwoJLyogbm90IGVxdWFsLCByZXR1cm4gMSBvciAzICovCglpZihyZXQhPTApIHsKCQkvKiBuZWVkIHRvIHRyYW5zbGF0ZSByZXN1bHQgKi8KCQlyZXR1cm4gKChpbnQpcmV0IDwgMCkgPyAxIDogMzsKCX0KCS8qIHNhbWUgbGVuLCByZXR1cm4gMiAqLwoJaWYobDE9PWwyKSByZXR1cm4gMjsKCS8qIHRoZSBsb25nZXIgb25lIGlzIGxleGljYWxseSBncmVhdGVyICovCglyZXR1cm4gKGwxPGwyKT8gMSA6IDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU9MRV9HZXRGb3JtYXRBCVtJbnRlcm5hbF0KICoKICogRklYTUUKICogICAgSWYgZGF0ZWxlbiA9PSAwLCBpdCBzaG91bGQgcmV0dXJuIHRoZSByZWd1aXJlZCBzdHJpbmcgbGVuZ3RoLgogKgogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHN0dWZmIGZvciBHZXREYXRlRm9ybWF0KCkgYW5kIAogR2V0VGltZUZvcm1hdCgpLgoKICBkICAgIHNpbmdsZS1kaWdpdCAobm8gbGVhZGluZyB6ZXJvKSBkYXkgKG9mIG1vbnRoKQogIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCiAgZGRkICBzaG9ydCBkYXktb2Ytd2VlayBuYW1lCiAgZGRkZCBsb25nIGRheS1vZi13ZWVrIG5hbWUKICBNICAgIHNpbmdsZS1kaWdpdCBtb250aAogIE1NICAgdHdvLWRpZ2l0IG1vbnRoCiAgTU1NICBzaG9ydCBtb250aCBuYW1lCiAgTU1NTSBmdWxsIG1vbnRoIG5hbWUKICB5ICAgIHR3by1kaWdpdCB5ZWFyLCBubyBsZWFkaW5nIDAKICB5eSAgIHR3by1kaWdpdCB5ZWFyCiAgeXl5eSBmb3VyLWRpZ2l0IHllYXIKICBnZyAgIGVyYSBzdHJpbmcKICBoICAgIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogIGhoICAgaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBIICAgIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogIEhIICAgaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBtICAgIG1pbnV0ZXMgd2l0aCBubyBsZWFkaW5nIHplcm8KICBtbSAgIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBzICAgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICBzcyAgIHNlY29uZHMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICB0ICAgIHRpbWUgbWFya2VyIChBIG9yIFApCiAgdHQgICB0aW1lIG1hcmtlciAoQU0sIFBNKQogICcnICAgdXNlZCB0byBxdW90ZSBsaXRlcmFsIGNoYXJhY3RlcnMKICAnJyAgICh3aXRoaW4gYSBxdW90ZWQgc3RyaW5nKSBpbmRpY2F0ZXMgYSBsaXRlcmFsICcKCiBUaGVzZSBmdW5jdGlvbnMgUkVRVUlSRSB2YWxpZCBsb2NhbGUsIGRhdGUsICBhbmQgZm9ybWF0LiAKICovCnN0YXRpYyBJTlQgT0xFX0dldEZvcm1hdEEoTENJRCBsb2NhbGUsCgkJCSAgICBEV09SRCBmbGFncywKCQkJICAgIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1NUUiBfZm9ybWF0LCAJLyppbiovCgkJCSAgICBMUFNUUiBkYXRlLAkJLypvdXQqLwoJCQkgICAgSU5UIGRhdGVsZW4pCnsKICAgSU5UIGlucG9zLCBvdXRwb3M7CiAgIGludCBjb3VudCwgdHlwZSwgaW5xdW90ZSwgT3ZlcmZsb3c7CiAgIGNoYXIgYnVmWzQwXTsKICAgY2hhciBmb3JtYXRbNDBdOwogICBjaGFyICogcG9zOwogICBpbnQgYnVmbGVuOwoKICAgY29uc3QgY2hhciAqIF9kZ2ZtdFtdID0geyAiJWQiLCAiJTAyZCIgfTsKICAgY29uc3QgY2hhciAqKiBkZ2ZtdCA9IF9kZ2ZtdCAtIDE7IAoKICAgLyogcmVwb3J0LCBmb3IgZGVidWdnaW5nICovCiAgIFRSQUNFKCIoMHglbHgsMHglbHgsIDB4JWx4LCB0aW1lKHk9JWQgbT0lZCB3ZD0lZCBkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10PSVwIFwnJXNcJyAsICVwLCBsZW49JWQpXG4iLAogICAJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d1llYXIseHRpbWUtPndNb250aCx4dGltZS0+d0RheU9mV2Vlayx4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgX2Zvcm1hdCwgX2Zvcm1hdCwgZGF0ZSwgZGF0ZWxlbik7CiAgCiAgIGlmKGRhdGVsZW4gPT0gMCkgewogICAgIEZJWE1FKCJkYXRlbGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGFsaXplIHN0YXRlIHZhcmlhYmxlcyBhbmQgb3V0cHV0IGJ1ZmZlciAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsgaW5xdW90ZSA9IDA7IE92ZXJmbG93ID0gMDsKICAgdHlwZSA9ICdcMCc7CiAgIGRhdGVbMF0gPSBidWZbMF0gPSAnXDAnOwogICAgICAKICAgc3RyY3B5KGZvcm1hdCxfZm9ybWF0KTsKCiAgIC8qIGFsdGVyIHRoZSBmb3JtYXRzdHJpbmcsIHdoaWxlIGl0IHdvcmtzIGZvciBhbGwgbGFuZ3VhZ2VzIG5vdyBpbiB3aW5lCiAgIGl0cyBwb3NzaWJsZSB0aGF0IGl0IGZhaWxzIHdoZW4gdGhlIHRpbWUgbG9va3MgbGlrZSBzczptbTpoaCBhcyBleGFtcGxlKi8gICAKICAgaWYgKHRmbGFncyAmIChUSU1FX05PTUlOVVRFU09SU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6bW0iKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICBpZiAodGZsYWdzICYgKFRJTUVfTk9TRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjpzcyIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIAogICBmb3IgKGlucG9zID0gMDs7IGlucG9zKyspIHsKICAgICAgLyogVFJBQ0UoIlNUQVRFIGlucG9zPSUyZCBvdXRwb3M9JTJkIGNvdW50PSVkIGlucXVvdGU9JWQgdHlwZT0lYyBidWYsZGF0ZSA9ICVjLCVjXG4iLCBpbnBvcywgb3V0cG9zLCBjb3VudCwgaW5xdW90ZSwgdHlwZSwgYnVmW2lucG9zXSwgZGF0ZVtvdXRwb3NdKTsgKi8KICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MgKz0gMTsKCSAgICAgICBkYXRlW291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsgLyogd2UgZGlkIG5vdGhpbmcgdG8gdGhlIG91dHB1dCAqLwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIGRhdGVbb3V0cG9zKytdID0gJ1wwJzsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOwoJIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zLTFdID0gJ1wwJzsgLyogdGhpcyBpcyB0aGUgbGFzdCBwbGFjZSB3aGVyZQoJCQkJCSBpdCdzIHNhZmUgdG8gd3JpdGUgKi8KCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8IGNvdW50ID09IDQKCQkgICB8fCAoY291bnQgPT0gMiAmJiBzdHJjaHIoImdoSG1zdCIsIHR5cGUpKSApIHsKCSAgICBpZiAodHlwZSA9PSAnaCcgJiYgKHRmbGFncyAmIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQpKSB0eXBlPSAnSCc7CgkgICAgaWYgKHR5cGUgPT0gJ2QnKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TREFZTkFNRTEKCQkJCSAgICsgKHh0aW1lLT53RGF5T2ZXZWVrKzYpJTcsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkJICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCQkgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSAKCQkJCQkgICAgKyAoeHRpbWUtPndEYXlPZldlZWsrNiklNywKCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJICAgICAgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53RGF5KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgICAgIGlmIChjb3VudCA9PSAzKSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIAoJCQkJICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSA0KSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU01PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TW9udGgpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3knKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDQpIHsKCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndZZWFyKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkgIHN0cmNweShidWYsICJ5eXkiKTsKCQkgIFdBUk4oInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCAgdHlwZSwgY291bnQpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJCSAgRklYTUUoIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wLlxuIik7CgkJICBzdHJjcHkoYnVmLCAiQUQiKTsKCSAgICB9IGVsc2UgewoJCSAgc3RyY3B5KGJ1ZiwgImciKTsKCQkgIFdBUk4oInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCB0eXBlLCBjb3VudCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAgICAvKiBnaXZlcyB1cyBob3VycyAxOjAwIC0tIDEyOjAwICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdIJykgewoJICAgICAgIC8qIDI0LWhvdXIgdGltZSAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53SG91cik7CgkgICAgfSBlbHNlIGlmICggdHlwZSA9PSAnbScpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01pbnV0ZSk7CgkgICAgfSBlbHNlIGlmICggdHlwZSA9PSAncycpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1NlY29uZCk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewogICAgICAgICAgICAgICBpZiAoKHRmbGFncyAmIFRJTUVfTk9USU1FTUFSS0VSKSkKICAgICAgICAgICAgICAgICAgYnVmWzBdPSdcMCc7CiAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50ID09IDEpIHsKCQkgIHNwcmludGYoYnVmLCAiJWMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gJ0EnIDogJ1AnKTsKICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAyKSB7CiAgICAgICAgICAgICAgICAgLyogc3ByaW50ZihidWYsICIlcyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAiQU0iIDogIlBNIik7ICovCiAgICAgICAgICAgICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHh0aW1lLT53SG91cjwxMikgCiAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIHNpemVvZihidWYpKTsKICAgICAgICAgICAgICAgfQoJICAgIH07CgoJICAgIC8qIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG5leHQgY2hhciBpbiB0aGUgZm9ybWF0IHN0cmluZyAKCSAgICAgICBhZ2Fpbiwgbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgKi8KCSAgICBpbnBvcy0tOwoJICAgIAoJICAgIC8qIGFkZCB0aGUgY29udGVudHMgb2YgYnVmIHRvIHRoZSBvdXRwdXQgKi8KCSAgICBidWZsZW4gPSBzdHJsZW4oYnVmKTsKCSAgICBpZiAob3V0cG9zICsgYnVmbGVuIDwgZGF0ZWxlbikgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7IC8qIGZvciBzdHJjYXQgdG8gaG9vayBvbnRvICovCgkJIHN0cmNhdChkYXRlLCBidWYpOwoJICAgICAgIG91dHBvcyArPSBidWZsZW47CgkgICAgfSBlbHNlIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgICAgIHN0cm5jYXQoZGF0ZSwgYnVmLCBkYXRlbGVuIC0gb3V0cG9zKTsKCQkgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwoJCSBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgICAgV0FSTigiaW5zdWZmaWNpZW50IGJ1ZmZlclxuIik7CgkJIHJldHVybiAwOwoJICAgIH0KCgkgICAgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyBpdGVtICovCgkgICAgY291bnQgPSAwOwoJICAgIHR5cGUgPSAnXDAnOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGxvb3AtaGVhZCwgYmVjYXVzZQoJICAgICAgIHRoYXQgYnJlYWtzIHRoZSBwcmludGluZyBvZiB0aGUgbGFzdCBmb3JtYXQtaXRlbSAqLwoJICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAgICAvKiBjb250aW51aW5nIGEgY29kZSBmb3IgYW4gaXRlbSAqLwoJICAgIGNvdW50ICs9MTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKHN0cmNocigiaEhtc3R5TWRnIiwgZm9ybWF0W2lucG9zXSkpIHsKCSAgICB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSAgICBjb3VudCA9IDE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpbnF1b3RlID0gMTsKCSAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJIH0KICAgICAgLyogbm93IGRlYWwgd2l0aCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyAqLwogICAgICBpZiAob3V0cG9zID49IGRhdGVsZW4pIHsKICAgICAgIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgIHJldHVybiAwOwogICAgICB9CiAgIH0KICAgCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgIH07CgogICAvKiBmaW5pc2ggaXQgb2ZmIHdpdGggYSBzdHJpbmcgdGVybWluYXRvciAqLwogICBvdXRwb3MrKzsKICAgLyogc2FuaXR5IGNoZWNrICovCiAgIGlmIChvdXRwb3MgPiBkYXRlbGVuLTEpIG91dHBvcyA9IGRhdGVsZW4tMTsKICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKICAgCiAgIFRSQUNFKCJyZXR1cm5zIHN0cmluZyAnJXMnLCBsZW4gJWRcbiIsIGRhdGUsIG91dHBvcyk7CiAgIHJldHVybiBvdXRwb3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIElOVCBPTEVfR2V0Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZmxhZ3MsIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgTFBXU1RSIG91dHB1dCwgSU5UIG91dGxlbikKewogICBJTlQgICBpbnBvcywgb3V0cG9zOwogICBpbnQgICAgIGNvdW50LCB0eXBlPTAsIGlucXVvdGU7CiAgIGludCAgICAgT3ZlcmZsb3c7IC8qIGxvb3AgY2hlY2sgKi8KICAgY2hhciAgICB0bXBbMTZdOwogICBXQ0hBUiAgIGJ1Zls0MF07CiAgIGludCAgICAgYnVmbGVuPTA7CiAgIFdDSEFSICAgYXJnMFtdID0gezB9LCBhcmcxW10gPSB7JyUnLCdkJywwfTsKICAgV0NIQVIgICBhcmcyW10gPSB7JyUnLCcwJywnMicsJ2QnLDB9OwogICBXQ0hBUiAgKmFyZ2FyclszXTsKICAgaW50ICAgICBkYXRldmFycz0wLCB0aW1ldmFycz0wOwoKICAgYXJnYXJyWzBdID0gYXJnMDsKICAgYXJnYXJyWzFdID0gYXJnMTsKICAgYXJnYXJyWzJdID0gYXJnMjsKCiAgIC8qIG1ha2UgYSBkZWJ1ZyByZXBvcnQgKi8KICAgVFJBQ0UoImFyZ3M6IDB4JWx4LCAweCVseCwgMHglbHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdDolcyAoYXQgJXApLCAiCiAgIAkgICAgICAiJXAgd2l0aCBtYXggbGVuICVkXG4iLAoJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgZGVidWdzdHJfdyhmb3JtYXQpLCBmb3JtYXQsIG91dHB1dCwgb3V0bGVuKTsKICAgCiAgIGlmKG91dGxlbiA9PSAwKSB7CiAgICAgRklYTUUoIm91dGxlbiA9IDAsIHJldHVybmluZyAyNTVcbiIpOwogICAgIHJldHVybiAyNTU7CiAgIH0KCiAgIC8qIGluaXRpYWxpemUgc3RhdGUgdmFyaWFibGVzICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOwogICBpbnF1b3RlID0gT3ZlcmZsb3cgPSAwOwogICAvKiB0aGlzIGlzIHJlYWxseSBqdXN0IGEgc2FuaXR5IGNoZWNrICovCiAgIG91dHB1dFswXSA9IGJ1ZlswXSA9IDA7CiAgIAogICAvKiB0aGlzIGxvb3AgaXMgdGhlIGNvcmUgb2YgdGhlIGZ1bmN0aW9uICovCiAgIGZvciAoaW5wb3MgPSAwOyAvKiB3ZSBoYXZlIHNldmVyYWwgYnJlYWsgcG9pbnRzICovIDsgaW5wb3MrKykgewogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09IChXQ0hBUikgJ1wnJykgewoJICAgIGlmIChmb3JtYXRbaW5wb3MrMV0gPT0gJ1wnJykgewoJICAgICAgIGlucG9zKys7CgkgICAgICAgb3V0cHV0W291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsKCSAgICB9CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09IDApIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gMDsKCSAgICBpZiAob3V0cG9zID4gb3V0bGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7ICAvKiAgbm9ybWFsIGV4aXQgKHdpdGhpbiBhIHF1b3RlKSAqLwoJIH0gZWxzZSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107IC8qIGNvcHkgaW5wdXQgKi8KCSAgICBpZiAob3V0cG9zID4gb3V0bGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIG91dHB1dFtvdXRwb3MtMV0gPSAwOyAKCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8ICggKGNvdW50PT00ICYmIHR5cGUgPT0neScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J00nKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdkJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nZycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdIJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nbScpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3MnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSd0JykgKSAgKSB7CiAgICAgICAgICBzd2l0Y2godHlwZSkKICAgICAgICAgIHsKICAgICAgICAgIGNhc2UgJ2QnOgoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwKCQkJICAgICBMT0NBTEVfU0RBWU5BTUUxICsgKHh0aW1lLT53RGF5T2ZXZWVrICs2KSU3LAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwKCQkJCUxPQ0FMRV9TQUJCUkVWREFZTkFNRTEgKwoJCQkJKHh0aW1lLT53RGF5T2ZXZWVrICs2KSU3LAoJCQkJYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiUuKmQiLCBjb3VudCwgeHRpbWUtPndEYXkgKTsKICAgICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdNJzoKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICBMT0NBTEVfU01PTlRITkFNRTEgKwoJCQkJeHRpbWUtPndNb250aCAtMSwgYnVmLAoJCQkJc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiUuKmQiLCBjb3VudCwgeHRpbWUtPndNb250aCApOwogICAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAneSc6CgkgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlZCIsIHh0aW1lLT53WWVhciApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewogICAgICAgICAgICAgICAgc3RyY3B5KCB0bXAsICJ5eXkiICk7CgkgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiUuKmQiLCBjb3VudCwgeHRpbWUtPndZZWFyICUgMTAwICk7CgkgICAgfQogICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdnJzoKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKCSAgICAgICBGSVhNRSgiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXBsZW1lbnRlZFxuIik7CiAgICAgICAgICAgICAgIHN0cmNweSggdG1wLCAiQUQiICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICAvKiBXaW4gQVBJIHNleiB3ZSBjb3B5IGl0IHZlcmJhdGltICovCiAgICAgICAgICAgICAgICBzdHJjcHkoIHRtcCwgImciICk7CgkgICAgfQogICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwogICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiUuKmQiLCBjb3VudCwgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQsIHh0aW1lLT53SG91ciApOwogICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d01pbnV0ZSApOwogICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d1NlY29uZCApOwogICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAndCc6CgkgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAoeHRpbWUtPndIb3VyIDwgMTIpID8KCQkJICAgICBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKSApOwoJICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJICAgICAgIGJ1ZlsxXSA9IDA7CgkgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCgkgLyogbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQsICB3ZSBuZWVkIHRvIGNoZWNrIHRoaXMgbmV4dCAKCSAgICBjaGFyYWN0ZXIgdGhlIG5leHQgdGltZSB3ZSBsb29wIHRocm91Z2ggKi8KCSBpbnBvcy0tOwoKCSAvKiBjYXQgYnVmIG9udG8gdGhlIG91dHB1dCAqLwoJIG91dGxlbiA9IHN0cmxlblcoYnVmKTsKCSBpZiAob3V0cG9zICsgYnVmbGVuIDwgb3V0bGVuKSB7CiAgICAgICAgICAgIHN0cmNweVcoIG91dHB1dCArIG91dHBvcywgYnVmICk7CgkgICAgb3V0cG9zICs9IGJ1ZmxlbjsKCSB9IGVsc2UgewogICAgICAgICAgICBsc3RyY3B5blcoIG91dHB1dCArIG91dHBvcywgYnVmLCBvdXRsZW4gLSBvdXRwb3MgKTsKCSAgICBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7IC8qIEFibm9ybWFsIGV4aXQgKi8KCSB9CgoJIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0aGlzIHRpbWUgKi8KCSBjb3VudCA9IDA7CgkgdHlwZSA9ICdcMCc7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGJlZ2lubmluZywgIGJlY2F1c2UgdGhhdCAKCSB3b3VsZCBrZWVwIHVzIGZyb20gcHJpbnRpbmcgYSBmb3JtYXQgc3BlYyB0aGF0IGVuZGVkIHRoZSAKCSBzdHJpbmcgKi8KCSBvdXRwdXRbb3V0cG9zXSA9IDA7CgkgYnJlYWs7ICAvKiAgTk9STUFMIEVYSVQgICovCiAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAvKiBob3cgd2Uga2VlcCB0cmFjayBvZiB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0IHNwZWMgKi8KCSBjb3VudCsrOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKCAoZGF0ZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdkJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J00nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0neScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdnJykgICkgfHwKCQkgICh0aW1ldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J0gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0naCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdtJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3MnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ndCcpICkgICAgKSB7CgkgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgY291bnQgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJIGlucXVvdGUgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewoJIC8qIHVucXVvdGVkIGxpdGVyYWxzICovCgkgb3V0cHV0W291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CiAgICAgIH0KICAgfQoKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgV0FSTigiIGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAgIH07CgogICAvKiBmaW5hbCBzdHJpbmcgdGVybWluYXRvciBhbmQgc2FuaXR5IGNoZWNrICovCiAgIG91dHBvcysrOwogICBpZiAob3V0cG9zID4gb3V0bGVuLTEpIG91dHBvcyA9IG91dGxlbi0xOwogICBvdXRwdXRbb3V0cG9zXSA9ICcwJzsKCiAgIFRSQUNFKCIgcmV0dXJuaW5nICVzXG4iLCBkZWJ1Z3N0cl93KG91dHB1dCkpOwoJCiAgIHJldHVybiAoIU92ZXJmbG93KSA/IG91dGxlbiA6IDA7CiAgIAp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdEEJW0tFUk5FTDMyLkBdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBUaGlzIGZ1bmN0aW9uIHVzZXMgZm9ybWF0IHRvIGZvcm1hdCB0aGUgZGF0ZSwgIG9yLCAgaWYgZm9ybWF0CiAqIGlzIE5VTEwsIHVzZXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBsb2NhbGUuICBmb3JtYXQgaXMgYSBzdHJpbmcKICogb2YgbGl0ZXJhbCBmaWVsZHMgYW5kIGNoYXJhY3RlcnMgYXMgZm9sbG93czoKICoKICogLSBkICAgIHNpbmdsZS1kaWdpdCAobm8gbGVhZGluZyB6ZXJvKSBkYXkgKG9mIG1vbnRoKQogKiAtIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCiAqIC0gZGRkICBzaG9ydCBkYXktb2Ytd2VlayBuYW1lCiAqIC0gZGRkZCBsb25nIGRheS1vZi13ZWVrIG5hbWUKICogLSBNICAgIHNpbmdsZS1kaWdpdCBtb250aAogKiAtIE1NICAgdHdvLWRpZ2l0IG1vbnRoCiAqIC0gTU1NICBzaG9ydCBtb250aCBuYW1lCiAqIC0gTU1NTSBmdWxsIG1vbnRoIG5hbWUKICogLSB5ICAgIHR3by1kaWdpdCB5ZWFyLCBubyBsZWFkaW5nIDAKICogLSB5eSAgIHR3by1kaWdpdCB5ZWFyCiAqIC0geXl5eSBmb3VyLWRpZ2l0IHllYXIKICogLSBnZyAgIGVyYSBzdHJpbmcKICoKICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdEEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDU1RSIGZvcm1hdCwgTFBTVFIgZGF0ZSxJTlQgZGF0ZWxlbikgCnsKICAgCiAgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZTsKICBJTlQgcmV0OwogIEZJTEVUSU1FIGZ0OwogIEJPT0wgcmVzOwoKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsCgkgICAgICBsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LGRhdGUsZGF0ZWxlbik7CiAgCiAgaWYgKCFsb2NhbGUpIHsKICAgICBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7CiAgICAgfTsKICAKICBpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgewogICAgIHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogIH0gZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiAgfSBlbHNlIHsKICAgICB0aGlzbG9jYWxlID0gbG9jYWxlOwogICB9OwoKICBpZiAoeHRpbWUgPT0gTlVMTCkgewogICAgIEdldFN5c3RlbVRpbWUoJnQpOwogIH0gZWxzZSB7CiAgICAgIC8qIFNpbGVudGx5IGNvcnJlY3Qgd0RheU9mV2VlayBieSB0cmFuc2Zvcm1pbmcgdG8gRmlsZVRpbWUgYW5kIGJhY2sgYWdhaW4gKi8KICAgICAgcmVzPVN5c3RlbVRpbWVUb0ZpbGVUaW1lKHh0aW1lLCZmdCk7CiAgICAgIC8qIENoZWNrIHllYXIoPykvbW9udGggYW5kIGRhdGUgZm9yIHJhbmdlIGFuZCBzZXQgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgIG9uIGVycm9yICovCiAgICAgIC8qRklYTUU6IFN5c3RlbVRpbWVUb0ZpbGVUaW1lIGRvZXNuJ3QgeWV0IGRvIHRoYXQgY2hlY2sgKi8KICAgICAgaWYoIXJlcykKCXsKCSAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCSAgcmV0dXJuIDA7Cgl9CiAgICAgIEZpbGVUaW1lVG9TeXN0ZW1UaW1lKCZmdCwmdCk7IAogICAgIAogIH07CiAgdGhpc3RpbWUgPSAmdDsKCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgKChmbGFncyZEQVRFX0xPTkdEQVRFKSAKCQkJCSAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgOiBMT0NBTEVfU1NIT1JUREFURSksCgkJICAgICAgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9IGVsc2UgewogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfTsKCiAgCiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgZmxhZ3MsIDAsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LCAKCQkgICAgICAgZGF0ZSwgZGF0ZWxlbik7CiAgCgogICBUUkFDRSgKCSAgICAgICAiR2V0RGF0ZUZvcm1hdEEoKSByZXR1cm5pbmcgJWQsIHdpdGggZGF0YT0lc1xuIiwKCSAgICAgICByZXQsIGRhdGUpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXRXCVtLRVJORUwzMi5AXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIEFjdHMgdGhlIHNhbWUgYXMgR2V0RGF0ZUZvcm1hdEEoKSwgIGV4Y2VwdCB0aGF0IGl0J3MgVW5pY29kZS4KICogQWNjZXB0cyAmIHJldHVybnMgc2l6ZXMgYXMgY291bnRzIG9mIFVuaWNvZGUgY2hhcmFjdGVycy4KICoKICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdFcoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQgZGF0ZWxlbikKewogICB1bnNpZ25lZCBzaG9ydCBkYXRlYXJyW10gPSB7JzEnLCc5JywnOScsJzQnLCctJywnMScsJy0nLCcxJywwfTsKCiAgIEZJWE1FKCJTVFVCIChzaG91bGQgY2FsbCBPTEVfR2V0Rm9ybWF0VylcbiIpOyAgIAogICBsc3RyY3B5blcoZGF0ZSwgZGF0ZWFyciwgZGF0ZWxlbik7CiAgIHJldHVybiAoICBkYXRlbGVuIDwgOSkgPyBkYXRlbGVuIDogOTsKICAgCiAgIAp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c0EJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNBKAogIERBVEVGTVRfRU5VTVBST0NBIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgIERXT1JEIGR3RmxhZ3MpCnsKICBMQ0lEIExvYyA9IEdldFVzZXJEZWZhdWx0TENJRCgpOyAKICBpZighbHBEYXRlRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgc3dpdGNoKCBMb2MgKQogewoKICAgY2FzZSAweDAwMDAwNDA3OiAgLyogKExvYywiZGVfREUiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkLiBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLiBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLiBNTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9ICAgICAgIAoKICAgY2FzZSAweDAwMDAwNDBjOiAgLyogKExvYywiZnJfRlIiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTS15eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkIGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU0geXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9CgogICBjYXNlIDB4MDAwMDBjMGM6ICAvKiAoTG9jLCJmcl9DQSIpICovCiAgIHsKICAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS1NTS1kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU0teXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5IE1NIGRkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgICB9CiAgIH0KCiAgIGNhc2UgMHgwMDAwMDgwOTogIC8qIChMb2MsImVuX1VLIikgKi8gCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAwYzA5OiAgLyogKExvYywiZW5fQVUiKSAqLyAgIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxMDA5OiAgLyogKExvYywiZW5fQ0EiKSAqLyAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXktTU0tZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTQwOTogIC8qIChMb2MsImVuX05aIikgKi8gCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTgwOTogIC8qIChMb2MsImVuX0lFIikgKi8gICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDFjMDk6ICAvKiAoTG9jLCJlbl9aQSIpICovICAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5L01NL2RkIikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAyMDA5OiAgLyogKExvYywiZW5fSk0iKSAqLyAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxNTU1NIGRkLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGRkIE1NTU0seXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0seXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAyODA5OiAgLyogKExvYywiZW5fQloiKSAqLwogICBjYXNlIDB4MDAwMDJjMDk6ICAvKiAoTG9jLCJlbl9UVCIpICovICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgZGVmYXVsdDogIC8qIGRlZmF1bHQgdG8gVVMgRW5nbGlzaCAiZW5fVVMiICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5L01NL2RkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQogfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c1cJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNXKAogIERBVEVGTVRfRU5VTVBST0NXIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzQQkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c0EoCiAgVElNRUZNVF9FTlVNUFJPQ0EgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgTENJRCBMb2MgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsgCiAgaWYoIWxwVGltZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgaWYoZHdGbGFncykKICAgIHsKICAgICAgRklYTUUoIlVua25vd24gdGltZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKICAgIH0KCiAgc3dpdGNoKCBMb2MgKQogewogICBjYXNlIDB4MDAwMDA0MDc6ICAvKiAoTG9jLCJkZV9ERSIpICovCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgubW0iKSkgcmV0dXJuIFRSVUU7IAogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSC5tbSdVaHInIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0gICAgICAgCgogICBjYXNlIDB4MDAwMDA0MGM6ICAvKiAoTG9jLCJmcl9GUiIpICovCiAgIGNhc2UgMHgwMDAwMGMwYzogIC8qIChMb2MsImZyX0NBIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgubW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIJ2gnbW0iKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgY2FzZSAweDAwMDAwODA5OiAgLyogKExvYywiZW5fVUsiKSAqLwogICBjYXNlIDB4MDAwMDBjMDk6ICAvKiAoTG9jLCJlbl9BVSIpICovIAogICBjYXNlIDB4MDAwMDE0MDk6ICAvKiAoTG9jLCJlbl9OWiIpICovCiAgIGNhc2UgMHgwMDAwMTgwOTogIC8qIChMb2MsImVuX0lFIikgKi8gCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgY2FzZSAweDAwMDAxYzA5OiAgLyogKExvYywiZW5fWkEiKSAqLyAgIAogICBjYXNlIDB4MDAwMDI4MDk6ICAvKiAoTG9jLCJlbl9CWiIpICovCiAgIGNhc2UgMHgwMDAwMmMwOTogIC8qIChMb2MsImVuX1RUIikgKi8gCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7IAogICAgcmV0dXJuIFRSVUU7ICAKICAgfQoKICAgZGVmYXVsdDogIC8qIGRlZmF1bHQgdG8gVVMgc3R5bGUgImVuX1VTIiAqLyAgIAogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImhoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CiB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzVwkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c1coCiAgVElNRUZNVF9FTlVNUFJPQ1cgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUoIiglcCwlbGQsJWxkKTogc3R1YlxuIiwgbHBUaW1lRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGp1c3QgbG9jYWxseSAhCiAqICBEZXNjcmlwdGlvbjogSW52ZXJ0cyBhIHN0cmluZy4KICovIApzdGF0aWMgdm9pZCBPTEVfSW52ZXJ0U3RyaW5nKGNoYXIqIHN0cmluZykKeyAgICAKICAgIGNoYXIgICAgc1RtcEFycmF5WzEyOF07CiAgICBJTlQgICAgIGNvdW50ZXIsIGkgPSAwOwoKICAgIGZvciAoY291bnRlciA9IHN0cmxlbihzdHJpbmcpOyBjb3VudGVyID4gMDsgY291bnRlci0tKQogICAgewogICAgICAgIG1lbWNweShzVG1wQXJyYXkgKyBpLCBzdHJpbmcgKyBjb3VudGVyLTEsIDEpOwogICAgICAgIGkrKzsKICAgIH0KICAgIG1lbWNweShzVG1wQXJyYXkgKyBpLCAiXDAiLCAxKTsKICAgIHN0cmNweShzdHJpbmcsIHNUbXBBcnJheSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IFRlc3QgaWYgdGhlIGdpdmVuIHN0cmluZyAocHNOdW1iZXIpIGlzIHZhbGlkIG9yIG5vdC4KICogICAgICAgICAgICAgICBUaGUgdmFsaWQgY2hhcmFjdGVycyBhcmUgdGhlIGZvbGxvd2luZzoKICogICAgICAgICAgICAgICAtIENoYXJhY3RlcnMgJzAnIHRocm91Z2ggJzknLiAKICogICAgICAgICAgICAgICAtIE9uZSBkZWNpbWFsIHBvaW50IChkb3QpIGlmIHRoZSBudW1iZXIgaXMgYSBmbG9hdGluZy1wb2ludCB2YWx1ZS4gCiAqICAgICAgICAgICAgICAgLSBBIG1pbnVzIHNpZ24gaW4gdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpZiB0aGUgbnVtYmVyIGlzIAogKiAgICAgICAgICAgICAgICAgYSBuZWdhdGl2ZSB2YWx1ZS4KICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcywgcHNCZWZvcmUvcHNBZnRlciB3aWxsIHBvaW50IHRvIHRoZSBzdHJpbmcKICogICAgICAgICAgICAgIG9uIHRoZSByaWdodC9sZWZ0IG9mIHRoZSBkZWNpbWFsIHN5bWJvbC4gcGJOZWdhdGl2ZSBpbmRpY2F0ZXMgaWYgdGhlIAogKiAgICAgICAgICAgICAgbnVtYmVyIGlzIG5lZ2F0aXZlLgogKi8Kc3RhdGljIElOVCBPTEVfR2V0TnVtYmVyQ29tcG9uZW50cyhjaGFyKiBwSW5wdXQsIGNoYXIqIHBzQmVmb3JlLCBjaGFyKiBwc0FmdGVyLCBCT09MKiBwYk5lZ2F0aXZlKQp7CmNoYXIJc051bWJlclNldFtdID0gIjAxMjM0NTY3ODkiOwpCT09MCWJJbkRlY2ltYWwgPSBGQUxTRTsKCgkvKiBUZXN0IGlmIHdlIGRvIGhhdmUgYSBtaW51cyBzaWduICovCglpZiAoICpwSW5wdXQgPT0gJy0nICkKCXsKCQkqcGJOZWdhdGl2ZSA9IFRSVUU7CgkJcElucHV0Kys7IC8qIEp1bXAgdG8gdGhlIG5leHQgY2hhcmFjdGVyLiAqLwoJfQoJCgl3aGlsZSgqcElucHV0ICE9ICdcMCcpCgl7CgkJLyogRG8gd2UgaGF2ZSBhIHZhbGlkIG51bWVyaWMgY2hhcmFjdGVyICovCgkJaWYgKCBzdHJjaHIoc051bWJlclNldCwgKnBJbnB1dCkgIT0gTlVMTCApCgkJewoJCQlpZiAoYkluRGVjaW1hbCA9PSBUUlVFKQogICAgICAgICAgICAgICAgKnBzQWZ0ZXIrKyA9ICpwSW5wdXQ7CgkJCWVsc2UKICAgICAgICAgICAgICAgICpwc0JlZm9yZSsrID0gKnBJbnB1dDsKCQl9CgkJZWxzZQoJCXsKCQkJLyogSXMgdGhpcyBhIGRlY2ltYWwgcG9pbnQgKGRvdCkgKi8KCQkJaWYgKCAqcElucHV0ID09ICcuJyApCgkJCXsKCQkJCS8qIElzIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGZpbmQgaXQgKi8KCQkJCWlmICgoYkluRGVjaW1hbCA9PSBGQUxTRSkpCgkJCQkJYkluRGVjaW1hbCA9IFRSVUU7CgkJCQllbHNlCgkJCQkJcmV0dXJuIC0xOyAvKiBFUlJPUjogSW52YWxpZCBwYXJhbWV0ZXIgKi8KCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8qIEl0J3MgbmVpdGhlciBhIG51bWVyaWMgY2hhcmFjdGVyLCBub3IgYSBkZWNpbWFsIHBvaW50LgoJCQkJICogVGh1cywgcmV0dXJuIGFuIGVycm9yLgogICAgICAgICAgICAgICAgICovCgkJCQlyZXR1cm4gLTE7CgkJCX0KCQl9CiAgICAgICAgcElucHV0Kys7Cgl9CgkKCS8qIEFkZCBhbiBFbmQgb2YgTGluZSBjaGFyYWN0ZXIgdG8gdGhlIG91dHB1dCBidWZmZXJzICovCgkqcHNCZWZvcmUgPSAnXDAnOwoJKnBzQWZ0ZXIgPSAnXDAnOwoKCXJldHVybiAwOyAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBBIG51bWJlciBjb3VsZCBiZSBmb3JtYXR0ZWQgdXNpbmcgZGlmZmVyZW50IG51bWJlcnMgCiAqICAgICAgICAgICAgICAgb2YgImRpZ2l0cyBpbiBncm91cCIgKGV4YW1wbGU6IDQ7MzsyOzApLgogKiAgICAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhpcyBmdW5jdGlvbiBpcyBhbiBhcnJheQogKiAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIHJ1bGUgdG8gYmUgdXNlZC4gSXRzIGZvcm1hdCBpcyB0aGUgZm9sbG93aW5nOgogKiAgICAgICAgICAgICAgIHxOREd8REcxfERHMnwuLi58MHwKICogICAgICAgICAgICAgICB3aGVyZSBOREcgaXMgdGhlIG51bWJlciBvZiB1c2VkICJkaWdpdHMgaW4gZ3JvdXAiIGFuZCBERzEsIERHMiwKICogICAgICAgICAgICAgICBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgImRpZ2l0cyBpbiBncm91cCIuCiAqICAgICAgICAgICAgICAgVGh1cywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBncm91cGluZyB2YWx1ZSBpbiB0aGUgYXJyYXkKICogICAgICAgICAgICAgICBwb2ludGVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogKi8Kc3RhdGljIElOVCBPTEVfR2V0R3JvdXBpbmcoY2hhciogc1J1bGUsIElOVCBpbmRleCkKewogICAgY2hhciAgICBzRGF0YVsyXSwgc1J1bGVTaXplWzJdOwogICAgSU5UICAgICBuRGF0YSwgblJ1bGVTaXplOwoKICAgIG1lbWNweShzUnVsZVNpemUsIHNSdWxlLCAxKTsKICAgIG1lbWNweShzUnVsZVNpemUrMSwgIlwwIiwgMSk7CiAgICBuUnVsZVNpemUgPSBhdG9pKHNSdWxlU2l6ZSk7CgogICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8IG5SdWxlU2l6ZSkKICAgIHsKICAgICAgICBtZW1jcHkoc0RhdGEsIHNSdWxlK2luZGV4LCAxKTsKICAgICAgICBtZW1jcHkoc0RhdGErMSwgIlwwIiwgMSk7CiAgICAgICAgbkRhdGEgPSBhdG9pKHNEYXRhKTsgICAgICAgICAgICAKICAgIH0KICAgICAgICAKICAgIGVsc2UKICAgIHsKICAgICAgICBtZW1jcHkoc0RhdGEsIHNSdWxlK25SdWxlU2l6ZS0xLCAxKTsKICAgICAgICBtZW1jcHkoc0RhdGErMSwgIlwwIiwgMSk7CiAgICAgICAgbkRhdGEgPSBhdG9pKHNEYXRhKTsgICAgICAgICAgICAKICAgIH0KICAgIAogICAgcmV0dXJuIG5EYXRhOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdEEJKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdEEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENTVFIgbHB2YWx1ZSwgICBjb25zdCBOVU1CRVJGTVRBICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFNUUiBscE51bWJlclN0ciwgaW50IGNjaE51bWJlcikKewogICAgY2hhciAgIHNOdW1iZXJEaWdpdHNbM10sIHNEZWNpbWFsU3ltYm9sWzVdLCBzRGlnaXRzSW5Hcm91cFsxMV0sIHNEaWdpdEdyb3VwU3ltYm9sWzVdLCBzSUxaZXJvWzJdOwogICAgSU5UICAgIG5OdW1iZXJEaWdpdHMsIG5OdW1iZXJEZWNpbWFsLCBpLCBqLCBuQ291bnRlciwgblN0ZXAsIG5SdWxlSW5kZXgsIG5Hcm91cGluZywgbkRpZ2l0cywgcmV0VmFsLCBuTFo7CiAgICBjaGFyICAgc051bWJlclsxMjhdLCBzRGVzdGluYXRpb25bMTI4XSwgc0RpZ2l0c0FmdGVyRGVjaW1hbFsxMF0sIHNEaWdpdHNCZWZvcmVEZWNpbWFsWzEyOF07CiAgICBjaGFyICAgc1J1bGVbMTBdLCBzU2VtaUNvbHVtbltdPSI7Iiwgc0J1ZmZlcls1XSwgc05lZ051bWJlclsyXTsgICAgCiAgICBjaGFyICAgKnBTdHIgPSBOVUxMLCAqcFRtcFN0ciA9IE5VTEw7CiAgICBMQ0lEICAgc3lzdGVtRGVmYXVsdExDSUQ7CiAgICBCT09MICAgYk5lZ2F0aXZlID0gRkFMU0U7CiAgICBlbnVtICAgT3BlcmF0aW9ucyAKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBzdHJuY3B5KHNOdW1iZXIsIGxwdmFsdWUsIDEyOCk7CiAgICBzTnVtYmVyWzEyN10gPSAnXDAnOwoKICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgaW5wdXQgc3RyaW5nLCBnZXQgdGhlIG51bWJlcgogICAgICogb2YgZGlnaXRzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLCBhbmQgY2hlY2sKICAgICAqIGlmIHRoaXMgaXMgYSBuZWdhdGl2ZSBudW1iZXIuCiAgICAgKi8KICAgIGlmICggT0xFX0dldE51bWJlckNvbXBvbmVudHMoc051bWJlciwgc0RpZ2l0c0JlZm9yZURlY2ltYWwsIHNEaWdpdHNBZnRlckRlY2ltYWwsICZiTmVnYXRpdmUpICE9IC0xKQogICAgewogICAgICAgIG5OdW1iZXJEZWNpbWFsID0gc3RybGVuKHNEaWdpdHNCZWZvcmVEZWNpbWFsKTsKICAgICAgICBuRGlnaXRzID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICAgICAgZWxzZQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9TWVNURU1ERUZBVUxUOwogICAgfQoKICAgIC8qIExvYWQgdGhlIGZpZWxkcyB3ZSBuZWVkICovCiAgICBzd2l0Y2godXNlZF9vcGVyYXRpb24pCiAgICB7CiAgICBjYXNlIFVTRV9MT0NBTEVJTkZPOgogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lESUdJVFMsIHNOdW1iZXJEaWdpdHMsIHNpemVvZihzTnVtYmVyRGlnaXRzKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0RFQ0lNQUwsIHNEZWNpbWFsU3ltYm9sLCBzaXplb2Yoc0RlY2ltYWxTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TR1JPVVBJTkcsIHNEaWdpdHNJbkdyb3VwLCBzaXplb2Yoc0RpZ2l0c0luR3JvdXApKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TVEhPVVNBTkQsIHNEaWdpdEdyb3VwU3ltYm9sLCBzaXplb2Yoc0RpZ2l0R3JvdXBTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JTFpFUk8sIHNJTFplcm8sIHNpemVvZihzSUxaZXJvKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSU5FR05VTUJFUiwgc05lZ051bWJlciwgc2l6ZW9mKHNOZWdOdW1iZXIpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1BBUkFNRVRFUjoKICAgICAgICBzcHJpbnRmKHNOdW1iZXJEaWdpdHMsICIlZCIsbHBGb3JtYXQtPk51bURpZ2l0cyk7CiAgICAgICAgc3RyY3B5KHNEZWNpbWFsU3ltYm9sLCBscEZvcm1hdC0+bHBEZWNpbWFsU2VwKTsKICAgICAgICBzcHJpbnRmKHNEaWdpdHNJbkdyb3VwLCAiJWQ7MCIsbHBGb3JtYXQtPkdyb3VwaW5nKTsKICAgICAgICBzdHJjcHkoc0RpZ2l0R3JvdXBTeW1ib2wsIGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKTsKICAgICAgICBzcHJpbnRmKHNJTFplcm8sICIlZCIsbHBGb3JtYXQtPkxlYWRpbmdaZXJvKTsKICAgICAgICBzcHJpbnRmKHNOZWdOdW1iZXIsICIlZCIsbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfU1lTVEVNREVGQVVMVDoKICAgICAgICBzeXN0ZW1EZWZhdWx0TENJRCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JRElHSVRTLCBzTnVtYmVyRGlnaXRzLCBzaXplb2Yoc051bWJlckRpZ2l0cykpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU0RFQ0lNQUwsIHNEZWNpbWFsU3ltYm9sLCBzaXplb2Yoc0RlY2ltYWxTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NHUk9VUElORywgc0RpZ2l0c0luR3JvdXAsIHNpemVvZihzRGlnaXRzSW5Hcm91cCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU1RIT1VTQU5ELCBzRGlnaXRHcm91cFN5bWJvbCwgc2l6ZW9mKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JTFpFUk8sIHNJTFplcm8sIHNpemVvZihzSUxaZXJvKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JTkVHTlVNQkVSLCBzTmVnTnVtYmVyLCBzaXplb2Yoc05lZ051bWJlcikpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG5OdW1iZXJEaWdpdHMgPSBhdG9pKHNOdW1iZXJEaWdpdHMpOwogICAgCiAgICAvKiBSZW1vdmUgdGhlICI7IiAqLwogICAgaT0wOwogICAgaiA9IDE7CiAgICBmb3IgKG5Db3VudGVyPTA7IG5Db3VudGVyPHN0cmxlbihzRGlnaXRzSW5Hcm91cCk7IG5Db3VudGVyKyspCiAgICB7CiAgICAgICAgaWYgKCBtZW1jbXAoc0RpZ2l0c0luR3JvdXAgKyBuQ291bnRlciwgc1NlbWlDb2x1bW4sIDEpICE9IDAgKQogICAgICAgIHsKICAgICAgICAgICAgbWVtY3B5KHNSdWxlICsgaiwgc0RpZ2l0c0luR3JvdXAgKyBuQ291bnRlciwgMSk7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgIH0KICAgIHNwcmludGYoc0J1ZmZlciwgIiVkIiwgaSk7CiAgICBtZW1jcHkoc1J1bGUsIHNCdWZmZXIsIDEpOyAvKiBOdW1iZXIgb2YgZGlnaXRzIGluIHRoZSBncm91cHMgKCB1c2VkIGJ5IE9MRV9HZXRHcm91cGluZygpICkgKi8KICAgIG1lbWNweShzUnVsZSArIGosICJcMCIsIDEpOwogICAgCiAgICAvKiBGaXJzdCwgZm9ybWF0IHRoZSBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsLiAqLwogICAgaWYgKChuTnVtYmVyRGVjaW1hbD4wKSAmJiAoYXRvaShzRGlnaXRzQmVmb3JlRGVjaW1hbCkgIT0gMCkpIAogICAgewogICAgICAgIC8qIFdvcmtpbmcgb24gYW4gaW52ZXJ0ZWQgc3RyaW5nIGlzIGVhc2llciAhICovCiAgICAgICAgT0xFX0ludmVydFN0cmluZyhzRGlnaXRzQmVmb3JlRGVjaW1hbCk7CgogICAgICAgIG5TdGVwID0gbkNvdW50ZXIgPSBpID0gaiA9IDA7CiAgICAgICAgblJ1bGVJbmRleCA9IDE7CiAgICAgICAgbkdyb3VwaW5nID0gT0xFX0dldEdyb3VwaW5nKHNSdWxlLCBuUnVsZUluZGV4KTsKICAgICAgICAKICAgICAgICAvKiBIZXJlLCB3ZSB3aWxsIGxvb3AgdW50aWwgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgogICAgICAgICAqIEFuIGludGVybmFsIGNvdW50ZXIgKGopIGlzIHVzZWQgaW4gb3JkZXIgdG8ga25vdyB3aGVuIHRvIAogICAgICAgICAqIGluc2VydCB0aGUgImRpZ2l0IGdyb3VwIHN5bWJvbCIuCiAgICAgICAgICovCiAgICAgICAgd2hpbGUgKG5OdW1iZXJEZWNpbWFsID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGkgPSBuQ291bnRlciArIG5TdGVwOwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSwgc0RpZ2l0c0JlZm9yZURlY2ltYWwgKyBuQ291bnRlciwgMSk7CiAgICAgICAgICAgIG5Db3VudGVyKys7CiAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgaWYgKGogPj0gbkdyb3VwaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgICAgIGlmIChuUnVsZUluZGV4IDwgc1J1bGVbMF0pCiAgICAgICAgICAgICAgICAgICAgblJ1bGVJbmRleCsrOwogICAgICAgICAgICAgICAgbkdyb3VwaW5nID0gT0xFX0dldEdyb3VwaW5nKHNSdWxlLCBuUnVsZUluZGV4KTsKICAgICAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24gKyBpKzEsIHNEaWdpdEdyb3VwU3ltYm9sLCBzdHJsZW4oc0RpZ2l0R3JvdXBTeW1ib2wpKTsKICAgICAgICAgICAgICAgIG5TdGVwKz0gc3RybGVuKHNEaWdpdEdyb3VwU3ltYm9sKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbk51bWJlckRlY2ltYWwtLTsKICAgICAgICB9CgogICAgICAgIG1lbWNweShzRGVzdGluYXRpb24gKyBpKzEsICJcMCIsIDEpOwogICAgICAgIC8qIEdldCB0aGUgc3RyaW5nIGluIHRoZSByaWdodCBvcmRlciAhICovCiAgICAgICAgT0xFX0ludmVydFN0cmluZyhzRGVzdGluYXRpb24pOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgIG5MWiA9IGF0b2koc0lMWmVybyk7CiAgICAgICAgaWYgKG5MWiAhPSAwKQogICAgICAgIHsgICAgICAgIAogICAgICAgICAgICAvKiBVc2UgMC54eHggaW5zdGVhZCBvZiAueHh4ICovCiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24sICIwIiwgMSk7CiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24rMSwgIlwwIiwgMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiwgIlwwIiwgMSk7CgogICAgIH0KCiAgICAvKiBTZWNvbmQsIGZvcm1hdCB0aGUgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsLiAqLwogICAgaiA9IDA7CiAgICBuQ291bnRlciA9IG5OdW1iZXJEaWdpdHM7CiAgICBpZiAoIChuRGlnaXRzPjApICYmIChwU3RyID0gc3Ryc3RyIChzTnVtYmVyLCAiLiIpKSApCiAgICB7CiAgICAgICAgaSA9IHN0cmxlbihzTnVtYmVyKSAtIHN0cmxlbihwU3RyKSArIDE7ICAgICAgICAKICAgICAgICBzdHJuY3B5ICggc0RpZ2l0c0FmdGVyRGVjaW1hbCwgc051bWJlciArIGksIG5OdW1iZXJEaWdpdHMpOwogICAgICAgIGogPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICAgICAgaWYgKGogPCBuTnVtYmVyRGlnaXRzKQogICAgICAgICAgICBuQ291bnRlciA9IG5OdW1iZXJEaWdpdHMtajsgICAgICAgICAgICAKICAgIH0KICAgIGZvciAoaT0wO2k8bkNvdW50ZXI7aSsrKQogICAgICAgICBtZW1jcHkoc0RpZ2l0c0FmdGVyRGVjaW1hbCtpK2osICIwIiwgMSk7ICAgIAogICAgbWVtY3B5KHNEaWdpdHNBZnRlckRlY2ltYWwgKyBuTnVtYmVyRGlnaXRzLCAiXDAiLCAxKTsgICAgCgogICAgaSA9IHN0cmxlbihzRGVzdGluYXRpb24pOwogICAgaiA9IHN0cmxlbihzRGlnaXRzQWZ0ZXJEZWNpbWFsKTsKICAgIC8qIEZpbmFsbHksIGNvbnN0cnVjdCB0aGUgcmVzdWx0aW5nIGZvcm1hdHRlZCBzdHJpbmcuICovCiAgICAgICAgCiAgICBmb3IgKG5Db3VudGVyPTA7IG5Db3VudGVyPGk7IG5Db3VudGVyKyspCiAgICAgICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlciwgc0Rlc3RpbmF0aW9uICsgbkNvdW50ZXIsIDEpOwogICAgICAgCiAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyLCBzRGVjaW1hbFN5bWJvbCwgc3RybGVuKHNEZWNpbWFsU3ltYm9sKSk7CgogICAgZm9yIChpPTA7IGk8ajsgaSsrKQogICAgICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIraStzdHJsZW4oc0RlY2ltYWxTeW1ib2wpLCBzRGlnaXRzQWZ0ZXJEZWNpbWFsICsgaSwgMSk7CiAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyK2krc3RybGVuKHNEZWNpbWFsU3ltYm9sKSwgIlwwIiwgMSk7CiAgICAgICAgCiAgICAvKiBJcyBpdCBhIG5lZ2F0aXZlIG51bWJlciAqLwogICAgaWYgKGJOZWdhdGl2ZSA9PSBUUlVFKQogICAgewogICAgICAgIGkgPSBhdG9pKHNOZWdOdW1iZXIpOwogICAgICAgIHBTdHIgPSBzRGVzdGluYXRpb247CiAgICAgICAgcFRtcFN0ciA9IHNOdW1iZXI7CiAgICAgICAgc3dpdGNoIChpKQogICAgICAgIHsgICAgICAgICAgCiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAqcFN0cisrID0gJygnOwogICAgICAgICAgICB3aGlsZSAoKnNOdW1iZXIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcpJzsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGJyZWFrOyAgCiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICAqcFN0cisrID0gJyAnOwogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcgJzsKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICBzdHJjcHkoc0Rlc3RpbmF0aW9uLCBzTnVtYmVyKTsKCiAgICAvKiBJZiBjY2hOdW1iZXIgaXMgemVybywgdGhlbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3IgY2hhcmFjdGVycyAKICAgICAqIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGZvcm1hdHRlZCBudW1iZXIgc3RyaW5nCiAgICAgKi8KICAgIGlmIChjY2hOdW1iZXI9PTApCiAgICAgICAgcmV0VmFsID0gc3RybGVuKHNEZXN0aW5hdGlvbikgKyAxOwogICAgZWxzZSAgICAgICAgICAgCiAgICB7CiAgICAgICAgc3RybmNweSAobHBOdW1iZXJTdHIsIHNEZXN0aW5hdGlvbiwgY2NoTnVtYmVyLTEpOwogICAgICAgICoobHBOdW1iZXJTdHIrY2NoTnVtYmVyLTEpID0gJ1wwJzsgICAvKiBlbnN1cmUgd2UgZ290IGEgTlVMTCBhdCB0aGUgZW5kICovCiAgICAgICAgcmV0VmFsID0gc3RybGVuKGxwTnVtYmVyU3RyKTsKICAgIH0KICAgICAgICAgIAogICAgcmV0dXJuIHJldFZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXRXCShLRVJORUwzMi5AKQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgY29uc3QgTlVNQkVSRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRSgiJXM6IHN0dWIsIG5vIHJlZm9ybWF0dGluZyBkb25lXG4iLGRlYnVnc3RyX3cobHB2YWx1ZSkpOwoKIGxzdHJjcHluVyggbHBOdW1iZXJTdHIsIGxwdmFsdWUsIGNjaE51bWJlciApOwogcmV0dXJuIGNjaE51bWJlcj8gc3RybGVuVyggbHBOdW1iZXJTdHIgKSA6IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0Q3VycmVuY3lGb3JtYXRBCShLRVJORUwzMi5AKQogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdEEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENTVFIgbHB2YWx1ZSwgICBjb25zdCBDVVJSRU5DWUZNVEEgKiBscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwQ3VycmVuY3lTdHIsIGludCBjY2hDdXJyZW5jeSkKewogICAgVUlOVCAgIG5Qb3NPcmRlciwgbk5lZ09yZGVyOwogICAgSU5UICAgIHJldFZhbDsKICAgIGNoYXIgICBzRGVzdGluYXRpb25bMTI4XSwgc05lZ09yZGVyWzhdLCBzUG9zT3JkZXJbOF0sIHNDdXJyZW5jeVN5bWJvbFs4XTsKICAgIGNoYXIgICAqcERlc3RpbmF0aW9uID0gc0Rlc3RpbmF0aW9uOwogICAgY2hhciAgIHNOdW1iZXJGb3JtYXRlZFsxMjhdOwogICAgY2hhciAgICpwTnVtYmVyRm9ybWF0ZWQgPSBzTnVtYmVyRm9ybWF0ZWQ7CiAgICBMQ0lEICAgc3lzdGVtRGVmYXVsdExDSUQ7CiAgICBCT09MICAgYklzUG9zaXRpdmUgPSBGQUxTRSwgYlZhbGlkRm9ybWF0ID0gRkFMU0U7CiAgICBlbnVtICAgT3BlcmF0aW9ucyAKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBOVU1CRVJGTVRBICBudW1iZXJGbXQ7CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICAgICAgZWxzZQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9TWVNURU1ERUZBVUxUOwogICAgfQoKICAgIC8qIExvYWQgdGhlIGZpZWxkcyB3ZSBuZWVkICovCiAgICBzd2l0Y2godXNlZF9vcGVyYXRpb24pCiAgICB7CiAgICBjYXNlIFVTRV9MT0NBTEVJTkZPOiAgICAgICAgCiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBICovCiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSU5FR0NVUlIsIHNOZWdPcmRlciwgc2l6ZW9mKHNOZWdPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0NVUlJFTkNZLCBzQ3VycmVuY3lTeW1ib2wsIHNpemVvZihzQ3VycmVuY3lTeW1ib2wpKTsKICAgICAgICAKICAgICAgICBuUG9zT3JkZXIgPSBhdG9pKHNQb3NPcmRlcik7CiAgICAgICAgbk5lZ09yZGVyID0gYXRvaShzTmVnT3JkZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfUEFSQU1FVEVSOiAgICAgICAgCiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBICovCiAgICAgICAgbk5lZ09yZGVyID0gbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXI7CiAgICAgICAgblBvc09yZGVyID0gbHBGb3JtYXQtPlBvc2l0aXZlT3JkZXI7CiAgICAgICAgc3RyY3B5KHNDdXJyZW5jeVN5bWJvbCwgbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfU1lTVEVNREVGQVVMVDoKICAgICAgICBzeXN0ZW1EZWZhdWx0TENJRCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7ICAgICAgICAKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEgKi8KICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lORUdDVVJSLCBzTmVnT3JkZXIsIHNpemVvZihzTmVnT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TQ1VSUkVOQ1ksIHNDdXJyZW5jeVN5bWJvbCwgc2l6ZW9mKHNDdXJyZW5jeVN5bWJvbCkpOwogICAgICAgIAogICAgICAgIG5Qb3NPcmRlciA9IGF0b2koc1Bvc09yZGVyKTsKICAgICAgICBuTmVnT3JkZXIgPSBhdG9pKHNOZWdPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAKICAgIC8qIENvbnN0cnVjdCBhIHRlbXBvcmFyeSBudW1iZXIgZm9ybWF0IHN0cnVjdHVyZSAqLwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgbnVtYmVyRm10Lk51bURpZ2l0cyAgICAgPSBscEZvcm1hdC0+TnVtRGlnaXRzOwogICAgICAgIG51bWJlckZtdC5MZWFkaW5nWmVybyAgID0gbHBGb3JtYXQtPkxlYWRpbmdaZXJvOwogICAgICAgIG51bWJlckZtdC5Hcm91cGluZyAgICAgID0gbHBGb3JtYXQtPkdyb3VwaW5nOwogICAgICAgIG51bWJlckZtdC5OZWdhdGl2ZU9yZGVyID0gMDsKICAgICAgICBudW1iZXJGbXQubHBEZWNpbWFsU2VwID0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcDsKICAgICAgICBudW1iZXJGbXQubHBUaG91c2FuZFNlcCA9IGxwRm9ybWF0LT5scFRob3VzYW5kU2VwOwogICAgICAgIGJWYWxpZEZvcm1hdCA9IFRSVUU7CiAgICB9CgogICAgLyogTWFrZSBhIGNhbGwgdG8gR2V0TnVtYmVyRm9ybWF0QSgpICovCiAgICBpZiAoKmxwdmFsdWUgPT0gJy0nKQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gRkFMU0U7CiAgICAgICAgcmV0VmFsID0gR2V0TnVtYmVyRm9ybWF0QShsb2NhbGUsMCxscHZhbHVlKzEsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gVFJVRTsKICAgICAgICByZXRWYWwgPSBHZXROdW1iZXJGb3JtYXRBKGxvY2FsZSwwLGxwdmFsdWUsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQogICAgICAgIAogICAgaWYgKHJldFZhbCA9PSAwKQogICAgICAgIHJldHVybiAwOwoKICAgIC8qIGNvbnN0cnVjdCB0aGUgZm9ybWF0dGVkIHN0cmluZyAqLwogICAgaWYgKGJJc1Bvc2l0aXZlKQogICAgewogICAgICAgIHN3aXRjaCAoblBvc09yZGVyKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6ICAgLyogUHJlZml4LCBubyBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOiAgIC8qIFN1ZmZpeCwgbm8gc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjogICAvKiBQcmVmaXgsIDEgY2hhciBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzogICAvKiBTdWZmaXgsIDEgY2hhciBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgIC8qIG5lZ2F0aXZlIG51bWJlciAqLwogICAgewogICAgICAgIHN3aXRjaCAobk5lZ09yZGVyKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6ICAgLyogZm9ybWF0OiAoJDEuMSkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTogICAvKiBmb3JtYXQ6IC0kMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjogICAvKiBmb3JtYXQ6ICQtMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzogICAvKiBmb3JtYXQ6ICQxLjEtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDogICAvKiBmb3JtYXQ6ICgxLjEkKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OiAgIC8qIGZvcm1hdDogLTEuMSQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OiAgIC8qIGZvcm1hdDogMS4xLSQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3OiAgIC8qIGZvcm1hdDogMS4xJC0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA4OiAgIC8qIGZvcm1hdDogLTEuMSAkICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDk6ICAgLyogZm9ybWF0OiAtJCAxLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTA6ICAgLyogZm9ybWF0OiAxLjEgJC0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTE6ICAgLyogZm9ybWF0OiAkIDEuMS0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTI6ICAgLyogZm9ybWF0OiAkIC0xLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTM6ICAgLyogZm9ybWF0OiAxLjEtICQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTQ6ICAgLyogZm9ybWF0OiAoJCAxLjEpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOyAKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTU6ICAgLyogZm9ybWF0OiAoMS4xICQpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOyAKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoY2NoQ3VycmVuY3kgPT0gMCkKICAgICAgICByZXR1cm4gc3RybGVuKHBEZXN0aW5hdGlvbikgKyAxOwoKICAgIGVsc2UKICAgIHsKICAgICAgICBzdHJuY3B5IChscEN1cnJlbmN5U3RyLCBwRGVzdGluYXRpb24sIGNjaEN1cnJlbmN5LTEpOwogICAgICAgICoobHBDdXJyZW5jeVN0citjY2hDdXJyZW5jeS0xKSA9ICdcMCc7ICAgLyogZW5zdXJlIHdlIGdvdCBhIE5VTEwgYXQgdGhlIGVuZCAqLwogICAgICAgIHJldHVybiAgc3RybGVuKGxwQ3VycmVuY3lTdHIpOwogICAgfSAgICAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdFcJKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIEdldEN1cnJlbmN5Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1dTVFIgbHB2YWx1ZSwgICBjb25zdCBDVVJSRU5DWUZNVFcgKiBscEZvcm1hdCwKCQkJICAgICAgIExQV1NUUiBscEN1cnJlbmN5U3RyLCBpbnQgY2NoQ3VycmVuY3kpCnsKICAgIEZJWE1FKCJUaGlzIEFQSSBmdW5jdGlvbiBpcyBOT1QgaW1wbGVtZW50ZWQgIVxuIik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFMk5MU19DaGVja0xvY2FsZQlbaW50ZXJuXQogKi8gCnN0YXRpYyBMQ0lEIE9MRTJOTFNfQ2hlY2tMb2NhbGUgKExDSUQgbG9jYWxlKQp7CglpZiAoIWxvY2FsZSkgCgl7IGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKCX0KICAKCWlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSAKICAJeyByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgCgl7IHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCWVsc2UKCXsgcmV0dXJuIGxvY2FsZTsKCX0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0QQlbS0VSTkVMMzIuQF0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSB0aW1lCiAqCiAqIEZvcm1hdHMgZGF0ZSBhY2NvcmRpbmcgdG8gZm9ybWF0LCAgb3IgbG9jYWxlIGRlZmF1bHQgaWYgZm9ybWF0IGlzCiAqIE5VTEwuIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKICoKICogaCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAqIGhoIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIEggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogKiBISCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBtICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIG1tIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogcyAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBzcyBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHQgIHRpbWUgbWFya2VyIChBIG9yIFApCiAqIHR0IHRpbWUgbWFya2VyIChBTSwgUE0pCiAqCiAqLwpJTlQgV0lOQVBJIApHZXRUaW1lRm9ybWF0QShMQ0lEIGxvY2FsZSwgICAgICAgIC8qIFtpbl0gICovCgkgICAgICAgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBbaW5dICAqLwoJICAgICAgIExQU1lTVEVNVElNRSB4dGltZSwgLyogW2luXSAgKi8gCgkgICAgICAgTFBDU1RSIGZvcm1hdCwgICAgICAvKiBbaW5dICAqLwoJICAgICAgIExQU1RSIHRpbWVzdHIsICAgICAgLyogW291dF0gKi8KCSAgICAgICBJTlQgdGltZWxlbiAgICAgICAgIC8qIFtpbl0gICovKSAKeyBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlPTA7CiAgRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcmQgdGltZWZvcm1hdCAqLwogIElOVCByZXQ7CiAgICAKICBUUkFDRSgiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsdGltZXN0cix0aW1lbGVuKTsKCiAgdGhpc2xvY2FsZSA9IE9MRTJOTFNfQ2hlY2tMb2NhbGUgKCBsb2NhbGUgKTsKCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSAKICB7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qIHVzZSBzeXN0ZW0gZGVmYXVsdCAqLwogICAgeyB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgIH0KICAgIEdldExvY2FsZUluZm9BKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwogIH0KICBlbHNlIAogIHsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKICB9CiAgCiAgaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUgKi8KICB7IEdldExvY2FsVGltZSgmdCk7CiAgICB0aGlzdGltZSA9ICZ0OwogIH0gCiAgZWxzZQogIHsgdGhpc3RpbWUgPSB4dGltZTsKICAvKiBDaGVjayB0aGF0IGhvdXIsbWluIGFuZCBzZWMgaXMgaW4gcmFuZ2UgKi8KICB9CiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwogIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0VwlbS0VSTkVMMzIuQF0KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgdGltZQogKi8KSU5UIFdJTkFQSSAKR2V0VGltZUZvcm1hdFcoTENJRCBsb2NhbGUsICAgICAgICAvKiBbaW5dICAqLwoJICAgICAgIERXT1JEIGZsYWdzLCAgICAgICAgLyogW2luXSAgKi8KCSAgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIFtpbl0gICovIAoJICAgICAgIExQQ1dTVFIgZm9ybWF0LCAgICAgLyogW2luXSAgKi8KCSAgICAgICBMUFdTVFIgdGltZXN0ciwgICAgIC8qIFtvdXRdICovCgkgICAgICAgSU5UIHRpbWVsZW4gICAgICAgICAvKiBbaW5dICAqLykgCnsJV0NIQVIgZm9ybWF0X2J1Zls0MF07CglMUENXU1RSIHRoaXNmb3JtYXQ7CglTWVNURU1USU1FIHQ7CglMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CglMQ0lEIHRoaXNsb2NhbGU9MDsKCURXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJkIHRpbWVmb3JtYXQgKi8KCUlOVCByZXQ7CgkgICAgCglUUkFDRSgiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxvY2FsZSxmbGFncywKCXh0aW1lLGRlYnVnc3RyX3coZm9ybWF0KSx0aW1lc3RyLHRpbWVsZW4pOwoKCXRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgoJaWYgKGZvcm1hdCA9PSBOVUxMKSAKCXsgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyogdXNlIHN5c3RlbSBkZWZhdWx0ICovCgkgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgIH0KCSAgR2V0TG9jYWxlSW5mb1codGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCA0MCk7CgkgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwoJfQkgIAoJZWxzZSAKCXsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKCX0KIAoJaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUgKi8KCXsgR2V0TG9jYWxUaW1lKCZ0KTsKCSAgdGhpc3RpbWUgPSAmdDsKCX0gCgllbHNlCgl7IHRoaXN0aW1lID0geHRpbWU7Cgl9CgoJcmV0ID0gT0xFX0dldEZvcm1hdFcodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0EJW0tFUk5FTDMyLkBdCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSgKCUNBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZQopIHsKCUZJWE1FKCIoJXAsMHglMDRseCwweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLGNhbGluZm9wcm9jLGxvY2FsZSxjYWxlbmRhcixjYWx0eXBlKTsKCXJldHVybiBGQUxTRTsKfQo=