From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 706311FF15C for ; Wed, 5 Feb 2025 12:33:53 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id DF7699418; Wed, 5 Feb 2025 12:33:50 +0100 (CET) Date: Wed, 5 Feb 2025 12:33:13 +0100 From: Wolfgang Bumiller To: Max Carrara Message-ID: References: <20250130145124.317745-1-m.carrara@proxmox.com> <20250130145124.317745-3-m.carrara@proxmox.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20250130145124.317745-3-m.carrara@proxmox.com> X-SPAM-LEVEL: Spam detection results: 0 AWL 0.083 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [perl.org, storage.pm] Subject: Re: [pve-devel] [RFC v1 pve-storage 2/6] rework plugin loading and registration mechanism X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Cc: pve-devel@lists.proxmox.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" T24gVGh1LCBKYW4gMzAsIDIwMjUgYXQgMDM6NTE6MjBQTSArMDEwMCwgTWF4IENhcnJhcmEgd3Jv dGU6Cj4gVGhpcyBjb21taXQgY2hhbmdlcyBob3cgcGx1Z2lucywgYm90aCBpbmJ1aWx0IGFuZCBj dXN0b20sIGFyZSBsb2FkZWQKPiBhbmQgcmVnaXN0ZXJlZCBieSB0aGUgYFBWRTo6U3RvcmFnZWAg bW9kdWxlIGZyb20gdGhlIGdyb3VuZCB1cC4KPiAKPiBUaGlzIGlzIGRvbmUgZm9yIG1haW5seSB0 d28gcmVhc29uczoKPiAKPiAgMS4gVW5pZnlpbmcgdGhlIHBsdWdpbiBsb2FkaW5nIG1lY2hhbmlz bSBzbyB0aGF0IGluYnVpbHQgYW5kIGN1c3RvbQo+ICAgICBwbHVnaW5zIGFyZSBzdWJqZWN0ZWQg dG8gKGFsbW9zdCkgdGhlIHNhbWUgY2hlY2tzLgo+IAo+ICAyLiBNYWtpbmcgaXQgcG9zc2libGUg dG8gZWFzaWx5IGV4dGVuZCB0aGUgbG9hZGluZyAvIHJlZ2lzdGVyaW5nCj4gICAgIG1lY2hhbmlz bSBmb3IgYWRkaXRpb25hbCBjb21waWxlLXRpbWUgKEJFR0lOIHBoYXNlIFsxXSkgY2hlY2tzLgo+ IAo+IFRoZSBuZXcgcGx1Z2luIHJlZ2lzdHJhdGlvbiBtZWNoYW5pc20gZXNzZW50aWFsbHkgY29u c2lzdHMgb2YgZm91cgo+IHN0YWdlczoKPiAKPiAgMS4gTG9hZCBwbHVnaW5zIGludG8gdGhlIFBl cmwgaW50ZXJwcmV0ZXIKPiAgMi4gUGVyZm9ybSBwcmUtcmVnaXN0cmF0aW9uIGNoZWNrcwo+ICAz LiBSZWdpc3RyYXRpb24KPiAgNC4gUGVyZm9ybSBwb3N0LXJlZ2lzdHJhdGlvbiBjaGVja3MKPiAK PiBFYWNoIHN0YWdlIHdpbGwgcGVyZm9ybSBpdHMgc3BlY2lmaWMgYWN0aW9ucyBvbiBpbmJ1aWx0 IHBsdWdpbnMgZmlyc3QKPiBhbmQgb24gY3VzdG9tIHBsdWdpbnMgYWZ0ZXJ3YXJkcy4KPiAKPiBJ biBnZW5lcmFsLCBzaG91bGQgYSBzdGFnZSBmYWlsIGZvciBhbiBpbmJ1aWx0IHBsdWdpbiwgYW4g ZXhjZXB0aW9uIGlzCj4gdGhyb3duLiBGb3IgY3VzdG9tIHBsdWdpbnMgYSB3YXJuaW5nIGlzIGVt aXR0ZWQgaW5zdGVhZCBhbmQgdGhlIHBsdWdpbgo+IHdvbid0IGJlIGNvbnNpZGVyZWQgaW4gdGhl IHN1YnNlcXVlbnQgc3RhZ2UocykuCj4gCj4gVGhlIG5ldyByZWdpc3RyYXRpb24gbWVjaGFuaXNt IGlzIGVxdWl2YWxlbnQgdG8gdGhlIG9sZCBvbmUsIHdpdGggYQo+IGZldyBtaW5vciwgYnV0IG5v dGFibGUgZXhjZXB0aW9uczoKPiAKPiAgMS4gU3RhZ2UgMS4gd2lsbCBhbHNvIHZlcmlmeSB3aGV0 aGVyIGVhY2ggcGx1Z2luIChpbmJ1aWx0IG9yIGN1c3RvbSkKPiAgICAgaXMgaW5zdGFsbGVkIGlu c2lkZSBgL3Vzci9zaGFyZS9wZXJsNS9gIGFuZCBub3QgYW55d2hlcmUgZWxzZSBpbgo+ICAgICBv cmRlciB0byBndWFyYW50ZWUgdGhhdCB0aGVyZSBhcmUgbm8gY29uZmxpY3RzIHdoaWxlIGxvYWRp bmcuCgpBbmQgYWxzbyBicmVha3MgdGVzdGluZyBjaGFuZ2VzIHdpdGggYHBlcmwgLUlgL1BFUkxM SUIgZW52IHZhcnMuCgo+IAo+ICAgICBFeGFtcGxlOiBBIHBhcnRpY3VsYXJseSBpbXBlcnRpbmVu dCBjdXN0b20gcGx1Z2luICptYXkqIGluc3RhbGwKPiAgICAgaXRzZWxmIHRvIGFub3RoZXIgcGF0 aCBpbiBgQElOQ2AsIHN1Y2ggYXMKPiAgICAgYC91c3IvbG9jYWwvbGliL3g4Nl82NC1saW51eC1n bnUvcGVybC81LjM2LjBgIGUuZy4sIGFuZCBtYXNrCj4gICAgIGFub3RoZXIgaW5idWlsdCBvciBj dXN0b20gcGx1Z2luIGJ5IGhhdmluZyB0aGUgZXhhY3Qgc2FtZQo+ICAgICBuYW1lc3BhY2UuCj4g Cj4gICAgIFdoaWxlIHVubGlrZWx5LCB0aGlzIGlzIG5vdyBndWFyZGVkIGFnYWluc3QuCj4gCj4g IDIuIFRoZSBuZXcgcmVnaXN0cmF0aW9uIG1hY2hpbmVyeSBhbHNvIGNoZWNrcyB3aGV0aGVyIGlu YnVpbHQKPiAgICAgcGx1Z2lucyBkZXJpdmUgZnJvbSBgUFZFOjpTdG9yYWdlOjpQbHVnaW5gLgoK VGhhdCdzIG5vdCBuZXc/Cgo+IAo+ICAzLiBJbmJ1aWx0IHBsdWdpbnMgYXJlIG5vIGxvbmdlciBp bXBvcnRlZCB1c2luZyBgdXNlYCwgdGhlIHNhbWUgbG9naWMKPiAgICAgdXNpbmcgYHJlcXVpcmVg IGlzIG5vdyB1c2VkIGZvciBib3RoIGluYnVpbHQgYW5kIGN1c3RvbSBwbHVnaW5zLgoKQXMgbWVu dGlvbmVkIGluIHRoZSBjb3ZlciBsZXR0ZXIsIHRoaXMgc2VlbXMgdG8gdHJpcCB1cCB5b3VyIHBv aW50IDEuCgo+IAo+ICA0LiBUaGUgcmVnaXN0cmF0aW9uIG5vdyBoYXBwZW5zIGluc2lkZSB0aGUg YGltcG9ydCgpYCBzdWJyb3V0aW5lLAo+ICAgICB3aGljaCBtYWtlcyBpdCBtb3JlIHByZWRpY3Rh YmxlIHdoZW4gcGx1Z2lucyBhcmUgYWN0dWFsbHkgbG9hZGVkLgo+IAo+ICAgICBUaGlzIG1lYW5z IHRoYXQgcGx1Z2lucyBmcm9tIGhlcmUgb24gb3V0IGFyZSBvbmx5IHJlZ2lzdGVyZWQgd2hlbgo+ ICAgICBydW5uaW5nIGB1c2UgUFZFOjpTdG9yYWdlO2AgYW5kIG5vdCB3aGVuIHVzaW5nIGByZXF1 aXJlCj4gICAgIFBWRTo6U3RvcmFnZTtgLiBUaGUgZGlmZmVyZW5jZSBoZXJlIGlzIHNvbWV3aGF0 IHN1YnRsZTsgdG8KPiAgICAgZWxhYm9yYXRlLCB0aGUgc3RhdGVtZW50IGB1c2UgUFZFOjpTdG9y YWdlO2AgaXMgZXF1aXZhbGVudCB0byB0aGUKPiAgICAgZm9sbG93aW5nIFsyXToKPiAKPiAgICAg ICAgIEJFR0lOIHsKPiAgICAgICAgICAgICByZXF1aXJlICJQVkUvU3RvcmFnZS5wbSI7Cj4gICAg ICAgICAgICAgJ1BWRTo6U3RvcmFnZSctPmltcG9ydCgpOwo+ICAgICAgICAgfQo+IAo+ICAgICBC ZWNhdXNlIGBQVkU6OlN0b3JhZ2VgIGlzbid0IGltcG9ydGVkIHVzaW5nIGEgcGxhaW4gYHJlcXVp cmVgCj4gICAgIGFueXdoZXJlIGluIG91ciBjb2RlLCB0aGlzIGNoYW5nZSBpcyBzYWZlIHRvIG1h a2UuCj4gCj4gWzFdOiBodHRwczovL3Blcmxkb2MucGVybC5vcmcvcGVybG1vZCNCRUdJTiUyQy1V TklUQ0hFQ0slMkMtQ0hFQ0slMkMtSU5JVC1hbmQtRU5ECj4gWzJdOiBodHRwczovL3Blcmxkb2Mu cGVybC5vcmcvZnVuY3Rpb25zL3VzZQo+IAo+IFNpZ25lZC1vZmYtYnk6IE1heCBDYXJyYXJhIDxt LmNhcnJhcmFAcHJveG1veC5jb20+Cj4gLS0tCj4gIHNyYy9QVkUvU3RvcmFnZS5wbSB8IDU1OSAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0KPiAgMSBmaWxlIGNo YW5nZWQsIDQ4OSBpbnNlcnRpb25zKCspLCA3MCBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0 IGEvc3JjL1BWRS9TdG9yYWdlLnBtIGIvc3JjL1BWRS9TdG9yYWdlLnBtCj4gaW5kZXggZGY0ZDYy Zi4uMGM4YmE2NCAxMDA3NTUKPiAtLS0gYS9zcmMvUFZFL1N0b3JhZ2UucG0KPiArKysgYi9zcmMv UFZFL1N0b3JhZ2UucG0KPiBAQCAtMTAsNiArMTAsOCBAQCB1c2UgSU86OlNvY2tldDo6SVA7Cj4g IHVzZSBJUEM6Ok9wZW4zOwo+ICB1c2UgRmlsZTo6QmFzZW5hbWU7Cj4gIHVzZSBGaWxlOjpQYXRo Owo+ICt1c2UgRmlsZTo6U3BlYzsKPiArdXNlIENhcnA7Cj4gIHVzZSBDd2QgJ2Fic19wYXRoJzsK PiAgdXNlIFNvY2tldDsKPiAgdXNlIFRpbWU6OkxvY2FsIHF3KHRpbWVsb2NhbCk7Cj4gQEAgLTI3 LDgyICsyOSwxMiBAQCB1c2UgUFZFOjpSRVNURW52aXJvbm1lbnQgcXcobG9nX3dhcm4pOwo+ICB1 c2UgUFZFOjpTdG9yYWdlOjpWZXJzaW9uOwo+ICAKPiAgdXNlIFBWRTo6U3RvcmFnZTo6UGx1Z2lu Owo+IC11c2UgUFZFOjpTdG9yYWdlOjpEaXJQbHVnaW47Cj4gLXVzZSBQVkU6OlN0b3JhZ2U6OkxW TVBsdWdpbjsKPiAtdXNlIFBWRTo6U3RvcmFnZTo6THZtVGhpblBsdWdpbjsKPiAtdXNlIFBWRTo6 U3RvcmFnZTo6TkZTUGx1Z2luOwo+IC11c2UgUFZFOjpTdG9yYWdlOjpDSUZTUGx1Z2luOwo+IC11 c2UgUFZFOjpTdG9yYWdlOjpJU0NTSVBsdWdpbjsKPiAtdXNlIFBWRTo6U3RvcmFnZTo6UkJEUGx1 Z2luOwo+IC11c2UgUFZFOjpTdG9yYWdlOjpDZXBoRlNQbHVnaW47Cj4gLXVzZSBQVkU6OlN0b3Jh Z2U6OklTQ1NJRGlyZWN0UGx1Z2luOwo+IC11c2UgUFZFOjpTdG9yYWdlOjpHbHVzdGVyZnNQbHVn aW47Cj4gLXVzZSBQVkU6OlN0b3JhZ2U6OlpGU1Bvb2xQbHVnaW47Cj4gLXVzZSBQVkU6OlN0b3Jh Z2U6OlpGU1BsdWdpbjsKPiAtdXNlIFBWRTo6U3RvcmFnZTo6UEJTUGx1Z2luOwo+IC11c2UgUFZF OjpTdG9yYWdlOjpCVFJGU1BsdWdpbjsKPiAtdXNlIFBWRTo6U3RvcmFnZTo6RVNYaVBsdWdpbjsK PiAgCj4gIHVzZSBjb25zdGFudCBBUElWRVIgPT4gUFZFOjpTdG9yYWdlOjpWZXJzaW9uOjpBUElW RVI7Cj4gIHVzZSBjb25zdGFudCBBUElBR0UgPT4gUFZFOjpTdG9yYWdlOjpWZXJzaW9uOjpBUElB R0U7Cj4gIAo+ICBvdXIgJEtOT1dOX0VYUE9SVF9GT1JNQVRTID0gWydyYXcrc2l6ZScsICd0YXIr c2l6ZScsICdxY293MitzaXplJywgJ3ZtZGsrc2l6ZScsICd6ZnMnLCAnYnRyZnMnXTsKPiAgCj4g LSMgbG9hZCBzdGFuZGFyZCBwbHVnaW5zCj4gLVBWRTo6U3RvcmFnZTo6RGlyUGx1Z2luLT5yZWdp c3RlcigpOwo+IC1QVkU6OlN0b3JhZ2U6OkxWTVBsdWdpbi0+cmVnaXN0ZXIoKTsKPiAtUFZFOjpT dG9yYWdlOjpMdm1UaGluUGx1Z2luLT5yZWdpc3RlcigpOwo+IC1QVkU6OlN0b3JhZ2U6Ok5GU1Bs dWdpbi0+cmVnaXN0ZXIoKTsKPiAtUFZFOjpTdG9yYWdlOjpDSUZTUGx1Z2luLT5yZWdpc3Rlcigp Owo+IC1QVkU6OlN0b3JhZ2U6OklTQ1NJUGx1Z2luLT5yZWdpc3RlcigpOwo+IC1QVkU6OlN0b3Jh Z2U6OlJCRFBsdWdpbi0+cmVnaXN0ZXIoKTsKPiAtUFZFOjpTdG9yYWdlOjpDZXBoRlNQbHVnaW4t PnJlZ2lzdGVyKCk7Cj4gLVBWRTo6U3RvcmFnZTo6SVNDU0lEaXJlY3RQbHVnaW4tPnJlZ2lzdGVy KCk7Cj4gLVBWRTo6U3RvcmFnZTo6R2x1c3RlcmZzUGx1Z2luLT5yZWdpc3RlcigpOwo+IC1QVkU6 OlN0b3JhZ2U6OlpGU1Bvb2xQbHVnaW4tPnJlZ2lzdGVyKCk7Cj4gLVBWRTo6U3RvcmFnZTo6WkZT UGx1Z2luLT5yZWdpc3RlcigpOwo+IC1QVkU6OlN0b3JhZ2U6OlBCU1BsdWdpbi0+cmVnaXN0ZXIo KTsKPiAtUFZFOjpTdG9yYWdlOjpCVFJGU1BsdWdpbi0+cmVnaXN0ZXIoKTsKPiAtUFZFOjpTdG9y YWdlOjpFU1hpUGx1Z2luLT5yZWdpc3RlcigpOwo+IC0KPiAtIyBsb2FkIHRoaXJkLXBhcnR5IHBs dWdpbnMKPiAtaWYgKCAtZCAnL3Vzci9zaGFyZS9wZXJsNS9QVkUvU3RvcmFnZS9DdXN0b20nICkg ewo+IC0gICAgZGlyX2dsb2JfZm9yZWFjaCgnL3Vzci9zaGFyZS9wZXJsNS9QVkUvU3RvcmFnZS9D dXN0b20nLCAnLipcLnBtJCcsIHN1YiB7Cj4gLQlteSAoJGZpbGUpID0gQF87Cj4gLQlteSAkbW9k bmFtZSA9ICdQVkU6OlN0b3JhZ2U6OkN1c3RvbTo6JyAuICRmaWxlOwo+IC0JJG1vZG5hbWUgPX4g cyFcLnBtJCEhOwo+IC0JJGZpbGUgPSAnUFZFL1N0b3JhZ2UvQ3VzdG9tLycgLiAkZmlsZTsKPiAt Cj4gLQlldmFsIHsKPiAtCSAgICByZXF1aXJlICRmaWxlOwo+IC0KPiAtCSAgICAjIENoZWNrIHBl cmwgaW50ZXJmYWNlOgo+IC0JICAgIGRpZSAibm90IGRlcml2ZWQgZnJvbSBQVkU6OlN0b3JhZ2U6 OlBsdWdpblxuIiBpZiAhJG1vZG5hbWUtPmlzYSgnUFZFOjpTdG9yYWdlOjpQbHVnaW4nKTsKPiAt CSAgICBkaWUgImRvZXMgbm90IHByb3ZpZGUgYW4gYXBpKCkgbWV0aG9kXG4iIGlmICEkbW9kbmFt ZS0+Y2FuKCdhcGknKTsKPiAtCSAgICAjIENoZWNrIHN0b3JhZ2UgQVBJIHZlcnNpb24gYW5kIHRo YXQgZmlsZSBpcyByZWFsbHkgc3RvcmFnZSBwbHVnaW4uCj4gLQkgICAgbXkgJHZlcnNpb24gPSAk bW9kbmFtZS0+YXBpKCk7Cj4gLQkgICAgZGllICJpbXBsZW1lbnRzIGFuIEFQSSB2ZXJzaW9uIG5l d2VyIHRoYW4gY3VycmVudCAoJHZlcnNpb24gPiAiIC4gQVBJVkVSIC4gIilcbiIKPiAtCQlpZiAk dmVyc2lvbiA+IEFQSVZFUjsKPiAtCSAgICBteSAkbWluX3ZlcnNpb24gPSAoQVBJVkVSIC0gQVBJ QUdFKTsKPiAtCSAgICBkaWUgIkFQSSB2ZXJzaW9uIHRvbyBvbGQsIHBsZWFzZSB1cGRhdGUgdGhl IHBsdWdpbiAoJHZlcnNpb24gPCAkbWluX3ZlcnNpb24pXG4iCj4gLQkJaWYgJHZlcnNpb24gPCAk bWluX3ZlcnNpb247Cj4gLQkgICAgIyBhbGwgT0ssIGRvIGltcG9ydCBhbmQgcmVnaXN0ZXIgKGku ZS4sICJ1c2UiKQo+IC0JICAgIGltcG9ydCAkZmlsZTsKPiAtCSAgICAkbW9kbmFtZS0+cmVnaXN0 ZXIoKTsKPiAtCj4gLQkgICAgIyBJZiB3ZSBnb3QgdGhpcyBmYXIgYW5kIHRoZSBBUEkgdmVyc2lv biBpcyBub3QgdGhlIHNhbWUsIG1ha2Ugc29tZSBub2lzZToKPiAtCSAgICB3YXJuICJQbHVnaW4g XCIkbW9kbmFtZVwiIGlzIGltcGxlbWVudGluZyBhbiBvbGRlciBzdG9yYWdlIEFQSSwgYW4gdXBn cmFkZSBpcyByZWNvbW1lbmRlZFxuIgo+IC0JCWlmICR2ZXJzaW9uICE9IEFQSVZFUjsKPiAtCX07 Cj4gLQlpZiAoJEApIHsKPiAtCSAgICB3YXJuICJFcnJvciBsb2FkaW5nIHN0b3JhZ2UgcGx1Z2lu IFwiJG1vZG5hbWVcIjogJEAiOwo+IC0JfQo+IC0gICAgfSk7Cj4gLX0KCl4gVGhlIGFib3ZlIHdh cyBzbyBtdWNoIHNob3J0ZXIuLi4gKGFuZCB3b3JrZWQgOlApCgo+IC0KPiAtIyBpbml0aWFsaXpl IGFsbCBwbHVnaW5zCj4gLVBWRTo6U3RvcmFnZTo6UGx1Z2luLT5pbml0KCk7Cj4gLQo+ICAjIHRo ZSBmb2xsb3dpbmcgUkVzIGluZGljYXRlIHRoZSBudW1iZXIgb3IgY2FwdHVyZSBncm91cHMgdmlh IHRoZSB0cmFpbGluZyBkaWdpdAo+ICAjIENBVVRJT04gZG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0 aGUgZGlnaXRzIGFjY29yZGluZ2x5IGFmdGVyIG1lc3Npbmcgd2l0aCB0aGUgY2FwdHVyZSBncm91 cHMKPiAgCj4gQEAgLTEyNCw2ICs1Niw0OTMgQEAgb3VyICRPVkFfQ09OVEVOVF9SRV8xID0gcXIv JHtTQUZFX0NIQVJfV0lUSF9XSElURVNQQUNFX0NMQVNTX1JFfStcLihxY293MnxyYXd8dm0KPiAg IyBGSVhNRSByZW1vdmUgd2l0aCBQVkUgOS4wLCBhZGQgdmVyc2lvbmVkIGJyZWFrcyBmb3IgcHZl LW1hbmFnZXIKPiAgb3VyICR2enRtcGxfZXh0ZW5zaW9uX3JlID0gJFZaVE1QTF9FWFRfUkVfMTsK PiAgCj4gKyMgUFZFOjpTdG9yYWdlIHBsdWdpbiByZWdpc3RyYXRpb24gbWFjaGluZXJ5Cj4gKwo+ ICtteSAkcGx1Z2luX3JlZ2lzdGVyX3N0YXRlID0gewo+ICsgICAgaW5kZXggPT4ge30sCgpeIEEg Y29tbWVudCBleHBsYWluaW5nIHRoZSBjb250ZW50cyB0aGVyZSBtaWdodCBiZSB1c2VmdWwuCgo+ ICsgICAgcGx1Z2luc19pbml0aWFsaXNlZCA9PiAwLAo+ICt9Owo+ICsKPiArPWhlYWQzIGdldF9z dGFuZGFyZF9wbHVnaW5fbmFtZXMoKQo+ICsKPiArUmV0dXJucyBhbiBhcnJheSBvciBhIHJlZmVy ZW5jZSB0byBhbiBhcnJheSBvZiB0aGUgbW9kdWxlIG5hbWVzIG9mIG91ciBpbmJ1aWx0Cj4gK3N0 b3JhZ2UgcGx1Z2lucywgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsZXIuCj4g Kwo+ICsgICAgIyBib3RoIHZhbGlkCj4gKyAgICBteSAkc3RhbmRhcmRfcGx1Z2lucyA9IGdldF9z dGFuZGFyZF9wbHVnaW5fbmFtZXMoKTsKPiArICAgIG15IEBzdGFuZGFyZF9wbHVnaW5zID0gZ2V0 X3N0YW5kYXJkX3BsdWdpbl9uYW1lcygpOwoKTW9yZSBQT0QgY2x1dHRlciBmb3Igc29tZXRoaW5n IHVubmVjZXNzYXJ5IPCfmKwuCgo+ICsKPiArPWN1dAo+ICsKPiArbXkgc3ViIGdldF9zdGFuZGFy ZF9wbHVnaW5fbmFtZXMgOiBwcm90b3R5cGUoKSB7CgpUaGlzIHNob3VsZCBub3QgYmUgYSBzdWIu Cgo+ICsgICAgbXkgQHN0YW5kYXJkX3BsdWdpbnMgPSBxdygKPiArCVBWRTo6U3RvcmFnZTo6RGly UGx1Z2luCj4gKwlQVkU6OlN0b3JhZ2U6OkxWTVBsdWdpbgo+ICsJUFZFOjpTdG9yYWdlOjpMdm1U aGluUGx1Z2luCj4gKwlQVkU6OlN0b3JhZ2U6Ok5GU1BsdWdpbgo+ICsJUFZFOjpTdG9yYWdlOjpD SUZTUGx1Z2luCj4gKwlQVkU6OlN0b3JhZ2U6OklTQ1NJUGx1Z2luCj4gKwlQVkU6OlN0b3JhZ2U6 OlJCRFBsdWdpbgo+ICsJUFZFOjpTdG9yYWdlOjpDZXBoRlNQbHVnaW4KPiArCVBWRTo6U3RvcmFn ZTo6SVNDU0lEaXJlY3RQbHVnaW4KPiArCVBWRTo6U3RvcmFnZTo6R2x1c3RlcmZzUGx1Z2luCj4g KwlQVkU6OlN0b3JhZ2U6OlpGU1Bvb2xQbHVnaW4KPiArCVBWRTo6U3RvcmFnZTo6WkZTUGx1Z2lu Cj4gKwlQVkU6OlN0b3JhZ2U6OlBCU1BsdWdpbgo+ICsJUFZFOjpTdG9yYWdlOjpCVFJGU1BsdWdp bgo+ICsJUFZFOjpTdG9yYWdlOjpFU1hpUGx1Z2luCj4gKyAgICApOwo+ICsKPiArICAgIHJldHVy biBAc3RhbmRhcmRfcGx1Z2lucyBpZiB3YW50YXJyYXk7Cj4gKyAgICByZXR1cm4gXEBzdGFuZGFy ZF9wbHVnaW5zOwo+ICt9Cj4gKwo+ICs9aGVhZDMgZ2V0X2N1c3RvbV9wbHVnaW5fbmFtZXMoKQo+ ICsKPiArUmV0dXJucyBhbiBhcnJheSBvciBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSBvZiB0aGUg bW9kdWxlIG5hbWVzIG9mIGN1c3RvbQo+ICtzdG9yYWdlIHBsdWdpbnMgaW5zaWRlIEM8L3Vzci9z aGFyZS9wZXJsNS9QVkUvU3RvcmFnZS9DdXN0b20+LCBkZXBlbmRpbmcgb24gdGhlCj4gK2NvbnRl eHQgb2YgdGhlIGNhbGxlci4KPiArCj4gKyAgICAjIGJvdGggdmFsaWQKPiArICAgIG15ICRjdXN0 b21fcGx1Z2lucyA9IGdldF9jdXN0b21fcGx1Z2luX25hbWVzKCk7Cj4gKyAgICBteSBAY3VzdG9t X3BsdWdpbnMgPSBnZXRfY3VzdG9tX3BsdWdpbl9uYW1lcygpOwoK8J+YrAoKYW5kIHN0aWxsIG5v dCBjb252aW5jZWQgcHJpdmF0ZSBvbmVzaG90IHN1YnMgc2hvdWxkIHVzZSBQT0QuCgo+ICsKPiAr PWN1dAo+ICsKPiArbXkgc3ViIGdldF9jdXN0b21fcGx1Z2luX25hbWVzIDogcHJvdG90eXBlKCkg ewo+ICsgICAgbXkgQGN1c3RvbV9wbHVnaW5zID0gKCk7Cj4gKwo+ICsgICAgaWYgKCAtZCAnL3Vz ci9zaGFyZS9wZXJsNS9QVkUvU3RvcmFnZS9DdXN0b20nICkgewo+ICsJZGlyX2dsb2JfZm9yZWFj aCgnL3Vzci9zaGFyZS9wZXJsNS9QVkUvU3RvcmFnZS9DdXN0b20nLCAnLipcLnBtJCcsIHN1YiB7 Cj4gKwkgICAgbXkgKCRmaWxlKSA9IEBfOwo+ICsKPiArCSAgICBteSAkbW9kbmFtZSA9ICdQVkU6 OlN0b3JhZ2U6OkN1c3RvbTo6JyAuICRmaWxlOwo+ICsJICAgICRtb2RuYW1lID1+IHMhXC5wbSQh ITsKPiArCj4gKwkgICAgcHVzaChAY3VzdG9tX3BsdWdpbnMsICRtb2RuYW1lKTsKPiArCX0pOwo+ ICsgICAgfQo+ICsKPiArICAgIHJldHVybiBAY3VzdG9tX3BsdWdpbnMgaWYgd2FudGFycmF5Owo+ ICsgICAgcmV0dXJuIFxAY3VzdG9tX3BsdWdpbnM7Cj4gK30KPiArCj4gKz1oZWFkMyBnZXRfaW5k ZXhlZF9wbHVnaW5zKCVwYXJhbXMpCj4gKwo+ICtSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgY3Vy cmVudGx5IGluZGV4ZWQgc3RvcmFnZSBwbHVnaW5zLCBvcHRpb25hbGx5IGFsbG93aW5nCj4gK2Nl cnRhaW4gZmlsdGVycyBmbGFncyB0byBiZSBwYXNzZWQuIFJldHVybnMgYW4gYXJyYXkgb3IgYSBy ZWZlcmVuY2UgdG8gYW4gYXJyYXkKPiArZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IG9mIHRoZSBj YWxsZXIuCj4gKwo+ICsgICAgbXkgQGFsbF9wbHVnaW5zID0gZ2V0X2luZGV4ZWRfcGx1Z2lucygp Owo+ICsKPiArICAgIG15ICRzdGFuZGFyZF9wbHVnaW5zID0gZ2V0X2luZGV4ZWRfcGx1Z2lucyhp c19jdXN0b20gPT4gMCk7Cj4gKyAgICBteSBAY3VzdG9tX3BsdWdpbnMgPSBnZXRfaW5kZXhlZF9w bHVnaW5zKGlzX2N1c3RvbSA9PiAxKTsKPiArCj4gKyAgICBteSBAcmVnaXN0ZXJlZF9jdXN0b21f cGx1Z2lucyA9IGdldF9pbmRleGVkX3BsdWdpbnMoaXNfY3VzdG9tID0+IDEsIGlzX3JlZ2lzdGVy ZWQgPT4gMSk7Cj4gKwo+ICtUaGUgZm9sbG93aW5nIGtleS12YWx1ZSBwYWlycyBtYXkgb3B0aW9u YWxseSBiZSBwYXNzZWQgYW5kIHdpbGwgY2F1c2UgdGhpcwo+ICtzdWJyb3V0aW5lIHRvIGZpbHRl ciBvdXQgYW55IHBsdWdpbiBuYW1lcyBmb3Igd2hpY2ggdGhleSBkb24ndCBhcHBseToKPiArCj4g Kz1vdmVyCj4gKwo+ICs9aXRlbSAqIEM8PCBpc19jdXN0b20gPT4gWzB8MV0gPj4KPiArCj4gK1do ZXRoZXIgdG8gb25seSByZXR1cm4gbmFtZXMgb2YgY3VzdG9tIHBsdWdpbiBuYW1lcyBvciBpbmJ1 aWx0IG9uZXMuCj4gKwo+ICs9aXRlbSAqIEM8PCBpc19jaGVja2VkID0+IFswfDFdPj4KPiArCj4g K1doZXRoZXIgdG8gb25seSByZXR1cm4gcGx1Z2lucyB0aGF0IHBhc3NlZCBvciBoYXZlbid0IHBh c3NlZCB0aGUKPiArcHJlLXJlZ2lzdHJhdGlvbiBjaGVjay4KPiArCj4gKz1pdGVtICogQzw8IGlz X3JlZ2lzdGVyZWQgPT4gWzB8MV0gPj4KPiArCj4gK1doZXRoZXIgdG8gb25seSByZXR1cm4gcGx1 Z2lucyB0aGF0IHdlcmUgb3Igd2VyZW4ndCByZWdpc3RlcmVkLgo+ICsKPiArPWJhY2sKPiArCj4g Kz1jdXQKPiArCj4gK215IHN1YiBnZXRfaW5kZXhlZF9wbHVnaW5zIDogcHJvdG90eXBlKDslKSB7 Cj4gKyAgICBteSAoJXBhcmFtcykgPSBAXzsKPiArCj4gKyAgICBteSAkcGx1Z2luX2luZGV4ID0g JHBsdWdpbl9yZWdpc3Rlcl9zdGF0ZS0+e2luZGV4fTsKPiArCj4gKyAgICBteSAkdGVzdF9pbmRl eF9mb3JfZmxhZyA9IHN1YiB7Cj4gKwlteSAoJHBsdWdpbl9uYW1lLCAkZmxhZykgPSBAXzsKPiAr Cj4gKwlyZXR1cm4gMCBpZiAhZGVmaW5lZCgkcGx1Z2luX2luZGV4LT57JF99KTsKPiArCXJldHVy biAwIGlmICFkZWZpbmVkKCRwbHVnaW5faW5kZXgtPnskX30tPnskZmxhZ30pOwo+ICsKPiArCXJl dHVybiAkcGx1Z2luX2luZGV4LT57JF99LT57JGZsYWd9ID09ICRwYXJhbXN7JGZsYWd9Owo+ICsg ICAgfTsKPiArCj4gKyAgICBteSBAcGx1Z2lucyA9IGtleXMgJHBsdWdpbl9pbmRleC0+JSo7Cj4g Kwo+ICsgICAgQHBsdWdpbnMgPSBncmVwIHsgJHRlc3RfaW5kZXhfZm9yX2ZsYWctPigkXywgJ2lz X2N1c3RvbScpIH0gQHBsdWdpbnMKPiArCWlmIGRlZmluZWQoJHBhcmFtc3tpc19jdXN0b219KTsK Cl4gVGhlIGhlbHBlci1jbG9zdXJlIGNvdWxkIGRvIHRoZSBlbnRpcmUgYGdyZXBgIHN0YXRlbWVu dCB0byBtYWtlIHRoaXMKanVzdCBiZQoKICAgICRncmVwX2Zvcl9mbGFncy0+KCRmbGFnKSBmb3Ig KHF3KGlzX2NoZWNrZWQgLi4uKSk7CgphdCB3aGljaCBwb2ludCB3ZSBjb3VsZCBkcm9wIHRoZSBj bG9zdXJlIGFuZCBqdXN0IGRvCgogICAgZm9yIG15ICRmbGFnIChxdyhpc19jdXN0b20gaXNfY2hl Y2tlZCBpc19yZWdpc3RlcmVkKSB7CiAgICAgICAgIyBjb250ZW50cyBvZiBoZWxwZXIgc3ViCiAg ICB9CgpJTU8gbW9yZSByZWFkYWJsZS4KCj4gKwo+ICsgICAgQHBsdWdpbnMgPSBncmVwIHsgJHRl c3RfaW5kZXhfZm9yX2ZsYWctPigkXywgJ2lzX2NoZWNrZWQnKSB9IEBwbHVnaW5zCj4gKwlpZiBk ZWZpbmVkKCRwYXJhbXN7aXNfY2hlY2tlZH0pOwo+ICsKPiArICAgIEBwbHVnaW5zID0gZ3JlcCB7 ICR0ZXN0X2luZGV4X2Zvcl9mbGFnLT4oJF8sICdpc19yZWdpc3RlcmVkJykgfSBAcGx1Z2lucwo+ ICsJaWYgZGVmaW5lZCgkcGFyYW1ze2lzX3JlZ2lzdGVyZWR9KTsKPiArCj4gKyAgICByZXR1cm4g QHBsdWdpbnMgaWYgd2FudGFycmF5Owo+ICsgICAgcmV0dXJuIEBwbHVnaW5zOwoKXiBubwoKPiAr fQo+ICsKPiArPWhlYWQzIGRvX3RyeV9sb2FkX3BsdWdpbiglcGFyYW1zKQo+ICsKPiArQWN0dWFs IGxvYWRpbmcgbWVjaGFuaXNtIHVzZWQgaW5zaWRlIEM8TDw8IHRyeV9sb2FkX3BsdWdpbnMoKXwv InRyeV9sb2FkX3BsdWdpbnMoKSIgPj4+Lgo+ICtBdHRlbXB0cyB0byBsb2FkIHRoZSBwbHVnaW4g cHJvdmlkZWQgdmlhIHRoZSBDPG5hbWU+IGtleS4gT3B0aW9uYWxseSwgQzw8IGlzX2N1c3RvbSA9 PiAxID4+Cj4gK21heSBiZSBwYXNzZWQgaWYgYSBjdXN0b20gcGx1Z2luIGlzIGJlaW5nIGxvYWRl ZC4KPiArCj4gKyAgICBkb190cnlfbG9hZF9wbHVnaW4obmFtZSA9PiAnUFZFOjpTdG9yYWdlOjpE aXJQbHVnaW4nKTsKPiArCj4gKyAgICBkb190cnlfbG9hZF9wbHVnaW4obmFtZSA9PiAnUFZFOjpT dG9yYWdlOjpDdXN0b206OkZvb1BsdWdpbicsIGlzX2N1c3RvbSA9PiAxKTsKPiArCj4gK1RoZSBn aXZlbiBwbHVnaW4gaXMgbG9hZGVkIGR5bmFtaWNhbGx5IHZpYSBQZXJsJ3MgQzxyZXF1aXJlPiBh bmQgdGhlbiBhZGRlZCB0bwo+ICt0aGUgcGx1Z2luIGluZGV4IGZvciBmdXJ0aGVyIG9wZXJhdGlv bnMsIHN1Y2ggYXMgcHJlLSBhbmQgcG9zdC1yZWdpc3RyYXRpb24KPiArY2hlY2tzIGFzIHdlbGwg YXMgdGhlIGFjdHVhbCByZWdpc3RyYXRpb24gaXRzZWxmLgo+ICsKPiArVGhpcyBzdWJyb3V0aW5l IHBlcmZvcm1zIGFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrcyBhbmQgd2lsbCByYWlzZSBhbiBleGNl cHRpb24gaWYKPiArdGhlIHBsdWdpbiBkb2Vzbid0IGV4aXN0IGluIEM8L3Vzci9zaGFyZS9wZXJs NS8+IG9yIGlmIHRoZSBwbHVnaW4gd2FzIGFscmVhZHkgbG9hZGVkLgo+ICsKPiArPWN1dAo+ICsK PiArbXkgc3ViIGRvX3RyeV9sb2FkX3BsdWdpbiA6IHByb3RvdHlwZSglKSB7Cj4gKyAgICBteSAo JXBhcmFtcykgPSBAXzsKPiArCj4gKyAgICBteSAkcGx1Z2luX25hbWUgPSAkcGFyYW1ze25hbWV9 Owo+ICsgICAgbXkgJGlzX2N1c3RvbSA9ICRwYXJhbXN7aXNfY3VzdG9tfTsKPiArCj4gKyAgICBj cm9hayAibm8gcGx1Z2luIG5hbWUgcHJvdmlkZWQgLSBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZCBu YW1lc3BhY2UsIGUuZy4gRm9vOjpCYXI6OkJheiIKPiArCWlmICFkZWZpbmVkKCRwbHVnaW5fbmFt ZSk7Cj4gKwo+ICsgICAgbXkgJGJhc2VfcGF0aCA9ICcvdXNyL3NoYXJlL3Blcmw1Lyc7Cj4gKwo+ ICsgICAgbXkgJHBsdWdpbl9maWxlcGF0aCA9IEZpbGU6OlNwZWMtPmNhdGRpcihzcGxpdCgnOjon LCAkcGx1Z2luX25hbWUpKSAuICcucG0nOwo+ICsgICAgbXkgKCRfdm9sdW1lLCAkcGx1Z2luX2Rp ciwgJHBsdWdpbl9maWxlbmFtZSkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJHBsdWdpbl9maWxl cGF0aCk7Cj4gKwo+ICsgICAgbXkgJHBsdWdpbl9maWxlcGF0aF9hYnMgPSBGaWxlOjpTcGVjLT5j YXRmaWxlKCRiYXNlX3BhdGgsICRwbHVnaW5fZGlyLCAkcGx1Z2luX2ZpbGVuYW1lKTsKPiArCj4g KyAgICBjcm9hayAicGx1Z2luICckcGx1Z2luX25hbWUnIGRvZXMgbm90IGV4aXN0IGF0IHBhdGgg JyRwbHVnaW5fZmlsZXBhdGhfYWJzJyIKPiArCWlmICghIC1lICRwbHVnaW5fZmlsZXBhdGhfYWJz KTsKPiArCj4gKyAgICBldmFsIHsKPiArCXJlcXVpcmUgJHBsdWdpbl9maWxlcGF0aDsKPiArICAg IH07Cj4gKyAgICBjcm9hayAiRmFpbGVkIHRvIGxvYWQgcGx1Z2luICckcGx1Z2luX25hbWUnIC0g JEAiIGlmICRAOwo+ICsKPiArICAgIG15ICRwbHVnaW5faW5kZXggPSAkcGx1Z2luX3JlZ2lzdGVy X3N0YXRlLT57aW5kZXh9Owo+ICsKPiArICAgIGNvbmZlc3MgIlBsdWdpbiAnJHBsdWdpbl9uYW1l JyBpcyBhbHJlYWR5IGxvYWRlZCIgaWYgZXhpc3RzKCRwbHVnaW5faW5kZXgtPnskcGx1Z2luX25h bWV9KTsKPiArCj4gKyAgICAkcGx1Z2luX2luZGV4LT57JHBsdWdpbl9uYW1lfSA9IHsKPiArCWFi c29sdXRlX3BhdGggPT4gJHBsdWdpbl9maWxlcGF0aF9hYnMsCj4gKwlpc19jdXN0b20gPT4gJGlz X2N1c3RvbSB8fCAwLAo+ICsJaXNfY2hlY2tlZCA9PiAwLAo+ICsJaXNfcmVnaXN0ZXJlZCA9PiAw LAo+ICsgICAgfTsKPiArCj4gKyAgICByZXR1cm47Cj4gK30KPiArCj4gKz1oZWFkMyB0cnlfbG9h ZF9wbHVnaW5zKCkKPiArCj4gK0F0dGVtcHRzIHRvIGxvYWQgYWxsIGF2YWlsYWJsZSBwbHVnaW5z LCB3aXRoIGluYnVpbHQgKCJzdGFuZGFyZCIpIHBsdWdpbnMgYmVpbmcKPiArbG9hZGVkIGZpcnN0 IGFuZCBjdXN0b20gcGx1Z2lucyBsb2FkZWQgYWZ0ZXJ3YXJkcy4KPiArCj4gK0FsbCBzdGFuZGFy ZCBwbHVnaW5zIG11c3Qgc3VjY2Vzc2Z1bGx5IGxvYWQsIG90aGVyd2lzZSBhbiBleGNlcHRpb24g aXMgdGhyb3duLgo+ICtJZiBhIGN1c3RvbSBwbHVnaW4gZmFpbHMgdG8gbG9hZCwgYSB3YXJuaW5n IGlzIGVtaXR0ZWQgaW5zdGVhZC4KPiArCj4gKz1jdXQKPiArCj4gK215IHN1YiB0cnlfbG9hZF9w bHVnaW5zIDogcHJvdG90eXBlKCkgewo+ICsgICAgbXkgQGVycnMgPSAoKTsKPiArCj4gKyAgICBm b3IgbXkgJHBsdWdpbiAoZ2V0X3N0YW5kYXJkX3BsdWdpbl9uYW1lcygpKSB7Cj4gKwlldmFsIHsK PiArCSAgICBkb190cnlfbG9hZF9wbHVnaW4obmFtZSA9PiAkcGx1Z2luKTsKPiArCX07Cj4gKwo+ ICsJcHVzaChAZXJycywgJEApIGlmICRAOwo+ICsgICAgfQo+ICsKPiArICAgIGNvbmZlc3MoIkVu Y291bnRlcmVkIHVuZXhwZWN0ZWQgZXJyb3Iocykgd2hpbGUgbG9hZGluZyBwbHVnaW5zOlxuIiwg am9pbigiXG4iLCBAZXJycyksICJcblxuLi4uICIpCj4gKwlpZiBzY2FsYXIoQGVycnMpOwo+ICsK PiArICAgIGZvciBteSAkcGx1Z2luIChnZXRfY3VzdG9tX3BsdWdpbl9uYW1lcygpKSB7Cj4gKwll dmFsIHsKPiArCSAgICBkb190cnlfbG9hZF9wbHVnaW4obmFtZSA9PiAkcGx1Z2luLCBpc19jdXN0 b20gPT4gMSk7Cj4gKwl9Owo+ICsKPiArCXdhcm4gIkVycm9yIGxvYWRpbmcgc3RvcmFnZSBwbHVn aW4gXCIkcGx1Z2luXCIgLSAkQCIgaWYgJEA7Cj4gKyAgICB9Cj4gKwo+ICsgICAgcmV0dXJuOwo+ ICt9Cj4gKwo+ICs9aGVhZDMgZG9fcHJlX3JlZ2lzdGVyX2NoZWNrX3BsdWdpbiglcGFyYW1zKQo+ ICsKPiArVXNlZCB3aXRoaW4gQzxMPDwgcHJlX3JlZ2lzdGVyX2NoZWNrX3BsdWdpbnMoKXwvInBy ZV9yZWdpc3Rlcl9jaGVja19wbHVnaW5zKCkiID4+Pgo+ICt0byBwZXJmb3JtIHRoZSBhY3R1YWwg cHJlLXJlZ2lzdHJhdGlvbiBjaGVja3MgZm9yIHRoZSBwbHVnaW4gZ2l2ZW4gYnkgdGhlIEM8bmFt ZT4KPiAra2V5Lgo+ICsKPiArICAgIGRvX3ByZV9yZWdpc3Rlcl9jaGVja19wbHVnaW4obmFtZSA9 PiAnUFZFOjpTdG9yYWdlOjpEaXJQbHVnaW4nKTsKPiArCj4gK1RoaXMgY2hlY2tzIHdoZXRoZXIg dGhlIHBsdWdpbiBpcyBkZXJpdmVkIGZyb20gQzxMPFBWRTo6U3RvcmFnZTo6UGx1Z2luPj4uIElm IHRoZQo+ICtwbHVnaW4gaXMgYSBjdXN0b20gcGx1Z2luLCBpdHMgQVBJIGNvbmZvcm1hbmNlIGlz IGFsc28gdmVyaWZpZWQ6Cj4gKwo+ICs9b3Zlcgo+ICsKPiArPWl0ZW0gKiBUaGUgcGx1Z2luIG11 c3QgcHJvdmlkZSBhbiBDPGFwaSgpPiBtZXRob2QgcmV0dXJuaW5nIGl0cyBBUEkgdmVyc2lvbgo+ ICsKPiArPWl0ZW0gKiBJdHMgQVBJIHZlcnNpb24gbXVzdCBub3QgYmUgbmV3ZXIgdGhhbiB0aGUg Y3VycmVudCBzdG9yYWdlIEFQSSB2ZXJzaW9uCj4gKwo+ICs9aXRlbSAqIEl0cyBBUEkgdmVyc2lv biBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIHRoZSBzdG9yYWdlIEFQSSBhZ2UgYWxsb3dzCj4gKwo+ ICs9YmFjawo+ICsKPiArPWN1dAo+ICsKPiArbXkgc3ViIGRvX3ByZV9yZWdpc3Rlcl9jaGVja19w bHVnaW4gOiBwcm90b3R5cGUoJSkgewo+ICsgICAgbXkgKCVwYXJhbXMpID0gQF87Cj4gKwo+ICsg ICAgbXkgJHBsdWdpbl9uYW1lID0gJHBhcmFtc3tuYW1lfTsKPiArCj4gKyAgICBteSAkcGx1Z2lu X2luZGV4ID0gJHBsdWdpbl9yZWdpc3Rlcl9zdGF0ZS0+e2luZGV4fTsKPiArCj4gKyAgICBjcm9h ayAiUGx1Z2luICckcGx1Z2luX25hbWUnIGRvZXMgbm90IGV4aXN0IGluIGluZGV4Igo+ICsJaWYg IWRlZmluZWQoJHBsdWdpbl9pbmRleC0+eyRwbHVnaW5fbmFtZX0pOwo+ICsKPiArICAgIG15ICRp c19jdXN0b20gPSAkcGx1Z2luX2luZGV4LT57JHBsdWdpbl9uYW1lfS0+e2lzX2N1c3RvbX07Cj4g Kwo+ICsgICAgbXkgJGNoZWNrX2Rlcml2ZXNfYmFzZSA9IHN1YiB7Cj4gKwkjIHNvIHRoYXQgd2Ug bWF5IGNhbGwgbWV0aG9kcyBvbiAkcGx1Z2luX25hbWUKPiArCW5vIHN0cmljdCAncmVmcyc7ICMj IG5vIGNyaXRpYwo+ICsKPiArCWRpZSAibm90IGRlcml2ZWQgZnJvbSBQVkU6OlN0b3JhZ2U6OlBs dWdpblxuIgo+ICsJICAgIGlmICEkcGx1Z2luX25hbWUtPmlzYSgnUFZFOjpTdG9yYWdlOjpQbHVn aW4nKTsKPiArICAgIH07Cj4gKwo+ICsgICAgbXkgJGNoZWNrX3BsdWdpbl9hcGkgPSBzdWIgewo+ ICsJIyBzbyB0aGF0IHdlIG1heSBjYWxsIG1ldGhvZHMgb24gJHBsdWdpbl9uYW1lCj4gKwlubyBz dHJpY3QgJ3JlZnMnOyAjIyBubyBjcml0aWMKPiArCj4gKwlkaWUgImRvZXMgbm90IHByb3ZpZGUg YW4gJ2FwaSgpJyBtZXRob2RcbiIKPiArCSAgICBpZiAhJHBsdWdpbl9uYW1lLT5jYW4oJ2FwaScp Owo+ICsKPiArCW15ICR2ZXJzaW9uID0gJHBsdWdpbl9uYW1lLT5hcGkoKTsKPiArCW15ICRtaW5f dmVyc2lvbiA9IChBUElWRVIgLSBBUElBR0UpOwo+ICsKPiArCWRpZSAiaW1wbGVtZW50cyBhbiBB UEkgdmVyc2lvbiBuZXdlciB0aGFuIGN1cnJlbnQgKCR2ZXJzaW9uID4gQHtbQVBJVkVSXX0pXG4i Cj4gKwkgICAgaWYgJHZlcnNpb24gPiBBUElWRVI7Cj4gKwo+ICsJZGllICJBUEkgdmVyc2lvbiB0 b28gb2xkLCBwbGVhc2UgdXBkYXRlIHRoZSBwbHVnaW4gKCR2ZXJzaW9uIDwgJG1pbl92ZXJzaW9u KVxuIgo+ICsJICAgIGlmICR2ZXJzaW9uIDwgJG1pbl92ZXJzaW9uOwo+ICsgICAgfTsKPiArCj4g KyAgICBldmFsIHsKPiArCSRjaGVja19kZXJpdmVzX2Jhc2UtPigpOwo+ICsJJGNoZWNrX3BsdWdp bl9hcGktPigpIGlmICRpc19jdXN0b207Cj4gKyAgICB9Owo+ICsKPiArICAgIGNyb2FrICJQcmUt cmVnaXN0cmF0aW9uIGNoZWNrIGZhaWxlZCBmb3IgcGx1Z2luICckcGx1Z2luX25hbWUnIC0gJEAi IGlmICRAOwo+ICsKPiArICAgICRwbHVnaW5faW5kZXgtPnskcGx1Z2luX25hbWV9LT57aXNfY2hl Y2tlZH0gPSAxOwo+ICsKPiArICAgIHJldHVybjsKPiArfQo+ICsKPiArPWhlYWQzIHByZV9yZWdp c3Rlcl9jaGVja19wbHVnaW5zKCkKPiArCj4gK1BlcmZvcm1zIHZhcmlvdXMgcHJlLXJlZ2lzdHJh dGlvbiBjaGVja3MgZm9yIGFsbCBwbHVnaW5zLgo+ICsKPiArU3RhbmRhcmQgcGx1Z2lucyBtdXN0 IGFsd2F5cyBwYXNzIGFsbCBjaGVja3MuIElmIGEgY3VzdG9tIHBsdWdpbiBmYWlscyBhIGNoZWNr LAo+ICthIHdhcm5pbmcgaXMgZW1pdHRlZCBpbnN0ZWFkIGFuZCBpdCB3aWxsIG5vdCBiZSByZWdp c3RlcmVkIGxhdGVyIG9uLgo+ICsKPiArRm9yIG1vcmUgZGV0YWlscyBvbiB3aGljaCBjaGVja3Mg YXJlIHBlcmZvcm1lZCwgc2VlCj4gK0M8TDw8IGRvX3ByZV9yZWdpc3Rlcl9jaGVja19wbHVnaW4o KXwvImRvX3ByZV9yZWdpc3Rlcl9jaGVja19wbHVnaW4oJXBhcmFtcykiID4+Pi4KPiArCj4gKz1j dXQKPiArCj4gK215IHN1YiBwcmVfcmVnaXN0ZXJfY2hlY2tfcGx1Z2lucyA6IHByb3RvdHlwZSgp IHsKPiArICAgIG15IEBlcnJzID0gKCk7Cj4gKwo+ICsgICAgbXkgQHN0YW5kYXJkX3BsdWdpbnMg PSBnZXRfaW5kZXhlZF9wbHVnaW5zKGlzX2N1c3RvbSA9PiAwKTsKPiArICAgIGZvciBteSAkcGx1 Z2luIChAc3RhbmRhcmRfcGx1Z2lucykgewo+ICsJZXZhbCB7Cj4gKwkgICAgZG9fcHJlX3JlZ2lz dGVyX2NoZWNrX3BsdWdpbihuYW1lID0+ICRwbHVnaW4pOwo+ICsJfTsKPiArCj4gKwlwdXNoKEBl cnJzLCAkQCkgaWYgJEA7Cj4gKyAgICB9Cj4gKwo+ICsgICAgaWYgKHNjYWxhcihAZXJycykpIHsK PiArCW15ICRlcnJfbXNnID0gIkVuY291bnRlcmVkIHVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgcGVy Zm9ybWluZyIKPiArCSAgICAuICIgcHJlLXJlZ2lzdHJhdGlvbiBjaGVjayBmb3IgaW5idWlsdCBw bHVnaW5zOlxuIjsKPiArCj4gKwljb25mZXNzKCRlcnJfbXNnLCBqb2luKCJcbiIsIEBlcnJzKSwg IlxuXG4uLi4gIik7Cj4gKyAgICB9Cj4gKwo+ICsgICAgbXkgQGN1c3RvbV9wbHVnaW5zID0gZ2V0 X2luZGV4ZWRfcGx1Z2lucyhpc19jdXN0b20gPT4gMSk7Cj4gKyAgICBmb3IgbXkgJHBsdWdpbiAo QGN1c3RvbV9wbHVnaW5zKSB7Cj4gKwlldmFsIHsKPiArCSAgICBkb19wcmVfcmVnaXN0ZXJfY2hl Y2tfcGx1Z2luKG5hbWUgPT4gJHBsdWdpbik7Cj4gKwl9Owo+ICsKPiArCWlmICgkQCkgewo+ICsJ ICAgIHdhcm4gIkVuY291bnRlcmVkIHVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgcGVyZm9ybWluZyBw cmUtcmVnaXN0cmF0aW9uIgo+ICsJCS4gIiBjaGVjayBmb3IgY3VzdG9tIHBsdWdpbiBcIiRwbHVn aW5cIjpcbiRAXG4iOwo+ICsJICAgIHdhcm4gIlBsdWdpbiB3aWxsIG5vdCBiZSByZWdpc3RlcmVk LlxuIjsKPiArCX0KPiArICAgIH0KPiArCj4gKyAgICByZXR1cm47Cj4gK30KPiArCj4gKz1oZWFk MyB0cnlfcmVnaXN0ZXJfcGx1Z2lucygpCj4gKwo+ICtBdHRlbXB0cyB0byByZWdpc3RlciBhbGwg cGx1Z2lucyBvZiB0aGUgcGx1Z2luIGluZGV4IGZvciB3aGljaCB0aGUKPiArTDxwcmUtcmVnaXN0 cmF0aW9uIGNoZWNrfC8icHJlX3JlZ2lzdGVyX2NoZWNrX3BsdWdpbnMoKSI+IHdhcyBzdWNjZXNz ZnVsLCB3aXRoCj4gK3N0YW5kYXJkIHBsdWdpbnMgYmVpbmcgcmVnaXN0ZXJlZCBmaXJzdCBhbmQg Y3VzdG9tIHBsdWdpbnMgYWZ0ZXJ3YXJkcy4KPiArCj4gK0luIGRldGFpbCwgZm9yIGVhY2ggcGx1 Z2luLCB0aGUgQzxpbXBvcnQoKT4gc3Vicm91dGluZSBpcyBmaXJzdCBydW4sIGZvbGxvd2VkCj4g K2J5IEM8TDw8IHJlZ2lzdGVyKCl8UFZFOjpTZWN0aW9uQ29uZmlnL3JlZ2lzdGVyID4+Pi4KPiAr Cj4gK0ZvciBhbGwgc3RhbmRhcmQgcGx1Z2lucyBib3RoIGludm9jYXRpb25zIG11c3Qgc3VjY2Vl ZCwgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbgo+ICtpcyB0aHJvd24uIElmIGEgY2FsbCB0byBlaXRo ZXIgc3Vicm91dGluZSBmYWlscyBmb3IgYSBjdXN0b20gcGx1Z2luLCBhIHdhcm5pbmcKPiAraXMg ZW1pdHRlZCBpbnN0ZWFkIGFuZCB0aGUgY3VzdG9tIHBsdWdpbiByZW1haW5zIHVucmVnaXN0ZXJl ZC4KPiArCj4gKz1jdXQKPiArCj4gK215IHN1YiB0cnlfcmVnaXN0ZXJfcGx1Z2lucyA6IHByb3Rv dHlwZSgpIHsKPiArICAgIG15IEBlcnJzID0gKCk7Cj4gKwo+ICsgICAgbXkgJHBsdWdpbl9pbmRl eCA9ICRwbHVnaW5fcmVnaXN0ZXJfc3RhdGUtPntpbmRleH07Cj4gKwo+ICsgICAgbXkgJHRyeV9p bXBvcnQgPSBzdWIgewo+ICsJbXkgKCRwbHVnaW5fbmFtZSkgPSBAXzsKPiArCj4gKwkjIHNvIHRo YXQgd2UgbWF5IGNhbGwgbWV0aG9kcyBvbiAkcGx1Z2luX25hbWUKPiArCW5vIHN0cmljdCAncmVm cyc7ICMjIG5vIGNyaXRpYwo+ICsJJHBsdWdpbl9uYW1lLT5pbXBvcnQoKTsKClRoaXMgbmVlZHMg dG8gaGFwcGVuIGluIGB0cnlfbG9hZF9wbHVnaW5zYCBvcgpgcHJlX3JlZ2lzdGVyX2NoZWNrX3Bs dWdpbnNgLCBvdGhlcndpc2UgYC0+aXNhKClgIHdvbid0IHdvcmsuCgo+ICsgICAgfTsKPiArCj4g KyAgICBteSAkdHJ5X3JlZ2lzdGVyID0gc3ViIHsKPiArCW15ICgkcGx1Z2luX25hbWUpID0gQF87 Cj4gKwo+ICsJIyBzbyB0aGF0IHdlIG1heSBjYWxsIG1ldGhvZHMgb24gJHBsdWdpbl9uYW1lCj4g KwlubyBzdHJpY3QgJ3JlZnMnOyAjIyBubyBjcml0aWMKPiArCSRwbHVnaW5fbmFtZS0+cmVnaXN0 ZXIoKTsKPiArCj4gKwkkcGx1Z2luX2luZGV4LT57JHBsdWdpbl9uYW1lfS0+e2lzX3JlZ2lzdGVy ZWR9ID0gMTsKPiArICAgIH07Cj4gKwo+ICsgICAgbXkgQHN0YW5kYXJkX3BsdWdpbnMgPSBnZXRf aW5kZXhlZF9wbHVnaW5zKGlzX2N1c3RvbSA9PiAwLCBpc19jaGVja2VkID0+IDEpOwo+ICsgICAg Zm9yIG15ICRwbHVnaW4gKEBzdGFuZGFyZF9wbHVnaW5zKSB7Cj4gKwlldmFsIHsKPiArCSAgICAk dHJ5X2ltcG9ydC0+KCRwbHVnaW4pOwo+ICsJfTsKPiArCj4gKwlpZiAoJEApIHsKPiArCSAgICBw dXNoKEBlcnJzLCAiRW5jb3VudGVyZWQgdW5leHBlY3RlZCBlcnJvciB3aGlsZSBydW5uaW5nICck cGx1Z2luXC0+aW1wb3J0KCknIC0gJEAiKTsKPiArCSAgICBuZXh0Owo+ICsJfQo+ICsKPiArCWV2 YWwgewo+ICsJICAgICR0cnlfcmVnaXN0ZXItPigkcGx1Z2luKTsKPiArCX07Cj4gKwo+ICsJaWYg KCRAKSB7Cj4gKwkgICAgcHVzaChAZXJycywgIkVuY291bnRlcmVkIHVuZXhwZWN0ZWQgZXJyb3Ig d2hpbGUgcnVubmluZyAnJHBsdWdpblwtPnJlZ2lzdGVyKCknIC0gJEAiKTsKPiArCSAgICBuZXh0 Owo+ICsJfQo+ICsgICAgfQo+ICsKPiArICAgIGNvbmZlc3Mgam9pbigiXG5cbiIsIEBlcnJzLCAi XG5cbi4uLiAiKSBpZiBzY2FsYXIoQGVycnMpOwo+ICsKPiArICAgIG15IEBjdXN0b21fcGx1Z2lu cyA9IGdldF9pbmRleGVkX3BsdWdpbnMoaXNfY3VzdG9tID0+IDEsIGlzX2NoZWNrZWQgPT4gMSk7 Cj4gKyAgICBmb3IgbXkgJHBsdWdpbiAoQGN1c3RvbV9wbHVnaW5zKSB7Cj4gKwlldmFsIHsKPiAr CSAgICAkdHJ5X2ltcG9ydC0+KCRwbHVnaW4pOwo+ICsJfTsKPiArCj4gKwlpZiAoJEApIHsKPiAr CSAgICBjYXJwICJGYWlsZWQgdG8gcnVuICdpbXBvcnQnIG9uIGN1c3RvbSBwbHVnaW4gJyRwbHVn aW4nIC0gJEAiOwo+ICsJICAgIGNhcnAgIlBsZWFzZSBjaGVjayBpZiB0aGUgcGx1Z2luIGlzIGlu c3RhbGxlZCBjb3JyZWN0bHkuIjsKPiArCSAgICBjYXJwICJDb250aW51aW5nIHRvIHJlZ2lzdGVy IHJlbWFpbmluZyBjdXN0b20gcGx1Z2lucyAoaWYgYW55KS4iOwo+ICsKPiArCSAgICBuZXh0Owo+ ICsJfQo+ICsKPiArCWV2YWwgewo+ICsJICAgICR0cnlfcmVnaXN0ZXItPigkcGx1Z2luKTsKPiAr CX07Cj4gKwo+ICsJaWYgKCRAKSB7Cj4gKwkgICAgY2FycCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGN1 c3RvbSBwbHVnaW4gJyRwbHVnaW4nIC0gJEAiOwo+ICsJICAgIGNhcnAgIlBsZWFzZSB2ZXJpZnkg d2hldGhlciB0aGUgcGx1Z2luIGlzIGluc3RhbGxlZCBjb3JyZWN0bHkuIjsKPiArCSAgICBjYXJw ICJDb250aW51aW5nIHRvIHJlZ2lzdGVyIHJlbWFpbmluZyBjdXN0b20gcGx1Z2lucyAoaWYgYW55 KS4iOwo+ICsKPiArCSAgICBuZXh0Owo+ICsJfQo+ICsgICAgfQo+ICsKPiArICAgIHJldHVybjsK PiArfQo+ICsKPiArPWhlYWQzIHBvc3RfcmVnaXN0ZXJfY2hlY2tfcGx1Z2lucygpCj4gKwo+ICtV c2VkIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3Mgb24gZWFjaCBwbHVnaW4gYWZ0ZXIgdGhlIHBs dWdpbnMnIHJlZ2lzdHJhdGlvbi4KPiArCj4gK1RoaXMgc3Vicm91dGluZSBjdXJyZW50bHkgb25s eSBlbWl0cyBhIHdhcm5pbmcgaWYgYSBjdXN0b20gcGx1Z2luJ3MgQVBJIHZlcnNpb24KPiAraXMg b2xkZXIgdGhhbiB0aGUgY3VycmVudCBvbmUuCj4gKwo+ICs9Y3V0Cj4gKwo+ICtteSBzdWIgcG9z dF9yZWdpc3Rlcl9jaGVja19wbHVnaW5zIDogcHJvdG90eXBlKCkgewo+ICsgICAgbXkgQGN1c3Rv bV9wbHVnaW5zID0gZ2V0X2luZGV4ZWRfcGx1Z2lucyhpc19jdXN0b20gPT4gMSwgaXNfcmVnaXN0 ZXJlZCA9PiAxKTsKPiArICAgIGZvciBteSAkcGx1Z2luIChAY3VzdG9tX3BsdWdpbnMpIHsKPiAr CSMgc28gdGhhdCB3ZSBtYXkgY2FsbCBtZXRob2RzIG9uICRwbHVnaW4KPiArCW5vIHN0cmljdCAn cmVmcyc7ICMjIG5vIGNyaXRpYwo+ICsKPiArCW15ICR2ZXJzaW9uID0gJHBsdWdpbi0+YXBpKCk7 Cj4gKwl3YXJuICJQbHVnaW4gXCIkcGx1Z2luXCIgaXMgaW1wbGVtZW50aW5nIGFuIG9sZGVyIHN0 b3JhZ2UgQVBJLCBhbiB1cGdyYWRlIGlzIHJlY29tbWVuZGVkXG4iCj4gKwkgICAgaWYgJHZlcnNp b24gIT0gQVBJVkVSOwo+ICsgICAgfQo+ICsKPiArICAgIHJldHVybjsKPiArfQo+ICsKPiArIyBO T1RFOiBUaGlzIGlzICpub3QqIGxpa2UgRXhwb3J0ZXIncyBpbXBvcnQgKHRoYXQgeW91IGdldCB3 aXRoIGUuZy4gYHVzZSBwYXJlbnQgcXcoRXhwb3J0ZXIpO2ApCj4gKyMgd2hpY2ggc3VwcG9ydHMg QEVYUE9SVF9PSyBldGMuCj4gKyMKPiArIyBJZiB0aGVyZSBpcyBldmVyIGEgbmVlZCB0byBzdXBw b3J0IGV4cG9ydGluZyBzdWJyb3V0aW5lcyAodmlhIGBFeHBvcnRlcmApLAo+ICsjIHNlZSB0aGUg Zm9sbG93aW5nOiBodHRwczovL3Blcmxkb2MucGVybC5vcmcvRXhwb3J0ZXIjRXhwb3J0aW5nLVdp dGhvdXQtVXNpbmctRXhwb3J0ZXIncy1pbXBvcnQtTWV0aG9kCj4gKyMgQmV3YXJlIHRoYXQgdGhp cyByZXF1aXJlcyB5b3UgdG8gcmVtb3ZlIGFueSBrZXlzIHRoYXQgb3VnaHQgbm90IGJlIHBhc3Nl ZAo+ICsjIHRvIGV4cG9ydGVyIGZyb20gQF8uCj4gKwo+ICtzdWIgaW1wb3J0IHsKPiArICAgIG15 ICgkcGFja2FnZSwgJXBhcmFtcykgPSBAXzsKPiArCj4gKyAgICAjIHRoaXMgc3ViIG1heSBiZSBj YWxsZWQgbW9yZSB0aGFuIG9uY2UsIHNvIGF2b2lkIHJlZ2lzdGVyaW5nIHBsdWdpbnMgYWdhaW4K PiArICAgIGlmICgkcGx1Z2luX3JlZ2lzdGVyX3N0YXRlLT57cGx1Z2luc19pbml0aWFsaXNlZH0g PT0gMSkgewo+ICsJcmV0dXJuOwo+ICsgICAgfQo+ICsKPiArICAgIHRyeV9sb2FkX3BsdWdpbnMo KTsKPiArICAgIHByZV9yZWdpc3Rlcl9jaGVja19wbHVnaW5zKCk7Cj4gKyAgICB0cnlfcmVnaXN0 ZXJfcGx1Z2lucygpOwo+ICsgICAgcG9zdF9yZWdpc3Rlcl9jaGVja19wbHVnaW5zKCk7Cj4gKwo+ ICsgICAgUFZFOjpTdG9yYWdlOjpQbHVnaW4tPmluaXQoKTsKPiArICAgICRwbHVnaW5fcmVnaXN0 ZXJfc3RhdGUtPntwbHVnaW5zX2luaXRpYWxpc2VkfSA9IDE7Cj4gKwo+ICsgICAgcmV0dXJuOwo+ ICt9Cj4gKwo+ICAjICBQVkU6OlN0b3JhZ2UgdXRpbGl0eSBmdW5jdGlvbnMKPiAgCj4gIHN1YiBj b25maWcgewo+IC0tIAo+IDIuMzkuNQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCnB2ZS1kZXZlbCBtYWlsaW5nIGxpc3QKcHZlLWRldmVsQGxpc3RzLnBy b3htb3guY29tCmh0dHBzOi8vbGlzdHMucHJveG1veC5jb20vY2dpLWJpbi9tYWlsbWFuL2xpc3Rp bmZvL3B2ZS1kZXZlbAo=