From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms13.migadu.com with LMTPS id YDXBEvhabWdKJQAAqHPOHw:P1 (envelope-from ) for ; Thu, 26 Dec 2024 13:32:40 +0000 Received: from aspmx1.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0.migadu.com with LMTPS id YDXBEvhabWdKJQAAqHPOHw (envelope-from ) for ; Thu, 26 Dec 2024 14:32:40 +0100 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=qPzp1TFm; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20230601 header.b=N49lwEOl; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=gmail.com (policy=none) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1735219959; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:resent-cc:resent-from:resent-sender: resent-message-id:in-reply-to:in-reply-to:references:references: list-id:list-help:list-unsubscribe:list-subscribe:list-post: dkim-signature; bh=eEgsw1P3Eos7UECBw899z0yKR+fx0WEmIZgd8qG6glU=; b=jdtANMOUflZKNDCGWOMKhuHOc4TcQ/x1jIdFsaJjiWgYJ5ACi55px62LYNfQZ+DruO20tQ 1Fqfg3TWNMQnQitl551V+xcrwlgHBH3OmRtvEoSzbVcMWlTCqKPJtaDDKODzdaJkp0RjF9 NSDnaKyQLR91itQN0TxS0MFFxP9C6fq4XxMefGmeKQrJjqPMekS64/xfVGanpE/4dWwf/D 1lj0I50Xhvz1s6PAVL5NXsK5keyuK9nMnuSaWNK8b/Bt6AjcVZSnkqgFPMOJMsq4o06UWp NU4cyF4pLhiITHxzS+91wqbVC5LKRcurd2HFhffHrh0JeVSd83EiVnP3XwlgNQ== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=qPzp1TFm; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20230601 header.b=N49lwEOl; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=gmail.com (policy=none) ARC-Seal: i=1; s=key1; d=yhetil.org; t=1735219959; a=rsa-sha256; cv=none; b=XJusXX8GA6wje8mIQFbr1izZVd0g3kB3XDA4zsD75DJqkypNRNIqs3d5j/fNDhutsUMsK6 t3heJ8kV9Yj3yp/ovz8ssA5YT395a0mIsW2r/BmpT9UjU3eVPD2vOj4TKBCsPfV4JDkiWs TriQxozCGXryvPOOEmc+C8AZTyQSBgOvj9zIegWbghHKQPqFKfDDd8iVZBmkQERbTvH64P 81aRnC8wi9lSNYBkdl4QAtignJ5CxrO00WoC7bUw9wERpsOzuKsi77XF8Q9Ki8VzZsPTWs DaoOKevFHEdHQSwJib25+Q/BKQQIgaPXsxVoSlK9uc73yZCPOBaNlxC6zHtPJQ== Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 258095D566 for ; Thu, 26 Dec 2024 14:32:39 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tQnyC-00080t-Ki; Thu, 26 Dec 2024 08:32:08 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tQny6-00080N-Oy for guix-patches@gnu.org; Thu, 26 Dec 2024 08:32:05 -0500 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tQny6-0006Qm-GG for guix-patches@gnu.org; Thu, 26 Dec 2024 08:32:02 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=Date:From:In-Reply-To:References:MIME-Version:To:Subject; bh=eEgsw1P3Eos7UECBw899z0yKR+fx0WEmIZgd8qG6glU=; b=qPzp1TFmD2scNW5zMJzYi5QduUkNC6muPyLpWWLmw/IJi/k6jRW9nkJMU+Vuv1JuMufhc9Snmb+2AIVMsupm7RYqjQ0te/F4j6i5WVhjVwcYk2/oxOrSi0DOroc2Bo1Sz1SSJGv5yrWyXkW00e2AvsTnId0Iav3mbYmiRTyygCT/ah7rq+0UNtCpNF+IcYgPzLIjxq5xrOVVJ7jxY9Xe7UO9Hh7+c2oDVQGePOwPoHnjwSdMoS6LHqS0YL2d4bI5Hg56hSaV8fj7keG0C5gBHA/8bO/E0ijMUFZISIw8kfUE/sKwCqt8uDBle7DREDCxOnIa1yImAw/qKJKNVOwAwg==; Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1tQny6-0006GB-0s for guix-patches@gnu.org; Thu, 26 Dec 2024 08:32:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#74900] Resent-From: Daniel Khodabakhsh Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Thu, 26 Dec 2024 13:32:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 74900 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 74900@debbugs.gnu.org Received: via spool by 74900-submit@debbugs.gnu.org id=B74900.173521991124040 (code B ref 74900); Thu, 26 Dec 2024 13:32:01 +0000 Received: (at 74900) by debbugs.gnu.org; 26 Dec 2024 13:31:51 +0000 Received: from localhost ([127.0.0.1]:40468 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tQnxt-0006Fe-EQ for submit@debbugs.gnu.org; Thu, 26 Dec 2024 08:31:51 -0500 Received: from mail-ua1-f42.google.com ([209.85.222.42]:49540) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tQnxp-0006FO-Aj for 74900@debbugs.gnu.org; Thu, 26 Dec 2024 08:31:48 -0500 Received: by mail-ua1-f42.google.com with SMTP id a1e0cc1a2514c-85c4c9349b3so1363185241.3 for <74900@debbugs.gnu.org>; Thu, 26 Dec 2024 05:31:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735219839; x=1735824639; darn=debbugs.gnu.org; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=eEgsw1P3Eos7UECBw899z0yKR+fx0WEmIZgd8qG6glU=; b=N49lwEOlDNwLCiL3liix7as6hKYsi24ph/cwzgLOELQMIIhDG3KzmZ+FU39DmovkFs 2qwvbwlbgfio1myJMdwbvlO5sZUO1ZNytcrF+aENh/mjsg8h6wApcWq1+vMb7X+Un9kL 9pJ67EJX4+3Fzj7YhZ0+d+/2rf/psvZ/G77ClJihSkEW/LiL9k6/fT/6nst0CENC23kc Kro66s3FQ6ghjdRnAoan2tjLxjVjUKLhqj8jdwosLmg5cJgZoixAlcwO7oW/F99kYjJh g+2ITqJOv/bbjMFAFE/kIkOFFJAby1gvKa0y7cJIq8cqiC3wweu8y81/W7Cbnmmj7BSt 7ASw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735219839; x=1735824639; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=eEgsw1P3Eos7UECBw899z0yKR+fx0WEmIZgd8qG6glU=; b=v10sFY1C0grDp7zjQAfDPWXzP+OyhtR2xGDMvm/GfGg9pbQFnwmd4h7Y5/i36k/1ZQ mc9gQCrhw8QmoSPiRU/LOCytIgbg3sP5veYUK3RqnI3wHrK4ZkkWIDXKZg04mIjds4il AW5Der3cA4BgGM8YfFS71l3FQMeyImw301ugz8980L4Nh/qiplnMCwCkfnZo5I9bubjq 5u6z7ISdqXNAy6iC1G2hqSPb8lv4xs9GcdKOAhzqPp5qFzaNMeMWgoe/BnjDaFIJDiUl XMhVWRJndXX3vFes9jr8FXixoh1gL8MADykxJhZvtJLSJAiHu/VQWF61D+BozLzTNPP5 YAug== X-Gm-Message-State: AOJu0YzuK6RJTStx9AJfCNpKWpdYcPycVAKqiNgGGnZTbRLT0aQTnN+q R4mmqgScbDjUsgBOhAURugtZavjbG4t5OdQ8Hu+Vj4UZXBmzMAjlhV+PT67+q6OQ93+E7usfvx9 EKSW86ddc7F0VfiPUYVKq5LhDfQyFUp44 X-Gm-Gg: ASbGncvZfMKblxVYR0w7Zpl7nYaaQNoCzBLyfhXv2aQZras/zKeCCqahWy9tvoBPqJC 9/byT6Q6Md7LhtGjRg+Fvto2iq0HbQla5kL2yNvnS X-Google-Smtp-Source: AGHT+IGljGo+b20tSfv5PrNP7PVa0mUw71MEZ/iPOTpBhe350N3ofdv1LfzmqBONIMAcrHQDG+RjZ71mGG/xgpjuSa4= X-Received: by 2002:a05:6102:548a:b0:4b1:1a9d:ecbc with SMTP id ada2fe7eead31-4b2cc45723emr19872806137.20.1735219839143; Thu, 26 Dec 2024 05:30:39 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Daniel Khodabakhsh Date: Thu, 26 Dec 2024 13:30:26 +0000 Message-ID: Content-Type: multipart/mixed; boundary="0000000000001eb841062a2c5a1f" X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: guix-patches-bounces+larch=yhetil.org@gnu.org X-Migadu-Country: US X-Migadu-Flow: FLOW_IN X-Migadu-Queue-Id: 258095D566 X-Migadu-Scanner: mx13.migadu.com X-Migadu-Spam-Score: -1.69 X-Spam-Score: -1.69 X-TUID: TGVilN1gR4// --0000000000001eb841062a2c5a1f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Here's the patch again but with a formatting issue fixed and a fresh merge from master: >From 19449feab9e31590bbd7c933b21163f8b398439b Mon Sep 17 00:00:00 2001 From: Daniel Khodabakhsh Date: Thu, 26 Dec 2024 04:35:39 -0800 Subject: [PATCH] Replace (guix build json) with (json) in node build system This change replaces the use of (guix build json) with (json) for the node ecosystem. Since guile-json is a dependency of Guix, and it's used elsewhere in the project, it makes sense to use this instead of rolling our own JSON implementation with (guix build json). This is one step to move away from (guix build json), there will be other changes to remove the other uses of it. Signed-off-by: Daniel Khodabakhsh Change-Id: I9fd5152a98b6a241d414e9a94ab179c9cabcfb85 --- gnu/packages/node-xyz.scm | 148 ++++++++++++------------- guix/build-system/node.scm | 6 +- guix/build/node-build-system.scm | 180 ++++++++++++------------------- 3 files changed, 139 insertions(+), 195 deletions(-) diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm index e98eda2a01..ec3f9fbfb1 100644 --- a/gnu/packages/node-xyz.scm +++ b/gnu/packages/node-xyz.scm @@ -7,6 +7,7 @@ ;;; Copyright =C2=A9 2021 Dhruvin Gandhi ;;; Copyright =C2=A9 2022 Nicolas Graves ;;; Copyright =C2=A9 2023 Jelle Licht +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,14 +25,14 @@ ;;; along with GNU Guix. If not, see . (define-module (gnu packages node-xyz) - #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu packages sqlite) #:use-module (gnu packages python) #:use-module (gnu packages web) + #:use-module (guix build-system node) #:use-module (guix gexp) - #:use-module (guix packages) #:use-module (guix git-download) - #:use-module (guix build-system node)) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages)) ;;; ;;; Please: Try to add new module packages in alphabetic order. @@ -69,19 +70,17 @@ (define-public node-acorn ;; it would try to use the build environment and would block = the ;; automatic building by other packages making use of node-ac= orn. ;; TODO: Add utility function - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (cons '@ (map (match-lambda - (("scripts" @ . scripts-alist) - `("scripts" @ ,@(filter (match-lambda - (("prepare" .= _) - #f) - (_ - #t)) - scripts-alist))= ) - (other other)) - pkg-meta-alist))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (filter + (match-lambda + (("prepare" . _) #f) + (_ #t)) + scripts-alist))) + (other other)) + pkg-meta-alist))))) (replace 'build (lambda* (#:key inputs native-inputs #:allow-other-keys) (let ((esbuild (search-input-file (or native-inputs inputs) @@ -158,23 +157,17 @@ (define-public node-addon-api (lambda args (define new-test-script "echo stopping after pretest on Guix") - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (cons - '@ - (map (match-lambda - (("scripts" '@ . scripts-alist) - `("scripts" @ ,@(map (match-lambda - (("test" . _) - (cons "test" - new-test-script)) - (other - other)) - scripts-alist))) - (other - other)) - pkg-meta-alist)))))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (map + (match-lambda + (("test" . _) (cons "test" new-test-script)) + (other other)) + scripts-alist))) + (other other)) + pkg-meta-alist)))))))) (home-page "https://github.com/nodejs/node-addon-api") (synopsis "Node.js API (Node-API) header-only C++ wrappers") (description "This module contains header-only C++ wrapper classes whi= ch @@ -1223,22 +1216,19 @@ (define-public node-serialport-bindings "node-abi")))) (add-after 'chdir 'avoid-prebuild-install (lambda args - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (cons '@ (map (match-lambda - (("scripts" @ . scripts-alist) - `("scripts" @ ,@(filter (match-lambda - (("install" .= _) - #f) - (_ - #t)) - scripts-alist))= ) - (("gypfile" . _) - '("gypfile" . #f)) - (other - other)) - pkg-meta-alist)))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (filter + (match-lambda + (("install" . _) #f) + (_ #t)) + scripts-alist))) + (("gypfile" . _) + (cons "gypfile" #f)) + (other other)) + pkg-meta-alist)))))) #:tests? #f)) (synopsis "Abstract base class for Node SerialPort bindings") (description "Node SerialPort is a modular suite of Node.js packages f= or @@ -1524,39 +1514,33 @@ (define-public node-sqlite3 (substitute* ".npmignore" (("lib/binding") "#lib/binding # <- patched for Guix")) - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (match (assoc-ref pkg-meta-alist "binary") - (('@ . binary-alist) - ;; When it builds from source, node-pre-gyp supplies - ;; module_name and module_path based on the entries u= nder - ;; "binary" from "package.json", so this package's - ;; "binding.gyp" doesn't define them. Thus, we also n= eed - ;; to supply them. The GYP_DEFINES environment variab= le - ;; turns out to be the easiest way to make sure they = are - ;; propagated from npm to node-gyp to gyp. - (setenv "GYP_DEFINES" - (string-append - "module_name=3D" - (assoc-ref binary-alist "module_name") - " " - "module_path=3D" - (assoc-ref binary-alist "module_path"))))) - ;; We need to remove the install script from "package.js= on", - ;; as it would try to use node-pre-gyp and would block t= he - ;; automatic building performed by `npm install`. - (cons '@ (map (match-lambda - (("scripts" @ . scripts-alist) - `("scripts" @ ,@(filter (match-lambda - (("install" .= _) - #f) - (_ - #t)) - scripts-alist))= ) - (other - other)) - pkg-meta-alist)))))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (let ((binary-alist (assoc-ref pkg-meta-alist "binary"))) + ;; When it builds from source, node-pre-gyp supplies + ;; module_name and module_path based on the entries under + ;; "binary" from "package.json", so this package's + ;; "binding.gyp" doesn't define them. Thus, we also need + ;; to supply them. The GYP_DEFINES environment variable + ;; turns out to be the easiest way to make sure they are + ;; propagated from npm to node-gyp to gyp. + (setenv "GYP_DEFINES" (string-append + "module_name=3D" + (assoc-ref binary-alist "module_name") + " module_path=3D" + (assoc-ref binary-alist "module_path")))) + ;; We need to remove the install script from "package.json"= , + ;; as it would try to use node-pre-gyp and would block the + ;; automatic building performed by `npm install`. + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (filter + (match-lambda + (("install" . _) #f) + (_ #t)) + scripts-alist))) + (other other)) + pkg-meta-alist)))))))) (home-page "https://github.com/mapbox/node-sqlite3") (synopsis "Node.js bindings for SQLite3") (description diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm index 57fe5f6030..425b8cd9b3 100644 --- a/guix/build-system/node.scm +++ b/guix/build-system/node.scm @@ -4,6 +4,7 @@ ;;; Copyright =C2=A9 2021 Ludovic Court=C3=A8s ;;; Copyright =C2=A9 2021 Pierre Langlois ;;; Copyright =C2=A9 2021 Philip McGrath +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,7 +37,10 @@ (define-module (guix build-system node) (define %node-build-system-modules ;; Build-side modules imported by default. `((guix build node-build-system) - (guix build json) + (json) + (json builder) + (json parser) + (json record) ,@%default-gnu-imported-modules)) (define (default-node) diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-syste= m.scm index fb23894bc1..f95c3bd793 100644 --- a/guix/build/node-build-system.scm +++ b/guix/build/node-build-system.scm @@ -4,6 +4,7 @@ ;;; Copyright =C2=A9 2019, 2021 Timothy Sample ;;; Copyright =C2=A9 2021, 2022 Philip McGrath ;;; Copyright =C2=A9 2022 Liliana Marie Prikler +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; This file is part of GNU Guix. ;;; @@ -23,10 +24,10 @@ (define-module (guix build node-build-system) #:use-module ((guix build gnu-build-system) #:prefix gnu:) #:use-module (guix build utils) - #:use-module (guix build json) #:use-module (ice-9 ftw) #:use-module (ice-9 regex) #:use-module (ice-9 match) + #:use-module (json) #:use-module (srfi srfi-1) #:use-module (srfi srfi-71) #:export (%standard-phases @@ -34,13 +35,14 @@ (define-module (guix build node-build-system) delete-dependencies node-build)) -(define (with-atomic-json-file-replacement file proc) +(define* (with-atomic-json-file-replacement proc + #:optional (file "package.json")) "Like 'with-atomic-file-replacement', but PROC is called with a single argument---the result of parsing FILE's contents as json---and should a va= lue to be written as json to the replacement FILE." (with-atomic-file-replacement file (lambda (in out) - (write-json (proc (read-json in)) out)))) + (scm->json (proc (json->scm in)) out)))) (define* (assoc-ref* alist key #:optional default) "Like assoc-ref, but return DEFAULT instead of #f if no value exists." @@ -48,10 +50,6 @@ (define* (assoc-ref* alist key #:optional default) (#f default) ((_ . value) value))) -(define* (jsobject-ref obj key #:optional default) - (match obj - (('@ . alist) (assoc-ref* alist key default)))) - (define* (alist-pop alist key #:optional (=3D equal?)) "Return two values, the first pair in ALIST with key KEY, and the other elements. Equality calls are made as (=3D KEY ALISTCAR)." @@ -63,67 +61,17 @@ (define* (alist-pop alist key #:optional (=3D equal?)) (values (car after) (append before (cdr after))) (values #f before)))) -(define* (alist-update alist key proc #:optional default (=3D equal?)) +(define* (alist-update alist key proc #:optional (=3D equal?)) "Return an association list like ALIST, but with KEY mapped to the resul= t of PROC applied to the first value found under the comparison (=3D KEY ALISTC= AR). -If no such value exists, use DEFAULT instead. +If no such value exists, return the list unchanged. Unlike acons, this removes the previous association of KEY (assuming it is unique), but the result may still share storage with ALIST." (let ((pair rest (alist-pop alist key =3D))) - (acons key - (proc (if (pair? pair) - (cdr pair) - default)) - rest))) - -(define (jsobject-update* js . updates) - "Return a json object like JS, but with all UPDATES applied. Each updat= e is -a list (KEY PROC [DEFAULT]), so that KEY is mapped to the result of PROC -applied to the value to which KEY is mapped in JS. If no such mapping exi= sts, -PROC is instead applied to DEFAULT, or to '#f' is no DEFAULT is specified. -The update takes place from left to right, so later UPDATERs will receive = the -values returned by earlier UPDATERs for the same KEY." - (match js - (('@ . alist) - (let loop ((alist alist) - (updates updates)) - (match updates - (() (cons '@ alist)) - (((key proc) . updates) - (loop (alist-update alist key proc #f equal?) updates)) - (((key proc default) . updates) - (loop (alist-update alist key proc default equal?) updates))))))= ) - -(define (jsobject-union combine seed . objects) - "Merge OBJECTS into SEED by applying (COMBINE KEY VAL0 VAL), where VAL0 -is the value found in the (possibly updated) SEED and VAL is the new value -found in one of the OBJECTS." - (match seed - (('@ . aseed) - (match objects - (() seed) - ((('@ . alists) ...) - (cons - '@ - (fold (lambda (alist aseed) - (if (null? aseed) alist - (fold - (match-lambda* - (((k . v) aseed) - (let ((pair tail (alist-pop alist k))) - (match pair - (#f (acons k v aseed)) - ((_ . v0) (acons k (combine k v0 v) aseed))))= )) - aseed - alist))) - aseed - alists))))))) + (if (pair? pair) + (acons key (proc (cdr pair)) rest) + alist))) -;; Possibly useful helper functions: -;; (define (newest key val0 val) val) -;; (define (unkeyed->keyed proc) (lambda (_key val0 val) (proc val0 val))) - - ;;; ;;; Phases. ;;; @@ -142,8 +90,8 @@ (define (set-home . _) (define (module-name module) (let* ((package.json (string-append module "/package.json")) - (package-meta (call-with-input-file package.json read-json))) - (jsobject-ref package-meta "name"))) + (package-meta (call-with-input-file package.json json->scm))) + (assoc-ref package-meta "name"))) (define (index-modules input-paths) (define (list-modules directory) @@ -167,49 +115,59 @@ (define* (patch-dependencies #:key inputs #:allow-other-keys) (define index (index-modules (map cdr inputs))) - (define resolve-dependencies - (match-lambda - (('@ . alist) - (cons '@ (map (match-lambda - ((key . value) - (cons key (hash-ref index key value)))) - alist))))) + (define (resolve-dependencies dependencies) + (map + (match-lambda + ((dependency . version) + (cons dependency (hash-ref index dependency version)))) + dependencies)) - (with-atomic-json-file-replacement "package.json" + (with-atomic-json-file-replacement (lambda (pkg-meta) - (jsobject-update* - pkg-meta - `("devDependencies" ,resolve-dependencies (@)) - `("dependencies" ,(lambda (deps) - (resolve-dependencies - (jsobject-union - (lambda (k a b) b) - (jsobject-ref pkg-meta "peerDependencies" '(@= )) - deps))) - (@))))) + (fold + (lambda (proc pkg-meta) (proc pkg-meta)) + pkg-meta + (list + (lambda (pkg-meta) + (alist-update pkg-meta "devDependencies" resolve-dependencies)= ) + (lambda (pkg-meta) + (assoc-set! + pkg-meta + "dependencies" + (resolve-dependencies + ; Combined "peerDependencies" and "dependencies" dependenc= ies + ; with "dependencies" taking precedent. + (fold + (lambda (dependency dependencies) + (apply assoc-set! dependencies dependency)) + (assoc-ref* pkg-meta "peerDependencies" '()) + (assoc-ref* pkg-meta "dependencies" '()))))))))) #t) -(define (delete-dependencies absent) +(define (delete-dependencies dependencies-to-remove) "Rewrite 'package.json' to allow the build to proceed without packages -listed in ABSENT, a list of strings naming npm packages. +listed in 'dependencies-to-remove', a list of strings naming npm packages. To prevent the deleted dependencies from being reintroduced, use this func= tion only after the 'patch-dependencies' phase." - (define delete-from-jsobject - (match-lambda - (('@ . alist) - (cons '@ (filter (match-lambda - ((k . _) - (not (member k absent)))) - alist))))) - - (with-atomic-json-file-replacement "package.json" + (with-atomic-json-file-replacement (lambda (pkg-meta) - (jsobject-update* - pkg-meta - `("devDependencies" ,delete-from-jsobject (@)) - `("dependencies" ,delete-from-jsobject (@)) - `("peerDependencies" ,delete-from-jsobject (@)))))) + (fold + (lambda (dependency-key pkg-meta) + (alist-update + pkg-meta + dependency-key + (lambda (dependencies) + (remove + (lambda (dependency) + (member (car dependency) dependencies-to-remove)) + dependencies)))) + pkg-meta + (list + "devDependencies" + "dependencies" + "peerDependencies" + "optionalDependencies"))))) (define* (delete-lockfiles #:key inputs #:allow-other-keys) "Delete 'package-lock.json', 'yarn.lock', and 'npm-shrinkwrap.json', if = they @@ -228,8 +186,8 @@ (define* (configure #:key outputs inputs #:allow-other-= keys) #t)) (define* (build #:key inputs #:allow-other-keys) - (let ((package-meta (call-with-input-file "package.json" read-json))) - (if (jsobject-ref (jsobject-ref package-meta "scripts" '(@)) "build" #= f) + (let ((package-meta (call-with-input-file "package.json" json->scm))) + (if (assoc-ref* (assoc-ref* package-meta "scripts" '()) "build" #f) (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm"))) (invoke npm "run" "build")) (format #t "there is no build script to run~%")) @@ -301,22 +259,20 @@ (define* (avoid-node-gyp-rebuild #:key outputs #:allow-other-keys) ;; even need to overwrite this file. Therefore, let's use some helpers ;; that we'd otherwise not need. (define pkg-meta - (call-with-input-file installed-package.json read-json)) + (call-with-input-file installed-package.json json->scm)) (define scripts - (jsobject-ref pkg-meta "scripts" '(@))) - (define (jsobject-set js key val) - (jsobject-update* js (list key (const val)))) + (assoc-ref* pkg-meta "scripts" '())) - (when (equal? "node-gyp rebuild" (jsobject-ref scripts "install" #f)) + (when (equal? "node-gyp rebuild" (assoc-ref* scripts "install" #f)) (call-with-output-file installed-package.json (lambda (out) - (write-json - (jsobject-set pkg-meta - "scripts" - (jsobject-set scripts - "install" - "echo Guix: avoiding node-gyp rebuild= ")) - out))))) + (scm->json + (assoc-set! pkg-meta + "scripts" + (assoc-set! scripts + "install" + "echo Guix: avoiding node-gyp rebuild")) + out))))) (define %standard-phases (modify-phases gnu:%standard-phases base-commit: e16cdcf37d8223b3634ec5e658356c3b7f154859 --=20 2.46.0 --0000000000001eb841062a2c5a1f Content-Type: text/x-patch; charset="UTF-8"; name="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch" Content-Disposition: attachment; filename="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m55d06mi0 RnJvbSAxOTQ0OWZlYWI5ZTMxNTkwYmJkN2M5MzNiMjExNjNmOGIzOTg0MzliIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYW5pZWwgS2hvZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21h aWwuY29tPgpEYXRlOiBUaHUsIDI2IERlYyAyMDI0IDA0OjM1OjM5IC0wODAwClN1YmplY3Q6IFtQ QVRDSF0gUmVwbGFjZSAoZ3VpeCBidWlsZCBqc29uKSB3aXRoIChqc29uKSBpbiBub2RlIGJ1aWxk IHN5c3RlbQoKVGhpcyBjaGFuZ2UgcmVwbGFjZXMgdGhlIHVzZSBvZiAoZ3VpeCBidWlsZCBqc29u KSB3aXRoIChqc29uKSBmb3IgdGhlIG5vZGUgZWNvc3lzdGVtLgpTaW5jZSBndWlsZS1qc29uIGlz IGEgZGVwZW5kZW5jeSBvZiBHdWl4LCBhbmQgaXQncyB1c2VkIGVsc2V3aGVyZSBpbiB0aGUgcHJv amVjdCwgaXQgbWFrZXMgc2Vuc2UgdG8gdXNlIHRoaXMgaW5zdGVhZCBvZiByb2xsaW5nIG91ciBv d24gSlNPTiBpbXBsZW1lbnRhdGlvbiB3aXRoIChndWl4IGJ1aWxkIGpzb24pLgpUaGlzIGlzIG9u ZSBzdGVwIHRvIG1vdmUgYXdheSBmcm9tIChndWl4IGJ1aWxkIGpzb24pLCB0aGVyZSB3aWxsIGJl IG90aGVyIGNoYW5nZXMgdG8gcmVtb3ZlIHRoZSBvdGhlciB1c2VzIG9mIGl0LgoKU2lnbmVkLW9m Zi1ieTogRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KQ2hhbmdl LUlkOiBJOWZkNTE1MmE5OGI2YTI0MWQ0MTRlOWE5NGFiMTc5YzljYWJjZmI4NQotLS0KIGdudS9w YWNrYWdlcy9ub2RlLXh5ei5zY20gICAgICAgIHwgMTQ4ICsrKysrKysrKysrKy0tLS0tLS0tLS0t LS0KIGd1aXgvYnVpbGQtc3lzdGVtL25vZGUuc2NtICAgICAgIHwgICA2ICstCiBndWl4L2J1aWxk L25vZGUtYnVpbGQtc3lzdGVtLnNjbSB8IDE4MCArKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0t LS0tCiAzIGZpbGVzIGNoYW5nZWQsIDEzOSBpbnNlcnRpb25zKCspLCAxOTUgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvZ251L3BhY2thZ2VzL25vZGUteHl6LnNjbSBiL2dudS9wYWNrYWdlcy9u b2RlLXh5ei5zY20KaW5kZXggZTk4ZWRhMmEwMS4uZWMzZjlmYmZiMSAxMDA2NDQKLS0tIGEvZ251 L3BhY2thZ2VzL25vZGUteHl6LnNjbQorKysgYi9nbnUvcGFja2FnZXMvbm9kZS14eXouc2NtCkBA IC03LDYgKzcsNyBAQAogOzs7IENvcHlyaWdodCDCqSAyMDIxIERocnV2aW4gR2FuZGhpIDxjb250 YWN0QGRocnV2aW4uZGV2PgogOzs7IENvcHlyaWdodCDCqSAyMDIyIE5pY29sYXMgR3JhdmVzIDxu Z3JhdmVzQG5ncmF2ZXMuZnI+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjMgSmVsbGUgTGljaHQgPGps aWNodEBmc2ZlLm9yZz4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBEYW5pZWwgS2hvZGFiYWtoc2gg PGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlzIHBhcnQgb2Yg R05VIEd1aXguCiA7OzsKQEAgLTI0LDE0ICsyNSwxNCBAQAogOzs7IGFsb25nIHdpdGggR05VIEd1 aXguICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKIChkZWZp bmUtbW9kdWxlIChnbnUgcGFja2FnZXMgbm9kZS14eXopCi0gICM6dXNlLW1vZHVsZSAoKGd1aXgg bGljZW5zZXMpICM6cHJlZml4IGxpY2Vuc2U6KQogICAjOnVzZS1tb2R1bGUgKGdudSBwYWNrYWdl cyBzcWxpdGUpCiAgICM6dXNlLW1vZHVsZSAoZ251IHBhY2thZ2VzIHB5dGhvbikKICAgIzp1c2Ut bW9kdWxlIChnbnUgcGFja2FnZXMgd2ViKQorICAjOnVzZS1tb2R1bGUgKGd1aXggYnVpbGQtc3lz dGVtIG5vZGUpCiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBnZXhwKQotICAjOnVzZS1tb2R1bGUgKGd1 aXggcGFja2FnZXMpCiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBnaXQtZG93bmxvYWQpCi0gICM6dXNl LW1vZHVsZSAoZ3VpeCBidWlsZC1zeXN0ZW0gbm9kZSkpCisgICM6dXNlLW1vZHVsZSAoKGd1aXgg bGljZW5zZXMpICM6cHJlZml4IGxpY2Vuc2U6KQorICAjOnVzZS1tb2R1bGUgKGd1aXggcGFja2Fn ZXMpKQogCiA7OzsKIDs7OyBQbGVhc2U6IFRyeSB0byBhZGQgbmV3IG1vZHVsZSBwYWNrYWdlcyBp biBhbHBoYWJldGljIG9yZGVyLgpAQCAtNjksMTkgKzcwLDE3IEBAIChkZWZpbmUtcHVibGljIG5v ZGUtYWNvcm4KICAgICAgICAgICAgICA7OyBpdCB3b3VsZCB0cnkgdG8gdXNlIHRoZSBidWlsZCBl bnZpcm9ubWVudCBhbmQgd291bGQgYmxvY2sgdGhlCiAgICAgICAgICAgICAgOzsgYXV0b21hdGlj IGJ1aWxkaW5nIGJ5IG90aGVyIHBhY2thZ2VzIG1ha2luZyB1c2Ugb2Ygbm9kZS1hY29ybi4KICAg ICAgICAgICAgICA7OyBUT0RPOiBBZGQgdXRpbGl0eSBmdW5jdGlvbgotICAgICAgICAgICAgICh3 aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKLSAgICAgICAg ICAgICAgIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgKCgnQCAuIHBrZy1tZXRhLWFs aXN0KQotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAobWF0Y2gtbGFtYmRhCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgQCAuIHNjcmlwdHMtYWxp c3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMiIEAgLEAo ZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJwcmVwYXJlIiAuIF8pCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmKQotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29u LWZpbGUtcmVwbGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAg ICAobWFwCisgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAg ICAoKCJzY3JpcHRzIiAuIHNjcmlwdHMtYWxpc3QpCisgICAgICAgICAgICAgICAgICAgICAoY29u cyAic2NyaXB0cyIgKGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRh CisgICAgICAgICAgICAgICAgICAgICAgICAgKCgicHJlcGFyZSIgLiBfKSAjZikKKyAgICAgICAg ICAgICAgICAgICAgICAgICAoXyAjdCkpCisgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMt YWxpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIpKQorICAgICAgICAgICAg ICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpCiAgICAgICAgICAocmVwbGFjZSAnYnVpbGQKICAgICAg ICAgICAgKGxhbWJkYSogKCM6a2V5IGlucHV0cyBuYXRpdmUtaW5wdXRzICM6YWxsb3ctb3RoZXIt a2V5cykKICAgICAgICAgICAgICAobGV0ICgoZXNidWlsZCAoc2VhcmNoLWlucHV0LWZpbGUgKG9y IG5hdGl2ZS1pbnB1dHMgaW5wdXRzKQpAQCAtMTU4LDIzICsxNTcsMTcgQEAgKGRlZmluZS1wdWJs aWMgbm9kZS1hZGRvbi1hcGkKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCiAgICAgICAgICAgICAg KGRlZmluZSBuZXctdGVzdC1zY3JpcHQKICAgICAgICAgICAgICAgICJlY2hvIHN0b3BwaW5nIGFm dGVyIHByZXRlc3Qgb24gR3VpeCIpCi0gICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmls ZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgotICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJk YQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtnLW1ldGEtYWxpc3QpCi0gICAgICAgICAgICAg ICAgICAoY29ucwotICAgICAgICAgICAgICAgICAgICdACi0gICAgICAgICAgICAgICAgICAgKG1h cCAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiICdA IC4gc2NyaXB0cy1hbGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMi IEAgLEAobWFwIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKCgidGVzdCIgLiBfKQotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInRlc3QiCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXctdGVzdC1zY3JpcHQp KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3Ro ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90 aGVyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNj cmlwdHMtYWxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICBwa2ct bWV0YS1hbGlzdCkpKSkpKSkpKSkKKyAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNvbi1maWxl LXJlcGxhY2VtZW50IChsYW1iZGEgKHBrZy1tZXRhLWFsaXN0KQorICAgICAgICAgICAgICAgKG1h cAorICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAgICAgKCgi c2NyaXB0cyIgLiBzY3JpcHRzLWFsaXN0KQorICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInNj cmlwdHMiIChtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAg ICAgICAgICAgICAgICAgICAgICgoInRlc3QiIC4gXykgKGNvbnMgInRlc3QiIG5ldy10ZXN0LXNj cmlwdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAg ICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhl ciBvdGhlcikpCisgICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKICAgICAo aG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUtYWRkb24tYXBpIikKICAg ICAoc3lub3BzaXMgIk5vZGUuanMgQVBJIChOb2RlLUFQSSkgaGVhZGVyLW9ubHkgQysrIHdyYXBw ZXJzIikKICAgICAoZGVzY3JpcHRpb24gIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGhlYWRlci1vbmx5 IEMrKyB3cmFwcGVyIGNsYXNzZXMgd2hpY2gKQEAgLTEyMjMsMjIgKzEyMTYsMTkgQEAgKGRlZmlu ZS1wdWJsaWMgbm9kZS1zZXJpYWxwb3J0LWJpbmRpbmdzCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAibm9kZS1hYmkiKSkpKQogICAgICAgICAgKGFkZC1hZnRlciAnY2hkaXIg J2F2b2lkLXByZWJ1aWxkLWluc3RhbGwKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAg ICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgot ICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtn LW1ldGEtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAoY29ucyAnQCAobWFwIChtYXRjaC1sYW1i ZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiBAIC4gc2Ny aXB0cy1hbGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCgic2NyaXB0 cyIgQCAsQChmaWx0ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoImluc3RhbGwiIC4gXykKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg I2YpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgI3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzLWFsaXN0KSkpCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKCgiZ3lwZmlsZSIgLiBfKQotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAnKCJneXBmaWxlIiAuICNmKSkKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAob3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg b3RoZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkp KSkpKSkpCisgICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAo bGFtYmRhIChwa2ctbWV0YS1hbGlzdCkKKyAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAg ICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIC4gc2Ny aXB0cy1hbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJzY3JpcHRzIiAoZmlsdGVy CisgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAg ICAgICAgICAoKCJpbnN0YWxsIiAuIF8pICNmKQorICAgICAgICAgICAgICAgICAgICAgICAgIChf ICN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAg ICAgICAgICAgICgoImd5cGZpbGUiIC4gXykKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJn eXBmaWxlIiAjZikpCisgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAg ICAgICAgICAgcGtnLW1ldGEtYWxpc3QpKSkpKSkKICAgICAgICAjOnRlc3RzPyAjZikpCiAgICAg KHN5bm9wc2lzICJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBOb2RlIFNlcmlhbFBvcnQgYmluZGlu Z3MiKQogICAgIChkZXNjcmlwdGlvbiAiTm9kZSBTZXJpYWxQb3J0IGlzIGEgbW9kdWxhciBzdWl0 ZSBvZiBOb2RlLmpzIHBhY2thZ2VzIGZvcgpAQCAtMTUyNCwzOSArMTUxNCwzMyBAQCAoZGVmaW5l LXB1YmxpYyBub2RlLXNxbGl0ZTMKICAgICAgICAgICAgICAoc3Vic3RpdHV0ZSogIi5ucG1pZ25v cmUiCiAgICAgICAgICAgICAgICAoKCJsaWIvYmluZGluZyIpCiAgICAgICAgICAgICAgICAgIiNs aWIvYmluZGluZyAjIDwtIHBhdGNoZWQgZm9yIEd1aXgiKSkKLSAgICAgICAgICAgICAod2l0aC1h dG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCi0gICAgICAgICAgICAg ICAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICgoJ0AgLiBwa2ctbWV0YS1hbGlzdCkK LSAgICAgICAgICAgICAgICAgIChtYXRjaCAoYXNzb2MtcmVmIHBrZy1tZXRhLWFsaXN0ICJiaW5h cnkiKQotICAgICAgICAgICAgICAgICAgICAoKCdAIC4gYmluYXJ5LWFsaXN0KQotICAgICAgICAg ICAgICAgICAgICAgOzsgV2hlbiBpdCBidWlsZHMgZnJvbSBzb3VyY2UsIG5vZGUtcHJlLWd5cCBz dXBwbGllcwotICAgICAgICAgICAgICAgICAgICAgOzsgbW9kdWxlX25hbWUgYW5kIG1vZHVsZV9w YXRoIGJhc2VkIG9uIHRoZSBlbnRyaWVzIHVuZGVyCi0gICAgICAgICAgICAgICAgICAgICA7OyAi YmluYXJ5IiBmcm9tICJwYWNrYWdlLmpzb24iLCBzbyB0aGlzIHBhY2thZ2UncwotICAgICAgICAg ICAgICAgICAgICAgOzsgImJpbmRpbmcuZ3lwIiBkb2Vzbid0IGRlZmluZSB0aGVtLiBUaHVzLCB3 ZSBhbHNvIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgIDs7IHRvIHN1cHBseSB0aGVtLiBUaGUg R1lQX0RFRklORVMgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgIDs7 IHR1cm5zIG91dCB0byBiZSB0aGUgZWFzaWVzdCB3YXkgdG8gbWFrZSBzdXJlIHRoZXkgYXJlCi0g ICAgICAgICAgICAgICAgICAgICA7OyBwcm9wYWdhdGVkIGZyb20gbnBtIHRvIG5vZGUtZ3lwIHRv IGd5cC4KLSAgICAgICAgICAgICAgICAgICAgIChzZXRlbnYgIkdZUF9ERUZJTkVTIgotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWFwcGVuZAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIm1vZHVsZV9uYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChhc3NvYy1yZWYgYmluYXJ5LWFsaXN0ICJtb2R1bGVfbmFtZSIpCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGVf cGF0aD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJpbmFyeS1h bGlzdCAibW9kdWxlX3BhdGgiKSkpKSkKLSAgICAgICAgICAgICAgICAgIDs7IFdlIG5lZWQgdG8g cmVtb3ZlIHRoZSBpbnN0YWxsIHNjcmlwdCBmcm9tICJwYWNrYWdlLmpzb24iLAotICAgICAgICAg ICAgICAgICAgOzsgYXMgaXQgd291bGQgdHJ5IHRvIHVzZSBub2RlLXByZS1neXAgYW5kIHdvdWxk IGJsb2NrIHRoZQotICAgICAgICAgICAgICAgICAgOzsgYXV0b21hdGljIGJ1aWxkaW5nIHBlcmZv cm1lZCBieSBgbnBtIGluc3RhbGxgLgotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAo bWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0 cyIgQCAuIHNjcmlwdHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGAoInNjcmlwdHMiIEAgLEAoZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAu IF8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICNmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcgotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29u LWZpbGUtcmVwbGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAg ICAobGV0ICgoYmluYXJ5LWFsaXN0IChhc3NvYy1yZWYgcGtnLW1ldGEtYWxpc3QgImJpbmFyeSIp KSkKKyAgICAgICAgICAgICAgICAgOzsgV2hlbiBpdCBidWlsZHMgZnJvbSBzb3VyY2UsIG5vZGUt cHJlLWd5cCBzdXBwbGllcworICAgICAgICAgICAgICAgICA7OyBtb2R1bGVfbmFtZSBhbmQgbW9k dWxlX3BhdGggYmFzZWQgb24gdGhlIGVudHJpZXMgdW5kZXIKKyAgICAgICAgICAgICAgICAgOzsg ImJpbmFyeSIgZnJvbSAicGFja2FnZS5qc29uIiwgc28gdGhpcyBwYWNrYWdlJ3MKKyAgICAgICAg ICAgICAgICAgOzsgImJpbmRpbmcuZ3lwIiBkb2Vzbid0IGRlZmluZSB0aGVtLiBUaHVzLCB3ZSBh bHNvIG5lZWQKKyAgICAgICAgICAgICAgICAgOzsgdG8gc3VwcGx5IHRoZW0uIFRoZSBHWVBfREVG SU5FUyBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICA7OyB0dXJucyBvdXQg dG8gYmUgdGhlIGVhc2llc3Qgd2F5IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZQorICAgICAgICAgICAg ICAgICA7OyBwcm9wYWdhdGVkIGZyb20gbnBtIHRvIG5vZGUtZ3lwIHRvIGd5cC4KKyAgICAgICAg ICAgICAgICAgKHNldGVudiAiR1lQX0RFRklORVMiIChzdHJpbmctYXBwZW5kCisgICAgICAgICAg ICAgICAgICAgIm1vZHVsZV9uYW1lPSIKKyAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJp bmFyeS1hbGlzdCAibW9kdWxlX25hbWUiKQorICAgICAgICAgICAgICAgICAgICIgbW9kdWxlX3Bh dGg9IgorICAgICAgICAgICAgICAgICAgIChhc3NvYy1yZWYgYmluYXJ5LWFsaXN0ICJtb2R1bGVf cGF0aCIpKSkpCisgICAgICAgICAgICAgICA7OyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgaW5zdGFs bCBzY3JpcHQgZnJvbSAicGFja2FnZS5qc29uIiwKKyAgICAgICAgICAgICAgIDs7IGFzIGl0IHdv dWxkIHRyeSB0byB1c2Ugbm9kZS1wcmUtZ3lwIGFuZCB3b3VsZCBibG9jayB0aGUKKyAgICAgICAg ICAgICAgIDs7IGF1dG9tYXRpYyBidWlsZGluZyBwZXJmb3JtZWQgYnkgYG5wbSBpbnN0YWxsYC4K KyAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAg ICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIC4gc2NyaXB0cy1hbGlzdCkKKyAgICAgICAgICAg ICAgICAgICAgIChjb25zICJzY3JpcHRzIiAoZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAg IChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAuIF8p ICNmKQorICAgICAgICAgICAgICAgICAgICAgICAgIChfICN0KSkKKyAgICAgICAgICAgICAgICAg ICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikp CisgICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKICAgICAoaG9tZS1wYWdl ICJodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L25vZGUtc3FsaXRlMyIpCiAgICAgKHN5bm9wc2lz ICJOb2RlLmpzIGJpbmRpbmdzIGZvciBTUUxpdGUzIikKICAgICAoZGVzY3JpcHRpb24KZGlmZiAt LWdpdCBhL2d1aXgvYnVpbGQtc3lzdGVtL25vZGUuc2NtIGIvZ3VpeC9idWlsZC1zeXN0ZW0vbm9k ZS5zY20KaW5kZXggNTdmZTVmNjAzMC4uNDI1YjhjZDliMyAxMDA2NDQKLS0tIGEvZ3VpeC9idWls ZC1zeXN0ZW0vbm9kZS5zY20KKysrIGIvZ3VpeC9idWlsZC1zeXN0ZW0vbm9kZS5zY20KQEAgLTQs NiArNCw3IEBACiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgTHVkb3ZpYyBDb3VydMOocyA8bHVkb0Bn bnUub3JnPgogOzs7IENvcHlyaWdodCDCqSAyMDIxIFBpZXJyZSBMYW5nbG9pcyA8cGllcnJlLmxh bmdsb2lzQGdteC5jb20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgUGhpbGlwIE1jR3JhdGggPHBo aWxpcEBwaGlsaXBtY2dyYXRoLmNvbT4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBEYW5pZWwgS2hv ZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlz IHBhcnQgb2YgR05VIEd1aXguCiA7OzsKQEAgLTM2LDcgKzM3LDEwIEBAIChkZWZpbmUtbW9kdWxl IChndWl4IGJ1aWxkLXN5c3RlbSBub2RlKQogKGRlZmluZSAlbm9kZS1idWlsZC1zeXN0ZW0tbW9k dWxlcwogICA7OyBCdWlsZC1zaWRlIG1vZHVsZXMgaW1wb3J0ZWQgYnkgZGVmYXVsdC4KICAgYCgo Z3VpeCBidWlsZCBub2RlLWJ1aWxkLXN5c3RlbSkKLSAgICAoZ3VpeCBidWlsZCBqc29uKQorICAg IChqc29uKQorICAgIChqc29uIGJ1aWxkZXIpCisgICAgKGpzb24gcGFyc2VyKQorICAgIChqc29u IHJlY29yZCkKICAgICAsQCVkZWZhdWx0LWdudS1pbXBvcnRlZC1tb2R1bGVzKSkKIAogKGRlZmlu ZSAoZGVmYXVsdC1ub2RlKQpkaWZmIC0tZ2l0IGEvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3Rl bS5zY20gYi9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQppbmRleCBmYjIzODk0YmMx Li5mOTVjM2JkNzkzIDEwMDY0NAotLS0gYS9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNj bQorKysgYi9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQpAQCAtNCw2ICs0LDcgQEAK IDs7OyBDb3B5cmlnaHQgwqkgMjAxOSwgMjAyMSBUaW1vdGh5IFNhbXBsZSA8c2FtcGxldEBuZ3ly by5jb20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEsIDIwMjIgUGhpbGlwIE1jR3JhdGggPHBoaWxp cEBwaGlsaXBtY2dyYXRoLmNvbT4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMiBMaWxpYW5hIE1hcmll IFByaWtsZXIgPGxpbGlhbmEucHJpa2xlckBnbWFpbC5jb20+Cis7OzsgQ29weXJpZ2h0IMKpIDIw MjQgRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KIDs7OwogOzs7 IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBHdWl4LgogOzs7CkBAIC0yMywxMCArMjQsMTAgQEAK IChkZWZpbmUtbW9kdWxlIChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAjOnVzZS1t b2R1bGUgKChndWl4IGJ1aWxkIGdudS1idWlsZC1zeXN0ZW0pICM6cHJlZml4IGdudTopCiAgICM6 dXNlLW1vZHVsZSAoZ3VpeCBidWlsZCB1dGlscykKLSAgIzp1c2UtbW9kdWxlIChndWl4IGJ1aWxk IGpzb24pCiAgICM6dXNlLW1vZHVsZSAoaWNlLTkgZnR3KQogICAjOnVzZS1tb2R1bGUgKGljZS05 IHJlZ2V4KQogICAjOnVzZS1tb2R1bGUgKGljZS05IG1hdGNoKQorICAjOnVzZS1tb2R1bGUgKGpz b24pCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTEpCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBz cmZpLTcxKQogICAjOmV4cG9ydCAoJXN0YW5kYXJkLXBoYXNlcwpAQCAtMzQsMTMgKzM1LDE0IEBA IChkZWZpbmUtbW9kdWxlIChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAgICAgICAg ICAgZGVsZXRlLWRlcGVuZGVuY2llcwogICAgICAgICAgICAgbm9kZS1idWlsZCkpCiAKLShkZWZp bmUgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCBmaWxlIHByb2MpCisoZGVmaW5l KiAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50IHByb2MKKyAgIzpvcHRpb25hbCAo ZmlsZSAicGFja2FnZS5qc29uIikpCiAgICJMaWtlICd3aXRoLWF0b21pYy1maWxlLXJlcGxhY2Vt ZW50JywgYnV0IFBST0MgaXMgY2FsbGVkIHdpdGggYSBzaW5nbGUKIGFyZ3VtZW50LS0tdGhlIHJl c3VsdCBvZiBwYXJzaW5nIEZJTEUncyBjb250ZW50cyBhcyBqc29uLS0tYW5kIHNob3VsZCBhIHZh bHVlCiB0byBiZSB3cml0dGVuIGFzIGpzb24gdG8gdGhlIHJlcGxhY2VtZW50IEZJTEUuIgogICAo d2l0aC1hdG9taWMtZmlsZS1yZXBsYWNlbWVudCBmaWxlCiAgICAgKGxhbWJkYSAoaW4gb3V0KQot ICAgICAgKHdyaXRlLWpzb24gKHByb2MgKHJlYWQtanNvbiBpbikpIG91dCkpKSkKKyAgICAgIChz Y20tPmpzb24gKHByb2MgKGpzb24tPnNjbSBpbikpIG91dCkpKSkKIAogKGRlZmluZSogKGFzc29j LXJlZiogYWxpc3Qga2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKICAgIkxpa2UgYXNzb2MtcmVmLCBi dXQgcmV0dXJuIERFRkFVTFQgaW5zdGVhZCBvZiAjZiBpZiBubyB2YWx1ZSBleGlzdHMuIgpAQCAt NDgsMTAgKzUwLDYgQEAgKGRlZmluZSogKGFzc29jLXJlZiogYWxpc3Qga2V5ICM6b3B0aW9uYWwg ZGVmYXVsdCkKICAgICAoI2YgZGVmYXVsdCkKICAgICAoKF8gLiB2YWx1ZSkgdmFsdWUpKSkKIAot KGRlZmluZSogKGpzb2JqZWN0LXJlZiBvYmoga2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKLSAgKG1h dGNoIG9iagotICAgICgoJ0AgLiBhbGlzdCkgKGFzc29jLXJlZiogYWxpc3Qga2V5IGRlZmF1bHQp KSkpCi0KIChkZWZpbmUqIChhbGlzdC1wb3AgYWxpc3Qga2V5ICM6b3B0aW9uYWwgKD0gZXF1YWw/ KSkKICAgIlJldHVybiB0d28gdmFsdWVzLCB0aGUgZmlyc3QgcGFpciBpbiBBTElTVCB3aXRoIGtl eSBLRVksIGFuZCB0aGUgb3RoZXIKIGVsZW1lbnRzLiAgRXF1YWxpdHkgY2FsbHMgYXJlIG1hZGUg YXMgKD0gS0VZIEFMSVNUQ0FSKS4iCkBAIC02Myw2NyArNjEsMTcgQEAgKGRlZmluZSogKGFsaXN0 LXBvcCBhbGlzdCBrZXkgIzpvcHRpb25hbCAoPSBlcXVhbD8pKQogICAgICAgICAodmFsdWVzIChj YXIgYWZ0ZXIpIChhcHBlbmQgYmVmb3JlIChjZHIgYWZ0ZXIpKSkKICAgICAgICAgKHZhbHVlcyAj ZiBiZWZvcmUpKSkpCiAKLShkZWZpbmUqIChhbGlzdC11cGRhdGUgYWxpc3Qga2V5IHByb2MgIzpv cHRpb25hbCBkZWZhdWx0ICg9IGVxdWFsPykpCisoZGVmaW5lKiAoYWxpc3QtdXBkYXRlIGFsaXN0 IGtleSBwcm9jICM6b3B0aW9uYWwgKD0gZXF1YWw/KSkKICAgIlJldHVybiBhbiBhc3NvY2lhdGlv biBsaXN0IGxpa2UgQUxJU1QsIGJ1dCB3aXRoIEtFWSBtYXBwZWQgdG8gdGhlIHJlc3VsdCBvZgog UFJPQyBhcHBsaWVkIHRvIHRoZSBmaXJzdCB2YWx1ZSBmb3VuZCB1bmRlciB0aGUgY29tcGFyaXNv biAoPSBLRVkgQUxJU1RDQVIpLgotSWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMsIHVzZSBERUZBVUxU IGluc3RlYWQuCitJZiBubyBzdWNoIHZhbHVlIGV4aXN0cywgcmV0dXJuIHRoZSBsaXN0IHVuY2hh bmdlZC4KIFVubGlrZSBhY29ucywgdGhpcyByZW1vdmVzIHRoZSBwcmV2aW91cyBhc3NvY2lhdGlv biBvZiBLRVkgKGFzc3VtaW5nIGl0IGlzCiB1bmlxdWUpLCBidXQgdGhlIHJlc3VsdCBtYXkgc3Rp bGwgc2hhcmUgc3RvcmFnZSB3aXRoIEFMSVNULiIKICAgKGxldCAoKHBhaXIgcmVzdCAoYWxpc3Qt cG9wIGFsaXN0IGtleSA9KSkpCi0gICAgKGFjb25zIGtleQotICAgICAgICAgICAocHJvYyAoaWYg KHBhaXI/IHBhaXIpCi0gICAgICAgICAgICAgICAgICAgICAoY2RyIHBhaXIpCi0gICAgICAgICAg ICAgICAgICAgICBkZWZhdWx0KSkKLSAgICAgICAgICAgcmVzdCkpKQotCi0oZGVmaW5lIChqc29i amVjdC11cGRhdGUqIGpzIC4gdXBkYXRlcykKLSAgIlJldHVybiBhIGpzb24gb2JqZWN0IGxpa2Ug SlMsIGJ1dCB3aXRoIGFsbCBVUERBVEVTIGFwcGxpZWQuICBFYWNoIHVwZGF0ZSBpcwotYSBsaXN0 IChLRVkgUFJPQyBbREVGQVVMVF0pLCBzbyB0aGF0IEtFWSBpcyBtYXBwZWQgdG8gdGhlIHJlc3Vs dCBvZiBQUk9DCi1hcHBsaWVkIHRvIHRoZSB2YWx1ZSB0byB3aGljaCBLRVkgaXMgbWFwcGVkIGlu IEpTLiAgSWYgbm8gc3VjaCBtYXBwaW5nIGV4aXN0cywKLVBST0MgaXMgaW5zdGVhZCBhcHBsaWVk IHRvIERFRkFVTFQsIG9yIHRvICcjZicgaXMgbm8gREVGQVVMVCBpcyBzcGVjaWZpZWQuCi1UaGUg dXBkYXRlIHRha2VzIHBsYWNlIGZyb20gbGVmdCB0byByaWdodCwgc28gbGF0ZXIgVVBEQVRFUnMg d2lsbCByZWNlaXZlIHRoZQotdmFsdWVzIHJldHVybmVkIGJ5IGVhcmxpZXIgVVBEQVRFUnMgZm9y IHRoZSBzYW1lIEtFWS4iCi0gIChtYXRjaCBqcwotICAgICgoJ0AgLiBhbGlzdCkKLSAgICAgKGxl dCBsb29wICgoYWxpc3QgYWxpc3QpCi0gICAgICAgICAgICAgICAgKHVwZGF0ZXMgdXBkYXRlcykp Ci0gICAgICAgKG1hdGNoIHVwZGF0ZXMKLSAgICAgICAgICgoKSAoY29ucyAnQCBhbGlzdCkpCi0g ICAgICAgICAoKChrZXkgcHJvYykgLiB1cGRhdGVzKQotICAgICAgICAgIChsb29wIChhbGlzdC11 cGRhdGUgYWxpc3Qga2V5IHByb2MgI2YgZXF1YWw/KSB1cGRhdGVzKSkKLSAgICAgICAgICgoKGtl eSBwcm9jIGRlZmF1bHQpIC4gdXBkYXRlcykKLSAgICAgICAgICAobG9vcCAoYWxpc3QtdXBkYXRl IGFsaXN0IGtleSBwcm9jIGRlZmF1bHQgZXF1YWw/KSB1cGRhdGVzKSkpKSkpKQotCi0oZGVmaW5l IChqc29iamVjdC11bmlvbiBjb21iaW5lIHNlZWQgLiBvYmplY3RzKQotICAiTWVyZ2UgT0JKRUNU UyBpbnRvIFNFRUQgYnkgYXBwbHlpbmcgKENPTUJJTkUgS0VZIFZBTDAgVkFMKSwgd2hlcmUgVkFM MAotaXMgdGhlIHZhbHVlIGZvdW5kIGluIHRoZSAocG9zc2libHkgdXBkYXRlZCkgU0VFRCBhbmQg VkFMIGlzIHRoZSBuZXcgdmFsdWUKLWZvdW5kIGluIG9uZSBvZiB0aGUgT0JKRUNUUy4iCi0gICht YXRjaCBzZWVkCi0gICAgKCgnQCAuIGFzZWVkKQotICAgICAobWF0Y2ggb2JqZWN0cwotICAgICAg ICgoKSBzZWVkKQotICAgICAgICgoKCdAIC4gYWxpc3RzKSAuLi4pCi0gICAgICAgIChjb25zCi0g ICAgICAgICAnQAotICAgICAgICAgKGZvbGQgKGxhbWJkYSAoYWxpc3QgYXNlZWQpCi0gICAgICAg ICAgICAgICAgIChpZiAobnVsbD8gYXNlZWQpIGFsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAo Zm9sZAotICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEqCi0gICAgICAgICAgICAg ICAgICAgICAgICAoKChrIC4gdikgYXNlZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGxl dCAoKHBhaXIgdGFpbCAoYWxpc3QtcG9wIGFsaXN0IGspKSkKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgIChtYXRjaCBwYWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgjZiAoYWNv bnMgayB2IGFzZWVkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfIC4gdjApIChh Y29ucyBrIChjb21iaW5lIGsgdjAgdikgYXNlZWQpKSkpKSkKLSAgICAgICAgICAgICAgICAgICAg ICBhc2VlZAotICAgICAgICAgICAgICAgICAgICAgIGFsaXN0KSkpCi0gICAgICAgICAgICAgICBh c2VlZAotICAgICAgICAgICAgICAgYWxpc3RzKSkpKSkpKQorICAgIChpZiAocGFpcj8gcGFpcikK KyAgICAgIChhY29ucyBrZXkgKHByb2MgKGNkciBwYWlyKSkgcmVzdCkKKyAgICAgIGFsaXN0KSkp CiAKLTs7IFBvc3NpYmx5IHVzZWZ1bCBoZWxwZXIgZnVuY3Rpb25zOgotOzsgKGRlZmluZSAobmV3 ZXN0IGtleSB2YWwwIHZhbCkgdmFsKQotOzsgKGRlZmluZSAodW5rZXllZC0+a2V5ZWQgcHJvYykg KGxhbWJkYSAoX2tleSB2YWwwIHZhbCkgKHByb2MgdmFsMCB2YWwpKSkKLQotDAogOzs7CiA7Ozsg UGhhc2VzLgogOzs7CkBAIC0xNDIsOCArOTAsOCBAQCAoZGVmaW5lIChzZXQtaG9tZSAuIF8pCiAK IChkZWZpbmUgKG1vZHVsZS1uYW1lIG1vZHVsZSkKICAgKGxldCogKChwYWNrYWdlLmpzb24gKHN0 cmluZy1hcHBlbmQgbW9kdWxlICIvcGFja2FnZS5qc29uIikpCi0gICAgICAgICAocGFja2FnZS1t ZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBwYWNrYWdlLmpzb24gcmVhZC1qc29uKSkpCi0gICAg KGpzb2JqZWN0LXJlZiBwYWNrYWdlLW1ldGEgIm5hbWUiKSkpCisgICAgICAgICAocGFja2FnZS1t ZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBwYWNrYWdlLmpzb24ganNvbi0+c2NtKSkpCisgICAg KGFzc29jLXJlZiBwYWNrYWdlLW1ldGEgIm5hbWUiKSkpCiAKIChkZWZpbmUgKGluZGV4LW1vZHVs ZXMgaW5wdXQtcGF0aHMpCiAgIChkZWZpbmUgKGxpc3QtbW9kdWxlcyBkaXJlY3RvcnkpCkBAIC0x NjcsNDkgKzExNSw1OSBAQCAoZGVmaW5lKiAocGF0Y2gtZGVwZW5kZW5jaWVzICM6a2V5IGlucHV0 cyAjOmFsbG93LW90aGVyLWtleXMpCiAKICAgKGRlZmluZSBpbmRleCAoaW5kZXgtbW9kdWxlcyAo bWFwIGNkciBpbnB1dHMpKSkKIAotICAoZGVmaW5lIHJlc29sdmUtZGVwZW5kZW5jaWVzCi0gICAg KG1hdGNoLWxhbWJkYQotICAgICAgKCgnQCAuIGFsaXN0KQotICAgICAgIChjb25zICdAIChtYXAg KG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAoKGtleSAuIHZhbHVlKQotICAg ICAgICAgICAgICAgICAgICAgICAgKGNvbnMga2V5IChoYXNoLXJlZiBpbmRleCBrZXkgdmFsdWUp KSkpCi0gICAgICAgICAgICAgICAgICAgICBhbGlzdCkpKSkpCisgIChkZWZpbmUgKHJlc29sdmUt ZGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcykKKyAgICAobWFwCisgICAgICAobWF0Y2gtbGFtYmRh CisgICAgICAgICgoZGVwZW5kZW5jeSAuIHZlcnNpb24pCisgICAgICAgICAgKGNvbnMgZGVwZW5k ZW5jeSAoaGFzaC1yZWYgaW5kZXggZGVwZW5kZW5jeSB2ZXJzaW9uKSkpKQorICAgICAgZGVwZW5k ZW5jaWVzKSkKIAotICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdl Lmpzb24iCisgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQKICAgICAobGFtYmRh IChwa2ctbWV0YSkKLSAgICAgIChqc29iamVjdC11cGRhdGUqCi0gICAgICAgcGtnLW1ldGEKLSAg ICAgICBgKCJkZXZEZXBlbmRlbmNpZXMiICxyZXNvbHZlLWRlcGVuZGVuY2llcyAoQCkpCi0gICAg ICAgYCgiZGVwZW5kZW5jaWVzIiAsKGxhbWJkYSAoZGVwcykKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgIChyZXNvbHZlLWRlcGVuZGVuY2llcwotICAgICAgICAgICAgICAgICAgICAgICAgICAg IChqc29iamVjdC11bmlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChr IGEgYikgYikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpzb2JqZWN0LXJlZiBwa2ct bWV0YSAicGVlckRlcGVuZGVuY2llcyIgJyhAKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgZGVwcykpKQotICAgICAgICAgKEApKSkpKQorICAgICAgKGZvbGQKKyAgICAgICAgKGxhbWJk YSAocHJvYyBwa2ctbWV0YSkgKHByb2MgcGtnLW1ldGEpKQorICAgICAgICBwa2ctbWV0YQorICAg ICAgICAobGlzdAorICAgICAgICAgIChsYW1iZGEgKHBrZy1tZXRhKQorICAgICAgICAgICAgKGFs aXN0LXVwZGF0ZSBwa2ctbWV0YSAiZGV2RGVwZW5kZW5jaWVzIiByZXNvbHZlLWRlcGVuZGVuY2ll cykpCisgICAgICAgICAgKGxhbWJkYSAocGtnLW1ldGEpCisgICAgICAgICAgICAoYXNzb2Mtc2V0 IQorICAgICAgICAgICAgICBwa2ctbWV0YQorICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIgor ICAgICAgICAgICAgICAocmVzb2x2ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICA7IENv bWJpbmVkICJwZWVyRGVwZW5kZW5jaWVzIiBhbmQgImRlcGVuZGVuY2llcyIgZGVwZW5kZW5jaWVz CisgICAgICAgICAgICAgICAgOyB3aXRoICJkZXBlbmRlbmNpZXMiIHRha2luZyBwcmVjZWRlbnQu CisgICAgICAgICAgICAgICAgKGZvbGQKKyAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGRlcGVu ZGVuY3kgZGVwZW5kZW5jaWVzKQorICAgICAgICAgICAgICAgICAgICAoYXBwbHkgYXNzb2Mtc2V0 ISBkZXBlbmRlbmNpZXMgZGVwZW5kZW5jeSkpCisgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVm KiBwa2ctbWV0YSAicGVlckRlcGVuZGVuY2llcyIgJygpKQorICAgICAgICAgICAgICAgICAgKGFz c29jLXJlZiogcGtnLW1ldGEgImRlcGVuZGVuY2llcyIgJygpKSkpKSkpKSkpCiAgICN0KQogCi0o ZGVmaW5lIChkZWxldGUtZGVwZW5kZW5jaWVzIGFic2VudCkKKyhkZWZpbmUgKGRlbGV0ZS1kZXBl bmRlbmNpZXMgZGVwZW5kZW5jaWVzLXRvLXJlbW92ZSkKICAgIlJld3JpdGUgJ3BhY2thZ2UuanNv bicgdG8gYWxsb3cgdGhlIGJ1aWxkIHRvIHByb2NlZWQgd2l0aG91dCBwYWNrYWdlcwotbGlzdGVk IGluIEFCU0VOVCwgYSBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIG5wbSBwYWNrYWdlcy4KK2xpc3Rl ZCBpbiAnZGVwZW5kZW5jaWVzLXRvLXJlbW92ZScsIGEgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBu cG0gcGFja2FnZXMuCiAKIFRvIHByZXZlbnQgdGhlIGRlbGV0ZWQgZGVwZW5kZW5jaWVzIGZyb20g YmVpbmcgcmVpbnRyb2R1Y2VkLCB1c2UgdGhpcyBmdW5jdGlvbgogb25seSBhZnRlciB0aGUgJ3Bh dGNoLWRlcGVuZGVuY2llcycgcGhhc2UuIgotICAoZGVmaW5lIGRlbGV0ZS1mcm9tLWpzb2JqZWN0 Ci0gICAgKG1hdGNoLWxhbWJkYQotICAgICAgKCgnQCAuIGFsaXN0KQotICAgICAgIChjb25zICdA IChmaWx0ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAoKGsgLiBf KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAobWVtYmVyIGsgYWJzZW50KSkpKQot ICAgICAgICAgICAgICAgICAgICAgICAgYWxpc3QpKSkpKQotCi0gICh3aXRoLWF0b21pYy1qc29u LWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKKyAgKHdpdGgtYXRvbWljLWpzb24tZmls ZS1yZXBsYWNlbWVudAogICAgIChsYW1iZGEgKHBrZy1tZXRhKQotICAgICAgKGpzb2JqZWN0LXVw ZGF0ZSoKLSAgICAgICBwa2ctbWV0YQotICAgICAgIGAoImRldkRlcGVuZGVuY2llcyIgLGRlbGV0 ZS1mcm9tLWpzb2JqZWN0IChAKSkKLSAgICAgICBgKCJkZXBlbmRlbmNpZXMiICxkZWxldGUtZnJv bS1qc29iamVjdCAoQCkpCi0gICAgICAgYCgicGVlckRlcGVuZGVuY2llcyIgLGRlbGV0ZS1mcm9t LWpzb2JqZWN0IChAKSkpKSkpCisgICAgICAoZm9sZAorICAgICAgICAobGFtYmRhIChkZXBlbmRl bmN5LWtleSBwa2ctbWV0YSkKKyAgICAgICAgICAoYWxpc3QtdXBkYXRlCisgICAgICAgICAgICBw a2ctbWV0YQorICAgICAgICAgICAgZGVwZW5kZW5jeS1rZXkKKyAgICAgICAgICAgIChsYW1iZGEg KGRlcGVuZGVuY2llcykKKyAgICAgICAgICAgICAgKHJlbW92ZQorICAgICAgICAgICAgICAgIChs YW1iZGEgKGRlcGVuZGVuY3kpCisgICAgICAgICAgICAgICAgICAobWVtYmVyIChjYXIgZGVwZW5k ZW5jeSkgZGVwZW5kZW5jaWVzLXRvLXJlbW92ZSkpCisgICAgICAgICAgICAgICAgZGVwZW5kZW5j aWVzKSkpKQorICAgICAgICBwa2ctbWV0YQorICAgICAgICAobGlzdAorICAgICAgICAgICJkZXZE ZXBlbmRlbmNpZXMiCisgICAgICAgICAgImRlcGVuZGVuY2llcyIKKyAgICAgICAgICAicGVlckRl cGVuZGVuY2llcyIKKyAgICAgICAgICAib3B0aW9uYWxEZXBlbmRlbmNpZXMiKSkpKSkKIAogKGRl ZmluZSogKGRlbGV0ZS1sb2NrZmlsZXMgIzprZXkgaW5wdXRzICM6YWxsb3ctb3RoZXIta2V5cykK ICAgIkRlbGV0ZSAncGFja2FnZS1sb2NrLmpzb24nLCAneWFybi5sb2NrJywgYW5kICducG0tc2hy aW5rd3JhcC5qc29uJywgaWYgdGhleQpAQCAtMjI4LDggKzE4Niw4IEBAIChkZWZpbmUqIChjb25m aWd1cmUgIzprZXkgb3V0cHV0cyBpbnB1dHMgIzphbGxvdy1vdGhlci1rZXlzKQogICAgICN0KSkK IAogKGRlZmluZSogKGJ1aWxkICM6a2V5IGlucHV0cyAjOmFsbG93LW90aGVyLWtleXMpCi0gIChs ZXQgKChwYWNrYWdlLW1ldGEgKGNhbGwtd2l0aC1pbnB1dC1maWxlICJwYWNrYWdlLmpzb24iIHJl YWQtanNvbikpKQotICAgIChpZiAoanNvYmplY3QtcmVmIChqc29iamVjdC1yZWYgcGFja2FnZS1t ZXRhICJzY3JpcHRzIiAnKEApKSAiYnVpbGQiICNmKQorICAobGV0ICgocGFja2FnZS1tZXRhIChj YWxsLXdpdGgtaW5wdXQtZmlsZSAicGFja2FnZS5qc29uIiBqc29uLT5zY20pKSkKKyAgICAoaWYg KGFzc29jLXJlZiogKGFzc29jLXJlZiogcGFja2FnZS1tZXRhICJzY3JpcHRzIiAnKCkpICJidWls ZCIgI2YpCiAgICAgICAgIChsZXQgKChucG0gKHN0cmluZy1hcHBlbmQgKGFzc29jLXJlZiBpbnB1 dHMgIm5vZGUiKSAiL2Jpbi9ucG0iKSkpCiAgICAgICAgICAgKGludm9rZSBucG0gInJ1biIgImJ1 aWxkIikpCiAgICAgICAgIChmb3JtYXQgI3QgInRoZXJlIGlzIG5vIGJ1aWxkIHNjcmlwdCB0byBy dW5+JSIpKQpAQCAtMzAxLDIyICsyNTksMjAgQEAgKGRlZmluZSogKGF2b2lkLW5vZGUtZ3lwLXJl YnVpbGQgIzprZXkgb3V0cHV0cyAjOmFsbG93LW90aGVyLWtleXMpCiAgIDs7IGV2ZW4gbmVlZCB0 byBvdmVyd3JpdGUgdGhpcyBmaWxlLiAgVGhlcmVmb3JlLCBsZXQncyB1c2Ugc29tZSBoZWxwZXJz CiAgIDs7IHRoYXQgd2UnZCBvdGhlcndpc2Ugbm90IG5lZWQuCiAgIChkZWZpbmUgcGtnLW1ldGEK LSAgICAoY2FsbC13aXRoLWlucHV0LWZpbGUgaW5zdGFsbGVkLXBhY2thZ2UuanNvbiByZWFkLWpz b24pKQorICAgIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBpbnN0YWxsZWQtcGFja2FnZS5qc29uIGpz b24tPnNjbSkpCiAgIChkZWZpbmUgc2NyaXB0cwotICAgIChqc29iamVjdC1yZWYgcGtnLW1ldGEg InNjcmlwdHMiICcoQCkpKQotICAoZGVmaW5lIChqc29iamVjdC1zZXQganMga2V5IHZhbCkKLSAg ICAoanNvYmplY3QtdXBkYXRlKiBqcyAobGlzdCBrZXkgKGNvbnN0IHZhbCkpKSkKKyAgICAoYXNz b2MtcmVmKiBwa2ctbWV0YSAic2NyaXB0cyIgJygpKSkKIAotICAod2hlbiAoZXF1YWw/ICJub2Rl LWd5cCByZWJ1aWxkIiAoanNvYmplY3QtcmVmIHNjcmlwdHMgImluc3RhbGwiICNmKSkKKyAgKHdo ZW4gKGVxdWFsPyAibm9kZS1neXAgcmVidWlsZCIgKGFzc29jLXJlZiogc2NyaXB0cyAiaW5zdGFs bCIgI2YpKQogICAgIChjYWxsLXdpdGgtb3V0cHV0LWZpbGUgaW5zdGFsbGVkLXBhY2thZ2UuanNv bgogICAgICAgKGxhbWJkYSAob3V0KQotICAgICAgICAod3JpdGUtanNvbgotICAgICAgICAgKGpz b2JqZWN0LXNldCBwa2ctbWV0YQotICAgICAgICAgICAgICAgICAgICAgICAic2NyaXB0cyIKLSAg ICAgICAgICAgICAgICAgICAgICAgKGpzb2JqZWN0LXNldCBzY3JpcHRzCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbGwiCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgImVjaG8gR3VpeDogYXZvaWRpbmcgbm9kZS1neXAgcmVidWlsZCIpKQot ICAgICAgICAgb3V0KSkpKSkKKyAgICAgICAgKHNjbS0+anNvbgorICAgICAgICAgIChhc3NvYy1z ZXQhIHBrZy1tZXRhCisgICAgICAgICAgICAgICAgICAgICAgInNjcmlwdHMiCisgICAgICAgICAg ICAgICAgICAgICAgKGFzc29jLXNldCEgc2NyaXB0cworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICJpbnN0YWxsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJl Y2hvIEd1aXg6IGF2b2lkaW5nIG5vZGUtZ3lwIHJlYnVpbGQiKSkKKyAgICAgICAgICBvdXQpKSkp KQogCiAoZGVmaW5lICVzdGFuZGFyZC1waGFzZXMKICAgKG1vZGlmeS1waGFzZXMgZ251OiVzdGFu ZGFyZC1waGFzZXMKCmJhc2UtY29tbWl0OiBlMTZjZGNmMzdkODIyM2IzNjM0ZWM1ZTY1ODM1NmMz YjdmMTU0ODU5Ci0tIAoyLjQ2LjAKCg== --0000000000001eb841062a2c5a1f--