LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlRhc2s7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5JT3JkZXJlZDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlByb2dyZXNzVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyRWRpdG9yQ29yZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuVGFza3NDb21wb3NpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci8qKgogKiAKICovCnB1YmxpYyBjbGFzcyBUYXNrc1dpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewoJcHVibGljIGNsYXNzIFRhc2tJbmZvIGltcGxlbWVudHMgSU9yZGVyZWQgewoJCXB1YmxpYyBpbnQgc3RhdHVzOwoJCXB1YmxpYyBTdHJpbmcgaWQ7CgkJcHVibGljIElPcHRpb25hbFRhc2sgdGFzazI7CgkJCgkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFQgPSAiZGVmYXVsdDoiOwoJCQoJCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7CgkJCXRyeSB7CgkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgc2VsZWN0ZWRUYXNrTWFwLmdldChnZXRJZCgpKTsKCQkJCXJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJLy8gaWdub3JlCgkJCX0KCQkJCgkJCXRyeSB7CgkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgc2VsZWN0ZWRUYXNrTWFwLmdldChERUZBVUxUICsgZ2V0SWQoKSk7CgkJCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCS8vIGlnbm9yZQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJcHVibGljIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGVkKGJvb2xlYW4gc2VsKSB7CgkJCXNlbGVjdGVkVGFza01hcC5wdXQoREVGQVVMVCArIGdldElkKCksIG5ldyBCb29sZWFuKHNlbCkpOwoJCX0KCQkKCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbCkgewoJCQlzZWxlY3RlZFRhc2tNYXAucHV0KGdldElkKCksIG5ldyBCb29sZWFuKHNlbCkpOwoJCX0KCQkKCQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewoJCQlyZXR1cm4gdGFzazIuZ2V0T3JkZXIoKTsKCQl9CgkJCgkJcHJvdGVjdGVkIFN0cmluZyBnZXRJZCgpIHsKCQkJcmV0dXJuIGlkOwoJCX0KCX0KCglwcm90ZWN0ZWQgVGFza3NDb21wb3NpdGUgY29tcDsKCglwcm90ZWN0ZWQgTGlzdCB0YXNrczsKCXByb3RlY3RlZCBib29sZWFuIGhhc09wdGlvbmFsVGFza3M7CgkKCXByb3RlY3RlZCBNYXAgc2VsZWN0ZWRUYXNrTWFwID0gbmV3IEhhc2hNYXAoKTsKCQoJcHVibGljIFRhc2tzV2l6YXJkRnJhZ21lbnQoKSB7CgkJLy8gZG8gbm90aGluZwoJfQoJCglwdWJsaWMgdm9pZCBlbnRlcigpIHsKCQl1cGRhdGVUYXNrcygpOwoJfQoJCglwdWJsaWMgTGlzdCBnZXRDaGlsZEZyYWdtZW50cygpIHsKCQl1cGRhdGVUYXNrcygpOwoJCXJldHVybiBzdXBlci5nZXRDaGlsZEZyYWdtZW50cygpOwoJfQoKCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChJVGFza01vZGVsIHRhc2tNb2RlbCkgewoJCXN1cGVyLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwoJCXVwZGF0ZVRhc2tzKCk7Cgl9CgoJcHVibGljIHZvaWQgdXBkYXRlVGFza3MoKSB7CgkJdGFza3MgPSBudWxsOwoJCWlmIChnZXRUYXNrTW9kZWwoKSA9PSBudWxsKQoJCQlyZXR1cm47CgoJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKCQkKCQlMaXN0W10gcGFyZW50cyA9IChMaXN0W10pIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJVGFza01vZGVsLlRBU0tfTU9EVUxFX1BBUkVOVFMpOwoJCUlNb2R1bGVbXSBtb2R1bGVzID0gKElNb2R1bGVbXSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KElUYXNrTW9kZWwuVEFTS19NT0RVTEVTKTsKCQkKCQlpZiAoc2VydmVyICE9IG51bGwgJiYgKHBhcmVudHMgPT0gbnVsbCB8fCBtb2R1bGVzID09IG51bGwpKSB7CgkJCWNsYXNzIEhlbHBlciB7CgkJCQlMaXN0IHBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgkJCQlMaXN0IG1vZHVsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgkJCX0KCQkJZmluYWwgSGVscGVyIGhlbHAgPSBuZXcgSGVscGVyKCk7CgkJCVNlcnZlclV0aWwudmlzaXQoc2VydmVyLCBuZXcgSU1vZHVsZVZpc2l0b3IoKSB7CgkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gcGFyZW50czIsIElNb2R1bGUgbW9kdWxlMikgewoJCQkJCWhlbHAucGFyZW50TGlzdC5hZGQocGFyZW50czIpOwoJCQkJCWhlbHAubW9kdWxlTGlzdC5hZGQobW9kdWxlMik7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0sIG51bGwpOwoKCQkJaW50IHNpemUgPSBoZWxwLnBhcmVudExpc3Quc2l6ZSgpOwoJCQlwYXJlbnRzID0gbmV3IExpc3Rbc2l6ZV07CgkJCWhlbHAucGFyZW50TGlzdC50b0FycmF5KHBhcmVudHMpOwoJCQltb2R1bGVzID0gbmV3IElNb2R1bGVbc2l6ZV07CgkJCWhlbHAubW9kdWxlTGlzdC50b0FycmF5KG1vZHVsZXMpOwoJCX0KCQkKCQlpZiAoc2VydmVyICE9IG51bGwgJiYgcGFyZW50cyAhPSBudWxsIHx8IG1vZHVsZXMgIT0gbnVsbCkgewoJCQl0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKCQkJY3JlYXRlVGFza3Moc2VydmVyLCBwYXJlbnRzLCBtb2R1bGVzKTsKCQl9CgkJCgkJaWYgKGNvbXAgIT0gbnVsbCkKCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewoJCQkJcHVibGljIHZvaWQgcnVuKCkgewoJCQkJCWNvbXAuc2V0VGFza3ModGFza3MpOwoJCQkJfQoJCQl9KTsKCX0KCQoJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFza3MoSVNlcnZlciBzZXJ2ZXIsIExpc3RbXSBwYXJlbnRzLCBJTW9kdWxlW10gbW9kdWxlcykgewoJCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBudWxsOwoJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKCQkJc2VydmVyVHlwZUlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwoJCQoJCS8vIHNlcnZlciB0YXNrcwoJCUlTZXJ2ZXJUYXNrW10gc2VydmVyVGFza3MgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclRhc2tzKCk7CgkJaWYgKHNlcnZlclRhc2tzICE9IG51bGwpIHsKCQkJaW50IHNpemUgPSBzZXJ2ZXJUYXNrcy5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlJU2VydmVyVGFzayB0YXNrID0gc2VydmVyVGFza3NbaV07CgkJCQlpZiAoc2VydmVyVHlwZUlkICE9IG51bGwgJiYgdGFzay5zdXBwb3J0c1R5cGUoc2VydmVyVHlwZUlkKSkgewoJCQkJCUlPcHRpb25hbFRhc2tbXSB0YXNrczIgPSB0YXNrLmdldFRhc2tzKHNlcnZlciwgcGFyZW50cywgbW9kdWxlcyk7CgkJCQkJaWYgKHRhc2tzMiAhPSBudWxsKSB7CgkJCQkJCWludCBzaXplMiA9IHRhc2tzMi5sZW5ndGg7CgkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewoJCQkJCQkJaW50IHN0YXR1cyA9IHRhc2tzMltqXS5nZXRTdGF0dXMoKTsgCgkJCQkJCQlpZiAoc3RhdHVzICE9IElPcHRpb25hbFRhc2suVEFTS19VTk5FQ0VTU0FSWSkgewoJCQkJCQkJCWlmIChzdGF0dXMgPT0gSU9wdGlvbmFsVGFzay5UQVNLX1JFQURZIHx8IHN0YXR1cyA9PSBJT3B0aW9uYWxUYXNrLlRBU0tfUFJFRkVSUkVEKQoJCQkJCQkJCQloYXNPcHRpb25hbFRhc2tzID0gdHJ1ZTsKCQkJCQkJCQl0YXNrczJbaV0uc2V0VGFza01vZGVsKGdldFRhc2tNb2RlbCgpKTsKCQkJCQkJCQlhZGRTZXJ2ZXJUYXNrKHNlcnZlciwgdGFza3MyW2pdKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJUYXNrKElTZXJ2ZXIgc2VydmVyLCBJT3B0aW9uYWxUYXNrIHRhc2syKSB7CgkJVGFza0luZm8gc3RpID0gbmV3IFRhc2tJbmZvKCk7CgkJc3RpLnRhc2syID0gdGFzazI7CgkJc3RpLnN0YXR1cyA9IHRhc2syLmdldFN0YXR1cygpOwoJCVN0cmluZyBpZCA9IHNlcnZlci5nZXRJZCgpOwoJCXN0aS5pZCA9IGlkICsgInwiICsgdGFzazIuZ2V0TmFtZSgpOwoJCWlmIChzdGkuc3RhdHVzID09IElPcHRpb25hbFRhc2suVEFTS19QUkVGRVJSRUQgfHwgc3RpLnN0YXR1cyA9PSBJT3B0aW9uYWxUYXNrLlRBU0tfTUFOREFUT1JZKQoJCQlzdGkuc2V0RGVmYXVsdFNlbGVjdGVkKHRydWUpOwoJCQoJCXRhc2tzLmFkZChzdGkpOwoJfQoKCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKCQlyZXR1cm4gaGFzVGFza3MoKTsKCX0KCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQoJICovCglwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgewoJCWNvbXAgPSBuZXcgVGFza3NDb21wb3NpdGUocGFyZW50LCB3aXphcmQpOwoJCXJldHVybiBjb21wOwoJfQoKCXB1YmxpYyBJVGFzayBjcmVhdGVGaW5pc2hUYXNrKCkgewoJCXJldHVybiBuZXcgVGFzaygpIHsKCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQkJCXBlcmZvcm1GaW5pc2gobW9uaXRvcik7CgkJCX0KCQl9OwoJfQoJCgkvKioKCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiB0YXNrcyBydW4sIG9yIC0xIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KCSAqCgkgKiBAcGFyYW0gbW9uaXRvcgoJICogQHJldHVybiBpbnQKCSAqLwoJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQlMaXN0IHBlcmZvcm1UYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKCgkJaWYgKHRhc2tzID09IG51bGwpCgkJCXJldHVybjsKCQlpbnQgc2l6ZSA9IHRhc2tzLnNpemUoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQlUYXNrSW5mbyB0aSA9IChUYXNrSW5mbykgdGFza3MuZ2V0KGkpOwoJCQlpZiAodGkuaXNTZWxlY3RlZCgpKQoJCQkJcGVyZm9ybVRhc2tzLmFkZCh0YXNrcy5nZXQoaSkpOwoJCX0KCQkKCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQZXJmb3JtaW5nIHdpemFyZCB0YXNrczogIiArIHBlcmZvcm1UYXNrcy5zaXplKCkpOwoJCQoJCWlmIChwZXJmb3JtVGFza3Muc2l6ZSgpID09IDApCgkJCXJldHVybjsKCQkKCQkvLyBnZXQgbW9zdCByZWNlbnQgc2VydmVyL2NvbmZpZ3VyYXRpb24KCQlib29sZWFuIGNyZWF0ZWRTZXJ2ZXJXQyA9IGZhbHNlOwoJCUlUYXNrTW9kZWwgdGFza01vZGVsID0gZ2V0VGFza01vZGVsKCk7CgkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgdGFza01vZGVsLmdldE9iamVjdChJVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKCQlpZiAoc2VydmVyID09IG51bGwpCgkJCXJldHVybjsKCgkJLy8gZ2V0IHdvcmtpbmcgY29waWVzCgkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldDID0gbnVsbDsKCQlpZiAoc2VydmVyIGluc3RhbmNlb2YgSVNlcnZlcldvcmtpbmdDb3B5KQoJCQlzZXJ2ZXJXQyA9IChJU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKCQllbHNlIHsKCQkJc2VydmVyV0MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKCQkJY3JlYXRlZFNlcnZlcldDID0gdHJ1ZTsKCQl9CgkJCgkJdGFza01vZGVsLnB1dE9iamVjdChJVGFza01vZGVsLlRBU0tfU0VSVkVSLCBzZXJ2ZXJXQyk7CgkJCgkJLy8gYmVnaW4gdGFzawoJCW1vbml0b3IuYmVnaW5UYXNrKFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlcGVyZm9ybWluZ1Rhc2tzIiksIHBlcmZvcm1UYXNrcy5zaXplKCkgKiAxMDAwKTsKCQkKCQlTZXJ2ZXJFZGl0b3JDb3JlLnNvcnRPcmRlcmVkTGlzdChwZXJmb3JtVGFza3MpOwoKCQlJdGVyYXRvciBpdGVyYXRvciA9IHBlcmZvcm1UYXNrcy5pdGVyYXRvcigpOwoJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCk7CgkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7CgkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrc1dpemFyZEZyYWdtZW50LlRhc2tJbmZvKSB7CgkJCQlUYXNrc1dpemFyZEZyYWdtZW50LlRhc2tJbmZvIHN0aSA9IChUYXNrc1dpemFyZEZyYWdtZW50LlRhc2tJbmZvKSBvYmo7CgkJCQl0cnkgewoJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiRXhlY3V0aW5nIHRhc2s6ICIgKyBzdGkudGFzazIuZ2V0TmFtZSgpKTsKCQkJCQlzdGkudGFzazIuc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7CgkJCQkJc3RpLnRhc2syLmV4ZWN1dGUoc3ViTW9uaXRvcik7CgkJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGNlKSB7CgkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZXhlY3V0aW5nIHRhc2sgIiArIHN0aS50YXNrMi5nZXROYW1lKCksIGNlKTsKCQkJCQl0aHJvdyBjZTsKCQkJCX0KCQkJfQoJCQlzdWJNb25pdG9yLmRvbmUoKTsKCQl9CgkJCgkJaWYgKGNyZWF0ZWRTZXJ2ZXJXQykgewoJCQlpZiAoc2VydmVyV0MuaXNEaXJ0eSgpKSB7CgkJCQlJRmlsZSBmaWxlID0gc2VydmVyV0MuZ2V0RmlsZSgpOwoJCQkJaWYgKGZpbGUgIT0gbnVsbCkgewoJCQkJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKCQkJCQkKCQkJCQlpZiAoIWZpbGUuZ2V0UHJvamVjdCgpLmV4aXN0cygpKQoJCQkJCQlFY2xpcHNlVXRpbC5jcmVhdGVOZXdTZXJ2ZXJQcm9qZWN0KG51bGwsIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsLCBtb25pdG9yKTsKCQkJCQkKCQkJCQlJUHJvamVjdFByb3BlcnRpZXMgcHAgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpOwoJCQkJCWlmICghcHAuaXNTZXJ2ZXJQcm9qZWN0KCkpCgkJCQkJCXBwLnNldFNlcnZlclByb2plY3QodHJ1ZSwgbW9uaXRvcik7CgkJCQl9CgkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KElUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlcldDLnNhdmUoZmFsc2UsIG1vbml0b3IpKTsKCQkJfSBlbHNlCgkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KElUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlcldDLmdldE9yaWdpbmFsKCkpOwoJCX0KCQkJCQoJCW1vbml0b3IuZG9uZSgpOwoJfQoKCS8qKgoJICogCgkgKi8KCXB1YmxpYyBib29sZWFuIGhhc1Rhc2tzKCkgewoJCXJldHVybiB0YXNrcyA9PSBudWxsIHx8ICF0YXNrcy5pc0VtcHR5KCk7Cgl9CgkKCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsVGFza3MoKSB7CgkJcmV0dXJuIGhhc09wdGlvbmFsVGFza3M7Cgl9Cn0=