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 E6C351FF179 for ; Wed, 1 Oct 2025 15:11:33 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 5D2F61EF54; Wed, 1 Oct 2025 15:11:41 +0200 (CEST) Message-ID: <86783a1d-f8ae-43ea-ac5c-1da0891169e5@proxmox.com> Date: Wed, 1 Oct 2025 15:11:05 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: Proxmox Backup Server development discussion , =?UTF-8?Q?Fabian_Gr=C3=BCnbichler?= References: <20251001111915.2001026-1-f.gruenbichler@proxmox.com> <20251001111915.2001026-2-f.gruenbichler@proxmox.com> Content-Language: en-US, de-DE From: Christian Ebner In-Reply-To: <20251001111915.2001026-2-f.gruenbichler@proxmox.com> X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1759324244036 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.043 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 SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: Re: [pbs-devel] [PATCH proxmox-backup 1/3] GC: rework locking logic X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Backup Server development discussion Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" b25lIHNtYWxsIG5pdCBpbmxpbmUKCk9uIDEwLzEvMjUgMToxOSBQTSwgRmFiaWFuIEdyw7xuYmlj aGxlciB3cm90ZToKPiB0byBhdm9pZCBob2xkaW5nIGEgc3RkIE11dGV4IGZvciB0aGUgd2hvbGUg ZHVyYXRpb24gb2YgR0MsIHNpbmNlIEdDIG5vdyBjYWxscwo+IGludG8gYXN5bmMgY29kZSB2aWEg UzMuCj4gCj4gaW5zdGVhZCwgc3RvcmUgdGhlIGd1YXJkIHJldHVybiBieSBwcm9jZXNzIGxvY2tl ciBndWFyZGVkIGJ5IHRoZSBtdXRleCwgYW5kCj4gcXVlcnkgaXQgYmVpbmcgcHJlc2VudCB0byBk ZXRlcm1pbmUgd2hldGhlciBhIEdDIGlzIGN1cnJlbnRseSBydW5uaW5nLgo+IAo+IFNpZ25lZC1v ZmYtYnk6IEZhYmlhbiBHcsO8bmJpY2hsZXIgPGYuZ3J1ZW5iaWNobGVyQHByb3htb3guY29tPgo+ IC0tLQo+IAo+IE5vdGVzOgo+ICAgICAgYmVzdCB2aWV3ZWQgd2l0aCAtdwo+IAo+ICAgcGJzLWRh dGFzdG9yZS9zcmMvZGF0YXN0b3JlLnJzIHwgNTQyICsrKysrKysrKysrKysrKysrLS0tLS0tLS0t LS0tLS0tLQo+ICAgMSBmaWxlIGNoYW5nZWQsIDI4MyBpbnNlcnRpb25zKCspLCAyNTkgZGVsZXRp b25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL3Bicy1kYXRhc3RvcmUvc3JjL2RhdGFzdG9yZS5ycyBi L3Bicy1kYXRhc3RvcmUvc3JjL2RhdGFzdG9yZS5ycwo+IGluZGV4IDdjZjAyMGZjMC4uYzgyMWFj NTQ3IDEwMDY0NAo+IC0tLSBhL3Bicy1kYXRhc3RvcmUvc3JjL2RhdGFzdG9yZS5ycwo+ICsrKyBi L3Bicy1kYXRhc3RvcmUvc3JjL2RhdGFzdG9yZS5ycwo+IEBAIC0yMCw3ICsyMCw3IEBAIHVzZSBw cm94bW94X3NjaGVtYTo6QXBpVHlwZTsKPiAgIHVzZSBwcm94bW94X3N5czo6ZXJyb3I6OlN5c0Vy cm9yOwo+ICAgdXNlIHByb3htb3hfc3lzOjpmczo6e2ZpbGVfcmVhZF9vcHRpb25hbF9zdHJpbmcs IHJlcGxhY2VfZmlsZSwgQ3JlYXRlT3B0aW9uc307Cj4gICB1c2UgcHJveG1veF9zeXM6OmxpbnV4 Ojpwcm9jZnM6Ok1vdW50SW5mbzsKPiAtdXNlIHByb3htb3hfc3lzOjpwcm9jZXNzX2xvY2tlcjo6 UHJvY2Vzc0xvY2tTaGFyZWRHdWFyZDsKPiArdXNlIHByb3htb3hfc3lzOjpwcm9jZXNzX2xvY2tl cjo6e1Byb2Nlc3NMb2NrRXhjbHVzaXZlR3VhcmQsIFByb2Nlc3NMb2NrU2hhcmVkR3VhcmR9Owo+ ICAgdXNlIHByb3htb3hfdGltZTo6VGltZVNwYW47Cj4gICB1c2UgcHJveG1veF93b3JrZXJfdGFz azo6V29ya2VyVGFza0NvbnRleHQ7Cj4gICAKPiBAQCAtMTM2LDcgKzEzNiw3IEBAIHB1YiBmbiBl bnN1cmVfZGF0YXN0b3JlX2lzX21vdW50ZWQoY29uZmlnOiAmRGF0YVN0b3JlQ29uZmlnKSAtPiBS ZXN1bHQ8KCksIEVycm9yCj4gICAvLy8gbWFuYWdlbWVudCBpbnRlcmZhY2UgZm9yIGJhY2t1cC4K PiAgIHB1YiBzdHJ1Y3QgRGF0YVN0b3JlSW1wbCB7Cj4gICAgICAgY2h1bmtfc3RvcmU6IEFyYzxD aHVua1N0b3JlPiwKPiAtICAgIGdjX211dGV4OiBNdXRleDwoKT4sCj4gKyAgICBnY19tdXRleDog TXV0ZXg8T3B0aW9uPFByb2Nlc3NMb2NrRXhjbHVzaXZlR3VhcmQ+PiwKPiAgICAgICBsYXN0X2dj X3N0YXR1czogTXV0ZXg8R2FyYmFnZUNvbGxlY3Rpb25TdGF0dXM+LAo+ICAgICAgIHZlcmlmeV9u ZXc6IGJvb2wsCj4gICAgICAgY2h1bmtfb3JkZXI6IENodW5rT3JkZXIsCj4gQEAgLTE1Miw3ICsx NTIsNyBAQCBpbXBsIERhdGFTdG9yZUltcGwgewo+ICAgICAgIHB1YihjcmF0ZSkgdW5zYWZlIGZu IG5ld190ZXN0KCkgLT4gQXJjPFNlbGY+IHsKPiAgICAgICAgICAgQXJjOjpuZXcoU2VsZiB7Cj4g ICAgICAgICAgICAgICBjaHVua19zdG9yZTogQXJjOjpuZXcodW5zYWZlIHsgQ2h1bmtTdG9yZTo6 cGFuaWNfc3RvcmUoKSB9KSwKPiAtICAgICAgICAgICAgZ2NfbXV0ZXg6IE11dGV4OjpuZXcoKCkp LAo+ICsgICAgICAgICAgICBnY19tdXRleDogTXV0ZXg6Om5ldyhOb25lKSwKPiAgICAgICAgICAg ICAgIGxhc3RfZ2Nfc3RhdHVzOiBNdXRleDo6bmV3KEdhcmJhZ2VDb2xsZWN0aW9uU3RhdHVzOjpk ZWZhdWx0KCkpLAo+ICAgICAgICAgICAgICAgdmVyaWZ5X25ldzogZmFsc2UsCj4gICAgICAgICAg ICAgICBjaHVua19vcmRlcjogRGVmYXVsdDo6ZGVmYXVsdCgpLAo+IEBAIC01MTMsNyArNTEzLDcg QEAgaW1wbCBEYXRhU3RvcmUgewo+ICAgCj4gICAgICAgICAgIE9rKERhdGFTdG9yZUltcGwgewo+ ICAgICAgICAgICAgICAgY2h1bmtfc3RvcmUsCj4gLSAgICAgICAgICAgIGdjX211dGV4OiBNdXRl eDo6bmV3KCgpKSwKPiArICAgICAgICAgICAgZ2NfbXV0ZXg6IE11dGV4OjpuZXcoTm9uZSksCj4g ICAgICAgICAgICAgICBsYXN0X2djX3N0YXR1czogTXV0ZXg6Om5ldyhnY19zdGF0dXMpLAo+ICAg ICAgICAgICAgICAgdmVyaWZ5X25ldzogY29uZmlnLnZlcmlmeV9uZXcudW53cmFwX29yKGZhbHNl KSwKPiAgICAgICAgICAgICAgIGNodW5rX29yZGVyOiB0dW5pbmcuY2h1bmtfb3JkZXIudW53cmFw X29yX2RlZmF1bHQoKSwKPiBAQCAtMTUwNSw3ICsxNTA1LDEwIEBAIGltcGwgRGF0YVN0b3JlIHsK PiAgICAgICB9Cj4gICAKPiAgICAgICBwdWIgZm4gZ2FyYmFnZV9jb2xsZWN0aW9uX3J1bm5pbmco JnNlbGYpIC0+IGJvb2wgewo+IC0gICAgICAgIHNlbGYuaW5uZXIuZ2NfbXV0ZXgudHJ5X2xvY2so KS5pc19lcnIoKQo+ICsgICAgICAgIGxldCBsb2NrID0gc2VsZi5pbm5lci5nY19tdXRleC50cnlf bG9jaygpOwo+ICsKPiArICAgICAgICAvLyBNdXRleCBjdXJyZW50bHkgbG9ja2VkIG9yIGNvbnRh aW5zIGFuIGV4Y2x1c2l2ZSBsb2NrCj4gKyAgICAgICAgbG9jay5pc19lcnIoKSB8fCBsb2NrLnVu d3JhcCgpLmlzX3NvbWUoKQo+ICAgICAgIH0KPiAgIAo+ICAgICAgIHB1YiBmbiBnYXJiYWdlX2Nv bGxlY3Rpb24oCj4gQEAgLTE1MTMsMjYzICsxNTE2LDI4NCBAQCBpbXBsIERhdGFTdG9yZSB7Cj4g ICAgICAgICAgIHdvcmtlcjogJmR5biBXb3JrZXJUYXNrQ29udGV4dCwKPiAgICAgICAgICAgdXBp ZDogJlVQSUQsCj4gICAgICAgKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7Cj4gLSAgICAgICAgaWYg bGV0IE9rKHJlZiBtdXQgX211dGV4KSA9IHNlbGYuaW5uZXIuZ2NfbXV0ZXgudHJ5X2xvY2soKSB7 Cj4gLSAgICAgICAgICAgIC8vIGF2b2lkcyB0aGF0IHdlIHJ1biBHQyBpZiBhbiBvbGQgZGFlbW9u IHByb2Nlc3MgaGFzIHN0aWxsIGEKPiAtICAgICAgICAgICAgLy8gcnVubmluZyBiYWNrdXAgd3Jp dGVyLCB3aGljaCBpcyBub3Qgc2F2ZSBhcyB3ZSBoYXZlIG5vICJvbGRlc3QKPiAtICAgICAgICAg ICAgLy8gd3JpdGVyIiBpbmZvcm1hdGlvbiBhbmQgdGh1cyBubyBzYWZlIGF0aW1lIGN1dG9mZgo+ IC0gICAgICAgICAgICBsZXQgX2V4Y2x1c2l2ZV9sb2NrID0gc2VsZi5pbm5lci5jaHVua19zdG9y ZS50cnlfZXhjbHVzaXZlX2xvY2soKT87Cj4gLQo+IC0gICAgICAgICAgICBsZXQgKGNvbmZpZywg X2RpZ2VzdCkgPSBwYnNfY29uZmlnOjpkYXRhc3RvcmU6OmNvbmZpZygpPzsKPiAtICAgICAgICAg ICAgbGV0IGdjX3N0b3JlX2NvbmZpZzogRGF0YVN0b3JlQ29uZmlnID0gY29uZmlnLmxvb2t1cCgi ZGF0YXN0b3JlIiwgc2VsZi5uYW1lKCkpPzsKPiAtICAgICAgICAgICAgbGV0IGFsbF9zdG9yZXMg PSBjb25maWcuY29udmVydF90b190eXBlZF9hcnJheSgiZGF0YXN0b3JlIik/Owo+IC0gICAgICAg ICAgICBpZiBsZXQgRXJyKGVycikgPSBnY19zdG9yZV9jb25maWcuZW5zdXJlX25vdF9uZXN0ZWQo JmFsbF9zdG9yZXMpIHsKPiAtICAgICAgICAgICAgICAgIGluZm8hKAo+IC0gICAgICAgICAgICAg ICAgICAgICJDdXJyZW50IGRhdGFzdG9yZSBwYXRoOiB7cGF0aH0iLAo+IC0gICAgICAgICAgICAg ICAgICAgIHBhdGggPSBnY19zdG9yZV9jb25maWcuYWJzb2x1dGVfcGF0aCgpCj4gLSAgICAgICAg ICAgICAgICApOwo+IC0gICAgICAgICAgICAgICAgYmFpbCEoIkFib3J0aW5nIEdDIGZvciBzYWZl dHkgcmVhc29uczoge2Vycn0iKTsKPiAtICAgICAgICAgICAgfQo+IC0KPiAtICAgICAgICAgICAg bGV0IHBoYXNlMV9zdGFydF90aW1lID0gcHJveG1veF90aW1lOjplcG9jaF9pNjQoKTsKPiAtICAg ICAgICAgICAgbGV0IG9sZGVzdF93cml0ZXIgPSBzZWxmCj4gLSAgICAgICAgICAgICAgICAuaW5u ZXIKPiAtICAgICAgICAgICAgICAgIC5jaHVua19zdG9yZQo+IC0gICAgICAgICAgICAgICAgLm9s ZGVzdF93cml0ZXIoKQo+IC0gICAgICAgICAgICAgICAgLnVud3JhcF9vcihwaGFzZTFfc3RhcnRf dGltZSk7Cj4gLQo+IC0gICAgICAgICAgICBsZXQgbXV0IGdjX3N0YXR1cyA9IEdhcmJhZ2VDb2xs ZWN0aW9uU3RhdHVzIHsKPiAtICAgICAgICAgICAgICAgIHVwaWQ6IFNvbWUodXBpZC50b19zdHJp bmcoKSksCj4gLSAgICAgICAgICAgICAgICBjYWNoZV9zdGF0czogU29tZShHYXJiYWdlQ29sbGVj dGlvbkNhY2hlU3RhdHM6OmRlZmF1bHQoKSksCj4gLSAgICAgICAgICAgICAgICAuLkRlZmF1bHQ6 OmRlZmF1bHQoKQo+IC0gICAgICAgICAgICB9Owo+IC0gICAgICAgICAgICBsZXQgdHVuaW5nOiBE YXRhc3RvcmVUdW5pbmcgPSBzZXJkZV9qc29uOjpmcm9tX3ZhbHVlKAo+IC0gICAgICAgICAgICAg ICAgRGF0YXN0b3JlVHVuaW5nOjpBUElfU0NIRU1BCj4gLSAgICAgICAgICAgICAgICAgICAgLnBh cnNlX3Byb3BlcnR5X3N0cmluZyhnY19zdG9yZV9jb25maWcudHVuaW5nLmFzX2RlcmVmKCkudW53 cmFwX29yKCIiKSk/LAo+IC0gICAgICAgICAgICApPzsKPiAtCj4gLSAgICAgICAgICAgIGxldCBz M19jbGllbnQgPSBtYXRjaCBzZWxmLmJhY2tlbmQoKT8gewo+IC0gICAgICAgICAgICAgICAgRGF0 YXN0b3JlQmFja2VuZDo6RmlsZXN5c3RlbSA9PiBOb25lLAo+IC0gICAgICAgICAgICAgICAgRGF0 YXN0b3JlQmFja2VuZDo6UzMoczNfY2xpZW50KSA9PiB7Cj4gLSAgICAgICAgICAgICAgICAgICAg cHJveG1veF9hc3luYzo6cnVudGltZTo6YmxvY2tfb24oczNfY2xpZW50LmhlYWRfYnVja2V0KCkp Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gcmVhY2ggYnVj a2V0Iik/Owo+IC0gICAgICAgICAgICAgICAgICAgIFNvbWUoczNfY2xpZW50KQo+IC0gICAgICAg ICAgICAgICAgfQo+IC0gICAgICAgICAgICB9Owo+IC0KPiAtICAgICAgICAgICAgaWYgdHVuaW5n LmdjX2F0aW1lX3NhZmV0eV9jaGVjay51bndyYXBfb3IodHJ1ZSkgewo+IC0gICAgICAgICAgICAg ICAgc2VsZi5pbm5lcgo+IC0gICAgICAgICAgICAgICAgICAgIC5jaHVua19zdG9yZQo+IC0gICAg ICAgICAgICAgICAgICAgIC5jaGVja19mc19hdGltZV91cGRhdGVzKHRydWUsIHMzX2NsaWVudC5j bG9uZSgpKQo+IC0gICAgICAgICAgICAgICAgICAgIC5jb250ZXh0KCJhdGltZSBzYWZldHkgY2hl Y2sgZmFpbGVkIik/Owo+IC0gICAgICAgICAgICAgICAgaW5mbyEoIkFjY2VzcyB0aW1lIHVwZGF0 ZSBjaGVjayBzdWNjZXNzZnVsLCBwcm9jZWVkaW5nIHdpdGggR0MuIik7Cj4gLSAgICAgICAgICAg IH0gZWxzZSB7Cj4gLSAgICAgICAgICAgICAgICBpbmZvISgiQWNjZXNzIHRpbWUgdXBkYXRlIGNo ZWNrIGRpc2FibGVkIGJ5IGRhdGFzdG9yZSB0dW5pbmcgb3B0aW9ucy4iKTsKPiAtICAgICAgICAg ICAgfTsKPiAtCj4gLSAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGRlZmF1bHQgMjRoIDVtIGlm IG5vdCBzZXQKPiAtICAgICAgICAgICAgbGV0IGN1dG9mZiA9IHR1bmluZwo+IC0gICAgICAgICAg ICAgICAgLmdjX2F0aW1lX2N1dG9mZgo+IC0gICAgICAgICAgICAgICAgLm1hcCh8Y3V0b2ZmfCBj dXRvZmYgKiA2MCkKPiAtICAgICAgICAgICAgICAgIC51bndyYXBfb3IoMzYwMCAqIDI0ICsgMzAw KTsKPiAtCj4gLSAgICAgICAgICAgIGxldCBtdXQgbWluX2F0aW1lID0gcGhhc2UxX3N0YXJ0X3Rp bWUgLSBjdXRvZmYgYXMgaTY0Owo+IC0gICAgICAgICAgICBpbmZvISgKPiAtICAgICAgICAgICAg ICAgICJVc2luZyBhY2Nlc3MgdGltZSBjdXRvZmYge30sIG1pbmltdW0gYWNjZXNzIHRpbWUgaXMg e30iLAo+IC0gICAgICAgICAgICAgICAgVGltZVNwYW46OmZyb20oRHVyYXRpb246OmZyb21fc2Vj cyhjdXRvZmYgYXMgdTY0KSksCj4gLSAgICAgICAgICAgICAgICBwcm94bW94X3RpbWU6OmVwb2No X3RvX3JmYzMzMzlfdXRjKG1pbl9hdGltZSk/LAo+IC0gICAgICAgICAgICApOwo+IC0gICAgICAg ICAgICBpZiBvbGRlc3Rfd3JpdGVyIDwgbWluX2F0aW1lIHsKPiAtICAgICAgICAgICAgICAgIG1p bl9hdGltZSA9IG9sZGVzdF93cml0ZXIgLSAzMDA7IC8vIGFjY291bnQgZm9yIDUgbWluIHNhZmV0 eSBnYXAKPiAtICAgICAgICAgICAgICAgIGluZm8hKAo+IC0gICAgICAgICAgICAgICAgICAgICJP bGRlc3QgYmFja3VwIHdyaXRlciBzdGFydGVkIGF0IHt9LCBleHRlbmRpbmcgbWluaW11bSBhY2Nl c3MgdGltZSB0byB7fSIsCj4gLSAgICAgICAgICAgICAgICAgICAgVGltZVNwYW46OmZyb20oRHVy YXRpb246OmZyb21fc2VjcyhvbGRlc3Rfd3JpdGVyIGFzIHU2NCkpLAo+IC0gICAgICAgICAgICAg ICAgICAgIHByb3htb3hfdGltZTo6ZXBvY2hfdG9fcmZjMzMzOV91dGMobWluX2F0aW1lKT8sCj4g LSAgICAgICAgICAgICAgICApOwo+IC0gICAgICAgICAgICB9Cj4gLQo+IC0gICAgICAgICAgICBs ZXQgdHVuaW5nOiBEYXRhc3RvcmVUdW5pbmcgPSBzZXJkZV9qc29uOjpmcm9tX3ZhbHVlKAo+IC0g ICAgICAgICAgICAgICAgRGF0YXN0b3JlVHVuaW5nOjpBUElfU0NIRU1BCj4gLSAgICAgICAgICAg ICAgICAgICAgLnBhcnNlX3Byb3BlcnR5X3N0cmluZyhnY19zdG9yZV9jb25maWcudHVuaW5nLmFz X2RlcmVmKCkudW53cmFwX29yKCIiKSk/LAo+IC0gICAgICAgICAgICApPzsKPiAtICAgICAgICAg ICAgbGV0IGdjX2NhY2hlX2NhcGFjaXR5ID0gaWYgbGV0IFNvbWUoY2FwYWNpdHkpID0gdHVuaW5n LmdjX2NhY2hlX2NhcGFjaXR5IHsKPiAtICAgICAgICAgICAgICAgIGluZm8hKCJVc2luZyBjaHVu ayBkaWdlc3QgY2FjaGUgY2FwYWNpdHkgb2Yge2NhcGFjaXR5fS4iKTsKPiAtICAgICAgICAgICAg ICAgIGNhcGFjaXR5Cj4gLSAgICAgICAgICAgIH0gZWxzZSB7Cj4gLSAgICAgICAgICAgICAgICAx MDI0ICogMTAyNAo+IC0gICAgICAgICAgICB9Owo+IC0KPiAtICAgICAgICAgICAgaW5mbyEoIlN0 YXJ0IEdDIHBoYXNlMSAobWFyayB1c2VkIGNodW5rcykiKTsKPiAtCj4gLSAgICAgICAgICAgIHNl bGYubWFya191c2VkX2NodW5rcygKPiAtICAgICAgICAgICAgICAgICZtdXQgZ2Nfc3RhdHVzLAo+ IC0gICAgICAgICAgICAgICAgd29ya2VyLAo+IC0gICAgICAgICAgICAgICAgZ2NfY2FjaGVfY2Fw YWNpdHksCj4gLSAgICAgICAgICAgICAgICBzM19jbGllbnQuYXNfcmVmKCkuY2xvbmVkKCksCj4g LSAgICAgICAgICAgICkKPiAtICAgICAgICAgICAgLmNvbnRleHQoIm1hcmtpbmcgdXNlZCBjaHVu a3MgZmFpbGVkIik/Owo+IC0KPiAtICAgICAgICAgICAgaW5mbyEoIlN0YXJ0IEdDIHBoYXNlMiAo c3dlZXAgdW51c2VkIGNodW5rcykiKTsKPiAtCj4gLSAgICAgICAgICAgIGlmIGxldCBTb21lKHJl ZiBzM19jbGllbnQpID0gczNfY2xpZW50IHsKPiAtICAgICAgICAgICAgICAgIGxldCBtdXQgY2h1 bmtfY291bnQgPSAwOwo+IC0gICAgICAgICAgICAgICAgbGV0IHByZWZpeCA9IFMzUGF0aFByZWZp eDo6U29tZSgiLmNodW5rcy8iLnRvX3N0cmluZygpKTsKPiAtICAgICAgICAgICAgICAgIC8vIE9w ZXJhdGVzIGluIGJhdGNoZXMgb2YgMTAwMCBvYmplY3RzIG1heCBwZXIgcmVxdWVzdAo+IC0gICAg ICAgICAgICAgICAgbGV0IG11dCBsaXN0X2J1Y2tldF9yZXN1bHQgPQo+IC0gICAgICAgICAgICAg ICAgICAgIHByb3htb3hfYXN5bmM6OnJ1bnRpbWU6OmJsb2NrX29uKHMzX2NsaWVudC5saXN0X29i amVjdHNfdjIoJnByZWZpeCwgTm9uZSkpCj4gLSAgICAgICAgICAgICAgICAgICAgICAgIC5jb250 ZXh0KCJmYWlsZWQgdG8gbGlzdCBjaHVuayBpbiBzMyBvYmplY3Qgc3RvcmUiKT87Cj4gLQo+IC0g ICAgICAgICAgICAgICAgbGV0IG11dCBkZWxldGVfbGlzdCA9IFZlYzo6d2l0aF9jYXBhY2l0eSgx MDAwKTsKPiAtICAgICAgICAgICAgICAgIGxvb3Agewo+IC0gICAgICAgICAgICAgICAgICAgIGxl dCBsb2NrID0gc2VsZi5pbm5lci5jaHVua19zdG9yZS5tdXRleCgpLmxvY2soKS51bndyYXAoKTsK PiAtCj4gLSAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnRlbnQgaW4gbGlzdF9idWNrZXRfcmVz dWx0LmNvbnRlbnRzIHsKPiAtICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZgo+IC0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgLm1hcmtfY2h1bmtfZm9yX29iamVjdF9rZXkoCj4gLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnQua2V5LAo+IC0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuc2l6ZSwKPiAtICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBtaW5fYXRpbWUsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgb2xkZXN0X3dyaXRlciwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXV0 IGRlbGV0ZV9saXN0LAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtdXQgZ2Nf c3RhdHVzLAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQo+IC0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCB7Cj4gLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZm9ybWF0ISgiZmFpbGVkIHRvIG1hcmsgY2h1bmsgZm9yIG9iamVjdCBrZXkg e30iLCBjb250ZW50LmtleSkKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pPwo+IC0g ICAgICAgICAgICAgICAgICAgICAgICB7Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBj aHVua19jb3VudCArPSAxOwo+IC0gICAgICAgICAgICAgICAgICAgICAgICB9Cj4gLSAgICAgICAg ICAgICAgICAgICAgfQo+IC0KPiAtICAgICAgICAgICAgICAgICAgICBpZiAhZGVsZXRlX2xpc3Qu aXNfZW1wdHkoKSB7Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZWxldGVfb2JqZWN0 c19yZXN1bHQgPSBwcm94bW94X2FzeW5jOjpydW50aW1lOjpibG9ja19vbigKPiAtICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHMzX2NsaWVudC5kZWxldGVfb2JqZWN0cygmZGVsZXRlX2xpc3Qp LAo+IC0gICAgICAgICAgICAgICAgICAgICAgICApPzsKPiAtICAgICAgICAgICAgICAgICAgICAg ICAgaWYgbGV0IFNvbWUoX2VycikgPSBkZWxldGVfb2JqZWN0c19yZXN1bHQuZXJyb3Igewo+IC0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFpbCEoImZhaWxlZCB0byBkZWxldGUgc29tZSBv YmplY3RzIik7Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgIH0KPiAtICAgICAgICAgICAgICAg ICAgICAgICAgZGVsZXRlX2xpc3QuY2xlYXIoKTsKPiAtICAgICAgICAgICAgICAgICAgICB9Cj4g LQo+IC0gICAgICAgICAgICAgICAgICAgIGRyb3AobG9jayk7Cj4gLQo+IC0gICAgICAgICAgICAg ICAgICAgIC8vIFByb2Nlc3MgbmV4dCBiYXRjaCBvZiBjaHVua3MgaWYgdGhlcmUgaXMgbW9yZQo+ IC0gICAgICAgICAgICAgICAgICAgIGlmIGxpc3RfYnVja2V0X3Jlc3VsdC5pc190cnVuY2F0ZWQg ewo+IC0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2J1Y2tldF9yZXN1bHQgPQo+IC0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgcHJveG1veF9hc3luYzo6cnVudGltZTo6YmxvY2tfb24o czNfY2xpZW50Lmxpc3Rfb2JqZWN0c192MigKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAmcHJlZml4LAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfYnVj a2V0X3Jlc3VsdC5uZXh0X2NvbnRpbnVhdGlvbl90b2tlbi5hc19kZXJlZigpLAo+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgKSk/Owo+IC0gICAgICAgICAgICAgICAgICAgICAgICBjb250 aW51ZTsKPiAtICAgICAgICAgICAgICAgICAgICB9Cj4gLQo+IC0gICAgICAgICAgICAgICAgICAg IGJyZWFrOwo+IC0gICAgICAgICAgICAgICAgfQo+IC0gICAgICAgICAgICAgICAgaW5mbyEoInBy b2Nlc3NlZCB7Y2h1bmtfY291bnR9IHRvdGFsIGNodW5rcyIpOwo+IC0KPiAtICAgICAgICAgICAg ICAgIC8vIFBoYXNlIDIgR0Mgb2YgRmlsZXN5c3RlbSBiYWNrZWQgc3RvcmFnZSBpcyBwaGFzZSAz IGZvciBTMyBiYWNrZWQgR0MKPiAtICAgICAgICAgICAgICAgIGluZm8hKCJTdGFydCBHQyBwaGFz ZTMgKHN3ZWVwIHVudXNlZCBjaHVuayBtYXJrZXJzKSIpOwo+IC0KPiAtICAgICAgICAgICAgICAg IGxldCBtdXQgdG1wX2djX3N0YXR1cyA9IEdhcmJhZ2VDb2xsZWN0aW9uU3RhdHVzIHsKPiAtICAg ICAgICAgICAgICAgICAgICB1cGlkOiBTb21lKHVwaWQudG9fc3RyaW5nKCkpLAo+IC0gICAgICAg ICAgICAgICAgICAgIC4uRGVmYXVsdDo6ZGVmYXVsdCgpCj4gLSAgICAgICAgICAgICAgICB9Owo+ IC0gICAgICAgICAgICAgICAgc2VsZi5pbm5lci5jaHVua19zdG9yZS5zd2VlcF91bnVzZWRfY2h1 bmtzKAo+IC0gICAgICAgICAgICAgICAgICAgIG9sZGVzdF93cml0ZXIsCj4gLSAgICAgICAgICAg ICAgICAgICAgbWluX2F0aW1lLAo+IC0gICAgICAgICAgICAgICAgICAgICZtdXQgdG1wX2djX3N0 YXR1cywKPiAtICAgICAgICAgICAgICAgICAgICB3b3JrZXIsCj4gLSAgICAgICAgICAgICAgICAp PzsKPiAtICAgICAgICAgICAgfSBlbHNlIHsKPiAtICAgICAgICAgICAgICAgIHNlbGYuaW5uZXIu Y2h1bmtfc3RvcmUuc3dlZXBfdW51c2VkX2NodW5rcygKPiAtICAgICAgICAgICAgICAgICAgICBv bGRlc3Rfd3JpdGVyLAo+IC0gICAgICAgICAgICAgICAgICAgIG1pbl9hdGltZSwKPiAtICAgICAg ICAgICAgICAgICAgICAmbXV0IGdjX3N0YXR1cywKPiAtICAgICAgICAgICAgICAgICAgICB3b3Jr ZXIsCj4gLSAgICAgICAgICAgICAgICApPzsKPiAtICAgICAgICAgICAgfQo+IC0KPiAtICAgICAg ICAgICAgaWYgbGV0IFNvbWUoY2FjaGVfc3RhdHMpID0gJmdjX3N0YXR1cy5jYWNoZV9zdGF0cyB7 Cj4gLSAgICAgICAgICAgICAgICBsZXQgdG90YWxfY2FjaGVfY291bnRzID0gY2FjaGVfc3RhdHMu aGl0cyArIGNhY2hlX3N0YXRzLm1pc3NlczsKPiAtICAgICAgICAgICAgICAgIGlmIHRvdGFsX2Nh Y2hlX2NvdW50cyA+IDAgewo+IC0gICAgICAgICAgICAgICAgICAgIGxldCBjYWNoZV9oaXRfcmF0 aW8gPQo+IC0gICAgICAgICAgICAgICAgICAgICAgICAoY2FjaGVfc3RhdHMuaGl0cyBhcyBmNjQg KiAxMDAuKSAvIHRvdGFsX2NhY2hlX2NvdW50cyBhcyBmNjQ7Cj4gLSAgICAgICAgICAgICAgICAg ICAgaW5mbyEoCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICJDaHVuayBjYWNoZTogaGl0cyB7 fSwgbWlzc2VzIHt9IChoaXQgcmF0aW8ge2NhY2hlX2hpdF9yYXRpbzouMn0lKSIsCj4gLSAgICAg ICAgICAgICAgICAgICAgICAgIGNhY2hlX3N0YXRzLmhpdHMsIGNhY2hlX3N0YXRzLm1pc3NlcywK PiAtICAgICAgICAgICAgICAgICAgICApOwo+IC0gICAgICAgICAgICAgICAgfQo+IC0gICAgICAg ICAgICB9Cj4gLSAgICAgICAgICAgIGluZm8hKAo+IC0gICAgICAgICAgICAgICAgIlJlbW92ZWQg Z2FyYmFnZToge30iLAo+IC0gICAgICAgICAgICAgICAgSHVtYW5CeXRlOjpmcm9tKGdjX3N0YXR1 cy5yZW1vdmVkX2J5dGVzKSwKPiAtICAgICAgICAgICAgKTsKPiAtICAgICAgICAgICAgaW5mbyEo IlJlbW92ZWQgY2h1bmtzOiB7fSIsIGdjX3N0YXR1cy5yZW1vdmVkX2NodW5rcyk7Cj4gLSAgICAg ICAgICAgIGlmIGdjX3N0YXR1cy5wZW5kaW5nX2J5dGVzID4gMCB7Cj4gLSAgICAgICAgICAgICAg ICBpbmZvISgKPiAtICAgICAgICAgICAgICAgICAgICAiUGVuZGluZyByZW1vdmFsczoge30gKGlu IHt9IGNodW5rcykiLAo+IC0gICAgICAgICAgICAgICAgICAgIEh1bWFuQnl0ZTo6ZnJvbShnY19z dGF0dXMucGVuZGluZ19ieXRlcyksCj4gLSAgICAgICAgICAgICAgICAgICAgZ2Nfc3RhdHVzLnBl bmRpbmdfY2h1bmtzLAo+IC0gICAgICAgICAgICAgICAgKTsKPiAtICAgICAgICAgICAgfQo+IC0g ICAgICAgICAgICBpZiBnY19zdGF0dXMucmVtb3ZlZF9iYWQgPiAwIHsKPiAtICAgICAgICAgICAg ICAgIGluZm8hKCJSZW1vdmVkIGJhZCBjaHVua3M6IHt9IiwgZ2Nfc3RhdHVzLnJlbW92ZWRfYmFk KTsKPiAtICAgICAgICAgICAgfQo+IC0KPiAtICAgICAgICAgICAgaWYgZ2Nfc3RhdHVzLnN0aWxs X2JhZCA+IDAgewo+IC0gICAgICAgICAgICAgICAgaW5mbyEoIkxlZnRvdmVyIGJhZCBjaHVua3M6 IHt9IiwgZ2Nfc3RhdHVzLnN0aWxsX2JhZCk7Cj4gLSAgICAgICAgICAgIH0KPiAtCj4gLSAgICAg ICAgICAgIGluZm8hKAo+IC0gICAgICAgICAgICAgICAgIk9yaWdpbmFsIGRhdGEgdXNhZ2U6IHt9 IiwKPiAtICAgICAgICAgICAgICAgIEh1bWFuQnl0ZTo6ZnJvbShnY19zdGF0dXMuaW5kZXhfZGF0 YV9ieXRlcyksCj4gLSAgICAgICAgICAgICk7Cj4gLQo+IC0gICAgICAgICAgICBpZiBnY19zdGF0 dXMuaW5kZXhfZGF0YV9ieXRlcyA+IDAgewo+IC0gICAgICAgICAgICAgICAgbGV0IGNvbXBfcGVy ID0KPiAtICAgICAgICAgICAgICAgICAgICAoZ2Nfc3RhdHVzLmRpc2tfYnl0ZXMgYXMgZjY0ICog MTAwLikgLyBnY19zdGF0dXMuaW5kZXhfZGF0YV9ieXRlcyBhcyBmNjQ7Cj4gLSAgICAgICAgICAg ICAgICBpbmZvISgKPiAtICAgICAgICAgICAgICAgICAgICAiT24tRGlzayB1c2FnZToge30gKHtj b21wX3BlcjouMn0lKSIsCj4gLSAgICAgICAgICAgICAgICAgICAgSHVtYW5CeXRlOjpmcm9tKGdj X3N0YXR1cy5kaXNrX2J5dGVzKQo+IC0gICAgICAgICAgICAgICAgKTsKPiAtICAgICAgICAgICAg fQo+IC0KPiAtICAgICAgICAgICAgaW5mbyEoIk9uLURpc2sgY2h1bmtzOiB7fSIsIGdjX3N0YXR1 cy5kaXNrX2NodW5rcyk7Cj4gLQo+IC0gICAgICAgICAgICBsZXQgZGVkdXBsaWNhdGlvbl9mYWN0 b3IgPSBpZiBnY19zdGF0dXMuZGlza19ieXRlcyA+IDAgewo+IC0gICAgICAgICAgICAgICAgKGdj X3N0YXR1cy5pbmRleF9kYXRhX2J5dGVzIGFzIGY2NCkgLyAoZ2Nfc3RhdHVzLmRpc2tfYnl0ZXMg YXMgZjY0KQo+IC0gICAgICAgICAgICB9IGVsc2Ugewo+IC0gICAgICAgICAgICAgICAgMS4wCj4g LSAgICAgICAgICAgIH07Cj4gLQo+IC0gICAgICAgICAgICBpbmZvISgiRGVkdXBsaWNhdGlvbiBm YWN0b3I6IHtkZWR1cGxpY2F0aW9uX2ZhY3RvcjouMn0iKTsKPiAtCj4gLSAgICAgICAgICAgIGlm IGdjX3N0YXR1cy5kaXNrX2NodW5rcyA+IDAgewo+IC0gICAgICAgICAgICAgICAgbGV0IGF2Z19j aHVuayA9IGdjX3N0YXR1cy5kaXNrX2J5dGVzIC8gKGdjX3N0YXR1cy5kaXNrX2NodW5rcyBhcyB1 NjQpOwo+IC0gICAgICAgICAgICAgICAgaW5mbyEoIkF2ZXJhZ2UgY2h1bmsgc2l6ZToge30iLCBI dW1hbkJ5dGU6OmZyb20oYXZnX2NodW5rKSk7Cj4gLSAgICAgICAgICAgIH0KPiAtCj4gLSAgICAg ICAgICAgIGlmIGxldCBPayhzZXJpYWxpemVkKSA9IHNlcmRlX2pzb246OnRvX3N0cmluZygmZ2Nf c3RhdHVzKSB7Cj4gLSAgICAgICAgICAgICAgICBsZXQgbXV0IHBhdGggPSBzZWxmLmJhc2VfcGF0 aCgpOwo+IC0gICAgICAgICAgICAgICAgcGF0aC5wdXNoKCIuZ2Mtc3RhdHVzIik7Cj4gLQo+IC0g ICAgICAgICAgICAgICAgbGV0IGJhY2t1cF91c2VyID0gcGJzX2NvbmZpZzo6YmFja3VwX3VzZXIo KT87Cj4gLSAgICAgICAgICAgICAgICBsZXQgbW9kZSA9IG5peDo6c3lzOjpzdGF0OjpNb2RlOjpm cm9tX2JpdHNfdHJ1bmNhdGUoMG8wNjQ0KTsKPiAtICAgICAgICAgICAgICAgIC8vIHNldCB0aGUg Y29ycmVjdCBvd25lci9ncm91cC9wZXJtaXNzaW9ucyB3aGlsZSBzYXZpbmcgZmlsZQo+IC0gICAg ICAgICAgICAgICAgLy8gb3duZXIocncpID0gYmFja3VwLCBncm91cChyKT0gYmFja3VwCj4gLSAg ICAgICAgICAgICAgICBsZXQgb3B0aW9ucyA9IENyZWF0ZU9wdGlvbnM6Om5ldygpCj4gLSAgICAg ICAgICAgICAgICAgICAgLnBlcm0obW9kZSkKPiAtICAgICAgICAgICAgICAgICAgICAub3duZXIo YmFja3VwX3VzZXIudWlkKQo+IC0gICAgICAgICAgICAgICAgICAgIC5ncm91cChiYWNrdXBfdXNl ci5naWQpOwo+IC0KPiAtICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMKPiAtICAgICAg ICAgICAgICAgIGxldCBfID0gcmVwbGFjZV9maWxlKHBhdGgsIHNlcmlhbGl6ZWQuYXNfYnl0ZXMo KSwgb3B0aW9ucywgZmFsc2UpOwo+IC0gICAgICAgICAgICB9Cj4gLQo+IC0gICAgICAgICAgICAq c2VsZi5pbm5lci5sYXN0X2djX3N0YXR1cy5sb2NrKCkudW53cmFwKCkgPSBnY19zdGF0dXM7Cj4g LSAgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAvLyBhdm9pZHMgdGhhdCB3ZSBydW4gR0MgaWYg YW4gb2xkIGRhZW1vbiBwcm9jZXNzIGhhcyBzdGlsbCBhCj4gKyAgICAgICAgLy8gcnVubmluZyBi YWNrdXAgd3JpdGVyLCB3aGljaCBpcyBub3Qgc2F2ZSBhcyB3ZSBoYXZlIG5vICJvbGRlc3QKPiAr ICAgICAgICAvLyB3cml0ZXIiIGluZm9ybWF0aW9uIGFuZCB0aHVzIG5vIHNhZmUgYXRpbWUgY3V0 b2ZmCj4gKyAgICAgICAgaWYgc2VsZi5nYXJiYWdlX2NvbGxlY3Rpb25fcnVubmluZygpIHsKPiAg ICAgICAgICAgICAgIGJhaWwhKCJTdGFydCBHQyBmYWlsZWQgLSAoYWxyZWFkeSBydW5uaW5nL2xv Y2tlZCkiKTsKPiAgICAgICAgICAgfQoKbml0OiB0aGUgb3JkZXJpbmcgb2YgTXV0ZXggbG9ja2lu ZyBhbmQgZ2V0dGluZyB0aGUgZXhjbHVzaXZlIHByb2Nlc3MgCmxvY2sgYXJlIG5vdyByZXZlcnNl ZC4gTm90IGFuIGlzc3VlIGJ1dCBtYXliZSB3ZSBzaG91bGQgc3RpY2sgdG8gdGhlIApjdXJyZW50 IG9yZGVyIGhlcmUuIE1ha2VzIGFsc28gdGhlIGRpZmYgc21hbGxlciBhcyB5b3UgYWxyZWFkeSBt ZW50aW9uZWQgCmluIG9mZmxpc3QgZGlzY3Vzc2lvbi4KCj4gKyAgICAgICAgaWYgbGV0IE9rKGV4 Y2x1c2l2ZV9sb2NrKSA9IHNlbGYuaW5uZXIuY2h1bmtfc3RvcmUudHJ5X2V4Y2x1c2l2ZV9sb2Nr KCkgewo+ICsgICAgICAgICAgICAvLyBrZWVwIHRoZSBleGNsdXNpdmUgbG9jayBhcm91bmQgZm9y IHRoZSBkdXJhdGlvbiBvZiBHQwo+ICsgICAgICAgICAgICBsZXQgbXV0IGxvY2sgPSBzZWxmLmlu bmVyLmdjX211dGV4LmxvY2soKS51bndyYXAoKTsKPiArICAgICAgICAgICAgaWYgbG9jay5pc19z b21lKCkgewo+ICsgICAgICAgICAgICAgICAgYmFpbCEoIk9idGFpbmVkIGV4Y2x1c2l2ZSBsb2Nr IG9uIGRhdGFzdG9yZSB0d2ljZSAtIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEiKTsKPiArICAg ICAgICAgICAgfQo+ICsgICAgICAgICAgICAqbG9jayA9IFNvbWUoZXhjbHVzaXZlX2xvY2spOwo+ ICsgICAgICAgICAgICBkcm9wKGxvY2spOwo+ICAgCj4gKyAgICAgICAgICAgIGxldCByZXMgPSBz ZWxmLmdhcmJhZ2VfY29sbGVjdGlvbl9pbXBsKHdvcmtlciwgdXBpZCk7Cj4gKwo+ICsgICAgICAg ICAgICAvLyBhbmQgbm93IGRyb3AgaXQgYWdhaW4KPiArICAgICAgICAgICAgbGV0IG11dCBsb2Nr ID0gc2VsZi5pbm5lci5nY19tdXRleC5sb2NrKCkudW53cmFwKCk7Cj4gKyAgICAgICAgICAgIGlm IGxvY2sudGFrZSgpLmlzX25vbmUoKSB7Cj4gKyAgICAgICAgICAgICAgICB3YXJuISgiTG9zdCBl eGNsdXNpdmUgZGF0YXN0b3JlIGxvY2sgZHVyaW5nIEdDIC0gdGhpcyBzaG91bGQgbmV2ZXIgaGFw cGVuISIpOwo+ICsgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgICByZXMKPiArICAgICAg ICB9IGVsc2Ugewo+ICsgICAgICAgICAgICBiYWlsISgiU3RhcnQgR0MgZmFpbGVkIC0gYWxyZWFk eSBydW5uaW5nIG9yIGJhY2t1cCB3cml0ZXIgaW4gb2xkIHByb2Nlc3MgaG9sZHMgbG9jayIpOwo+ ICsgICAgICAgIH0KPiArICAgIH0KPiArCj4gKyAgICBmbiBnYXJiYWdlX2NvbGxlY3Rpb25faW1w bCgKPiArICAgICAgICAmc2VsZiwKPiArICAgICAgICB3b3JrZXI6ICZkeW4gV29ya2VyVGFza0Nv bnRleHQsCj4gKyAgICAgICAgdXBpZDogJlVQSUQsCj4gKyAgICApIC0+IFJlc3VsdDwoKSwgRXJy b3I+IHsKPiArICAgICAgICBsZXQgKGNvbmZpZywgX2RpZ2VzdCkgPSBwYnNfY29uZmlnOjpkYXRh c3RvcmU6OmNvbmZpZygpPzsKPiArICAgICAgICBsZXQgZ2Nfc3RvcmVfY29uZmlnOiBEYXRhU3Rv cmVDb25maWcgPSBjb25maWcubG9va3VwKCJkYXRhc3RvcmUiLCBzZWxmLm5hbWUoKSk/Owo+ICsg ICAgICAgIGxldCBhbGxfc3RvcmVzID0gY29uZmlnLmNvbnZlcnRfdG9fdHlwZWRfYXJyYXkoImRh dGFzdG9yZSIpPzsKPiArICAgICAgICBpZiBsZXQgRXJyKGVycikgPSBnY19zdG9yZV9jb25maWcu ZW5zdXJlX25vdF9uZXN0ZWQoJmFsbF9zdG9yZXMpIHsKPiArICAgICAgICAgICAgaW5mbyEoCj4g KyAgICAgICAgICAgICAgICAiQ3VycmVudCBkYXRhc3RvcmUgcGF0aDoge3BhdGh9IiwKPiArICAg ICAgICAgICAgICAgIHBhdGggPSBnY19zdG9yZV9jb25maWcuYWJzb2x1dGVfcGF0aCgpCj4gKyAg ICAgICAgICAgICk7Cj4gKyAgICAgICAgICAgIGJhaWwhKCJBYm9ydGluZyBHQyBmb3Igc2FmZXR5 IHJlYXNvbnM6IHtlcnJ9Iik7Cj4gKyAgICAgICAgfQo+ICsKPiArICAgICAgICBsZXQgcGhhc2Ux X3N0YXJ0X3RpbWUgPSBwcm94bW94X3RpbWU6OmVwb2NoX2k2NCgpOwo+ICsgICAgICAgIGxldCBv bGRlc3Rfd3JpdGVyID0gc2VsZgo+ICsgICAgICAgICAgICAuaW5uZXIKPiArICAgICAgICAgICAg LmNodW5rX3N0b3JlCj4gKyAgICAgICAgICAgIC5vbGRlc3Rfd3JpdGVyKCkKPiArICAgICAgICAg ICAgLnVud3JhcF9vcihwaGFzZTFfc3RhcnRfdGltZSk7Cj4gKwo+ICsgICAgICAgIGxldCBtdXQg Z2Nfc3RhdHVzID0gR2FyYmFnZUNvbGxlY3Rpb25TdGF0dXMgewo+ICsgICAgICAgICAgICB1cGlk OiBTb21lKHVwaWQudG9fc3RyaW5nKCkpLAo+ICsgICAgICAgICAgICBjYWNoZV9zdGF0czogU29t ZShHYXJiYWdlQ29sbGVjdGlvbkNhY2hlU3RhdHM6OmRlZmF1bHQoKSksCj4gKyAgICAgICAgICAg IC4uRGVmYXVsdDo6ZGVmYXVsdCgpCj4gKyAgICAgICAgfTsKPiArICAgICAgICBsZXQgdHVuaW5n OiBEYXRhc3RvcmVUdW5pbmcgPSBzZXJkZV9qc29uOjpmcm9tX3ZhbHVlKAo+ICsgICAgICAgICAg ICBEYXRhc3RvcmVUdW5pbmc6OkFQSV9TQ0hFTUEKPiArICAgICAgICAgICAgICAgIC5wYXJzZV9w cm9wZXJ0eV9zdHJpbmcoZ2Nfc3RvcmVfY29uZmlnLnR1bmluZy5hc19kZXJlZigpLnVud3JhcF9v cigiIikpPywKPiArICAgICAgICApPzsKPiArCj4gKyAgICAgICAgbGV0IHMzX2NsaWVudCA9IG1h dGNoIHNlbGYuYmFja2VuZCgpPyB7Cj4gKyAgICAgICAgICAgIERhdGFzdG9yZUJhY2tlbmQ6OkZp bGVzeXN0ZW0gPT4gTm9uZSwKPiArICAgICAgICAgICAgRGF0YXN0b3JlQmFja2VuZDo6UzMoczNf Y2xpZW50KSA9PiB7Cj4gKyAgICAgICAgICAgICAgICBwcm94bW94X2FzeW5jOjpydW50aW1lOjpi bG9ja19vbihzM19jbGllbnQuaGVhZF9idWNrZXQoKSkKPiArICAgICAgICAgICAgICAgICAgICAu Y29udGV4dCgiZmFpbGVkIHRvIHJlYWNoIGJ1Y2tldCIpPzsKPiArICAgICAgICAgICAgICAgIFNv bWUoczNfY2xpZW50KQo+ICsgICAgICAgICAgICB9Cj4gKyAgICAgICAgfTsKPiArCj4gKyAgICAg ICAgaWYgdHVuaW5nLmdjX2F0aW1lX3NhZmV0eV9jaGVjay51bndyYXBfb3IodHJ1ZSkgewo+ICsg ICAgICAgICAgICBzZWxmLmlubmVyCj4gKyAgICAgICAgICAgICAgICAuY2h1bmtfc3RvcmUKPiAr ICAgICAgICAgICAgICAgIC5jaGVja19mc19hdGltZV91cGRhdGVzKHRydWUsIHMzX2NsaWVudC5j bG9uZSgpKQo+ICsgICAgICAgICAgICAgICAgLmNvbnRleHQoImF0aW1lIHNhZmV0eSBjaGVjayBm YWlsZWQiKT87Cj4gKyAgICAgICAgICAgIGluZm8hKCJBY2Nlc3MgdGltZSB1cGRhdGUgY2hlY2sg c3VjY2Vzc2Z1bCwgcHJvY2VlZGluZyB3aXRoIEdDLiIpOwo+ICsgICAgICAgIH0gZWxzZSB7Cj4g KyAgICAgICAgICAgIGluZm8hKCJBY2Nlc3MgdGltZSB1cGRhdGUgY2hlY2sgZGlzYWJsZWQgYnkg ZGF0YXN0b3JlIHR1bmluZyBvcHRpb25zLiIpOwo+ICsgICAgICAgIH07Cj4gKwo+ICsgICAgICAg IC8vIEZhbGxiYWNrIHRvIGRlZmF1bHQgMjRoIDVtIGlmIG5vdCBzZXQKPiArICAgICAgICBsZXQg Y3V0b2ZmID0gdHVuaW5nCj4gKyAgICAgICAgICAgIC5nY19hdGltZV9jdXRvZmYKPiArICAgICAg ICAgICAgLm1hcCh8Y3V0b2ZmfCBjdXRvZmYgKiA2MCkKPiArICAgICAgICAgICAgLnVud3JhcF9v cigzNjAwICogMjQgKyAzMDApOwo+ICsKPiArICAgICAgICBsZXQgbXV0IG1pbl9hdGltZSA9IHBo YXNlMV9zdGFydF90aW1lIC0gY3V0b2ZmIGFzIGk2NDsKPiArICAgICAgICBpbmZvISgKPiArICAg ICAgICAgICAgIlVzaW5nIGFjY2VzcyB0aW1lIGN1dG9mZiB7fSwgbWluaW11bSBhY2Nlc3MgdGlt ZSBpcyB7fSIsCj4gKyAgICAgICAgICAgIFRpbWVTcGFuOjpmcm9tKER1cmF0aW9uOjpmcm9tX3Nl Y3MoY3V0b2ZmIGFzIHU2NCkpLAo+ICsgICAgICAgICAgICBwcm94bW94X3RpbWU6OmVwb2NoX3Rv X3JmYzMzMzlfdXRjKG1pbl9hdGltZSk/LAo+ICsgICAgICAgICk7Cj4gKyAgICAgICAgaWYgb2xk ZXN0X3dyaXRlciA8IG1pbl9hdGltZSB7Cj4gKyAgICAgICAgICAgIG1pbl9hdGltZSA9IG9sZGVz dF93cml0ZXIgLSAzMDA7IC8vIGFjY291bnQgZm9yIDUgbWluIHNhZmV0eSBnYXAKPiArICAgICAg ICAgICAgaW5mbyEoCj4gKyAgICAgICAgICAgICAgICAiT2xkZXN0IGJhY2t1cCB3cml0ZXIgc3Rh cnRlZCBhdCB7fSwgZXh0ZW5kaW5nIG1pbmltdW0gYWNjZXNzIHRpbWUgdG8ge30iLAo+ICsgICAg ICAgICAgICAgICAgVGltZVNwYW46OmZyb20oRHVyYXRpb246OmZyb21fc2VjcyhvbGRlc3Rfd3Jp dGVyIGFzIHU2NCkpLAo+ICsgICAgICAgICAgICAgICAgcHJveG1veF90aW1lOjplcG9jaF90b19y ZmMzMzM5X3V0YyhtaW5fYXRpbWUpPywKPiArICAgICAgICAgICAgKTsKPiArICAgICAgICB9Cj4g Kwo+ICsgICAgICAgIGxldCB0dW5pbmc6IERhdGFzdG9yZVR1bmluZyA9IHNlcmRlX2pzb246OmZy b21fdmFsdWUoCj4gKyAgICAgICAgICAgIERhdGFzdG9yZVR1bmluZzo6QVBJX1NDSEVNQQo+ICsg ICAgICAgICAgICAgICAgLnBhcnNlX3Byb3BlcnR5X3N0cmluZyhnY19zdG9yZV9jb25maWcudHVu aW5nLmFzX2RlcmVmKCkudW53cmFwX29yKCIiKSk/LAo+ICsgICAgICAgICk/Owo+ICsgICAgICAg IGxldCBnY19jYWNoZV9jYXBhY2l0eSA9IGlmIGxldCBTb21lKGNhcGFjaXR5KSA9IHR1bmluZy5n Y19jYWNoZV9jYXBhY2l0eSB7Cj4gKyAgICAgICAgICAgIGluZm8hKCJVc2luZyBjaHVuayBkaWdl c3QgY2FjaGUgY2FwYWNpdHkgb2Yge2NhcGFjaXR5fS4iKTsKPiArICAgICAgICAgICAgY2FwYWNp dHkKPiArICAgICAgICB9IGVsc2Ugewo+ICsgICAgICAgICAgICAxMDI0ICogMTAyNAo+ICsgICAg ICAgIH07Cj4gKwo+ICsgICAgICAgIGluZm8hKCJTdGFydCBHQyBwaGFzZTEgKG1hcmsgdXNlZCBj aHVua3MpIik7Cj4gKwo+ICsgICAgICAgIHNlbGYubWFya191c2VkX2NodW5rcygKPiArICAgICAg ICAgICAgJm11dCBnY19zdGF0dXMsCj4gKyAgICAgICAgICAgIHdvcmtlciwKPiArICAgICAgICAg ICAgZ2NfY2FjaGVfY2FwYWNpdHksCj4gKyAgICAgICAgICAgIHMzX2NsaWVudC5hc19yZWYoKS5j bG9uZWQoKSwKPiArICAgICAgICApCj4gKyAgICAgICAgLmNvbnRleHQoIm1hcmtpbmcgdXNlZCBj aHVua3MgZmFpbGVkIik/Owo+ICsKPiArICAgICAgICBpbmZvISgiU3RhcnQgR0MgcGhhc2UyIChz d2VlcCB1bnVzZWQgY2h1bmtzKSIpOwo+ICsKPiArICAgICAgICBpZiBsZXQgU29tZShyZWYgczNf Y2xpZW50KSA9IHMzX2NsaWVudCB7Cj4gKyAgICAgICAgICAgIGxldCBtdXQgY2h1bmtfY291bnQg PSAwOwo+ICsgICAgICAgICAgICBsZXQgcHJlZml4ID0gUzNQYXRoUHJlZml4OjpTb21lKCIuY2h1 bmtzLyIudG9fc3RyaW5nKCkpOwo+ICsgICAgICAgICAgICAvLyBPcGVyYXRlcyBpbiBiYXRjaGVz IG9mIDEwMDAgb2JqZWN0cyBtYXggcGVyIHJlcXVlc3QKPiArICAgICAgICAgICAgbGV0IG11dCBs aXN0X2J1Y2tldF9yZXN1bHQgPQo+ICsgICAgICAgICAgICAgICAgcHJveG1veF9hc3luYzo6cnVu dGltZTo6YmxvY2tfb24oczNfY2xpZW50Lmxpc3Rfb2JqZWN0c192MigmcHJlZml4LCBOb25lKSkK PiArICAgICAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGxpc3QgY2h1bmsgaW4g czMgb2JqZWN0IHN0b3JlIik/Owo+ICsKPiArICAgICAgICAgICAgbGV0IG11dCBkZWxldGVfbGlz dCA9IFZlYzo6d2l0aF9jYXBhY2l0eSgxMDAwKTsKPiArICAgICAgICAgICAgbG9vcCB7Cj4gKyAg ICAgICAgICAgICAgICBsZXQgbG9jayA9IHNlbGYuaW5uZXIuY2h1bmtfc3RvcmUubXV0ZXgoKS5s b2NrKCkudW53cmFwKCk7Cj4gKwo+ICsgICAgICAgICAgICAgICAgZm9yIGNvbnRlbnQgaW4gbGlz dF9idWNrZXRfcmVzdWx0LmNvbnRlbnRzIHsKPiArICAgICAgICAgICAgICAgICAgICBpZiBzZWxm Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXJrX2NodW5rX2Zvcl9vYmplY3Rfa2V5KAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnQua2V5LAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29udGVudC5zaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbWluX2F0aW1lLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkZXN0X3dy aXRlciwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtdXQgZGVsZXRlX2xpc3QsCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXV0IGdjX3N0YXR1cywKPiArICAgICAgICAg ICAgICAgICAgICAgICAgKQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAud2l0aF9jb250ZXh0 KHx8IHsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCEoImZhaWxlZCB0byBt YXJrIGNodW5rIGZvciBvYmplY3Qga2V5IHt9IiwgY29udGVudC5rZXkpCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgIH0pPwo+ICsgICAgICAgICAgICAgICAgICAgIHsKPiArICAgICAgICAgICAg ICAgICAgICAgICAgY2h1bmtfY291bnQgKz0gMTsKPiArICAgICAgICAgICAgICAgICAgICB9Cj4g KyAgICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgICAgICAgaWYgIWRlbGV0ZV9saXN0 LmlzX2VtcHR5KCkgewo+ICsgICAgICAgICAgICAgICAgICAgIGxldCBkZWxldGVfb2JqZWN0c19y ZXN1bHQgPQo+ICsgICAgICAgICAgICAgICAgICAgICAgICBwcm94bW94X2FzeW5jOjpydW50aW1l OjpibG9ja19vbihzM19jbGllbnQuZGVsZXRlX29iamVjdHMoJmRlbGV0ZV9saXN0KSk/Owo+ICsg ICAgICAgICAgICAgICAgICAgIGlmIGxldCBTb21lKF9lcnIpID0gZGVsZXRlX29iamVjdHNfcmVz dWx0LmVycm9yIHsKPiArICAgICAgICAgICAgICAgICAgICAgICAgYmFpbCEoImZhaWxlZCB0byBk ZWxldGUgc29tZSBvYmplY3RzIik7Cj4gKyAgICAgICAgICAgICAgICAgICAgfQo+ICsgICAgICAg ICAgICAgICAgICAgIGRlbGV0ZV9saXN0LmNsZWFyKCk7Cj4gKyAgICAgICAgICAgICAgICB9Cj4g Kwo+ICsgICAgICAgICAgICAgICAgZHJvcChsb2NrKTsKPiArCj4gKyAgICAgICAgICAgICAgICAv LyBQcm9jZXNzIG5leHQgYmF0Y2ggb2YgY2h1bmtzIGlmIHRoZXJlIGlzIG1vcmUKPiArICAgICAg ICAgICAgICAgIGlmIGxpc3RfYnVja2V0X3Jlc3VsdC5pc190cnVuY2F0ZWQgewo+ICsgICAgICAg ICAgICAgICAgICAgIGxpc3RfYnVja2V0X3Jlc3VsdCA9Cj4gKyAgICAgICAgICAgICAgICAgICAg ICAgIHByb3htb3hfYXN5bmM6OnJ1bnRpbWU6OmJsb2NrX29uKHMzX2NsaWVudC5saXN0X29iamVj dHNfdjIoCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlZml4LAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgbGlzdF9idWNrZXRfcmVzdWx0Lm5leHRfY29udGludWF0aW9u X3Rva2VuLmFzX2RlcmVmKCksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICkpPzsKPiArICAg ICAgICAgICAgICAgICAgICBjb250aW51ZTsKPiArICAgICAgICAgICAgICAgIH0KPiArCj4gKyAg ICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgICAgICAgfQo+ICsgICAgICAgICAgICBpbmZv ISgicHJvY2Vzc2VkIHtjaHVua19jb3VudH0gdG90YWwgY2h1bmtzIik7Cj4gKwo+ICsgICAgICAg ICAgICAvLyBQaGFzZSAyIEdDIG9mIEZpbGVzeXN0ZW0gYmFja2VkIHN0b3JhZ2UgaXMgcGhhc2Ug MyBmb3IgUzMgYmFja2VkIEdDCj4gKyAgICAgICAgICAgIGluZm8hKCJTdGFydCBHQyBwaGFzZTMg KHN3ZWVwIHVudXNlZCBjaHVuayBtYXJrZXJzKSIpOwo+ICsKPiArICAgICAgICAgICAgbGV0IG11 dCB0bXBfZ2Nfc3RhdHVzID0gR2FyYmFnZUNvbGxlY3Rpb25TdGF0dXMgewo+ICsgICAgICAgICAg ICAgICAgdXBpZDogU29tZSh1cGlkLnRvX3N0cmluZygpKSwKPiArICAgICAgICAgICAgICAgIC4u RGVmYXVsdDo6ZGVmYXVsdCgpCj4gKyAgICAgICAgICAgIH07Cj4gKyAgICAgICAgICAgIHNlbGYu aW5uZXIuY2h1bmtfc3RvcmUuc3dlZXBfdW51c2VkX2NodW5rcygKPiArICAgICAgICAgICAgICAg IG9sZGVzdF93cml0ZXIsCj4gKyAgICAgICAgICAgICAgICBtaW5fYXRpbWUsCj4gKyAgICAgICAg ICAgICAgICAmbXV0IHRtcF9nY19zdGF0dXMsCj4gKyAgICAgICAgICAgICAgICB3b3JrZXIsCj4g KyAgICAgICAgICAgICk/Owo+ICsgICAgICAgIH0gZWxzZSB7Cj4gKyAgICAgICAgICAgIHNlbGYu aW5uZXIuY2h1bmtfc3RvcmUuc3dlZXBfdW51c2VkX2NodW5rcygKPiArICAgICAgICAgICAgICAg IG9sZGVzdF93cml0ZXIsCj4gKyAgICAgICAgICAgICAgICBtaW5fYXRpbWUsCj4gKyAgICAgICAg ICAgICAgICAmbXV0IGdjX3N0YXR1cywKPiArICAgICAgICAgICAgICAgIHdvcmtlciwKPiArICAg ICAgICAgICAgKT87Cj4gKyAgICAgICAgfQo+ICsKPiArICAgICAgICBpZiBsZXQgU29tZShjYWNo ZV9zdGF0cykgPSAmZ2Nfc3RhdHVzLmNhY2hlX3N0YXRzIHsKPiArICAgICAgICAgICAgbGV0IHRv dGFsX2NhY2hlX2NvdW50cyA9IGNhY2hlX3N0YXRzLmhpdHMgKyBjYWNoZV9zdGF0cy5taXNzZXM7 Cj4gKyAgICAgICAgICAgIGlmIHRvdGFsX2NhY2hlX2NvdW50cyA+IDAgewo+ICsgICAgICAgICAg ICAgICAgbGV0IGNhY2hlX2hpdF9yYXRpbyA9IChjYWNoZV9zdGF0cy5oaXRzIGFzIGY2NCAqIDEw MC4pIC8gdG90YWxfY2FjaGVfY291bnRzIGFzIGY2NDsKPiArICAgICAgICAgICAgICAgIGluZm8h KAo+ICsgICAgICAgICAgICAgICAgICAgICJDaHVuayBjYWNoZTogaGl0cyB7fSwgbWlzc2VzIHt9 IChoaXQgcmF0aW8ge2NhY2hlX2hpdF9yYXRpbzouMn0lKSIsCj4gKyAgICAgICAgICAgICAgICAg ICAgY2FjaGVfc3RhdHMuaGl0cywgY2FjaGVfc3RhdHMubWlzc2VzLAo+ICsgICAgICAgICAgICAg ICAgKTsKPiArICAgICAgICAgICAgfQo+ICsgICAgICAgIH0KPiArICAgICAgICBpbmZvISgKPiAr ICAgICAgICAgICAgIlJlbW92ZWQgZ2FyYmFnZToge30iLAo+ICsgICAgICAgICAgICBIdW1hbkJ5 dGU6OmZyb20oZ2Nfc3RhdHVzLnJlbW92ZWRfYnl0ZXMpLAo+ICsgICAgICAgICk7Cj4gKyAgICAg ICAgaW5mbyEoIlJlbW92ZWQgY2h1bmtzOiB7fSIsIGdjX3N0YXR1cy5yZW1vdmVkX2NodW5rcyk7 Cj4gKyAgICAgICAgaWYgZ2Nfc3RhdHVzLnBlbmRpbmdfYnl0ZXMgPiAwIHsKPiArICAgICAgICAg ICAgaW5mbyEoCj4gKyAgICAgICAgICAgICAgICAiUGVuZGluZyByZW1vdmFsczoge30gKGluIHt9 IGNodW5rcykiLAo+ICsgICAgICAgICAgICAgICAgSHVtYW5CeXRlOjpmcm9tKGdjX3N0YXR1cy5w ZW5kaW5nX2J5dGVzKSwKPiArICAgICAgICAgICAgICAgIGdjX3N0YXR1cy5wZW5kaW5nX2NodW5r cywKPiArICAgICAgICAgICAgKTsKPiArICAgICAgICB9Cj4gKyAgICAgICAgaWYgZ2Nfc3RhdHVz LnJlbW92ZWRfYmFkID4gMCB7Cj4gKyAgICAgICAgICAgIGluZm8hKCJSZW1vdmVkIGJhZCBjaHVu a3M6IHt9IiwgZ2Nfc3RhdHVzLnJlbW92ZWRfYmFkKTsKPiArICAgICAgICB9Cj4gKwo+ICsgICAg ICAgIGlmIGdjX3N0YXR1cy5zdGlsbF9iYWQgPiAwIHsKPiArICAgICAgICAgICAgaW5mbyEoIkxl ZnRvdmVyIGJhZCBjaHVua3M6IHt9IiwgZ2Nfc3RhdHVzLnN0aWxsX2JhZCk7Cj4gKyAgICAgICAg fQo+ICsKPiArICAgICAgICBpbmZvISgKPiArICAgICAgICAgICAgIk9yaWdpbmFsIGRhdGEgdXNh Z2U6IHt9IiwKPiArICAgICAgICAgICAgSHVtYW5CeXRlOjpmcm9tKGdjX3N0YXR1cy5pbmRleF9k YXRhX2J5dGVzKSwKPiArICAgICAgICApOwo+ICsKPiArICAgICAgICBpZiBnY19zdGF0dXMuaW5k ZXhfZGF0YV9ieXRlcyA+IDAgewo+ICsgICAgICAgICAgICBsZXQgY29tcF9wZXIgPSAoZ2Nfc3Rh dHVzLmRpc2tfYnl0ZXMgYXMgZjY0ICogMTAwLikgLyBnY19zdGF0dXMuaW5kZXhfZGF0YV9ieXRl cyBhcyBmNjQ7Cj4gKyAgICAgICAgICAgIGluZm8hKAo+ICsgICAgICAgICAgICAgICAgIk9uLURp c2sgdXNhZ2U6IHt9ICh7Y29tcF9wZXI6LjJ9JSkiLAo+ICsgICAgICAgICAgICAgICAgSHVtYW5C eXRlOjpmcm9tKGdjX3N0YXR1cy5kaXNrX2J5dGVzKQo+ICsgICAgICAgICAgICApOwo+ICsgICAg ICAgIH0KPiArCj4gKyAgICAgICAgaW5mbyEoIk9uLURpc2sgY2h1bmtzOiB7fSIsIGdjX3N0YXR1 cy5kaXNrX2NodW5rcyk7Cj4gKwo+ICsgICAgICAgIGxldCBkZWR1cGxpY2F0aW9uX2ZhY3RvciA9 IGlmIGdjX3N0YXR1cy5kaXNrX2J5dGVzID4gMCB7Cj4gKyAgICAgICAgICAgIChnY19zdGF0dXMu aW5kZXhfZGF0YV9ieXRlcyBhcyBmNjQpIC8gKGdjX3N0YXR1cy5kaXNrX2J5dGVzIGFzIGY2NCkK PiArICAgICAgICB9IGVsc2Ugewo+ICsgICAgICAgICAgICAxLjAKPiArICAgICAgICB9Owo+ICsK PiArICAgICAgICBpbmZvISgiRGVkdXBsaWNhdGlvbiBmYWN0b3I6IHtkZWR1cGxpY2F0aW9uX2Zh Y3RvcjouMn0iKTsKPiArCj4gKyAgICAgICAgaWYgZ2Nfc3RhdHVzLmRpc2tfY2h1bmtzID4gMCB7 Cj4gKyAgICAgICAgICAgIGxldCBhdmdfY2h1bmsgPSBnY19zdGF0dXMuZGlza19ieXRlcyAvIChn Y19zdGF0dXMuZGlza19jaHVua3MgYXMgdTY0KTsKPiArICAgICAgICAgICAgaW5mbyEoIkF2ZXJh Z2UgY2h1bmsgc2l6ZToge30iLCBIdW1hbkJ5dGU6OmZyb20oYXZnX2NodW5rKSk7Cj4gKyAgICAg ICAgfQo+ICsKPiArICAgICAgICBpZiBsZXQgT2soc2VyaWFsaXplZCkgPSBzZXJkZV9qc29uOjp0 b19zdHJpbmcoJmdjX3N0YXR1cykgewo+ICsgICAgICAgICAgICBsZXQgbXV0IHBhdGggPSBzZWxm LmJhc2VfcGF0aCgpOwo+ICsgICAgICAgICAgICBwYXRoLnB1c2goIi5nYy1zdGF0dXMiKTsKPiAr Cj4gKyAgICAgICAgICAgIGxldCBiYWNrdXBfdXNlciA9IHBic19jb25maWc6OmJhY2t1cF91c2Vy KCk/Owo+ICsgICAgICAgICAgICBsZXQgbW9kZSA9IG5peDo6c3lzOjpzdGF0OjpNb2RlOjpmcm9t X2JpdHNfdHJ1bmNhdGUoMG8wNjQ0KTsKPiArICAgICAgICAgICAgLy8gc2V0IHRoZSBjb3JyZWN0 IG93bmVyL2dyb3VwL3Blcm1pc3Npb25zIHdoaWxlIHNhdmluZyBmaWxlCj4gKyAgICAgICAgICAg IC8vIG93bmVyKHJ3KSA9IGJhY2t1cCwgZ3JvdXAocik9IGJhY2t1cAo+ICsgICAgICAgICAgICBs ZXQgb3B0aW9ucyA9IENyZWF0ZU9wdGlvbnM6Om5ldygpCj4gKyAgICAgICAgICAgICAgICAucGVy bShtb2RlKQo+ICsgICAgICAgICAgICAgICAgLm93bmVyKGJhY2t1cF91c2VyLnVpZCkKPiArICAg ICAgICAgICAgICAgIC5ncm91cChiYWNrdXBfdXNlci5naWQpOwo+ICsKPiArICAgICAgICAgICAg Ly8gaWdub3JlIGVycm9ycwo+ICsgICAgICAgICAgICBsZXQgXyA9IHJlcGxhY2VfZmlsZShwYXRo LCBzZXJpYWxpemVkLmFzX2J5dGVzKCksIG9wdGlvbnMsIGZhbHNlKTsKPiArICAgICAgICB9Cj4g Kwo+ICsgICAgICAgICpzZWxmLmlubmVyLmxhc3RfZ2Nfc3RhdHVzLmxvY2soKS51bndyYXAoKSA9 IGdjX3N0YXR1czsKPiAgICAgICAgICAgT2soKCkpCj4gICAgICAgfQo+ICAgCgoKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnBicy1kZXZlbCBtYWlsaW5n IGxpc3QKcGJzLWRldmVsQGxpc3RzLnByb3htb3guY29tCmh0dHBzOi8vbGlzdHMucHJveG1veC5j b20vY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3Bicy1kZXZlbAo=