cGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkNvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycC4gCkFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwphcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAqgCkNvbnRyaWJ1dG9yczoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CmltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5QYXJ0RXZlbnRBY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7CgovKioKICoJQ2xvc2VzIGFsbCBhY3RpdmUgZWRpdG9ycwogKi8KcHVibGljIGNsYXNzIENsb3NlQWxsU2F2ZWRBY3Rpb24gZXh0ZW5kcyBQYXJ0RXZlbnRBY3Rpb24gaW1wbGVtZW50cyBJUGFnZUxpc3RlbmVyLCBJUHJvcGVydHlMaXN0ZW5lcnsKCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2g7CQovKioKICoJQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKICovCnB1YmxpYyBDbG9zZUFsbFNhdmVkQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgYVdvcmtiZW5jaCkgewoJc3VwZXIoV29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDbG9zZUFsbFNhdmVkQWN0aW9uLnRleHQiKSk7IC8vJE5PTi1OTFMtMSQKCXRoaXMud29ya2JlbmNoID0gYVdvcmtiZW5jaDsKCXNldFRvb2xUaXBUZXh0KFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiQ2xvc2VBbGxTYXZlZEFjdGlvbi50b29sVGlwIikpOyAvLyROT04tTkxTLTEkCgkvL1Nob3VsZCBjcmVhdGUgYSBJRCBpbiBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzIHdoZW4gaXQgYmVjYW1lcyBBUEk/CglzZXRJZCgiY2xvc2VBbGxTYXZlZCIpOwoJdXBkYXRlU3RhdGUoKTsKCWFXb3JrYmVuY2guYWRkUGFnZUxpc3RlbmVyKHRoaXMpOwoJV29ya2JlbmNoSGVscC5zZXRIZWxwKHRoaXMsIElIZWxwQ29udGV4dElkcy5DTE9TRV9BTExfU0FWRURfQUNUSU9OKTsKCXNldEFjY2VsZXJhdG9yKFNXVC5DVFJMIHwgU1dULlNISUZUIHwgJ1cnKTsKfQovKioKICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBnaXZlbiBwYWdlIGhhcyBiZWVuIGFjdGl2YXRlZC4KICoKICogQHBhcmFtIHBhZ2UgdGhlIHBhZ2UgdGhhdCB3YXMgYWN0aXZhdGVkCiAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvdyNzZXRBY3RpdmVQYWdlCiAqLwpwdWJsaWMgdm9pZCBwYWdlQWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKCXVwZGF0ZVN0YXRlKCk7Cn0KLyoqCiAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgZ2l2ZW4gcGFnZSBoYXMgYmVlbiBjbG9zZWQuCiAqCiAqIEBwYXJhbSBwYWdlIHRoZSBwYWdlIHRoYXQgd2FzIGNsb3NlZAogKiBAc2VlIElXb3JrYmVuY2hQYWdlI2Nsb3NlCiAqLwpwdWJsaWMgdm9pZCBwYWdlQ2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKCXVwZGF0ZVN0YXRlKCk7Cn0KLyoqCiAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgZ2l2ZW4gcGFnZSBoYXMgYmVlbiBvcGVuZWQuCiAqCiAqIEBwYXJhbSBwYWdlIHRoZSBwYWdlIHRoYXQgd2FzIG9wZW5lZAogKiBAc2VlIElXb3JrYmVuY2hXaW5kb3cjb3BlblBhZ2UKICovCnB1YmxpYyB2b2lkIHBhZ2VPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2UgcGFnZSkge30KLyoqCiAqIEEgcGFydCBoYXMgYmVlbiBjbG9zZWQuCiAqLwpwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKCWlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKCQlwYXJ0LnJlbW92ZVByb3BlcnR5TGlzdGVuZXIodGhpcyk7CgkJdXBkYXRlU3RhdGUoKTsJCgl9Cn0KLyoqCiAqIEEgcGFydCBoYXMgYmVlbiBvcGVuZWQuCiAqLwpwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsJCglpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7CgkJcGFydC5hZGRQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwoJCXVwZGF0ZVN0YXRlKCk7CQoJfQp9Ci8qKgogKiBJbmRpY2F0ZXMgdGhhdCBhIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgogKgogKiBAcGFyYW0gc291cmNlIHRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaGFzIGNoYW5nZWQKICogQHBhcmFtIHByb3BJRCB0aGUgcHJvcGVydHkgd2hpY2ggaGFzIGNoYW5nZWQuICBJbiBtb3N0IGNhc2VzIHRoaXMgcHJvcGVydHkgSUQKICogc2hvdWxkIGJlIGRlZmluZWQgYXMgYSBjb25zdGFudCBvbiB0aGUgc291cmNlIGNsYXNzLgogKi8KcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSUQpIHsKCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewoJCWlmIChwcm9wSUQgPT0gSUVkaXRvclBhcnQuUFJPUF9ESVJUWSkgewoJCQl1cGRhdGVTdGF0ZSgpOwoJCX0KCX0KfQovKioKICoJVGhlIHVzZXIgaGFzIGludm9rZWQgdGhpcyBhY3Rpb24KICovCnB1YmxpYyB2b2lkIHJ1bigpIHsKCVdvcmtiZW5jaFBhZ2UgcGFnZSA9IChXb3JrYmVuY2hQYWdlKXdvcmtiZW5jaC5nZXRBY3RpdmVQYWdlKCk7CglpZiAocGFnZSAhPSBudWxsKQoJCXBhZ2UuY2xvc2VBbGxTYXZlZEVkaXRvcnMoKTsKfQovKioKICogRW5hYmxlIHRoZSBhY3Rpb24gaWYgdGhlcmUgYXQgbGVhc3Qgb25lIGVkaXRvciBvcGVuLgogKi8KcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXRlKCkgewoJV29ya2JlbmNoUGFnZSBwYWdlID0gKFdvcmtiZW5jaFBhZ2Upd29ya2JlbmNoLmdldEFjdGl2ZVBhZ2UoKTsKCWlmKHBhZ2UgPT0gbnVsbCkgewoJCXNldEVuYWJsZWQoZmFsc2UpOwoJCXJldHVybjsKCX0KCUlFZGl0b3JSZWZlcmVuY2UgZWRpdG9yc1tdID0gcGFnZS5nZXRTb3J0ZWRFZGl0b3JzKCk7Cglmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvcnMubGVuZ3RoOyBpKyspIHsKCQlpZighZWRpdG9yc1tpXS5pc0RpcnR5KCkpIHsKCQkJc2V0RW5hYmxlZCh0cnVlKTsKCQkJcmV0dXJuOwoJCX0KCX0KCXNldEVuYWJsZWQoZmFsc2UpOwp9Cn0K