LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7CgppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5JU2VydmVyRWRpdG9ySW5wdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvcklucHV0OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wdWJsaXNoLlB1Ymxpc2hEaWFsb2c7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnRhc2suRmluaXNoV2l6YXJkRnJhZ21lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnRhc2suSW5wdXRXaXphcmRGcmFnbWVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5TYXZlUnVudGltZVRhc2s7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5DbG9zYWJsZVdpemFyZERpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk5ld1J1bnRpbWVXaXphcmRGcmFnbWVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLio7CgppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwovKioKICogU2VydmVyIFVJIHV0aWxpdHkgbWV0aG9kcy4KICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJVSVV0aWwgewoJLyoqCgkgKiBTZXJ2ZXJVSVV0aWwgY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHJpdmF0ZSBTZXJ2ZXJVSVV0aWwoKSB7CgkJc3VwZXIoKTsKCX0KCgkvKioKCSAqIE9wZW4gdGhlIHBhc3NlZCBzZXJ2ZXIgaW4gdGhlIHNlcnZlciBlZGl0b3IuCgkgKgoJICogQHBhcmFtIHNlcnZlcgoJICovCglwdWJsaWMgc3RhdGljIHZvaWQgZWRpdFNlcnZlcihJU2VydmVyIHNlcnZlcikgewoJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKCQkJcmV0dXJuOwoKCQlTdHJpbmcgc2VydmVySWQgPSBudWxsOwoJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKCQkJc2VydmVySWQgPSBzZXJ2ZXIuZ2V0SWQoKTsKCQllZGl0U2VydmVyKHNlcnZlcklkKTsKCX0KCgkvKioKCSAqIE9wZW4gdGhlIHBhc3NlZCBzZXJ2ZXIgaWQgaW50byB0aGUgc2VydmVyIGVkaXRvci4KCSAqCgkgKiBAcGFyYW0gc2VydmVySWQKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIGVkaXRTZXJ2ZXIoU3RyaW5nIHNlcnZlcklkKSB7CgkJaWYgKHNlcnZlcklkID09IG51bGwpCgkJCXJldHVybjsKCgkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwoJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwoKCQl0cnkgewoJCQlJU2VydmVyRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgU2VydmVyRWRpdG9ySW5wdXQoc2VydmVySWQpOwoJCQlwYWdlLm9wZW5FZGl0b3IoaW5wdXQsIElTZXJ2ZXJFZGl0b3JJbnB1dC5FRElUT1JfSUQpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgc2VydmVyIGVkaXRvciIsIGUpOwoJCX0KCX0KCgkvKioKCSAqIFB1Ymxpc2ggdGhlIGdpdmVuIHNlcnZlciwgYW5kIGRpc3BsYXkgdGhlIHB1Ymxpc2hpbmcgaW4gYSBkaWFsb2cuCgkgKiBJZiBrZWVwT3BlbiBpcyB0cnVlLCB0aGUgcHVibGlzaCBkaWFsb2cgd2lsbCByZW1haW4gb3BlbiBhZnRlcgoJICogcHVibGlzaGluZy4gSWYgZmFsc2UsIGl0IHdpbGwgb25seSByZW1haW4gb3BlbiBpZiB0aGVyZSB3YXMgYW4KCSAqIGVycm9yLCBpbmZvLCBvciB3YXJuaW5nIG1lc3NhZ2UuCgkgKgoJICogQHBhcmFtIHNlcnZlcgoJICogQHBhcmFtIGtlZXBPcGVuCgkgKiBAcmV0dXJuIElTdGF0dXMKCSAqLwoJcHVibGljIHN0YXRpYyBJU3RhdHVzIHB1Ymxpc2hXaXRoRGlhbG9nKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlciwgYm9vbGVhbiBrZWVwT3BlbikgewoJCXJldHVybiBQdWJsaXNoRGlhbG9nLnB1Ymxpc2goc2hlbGwsIHNlcnZlciwga2VlcE9wZW4pOwoJfQoKCS8qKgoJICogUHJvbXB0cyB0aGUgdXNlciBpZiB0aGUgc2VydmVyIGlzIGRpcnR5LiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciB3YXMKCSAqIG5vdCBkaXJ0eSBvciBpZiB0aGUgdXNlciBkZWNpZGVkIHRvIGNvbnRpbnVlIGFueXdheS4gUmV0dXJucyBmYWxzZSBpZgoJICogdGhlIHNlcnZlciBpcyBkaXJ0eSBhbmQgdGhlIHVzZXIgY2hvc2UgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24uCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRJZkRpcnR5KFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcikgewoJCWlmIChzZXJ2ZXIgPT0gbnVsbCB8fCAhKHNlcnZlciBpbnN0YW5jZW9mIElTZXJ2ZXJXb3JraW5nQ29weSkpCgkJCXJldHVybiBmYWxzZTsKCgkJU3RyaW5nIHRpdGxlID0gU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVyZXNvdXJjZURpcnR5RGlhbG9nVGl0bGUiKTsKCQkKCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7CgkJaWYgKHdjLmlzRGlydHkoKSkgewoJCQlTdHJpbmcgbWVzc2FnZSA9IFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlcmVzb3VyY2VEaXJ0eURpYWxvZ01lc3NhZ2UiLCBzZXJ2ZXIuZ2V0TmFtZSgpKTsKCQkJU3RyaW5nW10gbGFiZWxzID0gbmV3IFN0cmluZ1tdIHtTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXJlc291cmNlRGlydHlEaWFsb2dDb250aW51ZSIpLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH07CgkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coc2hlbGwsIHRpdGxlLCBudWxsLCBtZXNzYWdlLCBNZXNzYWdlRGlhbG9nLklORk9STUFUSU9OLCBsYWJlbHMsIDApOwoJCgkJCWlmIChkaWFsb2cub3BlbigpICE9IDApCgkJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBVc2UgdGhlIHByZWZlcmVuY2UgdG8gcHJvbXB0IHRoZSB1c2VyIHRvIHNhdmUgZGlydHkgZWRpdG9ycywgaWYgYXBwbGljYWJsZS4KCSAqIAoJICogQHJldHVybiBib29sZWFuICAtIFJldHVybnMgZmFsc2UgaWYgdGhlIHVzZXIgY2FuY2VsbGVkIHRoZSBvcGVyYXRpb24KCSAqLwoJcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVFZGl0b3JzKCkgewoJCWJ5dGUgYiA9IFNlcnZlclVJQ29yZS5nZXRQcmVmZXJlbmNlcygpLmdldFNhdmVFZGl0b3JzKCk7CgkJaWYgKGIgPT0gSVNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX05FVkVSKQoJCQlyZXR1cm4gdHJ1ZTsKCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5zYXZlQWxsRWRpdG9ycyhiID09IElTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19QUk9NUFQpOwkJCQoJfQoKCS8qKgoJICogUHVibGlzaGVzIHRvIHRoZSBnaXZlbiBzZXJ2ZXIsIGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldCBhbmQgcHVibGlzaGluZyB3YXMgcmVxdWlyZWQuCgkgKiAKCSAqIEByZXR1cm4gYm9vbGVhbiAtIFJldHVybnMgZmFsc2UgaWYgdGhlIHVzZXIgY2FuY2VsbGVkIHRoZSBvcGVyYXRpb24uCgkgKi8KCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwdWJsaXNoKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcikgewoJCWlmIChTZXJ2ZXJDb3JlLmdldFNlcnZlclByZWZlcmVuY2VzKCkuaXNBdXRvUHVibGlzaGluZygpICYmIHNlcnZlci5zaG91bGRQdWJsaXNoKCkpIHsKCQkJLy8gcHVibGlzaCBmaXJzdAoJCQlJU3RhdHVzIHN0YXR1cyA9IHB1Ymxpc2hXaXRoRGlhbG9nKHNoZWxsLCBzZXJ2ZXIsIGZhbHNlKTsKCgkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSAvLyB1c2VyIGNhbmNlbGxlZAoJCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJLyoqCgkgKiBAZGVwcmVjYXRlZCAtIHVzZSBzaG93TmV3UnVudGltZVdpemFyZAoJICovCglwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd1J1bnRpbWVQcmVmZXJlbmNlUGFnZShTaGVsbCBzaGVsbCkgewoJCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByZWZlcmVuY2VNYW5hZ2VyKCk7CgkJSVByZWZlcmVuY2VOb2RlIG5vZGUgPSBtYW5hZ2VyLmZpbmQoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZSgib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5ydW50aW1lLnByZWZlcmVuY2VQYWdlIik7CgkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlcjIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoKTsKCQltYW5hZ2VyMi5hZGRUb1Jvb3Qobm9kZSk7CgkJZmluYWwgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhzaGVsbCwgbWFuYWdlcjIpOwoJCWZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhbltdIHsgZmFsc2UgfTsKCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShzaGVsbC5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKCQkJcHVibGljIHZvaWQgcnVuKCkgewoJCQkJZGlhbG9nLmNyZWF0ZSgpOwoJCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQoJCQkJCXJlc3VsdFswXSA9IHRydWU7CgkJCX0KCQl9KTsKCQlyZXR1cm4gcmVzdWx0WzBdOwoJfQoKCS8qKgoJICogCgkgKiBAcGFyYW0gc2hlbGwKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsKSB7CgkJcmV0dXJuIHNob3dOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCBudWxsLCBudWxsKTsKCX0KCgkvKioKCSAqIFNob3dzIHRoZSBuZXcgcnVudGltZSB3aXphcmQuCgkgKiAKCSAqIEBwYXJhbSBzaGVsbAoJICogQHBhcmFtIHJ1bnRpbWVUeXBlSWQKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgcnVudGltZVR5cGVJZCkgewoJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IG51bGw7CgkJaWYgKHJ1bnRpbWVUeXBlSWQgIT0gbnVsbCkKCQkJcnVudGltZVR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lVHlwZShydW50aW1lVHlwZUlkKTsKCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkgewoJCQl0cnkgewoJCQkJZmluYWwgSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gcnVudGltZVR5cGUuY3JlYXRlUnVudGltZShudWxsLCBudWxsKTsKCQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgewoJCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3QgbGlzdCkgewoJCQkJCQlsaXN0LmFkZChuZXcgSW5wdXRXaXphcmRGcmFnbWVudChJVGFza01vZGVsLlRBU0tfUlVOVElNRSwgcnVudGltZSkpOwoJCQkJCQlsaXN0LmFkZChTZXJ2ZXJVSUNvcmUuZ2V0V2l6YXJkRnJhZ21lbnQocnVudGltZVR5cGVJZCkpOwoJCQkJCQlsaXN0LmFkZChuZXcgRmluaXNoV2l6YXJkRnJhZ21lbnQobmV3IFNhdmVSdW50aW1lVGFzaygpKSk7CgkJCQkJfQoJCQkJfTsKCQkJCVRhc2tXaXphcmQgd2l6YXJkID0gbmV3IFRhc2tXaXphcmQoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpOZXdSdW50aW1lV2l6YXJkVGl0bGUiKSwgZnJhZ21lbnQpOwoJCQkJd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKCQkJCUNsb3NhYmxlV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBDbG9zYWJsZVdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKCQkJCXJldHVybiAoZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQlyZXR1cm4gc2hvd05ld1J1bnRpbWVXaXphcmQoc2hlbGwsIG51bGwsIG51bGwsIHJ1bnRpbWVUeXBlSWQpOwoJfQoKCS8qKgoJICogCgkgKiBAcGFyYW0gc2hlbGwKCSAqIEBwYXJhbSB0eXBlCgkgKiBAcGFyYW0gdmVyc2lvbgoJICogQHJldHVybgoJICovCglwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd05ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBTdHJpbmcgdmVyc2lvbikgewoJCXJldHVybiBzaG93TmV3UnVudGltZVdpemFyZChzaGVsbCwgdHlwZSwgdmVyc2lvbiwgbnVsbCk7Cgl9CgoJLyoqCgkgKiAKCSAqIEBwYXJhbSBzaGVsbAoJICogQHBhcmFtIHR5cGUKCSAqIEBwYXJhbSB2ZXJzaW9uCgkgKiBAcGFyYW0gcnVudGltZVR5cGVJZAoJICogQHJldHVybgoJICovCglwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd05ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBTdHJpbmcgdmVyc2lvbiwgZmluYWwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdCBsaXN0KSB7CgkJCQlsaXN0LmFkZChuZXcgTmV3UnVudGltZVdpemFyZEZyYWdtZW50KHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpKTsKCQkJCWxpc3QuYWRkKG5ldyBGaW5pc2hXaXphcmRGcmFnbWVudChuZXcgU2F2ZVJ1bnRpbWVUYXNrKCkpKTsKCQkJfQoJCX07CgkJVGFza1dpemFyZCB3aXphcmQgPSBuZXcgVGFza1dpemFyZChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXdpek5ld1J1bnRpbWVXaXphcmRUaXRsZSIpLCBmcmFnbWVudCk7CgkJd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKCQlDbG9zYWJsZVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgQ2xvc2FibGVXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7CgkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwoJfQp9