From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.20; helo=mga02.intel.com; envelope-from=bob.c.feng@intel.com; receiver=edk2-devel@lists.01.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 18AD72194D3B9 for ; Mon, 10 Dec 2018 04:09:27 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Dec 2018 04:09:27 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,338,1539673200"; d="scan'208";a="97567713" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga007.jf.intel.com with ESMTP; 10 Dec 2018 04:09:27 -0800 Received: from fmsmsx101.amr.corp.intel.com (10.18.124.199) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.408.0; Mon, 10 Dec 2018 04:09:26 -0800 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by fmsmsx101.amr.corp.intel.com (10.18.124.199) with Microsoft SMTP Server (TLS) id 14.3.408.0; Mon, 10 Dec 2018 04:09:26 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.201]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.203]) with mapi id 14.03.0415.000; Mon, 10 Dec 2018 20:09:23 +0800 From: "Feng, Bob C" To: Leif Lindholm CC: "edk2-devel@lists.01.org" , "Carsey, Jaben" , "Gao, Liming" Thread-Topic: [edk2] [Patch] BaseTools: Optimize string concatenation Thread-Index: AQHUd0w33kqZL81XV0agjUNN2Boo7KVFkjQAgAEi7jCAABp5AIAC7bJwgCXdNxCAB9xNAIAAkHJg Date: Mon, 10 Dec 2018 12:09:23 +0000 Message-ID: <08650203BA1BD64D8AD9B6D5D74A85D16002A384@SHSMSX101.ccr.corp.intel.com> References: <20181108101625.41364-1-bob.c.feng@intel.com> <20181108165238.vhdbx2mc42kefvag@bivouac.eciton.net> <08650203BA1BD64D8AD9B6D5D74A85D15FFFBED5@SHSMSX101.ccr.corp.intel.com> <20181109114840.txogb6tz5u23o4ng@bivouac.eciton.net> <08650203BA1BD64D8AD9B6D5D74A85D15FFFCFF1@SHSMSX101.ccr.corp.intel.com> <08650203BA1BD64D8AD9B6D5D74A85D1600264F9@SHSMSX101.ccr.corp.intel.com> <20181210104736.dbvh5czprog6pe3x@bivouac.eciton.net> In-Reply-To: <20181210104736.dbvh5czprog6pe3x@bivouac.eciton.net> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [Patch] BaseTools: Optimize string concatenation X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Dec 2018 12:09:28 -0000 Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGkgTGVpZiwNCg0KRm9yIHRoZSAiY3VzdG9taXplZCBkZWVwY29weSIgYW5kICJjYWNoZSBmb3Ig dW5pIGZpbGUgcGFyc2VyIiBkYXRhLCB5b3UgY2FuIHNlZSB0aGUgQXV0b0dlbiBpcyBub3Qgc2xv d2VyLiBUaGUgd2hvbGUgQnVpbGQgRHVyYXRpb24gaXMgbG9uZ2VyIGJlY2F1c2UgTWFrZSBEdXJh dGlvbiBpcyBsb25nZXIgd2hpbGUgTWFrZSBEdXJhdGlvbiB0aW1lIGRlcGVuZHMgb24gdGhlIGV4 dGVybmFsIG1ha2UsIGNvbXBpbGVyIGFuZCBsaW5rZXIuIFNvIGl0J3Mgbm90IHRoZSBwYXRjaCBt YWtlIHRoZSBidWlsZCBzbG93IGRvd24uDQoNClllcywgIGl0J3Mgbm90IGZhc3RlciBlaXRoZXIu IEkgdGhpbmsgdGhhdCBiZWNhdXNlIHRoZSBPdm1mIHBsYXRmb3JtIGlzIHJlbGF0aXZlbHkgc2lt cGxlLiAgRnJvbSB0aGUgYnVpbGQgdG9vbCBzb3VyY2UgY29kZSBwb2ludCBvZiB2aWV3LCB0aGUg Y3VzdG9taXplZCBkZWVwY29weSB3aWxsIHRha2UgZWZmZWN0IGlmIHRoZSBwbGF0Zm9ybSBlbmFi bGVkIG11bHRpcGxlIFNLVSBvciB0aGVyZSBhcmUgbWFueSBleHByZXNzaW9ucyBpbiBtZXRhZGF0 YSBmaWxlIHRvIGJlIGV2YWx1YXRlZC4gQW5kIHRoZSAiY2FjaGUgZm9yIHVuaSBmaWxlIHBhcnNl ciIgbmVlZHMgdGhlcmUgYXJlIG1hbnkgdW5pIGZpbGVzLiAgVGhlIE92bWYgcGxhdGZvcm0gbG9v a3Mgbm90IGEgZ29vZCBwbGF0Zm9ybSB0byBkZW1vIHRoZSBlZmZlY3Qgb2YgdGhpcyBwYXRjaC4N Cg0KDQpUaGFua3MsDQpCb2INCg0KLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCkZyb206IExl aWYgTGluZGhvbG0gW21haWx0bzpsZWlmLmxpbmRob2xtQGxpbmFyby5vcmddIA0KU2VudDogTW9u ZGF5LCBEZWNlbWJlciAxMCwgMjAxOCA2OjQ4IFBNDQpUbzogRmVuZywgQm9iIEMgPGJvYi5jLmZl bmdAaW50ZWwuY29tPg0KQ2M6IGVkazItZGV2ZWxAbGlzdHMuMDEub3JnOyBDYXJzZXksIEphYmVu IDxqYWJlbi5jYXJzZXlAaW50ZWwuY29tPjsgR2FvLCBMaW1pbmcgPGxpbWluZy5nYW9AaW50ZWwu Y29tPg0KU3ViamVjdDogUmU6IFtlZGsyXSBbUGF0Y2hdIEJhc2VUb29sczogT3B0aW1pemUgc3Ry aW5nIGNvbmNhdGVuYXRpb24NCg0KSGkgQm9iLA0KDQpUaGFua3MuDQoNCkkgYW0gYSBsaXR0bGUg Yml0IGNvbmZ1c2VkIGJ5IHRoZSAiY3VzdG9taXplZCBkZWVwY29weSIgYW5kICJjYWNoZSBmb3Ig dW5pIGZpbGUgcGFyc2VyIiBkYXRhLiBUaGVzZSBsb29rIGxpa2UgdGhleSBhcmUgc2xvd2luZyBk b3duIHJhdGhlciB0aGFuIHNwZWVkaW5nIHVwIHRoZSBidWlsZC4NCg0KUmVnYXJkcywNCg0KTGVp Zg0KDQpPbiBXZWQsIERlYyAwNSwgMjAxOCBhdCAwMjo1MTo1OEFNICswMDAwLCBGZW5nLCBCb2Ig QyB3cm90ZToNCj4gSGksDQo+IA0KPiBJIGhhdmUgYWRkZWQgdGhlIHBlcmZvcm1hbmNlIGRhdGEg aW4gQloNCj4gaHR0cHM6Ly9idWd6aWxsYS50aWFub2NvcmUub3JnL3Nob3dfYnVnLmNnaT9pZD0x Mjg4IC4gUGxlYXNlIGhhdmUgYSANCj4gcmV2aWV3Lg0KPiANCj4gVGhhbmtzLA0KPiBCb2INCj4g DQo+IA0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBlZGsyLWRldmVsIFtt YWlsdG86ZWRrMi1kZXZlbC1ib3VuY2VzQGxpc3RzLjAxLm9yZ10gT24gQmVoYWxmIE9mIA0KPiBG ZW5nLCBCb2IgQw0KPiBTZW50OiBTdW5kYXksIE5vdmVtYmVyIDExLCAyMDE4IDg6NDEgQU0NCj4g VG86IExlaWYgTGluZGhvbG0gPGxlaWYubGluZGhvbG1AbGluYXJvLm9yZz4NCj4gQ2M6IENhcnNl eSwgSmFiZW4gPGphYmVuLmNhcnNleUBpbnRlbC5jb20+OyBlZGsyLWRldmVsQGxpc3RzLjAxLm9y ZzsgDQo+IEdhbywgTGltaW5nIDxsaW1pbmcuZ2FvQGludGVsLmNvbT4NCj4gU3ViamVjdDogUmU6 IFtlZGsyXSBbUGF0Y2hdIEJhc2VUb29sczogT3B0aW1pemUgc3RyaW5nIGNvbmNhdGVuYXRpb24N Cj4gDQo+IEhpIExlaWYsDQo+IA0KPiBJIHVzZSBteSBkZXNrdG9wIHRvIGRvIHRoZSBiZW5jaG1h cmsuDQo+IENQVTogSW50ZWwoUikgQ29yZShUTSkgaTctNjcwMCBDUFUgQCAzLjQwR0h6DQo+IE1l bW9yeTogMTZHDQo+IE9TOiBXaW4xMA0KPiANCj4gSSdsbCBhZGQgdGhlIHBlcmZvcm1hbmNlIGRl dGFpbGVkIGRhdGEgdG8gQlouDQo+IA0KPiAtQm9iDQo+IA0KPiAtLS0tLU9yaWdpbmFsIE1lc3Nh Z2UtLS0tLQ0KPiBGcm9tOiBMZWlmIExpbmRob2xtIFttYWlsdG86bGVpZi5saW5kaG9sbUBsaW5h cm8ub3JnXQ0KPiBTZW50OiBGcmlkYXksIE5vdmVtYmVyIDksIDIwMTggNzo0OSBQTQ0KPiBUbzog RmVuZywgQm9iIEMgPGJvYi5jLmZlbmdAaW50ZWwuY29tPg0KPiBDYzogZWRrMi1kZXZlbEBsaXN0 cy4wMS5vcmc7IENhcnNleSwgSmFiZW4gPGphYmVuLmNhcnNleUBpbnRlbC5jb20+OyANCj4gR2Fv LCBMaW1pbmcgPGxpbWluZy5nYW9AaW50ZWwuY29tPg0KPiBTdWJqZWN0OiBSZTogW2VkazJdIFtQ YXRjaF0gQmFzZVRvb2xzOiBPcHRpbWl6ZSBzdHJpbmcgY29uY2F0ZW5hdGlvbg0KPiANCj4gSGkg Qm9iLA0KPiANCj4gT24gRnJpLCBOb3YgMDksIDIwMTggYXQgMDM6MjU6MDRBTSArMDAwMCwgRmVu ZywgQm9iIEMgd3JvdGU6DQo+ID4gWWVzLiBJIHNob3VsZCBzaG93IHRoZSBkYXRhLg0KPiA+IA0K PiA+IE15IHVuaXRlcyBzY3JpcHRzIGlzIGFzIGJlbG93LiBUaGUgcGFyYW1ldGVyIGxpbmVzIGlz IGEgc3RyaW5nIGxpc3QgDQo+ID4gd2hpY2ggc2l6ZSBpcyA0MzM5NS4gVGhlIHRlc3QgcmVzdWx0 IGlzDQo+ID4gDQo+ID4gJycuam9pbihTdHJpbmcgbGlzdCkgdGltZTogIDAuMDQyMjYyIFN0cmlu ZyArPSBTdHJpbmcgdGltZSAgOiAgDQo+ID4gMy44MjI2OTkNCj4gPiANCj4gPiBkZWYgVGVzdFBs dXMobGluZXMpOg0KPiA+ICAgICBzdHJfdGFyZ2V0ID0gIiINCj4gPiAgICAgDQo+ID4gICAgIGZv ciBsaW5lIGluIGxpbmVzOg0KPiA+ICAgICAgICAgc3RyX3RhcmdldCArPSBsaW5lDQo+ID4gICAg ICAgICANCj4gPiAgICAgcmV0dXJuIHN0cl90YXJnZXQNCj4gPiANCj4gPiBkZWYgVGVzdEpvaW4o bGluZXMpOg0KPiA+ICAgICBzdHJfdGFyZ2V0ID0gW10NCj4gPiAgICAgDQo+ID4gICAgIGZvciBs aW5lIGluIGxpbmVzOg0KPiA+ICAgICAgICAgc3RyX3RhcmdldC5hcHBlbmQobGluZSkNCj4gPiAg ICAgICAgIA0KPiA+ICAgICByZXR1cm4gIiIuam9pbihzdHJfdGFyZ2V0KQ0KPiA+IA0KPiA+IGRl ZiBDb21wYXJlU3RyQ2F0KCk6DQo+ID4gICAgIGxpbmVzID0gR2V0U3RyaW5ncygpDQo+ID4gICAg IHByaW50IChsZW4obGluZXMpKQ0KPiA+ICAgICANCj4gPiAgICAgYmVnaW4gPSB0aW1lLnBlcmZf Y291bnRlcigpDQo+ID4gICAgIGZvciBfIGluIHJhbmdlKDEwKToNCj4gPiAgICAgICAgIFRlc3RK b2luKGxpbmVzKQ0KPiA+ICAgICBlbmQgPSB0aW1lLnBlcmZfY291bnRlcigpIC0gYmVnaW4NCj4g PiAgICAgcHJpbnQgKCInJy5qb2luKFN0cmluZyBsaXN0KSB0aW1lOiAlZiIgJSBlbmQpDQo+ID4g ICAgIA0KPiA+ICAgICBiZWdpbiA9IHRpbWUucGVyZl9jb3VudGVyKCkNCj4gPiAgICAgZm9yIF8g aW4gcmFuZ2UoMTApOg0KPiA+ICAgICAgICAgVGVzdFBsdXMobGluZXMpDQo+ID4gICAgIGVuZCA9 IHRpbWUucGVyZl9jb3VudGVyKCkgLSBiZWdpbg0KPiA+ICAgICBwcmludCAoIlN0cmluZyArPSBT dHJpbmcgdGltZTogJWYiICUgZW5kKQ0KPiA+IA0KPiA+IEZvciBidWlsZCBPdm1mWDY0LCBpdCdz IG5vdCB2ZXJ5IGVmZmVjdGl2ZSwgaXQgc2F2ZXMgMn4zIHNlY29uZCBpbiANCj4gPiBQYXJzZS9B dXRvR2VuIHBoYXNlLCBiZWNhdXNlIE92bWZYNjQgaXMgcmVsYXRpdmVseSBzaW1wbGUuIEl0IGRv ZXMgDQo+ID4gbm90IGVuYWJsZSBtdWNoIGZlYXR1cmVzIHN1Y2ggYXMgTXVsdGlwbGUgU0tVIGFu ZCBzdHJ1Y3R1cmUgUENEIGJ5IA0KPiA+IGRlZmF1bHQgYW5kIHRoZXJlIGlzIG5vIGJpZyBzaXpl IEF1dG9nZW4uYy9BdXRvZ2VuLmgvTWFrZWZpbGUgDQo+ID4gZ2VuZXJhdGVkIGVpdGhlci4gYnV0 IGZvciB0aGUgY29tcGxleCBwbGF0Zm9ybSwgdGhpcyBwYXRjaCB3aWxsIGJlIA0KPiA+IG11Y2gg ZWZmZWN0aXZlLiBUaGUgdW5pdGVzIGFib3ZlIHNpbXVsYXRlcyBhIHJlYWwgY2FzZSB0aGF0IHRo ZXJlIGlzIA0KPiA+IGENCj4gPiA0MzM5NSBsaW5lcyBvZiBBdXRvZ2VuLmMgZ2VuZXJhdGVkLg0K PiANCj4gSSBiZWcgdG8gZGlmZmVyLiBTaGF2aW5nIDItMyBzZWNvbmRzIG9mZiB0aGUgYXV0b2dl biBwaGFzZSBpcyBhIHN1YnN0YW50aWFsIGltcHJvdmVtZW50Lg0KPiANCj4gSG93ZXZlciwgb24g bXkgd2ltcHkgMjQtY29yZSBDb3J0ZXgtQTUzIHN5c3RlbSwgdGhlIGVmZmVjdCBpcyBub3Qgbm90 aWNlYWJsZSAoZmx1Y3R1YXRlcyBiZXR3ZWVuIDE6NTYtMTo1OCB3aGV0aGVyIHdpdGggb3Igd2l0 aG91dCB0aGlzIHBhdGNoKS4NCj4gDQo+IEFuZCBldmVuIG9uIG15IHg4NiB3b3Jrc3RhdGlvbiwg SSBzZWUgbm8gbWVhc3VyYWJsZSBkaWZmZXJlbmNlICgxMi0xM3MpLg0KPiBXaGF0IGlzIHRoZSBo YXJkd2FyZSB5b3UgYXJlIGJlbmNobWFya2luZyBvbj8NCj4gDQo+IEl0IGRvZXMgbm90IGFwcGVh ciB0byBiZSBkZXRyaW1lbnRhbCB0byBwZXJmb3JtYW5jZSBvbiBhbnkgb2YgbXkgcGxhdGZvcm1z LCBidXQgSSB3b3VsZCBsaWtlIHRvIHNlZSBzb21lIG1vcmUgbWVhc3VyZW1lbnRzLCBhbmQgSSB3 b3VsZCBsaWtlIHRvIHNlZSB0aGF0IGxvZ2dlZCB3aXRoIHNvbWUgbW9yZSBkZXRhaWwgaW4gYnVn emlsbGEuDQo+IA0KPiBSZWdhcmRzLA0KPiANCj4gTGVpZg0KPiANCj4gPiBTaW5jZSB0aGlzIHBh dGNoIG1vc3RseSBlZmZlY3QgdGhlIFBhcnNlci9BdXRvR2VuIHBoYXNlLCBJIGp1c3QgdXNlIA0K PiA+ICJidWlsZCBnZW5tYWtlIiB0byBzaG93IHRoZSBpbXByb3ZlbWVudCBkYXRhLg0KPiA+IFRo ZSBmaW5hbCByZXN1bHQgZm9yIGNsZWFuIGJ1aWxkIGlzOg0KPiA+IEN1cnJlbnQgY29kZTogIDE3 IHNlY29uZHMNCj4gPiBBZnRlciBwYXRjaDogICAgICAxNSBzZWNvbmRzDQo+ID4gDQo+ID4gRGV0 YWlsczoNCj4gPiBDdXJyZW50IGRhdGE6DQo+ID4gDQo+ID4gZDpcZWRrMiAobWFzdGVyIC0+IG9y aWdpbikNCj4gPiDOuyBidWlsZCBnZW5tYWtlIC1wIE92bWZQa2dcT3ZtZlBrZ0lhMzJYNjQuZHNj IC1hIElBMzIgLWEgWDY0IC10DQo+ID4gVlMyMDE1eDg2IEJ1aWxkIGVudmlyb25tZW50OiBXaW5k b3dzLTEwLTEwLjAuMTAyNDAgQnVpbGQgc3RhcnQgdGltZTogDQo+ID4gMTA6MTI6MzIsIE5vdi4w OSAyMDE4DQo+ID4gDQo+ID4gV09SS1NQQUNFICAgICAgICA9IGQ6XGVkazINCj4gPiBFQ1BfU09V UkNFICAgICAgID0gZDpcZWRrMlxlZGtjb21wYXRpYmlsaXR5cGtnDQo+ID4gRURLX1NPVVJDRSAg ICAgICA9IGQ6XGVkazJcZWRrY29tcGF0aWJpbGl0eXBrZw0KPiA+IEVGSV9TT1VSQ0UgICAgICAg PSBkOlxlZGsyXGVka2NvbXBhdGliaWxpdHlwa2cNCj4gPiBFREtfVE9PTFNfUEFUSCAgID0gZDpc ZWRrMlxiYXNldG9vbHMNCj4gPiBFREtfVE9PTFNfQklOICAgID0gZDpcZWRrMlxiYXNldG9vbHNc YmluXHdpbjMyDQo+ID4gQ09ORl9QQVRIICAgICAgICA9IGQ6XGVkazJcY29uZg0KPiA+IA0KPiA+ IEFyY2hpdGVjdHVyZShzKSAgPSBJQTMyIFg2NA0KPiA+IEJ1aWxkIHRhcmdldCAgICAgPSBERUJV Rw0KPiA+IFRvb2xjaGFpbiAgICAgICAgPSBWUzIwMTV4ODYNCj4gPiANCj4gPiBBY3RpdmUgUGxh dGZvcm0gICAgICAgICAgPSBkOlxlZGsyXE92bWZQa2dcT3ZtZlBrZ0lhMzJYNjQuZHNjDQo+ID4g Rmxhc2ggSW1hZ2UgRGVmaW5pdGlvbiAgID0gZDpcZWRrMlxPdm1mUGtnXE92bWZQa2dJYTMyWDY0 LmZkZg0KPiA+IA0KPiA+IFByb2Nlc3NpbmcgbWV0YS1kYXRhIC4uLi4uLi4gZG9uZSENCj4gPiBH ZW5lcmF0aW5nIGNvZGUgLiBkb25lIQ0KPiA+IEdlbmVyYXRpbmcgbWFrZWZpbGUgLiBkb25lIQ0K PiA+IEdlbmVyYXRpbmcgY29kZSAuLiBkb25lIQ0KPiA+IEdlbmVyYXRpbmcgbWFrZWZpbGUgLi4u Li4uIGRvbmUhDQo+ID4gDQo+ID4gLSBEb25lIC0NCj4gPiBCdWlsZCBlbmQgdGltZTogMTA6MTI6 NDksIE5vdi4wOSAyMDE4IEJ1aWxkIHRvdGFsIHRpbWU6IDAwOjAwOjE3DQo+ID4gDQo+ID4gQWZ0 ZXIgYXBwbHlpbmcgdGhpcyBwYXRjaDoNCj4gPiANCj4gPiBkOlxlZGsyIChtYXN0ZXIgLT4gb3Jp Z2luKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiA+IM67IGJ1aWxkIGdl bm1ha2UgLXAgT3ZtZlBrZ1xPdm1mUGtnSWEzMlg2NC5kc2MgLWEgSUEzMiAtYSBYNjQgLQ0KPiA+ IEJ1aWxkIGVudmlyb25tZW50OiBXaW5kb3dzLTEwLTEwLjAuMTAyNDAgICAgICAgICAgICAgICAg ICAgICAgDQo+ID4gQnVpbGQgc3RhcnQgdGltZTogMTA6MTE6NDEsIE5vdi4wOSAyMDE4ICAgICAg ICAgICAgICAgICAgICAgICANCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiA+IFdPUktTUEFDRSAgICAgICAgPSBkOlxl ZGsyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo+ID4gRUNQX1NPVVJDRSAg ICAgICA9IGQ6XGVkazJcZWRrY29tcGF0aWJpbGl0eXBrZyAgICAgICAgICAgICAgICANCj4gPiBF REtfU09VUkNFICAgICAgID0gZDpcZWRrMlxlZGtjb21wYXRpYmlsaXR5cGtnICAgICAgICAgICAg ICAgIA0KPiA+IEVGSV9TT1VSQ0UgICAgICAgPSBkOlxlZGsyXGVka2NvbXBhdGliaWxpdHlwa2cg ICAgICAgICAgICAgICAgDQo+ID4gRURLX1RPT0xTX1BBVEggICA9IGQ6XGVkazJcYmFzZXRvb2xz ICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gPiBFREtfVE9PTFNfQklOICAgID0gZDpcZWRr MlxiYXNldG9vbHNcYmluXHdpbjMyICAgICAgICAgICAgICAgIA0KPiA+IENPTkZfUEFUSCAgICAg ICAgPSBkOlxlZGsyXGNvbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICANCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIA0KPiA+IEFyY2hpdGVjdHVyZShzKSAgPSBJQTMyIFg2NCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgDQo+ID4gQnVpbGQgdGFyZ2V0ICAgICA9IERFQlVHICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gPiBUb29sY2hhaW4gICAgICAg ID0gVlMyMDE1eDg2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiA+ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg DQo+ID4gQWN0aXZlIFBsYXRmb3JtICAgICAgICAgID0gZDpcZWRrMlxPdm1mUGtnXE92bWZQa2dJ YTMyWDY0LmRzYyANCj4gPiBGbGFzaCBJbWFnZSBEZWZpbml0aW9uICAgPSBkOlxlZGsyXE92bWZQ a2dcT3ZtZlBrZ0lhMzJYNjQuZmRmIA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo+ID4gUHJvY2Vzc2luZyBtZXRhLWRh dGEgLi4uLi4gZG9uZSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gPiBHZW5lcmF0 aW5nIGNvZGUgLiBkb25lISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0K PiA+IEdlbmVyYXRpbmcgbWFrZWZpbGUgLiBkb25lISAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgDQo+ID4gR2VuZXJhdGluZyBjb2RlIC4uIGRvbmUhICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICANCj4gPiBHZW5lcmF0aW5nIG1ha2VmaWxlIC4uLi4uLiBkb25l ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiA+ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo+ID4gLSBEb25lIC0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4g PiBCdWlsZCBlbmQgdGltZTogMTA6MTE6NTYsIE5vdi4wOSAyMDE4ICAgICAgICAgICAgICAgICAg ICAgICAgIA0KPiA+IEJ1aWxkIHRvdGFsIHRpbWU6IDAwOjAwOjE1ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgDQo+ID4gDQo+ID4gDQo+ID4gVGhhbmtzLA0KPiA+IEJvYg0KPiA+ IA0KPiA+IA0KPiA+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4gRnJvbTogTGVpZiBM aW5kaG9sbSBbbWFpbHRvOmxlaWYubGluZGhvbG1AbGluYXJvLm9yZ10NCj4gPiBTZW50OiBGcmlk YXksIE5vdmVtYmVyIDksIDIwMTggMTI6NTMgQU0NCj4gPiBUbzogRmVuZywgQm9iIEMgPGJvYi5j LmZlbmdAaW50ZWwuY29tPg0KPiA+IENjOiBlZGsyLWRldmVsQGxpc3RzLjAxLm9yZzsgQ2Fyc2V5 LCBKYWJlbiA8amFiZW4uY2Fyc2V5QGludGVsLmNvbT47IA0KPiA+IEdhbywgTGltaW5nIDxsaW1p bmcuZ2FvQGludGVsLmNvbT4NCj4gPiBTdWJqZWN0OiBSZTogW2VkazJdIFtQYXRjaF0gQmFzZVRv b2xzOiBPcHRpbWl6ZSBzdHJpbmcgY29uY2F0ZW5hdGlvbg0KPiA+IA0KPiA+IE9uIFRodSwgTm92 IDA4LCAyMDE4IGF0IDA2OjE2OjI1UE0gKzA4MDAsIEJvYkNGIHdyb3RlOg0KPiA+ID4gaHR0cHM6 Ly9idWd6aWxsYS50aWFub2NvcmUub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjg4DQo+ID4gPiANCj4g PiA+IFRoaXMgcGF0Y2ggaXMgb25lIG9mIGJ1aWxkIHRvb2wgcGVyZm9ybWFuY2UgaW1wcm92ZW1l bnQgc2VyaWVzIA0KPiA+ID4gcGF0Y2hlcy4NCj4gPiA+IA0KPiA+ID4gVGhpcyBwYXRjaCBpcyBn b2luZyB0byB1c2Ugam9pbiBmdW5jdGlvbiBpbnN0ZWFkIG9mIHN0cmluZyArPQ0KPiA+ID4gc3Ry aW5nMiBzdGF0ZW1lbnQuDQo+ID4gPiANCj4gPiA+IEN1cnJlbnQgY29kZSB1c2Ugc3RyaW5nICs9 IHN0cmluZzIgaW4gYSBsb29wIHRvIGNvbWJpbmUgYSBzdHJpbmcuIA0KPiA+ID4gd2hpbGUgY3Jl YXRpbmcgYSBzdHJpbmcgbGlzdCBpbiBhIGxvb3AgYW5kIHVzaW5nDQo+ID4gPiAiIi5qb2luKHN0 cmluZ2xpc3QpIGFmdGVyIHRoZSBsb29wIHdpbGwgYmUgbXVjaCBmYXN0ZXIuDQo+ID4gDQo+ID4g RG8geW91IGhhdmUgYW55IG51bWJlcnMgb24gdGhlIGxldmVsIG9mIGltcHJvdmVtZW50IHNlZW4/ DQo+ID4gDQo+ID4gRWl0aGVyIGZvciB0aGUgaW5kaXZpZHVhbCBzY3JpcHRzIHdoZW4gY2FsbGVk IGlkZW50aWNhbGx5LCBvciAoaWYNCj4gPiBtZWFzdXJhYmxlKSBvbiB0aGUgYnVpbGQgb2YgYW4g ZW50aXJlIHBsYXRmb3JtIChzYXkgT3ZtZlg2ND8pLg0KPiA+IA0KPiA+IFJlZ2FyZHMsDQo+ID4g DQo+ID4gTGVpZg0KPiA+IA0KPiA+ID4gQ29udHJpYnV0ZWQtdW5kZXI6IFRpYW5vQ29yZSBDb250 cmlidXRpb24gQWdyZWVtZW50IDEuMQ0KPiA+ID4gU2lnbmVkLW9mZi1ieTogQm9iQ0YgPGJvYi5j LmZlbmdAaW50ZWwuY29tPg0KPiA+ID4gQ2M6IExpbWluZyBHYW8gPGxpbWluZy5nYW9AaW50ZWwu Y29tPg0KPiA+ID4gQ2M6IEphYmVuIENhcnNleSA8amFiZW4uY2Fyc2V5QGludGVsLmNvbT4NCj4g PiA+IC0tLQ0KPiA+ID4gIEJhc2VUb29scy9Tb3VyY2UvUHl0aG9uL0F1dG9HZW4vU3RyR2F0aGVy LnB5ICB8IDM5ICsrKysrKysrKysrKystLS0tLS0NCj4gPiA+ICBCYXNlVG9vbHMvU291cmNlL1B5 dGhvbi9Db21tb24vTWlzYy5weSAgICAgICAgfCAyMSArKysrKy0tLS0tDQo+ID4gPiAgLi4uL1Nv dXJjZS9QeXRob24vV29ya3NwYWNlL0luZkJ1aWxkRGF0YS5weSAgIHwgIDQgKy0NCj4gPiA+ICAu Li4vUHl0aG9uL1dvcmtzcGFjZS9Xb3Jrc3BhY2VDb21tb24ucHkgICAgICAgfCAxMSArKy0tLS0N Cj4gPiA+ICA0IGZpbGVzIGNoYW5nZWQsIDQ0IGluc2VydGlvbnMoKyksIDMxIGRlbGV0aW9ucygt KQ0KPiA+ID4gDQo+ID4gPiBkaWZmIC0tZ2l0IGEvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQXV0 b0dlbi9TdHJHYXRoZXIucHkNCj4gPiA+IGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQXV0b0dl bi9TdHJHYXRoZXIucHkNCj4gPiA+IGluZGV4IDM2MWQ0OTkwNzYuLmQzNGE5ZTk0NDcgMTAwNjQ0 DQo+ID4gPiAtLS0gYS9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9BdXRvR2VuL1N0ckdhdGhlci5w eQ0KPiA+ID4gKysrIGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQXV0b0dlbi9TdHJHYXRoZXIu cHkNCj4gPiA+IEBAIC0xMzUsMTEgKzEzNSwxMSBAQCBkZWYgQXNjVG9IZXhMaXN0KEFzY2lpKToN Cj4gPiA+ICAjIEBwYXJhbSBVbmlHZW5DRmxhZyAgICAgIFVuaVN0cmluZyBpcyBnZW5lcmF0ZWQg aW50byBBdXRvR2VuIEMgZmlsZSB3aGVuIGl0IGlzIHNldCB0byBUcnVlDQo+ID4gPiAgIw0KPiA+ ID4gICMgQHJldHZhbCBTdHI6ICAgICAgICAgICBBIHN0cmluZyBvZiAuaCBmaWxlIGNvbnRlbnQN Cj4gPiA+ICAjDQo+ID4gPiAgZGVmIENyZWF0ZUhGaWxlQ29udGVudChCYXNlTmFtZSwgVW5pT2Jq ZWN0Q2xhc3MsIElzQ29tcGF0aWJsZU1vZGUsIFVuaUdlbkNGbGFnKToNCj4gPiA+IC0gICAgU3Ry ID0gJycNCj4gPiA+ICsgICAgU3RyID0gW10NCj4gPiA+ICAgICAgVmFsdWVTdGFydFB0ciA9IDYw DQo+ID4gPiAgICAgIExpbmUgPSBDT01NRU5UX0RFRklORV9TVFIgKyAnICcgKyBMQU5HVUFHRV9O QU1FX1NUUklOR19OQU1FICsgJyAnICogKFZhbHVlU3RhcnRQdHIgLSBsZW4oREVGSU5FX1NUUiAr IExBTkdVQUdFX05BTUVfU1RSSU5HX05BTUUpKSArIERlY1RvSGV4U3RyKDAsIDQpICsgQ09NTUVO VF9OT1RfUkVGRVJFTkNFRA0KPiA+ID4gICAgICBTdHIgPSBXcml0ZUxpbmUoU3RyLCBMaW5lKQ0K PiA+ID4gICAgICBMaW5lID0gQ09NTUVOVF9ERUZJTkVfU1RSICsgJyAnICsgUFJJTlRBQkxFX0xB TkdVQUdFX05BTUVfU1RSSU5HX05BTUUgKyAnICcgKiAoVmFsdWVTdGFydFB0ciAtIGxlbihERUZJ TkVfU1RSICsgUFJJTlRBQkxFX0xBTkdVQUdFX05BTUVfU1RSSU5HX05BTUUpKSArIERlY1RvSGV4 U3RyKDEsIDQpICsgQ09NTUVOVF9OT1RfUkVGRVJFTkNFRA0KPiA+ID4gICAgICBTdHIgPSBXcml0 ZUxpbmUoU3RyLCBMaW5lKQ0KPiA+ID4gQEAgLTE2NCwxNiArMTY0LDE2IEBAIGRlZiBDcmVhdGVI RmlsZUNvbnRlbnQoQmFzZU5hbWUsIFVuaU9iamVjdENsYXNzLCBJc0NvbXBhdGlibGVNb2RlLCBV bmlHZW5DRmxhZyk6DQo+ID4gPiAgICAgICAgICAgICAgICAgICAgICBMaW5lID0gQ09NTUVOVF9E RUZJTkVfU1RSICsgJyAnICsgTmFtZSArICcgJyArIERlY1RvSGV4U3RyKFRva2VuLCA0KSArIENP TU1FTlRfTk9UX1JFRkVSRU5DRUQNCj4gPiA+ICAgICAgICAgICAgICAgICAgZWxzZToNCj4gPiA+ ICAgICAgICAgICAgICAgICAgICAgIExpbmUgPSBDT01NRU5UX0RFRklORV9TVFIgKyAnICcgKyBO YW1lICsgJyAnICogKFZhbHVlU3RhcnRQdHIgLSBsZW4oREVGSU5FX1NUUiArIE5hbWUpKSArIERl Y1RvSGV4U3RyKFRva2VuLCA0KSArIENPTU1FTlRfTk9UX1JFRkVSRU5DRUQNCj4gPiA+ICAgICAg ICAgICAgICAgICAgVW51c2VkU3RyID0gV3JpdGVMaW5lKFVudXNlZFN0ciwgTGluZSkNCj4gPiA+ ICANCj4gPiA+IC0gICAgU3RyID0gJycuam9pbihbU3RyLCBVbnVzZWRTdHJdKQ0KPiA+ID4gKyAg ICBTdHIuZXh0ZW5kKCBVbnVzZWRTdHIpDQo+ID4gPiAgDQo+ID4gPiAgICAgIFN0ciA9IFdyaXRl TGluZShTdHIsICcnKQ0KPiA+ID4gICAgICBpZiBJc0NvbXBhdGlibGVNb2RlIG9yIFVuaUdlbkNG bGFnOg0KPiA+ID4gICAgICAgICAgU3RyID0gV3JpdGVMaW5lKFN0ciwgJ2V4dGVybiB1bnNpZ25l ZCBjaGFyICcgKyBCYXNlTmFtZSArICdTdHJpbmdzW107JykNCj4gPiA+IC0gICAgcmV0dXJuIFN0 cg0KPiA+ID4gKyAgICByZXR1cm4gIiIuam9pbihTdHIpDQo+ID4gPiAgDQo+ID4gPiAgIyMgQ3Jl YXRlIGEgY29tcGxldGUgLmggZmlsZQ0KPiA+ID4gICMNCj4gPiA+ICAjIENyZWF0ZSBhIGNvbXBs ZXQgLmggZmlsZSB3aXRoIGZpbGUgaGVhZGVyIGFuZCBmaWxlIGNvbnRlbnQgICMgDQo+ID4gPiBA QA0KPiA+ID4gLTE4NSwxMSArMTg1LDExIEBAIGRlZiBDcmVhdGVIRmlsZUNvbnRlbnQoQmFzZU5h bWUsIFVuaU9iamVjdENsYXNzLCBJc0NvbXBhdGlibGVNb2RlLCBVbmlHZW5DRmxhZyk6DQo+ID4g PiAgIyBAcmV0dmFsIFN0cjogICAgICAgICAgIEEgc3RyaW5nIG9mIGNvbXBsZXRlIC5oIGZpbGUN Cj4gPiA+ICAjDQo+ID4gPiAgZGVmIENyZWF0ZUhGaWxlKEJhc2VOYW1lLCBVbmlPYmplY3RDbGFz cywgSXNDb21wYXRpYmxlTW9kZSwgVW5pR2VuQ0ZsYWcpOg0KPiA+ID4gICAgICBIRmlsZSA9IFdy aXRlTGluZSgnJywgQ3JlYXRlSEZpbGVDb250ZW50KEJhc2VOYW1lLCANCj4gPiA+IFVuaU9iamVj dENsYXNzLCBJc0NvbXBhdGlibGVNb2RlLCBVbmlHZW5DRmxhZykpDQo+ID4gPiAgDQo+ID4gPiAt ICAgIHJldHVybiBIRmlsZQ0KPiA+ID4gKyAgICByZXR1cm4gIiIuam9pbihIRmlsZSkNCj4gPiA+ ICANCj4gPiA+ICAjIyBDcmVhdGUgYSBidWZmZXIgdG8gc3RvcmUgYWxsIGl0ZW1zIGluIGFuIGFy cmF5ICAjDQo+ID4gPiAgIyBAcGFyYW0gQmluQnVmZmVyICAgQnVmZmVyIHRvIGNvbnRhaW4gQmlu YXJ5IGRhdGEuDQo+ID4gPiAgIyBAcGFyYW0gQXJyYXk6ICAgICAgVGhlIGFycmF5IG5lZWQgdG8g YmUgZm9ybWF0dGVkDQo+ID4gPiBAQCAtMjA5LDExICsyMDksMTEgQEAgZGVmIENyZWF0ZUJpbkJ1 ZmZlcihCaW5CdWZmZXIsIEFycmF5KToNCj4gPiA+ICAjDQo+ID4gPiAgZGVmIENyZWF0ZUFycmF5 SXRlbShBcnJheSwgV2lkdGggPSAxNik6DQo+ID4gPiAgICAgIE1heExlbmd0aCA9IFdpZHRoDQo+ ID4gPiAgICAgIEluZGV4ID0gMA0KPiA+ID4gICAgICBMaW5lID0gJyAgJw0KPiA+ID4gLSAgICBB cnJheUl0ZW0gPSAnJw0KPiA+ID4gKyAgICBBcnJheUl0ZW0gPSBbXQ0KPiA+ID4gIA0KPiA+ID4g ICAgICBmb3IgSXRlbSBpbiBBcnJheToNCj4gPiA+ICAgICAgICAgIGlmIEluZGV4IDwgTWF4TGVu Z3RoOg0KPiA+ID4gICAgICAgICAgICAgIExpbmUgPSBMaW5lICsgSXRlbSArICcsICAnDQo+ID4g PiAgICAgICAgICAgICAgSW5kZXggPSBJbmRleCArIDENCj4gPiA+IEBAIC0yMjEsMTEgKzIyMSwx MSBAQCBkZWYgQ3JlYXRlQXJyYXlJdGVtKEFycmF5LCBXaWR0aCA9IDE2KToNCj4gPiA+ICAgICAg ICAgICAgICBBcnJheUl0ZW0gPSBXcml0ZUxpbmUoQXJyYXlJdGVtLCBMaW5lKQ0KPiA+ID4gICAg ICAgICAgICAgIExpbmUgPSAnICAnICsgSXRlbSArICcsICAnDQo+ID4gPiAgICAgICAgICAgICAg SW5kZXggPSAxDQo+ID4gPiAgICAgIEFycmF5SXRlbSA9IFdyaXRlKEFycmF5SXRlbSwgTGluZS5y c3RyaXAoKSkNCj4gPiA+ICANCj4gPiA+IC0gICAgcmV0dXJuIEFycmF5SXRlbQ0KPiA+ID4gKyAg ICByZXR1cm4gIiIuam9pbihBcnJheUl0ZW0pDQo+ID4gPiAgDQo+ID4gPiAgIyMgQ3JlYXRlQ0Zp bGVTdHJpbmdWYWx1ZQ0KPiA+ID4gICMNCj4gPiA+ICAjIENyZWF0ZSBhIGxpbmUgd2l0aCBzdHJp bmcgdmFsdWUgICMgQEAgLTIzNiwxMSArMjM2LDExIEBAIGRlZiANCj4gPiA+IENyZWF0ZUFycmF5 SXRlbShBcnJheSwgV2lkdGggPSAxNik6DQo+ID4gPiAgDQo+ID4gPiAgZGVmIENyZWF0ZUNGaWxl U3RyaW5nVmFsdWUoVmFsdWUpOg0KPiA+ID4gICAgICBWYWx1ZSA9IFtTdHJpbmdCbG9ja1R5cGVd ICsgVmFsdWUNCj4gPiA+ICAgICAgU3RyID0gV3JpdGVMaW5lKCcnLCBDcmVhdGVBcnJheUl0ZW0o VmFsdWUpKQ0KPiA+ID4gIA0KPiA+ID4gLSAgICByZXR1cm4gU3RyDQo+ID4gPiArICAgIHJldHVy biAiIi5qb2luKFN0cikNCj4gPiA+ICANCj4gPiA+ICAjIyBHZXRGaWx0ZXJlZExhbmd1YWdlDQo+ ID4gPiAgIw0KPiA+ID4gICMgYXBwbHkgZ2V0IGJlc3QgbGFuZ3VhZ2UgcnVsZXMgdG8gdGhlIFVO SSBsYW5ndWFnZSBjb2RlIGxpc3QgICMgDQo+ID4gPiBAQA0KPiA+ID4gLTQzOCwxMSArNDM4LDEx IEBAIGRlZiBDcmVhdGVDRmlsZUNvbnRlbnQoQmFzZU5hbWUsIFVuaU9iamVjdENsYXNzLCBJc0Nv bXBhdGlibGVNb2RlLCBVbmlCaW5CdWZmZXIsDQo+ID4gPiAgICAgICMNCj4gPiA+ICAgICAgIyBK b2luIHBhY2thZ2UgZGF0YQ0KPiA+ID4gICAgICAjDQo+ID4gPiAgICAgIEFsbFN0ciA9IFdyaXRl KEFsbFN0ciwgU3RyKQ0KPiA+ID4gIA0KPiA+ID4gLSAgICByZXR1cm4gQWxsU3RyDQo+ID4gPiAr ICAgIHJldHVybiAiIi5qb2luKEFsbFN0cikNCj4gPiA+ICANCj4gPiA+ICAjIyBDcmVhdGUgZW5k IG9mIC5jIGZpbGUNCj4gPiA+ICAjDQo+ID4gPiAgIyBDcmVhdGUgZW5kIG9mIC5jIGZpbGUNCj4g PiA+ICAjDQo+ID4gPiBAQCAtNDY1LDExICs0NjUsMTEgQEAgZGVmIENyZWF0ZUNGaWxlRW5kKCk6 DQo+ID4gPiAgIw0KPiA+ID4gIGRlZiBDcmVhdGVDRmlsZShCYXNlTmFtZSwgVW5pT2JqZWN0Q2xh c3MsIElzQ29tcGF0aWJsZU1vZGUsIEZpbHRlckluZm8pOg0KPiA+ID4gICAgICBDRmlsZSA9ICcn DQo+ID4gPiAgICAgIENGaWxlID0gV3JpdGVMaW5lKENGaWxlLCBDcmVhdGVDRmlsZUNvbnRlbnQo QmFzZU5hbWUsIFVuaU9iamVjdENsYXNzLCBJc0NvbXBhdGlibGVNb2RlLCBOb25lLCBGaWx0ZXJJ bmZvKSkNCj4gPiA+ICAgICAgQ0ZpbGUgPSBXcml0ZUxpbmUoQ0ZpbGUsIENyZWF0ZUNGaWxlRW5k KCkpDQo+ID4gPiAtICAgIHJldHVybiBDRmlsZQ0KPiA+ID4gKyAgICByZXR1cm4gIiIuam9pbihD RmlsZSkNCj4gPiA+ICANCj4gPiA+ICAjIyBHZXRGaWxlTGlzdA0KPiA+ID4gICMNCj4gPiA+ICAj IEdldCBhIGxpc3QgZm9yIGFsbCBmaWxlcw0KPiA+ID4gICMNCj4gPiA+IEBAIC01NzIsMTcgKzU3 MiwzNCBAQCBkZWYgR2V0U3RyaW5nRmlsZXMoVW5pRmlsTGlzdCwgDQo+ID4gPiBTb3VyY2VGaWxl TGlzdCwgSW5jbHVkZUxpc3QsIEluY2x1ZGVQYXRoTGlzdCwgU2tpDQo+ID4gPiAgDQo+ID4gPiAg Iw0KPiA+ID4gICMgV3JpdGUgYW4gaXRlbQ0KPiA+ID4gICMNCj4gPiA+ICBkZWYgV3JpdGUoVGFy Z2V0LCBJdGVtKToNCj4gPiA+IC0gICAgcmV0dXJuICcnLmpvaW4oW1RhcmdldCwgSXRlbV0pDQo+ ID4gPiArICAgIGlmIGlzaW5zdGFuY2UoVGFyZ2V0LHN0cik6DQo+ID4gPiArICAgICAgICBUYXJn ZXQgPSBbVGFyZ2V0XQ0KPiA+ID4gKyAgICBpZiBub3QgVGFyZ2V0Og0KPiA+ID4gKyAgICAgICAg VGFyZ2V0ID0gW10NCj4gPiA+ICsgICAgaWYgaXNpbnN0YW5jZShJdGVtLGxpc3QpOg0KPiA+ID4g KyAgICAgICAgVGFyZ2V0LmV4dGVuZChJdGVtKQ0KPiA+ID4gKyAgICBlbHNlOg0KPiA+ID4gKyAg ICAgICAgVGFyZ2V0LmFwcGVuZChJdGVtKQ0KPiA+ID4gKyAgICByZXR1cm4gVGFyZ2V0DQo+ID4g PiAgDQo+ID4gPiAgIw0KPiA+ID4gICMgV3JpdGUgYW4gaXRlbSB3aXRoIGEgYnJlYWsgbGluZSAg IyAgZGVmIFdyaXRlTGluZShUYXJnZXQsIA0KPiA+ID4gSXRlbSk6DQo+ID4gPiAtICAgIHJldHVy biAnJy5qb2luKFtUYXJnZXQsIEl0ZW0sICdcbiddKQ0KPiA+ID4gKyAgICBpZiBpc2luc3RhbmNl KFRhcmdldCxzdHIpOg0KPiA+ID4gKyAgICAgICAgVGFyZ2V0ID0gW1RhcmdldF0NCj4gPiA+ICsg ICAgaWYgbm90IFRhcmdldDoNCj4gPiA+ICsgICAgICAgIFRhcmdldCA9IFtdDQo+ID4gPiArICAg IGlmIGlzaW5zdGFuY2UoSXRlbSwgbGlzdCk6DQo+ID4gPiArICAgICAgICBUYXJnZXQuZXh0ZW5k KEl0ZW0pDQo+ID4gPiArICAgIGVsc2U6DQo+ID4gPiArICAgICAgICBUYXJnZXQuYXBwZW5kKEl0 ZW0pDQo+ID4gPiArICAgIFRhcmdldC5hcHBlbmQoJ1xuJykNCj4gPiA+ICsgICAgcmV0dXJuIFRh cmdldA0KPiA+ID4gIA0KPiA+ID4gICMgVGhpcyBhY3RzIGxpa2UgdGhlIG1haW4oKSBmdW5jdGlv biBmb3IgdGhlIHNjcmlwdCwgdW5sZXNzIGl0IGlzIA0KPiA+ID4gJ2ltcG9ydCdlZCBpbnRvIGFu b3RoZXIgICMgc2NyaXB0Lg0KPiA+ID4gIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6DQo+ID4g PiAgICAgIEVka0xvZ2dlci5pbmZvKCdzdGFydCcpDQo+ID4gPiBkaWZmIC0tZ2l0IGEvQmFzZVRv b2xzL1NvdXJjZS9QeXRob24vQ29tbW9uL01pc2MucHkNCj4gPiA+IGIvQmFzZVRvb2xzL1NvdXJj ZS9QeXRob24vQ29tbW9uL01pc2MucHkNCj4gPiA+IGluZGV4IDgwMjM2ZGIxNjAuLjhkY2JlMTQx YWUgMTAwNjQ0DQo+ID4gPiAtLS0gYS9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Db21tb24vTWlz Yy5weQ0KPiA+ID4gKysrIGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQ29tbW9uL01pc2MucHkN Cj4gPiA+IEBAIC03NzcsMjEgKzc3NywyMSBAQCBjbGFzcyBUZW1wbGF0ZVN0cmluZyhvYmplY3Qp Og0KPiA+ID4gIA0KPiA+ID4gICAgICAgICAgICAgIHJldHVybiAiIi5qb2luKFN0cmluZ0xpc3Qp DQo+ID4gPiAgDQo+ID4gPiAgICAgICMjIENvbnN0cnVjdG9yDQo+ID4gPiAgICAgIGRlZiBfX2lu aXRfXyhzZWxmLCBUZW1wbGF0ZT1Ob25lKToNCj4gPiA+IC0gICAgICAgIHNlbGYuU3RyaW5nID0g JycNCj4gPiA+ICsgICAgICAgIHNlbGYuU3RyaW5nID0gW10NCj4gPiA+ICAgICAgICAgIHNlbGYu SXNCaW5hcnkgPSBGYWxzZQ0KPiA+ID4gICAgICAgICAgc2VsZi5fVGVtcGxhdGUgPSBUZW1wbGF0 ZQ0KPiA+ID4gICAgICAgICAgc2VsZi5fVGVtcGxhdGVTZWN0aW9uTGlzdCA9IHNlbGYuX1BhcnNl KFRlbXBsYXRlKQ0KPiA+ID4gIA0KPiA+ID4gICAgICAjIyBzdHIoKSBvcGVyYXRvcg0KPiA+ID4g ICAgICAjDQo+ID4gPiAgICAgICMgICBAcmV0dmFsICAgICBzdHJpbmcgIFRoZSBzdHJpbmcgcmVw bGFjZWQNCj4gPiA+ICAgICAgIw0KPiA+ID4gICAgICBkZWYgX19zdHJfXyhzZWxmKToNCj4gPiA+ IC0gICAgICAgIHJldHVybiBzZWxmLlN0cmluZw0KPiA+ID4gKyAgICAgICAgcmV0dXJuICIiLmpv aW4oc2VsZi5TdHJpbmcpDQo+ID4gPiAgDQo+ID4gPiAgICAgICMjIFNwbGl0IHRoZSB0ZW1wbGF0 ZSBzdHJpbmcgaW50byBmcmFnbWVudHMgcGVyIHRoZSAke0JFR0lOfSBhbmQgJHtFTkR9IGZsYWdz DQo+ID4gPiAgICAgICMNCj4gPiA+ICAgICAgIyAgIEByZXR2YWwgICAgIGxpc3QgICAgQSBsaXN0 IG9mIFRlbXBsYXRlU3RyaW5nLlNlY3Rpb24gb2JqZWN0cw0KPiA+ID4gICAgICAjDQo+ID4gPiBA QCAtODM1LDEzICs4MzUsMTYgQEAgY2xhc3MgVGVtcGxhdGVTdHJpbmcob2JqZWN0KToNCj4gPiA+ ICAgICAgIyAgIEBwYXJhbSAgICAgIERpY3Rpb25hcnkgICAgICBUaGUgcGxhY2Vob2xkZXIgZGlj dGlvbmFyaWVzDQo+ID4gPiAgICAgICMNCj4gPiA+ICAgICAgZGVmIEFwcGVuZChzZWxmLCBBcHBl bmRTdHJpbmcsIERpY3Rpb25hcnk9Tm9uZSk6DQo+ID4gPiAgICAgICAgICBpZiBEaWN0aW9uYXJ5 Og0KPiA+ID4gICAgICAgICAgICAgIFNlY3Rpb25MaXN0ID0gc2VsZi5fUGFyc2UoQXBwZW5kU3Ry aW5nKQ0KPiA+ID4gLSAgICAgICAgICAgIHNlbGYuU3RyaW5nICs9ICIiLmpvaW4oUy5JbnN0YW50 aWF0ZShEaWN0aW9uYXJ5KSBmb3IgUyBpbiBTZWN0aW9uTGlzdCkNCj4gPiA+ICsgICAgICAgICAg ICBzZWxmLlN0cmluZy5hcHBlbmQoICIiLmpvaW4oUy5JbnN0YW50aWF0ZShEaWN0aW9uYXJ5KSAN Cj4gPiA+ICsgZm9yIFMgaW4gU2VjdGlvbkxpc3QpKQ0KPiA+ID4gICAgICAgICAgZWxzZToNCj4g PiA+IC0gICAgICAgICAgICBzZWxmLlN0cmluZyArPSBBcHBlbmRTdHJpbmcNCj4gPiA+ICsgICAg ICAgICAgICBpZiBpc2luc3RhbmNlKEFwcGVuZFN0cmluZyxsaXN0KToNCj4gPiA+ICsgICAgICAg ICAgICAgICAgc2VsZi5TdHJpbmcuZXh0ZW5kKEFwcGVuZFN0cmluZykNCj4gPiA+ICsgICAgICAg ICAgICBlbHNlOg0KPiA+ID4gKyAgICAgICAgICAgICAgICBzZWxmLlN0cmluZy5hcHBlbmQoQXBw ZW5kU3RyaW5nKQ0KPiA+ID4gIA0KPiA+ID4gICAgICAjIyBSZXBsYWNlIHRoZSBzdHJpbmcgdGVt cGxhdGUgd2l0aCBkaWN0aW9uYXJ5IG9mIHBsYWNlaG9sZGVycw0KPiA+ID4gICAgICAjDQo+ID4g PiAgICAgICMgICBAcGFyYW0gICAgICBEaWN0aW9uYXJ5ICAgICAgVGhlIHBsYWNlaG9sZGVyIGRp Y3Rpb25hcmllcw0KPiA+ID4gICAgICAjDQo+ID4gPiBAQCAtMTc0MSwyNyArMTc0NCwyMSBAQCBj bGFzcyBQYXRoQ2xhc3Mob2JqZWN0KToNCj4gPiA+ICAgICAgIw0KPiA+ID4gICAgICAjIEByZXR2 YWwgRmFsc2UgVGhlIHR3byBQYXRoQ2xhc3MgYXJlIGRpZmZlcmVudA0KPiA+ID4gICAgICAjIEBy ZXR2YWwgVHJ1ZSAgVGhlIHR3byBQYXRoQ2xhc3MgYXJlIHRoZSBzYW1lDQo+ID4gPiAgICAgICMN Cj4gPiA+ICAgICAgZGVmIF9fZXFfXyhzZWxmLCBPdGhlcik6DQo+ID4gPiAtICAgICAgICBpZiBp c2luc3RhbmNlKE90aGVyLCB0eXBlKHNlbGYpKToNCj4gPiA+IC0gICAgICAgICAgICByZXR1cm4g c2VsZi5QYXRoID09IE90aGVyLlBhdGgNCj4gPiA+IC0gICAgICAgIGVsc2U6DQo+ID4gPiAtICAg ICAgICAgICAgcmV0dXJuIHNlbGYuUGF0aCA9PSBzdHIoT3RoZXIpDQo+ID4gPiArICAgICAgICBy ZXR1cm4gc2VsZi5QYXRoID09IHN0cihPdGhlcikNCj4gPiA+ICANCj4gPiA+ICAgICAgIyMgT3Zl cnJpZGUgX19jbXBfXyBmdW5jdGlvbg0KPiA+ID4gICAgICAjDQo+ID4gPiAgICAgICMgQ3VzdG9t aXplIHRoZSBjb21wYXJzaW9uIG9wZXJhdGlvbiBvZiB0d28gUGF0aENsYXNzDQo+ID4gPiAgICAg ICMNCj4gPiA+ICAgICAgIyBAcmV0dmFsIDAgICAgIFRoZSB0d28gUGF0aENsYXNzIGFyZSBkaWZm ZXJlbnQNCj4gPiA+ICAgICAgIyBAcmV0dmFsIC0xICAgIFRoZSBmaXJzdCBQYXRoQ2xhc3MgaXMg bGVzcyB0aGFuIHRoZSBzZWNvbmQgUGF0aENsYXNzDQo+ID4gPiAgICAgICMgQHJldHZhbCAxICAg ICBUaGUgZmlyc3QgUGF0aENsYXNzIGlzIEJpZ2dlciB0aGFuIHRoZSBzZWNvbmQgUGF0aENsYXNz DQo+ID4gPiAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIE90aGVyKToNCj4gPiA+IC0gICAgICAgIGlm IGlzaW5zdGFuY2UoT3RoZXIsIHR5cGUoc2VsZikpOg0KPiA+ID4gLSAgICAgICAgICAgIE90aGVy S2V5ID0gT3RoZXIuUGF0aA0KPiA+ID4gLSAgICAgICAgZWxzZToNCj4gPiA+IC0gICAgICAgICAg ICBPdGhlcktleSA9IHN0cihPdGhlcikNCj4gPiA+ICsgICAgICAgIE90aGVyS2V5ID0gc3RyKE90 aGVyKQ0KPiA+ID4gIA0KPiA+ID4gICAgICAgICAgU2VsZktleSA9IHNlbGYuUGF0aA0KPiA+ID4g ICAgICAgICAgaWYgU2VsZktleSA9PSBPdGhlcktleToNCj4gPiA+ICAgICAgICAgICAgICByZXR1 cm4gMA0KPiA+ID4gICAgICAgICAgZWxpZiBTZWxmS2V5ID4gT3RoZXJLZXk6DQo+ID4gPiBkaWZm IC0tZ2l0IGEvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vV29ya3NwYWNlL0luZkJ1aWxkRGF0YS5w eQ0KPiA+ID4gYi9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Xb3Jrc3BhY2UvSW5mQnVpbGREYXRh LnB5DQo+ID4gPiBpbmRleCA0NGQ0NGQyNGViLi5kNjE1Y2NjZGY3IDEwMDY0NA0KPiA+ID4gLS0t IGEvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vV29ya3NwYWNlL0luZkJ1aWxkRGF0YS5weQ0KPiA+ ID4gKysrIGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vV29ya3NwYWNlL0luZkJ1aWxkRGF0YS5w eQ0KPiA+ID4gQEAgLTYxMiwxMSArNjEyLDEzIEBAIGNsYXNzIEluZkJ1aWxkRGF0YShNb2R1bGVC dWlsZENsYXNzT2JqZWN0KToNCj4gPiA+ICAgICAgICAgIGZvciBSZWNvcmQgaW4gUmVjb3JkTGlz dDoNCj4gPiA+ICAgICAgICAgICAgICBMaWIgPSBSZWNvcmRbMF0NCj4gPiA+ICAgICAgICAgICAg ICBJbnN0YW5jZSA9IFJlY29yZFsxXQ0KPiA+ID4gICAgICAgICAgICAgIGlmIEluc3RhbmNlOg0K PiA+ID4gICAgICAgICAgICAgICAgICBJbnN0YW5jZSA9IE5vcm1QYXRoKEluc3RhbmNlLCBzZWxm Ll9NYWNyb3MpDQo+ID4gPiAtICAgICAgICAgICAgUmV0VmFsW0xpYl0gPSBJbnN0YW5jZQ0KPiA+ ID4gKyAgICAgICAgICAgICAgICBSZXRWYWxbTGliXSA9IEluc3RhbmNlDQo+ID4gPiArICAgICAg ICAgICAgZWxzZToNCj4gPiA+ICsgICAgICAgICAgICAgICAgUmV0VmFsW0xpYl0gPSBOb25lDQo+ ID4gPiAgICAgICAgICByZXR1cm4gUmV0VmFsDQo+ID4gPiAgDQo+ID4gPiAgICAgICMjIFJldHJp ZXZlIGxpYnJhcnkgbmFtZXMgKGZvciBFZGsueCBzdHlsZSBvZiBtb2R1bGVzKQ0KPiA+ID4gICAg ICBAY2FjaGVkX3Byb3BlcnR5DQo+ID4gPiAgICAgIGRlZiBMaWJyYXJpZXMoc2VsZik6DQo+ID4g PiBkaWZmIC0tZ2l0IGEvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vV29ya3NwYWNlL1dvcmtzcGFj ZUNvbW1vbi5weQ0KPiA+ID4gYi9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Xb3Jrc3BhY2UvV29y a3NwYWNlQ29tbW9uLnB5DQo+ID4gPiBpbmRleCA4ZDhhM2UyNzg5Li41NWQwMWZhNGIyIDEwMDY0 NA0KPiA+ID4gLS0tIGEvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vV29ya3NwYWNlL1dvcmtzcGFj ZUNvbW1vbi5weQ0KPiA+ID4gKysrIGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vV29ya3NwYWNl L1dvcmtzcGFjZUNvbW1vbi5weQ0KPiA+ID4gQEAgLTEyNiwxNyArMTI2LDE0IEBAIGRlZiBHZXRN b2R1bGVMaWJJbnN0YW5jZXMoTW9kdWxlLCBQbGF0Zm9ybSwgQnVpbGREYXRhYmFzZSwgQXJjaCwg VGFyZ2V0LCBUb29sY2hhDQo+ID4gPiAgICAgIHdoaWxlIGxlbihMaWJyYXJ5Q29uc3VtZXJMaXN0 KSA+IDA6DQo+ID4gPiAgICAgICAgICBNID0gTGlicmFyeUNvbnN1bWVyTGlzdC5wb3AoKQ0KPiA+ ID4gICAgICAgICAgZm9yIExpYnJhcnlDbGFzc05hbWUgaW4gTS5MaWJyYXJ5Q2xhc3NlczoNCj4g PiA+ICAgICAgICAgICAgICBpZiBMaWJyYXJ5Q2xhc3NOYW1lIG5vdCBpbiBMaWJyYXJ5SW5zdGFu Y2U6DQo+ID4gPiAgICAgICAgICAgICAgICAgICMgb3ZlcnJpZGUgbGlicmFyeSBpbnN0YW5jZSBm b3IgdGhpcyBtb2R1bGUNCj4gPiA+IC0gICAgICAgICAgICAgICAgaWYgTGlicmFyeUNsYXNzTmFt ZSBpbiBQbGF0Zm9ybS5Nb2R1bGVzW3N0cihNb2R1bGUpXS5MaWJyYXJ5Q2xhc3NlczoNCj4gPiA+ IC0gICAgICAgICAgICAgICAgICAgIExpYnJhcnlQYXRoID0gUGxhdGZvcm0uTW9kdWxlc1tzdHIo TW9kdWxlKV0uTGlicmFyeUNsYXNzZXNbTGlicmFyeUNsYXNzTmFtZV0NCj4gPiA+IC0gICAgICAg ICAgICAgICAgZWxzZToNCj4gPiA+IC0gICAgICAgICAgICAgICAgICAgIExpYnJhcnlQYXRoID0g UGxhdGZvcm0uTGlicmFyeUNsYXNzZXNbTGlicmFyeUNsYXNzTmFtZSwgTW9kdWxlVHlwZV0NCj4g PiA+IC0gICAgICAgICAgICAgICAgaWYgTGlicmFyeVBhdGggaXMgTm9uZSBvciBMaWJyYXJ5UGF0 aCA9PSAiIjoNCj4gPiA+IC0gICAgICAgICAgICAgICAgICAgIExpYnJhcnlQYXRoID0gTS5MaWJy YXJ5Q2xhc3Nlc1tMaWJyYXJ5Q2xhc3NOYW1lXQ0KPiA+ID4gLSAgICAgICAgICAgICAgICAgICAg aWYgTGlicmFyeVBhdGggaXMgTm9uZSBvciBMaWJyYXJ5UGF0aCA9PSAiIjoNCj4gPiA+ICsgICAg ICAgICAgICAgICAgTGlicmFyeVBhdGggPSBQbGF0Zm9ybS5Nb2R1bGVzW3N0cihNb2R1bGUpXS5M aWJyYXJ5Q2xhc3Nlcy5nZXQoTGlicmFyeUNsYXNzTmFtZSxQbGF0Zm9ybS5MaWJyYXJ5Q2xhc3Nl c1tMaWJyYXJ5Q2xhc3NOYW1lLCBNb2R1bGVUeXBlXSkNCj4gPiA+ICsgICAgICAgICAgICAgICAg aWYgTGlicmFyeVBhdGggaXMgTm9uZToNCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgIExpYnJh cnlQYXRoID0gTS5MaWJyYXJ5Q2xhc3Nlcy5nZXQoTGlicmFyeUNsYXNzTmFtZSkNCj4gPiA+ICsg ICAgICAgICAgICAgICAgICAgIGlmIExpYnJhcnlQYXRoIGlzIE5vbmU6DQo+ID4gPiAgICAgICAg ICAgICAgICAgICAgICAgICAgaWYgRmlsZU5hbWU6DQo+ID4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIEVka0xvZ2dlci5lcnJvcigiYnVpbGQiLCBSRVNPVVJDRV9OT1RfQVZBSUxBQkxF LA0KPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklu c3RhbmNlIG9mIGxpYnJhcnkgY2xhc3MgWyVzXSBpcyBub3QgZm91bmQiICUgTGlicmFyeUNsYXNz TmFtZSwNCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEZpbGU9RmlsZU5hbWUsDQo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBFeHRyYURhdGE9ImluIFslc10gDQo+ID4gPiBbJXNdXG5cdGNvbnN1bWVkIGJ5 IG1vZHVsZSBbJXNdIiAlIChzdHIoTSksIEFyY2gsIHN0cihNb2R1bGUpKSkNCj4gPiA+IC0tDQo+ ID4gPiAyLjE5LjEud2luZG93cy4xDQo+ID4gPiANCj4gPiA+IF9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fDQo+ID4gPiBlZGsyLWRldmVsIG1haWxpbmcgbGlz dA0KPiA+ID4gZWRrMi1kZXZlbEBsaXN0cy4wMS5vcmcNCj4gPiA+IGh0dHBzOi8vbGlzdHMuMDEu b3JnL21haWxtYW4vbGlzdGluZm8vZWRrMi1kZXZlbA0KPiBfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXw0KPiBlZGsyLWRldmVsIG1haWxpbmcgbGlzdA0KPiBl ZGsyLWRldmVsQGxpc3RzLjAxLm9yZw0KPiBodHRwczovL2xpc3RzLjAxLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2VkazItZGV2ZWwNCg==