Thread View: gmane.emacs.devel
59 messages
59 total messages
Page 1 of 2
Started by Thierry Volpiatt
Mon, 07 Aug 2023 07:57
Page 1 of 2 • 59 total messages
Changes to make in elpa-packages file for nongnu elpa
Author: Thierry Volpiatt
Date: Mon, 07 Aug 2023 07:57
Date: Mon, 07 Aug 2023 07:57
62 lines
2325 bytes
2325 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable I see that Helm installation from nongnu elpa doesn't include emacs-helm.sh script, would it be possible to modify this? diff --git a/elpa-packages b/elpa-packages index 77d7a5409e..0923724b62 100644 --- a/elpa-packages +++ b/elpa-packages @@ -312,11 +312,11 @@ :ignored-files "COPYING") (helm :url "https://github.com/emacs-helm/helm" - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el" + :ignored-files ("images" "Makefile" "helm-core.el" "helm.el" "helm-lib.el" "helm-source.el" "helm-multi-match.el")) (helm-core :url "https://github.com/emacs-helm/helm" - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el" + :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el" "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el" "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el" "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el" Also I asked here about a new dependency for Helm called wfnames and had no answer (2 times), so I ask again differently now: When a package is available in Melpa do we have to add it in nongnu as well to satisfy dependencies for a package already in nongnu? Thanks. -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTQpeoTHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk326C/wMJWMxsX3aY04IZVMN9YNv/wk9Ry+c 4q7hzjrkpcKVpMuNxWKA/2FXvhwLhKu8kZrZAHh4+60DymLqXrPGQbG+Nv8wiYw3 k/1+TXhAbiyUwOFU5q6YwrSxRZ3quDDtpS584zymqSOp7RrrhHyuzx14eYrnUh8P yti9kG0GL7R7Fnu5xxRhuo4kq1qg3gLCZk/68m5mvZKxoQaZ4Jvm5YYPQ+gvzwTc p1a3FfTkMKDEZs4t3osH8u/v87UjuAE2r22jTTwU9is+VuBsZWkPrTsqTkA80jSg RTpDJEDQNyUcGHxQo3C1HuvbT3X4iZdfDKvrSU7CBcptvIIGWzrlHcw0ZymwBAAE xlA2q3E5nIcXihH82j5V9KBxos7Eg1RRhCxjn7Ty70AsVQEMrlpOGPcXlCPHmlBN dvbJil8lpZ122OlD0q87dXQrMRZTCEW4SMCE+FlqvbxMomlWEc+oDFNpPTkwoDlZ NnMIvWTFPdSbHv6VZDjM0CN1n5f0Ab3X5tU=la8Y -----END PGP SIGNATURE----- --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Mon, 07 Aug 2023 13:30
Date: Mon, 07 Aug 2023 13:30
48 lines
2203 bytes
2203 bytes
Thierry Volpiatto <thievol@posteo.net> writes: > I see that Helm installation from nongnu elpa doesn't include > emacs-helm.sh script, would it be possible to modify this? > > diff --git a/elpa-packages b/elpa-packages > index 77d7a5409e..0923724b62 100644 > --- a/elpa-packages > +++ b/elpa-packages > @@ -312,11 +312,11 @@ > :ignored-files "COPYING") > > (helm :url "https://github.com/emacs-helm/helm" > - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el" > + :ignored-files ("images" "Makefile" "helm-core.el" "helm.el" > "helm-lib.el" "helm-source.el" "helm-multi-match.el")) > > (helm-core :url "https://github.com/emacs-helm/helm" > - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el" > + :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el" > "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el" > "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el" > "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el" There shouldn't be any issue in applying this patch, but could you explain the propose of this script? I see something involving straight.el, which is a package.el-incompatible package manager, at which point I am confused why this should be distributed along with a "package.el"-package. > Also I asked here about a new dependency for Helm called wfnames and had > no answer (2 times), Sorry about that, you can always feel free to CC me if you have specific questions that might get lost on the mailing list. I suppose Stefan Monnier wouldn't object to be mentioned either. > so I ask again differently now: > > When a package is available in Melpa do we have to add it in nongnu as > well to satisfy dependencies for a package already in nongnu? Yes, if the dependency is missing someone only using GNU ELPA and NonGNU ELPA wouldn't be able to install the package due to a missing dependency and that is obviously not intended. > Thanks.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Thierry Volpiatt
Date: Mon, 07 Aug 2023 18:19
Date: Mon, 07 Aug 2023 18:19
102 lines
4077 bytes
4077 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Philip Kaludercic <philipk@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> I see that Helm installation from nongnu elpa doesn't include >> emacs-helm.sh script, would it be possible to modify this? >> >> diff --git a/elpa-packages b/elpa-packages >> index 77d7a5409e..0923724b62 100644 >> --- a/elpa-packages >> +++ b/elpa-packages >> @@ -312,11 +312,11 @@ >> :ignored-files "COPYING") >> >> (helm :url "https://github.com/emacs-helm/helm" >> - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el" >> + :ignored-files ("images" "Makefile" "helm-core.el" "helm.el" >> "helm-lib.el" "helm-source.el" "helm-multi-match.el")) >> >> (helm-core :url "https://github.com/emacs-helm/helm" >> - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el" >> + :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el" >> "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el" >> "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el" >> "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el" > > There shouldn't be any issue in applying this patch, but could you > explain the propose of this script? It is used specially for reproducing bugs in a clean environment, see it as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q with only Helm loaded, this ensure the bug if one comes from Helm and not another package. This is important especially nowaday people are using "Emacs distribution" with the world list of packages installed. Apart that the script is useful to quickly launch Emacs with helm, one can use it from the Helm directory or symlinked to e.g. ~/bin. > I see something involving straight.el, which is a > package.el-incompatible package manager, at which point I am confused > why this should be distributed along with a "package.el"-package. The script doesn't need straight, but it ensures the script is usable for somebody using straight (to find package directory etc...). >> Also I asked here about a new dependency for Helm called wfnames and had >> no answer (2 times), > > Sorry about that, you can always feel free to CC me if you have specific > questions that might get lost on the mailing list. I suppose Stefan > Monnier wouldn't object to be mentioned either. Ok thanks, I will next time now I know you and Stefan are in charge of this. >> so I ask again differently now: >> >> When a package is available in Melpa do we have to add it in nongnu as >> well to satisfy dependencies for a package already in nongnu? > > Yes, if the dependency is missing someone only using GNU ELPA and NonGNU > ELPA wouldn't be able to install the package due to a missing dependency > and that is obviously not intended. Ok, it's what I thought, so yes it would be nice to install wfnames package in Nongnu. Here is the link: https://github.com/thierryvolpiatto/wfnames Thanks. -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTROSQTHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk7x+DACrsERauQLhmK6GlkLr9I3tKpd02ElL 7fiPUHOOvuSBw+DBj/XG6D6C0P9bOO9B7SNPs6ZTqAEyv6UnWC7CLAevnBkiH8NI WnCOJkSRzhjI9Xa5dg3rqm0oLqB/3k/VueCrUdSvxgR5MrdebuOitPDdJFKY1zHz uTrHtt2kfZucCGICNIMYO7aGXTPqa3VwstvUeYp9ak8eLkqVHZAu9xYrcakLLWn/ oRBbuZJdTzAeKnw0ZFj5fjKuetKHRZqAIRRI+wj0V9qxHpqY9v6eRL2r9zuim3rm k7gG/+Qtb0Xv2Im2PEmkTI+6nnM3eQE2w4ItVis5QyyF6/LjNPa1dAzuvtHdsUZm wHEbpYp4H/hTy0fZg141pl5rauTrDjQijseC8v1hWTmKFHrnivbfucujD1UazgrF WPZJu/JNcQyzhn9yUhBqFDFisECWmsYXyw7lkgIhsTG+tfSHWYl5LYL5It9F96hA 80tPD0bjbHgbeH5w9rr+4X54Uf3Lv3UTpvw=NJ4P -----END PGP SIGNATURE----- --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Mon, 07 Aug 2023 20:33
Date: Mon, 07 Aug 2023 20:33
260 lines
10474 bytes
10474 bytes
--=-=-= Content-Type: text/plain Thierry Volpiatto <thievol@posteo.net> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >> Thierry Volpiatto <thievol@posteo.net> writes: >> >>> I see that Helm installation from nongnu elpa doesn't include >>> emacs-helm.sh script, would it be possible to modify this? >>> >>> diff --git a/elpa-packages b/elpa-packages >>> index 77d7a5409e..0923724b62 100644 >>> --- a/elpa-packages >>> +++ b/elpa-packages >>> @@ -312,11 +312,11 @@ >>> :ignored-files "COPYING") >>> >>> (helm :url "https://github.com/emacs-helm/helm" >>> - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el" >>> + :ignored-files ("images" "Makefile" "helm-core.el" "helm.el" >>> "helm-lib.el" "helm-source.el" "helm-multi-match.el")) >>> >>> (helm-core :url "https://github.com/emacs-helm/helm" >>> - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el" >>> + :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el" >>> "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el" >>> "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el" >>> "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el" >> >> There shouldn't be any issue in applying this patch, but could you >> explain the propose of this script? > > It is used specially for reproducing bugs in a clean environment, see it > as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q > with only Helm loaded, this ensure the bug if one comes from Helm and > not another package. This is important especially nowaday people are > using "Emacs distribution" with the world list of packages installed. > Apart that the script is useful to quickly launch Emacs with helm, one > can use it from the Helm directory or symlinked to e.g. ~/bin. I see. In that case is there any reason you implement this as a shell script? (It might be interesting to provide something like this for package.el, to test packages in a generic way.) >> I see something involving straight.el, which is a >> package.el-incompatible package manager, at which point I am confused >> why this should be distributed along with a "package.el"-package. > > The script doesn't need straight, but it ensures the script is usable for > somebody using straight (to find package directory etc...). Ah OK my bad. >>> Also I asked here about a new dependency for Helm called wfnames and had >>> no answer (2 times), >> >> Sorry about that, you can always feel free to CC me if you have specific >> questions that might get lost on the mailing list. I suppose Stefan >> Monnier wouldn't object to be mentioned either. > > Ok thanks, I will next time now I know you and Stefan are in charge of > this. I am sort of an unofficial co-maintainer, without access to any server-side infrastructure, but other than that I'm glad to help within my possibilities. >>> so I ask again differently now: >>> >>> When a package is available in Melpa do we have to add it in nongnu as >>> well to satisfy dependencies for a package already in nongnu? >> >> Yes, if the dependency is missing someone only using GNU ELPA and NonGNU >> ELPA wouldn't be able to install the package due to a missing dependency >> and that is obviously not intended. > > Ok, it's what I thought, so yes it would be nice to install wfnames > package in Nongnu. > Here is the link: https://github.com/thierryvolpiatto/wfnames Sure, but could you first take a look at these comments, suggestions and questions I have made while skimming over the source? --=-=-= Content-Type: text/plain Content-Disposition: inline diff --git a/wfnames.el b/wfnames.el index e5a83b5..a61a18d 100644 --- a/wfnames.el +++ b/wfnames.el @@ -34,20 +34,20 @@ ;; Usage: ;; Once in the Wfnames buffer, edit your filenames and hit C-c C-c to -;; save your changes. You have completion on filenames and directories +;; save your changes. You have completion on filenames and directories ;; with TAB but if you are using Iedit package and it is in action use =M-TAB=. ;;; Code: -(require 'cl-lib) +(eval-when-compile (require 'cl-lib)) ;you are only using macros, so this should be OK ;; Internal. -(defvar wfnames-buffer "*Wfnames*") -(defvar wfnames--modified nil) +(defvar wfnames-buffer "*Wfnames*") ;perhaps `defconst' +(defvar-local wfnames--modified nil) (defgroup wfnames nil "A mode to edit filenames." - :group 'wfnames) + :group 'wfnames) ;watch out, this is a recursive group (defcustom wfnames-create-parent-directories t "Create parent directories when non nil." @@ -57,16 +57,21 @@ "Ask confirmation when overwriting." :type 'boolean) -(defvar wfnames-after-commit-hook nil) +(defcustom wfnames-after-commit-hook nil + "Hook to run after `wfnames-commit-buffer'." ;rephrase this + :type 'hook) (defcustom wfnames-after-commit-function #'kill-buffer "A function to call on `wfnames-buffer' when done." :type 'function) (defcustom wfnames-make-backup nil - "Backup files before overwriting when non nil." + "Non-nil means files are backed up before overwriting." :type 'boolean) +;; instead of defining new faces and colours, do you think it would be +;; possible to inherit from existing faces? + (defface wfnames-modified '((t :background "LightBlue" :foreground "black")) "Face used when filename is modified.") @@ -104,27 +109,27 @@ "Provide filename completion in wfnames buffer." (let ((beg (line-beginning-position)) (end (point))) + ;; Does it make sense to extend beyond END to allow completing + ;; file names mid-string? (list beg end #'completion-file-name-table :exit-function (lambda (str _status) (when (and (stringp str) (eq (char-after) ?/)) (delete-char -1)))))) -(define-derived-mode wfnames-mode - text-mode "wfnames" +(define-derived-mode wfnames-mode text-mode "wfnames" "Major mode to edit filenames. Special commands: \\{wfnames-mode-map}" (add-hook 'after-change-functions #'wfnames-after-change-hook nil t) - (make-local-variable 'wfnames--modified) - (set (make-local-variable 'completion-at-point-functions) #'wfnames-capf) - (set (make-local-variable 'revert-buffer-function) #'wfnames-revert-changes)) + (setq-local completion-at-point-functions #'wfnames-capf) + (setq-local revert-buffer-function #'wfnames-revert-changes)) (defun wfnames-abort () "Quit and kill wfnames buffer." (interactive) - (quit-window t)) + (quit-window t)) ;isn't this `kill-buffer-and-window' (defun wfnames-after-change-hook (beg end _len) "Put overlay on current line when modified. @@ -137,9 +142,10 @@ Args BEG and END delimit changes on line." (eol (line-end-position)) (old (get-text-property bol 'old-name)) (new (buffer-substring-no-properties bol eol)) - ov face) - (setq face (if (file-exists-p new) - 'wfnames-modified-exists 'wfnames-modified)) + (face (if (file-exists-p new) + 'wfnames-modified-exists + 'wfnames-modified)) + ov) (setq-local wfnames--modified (cons old (delete old wfnames--modified))) (cl-loop for o in (overlays-in bol eol) @@ -184,10 +190,10 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'." "* " 'face 'wfnames-prefix)) "\n")) - (when append (delete-duplicate-lines (point-min) (point-max)))) + (when append (delete-duplicate-lines (point-min) (point-max)))) ;this requires Emacs 24.4 (unless append ;; Go to beginning of basename on first line. - (while (re-search-forward "/" (line-end-position) t)) + (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t) (wfnames-mode) (funcall display-fn wfnames-buffer)))) @@ -202,7 +208,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'." "Backup FILE." (when wfnames-make-backup (with-current-buffer (find-file-noselect file) - (let ((backup-by-copying t)) + (let ((backup-by-copying t)) ;why is this bound? isn't this a user preference? (backup-buffer)) (kill-buffer)))) @@ -252,7 +258,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'." (let ((basedir (file-name-directory (directory-file-name new)))) (unless (file-directory-p basedir) - (mkdir basedir 'parents)))) + (make-directory basedir 'parents)))) (if (and ow (wfnames-ask-for-overwrite new)) ;; Direct overwrite i.e. first loop. (progn @@ -300,21 +306,22 @@ With a numeric prefix ARG, revert the ARG next lines." (wfnames-revert-current-line-1) (when (eobp) (forward-line -1)) (goto-char (line-beginning-position)) - (while (re-search-forward "/" (line-end-position) t)))) + (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t))) (defun wfnames-revert-changes (_ignore-auto _no-confirm) "Revert wfnames buffer to its initial state. This is used as `revert-buffer-function' for `wfnames-mode'." (with-current-buffer wfnames-buffer - (cl-loop for o in (overlays-in (point-min) (point-max)) - when (overlay-get o 'hff-changed) - do (delete-overlay o)) + (dolist (o (overlays-in (point-min) (point-max))) + (when (overlay-get o 'hff-changed) + (delete-overlay o))) (goto-char (point-min)) (save-excursion (while (not (eobp)) (wfnames-revert-current-line-1))) - (while (re-search-forward "/" (line-end-position) t)))) + (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t))) + (provide 'wfnames) --=-=-= Content-Type: text/plain > Thanks. --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Thierry Volpiatt
Date: Tue, 08 Aug 2023 04:33
Date: Tue, 08 Aug 2023 04:33
333 lines
11375 bytes
11375 bytes
--=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Hello Philip, Philip Kaludercic <philipk@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> Philip Kaludercic <philipk@posteo.net> writes: >> >>> Thierry Volpiatto <thievol@posteo.net> writes: >>> >>>> I see that Helm installation from nongnu elpa doesn't include >>>> emacs-helm.sh script, would it be possible to modify this? >>>> >>>> diff --git a/elpa-packages b/elpa-packages >>>> index 77d7a5409e..0923724b62 100644 >>>> --- a/elpa-packages >>>> +++ b/elpa-packages >>>> @@ -312,11 +312,11 @@ >>>> :ignored-files "COPYING") >>>>=20=20=20=20=20=20=20=20=20=20 >>>> (helm :url "https://github.com/emacs-helm/helm" >>>> - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" = "helm-core.el" "helm.el" >>>> + :ignored-files ("images" "Makefile" "helm-core.el" "helm.el" >>>> "helm-lib.el" "helm-source.el" "helm-multi-match.el")) >>>>=20=20=20=20=20=20=20=20=20=20 >>>> (helm-core :url "https://github.com/emacs-helm/helm" >>>> - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" = "helm-adaptive.el" >>>> + :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-a= daptive.el" >>>> "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "hel= m-comint.el" >>>> "helm-command.el" "helm-config.el" "helm-dabbrev.el" "hel= m-easymenu.el" >>>> "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "he= lm-eshell.el" >>> >>> There shouldn't be any issue in applying this patch, but could you >>> explain the propose of this script? >> >> It is used specially for reproducing bugs in a clean environment, see it >> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q >> with only Helm loaded, this ensure the bug if one comes from Helm and >> not another package. This is important especially nowaday people are >> using "Emacs distribution" with the world list of packages installed. >> Apart that the script is useful to quickly launch Emacs with helm, one >> can use it from the Helm directory or symlinked to e.g. ~/bin.=20 > > I see. In that case is there any reason you implement this as a shell > script? Well when I wrote the script, packages where not existing and from outside emacs it is actually the only way to run a package isolated. > (It might be interesting to provide something like this for > package.el, to test packages in a generic way.) Yes, this would be interesting, it would be something like this: Emacs -Q M-x <A command that run a package alone, isolated from other packages nuisances> > I am sort of an unofficial co-maintainer, without access to any > server-side infrastructure, but other than that I'm glad to help within > my possibilities. Ok thanks. >> Ok, it's what I thought, so yes it would be nice to install wfnames >> package in Nongnu. >> Here is the link: https://github.com/thierryvolpiatto/wfnames > > Sure, but could you first take a look at these comments, suggestions and > questions I have made while skimming over the source? > > diff --git a/wfnames.el b/wfnames.el > index e5a83b5..a61a18d 100644 > --- a/wfnames.el > +++ b/wfnames.el > @@ -34,20 +34,20 @@ >=20=20 > ;; Usage: > ;; Once in the Wfnames buffer, edit your filenames and hit C-c C-c to > -;; save your changes. You have completion on filenames and directories > +;; save your changes. You have completion on filenames and directories > ;; with TAB but if you are using Iedit package and it is in action use = =3DM-TAB=3D. >=20=20 > ;;; Code: >=20=20 > -(require 'cl-lib) > +(eval-when-compile (require 'cl-lib)) ;you are only using macros, so thi= s should be OK Ok done. =20=20 > ;; Internal. > -(defvar wfnames-buffer "*Wfnames*") > -(defvar wfnames--modified nil) > +(defvar wfnames-buffer "*Wfnames*") ;perhaps `defconst' > +(defvar-local wfnames--modified nil) Ok done. > > (defgroup wfnames nil > "A mode to edit filenames." > - :group 'wfnames) > + :group 'wfnames) ;watch out, this is a recursive group Good catch, done. > (defcustom wfnames-create-parent-directories t > "Create parent directories when non nil." > @@ -57,16 +57,21 @@ > "Ask confirmation when overwriting." > :type 'boolean) >=20=20 > -(defvar wfnames-after-commit-hook nil) > +(defcustom wfnames-after-commit-hook nil > + "Hook to run after `wfnames-commit-buffer'." ;rephrase this Not sure how to rephrase this: "Hook that run after `wfnames-commit-buffer'."? >=20 > + :type 'hook) Othewise defcustom make sense, done. > (defcustom wfnames-after-commit-function #'kill-buffer > "A function to call on `wfnames-buffer' when done." > :type 'function) >=20=20 > (defcustom wfnames-make-backup nil > - "Backup files before overwriting when non nil." > + "Non-nil means files are backed up before overwriting." Ok done. >=20 > :type 'boolean) > > +;; instead of defining new faces and colours, do you think it would be > +;; possible to inherit from existing faces? Apart requiring a package just for the faces no, font-lock family doesn't provide :background faces. > (defface wfnames-modified > '((t :background "LightBlue" :foreground "black")) > "Face used when filename is modified.") > @@ -104,27 +109,27 @@ > "Provide filename completion in wfnames buffer." > (let ((beg (line-beginning-position)) > (end (point))) > + ;; Does it make sense to extend beyond END to allow completing > + ;; file names mid-string? This one for now I don't know, I transformed your comment with a FIXME. >=20 > (list beg end #'completion-file-name-table :exit-function (lambda > (str _status) (when (and (stringp str) (eq (char-after) ?/)) > (delete-char -1)))))) >=20=20 > -(define-derived-mode wfnames-mode > - text-mode "wfnames" > +(define-derived-mode wfnames-mode text-mode "wfnames" > "Major mode to edit filenames. Ok. > Special commands: > \\{wfnames-mode-map}" > (add-hook 'after-change-functions #'wfnames-after-change-hook nil t) > - (make-local-variable 'wfnames--modified) > - (set (make-local-variable 'completion-at-point-functions) #'wfnames-ca= pf) > - (set (make-local-variable 'revert-buffer-function) #'wfnames-revert-ch= anges)) > + (setq-local completion-at-point-functions #'wfnames-capf) > + (setq-local revert-buffer-function #'wfnames-revert-changes)) Yes done. =20=20 > (defun wfnames-abort () > "Quit and kill wfnames buffer." > (interactive) > - (quit-window t)) > + (quit-window t)) ;isn't this `kill-buffer-and-window' Yes, but quit-window is fine as well (I am used to it). =20=20 > (defun wfnames-after-change-hook (beg end _len) > "Put overlay on current line when modified. > @@ -137,9 +142,10 @@ Args BEG and END delimit changes on line." > (eol (line-end-position)) > (old (get-text-property bol 'old-name)) > (new (buffer-substring-no-properties bol eol)) > - ov face) > - (setq face (if (file-exists-p new) > - 'wfnames-modified-exists 'wfnames-modified)) > + (face (if (file-exists-p new) > + 'wfnames-modified-exists > + 'wfnames-modified)) > + ov) Ok. > (setq-local wfnames--modified > (cons old (delete old wfnames--modified))) > (cl-loop for o in (overlays-in bol eol) > @@ -184,10 +190,10 @@ When APPEND is specified, append FILES to existing = `wfnames-buffer'." > "* " > 'face 'wfnames-prefix)) > "\n")) > - (when append (delete-duplicate-lines (point-min) (point-max)))) > + (when append (delete-duplicate-lines (point-min) (point-max)))) ;t= his requires Emacs 24.4 > (unless append > ;; Go to beginning of basename on first line. > - (while (re-search-forward "/" (line-end-position) t)) > + (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t) Ok. > (wfnames-mode) > (funcall display-fn wfnames-buffer)))) > > @@ -202,7 +208,7 @@ When APPEND is specified, append FILES to existing `w= fnames-buffer'." > "Backup FILE." > (when wfnames-make-backup > (with-current-buffer (find-file-noselect file) > - (let ((backup-by-copying t)) > + (let ((backup-by-copying t)) ;why is this bound? isn't this > a user preference? Yes removed. >=20 > (backup-buffer)) (kill-buffer)))) >=20=20 > @@ -252,7 +258,7 @@ When APPEND is specified, append FILES to existing `w= fnames-buffer'." > (let ((basedir (file-name-directory > (directory-file-name = new)))) > (unless (file-directory-p basedir) > - (mkdir basedir 'parents)))) > + (make-directory basedir > 'parents)))) Ok, make sense. > (if (and ow (wfnames-ask-for-overwrite = new)) > ;; Direct overwrite i.e. first loop. > (progn > @@ -300,21 +306,22 @@ With a numeric prefix ARG, revert the ARG next line= s." > (wfnames-revert-current-line-1) > (when (eobp) (forward-line -1)) > (goto-char (line-beginning-position)) > - (while (re-search-forward "/" (line-end-position) t)))) > + (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t))) Ok, same as above. =20=20 > (defun wfnames-revert-changes (_ignore-auto _no-confirm) > "Revert wfnames buffer to its initial state. >=20=20 > This is used as `revert-buffer-function' for `wfnames-mode'." > (with-current-buffer wfnames-buffer > - (cl-loop for o in (overlays-in (point-min) (point-max)) > - when (overlay-get o 'hff-changed) > - do (delete-overlay o)) > + (dolist (o (overlays-in (point-min) (point-max))) > + (when (overlay-get o 'hff-changed) > + (delete-overlay o))) If you want ;-) done. > (goto-char (point-min)) > (save-excursion > (while (not (eobp)) > (wfnames-revert-current-line-1))) > - (while (re-search-forward "/" (line-end-position) t)))) > + (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t))) > + Ok same as above. =20=20 > (provide 'wfnames) >=20=20 > > >> Thanks. Thanks. =2D-=20 Thierry --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTRyqATHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk2BXC/93c6ercbsQrAuMaXJ16uAfhNuk3e+/ m1pyY+7fFjBM5VSnM/UFwMIaotLUaFWK9Myhrtq4k95f3LtiR8fX3gOUfGrknoWO dW88ypmqb+zBQ7whUtSyiXZQ4as6XGLo5DYRQyIa3jbRwunzIXaPSo1XVCigxNVe NU9AezNTFtE/K2wxeCYK01nC2Goq7crRvlmAie8zy3FzmAPXrTEWefeUcQayosMw m+ajQP3+RjFEXWE/3TRYGKR28dyRX6wE320sBftMhITULX+cFCs+bWla817OLUs+ 0qH3b4vwu8LR/FbFZN01SLBkUXQIkh18GR/0ytyFYCFXAZqqKtR7Q13dfH4/VDuB NpYCV+odA0cRjOOKkR4C8GVH2OZaM4qZS8L/Mk8dH/QTlkToE08RJggk5n8eXVTb BzUalRzJ6qmnupdTreQkNyt15wJb4QmxjZisUAoa6dIbtzHGOVMLx+o2ZlBhG95q DiO4B5p6K1WTSiCybrTQMBGBV0rqcppjZko= =PhrU -----END PGP SIGNATURE----- --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Tue, 08 Aug 2023 05:52
Date: Tue, 08 Aug 2023 05:52
372 lines
12396 bytes
12396 bytes
Thierry Volpiatto <thievol@posteo.net> writes: > Hello Philip, > > Philip Kaludercic <philipk@posteo.net> writes: > >> Thierry Volpiatto <thievol@posteo.net> writes: >> >>> Philip Kaludercic <philipk@posteo.net> writes: >>> >>>> Thierry Volpiatto <thievol@posteo.net> writes: >>>> >>>>> I see that Helm installation from nongnu elpa doesn't include >>>>> emacs-helm.sh script, would it be possible to modify this? >>>>> >>>>> diff --git a/elpa-packages b/elpa-packages >>>>> index 77d7a5409e..0923724b62 100644 >>>>> --- a/elpa-packages >>>>> +++ b/elpa-packages >>>>> @@ -312,11 +312,11 @@ >>>>> :ignored-files "COPYING") >>>>> >>>>> (helm :url "https://github.com/emacs-helm/helm" >>>>> - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el" >>>>> + :ignored-files ("images" "Makefile" "helm-core.el" "helm.el" >>>>> "helm-lib.el" "helm-source.el" "helm-multi-match.el")) >>>>> >>>>> (helm-core :url "https://github.com/emacs-helm/helm" >>>>> - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el" >>>>> + :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el" >>>>> "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el" >>>>> "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el" >>>>> "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el" >>>> >>>> There shouldn't be any issue in applying this patch, but could you >>>> explain the propose of this script? >>> >>> It is used specially for reproducing bugs in a clean environment, see it >>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q >>> with only Helm loaded, this ensure the bug if one comes from Helm and >>> not another package. This is important especially nowaday people are >>> using "Emacs distribution" with the world list of packages installed. >>> Apart that the script is useful to quickly launch Emacs with helm, one >>> can use it from the Helm directory or symlinked to e.g. ~/bin. >> >> I see. In that case is there any reason you implement this as a shell >> script? > > Well when I wrote the script, packages where not existing and from > outside emacs it is actually the only way to run a package isolated. > >> (It might be interesting to provide something like this for >> package.el, to test packages in a generic way.) > > Yes, this would be interesting, it would be something like this: > > Emacs -Q > M-x <A command that run a package alone, isolated from other > packages nuisances> I was actually thinking of a command like M-x package-isolate RET foo,bar,baz RET and a new instance of Emacs using -Q is spun up, with all the packages you have listed loaded, and nothing else... Sounds like a fun little weekend project ;^) >> I am sort of an unofficial co-maintainer, without access to any >> server-side infrastructure, but other than that I'm glad to help within >> my possibilities. > > Ok thanks. > >>> Ok, it's what I thought, so yes it would be nice to install wfnames >>> package in Nongnu. >>> Here is the link: https://github.com/thierryvolpiatto/wfnames >> >> Sure, but could you first take a look at these comments, suggestions and >> questions I have made while skimming over the source? >> >> diff --git a/wfnames.el b/wfnames.el >> index e5a83b5..a61a18d 100644 >> --- a/wfnames.el >> +++ b/wfnames.el >> @@ -34,20 +34,20 @@ >> >> ;; Usage: >> ;; Once in the Wfnames buffer, edit your filenames and hit C-c C-c to >> -;; save your changes. You have completion on filenames and directories >> +;; save your changes. You have completion on filenames and directories >> ;; with TAB but if you are using Iedit package and it is in action use =M-TAB=. >> >> ;;; Code: >> >> -(require 'cl-lib) >> +(eval-when-compile (require 'cl-lib)) ;you are only using macros, so this should be OK > > Ok done. > >> ;; Internal. >> -(defvar wfnames-buffer "*Wfnames*") >> -(defvar wfnames--modified nil) >> +(defvar wfnames-buffer "*Wfnames*") ;perhaps `defconst' >> +(defvar-local wfnames--modified nil) > > Ok done. > >> >> (defgroup wfnames nil >> "A mode to edit filenames." >> - :group 'wfnames) >> + :group 'wfnames) ;watch out, this is a recursive group > > Good catch, done. > >> (defcustom wfnames-create-parent-directories t >> "Create parent directories when non nil." >> @@ -57,16 +57,21 @@ >> "Ask confirmation when overwriting." >> :type 'boolean) >> >> -(defvar wfnames-after-commit-hook nil) >> +(defcustom wfnames-after-commit-hook nil >> + "Hook to run after `wfnames-commit-buffer'." ;rephrase this > > Not sure how to rephrase this: > > "Hook that run after `wfnames-commit-buffer'."? If it is OK the way it is, then you can keep it, I just wasn't sure if you would have a more descriptive name for it. >> + :type 'hook) > > Othewise defcustom make sense, done. > >> (defcustom wfnames-after-commit-function #'kill-buffer >> "A function to call on `wfnames-buffer' when done." >> :type 'function) >> >> (defcustom wfnames-make-backup nil >> - "Backup files before overwriting when non nil." >> + "Non-nil means files are backed up before overwriting." > > Ok done. > >> >> :type 'boolean) >> >> +;; instead of defining new faces and colours, do you think it would be >> +;; possible to inherit from existing faces? > > Apart requiring a package just for the faces no, font-lock family > doesn't provide :background faces. I wasn't thinking just of font-lock, you could pick any face, eg. wfnames-modified could inherit from diff-refine-changed. That way themes don't have to add extra support, and the package looks more "native" without any additional effort. >> (defface wfnames-modified >> '((t :background "LightBlue" :foreground "black")) >> "Face used when filename is modified.") >> @@ -104,27 +109,27 @@ >> "Provide filename completion in wfnames buffer." >> (let ((beg (line-beginning-position)) >> (end (point))) >> + ;; Does it make sense to extend beyond END to allow completing >> + ;; file names mid-string? > > This one for now I don't know, I transformed your comment with a FIXME. That is fine, this is just a general thing I wonder about with CAP functions. >> >> (list beg end #'completion-file-name-table :exit-function (lambda >> (str _status) (when (and (stringp str) (eq (char-after) ?/)) >> (delete-char -1)))))) >> >> -(define-derived-mode wfnames-mode >> - text-mode "wfnames" >> +(define-derived-mode wfnames-mode text-mode "wfnames" >> "Major mode to edit filenames. > > Ok. > >> Special commands: >> \\{wfnames-mode-map}" >> (add-hook 'after-change-functions #'wfnames-after-change-hook nil t) >> - (make-local-variable 'wfnames--modified) >> - (set (make-local-variable 'completion-at-point-functions) #'wfnames-capf) >> - (set (make-local-variable 'revert-buffer-function) #'wfnames-revert-changes)) >> + (setq-local completion-at-point-functions #'wfnames-capf) >> + (setq-local revert-buffer-function #'wfnames-revert-changes)) > > Yes done. > >> (defun wfnames-abort () >> "Quit and kill wfnames buffer." >> (interactive) >> - (quit-window t)) >> + (quit-window t)) ;isn't this `kill-buffer-and-window' > > Yes, but quit-window is fine as well (I am used to it). > >> (defun wfnames-after-change-hook (beg end _len) >> "Put overlay on current line when modified. >> @@ -137,9 +142,10 @@ Args BEG and END delimit changes on line." >> (eol (line-end-position)) >> (old (get-text-property bol 'old-name)) >> (new (buffer-substring-no-properties bol eol)) >> - ov face) >> - (setq face (if (file-exists-p new) >> - 'wfnames-modified-exists 'wfnames-modified)) >> + (face (if (file-exists-p new) >> + 'wfnames-modified-exists >> + 'wfnames-modified)) >> + ov) > > Ok. > >> (setq-local wfnames--modified >> (cons old (delete old wfnames--modified))) >> (cl-loop for o in (overlays-in bol eol) >> @@ -184,10 +190,10 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'." >> "* " >> 'face 'wfnames-prefix)) >> "\n")) >> - (when append (delete-duplicate-lines (point-min) (point-max)))) >> + (when append (delete-duplicate-lines (point-min) (point-max)))) ;this requires Emacs 24.4 >> (unless append >> ;; Go to beginning of basename on first line. >> - (while (re-search-forward "/" (line-end-position) t)) >> + (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t) > > Ok. > >> (wfnames-mode) >> (funcall display-fn wfnames-buffer)))) >> >> @@ -202,7 +208,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'." >> "Backup FILE." >> (when wfnames-make-backup >> (with-current-buffer (find-file-noselect file) >> - (let ((backup-by-copying t)) >> + (let ((backup-by-copying t)) ;why is this bound? isn't this >> a user preference? > > Yes removed. > >> >> (backup-buffer)) (kill-buffer)))) >> >> @@ -252,7 +258,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'." >> (let ((basedir (file-name-directory >> (directory-file-name new)))) >> (unless (file-directory-p basedir) >> - (mkdir basedir 'parents)))) >> + (make-directory basedir >> 'parents)))) > > Ok, make sense. > >> (if (and ow (wfnames-ask-for-overwrite new)) >> ;; Direct overwrite i.e. first loop. >> (progn >> @@ -300,21 +306,22 @@ With a numeric prefix ARG, revert the ARG next lines." >> (wfnames-revert-current-line-1) >> (when (eobp) (forward-line -1)) >> (goto-char (line-beginning-position)) >> - (while (re-search-forward "/" (line-end-position) t)))) >> + (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t))) > > Ok, same as above. > >> (defun wfnames-revert-changes (_ignore-auto _no-confirm) >> "Revert wfnames buffer to its initial state. >> >> This is used as `revert-buffer-function' for `wfnames-mode'." >> (with-current-buffer wfnames-buffer >> - (cl-loop for o in (overlays-in (point-min) (point-max)) >> - when (overlay-get o 'hff-changed) >> - do (delete-overlay o)) >> + (dolist (o (overlays-in (point-min) (point-max))) >> + (when (overlay-get o 'hff-changed) >> + (delete-overlay o))) > > If you want ;-) done. I am totally indifferent, they expand to almost the same code anyway: --8<---------------cut here---------------start------------->8--- (disassemble (byte-compile '(cl-loop for o in olist when (foo) do (bar)))) byte code: args: nil 0 varref olist 1 constant nil 2:1 stack-ref 1 3 consp 4 goto-if-nil 3 7 discard 8 dup 9 car 10 constant foo 11 call 0 12 goto-if-nil 2 15 constant bar 16 call 0 17 discard 18:2 stack-ref 1 19 cdr 20 stack-set 2 22 goto 1 25:3 constant nil 26 return (disassemble (byte-compile '(dolist (o olist) (when (foo) (bar))))) byte code: args: nil 0 varref olist 1:1 dup 2 goto-if-nil-else-pop 3 5 dup 6 car 7 discard 8 constant nil 9 constant foo 10 call 0 11 goto-if-nil 2 14 constant bar 15 call 0 16 discard 17:2 discard 18 cdr 19 goto 1 22:3 return --8<---------------cut here---------------end--------------->8--- >> (goto-char (point-min)) >> (save-excursion >> (while (not (eobp)) >> (wfnames-revert-current-line-1))) >> - (while (re-search-forward "/" (line-end-position) t)))) >> + (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t))) >> + > > Ok same as above. > >> (provide 'wfnames) >> >> >> >>> Thanks. > > Thanks. Great, I'll add the package then.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Thierry Volpiatt
Date: Tue, 08 Aug 2023 06:01
Date: Tue, 08 Aug 2023 06:01
55 lines
1913 bytes
1913 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Ok I commited your changes with some corrections from my previous post, see below. Philip Kaludercic <philipk@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> Philip Kaludercic <philipk@posteo.net> writes: > (let ((beg (line-beginning-position)) > (end (point))) > + ;; Does it make sense to extend beyond END to allow completing > + ;; file names mid-string? > (list beg end #'completion-file-name-table > :exit-function (lambda (str _status) > (when (and (stringp str) > (eq (char-after) ?/)) > (delete-char -1)))))) Yes, we want to complete from bol to point: START and END delimit the text to complete (which should enclose point). COLLECTION is a completion table for completing that text, > - (let ((backup-by-copying t)) > + (let ((backup-by-copying t)) ;why is this bound? We want to backup by copying, not renaming, so ensure it is done by copying. -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTR2/ITHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvkx0qC/9KfbgRcd9+OITFJnxggVpA/GFarWQw CtiWY6uaFsmE00gQ8O1tqgg8uahDEWx6r+HiToPByO1cm8THWVKyJa9LuP9sp4YP cOmTv/z6TQHVl8wF6rdYxk0pb/1xym8/DelCN3hk/msYyVK4wBIUsVbgcPiSXId8 Wi0fo2WXMRbFVMEWC43VfC7pCVSgItGRqwz5wZZXxuIId1V+bfeHCpsM61Aleblp aVb2mHaaJsyhlBJo5lkXz3LIo/CBqhlAjAgvnhjadpchssAL5zOSq5jzUS+N9EEI jfjKBV165B5NWGSS2soSFf/8X1OF4O3fmrLRLm1+i2jw5qKu8id+JnjdxJ9zbt53 BuDWJtuhql0d5C9VIRSPg+/Rnz700V5jiE9q2GOCAk4ioRNTdN08CLLzS/E0rTMm Ka/JDBoEYIwsd2Isu4qoI5Tq8dyk+lXYyMW7MtS65gZA407e4nJzb7wPxAbfbLvD bZLpt99O/AHnBIOFJJeZnadWeoJMz6cIfK8=nCPD -----END PGP SIGNATURE----- --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Thierry Volpiatt
Date: Tue, 08 Aug 2023 06:17
Date: Tue, 08 Aug 2023 06:17
167 lines
6018 bytes
6018 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Philip Kaludercic <philipk@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> Hello Philip, >> >> Philip Kaludercic <philipk@posteo.net> writes: >> >>> Thierry Volpiatto <thievol@posteo.net> writes: >>> >>>> Philip Kaludercic <philipk@posteo.net> writes: >>>> >>>>> Thierry Volpiatto <thievol@posteo.net> writes: >>>>> >>>>>> I see that Helm installation from nongnu elpa doesn't include >>>>>> emacs-helm.sh script, would it be possible to modify this? >>>>>> >>>>>> diff --git a/elpa-packages b/elpa-packages >>>>>> index 77d7a5409e..0923724b62 100644 >>>>>> --- a/elpa-packages >>>>>> +++ b/elpa-packages >>>>>> @@ -312,11 +312,11 @@ >>>>>> :ignored-files "COPYING") >>>>>> >>>>>> (helm :url "https://github.com/emacs-helm/helm" >>>>>> - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el" >>>>>> + :ignored-files ("images" "Makefile" "helm-core.el" "helm.el" >>>>>> "helm-lib.el" "helm-source.el" "helm-multi-match.el")) >>>>>> >>>>>> (helm-core :url "https://github.com/emacs-helm/helm" >>>>>> - :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el" >>>>>> + :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el" >>>>>> "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el" >>>>>> "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el" >>>>>> "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el" >>>>> >>>>> There shouldn't be any issue in applying this patch, but could you >>>>> explain the propose of this script? >>>> >>>> It is used specially for reproducing bugs in a clean environment, see it >>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q >>>> with only Helm loaded, this ensure the bug if one comes from Helm and >>>> not another package. This is important especially nowaday people are >>>> using "Emacs distribution" with the world list of packages installed. >>>> Apart that the script is useful to quickly launch Emacs with helm, one >>>> can use it from the Helm directory or symlinked to e.g. ~/bin. >>> >>> I see. In that case is there any reason you implement this as a shell >>> script? >> >> Well when I wrote the script, packages where not existing and from >> outside emacs it is actually the only way to run a package isolated. >> >>> (It might be interesting to provide something like this for >>> package.el, to test packages in a generic way.) >> >> Yes, this would be interesting, it would be something like this: >> >> Emacs -Q >> M-x <A command that run a package alone, isolated from other >> packages nuisances> > > I was actually thinking of a command like > > M-x package-isolate RET foo,bar,baz RET Then you want completion on packages and return a list of packages, you can involve helm without requiring it by using completing-read if helm-mode is enabled otherwise fallback to completing-read-multiple. You will have to let-bound (and declare it on top of your file) helm-comp-read-use-marked. Example from mu4e: (cond ((bound-and-true-p helm-mode) ;; tweaks for "helm"; it's not nice to have to special-case for ;; completion frameworks, but this has been supported for while. ;; basically, with helm, helm-comp-read-use-marked + completing-read ;; is preferred over completing-read-multiple (let ((helm-comp-read-use-marked t)) (completing-read prompt candidates))) (multi (completing-read-multiple prompt candidates)) (t (completing-read prompt candidates))) > and a new instance of Emacs using -Q is spun up, Yes much better. > with all the packages you have listed loaded, and nothing > else... Sounds like a fun little weekend project ;^) Yes, nice. >> Apart requiring a package just for the faces no, font-lock family >> doesn't provide :background faces. > > I wasn't thinking just of font-lock, you could pick any face, > eg. wfnames-modified could inherit from diff-refine-changed. Yes, but I will have to require diff, right? > That way themes don't have to add extra support, and the package looks > more "native" without any additional effort. Of course that would be nice. >>> "Provide filename completion in wfnames buffer." >>> (let ((beg (line-beginning-position)) >>> (end (point))) >>> + ;; Does it make sense to extend beyond END to allow completing >>> + ;; file names mid-string? >> >> This one for now I don't know, I transformed your comment with a FIXME. > > That is fine, this is just a general thing I wonder about with CAP > functions. So yes, as explained in previous post it is what we want, i.e. get the completion of the part of the line from bol to point. > I am totally indifferent, they expand to almost the same code anyway: Yes, I have no problems either to use dolist here. > Great, I'll add the package then. Great thanks! -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTR4eYTHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk1+OC/9VI+upmNCVwpv7n+nVfkz27UguPb7u UfuHF6giuQ2I4v68B5vHMcF5Gpckx58UTV2qECDtETgge2GiqNd1Q7l/DreXxvAm 8vDgHDOvfw0PsGIn51eX0EJw71hQtAjr+ez9VgMuCj+0eQkbu6O7iK8lW1Nal6r/ ppXghYbwq/KvsPpsofH00fRwIDpAUBWBefXGCMU/lF9iaqmDsAGIKYtqmL8WeaXK 0BFBrDEBKOdDBX4wWhgOXRWwe0MQXGS1F/ycwNlPmFRmUPmMm8i5zVosJpQpKuzV UH3ojajsuQaJRbIaICYU//+p9AcA1pKxPCSFhjzyEecrpU11fQutQnCdKVsXlBFn 7cRkbuvjrKwzQ+BNnVYiOxuWMq/BhQu7ZIl16aE6rKQc9upvN/T8jVvrGlYXLXV8 o2aISzQHOEsIV0jeI4ytGMYuI9MyPYaOc2uQNm4t1uBF0S95uvvMRZzzrRac9mpP 7+mLQf0RuK3LDpQe8T79Qd0PWCPYPQLC76g=EwEx -----END PGP SIGNATURE----- --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Michael Albinus
Date: Tue, 08 Aug 2023 08:34
Date: Tue, 08 Aug 2023 08:34
19 lines
594 bytes
594 bytes
Philip Kaludercic <philipk@posteo.net> writes: Hi Philip, >>> Sorry about that, you can always feel free to CC me if you have specific >>> questions that might get lost on the mailing list. I suppose Stefan >>> Monnier wouldn't object to be mentioned either. >> >> Ok thanks, I will next time now I know you and Stefan are in charge of >> this. > > I am sort of an unofficial co-maintainer, without access to any > server-side infrastructure, but other than that I'm glad to help within > my possibilities. Perhaps it is worth to mention this in admin/MAINTAINERS? Best regards, Michael.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Tue, 08 Aug 2023 16:37
Date: Tue, 08 Aug 2023 16:37
23 lines
729 bytes
729 bytes
Michael Albinus <michael.albinus@gmx.de> writes: > Philip Kaludercic <philipk@posteo.net> writes: > > Hi Philip, > >>>> Sorry about that, you can always feel free to CC me if you have specific >>>> questions that might get lost on the mailing list. I suppose Stefan >>>> Monnier wouldn't object to be mentioned either. >>> >>> Ok thanks, I will next time now I know you and Stefan are in charge of >>> this. >> >> I am sort of an unofficial co-maintainer, without access to any >> server-side infrastructure, but other than that I'm glad to help within >> my possibilities. > > Perhaps it is worth to mention this in admin/MAINTAINERS? There seems to be no information on ELPA in admin/MAINTAINERS. > Best regards, Michael.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Michael Albinus
Date: Tue, 08 Aug 2023 18:41
Date: Tue, 08 Aug 2023 18:41
17 lines
465 bytes
465 bytes
Philip Kaludercic <philipk@posteo.net> writes: Hi Philip, >>> I am sort of an unofficial co-maintainer, without access to any >>> server-side infrastructure, but other than that I'm glad to help within >>> my possibilities. >> >> Perhaps it is worth to mention this in admin/MAINTAINERS? > > There seems to be no information on ELPA in admin/MAINTAINERS. Yes, the file is incomplete. So it is time to say something about GNU ELPA, IMHO. Best regards, Michael.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Richard Stallman
Date: Tue, 08 Aug 2023 23:47
Date: Tue, 08 Aug 2023 23:47
24 lines
924 bytes
924 bytes
[[[ To any NSA and FBI agents reading my email: please consider ]]] [[[ whether defending the US Constitution against all enemies, ]]] [[[ foreign or domestic, requires you to follow Snowden's example. ]]] > > When a package is available in Melpa do we have to add it in nongnu as > > well to satisfy dependencies for a package already in nongnu? > Yes, if the dependency is missing someone only using GNU ELPA and NonGNU > ELPA wouldn't be able to install the package due to a missing dependency > and that is obviously not intended. Our policy for Emacs is that we do not refer to MELPA for any reason. That is because MELPA does not follow our policies about promoting only free sofware. -- Dr Richard Stallman (https://stallman.org) Chief GNUisance of the GNU Project (https://gnu.org) Founder, Free Software Foundation (https://fsf.org) Internet Hall-of-Famer (https://internethalloffame.org)
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Wed, 09 Aug 2023 07:06
Date: Wed, 09 Aug 2023 07:06
24 lines
680 bytes
680 bytes
Michael Albinus <michael.albinus@gmx.de> writes: > Philip Kaludercic <philipk@posteo.net> writes: > > Hi Philip, > >>>> I am sort of an unofficial co-maintainer, without access to any >>>> server-side infrastructure, but other than that I'm glad to help within >>>> my possibilities. >>> >>> Perhaps it is worth to mention this in admin/MAINTAINERS? >> >> There seems to be no information on ELPA in admin/MAINTAINERS. > > Yes, the file is incomplete. So it is time to say something about GNU > ELPA, IMHO. In that case I'd like to request access to elpa.gnu.org, and ideally also the list of users who have signed the CA. I've CC'ed Eli and Stefan. > Best regards, Michael.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Wed, 09 Aug 2023 14:53
Date: Wed, 09 Aug 2023 14:53
31 lines
1026 bytes
1026 bytes
Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: emacs-devel@gnu.org, "'Eli Zaretskii'" <eliz@gnu.org>, Stefan Monnier >> <monnier@iro.umontreal.ca> >> Date: Wed, 09 Aug 2023 07:06:30 +0000 >> >> >>> Perhaps it is worth to mention this in admin/MAINTAINERS? >> >> >> >> There seems to be no information on ELPA in admin/MAINTAINERS. >> > >> > Yes, the file is incomplete. So it is time to say something about GNU >> > ELPA, IMHO. >> >> In that case I'd like to request access to elpa.gnu.org > > You mean you cannot access it now? I can access it as a user, but I cannot access it to fix something. >> and ideally also the list of users who have signed the CA. > > No can do, for privacy reasons. You can always ask me or Stefan to > check a name for you, though. OK, but most of the time I don't have to check a single user but would like to see check a set of names to see how many have or haven't signed the CA. Is that still a manageable effort on your end? > Thanks.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Eli Zaretskii
Date: Wed, 09 Aug 2023 14:53
Date: Wed, 09 Aug 2023 14:53
23 lines
695 bytes
695 bytes
> From: Philip Kaludercic <philipk@posteo.net> > Cc: emacs-devel@gnu.org, "'Eli Zaretskii'" <eliz@gnu.org>, Stefan Monnier > <monnier@iro.umontreal.ca> > Date: Wed, 09 Aug 2023 07:06:30 +0000 > > >>> Perhaps it is worth to mention this in admin/MAINTAINERS? > >> > >> There seems to be no information on ELPA in admin/MAINTAINERS. > > > > Yes, the file is incomplete. So it is time to say something about GNU > > ELPA, IMHO. > > In that case I'd like to request access to elpa.gnu.org You mean you cannot access it now? > and ideally also the list of users who have signed the CA. No can do, for privacy reasons. You can always ask me or Stefan to check a name for you, though. Thanks.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Wed, 09 Aug 2023 15:24
Date: Wed, 09 Aug 2023 15:24
34 lines
1164 bytes
1164 bytes
Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: michael.albinus@gmx.de, emacs-devel@gnu.org, monnier@iro.umontreal.ca >> Date: Wed, 09 Aug 2023 14:53:12 +0000 >> >> Eli Zaretskii <eliz@gnu.org> writes: >> >> >> In that case I'd like to request access to elpa.gnu.org >> > >> > You mean you cannot access it now? >> >> I can access it as a user, but I cannot access it to fix something. > > Maybe I'm misremembering, but AFAIR if you have write access to the > Emacs Git repository, you also have write access to the ELPA Git > repository. No I have access to emacs.git, elpa.git and nongnu.git, what I was referent to was the server associated with elpa.gnu.org. >> >> and ideally also the list of users who have signed the CA. >> > >> > No can do, for privacy reasons. You can always ask me or Stefan to >> > check a name for you, though. >> >> OK, but most of the time I don't have to check a single user but would >> like to see check a set of names to see how many have or haven't signed >> the CA. Is that still a manageable effort on your end? > > Yes, feel free. OK, thank you for the clarification.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Eli Zaretskii
Date: Wed, 09 Aug 2023 17:55
Date: Wed, 09 Aug 2023 17:55
27 lines
934 bytes
934 bytes
> From: Philip Kaludercic <philipk@posteo.net> > Cc: michael.albinus@gmx.de, emacs-devel@gnu.org, monnier@iro.umontreal.ca > Date: Wed, 09 Aug 2023 14:53:12 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > >> In that case I'd like to request access to elpa.gnu.org > > > > You mean you cannot access it now? > > I can access it as a user, but I cannot access it to fix something. Maybe I'm misremembering, but AFAIR if you have write access to the Emacs Git repository, you also have write access to the ELPA Git repository. > >> and ideally also the list of users who have signed the CA. > > > > No can do, for privacy reasons. You can always ask me or Stefan to > > check a name for you, though. > > OK, but most of the time I don't have to check a single user but would > like to see check a set of names to see how many have or haven't signed > the CA. Is that still a manageable effort on your end? Yes, feel free.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Eli Zaretskii
Date: Wed, 09 Aug 2023 19:23
Date: Wed, 09 Aug 2023 19:23
16 lines
572 bytes
572 bytes
> From: Philip Kaludercic <philipk@posteo.net> > Cc: michael.albinus@gmx.de, emacs-devel@gnu.org, monnier@iro.umontreal.ca > Date: Wed, 09 Aug 2023 15:24:30 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > > Maybe I'm misremembering, but AFAIR if you have write access to the > > Emacs Git repository, you also have write access to the ELPA Git > > repository. > > No I have access to emacs.git, elpa.git and nongnu.git, what I was > referent to was the server associated with elpa.gnu.org. Oh, you mean the server itself? Then I think only Stefan can help you.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Tue, 15 Aug 2023 16:55
Date: Tue, 15 Aug 2023 16:55
192 lines
7182 bytes
7182 bytes
--=-=-= Content-Type: text/plain Philip Kaludercic <philipk@posteo.net> writes: >>>> It is used specially for reproducing bugs in a clean environment, see it >>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q >>>> with only Helm loaded, this ensure the bug if one comes from Helm and >>>> not another package. This is important especially nowaday people are >>>> using "Emacs distribution" with the world list of packages installed. >>>> Apart that the script is useful to quickly launch Emacs with helm, one >>>> can use it from the Helm directory or symlinked to e.g. ~/bin. >>> >>> I see. In that case is there any reason you implement this as a shell >>> script? >> >> Well when I wrote the script, packages where not existing and from >> outside emacs it is actually the only way to run a package isolated. >> >>> (It might be interesting to provide something like this for >>> package.el, to test packages in a generic way.) >> >> Yes, this would be interesting, it would be something like this: >> >> Emacs -Q >> M-x <A command that run a package alone, isolated from other >> packages nuisances> > > I was actually thinking of a command like > > M-x package-isolate RET foo,bar,baz RET > > and a new instance of Emacs using -Q is spun up, with all the packages > you have listed loaded, and nothing else... Sounds like a fun little > weekend project ;^) Here is my first attempt at providing this kind of a command. Any comments? --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0002-Add-command-to-start-Emacs-with-specific-packages.patch From ae254f69f789ab4fa2b83bcf2cdc64291ae8aff6 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic <philipk@posteo.net> Date: Tue, 15 Aug 2023 18:39:14 +0200 Subject: [PATCH 2/2] Add command to start Emacs with specific packages * lisp/emacs-lisp/package.el (package-isolate): Add command. * etc/NEWS: Announce it. --- etc/NEWS | 6 +++++ lisp/emacs-lisp/package.el | 50 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 57f04609679..c374695a571 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project' When non-nil, package specifications with side-effects for building software will be used when building a package. +--- +*** New command to start Emacs only with specific packages +The command 'package-isolate' is equivalent to starting Emacs with the +-Q flag and loading specific packages (and their dependencies) +manually. + ** Flymake +++ diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index b3062d2608b..c0bbdacec84 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2625,6 +2625,56 @@ package-autoremove removable)) (message "Nothing to autoremove"))))) +(defun package-isolate (packages) + "Start a new instance of Emacs and load only PACKAGES." + (interactive + (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p)) + unless (package-built-in-p p) + collect (cons (package-desc-full-name p) p) into table + finally return + (list (cl-loop for c in (completing-read-multiple + "Isolate packages: " table + nil t) + collect (alist-get c table nil nil #'string=)) + current-prefix-arg))) + (cl-assert (cl-every #'package-desc-p packages)) + (let* ((name (concat "package-isolate-" (mapconcat #'package-desc-full-name + packages ","))) + (tmp-init (make-temp-file name t)) + (elpa (expand-file-name "elpa" tmp-init)) + args) + (make-directory elpa) + (dolist (package packages) + ;; We need to recursively expand all the dependencies of the + ;; requested packages and all of them to `load-path'. + (dolist (package (named-let loop ((pkg-desc package)) + (let (deps) + (dolist (req (package-desc-reqs pkg-desc)) + (setq deps (nconc + (catch 'found + (dolist (p (apply #'append (mapcar #'cdr (package--alist)))) + (when (and (string= (car req) (package-desc-name p)) + (version-list-<= (cadr req) (package-desc-version p))) + (throw 'found (loop p))))) + deps))) + (cons pkg-desc deps)))) + (let* ((real (package-desc-dir package)) + (link (expand-file-name (file-name-nondirectory real) elpa))) + (make-symbolic-link real link t) + (push (format "--directory=%s" link) args)) + (let* ((load-suffixes '(".el" ".elc")) + (autoload (locate-library (package--autoloads-file-name package)))) + (push (format "--load=%s" autoload) args)))) + (apply #'start-process (concat "*" name "*") nil + (append (list (or (emacs-executable) "emacs") + (format "--eval=%S" + '(progn + (require 'warnings) + (add-to-list 'warning-suppress-log-types 'initialization))) + "--quick" "--debug-init" + "--init-directory" tmp-init) + args)))) + ;;;; Package description buffer. -- 2.39.2 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Add-a-function-to-query-the-Emacs-executable.patch From bc9ee566cb9fee337f94870aa718d9b5e57c007b Mon Sep 17 00:00:00 2001 From: Philip Kaludercic <philipk@posteo.net> Date: Tue, 15 Aug 2023 18:37:59 +0200 Subject: [PATCH 1/2] Add a function to query the Emacs executable * src/emacs.c (Femacs_executable): Add new function. (syms_of_emacs): Announce it. --- src/emacs.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/emacs.c b/src/emacs.c index 687b8c7f81f..4869093ce09 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -3039,6 +3039,18 @@ DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 2, "P", exit (exit_code); } +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "", + doc: /* Return a string with the file name of the Emacs executable. +If this is not known, nil will be returned instead. */) + (void) +{ + static Lisp_Object *string; + if (string) + return string; + if (initial_emacs_executable) + return string = build_string(initial_emacs_executable); + return Qnil; +} /* Perform an orderly shutdown of Emacs. Autosave any modified buffers, kill any child processes, clean up the terminal modes (if @@ -3566,6 +3578,7 @@ syms_of_emacs (void) #endif defsubr (&Skill_emacs); + defsubr (&Semacs_executable); defsubr (&Sinvocation_name); defsubr (&Sinvocation_directory); -- 2.39.2 --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Eshel Yaron
Date: Tue, 15 Aug 2023 19:34
Date: Tue, 15 Aug 2023 19:34
50 lines
1632 bytes
1632 bytes
Hi Philip, Philip Kaludercic <philipk@posteo.net> writes: > Here is my first attempt at providing this kind of a command. Any > comments? I haven't followed the thread very closely, but this looks quite useful! A few minor suggestions: > diff --git a/etc/NEWS b/etc/NEWS > index 57f04609679..c374695a571 100644 > --- a/etc/NEWS > +++ b/etc/NEWS > @@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project' > When non-nil, package specifications with side-effects for building > software will be used when building a package. > > +--- > +*** New command to start Emacs only with specific packages This should probably end with a period. > +The command 'package-isolate' is equivalent to starting Emacs with the > +-Q flag and loading specific packages (and their dependencies) > +manually. I'd rephrase this as: "The command 'package-isolate' starts a new Emacs instance with minimum customizations (similar to 'emacs -Q') and a given set of packages (with their dependencies)." > +(defun package-isolate (packages) > + "Start a new instance of Emacs and load only PACKAGES." I'd clarify that the new instance disregards the user's config/customizations, how about "Start a new Emacs instance with minimum customizations and load PACKAGES." > +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "", > + doc: /* Return a string with the file name of the Emacs executable. > +If this is not known, nil will be returned instead. */) Maybe say "Return the file name of the Emacs executable, or nil if unknown." to steer clear of the passive voice. Best, Eshel
Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Tue, 15 Aug 2023 19:39
Date: Tue, 15 Aug 2023 19:39
58 lines
1995 bytes
1995 bytes
Eshel Yaron <me@eshelyaron.com> writes: > Hi Philip, > > Philip Kaludercic <philipk@posteo.net> writes: > >> Here is my first attempt at providing this kind of a command. Any >> comments? > > I haven't followed the thread very closely, but this looks quite useful! > A few minor suggestions: This is mostly a tangent, so the previous discussion is not that relevant. I've changed the subject accordingly. >> diff --git a/etc/NEWS b/etc/NEWS >> index 57f04609679..c374695a571 100644 >> --- a/etc/NEWS >> +++ b/etc/NEWS >> @@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project' >> When non-nil, package specifications with side-effects for building >> software will be used when building a package. >> >> +--- >> +*** New command to start Emacs only with specific packages > > This should probably end with a period. > >> +The command 'package-isolate' is equivalent to starting Emacs with the >> +-Q flag and loading specific packages (and their dependencies) >> +manually. > > I'd rephrase this as: "The command 'package-isolate' starts a new Emacs > instance with minimum customizations (similar to 'emacs -Q') and a given > set of packages (with their dependencies)." > >> +(defun package-isolate (packages) >> + "Start a new instance of Emacs and load only PACKAGES." > > I'd clarify that the new instance disregards the user's > config/customizations, how about "Start a new Emacs instance with > minimum customizations and load PACKAGES." > >> +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "", >> + doc: /* Return a string with the file name of the Emacs executable. >> +If this is not known, nil will be returned instead. */) > > Maybe say "Return the file name of the Emacs executable, or nil if > unknown." to steer clear of the passive voice. Thanks, I obviously cannot write documentation. I've addressed the changes locally, and will send an updated patch in response to Eli's message. > Best, > > Eshel
Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Tue, 15 Aug 2023 19:52
Date: Tue, 15 Aug 2023 19:52
160 lines
6490 bytes
6490 bytes
--=-=-= Content-Type: text/plain Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: emacs-devel@gnu.org >> Date: Tue, 15 Aug 2023 16:55:03 +0000 >> >> +*** New command to start Emacs only with specific packages >> +The command 'package-isolate' is equivalent to starting Emacs with the >> +-Q flag and loading specific packages (and their dependencies) >> +manually. > > Seems strange to me to have a command to start another Emacs. Why not > implement this as a command-line option instead? That would be > consistent with the several options we already have, like -q, -Q, -D, > which already contrl what happens at startup. Mainly because this wouldn't support a completing-read interface, that simplifies prompting the user for a set of packages. But perhaps the bulk of this command could be implemented as a CLI option, that this command could wrap? >> + (let* ((real (package-desc-dir package)) >> + (link (expand-file-name (file-name-nondirectory real) elpa))) >> + (make-symbolic-link real link t) > > Using symbolic links makes the program less portable, so it is best to > avoid them. The reason I used them here, instead of just adding the directories under ~/.config/emacs/elpa/ is that startup.el issues a warning along the lines of Your `load-path' seems to contain your `user-emacs-directory' ... My previous patch actually included the code that suppresses all warnings during initialisation, so I've removed this hack. >> + (apply #'start-process (concat "*" name "*") nil >> + (append (list (or (emacs-executable) "emacs") > > I don't think it's a good idea to invoke just "emacs", it could be a > completely different version of Emacs. > >> +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "", >> + doc: /* Return a string with the file name of the Emacs executable. >> +If this is not known, nil will be returned instead. */) >> + (void) > > I don't understand why you need this primitive. What's wrong with the > usual paradigm we use everywhere else: > > (expand-file-name invocation-name invocation-directory) Because I failed to remember it. This also appears to not have the risk of returning nil, as my proposed command could have. I've applies these and related changes below: --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Add-command-to-start-Emacs-with-specific-packages.patch From 47dde2be5732ec9dfa153813649e385e0227751e Mon Sep 17 00:00:00 2001 From: Philip Kaludercic <philipk@posteo.net> Date: Tue, 15 Aug 2023 18:39:14 +0200 Subject: [PATCH] Add command to start Emacs with specific packages * lisp/emacs-lisp/package.el (package-isolate): Add command. * etc/NEWS: Announce it. --- etc/NEWS | 6 +++++ lisp/emacs-lisp/package.el | 47 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 57f04609679..c374695a571 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project' When non-nil, package specifications with side-effects for building software will be used when building a package. +--- +*** New command to start Emacs only with specific packages +The command 'package-isolate' is equivalent to starting Emacs with the +-Q flag and loading specific packages (and their dependencies) +manually. + ** Flymake +++ diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index b3062d2608b..838b2823466 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2625,6 +2625,53 @@ package-autoremove removable)) (message "Nothing to autoremove"))))) +(defun package-isolate (packages) + "Start an uncustomised Emacs and only load a set of PACKAGES." + (interactive + (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p)) + unless (package-built-in-p p) + collect (cons (package-desc-full-name p) p) into table + finally return + (list (cl-loop for c in (completing-read-multiple + "Isolate packages: " table + nil t) + collect (alist-get c table nil nil #'string=))))) + (cl-assert (cl-every #'package-desc-p packages)) + (let* ((name (concat "package-isolate-" (mapconcat #'package-desc-full-name + packages ","))) + (tmp-init (make-temp-file name t)) + (elpa (expand-file-name "elpa" tmp-init)) + args) + (make-directory elpa) + (dolist (package packages) + ;; We need to recursively expand all the dependencies of the + ;; requested packages and all of them to `load-path'. + (dolist (package (named-let loop ((pkg-desc package)) + (let (deps) + (dolist (req (package-desc-reqs pkg-desc)) + (setq deps (nconc + (catch 'found + (dolist (p (apply #'append (mapcar #'cdr (package--alist)))) + (when (and (string= (car req) (package-desc-name p)) + (version-list-<= (cadr req) (package-desc-version p))) + (throw 'found (loop p))))) + deps))) + (cons pkg-desc deps)))) + (push (format "--directory=%s" (package-desc-dir package)) args) + (let* ((load-suffixes '(".el" ".elc")) + (autoload (locate-library (package--autoloads-file-name package)))) + (push (format "--load=%s" autoload) args)))) + (apply #'start-process (concat "*" name "*") nil + (append (list (expand-file-name invocation-name invocation-directory) + "--quick" "--debug-init" + (format "--eval=%S" + '(progn + (require 'warnings) + (add-to-list 'warning-suppress-log-types 'initialization))) + "--init-directory" tmp-init) + args)) + (message "Started Emacs with the init directory: %s" tmp-init))) + ;;;; Package description buffer. -- 2.39.2 --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Eli Zaretskii
Date: Tue, 15 Aug 2023 21:56
Date: Tue, 15 Aug 2023 21:56
37 lines
1471 bytes
1471 bytes
> From: Philip Kaludercic <philipk@posteo.net> > Cc: emacs-devel@gnu.org > Date: Tue, 15 Aug 2023 16:55:03 +0000 > > +*** New command to start Emacs only with specific packages > +The command 'package-isolate' is equivalent to starting Emacs with the > +-Q flag and loading specific packages (and their dependencies) > +manually. Seems strange to me to have a command to start another Emacs. Why not implement this as a command-line option instead? That would be consistent with the several options we already have, like -q, -Q, -D, which already contrl what happens at startup. > + (let* ((real (package-desc-dir package)) > + (link (expand-file-name (file-name-nondirectory real) elpa))) > + (make-symbolic-link real link t) Using symbolic links makes the program less portable, so it is best to avoid them. > + (apply #'start-process (concat "*" name "*") nil > + (append (list (or (emacs-executable) "emacs") I don't think it's a good idea to invoke just "emacs", it could be a completely different version of Emacs. > +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "", > + doc: /* Return a string with the file name of the Emacs executable. > +If this is not known, nil will be returned instead. */) > + (void) I don't understand why you need this primitive. What's wrong with the usual paradigm we use everywhere else: (expand-file-name invocation-name invocation-directory)
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Thierry Volpiatt
Date: Wed, 16 Aug 2023 06:51
Date: Wed, 16 Aug 2023 06:51
106 lines
4079 bytes
4079 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Philip Kaludercic <philipk@posteo.net> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >>>>> It is used specially for reproducing bugs in a clean environment, see it >>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q >>>>> with only Helm loaded, this ensure the bug if one comes from Helm and >>>>> not another package. This is important especially nowaday people are >>>>> using "Emacs distribution" with the world list of packages installed. >>>>> Apart that the script is useful to quickly launch Emacs with helm, one >>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. >>>> >>>> I see. In that case is there any reason you implement this as a shell >>>> script? >>> >>> Well when I wrote the script, packages where not existing and from >>> outside emacs it is actually the only way to run a package isolated. >>> >>>> (It might be interesting to provide something like this for >>>> package.el, to test packages in a generic way.) >>> >>> Yes, this would be interesting, it would be something like this: >>> >>> Emacs -Q >>> M-x <A command that run a package alone, isolated from other >>> packages nuisances> >> >> I was actually thinking of a command like >> >> M-x package-isolate RET foo,bar,baz RET >> >> and a new instance of Emacs using -Q is spun up, with all the packages >> you have listed loaded, and nothing else... Sounds like a fun little >> weekend project ;^) > > Here is my first attempt at providing this kind of a command. Any > comments? Why not reusing package.el functions? Why do you want to start in an isolated elpa directory? Isn't something like this suffice? (just missing to fallback to CRM when helm is not available) (defun package-isolate (packages) "Start an uncustomised Emacs and only load a set of PACKAGES." (interactive (list (let ((helm-comp-read-use-marked t)) (completing-read "Packages: " (mapcar #'car (package--alist)))))) (let* ((name (concat "package-isolate-" (mapconcat #'identity packages ","))) (deps (cl-loop for p in packages for sym = (intern p) append (package--dependencies sym)))) (apply #'start-process (concat "*" name "*") nil (list (file-truename (expand-file-name invocation-name invocation-directory)) "--quick" "--debug-init" (format "--eval=%S" `(progn (require 'warnings) (add-to-list 'warning-suppress-log-types 'initialization) (require 'package) (setq package-load-list ',(append (mapcar (lambda (p) (list (intern p) t)) packages) (mapcar (lambda (p) (list p t)) deps))) (package-initialize))))))) > [2. text/x-diff; 0002-Add-command-to-start-Emacs-with-specific-packages.patch]... > > [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]... -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTccvATHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk1ygDACQjOkhf/kbIQqywOFimox8EeTue3xD PbQrnPWhcVPq803EYsvKlvAzaGOxR573DwHAvMHYVcocAh+GCBsGLli9bPqM/jVz eNMl42Smf4tjiz4jInzTL3O9Uc+FezmJPl8kQ2NceD4IdztO9EbAYiKSztllD1II /20MhQunhoJndvEyeX0iJta4Q7LyB+dixbKprMT0AYw1swOtMcAPOrsYWsv7HVzV Q3W+VW/JrPi420mhpPCqvYOJVdU/Ep+vJ+u+mCGT/uISQo9fjjeODLVH8+YXj/6V 0lcX5NuWuoC025g7OSHPtUcinhKc9HLXzDZhyrR/REq3I1t/GwmxpBwrwPP8zRvh HgSzH7JQJjKgj2t7VkECgq1BTReXpufdRZ684a4q6Ww4kl6xCWs9uagqUmE/TPGi cJj8xw6TUUWrZJ99jQ1H2YNMtpd0zwdv5u9j7E998k8wjfZ3MhD7Ty2s5HCQpqLe Q6CTG9X1vJ25H5PkHfj+8eCFuOoE1oJo3tY=yVjR -----END PGP SIGNATURE----- --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 10:10
Date: Wed, 16 Aug 2023 10:10
238 lines
10586 bytes
10586 bytes
--=-=-= Content-Type: text/plain Thierry Volpiatto <thievol@posteo.net> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >> Philip Kaludercic <philipk@posteo.net> writes: >> >>>>>> It is used specially for reproducing bugs in a clean environment, see it >>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q >>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and >>>>>> not another package. This is important especially nowaday people are >>>>>> using "Emacs distribution" with the world list of packages installed. >>>>>> Apart that the script is useful to quickly launch Emacs with helm, one >>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. >>>>> >>>>> I see. In that case is there any reason you implement this as a shell >>>>> script? >>>> >>>> Well when I wrote the script, packages where not existing and from >>>> outside emacs it is actually the only way to run a package isolated. >>>> >>>>> (It might be interesting to provide something like this for >>>>> package.el, to test packages in a generic way.) >>>> >>>> Yes, this would be interesting, it would be something like this: >>>> >>>> Emacs -Q >>>> M-x <A command that run a package alone, isolated from other >>>> packages nuisances> >>> >>> I was actually thinking of a command like >>> >>> M-x package-isolate RET foo,bar,baz RET >>> >>> and a new instance of Emacs using -Q is spun up, with all the packages >>> you have listed loaded, and nothing else... Sounds like a fun little >>> weekend project ;^) >> >> Here is my first attempt at providing this kind of a command. Any >> comments? > > Why not reusing package.el functions? > Why do you want to start in an isolated elpa directory? > Isn't something like this suffice? (just missing to fallback to CRM when > helm is not available) I don't know much about Helm, but does it not support CRM? > (defun package-isolate (packages) > "Start an uncustomised Emacs and only load a set of PACKAGES." > (interactive > (list (let ((helm-comp-read-use-marked t)) > (completing-read "Packages: " (mapcar #'car (package--alist)))))) This doesn't allow selecting specific package versions, in case multiple are installed (which might easily happen if you use package-vc). I stole the code in my patch from package-delete, and I guess it would be possible to generalise it into a utility function. > (let* ((name (concat "package-isolate-" (mapconcat #'identity > packages ","))) This doesn't work, because the above returns a string, not a list of strings. > (deps (cl-loop for p in packages > for sym = (intern p) > append (package--dependencies sym)))) > (apply #'start-process (concat "*" name "*") nil > (list (file-truename (expand-file-name invocation-name invocation-directory)) > "--quick" "--debug-init" > (format "--eval=%S" > `(progn > (require 'warnings) > (add-to-list 'warning-suppress-log-types 'initialization) > (require 'package) > (setq package-load-list > ',(append (mapcar (lambda (p) (list (intern p) t)) packages) > (mapcar (lambda (p) (list p t)) deps))) > (package-initialize))))))) This is actually a good idea, assuming there are no issues with lexical scoping that might arise from --eval. I didn't think of using package-load-list here, but it seems that this only works if we don't add --init-directory, because otherwise the elpa/ directory is not populated. It seems to me, that for a proper isolated environment, we should add a --init-directory option. This is easy to fix though, we just need to specify `package-user-dir' at startup. Here is my updated patch, merging our approaches: --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Add-command-to-start-Emacs-with-specific-packages.patch From 6ae48d6d28112d487ea09ca905814da47c2a26cf Mon Sep 17 00:00:00 2001 From: Philip Kaludercic <philipk@posteo.net> Date: Tue, 15 Aug 2023 18:39:14 +0200 Subject: [PATCH] Add command to start Emacs with specific packages * lisp/emacs-lisp/package.el (package--dependencies): Extend function to handle and return package descriptors. (package-isolate): Add new command. * etc/NEWS: Announce new command. --- etc/NEWS | 6 ++++ lisp/emacs-lisp/package.el | 57 ++++++++++++++++++++++++++++++++++---- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 57f04609679..c374695a571 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project' When non-nil, package specifications with side-effects for building software will be used when building a package. +--- +*** New command to start Emacs only with specific packages +The command 'package-isolate' is equivalent to starting Emacs with the +-Q flag and loading specific packages (and their dependencies) +manually. + ** Flymake +++ diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index b3062d2608b..9e969ce1024 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2330,12 +2330,26 @@ package-upgrade-all (mapc #'package-upgrade upgradeable)))) (defun package--dependencies (pkg) - "Return a list of all dependencies PKG has. -This is done recursively." - ;; Can we have circular dependencies? Assume "nope". - (when-let* ((desc (cadr (assq pkg package-archive-contents))) - (deps (mapcar #'car (package-desc-reqs desc)))) - (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps))))) + "Return a list of all recursive dependencies of PKG. +If PKG is a package descriptor, the return value will consist of +a list of package descriptors. If PKG is a symbol, designating a +package, the return value will be a list of symbols designating +packages." + (when-let* ((desc (if (package-desc-p pkg) pkg + (cadr (assq pkg package-archive-contents))))) + ;; Can we have circular dependencies? Assume "nope". + (let ((all (named-let more ((pkg-desc desc)) + (let (deps) + (dolist (req (package-desc-reqs pkg-desc)) + (setq deps (nconc + (catch 'found + (dolist (p (apply #'append (mapcar #'cdr (package--alist)))) + (when (and (string= (car req) (package-desc-name p)) + (version-list-<= (cadr req) (package-desc-version p))) + (throw 'found (more p))))) + deps))) + (delete-dups (cons pkg-desc deps)))))) + (remq pkg (mapcar (if (package-desc-p pkg) #'identity #'package-desc-name) all))))) (defun package-strip-rcs-id (str) "Strip RCS version ID from the version string STR. @@ -2625,6 +2639,37 @@ package-autoremove removable)) (message "Nothing to autoremove"))))) +(defun package-isolate (packages) + "Start an uncustomised Emacs and only load a set of PACKAGES." + (interactive + (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p)) + unless (package-built-in-p p) + collect (cons (package-desc-full-name p) p) into table + finally return + (list (cl-loop for c in (completing-read-multiple + "Isolate packages: " table + nil t) + collect (alist-get c table nil nil #'string=))))) + (let* ((name (concat "package-isolate-" + (mapconcat #'package-desc-full-name packages ","))) + package-load-list) + (dolist (package (append packages (mapcan #'package--dependencies packages))) + (push (list (package-desc-name package) + (package-version-join (package-desc-version package))) + package-load-list)) + (apply #'start-process (concat "*" name "*") nil + (list (expand-file-name invocation-name invocation-directory) + "--quick" "--debug-init" + "--init-directory" (make-temp-file name t) + (format "--eval=%S" + `(progn + (require 'warnings) + (add-to-list 'warning-suppress-log-types 'initialization) + (require 'package) + (setq package-user-dir ,(expand-file-name package-user-dir) + package-load-list ',package-load-list) + (package-initialize))))))) + ;;;; Package description buffer. -- 2.39.2 --=-=-= Content-Type: text/plain >> [2. text/x-diff; 0002-Add-command-to-start-Emacs-with-specific-packages.patch]... >> >> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]... I have slightly modified your version, fixing issues I had, in case anyone else wants to try it out: (defun package-isolate (packages) "Start an uncustomised Emacs and only load a set of PACKAGES." (interactive (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist)))))) (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ","))) (deps (mapcan #'package--dependencies packages))) (apply #'start-process (concat "*" name "*") nil (list (file-truename (expand-file-name invocation-name invocation-directory)) "--quick" "--debug-init" (format "--eval=%S" `(progn (require 'warnings) (add-to-list 'warning-suppress-log-types 'initialization) (require 'package) (setq package-load-list ',(mapcar (lambda (p) (list p t)) (append packages deps))) (package-initialize))))))) --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Thierry Volpiatt
Date: Wed, 16 Aug 2023 10:14
Date: Wed, 16 Aug 2023 10:14
182 lines
7038 bytes
7038 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Philip Kaludercic <philipk@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> Philip Kaludercic <philipk@posteo.net> writes: >> >>> Philip Kaludercic <philipk@posteo.net> writes: >>> >>>>>>> It is used specially for reproducing bugs in a clean environment, see it >>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q >>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and >>>>>>> not another package. This is important especially nowaday people are >>>>>>> using "Emacs distribution" with the world list of packages installed. >>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one >>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. >>>>>> >>>>>> I see. In that case is there any reason you implement this as a shell >>>>>> script? >>>>> >>>>> Well when I wrote the script, packages where not existing and from >>>>> outside emacs it is actually the only way to run a package isolated. >>>>> >>>>>> (It might be interesting to provide something like this for >>>>>> package.el, to test packages in a generic way.) >>>>> >>>>> Yes, this would be interesting, it would be something like this: >>>>> >>>>> Emacs -Q >>>>> M-x <A command that run a package alone, isolated from other >>>>> packages nuisances> >>>> >>>> I was actually thinking of a command like >>>> >>>> M-x package-isolate RET foo,bar,baz RET >>>> >>>> and a new instance of Emacs using -Q is spun up, with all the packages >>>> you have listed loaded, and nothing else... Sounds like a fun little >>>> weekend project ;^) >>> >>> Here is my first attempt at providing this kind of a command. Any >>> comments? >> >> Why not reusing package.el functions? >> Why do you want to start in an isolated elpa directory? >> Isn't something like this suffice? (just missing to fallback to CRM when >> helm is not available) > > I don't know much about Helm, but does it not support CRM? It does, but this is a much better interface than CRM. >> (defun package-isolate (packages) >> "Start an uncustomised Emacs and only load a set of PACKAGES." >> (interactive >> (list (let ((helm-comp-read-use-marked t)) >> (completing-read "Packages: " (mapcar #'car (package--alist)))))) > > This doesn't allow selecting specific package versions, in case multiple > are installed (which might easily happen if you use package-vc). I > stole the code in my patch from package-delete, and I guess it would be > possible to generalise it into a utility function. Ok, I don't know much how package-vc works. >> (let* ((name (concat "package-isolate-" (mapconcat #'identity >> packages ","))) > > This doesn't work, because the above returns a string, not a list of strings. No, it works, the above returns a list of strings (the completing-read allows marking and returns always a list). >> (deps (cl-loop for p in packages >> for sym = (intern p) >> append (package--dependencies sym)))) >> (apply #'start-process (concat "*" name "*") nil >> (list (file-truename (expand-file-name invocation-name invocation-directory)) >> "--quick" "--debug-init" >> (format "--eval=%S" >> `(progn >> (require 'warnings) >> (add-to-list 'warning-suppress-log-types 'initialization) >> (require 'package) >> (setq package-load-list >> ',(append (mapcar (lambda (p) (list (intern p) t)) packages) >> (mapcar (lambda (p) (list p t)) deps))) >> (package-initialize))))))) > > This is actually a good idea, assuming there are no issues with lexical > scoping that might arise from --eval. I didn't think of using > package-load-list here, but it seems that this only works if we don't > add --init-directory, because otherwise the elpa/ directory is not > populated. Yes of course. > It seems to me, that for a proper isolated environment, we should add > a --init-directory option. Why as long as other directories in elpa are not in load-path? > This is easy to fix though, we just need to specify `package-user-dir' > at startup. Here is my updated patch, merging our approaches: > > [2. text/x-diff; 0001-Add-command-to-start-Emacs-with-specific-packages.patch]... > > >>> [2. text/x-diff; 0002-Add-command-to-start-Emacs-with-specific-packages.patch]... >>> >>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]... > > I have slightly modified your version, fixing issues I had, in case > anyone else wants to try it out: Thanks, sorry to not provide the CRM, I quickly wrote this. > (defun package-isolate (packages) > "Start an uncustomised Emacs and only load a set of PACKAGES." > (interactive > (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist)))))) > (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ","))) > (deps (mapcan #'package--dependencies packages))) > (apply #'start-process (concat "*" name "*") nil > (list (file-truename (expand-file-name invocation-name invocation-directory)) > "--quick" "--debug-init" > (format "--eval=%S" > `(progn > (require 'warnings) > (add-to-list 'warning-suppress-log-types 'initialization) > (require 'package) > (setq package-load-list > ',(mapcar (lambda (p) (list p t)) (append packages deps))) > (package-initialize))))))) -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTcpb8THHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk1PWC/9k5VNP9khVxozlrzHaX7LcdgNgaqV4 eTygQ84ucVAQC0tG/tdprxY5FKyfyOTqBGOr6oGEvMRszEMGz66T1lqQXvZFMwl9 4YAwLavrns5qYgsw4UFbppsEjfJnzV4HwYBW304vMRz93xWXPkuvwhUp0r1Ja1N+ l4GYHX0gFNGFO8EIwiyyX5njAkMMAtPdED1Xg1PCgkLFvR+zIvOwE45azhmp6mE9 zz8hgWam3el9+lTvVVGydqqeXIYGk3FLBBPNaiFL9gTTwffqOOsrJiBNJuoPnqou vG6DSkmC2Sjz9DWZXVkNLa6ocvUZsT7J4iRg+V7G8Ye7Fa0awNbccp3KkmuH6/v+ bIwdmHPwFw1SPd1gZ1wg5jYZmYJ03evohvQK/iecreErwTbDs0P1dl/JXR9qI0Hx 627s8deL/7kOEr+yEpD8WdPkQA7+Pg9t+bJzapH/S01Giu8SnCqwGtXH13k82dV8 a5fHCImiR0MKELHQIHUOuTqhZ6kWppCe5Ik=+DMA -----END PGP SIGNATURE----- --=-=-=--
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 11:03
Date: Wed, 16 Aug 2023 11:03
163 lines
7283 bytes
7283 bytes
Thierry Volpiatto <thievol@posteo.net> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >> Thierry Volpiatto <thievol@posteo.net> writes: >> >>> Philip Kaludercic <philipk@posteo.net> writes: >>> >>>> Philip Kaludercic <philipk@posteo.net> writes: >>>> >>>>>>>> It is used specially for reproducing bugs in a clean environment, see it >>>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q >>>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and >>>>>>>> not another package. This is important especially nowaday people are >>>>>>>> using "Emacs distribution" with the world list of packages installed. >>>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one >>>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. >>>>>>> >>>>>>> I see. In that case is there any reason you implement this as a shell >>>>>>> script? >>>>>> >>>>>> Well when I wrote the script, packages where not existing and from >>>>>> outside emacs it is actually the only way to run a package isolated. >>>>>> >>>>>>> (It might be interesting to provide something like this for >>>>>>> package.el, to test packages in a generic way.) >>>>>> >>>>>> Yes, this would be interesting, it would be something like this: >>>>>> >>>>>> Emacs -Q >>>>>> M-x <A command that run a package alone, isolated from other >>>>>> packages nuisances> >>>>> >>>>> I was actually thinking of a command like >>>>> >>>>> M-x package-isolate RET foo,bar,baz RET >>>>> >>>>> and a new instance of Emacs using -Q is spun up, with all the packages >>>>> you have listed loaded, and nothing else... Sounds like a fun little >>>>> weekend project ;^) >>>> >>>> Here is my first attempt at providing this kind of a command. Any >>>> comments? >>> >>> Why not reusing package.el functions? >>> Why do you want to start in an isolated elpa directory? >>> Isn't something like this suffice? (just missing to fallback to CRM when >>> helm is not available) >> >> I don't know much about Helm, but does it not support CRM? > > It does, but this is a much better interface than CRM. I don't think it makes sense to add support like this in the core, but is there something we should keep in mind to not hinder integration with Helm? >>> (defun package-isolate (packages) >>> "Start an uncustomised Emacs and only load a set of PACKAGES." >>> (interactive >>> (list (let ((helm-comp-read-use-marked t)) >>> (completing-read "Packages: " (mapcar #'car (package--alist)))))) >> >> This doesn't allow selecting specific package versions, in case multiple >> are installed (which might easily happen if you use package-vc). I >> stole the code in my patch from package-delete, and I guess it would be >> possible to generalise it into a utility function. > > Ok, I don't know much how package-vc works. I can have a classical tarball package installed next to a VC package, just like you can have a built-in package or a system package, and it makes sense to be able to decide which one to isolate. >>> (let* ((name (concat "package-isolate-" (mapconcat #'identity >>> packages ","))) >> >> This doesn't work, because the above returns a string, not a list of strings. > > No, it works, the above returns a list of strings (the completing-read > allows marking and returns always a list). Not in my case, I got a type error. >>> (deps (cl-loop for p in packages >>> for sym = (intern p) >>> append (package--dependencies sym)))) >>> (apply #'start-process (concat "*" name "*") nil >>> (list (file-truename (expand-file-name invocation-name invocation-directory)) >>> "--quick" "--debug-init" >>> (format "--eval=%S" >>> `(progn >>> (require 'warnings) >>> (add-to-list 'warning-suppress-log-types 'initialization) >>> (require 'package) >>> (setq package-load-list >>> ',(append (mapcar (lambda (p) (list (intern p) t)) packages) >>> (mapcar (lambda (p) (list p t)) deps))) >>> (package-initialize))))))) >> >> This is actually a good idea, assuming there are no issues with lexical >> scoping that might arise from --eval. I didn't think of using >> package-load-list here, but it seems that this only works if we don't >> add --init-directory, because otherwise the elpa/ directory is not >> populated. > > Yes of course. > >> It seems to me, that for a proper isolated environment, we should add >> a --init-directory option. > > Why as long as other directories in elpa are not in load-path? Mainly to avoid issues with packages that might place files in the configuration directory, which might hinder the reproduction of bugs. Upon reflection, my approach might have an issue if the user wishes to install a package, for the sake of testing within the isolated environment. Perhaps it would be better to set `package-directory-list' instead? Also, would it make sense to have some visual/textual indication that this is a testing environment? Perhaps the *scratch* buffer string could be modified or the default background colour could be set to something else. >> This is easy to fix though, we just need to specify `package-user-dir' >> at startup. Here is my updated patch, merging our approaches: >> >> [2. text/x-diff; >> 0001-Add-command-to-start-Emacs-with-specific-packages.patch]... >> >> >>>> [2. text/x-diff; >>>> 0002-Add-command-to-start-Emacs-with-specific-packages.patch]... >>>> >>>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]... >> >> I have slightly modified your version, fixing issues I had, in case >> anyone else wants to try it out: > > Thanks, sorry to not provide the CRM, I quickly wrote this. np. >> (defun package-isolate (packages) >> "Start an uncustomised Emacs and only load a set of PACKAGES." >> (interactive >> (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist)))))) >> (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ","))) >> (deps (mapcan #'package--dependencies packages))) >> (apply #'start-process (concat "*" name "*") nil >> (list (file-truename (expand-file-name invocation-name invocation-directory)) >> "--quick" "--debug-init" >> (format "--eval=%S" >> `(progn >> (require 'warnings) >> (add-to-list 'warning-suppress-log-types 'initialization) >> (require 'package) >> (setq package-load-list >> ',(mapcar (lambda (p) (list p t)) (append packages deps))) >> (package-initialize)))))))
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Thierry Volpiatt
Date: Wed, 16 Aug 2023 11:55
Date: Wed, 16 Aug 2023 11:55
240 lines
9037 bytes
9037 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Philip Kaludercic <philipk@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> Philip Kaludercic <philipk@posteo.net> writes: >> >>> Thierry Volpiatto <thievol@posteo.net> writes: >>> >>>> Philip Kaludercic <philipk@posteo.net> writes: >>>> >>>>> Philip Kaludercic <philipk@posteo.net> writes: >>>>> >>>>>>>>> It is used specially for reproducing bugs in a clean environment, see it >>>>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q >>>>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and >>>>>>>>> not another package. This is important especially nowaday people are >>>>>>>>> using "Emacs distribution" with the world list of packages installed. >>>>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one >>>>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. >>>>>>>> >>>>>>>> I see. In that case is there any reason you implement this as a shell >>>>>>>> script? >>>>>>> >>>>>>> Well when I wrote the script, packages where not existing and from >>>>>>> outside emacs it is actually the only way to run a package isolated. >>>>>>> >>>>>>>> (It might be interesting to provide something like this for >>>>>>>> package.el, to test packages in a generic way.) >>>>>>> >>>>>>> Yes, this would be interesting, it would be something like this: >>>>>>> >>>>>>> Emacs -Q >>>>>>> M-x <A command that run a package alone, isolated from other >>>>>>> packages nuisances> >>>>>> >>>>>> I was actually thinking of a command like >>>>>> >>>>>> M-x package-isolate RET foo,bar,baz RET >>>>>> >>>>>> and a new instance of Emacs using -Q is spun up, with all the packages >>>>>> you have listed loaded, and nothing else... Sounds like a fun little >>>>>> weekend project ;^) >>>>> >>>>> Here is my first attempt at providing this kind of a command. Any >>>>> comments? >>>> >>>> Why not reusing package.el functions? >>>> Why do you want to start in an isolated elpa directory? >>>> Isn't something like this suffice? (just missing to fallback to CRM when >>>> helm is not available) >>> >>> I don't know much about Helm, but does it not support CRM? >> >> It does, but this is a much better interface than CRM. > > I don't think it makes sense to add support like this in the core, Perhaps yes. However it doesn't requires helm: (let ((helm-comp-read-use-marked t)) (if (and (boundp 'helm-mode) helm-mode) (completing-read ...) (completing-read-multiple ...) > but is there something we should keep in mind to not hinder > integration with Helm? No don't worry, helm will work in any cases, thanks. >>>> (defun package-isolate (packages) >>>> "Start an uncustomised Emacs and only load a set of PACKAGES." >>>> (interactive >>>> (list (let ((helm-comp-read-use-marked t)) >>>> (completing-read "Packages: " (mapcar #'car (package--alist)))))) >>> >>> This doesn't allow selecting specific package versions, in case multiple >>> are installed (which might easily happen if you use package-vc). I >>> stole the code in my patch from package-delete, and I guess it would be >>> possible to generalise it into a utility function. >> >> Ok, I don't know much how package-vc works. > > I can have a classical tarball package installed next to a VC package, > just like you can have a built-in package or a system package, and it > makes sense to be able to decide which one to isolate. Ok, I understand. >>>> (let* ((name (concat "package-isolate-" (mapconcat #'identity >>>> packages ","))) >>> >>> This doesn't work, because the above returns a string, not a list of strings. >> >> No, it works, the above returns a list of strings (the completing-read >> allows marking and returns always a list). > > Not in my case, I got a type error. Yes, because the let-bounded var had no effect in your case, otherwise when helm is installed and helm-mode enabled the completing-read will always return a list. >>>> (deps (cl-loop for p in packages >>>> for sym = (intern p) >>>> append (package--dependencies sym)))) >>>> (apply #'start-process (concat "*" name "*") nil >>>> (list (file-truename (expand-file-name invocation-name invocation-directory)) >>>> "--quick" "--debug-init" >>>> (format "--eval=%S" >>>> `(progn >>>> (require 'warnings) >>>> (add-to-list 'warning-suppress-log-types 'initialization) >>>> (require 'package) >>>> (setq package-load-list >>>> ',(append (mapcar (lambda (p) (list (intern p) t)) packages) >>>> (mapcar (lambda (p) (list p t)) deps))) >>>> (package-initialize))))))) >>> >>> This is actually a good idea, assuming there are no issues with lexical >>> scoping that might arise from --eval. I didn't think of using >>> package-load-list here, but it seems that this only works if we don't >>> add --init-directory, because otherwise the elpa/ directory is not >>> populated. >> >> Yes of course. >> >>> It seems to me, that for a proper isolated environment, we should add >>> a --init-directory option. >> >> Why as long as other directories in elpa are not in load-path? > > Mainly to avoid issues with packages that might place files in the > configuration directory, which might hinder the reproduction of bugs. Hmm, maybe, I don't have an example in mind though. > Upon reflection, my approach might have an issue if the user wishes to > install a package, for the sake of testing within the isolated > environment. Yes, one more reason to use the original elpa dir ;-) > Perhaps it would be better to set `package-directory-list' instead? Don't know yet. > Also, would it make sense to have some visual/textual indication that > this is a testing environment? Perhaps the *scratch* buffer string > could be modified or the default background colour could be set to > something else. No particular opinions about this. >>> This is easy to fix though, we just need to specify `package-user-dir' >>> at startup. Here is my updated patch, merging our approaches: >>> >>> [2. text/x-diff; >>> 0001-Add-command-to-start-Emacs-with-specific-packages.patch]... >>> >>> >>>>> [2. text/x-diff; >>>>> 0002-Add-command-to-start-Emacs-with-specific-packages.patch]... >>>>> >>>>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]... >>> >>> I have slightly modified your version, fixing issues I had, in case >>> anyone else wants to try it out: >> >> Thanks, sorry to not provide the CRM, I quickly wrote this. > > np. > >>> (defun package-isolate (packages) >>> "Start an uncustomised Emacs and only load a set of PACKAGES." >>> (interactive >>> (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist)))))) >>> (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ","))) >>> (deps (mapcan #'package--dependencies packages))) >>> (apply #'start-process (concat "*" name "*") nil >>> (list (file-truename (expand-file-name invocation-name invocation-directory)) >>> "--quick" "--debug-init" >>> (format "--eval=%S" >>> `(progn >>> (require 'warnings) >>> (add-to-list 'warning-suppress-log-types 'initialization) >>> (require 'package) >>> (setq package-load-list >>> ',(mapcar (lambda (p) (list p t)) (append packages deps))) >>> (package-initialize))))))) -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTcvDYTHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk1THC/wNxzRzRcWKSOX2gG+BOJ/nt7KxcZsw 1giKsjmiBeSR1v1oHaSfZB6Khb1/o08/XwXi0IC9aTfPrrPBy+drqDC0zBA2qLUW p06PJIpeLOv/Dqbale8+Y4tfJFQ8h9vqc5if9hZ/5/iHY77jTq3ZO8GXaUODdjZi T74xUqjwcHCebMQA9us1yWynvMUCPj9ZSXSXRLGg7Z5W0rKODmbYs3gwSiP1e/Ym xQJ0AJg85kFamRPh7WiemiG5sBPQozdcLQWGUXy+vixop3csjVUu8lSNM9ubchZO TV2bYOIhiBPZaDMEU4nCml0H+OUEEYr5BAm8tLcr82AM2YdrCzjPvIdUH2KXbBJ8 PHDFsNIqJeR0ndhCwy8B1fxe4y8TWKQeLTYGo/Jp9IGA3Gb2SCbfPln/q7Z3V9eO koB3RxtmvvBQlaLKZl1jEfC4P3TV+MeLVfqr4ImhceR+ioCikHkzwoimiaBfKOLd BvJOaiEVMhRiQqj7VnidVCkmUmjQf/dOy8o=vWve -----END PGP SIGNATURE----- --=-=-=--
Re: Proposal for 'package-isolate' command
Author: Eli Zaretskii
Date: Wed, 16 Aug 2023 14:25
Date: Wed, 16 Aug 2023 14:25
47 lines
2022 bytes
2022 bytes
> From: Philip Kaludercic <philipk@posteo.net> > Cc: thievol@posteo.net, emacs-devel@gnu.org > Date: Tue, 15 Aug 2023 19:52:32 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > > Seems strange to me to have a command to start another Emacs. Why not > > implement this as a command-line option instead? That would be > > consistent with the several options we already have, like -q, -Q, -D, > > which already contrl what happens at startup. > > Mainly because this wouldn't support a completing-read interface, that > simplifies prompting the user for a set of packages. Shells can complete as well, right? And once you typed the command once, shells have features to help you invoke commands from history, so you won't need to retype it more than once. > But perhaps the bulk of this command could be implemented as a CLI > option, that this command could wrap? Maybe. But again, it's strange to have to launch another process from Emacs for such a simple functionality. And if the number of packages to load is large, typing them manually would be annoying anyway, so people will probably store the list in a file or something? So maybe we should allow specifying a file with the list of packages as well? > >> + (make-symbolic-link real link t) > > > > Using symbolic links makes the program less portable, so it is best to > > avoid them. > > The reason I used them here, instead of just adding the directories > under ~/.config/emacs/elpa/ is that startup.el issues a warning along > the lines of > > Your `load-path' seems to contain your `user-emacs-directory' ... > > My previous patch actually included the code that suppresses all > warnings during initialisation, so I've removed this hack. I don't understand how this is different from a "normal" startup of Emacs with all the packages. Here, you just want to load part of the packages that are loaded normally, so why does this warning pop up in this case, but not when Emacs starts "normally"? I'm probably missing something.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Eli Zaretskii
Date: Wed, 16 Aug 2023 17:10
Date: Wed, 16 Aug 2023 17:10
22 lines
931 bytes
931 bytes
> From: Philip Kaludercic <philipk@posteo.net> > Cc: emacs-devel@gnu.org > Date: Wed, 16 Aug 2023 10:10:46 +0000 > > +--- > +*** New command to start Emacs only with specific packages > +The command 'package-isolate' is equivalent to starting Emacs with the > +-Q flag and loading specific packages (and their dependencies) > +manually. If this is how this feature is going to be implemented, I suggest to reword this NEWS entry to make the intent and the feature easier to understand: *** New command to start an inferior Emacs loading only specific packages. The new command 'package-isolate' will start a new Emacs process, as a sub-process of Emacs where you invoke the command, in a way that causes the new process to load only some of the installed packages. The command prompts for the packages to activate in this sub-process, and is intended for testing Emacs and/or the packages in a clean environment.
Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 18:34
Date: Wed, 16 Aug 2023 18:34
92 lines
3061 bytes
3061 bytes
Thierry Volpiatto <thievol@posteo.net> writes: >>>> I don't know much about Helm, but does it not support CRM? >>> >>> It does, but this is a much better interface than CRM. >> >> I don't think it makes sense to add support like this in the core, > > Perhaps yes. However it doesn't requires helm: > > (let ((helm-comp-read-use-marked t)) > (if (and (boundp 'helm-mode) helm-mode) > (completing-read ...) > (completing-read-multiple ...) > >> but is there something we should keep in mind to not hinder >> integration with Helm? > > No don't worry, helm will work in any cases, thanks. OK, in that case I'd prefer to keep it the way it is. [...] >>>>> (let* ((name (concat "package-isolate-" (mapconcat #'identity >>>>> packages ","))) >>>> >>>> This doesn't work, because the above returns a string, not a list of strings. >>> >>> No, it works, the above returns a list of strings (the completing-read >>> allows marking and returns always a list). >> >> Not in my case, I got a type error. > > Yes, because the let-bounded var had no effect in your case, otherwise > when helm is installed and helm-mode enabled the completing-read will > always return a list. Right, but that is the issue here, because using completing-read, especially in the core, shouldn't make any assumptions like that. In the end this boils down to the fact that completing-read and co. are a over-burned interface... [...] >>>> It seems to me, that for a proper isolated environment, we should add >>>> a --init-directory option. >>> >>> Why as long as other directories in elpa are not in load-path? >> >> Mainly to avoid issues with packages that might place files in the >> configuration directory, which might hinder the reproduction of bugs. > > Hmm, maybe, I don't have an example in mind though. It might not be the best example, but my package autocrypt generates a file in the `user-emacs-directory'. If we don't use --init-directory, the existing file would be re-used. >> Upon reflection, my approach might have an issue if the user wishes to >> install a package, for the sake of testing within the isolated >> environment. > > Yes, one more reason to use the original elpa dir ;-) No, because in that case the package installed in the temporary environment would be retained in the original elpa/ directory, which I think we /don't/ want. >> Perhaps it would be better to set `package-directory-list' instead? > > Don't know yet. Even better, I have added all directories that `package-load-all-descriptors' would load to `package-directory-list', which should be more robust. >> Also, would it make sense to have some visual/textual indication that >> this is a testing environment? Perhaps the *scratch* buffer string >> could be modified or the default background colour could be set to >> something else. > > No particular opinions about this. I guess this is too controversial. Perhaps just adjusting `frame-title-format' would be enough. [...]
Re: Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 18:48
Date: Wed, 16 Aug 2023 18:48
69 lines
2861 bytes
2861 bytes
Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: thievol@posteo.net, emacs-devel@gnu.org >> Date: Tue, 15 Aug 2023 19:52:32 +0000 >> >> Eli Zaretskii <eliz@gnu.org> writes: >> >> > Seems strange to me to have a command to start another Emacs. Why not >> > implement this as a command-line option instead? That would be >> > consistent with the several options we already have, like -q, -Q, -D, >> > which already contrl what happens at startup. >> >> Mainly because this wouldn't support a completing-read interface, that >> simplifies prompting the user for a set of packages. > > Shells can complete as well, right? And once you typed the command > once, shells have features to help you invoke commands from history, > so you won't need to retype it more than once. Each shell requires individual completion support, and figuring out what packages are installed outside of Emacs to ensure input like "magit-3.3.0,corfu-0.37" is well formed, seems too much work to me. What would be reasonable, might be a function that could be invoked from batch mode. emacs -Q --batch -f package-isolate-batch magit corfu >> But perhaps the bulk of this command could be implemented as a CLI >> option, that this command could wrap? > > Maybe. But again, it's strange to have to launch another process from > Emacs for such a simple functionality. And if the number of packages > to load is large, typing them manually would be annoying anyway, so > people will probably store the list in a file or something? So maybe > we should allow specifying a file with the list of packages as well? I don't know how this package would be used, but the way I imagine it is that a package maintainer asks the user to run M-x package-isolate RET foo-1.2.3 RET with only a few packages, to make the reproduction of bugs easier, as is the case with Helm, which is what prompted this tangent. >> >> + (make-symbolic-link real link t) >> > >> > Using symbolic links makes the program less portable, so it is best to >> > avoid them. >> >> The reason I used them here, instead of just adding the directories >> under ~/.config/emacs/elpa/ is that startup.el issues a warning along >> the lines of >> >> Your `load-path' seems to contain your `user-emacs-directory' ... >> >> My previous patch actually included the code that suppresses all >> warnings during initialisation, so I've removed this hack. > > I don't understand how this is different from a "normal" startup of > Emacs with all the packages. Here, you just want to load part of the > packages that are loaded normally, so why does this warning pop up in > this case, but not when Emacs starts "normally"? I'm probably missing > something. The point is moot anyway, since the approach that Thierry proposed circumvents the issue to begin with.
Re: Changes to make in elpa-packages file for nongnu elpa
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 18:52
Date: Wed, 16 Aug 2023 18:52
26 lines
1059 bytes
1059 bytes
Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: emacs-devel@gnu.org >> Date: Wed, 16 Aug 2023 10:10:46 +0000 >> >> +--- >> +*** New command to start Emacs only with specific packages >> +The command 'package-isolate' is equivalent to starting Emacs with the >> +-Q flag and loading specific packages (and their dependencies) >> +manually. > > If this is how this feature is going to be implemented, I suggest to > reword this NEWS entry to make the intent and the feature easier to > understand: > > *** New command to start an inferior Emacs loading only specific packages. > The new command 'package-isolate' will start a new Emacs process, as > a sub-process of Emacs where you invoke the command, in a way that > causes the new process to load only some of the installed packages. > The command prompts for the packages to activate in this > sub-process, and is intended for testing Emacs and/or the packages > in a clean environment. As usual, I prefer your phrasing. Will update the patch.
Re: Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Wed, 16 Aug 2023 19:00
Date: Wed, 16 Aug 2023 19:00
148 lines
6198 bytes
6198 bytes
--=-=-= Content-Type: text/plain Stefan Kangas <stefankangas@gmail.com> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >> I guess this is too controversial. Perhaps just adjusting >> `frame-title-format' would be enough. > > Would it be controversial to print a message in the scratch buffer? That is also a good idea, this patch integrates that approach: --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Add-command-to-start-Emacs-with-specific-packages.patch From ecc6b37a2a1cb9b3629521fc92b2d9af5c5ea653 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic <philipk@posteo.net> Date: Tue, 15 Aug 2023 18:39:14 +0200 Subject: [PATCH] Add command to start Emacs with specific packages * lisp/emacs-lisp/package.el (package--dependencies): Extend function to handle and return package descriptors. (package-isolate): Add new command. * etc/NEWS: Announce new command. --- etc/NEWS | 9 +++++ lisp/emacs-lisp/package.el | 70 ++++++++++++++++++++++++++++++++++---- 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 57f04609679..dc213dcee42 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -505,6 +505,15 @@ project, that you can quickly select using 'project-switch-project' When non-nil, package specifications with side-effects for building software will be used when building a package. +--- +*** New command to start an inferior Emacs loading only specific packages. +The new command 'package-isolate' will start a new Emacs process, as +a sub-process of Emacs where you invoke the command, in a way that +causes the new process to load only some of the installed packages. +The command prompts for the packages to activate in this +sub-process, and is intended for testing Emacs and/or the packages +in a clean environment. + ** Flymake +++ diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index b3062d2608b..76cd39cc263 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2330,12 +2330,26 @@ package-upgrade-all (mapc #'package-upgrade upgradeable)))) (defun package--dependencies (pkg) - "Return a list of all dependencies PKG has. -This is done recursively." - ;; Can we have circular dependencies? Assume "nope". - (when-let* ((desc (cadr (assq pkg package-archive-contents))) - (deps (mapcar #'car (package-desc-reqs desc)))) - (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps))))) + "Return a list of all recursive dependencies of PKG. +If PKG is a package descriptor, the return value will consist of +a list of package descriptors. If PKG is a symbol, designating a +package, the return value will be a list of symbols designating +packages." + (when-let* ((desc (if (package-desc-p pkg) pkg + (cadr (assq pkg package-archive-contents))))) + ;; Can we have circular dependencies? Assume "nope". + (let ((all (named-let more ((pkg-desc desc)) + (let (deps) + (dolist (req (package-desc-reqs pkg-desc)) + (setq deps (nconc + (catch 'found + (dolist (p (apply #'append (mapcar #'cdr (package--alist)))) + (when (and (string= (car req) (package-desc-name p)) + (version-list-<= (cadr req) (package-desc-version p))) + (throw 'found (more p))))) + deps))) + (delete-dups (cons pkg-desc deps)))))) + (remq pkg (mapcar (if (package-desc-p pkg) #'identity #'package-desc-name) all))))) (defun package-strip-rcs-id (str) "Strip RCS version ID from the version string STR. @@ -2625,6 +2639,50 @@ package-autoremove removable)) (message "Nothing to autoremove"))))) +(defun package-isolate (packages) + "Start an uncustomised Emacs and only load a set of PACKAGES." + (interactive + (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p)) + unless (package-built-in-p p) + collect (cons (package-desc-full-name p) p) into table + finally return + (list (cl-loop for c in (completing-read-multiple + "Isolate packages: " table + nil t) + collect (alist-get c table nil nil #'string=))))) + (let* ((name (concat "package-isolate-" + (mapconcat #'package-desc-full-name packages ","))) + initial-scratch-message package-load-list) + (with-temp-buffer + (insert ";; Emacs has been started by `package-isolate' without any configuration, and\n" + ";; only the following packages have been loaded:\n;;\n") + + (dolist (package (append packages (mapcan #'package--dependencies packages))) + (push (list (package-desc-name package) + (package-version-join (package-desc-version package))) + package-load-list) + (insert ";; - " (package-desc-full-name package)) + (unless (memq package packages) + (insert " (dependency)")) + (insert "\n")) + (insert "\n") + (setq initial-scratch-message (buffer-string))) + (apply #'start-process (concat "*" name "*") nil + (list (expand-file-name invocation-name invocation-directory) + "--quick" "--debug-init" + "--init-directory" (make-temp-file name t) + (format "--eval=%S" + `(progn + (setq initial-scratch-message ,initial-scratch-message) + + (require 'package) + ,@(mapcar + (lambda (dir) + `(add-to-list 'package-directory-list ,dir)) + (cons package-user-dir package-directory-list)) + (setq package-load-list ',package-load-list) + (package-initialize))))))) + ;;;; Package description buffer. -- 2.39.2 --=-=-=--
Re: Proposal for 'package-isolate' command
Author: Stefan Kangas
Date: Wed, 16 Aug 2023 20:49
Date: Wed, 16 Aug 2023 20:49
7 lines
219 bytes
219 bytes
Philip Kaludercic <philipk@posteo.net> writes: > I guess this is too controversial. Perhaps just adjusting > `frame-title-format' would be enough. Would it be controversial to print a message in the scratch buffer?
Re: Proposal for 'package-isolate' command
Author: Thierry Volpiatt
Date: Thu, 17 Aug 2023 05:30
Date: Thu, 17 Aug 2023 05:30
52 lines
1916 bytes
1916 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Philip Kaludercic <philipk@posteo.net> writes: >> No don't worry, helm will work in any cases, thanks. > > OK, in that case I'd prefer to keep it the way it is. Ok, fair enough. >>> Mainly to avoid issues with packages that might place files in the >>> configuration directory, which might hinder the reproduction of bugs. >> >> Hmm, maybe, I don't have an example in mind though. > > It might not be the best example, but my package autocrypt generates a > file in the `user-emacs-directory'. If we don't use --init-directory, > the existing file would be re-used. Ok, for such case it is easy to either rename the file temporarily to foo_ori or foo_save or to set the variable handling the file (generally it is not harcoded) to something else. But another issue is if your isolated package needs the history file or tramp file or whatever file ~/.emacs.d is handling; e.g. a package providing completion on history. I still think it is more handy to reuse user-emacs-directory and its elpa directory where the packages are already installed. -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTdsxMTHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk8cODAC/GKhgKenWOJ6Ac++UVz3IIrxTtICP V4OrpbQJG18jCGdEu9vX/PTzhsKc28qzkHAZG6+pC+hVo7w1xikXd3Fc2iLs7aT3 OXTFMPYgoJhmG9OeI9Gse5hQml+WUzfGWaXF82w+PsaERXOnUfUMImZELbabfhS5 XKRSUU2xFdgC2SoS2jtoI0dceuJHAfO9LpnLHukFUmNO0xjfsdcBNDQwah9Nvkvo 4RY3wOSVkZ7Xir6QQLP4rWeahO7XX5nwPeJHdABZWEu0B63tfYdbLE5gb7PBxZFW QPeOHhbJ6sF82ySO7dz5waKU/7jQ7BaFYKvt0wO0opiD7Dmqqi+xD32Un42AG/hk F0s+2Nl+pSvCbupZAo6N8lW1DSbpUqipeBeu81Gv8OHOlLUNZqKle+8bgCeLEX6n 1FOGKdn5LIidcsdEHYEi9E3NeLRoETFpyeUWluFwbHuSSYaqDaZWe6FG65VI+AMq vXe4L1f62WkjyzPcu0aY6YangeOVZi6WB1w=Ni+H -----END PGP SIGNATURE----- --=-=-=--
Re: Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Thu, 17 Aug 2023 08:34
Date: Thu, 17 Aug 2023 08:34
176 lines
7660 bytes
7660 bytes
--=-=-= Content-Type: text/plain Thierry Volpiatto <thievol@posteo.net> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >>> No don't worry, helm will work in any cases, thanks. >> >> OK, in that case I'd prefer to keep it the way it is. > > Ok, fair enough. > >>>> Mainly to avoid issues with packages that might place files in the >>>> configuration directory, which might hinder the reproduction of bugs. >>> >>> Hmm, maybe, I don't have an example in mind though. >> >> It might not be the best example, but my package autocrypt generates a >> file in the `user-emacs-directory'. If we don't use --init-directory, >> the existing file would be re-used. > > Ok, for such case it is easy to either rename the file temporarily to > foo_ori or foo_save or to set the variable handling the file (generally > it is not harcoded) to something else. But another issue is if your > isolated package needs the history file or tramp file or whatever file > ~/.emacs.d is handling; e.g. a package providing completion on history. > I still think it is more handy to reuse user-emacs-directory and its > elpa directory where the packages are already installed. How about this patch, that will use a temporary directory when `package-isolate' is invoked with a prefix argument (not sure what the default should be, I guess reusing `user-emacs-directory' is less surprising): --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Add-command-to-start-Emacs-with-specific-packages.patch From dd5da3d2f64f89994084012a3b7379aa78ae33f2 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic <philipk@posteo.net> Date: Tue, 15 Aug 2023 18:39:14 +0200 Subject: [PATCH] Add command to start Emacs with specific packages * lisp/emacs-lisp/package.el (package--dependencies): Extend function to handle and return package descriptors. (package-isolate): Add new command. * etc/NEWS: Announce new command. --- etc/NEWS | 9 +++++ lisp/emacs-lisp/package.el | 77 +++++++++++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 6 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 57f04609679..dc213dcee42 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -505,6 +505,15 @@ project, that you can quickly select using 'project-switch-project' When non-nil, package specifications with side-effects for building software will be used when building a package. +--- +*** New command to start an inferior Emacs loading only specific packages. +The new command 'package-isolate' will start a new Emacs process, as +a sub-process of Emacs where you invoke the command, in a way that +causes the new process to load only some of the installed packages. +The command prompts for the packages to activate in this +sub-process, and is intended for testing Emacs and/or the packages +in a clean environment. + ** Flymake +++ diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index b3062d2608b..169d0d1360d 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2330,12 +2330,26 @@ package-upgrade-all (mapc #'package-upgrade upgradeable)))) (defun package--dependencies (pkg) - "Return a list of all dependencies PKG has. -This is done recursively." - ;; Can we have circular dependencies? Assume "nope". - (when-let* ((desc (cadr (assq pkg package-archive-contents))) - (deps (mapcar #'car (package-desc-reqs desc)))) - (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps))))) + "Return a list of all recursive dependencies of PKG. +If PKG is a package descriptor, the return value will consist of +a list of package descriptors. If PKG is a symbol, designating a +package, the return value will be a list of symbols designating +packages." + (when-let* ((desc (if (package-desc-p pkg) pkg + (cadr (assq pkg package-archive-contents))))) + ;; Can we have circular dependencies? Assume "nope". + (let ((all (named-let more ((pkg-desc desc)) + (let (deps) + (dolist (req (package-desc-reqs pkg-desc)) + (setq deps (nconc + (catch 'found + (dolist (p (apply #'append (mapcar #'cdr (package--alist)))) + (when (and (string= (car req) (package-desc-name p)) + (version-list-<= (cadr req) (package-desc-version p))) + (throw 'found (more p))))) + deps))) + (delete-dups (cons pkg-desc deps)))))) + (remq pkg (mapcar (if (package-desc-p pkg) #'identity #'package-desc-name) all))))) (defun package-strip-rcs-id (str) "Strip RCS version ID from the version string STR. @@ -2625,6 +2639,57 @@ package-autoremove removable)) (message "Nothing to autoremove"))))) +(defun package-isolate (packages &optional temp-init) + "Start an uncustomised Emacs and only load a set of PACKAGES. +If TEMP-INIT is non-nil, or when invoked with a prefix argument, +the Emacs user directory is set to a temporary directory." + (interactive + (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p)) + unless (package-built-in-p p) + collect (cons (package-desc-full-name p) p) into table + finally return + (list (cl-loop for c in (completing-read-multiple + "Isolate packages: " table + nil t) + collect (alist-get c table nil nil #'string=)) + current-prefix-arg))) + (let* ((name (concat "package-isolate-" + (mapconcat #'package-desc-full-name packages ","))) + (all-packages (delete-consecutive-dups + (sort (append packages (mapcan #'package--dependencies packages)) + (lambda (p0 p1) + (string< (package-desc-name p0) (package-desc-name p1)))))) + initial-scratch-message package-load-list) + (with-temp-buffer + (insert ";; This is an isolated testing environment, with these packages enabled:\n\n") + (dolist (package all-packages) + (push (list (package-desc-name package) + (package-version-join (package-desc-version package))) + package-load-list) + (insert ";; - " (package-desc-full-name package)) + (unless (memq package packages) + (insert " (dependency)")) + (insert "\n")) + (insert "\n") + (setq initial-scratch-message (buffer-string))) + (apply #'start-process (concat "*" name "*") nil + (list (expand-file-name invocation-name invocation-directory) + "--quick" "--debug-init" + "--init-directory" (if temp-init + (make-temp-file name t) + user-emacs-directory) + (format "--eval=%S" + `(progn + (setq initial-scratch-message ,initial-scratch-message) + + (require 'package) + ,@(mapcar + (lambda (dir) + `(add-to-list 'package-directory-list ,dir)) + (cons package-user-dir package-directory-list)) + (setq package-load-list ',package-load-list) + (package-initialize))))))) + ;;;; Package description buffer. -- 2.39.2 --=-=-=--
Re: Proposal for 'package-isolate' command
Author: Eshel Yaron
Date: Thu, 17 Aug 2023 11:07
Date: Thu, 17 Aug 2023 11:07
43 lines
1700 bytes
1700 bytes
Hi Philip, Philip Kaludercic <philipk@posteo.net> writes: > How about this patch, that will use a temporary directory when > `package-isolate' is invoked with a prefix argument (not sure what the > default should be, I guess reusing `user-emacs-directory' is less > surprising): I'm again looking forward to trying this out, I think it could be helpful for testing the Compat integration I'm working on for a package of mine. I also again have a couple of minor suggestions around documentation: > (defun package--dependencies (pkg) > - "Return a list of all dependencies PKG has. > -This is done recursively." > - ;; Can we have circular dependencies? Assume "nope". > - (when-let* ((desc (cadr (assq pkg package-archive-contents))) > - (deps (mapcar #'car (package-desc-reqs desc)))) > - (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps))))) > + "Return a list of all recursive dependencies of PKG. I'd say "transitive" rather than "recursive" dependencies, because I think a recursive dependency is more commonly used to refer to a case in which a package (or library, etc.) depends on itself. > +If PKG is a package descriptor, the return value will consist of > +a list of package descriptors. If PKG is a symbol, designating a > +package, the return value will be a list of symbols designating > +packages." Personally, I find the future tense less clear than the present tense when describing deterministic software behavior. So usually I prefer it when the docs say what the program "does", not what it "will do". In this case that be "if PKG is a package descriptor, the return value is a list of package descriptors..." Best, Eshel
Re: Proposal for 'package-isolate' command
Author: Thierry Volpiatt
Date: Thu, 17 Aug 2023 13:32
Date: Thu, 17 Aug 2023 13:32
94 lines
3453 bytes
3453 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Hello Philip, Philip Kaludercic <philipk@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> Philip Kaludercic <philipk@posteo.net> writes: >> >>>> No don't worry, helm will work in any cases, thanks. >>> >>> OK, in that case I'd prefer to keep it the way it is. >> >> Ok, fair enough. >> >>>>> Mainly to avoid issues with packages that might place files in the >>>>> configuration directory, which might hinder the reproduction of bugs. >>>> >>>> Hmm, maybe, I don't have an example in mind though. >>> >>> It might not be the best example, but my package autocrypt generates a >>> file in the `user-emacs-directory'. If we don't use --init-directory, >>> the existing file would be re-used. >> >> Ok, for such case it is easy to either rename the file temporarily to >> foo_ori or foo_save or to set the variable handling the file (generally >> it is not harcoded) to something else. But another issue is if your >> isolated package needs the history file or tramp file or whatever file >> ~/.emacs.d is handling; e.g. a package providing completion on history. >> I still think it is more handy to reuse user-emacs-directory and its >> elpa directory where the packages are already installed. > > How about this patch, that will use a temporary directory when > `package-isolate' is invoked with a prefix argument (not sure what the > default should be, I guess reusing `user-emacs-directory' is less > surprising): Yes. Isn't these two loop the same? (save one loop) (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p)) unless (package-built-in-p p) collect (cons (package-desc-full-name p) p) into table finally return (list (cl-loop for c in (completing-read-multiple "Isolate packages: " table nil t) collect (alist-get c table nil nil #'string=)) current-prefix-arg)) (cl-loop for p in (package--alist) for desc = (cadr p) for name = (car p) unless (package-built-in-p desc) collect (cons (package-desc-full-name desc) p) into table finally return (list (cl-loop for c in (completing-read-multiple "Isolate packages: " table nil t) append (cdr (alist-get c table nil nil #'string=))) current-prefix-arg)) > [2. text/x-diff; 0001-Add-command-to-start-Emacs-with-specific-packages.patch]... -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTeJPITHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk9FNC/9W8oUsxV687mMnsSdpqjQhh0qooj0G 1gZAgeUz8UlZyYco2NVtMSm0HkRALtIGhcDlNOYVPx3MA/C/AXQCeFTU6Tk9OLFP L30srAkJfMB/O0xTidaGChQg0WV3tNX0ANr7tyZR12q/0Aw7fZEaOmTmn8LTOY3c auTpcts9kvmwUxhH+oaD1h8kSjClZqMrVRbrv3TZVDVYYYqNDVylawKK8NkXQVXk 4UFYm6mu8DWy6hU3XQ6kQwaN2PGMXGQqUoURWleCClYdTuKEoCrB3815AaYOX7EB ZkkK31/qE7RNvaOoFa7fgm3d5esswPGRGOsDRFEaAwElVBsnvy9VcIUXc3E23ieX BPHT0xwfA3mSQW13Zrfg4CV+5/fnFaiiRQWcBb9E+Rkq/iqEgnwN2EMlEyjfWPLL FzjEc8GJMYL+fgluPLTEMyZDe0nXyv3k/cbCeA+OXR+Tt749hGwOi/k8h8D8DJL6 Fss1NYRkLoLYoyVBI8ItMae7QXNyKDLfO8M=uA2i -----END PGP SIGNATURE----- --=-=-=--
Re: Proposal for 'package-isolate' command
Author: Thierry Volpiatt
Date: Thu, 17 Aug 2023 13:56
Date: Thu, 17 Aug 2023 13:56
101 lines
3832 bytes
3832 bytes
--=-=-Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Philip Kaludercic <philipk@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> Philip Kaludercic <philipk@posteo.net> writes: >> >>>> No don't worry, helm will work in any cases, thanks. >>> >>> OK, in that case I'd prefer to keep it the way it is. >> >> Ok, fair enough. >> >>>>> Mainly to avoid issues with packages that might place files in the >>>>> configuration directory, which might hinder the reproduction of bugs. >>>> >>>> Hmm, maybe, I don't have an example in mind though. >>> >>> It might not be the best example, but my package autocrypt generates a >>> file in the `user-emacs-directory'. If we don't use --init-directory, >>> the existing file would be re-used. >> >> Ok, for such case it is easy to either rename the file temporarily to >> foo_ori or foo_save or to set the variable handling the file (generally >> it is not harcoded) to something else. But another issue is if your >> isolated package needs the history file or tramp file or whatever file >> ~/.emacs.d is handling; e.g. a package providing completion on history. >> I still think it is more handy to reuse user-emacs-directory and its >> elpa directory where the packages are already installed. > > How about this patch, that will use a temporary directory when > `package-isolate' is invoked with a prefix argument (not sure what the > default should be, I guess reusing `user-emacs-directory' is less > surprising): However it is not working properly: Tried to isolate two packages, osm and w3m, and osm use compat as dependency: Unable to activate package ‘osm’. Required package ‘compat-29.1.4.0’ is unavailable With my simple version of package-isolate I have not this error, both osm w3m are installed correctly. (defun package-isolate (packages) "Start an uncustomised Emacs and only load a set of PACKAGES." (interactive (list (completing-read-multiple "Packages: " (mapcar #'car (package--alist))))) (let* ((name (concat "package-isolate-" (mapconcat #'identity packages ","))) (deps (cl-loop for p in packages for sym = (intern p) nconc (package--dependencies sym)))) (apply #'start-process (concat "*" name "*") nil (list (file-truename (expand-file-name invocation-name invocation-directory)) "--quick" "--debug-init" (format "--eval=%S" `(progn (require 'package) (setq package-load-list ',(append (mapcar (lambda (p) (list (intern p) t)) packages) (mapcar (lambda (p) (list p t)) deps))) (package-initialize))))))) > [2. text/x-diff; 0001-Add-command-to-start-Emacs-with-specific-packages.patch]... -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTeKBgTHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk5uLDACGqGDFUQA+SqVxdrmgcxrOsFWpOufE JZX2m+9637YMBR1KJWhdlQrI3nKunqEeeM7srLMNHv92fuAcoNRK9SSFbf1PAdBu p7AEb6Z0GsOPPztrCO8B5dJk842zyTuR0Gl5+PCvIfxSFiEVi3u+d+tR2DSt0Bjk D7VmfV2G70QJQdNPD0zZbb13cc6cBAJnTveBOvXEWnqtWz2TdowFYEkGEEZ/3r/m 4PIEPZSM/qDBU5iznVwFmTgZMT/kZ584YTtPNJ0DgDHhJ9OENySYvRruhyhiSpNP jrmHMrQ9DLM4OxnAMJZb8A22VvHfKA6IW49GD+Bs0BjYoyYDpdy+9OsJ3ph6jkbc 4YaVyjF38pm3ckK1pClAkK6cbMgKZSvaP5U6pnsaK285FjwDtcbIycM5cVECSYqs N5nx/50Env0iiN/jISaFt4crcmHrNv0zNFJF4xh0JFY1JgyHWDJt/mrsAqVtTeSW K4vidStImzFFWbDVnXZbyRRD2SdVo4iQRHM=7kcT -----END PGP SIGNATURE----- --=-=-=--
Re: Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Thu, 17 Aug 2023 14:04
Date: Thu, 17 Aug 2023 14:04
76 lines
2965 bytes
2965 bytes
Thierry Volpiatto <thievol@posteo.net> writes: > Hello Philip, > > Philip Kaludercic <philipk@posteo.net> writes: > >> Thierry Volpiatto <thievol@posteo.net> writes: >> >>> Philip Kaludercic <philipk@posteo.net> writes: >>> >>>>> No don't worry, helm will work in any cases, thanks. >>>> >>>> OK, in that case I'd prefer to keep it the way it is. >>> >>> Ok, fair enough. >>> >>>>>> Mainly to avoid issues with packages that might place files in the >>>>>> configuration directory, which might hinder the reproduction of bugs. >>>>> >>>>> Hmm, maybe, I don't have an example in mind though. >>>> >>>> It might not be the best example, but my package autocrypt generates a >>>> file in the `user-emacs-directory'. If we don't use --init-directory, >>>> the existing file would be re-used. >>> >>> Ok, for such case it is easy to either rename the file temporarily to >>> foo_ori or foo_save or to set the variable handling the file (generally >>> it is not harcoded) to something else. But another issue is if your >>> isolated package needs the history file or tramp file or whatever file >>> ~/.emacs.d is handling; e.g. a package providing completion on history. >>> I still think it is more handy to reuse user-emacs-directory and its >>> elpa directory where the packages are already installed. >> >> How about this patch, that will use a temporary directory when >> `package-isolate' is invoked with a prefix argument (not sure what the >> default should be, I guess reusing `user-emacs-directory' is less >> surprising): > > Yes. > > Isn't these two loop the same? (save one loop) No, because that assumes that we are only interested in the first package descriptor in every package--alist entry, while there might be multiple. > (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p)) > unless (package-built-in-p p) Also, do we want this or wouldn't it be useful to be able to force a built-in package being loaded? > collect (cons (package-desc-full-name p) p) into table > finally return > (list (cl-loop for c in (completing-read-multiple > "Isolate packages: " table > nil t) > collect (alist-get c table nil nil #'string=)) > current-prefix-arg)) > > (cl-loop for p in (package--alist) > for desc = (cadr p) > for name = (car p) > unless (package-built-in-p desc) > collect (cons (package-desc-full-name desc) p) into table > finally return > (list (cl-loop for c in (completing-read-multiple > "Isolate packages: " table > nil t) > append (cdr (alist-get c table nil nil #'string=))) > current-prefix-arg)) > > >> [2. text/x-diff; >> 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...
Re: Proposal for 'package-isolate' command
Author: Thierry Volpiatt
Date: Thu, 17 Aug 2023 14:15
Date: Thu, 17 Aug 2023 14:15
90 lines
3285 bytes
3285 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Philip Kaludercic <philipk@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> Hello Philip, >> >> Philip Kaludercic <philipk@posteo.net> writes: >> >>> Thierry Volpiatto <thievol@posteo.net> writes: >>> >>>> Philip Kaludercic <philipk@posteo.net> writes: >>>> >>>>>> No don't worry, helm will work in any cases, thanks. >>>>> >>>>> OK, in that case I'd prefer to keep it the way it is. >>>> >>>> Ok, fair enough. >>>> >>>>>>> Mainly to avoid issues with packages that might place files in the >>>>>>> configuration directory, which might hinder the reproduction of bugs. >>>>>> >>>>>> Hmm, maybe, I don't have an example in mind though. >>>>> >>>>> It might not be the best example, but my package autocrypt generates a >>>>> file in the `user-emacs-directory'. If we don't use --init-directory, >>>>> the existing file would be re-used. >>>> >>>> Ok, for such case it is easy to either rename the file temporarily to >>>> foo_ori or foo_save or to set the variable handling the file (generally >>>> it is not harcoded) to something else. But another issue is if your >>>> isolated package needs the history file or tramp file or whatever file >>>> ~/.emacs.d is handling; e.g. a package providing completion on history. >>>> I still think it is more handy to reuse user-emacs-directory and its >>>> elpa directory where the packages are already installed. >>> >>> How about this patch, that will use a temporary directory when >>> `package-isolate' is invoked with a prefix argument (not sure what the >>> default should be, I guess reusing `user-emacs-directory' is less >>> surprising): >> >> Yes. >> >> Isn't these two loop the same? (save one loop) > > No, because that assumes that we are only interested in the first > package descriptor in every package--alist entry, while there might be > multiple. Ah ok. >> (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p)) >> unless (package-built-in-p p) > > Also, do we want this or wouldn't it be useful to be able to force a > built-in package being loaded? Some packages seems to require a specific version of a package for their dependency e.g. seq, by excluding it the package may not work correctly, this is my understanding but I may be wrong. Also perhaps the package e.g. seq is selected later when computing dependencies but maybe user wants to select a particular version manually in the first place? -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTeLTYTHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk7pWDAC3uoBpuBVyH1Nwy9mKoksM6qCC2zzH yUHyd7mHIyt4crEUIs0CFlP0vHDiEckXHRwUV6L0gEMXkqcgOmIvZH14fNsuqyer 81mHLxrPUG2Do2S7DZtPHjc8CmwHgRDzcx6mCH//xLdGDYwJmpVHrN4WTPVvyN46 MZqvkiHnW/hoOrGKGV/tYjqzPksE5oJ77Rq56xtEH53n9pEC3PXhfr9tmKPN7hpa S7zAMAwb2AYNkVApQTJ3hb3FyaF7KfFGcYATPlD2aPMsVhYijLDo4n5TPCg27VEN YJjKd1K6rGn9k0d7ojpCUeUBteuqMDRPjmNGIWGBJOEdzi7u9pjBQlqrpKKgr7Eg Avr7Tr5dz9OycoZVmc7vJH8Xl4neTjZEpDaB0EaO/6NTJDH7b80yY3sUR8oKinc8 DuFQ/s/oURYaAsUOUG3BwtMWAlkC2rRDelzqwQwQSxNSkOGEFnJ0ffixu1zMIM0V kM7dGipvk6OgAzZXimHM8TE+GHWH6htm0Bk=G+kr -----END PGP SIGNATURE----- --=-=-=--
Re: Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Thu, 17 Aug 2023 14:18
Date: Thu, 17 Aug 2023 14:18
90 lines
3679 bytes
3679 bytes
Thierry Volpiatto <thievol@posteo.net> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >> Thierry Volpiatto <thievol@posteo.net> writes: >> >>> Philip Kaludercic <philipk@posteo.net> writes: >>> >>>>> No don't worry, helm will work in any cases, thanks. >>>> >>>> OK, in that case I'd prefer to keep it the way it is. >>> >>> Ok, fair enough. >>> >>>>>> Mainly to avoid issues with packages that might place files in the >>>>>> configuration directory, which might hinder the reproduction of bugs. >>>>> >>>>> Hmm, maybe, I don't have an example in mind though. >>>> >>>> It might not be the best example, but my package autocrypt generates a >>>> file in the `user-emacs-directory'. If we don't use --init-directory, >>>> the existing file would be re-used. >>> >>> Ok, for such case it is easy to either rename the file temporarily to >>> foo_ori or foo_save or to set the variable handling the file (generally >>> it is not harcoded) to something else. But another issue is if your >>> isolated package needs the history file or tramp file or whatever file >>> ~/.emacs.d is handling; e.g. a package providing completion on history. >>> I still think it is more handy to reuse user-emacs-directory and its >>> elpa directory where the packages are already installed. >> >> How about this patch, that will use a temporary directory when >> `package-isolate' is invoked with a prefix argument (not sure what the >> default should be, I guess reusing `user-emacs-directory' is less >> surprising): > > However it is not working properly: > > Tried to isolate two packages, osm and w3m, and osm use compat as > dependency: > > Unable to activate package ‘osm’. > Required package ‘compat-29.1.4.0’ is unavailable Sadly I cannot reproduce it, w3m is not in GNU or NonGNU ELPA, so unless that is causing the issue, something like M-x package-isolate RET avy-0.5.0,osm-0.13 RET shouldn't make an issue when it comes to resolving dependencies, as the scratch message indicates: --8<---------------cut here---------------start------------->8--- ;; This is an isolated testing environment, with these packages enabled: ;; - avy-0.5.0 ;; - compat-29.1.4.2 (dependency) ;; - osm-0.13 --8<---------------cut here---------------end--------------->8--- And M-x load-library RET compat RET works as well. > With my simple version of package-isolate I have not this error, both > osm w3m are installed correctly. > > (defun package-isolate (packages) > "Start an uncustomised Emacs and only load a set of PACKAGES." > (interactive > (list (completing-read-multiple > "Packages: " (mapcar #'car (package--alist))))) > (let* ((name (concat "package-isolate-" (mapconcat #'identity packages ","))) > (deps (cl-loop for p in packages > for sym = (intern p) > nconc (package--dependencies sym)))) > (apply #'start-process (concat "*" name "*") nil > (list (file-truename (expand-file-name > invocation-name invocation-directory)) > "--quick" "--debug-init" > (format "--eval=%S" > `(progn > (require 'package) > (setq package-load-list > ',(append (mapcar (lambda (p) (list (intern p) t)) > packages) > (mapcar (lambda (p) (list p t)) deps))) > (package-initialize))))))) > >> [2. text/x-diff; 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...
Re: Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Thu, 17 Aug 2023 14:19
Date: Thu, 17 Aug 2023 14:19
49 lines
1951 bytes
1951 bytes
Eshel Yaron <me@eshelyaron.com> writes: > Hi Philip, > > Philip Kaludercic <philipk@posteo.net> writes: > >> How about this patch, that will use a temporary directory when >> `package-isolate' is invoked with a prefix argument (not sure what the >> default should be, I guess reusing `user-emacs-directory' is less >> surprising): > > I'm again looking forward to trying this out, I think it could be > helpful for testing the Compat integration I'm working on for a package > of mine. I also again have a couple of minor suggestions around > documentation: > >> (defun package--dependencies (pkg) >> - "Return a list of all dependencies PKG has. >> -This is done recursively." >> - ;; Can we have circular dependencies? Assume "nope". >> - (when-let* ((desc (cadr (assq pkg package-archive-contents))) >> - (deps (mapcar #'car (package-desc-reqs desc)))) >> - (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps))))) >> + "Return a list of all recursive dependencies of PKG. > > I'd say "transitive" rather than "recursive" dependencies, because I > think a recursive dependency is more commonly used to refer to a case in > which a package (or library, etc.) depends on itself. I wouldn't say recursive but cyclical in that case, but either way I think transitive is a better word here. Will change it. >> +If PKG is a package descriptor, the return value will consist of >> +a list of package descriptors. If PKG is a symbol, designating a >> +package, the return value will be a list of symbols designating >> +packages." > > Personally, I find the future tense less clear than the present tense > when describing deterministic software behavior. So usually I prefer it > when the docs say what the program "does", not what it "will do". In > this case that be "if PKG is a package descriptor, the return value is a > list of package descriptors..." Right, makes sense as well. > Best, > > Eshel
Re: Proposal for 'package-isolate' command
Author: Thierry Volpiatt
Date: Thu, 17 Aug 2023 14:28
Date: Thu, 17 Aug 2023 14:28
75 lines
2755 bytes
2755 bytes
--=-=-Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Thierry Volpiatto <thievol@posteo.net> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >> Thierry Volpiatto <thievol@posteo.net> writes: >> >>> Philip Kaludercic <philipk@posteo.net> writes: >>> >>>>> No don't worry, helm will work in any cases, thanks. >>>> >>>> OK, in that case I'd prefer to keep it the way it is. >>> >>> Ok, fair enough. >>> >>>>>> Mainly to avoid issues with packages that might place files in the >>>>>> configuration directory, which might hinder the reproduction of bugs. >>>>> >>>>> Hmm, maybe, I don't have an example in mind though. >>>> >>>> It might not be the best example, but my package autocrypt generates a >>>> file in the `user-emacs-directory'. If we don't use --init-directory, >>>> the existing file would be re-used. >>> >>> Ok, for such case it is easy to either rename the file temporarily to >>> foo_ori or foo_save or to set the variable handling the file (generally >>> it is not harcoded) to something else. But another issue is if your >>> isolated package needs the history file or tramp file or whatever file >>> ~/.emacs.d is handling; e.g. a package providing completion on history. >>> I still think it is more handy to reuse user-emacs-directory and its >>> elpa directory where the packages are already installed. >> >> How about this patch, that will use a temporary directory when >> `package-isolate' is invoked with a prefix argument (not sure what the >> default should be, I guess reusing `user-emacs-directory' is less >> surprising): > > However it is not working properly: > > Tried to isolate two packages, osm and w3m, and osm use compat as > dependency: > > Unable to activate package ‘osm’. > Required package ‘compat-29.1.4.0’ is unavailable Forget it, it is working properly, just forget you had modified package--dependencies as well. Sorry for the noise. -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTeLwYTHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk+prC/0d5bJgEv+CbEz6Lh8uNyTaB1ppdv0H XekGpDpFTZIbNNcB9fTI5T5w+Hhq27CD48g3J7p0GVExj9tDn1r9phxbitbaIY20 vPQ8xBvcvWwMp1KwS1P3vdfzNwv6gwAJcKjVH+ITDcb+BDvXpB8OjEACElb7M/jZ V7wyFH4iaBXGIE5oL43KpQE2uaYK/BhzPcTMWRytK/kVnbVDCQUI08tMHwdohMrv BL4a20mfMLhilOd4CIMFMTYTnffNIHJZCFjcAXbg/LxuKARu6Ls6vbPBLqDbmWji PaB826zthq8AWyCLd4e/l57QAGZmPBMVs4l2lHFQsOrhEYYEEG6SDI+WDgxgKTkZ FbsH6gjuAJvzpua1wdWlBGSR7ofUcVCSR4ZPcqyNVkU58Kkelxmq57bS74b8HI+J dPi/UP+2KouOHnyzj3YolxE/LuLLhzrlZpvOp/oS7AQElY0XnM3rWe19oDIDjbAf z7+cJ7q6QuV8ERClBHqdQ5bw3HktxnLN+38=CO/8 -----END PGP SIGNATURE----- --=-=-=--
Re: Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Thu, 17 Aug 2023 18:17
Date: Thu, 17 Aug 2023 18:17
137 lines
5491 bytes
5491 bytes
Thierry Volpiatto <thievol@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> Philip Kaludercic <philipk@posteo.net> writes: >> >>> Thierry Volpiatto <thievol@posteo.net> writes: >>> >>>> Philip Kaludercic <philipk@posteo.net> writes: >>>> >>>>>> No don't worry, helm will work in any cases, thanks. >>>>> >>>>> OK, in that case I'd prefer to keep it the way it is. >>>> >>>> Ok, fair enough. >>>> >>>>>>> Mainly to avoid issues with packages that might place files in the >>>>>>> configuration directory, which might hinder the reproduction of bugs. >>>>>> >>>>>> Hmm, maybe, I don't have an example in mind though. >>>>> >>>>> It might not be the best example, but my package autocrypt generates a >>>>> file in the `user-emacs-directory'. If we don't use --init-directory, >>>>> the existing file would be re-used. >>>> >>>> Ok, for such case it is easy to either rename the file temporarily to >>>> foo_ori or foo_save or to set the variable handling the file (generally >>>> it is not harcoded) to something else. But another issue is if your >>>> isolated package needs the history file or tramp file or whatever file >>>> ~/.emacs.d is handling; e.g. a package providing completion on history. >>>> I still think it is more handy to reuse user-emacs-directory and its >>>> elpa directory where the packages are already installed. >>> >>> How about this patch, that will use a temporary directory when >>> `package-isolate' is invoked with a prefix argument (not sure what the >>> default should be, I guess reusing `user-emacs-directory' is less >>> surprising): >> >> However it is not working properly: >> >> Tried to isolate two packages, osm and w3m, and osm use compat as >> dependency: >> >> Unable to activate package ‘osm’. >> Required package ‘compat-29.1.4.0’ is unavailable > > Forget it, it is working properly, just forget you had modified > package--dependencies as well. > Sorry for the noise. It was either that or a new function had to be added, not sure which approach is worse. The current implementation seems to have been hastily added by Lars last year, and it is a bit regrettable in retrospect. It would be possible to modify my change, and have the function always return package-desc objects, since the function is only used in one other spot in another part of the file. While there might be others (packages or individuals) that depend on the function behaving the way it does, but on the other hand, convention designates it as being an "internal" function. Thierry Volpiatto <thievol@posteo.net> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >> Thierry Volpiatto <thievol@posteo.net> writes: >> >>> Hello Philip, >>> >>> Philip Kaludercic <philipk@posteo.net> writes: >>> >>>> Thierry Volpiatto <thievol@posteo.net> writes: >>>> >>>>> Philip Kaludercic <philipk@posteo.net> writes: >>>>> >>>>>>> No don't worry, helm will work in any cases, thanks. >>>>>> >>>>>> OK, in that case I'd prefer to keep it the way it is. >>>>> >>>>> Ok, fair enough. >>>>> >>>>>>>> Mainly to avoid issues with packages that might place files in the >>>>>>>> configuration directory, which might hinder the reproduction of bugs. >>>>>>> >>>>>>> Hmm, maybe, I don't have an example in mind though. >>>>>> >>>>>> It might not be the best example, but my package autocrypt generates a >>>>>> file in the `user-emacs-directory'. If we don't use --init-directory, >>>>>> the existing file would be re-used. >>>>> >>>>> Ok, for such case it is easy to either rename the file temporarily to >>>>> foo_ori or foo_save or to set the variable handling the file (generally >>>>> it is not harcoded) to something else. But another issue is if your >>>>> isolated package needs the history file or tramp file or whatever file >>>>> ~/.emacs.d is handling; e.g. a package providing completion on history. >>>>> I still think it is more handy to reuse user-emacs-directory and its >>>>> elpa directory where the packages are already installed. >>>> >>>> How about this patch, that will use a temporary directory when >>>> `package-isolate' is invoked with a prefix argument (not sure what the >>>> default should be, I guess reusing `user-emacs-directory' is less >>>> surprising): >>> >>> Yes. >>> >>> Isn't these two loop the same? (save one loop) >> >> No, because that assumes that we are only interested in the first >> package descriptor in every package--alist entry, while there might be >> multiple. > > Ah ok. > >>> (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p)) >>> unless (package-built-in-p p) >> >> Also, do we want this or wouldn't it be useful to be able to force a >> built-in package being loaded? > > Some packages seems to require a specific version of a package for their > dependency e.g. seq, by excluding it the package may not work correctly, > this is my understanding but I may be wrong. Also perhaps the package > e.g. seq is selected later when computing dependencies but maybe user > wants to select a particular version manually in the first place? The current algorithm should pick the first package in the package alist that satisfies the necessary dependencies. Perhaps that should be re-thought or the selection should be more clever, e.g. if the user explicitly specifies a dependency with a version, then it should be preferred to whatever other dependency might be determined, at the possible expense of triggering runtime bugs.
Re: Proposal for 'package-isolate' command
Author: Thierry Volpiatt
Date: Fri, 18 Aug 2023 04:57
Date: Fri, 18 Aug 2023 04:57
89 lines
3869 bytes
3869 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Philip Kaludercic <philipk@posteo.net> writes: >> Forget it, it is working properly, just forget you had modified >> package--dependencies as well. >> Sorry for the noise. > > It was either that or a new function had to be added, not sure which > approach is worse. The current implementation seems to have been > hastily added by Lars last year, and it is a bit regrettable in > retrospect. It would be possible to modify my change, and have the > function always return package-desc objects, since the function is only > used in one other spot in another part of the file. While there might > be others (packages or individuals) that depend on the function behaving > the way it does, but on the other hand, convention designates it as > being an "internal" function. The actual version is something like 4 or 5 lines long, so external packages can inline this version under another name if really needed, but your version is covering the both so it's ok I think. OTOH The problem with package.el is inconsistency within its functions, sometimes you have to use a pkg-desc as arg, sometimes not, sometimes functions return a list of symbols sometimes a list of pkg-desc, what is a package name, a string or a symbol? What is a pkg-desc exactly, sometimes it is the cdr in other places the cadr is used... Also built-in packages don't have the same format unless they are distributed in Elpa etc... >> Some packages seems to require a specific version of a package for their >> dependency e.g. seq, by excluding it the package may not work correctly, >> this is my understanding but I may be wrong. Also perhaps the package >> e.g. seq is selected later when computing dependencies but maybe user >> wants to select a particular version manually in the first place? > > The current algorithm should pick the first package in the package alist > that satisfies the necessary dependencies. Perhaps that should be > re-thought or the selection should be more clever, e.g. if the user > explicitly specifies a dependency with a version, then it should be > preferred to whatever other dependency might be determined, at the > possible expense of triggering runtime bugs. I think it is hard to cover all cases, but after all it is more a developer tool for debugging a particular package than a end user tool to run packages, so perhaps the developer can give directives about dependencies to use when needed. Another thing, you use actually (expand-file-name invocation-name invocation-directory) I suggest you use the truename of this instead as emacs can be symlinked in some installations. It should work with the symlink name, but it is clearer which emacs version is used. Now your function is working fine and nearly finish, did you think how you are going to distribute it? It seems you are going to merge it in master, but what about providing it as well as a Elpa package so that users of old emacs (at some point of course, say emacs-27) can use it to report bugs? Thanks. -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTfAX4THHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvkzIjC/0bBkKGDDjGZPIqZfl1ZMBuMR50yA4A qruWYMhL12zjWfpeK/1+bMSzuFuuXuA2oscPxJ4ewvzatGKE0uDxIYDGbe8O+ZZw bM6vreoav0kjqmdIhprwrSNBgjQWh510H98Nn+bLu+IFU1XDznCQPVzwGM777VgB yanSLvbmW6iiFVd2xKkUoN8808eMRNlW1AGMxnZR0FrZNdFbksud3MZXWEQZrzYJ i0nvYHA/xVVoqUNnpINiO1hnkTDJoG2zQcgp9HCeLm6HTZEuxbiNT9xHrEm+vbRU drt4R3qyvKUmdvPjccywPUXFnDBrd/V/R48XNobiDWmsvYDwx/n33IdGDF/zuquN HL6vh55BUoUTsX6i95+/ytaN4VE17kxADrjeK7kxyAd4uKszJ7Ajz+bryR6iWX4x FQy1qjNTL5A/qyLwT9HtpbvIc23zQQ1xyvr6sajVZCsV6d0CfPHkWJdCDjKjc7aN 1lPCwz98+1LXyP0MWYl8angqFLWS8q2Xuew=oFud -----END PGP SIGNATURE----- --=-=-=--
Re: Proposal for 'package-isolate' command
Author: Philip Kaluderci
Date: Fri, 18 Aug 2023 07:49
Date: Fri, 18 Aug 2023 07:49
76 lines
3701 bytes
3701 bytes
Thierry Volpiatto <thievol@posteo.net> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >>> Forget it, it is working properly, just forget you had modified >>> package--dependencies as well. >>> Sorry for the noise. >> >> It was either that or a new function had to be added, not sure which >> approach is worse. The current implementation seems to have been >> hastily added by Lars last year, and it is a bit regrettable in >> retrospect. It would be possible to modify my change, and have the >> function always return package-desc objects, since the function is only >> used in one other spot in another part of the file. While there might >> be others (packages or individuals) that depend on the function behaving >> the way it does, but on the other hand, convention designates it as >> being an "internal" function. > > The actual version is something like 4 or 5 lines long, so external > packages can inline this version under another name if really needed, > but your version is covering the both so it's ok I think. > OTOH The problem with package.el is inconsistency within its functions, > sometimes you have to use a pkg-desc as arg, sometimes not, sometimes > functions return a list of symbols sometimes a list of pkg-desc, what is > a package name, a string or a symbol? What is a pkg-desc exactly, > sometimes it is the cdr in other places the cadr is used... > Also built-in packages don't have the same format unless they are distributed > in Elpa etc... Right, there is certainly work to be done. >>> Some packages seems to require a specific version of a package for their >>> dependency e.g. seq, by excluding it the package may not work correctly, >>> this is my understanding but I may be wrong. Also perhaps the package >>> e.g. seq is selected later when computing dependencies but maybe user >>> wants to select a particular version manually in the first place? >> >> The current algorithm should pick the first package in the package alist >> that satisfies the necessary dependencies. Perhaps that should be >> re-thought or the selection should be more clever, e.g. if the user >> explicitly specifies a dependency with a version, then it should be >> preferred to whatever other dependency might be determined, at the >> possible expense of triggering runtime bugs. > > I think it is hard to cover all cases, but after all it is more a > developer tool for debugging a particular package than a end user tool > to run packages, so perhaps the developer can give directives about > dependencies to use when needed. > > Another thing, you use actually > > (expand-file-name invocation-name invocation-directory) > > I suggest you use the truename of this instead as emacs can be symlinked > in some installations. It should work with the symlink name, but it is > clearer which emacs version is used. I second Eli's question here, what difference would it make? Clearer to whom? > Now your function is working fine and nearly finish, did you think how > you are going to distribute it? It seems you are going to merge it in > master, but what about providing it as well as a Elpa package so that > users of old emacs (at some point of course, say emacs-27) can use it to > report bugs? I am not a fan of small ELPA packages, but what I'd like to bring up again was the proposal to add package.el itself to ELPA. I wrote a patch in <873559q83j.fsf@posteo.net> that should arrange everything necessary for this move, there are still a few points that should be discussed in terms of stability and recovering from a possibly inconsistent state. I think I'll create a feature branch some day soon to make the proposal more concrete. > Thanks.
Re: Proposal for 'package-isolate' command
Author: Eli Zaretskii
Date: Fri, 18 Aug 2023 08:44
Date: Fri, 18 Aug 2023 08:44
19 lines
763 bytes
763 bytes
> From: Thierry Volpiatto <thievol@posteo.net> > Cc: emacs-devel@gnu.org > Date: Fri, 18 Aug 2023 04:57:06 +0000 > > Another thing, you use actually > > (expand-file-name invocation-name invocation-directory) > > I suggest you use the truename of this instead as emacs can be symlinked > in some installations. It should work with the symlink name, but it is > clearer which emacs version is used. We use the above in quite a few places, including when we start async native-compilation. So if it has some problems, we had better discussed them, because I don't quite see why would the above need to use truename. If the OS succeeded to start Emacs via a symlink when the current session was started, why would it fail to start it from inside Emacs?
Re: Proposal for 'package-isolate' command
Author: Thierry Volpiatt
Date: Fri, 18 Aug 2023 12:43
Date: Fri, 18 Aug 2023 12:43
114 lines
4920 bytes
4920 bytes
--=-=-Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Philip Kaludercic <philipk@posteo.net> writes: > Thierry Volpiatto <thievol@posteo.net> writes: > >> Philip Kaludercic <philipk@posteo.net> writes: >> >>>> Forget it, it is working properly, just forget you had modified >>>> package--dependencies as well. >>>> Sorry for the noise. >>> >>> It was either that or a new function had to be added, not sure which >>> approach is worse. The current implementation seems to have been >>> hastily added by Lars last year, and it is a bit regrettable in >>> retrospect. It would be possible to modify my change, and have the >>> function always return package-desc objects, since the function is only >>> used in one other spot in another part of the file. While there might >>> be others (packages or individuals) that depend on the function behaving >>> the way it does, but on the other hand, convention designates it as >>> being an "internal" function. >> >> The actual version is something like 4 or 5 lines long, so external >> packages can inline this version under another name if really needed, >> but your version is covering the both so it's ok I think. >> OTOH The problem with package.el is inconsistency within its functions, >> sometimes you have to use a pkg-desc as arg, sometimes not, sometimes >> functions return a list of symbols sometimes a list of pkg-desc, what is >> a package name, a string or a symbol? What is a pkg-desc exactly, >> sometimes it is the cdr in other places the cadr is used... >> Also built-in packages don't have the same format unless they are distributed >> in Elpa etc... > > Right, there is certainly work to be done. > >>>> Some packages seems to require a specific version of a package for their >>>> dependency e.g. seq, by excluding it the package may not work correctly, >>>> this is my understanding but I may be wrong. Also perhaps the package >>>> e.g. seq is selected later when computing dependencies but maybe user >>>> wants to select a particular version manually in the first place? >>> >>> The current algorithm should pick the first package in the package alist >>> that satisfies the necessary dependencies. Perhaps that should be >>> re-thought or the selection should be more clever, e.g. if the user >>> explicitly specifies a dependency with a version, then it should be >>> preferred to whatever other dependency might be determined, at the >>> possible expense of triggering runtime bugs. >> >> I think it is hard to cover all cases, but after all it is more a >> developer tool for debugging a particular package than a end user tool >> to run packages, so perhaps the developer can give directives about >> dependencies to use when needed. >> >> Another thing, you use actually >> >> (expand-file-name invocation-name invocation-directory) >> >> I suggest you use the truename of this instead as emacs can be symlinked >> in some installations. It should work with the symlink name, but it is >> clearer which emacs version is used. > > I second Eli's question here, what difference would it make? Clearer to > whom? OK, this is not that important. >> Now your function is working fine and nearly finish, did you think how >> you are going to distribute it? It seems you are going to merge it in >> master, but what about providing it as well as a Elpa package so that >> users of old emacs (at some point of course, say emacs-27) can use it to >> report bugs? > > I am not a fan of small ELPA packages, but what I'd like to bring up > again was the proposal to add package.el itself to ELPA. I wrote a > patch in <873559q83j.fsf@posteo.net> that should arrange everything > necessary for this move, there are still a few points that should be > discussed in terms of stability and recovering from a possibly > inconsistent state. I think I'll create a feature branch some day soon > to make the proposal more concrete. Ok, looking forward for having a package-isolate function fetchable for everybody, I will use my own version that fit my needs as a helm action for its package manager. Thanks for your work. -- Thierry --=-=-Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQHHBAEBCgAxFiEEI9twfRN7r3nig/xwDsVtFB0W75MFAmTfahoTHHRoaWV2b2xA cG9zdGVvLm5ldAAKCRAOxW0UHRbvk3SlC/9+ssSiqDlEzF09Pn3Vp/9xZxiJZEdA QeOrpnRJ/T4w/MofemHFK97GKM3/4dTN/zYxaQGjvL8k2M5i3egdvmYRmiuR9f6G rdNWhV16Lh6zdcf418DUeQVd1pxXSjwxV5VW5GIEUzcbRZFrtTcdaB9EMea5pATr kDq4WacS0fSps3oYDFFdTLRtwpGpym+vxMGb8Wa+FQbjYXwBIGmvU911juT+fAnD ZhmNwBT93jx3EHmqoN5vzp52trXSaoR5A0Np3ySTIQMUHtBYXz6obhWOAx1mVeWg YSY/0b8cETn/HrO/iqF8RuuORao+BGiSFAhb5wODVexBWgfVO8Qcixguf8Gqdujw 09RL/kdFMYTFaHiNCFGYeFceiAFm1ahOE83N1IphOLsjuekrFa6i9hO6PbuyHjEQ aVQ/xAagjU8i8YlmpHzLclpmtFXzTZccpXpV3n+6D9Sm37t/dj8iTUu4hAbe+NlE OpbLK2dO+iLCaVLLCG7udexAI3N1BVutMZ4=J7Le -----END PGP SIGNATURE----- --=-=-=--
Re: Adding package and package-vc to ELPA
Author: Philip Kaluderci
Date: Fri, 18 Aug 2023 18:34
Date: Fri, 18 Aug 2023 18:34
4564 lines
348418 bytes
348418 bytes
--=-=-Content-Type: text/plain Philip Kaludercic <philipk@posteo.net> writes: >> Now your function is working fine and nearly finish, did you think how >> you are going to distribute it? It seems you are going to merge it in >> master, but what about providing it as well as a Elpa package so that >> users of old emacs (at some point of course, say emacs-27) can use it to >> report bugs? > > I am not a fan of small ELPA packages, but what I'd like to bring up > again was the proposal to add package.el itself to ELPA. I wrote a > patch in <873559q83j.fsf@posteo.net> that should arrange everything > necessary for this move, there are still a few points that should be > discussed in terms of stability and recovering from a possibly > inconsistent state. I think I'll create a feature branch some day soon > to make the proposal more concrete. I have pushed the patch from that thread, together with a patch for package-vc and a custom command that would revert Emacs to use the built-in version of package.el. The branch is called "feature/elpa-package", and I have added to tarballs with packages built by elpa-admin.el in case anyone wants to try out the packages. I'll be testing these tarballs with older versions of Emacs, to see how that works out. --=-=-Content-Type: application/x-tar Content-Disposition: attachment; filename=package.tar Content-Transfer-Encoding: base64 cGFja2FnZS0xLjEuMS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1 MAAwMDAxNzUwADAwMDAwMDAwMDAwADE0NDEzMzYzMTUxADAxMjQ0MgAgNQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHBoaWxpcAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAcGhpbGlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABw YWNrYWdlLTEuMS4xL3BhY2thZ2UtcGtnLmVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUw ADAwMDE3NTAAMDAwMDAwMDA3NDMAMTQ0MTMzNjMxNTEAMDE1MTQyACAwAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcGhpbGlwAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABwaGlsaXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7 IEdlbmVyYXRlZCBwYWNrYWdlIGRlc2NyaXB0aW9uIGZyb20gcGFja2FnZS5lbCAgLSotIG5vLWJ5 dGUtY29tcGlsZTogdCAtKi0KKGRlZmluZS1wYWNrYWdlICJwYWNrYWdlIiAiMS4xLjEiICJTaW1w bGUgcGFja2FnZSBzeXN0ZW0gZm9yIEVtYWNzIiAnKChlbWFjcyAiMjYuMSIpIChjb21wYXQgIjI5 LjEuMC4wIikpIDpjb21taXQgIjFmY2Y1NjcyNTg0ODk4NGVmNmRhNTBlZjJiN2ExMzBlMWZmZDMy ODIiIDp1cmwgImh0dHBzOi8vZWxwYS5nbnUub3JnL3BhY2thZ2VzL3BhY2thZ2UuaHRtbCIgOmF1 dGhvcnMgJygoIlRvbSBUcm9tZXkiIC4gInRyb21leUByZWRoYXQuY29tIikgKCJEYW5pZWwgSGFj a25leSIgLiAiZGFuQGhheG5leS5vcmciKSkgOm1haW50YWluZXIgJygoIlRvbSBUcm9tZXkiIC4g InRyb21leUByZWRoYXQuY29tIikgKCJEYW5pZWwgSGFja25leSIgLiAiZGFuQGhheG5leS5vcmci KSkgOmtleXdvcmRzICcoInRvb2xzIikpCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGFj a2FnZS0xLjEuMS9wYWNrYWdlLmVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAw MDAxNzUwADAwMDAwNTc3MDYwADE0NDEzMzYyNDU3ADAxNDQwNgAgMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHBoaWxpcAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAcGhpbGlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7Ozsg cGFja2FnZS5lbCAtLS0gU2ltcGxlIHBhY2thZ2Ugc3lzdGVtIGZvciBFbWFjcyAgLSotIGxleGlj YWwtYmluZGluZzp0IC0qLQoKOzsgQ29weXJpZ2h0IChDKSAyMDA3LTIwMjMgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLCBJbmMuCgo7OyBBdXRob3I6IFRvbSBUcm9tZXkgPHRyb21leUByZWRoYXQu Y29tPgo7OyAgICAgICAgIERhbmllbCBIYWNrbmV5IDxkYW5AaGF4bmV5Lm9yZz4KOzsgQ3JlYXRl ZDogMTAgTWFyIDIwMDcKOzsgVmVyc2lvbjogMS4xLjEKOzsgS2V5d29yZHM6IHRvb2xzCjs7IFBh Y2thZ2UtUmVxdWlyZXM6ICgoZW1hY3MgIjI2LjEiKSAoY29tcGF0ICIyOS4xLjAuMCIpKQoKOzsg VGhpcyBpcyBhIEdOVSBFTFBBIDpjb3JlIHBhY2thZ2UuICBBdm9pZCBmdW5jdGlvbmFsaXR5IHRo YXQgaXMgbm90Cjs7IGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBvZiBFbWFjcyByZWNvcmRl ZCBhYm92ZS4KCjs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KCjs7IEdOVSBFbWFj cyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 Cjs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5Cjs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2 ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCjs7IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCgo7OyBHTlUgRW1hY3MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo7OyBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKOzsgYWxvbmcgd2l0aCBHTlUg RW1hY3MuICBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKOzs7 IENvbW1lbnRhcnk6Cgo7OyBUaGUgaWRlYSBiZWhpbmQgcGFja2FnZS5lbCBpcyB0byBiZSBhYmxl IHRvIGRvd25sb2FkIHBhY2thZ2VzIGFuZAo7OyBpbnN0YWxsIHRoZW0uICBQYWNrYWdlcyBhcmUg dmVyc2lvbmVkIGFuZCBoYXZlIHZlcnNpb25lZAo7OyBkZXBlbmRlbmNpZXMuICBGdXJ0aGVybW9y ZSwgdGhpcyBzdXBwb3J0cyBidWlsdC1pbiBwYWNrYWdlcyB3aGljaAo7OyBtYXkgb3IgbWF5IG5v dCBiZSBuZXdlciB0aGFuIHVzZXItc3BlY2lmaWVkIHBhY2thZ2VzLiAgVGhpcyBtYWtlcwo7OyBp dCBwb3NzaWJsZSB0byB1cGdyYWRlIEVtYWNzIGFuZCBhdXRvbWF0aWNhbGx5IGRpc2FibGUgcGFj a2FnZXMKOzsgd2hpY2ggaGF2ZSBtb3ZlZCBmcm9tIGV4dGVybmFsIHRvIGNvcmUuICAoTm90ZSB0 aG91Z2ggdGhhdCB3ZSBkb24ndAo7OyBjdXJyZW50bHkgcmVnaXN0ZXIgYW55IG9mIHRoZXNlLCBz byB0aGlzIGZlYXR1cmUgZG9lcyBub3QgYWN0dWFsbHkKOzsgd29yay4pCgo7OyBBIHBhY2thZ2Ug aXMgZGVzY3JpYmVkIGJ5IGl0cyBuYW1lIGFuZCB2ZXJzaW9uLiAgVGhlIGRpc3RyaWJ1dGlvbgo7 OyBmb3JtYXQgaXMgZWl0aGVyIGEgdGFyIGZpbGUgb3IgYSBzaW5nbGUgLmVsIGZpbGUuCgo7OyBB IHRhciBmaWxlIHNob3VsZCBiZSBuYW1lZCAiTkFNRS1WRVJTSU9OLnRhciIuICBUaGUgdGFyIGZp bGUgbXVzdAo7OyB1bnBhY2sgaW50byBhIGRpcmVjdG9yeSBuYW1lZCBhZnRlciB0aGUgcGFja2Fn ZSBhbmQgdmVyc2lvbjoKOzsgIk5BTUUtVkVSU0lPTiIuICBJdCBtdXN0IGNvbnRhaW4gYSBmaWxl IG5hbWVkICJQQUNLQUdFLXBrZy5lbCIKOzsgd2hpY2ggY29uc2lzdHMgb2YgYSBjYWxsIHRvIGRl ZmluZS1wYWNrYWdlLiAgSXQgbWF5IGFsc28gY29udGFpbiBhCjs7ICJkaXIiIGZpbGUgYW5kIHRo ZSBpbmZvIGZpbGVzIGl0IHJlZmVyZW5jZXMuCgo7OyBBIC5lbCBmaWxlIGlzIG5hbWVkICJOQU1F LVZFUlNJT04uZWwiIGluIHRoZSByZW1vdGUgYXJjaGl2ZSwgYnV0IGlzCjs7IGluc3RhbGxlZCBh cyBzaW1wbHkgIk5BTUUuZWwiIGluIGEgZGlyZWN0b3J5IG5hbWVkICJOQU1FLVZFUlNJT04iLgoK OzsgVGhlIGRvd25sb2FkZXIgZG93bmxvYWRzIGFsbCBkZXBlbmRlbnQgcGFja2FnZXMuICBCeSBk ZWZhdWx0LAo7OyBwYWNrYWdlcyBjb21lIGZyb20gdGhlIG9mZmljaWFsIEdOVSBzb3VyY2VzLCBi dXQgb3RoZXJzIG1heSBiZQo7OyBhZGRlZCBieSBjdXN0b21pemluZyB0aGUgYHBhY2thZ2UtYXJj aGl2ZXMnIGFsaXN0LiAgUGFja2FnZXMgZ2V0Cjs7IGJ5dGUtY29tcGlsZWQgYXQgaW5zdGFsbCB0 aW1lLgoKOzsgQXQgYWN0aXZhdGlvbiB0aW1lIHdlIHdpbGwgc2V0IHVwIHRoZSBsb2FkLXBhdGgg YW5kIHRoZSBpbmZvIHBhdGgsCjs7IGFuZCB3ZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2UncyBhdXRv bG9hZHMuICBJZiBhIHBhY2thZ2Uncwo7OyBkZXBlbmRlbmNpZXMgYXJlIG5vdCBhdmFpbGFibGUs IHdlIHdpbGwgbm90IGFjdGl2YXRlIHRoYXQgcGFja2FnZS4KCjs7IENvbmNlcHR1YWxseSBhIHBh Y2thZ2UgaGFzIG11bHRpcGxlIHN0YXRlIHRyYW5zaXRpb25zOgo7Owo7OyAqIERvd25sb2FkLiAg RmV0Y2hpbmcgdGhlIHBhY2thZ2UgZnJvbSBFTFBBLgo7OyAqIEluc3RhbGwuICBVbnRhciB0aGUg cGFja2FnZSwgb3Igd3JpdGUgdGhlIC5lbCBmaWxlLCBpbnRvCjs7ICAgfi8uZW1hY3MuZC9lbHBh LyBkaXJlY3RvcnkuCjs7ICogQXV0b2xvYWQgZ2VuZXJhdGlvbi4KOzsgKiBCeXRlIGNvbXBpbGUu ICBDdXJyZW50bHkgdGhpcyBwaGFzZSBpcyBkb25lIGR1cmluZyBpbnN0YWxsLAo7OyAgIGJ1dCB3 ZSBtYXkgY2hhbmdlIHRoaXMuCjs7ICogQWN0aXZhdGUuICBFdmFsdWF0ZSB0aGUgYXV0b2xvYWRz IGZvciB0aGUgcGFja2FnZSB0byBtYWtlIGl0Cjs7ICAgYXZhaWxhYmxlIHRvIHRoZSB1c2VyLgo7 OyAqIExvYWQuICBBY3R1YWxseSBsb2FkIHRoZSBwYWNrYWdlIGFuZCBydW4gc29tZSBjb2RlIGZy b20gaXQuCgo7OyBPdGhlciBleHRlcm5hbCBmdW5jdGlvbnMgeW91IG1heSB3YW50IHRvIHVzZToK OzsKOzsgTS14IGxpc3QtcGFja2FnZXMKOzsgICAgRW50ZXJzIGEgbW9kZSBzaW1pbGFyIHRvIGJ1 ZmZlci1tZW51IHdoaWNoIGxldHMgeW91IG1hbmFnZQo7OyAgICBwYWNrYWdlcy4gIFlvdSBjYW4g Y2hvb3NlIHBhY2thZ2VzIGZvciBpbnN0YWxsIChtYXJrIHdpdGggImkiLAo7OyAgICB0aGVuICJ4 IiB0byBleGVjdXRlKSBvciBkZWxldGlvbiwgYW5kIHlvdSBjYW4gc2VlIHdoYXQgcGFja2FnZXMK OzsgICAgYXJlIGF2YWlsYWJsZS4gIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSBs YXRlc3QgbGlzdCBvZgo7OyAgICBwYWNrYWdlcyBmcm9tIEVMUEEuCjs7Cjs7IE0teCBwYWNrYWdl LWluc3RhbGwtZnJvbS1idWZmZXIKOzsgICAgSW5zdGFsbCBhIHBhY2thZ2UgY29uc2lzdGluZyBv ZiBhIHNpbmdsZSAuZWwgZmlsZSB0aGF0IGFwcGVhcnMKOzsgICAgaW4gdGhlIGN1cnJlbnQgYnVm ZmVyLiAgVGhpcyBvbmx5IHdvcmtzIGZvciBwYWNrYWdlcyB3aGljaAo7OyAgICBkZWZpbmUgYSBW ZXJzaW9uIGhlYWRlciBwcm9wZXJseTsgcGFja2FnZS5lbCBhbHNvIHN1cHBvcnRzIHRoZQo7OyAg ICBleHRlbnNpb24gaGVhZGVycyBQYWNrYWdlLVZlcnNpb24gKGluIGNhc2UgVmVyc2lvbiBpcyBh biBSQ1MgaWQKOzsgICAgb3Igc2ltaWxhciksIGFuZCBQYWNrYWdlLVJlcXVpcmVzIChpZiB0aGUg cGFja2FnZSByZXF1aXJlcyBvdGhlcgo7OyAgICBwYWNrYWdlcykuCjs7Cjs7IE0teCBwYWNrYWdl LWluc3RhbGwtZmlsZQo7OyAgICBJbnN0YWxsIGEgcGFja2FnZSBmcm9tIHRoZSBpbmRpY2F0ZWQg ZmlsZS4gIFRoZSBwYWNrYWdlIGNhbiBiZQo7OyAgICBlaXRoZXIgYSB0YXIgZmlsZSBvciBhIC5l bCBmaWxlLiAgQSB0YXIgZmlsZSBtdXN0IGNvbnRhaW4gYW4KOzsgICAgYXBwcm9wcmlhdGVseS1u YW1lZCAiLXBrZy5lbCIgZmlsZTsgYSAuZWwgZmlsZSBtdXN0IGJlIHByb3Blcmx5Cjs7ICAgIGZv cm1hdHRlZCBhcyB3aXRoIGBwYWNrYWdlLWluc3RhbGwtZnJvbS1idWZmZXInLgoKOzs7IFRoYW5r czoKOzs7IChzb3J0ZWQgYnkgc29ydC1saW5lcyk6Cgo7OyBKaW0gQmxhbmR5IDxqaW1iQHJlZC1i ZWFuLmNvbT4KOzsgS2FybCBGb2dlbCA8a2ZvZ2VsQHJlZC1iZWFuLmNvbT4KOzsgS2V2aW4gUnlk ZSA8dXNlcjQyQHppcC5jb20uYXU+Cjs7IExhd3JlbmNlIE1pdGNoZWxsCjs7IE1pY2hhZWwgT2xz b24gPG13b2xzb25AbWVtYmVyLmZzZi5vcmc+Cjs7IFNlYmFzdGlhbiBUZW5uYW50IDxzZWJ5dGVA c21vbG55LnBsdXMuY29tPgo7OyBTdGVmYW4gTW9ubmllciA8bW9ubmllckBpcm8udW1vbnRyZWFs LmNhPgo7OyBWaW5pY2l1cyBKb3NlIExhdG9ycmUgPHZpbmljaXVzamwuZ251QGdtYWlsLmNvbT4K OzsgUGhpbCBIYWdlbGJlcmcgPHBoaWxAaGFnZWxiLm9yZz4KCjs7OyBUb0RvOgoKOzsgLSBwdXR0 aW5nIGluZm8gZGlycyBhdCB0aGUgc3RhcnQgb2YgdGhlIGluZm8gcGF0aCBtZWFucwo7OyAgIHVz ZXJzIHNlZSBhIHdlaXJkIG9yZGVyaW5nIG9mIGNhdGVnb3JpZXMuICBPVE9IIHdlIHdhbnQgdG8K OzsgICBvdmVycmlkZSBsYXRlciBlbnRyaWVzLiAgbWF5YmUgZW1hY3MgbmVlZHMgdG8gZW5mb3Jj ZQo7OyAgIHRoZSBzdGFuZGFyZCBsYXlvdXQ/Cjs7IC0gcHV0IGJ5dGVjb2RlIGluIGEgc2VwYXJh dGUgZGlyZWN0b3J5IHRyZWUKOzsgLSBwZXJoYXBzIGdpdmUgdXNlcnMgYSB3YXkgdG8gcmVjb21w aWxlIHRoZWlyIGJ5dGVjb2RlCjs7ICAgb3IgZG8gaXQgYXV0b21hdGljYWxseSB3aGVuIGVtYWNz IGNoYW5nZXMKOzsgLSBnaXZlIHVzZXJzIGEgd2F5IHRvIGtub3cgd2hldGhlciBhIHBhY2thZ2Ug aXMgaW5zdGFsbGVkIG9rCjs7IC0gZ2l2ZSB1c2VycyBhIHdheSB0byB2aWV3IGEgcGFja2FnZSdz IGRvY3VtZW50YXRpb24gd2hlbiBpdAo7OyAgIG9ubHkgYXBwZWFycyBpbiB0aGUgLmVsCjs7IC0g dXNlL2V4dGVuZCBjaGVja2RvYyBzbyBwZW9wbGUgY2FuIHRlbGwgaWYgdGhlaXIgcGFja2FnZSB3 aWxsIHdvcmsKOzsgLSAiaW5zdGFsbGVkIiBpbnN0ZWFkIG9mIGEgYmxhbmsgaW4gdGhlIHN0YXR1 cyBjb2x1bW4KOzsgLSB0cmFtcCBuZWVkcyBpdHMgZmlsZXMgdG8gYmUgY29tcGlsZWQgaW4gYSBj ZXJ0YWluIG9yZGVyLgo7OyAgIGhvdyB0byBoYW5kbGUgdGhpcz8gIGZpeCB0cmFtcD8KOzsgLSBt YXliZSB3ZSBuZWVkIHNlcGFyYXRlIC5lbGMgZGlyZWN0b3JpZXMgZm9yIHZhcmlvdXMgZW1hY3MK OzsgICB2ZXJzaW9ucy4gIFRoYXQgd2F5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGNhbiB3b3Jr LiAgQnV0IHdvdWxkCjs7ICAgdGhpcyBicmVhayBhbnl0aGluZz8KOzsgLSBXaWxsaWFtIFh1IHN1 Z2dlc3RzIGJlaW5nIGFibGUgdG8gb3BlbiBhIHBhY2thZ2UgZmlsZSB3aXRob3V0Cjs7ICAgaW5z dGFsbGluZyBpdAo7OyAtIEludGVyZmFjZSB3aXRoIGRlc2t0b3AuZWwgc28gdGhhdCByZXN0YXJ0 aW5nIGFmdGVyIGFuIGluc3RhbGwKOzsgICB3b3JrcyBwcm9wZXJseQo7OyAtIFVzZSBoaWVyYXJj aGljYWwgbGF5b3V0LiAgUEtHL2V0YyBQS0cvbGlzcCBQS0cvaW5mbwo7OyAgIC4uLiBleGNlcHQg bWF5YmUgbGlzcD8KOzsgLSBJdCBtYXkgYmUgbmljZSB0byBoYXZlIGEgbWFjcm8gdGhhdCBleHBh bmRzIHRvIHRoZSBwYWNrYWdlJ3MKOzsgICBwcml2YXRlIGRhdGEgZGlyLCBha2EgIi4uLi9ldGMi LiAgT3IsIG1heWJlIGRhdGEtZGlyZWN0b3J5Cjs7ICAgbmVlZHMgdG8gYmUgYSBsaXN0ICh0aG91 Z2ggdGhpcyB3b3VsZCBiZSBsZXNzIG5pY2UpCjs7ICAgYSBmZXcgcGFja2FnZXMgd2FudCB0aGlz LCBlZyBzb2tvYmFuCjs7IC0gQWxsb3cgbXVsdGlwbGUgdmVyc2lvbnMgb24gdGhlIHNlcnZlciwg c28gdGhhdCBpZiBhIHVzZXIgZG9lc24ndAo7OyAgIG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Ig dGhlIG1vc3QgcmVjZW50IHZlcnNpb24gdGhleSBjYW4gc3RpbGwKOzsgICBpbnN0YWxsIGFuIG9s ZGVyIG9uZS4KOzsgLSBBbGxvdyBvcHRpb25hbCBwYWNrYWdlIGRlcGVuZGVuY2llcwo7OyAgIHRo ZW4gaWYgd2UgcmVxdWlyZSAnYmJkYicsIGJiZGItc3BlY2lmaWMgbGlzcCBpbiBsaXNwL2JiZGIK OzsgICBhbmQganVzdCBkb24ndCBjb21waWxlIHRvIGFkZCB0byBsb2FkIHBhdGggLi4uPwo7OyAt IE91ciB0cmVhdG1lbnQgb2YgdGhlIGluZm8gcGF0aCBpcyBzb21ld2hhdCBib2d1cwoKOzs7IENv ZGU6CgoocmVxdWlyZSAnY2wtbGliKQooZXZhbC13aGVuLWNvbXBpbGUgKHJlcXVpcmUgJ3N1YnIt eCkpCihldmFsLXdoZW4tY29tcGlsZSAocmVxdWlyZSAnZXBnKSkgICAgICA7Rm9yIHNldGYgYWNj ZXNzb3JzLgooZXZhbC13aGVuLWNvbXBpbGUgKHJlcXVpcmUgJ2lubGluZSkpICAgO0ZvciBgZGVm aW5lLWlubGluZScKKHJlcXVpcmUgJ2NvbXBhdCBuaWwgJ25vZXJyb3IpCihyZXF1aXJlICdzZXEp CgoocmVxdWlyZSAndGFidWxhdGVkLWxpc3QpCihyZXF1aXJlICdtYWNyb2V4cCkKKHJlcXVpcmUg J3VybC1oYW5kbGVycykKKHJlcXVpcmUgJ2Jyb3dzZS11cmwpCgooZGVmZ3JvdXAgcGFja2FnZSBu aWwKICAiTWFuYWdlciBmb3IgRW1hY3MgTGlzcCBwYWNrYWdlcy4iCiAgOmdyb3VwICdhcHBsaWNh dGlvbnMKICA6dmVyc2lvbiAiMjQuMSIpCgoMCjs7OyBDdXN0b21pemF0aW9uIG9wdGlvbnMKCjs7 OyMjI2F1dG9sb2FkCihkZWZjdXN0b20gcGFja2FnZS1lbmFibGUtYXQtc3RhcnR1cCB0CiAgIldo ZXRoZXIgdG8gbWFrZSBpbnN0YWxsZWQgcGFja2FnZXMgYXZhaWxhYmxlIHdoZW4gRW1hY3Mgc3Rh cnRzLgpJZiBub24tbmlsLCBwYWNrYWdlcyBhcmUgbWFkZSBhdmFpbGFibGUgYmVmb3JlIHJlYWRp bmcgdGhlIGluaXQKZmlsZSAoYnV0IGFmdGVyIHJlYWRpbmcgdGhlIGVhcmx5IGluaXQgZmlsZSku ICBUaGlzIG1lYW5zIHRoYXQgaWYKeW91IHdpc2ggdG8gc2V0IHRoaXMgdmFyaWFibGUsIHlvdSBt dXN0IGRvIHNvIGluIHRoZSBlYXJseSBpbml0CmZpbGUuICBSZWdhcmRsZXNzIG9mIHRoZSB2YWx1 ZSBvZiB0aGlzIHZhcmlhYmxlLCBwYWNrYWdlcyBhcmUgbm90Cm1hZGUgYXZhaWxhYmxlIGlmIGB1 c2VyLWluaXQtZmlsZScgaXMgbmlsIChlLmcuIEVtYWNzIHdhcyBzdGFydGVkCndpdGggXCItcVwi KS4KCkV2ZW4gaWYgdGhlIHZhbHVlIGlzIG5pbCwgeW91IGNhbiB0eXBlIFxcW3BhY2thZ2UtaW5p dGlhbGl6ZV0gdG8KbWFrZSBpbnN0YWxsZWQgcGFja2FnZXMgYXZhaWxhYmxlIGF0IGFueSB0aW1l LCBvciB5b3UgY2FuCmNhbGwgKHBhY2thZ2UtYWN0aXZhdGUtYWxsKSBpbiB5b3VyIGluaXQtZmls ZS4iCiAgOnR5cGUgJ2Jvb2xlYW4KICA6dmVyc2lvbiAiMjQuMSIpCgooZGVmY3VzdG9tIHBhY2th Z2UtbG9hZC1saXN0ICcoYWxsKQogICJMaXN0IG9mIHBhY2thZ2VzIGZvciBgcGFja2FnZS1hY3Rp dmF0ZS1hbGwnIHRvIG1ha2UgYXZhaWxhYmxlLgpFYWNoIGVsZW1lbnQgaW4gdGhpcyBsaXN0IHNo b3VsZCBiZSBhIGxpc3QgKE5BTUUgVkVSU0lPTiksIG9yIHRoZQpzeW1ib2wgYGFsbCcuICBUaGUg c3ltYm9sIGBhbGwnIHNheXMgdG8gbWFrZSBhdmFpbGFibGUgdGhlIGxhdGVzdAppbnN0YWxsZWQg dmVyc2lvbnMgb2YgYWxsIHBhY2thZ2VzIG5vdCBzcGVjaWZpZWQgYnkgb3RoZXIKZWxlbWVudHMu CgpGb3IgYW4gZWxlbWVudCAoTkFNRSBWRVJTSU9OKSwgTkFNRSBpcyBhIHBhY2thZ2UgbmFtZSAo YSBzeW1ib2wpLgpWRVJTSU9OIHNob3VsZCBiZSB0LCBhIHN0cmluZywgb3IgbmlsLgpJZiBWRVJT SU9OIGlzIHQsIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIGlzIG1hZGUgYXZhaWxhYmxlLgpJZiBW RVJTSU9OIGlzIGEgc3RyaW5nLCBvbmx5IHRoYXQgdmVyc2lvbiBpcyBldmVyIG1hZGUgYXZhaWxh YmxlLgogQW55IG90aGVyIHZlcnNpb24sIGV2ZW4gaWYgbmV3ZXIsIGlzIHNpbGVudGx5IGlnbm9y ZWQuCiBIZW5jZSwgdGhlIHBhY2thZ2UgaXMgXCJoZWxkXCIgYXQgdGhhdCB2ZXJzaW9uLgpJZiBW RVJTSU9OIGlzIG5pbCwgdGhlIHBhY2thZ2UgaXMgbm90IG1hZGUgYXZhaWxhYmxlIChpdCBpcyBc ImRpc2FibGVkXCIpLiIKICA6dHlwZSAnKHJlcGVhdCAoY2hvaWNlIChjb25zdCBhbGwpCiAgICAg ICAgICAgICAgICAgICAgICAgICAobGlzdCA6dGFnICJTcGVjaWZpYyBwYWNrYWdlIgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbCA6dGFnICJQYWNrYWdlIG5hbWUiKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNob2ljZSA6dGFnICJWZXJzaW9uIgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJkaXNhYmxlIiBuaWwpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIm1vc3QgcmVjZW50IiB0KQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcgOnRhZyAic3BlY2lmaWMgdmVy c2lvbiIpKSkpKQogIDpyaXNreSB0CiAgOnZlcnNpb24gIjI0LjEiKQoKKGRlZmN1c3RvbSBwYWNr YWdlLWFyY2hpdmVzIGAoKCJnbnUiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwo Zm9ybWF0ICJodHRwJXM6Ly9lbHBhLmdudS5vcmcvcGFja2FnZXMvIgogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChnbnV0bHMtYXZhaWxhYmxlLXApICJzIiAiIikp KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm5vbmdudSIgLgogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgLChmb3JtYXQgImh0dHAlczovL2VscGEubm9uZ251Lm9yZy9ub25n bnUvIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChnbnV0bHMt YXZhaWxhYmxlLXApICJzIiAiIikpKSkKICAiQW4gYWxpc3Qgb2YgYXJjaGl2ZXMgZnJvbSB3aGlj aCB0byBmZXRjaC4KVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvIHRoZSBHTlUgRW1hY3MgcGFj a2FnZSByZXBvc2l0b3J5LgoKRWFjaCBlbGVtZW50IGhhcyB0aGUgZm9ybSAoSUQgLiBMT0NBVElP TikuCiBJRCBpcyBhbiBhcmNoaXZlIG5hbWUsIGFzIGEgc3RyaW5nLgogTE9DQVRJT04gc3BlY2lm aWVzIHRoZSBiYXNlIGxvY2F0aW9uIGZvciB0aGUgYXJjaGl2ZS4KICBJZiBpdCBzdGFydHMgd2l0 aCBcImh0dHAocyk6XCIsIGl0IGlzIHRyZWF0ZWQgYXMgYW4gSFRUUChTKSBVUkw7CiAgb3RoZXJ3 aXNlIGl0IHNob3VsZCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KICAoT3RoZXIgdHlw ZXMgb2YgVVJMIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4pCgpPbmx5IGFkZCBsb2NhdGlv bnMgdGhhdCB5b3UgdHJ1c3QsIHNpbmNlIGZldGNoaW5nIGFuZCBpbnN0YWxsaW5nCmEgcGFja2Fn ZSBjYW4gcnVuIGFyYml0cmFyeSBjb2RlLgoKSFRUUFMgVVJMcyBzaG91bGQgYmUgdXNlZCB3aGVy ZSBwb3NzaWJsZSwgYXMgdGhleSBvZmZlciBzdXBlcmlvcgpzZWN1cml0eS4iCiAgOnR5cGUgJyhh bGlzdCA6a2V5LXR5cGUgKHN0cmluZyA6dGFnICJBcmNoaXZlIG5hbWUiKQogICAgICAgICAgICAg ICAgOnZhbHVlLXR5cGUgKHN0cmluZyA6dGFnICJVUkwgb3IgZGlyZWN0b3J5IG5hbWUiKSkKICA6 cmlza3kgdAogIDp2ZXJzaW9uICIyOC4xIikKCihkZWZjdXN0b20gcGFja2FnZS1tZW51LWhpZGUt bG93LXByaW9yaXR5ICdhcmNoaXZlCiAgIklmIG5vbi1uaWwsIGhpZGUgbG93IHByaW9yaXR5IHBh Y2thZ2VzIGZyb20gdGhlIHBhY2thZ2VzIG1lbnUuCkEgcGFja2FnZSBpcyBjb25zaWRlcmVkIGxv dyBwcmlvcml0eSBpZiB0aGVyZSdzIGFub3RoZXIgdmVyc2lvbgpvZiBpdCBhdmFpbGFibGUgc3Vj aCB0aGF0OgogICAgKGEpIHRoZSBhcmNoaXZlIG9mIHRoZSBvdGhlciBwYWNrYWdlIGlzIGhpZ2hl ciBwcmlvcml0eSB0aGFuCiAgICB0aGlzIG9uZSwgYXMgcGVyIGBwYWNrYWdlLWFyY2hpdmUtcHJp b3JpdGllcyc7CiAgb3IKICAgIChiKSB0aGV5IGJvdGggaGF2ZSB0aGUgc2FtZSBhcmNoaXZlIHBy aW9yaXR5IGJ1dCB0aGUgb3RoZXIKICAgIHBhY2thZ2UgaGFzIGEgaGlnaGVyIHZlcnNpb24gbnVt YmVyLgoKVGhpcyB2YXJpYWJsZSBoYXMgdGhyZWUgcG9zc2libGUgdmFsdWVzOgogICAgbmlsOiBu byBwYWNrYWdlcyBhcmUgaGlkZGVuOwogICAgYGFyY2hpdmUnOiBvbmx5IGNyaXRlcmlvbiAoYSkg aXMgdXNlZDsKICAgIHQ6IGJvdGggY3JpdGVyaWEgYXJlIHVzZWQuCgpUaGlzIHZhcmlhYmxlIGhh cyBubyBlZmZlY3QgaWYgYHBhY2thZ2UtbWVudS0taGlkZS1wYWNrYWdlcycgaXMKbmlsLCBzbyBp dCBjYW4gYmUgdG9nZ2xlZCB3aXRoIFxcPHBhY2thZ2UtbWVudS1tb2RlLW1hcD5cXFtwYWNrYWdl LW1lbnUtdG9nZ2xlLWhpZGluZ10uIgogIDp0eXBlICcoY2hvaWNlIChjb25zdCA6dGFnICJEb24n dCBoaWRlIGFueXRoaW5nIiBuaWwpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIkhpZGUg cGVyIHBhY2thZ2UtYXJjaGl2ZS1wcmlvcml0aWVzIgogICAgICAgICAgICAgICAgICAgICAgICBh cmNoaXZlKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJIaWRlIHBlciBhcmNoaXZlIGFu ZCB2ZXJzaW9uIG51bWJlciIgdCkpCiAgOnZlcnNpb24gIjI1LjEiKQoKKGRlZmN1c3RvbSBwYWNr YWdlLWFyY2hpdmUtcHJpb3JpdGllcyBuaWwKICAiQW4gYWxpc3Qgb2YgcHJpb3JpdGllcyBmb3Ig cGFja2FnZXMuCgpFYWNoIGVsZW1lbnQgaGFzIHRoZSBmb3JtIChBUkNISVZFLUlEIC4gUFJJT1JJ VFkpLgoKV2hlbiBpbnN0YWxsaW5nIHBhY2thZ2VzLCB0aGUgcGFja2FnZSB3aXRoIHRoZSBoaWdo ZXN0IHZlcnNpb24KbnVtYmVyIGZyb20gdGhlIGFyY2hpdmUgd2l0aCB0aGUgaGlnaGVzdCBwcmlv cml0eSBpcwpzZWxlY3RlZC4gIFdoZW4gaGlnaGVyIHZlcnNpb25zIGFyZSBhdmFpbGFibGUgZnJv bSBhcmNoaXZlcyB3aXRoCmxvd2VyIHByaW9yaXRpZXMsIHRoZSB1c2VyIGhhcyB0byBzZWxlY3Qg dGhvc2UgbWFudWFsbHkuCgpBcmNoaXZlcyBub3QgaW4gdGhpcyBsaXN0IGhhdmUgdGhlIHByaW9y aXR5IDAsIGFzIGhhdmUgcGFja2FnZXMKdGhhdCBhcmUgYWxyZWFkeSBpbnN0YWxsZWQuICBJZiB5 b3UgdXNlIG5lZ2F0aXZlIHByaW9yaXRpZXMgZm9yCnRoZSBhcmNoaXZlcywgdGhleSB3aWxsIG5v dCBiZSB1cGdyYWRlZCBhdXRvbWF0aWNhbGx5LgoKU2VlIGFsc28gYHBhY2thZ2UtbWVudS1oaWRl LWxvdy1wcmlvcml0eScuIgogIDp0eXBlICcoYWxpc3QgOmtleS10eXBlIChzdHJpbmcgOnRhZyAi QXJjaGl2ZSBuYW1lIikKICAgICAgICAgICAgICAgIDp2YWx1ZS10eXBlIChpbnRlZ2VyIDp0YWcg IlByaW9yaXR5IChkZWZhdWx0IGlzIDApIikpCiAgOnJpc2t5IHQKICA6dmVyc2lvbiAiMjUuMSIp CgooZGVmY3VzdG9tIHBhY2thZ2UtcGlubmVkLXBhY2thZ2VzIG5pbAogICJBbiBhbGlzdCBvZiBw YWNrYWdlcyB0aGF0IGFyZSBwaW5uZWQgdG8gc3BlY2lmaWMgYXJjaGl2ZXMuClRoaXMgY2FuIGJl IHVzZWZ1bCBpZiB5b3UgaGF2ZSBtdWx0aXBsZSBwYWNrYWdlIGFyY2hpdmVzIGVuYWJsZWQsCmFu ZCB3YW50IHRvIGNvbnRyb2wgd2hpY2ggYXJjaGl2ZSBhIGdpdmVuIHBhY2thZ2UgZ2V0cyBpbnN0 YWxsZWQgZnJvbS4KCkVhY2ggZWxlbWVudCBvZiB0aGUgYWxpc3QgaGFzIHRoZSBmb3JtIChQQUNL QUdFIC4gQVJDSElWRSksIHdoZXJlOgogUEFDS0FHRSBpcyBhIHN5bWJvbCByZXByZXNlbnRpbmcg YSBwYWNrYWdlCiBBUkNISVZFIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhbiBhcmNoaXZlIChp dCBzaG91bGQgYmUgdGhlIGNhciBvZgphbiBlbGVtZW50IGluIGBwYWNrYWdlLWFyY2hpdmVzJywg ZS5nLiBcImdudVwiKS4KCkFkZGluZyBhbiBlbnRyeSB0byB0aGlzIHZhcmlhYmxlIG1lYW5zIHRo YXQgb25seSBBUkNISVZFIHdpbGwgYmUKY29uc2lkZXJlZCBhcyBhIHNvdXJjZSBmb3IgUEFDS0FH RS4gIElmIG90aGVyIGFyY2hpdmVzIHByb3ZpZGUgUEFDS0FHRSwKdGhleSBhcmUgaWdub3JlZCAo Zm9yIHRoaXMgcGFja2FnZSkuICBJZiBBUkNISVZFIGRvZXMgbm90IGNvbnRhaW4gUEFDS0FHRSwK dGhlIHBhY2thZ2Ugd2lsbCBiZSB1bmF2YWlsYWJsZS4iCiAgOnR5cGUgJyhhbGlzdCA6a2V5LXR5 cGUgKHN5bWJvbCA6dGFnICJQYWNrYWdlIikKICAgICAgICAgICAgICAgIDp2YWx1ZS10eXBlIChz dHJpbmcgOnRhZyAiQXJjaGl2ZSBuYW1lIikpCiAgOzsgVGhpcyBjb3VsZCBwcmV2ZW50IHlvdSBm cm9tIHJlY2VpdmluZyB1cGRhdGVzIGZvciBhIHBhY2thZ2UsCiAgOzsgdmlhIGFuIGVudHJ5IChQ QUNLQUdFIC4gTk9OLUVYSVNUSU5HKS4gIFdoaWNoIGNvdWxkIGJlIGFuIGlzc3VlCiAgOzsgaWYg UEFDS0FHRSBoYXMgYSBrbm93biB2dWxuZXJhYmlsaXR5IHRoYXQgaXMgZml4ZWQgaW4gbmV3ZXIg dmVyc2lvbnMuCiAgOnJpc2t5IHQKICA6dmVyc2lvbiAiMjQuNCIpCgo7OzsjIyNhdXRvbG9hZAoo ZGVmY3VzdG9tIHBhY2thZ2UtdXNlci1kaXIgKGxvY2F0ZS11c2VyLWVtYWNzLWZpbGUgImVscGEi KQogICJEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdXNlcidzIEVtYWNzIExpc3AgcGFja2FnZXMu ClRoZSBkaXJlY3RvcnkgbmFtZSBzaG91bGQgYmUgYWJzb2x1dGUuCkFwYXJ0IGZyb20gdGhpcyBk aXJlY3RvcnksIEVtYWNzIGFsc28gbG9va3MgZm9yIHN5c3RlbS13aWRlCnBhY2thZ2VzIGluIGBw YWNrYWdlLWRpcmVjdG9yeS1saXN0Jy4iCiAgOnR5cGUgJ2RpcmVjdG9yeQogIDppbml0aWFsaXpl ICMnY3VzdG9tLWluaXRpYWxpemUtZGVsYXkKICA6cmlza3kgdAogIDpncm91cCAnYXBwbGljYXRp b25zCiAgOnZlcnNpb24gIjI0LjEiKQoKOzs7IyMjYXV0b2xvYWQKKGRlZmN1c3RvbSBwYWNrYWdl LWRpcmVjdG9yeS1saXN0CiAgOzsgRGVmYXVsdHMgYXJlIHN1YmRpcnMgbmFtZWQgImVscGEiIGlu IHRoZSBzaXRlLWxpc3AgZGlycy4KICAobGV0IChyZXN1bHQpCiAgICAoZG9saXN0IChmIGxvYWQt cGF0aCkKICAgICAgKGFuZCAoc3RyaW5ncCBmKQogICAgICAgICAgIChlcXVhbCAoZmlsZS1uYW1l LW5vbmRpcmVjdG9yeSBmKSAic2l0ZS1saXNwIikKICAgICAgICAgICAocHVzaCAoZXhwYW5kLWZp bGUtbmFtZSAiZWxwYSIgZikgcmVzdWx0KSkpCiAgICAobnJldmVyc2UgcmVzdWx0KSkKICAiTGlz dCBvZiBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgRW1hY3MgTGlzcCBwYWNrYWdl cy4KRWFjaCBkaXJlY3RvcnkgbmFtZSBzaG91bGQgYmUgYWJzb2x1dGUuCgpUaGVzZSBkaXJlY3Rv cmllcyBjb250YWluIHBhY2thZ2VzIGludGVuZGVkIGZvciBzeXN0ZW0td2lkZTsgaW4KY29udHJh c3QsIGBwYWNrYWdlLXVzZXItZGlyJyBjb250YWlucyBwYWNrYWdlcyBmb3IgcGVyc29uYWwgdXNl LiIKICA6dHlwZSAnKHJlcGVhdCBkaXJlY3RvcnkpCiAgOmluaXRpYWxpemUgIydjdXN0b20taW5p dGlhbGl6ZS1kZWxheQogIDpncm91cCAnYXBwbGljYXRpb25zCiAgOnJpc2t5IHQKICA6dmVyc2lv biAiMjQuMSIpCgooZGVjbGFyZS1mdW5jdGlvbiBlcGctZmluZC1jb25maWd1cmF0aW9uICJlcGct Y29uZmlnIgogICAgICAgICAgICAgICAgICAocHJvdG9jb2wgJm9wdGlvbmFsIG5vLWNhY2hlIHBy b2dyYW0tYWxpc3QpKQoKKGRlZmN1c3RvbSBwYWNrYWdlLWdudXBnaG9tZS1kaXIgKGV4cGFuZC1m aWxlLW5hbWUgImdudXBnIiBwYWNrYWdlLXVzZXItZGlyKQogICJEaXJlY3RvcnkgY29udGFpbmlu ZyBHbnVQRyBrZXlyaW5nIG9yIG5pbC4KVGhpcyB2YXJpYWJsZSBzcGVjaWZpZXMgdGhlIEdudVBH IGhvbWUgZGlyZWN0b3J5IHVzZWQgYnkgcGFja2FnZS4KVGhhdCBkaXJlY3RvcnkgaXMgcGFzc2Vk IHZpYSB0aGUgb3B0aW9uIFwiLS1ob21lZGlyXCIgdG8gR251UEcuCklmIG5pbCwgZG8gbm90IHVz ZSB0aGUgb3B0aW9uIFwiLS1ob21lZGlyXCIsIGJ1dCBzdGljayB3aXRoIEdudVBHJ3MKZGVmYXVs dCBkaXJlY3RvcnkuIgogIDp0eXBlIGAoY2hvaWNlCiAgICAgICAgICAoY29uc3QKICAgICAgICAg ICA6dGFnICJEZWZhdWx0IEVtYWNzIHBhY2thZ2UgbWFuYWdlbWVudCBHbnVQRyBob21lIGRpcmVj dG9yeSIKICAgICAgICAgICAsKGV4cGFuZC1maWxlLW5hbWUgImdudXBnIiBwYWNrYWdlLXVzZXIt ZGlyKSkKICAgICAgICAgIChjb25zdAogICAgICAgICAgIDp0YWcgIkRlZmF1bHQgR251UEcgZGly ZWN0b3J5IChHbnVQRyBvcHRpb24gLS1ob21lZGlyIG5vdCB1c2VkKSIKICAgICAgICAgICBuaWwp CiAgICAgICAgICAoZGlyZWN0b3J5IDp0YWcgIkEgc3BlY2lmaWMgR251UEcgLS1ob21lZGlyIikp CiAgOnJpc2t5IHQKICA6dmVyc2lvbiAiMjYuMSIpCgooZGVmY3VzdG9tIHBhY2thZ2UtY2hlY2st c2lnbmF0dXJlICdhbGxvdy11bnNpZ25lZAogICJOb24tbmlsIG1lYW5zIHRvIGNoZWNrIHBhY2th Z2Ugc2lnbmF0dXJlcyB3aGVuIGluc3RhbGxpbmcuCgpUaGlzIGFsc28gYXBwbGllcyB0byB0aGUg XCJhcmNoaXZlLWNvbnRlbnRzXCIgZmlsZSB0aGF0IGxpc3RzIHRoZQpjb250ZW50cyBvZiB0aGUg YXJjaGl2ZS4KClRoZSB2YWx1ZSBjYW4gYmUgb25lIG9mOgoKICB0ICAgICAgICAgICAgICAgICAg QWNjZXB0IGEgcGFja2FnZSBvbmx5IGlmIGl0IGNvbWVzIHdpdGggYXQgbGVhc3QKICAgICAgICAg ICAgICAgICAgICAgb25lIHZlcmlmaWVkIHNpZ25hdHVyZS4KCiAgYGFsbCcgICAgICAgICAgICAg IFNhbWUgYXMgdCwgYnV0IHZlcmlmeSBhbGwgc2lnbmF0dXJlcyBpZiB0aGVyZQogICAgICAgICAg ICAgICAgICAgICBhcmUgbW9yZSB0aGFuIG9uZS4KCiAgYGFsbG93LXVuc2lnbmVkJyAgIEluc3Rh bGwgYSBwYWNrYWdlIGV2ZW4gaWYgaXQgaXMgdW5zaWduZWQsCiAgICAgICAgICAgICAgICAgICAg IGJ1dCB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBpZiBwb3NzaWJsZSAodGhhdAogICAgICAgICAgICAg ICAgICAgICBpcywgaWYgaXQgaXMgc2lnbmVkLCB3ZSBoYXZlIHRoZSBrZXkgZm9yIGl0LAogICAg ICAgICAgICAgICAgICAgICBhbmQgR251UEcgaXMgaW5zdGFsbGVkKS4KCiAgbmlsICAgICAgICAg ICAgICAgIFBhY2thZ2Ugc2lnbmF0dXJlcyBhcmUgaWdub3JlZC4iCiAgOnR5cGUgJyhjaG9pY2Ug KGNvbnN0IDp2YWx1ZSBuaWwgICAgICAgICAgICA6dGFnICJOZXZlciIpCiAgICAgICAgICAgICAg ICAgKGNvbnN0IDp2YWx1ZSBhbGxvdy11bnNpZ25lZCA6dGFnICJBbGxvdyB1bnNpZ25lZCIpCiAg ICAgICAgICAgICAgICAgKGNvbnN0IDp2YWx1ZSB0ICAgICAgICAgICAgICA6dGFnICJDaGVjayBh bHdheXMiKQogICAgICAgICAgICAgICAgIChjb25zdCA6dmFsdWUgYWxsICAgICAgICAgICAgOnRh ZyAiQ2hlY2sgYWx3YXlzIChhbGwgc2lnbmF0dXJlcykiKSkKICA6cmlza3kgdAogIDp2ZXJzaW9u ICIyNy4xIikKCihkZWZ1biBwYWNrYWdlLWNoZWNrLXNpZ25hdHVyZSAoKQogICJDaGVjayB3aGV0 aGVyIHdlIGhhdmUgYSB1c2FibGUgT3BlblBHUCBjb25maWd1cmF0aW9uLgpJZiBzbywgYW5kIHZh cmlhYmxlIGBwYWNrYWdlLWNoZWNrLXNpZ25hdHVyZScgaXMKYGFsbG93LXVuc2lnbmVkJywgcmV0 dXJuIGBhbGxvdy11bnNpZ25lZCcsIG90aGVyd2lzZSByZXR1cm4gdGhlCnZhbHVlIG9mIHZhcmlh YmxlIGBwYWNrYWdlLWNoZWNrLXNpZ25hdHVyZScuIgogIChpZiAoZXEgcGFja2FnZS1jaGVjay1z aWduYXR1cmUgJ2FsbG93LXVuc2lnbmVkKQogICAgICAoYW5kIChlcGctZmluZC1jb25maWd1cmF0 aW9uICdPcGVuUEdQKQogICAgICAgICAgICdhbGxvdy11bnNpZ25lZCkKICAgIHBhY2thZ2UtY2hl Y2stc2lnbmF0dXJlKSkKCihkZWZjdXN0b20gcGFja2FnZS11bnNpZ25lZC1hcmNoaXZlcyBuaWwK ICAiTGlzdCBvZiBhcmNoaXZlcyB3aGVyZSB3ZSBkbyBub3QgY2hlY2sgZm9yIHBhY2thZ2Ugc2ln bmF0dXJlcy4KVGhpcyBzaG91bGQgYmUgYSBsaXN0IG9mIHN0cmluZ3MgbWF0Y2hpbmcgdGhlIG5h bWVzIG9mIHBhY2thZ2UKYXJjaGl2ZXMgaW4gdGhlIHZhcmlhYmxlIGBwYWNrYWdlLWFyY2hpdmVz Jy4iCiAgOnR5cGUgJyhyZXBlYXQgKHN0cmluZyA6dGFnICJBcmNoaXZlIG5hbWUiKSkKICA6cmlz a3kgdAogIDp2ZXJzaW9uICIyNC40IikKCihkZWZjdXN0b20gcGFja2FnZS1zZWxlY3RlZC1wYWNr YWdlcyBuaWwKICAiU3RvcmUgaGVyZSBwYWNrYWdlcyBpbnN0YWxsZWQgZXhwbGljaXRseSBieSB1 c2VyLgpUaGlzIHZhcmlhYmxlIGlzIGZlZCBhdXRvbWF0aWNhbGx5IGJ5IEVtYWNzIHdoZW4gaW5z dGFsbGluZyBhIG5ldyBwYWNrYWdlLgpUaGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgYHBhY2thZ2Ut YXV0b3JlbW92ZScgdG8gZGVjaWRlCndoaWNoIHBhY2thZ2VzIGFyZSBubyBsb25nZXIgbmVlZGVk LgpZb3UgY2FuIHVzZSBpdCB0byAocmUpaW5zdGFsbCBwYWNrYWdlcyBvbiBvdGhlciBtYWNoaW5l cwpieSBydW5uaW5nIGBwYWNrYWdlLWluc3RhbGwtc2VsZWN0ZWQtcGFja2FnZXMnLgoKVG8gY2hl Y2sgaWYgYSBwYWNrYWdlIGlzIGNvbnRhaW5lZCBpbiB0aGlzIGxpc3QgaGVyZSwgdXNlCmBwYWNr YWdlLS11c2VyLXNlbGVjdGVkLXAnLCBhcyBpdCBtYXkgcG9wdWxhdGUgdGhlIHZhcmlhYmxlIHdp dGgKYSBzYW5lIGluaXRpYWwgdmFsdWUuIgogIDp2ZXJzaW9uICIyNS4xIgogIDp0eXBlICcocmVw ZWF0IHN5bWJvbCkpCgooZGVmY3VzdG9tIHBhY2thZ2UtbmF0aXZlLWNvbXBpbGUgbmlsCiAgIk5v bi1uaWwgbWVhbnMgdG8gbmF0aXZlbHkgY29tcGlsZSBwYWNrYWdlcyBhcyBwYXJ0IG9mIHRoZWly IGluc3RhbGxhdGlvbi4KVGhpcyBjb250cm9scyBhaGVhZC1vZi10aW1lIGNvbXBpbGF0aW9uIG9m IHBhY2thZ2VzIHdoZW4gdGhleSBhcmUKaW5zdGFsbGVkLiAgSWYgdGhpcyBvcHRpb24gaXMgbmls LCBwYWNrYWdlcyB3aWxsIGJlIG5hdGl2ZWx5CmNvbXBpbGVkIHdoZW4gdGhleSBhcmUgbG9hZGVk IGZvciB0aGUgZmlyc3QgdGltZS4KClRoaXMgb3B0aW9uIGRvZXMgbm90IGhhdmUgYW55IGVmZmVj dCBpZiBFbWFjcyB3YXMgbm90IGJ1aWx0IHdpdGgKbmF0aXZlIGNvbXBpbGF0aW9uIHN1cHBvcnQu IgogIDp0eXBlICcoYm9vbGVhbikKICA6cmlza3kgdAogIDp2ZXJzaW9uICIyOC4xIikKCihkZWZj dXN0b20gcGFja2FnZS1tZW51LWFzeW5jIHQKICAiSWYgbm9uLW5pbCwgcGFja2FnZS1tZW51IHdp bGwgdXNlIGFzeW5jIG9wZXJhdGlvbnMgd2hlbiBwb3NzaWJsZS4KQ3VycmVudGx5LCBvbmx5IHRo ZSByZWZyZXNoaW5nIG9mIGFyY2hpdmUgY29udGVudHMgc3VwcG9ydHMKYXN5bmNocm9ub3VzIG9w ZXJhdGlvbnMuICBQYWNrYWdlIHRyYW5zYWN0aW9ucyBhcmUgc3RpbGwgZG9uZQpzeW5jaHJvbm91 c2x5LiIKICA6dHlwZSAnYm9vbGVhbgogIDp2ZXJzaW9uICIyNS4xIikKCihkZWZjdXN0b20gcGFj a2FnZS1uYW1lLWNvbHVtbi13aWR0aCAzMAogICJDb2x1bW4gd2lkdGggZm9yIHRoZSBQYWNrYWdl IG5hbWUgaW4gdGhlIHBhY2thZ2UgbWVudS4iCiAgOnR5cGUgJ25hdG51bQogIDp2ZXJzaW9uICIy OC4xIikKCihkZWZjdXN0b20gcGFja2FnZS12ZXJzaW9uLWNvbHVtbi13aWR0aCAxNAogICJDb2x1 bW4gd2lkdGggZm9yIHRoZSBQYWNrYWdlIHZlcnNpb24gaW4gdGhlIHBhY2thZ2UgbWVudS4iCiAg OnR5cGUgJ25hdG51bQogIDp2ZXJzaW9uICIyOC4xIikKCihkZWZjdXN0b20gcGFja2FnZS1zdGF0 dXMtY29sdW1uLXdpZHRoIDEyCiAgIkNvbHVtbiB3aWR0aCBmb3IgdGhlIFBhY2thZ2Ugc3RhdHVz IGluIHRoZSBwYWNrYWdlIG1lbnUuIgogIDp0eXBlICduYXRudW0KICA6dmVyc2lvbiAiMjguMSIp CgooZGVmY3VzdG9tIHBhY2thZ2UtYXJjaGl2ZS1jb2x1bW4td2lkdGggOAogICJDb2x1bW4gd2lk dGggZm9yIHRoZSBQYWNrYWdlIGFyY2hpdmUgaW4gdGhlIHBhY2thZ2UgbWVudS4iCiAgOnR5cGUg J25hdG51bQogIDp2ZXJzaW9uICIyOC4xIikKCgwKOzs7IGBwYWNrYWdlLWRlc2MnIG9iamVjdCBk ZWZpbml0aW9uCjs7IFRoaXMgaXMgdGhlIHN0cnVjdCB1c2VkIGludGVybmFsbHkgdG8gcmVwcmVz ZW50IHBhY2thZ2VzLgo7OyBGdW5jdGlvbnMgdGhhdCBkZWFsIHdpdGggcGFja2FnZXMgc2hvdWxk IGdlbmVyYWxseSB0YWtlIHRoaXMgb2JqZWN0Cjs7IGFzIGFuIGFyZ3VtZW50LiAgSW4gc29tZSBz aXR1YXRpb25zIChlLmcuIGNvbW1hbmRzIHRoYXQgcXVlcnkgdGhlCjs7IHVzZXIpIGl0IG1ha2Vz IHNlbnNlIHRvIHRha2UgdGhlIHBhY2thZ2UgbmFtZSBhcyBhIHN5bWJvbCBpbnN0ZWFkLAo7OyBi dXQga2VlcCBpbiBtaW5kIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGBwYWNrYWdlLWRlc2MncyB3 aXRoIHRoZQo7OyBzYW1lIG5hbWUuCgooZGVmdmFyIHBhY2thZ2UtLWRlZmF1bHQtc3VtbWFyeSAi Tm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLiIpCgooZGVmaW5lLWlubGluZSBwYWNrYWdlLXZjLXAg KHBrZy1kZXNjKQogICJSZXR1cm4gbm9uLW5pbCBpZiBQS0ctREVTQyBpcyBhIFZDIHBhY2thZ2Uu IgogIChpbmxpbmUtbGV0ZXZhbHMgKHBrZy1kZXNjKQogICAgKGlubGluZS1xdW90ZSAoZXEgKHBh Y2thZ2UtZGVzYy1raW5kICxwa2ctZGVzYykgJ3ZjKSkpKQoKKGNsLWRlZnN0cnVjdCAocGFja2Fn ZS1kZXNjCiAgICAgICAgICAgICAgIDs7IFJlbmFtZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBm cm9tIGBtYWtlLXBhY2thZ2UtZGVzYycuCiAgICAgICAgICAgICAgICg6Y29uc3RydWN0b3IgcGFj a2FnZS1kZXNjLWNyZWF0ZSkKICAgICAgICAgICAgICAgOzsgSGFzIHRoZSBzYW1lIGludGVyZmFj ZSBhcyB0aGUgb2xkIGBkZWZpbmUtcGFja2FnZScsCiAgICAgICAgICAgICAgIDs7IHdoaWNoIGlz IHN0aWxsIHVzZWQgaW4gdGhlICJmb28tcGtnLmVsIiBmaWxlcy4gRXh0cmEKICAgICAgICAgICAg ICAgOzsgb3B0aW9ucyBjYW4gYmUgc3VwcG9ydGVkIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGtleXMu CiAgICAgICAgICAgICAgICg6Y29uc3RydWN0b3IKICAgICAgICAgICAgICAgIHBhY2thZ2UtZGVz Yy1mcm9tLWRlZmluZQogICAgICAgICAgICAgICAgKG5hbWUtc3RyaW5nIHZlcnNpb24tc3RyaW5n ICZvcHRpb25hbCBzdW1tYXJ5IHJlcXVpcmVtZW50cwogICAgICAgICAgICAgICAgICZyZXN0IHJl c3QtcGxpc3QKICAgICAgICAgICAgICAgICAmYXV4CiAgICAgICAgICAgICAgICAgKG5hbWUgKGlu dGVybiBuYW1lLXN0cmluZykpCiAgICAgICAgICAgICAgICAgKHZlcnNpb24gKGlmIChlcSAoY2Fy LXNhZmUgdmVyc2lvbi1zdHJpbmcpICd2YykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KHZlcnNpb24tdG8tbGlzdCAoY2RyIHZlcnNpb24tc3RyaW5nKSkKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICh2ZXJzaW9uLXRvLWxpc3QgdmVyc2lvbi1zdHJpbmcpKSkKICAgICAgICAgICAg ICAgICAocmVxcyAobWFwY2FyIChsYW1iZGEgKGVsdCkKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGxpc3QgKGNhciBlbHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICh2ZXJzaW9uLXRvLWxpc3QgKGNhZHIgZWx0KSkpKQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGlmIChlcSAncXVvdGUgKGNhciByZXF1aXJlbWVudHMpKQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChudGggMSByZXF1aXJlbWVudHMpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50cykpKQogICAgICAgICAgICAgICAgIChr aW5kIChwbGlzdC1nZXQgcmVzdC1wbGlzdCA6a2luZCkpCiAgICAgICAgICAgICAgICAgKGFyY2hp dmUgKHBsaXN0LWdldCByZXN0LXBsaXN0IDphcmNoaXZlKSkKICAgICAgICAgICAgICAgICAoZXh0 cmFzIChsZXQgKGFsaXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpbGUgcmVzdC1w bGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmxlc3MgKG1lbXEgKGNhciByZXN0 LXBsaXN0KSAnKDpraW5kIDphcmNoaXZlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChsZXQgKCh2YWx1ZSAoY2FkciByZXN0LXBsaXN0KSkpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICh3aGVuIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KHB1c2ggKGNvbnMgKGNhciByZXN0LXBsaXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChpZiAoZXEgKGNhci1zYWZlIHZhbHVlKSAncXVvdGUpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWRyIHZhbHVl KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUp KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaXN0KSkpKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIHJlc3QtcGxpc3QgKGNkZHIgcmVzdC1wbGlz dCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlzdCkpKSkpCiAgIlN0cnVjdHVyZSBj b250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGFuIGluZGl2aWR1YWwgcGFja2FnZS4KU2xvdHM6 CgpgbmFtZScJTmFtZSBvZiB0aGUgcGFja2FnZSwgYXMgYSBzeW1ib2wuCgpgdmVyc2lvbicgVmVy c2lvbiBvZiB0aGUgcGFja2FnZSwgYXMgYSB2ZXJzaW9uIGxpc3QuCgpgc3VtbWFyeScgU2hvcnQg ZGVzY3JpcHRpb24gb2YgdGhlIHBhY2thZ2UsIHR5cGljYWxseSB0YWtlbiBmcm9tCiAgICAgICAg dGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZpbGUuCgpgcmVxcycJUmVxdWlyZW1lbnRzIG9mIHRoZSBw YWNrYWdlLiAgQSBsaXN0IG9mIChQQUNLQUdFCiAgICAgICAgVkVSU0lPTi1MSVNUKSBuYW1pbmcg dGhlIGRlcGVuZGVudCBwYWNrYWdlIGFuZCB0aGUgbWluaW11bQogICAgICAgIHJlcXVpcmVkIHZl cnNpb24uCgpga2luZCcJVGhlIGRpc3RyaWJ1dGlvbiBmb3JtYXQgb2YgdGhlIHBhY2thZ2UuICBD dXJyZW50bHksIGl0IGlzCiAgICAgICAgZWl0aGVyIGBzaW5nbGUnIG9yIGB0YXInLgoKYGFyY2hp dmUnIFRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIChhcyBhIHN0cmluZykgd2hlbmNlIHRoaXMKICAg ICAgICBwYWNrYWdlIGNhbWUuCgpgZGlyJwlUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBwYWNrYWdl IGlzIGluc3RhbGxlZCAoaWYgaW5zdGFsbGVkKSwKICAgICAgICBgYnVpbHRpbicgaWYgaXQgaXMg YnVpbHQtaW4sIG9yIG5pbCBvdGhlcndpc2UuCgpgZXh0cmFzJyBPcHRpb25hbCBhbGlzdCBvZiBh ZGRpdGlvbmFsIGtleXdvcmQtdmFsdWUgcGFpcnMuCgpgc2lnbmVkJyBGbGFnIHRvIGluZGljYXRl IHRoYXQgdGhlIHBhY2thZ2UgaXMgc2lnbmVkIGJ5IHByb3ZpZGVyLiIKICBuYW1lCiAgdmVyc2lv bgogIChzdW1tYXJ5IHBhY2thZ2UtLWRlZmF1bHQtc3VtbWFyeSkKICByZXFzCiAga2luZAogIGFy Y2hpdmUKICBkaXIKICBleHRyYXMKICBzaWduZWQpCgooZGVmdW4gcGFja2FnZS0tZnJvbS1idWls dGluIChiaS1kZXNjKQogICJDcmVhdGUgYSBgcGFja2FnZS1kZXNjJyBvYmplY3QgZnJvbSBCSS1E RVNDLgpCSS1ERVNDIHNob3VsZCBiZSBhIGBwYWNrYWdlLS1iaS1kZXNjJyBvYmplY3QuIgogIChw YWNrYWdlLWRlc2MtY3JlYXRlIDpuYW1lIChwb3AgYmktZGVzYykKICAgICAgICAgICAgICAgICAg ICAgICA6dmVyc2lvbiAocGFja2FnZS0tYmktZGVzYy12ZXJzaW9uIGJpLWRlc2MpCiAgICAgICAg ICAgICAgICAgICAgICAgOnN1bW1hcnkgKHBhY2thZ2UtLWJpLWRlc2Mtc3VtbWFyeSBiaS1kZXNj KQogICAgICAgICAgICAgICAgICAgICAgIDpkaXIgJ2J1aWx0aW4pKQoKOzsgUHNldWRvIGZpZWxk cy4KKGRlZnVuIHBhY2thZ2UtdmVyc2lvbi1qb2luICh2bGlzdCkKICAiUmV0dXJuIHRoZSB2ZXJz aW9uIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXN0IFZMSVNULgpUaGlzIGlzLCBhcHBy b3hpbWF0ZWx5LCB0aGUgaW52ZXJzZSBvZiBgdmVyc2lvbi10by1saXN0Jy4KXChBY3R1YWxseSwg aXQgcmV0dXJucyBvbmx5IG9uZSBvZiB0aGUgcG9zc2libGUgaW52ZXJzZXMsIHNpbmNlCmB2ZXJz aW9uLXRvLWxpc3QnIGlzIGEgbWFueS10by1vbmUgb3BlcmF0aW9uLikiCiAgKGlmIChudWxsIHZs aXN0KQogICAgICAiIgogICAgKGxldCAoKHN0ci1saXN0IChsaXN0ICIuIiAoaW50LXRvLXN0cmlu ZyAoY2FyIHZsaXN0KSkpKSkKICAgICAgKGRvbGlzdCAobnVtIChjZHIgdmxpc3QpKQogICAgICAg IChjb25kCiAgICAgICAgICgoPj0gbnVtIDApCiAgICAgICAgICAocHVzaCAoaW50LXRvLXN0cmlu ZyBudW0pIHN0ci1saXN0KQogICAgICAgICAgKHB1c2ggIi4iIHN0ci1saXN0KSkKICAgICAgICAg KCg8IG51bSAtNCkKICAgICAgICAgIChlcnJvciAiSW52YWxpZCB2ZXJzaW9uIGxpc3QgYCVzJyIg dmxpc3QpKQogICAgICAgICAodAogICAgICAgICAgOzsgcHJlLCBvciBiZXRhLCBvciBhbHBoYQog ICAgICAgICAgKGNvbmQgKChlcXVhbCAiLiIgKGNhciBzdHItbGlzdCkpCiAgICAgICAgICAgICAg ICAgKHBvcCBzdHItbGlzdCkpCiAgICAgICAgICAgICAgICAoKG5vdCAoc3RyaW5nLW1hdGNoICJb MC05XSsiIChjYXIgc3RyLWxpc3QpKSkKICAgICAgICAgICAgICAgICAoZXJyb3IgIkludmFsaWQg dmVyc2lvbiBsaXN0IGAlcyciIHZsaXN0KSkpCiAgICAgICAgICAocHVzaCAoY29uZCAoKD0gbnVt IC0xKSAicHJlIikKICAgICAgICAgICAgICAgICAgICAgICgoPSBudW0gLTIpICJiZXRhIikKICAg ICAgICAgICAgICAgICAgICAgICgoPSBudW0gLTMpICJhbHBoYSIpCiAgICAgICAgICAgICAgICAg ICAgICAoKD0gbnVtIC00KSAic25hcHNob3QiKSkKICAgICAgICAgICAgICAgIHN0ci1saXN0KSkp KQogICAgICAoaWYgKGVxdWFsICIuIiAoY2FyIHN0ci1saXN0KSkKICAgICAgICAgIChwb3Agc3Ry LWxpc3QpKQogICAgICAoYXBwbHkgIydjb25jYXQgKG5yZXZlcnNlIHN0ci1saXN0KSkpKSkKCihk ZWZ1biBwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIChwa2ctZGVzYykKICAiUmV0dXJuIGZ1bGwgbmFt ZSBvZiBwYWNrYWdlLWRlc2Mgb2JqZWN0IFBLRy1ERVNDLgpUaGlzIGlzIHRoZSBuYW1lIG9mIHRo ZSBwYWNrYWdlIHdpdGggaXRzIHZlcnNpb24gYXBwZW5kZWQuIgogIChpZiAocGFja2FnZS12Yy1w IHBrZy1kZXNjKQogICAgICAoc3ltYm9sLW5hbWUgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy1kZXNj KSkKICAgIChmb3JtYXQgIiVzLSVzIgogICAgICAgICAgICAocGFja2FnZS1kZXNjLW5hbWUgcGtn LWRlc2MpCiAgICAgICAgICAgIChwYWNrYWdlLXZlcnNpb24tam9pbiAocGFja2FnZS1kZXNjLXZl cnNpb24gcGtnLWRlc2MpKSkpKQoKKGRlZnVuIHBhY2thZ2UtZGVzYy1zdWZmaXggKHBrZy1kZXNj KQogICJSZXR1cm4gZmlsZS1uYW1lIGV4dGVuc2lvbiBvZiBwYWNrYWdlLWRlc2Mgb2JqZWN0IFBL Ry1ERVNDLgpEZXBlbmRpbmcgb24gdGhlIGBwYWNrYWdlLWRlc2Mta2luZCcgb2YgUEtHLURFU0Ms IHRoaXMgaXMgb25lIG9mOgoKICAgXFw9J3NpbmdsZSAtIFwiLmVsXCIKICAgXFw9J3RhciAgICAt IFwiLnRhclwiCiAgIFxcPSdkaXIgICAgLSBcIlwiCgpTaWduYWwgYW4gZXJyb3IgaWYgdGhlIGtp bmQgaXMgbm9uZSBvZiB0aGUgYWJvdmUuIgogIChwY2FzZSAocGFja2FnZS1kZXNjLWtpbmQgcGtn LWRlc2MpCiAgICAoJ3NpbmdsZSAiLmVsIikKICAgICgndGFyICIudGFyIikKICAgICgnZGlyICIi KQogICAgKGtpbmQgKGVycm9yICJVbmtub3duIHBhY2thZ2Uga2luZDogJXMiIGtpbmQpKSkpCgoo ZGVmdW4gcGFja2FnZS1kZXNjLS1rZXl3b3JkcyAocGtnLWRlc2MpCiAgIlJldHVybiBrZXl3b3Jk cyBvZiBwYWNrYWdlLWRlc2Mgb2JqZWN0IFBLRy1ERVNDLgpUaGVzZSBrZXl3b3JkcyBjb21lIGZy b20gdGhlIGZvby1wa2cuZWwgZmlsZSwgYW5kIGluIGdlbmVyYWwKY29ycmVzcG9uZHMgdG8gdGhl IGtleXdvcmRzIGluIHRoZSBcIktleXdvcmRzXCIgaGVhZGVyIG9mIHRoZQpwYWNrYWdlLiIKICAo bGV0ICgoa2V5d29yZHMgKGNkciAoYXNzb2MgOmtleXdvcmRzIChwYWNrYWdlLWRlc2MtZXh0cmFz IHBrZy1kZXNjKSkpKSkKICAgIChpZiAoZXEgKGNhci1zYWZlIGtleXdvcmRzKSAncXVvdGUpCiAg ICAgICAgKG50aCAxIGtleXdvcmRzKQogICAgICBrZXl3b3JkcykpKQoKKGRlZnVuIHBhY2thZ2Ut ZGVzYy1wcmlvcml0eSAocGtnLWRlc2MpCiAgIlJldHVybiB0aGUgcHJpb3JpdHkgb2YgdGhlIGFy Y2hpdmUgb2YgcGFja2FnZS1kZXNjIG9iamVjdCBQS0ctREVTQy4iCiAgKHBhY2thZ2UtYXJjaGl2 ZS1wcmlvcml0eSAocGFja2FnZS1kZXNjLWFyY2hpdmUgcGtnLWRlc2MpKSkKCihkZWZ1biBwYWNr YWdlLS1wYXJzZS1lbHBhaWdub3JlIChwa2ctZGVzYykKICAiUmV0dXJuIHRoZSBvZiByZWd1bGFy IGV4cHJlc3Npb24gdG8gbWF0Y2ggZmlsZXMgaWdub3JlZCBieSBQS0ctREVTQy4iCiAgKGxldCog KChwa2ctZGlyIChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IChwYWNrYWdlLWRlc2MtZGlyIHBrZy1k ZXNjKSkpCiAgICAgICAgIChpZ25vcmUgKGV4cGFuZC1maWxlLW5hbWUgIi5lbHBhaWdub3JlIiBw a2ctZGlyKSkKICAgICAgICAgZmlsZXMpCiAgICAod2hlbiAoZmlsZS1leGlzdHMtcCBpZ25vcmUp CiAgICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzIGln bm9yZSkKICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICAgICAgICh3aGlsZSAobm90 IChlb2JwKSkKICAgICAgICAgIChwdXNoICh3aWxkY2FyZC10by1yZWdleHAKICAgICAgICAgICAg ICAgICAobGV0ICgobGluZSAoYnVmZmVyLXN1YnN0cmluZwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAobGluZS1iZWdpbm5pbmctcG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChsaW5lLWVuZC1wb3NpdGlvbikpKSkKICAgICAgICAgICAgICAgICAgIChmaWxlLW5h bWUtY29uY2F0IHBrZy1kaXIgKHN0cmluZy10cmltLWxlZnQgbGluZSAiLyIpKSkpCiAgICAgICAg ICAgICAgICBmaWxlcykKICAgICAgICAgIChmb3J3YXJkLWxpbmUpKSkKICAgICAgZmlsZXMpKSkK CihjbC1kZWZzdHJ1Y3QgKHBhY2thZ2UtLWJpLWRlc2MKICAgICAgICAgICAgICAgKDpjb25zdHJ1 Y3RvciBwYWNrYWdlLW1ha2UtYnVpbHRpbiAodmVyc2lvbiBzdW1tYXJ5KSkKICAgICAgICAgICAg ICAgKDp0eXBlIHZlY3RvcikpCiAgIlBhY2thZ2UgZGVzY3JpcHRvciBmb3JtYXQgdXNlZCBpbiBm aW5kZXItaW5mLmVsIGFuZCBwYWNrYWdlLS1idWlsdGlucy4iCiAgdmVyc2lvbgogIHJlcXMKICBz dW1tYXJ5KQoKDAo7OzsgSW5zdGFsbGVkIHBhY2thZ2VzCjs7IFRoZSBmb2xsb3dpbmcgdmFyaWFi bGVzIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2VzIHByZXNlbnQgaW4KOzsgdGhlIHN5 c3RlbS4gIFRoZSBtb3N0IGltcG9ydGFudCBvZiB0aGVzZSBpcyBgcGFja2FnZS1hbGlzdCcuICBU aGUKOzsgY29tbWFuZCBgcGFja2FnZS1hY3RpdmF0ZS1hbGwnIGlzIGFsc28gY2xvc2VseSByZWxh dGVkIHRvIHRoaXMKOzsgc2VjdGlvbi4KCihkZWZ2YXIgcGFja2FnZS0tYnVpbHRpbnMgbmlsCiAg IkFsaXN0IG9mIGJ1aWx0LWluIHBhY2thZ2VzLgpUaGUgYWN0dWFsIHZhbHVlIGlzIGluaXRpYWxp emVkIGJ5IGxvYWRpbmcgdGhlIGxpYnJhcnkKYGZpbmRlci1pbmYnOyB0aGlzIGlzIG5vdCBkb25l IHVudGlsIGl0IGlzIG5lZWRlZCwgZS5nLiBieSB0aGUKZnVuY3Rpb24gYHBhY2thZ2UtYnVpbHQt aW4tcCcuCgpFYWNoIGVsZW1lbnQgaGFzIHRoZSBmb3JtIChQS0cgLiBQQUNLQUdFLUJJLURFU0Mp LCB3aGVyZSBQS0cgaXMgYSBwYWNrYWdlCm5hbWUgKGEgc3ltYm9sKSBhbmQgREVTQyBpcyBhIGBw YWNrYWdlLS1iaS1kZXNjJyBzdHJ1Y3R1cmUuIikKKHB1dCAncGFja2FnZS0tYnVpbHRpbnMgJ3Jp c2t5LWxvY2FsLXZhcmlhYmxlIHQpCgooZGVmdmFyIHBhY2thZ2UtYWxpc3QgbmlsCiAgIkFsaXN0 IG9mIGFsbCBwYWNrYWdlcyBhdmFpbGFibGUgZm9yIGFjdGl2YXRpb24uCkVhY2ggZWxlbWVudCBo YXMgdGhlIGZvcm0gKFBLRyAuIERFU0NTKSwgd2hlcmUgUEtHIGlzIGEgcGFja2FnZQpuYW1lIChh IHN5bWJvbCkgYW5kIERFU0NTIGlzIGEgbm9uLWVtcHR5IGxpc3Qgb2YgYHBhY2thZ2UtZGVzYycK c3RydWN0dXJlcywgc29ydGVkIGJ5IGRlY3JlYXNpbmcgdmVyc2lvbnMuCgpUaGlzIHZhcmlhYmxl IGlzIHNldCBhdXRvbWF0aWNhbGx5IGJ5IGBwYWNrYWdlLWxvYWQtZGVzY3JpcHRvcicsCmNhbGxl ZCB2aWEgYHBhY2thZ2UtYWN0aXZhdGUtYWxsJy4gIFRvIGNoYW5nZSB3aGljaCBwYWNrYWdlcyBh cmUKbG9hZGVkIGFuZC9vciBhY3RpdmF0ZWQsIGN1c3RvbWl6ZSBgcGFja2FnZS1sb2FkLWxpc3Qn LiIpCihwdXQgJ3BhY2thZ2UtYWxpc3QgJ3Jpc2t5LWxvY2FsLXZhcmlhYmxlIHQpCgo7OzsjIyNh dXRvbG9hZAooZGVmdmFyIHBhY2thZ2UtYWN0aXZhdGVkLWxpc3QgbmlsCiAgOzsgRklYTUU6IFRo aXMgc2hvdWxkIGltcGxpY2l0bHkgaW5jbHVkZSBhbGwgYnVpbHRpbiBwYWNrYWdlcy4KICAiTGlz dCBvZiB0aGUgbmFtZXMgb2YgY3VycmVudGx5IGFjdGl2YXRlZCBwYWNrYWdlcy4iKQoocHV0ICdw YWNrYWdlLWFjdGl2YXRlZC1saXN0ICdyaXNreS1sb2NhbC12YXJpYWJsZSB0KQoKOzs7OyBQb3B1 bGF0aW5nIGBwYWNrYWdlLWFsaXN0Jy4KCjs7IFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBj YWxsZWQgb24gZWFjaCBpbnN0YWxsZWQgcGFja2FnZSBieQo7OyBgcGFja2FnZS1sb2FkLWFsbC1k ZXNjcmlwdG9ycycsIHdoaWNoIHVsdGltYXRlbHkgcG9wdWxhdGVzIHRoZQo7OyBgcGFja2FnZS1h bGlzdCcgdmFyaWFibGUuCgooZGVjbGFyZS1mdW5jdGlvbiBwYWNrYWdlLXZjLXZlcnNpb24gInBh Y2thZ2UtdmMiIChwa2cpKQoKKGRlZnVuIHBhY2thZ2UtcHJvY2Vzcy1kZWZpbmUtcGFja2FnZSAo ZXhwKQogICJQcm9jZXNzIGRlZmluZS1wYWNrYWdlIGV4cHJlc3Npb24gRVhQIGFuZCBwdXNoIGl0 IHRvIGBwYWNrYWdlLWFsaXN0Jy4KRVhQIHNob3VsZCBiZSBhIGZvcm0gcmVhZCBmcm9tIGEgZm9v LXBrZy5lbCBmaWxlLgpDb252ZXJ0IEVYUCBpbnRvIGEgYHBhY2thZ2UtZGVzYycgb2JqZWN0IHVz aW5nIHRoZQpgcGFja2FnZS1kZXNjLWZyb20tZGVmaW5lJyBjb25zdHJ1Y3RvciBiZWZvcmUgcHVz aGluZyBpdCB0bwpgcGFja2FnZS1hbGlzdCcuCgpJZiB0aGVyZSBhbHJlYWR5IGV4aXN0cyBhIHBh Y2thZ2UgYnkgdGhlIHNhbWUgbmFtZSBpbgpgcGFja2FnZS1hbGlzdCcsIGluc2VydCB0aGlzIG9i amVjdCB0aGVyZSBzdWNoIHRoYXQgdGhlIHBhY2thZ2VzCmFyZSBzb3J0ZWQgd2l0aCB0aGUgaGln aGVzdCB2ZXJzaW9uIGZpcnN0LiIKICAod2hlbiAoZXEgKGNhci1zYWZlIGV4cCkgJ2RlZmluZS1w YWNrYWdlKQogICAgKGxldCogKChuZXctcGtnLWRlc2MgKGFwcGx5ICMncGFja2FnZS1kZXNjLWZy b20tZGVmaW5lIChjZHIgZXhwKSkpCiAgICAgICAgICAgKG5hbWUgKHBhY2thZ2UtZGVzYy1uYW1l IG5ldy1wa2ctZGVzYykpCiAgICAgICAgICAgKHZlcnNpb24gKHBhY2thZ2UtZGVzYy12ZXJzaW9u IG5ldy1wa2ctZGVzYykpCiAgICAgICAgICAgKG9sZC1wa2dzIChhc3NxIG5hbWUgcGFja2FnZS1h bGlzdCkpKQogICAgICAoaWYgKG51bGwgb2xkLXBrZ3MpCiAgICAgICAgICA7OyBJZiB0aGVyZSdz IG5vIG9sZCBwYWNrYWdlLCBqdXN0IGFkZCB0aGlzIHRvIGBwYWNrYWdlLWFsaXN0Jy4KICAgICAg ICAgIChwdXNoIChsaXN0IG5hbWUgbmV3LXBrZy1kZXNjKSBwYWNrYWdlLWFsaXN0KQogICAgICAg IDs7IElmIHRoZXJlIGlzLCBpbnNlcnQgdGhlIG5ldyBwYWNrYWdlIGF0IHRoZSByaWdodCBwbGFj ZSBpbiB0aGUgbGlzdC4KICAgICAgICAod2hpbGUKICAgICAgICAgICAgKGlmIChhbmQgKGNkciBv bGQtcGtncykKICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24tbGlzdC08IHZlcnNpb24KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtdmVyc2lvbiAo Y2FkciBvbGQtcGtncykpKSkKICAgICAgICAgICAgICAgIChzZXRxIG9sZC1wa2dzIChjZHIgb2xk LXBrZ3MpKQogICAgICAgICAgICAgIChwdXNoIG5ldy1wa2ctZGVzYyAoY2RyIG9sZC1wa2dzKSkK ICAgICAgICAgICAgICBuaWwpKSkKICAgICAgbmV3LXBrZy1kZXNjKSkpCgooZGVjbGFyZS1mdW5j dGlvbiBwYWNrYWdlLXZjLWNvbW1pdCAicGFja2FnZS12YyIgKHBrZykpCgooZGVmdW4gcGFja2Fn ZS1sb2FkLWRlc2NyaXB0b3IgKHBrZy1kaXIpCiAgIkxvYWQgdGhlIHBhY2thZ2UgZGVzY3JpcHRp b24gZmlsZSBpbiBkaXJlY3RvcnkgUEtHLURJUi4KQ3JlYXRlIGEgbmV3IGBwYWNrYWdlLWRlc2Mn IG9iamVjdCwgYWRkIGl0IHRvIGBwYWNrYWdlLWFsaXN0JyBhbmQKcmV0dXJuIGl0LiIKICAobGV0 ICgocGtnLWZpbGUgKGV4cGFuZC1maWxlLW5hbWUgKHBhY2thZ2UtLWRlc2NyaXB0aW9uLWZpbGUg cGtnLWRpcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnLWRpcikpCiAg ICAgICAgKHNpZ25lZC1maWxlIChjb25jYXQgcGtnLWRpciAiLnNpZ25lZCIpKSkKICAgICh3aGVu IChmaWxlLWV4aXN0cy1wIHBrZy1maWxlKQogICAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAg IChpbnNlcnQtZmlsZS1jb250ZW50cyBwa2ctZmlsZSkKICAgICAgICAoZ290by1jaGFyIChwb2lu dC1taW4pKQogICAgICAgIChsZXQgKChwa2ctZGVzYyAob3IgKHBhY2thZ2UtcHJvY2Vzcy1kZWZp bmUtcGFja2FnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkIChjdXJyZW50LWJ1 ZmZlcikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yICJDYW4ndCBmaW5kIGRl ZmluZS1wYWNrYWdlIGluICVzIiBwa2ctZmlsZSkpKSkKICAgICAgICAgIChzZXRmIChwYWNrYWdl LWRlc2MtZGlyIHBrZy1kZXNjKSBwa2ctZGlyKQogICAgICAgICAgKGlmIChmaWxlLWV4aXN0cy1w IHNpZ25lZC1maWxlKQogICAgICAgICAgICAgIChzZXRmIChwYWNrYWdlLWRlc2Mtc2lnbmVkIHBr Zy1kZXNjKSB0KSkKICAgICAgICAgIHBrZy1kZXNjKSkpKSkKCihkZWZ1biBwYWNrYWdlLWxvYWQt YWxsLWRlc2NyaXB0b3JzICgpCiAgIkxvYWQgZGVzY3JpcHRvcnMgZm9yIGluc3RhbGxlZCBFbWFj cyBMaXNwIHBhY2thZ2VzLgpUaGlzIGxvb2tzIGZvciBwYWNrYWdlIHN1YmRpcmVjdG9yaWVzIGlu IGBwYWNrYWdlLXVzZXItZGlyJyBhbmQKYHBhY2thZ2UtZGlyZWN0b3J5LWxpc3QnLiAgVGhlIHZh cmlhYmxlIGBwYWNrYWdlLWxvYWQtbGlzdCcKY29udHJvbHMgd2hpY2ggcGFja2FnZSBzdWJkaXJl Y3RvcmllcyBtYXkgYmUgbG9hZGVkLgoKSW4gZWFjaCB2YWxpZCBwYWNrYWdlIHN1YmRpcmVjdG9y eSwgdGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUKZGVzY3JpcHRpb24gZmlsZSBjb250YWluaW5nIGEg Y2FsbCB0byBgZGVmaW5lLXBhY2thZ2UnLCB3aGljaAp1cGRhdGVzIGBwYWNrYWdlLWFsaXN0Jy4i CiAgKGRvbGlzdCAoZGlyIChjb25zIHBhY2thZ2UtdXNlci1kaXIgcGFja2FnZS1kaXJlY3Rvcnkt bGlzdCkpCiAgICAod2hlbiAoZmlsZS1kaXJlY3RvcnktcCBkaXIpCiAgICAgIChkb2xpc3QgKHBr Zy1kaXIgKGRpcmVjdG9yeS1maWxlcyBkaXIgdCAiXFxgW14uXSIgdCkpCiAgICAgICAgKHdoZW4g KGZpbGUtZGlyZWN0b3J5LXAgcGtnLWRpcikKICAgICAgICAgIChwYWNrYWdlLWxvYWQtZGVzY3Jp cHRvciBwa2ctZGlyKSkpKSkpCgooZGVmdW4gcGFja2FnZS0tYWxpc3QgKCkKICAiUmV0dXJuIGBw YWNrYWdlLWFsaXN0JywgYWZ0ZXIgY29tcHV0aW5nIGl0IGlmIG5lZWRlZC4iCiAgKG9yIHBhY2th Z2UtYWxpc3QKICAgICAgKHByb2duIChwYWNrYWdlLWxvYWQtYWxsLWRlc2NyaXB0b3JzKQogICAg ICAgICAgICAgcGFja2FnZS1hbGlzdCkpKQoKKGRlZnVuIGRlZmluZS1wYWNrYWdlICggX25hbWUt c3RyaW5nIF92ZXJzaW9uLXN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9uYWwg X2RvY3N0cmluZyBfcmVxdWlyZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICZyZXN0IF9l eHRyYS1wcm9wZXJ0aWVzKQogICJEZWZpbmUgYSBuZXcgcGFja2FnZS4KTkFNRS1TVFJJTkcgaXMg dGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UsIGFzIGEgc3RyaW5nLgpWRVJTSU9OLVNUUklORyBpcyB0 aGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSwgYXMgYSBzdHJpbmcuCkRPQ1NUUklORyBpcyBhIHNo b3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrYWdlLCBhIHN0cmluZy4KUkVRVUlSRU1FTlRTIGlz IGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgb24gb3RoZXIgcGFja2FnZXMuCiBFYWNoIHJlcXVpcmVt ZW50IGlzIG9mIHRoZSBmb3JtIChPVEhFUi1QQUNLQUdFIE9USEVSLVZFUlNJT04pLAogd2hlcmUg T1RIRVItVkVSU0lPTiBpcyBhIHN0cmluZy4KCkVYVFJBLVBST1BFUlRJRVMgaXMgY3VycmVudGx5 IHVudXNlZC4iCiAgKGRlY2xhcmUgKG9ic29sZXRlIG5pbCAiMjkuMSIpIChpbmRlbnQgZGVmdW4p KQogIChlcnJvciAiRG9uJ3QgY2FsbCBtZSEiKSkKCgwKOzs7IFBhY2thZ2UgYWN0aXZhdGlvbgo7 OyBTZWN0aW9uIGZvciBmdW5jdGlvbnMgdXNlZCBieSBgcGFja2FnZS1hY3RpdmF0ZScsIHdoaWNo IHNlZS4KCihkZWZ1biBwYWNrYWdlLWRpc2FibGVkLXAgKHBrZy1uYW1lIHZlcnNpb24pCiAgIlJl dHVybiB3aGV0aGVyIFBLRy1OQU1FIGF0IFZFUlNJT04gY2FuIGJlIGFjdGl2YXRlZC4KVGhlIGRl Y2lzaW9uIGlzIG1hZGUgYWNjb3JkaW5nIHRvIGBwYWNrYWdlLWxvYWQtbGlzdCcuClJldHVybiBu aWwgaWYgdGhlIHBhY2thZ2UgY2FuIGJlIGFjdGl2YXRlZC4KUmV0dXJuIHQgaWYgdGhlIHBhY2th Z2UgaXMgY29tcGxldGVseSBkaXNhYmxlZC4KUmV0dXJuIHRoZSBtYXggdmVyc2lvbiAoYXMgYSBz dHJpbmcpIGlmIHRoZSBwYWNrYWdlIGlzIGhlbGQgYXQgYSBsb3dlciB2ZXJzaW9uLiIKICAobGV0 ICgoZm9yY2UgKGFzc3EgcGtnLW5hbWUgcGFja2FnZS1sb2FkLWxpc3QpKSkKICAgIChjb25kICgo bnVsbCBmb3JjZSkgKG5vdCAobWVtcSAnYWxsIHBhY2thZ2UtbG9hZC1saXN0KSkpCiAgICAgICAg ICAoKG51bGwgKHNldHEgZm9yY2UgKGNhZHIgZm9yY2UpKSkgdCkgOyBkaXNhYmxlZAogICAgICAg ICAgKChlcSBmb3JjZSB0KSBuaWwpCiAgICAgICAgICAoKHN0cmluZ3AgZm9yY2UpICAgICAgICAg ICAgICA7IGhlbGQKICAgICAgICAgICAodW5sZXNzICh2ZXJzaW9uLWxpc3QtPSB2ZXJzaW9uICh2 ZXJzaW9uLXRvLWxpc3QgZm9yY2UpKQogICAgICAgICAgICAgZm9yY2UpKQogICAgICAgICAgKHQg KGVycm9yICJJbnZhbGlkIGVsZW1lbnQgaW4gYHBhY2thZ2UtbG9hZC1saXN0JyIpKSkpKQoKKGRl ZnVuIHBhY2thZ2UtYnVpbHQtaW4tcCAocGFja2FnZSAmb3B0aW9uYWwgbWluLXZlcnNpb24pCiAg IlJldHVybiBub24tbmlsIGlmIFBBQ0tBR0UgaXMgYnVpbHQtaW4gdG8gRW1hY3MuCk9wdGlvbmFs IGFyZyBNSU4tVkVSU0lPTiwgaWYgbm9uLW5pbCwgc2hvdWxkIGJlIGEgdmVyc2lvbiBsaXN0CnNw ZWNpZnlpbmcgdGhlIG1pbmltdW0gYWNjZXB0YWJsZSB2ZXJzaW9uLiIKICAoaWYgKHBhY2thZ2Ut ZGVzYy1wIHBhY2thZ2UpIDs7IHdhcyBidWlsdC1pbiBhbmQgdGhlbiB3YXMgY29udmVydGVkCiAg ICAgIChlcSAnYnVpbHRpbiAocGFja2FnZS1kZXNjLWRpciBwYWNrYWdlKSkKICAgIChsZXQgKChi aSAoYXNzcSBwYWNrYWdlIHBhY2thZ2UtLWJ1aWx0aW4tdmVyc2lvbnMpKSkKICAgICAgKGNvbmQK ICAgICAgIChiaSAodmVyc2lvbi1saXN0LTw9IG1pbi12ZXJzaW9uIChjZHIgYmkpKSkKICAgICAg ICgocmVtb3ZlIDAgbWluLXZlcnNpb24pIG5pbCkKICAgICAgICh0CiAgICAgICAgKHJlcXVpcmUg J2ZpbmRlci1pbmYgbmlsIHQpIDsgRm9yIGBwYWNrYWdlLS1idWlsdGlucycuCiAgICAgICAgKGFz c3EgcGFja2FnZSBwYWNrYWdlLS1idWlsdGlucykpKSkpKQoKKGRlZnVuIHBhY2thZ2UtLWF1dG9s b2Fkcy1maWxlLW5hbWUgKHBrZy1kZXNjKQogICJSZXR1cm4gdGhlIGFic29sdXRlIG5hbWUgb2Yg dGhlIGF1dG9sb2FkcyBmaWxlLCBzYW5zIGV4dGVuc2lvbi4KUEtHLURFU0MgaXMgYSBgcGFja2Fn ZS1kZXNjJyBvYmplY3QuIgogIChleHBhbmQtZmlsZS1uYW1lCiAgIChmb3JtYXQgIiVzLWF1dG9s b2FkcyIgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy1kZXNjKSkKICAgKHBhY2thZ2UtZGVzYy1kaXIg cGtnLWRlc2MpKSkKCihkZWZ2YXIgSW5mby1kaXJlY3RvcnktbGlzdCkKKGRlY2xhcmUtZnVuY3Rp b24gaW5mby1pbml0aWFsaXplICJpbmZvIiAoKSkKCihkZWZ2YXIgcGFja2FnZS0tcXVpY2tzdGFy dC1wa2dzIHQKICAiSWYgc2V0IHRvIGEgbGlzdCwgd2UncmUgY29tcHV0aW5nIHRoZSBzZXQgb2Yg cGtncyB0byBhY3RpdmF0ZS4iKQoKKGRlZnN1YnN0IHBhY2thZ2UtLWxpYnJhcnktc3RlbSAoZmls ZSkKICAoY2F0Y2ggJ2RvbmUKICAgIChsZXQgKHJlc3VsdCkKICAgICAgKGRvbGlzdCAoc3VmZml4 IChnZXQtbG9hZC1zdWZmaXhlcykgZmlsZSkKICAgICAgICAoc2V0cSByZXN1bHQgKHN0cmluZy10 cmltIGZpbGUgbmlsIHN1ZmZpeCkpCiAgICAgICAgKHVubGVzcyAoZXF1YWwgZmlsZSByZXN1bHQp CiAgICAgICAgICAodGhyb3cgJ2RvbmUgcmVzdWx0KSkpKSkpCgooZGVmdW4gcGFja2FnZS0tcmVs b2FkLXByZXZpb3VzbHktbG9hZGVkIChwa2ctZGVzYykKICAiRm9yY2UgcmVpbXBvcnRhdGlvbiBv ZiBmaWxlcyBpbiBQS0ctREVTQyBhbHJlYWR5IHByZXNlbnQgaW4gYGxvYWQtaGlzdG9yeScuCk5l dyBlZGl0aW9ucyBvZiBmaWxlcyBjb250YWluIG1hY3JvIGRlZmluaXRpb25zIGFuZApyZWRlZmlu aXRpb25zLCB0aGUgb3Zlcmxvb2tpbmcgb2Ygd2hpY2ggd291bGQgY2F1c2UKYnl0ZS1jb21waWxh dGlvbiBvZiB0aGUgbmV3IHBhY2thZ2UgdG8gZmFpbC4iCiAgKHdpdGgtZGVtb3RlZC1lcnJvcnMg IkVycm9yIGluIHBhY2thZ2UtLWxvYWQtZmlsZXMtZm9yLWFjdGl2YXRpb246ICVzIgogICAgKGxl dCogKHJlc3VsdAogICAgICAgICAgIChkaXIgKHBhY2thZ2UtZGVzYy1kaXIgcGtnLWRlc2MpKQog ICAgICAgICAgIDs7IEEgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gd291bGQgc2tpcCBgZGlyJyBp dHNlbGYuCiAgICAgICAgICAgOzsgSG93ZXZlciwgaW4gbm9ybWFsIHVzZSByZWxvYWRpbmcgZnJv bSB0aGUgc2FtZSBkaXJlY3RvcnkKICAgICAgICAgICA7OyBuZXZlciBoYXBwZW5zIGFueXdheSwg d2hpbGUgaW4gY2VydGFpbiBjYXNlcyBleHRlcm5hbCB0bwogICAgICAgICAgIDs7IEVtYWNzIGEg cGFja2FnZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgbm90IG5lY2Vzc2FyeQogICAgICAgICAgIDs7 IHN0YXlzIGJ5dGUtaWRlbnRpY2FsLCBlLmcuICBkdXJpbmcgZGV2ZWxvcG1lbnQuICBKdXN0CiAg ICAgICAgICAgOzsgZG9uJ3Qgc3BlY2lhbC1jYXNlIGBkaXInLgogICAgICAgICAgIChlZmZlY3Rp dmUtcGF0aCAob3IgKGJvdW5kLWFuZC10cnVlLXAgZmluZC1saWJyYXJ5LXNvdXJjZS1wYXRoKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZC1wYXRoKSkKICAgICAgICAgICAoZmls ZXMgKGRpcmVjdG9yeS1maWxlcy1yZWN1cnNpdmVseSBkaXIgIlxcYFteXFwuXS4qXFwuZWxcXCci KSkKICAgICAgICAgICAoaGlzdG9yeSAobWFwY2FyICMnZmlsZS10cnVlbmFtZQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgKGNsLXJlbW92ZS1pZi1ub3QgIydzdHJpbmdwCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwY2FyICMnY2FyIGxvYWQtaGlz dG9yeSkpKSkpCiAgICAgIChkb2xpc3QgKGZpbGUgZmlsZXMpCiAgICAgICAgKHdoZW4tbGV0ICgo bGlicmFyeSAocGFja2FnZS0tbGlicmFyeS1zdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKGZpbGUtcmVsYXRpdmUtbmFtZSBmaWxlIGRpcikpKQogICAgICAgICAgICAgICAgICAgKGNh bm9uaWNhbCAobG9jYXRlLWxpYnJhcnkgbGlicmFyeSBuaWwgZWZmZWN0aXZlLXBhdGgpKQogICAg ICAgICAgICAgICAgICAgKHRydWVuYW1lIChmaWxlLXRydWVuYW1lIGNhbm9uaWNhbCkpCiAgICAg ICAgICAgICAgICAgICA7OyBOb3JtYWxseSwgYWxsIGZpbGVzIGluIGEgcGFja2FnZSBhcmUgY29t cGlsZWQgYnkKICAgICAgICAgICAgICAgICAgIDs7IG5vdywgYnV0IGRvbid0IGFzc3VtZSB0aGF0 LiAgRS5nLiBkaWZmZXJlbnQKICAgICAgICAgICAgICAgICAgIDs7IHZlcnNpb25zIGNhbiBhZGQg b3IgcmVtb3ZlIGBuby1ieXRlLWNvbXBpbGUnLgogICAgICAgICAgICAgICAgICAgKGFsdG5hbWUg KGlmIChzdHJpbmctc3VmZml4LXAgIi5lbCIgdHJ1ZW5hbWUpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAiXFwuZWxcXCciICIuZWxjIiB0cnVlbmFtZSB0KQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAiXFwuZWxjXFwnIiAiLmVsIiB0cnVlbmFtZSB0KSkpCiAgICAgICAg ICAgICAgICAgICAoZm91bmQgKG9yIChtZW1iZXIgdHJ1ZW5hbWUgaGlzdG9yeSkKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGFuZCAobm90IChzdHJpbmc9IGFsdG5hbWUgdHJ1ZW5hbWUp KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZW1iZXIgYWx0bmFtZSBoaXN0 b3J5KSkpKQogICAgICAgICAgICAgICAgICAgKHJlY2VudC1pbmRleCAobGVuZ3RoIGZvdW5kKSkp CiAgICAgICAgICAodW5sZXNzIChlcXVhbCAoZmlsZS1uYW1lLWJhc2UgbGlicmFyeSkKICAgICAg ICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIiVzLWF1dG9sb2FkcyIgKHBhY2thZ2UtZGVzYy1u YW1lIHBrZy1kZXNjKSkpCiAgICAgICAgICAgIChwdXNoIChjb25zIChleHBhbmQtZmlsZS1uYW1l IGxpYnJhcnkgZGlyKSByZWNlbnQtaW5kZXgpIHJlc3VsdCkpKSkKICAgICAgKG1hcGMgKGxhbWJk YSAoYykgKGxvYWQgKGNhciBjKSBuaWwgdCkpCiAgICAgICAgICAgIChzb3J0IHJlc3VsdCAobGFt YmRhICh4IHkpICg8IChjZHIgeCkgKGNkciB5KSkpKSkpKSkKCihkZWZ1biBwYWNrYWdlLWFjdGl2 YXRlLTEgKHBrZy1kZXNjICZvcHRpb25hbCByZWxvYWQgZGVwcykKICAiQWN0aXZhdGUgcGFja2Fn ZSBnaXZlbiBieSBQS0ctREVTQywgZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBhY3RpdmUuCklmIERF UFMgaXMgbm9uLW5pbCwgYWxzbyBhY3RpdmF0ZSBpdHMgZGVwZW5kZW5jaWVzICh1bmxlc3MgdGhl eQphcmUgYWxyZWFkeSBhY3RpdmF0ZWQpLgpJZiBSRUxPQUQgaXMgbm9uLW5pbCwgYWxzbyBgbG9h ZCcgYW55IGZpbGVzIGluc2lkZSB0aGUgcGFja2FnZSB3aGljaApjb3JyZXNwb25kIHRvIHByZXZp b3VzbHkgbG9hZGVkIGZpbGVzLiIKICAobGV0KiAoKG5hbWUgKHBhY2thZ2UtZGVzYy1uYW1lIHBr Zy1kZXNjKSkKICAgICAgICAgKHBrZy1kaXIgKHBhY2thZ2UtZGVzYy1kaXIgcGtnLWRlc2MpKSkK ICAgICh1bmxlc3MgcGtnLWRpcgogICAgICAoZXJyb3IgIkludGVybmFsIGVycm9yOiB1bmFibGUg dG8gZmluZCBkaXJlY3RvcnkgZm9yIGAlcyciCiAgICAgICAgICAgICAocGFja2FnZS1kZXNjLWZ1 bGwtbmFtZSBwa2ctZGVzYykpKQogICAgKGNhdGNoICdleGl0CiAgICAgIDs7IEFjdGl2YXRlIGl0 cyBkZXBlbmRlbmNpZXMgcmVjdXJzaXZlbHkuCiAgICAgIDs7IEZJWE1FOiBUaGlzIGRvZXNuJ3Qg Y2hlY2sgd2hldGhlciB0aGUgYWN0aXZhdGVkIHZlcnNpb24gaXMgdGhlCiAgICAgIDs7IHJlcXVp cmVkIHZlcnNpb24uCiAgICAgICh3aGVuIGRlcHMKICAgICAgICAoZG9saXN0IChyZXEgKHBhY2th Z2UtZGVzYy1yZXFzIHBrZy1kZXNjKSkKICAgICAgICAgICh1bmxlc3MgKHBhY2thZ2UtYWN0aXZh dGUgKGNhciByZXEpKQogICAgICAgICAgICAobWVzc2FnZSAiVW5hYmxlIHRvIGFjdGl2YXRlIHBh Y2thZ2UgYCVzJy5cblJlcXVpcmVkIHBhY2thZ2UgYCVzLSVzJyBpcyB1bmF2YWlsYWJsZSIKICAg ICAgICAgICAgICAgICAgICAgbmFtZSAoY2FyIHJlcSkgKHBhY2thZ2UtdmVyc2lvbi1qb2luIChj YWRyIHJlcSkpKQogICAgICAgICAgICAodGhyb3cgJ2V4aXQgbmlsKSkpKQogICAgICAoaWYgKGxp c3RwIHBhY2thZ2UtLXF1aWNrc3RhcnQtcGtncykKICAgICAgICAgIDs7IFdlJ3JlIG9ubHkgY29s bGVjdGluZyB0aGUgc2V0IG9mIHBhY2thZ2VzIHRvIGFjdGl2YXRlIQogICAgICAgICAgKHB1c2gg cGtnLWRlc2MgcGFja2FnZS0tcXVpY2tzdGFydC1wa2dzKQogICAgICAgICh3aGVuIHJlbG9hZAog ICAgICAgICAgKHBhY2thZ2UtLXJlbG9hZC1wcmV2aW91c2x5LWxvYWRlZCBwa2ctZGVzYykpCiAg ICAgICAgKHdpdGgtZGVtb3RlZC1lcnJvcnMgIkVycm9yIGxvYWRpbmcgYXV0b2xvYWRzOiAlcyIK ICAgICAgICAgIChsb2FkIChwYWNrYWdlLS1hdXRvbG9hZHMtZmlsZS1uYW1lIHBrZy1kZXNjKSBu aWwgdCkpCiAgICAgICAgKGFkZC10by1saXN0ICdsb2FkLXBhdGggKGRpcmVjdG9yeS1maWxlLW5h bWUgcGtnLWRpcikpKQogICAgICA7OyBBZGQgaW5mbyBub2RlLgogICAgICAod2hlbiAoZmlsZS1l eGlzdHMtcCAoZXhwYW5kLWZpbGUtbmFtZSAiZGlyIiBwa2ctZGlyKSkKICAgICAgICA7OyBGSVhN RTogbm90IHRoZSBmcmllbmRsaWVzdCwgYnV0IHNpbXBsZS4KICAgICAgICAocmVxdWlyZSAnaW5m bykKICAgICAgICAoaW5mby1pbml0aWFsaXplKQogICAgICAgIChhZGQtdG8tbGlzdCAnSW5mby1k aXJlY3RvcnktbGlzdCBwa2ctZGlyKSkKICAgICAgKHB1c2ggbmFtZSBwYWNrYWdlLWFjdGl2YXRl ZC1saXN0KQogICAgICA7OyBEb24ndCByZXR1cm4gbmlsLgogICAgICB0KSkpCgo7Ozs7IGBwYWNr YWdlLWFjdGl2YXRlJwoKKGRlZnVuIHBhY2thZ2UtLWdldC1hY3RpdmF0YWJsZS1wa2cgKHBrZy1u YW1lKQogIDs7IElzICJhY3RpdmF0YWJsZSIgYSB3b3JkPwogIChsZXQgKChwa2ctZGVzY3MgKHNv cnQgKGNkciAoYXNzcSBwa2ctbmFtZSBwYWNrYWdlLWFsaXN0KSkKICAgICAgICAgICAgICAgICAg ICAgICAgIChsYW1iZGEgKHAxIHAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgo djEgKHBhY2thZ2UtZGVzYy12ZXJzaW9uIHAxKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKHYyIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBwMikpKQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBQcmVmZXIgVkMg cGFja2FnZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLXZjLXAgcDEp CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLXZjLXAgcDIpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDs7IFByZWZlciBidWlsdGluIHBhY2thZ2VzLgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kaXNhYmxlZC1wIHAxIHYxKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAobm90IChwYWNrYWdlLWRpc2FibGVkLXAgcDIgdjIpKSkp KSkpKQogICAgOzsgQ2hlY2sgaWYgUEFDS0FHRSBpcyBhdmFpbGFibGUgaW4gYHBhY2thZ2UtYWxp c3QnLgogICAgKHdoaWxlCiAgICAgICAgKHdoZW4gcGtnLWRlc2NzCiAgICAgICAgICAobGV0ICgo YXZhaWxhYmxlLXZlcnNpb24gKHBhY2thZ2UtZGVzYy12ZXJzaW9uIChjYXIgcGtnLWRlc2NzKSkp KQogICAgICAgICAgICAocGFja2FnZS1kaXNhYmxlZC1wIHBrZy1uYW1lIGF2YWlsYWJsZS12ZXJz aW9uKSkpCiAgICAgIChzZXRxIHBrZy1kZXNjcyAoY2RyIHBrZy1kZXNjcykpKQogICAgKGNhciBw a2ctZGVzY3MpKSkKCjs7IFRoaXMgZnVuY3Rpb24gYWN0aXZhdGVzIGEgbmV3ZXIgdmVyc2lvbiBv ZiBhIHBhY2thZ2UgaWYgYW4gb2xkZXIKOzsgb25lIHdhcyBhbHJlYWR5IGFjdGl2YXRlZC4gIEl0 IGFsc28gbG9hZHMgYSBmZWF0dXJlcyBvZiB0aGlzCjs7IHBhY2thZ2Ugd2hpY2ggd2VyZSBhbHJl YWR5IGxvYWRlZC4KKGRlZnVuIHBhY2thZ2UtYWN0aXZhdGUgKHBhY2thZ2UgJm9wdGlvbmFsIGZv cmNlKQogICJBY3RpdmF0ZSB0aGUgcGFja2FnZSBuYW1lZCBQQUNLQUdFLgpJZiBGT1JDRSBpcyB0 cnVlLCAocmUtKWFjdGl2YXRlIGl0IGlmIGl0J3MgYWxyZWFkeSBhY3RpdmF0ZWQuCk5ld2VyIHZl cnNpb25zIGFyZSBhbHdheXMgYWN0aXZhdGVkLCByZWdhcmRsZXNzIG9mIEZPUkNFLiIKICAobGV0 ICgocGtnLWRlc2MgKHBhY2thZ2UtLWdldC1hY3RpdmF0YWJsZS1wa2cgcGFja2FnZSkpKQogICAg KGNvbmQKICAgICA7OyBJZiBubyBzdWNoIHBhY2thZ2UgaXMgZm91bmQsIG1heWJlIGl0J3MgYnVp bHQtaW4uCiAgICAgKChudWxsIHBrZy1kZXNjKQogICAgICAocGFja2FnZS1idWlsdC1pbi1wIHBh Y2thZ2UpKQogICAgIDs7IElmIHRoZSBwYWNrYWdlIGlzIGFscmVhZHkgYWN0aXZhdGVkLCBqdXN0 IHJldHVybiB0LgogICAgICgoYW5kIChtZW1xIHBhY2thZ2UgcGFja2FnZS1hY3RpdmF0ZWQtbGlz dCkgKG5vdCBmb3JjZSkpCiAgICAgIHQpCiAgICAgOzsgT3RoZXJ3aXNlLCBwcm9jZWVkIHdpdGgg YWN0aXZhdGlvbi4KICAgICAodCAocGFja2FnZS1hY3RpdmF0ZS0xIHBrZy1kZXNjIG5pbCAnZGVw cykpKSkpCgoMCjs7OyBJbnN0YWxsYXRpb24gLS0gTG9jYWwgb3BlcmF0aW9ucwo7OyBUaGlzIHNl Y3Rpb24gY29udGFpbnMgYSB2YXJpZXR5IG9mIGZlYXR1cmVzIHJlZ2FyZGluZyBpbnN0YWxsaW5n IGEKOzsgcGFja2FnZSB0by9mcm9tIGRpc2suICBUaGlzIGluY2x1ZGVzIGF1dG9sb2FkIGdlbmVy YXRpb24sCjs7IHVucGFja2luZywgY29tcGlsaW5nLCBhcyB3ZWxsIGFzIGRlZmluaW5nIGEgcGFj a2FnZSBmcm9tIHRoZQo7OyBjdXJyZW50IGJ1ZmZlci4KCjs7OzsgVW5wYWNraW5nCihkZWZ2YXIg dGFyLXBhcnNlLWluZm8pCihkZWNsYXJlLWZ1bmN0aW9uIHRhci11bnRhci1idWZmZXIgInRhci1t b2RlIiAoKSkKKGRlY2xhcmUtZnVuY3Rpb24gdGFyLWhlYWRlci1uYW1lICJ0YXItbW9kZSIgKHRh ci1oZWFkZXIpIHQpCihkZWNsYXJlLWZ1bmN0aW9uIHRhci1oZWFkZXItbGluay10eXBlICJ0YXIt bW9kZSIgKHRhci1oZWFkZXIpIHQpCgooZGVmdW4gcGFja2FnZS11bnRhci1idWZmZXIgKGRpcikK ICAiVW50YXIgdGhlIGN1cnJlbnQgYnVmZmVyLgpUaGlzIHVzZXMgYHRhci11bnRhci1idWZmZXIn IGZyb20gVGFyIG1vZGUuICBBbGwgZmlsZXMgc2hvdWxkCnVudGFyIGludG8gYSBkaXJlY3Rvcnkg bmFtZWQgRElSOyBvdGhlcndpc2UsIHNpZ25hbCBhbiBlcnJvci4iCiAgKHRhci1tb2RlKQogIDs7 IE1ha2Ugc3VyZSBldmVyeXRoaW5nIGV4dHJhY3RzIGludG8gRElSLgogIChsZXQgKChyZWdleHAg KGNvbmNhdCAiXFxgIiAocmVnZXhwLXF1b3RlIChleHBhbmQtZmlsZS1uYW1lIGRpcikpICIvIikp CiAgICAgICAgKGNhc2UtZm9sZC1zZWFyY2ggKGZpbGUtbmFtZS1jYXNlLWluc2Vuc2l0aXZlLXAg ZGlyKSkpCiAgICAoZG9saXN0ICh0YXItZGF0YSB0YXItcGFyc2UtaW5mbykKICAgICAgKGxldCAo KG5hbWUgKGV4cGFuZC1maWxlLW5hbWUgKHRhci1oZWFkZXItbmFtZSB0YXItZGF0YSkpKSkKICAg ICAgICAob3IgKHN0cmluZy1tYXRjaCByZWdleHAgbmFtZSkKICAgICAgICAgICAgOzsgVGFyYmFs bHMgY3JlYXRlZCBieSBzb21lIHV0aWxpdGllcyBkb24ndCBsaXN0CiAgICAgICAgICAgIDs7IGRp cmVjdG9yaWVzIHdpdGggYSB0cmFpbGluZyBzbGFzaCAoQnVnIzEzMTM2KS4KICAgICAgICAgICAg KGFuZCAoc3RyaW5nLWVxdWFsIChleHBhbmQtZmlsZS1uYW1lIGRpcikgbmFtZSkKICAgICAgICAg ICAgICAgICAoZXEgKHRhci1oZWFkZXItbGluay10eXBlIHRhci1kYXRhKSA1KSkKICAgICAgICAg ICAgKGVycm9yICJQYWNrYWdlIGRvZXMgbm90IHVudGFyIGNsZWFubHkgaW50byBkaXJlY3Rvcnkg JXMvIiBkaXIpKSkpKQogICh0YXItdW50YXItYnVmZmVyKSkKCihkZWZ1biBwYWNrYWdlLS1hbGlz dC10by1wbGlzdC1hcmdzIChhbGlzdCkKICAobWFwY2FyICMnbWFjcm9leHAtcXVvdGUKICAgICAg ICAgIChhcHBseSAjJ25jb25jCiAgICAgICAgICAgICAgICAgKG1hcGNhciAobGFtYmRhIChwYWly KSAobGlzdCAoY2FyIHBhaXIpIChjZHIgcGFpcikpKSBhbGlzdCkpKSkKCihkZWZ1biBwYWNrYWdl LXVucGFjayAocGtnLWRlc2MpCiAgIkluc3RhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50 IGJ1ZmZlciBhcyBhIHBhY2thZ2UuIgogIChsZXQqICgobmFtZSAocGFja2FnZS1kZXNjLW5hbWUg cGtnLWRlc2MpKQogICAgICAgICAoZGlybmFtZSAocGFja2FnZS1kZXNjLWZ1bGwtbmFtZSBwa2ct ZGVzYykpCiAgICAgICAgIChwa2ctZGlyIChleHBhbmQtZmlsZS1uYW1lIGRpcm5hbWUgcGFja2Fn ZS11c2VyLWRpcikpKQogICAgKHBjYXNlIChwYWNrYWdlLWRlc2Mta2luZCBwa2ctZGVzYykKICAg ICAgKCdkaXIKICAgICAgIChtYWtlLWRpcmVjdG9yeSBwa2ctZGlyIHQpCiAgICAgICAobGV0ICgo ZmlsZS1saXN0CiAgICAgICAgICAgICAgKGRpcmVjdG9yeS1maWxlcwogICAgICAgICAgICAgICBk ZWZhdWx0LWRpcmVjdG9yeSAnZnVsbCAiXFxgW14uXS4qXFwuZWxcXCciICdub3NvcnQpKSkKICAg ICAgICAgKGRvbGlzdCAoc291cmNlLWZpbGUgZmlsZS1saXN0KQogICAgICAgICAgIChsZXQgKCh0 YXJnZXQtZWwtZmlsZQogICAgICAgICAgICAgICAgICAoZXhwYW5kLWZpbGUtbmFtZSAoZmlsZS1u YW1lLW5vbmRpcmVjdG9yeSBzb3VyY2UtZmlsZSkgcGtnLWRpcikpKQogICAgICAgICAgICAgKGNv cHktZmlsZSBzb3VyY2UtZmlsZSB0YXJnZXQtZWwtZmlsZSB0KSkpCiAgICAgICAgIDs7IE5vdyB0 aGF0IHRoZSBmaWxlcyBoYXZlIGJlZW4gaW5zdGFsbGVkLCB0aGlzIHBhY2thZ2UgaXMKICAgICAg ICAgOzsgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGB0YXInIG9yIGEgYHNpbmdsZScuIExldCdz IG1ha2UKICAgICAgICAgOzsgdGhpbmdzIHNpbXBsZSBieSBlbnN1cmluZyB3ZSdyZSBvbmUgb2Yg dGhlbS4KICAgICAgICAgKHNldGYgKHBhY2thZ2UtZGVzYy1raW5kIHBrZy1kZXNjKQogICAgICAg ICAgICAgICAoaWYgKGxlbmd0aD4gZmlsZS1saXN0IDEpICd0YXIgJ3NpbmdsZSkpKSkKICAgICAg KCd0YXIKICAgICAgIChtYWtlLWRpcmVjdG9yeSBwYWNrYWdlLXVzZXItZGlyIHQpCiAgICAgICAo bGV0KiAoKGRlZmF1bHQtZGlyZWN0b3J5IChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IHBhY2thZ2Ut dXNlci1kaXIpKSkKICAgICAgICAgKHBhY2thZ2UtdW50YXItYnVmZmVyIGRpcm5hbWUpKSkKICAg ICAgKCdzaW5nbGUKICAgICAgIChsZXQgKChlbC1maWxlIChleHBhbmQtZmlsZS1uYW1lIChmb3Jt YXQgIiVzLmVsIiBuYW1lKSBwa2ctZGlyKSkpCiAgICAgICAgIChtYWtlLWRpcmVjdG9yeSBwa2ct ZGlyIHQpCiAgICAgICAgIChwYWNrYWdlLS13cml0ZS1maWxlLW5vLWNvZGluZyBlbC1maWxlKSkp CiAgICAgIChraW5kIChlcnJvciAiVW5rbm93biBwYWNrYWdlIGtpbmQ6ICVTIiBraW5kKSkpCiAg ICAocGFja2FnZS0tbWFrZS1hdXRvbG9hZHMtYW5kLXN0dWZmIHBrZy1kZXNjIHBrZy1kaXIpCiAg ICA7OyBVcGRhdGUgcGFja2FnZS1hbGlzdC4KICAgIChsZXQgKChuZXctZGVzYyAocGFja2FnZS1s b2FkLWRlc2NyaXB0b3IgcGtnLWRpcikpKQogICAgICAodW5sZXNzIChlcXVhbCAocGFja2FnZS1k ZXNjLWZ1bGwtbmFtZSBuZXctZGVzYykKICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVz Yy1mdWxsLW5hbWUgcGtnLWRlc2MpKQogICAgICAgIChlcnJvciAiVGhlIHJldHJpZXZlZCBwYWNr YWdlIChgJXMnKSBkb2Vzbid0IG1hdGNoIHdoYXQgdGhlIGFyY2hpdmUgb2ZmZXJlZCAoYCVzJyki CiAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIG5ldy1kZXNjKSAocGFja2Fn ZS1kZXNjLWZ1bGwtbmFtZSBwa2ctZGVzYykpKQogICAgICA7OyBBY3RpdmF0aW9uIGhhcyB0byBi ZSBkb25lIGJlZm9yZSBjb21waWxhdGlvbiwgc28gdGhhdCBpZiB3ZSdyZQogICAgICA7OyB1cGdy YWRpbmcgYW5kIG1hY3JvcyBoYXZlIGNoYW5nZWQgd2UgbG9hZCB0aGUgbmV3IGRlZmluaXRpb25z CiAgICAgIDs7IGJlZm9yZSBjb21waWxpbmcuCiAgICAgICh3aGVuIChwYWNrYWdlLWFjdGl2YXRl LTEgbmV3LWRlc2MgOnJlbG9hZCA6ZGVwcykKICAgICAgICA7OyBGSVhNRTogQ29tcGlsYXRpb24g c2hvdWxkIGJlIGRvbmUgYXMgYSBzZXBhcmF0ZSwgb3B0aW9uYWwsIHN0ZXAuCiAgICAgICAgOzsg RS5nLiBmb3IgbXVsdGktcGFja2FnZSBpbnN0YWxscywgd2Ugc2hvdWxkIGZpcnN0IGluc3RhbGwg YWxsIHBhY2thZ2VzCiAgICAgICAgOzsgYW5kIHRoZW4gY29tcGlsZSB0aGVtLgogICAgICAgIChw YWNrYWdlLS1jb21waWxlIG5ldy1kZXNjKQogICAgICAgICh3aGVuIHBhY2thZ2UtbmF0aXZlLWNv bXBpbGUKICAgICAgICAgIChwYWNrYWdlLS1uYXRpdmUtY29tcGlsZS1hc3luYyBuZXctZGVzYykp CiAgICAgICAgOzsgQWZ0ZXIgY29tcGlsYXRpb24sIGxvYWQgYWdhaW4gYW55IGZpbGVzIGxvYWRl ZCBieQogICAgICAgIDs7IGBhY3RpdmF0ZS0xJywgc28gdGhhdCB3ZSB1c2UgdGhlIGJ5dGUtY29t cGlsZWQgZGVmaW5pdGlvbnMuCiAgICAgICAgKHBhY2thZ2UtLXJlbG9hZC1wcmV2aW91c2x5LWxv YWRlZCBuZXctZGVzYykpKQogICAgcGtnLWRpcikpCgooZGVmdW4gcGFja2FnZS1nZW5lcmF0ZS1k ZXNjcmlwdGlvbi1maWxlIChwa2ctZGVzYyBwa2ctZmlsZSkKICAiQ3JlYXRlIHRoZSBmb28tcGtn LmVsIGZpbGUgUEtHLUZJTEUgZm9yIHNpbmdsZS1maWxlIHBhY2thZ2UgUEtHLURFU0MuIgogIChs ZXQqICgobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKSkKICAgIChsZXQgKChwcmlu dC1sZXZlbCBuaWwpCiAgICAgICAgICAocHJpbnQtcXVvdGVkIHQpCiAgICAgICAgICAocHJpbnQt bGVuZ3RoIG5pbCkpCiAgICAgICh3cml0ZS1yZWdpb24KICAgICAgIChjb25jYXQKICAgICAgICAi Ozs7IEdlbmVyYXRlZCBwYWNrYWdlIGRlc2NyaXB0aW9uIGZyb20gIgogICAgICAgIChyZXBsYWNl LXJlZ2V4cC1pbi1zdHJpbmcgIi1wa2dcXC5lbFxcJyIgIi5lbCIKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IHBrZy1maWxlKSkKICAgICAg ICAiICAtKi0gbm8tYnl0ZS1jb21waWxlOiB0IC0qLVxuIgogICAgICAgIChwcmluMS10by1zdHJp bmcKICAgICAgICAgKG5jb25jCiAgICAgICAgICAobGlzdCAnZGVmaW5lLXBhY2thZ2UKICAgICAg ICAgICAgICAgIChzeW1ib2wtbmFtZSBuYW1lKQogICAgICAgICAgICAgICAgKHBhY2thZ2UtdmVy c2lvbi1qb2luIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBwa2ctZGVzYykpCiAgICAgICAgICAgICAg ICAocGFja2FnZS1kZXNjLXN1bW1hcnkgcGtnLWRlc2MpCiAgICAgICAgICAgICAgICAobGV0ICgo cmVxdWlyZXMgKHBhY2thZ2UtZGVzYy1yZXFzIHBrZy1kZXNjKSkpCiAgICAgICAgICAgICAgICAg IChsaXN0ICdxdW90ZQogICAgICAgICAgICAgICAgICAgICAgICA7OyBUdXJuIHZlcnNpb24gbGlz dHMgaW50byBzdHJpbmcgZm9ybS4KICAgICAgICAgICAgICAgICAgICAgICAgKG1hcGNhcgogICAg ICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoZWx0KQogICAgICAgICAgICAgICAgICAgICAg ICAgICAobGlzdCAoY2FyIGVsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBh Y2thZ2UtdmVyc2lvbi1qb2luIChjYWRyIGVsdCkpKSkKICAgICAgICAgICAgICAgICAgICAgICAg IHJlcXVpcmVzKSkpKQogICAgICAgICAgKHBhY2thZ2UtLWFsaXN0LXRvLXBsaXN0LWFyZ3MKICAg ICAgICAgICAocGFja2FnZS1kZXNjLWV4dHJhcyBwa2ctZGVzYykpKSkKICAgICAgICAiXG4iKQog ICAgICAgbmlsIHBrZy1maWxlIG5pbCAnc2lsZW50KSkpKQoKCjs7OzsgQXV0b2xvYWQKKGRlY2xh cmUtZnVuY3Rpb24gYXV0b2xvYWQtcnVicmljICJhdXRvbG9hZCIgKGZpbGUgJm9wdGlvbmFsIHR5 cGUgZmVhdHVyZSkpCgooZGVmdW4gcGFja2FnZS1hdXRvbG9hZC1lbnN1cmUtZGVmYXVsdC1maWxl IChmaWxlKQogICJNYWtlIHN1cmUgdGhhdCB0aGUgYXV0b2xvYWQgZmlsZSBGSUxFIGV4aXN0cyBh bmQgaWYgbm90IGNyZWF0ZSBpdC4iCiAgKGRlY2xhcmUgKG9ic29sZXRlIG5pbCAiMjkuMSIpKQog ICh1bmxlc3MgKGZpbGUtZXhpc3RzLXAgZmlsZSkKICAgIChyZXF1aXJlICdhdXRvbG9hZCkKICAg IChsZXQgKChjb2Rpbmctc3lzdGVtLWZvci13cml0ZSAndXRmLTgtZW1hY3MtdW5peCkpCiAgICAg ICh3aXRoLXN1cHByZXNzZWQtd2FybmluZ3MgKChvYnNvbGV0ZSBhdXRvbG9hZC1ydWJyaWMpKQog ICAgICAgICh3cml0ZS1yZWdpb24gKGF1dG9sb2FkLXJ1YnJpYyBmaWxlICJwYWNrYWdlIiBuaWwp CiAgICAgICAgICAgICAgICAgICAgICBuaWwgZmlsZSBuaWwgJ3NpbGVudCkpKSkKICBmaWxlKQoK KGRlZnZhciBhdXRvbG9hZC10aW1lc3RhbXBzKQooZGVmdmFyIHZlcnNpb24tY29udHJvbCkKCihk ZWZ1biBwYWNrYWdlLWdlbmVyYXRlLWF1dG9sb2FkcyAobmFtZSBwa2ctZGlyKQogICJHZW5lcmF0 ZSBhdXRvbG9hZHMgaW4gUEtHLURJUiBmb3IgcGFja2FnZSBuYW1lZCBOQU1FLiIKICAobGV0KiAo KGF1dG8tbmFtZSAoZm9ybWF0ICIlcy1hdXRvbG9hZHMuZWwiIG5hbWUpKQogICAgICAgICA7Oyhp Z25vcmUtbmFtZSAoY29uY2F0IG5hbWUgIi1wa2cuZWwiKSkKICAgICAgICAgKG91dHB1dC1maWxl IChleHBhbmQtZmlsZS1uYW1lIGF1dG8tbmFtZSBwa2ctZGlyKSkKICAgICAgICAgOzsgV2UgZG9u J3QgbmVlZCAnZW0sIGFuZCB0aGlzIG1ha2VzIHRoZSBvdXRwdXQgcmVwcm9kdWNpYmxlLgogICAg ICAgICAoYXV0b2xvYWQtdGltZXN0YW1wcyBuaWwpCiAgICAgICAgIChiYWNrdXAtaW5oaWJpdGVk IHQpCiAgICAgICAgICh2ZXJzaW9uLWNvbnRyb2wgJ25ldmVyKSkKICAgIChsb2FkZGVmcy1nZW5l cmF0ZQogICAgIHBrZy1kaXIgb3V0cHV0LWZpbGUgbmlsCiAgICAgKHByaW4xLXRvLXN0cmluZwog ICAgICAnKGFkZC10by1saXN0CiAgICAgICAgJ2xvYWQtcGF0aAogICAgICAgIDs7IEFkZCB0aGUg ZGlyZWN0b3J5IHRoYXQgd2lsbCBjb250YWluIHRoZSBhdXRvbG9hZCBmaWxlIHRvCiAgICAgICAg OzsgdGhlIGxvYWQgcGF0aC4gIFdlIGRvbid0IGhhcmQtY29kZSBgcGtnLWRpcicsIHRvIGF2b2lk CiAgICAgICAgOzsgaXNzdWVzIGlmIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSBpcyBtb3ZlZCBhcm91 bmQuCiAgICAgICAgKG9yIChhbmQgbG9hZC1maWxlLW5hbWUgKGZpbGUtbmFtZS1kaXJlY3Rvcnkg bG9hZC1maWxlLW5hbWUpKQogICAgICAgICAgICAoY2FyIGxvYWQtcGF0aCkpKSkpCiAgICAobGV0 ICgoYnVmIChmaW5kLWJ1ZmZlci12aXNpdGluZyBvdXRwdXQtZmlsZSkpKQogICAgICAod2hlbiBi dWYgKGtpbGwtYnVmZmVyIGJ1ZikpKQogICAgYXV0by1uYW1lKSkKCihkZWZ1biBwYWNrYWdlLS1t YWtlLWF1dG9sb2Fkcy1hbmQtc3R1ZmYgKHBrZy1kZXNjIHBrZy1kaXIpCiAgIkdlbmVyYXRlIGF1 dG9sb2FkcywgZGVzY3JpcHRpb24gZmlsZSwgZXRjLiwgZm9yIFBLRy1ERVNDIGluc3RhbGxlZCBh dCBQS0ctRElSLiIKICAocGFja2FnZS1nZW5lcmF0ZS1hdXRvbG9hZHMgKHBhY2thZ2UtZGVzYy1u YW1lIHBrZy1kZXNjKSBwa2ctZGlyKQogIChsZXQgKChkZXNjLWZpbGUgKGV4cGFuZC1maWxlLW5h bWUgKHBhY2thZ2UtLWRlc2NyaXB0aW9uLWZpbGUgcGtnLWRpcikKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHBrZy1kaXIpKSkKICAgICh1bmxlc3MgKGZpbGUtZXhpc3RzLXAg ZGVzYy1maWxlKQogICAgICAocGFja2FnZS1nZW5lcmF0ZS1kZXNjcmlwdGlvbi1maWxlIHBrZy1k ZXNjIGRlc2MtZmlsZSkpKQogIDs7IEZJWE1FOiBDcmVhdGUgZm9vLmluZm8gYW5kIGRpciBmaWxl IGZyb20gZm9vLnRleGk/CiAgKQoKOzs7OyBDb21waWxhdGlvbgooZGVmdmFyIHdhcm5pbmctbWlu aW11bS1sZXZlbCkKKGRlZnZhciBieXRlLWNvbXBpbGUtaWdub3JlLWZpbGVzKQooZGVmdW4gcGFj a2FnZS0tY29tcGlsZSAocGtnLWRlc2MpCiAgIkJ5dGUtY29tcGlsZSBpbnN0YWxsZWQgcGFja2Fn ZSBQS0ctREVTQy4KVGhpcyBhc3N1bWVzIHRoYXQgYHBrZy1kZXNjJyBoYXMgYWxyZWFkeSBiZWVu IGFjdGl2YXRlZCB3aXRoCmBwYWNrYWdlLWFjdGl2YXRlLTEnLiIKICAobGV0ICgoYnl0ZS1jb21w aWxlLWlnbm9yZS1maWxlcyAocGFja2FnZS0tcGFyc2UtZWxwYWlnbm9yZSBwa2ctZGVzYykpCiAg ICAgICAgKHdhcm5pbmctbWluaW11bS1sZXZlbCA6ZXJyb3IpCiAgICAgICAgKGxvYWQtcGF0aCBs b2FkLXBhdGgpKQogICAgKGJ5dGUtcmVjb21waWxlLWRpcmVjdG9yeSAocGFja2FnZS1kZXNjLWRp ciBwa2ctZGVzYykgMCB0KSkpCgooZGVmdW4gcGFja2FnZS0tbmF0aXZlLWNvbXBpbGUtYXN5bmMg KHBrZy1kZXNjKQogICJOYXRpdmUgY29tcGlsZSBpbnN0YWxsZWQgcGFja2FnZSBQS0ctREVTQyBh c3luY2hyb25vdXNseS4KVGhpcyBhc3N1bWVzIHRoYXQgYHBrZy1kZXNjJyBoYXMgYWxyZWFkeSBi ZWVuIGFjdGl2YXRlZCB3aXRoCmBwYWNrYWdlLWFjdGl2YXRlLTEnLiIKICAod2hlbiAoYW5kIChm Ym91bmRwICduYXRpdmUtY29tcC1hdmFpbGFibGUtcCkKICAgICAgICAgICAgIChuYXRpdmUtY29t cC1hdmFpbGFibGUtcCkpCiAgICAobGV0ICgod2FybmluZy1taW5pbXVtLWxldmVsIDplcnJvcikp CiAgICAgIChuYXRpdmUtY29tcGlsZS1hc3luYyAocGFja2FnZS1kZXNjLWRpciBwa2ctZGVzYykg dCkpKSkKCjs7OzsgSW5mZXJyaW5nIHBhY2thZ2UgZnJvbSBjdXJyZW50IGJ1ZmZlcgooZGVmdW4g cGFja2FnZS1yZWFkLWZyb20tc3RyaW5nIChzdHIpCiAgIlJlYWQgYSBMaXNwIGV4cHJlc3Npb24g ZnJvbSBTVFIuClNpZ25hbCBhbiBlcnJvciBpZiB0aGUgZW50aXJlIHN0cmluZyB3YXMgbm90IHVz ZWQuIgogIChwY2FzZS1sZXQgKChgKCxleHByIC4gLG9mZnNldCkgKHJlYWQtZnJvbS1zdHJpbmcg c3RyKSkpCiAgICAoY29uZGl0aW9uLWNhc2UgKCkKICAgICAgICA7OyBUaGUgY2FsbCB0byBgaWdu b3JlJyBzdXBwcmVzc2VzIGEgY29tcGlsZXIgd2FybmluZy4KICAgICAgICAocHJvZ24gKGlnbm9y ZSAocmVhZC1mcm9tLXN0cmluZyBzdHIgb2Zmc2V0KSkKICAgICAgICAgICAgICAgKGVycm9yICJD YW4ndCByZWFkIHdob2xlIHN0cmluZyIpKQogICAgICAoZW5kLW9mLWZpbGUgZXhwcikpKSkKCihk ZWZ1biBwYWNrYWdlLS1wcmVwYXJlLWRlcGVuZGVuY2llcyAoZGVwcykKICAiVHVybiBERVBTIGlu dG8gYW4gYWNjZXB0YWJsZSBsaXN0IG9mIGRlcGVuZGVuY2llcy4KCkFueSBwYXJ0cyBtaXNzaW5n IGEgdmVyc2lvbiBzdHJpbmcgZ2V0IGEgZGVmYXVsdCB2ZXJzaW9uIHN0cmluZwpvZiBcIjBcIiAo bWVhbmluZyBhbnkgdmVyc2lvbikgYW5kIGFuIGFwcHJvcHJpYXRlIGxldmVsIG9mIGxpc3RzCmlz IHdyYXBwZWQgYXJvdW5kIGFueSBwYXJ0cyByZXF1aXJpbmcgaXQuIgogIChjb25kCiAgICgobm90 IChsaXN0cCBkZXBzKSkKICAgIChlcnJvciAiSW52YWxpZCByZXF1aXJlbWVudCBzcGVjaWZpZXI6 ICVTIiBkZXBzKSkKICAgKHQgKG1hcGNhciAobGFtYmRhIChkZXApCiAgICAgICAgICAgICAgICAo Y29uZAogICAgICAgICAgICAgICAgICgoc3ltYm9scCBkZXApIGAoLGRlcCAiMCIpKQogICAgICAg ICAgICAgICAgICgoc3RyaW5ncCBkZXApCiAgICAgICAgICAgICAgICAgIChlcnJvciAiSW52YWxp ZCByZXF1aXJlbWVudCBzcGVjaWZpZXI6ICVTIiBkZXApKQogICAgICAgICAgICAgICAgICgoYW5k IChsaXN0cCBkZXApIChudWxsIChjZHIgZGVwKSkpCiAgICAgICAgICAgICAgICAgIChsaXN0IChj YXIgZGVwKSAiMCIpKQogICAgICAgICAgICAgICAgICh0IGRlcCkpKQogICAgICAgICAgICAgIGRl cHMpKSkpCgooZGVjbGFyZS1mdW5jdGlvbiBsbS1oZWFkZXIgImxpc3AtbW50IiAoaGVhZGVyKSkK KGRlY2xhcmUtZnVuY3Rpb24gbG0taGVhZGVyLW11bHRpbGluZSAibGlzcC1tbnQiIChoZWFkZXIp KQooZGVjbGFyZS1mdW5jdGlvbiBsbS1ob21lcGFnZSAibGlzcC1tbnQiICgmb3B0aW9uYWwgZmls ZSkpCihkZWNsYXJlLWZ1bmN0aW9uIGxtLWtleXdvcmRzLWxpc3QgImxpc3AtbW50IiAoJm9wdGlv bmFsIGZpbGUpKQooZGVjbGFyZS1mdW5jdGlvbiBsbS1tYWludGFpbmVycyAibGlzcC1tbnQiICgm b3B0aW9uYWwgZmlsZSkpCihkZWNsYXJlLWZ1bmN0aW9uIGxtLW1haW50YWluZXIgImxpc3AtbW50 IiAoJm9wdGlvbmFsIGZpbGUpKQooZGVjbGFyZS1mdW5jdGlvbiBsbS1hdXRob3JzICJsaXNwLW1u dCIgKCZvcHRpb25hbCBmaWxlKSkKCihkZWZ1biBwYWNrYWdlLWJ1ZmZlci1pbmZvICgpCiAgIlJl dHVybiBhIGBwYWNrYWdlLWRlc2MnIGRlc2NyaWJpbmcgdGhlIHBhY2thZ2UgaW4gdGhlIGN1cnJl bnQgYnVmZmVyLgoKSWYgdGhlIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgY29uZm9ybWluZyBw YWNrYWdlLCBzaWduYWwgYW4KZXJyb3IuICBJZiB0aGVyZSBpcyBhIHBhY2thZ2UsIG5hcnJvdyB0 aGUgYnVmZmVyIHRvIHRoZSBmaWxlJ3MKYm91bmRhcmllcy4iCiAgKGdvdG8tY2hhciAocG9pbnQt bWluKSkKICAodW5sZXNzIChyZS1zZWFyY2gtZm9yd2FyZCAiXjs7OyBcXChbXiBdKlxcKVxcLmVs IC0tLVsgXHRdKlxcKC4qP1xcKVsgXHRdKlxcKC1cXCotLiotXFwqLVsgXHRdKlxcKT8kIiBuaWwg dCkKICAgIChlcnJvciAiUGFja2FnZSBsYWNrcyBhIGZpbGUgaGVhZGVyIikpCiAgKGxldCAoKGZp bGUtbmFtZSAobWF0Y2gtc3RyaW5nLW5vLXByb3BlcnRpZXMgMSkpCiAgICAgICAgKGRlc2MgICAg ICAobWF0Y2gtc3RyaW5nLW5vLXByb3BlcnRpZXMgMikpCiAgICAgICAgKHN0YXJ0ICAgICAobGlu ZS1iZWdpbm5pbmctcG9zaXRpb24pKSkKICAgIDs7IFRoaXMgd2FybmluZyB3YXMgYWRkZWQgaW4g RW1hY3MgMjcuMSwgYW5kIHNob3VsZCBiZSByZW1vdmVkIGF0CiAgICA7OyB0aGUgZWFybGllc3Qg aW4gdmVyc2lvbiAzMS4xLiAgVGhlIGlkZWEgaXMgdG8gcGhhc2Ugb3V0IHRoZQogICAgOzsgcmVx dWlyZW1lbnQgZm9yIGEgImZvb3RlciBsaW5lIiB3aXRob3V0IHVuZHVseSBpbXBhY3RpbmcgdXNl cnMKICAgIDs7IG9uIGVhcmxpZXIgRW1hY3MgdmVyc2lvbnMuICBTZWUgQnVnIzI2NDkwIGZvciBt b3JlIGRldGFpbHMuCiAgICAodW5sZXNzIChzZWFyY2gtZm9yd2FyZCAoY29uY2F0ICI7OzsgIiBm aWxlLW5hbWUgIi5lbCBlbmRzIGhlcmUiKSkKICAgICAgKGx3YXJuICcocGFja2FnZSBwYWNrYWdl LWZvcm1hdCkgOndhcm5pbmcKICAgICAgICAgICAgICJQYWNrYWdlIGxhY2tzIGEgdGVybWluYXRp bmcgY29tbWVudCIpKQogICAgOzsgVHJ5IHRvIGluY2x1ZGUgYSB0cmFpbGluZyBuZXdsaW5lLgog ICAgKGZvcndhcmQtbGluZSkKICAgIChuYXJyb3ctdG8tcmVnaW9uIHN0YXJ0IChwb2ludCkpCiAg ICAocmVxdWlyZSAnbGlzcC1tbnQpCiAgICA7OyBVc2Ugc29tZSBoZWFkZXJzIHdlJ3ZlIGludmVu dGVkIHRvIGRyaXZlIHRoZSBwcm9jZXNzLgogICAgKGxldCogKDs7IFByZWZlciBQYWNrYWdlLVZl cnNpb247IGlmIGRlZmluZWQsIHRoZSBwYWNrYWdlIGF1dGhvcgogICAgICAgICAgIDs7IHByb2Jh Ymx5IHdhbnRzIHVzIHRvIHVzZSBpdC4gIE90aGVyd2lzZSB0cnkgVmVyc2lvbi4KICAgICAgICAg ICAodmVyc2lvbi1pbmZvCiAgICAgICAgICAgIChvciAobG0taGVhZGVyICJwYWNrYWdlLXZlcnNp b24iKSAobG0taGVhZGVyICJ2ZXJzaW9uIikpKQogICAgICAgICAgIChwa2ctdmVyc2lvbiAocGFj a2FnZS1zdHJpcC1yY3MtaWQgdmVyc2lvbi1pbmZvKSkKICAgICAgICAgICAoa2V5d29yZHMgKGxt LWtleXdvcmRzLWxpc3QpKQogICAgICAgICAgICh3ZWJzaXRlIChsbS1ob21lcGFnZSkpKQogICAg ICAodW5sZXNzIHBrZy12ZXJzaW9uCiAgICAgICAgIChpZiB2ZXJzaW9uLWluZm8KICAgICAgICAg ICAgIChlcnJvciAiVW5yZWNvZ25pemVkIHBhY2thZ2UgdmVyc2lvbjogJXMiIHZlcnNpb24taW5m bykKICAgICAgICAgICAoZXJyb3IgIlBhY2thZ2UgbGFja3MgYSBcIlZlcnNpb25cIiBvciBcIlBh Y2thZ2UtVmVyc2lvblwiIGhlYWRlciIpKSkKICAgICAgKHBhY2thZ2UtZGVzYy1mcm9tLWRlZmlu ZQogICAgICAgZmlsZS1uYW1lIHBrZy12ZXJzaW9uIGRlc2MKICAgICAgIChhbmQtbGV0KiAoKHJl cXVpcmUtbGluZXMgKGxtLWhlYWRlci1tdWx0aWxpbmUgInBhY2thZ2UtcmVxdWlyZXMiKSkpCiAg ICAgICAgIChwYWNrYWdlLS1wcmVwYXJlLWRlcGVuZGVuY2llcwogICAgICAgICAgKHBhY2thZ2Ut cmVhZC1mcm9tLXN0cmluZyAobWFwY29uY2F0ICMnaWRlbnRpdHkgcmVxdWlyZS1saW5lcyAiICIp KSkpCiAgICAgICA6a2luZCAnc2luZ2xlCiAgICAgICA6dXJsIHdlYnNpdGUKICAgICAgIDprZXl3 b3JkcyBrZXl3b3JkcwogICAgICAgOm1haW50YWluZXIgKGxtLW1haW50YWluZXIpCiAgICAgICA7 OyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIGEgc2luZ2xlIHN0cmluZyBpZiB0aGVy ZSdzIG9ubHkKICAgICAgIDs7IG9uZSBtYWludGFpbmVyICh0aGUgbW9zdCBjb21tb24gY2FzZSku CiAgICAgICAoaWYgKGZib3VuZHAgJ2xtLW1haW50YWluZXJzKQogICAgICAgICAgIChsZXQgKCht YWludHMgKGxtLW1haW50YWluZXJzKSkpCiAgICAgICAgICAgICAoaWYgKGNkciBtYWludHMpIG1h aW50cyAoY2FyIG1haW50cykpKQogICAgICAgICAobG0tbWFpbnRhaW5lcikpCiAgICAgICA6YXV0 aG9ycyAobG0tYXV0aG9ycykpKSkpCgooZGVmdW4gcGFja2FnZS0tcmVhZC1wa2ctZGVzYyAoa2lu ZCkKICAiUmVhZCBhIGBkZWZpbmUtcGFja2FnZScgZm9ybSBpbiBjdXJyZW50IGJ1ZmZlci4KUmV0 dXJuIHRoZSBwa2ctZGVzYywgd2l0aCBkZXNjLWtpbmQgc2V0IHRvIEtJTkQuIgogIChnb3RvLWNo YXIgKHBvaW50LW1pbikpCiAgKHVud2luZC1wcm90ZWN0CiAgICAgIChsZXQqICgocGtnLWRlZi1w YXJzZWQgKHJlYWQgKGN1cnJlbnQtYnVmZmVyKSkpCiAgICAgICAgICAgICAocGtnLWRlc2MKICAg ICAgICAgICAgICAod2hlbiAoZXEgKGNhciBwa2ctZGVmLXBhcnNlZCkgJ2RlZmluZS1wYWNrYWdl KQogICAgICAgICAgICAgICAgKGFwcGx5ICMncGFja2FnZS1kZXNjLWZyb20tZGVmaW5lCiAgICAg ICAgICAgICAgICAgIChhcHBlbmQgKGNkciBwa2ctZGVmLXBhcnNlZCkpKSkpKQogICAgICAgICh3 aGVuIHBrZy1kZXNjCiAgICAgICAgICAoc2V0ZiAocGFja2FnZS1kZXNjLWtpbmQgcGtnLWRlc2Mp IGtpbmQpCiAgICAgICAgICBwa2ctZGVzYykpKSkKCihkZWNsYXJlLWZ1bmN0aW9uIHRhci1nZXQt ZmlsZS1kZXNjcmlwdG9yICJ0YXItbW9kZSIgKGZpbGUpKQooZGVjbGFyZS1mdW5jdGlvbiB0YXIt LWV4dHJhY3QgInRhci1tb2RlIiAoZGVzY3JpcHRvcikpCgooZGVmdW4gcGFja2FnZS10YXItZmls ZS1pbmZvICgpCiAgIkZpbmQgcGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgYSB0YXIgZmlsZS4KVGhl IHJldHVybiByZXN1bHQgaXMgYSBgcGFja2FnZS1kZXNjJy4iCiAgKGNsLWFzc2VydCAoZGVyaXZl ZC1tb2RlLXAgJ3Rhci1tb2RlKSkKICAobGV0KiAoKGRpci1uYW1lIChuYW1lZC1sZXQgbG9vcAog ICAgICAgICAgICAgICAgICAgICAgICgoZmlsZW5hbWUgKHRhci1oZWFkZXItbmFtZSAoY2FyIHRh ci1wYXJzZS1pbmZvKSkpKQogICAgICAgICAgICAgICAgICAgICAobGV0ICgoZGlybmFtZSAoZmls ZS1uYW1lLWRpcmVjdG9yeSBmaWxlbmFtZSkpKQogICAgICAgICAgICAgICAgICAgICAgIDs7IFRo ZSBmaXJzdCBmaWxlIGNhbiBiZSBpbiBhIHN1YmRpcjogbG9vayBmb3IgdGhlIHRvcC4KICAgICAg ICAgICAgICAgICAgICAgICAoaWYgZGlybmFtZSAobG9vcCAoZGlyZWN0b3J5LWZpbGUtbmFtZSBk aXJuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5 IGZpbGVuYW1lKSkpKSkKICAgICAgICAgKGRlc2MtZmlsZSAocGFja2FnZS0tZGVzY3JpcHRpb24t ZmlsZSBkaXItbmFtZSkpCiAgICAgICAgICh0YXItZGVzYyAodGFyLWdldC1maWxlLWRlc2NyaXB0 b3IgKGNvbmNhdCBkaXItbmFtZSBkZXNjLWZpbGUpKSkpCiAgICAodW5sZXNzIHRhci1kZXNjCiAg ICAgIChlcnJvciAiTm8gcGFja2FnZSBkZXNjcmlwdG9yIGZpbGUgZm91bmQiKSkKICAgICh3aXRo LWN1cnJlbnQtYnVmZmVyICh0YXItLWV4dHJhY3QgdGFyLWRlc2MpCiAgICAgICh1bndpbmQtcHJv dGVjdAogICAgICAgICAgKG9yIChwYWNrYWdlLS1yZWFkLXBrZy1kZXNjICd0YXIpCiAgICAgICAg ICAgICAgKGVycm9yICJDYW4ndCBmaW5kIGRlZmluZS1wYWNrYWdlIGluICVzIgogICAgICAgICAg ICAgICAgKHRhci1oZWFkZXItbmFtZSB0YXItZGVzYykpKQogICAgICAgIChraWxsLWJ1ZmZlciAo Y3VycmVudC1idWZmZXIpKSkpKSkKCihkZWZ1biBwYWNrYWdlLWRpci1pbmZvICgpCiAgIkZpbmQg cGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgYSBkaXJlY3RvcnkuClRoZSByZXR1cm4gcmVzdWx0IGlz IGEgYHBhY2thZ2UtZGVzYycuIgogIChjbC1hc3NlcnQgKGRlcml2ZWQtbW9kZS1wICdkaXJlZC1t b2RlKSkKICAobGV0KiAoKGRlc2MtZmlsZSAocGFja2FnZS0tZGVzY3JpcHRpb24tZmlsZSBkZWZh dWx0LWRpcmVjdG9yeSkpKQogICAgKGlmIChmaWxlLXJlYWRhYmxlLXAgZGVzYy1maWxlKQogICAg ICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgICAoaW5zZXJ0LWZpbGUtY29udGVudHMgZGVz Yy1maWxlKQogICAgICAgICAgKHBhY2thZ2UtLXJlYWQtcGtnLWRlc2MgJ2RpcikpCiAgICAgIChs ZXQgKChmaWxlcyAoZGlyZWN0b3J5LWZpbGVzIGRlZmF1bHQtZGlyZWN0b3J5IHQgIlxcLmVsXFwn IiB0KSkKICAgICAgICAgICAgaW5mbykKICAgICAgICAod2hpbGUgZmlsZXMKICAgICAgICAgICh3 aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgICAgIChsZXQgKChmaWxlIChwb3AgZmlsZXMpKSkKICAg ICAgICAgICAgICA7OyBUaGUgZmlsZSBtYXkgYmUgYSBsaW5rIHRvIGEgbm9uZXhpc3RlbnQgZmls ZTsgZS5nLiwgYQogICAgICAgICAgICAgIDs7IGxvY2sgZmlsZS4KICAgICAgICAgICAgICAod2hl biAoZmlsZS1leGlzdHMtcCBmaWxlKQogICAgICAgICAgICAgICAgKGluc2VydC1maWxlLWNvbnRl bnRzIGZpbGUpCiAgICAgICAgICAgICAgICA7OyBXaGVuIHdlIGZpbmQgdGhlIGZpbGUgd2l0aCB0 aGUgZGF0YSwKICAgICAgICAgICAgICAgICh3aGVuIChzZXRxIGluZm8gKGlnbm9yZS1lcnJvcnMg KHBhY2thZ2UtYnVmZmVyLWluZm8pKSkKICAgICAgICAgICAgICAgICAgOzsgc3RvcCBsb29waW5n LAogICAgICAgICAgICAgICAgICAoc2V0cSBmaWxlcyBuaWwpCiAgICAgICAgICAgICAgICAgIDs7 IHNldCB0aGUgJ2RpciBraW5kLAogICAgICAgICAgICAgICAgICAoc2V0ZiAocGFja2FnZS1kZXNj LWtpbmQgaW5mbykgJ2RpcikpKSkpKQogICAgICAgICh1bmxlc3MgaW5mbwogICAgICAgICAgKGVy cm9yICJObyAuZWwgZmlsZXMgd2l0aCBwYWNrYWdlIGhlYWRlcnMgaW4gYCVzJyIgZGVmYXVsdC1k aXJlY3RvcnkpKQogICAgICAgIDs7IGFuZCByZXR1cm4gdGhlIGluZm8uCiAgICAgICAgaW5mbykp KSkKCgwKOzs7IENvbW11bmljYXRpbmcgd2l0aCBBcmNoaXZlcwo7OyBTZXQgb2YgbG93LWxldmVs IGZ1bmN0aW9ucyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGFyY2hpdmVzIGFuZAo7OyBzaWduYXR1 cmUgY2hlY2tpbmcuCgooZGVmdW4gcGFja2FnZS0td3JpdGUtZmlsZS1uby1jb2RpbmcgKGZpbGUt bmFtZSkKICAiV3JpdGUgZmlsZSBGSUxFLU5BTUUgd2l0aG91dCBlbmNvZGluZyB1c2luZyBjb2Rp bmcgc3lzdGVtLiIKICAobGV0ICgoYnVmZmVyLWZpbGUtY29kaW5nLXN5c3RlbSAnbm8tY29udmVy c2lvbikpCiAgICAod3JpdGUtcmVnaW9uIChwb2ludC1taW4pIChwb2ludC1tYXgpIGZpbGUtbmFt ZSBuaWwgJ3NpbGVudCkpKQoKKGRlY2xhcmUtZnVuY3Rpb24gdXJsLWh0dHAtZmlsZS1leGlzdHMt cCAidXJsLWh0dHAiICh1cmwpKQoKKGRlZnVuIHBhY2thZ2UtLWFyY2hpdmUtZmlsZS1leGlzdHMt cCAobG9jYXRpb24gZmlsZSkKICAiUmV0dXJuIHQgaWYgRklMRSBleGlzdHMgaW4gcmVtb3RlIExP Q0FUSU9OLiIKICAobGV0ICgoaHR0cCAoc3RyaW5nLW1hdGNoICJcXGBodHRwcz86IiBsb2NhdGlv bikpKQogICAgKGlmIGh0dHAKICAgICAgICAocHJvZ24KICAgICAgICAgIChyZXF1aXJlICd1cmwt aHR0cCkKICAgICAgICAgICh1cmwtaHR0cC1maWxlLWV4aXN0cy1wIChjb25jYXQgbG9jYXRpb24g ZmlsZSkpKQogICAgICAoZmlsZS1leGlzdHMtcCAoZXhwYW5kLWZpbGUtbmFtZSBmaWxlIGxvY2F0 aW9uKSkpKSkKCihkZWNsYXJlLWZ1bmN0aW9uIGVwZy1tYWtlLWNvbnRleHQgImVwZyIKICAgICAg ICAgICAgICAgICAgKCZvcHRpb25hbCBwcm90b2NvbCBhcm1vciB0ZXh0bW9kZSBpbmNsdWRlLWNl cnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVyLWFsZ29yaXRobQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdC1hbGdvcml0aG0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjb21wcmVzcy1hbGdvcml0aG0pKQooZGVjbGFyZS1mdW5jdGlvbiBlcGctdmVy aWZ5LXN0cmluZyAiZXBnIiAoIGNvbnRleHQgc2lnbmF0dXJlCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbmFsIHNpZ25lZC10ZXh0KSkKKGRlY2xhcmUt ZnVuY3Rpb24gZXBnLWNvbnRleHQtcmVzdWx0LWZvciAiZXBnIiAoY29udGV4dCBuYW1lKSkKKGRl Y2xhcmUtZnVuY3Rpb24gZXBnLXNpZ25hdHVyZS1zdGF0dXMgImVwZyIgKHNpZ25hdHVyZSkgdCkK KGRlY2xhcmUtZnVuY3Rpb24gZXBnLXNpZ25hdHVyZS10by1zdHJpbmcgImVwZyIgKHNpZ25hdHVy ZSkpCgooZGVmdW4gcGFja2FnZS0tZGlzcGxheS12ZXJpZnktZXJyb3IgKGNvbnRleHQgc2lnLWZp bGUpCiAgIlNob3cgZXJyb3IgZGV0YWlscyB3aXRoIENPTlRFWFQgZm9yIGZhaWxlZCB2ZXJpZmlj YXRpb24gb2YgU0lHLUZJTEUuClRoZSBkZXRhaWxzIGFyZSBzaG93biBpbiBhIG5ldyBidWZmZXIg Y2FsbGVkIFwiKkVycm9yXCIuIgogICh1bmxlc3MgKGVxdWFsIChlcGctY29udGV4dC1lcnJvci1v dXRwdXQgY29udGV4dCkgIiIpCiAgICAod2l0aC1vdXRwdXQtdG8tdGVtcC1idWZmZXIgIipFcnJv cioiCiAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAogICAgICAgIChp ZiAoZXBnLWNvbnRleHQtcmVzdWx0LWZvciBjb250ZXh0ICd2ZXJpZnkpCiAgICAgICAgICAgIChp bnNlcnQgKGZvcm1hdCAiRmFpbGVkIHRvIHZlcmlmeSBzaWduYXR1cmUgJXM6XG4iIHNpZy1maWxl KQogICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQgIydlcGctc2lnbmF0dXJlLXRvLXN0cmlu ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVwZy1jb250ZXh0LXJlc3VsdC1mb3Ig Y29udGV4dCAndmVyaWZ5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIikpCiAg ICAgICAgICAoaW5zZXJ0IChmb3JtYXQgIkVycm9yIHdoaWxlIHZlcmlmeWluZyBzaWduYXR1cmUg JXM6XG4iIHNpZy1maWxlKSkpCiAgICAgICAgKGluc2VydCAiXG5Db21tYW5kIG91dHB1dDpcbiIg KGVwZy1jb250ZXh0LWVycm9yLW91dHB1dCBjb250ZXh0KSkpKSkpCgooZGVmbWFjcm8gcGFja2Fn ZS0td2l0aC13b3JrLWJ1ZmZlciAobG9jYXRpb24gZmlsZSAmcmVzdCBib2R5KQogICJSdW4gQk9E WSBpbiBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBGSUxFIGF0IExPQ0FUSU9O LgpMT0NBVElPTiBpcyB0aGUgYmFzZSBsb2NhdGlvbiBvZiBhIHBhY2thZ2UgYXJjaGl2ZSwgYW5k IHNob3VsZCBiZQpvbmUgb2YgdGhlIFVSTHMgKG9yIGZpbGUgbmFtZXMpIHNwZWNpZmllZCBpbiBg cGFja2FnZS1hcmNoaXZlcycuCkZJTEUgaXMgdGhlIG5hbWUgb2YgYSBmaWxlIHJlbGF0aXZlIHRv IHRoYXQgYmFzZSBsb2NhdGlvbi4KClRoaXMgbWFjcm8gcmV0cmlldmVzIEZJTEUgZnJvbSBMT0NB VElPTiBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciwKYW5kIGV2YWx1YXRlcyBCT0RZIHdoaWxlIHRo YXQgYnVmZmVyIGlzIGN1cnJlbnQuICBUaGlzIHdvcmsKYnVmZmVyIGlzIGtpbGxlZCBhZnRlcndh cmRzLiAgUmV0dXJuIHRoZSBsYXN0IHZhbHVlIGluIEJPRFkuIgogIChkZWNsYXJlIChpbmRlbnQg MikgKGRlYnVnIHQpCiAgICAgICAgICAgKG9ic29sZXRlIHBhY2thZ2UtLXdpdGgtcmVzcG9uc2Ut YnVmZmVyICIyNS4xIikpCiAgYCh3aXRoLXRlbXAtYnVmZmVyCiAgICAgKGlmIChzdHJpbmctbWF0 Y2gtcCAiXFxgaHR0cHM/OiIgLGxvY2F0aW9uKQogICAgICAgICAodXJsLWluc2VydC1maWxlLWNv bnRlbnRzIChjb25jYXQgLGxvY2F0aW9uICxmaWxlKSkKICAgICAgICh1bmxlc3MgKGZpbGUtbmFt ZS1hYnNvbHV0ZS1wICxsb2NhdGlvbikKICAgICAgICAgKGVycm9yICJBcmNoaXZlIGxvY2F0aW9u ICVzIGlzIG5vdCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiCiAgICAgICAgICAgLGxvY2F0aW9uKSkK ICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyAoZXhwYW5kLWZpbGUtbmFtZSAsZmlsZSAsbG9j YXRpb24pKSkKICAgICAsQGJvZHkpKQoKKGNsLWRlZm1hY3JvIHBhY2thZ2UtLXdpdGgtcmVzcG9u c2UtYnVmZmVyICh1cmwgJnJlc3QgYm9keSAma2V5IGFzeW5jIGZpbGUgZXJyb3ItZm9ybSBub2Vy cm9yICZhbGxvdy1vdGhlci1rZXlzKQogICJBY2Nlc3MgVVJMIGFuZCBydW4gQk9EWSBpbiBhIGJ1 ZmZlciBjb250YWluaW5nIHRoZSByZXNwb25zZS4KUG9pbnQgaXMgYWZ0ZXIgdGhlIGhlYWRlcnMg d2hlbiBCT0RZIHJ1bnMuCkZJTEUsIGlmIHByb3ZpZGVkLCBpcyBhZGRlZCB0byBVUkwuClVSTCBj YW4gYmUgYSBsb2NhbCBmaWxlIG5hbWUsIHdoaWNoIG11c3QgYmUgYWJzb2x1dGUuCkFTWU5DLCBp ZiBub24tbmlsLCBydW5zIHRoZSByZXF1ZXN0IGFzeW5jaHJvbm91c2x5LgpFUlJPUi1GT1JNIGlz IHJ1biBvbmx5IGlmIGEgY29ubmVjdGlvbiBlcnJvciBvY2N1cnMuICBJZiBOT0VSUk9SCmlzIG5v bi1uaWwsIGRvbid0IHByb3BhZ2F0ZSBjb25uZWN0aW9uIGVycm9ycyAoZG9lcyBub3QgYXBwbHkg dG8KZXJyb3JzIHNpZ25hbGVkIGJ5IEVSUk9SLUZPUk0gb3IgYnkgQk9EWSkuCgpcKGZuIFVSTCAm a2V5IEFTWU5DIEZJTEUgRVJST1ItRk9STSBOT0VSUk9SICZyZXN0IEJPRFkpIgogIChkZWNsYXJl IChpbmRlbnQgZGVmdW4pIChkZWJ1ZyAoc2V4cCBib2R5KSkpCiAgKHdoaWxlIChrZXl3b3JkcCAo Y2FyIGJvZHkpKQogICAgKHNldHEgYm9keSAoY2RyIChjZHIgYm9keSkpKSkKICBgKHBhY2thZ2Ut LXdpdGgtcmVzcG9uc2UtYnVmZmVyLTEgLHVybCAobGFtYmRhICgpICxAYm9keSkKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZpbGUgLGZpbGUKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgOmFzeW5jICxhc3luYwogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA6ZXJyb3ItZnVuY3Rpb24gKGxhbWJkYSAoKSAsZXJyb3ItZm9ybSkKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm5vZXJyb3IgLG5vZXJyb3IpKQoKKGRlZm1h Y3JvIHBhY2thZ2UtLXVubGVzcy1lcnJvciAoYm9keSAmcmVzdCBiZWZvcmUtYm9keSkKICAoZGVj bGFyZSAoZGVidWcgdCkgKGluZGVudCAxKSkKICAobGV0ICgoZXJyIChtYWtlLXN5bWJvbCAiZXJy IikpKQogICAgYCh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAoc2V0LWJ1ZmZlci1tdWx0aWJ5dGUg bmlsKQogICAgICAgKHdoZW4gKGNvbmRpdGlvbi1jYXNlICxlcnIKICAgICAgICAgICAgICAgICAo cHJvZ24gLEBiZWZvcmUtYm9keSB0KQogICAgICAgICAgICAgICAoZXJyb3IgKGZ1bmNhbGwgZXJy b3ItZnVuY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAodW5sZXNzIG5vZXJyb3IKICAgICAg ICAgICAgICAgICAgICAgICAgKHNpZ25hbCAoY2FyICxlcnIpIChjZHIgLGVycikpKSkpCiAgICAg ICAgIChmdW5jYWxsICxib2R5KSkpKSkKCihjbC1kZWZ1biBwYWNrYWdlLS13aXRoLXJlc3BvbnNl LWJ1ZmZlci0xICh1cmwgYm9keSAma2V5IGFzeW5jIGZpbGUgZXJyb3ItZnVuY3Rpb24gbm9lcnJv ciAmYWxsb3ctb3RoZXIta2V5cykKICAoaWYgKHN0cmluZy1tYXRjaC1wICJcXGBodHRwcz86IiB1 cmwpCiAgICAgICAgKGxldCAoKHVybCAodXJsLWV4cGFuZC1maWxlLW5hbWUgZmlsZSB1cmwpKSkK ICAgICAgICAgIChpZiBhc3luYwogICAgICAgICAgICAgIChwYWNrYWdlLS11bmxlc3MtZXJyb3Ig IydpZ25vcmUKICAgICAgICAgICAgICAgICh1cmwtcmV0cmlldmUKICAgICAgICAgICAgICAgICB1 cmwKICAgICAgICAgICAgICAgICAobGFtYmRhIChzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAo bGV0ICgoYiAoY3VycmVudC1idWZmZXIpKSkKICAgICAgICAgICAgICAgICAgICAgKHJlcXVpcmUg J3VybC1oYW5kbGVycykKICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtLXVubGVzcy1lcnJv ciBib2R5CiAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4tbGV0KiAoKGVyIChwbGlzdC1nZXQg c3RhdHVzIDplcnJvcikpKQogICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yICJFcnJvciBy ZXRyaWV2aW5nOiAlcyAlUyIgdXJsIGVyKSkKICAgICAgICAgICAgICAgICAgICAgICAod2l0aC1j dXJyZW50LWJ1ZmZlciBiCiAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIChwb2lu dC1taW4pKQogICAgICAgICAgICAgICAgICAgICAgICAgKHVubGVzcyAoc2VhcmNoLWZvcndhcmQt cmVnZXhwICJeXHI/XG5ccj8iIG5pbCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJy b3IgIkVycm9yIHJldHJpZXZpbmc6ICVzICVTIgogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdXJsICJpbmNvbXByZWhlbnNpYmxlIGJ1ZmZlciIpKSkKICAgICAgICAgICAgICAgICAg ICAgICAodXJsLWluc2VydCBiKQogICAgICAgICAgICAgICAgICAgICAgIChraWxsLWJ1ZmZlciBi KQogICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpKSkpCiAgICAg ICAgICAgICAgICAgbmlsCiAgICAgICAgICAgICAgICAgJ3NpbGVudCkpCiAgICAgICAgICAgIChw YWNrYWdlLS11bmxlc3MtZXJyb3IgYm9keQogICAgICAgICAgICAgIDs7IENvcHkmcGFzdGVkIGZy b20gdXJsLWluc2VydC1maWxlLWNvbnRlbnRzLAogICAgICAgICAgICAgIDs7IGV4Y2VwdCBpdCBj YWxscyBgdXJsLWluc2VydCcgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb250ZW50cwogICAgICAgICAg ICAgIDs7IGxpdGVyYWxseSAoYnV0IHRoZXJlJ3Mgbm8gdXJsLWluc2VydC1maWxlLWNvbnRlbnRz LWxpdGVyYWxseSkuCiAgICAgICAgICAgICAgKGxldCAoKGJ1ZmZlciAodXJsLXJldHJpZXZlLXN5 bmNocm9ub3VzbHkgdXJsKSkpCiAgICAgICAgICAgICAgICAodW5sZXNzIGJ1ZmZlciAoc2lnbmFs ICdmaWxlLWVycm9yIChsaXN0IHVybCAiTm8gRGF0YSIpKSkKICAgICAgICAgICAgICAgICh3aGVu IChmYm91bmRwICd1cmwtaHR0cC0taW5zZXJ0LWZpbGUtaGVscGVyKQogICAgICAgICAgICAgICAg ICA7OyBYWFg6IFRoaXMgaXMgSFRUUC9TIHNwZWNpZmljIGFuZCBzaG91bGQgYmUgbW92ZWQKICAg ICAgICAgICAgICAgICAgOzsgdG8gdXJsLWh0dHAgaW5zdGVhZC4gIFNlZSBidWcjMTc1NDkuCiAg ICAgICAgICAgICAgICAgICh1cmwtaHR0cC0taW5zZXJ0LWZpbGUtaGVscGVyIGJ1ZmZlciB1cmwp KQogICAgICAgICAgICAgICAgKHVybC1pbnNlcnQgYnVmZmVyKQogICAgICAgICAgICAgICAgKGtp bGwtYnVmZmVyIGJ1ZmZlcikKICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikp KSkpKQogICAgICAocGFja2FnZS0tdW5sZXNzLWVycm9yIGJvZHkKICAgICAgICAodW5sZXNzIChm aWxlLW5hbWUtYWJzb2x1dGUtcCB1cmwpCiAgICAgICAgICAoZXJyb3IgIkxvY2F0aW9uICVzIGlz IG5vdCBhIHVybCBub3IgYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiB1cmwpKQogICAgICAgIChpbnNl cnQtZmlsZS1jb250ZW50cy1saXRlcmFsbHkgKGV4cGFuZC1maWxlLW5hbWUgZmlsZSB1cmwpKSkp KQoKKGRlZmluZS1lcnJvciAnYmFkLXNpZ25hdHVyZSAiRmFpbGVkIHRvIHZlcmlmeSBzaWduYXR1 cmUiKQoKKGRlZnVuIHBhY2thZ2UtLWNoZWNrLXNpZ25hdHVyZS1jb250ZW50IChjb250ZW50IHN0 cmluZyAmb3B0aW9uYWwgc2lnLWZpbGUpCiAgIkNoZWNrIHNpZ25hdHVyZSBDT05URU5UIGFnYWlu c3QgU1RSSU5HLgpTSUctRklMRSBpcyB0aGUgbmFtZSBvZiB0aGUgc2lnbmF0dXJlIGZpbGUsIHVz ZWQgd2hlbiBzaWduYWxpbmcKZXJyb3JzLiIKICAobGV0ICgoY29udGV4dCAoZXBnLW1ha2UtY29u dGV4dCAnT3BlblBHUCkpKQogICAgKHdoZW4gcGFja2FnZS1nbnVwZ2hvbWUtZGlyCiAgICAgIChz ZXRmIChlcGctY29udGV4dC1ob21lLWRpcmVjdG9yeSBjb250ZXh0KSBwYWNrYWdlLWdudXBnaG9t ZS1kaXIpKQogICAgKGNvbmRpdGlvbi1jYXNlIGVycm9yCiAgICAgICAgKGVwZy12ZXJpZnktc3Ry aW5nIGNvbnRleHQgY29udGVudCBzdHJpbmcpCiAgICAgIChlcnJvciAocGFja2FnZS0tZGlzcGxh eS12ZXJpZnktZXJyb3IgY29udGV4dCBzaWctZmlsZSkKICAgICAgICAgICAgIChzaWduYWwgJ2Jh ZC1zaWduYXR1cmUgZXJyb3IpKSkKICAgIChsZXQgKGdvb2Qtc2lnbmF0dXJlcyBoYWQtZmF0YWwt ZXJyb3IpCiAgICAgIDs7IFRoZSAuc2lnIGZpbGUgbWF5IGNvbnRhaW4gbXVsdGlwbGUgc2lnbmF0 dXJlcy4gIFN1Y2Nlc3MgaWYgb25lCiAgICAgIDs7IG9mIHRoZSBzaWduYXR1cmVzIGlzIGdvb2Qu CiAgICAgIChkb2xpc3QgKHNpZyAoZXBnLWNvbnRleHQtcmVzdWx0LWZvciBjb250ZXh0ICd2ZXJp ZnkpKQogICAgICAgIChpZiAoZXEgKGVwZy1zaWduYXR1cmUtc3RhdHVzIHNpZykgJ2dvb2QpCiAg ICAgICAgICAgIChwdXNoIHNpZyBnb29kLXNpZ25hdHVyZXMpCiAgICAgICAgICA7OyBJZiBgcGFj a2FnZS1jaGVjay1zaWduYXR1cmUnIGlzIGFsbG93LXVuc2lnbmVkLCBkb24ndAogICAgICAgICAg Ozsgc2lnbmFsIGVycm9yIHdoZW4gd2UgY2FuJ3QgdmVyaWZ5IHNpZ25hdHVyZSBiZWNhdXNlIG9m CiAgICAgICAgICA7OyBtaXNzaW5nIHB1YmxpYyBrZXkuICBPdGhlciBlcnJvcnMgYXJlIHN0aWxs IHRyZWF0ZWQgYXMKICAgICAgICAgIDs7IGZhdGFsIChidWcjMTc2MjUpLgogICAgICAgICAgKHVu bGVzcyAoYW5kIChlcSAocGFja2FnZS1jaGVjay1zaWduYXR1cmUpICdhbGxvdy11bnNpZ25lZCkK ICAgICAgICAgICAgICAgICAgICAgICAoZXEgKGVwZy1zaWduYXR1cmUtc3RhdHVzIHNpZykgJ25v LXB1YmtleSkpCiAgICAgICAgICAgIChzZXRxIGhhZC1mYXRhbC1lcnJvciB0KSkpKQogICAgICAo d2hlbiAob3IgKG51bGwgZ29vZC1zaWduYXR1cmVzKQogICAgICAgICAgICAgICAgKGFuZCAoZXEg KHBhY2thZ2UtY2hlY2stc2lnbmF0dXJlKSAnYWxsKQogICAgICAgICAgICAgICAgICAgICBoYWQt ZmF0YWwtZXJyb3IpKQogICAgICAgIChwYWNrYWdlLS1kaXNwbGF5LXZlcmlmeS1lcnJvciBjb250 ZXh0IHNpZy1maWxlKQogICAgICAgIChzaWduYWwgJ2JhZC1zaWduYXR1cmUgKGxpc3Qgc2lnLWZp bGUpKSkKICAgICAgZ29vZC1zaWduYXR1cmVzKSkpCgooZGVmdW4gcGFja2FnZS0tY2hlY2stc2ln bmF0dXJlIChsb2NhdGlvbiBmaWxlICZvcHRpb25hbCBzdHJpbmcgYXN5bmMgY2FsbGJhY2sgdW53 aW5kKQogICJDaGVjayBzaWduYXR1cmUgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLgpEb3dubG9hZCB0 aGUgc2lnbmF0dXJlIGZpbGUgZnJvbSBMT0NBVElPTiBieSBhcHBlbmRpbmcgXCIuc2lnXCIKdG8g RklMRS4KR251UEcga2V5cmluZyBsb2NhdGlvbiBkZXBlbmRzIG9uIGBwYWNrYWdlLWdudXBnaG9t ZS1kaXInLgpTVFJJTkcgaXMgdGhlIHN0cmluZyB0byB2ZXJpZnksIGl0IGRlZmF1bHRzIHRvIGBi dWZmZXItc3RyaW5nJy4KSWYgQVNZTkMgaXMgbm9uLW5pbCwgdGhlIGRvd25sb2FkIG9mIHRoZSBz aWduYXR1cmUgZmlsZSBpcwpkb25lIGFzeW5jaHJvbm91c2x5LgoKSWYgdGhlIHNpZ25hdHVyZSBk b2VzIG5vdCB2ZXJpZnksIHNpZ25hbCBhbiBlcnJvci4KSWYgdGhlIHNpZ25hdHVyZSBpcyB2ZXJp ZmllZCBhbmQgQ0FMTEJBQ0sgd2FzIHByb3ZpZGVkLCBgZnVuY2FsbCcKQ0FMTEJBQ0sgd2l0aCB0 aGUgbGlzdCBvZiBnb29kIHNpZ25hdHVyZXMgYXMgYXJndW1lbnQgKHRoZSBsaXN0CmNhbiBiZSBl bXB0eSkuCklmIG5vIHNpZ25hdHVyZXMgZmlsZSBpcyBmb3VuZCwgYW5kIGBwYWNrYWdlLWNoZWNr LXNpZ25hdHVyZScgaXMKYGFsbG93LXVuc2lnbmVkJywgY2FsbCBDQUxMQkFDSyB3aXRoIGEgbmls IGFyZ3VtZW50LgpPdGhlcndpc2UsIGFuIGVycm9yIGlzIHNpZ25hbGVkLgoKVU5XSU5ELCBpZiBw cm92aWRlZCwgaXMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYWZ0ZXIgZXZlcnl0aGluZwplbHNl LCBldmVuIGlmIGFuIGVycm9yIGlzIHNpZ25hbGVkLiIKICAobGV0ICgoc2lnLWZpbGUgKGNvbmNh dCBmaWxlICIuc2lnIikpCiAgICAgICAgKHN0cmluZyAob3Igc3RyaW5nIChidWZmZXItc3RyaW5n KSkpKQogICAgKHBhY2thZ2UtLXdpdGgtcmVzcG9uc2UtYnVmZmVyIGxvY2F0aW9uIDpmaWxlIHNp Zy1maWxlCiAgICAgIDphc3luYyBhc3luYyA6bm9lcnJvciB0CiAgICAgIDs7IENvbm5lY3Rpb24g ZXJyb3IgaXMgYXNzdW1lZCB0byBtZWFuICJubyBzaWctZmlsZSIuCiAgICAgIDplcnJvci1mb3Jt IChsZXQgKChhbGxvdy11bnNpZ25lZAogICAgICAgICAgICAgICAgICAgICAgICAgKGVxIChwYWNr YWdlLWNoZWNrLXNpZ25hdHVyZSkgJ2FsbG93LXVuc2lnbmVkKSkpCiAgICAgICAgICAgICAgICAg ICAgKHdoZW4gKGFuZCBjYWxsYmFjayBhbGxvdy11bnNpZ25lZCkKICAgICAgICAgICAgICAgICAg ICAgIChmdW5jYWxsIGNhbGxiYWNrIG5pbCkpCiAgICAgICAgICAgICAgICAgICAgKHdoZW4gdW53 aW5kIChmdW5jYWxsIHVud2luZCkpCiAgICAgICAgICAgICAgICAgICAgKHVubGVzcyBhbGxvdy11 bnNpZ25lZAogICAgICAgICAgICAgICAgICAgICAgKGVycm9yICJVbnNpZ25lZCBmaWxlIGAlcycg YXQgJXMiIGZpbGUgbG9jYXRpb24pKSkKICAgICAgOzsgT1RPSCwgYW4gZXJyb3IgaGVyZSBtZWFu cyAiYmFkIHNpZ25hdHVyZSIsIHdoaWNoIHdlIG5ldmVyCiAgICAgIDs7IHN1cHByZXNzLiAgKEJ1 ZyMyMjA4OSkKICAgICAgKHVud2luZC1wcm90ZWN0CiAgICAgICAgICAobGV0ICgoc2lnIChwYWNr YWdlLS1jaGVjay1zaWduYXR1cmUtY29udGVudAogICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZl ci1zdWJzdHJpbmcgKHBvaW50KSAocG9pbnQtbWF4KSkKICAgICAgICAgICAgICAgICAgICAgIHN0 cmluZyBzaWctZmlsZSkpKQogICAgICAgICAgICAod2hlbiBjYWxsYmFjayAoZnVuY2FsbCBjYWxs YmFjayBzaWcpKQogICAgICAgICAgICBzaWcpCiAgICAgICAgKHdoZW4gdW53aW5kIChmdW5jYWxs IHVud2luZCkpKSkpKQoMCjs7OyBQYWNrYWdlcyBvbiBBcmNoaXZlcwo7OyBUaGUgZm9sbG93aW5n IHZhcmlhYmxlcyBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdlcyBhdmFpbGFibGUKOzsg ZnJvbSBhcmNoaXZlcy4gIFRoZSBtb3N0IGltcG9ydGFudCBvZiB0aGVzZSBpcwo7OyBgcGFja2Fn ZS1hcmNoaXZlLWNvbnRlbnRzJyB3aGljaCBpcyBpbml0aWFsbHkgcG9wdWxhdGVkIGJ5IHRoZQo7 OyBmdW5jdGlvbiBgcGFja2FnZS1yZWFkLWFsbC1hcmNoaXZlLWNvbnRlbnRzJyBmcm9tIGEgY2Fj aGUgb24gZGlzay4KOzsgVGhlIGBwYWNrYWdlLWluaXRpYWxpemUnIGNvbW1hbmQgaXMgYWxzbyBj bG9zZWx5IHJlbGF0ZWQgdG8gdGhpcwo7OyBzZWN0aW9uLCBidXQgaXQgaGFzIGl0cyBvd24gc2Vj dGlvbi4KCihkZWZjb25zdCBwYWNrYWdlLWFyY2hpdmUtdmVyc2lvbiAxCiAgIlZlcnNpb24gbnVt YmVyIG9mIHRoZSBwYWNrYWdlIGFyY2hpdmUgdW5kZXJzdG9vZCBieSBwYWNrYWdlLmVsLgpMb3dl ciB2ZXJzaW9uIG51bWJlcnMgdGhhbiB0aGlzIHdpbGwgcHJvYmFibHkgYmUgdW5kZXJzdG9vZCBh cyB3ZWxsLiIpCgo7OyBXZSBkb24ndCBwcmltZSB0aGUgY2FjaGUgc2luY2UgaXQgdGVuZHMgdG8g Z2V0IG91dCBvZiBkYXRlLgooZGVmdmFyIHBhY2thZ2UtYXJjaGl2ZS1jb250ZW50cyBuaWwKICAi Q2FjaGUgb2YgdGhlIGNvbnRlbnRzIG9mIGFsbCBhcmNoaXZlcyBpbiBgcGFja2FnZS1hcmNoaXZl cycuClRoaXMgaXMgYW4gYWxpc3QgbWFwcGluZyBwYWNrYWdlIG5hbWVzIChzeW1ib2xzKSB0bwpu b24tZW1wdHkgbGlzdHMgb2YgYHBhY2thZ2UtZGVzYycgc3RydWN0dXJlcy4iKQoocHV0ICdwYWNr YWdlLWFyY2hpdmUtY29udGVudHMgJ3Jpc2t5LWxvY2FsLXZhcmlhYmxlIHQpCgooZGVmdmFyIHBh Y2thZ2UtLWNvbXBhdGliaWxpdHktdGFibGUgbmlsCiAgIkhhc2ggdGFibGUgY29ubmVjdGluZyBw YWNrYWdlIG5hbWVzIHRvIHRoZWlyIGNvbXBhdGliaWxpdHkuCkVhY2gga2V5IGlzIGEgc3ltYm9s LCB0aGUgbmFtZSBvZiBhIHBhY2thZ2UuCgpUaGUgdmFsdWUgaXMgZWl0aGVyIG5pbCwgcmVwcmVz ZW50aW5nIGFuIGluY29tcGF0aWJsZSBwYWNrYWdlLCBvcgphIHZlcnNpb24gbGlzdCwgcmVwcmVz ZW50aW5nIHRoZSBoaWdoZXN0IGNvbXBhdGlibGUgdmVyc2lvbiBvZgp0aGF0IHBhY2thZ2Ugd2hp Y2ggaXMgYXZhaWxhYmxlLgoKQSBwYWNrYWdlIGlzIGNvbnNpZGVyZWQgaW5jb21wYXRpYmxlIGlm IGl0IHJlcXVpcmVzIGFuIEVtYWNzCnZlcnNpb24gaGlnaGVyIHRoYW4gdGhlIG9uZSBiZWluZyB1 c2VkLiAgVG8gY2hlY2sgZm9yIHBhY2thZ2UKXChpbiljb21wYXRpYmlsaXR5LCBkb24ndCByZWFk IHRoaXMgdGFibGUgZGlyZWN0bHksIHVzZQpgcGFja2FnZS0taW5jb21wYXRpYmxlLXAnIHdoaWNo IGFsc28gY2hlY2tzIGRlcGVuZGVuY2llcy4iKQoKKGRlZnVuIHBhY2thZ2UtLWJ1aWxkLWNvbXBh dGliaWxpdHktdGFibGUgKCkKICAiQnVpbGQgYHBhY2thZ2UtLWNvbXBhdGliaWxpdHktdGFibGUn IHdpdGggYHBhY2thZ2UtLW1hcGMnLiIKICA7OyBJbml0aWFsaXplIHRoZSBsaXN0IG9mIGJ1aWx0 LWlucy4KICAocmVxdWlyZSAnZmluZGVyLWluZiBuaWwgdCkKICA7OyBCdWlsZCBjb21wYXQgdGFi bGUuCiAgKHNldHEgcGFja2FnZS0tY29tcGF0aWJpbGl0eS10YWJsZSAobWFrZS1oYXNoLXRhYmxl IDp0ZXN0ICdlcSkpCiAgKHBhY2thZ2UtLW1hcGMgIydwYWNrYWdlLS1hZGQtdG8tY29tcGF0aWJp bGl0eS10YWJsZSkpCgooZGVmdW4gcGFja2FnZS0tYWRkLXRvLWNvbXBhdGliaWxpdHktdGFibGUg KHBrZykKICAiSWYgUEtHIGlzIGNvbXBhdGlibGUgKHdpdGhvdXQgZGVwZW5kZW5jaWVzKSwgYWRk IHRvIHRoZSBjb21wYXRpYmlsaXR5IHRhYmxlLgpQS0cgaXMgYSBwYWNrYWdlLWRlc2Mgb2JqZWN0 LgpPbmx5IGFkZHMgaWYgaXRzIHZlcnNpb24gaXMgaGlnaGVyIHRoYW4gd2hhdCdzIGFscmVhZHkg c3RvcmVkIGluCnRoZSB0YWJsZS4iCiAgKHVubGVzcyAocGFja2FnZS0taW5jb21wYXRpYmxlLXAg cGtnICdzaGFsbG93KQogICAgKGxldCogKChuYW1lIChwYWNrYWdlLWRlc2MtbmFtZSBwa2cpKQog ICAgICAgICAgICh2ZXJzaW9uIChvciAocGFja2FnZS1kZXNjLXZlcnNpb24gcGtnKSAnKDApKSkK ICAgICAgICAgICAodGFibGUtdmVyc2lvbiAoZ2V0aGFzaCBuYW1lIHBhY2thZ2UtLWNvbXBhdGli aWxpdHktdGFibGUpKSkKICAgICAgKHdoZW4gKG9yIChub3QgdGFibGUtdmVyc2lvbikKICAgICAg ICAgICAgICAgICh2ZXJzaW9uLWxpc3QtPCB0YWJsZS12ZXJzaW9uIHZlcnNpb24pKQogICAgICAg IChwdXRoYXNoIG5hbWUgdmVyc2lvbiBwYWNrYWdlLS1jb21wYXRpYmlsaXR5LXRhYmxlKSkpKSkK Cjs7IFBhY2thZ2UgZGVzY3JpcHRvciBvYmplY3RzIHVzZWQgaW5zaWRlIHRoZSAiYXJjaGl2ZS1j b250ZW50cyIgZmlsZS4KOzsgQ2hhbmdpbmcgdGhpcyBkZWZzdHJ1Y3QgaW1wbGllcyBjaGFuZ2lu ZyB0aGUgZm9ybWF0IG9mIHRoZQo7OyAiYXJjaGl2ZS1jb250ZW50cyIgZmlsZXMuCihjbC1kZWZz dHJ1Y3QgKHBhY2thZ2UtLWFjLWRlc2MKICAgICAgICAgICAgICAgKDpjb25zdHJ1Y3RvciBwYWNr YWdlLW1ha2UtYWMtZGVzYyAodmVyc2lvbiByZXFzIHN1bW1hcnkga2luZCBleHRyYXMpKQogICAg ICAgICAgICAgICAoOmNvcGllciBuaWwpCiAgICAgICAgICAgICAgICg6dHlwZSB2ZWN0b3IpKQog IHZlcnNpb24gcmVxcyBzdW1tYXJ5IGtpbmQgZXh0cmFzKQoKKGRlZnVuIHBhY2thZ2UtLWFwcGVu ZC10by1hbGlzdCAocGtnLWRlc2MgYWxpc3QpCiAgIkFwcGVuZCBhbiBlbnRyeSBmb3IgUEtHLURF U0MgdG8gdGhlIHN0YXJ0IG9mIEFMSVNUIGFuZCByZXR1cm4gaXQuClRoaXMgZW50cnkgdGFrZXMg dGhlIGZvcm0gKGBwYWNrYWdlLWRlc2MtbmFtZScgUEtHLURFU0MpLgoKSWYgQUxJU1QgYWxyZWFk eSBoYXMgYW4gZW50cnkgd2l0aCB0aGlzIG5hbWUsIGRlc3RydWN0aXZlbHkgYWRkClBLRy1ERVND IHRvIHRoZSBjZHIgb2YgdGhpcyBlbnRyeSBpbnN0ZWFkLCBzb3J0ZWQgYnkgdmVyc2lvbgpudW1i ZXIuIgogIChsZXQqICgobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAg ICAocHJpb3JpdHktdmVyc2lvbiAocGFja2FnZS1kZXNjLXByaW9yaXR5LXZlcnNpb24gcGtnLWRl c2MpKQogICAgICAgICAoZXhpc3RpbmctcGFja2FnZXMgKGFzc3EgbmFtZSBhbGlzdCkpKQogICAg KGlmIChub3QgZXhpc3RpbmctcGFja2FnZXMpCiAgICAgICAgKGNvbnMgKGxpc3QgbmFtZSBwa2ct ZGVzYykKICAgICAgICAgICAgICBhbGlzdCkKICAgICAgKHdoaWxlIChpZiAoYW5kIChjZHIgZXhp c3RpbmctcGFja2FnZXMpCiAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbi1saXN0LTwgcHJp b3JpdHktdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNr YWdlLWRlc2MtcHJpb3JpdHktdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoY2FkciBleGlzdGluZy1wYWNrYWdlcykpKSkKICAgICAgICAgICAgICAgICAoc2V0 cSBleGlzdGluZy1wYWNrYWdlcyAoY2RyIGV4aXN0aW5nLXBhY2thZ2VzKSkKICAgICAgICAgICAg ICAgKHB1c2ggcGtnLWRlc2MgKGNkciBleGlzdGluZy1wYWNrYWdlcykpCiAgICAgICAgICAgICAg IG5pbCkpCiAgICAgIGFsaXN0KSkpCgooZGVmdW4gcGFja2FnZS0tYWRkLXRvLWFyY2hpdmUtY29u dGVudHMgKHBhY2thZ2UgYXJjaGl2ZSkKICAiQWRkIHRoZSBQQUNLQUdFIGZyb20gdGhlIGdpdmVu IEFSQ0hJVkUgaWYgbmVjZXNzYXJ5LgpQQUNLQUdFIHNob3VsZCBoYXZlIHRoZSBmb3JtIChOQU1F IC4gUEFDS0FHRS0tQUMtREVTQykuCkFsc28sIGFkZCB0aGUgb3JpZ2luYXRpbmcgYXJjaGl2ZSB0 byB0aGUgYHBhY2thZ2UtZGVzYycgc3RydWN0dXJlLiIKICAobGV0KiAoKG5hbWUgKGNhciBwYWNr YWdlKSkKICAgICAgICAgKHZlcnNpb24gKHBhY2thZ2UtLWFjLWRlc2MtdmVyc2lvbiAoY2RyIHBh Y2thZ2UpKSkKICAgICAgICAgKHBrZy1kZXNjCiAgICAgICAgICAocGFja2FnZS1kZXNjLWNyZWF0 ZQogICAgICAgICAgIDpuYW1lIG5hbWUKICAgICAgICAgICA6dmVyc2lvbiB2ZXJzaW9uCiAgICAg ICAgICAgOnJlcXMgKHBhY2thZ2UtLWFjLWRlc2MtcmVxcyAoY2RyIHBhY2thZ2UpKQogICAgICAg ICAgIDpzdW1tYXJ5IChwYWNrYWdlLS1hYy1kZXNjLXN1bW1hcnkgKGNkciBwYWNrYWdlKSkKICAg ICAgICAgICA6a2luZCAocGFja2FnZS0tYWMtZGVzYy1raW5kIChjZHIgcGFja2FnZSkpCiAgICAg ICAgICAgOmFyY2hpdmUgYXJjaGl2ZQogICAgICAgICAgIDpleHRyYXMgKGFuZCAoPiAobGVuZ3Ro IChjZHIgcGFja2FnZSkpIDQpCiAgICAgICAgICAgICAgICAgICAgICAgIDs7IE9sZGVyIGFyY2hp dmUtY29udGVudHMgZmlsZXMgaGF2ZSBvbmx5IDQKICAgICAgICAgICAgICAgICAgICAgICAgOzsg ZWxlbWVudHMgaGVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtLWFjLWRlc2Mt ZXh0cmFzIChjZHIgcGFja2FnZSkpKSkpCiAgICAgICAgIChwaW5uZWQtdG8tYXJjaGl2ZSAoYXNz b2MgbmFtZSBwYWNrYWdlLXBpbm5lZC1wYWNrYWdlcykpKQogICAgOzsgU2tpcCBlbnRpcmVseSBp ZiBwaW5uZWQgdG8gYW5vdGhlciBhcmNoaXZlLgogICAgKHdoZW4gKG5vdCAoYW5kIHBpbm5lZC10 by1hcmNoaXZlCiAgICAgICAgICAgICAgICAgICAgKG5vdCAoZXF1YWwgKGNkciBwaW5uZWQtdG8t YXJjaGl2ZSkgYXJjaGl2ZSkpKSkKICAgICAgKHNldHEgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRz CiAgICAgICAgICAgIChwYWNrYWdlLS1hcHBlbmQtdG8tYWxpc3QgcGtnLWRlc2MgcGFja2FnZS1h cmNoaXZlLWNvbnRlbnRzKSkpKSkKCihkZWZ1biBwYWNrYWdlLS1yZWFkLWFyY2hpdmUtZmlsZSAo ZmlsZSkKICAiUmVhZCBjYWNoZWQgYXJjaGl2ZSBGSUxFIGRhdGEsIGlmIGl0IGV4aXN0cy4KUmV0 dXJuIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUsIG9yIG5pbCBpZiB0aGUgZmlsZSBkb2VzIG5vdCBl eGlzdC4KSWYgdGhlIGFyY2hpdmUgdmVyc2lvbiBpcyB0b28gbmV3LCBzaWduYWwgYW4gZXJyb3Iu IgogIChsZXQgKChmaWxlbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSBmaWxlIHBhY2thZ2UtdXNlci1k aXIpKSkKICAgICh3aGVuIChmaWxlLWV4aXN0cy1wIGZpbGVuYW1lKQogICAgICAod2l0aC10ZW1w LWJ1ZmZlcgogICAgICAgIChsZXQgKChjb2Rpbmctc3lzdGVtLWZvci1yZWFkICd1dGYtOCkpCiAg ICAgICAgICAoaW5zZXJ0LWZpbGUtY29udGVudHMgZmlsZW5hbWUpKQogICAgICAgIChsZXQgKChj b250ZW50cyAocmVhZCAoY3VycmVudC1idWZmZXIpKSkpCiAgICAgICAgICAoaWYgKD4gKGNhciBj b250ZW50cykgcGFja2FnZS1hcmNoaXZlLXZlcnNpb24pCiAgICAgICAgICAgICAgKGVycm9yICJQ YWNrYWdlIGFyY2hpdmUgdmVyc2lvbiAlZCBpcyBoaWdoZXIgdGhhbiAlZCIKICAgICAgICAgICAg ICAgIChjYXIgY29udGVudHMpIHBhY2thZ2UtYXJjaGl2ZS12ZXJzaW9uKSkKICAgICAgICAgIChj ZHIgY29udGVudHMpKSkpKSkKCihkZWZ1biBwYWNrYWdlLXJlYWQtYXJjaGl2ZS1jb250ZW50cyAo YXJjaGl2ZSkKICAiUmVhZCBjYWNoZWQgYXJjaGl2ZSBmaWxlIGZvciBBUkNISVZFLgpJZiBzdWNj ZXNzZnVsLCBzZXQgb3IgdXBkYXRlIHRoZSB2YXJpYWJsZSBgcGFja2FnZS1hcmNoaXZlLWNvbnRl bnRzJy4KQVJDSElWRSBzaG91bGQgYmUgYSBzdHJpbmcgbWF0Y2hpbmcgdGhlIG5hbWUgb2YgYSBw YWNrYWdlIGFyY2hpdmUKaW4gdGhlIHZhcmlhYmxlIGBwYWNrYWdlLWFyY2hpdmVzJy4KSWYgdGhl IGFyY2hpdmUgdmVyc2lvbiBpcyB0b28gbmV3LCBzaWduYWwgYW4gZXJyb3IuIgogIDs7IFZlcnNp b24gMSBvZiAnYXJjaGl2ZS1jb250ZW50cycgaXMgaWRlbnRpY2FsIHRvIG91ciBpbnRlcm5hbAog IDs7IHJlcHJlc2VudGF0aW9uLgogIChsZXQqICgoY29udGVudHMtZmlsZSAoZm9ybWF0ICJhcmNo aXZlcy8lcy9hcmNoaXZlLWNvbnRlbnRzIiBhcmNoaXZlKSkKICAgICAgICAgKGNvbnRlbnRzIChw YWNrYWdlLS1yZWFkLWFyY2hpdmUtZmlsZSBjb250ZW50cy1maWxlKSkpCiAgICAod2hlbiBjb250 ZW50cwogICAgICAoZG9saXN0IChwYWNrYWdlIGNvbnRlbnRzKQogICAgICAgIChpZiBwYWNrYWdl CiAgICAgICAgICAgIChwYWNrYWdlLS1hZGQtdG8tYXJjaGl2ZS1jb250ZW50cyBwYWNrYWdlIGFy Y2hpdmUpCiAgICAgICAgICAobHdhcm4gJyhwYWNrYWdlIHJlZnJlc2gpIDp3YXJuaW5nCiAgICAg ICAgICAgICAgICAgIklnbm9yaW5nIG5pbCBwYWNrYWdlIG9uIGAlcycgcGFja2FnZSBhcmNoaXZl IiBhcmNoaXZlKSkpKSkpCgooZGVmdmFyIHBhY2thZ2UtLW9sZC1hcmNoaXZlLXByaW9yaXRpZXMg bmlsCiAgIlN0b3JlIGN1cnJlbnRseSB1c2VkIGBwYWNrYWdlLWFyY2hpdmUtcHJpb3JpdGllcycu ClRoaXMgaXMgdGhlIHZhbHVlIG9mIGBwYWNrYWdlLWFyY2hpdmUtcHJpb3JpdGllcycgbGFzdCB0 aW1lCmBwYWNrYWdlLXJlYWQtYWxsLWFyY2hpdmUtY29udGVudHMnIHdhcyBjYWxsZWQuICBJdCBj YW4gYmUgdXNlZApieSBhcmJpdHJhcnkgZnVuY3Rpb25zIHRvIGRlY2lkZSB3aGV0aGVyIGl0IGlz IG5lY2Vzc2FyeSB0byBjYWxsCml0IGFnYWluLiIpCgooZGVmdmFyIHBhY2thZ2UtcmVhZC1hcmNo aXZlLWhvb2sgKGxpc3QgIydwYWNrYWdlLXJlYWQtYXJjaGl2ZS1jb250ZW50cykKICAiTGlzdCBv ZiBmdW5jdGlvbnMgdG8gY2FsbCB0byByZWFkIHRoZSBhcmNoaXZlIGNvbnRlbnRzLgpFYWNoIGZ1 bmN0aW9uIG11c3QgdGFrZSBhbiBvcHRpb25hbCBhcmd1bWVudCwgYSBzeW1ib2wgaW5kaWNhdGlu Zwp3aGF0IGFyY2hpdmUgdG8gcmVhZCBpbi4gIFRoZSBzeW1ib2wgb3VnaHQgdG8gYmUgYSBrZXkg aW4KYHBhY2thZ2UtYXJjaGl2ZXMnLiIpCgooZGVmdW4gcGFja2FnZS1yZWFkLWFsbC1hcmNoaXZl LWNvbnRlbnRzICgpCiAgIlJlYWQgY2FjaGVkIGFyY2hpdmUgZmlsZSBmb3IgYWxsIGFyY2hpdmVz IGluIGBwYWNrYWdlLWFyY2hpdmVzJy4KSWYgc3VjY2Vzc2Z1bCwgc2V0IG9yIHVwZGF0ZSBgcGFj a2FnZS1hcmNoaXZlLWNvbnRlbnRzJy4iCiAgKHNldHEgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRz IG5pbCkKICAoc2V0cSBwYWNrYWdlLS1vbGQtYXJjaGl2ZS1wcmlvcml0aWVzIHBhY2thZ2UtYXJj aGl2ZS1wcmlvcml0aWVzKQogIChkb2xpc3QgKGFyY2hpdmUgcGFja2FnZS1hcmNoaXZlcykKICAg IChydW4taG9vay13aXRoLWFyZ3MgJ3BhY2thZ2UtcmVhZC1hcmNoaXZlLWhvb2sgKGNhciBhcmNo aXZlKSkpKQoKDAo7Ozs7IFBhY2thZ2UgSW5pdGlhbGl6ZQo7OyBBIGJpdCBvZiBhIG1pbGVzdG9u ZS4gIFRoaXMgYnJpbmdzIHRvZ2V0aGVyIHNvbWUgb2YgdGhlIGFib3ZlCjs7IHNlY3Rpb25zIGFu ZCBwb3B1bGF0ZXMgYWxsIHJlbGV2YW50IGxpc3RzIG9mIHBhY2thZ2VzIGZyb20gY29udGVudHMK OzsgYXZhaWxhYmxlIG9uIGRpc2suCgooZGVmdmFyIHBhY2thZ2UtLWluaXRpYWxpemVkIG5pbAog ICJOb24tbmlsIGlmIGBwYWNrYWdlLWluaXRpYWxpemUnIGhhcyBiZWVuIHJ1bi4iKQoKOzs7IyMj YXV0b2xvYWQKKGRlZnZhciBwYWNrYWdlLS1hY3RpdmF0ZWQgbmlsCiAgIk5vbi1uaWwgaWYgYHBh Y2thZ2UtYWN0aXZhdGUtYWxsJyBoYXMgYmVlbiBydW4uIikKCjs7OyMjI2F1dG9sb2FkCihkZWZ1 biBwYWNrYWdlLWluaXRpYWxpemUgKCZvcHRpb25hbCBuby1hY3RpdmF0ZSkKICAiTG9hZCBFbWFj cyBMaXNwIHBhY2thZ2VzLCBhbmQgYWN0aXZhdGUgdGhlbS4KVGhlIHZhcmlhYmxlIGBwYWNrYWdl LWxvYWQtbGlzdCcgY29udHJvbHMgd2hpY2ggcGFja2FnZXMgdG8gbG9hZC4KSWYgb3B0aW9uYWwg YXJnIE5PLUFDVElWQVRFIGlzIG5vbi1uaWwsIGRvbid0IGFjdGl2YXRlIHBhY2thZ2VzLgoKSXQg aXMgbm90IG5lY2Vzc2FyeSB0byBhZGp1c3QgYGxvYWQtcGF0aCcgb3IgYHJlcXVpcmUnIHRoZQpp bmRpdmlkdWFsIHBhY2thZ2VzIGFmdGVyIGNhbGxpbmcgYHBhY2thZ2UtaW5pdGlhbGl6ZScgLS0g dGhpcyBpcwp0YWtlbiBjYXJlIG9mIGJ5IGBwYWNrYWdlLWluaXRpYWxpemUnLgoKSWYgYHBhY2th Z2UtaW5pdGlhbGl6ZScgaXMgY2FsbGVkIHR3aWNlIGR1cmluZyBFbWFjcyBzdGFydHVwLApzaWdu YWwgYSB3YXJuaW5nLCBzaW5jZSB0aGlzIGlzIGEgYmFkIGlkZWEgZXhjZXB0IGluIGhpZ2hseQph ZHZhbmNlZCB1c2UgY2FzZXMuICBUbyBzdXBwcmVzcyB0aGUgd2FybmluZywgcmVtb3ZlIHRoZQpz dXBlcmZsdW91cyBjYWxsIHRvIGBwYWNrYWdlLWluaXRpYWxpemUnIGZyb20geW91ciBpbml0LWZp bGUuICBJZgp5b3UgaGF2ZSBjb2RlIHdoaWNoIG11c3QgcnVuIGJlZm9yZSBgcGFja2FnZS1pbml0 aWFsaXplJywgcHV0CnRoYXQgY29kZSBpbiB0aGUgZWFybHkgaW5pdC1maWxlLiIKICAoaW50ZXJh Y3RpdmUpCiAgKHdoZW4gKGFuZCBwYWNrYWdlLS1pbml0aWFsaXplZCAobm90IGFmdGVyLWluaXQt dGltZSkpCiAgICAobHdhcm4gJyhwYWNrYWdlIHJlaW5pdGlhbGl6YXRpb24pIDp3YXJuaW5nCiAg ICAgICAgICAgIlVubmVjZXNzYXJ5IGNhbGwgdG8gYHBhY2thZ2UtaW5pdGlhbGl6ZScgaW4gaW5p dCBmaWxlIikpCiAgKHNldHEgcGFja2FnZS1hbGlzdCBuaWwpCiAgKHBhY2thZ2UtbG9hZC1hbGwt ZGVzY3JpcHRvcnMpCiAgKHBhY2thZ2UtcmVhZC1hbGwtYXJjaGl2ZS1jb250ZW50cykKICAoc2V0 cSBwYWNrYWdlLS1pbml0aWFsaXplZCB0KQogICh1bmxlc3Mgbm8tYWN0aXZhdGUKICAgIChwYWNr YWdlLWFjdGl2YXRlLWFsbCkpCiAgOzsgVGhpcyB1c2VzIGBwYWNrYWdlLS1tYXBjJyBzbyBpdCBt dXN0IGJlIGNhbGxlZCBhZnRlcgogIDs7IGBwYWNrYWdlLS1pbml0aWFsaXplZCcgaXMgdC4KICAo cGFja2FnZS0tYnVpbGQtY29tcGF0aWJpbGl0eS10YWJsZSkpCgo7OzsjIyNhdXRvbG9hZAoocHJv Z24gOzsgTWFrZSB0aGUgZnVuY3Rpb24gdXNhYmxlIHdpdGhvdXQgbG9hZGluZyBgcGFja2FnZS5l bCcuCihkZWZ1biBwYWNrYWdlLWFjdGl2YXRlLWFsbCAoKQogICJBY3RpdmF0ZSBhbGwgaW5zdGFs bGVkIHBhY2thZ2VzLgpUaGUgdmFyaWFibGUgYHBhY2thZ2UtbG9hZC1saXN0JyBjb250cm9scyB3 aGljaCBwYWNrYWdlcyB0byBsb2FkLiIKICAoc2V0cSBwYWNrYWdlLS1hY3RpdmF0ZWQgdCkKICAo bGV0KiAoKGVsYyAoY29uY2F0IHBhY2thZ2UtcXVpY2tzdGFydC1maWxlICJjIikpCiAgICAgICAg IChxcyAoaWYgKGZpbGUtcmVhZGFibGUtcCBlbGMpIGVsYwogICAgICAgICAgICAgICAoaWYgKGZp bGUtcmVhZGFibGUtcCBwYWNrYWdlLXF1aWNrc3RhcnQtZmlsZSkKICAgICAgICAgICAgICAgICAg IHBhY2thZ2UtcXVpY2tzdGFydC1maWxlKSkpKQogICAgOzsgVGhlIHF1aWNrc3RhcnQgZmlsZSBw cmVzdW1lcyB0aGF0IGl0IGhhcyBhIGJsYW5rIHNsYXRlLAogICAgOzsgc28gZG9uJ3QgdXNlIGl0 IGlmIHdlIGFscmVhZHkgYWN0aXZhdGVkIHNvbWUgcGFja2FnZXMuCiAgICAoaWYgKGFuZCBxcyAo bm90IChib3VuZC1hbmQtdHJ1ZS1wIHBhY2thZ2UtYWN0aXZhdGVkLWxpc3QpKSkKICAgICAgICA7 OyBTa2lwIGxvYWQtc291cmNlLWZpbGUtZnVuY3Rpb24gd2hpY2ggd291bGQgc2xvdyB1cyBkb3du IGJ5IGEgZmFjdG9yCiAgICAgICAgOzsgMiB3aGVuIGxvYWRpbmcgdGhlIC5lbCBmaWxlICh0aGlz IGFzc3VtZXMgd2Ugd2VyZSBjYXJlZnVsIHRvCiAgICAgICAgOzsgc2F2ZSB0aGlzIGZpbGUgc28g aXQgZG9lc24ndCBuZWVkIGFueSBkZWNvZGluZykuCiAgICAgICAgKGxldCAoKGxvYWQtc291cmNl LWZpbGUtZnVuY3Rpb24gbmlsKSkKICAgICAgICAgICh1bmxlc3MgKGJvdW5kcCAncGFja2FnZS1h Y3RpdmF0ZWQtbGlzdCkKICAgICAgICAgICAgKHNldHEgcGFja2FnZS1hY3RpdmF0ZWQtbGlzdCBu aWwpKQogICAgICAgICAgKGxvYWQgcXMgbmlsICdub21lc3NhZ2UpKQogICAgICAocmVxdWlyZSAn cGFja2FnZSkKICAgICAgKHBhY2thZ2UtLWFjdGl2YXRlLWFsbCkpKSkpCgo7OzsjIyNhdXRvbG9h ZAooZGVmdW4gcGFja2FnZS0tYWN0aXZhdGUtYWxsICgpCiAgKGRvbGlzdCAoZWx0IChwYWNrYWdl LS1hbGlzdCkpCiAgICAoY29uZGl0aW9uLWNhc2UgZXJyCiAgICAgICAgKHBhY2thZ2UtYWN0aXZh dGUgKGNhciBlbHQpKQogICAgICA7OyBEb24ndCBsZXQgZmFpbHVyZSBvZiBhY3RpdmF0aW9uIG9m IGEgcGFja2FnZSBhcmJpdHJhcmlseSBzdG9wCiAgICAgIDs7IGFjdGl2YXRpb24gb2YgZnVydGhl ciBwYWNrYWdlcy4KICAgICAgKGVycm9yIChtZXNzYWdlICIlcyIgKGVycm9yLW1lc3NhZ2Utc3Ry aW5nIGVycikpKSkpKQoMCjs7OzsgUG9wdWxhdGluZyBgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRz JyBmcm9tIGFyY2hpdmVzCjs7IFRoaXMgc3Vic2VjdGlvbiBwb3B1bGF0ZXMgdGhlIHZhcmlhYmxl cyBsaXN0ZWQgYWJvdmUgZnJvbSB0aGUKOzsgYWN0dWFsIGFyY2hpdmVzLCBpbnN0ZWFkIG9mIGZy b20gYSBsb2NhbCBjYWNoZS4KCihkZWZ2YXIgcGFja2FnZS0tZG93bmxvYWRzLWluLXByb2dyZXNz IG5pbAogICJMaXN0IG9mIGluLXByb2dyZXNzIGFzeW5jaHJvbm91cyBkb3dubG9hZHMuIikKCihk ZWNsYXJlLWZ1bmN0aW9uIGVwZy1pbXBvcnQta2V5cy1mcm9tLWZpbGUgImVwZyIgKGNvbnRleHQg a2V5cykpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gcGFja2FnZS1pbXBvcnQta2V5cmluZyAoJm9w dGlvbmFsIGZpbGUpCiAgIkltcG9ydCBrZXlzIGZyb20gRklMRS4iCiAgKGludGVyYWN0aXZlICJm RmlsZTogIikKICAoc2V0cSBmaWxlIChleHBhbmQtZmlsZS1uYW1lIGZpbGUpKQogIChsZXQgKChj b250ZXh0IChlcGctbWFrZS1jb250ZXh0ICdPcGVuUEdQKSkpCiAgICAod2hlbiBwYWNrYWdlLWdu dXBnaG9tZS1kaXIKICAgICAgKHdpdGgtZmlsZS1tb2RlcyA0NDgKICAgICAgICAobWFrZS1kaXJl Y3RvcnkgcGFja2FnZS1nbnVwZ2hvbWUtZGlyIHQpKQogICAgICAoc2V0ZiAoZXBnLWNvbnRleHQt aG9tZS1kaXJlY3RvcnkgY29udGV4dCkgcGFja2FnZS1nbnVwZ2hvbWUtZGlyKSkKICAgIChtZXNz YWdlICJJbXBvcnRpbmcgJXMuLi4iIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGZpbGUpKQogICAg KGVwZy1pbXBvcnQta2V5cy1mcm9tLWZpbGUgY29udGV4dCBmaWxlKQogICAgKG1lc3NhZ2UgIklt cG9ydGluZyAlcy4uLmRvbmUiIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGZpbGUpKSkpCgooZGVm dmFyIHBhY2thZ2UtLXBvc3QtZG93bmxvYWQtYXJjaGl2ZXMtaG9vayBuaWwKICAiSG9vayBydW4g YWZ0ZXIgdGhlIGFyY2hpdmUgY29udGVudHMgYXJlIGRvd25sb2FkZWQuCkRvbid0IHJ1biB0aGlz IGhvb2sgZGlyZWN0bHkuICBJdCBpcyBtZWFudCB0byBiZSBydW4gYXMgcGFydCBvZgpgcGFja2Fn ZS0tdXBkYXRlLWRvd25sb2Fkcy1pbi1wcm9ncmVzcycuIikKKHB1dCAncGFja2FnZS0tcG9zdC1k b3dubG9hZC1hcmNoaXZlcy1ob29rICdyaXNreS1sb2NhbC12YXJpYWJsZSB0KQoKKGRlZnVuIHBh Y2thZ2UtLXVwZGF0ZS1kb3dubG9hZHMtaW4tcHJvZ3Jlc3MgKGVudHJ5KQogICJSZW1vdmUgRU5U UlkgZnJvbSBgcGFja2FnZS0tZG93bmxvYWRzLWluLXByb2dyZXNzJy4KT25jZSBpdCdzIGVtcHR5 LCBydW4gYHBhY2thZ2UtLXBvc3QtZG93bmxvYWQtYXJjaGl2ZXMtaG9vaycuIgogIDs7IEtlZXAg dHJhY2sgb2YgdGhlIGRvd25sb2FkaW5nIHByb2dyZXNzLgogIChzZXRxIHBhY2thZ2UtLWRvd25s b2Fkcy1pbi1wcm9ncmVzcwogICAgICAgIChyZW1vdmUgZW50cnkgcGFja2FnZS0tZG93bmxvYWRz LWluLXByb2dyZXNzKSkKICA7OyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBkb3dubG9hZCwgcnVuIHRo ZSBob29rLgogICh1bmxlc3MgcGFja2FnZS0tZG93bmxvYWRzLWluLXByb2dyZXNzCiAgICAocGFj a2FnZS1yZWFkLWFsbC1hcmNoaXZlLWNvbnRlbnRzKQogICAgKHBhY2thZ2UtLWJ1aWxkLWNvbXBh dGliaWxpdHktdGFibGUpCiAgICA7OyBXZSBtZXNzYWdlIGJlZm9yZSBydW5uaW5nIHRoZSBob29r LCBzbyB0aGUgaG9vayBjYW4gZ2l2ZQogICAgOzsgbWVzc2FnZXMgYXMgd2VsbC4KICAgIChtZXNz YWdlICJQYWNrYWdlIHJlZnJlc2ggZG9uZSIpCiAgICAocnVuLWhvb2tzICdwYWNrYWdlLS1wb3N0 LWRvd25sb2FkLWFyY2hpdmVzLWhvb2spKSkKCihkZWZ1biBwYWNrYWdlLS1kb3dubG9hZC1vbmUt YXJjaGl2ZSAoYXJjaGl2ZSBmaWxlICZvcHRpb25hbCBhc3luYykKICAiUmV0cmlldmUgYW4gYXJj aGl2ZSBmaWxlIEZJTEUgZnJvbSBBUkNISVZFLCBhbmQgY2FjaGUgaXQuCkFSQ0hJVkUgc2hvdWxk IGJlIGEgY29ucyBjZWxsIG9mIHRoZSBmb3JtIChOQU1FIC4gTE9DQVRJT04pLApzaW1pbGFyIHRv IGFuIGVudHJ5IGluIGBwYWNrYWdlLWFsaXN0Jy4gIFNhdmUgdGhlIGNhY2hlZCBjb3B5IHRvClwi YXJjaGl2ZXMvTkFNRS9GSUxFXCIgaW4gYHBhY2thZ2UtdXNlci1kaXInLiIKICA7OyBUaGUgZG93 bmxvYWRlZCBhcmNoaXZlIGNvbnRlbnRzIHdpbGwgYmUgcmVhZCBhcyBwYXJ0IG9mCiAgOzsgYHBh Y2thZ2UtLXVwZGF0ZS1kb3dubG9hZHMtaW4tcHJvZ3Jlc3MnLgogICh3aGVuIGFzeW5jCiAgICAo Y2wtcHVzaG5ldyAoY29ucyBhcmNoaXZlIGZpbGUpIHBhY2thZ2UtLWRvd25sb2Fkcy1pbi1wcm9n cmVzcwogICAgICAgICAgICAgICAgOnRlc3QgIydlcXVhbCkpCiAgKHBhY2thZ2UtLXdpdGgtcmVz cG9uc2UtYnVmZmVyIChjZHIgYXJjaGl2ZSkgOmZpbGUgZmlsZQogICAgOmFzeW5jIGFzeW5jCiAg ICA6ZXJyb3ItZm9ybSAocGFja2FnZS0tdXBkYXRlLWRvd25sb2Fkcy1pbi1wcm9ncmVzcyAoY29u cyBhcmNoaXZlIGZpbGUpKQogICAgKGxldCogKChsb2NhdGlvbiAoY2RyIGFyY2hpdmUpKQogICAg ICAgICAgIChuYW1lIChjYXIgYXJjaGl2ZSkpCiAgICAgICAgICAgKGNvbnRlbnQgKGJ1ZmZlci1z dHJpbmcpKQogICAgICAgICAgIChkaXIgKGV4cGFuZC1maWxlLW5hbWUgKGNvbmNhdCAiYXJjaGl2 ZXMvIiBuYW1lKSBwYWNrYWdlLXVzZXItZGlyKSkKICAgICAgICAgICAobG9jYWwtZmlsZSAoZXhw YW5kLWZpbGUtbmFtZSBmaWxlIGRpcikpKQogICAgICAod2hlbiAobGlzdHAgKHJlYWQgY29udGVu dCkpCiAgICAgICAgKG1ha2UtZGlyZWN0b3J5IGRpciB0KQogICAgICAgIChpZiAob3IgKG5vdCAo cGFja2FnZS1jaGVjay1zaWduYXR1cmUpKQogICAgICAgICAgICAgICAgKG1lbWJlciBuYW1lIHBh Y2thZ2UtdW5zaWduZWQtYXJjaGl2ZXMpKQogICAgICAgICAgICA7OyBJZiB3ZSBkb24ndCBjYXJl IGFib3V0IHRoZSBzaWduYXR1cmUsIHNhdmUgdGhlIGZpbGUgYW5kCiAgICAgICAgICAgIDs7IHdl J3JlIGRvbmUuCiAgICAgICAgICAgIChwcm9nbgogICAgICAgICAgICAgIChjbC1hc3NlcnQgKG5v dCBlbmFibGUtbXVsdGlieXRlLWNoYXJhY3RlcnMpKQogICAgICAgICAgICAgIChsZXQgKChjb2Rp bmctc3lzdGVtLWZvci13cml0ZSAnYmluYXJ5KSkKICAgICAgICAgICAgICAgICh3cml0ZS1yZWdp b24gY29udGVudCBuaWwgbG9jYWwtZmlsZSBuaWwgJ3NpbGVudCkpCiAgICAgICAgICAgICAgKHBh Y2thZ2UtLXVwZGF0ZS1kb3dubG9hZHMtaW4tcHJvZ3Jlc3MgKGNvbnMgYXJjaGl2ZSBmaWxlKSkp CiAgICAgICAgICA7OyBJZiB3ZSBjYXJlLCBjaGVjayBpdCAocGVyaGFwcyBhc3luYykgYW5kICp0 aGVuKiB3cml0ZSB0aGUgZmlsZS4KICAgICAgICAgIChwYWNrYWdlLS1jaGVjay1zaWduYXR1cmUK ICAgICAgICAgICBsb2NhdGlvbiBmaWxlIGNvbnRlbnQgYXN5bmMKICAgICAgICAgICA7OyBUaGlz IGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHNpZ25hdHVyZSBjaGVja2luZy4KICAgICAg ICAgICAobGFtYmRhICgmb3B0aW9uYWwgZ29vZC1zaWdzKQogICAgICAgICAgICAgKGNsLWFzc2Vy dCAobm90IGVuYWJsZS1tdWx0aWJ5dGUtY2hhcmFjdGVycykpCiAgICAgICAgICAgICAobGV0ICgo Y29kaW5nLXN5c3RlbS1mb3Itd3JpdGUgJ2JpbmFyeSkpCiAgICAgICAgICAgICAgICh3cml0ZS1y ZWdpb24gY29udGVudCBuaWwgbG9jYWwtZmlsZSBuaWwgJ3NpbGVudCkpCiAgICAgICAgICAgICA7 OyBXcml0ZSBvdXQgZ29vZCBzaWduYXR1cmVzIGludG8gYXJjaGl2ZS1jb250ZW50cy5zaWduZWQg ZmlsZS4KICAgICAgICAgICAgICh3aGVuIGdvb2Qtc2lncwogICAgICAgICAgICAgICAod3JpdGUt cmVnaW9uIChtYXBjb25jYXQgIydlcGctc2lnbmF0dXJlLXRvLXN0cmluZyBnb29kLXNpZ3MgIlxu IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwgKGNvbmNhdCBsb2NhbC1maWxlICIu c2lnbmVkIikgbmlsICdzaWxlbnQpKSkKICAgICAgICAgICAobGFtYmRhICgpIChwYWNrYWdlLS11 cGRhdGUtZG93bmxvYWRzLWluLXByb2dyZXNzIChjb25zIGFyY2hpdmUgZmlsZSkpKSkpKSkpKQoK KGRlZnVuIHBhY2thZ2UtLWRvd25sb2FkLWFuZC1yZWFkLWFyY2hpdmVzICgmb3B0aW9uYWwgYXN5 bmMpCiAgIkRvd25sb2FkIGRlc2NyaXB0aW9ucyBvZiBhbGwgYHBhY2thZ2UtYXJjaGl2ZXMnIGFu ZCByZWFkIHRoZW0uClBvcHVsYXRlIGBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMnIHdpdGggdGhl IHJlc3VsdC4KCklmIG9wdGlvbmFsIGFyZ3VtZW50IEFTWU5DIGlzIG5vbi1uaWwsIHBlcmZvcm0g dGhlIGRvd25sb2Fkcwphc3luY2hyb25vdXNseS4iCiAgKGRvbGlzdCAoYXJjaGl2ZSBwYWNrYWdl LWFyY2hpdmVzKQogICAgKGNvbmRpdGlvbi1jYXNlLXVubGVzcy1kZWJ1ZyBuaWwKICAgICAgICAo cGFja2FnZS0tZG93bmxvYWQtb25lLWFyY2hpdmUgYXJjaGl2ZSAiYXJjaGl2ZS1jb250ZW50cyIg YXN5bmMpCiAgICAgIChlcnJvciAobWVzc2FnZSAiRmFpbGVkIHRvIGRvd25sb2FkIGAlcycgYXJj aGl2ZS4iCiAgICAgICAgICAgICAgIChjYXIgYXJjaGl2ZSkpKSkpKQoKKGRlZnZhciBwYWNrYWdl LXJlZnJlc2gtY29udGVudHMtaG9vayAobGlzdCAjJ3BhY2thZ2UtLWRvd25sb2FkLWFuZC1yZWFk LWFyY2hpdmVzKQogICJMaXN0IG9mIGZ1bmN0aW9ucyB0byBjYWxsIHRvIHJlZnJlc2ggdGhlIHBh Y2thZ2UgYXJjaGl2ZS4KRWFjaCBmdW5jdGlvbiBtYXkgdGFrZSBhbiBvcHRpb25hbCBhcmd1bWVu dCBpbmRpY2F0aW5nIHRoYXQgdGhlCm9wZXJhdGlvbiBvdWdodCB0byBiZSBleGVjdXRlZCBhc3lu Y2hyb25vdXNseS4iKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtcmVmcmVzaC1jb250 ZW50cyAoJm9wdGlvbmFsIGFzeW5jKQogICJEb3dubG9hZCBkZXNjcmlwdGlvbnMgb2YgYWxsIGNv bmZpZ3VyZWQgRUxQQSBwYWNrYWdlcy4KRm9yIGVhY2ggYXJjaGl2ZSBjb25maWd1cmVkIGluIHRo ZSB2YXJpYWJsZSBgcGFja2FnZS1hcmNoaXZlcycsCmluZm9ybSBFbWFjcyBhYm91dCB0aGUgbGF0 ZXN0IHZlcnNpb25zIG9mIGFsbCBwYWNrYWdlcyBpdCBvZmZlcnMsCmFuZCBtYWtlIHRoZW0gYXZh aWxhYmxlIGZvciBkb3dubG9hZC4KT3B0aW9uYWwgYXJndW1lbnQgQVNZTkMgc3BlY2lmaWVzIHdo ZXRoZXIgdG8gcGVyZm9ybSB0aGUKZG93bmxvYWRzIGluIHRoZSBiYWNrZ3JvdW5kLiIKICAoaW50 ZXJhY3RpdmUpCiAgKHVubGVzcyAoZmlsZS1leGlzdHMtcCBwYWNrYWdlLXVzZXItZGlyKQogICAg KG1ha2UtZGlyZWN0b3J5IHBhY2thZ2UtdXNlci1kaXIgdCkpCiAgKGxldCAoKGRlZmF1bHQta2V5 cmluZyAoZXhwYW5kLWZpbGUtbmFtZSAicGFja2FnZS1rZXlyaW5nLmdwZyIKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtZGlyZWN0b3J5KSkKICAgICAgICAo aW5oaWJpdC1tZXNzYWdlIChvciBpbmhpYml0LW1lc3NhZ2UgYXN5bmMpKSkKICAgICh3aGVuIChh bmQgKHBhY2thZ2UtY2hlY2stc2lnbmF0dXJlKSAoZmlsZS1leGlzdHMtcCBkZWZhdWx0LWtleXJp bmcpKQogICAgICAoY29uZGl0aW9uLWNhc2UtdW5sZXNzLWRlYnVnIGVycm9yCiAgICAgICAgICAo cGFja2FnZS1pbXBvcnQta2V5cmluZyBkZWZhdWx0LWtleXJpbmcpCiAgICAgICAgKGVycm9yICht ZXNzYWdlICJDYW5ub3QgaW1wb3J0IGRlZmF1bHQga2V5cmluZzogJVMiIChjZHIgZXJyb3IpKSkp KSkKICAocnVuLWhvb2std2l0aC1hcmdzICdwYWNrYWdlLXJlZnJlc2gtY29udGVudHMtaG9vayBh c3luYykpCgoMCjs7OyBEZXBlbmRlbmN5IE1hbmFnZW1lbnQKOzsgQ2FsY3VsYXRpbmcgdGhlIGZ1 bGwgdHJhbnNhY3Rpb24gbmVjZXNzYXJ5IGZvciBhbiBpbnN0YWxsYXRpb24sCjs7IGtlZXBpbmcg dHJhY2sgb2Ygd2hpY2ggcGFja2FnZXMgd2VyZSBpbnN0YWxsZWQgc3RyaWN0bHkgYXMKOzsgZGVw ZW5kZW5jaWVzLCBhbmQgZGV0ZXJtaW5pbmcgd2hpY2ggcGFja2FnZXMgY2Fubm90IGJlIHJlbW92 ZWQKOzsgYmVjYXVzZSB0aGV5IGFyZSBkZXBlbmRlbmNpZXMuCgooZGVmdW4gcGFja2FnZS1jb21w dXRlLXRyYW5zYWN0aW9uIChwYWNrYWdlcyByZXF1aXJlbWVudHMgJm9wdGlvbmFsIHNlZW4pCiAg IlJldHVybiBhIGxpc3Qgb2YgcGFja2FnZXMgdG8gYmUgaW5zdGFsbGVkLCBpbmNsdWRpbmcgUEFD S0FHRVMuClBBQ0tBR0VTIHNob3VsZCBiZSBhIGxpc3Qgb2YgYHBhY2thZ2UtZGVzYycuCgpSRVFV SVJFTUVOVFMgc2hvdWxkIGJlIGEgbGlzdCBvZiBhZGRpdGlvbmFsIHJlcXVpcmVtZW50czsgZWFj aAplbGVtZW50IGluIHRoaXMgbGlzdCBzaG91bGQgaGF2ZSB0aGUgZm9ybSAoUEFDS0FHRSBWRVJT SU9OLUxJU1QpLAp3aGVyZSBQQUNLQUdFIGlzIGEgcGFja2FnZSBuYW1lIGFuZCBWRVJTSU9OLUxJ U1QgaXMgdGhlIHJlcXVpcmVkCnZlcnNpb24gb2YgdGhhdCBwYWNrYWdlLgoKVGhpcyBmdW5jdGlv biByZWN1cnNpdmVseSBjb21wdXRlcyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZQpwYWNrYWdlcyBp biBSRVFVSVJFTUVOVFMsIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHBhY2thZ2VzCnRo YXQgbXVzdCBiZSBpbnN0YWxsZWQuICBQYWNrYWdlcyB0aGF0IGFyZSBhbHJlYWR5IGluc3RhbGxl ZCBhcmUKbm90IGluY2x1ZGVkIGluIHRoaXMgbGlzdC4KClNFRU4gaXMgdXNlZCBpbnRlcm5hbGx5 IHRvIGRldGVjdCBpbmZpbml0ZSByZWN1cnNpb24uIgogIDs7IEZJWE1FOiBXZSByZWFsbHkgc2hv dWxkIHVzZSBiYWNrdHJhY2tpbmcgdG8gZXhwbG9yZSB0aGUgd2hvbGUKICA7OyBzZWFyY2ggc3Bh Y2UgKGUuZy4gaWYgZm9vIHJlcXVpcmUgYmFyLTEuMywgYW5kIGJhci0xLjQgcmVxdWlyZXMgdG90 by0xLjEKICA7OyB3aGVyZWFzIGJhci0xLjMgcmVxdWlyZXMgdG90by0xLjAgYW5kIHRoZSB1c2Vy IGhhcyBwdXQgYSBob2xkIG9uIHRvdG8tMS4wOgogIDs7IHRoZSBjdXJyZW50IGNvZGUgbWlnaHQg ZmFpbCB0byBzZWUgdGhhdCBpdCBjb3VsZCBpbnN0YWxsIGZvbyBieSB1c2luZyB0aGUKICA7OyBv bGRlciBiYXItMS4zKS4KICAoZG9saXN0IChlbHQgcmVxdWlyZW1lbnRzKQogICAgKGxldCogKChu ZXh0LXBrZyAoY2FyIGVsdCkpCiAgICAgICAgICAgKG5leHQtdmVyc2lvbiAoY2FkciBlbHQpKQog ICAgICAgICAgIChhbHJlYWR5ICgpKSkKICAgICAgKGRvbGlzdCAocGtnIHBhY2thZ2VzKQogICAg ICAgIChpZiAoZXEgbmV4dC1wa2cgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZykpCiAgICAgICAgICAg IChzZXRxIGFscmVhZHkgcGtnKSkpCiAgICAgICh3aGVuIGFscmVhZHkKICAgICAgICAoaWYgKHZl cnNpb24tbGlzdC08PSBuZXh0LXZlcnNpb24gKHBhY2thZ2UtZGVzYy12ZXJzaW9uIGFscmVhZHkp KQogICAgICAgICAgICA7OyBgbmV4dC1wa2cnIGlzIGFscmVhZHkgaW4gYHBhY2thZ2VzJywgYnV0 IGl0cyBwb3NpdGlvbiB0aGVyZQogICAgICAgICAgICA7OyBtZWFucyBpdCBtaWdodCBiZSBpbnN0 YWxsZWQgdG9vIGxhdGU6IHJlbW92ZSBpdCBmcm9tIHRoZXJlLCBzbwogICAgICAgICAgICA7OyB3 ZSByZS1hZGQgaXQgKGFsb25nIHdpdGggaXRzIGRlcGVuZGVuY2llcykgYXQgYW4gZWFybGllciBw bGFjZQogICAgICAgICAgICA7OyBiZWxvdyAoYnVnIzE2OTk0KS4KICAgICAgICAgICAgKGlmICht ZW1xIGFscmVhZHkgc2VlbikgICAgIDtBdm9pZCBpbmYtbG9vcCBvbiBkZXBlbmRlbmN5IGN5Y2xl cy4KICAgICAgICAgICAgICAgIChtZXNzYWdlICJEZXBlbmRlbmN5IGN5Y2xlIGdvaW5nIHRocm91 Z2ggJVMiCiAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLWZ1bGwtbmFtZSBh bHJlYWR5KSkKICAgICAgICAgICAgICAoc2V0cSBwYWNrYWdlcyAoZGVscSBhbHJlYWR5IHBhY2th Z2VzKSkKICAgICAgICAgICAgICAoc2V0cSBhbHJlYWR5IG5pbCkpCiAgICAgICAgICAoZXJyb3Ig Ik5lZWQgcGFja2FnZSBgJXMtJXMnLCBidXQgb25seSAlcyBpcyBiZWluZyBpbnN0YWxsZWQiCiAg ICAgICAgICAgICAgICAgbmV4dC1wa2cgKHBhY2thZ2UtdmVyc2lvbi1qb2luIG5leHQtdmVyc2lv bikKICAgICAgICAgICAgICAgICAocGFja2FnZS12ZXJzaW9uLWpvaW4gKHBhY2thZ2UtZGVzYy12 ZXJzaW9uIGFscmVhZHkpKSkpKQogICAgICAoY29uZAogICAgICAgKGFscmVhZHkgbmlsKQogICAg ICAgKChwYWNrYWdlLWluc3RhbGxlZC1wIG5leHQtcGtnIG5leHQtdmVyc2lvbikgbmlsKQoKICAg ICAgICh0CiAgICAgICAgOzsgQSBwYWNrYWdlIGlzIHJlcXVpcmVkLCBidXQgbm90IGluc3RhbGxl ZC4gIEl0IG1pZ2h0IGFsc28gYmUKICAgICAgICA7OyBibG9ja2VkIHZpYSBgcGFja2FnZS1sb2Fk LWxpc3QnLgogICAgICAgIChsZXQgKChwa2ctZGVzY3MgKGNkciAoYXNzcSBuZXh0LXBrZyBwYWNr YWdlLWFyY2hpdmUtY29udGVudHMpKSkKICAgICAgICAgICAgICAoZm91bmQgbmlsKQogICAgICAg ICAgICAgIChmb3VuZC1zb21ldGhpbmcgbmlsKQogICAgICAgICAgICAgIChwcm9ibGVtIG5pbCkp CiAgICAgICAgICAod2hpbGUgKGFuZCBwa2ctZGVzY3MgKG5vdCBmb3VuZCkpCiAgICAgICAgICAg IChsZXQqICgocGtnLWRlc2MgKHBvcCBwa2ctZGVzY3MpKQogICAgICAgICAgICAgICAgICAgKHZl cnNpb24gKHBhY2thZ2UtZGVzYy12ZXJzaW9uIHBrZy1kZXNjKSkKICAgICAgICAgICAgICAgICAg IChkaXNhYmxlZCAocGFja2FnZS1kaXNhYmxlZC1wIG5leHQtcGtnIHZlcnNpb24pKSkKICAgICAg ICAgICAgICAoY29uZAogICAgICAgICAgICAgICAoKHZlcnNpb24tbGlzdC08IHZlcnNpb24gbmV4 dC12ZXJzaW9uKQogICAgICAgICAgICAgICAgOzsgcGtnLWRlc2NzIGlzIHNvcnRlZCBieSBwcmlv cml0eSwgbm90IHZlcnNpb24sIHNvCiAgICAgICAgICAgICAgICA7OyBkb24ndCBlcnJvciBqdXN0 IHlldC4KICAgICAgICAgICAgICAgICh1bmxlc3MgZm91bmQtc29tZXRoaW5nCiAgICAgICAgICAg ICAgICAgIChzZXRxIGZvdW5kLXNvbWV0aGluZyAocGFja2FnZS12ZXJzaW9uLWpvaW4gdmVyc2lv bikpKSkKICAgICAgICAgICAgICAgKGRpc2FibGVkCiAgICAgICAgICAgICAgICAodW5sZXNzIHBy b2JsZW0KICAgICAgICAgICAgICAgICAgKHNldHEgcHJvYmxlbQogICAgICAgICAgICAgICAgICAg ICAgICAoaWYgKHN0cmluZ3AgZGlzYWJsZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAo Zm9ybWF0LW1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFja2FnZSBgJXMn IGhlbGQgYXQgdmVyc2lvbiAlcywgYnV0IHZlcnNpb24gJXMgcmVxdWlyZWQiCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbmV4dC1wa2cgZGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAocGFja2FnZS12ZXJzaW9uLWpvaW4gbmV4dC12ZXJzaW9uKSkKICAgICAgICAgICAg ICAgICAgICAgICAgICAoZm9ybWF0LW1lc3NhZ2UgIlJlcXVpcmVkIHBhY2thZ2UgYCVzJyBpcyBk aXNhYmxlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC1w a2cpKSkpKQogICAgICAgICAgICAgICAodCAoc2V0cSBmb3VuZCBwa2ctZGVzYykpKSkpCiAgICAg ICAgICAodW5sZXNzIGZvdW5kCiAgICAgICAgICAgIChjb25kCiAgICAgICAgICAgICAocHJvYmxl bSAoZXJyb3IgIiVzIiBwcm9ibGVtKSkKICAgICAgICAgICAgIChmb3VuZC1zb21ldGhpbmcKICAg ICAgICAgICAgICAoZXJyb3IgIk5lZWQgcGFja2FnZSBgJXMtJXMnLCBidXQgb25seSAlcyBpcyBh dmFpbGFibGUiCiAgICAgICAgICAgICAgICAgICAgIG5leHQtcGtnIChwYWNrYWdlLXZlcnNpb24t am9pbiBuZXh0LXZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgIGZvdW5kLXNvbWV0aGluZykp CiAgICAgICAgICAgICAodAogICAgICAgICAgICAgIChpZiAoZXEgbmV4dC1wa2cgJ2VtYWNzKQog ICAgICAgICAgICAgICAgICAoZXJyb3IgIlRoaXMgcGFja2FnZSByZXF1aXJlcyBFbWFjcyB2ZXJz aW9uICVzIgogICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtdmVyc2lvbi1qb2luIG5l eHQtdmVyc2lvbikpCiAgICAgICAgICAgICAgICAoZXJyb3IgKGlmIChub3QgbmV4dC12ZXJzaW9u KQogICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICJQYWNrYWdlIGAlcycgaXMgdW5h dmFpbGFibGUiIG5leHQtcGtnKQogICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiUGFj a2FnZSBgJXMnICh2ZXJzaW9uICVzKSBpcyB1bmF2YWlsYWJsZSIKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbmV4dC1wa2cgKHBhY2thZ2UtdmVyc2lvbi1qb2luIG5leHQtdmVyc2lv bikpKSkpKSkpCiAgICAgICAgICAoc2V0cSBwYWNrYWdlcwogICAgICAgICAgICAgICAgKHBhY2th Z2UtY29tcHV0ZS10cmFuc2FjdGlvbiAoY29ucyBmb3VuZCBwYWNrYWdlcykKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy1yZXFzIGZvdW5k KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucyBmb3Vu ZCBzZWVuKSkpKSkpKSkKICBwYWNrYWdlcykKCihkZWZ1biBwYWNrYWdlLS1maW5kLW5vbi1kZXBl bmRlbmNpZXMgKCkKICAiUmV0dXJuIGEgbGlzdCBvZiBpbnN0YWxsZWQgcGFja2FnZXMgd2hpY2gg YXJlIG5vdCBkZXBlbmRlbmNpZXMuCkZpbmRzIGFsbCBwYWNrYWdlcyBpbiBgcGFja2FnZS1hbGlz dCcgd2hpY2ggYXJlIG5vdCBkZXBlbmRlbmNpZXMKb2YgYW55IG90aGVyIHBhY2thZ2VzLgpVc2Vk IHRvIHBvcHVsYXRlIGBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJy4iCiAgKGxldCAoKGRlcC1s aXN0CiAgICAgICAgIChkZWxldGUtZHVwcwogICAgICAgICAgKGFwcGx5ICMnYXBwZW5kCiAgICAg ICAgICAgIChtYXBjYXIgKGxhbWJkYSAocCkgKG1hcGNhciAjJ2NhciAocGFja2FnZS1kZXNjLXJl cXMgKGNhZHIgcCkpKSkKICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLWFsaXN0KSkpKSkKICAg IChjbC1sb29wIGZvciBwIGluIHBhY2thZ2UtYWxpc3QKICAgICAgICAgICAgIGZvciBuYW1lID0g KGNhciBwKQogICAgICAgICAgICAgdW5sZXNzIChtZW1xIG5hbWUgZGVwLWxpc3QpCiAgICAgICAg ICAgICBjb2xsZWN0IG5hbWUpKSkKCihkZWZ1biBwYWNrYWdlLS1zYXZlLXNlbGVjdGVkLXBhY2th Z2VzICgmb3B0aW9uYWwgdmFsdWUpCiAgIlNldCBhbmQgc2F2ZSBgcGFja2FnZS1zZWxlY3RlZC1w YWNrYWdlcycgdG8gVkFMVUUuIgogICh3aGVuIHZhbHVlCiAgICAoc2V0cSBwYWNrYWdlLXNlbGVj dGVkLXBhY2thZ2VzIHZhbHVlKSkKICAoaWYgYWZ0ZXItaW5pdC10aW1lCiAgICAgIChjdXN0b21p emUtc2F2ZS12YXJpYWJsZSAncGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcyBwYWNrYWdlLXNlbGVj dGVkLXBhY2thZ2VzKQogICAgKGFkZC1ob29rICdhZnRlci1pbml0LWhvb2sgIydwYWNrYWdlLS1z YXZlLXNlbGVjdGVkLXBhY2thZ2VzKSkpCgooZGVmdW4gcGFja2FnZS0tdXNlci1zZWxlY3RlZC1w IChwa2cpCiAgIlJldHVybiBub24tbmlsIGlmIFBLRyBpcyBhIHBhY2thZ2Ugd2FzIGluc3RhbGxl ZCBieSB0aGUgdXNlci4KUEtHIGlzIGEgcGFja2FnZSBuYW1lLgpUaGlzIGxvb2tzIGludG8gYHBh Y2thZ2Utc2VsZWN0ZWQtcGFja2FnZXMnLCBwb3B1bGF0aW5nIGl0IGZpcnN0CmlmIGl0IGlzIHN0 aWxsIGVtcHR5LiIKICAodW5sZXNzIChjb25zcCBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzKQog ICAgKHBhY2thZ2UtLXNhdmUtc2VsZWN0ZWQtcGFja2FnZXMgKHBhY2thZ2UtLWZpbmQtbm9uLWRl cGVuZGVuY2llcykpKQogIChtZW1xIHBrZyBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzKSkKCihk ZWZ1biBwYWNrYWdlLS1nZXQtZGVwcyAocGtncykKICAobGV0ICgoc2VlbiAnKCkpKQogICAgKHdo aWxlIHBrZ3MKICAgICAgKGxldCAoKHBrZyAocG9wIHBrZ3MpKSkKICAgICAgICAoaWYgKG1lbXEg cGtnIHNlZW4pCiAgICAgICAgICAgIG5pbCA7OyBEb25lIGFscmVhZHkhCiAgICAgICAgICAobGV0 ICgocGtnLWRlc2MgKGNhZHIgKGFzc3EgcGtnIHBhY2thZ2UtYWxpc3QpKSkpCiAgICAgICAgICAg ICh3aGVuIHBrZy1kZXNjCiAgICAgICAgICAgICAgKHB1c2ggcGtnIHNlZW4pCiAgICAgICAgICAg ICAgKHNldHEgcGtncyAoYXBwZW5kIChtYXBjYXIgIydjYXIgKHBhY2thZ2UtZGVzYy1yZXFzIHBr Zy1kZXNjKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtncykpKSkpKSkKICAg IHNlZW4pKQoKKGRlZnVuIHBhY2thZ2UtLXVzZXItaW5zdGFsbGVkLXAgKHBhY2thZ2UpCiAgIlJl dHVybiBub24tbmlsIGlmIFBBQ0tBR0UgaXMgYSB1c2VyLWluc3RhbGxlZCBwYWNrYWdlLgpQQUNL QUdFIGlzIHRoZSBwYWNrYWdlIG5hbWUsIGEgc3ltYm9sLiAgQ2hlY2sgd2hldGhlciB0aGUgcGFj a2FnZQp3YXMgaW5zdGFsbGVkIGludG8gYHBhY2thZ2UtdXNlci1kaXInIHdoZXJlIHdlIGFzc3Vt ZSB0byBoYXZlCmNvbnRyb2wgb3Zlci4iCiAgKGxldCogKChwa2ctZGVzYyAoY2FkciAoYXNzcSBw YWNrYWdlIHBhY2thZ2UtYWxpc3QpKSkKICAgICAgICAgKGRpciAocGFja2FnZS1kZXNjLWRpciBw a2ctZGVzYykpKQogICAgKGZpbGUtaW4tZGlyZWN0b3J5LXAgZGlyIHBhY2thZ2UtdXNlci1kaXIp KSkKCihkZWZ1biBwYWNrYWdlLS1yZW1vdmFibGUtcGFja2FnZXMgKCkKICAiUmV0dXJuIGEgbGlz dCBvZiBuYW1lcyBvZiBwYWNrYWdlcyBubyBsb25nZXIgbmVlZGVkLgpUaGVzZSBhcmUgcGFja2Fn ZXMgd2hpY2ggYXJlIG5laXRoZXIgY29udGFpbmVkIGluCmBwYWNrYWdlLXNlbGVjdGVkLXBhY2th Z2VzJyBub3IgYSBkZXBlbmRlbmN5IG9mIG9uZSB0aGF0IGlzLiIKICAobGV0ICgobmVlZGVkIChw YWNrYWdlLS1nZXQtZGVwcyBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzKSkpCiAgICAoY2wtbG9v cCBmb3IgcCBpbiAobWFwY2FyICMnY2FyIHBhY2thZ2UtYWxpc3QpCiAgICAgICAgICAgICB1bmxl c3MgKG9yIChtZW1xIHAgbmVlZGVkKQogICAgICAgICAgICAgICAgICAgICAgICA7OyBEbyBub3Qg YXV0by1yZW1vdmUgZXh0ZXJuYWwgcGFja2FnZXMuCiAgICAgICAgICAgICAgICAgICAgICAgIChu b3QgKHBhY2thZ2UtLXVzZXItaW5zdGFsbGVkLXAgcCkpKQogICAgICAgICAgICAgY29sbGVjdCBw KSkpCgooZGVmdW4gcGFja2FnZS0tdXNlZC1lbHNld2hlcmUtcCAocGtnLWRlc2MgJm9wdGlvbmFs IHBrZy1saXN0IGFsbCkKICAiTm9uLW5pbCBpZiBQS0ctREVTQyBpcyBhIGRlcGVuZGVuY3kgb2Yg YSBwYWNrYWdlIGluIFBLRy1MSVNULgpSZXR1cm4gdGhlIGZpcnN0IHBhY2thZ2UgZm91bmQgaW4g UEtHLUxJU1Qgb2Ygd2hpY2ggUEtHIGlzIGEKZGVwZW5kZW5jeS4gIElmIEFMTCBpcyBub24tbmls LCByZXR1cm4gYWxsIHN1Y2ggcGFja2FnZXMgaW5zdGVhZC4KCldoZW4gbm90IHNwZWNpZmllZCwg UEtHLUxJU1QgZGVmYXVsdHMgdG8gYHBhY2thZ2UtYWxpc3QnCndpdGggUEtHLURFU0MgZW50cnkg cmVtb3ZlZC4iCiAgKHVubGVzcyAoc3RyaW5nPSAocGFja2FnZS1kZXNjLXN0YXR1cyBwa2ctZGVz YykgIm9ic29sZXRlIikKICAgIChsZXQqICgocGtnIChwYWNrYWdlLWRlc2MtbmFtZSBwa2ctZGVz YykpCiAgICAgICAgICAgKGFsaXN0IChvciBwa2ctbGlzdAogICAgICAgICAgICAgICAgICAgICAg KHJlbW92ZSAoYXNzcSBwa2cgcGFja2FnZS1hbGlzdCkKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcGFja2FnZS1hbGlzdCkpKSkKICAgICAgKGlmIGFsbAogICAgICAgICAgKGNsLWxvb3Ag Zm9yIHAgaW4gYWxpc3QKICAgICAgICAgICAgICAgICAgIGlmIChhc3NxIHBrZyAocGFja2FnZS1k ZXNjLXJlcXMgKGNhZHIgcCkpKQogICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY2FkciBwKSkK ICAgICAgICAoY2wtbG9vcCBmb3IgcCBpbiBhbGlzdCB0aGVyZWlzCiAgICAgICAgICAgICAgICAg KGFuZCAoYXNzcSBwa2cgKHBhY2thZ2UtZGVzYy1yZXFzIChjYWRyIHApKSkKICAgICAgICAgICAg ICAgICAgICAgIChjYWRyIHApKSkpKSkpCgooZGVmdW4gcGFja2FnZS0tc29ydC1kZXBzLWluLWFs aXN0IChwYWNrYWdlIG9ubHkpCiAgIlJldHVybiBhIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZvciBQ QUNLQUdFIHNvcnRlZCBieSBkZXBlbmRlbmN5LgpQQUNLQUdFIGlzIGluY2x1ZGVkIGFzIHRoZSBm aXJzdCBlbGVtZW50IG9mIHRoZSByZXR1cm5lZCBsaXN0LgpPTkxZIGlzIGFuIGFsaXN0IGFzc29j aWF0aW5nIHBhY2thZ2UgbmFtZXMgdG8gcGFja2FnZSBvYmplY3RzLgpPbmx5IHRoZXNlIHBhY2th Z2VzIHdpbGwgYmUgaW4gdGhlIHJldHVybiB2YWx1ZSBhbmQgdGhlaXIgY2RycyBhcmUKZGVzdHJ1 Y3RpdmVseSBzZXQgdG8gbmlsIGluIE9OTFkuIgogIChsZXQgKChvdXQpKQogICAgKGRvbGlzdCAo ZGVwIChwYWNrYWdlLWRlc2MtcmVxcyBwYWNrYWdlKSkKICAgICAgKHdoZW4tbGV0KiAoKGNlbGwg KGFzc3EgKGNhciBkZXApIG9ubHkpKQogICAgICAgICAgICAgICAgICAoZGVwLXBhY2thZ2UgKGNk ci1zYWZlIGNlbGwpKSkKICAgICAgICAoc2V0Y2RyIGNlbGwgbmlsKQogICAgICAgIChzZXRxIG91 dCAoYXBwZW5kIChwYWNrYWdlLS1zb3J0LWRlcHMtaW4tYWxpc3QgZGVwLXBhY2thZ2Ugb25seSkK ICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQpKSkpCiAgICAoY29ucyBwYWNrYWdlIG91dCkp KQoKKGRlZnVuIHBhY2thZ2UtLXNvcnQtYnktZGVwZW5kZW5jZSAocGFja2FnZS1saXN0KQogICJS ZXR1cm4gUEFDS0FHRS1MSVNUIHNvcnRlZCBieSBkZXBlbmRlbmNlLgpUaGF0IGlzLCBhbnkgZWxl bWVudCBvZiB0aGUgcmV0dXJuZWQgbGlzdCBpcyBndWFyYW50ZWVkIHRvIG5vdApkaXJlY3RseSBk ZXBlbmQgb24gYW55IGVsZW1lbnRzIHRoYXQgY29tZSBiZWZvcmUgaXQuCgpQQUNLQUdFLUxJU1Qg aXMgYSBsaXN0IG9mIGBwYWNrYWdlLWRlc2MnIG9iamVjdHMuCkluZGlyZWN0IGRlcGVuZGVuY2ll cyBhcmUgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZCBpbiBvcmRlciBvbmx5CmlmIGFsbCB0aGUg aW4tYmV0d2VlbiBkZXBlbmRlbmNpZXMgYXJlIGFsc28gaW4gUEFDS0FHRS1MSVNULiIKICAobGV0 ICgoYWxpc3QgKG1hcGNhciAobGFtYmRhIChwKSAoY29ucyAocGFja2FnZS1kZXNjLW5hbWUgcCkg cCkpIHBhY2thZ2UtbGlzdCkpCiAgICAgICAgb3V0LWxpc3QpCiAgICAoZG9saXN0IChjZWxsIGFs aXN0IG91dC1saXN0KQogICAgICA7OyBgcGFja2FnZS0tc29ydC1kZXBzLWluLWFsaXN0JyBkZXN0 cnVjdGl2ZWx5IGNoYW5nZXMgYWxpc3QsIHNvCiAgICAgIDs7IHNvbWUgY2VsbHMgbWlnaHQgYWxy ZWFkeSBiZSBlbXB0eS4gIFdlIGNoZWNrIHRoaXMgaGVyZS4KICAgICAgKHdoZW4tbGV0KiAoKHBr Zy1kZXNjIChjZHIgY2VsbCkpKQogICAgICAgIChzZXRjZHIgY2VsbCBuaWwpCiAgICAgICAgKHNl dHEgb3V0LWxpc3QKICAgICAgICAgICAgICAoYXBwZW5kIChwYWNrYWdlLS1zb3J0LWRlcHMtaW4t YWxpc3QgcGtnLWRlc2MgYWxpc3QpCiAgICAgICAgICAgICAgICAgICAgICBvdXQtbGlzdCkpKSkp KQoKDAo7OzsgSW5zdGFsbGF0aW9uIEZ1bmN0aW9ucwo7OyBBcyBvcHBvc2VkIHRvIHRoZSBwcmV2 aW91cyBzZWN0aW9uICh3aGljaCBsaXN0ZWQgc29tZSB1bmRlcmx5aW5nCjs7IGZ1bmN0aW9ucyBu ZWNlc3NhcnkgZm9yIGluc3RhbGxhdGlvbiksIHRoaXMgb25lIGNvbnRhaW5zIHRoZSBhY3R1YWwK OzsgZnVuY3Rpb25zIHRoYXQgaW5zdGFsbCBwYWNrYWdlcy4gIFRoZSBwYWNrYWdlIGl0c2VsZiBj YW4gYmUKOzsgaW5zdGFsbGVkIGluIGEgdmFyaWV0eSBvZiB3YXlzIChhcmNoaXZlcywgYnVmZmVy LCBmaWxlKSwgYnV0Cjs7IHJlcXVpcmVtZW50cyAoZGVwZW5kZW5jaWVzKSBhcmUgYWx3YXlzIHNh dGlzZmllZCBieSBsb29raW5nIGluCjs7IGBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMnLgoKKGRl ZnVuIHBhY2thZ2UtYXJjaGl2ZS1iYXNlIChkZXNjKQogICJSZXR1cm4gdGhlIHBhY2thZ2UgZGVz Y3JpYmVkIGJ5IERFU0MuIgogIChjZHIgKGFzc29jIChwYWNrYWdlLWRlc2MtYXJjaGl2ZSBkZXNj KSBwYWNrYWdlLWFyY2hpdmVzKSkpCgooZGVmdW4gcGFja2FnZS1pbnN0YWxsLWZyb20tYXJjaGl2 ZSAocGtnLWRlc2MpCiAgIkRvd25sb2FkIGFuZCBpbnN0YWxsIGEgcGFja2FnZSBkZWZpbmVkIGJ5 IFBLRy1ERVNDLiIKICA7OyBUaGlzIHdvbid0IGhhcHBlbiwgdW5sZXNzIHRoZSBhcmNoaXZlIGlz IGRvaW5nIHNvbWV0aGluZyB3cm9uZy4KICAod2hlbiAoZXEgKHBhY2thZ2UtZGVzYy1raW5kIHBr Zy1kZXNjKSAnZGlyKQogICAgKGVycm9yICJDYW4ndCBpbnN0YWxsIGRpcmVjdG9yeSBwYWNrYWdl IGZyb20gYXJjaGl2ZSIpKQogIChsZXQqICgobG9jYXRpb24gKHBhY2thZ2UtYXJjaGl2ZS1iYXNl IHBrZy1kZXNjKSkKICAgICAgICAgKGZpbGUgKGNvbmNhdCAocGFja2FnZS1kZXNjLWZ1bGwtbmFt ZSBwa2ctZGVzYykKICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLXN1ZmZpeCBw a2ctZGVzYykpKSkKICAgIChwYWNrYWdlLS13aXRoLXJlc3BvbnNlLWJ1ZmZlciBsb2NhdGlvbiA6 ZmlsZSBmaWxlCiAgICAgIChpZiAob3IgKG5vdCAocGFja2FnZS1jaGVjay1zaWduYXR1cmUpKQog ICAgICAgICAgICAgIChtZW1iZXIgKHBhY2thZ2UtZGVzYy1hcmNoaXZlIHBrZy1kZXNjKQogICAg ICAgICAgICAgICAgICAgICAgcGFja2FnZS11bnNpZ25lZC1hcmNoaXZlcykpCiAgICAgICAgICA7 OyBJZiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBzaWduYXR1cmUsIHVucGFjayBhbmQgd2UncmUK ICAgICAgICAgIDs7IGRvbmUuCiAgICAgICAgICAobGV0ICgoc2F2ZS1zaWxlbnRseSB0KSkKICAg ICAgICAgICAgKHBhY2thZ2UtdW5wYWNrIHBrZy1kZXNjKSkKICAgICAgICA7OyBJZiB3ZSBjYXJl LCBjaGVjayBpdCBhbmQgKnRoZW4qIHdyaXRlIHRoZSBmaWxlLgogICAgICAgIChsZXQgKChjb250 ZW50IChidWZmZXItc3RyaW5nKSkpCiAgICAgICAgICAocGFja2FnZS0tY2hlY2stc2lnbmF0dXJl CiAgICAgICAgICAgbG9jYXRpb24gZmlsZSBjb250ZW50IG5pbAogICAgICAgICAgIDs7IFRoaXMg ZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgc2lnbmF0dXJlIGNoZWNraW5nLgogICAgICAg ICAgIChsYW1iZGEgKCZvcHRpb25hbCBnb29kLXNpZ3MpCiAgICAgICAgICAgICA7OyBTaWduYXR1 cmUgY2hlY2tlZCwgdW5wYWNrIG5vdy4KICAgICAgICAgICAgICh3aXRoLXRlbXAtYnVmZmVyIDtG SVhNRTogSnVzdCB1c2UgdGhlIHByZXZpb3VzIGN1cnJlbnQtYnVmZmVyLgogICAgICAgICAgICAg ICAoc2V0LWJ1ZmZlci1tdWx0aWJ5dGUgbmlsKQogICAgICAgICAgICAgICAoY2wtYXNzZXJ0IChu b3QgKG11bHRpYnl0ZS1zdHJpbmctcCBjb250ZW50KSkpCiAgICAgICAgICAgICAgIChpbnNlcnQg Y29udGVudCkKICAgICAgICAgICAgICAgKGxldCAoKHNhdmUtc2lsZW50bHkgdCkpCiAgICAgICAg ICAgICAgICAgKHBhY2thZ2UtdW5wYWNrIHBrZy1kZXNjKSkpCiAgICAgICAgICAgICA7OyBIZXJl IHRoZSBwYWNrYWdlIGhhcyBiZWVuIGluc3RhbGxlZCBzdWNjZXNzZnVsbHksIG1hcmsgaXQgYXMK ICAgICAgICAgICAgIDs7IHNpZ25lZCBpZiBhcHByb3ByaWF0ZS4KICAgICAgICAgICAgICh3aGVu IGdvb2Qtc2lncwogICAgICAgICAgICAgICA7OyBXcml0ZSBvdXQgZ29vZCBzaWduYXR1cmVzIGlu dG8gTkFNRS1WRVJTSU9OLnNpZ25lZCBmaWxlLgogICAgICAgICAgICAgICAod3JpdGUtcmVnaW9u IChtYXBjb25jYXQgIydlcGctc2lnbmF0dXJlLXRvLXN0cmluZyBnb29kLXNpZ3MgIlxuIikKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoZXhwYW5kLWZpbGUtbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0 IChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIHBrZy1kZXNjKSAiLnNpZ25lZCIpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHBhY2thZ2UtdXNlci1kaXIpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbmlsICdzaWxlbnQpCiAgICAgICAgICAgICAgIDs7IFVwZGF0ZSB0aGUgb2xkIHBr Zy1kZXNjIHdoaWNoIHdpbGwgYmUgc2hvd24gb24gdGhlIGRlc2NyaXB0aW9uIGJ1ZmZlci4KICAg ICAgICAgICAgICAgKHNldGYgKHBhY2thZ2UtZGVzYy1zaWduZWQgcGtnLWRlc2MpIHQpCiAgICAg ICAgICAgICAgIDs7IFVwZGF0ZSB0aGUgbmV3IChhY3RpdmF0ZWQpIHBrZy1kZXNjIGFzIHdlbGwu CiAgICAgICAgICAgICAgICh3aGVuLWxldCogKChwa2ctZGVzY3MgKGNkciAoYXNzcSAocGFja2Fn ZS1kZXNjLW5hbWUgcGtnLWRlc2MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwYWNrYWdlLWFsaXN0KSkpKQogICAgICAgICAgICAgICAgIChzZXRmIChw YWNrYWdlLWRlc2Mtc2lnbmVkIChjYXIgcGtnLWRlc2NzKSkgdCkpKSkpKSkpKSkKCjs7OyMjI2F1 dG9sb2FkCihkZWZ1biBwYWNrYWdlLWluc3RhbGxlZC1wIChwYWNrYWdlICZvcHRpb25hbCBtaW4t dmVyc2lvbikKICAiUmV0dXJuIG5vbi1uaWwgaWYgUEFDS0FHRSwgb2YgTUlOLVZFUlNJT04gb3Ig bmV3ZXIsIGlzIGluc3RhbGxlZC4KSWYgUEFDS0FHRSBpcyBhIHN5bWJvbCwgaXQgaXMgdGhlIHBh Y2thZ2UgbmFtZSBhbmQgTUlOLVZFUlNJT04Kc2hvdWxkIGJlIGEgdmVyc2lvbiBsaXN0LgoKSWYg UEFDS0FHRSBpcyBhIGBwYWNrYWdlLWRlc2MnIG9iamVjdCwgTUlOLVZFUlNJT04gaXMgaWdub3Jl ZC4iCiAgKGNvbmQKICAgKChwYWNrYWdlLWRlc2MtcCBwYWNrYWdlKQogICAgKGxldCAoKGRpciAo cGFja2FnZS1kZXNjLWRpciBwYWNrYWdlKSkpCiAgICAgICAgKGFuZCAoc3RyaW5ncCBkaXIpCiAg ICAgICAgICAgICAoZmlsZS1leGlzdHMtcCBkaXIpKSkpCiAgICgoYW5kIChub3QgcGFja2FnZS0t aW5pdGlhbGl6ZWQpCiAgICAgICAgIChudWxsIG1pbi12ZXJzaW9uKQogICAgICAgICBwYWNrYWdl LWFjdGl2YXRlZC1saXN0KQogICAgOzsgV2UgdXNlZCB0aGUgcXVpY2tzdGFydDogbWFrZSBpdCBw b3NzaWJsZSB0byB1c2UgcGFja2FnZS1pbnN0YWxsZWQtcAogICAgOzsgZXZlbiBiZWZvcmUgcGFj a2FnZSBpcyBmdWxseSBpbml0aWFsaXplZC4KICAgIChvcgogICAgIChtZW1xIHBhY2thZ2UgcGFj a2FnZS1hY3RpdmF0ZWQtbGlzdCkKICAgICA7OyBBbHNvIGNoZWNrIGJ1aWx0LWluIHBhY2thZ2Vz LgogICAgIChwYWNrYWdlLWJ1aWx0LWluLXAgcGFja2FnZSBtaW4tdmVyc2lvbikpKQogICAodAog ICAgKG9yCiAgICAgKGxldCAoKHBrZy1kZXNjcyAoY2RyIChhc3NxIHBhY2thZ2UgKHBhY2thZ2Ut LWFsaXN0KSkpKSkKICAgICAgIChhbmQgcGtnLWRlc2NzCiAgICAgICAgICAgICh2ZXJzaW9uLWxp c3QtPD0gbWluLXZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1k ZXNjLXZlcnNpb24gKGNhciBwa2ctZGVzY3MpKSkpKQogICAgIDs7IEFsc28gY2hlY2sgYnVpbHQt aW4gcGFja2FnZXMuCiAgICAgKHBhY2thZ2UtYnVpbHQtaW4tcCBwYWNrYWdlIG1pbi12ZXJzaW9u KSkpKSkKCihkZWZ1biBwYWNrYWdlLWRvd25sb2FkLXRyYW5zYWN0aW9uIChwYWNrYWdlcykKICAi RG93bmxvYWQgYW5kIGluc3RhbGwgYWxsIHRoZSBwYWNrYWdlcyBpbiBQQUNLQUdFUy4KUEFDS0FH RVMgc2hvdWxkIGJlIGEgbGlzdCBvZiBgcGFja2FnZS1kZXNjJy4KVGhpcyBmdW5jdGlvbiBhc3N1 bWVzIHRoYXQgYWxsIHBhY2thZ2UgcmVxdWlyZW1lbnRzIGluClBBQ0tBR0VTIGFyZSBzYXRpc2Zp ZWQsIGkuZS4gdGhhdCBQQUNLQUdFUyBpcyBjb21wdXRlZAp1c2luZyBgcGFja2FnZS1jb21wdXRl LXRyYW5zYWN0aW9uJy4iCiAgKG1hcGMgIydwYWNrYWdlLWluc3RhbGwtZnJvbS1hcmNoaXZlIHBh Y2thZ2VzKSkKCihkZWZ1biBwYWNrYWdlLS1hcmNoaXZlcy1pbml0aWFsaXplICgpCiAgIk1ha2Ug c3VyZSB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgYW5kIHJlbW90ZSBwYWNrYWdlcyBhcmUgaW5pdGlh bGl6ZWQuIgogICh1bmxlc3MgcGFja2FnZS0taW5pdGlhbGl6ZWQKICAgIChwYWNrYWdlLWluaXRp YWxpemUgdCkpCiAgKHVubGVzcyBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMKICAgIChwYWNrYWdl LXJlZnJlc2gtY29udGVudHMpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBwYWNrYWdlLWluc3Rh bGwgKHBrZyAmb3B0aW9uYWwgZG9udC1zZWxlY3QpCiAgIkluc3RhbGwgdGhlIHBhY2thZ2UgUEtH LgpQS0cgY2FuIGJlIGEgYHBhY2thZ2UtZGVzYycgb3IgYSBzeW1ib2wgbmFtaW5nIG9uZSBvZiB0 aGUKYXZhaWxhYmxlIHBhY2thZ2VzIGluIGFuIGFyY2hpdmUgaW4gYHBhY2thZ2UtYXJjaGl2ZXMn LiAgV2hlbgpjYWxsZWQgaW50ZXJhY3RpdmVseSwgcHJvbXB0IGZvciB0aGUgcGFja2FnZSBuYW1l LgoKTWFyayB0aGUgaW5zdGFsbGVkIHBhY2thZ2UgYXMgc2VsZWN0ZWQgYnkgYWRkaW5nIGl0IHRv CmBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJy4KCldoZW4gY2FsbGVkIGZyb20gTGlzcCBhbmQg b3B0aW9uYWwgYXJndW1lbnQgRE9OVC1TRUxFQ1QgaXMKbm9uLW5pbCwgaW5zdGFsbCB0aGUgcGFj a2FnZSBidXQgZG8gbm90IGFkZCBpdCB0bwpgcGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcycuCgpJ ZiBQS0cgaXMgYSBgcGFja2FnZS1kZXNjJyBhbmQgaXQgaXMgYWxyZWFkeSBpbnN0YWxsZWQsIGRv bid0IHRyeQp0byBpbnN0YWxsIGl0IGJ1dCBzdGlsbCBtYXJrIGl0IGFzIHNlbGVjdGVkLiIKICAo aW50ZXJhY3RpdmUKICAgKHByb2duCiAgICAgOzsgSW5pdGlhbGl6ZSB0aGUgcGFja2FnZSBzeXN0 ZW0gdG8gZ2V0IHRoZSBsaXN0IG9mIHBhY2thZ2UKICAgICA7OyBzeW1ib2xzIGZvciBjb21wbGV0 aW9uLgogICAgIChwYWNrYWdlLS1hcmNoaXZlcy1pbml0aWFsaXplKQogICAgIChsaXN0IChpbnRl cm4gKGNvbXBsZXRpbmctcmVhZAogICAgICAgICAgICAgICAgICAgICJJbnN0YWxsIHBhY2thZ2U6 ICIKICAgICAgICAgICAgICAgICAgICAoZGVscSBuaWwKICAgICAgICAgICAgICAgICAgICAgICAg ICAobWFwY2FyIChsYW1iZGEgKGVsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKHVubGVzcyAocGFja2FnZS1pbnN0YWxsZWQtcCAoY2FyIGVsdCkpCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbC1uYW1lIChjYXIgZWx0KSkpKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRzKSkKICAg ICAgICAgICAgICAgICAgICBuaWwgdCkpCiAgICAgICAgICAgbmlsKSkpCiAgKHBhY2thZ2UtLWFy Y2hpdmVzLWluaXRpYWxpemUpCiAgKGFkZC1ob29rICdwb3N0LWNvbW1hbmQtaG9vayAjJ3BhY2th Z2UtbWVudS0tcG9zdC1yZWZyZXNoKQogIChsZXQgKChuYW1lIChpZiAocGFja2FnZS1kZXNjLXAg cGtnKQogICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLW5hbWUgcGtnKQogICAgICAgICAg ICAgICAgcGtnKSkpCiAgICAodW5sZXNzIChvciBkb250LXNlbGVjdCAocGFja2FnZS0tdXNlci1z ZWxlY3RlZC1wIG5hbWUpKQogICAgICAocGFja2FnZS0tc2F2ZS1zZWxlY3RlZC1wYWNrYWdlcwog ICAgICAgKGNvbnMgbmFtZSBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzKSkpCiAgICAoaWYtbGV0 KiAoKHRyYW5zYWN0aW9uCiAgICAgICAgICAgICAgIChpZiAocGFja2FnZS1kZXNjLXAgcGtnKQog ICAgICAgICAgICAgICAgICAgKHVubGVzcyAocGFja2FnZS1pbnN0YWxsZWQtcCBwa2cpCiAgICAg ICAgICAgICAgICAgICAgIChwYWNrYWdlLWNvbXB1dGUtdHJhbnNhY3Rpb24gKGxpc3QgcGtnKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdl LWRlc2MtcmVxcyBwa2cpKSkKICAgICAgICAgICAgICAgICAocGFja2FnZS1jb21wdXRlLXRyYW5z YWN0aW9uICgpIChsaXN0IChsaXN0IHBrZykpKSkpKQogICAgICAgIChwcm9nbgogICAgICAgICAg KHBhY2thZ2UtZG93bmxvYWQtdHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24pCiAgICAgICAgICAocGFj a2FnZS0tcXVpY2tzdGFydC1tYXliZS1yZWZyZXNoKQogICAgICAgICAgKG1lc3NhZ2UgICJQYWNr YWdlIGAlcycgaW5zdGFsbGVkLiIgbmFtZSkpCiAgICAgIChtZXNzYWdlICJgJXMnIGlzIGFscmVh ZHkgaW5zdGFsbGVkIiBuYW1lKSkpKQoKKGRlY2xhcmUtZnVuY3Rpb24gcGFja2FnZS12Yy11cGRh dGUgInBhY2thZ2UtdmMiIChwa2cpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtdXBk YXRlIChuYW1lKQogICJVcGRhdGUgcGFja2FnZSBOQU1FIGlmIGEgbmV3ZXIgdmVyc2lvbiBleGlz dHMuIgogIChpbnRlcmFjdGl2ZQogICAobGlzdCAoY29tcGxldGluZy1yZWFkCiAgICAgICAgICAi VXBkYXRlIHBhY2thZ2U6ICIgKHBhY2thZ2UtLXVwZGF0ZWFibGUtcGFja2FnZXMpIG5pbCB0KSkp CiAgKGxldCogKChwYWNrYWdlIChpZiAoc3ltYm9scCBuYW1lKQogICAgICAgICAgICAgICAgICAg ICAgbmFtZQogICAgICAgICAgICAgICAgICAgIChpbnRlcm4gbmFtZSkpKQogICAgICAgICAocGtn LWRlc2MgKGNhZHIgKGFzc3EgcGFja2FnZSBwYWNrYWdlLWFsaXN0KSkpKQogICAgKGlmIChwYWNr YWdlLXZjLXAgcGtnLWRlc2MpCiAgICAgICAgKHBhY2thZ2UtdmMtdXBkYXRlIHBrZy1kZXNjKQog ICAgICAocGFja2FnZS1kZWxldGUgcGtnLWRlc2MgJ2ZvcmNlKQogICAgICAocGFja2FnZS1pbnN0 YWxsIHBhY2thZ2UgJ2RvbnQtc2VsZWN0KSkpKQoKKGRlZnVuIHBhY2thZ2UtLXVwZGF0ZWFibGUt cGFja2FnZXMgKCkKICA7OyBJbml0aWFsaXplIHRoZSBwYWNrYWdlIHN5c3RlbSB0byBnZXQgdGhl IGxpc3Qgb2YgcGFja2FnZQogIDs7IHN5bWJvbHMgZm9yIGNvbXBsZXRpb24uCiAgKHBhY2thZ2Ut LWFyY2hpdmVzLWluaXRpYWxpemUpCiAgKG1hcGNhcgogICAjJ2NhcgogICAoc2VxLWZpbHRlcgog ICAgKGxhbWJkYSAoZWx0KQogICAgICAob3IgKGxldCAoKGF2YWlsYWJsZQogICAgICAgICAgICAg ICAgIChhc3NxIChjYXIgZWx0KSBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMpKSkKICAgICAgICAg ICAgKGFuZCBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAodmVyc2lvbi1saXN0LTwKICAgICAg ICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy12ZXJzaW9uIChjYWRyIGVsdCkpCiAgICAgICAgICAg ICAgICAgIChwYWNrYWdlLWRlc2MtdmVyc2lvbiAoY2FkciBhdmFpbGFibGUpKSkpKQogICAgICAg ICAgKHBhY2thZ2UtdmMtcCAoY2FkciAoYXNzcSAoY2FyIGVsdCkgcGFja2FnZS1hbGlzdCkpKSkp CiAgICBwYWNrYWdlLWFsaXN0KSkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gcGFja2FnZS11cGRh dGUtYWxsICgmb3B0aW9uYWwgcXVlcnkpCiAgIlJlZnJlc2ggcGFja2FnZSBsaXN0IGFuZCB1cGdy YWRlIGFsbCBwYWNrYWdlcy4KSWYgUVVFUlksIGFzayB0aGUgdXNlciBiZWZvcmUgdXBkYXRpbmcg cGFja2FnZXMuICBXaGVuIGNhbGxlZAppbnRlcmFjdGl2ZWx5LCBRVUVSWSBpcyBhbHdheXMgdHJ1 ZS4iCiAgKGludGVyYWN0aXZlIChsaXN0IChub3Qgbm9uaW50ZXJhY3RpdmUpKSkKICAocGFja2Fn ZS1yZWZyZXNoLWNvbnRlbnRzKQogIChsZXQgKCh1cGRhdGVhYmxlIChwYWNrYWdlLS11cGRhdGVh YmxlLXBhY2thZ2VzKSkpCiAgICAoaWYgKG5vdCB1cGRhdGVhYmxlKQogICAgICAgIChtZXNzYWdl ICJObyBwYWNrYWdlcyB0byB1cGRhdGUiKQogICAgICAod2hlbiAoYW5kIHF1ZXJ5CiAgICAgICAg ICAgICAgICAgKG5vdCAoeWVzLW9yLW5vLXAKICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGxl bmd0aD0gdXBkYXRlYWJsZSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiT25lIHBhY2th Z2UgdG8gdXBkYXRlLiAgRG8gaXQ/ICIKICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQg IiVzIHBhY2thZ2VzIHRvIHVwZGF0ZS4gIERvIGl0PyIKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGxlbmd0aCB1cGRhdGVhYmxlKSkpKSkpCiAgICAgICAgKHVzZXItZXJyb3IgIlVw ZGF0aW5nIGFib3J0ZWQiKSkKICAgICAgKG1hcGMgIydwYWNrYWdlLXVwZGF0ZSB1cGRhdGVhYmxl KSkpKQoKKGRlZnVuIHBhY2thZ2UtLWRlcGVuZGVuY2llcyAocGtnKQogICJSZXR1cm4gYSBsaXN0 IG9mIGFsbCBkZXBlbmRlbmNpZXMgUEtHIGhhcy4KVGhpcyBpcyBkb25lIHJlY3Vyc2l2ZWx5LiIK ICA7OyBDYW4gd2UgaGF2ZSBjaXJjdWxhciBkZXBlbmRlbmNpZXM/ICBBc3N1bWUgIm5vcGUiLgog ICh3aGVuLWxldCogKChkZXNjIChjYWRyIChhc3NxIHBrZyBwYWNrYWdlLWFyY2hpdmUtY29udGVu dHMpKSkKICAgICAgICAgICAgICAoZGVwcyAobWFwY2FyICMnY2FyIChwYWNrYWdlLWRlc2MtcmVx cyBkZXNjKSkpKQogICAgKGRlbGV0ZS1kdXBzIChhcHBseSAjJ25jb25jIGRlcHMgKG1hcGNhciAj J3BhY2thZ2UtLWRlcGVuZGVuY2llcyBkZXBzKSkpKSkKCihkZWZ1biBwYWNrYWdlLXN0cmlwLXJj cy1pZCAoc3RyKQogICJTdHJpcCBSQ1MgdmVyc2lvbiBJRCBmcm9tIHRoZSB2ZXJzaW9uIHN0cmlu ZyBTVFIuCklmIHRoZSByZXN1bHQgbG9va3MgbGlrZSBhIGRvdHRlZCBudW1lcmljIHZlcnNpb24s IHJldHVybiBpdC4KT3RoZXJ3aXNlIHJldHVybiBuaWwuIgogICh3aGVuIHN0cgogICAgKHdoZW4g KHN0cmluZy1tYXRjaCAiXFxgWyBcdF0qWyRdUmV2aXNpb246WyBcdF0rIiBzdHIpCiAgICAgIChz ZXRxIHN0ciAoc3Vic3RyaW5nIHN0ciAobWF0Y2gtZW5kIDApKSkpCiAgICAobGV0ICgobCAodmVy c2lvbi10by1saXN0IHN0cikpKQogICAgICA7OyBEb24ndCByZXR1cm4gYHN0cicgYnV0IChwYWNr YWdlLXZlcnNpb24tam9pbiAodmVyc2lvbi10by1saXN0IHN0cikpCiAgICAgIDs7IHRvIG1ha2Ug c3VyZSB3ZSB1c2UgYSAiY2Fub25pY2FsIG5hbWUiIQogICAgICAoaWYgbCAocGFja2FnZS12ZXJz aW9uLWpvaW4gbCkpKSkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gcGFja2FnZS1pbnN0YWxsLWZy b20tYnVmZmVyICgpCiAgIkluc3RhbGwgYSBwYWNrYWdlIGZyb20gdGhlIGN1cnJlbnQgYnVmZmVy LgpUaGUgY3VycmVudCBidWZmZXIgaXMgYXNzdW1lZCB0byBiZSBhIHNpbmdsZSAuZWwgb3IgLnRh ciBmaWxlIG9yCmEgZGlyZWN0b3J5LiAgVGhlc2UgbXVzdCBmb2xsb3cgdGhlIHBhY2thZ2luZyBn dWlkZWxpbmVzIChzZWUKaW5mbyBub2RlIGAoZWxpc3ApUGFja2FnaW5nJykuCgpTcGVjaWFsbHks IGlmIGN1cnJlbnQgYnVmZmVyIGlzIGEgZGlyZWN0b3J5LCB0aGUgLXBrZy5lbApkZXNjcmlwdGlv biBmaWxlIGlzIG5vdCBtYW5kYXRvcnksIGluIHdoaWNoIGNhc2UgdGhlIGluZm9ybWF0aW9uCmlz IGRlcml2ZWQgZnJvbSB0aGUgbWFpbiAuZWwgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LgoKRG93bmxv YWRzIGFuZCBpbnN0YWxscyByZXF1aXJlZCBwYWNrYWdlcyBhcyBuZWVkZWQuIgogIChpbnRlcmFj dGl2ZSkKICAobGV0KiAoKHBrZy1kZXNjCiAgICAgICAgICAoY29uZAogICAgICAgICAgICAoKGRl cml2ZWQtbW9kZS1wICdkaXJlZC1tb2RlKQogICAgICAgICAgICAgOzsgVGhpcyBpcyB0aGUgb25s eSB3YXkgYSBwYWNrYWdlLWRlc2Mgb2JqZWN0IHdpdGggYSBgZGlyJwogICAgICAgICAgICAgOzsg ZGVzYy1raW5kIGNhbiBiZSBjcmVhdGVkLiAgU3VjaCBwYWNrYWdlcyBjYW4ndCBiZQogICAgICAg ICAgICAgOzsgdXBsb2FkZWQgb3IgaW5zdGFsbGVkIGZyb20gYXJjaGl2ZXMsIHRoZXkgY2FuIG9u bHkgYmUKICAgICAgICAgICAgIDs7IGluc3RhbGxlZCBmcm9tIGxvY2FsIGJ1ZmZlcnMgb3IgZGly ZWN0b3JpZXMuCiAgICAgICAgICAgICAocGFja2FnZS1kaXItaW5mbykpCiAgICAgICAgICAgICgo ZGVyaXZlZC1tb2RlLXAgJ3Rhci1tb2RlKQogICAgICAgICAgICAgKHBhY2thZ2UtdGFyLWZpbGUt aW5mbykpCiAgICAgICAgICAgICh0CiAgICAgICAgICAgICA7OyBQYWNrYWdlIGhlYWRlcnMgc2hv dWxkIGJlIHBhcnNlZCBmcm9tIGRlY29kZWQgdGV4dAogICAgICAgICAgICAgOzsgKHNlZSBCdWcj NDgxMzcpIHdoZXJlIHBvc3NpYmxlLgogICAgICAgICAgICAgKGlmIChhbmQgKGVxIGJ1ZmZlci1m aWxlLWNvZGluZy1zeXN0ZW0gJ25vLWNvbnZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgICBi dWZmZXItZmlsZS1uYW1lKQogICAgICAgICAgICAgICAgIChsZXQqICgocGFja2FnZS1idWZmZXIg KGN1cnJlbnQtYnVmZmVyKSkKICAgICAgICAgICAgICAgICAgICAgICAgKGRlY29kaW5nLXN5c3Rl bQogICAgICAgICAgICAgICAgICAgICAgICAgKGNhciAoZmluZC1vcGVyYXRpb24tY29kaW5nLXN5 c3RlbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luc2VydC1maWxlLWNvbnRlbnRz CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucyBidWZmZXItZmlsZS1uYW1lCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLWJ1ZmZlcikpKSkpCiAg ICAgICAgICAgICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAo aW5zZXJ0LWJ1ZmZlci1zdWJzdHJpbmcgcGFja2FnZS1idWZmZXIpCiAgICAgICAgICAgICAgICAg ICAgIChkZWNvZGUtY29kaW5nLXJlZ2lvbiAocG9pbnQtbWluKSAocG9pbnQtbWF4KQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rpbmctc3lzdGVtKQogICAg ICAgICAgICAgICAgICAgICAocGFja2FnZS1idWZmZXItaW5mbykpKQoKICAgICAgICAgICAgICAg KHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgKHBhY2thZ2UtYnVmZmVyLWluZm8pKSkp KSkKICAgICAgICAgKG5hbWUgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy1kZXNjKSkpCiAgICA7OyBE b3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgZGVwZW5kZW5jaWVzLgogICAgKGxldCogKChyZXF1aXJl cyAocGFja2FnZS1kZXNjLXJlcXMgcGtnLWRlc2MpKQogICAgICAgICAgICh0cmFuc2FjdGlvbiAo cGFja2FnZS1jb21wdXRlLXRyYW5zYWN0aW9uIG5pbCByZXF1aXJlcykpKQogICAgICAocGFja2Fn ZS1kb3dubG9hZC10cmFuc2FjdGlvbiB0cmFuc2FjdGlvbikpCiAgICA7OyBJbnN0YWxsIHRoZSBw YWNrYWdlIGl0c2VsZi4KICAgIChwYWNrYWdlLXVucGFjayBwa2ctZGVzYykKICAgICh1bmxlc3Mg KHBhY2thZ2UtLXVzZXItc2VsZWN0ZWQtcCBuYW1lKQogICAgICAocGFja2FnZS0tc2F2ZS1zZWxl Y3RlZC1wYWNrYWdlcwogICAgICAgKGNvbnMgbmFtZSBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2Vz KSkpCiAgICAocGFja2FnZS0tcXVpY2tzdGFydC1tYXliZS1yZWZyZXNoKQogICAgcGtnLWRlc2Mp KQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtaW5zdGFsbC1maWxlIChmaWxlKQogICJJ bnN0YWxsIGEgcGFja2FnZSBmcm9tIEZJTEUuClRoZSBmaWxlIGNhbiBlaXRoZXIgYmUgYSB0YXIg ZmlsZSwgYW4gRW1hY3MgTGlzcCBmaWxlLCBvciBhCmRpcmVjdG9yeS4iCiAgKGludGVyYWN0aXZl ICJmUGFja2FnZSBmaWxlIG5hbWU6ICIpCiAgKHdpdGgtdGVtcC1idWZmZXIKICAgIChpZiAoZmls ZS1kaXJlY3RvcnktcCBmaWxlKQogICAgICAgIChwcm9nbgogICAgICAgICAgKHNldHEgZGVmYXVs dC1kaXJlY3RvcnkgZmlsZSkKICAgICAgICAgIChkaXJlZC1tb2RlKSkKICAgICAgKGluc2VydC1m aWxlLWNvbnRlbnRzLWxpdGVyYWxseSBmaWxlKQogICAgICAoc2V0LXZpc2l0ZWQtZmlsZS1uYW1l IGZpbGUpCiAgICAgIChzZXQtYnVmZmVyLW1vZGlmaWVkLXAgbmlsKQogICAgICAod2hlbiAoc3Ry aW5nLW1hdGNoICJcXC50YXJcXCciIGZpbGUpICh0YXItbW9kZSkpKQogICAgKHBhY2thZ2UtaW5z dGFsbC1mcm9tLWJ1ZmZlcikpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtaW5zdGFs bC1zZWxlY3RlZC1wYWNrYWdlcyAoJm9wdGlvbmFsIG5vY29uZmlybSkKICAiRW5zdXJlIHBhY2th Z2VzIGluIGBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJyBhcmUgaW5zdGFsbGVkLgpJZiBzb21l IHBhY2thZ2VzIGFyZSBub3QgaW5zdGFsbGVkLCBwcm9wb3NlIHRvIGluc3RhbGwgdGhlbS4KSWYg b3B0aW9uYWwgYXJndW1lbnQgTk9DT05GSVJNIGlzIG5vbi1uaWwsIGRvbid0IGFzayBmb3IKY29u ZmlybWF0aW9uIHRvIGluc3RhbGwgcGFja2FnZXMuIgogIChpbnRlcmFjdGl2ZSkKICAocGFja2Fn ZS0tYXJjaGl2ZXMtaW5pdGlhbGl6ZSkKICA7OyBXZSBkb24ndCBuZWVkIHRvIHBvcHVsYXRlIGBw YWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJyBiZWZvcmUKICA7OyB1c2luZyBoZXJlLCBiZWNhdXNl IHRoZSBvdXRjb21lIGlzIHRoZSBzYW1lIGVpdGhlciB3YXkgKG5vdGhpbmcKICA7OyBnZXRzIGlu c3RhbGxlZCkuCiAgKGlmIChub3QgcGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcykKICAgICAgKG1l c3NhZ2UgImBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJyBpcyBlbXB0eSwgbm90aGluZyB0byBp bnN0YWxsIikKICAgIChsZXQqICgobm90LWluc3RhbGxlZCAoc2VxLXJlbW92ZSAjJ3BhY2thZ2Ut aW5zdGFsbGVkLXAgcGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcykpCiAgICAgICAgICAgKGF2YWls YWJsZSAoc2VxLWZpbHRlciAobGFtYmRhIChwKSAoYXNzcSBwIHBhY2thZ2UtYXJjaGl2ZS1jb250 ZW50cykpIG5vdC1pbnN0YWxsZWQpKQogICAgICAgICAgIChkaWZmZXJlbmNlICgtIChsZW5ndGgg bm90LWluc3RhbGxlZCkgKGxlbmd0aCBhdmFpbGFibGUpKSkpCiAgICAgIChjb25kCiAgICAgICAo YXZhaWxhYmxlCiAgICAgICAgKHdoZW4gKG9yIG5vY29uZmlybQogICAgICAgICAgICAgICAgICAo eS1vci1uLXAKICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIlBhY2thZ2VzIHRvIGluc3RhbGw6 ICVkICglcyksIHByb2NlZWQ/ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCBh dmFpbGFibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQgIydzeW1ib2wt bmFtZSBhdmFpbGFibGUgIiAiKSkpKQogICAgICAgICAgKG1hcGMgKGxhbWJkYSAocCkgKHBhY2th Z2UtaW5zdGFsbCBwICdkb250LXNlbGVjdCkpIGF2YWlsYWJsZSkpKQogICAgICAgKCg+IGRpZmZl cmVuY2UgMCkKICAgICAgICAobWVzc2FnZSAoc3Vic3RpdHV0ZS1jb21tYW5kLWtleXMKICAgICAg ICAgICAgICAgICAgIlBhY2thZ2VzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGU6ICVkICh0aGUgcmVz dCBpcyBhbHJlYWR5IFwKaW5zdGFsbGVkKSwgbWF5YmUgeW91IG5lZWQgdG8gXFxbcGFja2FnZS1y ZWZyZXNoLWNvbnRlbnRzXSIpCiAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZSkpCiAgICAgICAo dAogICAgICAgIChtZXNzYWdlICJBbGwgeW91ciBwYWNrYWdlcyBhcmUgYWxyZWFkeSBpbnN0YWxs ZWQiKSkpKSkpCgoMCjs7OyBQYWNrYWdlIERlbGV0aW9uCgooZGVmdW4gcGFja2FnZS0tbmV3ZXN0 LXAgKHBrZykKICAiUmV0dXJuIG5vbi1uaWwgaWYgUEtHIGlzIHRoZSBuZXdlc3QgcGFja2FnZSB3 aXRoIGl0cyBuYW1lLiIKICAoZXF1YWwgKGNhZHIgKGFzc3EgKHBhY2thZ2UtZGVzYy1uYW1lIHBr ZykgcGFja2FnZS1hbGlzdCkpCiAgICAgICAgIHBrZykpCgooZGVjbGFyZS1mdW5jdGlvbiBjb21w LWVsLXRvLWVsbi1maWxlbmFtZSAiY29tcC5jIikKKGRlZnZhciBwYWNrYWdlLXZjLXJlcG9zaXRv cnktc3RvcmUpCihkZWZ1biBwYWNrYWdlLS1kZWxldGUtZGlyZWN0b3J5IChkaXIpCiAgIkRlbGV0 ZSBQS0ctREVTQyBkaXJlY3RvcnkgRElSIHJlY3Vyc2l2ZWx5LgpDbGVhbi11cCB0aGUgY29ycmVz cG9uZGluZyAuZWxuIGZpbGVzIGlmIEVtYWNzIGlzIG5hdGl2ZQpjb21waWxlZC4iCiAgKHdoZW4g KGZlYXR1cmVwICduYXRpdmUtY29tcGlsZSkKICAgIChjbC1sb29wCiAgICAgZm9yIGZpbGUgaW4g KGRpcmVjdG9yeS1maWxlcy1yZWN1cnNpdmVseSBkaXIgIlxcLmVsXFwnIikKICAgICBkbyAoY29t cC1jbGVhbi11cC1zdGFsZS1lbG4gKGNvbXAtZWwtdG8tZWxuLWZpbGVuYW1lIGZpbGUpKSkpCiAg KGlmIChmaWxlLXN5bWxpbmstcCAoZGlyZWN0b3J5LWZpbGUtbmFtZSBkaXIpKQogICAgICAoZGVs ZXRlLWZpbGUgKGRpcmVjdG9yeS1maWxlLW5hbWUgZGlyKSkKICAgIChkZWxldGUtZGlyZWN0b3J5 IGRpciB0KSkpCgoKKGRlZnVuIHBhY2thZ2UtZGVsZXRlIChwa2ctZGVzYyAmb3B0aW9uYWwgZm9y Y2Ugbm9zYXZlKQogICJEZWxldGUgcGFja2FnZSBQS0ctREVTQy4KCkFyZ3VtZW50IFBLRy1ERVND IGlzIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiBwYWNrYWdlIGFzIHZlY3Rvci4KSW50ZXJhY3RpdmVs eSwgcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgcGFja2FnZSBuYW1lIGFuZCB2ZXJzaW9uLgoKV2hl biBwYWNrYWdlIGlzIHVzZWQgZWxzZXdoZXJlIGFzIGRlcGVuZGVuY3kgb2YgYW5vdGhlciBwYWNr YWdlLApyZWZ1c2UgZGVsZXRpbmcgaXQgYW5kIHJldHVybiBhbiBlcnJvci4KSWYgcHJlZml4IGFy Z3VtZW50IEZPUkNFIGlzIG5vbi1uaWwsIHBhY2thZ2Ugd2lsbCBiZSBkZWxldGVkIGV2ZW4KaWYg aXQgaXMgdXNlZCBlbHNld2hlcmUuCklmIE5PU0FWRSBpcyBub24tbmlsLCB0aGUgcGFja2FnZSBp cyBub3QgcmVtb3ZlZCBmcm9tCmBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJy4iCiAgKGludGVy YWN0aXZlCiAgIChwcm9nbgogICAgIChsZXQqICgocGFja2FnZS10YWJsZQogICAgICAgICAgICAg KG1hcGNhcgogICAgICAgICAgICAgIChsYW1iZGEgKHApIChjb25zIChwYWNrYWdlLWRlc2MtZnVs bC1uYW1lIHApIHApKQogICAgICAgICAgICAgIChkZWxxIG5pbAogICAgICAgICAgICAgICAgICAg IChtYXBjYXIgKGxhbWJkYSAocCkgKHVubGVzcyAocGFja2FnZS1idWlsdC1pbi1wIHApIHApKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwcGx5ICMnYXBwZW5kIChtYXBjYXIgIydjZHIg KHBhY2thZ2UtLWFsaXN0KSkpKSkpKQogICAgICAgICAgICAocGFja2FnZS1uYW1lIChjb21wbGV0 aW5nLXJlYWQgIkRlbGV0ZSBwYWNrYWdlOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAobWFwY2FyICMnY2FyIHBhY2thZ2UtdGFibGUpCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwgdCkpKQogICAgICAgKGxpc3QgKGNkciAo YXNzb2MgcGFja2FnZS1uYW1lIHBhY2thZ2UtdGFibGUpKQogICAgICAgICAgICAgY3VycmVudC1w cmVmaXgtYXJnIG5pbCkpKSkKICAobGV0ICgoZGlyIChwYWNrYWdlLWRlc2MtZGlyIHBrZy1kZXNj KSkKICAgICAgICAobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAgIHBr Zy11c2VkLWVsc2V3aGVyZS1ieSkKICAgIDs7IElmIHRoZSB1c2VyIGlzIHRyeWluZyB0byBkZWxl dGUgdGhpcyBwYWNrYWdlLCB0aGV5IGRlZmluaXRlbHkKICAgIDs7IGRvbid0IHdhbnQgaXQgbWFy a2VkIGFzIHNlbGVjdGVkLCBzbyB3ZSByZW1vdmUgaXQgZnJvbQogICAgOzsgYHBhY2thZ2Utc2Vs ZWN0ZWQtcGFja2FnZXMnIGV2ZW4gaWYgaXQgY2FuJ3QgYmUgZGVsZXRlZC4KICAgICh3aGVuIChh bmQgKG51bGwgbm9zYXZlKQogICAgICAgICAgICAgICAocGFja2FnZS0tdXNlci1zZWxlY3RlZC1w IG5hbWUpCiAgICAgICAgICAgICAgIDs7IERvbid0IGRlc2VsZWN0IGlmIHRoaXMgaXMgYW4gb2xk ZXIgdmVyc2lvbiBvZiBhbgogICAgICAgICAgICAgICA7OyB1cGdyYWRlZCBwYWNrYWdlLgogICAg ICAgICAgICAgICAocGFja2FnZS0tbmV3ZXN0LXAgcGtnLWRlc2MpKQogICAgICAocGFja2FnZS0t c2F2ZS1zZWxlY3RlZC1wYWNrYWdlcyAocmVtb3ZlIG5hbWUgcGFja2FnZS1zZWxlY3RlZC1wYWNr YWdlcykpKQogICAgKGNvbmQgKChub3QgKHN0cmluZy1wcmVmaXgtcCAoZmlsZS1uYW1lLWFzLWRp cmVjdG9yeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGFuZC1maWxlLW5h bWUgcGFja2FnZS11c2VyLWRpcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChl eHBhbmQtZmlsZS1uYW1lIGRpcikpKQogICAgICAgICAgIDs7IERvbid0IGRlbGV0ZSAic3lzdGVt IiBwYWNrYWdlcy4KICAgICAgICAgICAoZXJyb3IgIlBhY2thZ2UgYCVzJyBpcyBhIHN5c3RlbSBw YWNrYWdlLCBub3QgZGVsZXRpbmciCiAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtZnVs bC1uYW1lIHBrZy1kZXNjKSkpCiAgICAgICAgICAoKGFuZCAobnVsbCBmb3JjZSkKICAgICAgICAg ICAgICAgIChzZXRxIHBrZy11c2VkLWVsc2V3aGVyZS1ieQogICAgICAgICAgICAgICAgICAgICAg KHBhY2thZ2UtLXVzZWQtZWxzZXdoZXJlLXAgcGtnLWRlc2MpKSkKICAgICAgICAgICA7OyBEb24n dCBkZWxldGUgcGFja2FnZXMgdXNlZCBhcyBkZXBlbmRlbmN5IGVsc2V3aGVyZS4KICAgICAgICAg ICAoZXJyb3IgIlBhY2thZ2UgYCVzJyBpcyB1c2VkIGJ5IGAlcycgYXMgZGVwZW5kZW5jeSwgbm90 IGRlbGV0aW5nIgogICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLWZ1bGwtbmFtZSBwa2ct ZGVzYykKICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy11c2VkLWVsc2V3 aGVyZS1ieSkpKQogICAgICAgICAgKHQKICAgICAgICAgICAoYWRkLWhvb2sgJ3Bvc3QtY29tbWFu ZC1ob29rICMncGFja2FnZS1tZW51LS1wb3N0LXJlZnJlc2gpCiAgICAgICAgICAgKHBhY2thZ2Ut LWRlbGV0ZS1kaXJlY3RvcnkgZGlyKQogICAgICAgICAgIDs7IFJlbW92ZSBOQU1FLVZFUlNJT04u c2lnbmVkIGFuZCBOQU1FLXJlYWRtZS50eHQgZmlsZXMuCiAgICAgICAgICAgOzsKICAgICAgICAg ICA7OyBOQU1FLXJlYWRtZS50eHQgZmlsZXMgYXJlIG5vIGxvbmdlciBjcmVhdGVkLCBidXQgdGhl eQogICAgICAgICAgIDs7IG1heSBiZSBsZWZ0IGFyb3VuZCBmcm9tIGFuIGVhcmxpZXIgaW5zdGFs bC4KICAgICAgICAgICAoZG9saXN0IChzdWZmaXggJygiLnNpZ25lZCIgInJlYWRtZS50eHQiKSkK ICAgICAgICAgICAgIChsZXQqICgodmVyc2lvbiAocGFja2FnZS12ZXJzaW9uLWpvaW4gKHBhY2th Z2UtZGVzYy12ZXJzaW9uIHBrZy1kZXNjKSkpCiAgICAgICAgICAgICAgICAgICAgKGZpbGUgKGNv bmNhdCAoaWYgKHN0cmluZz0gc3VmZml4ICIuc2lnbmVkIikKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBkaXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KHN1YnN0cmluZyBkaXIgMCAoLSAobGVuZ3RoIHZlcnNpb24pKSkpCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzdWZmaXgpKSkKICAgICAgICAgICAgICAgKHdoZW4gKGZpbGUtZXhp c3RzLXAgZmlsZSkKICAgICAgICAgICAgICAgICAoZGVsZXRlLWZpbGUgZmlsZSkpKSkKICAgICAg ICAgICA7OyBVcGRhdGUgcGFja2FnZS1hbGlzdC4KICAgICAgICAgICAobGV0ICgocGtncyAoYXNz cSBuYW1lIHBhY2thZ2UtYWxpc3QpKSkKICAgICAgICAgICAgIChkZWxldGUgcGtnLWRlc2MgcGtn cykKICAgICAgICAgICAgICh1bmxlc3MgKGNkciBwa2dzKQogICAgICAgICAgICAgICAoc2V0cSBw YWNrYWdlLWFsaXN0IChkZWxxIHBrZ3MgcGFja2FnZS1hbGlzdCkpKSkKICAgICAgICAgICAocGFj a2FnZS0tcXVpY2tzdGFydC1tYXliZS1yZWZyZXNoKQogICAgICAgICAgIChtZXNzYWdlICJQYWNr YWdlIGAlcycgZGVsZXRlZC4iCiAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy1mdWxs LW5hbWUgcGtnLWRlc2MpKSkpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBwYWNrYWdlLXJlaW5z dGFsbCAocGtnKQogICJSZWluc3RhbGwgcGFja2FnZSBQS0cuClBLRyBzaG91bGQgYmUgZWl0aGVy IGEgc3ltYm9sLCB0aGUgcGFja2FnZSBuYW1lLCBvciBhIGBwYWNrYWdlLWRlc2MnCm9iamVjdC4i CiAgKGludGVyYWN0aXZlCiAgIChwcm9nbgogICAgIChwYWNrYWdlLS1hcmNoaXZlcy1pbml0aWFs aXplKQogICAgIChsaXN0IChpbnRlcm4gKGNvbXBsZXRpbmctcmVhZAogICAgICAgICAgICAgICAg ICAgICJSZWluc3RhbGwgcGFja2FnZTogIgogICAgICAgICAgICAgICAgICAgIChtYXBjYXIgIydz eW1ib2wtbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcGNhciAjJ2NhciBwYWNr YWdlLWFsaXN0KSkpKSkpKQogIChwYWNrYWdlLS1hcmNoaXZlcy1pbml0aWFsaXplKQogIChwYWNr YWdlLWRlbGV0ZQogICAoaWYgKHBhY2thZ2UtZGVzYy1wIHBrZykgcGtnIChjYWRyIChhc3NxIHBr ZyBwYWNrYWdlLWFsaXN0KSkpCiAgICdmb3JjZSAnbm9zYXZlKQogIChwYWNrYWdlLWluc3RhbGwg cGtnICdkb250LXNlbGVjdCkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gcGFja2FnZS1yZWNvbXBp bGUgKHBrZykKICAiQnl0ZS1jb21waWxlIHBhY2thZ2UgUEtHIGFnYWluLgpQS0cgc2hvdWxkIGJl IGVpdGhlciBhIHN5bWJvbCwgdGhlIHBhY2thZ2UgbmFtZSwgb3IgYSBgcGFja2FnZS1kZXNjJwpv YmplY3QuIgogIChpbnRlcmFjdGl2ZSAobGlzdCAoaW50ZXJuIChjb21wbGV0aW5nLXJlYWQKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY29tcGlsZSBwYWNrYWdlOiAiCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChtYXBjYXIgIydzeW1ib2wtbmFtZQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjYXIgIydjYXIgcGFja2FnZS1hbGlzdCkpKSkp KQogIChsZXQgKChwa2ctZGVzYyAoaWYgKHBhY2thZ2UtZGVzYy1wIHBrZykKICAgICAgICAgICAg ICAgICAgICAgIHBrZwogICAgICAgICAgICAgICAgICAgIChjYWRyIChhc3NxIHBrZyBwYWNrYWdl LWFsaXN0KSkpKSkKICAgIDs7IERlbGV0ZSB0aGUgb2xkIC5lbGMgZmlsZXMgdG8gZW5zdXJlIHRo YXQgd2UgZG9uJ3QgaW5hZHZlcnRlbnRseQogICAgOzsgbG9hZCB0aGVtIChpbiBjYXNlIHRoZXkg Y29udGFpbiBieXRlIGNvZGUvbWFjcm9zIHRoYXQgYXJlIG5vdwogICAgOzsgaW52YWxpZCkuCiAg ICAoZG9saXN0IChlbGMgKGRpcmVjdG9yeS1maWxlcy1yZWN1cnNpdmVseQogICAgICAgICAgICAg ICAgICAocGFja2FnZS1kZXNjLWRpciBwa2ctZGVzYykgIlxcLmVsY1xcJyIpKQogICAgICAoZGVs ZXRlLWZpbGUgZWxjKSkKICAgIChwYWNrYWdlLS1jb21waWxlIHBrZy1kZXNjKSkpCgo7OzsjIyNh dXRvbG9hZAooZGVmdW4gcGFja2FnZS1yZWNvbXBpbGUtYWxsICgpCiAgIkJ5dGUtY29tcGlsZSBh bGwgaW5zdGFsbGVkIHBhY2thZ2VzLgpUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgb25seSBpbiB0 aGUgY2FzZSB0aGUgYnl0ZS1jb21waWxlZCBmaWxlcwphcmUgaW52YWxpZCBkdWUgdG8gY2hhbmdl ZCBieXRlLWNvZGUsIG1hY3JvcyBvciB0aGUgbGlrZS4iCiAgKGludGVyYWN0aXZlKQogIChwY2Fz ZS1kb2xpc3QgKGAoXyAscGtnLWRlc2MpIHBhY2thZ2UtYWxpc3QpCiAgICAocGFja2FnZS1yZWNv bXBpbGUgcGtnLWRlc2MpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBwYWNrYWdlLWF1dG9yZW1v dmUgKCkKICAiUmVtb3ZlIHBhY2thZ2VzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQuCgpQYWNr YWdlcyB0aGF0IGFyZSBubyBtb3JlIG5lZWRlZCBieSBvdGhlciBwYWNrYWdlcyBpbgpgcGFja2Fn ZS1zZWxlY3RlZC1wYWNrYWdlcycgYW5kIHRoZWlyIGRlcGVuZGVuY2llcwp3aWxsIGJlIGRlbGV0 ZWQuIgogIChpbnRlcmFjdGl2ZSkKICA7OyBJZiBgcGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcycg aXMgbmlsLCBpdCB3b3VsZCBtYWtlIG5vIHNlbnNlIHRvCiAgOzsgdHJ5IHRvIHBvcHVsYXRlIGl0 IGhlcmUsIGJlY2F1c2UgdGhlbiBgcGFja2FnZS1hdXRvcmVtb3ZlJyB3aWxsCiAgOzsgZG8gYWJz b2x1dGVseSBub3RoaW5nLgogICh3aGVuIChvciBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzCiAg ICAgICAgICAgICh5ZXMtb3Itbm8tcAogICAgICAgICAgICAgKGZvcm1hdC1tZXNzYWdlCiAgICAg ICAgICAgICAgImBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJyBpcyBlbXB0eSEgUmVhbGx5IHJl bW92ZSBBTEwgcGFja2FnZXM/ICIpKSkKICAgIChsZXQgKChyZW1vdmFibGUgKHBhY2thZ2UtLXJl bW92YWJsZS1wYWNrYWdlcykpKQogICAgICAoaWYgcmVtb3ZhYmxlCiAgICAgICAgICAod2hlbiAo eS1vci1uLXAKICAgICAgICAgICAgICAgICAoZm9ybWF0ICJQYWNrYWdlcyB0byBkZWxldGU6ICVk ICglcyksIHByb2NlZWQ/ICIKICAgICAgICAgICAgICAgICAgIChsZW5ndGggcmVtb3ZhYmxlKQog ICAgICAgICAgICAgICAgICAgKG1hcGNvbmNhdCAjJ3N5bWJvbC1uYW1lIHJlbW92YWJsZSAiICIp KSkKICAgICAgICAgICAgKG1hcGMgKGxhbWJkYSAocCkKICAgICAgICAgICAgICAgICAgICAocGFj a2FnZS1kZWxldGUgKGNhZHIgKGFzc3EgcCBwYWNrYWdlLWFsaXN0KSkgdCkpCiAgICAgICAgICAg ICAgICAgIHJlbW92YWJsZSkpCiAgICAgICAgKG1lc3NhZ2UgIk5vdGhpbmcgdG8gYXV0b3JlbW92 ZSIpKSkpKQoKDAo7Ozs7IFBhY2thZ2UgZGVzY3JpcHRpb24gYnVmZmVyLgoKOzs7IyMjYXV0b2xv YWQKKGRlZnVuIGRlc2NyaWJlLXBhY2thZ2UgKHBhY2thZ2UpCiAgIkRpc3BsYXkgdGhlIGZ1bGwg ZG9jdW1lbnRhdGlvbiBvZiBQQUNLQUdFIChhIHN5bWJvbCkuIgogIChpbnRlcmFjdGl2ZQogICAo bGV0KiAoKGd1ZXNzIChvciAoZnVuY3Rpb24tY2FsbGVkLWF0LXBvaW50KQogICAgICAgICAgICAg ICAgICAgICAoc3ltYm9sLWF0LXBvaW50KSkpKQogICAgIChyZXF1aXJlICdmaW5kZXItaW5mIG5p bCB0KQogICAgIDs7IExvYWQgdGhlIHBhY2thZ2UgbGlzdCBpZiBuZWNlc3NhcnkgKGJ1dCBkb24n dCBhY3RpdmF0ZSB0aGVtKS4KICAgICAodW5sZXNzIHBhY2thZ2UtLWluaXRpYWxpemVkCiAgICAg ICAocGFja2FnZS1pbml0aWFsaXplIHQpKQogICAgIChsZXQgKChwYWNrYWdlcyAoYXBwZW5kICht YXBjYXIgIydjYXIgcGFja2FnZS1hbGlzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo bWFwY2FyICMnY2FyIHBhY2thZ2UtYXJjaGl2ZS1jb250ZW50cykKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAobWFwY2FyICMnY2FyIHBhY2thZ2UtLWJ1aWx0aW5zKSkpKQogICAgICAgKHVu bGVzcyAobWVtcSBndWVzcyBwYWNrYWdlcykKICAgICAgICAgKHNldHEgZ3Vlc3MgbmlsKSkKICAg ICAgIChzZXRxIHBhY2thZ2VzIChtYXBjYXIgIydzeW1ib2wtbmFtZSBwYWNrYWdlcykpCiAgICAg ICAobGV0ICgodmFsCiAgICAgICAgICAgICAgKGNvbXBsZXRpbmctcmVhZCAoZm9ybWF0LXByb21w dCAiRGVzY3JpYmUgcGFja2FnZSIgZ3Vlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwYWNrYWdlcyBuaWwgdCBuaWwgbmlsICh3aGVuIGd1ZXNzCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbC1uYW1lIGd1ZXNzKSkp KSkKICAgICAgICAgKGxpc3QgKGFuZCAoPiAobGVuZ3RoIHZhbCkgMCkgKGludGVybiB2YWwpKSkp KSkpCiAgKGlmIChub3QgKG9yIChwYWNrYWdlLWRlc2MtcCBwYWNrYWdlKSAoYW5kIHBhY2thZ2Ug KHN5bWJvbHAgcGFja2FnZSkpKSkKICAgICAgKG1lc3NhZ2UgIk5vIHBhY2thZ2Ugc3BlY2lmaWVk IikKICAgIChoZWxwLXNldHVwLXhyZWYgKGxpc3QgIydkZXNjcmliZS1wYWNrYWdlIHBhY2thZ2Up CiAgICAgICAgICAgICAgICAgICAgIChjYWxsZWQtaW50ZXJhY3RpdmVseS1wICdpbnRlcmFjdGl2 ZSkpCiAgICAod2l0aC1oZWxwLXdpbmRvdyAoaGVscC1idWZmZXIpCiAgICAgICh3aXRoLWN1cnJl bnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAogICAgICAgIChkZXNjcmliZS1wYWNrYWdlLTEgcGFj a2FnZSkpKSkpCgooZGVmZmFjZSBwYWNrYWdlLWhlbHAtc2VjdGlvbi1uYW1lCiAgJygodCA6aW5o ZXJpdCAoYm9sZCBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKSkpCiAgIkZhY2UgdXNlZCBv biBzZWN0aW9uIG5hbWVzIGluIHBhY2thZ2UgZGVzY3JpcHRpb24gYnVmZmVycy4iCiAgOnZlcnNp b24gIjI1LjEiKQoKKGRlZnVuIHBhY2thZ2UtLXByaW50LWhlbHAtc2VjdGlvbiAobmFtZSAmcmVz dCBzdHJpbmdzKQogICJQcmludCBcIk5BTUU6IFwiLCByaWdodCBhbGlnbmVkIHRvIHRoZSAxM3Ro IGNvbHVtbi4KSWYgbW9yZSBTVFJJTkdTIGFyZSBwcm92aWRlZCwgaW5zZXJ0IHRoZW0gZm9sbG93 ZWQgYnkgYSBuZXdsaW5lLgpPdGhlcndpc2Ugbm8gbmV3bGluZSBpcyBpbnNlcnRlZC4iCiAgKGRl Y2xhcmUgKGluZGVudCAxKSkKICAoaW5zZXJ0IChtYWtlLXN0cmluZyAobWF4IDAgKC0gMTEgKHN0 cmluZy13aWR0aCBuYW1lKSkpID9ccykKICAgICAgICAgIChwcm9wZXJ0aXplIChjb25jYXQgbmFt ZSAiOiAiKSAnZm9udC1sb2NrLWZhY2UgJ3BhY2thZ2UtaGVscC1zZWN0aW9uLW5hbWUpKQogICh3 aGVuIHN0cmluZ3MKICAgIChhcHBseSAjJ2luc2VydCBzdHJpbmdzKQogICAgKGluc2VydCAiXG4i KSkpCgooZGVjbGFyZS1mdW5jdGlvbiBsbS1jb21tZW50YXJ5ICJsaXNwLW1udCIgKCZvcHRpb25h bCBmaWxlKSkKCihkZWZ1biBwYWNrYWdlLS1nZXQtZGVzY3JpcHRpb24gKGRlc2MpCiAgIlJldHVy biBhIHN0cmluZyBjb250YWluaW5nIHRoZSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrYWdl IERFU0MuClRoZSBkZXNjcmlwdGlvbiBpcyByZWFkIGZyb20gdGhlIGluc3RhbGxlZCBwYWNrYWdl IGZpbGVzLiIKICA7OyBJbnN0YWxsZWQgcGFja2FnZXMgaGF2ZSBuaWwgZm9yIGtpbmQsIHNvIHdl IGxvb2sgZm9yIFJFQURNRQogIDs7IGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byB0aGUgQ29tbWVu dGFyeSBoZWFkZXIuCgogIDs7IFdlIGRvbuKAmXQgaW5jbHVkZSBSRUFETUUubWQgaGVyZSwgYmVj YXVzZSB0aGF0IGlzIG9mdGVuIHRoZSBob21lCiAgOzsgcGFnZSBvbiBhIHNpdGUgbGlrZSBnaXRo dWIsIGFuZCBub3Qgc3VpdGFibGUgYXMgdGhlIHBhY2thZ2UgbG9uZwogIDs7IGRlc2NyaXB0aW9u LgogIChsZXQgKChmaWxlcyAnKCJSRUFETUUtZWxwYSIgIlJFQURNRS1lbHBhLm1kIiAiUkVBRE1F IiAiUkVBRE1FLnJzdCIgIlJFQURNRS5vcmciKSkKICAgICAgICBmaWxlCiAgICAgICAgKHNyY2Rp ciAocGFja2FnZS1kZXNjLWRpciBkZXNjKSkKICAgICAgICByZXN1bHQpCiAgICAod2hpbGUgKGFu ZCBmaWxlcwogICAgICAgICAgICAgICAgKG5vdCByZXN1bHQpKQogICAgICAoc2V0cSBmaWxlIChw b3AgZmlsZXMpKQogICAgICAod2hlbiAoZmlsZS1yZWFkYWJsZS1wIChleHBhbmQtZmlsZS1uYW1l IGZpbGUgc3JjZGlyKSkKICAgICAgICA7OyBGb3VuZCBhIFJFQURNRS4KICAgICAgICAod2l0aC10 ZW1wLWJ1ZmZlcgogICAgICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzIChleHBhbmQtZmlsZS1u YW1lIGZpbGUgc3JjZGlyKSkKICAgICAgICAgIChzZXRxIHJlc3VsdCAoYnVmZmVyLXN0cmluZykp KSkpCgogICAgKG9yCiAgICAgcmVzdWx0CgogICAgIDs7IExvb2sgZm9yIENvbW1lbnRhcnkgaGVh ZGVyLgogICAgIChsbS1jb21tZW50YXJ5IChleHBhbmQtZmlsZS1uYW1lCiAgICAgICAgICAgICAg ICAgICAgIChmb3JtYXQgIiVzLmVsIiAocGFja2FnZS1kZXNjLW5hbWUgZGVzYykpIHNyY2Rpcikp CiAgICAgIiIpKSkKCihkZWZ1biBwYWNrYWdlLS1kZXNjcmliZS1hZGQtbGlicmFyeS1saW5rcyAo KQogICJBZGQgbGlua3MgdG8gbGlicmFyeSBuYW1lcyBpbiBwYWNrYWdlIGRlc2NyaXB0aW9uLiIK ICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJcXDxcXChbLVs6YWxudW06XV0rXFwuZWxcXClc XD4iIG5pbCB0KQogICAgKGlmIChsb2NhdGUtbGlicmFyeSAobWF0Y2gtc3RyaW5nIDEpKQogICAg ICAgIChtYWtlLXRleHQtYnV0dG9uIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKQog ICAgICAgICAgICAgICAgICAgICAgICAgICd4cmVmIChtYXRjaC1zdHJpbmctbm8tcHJvcGVydGll cyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICdoZWxwLWVjaG8gIlJlYWQgdGhpcyBmaWxl J3MgY29tbWVudGFyeSIKICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSAncGFja2FnZS0t ZmluZGVyLXhyZWYpKSkpCgooZGVmdW4gZGVzY3JpYmUtcGFja2FnZS0xIChwa2cpCiAgIkluc2Vy dCB0aGUgcGFja2FnZSBkZXNjcmlwdGlvbiBmb3IgUEtHLgpIZWxwZXIgZnVuY3Rpb24gZm9yIGBk ZXNjcmliZS1wYWNrYWdlJy4iCiAgKHJlcXVpcmUgJ2xpc3AtbW50KQogIChsZXQqICgoZGVzYyAo b3IKICAgICAgICAgICAgICAgIChpZiAocGFja2FnZS1kZXNjLXAgcGtnKSBwa2cpCiAgICAgICAg ICAgICAgICAoY2FkciAoYXNzcSBwa2cgcGFja2FnZS1hbGlzdCkpCiAgICAgICAgICAgICAgICAo bGV0ICgoYnVpbHQtaW4gKGFzc3EgcGtnIHBhY2thZ2UtLWJ1aWx0aW5zKSkpCiAgICAgICAgICAg ICAgICAgIChpZiBidWlsdC1pbgogICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtLWZyb20t YnVpbHRpbiBidWlsdC1pbikKICAgICAgICAgICAgICAgICAgICAoY2FkciAoYXNzcSBwa2cgcGFj a2FnZS1hcmNoaXZlLWNvbnRlbnRzKSkpKSkpCiAgICAgICAgIChuYW1lIChpZiBkZXNjIChwYWNr YWdlLWRlc2MtbmFtZSBkZXNjKSBwa2cpKQogICAgICAgICAocGtnLWRpciAoaWYgZGVzYyAocGFj a2FnZS1kZXNjLWRpciBkZXNjKSkpCiAgICAgICAgIChyZXFzIChpZiBkZXNjIChwYWNrYWdlLWRl c2MtcmVxcyBkZXNjKSkpCiAgICAgICAgIChyZXF1aXJlZC1ieSAoaWYgZGVzYyAocGFja2FnZS0t dXNlZC1lbHNld2hlcmUtcCBkZXNjIG5pbCAnYWxsKSkpCiAgICAgICAgICh2ZXJzaW9uIChpZiBk ZXNjIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBkZXNjKSkpCiAgICAgICAgIChhcmNoaXZlIChpZiBk ZXNjIChwYWNrYWdlLWRlc2MtYXJjaGl2ZSBkZXNjKSkpCiAgICAgICAgIChleHRyYXMgKGFuZCBk ZXNjIChwYWNrYWdlLWRlc2MtZXh0cmFzIGRlc2MpKSkKICAgICAgICAgKHdlYnNpdGUgKGNkciAo YXNzb2MgOnVybCBleHRyYXMpKSkKICAgICAgICAgKGNvbW1pdCAoY2RyIChhc3NvYyA6Y29tbWl0 IGV4dHJhcykpKQogICAgICAgICAoa2V5d29yZHMgKGlmIGRlc2MgKHBhY2thZ2UtZGVzYy0ta2V5 d29yZHMgZGVzYykpKQogICAgICAgICAoYnVpbHQtaW4gKGVxIHBrZy1kaXIgJ2J1aWx0aW4pKQog ICAgICAgICAoaW5zdGFsbGFibGUgKGFuZCBhcmNoaXZlIChub3QgYnVpbHQtaW4pKSkKICAgICAg ICAgKHN0YXR1cyAoaWYgZGVzYyAocGFja2FnZS1kZXNjLXN0YXR1cyBkZXNjKSAib3JwaGFuIikp CiAgICAgICAgIChpbmNvbXBhdGlibGUtcmVhc29uIChwYWNrYWdlLS1pbmNvbXBhdGlibGUtcCBk ZXNjKSkKICAgICAgICAgKHNpZ25lZCAoaWYgZGVzYyAocGFja2FnZS1kZXNjLXNpZ25lZCBkZXNj KSkpCiAgICAgICAgIChtYWludGFpbmVyIChjZHIgKGFzc29jIDptYWludGFpbmVyIGV4dHJhcykp KQogICAgICAgICAoYXV0aG9ycyAoY2RyIChhc3NvYyA6YXV0aG9ycyBleHRyYXMpKSkKICAgICAg ICAgKG5ld3MgKGFuZC1sZXQqIChwa2ctZGlyCiAgICAgICAgICAgICAgICAgICAgICAgICAgKChu b3QgYnVpbHQtaW4pKQogICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlIChleHBhbmQtZmls ZS1uYW1lICJuZXdzIiBwa2ctZGlyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZpbGUt cmVndWxhci1wIGZpbGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICgoZmlsZS1yZWFkYWJs ZS1wIGZpbGUpKSkKICAgICAgICAgICAgICAgICBmaWxlKSkpCiAgICAod2hlbiAoc3RyaW5nPSBz dGF0dXMgImF2YWlsLW9ic28iKQogICAgICAoc2V0cSBzdGF0dXMgImF2YWlsYWJsZSBvYnNvbGV0 ZSIpKQogICAgKHdoZW4gaW5jb21wYXRpYmxlLXJlYXNvbgogICAgICAoc2V0cSBzdGF0dXMgImlu Y29tcGF0aWJsZSIpKQogICAgKHByaW5jIChmb3JtYXQgIlBhY2thZ2UgJVMgaXMgJXMuXG5cbiIg bmFtZSBzdGF0dXMpKQoKICAgIDs7IFRPRE86IFJlbW92ZSB0aGUgc3RyaW5nIGRlY29yYXRpb25z IGFuZCByZWZvcm1hdCB0aGUgc3RyaW5ncwogICAgOzsgZm9yIGZ1dHVyZSBsMTBuLgogICAgKHBh Y2thZ2UtLXByaW50LWhlbHAtc2VjdGlvbiAiU3RhdHVzIikKICAgIChjb25kIChidWlsdC1pbgog ICAgICAgICAgIChpbnNlcnQgKHByb3BlcnRpemUgKGNhcGl0YWxpemUgc3RhdHVzKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtbG9jay1mYWNlICdwYWNrYWdlLXN0YXR1cy1i dWlsdC1pbikKICAgICAgICAgICAgICAgICAgICIuIikpCiAgICAgICAgICAocGtnLWRpcgogICAg ICAgICAgIChpbnNlcnQgKHByb3BlcnRpemUgKGlmIChtZW1iZXIgc3RhdHVzICcoInVuc2lnbmVk IiAiZGVwZW5kZW5jeSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnN0 YWxsZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXBpdGFsaXplIHN0YXR1 cykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1sb2NrLWZhY2UgJ3BhY2th Z2Utc3RhdHVzLWJ1aWx0LWluKSkKICAgICAgICAgICAoaW5zZXJ0IChzdWJzdGl0dXRlLWNvbW1h bmQta2V5cyAiIGluIGAiKSkKICAgICAgICAgICAobGV0ICgoZGlyIChhYmJyZXZpYXRlLWZpbGUt bmFtZQogICAgICAgICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5CiAgICAg ICAgICAgICAgICAgICAgICAgIChpZiAoZmlsZS1pbi1kaXJlY3RvcnktcCBwa2ctZGlyIHBhY2th Z2UtdXNlci1kaXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZS1yZWxhdGl2ZS1u YW1lIHBrZy1kaXIgcGFja2FnZS11c2VyLWRpcikKICAgICAgICAgICAgICAgICAgICAgICAgICBw a2ctZGlyKSkpKSkKICAgICAgICAgICAgIChoZWxwLWluc2VydC14cmVmLWJ1dHRvbiBkaXIgJ2hl bHAtcGFja2FnZS1kZWYgcGtnLWRpcikpCiAgICAgICAgICAgKGlmIChhbmQgKHBhY2thZ2UtYnVp bHQtaW4tcCBuYW1lKQogICAgICAgICAgICAgICAgICAgIChub3QgKHBhY2thZ2UtYnVpbHQtaW4t cCBuYW1lIHZlcnNpb24pKSkKICAgICAgICAgICAgICAgKGluc2VydCAoc3Vic3RpdHV0ZS1jb21t YW5kLWtleXMKICAgICAgICAgICAgICAgICAgICAgICAgIicsXG4gICAgICAgICAgICAgc2hhZG93 aW5nIGEgIikKICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAiYnVpbHQtaW4gcGFj a2FnZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1sb2NrLWZhY2Ug J3BhY2thZ2Utc3RhdHVzLWJ1aWx0LWluKSkKICAgICAgICAgICAgIChpbnNlcnQgKHN1YnN0aXR1 dGUtcXVvdGVzICInIikpKQogICAgICAgICAgIChpZiBzaWduZWQKICAgICAgICAgICAgICAgKGlu c2VydCAiLiIpCiAgICAgICAgICAgICAoaW5zZXJ0ICIgKHVuc2lnbmVkKS4iKSkKICAgICAgICAg ICAod2hlbiAoYW5kIChwYWNrYWdlLWRlc2MtcCBkZXNjKQogICAgICAgICAgICAgICAgICAgICAg KG5vdCByZXF1aXJlZC1ieSkKICAgICAgICAgICAgICAgICAgICAgIChtZW1iZXIgc3RhdHVzICco InVuc2lnbmVkIiAiaW5zdGFsbGVkIikpKQogICAgICAgICAgICAgKGluc2VydCAiICIpCiAgICAg ICAgICAgICAocGFja2FnZS1tYWtlLWJ1dHRvbiAiRGVsZXRlIgogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJ2FjdGlvbiAjJ3BhY2thZ2UtZGVsZXRlLWJ1dHRvbi1hY3Rpb24KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlLWRlc2MgZGVzYykpKQogICAg ICAgICAgKGluY29tcGF0aWJsZS1yZWFzb24KICAgICAgICAgICAoaW5zZXJ0IChwcm9wZXJ0aXpl ICJJbmNvbXBhdGlibGUiICdmb250LWxvY2stZmFjZSBmb250LWxvY2std2FybmluZy1mYWNlKQog ICAgICAgICAgICAgICAgICAgIiBiZWNhdXNlIGl0IGRlcGVuZHMgb24gIikKICAgICAgICAgICAo aWYgKHN0cmluZ3AgaW5jb21wYXRpYmxlLXJlYXNvbikKICAgICAgICAgICAgICAgKGluc2VydCAi RW1hY3MgIiBpbmNvbXBhdGlibGUtcmVhc29uICIuIikKICAgICAgICAgICAgIChpbnNlcnQgInVu aW5zdGFsbGFibGUgcGFja2FnZXMuIikpKQogICAgICAgICAgKGluc3RhbGxhYmxlCiAgICAgICAg ICAgKGluc2VydCAoY2FwaXRhbGl6ZSBzdGF0dXMpKQogICAgICAgICAgIChpbnNlcnQgIiBmcm9t ICIgKGZvcm1hdCAiJXMiIGFyY2hpdmUpKQogICAgICAgICAgIChpbnNlcnQgIiAtLSAiKQogICAg ICAgICAgIChwYWNrYWdlLW1ha2UtYnV0dG9uCiAgICAgICAgICAgICJJbnN0YWxsIgogICAgICAg ICAgICAnYWN0aW9uICdwYWNrYWdlLWluc3RhbGwtYnV0dG9uLWFjdGlvbgogICAgICAgICAgICAn cGFja2FnZS1kZXNjIGRlc2MpKQogICAgICAgICAgKHQgKGluc2VydCAoY2FwaXRhbGl6ZSBzdGF0 dXMpICIuIikpKQogICAgKGluc2VydCAiXG4iKQogICAgKHVubGVzcyAoYW5kIHBrZy1kaXIgKG5v dCBhcmNoaXZlKSkgOyBJbnN0YWxsZWQgcGtncyBkb24ndCBoYXZlIGFyY2hpdmUuCiAgICAgIChw YWNrYWdlLS1wcmludC1oZWxwLXNlY3Rpb24gIkFyY2hpdmUiCiAgICAgICAgKG9yIGFyY2hpdmUg Im4vYSIpKSkKICAgIChhbmQgdmVyc2lvbgogICAgICAgICAocGFja2FnZS0tcHJpbnQtaGVscC1z ZWN0aW9uICJWZXJzaW9uIgogICAgICAgICAgIChwYWNrYWdlLXZlcnNpb24tam9pbiB2ZXJzaW9u KSkpCiAgICAod2hlbiBjb21taXQKICAgICAgKHBhY2thZ2UtLXByaW50LWhlbHAtc2VjdGlvbiAi Q29tbWl0IiBjb21taXQpKQogICAgKHdoZW4gZGVzYwogICAgICAocGFja2FnZS0tcHJpbnQtaGVs cC1zZWN0aW9uICJTdW1tYXJ5IgogICAgICAgIChwYWNrYWdlLWRlc2Mtc3VtbWFyeSBkZXNjKSkp CgogICAgKHNldHEgcmVxcyAoaWYgZGVzYyAocGFja2FnZS1kZXNjLXJlcXMgZGVzYykpKQogICAg KHdoZW4gcmVxcwogICAgICAocGFja2FnZS0tcHJpbnQtaGVscC1zZWN0aW9uICJSZXF1aXJlcyIp CiAgICAgIChsZXQgKChmaXJzdCB0KSkKICAgICAgICAoZG9saXN0IChyZXEgcmVxcykKICAgICAg ICAgIChsZXQqICgobmFtZSAoY2FyIHJlcSkpCiAgICAgICAgICAgICAgICAgKHZlcnMgKGNhZHIg cmVxKSkKICAgICAgICAgICAgICAgICAodGV4dCAoZm9ybWF0ICIlcy0lcyIgKHN5bWJvbC1uYW1l IG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS12ZXJzaW9uLWpv aW4gdmVycykpKQogICAgICAgICAgICAgICAgIChyZWFzb24gKGlmIChhbmQgKGxpc3RwIGluY29t cGF0aWJsZS1yZWFzb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNzcSBu YW1lIGluY29tcGF0aWJsZS1yZWFzb24pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIg KG5vdCBhdmFpbGFibGUpIiAiIikpKQogICAgICAgICAgICAoY29uZCAoZmlyc3QgKHNldHEgZmly c3QgbmlsKSkKICAgICAgICAgICAgICAgICAgKCg+PSAoKyAyIChjdXJyZW50LWNvbHVtbikgKGxl bmd0aCB0ZXh0KSAobGVuZ3RoIHJlYXNvbikpCiAgICAgICAgICAgICAgICAgICAgICAgKHdpbmRv dy13aWR0aCkpCiAgICAgICAgICAgICAgICAgICAoaW5zZXJ0ICIsXG4gICAgICAgICAgICAgICAi KSkKICAgICAgICAgICAgICAgICAgKHQgKGluc2VydCAiLCAiKSkpCiAgICAgICAgICAgIChoZWxw LWluc2VydC14cmVmLWJ1dHRvbiB0ZXh0ICdoZWxwLXBhY2thZ2UgbmFtZSkKICAgICAgICAgICAg KGluc2VydCByZWFzb24pKSkKICAgICAgICAoaW5zZXJ0ICJcbiIpKSkKICAgICh3aGVuIHJlcXVp cmVkLWJ5CiAgICAgIChwYWNrYWdlLS1wcmludC1oZWxwLXNlY3Rpb24gIlJlcXVpcmVkIGJ5IikK ICAgICAgKGxldCAoKGZpcnN0IHQpKQogICAgICAgIChkb2xpc3QgKHBrZyByZXF1aXJlZC1ieSkK ICAgICAgICAgIChsZXQgKCh0ZXh0IChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIHBrZykpKQogICAg ICAgICAgICAoY29uZCAoZmlyc3QgKHNldHEgZmlyc3QgbmlsKSkKICAgICAgICAgICAgICAgICAg KCg+PSAoKyAyIChjdXJyZW50LWNvbHVtbikgKGxlbmd0aCB0ZXh0KSkKICAgICAgICAgICAgICAg ICAgICAgICAod2luZG93LXdpZHRoKSkKICAgICAgICAgICAgICAgICAgIChpbnNlcnQgIixcbiAg ICAgICAgICAgICAgICIpKQogICAgICAgICAgICAgICAgICAodCAoaW5zZXJ0ICIsICIpKSkKICAg ICAgICAgICAgKGhlbHAtaW5zZXJ0LXhyZWYtYnV0dG9uIHRleHQgJ2hlbHAtcGFja2FnZQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZykp KSkKICAgICAgICAoaW5zZXJ0ICJcbiIpKSkKICAgICh3aGVuIHdlYnNpdGUKICAgICAgOzsgUHJl ZmVyIGh0dHBzIGZvciB0aGUgd2Vic2l0ZSBvZiBwYWNrYWdlcyBvbiBjb21tb24gZG9tYWlucy4K ICAgICAgKHdoZW4gKHN0cmluZy1tYXRjaC1wIChyeCBib2wgImh0dHA6Ly8iIChvciAiZWxwYS4i ICJ3d3cuIiAiZ2l0LiIgIiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yICJu b25nbnUub3JnIiAiZ251Lm9yZyIgInNyLmh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAiZW1hY3N3aWtpLm9yZyIgImdpdGxhYi5jb20iICJnaXRodWIuY29tIikKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICB3ZWJzaXRlKQogICAgICAgIDs7IEJ1dCBvbmx5IGlmIHRoZSB1c2VyIGhhcyAiaHR0cHMiIGlu IGBwYWNrYWdlLWFyY2hpdmVzJy4KICAgICAgICAobGV0ICgoZ251IChjZHIgKGFzc29jICJnbnUi IHBhY2thZ2UtYXJjaGl2ZXMpKSkpCiAgICAgICAgICAoYW5kIGdudSAoc3RyaW5nLW1hdGNoLXAg Il5odHRwcyIgZ251KQogICAgICAgICAgICAgICAoc2V0cSB3ZWJzaXRlCiAgICAgICAgICAgICAg ICAgICAgIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgIl5odHRwIiAiaHR0cHMiIHdlYnNpdGUp KSkpKQogICAgICAocGFja2FnZS0tcHJpbnQtaGVscC1zZWN0aW9uICJXZWJzaXRlIikKICAgICAg KGhlbHAtaW5zZXJ0LXhyZWYtYnV0dG9uIHdlYnNpdGUgJ2hlbHAtdXJsIHdlYnNpdGUpCiAgICAg IChpbnNlcnQgIlxuIikpCiAgICAod2hlbiBrZXl3b3JkcwogICAgICAocGFja2FnZS0tcHJpbnQt aGVscC1zZWN0aW9uICJLZXl3b3JkcyIpCiAgICAgIChkb2xpc3QgKGsga2V5d29yZHMpCiAgICAg ICAgKHBhY2thZ2UtbWFrZS1idXR0b24KICAgICAgICAgawogICAgICAgICAncGFja2FnZS1rZXl3 b3JkIGsKICAgICAgICAgJ2FjdGlvbiAncGFja2FnZS1rZXl3b3JkLWJ1dHRvbi1hY3Rpb24pCiAg ICAgICAgKGluc2VydCAiICIpKQogICAgICAoaW5zZXJ0ICJcbiIpKQogICAgKHdoZW4gbWFpbnRh aW5lcgogICAgICAocGFja2FnZS0tcHJpbnQtaGVscC1zZWN0aW9uICJNYWludGFpbmVyIikKICAg ICAgKHBhY2thZ2UtLXByaW50LWVtYWlsLWJ1dHRvbiBtYWludGFpbmVyKSkKICAgICh3aGVuIGF1 dGhvcnMKICAgICAgKHBhY2thZ2UtLXByaW50LWhlbHAtc2VjdGlvbgogICAgICAgICAgKGlmICg9 IChsZW5ndGggYXV0aG9ycykgMSkKICAgICAgICAgICAgICAiQXV0aG9yIgogICAgICAgICAgICAi QXV0aG9ycyIpKQogICAgICAocGFja2FnZS0tcHJpbnQtZW1haWwtYnV0dG9uIChwb3AgYXV0aG9y cykpCiAgICAgIDs7IElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBhdXRob3IsIGluZGVudCB0aGUg cmVzdCBjb3JyZWN0bHkuCiAgICAgIChkb2xpc3QgKG5hbWUgYXV0aG9ycykKICAgICAgICAoaW5z ZXJ0IChtYWtlLXN0cmluZyAxMyA/XHMpKQogICAgICAgIChwYWNrYWdlLS1wcmludC1lbWFpbC1i dXR0b24gbmFtZSkpKQogICAgKGxldCogKChhbGwtcGtncyAoYXBwZW5kIChjZHIgKGFzc3EgbmFt ZSBwYWNrYWdlLWFsaXN0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIChhc3Nx IG5hbWUgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRzKSkKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAobGV0ICgoYmkgKGFzc3EgbmFtZSBwYWNrYWdlLS1idWlsdGlucykpKQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGlmIGJpIChsaXN0IChwYWNrYWdlLS1mcm9tLWJ1aWx0aW4g YmkpKSkpKSkKICAgICAgICAgICAob3RoZXItcGtncyAoZGVsZXRlIGRlc2MgYWxsLXBrZ3MpKSkK ICAgICAgKHdoZW4gb3RoZXItcGtncwogICAgICAgIChwYWNrYWdlLS1wcmludC1oZWxwLXNlY3Rp b24gIk90aGVyIHZlcnNpb25zIgogICAgICAgICAgKG1hcGNvbmNhdCAobGFtYmRhIChvcGtnKQog ICAgICAgICAgICAgICAgICAgICAgIChsZXQqICgob3YgKHBhY2thZ2UtZGVzYy12ZXJzaW9uIG9w a2cpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyIChwYWNrYWdlLWRlc2MtZGly IG9wa2cpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSAob3IgKHBhY2thZ2Ut ZGVzYy1hcmNoaXZlIG9wa2cpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoaWYgKHN0cmluZ3AgZGlyKSAiaW5zdGFsbGVkIiBkaXIpKSkpCiAgICAgICAgICAgICAgICAg ICAgICAgICAoaWYgKG5vdCBvdikgKGZvcm1hdCAiJXMiIGZyb20pCiAgICAgICAgICAgICAgICAg ICAgICAgICAgIChmb3JtYXQgIiVzICglcykiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKG1ha2UtdGV4dC1idXR0b24gKHBhY2thZ2UtdmVyc2lvbi1qb2luIG92KSBuaWwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1s b2NrLWZhY2UgJ2xpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAnZm9sbG93LWxpbmsgdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChfYnV0dG9uKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaWJlLXBhY2th Z2Ugb3BrZykpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20pKSkpCiAg ICAgICAgICAgICAgICAgICAgIG90aGVyLXBrZ3MgIiwgIikKICAgICAgICAgICIuIikpKQoKICAg IChpbnNlcnQgIlxuIikKCiAgICAobGV0ICgoc3RhcnQtb2YtZGVzY3JpcHRpb24gKHBvaW50KSkp CiAgICAgIChpZiBidWlsdC1pbgogICAgICAgICAgOzsgRm9yIGJ1aWx0LWluIHBhY2thZ2VzLCBn ZXQgdGhlIGRlc2NyaXB0aW9uIGZyb20gdGhlCiAgICAgICAgICA7OyBDb21tZW50YXJ5IGhlYWRl ci4KICAgICAgICAgIChpbnNlcnQgKG9yIChsbS1jb21tZW50YXJ5IChsb2NhdGUtZmlsZSAoZm9y bWF0ICIlcy5lbCIgbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBsb2FkLXBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBsb2FkLWZpbGUtcmVwLXN1ZmZpeGVzKSkKICAgICAgICAgICAgICAgICAg ICAgICIiKSkKCiAgICAgICAgKGlmIChwYWNrYWdlLWluc3RhbGxlZC1wIGRlc2MpCiAgICAgICAg ICAgIDs7IEZvciBpbnN0YWxsZWQgcGFja2FnZXMsIGdldCB0aGUgZGVzY3JpcHRpb24gZnJvbSB0 aGUKICAgICAgICAgICAgOzsgaW5zdGFsbGVkIGZpbGVzLgogICAgICAgICAgICAoaW5zZXJ0IChw YWNrYWdlLS1nZXQtZGVzY3JpcHRpb24gZGVzYykpCgogICAgICAgICAgOzsgRm9yIG5vbi1idWls dC1pbiwgbm9uLWluc3RhbGxlZCBwYWNrYWdlcywgZ2V0IGRlc2NyaXB0aW9uIGZyb20KICAgICAg ICAgIDs7IHRoZSBhcmNoaXZlLgogICAgICAgICAgKGxldCogKChiYXNlbmFtZSAoZm9ybWF0ICIl cy1yZWFkbWUudHh0IiBuYW1lKSkKICAgICAgICAgICAgICAgICByZWFkbWUtc3RyaW5nKQoKICAg ICAgICAgICAgKHBhY2thZ2UtLXdpdGgtcmVzcG9uc2UtYnVmZmVyIChwYWNrYWdlLWFyY2hpdmUt YmFzZSBkZXNjKQogICAgICAgICAgICAgIDpmaWxlIGJhc2VuYW1lIDpub2Vycm9yIHQKICAgICAg ICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50 LW1heCkpCiAgICAgICAgICAgICAgICAodW5sZXNzIChib2xwKQogICAgICAgICAgICAgICAgICAo aW5zZXJ0ID9cbikpKQogICAgICAgICAgICAgIChjbC1hc3NlcnQgKG5vdCBlbmFibGUtbXVsdGli eXRlLWNoYXJhY3RlcnMpKQogICAgICAgICAgICAgIChzZXRxIHJlYWRtZS1zdHJpbmcKICAgICAg ICAgICAgICAgICAgICA7OyBUaGUgcmVhZG1lLnR4dCBmaWxlcyBhcmUgZGVmaW5lZCB0byBjb250 YWluIHV0Zi04IHRleHQuCiAgICAgICAgICAgICAgICAgICAgKGRlY29kZS1jb2RpbmctcmVnaW9u IChwb2ludC1taW4pIChwb2ludC1tYXgpICd1dGYtOCB0KSkKICAgICAgICAgICAgICB0KQogICAg ICAgICAgICAoaW5zZXJ0IChvciByZWFkbWUtc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAg ICJUaGlzIHBhY2thZ2UgZG9lcyBub3QgcHJvdmlkZSBhIGRlc2NyaXB0aW9uLiIpKSkpKQoKICAg ICAgOzsgSW5zZXJ0IG5ld3MgaWYgYXZhaWxhYmxlLgogICAgICAod2hlbiBuZXdzCiAgICAgICAg KG5ld2xpbmUpCiAgICAgICAgKHdoZW4gKGZib3VuZHAgJ21ha2Utc2VwYXJhdG9yLWxpbmUpCiAg ICAgICAgICAoaW5zZXJ0IChtYWtlLXNlcGFyYXRvci1saW5lKSkKICAgICAgICAgIChuZXdsaW5l KSkKICAgICAgICAoaW5zZXJ0IChwcm9wZXJ0aXplICIqIE5ld3MiICdmYWNlICdwYWNrYWdlLWhl bHAtc2VjdGlvbi1uYW1lKQogICAgICAgICAgICAgICAgIlxuXG4iKQogICAgICAgIChpbnNlcnQt ZmlsZS1jb250ZW50cyBuZXdzKSkKCiAgICAgIDs7IE1ha2UgbGlicmFyeSBkZXNjcmlwdGlvbnMg aW50byBsaW5rcy4KICAgICAgKGdvdG8tY2hhciBzdGFydC1vZi1kZXNjcmlwdGlvbikKICAgICAg KHBhY2thZ2UtLWRlc2NyaWJlLWFkZC1saWJyYXJ5LWxpbmtzKQogICAgICA7OyBNYWtlIFVSTHMg aW4gdGhlIGRlc2NyaXB0aW9uIGludG8gbGlua3MuCiAgICAgIChnb3RvLWNoYXIgc3RhcnQtb2Yt ZGVzY3JpcHRpb24pCiAgICAgIChicm93c2UtdXJsLWFkZC1idXR0b25zKSkpKQoKKGRlZnVuIHBh Y2thZ2UtaW5zdGFsbC1idXR0b24tYWN0aW9uIChidXR0b24pCiAgIlJ1biBgcGFja2FnZS1pbnN0 YWxsJyBvbiB0aGUgcGFja2FnZSBCVVRUT04gcG9pbnRzIHRvLgpVc2VkIGZvciB0aGUgYGFjdGlv bicgcHJvcGVydHkgb2YgYnV0dG9ucyBpbiB0aGUgYnVmZmVyIGNyZWF0ZWQgYnkKYGRlc2NyaWJl LXBhY2thZ2UnLiIKICAobGV0ICgocGtnLWRlc2MgKGJ1dHRvbi1nZXQgYnV0dG9uICdwYWNrYWdl LWRlc2MpKSkKICAgICh3aGVuICh5LW9yLW4tcCAoZm9ybWF0LW1lc3NhZ2UgIkluc3RhbGwgcGFj a2FnZSBgJXMnPyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdl LWRlc2MtZnVsbC1uYW1lIHBrZy1kZXNjKSkpCiAgICAgIChwYWNrYWdlLWluc3RhbGwgcGtnLWRl c2MgbmlsKQogICAgICAoZGVzY3JpYmUtcGFja2FnZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRl c2MpKSkpKQoKKGRlZnVuIHBhY2thZ2UtZGVsZXRlLWJ1dHRvbi1hY3Rpb24gKGJ1dHRvbikKICAi UnVuIGBwYWNrYWdlLWRlbGV0ZScgb24gdGhlIHBhY2thZ2UgQlVUVE9OIHBvaW50cyB0by4KVXNl ZCBmb3IgdGhlIGBhY3Rpb24nIHByb3BlcnR5IG9mIGJ1dHRvbnMgaW4gdGhlIGJ1ZmZlciBjcmVh dGVkIGJ5CmBkZXNjcmliZS1wYWNrYWdlJy4iCiAgKGxldCAoKHBrZy1kZXNjIChidXR0b24tZ2V0 IGJ1dHRvbiAncGFja2FnZS1kZXNjKSkpCiAgICAod2hlbiAoeS1vci1uLXAgKGZvcm1hdC1tZXNz YWdlICJEZWxldGUgcGFja2FnZSBgJXMnPyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIHBrZy1kZXNjKSkpCiAgICAgIChwYWNrYWdl LWRlbGV0ZSBwa2ctZGVzYykKICAgICAgKGRlc2NyaWJlLXBhY2thZ2UgKHBhY2thZ2UtZGVzYy1u YW1lIHBrZy1kZXNjKSkpKSkKCihkZWZ1biBwYWNrYWdlLWtleXdvcmQtYnV0dG9uLWFjdGlvbiAo YnV0dG9uKQogICJTaG93IGZpbHRlcmVkIFwiKlBhY2thZ2VzKlwiIGJ1ZmZlciBmb3IgQlVUVE9O LgpUaGUgYnVmZmVyIGlzIGZpbHRlcmVkIGJ5IHRoZSBgcGFja2FnZS1rZXl3b3JkJyBwcm9wZXJ0 eSBvZiBCVVRUT04uClVzZWQgZm9yIHRoZSBgYWN0aW9uJyBwcm9wZXJ0eSBvZiBidXR0b25zIGlu IHRoZSBidWZmZXIgY3JlYXRlZCBieQpgZGVzY3JpYmUtcGFja2FnZScuIgogIChsZXQgKChwa2ct a2V5d29yZCAoYnV0dG9uLWdldCBidXR0b24gJ3BhY2thZ2Uta2V5d29yZCkpKQogICAgKHBhY2th Z2Utc2hvdy1wYWNrYWdlLWxpc3QgdCAobGlzdCBwa2cta2V5d29yZCkpKSkKCihkZWZ1biBwYWNr YWdlLW1ha2UtYnV0dG9uICh0ZXh0ICZyZXN0IHByb3BlcnRpZXMpCiAgIkluc2VydCBidXR0b24g bGFiZWxlZCBURVhUIHdpdGggYnV0dG9uIFBST1BFUlRJRVMgYXQgcG9pbnQuClBST1BFUlRJRVMg YXJlIHBhc3NlZCB0byBgaW5zZXJ0LXRleHQtYnV0dG9uJywgZm9yIHdoaWNoIHRoaXMKZnVuY3Rp b24gaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIHVzZWQgYnkgYGRlc2NyaWJlLXBhY2thZ2UtMScu IgogIChsZXQgKChidXR0b24tdGV4dCAoaWYgKGRpc3BsYXktZ3JhcGhpYy1wKSB0ZXh0IChjb25j YXQgIlsiIHRleHQgIl0iKSkpCiAgICAgICAgKGJ1dHRvbi1mYWNlIChpZiAoZGlzcGxheS1ncmFw aGljLXApCiAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZ24KICAgICAgICAgICAgICAgICAg ICAgICAgICAgKHJlcXVpcmUgJ2N1cy1lZGl0KSA7IGZvciB0aGUgY3VzdG9tLWJ1dHRvbiBmYWNl CiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXN0b20tYnV0dG9uKQogICAgICAgICAgICAg ICAgICAgICAgICdsaW5rKSkpCiAgICAoYXBwbHkgIydpbnNlcnQtdGV4dC1idXR0b24gYnV0dG9u LXRleHQgJ2ZhY2UgYnV0dG9uLWZhY2UgJ2ZvbGxvdy1saW5rIHQKICAgICAgICAgICBwcm9wZXJ0 aWVzKSkpCgooZGVmdW4gcGFja2FnZS0tZmluZGVyLWdvdG8teHJlZiAoYnV0dG9uKQogICJKdW1w IHRvIGEgTGlzcCBmaWxlIGZvciB0aGUgQlVUVE9OIGF0IHBvaW50LiIKICAobGV0KiAoKGZpbGUg KGJ1dHRvbi1nZXQgYnV0dG9uICd4cmVmKSkKICAgICAgICAgKGxpYiAobG9jYXRlLWxpYnJhcnkg ZmlsZSkpKQogICAgKGlmIGxpYiAoZmluZGVyLWNvbW1lbnRhcnkgbGliKQogICAgICAobWVzc2Fn ZSAiVW5hYmxlIHRvIGxvY2F0ZSBgJXMnIiBmaWxlKSkpKQoKKGRlZmluZS1idXR0b24tdHlwZSAn cGFja2FnZS0tZmluZGVyLXhyZWYgJ2FjdGlvbiAjJ3BhY2thZ2UtLWZpbmRlci1nb3RvLXhyZWYp CgooZGVmdW4gcGFja2FnZS0tcHJpbnQtZW1haWwtYnV0dG9uIChyZWNpcGllbnQpCiAgIkluc2Vy dCBhIGJ1dHRvbiB3aG9zZSBhY3Rpb24gd2lsbCBzZW5kIGFuIGVtYWlsIHRvIFJFQ0lQSUVOVC4K TkFNRSBzaG91bGQgaGF2ZSB0aGUgZm9ybSAoRlVMTE5BTUUgLiBFTUFJTCkgd2hlcmUgRlVMTE5B TUUgaXMKZWl0aGVyIGEgZnVsbCBuYW1lIG9yIG5pbCwgYW5kIEVNQUlMIGlzIGEgdmFsaWQgZW1h aWwgYWRkcmVzcy4iCiAgKHdoZW4gKGNhciByZWNpcGllbnQpCiAgICAoaW5zZXJ0IChjYXIgcmVj aXBpZW50KSkpCiAgKHdoZW4gKGFuZCAoY2FyIHJlY2lwaWVudCkgKGNkciByZWNpcGllbnQpKQog ICAgKGluc2VydCAiICIpKQogICh3aGVuIChjZHIgcmVjaXBpZW50KQogICAgKGluc2VydCAiPCIp CiAgICAoaW5zZXJ0LXRleHQtYnV0dG9uIChjZHIgcmVjaXBpZW50KQogICAgICAgICAgICAgICAg ICAgICAgICAnZm9sbG93LWxpbmsgdAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9uIChs YW1iZGEgKF8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9zZS1tYWls CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiJXMgPCVzPiIgKGNh ciByZWNpcGllbnQpIChjZHIgcmVjaXBpZW50KSkpKSkKICAgIChpbnNlcnQgIj4iKSkKICAoaW5z ZXJ0ICJcbiIpKQoKDAo7Ozs7IFBhY2thZ2UgbWVudSBtb2RlLgoKKGRlZnZhci1rZXltYXAgcGFj a2FnZS1tZW51LW1vZGUtbWFwCiAgOmRvYyAiTG9jYWwga2V5bWFwIGZvciBgcGFja2FnZS1tZW51 LW1vZGUnIGJ1ZmZlcnMuIgogIDpwYXJlbnQgdGFidWxhdGVkLWxpc3QtbW9kZS1tYXAKICAiQy1t IiAgICMncGFja2FnZS1tZW51LWRlc2NyaWJlLXBhY2thZ2UKICAidSIgICAgICMncGFja2FnZS1t ZW51LW1hcmstdW5tYXJrCiAgIkRFTCIgICAjJ3BhY2thZ2UtbWVudS1iYWNrdXAtdW5tYXJrCiAg ImQiICAgICAjJ3BhY2thZ2UtbWVudS1tYXJrLWRlbGV0ZQogICJpIiAgICAgIydwYWNrYWdlLW1l bnUtbWFyay1pbnN0YWxsCiAgIlUiICAgICAjJ3BhY2thZ2UtbWVudS1tYXJrLXVwZ3JhZGVzCiAg InIiICAgICAjJ3JldmVydC1idWZmZXIKICAifiIgICAgICMncGFja2FnZS1tZW51LW1hcmstb2Jz b2xldGUtZm9yLWRlbGV0aW9uCiAgInciICAgICAjJ3BhY2thZ2UtYnJvd3NlLXVybAogICJiIiAg ICAgIydwYWNrYWdlLXJlcG9ydC1idWcKICAieCIgICAgICMncGFja2FnZS1tZW51LWV4ZWN1dGUK ICAiaCIgICAgICMncGFja2FnZS1tZW51LXF1aWNrLWhlbHAKICAiSCIgICAgICMncGFja2FnZS1t ZW51LWhpZGUtcGFja2FnZQogICI/IiAgICAgIydwYWNrYWdlLW1lbnUtZGVzY3JpYmUtcGFja2Fn ZQogICIoIiAgICAgIydwYWNrYWdlLW1lbnUtdG9nZ2xlLWhpZGluZwogICIvIC8iICAgIydwYWNr YWdlLW1lbnUtY2xlYXItZmlsdGVyCiAgIi8gYSIgICAjJ3BhY2thZ2UtbWVudS1maWx0ZXItYnkt YXJjaGl2ZQogICIvIGQiICAgIydwYWNrYWdlLW1lbnUtZmlsdGVyLWJ5LWRlc2NyaXB0aW9uCiAg Ii8gayIgICAjJ3BhY2thZ2UtbWVudS1maWx0ZXItYnkta2V5d29yZAogICIvIE4iICAgIydwYWNr YWdlLW1lbnUtZmlsdGVyLWJ5LW5hbWUtb3ItZGVzY3JpcHRpb24KICAiLyBuIiAgICMncGFja2Fn ZS1tZW51LWZpbHRlci1ieS1uYW1lCiAgIi8gcyIgICAjJ3BhY2thZ2UtbWVudS1maWx0ZXItYnkt c3RhdHVzCiAgIi8gdiIgICAjJ3BhY2thZ2UtbWVudS1maWx0ZXItYnktdmVyc2lvbgogICIvIG0i ICAgIydwYWNrYWdlLW1lbnUtZmlsdGVyLW1hcmtlZAogICIvIHUiICAgIydwYWNrYWdlLW1lbnUt ZmlsdGVyLXVwZ3JhZGFibGUpCgooZWFzeS1tZW51LWRlZmluZSBwYWNrYWdlLW1lbnUtbW9kZS1t ZW51IHBhY2thZ2UtbWVudS1tb2RlLW1hcAogICJNZW51IGZvciBgcGFja2FnZS1tZW51LW1vZGUn LiIKICAnKCJQYWNrYWdlIgogICAgWyJEZXNjcmliZSBQYWNrYWdlIiBwYWNrYWdlLW1lbnUtZGVz Y3JpYmUtcGFja2FnZSA6aGVscCAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHBhY2th Z2UiXQogICAgWyJPcGVuIFBhY2thZ2UgV2Vic2l0ZSIgcGFja2FnZS1icm93c2UtdXJsCiAgICAg OmhlbHAgIk9wZW4gdGhlIHdlYnNpdGUgb2YgdGhpcyBwYWNrYWdlIl0KICAgIFsiSGVscCIgcGFj a2FnZS1tZW51LXF1aWNrLWhlbHAgOmhlbHAgIlNob3cgc2hvcnQga2V5IGJpbmRpbmcgaGVscCBm b3IgcGFja2FnZS1tZW51LW1vZGUiXQogICAgIi0tIgogICAgWyJSZWZyZXNoIFBhY2thZ2UgTGlz dCIgcmV2ZXJ0LWJ1ZmZlcgogICAgIDpoZWxwICJSZWRvd25sb2FkIHRoZSBwYWNrYWdlIGFyY2hp dmUocykiCiAgICAgOmFjdGl2ZSAobm90IHBhY2thZ2UtLWRvd25sb2Fkcy1pbi1wcm9ncmVzcyld CiAgICBbIkV4ZWN1dGUgTWFya2VkIEFjdGlvbnMiIHBhY2thZ2UtbWVudS1leGVjdXRlIDpoZWxw ICJQZXJmb3JtIGFsbCB0aGUgbWFya2VkIGFjdGlvbnMiXQoKICAgICItLSIKICAgIFsiTWFyayBB bGwgQXZhaWxhYmxlIFVwZ3JhZGVzIiBwYWNrYWdlLW1lbnUtbWFyay11cGdyYWRlcwogICAgIDpo ZWxwICJNYXJrIHBhY2thZ2VzIHRoYXQgaGF2ZSBhIG5ld2VyIHZlcnNpb24gZm9yIHVwZ3JhZGlu ZyIKICAgICA6YWN0aXZlIChub3QgcGFja2FnZS0tZG93bmxvYWRzLWluLXByb2dyZXNzKV0KICAg IFsiTWFyayBBbGwgT2Jzb2xldGUgZm9yIERlbGV0aW9uIiBwYWNrYWdlLW1lbnUtbWFyay1vYnNv bGV0ZS1mb3ItZGVsZXRpb24gOmhlbHAgIk1hcmsgYWxsIG9ic29sZXRlIHBhY2thZ2VzIGZvciBk ZWxldGlvbiJdCiAgICBbIk1hcmsgZm9yIEluc3RhbGwiIHBhY2thZ2UtbWVudS1tYXJrLWluc3Rh bGwgOmhlbHAgIk1hcmsgYSBwYWNrYWdlIGZvciBpbnN0YWxsYXRpb24gYW5kIG1vdmUgdG8gdGhl IG5leHQgbGluZSJdCiAgICBbIk1hcmsgZm9yIERlbGV0aW9uIiBwYWNrYWdlLW1lbnUtbWFyay1k ZWxldGUgOmhlbHAgIk1hcmsgYSBwYWNrYWdlIGZvciBkZWxldGlvbiBhbmQgbW92ZSB0byB0aGUg bmV4dCBsaW5lIl0KICAgIFsiVW5tYXJrIiBwYWNrYWdlLW1lbnUtbWFyay11bm1hcmsgOmhlbHAg IkNsZWFyIGFueSBtYXJrcyBvbiBhIHBhY2thZ2UgYW5kIG1vdmUgdG8gdGhlIG5leHQgbGluZSJd CgogICAgIi0tIgogICAgKCJGaWx0ZXIgUGFja2FnZXMiCiAgICAgWyJGaWx0ZXIgYnkgQXJjaGl2 ZSIgcGFja2FnZS1tZW51LWZpbHRlci1ieS1hcmNoaXZlIDpoZWxwICJGaWx0ZXIgcGFja2FnZXMg YnkgYXJjaGl2ZSJdCiAgICAgWyJGaWx0ZXIgYnkgRGVzY3JpcHRpb24iIHBhY2thZ2UtbWVudS1m aWx0ZXItYnktZGVzY3JpcHRpb24gOmhlbHAgIkZpbHRlciBwYWNrYWdlcyBieSBkZXNjcmlwdGlv biJdCiAgICAgWyJGaWx0ZXIgYnkgS2V5d29yZCIgcGFja2FnZS1tZW51LWZpbHRlci1ieS1rZXl3 b3JkIDpoZWxwICJGaWx0ZXIgcGFja2FnZXMgYnkga2V5d29yZCJdCiAgICAgWyJGaWx0ZXIgYnkg TmFtZSIgcGFja2FnZS1tZW51LWZpbHRlci1ieS1uYW1lIDpoZWxwICJGaWx0ZXIgcGFja2FnZXMg YnkgbmFtZSJdCiAgICAgWyJGaWx0ZXIgYnkgTmFtZSBvciBEZXNjcmlwdGlvbiIgcGFja2FnZS1t ZW51LWZpbHRlci1ieS1uYW1lLW9yLWRlc2NyaXB0aW9uCiAgICAgIDpoZWxwICJGaWx0ZXIgcGFj a2FnZXMgYnkgbmFtZSBvciBkZXNjcmlwdGlvbiJdCiAgICAgWyJGaWx0ZXIgYnkgU3RhdHVzIiBw YWNrYWdlLW1lbnUtZmlsdGVyLWJ5LXN0YXR1cyA6aGVscCAiRmlsdGVyIHBhY2thZ2VzIGJ5IHN0 YXR1cyJdCiAgICAgWyJGaWx0ZXIgYnkgVmVyc2lvbiIgcGFja2FnZS1tZW51LWZpbHRlci1ieS12 ZXJzaW9uIDpoZWxwICJGaWx0ZXIgcGFja2FnZXMgYnkgdmVyc2lvbiJdCiAgICAgWyJGaWx0ZXIg TWFya2VkIiBwYWNrYWdlLW1lbnUtZmlsdGVyLW1hcmtlZCA6aGVscCAiRmlsdGVyIHBhY2thZ2Vz IG1hcmtlZCBmb3IgdXBncmFkZSJdCiAgICAgWyJDbGVhciBGaWx0ZXIiIHBhY2thZ2UtbWVudS1j bGVhci1maWx0ZXIgOmhlbHAgIkNsZWFyIHBhY2thZ2UgbGlzdCBmaWx0ZXIiXSkKCiAgICBbIkhp ZGUgYnkgUmVnZXhwIiBwYWNrYWdlLW1lbnUtaGlkZS1wYWNrYWdlIDpoZWxwICJIaWRlIGFsbCBw YWNrYWdlcyBtYXRjaGluZyBhIHJlZ2V4cCJdCiAgICBbIkRpc3BsYXkgT2xkZXIgVmVyc2lvbnMi IHBhY2thZ2UtbWVudS10b2dnbGUtaGlkaW5nCiAgICAgOnN0eWxlIHRvZ2dsZSA6c2VsZWN0ZWQg KG5vdCBwYWNrYWdlLW1lbnUtLWhpZGUtcGFja2FnZXMpCiAgICAgOmhlbHAgIkRpc3BsYXkgcGFj a2FnZSBldmVuIGlmIGEgbmV3ZXIgdmVyc2lvbiBpcyBhbHJlYWR5IGluc3RhbGxlZCJdCgogICAg Ii0tIgogICAgWyJRdWl0IiBxdWl0LXdpbmRvdyA6aGVscCAiUXVpdCBwYWNrYWdlIHNlbGVjdGlv biJdCiAgICBbIkN1c3RvbWl6ZSIgKGN1c3RvbWl6ZS1ncm91cCAncGFja2FnZSldKSkKCihkZWZ2 YXIgcGFja2FnZS1tZW51LS1uZXctcGFja2FnZS1saXN0IG5pbAogICJMaXN0IG9mIG5ld2x5LWF2 YWlsYWJsZSBwYWNrYWdlcyBzaW5jZSBgbGlzdC1wYWNrYWdlcycgd2FzIGxhc3QgY2FsbGVkLiIp CgooZGVmdmFyIHBhY2thZ2UtbWVudS0tdHJhbnNhY3Rpb24tc3RhdHVzIG5pbAogICJNb2RlLWxp bmUgc3RhdHVzIG9mIG9uZ29pbmcgcGFja2FnZSB0cmFuc2FjdGlvbi4iKQoKKGRlZmluZS1kZXJp dmVkLW1vZGUgcGFja2FnZS1tZW51LW1vZGUgdGFidWxhdGVkLWxpc3QtbW9kZSAiUGFja2FnZSBN ZW51IgogICJNYWpvciBtb2RlIGZvciBicm93c2luZyBhIGxpc3Qgb2YgcGFja2FnZXMuClRoZSBt b3N0IHVzZWZ1bCBjb21tYW5kcyBoZXJlIGFyZToKCiAgYHgnOiBJbnN0YWxsIHRoZSBwYWNrYWdl IHVuZGVyIHBvaW50IGlmIGl0IGlzbid0IGFscmVhZHkgaW5zdGFsbGVkLAogICAgICAgYW5kIGRl bGV0ZSBpdCBpZiBpdCdzIGFscmVhZHkgaW5zdGFsbGVkLAogIGBpJzogbWFyayBhIHBhY2thZ2Ug Zm9yIGluc3RhbGxhdGlvbiwgYW5kCiAgYGQnOiBtYXJrIGEgcGFja2FnZSBmb3IgZGVsZXRpb24u ICBVc2UgdGhlIGB4JyBjb21tYW5kIHRvIHBlcmZvcm0gdGhlCiAgICAgICBhY3Rpb25zIG9uIHRo ZSBtYXJrZWQgZmlsZXMuClxcPHBhY2thZ2UtbWVudS1tb2RlLW1hcD4KXFx7cGFja2FnZS1tZW51 LW1vZGUtbWFwfSIKICA6aW50ZXJhY3RpdmUgbmlsCiAgKHNldHEgbW9kZS1saW5lLXByb2Nlc3Mg JygocGFja2FnZS0tZG93bmxvYWRzLWluLXByb2dyZXNzICI6TG9hZGluZyIpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAocGFja2FnZS1tZW51LS10cmFuc2FjdGlvbi1zdGF0dXMKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLW1lbnUtLXRyYW5zYWN0aW9uLXN0YXR1cykp KQogIChzZXRxIHRhYnVsYXRlZC1saXN0LWZvcm1hdAogICAgICAgIGBbKCJQYWNrYWdlIiAscGFj a2FnZS1uYW1lLWNvbHVtbi13aWR0aCBwYWNrYWdlLW1lbnUtLW5hbWUtcHJlZGljYXRlKQogICAg ICAgICAgKCJWZXJzaW9uIiAscGFja2FnZS12ZXJzaW9uLWNvbHVtbi13aWR0aCBwYWNrYWdlLW1l bnUtLXZlcnNpb24tcHJlZGljYXRlKQogICAgICAgICAgKCJTdGF0dXMiICAscGFja2FnZS1zdGF0 dXMtY29sdW1uLXdpZHRoICBwYWNrYWdlLW1lbnUtLXN0YXR1cy1wcmVkaWNhdGUpCiAgICAgICAg ICAoIkFyY2hpdmUiICxwYWNrYWdlLWFyY2hpdmUtY29sdW1uLXdpZHRoIHBhY2thZ2UtbWVudS0t YXJjaGl2ZS1wcmVkaWNhdGUpCiAgICAgICAgICAoIkRlc2NyaXB0aW9uIiAwIHBhY2thZ2UtbWVu dS0tZGVzY3JpcHRpb24tcHJlZGljYXRlKV0pCiAgKHNldHEgdGFidWxhdGVkLWxpc3QtcGFkZGlu ZyAyKQogIChzZXRxIHRhYnVsYXRlZC1saXN0LXNvcnQta2V5IChjb25zICJTdGF0dXMiIG5pbCkp CiAgKGFkZC1ob29rICd0YWJ1bGF0ZWQtbGlzdC1yZXZlcnQtaG9vayAjJ3BhY2thZ2UtbWVudS0t cmVmcmVzaCBuaWwgdCkKICAodGFidWxhdGVkLWxpc3QtaW5pdC1oZWFkZXIpCiAgKHNldHEgcmV2 ZXJ0LWJ1ZmZlci1mdW5jdGlvbiAncGFja2FnZS1tZW51LS1yZWZyZXNoLWNvbnRlbnRzKQogIChz ZXRmIGltZW51LXByZXYtaW5kZXgtcG9zaXRpb24tZnVuY3Rpb24KICAgICAgICAjJ3BhY2thZ2Ut LWltZW51LXByZXYtaW5kZXgtcG9zaXRpb24tZnVuY3Rpb24pCiAgKHNldGYgaW1lbnUtZXh0cmFj dC1pbmRleC1uYW1lLWZ1bmN0aW9uCiAgICAgICAgIydwYWNrYWdlLS1pbWVudS1leHRyYWN0LWlu ZGV4LW5hbWUtZnVuY3Rpb24pKQoKKGRlZm1hY3JvIHBhY2thZ2UtLXB1c2ggKHBrZy1kZXNjIHN0 YXR1cyBsaXN0bmFtZSkKICAiQ29udmVuaWVuY2UgbWFjcm8gZm9yIGBwYWNrYWdlLW1lbnUtLWdl bmVyYXRlJy4KSWYgdGhlIGFsaXN0IHN0b3JlZCBpbiB0aGUgc3ltYm9sIExJU1ROQU1FIGxhY2tz IGFuIGVudHJ5IGZvciBhCnBhY2thZ2UgUEtHLURFU0MsIGFkZCBvbmUuICBUaGUgYWxpc3QgaXMg a2V5ZWQgd2l0aCBQS0ctREVTQy4iCiAgKGRlY2xhcmUgKG9ic29sZXRlIG5pbCAiMjcuMSIpKQog IGAodW5sZXNzIChhc3NvYyAscGtnLWRlc2MgLGxpc3RuYW1lKQogICAgIDs7IEZJWE1FOiBTaG91 bGQgd2UgbW92ZSBzdGF0dXMgaW50byBwa2ctZGVzYz8KICAgICAocHVzaCAoY29ucyAscGtnLWRl c2MgLHN0YXR1cykgLGxpc3RuYW1lKSkpCgooZGVmdmFyIHBhY2thZ2UtbGlzdC11bnZlcnNpb25l ZCBuaWwKICAiSWYgbm9uLW5pbCwgaW5jbHVkZSBwYWNrYWdlcyB0aGF0IGRvbid0IGhhdmUgYSB2 ZXJzaW9uIGluIGBsaXN0LXBhY2thZ2VzJy4iKQoKKGRlZnZhciBwYWNrYWdlLWxpc3QtdW5zaWdu ZWQgbmlsCiAgIklmIG5vbi1uaWwsIG1lbnRpb24gaW4gdGhlIGxpc3Qgd2hpY2ggcGFja2FnZXMg d2VyZSBpbnN0YWxsZWQgd2l0aG91dCBzaWduYXR1cmUuIikKCihkZWZ2YXIgcGFja2FnZS0tZW1h Y3MtdmVyc2lvbi1saXN0ICh2ZXJzaW9uLXRvLWxpc3QgZW1hY3MtdmVyc2lvbikKICAiVGhlIHZh bHVlIG9mIHZhcmlhYmxlIGBlbWFjcy12ZXJzaW9uJyBhcyBhIGxpc3QuIikKCihkZWZ1biBwYWNr YWdlLS1lbnN1cmUtcGFja2FnZS1tZW51LW1vZGUgKCkKICAiU2lnbmFsIGEgdXNlci1lcnJvciBp ZiBtYWpvciBtb2RlIGlzIG5vdCBgcGFja2FnZS1tZW51LW1vZGUnLiIKICAodW5sZXNzIChkZXJp dmVkLW1vZGUtcCAncGFja2FnZS1tZW51LW1vZGUpCiAgICAodXNlci1lcnJvciAiVGhlIGN1cnJl bnQgYnVmZmVyIGlzIG5vdCBhIFBhY2thZ2UgTWVudSIpKSkKCihkZWZ1biBwYWNrYWdlLS1pbmNv bXBhdGlibGUtcCAocGtnICZvcHRpb25hbCBzaGFsbG93KQogICJSZXR1cm4gbm9uLW5pbCBpZiBQ S0cgaGFzIG5vIGNoYW5jZSBvZiBiZWluZyBpbnN0YWxsYWJsZS4KUEtHIGlzIGEgYHBhY2thZ2Ut ZGVzYycgb2JqZWN0LgoKSWYgU0hBTExPVyBpcyBub24tbmlsLCB0aGlzIG9ubHkgY2hlY2tzIGlm IFBLRyBkZXBlbmRzIG9uIGEKaGlnaGVyIGBlbWFjcy12ZXJzaW9uJyB0aGFuIHRoZSBvbmUgYmVp bmcgdXNlZC4gIE90aGVyd2lzZSwgYWxzbwpjaGVja3MgdGhlIHZpYWJpbGl0eSBvZiBkZXBlbmRl bmNpZXMsIGFjY29yZGluZyB0bwpgcGFja2FnZS0tY29tcGF0aWJpbGl0eS10YWJsZScuCgpJZiBQ S0cgcmVxdWlyZXMgYW4gaW5jb21wYXRpYmxlIEVtYWNzIHZlcnNpb24sIHRoZSByZXR1cm4gdmFs dWUKaXMgdGhpcyB2ZXJzaW9uIChhcyBhIHN0cmluZykuCklmIFBLRyByZXF1aXJlcyBpbmNvbXBh dGlibGUgcGFja2FnZXMsIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBsaXN0Cm9mIHRoZXNlIGRlcGVu ZGVuY2llcywgc2ltaWxhciB0byB0aGUgbGlzdCByZXR1cm5lZCBieQpgcGFja2FnZS1kZXNjLXJl cXMnLiIKICAobGV0KiAoKHJlcXMgICAgKHBhY2thZ2UtZGVzYy1yZXFzIHBrZykpCiAgICAgICAg ICh2ZXJzaW9uIChjYWRyIChhc3NxICdlbWFjcyByZXFzKSkpKQogICAgKGlmIChhbmQgdmVyc2lv biAodmVyc2lvbi1saXN0LTwgcGFja2FnZS0tZW1hY3MtdmVyc2lvbi1saXN0IHZlcnNpb24pKQog ICAgICAgIChwYWNrYWdlLXZlcnNpb24tam9pbiB2ZXJzaW9uKQogICAgICAodW5sZXNzIHNoYWxs b3cKICAgICAgICAobGV0IChvdXQpCiAgICAgICAgICAoZG9saXN0IChkZXAgKHBhY2thZ2UtZGVz Yy1yZXFzIHBrZykgb3V0KQogICAgICAgICAgICAobGV0ICgoZGVwLW5hbWUgKGNhciBkZXApKSkK ICAgICAgICAgICAgICAodW5sZXNzIChlcSAnZW1hY3MgZGVwLW5hbWUpCiAgICAgICAgICAgICAg ICAobGV0ICgoY3YgKGdldGhhc2ggZGVwLW5hbWUgcGFja2FnZS0tY29tcGF0aWJpbGl0eS10YWJs ZSkpKQogICAgICAgICAgICAgICAgICAod2hlbiAodmVyc2lvbi1saXN0LTwgKG9yIGN2ICcoMCkp IChvciAoY2FkciBkZXApICcoMCkpKQogICAgICAgICAgICAgICAgICAgIChwdXNoIGRlcCBvdXQp KSkpKSkpKSkpKQoKKGRlZnVuIHBhY2thZ2UtZGVzYy1zdGF0dXMgKHBrZy1kZXNjKQogICJSZXR1 cm4gdGhlIHN0YXR1cyBvZiBgcGFja2FnZS1kZXNjJyBvYmplY3QgUEtHLURFU0MuIgogIChsZXQq ICgobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAgICAoZGlyIChwYWNr YWdlLWRlc2MtZGlyIHBrZy1kZXNjKSkKICAgICAgICAgKGxsZSAoYXNzcSBuYW1lIHBhY2thZ2Ut bG9hZC1saXN0KSkKICAgICAgICAgKGhlbGQgKGNhZHIgbGxlKSkKICAgICAgICAgKHZlcnNpb24g KHBhY2thZ2UtZGVzYy12ZXJzaW9uIHBrZy1kZXNjKSkKICAgICAgICAgKHNpZ25lZCAob3IgKG5v dCBwYWNrYWdlLWxpc3QtdW5zaWduZWQpCiAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRl c2Mtc2lnbmVkIHBrZy1kZXNjKSkpKQogICAgKGNvbmQKICAgICAoKHBhY2thZ2UtdmMtcCBwa2ct ZGVzYykgInNvdXJjZSIpCiAgICAgKChlcSBkaXIgJ2J1aWx0aW4pICJidWlsdC1pbiIpCiAgICAg KChhbmQgbGxlIChudWxsIGhlbGQpKSAiZGlzYWJsZWQiKQogICAgICgoc3RyaW5ncCBoZWxkKQog ICAgICAobGV0ICgoaHYgKGlmIChzdHJpbmdwIGhlbGQpICh2ZXJzaW9uLXRvLWxpc3QgaGVsZCkp KSkKICAgICAgICAoY29uZAogICAgICAgICAoKHZlcnNpb24tbGlzdC09IHZlcnNpb24gaHYpICJo ZWxkIikKICAgICAgICAgKCh2ZXJzaW9uLWxpc3QtPCB2ZXJzaW9uIGh2KSAib2Jzb2xldGUiKQog ICAgICAgICAodCAiZGlzYWJsZWQiKSkpKQogICAgIChkaXIgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgO09uZSBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzLgogICAgICAoY29uZAogICAg ICAgKChub3QgKGZpbGUtZXhpc3RzLXAgZGlyKSkgImRlbGV0ZWQiKQogICAgICAgOzsgTm90IGlu c2lkZSBgcGFja2FnZS11c2VyLWRpcicuCiAgICAgICAoKG5vdCAoZmlsZS1pbi1kaXJlY3Rvcnkt cCBkaXIgcGFja2FnZS11c2VyLWRpcikpICJleHRlcm5hbCIpCiAgICAgICAoKGVxIHBrZy1kZXNj IChjYWRyIChhc3NxIG5hbWUgcGFja2FnZS1hbGlzdCkpKQogICAgICAgIChpZiAobm90IHNpZ25l ZCkgInVuc2lnbmVkIgogICAgICAgICAgKGlmIChwYWNrYWdlLS11c2VyLXNlbGVjdGVkLXAgbmFt ZSkKICAgICAgICAgICAgICAiaW5zdGFsbGVkIiAiZGVwZW5kZW5jeSIpKSkKICAgICAgICh0ICJv YnNvbGV0ZSIpKSkKICAgICAoKHBhY2thZ2UtLWluY29tcGF0aWJsZS1wIHBrZy1kZXNjKSAiaW5j b21wYXQiKQogICAgICh0CiAgICAgIChsZXQqICgoaW5zIChjYWRyIChhc3NxIG5hbWUgcGFja2Fn ZS1hbGlzdCkpKQogICAgICAgICAgICAgKGlucy12IChpZiBpbnMgKHBhY2thZ2UtZGVzYy12ZXJz aW9uIGlucykpKSkKICAgICAgICAoY29uZAogICAgICAgICA7OyBJbnN0YWxsZWQgb2Jzb2xldGUg cGFja2FnZXMgYXJlIGhhbmRsZWQgaW4gdGhlIGBkaXInCiAgICAgICAgIDs7IGNsYXVzZSBhYm92 ZS4gIEhlcmUgd2UgaGFuZGxlIGF2YWlsYWJsZSBvYnNvbGV0ZSwgd2hpY2gKICAgICAgICAgOzsg YXJlIGRpc3BsYXllZCBkZXBlbmRpbmcgb24gYHBhY2thZ2UtbWVudS0taGlkZS1wYWNrYWdlcycu CiAgICAgICAgICgoYW5kIGlucyAodmVyc2lvbi1saXN0LTw9IHZlcnNpb24gaW5zLXYpKSAiYXZh aWwtb2JzbyIpCiAgICAgICAgICh0CiAgICAgICAgICAoaWYgKG1lbXEgbmFtZSBwYWNrYWdlLW1l bnUtLW5ldy1wYWNrYWdlLWxpc3QpCiAgICAgICAgICAgICAgIm5ldyIgImF2YWlsYWJsZSIpKSkp KSkpKQoKKGRlZnZhciBwYWNrYWdlLW1lbnUtLWhpZGUtcGFja2FnZXMgdAogICJXaGV0aGVyIGF2 YWlsYWJsZSBvYnNvbGV0ZSBwYWNrYWdlcyBzaG91bGQgYmUgaGlkZGVuLgpDYW4gYmUgdG9nZ2xl ZCB3aXRoIFxcPHBhY2thZ2UtbWVudS1tb2RlLW1hcD4gXFxbcGFja2FnZS1tZW51LXRvZ2dsZS1o aWRpbmddLgpJbnN0YWxsZWQgb2Jzb2xldGUgcGFja2FnZXMgYXJlIGFsd2F5cyBkaXNwbGF5ZWQu IikKCihkZWZ1biBwYWNrYWdlLW1lbnUtdG9nZ2xlLWhpZGluZyAoKQogICJJbiBQYWNrYWdlIE1l bnUsIHRvZ2dsZSB2aXNpYmlsaXR5IG9mIG9ic29sZXRlIGF2YWlsYWJsZSBwYWNrYWdlcy4KCkFs c28gaGlkZSBwYWNrYWdlcyB3aG9zZSBuYW1lIG1hdGNoZXMgYSByZWdleHAgaW4gdXNlciBvcHRp b24KYHBhY2thZ2UtaGlkZGVuLXJlZ2V4cHMnIChhIGxpc3QpLiAgVG8gYWRkIHJlZ2V4cHMgdG8g dGhpcyBsaXN0LAp1c2UgYHBhY2thZ2UtbWVudS1oaWRlLXBhY2thZ2UnLiIKICAoaW50ZXJhY3Rp dmUgbmlsIHBhY2thZ2UtbWVudS1tb2RlKQogIChwYWNrYWdlLS1lbnN1cmUtcGFja2FnZS1tZW51 LW1vZGUpCiAgKHNldHEgcGFja2FnZS1tZW51LS1oaWRlLXBhY2thZ2VzCiAgICAgICAgKG5vdCBw YWNrYWdlLW1lbnUtLWhpZGUtcGFja2FnZXMpKQogIChpZiBwYWNrYWdlLW1lbnUtLWhpZGUtcGFj a2FnZXMKICAgICAgKG1lc3NhZ2UgIkhpZGluZyBvYnNvbGV0ZSBvciB1bndhbnRlZCBwYWNrYWdl cyIpCiAgICAobWVzc2FnZSAiRGlzcGxheWluZyBhbGwgcGFja2FnZXMiKSkKICAocmV2ZXJ0LWJ1 ZmZlciBuaWwgJ25vLWNvbmZpcm0pKQoKKGRlZnVuIHBhY2thZ2UtLXJlbW92ZS1oaWRkZW4gKHBr Zy1saXN0KQogICJGaWx0ZXIgUEtHLUxJU1QgYWNjb3JkaW5nIHRvIGBwYWNrYWdlLWFyY2hpdmUt cHJpb3JpdGllcycuClBLRy1MSVNUIG11c3QgYmUgYSBsaXN0IG9mIGBwYWNrYWdlLWRlc2MnIG9i amVjdHMsIGFsbCB3aXRoIHRoZQpzYW1lIG5hbWUsIHNvcnRlZCBieSBkZWNyZWFzaW5nIGBwYWNr YWdlLWRlc2MtcHJpb3JpdHktdmVyc2lvbicuClJldHVybiBhIGxpc3Qgb2YgcGFja2FnZXMgdGll ZCBmb3IgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYWNjb3JkaW5nCnRvIHRoZWlyIGFyY2hpdmVzLiIK ICAod2hlbiBwa2ctbGlzdAogICAgOzsgVmFyaWFibGUgdG9nZ2xlZCB3aXRoIGBwYWNrYWdlLW1l bnUtdG9nZ2xlLWhpZGluZycuCiAgICAoaWYgKG5vdCBwYWNrYWdlLW1lbnUtLWhpZGUtcGFja2Fn ZXMpCiAgICAgICAgcGtnLWxpc3QKICAgICAgKGxldCAoKGluc3RhbGxlZCAoY2FkciAoYXNzcSAo cGFja2FnZS1kZXNjLW5hbWUgKGNhciBwa2ctbGlzdCkpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcGFja2FnZS1hbGlzdCkpKSkKICAgICAgICAod2hlbiBpbnN0YWxsZWQKICAg ICAgICAgIChzZXRxIHBrZy1saXN0CiAgICAgICAgICAgICAgICAobGV0ICgoaW5zLXZlcnNpb24g KHBhY2thZ2UtZGVzYy12ZXJzaW9uIGluc3RhbGxlZCkpKQogICAgICAgICAgICAgICAgICAoY2wt cmVtb3ZlLWlmIChsYW1iZGEgKHApICh2ZXJzaW9uLWxpc3QtPCAocGFja2FnZS1kZXNjLXZlcnNp b24gcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGlucy12ZXJzaW9uKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2ctbGlz dCkpKSkKICAgICAgICAobGV0ICgoZmlsdGVyZWQtYnktcHJpb3JpdHkKICAgICAgICAgICAgICAg KGNvbmQKICAgICAgICAgICAgICAgICgobm90IHBhY2thZ2UtbWVudS1oaWRlLWxvdy1wcmlvcml0 eSkKICAgICAgICAgICAgICAgICBwa2ctbGlzdCkKICAgICAgICAgICAgICAgICgoZXEgcGFja2Fn ZS1tZW51LWhpZGUtbG93LXByaW9yaXR5ICdhcmNoaXZlKQogICAgICAgICAgICAgICAgIChsZXQg KG1heC1wcmlvcml0eSBvdXQpCiAgICAgICAgICAgICAgICAgICAod2hpbGUgcGtnLWxpc3QKICAg ICAgICAgICAgICAgICAgICAgKGxldCAoKHAgKHBvcCBwa2ctbGlzdCkpKQogICAgICAgICAgICAg ICAgICAgICAgIChsZXQgKChwcmlvcml0eSAocGFja2FnZS1kZXNjLXByaW9yaXR5IHApKSkKICAg ICAgICAgICAgICAgICAgICAgICAgIChpZiAoYW5kIG1heC1wcmlvcml0eSAoPCBwcmlvcml0eSBt YXgtcHJpb3JpdHkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIHBrZy1saXN0 IG5pbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1c2ggcCBvdXQpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgIChzZXRxIG1heC1wcmlvcml0eSBwcmlvcml0eSkpKSkpCiAgICAgICAg ICAgICAgICAgICAobnJldmVyc2Ugb3V0KSkpCiAgICAgICAgICAgICAgICAocGtnLWxpc3QKICAg ICAgICAgICAgICAgICAobGlzdCAoY2FyIHBrZy1saXN0KSkpKSkpCiAgICAgICAgICAoaWYgKG5v dCBpbnN0YWxsZWQpCiAgICAgICAgICAgICAgZmlsdGVyZWQtYnktcHJpb3JpdHkKICAgICAgICAg ICAgKGxldCAoKGlucy12ZXJzaW9uIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBpbnN0YWxsZWQpKSkK ICAgICAgICAgICAgICAoY2wtcmVtb3ZlLWlmIChsYW1iZGEgKHApIChvciAodmVyc2lvbi1saXN0 LT0gKHBhY2thZ2UtZGVzYy12ZXJzaW9uIHApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucy12ZXJzaW9uKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLXZjLXAgaW5zdGFsbGVkKSkp CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC1ieS1wcmlvcml0eSkpKSkpKSkp CgooZGVmY3VzdG9tIHBhY2thZ2UtaGlkZGVuLXJlZ2V4cHMgbmlsCiAgIkxpc3Qgb2YgcmVnZXhw cyBtYXRjaGluZyB0aGUgbmFtZSBvZiBwYWNrYWdlcyB0byBoaWRlLgpJZiB0aGUgbmFtZSBvZiBh IHBhY2thZ2UgbWF0Y2hlcyBhbnkgb2YgdGhlc2UgcmVnZXhwcyBpdCBpcwpvbWl0dGVkIGZyb20g dGhlIHBhY2thZ2UgbWVudS4gIFRvIHRvZ2dsZSB0aGlzLCB0eXBlIFxcW3BhY2thZ2UtbWVudS10 b2dnbGUtaGlkaW5nXS4KClZhbHVlcyBjYW4gYmUgaW50ZXJhY3RpdmVseSBhZGRlZCB0byB0aGlz IGxpc3QgYnkgdHlwaW5nClxcW3BhY2thZ2UtbWVudS1oaWRlLXBhY2thZ2VdIG9uIGEgcGFja2Fn ZS4iCiAgOnZlcnNpb24gIjI1LjEiCiAgOnR5cGUgJyhyZXBlYXQgKHJlZ2V4cCA6dGFnICJIaWRl IHBhY2thZ2VzIHdpdGggbmFtZSBtYXRjaGluZyIpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtLXJl ZnJlc2ggKCZvcHRpb25hbCBwYWNrYWdlcyBrZXl3b3JkcykKICAiUmUtcG9wdWxhdGUgdGhlIGB0 YWJ1bGF0ZWQtbGlzdC1lbnRyaWVzJy4KUEFDS0FHRVMgc2hvdWxkIGJlIG5pbCBvciB0LCB3aGlj aCBtZWFucyB0byBkaXNwbGF5IGFsbCBrbm93biBwYWNrYWdlcy4KS0VZV09SRFMgc2hvdWxkIGJl IG5pbCBvciBhIGxpc3Qgb2Yga2V5d29yZHMuIgogIDs7IENvbnN0cnVjdCBsaXN0IG9mIChQS0ct REVTQyAuIFNUQVRVUykuCiAgKHVubGVzcyBwYWNrYWdlcyAoc2V0cSBwYWNrYWdlcyB0KSkKICAo bGV0ICgoaGlkZGVuLW5hbWVzIChtYXBjb25jYXQgIydpZGVudGl0eSBwYWNrYWdlLWhpZGRlbi1y ZWdleHBzICJcXHwiKSkKICAgICAgICBpbmZvLWxpc3QpCiAgICA7OyBJbnN0YWxsZWQgcGFja2Fn ZXM6CiAgICAoZG9saXN0IChlbHQgcGFja2FnZS1hbGlzdCkKICAgICAgKGxldCAoKG5hbWUgKGNh ciBlbHQpKSkKICAgICAgICAod2hlbiAob3IgKGVxIHBhY2thZ2VzIHQpIChtZW1xIG5hbWUgcGFj a2FnZXMpKQogICAgICAgICAgKGRvbGlzdCAocGtnIChjZHIgZWx0KSkKICAgICAgICAgICAgKHdo ZW4gKHBhY2thZ2UtLWhhcy1rZXl3b3JkLXAgcGtnIGtleXdvcmRzKQogICAgICAgICAgICAgIChw dXNoIHBrZyBpbmZvLWxpc3QpKSkpKSkKCiAgICA7OyBCdWlsdC1pbiBwYWNrYWdlczoKICAgIChk b2xpc3QgKGVsdCBwYWNrYWdlLS1idWlsdGlucykKICAgICAgKGxldCAoKHBrZyAgKHBhY2thZ2Ut LWZyb20tYnVpbHRpbiBlbHQpKQogICAgICAgICAgICAobmFtZSAoY2FyIGVsdCkpKQogICAgICAg ICh3aGVuIChub3QgKGVxIG5hbWUgJ2VtYWNzKSkgOyBIaWRlIHRoZSBgZW1hY3MnIHBhY2thZ2Uu CiAgICAgICAgICAod2hlbiAoYW5kIChwYWNrYWdlLS1oYXMta2V5d29yZC1wIHBrZyBrZXl3b3Jk cykKICAgICAgICAgICAgICAgICAgICAgKG9yIHBhY2thZ2UtbGlzdC11bnZlcnNpb25lZAogICAg ICAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtLWJpLWRlc2MtdmVyc2lvbiAoY2RyIGVsdCkp KQogICAgICAgICAgICAgICAgICAgICAob3IgKGVxIHBhY2thZ2VzIHQpIChtZW1xIG5hbWUgcGFj a2FnZXMpKSkKICAgICAgICAgICAgKHB1c2ggcGtnIGluZm8tbGlzdCkpKSkpCgogICAgOzsgQXZh aWxhYmxlIGFuZCBkaXNhYmxlZCBwYWNrYWdlczoKICAgICh1bmxlc3MgKGVxdWFsIHBhY2thZ2Ut LW9sZC1hcmNoaXZlLXByaW9yaXRpZXMgcGFja2FnZS1hcmNoaXZlLXByaW9yaXRpZXMpCiAgICAg IChwYWNrYWdlLXJlYWQtYWxsLWFyY2hpdmUtY29udGVudHMpKQogICAgKGRvbGlzdCAoZWx0IHBh Y2thZ2UtYXJjaGl2ZS1jb250ZW50cykKICAgICAgKGxldCAoKG5hbWUgKGNhciBlbHQpKSkKICAg ICAgICA7OyBUbyBiZSBkaXNwbGF5ZWQgaXQgbXVzdCBiZSBpbiBQQUNLQUdFUzsKICAgICAgICAo d2hlbiAoYW5kIChvciAoZXEgcGFja2FnZXMgdCkgKG1lbXEgbmFtZSBwYWNrYWdlcykpCiAgICAg ICAgICAgICAgICAgICA7OyBhbmQgd2UgbXVzdCBlaXRoZXIgbm90IGJlIGhpZGluZyBhbnl0aGlu ZywKICAgICAgICAgICAgICAgICAgIChvciAobm90IHBhY2thZ2UtbWVudS0taGlkZS1wYWNrYWdl cykKICAgICAgICAgICAgICAgICAgICAgICAobm90IHBhY2thZ2UtaGlkZGVuLXJlZ2V4cHMpCiAg ICAgICAgICAgICAgICAgICAgICAgOzsgb3IganVzdCBub3QgaGlkaW5nIHRoaXMgc3BlY2lmaWMg cGFja2FnZS4KICAgICAgICAgICAgICAgICAgICAgICAobm90IChzdHJpbmctbWF0Y2ggaGlkZGVu LW5hbWVzIChzeW1ib2wtbmFtZSBuYW1lKSkpKSkKICAgICAgICAgIDs7IEhpZGUgYXZhaWxhYmxl LW9ic29sZXRlIG9yIGxvdy1wcmlvcml0eSBwYWNrYWdlcy4KICAgICAgICAgIChkb2xpc3QgKHBr ZyAocGFja2FnZS0tcmVtb3ZlLWhpZGRlbiAoY2RyIGVsdCkpKQogICAgICAgICAgICAod2hlbiAo cGFja2FnZS0taGFzLWtleXdvcmQtcCBwa2cga2V5d29yZHMpCiAgICAgICAgICAgICAgKHB1c2gg cGtnIGluZm8tbGlzdCkpKSkpKQoKICAgIDs7IFByaW50IHRoZSByZXN1bHQuCiAgICAodGFidWxh dGVkLWxpc3QtaW5pdC1oZWFkZXIpCiAgICAoc2V0cSB0YWJ1bGF0ZWQtbGlzdC1lbnRyaWVzCiAg ICAgICAgICAobWFwY2FyICMncGFja2FnZS1tZW51LS1wcmludC1pbmZvLXNpbXBsZSBpbmZvLWxp c3QpKSkpCgooZGVmdW4gcGFja2FnZS1hbGwta2V5d29yZHMgKCkKICAiQ29sbGVjdCBhbGwgcGFj a2FnZSBrZXl3b3Jkcy4iCiAgKGxldCAoKGtleS1saXN0KSkKICAgIChwYWNrYWdlLS1tYXBjIChs YW1iZGEgKGRlc2MpCiAgICAgICAgICAgICAgICAgICAgIChzZXRxIGtleS1saXN0IChhcHBlbmQg KHBhY2thZ2UtZGVzYy0ta2V5d29yZHMgZGVzYykKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBrZXktbGlzdCkpKSkKICAgIGtleS1saXN0KSkKCihkZWZ1biBwYWNr YWdlLS1tYXBjIChmdW5jdGlvbiAmb3B0aW9uYWwgcGFja2FnZXMpCiAgIkNhbGwgRlVOQ1RJT04g Zm9yIGFsbCBrbm93biBQQUNLQUdFUy4KUEFDS0FHRVMgY2FuIGJlIG5pbCBvciB0LCB3aGljaCBt ZWFucyB0byBkaXNwbGF5IGFsbCBrbm93bgpwYWNrYWdlcywgb3IgYSBsaXN0IG9mIHBhY2thZ2Vz LgoKQnVpbHQtaW4gcGFja2FnZXMgYXJlIGNvbnZlcnRlZCB3aXRoIGBwYWNrYWdlLS1mcm9tLWJ1 aWx0aW4nLiIKICAodW5sZXNzIHBhY2thZ2VzIChzZXRxIHBhY2thZ2VzIHQpKQogIChsZXQgKG5h bWUpCiAgICA7OyBJbnN0YWxsZWQgcGFja2FnZXM6CiAgICAoZG9saXN0IChlbHQgcGFja2FnZS1h bGlzdCkKICAgICAgKHNldHEgbmFtZSAoY2FyIGVsdCkpCiAgICAgICh3aGVuIChvciAoZXEgcGFj a2FnZXMgdCkgKG1lbXEgbmFtZSBwYWNrYWdlcykpCiAgICAgICAgKG1hcGMgZnVuY3Rpb24gKGNk ciBlbHQpKSkpCgogICAgOzsgQnVpbHQtaW4gcGFja2FnZXM6CiAgICAoZG9saXN0IChlbHQgcGFj a2FnZS0tYnVpbHRpbnMpCiAgICAgIChzZXRxIG5hbWUgKGNhciBlbHQpKQogICAgICAod2hlbiAo YW5kIChub3QgKGVxIG5hbWUgJ2VtYWNzKSkgOyBIaWRlIHRoZSBgZW1hY3MnIHBhY2thZ2UuCiAg ICAgICAgICAgICAgICAgKG9yIHBhY2thZ2UtbGlzdC11bnZlcnNpb25lZAogICAgICAgICAgICAg ICAgICAgICAocGFja2FnZS0tYmktZGVzYy12ZXJzaW9uIChjZHIgZWx0KSkpCiAgICAgICAgICAg ICAgICAgKG9yIChlcSBwYWNrYWdlcyB0KSAobWVtcSBuYW1lIHBhY2thZ2VzKSkpCiAgICAgICAg KGZ1bmNhbGwgZnVuY3Rpb24gKHBhY2thZ2UtLWZyb20tYnVpbHRpbiBlbHQpKSkpCgogICAgOzsg QXZhaWxhYmxlIGFuZCBkaXNhYmxlZCBwYWNrYWdlczoKICAgIChkb2xpc3QgKGVsdCBwYWNrYWdl LWFyY2hpdmUtY29udGVudHMpCiAgICAgIChzZXRxIG5hbWUgKGNhciBlbHQpKQogICAgICAod2hl biAob3IgKGVxIHBhY2thZ2VzIHQpIChtZW1xIG5hbWUgcGFja2FnZXMpKQogICAgICAgIChkb2xp c3QgKHBrZyAoY2RyIGVsdCkpCiAgICAgICAgICA7OyBIaWRlIG9ic29sZXRlIHBhY2thZ2VzLgog ICAgICAgICAgKHVubGVzcyAocGFja2FnZS1pbnN0YWxsZWQtcCAocGFja2FnZS1kZXNjLW5hbWUg cGtnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNj LXZlcnNpb24gcGtnKSkKICAgICAgICAoZnVuY2FsbCBmdW5jdGlvbiBwa2cpKSkpKSkpCgooZGVm dW4gcGFja2FnZS0taGFzLWtleXdvcmQtcCAoZGVzYyAmb3B0aW9uYWwga2V5d29yZHMpCiAgIlRl c3QgaWYgcGFja2FnZSBERVNDIGhhcyBhbnkgb2YgdGhlIGdpdmVuIEtFWVdPUkRTLgpXaGVuIG5v bmUgYXJlIGdpdmVuLCB0aGUgcGFja2FnZSBtYXRjaGVzLiIKICAoaWYga2V5d29yZHMKICAgICAg KGxldCAoKGRlc2Mta2V5d29yZHMgKGFuZCBkZXNjIChwYWNrYWdlLWRlc2MtLWtleXdvcmRzIGRl c2MpKSkKICAgICAgICAgICAgZm91bmQpCiAgICAgICAgKHdoaWxlIChhbmQgKG5vdCBmb3VuZCkg a2V5d29yZHMpCiAgICAgICAgICAobGV0ICgoayAocG9wIGtleXdvcmRzKSkpCiAgICAgICAgICAg IChzZXRxIGZvdW5kCiAgICAgICAgICAgICAgICAgIChvciAoc3RyaW5nPSBrIChjb25jYXQgImFy YzoiIChwYWNrYWdlLWRlc2MtYXJjaGl2ZSBkZXNjKSkpCiAgICAgICAgICAgICAgICAgICAgICAo c3RyaW5nPSBrIChjb25jYXQgInN0YXR1czoiIChwYWNrYWdlLWRlc2Mtc3RhdHVzIGRlc2MpKSkK ICAgICAgICAgICAgICAgICAgICAgIChtZW1iZXIgayBkZXNjLWtleXdvcmRzKSkpKSkKICAgICAg ICBmb3VuZCkKICAgIHQpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS0tZGlzcGxheSAocmVtZW1iZXIt cG9zIHN1ZmZpeCkKICAiRGlzcGxheSB0aGUgUGFja2FnZSBNZW51LgpJZiBSRU1FTUJFUi1QT1Mg aXMgbm9uLW5pbCwga2VlcCBwb2ludCBvbiB0aGUgc2FtZSBlbnRyeS4KCklmIFNVRkZJWCBpcyBu b24tbmlsLCBhcHBlbmQgdGhhdCB0byBcIlBhY2thZ2VcIiBmb3IgdGhlIGZpcnN0CmNvbHVtbiBp biB0aGUgaGVhZGVyIGxpbmUuIgogIChzZXRmIChjYXIgKGFyZWYgdGFidWxhdGVkLWxpc3QtZm9y bWF0IDApKQogICAgICAgIChpZiBzdWZmaXgKICAgICAgICAgICAgKGNvbmNhdCAiUGFja2FnZVsi IHN1ZmZpeCAiXSIpCiAgICAgICAgICAiUGFja2FnZSIpKQogICh0YWJ1bGF0ZWQtbGlzdC1pbml0 LWhlYWRlcikKICAodGFidWxhdGVkLWxpc3QtcHJpbnQgcmVtZW1iZXItcG9zKSkKCihkZWZ1biBw YWNrYWdlLW1lbnUtLWdlbmVyYXRlIChyZW1lbWJlci1wb3MgJm9wdGlvbmFsIHBhY2thZ2VzIGtl eXdvcmRzKQogICJQb3B1bGF0ZSBhbmQgZGlzcGxheSB0aGUgUGFja2FnZSBNZW51LgpJZiBSRU1F TUJFUi1QT1MgaXMgbm9uLW5pbCwga2VlcCBwb2ludCBvbiB0aGUgc2FtZSBlbnRyeS4KUEFDS0FH RVMgc2hvdWxkIGJlIHQsIHdoaWNoIG1lYW5zIHRvIGRpc3BsYXkgYWxsIGtub3duIHBhY2thZ2Vz LApvciBhIGxpc3Qgb2YgcGFja2FnZSBuYW1lcyAoc3ltYm9scykgdG8gZGlzcGxheS4KCldpdGgg S0VZV09SRFMgZ2l2ZW4sIG9ubHkgcGFja2FnZXMgd2l0aCB0aG9zZSBrZXl3b3JkcyBhcmUKc2hv d24uIgogIChwYWNrYWdlLW1lbnUtLXJlZnJlc2ggcGFja2FnZXMga2V5d29yZHMpCiAgKHBhY2th Z2UtbWVudS0tZGlzcGxheSByZW1lbWJlci1wb3MKICAgICAgICAgICAgICAgICAgKHdoZW4ga2V5 d29yZHMKICAgICAgICAgICAgICAgICAgICAobGV0ICgoZmlsdGVycyAobWFwY29uY2F0ICMnaWRl bnRpdHkga2V5d29yZHMgIiwiKSkpCiAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ICJQYWNr YWdlWyIgZmlsdGVycyAiXSIpKSkpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS0tcHJpbnQtaW5mbyAo cGtnKQogICJSZXR1cm4gYSBwYWNrYWdlIGVudHJ5IHN1aXRhYmxlIGZvciBgdGFidWxhdGVkLWxp c3QtZW50cmllcycuClBLRyBoYXMgdGhlIGZvcm0gKFBLRy1ERVNDIC4gU1RBVFVTKS4KUmV0dXJu IChQS0ctREVTQyBbTkFNRSBWRVJTSU9OIFNUQVRVUyBET0NdKS4iCiAgKHBhY2thZ2UtbWVudS0t cHJpbnQtaW5mby1zaW1wbGUgKGNhciBwa2cpKSkKKG1ha2Utb2Jzb2xldGUgJ3BhY2thZ2UtbWVu dS0tcHJpbnQtaW5mbwogICAgICAgICAgICAgICAncGFja2FnZS1tZW51LS1wcmludC1pbmZvLXNp bXBsZSAiMjUuMSIpCgoMCjs7OyBQYWNrYWdlIG1lbnUgZmFjZXMKCihkZWZmYWNlIHBhY2thZ2Ut bmFtZQogICcoKHQgOmluaGVyaXQgbGluaykpCiAgIkZhY2UgdXNlZCBvbiBwYWNrYWdlIG5hbWVz IGluIHRoZSBwYWNrYWdlIG1lbnUuIgogIDp2ZXJzaW9uICIyNS4xIikKCihkZWZmYWNlIHBhY2th Z2UtZGVzY3JpcHRpb24KICAnKCh0IDppbmhlcml0IGRlZmF1bHQpKQogICJGYWNlIHVzZWQgb24g cGFja2FnZSBkZXNjcmlwdGlvbiBzdW1tYXJpZXMgaW4gdGhlIHBhY2thZ2UgbWVudS4iCiAgOnZl cnNpb24gIjI1LjEiKQoKOzsgU2hhbWUgdGhpcyBoeXBoZW5hdGVzICJidWlsdC1pbiIsIHdoZW4g ImZvbnQtbG9jay1idWlsdGluLWZhY2UiIGRvZXNuJ3QuCihkZWZmYWNlIHBhY2thZ2Utc3RhdHVz LWJ1aWx0LWluCiAgJygodCA6aW5oZXJpdCBmb250LWxvY2stYnVpbHRpbi1mYWNlKSkKICAiRmFj ZSB1c2VkIG9uIHRoZSBzdGF0dXMgYW5kIHZlcnNpb24gb2YgYnVpbHQtaW4gcGFja2FnZXMuIgog IDp2ZXJzaW9uICIyNS4xIikKCihkZWZmYWNlIHBhY2thZ2Utc3RhdHVzLWV4dGVybmFsCiAgJygo dCA6aW5oZXJpdCBwYWNrYWdlLXN0YXR1cy1idWlsdC1pbikpCiAgIkZhY2UgdXNlZCBvbiB0aGUg c3RhdHVzIGFuZCB2ZXJzaW9uIG9mIGV4dGVybmFsIHBhY2thZ2VzLiIKICA6dmVyc2lvbiAiMjUu MSIpCgooZGVmZmFjZSBwYWNrYWdlLXN0YXR1cy1hdmFpbGFibGUKICAnKCh0IDppbmhlcml0IGRl ZmF1bHQpKQogICJGYWNlIHVzZWQgb24gdGhlIHN0YXR1cyBhbmQgdmVyc2lvbiBvZiBhdmFpbGFi bGUgcGFja2FnZXMuIgogIDp2ZXJzaW9uICIyNS4xIikKCihkZWZmYWNlIHBhY2thZ2Utc3RhdHVz LW5ldwogICcoKHQgOmluaGVyaXQgKGJvbGQgcGFja2FnZS1zdGF0dXMtYXZhaWxhYmxlKSkpCiAg IkZhY2UgdXNlZCBvbiB0aGUgc3RhdHVzIGFuZCB2ZXJzaW9uIG9mIG5ldyBwYWNrYWdlcy4iCiAg OnZlcnNpb24gIjI1LjEiKQoKKGRlZmZhY2UgcGFja2FnZS1zdGF0dXMtaGVsZAogICcoKHQgOmlu aGVyaXQgZm9udC1sb2NrLWNvbnN0YW50LWZhY2UpKQogICJGYWNlIHVzZWQgb24gdGhlIHN0YXR1 cyBhbmQgdmVyc2lvbiBvZiBoZWxkIHBhY2thZ2VzLiIKICA6dmVyc2lvbiAiMjUuMSIpCgooZGVm ZmFjZSBwYWNrYWdlLXN0YXR1cy1kaXNhYmxlZAogICcoKHQgOmluaGVyaXQgZm9udC1sb2NrLXdh cm5pbmctZmFjZSkpCiAgIkZhY2UgdXNlZCBvbiB0aGUgc3RhdHVzIGFuZCB2ZXJzaW9uIG9mIGRp c2FibGVkIHBhY2thZ2VzLiIKICA6dmVyc2lvbiAiMjUuMSIpCgooZGVmZmFjZSBwYWNrYWdlLXN0 YXR1cy1pbnN0YWxsZWQKICAnKCh0IDppbmhlcml0IGZvbnQtbG9jay1jb21tZW50LWZhY2UpKQog ICJGYWNlIHVzZWQgb24gdGhlIHN0YXR1cyBhbmQgdmVyc2lvbiBvZiBpbnN0YWxsZWQgcGFja2Fn ZXMuIgogIDp2ZXJzaW9uICIyNS4xIikKCihkZWZmYWNlIHBhY2thZ2Utc3RhdHVzLWZyb20tc291 cmNlCiAgJygodCA6aW5oZXJpdCBmb250LWxvY2stbmVnYXRpb24tY2hhci1mYWNlKSkKICAiRmFj ZSB1c2VkIG9uIHRoZSBzdGF0dXMgYW5kIHZlcnNpb24gb2YgaW5zdGFsbGVkIHBhY2thZ2VzLiIK ICA6dmVyc2lvbiAiMjkuMSIpCgooZGVmZmFjZSBwYWNrYWdlLXN0YXR1cy1kZXBlbmRlbmN5CiAg JygodCA6aW5oZXJpdCBwYWNrYWdlLXN0YXR1cy1pbnN0YWxsZWQpKQogICJGYWNlIHVzZWQgb24g dGhlIHN0YXR1cyBhbmQgdmVyc2lvbiBvZiBkZXBlbmRlbmN5IHBhY2thZ2VzLiIKICA6dmVyc2lv biAiMjUuMSIpCgooZGVmZmFjZSBwYWNrYWdlLXN0YXR1cy11bnNpZ25lZAogICcoKHQgOmluaGVy aXQgZm9udC1sb2NrLXdhcm5pbmctZmFjZSkpCiAgIkZhY2UgdXNlZCBvbiB0aGUgc3RhdHVzIGFu ZCB2ZXJzaW9uIG9mIHVuc2lnbmVkIHBhY2thZ2VzLiIKICA6dmVyc2lvbiAiMjUuMSIpCgooZGVm ZmFjZSBwYWNrYWdlLXN0YXR1cy1pbmNvbXBhdAogICcoKHQgOmluaGVyaXQgZXJyb3IpKQogICJG YWNlIHVzZWQgb24gdGhlIHN0YXR1cyBhbmQgdmVyc2lvbiBvZiBpbmNvbXBhdCBwYWNrYWdlcy4i CiAgOnZlcnNpb24gIjI1LjEiKQoKKGRlZmZhY2UgcGFja2FnZS1zdGF0dXMtYXZhaWwtb2Jzbwog ICcoKHQgOmluaGVyaXQgcGFja2FnZS1zdGF0dXMtaW5jb21wYXQpKQogICJGYWNlIHVzZWQgb24g dGhlIHN0YXR1cyBhbmQgdmVyc2lvbiBvZiBhdmFpbC1vYnNvIHBhY2thZ2VzLiIKICA6dmVyc2lv biAiMjUuMSIpCgoMCjs7OyBQYWNrYWdlIG1lbnUgcHJpbnRpbmcKCihkZWZ1biBwYWNrYWdlLW1l bnUtLXByaW50LWluZm8tc2ltcGxlIChwa2cpCiAgIlJldHVybiBhIHBhY2thZ2UgZW50cnkgc3Vp dGFibGUgZm9yIGB0YWJ1bGF0ZWQtbGlzdC1lbnRyaWVzJy4KUEtHIGlzIGEgYHBhY2thZ2UtZGVz Yycgb2JqZWN0LgpSZXR1cm4gKFBLRy1ERVNDIFtOQU1FIFZFUlNJT04gU1RBVFVTIERPQ10pLiIK ICAobGV0KiAoKHN0YXR1cyAgKHBhY2thZ2UtZGVzYy1zdGF0dXMgcGtnKSkKICAgICAgICAgKGZh Y2UgKHBjYXNlIHN0YXR1cwogICAgICAgICAgICAgICAgICgiYnVpbHQtaW4iICAncGFja2FnZS1z dGF0dXMtYnVpbHQtaW4pCiAgICAgICAgICAgICAgICAgKCJleHRlcm5hbCIgICdwYWNrYWdlLXN0 YXR1cy1leHRlcm5hbCkKICAgICAgICAgICAgICAgICAoImF2YWlsYWJsZSIgJ3BhY2thZ2Utc3Rh dHVzLWF2YWlsYWJsZSkKICAgICAgICAgICAgICAgICAoImF2YWlsLW9ic28iICdwYWNrYWdlLXN0 YXR1cy1hdmFpbC1vYnNvKQogICAgICAgICAgICAgICAgICgibmV3IiAgICAgICAncGFja2FnZS1z dGF0dXMtbmV3KQogICAgICAgICAgICAgICAgICgiaGVsZCIgICAgICAncGFja2FnZS1zdGF0dXMt aGVsZCkKICAgICAgICAgICAgICAgICAoImRpc2FibGVkIiAgJ3BhY2thZ2Utc3RhdHVzLWRpc2Fi bGVkKQogICAgICAgICAgICAgICAgICgiaW5zdGFsbGVkIiAncGFja2FnZS1zdGF0dXMtaW5zdGFs bGVkKQogICAgICAgICAgICAgICAgICgic291cmNlIiAgICAncGFja2FnZS1zdGF0dXMtZnJvbS1z b3VyY2UpCiAgICAgICAgICAgICAgICAgKCJkZXBlbmRlbmN5IiAncGFja2FnZS1zdGF0dXMtZGVw ZW5kZW5jeSkKICAgICAgICAgICAgICAgICAoInVuc2lnbmVkIiAgJ3BhY2thZ2Utc3RhdHVzLXVu c2lnbmVkKQogICAgICAgICAgICAgICAgICgiaW5jb21wYXQiICAncGFja2FnZS1zdGF0dXMtaW5j b21wYXQpCiAgICAgICAgICAgICAgICAgKF8gICAgICAgICAgICAnZm9udC1sb2NrLXdhcm5pbmct ZmFjZSkpKSkgOyBvYnNvbGV0ZS4KICAgIChsaXN0IHBrZwogICAgICAgICAgYFsoLChzeW1ib2wt bmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnKSkKICAgICAgICAgICAgIGZhY2UgcGFja2FnZS1u YW1lCiAgICAgICAgICAgICBmb250LWxvY2stZmFjZSBwYWNrYWdlLW5hbWUKICAgICAgICAgICAg IGZvbGxvdy1saW5rIHQKICAgICAgICAgICAgIHBhY2thZ2UtZGVzYyAscGtnCiAgICAgICAgICAg ICBhY3Rpb24gcGFja2FnZS1tZW51LWRlc2NyaWJlLXBhY2thZ2UpCiAgICAgICAgICAgICwocHJv cGVydGl6ZQogICAgICAgICAgICAgIChpZiAocGFja2FnZS12Yy1wIHBrZykKICAgICAgICAgICAg ICAgICAgKHByb2duCiAgICAgICAgICAgICAgICAgICAgKHJlcXVpcmUgJ3BhY2thZ2UtdmMpCiAg ICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtdmMtY29tbWl0IHBrZykpCiAgICAgICAgICAgICAg ICAocGFja2FnZS12ZXJzaW9uLWpvaW4KICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLXZl cnNpb24gcGtnKSkpCiAgICAgICAgICAgICAgJ2ZvbnQtbG9jay1mYWNlIGZhY2UpCiAgICAgICAg ICAgICwocHJvcGVydGl6ZSBzdGF0dXMgJ2ZvbnQtbG9jay1mYWNlIGZhY2UpCiAgICAgICAgICAg ICwocHJvcGVydGl6ZSAob3IgKHBhY2thZ2UtZGVzYy1hcmNoaXZlIHBrZykgIiIpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWxvY2stZmFjZSBmYWNlKQogICAgICAg ICAgICAsKHByb3BlcnRpemUgKHBhY2thZ2UtZGVzYy1zdW1tYXJ5IHBrZykKICAgICAgICAgICAg ICAgICAgICAgICAgICdmb250LWxvY2stZmFjZSAncGFja2FnZS1kZXNjcmlwdGlvbildKSkpCgoo ZGVmdmFyIHBhY2thZ2UtbWVudS0tb2xkLWFyY2hpdmUtY29udGVudHMgbmlsCiAgImBwYWNrYWdl LWFyY2hpdmUtY29udGVudHMnIGJlZm9yZSB0aGUgbGF0ZXN0IHJlZnJlc2guIikKCihkZWZ1biBw YWNrYWdlLW1lbnUtLXJlZnJlc2gtY29udGVudHMgKCZvcHRpb25hbCBfYXJnIF9ub2NvbmZpcm0p CiAgIkluIFBhY2thZ2UgTWVudSwgZG93bmxvYWQgdGhlIEVtYWNzIExpc3AgcGFja2FnZSBhcmNo aXZlLgpGZXRjaCB0aGUgY29udGVudHMgb2YgZWFjaCBhcmNoaXZlIHNwZWNpZmllZCBpbgpgcGFj a2FnZS1hcmNoaXZlcycsIGFuZCB0aGVuIHJlZnJlc2ggdGhlIHBhY2thZ2UgbWVudS4KCmBwYWNr YWdlLW1lbnUtbW9kZScgc2V0cyBgcmV2ZXJ0LWJ1ZmZlci1mdW5jdGlvbicgdG8gdGhpcwpmdW5j dGlvbi4gIFRoZSBhcmdzIEFSRyBhbmQgTk9DT05GSVJNLCBwYXNzZWQgZnJvbQpgcmV2ZXJ0LWJ1 ZmZlcicsIGFyZSBpZ25vcmVkLiIKICAocGFja2FnZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1tb2Rl KQogIChzZXRxIHBhY2thZ2UtbWVudS0tb2xkLWFyY2hpdmUtY29udGVudHMgcGFja2FnZS1hcmNo aXZlLWNvbnRlbnRzKQogIChzZXRxIHBhY2thZ2UtbWVudS0tbmV3LXBhY2thZ2UtbGlzdCBuaWwp CiAgKHBhY2thZ2UtcmVmcmVzaC1jb250ZW50cyBwYWNrYWdlLW1lbnUtYXN5bmMpKQooZGVmaW5l LW9ic29sZXRlLWZ1bmN0aW9uLWFsaWFzICdwYWNrYWdlLW1lbnUtcmVmcmVzaCAncmV2ZXJ0LWJ1 ZmZlciAiMjcuMSIpCgooZGVmdW4gcGFja2FnZS1tZW51LWhpZGUtcGFja2FnZSAoKQogICJIaWRl IGluIFBhY2thZ2UgTWVudSBwYWNrYWdlcyB0aGF0IG1hdGNoIGEgcmVnZXhwLgpQcm9tcHQgZm9y IHRoZSByZWdleHAgdG8gbWF0Y2ggYWdhaW5zdCBwYWNrYWdlIG5hbWVzLgpUaGUgZGVmYXVsdCBy ZWdleHAgd2lsbCBoaWRlIG9ubHkgdGhlIHBhY2thZ2Ugd2hvc2UgbmFtZSBpcyBhdCBwb2ludC4K ClRoZSByZWdleHAgaXMgYWRkZWQgdG8gdGhlIGxpc3QgaW4gdGhlIHVzZXIgb3B0aW9uCmBwYWNr YWdlLWhpZGRlbi1yZWdleHBzJyBhbmQgc2F2ZWQgZm9yIGZ1dHVyZSBzZXNzaW9ucy4KClRvIHVu aGlkZSBhIHBhY2thZ2UsIHR5cGUKYFxcW2N1c3RvbWl6ZS12YXJpYWJsZV0gUkVUIHBhY2thZ2Ut aGlkZGVuLXJlZ2V4cHMnLgoKVHlwZSBcXFtwYWNrYWdlLW1lbnUtdG9nZ2xlLWhpZGluZ10gdG8g dG9nZ2xlIHBhY2thZ2UgaGlkaW5nLiIKICAoZGVjbGFyZSAoaW50ZXJhY3RpdmUtb25seSAiY2hh bmdlIGBwYWNrYWdlLWhpZGRlbi1yZWdleHBzJyBpbnN0ZWFkLiIpKQogIChpbnRlcmFjdGl2ZSBu aWwgcGFja2FnZS1tZW51LW1vZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdlLW1lbnUtbW9k ZSkKICAobGV0KiAoKG5hbWUgKHdoZW4gKGRlcml2ZWQtbW9kZS1wICdwYWNrYWdlLW1lbnUtbW9k ZSkKICAgICAgICAgICAgICAgICAoY29uY2F0ICJcXGAiIChyZWdleHAtcXVvdGUgKHN5bWJvbC1u YW1lIChwYWNrYWdlLWRlc2MtbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICh0YWJ1bGF0ZWQtbGlzdC1nZXQtaWQpKSkpCiAgICAg ICAgICAgICAgICAgICAgICAgICAiXFwnIikpKQogICAgICAgICAocmUgKHJlYWQtc3RyaW5nICJI aWRlIHBhY2thZ2VzIG1hdGNoaW5nIHJlZ2V4cDogIiBuYW1lKSkpCiAgICA7OyBUZXN0IGlmIGl0 IGlzIHZhbGlkLgogICAgKHN0cmluZy1tYXRjaCByZSAiIikKICAgIChwdXNoIHJlIHBhY2thZ2Ut aGlkZGVuLXJlZ2V4cHMpCiAgICAoY3VzdG9taXplLXNhdmUtdmFyaWFibGUgJ3BhY2thZ2UtaGlk ZGVuLXJlZ2V4cHMgcGFja2FnZS1oaWRkZW4tcmVnZXhwcykKICAgIChwYWNrYWdlLW1lbnUtLXBv c3QtcmVmcmVzaCkKICAgIChsZXQgKChoaWRkZW4KICAgICAgICAgICAoY2wtcmVtb3ZlLWlmLW5v dCAobGFtYmRhIChlKSAoc3RyaW5nLW1hdGNoIHJlIChzeW1ib2wtbmFtZSAoY2FyIGUpKSkpCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRzKSkpCiAg ICAgIChtZXNzYWdlICJQYWNrYWdlcyB0byBoaWRlOiAlZC4gIFR5cGUgYCVzJyB0byB0b2dnbGUg b3IgYCVzJyB0byBjdXN0b21pemUiCiAgICAgICAgICAgICAgIChsZW5ndGggaGlkZGVuKQogICAg ICAgICAgICAgICAoc3Vic3RpdHV0ZS1jb21tYW5kLWtleXMgIlxcW3BhY2thZ2UtbWVudS10b2dn bGUtaGlkaW5nXSIpCiAgICAgICAgICAgICAgIChzdWJzdGl0dXRlLWNvbW1hbmQta2V5cyAiXFxb Y3VzdG9taXplLXZhcmlhYmxlXSBSRVQgcGFja2FnZS1oaWRkZW4tcmVnZXhwcyIpKSkpKQoKCihk ZWZ1biBwYWNrYWdlLW1lbnUtZGVzY3JpYmUtcGFja2FnZSAoJm9wdGlvbmFsIGJ1dHRvbikKICAi RGVzY3JpYmUgdGhlIGN1cnJlbnQgcGFja2FnZS4KSWYgb3B0aW9uYWwgYXJnIEJVVFRPTiBpcyBu b24tbmlsLCBkZXNjcmliZSBpdHMgYXNzb2NpYXRlZCBwYWNrYWdlLiIKICAoaW50ZXJhY3RpdmUg bmlsIHBhY2thZ2UtbWVudS1tb2RlKQogIChsZXQgKChwa2ctZGVzYyAoaWYgYnV0dG9uIChidXR0 b24tZ2V0IGJ1dHRvbiAncGFja2FnZS1kZXNjKQogICAgICAgICAgICAgICAgICAgICh0YWJ1bGF0 ZWQtbGlzdC1nZXQtaWQpKSkpCiAgICAoaWYgcGtnLWRlc2MKICAgICAgICAoZGVzY3JpYmUtcGFj a2FnZSBwa2ctZGVzYykKICAgICAgKHVzZXItZXJyb3IgIk5vIHBhY2thZ2UgaGVyZSIpKSkpCgo7 OyBmaXhtZSBudW1lcmljIGFyZ3VtZW50CihkZWZ1biBwYWNrYWdlLW1lbnUtbWFyay1kZWxldGUg KCZvcHRpb25hbCBfbnVtKQogICJNYXJrIGEgcGFja2FnZSBmb3IgZGVsZXRpb24gYW5kIG1vdmUg dG8gdGhlIG5leHQgbGluZS4iCiAgKGludGVyYWN0aXZlICJwIiBwYWNrYWdlLW1lbnUtbW9kZSkK ICAocGFja2FnZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1tb2RlKQogIChpZiAobWVtYmVyIChwYWNr YWdlLW1lbnUtZ2V0LXN0YXR1cykKICAgICAgICAgICAgICAnKCJpbnN0YWxsZWQiICJzb3VyY2Ui ICJkZXBlbmRlbmN5IiAib2Jzb2xldGUiICJ1bnNpZ25lZCIpKQogICAgICAodGFidWxhdGVkLWxp c3QtcHV0LXRhZyAiRCIgdCkKICAgIChmb3J3YXJkLWxpbmUpKSkKCihkZWZ1biBwYWNrYWdlLW1l bnUtbWFyay1pbnN0YWxsICgmb3B0aW9uYWwgX251bSkKICAiTWFyayBhIHBhY2thZ2UgZm9yIGlu c3RhbGxhdGlvbiBhbmQgbW92ZSB0byB0aGUgbmV4dCBsaW5lLiIKICAoaW50ZXJhY3RpdmUgInAi IHBhY2thZ2UtbWVudS1tb2RlKQogIChwYWNrYWdlLS1lbnN1cmUtcGFja2FnZS1tZW51LW1vZGUp CiAgKGlmIChtZW1iZXIgKHBhY2thZ2UtbWVudS1nZXQtc3RhdHVzKSAnKCJhdmFpbGFibGUiICJh dmFpbC1vYnNvIiAibmV3IiAiZGVwZW5kZW5jeSIpKQogICAgICAodGFidWxhdGVkLWxpc3QtcHV0 LXRhZyAiSSIgdCkKICAgIChmb3J3YXJkLWxpbmUpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtbWFy ay11bm1hcmsgKCZvcHRpb25hbCBfbnVtKQogICJDbGVhciBhbnkgbWFya3Mgb24gYSBwYWNrYWdl IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUuIgogIChpbnRlcmFjdGl2ZSAicCIgcGFja2FnZS1t ZW51LW1vZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdlLW1lbnUtbW9kZSkKICAodGFidWxh dGVkLWxpc3QtcHV0LXRhZyAiICIgdCkpCgooZGVmdW4gcGFja2FnZS1tZW51LWJhY2t1cC11bm1h cmsgKCkKICAiQmFjayB1cCBvbmUgbGluZSBhbmQgY2xlYXIgYW55IG1hcmtzIG9uIHRoYXQgcGFj a2FnZS4iCiAgKGludGVyYWN0aXZlIG5pbCBwYWNrYWdlLW1lbnUtbW9kZSkKICAocGFja2FnZS0t ZW5zdXJlLXBhY2thZ2UtbWVudS1tb2RlKQogIChmb3J3YXJkLWxpbmUgLTEpCiAgKHRhYnVsYXRl ZC1saXN0LXB1dC10YWcgIiAiKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtbWFyay1vYnNvbGV0ZS1m b3ItZGVsZXRpb24gKCkKICAiTWFyayBhbGwgb2Jzb2xldGUgcGFja2FnZXMgZm9yIGRlbGV0aW9u LiIKICAoaW50ZXJhY3RpdmUgbmlsIHBhY2thZ2UtbWVudS1tb2RlKQogIChwYWNrYWdlLS1lbnN1 cmUtcGFja2FnZS1tZW51LW1vZGUpCiAgKHNhdmUtZXhjdXJzaW9uCiAgICAoZ290by1jaGFyIChw b2ludC1taW4pKQogICAgKHdoaWxlIChub3QgKGVvYnApKQogICAgICAoaWYgKGVxdWFsIChwYWNr YWdlLW1lbnUtZ2V0LXN0YXR1cykgIm9ic29sZXRlIikKICAgICAgICAgICh0YWJ1bGF0ZWQtbGlz dC1wdXQtdGFnICJEIiB0KQogICAgICAgIChmb3J3YXJkLWxpbmUgMSkpKSkpCgooZGVmdmFyIHBh Y2thZ2UtLXF1aWNrLWhlbHAta2V5cwogICcoKCgibWFyayBmb3IgaW5zdGFsbGF0aW9uLCIgLiA5 KQogICAgICgibWFyayBmb3IgZGVsZXRpb24sIiAuIDkpICJ1bm1hcmssIiAoImV4ZWN1dGUgbWFy a2VkIGFjdGlvbnMiIC4gMSkpCiAgICAoIm5leHQsIiAicHJldmlvdXMiKQogICAgKCJIaWRlLXBh Y2thZ2UsIiAiKC10b2dnbGUtaGlkZGVuIikKICAgICgiZy1yZWZyZXNoLWNvbnRlbnRzLCIgIi8t ZmlsdGVyLCIgImhlbHAiKSkpCgooZGVmdW4gcGFja2FnZS0tcHJldHRpZnktcXVpY2staGVscC1r ZXkgKGRlc2MpCiAgIlByZXR0aWZ5IERFU0MgdG8gYmUgZGlzcGxheWVkIGFzIGEgaGVscCBtZW51 LiIKICAoaWYgKGxpc3RwIGRlc2MpCiAgICAgIChpZiAobGlzdHAgKGNkciBkZXNjKSkKICAgICAg ICAgIChtYXBjb25jYXQgIydwYWNrYWdlLS1wcmV0dGlmeS1xdWljay1oZWxwLWtleSBkZXNjICIg ICAiKQogICAgICAgIChsZXQgKChwbGFjZSAoY2RyIGRlc2MpKQogICAgICAgICAgICAgIChvdXQg KGNvcHktc2VxdWVuY2UgKGNhciBkZXNjKSkpKQogICAgICAgICAgKGFkZC10ZXh0LXByb3BlcnRp ZXMgcGxhY2UgKDErIHBsYWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhmYWNl IGhlbHAta2V5LWJpbmRpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQpCiAg ICAgICAgICBvdXQpKQogICAgKHBhY2thZ2UtLXByZXR0aWZ5LXF1aWNrLWhlbHAta2V5IChjb25z IGRlc2MgMCkpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtcXVpY2staGVscCAoKQogICJTaG93IHNo b3J0IGtleSBiaW5kaW5nIGhlbHAgZm9yIGBwYWNrYWdlLW1lbnUtbW9kZScuClRoZSBmdWxsIGxp c3Qgb2Yga2V5cyBjYW4gYmUgdmlld2VkIHdpdGggXFxbZGVzY3JpYmUtbW9kZV0uIgogIChpbnRl cmFjdGl2ZSBuaWwgcGFja2FnZS1tZW51LW1vZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdl LW1lbnUtbW9kZSkKICAobWVzc2FnZSAobWFwY29uY2F0ICMncGFja2FnZS0tcHJldHRpZnktcXVp Y2staGVscC1rZXkKICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UtLXF1aWNrLWhlbHAta2V5 cyAiXG4iKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LWdldC1zdGF0dXMgKCkKICAiUmV0dXJuIHN0 YXR1cyB0ZXh0IG9mIHBhY2thZ2UgYXQgcG9pbnQgaW4gUGFja2FnZSBNZW51LiIKICAocGFja2Fn ZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1tb2RlKQogIChsZXQqICgoaWQgKHRhYnVsYXRlZC1saXN0 LWdldC1pZCkpCiAgICAgICAgIChlbnRyeSAoYW5kIGlkIChhc3NvYyBpZCB0YWJ1bGF0ZWQtbGlz dC1lbnRyaWVzKSkpKQogICAgKGlmIGVudHJ5CiAgICAgICAgKGFyZWYgKGNhZHIgZW50cnkpIDIp CiAgICAgICIiKSkpCgooZGVmdW4gcGFja2FnZS1hcmNoaXZlLXByaW9yaXR5IChhcmNoaXZlKQog ICJSZXR1cm4gdGhlIHByaW9yaXR5IG9mIEFSQ0hJVkUuCgpUaGUgYXJjaGl2ZSBwcmlvcml0aWVz IGFyZSBzcGVjaWZpZWQgaW4KYHBhY2thZ2UtYXJjaGl2ZS1wcmlvcml0aWVzJy4gIElmIG5vdCBn aXZlbiB0aGVyZSwgdGhlIHByaW9yaXR5CmRlZmF1bHRzIHRvIDAuIgogIChvciAoY2RyIChhc3Nv YyBhcmNoaXZlIHBhY2thZ2UtYXJjaGl2ZS1wcmlvcml0aWVzKSkKICAgICAgMCkpCgooZGVmdW4g cGFja2FnZS1kZXNjLXByaW9yaXR5LXZlcnNpb24gKHBrZy1kZXNjKQogICJSZXR1cm4gdGhlIHZl cnNpb24gUEtHLURFU0Mgd2l0aCB0aGUgYXJjaGl2ZSBwcmlvcml0eSBwcmVwZW5kZWQuCgpUaGlz IGFsbG93cyBmb3IgZWFzeSBjb21wYXJpc29uIG9mIHBhY2thZ2UgdmVyc2lvbnMgZnJvbQpkaWZm ZXJlbnQgYXJjaGl2ZXMgaWYgYXJjaGl2ZSBwcmlvcml0aWVzIGFyZSBtZWFudCB0byBiZSB0YWtl biBpbgpjb25zaWRlcmF0aW9uLiIKICAoY29ucyAocGFja2FnZS1kZXNjLXByaW9yaXR5IHBrZy1k ZXNjKQogICAgICAgIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBwa2ctZGVzYykpKQoKKGRlZnVuIHBh Y2thZ2UtbWVudS0tZmluZC11cGdyYWRlcyAoKQogICJJbiBQYWNrYWdlIE1lbnUsIHJldHVybiBh biBhbGlzdCBvZiBwYWNrYWdlcyB0aGF0IGNhbiBiZSB1cGdyYWRlZC4KVGhlIGFsaXN0IGhhcyB0 aGUgc2FtZSBmb3JtIGFzIGBwYWNrYWdlLWFsaXN0JywgbmFtZWx5IGEgbGlzdApvZiAoUEtHIC4g REVTQ1MpLCBidXQgd2hlcmUgREVTQ1MgaXMgdGhlIGBwYWNrYWdlLWRlc2MnIG9iamVjdApjb3Jy ZXNwb25kaW5nIHRvIHRoZSBuZXdlciB2ZXJzaW9uLiIKICAobGV0IChpbnN0YWxsZWQgYXZhaWxh YmxlIHVwZ3JhZGVzKQogICAgOzsgQnVpbGQgbGlzdCBvZiBpbnN0YWxsZWQvYXZhaWxhYmxlIHBh Y2thZ2VzIGluIHRoaXMgYnVmZmVyLgogICAgKGRvbGlzdCAoZW50cnkgdGFidWxhdGVkLWxpc3Qt ZW50cmllcykKICAgICAgOzsgRU5UUlkgaXMgKFBLRy1ERVNDIFtOQU1FIFZFUlNJT04gU1RBVFVT IERPQ10pCiAgICAgIChsZXQgKChwa2ctZGVzYyAoY2FyIGVudHJ5KSkKICAgICAgICAgICAgKHN0 YXR1cyAoYXJlZiAoY2FkciBlbnRyeSkgMikpKQogICAgICAgIChjb25kICgobWVtYmVyIHN0YXR1 cyAnKCJpbnN0YWxsZWQiICJkZXBlbmRlbmN5IiAidW5zaWduZWQiICJleHRlcm5hbCIpKQogICAg ICAgICAgICAgICAocHVzaCBwa2ctZGVzYyBpbnN0YWxsZWQpKQogICAgICAgICAgICAgICgobWVt YmVyIHN0YXR1cyAnKCJhdmFpbGFibGUiICJuZXciKSkKICAgICAgICAgICAgICAgKHNldHEgYXZh aWxhYmxlIChwYWNrYWdlLS1hcHBlbmQtdG8tYWxpc3QgcGtnLWRlc2MgYXZhaWxhYmxlKSkpKSkp CiAgICA7OyBMb29wIHRocm91Z2ggbGlzdCBvZiBpbnN0YWxsZWQgcGFja2FnZXMsIGZpbmRpbmcg dXBncmFkZXMuCiAgICAoZG9saXN0IChwa2ctZGVzYyBpbnN0YWxsZWQpCiAgICAgIChsZXQqICgo bmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAgICAgICAgKGF2YWlsLXBr ZyAoY2FkciAoYXNzcSBuYW1lIGF2YWlsYWJsZSkpKSkKICAgICAgICAoYW5kIGF2YWlsLXBrZwog ICAgICAgICAgICAgKHZlcnNpb24tbGlzdC08IChwYWNrYWdlLWRlc2MtcHJpb3JpdHktdmVyc2lv biBwa2ctZGVzYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLXBy aW9yaXR5LXZlcnNpb24gYXZhaWwtcGtnKSkKICAgICAgICAgICAgIChwdXNoIChjb25zIG5hbWUg YXZhaWwtcGtnKSB1cGdyYWRlcykpKSkKICAgIHVwZ3JhZGVzKSkKCihkZWZ2YXIgcGFja2FnZS1t ZW51LS1tYXJrLXVwZ3JhZGVzLXBlbmRpbmcgbmlsCiAgIldoZXRoZXIgbWFyay11cGdyYWRlcyBp cyB3YWl0aW5nIGZvciBhIHJlZnJlc2ggdG8gZmluaXNoLiIpCgooZGVmdW4gcGFja2FnZS1tZW51 LS1tYXJrLXVwZ3JhZGVzLTEgKCkKICAiTWFyayBhbGwgdXBncmFkYWJsZSBwYWNrYWdlcyBpbiB0 aGUgUGFja2FnZSBNZW51LgpJbXBsZW1lbnRhdGlvbiBvZiBgcGFja2FnZS1tZW51LW1hcmstdXBn cmFkZXMnLiIKICAoc2V0cSBwYWNrYWdlLW1lbnUtLW1hcmstdXBncmFkZXMtcGVuZGluZyBuaWwp CiAgKGxldCAoKHVwZ3JhZGVzIChwYWNrYWdlLW1lbnUtLWZpbmQtdXBncmFkZXMpKSkKICAgIChp ZiAobnVsbCB1cGdyYWRlcykKICAgICAgICAobWVzc2FnZSAiTm8gcGFja2FnZXMgdG8gdXBncmFk ZSIpCiAgICAgICh3aWRlbikKICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgKGdvdG8tY2hh ciAocG9pbnQtbWluKSkKICAgICAgICAod2hpbGUgKG5vdCAoZW9icCkpCiAgICAgICAgICAobGV0 KiAoKHBrZy1kZXNjICh0YWJ1bGF0ZWQtbGlzdC1nZXQtaWQpKQogICAgICAgICAgICAgICAgICh1 cGdyYWRlIChjZHIgKGFzc3EgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy1kZXNjKSB1cGdyYWRlcykp KSkKICAgICAgICAgICAgKGNvbmQgKChudWxsIHVwZ3JhZGUpCiAgICAgICAgICAgICAgICAgICAo Zm9yd2FyZC1saW5lIDEpKQogICAgICAgICAgICAgICAgICAoKGVxdWFsIHBrZy1kZXNjIHVwZ3Jh ZGUpCiAgICAgICAgICAgICAgICAgICAocGFja2FnZS1tZW51LW1hcmstaW5zdGFsbCkpCiAgICAg ICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAocGFja2FnZS1tZW51LW1hcmstZGVs ZXRlKSkpKSkpCiAgICAgIChtZXNzYWdlICJQYWNrYWdlcyBtYXJrZWQgZm9yIHVwZ3JhZGluZzog JWQiCiAgICAgICAgICAgICAgIChsZW5ndGggdXBncmFkZXMpKSkpKQoKCihkZWZ1biBwYWNrYWdl LW1lbnUtbWFyay11cGdyYWRlcyAoKQogICJNYXJrIGFsbCB1cGdyYWRhYmxlIHBhY2thZ2VzIGlu IHRoZSBQYWNrYWdlIE1lbnUuCkZvciBlYWNoIGluc3RhbGxlZCBwYWNrYWdlIHdpdGggYSBuZXdl ciB2ZXJzaW9uIGF2YWlsYWJsZSwgcGxhY2UKYW4gKEkpbnN0YWxsIGZsYWcgb24gdGhlIGF2YWls YWJsZSB2ZXJzaW9uIGFuZCBhIChEKWVsZXRlIGZsYWcgb24KdGhlIGluc3RhbGxlZCB2ZXJzaW9u LiAgQSBzdWJzZXF1ZW50IFxcW3BhY2thZ2UtbWVudS1leGVjdXRlXQpjYWxsIHdpbGwgdXBncmFk ZSB0aGUgcGFja2FnZS4KCklmIHRoZXJlJ3MgYW4gYXN5bmMgcmVmcmVzaCBvcGVyYXRpb24gaW4g cHJvZ3Jlc3MsIHRoZSBmbGFncyB3aWxsCmJlIHBsYWNlZCBhcyBwYXJ0IG9mIGBwYWNrYWdlLW1l bnUtLXBvc3QtcmVmcmVzaCcgaW5zdGVhZCBvZgppbW1lZGlhdGVseS4iCiAgKGludGVyYWN0aXZl IG5pbCBwYWNrYWdlLW1lbnUtbW9kZSkKICAocGFja2FnZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1t b2RlKQogIChpZiAobm90IHBhY2thZ2UtLWRvd25sb2Fkcy1pbi1wcm9ncmVzcykKICAgICAgKHBh Y2thZ2UtbWVudS0tbWFyay11cGdyYWRlcy0xKQogICAgKHNldHEgcGFja2FnZS1tZW51LS1tYXJr LXVwZ3JhZGVzLXBlbmRpbmcgdCkKICAgIChtZXNzYWdlICJXYWl0aW5nIGZvciByZWZyZXNoIHRv IGZpbmlzaC4uLiIpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtLWxpc3QtdG8tcHJvbXB0IChwYWNr YWdlcyAmb3B0aW9uYWwgaW5jbHVkZS1kZXBlbmRlbmNpZXMpCiAgIlJldHVybiBhIHN0cmluZyBs aXN0aW5nIFBBQ0tBR0VTIHRoYXQncyB1c2FibGUgaW4gYSBwcm9tcHQuClBBQ0tBR0VTIGlzIGEg bGlzdCBvZiBgcGFja2FnZS1kZXNjJyBvYmplY3RzLgpGb3JtYXRzIHRoZSByZXR1cm5lZCBzdHJp bmcgdG8gYmUgdXNhYmxlIGluIGEgbWluaWJ1ZmZlcgpwcm9tcHQgKHNlZSBgcGFja2FnZS1tZW51 LS1wcm9tcHQtdHJhbnNhY3Rpb24tcCcpLgoKSWYgSU5DTFVERS1ERVBFTkRFTkNJRVMsIGFsc28g aW5jbHVkZSB0aGUgbnVtYmVyIG9mIHVuaW5zdGFsbGVkCmRlcGVuZGVuY2llcy4iCiAgOzsgVGhl IGNhc2Ugd2hlcmUgYHBhY2thZ2UnIGlzIGVtcHR5IGlzIGhhbmRsZWQgaW4KICA7OyBgcGFja2Fn ZS1tZW51LS1wcm9tcHQtdHJhbnNhY3Rpb24tcCcgYmVsb3cuCiAgKGZvcm1hdCAiJWQgKCVzKSVz IgogICAgICAgICAgKGxlbmd0aCBwYWNrYWdlcykKICAgICAgICAgIChtYXBjb25jYXQgIydwYWNr YWdlLWRlc2MtZnVsbC1uYW1lIHBhY2thZ2VzICIgIikKICAgICAgICAgIChsZXQgKChkZXBzCiAg ICAgICAgICAgICAgICAgKHNlcS1yZW1vdmUKICAgICAgICAgICAgICAgICAgIydwYWNrYWdlLWlu c3RhbGxlZC1wCiAgICAgICAgICAgICAgICAgIChkZWxldGUtZHVwcwogICAgICAgICAgICAgICAg ICAgKGFwcGx5CiAgICAgICAgICAgICAgICAgICAgIyduY29uYwogICAgICAgICAgICAgICAgICAg IChtYXBjYXIgKGxhbWJkYSAocGFja2FnZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KHBhY2thZ2UtLWRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBh Y2thZ2UtZGVzYy1uYW1lIHBhY2thZ2UpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBh Y2thZ2VzKSkpKSkpCiAgICAgICAgICAgIChpZiAoYW5kIGluY2x1ZGUtZGVwZW5kZW5jaWVzIGRl cHMpCiAgICAgICAgICAgICAgICAoaWYgKGxlbmd0aD0gZGVwcyAxKQogICAgICAgICAgICAgICAg ICAgIChmb3JtYXQgIiBwbHVzIDEgZGVwZW5kZW5jeSIpCiAgICAgICAgICAgICAgICAgIChmb3Jt YXQgIiBwbHVzICVkIGRlcGVuZGVuY2llcyIgKGxlbmd0aCBkZXBzKSkpCiAgICAgICAgICAgICAg IiIpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LS1wcm9tcHQtdHJhbnNhY3Rpb24tcCAoZGVsZXRl IGluc3RhbGwgdXBncmFkZSkKICAiUHJvbXB0IHRoZSB1c2VyIGFib3V0IERFTEVURSwgSU5TVEFM TCwgYW5kIFVQR1JBREUuCkRFTEVURSwgSU5TVEFMTCwgYW5kIFVQR1JBREUgYXJlIGxpc3RzIG9m IGBwYWNrYWdlLWRlc2MnIG9iamVjdHMuCkVpdGhlciBtYXkgYmUgbmlsLCBidXQgbm90IGFsbC4i CiAgKHktb3Itbi1wCiAgIChjb25jYXQKICAgICh3aGVuIGRlbGV0ZQogICAgICAoZm9ybWF0ICJQ YWNrYWdlcyB0byBkZWxldGU6ICVzLiAgIgogICAgICAgICAgICAgIChwYWNrYWdlLW1lbnUtLWxp c3QtdG8tcHJvbXB0IGRlbGV0ZSkpKQogICAgKHdoZW4gaW5zdGFsbAogICAgICAoZm9ybWF0ICJQ YWNrYWdlcyB0byBpbnN0YWxsOiAlcy4gICIKICAgICAgICAgICAgICAocGFja2FnZS1tZW51LS1s aXN0LXRvLXByb21wdCBpbnN0YWxsIHQpKSkKICAgICh3aGVuIHVwZ3JhZGUKICAgICAgKGZvcm1h dCAiUGFja2FnZXMgdG8gdXBncmFkZTogJXMuICAiCiAgICAgICAgICAgICAgKHBhY2thZ2UtbWVu dS0tbGlzdC10by1wcm9tcHQgdXBncmFkZSkpKQogICAgIlByb2NlZWQ/ICIpKSkKCgooZGVmdW4g cGFja2FnZS1tZW51LS1wYXJ0aXRpb24tdHJhbnNhY3Rpb24gKGluc3RhbGwgZGVsZXRlKQogICJS ZXR1cm4gYW4gYWxpc3QgZGVzY3JpYmluZyBhbiBJTlNUQUxMIERFTEVURSB0cmFuc2FjdGlvbi4K QWxpc3QgY29udGFpbnMgdGhyZWUgZW50cmllcywgdXBncmFkZSwgZGVsZXRlLCBhbmQgaW5zdGFs bCwgZWFjaAp3aXRoIGEgbGlzdCBvZiBwYWNrYWdlIG5hbWVzLgoKVGhlIHVwZ3JhZGUgZW50cnkg Y29udGFpbnMgYW55IGBwYWNrYWdlLWRlc2MnIG9iamVjdHMgaW4gSU5TVEFMTAp3aG9zZSBuYW1l IGNvaW5jaWRlcyB3aXRoIGFuIG9iamVjdCBpbiBERUxFVEUuICBUaGUgZGVsZXRlIGFuZAp0aGUg aW5zdGFsbCBlbnRyaWVzIGFyZSB0aGUgc2FtZSBhcyBERUxFVEUgYW5kIElOU1RBTEwgd2l0aCBz dWNoCm9iamVjdHMgcmVtb3ZlZC4iCiAgKGxldCogKCh1cGcgKGNsLWludGVyc2VjdGlvbiBpbnN0 YWxsIGRlbGV0ZSA6a2V5ICMncGFja2FnZS1kZXNjLW5hbWUpKQogICAgICAgICAoaW5zIChjbC1z ZXQtZGlmZmVyZW5jZSBpbnN0YWxsIHVwZyA6a2V5ICMncGFja2FnZS1kZXNjLW5hbWUpKQogICAg ICAgICAoZGVsIChjbC1zZXQtZGlmZmVyZW5jZSBkZWxldGUgdXBnIDprZXkgIydwYWNrYWdlLWRl c2MtbmFtZSkpKQogICAgYCgoZGVsZXRlIC4gLGRlbCkgKGluc3RhbGwgLiAsaW5zKSAodXBncmFk ZSAuICx1cGcpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LS1wZXJmb3JtLXRyYW5zYWN0aW9uIChp bnN0YWxsLWxpc3QgZGVsZXRlLWxpc3QpCiAgIkluc3RhbGwgcGFja2FnZXMgaW4gSU5TVEFMTC1M SVNUIGFuZCBkZWxldGUgREVMRVRFLUxJU1QuClJldHVybiBuaWwgaWYgdGhlcmUgd2VyZSBubyBl cnJvcnM7IG5vbi1uaWwgb3RoZXJ3aXNlLiIKICAobGV0ICgoZXJyb3JzIG5pbCkpCiAgICAoaWYg aW5zdGFsbC1saXN0CiAgICAgICAgKGxldCAoKHN0YXR1cy1mb3JtYXQgKGZvcm1hdCAiOkluc3Rh bGxpbmcgJSVkLyVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0 aCBpbnN0YWxsLWxpc3QpKSkKICAgICAgICAgICAgICAoaSAwKQogICAgICAgICAgICAgIChwYWNr YWdlLW1lbnUtLXRyYW5zYWN0aW9uLXN0YXR1cykpCiAgICAgICAgICAoZG9saXN0IChwa2cgaW5z dGFsbC1saXN0KQogICAgICAgICAgICAoc2V0cSBwYWNrYWdlLW1lbnUtLXRyYW5zYWN0aW9uLXN0 YXR1cwogICAgICAgICAgICAgICAgICAoZm9ybWF0IHN0YXR1cy1mb3JtYXQgKGNsLWluY2YgaSkp KQogICAgICAgICAgICAoZm9yY2UtbW9kZS1saW5lLXVwZGF0ZSkKICAgICAgICAgICAgKHJlZGlz cGxheSAnZm9yY2UpCiAgICAgICAgICAgIDs7IERvbid0IG1hcmsgYXMgc2VsZWN0ZWQsIGBwYWNr YWdlLW1lbnUtZXhlY3V0ZScgYWxyZWFkeQogICAgICAgICAgICA7OyBkb2VzIHRoYXQuCiAgICAg ICAgICAgIChwYWNrYWdlLWluc3RhbGwgcGtnICdkb250LXNlbGVjdCkpKSkKICAgIChsZXQgKChw YWNrYWdlLW1lbnUtLXRyYW5zYWN0aW9uLXN0YXR1cyAiOkRlbGV0aW5nIikpCiAgICAgIChmb3Jj ZS1tb2RlLWxpbmUtdXBkYXRlKQogICAgICAocmVkaXNwbGF5ICdmb3JjZSkKICAgICAgKGRvbGlz dCAoZWx0IChwYWNrYWdlLS1zb3J0LWJ5LWRlcGVuZGVuY2UgZGVsZXRlLWxpc3QpKQogICAgICAg IChjb25kaXRpb24tY2FzZS11bmxlc3MtZGVidWcgZXJyCiAgICAgICAgICAgIChsZXQgKChpbmhp Yml0LW1lc3NhZ2UgKG9yIGluaGliaXQtbWVzc2FnZSBwYWNrYWdlLW1lbnUtYXN5bmMpKSkKICAg ICAgICAgICAgICAocGFja2FnZS1kZWxldGUgZWx0IG5pbCAnbm9zYXZlKSkKICAgICAgICAgIChl cnJvcgogICAgICAgICAgIChwdXNoIChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIGVsdCkgZXJyb3Jz KQogICAgICAgICAgIChtZXNzYWdlICJFcnJvciB0cnlpbmcgdG8gZGVsZXRlIGAlcyc6ICVTIgog ICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtZnVsbC1uYW1lIGVsdCkgZXJyKSkpKSkK ICAgIGVycm9ycykpCgooZGVmdW4gcGFja2FnZS0tdXBkYXRlLXNlbGVjdGVkLXBhY2thZ2VzIChh ZGQgcmVtb3ZlKQogICJVcGRhdGUgdGhlIGBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzJyBsaXN0 IGFjY29yZGluZyB0byBBREQgYW5kIFJFTU9WRS4KQUREIGFuZCBSRU1PVkUgbXVzdCBiZSBkaXNq b2ludCBsaXN0cyBvZiBwYWNrYWdlIG5hbWVzIChvcgpgcGFja2FnZS1kZXNjJyBvYmplY3RzKSB0 byBiZSBhZGRlZCBhbmQgcmVtb3ZlZCB0byB0aGUgc2VsZWN0ZWQKcGFja2FnZXMgbGlzdCwgcmVz cGVjdGl2ZWx5LiIKICAoZG9saXN0IChwIGFkZCkKICAgIChjbC1wdXNobmV3IChpZiAocGFja2Fn ZS1kZXNjLXAgcCkgKHBhY2thZ2UtZGVzYy1uYW1lIHApIHApCiAgICAgICAgICAgICAgICBwYWNr YWdlLXNlbGVjdGVkLXBhY2thZ2VzKSkKICAoZG9saXN0IChwIHJlbW92ZSkKICAgIChzZXRxIHBh Y2thZ2Utc2VsZWN0ZWQtcGFja2FnZXMKICAgICAgICAgIChyZW1vdmUgKGlmIChwYWNrYWdlLWRl c2MtcCBwKSAocGFja2FnZS1kZXNjLW5hbWUgcCkgcCkKICAgICAgICAgICAgICAgICAgcGFja2Fn ZS1zZWxlY3RlZC1wYWNrYWdlcykpKQogICh3aGVuIChvciBhZGQgcmVtb3ZlKQogICAgKHBhY2th Z2UtLXNhdmUtc2VsZWN0ZWQtcGFja2FnZXMgcGFja2FnZS1zZWxlY3RlZC1wYWNrYWdlcykpKQoK KGRlZnVuIHBhY2thZ2UtbWVudS1leGVjdXRlICgmb3B0aW9uYWwgbm9xdWVyeSkKICAiUGVyZm9y bSBtYXJrZWQgUGFja2FnZSBNZW51IGFjdGlvbnMuClBhY2thZ2VzIG1hcmtlZCBmb3IgaW5zdGFs bGF0aW9uIGFyZSBkb3dubG9hZGVkIGFuZCBpbnN0YWxsZWQsCnBhY2thZ2VzIG1hcmtlZCBmb3Ig ZGVsZXRpb24gYXJlIHJlbW92ZWQsIGFuZCBwYWNrYWdlcyBtYXJrZWQgZm9yCnVwZ3JhZGluZyBh cmUgZG93bmxvYWRlZCBhbmQgdXBncmFkZWQuCgpJZiBubyBwYWNrYWdlcyBhcmUgbWFya2VkLCB0 aGUgYWN0aW9uIHRha2VuIGRlcGVuZHMgb24gdGhlIHN0YXRlCm9mIHRoZSBwYWNrYWdlIHVuZGVy IHBvaW50LiAgSWYgaXQncyBub3QgYWxyZWFkeSBpbnN0YWxsZWQsIHRoaXMKY29tbWFuZCB3aWxs IGluc3RhbGwgdGhlIHBhY2thZ2UsIGFuZCBpZiBpdCdzIGluc3RhbGxlZCwgaXQgd2lsbApkZWxl dGUgdGhlIHBhY2thZ2UuCgpPcHRpb25hbCBhcmd1bWVudCBOT1FVRVJZIG5vbi1uaWwgbWVhbnMg ZG8gbm90IGFzayB0aGUgdXNlciB0byBjb25maXJtLiIKICAoaW50ZXJhY3RpdmUgbmlsIHBhY2th Z2UtbWVudS1tb2RlKQogIChwYWNrYWdlLS1lbnN1cmUtcGFja2FnZS1tZW51LW1vZGUpCiAgKGxl dCAoaW5zdGFsbC1saXN0IGRlbGV0ZS1saXN0IGNtZCBwa2ctZGVzYykKICAgIChzYXZlLWV4Y3Vy c2lvbgogICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICAgICAod2hpbGUgKG5vdCAoZW9i cCkpCiAgICAgICAgKHNldHEgY21kIChjaGFyLWFmdGVyKSkKICAgICAgICAodW5sZXNzIChlcSBj bWQgP1xzKQogICAgICAgICAgOzsgVGhpcyBpcyB0aGUga2V5IFBLRy1ERVNDLgogICAgICAgICAg KHNldHEgcGtnLWRlc2MgKHRhYnVsYXRlZC1saXN0LWdldC1pZCkpCiAgICAgICAgICAoY29uZCAo KGVxIGNtZCA/RCkKICAgICAgICAgICAgICAgICAocHVzaCBwa2ctZGVzYyBkZWxldGUtbGlzdCkp CiAgICAgICAgICAgICAgICAoKGVxIGNtZCA/SSkKICAgICAgICAgICAgICAgICAocHVzaCBwa2ct ZGVzYyBpbnN0YWxsLWxpc3QpKSkpCiAgICAgICAgKGZvcndhcmQtbGluZSkpKQogICAgOzsgTm90 aGluZyBtYXJrZWQuCiAgICAodW5sZXNzIChvciBkZWxldGUtbGlzdCBpbnN0YWxsLWxpc3QpCiAg ICAgIDs7IE5vdCBvbiBhIHBhY2thZ2UgbGluZS4KICAgICAgKHVubGVzcyAodGFidWxhdGVkLWxp c3QtZ2V0LWlkKQogICAgICAgICh1c2VyLWVycm9yICJObyBvcGVyYXRpb25zIHNwZWNpZmllZCIp KQogICAgICAobGV0KiAoKGlkICh0YWJ1bGF0ZWQtbGlzdC1nZXQtaWQpKQogICAgICAgICAgICAg KHN0YXR1cyAocGFja2FnZS1tZW51LWdldC1zdGF0dXMpKSkKICAgICAgICAoY29uZAogICAgICAg ICAoKG1lbWJlciBzdGF0dXMgJygiaW5zdGFsbGVkIikpCiAgICAgICAgICAocHVzaCBpZCBkZWxl dGUtbGlzdCkpCiAgICAgICAgICgobWVtYmVyIHN0YXR1cyAnKCJhdmFpbGFibGUiICJhdmFpbC1v YnNvIiAibmV3IiAiZGVwZW5kZW5jeSIpKQogICAgICAgICAgKHB1c2ggaWQgaW5zdGFsbC1saXN0 KSkKICAgICAgICAgKHQgKHVzZXItZXJyb3IgIk5vIGRlZmF1bHQgYWN0aW9uIGF2YWlsYWJsZSBm b3Igc3RhdHVzOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKSkpKSkKICAgIChs ZXQtYWxpc3QgKHBhY2thZ2UtbWVudS0tcGFydGl0aW9uLXRyYW5zYWN0aW9uIGluc3RhbGwtbGlz dCBkZWxldGUtbGlzdCkKICAgICAgKHdoZW4gKG9yIG5vcXVlcnkKICAgICAgICAgICAgICAgIChw YWNrYWdlLW1lbnUtLXByb21wdC10cmFuc2FjdGlvbi1wIC5kZWxldGUgLmluc3RhbGwgLnVwZ3Jh ZGUpKQogICAgICAgIChsZXQgKChtZXNzYWdlLXRlbXBsYXRlCiAgICAgICAgICAgICAgIChjb25j YXQgIlsgIgogICAgICAgICAgICAgICAgICAgICAgICh3aGVuIC5kZWxldGUKICAgICAgICAgICAg ICAgICAgICAgICAgIChmb3JtYXQgIkRlbGV0ZSAlZCAiIChsZW5ndGggLmRlbGV0ZSkpKQogICAg ICAgICAgICAgICAgICAgICAgICh3aGVuIC5pbnN0YWxsCiAgICAgICAgICAgICAgICAgICAgICAg ICAoZm9ybWF0ICJJbnN0YWxsICVkICIgKGxlbmd0aCAuaW5zdGFsbCkpKQogICAgICAgICAgICAg ICAgICAgICAgICh3aGVuIC51cGdyYWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0 ICJVcGdyYWRlICVkICIgKGxlbmd0aCAudXBncmFkZSkpKQogICAgICAgICAgICAgICAgICAgICAg ICJdIikpKQogICAgICAgICAgKG1lc3NhZ2UgIk9wZXJhdGlvbiAlcyBzdGFydGVkIiBtZXNzYWdl LXRlbXBsYXRlKQogICAgICAgICAgOzsgUGFja2FnZXMgYmVpbmcgdXBncmFkZWQgYXJlIG5vdCBt YXJrZWQgYXMgc2VsZWN0ZWQuCiAgICAgICAgICAocGFja2FnZS0tdXBkYXRlLXNlbGVjdGVkLXBh Y2thZ2VzIC5pbnN0YWxsIC5kZWxldGUpCiAgICAgICAgICAodW5sZXNzIChwYWNrYWdlLW1lbnUt LXBlcmZvcm0tdHJhbnNhY3Rpb24gaW5zdGFsbC1saXN0IGRlbGV0ZS1saXN0KQogICAgICAgICAg ICA7OyBJZiB0aGVyZSB3ZXJlbid0IGVycm9ycywgb3V0cHV0IGRhdGEuCiAgICAgICAgICAgIChp Zi1sZXQqICgocmVtb3ZhYmxlIChwYWNrYWdlLS1yZW1vdmFibGUtcGFja2FnZXMpKSkKICAgICAg ICAgICAgICAgIChtZXNzYWdlICJPcGVyYXRpb24gZmluaXNoZWQuICBQYWNrYWdlcyB0aGF0IGFy ZSBubyBsb25nZXIgbmVlZGVkOiAlZC4gIFR5cGUgYCVzJyB0byByZW1vdmUgdGhlbSIKICAgICAg ICAgICAgICAgICAgICAgICAgIChsZW5ndGggcmVtb3ZhYmxlKQogICAgICAgICAgICAgICAgICAg ICAgICAgKHN1YnN0aXR1dGUtY29tbWFuZC1rZXlzICJcXFtwYWNrYWdlLWF1dG9yZW1vdmVdIikp CiAgICAgICAgICAgICAgKG1lc3NhZ2UgIk9wZXJhdGlvbiAlcyBmaW5pc2hlZCIgbWVzc2FnZS10 ZW1wbGF0ZSkpKSkpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LS12ZXJzaW9uLXByZWRpY2F0ZSAo QSBCKQogICJQcmVkaWNhdGUgdG8gc29ydCBcIipQYWNrYWdlcypcIiBidWZmZXIgYnkgdGhlIHZl cnNpb24gY29sdW1uLgpUaGlzIGlzIHVzZWQgZm9yIGB0YWJ1bGF0ZWQtbGlzdC1mb3JtYXQnIGlu IGBwYWNrYWdlLW1lbnUtbW9kZScuIgogIChsZXQgKCh2QSAob3IgKHZlcnNpb24tdG8tbGlzdCAo YXJlZiAoY2FkciBBKSAxKSkgJygwKSkpCiAgICAgICAgKHZCIChvciAodmVyc2lvbi10by1saXN0 IChhcmVmIChjYWRyIEIpIDEpKSAnKDApKSkpCiAgICAoaWYgKHZlcnNpb24tbGlzdC09IHZBIHZC KQogICAgICAgIChwYWNrYWdlLW1lbnUtLW5hbWUtcHJlZGljYXRlIEEgQikKICAgICAgKHZlcnNp b24tbGlzdC08IHZBIHZCKSkpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS0tc3RhdHVzLXByZWRpY2F0 ZSAoQSBCKQogICJQcmVkaWNhdGUgdG8gc29ydCBcIipQYWNrYWdlcypcIiBidWZmZXIgYnkgdGhl IHN0YXR1cyBjb2x1bW4uClRoaXMgaXMgdXNlZCBmb3IgYHRhYnVsYXRlZC1saXN0LWZvcm1hdCcg aW4gYHBhY2thZ2UtbWVudS1tb2RlJy4iCiAgKGxldCAoKHNBIChhcmVmIChjYWRyIEEpIDIpKQog ICAgICAgIChzQiAoYXJlZiAoY2FkciBCKSAyKSkpCiAgICAoY29uZCAoKHN0cmluZz0gc0Egc0Ip CiAgICAgICAgICAgKHBhY2thZ2UtbWVudS0tbmFtZS1wcmVkaWNhdGUgQSBCKSkKICAgICAgICAg ICgoc3RyaW5nPSBzQSAibmV3IikgdCkKICAgICAgICAgICgoc3RyaW5nPSBzQiAibmV3Iikgbmls KQogICAgICAgICAgKChzdHJpbmctcHJlZml4LXAgImF2YWlsIiBzQSkKICAgICAgICAgICAoaWYg KHN0cmluZy1wcmVmaXgtcCAiYXZhaWwiIHNCKQogICAgICAgICAgICAgICAocGFja2FnZS1tZW51 LS1uYW1lLXByZWRpY2F0ZSBBIEIpCiAgICAgICAgICAgICB0KSkKICAgICAgICAgICgoc3RyaW5n LXByZWZpeC1wICJhdmFpbCIgc0IpIG5pbCkKICAgICAgICAgICgoc3RyaW5nPSBzQSAiaW5zdGFs bGVkIikgdCkKICAgICAgICAgICgoc3RyaW5nPSBzQiAiaW5zdGFsbGVkIikgbmlsKQogICAgICAg ICAgKChzdHJpbmc9IHNBICJkZXBlbmRlbmN5IikgdCkKICAgICAgICAgICgoc3RyaW5nPSBzQiAi ZGVwZW5kZW5jeSIpIG5pbCkKICAgICAgICAgICgoc3RyaW5nPSBzQSAic291cmNlIikgdCkKICAg ICAgICAgICgoc3RyaW5nPSBzQiAic291cmNlIikgbmlsKQogICAgICAgICAgKChzdHJpbmc9IHNB ICJ1bnNpZ25lZCIpIHQpCiAgICAgICAgICAoKHN0cmluZz0gc0IgInVuc2lnbmVkIikgbmlsKQog ICAgICAgICAgKChzdHJpbmc9IHNBICJoZWxkIikgdCkKICAgICAgICAgICgoc3RyaW5nPSBzQiAi aGVsZCIpIG5pbCkKICAgICAgICAgICgoc3RyaW5nPSBzQSAiZXh0ZXJuYWwiKSB0KQogICAgICAg ICAgKChzdHJpbmc9IHNCICJleHRlcm5hbCIpIG5pbCkKICAgICAgICAgICgoc3RyaW5nPSBzQSAi YnVpbHQtaW4iKSB0KQogICAgICAgICAgKChzdHJpbmc9IHNCICJidWlsdC1pbiIpIG5pbCkKICAg ICAgICAgICgoc3RyaW5nPSBzQSAib2Jzb2xldGUiKSB0KQogICAgICAgICAgKChzdHJpbmc9IHNC ICJvYnNvbGV0ZSIpIG5pbCkKICAgICAgICAgICgoc3RyaW5nPSBzQSAiaW5jb21wYXQiKSB0KQog ICAgICAgICAgKChzdHJpbmc9IHNCICJpbmNvbXBhdCIpIG5pbCkKICAgICAgICAgICh0IChzdHJp bmc8IHNBIHNCKSkpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtLWRlc2NyaXB0aW9uLXByZWRpY2F0 ZSAoQSBCKQogICJQcmVkaWNhdGUgdG8gc29ydCBcIipQYWNrYWdlcypcIiBidWZmZXIgYnkgdGhl IGRlc2NyaXB0aW9uIGNvbHVtbi4KVGhpcyBpcyB1c2VkIGZvciBgdGFidWxhdGVkLWxpc3QtZm9y bWF0JyBpbiBgcGFja2FnZS1tZW51LW1vZGUnLiIKICAobGV0ICgoZEEgKGFyZWYgKGNhZHIgQSkg KGlmIChjZHIgcGFja2FnZS1hcmNoaXZlcykgNCAzKSkpCiAgICAgICAgKGRCIChhcmVmIChjYWRy IEIpIChpZiAoY2RyIHBhY2thZ2UtYXJjaGl2ZXMpIDQgMykpKSkKICAgIChpZiAoc3RyaW5nPSBk QSBkQikKICAgICAgICAocGFja2FnZS1tZW51LS1uYW1lLXByZWRpY2F0ZSBBIEIpCiAgICAgIChz dHJpbmc8IGRBIGRCKSkpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS0tbmFtZS1wcmVkaWNhdGUgKEEg QikKICAiUHJlZGljYXRlIHRvIHNvcnQgXCIqUGFja2FnZXMqXCIgYnVmZmVyIGJ5IHRoZSBuYW1l IGNvbHVtbi4KVGhpcyBpcyB1c2VkIGZvciBgdGFidWxhdGVkLWxpc3QtZm9ybWF0JyBpbiBgcGFj a2FnZS1tZW51LW1vZGUnLiIKICAoc3RyaW5nPCAoc3ltYm9sLW5hbWUgKHBhY2thZ2UtZGVzYy1u YW1lIChjYXIgQSkpKQogICAgICAgICAgIChzeW1ib2wtbmFtZSAocGFja2FnZS1kZXNjLW5hbWUg KGNhciBCKSkpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtLWFyY2hpdmUtcHJlZGljYXRlIChBIEIp CiAgIlByZWRpY2F0ZSB0byBzb3J0IFwiKlBhY2thZ2VzKlwiIGJ1ZmZlciBieSB0aGUgYXJjaGl2 ZSBjb2x1bW4uClRoaXMgaXMgdXNlZCBmb3IgYHRhYnVsYXRlZC1saXN0LWZvcm1hdCcgaW4gYHBh Y2thZ2UtbWVudS1tb2RlJy4iCiAgKGxldCAoKGEgKG9yIChwYWNrYWdlLWRlc2MtYXJjaGl2ZSAo Y2FyIEEpKSAiIikpCiAgICAgICAgKGIgKG9yIChwYWNrYWdlLWRlc2MtYXJjaGl2ZSAoY2FyIEIp KSAiIikpKQogICAgKGlmIChzdHJpbmc9IGEgYikKICAgICAgICAocGFja2FnZS1tZW51LS1uYW1l LXByZWRpY2F0ZSBBIEIpCiAgICAgIChzdHJpbmc8IGEgYikpKSkKCihkZWZ1biBwYWNrYWdlLW1l bnUtLXBvcHVsYXRlLW5ldy1wYWNrYWdlLWxpc3QgKCkKICAiRGVjaWRlIHdoaWNoIHBhY2thZ2Vz IGFyZSBuZXcgaW4gYHBhY2thZ2UtYXJjaGl2ZS1jb250ZW50cycuClN0b3JlIHRoaXMgbGlzdCBp biBgcGFja2FnZS1tZW51LS1uZXctcGFja2FnZS1saXN0Jy4iCiAgOzsgRmluZCB3aGljaCBwYWNr YWdlcyBhcmUgbmV3LgogICh3aGVuIHBhY2thZ2UtbWVudS0tb2xkLWFyY2hpdmUtY29udGVudHMK ICAgIChkb2xpc3QgKGVsdCBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMpCiAgICAgICh1bmxlc3Mg KGFzc3EgKGNhciBlbHQpIHBhY2thZ2UtbWVudS0tb2xkLWFyY2hpdmUtY29udGVudHMpCiAgICAg ICAgKHB1c2ggKGNhciBlbHQpIHBhY2thZ2UtbWVudS0tbmV3LXBhY2thZ2UtbGlzdCkpKQogICAg KHNldHEgcGFja2FnZS1tZW51LS1vbGQtYXJjaGl2ZS1jb250ZW50cyBuaWwpKSkKCihkZWZ1biBw YWNrYWdlLW1lbnUtLWZpbmQtYW5kLW5vdGlmeS11cGdyYWRlcyAoKQogICJOb3RpZnkgdGhlIHVz ZXIgb2YgdXBncmFkYWJsZSBwYWNrYWdlcy4iCiAgKHdoZW4tbGV0KiAoKHVwZ3JhZGVzIChwYWNr YWdlLW1lbnUtLWZpbmQtdXBncmFkZXMpKSkKICAgIChtZXNzYWdlICJQYWNrYWdlcyB0aGF0IGNh biBiZSB1cGdyYWRlZDogJWQ7IHR5cGUgYCVzJyB0byBtYXJrIGZvciB1cGdyYWRpbmcuIgogICAg ICAgICAgICAgKGxlbmd0aCB1cGdyYWRlcykKICAgICAgICAgICAgIChzdWJzdGl0dXRlLWNvbW1h bmQta2V5cyAiXFxbcGFja2FnZS1tZW51LW1hcmstdXBncmFkZXNdIikpKSkKCgooZGVmdW4gcGFj a2FnZS1tZW51LS1wb3N0LXJlZnJlc2ggKCkKICAiUmV2ZXJ0IFwiKlBhY2thZ2VzKlwiIGJ1ZmZl ciBhbmQgY2hlY2sgZm9yIG5ldyBwYWNrYWdlcyBhbmQgdXBncmFkZXMuCkRvIG5vdGhpbmcgaWYg dGhlcmUncyBubyAqUGFja2FnZXMqIGJ1ZmZlci4KClRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFm dGVyIGBwYWNrYWdlLXJlZnJlc2gtY29udGVudHMnIGFuZCBpdAppcyBhZGRlZCB0byBgcG9zdC1j b21tYW5kLWhvb2snIGJ5IGFueSBmdW5jdGlvbiB3aGljaCBhbHRlcnMgdGhlCnBhY2thZ2UgZGF0 YWJhc2UgKGBwYWNrYWdlLWluc3RhbGwnIGFuZCBgcGFja2FnZS1kZWxldGUnKS4gIFdoZW4KcnVu LCBpdCByZW1vdmVzIGl0c2VsZiBmcm9tIGBwb3N0LWNvbW1hbmQtaG9vaycuIgogIChyZW1vdmUt aG9vayAncG9zdC1jb21tYW5kLWhvb2sgIydwYWNrYWdlLW1lbnUtLXBvc3QtcmVmcmVzaCkKICAo bGV0ICgoYnVmIChnZXQtYnVmZmVyICIqUGFja2FnZXMqIikpKQogICAgKHdoZW4gKGJ1ZmZlci1s aXZlLXAgYnVmKQogICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWYKICAgICAgICAocGFja2Fn ZS1tZW51LS1wb3B1bGF0ZS1uZXctcGFja2FnZS1saXN0KQogICAgICAgIChydW4taG9va3MgJ3Rh YnVsYXRlZC1saXN0LXJldmVydC1ob29rKQogICAgICAgICh0YWJ1bGF0ZWQtbGlzdC1wcmludCAn cmVtZW1iZXIgJ3VwZGF0ZSkpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LS1tYXJrLW9yLW5vdGlm eS11cGdyYWRlcyAoKQogICJJZiB0aGVyZSdzIGEgKlBhY2thZ2VzKiBidWZmZXIsIGNoZWNrIGZv ciB1cGdyYWRlcyBhbmQgcG9zc2libHkgbWFyayB0aGVtLgpEbyBub3RoaW5nIGlmIHRoZXJlJ3Mg bm8gKlBhY2thZ2VzKiBidWZmZXIuICBJZiB0aGVyZSBhcmUKdXBncmFkZXMsIG1hcmsgdGhlbSBp ZiBgcGFja2FnZS1tZW51LS1tYXJrLXVwZ3JhZGVzLXBlbmRpbmcnIGlzCm5vbi1uaWwsIG90aGVy d2lzZSBqdXN0IG5vdGlmeSB0aGUgdXNlciB0aGF0IHRoZXJlIGFyZSB1cGdyYWRlcy4KVGhpcyBm dW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYHBhY2thZ2UtcmVmcmVzaC1jb250ZW50cycuIgogIChs ZXQgKChidWYgKGdldC1idWZmZXIgIipQYWNrYWdlcyoiKSkpCiAgICAod2hlbiAoYnVmZmVyLWxp dmUtcCBidWYpCiAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZgogICAgICAgIChpZiBwYWNr YWdlLW1lbnUtLW1hcmstdXBncmFkZXMtcGVuZGluZwogICAgICAgICAgICAocGFja2FnZS1tZW51 LS1tYXJrLXVwZ3JhZGVzLTEpCiAgICAgICAgICAocGFja2FnZS1tZW51LS1maW5kLWFuZC1ub3Rp ZnktdXBncmFkZXMpKSkpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBsaXN0LXBhY2thZ2VzICgm b3B0aW9uYWwgbm8tZmV0Y2gpCiAgIkRpc3BsYXkgYSBsaXN0IG9mIHBhY2thZ2VzLgpUaGlzIGZp cnN0IGZldGNoZXMgdGhlIHVwZGF0ZWQgbGlzdCBvZiBwYWNrYWdlcyBiZWZvcmUKZGlzcGxheWlu ZywgdW5sZXNzIGEgcHJlZml4IGFyZ3VtZW50IE5PLUZFVENIIGlzIHNwZWNpZmllZC4KVGhlIGxp c3QgaXMgZGlzcGxheWVkIGluIGEgYnVmZmVyIG5hbWVkIGAqUGFja2FnZXMqJywgYW5kCmluY2x1 ZGVzIHRoZSBwYWNrYWdlJ3MgdmVyc2lvbiwgYXZhaWxhYmlsaXR5IHN0YXR1cywgYW5kIGEKc2hv cnQgZGVzY3JpcHRpb24uIgogIChpbnRlcmFjdGl2ZSAiUCIpCiAgKHJlcXVpcmUgJ2ZpbmRlci1p bmYgbmlsIHQpCiAgOzsgSW5pdGlhbGl6ZSB0aGUgcGFja2FnZSBzeXN0ZW0gaWYgbmVjZXNzYXJ5 LgogICh1bmxlc3MgcGFja2FnZS0taW5pdGlhbGl6ZWQKICAgIChwYWNrYWdlLWluaXRpYWxpemUg dCkpCiAgOzsgSW50ZWdyYXRlIHRoZSBwYWNrYWdlLW1lbnUgd2l0aCB1cGRhdGluZyB0aGUgYXJj aGl2ZXMuCiAgKGFkZC1ob29rICdwYWNrYWdlLS1wb3N0LWRvd25sb2FkLWFyY2hpdmVzLWhvb2sK ICAgICAgICAgICAgIydwYWNrYWdlLW1lbnUtLXBvc3QtcmVmcmVzaCkKICAoYWRkLWhvb2sgJ3Bh Y2thZ2UtLXBvc3QtZG93bmxvYWQtYXJjaGl2ZXMtaG9vawogICAgICAgICAgICAjJ3BhY2thZ2Ut bWVudS0tbWFyay1vci1ub3RpZnktdXBncmFkZXMgJ2FwcGVuZCkKCiAgOzsgR2VuZXJhdGUgdGhl IFBhY2thZ2UgTWVudS4KICAobGV0ICgoYnVmIChnZXQtYnVmZmVyLWNyZWF0ZSAiKlBhY2thZ2Vz KiIpKSkKICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZgogICAgICA7OyBTaW5jZSBzb21lIHBh Y2thZ2VzIGhhdmUgdGhlaXIgZGVzY3JpcHRpb25zIGluY2x1ZGUgbm9uLUFTQ0lJCiAgICAgIDs7 IGNoYXJhY3RlcnMuLi4KICAgICAgKHNldHEgYnVmZmVyLWZpbGUtY29kaW5nLXN5c3RlbSAndXRm LTgpCiAgICAgIChwYWNrYWdlLW1lbnUtbW9kZSkKCiAgICAgIDs7IEZldGNoIHRoZSByZW1vdGUg bGlzdCBvZiBwYWNrYWdlcy4KICAgICAgKHVubGVzcyBuby1mZXRjaCAocGFja2FnZS1tZW51LS1y ZWZyZXNoLWNvbnRlbnRzKSkKCiAgICAgIDs7IElmIHdlJ3JlIG5vdCBhc3luYywgdGhpcyB3b3Vs ZCBiZSByZWR1bmRhbnQuCiAgICAgICh3aGVuIHBhY2thZ2UtbWVudS1hc3luYwogICAgICAgIChw YWNrYWdlLW1lbnUtLWdlbmVyYXRlIG5pbCB0KSkpCiAgICA7OyBUaGUgcGFja2FnZSBtZW51IGJ1 ZmZlciBoYXMga2V5YmluZGluZ3MuICBJZiB0aGUgdXNlciB0eXBlcwogICAgOzsgYE0teCBsaXN0 LXBhY2thZ2VzJywgdGhhdCBzdWdnZXN0cyBpdCBzaG91bGQgYmVjb21lIGN1cnJlbnQuCiAgICAo cG9wLXRvLWJ1ZmZlci1zYW1lLXdpbmRvdyBidWYpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZhbGlh cyAncGFja2FnZS1saXN0LXBhY2thZ2VzICdsaXN0LXBhY2thZ2VzKQoKOzsgVXNlZCBpbiBmaW5k ZXIuZWwKKGRlZnVuIHBhY2thZ2Utc2hvdy1wYWNrYWdlLWxpc3QgKCZvcHRpb25hbCBwYWNrYWdl cyBrZXl3b3JkcykKICAiRGlzcGxheSBQQUNLQUdFUyBpbiBhICpQYWNrYWdlcyogYnVmZmVyLgpU aGlzIGlzIHNpbWlsYXIgdG8gYGxpc3QtcGFja2FnZXMnLCBidXQgaXQgZG9lcyBub3QgZmV0Y2gg dGhlCnVwZGF0ZWQgbGlzdCBvZiBwYWNrYWdlcywgYW5kIGl0IG9ubHkgZGlzcGxheXMgcGFja2Fn ZXMgd2l0aApuYW1lcyBpbiBQQUNLQUdFUyAod2hpY2ggc2hvdWxkIGJlIGEgbGlzdCBvZiBzeW1i b2xzKS4KCldoZW4gS0VZV09SRFMgYXJlIGdpdmVuLCBvbmx5IHBhY2thZ2VzIHdpdGggdGhvc2Ug S0VZV09SRFMgYXJlCnNob3duLiIKICAoaW50ZXJhY3RpdmUpCiAgKHJlcXVpcmUgJ2ZpbmRlci1p bmYgbmlsIHQpCiAgKGxldCogKChidWYgKGdldC1idWZmZXItY3JlYXRlICIqUGFja2FnZXMqIikp CiAgICAgICAgICh3aW4gKGdldC1idWZmZXItd2luZG93IGJ1ZikpKQogICAgKHdpdGgtY3VycmVu dC1idWZmZXIgYnVmCiAgICAgIChwYWNrYWdlLW1lbnUtbW9kZSkKICAgICAgKHBhY2thZ2UtbWVu dS0tZ2VuZXJhdGUgbmlsIHBhY2thZ2VzIGtleXdvcmRzKSkKICAgIChpZiB3aW4KICAgICAgICAo c2VsZWN0LXdpbmRvdyB3aW4pCiAgICAgIChzd2l0Y2gtdG8tYnVmZmVyIGJ1ZikpKSkKCihkZWZ1 biBwYWNrYWdlLW1lbnUtLWZpbHRlci1ieSAocHJlZGljYXRlIHN1ZmZpeCkKICAiRmlsdGVyIFwi KlBhY2thZ2VzKlwiIGJ1ZmZlciBieSBQUkVESUNBVEUgYW5kIGFkZCBTVUZGSVggdG8gaGVhZGVy LgpQUkVESUNBVEUgaXMgYSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aXRoIG9uZSBh cmd1bWVudCwgYQpgcGFja2FnZS1kZXNjJyBvYmplY3QsIGFuZCByZXR1cm5zIHQgaWYgdGhhdCBv YmplY3Qgc2hvdWxkIGJlCmxpc3RlZCBpbiB0aGUgUGFja2FnZSBNZW51LgoKU1VGRklYIGlzIHBh c3NlZCBvbiB0byBgcGFja2FnZS1tZW51LS1kaXNwbGF5JyBhbmQgaXMgYWRkZWQgdG8KdGhlIGhl YWRlciBsaW5lIG9mIHRoZSBmaXJzdCBjb2x1bW4uIgogIDs7IFVwZGF0ZSBgdGFidWxhdGVkLWxp c3QtZW50cmllcycgc28gdGhhdCBpdCBjb250YWlucyBhbGwKICA7OyBwYWNrYWdlcyBiZWZvcmUg c2VhcmNoaW5nLgogIChwYWNrYWdlLW1lbnUtLXJlZnJlc2ggdCBuaWwpCiAgKGxldCAoZm91bmQt ZW50cmllcykKICAgIChkb2xpc3QgKGVudHJ5IHRhYnVsYXRlZC1saXN0LWVudHJpZXMpCiAgICAg ICh3aGVuIChmdW5jYWxsIHByZWRpY2F0ZSAoY2FyIGVudHJ5KSkKICAgICAgICAocHVzaCBlbnRy eSBmb3VuZC1lbnRyaWVzKSkpCiAgICAoaWYgZm91bmQtZW50cmllcwogICAgICAgIChwcm9nbgog ICAgICAgICAgKHNldHEgdGFidWxhdGVkLWxpc3QtZW50cmllcyBmb3VuZC1lbnRyaWVzKQogICAg ICAgICAgKHBhY2thZ2UtbWVudS0tZGlzcGxheSB0IHN1ZmZpeCkpCiAgICAgICh1c2VyLWVycm9y ICJObyBwYWNrYWdlcyBmb3VuZCIpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LWZpbHRlci1ieS1h cmNoaXZlIChhcmNoaXZlKQogICJGaWx0ZXIgdGhlIFwiKlBhY2thZ2VzKlwiIGJ1ZmZlciBieSBB UkNISVZFLgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgZnJvbSBwYWNrYWdlIGFyY2hpdmUgQVJDSElW RS4KCldoZW4gY2FsbGVkIGludGVyYWN0aXZlbHksIHByb21wdCBmb3IgQVJDSElWRSwgd2hpY2gg Y2FuIGJlIGEKY29tbWEtc2VwYXJhdGVkIHN0cmluZy4gIElmIEFSQ0hJVkUgaXMgZW1wdHksIHNo b3cgYWxsIHBhY2thZ2VzLgoKV2hlbiBjYWxsZWQgZnJvbSBMaXNwLCBBUkNISVZFIGNhbiBiZSBh IHN0cmluZyBvciBhIGxpc3Qgb2YKc3RyaW5ncy4gIElmIEFSQ0hJVkUgaXMgbmlsIG9yIHRoZSBl bXB0eSBzdHJpbmcsIHNob3cgYWxsCnBhY2thZ2VzLiIKICAoaW50ZXJhY3RpdmUgKGxpc3QgKGNv bXBsZXRpbmctcmVhZC1tdWx0aXBsZQogICAgICAgICAgICAgICAgICAgICAgIkZpbHRlciBieSBh cmNoaXZlIChjb21tYSBzZXBhcmF0ZWQpOiAiCiAgICAgICAgICAgICAgICAgICAgICAobWFwY2Fy ICMnY2FyIHBhY2thZ2UtYXJjaGl2ZXMpKSkKICAgICAgICAgICAgICAgcGFja2FnZS1tZW51LW1v ZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdlLW1lbnUtbW9kZSkKICAobGV0ICgoYXJjaGl2 ZXMgKGVuc3VyZS1saXN0IGFyY2hpdmUpKSkKICAgIChwYWNrYWdlLW1lbnUtLWZpbHRlci1ieQog ICAgIChsYW1iZGEgKHBrZy1kZXNjKQogICAgICAgKGxldCAoKHBrZy1hcmNoaXZlIChwYWNrYWdl LWRlc2MtYXJjaGl2ZSBwa2ctZGVzYykpKQogICAgICAgICAob3IgKG51bGwgYXJjaGl2ZXMpCiAg ICAgICAgICAgICAoYW5kIHBrZy1hcmNoaXZlCiAgICAgICAgICAgICAgICAgIChtZW1iZXIgcGtn LWFyY2hpdmUgYXJjaGl2ZXMpKSkpKQogICAgIChjb25jYXQgImFyY2hpdmU6IiAoc3RyaW5nLWpv aW4gYXJjaGl2ZXMgIiwiKSkpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUtZmlsdGVyLWJ5LWRlc2Ny aXB0aW9uIChkZXNjcmlwdGlvbikKICAiRmlsdGVyIHRoZSBcIipQYWNrYWdlcypcIiBidWZmZXIg YnkgREVTQ1JJUFRJT04gcmVnZXhwLgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgd2l0aCBhIGRlc2Ny aXB0aW9uIHRoYXQgbWF0Y2hlcyByZWdleHAKREVTQ1JJUFRJT04uCgpXaGVuIGNhbGxlZCBpbnRl cmFjdGl2ZWx5LCBwcm9tcHQgZm9yIERFU0NSSVBUSU9OLgoKSWYgREVTQ1JJUFRJT04gaXMgbmls IG9yIHRoZSBlbXB0eSBzdHJpbmcsIHNob3cgYWxsIHBhY2thZ2VzLiIKICAoaW50ZXJhY3RpdmUg KGxpc3QgKHJlYWQtcmVnZXhwICJGaWx0ZXIgYnkgZGVzY3JpcHRpb24gKHJlZ2V4cCkiKSkKICAg ICAgICAgICAgICAgcGFja2FnZS1tZW51LW1vZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdl LW1lbnUtbW9kZSkKICAoaWYgKG9yIChub3QgZGVzY3JpcHRpb24pIChzdHJpbmctZW1wdHktcCBk ZXNjcmlwdGlvbikpCiAgICAgIChwYWNrYWdlLW1lbnUtLWdlbmVyYXRlIHQgdCkKICAgIChwYWNr YWdlLW1lbnUtLWZpbHRlci1ieSAobGFtYmRhIChwa2ctZGVzYykKICAgICAgICAgICAgICAgICAg ICAgICAgKHN0cmluZy1tYXRjaCBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChwYWNrYWdlLWRlc2Mtc3VtbWFyeSBwa2ctZGVzYykpKQogICAgICAgICAg ICAgICAgICAgICAgKGZvcm1hdCAiZGVzYzolcyIgZGVzY3JpcHRpb24pKSkpCgooZGVmdW4gcGFj a2FnZS1tZW51LWZpbHRlci1ieS1rZXl3b3JkIChrZXl3b3JkKQogICJGaWx0ZXIgdGhlIFwiKlBh Y2thZ2VzKlwiIGJ1ZmZlciBieSBLRVlXT1JELgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgd2l0aCBz cGVjaWZpZWQgS0VZV09SRC4KCldoZW4gY2FsbGVkIGludGVyYWN0aXZlbHksIHByb21wdCBmb3Ig S0VZV09SRCwgd2hpY2ggY2FuIGJlIGEKY29tbWEtc2VwYXJhdGVkIHN0cmluZy4gIElmIEtFWVdP UkQgaXMgZW1wdHksIHNob3cgYWxsIHBhY2thZ2VzLgoKV2hlbiBjYWxsZWQgZnJvbSBMaXNwLCBL RVlXT1JEIGNhbiBiZSBhIHN0cmluZyBvciBhIGxpc3Qgb2YKc3RyaW5ncy4gIElmIEtFWVdPUkQg aXMgbmlsIG9yIHRoZSBlbXB0eSBzdHJpbmcsIHNob3cgYWxsCnBhY2thZ2VzLiIKICAoaW50ZXJh Y3RpdmUgKGxpc3QgKGNvbXBsZXRpbmctcmVhZC1tdWx0aXBsZQogICAgICAgICAgICAgICAgICAg ICAgIktleXdvcmRzIChjb21tYSBzZXBhcmF0ZWQpOiAiCiAgICAgICAgICAgICAgICAgICAgICAo cGFja2FnZS1hbGwta2V5d29yZHMpKSkKICAgICAgICAgICAgICAgcGFja2FnZS1tZW51LW1vZGUp CiAgKHBhY2thZ2UtLWVuc3VyZS1wYWNrYWdlLW1lbnUtbW9kZSkKICAod2hlbiAoc3RyaW5ncCBr ZXl3b3JkKQogICAgKHNldHEga2V5d29yZCAobGlzdCBrZXl3b3JkKSkpCiAgKGlmIChub3Qga2V5 d29yZCkKICAgICAgKHBhY2thZ2UtbWVudS0tZ2VuZXJhdGUgdCB0KQogICAgKHBhY2thZ2UtbWVu dS0tZmlsdGVyLWJ5IChsYW1iZGEgKHBrZy1kZXNjKQogICAgICAgICAgICAgICAgICAgICAgICAo cGFja2FnZS0taGFzLWtleXdvcmQtcCBwa2ctZGVzYyBrZXl3b3JkKSkKICAgICAgICAgICAgICAg ICAgICAgIChjb25jYXQgImtleXdvcmQ6IiAoc3RyaW5nLWpvaW4ga2V5d29yZCAiLCIpKSkpKQoK KGRlZmluZS1vYnNvbGV0ZS1mdW5jdGlvbi1hbGlhcwogICdwYWNrYWdlLW1lbnUtZmlsdGVyICMn cGFja2FnZS1tZW51LWZpbHRlci1ieS1rZXl3b3JkICIyNy4xIikKCihkZWZ1biBwYWNrYWdlLW1l bnUtZmlsdGVyLWJ5LW5hbWUtb3ItZGVzY3JpcHRpb24gKG5hbWUtb3ItZGVzY3JpcHRpb24pCiAg IkZpbHRlciB0aGUgXCIqUGFja2FnZXMqXCIgYnVmZmVyIGJ5IE5BTUUtT1ItREVTQ1JJUFRJT04g cmVnZXhwLgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgd2l0aCBhIG5hbWUtb3ItZGVzY3JpcHRpb24g dGhhdCBtYXRjaGVzIHJlZ2V4cApOQU1FLU9SLURFU0NSSVBUSU9OLgoKV2hlbiBjYWxsZWQgaW50 ZXJhY3RpdmVseSwgcHJvbXB0IGZvciBOQU1FLU9SLURFU0NSSVBUSU9OLgoKSWYgTkFNRS1PUi1E RVNDUklQVElPTiBpcyBuaWwgb3IgdGhlIGVtcHR5IHN0cmluZywgc2hvdyBhbGwKcGFja2FnZXMu IgogIChpbnRlcmFjdGl2ZSAobGlzdCAocmVhZC1yZWdleHAgIkZpbHRlciBieSBuYW1lIG9yIGRl c2NyaXB0aW9uIChyZWdleHApIikpCiAgICAgICAgICAgICAgIHBhY2thZ2UtbWVudS1tb2RlKQog IChwYWNrYWdlLS1lbnN1cmUtcGFja2FnZS1tZW51LW1vZGUpCiAgKGlmIChvciAobm90IG5hbWUt b3ItZGVzY3JpcHRpb24pIChzdHJpbmctZW1wdHktcCBuYW1lLW9yLWRlc2NyaXB0aW9uKSkKICAg ICAgKHBhY2thZ2UtbWVudS0tZ2VuZXJhdGUgdCB0KQogICAgKHBhY2thZ2UtbWVudS0tZmlsdGVy LWJ5IChsYW1iZGEgKHBrZy1kZXNjKQogICAgICAgICAgICAgICAgICAgICAgICAob3IgKHN0cmlu Zy1tYXRjaCBuYW1lLW9yLWRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChwYWNrYWdlLWRlc2Mtc3VtbWFyeSBwa2ctZGVzYykpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoIG5hbWUtb3ItZGVzY3JpcHRpb24KICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbC1uYW1lCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLW5hbWUgcGtn LWRlc2MpKSkpKQogICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAibmFtZS1vci1kZXNjOiVz IiBuYW1lLW9yLWRlc2NyaXB0aW9uKSkpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS1maWx0ZXItYnkt bmFtZSAobmFtZSkKICAiRmlsdGVyIHRoZSBcIipQYWNrYWdlcypcIiBidWZmZXIgYnkgTkFNRSBy ZWdleHAuCkRpc3BsYXkgb25seSBwYWNrYWdlcyB3aXRoIG5hbWUgdGhhdCBtYXRjaGVzIHJlZ2V4 cCBOQU1FLgoKV2hlbiBjYWxsZWQgaW50ZXJhY3RpdmVseSwgcHJvbXB0IGZvciBOQU1FLgoKSWYg TkFNRSBpcyBuaWwgb3IgdGhlIGVtcHR5IHN0cmluZywgc2hvdyBhbGwgcGFja2FnZXMuIgogIChp bnRlcmFjdGl2ZSAobGlzdCAocmVhZC1yZWdleHAgIkZpbHRlciBieSBuYW1lIChyZWdleHApIikp CiAgICAgICAgICAgICAgIHBhY2thZ2UtbWVudS1tb2RlKQogIChwYWNrYWdlLS1lbnN1cmUtcGFj a2FnZS1tZW51LW1vZGUpCiAgKGlmIChvciAobm90IG5hbWUpIChzdHJpbmctZW1wdHktcCBuYW1l KSkKICAgICAgKHBhY2thZ2UtbWVudS0tZ2VuZXJhdGUgdCB0KQogICAgKHBhY2thZ2UtbWVudS0t ZmlsdGVyLWJ5IChsYW1iZGEgKHBrZy1kZXNjKQogICAgICAgICAgICAgICAgICAgICAgICAoc3Ry aW5nLW1hdGNoLXAgbmFtZSAoc3ltYm9sLW5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtbmFtZSBwa2ctZGVzYykpKSkKICAgICAg ICAgICAgICAgICAgICAgIChmb3JtYXQgIm5hbWU6JXMiIG5hbWUpKSkpCgooZGVmdW4gcGFja2Fn ZS1tZW51LWZpbHRlci1ieS1zdGF0dXMgKHN0YXR1cykKICAiRmlsdGVyIHRoZSBcIipQYWNrYWdl cypcIiBidWZmZXIgYnkgU1RBVFVTLgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgd2l0aCBzcGVjaWZp ZWQgU1RBVFVTLgoKV2hlbiBjYWxsZWQgaW50ZXJhY3RpdmVseSwgcHJvbXB0IGZvciBTVEFUVVMs IHdoaWNoIGNhbiBiZSBhCmNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuICBJZiBTVEFUVVMgaXMgZW1w dHksIHNob3cgYWxsIHBhY2thZ2VzLgoKV2hlbiBjYWxsZWQgZnJvbSBMaXNwLCBTVEFUVVMgY2Fu IGJlIGEgc3RyaW5nIG9yIGEgbGlzdCBvZgpzdHJpbmdzLiAgSWYgU1RBVFVTIGlzIG5pbCBvciB0 aGUgZW1wdHkgc3RyaW5nLCBzaG93IGFsbApwYWNrYWdlcy4iCiAgKGludGVyYWN0aXZlIChsaXN0 IChjb21wbGV0aW5nLXJlYWQgIkZpbHRlciBieSBzdGF0dXM6ICIKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAnKCJhdmFpbC1vYnNvIgogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgImF2YWlsYWJsZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICJidWlsdC1pbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICJkZXBlbmRlbmN5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4 dGVybmFsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlbGQiCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb21wYXQiCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGVkIgogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSIKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICJuZXciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAidW5zaWduZWQiKSkpCiAgICAgICAgICAgICAgIHBhY2thZ2UtbWVudS1tb2RlKQog IChwYWNrYWdlLS1lbnN1cmUtcGFja2FnZS1tZW51LW1vZGUpCiAgKGlmIChvciAobm90IHN0YXR1 cykgKHN0cmluZy1lbXB0eS1wIHN0YXR1cykpCiAgICAgIChwYWNrYWdlLW1lbnUtLWdlbmVyYXRl IHQgdCkKICAgIChsZXQgKChzdGF0dXMtbGlzdAogICAgICAgICAgIChpZiAobGlzdHAgc3RhdHVz KQogICAgICAgICAgICAgICBzdGF0dXMKICAgICAgICAgICAgIChzcGxpdC1zdHJpbmcgc3RhdHVz ICIsIikpKSkKICAgICAgKHBhY2thZ2UtbWVudS0tZmlsdGVyLWJ5CiAgICAgICAobGFtYmRhIChw a2ctZGVzYykKICAgICAgICAgKG1lbWJlciAocGFja2FnZS1kZXNjLXN0YXR1cyBwa2ctZGVzYykg c3RhdHVzLWxpc3QpKQogICAgICAgKGZvcm1hdCAic3RhdHVzOiVzIiAoc3RyaW5nLWpvaW4gc3Rh dHVzLWxpc3QgIiwiKSkpKSkpCgooZGVmdW4gcGFja2FnZS1tZW51LWZpbHRlci1ieS12ZXJzaW9u ICh2ZXJzaW9uIHByZWRpY2F0ZSkKICAiRmlsdGVyIHRoZSBcIipQYWNrYWdlcypcIiBidWZmZXIg YnkgVkVSU0lPTiBhbmQgUFJFRElDQVRFLgpEaXNwbGF5IG9ubHkgcGFja2FnZXMgd2l0aCBhIG1h dGNoaW5nIHZlcnNpb24uCgpXaGVuIGNhbGxlZCBpbnRlcmFjdGl2ZWx5LCBwcm9tcHQgZm9yIG9u ZSBvZiB0aGUgcXVhbGlmaWVycyBgPCcsCmA+JyBvciBgPScsIGFuZCBhIHBhY2thZ2UgdmVyc2lv bi4gIFNob3cgb25seSBwYWNrYWdlcyB0aGF0IGhhcyBhCmxvd2VyIChgPCcpLCBlcXVhbCAoYD0n KSBvciBoaWdoZXIgKGA+JykgdmVyc2lvbiB0aGFuIHRoZQpzcGVjaWZpZWQgb25lLgoKV2hlbiBj YWxsZWQgZnJvbSBMaXNwLCBWRVJTSU9OIHNob3VsZCBiZSBhIHZlcnNpb24gc3RyaW5nIGFuZApQ UkVESUNBVEUgc2hvdWxkIGJlIHRoZSBzeW1ib2wgYD0nLCBgPCcgb3IgYD4nLgoKSWYgVkVSU0lP TiBpcyBuaWwgb3IgdGhlIGVtcHR5IHN0cmluZywgc2hvdyBhbGwgcGFja2FnZXMuIgogIChpbnRl cmFjdGl2ZSAobGV0ICgoY2hvaWNlIChpbnRlcm4KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKGNoYXItdG8tc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZC1j aGFyLWNob2ljZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWx0ZXIgYnkgdmVy c2lvbj8gW1R5cGUgPSwgPCwgPiBvciBxXSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJyg/PCA/PiA/PSA/cSkpKSkpKQogICAgICAgICAgICAgICAgIChpZiAoZXEgY2hvaWNlICdx KQogICAgICAgICAgICAgICAgICAgICAnKHF1aXQgbmlsKQogICAgICAgICAgICAgICAgICAgKGxp c3QgKHJlYWQtZnJvbS1taW5pYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNh dCAiRmlsdGVyIGJ5IHZlcnNpb24gKCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChwY2FzZSBjaG9pY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCc9ICI9 IGVxdWFsIHRvIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCc8ICI8IGxl c3MgdGhhbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnPiAiPiBncmVh dGVyIHRoYW4iKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOiAiKSkKICAg ICAgICAgICAgICAgICAgICAgICAgIGNob2ljZSkpKQogICAgICAgICAgICAgICBwYWNrYWdlLW1l bnUtbW9kZSkKICAocGFja2FnZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1tb2RlKQogICh1bmxlc3Mg KGVxdWFsIHByZWRpY2F0ZSAncXVpdCkKICAgIChpZiAob3IgKG5vdCB2ZXJzaW9uKSAoc3RyaW5n LWVtcHR5LXAgdmVyc2lvbikpCiAgICAgICAgKHBhY2thZ2UtbWVudS0tZ2VuZXJhdGUgdCB0KQog ICAgICAocGFja2FnZS1tZW51LS1maWx0ZXItYnkKICAgICAgIChsZXQgKChmdW4gKHBjYXNlIHBy ZWRpY2F0ZQogICAgICAgICAgICAgICAgICAgICgnPSAjJ3ZlcnNpb24tbGlzdC09KQogICAgICAg ICAgICAgICAgICAgICgnPCAjJ3ZlcnNpb24tbGlzdC08KQogICAgICAgICAgICAgICAgICAgICgn PiAobGFtYmRhIChhIGIpIChub3QgKHZlcnNpb24tbGlzdC08PSBhIGIpKSkpCiAgICAgICAgICAg ICAgICAgICAgKF8gKGVycm9yICJVbmtub3duIHByZWRpY2F0ZTogJXMiIHByZWRpY2F0ZSkpKSkK ICAgICAgICAgICAgICh2ZXIgKHZlcnNpb24tdG8tbGlzdCB2ZXJzaW9uKSkpCiAgICAgICAgIChs YW1iZGEgKHBrZy1kZXNjKQogICAgICAgICAgIChmdW5jYWxsIGZ1biAocGFja2FnZS1kZXNjLXZl cnNpb24gcGtnLWRlc2MpIHZlcikpKQogICAgICAgKGZvcm1hdCAidmVyc2lvbnM6JXMlcyIgcHJl ZGljYXRlIHZlcnNpb24pKSkpKQoKKGRlZnVuIHBhY2thZ2UtbWVudS1maWx0ZXItbWFya2VkICgp CiAgIkZpbHRlciBcIipQYWNrYWdlcypcIiBidWZmZXIgYnkgbm9uLWVtcHR5IHVwZ3JhZGUgbWFy ay4KVW5saWtlIG90aGVyIGZpbHRlcnMsIHRoaXMgbGVhdmVzIHRoZSBtYXJrcyBpbnRhY3QuIgog IChpbnRlcmFjdGl2ZSBuaWwgcGFja2FnZS1tZW51LW1vZGUpCiAgKHBhY2thZ2UtLWVuc3VyZS1w YWNrYWdlLW1lbnUtbW9kZSkKICAod2lkZW4pCiAgKGxldCAoZm91bmQtZW50cmllcyBtYXJrIHBr Zy1pZCBlbnRyeSBtYXJrcykKICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAoZ290by1jaGFyIChw b2ludC1taW4pKQogICAgICAod2hpbGUgKG5vdCAoZW9icCkpCiAgICAgICAgKHNldHEgbWFyayAo Y2hhci1hZnRlcikpCiAgICAgICAgKHVubGVzcyAoZXEgbWFyayA/XHMpCiAgICAgICAgICAoc2V0 cSBwa2ctaWQgKHRhYnVsYXRlZC1saXN0LWdldC1pZCkpCiAgICAgICAgICAoc2V0cSBlbnRyeSAo cGFja2FnZS1tZW51LS1wcmludC1pbmZvLXNpbXBsZSBwa2ctaWQpKQogICAgICAgICAgKHB1c2gg ZW50cnkgZm91bmQtZW50cmllcykKICAgICAgICAgIDs7IHJlbWVtYmVyIHRoZSBtYXJrCiAgICAg ICAgICAocHVzaCAoY29ucyBwa2ctaWQgbWFyaykgbWFya3MpKQogICAgICAgIChmb3J3YXJkLWxp bmUpKQogICAgICAoaWYgZm91bmQtZW50cmllcwogICAgICAgICAgKHByb2duCiAgICAgICAgICAg IChzZXRxIHRhYnVsYXRlZC1saXN0LWVudHJpZXMgZm91bmQtZW50cmllcykKICAgICAgICAgICAg KHBhY2thZ2UtbWVudS0tZGlzcGxheSB0IG5pbCkKICAgICAgICAgICAgOzsgcmVkbyB0aGUgbWFy a3MsIGJ1dCB3ZSBtdXN0IHJlbWVtYmVyIHRoZSBtYXJrcyEhCiAgICAgICAgICAgIChnb3RvLWNo YXIgKHBvaW50LW1pbikpCiAgICAgICAgICAgICh3aGlsZSAobm90IChlb2JwKSkKICAgICAgICAg ICAgICAoc2V0cSBtYXJrIChjZHIgKGFzc3EgKHRhYnVsYXRlZC1saXN0LWdldC1pZCkgbWFya3Mp KSkKICAgICAgICAgICAgICAodGFidWxhdGVkLWxpc3QtcHV0LXRhZyAoY2hhci10by1zdHJpbmcg bWFyaykgdCkpKQogICAgICAgICh1c2VyLWVycm9yICJObyBwYWNrYWdlcyBmb3VuZCIpKSkpKQoK KGRlZnVuIHBhY2thZ2UtbWVudS1maWx0ZXItdXBncmFkYWJsZSAoKQogICJGaWx0ZXIgXCIqUGFj a2FnZXMqXCIgYnVmZmVyIHRvIHNob3cgb25seSB1cGdyYWRhYmxlIHBhY2thZ2VzLiIKICAoaW50 ZXJhY3RpdmUgbmlsIHBhY2thZ2UtbWVudS1tb2RlKQogIChsZXQgKChwa2dzIChtYXBjYXIgIydj YXIgKHBhY2thZ2UtbWVudS0tZmluZC11cGdyYWRlcykpKSkKICAgIChwYWNrYWdlLW1lbnUtLWZp bHRlci1ieQogICAgIChsYW1iZGEgKHBrZykKICAgICAgIChtZW1xbCAocGFja2FnZS1kZXNjLW5h bWUgcGtnKSBwa2dzKSkKICAgICAidXBncmFkYWJsZSIpKSkKCihkZWZ1biBwYWNrYWdlLW1lbnUt Y2xlYXItZmlsdGVyICgpCiAgIkNsZWFyIGFueSBmaWx0ZXIgY3VycmVudGx5IGFwcGxpZWQgdG8g dGhlIFwiKlBhY2thZ2VzKlwiIGJ1ZmZlci4iCiAgKGludGVyYWN0aXZlIG5pbCBwYWNrYWdlLW1l bnUtbW9kZSkKICAocGFja2FnZS0tZW5zdXJlLXBhY2thZ2UtbWVudS1tb2RlKQogIChwYWNrYWdl LW1lbnUtLWdlbmVyYXRlIHQgdCkpCgooZGVmdW4gcGFja2FnZS1saXN0LXBhY2thZ2VzLW5vLWZl dGNoICgpCiAgIkRpc3BsYXkgYSBsaXN0IG9mIHBhY2thZ2VzLgpEb2VzIG5vdCBmZXRjaCB0aGUg dXBkYXRlZCBsaXN0IG9mIHBhY2thZ2VzIGJlZm9yZSBkaXNwbGF5aW5nLgpUaGUgbGlzdCBpcyBk aXNwbGF5ZWQgaW4gYSBidWZmZXIgbmFtZWQgYCpQYWNrYWdlcyonLiIKICAoaW50ZXJhY3RpdmUp CiAgKGxpc3QtcGFja2FnZXMgdCkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gcGFja2FnZS1nZXQt dmVyc2lvbiAoKQogICJSZXR1cm4gdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlIGlu IHdoaWNoIHRoaXMgaXMgdXNlZC4KQXNzdW1lcyBpdCBpcyB1c2VkIGZyb20gYW4gRWxpc3AgZmls ZSBwbGFjZWQgaW5zaWRlIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5Cm9mIGFuIGluc3RhbGxlZCBF TFBBIHBhY2thZ2UuClRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcgKG9yIG5pbCBpbiBjYXNl IHdlIGNhbid0IGZpbmQgaXQpLgpJdCB3b3JrcyBpbiBtb3JlIGNhc2VzIGlmIHRoZSBjYWxsIGlz IGluIHRoZSBmaWxlIHdoaWNoIGNvbnRhaW5zCnRoZSBgVmVyc2lvbjonIGhlYWRlci4iCiAgOzsg SW4gYSBzZW5zZSwgdGhpcyBpcyBhIGxpZSwgYnV0IGl0IGRvZXMganVzdCB3aGF0IHdlIHdhbnQ6 IHByZWNvbXB1dGUKICA7OyB0aGUgdmVyc2lvbiBhdCBjb21waWxlIHRpbWUgYW5kIGhhcmRjb2Rl cyBpdCBpbnRvIHRoZSAuZWxjIGZpbGUhCiAgKGRlY2xhcmUgKHB1cmUgdCkpCiAgOzsgSGFjayBh bGVydCEKICAobGV0ICgoZmlsZSAob3IgKG1hY3JvZXhwLWZpbGUtbmFtZSkgYnVmZmVyLWZpbGUt bmFtZSkpKQogICAgKGNvbmQKICAgICAoKG51bGwgZmlsZSkgbmlsKQogICAgIDs7IFBhY2thZ2Vz IGFyZSBub3JtYWxseSBpbnN0YWxsZWQgaW50byBkaXJlY3RvcmllcyBuYW1lZCAiPHBrZz4tPHZl cnM+IiwKICAgICA7OyBzbyBnZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZyb20gdGhlcmUuCiAgICAg KChzdHJpbmctbWF0Y2ggIi9bXi9dKy1cXChbMC05XVxcKD86WzAtOS5dXFx8cHJlXFx8YmV0YVxc fGFscGhhXFx8c25hcHNob3RcXCkrXFwpL1teL10rXFwnIiBmaWxlKQogICAgICAobWF0Y2gtc3Ry aW5nIDEgZmlsZSkpCiAgICAgOzsgRm9yIHBhY2thZ2VzIHJ1biBzdHJhaWdodCBmcm9tIHRoZSBh biBlbHBhLmdpdCBjbG9uZSwgdGhlcmUncyBubwogICAgIDs7ICItPHZlcnM+IiBpbiB0aGUgZGly ZWN0b3J5IG5hbWUsIHNvIHdlIGhhdmUgdG8gZmV0Y2ggdGhlIHZlcnNpb24KICAgICA7OyB0aGUg aGFyZCB3YXkuCiAgICAgKHQKICAgICAgKGxldCogKChwa2dkaXIgKGZpbGUtbmFtZS1kaXJlY3Rv cnkgZmlsZSkpCiAgICAgICAgICAgICAocGtnbmFtZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSAo ZGlyZWN0b3J5LWZpbGUtbmFtZSBwa2dkaXIpKSkKICAgICAgICAgICAgIChtYWluZmlsZSAoZXhw YW5kLWZpbGUtbmFtZSAoY29uY2F0IHBrZ25hbWUgIi5lbCIpIHBrZ2RpcikpKQogICAgICAgICh1 bmxlc3MgKGZpbGUtcmVhZGFibGUtcCBtYWluZmlsZSkgKHNldHEgbWFpbmZpbGUgZmlsZSkpCiAg ICAgICAgKHdoZW4gKGZpbGUtcmVhZGFibGUtcCBtYWluZmlsZSkKICAgICAgICAgIChyZXF1aXJl ICdsaXNwLW1udCkKICAgICAgICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgICAgIChpbnNl cnQtZmlsZS1jb250ZW50cyBtYWluZmlsZSkKICAgICAgICAgICAgKG9yIChsbS1oZWFkZXIgInBh Y2thZ2UtdmVyc2lvbiIpCiAgICAgICAgICAgICAgICAobG0taGVhZGVyICJ2ZXJzaW9uIikpKSkp KSkpKQoKDAo7Ozs7IFF1aWNrc3RhcnQ6IHByZWNvbXB1dGUgYWN0aXZhdGlvbiBhY3Rpb25zIGZv ciBmYXN0ZXIgc3RhcnQgdXAuCgo7OyBBY3RpdmF0aW5nIHBhY2thZ2VzIHZpYSBgcGFja2FnZS1p bml0aWFsaXplJyBpcyBjb3N0bHk6IGZvciBOIGluc3RhbGxlZAo7OyBwYWNrYWdlcywgaXQgbmVl ZHMgdG8gcmVhZCBhbGwgTiA8cGtnPi1wa2cuZWwgZmlsZXMgZmlyc3QgdG8gZGVjaWRlCjs7IHdo aWNoIHBhY2thZ2VzIHRvIGFjdGl2YXRlLCBhbmQgdGhlbiBhZ2FpbiBOIDxwa2c+LWF1dG9sb2Fk cy5lbCBmaWxlcy4KOzsgVG8gc3BlZWQgdGhpcyB1cCwgd2UgcHJlY29tcHV0ZSBhIG1lZ2EtYXV0 b2xvYWRzIGZpbGUgd2hpY2ggaXMgdGhlCjs7IGNvbmNhdGVuYXRpb24gb2YgYWxsIHRob3NlIDxw a2c+LWF1dG9sb2Fkcy5lbCwgc28gd2UgY2FuIGFjdGl2YXRlCjs7IGFsbCBwYWNrYWdlcyBieSBs b2FkaW5nIHRoaXMgb25lIGZpbGUgKGFuZCBoZW5jZSB3aXRob3V0IGluaXRpYWxpemluZwo7OyBw YWNrYWdlLmVsKS4KCjs7IE90aGVyIHRoYW4gc3BlZWRpbmcgdGhpbmdzIHVwLCB0aGlzIGFsc28g b2ZmZXJzIGEgYm9vdHN0cmFwIGZlYXR1cmU6Cjs7IGl0IGxldHMgdXMgYWN0aXZhdGUgcGFja2Fn ZXMgYWNjb3JkaW5nIHRvIGBwYWNrYWdlLWxvYWQtbGlzdCcgYW5kCjs7IGBwYWNrYWdlLXVzZXIt ZGlyJyBldmVuIGJlZm9yZSB0aG9zZSB2YXJzIGFyZSBzZXQuCgooZGVmY3VzdG9tIHBhY2thZ2Ut cXVpY2tzdGFydCBuaWwKICAiUHJlY29tcHV0ZSBhY3RpdmF0aW9uIGFjdGlvbnMgdG8gc3BlZWQg dXAgc3RhcnR1cC4KVGhpcyByZXF1aXJlcyB0aGUgdXNlIG9mIGBwYWNrYWdlLXF1aWNrc3RhcnQt cmVmcmVzaCcgZXZlcnkgdGltZSB0aGUKYWN0aXZhdGlvbnMgbmVlZCB0byBiZSBjaGFuZ2VkLCBz dWNoIGFzIHdoZW4gYHBhY2thZ2UtbG9hZC1saXN0JyBpcyBtb2RpZmllZC4iCiAgOnR5cGUgJ2Jv b2xlYW4KICA6dmVyc2lvbiAiMjcuMSIpCgo7OzsjIyNhdXRvbG9hZAooZGVmY3VzdG9tIHBhY2th Z2UtcXVpY2tzdGFydC1maWxlCiAgKGxvY2F0ZS11c2VyLWVtYWNzLWZpbGUgInBhY2thZ2UtcXVp Y2tzdGFydC5lbCIpCiAgIkxvY2F0aW9uIG9mIHRoZSBmaWxlIHVzZWQgdG8gc3BlZWQgdXAgYWN0 aXZhdGlvbiBvZiBwYWNrYWdlcyBhdCBzdGFydHVwLiIKICA6dHlwZSAnZmlsZQogIDpncm91cCAn YXBwbGljYXRpb25zCiAgOmluaXRpYWxpemUgIydjdXN0b20taW5pdGlhbGl6ZS1kZWxheQogIDp2 ZXJzaW9uICIyNy4xIikKCihkZWZ1biBwYWNrYWdlLS1xdWlja3N0YXJ0LW1heWJlLXJlZnJlc2gg KCkKICAoaWYgcGFja2FnZS1xdWlja3N0YXJ0CiAgICAgIDs7IEZJWE1FOiBEZWxheSByZWZyZXNo IGluIGNhc2Ugd2UncmUgaW5zdGFsbGluZy9kZWxldGluZwogICAgICA7OyBzZXZlcmFsIHBhY2th Z2VzIQogICAgICAocGFja2FnZS1xdWlja3N0YXJ0LXJlZnJlc2gpCiAgICAoZGVsZXRlLWZpbGUg KGNvbmNhdCBwYWNrYWdlLXF1aWNrc3RhcnQtZmlsZSAiYyIpKQogICAgKGRlbGV0ZS1maWxlIHBh Y2thZ2UtcXVpY2tzdGFydC1maWxlKSkpCgooZGVmdW4gcGFja2FnZS1xdWlja3N0YXJ0LXJlZnJl c2ggKCkKICAiKFJlKUdlbmVyYXRlIHRoZSBgcGFja2FnZS1xdWlja3N0YXJ0LWZpbGUnLiIKICAo aW50ZXJhY3RpdmUpCiAgKHBhY2thZ2UtaW5pdGlhbGl6ZSAnbm8tYWN0aXZhdGUpCiAgKHJlcXVp cmUgJ2luZm8pCiAgKGxldCAoKHBhY2thZ2UtLXF1aWNrc3RhcnQtcGtncyAoKSkKICAgICAgICA7 OyBQcmV0ZW5kIHdlIGhhdmVuJ3QgYWN0aXZhdGVkIGFueXRoaW5nIHlldCEKICAgICAgICAocGFj a2FnZS1hY3RpdmF0ZWQtbGlzdCAoKSkKICAgICAgICA7OyBNYWtlIHN1cmUgd2UgY2FuIGxvYWQg dGhpcyBmaWxlIHdpdGhvdXQgbG9hZC1zb3VyY2UtZmlsZS1mdW5jdGlvbi4KICAgICAgICAoY29k aW5nLXN5c3RlbS1mb3Itd3JpdGUgJ2VtYWNzLWludGVybmFsKQogICAgICAgIDs7IEVuc3VyZSB0 aGF0IGBwcCcgYW5kIGBwcmluMS10by1zdHJpbmcnIGNhbGxzIGZ1cnRoZXIgZG93bgogICAgICAg IDs7IGFyZW4ndCB0cnVuY2F0ZWQuCiAgICAgICAgKHByaW50LWxlbmd0aCBuaWwpCiAgICAgICAg KHByaW50LWxldmVsIG5pbCkKICAgICAgICAoSW5mby1kaXJlY3RvcnktbGlzdCAnKCIiKSkpCiAg ICAoZG9saXN0IChlbHQgcGFja2FnZS1hbGlzdCkKICAgICAgKGNvbmRpdGlvbi1jYXNlIGVycgog ICAgICAgICAgKHBhY2thZ2UtYWN0aXZhdGUgKGNhciBlbHQpKQogICAgICAgIDs7IERvbid0IGxl dCBmYWlsdXJlIG9mIGFjdGl2YXRpb24gb2YgYSBwYWNrYWdlIGFyYml0cmFyaWx5IHN0b3AKICAg ICAgICA7OyBhY3RpdmF0aW9uIG9mIGZ1cnRoZXIgcGFja2FnZXMuCiAgICAgICAgKGVycm9yICht ZXNzYWdlICIlcyIgKGVycm9yLW1lc3NhZ2Utc3RyaW5nIGVycikpKSkpCiAgICAoc2V0cSBwYWNr YWdlLS1xdWlja3N0YXJ0LXBrZ3MgKG5yZXZlcnNlIHBhY2thZ2UtLXF1aWNrc3RhcnQtcGtncykp CiAgICAod2l0aC10ZW1wLWZpbGUgcGFja2FnZS1xdWlja3N0YXJ0LWZpbGUKICAgICAgKGVtYWNz LWxpc3AtbW9kZSkgICAgICAgICAgICAgICAgIDtGb3IgYHN5bnRheC1wcHNzJy4KICAgICAgKGlu c2VydCAiOzs7IFF1aWNrc3RhcnQgZmlsZSB0byBhY3RpdmF0ZSBhbGwgcGFja2FnZXMgYXQgc3Rh cnR1cCAgLSotIGxleGljYWwtYmluZGluZzp0IC0qLVxuIikKICAgICAgKGluc2VydCAiOzsgwqHC oSBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBieSBgcGFja2FnZS1xdWlja3N0YXJ0LXJlZnJl c2gnLCBETyBOT1QgRURJVCAhIVxuXG4iKQogICAgICAoZG9saXN0IChwa2cgcGFja2FnZS0tcXVp Y2tzdGFydC1wa2dzKQogICAgICAgIChsZXQqICgoZmlsZQogICAgICAgICAgICAgICAgOzsgUHJl ZmVyIHVuY29tcGlsZWQgZmlsZXMgKGFuZCBkb24ndCBhY2NlcHQgLnNvIGZpbGVzKS4KICAgICAg ICAgICAgICAgIChsZXQgKChsb2FkLXN1ZmZpeGVzICcoIi5lbCIgIi5lbGMiKSkpCiAgICAgICAg ICAgICAgICAgIChsb2NhdGUtbGlicmFyeSAocGFja2FnZS0tYXV0b2xvYWRzLWZpbGUtbmFtZSBw a2cpKSkpCiAgICAgICAgICAgICAgIChwZmlsZSAocHJpbjEtdG8tc3RyaW5nIGZpbGUpKSkKICAg ICAgICAgIChpbnNlcnQgIihsZXQgKChsb2FkLXRydWUtZmlsZS1uYW1lICIgcGZpbGUgIilcClwo bG9hZC1maWxlLW5hbWUgIiBwZmlsZSAiKSlcbiIpCiAgICAgICAgICAoaW5zZXJ0LWZpbGUtY29u dGVudHMgZmlsZSkKICAgICAgICAgIDs7IEZpeHVwIHRoZSBzcGVjaWFsICMkIHJlYWRlciBmb3Jt IGFuZCB0aHJvdyBhd2F5IGNvbW1lbnRzLgogICAgICAgICAgKHdoaWxlIChyZS1zZWFyY2gtZm9y d2FyZCAiI1xcJFxcfF47XFwoLipcblxcKSIgbmlsICdtb3ZlKQogICAgICAgICAgICAodW5sZXNz IChwcHNzLXN0cmluZy10ZXJtaW5hdG9yIChzYXZlLW1hdGNoLWRhdGEgKHN5bnRheC1wcHNzKSkp CiAgICAgICAgICAgICAgKHJlcGxhY2UtbWF0Y2ggKGlmIChtYXRjaC1lbmQgMSkgIiIgcGZpbGUp IHQgdCkpKQogICAgICAgICAgKHVubGVzcyAoYm9scCkgKGluc2VydCAiXG4iKSkKICAgICAgICAg IChpbnNlcnQgIilcbiIpKSkKICAgICAgKHBwIGAoZGVmdmFyIHBhY2thZ2UtYWN0aXZhdGVkLWxp c3QpIChjdXJyZW50LWJ1ZmZlcikpCiAgICAgIChwcCBgKHNldHEgcGFja2FnZS1hY3RpdmF0ZWQt bGlzdAogICAgICAgICAgICAgICAgIChkZWxldGUtZHVwcwogICAgICAgICAgICAgICAgICAoYXBw ZW5kICcsKG1hcGNhciAjJ3BhY2thZ2UtZGVzYy1uYW1lIHBhY2thZ2UtLXF1aWNrc3RhcnQtcGtn cykKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLWFjdGl2YXRlZC1saXN0KSkpCiAg ICAgICAgICAoY3VycmVudC1idWZmZXIpKQogICAgICAobGV0ICgoaW5mby1kaXJzIChidXRsYXN0 IEluZm8tZGlyZWN0b3J5LWxpc3QpKSkKICAgICAgICAod2hlbiBpbmZvLWRpcnMKICAgICAgICAg IChwcCBgKHByb2duIChyZXF1aXJlICdpbmZvKQogICAgICAgICAgICAgICAgICAgICAgKGluZm8t aW5pdGlhbGl6ZSkKICAgICAgICAgICAgICAgICAgICAgIChzZXRxIEluZm8tZGlyZWN0b3J5LWxp c3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBlbmQgJyxpbmZvLWRpcnMgSW5mby1k aXJlY3RvcnktbGlzdCkpKQogICAgICAgICAgICAgIChjdXJyZW50LWJ1ZmZlcikpKSkKICAgICAg OzsgVXNlIGBccycgaW5zdGVhZCBvZiBhIHNwYWNlIGNoYXJhY3Rlciwgc28gdGhpcyBjb2RlIGNo dW5rIGlzIG5vdAogICAgICA7OyBtaXN0YWtlbiBmb3IgYW4gYWN0dWFsIGZpbGUtbG9jYWwgc2Vj dGlvbiBvZiBwYWNrYWdlLmVsLgogICAgICAoaW5zZXJ0ICIMCjs7IExvY2FsXHNWYXJpYWJsZXM6 Cjs7IHZlcnNpb24tY29udHJvbDogbmV2ZXIKOzsgbm8tdXBkYXRlLWF1dG9sb2FkczogdAo7OyBi eXRlLWNvbXBpbGUtd2FybmluZ3M6IChub3QgbWFrZS1sb2NhbCkKOzsgRW5kOgoiKSkKICAgIDs7 IEZJWE1FOiBEbyBpdCBhc3luY2hyb25vdXNseSBpbiBhbiBFbWFjcyBzdWJwcm9jZXNzLCBhbmQK ICAgIDs7IGRvbid0IHNob3cgdGhlIGJ5dGUtY29tcGlsZXIgd2FybmluZ3MuCiAgICAoYnl0ZS1j b21waWxlLWZpbGUgcGFja2FnZS1xdWlja3N0YXJ0LWZpbGUpKSkKCihkZWZ1biBwYWNrYWdlLS1p bWVudS1wcmV2LWluZGV4LXBvc2l0aW9uLWZ1bmN0aW9uICgpCiAgIk1vdmUgcG9pbnQgdG8gcHJl dmlvdXMgbGluZSBpbiBwYWNrYWdlLW1lbnUgYnVmZmVyLgpUaGlzIGZ1bmN0aW9uIGlzIHVzZWQg YXMgYSB2YWx1ZSBmb3IKYGltZW51LXByZXYtaW5kZXgtcG9zaXRpb24tZnVuY3Rpb24nLiIKICAo dW5sZXNzIChib2JwKQogICAgKGZvcndhcmQtbGluZSAtMSkpKQoKKGRlZnVuIHBhY2thZ2UtLWlt ZW51LWV4dHJhY3QtaW5kZXgtbmFtZS1mdW5jdGlvbiAoKQogICJSZXR1cm4gaW1lbnUgbmFtZSBm b3IgbGluZSBhdCBwb2ludC4KVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgdmFsdWUgZm9yCmBp bWVudS1leHRyYWN0LWluZGV4LW5hbWUtZnVuY3Rpb24nLiAgUG9pbnQgc2hvdWxkIGJlIGF0IHRo ZQpiZWdpbm5pbmcgb2YgdGhlIGxpbmUuIgogIChsZXQgKChwYWNrYWdlLWRlc2MgKHRhYnVsYXRl ZC1saXN0LWdldC1pZCkpKQogICAgKGZvcm1hdCAiJXMgKCVzKTogJXMiCiAgICAgICAgICAgIChw YWNrYWdlLWRlc2MtbmFtZSBwYWNrYWdlLWRlc2MpCiAgICAgICAgICAgIChwYWNrYWdlLXZlcnNp b24tam9pbiAocGFja2FnZS1kZXNjLXZlcnNpb24gcGFja2FnZS1kZXNjKSkKICAgICAgICAgICAg KHBhY2thZ2UtZGVzYy1zdW1tYXJ5IHBhY2thZ2UtZGVzYykpKSkKCihkZWZ1biBwYWNrYWdlLS1x dWVyeS1kZXNjICgmb3B0aW9uYWwgYWxpc3QpCiAgIlF1ZXJ5IHRoZSB1c2VyIGZvciBhIHBhY2th Z2Ugb3IgcmV0dXJuIHRoZSBwYWNrYWdlIGF0IHBvaW50LgpUaGUgb3B0aW9uYWwgYXJndW1lbnQg QUxJU1QgbXVzdCBjb25zaXN0IG9mIGVsZW1lbnRzIHdpdGggdGhlCmZvcm0gKFBLRy1OQU1FIFBL Ry1ERVNDKS4gIElmIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgZGVmYXVsdCB0bwpgcGFja2FnZS1h bGlzdCcuIgogIChvciAodGFidWxhdGVkLWxpc3QtZ2V0LWlkKQogICAgICAobGV0ICgoYWxpc3Qg KG9yIGFsaXN0IHBhY2thZ2UtYWxpc3QpKSkKICAgICAgICAoY2FkciAoYXNzb2MgKGNvbXBsZXRp bmctcmVhZCAiUGFja2FnZTogIiBhbGlzdCBuaWwgdCkKICAgICAgICAgICAgICAgICAgICAgYWxp c3QgIydzdHJpbmc9KSkpKSkKCihkZWZ1biBwYWNrYWdlLWJyb3dzZS11cmwgKGRlc2MgJm9wdGlv bmFsIHNlY29uZGFyeSkKICAiT3BlbiB0aGUgd2Vic2l0ZSBvZiB0aGUgcGFja2FnZSB1bmRlciBw b2ludCBpbiBhIGJyb3dzZXIuCmBicm93c2UtdXJsJyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUg YnJvd3NlciB0byBiZSB1c2VkLiAgSWYKU0VDT05EQVJZIChpbnRlcmFjdGl2ZWx5LCB0aGUgcHJl Zml4KSwgdXNlIHRoZSBzZWNvbmRhcnkgYnJvd3Nlci4KREVTQyBtdXN0IGJlIGEgYHBhY2thZ2Ut ZGVzYycgb2JqZWN0LiIKICAoaW50ZXJhY3RpdmUgKGxpc3QgKHBhY2thZ2UtLXF1ZXJ5LWRlc2Mp CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtcHJlZml4LWFyZykKICAgICAgICAgICAgICAg cGFja2FnZS1tZW51LW1vZGUpCiAgKHVubGVzcyBkZXNjCiAgICAodXNlci1lcnJvciAiTm8gcGFj a2FnZSBoZXJlIikpCiAgKGxldCAoKHVybCAoY2RyIChhc3NvYyA6dXJsIChwYWNrYWdlLWRlc2Mt ZXh0cmFzIGRlc2MpKSkpKQogICAgKHVubGVzcyB1cmwKICAgICAgKHVzZXItZXJyb3IgIk5vIHdl YnNpdGUgZm9yICVzIiAocGFja2FnZS1kZXNjLW5hbWUgZGVzYykpKQogICAgKGlmIHNlY29uZGFy eQogICAgICAgIChmdW5jYWxsIGJyb3dzZS11cmwtc2Vjb25kYXJ5LWJyb3dzZXItZnVuY3Rpb24g dXJsKQogICAgICAoYnJvd3NlLXVybCB1cmwpKSkpCgooZGVjbGFyZS1mdW5jdGlvbiBpZXRmLWRy dW1zLXBhcnNlLWFkZHJlc3MgImlldGYtZHJ1bXMiCiAgICAgICAgICAgICAgICAgIChzdHJpbmcg Jm9wdGlvbmFsIGRlY29kZSkpCgooZGVmdW4gcGFja2FnZS1tYWludGFpbmVycyAocGtnLWRlc2Mg Jm9wdGlvbmFsIG5vLWVycm9yKQogICJSZXR1cm4gYW4gZW1haWwgYWRkcmVzcyBmb3IgdGhlIG1h aW50YWluZXJzIG9mIFBLRy1ERVNDLgpUaGUgZW1haWwgYWRkcmVzcyBtYXkgY29udGFpbiBjb21t YXMsIGlmIHRoZXJlIGFyZSBtdWx0aXBsZQptYWludGFpbmVycy4gIElmIG5vIG1haW50YWluZXJz IGFyZSBmb3VuZCwgYW4gZXJyb3Igd2lsbCBiZQpzaWduYWxlZC4gIElmIHRoZSBvcHRpb25hbCBh cmd1bWVudCBOTy1FUlJPUiBpcyBub24tbmlsIG5vIGVycm9yCndpbGwgYmUgc2lnbmFsZWQgaW4g dGhhdCBjYXNlLiIKICAodW5sZXNzIChwYWNrYWdlLWRlc2MtcCBwa2ctZGVzYykKICAgIChlcnJv ciAiSW52YWxpZCBwYWNrYWdlIGRlc2NyaXB0aW9uOiAlUyIgcGtnLWRlc2MpKQogIChsZXQqICgo bmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAgICAoZXh0cmFzIChwYWNr YWdlLWRlc2MtZXh0cmFzIHBrZy1kZXNjKSkKICAgICAgICAgKG1haW50IChhbGlzdC1nZXQgOm1h aW50YWluZXIgZXh0cmFzKSkpCiAgICAoY29uZAogICAgICgoYW5kIChudWxsIG1haW50KSAobnVs bCBuby1lcnJvcikpCiAgICAgICh1c2VyLWVycm9yICJQYWNrYWdlIGAlcycgaGFzIG5vIGV4cGxp Y2l0IG1haW50YWluZXIiIG5hbWUpKQogICAgICgoYW5kIChub3QgKHByb2duCiAgICAgICAgICAg ICAgICAgIChyZXF1aXJlICdpZXRmLWRydW1zKQogICAgICAgICAgICAgICAgICAoaWV0Zi1kcnVt cy1wYXJzZS1hZGRyZXNzIChjZHIgbWFpbnQpKSkpCiAgICAgICAgICAgKG51bGwgbm8tZXJyb3Ip KQogICAgICAodXNlci1lcnJvciAiUGFja2FnZSBgJXMnIGhhcyBubyBtYWludGFpbmVyIGFkZHJl c3MiIG5hbWUpKQogICAgICgobm90IChudWxsIG1haW50KSkKICAgICAgKHdpdGgtdGVtcC1idWZm ZXIKICAgICAgICAocGFja2FnZS0tcHJpbnQtZW1haWwtYnV0dG9uIG1haW50KQogICAgICAgIChz dHJpbmctdHJpbSAoc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMgKGJ1ZmZlci1zdHJpbmcpKSkpKSkp KQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtcmVwb3J0LWJ1ZyAoZGVzYykKICAiUHJl cGFyZSBhIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgbWFpbnRhaW5lcnMgb2YgYSBwYWNrYWdlLgpE RVNDIG11c3QgYmUgYSBgcGFja2FnZS1kZXNjJyBvYmplY3QuIgogIChpbnRlcmFjdGl2ZSAobGlz dCAocGFja2FnZS0tcXVlcnktZGVzYyBwYWNrYWdlLWFsaXN0KSkKICAgICAgICAgICAgICAgcGFj a2FnZS1tZW51LW1vZGUpCiAgKGxldCAoKG1haW50IChwYWNrYWdlLW1haW50YWluZXJzIGRlc2Mp KQogICAgICAgIChuYW1lIChzeW1ib2wtbmFtZSAocGFja2FnZS1kZXNjLW5hbWUgZGVzYykpKQog ICAgICAgIHZhcnMpCiAgICAoZG9saXN0LXdpdGgtcHJvZ3Jlc3MtcmVwb3J0ZXIgKGdyb3VwIGN1 c3RvbS1jdXJyZW50LWdyb3VwLWFsaXN0KQogICAgICAgICJTY2FubmluZyBmb3IgbW9kaWZpZWQg dXNlciBvcHRpb25zLi4uIgogICAgICAoZG9saXN0IChlbnQgKGdldCAoY2RyIGdyb3VwKSAnY3Vz dG9tLWdyb3VwKSkKICAgICAgICAod2hlbiAoYW5kIChjdXN0b20tdmFyaWFibGUtcCAoY2FyIGVu dCkpCiAgICAgICAgICAgICAgICAgICAoYm91bmRwIChjYXIgZW50KSkKICAgICAgICAgICAgICAg ICAgIChub3QgKGVxCiAgICAgICAgICAgICAgICAgICAgICAgICA7OyBXZSBhcmUgbm90IHVzaW5n IGBjdXN0b20tLXN0YW5kYXJkLXZhbHVlJwogICAgICAgICAgICAgICAgICAgICAgICAgOzsgdG8g cmV0YWluIGNvbXBhdGliaWxpdHkgZm9yIEVtYWNzIDI3LgogICAgICAgICAgICAgICAgICAgICAg ICAgKGV2YWwgKGNhciAoZ2V0IChjYXIgZW50KSAnc3RhbmRhcmQtdmFsdWUpKSB0KQogICAgICAg ICAgICAgICAgICAgICAgICAgKGRlZmF1bHQtdG9wbGV2ZWwtdmFsdWUgKGNhciBlbnQpKSkpCiAg ICAgICAgICAgICAgICAgICAoZmlsZS1pbi1kaXJlY3RvcnktcCAoY2FyIGdyb3VwKSAocGFja2Fn ZS1kZXNjLWRpciBkZXNjKSkpCiAgICAgICAgICAocHVzaCAoY2FyIGVudCkgdmFycykpKSkKICAg IChkbGV0ICgocmVwb3J0ZXItcHJvbXB0LWZvci1zdW1tYXJ5LXAgdCkpCiAgICAgIChyZXBvcnRl ci1zdWJtaXQtYnVnLXJlcG9ydCBtYWludCBuYW1lIHZhcnMpKSkpCgo7Ozs7IEludHJvc3BlY3Rp b24KCihkZWZ1biBwYWNrYWdlLWdldC1kZXNjcmlwdG9yIChwa2ctbmFtZSkKICAiUmV0dXJuIHRo ZSBgcGFja2FnZS1kZXNjJyBvZiBQS0ctTkFNRS4iCiAgKHVubGVzcyBwYWNrYWdlLS1pbml0aWFs aXplZCAocGFja2FnZS1pbml0aWFsaXplICduby1hY3RpdmF0ZSkpCiAgKG9yIChwYWNrYWdlLS1n ZXQtYWN0aXZhdGFibGUtcGtnIHBrZy1uYW1lKQogICAgICAoY2FkciAoYXNzcSBwa2ctbmFtZSBw YWNrYWdlLWFsaXN0KSkKICAgICAgKGNhZHIgKGFzc3EgcGtnLW5hbWUgcGFja2FnZS1hcmNoaXZl LWNvbnRlbnRzKSkpKQoKKHByb3ZpZGUgJ3BhY2thZ2UpCgo7OzsgcGFja2FnZS5lbCBlbmRzIGhl cmUKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--=-=-Content-Type: application/x-tar Content-Disposition: attachment; filename=package-vc.tar Content-Transfer-Encoding: base64 cGFja2FnZS12Yy0wLjEuMC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1 MAAwMDAxNzUwADAwMDAwMDAwMDAwADE0NDY3NzMyNzI1ADAxMzA2NgAgNQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHBoaWxpcAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAcGhpbGlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABw YWNrYWdlLXZjLTAuMS4wL3BhY2thZ2UtdmMtcGtnLmVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUw ADAwMDE3NTAAMDAwMDAwMDA2NTYAMTQ0Njc3MzI3MjUAMDE2MTc3ACAwAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcGhpbGlwAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABwaGlsaXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7 IEdlbmVyYXRlZCBwYWNrYWdlIGRlc2NyaXB0aW9uIGZyb20gcGFja2FnZS12Yy5lbCAgLSotIG5v LWJ5dGUtY29tcGlsZTogdCAtKi0KKGRlZmluZS1wYWNrYWdlICJwYWNrYWdlLXZjIiAiMC4xLjAi ICJNYW5hZ2UgcGFja2FnZXMgZnJvbSBWQyBjaGVja291dHMiICcoKGVtYWNzICIyOS4xIikgKHBh Y2thZ2UgIjEuMS4xIikpIDpjb21taXQgImI2YjBhMTRlODY3NTIwNzEyODllNmFhMGUyYTQxYzU5 YTE1YmZkNDkiIDp1cmwgImh0dHBzOi8vZWxwYS5nbnUub3JnL3BhY2thZ2VzL3BhY2thZ2UtdmMu aHRtbCIgOmF1dGhvcnMgJygoIlBoaWxpcCBLYWx1ZGVyY2ljIiAuICJwaGlsaXBrQHBvc3Rlby5u ZXQiKSkgOm1haW50YWluZXIgJygiUGhpbGlwIEthbHVkZXJjaWMiIC4gInBoaWxpcGtAcG9zdGVv Lm5ldCIpIDprZXl3b3JkcyAnKCJ0b29scyIpKQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGFj a2FnZS12Yy0wLjEuMC9wYWNrYWdlLXZjLmVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAw MDAxNzUwADAwMDAwMTI0MTMwADE0NDY3NjQwMjM1ADAxNTQwNAAgMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHBoaWxpcAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAcGhpbGlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7Ozsg cGFja2FnZS12Yy5lbCAtLS0gTWFuYWdlIHBhY2thZ2VzIGZyb20gVkMgY2hlY2tvdXRzICAgICAt Ki0gbGV4aWNhbC1iaW5kaW5nOiB0OyAtKi0KCjs7IENvcHlyaWdodCAoQykgMjAyMi0yMDIzIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKOzsgQXV0aG9yOiBQaGlsaXAgS2FsdWRlcmNp YyA8cGhpbGlwa0Bwb3N0ZW8ubmV0Pgo7OyBLZXl3b3JkczogdG9vbHMKOzsgVmVyc2lvbjogMC4x LjAKOzsgUGFja2FnZS1SZXF1aXJlczogKChlbWFjcyAiMjkuMSIpIChwYWNrYWdlICIxLjEuMSIp KQoKOzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEVtYWNzLgoKOzsgR05VIEVtYWNzIGlzIGZy ZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKOzsgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkKOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24g MyBvZiB0aGUgTGljZW5zZSwgb3IKOzsgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KCjs7IEdOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLAo7OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg aW1wbGllZCB3YXJyYW50eSBvZgo7OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCjs7IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCgo7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQo7OyBhbG9uZyB3aXRoIEdOVSBFbWFjcy4g IElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgo7OzsgQ29tbWVu dGFyeToKCjs7IFdoaWxlIHBhY2thZ2VzIG1hbmFnZWQgYnkgcGFja2FnZS5lbCB1c2UgdGFyYmFs bHMgZm9yIGRpc3RyaWJ1dGluZwo7OyB0aGUgc291cmNlIGNvZGUsIHRoaXMgZXh0ZW5zaW9uIGFs bG93cyBmb3IgcGFja2FnZXMgdG8gYmUgZmV0Y2hlZAo7OyBhbmQgdXBncmFkZWQgZGlyZWN0bHkg ZnJvbSBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCjs7Cjs7IFRvIGluc3RhbGwgYSBwYWNrYWdl IGZyb20gc291cmNlIHVzZSBgcGFja2FnZS12Yy1pbnN0YWxsJy4gIElmIHlvdQo7OyBhcmVuJ3Qg aW50ZXJlc3RlZCBpbiBhY3RpdmF0aW5nIGEgcGFja2FnZSwgeW91IGNhbiB1c2UKOzsgYHBhY2th Z2UtdmMtY2hlY2tvdXQnIGluc3RlYWQsIHdoaWNoIHdpbGwgcHJvbXB0IHlvdSBmb3IgYSB0YXJn ZXQKOzsgZGlyZWN0b3J5LiAgSWYgeW91IHdpc2ggdG8gcmUtdXNlIGFuIGV4aXN0aW5nIGNoZWNr b3V0LCB0aGUgY29tbWFuZAo7OyBgcGFja2FnZS12Yy1pbnN0YWxsLWZyb20tY2hlY2tvdXQnIHdp bGwgY3JlYXRlIGEgc3ltYm9saWMgbGluayBhbmQKOzsgcHJlcGFyZSB0aGUgcGFja2FnZS4KOzsK OzsgSWYgeW91IG1ha2UgbG9jYWwgY2hhbmdlcyB0aGF0IHlvdSB3aXNoIHRvIHNoYXJlIHdpdGgg YW4gdXBzdHJlYW0KOzsgbWFpbnRhaW5lciwgdGhlIGNvbW1hbmQgYHBhY2thZ2UtdmMtcHJlcGFy ZS1wYXRjaCcgY2FuIHByZXBhcmUKOzsgdGhlc2UgYXMgcGF0Y2hlcyB0byBzZW5kIHZpYSBFbWFp bC4KCjs7OyBUT0RPOgoKOzsgLSBBbGxvdyBtYWludGFpbmluZyBwYXRjaGVzIHRoYXQgYXJlIHBv cnRlZCBiYWNrIG9udG8gcmVndWxhcgo7OyAgIHBhY2thZ2VzIGFuZCBtYWludGFpbmVkIGJldHdl ZW4gdmVyc2lvbnMuCgo7OzsgQ29kZToKCihldmFsLXdoZW4tY29tcGlsZSAocmVxdWlyZSAncngp KQooZXZhbC13aGVuLWNvbXBpbGUgKHJlcXVpcmUgJ21hcCkpCihldmFsLXdoZW4tY29tcGlsZSAo cmVxdWlyZSAnY2wtbGliKSkKKHJlcXVpcmUgJ3BhY2thZ2UpCihyZXF1aXJlICdsaXNwLW1udCkK KHJlcXVpcmUgJ3ZjKQoocmVxdWlyZSAnc2VxKQoKKGRlZmdyb3VwIHBhY2thZ2UtdmMgbmlsCiAg Ik1hbmFnZSBwYWNrYWdlcyBmcm9tIFZDIGNoZWNrb3V0cy4iCiAgOmdyb3VwICdwYWNrYWdlCiAg OmxpbmsgJyhjdXN0b20tbWFudWFsICIoZW1hY3MpIEZldGNoaW5nIFBhY2thZ2UgU291cmNlcyIp CiAgOnByZWZpeCAicGFja2FnZS12Yy0iCiAgOnZlcnNpb24gIjI5LjEiKQoKKGRlZmNvbnN0IHBh Y2thZ2UtdmMtLWVscGEtcGFja2FnZXMtdmVyc2lvbiAxCiAgIlZlcnNpb24gbnVtYmVyIG9mIHRo ZSBwYWNrYWdlIHNwZWNpZmljYXRpb24gZm9ybWF0IHVuZGVyc3Rvb2QgYnkgcGFja2FnZS12Yy4i KQoKKGRlZmN1c3RvbSBwYWNrYWdlLXZjLWhldXJpc3RpYy1hbGlzdAogIGAoKCwocnggYm9zICJo dHRwIiAoPyAicyIpICI6Ly8iCiAgICAgICAgICAob3IgKDogKD8gInd3dy4iKSAiZ2l0aHViLmNv bSIKICAgICAgICAgICAgICAgICAiLyIgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8iKSkKICAgICAg ICAgICAgICAgICAiLyIgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8iKSkpCiAgICAgICAgICAgICAg KDogImNvZGViZXJnLm9yZyIKICAgICAgICAgICAgICAgICAiLyIgKCsgKG9yIGFsbnVtICItIiAi LiIgIl8iKSkKICAgICAgICAgICAgICAgICAiLyIgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8iKSkp CiAgICAgICAgICAgICAgKDogKD8gInd3dy4iKSAiZ2l0bGFiIiAoKyAiLiIgKCsgYWxudW0pKQog ICAgICAgICAgICAgICAgICIvIiAoKyAob3IgYWxudW0gIi0iICIuIiAiXyIpKQogICAgICAgICAg ICAgICAgICIvIiAoKyAob3IgYWxudW0gIi0iICIuIiAiXyIpKSkKICAgICAgICAgICAgICAoOiAi Z2l0LnNyLmh0IgogICAgICAgICAgICAgICAgICIvfiIgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8i KSkKICAgICAgICAgICAgICAgICAiLyIgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8iKSkpCiAgICAg ICAgICAgICAgKDogImdpdC4iIChvciAic2F2YW5uYWgiICJzdiIpICIuIiAoPyAibm9uIikgImdu dS5vcmcvIgogICAgICAgICAgICAgICAgIChvciAiciIgImdpdCIpICIvIgogICAgICAgICAgICAg ICAgICgrIChvciBhbG51bSAiLSIgIi4iICJfIikpICg/ICIvIikpKQogICAgICAgICAgKG9yICg/ ICIvIikgIi5naXQiKSBlb3MpCiAgICAgLiBHaXQpCiAgICAoLChyeCBib3MgImh0dHAiICg/ICJz IikgIjovLyIKICAgICAgICAgIChvciAoOiAiaGcuc3IuaHQiCiAgICAgICAgICAgICAgICAgIi9+ IiAoKyAob3IgYWxudW0gIi0iICIuIiAiXyIpKQogICAgICAgICAgICAgICAgICIvIiAoKyAob3Ig YWxudW0gIi0iICIuIiAiXyIpKSkKICAgICAgICAgICAgICAoOiAiaGcuIiAob3IgInNhdmFubmFo IiAic3YiKSAiLiIgKD8gIm5vbiIpICJnbnUub3JnL2hnd2ViLyIKICAgICAgICAgICAgICAgICAo KyAob3IgYWxudW0gIi0iICIuIiAiXyIpKSAoPyAiLyIpKSkKICAgICAgICAgIGVvcykKICAgICAu IEhnKQogICAgKCwocnggYm9zICJodHRwIiAoPyAicyIpICI6Ly8iCiAgICAgICAgICAob3IgKDog ImJ6ci4iIChvciAic2F2YW5uYWgiICJzdiIpICIuIiAoPyAibm9uIikgImdudS5vcmcvci8iCiAg ICAgICAgICAgICAgICAgKCsgKG9yIGFsbnVtICItIiAiLiIgIl8iKSkgKD8gIi8iKSkpCiAgICAg ICAgICBlb3MpCiAgICAgLiBCenIpKQogICJIZXVyaXN0aWMgbWFwcGluZyBVUkwgcmVndWxhciBl eHByZXNzaW9ucyB0byBWQyBiYWNrZW5kcy4iCiAgOnR5cGUgYChhbGlzdCA6a2V5LXR5cGUgKHJl Z2V4cCA6dGFnICJSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgVVJMcyIpCiAgICAgICAgICAg ICAgICA6dmFsdWUtdHlwZSAoY2hvaWNlIDp0YWcgIlZDIEJhY2tlbmQiCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICxAKG1hcGNhciAobGFtYmRhIChiKSBgKGNvbnN0ICxiKSkK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjLWhhbmRsZWQt YmFja2VuZHMpKSkKICA6dmVyc2lvbiAiMjkuMSIpCgooZGVmY3VzdG9tIHBhY2thZ2UtdmMtZGVm YXVsdC1iYWNrZW5kICdHaXQKICAiRGVmYXVsdCBWQyBiYWNrZW5kIHVzZWQgd2hlbiBjbG9uaW5n IGEgcGFja2FnZSByZXBvc2l0b3J5LgpJZiBubyByZXBvc2l0b3J5IHR5cGUgd2FzIHNwZWNpZmll ZCBvciBjb3VsZCBiZSBndWVzc2VkIGJ5CmBwYWNrYWdlLXZjLWhldXJpc3RpYy1hbGlzdCcsIHRo aXMgaXMgdGhlIGRlZmF1bHQgVkMgYmFja2VuZAp1c2VkIGFzIGZhbGxiYWNrLiAgVGhlIHZhbHVl IG11c3QgYmUgYSBtZW1iZXIgb2YKYHZjLWhhbmRsZWQtYmFja2VuZHMnIGFuZCB0aGUgbmFtZWQg YmFja2VuZCBtdXN0IGltcGxlbWVudAp0aGUgYGNsb25lJyBmdW5jdGlvbi4iCiAgOnR5cGUgYChj aG9pY2UgLEAobWFwY2FyIChsYW1iZGEgKGIpIChsaXN0ICdjb25zdCBiKSkKICAgICAgICAgICAg ICAgICAgICAgICAgICAgdmMtaGFuZGxlZC1iYWNrZW5kcykpCiAgOnZlcnNpb24gIjI5LjEiKQoK KGRlZmN1c3RvbSBwYWNrYWdlLXZjLXJlZ2lzdGVyLWFzLXByb2plY3QgdAogICJOb24tbmlsIG1l YW5zIHRoYXQgcGFja2FnZXMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYXMgcHJvamVjdHMuIgogIDp0 eXBlICdib29sZWFuCiAgOnZlcnNpb24gIjMwLjEiKQoKKGRlZnZhciBwYWNrYWdlLXZjLXNlbGVj dGVkLXBhY2thZ2VzKSA7IHBhY2lmeSBieXRlLWNvbXBpbGVyCgo7OzsjIyNhdXRvbG9hZAooZGVm dW4gcGFja2FnZS12Yy1pbnN0YWxsLXNlbGVjdGVkLXBhY2thZ2VzICgpCiAgIkVuc3VyZSBwYWNr YWdlcyBzcGVjaWZpZWQgaW4gYHBhY2thZ2UtdmMtc2VsZWN0ZWQtcGFja2FnZXMnIGFyZSBpbnN0 YWxsZWQuIgogIChpbnRlcmFjdGl2ZSkKICAocGNhc2UtZG9saXN0IChgKCxuYW1lIC4gLHNwZWMp IHBhY2thZ2UtdmMtc2VsZWN0ZWQtcGFja2FnZXMpCiAgICAod2hlbiAoc3RyaW5ncCBuYW1lKQog ICAgICAoc2V0cSBuYW1lIChpbnRlcm4gbmFtZSkpKQogICAgKGxldCAoKHBrZy1kZXNjcyAoYXNz b2MgbmFtZSBwYWNrYWdlLWFsaXN0ICMnc3RyaW5nPSkpKQogICAgICAodW5sZXNzIChzZXEtc29t ZSAjJ3BhY2thZ2UtdmMtcCAoY2RyIHBrZy1kZXNjcykpCiAgICAgICAgKGNvbmQKICAgICAgICAg KChudWxsIHNwZWMpCiAgICAgICAgICAocGFja2FnZS12Yy1pbnN0YWxsIG5hbWUpKQogICAgICAg ICAoKHN0cmluZ3Agc3BlYykKICAgICAgICAgIChwYWNrYWdlLXZjLWluc3RhbGwgbmFtZSBzcGVj KSkKICAgICAgICAgKChsaXN0cCBzcGVjKQogICAgICAgICAgKHBhY2thZ2UtdmMtLWFyY2hpdmVz LWluaXRpYWxpemUpCiAgICAgICAgICAocGFja2FnZS12Yy0tdW5wYWNrCiAgICAgICAgICAgKG9y IChjYWRyIChhc3NvYyBuYW1lIHBhY2thZ2UtYXJjaGl2ZS1jb250ZW50cykpCiAgICAgICAgICAg ICAgIChwYWNrYWdlLWRlc2MtY3JlYXRlIDpuYW1lIG5hbWUgOmtpbmQgJ3ZjKSkKICAgICAgICAg ICBzcGVjKSkpKSkpKQoKKGRlZmN1c3RvbSBwYWNrYWdlLXZjLXNlbGVjdGVkLXBhY2thZ2VzICco KQogICJMaXN0IG9mIHBhY2thZ2VzIHRoYXQgbXVzdCBiZSBpbnN0YWxsZWQuCkVhY2ggbWVtYmVy IG9mIHRoZSBsaXN0IGlzIG9mIHRoZSBmb3JtIChOQU1FIC4gU1BFQyksIHdoZXJlIE5BTUUKaXMg YSBzeW1ib2wgZGVzaWduYXRpbmcgdGhlIHBhY2thZ2UgYW5kIFNQRUMgaXMgb25lIG9mOgoKLSBu aWwsIGlmIGFueSBwYWNrYWdlIHZlcnNpb24gY2FuIGJlIGluc3RhbGxlZDsKLSBhIHZlcnNpb24g c3RyaW5nLCBpZiB0aGF0IHNwZWNpZmljIHJldmlzaW9uIGlzIHRvIGJlIGluc3RhbGxlZDsKLSBh IHByb3BlcnR5IGxpc3QsIGRlc2NyaWJpbmcgYSBwYWNrYWdlIHNwZWNpZmljYXRpb24uICBGb3Ig bW9yZQogIGRldGFpbHMsIHBsZWFzZSBjb25zdWx0IHRoZSBzdWJzZWN0aW9uIFwiU3BlY2lmeWlu ZyBQYWNrYWdlCiAgU291cmNlc1wiIGluIHRoZSBJbmZvIG5vZGUgYChlbWFjcylGZXRjaGluZyBQ YWNrYWdlIFNvdXJjZXMnLgoKVGhpcyB1c2VyIG9wdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkg dXBkYXRlZCB0byBzdG9yZSBwYWNrYWdlCnNwZWNpZmljYXRpb25zIGZvciBwYWNrYWdlcyB0aGF0 IGFyZSBub3Qgc3BlY2lmaWVkIGluIGFueQphcmNoaXZlLiIKICA6dHlwZSAnKGFsaXN0IDp0YWcg Ikxpc3Qgb2YgcGFja2FnZXMgeW91IHdhbnQgdG8gYmUgaW5zdGFsbGVkIgogICAgICAgICAgICAg ICAgOmtleS10eXBlIChzeW1ib2wgOnRhZyAiUGFja2FnZSIpCiAgICAgICAgICAgICAgICA6dmFs dWUtdHlwZQogICAgICAgICAgICAgICAgKGNob2ljZSAoY29uc3QgOnRhZyAiQW55IHJldmlzaW9u IiBuaWwpCiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcgOnRhZyAiU3BlY2lmaWMgcmV2 aXNpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAocGxpc3QgOm9wdGlvbnMgKCg6dXJsIHN0 cmluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOmJyYW5jaCBz dHJpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDpsaXNwLWRp ciBzdHJpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDptYWlu LWZpbGUgc3RyaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6 ZG9jIHN0cmluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOnZj LWJhY2tlbmQgc3ltYm9sKSkpKSkKICA6dmVyc2lvbiAiMjkuMSIpCgooZGVmdmFyIHBhY2thZ2Ut dmMtLWFyY2hpdmUtc3BlYy1hbGlzdHMgbmlsCiAgIkxpc3Qgb2YgcGFja2FnZSBzcGVjaWZpY2F0 aW9ucyBmb3IgZWFjaCBhcmNoaXZlLgpUaGUgbGlzdCBtYXBzIGVhY2ggcGFja2FnZSBuYW1lLCBh cyBhIHN0cmluZywgdG8gYSBwbGlzdCBhcwpzcGVjaWZpZWQgaW4gYHBhY2thZ2UtdmMtc2VsZWN0 ZWQtcGFja2FnZXMnLiIpCgooZGVmdmFyIHBhY2thZ2UtdmMtLWFyY2hpdmUtZGF0YS1hbGlzdCBu aWwKICAiTGlzdCBvZiBwYWNrYWdlIHNwZWNpZmljYXRpb24gbWV0YWRhdGEgZm9yIGFyY2hpdmVz LgpFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QgaGFzIHRoZSBmb3JtIChBUkNISVZFIC4gUExJU1Qp LCB3aGVyZQpQTElTVCBrZXlzIGFyZSBvbmUgb2Y6CgogYDp2ZXJzaW9uJyAoaW50ZWdlcikKICAg SW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIGZvcm1hdHRpbmcsIHRvIGJlIGNvbXBh cmVkCiAgIHdpdGggYHBhY2thZ2UtdmMtLWVscGEtcGFja2FnZXMtdmVyc2lvbicuCgogYDp2Yy1i YWNrZW5kJyAoc3ltYm9sKQogICBBIHN5bWJvbCBvZiB0aGUgZGVmYXVsdCBWQyBiYWNrZW5kIHRv IHVzZSBpZiBhIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbgogICBkb2VzIG5vdCBpbmRpY2F0ZSBhIGJh Y2tlbmQuICBUaGUgdmFsdWUgb3VnaHQgdG8gYmUgYSBtZW1iZXIgb2YKICAgYHZjLWhhbmRsZWQt YmFja2VuZHMnLiAgSWYgb21pdHRlZCwgYHZjLWNsb25lJyB3aWxsIGZhbGwgYmFjayBvbgogICBg cGFja2FnZS12Yy1kZWZhdWx0LWJhY2tlbmQnLgoKQWxsIG90aGVyIHZhbHVlcyBhcmUgaWdub3Jl ZC4iKQoKKGRlZnVuIHBhY2thZ2UtdmMtLWRlc2MtPnNwZWMgKHBrZy1kZXNjICZvcHRpb25hbCBu YW1lKQogICJSZXRyaWV2ZSB0aGUgcGFja2FnZSBzcGVjaWZpY2F0aW9uIGZvciBQS0ctREVTQy4K VGhlIG9wdGlvbmFsIGFyZ3VtZW50IE5BTUUgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRl ZmF1bHQKbmFtZSBmb3IgUEtHLURFU0MuIgogIChhbGlzdC1nZXQKICAgKHNldHEgbmFtZSAob3Ig bmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKSkKICAgKGlmIChhbmQgKHBhY2thZ2Ut ZGVzYy1hcmNoaXZlIHBrZy1kZXNjKQogICAgICAgICAgICAobm90IChhbGlzdC1nZXQgbmFtZSBw YWNrYWdlLXZjLXNlbGVjdGVkLXBhY2thZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBu aWwgbmlsICMnc3RyaW5nPSkpKQogICAgICAgKGFsaXN0LWdldCAoaW50ZXJuIChwYWNrYWdlLWRl c2MtYXJjaGl2ZSBwa2ctZGVzYykpCiAgICAgICAgICAgICAgICAgIHBhY2thZ2UtdmMtLWFyY2hp dmUtc3BlYy1hbGlzdHMpCiAgICAgOzsgQ29uc3VsdCBib3RoIG91ciBsb2NhbCBsaXN0IG9mIHBh Y2thZ2Ugc3BlY2lmaWNhdGlvbnMsIGFzIHdlbGwKICAgICA7OyBhcyB0aGUgbGlzdHMgcHJvdmlk ZWQgYnkgdGhlIGFyY2hpdmVzLgogICAgIChhcHBseSAjJ2FwcGVuZCAoY29ucyBwYWNrYWdlLXZj LXNlbGVjdGVkLXBhY2thZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjYXIgIydj ZHIgcGFja2FnZS12Yy0tYXJjaGl2ZS1zcGVjLWFsaXN0cykpKSkKICAgJygpIG5pbCAjJ3N0cmlu Zz0pKQoKKGRlZnVuIHBhY2thZ2UtdmMtLXJlYWQtYXJjaGl2ZS1kYXRhIChhcmNoaXZlKQogICJV cGRhdGUgYHBhY2thZ2UtdmMtLWFyY2hpdmUtc3BlYy1hbGlzdHMnIGZvciBBUkNISVZFLgpUaGlz IGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBob29rIGZvciBgcGFja2FnZS1yZWFk LWFyY2hpdmUtaG9vaycuIgogIChsZXQgKChjb250ZW50cy1maWxlIChleHBhbmQtZmlsZS1uYW1l CiAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgImFyY2hpdmVzLyVzL2VscGEtcGFja2Fn ZXMuZWxkIiBhcmNoaXZlKQogICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLXVzZXItZGly KSkpCiAgICAod2hlbiAoZmlsZS1leGlzdHMtcCBjb250ZW50cy1maWxlKQogICAgICAod2l0aC10 ZW1wLWJ1ZmZlcgogICAgICAgIChsZXQgKChjb2Rpbmctc3lzdGVtLWZvci1yZWFkICd1dGYtOCkp CiAgICAgICAgICAoaW5zZXJ0LWZpbGUtY29udGVudHMgY29udGVudHMtZmlsZSkKICAgICAgICAg IDs7IFRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgaXMgZXhwZWN0ZWQgdG8gaGF2ZSB0aGUg Zm9ybQogICAgICAgICAgOzsKICAgICAgICAgIDs7ICAgICgoKCJmb28iIDp1cmwgIi4uLiIgLi4u KSAuLi4pCiAgICAgICAgICA7OyAgICAgOnZlcnNpb24gMQogICAgICAgICAgOzsgICAgIDpkZWZh dWx0LXZjIEdpdCkKICAgICAgICAgIChsZXQgKChzcGVjIChyZWFkIChjdXJyZW50LWJ1ZmZlcikp KSkKICAgICAgICAgICAgKHdoZW4gKGVxIHBhY2thZ2UtdmMtLWVscGEtcGFja2FnZXMtdmVyc2lv bgogICAgICAgICAgICAgICAgICAgICAgKHBsaXN0LWdldCAoY2RyIHNwZWMpIDp2ZXJzaW9uKSkK ICAgICAgICAgICAgICAoc2V0ZiAoYWxpc3QtZ2V0IChpbnRlcm4gYXJjaGl2ZSkgcGFja2FnZS12 Yy0tYXJjaGl2ZS1zcGVjLWFsaXN0cykKICAgICAgICAgICAgICAgICAgICAoY2FyIHNwZWMpKSkK ICAgICAgICAgICAgKHNldGYgKGFsaXN0LWdldCAoaW50ZXJuIGFyY2hpdmUpIHBhY2thZ2UtdmMt LWFyY2hpdmUtZGF0YS1hbGlzdCkKICAgICAgICAgICAgICAgICAgKGNkciBzcGVjKSkKICAgICAg ICAgICAgKHdoZW4tbGV0ICgoZGVmYXVsdC12YyAocGxpc3QtZ2V0IChjZHIgc3BlYykgOmRlZmF1 bHQtdmMpKQogICAgICAgICAgICAgICAgICAgICAgICgobm90IChtZW1xIGRlZmF1bHQtdmMgdmMt aGFuZGxlZC1iYWNrZW5kcykpKSkKICAgICAgICAgICAgICAod2FybiAiQXJjaGl2ZSBgJVMnIGV4 cGVjdHMgbWlzc2luZyBWQyBiYWNrZW5kICVTIgogICAgICAgICAgICAgICAgICAgIGFyY2hpdmUg KHBsaXN0LWdldCAoY2RyIHNwZWMpIDpkZWZhdWx0LXZjKSkpKSkpKSkpCgooZGVmdW4gcGFja2Fn ZS12Yy0tZG93bmxvYWQtYW5kLXJlYWQtYXJjaGl2ZXMgKCZvcHRpb25hbCBhc3luYykKICAiRG93 bmxvYWQgc3BlY2lmaWNhdGlvbnMgb2YgYWxsIGBwYWNrYWdlLWFyY2hpdmVzJyBhbmQgcmVhZCB0 aGVtLgpQb3B1bGF0ZSBgcGFja2FnZS12Yy0tYXJjaGl2ZS1zcGVjLWFsaXN0cycgd2l0aCB0aGUg cmVzdWx0LgoKSWYgb3B0aW9uYWwgYXJndW1lbnQgQVNZTkMgaXMgbm9uLW5pbCwgcGVyZm9ybSB0 aGUgZG93bmxvYWRzCmFzeW5jaHJvbm91c2x5LiIKICAoZG9saXN0IChhcmNoaXZlIHBhY2thZ2Ut YXJjaGl2ZXMpCiAgICAoY29uZGl0aW9uLWNhc2UgZXJyCiAgICAgICAgKHBhY2thZ2UtLWRvd25s b2FkLW9uZS1hcmNoaXZlIGFyY2hpdmUgImVscGEtcGFja2FnZXMuZWxkIiBhc3luYykKICAgICAg KGVycm9yIChtZXNzYWdlICJGYWlsZWQgdG8gZG93bmxvYWQgYCVzJyBhcmNoaXZlOiAlUyIgKGNh ciBhcmNoaXZlKSBlcnIpKSkpKQoKKGFkZC1ob29rICdwYWNrYWdlLXJlYWQtYXJjaGl2ZS1ob29r ICAgICAjJ3BhY2thZ2UtdmMtLXJlYWQtYXJjaGl2ZS1kYXRhIDIwKQoKKGRlZnVuIHBhY2thZ2Ut dmMtY29tbWl0IChwa2cpCiAgIlJldHVybiB0aGUgbGFzdCBjb21taXQgb2YgYSBkZXZlbG9wbWVu dCBwYWNrYWdlIFBLRy4iCiAgKGNsLWFzc2VydCAocGFja2FnZS12Yy1wIHBrZykpCiAgOzsgRklY TUU6IHZjIHNob3VsZCBiZSBleHRlbmRlZCB0byBhbGxvdyBxdWVyeWluZyB0aGUgY29tbWl0IG9m IGEKICA7OyBkaXJlY3RvcnkgKGFzIGlzIHBvc3NpYmxlIHdoZW4gZGVhbGluZyB3aXRoIGdpdCBy ZXBvc2l0b3JpZXMpLgogIDs7IFRoaXMgc2hvdWxkIGJlIGEgZmFsbGJhY2sgb3B0aW9uLgogIChj bC1sb29wIHdpdGggZGlyID0gKHBhY2thZ2UtZGVzYy1kaXIgcGtnKQogICAgICAgICAgIGZvciBm aWxlIGluIChkaXJlY3RvcnktZmlsZXMgZGlyIHQgIlxcLmVsXFwnIiB0KQogICAgICAgICAgIHdo ZW4gKHZjLXdvcmtpbmctcmV2aXNpb24gZmlsZSkgcmV0dXJuIGl0CiAgICAgICAgICAgZmluYWxs eSByZXR1cm4gInVua25vd24iKSkKCihkZWZ1biBwYWNrYWdlLXZjLS12ZXJzaW9uIChwa2cpCiAg IlJldHVybiB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBWQyBwYWNrYWdlIFBLRy4iCiAgKGNs LWFzc2VydCAocGFja2FnZS12Yy1wIHBrZykpCiAgKGlmLWxldCAoKG1haW4tZmlsZSAocGFja2Fn ZS12Yy0tbWFpbi1maWxlIHBrZykpKQogICAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAgIChp bnNlcnQtZmlsZS1jb250ZW50cyBtYWluLWZpbGUpCiAgICAgICAgKHBhY2thZ2Utc3RyaXAtcmNz LWlkCiAgICAgICAgIChvciAobG0taGVhZGVyICJwYWNrYWdlLXZlcnNpb24iKQogICAgICAgICAg ICAgKGxtLWhlYWRlciAidmVyc2lvbiIpCiAgICAgICAgICAgICAiMCIpKSkKICAgICIwIikpCgoo ZGVmdW4gcGFja2FnZS12Yy0tbWFpbi1maWxlIChwa2ctZGVzYykKICAiUmV0dXJuIHRoZSBuYW1l IG9mIHRoZSBtYWluIGZpbGUgZm9yIFBLRy1ERVNDLiIKICAoY2wtYXNzZXJ0IChwYWNrYWdlLXZj LXAgcGtnLWRlc2MpKQogIChsZXQqICgocGtnLXNwZWMgKHBhY2thZ2UtdmMtLWRlc2MtPnNwZWMg cGtnLWRlc2MpKQogICAgICAgICAobmFtZSAoc3ltYm9sLW5hbWUgKHBhY2thZ2UtZGVzYy1uYW1l IHBrZy1kZXNjKSkpCiAgICAgICAgIChkaXJlY3RvcnkgKGZpbGUtbmFtZS1jb25jYXQKICAgICAg ICAgICAgICAgICAgICAgKG9yIChwYWNrYWdlLWRlc2MtZGlyIHBrZy1kZXNjKQogICAgICAgICAg ICAgICAgICAgICAgICAgKGV4cGFuZC1maWxlLW5hbWUgbmFtZSBwYWNrYWdlLXVzZXItZGlyKSkK ICAgICAgICAgICAgICAgICAgICAgKHBsaXN0LWdldCBwa2ctc3BlYyA6bGlzcC1kaXIpKSkKICAg ICAgICAgKGZpbGUgKGV4cGFuZC1maWxlLW5hbWUKICAgICAgICAgICAgICAgIChvciAocGxpc3Qt Z2V0IHBrZy1zcGVjIDptYWluLWZpbGUpCiAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCBuYW1l ICIuZWwiKSkKICAgICAgICAgICAgICAgIGRpcmVjdG9yeSkpKQogICAgKGlmIChmaWxlLWV4aXN0 cy1wIGZpbGUpIGZpbGUKICAgICAgOzsgVGhlIGZvbGxvd2luZyBoZXVyaXN0aWMgaXMgb25seSBu ZWNlc3Nhcnkgd2hlbiBmZXRjaGluZyBhCiAgICAgIDs7IHJlcG9zaXRvcnkgd2l0aCBVUkwgdGhh dCB3b3VsZCBicmVhayB0aGUgYWJvdmUgYXNzdW1wdGlvbnMuCiAgICAgIDs7IENvbmNyZXRlIGV4 YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYWNoYWMvd2F2ZWZvcm0tZWwgZG9lcwogICAgICA7 OyBub3QgaGF2ZSBhIGZpbGUgd2F2ZWZvcm0tZWwuZWwsIGJ1dCBhIGZpbGUgd2F2ZWZvcm0uZWws IHNvIHdlCiAgICAgIDs7IHRyeSBhbmQgZmluZCB0aGUgY2xvc2VzdCBtYXRjaC4KICAgICAgKGxl dCAoKGRpc3RhbmNlIG1vc3QtcG9zaXRpdmUtZml4bnVtKSAoYmVzdCBuaWwpKQogICAgICAgIChk b2xpc3QgKGFsdCAoZGlyZWN0b3J5LWZpbGVzIGRpcmVjdG9yeSB0ICJcXC5lbFxcJyIgdCkpCiAg ICAgICAgICAobGV0ICgoc2QgKHN0cmluZy1kaXN0YW5jZSBmaWxlIGFsdCkpKQogICAgICAgICAg ICAod2hlbiAoYW5kIChub3QgKHN0cmluZy1tYXRjaC1wIChyeCAob3IgKDogIi1hdXRvbG9hZHMu ZWwiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KDogIi1wa2cuZWwiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZW9zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFs dCkpCiAgICAgICAgICAgICAgICAgICAgICAgKDwgc2QgZGlzdGFuY2UpKQogICAgICAgICAgICAg ICh3aGVuICg8IHNkIGRpc3RhbmNlKQogICAgICAgICAgICAgICAgKHNldHEgZGlzdGFuY2UgKHN0 cmluZy1kaXN0YW5jZSBmaWxlIGFsdCkKICAgICAgICAgICAgICAgICAgICAgIGJlc3QgYWx0KSkp KSkKICAgICAgICBiZXN0KSkpKQoKKGRlZnVuIHBhY2thZ2UtdmMtLWdlbmVyYXRlLWRlc2NyaXB0 aW9uLWZpbGUgKHBrZy1kZXNjIHBrZy1maWxlKQogICJHZW5lcmF0ZSBhIHBhY2thZ2UgZGVzY3Jp cHRpb24gZmlsZSBmb3IgUEtHLURFU0MgYW5kIHdyaXRlIGl0IHRvIFBLRy1GSUxFLiIKICAobGV0 ICgobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKSkKICAgIDs7IEluZmVyIHRoZSBz dWJqZWN0IGlmIG1pc3NpbmcuCiAgICAodW5sZXNzIChwYWNrYWdlLWRlc2Mtc3VtbWFyeSBwa2ct ZGVzYykKICAgICAgKHNldGYgKHBhY2thZ2UtZGVzYy1zdW1tYXJ5IHBrZy1kZXNjKQogICAgICAg ICAgICAobGV0ICgobWFpbi1maWxlIChwYWNrYWdlLXZjLS1tYWluLWZpbGUgcGtnLWRlc2MpKSkK ICAgICAgICAgICAgICAob3IgKHBhY2thZ2UtZGVzYy1zdW1tYXJ5IHBrZy1kZXNjKQogICAgICAg ICAgICAgICAgICAoYW5kLWxldCogKChwa2cgKGNhZHIgKGFzc3EgbmFtZSBwYWNrYWdlLWFyY2hp dmUtY29udGVudHMpKSkpCiAgICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy1zdW1tYXJ5 IHBrZykpCiAgICAgICAgICAgICAgICAgIChhbmQgbWFpbi1maWxlIChmaWxlLWV4aXN0cy1wIG1h aW4tZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAobG0tc3VtbWFyeSBtYWluLWZpbGUpKQog ICAgICAgICAgICAgICAgICBwYWNrYWdlLS1kZWZhdWx0LXN1bW1hcnkpKSkpCiAgICAobGV0ICgo cHJpbnQtbGV2ZWwgbmlsKQogICAgICAgICAgKHByaW50LXF1b3RlZCB0KQogICAgICAgICAgKHBy aW50LWxlbmd0aCBuaWwpKQogICAgICAod3JpdGUtcmVnaW9uCiAgICAgICAoY29uY2F0CiAgICAg ICAgIjs7OyBHZW5lcmF0ZWQgcGFja2FnZSBkZXNjcmlwdGlvbiBmcm9tICIKICAgICAgICAocmVw bGFjZS1yZWdleHAtaW4tc3RyaW5nCiAgICAgICAgICItcGtnXFwuZWxcXCciICIuZWwiCiAgICAg ICAgIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IHBrZy1maWxlKSkKICAgICAgICAiICAtKi0gbm8t Ynl0ZS1jb21waWxlOiB0IC0qLVxuIgogICAgICAgIChwcmluMS10by1zdHJpbmcKICAgICAgICAg KG5jb25jCiAgICAgICAgICAobGlzdCAnZGVmaW5lLXBhY2thZ2UKICAgICAgICAgICAgICAgIChz eW1ib2wtbmFtZSBuYW1lKQogICAgICAgICAgICAgICAgKHBhY2thZ2UtdmMtLXZlcnNpb24gcGtn LWRlc2MpCiAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLXN1bW1hcnkgcGtnLWRlc2MpCiAg ICAgICAgICAgICAgICAobGV0ICgocmVxdWlyZXMgKHBhY2thZ2UtZGVzYy1yZXFzIHBrZy1kZXNj KSkpCiAgICAgICAgICAgICAgICAgIChsaXN0ICdxdW90ZQogICAgICAgICAgICAgICAgICAgICAg ICA7OyBUdXJuIHZlcnNpb24gbGlzdHMgaW50byBzdHJpbmcgZm9ybS4KICAgICAgICAgICAgICAg ICAgICAgICAgKG1hcGNhcgogICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoZWx0KQog ICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAoY2FyIGVsdCkKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtdmVyc2lvbi1qb2luIChjYWRyIGVsdCkpKSkKICAg ICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzKSkpKQogICAgICAgICAgKGxpc3QgOmtpbmQg J3ZjKQogICAgICAgICAgKHBhY2thZ2UtLWFsaXN0LXRvLXBsaXN0LWFyZ3MKICAgICAgICAgICAo cGFja2FnZS1kZXNjLWV4dHJhcyBwa2ctZGVzYykpKSkKICAgICAgICAiXG4iKQogICAgICAgbmls IHBrZy1maWxlIG5pbCAnc2lsZW50KSkpKQoKKGRlZmN1c3RvbSBwYWNrYWdlLXZjLWFsbG93LXNp ZGUtZWZmZWN0cyBuaWwKICAiV2hldGhlciB0byBwcm9jZXNzIDptYWtlIGFuZCA6c2hlbGwtY29t bWFuZCBzcGVjIGFyZ3VtZW50cy4KCkl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcnVuIDptYWtlIGFu ZCA6c2hlbGwtY29tbWFuZCBhcmd1bWVudHMgaW4Kb3JkZXIgdG8gaW5pdGlhbGl6ZSBhIHBhY2th Z2Ugb3IgYnVpbGQgaXRzIGRvY3VtZW50YXRpb24sIGJ1dApwbGVhc2UgYmUgY2FyZWZ1bCB3aGVu IGNoYW5naW5nIHRoaXMgb3B0aW9uLCBhcyBpbnN0YWxsaW5nIGFuZAp1cGRhdGluZyBhIHBhY2th Z2UgY2FuIHJ1biBwb3RlbnRpYWxseSBoYXJtZnVsIGNvZGUuCgpXaGVuIHNldCB0byBhIGxpc3Qg b2Ygc3ltYm9scyAocGFja2FnZXMpLCBydW4gY29tbWFuZHMgZm9yIG9ubHkKcGFja2FnZXMgaW4g dGhlIGxpc3QuICBXaGVuIG5pbCwgbmV2ZXIgcnVuIGNvbW1hbmRzLiAgT3RoZXJ3aXNlCndoZW4g bm9uLW5pbCwgcnVuIGNvbW1hbmRzIGZvciBhbnkgcGFja2FnZSB3aXRoIDptYWtlIG9yCjpzaGVs bC1jb21tYW5kIHNwZWNpZmllZC4KClBhY2thZ2Ugc3BlY3MgYXJlIGxvYWRlZCBmcm9tIHRydXN0 ZWQgcGFja2FnZSBhcmNoaXZlcy4iCiAgOnR5cGUgJyhjaG9pY2UgKGNvbnN0IDp0YWcgIlJ1biBm b3IgYWxsIHBhY2thZ2VzIiB0KQogICAgICAgICAgICAgICAgIChyZXBlYXQgOnRhZyAiUnVuIG9u bHkgZm9yIHNlbGVjdGVkIHBhY2thZ2VzIiAoc3ltYm9sIDp0YWcgIlBhY2thZ2UgbmFtZSIpKQog ICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJOZXZlciBydW4iIG5pbCkpCiAgOnZlcnNpb24g IjMwLjEiKQoKKGRlZnVuIHBhY2thZ2UtdmMtLW1ha2UgKHBrZy1zcGVjIHBrZy1kZXNjKQogICJQ cm9jZXNzIDptYWtlIGFuZCA6c2hlbGwtY29tbWFuZCBpbiBQS0ctU1BFQy4KUEtHLURFU0MgaXMg dGhlIHBhY2thZ2UgZGVzY3JpcHRvciBmb3IgdGhlIHBhY2thZ2UgdGhhdCBpcyBiZWluZwpwcmVw YXJlZC4iCiAgKGxldCAoKHRhcmdldCAocGxpc3QtZ2V0IHBrZy1zcGVjIDptYWtlKSkKICAgICAg ICAoY21kIChwbGlzdC1nZXQgcGtnLXNwZWMgOnNoZWxsLWNvbW1hbmQpKQogICAgICAgIChidWYg KGZvcm1hdCAiICpwYWNrYWdlLXZjIG1ha2UgJXMqIiAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRl c2MpKSkpCiAgICAod2hlbiAob3IgY21kIHRhcmdldCkKICAgICAgKHdpdGgtY3VycmVudC1idWZm ZXIgKGdldC1idWZmZXItY3JlYXRlIGJ1ZikKICAgICAgICAoZXJhc2UtYnVmZmVyKQogICAgICAg ICh3aGVuIChhbmQgY21kICgvPSAwIChjYWxsLXByb2Nlc3Mgc2hlbGwtZmlsZS1uYW1lIG5pbCB0 IG5pbCBzaGVsbC1jb21tYW5kLXN3aXRjaCBjbWQpKSkKICAgICAgICAgICh3YXJuICJGYWlsZWQg dG8gcnVuICVzLCBzZWUgYnVmZmVyICVTIiBjbWQgKGJ1ZmZlci1uYW1lKSkpCiAgICAgICAgKHdo ZW4gKGFuZCB0YXJnZXQgKC89IDAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzICJtYWtlIiBuaWwgdCBu aWwgKGlmIChjb25zcCB0YXJnZXQpIHRhcmdldCAobGlzdCB0YXJnZXQpKSkpKQogICAgICAgICAg KHdhcm4gIkZhaWxlZCB0byBtYWtlICVzLCBzZWUgYnVmZmVyICVTIiB0YXJnZXQgKGJ1ZmZlci1u YW1lKSkpKSkpKQoKKGRlY2xhcmUtZnVuY3Rpb24gb3JnLWV4cG9ydC10by1maWxlICJveCIgKGJh Y2tlbmQgZmlsZSkpCgooZGVmdW4gcGFja2FnZS12Yy0tYnVpbGQtZG9jdW1lbnRhdGlvbiAocGtn LWRlc2MgZmlsZSkKICAiQnVpbGQgZG9jdW1lbnRhdGlvbiBmb3IgcGFja2FnZSBQS0ctREVTQyBm cm9tIGRvY3VtZW50YXRpb24gc291cmNlIGluIEZJTEUuCkZJTEUgY2FuIGJlIGFuIE9yZyBmaWxl LCBpbmRpY2F0ZWQgYnkgaXRzIFwiLm9yZ1wiIGV4dGVuc2lvbiwKb3RoZXJ3aXNlIGl0J3MgYXNz dW1lZCB0byBiZSBhbiBJbmZvIGZpbGUuIgogIChsZXQqICgocGtnLW5hbWUgKHBhY2thZ2UtZGVz Yy1uYW1lIHBrZy1kZXNjKSkKICAgICAgICAgKGRlZmF1bHQtZGlyZWN0b3J5IChwYWNrYWdlLWRl c2MtZGlyIHBrZy1kZXNjKSkKICAgICAgICAgKGRvY3MtZGlyZWN0b3J5IChmaWxlLW5hbWUtZGly ZWN0b3J5IChleHBhbmQtZmlsZS1uYW1lIGZpbGUpKSkKICAgICAgICAgKG91dHB1dCAoZXhwYW5k LWZpbGUtbmFtZSAoZm9ybWF0ICIlcy5pbmZvIiBwa2ctbmFtZSkpKQogICAgICAgICBjbGVhbi11 cCkKICAgICh3aGVuIChzdHJpbmctbWF0Y2gtcCAiXFwub3JnXFwnIiBmaWxlKQogICAgICAocmVx dWlyZSAnb3gpCiAgICAgIChyZXF1aXJlICdveC10ZXhpbmZvKQogICAgICAod2l0aC10ZW1wLWJ1 ZmZlcgogICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyBmaWxlKQogICAgICAgIChzZXRxIGZp bGUgKG1ha2UtdGVtcC1maWxlICJveC10ZXhpbmZvLSIpKQogICAgICAgIChvcmctZXhwb3J0LXRv LWZpbGUgJ3RleGluZm8gZmlsZSkKICAgICAgICAoc2V0cSBjbGVhbi11cCB0KSkpCiAgICAod2l0 aC1jdXJyZW50LWJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIiAqcGFja2FnZS12YyBkb2MqIikK ICAgICAgKGVyYXNlLWJ1ZmZlcikKICAgICAgKGNvbmQKICAgICAgICgoLz0gMCAoY2FsbC1wcm9j ZXNzICJtYWtlaW5mbyIgbmlsIHQgbmlsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLUki IGRvY3MtZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1uby1zcGxpdCIg ZmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1vIiBvdXRwdXQpKQogICAgICAgICht ZXNzYWdlICJGYWlsZWQgdG8gYnVpbGQgbWFudWFsICVzLCBzZWUgYnVmZmVyICVTIgogICAgICAg ICAgICAgICAgIGZpbGUgKGJ1ZmZlci1uYW1lKSkpCiAgICAgICAoKC89IDAgKGNhbGwtcHJvY2Vz cyAiaW5zdGFsbC1pbmZvIiBuaWwgdCBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91 dHB1dCAoZXhwYW5kLWZpbGUtbmFtZSAiZGlyIikpKQogICAgICAgIChtZXNzYWdlICJGYWlsZWQg dG8gaW5zdGFsbCBtYW51YWwgJXMsIHNlZSBidWZmZXIgJVMiCiAgICAgICAgICAgICAgICAgb3V0 cHV0IChidWZmZXItbmFtZSkpKQogICAgICAgKChraWxsLWJ1ZmZlcikpKSkKICAgICh3aGVuIGNs ZWFuLXVwCiAgICAgIChkZWxldGUtZmlsZSBmaWxlKSkpKQoKKGRlZnVuIHBhY2thZ2UtdmMtaW5z dGFsbC1kZXBlbmRlbmNpZXMgKHJlcXVpcmVtZW50cykKICAiSW5zdGFsbCBtaXNzaW5nIGRlcGVu ZGVuY2llcywgYW5kIHJldHVybiBtaXNzaW5nIG9uZXMuClRoZSByZXR1cm4gdmFsdWUgd2lsbCBi ZSBuaWwgaWYgZXZlcnl0aGluZyB3YXMgZm91bmQsIG9yIGEgbGlzdApvZiAoTkFNRSBWRVJTSU9O KSBwYWlycyBvZiBhbGwgcGFja2FnZXMgdGhhdCBjb3VsZG4ndCBiZSBmb3VuZC4KClJFUVVJUkVN RU5UUyBzaG91bGQgYmUgYSBsaXN0IG9mIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzOyBlYWNoCmVs ZW1lbnQgaW4gdGhpcyBsaXN0IHNob3VsZCBoYXZlIHRoZSBmb3JtIChQQUNLQUdFIFZFUlNJT04t TElTVCksCndoZXJlIFBBQ0tBR0UgaXMgYSBwYWNrYWdlIG5hbWUgYW5kIFZFUlNJT04tTElTVCBp cyB0aGUgcmVxdWlyZWQKdmVyc2lvbiBvZiB0aGF0IHBhY2thZ2UuIgogIChsZXQgKCh0by1pbnN0 YWxsICcoKSkgKG1pc3NpbmcgJygpKSkKICAgIChjbC1sYWJlbHMgKChzZWFyY2ggKHBrZykKICAg ICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gZmluZCBhbGwgZGVwZW5kZW5jaWVzIGZvciBQS0cu IgogICAgICAgICAgICAgICAgICAoY29uZAogICAgICAgICAgICAgICAgICAgKChhc3NxIChjYXIg cGtnKSB0by1pbnN0YWxsKSkgO2luaGliaXQgY3ljbGVzCiAgICAgICAgICAgICAgICAgICAoKHBh Y2thZ2UtaW5zdGFsbGVkLXAgKGNhciBwa2cpKSkKICAgICAgICAgICAgICAgICAgICgobGV0KiAo KHBhYyBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAg IChkZXNjIChjYWRyIChhc3NvYyAoY2FyIHBrZykgcGFjKSkpKQogICAgICAgICAgICAgICAgICAg ICAgKGlmIGRlc2MKICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgocmVxcyAocGFja2Fn ZS1kZXNjLXJlcXMgZGVzYykpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1c2ggZGVz YyB0by1pbnN0YWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcGMgIydzZWFyY2gg cmVxcykpCiAgICAgICAgICAgICAgICAgICAgICAgIChwdXNoIHBrZyBtaXNzaW5nKSkpKSkpCiAg ICAgICAgICAgICAgICAodmVyc2lvbi1vcmRlciAoYSBiKQogICAgICAgICAgICAgICAgICAiUHJl ZGljYXRlIHRvIHNvcnQgcGFja2FnZXMgaW4gb3JkZXIuIgogICAgICAgICAgICAgICAgICAodmVy c2lvbi1saXN0LTwKICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRlc2MtdmVyc2lvbiBiKQog ICAgICAgICAgICAgICAgICAgKHBhY2thZ2UtZGVzYy12ZXJzaW9uIGEpKSkKICAgICAgICAgICAg ICAgIChkdXBsaWNhdGUtcCAoYSBiKQogICAgICAgICAgICAgICAgICAiQXJlIEEgYW5kIEIgdGhl IHNhbWUgcGFja2FnZT8iCiAgICAgICAgICAgICAgICAgIChlcSAocGFja2FnZS1kZXNjLW5hbWUg YSkgKHBhY2thZ2UtZGVzYy1uYW1lIGIpKSkKICAgICAgICAgICAgICAgIChkZXBlbmRzLW9uLXAg KHRhcmdldCBwYWNrYWdlKQogICAgICAgICAgICAgICAgICAiRG9lcyBQQUNLQUdFIGRlcGVuZCBv biBUQVJHRVQ/IgogICAgICAgICAgICAgICAgICAob3IgKGVxIHRhcmdldCBwYWNrYWdlKQogICAg ICAgICAgICAgICAgICAgICAgKGxldCogKChwYWMgcGFja2FnZS1hcmNoaXZlLWNvbnRlbnRzKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjIChjYWRyIChhc3NvYyBwYWNrYWdlIHBh YykpKSkKICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBkZXNjIChzZXEtc29tZQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBseS1wYXJ0aWFsbHkgIydkZXBlbmRzLW9u LXAgdGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLWRl c2MtcmVxcyBkZXNjKSkpKSkpCiAgICAgICAgICAgICAgICAoZGVwZW5kZW50LW9yZGVyIChhIGIp CiAgICAgICAgICAgICAgICAgIChsZXQgKChkZXNjLWEgKHBhY2thZ2UtZGVzYy1uYW1lIGEpKQog ICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy1iIChwYWNrYWdlLWRlc2MtbmFtZSBiKSkpCiAg ICAgICAgICAgICAgICAgICAgKG9yIChub3QgZGVzYy1hKSAobm90IGRlc2MtYikKICAgICAgICAg ICAgICAgICAgICAgICAgKG5vdCAoZGVwZW5kcy1vbi1wIGRlc2MtYiBkZXNjLWEpKQogICAgICAg ICAgICAgICAgICAgICAgICAoZGVwZW5kcy1vbi1wIGRlc2MtYSBkZXNjLWIpKSkpKQogICAgICAo bWFwYyAjJ3NlYXJjaCByZXF1aXJlbWVudHMpCiAgICAgIChjbC1jYWxsZiBzb3J0IHRvLWluc3Rh bGwgIyd2ZXJzaW9uLW9yZGVyKQogICAgICAoY2wtY2FsbGYgc2VxLXVuaXEgdG8taW5zdGFsbCAj J2R1cGxpY2F0ZS1wKQogICAgICAoY2wtY2FsbGYgc29ydCB0by1pbnN0YWxsICMnZGVwZW5kZW50 LW9yZGVyKSkKICAgIChtYXBjICMncGFja2FnZS1pbnN0YWxsLWZyb20tYXJjaGl2ZSB0by1pbnN0 YWxsKQogICAgbWlzc2luZykpCgooZGVmdW4gcGFja2FnZS12Yy0tdW5wYWNrLTEgKHBrZy1kZXNj IHBrZy1kaXIpCiAgIlByZXBhcmUgUEtHLURFU0MgdGhhdCBpcyBhbHJlYWR5IGNoZWNrZWQtb3V0 IGluIFBLRy1ESVIuClRoaXMgaW5jbHVkZXMgZG93bmxvYWRpbmcgbWlzc2luZyBkZXBlbmRlbmNp ZXMsIGdlbmVyYXRpbmcKYXV0b2xvYWRzLCBnZW5lcmF0aW5nIGEgcGFja2FnZSBkZXNjcmlwdGlv biBmaWxlICh1c2VkIHRvCmlkZW50aWZ5IGEgcGFja2FnZSBhcyBhIFZDIHBhY2thZ2UgbGF0ZXIg b24pLCBidWlsZGluZwpkb2N1bWVudGF0aW9uIGFuZCBtYXJraW5nIHRoZSBwYWNrYWdlIGFzIGlu c3RhbGxlZC4iCiAgKGxldCAobWlzc2luZykKICAgIDs7IFJlbW92ZSBhbnkgcHJldmlvdXMgaW5z dGFuY2Ugb2YgUEtHLURFU0MgZnJvbSBgcGFja2FnZS1hbGlzdCcKICAgIChsZXQgKChwa2dzIChh c3NxIChwYWNrYWdlLWRlc2MtbmFtZSBwa2ctZGVzYykgcGFja2FnZS1hbGlzdCkpKQogICAgICAo d2hlbiBwa2dzCiAgICAgICAgKHNldGYgKGNkciBwa2dzKSAoc2VxLXJlbW92ZSAjJ3BhY2thZ2Ut dmMtcCAoY2RyIHBrZ3MpKSkpKQoKICAgIDs7IEluIGNhc2UgdGhlIHBhY2thZ2Ugd2FzIGluc3Rh bGxlZCBkaXJlY3RseSBmcm9tIHNvdXJjZSwgdGhlCiAgICA7OyBkZXBlbmRlbmN5IGxpc3Qgd2Fz bid0IGtub3cgYmVmb3JlaGFuZCwgYW5kIHRoZXkgbWlnaHQgaGF2ZQogICAgOzsgdG8gYmUgaW5z dGFsbGVkIGV4cGxpY2l0bHkuCiAgICAobGV0ICgoZGVwcyAnKCkpKQogICAgICAoZG9saXN0IChm aWxlIChkaXJlY3RvcnktZmlsZXMgcGtnLWRpciB0ICJcXC5lbFxcJyIgdCkpCiAgICAgICAgKHdp dGgtdGVtcC1idWZmZXIKICAgICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyBmaWxlKQogICAg ICAgICAgKHdoZW4tbGV0KiAoKHJlcXVpcmUtbGluZXMgKGxtLWhlYWRlci1tdWx0aWxpbmUgInBh Y2thZ2UtcmVxdWlyZXMiKSkpCiAgICAgICAgICAgICh0aHJlYWQtbGFzdAogICAgICAgICAgICAg IChtYXBjb25jYXQgIydpZGVudGl0eSByZXF1aXJlLWxpbmVzICIgIikKICAgICAgICAgICAgICBw YWNrYWdlLXJlYWQtZnJvbS1zdHJpbmcKICAgICAgICAgICAgICBwYWNrYWdlLS1wcmVwYXJlLWRl cGVuZGVuY2llcwogICAgICAgICAgICAgIChuY29uYyBkZXBzKQogICAgICAgICAgICAgIChzZXRx IGRlcHMpKSkpKQogICAgICAoZG9saXN0IChkZXAgZGVwcykKICAgICAgICAoY2wtY2FsbGYgdmVy c2lvbi10by1saXN0IChjYWRyIGRlcCkpKQogICAgICAoc2V0ZiBtaXNzaW5nIChwYWNrYWdlLXZj LWluc3RhbGwtZGVwZW5kZW5jaWVzIChkZWxldGUtZHVwcyBkZXBzKSkpCiAgICAgIChzZXRmIG1p c3NpbmcgKGRlbHEgKGFzc3EgKHBhY2thZ2UtZGVzYy1uYW1lIHBrZy1kZXNjKQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAg bWlzc2luZykpKQoKICAgIChsZXQgKChkZWZhdWx0LWRpcmVjdG9yeSAoZmlsZS1uYW1lLWFzLWRp cmVjdG9yeSBwa2ctZGlyKSkKICAgICAgICAgIChwa2ctZmlsZSAoZXhwYW5kLWZpbGUtbmFtZSAo cGFja2FnZS0tZGVzY3JpcHRpb24tZmlsZSBwa2ctZGlyKSBwa2ctZGlyKSkKICAgICAgICAgIChw a2ctc3BlYyAocGFja2FnZS12Yy0tZGVzYy0+c3BlYyBwa2ctZGVzYykpKQogICAgICA7OyBHZW5l cmF0ZSBhdXRvbG9hZHMKICAgICAgKGxldCogKChuYW1lIChwYWNrYWdlLWRlc2MtbmFtZSBwa2ct ZGVzYykpCiAgICAgICAgICAgICAoYXV0by1uYW1lIChmb3JtYXQgIiVzLWF1dG9sb2Fkcy5lbCIg bmFtZSkpCiAgICAgICAgICAgICAobGlzcC1kaXIgKHBsaXN0LWdldCBwa2ctc3BlYyA6bGlzcC1k aXIpKSkKICAgICAgICAocGFja2FnZS1nZW5lcmF0ZS1hdXRvbG9hZHMKICAgICAgICAgbmFtZSAo ZmlsZS1uYW1lLWNvbmNhdCBwa2ctZGlyIGxpc3AtZGlyKSkKICAgICAgICAod2hlbiBsaXNwLWRp cgogICAgICAgICAgKHdyaXRlLXJlZ2lvbgogICAgICAgICAgICh3aXRoLXRlbXAtYnVmZmVyCiAg ICAgICAgICAgICAoaW5zZXJ0ICI7OyBBdXRvbG9hZCBpbmRpcmVjdGlvbiBmb3IgcGFja2FnZS12 Y1xuXG4iKQogICAgICAgICAgICAgKHByaW4xIGAobG9hZCAoZXhwYW5kLWZpbGUtbmFtZQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgLChmaWxlLW5hbWUtY29uY2F0IGxpc3AtZGlyIGF1dG8t bmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciAoYW5kIGxvYWQtZmlsZS1uYW1l CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZS1uYW1lLWRpcmVjdG9y eSBsb2FkLWZpbGUtbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBs b2FkLXBhdGgpKSkpCiAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQtYnVmZmVyKSkKICAgICAg ICAgICAgIChidWZmZXItc3RyaW5nKSkKICAgICAgICAgICBuaWwgKGV4cGFuZC1maWxlLW5hbWUg YXV0by1uYW1lIHBrZy1kaXIpKSkpCgogICAgICA7OyBHZW5lcmF0ZSBwYWNrYWdlIGZpbGUKICAg ICAgKHBhY2thZ2UtdmMtLWdlbmVyYXRlLWRlc2NyaXB0aW9uLWZpbGUgcGtnLWRlc2MgcGtnLWZp bGUpCgogICAgICA7OyBQcm9jZXNzIDptYWtlIGFuZCA6c2hlbGwtY29tbWFuZCBhcmd1bWVudHMg YmVmb3JlIGJ1aWxkaW5nIGRvY3VtZW50YXRpb24KICAgICAgKHdoZW4gKG9yIChlcSBwYWNrYWdl LXZjLWFsbG93LXNpZGUtZWZmZWN0cyB0KQogICAgICAgICAgICAgICAgKG1lbXEgKHBhY2thZ2Ut ZGVzYy1uYW1lIHBrZy1kZXNjKQogICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS12Yy1hbGxv dy1zaWRlLWVmZmVjdHMpKQogICAgICAgIChwYWNrYWdlLXZjLS1tYWtlIHBrZy1zcGVjIHBrZy1k ZXNjKSkKCiAgICAgIDs7IERldGVjdCBhIG1hbnVhbAogICAgICAod2hlbiAoZXhlY3V0YWJsZS1m aW5kICJpbnN0YWxsLWluZm8iKQogICAgICAgIChkb2xpc3QgKGRvYy1maWxlIChlbnN1cmUtbGlz dCAocGxpc3QtZ2V0IHBrZy1zcGVjIDpkb2MpKSkKICAgICAgICAgIChwYWNrYWdlLXZjLS1idWls ZC1kb2N1bWVudGF0aW9uIHBrZy1kZXNjIGRvYy1maWxlKSkpKQoKICAgIDs7IFVwZGF0ZSBwYWNr YWdlLWFsaXN0LgogICAgKGxldCAoKG5ldy1kZXNjIChwYWNrYWdlLWxvYWQtZGVzY3JpcHRvciBw a2ctZGlyKSkpCiAgICAgIDs7IEFjdGl2YXRpb24gaGFzIHRvIGJlIGRvbmUgYmVmb3JlIGNvbXBp bGF0aW9uLCBzbyB0aGF0IGlmIHdlJ3JlCiAgICAgIDs7IHVwZ3JhZGluZyBhbmQgbWFjcm9zIGhh dmUgY2hhbmdlZCB3ZSBsb2FkIHRoZSBuZXcgZGVmaW5pdGlvbnMKICAgICAgOzsgYmVmb3JlIGNv bXBpbGluZy4KICAgICAgKHdoZW4gKHBhY2thZ2UtYWN0aXZhdGUtMSBuZXctZGVzYyA6cmVsb2Fk IDpkZXBzKQogICAgICAgIDs7IEZJWE1FOiBDb21waWxhdGlvbiBzaG91bGQgYmUgZG9uZSBhcyBh IHNlcGFyYXRlLCBvcHRpb25hbCwgc3RlcC4KICAgICAgICA7OyBFLmcuIGZvciBtdWx0aS1wYWNr YWdlIGluc3RhbGxzLCB3ZSBzaG91bGQgZmlyc3QgaW5zdGFsbCBhbGwgcGFja2FnZXMKICAgICAg ICA7OyBhbmQgdGhlbiBjb21waWxlIHRoZW0uCiAgICAgICAgKHBhY2thZ2UtLWNvbXBpbGUgbmV3 LWRlc2MpCiAgICAgICAgKHdoZW4gcGFja2FnZS1uYXRpdmUtY29tcGlsZQogICAgICAgICAgKHBh Y2thZ2UtLW5hdGl2ZS1jb21waWxlLWFzeW5jIG5ldy1kZXNjKSkKICAgICAgICA7OyBBZnRlciBj b21waWxhdGlvbiwgbG9hZCBhZ2FpbiBhbnkgZmlsZXMgbG9hZGVkIGJ5CiAgICAgICAgOzsgYGFj dGl2YXRlLTEnLCBzbyB0aGF0IHdlIHVzZSB0aGUgYnl0ZS1jb21waWxlZCBkZWZpbml0aW9ucy4K ICAgICAgICAocGFja2FnZS0tcmVsb2FkLXByZXZpb3VzbHktbG9hZGVkIG5ldy1kZXNjKSkpCgog ICAgOzsgTWFyayBwYWNrYWdlIGFzIHNlbGVjdGVkCiAgICAobGV0ICgobmFtZSAocGFja2FnZS1k ZXNjLW5hbWUgcGtnLWRlc2MpKSkKICAgICAgKHVubGVzcyAobWVtcSBuYW1lIHBhY2thZ2Utc2Vs ZWN0ZWQtcGFja2FnZXMpCiAgICAgICAgKHBhY2thZ2UtLXNhdmUtc2VsZWN0ZWQtcGFja2FnZXMK ICAgICAgICAgKGNvbnMgbmFtZSBwYWNrYWdlLXNlbGVjdGVkLXBhY2thZ2VzKSkpKQoKICAgIChw YWNrYWdlLS1xdWlja3N0YXJ0LW1heWJlLXJlZnJlc2gpCgogICAgOzsgQ29uZmlybSB0aGF0IHRo ZSBpbnN0YWxsYXRpb24gd2FzIHN1Y2Nlc3NmdWwKICAgIChsZXQgKChtYWluLWZpbGUgKHBhY2th Z2UtdmMtLW1haW4tZmlsZSBwa2ctZGVzYykpKQogICAgICAobWVzc2FnZSAiVkMgcGFja2FnZSBg JXMnIGluc3RhbGxlZCAoVmVyc2lvbiAlcywgUmV2aXNpb24gJVMpLiVzIgogICAgICAgICAgICAg ICAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpCiAgICAgICAgICAgICAgIChsbS13aXRoLWZp bGUgbWFpbi1maWxlCiAgICAgICAgICAgICAgICAgKHBhY2thZ2Utc3RyaXAtcmNzLWlkCiAgICAg ICAgICAgICAgICAgIChvciAobG0taGVhZGVyICJwYWNrYWdlLXZlcnNpb24iKQogICAgICAgICAg ICAgICAgICAgICAgKGxtLWhlYWRlciAidmVyc2lvbiIpKSkpCiAgICAgICAgICAgICAgICh2Yy13 b3JraW5nLXJldmlzaW9uIG1haW4tZmlsZSkKICAgICAgICAgICAgICAgKGlmIG1pc3NpbmcKICAg ICAgICAgICAgICAgICAgICAoZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgICIgRmFpbGVkIHRv IGluc3RhbGwgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXM6ICVzIgogICAgICAgICAgICAgICAg ICAgICAobWFwY29uY2F0CiAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChwKQogICAgICAg ICAgICAgICAgICAgICAgICAoZm9ybWF0ICIlcyAoJXMpIiAoY2FyIHApIChjYWRyIHApKSkKICAg ICAgICAgICAgICAgICAgICAgIG1pc3NpbmcgIiwgIikpCiAgICAgICAgICAgICAgICAgIiIpKSkK ICAgIHQpKQoKKGRlZnVuIHBhY2thZ2UtdmMtLWd1ZXNzLWJhY2tlbmQgKHVybCkKICAiR3Vlc3Mg dGhlIFZDIGJhY2tlbmQgZm9yIFVSTC4KVGhpcyBmdW5jdGlvbiB3aWxsIGludGVybmFsbHkgcXVl cnkgYHBhY2thZ2UtdmMtaGV1cmlzdGljLWFsaXN0JwphbmQgcmV0dXJuIG5pbCBpZiBpdCBjYW5u b3QgcmVhc29uYWJseSBndWVzcy4iCiAgKGFuZCB1cmwgKGFsaXN0LWdldCB1cmwgcGFja2FnZS12 Yy1oZXVyaXN0aWMtYWxpc3QKICAgICAgICAgICAgICAgICAgICAgIG5pbCBuaWwgIydzdHJpbmct bWF0Y2gtcCkpKQoKKGRlY2xhcmUtZnVuY3Rpb24gcHJvamVjdC1yZW1lbWJlci1wcm9qZWN0cy11 bmRlciAicHJvamVjdCIgKGRpciAmb3B0aW9uYWwgcmVjdXJzaXZlKSkKCihkZWZ1biBwYWNrYWdl LXZjLS1jbG9uZSAocGtnLWRlc2MgcGtnLXNwZWMgZGlyIHJldikKICAiQ2xvbmUgdGhlIHBhY2th Z2UgUEtHLURFU0Mgd2hvc2Ugc3BlYyBpcyBQS0ctU1BFQyBpbnRvIHRoZSBkaXJlY3RvcnkgRElS LgpSRVYgc3BlY2lmaWVzIGEgc3BlY2lmaWMgcmV2aXNpb24gdG8gY2hlY2tvdXQuICBUaGlzIG92 ZXJyaWRlcyB0aGUgYDpicmFuY2gnCmF0dHJpYnV0ZSBpbiBQS0ctU1BFQy4iCiAgKHBjYXNlLWxl dCogKChuYW1lIChwYWNrYWdlLWRlc2MtbmFtZSBwa2ctZGVzYykpCiAgICAgICAgICAgICAgICgo bWFwIDp1cmwgOmJyYW5jaCkgcGtnLXNwZWMpKQoKICAgIDs7IENsb25lIHRoZSByZXBvc2l0b3J5 IGludG8gYHJlcG8tZGlyJyBpZiBuZWNlc3NhcnkKICAgICh1bmxlc3MgKGZpbGUtZXhpc3RzLXAg ZGlyKQogICAgICAobWFrZS1kaXJlY3RvcnkgKGZpbGUtbmFtZS1kaXJlY3RvcnkgZGlyKSB0KQog ICAgICAobGV0ICgoYmFja2VuZCAob3IgKHBsaXN0LWdldCBwa2ctc3BlYyA6dmMtYmFja2VuZCkK ICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrYWdlLXZjLS1ndWVzcy1iYWNrZW5kIHVybCkK ICAgICAgICAgICAgICAgICAgICAgICAgIChwbGlzdC1nZXQgKGFsaXN0LWdldCAocGFja2FnZS1k ZXNjLWFyY2hpdmUgcGtnLWRlc2MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcGFja2FnZS12Yy0tYXJjaGl2ZS1kYXRhLWFsaXN0CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsIG5pbCAjJ3N0cmluZz0pCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp2Yy1iYWNrZW5kKQogICAgICAgICAgICAg ICAgICAgICAgICAgcGFja2FnZS12Yy1kZWZhdWx0LWJhY2tlbmQpKSkKICAgICAgICAodW5sZXNz ICh2Yy1jbG9uZSB1cmwgYmFja2VuZCBkaXIKICAgICAgICAgICAgICAgICAgICAgICAgICAob3Ig KGFuZCAobm90IChlcSByZXYgOmxhc3QtcmVsZWFzZSkpIHJldikgYnJhbmNoKSkKICAgICAgICAg IChlcnJvciAiRmFpbGVkIHRvIGNsb25lICVzIGZyb20gJXMiIG5hbWUgdXJsKSkpKQoKICAgICh3 aGVuIHBhY2thZ2UtdmMtcmVnaXN0ZXItYXMtcHJvamVjdAogICAgICAobGV0ICgoZGVmYXVsdC1k aXJlY3RvcnkgZGlyKSkKICAgICAgICAocmVxdWlyZSAncHJvamVjdCkKICAgICAgICAocHJvamVj dC1yZW1lbWJlci1wcm9qZWN0cy11bmRlciBkaXIpKSkKCiAgICA7OyBDaGVjayBvdXQgdGhlIGxh dGVzdCByZWxlYXNlIGlmIHJlcXVlc3RlZAogICAgKHdoZW4gKGVxIHJldiA6bGFzdC1yZWxlYXNl KQogICAgICAoaWYtbGV0ICgocmVsZWFzZS1yZXYgKHBhY2thZ2UtdmMtLXJlbGVhc2UtcmV2IHBr Zy1kZXNjKSkpCiAgICAgICAgICAodmMtcmV0cmlldmUtdGFnIGRpciByZWxlYXNlLXJldikKICAg ICAgICAobWVzc2FnZSAiTm8gcmVsZWFzZSByZXZpc2lvbiB3YXMgZm91bmQsIGNvbnRpbnVpbmcu Li4iKSkpKSkKCihkZWZ2YXIgcGFja2FnZS12Yy1ub24tY29kZS1maWxlLW5hbWVzCiAgJygiLmRp ci1sb2NhbHMuZWwiICIuZGlyLWxvY2Fscy0yLmVsIikKICAiTGlzdCBvZiBmaWxlIG5hbWVzIHRo YXQgZG8gbm90IGNvbnRhaW4gRW1hY3MgTGlzcCBjb2RlLgpUaGlzIGxpc3QgaXMgdXNlZCBieSBg cGFja2FnZS12Yy0tdW5wYWNrJyB0byBiZXR0ZXIgY2hlY2sgaWYgdGhlCnVzZXIgaXMgZmV0Y2hp bmcgY29kZSBmcm9tIGEgcmVwb3NpdG9yeSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55CkVtYWNz IExpc3AgZmlsZXMuIikKCihkZWZ1biBwYWNrYWdlLXZjLS11bnBhY2sgKHBrZy1kZXNjIHBrZy1z cGVjICZvcHRpb25hbCByZXYpCiAgIkluc3RhbGwgdGhlIHBhY2thZ2UgZGVzY3JpYmVkIGJ5IFBL Ry1ERVNDLgpQS0ctU1BFQyBpcyBhIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbiwgYSBwcm9wZXJ0eSBs aXN0IGRlc2NyaWJpbmcKaG93IHRvIGZldGNoIGFuZCBidWlsZCB0aGUgcGFja2FnZS4gIFNlZSBg cGFja2FnZS12Yy0tYXJjaGl2ZS1zcGVjLWFsaXN0cycKZm9yIGRldGFpbHMuICBUaGUgb3B0aW9u YWwgYXJndW1lbnQgUkVWIHNwZWNpZmllcyBhIHNwZWNpZmljIHJldmlzaW9uIHRvCmNoZWNrb3V0 LiAgVGhpcyBvdmVycmlkZXMgdGhlIGA6YnJhbmNoJyBhdHRyaWJ1dGUgaW4gUEtHLVNQRUMuIgog ICh1bmxlc3MgKGVxIChwYWNrYWdlLWRlc2Mta2luZCBwa2ctZGVzYykgJ3ZjKQogICAgKGxldCAo KGNvcHkgKGNvcHktcGFja2FnZS1kZXNjIHBrZy1kZXNjKSkpCiAgICAgIChzZXRmIChwYWNrYWdl LWRlc2Mta2luZCBjb3B5KSAndmMKICAgICAgICAgICAgcGtnLWRlc2MgY29weSkpKQogIChwY2Fz ZS1sZXQqICgoKG1hcCA6bGlzcC1kaXIpIHBrZy1zcGVjKQogICAgICAgICAgICAgICAobmFtZSAo cGFja2FnZS1kZXNjLW5hbWUgcGtnLWRlc2MpKQogICAgICAgICAgICAgICAoZGlybmFtZSAocGFj a2FnZS1kZXNjLWZ1bGwtbmFtZSBwa2ctZGVzYykpCiAgICAgICAgICAgICAgIChwa2ctZGlyIChm aWxlLW5hbWUtYXMtZGlyZWN0b3J5IChleHBhbmQtZmlsZS1uYW1lIGRpcm5hbWUgcGFja2FnZS11 c2VyLWRpcikpKSkKICAgICh3aGVuIChzdHJpbmctZW1wdHktcCBuYW1lKQogICAgICAodXNlci1l cnJvciAiRW1wdHkgcGFja2FnZSBuYW1lIikpCiAgICAoc2V0ZiAocGFja2FnZS1kZXNjLWRpciBw a2ctZGVzYykgcGtnLWRpcikKICAgICh3aGVuIChmaWxlLWV4aXN0cy1wIHBrZy1kaXIpCiAgICAg IChpZiAoeWVzLW9yLW5vLXAgKGZvcm1hdCAiT3ZlcndyaXRlIHByZXZpb3VzIGNoZWNrb3V0IGZv ciBwYWNrYWdlIGAlcyc/IiBuYW1lKSkKICAgICAgICAgIChwYWNrYWdlLS1kZWxldGUtZGlyZWN0 b3J5IHBrZy1kaXIpCiAgICAgICAgKGVycm9yICJUaGVyZSBhbHJlYWR5IGV4aXN0cyBhIGNoZWNr b3V0IGZvciAlcyIgbmFtZSkpKQogICAgKHBhY2thZ2UtdmMtLWNsb25lIHBrZy1kZXNjIHBrZy1z cGVjIHBrZy1kaXIgcmV2KQogICAgKHdoZW4gKGRpcmVjdG9yeS1lbXB0eS1wIHBrZy1kaXIpCiAg ICAgIChkZWxldGUtZGlyZWN0b3J5IHBrZy1kaXIpCiAgICAgIChlcnJvciAiRW1wdHkgY2hlY2tv dXQgZm9yICVzIiBuYW1lKSkKICAgICh1bmxlc3MgKHNlcS1yZW1vdmUKICAgICAgICAgICAgIChs YW1iZGEgKGZpbGUpCiAgICAgICAgICAgICAgIChtZW1iZXIgKGZpbGUtbmFtZS1ub25kaXJlY3Rv cnkgZmlsZSkgcGFja2FnZS12Yy1ub24tY29kZS1maWxlLW5hbWVzKSkKICAgICAgICAgICAgIChk aXJlY3RvcnktZmlsZXMtcmVjdXJzaXZlbHkgcGtnLWRpciAiXFwuZWxcXCciIG5pbCkpCiAgICAg ICh3aGVuICh5ZXMtb3Itbm8tcCAoZm9ybWF0ICJObyBFbWFjcyBMaXNwIGZpbGVzIGZvdW5kIHdo ZW4gZmV0Y2hpbmcgXCIlc1wiLCBcCmFib3J0IGluc3RhbGxhdGlvbj8iIG5hbWUpKQogICAgICAg IChkZWxldGUtZGlyZWN0b3J5IHBrZy1kaXIgdCkKICAgICAgICAodXNlci1lcnJvciAiSW5zdGFs bGF0aW9uIGFib3J0ZWQiKSkpCgogICAgOzsgV2hlbiBub3RoaW5nIGlzIHNwZWNpZmllZCBhYm91 dCBhIGBsaXNwLWRpcicsIHRoZW4gc2hvdWxkCiAgICA7OyBoZXVyaXN0aWNhbGx5IGNoZWNrIGlm IHRoZXJlIGlzIGEgc3ViLWRpcmVjdG9yeSB3aXRoIGxpc3AKICAgIDs7IGZpbGVzLiAgVGhlc2Ug YXJlIGNvbnZlbnRpb25hbGx5IGp1c3QgY2FsbGVkICJsaXNwIiBvciAic3JjIi4KICAgIDs7IElm IHRoaXMgZGlyZWN0b3J5IGV4aXN0cyBhbmQgY29udGFpbnMgbm9uLXplcm8gbnVtYmVyIG9mIGxp c3AKICAgIDs7IGZpbGVzLCB3ZSB3aWxsIHVzZSB0aGF0IGluc3RlYWQgb2YgYHBrZy1kaXInLgog ICAgKGNhdGNoICdkb25lCiAgICAgIChkb2xpc3QgKG5hbWUgJygibGlzcCIgInNyYyIpKQogICAg ICAgICh3aGVuLWxldCogKCgobnVsbCBsaXNwLWRpcikpCiAgICAgICAgICAgICAgICAgICAgKGRp ciAoZXhwYW5kLWZpbGUtbmFtZSBuYW1lIHBrZy1kaXIpKQogICAgICAgICAgICAgICAgICAgICgo ZmlsZS1kaXJlY3RvcnktcCBkaXIpKQogICAgICAgICAgICAgICAgICAgICgoZGlyZWN0b3J5LWZp bGVzIGRpciBuaWwgIlxcYFteLl0uK1xcLmVsXFwnIiB0IDEpKSkKICAgICAgICAgIDs7IFdlIHdv bid0IHVzZSBgZGlyJywgc2luY2UgZGlyIGlzIGFuIGFic29sdXRlIHBhdGggYW5kIHdlCiAgICAg ICAgICA7OyBkb24ndCB3YW50IGBsaXNwLWRpcicgdG8gZGVwZW5kIG9uIHRoZSBjdXJyZW50IGxv Y2F0aW9uIG9mCiAgICAgICAgICA7OyB0aGUgcGFja2FnZSBpbnN0YWxsYXRpb24sIGllLiB0byBi cmVhayBpZiBtb3ZlZCBhcm91bmQgdGhlCiAgICAgICAgICA7OyBmaWxlIHN5c3RlbSBvciBiZXR3 ZWVuIGluc3RhbGxhdGlvbnMuCiAgICAgICAgICAodGhyb3cgJ2RvbmUgKHNldHEgbGlzcC1kaXIg bmFtZSkpKSkpCgogICAgOzsgRW5zdXJlIHdlIGhhdmUgYSBjb3B5IG9mIHRoZSBwYWNrYWdlIHNw ZWNpZmljYXRpb24KICAgICh1bmxlc3MgKHNlcS1zb21lIChsYW1iZGEgKGFsaXN0KSAoZXF1YWwg KGFsaXN0LWdldCBuYW1lIChjZHIgYWxpc3QpKSBwa2ctc3BlYykpCiAgICAgICAgICAgICAgICAg ICAgICBwYWNrYWdlLXZjLS1hcmNoaXZlLXNwZWMtYWxpc3RzKQogICAgICAoY3VzdG9taXplLXNh dmUtdmFyaWFibGUKICAgICAgICdwYWNrYWdlLXZjLXNlbGVjdGVkLXBhY2thZ2VzCiAgICAgICAo Y29ucyAoY29ucyBuYW1lIHBrZy1zcGVjKQogICAgICAgICAgICAgKHNlcS1yZW1vdmUgKGxhbWJk YSAoc3BlYykgKHN0cmluZz0gbmFtZSAoY2FyIHNwZWMpKSkKICAgICAgICAgICAgICAgICAgICAg ICAgIHBhY2thZ2UtdmMtc2VsZWN0ZWQtcGFja2FnZXMpKSkpCgogICAgKHBhY2thZ2UtdmMtLXVu cGFjay0xIHBrZy1kZXNjIHBrZy1kaXIpKSkKCihkZWZ1biBwYWNrYWdlLXZjLS1yZWFkLXBhY2th Z2UtbmFtZSAocHJvbXB0ICZvcHRpb25hbCBhbGxvdy11cmwgaW5zdGFsbGVkKQogICJRdWVyeSB0 aGUgdXNlciBmb3IgYSBWQyBwYWNrYWdlIGFuZCByZXR1cm4gYSBuYW1lIHdpdGggUFJPTVBULgpJ ZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgQUxMT1ctVVJMIGlzIG5vbi1uaWwsIHRoZSB1c2VyIGlz IGFsc28KYWxsb3dlZCB0byBzcGVjaWZ5IGEgbm9uLXBhY2thZ2UgbmFtZS4gIElmIHRoZSBvcHRp b25hbCBhcmd1bWVudApJTlNUQUxMRUQgaXMgbm9uLW5pbCwgdGhlIHNlbGVjdGlvbiB3aWxsIGJl IGZpbHRlcmVkIGRvd24gdG8KVkMgcGFja2FnZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBpbnN0 YWxsZWQuIgogIChwYWNrYWdlLXZjLS1hcmNoaXZlcy1pbml0aWFsaXplKQogIChjb21wbGV0aW5n LXJlYWQgcHJvbXB0IChpZiBpbnN0YWxsZWQgcGFja2FnZS1hbGlzdCBwYWNrYWdlLWFyY2hpdmUt Y29udGVudHMpCiAgICAgICAgICAgICAgICAgICAoaWYgaW5zdGFsbGVkCiAgICAgICAgICAgICAg ICAgICAgICAgKGxhbWJkYSAocGtnKSAocGFja2FnZS12Yy1wIChjYWRyIHBrZykpKQogICAgICAg ICAgICAgICAgICAgICAobGFtYmRhIChwa2cpCiAgICAgICAgICAgICAgICAgICAgICAgKG9yIChw YWNrYWdlLXZjLS1kZXNjLT5zcGVjIChjYWRyIHBrZykpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgIDs7IElmIHdlIGhhdmUgbm8gZXhwbGljaXQgVkMgZGF0YSwgd2UgY2FuIHRyeSBhIGtpbmQg b2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgaGV1cmlzdGljIGFuZCB1c2UgdGhlIFVS TCBoZWFkZXIsIHRoYXQgbWlnaHQgYWxyZWFkeSBiZQogICAgICAgICAgICAgICAgICAgICAgICAg ICA7OyBwb2ludGluZyB0b3dhcmRzIGEgcmVwb3NpdG9yeSwgYW5kIHVzZSB0aGF0IGFzIGEgYmFj a3VwCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQtbGV0KiAoKGV4dHJhcyAocGFja2Fn ZS1kZXNjLWV4dHJhcyAoY2FkciBwa2cpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAodXJsIChhbGlzdC1nZXQgOnVybCBleHRyYXMpKQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICgocGFja2FnZS12Yy0tZ3Vlc3MtYmFja2VuZCB1cmwpKSkpKSkp CiAgICAgICAgICAgICAgICAgICAobm90IGFsbG93LXVybCkpKQoKKGRlZnVuIHBhY2thZ2UtdmMt LXJlYWQtcGFja2FnZS1kZXNjIChwcm9tcHQgJm9wdGlvbmFsIGluc3RhbGxlZCkKICAiUXVlcnkg dGhlIHVzZXIgZm9yIGEgVkMgcGFja2FnZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRpb24gd2l0aCBQ Uk9NUFQuCklmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBJTlNUQUxMRUQgaXMgbm9uLW5pbCwgdGhl IHNlbGVjdGlvbiB3aWxsCmJlIGZpbHRlcmVkIGRvd24gdG8gVkMgcGFja2FnZXMgdGhhdCBoYXZl IGFscmVhZHkgYmVlbgppbnN0YWxsZWQsIGFuZCB0aGUgcGFja2FnZSBkZXNjcmlwdGlvbiB3aWxs IGJlIHRoYXQgb2YgYW4KaW5zdGFsbGVkIHBhY2thZ2UuIgogIChjYWRyIChhc3NvYyAocGFja2Fn ZS12Yy0tcmVhZC1wYWNrYWdlLW5hbWUgcHJvbXB0IG5pbCBpbnN0YWxsZWQpCiAgICAgICAgICAg ICAgIChpZiBpbnN0YWxsZWQgcGFja2FnZS1hbGlzdCBwYWNrYWdlLWFyY2hpdmUtY29udGVudHMp CiAgICAgICAgICAgICAgICMnc3RyaW5nPSkpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2th Z2UtdmMtdXBncmFkZS1hbGwgKCkKICAiQXR0ZW1wdCB0byB1cGdyYWRlIGFsbCBpbnN0YWxsZWQg VkMgcGFja2FnZXMuIgogIChpbnRlcmFjdGl2ZSkKICAoZG9saXN0IChwYWNrYWdlIHBhY2thZ2Ut YWxpc3QpCiAgICAoZG9saXN0IChwa2ctZGVzYyAoY2RyIHBhY2thZ2UpKQogICAgICAod2hlbiAo cGFja2FnZS12Yy1wIHBrZy1kZXNjKQogICAgICAgIChwYWNrYWdlLXZjLXVwZ3JhZGUgcGtnLWRl c2MpKSkpCiAgKG1lc3NhZ2UgIkRvbmUgdXBncmFkaW5nIHBhY2thZ2VzLiIpKQoKOzs7IyMjYXV0 b2xvYWQKKGRlZnVuIHBhY2thZ2UtdmMtdXBncmFkZSAocGtnLWRlc2MpCiAgIkF0dGVtcHQgdG8g dXBncmFkZSB0aGUgcGFja2FnZSBQS0ctREVTQy4iCiAgKGludGVyYWN0aXZlIChsaXN0IChwYWNr YWdlLXZjLS1yZWFkLXBhY2thZ2UtZGVzYyAiVXBncmFkZSBWQyBwYWNrYWdlOiAiIHQpKSkKICA7 OyBIQUNLOiBUbyBydW4gYHBhY2thZ2UtdmMtLXVucGFjay0xJyBhZnRlciBjaGVja2luZyBvdXQg dGhlIG5ldwogIDs7IHJldmlzaW9uLCB3ZSBpbnNlcnQgYSBob29rIGludG8gYHZjLXBvc3QtY29t bWFuZC1mdW5jdGlvbnMnLCBhbmQKICA7OyByZW1vdmUgaXQgcmlnaHQgYWZ0ZXIgaXQgcmFuLiAg VG8gYXZvaWQgcnVubmluZyB0aGUgaG9vayBtdWx0aXBsZQogIDs7IHRpbWVzIG9yIGV2ZW4gZm9y IHRoZSB3cm9uZyByZXBvc2l0b3J5IChhcyBgdmMtcHVsbCcgaXMgb2Z0ZW4KICA7OyBhc3luY2hy b25vdXMpLCB3ZSBleHRyYWN0IHRoZSByZWxldmFudCBhcmd1bWVudHMgdXNpbmcgYSBwc2V1ZG8K ICA7OyBmaWx0ZXIgZm9yIGB2Yy1maWx0ZXItY29tbWFuZC1mdW5jdGlvbicsIGV4ZWN1dGVkIG9u bHkgZm9yIHRoZQogIDs7IHNpZGUgZWZmZWN0LCBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgbGV4aWNh bCBzY29wZS4gIFdoZW4gdGhlIGhvb2sKICA7OyBpcyBydW4sIHdlIGNoZWNrIGlmIHRoZSBhcmd1 bWVudHMgYXJlIHRoZSBzYW1lIChgZXEnKSBhcyB0aGUgb25lcwogIDs7IHByZXZpb3VzbHkgZXh0 cmFjdGVkLCBhbmQgb25seSBpbiB0aGF0IGNhc2Ugd2lsbCBiZSBjYWxsCiAgOzsgYHBhY2thZ2Ut dmMtLXVucGFjay0xJy4gIFVnaC4uLgogIDs7CiAgOzsgSWYgdGhlcmUgaXMgYSBiZXR0ZXIgd2F5 IHRvIGRvIHRoaXMsIGl0IHNob3VsZCBiZSBkb25lLgogIChjbC1hc3NlcnQgKHBhY2thZ2UtdmMt cCBwa2ctZGVzYykpCiAgKGxldHJlYyAoKHBrZy1kaXIgKHBhY2thZ2UtZGVzYy1kaXIgcGtnLWRl c2MpKQogICAgICAgICAgICh2Yy1mbGFncykKICAgICAgICAgICAodmMtZmlsdGVyLWNvbW1hbmQt ZnVuY3Rpb24KICAgICAgICAgICAgKGxhbWJkYSAoY29tbWFuZCBmaWxlLW9yLWxpc3QgZmxhZ3Mp CiAgICAgICAgICAgICAgKHNldHEgdmMtZmxhZ3MgZmxhZ3MpCiAgICAgICAgICAgICAgKGxpc3Qg Y29tbWFuZCBmaWxlLW9yLWxpc3QgZmxhZ3MpKSkKICAgICAgICAgICAocG9zdC11cGdyYWRlCiAg ICAgICAgICAgIChsYW1iZGEgKF9jb21tYW5kIF9maWxlLW9yLWxpc3QgZmxhZ3MpCiAgICAgICAg ICAgICAgKHdoZW4gKGFuZCAoZmlsZS1lcXVhbC1wIHBrZy1kaXIgZGVmYXVsdC1kaXJlY3Rvcnkp CiAgICAgICAgICAgICAgICAgICAgICAgICAoZXEgZmxhZ3MgdmMtZmxhZ3MpKQogICAgICAgICAg ICAgICAgKHVud2luZC1wcm90ZWN0CiAgICAgICAgICAgICAgICAgICAgKHdpdGgtZGVtb3RlZC1l cnJvcnMgIkZhaWxlZCB0byBhY3RpdmF0ZTogJVMiCiAgICAgICAgICAgICAgICAgICAgICAocGFj a2FnZS12Yy0tdW5wYWNrLTEgcGtnLWRlc2MgcGtnLWRpcikpCiAgICAgICAgICAgICAgICAgIChy ZW1vdmUtaG9vayAndmMtcG9zdC1jb21tYW5kLWZ1bmN0aW9ucyBwb3N0LXVwZ3JhZGUpKSkpKSkK ICAgIChhZGQtaG9vayAndmMtcG9zdC1jb21tYW5kLWZ1bmN0aW9ucyBwb3N0LXVwZ3JhZGUpCiAg ICAod2l0aC1kZW1vdGVkLWVycm9ycyAiRmFpbGVkIHRvIGZldGNoOiAlUyIKICAgICAgKGxldCAo KGRlZmF1bHQtZGlyZWN0b3J5IHBrZy1kaXIpKQogICAgICAgICh2Yy1wdWxsKSkpKSkKCihkZWZ1 biBwYWNrYWdlLXZjLS1hcmNoaXZlcy1pbml0aWFsaXplICgpCiAgIkluaXRpYWxpemUgcGFja2Fn ZS5lbCBhbmQgZmV0Y2ggcGFja2FnZSBzcGVjaWZpY2F0aW9ucy4iCiAgKHBhY2thZ2UtLWFyY2hp dmVzLWluaXRpYWxpemUpCiAgKHVubGVzcyBwYWNrYWdlLXZjLS1hcmNoaXZlLWRhdGEtYWxpc3QK ICAgIChwYWNrYWdlLXZjLS1kb3dubG9hZC1hbmQtcmVhZC1hcmNoaXZlcykpKQoKKGRlZnVuIHBh Y2thZ2UtdmMtLXJlbGVhc2UtcmV2IChwa2ctZGVzYykKICAiUmV0dXJuIHRoZSBsYXRlc3QgcmV2 aXNpb24gdGhhdCBidW1wcyB0aGUgXCJWZXJzaW9uXCIgdGFnIGZvciBQS0ctREVTQy4KSWYgbm8g c3VjaCByZXZpc2lvbiBjYW4gYmUgZm91bmQsIHJldHVybiBuaWwuIgogICh3aXRoLWN1cnJlbnQt YnVmZmVyIChmaW5kLWZpbGUtbm9zZWxlY3QgKHBhY2thZ2UtdmMtLW1haW4tZmlsZSBwa2ctZGVz YykpCiAgICAodmMtYnVmZmVyLXN5bmMpCiAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgKGdvdG8t Y2hhciAocG9pbnQtbWluKSkKICAgICAgKGxldCAoKGNhc2UtZm9sZC1zZWFyY2ggdCkpCiAgICAg ICAgKHdoZW4gKGNvbmQKICAgICAgICAgICAgICAgKChyZS1zZWFyY2gtZm9yd2FyZAogICAgICAg ICAgICAgICAgIChjb25jYXQgKGxtLWdldC1oZWFkZXItcmUgInBhY2thZ2UtdmVyc2lvbiIpICIu KiQiKQogICAgICAgICAgICAgICAgIChsbS1jb2RlLXN0YXJ0KSB0KSkKICAgICAgICAgICAgICAg KChyZS1zZWFyY2gtZm9yd2FyZAogICAgICAgICAgICAgICAgIChjb25jYXQgKGxtLWdldC1oZWFk ZXItcmUgInZlcnNpb24iKSAiLiokIikKICAgICAgICAgICAgICAgICAobG0tY29kZS1zdGFydCkg dCkpKQogICAgICAgICAgKGlnbm9yZS1lcnJvciB2Yy1ub3Qtc3VwcG9ydGVkCiAgICAgICAgICAg ICh2Yy1jYWxsLWJhY2tlbmQgKHZjLWJhY2tlbmQgKGJ1ZmZlci1maWxlLW5hbWUpKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICdsYXN0LWNoYW5nZQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChidWZmZXItZmlsZS1uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChs aW5lLW51bWJlci1hdC1wb3MgbmlsIHQpKSkpKSkpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHBh Y2thZ2UtdmMtaW5zdGFsbCAocGFja2FnZSAmb3B0aW9uYWwgcmV2IGJhY2tlbmQgbmFtZSkKICAi RmV0Y2ggYSBQQUNLQUdFIGFuZCBzZXQgaXQgdXAgZm9yIHVzaW5nIHdpdGggRW1hY3MuCgpJZiBQ QUNLQUdFIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW4gVVJMLCBkb3dubG9hZCB0aGUgcGFja2Fn ZQpmcm9tIHRoZSByZXBvc2l0b3J5IGF0IHRoYXQgVVJMOyB0aGUgZnVuY3Rpb24gd2lsbCB0cnkg dG8gZ3Vlc3MKdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgZnJvbSB0aGUgVVJMLiAgVGhpcyBjYW4g YmUgb3ZlcnJpZGRlbiBieQpwYXNzaW5nIHRoZSBvcHRpb25hbCBhcmd1bWVudCBOQU1FLiAgSWYg UEFDS0FHRSBpcyBhIGNvbnMtY2VsbCwKaXQgc2hvdWxkIGhhdmUgdGhlIGZvcm0gKE5BTUUgLiBT UEVDKSwgd2hlcmUgTkFNRSBpcyBhIHN5bWJvbAppbmRpY2F0aW5nIHRoZSBwYWNrYWdlIG5hbWUg YW5kIFNQRUMgaXMgYSBwbGlzdCBhcyBkZXNjcmliZWQgaW4KYHBhY2thZ2UtdmMtc2VsZWN0ZWQt cGFja2FnZXMnLiAgT3RoZXJ3aXNlIFBBQ0tBR0Ugc2hvdWxkIGJlIGEKc3ltYm9sIHdob3NlIG5h bWUgaXMgdGhlIHBhY2thZ2UgbmFtZSwgYW5kIHRoZSBVUkwgZm9yIHRoZQpwYWNrYWdlIHdpbGwg YmUgdGFrZW4gZnJvbSB0aGUgcGFja2FnZSdzIG1ldGFkYXRhLgoKQnkgZGVmYXVsdCwgdGhpcyBm dW5jdGlvbiBpbnN0YWxscyB0aGUgbGFzdCByZXZpc2lvbiBvZiB0aGUKcGFja2FnZSBhdmFpbGFi bGUgZnJvbSBpdHMgcmVwb3NpdG9yeS4gIElmIFJFViBpcyBhIHN0cmluZywgaXQKZGVzY3JpYmVz IHRoZSByZXZpc2lvbiB0byBpbnN0YWxsLCBhcyBpbnRlcnByZXRlZCBieSB0aGUgVkMKYmFja2Vu ZC4gIFRoZSBzcGVjaWFsIHZhbHVlIGA6bGFzdC1yZWxlYXNlJyAoaW50ZXJhY3RpdmVseSwgdGhl CnByZWZpeCBhcmd1bWVudCksIHdpbGwgdXNlIHRoZSBjb21taXQgb2YgdGhlIGxhdGVzdCByZWxl YXNlLCBpZgppdCBleGlzdHMuICBUaGUgbGFzdCByZWxlYXNlIGlzIHRoZSBsYXRlc3QgcmV2aXNp b24gd2hpY2ggY2hhbmdlZAp0aGUgXCJWZXJzaW9uOlwiIGhlYWRlciBvZiB0aGUgcGFja2FnZSdz IG1haW4gTGlzcCBmaWxlLgoKT3B0aW9uYWwgYXJndW1lbnQgQkFDS0VORCBzcGVjaWZpZXMgdGhl IFZDIGJhY2tlbmQgdG8gdXNlIGZvciBjbG9uaW5nCnRoZSBwYWNrYWdlJ3MgcmVwb3NpdG9yeTsg dGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIE5BTUUtT1ItVVJMIGlzIGEgVVJMLAphIHN0cmluZy4g IElmIEJBQ0tFTkQgaXMgb21pdHRlZCBvciBuaWwsIHRoZSBmdW5jdGlvbgp1c2VzIGBwYWNrYWdl LXZjLWhldXJpc3RpYy1hbGlzdCcgdG8gZ3Vlc3MgdGhlIGJhY2tlbmQuCk5vdGUgdGhhdCBieSBk ZWZhdWx0LCBhIFZDIHBhY2thZ2Ugd2lsbCBiZSBwcmlvcml0aXplZCBvdmVyIGEKcmVndWxhciBw YWNrYWdlLCBidXQgaXQgd2lsbCBub3QgcmVtb3ZlIGEgVkMgcGFja2FnZS4KClwoZm4gUEFDS0FH RSAmb3B0aW9uYWwgUkVWIEJBQ0tFTkQpIgogIChpbnRlcmFjdGl2ZQogICAocHJvZ24KICAgICA7 OyBJbml0aWFsaXplIHRoZSBwYWNrYWdlIHN5c3RlbSB0byBnZXQgdGhlIGxpc3Qgb2YgcGFja2Fn ZQogICAgIDs7IHN5bWJvbHMgZm9yIGNvbXBsZXRpb24uCiAgICAgKHBhY2thZ2UtdmMtLWFyY2hp dmVzLWluaXRpYWxpemUpCiAgICAgKGxldCogKChuYW1lLW9yLXVybCAocGFja2FnZS12Yy0tcmVh ZC1wYWNrYWdlLW5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAiRmV0Y2ggYW5kIGluc3Rh bGwgcGFja2FnZTogIiB0KSkKICAgICAgICAgICAgKG5hbWUgKGZpbGUtbmFtZS1iYXNlIChkaXJl Y3RvcnktZmlsZS1uYW1lIG5hbWUtb3ItdXJsKSkpKQogICAgICAgKHdoZW4gKHN0cmluZy1lbXB0 eS1wIG5hbWUpCiAgICAgICAgICh1c2VyLWVycm9yICJFbXB0eSBwYWNrYWdlIG5hbWUiKSkKICAg ICAgIChsaXN0IG5hbWUtb3ItdXJsCiAgICAgICAgICAgICAoYW5kIGN1cnJlbnQtcHJlZml4LWFy ZyA6bGFzdC1yZWxlYXNlKQogICAgICAgICAgICAgbmlsCiAgICAgICAgICAgICAoaW50ZXJuIChz dHJpbmctcmVtb3ZlLXByZWZpeCAiZW1hY3MtIiBuYW1lKSkpKSkpCiAgKHBhY2thZ2UtdmMtLWFy Y2hpdmVzLWluaXRpYWxpemUpCiAgKGNvbmQKICAgKChudWxsIHBhY2thZ2UpCiAgICAoc2lnbmFs ICd3cm9uZy10eXBlLWFyZ3VtZW50IG5pbCkpCiAgICgoY29uc3AgcGFja2FnZSkKICAgIChwYWNr YWdlLXZjLS11bnBhY2sKICAgICAocGFja2FnZS1kZXNjLWNyZWF0ZSA6bmFtZSAoY2FyIHBhY2th Z2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgOmtpbmQgJ3ZjKQogICAgIChjZHIgcGFja2Fn ZSkKICAgICByZXYpKQogICAoKGFuZC1sZXQqICgoKHN0cmluZ3AgcGFja2FnZSkpCiAgICAgICAg ICAgICAgIChiYWNrZW5kIChvciBiYWNrZW5kIChwYWNrYWdlLXZjLS1ndWVzcy1iYWNrZW5kIHBh Y2thZ2UpKSkpCiAgICAgIChwYWNrYWdlLXZjLS11bnBhY2sKICAgICAgIChwYWNrYWdlLWRlc2Mt Y3JlYXRlCiAgICAgICAgOm5hbWUgKG9yIG5hbWUgKGludGVybiAoZmlsZS1uYW1lLWJhc2UgcGFj a2FnZSkpKQogICAgICAgIDpraW5kICd2YykKICAgICAgIChsaXN0IDp2Yy1iYWNrZW5kIGJhY2tl bmQgOnVybCBwYWNrYWdlKQogICAgICAgcmV2KSkpCiAgICgoYW5kLWxldCogKChkZXNjIChhc3Nv YyBwYWNrYWdlIHBhY2thZ2UtYXJjaGl2ZS1jb250ZW50cyAjJ3N0cmluZz0pKSkKICAgICAgKHBh Y2thZ2UtdmMtLXVucGFjawogICAgICAgKGNhZHIgZGVzYykKICAgICAgIChvciAocGFja2FnZS12 Yy0tZGVzYy0+c3BlYyAoY2FkciBkZXNjKSkKICAgICAgICAgICAoYW5kLWxldCogKChleHRyYXMg KHBhY2thZ2UtZGVzYy1leHRyYXMgKGNhZHIgZGVzYykpKQogICAgICAgICAgICAgICAgICAgICAg KHVybCAoYWxpc3QtZ2V0IDp1cmwgZXh0cmFzKSkKICAgICAgICAgICAgICAgICAgICAgIChiYWNr ZW5kIChwYWNrYWdlLXZjLS1ndWVzcy1iYWNrZW5kIHVybCkpKQogICAgICAgICAgICAgKGxpc3Qg OnZjLWJhY2tlbmQgYmFja2VuZCA6dXJsIHVybCkpCiAgICAgICAgICAgKHVzZXItZXJyb3IgIlBh Y2thZ2UgYCVzJyBoYXMgbm8gVkMgZGF0YSIgcGFja2FnZSkpCiAgICAgICByZXYpKSkKICAgKCh1 c2VyLWVycm9yICJVbmtub3duIHBhY2thZ2UgdG8gZmV0Y2g6ICVzIiBwYWNrYWdlKSkpKQoKOzs7 IyMjYXV0b2xvYWQKKGRlZnVuIHBhY2thZ2UtdmMtY2hlY2tvdXQgKHBrZy1kZXNjIGRpcmVjdG9y eSAmb3B0aW9uYWwgcmV2KQogICJDbG9uZSB0aGUgc291cmNlcyBmb3IgUEtHLURFU0MgaW50byBE SVJFQ1RPUlkgYW5kIHZpc2l0IHRoYXQgZGlyZWN0b3J5LgpVbmxpa2UgYHBhY2thZ2UtdmMtaW5z dGFsbCcsIHRoaXMgZG9lcyBub3QgeWV0IHNldCB1cCB0aGUgcGFja2FnZQpmb3IgdXNlIHdpdGgg RW1hY3M7IHVzZSBgcGFja2FnZS12Yy1pbnN0YWxsLWZyb20tY2hlY2tvdXQnIGZvcgpzZXR0aW5n IHRoZSBwYWNrYWdlIHVwIGFmdGVyIHRoaXMgZnVuY3Rpb24gZmluaXNoZXMuICBPcHRpb25hbAph cmd1bWVudCBSRVYgbWVhbnMgdG8gY2xvbmUgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBwYWNr YWdlOyBpdApkZWZhdWx0cyB0byB0aGUgbGFzdCB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIHRoZSBw YWNrYWdlJ3MKcmVwb3NpdG9yeS4gIElmIFJFViBoYXMgdGhlIHNwZWNpYWwgdmFsdWUKYDpsYXN0 LXJlbGVhc2UnIChpbnRlcmFjdGl2ZWx5LCB0aGUgcHJlZml4IGFyZ3VtZW50KSwgdGhhdCBzdGFu ZHMKZm9yIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UuIgogIChpbnRl cmFjdGl2ZQogICAobGV0KiAoKG5hbWUgKHBhY2thZ2UtdmMtLXJlYWQtcGFja2FnZS1uYW1lICJG ZXRjaCBwYWNrYWdlIHNvdXJjZTogIikpKQogICAgIChsaXN0IChjYWRyIChhc3NvYyBuYW1lIHBh Y2thZ2UtYXJjaGl2ZS1jb250ZW50cyAjJ3N0cmluZz0pKQogICAgICAgICAgIChyZWFkLWZpbGUt bmFtZSAiQ2xvbmUgaW50byBuZXcgb3IgZW1wdHkgZGlyZWN0b3J5OiAiIG5pbCBuaWwgdCBuaWwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoZGlyKSAob3IgKG5vdCAoZmlsZS1l eGlzdHMtcCBkaXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoZGlyZWN0b3J5LWVtcHR5LXAgZGlyKSkpKQogICAgICAgICAgIChhbmQgY3VycmVudC1wcmVm aXgtYXJnIDpsYXN0LXJlbGVhc2UpKSkpCiAgKHBhY2thZ2UtdmMtLWFyY2hpdmVzLWluaXRpYWxp emUpCiAgKGxldCAoKHBrZy1zcGVjIChvciAocGFja2FnZS12Yy0tZGVzYy0+c3BlYyBwa2ctZGVz YykKICAgICAgICAgICAgICAgICAgICAgIChhbmQtbGV0KiAoKGV4dHJhcyAocGFja2FnZS1kZXNj LWV4dHJhcyBwa2ctZGVzYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cmwg KGFsaXN0LWdldCA6dXJsIGV4dHJhcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChiYWNrZW5kIChwYWNrYWdlLXZjLS1ndWVzcy1iYWNrZW5kIHVybCkpKQogICAgICAgICAgICAg ICAgICAgICAgICAobGlzdCA6dmMtYmFja2VuZCBiYWNrZW5kIDp1cmwgdXJsKSkKICAgICAgICAg ICAgICAgICAgICAgICh1c2VyLWVycm9yICJQYWNrYWdlIGAlcycgaGFzIG5vIFZDIGRhdGEiCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2FnZS1kZXNjLW5hbWUgcGtnLWRl c2MpKSkpKQogICAgKHBhY2thZ2UtdmMtLWNsb25lIHBrZy1kZXNjIHBrZy1zcGVjIGRpcmVjdG9y eSByZXYpCiAgICAoZmluZC1maWxlIGRpcmVjdG9yeSkpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVu IHBhY2thZ2UtdmMtaW5zdGFsbC1mcm9tLWNoZWNrb3V0IChkaXIgbmFtZSkKICAiU2V0IHVwIHRo ZSBwYWNrYWdlIE5BTUUgaW4gRElSIGJ5IGxpbmtpbmcgaXQgaW50byB0aGUgRUxQQSBkaXJlY3Rv cnkuCkludGVyYWN0aXZlbHksIHByb21wdCB0aGUgdXNlciBmb3IgRElSLCB3aGljaCBzaG91bGQg YmUgYSBkaXJlY3RvcnkKdW5kZXIgdmVyc2lvbiBjb250cm9sLCB0eXBpY2FsbHkgb25lIGNyZWF0 ZWQgYnkgYHBhY2thZ2UtdmMtY2hlY2tvdXQnLgpJZiBpbnZva2VkIGludGVyYWN0aXZlbHkgd2l0 aCBhIHByZWZpeCBhcmd1bWVudCwgcHJvbXB0IHRoZSB1c2VyCmZvciB0aGUgTkFNRSBvZiB0aGUg cGFja2FnZSB0byBzZXQgdXAuICBPdGhlcndpc2UgaW5mZXIgdGhlIHBhY2thZ2UKbmFtZSBmcm9t IHRoZSBiYXNlIG5hbWUgb2YgRElSLiIKICAoaW50ZXJhY3RpdmUgKGxldCAoKGRpciAocmVhZC1k aXJlY3RvcnktbmFtZSAiRGlyZWN0b3J5OiAiKSkpCiAgICAgICAgICAgICAgICAgKGxpc3QgZGly CiAgICAgICAgICAgICAgICAgICAgICAgKGlmIGN1cnJlbnQtcHJlZml4LWFyZwogICAgICAgICAg ICAgICAgICAgICAgICAgICAocmVhZC1zdHJpbmcgIlBhY2thZ2UgbmFtZTogIikKICAgICAgICAg ICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtYmFzZSAoZGlyZWN0b3J5LWZpbGUtbmFtZSBkaXIp KSkpKSkKICAodW5sZXNzICh2Yy1yZXNwb25zaWJsZS1iYWNrZW5kIGRpcikKICAgICh1c2VyLWVy cm9yICJEaXJlY3RvcnkgJVMgaXMgbm90IHVuZGVyIHZlcnNpb24gY29udHJvbCIgZGlyKSkKICAo cGFja2FnZS12Yy0tYXJjaGl2ZXMtaW5pdGlhbGl6ZSkKICAobGV0KiAoKG5hbWUgKG9yIG5hbWUg KGZpbGUtbmFtZS1iYXNlIChkaXJlY3RvcnktZmlsZS1uYW1lIGRpcikpKSkKICAgICAgICAgKHBr Zy1kaXIgKGV4cGFuZC1maWxlLW5hbWUgbmFtZSBwYWNrYWdlLXVzZXItZGlyKSkpCiAgICAod2hl biAoZmlsZS1leGlzdHMtcCBwa2ctZGlyKQogICAgICAoaWYgKHllcy1vci1uby1wIChmb3JtYXQg Ik92ZXJ3cml0ZSBwcmV2aW91cyBjaGVja291dCBmb3IgcGFja2FnZSBgJXMnPyIgbmFtZSkpCiAg ICAgICAgICAocGFja2FnZS0tZGVsZXRlLWRpcmVjdG9yeSBwa2ctZGlyKQogICAgICAgIChlcnJv ciAiVGhlcmUgYWxyZWFkeSBleGlzdHMgYSBjaGVja291dCBmb3IgJXMiIG5hbWUpKSkKICAgICht YWtlLXN5bWJvbGljLWxpbmsgKGV4cGFuZC1maWxlLW5hbWUgZGlyKSBwa2ctZGlyKQogICAgKHBh Y2thZ2UtdmMtLXVucGFjay0xCiAgICAgKHBhY2thZ2UtZGVzYy1jcmVhdGUKICAgICAgOm5hbWUg KGludGVybiBuYW1lKQogICAgICA6ZGlyIHBrZy1kaXIKICAgICAgOmtpbmQgJ3ZjKQogICAgIChm aWxlLW5hbWUtYXMtZGlyZWN0b3J5IHBrZy1kaXIpKSkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4g cGFja2FnZS12Yy1yZWJ1aWxkIChwa2ctZGVzYykKICAiUmVidWlsZCB0aGUgaW5zdGFsbGF0aW9u IGZvciBwYWNrYWdlIGdpdmVuIGJ5IFBLRy1ERVNDLgpSZWJ1aWxkaW5nIGFuIGluc3RhbGxhdGlv biBtZWFucyBzY3JhcGluZyBmb3IgbmV3IGF1dG9sb2FkCmNvb2tpZXMsIHJlLWNvbXBpbGluZyBF bWFjcyBMaXNwIGZpbGVzLCBidWlsZGluZyBhbmQgaW5zdGFsbGluZwphbnkgZG9jdW1lbnRhdGlv biwgZG93bmxvYWRpbmcgYW55IG1pc3NpbmcgZGVwZW5kZW5jaWVzLiAgVGhpcwpjb21tYW5kIGRv ZXMgbm90IGZldGNoIG5ldyByZXZpc2lvbnMgZnJvbSBhIHJlbW90ZSBzZXJ2ZXIuICBUaGF0Cmlz IHRoZSByZXNwb25zaWJpbGl0eSBvZiBgcGFja2FnZS12Yy11cGdyYWRlJy4gIEludGVyYWN0aXZl bHksCnByb21wdCBmb3IgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gcmVidWlsZC4iCiAgKGlu dGVyYWN0aXZlIChsaXN0IChwYWNrYWdlLXZjLS1yZWFkLXBhY2thZ2UtZGVzYyAiUmVidWlsZCBw YWNrYWdlOiAiIHQpKSkKICAocGFja2FnZS12Yy0tdW5wYWNrLTEgcGtnLWRlc2MgKHBhY2thZ2Ut ZGVzYy1kaXIgcGtnLWRlc2MpKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBwYWNrYWdlLXZjLXBy ZXBhcmUtcGF0Y2ggKHBrZy1kZXNjIHN1YmplY3QgcmV2aXNpb25zKQogICJTZW5kIHBhdGNoIGZv ciBSRVZJU0lPTlMgdG8gbWFpbnRhaW5lciBvZiB0aGUgcGFja2FnZSBQS0cgdXNpbmcgU1VCSkVD VC4KVGhlIGZ1bmN0aW9uIHVzZXMgYHZjLXByZXBhcmUtcGF0Y2gnLCBwYXNzaW5nIFNVQkpFQ1Qg YW5kClJFVklTSU9OUyBkaXJlY3RseS4gIFBLRy1ERVNDIG11c3QgYmUgYSBwYWNrYWdlIGRlc2Ny aXB0aW9uLgpJbnRlcmFjdGl2ZWx5LCBwcm9tcHQgZm9yIFBLRy1ERVNDLCBTVUJKRUNULCBhbmQg UkVWSVNJT05TLiAgV2hlbgppbnZva2VkIHdpdGggYSBudW1lcmljYWwgcHJlZml4IGFyZ3VtZW50 LCB1c2UgdGhlIGxhc3QgTgpyZXZpc2lvbnMuICBXaGVuIGludm9rZWQgaW50ZXJhY3RpdmVseSBp biBhIExvZyBWaWV3IGJ1ZmZlciB3aXRoCm1hcmtlZCByZXZpc2lvbnMsIHVzZSB0aG9zZS4iCiAg KGludGVyYWN0aXZlCiAgIChsaXN0IChwYWNrYWdlLXZjLS1yZWFkLXBhY2thZ2UtZGVzYyAiUGFj a2FnZSB0byBwcmVwYXJlIGEgcGF0Y2ggZm9yOiAiIHQpCiAgICAgICAgIChhbmQgKG5vdCB2Yy1w cmVwYXJlLXBhdGNoZXMtc2VwYXJhdGVseSkKICAgICAgICAgICAgICAocmVhZC1zdHJpbmcgIlN1 YmplY3Q6ICIgIltQQVRDSF0gIiBuaWwgbmlsIHQpKQogICAgICAgICAodmMtcHJlcGFyZS1wYXRj aC1wcm9tcHQtcmV2aXNpb25zKSkpCiAgKGxldCAoKGRlZmF1bHQtZGlyZWN0b3J5IChwYWNrYWdl LWRlc2MtZGlyIHBrZy1kZXNjKSkpCiAgICAodmMtcHJlcGFyZS1wYXRjaCAocGFja2FnZS1tYWlu dGFpbmVycyBwa2ctZGVzYyB0KQogICAgICAgICAgICAgICAgICAgICAgc3ViamVjdCByZXZpc2lv bnMpKSkKCihwcm92aWRlICdwYWNrYWdlLXZjKQo7OzsgcGFja2FnZS12Yy5lbCBlbmRzIGhlcmUK AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAA--=-=-Content-Type: text/x-diff Content-Disposition: attachment; filename 01-elpa-packages-package-package-vc-New-packages.patch From 3834109bf379fae333b60adf49dd119bd538635a Mon Sep 17 00:00:00 2001 From: Philip Kaludercic <philipk@posteo.net> Date: Fri, 18 Aug 2023 20:33:24 +0200 Subject: [PATCH] * elpa-packages (package,package-vc): New packages --- elpa-packages | 2 ++ 1 file changed, 2 insertions(+) diff --git a/elpa-packages b/elpa-packages index 3949d8fe14..ced827955b 100644 --- a/elpa-packages +++ b/elpa-packages @@ -521,7 +521,9 @@ (paced :url "bzr::bzr://bzr.savannah.nongnu.org/paced-el/trunk" ;; The Bzr<->Git bridge wasn't working well enough last time I tried. :manual-sync t) + (package :core "lisp/emacs-lisp/package.el") (package-fixes :url nil) + (package-vc :core "lisp/emacs-lisp/package-vc.el") (parsec :url "https://github.com/cute-jumper/parsec.el.git") (parser-generator :url "https://github.com/cjohansson/emacs-parser-generator") (path-iterator :url nil) -- 2.41.0 --=-=-=--
Page 1 of 2 • 59 total messages
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads