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 C00C81FF15F for ; Sat, 26 Jul 2025 03:06:49 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 93ECF31ADA; Sat, 26 Jul 2025 03:07:07 +0200 (CEST) From: Aaron Lauterer To: pve-devel@lists.proxmox.com Date: Sat, 26 Jul 2025 03:05:56 +0200 Message-Id: <20250726010626.1496866-2-a.lauterer@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250726010626.1496866-1-a.lauterer@proxmox.com> References: <20250726010626.1496866-1-a.lauterer@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1753491982014 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.015 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: [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" VGhpcyB0b29sIGlzIGludGVuZGVkIHRvIG1pZ3JhdGUgdGhlIFByb3htb3ggVkUgKFBWRSkgUlJE IGRhdGEgZmlsZXMgdG8KdGhlIG5ldyBzY2hlbWEuCgpVcCB1bnRpbCBQVkU4IHRoZSBzY2hlbWEg aGFzIGJlZW4gdGhlIHNhbWUgZm9yIGEgbG9uZyB0aW1lLiBXaXRoIFBWRTkgd2UKaW50cm9kdWNl ZCBuZXcgY29sdW1ucyB0byBndWVzdHMgKHZtKSBhbmQgbm9kZXMuIFdlIGFsc28gc3dpdGNoZWQg YWxsCnR5cGVzICh2bSwgbm9kZSwgc3RvcmF0ZSkgdG8gdGhlIHNhbWUgYWdncmVnYXRpb24gc2No ZW1hcyBhcyB3ZSBkbyBpdCBpbgpQQlMuClRoZSByZXN1bHQgb2YgYm90aCBhcmUgYSBtdWNoIGZp bmVyIHJlc29sdXRpb24gZm9yIGxvbmcgdGltZSBzcGFucywgYnV0CmFsc28gbGFyZ2VyIFJSRCBm aWxlcy4KCiogbm9kZTogNzlLIC0+IDEuNE0KKiB2bTogNjZLIC0+IDEuM20KKiBzdG9yYWdlOiAx NEsgLT4gMTU2SwoKVGhlIG9sZCBkaXJlY3RvcmllcyBmb3IgVk1zIHVzZWQgdG8gYmUgaW4gYC92 YXIvbGliL3JyZGNhY2hlZC9kYi9gIHdpdGgKdGhlIGZvbGxvd2luZyBzdWIgZGlyZWN0b3JpZXM6 CgoqIG5vZGVzOiBgcHZlMi1ub2RlYAoqIGd1ZXN0cyAoVk0vQ1QpOiBgcHZlMi12bWAKKiBzdG9y YWdlOiBgcHZlMi1zdG9yYWdlYAoKV2l0aCB0aGlzIGNoYW5nZSB3ZSBhbHNvIGludHJvZHVjZSBh IG5ldyBrZXkgc2NoZW1hLCB0aGF0IG1ha2VzIGl0CmVhc2llciBpbiB0aGUgZnV0dXJlIHRvIGlu dHJvZHVjZSBuZXcgb25lcy4gSW5zdGVhZCBvZiB0aGUKYHB2ZXt2ZXJzaW9ufS17dHlwZX1gIHdl IGFyZSBzd2l0Y2hpbmcgdG8gYHB2ZS17dHlwZX0te3ZlcnNpb259YC4KClRoaXMgZW5hYmxlcyB1 cyB0byBhZGQgbmV3IGNvbHVtbnMgd2l0aCBhIG5ldyB2ZXJzaW9uLCB3aXRob3V0IGJyZWFraW5n Cm5vZGVzIHRoYXQgYXJlIG5vdCB5ZXQgdXBkYXRlZC4gV2UgYXJlIE5PVCBhbGxvd2VkIHRvIHJl bW92ZSBvciByZS11c2UKZXhpc3RpbmcgY29sdW1ucy4gVGhhdCB3b3VsZCBiZSBhIGJyZWFraW5n IGNoYW5nZS4KV2UgYXJlIGN1cnJlbnRseSBhdCB2ZXJzaW9uIDkuMC4gQnV0IGluIHRoZSBmdXR1 cmUsIGlmIG5lZWRlZCwgdGhpcyB0b29sCmNhbiBiZSBhZGFwdGVkIHRvIGRvIG90aGVyIG1pZ3Jh dGlvbnMgdG9vLgpGb3IgZXhhbXBsZSwge29sZCwgOS4wfSAtPiA5LjIsIHNob3VsZCB0aGF0IGJl IG5lY2Vzc2FyeS4KClRoZSBhY3R1YWwgbWlncmF0aW9uIGlzIGhhbmRsZWQgYnkgYGxpYnJyZGAg dG8gd2hpY2ggd2UgcGFzcyB0aGUgcGF0aCB0bwp0aGUgb2xkIGFuZCBuZXcgZmlsZXMsIGFuZCB0 aGUgbmV3IFJSRCBkZWZpbml0aW9ucy4gVGhlIGBycmRfY3JlYXRlX3IyYApjYWxsIHRoZW4gZG9l cyB0aGUgaGFyZCB3b3JrIG9mIG1pZ3JhdGluZyBhbmQgY29udmVydGluZyBleGlzaXRpbmcgZGF0 YQppbnRvIHRoZSBuZXcgZmlsZSBhbmQgYWdncmVnYXRpb24gc2NoZW1hLgoKVGhpcyBjYW4gdGFr ZSBzb21lIHRpbWUuIFF1aWNrIHRlc3RzIG9uIGEgUnl6ZW4gNzkwMFggd2l0aCB0aGUgZm9sbG93 aW5nCmZpbGVzOgoqIDEgbm9kZSBSUkQgZmlsZQoqIDEwayB2bSBSUkQgZmlsZXMKKiAxIHN0b3Jh Z2UgUlJEIGZpbGUKCnNob3dlZCB0aGUgZm9sbGluZyByZXN1bHRzOgoKKiAxIHRocmVhZDogIDE3 OS42MXMgdXNlciAxNC44MnMgc3lzdGVtIDEwMCUgY3B1IDM6MTQuMTcgdG90YWwKKiA0IHRocmVh ZHM6IDE4Ny41N3MgdXNlciAxNi45OHMgc3lzdGVtIDM5OSUgY3B1IDUxLjE5OCB0b3RhbAoKVGhp cyBpcyB3aHkgd2UgZG8gbm90IG1pZ3JhdGUgaW5saW5lLCBidXQgaGF2ZSBpdCBhcyBhIHNlcGFy YXRlIHN0ZXAKZHVyaW5nIHBhY2thZ2UgdXBncmFkZXMuCgpCZWhhdmlvcjogQnkgZGVmYXVsdCBu b3RoaW5nIHdpbGwgYmUgY2hhbmdlZCBhbmQgYSBkcnkgb3IgdGVzdCBydW4gd2lsbApoYXBwZW4u Ck9ubHkgaWYgdGhlIGAtLW1pZ3JhdGVgIHBhcmFtZXRlciBpcyBhZGRlZCB3aWxsIHRoZSBhY3R1 YWwgbWlncmF0aW9uIGJlCmRvbmUuCgpGb3IgZWFjaCBmb3VuZCBSUkQgc291cmNlIGZpbGUsIHRo ZSB0b29sIGNoZWNrcyBpZiBhIG1hdGNoaW5nIHRhcmdldApmaWxlIGFscmVhZHkgZXhpc3RzLiBC eSBkZWZhdWx0LCB0aG9zZSB3aWxsIGJlIHNraXBwZWQgdG8gbm90IG92ZXJ3cml0ZQp0YXJnZXQg ZmlsZXMgdGhhdCBtaWdodCBhbHJlYWR5IHN0b3JlIG5ld2VyIGRhdGEuCldpdGggdGhlIGAtLWZv cmNlYCBwYXJhbWV0ZXIgdGhpcyBjYW4gYmUgY2hhbmdlZC4KClRoYXQgbWVhbnMsIG9uZSBjYW4g cnVuIHRoZSB0b29sIG11bHRpcGxlIHRpbWVzICh3aXRob3V0IC0tZm9yY2UpIGFuZCBpdAp3aWxs IHBpY2sgdXAgd2hlcmUgaXQgbWlnaHQgaGF2ZSBsZWZ0IG9mZi4gRm9yIGV4YW1wbGUgaXQgdGhl IG1pZ3JhdGlvbgp3YXMgaW50ZXJydXB0ZWQgZm9yIHNvbWUgcmVhc29uLgoKT25jZSBhIHNvdXJj ZSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCBpdCB3aWxsIGJlIHJlbmFtZWQgd2l0aCB0aGUgYC5v bGRgCmFwcGVuZGl4LiBJdCB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gZnV0dXJlIHJ1bnMgYXMgd2Ug Y2hlY2sgZm9yIGZpbGVzCndpdGhvdXQgYW4gZXh0ZW5zaW9uLgoKVGhlIHRvb2wgaGFzIHNvbWUg c2ltcGxlIGhldXJpc3RpYyB0byBkZXRlcm1pbmUgaG93IG1hbnkgdGhyZWFkcyBzaG91bGQKYmUg dXNlZC4gQmUgZGVmYXVsdCB0aGUgcmFuZ2UgaXMgYmV0d2VlbiAxIHRvIDQgdGhyZWFkcy4gQnV0 IHRoZQpgLS10aHJlYWRzYCBwYXJhbWV0ZXIgYWxsb3dzIGEgbWFudWFsIG92ZXJyaWRlLgoKU2ln bmVkLW9mZi1ieTogQWFyb24gTGF1dGVyZXIgPGEubGF1dGVyZXJAcHJveG1veC5jb20+Ci0tLQog LmNhcmdvL2NvbmZpZy50b21sICAgICAgfCAgIDUgKwogLmdpdGlnbm9yZSAgICAgICAgICAgICAg fCAgIDkgKwogQ2FyZ28udG9tbCAgICAgICAgICAgICAgfCAgMjAgKysKIGJ1aWxkLnJzICAgICAg ICAgICAgICAgIHwgIDI5ICsrCiBzcmMvbGliLnJzICAgICAgICAgICAgICB8ICAgNSArCiBzcmMv bWFpbi5ycyAgICAgICAgICAgICB8IDU2NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrCiBzcmMvcGFyYWxsZWxfaGFuZGxlci5ycyB8IDE2MCArKysrKysrKysrKysKIHdy YXBwZXIuaCAgICAgICAgICAgICAgIHwgICAxICsKIDggZmlsZXMgY2hhbmdlZCwgNzk2IGluc2Vy dGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCAuY2FyZ28vY29uZmlnLnRvbWwKIGNyZWF0ZSBt b2RlIDEwMDY0NCAuZ2l0aWdub3JlCiBjcmVhdGUgbW9kZSAxMDA2NDQgQ2FyZ28udG9tbAogY3Jl YXRlIG1vZGUgMTAwNjQ0IGJ1aWxkLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2xpYi5ycwog Y3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9tYWluLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Bh cmFsbGVsX2hhbmRsZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCB3cmFwcGVyLmgKCmRpZmYgLS1n aXQgYS8uY2FyZ28vY29uZmlnLnRvbWwgYi8uY2FyZ28vY29uZmlnLnRvbWwKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1YjZlNAotLS0gL2Rldi9udWxsCisrKyBiLy5jYXJn by9jb25maWcudG9tbApAQCAtMCwwICsxLDUgQEAKK1tzb3VyY2VdCitbc291cmNlLmRlYmlhbi1w YWNrYWdlc10KK2RpcmVjdG9yeSA9ICIvdXNyL3NoYXJlL2NhcmdvL3JlZ2lzdHJ5IgorW3NvdXJj ZS5jcmF0ZXMtaW9dCityZXBsYWNlLXdpdGggPSAiZGViaWFuLXBhY2thZ2VzIgpkaWZmIC0tZ2l0 IGEvLmdpdGlnbm9yZSBiLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMC4uMDZhYzFhMQotLS0gL2Rldi9udWxsCisrKyBiLy5naXRpZ25vcmUKQEAgLTAsMCArMSw5 IEBACisqLmJ1aWxkCisqLmJ1aWxkaW5mbworKi5jaGFuZ2VzCisqLmRlYgorKi5kc2MKKyoudGFy KgordGFyZ2V0LworL0NhcmdvLmxvY2sKKy9wcm94bW94LXJyZC1taWdyYXRpb24tdG9vbC1bMC05 XSovCmRpZmYgLS1naXQgYS9DYXJnby50b21sIGIvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi5kMzUyM2YzCi0tLSAvZGV2L251bGwKKysrIGIvQ2FyZ28udG9t bApAQCAtMCwwICsxLDIwIEBACitbcGFja2FnZV0KK25hbWUgPSAicHJveG1veF9ycmRfbWlncmF0 aW9uXzgtOSIKK3ZlcnNpb24gPSAiMC4xLjAiCitlZGl0aW9uID0gIjIwMjEiCithdXRob3JzID0g WworICAgICJBYXJvbiBMYXV0ZXJlciA8YS5sYXV0ZXJlckBwcm94bW94LmNvbT4iLAorICAgICJQ cm94bW94IFN1cHBvcnQgVGVhbSA8c3VwcG9ydEBwcm94bW94LmNvbT4iLAorXQorbGljZW5zZSA9 ICJBR1BMLTMiCitob21lcGFnZSA9ICJodHRwczovL3d3dy5wcm94bW94LmNvbSIKKworW2RlcGVu ZGVuY2llc10KK2FueWhvdyA9ICIxLjAuODYiCitwaWNvLWFyZ3MgPSAiMC41LjAiCitwcm94bW94 LWFzeW5jID0gIjAuNCIKK2Nyb3NzYmVhbS1jaGFubmVsID0gIjAuNSIKKworW2J1aWxkLWRlcGVu ZGVuY2llc10KK2JpbmRnZW4gPSAiMC42Ni4xIgorcGtnLWNvbmZpZyA9ICIwLjMiCmRpZmYgLS1n aXQgYS9idWlsZC5ycyBiL2J1aWxkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAuLjU2ZDA3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC5ycwpAQCAtMCwwICsxLDI5IEBA Cit1c2Ugc3RkOjplbnY7Cit1c2Ugc3RkOjpwYXRoOjpQYXRoQnVmOworCitmbiBtYWluKCkgewor ICAgIHByaW50bG4hKCJjYXJnbzpydXN0Yy1saW5rLWxpYj1ycmQiKTsKKworICAgIHByaW50bG4h KCJjYXJnbzpyZXJ1bi1pZi1jaGFuZ2VkPXdyYXBwZXIuaCIpOworICAgIC8vIFRoZSBiaW5kZ2Vu OjpCdWlsZGVyIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50CisgICAgLy8gdG8gYmluZGdlbiwgYW5k IGxldHMgeW91IGJ1aWxkIHVwIG9wdGlvbnMgZm9yCisgICAgLy8gdGhlIHJlc3VsdGluZyBiaW5k aW5ncy4KKworICAgIGxldCBiaW5kaW5ncyA9IGJpbmRnZW46OkJ1aWxkZXI6OmRlZmF1bHQoKQor ICAgICAgICAvLyBUaGUgaW5wdXQgaGVhZGVyIHdlIHdvdWxkIGxpa2UgdG8gZ2VuZXJhdGUKKyAg ICAgICAgLy8gYmluZGluZ3MgZm9yLgorICAgICAgICAuaGVhZGVyKCJ3cmFwcGVyLmgiKQorICAg ICAgICAvLyBUZWxsIGNhcmdvIHRvIGludmFsaWRhdGUgdGhlIGJ1aWx0IGNyYXRlIHdoZW5ldmVy IGFueSBvZiB0aGUKKyAgICAgICAgLy8gaW5jbHVkZWQgaGVhZGVyIGZpbGVzIGNoYW5nZWQuCisg ICAgICAgIC5wYXJzZV9jYWxsYmFja3MoQm94OjpuZXcoYmluZGdlbjo6Q2FyZ29DYWxsYmFja3Mp KQorICAgICAgICAvLyBGaW5pc2ggdGhlIGJ1aWxkZXIgYW5kIGdlbmVyYXRlIHRoZSBiaW5kaW5n cy4KKyAgICAgICAgLmdlbmVyYXRlKCkKKyAgICAgICAgLy8gVW53cmFwIHRoZSBSZXN1bHQgYW5k IHBhbmljIG9uIGZhaWx1cmUuCisgICAgICAgIC5leHBlY3QoIlVuYWJsZSB0byBnZW5lcmF0ZSBi aW5kaW5ncyIpOworCisgICAgLy8gV3JpdGUgdGhlIGJpbmRpbmdzIHRvIHRoZSAkT1VUX0RJUi9i aW5kaW5ncy5ycyBmaWxlLgorICAgIGxldCBvdXRfcGF0aCA9IFBhdGhCdWY6OmZyb20oZW52Ojp2 YXIoIk9VVF9ESVIiKS51bndyYXAoKSk7CisgICAgYmluZGluZ3MKKyAgICAgICAgLndyaXRlX3Rv X2ZpbGUob3V0X3BhdGguam9pbigiYmluZGluZ3MucnMiKSkKKyAgICAgICAgLmV4cGVjdCgiQ291 bGRuJ3Qgd3JpdGUgYmluZGluZ3MhIik7Cit9CmRpZmYgLS1naXQgYS9zcmMvbGliLnJzIGIvc3Jj L2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzhhMTNhCi0tLSAv ZGV2L251bGwKKysrIGIvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDUgQEAKKyMhW2FsbG93KG5vbl91 cHBlcl9jYXNlX2dsb2JhbHMpXQorIyFbYWxsb3cobm9uX2NhbWVsX2Nhc2VfdHlwZXMpXQorIyFb YWxsb3cobm9uX3NuYWtlX2Nhc2UpXQorCitpbmNsdWRlIShjb25jYXQhKGVudiEoIk9VVF9ESVIi KSwgIi9iaW5kaW5ncy5ycyIpKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluLnJzIGIvc3JjL21haW4u cnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2NDE4YwotLS0gL2Rldi9u dWxsCisrKyBiL3NyYy9tYWluLnJzCkBAIC0wLDAgKzEsNTY3IEBACit1c2UgYW55aG93Ojp7YmFp bCwgRXJyb3IsIFJlc3VsdH07Cit1c2Ugc3RkOjp7CisgICAgZmZpOjp7Q1N0ciwgQ1N0cmluZywg T3NTdHJpbmd9LAorICAgIGZzLAorICAgIG9zOjp1bml4Ojp7ZmZpOjpPc1N0ckV4dCwgZnM6OlBl cm1pc3Npb25zRXh0fSwKKyAgICBwYXRoOjp7UGF0aCwgUGF0aEJ1Zn0sCisgICAgc3luYzo6QXJj LAorfTsKKwordXNlIHByb3htb3hfcnJkX21pZ3JhdGlvbl90b29sOjp7cnJkX2NsZWFyX2Vycm9y LCBycmRfY3JlYXRlX3IyLCBycmRfZ2V0X2NvbnRleHQsIHJyZF9nZXRfZXJyb3J9OworCit1c2Ug Y3JhdGU6OnBhcmFsbGVsX2hhbmRsZXI6OlBhcmFsbGVsSGFuZGxlcjsKKworcHViIG1vZCBwYXJh bGxlbF9oYW5kbGVyOworCitjb25zdCBCQVNFX0RJUjogJnN0ciA9ICIvdmFyL2xpYi9ycmRjYWNo ZWQvZGIiOworY29uc3QgU09VUkNFX1NVQkRJUl9OT0RFOiAmc3RyID0gInB2ZTItbm9kZSI7Citj b25zdCBTT1VSQ0VfU1VCRElSX0dVRVNUOiAmc3RyID0gInB2ZTItdm0iOworY29uc3QgU09VUkNF X1NVQkRJUl9TVE9SQUdFOiAmc3RyID0gInB2ZTItc3RvcmFnZSI7Citjb25zdCBUQVJHRVRfU1VC RElSX05PREU6ICZzdHIgPSAicHZlLW5vZGUtOS4wIjsKK2NvbnN0IFRBUkdFVF9TVUJESVJfR1VF U1Q6ICZzdHIgPSAicHZlLXZtLTkuMCI7Citjb25zdCBUQVJHRVRfU1VCRElSX1NUT1JBR0U6ICZz dHIgPSAicHZlLXN0b3JhZ2UtOS4wIjsKK2NvbnN0IFJFU09VUkNFX0JBU0VfRElSOiAmc3RyID0g Ii9ldGMvcHZlIjsKK2NvbnN0IE1BWF9USFJFQURTOiB1c2l6ZSA9IDQ7Citjb25zdCBSUkRfU1RF UF9TSVpFOiB1c2l6ZSA9IDYwOworCit0eXBlIEZpbGUgPSAoQ1N0cmluZywgT3NTdHJpbmcpOwor CisvLyBSUkFzIGFyZSBkZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorLy8KKy8vIFJSQTpD Rjp4ZmY6c3RlcDpyb3dzCisvLyBDRjogQVZFUkFHRSBvciBNQVgKKy8vIHhmZjogMC41CisvLyBz dGVwczogc3RlcHNpemUgaXMgZGVmaW5lZCBvbiBycmQgZmlsZSBjcmVhdGlvbiEgZXhhbXBsZTog d2l0aCA2MCBzZWNvbmRzIHN0ZXAgc2l6ZToKKy8vCWUuZy4gMSA9PiA2MCBzZWMsIDMwID0+IDE4 MDAgc2Vjb25kcyBvciAzMCBtaW4KKy8vIHJvd3M6IGhvdyBtYW55IGFnZ3JlZ2F0ZWQgcm93cyBh cmUga2VwdCwgYXMgaW4gaG93IGZhciBiYWNrIGluIHRpbWUgd2Ugc3RvcmUgZGF0YQorLy8KKy8v IGhvdyBtYW55IHNlY29uZHMgYXJlIGFnZ3JlZ2F0ZWQgcGVyIFJSQTogc3RlcHMgKiBzdGVwc2l6 ZSAqIHJvd3MKKy8vIGhvdyBtYW55IGhvdXJzIGFyZSBhZ2dyZWdhdGVkIHBlciBSUkE6IHN0ZXBz ICogc3RlcHNpemUgKiByb3dzIC8gMzYwMAorLy8gaG93IG1hbnkgZGF5cyBhcmUgYWdncmVnYXRl ZCBwZXIgUlJBOiBzdGVwcyAqIHN0ZXBzaXplICogcm93cyAvIDM2MDAgLyAyNAorLy8gaHR0cHM6 Ly9vc3Mub2V0aWtlci5jaC9ycmR0b29sL3R1dC9ycmQtYmVnaW5uZXJzLmVuLmh0bWwjVW5kZXJz dGFuZGluZ19ieV9hbl9leGFtcGxlCisKK2NvbnN0IFJSRF9WTV9ERUY6IFsmQ1N0cjsgMjVdID0g WworICAgIGMiRFM6bWF4Y3B1OkdBVUdFOjEyMDowOlUiLAorICAgIGMiRFM6Y3B1OkdBVUdFOjEy MDowOlUiLAorICAgIGMiRFM6bWF4bWVtOkdBVUdFOjEyMDowOlUiLAorICAgIGMiRFM6bWVtOkdB VUdFOjEyMDowOlUiLAorICAgIGMiRFM6bWF4ZGlzazpHQVVHRToxMjA6MDpVIiwKKyAgICBjIkRT OmRpc2s6R0FVR0U6MTIwOjA6VSIsCisgICAgYyJEUzpuZXRpbjpERVJJVkU6MTIwOjA6VSIsCisg ICAgYyJEUzpuZXRvdXQ6REVSSVZFOjEyMDowOlUiLAorICAgIGMiRFM6ZGlza3JlYWQ6REVSSVZF OjEyMDowOlUiLAorICAgIGMiRFM6ZGlza3dyaXRlOkRFUklWRToxMjA6MDpVIiwKKyAgICBjIkRT Om1lbWhvc3Q6R0FVR0U6MTIwOjA6VSIsCisgICAgYyJEUzpwcmVzc3VyZWNwdXNvbWU6R0FVR0U6 MTIwOjA6VSIsCisgICAgYyJEUzpwcmVzc3VyZWNwdWZ1bGw6R0FVR0U6MTIwOjA6VSIsCisgICAg YyJEUzpwcmVzc3VyZWlvc29tZTpHQVVHRToxMjA6MDpVIiwKKyAgICBjIkRTOnByZXNzdXJlaW9m dWxsOkdBVUdFOjEyMDowOlUiLAorICAgIGMiRFM6cHJlc3N1cmVtZW1vcnlzb21lOkdBVUdFOjEy MDowOlUiLAorICAgIGMiRFM6cHJlc3N1cmVtZW1vcnlmdWxsOkdBVUdFOjEyMDowOlUiLAorICAg IGMiUlJBOkFWRVJBR0U6MC41OjE6MTQ0MCIsICAgIC8vIDEgbWluICogMTQ0MCA9PiAxIGRheQor ICAgIGMiUlJBOkFWRVJBR0U6MC41OjMwOjE0NDAiLCAgIC8vIDMwIG1pbiAqIDE0NDAgPT4gMzAg ZGF5CisgICAgYyJSUkE6QVZFUkFHRTowLjU6MzYwOjE0NDAiLCAgLy8gNiBob3VycyAqIDE0NDAg PT4gMzYwIGRheSB+MSB5ZWFyCisgICAgYyJSUkE6QVZFUkFHRTowLjU6MTAwODA6NTcwIiwgLy8g MSB3ZWVrICogNTcwID0+IH4xMCB5ZWFycworICAgIGMiUlJBOk1BWDowLjU6MToxNDQwIiwgICAg ICAgIC8vIDEgbWluICogMTQ0MCA9PiAxIGRheQorICAgIGMiUlJBOk1BWDowLjU6MzA6MTQ0MCIs ICAgICAgIC8vIDMwIG1pbiAqIDE0NDAgPT4gMzAgZGF5CisgICAgYyJSUkE6TUFYOjAuNTozNjA6 MTQ0MCIsICAgICAgLy8gNiBob3VycyAqIDE0NDAgPT4gMzYwIGRheSB+MSB5ZWFyCisgICAgYyJS UkE6TUFYOjAuNToxMDA4MDo1NzAiLCAgICAgLy8gMSB3ZWVrICogNTcwID0+IH4xMCB5ZWFycwor XTsKKworY29uc3QgUlJEX05PREVfREVGOiBbJkNTdHI7IDI3XSA9IFsKKyAgICBjIkRTOmxvYWRh dmc6R0FVR0U6MTIwOjA6VSIsCisgICAgYyJEUzptYXhjcHU6R0FVR0U6MTIwOjA6VSIsCisgICAg YyJEUzpjcHU6R0FVR0U6MTIwOjA6VSIsCisgICAgYyJEUzppb3dhaXQ6R0FVR0U6MTIwOjA6VSIs CisgICAgYyJEUzptZW10b3RhbDpHQVVHRToxMjA6MDpVIiwKKyAgICBjIkRTOm1lbXVzZWQ6R0FV R0U6MTIwOjA6VSIsCisgICAgYyJEUzpzd2FwdG90YWw6R0FVR0U6MTIwOjA6VSIsCisgICAgYyJE Uzpzd2FwdXNlZDpHQVVHRToxMjA6MDpVIiwKKyAgICBjIkRTOnJvb3R0b3RhbDpHQVVHRToxMjA6 MDpVIiwKKyAgICBjIkRTOnJvb3R1c2VkOkdBVUdFOjEyMDowOlUiLAorICAgIGMiRFM6bmV0aW46 REVSSVZFOjEyMDowOlUiLAorICAgIGMiRFM6bmV0b3V0OkRFUklWRToxMjA6MDpVIiwKKyAgICBj IkRTOm1lbWZyZWU6R0FVR0U6MTIwOjA6VSIsCisgICAgYyJEUzphcmNzaXplOkdBVUdFOjEyMDow OlUiLAorICAgIGMiRFM6cHJlc3N1cmVjcHVzb21lOkdBVUdFOjEyMDowOlUiLAorICAgIGMiRFM6 cHJlc3N1cmVpb3NvbWU6R0FVR0U6MTIwOjA6VSIsCisgICAgYyJEUzpwcmVzc3VyZWlvZnVsbDpH QVVHRToxMjA6MDpVIiwKKyAgICBjIkRTOnByZXNzdXJlbWVtb3J5c29tZTpHQVVHRToxMjA6MDpV IiwKKyAgICBjIkRTOnByZXNzdXJlbWVtb3J5ZnVsbDpHQVVHRToxMjA6MDpVIiwKKyAgICBjIlJS QTpBVkVSQUdFOjAuNToxOjE0NDAiLCAgICAvLyAxIG1pbiAqIDE0NDAgPT4gMSBkYXkKKyAgICBj IlJSQTpBVkVSQUdFOjAuNTozMDoxNDQwIiwgICAvLyAzMCBtaW4gKiAxNDQwID0+IDMwIGRheQor ICAgIGMiUlJBOkFWRVJBR0U6MC41OjM2MDoxNDQwIiwgIC8vIDYgaG91cnMgKiAxNDQwID0+IDM2 MCBkYXkgfjEgeWVhcgorICAgIGMiUlJBOkFWRVJBR0U6MC41OjEwMDgwOjU3MCIsIC8vIDEgd2Vl ayAqIDU3MCA9PiB+MTAgeWVhcnMKKyAgICBjIlJSQTpNQVg6MC41OjE6MTQ0MCIsICAgICAgICAv LyAxIG1pbiAqIDE0NDAgPT4gMSBkYXkKKyAgICBjIlJSQTpNQVg6MC41OjMwOjE0NDAiLCAgICAg ICAvLyAzMCBtaW4gKiAxNDQwID0+IDMwIGRheQorICAgIGMiUlJBOk1BWDowLjU6MzYwOjE0NDAi LCAgICAgIC8vIDYgaG91cnMgKiAxNDQwID0+IDM2MCBkYXkgfjEgeWVhcgorICAgIGMiUlJBOk1B WDowLjU6MTAwODA6NTcwIiwgICAgIC8vIDEgd2VlayAqIDU3MCA9PiB+MTAgeWVhcnMKK107CisK K2NvbnN0IFJSRF9TVE9SQUdFX0RFRjogWyZDU3RyOyAxMF0gPSBbCisgICAgYyJEUzp0b3RhbDpH QVVHRToxMjA6MDpVIiwKKyAgICBjIkRTOnVzZWQ6R0FVR0U6MTIwOjA6VSIsCisgICAgYyJSUkE6 QVZFUkFHRTowLjU6MToxNDQwIiwgICAgLy8gMSBtaW4gKiAxNDQwID0+IDEgZGF5CisgICAgYyJS UkE6QVZFUkFHRTowLjU6MzA6MTQ0MCIsICAgLy8gMzAgbWluICogMTQ0MCA9PiAzMCBkYXkKKyAg ICBjIlJSQTpBVkVSQUdFOjAuNTozNjA6MTQ0MCIsICAvLyA2IGhvdXJzICogMTQ0MCA9PiAzNjAg ZGF5IH4xIHllYXIKKyAgICBjIlJSQTpBVkVSQUdFOjAuNToxMDA4MDo1NzAiLCAvLyAxIHdlZWsg KiA1NzAgPT4gfjEwIHllYXJzCisgICAgYyJSUkE6TUFYOjAuNToxOjE0NDAiLCAgICAgICAgLy8g MSBtaW4gKiAxNDQwID0+IDEgZGF5CisgICAgYyJSUkE6TUFYOjAuNTozMDoxNDQwIiwgICAgICAg Ly8gMzAgbWluICogMTQ0MCA9PiAzMCBkYXkKKyAgICBjIlJSQTpNQVg6MC41OjM2MDoxNDQwIiwg ICAgICAvLyA2IGhvdXJzICogMTQ0MCA9PiAzNjAgZGF5IH4xIHllYXIKKyAgICBjIlJSQTpNQVg6 MC41OjEwMDgwOjU3MCIsICAgICAvLyAxIHdlZWsgKiA1NzAgPT4gfjEwIHllYXJzCitdOworCitj b25zdCBIRUxQOiAmc3RyID0gIlwKK3Byb3htb3gtcnJkLW1pZ3JhdGlvbiB0b29sCisKK01pZ3Jh dGVzIGV4aXN0aW5nIFJSRCBncmFwaCBkYXRhIHRvIHRoZSBuZXcgZm9ybWF0LgorCitVc2UgdGhp cyBvbmx5IGluIHRoZSBwcm9jZXNzIG9mIHVwZ3JhZGluZyBmcm9tIFByb3htb3ggVkUgOCB0byA5 IGFjY29yZGluZyB0byB0aGUgdXBncmFkZSBndWlkZSEKKworVVNBR0U6CisgICAgcHJveG1veC1y cmQtbWlncmF0aW9uIFtPUFRJT05TXQorCisgICAgRkxBR1M6CisgICAgICAgIC1oLCAtLWhlbHAg ICAgICAgICAgICAgIFByaW50cyB0aGlzIGhlbHAgaW5mb3JtYXRpb24KKworICAgIE9QVElPTlM6 CisgICAgICAgIC0tbWlncmF0ZSAgICAgICAgICAgICAgIFN0YXJ0IHRoZSBtaWdyYXRpb24uIFdp dGhvdXQgaXQsIG9ubHkgYSBkcnkgcnVuIHdpbGwgYmUgZG9uZS4KKworICAgICAgICAtLWZvcmNl ICAgICAgICAgICAgICAgICBNaWdyYXRlLCBldmVuIGlmIHRoZSB0YXJnZXQgYWxyZWFkeSBleGlz dHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBvdmVyd3JpdGUg YW55IG1pZ3JhdGVkIFJSRCBmaWxlcyEKKworICAgICAgICAtLXRocmVhZHMgVEhSRUFEUyAgICAg ICBOdW1iZXIgb2YgcGFyYWxlbGwgdGhyZWFkcy4KKworICAgICAgICAtLXNvdXJjZSA8U09VUkNF IERJUj4gICBTb3VyY2UgYmFzZSBkaXJlY3RvcnkuIE1haW5seSBmb3IgdGVzdHMhCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IC92YXIvbGliL3JyZGNhY2hlZC9kYgor CisgICAgICAgIC0tdGFyZ2V0IDxUQVJHRVQgRElSPiAgIFRhcmdldCBiYXNlIGRpcmVjdG9yeS4g TWFpbmx5IGZvciB0ZXN0cyEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVs dDogL3Zhci9saWIvcnJkY2FjaGVkL2RiCisKKyAgICAgICAgLS1yZXNvdXJjZXMgPERJUj4gICAg ICAgRGlyZWN0b3J5IHRoYXQgY29udGFpbnMgLnZtbGlzdCBhbmQgLm1lbWJlciBmaWxlcy4gTWFp bmx5IGZvciB0ZXN0cyEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDog L2V0Yy9wdmUKKworIjsKKworI1tkZXJpdmUoRGVidWcpXQorc3RydWN0IEFyZ3MgeworICAgIG1p Z3JhdGU6IGJvb2wsCisgICAgZm9yY2U6IGJvb2wsCisgICAgdGhyZWFkczogT3B0aW9uPHVzaXpl PiwKKyAgICBzb3VyY2U6IE9wdGlvbjxTdHJpbmc+LAorICAgIHRhcmdldDogT3B0aW9uPFN0cmlu Zz4sCisgICAgcmVzb3VyY2VzOiBPcHRpb248U3RyaW5nPiwKK30KKworZm4gcGFyc2VfYXJncygp IC0+IFJlc3VsdDxBcmdzLCBFcnJvcj4geworICAgIGxldCBtdXQgcGFyZ3MgPSBwaWNvX2FyZ3M6 OkFyZ3VtZW50czo6ZnJvbV9lbnYoKTsKKworICAgIC8vIEhlbHAgaGFzIGEgaGlnaGVyIHByaW9y aXR5IGFuZCBzaG91bGQgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgorICAgIGlmIHBhcmdzLmNvbnRh aW5zKFsiLWgiLCAiLS1oZWxwIl0pIHsKKyAgICAgICAgcHJpbnQhKCJ7fSIsIEhFTFApOworICAg ICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMCk7CisgICAgfQorCisgICAgbGV0IG11dCBhcmdzID0g QXJncyB7CisgICAgICAgIG1pZ3JhdGU6IGZhbHNlLAorICAgICAgICB0aHJlYWRzOiBwYXJncwor ICAgICAgICAgICAgLm9wdF92YWx1ZV9mcm9tX3N0cigiLS10aHJlYWRzIikKKyAgICAgICAgICAg IC5leHBlY3QoIkNvdWxkIG5vdCBwYXJzZSAtLXRocmVhZHMgcGFyYW1ldGVyIiksCisgICAgICAg IGZvcmNlOiBmYWxzZSwKKyAgICAgICAgc291cmNlOiBwYXJncworICAgICAgICAgICAgLm9wdF92 YWx1ZV9mcm9tX3N0cigiLS1zb3VyY2UiKQorICAgICAgICAgICAgLmV4cGVjdCgiQ291bGQgbm90 IHBhcnNlIC0tc291cmNlIHBhcmFtZXRlciIpLAorICAgICAgICB0YXJnZXQ6IHBhcmdzCisgICAg ICAgICAgICAub3B0X3ZhbHVlX2Zyb21fc3RyKCItLXRhcmdldCIpCisgICAgICAgICAgICAuZXhw ZWN0KCJDb3VsZCBub3QgcGFyc2UgLS10YXJnZXQgcGFyYW1ldGVyIiksCisgICAgICAgIHJlc291 cmNlczogcGFyZ3MKKyAgICAgICAgICAgIC5vcHRfdmFsdWVfZnJvbV9zdHIoIi0tcmVzb3VyY2Vz IikKKyAgICAgICAgICAgIC5leHBlY3QoIkNvdWxkIG5vdCBwYXJzZSAtLXJlc291cmNlcyBwYXJh bWV0ZXIiKSwKKyAgICB9OworCisgICAgaWYgcGFyZ3MuY29udGFpbnMoIi0tbWlncmF0ZSIpIHsK KyAgICAgICAgYXJncy5taWdyYXRlID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgcGFyZ3MuY29udGFp bnMoIi0tZm9yY2UiKSB7CisgICAgICAgIGFyZ3MuZm9yY2UgPSB0cnVlOworICAgIH0KKworICAg IC8vIEl0J3MgdXAgdG8gdGhlIGNhbGxlciB3aGF0IHRvIGRvIHdpdGggdGhlIHJlbWFpbmluZyBh cmd1bWVudHMuCisgICAgbGV0IHJlbWFpbmluZyA9IHBhcmdzLmZpbmlzaCgpOworICAgIGlmICFy ZW1haW5pbmcuaXNfZW1wdHkoKSB7CisgICAgICAgIGJhaWwhKGZvcm1hdCEoIldhcm5pbmc6IHVu dXNlZCBhcmd1bWVudHMgbGVmdDogezo/fSIsIHJlbWFpbmluZykpOworICAgIH0KKworICAgIE9r KGFyZ3MpCit9CisKK2ZuIG1haW4oKSB7CisgICAgbGV0IGFyZ3MgPSBtYXRjaCBwYXJzZV9hcmdz KCkgeworICAgICAgICBPayh2KSA9PiB2LAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAg ICAgZXByaW50bG4hKCJFcnJvcjoge30uIiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6 OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgbGV0IHNvdXJjZV9iYXNlX2RpciA9 IG1hdGNoIGFyZ3Muc291cmNlIHsKKyAgICAgICAgU29tZShyZWYgdikgPT4gdi5hc19zdHIoKSwK KyAgICAgICAgTm9uZSA9PiBCQVNFX0RJUiwKKyAgICB9OworCisgICAgbGV0IHRhcmdldF9iYXNl X2RpciA9IG1hdGNoIGFyZ3MudGFyZ2V0IHsKKyAgICAgICAgU29tZShyZWYgdikgPT4gdi5hc19z dHIoKSwKKyAgICAgICAgTm9uZSA9PiBCQVNFX0RJUiwKKyAgICB9OworCisgICAgbGV0IHJlc291 cmNlX2Jhc2VfZGlyID0gbWF0Y2ggYXJncy5yZXNvdXJjZXMgeworICAgICAgICBTb21lKHJlZiB2 KSA9PiB2LmFzX3N0cigpLAorICAgICAgICBOb25lID0+IFJFU09VUkNFX0JBU0VfRElSLAorICAg IH07CisKKyAgICBsZXQgc291cmNlX2Rpcl9ndWVzdHM6IFBhdGhCdWYgPSBbc291cmNlX2Jhc2Vf ZGlyLCBTT1VSQ0VfU1VCRElSX0dVRVNUXS5pdGVyKCkuY29sbGVjdCgpOworICAgIGxldCB0YXJn ZXRfZGlyX2d1ZXN0czogUGF0aEJ1ZiA9IFt0YXJnZXRfYmFzZV9kaXIsIFRBUkdFVF9TVUJESVJf R1VFU1RdLml0ZXIoKS5jb2xsZWN0KCk7CisgICAgbGV0IHNvdXJjZV9kaXJfbm9kZXM6IFBhdGhC dWYgPSBbc291cmNlX2Jhc2VfZGlyLCBTT1VSQ0VfU1VCRElSX05PREVdLml0ZXIoKS5jb2xsZWN0 KCk7CisgICAgbGV0IHRhcmdldF9kaXJfbm9kZXM6IFBhdGhCdWYgPSBbdGFyZ2V0X2Jhc2VfZGly LCBUQVJHRVRfU1VCRElSX05PREVdLml0ZXIoKS5jb2xsZWN0KCk7CisgICAgbGV0IHNvdXJjZV9k aXJfc3RvcmFnZTogUGF0aEJ1ZiA9IFtzb3VyY2VfYmFzZV9kaXIsIFNPVVJDRV9TVUJESVJfU1RP UkFHRV0uaXRlcigpLmNvbGxlY3QoKTsKKyAgICBsZXQgdGFyZ2V0X2Rpcl9zdG9yYWdlOiBQYXRo QnVmID0gW3RhcmdldF9iYXNlX2RpciwgVEFSR0VUX1NVQkRJUl9TVE9SQUdFXS5pdGVyKCkuY29s bGVjdCgpOworCisgICAgaWYgIWFyZ3MubWlncmF0ZSB7CisgICAgICAgIHByaW50bG4hKCJEUllS VU4hIFVzZSB0aGUgLS1taWdyYXRlIHBhcmFtZXRlciB0byBzdGFydCB0aGUgbWlncmF0aW9uLiIp OworICAgIH0KKyAgICBpZiBhcmdzLmZvcmNlIHsKKyAgICAgICAgcHJpbnRsbiEoIkZvcmNlIG1v ZGUhIFdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIHRhcmdldCBSUkQgZmlsZXMhIik7CisgICAgfQor CisgICAgaWYgbGV0IEVycihlKSA9IG1pZ3JhdGVfbm9kZXMoCisgICAgICAgIHNvdXJjZV9kaXJf bm9kZXMsCisgICAgICAgIHRhcmdldF9kaXJfbm9kZXMsCisgICAgICAgIHJlc291cmNlX2Jhc2Vf ZGlyLAorICAgICAgICBhcmdzLm1pZ3JhdGUsCisgICAgICAgIGFyZ3MuZm9yY2UsCisgICAgKSB7 CisgICAgICAgIGVwcmludGxuISgiRXJyb3IgbWlncmF0aW5nIG5vZGVzOiB7fSIsIGUpOworICAg ICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgfQorICAgIGlmIGxldCBFcnIoZSkgPSBt aWdyYXRlX3N0b3JhZ2UoCisgICAgICAgIHNvdXJjZV9kaXJfc3RvcmFnZSwKKyAgICAgICAgdGFy Z2V0X2Rpcl9zdG9yYWdlLAorICAgICAgICBhcmdzLm1pZ3JhdGUsCisgICAgICAgIGFyZ3MuZm9y Y2UsCisgICAgKSB7CisgICAgICAgIGVwcmludGxuISgiRXJyb3IgbWlncmF0aW5nIHN0b3JhZ2U6 IHt9IiwgZSk7CisgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICB9CisgICAgaWYg bGV0IEVycihlKSA9IG1pZ3JhdGVfZ3Vlc3RzKAorICAgICAgICBzb3VyY2VfZGlyX2d1ZXN0cywK KyAgICAgICAgdGFyZ2V0X2Rpcl9ndWVzdHMsCisgICAgICAgIHJlc291cmNlX2Jhc2VfZGlyLAor ICAgICAgICBzZXRfdGhyZWFkcygmYXJncyksCisgICAgICAgIGFyZ3MubWlncmF0ZSwKKyAgICAg ICAgYXJncy5mb3JjZSwKKyAgICApIHsKKyAgICAgICAgZXByaW50bG4hKCJFcnJvciBtaWdyYXRp bmcgZ3Vlc3RzOiB7fSIsIGUpOworICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAg fQorfQorCisvLy8gU2V0IG51bWJlciBvZiB0aHJlYWRzCisvLy8KKy8vLyBFaXRoZXIgYSBmaXhl ZCBwYXJhbWV0ZXIgb3IgZGV0ZXJtaW5pbmcgYSByYW5nZSBiZXR3ZWVuIDEgdG8gNCB0aHJlYWRz CisvLy8gIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgQ1BVIGNvcmVzIGF2YWlsYWJsZSBpbiB0aGUg c3lzdGVtLgorZm4gc2V0X3RocmVhZHMoYXJnczogJkFyZ3MpIC0+IHVzaXplIHsKKyAgICBpZiBs ZXQgU29tZSh0aHJlYWRzKSA9IGFyZ3MudGhyZWFkcyB7CisgICAgICAgIHJldHVybiB0aHJlYWRz OworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBhIHdheSB0byBnZXQgcGh5c2ljYWwgY29yZXMg YW5kIG5vdCB0aHJlYWRzPworICAgIGxldCBjcHVzOiB1c2l6ZSA9IFN0cmluZzo6ZnJvbV91dGY4 X2xvc3N5KAorICAgICAgICBzdGQ6OnByb2Nlc3M6OkNvbW1hbmQ6Om5ldygibnByb2MiKQorICAg ICAgICAgICAgLm91dHB1dCgpCisgICAgICAgICAgICAuZXhwZWN0KCJFcnJvciBydW5uaW5nIG5w cm9jIikKKyAgICAgICAgICAgIC5zdGRvdXQKKyAgICAgICAgICAgIC5hc19zbGljZSgpCisgICAg ICAgICAgICAudHJpbV9hc2NpaSgpLAorICAgICkKKyAgICAucGFyc2U6Ojx1c2l6ZT4oKQorICAg IC5leHBlY3QoIkNvdWxkIG5vdCBwYXJzZSBucHJvYyBvdXRwdXQiKTsKKworICAgIGlmIGNwdXMg PCAzMiB7CisgICAgICAgIGxldCB0aHJlYWRzID0gY3B1cyAvIDg7CisgICAgICAgIGlmIHRocmVh ZHMgPT0gMCB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1 cm4gdGhyZWFkczsKKyAgICB9CisgICAgTUFYX1RIUkVBRFMKK30KKworLy8vIENoZWNrIGlmIGEg Vk1JRCBpcyBjdXJyZW50bHkgY29uZmlndXJlZAorZm4gcmVzb3VyY2VfcHJlc2VudChwYXRoOiAm c3RyLCByZXNvdXJjZTogJnN0cikgLT4gUmVzdWx0PGJvb2w+IHsKKyAgICBsZXQgcmVzb3VyY2Vs aXN0ID0gZnM6OnJlYWRfdG9fc3RyaW5nKHBhdGgpPzsKKyAgICBPayhyZXNvdXJjZWxpc3QuY29u dGFpbnMoZm9ybWF0ISgiXCJ7cmVzb3VyY2V9XCIiKS5hc19zdHIoKSkpCit9CisKKy8vLyBSZW5h bWUgZmlsZSB0byBvbGQsIHdoZW4gbWlncmF0ZWQgb3IgcmVzb3VyY2Ugbm90IHByZXNlbnQgYXQg YWxsIC0+IG9sZCBSUkQgZmlsZQorZm4gbXZfb2xkKGZpbGU6ICZzdHIpIC0+IFJlc3VsdDwoKT4g eworICAgIGxldCBvbGQgPSBmb3JtYXQhKCJ7fS5vbGQiLCBmaWxlKTsKKyAgICBmczo6cmVuYW1l KGZpbGUsIG9sZCk/OworICAgIE9rKCgpKQorfQorCisvLy8gQ29sbGxlY3QgYWxsIFJSRCBmaWxl cyBpbiB0aGUgcHJvdmlkZWQgZGlyZWN0b3J5CitmbiBjb2xsZWN0X3JyZF9maWxlcyhsb2NhdGlv bjogJlBhdGhCdWYpIC0+IFJlc3VsdDxWZWM8KENTdHJpbmcsIE9zU3RyaW5nKT4+IHsKKyAgICBs ZXQgbXV0IGZpbGVzOiBWZWM8KENTdHJpbmcsIE9zU3RyaW5nKT4gPSBWZWM6Om5ldygpOworCisg ICAgZnM6OnJlYWRfZGlyKGxvY2F0aW9uKT8KKyAgICAgICAgLmZpbHRlcih8ZnwgZi5pc19vaygp KQorICAgICAgICAubWFwKHxmfCBmLnVud3JhcCgpLnBhdGgoKSkKKyAgICAgICAgLmZpbHRlcih8 ZnwgZi5pc19maWxlKCkgJiYgZi5leHRlbnNpb24oKS5pc19ub25lKCkpCisgICAgICAgIC5mb3Jf ZWFjaCh8ZmlsZXwgeworICAgICAgICAgICAgbGV0IHBhdGggPSBDU3RyaW5nOjpuZXcoZmlsZS5h c19wYXRoKCkuYXNfb3Nfc3RyKCkuYXNfYnl0ZXMoKSkKKyAgICAgICAgICAgICAgICAuZXhwZWN0 KCJDb3VsZCBub3QgY29udmVydCBwYXRoIHRvIENTdHJpbmcuIik7CisgICAgICAgICAgICBsZXQg Zm5hbWUgPSBmaWxlCisgICAgICAgICAgICAgICAgLmZpbGVfbmFtZSgpCisgICAgICAgICAgICAg ICAgLm1hcCh8dnwgdi50b19vc19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJD b3VsZCBub3QgY29udmVydCBmbmFtZSB0byBPc1N0cmluZy4iKTsKKyAgICAgICAgICAgIGZpbGVz LnB1c2goKHBhdGgsIGZuYW1lKSkKKyAgICAgICAgfSk7CisgICAgT2soZmlsZXMpCit9CisKKy8v LyBEb2VzIHRoZSBhY3R1YWwgbWlncmF0aW9uIGZvciB0aGUgZ2l2ZW4gZmlsZQorZm4gZG9fcnJk X21pZ3JhdGlvbigKKyAgICBmaWxlOiBGaWxlLAorICAgIHRhcmdldF9sb2NhdGlvbjogJlBhdGgs CisgICAgcnJkX2RlZjogJlsmQ1N0cl0sCisgICAgbWlncmF0ZTogYm9vbCwKKyAgICBmb3JjZTog Ym9vbCwKKykgLT4gUmVzdWx0PCgpPiB7CisgICAgaWYgIW1pZ3JhdGUgeworICAgICAgICBwcmlu dGxuISgid291bGQgbWlncmF0ZSBidXQgaW4gZHJ5IHJ1biBtb2RlIik7CisgICAgfQorCisgICAg bGV0IHJlc291cmNlID0gZmlsZS4xOworICAgIGxldCBtdXQgdGFyZ2V0X3BhdGggPSB0YXJnZXRf bG9jYXRpb24udG9fcGF0aF9idWYoKTsKKyAgICB0YXJnZXRfcGF0aC5wdXNoKHJlc291cmNlKTsK KworICAgIGlmIHRhcmdldF9wYXRoLmV4aXN0cygpICYmICFmb3JjZSB7CisgICAgICAgIHByaW50 bG4hKAorICAgICAgICAgICAgImFscmVhZHkgbWlncmF0ZWQsIHVzZSAtLWZvcmNlIHRvIG92ZXJ3 cml0ZSB0YXJnZXQgZmlsZToge30iLAorICAgICAgICAgICAgdGFyZ2V0X3BhdGguZGlzcGxheSgp CisgICAgICAgICk7CisgICAgfQorCisgICAgaWYgIW1pZ3JhdGUgfHwgKHRhcmdldF9wYXRoLmV4 aXN0cygpICYmICFmb3JjZSkgeworICAgICAgICBiYWlsISgic2tpcHBpbmciKTsKKyAgICB9CisK KyAgICBsZXQgbXV0IHNvdXJjZTogWypjb25zdCBpODsgMl0gPSBbc3RkOjpwdHI6Om51bGwoKTsg Ml07CisgICAgc291cmNlWzBdID0gZmlsZS4wLmFzX3B0cigpOworCisgICAgbGV0IHRhcmdldF9w YXRoID0gQ1N0cmluZzo6bmV3KHRhcmdldF9wYXRoLnRvX3N0cigpLnVud3JhcCgpKS51bndyYXAo KTsKKworICAgIHVuc2FmZSB7CisgICAgICAgIHJyZF9nZXRfY29udGV4dCgpOworICAgICAgICBy cmRfY2xlYXJfZXJyb3IoKTsKKyAgICAgICAgbGV0IHJlcyA9IHJyZF9jcmVhdGVfcjIoCisgICAg ICAgICAgICB0YXJnZXRfcGF0aC5hc19wdHIoKSwKKyAgICAgICAgICAgIFJSRF9TVEVQX1NJWkUg YXMgdTY0LAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBzb3Vy Y2UuYXNfbXV0X3B0cigpLAorICAgICAgICAgICAgc3RkOjpwdHI6Om51bGwoKSwKKyAgICAgICAg ICAgIHJyZF9kZWYubGVuKCkgYXMgaTMyLAorICAgICAgICAgICAgcnJkX2RlZgorICAgICAgICAg ICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgICAgICAubWFwKHx2fCB2LmFzX3B0cigpKQorICAg ICAgICAgICAgICAgIC5jb2xsZWN0Ojo8VmVjPF8+PigpCisgICAgICAgICAgICAgICAgLmFzX211 dF9wdHIoKSwKKyAgICAgICAgKTsKKyAgICAgICAgaWYgcmVzICE9IDAgeworICAgICAgICAgICAg YmFpbCEoCisgICAgICAgICAgICAgICAgIlJSRCBjcmVhdGUgRXJyb3I6IHt9IiwKKyAgICAgICAg ICAgICAgICBDU3RyOjpmcm9tX3B0cihycmRfZ2V0X2Vycm9yKCkpLnRvX3N0cmluZ19sb3NzeSgp CisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorICAgIE9rKCgpKQorfQorCisvLy8g TWlncmF0ZSBndWVzdCBSUkQgZmlsZXMKKy8vLworLy8vIEluIHBhcmFsbGVsIHRvIHNwZWVkIHVw IHRoZSBwcm9jZXNzIGFzIG1vc3QgdGltZSBpcyBzcGVudCBvbiBjb252ZXJ0aW5nIHRoZQorLy8v IGRhdGEgdG8gdGhlIG5ldyBmb3JtYXQuCitmbiBtaWdyYXRlX2d1ZXN0cygKKyAgICBzb3VyY2Vf ZGlyX2d1ZXN0czogUGF0aEJ1ZiwKKyAgICB0YXJnZXRfZGlyX2d1ZXN0czogUGF0aEJ1ZiwKKyAg ICByZXNvdXJjZXM6ICZzdHIsCisgICAgdGhyZWFkczogdXNpemUsCisgICAgbWlncmF0ZTogYm9v bCwKKyAgICBmb3JjZTogYm9vbCwKKykgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgIHByaW50 bG4hKCJNaWdyYXRpbmcgUlJEIGRhdGEgZm9yIGd1ZXN0c+KApiIpOworICAgIHByaW50bG4hKCJV c2luZyB7fSB0aHJlYWQocykiLCB0aHJlYWRzKTsKKworICAgIGxldCBndWVzdF9zb3VyY2VfZmls ZXMgPSBjb2xsZWN0X3JyZF9maWxlcygmc291cmNlX2Rpcl9ndWVzdHMpPzsKKworICAgIGlmICF0 YXJnZXRfZGlyX2d1ZXN0cy5leGlzdHMoKSAmJiBtaWdyYXRlIHsKKyAgICAgICAgcHJpbnRsbiEo IkNyZWF0aW5nIG5ldyBkaXJlY3Rvcnk6ICd7fSciLCB0YXJnZXRfZGlyX2d1ZXN0cy5kaXNwbGF5 KCkpOworICAgICAgICBzdGQ6OmZzOjpjcmVhdGVfZGlyKCZ0YXJnZXRfZGlyX2d1ZXN0cyk/Owor ICAgIH0KKworICAgIGxldCB0b3RhbF9ndWVzdHMgPSBndWVzdF9zb3VyY2VfZmlsZXMubGVuKCk7 CisgICAgbGV0IGd1ZXN0cyA9IEFyYzo6bmV3KHN0ZDo6c3luYzo6YXRvbWljOjpBdG9taWNVc2l6 ZTo6bmV3KDApKTsKKyAgICBsZXQgZ3Vlc3RzMiA9IGd1ZXN0cy5jbG9uZSgpOworICAgIGxldCBz dGFydF90aW1lID0gc3RkOjp0aW1lOjpTeXN0ZW1UaW1lOjpub3coKTsKKworICAgIGxldCBtaWdy YXRpb25fcG9vbCA9IFBhcmFsbGVsSGFuZGxlcjo6bmV3KAorICAgICAgICAiZ3Vlc3QgcnJkIG1p Z3JhdGlvbiIsCisgICAgICAgIHRocmVhZHMsCisgICAgICAgIG1vdmUgfGZpbGU6IChDU3RyaW5n LCBPc1N0cmluZyl8IHsKKyAgICAgICAgICAgIGxldCBmdWxsX3BhdGggPSBmaWxlLjAuY2xvbmUo KS5pbnRvX3N0cmluZygpLnVud3JhcCgpOworCisgICAgICAgICAgICBpZiBsZXQgT2soKCkpID0g ZG9fcnJkX21pZ3JhdGlvbigKKyAgICAgICAgICAgICAgICBmaWxlLAorICAgICAgICAgICAgICAg ICZ0YXJnZXRfZGlyX2d1ZXN0cywKKyAgICAgICAgICAgICAgICBSUkRfVk1fREVGLmFzX3NsaWNl KCksCisgICAgICAgICAgICAgICAgbWlncmF0ZSwKKyAgICAgICAgICAgICAgICBmb3JjZSwKKyAg ICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIG12X29sZChmdWxsX3BhdGguYXNfc3RyKCkp PzsKKyAgICAgICAgICAgICAgICBsZXQgY3VycmVudF9ndWVzdHMgPSBndWVzdHMyLmZldGNoX2Fk ZCgxLCBzdGQ6OnN5bmM6OmF0b21pYzo6T3JkZXJpbmc6OlNlcUNzdCk7CisgICAgICAgICAgICAg ICAgaWYgY3VycmVudF9ndWVzdHMgPiAwICYmIGN1cnJlbnRfZ3Vlc3RzICUgMjAwID09IDAgewor ICAgICAgICAgICAgICAgICAgICBwcmludGxuISgiTWlncmF0ZWQge30gb2Yge30gZ3Vlc3RzIiwg Y3VycmVudF9ndWVzdHMsIHRvdGFsX2d1ZXN0cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAg ICAgICAgfQorICAgICAgICAgICAgT2soKCkpCisgICAgICAgIH0sCisgICAgKTsKKyAgICBsZXQg bWlncmF0aW9uX2NoYW5uZWwgPSBtaWdyYXRpb25fcG9vbC5jaGFubmVsKCk7CisKKyAgICBmb3Ig ZmlsZSBpbiBndWVzdF9zb3VyY2VfZmlsZXMgeworICAgICAgICBsZXQgbm9kZSA9IGZpbGUuMS5j bG9uZSgpLmludG9fc3RyaW5nKCkudW53cmFwKCk7CisgICAgICAgIGlmICFyZXNvdXJjZV9wcmVz ZW50KGZvcm1hdCEoIntyZXNvdXJjZXN9Ly52bWxpc3QiKS5hc19zdHIoKSwgbm9kZS5hc19zdHIo KSk/IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJWTUlEOiAne25vZGV9JyBub3QgcHJlc2VudC4g U2tpcCBhbmQgbWFyayBhcyBvbGQuIik7CisgICAgICAgICAgICBtdl9vbGQoZm9ybWF0ISgie30i LCBmaWxlLjAudG9fc3RyaW5nX2xvc3N5KCkpLmFzX3N0cigpKT87CisgICAgICAgIH0KKyAgICAg ICAgbGV0IG1pZ3JhdGlvbl9jaGFubmVsID0gbWlncmF0aW9uX2NoYW5uZWwuY2xvbmUoKTsKKyAg ICAgICAgbWlncmF0aW9uX2NoYW5uZWwuc2VuZChmaWxlKT87CisgICAgfQorCisgICAgZHJvcCht aWdyYXRpb25fY2hhbm5lbCk7CisgICAgbWlncmF0aW9uX3Bvb2wuY29tcGxldGUoKT87CisKKyAg ICBsZXQgZWxhcHNlZCA9IHN0YXJ0X3RpbWUuZWxhcHNlZCgpPy5hc19zZWNzX2Y2NCgpOworICAg IGxldCBndWVzdHMgPSBndWVzdHMubG9hZChzdGQ6OnN5bmM6OmF0b21pYzo6T3JkZXJpbmc6OlNl cUNzdCk7CisgICAgcHJpbnRsbiEoIk1pZ3JhdGVkIHt9IGd1ZXN0cyIsIGd1ZXN0cyk7CisgICAg cHJpbnRsbiEoIkl0IHRvb2sgezouMn1zIiwgZWxhcHNlZCk7CisKKyAgICBPaygoKSkKK30KKwor Ly8vIE1pZ3JhdGUgbm9kZSBSUkQgZmlsZXMKKy8vLworLy8vIEluIHNlcmlhbCBhcyB0aGUgbnVt YmVyIG9mIG5vZGVzIHdpbGwgbm90IGJlIGhpZ2guCitmbiBtaWdyYXRlX25vZGVzKAorICAgIHNv dXJjZV9kaXJfbm9kZXM6IFBhdGhCdWYsCisgICAgdGFyZ2V0X2Rpcl9ub2RlczogUGF0aEJ1ZiwK KyAgICByZXNvdXJjZXM6ICZzdHIsCisgICAgbWlncmF0ZTogYm9vbCwKKyAgICBmb3JjZTogYm9v bCwKKykgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgIHByaW50bG4hKCJNaWdyYXRpbmcgUlJE IGRhdGEgZm9yIG5vZGVz4oCmIik7CisKKyAgICBpZiAhdGFyZ2V0X2Rpcl9ub2Rlcy5leGlzdHMo KSAmJiBtaWdyYXRlIHsKKyAgICAgICAgcHJpbnRsbiEoIkNyZWF0aW5nIG5ldyBkaXJlY3Rvcnk6 ICd7fSciLCB0YXJnZXRfZGlyX25vZGVzLmRpc3BsYXkoKSk7CisgICAgICAgIHN0ZDo6ZnM6OmNy ZWF0ZV9kaXIoJnRhcmdldF9kaXJfbm9kZXMpPzsKKyAgICB9CisKKyAgICBsZXQgbm9kZV9zb3Vy Y2VfZmlsZXMgPSBjb2xsZWN0X3JyZF9maWxlcygmc291cmNlX2Rpcl9ub2Rlcyk/OworCisgICAg Zm9yIGZpbGUgaW4gbm9kZV9zb3VyY2VfZmlsZXMgeworICAgICAgICBsZXQgbm9kZSA9IGZpbGUu MS5jbG9uZSgpLmludG9fc3RyaW5nKCkudW53cmFwKCk7CisgICAgICAgIGxldCBmdWxsX3BhdGgg PSBmaWxlLjAuY2xvbmUoKS5pbnRvX3N0cmluZygpLnVud3JhcCgpOworICAgICAgICBwcmludGxu ISgiTm9kZTogJ3tub2RlfSciKTsKKyAgICAgICAgaWYgIXJlc291cmNlX3ByZXNlbnQoZm9ybWF0 ISgie3Jlc291cmNlc30vLm1lbWJlcnMiKS5hc19zdHIoKSwgbm9kZS5hc19zdHIoKSk/IHsKKyAg ICAgICAgICAgIHByaW50bG4hKCJOb2RlOiAne25vZGV9JyBub3QgcHJlc2VudC4gU2tpcCBhbmQg bWFyayBhcyBvbGQuIik7CisgICAgICAgICAgICBtdl9vbGQoZm9ybWF0ISgie30ve30iLCBmaWxl LjAudG9fc3RyaW5nX2xvc3N5KCksIG5vZGUpLmFzX3N0cigpKT87CisgICAgICAgIH0KKyAgICAg ICAgaWYgbGV0IE9rKCgpKSA9IGRvX3JyZF9taWdyYXRpb24oCisgICAgICAgICAgICBmaWxlLAor ICAgICAgICAgICAgJnRhcmdldF9kaXJfbm9kZXMsCisgICAgICAgICAgICBSUkRfTk9ERV9ERUYu YXNfc2xpY2UoKSwKKyAgICAgICAgICAgIG1pZ3JhdGUsCisgICAgICAgICAgICBmb3JjZSwKKyAg ICAgICAgKSB7CisgICAgICAgICAgICBtdl9vbGQoZnVsbF9wYXRoLmFzX3N0cigpKT87CisgICAg ICAgIH0KKyAgICB9CisgICAgcHJpbnRsbiEoIk1pZ3JhdGVkIGFsbCBub2RlcyIpOworCisgICAg T2soKCkpCit9CisKKy8vLyBNaWdyYXRlIHN0b3JhZ2UgUlJEIGZpbGVzCisvLy8KKy8vLyBJbiBz ZXJpYWwgYXMgdGhlIG51bWJlciBvZiBzdG9yYWdlIHdpbGwgbm90IGJlIHRoYXQgaGlnaC4KK2Zu IG1pZ3JhdGVfc3RvcmFnZSgKKyAgICBzb3VyY2VfZGlyX3N0b3JhZ2U6IFBhdGhCdWYsCisgICAg dGFyZ2V0X2Rpcl9zdG9yYWdlOiBQYXRoQnVmLAorICAgIG1pZ3JhdGU6IGJvb2wsCisgICAgZm9y Y2U6IGJvb2wsCispIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICBwcmludGxuISgiTWlncmF0 aW5nIFJSRCBkYXRhIGZvciBzdG9yYWdlc+KApiIpOworCisgICAgaWYgIXRhcmdldF9kaXJfc3Rv cmFnZS5leGlzdHMoKSAmJiBtaWdyYXRlIHsKKyAgICAgICAgcHJpbnRsbiEoIkNyZWF0aW5nIG5l dyBkaXJlY3Rvcnk6ICd7fSciLCB0YXJnZXRfZGlyX3N0b3JhZ2UuZGlzcGxheSgpKTsKKyAgICAg ICAgc3RkOjpmczo6Y3JlYXRlX2RpcigmdGFyZ2V0X2Rpcl9zdG9yYWdlKT87CisgICAgfQorCisg ICAgLy8gc3RvcmFnZSBoYXMgYW5vdGhlciBsYXllciBvZiBkaXJlY3RvcmllcyBwZXIgbm9kZSBv dmVyIHdoaWNoIHdlIG5lZWQgdG8gaXRlcmF0ZQorICAgIGZzOjpyZWFkX2Rpcigmc291cmNlX2Rp cl9zdG9yYWdlKT8KKyAgICAgICAgLmZpbHRlcih8ZnwgZi5pc19vaygpKQorICAgICAgICAubWFw KHxmfCBmLnVud3JhcCgpLnBhdGgoKSkKKyAgICAgICAgLmZpbHRlcih8ZnwgZi5pc19kaXIoKSkK KyAgICAgICAgLnRyeV9mb3JfZWFjaCh8bm9kZXwgeworICAgICAgICAgICAgbGV0IG11dCBzb3Vy Y2Vfc3RvcmFnZV9zdWJkaXIgPSBzb3VyY2VfZGlyX3N0b3JhZ2UuY2xvbmUoKTsKKyAgICAgICAg ICAgIHNvdXJjZV9zdG9yYWdlX3N1YmRpci5wdXNoKG5vZGUuZmlsZV9uYW1lKCkudW53cmFwKCkp OworCisgICAgICAgICAgICBsZXQgbXV0IHRhcmdldF9zdG9yYWdlX3N1YmRpciA9IHRhcmdldF9k aXJfc3RvcmFnZS5jbG9uZSgpOworICAgICAgICAgICAgdGFyZ2V0X3N0b3JhZ2Vfc3ViZGlyLnB1 c2gobm9kZS5maWxlX25hbWUoKS51bndyYXAoKSk7CisKKyAgICAgICAgICAgIGlmICF0YXJnZXRf c3RvcmFnZV9zdWJkaXIuZXhpc3RzKCkgJiYgbWlncmF0ZSB7CisgICAgICAgICAgICAgICAgZnM6 OmNyZWF0ZV9kaXIodGFyZ2V0X3N0b3JhZ2Vfc3ViZGlyLmFzX3BhdGgoKSk/OworICAgICAgICAg ICAgICAgIGxldCBtZXRhZGF0YSA9IHRhcmdldF9zdG9yYWdlX3N1YmRpci5tZXRhZGF0YSgpPzsK KyAgICAgICAgICAgICAgICBsZXQgbXV0IHBlcm1pc3Npb25zID0gbWV0YWRhdGEucGVybWlzc2lv bnMoKTsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucy5zZXRfbW9kZSgwbzc1NSk7CisgICAg ICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBzdG9yYWdlX3NvdXJjZV9maWxlcyA9IGNvbGxl Y3RfcnJkX2ZpbGVzKCZzb3VyY2Vfc3RvcmFnZV9zdWJkaXIpPzsKKworICAgICAgICAgICAgZm9y IGZpbGUgaW4gc3RvcmFnZV9zb3VyY2VfZmlsZXMgeworICAgICAgICAgICAgICAgIHByaW50bG4h KAorICAgICAgICAgICAgICAgICAgICAiU3RvcmFnZTogJ3t9L3t9JyIsCisgICAgICAgICAgICAg ICAgICAgIG5vZGUuZmlsZV9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leHBlY3Qo Im5vIGZpbGUgbmFtZSBwcmVzZW50IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC50b19zdHJp bmdfbG9zc3koKSwKKyAgICAgICAgICAgICAgICAgICAgUGF0aEJ1Zjo6ZnJvbShmaWxlLjEuY2xv bmUoKSkuZGlzcGxheSgpCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIGxl dCBmdWxsX3BhdGggPSBmaWxlLjAuY2xvbmUoKS5pbnRvX3N0cmluZygpLnVud3JhcCgpOworICAg ICAgICAgICAgICAgIGlmIGxldCBPaygoKSkgPSBkb19ycmRfbWlncmF0aW9uKAorICAgICAgICAg ICAgICAgICAgICBmaWxlLAorICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0X3N0b3JhZ2Vfc3Vi ZGlyLAorICAgICAgICAgICAgICAgICAgICBSUkRfU1RPUkFHRV9ERUYuYXNfc2xpY2UoKSwKKyAg ICAgICAgICAgICAgICAgICAgbWlncmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgZm9yY2UsCisg ICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIG12X29sZChmdWxsX3BhdGgu YXNfc3RyKCkpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAg ICBPazo6PCgpLCBFcnJvcj4oKCkpCisgICAgICAgIH0pPzsKKyAgICBwcmludGxuISgiTWlncmF0 ZWQgYWxsIHN0b3JhZ2VzIik7CisKKyAgICBPaygoKSkKK30KZGlmZiAtLWdpdCBhL3NyYy9wYXJh bGxlbF9oYW5kbGVyLnJzIGIvc3JjL3BhcmFsbGVsX2hhbmRsZXIucnMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlZTNjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wYXJh bGxlbF9oYW5kbGVyLnJzCkBAIC0wLDAgKzEsMTYwIEBACisvLyEgQSB0aHJlYWQgcG9vbCB3aGlj aCBydW4gYSBjbG9zdXJlIGluIHBhcmFsbGVsLgorCit1c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRl eH07Cit1c2Ugc3RkOjp0aHJlYWQ6OkpvaW5IYW5kbGU7CisKK3VzZSBhbnlob3c6OntiYWlsLCBm b3JtYXRfZXJyLCBFcnJvcn07Cit1c2UgY3Jvc3NiZWFtX2NoYW5uZWw6Ontib3VuZGVkLCBTZW5k ZXJ9OworCisvLy8gQSBoYW5kbGUgdG8gc2VuZCBkYXRhIHRvIHRoZSB3b3JrZXIgdGhyZWFkIChp bXBsZW1lbnRzIGNsb25lKQorcHViIHN0cnVjdCBTZW5kSGFuZGxlPEk+IHsKKyAgICBpbnB1dDog U2VuZGVyPEk+LAorICAgIGFib3J0OiBBcmM8TXV0ZXg8T3B0aW9uPFN0cmluZz4+PiwKK30KKwor Ly8vIFJldHVybnMgdGhlIGZpcnN0IGVycm9yIGhhcHBlbmVkLCBpZiBhbnkKK3B1YiBmbiBjaGVj a19hYm9ydChhYm9ydDogJk11dGV4PE9wdGlvbjxTdHJpbmc+PikgLT4gUmVzdWx0PCgpLCBFcnJv cj4geworICAgIGxldCBndWFyZCA9IGFib3J0LmxvY2soKS51bndyYXAoKTsKKyAgICBpZiBsZXQg U29tZShlcnJfbXNnKSA9ICYqZ3VhcmQgeworICAgICAgICByZXR1cm4gRXJyKGZvcm1hdF9lcnIh KCJ7fSIsIGVycl9tc2cpKTsKKyAgICB9CisgICAgT2soKCkpCit9CisKK2ltcGw8STogU2VuZD4g U2VuZEhhbmRsZTxJPiB7CisgICAgLy8vIFNlbmQgZGF0YSB0byB0aGUgd29ya2VyIHRocmVhZHMK KyAgICBwdWIgZm4gc2VuZCgmc2VsZiwgaW5wdXQ6IEkpIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsK KyAgICAgICAgY2hlY2tfYWJvcnQoJnNlbGYuYWJvcnQpPzsKKyAgICAgICAgbWF0Y2ggc2VsZi5p bnB1dC5zZW5kKGlucHV0KSB7CisgICAgICAgICAgICBPaygoKSkgPT4gT2soKCkpLAorICAgICAg ICAgICAgRXJyKF8pID0+IGJhaWwhKCJzZW5kIGZhaWxlZCAtIGNoYW5uZWwgY2xvc2VkIiksCisg ICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBBIHRocmVhZCBwb29sIHdoaWNoIHJ1biB0aGUgc3Vw cGxpZWQgY2xvc3VyZQorLy8vCisvLy8gVGhlIHNlbmQgY29tbWFuZCBzZW5kcyBkYXRhIHRvIHRo ZSB3b3JrZXIgdGhyZWFkcy4gSWYgb25lIGhhbmRsZXIKKy8vLyByZXR1cm5zIGFuIGVycm9yLCB3 ZSBtYXJrIHRoZSBjaGFubmVsIGFzIGZhaWxlZCBhbmQgaXQgaXMgbm8KKy8vLyBsb25nZXIgcG9z c2libGUgdG8gc2VuZCBkYXRhLgorLy8vCisvLy8gV2hlbiBkb25lLCB0aGUgJ2NvbXBsZXRlKCkn IG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgdG8gY2hlY2sgZm9yCisvLy8gb3V0c3RhbmRpbmcg ZXJyb3JzLgorcHViIHN0cnVjdCBQYXJhbGxlbEhhbmRsZXI8ST4geworICAgIGhhbmRsZXM6IFZl YzxKb2luSGFuZGxlPCgpPj4sCisgICAgbmFtZTogU3RyaW5nLAorICAgIGlucHV0OiBPcHRpb248 U2VuZEhhbmRsZTxJPj4sCit9CisKK2ltcGw8ST4gQ2xvbmUgZm9yIFNlbmRIYW5kbGU8ST4gewor ICAgIGZuIGNsb25lKCZzZWxmKSAtPiBTZWxmIHsKKyAgICAgICAgU2VsZiB7CisgICAgICAgICAg ICBpbnB1dDogc2VsZi5pbnB1dC5jbG9uZSgpLAorICAgICAgICAgICAgYWJvcnQ6IEFyYzo6Y2xv bmUoJnNlbGYuYWJvcnQpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPEk6IFNlbmQgKyAn c3RhdGljPiBQYXJhbGxlbEhhbmRsZXI8ST4geworICAgIC8vLyBDcmVhdGUgYSBuZXcgdGhyZWFk IHBvb2wsIGVhY2ggdGhyZWFkIHByb2Nlc3NpbmcgaW5jb21pbmcgZGF0YQorICAgIC8vLyB3aXRo ICdoYW5kbGVyX2ZuJy4KKyAgICBwdWIgZm4gbmV3PEY+KG5hbWU6ICZzdHIsIHRocmVhZHM6IHVz aXplLCBoYW5kbGVyX2ZuOiBGKSAtPiBTZWxmCisgICAgd2hlcmUKKyAgICAgICAgRjogRm4oSSkg LT4gUmVzdWx0PCgpLCBFcnJvcj4gKyBTZW5kICsgQ2xvbmUgKyAnc3RhdGljLAorICAgIHsKKyAg ICAgICAgbGV0IG11dCBoYW5kbGVzID0gVmVjOjpuZXcoKTsKKyAgICAgICAgbGV0IChpbnB1dF90 eCwgaW5wdXRfcngpID0gYm91bmRlZDo6PEk+KHRocmVhZHMpOworCisgICAgICAgIGxldCBhYm9y dCA9IEFyYzo6bmV3KE11dGV4OjpuZXcoTm9uZSkpOworCisgICAgICAgIGZvciBpIGluIDAuLnRo cmVhZHMgeworICAgICAgICAgICAgbGV0IGlucHV0X3J4ID0gaW5wdXRfcnguY2xvbmUoKTsKKyAg ICAgICAgICAgIGxldCBhYm9ydCA9IEFyYzo6Y2xvbmUoJmFib3J0KTsKKyAgICAgICAgICAgIGxl dCBoYW5kbGVyX2ZuID0gaGFuZGxlcl9mbi5jbG9uZSgpOworCisgICAgICAgICAgICBoYW5kbGVz LnB1c2goCisgICAgICAgICAgICAgICAgc3RkOjp0aHJlYWQ6OkJ1aWxkZXI6Om5ldygpCisgICAg ICAgICAgICAgICAgICAgIC5uYW1lKGZvcm1hdCEoInt9ICh7fSkiLCBuYW1lLCBpKSkKKyAgICAg ICAgICAgICAgICAgICAgLnNwYXduKG1vdmUgfHwgbG9vcCB7CisgICAgICAgICAgICAgICAgICAg ICAgICBsZXQgZGF0YSA9IG1hdGNoIGlucHV0X3J4LnJlY3YoKSB7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgT2soZGF0YSkgPT4gZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICBFcnIoXykgPT4gcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAg ICAgICAgICAgICAgICAgIGlmIGxldCBFcnIoZXJyKSA9IChoYW5kbGVyX2ZuKShkYXRhKSB7Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG11dCBndWFyZCA9IGFib3J0LmxvY2soKS51 bndyYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBndWFyZC5pc19ub25lKCkg eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZ3VhcmQgPSBTb21lKGVyci50b19z dHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAu dW53cmFwKCksCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIFNlbGYgeworICAg ICAgICAgICAgaGFuZGxlcywKKyAgICAgICAgICAgIG5hbWU6IG5hbWUudG9fc3RyaW5nKCksCisg ICAgICAgICAgICBpbnB1dDogU29tZShTZW5kSGFuZGxlIHsKKyAgICAgICAgICAgICAgICBpbnB1 dDogaW5wdXRfdHgsCisgICAgICAgICAgICAgICAgYWJvcnQsCisgICAgICAgICAgICB9KSwKKyAg ICAgICAgfQorICAgIH0KKworICAgIC8vLyBSZXR1cm5zIGEgY2xvbmVhYmxlIGNoYW5uZWwgdG8g c2VuZCBkYXRhIHRvIHRoZSB3b3JrZXIgdGhyZWFkcworICAgIHB1YiBmbiBjaGFubmVsKCZzZWxm KSAtPiBTZW5kSGFuZGxlPEk+IHsKKyAgICAgICAgc2VsZi5pbnB1dC5hc19yZWYoKS51bndyYXAo KS5jbG9uZSgpCisgICAgfQorCisgICAgLy8vIFNlbmQgZGF0YSB0byB0aGUgd29ya2VyIHRocmVh ZHMKKyAgICBwdWIgZm4gc2VuZCgmc2VsZiwgaW5wdXQ6IEkpIC0+IFJlc3VsdDwoKSwgRXJyb3I+ IHsKKyAgICAgICAgc2VsZi5pbnB1dC5hc19yZWYoKS51bndyYXAoKS5zZW5kKGlucHV0KT87Cisg ICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBXYWl0IGZvciB3b3JrZXIgdGhyZWFkcyB0 byBjb21wbGV0ZSBhbmQgY2hlY2sgZm9yIGVycm9ycworICAgIHB1YiBmbiBjb21wbGV0ZShtdXQg c2VsZikgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgaW5wdXQgPSBzZWxmLmlu cHV0LnRha2UoKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGFib3J0ID0gQXJjOjpjbG9uZSgmaW5w dXQuYWJvcnQpOworICAgICAgICBjaGVja19hYm9ydCgmYWJvcnQpPzsKKyAgICAgICAgZHJvcChp bnB1dCk7CisKKyAgICAgICAgbGV0IG1zZ19saXN0ID0gc2VsZi5qb2luX3RocmVhZHMoKTsKKwor ICAgICAgICAvLyBhbiBlcnJvciBtaWdodCBiZSBlbmNvdW50ZXJlZCB3aGlsZSB3YWl0aW5nIGZv ciB0aGUgam9pbgorICAgICAgICBjaGVja19hYm9ydCgmYWJvcnQpPzsKKworICAgICAgICBpZiBt c2dfbGlzdC5pc19lbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBPaygoKSk7CisgICAgICAg IH0KKyAgICAgICAgRXJyKGZvcm1hdF9lcnIhKCJ7fSIsIG1zZ19saXN0LmpvaW4oIlxuIikpKQor ICAgIH0KKworICAgIGZuIGpvaW5fdGhyZWFkcygmbXV0IHNlbGYpIC0+IFZlYzxTdHJpbmc+IHsK KyAgICAgICAgbGV0IG11dCBtc2dfbGlzdCA9IFZlYzo6bmV3KCk7CisKKyAgICAgICAgbGV0IG11 dCBpID0gMDsKKyAgICAgICAgd2hpbGUgbGV0IFNvbWUoaGFuZGxlKSA9IHNlbGYuaGFuZGxlcy5w b3AoKSB7CisgICAgICAgICAgICBpZiBsZXQgRXJyKHBhbmljKSA9IGhhbmRsZS5qb2luKCkgewor ICAgICAgICAgICAgICAgIGlmIGxldCBTb21lKHBhbmljX21zZykgPSBwYW5pYy5kb3duY2FzdF9y ZWY6Ojwmc3RyPigpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnX2xpc3QucHVzaChmb3JtYXQh KCJ0aHJlYWQge30gKHtpfSkgcGFuaWNrZWQ6IHtwYW5pY19tc2d9Iiwgc2VsZi5uYW1lKSk7Cisg ICAgICAgICAgICAgICAgfSBlbHNlIGlmIGxldCBTb21lKHBhbmljX21zZykgPSBwYW5pYy5kb3du Y2FzdF9yZWY6OjxTdHJpbmc+KCkgeworICAgICAgICAgICAgICAgICAgICBtc2dfbGlzdC5wdXNo KGZvcm1hdCEoInRocmVhZCB7fSAoe2l9KSBwYW5pY2tlZDoge3BhbmljX21zZ30iLCBzZWxmLm5h bWUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtc2df bGlzdC5wdXNoKGZvcm1hdCEoInRocmVhZCB7fSAoe2l9KSBwYW5pY2tlZCIsIHNlbGYubmFtZSkp OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgKz0gMTsK KyAgICAgICAgfQorICAgICAgICBtc2dfbGlzdAorICAgIH0KK30KKworLy8gTm90ZTogV2UgbWFr ZSBzdXJlIHRoYXQgYWxsIHRocmVhZHMgd2lsbCBiZSBqb2luZWQKK2ltcGw8ST4gRHJvcCBmb3Ig UGFyYWxsZWxIYW5kbGVyPEk+IHsKKyAgICBmbiBkcm9wKCZtdXQgc2VsZikgeworICAgICAgICBk cm9wKHNlbGYuaW5wdXQudGFrZSgpKTsKKyAgICAgICAgd2hpbGUgbGV0IFNvbWUoaGFuZGxlKSA9 IHNlbGYuaGFuZGxlcy5wb3AoKSB7CisgICAgICAgICAgICBsZXQgXyA9IGhhbmRsZS5qb2luKCk7 CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS93cmFwcGVyLmggYi93cmFwcGVyLmgK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkMGFhNgotLS0gL2Rldi9udWxs CisrKyBiL3dyYXBwZXIuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8cnJkLmg+Ci0tIAoyLjM5 LjUKCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KcHZl LWRldmVsIG1haWxpbmcgbGlzdApwdmUtZGV2ZWxAbGlzdHMucHJveG1veC5jb20KaHR0cHM6Ly9s aXN0cy5wcm94bW94LmNvbS9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vcHZlLWRldmVsCg==