Return-Path: Delivered-To: apmail-ws-axis-dev-archive@www.apache.org Received: (qmail 17363 invoked from network); 30 Sep 2004 15:24:32 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 30 Sep 2004 15:24:32 -0000 Received: (qmail 69502 invoked by uid 500); 30 Sep 2004 15:24:22 -0000 Delivered-To: apmail-ws-axis-dev-archive@ws.apache.org Received: (qmail 69451 invoked by uid 500); 30 Sep 2004 15:24:21 -0000 Mailing-List: contact axis-dev-help@ws.apache.org; run by ezmlm Precedence: bulk Reply-To: axis-dev@ws.apache.org list-help: list-unsubscribe: list-post: Delivered-To: mailing list axis-dev@ws.apache.org Received: (qmail 69441 invoked by uid 99); 30 Sep 2004 15:24:21 -0000 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests= X-Spam-Check-By: apache.org Received-SPF: pass (hermes.apache.org: local policy) Received: from [152.78.239.150] (HELO mailserver.it-innovation.soton.ac.uk) (152.78.239.150) by apache.org (qpsmtpd/0.28) with ESMTP; Thu, 30 Sep 2004 08:24:20 -0700 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C4A701.89EF4302" Subject: Fix for a bug in ManagedMemoryDataSource X-MimeOLE: Produced By Microsoft Exchange V6.0.6487.1 Date: Thu, 30 Sep 2004 16:24:12 +0100 Message-ID: <0016E6145796E14680B831BB76A2129E01A6FDB4@mailserver.it-innovation.soton.ac.uk> X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Thread-Topic: Fix for a bug in ManagedMemoryDataSource Thread-Index: AcSnAYmJrTcJFo1HTxOlnMaMj1LWYQ== From: "Ananth Krishna" To: X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N This is a multi-part message in MIME format. ------_=_NextPart_001_01C4A701.89EF4302 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable I am sending this mail to the developers list as I have noticed what seems to me like a bug in the ManagedMemoryDataSource class in axis1_2 beta version. We are using javax.activation.DataHandler for soap attachments and are aware that axis manages data sources in 1_2 beta with the ManagedMemoryDataSource class.=20 Since then, we had also noticed that temp files created by axis when handling soap attachments weren't being cleaned up. Hence, we are explicitly calling 'delete' method on ManagedMemoryDataSource after ensuring that the data source returned from javax.activation.DataHandler is of the right type. For small attachments up to a few kilobytes this worked well but when we try to upload larger soap attachments of the order of 5-6 megabytes the delete operation on ManagedMemoryDataSource complained with a java.util.ConcurrentModificationException on a WeakHashMap used in this class.=20 I dug deeper into the code and didn't quite realise why a WeakHashMap was used here but it seemed to me that there can be a potential race condition here and we seem to be hitting it by uploading larger soap attachments.=20 The delete() method of the main ManagedMemoryDataSource class, while iterating over the elements of the defined WeakHashMap, deletes elements of the WeakHashMap. As most of us know, this usually is a cause for ConcurrentModificationException to be thrown on HashMaps/WeakHashMaps.=20 Deleting elements in the WeakHashMap is actually done in the close() method of the private class inside ManagedMemoryDataSource which is invoked from the delete() method. As the close() method is used all over the place in this class, I have created a separate closeStream() method which doesn't attempt to delete/modify elements of this HashMap and is invoked as before from inside the delete method. This shouldn't affect elements of the HashMap being removed as the HashMap is cleared at the end of the delete() method anyway. I am submitting the changes I have done to this class with this email. We have tested this class in the context that I have just described and it seems to work well and were hoping this patch can be included in the next release of axis.. Thanks & Regards Ananth Ananth Krishna IT Innovation Centre 2 Venture Road Chilworth Science Park Southampton, SO16 7NP, UK tel: +44 23 8076 0834 fax: +44 23 8076 0833 mailto:ak@it-innovation.soton.ac.uk http://www.it-innovation.soton.ac.uk=20 ------_=_NextPart_001_01C4A701.89EF4302 Content-Type: application/octet-stream; name="ManagedMemoryDataSource.java" Content-Transfer-Encoding: base64 Content-Description: ManagedMemoryDataSource.java Content-Disposition: attachment; filename="ManagedMemoryDataSource.java" LyoNCiAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9u Lg0KICoNCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAg KHRoZSAiTGljZW5zZSIpOw0KICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4g Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9m IHRoZSBMaWNlbnNlIGF0DQogKg0KICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5z ZXMvTElDRU5TRS0yLjANCiAqDQogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcg b3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQogKiBkaXN0cmlidXRlZCB1bmRlciB0 aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KICogV0lUSE9V VCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9y IGltcGxpZWQuDQogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBn b3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5z ZS4NCiAqLw0KcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMuYXR0YWNobWVudHM7DQoNCmltcG9ydCBv cmcuYXBhY2hlLmF4aXMuSW50ZXJuYWxFeGNlcHRpb247DQppbXBvcnQgb3JnLmFwYWNoZS5heGlz Lk1lc3NhZ2VDb250ZXh0Ow0KaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5jb21wb25lbnRzLmxvZ2dl ci5Mb2dGYWN0b3J5Ow0KaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy51dGlscy5NZXNzYWdlczsNCmlt cG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQoNCmltcG9ydCBqYXZhLmlvLkZp bGU7DQoNCi8qKg0KICogVGhpcyBjbGFzcyBhbGxvd3Mgc21hbGwgYXR0YWNobWVudHMgdG8gYmUg Y2FjaGVkIGluIG1lbW9yeSwgd2hpbGUgbGFyZ2Ugb25lcyBhcmUNCiAqIGNhY2hlZCBvdXQuICBJ dCBpbXBsZW1lbnRzIGEgSmF2YSBBY3RpdmlhdGlvbiBEYXRhIHNvdXJjZSBpbnRlcmZhY2UuDQog Kg0KICogQGF1dGhvciBSaWNrIFJpbmVob2x0DQogKi8NCnB1YmxpYyBjbGFzcyBNYW5hZ2VkTWVt b3J5RGF0YVNvdXJjZSBpbXBsZW1lbnRzIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSB7DQoN CiAgICAvKiogRmllbGQgbG9nICAgICAgICAgICAqLw0KICAgIHByb3RlY3RlZCBzdGF0aWMgTG9n IGxvZyA9DQogICAgICAgICBMb2dGYWN0b3J5LmdldExvZyhNYW5hZ2VkTWVtb3J5RGF0YVNvdXJj ZS5jbGFzcy5nZXROYW1lKCkpOw0KDQogICAgLyoqDQogICAgICogVGhlIGNvbnRlbnQgdHlwZS4g VGhpcyBkZWZhdWx0cyB0bw0KICAgICAqIDxjb2RlPmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTwv Y29kZT4uDQogICAgICovDQogICAgcHJvdGVjdGVkIFN0cmluZyBjb250ZW50VHlwZSA9ICJhcHBs aWNhdGlvbi9vY3RldC1zdHJlYW0iOw0KDQogICAgLyoqIFRoZSBpbmNvbWluZyBzb3VyY2Ugc3Ry ZWFtLiAqLw0KICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gc3MgPSBudWxsOw0KDQogICAgLyoqIEZp ZWxkIE1JTl9NRU1PUllfRElTS19DQUNIRUQgICAgICAgICAgICovDQogICAgcHVibGljIHN0YXRp YyBmaW5hbCBpbnQgTUlOX01FTU9SWV9ESVNLX0NBQ0hFRCA9IC0xOw0KDQogICAgLyoqIEZpZWxk IE1BWF9NRU1PUllfRElTS19DQUNIRUQgICAgICAgICAgICovDQogICAgcHVibGljIHN0YXRpYyBm aW5hbCBpbnQgTUFYX01FTU9SWV9ESVNLX0NBQ0hFRCA9IDE2ICogMTAyNDsNCg0KICAgIC8qKiBG aWVsZCBtYXhDYWNoZWQgICAgICAgICAgICovDQogICAgcHJvdGVjdGVkIGludCBtYXhDYWNoZWQg PSBNQVhfTUVNT1JZX0RJU0tfQ0FDSEVEOyAgICAgICAvLyBtYXggaW4gbWVtb3J5IGNhY2hlZC4g RGVmYXVsdC4NCg0KICAgIC8vIElmIHNldCB0aGUgZmlsZSB0aGUgZGlzayBpcyBjYWNoZWQgdG8u DQoNCiAgICAvKiogRmllbGQgZGlza0NhY2hlRmlsZSAgICAgICAgICAgKi8NCiAgICBwcm90ZWN0 ZWQgamF2YS5pby5GaWxlIGRpc2tDYWNoZUZpbGUgPSBudWxsOw0KDQogICAgLy8gQSBsaXN0IG9m IG9wZW4gaW5wdXQgU3RyZWFtcy4NCg0KICAgIC8qKiBGaWVsZCByZWFkZXJzICAgICAgICAgICAq Lw0KICAgIHByb3RlY3RlZCBqYXZhLnV0aWwuV2Vha0hhc2hNYXAgcmVhZGVycyA9IG5ldyBqYXZh LnV0aWwuV2Vha0hhc2hNYXAoKTsNCg0KICAgIC8qKg0KICAgICAqIEZsYWcgdG8gc2hvdyBpZiB0 aGUgcmVzb3VyY2VzIGJlaGluZCB0aGlzIGhhdmUgYmVlbiBkZWxldGVkLg0KICAgICAqLw0KICAg IHByb3RlY3RlZCBib29sZWFuIGRlbGV0ZWQgPQ0KICAgICAgICAgICAgZmFsc2U7DQoNCiAgICAv LyBNZW1vcnkgaXMgYWxsb2NhdGVkIGluIHRoZXNlIHNpemUgY2h1bmtzLg0KDQogICAgLyoqIEZp ZWxkIFJFQURfQ0hVTktfU1ogICAgICAgICAgICovDQogICAgcHVibGljIHN0YXRpYyBmaW5hbCBp bnQgUkVBRF9DSFVOS19TWiA9IDMyICogMTAyNDsNCg0KICAgIC8qKiBGaWVsZCBkZWJ1Z0VuYWJs ZWQgICAgICAgICAgICovDQogICAgcHJvdGVjdGVkIGJvb2xlYW4gZGVidWdFbmFibGVkID0gZmFs c2U7ICAgIC8vIExvZyBkZWJ1Z2dpbmcgaWYgdHJ1ZS4NCg0KICAgIC8vIFNob3VsZCBub3QgYmUg Y2FsbGVkOw0KDQogICAgLyoqDQogICAgICogQ29uc3RydWN0b3IgTWFuYWdlZE1lbW9yeURhdGFT b3VyY2UuDQogICAgICovDQogICAgcHJvdGVjdGVkIE1hbmFnZWRNZW1vcnlEYXRhU291cmNlKCkg ew0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyZWF0ZSBhIG5ldyBib3VuZGFyeSBzdHJlYW0u DQogICAgICoNCiAgICAgKiBAcGFyYW0gc3MgaXMgdGhlIHNvdXJjZSBpbnB1dCBzdHJlYW0gdGhh dCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGRhdGEgc291cmNlLg0KICAgICAqIEBwYXJhbSBtYXhD YWNoZWQgIFRoaXMgaXMgdGhlIG1heCBtZW1vcnkgdGhhdCBpcyB0byBiZSB1c2VkIHRvIGNhY2hl IHRoZSBkYXRhLg0KICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSB0aGUgbWltZSB0eXBlIGZvciB0 aGlzIGRhdGEgc3RyZWFtLg0KICAgICAqICAgYnkgYnVmZmVyaW5nIHlvdSBjYW4gc29tZSBlZmZp ZW5jeSBpbiBzZWFyY2hpbmcuDQogICAgICoNCiAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNl cHRpb24NCiAgICAgKi8NCiAgICBwdWJsaWMgTWFuYWdlZE1lbW9yeURhdGFTb3VyY2UoDQogICAg ICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtIHNzLCBpbnQgbWF4Q2FjaGVkLCBTdHJpbmcgY29u dGVudFR5cGUpDQogICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQogICAg ICAgIHRoaXMoc3MsIG1heENhY2hlZCwgY29udGVudFR5cGUsIGZhbHNlKTsNCiAgICB9DQoNCiAg ICAvKioNCiAgICAgKiBDcmVhdGUgYSBuZXcgYm91bmRhcnkgc3RyZWFtLg0KICAgICAqDQogICAg ICogQHBhcmFtIHNzIGlzIHRoZSBzb3VyY2UgaW5wdXQgc3RyZWFtIHRoYXQgaXMgdXNlZCB0byBj cmVhdGUgdGhpcyBkYXRhIHNvdXJjZS4NCiAgICAgKiBAcGFyYW0gbWF4Q2FjaGVkICBUaGlzIGlz IHRoZSBtYXggbWVtb3J5IHRoYXQgaXMgdG8gYmUgdXNlZCB0byBjYWNoZSB0aGUgZGF0YS4NCiAg ICAgKiBAcGFyYW0gY29udGVudFR5cGUgdGhlIG1pbWUgdHlwZSBmb3IgdGhpcyBkYXRhIHN0cmVh bS4NCiAgICAgKiAgIGJ5IGJ1ZmZlcmluZyB5b3UgY2FuIHNvbWUgZWZmaWVuY3kgaW4gc2VhcmNo aW5nLg0KICAgICAqIEBwYXJhbSByZWFkYWxsIGlmIHRydWUgd2lsbCByZWFkIGluIHRoZSB3aG9s ZSBzb3VyY2UuDQogICAgICoNCiAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24NCiAg ICAgKi8NCiAgICBwdWJsaWMgTWFuYWdlZE1lbW9yeURhdGFTb3VyY2UoDQogICAgICAgICAgICBq YXZhLmlvLklucHV0U3RyZWFtIHNzLCBpbnQgbWF4Q2FjaGVkLCBTdHJpbmcgY29udGVudFR5cGUs IGJvb2xlYW4gcmVhZGFsbCkNCiAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9u IHsNCg0KICAgICAgICB0aGlzLnNzID0gc3M7DQogICAgICAgIHRoaXMubWF4Q2FjaGVkID0gbWF4 Q2FjaGVkOw0KDQogICAgICAgIGlmICgobnVsbCAhPSBjb250ZW50VHlwZSkgJiYgKGNvbnRlbnRU eXBlLmxlbmd0aCgpICE9IDApKSB7DQogICAgICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29u dGVudFR5cGU7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobWF4Q2FjaGVkIDwgTUlOX01FTU9S WV9ESVNLX0NBQ0hFRCkgew0KICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4 Y2VwdGlvbigNCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkTWF4 Q2FjaGVkIiwgIiIgKyBtYXhDYWNoZWQpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChsb2cu aXNEZWJ1Z0VuYWJsZWQoKSkgew0KICAgICAgICAgICAgZGVidWdFbmFibGVkID0gdHJ1ZTsgICAg Ly8gTG9nZ2luZyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYnkgdGltZTsNCiAgICAgICAgfQ0KDQog ICAgICAgIC8vIGZvciBub3cgcmVhZCBhbGwgaW4gdG8gZGlzay4NCiAgICAgICAgaWYgKHJlYWRh bGwpIHsNCiAgICAgICAgICAgIGJ5dGVbXSByZWFkYnVmZmVyID0gbmV3IGJ5dGVbUkVBRF9DSFVO S19TWl07DQogICAgICAgICAgICBpbnQgcmVhZCA9IDA7DQoNCiAgICAgICAgICAgIGRvIHsNCiAg ICAgICAgICAgICAgICByZWFkID0gc3MucmVhZChyZWFkYnVmZmVyKTsNCg0KICAgICAgICAgICAg ICAgIGlmIChyZWFkID4gMCkgew0KICAgICAgICAgICAgICAgICAgICB3cml0ZShyZWFkYnVmZmVy LCByZWFkKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IHdoaWxlIChyZWFkID4g LTEpOw0KDQogICAgICAgICAgICBjbG9zZSgpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyog amF2YXguYWN0aXZhdGlvbi5JbnRlcmZhY2UgRGF0YVNvdXJjZSBpbXBsZW1lbnRhdGlvbiAqLw0K DQogICAgLyoqDQogICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgTUlNRSB0eXBlIG9mIHRo ZSBkYXRhIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLg0KICAgICAqIEByZXR1cm4gVGhlIG1pbWUg dHlwZS4NCiAgICAgKi8NCiAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb250ZW50VHlw ZSgpIHsNCiAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOw0KICAgIH0NCg0KICAgIC8qKg0KICAg ICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gSW5wdXRTdHJlYW0gcmVwcmVzZW50aW5nIHRoZSB0 aGUgZGF0YSBhbmQgdGhyb3dzIHRoZSBhcHByb3ByaWF0ZSBleGNlcHRpb24gaWYgaXQgY2FuIG5v dCBkbyBzby4NCiAgICAgKiBAcmV0dXJuIHRoZSBqYXZhLmlvLklucHV0U3RyZWFtIGZvciB0aGUg ZGF0YSBzb3VyY2UuDQogICAgICoNCiAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24N CiAgICAgKi8NCiAgICBwdWJsaWMgc3luY2hyb25pemVkIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0 SW5wdXRTdHJlYW0oKQ0KICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0K DQogICAgICAgIC8qDQogICAgICAgICAqIGlmIChtZW1vcnlidWZsaXN0ID09IG51bGwpIHsNCiAg ICAgICAgICogICByZXR1cm4gIG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShkaXNrQ2FjaGVG aWxlKTsNCiAgICAgICAgICogfQ0KICAgICAgICAgKiBlbHNlDQogICAgICAgICAqLw0KICAgICAg ICByZXR1cm4gbmV3IEluc3RyZWFtKCk7ICAgIC8vIFJldHVybiB0aGUgbWVtb3J5IGhlbGQgc3Ry ZWFtLg0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFRoaXMgd2lsbCBmbHVzaCBhbnkgbWVtb3J5 IHNvdXJjZSB0byBkaXNrIGFuZA0KICAgICAqIHByb3ZpZGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUg aWYgZGVzaXJlZC4NCiAgICAgKg0KICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZpbGUg b2YgdGhlIHN0cmVhbQ0KICAgICAqLw0KICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5h bWUoKSB7DQoNCiAgICAgICAgU3RyaW5nIHJldCA9IG51bGw7DQoNCiAgICAgICAgdHJ5IHsNCiAg ICAgICAgICAgIGZsdXNoVG9EaXNrKCk7DQoNCiAgICAgICAgICAgIGlmIChkaXNrQ2FjaGVGaWxl ICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICByZXQgPSBkaXNrQ2FjaGVGaWxlLmdldEFic29s dXRlUGF0aCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkg ew0KICAgICAgICAgICAgZGlza0NhY2hlRmlsZSA9IG51bGw7DQogICAgICAgIH0NCg0KICAgICAg ICByZXR1cm4gcmV0Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFRoaXMgbWV0aG9kIHJldHVy bnMgYW4gT3V0cHV0U3RyZWFtIHdoZXJlIHRoZSBkYXRhIGNhbiBiZSB3cml0dGVuIGFuZA0KICAg ICAqIHRocm93cyB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uIGlmIGl0IGNhbiBub3QgZG8gc28u DQogICAgICogTk9UIFNVUFBPUlRFRCwgbm90IG5lZWQgZm9yIGF4aXMsIGRhdGEgc291cmNlcyBh cmUgY3JlYXRlIGJ5IGNvbnN0cnVjdG9ycy4NCiAgICAgKg0KICAgICAqDQogICAgICogQHJldHVy biBhbHdheXMgPGNvZGU+bnVsbDwvY29kZT4NCiAgICAgKg0KICAgICAqIEB0aHJvd3MgamF2YS5p by5JT0V4Y2VwdGlvbg0KICAgICAqLw0KICAgIHB1YmxpYyBqYXZhLmlvLk91dHB1dFN0cmVhbSBn ZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQogICAgICAgIHJl dHVybiBudWxsOw0KICAgIH0NCg0KICAgIC8qKiBUaGUgbGlua2VkIGxpc3QgdG8gaG9sZCB0aGUg aW4gbWVtb3J5IGJ1ZmZlcnMuICovDQogICAgcHJvdGVjdGVkIGphdmEudXRpbC5MaW5rZWRMaXN0 IG1lbW9yeWJ1Zmxpc3QgPQ0KICAgICAgICAgICAgbmV3IGphdmEudXRpbC5MaW5rZWRMaXN0KCk7 DQoNCiAgICAvKiogSG9sZCB0aGUgbGFzdCBtZW1vcnkgYnVmZmVyLiAqLw0KICAgIHByb3RlY3Rl ZCBieXRlW10gY3VycmVudE1lbW9yeUJ1ZiA9IG51bGw7DQoNCiAgICAvKiogVGhlIG51bWJlciBv ZiBieXRlcyB3cml0dGVuIHRvIHRoZSBhYm92ZSBidWZmZXIuICovDQogICAgcHJvdGVjdGVkIGlu dCBjdXJyZW50TWVtb3J5QnVmU3ogPQ0KICAgICAgICAgICAgMDsNCg0KICAgIC8qKiBUaGUgdG90 YWwgc2l6ZSBpbiBieXRlcyBpbiB0aGlzIGRhdGEgc291cmNlLiAqLw0KICAgIHByb3RlY3RlZCBs b25nIHRvdGFsc3ogPSAwOw0KDQogICAgLyoqIFRoaXMgaXMgdGhlIGNhY2hlZCBkaXNrIHN0cmVh bS4gKi8NCiAgICBwcm90ZWN0ZWQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbSBjYWNoZWRp c2tzdHJlYW0gPQ0KICAgICAgICAgICAgbnVsbDsNCg0KICAgIC8qKiBJZiB0cnVlIHRoZSBzb3Vy Y2UgaW5wdXQgc3RyZWFtIGlzIG5vdyBjbG9zZWQuICovDQogICAgcHJvdGVjdGVkIGJvb2xlYW4g Y2xvc2VkID0gZmFsc2U7DQoNCiAgICAvKioNCiAgICAgKiBXcml0ZSBieXRlcyB0byB0aGUgc3Ry ZWFtLg0KICAgICAqDQogICAgICogQHBhcmFtIGRhdGEgYWxsIGJ5dGVzIG9mIHRoaXMgYXJyYXkg YXJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbQ0KICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2Vw dGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHdyaXRpbmcgdGhlIGRhdGENCiAgICAgKi8NCiAg ICBwcm90ZWN0ZWQgdm9pZCB3cml0ZShieXRlW10gZGF0YSkgdGhyb3dzIGphdmEuaW8uSU9FeGNl cHRpb24gew0KICAgICAgICB3cml0ZShkYXRhLCBkYXRhLmxlbmd0aCk7DQogICAgfQ0KDQogICAg LyoqDQogICAgICogVGhpcyBtZXRob2QgaXMgYSBsb3cgbGV2ZWwgd3JpdGUuDQogICAgICogTm90 ZSBpdCBpcyBkZXNpZ25lZCB0byBpbiB0aGUgZnV0dXJlIHRvIGFsbG93IHN0cmVhbWluZyB0byBi b3RoIG1lbW9yeQ0KICAgICAqICBBTkQgdG8gZGlzayBzaW11bHRhbmVvdXNseS4NCiAgICAgKg0K ICAgICAqIEBwYXJhbSBkYXRhDQogICAgICogQHBhcmFtIGxlbmd0aA0KICAgICAqDQogICAgICog QHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uDQogICAgICovDQogICAgcHJvdGVjdGVkIHN5bmNo cm9uaXplZCB2b2lkIHdyaXRlKGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoKQ0KICAgICAgICAgICAg dGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KDQogICAgICAgIGlmIChjbG9zZWQpIHsNCiAg ICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3Nh Z2UoInN0cmVhbUNsb3NlZCIpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGludCB3cml0ZXN6ID0g bGVuZ3RoOw0KICAgICAgICBpbnQgYnl0ZXN3cml0dGVuID0gMDsNCg0KICAgICAgICBpZiAoKG51 bGwgIT0gbWVtb3J5YnVmbGlzdCkNCiAgICAgICAgICAgICAgICAmJiAodG90YWxzeiArIHdyaXRl c3ogPiBtYXhDYWNoZWQpKSB7ICAgIC8vIENhY2hlIHRvIGRpc2suDQogICAgICAgICAgICBpZiAo bnVsbCA9PSBjYWNoZWRpc2tzdHJlYW0pIHsgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0 ZSBhIGRpc2sgY2FjaGUNCiAgICAgICAgICAgICAgICBmbHVzaFRvRGlzaygpOw0KICAgICAgICAg ICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG1lbW9yeWJ1Zmxpc3QgIT0gbnVsbCkgeyAg ICAvLyBDYW4gd3JpdGUgdG8gbWVtb3J5Lg0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAg ICAgIGlmIChudWxsID09IGN1cnJlbnRNZW1vcnlCdWYpIHsNCiAgICAgICAgICAgICAgICAgICAg Y3VycmVudE1lbW9yeUJ1ZiA9IG5ldyBieXRlW1JFQURfQ0hVTktfU1pdOw0KICAgICAgICAgICAg ICAgICAgICBjdXJyZW50TWVtb3J5QnVmU3ogPSAwOw0KDQogICAgICAgICAgICAgICAgICAgIG1l bW9yeWJ1Zmxpc3QuYWRkKGN1cnJlbnRNZW1vcnlCdWYpOw0KICAgICAgICAgICAgICAgIH0NCg0K ICAgICAgICAgICAgICAgIC8vIGJ5dGVzIHRvIHdyaXRlIGlzIHRoZSBtaW4uIGJldHdlZW4gdGhl IHJlbWFpbmluZyBieXRlcyBhbmQgd2hhdCBpcyBsZWZ0IGluIHRoaXMgYnVmZmVyLg0KICAgICAg ICAgICAgICAgIGludCBieXRlczJ3cml0ZSA9IE1hdGgubWluKCh3cml0ZXN6IC0gYnl0ZXN3cml0 dGVuKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50TWVtb3J5QnVmLmxlbmd0aA0K ICAgICAgICAgICAgICAgICAgICAgICAgLSBjdXJyZW50TWVtb3J5QnVmU3opKTsNCg0KICAgICAg ICAgICAgICAgIC8vIGNvcHkgdGhlIGRhdGEuDQogICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5 Y29weShkYXRhLCBieXRlc3dyaXR0ZW4sIGN1cnJlbnRNZW1vcnlCdWYsDQogICAgICAgICAgICAg ICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmU3osIGJ5dGVzMndyaXRlKTsNCg0KICAgICAgICAg ICAgICAgIGJ5dGVzd3JpdHRlbiArPSBieXRlczJ3cml0ZTsNCiAgICAgICAgICAgICAgICBjdXJy ZW50TWVtb3J5QnVmU3ogKz0gYnl0ZXMyd3JpdGU7DQoNCiAgICAgICAgICAgICAgICBpZiAoYnl0 ZXN3cml0dGVuDQogICAgICAgICAgICAgICAgICAgICAgICA8IHdyaXRlc3opIHsgICAgLy8gb25s eSBnZXQgbW9yZSBpZiB3ZSByZWFsbHkgbmVlZCBpdC4NCiAgICAgICAgICAgICAgICAgICAgY3Vy cmVudE1lbW9yeUJ1ZiA9IG5ldyBieXRlW1JFQURfQ0hVTktfU1pdOw0KICAgICAgICAgICAgICAg ICAgICBjdXJyZW50TWVtb3J5QnVmU3ogPSAwOw0KDQogICAgICAgICAgICAgICAgICAgIG1lbW9y eWJ1Zmxpc3QuYWRkKGN1cnJlbnRNZW1vcnlCdWYpOyAgICAvLyBhZGQgaXQgdG8gdGhlIGNoYWlu Lg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gd2hpbGUgKGJ5dGVzd3JpdHRlbiA8 IHdyaXRlc3opOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG51bGwgIT0gY2FjaGVkaXNrc3Ry ZWFtKSB7ICAgIC8vIFdyaXRlIHRvIHRoZSBvdXQgZ29pbmcgc3RyZWFtLg0KICAgICAgICAgICAg Y2FjaGVkaXNrc3RyZWFtLndyaXRlKGRhdGEsIDAsIGxlbmd0aCk7DQogICAgICAgIH0NCg0KICAg ICAgICB0b3RhbHN6ICs9IHdyaXRlc3o7DQoNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAg IC8qKg0KICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgbG93IGxldmVsIHdyaXRlLg0KICAgICAqIENs b3NlIHRoZSBzdHJlYW0uDQogICAgICoNCiAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRp b24NCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJv d3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQoNCiAgICAgICAgaWYgKCFjbG9zZWQpIHsNCiAgICAg ICAgICAgIGNsb3NlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAvLyBNYXJraXQgYXMgY2xv c2VkLg0KDQogICAgICAgICAgICBpZiAobnVsbCAhPSBjYWNoZWRpc2tzdHJlYW0pIHsgICAgLy8g Y2xvc2UgdGhlIGRpc2sgY2FjaGUuDQogICAgICAgICAgICAgICAgY2FjaGVkaXNrc3RyZWFtLmNs b3NlKCk7DQoNCiAgICAgICAgICAgICAgICBjYWNoZWRpc2tzdHJlYW0gPSBudWxsOw0KICAgICAg ICAgICAgfQ0KDQogICAgICAgICAgICBpZiAobnVsbCAhPSBtZW1vcnlidWZsaXN0KSB7ICAgICAg Ly8gVGhlcmUgaXMgYSBtZW1vcnkgYnVmZmVyLg0KICAgICAgICAgICAgICAgIGlmIChjdXJyZW50 TWVtb3J5QnVmU3ogPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIGJ5dGVbXSB0bXAgPQ0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW2N1cnJlbnRNZW1vcnlCdWZTel07ICAg IC8vIEdldCB0aGUgbGFzdCBidWZmZXIgYW5kIG1ha2UgaXQgdGhlIHNpemVvZiB0aGUgYWN0dWFs IGRhdGEuDQoNCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjdXJyZW50TWVt b3J5QnVmLCAwLCB0bXAsIDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1l bW9yeUJ1ZlN6KTsNCiAgICAgICAgICAgICAgICAgICAgbWVtb3J5YnVmbGlzdC5zZXQoDQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5YnVmbGlzdC5zaXplKCkgLSAxLA0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHRtcCk7ICAgICAgICAgICAgICAgICAvLyBOb3cgcmVwbGFj ZSB0aGUgbGFzdCBidWZmZXIgd2l0aCB0aGlzIHNpemUuDQogICAgICAgICAgICAgICAgfQ0KDQog ICAgICAgICAgICAgICAgY3VycmVudE1lbW9yeUJ1ZiA9IG51bGw7ICAgICAgLy8gTm8gbmVlZCBm b3IgdGhpcyBhbnltb3JlLg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAg cHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsNCg0KICAgICAgICBp ZiAobnVsbCAhPSBjYWNoZWRpc2tzdHJlYW0pIHsgICAgLy8gY2xvc2UgdGhlIGRpc2sgY2FjaGUu DQogICAgICAgICAgICBjYWNoZWRpc2tzdHJlYW0uY2xvc2UoKTsNCg0KICAgICAgICAgICAgY2Fj aGVkaXNrc3RyZWFtID0gbnVsbDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAq IFJvdXRpbmUgdG8gZmx1c2ggZGF0YSB0byBkaXNrIGlmIGlzIGluIG1lbW9yeS4NCiAgICAgKg0K ICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbg0KICAgICAqIEB0aHJvd3MgamF2YS5p by5GaWxlTm90Rm91bmRFeGNlcHRpb24NCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgdm9pZCBmbHVz aFRvRGlzaygpDQogICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5p by5GaWxlTm90Rm91bmRFeGNlcHRpb24gew0KDQogICAgICAgIGphdmEudXRpbC5MaW5rZWRMaXN0 IG1sID0gbWVtb3J5YnVmbGlzdDsNCg0KICAgICAgICBtZW1vcnlidWZsaXN0ID0gbnVsbDsNCg0K ICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWF4Q2FjaGVkIiwgIiIgKyBt YXhDYWNoZWQsDQogICAgICAgICAgICAgICAgIiIgKyB0b3RhbHN6KSk7DQoNCiAgICAgICAgaWYg KG1sICE9IG51bGwpIHsNCiAgICAgICAgICAgIGlmIChudWxsID09IGNhY2hlZGlza3N0cmVhbSkg eyAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIGRpc2sgY2FjaGUNCiAgICAgICAgICAgICAgICB0cnkg ew0KICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IE1lc3NhZ2VDb250ZXh0 LmdldEN1cnJlbnRDb250ZXh0KCk7DQogICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRkaXIg PSAobWMgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwNCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICA6IG1jLmdldFN0clByb3AoDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5BVFRBQ0hNRU5UU19ESVIpOw0KDQog ICAgICAgICAgICAgICAgICAgIGRpc2tDYWNoZUZpbGUgPSBqYXZhLmlvLkZpbGUuY3JlYXRlVGVt cEZpbGUoIkF4aXMiLCAiYXhpcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0dGRp ciA9PSBudWxsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbA0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDogbmV3IEZpbGUoDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBhdHRkaXIpKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1 Z0VuYWJsZWQoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKA0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoDQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAiZGlza0NhY2hlIiwgZGlza0NhY2hlRmlsZS5nZXRBYnNv bHV0ZVBhdGgoKSkpOw0KICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAg ICAgIGNhY2hlZGlza3N0cmVhbSA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0o ZGlza0NhY2hlRmlsZSkpOw0KDQogICAgICAgICAgICAgICAgICAgIGludCBsaXN0c3ogPSBtbC5z aXplKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBlbnRpcmUgbWVt b3J5IGhlbGQgc3RvcmUgdG8gZGlzay4NCiAgICAgICAgICAgICAgICAgICAgZm9yIChqYXZhLnV0 aWwuSXRlcmF0b3IgaXQgPSBtbC5pdGVyYXRvcigpOw0KICAgICAgICAgICAgICAgICAgICAgICAg IGl0Lmhhc05leHQoKTspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSByYnVmID0g KGJ5dGVbXSkgaXQubmV4dCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ3cml0ZSA9 IChsaXN0c3otLSA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGN1cnJl bnRNZW1vcnlCdWZTeg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJidWYubGVu Z3RoOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRpc2tzdHJlYW0ud3JpdGUocmJ1 ZiwgMCwgYndyaXRlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlZCkgew0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZGlza3N0cmVhbS5jbG9zZSgpOw0KDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkaXNrc3RyZWFtID0gbnVsbDsNCiAgICAg ICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAg ICAgICAgICAgIG1lbW9yeWJ1Zmxpc3QgPSBudWxsOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2gg KGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbiBzZSkgew0KICAgICAgICAgICAgICAgICAgICBk aXNrQ2FjaGVGaWxlID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgY2FjaGVkaXNrc3RyZWFt ID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgbWF4Q2FjaGVkID0gamF2YS5sYW5nLkludGVn ZXIuTUFYX1ZBTFVFOw0KDQogICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdl dE1lc3NhZ2UoIm5vZGlzazAwIiksIHNlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAg ICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4g ZGVsZXRlKCkgew0KDQogICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7DQoNCiAgICAgICAgZGVs ZXRlZCA9IHRydWU7DQoNCiAgICAgICAgbWVtb3J5YnVmbGlzdCA9IG51bGw7DQoNCiAgICAgICAg aWYgKGRpc2tDYWNoZUZpbGUgIT0gbnVsbCkgew0KICAgICAgICAgICAgaWYgKGNhY2hlZGlza3N0 cmVhbSAhPSBudWxsKSB7DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAg ICAgY2FjaGVkaXNrc3RyZWFtLmNsb3NlKCk7DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhj ZXB0aW9uIGUpIHsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBjYWNoZWRp c2tzdHJlYW0gPSBudWxsOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmb3IgKGphdmEu dXRpbC5JdGVyYXRvciBpID0gcmVhZGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KICAgICAgICAg ICAgICAgICBpLmhhc05leHQoKTspIHsNCiAgICAgICAgICAgICAgICBJbnN0cmVhbSBzdHJlYW0g PSAoSW5zdHJlYW0pIGkubmV4dCgpOw0KDQogICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gc3Ry ZWFtKSB7DQogICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAg ICBzdHJlYW0uY2xvc2VTdHJlYW0oKTsNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhj ZXB0aW9uIGUpIHsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAg ICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmVhZGVycy5jbGVhcigpOw0KDQogICAgICAgICAg ICB0cnkgew0KICAgICAgICAgICAgICAgIGRpc2tDYWNoZUZpbGUuZGVsZXRlKCk7DQoNCiAgICAg ICAgICAgICAgICByZXQgPSB0cnVlOw0KICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUp IHsNCg0KICAgICAgICAgICAgICAgIC8vIEdpdmUgaXQgb3VyIGJlc3Qgc2hvdC4NCiAgICAgICAg ICAgICAgICBkaXNrQ2FjaGVGaWxlLmRlbGV0ZU9uRXhpdCgpOw0KICAgICAgICAgICAgfQ0KICAg ICAgICB9DQoNCg0KICAgICAgICByZXR1cm4gcmV0Ow0KICAgIH0NCg0KICAgIC8vIGlubmVyIGNs YXNzZXMgY2Fubm90IGhhdmUgc3RhdGljIGRlY2xhcmF0aW9ucy4uLg0KDQogICAgLyoqIEZpZWxk IGlzX2xvZyAgICAgICAgICAgKi8NCiAgICBwcm90ZWN0ZWQgc3RhdGljIExvZyBpc19sb2cgPQ0K ICAgICAgICBMb2dGYWN0b3J5LmdldExvZyhJbnN0cmVhbS5jbGFzcy5nZXROYW1lKCkpOw0KDQog ICAgLyoqDQogICAgICogSW5uZXIgY2xhc3MgdG8gaGFuZGxlIGdldHRpbmcgYW4gaW5wdXQgc3Ry ZWFtIHRvIHRoaXMgZGF0YSBzb3VyY2UNCiAgICAgKiAgSGFuZGxlcyBjcmVhdGluZyBhbiBpbnB1 dCBzdHJlYW0gdG8gdGhlIHNvdXJjZS4NCiAgICAgKi8NCiAgICBwcml2YXRlIGNsYXNzIEluc3Ry ZWFtIGV4dGVuZHMgamF2YS5pby5JbnB1dFN0cmVhbSB7DQoNCiAgICAgICAgLyoqIGJ5dGVzIHJl YWQuICovDQogICAgICAgIHByb3RlY3RlZCBpbnQgYnJlYWQgPSAwOw0KDQogICAgICAgIC8qKiBU aGUgcmVhbCBzdHJlYW0uICovDQogICAgICAgIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtIGZpbiA9 IG51bGw7DQoNCiAgICAgICAgLyoqIFRoZSBwb3NpdGlvbiBpbiB0aGUgbGlzdCB3ZXJlIHdlIGFy ZSByZWFkaW5nIGZyb20uICovDQogICAgICAgIGludCBjdXJyZW50SW5kZXggPQ0KICAgICAgICAg ICAgICAgIDA7DQoNCiAgICAgICAgLyoqIHRoZSBidWZmZXIgd2UgYXJlIGN1cnJlbnRseSByZWFk aW5nIGZyb20uICovDQogICAgICAgIGJ5dGVbXSBjdXJyZW50QnVmID0gbnVsbDsNCg0KICAgICAg ICAvKiogVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlcmUuICovDQogICAgICAgIGludCBjdXJy ZW50QnVmUG9zID0gMDsNCg0KICAgICAgICAvKiogVGhlIHJlYWQgc3RyZWFtIGhhcyBiZWVuIGNs b3NlZC4gKi8NCiAgICAgICAgYm9vbGVhbiByZWFkQ2xvc2VkID0gZmFsc2U7DQoNCiAgICAgICAg LyoqDQogICAgICAgICAqIENvbnN0cnVjdG9yIEluc3RyZWFtLg0KICAgICAgICAgKg0KICAgICAg ICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gaWYgdGhlIEluc3RyZWFtIGNvdWxkIG5v dCBiZSBjcmVhdGVkIG9yDQogICAgICAgICAqICAgICAgICAgICAgICBpZiB0aGUgZGF0YSBzb3Vy Y2UgaGFzIGJlZW4gZGVsZXRlZA0KICAgICAgICAgKi8NCiAgICAgICAgcHJvdGVjdGVkIEluc3Ry ZWFtKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KDQogICAgICAgICAgICBpZiAoZGVs ZXRlZCkgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKA0K ICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVzb3VyY2VEZWxl dGVkIikpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZWFkZXJzLnB1dCh0aGlzLCBu dWxsKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBRdWVyeSBmb3IgdGhl IG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcuDQogICAgICAgICAqDQogICAg ICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0DQogICAgICAgICAqDQogICAg ICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGlzIHN0cmVhbSBpcyBub3Qg aW4gYSBzdGF0ZSB0aGF0DQogICAgICAgICAqICAgICAgICAgICAgICBzdXBwb3J0cyByZWFkaW5n DQogICAgICAgICAqLw0KICAgICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBqYXZh LmlvLklPRXhjZXB0aW9uIHsNCg0KICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHsNCiAgICAgICAg ICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigNCiAgICAgICAgICAgICAgICAg ICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInJlc291cmNlRGVsZXRlZCIpKTsNCiAgICAgICAg ICAgIH0NCg0KICAgICAgICAgICAgaWYgKHJlYWRDbG9zZWQpIHsNCiAgICAgICAgICAgICAgICB0 aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigNCiAgICAgICAgICAgICAgICAgICAgICAgIE1l c3NhZ2VzLmdldE1lc3NhZ2UoInN0cmVhbUNsb3NlZCIpKTsNCiAgICAgICAgICAgIH0NCiAgICAg ICAgICAgIC8vIFdpbGwgcmV0dXJuIG5lZy4gdmFsdWUgd2hlbiB0b3RhbHN6ID4gMkdiDQogICAg ICAgICAgICBpbnQgcmV0ID0gbmV3IExvbmcodG90YWxzeiAtIGJyZWFkKS5pbnRWYWx1ZSgpOw0K DQogICAgICAgICAgICBpZiAoZGVidWdFbmFibGVkKSB7DQogICAgICAgICAgICAgICAgaXNfbG9n LmRlYnVnKCJhdmFpbGFibGUoKSA9ICIgKyByZXQgKyAiLiIpOw0KICAgICAgICAgICAgfQ0KDQog ICAgICAgICAgICByZXR1cm4gcmV0Ow0KICAgICAgICB9DQoNCiAgICAgICAgLyoqDQogICAgICAg ICAqIFJlYWQgYSBieXRlIGZyb20gdGhlIHN0cmVhbS4NCiAgICAgICAgICoNCiAgICAgICAgICog QHJldHVybiBieXRlIHJlYWQgb3IgLTEgaWYgbm8gbW9yZSBkYXRhLg0KICAgICAgICAgKg0KICAg ICAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24NCiAgICAgICAgICovDQogICAgICAg IHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCg0KICAgICAg ICAgICAgc3luY2hyb25pemVkIChNYW5hZ2VkTWVtb3J5RGF0YVNvdXJjZS50aGlzKSB7DQogICAg ICAgICAgICAgICAgYnl0ZVtdIHJldGIgPSBuZXcgYnl0ZVsxXTsNCiAgICAgICAgICAgICAgICBp bnQgYnIgPSByZWFkKHJldGIsIDAsIDEpOw0KDQogICAgICAgICAgICAgICAgaWYgKGJyID09IC0x KSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgICAgICAgICB9DQog ICAgICAgICAgICAgICAgcmV0dXJuIDB4RkYgJiByZXRiWzBdOw0KICAgICAgICAgICAgfQ0KICAg ICAgICB9DQoNCiAgICAgICAgLyoqDQogICAgICAgICAqIE5vdCBzdXBwb3J0ZWQuDQogICAgICAg ICAqDQogICAgICAgICAqIEByZXR1cm4NCiAgICAgICAgICovDQogICAgICAgIHB1YmxpYyBib29s ZWFuIG1hcmtTdXBwb3J0ZWQoKSB7DQoNCiAgICAgICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHsN CiAgICAgICAgICAgICAgICBpc19sb2cuZGVidWcoIm1hcmtTdXBwb3J0ZWQoKSA9ICIgKyBmYWxz ZSArICIuIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAg ICAgICAgfQ0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBOb3Qgc3VwcG9ydGVkLg0KICAgICAg ICAgKg0KICAgICAgICAgKiBAcGFyYW0gcmVhZGxpbWl0DQogICAgICAgICAqLw0KICAgICAgICBw dWJsaWMgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsNCg0KICAgICAgICAgICAgaWYgKGRlYnVn RW5hYmxlZCkgew0KICAgICAgICAgICAgICAgIGlzX2xvZy5kZWJ1ZygibWFyaygpIik7DQogICAg ICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvKioNCiAgICAgICAgICogTm90IHN1cHBv cnRlZC4NCiAgICAgICAgICoNCiAgICAgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9u DQogICAgICAgICAqLw0KICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBqYXZhLmlv LklPRXhjZXB0aW9uIHsNCg0KICAgICAgICAgICAgaWYgKGRlYnVnRW5hYmxlZCkgew0KICAgICAg ICAgICAgICAgIGlzX2xvZy5kZWJ1ZygicmVzZXQoKSIpOw0KICAgICAgICAgICAgfQ0KDQogICAg ICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdl KCJub1Jlc2V0TWFyayIpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBsb25nIHNraXAo bG9uZyBza2lwcGVkKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQoNCiAgICAgICAgICAg IGlmIChkZWJ1Z0VuYWJsZWQpIHsNCiAgICAgICAgICAgICAgICBpc19sb2cuZGVidWcoInNraXAo IiArIHNraXBwZWQgKyAiKS4iKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGRl bGV0ZWQpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigN CiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInJlc291cmNlRGVs ZXRlZCIpKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHJlYWRDbG9zZWQpIHsN CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigNCiAgICAgICAg ICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInN0cmVhbUNsb3NlZCIpKTsNCiAg ICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHNraXBwZWQgPCAxKSB7DQogICAgICAgICAg ICAgICAgcmV0dXJuIDA7ICAgIC8vIG5vdGhpbmcgdG8gc2tpcC4NCiAgICAgICAgICAgIH0NCg0K ICAgICAgICAgICAgc3luY2hyb25pemVkIChNYW5hZ2VkTWVtb3J5RGF0YVNvdXJjZS50aGlzKSB7 DQogICAgICAgICAgICAgICAgc2tpcHBlZCA9IE1hdGgubWluKHNraXBwZWQsDQogICAgICAgICAg ICAgICAgICAgICAgICB0b3RhbHN6DQogICAgICAgICAgICAgICAgICAgICAgICAtIGJyZWFkKTsg ICAgLy8gb25seSBza2lwIHdoYXQgd2UndmUgcmVhZC4NCg0KICAgICAgICAgICAgICAgIGlmIChz a2lwcGVkID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICAg ICAgICAgfQ0KDQogICAgICAgICAgICAgICAgamF2YS51dGlsLkxpc3QgbWwgPSBtZW1vcnlidWZs aXN0OyAgICAvLyBob2xkIHRoZSBtZW1vcnkgbGlzdC4NCiAgICAgICAgICAgICAgICBpbnQgYndy aXR0ZW4gPSAwOw0KDQogICAgICAgICAgICAgICAgaWYgKG1sICE9IG51bGwpIHsNCiAgICAgICAg ICAgICAgICAgICAgaWYgKG51bGwgPT0gY3VycmVudEJ1ZikgeyAgICAvLyBnZXQgdGhlIGJ1ZmZl ciB3ZSBuZWVkIHRvIHJlYWQgZnJvbS4NCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRC dWYgPSAoYnl0ZVtdKSBtbC5nZXQoY3VycmVudEluZGV4KTsNCiAgICAgICAgICAgICAgICAgICAg ICAgIGN1cnJlbnRCdWZQb3MgPSAwOyAgICAvLyBzdGFydCByZWFkaW5nIGZyb20gdGhlIGJlZ2lu aW5nLg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZG8gew0K ICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBiY29weSA9IE1hdGgubWluKGN1cnJlbnRCdWYu bGVuZ3RoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY3VycmVudEJ1ZlBvcywN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCAtIGJ3cml0dGVuKTsNCg0K ICAgICAgICAgICAgICAgICAgICAgICAgYndyaXR0ZW4gKz0gYmNvcHk7DQogICAgICAgICAgICAg ICAgICAgICAgICBjdXJyZW50QnVmUG9zICs9IGJjb3B5Ow0KDQogICAgICAgICAgICAgICAgICAg ICAgICBpZiAoYndyaXR0ZW4gPCBza2lwcGVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgY3VycmVudEJ1ZiA9IChieXRlW10pIG1sLmdldCgrK2N1cnJlbnRJbmRleCk7DQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZlBvcyA9IDA7DQogICAgICAgICAgICAgICAg ICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGJ3cml0dGVuIDwgc2tpcHBl ZCk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZmlu KSB7DQogICAgICAgICAgICAgICAgICAgIGZpbi5za2lwKHNraXBwZWQpOw0KICAgICAgICAgICAg ICAgIH0NCg0KICAgICAgICAgICAgICAgIGJyZWFkICs9IHNraXBwZWQ7DQogICAgICAgICAgICB9 DQoNCiAgICAgICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHsNCiAgICAgICAgICAgICAgICBpc19s b2cuZGVidWcoInNraXBwZWQgIiArIHNraXBwZWQgKyAiLiIpOw0KICAgICAgICAgICAgfQ0KDQog ICAgICAgICAgICByZXR1cm4gc2tpcHBlZDsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBp bnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIGphdmEuaW8uSU9FeGNl cHRpb24gew0KDQogICAgICAgICAgICBpZiAoZGVidWdFbmFibGVkKSB7DQogICAgICAgICAgICAg ICAgaXNfbG9nLmRlYnVnKHRoaXMuaGFzaENvZGUoKSArICIgcmVhZCgiICsgb2ZmICsgIiwgIiAr IGxlbg0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSIpOw0KICAgICAgICAgICAgfQ0KDQog ICAgICAgICAgICBpZiAoZGVsZXRlZCkgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZh LmlvLklPRXhjZXB0aW9uKA0KICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVz c2FnZSgicmVzb3VyY2VEZWxldGVkIikpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBp ZiAocmVhZENsb3NlZCkgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhj ZXB0aW9uKA0KICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgic3Ry ZWFtQ2xvc2VkIikpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoYiA9PSBudWxs KSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKE1lc3NhZ2Vz LmdldE1lc3NhZ2UoIm51bGxJbnB1dCIpKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAg aWYgKG9mZiA8IDApIHsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5k c0V4Y2VwdGlvbigNCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2Uo Im5lZ09mZnNldCIsICIiICsgb2ZmKSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlm IChsZW4gPCAwKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNF eGNlcHRpb24oDQogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJs ZW5ndGgiLCAiIiArIGxlbikpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAobGVu ICsgb2ZmID4gYi5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRP ZkJvdW5kc0V4Y2VwdGlvbigNCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1l c3NhZ2UoIndyaXRlQmV5b25kIikpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAo bGVuID09IDApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCg0K ICAgICAgICAgICAgaW50IGJ3cml0dGVuID0gMDsNCg0KICAgICAgICAgICAgc3luY2hyb25pemVk IChNYW5hZ2VkTWVtb3J5RGF0YVNvdXJjZS50aGlzKSB7DQogICAgICAgICAgICAgICAgaWYgKGJy ZWFkID09IHRvdGFsc3opIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAg ICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IG1sID0gbWVtb3J5 YnVmbGlzdDsNCg0KICAgICAgICAgICAgICAgIGxvbmcgbG9uZ2xlbiA9IGxlbjsNCiAgICAgICAg ICAgICAgICBsb25nbGVuID0gTWF0aC5taW4oDQogICAgICAgICAgICAgICAgICAgICAgICBsb25n bGVuLA0KICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxzeg0KICAgICAgICAgICAgICAgICAg ICAgICAgLSBicmVhZCk7ICAgIC8vIE9ubHkgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4g dGhlIGRhdGEgc3RvcmUgdGhhdCBpcyBsZWZ0Lg0KICAgICAgICAgICAgICAgIGxlbiA9IG5ldyBM b25nKGxvbmdsZW4pLmludFZhbHVlKCk7DQoNCiAgICAgICAgICAgICAgICBpZiAoZGVidWdFbmFi bGVkKSB7DQogICAgICAgICAgICAgICAgICAgIGlzX2xvZy5kZWJ1ZygibGVuID0gIiArIGxlbik7 DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKG1sICE9IG51bGwpIHsN CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gY3VycmVudEJ1ZikgeyAgICAvLyBHZXQg dGhlIGJ1ZmZlciB3ZSBuZWVkIHRvIHJlYWQgZnJvbS4NCiAgICAgICAgICAgICAgICAgICAgICAg IGN1cnJlbnRCdWYgPSAoYnl0ZVtdKSBtbC5nZXQoY3VycmVudEluZGV4KTsNCiAgICAgICAgICAg ICAgICAgICAgICAgIGN1cnJlbnRCdWZQb3MgPSAwOyAgICAvLyBOZXcgYnVmZmVyIHN0YXJ0IGZy b20gdGhlIGJlZ2luaW5nLg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAg ICAgICAgZG8gew0KDQogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYnl0ZXMgdG8gY29w eSwgdGhlIG1pbmltdW0gb2YgdGhlIGJ5dGVzIGxlZnQgaW4gdGhpcyBidWZmZXIgb3IgYnl0ZXMg cmVtYWluaW5nLg0KICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJjb3B5ID0gTWF0aC5taW4o Y3VycmVudEJ1Zi5sZW5ndGggLSBjdXJyZW50QnVmUG9zLA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBsZW4gLSBid3JpdHRlbik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIC8v IENvcHkgdGhlIGRhdGEuDQogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5 KGN1cnJlbnRCdWYsIGN1cnJlbnRCdWZQb3MsIGIsDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG9mZiArIGJ3cml0dGVuLCBiY29weSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAg IGJ3cml0dGVuICs9IGJjb3B5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZlBv cyArPSBiY29weTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ3cml0dGVuIDwgbGVu KSB7ICAgIC8vIEdldCB0aGUgbmV4dCBidWZmZXIuDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgY3VycmVudEJ1ZiA9IChieXRlW10pIG1sLmdldCgrK2N1cnJlbnRJbmRleCk7DQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZlBvcyA9IDA7DQogICAgICAgICAgICAgICAg ICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGJ3cml0dGVuIDwgbGVuKTsN CiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoKGJ3cml0dGVuID09IDAp ICYmIChudWxsICE9IGRpc2tDYWNoZUZpbGUpKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChk ZWJ1Z0VuYWJsZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xvZy5kZWJ1ZyhNZXNz YWdlcy5nZXRNZXNzYWdlKCJyZWFkaW5nIiwgIiIgKyBsZW4pKTsNCiAgICAgICAgICAgICAgICAg ICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGZpbikgeyAgICAgICAgICAg Ly8gd2UgYXJlIG5vdyByZWFkaW5nIGZyb20gZGlzay4NCiAgICAgICAgICAgICAgICAgICAgICAg IGlmIChkZWJ1Z0VuYWJsZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19sb2cu ZGVidWcoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRN ZXNzYWdlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3Bl bkJyZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlz a0NhY2hlRmlsZS5nZXRDYW5vbmljYWxQYXRoKCkpKTsNCiAgICAgICAgICAgICAgICAgICAgICAg IH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRW5hYmxlZCkgew0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlzX2xvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJv cGVuQnJlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgKyBicmVh ZCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAg ICBmaW4gPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZGlza0NhY2hlRmlsZSk7DQoNCiAg ICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVhZCA+IDApIHsNCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICBmaW4uc2tpcChicmVhZCk7ICAgICAvLyBTa2lwIHdoYXQgd2UndmUgcmVhZCBz byBmYXIuDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0N Cg0KICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkaXNrc3RyZWFtICE9IG51bGwpIHsNCiAg ICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHsNCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpc19sb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZmx1c2hpbmci KSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAg IGNhY2hlZGlza3N0cmVhbS5mbHVzaCgpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAg ICAgICAgICAgICAgICAgaWYgKGRlYnVnRW5hYmxlZCkgew0KICAgICAgICAgICAgICAgICAgICAg ICAgaXNfbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImZsdXNoaW5nIikpOw0KICAgICAg ICAgICAgICAgICAgICAgICAgaXNfbG9nLmRlYnVnKCJsZW49IiArIGxlbik7DQogICAgICAgICAg ICAgICAgICAgICAgICBpc19sb2cuZGVidWcoIm9mZj0iICsgb2ZmKTsNCiAgICAgICAgICAgICAg ICAgICAgICAgIGlzX2xvZy5kZWJ1ZygiYi5sZW5ndGg9IiArIGIubGVuZ3RoKTsNCiAgICAgICAg ICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGJ3cml0dGVuID0gZmluLnJlYWQo Yiwgb2ZmLCBsZW4pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChi d3JpdHRlbiA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWQgKz0gYndyaXR0ZW47DQog ICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoZGVidWdF bmFibGVkKSB7DQogICAgICAgICAgICAgICAgaXNfbG9nLmRlYnVnKHRoaXMuaGFzaENvZGUoKQ0K ICAgICAgICAgICAgICAgICAgICAgICAgKyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJyZWFkIiwgIiIg KyBid3JpdHRlbikpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gYndyaXR0 ZW47DQogICAgICAgIH0NCg0KICAgICAgICAvKioNCiAgICAgICAgICogY2xvc2UgdGhlIHN0cmVh bS4NCiAgICAgICAgICoNCiAgICAgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uDQog ICAgICAgICAqLw0KICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJv d3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQoNCiAgICAgICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQp IHsNCiAgICAgICAgICAgICAgICBpc19sb2cuZGVidWcoImNsb3NlKCkiKTsNCiAgICAgICAgICAg IH0NCg0KICAgICAgICAgICAgaWYgKCFyZWFkQ2xvc2VkKSB7DQogICAgICAgICAgICAgICAgcmVh ZGVycy5yZW1vdmUodGhpcyk7DQoNCiAgICAgICAgICAgICAgICByZWFkQ2xvc2VkID0gdHJ1ZTsN Cg0KICAgICAgICAgICAgICAgIGlmIChmaW4gIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAg ICBmaW4uY2xvc2UoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBmaW4g PSBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICAvKioNCiAgICAg ICAgICogY2xvc2UgdGhlIHN0cmVhbSB3aXRob3V0IG1vZGlmeWluZyB0aGUgaGFzaG1hcC4NCiAg ICAgICAgICogVGhlIGhhc2htYXAgY29udGFpbmluZyB0aGlzIGlucHV0IHN0cmVhbSBpcyBub3Qg dG8gYmUgbW9kaWZpZWQgaGVyZQ0KICAgICAgICAgKiBhcyB0aGlzIG1ldGhvZCBpcyBpbnZva2Vk IHdoaWxlIGl0ZXJhdGluZyBvdmVyDQogICAgICAgICAqIGVsZW1lbnRzIG9mIHRoaXMgaGFzaG1h cC4NCiAgICAgICAgICoNCiAgICAgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uDQog ICAgICAgICAqLw0KICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2VTdHJlYW0o KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQoNCiAgICAgICAgICAgIGlmIChkZWJ1Z0Vu YWJsZWQpIHsNCiAgICAgICAgICAgICAgICBpc19sb2cuZGVidWcoImNsb3NlKCkiKTsNCiAgICAg ICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKCFyZWFkQ2xvc2VkKSB7DQoNCiAgICAgICAgICAg ICAgICByZWFkQ2xvc2VkID0gdHJ1ZTsNCg0KICAgICAgICAgICAgICAgIGlmIChmaW4gIT0gbnVs bCkgew0KICAgICAgICAgICAgICAgICAgICBmaW4uY2xvc2UoKTsNCiAgICAgICAgICAgICAgICB9 DQoNCiAgICAgICAgICAgICAgICBmaW4gPSBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9 DQoNCiAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsN CiAgICAgICAgICAgIGNsb3NlKCk7DQogICAgICAgIH0NCiAgICB9ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kb2YgaW5uZXJjbGFzcyBJbnN0cmVhbQ0KDQog ICAgLy8gVXNlZCB0byB0ZXN0Lg0KDQogICAgLyoqDQogICAgICogTWV0aG9kIG1haW4NCiAgICAg Kg0KICAgICAqIEBwYXJhbSBhcmcNCiAgICAgKi8NCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFp bihTdHJpbmcgYXJnW10pIHsgICAgLy8gdGVzdA0KDQogICAgICAgIHRyeSB7DQogICAgICAgICAg ICBTdHJpbmcgcmVhZEZpbGUgPSBhcmdbMF07DQogICAgICAgICAgICBTdHJpbmcgd3JpdGVGaWxl ID0gYXJnWzFdOw0KICAgICAgICAgICAgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0gc3MgPQ0KICAg ICAgICAgICAgICAgICAgICBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0ocmVhZEZpbGUpOw0K ICAgICAgICAgICAgTWFuYWdlZE1lbW9yeURhdGFTb3VyY2UgbXMgPQ0KICAgICAgICAgICAgICAg ICAgICBuZXcgTWFuYWdlZE1lbW9yeURhdGFTb3VyY2Uoc3MsIDEwMjQgKiAxMDI0LCAiZm9vL2Rh dGEiLCB0cnVlKTsNCiAgICAgICAgICAgIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgZGgg PQ0KICAgICAgICAgICAgICAgICAgICBuZXcgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciht cyk7DQogICAgICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtIGlzID0gZGguZ2V0SW5wdXRTdHJl YW0oKTsNCiAgICAgICAgICAgIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSBmbyA9DQogICAgICAg ICAgICAgICAgICAgIG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0od3JpdGVGaWxlKTsNCiAg ICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs1MTJdOw0KICAgICAgICAgICAgaW50IHJl YWQgPSAwOw0KDQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgcmVhZCA9IGlzLnJl YWQoYnVmKTsNCg0KICAgICAgICAgICAgICAgIGlmIChyZWFkID4gMCkgew0KICAgICAgICAgICAg ICAgICAgICBmby53cml0ZShidWYsIDAsIHJlYWQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAg ICAgICAgIH0gd2hpbGUgKHJlYWQgPiAtMSk7DQoNCiAgICAgICAgICAgIGZvLmNsb3NlKCk7DQog ICAgICAgICAgICBpcy5jbG9zZSgpOw0KICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0 aW9uIGUpIHsNCiAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKCJleGNl cHRpb24wMCIpLCBlKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIGdldCB0 aGUgZmlsZW5hbWUgb2YgdGhlIGNvbnRlbnQgaWYgaXQgaXMgY2FjaGVkIHRvIGRpc2suDQogICAg ICogQHJldHVybiBmaWxlIG9iamVjdCBwb2ludGluZyB0byBmaWxlLCBvciBudWxsIGZvciBtZW1v cnktc3RvcmVkIGNvbnRlbnQNCiAgICAgKi8NCiAgICBwdWJsaWMgRmlsZSBnZXREaXNrQ2FjaGVG aWxlKCkgew0KICAgICAgICByZXR1cm4gZGlza0NhY2hlRmlsZTsNCiAgICB9DQp9DQo= ------_=_NextPart_001_01C4A701.89EF4302--