cGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnB1Ymxpc2g7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJlc291cmNlcy5JTW9kdWxlRm9sZGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJlc291cmNlcy5JTW9kdWxlUmVzb3VyY2U7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucmVzb3VyY2VzLklSZW1vdGVSZXNvdXJjZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKCi8qKgogKiBMYWJlbCBwcm92aWRlciBmb3IgdGhlIHB1Ymxpc2hlciB3aXphcmQgdHJlZS4KICovCnB1YmxpYyBjbGFzcyBQdWJsaXNoVHJlZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKCXByb3RlY3RlZCBWaXN1YWxQdWJsaXNoZXIgdmlzdWFsUHVibGlzaGVyOwoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKCglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0YXR1c1N0cmluZ3MgPSBuZXcgU3RyaW5nW10gewoJCVNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIld2l6UHVibGlzaFN0YXRlTmV3IiksCgkJU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpQdWJsaXNoU3RhdGVVbm1vZGlmaWVkIiksCgkJU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpQdWJsaXNoU3RhdGVNb2RpZmllZExvY2FsIiksCgkJU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpQdWJsaXNoU3RhdGVNb2RpZmllZFJlbW90ZSIpLAoJCVNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIld2l6UHVibGlzaFN0YXRlTW9kaWZpZWRCb3RoIil9OwoKCS8qKgoJICogUHVibGlzaFRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBQdWJsaXNoVHJlZUxhYmVsUHJvdmlkZXIoVmlzdWFsUHVibGlzaGVyIHZpc3VhbFB1Ymxpc2hlcikgewoJCXN1cGVyKCk7CgkJdGhpcy52aXN1YWxQdWJsaXNoZXIgPSB2aXN1YWxQdWJsaXNoZXI7Cgl9CgoJLyoqCgkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4gCgkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCgkgKiA8cD4KCSAqIExhYmVsIHByb3ZpZGVyIGxpc3RlbmVycyBhcmUgaW5mb3JtZWQgYWJvdXQgc3RhdGUgY2hhbmdlcyAKCSAqIHRoYXQgYWZmZWN0IHRoZSByZW5kZXJpbmcgb2YgdGhlIHZpZXdlciB0aGF0IHVzZXMgdGhpcyBsYWJlbCBwcm92aWRlci4KCSAqIDwvcD4KCSAqCgkgKiBAcGFyYW0gbGlzdGVuZXIgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgoJICovCglwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7fQoKCS8qKgoJICogRGlzcG9zZXMgb2YgdGhpcyBsYWJlbCBwcm92aWRlci4gIFdoZW4gYSBsYWJlbCBwcm92aWRlciBpcwoJICogYXR0YWNoZWQgdG8gYSB2aWV3ZXIsIHRoZSB2aWV3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwKCSAqIHRoaXMgbWV0aG9kIHdoZW4gdGhlIHZpZXdlciBpcyBiZWluZyBjbG9zZWQuICBXaGVuIGxhYmVsIHByb3ZpZGVycwoJICogYXJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiBhIHZpZXdlciwgaXQgaXMgdGhlIGNsaWVudCdzCgkgKiByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKCSAqIHByb3ZpZGVyIGlzIG5vIGxvbmdlciBuZWVkZWQuCgkgKi8KCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7IH0KCgkvKioKCSAqIFJldHVybnMgdGhlIGxhYmVsIGltYWdlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIG9mIHRoZSBnaXZlbiBlbGVtZW50LgoJICoKCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgcm93LCBvciAKCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdCBubyBpbnB1dCBvYmplY3QgaXMgc2V0CgkgKiAgICBpbiB0aGUgdmlld2VyCgkgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiB3aGljaAoJICogICB0aGUgbGFiZWwgYXBwZWFycwoJICovCglwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewoJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZSkgewoJCQlpZiAoY29sdW1uSW5kZXggPT0gMCkKCQkJCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwoJCQllbHNlCgkJCQlyZXR1cm4gbnVsbDsKCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlUmVzb3VyY2UpIHsKCQkJSU1vZHVsZVJlc291cmNlIHJlc291cmNlID0gKElNb2R1bGVSZXNvdXJjZSkgZWxlbWVudDsKCQkJSVBhdGggcGF0aCA9IHZpc3VhbFB1Ymxpc2hlci5nZXRQdWJsaXNoQ29udHJvbChyZXNvdXJjZS5nZXRNb2R1bGUoKSkuZ2V0TWFwcGVkTG9jYXRpb24ocmVzb3VyY2UpOwoJCQlpZiAoY29sdW1uSW5kZXggPT0gMykgewoJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewoJCQkJCWJ5dGUgc3RhdHVzID0gdmlzdWFsUHVibGlzaGVyLmdldFJlc291cmNlU3RhdHVzKHJlc291cmNlLCBwYXRoKTsKCQkJCQlpZiAoc3RhdHVzICE9IFZpc3VhbFB1Ymxpc2hlci5TVEFUVVNfTkVXKQoJCQkJCQlyZXR1cm4gbnVsbDsKCQkJCX0KCQkJCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC50b1N0cmluZygpID09IG51bGwpCgkJCQkJcmV0dXJuIG51bGw7CgkJCQllbHNlIHsKCQkJCQlpZiAodmlzdWFsUHVibGlzaGVyLmdldFJlc291cmNlc1RvUHVibGlzaChyZXNvdXJjZS5nZXRNb2R1bGUoKSkuY29udGFpbnMocmVzb3VyY2UpKQoJCQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19QVUJMSVNIX0VOQUJMRUQpOwoJCQkJCWVsc2UKCQkJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfUFVCTElTSF9ESVNBQkxFRCk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVSZW1vdGVSZXNvdXJjZSkgewoJCQlNb2R1bGVSZW1vdGVSZXNvdXJjZSBwcnIgPSAoTW9kdWxlUmVtb3RlUmVzb3VyY2UpIGVsZW1lbnQ7CgkJCUlSZW1vdGVSZXNvdXJjZSByZW1vdGUgPSBwcnIuZ2V0UmVtb3RlKCk7CgkJCUlQYXRoIHBhdGggPSByZW1vdGUuZ2V0UGF0aCgpOwoJCQlpZiAoY29sdW1uSW5kZXggPT0gMykgewoJCQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLnRvU3RyaW5nKCkgPT0gbnVsbCkKCQkJCQlyZXR1cm4gbnVsbDsKCQkJCWVsc2UgewoJCQkJCUlNb2R1bGUgbW9kdWxlID0gcHJyLmdldE1vZHVsZSgpOwoJCQkJCWlmICh2aXN1YWxQdWJsaXNoZXIuZ2V0UmVzb3VyY2VzVG9EZWxldGUobW9kdWxlKS5jb250YWlucyhyZW1vdGUpKQoJCQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19QVUJMSVNIX0VOQUJMRUQpOwoJCQkJCWVsc2UKCQkJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfUFVCTElTSF9ESVNBQkxFRCk7CgkJCQl9CgkJCX0KCQl9CgkKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBnaXZlbiBjb2x1bW4gb2YgdGhlIGdpdmVuIGVsZW1lbnQuCgkgKgoJICogQHBhcmFtIGVsZW1lbnQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSByb3csIG9yCgkgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdCBubyBpbnB1dCBvYmplY3QgaXMgc2V0CgkgKiAgIGluIHRoZSB2aWV3ZXIKCSAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgY29sdW1uIGluIHdoaWNoIHRoZSBsYWJlbCBhcHBlYXJzCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CgkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7CgkJCWlmIChjb2x1bW5JbmRleCA9PSAwKQoJCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKCQkJZWxzZQoJCQkJcmV0dXJuICIiOwoJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGVSZXNvdXJjZSkgewoJCQlJTW9kdWxlUmVzb3VyY2UgcmVzb3VyY2UgPSAoSU1vZHVsZVJlc291cmNlKSBlbGVtZW50OwoJCQlJUGF0aCBwYXRoID0gdmlzdWFsUHVibGlzaGVyLmdldFB1Ymxpc2hDb250cm9sKHJlc291cmNlLmdldE1vZHVsZSgpKS5nZXRNYXBwZWRMb2NhdGlvbihyZXNvdXJjZSk7CgkJCWJ5dGUgc3RhdHVzID0gdmlzdWFsUHVibGlzaGVyLmdldFJlc291cmNlU3RhdHVzKHJlc291cmNlLCBwYXRoKTsKCQkJaWYgKGNvbHVtbkluZGV4ID09IDApCgkJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0TmFtZSgpOwoJCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7CgkJCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgudG9TdHJpbmcoKSA9PSBudWxsKQoJCQkJCXJldHVybiAiIjsKCQkJCWVsc2UKCQkJCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwoJCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKCQkJCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC50b1N0cmluZygpID09IG51bGwpCgkJCQkJcmV0dXJuICIiOwoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHN0YXR1c1N0cmluZ3Nbc3RhdHVzXTsKCQkJCX0KCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAzKSB7CgkJCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgudG9TdHJpbmcoKSA9PSBudWxsKQoJCQkJCXJldHVybiAiIjsKCQkJCWVsc2UgewoJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIgJiYgc3RhdHVzICE9IFZpc3VhbFB1Ymxpc2hlci5TVEFUVVNfTkVXKQoJCQkJCQlyZXR1cm4gIiI7CgkJCQkJZWxzZQoJCQkJCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpQdWJsaXNoQWN0aW9uUHVibGlzaCIpOwoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlUmVtb3RlUmVzb3VyY2UpIHsKCQkJaWYgKGNvbHVtbkluZGV4ID09IDApCgkJCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpQdWJsaXNoRGVsZXRlZFJlc291cmNlIik7CgkJCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKCQkJCU1vZHVsZVJlbW90ZVJlc291cmNlIHByciA9IChNb2R1bGVSZW1vdGVSZXNvdXJjZSkgZWxlbWVudDsKCQkJCUlQYXRoIHBhdGggPSBwcnIuZ2V0UmVtb3RlKCkuZ2V0UGF0aCgpOwoJCQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLnRvU3RyaW5nKCkgPT0gbnVsbCkKCQkJCQlyZXR1cm4gIiI7CgkJCQllbHNlCgkJCQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7CgkJCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpQdWJsaXNoU3RhdGVEZWxldGVkIik7CgkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMykKCQkJCXJldHVybiBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXdpelB1Ymxpc2hBY3Rpb25EZWxldGUiKTsKCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVEZWxldGVkUmVzb3VyY2VGb2xkZXIpIHsKCQkJaWYgKGNvbHVtbkluZGV4ID09IDApCgkJCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpQdWJsaXNoRGVsZXRlZEZvbGRlciIpOwoJCQllbHNlCgkJCQlyZXR1cm4gIiI7CgkJfQoJCXJldHVybiAiIjsKCX0KCgkvKioKCSAqIFJldHVybnMgd2hldGhlciB0aGUgbGFiZWwgd291bGQgYmUgYWZmZWN0ZWQgCgkgKiBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCgkgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGEgbm9uLXN0cnVjdHVyYWwgdmlld2VyIHVwZGF0ZS4KCSAqIElmIHRoZSBwcm9wZXJ0eSBtZW50aW9uZWQgaW4gdGhlIHVwZGF0ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGxhYmVsLAoJICogdGhlbiB0aGUgdmlld2VyIG5lZWQgbm90IHVwZGF0ZSB0aGUgbGFiZWwuCgkgKgoJICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkLAoJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCB3b3VsZCBiZSB1bmFmZmVjdGVkCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CgkJcmV0dXJuICJhY3Rpb24iLmVxdWFscyhwcm9wZXJ0eSk7Cgl9CgoJLyoqCgkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4KCSAqIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgoJICoKCSAqIEBwYXJhbSBsaXN0ZW5lciBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCgkgKi8KCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsgfQp9Cg==