From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 1163E1FF187 for ; Mon, 28 Jul 2025 16:24:32 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 824FD357CA; Mon, 28 Jul 2025 16:25:54 +0200 (CEST) Mime-Version: 1.0 Date: Mon, 28 Jul 2025 16:25:15 +0200 Message-Id: To: "Proxmox VE development discussion" Cc: "pve-devel" From: "Lukas Wagner" X-Mailer: aerc 0.20.1-0-g2ecb8770224a References: <20250726010626.1496866-1-a.lauterer@proxmox.com> <20250726010626.1496866-2-a.lauterer@proxmox.com> In-Reply-To: <20250726010626.1496866-2-a.lauterer@proxmox.com> X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1753712707627 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.018 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 Subject: Re: [pve-devel] [PATCH proxmox-rrd-migration-tool v4 1/3] create proxmox-rrd-migration-tool 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 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" SGV5IEFhcm9uLAoKc29tZSBjb21tZW50cyBpbmxpbmUuCgoKT24gU2F0IEp1bCAyNiwgMjAyNSBh dCAzOjA1IEFNIENFU1QsIEFhcm9uIExhdXRlcmVyIHdyb3RlOgo+IFRoaXMgdG9vbCBpcyBpbnRl bmRlZCB0byBtaWdyYXRlIHRoZSBQcm94bW94IFZFIChQVkUpIFJSRCBkYXRhIGZpbGVzIHRvCj4g dGhlIG5ldyBzY2hlbWEuCj4KPiBVcCB1bnRpbCBQVkU4IHRoZSBzY2hlbWEgaGFzIGJlZW4gdGhl IHNhbWUgZm9yIGEgbG9uZyB0aW1lLiBXaXRoIFBWRTkgd2UKPiBpbnRyb2R1Y2VkIG5ldyBjb2x1 bW5zIHRvIGd1ZXN0cyAodm0pIGFuZCBub2Rlcy4gV2UgYWxzbyBzd2l0Y2hlZCBhbGwKPiB0eXBl cyAodm0sIG5vZGUsIHN0b3JhdGUpIHRvIHRoZSBzYW1lIGFnZ3JlZ2F0aW9uIHNjaGVtYXMgYXMg d2UgZG8gaXQgaW4KPiBQQlMuCj4gVGhlIHJlc3VsdCBvZiBib3RoIGFyZSBhIG11Y2ggZmluZXIg cmVzb2x1dGlvbiBmb3IgbG9uZyB0aW1lIHNwYW5zLCBidXQKPiBhbHNvIGxhcmdlciBSUkQgZmls ZXMuCj4KPiAqIG5vZGU6IDc5SyAtPiAxLjRNCj4gKiB2bTogNjZLIC0+IDEuM20KPiAqIHN0b3Jh Z2U6IDE0SyAtPiAxNTZLCj4KPiBUaGUgb2xkIGRpcmVjdG9yaWVzIGZvciBWTXMgdXNlZCB0byBi ZSBpbiBgL3Zhci9saWIvcnJkY2FjaGVkL2RiL2Agd2l0aAo+IHRoZSBmb2xsb3dpbmcgc3ViIGRp cmVjdG9yaWVzOgo+Cj4gKiBub2RlczogYHB2ZTItbm9kZWAKPiAqIGd1ZXN0cyAoVk0vQ1QpOiBg cHZlMi12bWAKPiAqIHN0b3JhZ2U6IGBwdmUyLXN0b3JhZ2VgCj4KPiBXaXRoIHRoaXMgY2hhbmdl IHdlIGFsc28gaW50cm9kdWNlIGEgbmV3IGtleSBzY2hlbWEsIHRoYXQgbWFrZXMgaXQKPiBlYXNp ZXIgaW4gdGhlIGZ1dHVyZSB0byBpbnRyb2R1Y2UgbmV3IG9uZXMuIEluc3RlYWQgb2YgdGhlCj4g YHB2ZXt2ZXJzaW9ufS17dHlwZX1gIHdlIGFyZSBzd2l0Y2hpbmcgdG8gYHB2ZS17dHlwZX0te3Zl cnNpb259YC4KPgo+IFRoaXMgZW5hYmxlcyB1cyB0byBhZGQgbmV3IGNvbHVtbnMgd2l0aCBhIG5l dyB2ZXJzaW9uLCB3aXRob3V0IGJyZWFraW5nCj4gbm9kZXMgdGhhdCBhcmUgbm90IHlldCB1cGRh dGVkLiBXZSBhcmUgTk9UIGFsbG93ZWQgdG8gcmVtb3ZlIG9yIHJlLXVzZQo+IGV4aXN0aW5nIGNv bHVtbnMuIFRoYXQgd291bGQgYmUgYSBicmVha2luZyBjaGFuZ2UuCj4gV2UgYXJlIGN1cnJlbnRs eSBhdCB2ZXJzaW9uIDkuMC4gQnV0IGluIHRoZSBmdXR1cmUsIGlmIG5lZWRlZCwgdGhpcyB0b29s Cj4gY2FuIGJlIGFkYXB0ZWQgdG8gZG8gb3RoZXIgbWlncmF0aW9ucyB0b28uCj4gRm9yIGV4YW1w bGUsIHtvbGQsIDkuMH0gLT4gOS4yLCBzaG91bGQgdGhhdCBiZSBuZWNlc3NhcnkuCj4KPiBUaGUg YWN0dWFsIG1pZ3JhdGlvbiBpcyBoYW5kbGVkIGJ5IGBsaWJycmRgIHRvIHdoaWNoIHdlIHBhc3Mg dGhlIHBhdGggdG8KPiB0aGUgb2xkIGFuZCBuZXcgZmlsZXMsIGFuZCB0aGUgbmV3IFJSRCBkZWZp bml0aW9ucy4gVGhlIGBycmRfY3JlYXRlX3IyYAo+IGNhbGwgdGhlbiBkb2VzIHRoZSBoYXJkIHdv cmsgb2YgbWlncmF0aW5nIGFuZCBjb252ZXJ0aW5nIGV4aXNpdGluZyBkYXRhCj4gaW50byB0aGUg bmV3IGZpbGUgYW5kIGFnZ3JlZ2F0aW9uIHNjaGVtYS4KPgo+IFRoaXMgY2FuIHRha2Ugc29tZSB0 aW1lLiBRdWljayB0ZXN0cyBvbiBhIFJ5emVuIDc5MDBYIHdpdGggdGhlIGZvbGxvd2luZwo+IGZp bGVzOgo+ICogMSBub2RlIFJSRCBmaWxlCj4gKiAxMGsgdm0gUlJEIGZpbGVzCj4gKiAxIHN0b3Jh Z2UgUlJEIGZpbGUKPgo+IHNob3dlZCB0aGUgZm9sbGluZyByZXN1bHRzOgo+Cj4gKiAxIHRocmVh ZDogIDE3OS42MXMgdXNlciAxNC44MnMgc3lzdGVtIDEwMCUgY3B1IDM6MTQuMTcgdG90YWwKPiAq IDQgdGhyZWFkczogMTg3LjU3cyB1c2VyIDE2Ljk4cyBzeXN0ZW0gMzk5JSBjcHUgNTEuMTk4IHRv dGFsCj4KPiBUaGlzIGlzIHdoeSB3ZSBkbyBub3QgbWlncmF0ZSBpbmxpbmUsIGJ1dCBoYXZlIGl0 IGFzIGEgc2VwYXJhdGUgc3RlcAo+IGR1cmluZyBwYWNrYWdlIHVwZ3JhZGVzLgo+Cj4gQmVoYXZp b3I6IEJ5IGRlZmF1bHQgbm90aGluZyB3aWxsIGJlIGNoYW5nZWQgYW5kIGEgZHJ5IG9yIHRlc3Qg cnVuIHdpbGwKPiBoYXBwZW4uCj4gT25seSBpZiB0aGUgYC0tbWlncmF0ZWAgcGFyYW1ldGVyIGlz IGFkZGVkIHdpbGwgdGhlIGFjdHVhbCBtaWdyYXRpb24gYmUKPiBkb25lLgo+Cj4gRm9yIGVhY2gg Zm91bmQgUlJEIHNvdXJjZSBmaWxlLCB0aGUgdG9vbCBjaGVja3MgaWYgYSBtYXRjaGluZyB0YXJn ZXQKPiBmaWxlIGFscmVhZHkgZXhpc3RzLiBCeSBkZWZhdWx0LCB0aG9zZSB3aWxsIGJlIHNraXBw ZWQgdG8gbm90IG92ZXJ3cml0ZQo+IHRhcmdldCBmaWxlcyB0aGF0IG1pZ2h0IGFscmVhZHkgc3Rv cmUgbmV3ZXIgZGF0YS4KPiBXaXRoIHRoZSBgLS1mb3JjZWAgcGFyYW1ldGVyIHRoaXMgY2FuIGJl IGNoYW5nZWQuCj4KPiBUaGF0IG1lYW5zLCBvbmUgY2FuIHJ1biB0aGUgdG9vbCBtdWx0aXBsZSB0 aW1lcyAod2l0aG91dCAtLWZvcmNlKSBhbmQgaXQKPiB3aWxsIHBpY2sgdXAgd2hlcmUgaXQgbWln aHQgaGF2ZSBsZWZ0IG9mZi4gRm9yIGV4YW1wbGUgaXQgdGhlIG1pZ3JhdGlvbgo+IHdhcyBpbnRl cnJ1cHRlZCBmb3Igc29tZSByZWFzb24uCj4KPiBPbmNlIGEgc291cmNlIGZpbGUgaGFzIGJlZW4g cHJvY2Vzc2VkIGl0IHdpbGwgYmUgcmVuYW1lZCB3aXRoIHRoZSBgLm9sZGAKPiBhcHBlbmRpeC4g SXQgd2lsbCBiZSBleGNsdWRlZCBmcm9tIGZ1dHVyZSBydW5zIGFzIHdlIGNoZWNrIGZvciBmaWxl cwo+IHdpdGhvdXQgYW4gZXh0ZW5zaW9uLgo+Cj4gVGhlIHRvb2wgaGFzIHNvbWUgc2ltcGxlIGhl dXJpc3RpYyB0byBkZXRlcm1pbmUgaG93IG1hbnkgdGhyZWFkcyBzaG91bGQKPiBiZSB1c2VkLiBC ZSBkZWZhdWx0IHRoZSByYW5nZSBpcyBiZXR3ZWVuIDEgdG8gNCB0aHJlYWRzLiBCdXQgdGhlCj4g YC0tdGhyZWFkc2AgcGFyYW1ldGVyIGFsbG93cyBhIG1hbnVhbCBvdmVycmlkZS4KPgo+IFNpZ25l ZC1vZmYtYnk6IEFhcm9uIExhdXRlcmVyIDxhLmxhdXRlcmVyQHByb3htb3guY29tPgo+IC0tLQo+ ICAuY2FyZ28vY29uZmlnLnRvbWwgICAgICB8ICAgNSArCj4gIC5naXRpZ25vcmUgICAgICAgICAg ICAgIHwgICA5ICsKPiAgQ2FyZ28udG9tbCAgICAgICAgICAgICAgfCAgMjAgKysKPiAgYnVpbGQu cnMgICAgICAgICAgICAgICAgfCAgMjkgKysKPiAgc3JjL2xpYi5ycyAgICAgICAgICAgICAgfCAg IDUgKwo+ICBzcmMvbWFpbi5ycyAgICAgICAgICAgICB8IDU2NyArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrCj4gIHNyYy9wYXJhbGxlbF9oYW5kbGVyLnJzIHwgMTYwICsr KysrKysrKysrKwo+ICB3cmFwcGVyLmggICAgICAgICAgICAgICB8ICAgMSArCj4gIDggZmlsZXMg Y2hhbmdlZCwgNzk2IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IC5jYXJnby9j b25maWcudG9tbAo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgLmdpdGlnbm9yZQo+ICBjcmVhdGUgbW9k ZSAxMDA2NDQgQ2FyZ28udG9tbAo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYnVpbGQucnMKPiAgY3Jl YXRlIG1vZGUgMTAwNjQ0IHNyYy9saWIucnMKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9tYWlu LnJzCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvcGFyYWxsZWxfaGFuZGxlci5ycwo+ICBjcmVh dGUgbW9kZSAxMDA2NDQgd3JhcHBlci5oCj4KPiBkaWZmIC0tZ2l0IGEvLmNhcmdvL2NvbmZpZy50 b21sIGIvLmNhcmdvL2NvbmZpZy50b21sCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAw MDAwMDAwLi4zYjViNmU0Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiLy5jYXJnby9jb25maWcudG9t bAo+IEBAIC0wLDAgKzEsNSBAQAo+ICtbc291cmNlXQo+ICtbc291cmNlLmRlYmlhbi1wYWNrYWdl c10KPiArZGlyZWN0b3J5ID0gIi91c3Ivc2hhcmUvY2FyZ28vcmVnaXN0cnkiCj4gK1tzb3VyY2Uu Y3JhdGVzLWlvXQo+ICtyZXBsYWNlLXdpdGggPSAiZGViaWFuLXBhY2thZ2VzIgo+IGRpZmYgLS1n aXQgYS8uZ2l0aWdub3JlIGIvLmdpdGlnbm9yZQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5k ZXggMDAwMDAwMC4uMDZhYzFhMQo+IC0tLSAvZGV2L251bGwKPiArKysgYi8uZ2l0aWdub3JlCj4g QEAgLTAsMCArMSw5IEBACj4gKyouYnVpbGQKPiArKi5idWlsZGluZm8KPiArKi5jaGFuZ2VzCj4g KyouZGViCj4gKyouZHNjCj4gKyoudGFyKgo+ICt0YXJnZXQvCj4gKy9DYXJnby5sb2NrCj4gKy9w cm94bW94LXJyZC1taWdyYXRpb24tdG9vbC1bMC05XSovCj4gZGlmZiAtLWdpdCBhL0NhcmdvLnRv bWwgYi9DYXJnby50b21sCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi5k MzUyM2YzCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL0NhcmdvLnRvbWwKPiBAQCAtMCwwICsxLDIw IEBACj4gK1twYWNrYWdlXQo+ICtuYW1lID0gInByb3htb3hfcnJkX21pZ3JhdGlvbl84LTkiCj4g K3ZlcnNpb24gPSAiMC4xLjAiCj4gK2VkaXRpb24gPSAiMjAyMSIKPiArYXV0aG9ycyA9IFsKPiAr ICAgICJBYXJvbiBMYXV0ZXJlciA8YS5sYXV0ZXJlckBwcm94bW94LmNvbT4iLAo+ICsgICAgIlBy b3htb3ggU3VwcG9ydCBUZWFtIDxzdXBwb3J0QHByb3htb3guY29tPiIsCj4gK10KPiArbGljZW5z ZSA9ICJBR1BMLTMiCj4gK2hvbWVwYWdlID0gImh0dHBzOi8vd3d3LnByb3htb3guY29tIgo+ICsK PiArW2RlcGVuZGVuY2llc10KPiArYW55aG93ID0gIjEuMC44NiIKPiArcGljby1hcmdzID0gIjAu NS4wIgo+ICtwcm94bW94LWFzeW5jID0gIjAuNCIKPiArY3Jvc3NiZWFtLWNoYW5uZWwgPSAiMC41 Igo+ICsKPiArW2J1aWxkLWRlcGVuZGVuY2llc10KPiArYmluZGdlbiA9ICIwLjY2LjEiCj4gK3Br Zy1jb25maWcgPSAiMC4zIgo+IGRpZmYgLS1naXQgYS9idWlsZC5ycyBiL2J1aWxkLnJzCj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi41NmQwN2NjCj4gLS0tIC9kZXYvbnVs bAo+ICsrKyBiL2J1aWxkLnJzCj4gQEAgLTAsMCArMSwyOSBAQAo+ICt1c2Ugc3RkOjplbnY7Cj4g K3VzZSBzdGQ6OnBhdGg6OlBhdGhCdWY7Cj4gKwo+ICtmbiBtYWluKCkgewo+ICsgICAgcHJpbnRs biEoImNhcmdvOnJ1c3RjLWxpbmstbGliPXJyZCIpOwo+ICsKPiArICAgIHByaW50bG4hKCJjYXJn bzpyZXJ1bi1pZi1jaGFuZ2VkPXdyYXBwZXIuaCIpOwo+ICsgICAgLy8gVGhlIGJpbmRnZW46OkJ1 aWxkZXIgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQKPiArICAgIC8vIHRvIGJpbmRnZW4sIGFuZCBs ZXRzIHlvdSBidWlsZCB1cCBvcHRpb25zIGZvcgo+ICsgICAgLy8gdGhlIHJlc3VsdGluZyBiaW5k aW5ncy4KPiArCj4gKyAgICBsZXQgYmluZGluZ3MgPSBiaW5kZ2VuOjpCdWlsZGVyOjpkZWZhdWx0 KCkKPiArICAgICAgICAvLyBUaGUgaW5wdXQgaGVhZGVyIHdlIHdvdWxkIGxpa2UgdG8gZ2VuZXJh dGUKPiArICAgICAgICAvLyBiaW5kaW5ncyBmb3IuCj4gKyAgICAgICAgLmhlYWRlcigid3JhcHBl ci5oIikKPiArICAgICAgICAvLyBUZWxsIGNhcmdvIHRvIGludmFsaWRhdGUgdGhlIGJ1aWx0IGNy YXRlIHdoZW5ldmVyIGFueSBvZiB0aGUKPiArICAgICAgICAvLyBpbmNsdWRlZCBoZWFkZXIgZmls ZXMgY2hhbmdlZC4KPiArICAgICAgICAucGFyc2VfY2FsbGJhY2tzKEJveDo6bmV3KGJpbmRnZW46 OkNhcmdvQ2FsbGJhY2tzKSkKPiArICAgICAgICAvLyBGaW5pc2ggdGhlIGJ1aWxkZXIgYW5kIGdl bmVyYXRlIHRoZSBiaW5kaW5ncy4KPiArICAgICAgICAuZ2VuZXJhdGUoKQo+ICsgICAgICAgIC8v IFVud3JhcCB0aGUgUmVzdWx0IGFuZCBwYW5pYyBvbiBmYWlsdXJlLgo+ICsgICAgICAgIC5leHBl Y3QoIlVuYWJsZSB0byBnZW5lcmF0ZSBiaW5kaW5ncyIpOwo+ICsKPiArICAgIC8vIFdyaXRlIHRo ZSBiaW5kaW5ncyB0byB0aGUgJE9VVF9ESVIvYmluZGluZ3MucnMgZmlsZS4KPiArICAgIGxldCBv dXRfcGF0aCA9IFBhdGhCdWY6OmZyb20oZW52Ojp2YXIoIk9VVF9ESVIiKS51bndyYXAoKSk7Cj4g KyAgICBiaW5kaW5ncwo+ICsgICAgICAgIC53cml0ZV90b19maWxlKG91dF9wYXRoLmpvaW4oImJp bmRpbmdzLnJzIikpCj4gKyAgICAgICAgLmV4cGVjdCgiQ291bGRuJ3Qgd3JpdGUgYmluZGluZ3Mh Iik7Cj4gK30KPiBkaWZmIC0tZ2l0IGEvc3JjL2xpYi5ycyBiL3NyYy9saWIucnMKPiBuZXcgZmls ZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmEzOGExM2EKPiAtLS0gL2Rldi9udWxsCj4g KysrIGIvc3JjL2xpYi5ycwo+IEBAIC0wLDAgKzEsNSBAQAo+ICsjIVthbGxvdyhub25fdXBwZXJf Y2FzZV9nbG9iYWxzKV0KPiArIyFbYWxsb3cobm9uX2NhbWVsX2Nhc2VfdHlwZXMpXQo+ICsjIVth bGxvdyhub25fc25ha2VfY2FzZSldCj4gKwo+ICtpbmNsdWRlIShjb25jYXQhKGVudiEoIk9VVF9E SVIiKSwgIi9iaW5kaW5ncy5ycyIpKTsKPiBkaWZmIC0tZ2l0IGEvc3JjL21haW4ucnMgYi9zcmMv bWFpbi5ycwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNWU2NDE4Ywo+ IC0tLSAvZGV2L251bGwKPiArKysgYi9zcmMvbWFpbi5ycwo+IEBAIC0wLDAgKzEsNTY3IEBACj4g K3VzZSBhbnlob3c6OntiYWlsLCBFcnJvciwgUmVzdWx0fTsKPiArdXNlIHN0ZDo6ewo+ICsgICAg ZmZpOjp7Q1N0ciwgQ1N0cmluZywgT3NTdHJpbmd9LAo+ICsgICAgZnMsCj4gKyAgICBvczo6dW5p eDo6e2ZmaTo6T3NTdHJFeHQsIGZzOjpQZXJtaXNzaW9uc0V4dH0sCj4gKyAgICBwYXRoOjp7UGF0 aCwgUGF0aEJ1Zn0sCj4gKyAgICBzeW5jOjpBcmMsCj4gK307Cj4gKwo+ICt1c2UgcHJveG1veF9y cmRfbWlncmF0aW9uX3Rvb2w6OntycmRfY2xlYXJfZXJyb3IsIHJyZF9jcmVhdGVfcjIsIHJyZF9n ZXRfY29udGV4dCwgcnJkX2dldF9lcnJvcn07Cj4gKwo+ICt1c2UgY3JhdGU6OnBhcmFsbGVsX2hh bmRsZXI6OlBhcmFsbGVsSGFuZGxlcjsKPiArCj4gK3B1YiBtb2QgcGFyYWxsZWxfaGFuZGxlcjsK PiArCj4gK2NvbnN0IEJBU0VfRElSOiAmc3RyID0gIi92YXIvbGliL3JyZGNhY2hlZC9kYiI7Cj4g K2NvbnN0IFNPVVJDRV9TVUJESVJfTk9ERTogJnN0ciA9ICJwdmUyLW5vZGUiOwo+ICtjb25zdCBT T1VSQ0VfU1VCRElSX0dVRVNUOiAmc3RyID0gInB2ZTItdm0iOwo+ICtjb25zdCBTT1VSQ0VfU1VC RElSX1NUT1JBR0U6ICZzdHIgPSAicHZlMi1zdG9yYWdlIjsKPiArY29uc3QgVEFSR0VUX1NVQkRJ Ul9OT0RFOiAmc3RyID0gInB2ZS1ub2RlLTkuMCI7Cj4gK2NvbnN0IFRBUkdFVF9TVUJESVJfR1VF U1Q6ICZzdHIgPSAicHZlLXZtLTkuMCI7Cj4gK2NvbnN0IFRBUkdFVF9TVUJESVJfU1RPUkFHRTog JnN0ciA9ICJwdmUtc3RvcmFnZS05LjAiOwo+ICtjb25zdCBSRVNPVVJDRV9CQVNFX0RJUjogJnN0 ciA9ICIvZXRjL3B2ZSI7Cj4gK2NvbnN0IE1BWF9USFJFQURTOiB1c2l6ZSA9IDQ7Cj4gK2NvbnN0 IFJSRF9TVEVQX1NJWkU6IHVzaXplID0gNjA7Cj4gKwo+ICt0eXBlIEZpbGUgPSAoQ1N0cmluZywg T3NTdHJpbmcpOwoKTWF5YmUgdXNlIHNvbWUgZGlmZmVyZW50IG5hbWUgaGVyZSBpbiBvcmRlciB0 byBhdm9pZCBjb25mdXNpb24gd2l0aApzdGQ6OmZzOjpGaWxlPyBlLmcuIFJSREZpbGUKCj4gKwo+ ICsvLyBSUkFzIGFyZSBkZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5Ogo+ICsvLwo+ICsvLyBS UkE6Q0Y6eGZmOnN0ZXA6cm93cwo+ICsvLyBDRjogQVZFUkFHRSBvciBNQVgKPiArLy8geGZmOiAw LjUKPiArLy8gc3RlcHM6IHN0ZXBzaXplIGlzIGRlZmluZWQgb24gcnJkIGZpbGUgY3JlYXRpb24h IGV4YW1wbGU6IHdpdGggNjAgc2Vjb25kcyBzdGVwIHNpemU6Cj4gKy8vCWUuZy4gMSA9PiA2MCBz ZWMsIDMwID0+IDE4MDAgc2Vjb25kcyBvciAzMCBtaW4KPiArLy8gcm93czogaG93IG1hbnkgYWdn cmVnYXRlZCByb3dzIGFyZSBrZXB0LCBhcyBpbiBob3cgZmFyIGJhY2sgaW4gdGltZSB3ZSBzdG9y ZSBkYXRhCj4gKy8vCj4gKy8vIGhvdyBtYW55IHNlY29uZHMgYXJlIGFnZ3JlZ2F0ZWQgcGVyIFJS QTogc3RlcHMgKiBzdGVwc2l6ZSAqIHJvd3MKPiArLy8gaG93IG1hbnkgaG91cnMgYXJlIGFnZ3Jl Z2F0ZWQgcGVyIFJSQTogc3RlcHMgKiBzdGVwc2l6ZSAqIHJvd3MgLyAzNjAwCj4gKy8vIGhvdyBt YW55IGRheXMgYXJlIGFnZ3JlZ2F0ZWQgcGVyIFJSQTogc3RlcHMgKiBzdGVwc2l6ZSAqIHJvd3Mg LyAzNjAwIC8gMjQKPiArLy8gaHR0cHM6Ly9vc3Mub2V0aWtlci5jaC9ycmR0b29sL3R1dC9ycmQt YmVnaW5uZXJzLmVuLmh0bWwjVW5kZXJzdGFuZGluZ19ieV9hbl9leGFtcGxlCj4gKwo+ICtjb25z dCBSUkRfVk1fREVGOiBbJkNTdHI7IDI1XSA9IFsKPiArICAgIGMiRFM6bWF4Y3B1OkdBVUdFOjEy MDowOlUiLAo+ICsgICAgYyJEUzpjcHU6R0FVR0U6MTIwOjA6VSIsCj4gKyAgICBjIkRTOm1heG1l bTpHQVVHRToxMjA6MDpVIiwKPiArICAgIGMiRFM6bWVtOkdBVUdFOjEyMDowOlUiLAo+ICsgICAg YyJEUzptYXhkaXNrOkdBVUdFOjEyMDowOlUiLAo+ICsgICAgYyJEUzpkaXNrOkdBVUdFOjEyMDow OlUiLAo+ICsgICAgYyJEUzpuZXRpbjpERVJJVkU6MTIwOjA6VSIsCj4gKyAgICBjIkRTOm5ldG91 dDpERVJJVkU6MTIwOjA6VSIsCj4gKyAgICBjIkRTOmRpc2tyZWFkOkRFUklWRToxMjA6MDpVIiwK PiArICAgIGMiRFM6ZGlza3dyaXRlOkRFUklWRToxMjA6MDpVIiwKPiArICAgIGMiRFM6bWVtaG9z dDpHQVVHRToxMjA6MDpVIiwKPiArICAgIGMiRFM6cHJlc3N1cmVjcHVzb21lOkdBVUdFOjEyMDow OlUiLAo+ICsgICAgYyJEUzpwcmVzc3VyZWNwdWZ1bGw6R0FVR0U6MTIwOjA6VSIsCj4gKyAgICBj IkRTOnByZXNzdXJlaW9zb21lOkdBVUdFOjEyMDowOlUiLAo+ICsgICAgYyJEUzpwcmVzc3VyZWlv ZnVsbDpHQVVHRToxMjA6MDpVIiwKPiArICAgIGMiRFM6cHJlc3N1cmVtZW1vcnlzb21lOkdBVUdF OjEyMDowOlUiLAo+ICsgICAgYyJEUzpwcmVzc3VyZW1lbW9yeWZ1bGw6R0FVR0U6MTIwOjA6VSIs Cj4gKyAgICBjIlJSQTpBVkVSQUdFOjAuNToxOjE0NDAiLCAgICAvLyAxIG1pbiAqIDE0NDAgPT4g MSBkYXkKPiArICAgIGMiUlJBOkFWRVJBR0U6MC41OjMwOjE0NDAiLCAgIC8vIDMwIG1pbiAqIDE0 NDAgPT4gMzAgZGF5Cj4gKyAgICBjIlJSQTpBVkVSQUdFOjAuNTozNjA6MTQ0MCIsICAvLyA2IGhv dXJzICogMTQ0MCA9PiAzNjAgZGF5IH4xIHllYXIKPiArICAgIGMiUlJBOkFWRVJBR0U6MC41OjEw MDgwOjU3MCIsIC8vIDEgd2VlayAqIDU3MCA9PiB+MTAgeWVhcnMKPiArICAgIGMiUlJBOk1BWDow LjU6MToxNDQwIiwgICAgICAgIC8vIDEgbWluICogMTQ0MCA9PiAxIGRheQo+ICsgICAgYyJSUkE6 TUFYOjAuNTozMDoxNDQwIiwgICAgICAgLy8gMzAgbWluICogMTQ0MCA9PiAzMCBkYXkKPiArICAg IGMiUlJBOk1BWDowLjU6MzYwOjE0NDAiLCAgICAgIC8vIDYgaG91cnMgKiAxNDQwID0+IDM2MCBk YXkgfjEgeWVhcgo+ICsgICAgYyJSUkE6TUFYOjAuNToxMDA4MDo1NzAiLCAgICAgLy8gMSB3ZWVr ICogNTcwID0+IH4xMCB5ZWFycwo+ICtdOwo+ICsKPiArY29uc3QgUlJEX05PREVfREVGOiBbJkNT dHI7IDI3XSA9IFsKPiArICAgIGMiRFM6bG9hZGF2ZzpHQVVHRToxMjA6MDpVIiwKPiArICAgIGMi RFM6bWF4Y3B1OkdBVUdFOjEyMDowOlUiLAo+ICsgICAgYyJEUzpjcHU6R0FVR0U6MTIwOjA6VSIs Cj4gKyAgICBjIkRTOmlvd2FpdDpHQVVHRToxMjA6MDpVIiwKPiArICAgIGMiRFM6bWVtdG90YWw6 R0FVR0U6MTIwOjA6VSIsCj4gKyAgICBjIkRTOm1lbXVzZWQ6R0FVR0U6MTIwOjA6VSIsCj4gKyAg ICBjIkRTOnN3YXB0b3RhbDpHQVVHRToxMjA6MDpVIiwKPiArICAgIGMiRFM6c3dhcHVzZWQ6R0FV R0U6MTIwOjA6VSIsCj4gKyAgICBjIkRTOnJvb3R0b3RhbDpHQVVHRToxMjA6MDpVIiwKPiArICAg IGMiRFM6cm9vdHVzZWQ6R0FVR0U6MTIwOjA6VSIsCj4gKyAgICBjIkRTOm5ldGluOkRFUklWRTox MjA6MDpVIiwKPiArICAgIGMiRFM6bmV0b3V0OkRFUklWRToxMjA6MDpVIiwKPiArICAgIGMiRFM6 bWVtZnJlZTpHQVVHRToxMjA6MDpVIiwKPiArICAgIGMiRFM6YXJjc2l6ZTpHQVVHRToxMjA6MDpV IiwKPiArICAgIGMiRFM6cHJlc3N1cmVjcHVzb21lOkdBVUdFOjEyMDowOlUiLAo+ICsgICAgYyJE UzpwcmVzc3VyZWlvc29tZTpHQVVHRToxMjA6MDpVIiwKPiArICAgIGMiRFM6cHJlc3N1cmVpb2Z1 bGw6R0FVR0U6MTIwOjA6VSIsCj4gKyAgICBjIkRTOnByZXNzdXJlbWVtb3J5c29tZTpHQVVHRTox MjA6MDpVIiwKPiArICAgIGMiRFM6cHJlc3N1cmVtZW1vcnlmdWxsOkdBVUdFOjEyMDowOlUiLAo+ ICsgICAgYyJSUkE6QVZFUkFHRTowLjU6MToxNDQwIiwgICAgLy8gMSBtaW4gKiAxNDQwID0+IDEg ZGF5Cj4gKyAgICBjIlJSQTpBVkVSQUdFOjAuNTozMDoxNDQwIiwgICAvLyAzMCBtaW4gKiAxNDQw ID0+IDMwIGRheQo+ICsgICAgYyJSUkE6QVZFUkFHRTowLjU6MzYwOjE0NDAiLCAgLy8gNiBob3Vy cyAqIDE0NDAgPT4gMzYwIGRheSB+MSB5ZWFyCj4gKyAgICBjIlJSQTpBVkVSQUdFOjAuNToxMDA4 MDo1NzAiLCAvLyAxIHdlZWsgKiA1NzAgPT4gfjEwIHllYXJzCj4gKyAgICBjIlJSQTpNQVg6MC41 OjE6MTQ0MCIsICAgICAgICAvLyAxIG1pbiAqIDE0NDAgPT4gMSBkYXkKPiArICAgIGMiUlJBOk1B WDowLjU6MzA6MTQ0MCIsICAgICAgIC8vIDMwIG1pbiAqIDE0NDAgPT4gMzAgZGF5Cj4gKyAgICBj IlJSQTpNQVg6MC41OjM2MDoxNDQwIiwgICAgICAvLyA2IGhvdXJzICogMTQ0MCA9PiAzNjAgZGF5 IH4xIHllYXIKPiArICAgIGMiUlJBOk1BWDowLjU6MTAwODA6NTcwIiwgICAgIC8vIDEgd2VlayAq IDU3MCA9PiB+MTAgeWVhcnMKPiArXTsKPiArCj4gK2NvbnN0IFJSRF9TVE9SQUdFX0RFRjogWyZD U3RyOyAxMF0gPSBbCj4gKyAgICBjIkRTOnRvdGFsOkdBVUdFOjEyMDowOlUiLAo+ICsgICAgYyJE Uzp1c2VkOkdBVUdFOjEyMDowOlUiLAo+ICsgICAgYyJSUkE6QVZFUkFHRTowLjU6MToxNDQwIiwg ICAgLy8gMSBtaW4gKiAxNDQwID0+IDEgZGF5Cj4gKyAgICBjIlJSQTpBVkVSQUdFOjAuNTozMDox NDQwIiwgICAvLyAzMCBtaW4gKiAxNDQwID0+IDMwIGRheQo+ICsgICAgYyJSUkE6QVZFUkFHRTow LjU6MzYwOjE0NDAiLCAgLy8gNiBob3VycyAqIDE0NDAgPT4gMzYwIGRheSB+MSB5ZWFyCj4gKyAg ICBjIlJSQTpBVkVSQUdFOjAuNToxMDA4MDo1NzAiLCAvLyAxIHdlZWsgKiA1NzAgPT4gfjEwIHll YXJzCj4gKyAgICBjIlJSQTpNQVg6MC41OjE6MTQ0MCIsICAgICAgICAvLyAxIG1pbiAqIDE0NDAg PT4gMSBkYXkKPiArICAgIGMiUlJBOk1BWDowLjU6MzA6MTQ0MCIsICAgICAgIC8vIDMwIG1pbiAq IDE0NDAgPT4gMzAgZGF5Cj4gKyAgICBjIlJSQTpNQVg6MC41OjM2MDoxNDQwIiwgICAgICAvLyA2 IGhvdXJzICogMTQ0MCA9PiAzNjAgZGF5IH4xIHllYXIKPiArICAgIGMiUlJBOk1BWDowLjU6MTAw ODA6NTcwIiwgICAgIC8vIDEgd2VlayAqIDU3MCA9PiB+MTAgeWVhcnMKPiArXTsKPiArCj4gK2Nv bnN0IEhFTFA6ICZzdHIgPSAiXAo+ICtwcm94bW94LXJyZC1taWdyYXRpb24gdG9vbAo+ICsKPiAr TWlncmF0ZXMgZXhpc3RpbmcgUlJEIGdyYXBoIGRhdGEgdG8gdGhlIG5ldyBmb3JtYXQuCj4gKwo+ ICtVc2UgdGhpcyBvbmx5IGluIHRoZSBwcm9jZXNzIG9mIHVwZ3JhZGluZyBmcm9tIFByb3htb3gg VkUgOCB0byA5IGFjY29yZGluZyB0byB0aGUgdXBncmFkZSBndWlkZSEKPiArCj4gK1VTQUdFOgo+ ICsgICAgcHJveG1veC1ycmQtbWlncmF0aW9uIFtPUFRJT05TXQo+ICsKPiArICAgIEZMQUdTOgo+ ICsgICAgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIFByaW50cyB0aGlzIGhlbHAgaW5mb3Jt YXRpb24KPiArCj4gKyAgICBPUFRJT05TOgo+ICsgICAgICAgIC0tbWlncmF0ZSAgICAgICAgICAg ICAgIFN0YXJ0IHRoZSBtaWdyYXRpb24uIFdpdGhvdXQgaXQsIG9ubHkgYSBkcnkgcnVuIHdpbGwg YmUgZG9uZS4KPiArCj4gKyAgICAgICAgLS1mb3JjZSAgICAgICAgICAgICAgICAgTWlncmF0ZSwg ZXZlbiBpZiB0aGUgdGFyZ2V0IGFscmVhZHkgZXhpc3RzLgo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFRoaXMgd2lsbCBvdmVyd3JpdGUgYW55IG1pZ3JhdGVkIFJSRCBmaWxlcyEK PiArCj4gKyAgICAgICAgLS10aHJlYWRzIFRIUkVBRFMgICAgICAgTnVtYmVyIG9mIHBhcmFsZWxs IHRocmVhZHMuCj4gKwo+ICsgICAgICAgIC0tc291cmNlIDxTT1VSQ0UgRElSPiAgIFNvdXJjZSBi YXNlIGRpcmVjdG9yeS4gTWFpbmx5IGZvciB0ZXN0cyEKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBEZWZhdWx0OiAvdmFyL2xpYi9ycmRjYWNoZWQvZGIKPiArCj4gKyAgICAgICAg LS10YXJnZXQgPFRBUkdFVCBESVI+ICAgVGFyZ2V0IGJhc2UgZGlyZWN0b3J5LiBNYWlubHkgZm9y IHRlc3RzIQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IC92YXIv bGliL3JyZGNhY2hlZC9kYgo+ICsKPiArICAgICAgICAtLXJlc291cmNlcyA8RElSPiAgICAgICBE aXJlY3RvcnkgdGhhdCBjb250YWlucyAudm1saXN0IGFuZCAubWVtYmVyIGZpbGVzLiBNYWlubHkg Zm9yIHRlc3RzIQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IC9l dGMvcHZlCj4gKwo+ICsiOwo+ICsKPiArI1tkZXJpdmUoRGVidWcpXQo+ICtzdHJ1Y3QgQXJncyB7 Cj4gKyAgICBtaWdyYXRlOiBib29sLAo+ICsgICAgZm9yY2U6IGJvb2wsCj4gKyAgICB0aHJlYWRz OiBPcHRpb248dXNpemU+LAo+ICsgICAgc291cmNlOiBPcHRpb248U3RyaW5nPiwKPiArICAgIHRh cmdldDogT3B0aW9uPFN0cmluZz4sCj4gKyAgICByZXNvdXJjZXM6IE9wdGlvbjxTdHJpbmc+LAo+ ICt9Cj4gKwo+ICtmbiBwYXJzZV9hcmdzKCkgLT4gUmVzdWx0PEFyZ3MsIEVycm9yPiB7Cj4gKyAg ICBsZXQgbXV0IHBhcmdzID0gcGljb19hcmdzOjpBcmd1bWVudHM6OmZyb21fZW52KCk7Cj4gKwo+ ICsgICAgLy8gSGVscCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgYW5kIHNob3VsZCBiZSBoYW5kbGVk IHNlcGFyYXRlbHkuCj4gKyAgICBpZiBwYXJncy5jb250YWlucyhbIi1oIiwgIi0taGVscCJdKSB7 Cj4gKyAgICAgICAgcHJpbnQhKCJ7fSIsIEhFTFApOwo+ICsgICAgICAgIHN0ZDo6cHJvY2Vzczo6 ZXhpdCgwKTsKPiArICAgIH0KPiArCj4gKyAgICBsZXQgbXV0IGFyZ3MgPSBBcmdzIHsKPiArICAg ICAgICBtaWdyYXRlOiBmYWxzZSwKPiArICAgICAgICB0aHJlYWRzOiBwYXJncwo+ICsgICAgICAg ICAgICAub3B0X3ZhbHVlX2Zyb21fc3RyKCItLXRocmVhZHMiKQo+ICsgICAgICAgICAgICAuZXhw ZWN0KCJDb3VsZCBub3QgcGFyc2UgLS10aHJlYWRzIHBhcmFtZXRlciIpLAo+ICsgICAgICAgIGZv cmNlOiBmYWxzZSwKPiArICAgICAgICBzb3VyY2U6IHBhcmdzCj4gKyAgICAgICAgICAgIC5vcHRf dmFsdWVfZnJvbV9zdHIoIi0tc291cmNlIikKPiArICAgICAgICAgICAgLmV4cGVjdCgiQ291bGQg bm90IHBhcnNlIC0tc291cmNlIHBhcmFtZXRlciIpLAo+ICsgICAgICAgIHRhcmdldDogcGFyZ3MK PiArICAgICAgICAgICAgLm9wdF92YWx1ZV9mcm9tX3N0cigiLS10YXJnZXQiKQo+ICsgICAgICAg ICAgICAuZXhwZWN0KCJDb3VsZCBub3QgcGFyc2UgLS10YXJnZXQgcGFyYW1ldGVyIiksCj4gKyAg ICAgICAgcmVzb3VyY2VzOiBwYXJncwo+ICsgICAgICAgICAgICAub3B0X3ZhbHVlX2Zyb21fc3Ry KCItLXJlc291cmNlcyIpCj4gKyAgICAgICAgICAgIC5leHBlY3QoIkNvdWxkIG5vdCBwYXJzZSAt LXJlc291cmNlcyBwYXJhbWV0ZXIiKSwKPiArICAgIH07Cj4gKwo+ICsgICAgaWYgcGFyZ3MuY29u dGFpbnMoIi0tbWlncmF0ZSIpIHsKPiArICAgICAgICBhcmdzLm1pZ3JhdGUgPSB0cnVlOwo+ICsg ICAgfQo+ICsgICAgaWYgcGFyZ3MuY29udGFpbnMoIi0tZm9yY2UiKSB7Cj4gKyAgICAgICAgYXJn cy5mb3JjZSA9IHRydWU7Cj4gKyAgICB9Cj4gKwo+ICsgICAgLy8gSXQncyB1cCB0byB0aGUgY2Fs bGVyIHdoYXQgdG8gZG8gd2l0aCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cy4KPiArICAgIGxldCBy ZW1haW5pbmcgPSBwYXJncy5maW5pc2goKTsKPiArICAgIGlmICFyZW1haW5pbmcuaXNfZW1wdHko KSB7Cj4gKyAgICAgICAgYmFpbCEoZm9ybWF0ISgiV2FybmluZzogdW51c2VkIGFyZ3VtZW50cyBs ZWZ0OiB7Oj99IiwgcmVtYWluaW5nKSk7CgpObyBuZWVkIHRvIHVzZSBmb3JtYXQhIGhlcmUsIGJh aWwhIHN1cHBvcnRzIGZvcm1hdHRpbmcgbmF0aXZlbHk6CgoJYmFpbCEoIldhcm5pbmc6IC4uLi4g e3JlbWFpbmluZzo/fSIpOwoKPiArICAgIH0KPiArCj4gKyAgICBPayhhcmdzKQo+ICt9Cj4gKwo+ ICtmbiBtYWluKCkgewo+ICsgICAgbGV0IGFyZ3MgPSBtYXRjaCBwYXJzZV9hcmdzKCkgewo+ICsg ICAgICAgIE9rKHYpID0+IHYsCj4gKyAgICAgICAgRXJyKGUpID0+IHsKPiArICAgICAgICAgICAg ZXByaW50bG4hKCJFcnJvcjoge30uIiwgZSk7Cj4gKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6 ZXhpdCgxKTsKPiArICAgICAgICB9Cj4gKyAgICB9Owo+ICsKPiArICAgIGxldCBzb3VyY2VfYmFz ZV9kaXIgPSBtYXRjaCBhcmdzLnNvdXJjZSB7Cj4gKyAgICAgICAgU29tZShyZWYgdikgPT4gdi5h c19zdHIoKSwKPiArICAgICAgICBOb25lID0+IEJBU0VfRElSLAo+ICsgICAgfTsKCnlvdSBjYW4g dXNlIHRoaXMgaW5zdGVhZCwgaXQncyBzaG9ydGVyIGFuZCBhIGJpdCBuaWNlciB0byByZWFkIElN TzoKICAgICAgIGxldCBzb3VyY2VfYmFzZV9kaXIgPSBhcmdzLnNvdXJjZS5hc19kZXJlZigpLnVu d3JhcF9vcihCQVNFX0RJUik7Cgo+ICsKPiArICAgIGxldCB0YXJnZXRfYmFzZV9kaXIgPSBtYXRj aCBhcmdzLnRhcmdldCB7Cj4gKyAgICAgICAgU29tZShyZWYgdikgPT4gdi5hc19zdHIoKSwKPiAr ICAgICAgICBOb25lID0+IEJBU0VfRElSLAo+ICsgICAgfTsKPiArCj4gKyAgICBsZXQgcmVzb3Vy Y2VfYmFzZV9kaXIgPSBtYXRjaCBhcmdzLnJlc291cmNlcyB7Cj4gKyAgICAgICAgU29tZShyZWYg dikgPT4gdi5hc19zdHIoKSwKPiArICAgICAgICBOb25lID0+IFJFU09VUkNFX0JBU0VfRElSLAo+ ICsgICAgfTsKCnNhbWUgZm9yIHRoZSBwcmV2aW91cyB0d28KCj4gKwo+ICsgICAgbGV0IHNvdXJj ZV9kaXJfZ3Vlc3RzOiBQYXRoQnVmID0gW3NvdXJjZV9iYXNlX2RpciwgU09VUkNFX1NVQkRJUl9H VUVTVF0uaXRlcigpLmNvbGxlY3QoKTsKPiArICAgIGxldCB0YXJnZXRfZGlyX2d1ZXN0czogUGF0 aEJ1ZiA9IFt0YXJnZXRfYmFzZV9kaXIsIFRBUkdFVF9TVUJESVJfR1VFU1RdLml0ZXIoKS5jb2xs ZWN0KCk7Cj4gKyAgICBsZXQgc291cmNlX2Rpcl9ub2RlczogUGF0aEJ1ZiA9IFtzb3VyY2VfYmFz ZV9kaXIsIFNPVVJDRV9TVUJESVJfTk9ERV0uaXRlcigpLmNvbGxlY3QoKTsKPiArICAgIGxldCB0 YXJnZXRfZGlyX25vZGVzOiBQYXRoQnVmID0gW3RhcmdldF9iYXNlX2RpciwgVEFSR0VUX1NVQkRJ Ul9OT0RFXS5pdGVyKCkuY29sbGVjdCgpOwo+ICsgICAgbGV0IHNvdXJjZV9kaXJfc3RvcmFnZTog UGF0aEJ1ZiA9IFtzb3VyY2VfYmFzZV9kaXIsIFNPVVJDRV9TVUJESVJfU1RPUkFHRV0uaXRlcigp LmNvbGxlY3QoKTsKPiArICAgIGxldCB0YXJnZXRfZGlyX3N0b3JhZ2U6IFBhdGhCdWYgPSBbdGFy Z2V0X2Jhc2VfZGlyLCBUQVJHRVRfU1VCRElSX1NUT1JBR0VdLml0ZXIoKS5jb2xsZWN0KCk7CgoK V2hhdCBkbyB5b3UgdGhpbmsgYWJvdXQ6CgpsZXQgc291cmNlX2Jhc2VfZGlyID0gUGF0aDo6bmV3 KGFyZ3Muc291cmNlLmFzX2RlcmVmKCkudW53cmFwX29yKEJBU0VfRElSKSk7CmxldCB0YXJnZXRf YmFzZV9kaXIgPSBQYXRoOjpuZXcoYXJncy50YXJnZXQuYXNfZGVyZWYoKS51bndyYXBfb3IoQkFT RV9ESVIpKTsKCmxldCBzb3VyY2VfZGlyX2d1ZXN0cyA9IHNvdXJjZV9iYXNlX2Rpci5qb2luKFNP VVJDRV9TVUJESVJfR1VFU1QpOwpsZXQgdGFyZ2V0X2Rpcl9ndWVzdHMgPSBzb3VyY2VfYmFzZV9k aXIuam9pbihTT1VSQ0VfU1VCRElSX0dVRVNUKTsKCgoKPiArCj4gKyAgICBpZiAhYXJncy5taWdy YXRlIHsKPiArICAgICAgICBwcmludGxuISgiRFJZUlVOISBVc2UgdGhlIC0tbWlncmF0ZSBwYXJh bWV0ZXIgdG8gc3RhcnQgdGhlIG1pZ3JhdGlvbi4iKTsKPiArICAgIH0KPiArICAgIGlmIGFyZ3Mu Zm9yY2Ugewo+ICsgICAgICAgIHByaW50bG4hKCJGb3JjZSBtb2RlISBXaWxsIG92ZXJ3cml0ZSBl eGlzdGluZyB0YXJnZXQgUlJEIGZpbGVzISIpOwo+ICsgICAgfQo+ICsKPiArICAgIGlmIGxldCBF cnIoZSkgPSBtaWdyYXRlX25vZGVzKAo+ICsgICAgICAgIHNvdXJjZV9kaXJfbm9kZXMsCj4gKyAg ICAgICAgdGFyZ2V0X2Rpcl9ub2RlcywKPiArICAgICAgICByZXNvdXJjZV9iYXNlX2RpciwKPiAr ICAgICAgICBhcmdzLm1pZ3JhdGUsCj4gKyAgICAgICAgYXJncy5mb3JjZSwKPiArICAgICkgewo+ ICsgICAgICAgIGVwcmludGxuISgiRXJyb3IgbWlncmF0aW5nIG5vZGVzOiB7fSIsIGUpOwo+ICsg ICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKPiArICAgIH0KPiArICAgIGlmIGxldCBFcnIo ZSkgPSBtaWdyYXRlX3N0b3JhZ2UoCj4gKyAgICAgICAgc291cmNlX2Rpcl9zdG9yYWdlLAo+ICsg ICAgICAgIHRhcmdldF9kaXJfc3RvcmFnZSwKPiArICAgICAgICBhcmdzLm1pZ3JhdGUsCj4gKyAg ICAgICAgYXJncy5mb3JjZSwKPiArICAgICkgewo+ICsgICAgICAgIGVwcmludGxuISgiRXJyb3Ig bWlncmF0aW5nIHN0b3JhZ2U6IHt9IiwgZSk7Cj4gKyAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0 KDEpOwo+ICsgICAgfQo+ICsgICAgaWYgbGV0IEVycihlKSA9IG1pZ3JhdGVfZ3Vlc3RzKAo+ICsg ICAgICAgIHNvdXJjZV9kaXJfZ3Vlc3RzLAo+ICsgICAgICAgIHRhcmdldF9kaXJfZ3Vlc3RzLAo+ ICsgICAgICAgIHJlc291cmNlX2Jhc2VfZGlyLAo+ICsgICAgICAgIHNldF90aHJlYWRzKCZhcmdz KSwKPiArICAgICAgICBhcmdzLm1pZ3JhdGUsCj4gKyAgICAgICAgYXJncy5mb3JjZSwKPiArICAg ICkgewo+ICsgICAgICAgIGVwcmludGxuISgiRXJyb3IgbWlncmF0aW5nIGd1ZXN0czoge30iLCBl KTsKPiArICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7Cj4gKyAgICB9CgpFcnJvciBoYW5k bGluZyBpbiB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGEgYml0IGNsZWFuZXIgaWYgYnJva2VuIG91 dAppbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gYW5kIGJ5IHVzaW5nIGFueWhvdydzIC5jb250ZXh0 Ly53aXRoX2NvbnRleHQ6CgpmbiBkb19tYWluKCkgLT4gUmVzdWx0PCgpLCBFcnJvcj4gewogICAg bGV0IGFyZ3MgPSBwYXJzZV9hcmdzKC4uLikuY29udGV4dCgiQ291bGQgbm90IHBhcnNlIGFyZ3Mi KT87CiAgICAuLi4KICAgIG1pZ3JhdGVfZ3Vlc3RzKC4uLikuY29udGV4dCgiRXJyb3IgbWlncmF0 aW5nIGd1ZXN0cyIpPzsKCiAgICBPaygoKSkKfQoKZm4gbWFpbigpIHsKICAgIGlmIGxldCBFcnIo ZSkgPSBkb19tYWluKCkgewogICAgICAgIGVwcmludGxuISgie2V9Iik7CglzdGQ6OnByb2Nlc3M6 ZXhpdCgxKTsKICAgIH0KfQoKV2hhdCBkbyB5b3UgdGhpbms/CgoKPiArfQo+ICsKPiArLy8vIFNl dCBudW1iZXIgb2YgdGhyZWFkcwo+ICsvLy8KPiArLy8vIEVpdGhlciBhIGZpeGVkIHBhcmFtZXRl ciBvciBkZXRlcm1pbmluZyBhIHJhbmdlIGJldHdlZW4gMSB0byA0IHRocmVhZHMKPiArLy8vICBi YXNlZCBvbiB0aGUgbnVtYmVyIG9mIENQVSBjb3JlcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbS4K PiArZm4gc2V0X3RocmVhZHMoYXJnczogJkFyZ3MpIC0+IHVzaXplIHsKCkkgdGhpbmsgdGhlIG5h bWUgJ3NldF90aHJlYWRzJyBpcyByYXRoZXIgY29uZnVzaW5nIGZvciBzb21ldGhpbmcgdGhhdAoq cmV0dXJucyogdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIHVzZS4gTWF5YmUgY2FsbCBpdAondGhy ZWFkc19mcm9tX2NvcmVfY291bnQnIG9yIHNvbWV0aGluZyBhbGlrZT8gKHVuZGVyIHRoZSBhc3N1 bXB0aW9uIHRoYXQKeW91IHJlbW92ZSB0aGUgbGV0IFNvbWUoLi4uKSBhcyBzdWdnZXN0ZWQgYmVs b3cuIElmIHlvdSBrZWVwIGl0IHRoZXJlLAonZ2V0X3RocmVhZHMnIG1pZ2h0IGJlIGFuIG9rIGNo b2ljZS4KCgoKPiArICAgIGlmIGxldCBTb21lKHRocmVhZHMpID0gYXJncy50aHJlYWRzIHsKPiAr ICAgICAgICByZXR1cm4gdGhyZWFkczsKPiArICAgIH0KCl4gUGVyc29uYWxseSBJJ2Qga2VlcCB0 aGlzIHBhcnQgb3V0c2lkZSBvZiB0aGUgaGVscGVyLCBidXQgbm8gaGFyZApmZWVsaW5ncy4KCmZu IGRvX21haW4oKSB7CiAgICAuLi4KCiAgICBsZXQgdGhyZWFkcyA9IGFyZ3MudGhyZWFkcy51bndy YXBfb3JfZWxzZSh0aHJlYWRzX2Zyb21fY29yZV9jb3VudCk7CiAgICBtaWdyYXRlX2d1ZXN0cygu Li4sIHRocmVhZHMpPzsKCiAgICBPaygoKSkKfQoKCmZuIHRocmVhZHNfZnJvbV9jb3JlX2NvdW50 KCkgLT4gdXNpemUgewogIC4uLgp9CgoKCj4gKwo+ICsgICAgLy8gY2hlY2sgZm9yIGEgd2F5IHRv IGdldCBwaHlzaWNhbCBjb3JlcyBhbmQgbm90IHRocmVhZHM/Cj4gKyAgICBsZXQgY3B1czogdXNp emUgPSBTdHJpbmc6OmZyb21fdXRmOF9sb3NzeSgKPiArICAgICAgICBzdGQ6OnByb2Nlc3M6OkNv bW1hbmQ6Om5ldygibnByb2MiKQo+ICsgICAgICAgICAgICAub3V0cHV0KCkKPiArICAgICAgICAg ICAgLmV4cGVjdCgiRXJyb3IgcnVubmluZyBucHJvYyIpCj4gKyAgICAgICAgICAgIC5zdGRvdXQK PiArICAgICAgICAgICAgLmFzX3NsaWNlKCkKPiArICAgICAgICAgICAgLnRyaW1fYXNjaWkoKSwK PiArICAgICkKPiArICAgIC5wYXJzZTo6PHVzaXplPigpCj4gKyAgICAuZXhwZWN0KCJDb3VsZCBu b3QgcGFyc2UgbnByb2Mgb3V0cHV0Iik7Cj4gKwo+ICsgICAgaWYgY3B1cyA8IDMyIHsKPiArICAg ICAgICBsZXQgdGhyZWFkcyA9IGNwdXMgLyA4Owo+ICsgICAgICAgIGlmIHRocmVhZHMgPT0gMCB7 Cj4gKyAgICAgICAgICAgIHJldHVybiAxOwo+ICsgICAgICAgIH0KPiArICAgICAgICByZXR1cm4g dGhyZWFkczsKPiArICAgIH0KPiArICAgIE1BWF9USFJFQURTCj4gK30KPiArCj4gKy8vLyBDaGVj ayBpZiBhIFZNSUQgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQKPiArZm4gcmVzb3VyY2VfcHJlc2Vu dChwYXRoOiAmc3RyLCByZXNvdXJjZTogJnN0cikgLT4gUmVzdWx0PGJvb2w+IHsKPiArICAgIGxl dCByZXNvdXJjZWxpc3QgPSBmczo6cmVhZF90b19zdHJpbmcocGF0aCk/Owo+ICsgICAgT2socmVz b3VyY2VsaXN0LmNvbnRhaW5zKGZvcm1hdCEoIlwie3Jlc291cmNlfVwiIikuYXNfc3RyKCkpKQo+ ICt9Cj4gKwo+ICsvLy8gUmVuYW1lIGZpbGUgdG8gb2xkLCB3aGVuIG1pZ3JhdGVkIG9yIHJlc291 cmNlIG5vdCBwcmVzZW50IGF0IGFsbCAtPiBvbGQgUlJEIGZpbGUKPiArZm4gbXZfb2xkKGZpbGU6 ICZzdHIpIC0+IFJlc3VsdDwoKT4gewo+ICsgICAgbGV0IG9sZCA9IGZvcm1hdCEoInt9Lm9sZCIs IGZpbGUpOwo+ICsgICAgZnM6OnJlbmFtZShmaWxlLCBvbGQpPzsKPiArICAgIE9rKCgpKQo+ICt9 Cj4gKwo+ICsvLy8gQ29sbGxlY3QgYWxsIFJSRCBmaWxlcyBpbiB0aGUgcHJvdmlkZWQgZGlyZWN0 b3J5Cj4gK2ZuIGNvbGxlY3RfcnJkX2ZpbGVzKGxvY2F0aW9uOiAmUGF0aEJ1ZikgLT4gUmVzdWx0 PFZlYzwoQ1N0cmluZywgT3NTdHJpbmcpPj4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgpNYXliZSB1c2UgdGhlIHR5cGUgeW91 J3ZlIGRlZmluZWQgaGVyZT8gYEZpbGVgLCBhbHRob3VnaCBJJ2QgCnByZWZlciBhIGRpZmZlcmVu dCBuYW1lIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIHN0ZDo6ZnM6OkZpbGUuCgo+ICsgICAgbGV0 IG11dCBmaWxlczogVmVjPChDU3RyaW5nLCBPc1N0cmluZyk+ID0gVmVjOjpuZXcoKTsKPiArCj4g KyAgICBmczo6cmVhZF9kaXIobG9jYXRpb24pPwo+ICsgICAgICAgIC5maWx0ZXIofGZ8IGYuaXNf b2soKSkKPiArICAgICAgICAubWFwKHxmfCBmLnVud3JhcCgpLnBhdGgoKSkKCllvdSBjYW4gdXNl IGZpbHRlcl9tYXAgaGVyZSwgbWF5YmUgbGlrZSB0aGlzOgoKZnM6OnJlYWRfZGlyKGxvY2F0aW9u KT8KICAgIC5maWx0ZXJfbWFwKHxmfCBtYXRjaCBmIHsKICAgICAgICBPayhhKSA9PiBTb21lKGEu cGF0aCgpKSwKICAgICAgICBFcnIoZSkgPT4gewogICAgICAgICAgICBlcHJpbnRsbiEoImNvdWxk IG5vdCByZWFkIGRpciBlbnRyeToge2V9Iik7CiAgICAgICAgICAgIE5vbmUKICAgICAgICB9CiAg ICB9KQoKb3IsIGlmIHlvdSBkb24ndCB3YW50IHRvIGxvZyB0aGUgZXJyb3I6Cgpmczo6cmVhZF9k aXIobG9jYXRpb24pPwogICAgLmZpbHRlcl9tYXAoUmVzdWx0OjpvaykKICAgIC5tYXAofGVudHJ5 fCBlbnRyeS5wYXRoKCkpCgoodW50ZXN0ZWQsIGJ1dCB5b3UgZ2V0IHRoZSBpZGVhKQoKPiArICAg ICAgICAuZmlsdGVyKHxmfCBmLmlzX2ZpbGUoKSAmJiBmLmV4dGVuc2lvbigpLmlzX25vbmUoKSkK PiArICAgICAgICAuZm9yX2VhY2gofGZpbGV8IHsKPiArICAgICAgICAgICAgbGV0IHBhdGggPSBD U3RyaW5nOjpuZXcoZmlsZS5hc19wYXRoKCkuYXNfb3Nfc3RyKCkuYXNfYnl0ZXMoKSkKPiArICAg ICAgICAgICAgICAgIC5leHBlY3QoIkNvdWxkIG5vdCBjb252ZXJ0IHBhdGggdG8gQ1N0cmluZy4i KTsKICAgICAgICAgICAgICAgICAgICAgIF4KCj4gKyAgICAgICAgICAgIGxldCBmbmFtZSA9IGZp bGUKPiArICAgICAgICAgICAgICAgIC5maWxlX25hbWUoKQo+ICsgICAgICAgICAgICAgICAgLm1h cCh8dnwgdi50b19vc19zdHJpbmcoKSkKClJlYWRpbmcgdGhlIGRvY3MgZm9yIHRoZSBDU3RyaW5n OjpuZXcgZnVuY3Rpb24sIGl0IHNob3VsZCBvbmx5IGZhaWwgaWYKdGhlcmUgaXMgYSBOVUwgYnl0 ZSBpbiB0aGUgc3RyaW5nLCB3aGljaCBzaG91bGQgQUZBSUsgYmUgaW1wb3NzaWJsZQpoZXJlIHNp bmNlIHRoZSBzdHJpbmcgY2FtZSBmcm9tIHRoZSBmaWxlIG5hbWUuIE1heWJlIGV4cHJlc3MgdGhh dCBpbgpzb21lIGNvbW1lbnQgaGVyZT8KICAgICAgICAgICAgICAgICAgICAgICB2Cgo+ICsgICAg ICAgICAgICAgICAgLmV4cGVjdCgiQ291bGQgbm90IGNvbnZlcnQgZm5hbWUgdG8gT3NTdHJpbmcu Iik7Cj4gKyAgICAgICAgICAgIGZpbGVzLnB1c2goKHBhdGgsIGZuYW1lKSkKPiArICAgICAgICB9 KTsKPiArICAgIE9rKGZpbGVzKQo+ICt9Cj4gKwo+ICsvLy8gRG9lcyB0aGUgYWN0dWFsIG1pZ3Jh dGlvbiBmb3IgdGhlIGdpdmVuIGZpbGUKPiArZm4gZG9fcnJkX21pZ3JhdGlvbigKPiArICAgIGZp bGU6IEZpbGUsCj4gKyAgICB0YXJnZXRfbG9jYXRpb246ICZQYXRoLAo+ICsgICAgcnJkX2RlZjog JlsmQ1N0cl0sCj4gKyAgICBtaWdyYXRlOiBib29sLAo+ICsgICAgZm9yY2U6IGJvb2wsCj4gKykg LT4gUmVzdWx0PCgpPiB7Cj4gKyAgICBpZiAhbWlncmF0ZSB7Cj4gKyAgICAgICAgcHJpbnRsbiEo IndvdWxkIG1pZ3JhdGUgYnV0IGluIGRyeSBydW4gbW9kZSIpOwo+ICsgICAgfQo+ICsKPiArICAg IGxldCByZXNvdXJjZSA9IGZpbGUuMTsKPiArICAgIGxldCBtdXQgdGFyZ2V0X3BhdGggPSB0YXJn ZXRfbG9jYXRpb24udG9fcGF0aF9idWYoKTsKClNpbmNlIHRoZSBmaXJzdCB0aGluZyB5b3UgZG8g d2l0aCB0YXJnZXRfbG9jYXRpb24gaXMgdG8gY29udmVydCBpdCB0bwphIFBhdGhCdWYsIEknZCBz dWdnZXN0IGp1c3QgcGFzc2luZyBpdCBhcyBhIFBhdGhCdWYgYW5kIGxldCB0aGUgY2FsbGVyCnRh a2UgY2FyZSBvZiB0aGUgYWxsb2NhdGlvbi4KCj4gKyAgICB0YXJnZXRfcGF0aC5wdXNoKHJlc291 cmNlKTsKPiArCj4gKyAgICBpZiB0YXJnZXRfcGF0aC5leGlzdHMoKSAmJiAhZm9yY2Ugewo+ICsg ICAgICAgIHByaW50bG4hKAo+ICsgICAgICAgICAgICAiYWxyZWFkeSBtaWdyYXRlZCwgdXNlIC0t Zm9yY2UgdG8gb3ZlcndyaXRlIHRhcmdldCBmaWxlOiB7fSIsCj4gKyAgICAgICAgICAgIHRhcmdl dF9wYXRoLmRpc3BsYXkoKQo+ICsgICAgICAgICk7Cj4gKyAgICB9Cj4gKwo+ICsgICAgaWYgIW1p Z3JhdGUgfHwgKHRhcmdldF9wYXRoLmV4aXN0cygpICYmICFmb3JjZSkgewo+ICsgICAgICAgIGJh aWwhKCJza2lwcGluZyIpOwo+ICsgICAgfQoKeW91IGNvdWxkIHB1bGwgb3V0IHRoZSAndGFyZ2V0 X3BhdGguZXhpc3RzKCkgJiYgIWZvcmNlJyBpbnRvIGEgdmFyaWFibGUgc28KdGhhdCB5b3UgZG9u J3QgaGF2ZSB0byBldmFsdWF0ZSB0aGUgc2FtZSB0aGluZyB0d2ljZQoKPiArCj4gKyAgICBsZXQg bXV0IHNvdXJjZTogWypjb25zdCBpODsgMl0gPSBbc3RkOjpwdHI6Om51bGwoKTsgMl07Cj4gKyAg ICBzb3VyY2VbMF0gPSBmaWxlLjAuYXNfcHRyKCk7Cj4gKwo+ICsgICAgbGV0IHRhcmdldF9wYXRo ID0gQ1N0cmluZzo6bmV3KHRhcmdldF9wYXRoLnRvX3N0cigpLnVud3JhcCgpKS51bndyYXAoKTsK PiArCj4gKyAgICB1bnNhZmUgewo+ICsgICAgICAgIHJyZF9nZXRfY29udGV4dCgpOwo+ICsgICAg ICAgIHJyZF9jbGVhcl9lcnJvcigpOwo+ICsgICAgICAgIGxldCByZXMgPSBycmRfY3JlYXRlX3Iy KAo+ICsgICAgICAgICAgICB0YXJnZXRfcGF0aC5hc19wdHIoKSwKPiArICAgICAgICAgICAgUlJE X1NURVBfU0laRSBhcyB1NjQsCj4gKyAgICAgICAgICAgIDAsCj4gKyAgICAgICAgICAgIDAsCj4g KyAgICAgICAgICAgIHNvdXJjZS5hc19tdXRfcHRyKCksCj4gKyAgICAgICAgICAgIHN0ZDo6cHRy OjpudWxsKCksCj4gKyAgICAgICAgICAgIHJyZF9kZWYubGVuKCkgYXMgaTMyLAo+ICsgICAgICAg ICAgICBycmRfZGVmCj4gKyAgICAgICAgICAgICAgICAuaXRlcigpCj4gKyAgICAgICAgICAgICAg ICAubWFwKHx2fCB2LmFzX3B0cigpKQo+ICsgICAgICAgICAgICAgICAgLmNvbGxlY3Q6OjxWZWM8 Xz4+KCkKPiArICAgICAgICAgICAgICAgIC5hc19tdXRfcHRyKCksCj4gKyAgICAgICAgKTsKPiAr ICAgICAgICBpZiByZXMgIT0gMCB7Cj4gKyAgICAgICAgICAgIGJhaWwhKAo+ICsgICAgICAgICAg ICAgICAgIlJSRCBjcmVhdGUgRXJyb3I6IHt9IiwKPiArICAgICAgICAgICAgICAgIENTdHI6OmZy b21fcHRyKHJyZF9nZXRfZXJyb3IoKSkudG9fc3RyaW5nX2xvc3N5KCkKPiArICAgICAgICAgICAg KTsKPiArICAgICAgICB9Cj4gKyAgICB9Cj4gKyAgICBPaygoKSkKPiArfQo+ICsKPiArLy8vIE1p Z3JhdGUgZ3Vlc3QgUlJEIGZpbGVzCj4gKy8vLwo+ICsvLy8gSW4gcGFyYWxsZWwgdG8gc3BlZWQg dXAgdGhlIHByb2Nlc3MgYXMgbW9zdCB0aW1lIGlzIHNwZW50IG9uIGNvbnZlcnRpbmcgdGhlCj4g Ky8vLyBkYXRhIHRvIHRoZSBuZXcgZm9ybWF0Lgo+ICtmbiBtaWdyYXRlX2d1ZXN0cygKPiArICAg IHNvdXJjZV9kaXJfZ3Vlc3RzOiBQYXRoQnVmLAo+ICsgICAgdGFyZ2V0X2Rpcl9ndWVzdHM6IFBh dGhCdWYsCj4gKyAgICByZXNvdXJjZXM6ICZzdHIsCj4gKyAgICB0aHJlYWRzOiB1c2l6ZSwKPiAr ICAgIG1pZ3JhdGU6IGJvb2wsCj4gKyAgICBmb3JjZTogYm9vbCwKPiArKSAtPiBSZXN1bHQ8KCks IEVycm9yPiB7Cj4gKyAgICBwcmludGxuISgiTWlncmF0aW5nIFJSRCBkYXRhIGZvciBndWVzdHPi gKYiKTsKPiArICAgIHByaW50bG4hKCJVc2luZyB7fSB0aHJlYWQocykiLCB0aHJlYWRzKTsKPiAr Cj4gKyAgICBsZXQgZ3Vlc3Rfc291cmNlX2ZpbGVzID0gY29sbGVjdF9ycmRfZmlsZXMoJnNvdXJj ZV9kaXJfZ3Vlc3RzKT87Cj4gKwo+ICsgICAgaWYgIXRhcmdldF9kaXJfZ3Vlc3RzLmV4aXN0cygp ICYmIG1pZ3JhdGUgewo+ICsgICAgICAgIHByaW50bG4hKCJDcmVhdGluZyBuZXcgZGlyZWN0b3J5 OiAne30nIiwgdGFyZ2V0X2Rpcl9ndWVzdHMuZGlzcGxheSgpKTsKPiArICAgICAgICBzdGQ6OmZz OjpjcmVhdGVfZGlyKCZ0YXJnZXRfZGlyX2d1ZXN0cyk/Owo+ICsgICAgfQo+ICsKPiArICAgIGxl dCB0b3RhbF9ndWVzdHMgPSBndWVzdF9zb3VyY2VfZmlsZXMubGVuKCk7Cj4gKyAgICBsZXQgZ3Vl c3RzID0gQXJjOjpuZXcoc3RkOjpzeW5jOjphdG9taWM6OkF0b21pY1VzaXplOjpuZXcoMCkpOwo+ ICsgICAgbGV0IGd1ZXN0czIgPSBndWVzdHMuY2xvbmUoKTsKCkp1c3QgRklZLCB3aGVuIGNsb25p bmcgYW4gQXJjIGl0J3MgYmV0dGVyIHRvIHVzZSBBcmM6OmNsb25lKCZndWVzdHMpLApiZWNhdXNl IHRoaXMgbWFrZXMgaXQgY2xlYXJlciAqd2hhdCogeW91IGFyZSBhIGFjdHVhbGx5IGNsb25pbmcs CnRoZSBBcmMgdnMuIHRoZSBjb250ZW50IG9mIHRoZSBBcmMKCj4gKyAgICBsZXQgc3RhcnRfdGlt ZSA9IHN0ZDo6dGltZTo6U3lzdGVtVGltZTo6bm93KCk7CgpTaW5jZSB5b3Ugb25seSBtZWFzdXJl IHRoZSBlbGFwc2VkIHRpbWUgaXQgbWlnaHQgYmUgbW9yZSBpZGlvbWF0aWMgdG8KdXNlIHN0ZDo6 dGltZTo6SW5zdGFudCBoZXJlLCBidXQgbm90IGhhcmQgZmVlbGluZ3MuCgo+ICsKPiArICAgIGxl dCBtaWdyYXRpb25fcG9vbCA9IFBhcmFsbGVsSGFuZGxlcjo6bmV3KAo+ICsgICAgICAgICJndWVz dCBycmQgbWlncmF0aW9uIiwKPiArICAgICAgICB0aHJlYWRzLAo+ICsgICAgICAgIG1vdmUgfGZp bGU6IChDU3RyaW5nLCBPc1N0cmluZyl8IHsKClBsZWFzZSBhZGQgc29tZSBjb21tZW50IHJlZ2Fy ZGluZyB0aGUgLnVud3JhcCBoZXJlLgoKPiArICAgICAgICAgICAgbGV0IGZ1bGxfcGF0aCA9IGZp bGUuMC5jbG9uZSgpLmludG9fc3RyaW5nKCkudW53cmFwKCk7Cj4gKwo+ICsgICAgICAgICAgICBp ZiBsZXQgT2soKCkpID0gZG9fcnJkX21pZ3JhdGlvbigKPiArICAgICAgICAgICAgICAgIGZpbGUs Cj4gKyAgICAgICAgICAgICAgICAmdGFyZ2V0X2Rpcl9ndWVzdHMsCj4gKyAgICAgICAgICAgICAg ICBSUkRfVk1fREVGLmFzX3NsaWNlKCksCj4gKyAgICAgICAgICAgICAgICBtaWdyYXRlLAo+ICsg ICAgICAgICAgICAgICAgZm9yY2UsCj4gKyAgICAgICAgICAgICkgewoKClNpbmNlIGRvX3JyZF9t aWdyYXRpb24gZG9lcyBub3QgcmV0dXJuIGFueSBkYXRhIGluIHRoZSBPcHRpb24sIHlvdSBjb3Vs ZApqdXN0IAoKaWYgZG9fcnJkX21pZ3JhdGlvbiguLi4uKS5pc19vaygpIHsKICAgLi4uLgp9Cgo+ ICsgICAgICAgICAgICAgICAgbXZfb2xkKGZ1bGxfcGF0aC5hc19zdHIoKSk/Owo+ICsgICAgICAg ICAgICAgICAgbGV0IGN1cnJlbnRfZ3Vlc3RzID0gZ3Vlc3RzMi5mZXRjaF9hZGQoMSwgc3RkOjpz eW5jOjphdG9taWM6Ok9yZGVyaW5nOjpTZXFDc3QpOwo+ICsgICAgICAgICAgICAgICAgaWYgY3Vy cmVudF9ndWVzdHMgPiAwICYmIGN1cnJlbnRfZ3Vlc3RzICUgMjAwID09IDAgewo+ICsgICAgICAg ICAgICAgICAgICAgIHByaW50bG4hKCJNaWdyYXRlZCB7fSBvZiB7fSBndWVzdHMiLCBjdXJyZW50 X2d1ZXN0cywgdG90YWxfZ3Vlc3RzKTsKPiArICAgICAgICAgICAgICAgIH0KPiArICAgICAgICAg ICAgfQo+ICsgICAgICAgICAgICBPaygoKSkKPiArICAgICAgICB9LAo+ICsgICAgKTsKPiArICAg IGxldCBtaWdyYXRpb25fY2hhbm5lbCA9IG1pZ3JhdGlvbl9wb29sLmNoYW5uZWwoKTsKPiArCj4g KyAgICBmb3IgZmlsZSBpbiBndWVzdF9zb3VyY2VfZmlsZXMgewo+ICsgICAgICAgIGxldCBub2Rl ID0gZmlsZS4xLmNsb25lKCkuaW50b19zdHJpbmcoKS51bndyYXAoKTsKPiArICAgICAgICBpZiAh cmVzb3VyY2VfcHJlc2VudChmb3JtYXQhKCJ7cmVzb3VyY2VzfS8udm1saXN0IikuYXNfc3RyKCks IG5vZGUuYXNfc3RyKCkpPyB7Cj4gKyAgICAgICAgICAgIHByaW50bG4hKCJWTUlEOiAne25vZGV9 JyBub3QgcHJlc2VudC4gU2tpcCBhbmQgbWFyayBhcyBvbGQuIik7Cj4gKyAgICAgICAgICAgIG12 X29sZChmb3JtYXQhKCJ7fSIsIGZpbGUuMC50b19zdHJpbmdfbG9zc3koKSkuYXNfc3RyKCkpPzsK PiArICAgICAgICB9Cj4gKyAgICAgICAgbGV0IG1pZ3JhdGlvbl9jaGFubmVsID0gbWlncmF0aW9u X2NoYW5uZWwuY2xvbmUoKTsKCklzIHRoaXMgY2xvbmUgaGVyZSBuZWVkZWQ/IFNlZW1zIHRvIGNv bXBpbGUgZmluZSB3aXRob3V0IGhlcmUuLi4uCgo+ICsgICAgICAgIG1pZ3JhdGlvbl9jaGFubmVs LnNlbmQoZmlsZSk/Owo+ICsgICAgfQo+ICsKPiArICAgIGRyb3AobWlncmF0aW9uX2NoYW5uZWwp Owo+ICsgICAgbWlncmF0aW9uX3Bvb2wuY29tcGxldGUoKT87Cj4gKwo+ICsgICAgbGV0IGVsYXBz ZWQgPSBzdGFydF90aW1lLmVsYXBzZWQoKT8uYXNfc2Vjc19mNjQoKTsKPiArICAgIGxldCBndWVz dHMgPSBndWVzdHMubG9hZChzdGQ6OnN5bmM6OmF0b21pYzo6T3JkZXJpbmc6OlNlcUNzdCk7Cj4g KyAgICBwcmludGxuISgiTWlncmF0ZWQge30gZ3Vlc3RzIiwgZ3Vlc3RzKTsKPiArICAgIHByaW50 bG4hKCJJdCB0b29rIHs6LjJ9cyIsIGVsYXBzZWQpOwo+ICsKPiArICAgIE9rKCgpKQo+ICt9Cj4g Kwo+ICsvLy8gTWlncmF0ZSBub2RlIFJSRCBmaWxlcwo+ICsvLy8KPiArLy8vIEluIHNlcmlhbCBh cyB0aGUgbnVtYmVyIG9mIG5vZGVzIHdpbGwgbm90IGJlIGhpZ2guCj4gK2ZuIG1pZ3JhdGVfbm9k ZXMoCj4gKyAgICBzb3VyY2VfZGlyX25vZGVzOiBQYXRoQnVmLAo+ICsgICAgdGFyZ2V0X2Rpcl9u b2RlczogUGF0aEJ1ZiwKPiArICAgIHJlc291cmNlczogJnN0ciwKCkFueSByZWFzb24gd2h5IHRo aXMgb25lIGlzIGEgJnN0ciBpbnN0ZWFkIG9mIGEgUGF0aEJ1Zj8gQXMgZmFyIGFzIEkgY2FuCnRl bGwgaXQgaXMgYWxzbyBhIHBhdGggKC9ldGMvcHZlIGJ5IGRlZmF1bHQpLiBBbHNvIHRoZQpuYW1l IG9mIHRoZSB2YXJpYWJsZSBzb21laG93IG1ha2VzIGl0IG5vdCByZWFsbHkgY2xlYXIgdGhhdCB0 aGlzIGlzCnN1cHBvc2UgdG8gYmUgYSBwYXRoLCBJIG9ubHkgZGVkdWNlZCBpdCBmcm9tIFJFU09V UkNFX0JBU0VfRElSLgoKPiArICAgIG1pZ3JhdGU6IGJvb2wsCj4gKyAgICBmb3JjZTogYm9vbCwK PiArKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7Cj4gKyAgICBwcmludGxuISgiTWlncmF0aW5nIFJS RCBkYXRhIGZvciBub2Rlc+KApiIpOwo+ICsKPiArICAgIGlmICF0YXJnZXRfZGlyX25vZGVzLmV4 aXN0cygpICYmIG1pZ3JhdGUgewo+ICsgICAgICAgIHByaW50bG4hKCJDcmVhdGluZyBuZXcgZGly ZWN0b3J5OiAne30nIiwgdGFyZ2V0X2Rpcl9ub2Rlcy5kaXNwbGF5KCkpOwo+ICsgICAgICAgIHN0 ZDo6ZnM6OmNyZWF0ZV9kaXIoJnRhcmdldF9kaXJfbm9kZXMpPzsKPiArICAgIH0KPiArCj4gKyAg ICBsZXQgbm9kZV9zb3VyY2VfZmlsZXMgPSBjb2xsZWN0X3JyZF9maWxlcygmc291cmNlX2Rpcl9u b2Rlcyk/Owo+ICsKPiArICAgIGZvciBmaWxlIGluIG5vZGVfc291cmNlX2ZpbGVzIHsKPiArICAg ICAgICBsZXQgbm9kZSA9IGZpbGUuMS5jbG9uZSgpLmludG9fc3RyaW5nKCkudW53cmFwKCk7Cj4g KyAgICAgICAgbGV0IGZ1bGxfcGF0aCA9IGZpbGUuMC5jbG9uZSgpLmludG9fc3RyaW5nKCkudW53 cmFwKCk7CgpQbGVhc2UgYWRkIHNvbWUgY29tbWVudCB3aHkgaXQgaXMgb2theSB0byAudW53cmFw IGhlcmUgKG9yIGp1c3QgcmV0dXJuCm9yIGlnbm9yZSB0aGUgZXJyb3IsIGlmIHRoYXQgbWFrZXMg bW9yZSBzZW5zZSkuCgoKPiArICAgICAgICBwcmludGxuISgiTm9kZTogJ3tub2RlfSciKTsKPiAr ICAgICAgICBpZiAhcmVzb3VyY2VfcHJlc2VudChmb3JtYXQhKCJ7cmVzb3VyY2VzfS8ubWVtYmVy cyIpLmFzX3N0cigpLCBub2RlLmFzX3N0cigpKT8gewoKWW91IGNhbiBqdXN0IHVzZSAmZm9ybWF0 IS4uLiBhbmQgJm5vZGUgaW5zdGVhZCBvZiB0aGUgLmFzX3N0cigpIGNhbGxzCihhIGJpdCBuaWNl ciB0byByZWFkIGFuZCBtb3JlIGlkaW9ubWF0aWMsIGJ1dCBubyBoYXJkIGZlZWxpbmdzKS4KCj4g KyAgICAgICAgICAgIHByaW50bG4hKCJOb2RlOiAne25vZGV9JyBub3QgcHJlc2VudC4gU2tpcCBh bmQgbWFyayBhcyBvbGQuIik7Cj4gKyAgICAgICAgICAgIG12X29sZChmb3JtYXQhKCJ7fS97fSIs IGZpbGUuMC50b19zdHJpbmdfbG9zc3koKSwgbm9kZSkuYXNfc3RyKCkpPzsKPiArICAgICAgICB9 Cj4gKyAgICAgICAgaWYgbGV0IE9rKCgpKSA9IGRvX3JyZF9taWdyYXRpb24oCj4gKyAgICAgICAg ICAgIGZpbGUsCj4gKyAgICAgICAgICAgICZ0YXJnZXRfZGlyX25vZGVzLAo+ICsgICAgICAgICAg ICBSUkRfTk9ERV9ERUYuYXNfc2xpY2UoKSwKPiArICAgICAgICAgICAgbWlncmF0ZSwKPiArICAg ICAgICAgICAgZm9yY2UsCj4gKyAgICAgICAgKSB7CgoKU2luY2UgZG9fcnJkX21pZ3JhdGlvbiBk b2VzIG5vdCByZXR1cm4gYW55IGRhdGEgaW4gdGhlIE9wdGlvbiwgeW91IGNvdWxkCmp1c3QgCgpp ZiBkb19ycmRfbWlncmF0aW9uKC4uLi4pLmlzX29rKCkgewogICAuLi4uCn0KCj4gKyAgICAgICAg ICAgIG12X29sZChmdWxsX3BhdGguYXNfc3RyKCkpPzsKPiArICAgICAgICB9Cj4gKyAgICB9Cj4g KyAgICBwcmludGxuISgiTWlncmF0ZWQgYWxsIG5vZGVzIik7Cj4gKwo+ICsgICAgT2soKCkpCj4g K30KPiArCj4gKy8vLyBNaWdyYXRlIHN0b3JhZ2UgUlJEIGZpbGVzCj4gKy8vLwo+ICsvLy8gSW4g c2VyaWFsIGFzIHRoZSBudW1iZXIgb2Ygc3RvcmFnZSB3aWxsIG5vdCBiZSB0aGF0IGhpZ2guCj4g K2ZuIG1pZ3JhdGVfc3RvcmFnZSgKPiArICAgIHNvdXJjZV9kaXJfc3RvcmFnZTogUGF0aEJ1ZiwK PiArICAgIHRhcmdldF9kaXJfc3RvcmFnZTogUGF0aEJ1ZiwKPiArICAgIG1pZ3JhdGU6IGJvb2ws Cj4gKyAgICBmb3JjZTogYm9vbCwKPiArKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7Cj4gKyAgICBw cmludGxuISgiTWlncmF0aW5nIFJSRCBkYXRhIGZvciBzdG9yYWdlc+KApiIpOwo+ICsKPiArICAg IGlmICF0YXJnZXRfZGlyX3N0b3JhZ2UuZXhpc3RzKCkgJiYgbWlncmF0ZSB7Cj4gKyAgICAgICAg cHJpbnRsbiEoIkNyZWF0aW5nIG5ldyBkaXJlY3Rvcnk6ICd7fSciLCB0YXJnZXRfZGlyX3N0b3Jh Z2UuZGlzcGxheSgpKTsKPiArICAgICAgICBzdGQ6OmZzOjpjcmVhdGVfZGlyKCZ0YXJnZXRfZGly X3N0b3JhZ2UpPzsKPiArICAgIH0KPiArCj4gKyAgICAvLyBzdG9yYWdlIGhhcyBhbm90aGVyIGxh eWVyIG9mIGRpcmVjdG9yaWVzIHBlciBub2RlIG92ZXIgd2hpY2ggd2UgbmVlZCB0byBpdGVyYXRl Cj4gKyAgICBmczo6cmVhZF9kaXIoJnNvdXJjZV9kaXJfc3RvcmFnZSk/Cj4gKyAgICAgICAgLmZp bHRlcih8ZnwgZi5pc19vaygpKQo+ICsgICAgICAgIC5tYXAofGZ8IGYudW53cmFwKCkucGF0aCgp KQo+ICsgICAgICAgIC5maWx0ZXIofGZ8IGYuaXNfZGlyKCkpCgp5b3UgY2FuIHVzZSBmaWx0ZXJf bWFwIGhlcmUsIGFzIGV4cGxhaW5lZCBpbiBjb2xsZWN0X3JyZF9maWxlcwoKPiArICAgICAgICAu dHJ5X2Zvcl9lYWNoKHxub2RlfCB7Cj4gKyAgICAgICAgICAgIGxldCBtdXQgc291cmNlX3N0b3Jh Z2Vfc3ViZGlyID0gc291cmNlX2Rpcl9zdG9yYWdlLmNsb25lKCk7Cj4gKyAgICAgICAgICAgIHNv dXJjZV9zdG9yYWdlX3N1YmRpci5wdXNoKG5vZGUuZmlsZV9uYW1lKCkudW53cmFwKCkpOwo+ICsK PiArICAgICAgICAgICAgbGV0IG11dCB0YXJnZXRfc3RvcmFnZV9zdWJkaXIgPSB0YXJnZXRfZGly X3N0b3JhZ2UuY2xvbmUoKTsKPiArICAgICAgICAgICAgdGFyZ2V0X3N0b3JhZ2Vfc3ViZGlyLnB1 c2gobm9kZS5maWxlX25hbWUoKS51bndyYXAoKSk7Cj4gKwo+ICsgICAgICAgICAgICBpZiAhdGFy Z2V0X3N0b3JhZ2Vfc3ViZGlyLmV4aXN0cygpICYmIG1pZ3JhdGUgewo+ICsgICAgICAgICAgICAg ICAgZnM6OmNyZWF0ZV9kaXIodGFyZ2V0X3N0b3JhZ2Vfc3ViZGlyLmFzX3BhdGgoKSk/OwpZb3Ug Y2FuIHVzZSAmIGhlcmUgaW5zdGVhZCBvZiAuYXNfcGF0aCgpIDopCgo+ICsgICAgICAgICAgICAg ICAgbGV0IG1ldGFkYXRhID0gdGFyZ2V0X3N0b3JhZ2Vfc3ViZGlyLm1ldGFkYXRhKCk/Owo+ICsg ICAgICAgICAgICAgICAgbGV0IG11dCBwZXJtaXNzaW9ucyA9IG1ldGFkYXRhLnBlcm1pc3Npb25z KCk7Cj4gKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucy5zZXRfbW9kZSgwbzc1NSk7CgpZb3Ug bmVlZCB0byBhY3R1YWxseSBhcHBseSB0aGUgcGVybWlzc2lvbnMgdG8gdGhlIGRpciwgaGVyZSB5 b3Ugb25seSBzZXQKdGhlIHBlcm1pc3Npb24gYml0cyBpbiB0aGUgUGVybWlzc2lvbnMgZGF0YSB0 eXBlLgoKc3RkOjpmczo6c2V0X3Blcm1pc3Npb25zKC4uLikKCj4gKyAgICAgICAgICAgIH0KPiAr Cj4gKyAgICAgICAgICAgIGxldCBzdG9yYWdlX3NvdXJjZV9maWxlcyA9IGNvbGxlY3RfcnJkX2Zp bGVzKCZzb3VyY2Vfc3RvcmFnZV9zdWJkaXIpPzsKPiArCj4gKyAgICAgICAgICAgIGZvciBmaWxl IGluIHN0b3JhZ2Vfc291cmNlX2ZpbGVzIHsKPiArICAgICAgICAgICAgICAgIHByaW50bG4hKAo+ ICsgICAgICAgICAgICAgICAgICAgICJTdG9yYWdlOiAne30ve30nIiwKPiArICAgICAgICAgICAg ICAgICAgICBub2RlLmZpbGVfbmFtZSgpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgIC5leHBl Y3QoIm5vIGZpbGUgbmFtZSBwcmVzZW50IikKClNhbWUgdGhpbmcgaGVyZSByZWdhcmRpbmcgdGhl IHBvdGVudGlhbCBwYW5pYwoKPiArICAgICAgICAgICAgICAgICAgICAgICAgLnRvX3N0cmluZ19s b3NzeSgpLAo+ICsgICAgICAgICAgICAgICAgICAgIFBhdGhCdWY6OmZyb20oZmlsZS4xLmNsb25l KCkpLmRpc3BsYXkoKQoKU3RhcnRpbmcgd2l0aCBydXN0YyAxLjg3LCB5b3UgY2FuIGRpcmVjdGx5 IGNhbGwgZmlsZS4xLmRpc3BsYXkoKSBvbiB0aGUgdW5kZXJseWluZyBPc1N0cihpbmcpLgoKPiAr ICAgICAgICAgICAgICAgICk7Cj4gKwo+ICsgICAgICAgICAgICAgICAgbGV0IGZ1bGxfcGF0aCA9 IGZpbGUuMC5jbG9uZSgpLmludG9fc3RyaW5nKCkudW53cmFwKCk7Cj4gKyAgICAgICAgICAgICAg ICBpZiBsZXQgT2soKCkpID0gZG9fcnJkX21pZ3JhdGlvbigKPiArICAgICAgICAgICAgICAgICAg ICBmaWxlLAo+ICsgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRfc3RvcmFnZV9zdWJkaXIsCj4g KyAgICAgICAgICAgICAgICAgICAgUlJEX1NUT1JBR0VfREVGLmFzX3NsaWNlKCksCj4gKyAgICAg ICAgICAgICAgICAgICAgbWlncmF0ZSwKPiArICAgICAgICAgICAgICAgICAgICBmb3JjZSwKPiAr ICAgICAgICAgICAgICAgICkgewo+ICsgICAgICAgICAgICAgICAgICAgIG12X29sZChmdWxsX3Bh dGguYXNfc3RyKCkpPzsKPiArICAgICAgICAgICAgICAgIH0KClNpbmNlIGRvX3JyZF9taWdyYXRp b24gZG9lcyBub3QgcmV0dXJuIGFueSBkYXRhIGluIHRoZSBPcHRpb24sIHlvdSBjb3VsZApqdXN0 IAoKaWYgZG9fcnJkX21pZ3JhdGlvbiguLi4uKS5pc19vaygpIHsKICAgLi4uLgp9Cgo+ICsgICAg ICAgICAgICB9Cj4gKyAgICAgICAgICAgIE9rOjo8KCksIEVycm9yPigoKSkKPiArICAgICAgICB9 KT87Cj4gKyAgICBwcmludGxuISgiTWlncmF0ZWQgYWxsIHN0b3JhZ2VzIik7Cj4gKwo+ICsgICAg T2soKCkpCj4gK30KPiBkaWZmIC0tZ2l0IGEvc3JjL3BhcmFsbGVsX2hhbmRsZXIucnMgYi9zcmMv cGFyYWxsZWxfaGFuZGxlci5ycwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAw MC4uZDhlZTNjNwo+IC0tLSAvZGV2L251bGwKPiArKysgYi9zcmMvcGFyYWxsZWxfaGFuZGxlci5y cwo+IEBAIC0wLDAgKzEsMTYwIEBACj4gKy8vISBBIHRocmVhZCBwb29sIHdoaWNoIHJ1biBhIGNs b3N1cmUgaW4gcGFyYWxsZWwuCj4gKwo+ICt1c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07Cj4g K3VzZSBzdGQ6OnRocmVhZDo6Sm9pbkhhbmRsZTsKPiArCj4gK3VzZSBhbnlob3c6OntiYWlsLCBm b3JtYXRfZXJyLCBFcnJvcn07Cj4gK3VzZSBjcm9zc2JlYW1fY2hhbm5lbDo6e2JvdW5kZWQsIFNl bmRlcn07Cj4gKwo+ICsvLy8gQSBoYW5kbGUgdG8gc2VuZCBkYXRhIHRvIHRoZSB3b3JrZXIgdGhy ZWFkIChpbXBsZW1lbnRzIGNsb25lKQo+ICtwdWIgc3RydWN0IFNlbmRIYW5kbGU8ST4gewo+ICsg ICAgaW5wdXQ6IFNlbmRlcjxJPiwKPiArICAgIGFib3J0OiBBcmM8TXV0ZXg8T3B0aW9uPFN0cmlu Zz4+PiwKPiArfQo+ICsKPiArLy8vIFJldHVybnMgdGhlIGZpcnN0IGVycm9yIGhhcHBlbmVkLCBp ZiBhbnkKPiArcHViIGZuIGNoZWNrX2Fib3J0KGFib3J0OiAmTXV0ZXg8T3B0aW9uPFN0cmluZz4+ KSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7Cj4gKyAgICBsZXQgZ3VhcmQgPSBhYm9ydC5sb2NrKCku dW53cmFwKCk7Cj4gKyAgICBpZiBsZXQgU29tZShlcnJfbXNnKSA9ICYqZ3VhcmQgewo+ICsgICAg ICAgIHJldHVybiBFcnIoZm9ybWF0X2VyciEoInt9IiwgZXJyX21zZykpOwo+ICsgICAgfQo+ICsg ICAgT2soKCkpCj4gK30KPiArCj4gK2ltcGw8STogU2VuZD4gU2VuZEhhbmRsZTxJPiB7Cj4gKyAg ICAvLy8gU2VuZCBkYXRhIHRvIHRoZSB3b3JrZXIgdGhyZWFkcwo+ICsgICAgcHViIGZuIHNlbmQo JnNlbGYsIGlucHV0OiBJKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7Cj4gKyAgICAgICAgY2hlY2tf YWJvcnQoJnNlbGYuYWJvcnQpPzsKPiArICAgICAgICBtYXRjaCBzZWxmLmlucHV0LnNlbmQoaW5w dXQpIHsKPiArICAgICAgICAgICAgT2soKCkpID0+IE9rKCgpKSwKPiArICAgICAgICAgICAgRXJy KF8pID0+IGJhaWwhKCJzZW5kIGZhaWxlZCAtIGNoYW5uZWwgY2xvc2VkIiksCj4gKyAgICAgICAg fQoKbWlnaHQgYmUgbW9yZSBpZGlvbWF0aWMgdG8gdXNlIC5tYXBfZXJyIGhlcmUKCj4gKyAgICB9 Cj4gK30KPiArCj4gKy8vLyBBIHRocmVhZCBwb29sIHdoaWNoIHJ1biB0aGUgc3VwcGxpZWQgY2xv c3VyZQo+ICsvLy8KPiArLy8vIFRoZSBzZW5kIGNvbW1hbmQgc2VuZHMgZGF0YSB0byB0aGUgd29y a2VyIHRocmVhZHMuIElmIG9uZSBoYW5kbGVyCj4gKy8vLyByZXR1cm5zIGFuIGVycm9yLCB3ZSBt YXJrIHRoZSBjaGFubmVsIGFzIGZhaWxlZCBhbmQgaXQgaXMgbm8KPiArLy8vIGxvbmdlciBwb3Nz aWJsZSB0byBzZW5kIGRhdGEuCj4gKy8vLwo+ICsvLy8gV2hlbiBkb25lLCB0aGUgJ2NvbXBsZXRl KCknIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgdG8gY2hlY2sgZm9yCj4gKy8vLyBvdXRzdGFu ZGluZyBlcnJvcnMuCj4gK3B1YiBzdHJ1Y3QgUGFyYWxsZWxIYW5kbGVyPEk+IHsKPiArICAgIGhh bmRsZXM6IFZlYzxKb2luSGFuZGxlPCgpPj4sCj4gKyAgICBuYW1lOiBTdHJpbmcsCj4gKyAgICBp bnB1dDogT3B0aW9uPFNlbmRIYW5kbGU8ST4+LAo+ICt9Cj4gKwo+ICtpbXBsPEk+IENsb25lIGZv ciBTZW5kSGFuZGxlPEk+IHsKPiArICAgIGZuIGNsb25lKCZzZWxmKSAtPiBTZWxmIHsKPiArICAg ICAgICBTZWxmIHsKPiArICAgICAgICAgICAgaW5wdXQ6IHNlbGYuaW5wdXQuY2xvbmUoKSwKPiAr ICAgICAgICAgICAgYWJvcnQ6IEFyYzo6Y2xvbmUoJnNlbGYuYWJvcnQpLAo+ICsgICAgICAgIH0K PiArICAgIH0KPiArfQo+ICsKPiAraW1wbDxJOiBTZW5kICsgJ3N0YXRpYz4gUGFyYWxsZWxIYW5k bGVyPEk+IHsKPiArICAgIC8vLyBDcmVhdGUgYSBuZXcgdGhyZWFkIHBvb2wsIGVhY2ggdGhyZWFk IHByb2Nlc3NpbmcgaW5jb21pbmcgZGF0YQo+ICsgICAgLy8vIHdpdGggJ2hhbmRsZXJfZm4nLgo+ ICsgICAgcHViIGZuIG5ldzxGPihuYW1lOiAmc3RyLCB0aHJlYWRzOiB1c2l6ZSwgaGFuZGxlcl9m bjogRikgLT4gU2VsZgo+ICsgICAgd2hlcmUKPiArICAgICAgICBGOiBGbihJKSAtPiBSZXN1bHQ8 KCksIEVycm9yPiArIFNlbmQgKyBDbG9uZSArICdzdGF0aWMsCj4gKyAgICB7Cj4gKyAgICAgICAg bGV0IG11dCBoYW5kbGVzID0gVmVjOjpuZXcoKTsKPiArICAgICAgICBsZXQgKGlucHV0X3R4LCBp bnB1dF9yeCkgPSBib3VuZGVkOjo8ST4odGhyZWFkcyk7Cj4gKwo+ICsgICAgICAgIGxldCBhYm9y dCA9IEFyYzo6bmV3KE11dGV4OjpuZXcoTm9uZSkpOwo+ICsKPiArICAgICAgICBmb3IgaSBpbiAw Li50aHJlYWRzIHsKPiArICAgICAgICAgICAgbGV0IGlucHV0X3J4ID0gaW5wdXRfcnguY2xvbmUo KTsKPiArICAgICAgICAgICAgbGV0IGFib3J0ID0gQXJjOjpjbG9uZSgmYWJvcnQpOwo+ICsgICAg ICAgICAgICBsZXQgaGFuZGxlcl9mbiA9IGhhbmRsZXJfZm4uY2xvbmUoKTsKPiArCj4gKyAgICAg ICAgICAgIGhhbmRsZXMucHVzaCgKPiArICAgICAgICAgICAgICAgIHN0ZDo6dGhyZWFkOjpCdWls ZGVyOjpuZXcoKQo+ICsgICAgICAgICAgICAgICAgICAgIC5uYW1lKGZvcm1hdCEoInt9ICh7fSki LCBuYW1lLCBpKSkKPiArICAgICAgICAgICAgICAgICAgICAuc3Bhd24obW92ZSB8fCBsb29wIHsK PiArICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBtYXRjaCBpbnB1dF9yeC5yZWN2 KCkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2soZGF0YSkgPT4gZGF0YSwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycihfKSA9PiByZXR1cm4sCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgIH07Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxldCBFcnIo ZXJyKSA9IChoYW5kbGVyX2ZuKShkYXRhKSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICBsZXQgbXV0IGd1YXJkID0gYWJvcnQubG9jaygpLnVud3JhcCgpOwoKLnVud3JhcCBvbiBNdXRl eDo6bG9jayBpcyBmaW5lIElNTywgYnV0IHNob3VsZCBoYXZlIGEgY29tbWVudCBleHBsYWluaW5n CnRoYXQgaXQgb25seSAudW53cmFwJ3Mgb24gYSBwb2lzaW9uZWQgbXV0ZXguCgo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaWYgZ3VhcmQuaXNfbm9uZSgpIHsKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAqZ3VhcmQgPSBTb21lKGVyci50b19zdHJpbmcoKSk7Cj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICB9Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgIH0K PiArICAgICAgICAgICAgICAgICAgICB9KQo+ICsgICAgICAgICAgICAgICAgICAgIC51bndyYXAo KSwKClRoaXMgc2hvdWxkbid0IC51bndyYXAoKSBJTU8sIHJhdGhlciByZXR1cm4gYW4gZXJyb3Ig ZnJvbSB0aGlzIGZ1bmN0aW9uLgoKPiArICAgICAgICAgICAgKTsKPiArICAgICAgICB9Cj4gKyAg ICAgICAgU2VsZiB7Cj4gKyAgICAgICAgICAgIGhhbmRsZXMsCj4gKyAgICAgICAgICAgIG5hbWU6 IG5hbWUudG9fc3RyaW5nKCksCj4gKyAgICAgICAgICAgIGlucHV0OiBTb21lKFNlbmRIYW5kbGUg ewo+ICsgICAgICAgICAgICAgICAgaW5wdXQ6IGlucHV0X3R4LAo+ICsgICAgICAgICAgICAgICAg YWJvcnQsCj4gKyAgICAgICAgICAgIH0pLAo+ICsgICAgICAgIH0KPiArICAgIH0KPiArCj4gKyAg ICAvLy8gUmV0dXJucyBhIGNsb25lYWJsZSBjaGFubmVsIHRvIHNlbmQgZGF0YSB0byB0aGUgd29y a2VyIHRocmVhZHMKPiArICAgIHB1YiBmbiBjaGFubmVsKCZzZWxmKSAtPiBTZW5kSGFuZGxlPEk+ IHsKPiArICAgICAgICBzZWxmLmlucHV0LmFzX3JlZigpLnVud3JhcCgpLmNsb25lKCkKClBsZWFz ZSBhZGQgYSBjb21tZW50IHdoeSAudW53cmFwIGlzIG9rYXkgaGVyZSBvciBidWJibGUgc29tZSBl cnJvciB1cAoKPiArICAgIH0KPiArCj4gKyAgICAvLy8gU2VuZCBkYXRhIHRvIHRoZSB3b3JrZXIg dGhyZWFkcwo+ICsgICAgcHViIGZuIHNlbmQoJnNlbGYsIGlucHV0OiBJKSAtPiBSZXN1bHQ8KCks IEVycm9yPiB7Cj4gKyAgICAgICAgc2VsZi5pbnB1dC5hc19yZWYoKS51bndyYXAoKS5zZW5kKGlu cHV0KT87CgpQbGVhc2UgYWRkIGEgY29tbWVudCB3aHkgLnVud3JhcCBpcyBva2F5IGhlcmUgb3Ig YnViYmxlIHNvbWUgZXJyb3IgdXAKCj4gKyAgICAgICAgT2soKCkpCj4gKyAgICB9Cj4gKwo+ICsg ICAgLy8vIFdhaXQgZm9yIHdvcmtlciB0aHJlYWRzIHRvIGNvbXBsZXRlIGFuZCBjaGVjayBmb3Ig ZXJyb3JzCj4gKyAgICBwdWIgZm4gY29tcGxldGUobXV0IHNlbGYpIC0+IFJlc3VsdDwoKSwgRXJy b3I+IHsKPiArICAgICAgICBsZXQgaW5wdXQgPSBzZWxmLmlucHV0LnRha2UoKS51bndyYXAoKTsK PiArICAgICAgICBsZXQgYWJvcnQgPSBBcmM6OmNsb25lKCZpbnB1dC5hYm9ydCk7Cj4gKyAgICAg ICAgY2hlY2tfYWJvcnQoJmFib3J0KT87Cj4gKyAgICAgICAgZHJvcChpbnB1dCk7Cj4gKwo+ICsg ICAgICAgIGxldCBtc2dfbGlzdCA9IHNlbGYuam9pbl90aHJlYWRzKCk7Cj4gKwo+ICsgICAgICAg IC8vIGFuIGVycm9yIG1pZ2h0IGJlIGVuY291bnRlcmVkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBq b2luCj4gKyAgICAgICAgY2hlY2tfYWJvcnQoJmFib3J0KT87Cj4gKwo+ICsgICAgICAgIGlmIG1z Z19saXN0LmlzX2VtcHR5KCkgewo+ICsgICAgICAgICAgICByZXR1cm4gT2soKCkpOwo+ICsgICAg ICAgIH0KPiArICAgICAgICBFcnIoZm9ybWF0X2VyciEoInt9IiwgbXNnX2xpc3Quam9pbigiXG4i KSkpCgpJJ2QgcmF0aGVyCgppZiAhbXNnX2xpc3QuaXNfZW1wdHkoKSB7CiAgICBiYWlsISgie30i LCBtc2dfbGlzdC5qb2luKCdcbicpKTsKfQoKT2soKCkpCgo+ICsgICAgfQo+ICsKPiArICAgIGZu IGpvaW5fdGhyZWFkcygmbXV0IHNlbGYpIC0+IFZlYzxTdHJpbmc+IHsKPiArICAgICAgICBsZXQg bXV0IG1zZ19saXN0ID0gVmVjOjpuZXcoKTsKPiArCj4gKyAgICAgICAgbGV0IG11dCBpID0gMDsK PiArICAgICAgICB3aGlsZSBsZXQgU29tZShoYW5kbGUpID0gc2VsZi5oYW5kbGVzLnBvcCgpIHsK PiArICAgICAgICAgICAgaWYgbGV0IEVycihwYW5pYykgPSBoYW5kbGUuam9pbigpIHsKPiArICAg ICAgICAgICAgICAgIGlmIGxldCBTb21lKHBhbmljX21zZykgPSBwYW5pYy5kb3duY2FzdF9yZWY6 Ojwmc3RyPigpIHsKPiArICAgICAgICAgICAgICAgICAgICBtc2dfbGlzdC5wdXNoKGZvcm1hdCEo InRocmVhZCB7fSAoe2l9KSBwYW5pY2tlZDoge3BhbmljX21zZ30iLCBzZWxmLm5hbWUpKTsKPiAr ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiBsZXQgU29tZShwYW5pY19tc2cpID0gcGFuaWMuZG93 bmNhc3RfcmVmOjo8U3RyaW5nPigpIHsKPiArICAgICAgICAgICAgICAgICAgICBtc2dfbGlzdC5w dXNoKGZvcm1hdCEoInRocmVhZCB7fSAoe2l9KSBwYW5pY2tlZDoge3BhbmljX21zZ30iLCBzZWxm Lm5hbWUpKTsKPiArICAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gKyAgICAgICAgICAgICAgICAg ICAgbXNnX2xpc3QucHVzaChmb3JtYXQhKCJ0aHJlYWQge30gKHtpfSkgcGFuaWNrZWQiLCBzZWxm Lm5hbWUpKTsKPiArICAgICAgICAgICAgICAgIH0KPiArICAgICAgICAgICAgfQo+ICsgICAgICAg ICAgICBpICs9IDE7Cj4gKyAgICAgICAgfQo+ICsgICAgICAgIG1zZ19saXN0Cj4gKyAgICB9Cj4g K30KPiArCj4gKy8vIE5vdGU6IFdlIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aHJlYWRzIHdpbGwgYmUg am9pbmVkCj4gK2ltcGw8ST4gRHJvcCBmb3IgUGFyYWxsZWxIYW5kbGVyPEk+IHsKPiArICAgIGZu IGRyb3AoJm11dCBzZWxmKSB7Cj4gKyAgICAgICAgZHJvcChzZWxmLmlucHV0LnRha2UoKSk7Cj4g KyAgICAgICAgd2hpbGUgbGV0IFNvbWUoaGFuZGxlKSA9IHNlbGYuaGFuZGxlcy5wb3AoKSB7Cj4g KyAgICAgICAgICAgIGxldCBfID0gaGFuZGxlLmpvaW4oKTsKPiArICAgICAgICB9Cj4gKyAgICB9 Cj4gK30KPiBkaWZmIC0tZ2l0IGEvd3JhcHBlci5oIGIvd3JhcHBlci5oCj4gbmV3IGZpbGUgbW9k ZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi42NGQwYWE2Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBi L3dyYXBwZXIuaAo+IEBAIC0wLDAgKzEgQEAKPiArI2luY2x1ZGUgPHJyZC5oPgoKCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpwdmUtZGV2ZWwgbWFpbGlu ZyBsaXN0CnB2ZS1kZXZlbEBsaXN0cy5wcm94bW94LmNvbQpodHRwczovL2xpc3RzLnByb3htb3gu Y29tL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby9wdmUtZGV2ZWwK