LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLyoqCiAqIEEgc2VydmVyIGRlbGVnYXRlIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdmFyaW91cyAKICogZ2VuZXJpYyBhbmQgc2VydmVyLXR5cGUtc3BlY2lmaWMgb3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHNlcnZlci4KICogQSBzZXJ2ZXIgZGVsZWdhdGUgaXMgc3BlY2lmaWVkIGJ5IHRoZQogKiA8Y29kZT5jbGFzczwvY29kZT4gYXR0cmlidXRlIG9mIGEgPGNvZGU+c2VydmVyVHlwZXM8L2NvZGU+IGV4dGVuc2lvbi4KICogPHA+CiAqIFdoZW4gdGhlIHNlcnZlciBpbnN0YW5jZSBuZWVkcyB0byBiZSBnaXZlbiBhIGRlbGVnYXRlLCB0aGUgZGVsZWdhdGUgY2xhc3MKICogc3BlY2lmaWVkIGZvciB0aGUgc2VydmVyIHR5cGUgaXMgaW5zdGFudGlhdGVkIHdpdGggYSAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yCiAqIGFuZCBwcmltZWQgd2l0aCA8Y29kZT5kZWxlZ2F0ZS5pbml0aWFsaXplKCgoSVNlcnZlclN0YXRlKXNlcnZlcik8L2NvZGU+LCAKICogd2hpY2ggaXQgaXMgZXhwZWN0ZWQgdG8gaGFuZyBvbiB0by4gTGF0ZXIsIHdoZW4KICogPGNvZGU+ZGVsZWdhdGUuZGlzcG9zZSgpPC9jb2RlPiBpcyBjYWxsZWQgYXMgdGhlIHNlcnZlciBpbnN0YW5jZSBpcwogKiBiZWluZyBkaXNjYXJkZWQsIHRoZSBkZWxlZ2F0ZSBpcyBleHBlY3RlZCB0byBsZXQgZ28gb2YgdGhlIHNlcnZlciBpbnN0YW5jZS4KICogPC9wPgogKiA8cD4KICogU2VydmVyIGRlbGVnYXRlcyBtYXkga2VlcCBzdGF0ZSBpbiBpbnN0YW5jZSBmaWVsZHMsIGJ1dCB0aGF0IHN0YXRlIGlzCiAqIHRyYW5zaWVudCBhbmQgd2lsbCBub3QgYmUgcGVyc2lzdGVkIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMuCiAqIDwvcD4KICogPHA+CiAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCiAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+c2VydmVyVHlwZXM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KICogPC9wPgogKiA8cD4KICogPGl0PkNhdmVhdDogVGhlIHNlcnZlciBjb3JlIEFQSSBpcyBzdGlsbCBpbiBhbiBlYXJseSBmb3JtLCBhbmQgaXMKICogbGlrZWx5IHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSB0aGUgaW5pdGlhbCByZWxlYXNlLjwvaXQ+CiAqIDwvcD4KICogCiAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5CiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSB7Cglwcml2YXRlIFNlcnZlciBzZXJ2ZXI7CgkKCS8qKgoJICogUHVibGlzaCBraW5kIGNvbnN0YW50ICh2YWx1ZSAwKSBmb3Igbm8gY2hhbmdlLgoJICogCgkgKiBAc2VlICNwdWJsaXNoTW9kdWxlKGludCwgaW50LCBJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NIQU5HRSA9IDA7CgkKCS8qKgoJICogUHVibGlzaCBraW5kIGNvbnN0YW50ICh2YWx1ZSAxKSBmb3IgYWRkZWQgcmVzb3VyY2VzLgoJICogCgkgKiBAc2VlICNwdWJsaXNoTW9kdWxlKGludCwgaW50LCBJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEID0gMTsKCQoJLyoqCgkgKiBQdWJsaXNoIGtpbmQgY29uc3RhbnQgKHZhbHVlIDIpIGZvciBjaGFuZ2VkIHJlc291cmNlcy4KCSAqIAoJICogQHNlZSAjcHVibGlzaE1vZHVsZShpbnQsIGludCwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEID0gMjsKCgkvKioKCSAqIFB1Ymxpc2gga2luZCBjb25zdGFudCAodmFsdWUgMykgZm9yIHJlbW92ZWQgcmVzb3VyY2VzLgoJICogCgkgKiBAc2VlICNwdWJsaXNoTW9kdWxlKGludCwgaW50LCBJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRUQgPSAzOwoKCS8qKgoJICogRGVsZWdhdGVzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4KCSAqLwoJcHVibGljIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlKCkgewoJCS8vIGRvIG5vdGhpbmcKCX0KCgkvKioKCSAqIEluaXRpYWxpemVzIHRoaXMgc2VydmVyIGRlbGVnYXRlIHdpdGggaXRzIGxpZmUtbG9uZyBzZXJ2ZXIgaW5zdGFuY2UuCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgoJICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KCSAqIDwvcD4KCSAqIAoJICogQHBhcmFtIG5ld1NlcnZlciB0aGUgc2VydmVyIGluc3RhbmNlCgkgKi8KCXB1YmxpYyBmaW5hbCB2b2lkIGluaXRpYWxpemUoU2VydmVyIG5ld1NlcnZlcikgewoJCXNlcnZlciA9IG5ld1NlcnZlcjsKCQlpbml0aWFsaXplKCk7Cgl9CgoJLyoqCgkgKiBJbml0aWFsaXplcyB0aGlzIHNlcnZlciBkZWxlZ2F0ZS4gVGhpcyBtZXRob2QgZ2l2ZXMgZGVsZWdhdGVzIGEgY2hhbmNlCgkgKiB0byBkbyB0aGVpciBvd24gaW5pdGlhbGl6YXRpb24uCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgoJICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KCSAqIDwvcD4KCSAqLwoJcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdGhhdCB0aGlzIHNlcnZlciBkZWxlZ2F0ZSBjb3JyZXNwb25kcyB0by4KCSAqIAoJICogQHJldHVybiB0aGUgc2VydmVyCgkgKi8KCXB1YmxpYyBmaW5hbCBJU2VydmVyIGdldFNlcnZlcigpIHsKCQlyZXR1cm4gc2VydmVyOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIHNlcnZlci4KCSAqCgkgKiBAcGFyYW0gc3RhdGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNlcnZlciwgb25lIG9mIHRoZSBzdGF0ZQoJICogICAgY29uc3RhbnRzIGRlZmluZWQgYnkge0BsaW5rIElTZXJ2ZXJ9CgkgKiBAc2VlIElTZXJ2ZXIjZ2V0U2VydmVyU3RhdGUoKQoJICovCglwdWJsaWMgZmluYWwgdm9pZCBzZXRTZXJ2ZXJTdGF0ZShpbnQgc3RhdGUpIHsKCQlzZXJ2ZXIuc2V0U2VydmVyU3RhdGUoc3RhdGUpOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgSUxhdW5jaE1hbmFnZXIgbW9kZSB0aGF0IHRoZSBzZXJ2ZXIgaXMgcnVubmluZyBpbi4gVGhlIHNlcnZlcgoJICogaW1wbGVtZW50YXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGllbnRzCgkgKiB3aGVuIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZCwgc28geW91IG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIG1vZGUgd2hlbgoJICogaXQgY2hhbmdlcy4KCSAqIAoJICogQHBhcmFtIG1vZGUgdGhlIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgaXMgcnVubmluZywgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cwoJICogICAgZGVmaW5lZCBieSB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KCSAqLwoJcHVibGljIGZpbmFsIHZvaWQgc2V0TW9kZShTdHJpbmcgbW9kZSkgewoJCXNlcnZlci5zZXRNb2RlKG1vZGUpOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgc2VydmVyIHJlc3RhcnQgc3RhdGUuCgkgKgoJICogQHBhcmFtIHN0YXRlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgbmVlZHMgdG8gYmUgcmVzdGFydGVkLAoJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKCSAqLwoJcHVibGljIGZpbmFsIHZvaWQgc2V0U2VydmVyUmVzdGFydFN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKCQlzZXJ2ZXIuc2V0U2VydmVyUmVzdGFydFN0YXRlKHN0YXRlKTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHNlcnZlciBwdWJsaXNoIHN0YXRlLgoJICoKCSAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBwdWJsaXNoIHN0YXRlIG9mIHRoZSBzZXJ2ZXIsIG9uZSBvZiB0aGUKCSAqICAgIHB1Ymxpc2ggY29uc3RhbnRzIGRlZmluZWQgYnkge0BsaW5rIElTZXJ2ZXJ9CgkgKi8KCXB1YmxpYyBmaW5hbCB2b2lkIHNldFNlcnZlclB1Ymxpc2hTdGF0ZShpbnQgc3RhdGUpIHsKCQlzZXJ2ZXIuc2V0U2VydmVyUHVibGlzaFN0YXRlKHN0YXRlKTsKCX0KCgkvKioKCSAqIEhvb2sgdG8gZmlyZSBhbiBldmVudCB3aGVuIGEgbW9kdWxlIHN0YXRlIGNoYW5nZXMuCgkgKiAKCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQoJICogQHBhcmFtIHN0YXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2R1bGUsIG9uZSBvZiB0aGUgc3RhdGUKCSAqICAgIGNvbnN0YW50cyBkZWZpbmVkIGJ5IHtAbGluayBJU2VydmVyfQoJICovCglwdWJsaWMgZmluYWwgdm9pZCBzZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKCQlzZXJ2ZXIuc2V0TW9kdWxlU3RhdGUobW9kdWxlLCBzdGF0ZSk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBtb2R1bGUgcHVibGlzaCBzdGF0ZS4KCSAqCgkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKCSAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBwdWJsaXNoIHN0YXRlIG9mIHRoZSBtb2R1bGUsIG9uZSBvZiB0aGUKCSAqICAgIHB1Ymxpc2ggY29uc3RhbnRzIGRlZmluZWQgYnkge0BsaW5rIElTZXJ2ZXJ9CgkgKi8KCXB1YmxpYyBmaW5hbCB2b2lkIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKCQlzZXJ2ZXIuc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSwgc3RhdGUpOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgbW9kdWxlIHJlc3RhcnQgc3RhdGUuCgkgKgoJICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCgkgKiBAcGFyYW0gc3RhdGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQsCgkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQoJICovCglwdWJsaWMgZmluYWwgdm9pZCBzZXRNb2R1bGVSZXN0YXJ0U3RhdGUoSU1vZHVsZVtdIG1vZHVsZSwgYm9vbGVhbiBzdGF0ZSkgewoJCXNlcnZlci5zZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlLCBzdGF0ZSk7Cgl9CgoJLyoqCgkgKiBEaXNwb3NlcyBvZiB0aGlzIHNlcnZlciBkZWxlZ2F0ZS4KCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB3ZWIgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgoJICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KCSAqIDwvcD4KCSAqIDxwPgoJICogSW1wbGVtZW50YXRpb25zIGFyZSBleHBlY3RlZCB0byBsZXQgZ28gb2YgdGhlIGRlbGVnYXRlJ3MgcmVmZXJlbmNlCgkgKiB0byB0aGUgc2VydmVyLCBkZXJlZ2lzdGVyIGxpc3RlbmVycywgZXRjLgoJICogPC9wPgoJICovCglwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewoJCS8vIGRvIG5vdGhpbmcKCX0KCgkvKioKCSAqIE1ldGhvZHMgY2FsbGVkIHRvIG5vdGlmeSB0aGF0IHB1Ymxpc2hpbmcgaXMgYWJvdXQgdG8gYmVnaW4uCgkgKiBUaGlzIGFsbG93cyB0aGUgc2VydmVyIHRvIG9wZW4gYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIKCSAqIG9yIGdldCBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIHJlYWR5LgoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyLnB1Ymxpc2goKTwvY29kZT4uCgkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgoJICogPC9wPgoJICoKCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAoJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBzdGFydGluZyB0aGUgcHVibGlzaAoJICovCglwdWJsaWMgdm9pZCBwdWJsaXNoU3RhcnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJLy8gZG8gbm90aGluZwoJfQoKCS8qKgoJICogUHVibGlzaCB0aGUgc2VydmVyLgoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyLnB1Ymxpc2goKTwvY29kZT4uCgkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgoJICogPC9wPgoJICogCgkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIuUFVCTElTSF9YWCBjb25zdGFudHMuIFZhbGlkIHZhbHVlcyBhcmUKCSAqICAgIDx1bD4KCSAqICAgIDxsaT48Y29kZT5QVUJMU0lIX0ZVTEw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBmdWxsIHB1Ymxpc2guPC9saT4KCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0lOQ1JFTUVOVEFMPC9jb2RlPi0gaW5kaWNhdGVzIGEgaW5jcmVtZW50YWwgcHVibGlzaC4KCSAqICAgIDxsaT48Y29kZT5QVUJMU0lIX0FVVE88L2NvZGU+LSBpbmRpY2F0ZXMgYW4gYXV0b21hdGljIGluY3JlbWVudGFsIHB1Ymxpc2guPC9saT4KCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0NMRUFOPC9jb2RlPi0gaW5kaWNhdGVzIGEgY2xlYW4gcmVxdWVzdC4gQ2xlYW4gdGhyb3dzCgkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKCSAqICAgICAgZnVsbCBwdWJsaXNoLgoJICogICAgPC91bD4KCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAoJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwdWJsaXNoaW5nIHRoZSBzZXJ2ZXIKCSAqLwoJcHVibGljIGFic3RyYWN0IHZvaWQgcHVibGlzaFNlcnZlcihpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKCgkvKioKCSAqIFB1Ymxpc2ggYSBzaW5nbGUgbW9kdWxlIHRvIHRoZSBzZXJ2ZXIuCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAoJICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIucHVibGlzaCgpPC9jb2RlPi4KCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCgkgKiA8L3A+CgkgKiA8cD4KCSAqIElmIHRoZSBkZWx0YUtpbmQgaXMgSVNlcnZlci5SRU1PVkVELCB0aGUgbW9kdWxlIG1heSBoYXZlIGJlZW4gY29tcGxldGVseQoJICogZGVsZXRlZCBhbmQgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gSW4gdGhpcyBjYXNlLCBhIGR1bW15IG1vZHVsZSAod2l0aCB0aGUKCSAqIGNvcnJlY3QgaWQpIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLgoJICogPC9wPgoJICogCgkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIuUFVCTElTSF9YWCBjb25zdGFudHMuIFZhbGlkIHZhbHVlcyBhcmUKCSAqICAgIDx1bD4KCSAqICAgIDxsaT48Y29kZT5QVUJMU0lIX0ZVTEw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBmdWxsIHB1Ymxpc2guPC9saT4KCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0lOQ1JFTUVOVEFMPC9jb2RlPi0gaW5kaWNhdGVzIGEgaW5jcmVtZW50YWwgcHVibGlzaC4KCSAqICAgIDxsaT48Y29kZT5QVUJMU0lIX0FVVE88L2NvZGU+LSBpbmRpY2F0ZXMgYW4gYXV0b21hdGljIGluY3JlbWVudGFsIHB1Ymxpc2guPC9saT4KCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0NMRUFOPC9jb2RlPi0gaW5kaWNhdGVzIGEgY2xlYW4gcmVxdWVzdC4gQ2xlYW4gdGhyb3dzCgkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKCSAqICAgICAgZnVsbCBwdWJsaXNoLgoJICogICAgPC91bD4KCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBwdWJsaXNoCgkgKiBAcGFyYW0gZGVsdGFLaW5kIG9uZSBvZiB0aGUgSVNlcnZlciBwdWJsaXNoIGNoYW5nZSBjb25zdGFudHMuIFZhbGlkIHZhbHVlcyBhcmUKCSAqICAgIDx1bD4KCSAqICAgIDxsaT48Y29kZT5BRERFRDwvY29kZT4tIGluZGljYXRlcyB0aGUgbW9kdWxlIGhhcyBqdXN0IGJlZW4gYWRkZWQgdG8gdGhlIHNlcnZlcgoJICogICAgICBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgcHVibGlzaC4KCSAqICAgIDxsaT48Y29kZT5OT19DSEFOR0U8L2NvZGU+LSBpbmRpY2F0ZXMgdGhhdCBub3RoaW5nIGhhcyBjaGFuZ2VkIGluIHRoZSBtb2R1bGUKCSAqICAgICAgc2luY2UgdGhlIGxhc3QgcHVibGlzaC48L2xpPgoJICogICAgPGxpPjxjb2RlPkNIQU5HRUQ8L2NvZGU+LSBpbmRpY2F0ZXMgdGhhdCB0aGUgbW9kdWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UKCSAqICAgICAgdGhlIGxhc3QgcHVibGlzaC4gQ2FsbCA8Y29kZT5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKCk8L2NvZGU+IGZvcgoJICogICAgICBkZXRhaWxzIG9mIHRoZSBjaGFuZ2UuCgkgKiAgICA8bGk+PGNvZGU+UkVNT1ZFRDwvY29kZT4tIGluZGljYXRlcyB0aGUgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHNob3VsZCBiZQoJICogICAgICByZW1vdmVkL2NsZWFuZWQgdXAgZnJvbSB0aGUgc2VydmVyLgoJICogICAgPC91bD4KCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAoJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwdWJsaXNoaW5nIHRoZSBtb2R1bGUKCSAqLwoJcHVibGljIGFic3RyYWN0IHZvaWQgcHVibGlzaE1vZHVsZShpbnQga2luZCwgaW50IGRlbHRhS2luZCwgSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKCgkvKioKCSAqIE1ldGhvZHMgY2FsbGVkIHRvIG5vdGlmeSB0aGF0IHB1Ymxpc2hpbmcgaGFzIGZpbmlzaGVkLgoJICogVGhlIHNlcnZlciBjYW4gY2xvc2UgYW55IG9wZW4gY29ubmVjdGlvbnMgdG8gdGhlIHNlcnZlcgoJICogYW5kIGRvIGFueSBjbGVhbnVwIG9wZXJhdGlvbnMuCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAoJICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIucHVibGlzaCgpPC9jb2RlPi4KCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCgkgKiA8L3A+CgkgKgoJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwoJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCgkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHN0b3BwaW5nIHRoZSBwdWJsaXNoCgkgKi8KCXB1YmxpYyB2b2lkIHB1Ymxpc2hGaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJLy8gZG8gbm90aGluZwoJfQoKCS8qKgoJICogQ29uZmlndXJlIHRoZSBnaXZlbiBsYXVuY2ggY29uZmlndXJhdGlvbiB0byBzdGFydCB0aGlzIHNlcnZlci4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyCgkgKiB0aGUgc2VydmVyIGlzIHN0YXJ0ZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGlzIGFjY3VyYXRlIGFuZCB1cCB0byBkYXRlLgoJICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBibGluZGx5IHVwZGF0ZSB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gaW4gY2FzZXMgd2hlcmUgdGhlIHVzZXIgaGFzCgkgKiBhY2Nlc3MgdG8gY2hhbmdlIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBieSBoYW5kLgoJICogCgkgKiBAcGFyYW0gd29ya2luZ0NvcHkgYSBsYXVuY2ggY29uZmlndXJhdGlvbiB3b3JraW5nIGNvcHkKCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAoJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHNldHRpbmcgdXAgdGhlIGNvbmZpZ3VyYXRpb24KCSAqLwoJcHVibGljIHZvaWQgc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCS8vIGRvIG5vdGhpbmcKCX0KCgkvKioKCSAqIFJlc3RhcnQgdGhpcyBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgc2hvdWxkIHVzZSB0aGUgc2VydmVyCgkgKiBsaXN0ZW5lciB0byBub3RpZnkgcHJvZ3Jlc3MuIEl0IG11c3QgdXNlIHRoZSBzYW1lIGRlYnVnCgkgKiBmbGFncyBhcyB3YXMgb3JpZ2luYWxseSBwYXNzZWQgaW50byB0aGUgc3RhcnQoKSBtZXRob2QuCgkgKiAKCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaWYgdGhlcmUgaXMgYSBxdWljay9iZXR0ZXIgd2F5IHRvIHJlc3RhcnQKCSAqIHRoZSBzZXJ2ZXIuIElmIGl0IHRocm93cyBhIENvcmVFeGNlcHRpb24sIHRoZSBub3JtYWwgc3RvcC9zdGFydAoJICogYWN0aW9ucyB3aWxsIGJlIHVzZWQuCgkgKiAKCSAqIEBwYXJhbSBsYXVuY2hNb2RlIHRoZSBtb2RlIHRvIHJlc3RhcnQgaW4sIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMKCSAqICAgIGRlZmluZWQgYnkge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9CgkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSByZXN0YXJ0aW5nCgkgKi8KCXB1YmxpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQkgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCAiQ291bGQgbm90IHJlc3RhcnQiLCBudWxsKSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG1vZHVsZSBjYW4gYmUgcmVzdGFydGVkLgoJICogPHA+CgkgKiBbaXNzdWU6IEl0J3MgdW5jbGVhciB3aGV0aGVyIHRoaXMgb3BlcmF0aW9ucyBpcyBndWFyYW50ZWVkIHRvIGJlIGZhc3QKCSAqIG9yIHdoZXRoZXIgaXQgY291bGQgaW52b2x2ZSBjb21tdW5pY2F0aW9uIHdpdGggYW55IGFjdHVhbAoJICogc2VydmVyLiBJZiBpdCBpcyBub3QgZmFzdCwgdGhlIG1ldGhvZCBzaG91bGQgdGFrZSBhIHByb2dyZXNzCgkgKiBtb25pdG9yLl0KCSAqIDwvcD4KCSAqIAoJICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBtb2R1bGUgY2FuIGJlCgkgKiByZXN0YXJ0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlIAoJICovCglwdWJsaWMgYm9vbGVhbiBjYW5SZXN0YXJ0TW9kdWxlKElNb2R1bGVbXSBtb2R1bGUpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBBc3luY2hyb25vdXNseSByZXN0YXJ0cyB0aGUgZ2l2ZW4gbW9kdWxlIG9uIHRoZSBzZXJ2ZXIuCgkgKiBTZWUgdGhlIHNwZWNpZmljYXRpb24gb2YgCgkgKiB7QGxpbmsgSVNlcnZlciNzeW5jaHJvbm91c1Jlc3RhcnRNb2R1bGUoSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKX0KCSAqIGZvciBmdXJ0aGVyIGRldGFpbHMuIAoJICogPHA+CgkgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHVwZGF0ZSB0aGUgbW9kdWxlIHN5bmMgc3RhdGUgYW5kIGZpcmUKCSAqIGFuIGV2ZW50IGZvciB0aGUgbW9kdWxlLgoJICogPC9wPgoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbW9kdWxlIGRvZXMgbm90IGV4aXN0IG9uCgkgKiB0aGUgc2VydmVyLgoJICogPC9wPgoJICogPHA+CgkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzY3luY2hyb25vdXMsIGlzIHRoZXJlCgkgKiBhbnkgbmVlZCBmb3IgdGhlIHByb2dyZXNzIG1vbml0b3I/XQoJICogPC9wPgoJICogPHA+CgkgKiBbaXNzdWU6IElmIHRoZSBtb2R1bGUgd2FzIGp1c3QgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIKCSAqIGFuZCBoYWQgbmV2ZXIgYmVlbiBzdGFydGVkLCB3b3VsZCBpcyBiZSBvayB0byAic3RhcnQiCgkgKiB0aGUgbW9kdWxlIHVzaW5nIHRoaXMgbWV0aG9kP10KCSAqIDwvcD4KCSAqIAoJICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRvIGJlIHN0YXJ0ZWQKCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAoJICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gcmVzdGFydCB0aGUgbW9kdWxlCgkgKi8KCXB1YmxpYyB2b2lkIHJlc3RhcnRNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJLy8gZG8gbm90aGluZwoJfQoKCS8qKgoJICogU2h1dHMgZG93biBhbmQgc3RvcHMgdGhpcyBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgbWV0aG9kCgkgKiBxdWlja2x5IGFuZCB1c2UgdGhlIHNlcnZlciBsaXN0ZW5lciB0byBub3RpZnkgc2h1dGRvd24gcHJvZ3Jlc3MuCgkgKiA8cD4gCgkgKiBJZiBmb3JjZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIGl0IHdpbGwgYXR0ZW1wdCB0byBzdG9wIHRoZSBzZXJ2ZXIKCSAqIG5vcm1hbGx5L2dyYWNlZnVsbHkuIElmIGZvcmNlIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzZXJ2ZXIKCSAqIHByb2Nlc3Mgd2lsbCBiZSB0ZXJtaW5hdGVkIGFueSB3YXkgdGhhdCBpdCBjYW4uCgkgKiA8L3A+CgkgKiA8cD4KCSAqIFtpc3N1ZTogVGhlcmUgaXMgbm8gd2F5IHRvIGNvbW11bmljYXRlIGZhaWx1cmUgdG8gdGhlCgkgKiBjbGllbnQuIEdpdmVuIHRoYXQgdGhpcyBvcGVyYXRpb24gY2FuIGdvIGF3cnksIHRoZXJlIHByb2JhYmx5CgkgKiBzaG91bGQgYmUgYSBtZWNoYW5pc20gdGhhdCBhbGxvd3MgZmFpbGluZyBhc3luY2ggb3BlcmF0aW9ucwoJICogdG8gYmUgZGlhZ25vc2VkLl0KCSAqIDwvcD4KCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBraWxsIHRoZSBzZXJ2ZXIsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgoJICogICAgdG8gc3RvcCBub3JtYWxseQoJICovCglwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wKGJvb2xlYW4gZm9yY2UpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgbW9kdWxlIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlci4KCSAqIAoJICogPHA+CgkgKiBJZiB0aGUgbW9kdWxlIGhhcyBqdXN0IGJlZW4gYWRkZWQgdG8gdGhlIHNlcnZlciwgYW4gZW1wdHkgbGlzdCB3aWxsCgkgKiBiZSByZXR1cm5lZC4gSWYgdGhlIG1vZHVsZSBoYXMgbmV2ZXIgZXhpc3RlZCBvbiB0aGUgc2VydmVyLCBhIENvcmVFeGNlcHRpb24KCSAqIHdpbGwgYmUgdGhyb3duLgoJICogPC9wPgoJICogCgkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHVibGlzaGVkIG1vZHVsZSByZXNvdXJjZQoJICovCglwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gZ2V0UHVibGlzaGVkUmVzb3VyY2VzKElNb2R1bGVbXSBtb2R1bGUpIHsKCQlyZXR1cm4gc2VydmVyLmdldFB1Ymxpc2hlZFJlc291cmNlcyhtb2R1bGUpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgZGVsdGEgb2YgdGhlIGN1cnJlbnQgbW9kdWxlIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbgoJICogcHVibGlzaGVkIGNvbXBhcmVkIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2R1bGUuCgkgKgoJICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCgkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHB1Ymxpc2ggcmVzb3VyY2UgZGVsdGEKCSAqLwoJcHVibGljIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7CgkJcmV0dXJuIHNlcnZlci5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHRoZSByZXF1ZXN0b3IgY2FuIHVzZQoJICogdGhyb3VnaG91dCBpdCdzIGxpZmVjeWNsZS4gVGhpcyBpcyBwcmltYXJ5IHRvIGJlIHVzZWQgYnkKCSAqIHNlcnZlcnMgZm9yIHdvcmtpbmcgZGlyZWN0b3JpZXMsIHNlcnZlciBzcGVjaWZpYwoJICogZmlsZXMsIGV0Yy4KCSAqIDxwPgoJICogVGhpcyBtZXRob2QgZGlyZWN0b3J5IHdpbGwgcmV0dXJuIHRoZSBzYW1lIGRpcmVjdG9yeSBvbgoJICogZWFjaCB1c2Ugb2YgdGhlIHdvcmtiZW5jaC4gSWYgdGhlIGRpcmVjdG9yeSBpcyBub3QgcmVxdWVzdGVkCgkgKiBvdmVyIGEgcGVyaW9kIG9mIHRpbWUsIHRoZSBkaXJlY3RvcnkgbWF5IGJlIGRlbGV0ZWQgYW5kIGEKCSAqIG5ldyBvbmUgd2lsbCBiZSBhc3NpZ25lZCBvbiB0aGUgbmV4dCByZXF1ZXN0LiBGb3IgdGhpcwoJICogcmVhc29uLCBhIHNlcnZlciBtYXkgd2FudCB0byByZXF1ZXN0IHRoZSB0ZW1wIGRpcmVjdG9yeSBvbgoJICogc3RhcnR1cCBpZiBpdCB3YW50cyB0byBzdG9yZSBmaWxlcyB0aGVyZS4gSW4gYW55IGNhc2UsIHRoZQoJICogc2VydmVyIHNob3VsZCBoYXZlIGEgYmFja3VwIHBsYW4gdG8gcmVmaWxsIHRoZSBkaXJlY3RvcnkKCSAqIGluIGNhc2UgaXQgaGFzIGJlZW4gZGVsZXRlZCBzaW5jZSBsYXN0IHVzZS48L3A+CgkgKgoJICogQHJldHVybiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKCSAqLwoJcHVibGljIGZpbmFsIElQYXRoIGdldFRlbXBEaXJlY3RvcnkoKSB7CgkJcmV0dXJuIHNlcnZlci5nZXRUZW1wRGlyZWN0b3J5KCk7Cgl9CgoJLyoqCgkgKiBTZXQgYSBnbG9iYWwgc3RhdHVzIG9uIHRoZSBzZXJ2ZXIuCgkgKiAgCgkgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMKCSAqLwoJcHVibGljIGZpbmFsIHZvaWQgc2V0U2VydmVyU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7CgkJc2VydmVyLnNldFNlcnZlclN0YXR1cyhzdGF0dXMpOwoJfQoKCS8qKgoJICogU2V0IGEgc3RhdHVzIG9uIGEgc3BlY2lmaWMgbW9kdWxlLgoJICogCgkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKCSAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cwoJICovCglwdWJsaWMgZmluYWwgdm9pZCBzZXRNb2R1bGVTdGF0dXMoSU1vZHVsZVtdIG1vZHVsZSwgSVN0YXR1cyBzdGF0dXMpIHsKCQlzZXJ2ZXIuc2V0TW9kdWxlU3RhdHVzKG1vZHVsZSwgc3RhdHVzKTsKCX0KfQ==