Return-Path: Delivered-To: apmail-geronimo-dev-archive@www.apache.org Received: (qmail 28261 invoked from network); 11 Dec 2005 18:56:35 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 11 Dec 2005 18:56:35 -0000 Received: (qmail 69078 invoked by uid 500); 11 Dec 2005 18:56:34 -0000 Delivered-To: apmail-geronimo-dev-archive@geronimo.apache.org Received: (qmail 68383 invoked by uid 500); 11 Dec 2005 18:56:32 -0000 Mailing-List: contact dev-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list dev@geronimo.apache.org Received: (qmail 68372 invoked by uid 99); 11 Dec 2005 18:56:31 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 11 Dec 2005 10:56:31 -0800 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests= X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [206.222.92.5] (HELO MAIL5.toronto.redknee.com) (206.222.92.5) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 11 Dec 2005 10:56:30 -0800 X-MimeOLE: Produced By Microsoft Exchange V6.5.7226.0 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C5FE84.8BE5A8C9" Subject: POP3 Implementation done Date: Sun, 11 Dec 2005 13:56:05 -0500 Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: POP3 Implementation done Thread-Index: AcX7W8dwmV9fT748T6u/me63aRoDBQB6mZqQAEvkRmA= From: "Rajith Attapattu" To: X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N This is a multi-part message in MIME format. ------_=_NextPart_001_01C5FE84.8BE5A8C9 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable I have completed the POP3 implementation and the patch is attached. Comments and code reviews are greatly appreciated. I have done it in a Geronimo independent way so that the code can be moved out to a sub project in the future by just changing the package name. What is done =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 1. POP3Store, POP3Folder and partial implementation of POP3Message for JavaMail API 2. All support classes including factories for POP3Command and POP3Response and a POP3Connection abstraction. 3. Can connect, authenticate with user/pass and retrieve mail. What needs to be done =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 1. Complete support for POP3Message, currently not all headers are parsed and, InetAddress for getRecipients(), getFrom are not working properly. I am working on it, and will have something by Monday. 2. SSLSocket support using JSSE, bcos for instance Google POP3 doesn't work as it runs over SSL. Is this a priority??? 3. Needs more testing with different mail servers. Tested with only my mail server. I really need help with this !!!! 4. Need to do some code review and more documentation. 5. Unit tests. For now I have included the pop3 impl inside geronimo-javamail-transport. We can either move it to a sub project called geronimo-javamail-store or we can rename the current project to geronimo-javamail-providers (for both transports and stores)to be in line with the JavaMail spec. I like the second option. Regards, Rajith Attapattu. ------_=_NextPart_001_01C5FE84.8BE5A8C9 Content-Type: application/octet-stream; name="javamail.patch" Content-Transfer-Encoding: base64 Content-Description: javamail.patch Content-Disposition: attachment; filename="javamail.patch" SW5kZXg6IHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9wMy9Q T1AzQ29tbWFuZC5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc3JjL2phdmEvb3JnL2FwYWNoZS9nZXJv bmltby9qYXZhbWFpbC9zdG9yZS9wb3AzL1BPUDNDb21tYW5kLmphdmEJKHJldmlzaW9uIDApDQor Kysgc3JjL2phdmEvb3JnL2FwYWNoZS9nZXJvbmltby9qYXZhbWFpbC9zdG9yZS9wb3AzL1BPUDND b21tYW5kLmphdmEJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDQwIEBADQorLyoqDQorICoNCisg KiBDb3B5cmlnaHQgMjAwMy0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KKyAq DQorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRo ZSAiTGljZW5zZSIpOw0KKyAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBv ZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNl bnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxl IGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiAgZGlzdHJpYnV0ZWQg dW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisg KiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl eHByZXNzIG9yIGltcGxpZWQuDQorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmlj IGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiAgbGltaXRhdGlvbnMgdW5k ZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmdlcm9uaW1vLmph dmFtYWlsLnN0b3JlLnBvcDM7DQorDQorLyoqDQorICogQW4gYWJzdHJhY3Rpb24gZm9yIFBPUDND b21tYW5kcw0KKyAqIEBzZWUgb3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbC5zdG9yZS5wb3Az LlBPUDNDb21tYW5kRmFjdG9yeQ0KKyAqIA0KKyAqIEB2ZXJzaW9uICRSZXYkICREYXRlJA0KKyAq Lw0KK3B1YmxpYyBpbnRlcmZhY2UgUE9QM0NvbW1hbmQgew0KKwkNCisJDQorCS8qKg0KKwkgKiBU aGlzIG1ldGhvZCB3aWxsIGdldCB0aGUgUE9QMyBjb21tYW5kIGluIHN0cmluZyBmb3JtYXQNCisJ ICogYWNjb3JkaW5nIG8gcmZjMTkzOQ0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21tYW5k KCk7DQorCQ0KKwkvKioNCisJICogSW5kaWNhdGVzIHdldGhlciB0aGlzIGNvbW1hbmQgZXhwZWN0 cyBhIG11bHRpbGluZSByZXNwb25zZSBvciBub3QNCisJICogDQorCSAqLw0KKwlwdWJsaWMgYm9v bGVhbiBpc011bHRpTGluZVJlc3BvbnNlKCk7DQorfQ0KSW5kZXg6IHNyYy9qYXZhL29yZy9hcGFj aGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9wMy9QT1AzUmVzcG9uc2UuamF2YQ0KPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQ0KLS0tIHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9w My9QT1AzUmVzcG9uc2UuamF2YQkocmV2aXNpb24gMCkNCisrKyBzcmMvamF2YS9vcmcvYXBhY2hl L2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvUE9QM1Jlc3BvbnNlLmphdmEJKHJldmlzaW9u IDApDQpAQCAtMCwwICsxLDYxIEBADQorLyoqDQorICoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA1 IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KKyAqDQorICogIExpY2Vuc2VkIHVuZGVy IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqICB5 b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExp Y2Vuc2UuDQorICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAq DQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAq DQorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4g d3JpdGluZywgc29mdHdhcmUNCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMg ZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiAgV0lUSE9VVCBXQVJSQU5USUVT IE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQor ICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBw ZXJtaXNzaW9ucyBhbmQNCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICov DQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0b3JlLnBvcDM7DQor DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQorDQorLyoqDQorICogQW4gYWJzdHJhY3Rp b24gZm9yIFBPUDMgUmVzcG9uc2UNCisgKiANCisgKiBAc2VlIG9yZy5hcGFjaGUuZ2Vyb25pbW8u amF2YW1haWwuc3RvcmUucG9wMy5yZXNwb25zZS5QT1AzUmVzcG9uc2VGYWN0b3J5DQorICogQHNl ZSBvcmcuYXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0b3JlLnBvcDMucmVzcG9uc2UuRGVmYXVs dFBPUDNSZXNwb25zZQ0KKyAqIEBzZWUgb3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbC5zdG9y ZS5wb3AzLnJlc3BvbnNlLlBPUDNTdGF0dXNSZXNwb25zZQ0KKyAqIA0KKyAqIEB2ZXJzaW9uICRS ZXYkICREYXRlJA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgUE9QM1Jlc3BvbnNlIHsNCisJDQor CS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXNwb25zZSBPSyBvciBFUlINCisJICogPHVsPg0KKwkg KiA8bGk+T0sgICAtLT4gK09LIGluIHBvcDMgc3BlYw0KKwkgKiA8bGk+RVJSICAtLT4gLUVSUiBp biBwb3AzIHNwZWMNCisJICogPC91bD4NCisJICovDQorCXB1YmxpYyBpbnQgZ2V0U3RhdHVzKCk7 DQorCQ0KKwkvKioNCisJICogdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgbGluZSB3aXRoIHRoZSBz dGF0dXMNCisJICogaG93ZXZlciB0aGUgc3RhdHVzIHdpbGwgYmUgcmVtb3ZlZCBhbmQgdGhlIHJl bWFpbmRlciBpcyByZXR1cm5lZC4NCisJICogRXguICIrT0sgMTMyIDMwMjM2NzMiIGlzIHRoZSBm aXJzdCBsaW5lIG9mIHJlc3BvbnNlIGZvciBhIFNUQVQgY29tbWFuZA0KKwkgKiB0aGlzIG1ldGhv ZCB3aWxsIHJldHVybiAiMTMyIDMwMjM2NzMiDQorCSAqIA0KKwkgKiBTbyBhbnkgc3Vic2VxdWVu dCBwcm9jZXNzIGNhbiBwYXJzZSB0aGUgcGFyYW1zIDEzMiBhcyBubyBvZiBtc2dzDQorCSAqIGFu ZCAzMDIzNjc0IGFzIHRoZSBzaXplLg0KKwkgKiBAc2VlIG9yZy5hcGFjaGUuZ2Vyb25pbW8uamF2 YW1haWwuc3RvcmUucG9wMy5yZXNwb25zZS5QT1AzU3RhdHVzUmVzcG9uc2UNCisJICovDQorCXB1 YmxpYyBTdHJpbmcgZ2V0Rmlyc3RMaW5lKCk7DQorCQ0KKwkvKioNCisJICogVGhpcyB3YXkgd2Ug YXJlIG5vdCByZXN0cmljdGluZyBhbnlib2R5IGFzIElucHV0U3RyZWFtLmNsYXNzDQorCSAqIGlz IHRoZSBtb3N0IGJhc2ljIHR5cGUgdG8gcmVwcmVzZW50IGFuIGlucHV0c3RyZWFtIGFuZCBwcGwg Y2FuDQorCSAqIGRlY29yYXRlIGl0IGFueXdheSB0aGV5IHdhbnQsIGZvciBleCBCdWZmZXJlZElu cHV0U3RyZWFtIG9yIGFzIGFuDQorCSAqIElucHV0U3RyZWFtUmVhZGVyIGFsbG93aW5nIG1heGlt dW0gZmxleGliaWxpdHkgaW4gdXNpbmcgaXQuIA0KKwkgKi8NCisJcHVibGljIElucHV0U3RyZWFt IGdldERhdGEoKTsNCit9DQpJbmRleDogc3JjL2phdmEvb3JnL2FwYWNoZS9nZXJvbmltby9qYXZh bWFpbC9zdG9yZS9wb3AzL1BPUDNDb25uZWN0aW9uLmphdmENCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzcmMv amF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvUE9QM0Nvbm5lY3Rp b24uamF2YQkocmV2aXNpb24gMCkNCisrKyBzcmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2ph dmFtYWlsL3N0b3JlL3BvcDMvUE9QM0Nvbm5lY3Rpb24uamF2YQkocmV2aXNpb24gMCkNCkBAIC0w LDAgKzEsMTU4IEBADQorLyoqDQorICoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA1IFRoZSBBcGFj aGUgU29mdHdhcmUgRm91bmRhdGlvbg0KKyAqDQorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFj aGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqICB5b3UgbWF5IG5v dCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQor ICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAg IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogIFVu bGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywg c29mdHdhcmUNCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0 ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJ VElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogIFNlZSB0 aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9u cyBhbmQNCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFj a2FnZSBvcmcuYXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0b3JlLnBvcDM7DQorDQoraW1wb3J0 IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uQnVmZmVyZWRS ZWFkZXI7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSW5w dXRTdHJlYW1SZWFkZXI7DQoraW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7DQoraW1wb3J0IGph dmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOw0KK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7DQorDQor aW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZheC5tYWls LlNlc3Npb247DQorDQorLyoqDQorICogUmVwcmVzZW50cyBhIGNvbm5lY3Rpb24gd2l0aCB0aGUg UE9QMyBtYWlsIHNlcnZlci4NCisgKiBUaGUgY29ubmVjdGlvbiBpcyBvd25lZCBieSBhIHBvcDMg c3RvcmUgYW5kIGlzIG9ubHkNCisgKiBhc3NvY2lhdGVkIHdpdGggb25lIHVzZXIgd2hvIG93bnMg dGhlIHJlc3BlY3RpdmUgDQorICogUE9QM1N0b3JlIGluc3RhbmNlDQorICogIA0KKyAqIEB2ZXJz aW9uICRSZXYkICREYXRlJCANCisgKi8NCisNCitwdWJsaWMgY2xhc3MgUE9QM0Nvbm5lY3Rpb24g ew0KKwkNCisJcHJpdmF0ZSBTb2NrZXQgc29jOw0KKwlwcml2YXRlIFNlc3Npb24gc2Vzc2lvbjsN CisJcHJpdmF0ZSBTdHJpbmcgaG9zdDsNCisJcHJpdmF0ZSBpbnQgcG9ydDsNCisJcHJpdmF0ZSBQ cmludFdyaXRlciB3cml0ZXI7DQorCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgcmVhZGVyOw0KKwkN CisJUE9QM0Nvbm5lY3Rpb24oU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQp ew0KKyAgICAgICAgICANCisJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247DQorCQl0aGlzLmhvc3Qg PSBob3N0Ow0KKwkJdGhpcy5wb3J0ID0gcG9ydDsJCQ0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBv cGVuKCkgdGhyb3dzIEV4Y2VwdGlvbg0KKwl7DQorCQl0cnl7DQorCQkJc29jID0gbmV3IFNvY2tl dCgpOw0KKwkJCXNvYy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0LCBwb3J0KSk7 DQorCQkJDQorCQkJaWYoc2Vzc2lvbi5nZXREZWJ1ZygpKXsNCisJCQkJc2Vzc2lvbi5nZXREZWJ1 Z091dCgpLnByaW50bG4oIkNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCAiICsgdGhpcy50b1N0cmluZygp ICk7DQorCQkJfQ0KKwkJCQ0KKwkJCWJ1aWxkSW5wdXRSZWFkZXIoKTsNCisJCQlidWlsZE91dHB1 dFdyaXRlcigpOw0KKwkJCQ0KKw0KKwkJCS8vIGNvbnN1bWUgdGhlIGdyZWV0aW5nDQorCQkJaWYg KHNlc3Npb24uZ2V0RGVidWcoKSkgew0KKwkJCQlzZXNzaW9uLmdldERlYnVnT3V0KCkucHJpbnRs bigNCisJCQkJCQkiR3JlZXRpbmcgZnJvbSBzZXJ2ZXIgIiArIHJlYWRlci5yZWFkTGluZSgpKTsN CisJCQl9IGVsc2Ugew0KKwkJCQlyZWFkZXIucmVhZExpbmUoKTsNCisJCQl9CQkJDQorCQkJDQor CQl9Y2F0Y2goSU9FeGNlcHRpb24gZSl7DQorCQkJRXhjZXB0aW9uIGV4ID0gbmV3IEV4Y2VwdGlv bigiRXJyb3Igb3BlbmluZyBjb25uZWN0aW9uICIgKyB0aGlzLnRvU3RyaW5nKCksZSk7DQorCQkJ dGhyb3cgZXg7CQkNCisJCX0NCisJfQ0KKwkNCisJdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRp b24NCisJew0KKwkJdHJ5ew0KKwkJCXNvYy5jbG9zZSgpOw0KKwkJCWlmKHNlc3Npb24uZ2V0RGVi dWcoKSl7DQorCQkJCXNlc3Npb24uZ2V0RGVidWdPdXQoKS5wcmludGxuKCJDb25uZWN0aW9uIHN1 Y2Nlc3NmdWx5IGNsb3NlZCAiICsgdGhpcy50b1N0cmluZygpICk7DQorCQkJfQ0KKwkJCQ0KKwkJ fWNhdGNoKElPRXhjZXB0aW9uIGUpew0KKwkJCUV4Y2VwdGlvbiBleCA9IG5ldyBFeGNlcHRpb24o IkVycm9yIGNsb3NpbmcgY29ubmVjdGlvbiAiICsgdGhpcy50b1N0cmluZygpLGUpOw0KKwkJCXRo cm93IGV4OwkJDQorCQl9DQorCQkNCisJfQ0KKwkNCisJcHVibGljIHN5bmNocm9uaXplZCBQT1Az UmVzcG9uc2Ugc2VuZENvbW1hbmQoUE9QM0NvbW1hbmQgY21kKSB0aHJvd3MgTWVzc2FnaW5nRXhj ZXB0aW9uDQorCXsNCisJCWlmKHNvYy5pc0Nvbm5lY3RlZCgpKXsNCisJCQkNCisJCQkvL2lmIHRo ZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaXMgZG93bg0KKwkJCS8vIGF0dGVtcHQgdG8gcmVi dWlsZCB0aGUgd3JpdGVyDQorCQkJaWYoc29jLmlzT3V0cHV0U2h1dGRvd24oKSl7DQorCQkJCWJ1 aWxkT3V0cHV0V3JpdGVyKCk7DQorCQkJfQ0KKwkJCQ0KKw0KKwkJCS8vIGlmIHRoZSB1bmRlcmx5 aW5nIGlub3V0IHN0cmVhbSBpcyBkb3duDQorCQkJLy8gYXR0ZW1wdCB0byByZWJ1aWxkIHRoZSBy ZWFkZXINCisJCQlpZihzb2MuaXNJbnB1dFNodXRkb3duKCkpew0KKwkJCQlidWlsZElucHV0UmVh ZGVyKCk7DQorCQkJfQ0KKwkJCQ0KKwkJCWlmKHNlc3Npb24uZ2V0RGVidWcoKSl7DQorCQkJCXNl c3Npb24uZ2V0RGVidWdPdXQoKS5wcmludGxuKCJcbkNvbW1hbmQgc2VudCAiICsgY21kLmdldENv bW1hbmQoKSApOw0KKwkJCX0NCisJCQkNCisJCQlQT1AzUmVzcG9uc2UgcmVzID0gbnVsbDsNCisJ CQkNCisJCQkvLyB0aGlzIG1ldGhvZCBzdXByZXNzZXMgSU9FeGNlcHRpb24NCisJCQkvLyBidXQg Y2hvb3NlIGJjb3Mgb2YgZWFzZSBvZiB1c2UNCisJCQl7DQorCQkJCXdyaXRlci53cml0ZShjbWQu Z2V0Q29tbWFuZCgpKTsNCisJCQkJd3JpdGVyLmZsdXNoKCk7DQorCQkJCXJlcyA9IFBPUDNSZXNw b25zZUJ1aWxkZXIuYnVpbGRSZXNwb25zZShzZXNzaW9uLHJlYWRlcixjbWQuaXNNdWx0aUxpbmVS ZXNwb25zZSgpKTsNCisJCQl9CQkgICAgDQorCQkJCQ0KKwkJCXJldHVybiByZXM7DQorCQl9DQor CQkNCisJCXRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIkNvbm5lY3Rpb24gdG8gTWFpbCBT ZXJ2ZXIgaXMgbG9zdCwgY29ubmVjdGlvbiAiICsgdGhpcy50b1N0cmluZygpKTsNCisJfQ0KKwkN CisJcHJpdmF0ZSB2b2lkIGJ1aWxkSW5wdXRSZWFkZXIoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0 aW9ueyANCisJCXRyeXsNCisJCQlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoDQorCQkJCQkJ bmV3IElucHV0U3RyZWFtUmVhZGVyKHNvYy5nZXRJbnB1dFN0cmVhbSgpKSk7DQorCQl9Y2F0Y2go SU9FeGNlcHRpb24gZSl7DQorCQkJdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigiRXJyb3Ig b2J0YWluaW5nIGlucHV0IHN0cmVhbSAiICsgdGhpcy50b1N0cmluZygpLGUpOw0KKwkJfQkNCisJ fQ0KKwkNCisJcHJpdmF0ZSB2b2lkIGJ1aWxkT3V0cHV0V3JpdGVyKCkgdGhyb3dzIE1lc3NhZ2lu Z0V4Y2VwdGlvbnsNCisJCXRyeXsNCisJCQl3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoDQorCQkJ CQkJbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvYy5nZXRPdXRwdXRTdHJlYW0oKSkpOw0KKwkJ fWNhdGNoKElPRXhjZXB0aW9uIGUpew0KKwkJCXRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24o IkVycm9yIG9idGFpbmluZyBvdXRwdXQgc3RyZWFtICIgKyB0aGlzLnRvU3RyaW5nKCksZSk7DQor CQl9DQorCX0JDQorCQkNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpDQorCXsNCisJCXJldHVy biAiUE9QM0Nvbm5lY3Rpb24gaG9zdDogIiArIGhvc3QgKyAiIHBvcnQ6ICIgKyBwb3J0Ow0KKwl9 DQorfQ0KSW5kZXg6IHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUv cG9wMy9tZXNzYWdlL1BPUDNNZXNzYWdlV2l0aEZsYWdzLmphdmENCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBz cmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvbWVzc2FnZS9Q T1AzTWVzc2FnZVdpdGhGbGFncy5qYXZhCShyZXZpc2lvbiAwKQ0KKysrIHNyYy9qYXZhL29yZy9h cGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9wMy9tZXNzYWdlL1BPUDNNZXNzYWdlV2l0 aEZsYWdzLmphdmEJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDQxIEBADQorLyoqDQorICoNCisg KiBDb3B5cmlnaHQgMjAwMy0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KKyAq DQorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRo ZSAiTGljZW5zZSIpOw0KKyAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBv ZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNl bnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxl IGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiAgZGlzdHJpYnV0ZWQg dW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisg KiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl eHByZXNzIG9yIGltcGxpZWQuDQorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmlj IGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiAgbGltaXRhdGlvbnMgdW5k ZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmdlcm9uaW1vLmph dmFtYWlsLnN0b3JlLnBvcDMubWVzc2FnZTsNCisNCitpbXBvcnQgamF2YXgubWFpbC5Gb2xkZXI7 DQoraW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZheC5t YWlsLlNlc3Npb247DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1haWwuc3Rv cmUucG9wMy5QT1AzQ29ubmVjdGlvbjsNCisNCisvKioNCisgKiBsaWdodC13ZWlnaHQgTWVzc2Fn ZSBvYmplY3QNCisgKiB3aWxsIGJlIGNyZWF0ZWQgaW4gcmVzcG9uc2UgdG8gRmV0Y2hQcm9maWxl LkZMQUdTDQorICogb3RoZXIgZGV0YWlscyB3aWxsIGJlIGZpbGxlZCBvbiBkZW1hbmQNCisgKiAg DQorICogICogQHZlcnNpb24gJFJldiQgJERhdGUkIA0KKyAqLw0KKw0KK3B1YmxpYyBjbGFzcyBQ T1AzTWVzc2FnZVdpdGhGbGFncyBleHRlbmRzIFBPUDNNZXNzYWdlew0KKw0KKwlwcm90ZWN0ZWQg UE9QM01lc3NhZ2VXaXRoRmxhZ3MoRm9sZGVyIGZvbGRlciwgaW50IG1zZ251bSwNCisJCQlTZXNz aW9uIHNlc3Npb24sUE9QM0Nvbm5lY3Rpb24gcG9wM0NvbikgdGhyb3dzIE1lc3NhZ2luZ0V4Y2Vw dGlvbiB7DQorCQlzdXBlcihmb2xkZXIsIG1zZ251bSwgc2Vzc2lvbiwgcG9wM0Nvbik7DQorCQl0 aGlzLmdldEZsYWdzKCk7DQorCX0NCit9DQpJbmRleDogc3JjL2phdmEvb3JnL2FwYWNoZS9nZXJv bmltby9qYXZhbWFpbC9zdG9yZS9wb3AzL21lc3NhZ2UvUE9QM01lc3NhZ2VXaXRoRW52ZWxvcGUu amF2YQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQ0KLS0tIHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1h aWwvc3RvcmUvcG9wMy9tZXNzYWdlL1BPUDNNZXNzYWdlV2l0aEVudmVsb3BlLmphdmEJKHJldmlz aW9uIDApDQorKysgc3JjL2phdmEvb3JnL2FwYWNoZS9nZXJvbmltby9qYXZhbWFpbC9zdG9yZS9w b3AzL21lc3NhZ2UvUE9QM01lc3NhZ2VXaXRoRW52ZWxvcGUuamF2YQkocmV2aXNpb24gMCkNCkBA IC0wLDAgKzEsNDkgQEANCisvKioNCisgKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDUgVGhlIEFw YWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQorICoNCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFw YWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogIHlvdSBtYXkg bm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4N CisgKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAg ICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiAg VW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5n LCBzb2Z0d2FyZQ0KKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmli dXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09O RElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiAgU2Vl IHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Np b25zIGFuZA0KKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitw YWNrYWdlIG9yZy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1haWwuc3RvcmUucG9wMy5tZXNzYWdlOw0K Kw0KK2ltcG9ydCBqYXZheC5tYWlsLkZvbGRlcjsNCitpbXBvcnQgamF2YXgubWFpbC5NZXNzYWdp bmdFeGNlcHRpb247DQoraW1wb3J0IGphdmF4Lm1haWwuU2Vzc2lvbjsNCitpbXBvcnQgamF2YXgu bWFpbC5pbnRlcm5ldC5NaW1lTWVzc2FnZS5SZWNpcGllbnRUeXBlOw0KKw0KK2ltcG9ydCBvcmcu YXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0b3JlLnBvcDMuUE9QM0Nvbm5lY3Rpb247DQorDQor LyoqDQorICogbGlnaHQtd2VpZ2h0IE1lc3NhZ2Ugb2JqZWN0DQorICogd2lsbCBiZSBjcmVhdGVk IGluIHJlc3BvbnNlIHRvIEZldGNoUHJvZmlsZS5FTlZFTE9QRQ0KKyAqIG90aGVyIGRldGFpbHMg d2lsbCBiZSBmaWxsZWQgb24gZGVtYW5kDQorICogDQorICogKiBAdmVyc2lvbiAkUmV2JCAkRGF0 ZSQgICANCisgKi8NCisNCisNCitwdWJsaWMgY2xhc3MgUE9QM01lc3NhZ2VXaXRoRW52ZWxvcGUg ZXh0ZW5kcyBQT1AzTWVzc2FnZSB7DQorDQorCXByb3RlY3RlZCBQT1AzTWVzc2FnZVdpdGhFbnZl bG9wZShGb2xkZXIgZm9sZGVyLCBpbnQgbXNnbnVtLA0KKwkJCVNlc3Npb24gc2Vzc2lvbixQT1Az Q29ubmVjdGlvbiBwb3AzQ29uKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsNCisJCXN1cGVy KGZvbGRlciwgbXNnbnVtLCBzZXNzaW9uLCBwb3AzQ29uKTsNCisJCXRoaXMuZ2V0QWxsSGVhZGVy cygpOw0KKwkJdGhpcy5nZXRTZW5kZXIoKTsNCisJCXRoaXMuZ2V0U2VudERhdGUoKTsNCisJCXRo aXMuZ2V0U3ViamVjdCgpOw0KKwkJdGhpcy5nZXRSZXBseVRvKCk7DQorCQl0aGlzLmdldFJlY2Vp dmVkRGF0ZSgpOw0KKwkJdGhpcy5nZXRSZWNpcGllbnRzKFJlY2lwaWVudFR5cGUuVE8pOw0KKwl9 DQorfQ0KSW5kZXg6IHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUv cG9wMy9tZXNzYWdlL1BPUDNNZXNzYWdlLmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzcmMvamF2YS9v cmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvbWVzc2FnZS9QT1AzTWVzc2Fn ZS5qYXZhCShyZXZpc2lvbiAwKQ0KKysrIHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2 YW1haWwvc3RvcmUvcG9wMy9tZXNzYWdlL1BPUDNNZXNzYWdlLmphdmEJKHJldmlzaW9uIDApDQpA QCAtMCwwICsxLDI1NSBAQA0KKy8qKg0KKyAqDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNSBUaGUg QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCisgKg0KKyAqICBMaWNlbnNlZCB1bmRlciB0aGUg QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiAgeW91IG1h eSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNl Lg0KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAq ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAq ICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRp bmcsIHNvZnR3YXJlDQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3Ry aWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBD T05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqICBT ZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlz c2lvbnMgYW5kDQorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0K K3BhY2thZ2Ugb3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbC5zdG9yZS5wb3AzLm1lc3NhZ2U7 DQorDQoraW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7DQoraW1wb3J0IGphdmEuaW8uQnl0 ZUFycmF5SW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFt Ow0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3Ry ZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOw0KK2ltcG9ydCBqYXZhLnV0 aWwuRW51bWVyYXRpb247DQorDQoraW1wb3J0IGphdmF4Lm1haWwuRmxhZ3M7DQoraW1wb3J0IGph dmF4Lm1haWwuRm9sZGVyOw0KK2ltcG9ydCBqYXZheC5tYWlsLkhlYWRlcjsNCitpbXBvcnQgamF2 YXgubWFpbC5JbGxlZ2FsV3JpdGVFeGNlcHRpb247DQoraW1wb3J0IGphdmF4Lm1haWwuTWVzc2Fn aW5nRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZheC5tYWlsLlNlc3Npb247DQoraW1wb3J0IGphdmF4 Lm1haWwuZXZlbnQuTWVzc2FnZUNoYW5nZWRFdmVudDsNCitpbXBvcnQgamF2YXgubWFpbC5pbnRl cm5ldC5JbnRlcm5ldEhlYWRlcnM7DQoraW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1l c3NhZ2U7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1haWwuc3RvcmUucG9w My5QT1AzQ29tbWFuZEZhY3Rvcnk7DQoraW1wb3J0IG9yZy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1h aWwuc3RvcmUucG9wMy5QT1AzQ29ubmVjdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5nZXJvbmlt by5qYXZhbWFpbC5zdG9yZS5wb3AzLlBPUDNGb2xkZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUuZ2Vy b25pbW8uamF2YW1haWwuc3RvcmUucG9wMy5QT1AzUmVzcG9uc2U7DQoraW1wb3J0IG9yZy5hcGFj aGUuZ2Vyb25pbW8uamF2YW1haWwuc3RvcmUucG9wMy5yZXNwb25zZS5QT1AzTGlzdFJlc3BvbnNl Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0b3JlLnBvcDMucmVzcG9u c2UuUE9QM1Jlc3BvbnNlRmFjdG9yeTsNCitpbXBvcnQgb3JnLmFwYWNoZS5nZXJvbmltby5qYXZh bWFpbC5zdG9yZS5wb3AzLnJlc3BvbnNlLlBPUDNTdGF0dXNSZXNwb25zZTsNCisNCisNCisvKioN CisgKiBQT1AzIGltcGxlbWVudGF0aW9uIG9mIGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3Nh Z2UgDQorICogDQorICogT25seSB0aGUgbW9zdCBiYXNpYyBpbmZvcm1hdGlvbiBpcyBnaXZlbiBh bmQNCisgKiBNZXNzYWdlIG9iamVjdHMgY3JlYXRlZCBoZXJlIGlzIGEgbGlnaHQtd2VpZ2h0IHJl ZmVyZW5jZSB0byB0aGUgYWN0dWFsIE1lc3NhZ2UNCisgKiBBcyBwZXIgdGhlIEphdmFNYWlsIHNw ZWMgaXRlbXMgZnJvbSB0aGUgYWN0dWFsIG1lc3NhZ2Ugd2lsbCBnZXQgZmlsbGVkIHVwIG9uIGRl bWFuZA0KKyAqICANCisgKiBJZiBzb21lIG90aGVyIGl0ZW1zIGFyZSBvYnRhaW5lZCBmcm9tIHRo ZSBzZXJ2ZXIgYXMgYSByZXN1bHQgb2Ygb25lIGNhbGwsIHRoZW4gdGhlIG90aGVyDQorICogZGV0 YWlscyBhcmUgYWxzbyBwcm9jZXNzZWQgYW5kIGZpbGxlZCBpbi4gRm9yIGV4IGlmIFJFVFIgaXMg Y2FsbGVkIHRoZW4gaGVhZGVyIGluZm9ybWF0aW9uDQorICogd2lsbCBhbHNvIGJlIHByb2Nlc3Nl ZCBpbiBhZGRpdGlvbiB0byB0aGUgY29udGVudA0KKyAqICANCisgKiBAdmVyc2lvbiAkUmV2JCAk RGF0ZSQgDQorICovDQorcHVibGljIGNsYXNzIFBPUDNNZXNzYWdlIGV4dGVuZHMgTWltZU1lc3Nh Z2Ugew0KKw0KKwlwcml2YXRlIFBPUDNDb25uZWN0aW9uIHBvcDNDb247DQorCXByaXZhdGUgaW50 IG1zZ1NpemUgPSAtMTsNCisJcHJpdmF0ZSBpbnQgaGVhZGVyU2l6ZSA9IC0xOw0KKwkNCisJLy8g V2UgY2FuJ3QgdXNlIGhlYWRlciBiY29zIGl0J3MgYWxyZWFkeSBpbml0aWFsaXplIHRvDQorCS8v IHRvIGFuIGVtcHR5IEludGVybmV0SGVhZGVyDQorCXByaXZhdGUgSW5wdXRTdHJlYW0gcmF3SGVh ZGVyczsNCisJDQorCS8vIHVzZWQgdG8gZm9yY2UgbG9hZGluZyBvZiBoZWFkZXJzIGFnYWluDQor CXByaXZhdGUgYm9vbGVhbiBsb2FkSGVhZGVycyA9IHRydWU7DQorCQ0KKwkvLyB0byBnZXQgYWNj ZXNzZWQgdG8gdGhlIGRlYnVnIHNldHRpbmcgYW5kIGxvZw0KKwlwcml2YXRlIFNlc3Npb24gc2Vz c2lvbjsNCisJDQorCXByb3RlY3RlZCBQT1AzTWVzc2FnZShGb2xkZXIgZm9sZGVyLCBpbnQgbXNn bnVtLCBTZXNzaW9uIHNlc3Npb24sIFBPUDNDb25uZWN0aW9uIHBvcDNDb24pIHsNCisJCXN1cGVy KGZvbGRlciwgbXNnbnVtKTsNCisJCXRoaXMucG9wM0NvbiA9IHBvcDNDb247DQorCQl0aGlzLnNl c3Npb24gPSBzZXNzaW9uOw0KKwl9DQorCQ0KKwkvKioNCisJICogQHNlZSBqYXZheC5tYWlsLmlu dGVybmV0Lk1pbWVNZXNzYWdlI2dldENvbnRlbnRTdHJlYW0oKQ0KKwkgKi8NCisJcHJvdGVjdGVk IElucHV0U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9u IHsNCisJCVBPUDNSZXNwb25zZSBtc2dSZXNwb25zZSA9IG51bGw7DQorCQl0cnkgew0KKwkJCW1z Z1Jlc3BvbnNlID0gcG9wM0Nvbi5zZW5kQ29tbWFuZChQT1AzQ29tbWFuZEZhY3RvcnkNCisJCQkJ CS5nZXRDT01NQU5EX1JFVFIobXNnbnVtKSk7DQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0K KwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorICAgICAgICBsb2FkSGVhZGVycyA9IHRy dWU7DQorICAgICAgICBsb2FkSGVhZGVycyhtc2dSZXNwb25zZS5nZXREYXRhKCkpOw0KKyAgICAg ICAgbG9hZENvbnRlbnQobXNnUmVzcG9uc2UuZ2V0RGF0YSgpKTsNCisgICAgICAgIA0KKwkJcmV0 dXJuIGNvbnRlbnRTdHJlYW07DQorCX0NCisNCisNCisJcHVibGljIHZvaWQgc2V0RmxhZ3MoRmxh Z3MgbmV3RmxhZ3MsIGJvb2xlYW4gc2V0KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsNCisJ CUZsYWdzIG9sZEZsYWdzID0gKEZsYWdzKWZsYWdzLmNsb25lKCk7IA0KKwkJc3VwZXIuc2V0Rmxh Z3MobmV3RmxhZ3MsIHNldCk7DQorDQorCQlpZiAoIWZsYWdzLmVxdWFscyhvbGRGbGFncykpIHsN CisJCQkoKFBPUDNGb2xkZXIpIGZvbGRlcikubm90aWZ5TWVzc2FnZUNoYW5nZWRMaXN0ZW5lcnMo DQorCQkJCQlNZXNzYWdlQ2hhbmdlZEV2ZW50LkZMQUdTX0NIQU5HRUQsIHRoaXMpOw0KKwkJfQ0K Kwl9DQorCQ0KKwlwcm90ZWN0ZWQgdm9pZCBsb2FkSGVhZGVycyhJbnB1dFN0cmVhbSBpbil0aHJv d3MgTWVzc2FnaW5nRXhjZXB0aW9uew0KKwkJaWYobG9hZEhlYWRlcnMgfHwgcmF3SGVhZGVycyA9 PSBudWxsKXsNCisJCQlyYXdIZWFkZXJzID0gaW47DQorCQkJaGVhZGVycyA9IG5ldyBJbnRlcm5l dEhlYWRlcnMocmF3SGVhZGVycyk7DQorCQkJbG9hZEhlYWRlcnMgPSBmYWxzZTsNCisJCX0NCisJ fQ0KKwkNCisJcHJvdGVjdGVkIHZvaWQgbG9hZENvbnRlbnQoSW5wdXRTdHJlYW0gc3RyZWFtKXRo cm93cyBNZXNzYWdpbmdFeGNlcHRpb257DQorCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0g IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsJCQ0KKwkJdHJ5IHsNCisJCQlpbnQgYnl0ZVJl YWQgPSBzdHJlYW0ucmVhZCgpOw0KKwkJCWludCBsYXN0Qnl0ZSA9IC0xOw0KKwkJCWZvcig7Ynl0 ZVJlYWQgPiAwOyl7DQorCQkJCWlmKGJ5dGVSZWFkID09ICcgJyAmJiBsYXN0Qnl0ZSA9PSAnXG4n KXsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJCWxhc3RCeXRlID0gYnl0ZVJlYWQ7DQorCQkJ CWJ5dGVSZWFkID0gc3RyZWFtLnJlYWQoKTsNCisJCQl9DQorCQkJDQorCQkJZm9yKDtzdHJlYW0u YXZhaWxhYmxlKCk+MDspew0KKwkJCQlvdXQud3JpdGUoc3RyZWFtLnJlYWQoKSk7DQorCQkJfQ0K KwkJCQ0KKwkJCWNvbnRlbnRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRv Qnl0ZUFycmF5KCkpOw0KKwkJCW1zZ1NpemUgPSBjb250ZW50U3RyZWFtLmF2YWlsYWJsZSgpOw0K KwkJCQ0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKwkJICAgDQorCQkJdGhyb3cgbmV3 IE1lc3NhZ2luZ0V4Y2VwdGlvbigiRXJyb3IgbG9hZGluZyBjb250ZW50IGluZm8iLGUpOw0KKwkJ fQkJDQorCX0NCisJDQorCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHRocm93cyBNZXNzYWdpbmdFeGNl cHRpb24gew0KKwkJaWYgKG1zZ1NpemUgPj0gMCkgew0KKwkJCXJldHVybiBtc2dTaXplOw0KKwkJ fQ0KKwkJdHJ5IHsNCisNCisJCQlpZiAobXNnU2l6ZSA8IDApIHsNCisJCQkJaWYgKHJhd0hlYWRl cnMgPT0gbnVsbCkgew0KKwkJCQkJbG9hZEhlYWRlcnMoKTsNCisJCQkJfQ0KKwkJCQlQT1AzTGlz dFJlc3BvbnNlIHJlcyA9IChQT1AzTGlzdFJlc3BvbnNlKSBQT1AzUmVzcG9uc2VGYWN0b3J5DQor CQkJCQkJLmdldExpc3RSZXNwb25zZShwb3AzQ29uLnNlbmRDb21tYW5kKFBPUDNDb21tYW5kRmFj dG9yeQ0KKwkJCQkJCQkJLmdldENPTU1BTkRfTElTVChtc2dudW0pKSk7DQorCQkJCW1zZ1NpemUg PSByZXMuZ2V0U2l6ZSgpIC0gaGVhZGVyU2l6ZTsNCisJCQl9DQorCQkJcmV0dXJuIG1zZ1NpemU7 DQorCQl9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZXgpIHsNCisJCQl0aHJvdyBuZXcgTWVz c2FnaW5nRXhjZXB0aW9uKCJlcnJvciBnZXR0aW5nIHNpemUiLCBleCk7DQorCQl9DQorCX0NCisN CisJLyoqDQorCSAqIG5vdGljZSB0aGF0IHdlIHBhc3MgemVybyBhcyB0aGUgbm8gb2YgbGluZXMg ZnJvbSB0aGUgbWVzc2FnZSxhcyBpdA0KKwkgKiBkb2Vzbid0IHNlcnYgYW55IHB1cnBvc2UgdG8g Z2V0IG9ubHkgYSBjZXJ0YWluIG51bWJlciBvZiBsaW5lcy4NCisJICogDQorCSAqIEhvd2V2ZXIg dGhpcyBtYXliZSBpbXBvcnRhbnQgaWYgYSBtYWlsIGNsaWVudCBvbmx5IHNob3dzIDMgb3IgNCBs aW5lcyBvZiB0aGUNCisJICogbWVzc2FnZSBpbiB0aGUgbGlzdCBhbmQgdGhlbiB3aGVuIHRoZSB1 c2VyIGNsaWNrcyB0aGV5IHdvdWxkIGxvYWQgdGhlDQorCSAqIG1lc3NhZ2Ugb24gZGVtYW5kLg0K KwkgKiANCisJICovDQorCXByb3RlY3RlZCB2b2lkIGxvYWRIZWFkZXJzKCkgdGhyb3dzIE1lc3Nh Z2luZ0V4Y2VwdGlvbnsNCisJCVBPUDNSZXNwb25zZSBtc2dSZXNwb25zZSA9IG51bGw7DQorCQl0 cnkgew0KKwkJCSANCisJCQkNCisJCQltc2dSZXNwb25zZSA9IHBvcDNDb24uc2VuZENvbW1hbmQo UE9QM0NvbW1hbmRGYWN0b3J5DQorCQkJCQkuZ2V0Q09NTUFORF9UT1AobXNnbnVtLDApKTsNCisJ CX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0N CisJCWxvYWRIZWFkZXJzKG1zZ1Jlc3BvbnNlLmdldERhdGEoKSk7DQorCX0NCisJDQorCS8qKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioNCisJICogRm9sbG93aW5nIGlzIGEgc2V0IG9mIG1ldGhvZHMgdGhhdCBkZWFsIHdpdGgg aGVhZGVycw0KKwkgKiBJIGhhdmUgdHJpZWQgdG8gdXNlIHRoZSBiYXJlIG1pbmltdW0NCisJICog DQorCSAqIFVzZWQgc3VuJ3MgUE9QMyBpbXBsICYgSmF2YU1haWwgQVBJIGFzIGEgZ3VpZGUgaW4g ZGVjaWRlZCB3aGljaA0KKwkgKiBtZXRob2RzIGFyZSBpbXBvcnRhbnQuDQorCSAqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Ki8NCisJDQorCXB1YmxpYyBTdHJpbmdbXSBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBN ZXNzYWdpbmdFeGNlcHRpb24gew0KKwkJaWYgKHJhd0hlYWRlcnMgPT0gbnVsbCkNCisJCQlsb2Fk SGVhZGVycygpOw0KKwkJcmV0dXJuIGhlYWRlcnMuZ2V0SGVhZGVyKG5hbWUpOw0KKwl9DQorDQor CXB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVsaW1pdGVyKQ0K KwkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gew0KKwkJaWYgKGhlYWRlcnMgPT0gbnVsbCkN CisJCQlsb2FkSGVhZGVycygpOw0KKwkJcmV0dXJuIGhlYWRlcnMuZ2V0SGVhZGVyKG5hbWUsIGRl bGltaXRlcik7DQorCX0NCisNCisJcHVibGljIEVudW1lcmF0aW9uIGdldEFsbEhlYWRlcnMoKSB0 aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsNCisJCWlmIChoZWFkZXJzID09IG51bGwpDQorCQkJ bG9hZEhlYWRlcnMoKTsNCisJCXJldHVybiBoZWFkZXJzLmdldEFsbEhlYWRlcnMoKTsNCisJfQ0K Kw0KKwlwdWJsaWMgRW51bWVyYXRpb24gZ2V0TWF0Y2hpbmdIZWFkZXJzKFN0cmluZ1tdIG5hbWVz KQ0KKwkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gew0KKwkJaWYgKGhlYWRlcnMgPT0gbnVs bCkNCisJCQlsb2FkSGVhZGVycygpOw0KKwkJcmV0dXJuIGhlYWRlcnMuZ2V0TWF0Y2hpbmdIZWFk ZXJzKG5hbWVzKTsNCisJfQ0KKw0KKwlwdWJsaWMgRW51bWVyYXRpb24gZ2V0Tm9uTWF0Y2hpbmdI ZWFkZXJzKFN0cmluZ1tdIG5hbWVzKQ0KKwkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gew0K KwkJaWYgKGhlYWRlcnMgPT0gbnVsbCkNCisJCQlsb2FkSGVhZGVycygpOw0KKwkJcmV0dXJuIGhl YWRlcnMuZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJzKG5hbWVzKTsNCisJfQ0KKw0KKwlwdWJsaWMgRW51 bWVyYXRpb24gZ2V0QWxsSGVhZGVyTGluZXMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsN CisJCWlmIChoZWFkZXJzID09IG51bGwpDQorCQkJbG9hZEhlYWRlcnMoKTsNCisJCXJldHVybiBo ZWFkZXJzLmdldEFsbEhlYWRlckxpbmVzKCk7DQorCX0NCisNCisJcHVibGljIEVudW1lcmF0aW9u IGdldE1hdGNoaW5nSGVhZGVyTGluZXMoU3RyaW5nW10gbmFtZXMpDQorCQkJdGhyb3dzIE1lc3Nh Z2luZ0V4Y2VwdGlvbiB7DQorCQlpZiAoaGVhZGVycyA9PSBudWxsKQ0KKwkJCWxvYWRIZWFkZXJz KCk7DQorCQlyZXR1cm4gaGVhZGVycy5nZXRNYXRjaGluZ0hlYWRlckxpbmVzKG5hbWVzKTsNCisJ fQ0KKw0KKwlwdWJsaWMgRW51bWVyYXRpb24gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJMaW5lcyhTdHJp bmdbXSBuYW1lcykNCisJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsNCisJCWlmIChoZWFk ZXJzID09IG51bGwpDQorCQkJbG9hZEhlYWRlcnMoKTsNCisJCXJldHVybiBoZWFkZXJzLmdldE5v bk1hdGNoaW5nSGVhZGVyTGluZXMobmFtZXMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBXZSBjYW5u b3QgbW9kaWZ5IHRoZXNlIG1lc3NhZ2VzDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzYXZlQ2hhbmdl cygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gew0KKwkJdGhyb3cgbmV3IElsbGVnYWxXcml0 ZUV4Y2VwdGlvbigiUE9QMyBtZXNzYWdlcyBhcmUgcmVhZC1vbmx5Iik7DQorCX0NCit9DQpJbmRl eDogc3JjL2phdmEvb3JnL2FwYWNoZS9nZXJvbmltby9qYXZhbWFpbC9zdG9yZS9wb3AzL21lc3Nh Z2UvUE9QM01lc3NhZ2VXaXRoQ29udGVudEluZm8uamF2YQ0KPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNyYy9q YXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9wMy9tZXNzYWdlL1BPUDNN ZXNzYWdlV2l0aENvbnRlbnRJbmZvLmphdmEJKHJldmlzaW9uIDApDQorKysgc3JjL2phdmEvb3Jn L2FwYWNoZS9nZXJvbmltby9qYXZhbWFpbC9zdG9yZS9wb3AzL21lc3NhZ2UvUE9QM01lc3NhZ2VX aXRoQ29udGVudEluZm8uamF2YQkocmV2aXNpb24gMCkNCkBAIC0wLDAgKzEsNDcgQEANCisvKioN CisgKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uDQorICoNCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9u IDIuMCAodGhlICJMaWNlbnNlIik7DQorICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiAgWW91IG1heSBvYnRhaW4g YSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUu b3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFw cGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqICBkaXN0 cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJB U0lTLA0KKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwg ZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUg c3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqICBsaW1pdGF0 aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuZ2Vy b25pbW8uamF2YW1haWwuc3RvcmUucG9wMy5tZXNzYWdlOw0KKw0KK2ltcG9ydCBqYXZheC5tYWls LkZvbGRlcjsNCitpbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247DQoraW1wb3J0 IGphdmF4Lm1haWwuU2Vzc2lvbjsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5nZXJvbmltby5qYXZh bWFpbC5zdG9yZS5wb3AzLlBPUDNDb25uZWN0aW9uOw0KKw0KKy8qKg0KKyAqIGxpZ2h0LXdlaWdo dCBNZXNzYWdlIG9iamVjdA0KKyAqIHdpbGwgYmUgY3JlYXRlZCBpbiByZXNwb25zZSB0byBGZXRj aFByb2ZpbGUuQ09OVEVOVF9JTkZPDQorICogb3RoZXIgZGV0YWlscyB3aWxsIGJlIGZpbGxlZCBv biBkZW1hbmQNCisgKiANCisgKiAqIEB2ZXJzaW9uICRSZXYkICREYXRlJCANCisgKiAgDQorICov DQorDQorcHVibGljIGNsYXNzIFBPUDNNZXNzYWdlV2l0aENvbnRlbnRJbmZvIGV4dGVuZHMgUE9Q M01lc3NhZ2Ugew0KKw0KKwlwdWJsaWMgUE9QM01lc3NhZ2VXaXRoQ29udGVudEluZm8oRm9sZGVy IGZvbGRlciwgaW50IG1zZ251bSwNCisJCQlTZXNzaW9uIHNlc3Npb24sUE9QM0Nvbm5lY3Rpb24g cG9wM0NvbikgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbnsNCisJCXN1cGVyKGZvbGRlciwgbXNn bnVtLCBudWxsLCBwb3AzQ29uKTsNCisJCXRoaXMuZ2V0Q29udGVudFR5cGUoKTsNCisJCXRoaXMu Z2V0RGlzcG9zaXRpb24oKTsNCisJCXRoaXMuZ2V0RGVzY3JpcHRpb24oKTsNCisJCXRoaXMuZ2V0 U2l6ZSgpOw0KKwkJdGhpcy5nZXRMaW5lQ291bnQoKTsNCisJfQ0KKw0KK30NCkluZGV4OiBzcmMv amF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvbWVzc2FnZS9QT1Az TWVzc2FnZUZhY3RvcnkuamF2YQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNyYy9qYXZhL29yZy9hcGFjaGUv Z2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9wMy9tZXNzYWdlL1BPUDNNZXNzYWdlRmFjdG9yeS5q YXZhCShyZXZpc2lvbiAwKQ0KKysrIHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1h aWwvc3RvcmUvcG9wMy9tZXNzYWdlL1BPUDNNZXNzYWdlRmFjdG9yeS5qYXZhCShyZXZpc2lvbiAw KQ0KQEAgLTAsMCArMSw4NSBAQA0KKy8qKg0KKyAqDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNSBU aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCisgKg0KKyAqICBMaWNlbnNlZCB1bmRlciB0 aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiAgeW91 IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNl bnNlLg0KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0K KyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0K KyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdy aXRpbmcsIHNvZnR3YXJlDQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRp c3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogIFdJVEhPVVQgV0FSUkFOVElFUyBP UiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAq ICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVy bWlzc2lvbnMgYW5kDQorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0K Kw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbC5zdG9yZS5wb3AzLm1lc3Nh Z2U7DQorDQoraW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnZTsNCitpbXBvcnQgamF2YXgubWFpbC5N ZXNzYWdpbmdFeGNlcHRpb247DQoraW1wb3J0IGphdmF4Lm1haWwuU2Vzc2lvbjsNCitpbXBvcnQg amF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTWVzc2FnZS5SZWNpcGllbnRUeXBlOw0KKw0KK2ltcG9y dCBvcmcuYXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0b3JlLnBvcDMuUE9QM0Nvbm5lY3Rpb247 DQoraW1wb3J0IG9yZy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1haWwuc3RvcmUucG9wMy5QT1AzRm9s ZGVyOw0KKw0KKy8qKg0KKyAqIEZjdG9yeSBjbGFzcyB0byBjcmVhdGUgUE9QM01lc3NhZ2VzIGJh c2VkIG9uIHRoZSBmZXRjaCBwcm9maWxlDQorICogIA0KKyAqIEB2ZXJzaW9uICRSZXYkICREYXRl JCANCisgKi8NCitwdWJsaWMgZmluYWwgY2xhc3MgUE9QM01lc3NhZ2VGYWN0b3J5IHsNCisNCisJ LyoqDQorCSAqIENyZWF0ZXMgYSBiYXNpYyBtZXRob2Qgd2l0aCBubyBpdGVtcywgdGhlIGl0ZW1z DQorCSAqIHdpbGwgYmUgbG9hZGVkIG9uIGRlbWFuZA0KKwkgKiBAcGFyYW0gZm9sZGVyDQorCSAq IEBwYXJhbSBzZXNzaW9uDQorCSAqIEBwYXJhbSBwb3AzQ29uDQorCSAqIEBwYXJhbSBtc2dOdW0N CisJICogQHJldHVybg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZU1lc3Nh Z2UoUE9QM0ZvbGRlciBmb2xkZXIsIFNlc3Npb24gc2Vzc2lvbiwNCisJCQlQT1AzQ29ubmVjdGlv biBwb3AzQ29uLCBpbnQgbXNnTnVtKSB7DQorCQlyZXR1cm4gbmV3IFBPUDNNZXNzYWdlKGZvbGRl cixtc2dOdW0sc2Vzc2lvbixwb3AzQ29uKTsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlZCBp biByZXNwb25zZSB0byA8Y3BkZT5GZXRjaFByb2ZpbGUuRU5WRUxPUEU8L2NvZGU+DQorCSAqLw0K KwlwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZVdpdGhFdmVsb3BlKFBPUDNNZXNz YWdlIG1zZykgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7DQorCQltc2cuZ2V0QWxsSGVhZGVy cygpOw0KKwkJbXNnLmdldFNlbmRlcigpOw0KKwkJbXNnLmdldFNlbnREYXRlKCk7DQorCQltc2cu Z2V0U3ViamVjdCgpOw0KKwkJbXNnLmdldFJlcGx5VG8oKTsNCisJCW1zZy5nZXRSZWNlaXZlZERh dGUoKTsNCisJCW1zZy5nZXRSZWNpcGllbnRzKFJlY2lwaWVudFR5cGUuVE8pOw0KKwkJDQorCQly ZXR1cm4gbXNnOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVkIGluIHJlc3BvbnNlIHRvIDxj b2RlPkZldGNoUHJvZmlsZS5DT05URU5UX0lORk88L2NvZGU+DQorCSAqLw0KKwlwdWJsaWMgc3Rh dGljIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZVdpdGhDb250ZW50SW5mbyhQT1AzTWVzc2FnZSBtc2cp IHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gew0KKwkJbXNnLmdldENvbnRlbnRUeXBlKCk7DQor CQltc2cuZ2V0RGlzcG9zaXRpb24oKTsNCisJCW1zZy5nZXREZXNjcmlwdGlvbigpOw0KKwkJbXNn LmdldFNpemUoKTsNCisJCW1zZy5nZXRMaW5lQ291bnQoKTsNCisJCQ0KKwkJcmV0dXJuIG1zZzsN CisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlZCBpbiByZXNwb25zZSB0byA8Y29kZT5GZXRjaFBy b2ZpbGUuRkxBR1M8L2NvZGU+DQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRl TWVzc2FnZVdpdGhGbGFncyhQT1AzTWVzc2FnZSBtc2cpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRp b24gew0KKwkJbXNnLmdldEZsYWdzKCk7DQorCQlyZXR1cm4gbXNnOw0KKwl9DQorDQorfQ0KSW5k ZXg6IHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9wMy9QT1Az UmVzcG9uc2VCdWlsZGVyLmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzcmMvamF2YS9vcmcvYXBhY2hl L2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvUE9QM1Jlc3BvbnNlQnVpbGRlci5qYXZhCShy ZXZpc2lvbiAwKQ0KKysrIHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3Rv cmUvcG9wMy9QT1AzUmVzcG9uc2VCdWlsZGVyLmphdmEJKHJldmlzaW9uIDApDQpAQCAtMCwwICsx LDEyOSBAQA0KKy8qKg0KKyAqDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNSBUaGUgQXBhY2hlIFNv ZnR3YXJlIEZvdW5kYXRpb24NCisgKg0KKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExp Y2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiAgeW91IG1heSBub3QgdXNl IHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqICBZ b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRw Oi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqICBVbmxlc3Mg cmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3 YXJlDQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9u IGFuICJBUyBJUyIgQkFTSVMsDQorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05T IE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqICBTZWUgdGhlIExp Y2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5k DQorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2Ug b3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbC5zdG9yZS5wb3AzOw0KKw0KK2ltcG9ydCBqYXZh LmlvLkJ1ZmZlcmVkUmVhZGVyOw0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFt Ow0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5p by5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCisNCitpbXBvcnQg amF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247DQoraW1wb3J0IGphdmF4Lm1haWwuU2Vzc2lv bjsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbC5zdG9yZS5wb3AzLnJl c3BvbnNlLlBPUDNSZXNwb25zZUZhY3Rvcnk7Ow0KKw0KKy8qKg0KKyAqIEJ1aWxkcyBhIGJhc2lj IHJlc3BvbnNlIG91dCBvZiB0aGUgaW5wdXQgc3RyZWFtIHJlY2VpdmVkIGJ5IHRoZQ0KKyAqIGNv bm5lY3Rpb24uDQorICogUGVyZm9ybXMgb25seSB0d28gYmFzaWMgZnVuY3Rpb25zDQorICogPHVs Pg0KKyAqIDxsaT5FeHRyYXRzIHRoZSBzdGF0dXMgY29kZTwvbGk+DQorICogPGxpPklmIG11bHRp LWxpbmUgcmVzcG9uc2UgdGhlbiBleHRyYWN0IHRoZSBkYXRhIGFzIGFuIGlucHV0IHN0cmVhbTwv bGk+DQorICogPC91bD4NCisgKiAgDQorICogQHZlcnNpb24gJFJldiQgJERhdGUkIA0KKyAqLw0K Kw0KK3B1YmxpYyBmaW5hbCBjbGFzcyBQT1AzUmVzcG9uc2VCdWlsZGVyIGltcGxlbWVudHMgUE9Q M0NvbnN0YW50c3sNCisJDQorCXB1YmxpYyBzdGF0aWMgUE9QM1Jlc3BvbnNlIGJ1aWxkUmVzcG9u c2UoU2Vzc2lvbiBzZXNzaW9uLCBCdWZmZXJlZFJlYWRlciByZWFkZXIsIGJvb2xlYW4gaXNNdWx0 aUxpbmVSZXNwb25zZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7DQorDQorCQlpbnQgc3Rh dHVzID0gRVJSOw0KKwkJSW5wdXRTdHJlYW0gZGF0YSA9IG51bGw7DQorCQkNCisJCVN0cmluZyBs aW5lOw0KKwkJdHJ5IHsNCisJCQlsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7DQorCQl9IGNhdGNo IChJT0V4Y2VwdGlvbiBlKSB7DQorCQkJdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigiRXJy b3IgaW4gcmVjZXZpbmcgcmVzcG9uc2UiKTsNCisJCX0NCisJCWlmIChsaW5lID09IG51bGwgfHwg bGluZS50cmltKCkuZXF1YWxzKCIiKSkgew0KKwkJICAgIGlmIChzZXNzaW9uLmdldERlYnVnKCkp ew0KKwkJICAgIAlzZXNzaW9uLmdldERlYnVnT3V0KCkucHJpbnRsbigiRW1wdHkgUmVzcG9uc2Ui KTsNCisJCSAgICB9CQ0KKwkJICAgIHRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIkVtcHR5 IFJlc3BvbnNlIik7DQorCQl9DQorCQlpZiAoc2Vzc2lvbi5nZXREZWJ1ZygpKXsNCisJCQlzZXNz aW9uLmdldERlYnVnT3V0KCkucHJpbnRsbigiUmVzcG9uc2UgRnJvbSBTZXJ2ZXIgIiArIGxpbmUp Ow0KKwkJfQ0KKwkJCQkNCisJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIitPSyIpKXsNCisJCQlzdGF0 dXMgPSBPSzsNCisJCQlsaW5lICAgPSByZW1vdmVTdGF0dXNGaWVsZChsaW5lKTsNCisJCQlpZihp c011bHRpTGluZVJlc3BvbnNlKXsNCisJCQkJZGF0YSA9IGdldE11bHRpTGluZVJlc3BvbnNlKHNl c3Npb24scmVhZGVyKTsNCisJCQl9DQorCQl9ZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCItRVJS Iikpew0KKwkJCXN0YXR1cyA9IEVSUjsNCisJCQlsaW5lICAgPSByZW1vdmVTdGF0dXNGaWVsZChs aW5lKTsNCisJCX1lbHNlew0KKwkJICAgIHRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIlVu ZXhwZWN0ZWQgcmVzcG9uc2U6ICIgKyBsaW5lKTsNCisJCX0NCisJCQ0KKwkJcmV0dXJuIFBPUDNS ZXNwb25zZUZhY3RvcnkuZ2V0RGVmYXVsdFJlc3BvbnNlKHN0YXR1cyxsaW5lLGRhdGEpOw0KKwl9 DQorCQ0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlU3RhdHVzRmllbGQoU3RyaW5nIGxp bmUpewkJDQorCQlyZXR1cm4gbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKFNQQUNFKSsxKTsN CisJfQ0KKwkJDQorCS8qKg0KKwkgKiBUaGlzIGNvdWxkIGJlIGEgbXVsdGlsaW5lIHJlc3BvbnNl DQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRNdWx0aUxpbmVSZXNwb25z ZShTZXNzaW9uIHNlc3Npb24sDQorCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB0aHJvd3MgTWVz c2FnaW5nRXhjZXB0aW9uIHsNCisJCQ0KKwkJaW50IGJ5dGVSZWFkID0gLTE7DQorCQlpbnQgbGFz dEJ5dGVSZWFkID0gTEY7DQorCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVB cnJheU91dHB1dFN0cmVhbSgpOw0KKwkJdHJ5IHsNCisJCQl3aGlsZSAoKGJ5dGVSZWFkID0gcmVh ZGVyLnJlYWQoKSkgPj0gMCkgew0KKwkJCQkvLyBXZSBhcmUgY2hlY2tpbmcgZm9yIHRoZSBlbmQg b2YgYSBtdWx0aWxpbmUgcmVzcG9uc2UNCisJCQkJLy8gdGhlIGZvcm1hdCBpcyAuQ1JMRg0KKwkJ CQkNCisJCQkJLy8gY2hlY2tpbmcgZm9yIHRoZSBET1QgYW5kIENSDQorCQkJCWlmIChsYXN0Qnl0 ZVJlYWQgPT0gRE9UICYmIGJ5dGVSZWFkID09IENSKSB7DQorCQkJCQlieXRlUmVhZCA9IHJlYWRl ci5yZWFkKCk7DQorCQkJCQkvLyBub3cgY2hlY2tpbmcgZm9yIHRoZSBMRiBvZiB0aGUgc2Vjb25k IENSTEYNCisJCQkJCWlmIChieXRlUmVhZCA9PSBMRikgew0KKwkJCQkJCS8vIGVuZCBvZiByZXNw b25zZQ0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCQ0KKwkJCQlvdXQud3Jp dGUoYnl0ZVJlYWQpOw0KKwkJCQlsYXN0Qnl0ZVJlYWQgPSBieXRlUmVhZDsNCisJCQl9DQorCQkJ DQorCQkJaWYoc2Vzc2lvbi5nZXREZWJ1ZygpKXsNCisJCQkJc2Vzc2lvbi5nZXREZWJ1Z091dCgp LnByaW50bG4oIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZXNwb25zZSBDb250ZW50 PT09PT09PT09PT09PT09PT09XG4iKTsNCisJCQkJc2Vzc2lvbi5nZXREZWJ1Z091dCgpLndyaXRl KG91dC50b0J5dGVBcnJheSgpKTsNCisJCQkJc2Vzc2lvbi5nZXREZWJ1Z091dCgpLnByaW50bG4o IlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT1cbiIpOw0KKwkJCX0NCisJCQkNCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsN CisJCQl0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJFcnJvciBwcm9jZXNzaW5nIGEgbXVs dGktbGluZSByZXNwb25zZSIsZSk7DQorCQl9DQorCQkNCisJCQ0KKwkJDQorCQlyZXR1cm4gbmV3 IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKTsNCisJfQ0KKw0KK30NCklu ZGV4OiBzcmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvUE9Q M0NvbW1hbmRGYWN0b3J5LmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzcmMvamF2YS9vcmcvYXBhY2hl L2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvUE9QM0NvbW1hbmRGYWN0b3J5LmphdmEJKHJl dmlzaW9uIDApDQorKysgc3JjL2phdmEvb3JnL2FwYWNoZS9nZXJvbmltby9qYXZhbWFpbC9zdG9y ZS9wb3AzL1BPUDNDb21tYW5kRmFjdG9yeS5qYXZhCShyZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSwy MjQgQEANCisvKioNCisgKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDUgVGhlIEFwYWNoZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uDQorICoNCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNl bnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogIHlvdSBtYXkgbm90IHVzZSB0 aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiAgWW91 IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDov L3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiAgVW5sZXNzIHJl cXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2Fy ZQ0KKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBh biAiQVMgSVMiIEJBU0lTLA0KKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBP RiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiAgU2VlIHRoZSBMaWNl bnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0K KyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9y Zy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1haWwuc3RvcmUucG9wMzsNCisNCisvKioNCisgKiBQcm92 aWRlcyBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgDQorICogb3JnLmFwYWNoZS5nZXJvbmlt by5qYXZhbWFpbC5zdG9yZS5wb3AzLlBPUDNDb21tYW5kIG9iamVjdHMNCisgKiByZXByZXNlbnRp bmcgdGhlIFBPUDMgY29tbWFuZHMgZGVmaW5lZCBpbiByZmMgMTkzOQ0KKyAqIA0KKyAqIEBsaW5r IGh0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMxOTM5Lmh0bWwNCisgKiBAdmVyc2lvbiAkUmV2 JCAkRGF0ZSQgDQorICovDQorcHVibGljIGZpbmFsIGNsYXNzIFBPUDNDb21tYW5kRmFjdG9yeSBp bXBsZW1lbnRzIFBPUDNDb25zdGFudHMgew0KKwkNCisJcHVibGljIHN0YXRpYyBQT1AzQ29tbWFu ZCBnZXRDT01NQU5EX1VTRVIoZmluYWwgU3RyaW5nIHVzZXIpDQorCXsNCisJCXJldHVybiBuZXcg UE9QM0NvbW1hbmQoKQ0KKwkJew0KKwkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWFuZCgpDQorCQkJ ew0KKwkJCQlyZXR1cm4gIlVTRVIiICsgU1BBQ0UgKyB1c2VyICsgQ1JMRjsNCisJCQl9DQorDQor CQkJcHVibGljIGJvb2xlYW4gaXNNdWx0aUxpbmVSZXNwb25zZSgpIHsNCisJCQkJcmV0dXJuIGZh bHNlOw0KKwkJCX0NCisJCX07DQorCX0NCisJDQorCXB1YmxpYyBzdGF0aWMgUE9QM0NvbW1hbmQg Z2V0Q09NTUFORF9QQVNTKGZpbmFsIFN0cmluZyBwYXNzd2QpDQorCXsNCisJCXJldHVybiBuZXcg UE9QM0NvbW1hbmQoKQ0KKwkJew0KKwkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWFuZCgpDQorCQkJ ew0KKwkJCQlyZXR1cm4gIlBBU1MiICsgU1BBQ0UgKyBwYXNzd2QgKyBDUkxGOw0KKwkJCX0NCisJ CQkNCisJCQlwdWJsaWMgYm9vbGVhbiBpc011bHRpTGluZVJlc3BvbnNlKCkgew0KKwkJCQlyZXR1 cm4gZmFsc2U7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyBQT1AzQ29t bWFuZCBnZXRDT01NQU5EX1FVSVQoKQ0KKwl7DQorCQlyZXR1cm4gbmV3IFBPUDNDb21tYW5kKCkN CisJCXsNCisJCQlwdWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKQ0KKwkJCXsNCisJCQkJcmV0dXJu ICJRVUlUIiArIENSTEY7DQorCQkJfQ0KKwkJCQ0KKwkJCXB1YmxpYyBib29sZWFuIGlzTXVsdGlM aW5lUmVzcG9uc2UoKSB7DQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorCQl9Ow0KKwl9DQor CQ0KKwlwdWJsaWMgc3RhdGljIFBPUDNDb21tYW5kIGdldENPTU1BTkRfTk9PUCgpDQorCXsNCisJ CXJldHVybiBuZXcgUE9QM0NvbW1hbmQoKQ0KKwkJew0KKwkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29t bWFuZCgpDQorCQkJew0KKwkJCQlyZXR1cm4gIk5PT1AiICsgQ1JMRjsNCisJCQl9DQorCQkJDQor CQkJcHVibGljIGJvb2xlYW4gaXNNdWx0aUxpbmVSZXNwb25zZSgpIHsNCisJCQkJcmV0dXJuIGZh bHNlOw0KKwkJCX0NCisJCX07DQorCX0NCisJDQorCXB1YmxpYyBzdGF0aWMgUE9QM0NvbW1hbmQg Z2V0Q09NTUFORF9TVEFUKCkNCisJew0KKwkJcmV0dXJuIG5ldyBQT1AzQ29tbWFuZCgpDQorCQl7 DQorCQkJcHVibGljIFN0cmluZyBnZXRDb21tYW5kKCkNCisJCQl7DQorCQkJCXJldHVybiAiU1RB VCIgKyBDUkxGOw0KKwkJCX0NCisJCQkNCisJCQlwdWJsaWMgYm9vbGVhbiBpc011bHRpTGluZVJl c3BvbnNlKCkgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKwkNCisJ cHVibGljIHN0YXRpYyBQT1AzQ29tbWFuZCBnZXRDT01NQU5EX0xJU1QoKQ0KKwl7DQorCQlyZXR1 cm4gZ2V0Q09NTUFORF9MSVNUKC0xKTsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyBQT1AzQ29t bWFuZCBnZXRDT01NQU5EX0xJU1QoZmluYWwgaW50IG1zZ05vKQ0KKwl7DQorCQlyZXR1cm4gbmV3 IFBPUDNDb21tYW5kKCkNCisJCXsNCisJCQlwdWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKQ0KKwkJ CXsNCisJCQkJaWYobXNnTm8+MCl7DQorCQkJCQlyZXR1cm4gIkxJU1QiICsgU1BBQ0UgKyBtc2dO byArIENSTEY7DQorCQkJCX1lbHNlew0KKwkJCQkJcmV0dXJuICJMSVNUIiArIENSTEY7DQorCQkJ CX0NCisJCQl9DQorCQkJLyoqDQorCQkJICogSWYgYSBtc2cgbnVtIGlzIHNwZWNpZmllZCB0aGVu IHRoZSB0aGUgbWVzc2FnZSBkZXRhaWxzIHdpbGwgYmUgb24gdGhlIGZpcnN0IGxpbmUNCisJCQkg KiBmb3IgZXguICtPSyAzIDQ1MjANCisJCQkgKiANCisJCQkgKiBpZiBubyBtc2dudW0gaXMgc3Bl Y2lmaWVkIHRoZW4gYWxsIHRoZSBtc2cgZGV0YWlscyBhcmUgcmV0dXJuIGluIGEgbXVsdGlsaW5l IGZvcm1hdA0KKwkJCSAqIGZvciBleC4gK09LIDIgbWVzc2FnZXMNCisJCQkgKiAgICAgICAgICAx IDQ1Ng0KKwkJCSAqICAgICAgICAgIDIgNDY0NTYNCisJCQkgKiAgICAgICAgICAuLi4uLg0KKwkJ CSAqICAgICAgICAgIG4gMzY2ICAgDQorCQkJICovDQorCQkJcHVibGljIGJvb2xlYW4gaXNNdWx0 aUxpbmVSZXNwb25zZSgpIHsNCisJCQkJcmV0dXJuKG1zZ05vPDApOw0KKwkJCX0NCisJCX07DQor CX0NCisJDQorCXB1YmxpYyBzdGF0aWMgUE9QM0NvbW1hbmQgZ2V0Q09NTUFORF9SRVRSKGZpbmFs IGludCBtc2dObykNCisJew0KKwkJcmV0dXJuIG5ldyBQT1AzQ29tbWFuZCgpDQorCQl7DQorCQkJ cHVibGljIFN0cmluZyBnZXRDb21tYW5kKCkNCisJCQl7DQorCQkJCXJldHVybiAiUkVUUiIgKyBT UEFDRSArIG1zZ05vICsgQ1JMRjsNCisJCQl9DQorCQkJDQorCQkJcHVibGljIGJvb2xlYW4gaXNN dWx0aUxpbmVSZXNwb25zZSgpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJfTsNCisJ fQ0KKwkNCisJcHVibGljIHN0YXRpYyBQT1AzQ29tbWFuZCBnZXRDT01NQU5EX0RFTEUoZmluYWwg aW50IG1zZ05vKQ0KKwl7DQorCQlyZXR1cm4gbmV3IFBPUDNDb21tYW5kKCkNCisJCXsNCisJCQlw dWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKQ0KKwkJCXsNCisJCQkJcmV0dXJuICJERUxFIiArIFNQ QUNFICsgbXNnTm8gKyBDUkxGOw0KKwkJCX0NCisJCQkNCisJCQlwdWJsaWMgYm9vbGVhbiBpc011 bHRpTGluZVJlc3BvbnNlKCkgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJfTsNCisJ fQ0KKwkNCisJcHVibGljIHN0YXRpYyBQT1AzQ29tbWFuZCBnZXRDT01NQU5EX1JFU1QoZmluYWwg aW50IG1zZ05vKQ0KKwl7DQorCQlyZXR1cm4gbmV3IFBPUDNDb21tYW5kKCkNCisJCXsNCisJCQlw dWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKQ0KKwkJCXsNCisJCQkJcmV0dXJuICJSRVNUIiArIFNQ QUNFICsgbXNnTm8gKyBDUkxGOw0KKwkJCX0NCisJCQkNCisJCQlwdWJsaWMgYm9vbGVhbiBpc011 bHRpTGluZVJlc3BvbnNlKCkgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJfTsNCisJ fQ0KKwkNCisJcHVibGljIHN0YXRpYyBQT1AzQ29tbWFuZCBnZXRDT01NQU5EX1RPUChmaW5hbCBp bnQgbXNnTm8sIGZpbmFsIGludCBudW1MaW5lcykNCisJew0KKwkJcmV0dXJuIG5ldyBQT1AzQ29t bWFuZCgpDQorCQl7DQorCQkJcHVibGljIFN0cmluZyBnZXRDb21tYW5kKCkNCisJCQl7DQorCQkJ CXJldHVybiAiVE9QIiArIFNQQUNFICsgbXNnTm8gKyBTUEFDRSArIG51bUxpbmVzICsgQ1JMRjsN CisJCQl9DQorCQkJDQorCQkJcHVibGljIGJvb2xlYW4gaXNNdWx0aUxpbmVSZXNwb25zZSgpIHsN CisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRp YyBQT1AzQ29tbWFuZCBnZXRDT01NQU5EX1VJREwoKQ0KKwl7DQorCQlyZXR1cm4gZ2V0Q09NTUFO RF9VSURMKC0xKTsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyBQT1AzQ29tbWFuZCBnZXRDT01N QU5EX1VJREwoZmluYWwgaW50IG1zZ05vKQ0KKwl7DQorCQlyZXR1cm4gbmV3IFBPUDNDb21tYW5k KCkNCisJCXsNCisJCQlwdWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKQ0KKwkJCXsNCisJCQkJaWYo bXNnTm8+MCl7DQorCQkJCQlyZXR1cm4gIlVJREwiICsgU1BBQ0UgKyBtc2dObyArIENSTEY7DQor CQkJCX1lbHNlew0KKwkJCQkJcmV0dXJuICJVSURMIiArIENSTEY7DQorCQkJCX0NCisJCQl9DQor CQkJDQorCQkJcHVibGljIGJvb2xlYW4gaXNNdWx0aUxpbmVSZXNwb25zZSgpIHsNCisJCQkJcmV0 dXJuIHRydWU7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKwkNCisJDQorfQ0KSW5kZXg6IHNyYy9qYXZh L29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9wMy9QT1AzRm9sZGVyLmphdmEN Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0NCi0tLSBzcmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0 b3JlL3BvcDMvUE9QM0ZvbGRlci5qYXZhCShyZXZpc2lvbiAwKQ0KKysrIHNyYy9qYXZhL29yZy9h cGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9wMy9QT1AzRm9sZGVyLmphdmEJKHJldmlz aW9uIDApDQpAQCAtMCwwICsxLDM0MCBAQA0KKy8qKg0KKyAqDQorICogQ29weXJpZ2h0IDIwMDMt MjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCisgKg0KKyAqICBMaWNlbnNlZCB1 bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisg KiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRo ZSBMaWNlbnNlLg0KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQN CisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAN CisgKg0KKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRv IGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNl IGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogIFdJVEhPVVQgV0FSUkFO VElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVk Lg0KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5p bmcgcGVybWlzc2lvbnMgYW5kDQorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0K KyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbC5zdG9yZS5wb3Az Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KKw0KK2ltcG9ydCBqYXZheC5tYWlsLkZl dGNoUHJvZmlsZTsNCitpbXBvcnQgamF2YXgubWFpbC5GbGFnczsNCitpbXBvcnQgamF2YXgubWFp bC5Gb2xkZXI7DQoraW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnZTsNCitpbXBvcnQgamF2YXgubWFp bC5NZXNzYWdpbmdFeGNlcHRpb247DQoraW1wb3J0IGphdmF4Lm1haWwuTWV0aG9kTm90U3VwcG9y dGVkRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZheC5tYWlsLlNlc3Npb247DQoraW1wb3J0IGphdmF4 Lm1haWwuU3RvcmU7DQoraW1wb3J0IGphdmF4Lm1haWwuVVJMTmFtZTsNCitpbXBvcnQgamF2YXgu bWFpbC5ldmVudC5Db25uZWN0aW9uRXZlbnQ7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuZ2Vyb25p bW8uamF2YW1haWwuc3RvcmUucG9wMy5tZXNzYWdlLlBPUDNNZXNzYWdlOw0KK2ltcG9ydCBvcmcu YXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0b3JlLnBvcDMubWVzc2FnZS5QT1AzTWVzc2FnZUZh Y3Rvcnk7DQoraW1wb3J0IG9yZy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1haWwuc3RvcmUucG9wMy5y ZXNwb25zZS5QT1AzUmVzcG9uc2VGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLmdlcm9uaW1v LmphdmFtYWlsLnN0b3JlLnBvcDMucmVzcG9uc2UuUE9QM1N0YXR1c1Jlc3BvbnNlOw0KKw0KKy8q Kg0KKyAqIFRoZSBQT1AzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBqYXZheC5tYWlsLkZvbGRlcg0K KyAqIE5vdGUgdGhhdCBvbmx5IElOQk9YIGlzIHN1cHBvcnRlZCBpbiBQT1AzDQorICogPHA+DQor ICogPHVybD5odHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMTkzOS5odG1sPC91cmw+DQorICog PC9wPg0KKyAqIEBzZWUgamF2YXgubWFpbC5Gb2xkZXINCisgKiANCisgKiBAdmVyc2lvbiAkUmV2 JCAkRGF0ZSQNCisgKi8NCitwdWJsaWMgY2xhc3MgUE9QM0ZvbGRlciBleHRlbmRzIEZvbGRlciB7 DQorDQorCXByaXZhdGUgYm9vbGVhbiBpc0ZvbGRlck9wZW4gPSBmYWxzZTsNCisJcHJpdmF0ZSBp bnQgbW9kZTsNCisJcHJpdmF0ZSBQT1AzQ29ubmVjdGlvbiBwb3AzQ29uOw0KKwlwcml2YXRlIGlu dCBtc2dDb3VudDsNCisJcHJpdmF0ZSBTZXNzaW9uIHNlc3Npb247DQorCQ0KKwkvKioNCisJKiBW ZWN0b3IgaXMgc3luY2hyb25pemVkIHNvIGNob29zZSBvdmVyIHRoZSBvdGhlciBDb2xsZWN0aW9u IGltcGxzDQorCSogVGhpcyBpcyBpbml0aWFsaXplZCBvbiBvcGVuDQorCSogQSBjaGFjaGUgd2ls bCBzYXZlIHRoZSBleHBlbnNpdmUgb3BlcmF0aW9uIG9mIHJldHJpZXZpbmcgdGhlIG1lc3NhZ2UN CisJKiBhZ2FpbiBmcm9tIHRoZSBzZXJ2ZXIuDQorCSovDQorCXByaXZhdGUgVmVjdG9yIG1zZ0Nh Y2hlOw0KKwkNCisJcHJvdGVjdGVkIFBPUDNGb2xkZXIoU3RvcmUgc3RvcmUsVVJMTmFtZSB1cmwp IHsNCisJCXN1cGVyKHN0b3JlKTsNCisJfQ0KKwkNCisJcHJvdGVjdGVkIFBPUDNGb2xkZXIoU3Rv cmUgc3RvcmUsU2Vzc2lvbiBzZXNzaW9uLFBPUDNDb25uZWN0aW9uIHBvcDNDb24pIHsNCisJCXN1 cGVyKHN0b3JlKTsNCisJCXRoaXMucG9wM0NvbiA9IHBvcDNDb247DQorCQl0aGlzLnNlc3Npb24g PSBzZXNzaW9uOw0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisJCXJldHVy biAiSU5CT1giOw0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7DQorCQly ZXR1cm4gIklOQk9YIjsNCisJfQ0KKw0KKwkvKioNCisJICogTmV2ZXIgcmV0dXJuICJ0aGlzIiBh cyB0aGUgcGFyZW50IGZvbGRlci4NCisJICogU29tZWJvZHkgbm90IGZhbWlsbGlhciB3aXRoIFBP UDMgbWF5IGRvIHNvbWV0aGluZyBsaWtlDQorCSAqIHdoaWxlKGdldFBhcmVudCgpICE9IG51bGwp IG9yIHNvbWV0aGluZyBzaW1taWxhciB3aGljaA0KKwkgKiB3aWxsIHJlc3VsdCBpbiBhbiBpbmZp bnRlIGxvb3ANCisJICovDQorCXB1YmxpYyBGb2xkZXIgZ2V0UGFyZW50KCkgdGhyb3dzIE1lc3Nh Z2luZ0V4Y2VwdGlvbiB7DQorCQl0aHJvdyBuZXcgTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9u KCJJTkJPWCBpcyB0aGUgcm9vdCBmb2xkZXIiKTsNCisJfQ0KKw0KKwlwdWJsaWMgYm9vbGVhbiBl eGlzdHMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsNCisJCS8vIElOQk9YIGFsd2F5cyBl eGlzdHMgYXQgdGhlIGJhY2tlbmQNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXB1YmxpYyBG b2xkZXJbXSBsaXN0KFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsN CisJCXRocm93IG5ldyBNZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk9ubHkgSU5CT1ggaXMg c3VwcG9ydGVkIGluIFBPUDMsIG5vIHN1YiBmb2xkZXJzIik7DQorCX0NCisNCisJLyoqIA0KKwkg KiBObyBzdWIgZm9sZGVycywgaGVuY2UgdGhlcmUgaXMgbm8gbm90aW9uIG9mIGEgc2VwZXJhdG9y DQorCSAqLw0KKwlwdWJsaWMgY2hhciBnZXRTZXBhcmF0b3IoKSB0aHJvd3MgTWVzc2FnaW5nRXhj ZXB0aW9uIHsNCisJCXRocm93IG5ldyBNZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk9ubHkg SU5CT1ggaXMgc3VwcG9ydGVkIGluIFBPUDMsIG5vIHN1YiBmb2xkZXJzIik7DQorCX0NCisNCisJ cHVibGljIGludCBnZXRUeXBlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7DQorCQlyZXR1 cm4gSE9MRFNfTUVTU0FHRVM7DQorCX0NCisNCisJcHVibGljIGJvb2xlYW4gY3JlYXRlKGludCB0 eXBlKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsNCisJCXRocm93IG5ldyBNZXRob2ROb3RT dXBwb3J0ZWRFeGNlcHRpb24oIk9ubHkgSU5CT1ggaXMgc3VwcG9ydGVkIGluIFBPUDMsIG5vIHN1 YiBmb2xkZXJzIik7DQorCX0NCisNCisJcHVibGljIGJvb2xlYW4gaGFzTmV3TWVzc2FnZXMoKSB0 aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsNCisJCXRocm93IG5ldyBNZXRob2ROb3RTdXBwb3J0 ZWRFeGNlcHRpb24oIlBPUDMgZG9lc24ndCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uIik7DQorCX0N CisNCisJcHVibGljIEZvbGRlciBnZXRGb2xkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBNZXNzYWdp bmdFeGNlcHRpb24gew0KKwkJdGhyb3cgbmV3IE1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigi T25seSBJTkJPWCBpcyBzdXBwb3J0ZWQgaW4gUE9QMywgbm8gc3ViIGZvbGRlcnMiKTsNCisJfQ0K Kw0KKwlwdWJsaWMgYm9vbGVhbiBkZWxldGUoYm9vbGVhbiByZWN1cnNlKSB0aHJvd3MgTWVzc2Fn aW5nRXhjZXB0aW9uIHsNCisJCXRocm93IG5ldyBNZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24o Ik9ubHkgSU5CT1ggaXMgc3VwcG9ydGVkIGluIFBPUDMgYW5kIElOQk9YIGNhbm5vdCBiZSBkZWxl dGVkIik7DQorCX0NCisNCisJcHVibGljIGJvb2xlYW4gcmVuYW1lVG8oRm9sZGVyIGYpIHRocm93 cyBNZXNzYWdpbmdFeGNlcHRpb24gew0KKwkJdGhyb3cgbmV3IE1ldGhvZE5vdFN1cHBvcnRlZEV4 Y2VwdGlvbigiT25seSBJTkJPWCBpcyBzdXBwb3J0ZWQgaW4gUE9QMyBhbmQgSU5CT1ggY2Fubm90 IGJlIHJlbmFtZWQiKTsNCisJfQ0KKw0KKwkvKioNCisJICogQHNlZSBqYXZheC5tYWlsLkZvbGRl ciNvcGVuKGludCkNCisJICovDQorCXB1YmxpYyB2b2lkIG9wZW4oaW50IG1vZGUpIHRocm93cyBN ZXNzYWdpbmdFeGNlcHRpb24gew0KKwkJLy9DYW4gb25seSBiZSBwZXJmb3JtZWQgb24gYSBjbG9z ZWQgZm9sZGVyDQorCQljaGVja0Nsb3NlZCgpOw0KKwkJDQorCQl0cnkgew0KKwkJCQ0KKwkJCVBP UDNTdGF0dXNSZXNwb25zZSByZXMgPSAoUE9QM1N0YXR1c1Jlc3BvbnNlKSBQT1AzUmVzcG9uc2VG YWN0b3J5DQorCQkJCQkJLmdldFN0YXR1c1Jlc3BvbnNlKHBvcDNDb24uc2VuZENvbW1hbmQoUE9Q M0NvbW1hbmRGYWN0b3J5DQorCQkJCQkJCQkuZ2V0Q09NTUFORF9TVEFUKCkpKTsNCisJCQkNCisJ CQkvLyBJIGFtIG5vdCBjaGVja2luZyBmb3IgdGhlIHJlcyA9PSBudWxsIGNvbmRpdGlvbiBhcyB0 aGUgDQorCQkJLy8gdHJ5IGNhdGNoIGJsb2NrIHdpbGwgaGFuZGxlIGl0Lg0KKwkJCQ0KKwkJCXRo aXMubW9kZSA9IG1vZGU7DQorCQkJdGhpcy5pc0ZvbGRlck9wZW4gPSB0cnVlOw0KKwkJCXRoaXMu bXNnQ291bnQgPSByZXMuZ2V0TnVtTWVzc2FnZXMoKTsNCisJCQkvLyBKYXZhTWFpbCBBUEkgaGFz IG5vIG1ldGhvZCBpbiBGb2xkZXIgdG8gZXhwb3NlIHRoZSB0b3RhbCANCisJCQkvLyBzaXplIChu byBvZiBieXRlcykgb2YgdGhlICBtYWlsIGRyb3A7DQorCQkJDQorCQkJbXNnQ2FjaGUgPSBuZXcg VmVjdG9yKG1zZ0NvdW50KTsNCisJCQltc2dDYWNoZS5zZXRTaXplKG1zZ0NvdW50KTsNCisJCQkN CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2Vw dGlvbigiVW5hYmxlIHRvIGV4ZWN1dGUgU1RBVCBjb21tYW5kIixlKTsNCisJCX0NCisJCQ0KKwkJ bm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhDb25uZWN0aW9uRXZlbnQuT1BFTkVEKTsNCisJfQ0K Kw0KKwlwdWJsaWMgdm9pZCBjbG9zZShib29sZWFuIGV4cHVuZ2UpIHRocm93cyBNZXNzYWdpbmdF eGNlcHRpb24gew0KKwkJLy8gQ2FuIG9ubHkgYmUgcGVyZm9ybWVkIG9uIGFuIG9wZW4gZm9sZGVy DQorCQljaGVja09wZW4oKTsNCisNCisJCXRyeSB7DQorCQkJaWYgKG1vZGUgPT0gUkVBRF9XUklU RSkgew0KKwkJCQkvLyBmaW5kIGFsbCBtZXNzYWdlcyBtYXJrZWQgZGVsZXRlZCBhbmQgaXNzdWUg REVMRSBjb21tYW5kcw0KKwkJCQlQT1AzTWVzc2FnZSBtOw0KKwkJCQlmb3IgKGludCBpID0gMDsg aSA8IG1zZ0NhY2hlLnNpemUoKTsgaSsrKSB7DQorCQkJCQlpZiAoKG0gPSAoUE9QM01lc3NhZ2Up IG1zZ0NhY2hlLmVsZW1lbnRBdChpKSkgIT0gbnVsbCkgew0KKwkJCQkJCWlmIChtLmlzU2V0KEZs YWdzLkZsYWcuREVMRVRFRCkpIHsNCisJCQkJCQkJdHJ5IHsNCisJCQkJCQkJCXBvcDNDb24uc2Vu ZENvbW1hbmQoUE9QM0NvbW1hbmRGYWN0b3J5DQorCQkJCQkJCQkJCS5nZXRDT01NQU5EX0RFTEUo aSArIDEpKTsNCisJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisJCQkJCQkJCXRocm93 IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oDQorCQkJCQkJCQkJCSJFeGNlcHRpb24gZGVsZXRpbmcg bWVzc2FnZSBubyBbIg0KKwkJCQkJCQkJCQkJCSsgKGkgKyAxKSArICJdIGR1cmluZyBjbG9zZSIs IGUpOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJ CXRyeSB7DQorCQkJCXBvcDNDb24uc2VuZENvbW1hbmQoUE9QM0NvbW1hbmRGYWN0b3J5LmdldENP TU1BTkRfUVVJVCgpKTsNCisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCQkvLyBkb2Vz bid0IHJlYWxseSBjYXJlIGFib3V0IHRoZSByZXNwb25zZQ0KKwkJCX0NCisJCS8vIGRvc24ndCBu ZWVkIGEgY2F0Y2ggYmxvY2sgaGVyZSwgYnV0IGFkZGVkIGluY2FzZSBzb21ldGhpbmcgZ29lcyB3 cm9uZw0KKwkJLy8gc28gdGhhdCB0aGUgZmlubmFseSBpcyBnYXJ1bnRlZWQgdG8gZXhlY3V0ZSBp biBzdWNoIGEgY2FzZS4JDQorCQl9IGZpbmFsbHkgew0KKwkJCXRyeSB7DQorCQkJCXBvcDNDb24u Y2xvc2UoKTsNCisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCQkvLyBkb2Vzbid0IHJl YWxseSBjYXJlIGFib3V0IHRoZSByZXNwb25zZQ0KKwkJCQkvLyBhbGwgd2UgY2FuIGRvIGlzIHRv IHNldCB0aGUgcmVmZXJlbmNlIGV4cGxpY2l0bHkgdG8gbnVsbA0KKwkJCQlwb3AzQ29uID0gbnVs bDsNCisJCQl9DQorCQkJDQorCQkJLyoNCisJCQkgKiBUaGUgbWVzc2FnZSBudW1iZXJzIGRlcGVu ZCBvbiB0aGUgbWFpbCBkcm9wDQorCQkJICogaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCB0 aGVuIHB1cmdlIHRoZSBjYWNoZQ0KKwkJCSAqLw0KKwkJCW1zZ0NhY2hlID0gbnVsbDsNCisJCQlp c0ZvbGRlck9wZW4gPSBmYWxzZTsNCisJCQlub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKENvbm5l Y3Rpb25FdmVudC5DTE9TRUQpOw0KKwkJfQ0KKwl9DQorDQorCXB1YmxpYyBib29sZWFuIGlzT3Bl bigpIHsNCisJCXJldHVybiBpc0ZvbGRlck9wZW47DQorCX0NCisNCisJcHVibGljIEZsYWdzIGdl dFBlcm1hbmVudEZsYWdzKCkgew0KKwkJLy8gdW5mb3J0dW5hdGVseSBkb2Vzbid0IGhhdmUgYSB0 aHJvd3MgY2xhdXNlIGZvciB0aGlzIG1ldGhvZA0KKwkJLy90aHJvdyBuZXcgTWV0aG9kTm90U3Vw cG9ydGVkRXhjZXB0aW9uKCJQT1AzIGRvZXNuJ3Qgc3VwcG9ydCBwZXJtYW5lbnQgZmxhZ3MiKTsN CisJCQ0KKwkJLy8gQmV0dGVyIHRoYW4gcmV0dXJuaW5nIG51bGwsIHNhdmUgdGhlIGV4dHJhIGNv bmRpdGlvbiBmcm9tIGEgdXNlciB0byBjaGVjayBmb3IgbnVsbA0KKwkJLy8gYW5kIGF2b2lkcyBh IE51bGxQb2ludGVyRXhjZXB0aW9uIGZvciB0aGUgY2FyZWxlc3MuDQorCQlyZXR1cm4gbmV3IEZs YWdzKCk7DQorCX0NCisNCisJcHVibGljIGludCBnZXRNZXNzYWdlQ291bnQoKSB0aHJvd3MgTWVz c2FnaW5nRXhjZXB0aW9uIHsNCisJCXJldHVybiBtc2dDb3VudDsNCisJfQ0KKw0KKwkvKioNCisJ ICogQ2hlY2tzIHdldGhlciB0aGUgbWVzc2FnZSBpcyBpbiBjYWNoZSwgaWYgbm90DQorCSAqIHdp bGwgY3JlYXRlIGEgbmV3IG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXR1cm4gaXQuDQorCSAqIEBzZWUg amF2YXgubWFpbC5Gb2xkZXIjZ2V0TWVzc2FnZShpbnQpDQorCSAqLw0KKwlwdWJsaWMgTWVzc2Fn ZSBnZXRNZXNzYWdlKGludCBtc2dOdW0pIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gew0KKwkJ Ly8gQ2FuIG9ubHkgYmUgcGVyZm9ybWVkIG9uIGFuIE9wZW4gZm9sZGVyDQorCQljaGVja09wZW4o KTsNCisJCWlmKG1zZ051bSA8MSB8fCBtc2dOdW0+IGdldE1lc3NhZ2VDb3VudCgpKXsNCisJCQl0 aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJJbnZhbGlkIE1lc3NhZ2UgbnVtYmVyIik7DQor CQl9DQorCQkNCisJCU1lc3NhZ2UgbXNnID0gbnVsbDsNCisJCXRyeSB7DQorCQkJbXNnID0gKE1l c3NhZ2UpbXNnQ2FjaGUuZWxlbWVudEF0KG1zZ051bSk7DQorCQl9IGNhdGNoIChSdW50aW1lRXhj ZXB0aW9uIGUpIHsNCisJCQlzZXNzaW9uLmdldERlYnVnT3V0KCkucHJpbnRsbigiTWVzc2FnZSBu b3QgaW4gY2FjaGUiKTsNCisJCX0gIA0KKwkJaWYobXNnID09IG51bGwpew0KKwkJCW1zZyA9IFBP UDNNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKHRoaXMsc2Vzc2lvbixwb3AzQ29uLG1zZ051 bSk7DQorCQkJbXNnQ2FjaGUuc2V0RWxlbWVudEF0KG1zZyxtc2dOdW0pOw0KKwkJfQ0KKwkJDQor CQlyZXR1cm4gbXNnOw0KKwl9DQorDQorCXB1YmxpYyB2b2lkIGFwcGVuZE1lc3NhZ2VzKE1lc3Nh Z2VbXSBtc2dzKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsNCisJCXRocm93IG5ldyBNZXRo b2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk1lc3NhZ2UgYXBwZW5kaW5nIGlzIG5vdCBzdXBwb3J0 ZWQgaW4gUE9QMyIpOw0KKw0KKwl9DQorDQorCXB1YmxpYyBNZXNzYWdlW10gZXhwdW5nZSgpIHRo cm93cyBNZXNzYWdpbmdFeGNlcHRpb24gew0KKwkJdGhyb3cgbmV3IE1ldGhvZE5vdFN1cHBvcnRl ZEV4Y2VwdGlvbigiRXhwdW5nZSBpcyBub3Qgc3VwcG9ydGVkIGluIFBPUDMiKTsNCisJfQ0KKwkN CisJcHVibGljIGludCBnZXRNb2RlKCl0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9ueyANCisJ CS8vIENhbiBvbmx5IGJlIHBlcmZvcm1lZCBvbiBhbiBPcGVuIGZvbGRlcg0KKwkJY2hlY2tPcGVu KCk7DQorCQlyZXR1cm4gbW9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQHNlZSBqYXZheC5tYWls LkZvbGRlciNmZXRjaChqYXZheC5tYWlsLk1lc3NhZ2VbXSwgamF2YXgubWFpbC5GZXRjaFByb2Zp bGUpDQorCSAqIA0KKwkgKiBUaGUgSmF2YU1haWwgQVBJIHJlY29tbWVuZHMgdGhhdCB0aGlzIG1l dGhvZCBiZSBvdmVycmlkZW50IHRvIHByb3ZpZGUgYSBtZWFuaW5nZnVsbA0KKwkgKiBpbXBsZW1l bnRhdGlvbi4NCisJICovDQorCXB1YmxpYyB2b2lkIGZldGNoKE1lc3NhZ2VbXSBtc2dzLCBGZXRj aFByb2ZpbGUgZnApDQorCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7DQorCQkvLyBDYW4g b25seSBiZSBwZXJmb3JtZWQgb24gYW4gT3BlbiBmb2xkZXINCisJCWNoZWNrT3BlbigpOw0KKwkJ Zm9yKGludCBpPTA7IGk8bXNncy5sZW5ndGg7aSsrKQ0KKwkJew0KKwkJCU1lc3NhZ2UgbXNnID0g bXNnc1tpXTsNCisJCQlpZihtc2cgPT0gbnVsbCkNCisJCQl7DQorCQkJCW1zZyA9IFBPUDNNZXNz YWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKHRoaXMsc2Vzc2lvbixwb3AzQ29uLGkpOw0KKwkJCX0N CisJCQlpZihmcC5jb250YWlucyhGZXRjaFByb2ZpbGUuSXRlbS5FTlZFTE9QRSkpDQorCQkJew0K KwkJCQltc2cgPSBQT1AzTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZVdpdGhFdmVsb3BlKChQ T1AzTWVzc2FnZSltc2cpOw0KKwkJCX0NCisJCQkNCisJCQlpZihmcC5jb250YWlucyhGZXRjaFBy b2ZpbGUuSXRlbS5DT05URU5UX0lORk8pKQ0KKwkJCXsNCisJCQkJbXNnID0gUE9QM01lc3NhZ2VG YWN0b3J5LmNyZWF0ZU1lc3NhZ2VXaXRoQ29udGVudEluZm8oKFBPUDNNZXNzYWdlKW1zZyk7DQor CQkJfQ0KKwkJCQ0KKwkJCWlmKGZwLmNvbnRhaW5zKEZldGNoUHJvZmlsZS5JdGVtLkZMQUdTKSkN CisJCQl7DQorCQkJCW1zZyA9IFBPUDNNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlV2l0aEZs YWdzKChQT1AzTWVzc2FnZSltc2cpOw0KKwkJCX0NCisJCQkNCisJCQltc2dzW2ldID0gbXNnOw0K KwkJfQ0KKwl9DQorCQ0KKyAgICAgDQorCS8qKg0KKwkgKiBCZWxvdyBpcyBhIGxpc3Qgb2YgY292 aW5pZW5jZSBtZXRob2RzIHRoYXQgYXZvaWQgcmVwZWF0ZWQgY2hlY2tpbmcgZm9yIGENCisJICog dmFsdWUgYW5kIHRocm93aW5nIGFuIGV4Y2VwdGlvbg0KKwkgKi8NCisJDQorICAgIC8qKiBFbnN1 cmUgdGhlIGZvbGRlciBpcyBvcGVuICovDQorICAgIHByaXZhdGUgdm9pZCBjaGVja09wZW4oKSB0 aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsNCisJCWlmICghaXNGb2xkZXJPcGVuKXsgDQor CQkgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRm9sZGVyIGlzIG5vdCBPcGVu Iik7DQorCQl9DQorICAgIH0NCisNCisgICAgLyoqIEVuc3VyZSB0aGUgZm9sZGVyIGlzIG5vdCBv cGVuICovDQorICAgIHByaXZhdGUgdm9pZCBjaGVja0Nsb3NlZCgpIHRocm93cyBJbGxlZ2FsU3Rh dGVFeGNlcHRpb24gew0KKwkJaWYgKGlzRm9sZGVyT3Blbil7IA0KKwkJICAgIHRocm93IG5ldyBJ bGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZvbGRlciBpcyBPcGVuIik7DQorCQl9ICAgIA0KKyAgICB9 DQorICAgIA0KKyAgICAvKiogDQorICAgICAqIEBzZWUgamF2YXgubWFpbC5Gb2xkZXIjbm90aWZ5 TWVzc2FnZUNoYW5nZWRMaXN0ZW5lcnMoaW50LCBqYXZheC5tYWlsLk1lc3NhZ2UpDQorICAgICAq IA0KKyAgICAgKiB0aGlzIG1ldGhvZCBpcyBwcm90ZWN0ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIG91 dHNpZGUgb2YgRm9sZGVyLCB0aGVyZWZvcmUgaGFkIHRvDQorICAgICAqIGV4cGxpY2l0bHkgZXhw b3NlIGl0IHZpYSBhIG1ldGhvZCBpbiBQT1AzRm9sZGVyLCBzbyB0aGF0IFBPUDNNZXNzYWdlIGhh cyBhY2Nlc3MgdG8gaXQNCisgICAgICogDQorICAgICAqIEJhZCBkZXNpZ24gb24gdGhlIHBhcnQg b2YgdGhlIEphdmEgTWFpbCBBUEkuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlN ZXNzYWdlQ2hhbmdlZExpc3RlbmVycyhpbnQgdHlwZSwgTWVzc2FnZSBtKSB7DQorICAgIAlzdXBl ci5ub3RpZnlNZXNzYWdlQ2hhbmdlZExpc3RlbmVycyh0eXBlLCBtKTsNCisgICAgfQ0KKw0KK30N CkluZGV4OiBzcmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMv UE9QM0NvbnN0YW50cy5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc3JjL2phdmEvb3JnL2FwYWNoZS9n ZXJvbmltby9qYXZhbWFpbC9zdG9yZS9wb3AzL1BPUDNDb25zdGFudHMuamF2YQkocmV2aXNpb24g MCkNCisrKyBzcmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMv UE9QM0NvbnN0YW50cy5qYXZhCShyZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSwzNyBAQA0KKy8qKg0K KyAqDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRp b24NCisgKg0KKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24g Mi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl cHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqICBZb3UgbWF5IG9idGFpbiBh IGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5v cmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBw bGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogIGRpc3Ry aWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFT SVMsDQorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBl aXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBz cGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogIGxpbWl0YXRp b25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5nZXJv bmltby5qYXZhbWFpbC5zdG9yZS5wb3AzOw0KKw0KKy8qKg0KKyAqIERlZmluZXMgYSBmZXcgY29u c3RhbnRzIHRoYXQgYXJlIHVzZWQgdGhyb3VnaHQNCisgKiB0aGUgaW1wbGVtZW50YXRpb24uDQor ICogDQorICogQHZlcnNpb24gJFJldiQgJERhdGUkIA0KKyAqLw0KKw0KK3B1YmxpYyBpbnRlcmZh Y2UgUE9QM0NvbnN0YW50cyB7DQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNQQUNFID0g IiAiOw0KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDUkxGID0gIlxyXG4iOw0KKwkNCisJ cHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTEYgPSAnXG4nOw0KKwlwdWJsaWMgZmluYWwgc3RhdGlj IGludCBDUiA9ICdccic7DQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERPVCA9ICcuJzsNCisJ DQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE9LID0gMDsNCisJcHVibGljIGZpbmFsIHN0YXRp YyBpbnQgRVJSID0gMTsNCit9DQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUNCkluZGV4OiBz cmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvUE9QM1N0b3Jl LmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0NCi0tLSBzcmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFt YWlsL3N0b3JlL3BvcDMvUE9QM1N0b3JlLmphdmEJKHJldmlzaW9uIDApDQorKysgc3JjL2phdmEv b3JnL2FwYWNoZS9nZXJvbmltby9qYXZhbWFpbC9zdG9yZS9wb3AzL1BPUDNTdG9yZS5qYXZhCShy ZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSwyMTEgQEANCisvKioNCisgKg0KKyAqIENvcHlyaWdodCAy MDAzLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQorICoNCisgKiAgTGljZW5z ZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7 DQorICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0 aCB0aGUgTGljZW5zZS4NCisgKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNl IGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0Ut Mi4wDQorICoNCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVl ZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGlj ZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqICBXSVRIT1VUIFdB UlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1w bGllZC4NCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292 ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5z ZS4NCisgKi8NCisNCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1haWwuc3Rv cmUucG9wMzsNCisNCitpbXBvcnQgamF2YXgubWFpbC5BdXRoZW50aWNhdGlvbkZhaWxlZEV4Y2Vw dGlvbjsNCitpbXBvcnQgamF2YXgubWFpbC5Gb2xkZXI7DQoraW1wb3J0IGphdmF4Lm1haWwuTWVz c2FnaW5nRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZheC5tYWlsLlNlc3Npb247DQoraW1wb3J0IGph dmF4Lm1haWwuU3RvcmU7DQoraW1wb3J0IGphdmF4Lm1haWwuVVJMTmFtZTsNCisNCisvKioNCisg KiBQT1AzIGltcGxlbWVudGF0aW9uIG9mIGphdmF4Lm1haWwuU3RvcmUNCisgKiBQT1AgcHJvdG9j b2wgc3BlYyBpcyBpbXBsZW1lbnRlZCBpbiANCisgKiBvcmcuYXBhY2hlLmdlcm9uaW1vLmphdmFt YWlsLnN0b3JlLnBvcDMuUE9QM0Nvbm5lY3Rpb24gDQorICogDQorICogQHZlcnNpb24gJFJldiQg JERhdGUkIA0KKyAqLw0KKw0KK3B1YmxpYyBjbGFzcyBQT1AzU3RvcmUgZXh0ZW5kcyBTdG9yZXsN CisJDQorCXByaXZhdGUgUE9QM0Nvbm5lY3Rpb24gcG9wM0NvbjsNCisJCQ0KKwlwdWJsaWMgUE9Q M1N0b3JlKFNlc3Npb24gc2Vzc2lvbiwgVVJMTmFtZSB1cmxOYW1lKSB7DQorCQlzdXBlcihzZXNz aW9uLHVybE5hbWUpOw0KKwl9DQorDQorCQ0KKwkvKioNCisJICogQHNlZSBqYXZheC5tYWlsLlN0 b3JlI2dldERlZmF1bHRGb2xkZXIoKQ0KKwkgKiANCisJICogVGhlcmUgaXMgb25seSBJTkJPWCBz dXBwb3J0ZWQgaW4gUE9QMw0KKwkgKiBzbyB0aGUgZGVmYXVsdCBmb2xkZXIgaXMgaW5ib3gNCisJ ICovDQorCXB1YmxpYyBGb2xkZXIgZ2V0RGVmYXVsdEZvbGRlcigpIHRocm93cyBNZXNzYWdpbmdF eGNlcHRpb24gew0KKwkJcmV0dXJuIGdldEZvbGRlcigiSU5CT1giKTsNCisJfQ0KKw0KKwkvKiog IA0KKwkgKiBAc2VlIGphdmF4Lm1haWwuU3RvcmUjZ2V0Rm9sZGVyKGphdmEubGFuZy5TdHJpbmcp DQorCSAqLw0KKwlwdWJsaWMgRm9sZGVyIGdldEZvbGRlcihTdHJpbmcgbmFtZSkgdGhyb3dzIE1l c3NhZ2luZ0V4Y2VwdGlvbiB7DQorCQkNCisJCWNoZWNrQ29ubmVjdGlvblN0YXR1cygpOw0KKwkJ DQorCQlpZighICJJTkJPWCIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSl7DQorCQkJdGhyb3cgbmV3 IE1lc3NhZ2luZ0V4Y2VwdGlvbigiT25seSBJTkJPWCBpcyBzdXBwb3J0ZWQgaW4gUE9QMyIpOw0K KwkJfQkJDQorCQlyZXR1cm4gbmV3IFBPUDNGb2xkZXIodGhpcyxzZXNzaW9uLHBvcDNDb24pOw0K Kwl9DQorDQorCS8qKiAgDQorCSAqIEBzZWUgamF2YXgubWFpbC5TdG9yZSNnZXRGb2xkZXIoamF2 YXgubWFpbC5VUkxOYW1lKQ0KKwkgKi8NCisJcHVibGljIEZvbGRlciBnZXRGb2xkZXIoVVJMTmFt ZSB1cmwpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gew0KKwkJcmV0dXJuIGdldEZvbGRlcih1 cmwuZ2V0RmlsZSgpKTsNCisJfQ0KKwkNCisJDQorCS8qKiAgDQorCSAqIEBzZWUgamF2YXgubWFp bC5TZXJ2aWNlI3Byb3RvY29sQ29ubmVjdChqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFu Zy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3luY2hyb25p emVkIGJvb2xlYW4gcHJvdG9jb2xDb25uZWN0KFN0cmluZyBob3N0LCBpbnQgcG9ydE51bSwNCisJ CQlTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3ZCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7 DQorCQkNCisJCS8vIE5ldmVyIHN0b3JlIHRoZSB1c2VyLCBwYXNzd2QgZm9yIHNlY3VyaXR5IHJl YXNvbnMNCisJCQ0KKwkJLy8gaWYgdGhlc2UgdmFsdWVzIGFyZSBudWxsLCBubyBjb25uZWN0aW9u IGF0dGVtcHQgc2hvdWxkIGJlIG1hZGUNCisJCWlmIChob3N0ID09IG51bGwgfHwgcGFzc3dkID09 IG51bGwgfHwgdXNlciA9PSBudWxsKQ0KKwkJew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0JDQor CQkNCisJCS8vIHZhbGlkYXRlIHBvcnQgbnVtDQorCQlpZiAocG9ydE51bSA8MSkgew0KKwkJCVN0 cmluZyBwb3J0c3RyaW5nID0gc2Vzc2lvbi5nZXRQcm9wZXJ0eSgibWFpbC5wb3AzLnBvcnQiKTsN CisJCQlpZiAocG9ydHN0cmluZyAhPSBudWxsKXsNCisJCQkJdHJ5ewkNCisJCQkJCXBvcnROdW0g PSBJbnRlZ2VyLnBhcnNlSW50KHBvcnRzdHJpbmcpOw0KKwkJCQl9IGNhdGNoIChOdW1iZXJGb3Jt YXRFeGNlcHRpb24gZSkgew0KKwkJCQkJcG9ydE51bSA9IDExMDsNCisJCQkJfQkNCisJCQl9DQor CQl9DQorCQkNCisJCQkJDQorCQkvKg0KKwkJICogIE9idGFpbmluZyBhIGNvbm5lY3Rpb24gdG8g dGhlIHNlcnZlci4NCisJCSAqIA0KKwkJICovDQorCQlwb3AzQ29uPSBuZXcgUE9QM0Nvbm5lY3Rp b24odGhpcy5zZXNzaW9uLGhvc3QscG9ydE51bSk7DQorCQl0cnkgewkNCisJCQlwb3AzQ29uLm9w ZW4oKTsNCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJdGhyb3cgbmV3IE1lc3NhZ2lu Z0V4Y2VwdGlvbigiQ29ubmVjdGlvbiBmYWlsZWQiLCBlKTsNCisJCX0NCisJCQkJCQkNCisJCS8q DQorCQkgKiBTZW5kaW5nIHRoZSBVU0VSIGNvbW1hbmQgd2l0aCB1c2VybmFtZQ0KKwkJICogDQor CQkgKi8JCQ0KKwkJUE9QM1Jlc3BvbnNlIHJlc1VzZXIgPSBudWxsOw0KKwkJdHJ5IHsNCisJCQly ZXNVc2VyID0gcG9wM0Nvbi5zZW5kQ29tbWFuZChQT1AzQ29tbWFuZEZhY3RvcnkuZ2V0Q09NTUFO RF9VU0VSKHVzZXIpKTsNCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJdGhyb3cgbmV3 IE1lc3NhZ2luZ0V4Y2VwdGlvbigiQ29ubmVjdGlvbiBmYWlsZWQiLGUpOwkJCQ0KKwkJfQ0KKwkJ DQorCQlpZihQT1AzQ29uc3RhbnRzLkVSUiA9PSByZXNVc2VyLmdldFN0YXR1cygpKXsNCisJCQkN CisJCQkvKg0KKwkJCSAqIEF1dGhlbnRpY2F0aW9uIGZhaWxlZCBzbyBzZW5kaW5nIFFVSVQNCisJ CQkgKiANCisJCQkgKi8JDQorCQkJdHJ5IHsNCisJCQkJcG9wM0Nvbi5zZW5kQ29tbWFuZChQT1Az Q29tbWFuZEZhY3RvcnkuZ2V0Q09NTUFORF9RVUlUKCkpOw0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlv biBlKSB7DQorCQkJCS8vIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3BvbnNlIG9yIGlmIGFu eSBlcnJvciBoYXBwZW5zDQorCQkJCS8vIGp1c3QgdHJ5aW5nIHRvIGNvbXBseSB3aXRoIHRoZSBz cGVjLg0KKwkJCQkvLyBNb3N0IGxpa2VseSB0aGUgc2VydmVyIHdvdWxkIGhhdmUgdGVybWluYXRl ZCB0aGUgY29ubmVjdGlvbg0KKwkJCQkvLyBieSBub3cuDQorCQkJfQ0KKwkJCQ0KKwkJCXRocm93 IG5ldyBBdXRoZW50aWNhdGlvbkZhaWxlZEV4Y2VwdGlvbihyZXNVc2VyLmdldEZpcnN0TGluZSgp KTsNCisJCX0JCQ0KKwkJCQkNCisJCS8qDQorCQkgKiBTZW5kaW5nIHRoZSBQQVNTIGNvbW1hbmQg d2l0aCBwYXNzd29yZA0KKwkJICogDQorCQkgKi8JDQorCQlQT1AzUmVzcG9uc2UgcmVzUHdkID0g bnVsbDsNCisJCXRyeSB7DQorCQkJcmVzUHdkID0gcG9wM0Nvbi5zZW5kQ29tbWFuZChQT1AzQ29t bWFuZEZhY3RvcnkuZ2V0Q09NTUFORF9QQVNTKHBhc3N3ZCkpOw0KKwkJfSBjYXRjaCAoRXhjZXB0 aW9uIGUpIHsNCisJCQl0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJDb25uZWN0aW9uIGZh aWxlZCIsZSk7CQkJDQorCQl9DQorCQkNCisJCWlmKFBPUDNDb25zdGFudHMuRVJSID09IHJlc1B3 ZC5nZXRTdGF0dXMoKSl7DQorCQkJDQorCQkJLyoNCisJCQkgKiBBdXRoZW50aWNhdGlvbiBmYWls ZWQgc28gc2VuZGluZyBRVUlUDQorCQkJICogDQorCQkJICovCQ0KKwkJCXRyeSB7DQorCQkJCXBv cDNDb24uc2VuZENvbW1hbmQoUE9QM0NvbW1hbmRGYWN0b3J5LmdldENPTU1BTkRfUVVJVCgpKTsN CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCQkvLyBXZSBkb24ndCBjYXJlIGFib3V0 IHRoZSByZXNwb25zZSBvciBpZiBhbnkgZXJyb3IgaGFwcGVucw0KKwkJCQkvLyBqdXN0IHRyeWlu ZyB0byBjb21wbHkgd2l0aCB0aGUgc3BlYy4NCisJCQkJLy8gTW9zdCBsaWtlbHkgdGhlIHNlcnZl ciB3b3VsZCBoYXZlIHRlcm1pbmF0ZWQgdGhlIGNvbm5lY3Rpb24NCisJCQkJLy8gYnkgbm93Lg0K KwkJCX0NCisJCQkNCisJCQl0aHJvdyBuZXcgQXV0aGVudGljYXRpb25GYWlsZWRFeGNlcHRpb24o cmVzUHdkLmdldEZpcnN0TGluZSgpKTsNCisJCX0JCQ0KKw0KKwkJcmV0dXJuIHRydWU7DQorCX0N CisJDQorCS8qKiAgDQorCSAqIEBzZWUgamF2YXgubWFpbC5TZXJ2aWNlI2lzQ29ubmVjdGVkKCkN CisJICovDQorCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkNCisJew0KKwkJUE9QM1Jlc3Bv bnNlIHJlcyA9IG51bGw7DQorCQl0cnkgew0KKwkJCXJlcyA9IHBvcDNDb24uc2VuZENvbW1hbmQo UE9QM0NvbW1hbmRGYWN0b3J5LmdldENPTU1BTkRfTk9PUCgpKTsNCisJCX0gY2F0Y2ggKEV4Y2Vw dGlvbiBlKSB7DQorCQkJcmV0dXJuIGZhbHNlOwkJDQorCQl9DQorCQkNCisJCXJldHVybihQT1Az Q29uc3RhbnRzLk9LID09IHJlcy5nZXRTdGF0dXMoKSk7DQorCX0NCisJDQorCS8qKiAgDQorCSAq IEBzZWUgamF2YXgubWFpbC5TZXJ2aWNlI2Nsb3NlKCkNCisJICovDQorCXB1YmxpYyB2b2lkIGNs b3NlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbnsNCisJCS8vIFRoaXMgaXMgZG9uZSB0byBl bnN1cmUgcHJvcGVyIGV2ZW50IG5vdGlmaWNhdGlvbi4NCisJCXN1cGVyLmNsb3NlKCk7DQorCQl0 cnl7CQ0KKwkJCXBvcDNDb24uY2xvc2UoKTsNCisJCX1jYXRjaChFeGNlcHRpb24gZSl7DQorCQkJ Ly8gQSBtZXNzYWdlIGlzIGFscmVhZHkgc2V0IGF0IHRoZSBjb25uZWN0aW9uIGxldmVsDQorCQkJ Ly8gdW5mb3J0dWFudGVseSB0aGVyZSBpcyBubyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG9ubHkN CisJCQkvLyB0aGUgcm9vdCBleGNlcHRpb24NCisJCQluZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCIi LGUpOw0KKwkJfQ0KKwl9DQorCQ0KKwlwcml2YXRlIHZvaWQgY2hlY2tDb25uZWN0aW9uU3RhdHVz KCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7DQorCQlpZiAoIXRoaXMuaXNDb25uZWN0ZWQo KSl7DQorCQkgICAgdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigiTm90IGNvbm5lY3RlZCAi KTsNCisJICAgIH0NCisJfQ0KK30NCkluZGV4OiBzcmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1v L2phdmFtYWlsL3N0b3JlL3BvcDMvcmVzcG9uc2UvUE9QM1N0YXR1c1Jlc3BvbnNlLmphdmENCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0NCi0tLSBzcmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3Jl L3BvcDMvcmVzcG9uc2UvUE9QM1N0YXR1c1Jlc3BvbnNlLmphdmEJKHJldmlzaW9uIDApDQorKysg c3JjL2phdmEvb3JnL2FwYWNoZS9nZXJvbmltby9qYXZhbWFpbC9zdG9yZS9wb3AzL3Jlc3BvbnNl L1BPUDNTdGF0dXNSZXNwb25zZS5qYXZhCShyZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSw2NiBAQA0K Ky8qKg0KKyAqDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZv dW5kYXRpb24NCisgKg0KKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZl cnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmls ZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqICBZb3UgbWF5IG9i dGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFw YWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqICBVbmxlc3MgcmVxdWlyZWQg YnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICog IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ UyIgQkFTSVMsDQorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBL SU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9y IHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogIGxp bWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNo ZS5nZXJvbmltby5qYXZhbWFpbC5zdG9yZS5wb3AzLnJlc3BvbnNlOw0KKw0KK2ltcG9ydCBqYXZh eC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5nZXJvbmltby5q YXZhbWFpbC5zdG9yZS5wb3AzLlBPUDNSZXNwb25zZTsNCisNCisvKioNCisgKiBUaGlzIGNsYXNz IGFkZHMgZnVuY3Rpb25hbGl0eSB0byB0aGUgYmFzaWMgcmVzcG9uc2UNCisgKiBieSBwYXJzaW5n IHRoZSBzdGF0dXMgbGluZSBhbmQgb2J0YWluaW5nIHNwZWNpZmljDQorICogaW5mb3JtYXRpb24g YWJvdXQgbnVtIG9mIG1zZ3MgYW5kIHRoZSBzaXplDQorICogDQorICogQHNlZSAgb3JnLmFwYWNo ZS5nZXJvbmltby5qYXZhbWFpbC5zdG9yZS5wb3AzLlBPUDNSZXNwb25zZQ0KKyAqIEBzZWUgIG9y Zy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1haWwuc3RvcmUucG9wMy5yZXNwb25zZS5EZWZhdWx0UE9Q M1Jlc3BvbnNlDQorICogIA0KKyAqIEB2ZXJzaW9uICRSZXYkICREYXRlJCANCisgKi8NCisNCitw dWJsaWMgY2xhc3MgUE9QM1N0YXR1c1Jlc3BvbnNlIGV4dGVuZHMgRGVmYXVsdFBPUDNSZXNwb25z ZSB7DQorDQorCXByaXZhdGUgaW50IG51bU1lc3NhZ2VzID0gMDsNCisJcHJpdmF0ZSBpbnQgc2l6 ZSA9IDA7DQorCQ0KKwlQT1AzU3RhdHVzUmVzcG9uc2UoUE9QM1Jlc3BvbnNlIGJhc2VSZXMpIHRo cm93cyBNZXNzYWdpbmdFeGNlcHRpb257DQorCQlzdXBlcihiYXNlUmVzLmdldFN0YXR1cygpLGJh c2VSZXMuZ2V0Rmlyc3RMaW5lKCksYmFzZVJlcy5nZXREYXRhKCkpOw0KKwkJDQorCQkvLyBpZiBF UlIgbm90IHdvcnRoIHByb2NlZWRpbmcgYW55IGZ1cnRoZXINCisJCWlmKE9LID09IGdldFN0YXR1 cygpKXsJCQkNCisJCQlTdHJpbmdbXSBhcmdzID0gZ2V0Rmlyc3RMaW5lKCkuc3BsaXQoU1BBQ0Up Ow0KKwkJCXRyeSB7DQorCQkJCW51bU1lc3NhZ2VzID0gSW50ZWdlci5wYXJzZUludChhcmdzWzBd KTsNCisJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KKwkJCQl0aHJvdyBu ZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlIGZvciBTVEFUIGNvbW1hbmQi LGUpOw0KKwkJCX0NCisJCQl0cnkgew0KKwkJCQlzaXplID0gSW50ZWdlci5wYXJzZUludChhcmdz WzFdKTsNCisJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KKwkJCQl0aHJv dyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlIGZvciBTVEFUIGNvbW1h bmQiLGUpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlwdWJsaWMgaW50IGdldE51bU1lc3NhZ2Vz KCkgew0KKwkJcmV0dXJuIG51bU1lc3NhZ2VzOw0KKwl9DQorDQorCXB1YmxpYyBpbnQgZ2V0U2l6 ZSgpIHsNCisJCXJldHVybiBzaXplOw0KKwl9DQorDQorfQ0KSW5kZXg6IHNyYy9qYXZhL29yZy9h cGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9wMy9yZXNwb25zZS9EZWZhdWx0UE9QM1Jl c3BvbnNlLmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzcmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1v L2phdmFtYWlsL3N0b3JlL3BvcDMvcmVzcG9uc2UvRGVmYXVsdFBPUDNSZXNwb25zZS5qYXZhCShy ZXZpc2lvbiAwKQ0KKysrIHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3Rv cmUvcG9wMy9yZXNwb25zZS9EZWZhdWx0UE9QM1Jlc3BvbnNlLmphdmEJKHJldmlzaW9uIDApDQpA QCAtMCwwICsxLDU3IEBADQorLyoqDQorICoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA1IFRoZSBB cGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KKyAqDQorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBB cGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqICB5b3UgbWF5 IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2Uu DQorICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICog ICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICog IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGlu Zywgc29mdHdhcmUNCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJp YnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENP TkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogIFNl ZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNz aW9ucyBhbmQNCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQor cGFja2FnZSBvcmcuYXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0b3JlLnBvcDMucmVzcG9uc2U7 DQorDQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQorDQoraW1wb3J0IG9yZy5hcGFjaGUu Z2Vyb25pbW8uamF2YW1haWwuc3RvcmUucG9wMy5QT1AzQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcu YXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0b3JlLnBvcDMuUE9QM1Jlc3BvbnNlOw0KKw0KKy8q Kg0KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGJhc2ljIGltcGxlbWVudGF0aW9uIGZvciB0 aGUNCisgKiBQT1AzUmVzcG9uc2UuDQorICogDQorICogQHNlZSAgb3JnLmFwYWNoZS5nZXJvbmlt by5qYXZhbWFpbC5zdG9yZS5wb3AzLlBPUDNSZXNwb25zZQ0KKyAqIEB2ZXJzaW9uICRSZXYkICRE YXRlJCANCisgKi8NCisNCitwdWJsaWMgY2xhc3MgRGVmYXVsdFBPUDNSZXNwb25zZSBpbXBsZW1l bnRzIFBPUDNSZXNwb25zZSxQT1AzQ29uc3RhbnRzew0KKwkNCisJcHJpdmF0ZSBpbnQgc3RhdHVz ID0gRVJSOw0KKwlwcml2YXRlIFN0cmluZyBmaXJzdExpbmU7DQorCXByaXZhdGUgSW5wdXRTdHJl YW0gZGF0YTsNCisJDQorCURlZmF1bHRQT1AzUmVzcG9uc2UoaW50IHN0YXR1cywgU3RyaW5nIGZp cnN0TGluZSwgSW5wdXRTdHJlYW0gZGF0YSl7DQorCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsNCisJ CXRoaXMuZmlyc3RMaW5lID0gZmlyc3RMaW5lOyANCisJCXRoaXMuZGF0YSA9IGRhdGE7DQorCX0N CisNCisJcHVibGljIGludCBnZXRTdGF0dXMoKSB7DQorCQlyZXR1cm4gc3RhdHVzOw0KKwl9DQor DQorCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXREYXRhKCkgew0KKwkJcmV0dXJuIGRhdGE7DQorCX0N CisNCisJcHVibGljIFN0cmluZyBnZXRGaXJzdExpbmUoKSB7DQorCQlyZXR1cm4gZmlyc3RMaW5l Ow0KKwl9DQorCQ0KK30NCkluZGV4OiBzcmMvamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFt YWlsL3N0b3JlL3BvcDMvcmVzcG9uc2UvUE9QM1Jlc3BvbnNlRmFjdG9yeS5qYXZhDQo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09DQotLS0gc3JjL2phdmEvb3JnL2FwYWNoZS9nZXJvbmltby9qYXZhbWFpbC9zdG9yZS9wb3Az L3Jlc3BvbnNlL1BPUDNSZXNwb25zZUZhY3RvcnkuamF2YQkocmV2aXNpb24gMCkNCisrKyBzcmMv amF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvcmVzcG9uc2UvUE9Q M1Jlc3BvbnNlRmFjdG9yeS5qYXZhCShyZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSw0OCBAQA0KKy8q Kg0KKyAqDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5k YXRpb24NCisgKg0KKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBl eGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqICBZb3UgbWF5IG9idGFp biBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNo ZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkg YXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogIGRp c3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIg QkFTSVMsDQorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5E LCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRo ZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogIGxpbWl0 YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5nZXJv bmltby5qYXZhbWFpbC5zdG9yZS5wb3AzLnJlc3BvbnNlOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklu cHV0U3RyZWFtOw0KKw0KK2ltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsNCisN CitpbXBvcnQgb3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbC5zdG9yZS5wb3AzLlBPUDNDb25z dGFudHM7DQoraW1wb3J0IG9yZy5hcGFjaGUuZ2Vyb25pbW8uamF2YW1haWwuc3RvcmUucG9wMy5Q T1AzUmVzcG9uc2U7DQorDQorLyoqDQorICogVGhpcyBmYWN0b3J5IHByb3ZpZGVzIGEgdW5pZm9y bSB3YXkgb2YgaGFuZGxpbmcgdGhlIA0KKyAqIGNyZWF0aW9uIG9mIHJlc3BvbnNlIG9iamVjdHMu DQorICogIA0KKyAqIEB2ZXJzaW9uICRSZXYkICREYXRlJCANCisgKi8NCisNCitwdWJsaWMgZmlu YWwgY2xhc3MgUE9QM1Jlc3BvbnNlRmFjdG9yeSBpbXBsZW1lbnRzIFBPUDNDb25zdGFudHN7DQor CQ0KKwlwdWJsaWMgc3RhdGljIFBPUDNSZXNwb25zZSBnZXREZWZhdWx0UmVzcG9uc2UoaW50IHN0 YXR1cyxTdHJpbmcgbGluZSxJbnB1dFN0cmVhbSBkYXRhKXsNCisJCXJldHVybiBuZXcgRGVmYXVs dFBPUDNSZXNwb25zZShzdGF0dXMsbGluZSxkYXRhKTsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRp YyBQT1AzUmVzcG9uc2UgZ2V0U3RhdHVzUmVzcG9uc2UoUE9QM1Jlc3BvbnNlIGJhc2VSZXMpIHRo cm93cyBNZXNzYWdpbmdFeGNlcHRpb257DQorCQlyZXR1cm4gbmV3IFBPUDNTdGF0dXNSZXNwb25z ZShiYXNlUmVzKTsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyBQT1AzUmVzcG9uc2UgZ2V0TGlz dFJlc3BvbnNlKFBPUDNSZXNwb25zZSBiYXNlUmVzKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9u ew0KKwkJcmV0dXJuIG5ldyBQT1AzU3RhdHVzUmVzcG9uc2UoYmFzZVJlcyk7DQorCX0NCisJDQor DQorfQ0KSW5kZXg6IHNyYy9qYXZhL29yZy9hcGFjaGUvZ2Vyb25pbW8vamF2YW1haWwvc3RvcmUv cG9wMy9yZXNwb25zZS9QT1AzTGlzdFJlc3BvbnNlLmphdmENCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzcmMv amF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL2phdmFtYWlsL3N0b3JlL3BvcDMvcmVzcG9uc2UvUE9Q M0xpc3RSZXNwb25zZS5qYXZhCShyZXZpc2lvbiAwKQ0KKysrIHNyYy9qYXZhL29yZy9hcGFjaGUv Z2Vyb25pbW8vamF2YW1haWwvc3RvcmUvcG9wMy9yZXNwb25zZS9QT1AzTGlzdFJlc3BvbnNlLmph dmEJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDk3IEBADQorLyoqDQorICoNCisgKiBDb3B5cmln aHQgMjAwMy0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KKyAqDQorICogIExp Y2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5z ZSIpOw0KKyAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNl IHdpdGggdGhlIExpY2Vuc2UuDQorICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGlj ZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNF TlNFLTIuMA0KKyAqDQorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBh Z3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhl IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiAgV0lUSE9V VCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9y IGltcGxpZWQuDQorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdl IGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExp Y2Vuc2UuDQorICovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0 b3JlLnBvcDMucmVzcG9uc2U7DQorDQoraW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQoraW1w b3J0IGphdmEudXRpbC5WZWN0b3I7DQorDQoraW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhj ZXB0aW9uOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmdlcm9uaW1vLmphdmFtYWlsLnN0b3JlLnBv cDMuUE9QM1Jlc3BvbnNlOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgYWRkcyBmdW5jdGlvbmFs aXR5IHRvIHRoZSBiYXNpYyByZXNwb25zZQ0KKyAqIGJ5IHBhcnNpbmcgdGhlIHJlcGx5IGZvciBM SVNUIGNvbW1hbmQgYW5kIG9idGFpbmluZyBzcGVjaWZpYw0KKyAqIGluZm9ybWF0aW9uIGFib3V0 IHRoZSBtc2dudW0gYW5kIHRoZSBzaXplLg0KKyAqIEl0IGNvdWxkIGJlIGZvciBvbmUgb3IgbW9y ZSBtc2dzIGRlcGVuZGluZyBvbiB3ZXRoZXIgYSBtc2cgbnVtYmVyDQorICogd2FzIHBhc3NlZCBv ciBub3QgaW50byB0aGUgTElTVCBjb21tYW5kDQorICogDQorICogQHNlZSAgb3JnLmFwYWNoZS5n ZXJvbmltby5qYXZhbWFpbC5zdG9yZS5wb3AzLlBPUDNSZXNwb25zZQ0KKyAqIEBzZWUgIG9yZy5h cGFjaGUuZ2Vyb25pbW8uamF2YW1haWwuc3RvcmUucG9wMy5yZXNwb25zZS5EZWZhdWx0UE9QM1Jl c3BvbnNlDQorICogIA0KKyAqIEB2ZXJzaW9uICRSZXYkICREYXRlJCANCisgKi8NCisNCitwdWJs aWMgY2xhc3MgUE9QM0xpc3RSZXNwb25zZSBleHRlbmRzIERlZmF1bHRQT1AzUmVzcG9uc2Ugew0K Kw0KKwlwcml2YXRlIGludCBtc2dudW0gPSAwOw0KKwlwcml2YXRlIGludCBzaXplID0gMDsNCisJ cHJpdmF0ZSBWZWN0b3IgbXVsdGlwbGVNc2dzID0gbnVsbDsNCisJDQorCVBPUDNMaXN0UmVzcG9u c2UoUE9QM1Jlc3BvbnNlIGJhc2VSZXMpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb257DQorCQlz dXBlcihiYXNlUmVzLmdldFN0YXR1cygpLGJhc2VSZXMuZ2V0Rmlyc3RMaW5lKCksYmFzZVJlcy5n ZXREYXRhKCkpOw0KKwkJDQorCQkvLyBpZiBFUlIgbm90IHdvcnRoIHByb2NlZWRpbmcgYW55IGZ1 cnRoZXINCisJCWlmKE9LID09IGdldFN0YXR1cygpKXsJCQkNCisJCQkNCisJCQkvLyBpZiBkYXRh ID09IG51bGwsIHRoZW4gaXQgbWVhbiBpdCdzIGEgc2luZ2xlIGxpbmUgcmVzcG9uc2UNCisJCQlp ZihiYXNlUmVzLmdldERhdGEoKSA9PSBudWxsKXsNCisJCQkJU3RyaW5nW10gYXJncyA9IGdldEZp cnN0TGluZSgpLnNwbGl0KFNQQUNFKTsNCisJCQkJdHJ5IHsNCisJCQkJCW1zZ251bSA9IEludGVn ZXIucGFyc2VJbnQoYXJnc1swXSk7DQorCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlv biBlKSB7DQorCQkJCQl0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3Bv bnNlIGZvciBTVEFUIGNvbW1hbmQiLGUpOw0KKwkJCQl9DQorCQkJCXRyeSB7DQorCQkJCQlzaXpl ID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKTsNCisJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0 RXhjZXB0aW9uIGUpIHsNCisJCQkJCXRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIkludmFs aWQgcmVzcG9uc2UgZm9yIFNUQVQgY29tbWFuZCIsZSk7DQorCQkJCX0NCisJCQl9ZWxzZXsNCisJ CQkJaW50IHRvdGFsTXNncyA9IDA7DQorCQkJCVN0cmluZ1tdIGFyZ3MgPSBnZXRGaXJzdExpbmUo KS5zcGxpdChTUEFDRSk7DQorCQkJCXRyeSB7DQorCQkJCQl0b3RhbE1zZ3MgPSBJbnRlZ2VyLnBh cnNlSW50KGFyZ3NbMF0pOw0KKwkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkg ew0KKwkJCQkJdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigiSW52YWxpZCByZXNwb25zZSBm b3IgU1RBVCBjb21tYW5kIixlKTsNCisJCQkJfQ0KKwkJCQltdWx0aXBsZU1zZ3MgPSBuZXcgVmVj dG9yKHRvdGFsTXNncyk7DQorCQkJCW11bHRpcGxlTXNncy5zZXRTaXplKHRvdGFsTXNncyk7DQor CQkJCS8vIFRvZG8gOiBtdWx0aS1saW5lIHJlc3BvbnNlIHBhcnNpbmcNCisJCQl9DQorCQkJDQor CQl9DQorCX0NCisNCisJcHVibGljIGludCBnZXRNZXNzYWdlTnVtYmVyKCkgew0KKwkJcmV0dXJu IG1zZ251bTsNCisJfQ0KKw0KKwlwdWJsaWMgaW50IGdldFNpemUoKSB7DQorCQlyZXR1cm4gc2l6 ZTsNCisJfQ0KKwkNCisJLyoqIE1lc3NhZ2VzIGNhbiBiZSBhY2Nlc3NlZCBieQ0KKwkgKiAgbXVs dGlwbGVNc2dzLmdldEVsZW1lbnRBdChtc2dudW0pDQorCSAqIA0KKwkgKi8NCisJcHVibGljIFZl Y3RvciBnZXRNdWx0aXBsZU1lc3NhZ2VEZXRhaWxzKCl7DQorCQlyZXR1cm4gbXVsdGlwbGVNc2dz Ow0KKwl9DQorCQ0KK30NCkluZGV4OiBzcmMvcmVzb3VyY2VzL01FVEEtSU5GL2phdmFtYWlsLmRl ZmF1bHQucHJvdmlkZXJzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc3JjL3Jlc291cmNlcy9NRVRBLUlORi9q YXZhbWFpbC5kZWZhdWx0LnByb3ZpZGVycwkocmV2aXNpb24gMzU1NjIxKQ0KKysrIHNyYy9yZXNv dXJjZXMvTUVUQS1JTkYvamF2YW1haWwuZGVmYXVsdC5wcm92aWRlcnMJKHdvcmtpbmcgY29weSkN CkBAIC03LDMgKzcsNCBAQA0KICMgJFJldiQgJERhdGUkCiAjCiBwcm90b2NvbD1zbXRwOyB0eXBl PXRyYW5zcG9ydDsgY2xhc3M9b3JnLmFwYWNoZS5nZXJvbmltby5qYXZhbWFpbC50cmFuc3BvcnQu c210cC5TTVRQVHJhbnNwb3J0OyB2ZW5kb3I9QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZl cnNpb249MS4wCitwcm90b2NvbD1wb3AzOyB0eXBlPXN0b3JlOyBjbGFzcz1vcmcuYXBhY2hlLmdl cm9uaW1vLmphdmFtYWlsLnN0b3JlLnBvcDMuUE9QM1N0b3JlOyB2ZW5kb3I9QXBhY2hlIFNvZnR3 YXJlIEZvdW5kYXRpb247IHZlcnNpb249MS4wDQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUN Cg== ------_=_NextPart_001_01C5FE84.8BE5A8C9--