LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VMaXN0ZW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLyoqCiAqIEEgSm9iIHRoYXQgY2FuIHN0YXJ0IGFub3RoZXIgam9iIHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgogKi8KcHVibGljIGFic3RyYWN0IGNsYXNzIENoYWluZWRKb2IgZXh0ZW5kcyBKb2IgewoJcHJpdmF0ZSBJU2VydmVyIHNlcnZlcjsKCXByaXZhdGUgSm9iIG5leHRKb2I7Cglwcml2YXRlIElKb2JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBkZXBlbmRhbnQgam9iLgoJICogCgkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgam9iCgkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcHVibGlzaCB0bwoJICovCglwdWJsaWMgQ2hhaW5lZEpvYihTdHJpbmcgbmFtZSwgSVNlcnZlciBzZXJ2ZXIpIHsKCQlzdXBlcihuYW1lKTsKCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKCX0KCgkvKioKCSAqIEBzZWUgSm9iI2JlbG9uZ3NUbyhqYXZhLmxhbmcuT2JqZWN0KQoJICovCglwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewoJCXJldHVybiBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELmVxdWFscyhmYW1pbHkpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc2VydmVyIHRoYXQgdGhpcyBqb2Igd2FzIGNyZWF0ZWQgd2l0aC4KCSAqIAoJICogQHJldHVybiBhIHNlcnZlcgoJICovCglwdWJsaWMgSVNlcnZlciBnZXRTZXJ2ZXIoKSB7CgkJcmV0dXJuIHNlcnZlcjsKCX0KCgkvKioKCSAqIENyZWF0ZSBhIGxpc3RlbmVyIGZvciB3aGVuIHRoaXMgam9iIGZpbmlzaGVzLgoJICovCglwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaXN0ZW5lcigpIHsKCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKCQkJcmV0dXJuOwoJCQoJCWxpc3RlbmVyID0gbmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7CgkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7CgkJCQlqb2JEb25lKGV2ZW50LmdldFJlc3VsdCgpKTsKCQkJfQoJCX07CgkJCgkJYWRkSm9iQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwoJfQoKCS8qKgoJICogQ2FsbGVkIHdoZW4gdGhpcyBqb2IgaXMgY29tcGxldGUuCgkgKiAKCSAqIEBwYXJhbSBzdGF0dXMgdGhlIHJlc3VsdCBvZiB0aGUgY3VycmVudCBqb2IKCSAqLwoJcHJvdGVjdGVkIHZvaWQgam9iRG9uZShJU3RhdHVzIHN0YXR1cykgewoJCWlmIChsaXN0ZW5lciA9PSBudWxsKQoJCQlyZXR1cm47CgkJCgkJcmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwoJCWxpc3RlbmVyID0gbnVsbDsKCQkKCQlpZiAobmV4dEpvYiAhPSBudWxsICYmIHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IKCQkJCSYmIHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuQ0FOQ0VMKQoJCQluZXh0Sm9iLnNjaGVkdWxlKCk7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIG5leHQgam9iLCB3aGljaCBzaG91bGQgYmUgc2NoZWR1bGVkIGlmIGFuZCBvbmx5IGlmIHRoaXMgam9iIGNvbXBsZXRlcwoJICogc3VjY2Vzc2Z1bGx5LiBUaGUgbmV4dCBqb2Igd2lsbCBiZSBydW4gYXMgbG9uZyBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgam9iIGlzCgkgKiBub3QgYW4gRVJST1Igb3IgQ0FOQ0VMIHN0YXR1cy4KCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCB0aHJlYWQtc2FmZS4gSG93ZXZlciwgdGhlIG5leHQgam9iIGNhbiBiZSBjaGFuZ2VkIGFueXRpbWUKCSAqIHVwIHVudGlsIHRoZSBjdXJyZW50IGpvYiBjb21wbGV0ZXMuCgkgKiAKCSAqIEBwYXJhbSBqb2IgdGhlIG5leHQgam9iIHRoYXQgc2hvdWxkIGJlIHNjaGVkdWxlZAoJICovCglwdWJsaWMgdm9pZCBzZXROZXh0Sm9iKEpvYiBqb2IpIHsKCQluZXh0Sm9iID0gam9iOwoJCWNyZWF0ZUxpc3RlbmVyKCk7Cgl9Cn0=