From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 3AE581FF15E for ; Wed, 21 Jan 2026 16:14:04 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 0CE1323F4; Wed, 21 Jan 2026 16:14:20 +0100 (CET) From: Samuel Rufinatscha To: pbs-devel@lists.proxmox.com Date: Wed, 21 Jan 2026 16:13:58 +0100 Message-ID: <20260121151408.731516-3-s.rufinatscha@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260121151408.731516-1-s.rufinatscha@proxmox.com> References: <20260121151408.731516-1-s.rufinatscha@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1769008396864 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.261 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: [pbs-devel] [PATCH proxmox-backup v4 2/4] pbs-config: cache verified API token secrets 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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" QWRkcyBhbiBpbi1tZW1vcnkgY2FjaGUgb2Ygc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkIHRva2VuIHNl Y3JldHMuClN1YnNlcXVlbnQgcmVxdWVzdHMgZm9yIHRoZSBzYW1lIHRva2VuK3NlY3JldCBjb21i aW5hdGlvbiBvbmx5IHBlcmZvcm0gYQpjb21wYXJpc29uIHVzaW5nIG9wZW5zc2w6Om1lbWNtcDo6 ZXEgYW5kIGF2b2lkIHJlLXJ1bm5pbmcgdGhlIHBhc3N3b3JkCmhhc2guIFRoZSBjYWNoZSBpcyB1 cGRhdGVkIHdoZW4gYSB0b2tlbiBzZWNyZXQgaXMgc2V0IGFuZCBjbGVhcmVkIHdoZW4gYQp0b2tl biBpcyBkZWxldGVkLgoKU2lnbmVkLW9mZi1ieTogU2FtdWVsIFJ1ZmluYXRzY2hhIDxzLnJ1Zmlu YXRzY2hhQHByb3htb3guY29tPgotLS0KQ2hhbmdlcyBmcm9tIHYzIHRvIHY0OgoqIEFkZCBnZW4g cGFyYW0gdG8gaW52YWxpZGF0ZV9jYWNoZV9zdGF0ZSgpCiogVmFsaWRhdGVzIHRoZSBnZW5lcmF0 aW9uIGJ1bXAgYWZ0ZXIgb2J0YWluaW5nIHdyaXRlIGxvY2sgaW4KYXBwbHlfYXBpX211dGF0aW9u CiogUGFzcyBsb2NrIHRvIGFwcGx5X2FwaV9tdXRhdGlvbgoqIFJlbW92ZSB1bm5lY2Vzc2FyeSBn ZW4gY2hlY2sgY2FjaGVfdHJ5X3NlY3JldF9tYXRjaGVzCiogQWRqdXN0ZWQgY29tbWl0IG1lc3Nh Z2UKCkNoYW5nZXMgZnJvbSB2MiB0byB2MzoKKiBSZXBsYWNlZCBwcm9jZXNzLWxvY2FsIGNhY2hl IGludmFsaWRhdGlvbiAoQXRvbWljVTY0CkFQSV9NVVRBVElPTl9HRU5FUkFUSU9OKSB3aXRoIGEg Y3Jvc3MtcHJvY2VzcyBzaGFyZWQgZ2VuZXJhdGlvbiB2aWEKQ29uZmlnVmVyc2lvbkNhY2hlLgoq IFZhbGlkYXRlIHNoYXJlZCBnZW5lcmF0aW9uIGJlZm9yZS9hZnRlciB0aGUgY29uc3RhbnQtdGlt ZSBzZWNyZXQKY29tcGFyZTsgb25seSBpbnNlcnQgaW50byBjYWNoZSBpZiB0aGUgZ2VuZXJhdGlv biBpcyB1bmNoYW5nZWQuCiogaW52YWxpZGF0ZV9jYWNoZV9zdGF0ZSgpIG9uIGluc2VydCBpZiBz aGFyZWQgZ2VuZXJhdGlvbiBjaGFuZ2VkLgoKQ2hhbmdlcyBmcm9tIHYxIHRvIHYyOgoqIFJlcGxh Y2UgT25jZUNlbGwgd2l0aCBMYXp5TG9jaywgYW5kIHN0ZDo6c3luYzo6UndMb2NrIHdpdGgKcGFy a2luZ19sb3Q6OlJ3TG9jay4KKiBBZGQgQVBJX01VVEFUSU9OX0dFTkVSQVRJT04gYW5kIGd1YXJk IGNhY2hlIGluc2VydHMKdG8gcHJldmVudCDigJx6b21iaWUgaW5zZXJ0c+KAnSBhY3Jvc3MgY29u Y3VycmVudCBzZXQvZGVsZXRlLgoqIFJlZmFjdG9yIGNhY2hlIG9wZXJhdGlvbnMgaW50byBjYWNo ZV90cnlfc2VjcmV0X21hdGNoZXMsCmNhY2hlX3RyeV9pbnNlcnRfc2VjcmV0LCBhbmQgY2VudHJh bGl6ZSB3cml0ZS1zaWRlIGJlaGF2aW9yIGluCmFwcGx5X2FwaV9tdXRhdGlvbi4KKiBTd2l0Y2gg ZmFzdC1wYXRoIGNhY2hlIGFjY2VzcyB0byB0cnlfcmVhZC90cnlfd3JpdGUgKGJlc3QtZWZmb3J0 KS4KCiBDYXJnby50b21sICAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwogcGJzLWNvbmZpZy9D YXJnby50b21sICAgICAgICAgIHwgICAxICsKIHBicy1jb25maWcvc3JjL3Rva2VuX3NoYWRvdy5y cyB8IDE2MCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIDMgZmlsZXMgY2hhbmdl ZCwgMTU5IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvQ2FyZ28u dG9tbCBiL0NhcmdvLnRvbWwKaW5kZXggMGRhMTgzODMuLmFlZDY2ZmUzIDEwMDY0NAotLS0gYS9D YXJnby50b21sCisrKyBiL0NhcmdvLnRvbWwKQEAgLTE0Myw2ICsxNDMsNyBAQCBub20gPSAiNyIK IG51bS10cmFpdHMgPSAiMC4yIgogb25jZV9jZWxsID0gIjEuMy4xIgogb3BlbnNzbCA9ICIwLjEw LjQwIgorcGFya2luZ19sb3QgPSAiMC4xMiIKIHBlcmNlbnQtZW5jb2RpbmcgPSAiMi4xIgogcGlu LXByb2plY3QtbGl0ZSA9ICIwLjIiCiByZWdleCA9ICIxLjUuNSIKZGlmZiAtLWdpdCBhL3Bicy1j b25maWcvQ2FyZ28udG9tbCBiL3Bicy1jb25maWcvQ2FyZ28udG9tbAppbmRleCA3NGFmYjNjNi4u ZWI4MWNlMDAgMTAwNjQ0Ci0tLSBhL3Bicy1jb25maWcvQ2FyZ28udG9tbAorKysgYi9wYnMtY29u ZmlnL0NhcmdvLnRvbWwKQEAgLTEzLDYgKzEzLDcgQEAgbGliYy53b3Jrc3BhY2UgPSB0cnVlCiBu aXgud29ya3NwYWNlID0gdHJ1ZQogb25jZV9jZWxsLndvcmtzcGFjZSA9IHRydWUKIG9wZW5zc2wu d29ya3NwYWNlID0gdHJ1ZQorcGFya2luZ19sb3Qud29ya3NwYWNlID0gdHJ1ZQogcmVnZXgud29y a3NwYWNlID0gdHJ1ZQogc2VyZGUud29ya3NwYWNlID0gdHJ1ZQogc2VyZGVfanNvbi53b3Jrc3Bh Y2UgPSB0cnVlCmRpZmYgLS1naXQgYS9wYnMtY29uZmlnL3NyYy90b2tlbl9zaGFkb3cucnMgYi9w YnMtY29uZmlnL3NyYy90b2tlbl9zaGFkb3cucnMKaW5kZXggNjQwZmFiYmYuLmQ1YWE1ZGUyIDEw MDY0NAotLS0gYS9wYnMtY29uZmlnL3NyYy90b2tlbl9zaGFkb3cucnMKKysrIGIvcGJzLWNvbmZp Zy9zcmMvdG9rZW5fc2hhZG93LnJzCkBAIC0xLDYgKzEsOCBAQAogdXNlIHN0ZDo6Y29sbGVjdGlv bnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpzeW5jOjpMYXp5TG9jazsKIAogdXNlIGFueWhvdzo6e2Jh aWwsIGZvcm1hdF9lcnIsIEVycm9yfTsKK3VzZSBwYXJraW5nX2xvdDo6UndMb2NrOwogdXNlIHNl cmRlOjp7RGVzZXJpYWxpemUsIFNlcmlhbGl6ZX07CiB1c2Ugc2VyZGVfanNvbjo6e2Zyb21fdmFs dWUsIFZhbHVlfTsKIApAQCAtMTMsNiArMTUsMTggQEAgdXNlIGNyYXRlOjp7b3Blbl9iYWNrdXBf bG9ja2ZpbGUsIEJhY2t1cExvY2tHdWFyZH07CiBjb25zdCBMT0NLX0ZJTEU6ICZzdHIgPSBwYnNf YnVpbGRjZmc6OmNvbmZpZ2RpciEoIi90b2tlbi5zaGFkb3cubG9jayIpOwogY29uc3QgQ09ORl9G SUxFOiAmc3RyID0gcGJzX2J1aWxkY2ZnOjpjb25maWdkaXIhKCIvdG9rZW4uc2hhZG93Iik7CiAK Ky8vLyBHbG9iYWwgaW4tbWVtb3J5IGNhY2hlIGZvciBzdWNjZXNzZnVsbHkgdmVyaWZpZWQgQVBJ IHRva2VuIHNlY3JldHMuCisvLy8gVGhlIGNhY2hlIHN0b3JlcyBwbGFpbiB0ZXh0IHNlY3JldHMg Zm9yIHRva2VuIEF1dGhpZHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbgorLy8vIHZlcmlmaWVkIGFn YWluc3QgdGhlIGhhc2hlZCB2YWx1ZXMgaW4gYHRva2VuLnNoYWRvd2AuIFRoaXMgYWxsb3dzIGZv ciBjaGVhcAorLy8vIHN1YnNlcXVlbnQgYXV0aGVudGljYXRpb25zIGZvciB0aGUgc2FtZSB0b2tl bitzZWNyZXQgY29tYmluYXRpb24sIGF2b2lkaW5nCisvLy8gcmVjb21wdXRpbmcgdGhlIHBhc3N3 b3JkIGhhc2ggb24gZXZlcnkgcmVxdWVzdC4KK3N0YXRpYyBUT0tFTl9TRUNSRVRfQ0FDSEU6IExh enlMb2NrPFJ3TG9jazxBcGlUb2tlblNlY3JldENhY2hlPj4gPSBMYXp5TG9jazo6bmV3KHx8IHsK KyAgICBSd0xvY2s6Om5ldyhBcGlUb2tlblNlY3JldENhY2hlIHsKKyAgICAgICAgc2VjcmV0czog SGFzaE1hcDo6bmV3KCksCisgICAgICAgIHNoYXJlZF9nZW46IDAsCisgICAgfSkKK30pOworCiAj W2Rlcml2ZShTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KICNbc2VyZGUocmVuYW1lX2FsbCA9ICJr ZWJhYi1jYXNlIildCiAvLy8gQXBpVG9rZW4gaWQgLyBzZWNyZXQgcGFpcgpAQCAtNTQsOSArNjgs MjcgQEAgcHViIGZuIHZlcmlmeV9zZWNyZXQodG9rZW5pZDogJkF1dGhpZCwgc2VjcmV0OiAmc3Ry KSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CiAgICAgICAgIGJhaWwhKCJub3QgYW4gQVBJIHRva2Vu IElEIik7CiAgICAgfQogCisgICAgLy8gRmFzdCBwYXRoCisgICAgaWYgY2FjaGVfdHJ5X3NlY3Jl dF9tYXRjaGVzKHRva2VuaWQsIHNlY3JldCkgeworICAgICAgICByZXR1cm4gT2soKCkpOworICAg IH0KKworICAgIC8vIFNsb3cgcGF0aAorICAgIC8vIEZpcnN0LCBjYXB0dXJlIHRoZSBzaGFyZWQg Z2VuZXJhdGlvbiBiZWZvcmUgZG9pbmcgdGhlIGhhc2ggdmVyaWZpY2F0aW9uLgorICAgIGxldCBn ZW5fYmVmb3JlID0gdG9rZW5fc2hhZG93X3NoYXJlZF9nZW4oKTsKKwogICAgIGxldCBkYXRhID0g cmVhZF9maWxlKCk/OwogICAgIG1hdGNoIGRhdGEuZ2V0KHRva2VuaWQpIHsKLSAgICAgICAgU29t ZShoYXNoZWRfc2VjcmV0KSA9PiBwcm94bW94X3N5czo6Y3J5cHQ6OnZlcmlmeV9jcnlwdF9wdyhz ZWNyZXQsIGhhc2hlZF9zZWNyZXQpLAorICAgICAgICBTb21lKGhhc2hlZF9zZWNyZXQpID0+IHsK KyAgICAgICAgICAgIHByb3htb3hfc3lzOjpjcnlwdDo6dmVyaWZ5X2NyeXB0X3B3KHNlY3JldCwg aGFzaGVkX3NlY3JldCk/OworCisgICAgICAgICAgICAvLyBUcnkgdG8gY2FjaGUgb25seSBpZiBu b3RoaW5nIGNoYW5nZWQgd2hpbGUgdmVyaWZ5aW5nIHRoZSBzZWNyZXQuCisgICAgICAgICAgICBp ZiBsZXQgU29tZShnZW4pID0gZ2VuX2JlZm9yZSB7CisgICAgICAgICAgICAgICAgY2FjaGVfdHJ5 X2luc2VydF9zZWNyZXQodG9rZW5pZC5jbG9uZSgpLCBzZWNyZXQudG9fb3duZWQoKSwgZ2VuKTsK KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KICAgICAgICAg Tm9uZSA9PiBiYWlsISgiaW52YWxpZCBBUEkgdG9rZW4iKSwKICAgICB9CiB9CkBAIC03NSwxMyAr MTA3LDE1IEBAIGZuIHNldF9zZWNyZXQodG9rZW5pZDogJkF1dGhpZCwgc2VjcmV0OiAmc3RyKSAt PiBSZXN1bHQ8KCksIEVycm9yPiB7CiAgICAgICAgIGJhaWwhKCJub3QgYW4gQVBJIHRva2VuIElE Iik7CiAgICAgfQogCi0gICAgbGV0IF9ndWFyZCA9IGxvY2tfY29uZmlnKCk/OworICAgIGxldCBn dWFyZCA9IGxvY2tfY29uZmlnKCk/OwogCiAgICAgbGV0IG11dCBkYXRhID0gcmVhZF9maWxlKCk/ OwogICAgIGxldCBoYXNoZWRfc2VjcmV0ID0gcHJveG1veF9zeXM6OmNyeXB0OjplbmNyeXB0X3B3 KHNlY3JldCk/OwogICAgIGRhdGEuaW5zZXJ0KHRva2VuaWQuY2xvbmUoKSwgaGFzaGVkX3NlY3Jl dCk7CiAgICAgd3JpdGVfZmlsZShkYXRhKT87CiAKKyAgICBhcHBseV9hcGlfbXV0YXRpb24oZ3Vh cmQsIHRva2VuaWQsIFNvbWUoc2VjcmV0KSk7CisKICAgICBPaygoKSkKIH0KIApAQCAtOTEsMTEg KzEyNSwxMzEgQEAgcHViIGZuIGRlbGV0ZV9zZWNyZXQodG9rZW5pZDogJkF1dGhpZCkgLT4gUmVz dWx0PCgpLCBFcnJvcj4gewogICAgICAgICBiYWlsISgibm90IGFuIEFQSSB0b2tlbiBJRCIpOwog ICAgIH0KIAotICAgIGxldCBfZ3VhcmQgPSBsb2NrX2NvbmZpZygpPzsKKyAgICBsZXQgZ3VhcmQg PSBsb2NrX2NvbmZpZygpPzsKIAogICAgIGxldCBtdXQgZGF0YSA9IHJlYWRfZmlsZSgpPzsKICAg ICBkYXRhLnJlbW92ZSh0b2tlbmlkKTsKICAgICB3cml0ZV9maWxlKGRhdGEpPzsKIAorICAgIGFw cGx5X2FwaV9tdXRhdGlvbihndWFyZCwgdG9rZW5pZCwgTm9uZSk7CisKICAgICBPaygoKSkKIH0K Kworc3RydWN0IEFwaVRva2VuU2VjcmV0Q2FjaGUgeworICAgIC8vLyBLZXlzIGFyZSB0b2tlbiBB dXRoaWRzLCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIHBsYWluIHRleHQgc2VjcmV0cy4K KyAgICAvLy8gRW50cmllcyBhcmUgYWRkZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIG9uLWRpc2sgdmVy aWZpY2F0aW9uIGluCisgICAgLy8vIGB2ZXJpZnlfc2VjcmV0YCBvciB3aGVuIGEgbmV3IHRva2Vu IHNlY3JldCBpcyBnZW5lcmF0ZWQgYnkKKyAgICAvLy8gYGdlbmVyYXRlX2FuZF9zZXRfc2VjcmV0 YC4gVXNlZCB0byBhdm9pZCByZXBlYXRlZAorICAgIC8vLyBwYXNzd29yZC1oYXNoIGNvbXB1dGF0 aW9uIG9uIHN1YnNlcXVlbnQgYXV0aGVudGljYXRpb25zLgorICAgIHNlY3JldHM6IEhhc2hNYXA8 QXV0aGlkLCBDYWNoZWRTZWNyZXQ+LAorICAgIC8vLyBTaGFyZWQgZ2VuZXJhdGlvbiB0byBkZXRl Y3QgbXV0YXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIHRva2VuLnNoYWRvdyBmaWxlLgorICAgIHNo YXJlZF9nZW46IHVzaXplLAorfQorCisvLy8gQ2FjaGVkIHNlY3JldC4KK3N0cnVjdCBDYWNoZWRT ZWNyZXQgeworICAgIHNlY3JldDogU3RyaW5nLAorfQorCitmbiBjYWNoZV90cnlfaW5zZXJ0X3Nl Y3JldCh0b2tlbmlkOiBBdXRoaWQsIHNlY3JldDogU3RyaW5nLCBzaGFyZWRfZ2VuX2JlZm9yZTog dXNpemUpIHsKKyAgICBsZXQgU29tZShtdXQgY2FjaGUpID0gVE9LRU5fU0VDUkVUX0NBQ0hFLnRy eV93cml0ZSgpIGVsc2UgeworICAgICAgICByZXR1cm47CisgICAgfTsKKworICAgIGxldCBTb21l KHNoYXJlZF9nZW5fbm93KSA9IHRva2VuX3NoYWRvd19zaGFyZWRfZ2VuKCkgZWxzZSB7CisgICAg ICAgIHJldHVybjsKKyAgICB9OworCisgICAgLy8gSWYgdGhpcyBwcm9jZXNzIG1pc3NlZCBhIGdl bmVyYXRpb24gYnVtcCwgaXRzIGNhY2hlIGlzIHN0YWxlLgorICAgIGlmIGNhY2hlLnNoYXJlZF9n ZW4gIT0gc2hhcmVkX2dlbl9ub3cgeworICAgICAgICBpbnZhbGlkYXRlX2NhY2hlX3N0YXRlX2Fu ZF9zZXRfZ2VuKCZtdXQgY2FjaGUsIHNoYXJlZF9nZW5fbm93KTsKKyAgICB9CisKKyAgICAvLyBJ ZiBhIG11dGF0aW9uIGhhcHBlbmVkIHdoaWxlIHdlIHdlcmUgdmVyaWZ5aW5nIHRoZSBzZWNyZXQs IGRvIG5vdCBpbnNlcnQuCisgICAgaWYgc2hhcmVkX2dlbl9ub3cgPT0gc2hhcmVkX2dlbl9iZWZv cmUgeworICAgICAgICBjYWNoZS5zZWNyZXRzLmluc2VydCh0b2tlbmlkLCBDYWNoZWRTZWNyZXQg eyBzZWNyZXQgfSk7CisgICAgfQorfQorCisvLy8gVHJpZXMgdG8gbWF0Y2ggdGhlIGdpdmVuIHRv a2VuIHNlY3JldCBhZ2FpbnN0IHRoZSBjYWNoZWQgc2VjcmV0LgorLy8vCisvLy8gVmVyaWZpZXMg dGhlIGdlbmVyYXRpb24vdmVyc2lvbiBiZWZvcmUgZG9pbmcgdGhlIGNvbnN0YW50LXRpbWUKKy8v LyBjb21wYXJpc29uIHRvIHJlZHVjZSBUT0NUT1Ugcmlzay4gRHVyaW5nIHRva2VuIHJvdGF0aW9u IG9yIGRlbGV0aW9uCisvLy8gdG9rZW5zIGZvciBpbi1mbGlnaHQgcmVxdWVzdHMgbWF5IHN0aWxs IHZhbGlkYXRlIGFnYWluc3QgdGhlIHByZXZpb3VzCisvLy8gZ2VuZXJhdGlvbi4KK2ZuIGNhY2hl X3RyeV9zZWNyZXRfbWF0Y2hlcyh0b2tlbmlkOiAmQXV0aGlkLCBzZWNyZXQ6ICZzdHIpIC0+IGJv b2wgeworICAgIGxldCBTb21lKGNhY2hlKSA9IFRPS0VOX1NFQ1JFVF9DQUNIRS50cnlfcmVhZCgp IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKyAgICBsZXQgU29tZShlbnRy eSkgPSBjYWNoZS5zZWNyZXRzLmdldCh0b2tlbmlkKSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZh bHNlOworICAgIH07CisgICAgbGV0IFNvbWUoY3VycmVudF9nZW4pID0gdG9rZW5fc2hhZG93X3No YXJlZF9nZW4oKSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisKKyAgICBp ZiBjdXJyZW50X2dlbiA9PSBjYWNoZS5zaGFyZWRfZ2VuIHsKKyAgICAgICAgcmV0dXJuIG9wZW5z c2w6Om1lbWNtcDo6ZXEoZW50cnkuc2VjcmV0LmFzX2J5dGVzKCksIHNlY3JldC5hc19ieXRlcygp KTsKKyAgICB9CisKKyAgICBmYWxzZQorfQorCitmbiBhcHBseV9hcGlfbXV0YXRpb24oX2d1YXJk OiBCYWNrdXBMb2NrR3VhcmQsIHRva2VuaWQ6ICZBdXRoaWQsIG5ld19zZWNyZXQ6IE9wdGlvbjwm c3RyPikgeworICAgIC8vIFNpZ25hbCBjYWNoZSBpbnZhbGlkYXRpb24gdG8gb3RoZXIgcHJvY2Vz c2VzIChiZXN0LWVmZm9ydCkuCisgICAgbGV0IGJ1bXBlZF9nZW4gPSBidW1wX3Rva2VuX3NoYWRv d19zaGFyZWRfZ2VuKCk7CisKKyAgICBsZXQgbXV0IGNhY2hlID0gVE9LRU5fU0VDUkVUX0NBQ0hF LndyaXRlKCk7CisKKyAgICAvLyBJZiB3ZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IGdlbmVyYXRp b24sIHdlIGNhbm5vdCB0cnVzdCB0aGUgY2FjaGUKKyAgICBsZXQgU29tZShjdXJyZW50X2dlbikg PSB0b2tlbl9zaGFkb3dfc2hhcmVkX2dlbigpIGVsc2UgeworICAgICAgICBpbnZhbGlkYXRlX2Nh Y2hlX3N0YXRlX2FuZF9zZXRfZ2VuKCZtdXQgY2FjaGUsIDApOworICAgICAgICByZXR1cm47Cisg ICAgfTsKKworICAgIC8vIElmIHdlIGNhbm5vdCBidW1wIHRoZSBzaGFyZWQgZ2VuZXJhdGlvbiwg b3IgaWYgaXQgY2hhbmdlZCBhZnRlcgorICAgIC8vIG9idGFpbmluZyB0aGUgY2FjaGUgd3JpdGUg bG9jaywgd2UgY2Fubm90IHRydXN0IHRoZSBjYWNoZQorICAgIGlmIGJ1bXBlZF9nZW4gIT0gU29t ZShjdXJyZW50X2dlbikgeworICAgICAgICBpbnZhbGlkYXRlX2NhY2hlX3N0YXRlX2FuZF9zZXRf Z2VuKCZtdXQgY2FjaGUsIGN1cnJlbnRfZ2VuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor ICAgIC8vIFVwZGF0ZSB0byB0aGUgcG9zdC1tdXRhdGlvbiBnZW5lcmF0aW9uLgorICAgIGNhY2hl LnNoYXJlZF9nZW4gPSBjdXJyZW50X2dlbjsKKworICAgIC8vIEFwcGx5IHRoZSBuZXcgbXV0YXRp b24uCisgICAgbWF0Y2ggbmV3X3NlY3JldCB7CisgICAgICAgIFNvbWUoc2VjcmV0KSA9PiB7Cisg ICAgICAgICAgICBjYWNoZS5zZWNyZXRzLmluc2VydCgKKyAgICAgICAgICAgICAgICB0b2tlbmlk LmNsb25lKCksCisgICAgICAgICAgICAgICAgQ2FjaGVkU2VjcmV0IHsKKyAgICAgICAgICAgICAg ICAgICAgc2VjcmV0OiBzZWNyZXQudG9fb3duZWQoKSwKKyAgICAgICAgICAgICAgICB9LAorICAg ICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgIGNh Y2hlLnNlY3JldHMucmVtb3ZlKHRva2VuaWQpOworICAgICAgICB9CisgICAgfQorfQorCisvLy8g R2V0IHRoZSBjdXJyZW50IHNoYXJlZCBnZW5lcmF0aW9uLgorZm4gdG9rZW5fc2hhZG93X3NoYXJl ZF9nZW4oKSAtPiBPcHRpb248dXNpemU+IHsKKyAgICBjcmF0ZTo6Q29uZmlnVmVyc2lvbkNhY2hl OjpuZXcoKQorICAgICAgICAub2soKQorICAgICAgICAubWFwKHxjdmN8IGN2Yy50b2tlbl9zaGFk b3dfZ2VuZXJhdGlvbigpKQorfQorCisvLy8gQnVtcCBhbmQgcmV0dXJuIHRoZSBuZXcgc2hhcmVk IGdlbmVyYXRpb24uCitmbiBidW1wX3Rva2VuX3NoYWRvd19zaGFyZWRfZ2VuKCkgLT4gT3B0aW9u PHVzaXplPiB7CisgICAgY3JhdGU6OkNvbmZpZ1ZlcnNpb25DYWNoZTo6bmV3KCkKKyAgICAgICAg Lm9rKCkKKyAgICAgICAgLm1hcCh8Y3ZjfCBjdmMuaW5jcmVhc2VfdG9rZW5fc2hhZG93X2dlbmVy YXRpb24oKSArIDEpCit9CisKKy8vLyBJbnZhbGlkYXRlcyBsb2NhbCBjYWNoZSBjb250ZW50cyBh bmQgc2V0cy91cGRhdGVzIHRoZSBjYWNoZWQgZ2VuZXJhdGlvbi4KK2ZuIGludmFsaWRhdGVfY2Fj aGVfc3RhdGVfYW5kX3NldF9nZW4oY2FjaGU6ICZtdXQgQXBpVG9rZW5TZWNyZXRDYWNoZSwgZ2Vu OiB1c2l6ZSkgeworICAgIGNhY2hlLnNlY3JldHMuY2xlYXIoKTsKKyAgICBjYWNoZS5zaGFyZWRf Z2VuID0gZ2VuOworfQotLSAKMi40Ny4zCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCnBicy1kZXZlbCBtYWlsaW5nIGxpc3QKcGJzLWRldmVsQGxpc3Rz LnByb3htb3guY29tCmh0dHBzOi8vbGlzdHMucHJveG1veC5jb20vY2dpLWJpbi9tYWlsbWFuL2xp c3RpbmZvL3Bicy1kZXZlbAo=