LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci8qKgogKiBJU3RhdHVzIHVzZWQgYXMgY2hpbGQgb2YgYSBQdWJsaXNoU3RhdHVzLiBJdCBpcyBqdXN0IGEKICogd3JhcHBlciBhcm91bmQgYW5vdGhlciBJU3RhdHVzLCB1c2VkIHRvIGdpdmUgaW5mb3JtYXRpb24KICogYWJvdXQgdGhlIGNvbnRhaW5lZCBJU3RhdHVzLgogKi8KcHVibGljIGNsYXNzIFB1Ymxpc2hTdGF0dXNJdGVtIGltcGxlbWVudHMgSVN0YXR1cyB7CgkvLyBVbmlxdWUgaWRlbnRpZmllciBvZiBwbHVnLWluLgoJcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7CgoJLy8gTWVzc2FnZSwgbG9jYWxpemVkIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CgoJcHJpdmF0ZSBJU3RhdHVzIGNoaWxkOwoKCS8qKgoJICogUHVibGlzaFN0YXR1cyBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgUHVibGlzaFN0YXR1c0l0ZW0oU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBjaGlsZCkgewoJCXN1cGVyKCk7CgkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwoJCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CgkJdGhpcy5jaGlsZCA9IGNoaWxkOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RhdHVzIG9iamVjdCBpbW1lZGlhdGVseSBjb250YWluZWQgaW4gdGhpcwoJICogbXVsdGktc3RhdHVzLCBvciBhbiBlbXB0eSBsaXN0IGlmIHRoaXMgaXMgbm90IGEgbXVsdGktc3RhdHVzLgoJICoKCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RhdHVzIG9iamVjdHMKCSAqIEBzZWUgI2lzTXVsdGlTdGF0dXMKCSAqLwoJcHVibGljIElTdGF0dXNbXSBnZXRDaGlsZHJlbigpIHsKCQlpZiAoY2hpbGQgPT0gbnVsbCkKCQkJcmV0dXJuIG5ldyBJU3RhdHVzWzBdOwoJCXJldHVybiBuZXcgSVN0YXR1c1tdIHsgY2hpbGQgfTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHBsdWctaW4tc3BlY2lmaWMgc3RhdHVzIGNvZGUgZGVzY3JpYmluZyB0aGUgb3V0Y29tZS4KCSAqCgkgKiBAcmV0dXJuIHBsdWctaW4tc3BlY2lmaWMgc3RhdHVzIGNvZGUKCSAqLwoJcHVibGljIGludCBnZXRDb2RlKCkgewoJCXJldHVybiAwOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcmVsZXZhbnQgbG93LWxldmVsIGV4Y2VwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gCgkgKiBGb3IgZXhhbXBsZSwgd2hlbiBhbiBvcGVyYXRpb24gZmFpbHMgYmVjYXVzZSBvZiBhIG5ldHdvcmsgY29tbXVuaWNhdGlvbnMKCSAqIGZhaWx1cmUsIHRoaXMgbWlnaHQgcmV0dXJuIHRoZSA8Y29kZT5qYXZhLmlvLklPRXhjZXB0aW9uPC9jb2RlPgoJICogZGVzY3JpYmluZyB0aGUgZXhhY3QgbmF0dXJlIG9mIHRoYXQgZmFpbHVyZS4KCSAqCgkgKiBAcmV0dXJuIHRoZSByZWxldmFudCBsb3ctbGV2ZWwgZXhjZXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCgkgKi8KCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBvdXRjb21lLgoJICogVGhlIG1lc3NhZ2UgaXMgbG9jYWxpemVkIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KCSAqCgkgKiBAcmV0dXJuIGEgbG9jYWxpemVkIG1lc3NhZ2UKCSAqLwoJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewoJCXJldHVybiBtZXNzYWdlOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RhdHVzCgkgKiAodGhpcyBpcyB0aGUgcGx1Zy1pbiB0aGF0IGRlZmluZXMgdGhlIG1lYW5pbmcgb2YgdGhlIHN0YXR1cyBjb2RlKS4KCSAqCgkgKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVsZXZhbnQgcGx1Zy1pbgoJICovCglwdWJsaWMgU3RyaW5nIGdldFBsdWdpbigpIHsKCQlyZXR1cm4gcGx1Z2luSWQ7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBzZXZlcml0eS4gVGhlIHNldmVyaXRpZXMgYXJlIGFzIGZvbGxvd3MgKGluCgkgKiBkZXNjZW5kaW5nIG9yZGVyKToKCSAqIDx1bD4KCSAqIDxsaT48Y29kZT5FUlJPUjwvY29kZT4gLSBhIHNlcmlvdXMgZXJyb3IgKG1vc3Qgc2V2ZXJlKTwvbGk+CgkgKiA8bGk+PGNvZGU+V0FSTklORzwvY29kZT4gLSBhIHdhcm5pbmcgKGxlc3Mgc2V2ZXJlKTwvbGk+CgkgKiA8bGk+PGNvZGU+SU5GTzwvY29kZT4gLSBhbiBpbmZvcm1hdGlvbmFsICgiZnlpIikgbWVzc2FnZSAobGVhc3Qgc2V2ZXJlKTwvbGk+CgkgKiA8bGk+PGNvZGU+T0s8L2NvZGU+IC0gZXZlcnl0aGluZyBpcyBqdXN0IGZpbmU8L2xpPgoJICogPC91bD4KCSAqIDxwPgoJICogVGhlIHNldmVyaXR5IG9mIGEgbXVsdGktc3RhdHVzIGlzIGRlZmluZWQgdG8gYmUgdGhlIG1heGltdW0KCSAqIHNldmVyaXR5IG9mIGFueSBvZiBpdHMgY2hpbGRyZW4sIG9yIDxjb2RlPk9LPC9jb2RlPiBpZiBpdCBoYXMKCSAqIG5vIGNoaWxkcmVuLgoJICogPC9wPgoJICoKCSAqIEByZXR1cm4gdGhlIHNldmVyaXR5OiBvbmUgb2YgPGNvZGU+T0s8L2NvZGU+LAoJICogICA8Y29kZT5FUlJPUjwvY29kZT4sIDxjb2RlPklORk88L2NvZGU+LCBvciA8Y29kZT5XQVJOSU5HPC9jb2RlPgoJICogQHNlZSAjbWF0Y2hlcwoJICovCglwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewoJCWlmIChjaGlsZCA9PSBudWxsKQoJCQlyZXR1cm4gSVN0YXR1cy5PSzsKCQlyZXR1cm4gY2hpbGQuZ2V0U2V2ZXJpdHkoKTsKCX0KCgkvKioKCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHN0YXR1cyBpcyBhIG11bHRpLXN0YXR1cy4KCSAqIEEgbXVsdGktc3RhdHVzIGRlc2NyaWJlcyB0aGUgb3V0Y29tZSBvZiBhbiBvcGVyYXRpb24KCSAqIGludm9sdmluZyBtdWx0aXBsZSBvcGVyYW5kcy4KCSAqIDxwPgoJICogVGhlIHNldmVyaXR5IG9mIGEgbXVsdGktc3RhdHVzIGlzIGRlcml2ZWQgZnJvbSB0aGUgc2V2ZXJpdGllcwoJICogb2YgaXRzIGNoaWxkcmVuOyBhIG11bHRpLXN0YXR1cyB3aXRoIG5vIGNoaWxkcmVuIGlzCgkgKiA8Y29kZT5PSzwvY29kZT4gYnkgZGVmaW5pdGlvbi4KCSAqIEEgbXVsdGktc3RhdHVzIGNhcnJpZXMgYSBwbHVnLWluIGlkZW50aWZpZXIsIGEgc3RhdHVzIGNvZGUsCgkgKiBhIG1lc3NhZ2UsIGFuZCBhbiBvcHRpb25hbCBleGNlcHRpb24uIENsaWVudHMgbWF5IHRyZWF0CgkgKiBtdWx0aS1zdGF0dXMgb2JqZWN0cyBpbiBhIG11bHRpLXN0YXR1cyB1bmF3YXJlIHdheS4KCSAqIDwvcD4KCSAqCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhIG11bHRpLXN0YXR1cywgCgkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCgkgKiBAc2VlICNnZXRDaGlsZHJlbgoJICovCglwdWJsaWMgYm9vbGVhbiBpc011bHRpU3RhdHVzKCkgewoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc3RhdHVzIGluZGljYXRlcyBldmVyeXRoaW5nIGlzIG9rYXkKCSAqIChuZWl0aGVyIGluZm8sIHdhcm5pbmcsIG5vciBlcnJvcikuCgkgKgoJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHN0YXR1cyBoYXMgc2V2ZXJpdHkKCSAqICAgIDxjb2RlPk9LPC9jb2RlPiwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKCSAqLwoJcHVibGljIGJvb2xlYW4gaXNPSygpIHsKCQlyZXR1cm4gKGdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNldmVyaXR5IG9mIHRoaXMgc3RhdHVzIG1hdGNoZXMgdGhlIGdpdmVuCgkgKiBzcGVjaWZpY2F0aW9uLgoJICoKCSAqIEBwYXJhbSBzZXZlcml0eU1hc2sgYSBtYXNrIGZvcm1lZCBieSBiaXR3aXNlIG9yJ2luZyBzZXZlcml0eSBtYXNrCgkgKiAgICBjb25zdGFudHMgKDxjb2RlPkVSUk9SPC9jb2RlPiwgPGNvZGU+V0FSTklORzwvY29kZT4sCgkgKiAgICA8Y29kZT5JTkZPPC9jb2RlPikKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG1hdGNoLCAKCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hlcwoJICogQHNlZSAjZ2V0U2V2ZXJpdHkKCSAqIEBzZWUgI0VSUk9SCgkgKiBAc2VlICNXQVJOSU5HCgkgKiBAc2VlICNJTkZPCgkgKi8KCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoaW50IHNldmVyaXR5TWFzaykgewoJCXJldHVybiAoZ2V0U2V2ZXJpdHkoKSAmIHNldmVyaXR5TWFzaykgIT0gMDsKCX0KfQ==