GNU bug report logs - #81019
31.0.50; [BUG] treesit: local parser keeps stale incremental tree across range moves

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: Rahul Martim Juliato <rahuljuliato@HIDDEN>; dated Mon, 11 May 2026 17:12:05 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 29 May 2026 06:18:59 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 29 02:18:59 2026
Received: from localhost ([127.0.0.1]:48819 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wSqYc-0001sy-Vn
	for submit <at> debbugs.gnu.org; Fri, 29 May 2026 02:18:59 -0400
Received: from mail-dy1-x132d.google.com ([2607:f8b0:4864:20::132d]:60825)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <casouri@HIDDEN>) id 1wSqYZ-0001sf-67
 for 81019 <at> debbugs.gnu.org; Fri, 29 May 2026 02:18:56 -0400
Received: by mail-dy1-x132d.google.com with SMTP id
 5a478bee46e88-304ec41197bso287654eec.1
 for <81019 <at> debbugs.gnu.org>; Thu, 28 May 2026 23:18:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1780035534; x=1780640334; darn=debbugs.gnu.org;
 h=references:to:cc:in-reply-to:date:subject:mime-version:message-id
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=/by7aqZrl8GhzMA6Azwgz4/Evn+d0gkhqGJXv97fLKE=;
 b=bvRlpR2dlcNg1xVUubaNcR6fdHqlyp0aKpl/T++sNQ5mz8wVgSEu5JVfjauAtZYRze
 vA7LlB0eAwrZsSWLznOEPpz3kiV1TdHTltpIcEp6tkUDv39r82BK790sKCNYbQM76bEF
 MW+8/Vm71SKGfZxWWS8p0AnkH71faCjHIFP5YE3HTcZzYvFXOeg5ezIBL+jHdp+i5gI8
 fKCrZuDSitGdV1KelSvF6bHk5az/pSX7T/i7lKyebnc6D/6+bXq91GQ6gvNcxVaUb9eQ
 qCzt/GjQ0kL2nkHo6DszRr9JwbqXMzHlAoEwK+1h4VtbFd+aoH4cDTCvHuKYQzlxDt0a
 NtOw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1780035534; x=1780640334;
 h=references:to:cc:in-reply-to:date:subject:mime-version:message-id
 :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=/by7aqZrl8GhzMA6Azwgz4/Evn+d0gkhqGJXv97fLKE=;
 b=mpubWdp1ij3LB9JhJ65kJq3uz1i2TuLWYxu7WpfQ9aa9RKYjDw0xnKKyAW31WHGXmj
 ADbOgNw65idEMfQ688Mef/anWIStcjsJbZ68nYHFWDeZB7HSD/UE3oacGcSE0Srb7FJH
 15TIpuun3p5nrHz7d7Zxp23aIEiQmq9H+B0UFqXztU714rr4YQHnC3aw2i/RlTe0gbQP
 dcwPA9QHJVgpLhqshk9S7pTE9ucUF8gyEtRetqov+HnSCv3/6c+prBtU9iUpmRapwMxG
 yD4pydixCMfJG1yLEoxhtO2zHaOrUUEYP384vOvhN7jphW2I88MMHSqRfLtB4fYi1L3C
 4g1g==
X-Forwarded-Encrypted: i=1;
 AFNElJ/O33y1DcTJmBDOz220eq9R42t8i4Rz1fYpPyMWibZYjSIx7NrDYsiFUraPX2hFe2wOfxc3zg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YwMl0ue2Nn9/I7HGh/XZC7n4h7stZeZf0II+aDnjgt7fxaHi31Y
 0T01OFUZ+9F8GLyC0xmLFJ7rcPLycwmJXr1E//I0dYVbgqBpBUioRGr2
X-Gm-Gg: Acq92OHX7bXCY0v9KQhR/ZxBcWI63OwYGthrt63+xazwI4+dtJNqAnow0U4QS2OS0CJ
 4DO669vSGAP1C5H+tYRchRjS2pNv/TQavjvkdj65ILR+R9d4ziUNMqhKynPMDA1tSPAoAu/hoal
 4pATEbL86Lm9AKVij77OcBdC4OrFsMAJORaO9UHoDWZvxWRgb1wLZvCKKEzja+aHd8bG9RlIJ80
 1sHqEcJJDRodI5CKuyUFaOlJjiZhdXwC0b8w5UA2whl5qCZagpXmrq/ShGywN5rXHHodUzDNp6E
 ZAnmTgaG8KT20n5dGiAb+/igsybH4o40gczjVDcasR441Hiw81qhxMmiddgSVMCheYtsArwt/+W
 iqUtzicponxYMa/hPNF4w1JgVVI6tm3Mgb+Ao6Qx3a+q0nOkICxCqQi0r23BxAHOntzO3O3syiG
 twvqgxKokzEvyj2Alg8yYD+X7Sq2L2/ZeHCoZMREzPYbrKPHcGCgJKaoqgIKZV1WrzhMk=
X-Received: by 2002:a05:7300:6ca0:b0:2ed:e14:e956 with SMTP id
 5a478bee46e88-304eb252ee6mr649426eec.32.1780035533454; 
 Thu, 28 May 2026 23:18:53 -0700 (PDT)
Received: from smtpclient.apple ([2601:645:c686:b320:45e9:d288:b3b4:405b])
 by smtp.gmail.com with ESMTPSA id
 5a478bee46e88-304ed5b9be7sm637223eec.27.2026.05.28.23.18.52
 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
 Thu, 28 May 2026 23:18:52 -0700 (PDT)
From: Yuan Fu <casouri@HIDDEN>
Message-Id: <F8BCD5BB-F2E7-4B99-97A6-91D96B3005FA@HIDDEN>
Content-Type: multipart/mixed;
 boundary="Apple-Mail=_C5C7BD35-0D50-48C5-8B8D-4B9FF47FD810"
Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81\))
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
Date: Thu, 28 May 2026 23:18:41 -0700
In-Reply-To: <838EDBE5-F7B5-4241-9D28-EF614E164E06@HIDDEN>
To: Rahul Martim Juliato <rahuljuliato@HIDDEN>
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN> <m2mry3cgqa.fsf@HIDDEN>
 <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
 <1801F912-77A8-4106-8F74-4A7F4F95B7A3@HIDDEN>
 <CACah_w2AvKug824TMKeibrrqiJmyYxS_EfZAyT0BNZZ9tNkBhQ@HIDDEN>
 <CAN+1Hbo=Y4TRJohfgm3puQOJjOdehSN+30-F__fwgRARtWkMBQ@HIDDEN>
 <95156828-ABD4-4C83-B23A-082E71FE098F@HIDDEN> <m2v7cbzm39.fsf@HIDDEN>
 <m2tsrv9gxg.fsf@HIDDEN> <838EDBE5-F7B5-4241-9D28-EF614E164E06@HIDDEN>
X-Mailer: Apple Mail (2.3826.700.81)
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: =?utf-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>,
 81019 <at> debbugs.gnu.org, Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)


--Apple-Mail=_C5C7BD35-0D50-48C5-8B8D-4B9FF47FD810
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8



> On May 28, 2026, at 8:26=E2=80=AFPM, Yuan Fu <casouri@HIDDEN> =
wrote:
>=20
>=20
>=20
>> On May 25, 2026, at 5:02=E2=80=AFPM, Rahul Martim Juliato =
<rahuljuliato@HIDDEN> wrote:
>>=20
>>=20
>> Rahul Martim Juliato <rahuljuliato@HIDDEN> writes:
>>> Yuan Fu <casouri@HIDDEN> writes:
>>>=20
>>>> Sorry, I tried a couple gestures and incantations but couldn=E2=80=99=
t repro
>>>> it and got distracted by other tasks. I=E2=80=99ll give it another =
try. In the
>>>> meantime, any thoughts and guesses? I can=E2=80=99t think of what =
else could
>>>> be different in our environment that can cause the difference.
>>>>=20
>>>> Yuan
>>>>=20
>>>=20
>>> Hi Yuan!
>>>=20
>>> Thanks for not giving up on us (and this problem) :)
>>>=20
>>> There have been a lot of changes since this bug first emerged. I'll =
try
>>> to reserve some time tonight to dissect it and will report back =
after
>>> that.
>>=20
>>=20
>> Hi Yuan,
>>=20
>> Picking this up. Got the idea of writing a batch reproducer from
>> Andreas's (Alberti) approach on a recent bug. Two files attached:
>>=20
>> * bug81019_repro.el                          (reproducer)
>> * bug81019-fix-treesit-local-parser.patch    (candidate fix)
>>=20
>> Run:
>>=20
>>   emacs -Q -l bug81019_repro.el -f bug81019-repro
>>=20
>> Opens '*bug81019-repro*' with the test span and a verdict. Prints the
>> REUSED vs FRESH parser root nodes for the local markdown-inline =
parser:
>> BAD without the patch, GOOD with it. I can reproduce consistently
>> before, no repro after.
>>=20
>> What surfaces the bug in batch is the ordering per keystroke:
>>=20
>> 1. self-insert-command (through pre/post-command-hook)
>> 2. force every local markdown-inline parser to reparse at its CURRENT
>>    (still old) included-ranges
>> 3. treesit-update-ranges
>>=20
>> Step 2 before step 3 is the trigger. Live editing hits the same order
>> because font-lock fontifies around point on every keystroke, querying
>> the local parser tree before the host parser's next range-rule run =
grows
>> the range to cover the new char. Tree-sitter commits to a tree shape =
for
>> the old range, and the subsequent range expansion plus edit never
>> re-fires the `code_span' rule when the closing backtick arrives. A
>> naive batch driver that updates ranges first does not see the bug, =
which
>> probably explains the hard-to-reproduce reports.
>=20
> Well, I think that analysis is maybe partially right. We do update the =
ranges before fontifying the buffer after each keystroke. See =
treesit--pre-redisplay. But maybe it didn=E2=80=99t update the full =
range of the change. I need to see.
>=20
>>=20
>> About the fix. My original patch checked overlay bounds in
>> `treesit--update-ranges-local'. That is a no-op: the overlay is =
created
>> with REAR-ADVANCE non-nil, so rear insertions advance overlay-end
>> automatically, and the bounds-match guard always succeeds for forward
>> typing. Apologies for the noise there.
>>=20
>> The attached patch checks the parser's actual
>> `treesit-parser-included-ranges' instead. If they already match the =
new
>> range, reuse is safe. Otherwise fall through to the existing =
create-new
>> branch, and cleanup deletes the stale overlay at the end of
>> `treesit-update-ranges'.
>>=20
>> Caveat: every range change on a local parser now drops the =
incremental
>> tree. Fine for fontification-driven modes like markdown-ts, but a
>> sledgehammer. A narrower fix probably belongs in treesit.c =
(invalidate
>> affected subtree on range change, keep the rest). I did not attempt =
that
>> without your input.
>>=20
>> I still do not know why this hits me and St=C3=A9phane interactively =
but not
>> you. Could be input method (dead keys on pt-BR / en , or
>> whathever... here), jit-lock timing, or something else in the editor
>> env. The batch repro sidesteps that question (hopefully).
>>=20
>> St=C3=A9phane, could you try the patch against the phantom-overlay =
symptom
>> you were seeing in fenced code blocks? Same path (local-parser =
overlay
>> reuse across range moves) so it might cover that too, but I would =
like
>> confirmation before claiming it.
>>=20
>> Let me know what you think.
>=20
> The batch script didn=E2=80=99t seem to work for me. It says no local =
parser found, so neither GOOD or BAD condition. But that=E2=80=99s fine, =
because I finally figured out how to reproduce: I have to have a `code` =
before and after point, and then typing `code  ` does trigger the bug =
reliably. Now I can see what=E2=80=99s going on.

Unfortunately, this seems like a tree-sitter bug. I can make a reproduce =
with a C program [1]. For Emacs 30, my solution is to force a fresh =
parse on each key stroke. That shouldn=E2=80=99t bring any performance =
problem as long as the markdown paragraphs are reasonably sized.

Does the attached patch (based on emacs-31) work for you?

[1] https://github.com/tree-sitter/tree-sitter/issues/5636

Yuan


--Apple-Mail=_C5C7BD35-0D50-48C5-8B8D-4B9FF47FD810
Content-Disposition: attachment;
	filename=force-reparse.patch
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="force-reparse.patch"
Content-Transfer-Encoding: quoted-printable

=46rom=20a10deea73fe5cc78562705258c9f29543fc65016=20Mon=20Sep=2017=20=
00:00:00=202001=0AFrom:=20Yuan=20Fu=20<casouri@HIDDEN>=0ADate:=20Thu,=20=
28=20May=202026=2022:43:09=20-0700=0ASubject:=20[PATCH]=20Fix=20=
markdown-inline=20incremental=20parsing=20issue=20(bug#81019)=0A=0A*=20=
lisp/treesit.el:=0A(treesit--embed-languages-need-full-parse):=20New=20=
variable.=0A(treesit--set-embed-ranges):=20Reparse=20full=20range=20if=20=
the=20langauge=0Aneeds=20it.=0A---=0A=20lisp/treesit.el=20|=2012=20=
++++++++++++=0A=201=20file=20changed,=2012=20insertions(+)=0A=0Adiff=20=
--git=20a/lisp/treesit.el=20b/lisp/treesit.el=0Aindex=20=
e2e62bb71a2..32479ae6a32=20100644=0A---=20a/lisp/treesit.el=0A+++=20=
b/lisp/treesit.el=0A@@=20-680,6=20+680,11=20@@=20=
treesit-query-first-valid=0A=20=0A=20;;;=20Range=20API=20supplement=0A=20=
=0A+;;=20See=20bug#81019.=0A+(defvar=20=
treesit--embed-languages-need-full-parse=20'(markdown-inline)=0A+=20=20=
"Languages=20that=20requires=20a=20full=20parse=20when=20used=20as=20=
embedded=20languages.=0A+This=20variable=20is=20not=20intended=20for=20=
general=20use.")=0A+=0A=20(defvar=20treesit--range-verbose=20nil=0A=20=20=
=20"If=20non-nil,=20print=20verbose=20debugging=20info=20for=20setting=20=
ranges.=0A=20Useful=20when=20your=20multi-parser=20setup=20doesn't=20=
seem=20to=20work.")=0A@@=20-1094,6=20+1099,13=20@@=20=
treesit--set-embed-ranges=0A=20=20=20=20=20(when=20(and=20(null=20=
new-ranges)=20treesit--range-verbose)=0A=20=20=20=20=20=20=20(message=20=
"Setting=20empty=20ranges=20to=20%s\nRanges=20for=20embedded=20parser=20=
:%s\nRanges=20for=20host=20parser:=20%s\nIntersection=20is=20empty"=0A=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20new-ranges-1=20embed-parser=20=
host-parser))=0A+=20=20=20=20;;=20Due=20to=20some=20tree-sitter=20bug,=20=
we=20need=20to=20force=20a=20full=20reparse=20for=0A+=20=20=20=20;;=20=
some=20languages=20to=20get=20a=20correct=20parse=20tree.=0A+=20=20=20=20=
(when=20(memq=20(treesit-parser-language=20embed-parser)=0A+=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=
treesit--embed-languages-need-full-parse)=0A+=20=20=20=20=20=20=
(treesit-parser-set-included-ranges=0A+=20=20=20=20=20=20=20embed-parser=20=
`((,(point-min)=20.=20,(point-min))))=0A+=20=20=20=20=20=20=
(treesit-parser-root-node=20embed-parser))=0A=20=20=20=20=20;;=20When=20=
there's=20no=20range=20for=20the=20embedded=20language,=20set=20it's=20=
range=0A=20=20=20=20=20;;=20to=20a=20dummy=20(1=20.=201),=20otherwise=20=
it=20would=20be=20set=20to=20the=20whole=0A=20=20=20=20=20;;=20buffer,=20=
which=20is=20not=20what=20we=20want.=0A--=20=0A2.39.5=20(Apple=20=
Git-154)=0A=0A=

--Apple-Mail=_C5C7BD35-0D50-48C5-8B8D-4B9FF47FD810
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset=us-ascii




--Apple-Mail=_C5C7BD35-0D50-48C5-8B8D-4B9FF47FD810--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 29 May 2026 03:26:38 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu May 28 23:26:38 2026
Received: from localhost ([127.0.0.1]:45846 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wSnrp-0002c2-Sl
	for submit <at> debbugs.gnu.org; Thu, 28 May 2026 23:26:38 -0400
Received: from mail-dl1-x1233.google.com ([2607:f8b0:4864:20::1233]:56711)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <casouri@HIDDEN>) id 1wSnrn-0002bU-2M
 for 81019 <at> debbugs.gnu.org; Thu, 28 May 2026 23:26:35 -0400
Received: by mail-dl1-x1233.google.com with SMTP id
 a92af1059eb24-1370417c01cso6080315c88.1
 for <81019 <at> debbugs.gnu.org>; Thu, 28 May 2026 20:26:35 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1780025194; x=1780629994; darn=debbugs.gnu.org;
 h=to:references:message-id:content-transfer-encoding:cc:date
 :in-reply-to:from:subject:mime-version:from:to:cc:subject:date
 :message-id:reply-to;
 bh=MQs5rGVwOONQJKamAvzFlxsbVHNDztZA/vxam5q6R5I=;
 b=D1qb/iKblZuhRdCNOTVTCcUogYOxD1ArgqvutnQEEKyfd7g3O9p//F4M5y0wW0oc/O
 hGTDCehE9zXv38Ee/qink6PKOZ+LNaULjlNnsFAJXp/CPxxw7u53KAelukLp8h46uSGO
 dtOZU+nkZVCYpwPIoAJrICC5gWc+VlzsT22dOF6T77MVZUMRaJc/9aOL7nCjg810yD5U
 GesyGKvaLQVnoLK8xrPgwWUUFdtLjjAOSNgtkYXr2ucD405jTrM6DGy9c53ugKPbnCGG
 e9jB/5OPbFgibX5oTImMUaQvbqmDecFQnrjshvdob12LZoVmVbe3GMRZk9jG02M3jzkv
 lFzw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1780025194; x=1780629994;
 h=to:references:message-id:content-transfer-encoding:cc:date
 :in-reply-to:from:subject:mime-version:x-gm-gg:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=MQs5rGVwOONQJKamAvzFlxsbVHNDztZA/vxam5q6R5I=;
 b=OoYeyXQe1AUOAjx8u4yc754sxLGiaZ6OCF4s/Iz7B4tfEoKYz2rHPT94Oa1SOfQA7d
 rP+TvsYEZ18jNJuMsRQVn9rwhebPKKJZKN6m/ccxGoZzqsyqUkCitXj97FeS30AXTeM8
 y7SHDvA58XY0zfQ6WnAjCpv1Ky3TsqA6cWaS2pGkHeyGv8BD9HTVFxdzlbQbAvnTLZPJ
 fMA56tC8RVeyra0BWOc4T3C+G76Fx1xcoP/cKjHuaVOrWhJ5LFzRYHOxcmF7jODUBIi7
 rrDPNvYoovNsaINNE2TTYoFAG2MW8/7B5V8wCOzNSARZWmQXL1cL/KD1Mng0PlE0/hfd
 AQUQ==
X-Forwarded-Encrypted: i=1;
 AFNElJ9zDy+oQB9FlaW1o6SScL10cI9qEg4AykNK9lcBnz+G+s5nFFb/XUj87EWeqo7cgTAclaFs0g==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yy+gnh40Wgcnh6tp+cMBR2PKhA8WvbkI65lyF62uIJpIPw+ut5z
 uYrD5PUoeMsicFcsKSn6R4GLNTa/EEF99Om+qYSgYcZhotWzMuLajfac
X-Gm-Gg: Acq92OH7EqqDxd608/4i8xAZx9ZTGFhFd4FUXifG8AFp7GIUs2ZF7FHB98WZIc27Au7
 /uINlNYm7iai0fEbnWQoA62iKoy+JZxt2QrSvtCnZMRzsuUpD4xXfQk7J31CPMpB0setgQqEGgP
 BCrHtCbeSuenPmEXWWy+E1q6Ead5Hzx8Li74xhc74H7enHBxibHTlCFQZdf56fLmOh1c2amhmpb
 UH0HeeY0uUbIE8OfO4Dy5SGrW+Vpp+JEeNUXeTV6gqXTu4q0qBJBkW/h9zwF18Cqiu7TN41SKuM
 pbVANppLRxd+46EoyvWR27npAqp6vMYBWOVSx/wto2bqZaTORkZu2a/xXiw2cBth3bH/Vj9a046
 x7qq6NXu02HNWYBpiX5gG+R/Uwk26b+TWfTbIQHG5T1Zxmh1ysn9QghDHEw2jpcxpQJ+3dsiGDs
 EDCwnesOlbFztozVWruJ7cX+hzNkdSZ43DLKlxs47qzNQVMUsvIahRxLHpNDEHN1BHPkY=
X-Received: by 2002:a05:7022:6898:b0:130:760b:77aa with SMTP id
 a92af1059eb24-137af227c76mr496834c88.41.1780025193568; 
 Thu, 28 May 2026 20:26:33 -0700 (PDT)
Received: from smtpclient.apple ([2601:645:c686:b320:45e9:d288:b3b4:405b])
 by smtp.gmail.com with ESMTPSA id
 a92af1059eb24-137b37cd5basm374052c88.8.2026.05.28.20.26.32
 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
 Thu, 28 May 2026 20:26:33 -0700 (PDT)
Content-Type: text/plain;
	charset=utf-8
Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81\))
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
From: Yuan Fu <casouri@HIDDEN>
In-Reply-To: <m2tsrv9gxg.fsf@HIDDEN>
Date: Thu, 28 May 2026 20:26:21 -0700
Content-Transfer-Encoding: quoted-printable
Message-Id: <838EDBE5-F7B5-4241-9D28-EF614E164E06@HIDDEN>
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN> <m2mry3cgqa.fsf@HIDDEN>
 <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
 <1801F912-77A8-4106-8F74-4A7F4F95B7A3@HIDDEN>
 <CACah_w2AvKug824TMKeibrrqiJmyYxS_EfZAyT0BNZZ9tNkBhQ@HIDDEN>
 <CAN+1Hbo=Y4TRJohfgm3puQOJjOdehSN+30-F__fwgRARtWkMBQ@HIDDEN>
 <95156828-ABD4-4C83-B23A-082E71FE098F@HIDDEN> <m2v7cbzm39.fsf@HIDDEN>
 <m2tsrv9gxg.fsf@HIDDEN>
To: Rahul Martim Juliato <rahuljuliato@HIDDEN>
X-Mailer: Apple Mail (2.3826.700.81)
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: =?utf-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>,
 81019 <at> debbugs.gnu.org, Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)



> On May 25, 2026, at 5:02=E2=80=AFPM, Rahul Martim Juliato =
<rahuljuliato@HIDDEN> wrote:
>=20
>=20
> Rahul Martim Juliato <rahuljuliato@HIDDEN> writes:
>> Yuan Fu <casouri@HIDDEN> writes:
>>=20
>>> Sorry, I tried a couple gestures and incantations but couldn=E2=80=99t=
 repro
>>> it and got distracted by other tasks. I=E2=80=99ll give it another =
try. In the
>>> meantime, any thoughts and guesses? I can=E2=80=99t think of what =
else could
>>> be different in our environment that can cause the difference.
>>>=20
>>> Yuan
>>>=20
>>=20
>> Hi Yuan!
>>=20
>> Thanks for not giving up on us (and this problem) :)
>>=20
>> There have been a lot of changes since this bug first emerged. I'll =
try
>> to reserve some time tonight to dissect it and will report back after
>> that.
>=20
>=20
> Hi Yuan,
>=20
> Picking this up. Got the idea of writing a batch reproducer from
> Andreas's (Alberti) approach on a recent bug. Two files attached:
>=20
>  * bug81019_repro.el                          (reproducer)
>  * bug81019-fix-treesit-local-parser.patch    (candidate fix)
>=20
> Run:
>=20
>    emacs -Q -l bug81019_repro.el -f bug81019-repro
>=20
> Opens '*bug81019-repro*' with the test span and a verdict. Prints the
> REUSED vs FRESH parser root nodes for the local markdown-inline =
parser:
> BAD without the patch, GOOD with it. I can reproduce consistently
> before, no repro after.
>=20
> What surfaces the bug in batch is the ordering per keystroke:
>=20
>  1. self-insert-command (through pre/post-command-hook)
>  2. force every local markdown-inline parser to reparse at its CURRENT
>     (still old) included-ranges
>  3. treesit-update-ranges
>=20
> Step 2 before step 3 is the trigger. Live editing hits the same order
> because font-lock fontifies around point on every keystroke, querying
> the local parser tree before the host parser's next range-rule run =
grows
> the range to cover the new char. Tree-sitter commits to a tree shape =
for
> the old range, and the subsequent range expansion plus edit never
> re-fires the `code_span' rule when the closing backtick arrives. A
> naive batch driver that updates ranges first does not see the bug, =
which
> probably explains the hard-to-reproduce reports.

Well, I think that analysis is maybe partially right. We do update the =
ranges before fontifying the buffer after each keystroke. See =
treesit--pre-redisplay. But maybe it didn=E2=80=99t update the full =
range of the change. I need to see.

>=20
> About the fix. My original patch checked overlay bounds in
> `treesit--update-ranges-local'. That is a no-op: the overlay is =
created
> with REAR-ADVANCE non-nil, so rear insertions advance overlay-end
> automatically, and the bounds-match guard always succeeds for forward
> typing. Apologies for the noise there.
>=20
> The attached patch checks the parser's actual
> `treesit-parser-included-ranges' instead. If they already match the =
new
> range, reuse is safe. Otherwise fall through to the existing =
create-new
> branch, and cleanup deletes the stale overlay at the end of
> `treesit-update-ranges'.
>=20
> Caveat: every range change on a local parser now drops the incremental
> tree. Fine for fontification-driven modes like markdown-ts, but a
> sledgehammer. A narrower fix probably belongs in treesit.c (invalidate
> affected subtree on range change, keep the rest). I did not attempt =
that
> without your input.
>=20
> I still do not know why this hits me and St=C3=A9phane interactively =
but not
> you. Could be input method (dead keys on pt-BR / en , or
> whathever... here), jit-lock timing, or something else in the editor
> env. The batch repro sidesteps that question (hopefully).
>=20
> St=C3=A9phane, could you try the patch against the phantom-overlay =
symptom
> you were seeing in fenced code blocks? Same path (local-parser overlay
> reuse across range moves) so it might cover that too, but I would like
> confirmation before claiming it.
>=20
> Let me know what you think.

The batch script didn=E2=80=99t seem to work for me. It says no local =
parser found, so neither GOOD or BAD condition. But that=E2=80=99s fine, =
because I finally figured out how to reproduce: I have to have a `code` =
before and after point, and then typing `code  ` does trigger the bug =
reliably. Now I can see what=E2=80=99s going on.

Yuan=




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 26 May 2026 11:25:10 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 26 07:25:10 2026
Received: from localhost ([127.0.0.1]:59919 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wRpuH-0004CO-BU
	for submit <at> debbugs.gnu.org; Tue, 26 May 2026 07:25:09 -0400
Received: from mail-vk1-xa2c.google.com ([2607:f8b0:4864:20::a2c]:45484)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1wRpuE-0004C9-2U
 for 81019 <at> debbugs.gnu.org; Tue, 26 May 2026 07:25:07 -0400
Received: by mail-vk1-xa2c.google.com with SMTP id
 71dfb90a1353d-57611a6a69eso3144100e0c.3
 for <81019 <at> debbugs.gnu.org>; Tue, 26 May 2026 04:25:06 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1779794705; cv=none;
 d=google.com; s=arc-20240605;
 b=hQC6Fj7lp1v+ZVUADUHxIp+HlT09bfmeqLEOOeQDK7b0sen8LMKaLhvCYWQ4hhS5O0
 quzcLzA6l6jT7YcD1oPBYWb6pFPTN9ydFFLGV8dAZLHNWpROk31eqXdU/LRZ92HLaSi2
 f0ux257LsNiJ8dSqM7Lj0bbzPpV0lD+Iivlw0fRn+BoojGavPPP6NHsZ1jzQi7DsBNOa
 Wz27WXf/etWHu9lskj+036gJMVTqL3P9rDHLES9kWSXk+OwQbNKifhlTJiTD5HfiJPwK
 cY7Gezm+D/V9cKkiqo065hfJ9BCOCvrIgxrDu1WjmGMNwMt83Vo87ZYCOhKIluIMv4gJ
 cQpA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;
 s=arc-20240605; 
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:dkim-signature;
 bh=5YctoHoumzDBPOVI591Lqq6LiQo/if6m8vBctc4hGdQ=;
 fh=dtOy7lwBWxobzCx56bM26KY1mWYK5yumrxEBKrS/JLQ=;
 b=GRj8N2UjxLzGEw9V84OgoR6bx+D2DpBVJPVom4HKTVbFllozDTeWZC8Aa2sR3hNCSM
 6aSJHI85tAR5GWJ1xC6VlmozbPXo16XApDmeyRvOz1EqxLsOuVK4jO+T9cydWx8ONTgz
 NqzI2fkdYE/G+9ZlLISr8R7YNsJ1DcL+hd9emHkeQZNCpNg4o0GRUVdvALxKKQkLcoFt
 fMcOPIMU1O3qqWyTzhwh8XAr8nNt3up7P/WWIqGAMdqgBQm2rsJXRapYwlcmbTV/IKi3
 IYh+1Pov7xkA0COt3ib27oqlZhQRqtdRIq4raipGmaG78z9uyzmNby3L7iv+D3tlYce4
 +VGQ==; darn=debbugs.gnu.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1779794705; x=1780399505; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=5YctoHoumzDBPOVI591Lqq6LiQo/if6m8vBctc4hGdQ=;
 b=A21dKV8ILl9KyWAPS2bNK2M4OMh3GGt7qVbyabl02AygfX0/+9tYdpvMquQ5ud6iZd
 qz5pHbzoDjvXBVwcweHAW3N1Tg5xCRIrPzLjGYMzdV0fhqIYNjqr8R2BDiyKcQgu8rp+
 9ReDacfis2sN5nu6ngnbvHvn0khGGQwedbvVdth4bUyI/l+guGLlOexytWuz8Yb5Qu6q
 Jo8YxzEfwNsTPtcUNNZ6FYiiOZyecoEIHwPUVYO/7bDxByk7VfTbNgaAV4F7bAXzlInf
 l6m4MLXYEvZEbLXQ1ya30+gqass90MdEO99TR9z7dWi5MGiYmVFVWsl+5O/pHeXDYoB8
 Xprg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1779794705; x=1780399505;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=5YctoHoumzDBPOVI591Lqq6LiQo/if6m8vBctc4hGdQ=;
 b=QfW3V14T1fpJV+7tZpU/sS0ykt2K99xOJsG3mTCfWDwMS3hqwOan2O26HkxYjaW2am
 FDMaHjOdIAYNQusU7ypjs0/uaZvHB2IyuVskI/mD+8sQI8CiyNIzAfkdTlnwudtRGmUF
 X1IjuO6/zMOD7yTP4zKTZwwtbAwdTXEgxqwiCzbYL2egO4WkkuEXmMtXpFiEw+alA8Tl
 7Djc4qkXoQ2VKTxSRPMK3l82W8HLbvB5Ezb0Vu7Apbd//nFn2vjcZjiUrIxRSDqBCi1p
 JrzTfGz8Cns1n4GwlYqfABTz2LefbHohbFm1yVXktMBMUT4pyrkeHulnDZ90GE3dFy2i
 ldiw==
X-Forwarded-Encrypted: i=1;
 AFNElJ/JXkHBKMrA9e9Mfua+o0LT7tsTKbpjsbaAdvYEqt8NxKKdW7lcoF3cm9TdVEWYIbPokYNjnw==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yx2jKkIJL4OTvgvsv7biF1nvZN5holdgIrBHOzisbC1siMpAVWX
 Fq44F4I5PRumposPoenogtw4n8hU67JfCYKPfsLv9VXpbbUKXeEiRlhgeUEYb6G909g7KRnqpaC
 cN8xhQ5t0vZrOGQTuQ73+s7N+0uk/YQY=
X-Gm-Gg: Acq92OHhWLdjn8/DCHMWNWIZL8mahbDYMMScT/pJBsi+bYmq/ynCVmXHDdPEJ976qwF
 Pxq3Lc6KeGsOq0NRF1GtF/FL0hXlCGqOI2ATAdWCqlO5iXOK/cqLEZ92sRQgdB8xrEXxTnEmqUl
 GyJay7olED2PXtHw/P60i1ETs75Vmf9uhq/X00nwfFizG01Tqez/5MSqyP+KXJcY0u6nYkw1oih
 p9whCuI5fuV4fLrn7ibiZ46yoS8fQ/5/YQcGLT0mEMigz2AzOJTt4ssnRkSg1SCSdvnhFE0G5Td
 hxhZQ1r1fsOlUCk/hEo7nOH5/ID03sDn4zamYcgKOUJWM1IYn0EokrAAQiiZ5C4gBq0Oyfxt5jp
 Jx0JTN24G32QcbCTWIuveZogdy4fIgr1OQopJopLbf2CjRgDO
X-Received: by 2002:a05:6122:a0b:b0:56f:2aaa:450c with SMTP id
 71dfb90a1353d-5865e4a60f4mr8513256e0c.1.1779794704993; Tue, 26 May 2026
 04:25:04 -0700 (PDT)
MIME-Version: 1.0
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
 <m2mry3cgqa.fsf@HIDDEN>
 <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
 <1801F912-77A8-4106-8F74-4A7F4F95B7A3@HIDDEN>
 <CACah_w2AvKug824TMKeibrrqiJmyYxS_EfZAyT0BNZZ9tNkBhQ@HIDDEN>
 <CAN+1Hbo=Y4TRJohfgm3puQOJjOdehSN+30-F__fwgRARtWkMBQ@HIDDEN>
 <95156828-ABD4-4C83-B23A-082E71FE098F@HIDDEN> <m2v7cbzm39.fsf@HIDDEN>
 <m2tsrv9gxg.fsf@HIDDEN>
In-Reply-To: <m2tsrv9gxg.fsf@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Tue, 26 May 2026 07:24:52 -0400
X-Gm-Features: AVHnY4L7h-8fnfJ7l3PTrI4wLGucsAiW9zLHlCIyYqDfe2PLfVRaVPDjPZwfIEE
Message-ID: <CAN+1Hbouq-v-6UFVTq7cMr9bPnCQM0EZymn6dfkoV73k1ykT7g@HIDDEN>
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
To: Rahul Martim Juliato <rahuljuliato@HIDDEN>
Content-Type: multipart/alternative; boundary="0000000000002a0fb40652b6bfd5"
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: Yuan Fu <casouri@HIDDEN>, 81019 <at> debbugs.gnu.org,
 Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)

--0000000000002a0fb40652b6bfd5
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Mon, May 25, 2026 at 8:02=E2=80=AFPM Rahul Martim Juliato <rahuljuliato@=
gmail.com>
wrote:

>
> I still do not know why this hits me and St=C3=A9phane interactively but =
not
> you. Could be input method (dead keys on pt-BR / en , or
> whathever... here), jit-lock timing, or something else in the editor
> env. The batch repro sidesteps that question (hopefully).
>

Ranges remain stale consistently and this effect is not a random thing.  I
do not know why Yuan isn't seeing this.

St=C3=A9phane, could you try the patch against the phantom-overlay symptom
> you were seeing in fenced code blocks? Same path (local-parser overlay
> reuse across range moves) so it might cover that too, but I would like
> confirmation before claiming it.
>

The patch does not work for me in the case where the range is being
extended.  If I move point to before the first character of a fenced code
block, or to just left of the closing fence and yank some text, the range
remains stale.

--0000000000002a0fb40652b6bfd5
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Mon, May 25, 2026 at 8:02=E2=80=AFPM Rahul Martim Juliato &lt;<a href=3D=
"mailto:rahuljuliato@HIDDEN">rahuljuliato@HIDDEN</a>&gt; wrote:</span=
></div></div><div class=3D"gmail_quote gmail_quote_container"><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px soli=
d rgb(204,204,204);padding-left:1ex"><br>
I still do not know why this hits me and St=C3=A9phane interactively but no=
t<br>
you. Could be input method (dead keys on pt-BR / en , or<br>
whathever... here), jit-lock timing, or something else in the editor<br>
env. The batch repro sidesteps that question (hopefully).<br></blockquote><=
div><br></div><div><div class=3D"gmail_default" style=3D"font-family:monosp=
ace">Ranges remain stale consistently and this effect is not a random thing=
.=C2=A0 I do not know why Yuan isn&#39;t seeing this.</div></div><div><br><=
/div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bo=
rder-left:1px solid rgb(204,204,204);padding-left:1ex">
St=C3=A9phane, could you try the patch against the phantom-overlay symptom<=
br>
you were seeing in fenced code blocks? Same path (local-parser overlay<br>
reuse across range moves) so it might cover that too, but I would like<br>
confirmation before claiming it.<br></blockquote><div><br></div><div class=
=3D"gmail_default" style=3D"font-family:monospace">The patch does not work =
for me in the case where the range is being extended.=C2=A0 If I move point=
 to before the first character of a fenced code block, or to just left of t=
he closing fence and yank some text, the range remains stale.</div></div></=
div>

--0000000000002a0fb40652b6bfd5--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 26 May 2026 00:02:41 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon May 25 20:02:40 2026
Received: from localhost ([127.0.0.1]:54225 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wRfFk-0002yh-HQ
	for submit <at> debbugs.gnu.org; Mon, 25 May 2026 20:02:40 -0400
Received: from mail-vk1-xa35.google.com ([2607:f8b0:4864:20::a35]:55773)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <rahuljuliato@HIDDEN>)
 id 1wRfFc-0002y8-Vp
 for 81019 <at> debbugs.gnu.org; Mon, 25 May 2026 20:02:32 -0400
Received: by mail-vk1-xa35.google.com with SMTP id
 71dfb90a1353d-5751770a178so3243775e0c.3
 for <81019 <at> debbugs.gnu.org>; Mon, 25 May 2026 17:02:28 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1779753748; x=1780358548; darn=debbugs.gnu.org;
 h=mime-version:user-agent:message-id:date:face:references:in-reply-to
 :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to;
 bh=SnDH9q5XUbQpA1XCTrQJK9M+vYiGreowDuHsSPenSaY=;
 b=gSI8FM32p8IyjRK4tbXZvmjMoBEJTsWIWeRZ64NNgUZK+yI8uqt02q67wXQ5AM4bnq
 KD9y/IgkNUJ/4/blqf+APFYubd0GLjzRVnVkU1YboYSbn8mUh4Cc4sepWHSDSDzYfIms
 b0t4zESYIwJuXDTqHJYaXFloKIZPdkywurw75M+F5CUJo2wiZzBsJG0VDGhgIHKsJoaw
 25i53Ks7RpxQ71iE3aEbz0fP2trsMT3tci4s/xkVb+ZfqiIkwxIU5BDgNXMdER9Fjvou
 W+M3obQ4w+/UMlg6DT6Cgf86jJKJUzvrxZ9DqmoAlG5HnMDYTPy8SRXqzXn7py2M4TnO
 w7pg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1779753748; x=1780358548;
 h=mime-version:user-agent:message-id:date:face:references:in-reply-to
 :subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject
 :date:message-id:reply-to;
 bh=SnDH9q5XUbQpA1XCTrQJK9M+vYiGreowDuHsSPenSaY=;
 b=rE9BzyF5SBsujOma0m9jtxP/jbQifOIwk1L0VwaQsxa/zstupZgUAMbsMUYOdPj5SM
 T/qQ3qo+gyJfPvLKkr+nPEghgv35c5Jx4m/hFoGD3BLa3JfnE6rl2E0AL80BDUglhmdq
 yat7AfmYkybxvGHy+It9qJ2nHphc/495E0gHYrJaNEyIsKJsH9RV3BSxZypW5fUnNS2d
 FbaDZcC7/wkJj3doeuI/GZICbwTRJwoY3F+8vF5zDwEEQ/Cq3Wd6b28Dok+v1YO3tkBE
 GDYt9tOHlWfxQVli2+xrX2093KVZxnEOuV353yPwlT9jS6UhpX27bOzMCSjZkIWOKQ5L
 bomQ==
X-Forwarded-Encrypted: i=1;
 AFNElJ+/E9cWIgNAIj/xRb0e/nAw8MrXBd800mQUt0iwMqJQX5gvyoONqTP/7iTutu+prWFdqRo1Sg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YyGtHD3p1Ms1QhAtPJtfnj7MNsIprF25+92zmaNMmIyVVoUHVW4
 I3z3YPPrzXoLc5ZRQWj+MznIs8fRn4T5OIPi8wddWSuDh8vHaDPF7Rqd
X-Gm-Gg: Acq92OEgGluPEO1NHy6X/6GtdYWvx4RCynOAN7ylktCjqU+u9tolmptjx8EJ4jAbL07
 jaiTa5UFNbngGtZkOQ18eur9BUVXZyYejMncusqIeFWVcL2Q6N3sM7CQHZjV3tCzRBOmjmDZ8OK
 0eeTeKDNnzHqCNq7Xra2htffqce7hdWGEiESESSo7vUdchWyJvXnEz2h2gWp83+eCrjIsKT2V0W
 2n+hHA2t6SYUDV/KwCEXeW5zs/t1+rWmxdyPEQeeIGB9k5G9SKt6OR1WflhcUxPGTNsUA0ki9t8
 hgQEJYh18MSU4NG0OrURMCEAax+6Z5uduIjXQTbI/VDgxxQ4hlvWvNJtDYASSQ3lQNzMwgUYiSM
 aePDU/yoX5bJxrDQVdoReauXX8F/pxbeNyafKRYMPh2MxoGp/I/8r1T7Ay/n8GA9AjOunq59dyJ
 jIIngoQlTd7b6uPaml+1IaG7CrrFuKUF/8V2GjY7JyxoGklEsqJvABk9Eym769XBBkjXfu6Y9SR
 HcqNeNq8DiZbwiZaEfxANCUITUnuckC9Fuhd22Myi4W9KFG
X-Received: by 2002:a05:6122:3b16:b0:588:33d2:9249 with SMTP id
 71dfb90a1353d-58833d29772mr5541733e0c.8.1779753747802; 
 Mon, 25 May 2026 17:02:27 -0700 (PDT)
Received: from MacBook-Pro.local (201-93-59-247.dial-up.telesp.net.br.
 [201.93.59.247]) by smtp.gmail.com with ESMTPSA id
 71dfb90a1353d-586f915c4f1sm13910397e0c.17.2026.05.25.17.02.24
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Mon, 25 May 2026 17:02:26 -0700 (PDT)
From: Rahul Martim Juliato <rahuljuliato@HIDDEN>
X-Google-Original-From: Rahul Martim Juliato <rahul.juliato@HIDDEN>
To: Rahul Martim Juliato <rahuljuliato@HIDDEN>
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
In-Reply-To: <m2v7cbzm39.fsf@HIDDEN>
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
 <m2mry3cgqa.fsf@HIDDEN>
 <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
 <1801F912-77A8-4106-8F74-4A7F4F95B7A3@HIDDEN>
 <CACah_w2AvKug824TMKeibrrqiJmyYxS_EfZAyT0BNZZ9tNkBhQ@HIDDEN>
 <CAN+1Hbo=Y4TRJohfgm3puQOJjOdehSN+30-F__fwgRARtWkMBQ@HIDDEN>
 <95156828-ABD4-4C83-B23A-082E71FE098F@HIDDEN>
 <m2v7cbzm39.fsf@HIDDEN>
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABhQTFRFDxIfFR9FMD+RM2CBkZPbZKPEn+Xt////lKVMgwAAAAFiS0dEAIgFHUgAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfqAhsDFwcfcr7WAAACY0lEQVRIx7VVWbLbMAwzBZG6/41LcJHXpl/Vm/G8OADBBWKOo44c//mM2yeoH7go/kqQG3zlucDxgwTzkwz9XVl+K8Z8igL5p4KYKbApCHDC5aGXn7EcD1KCkUl9154EtSJUJWwWIIJbZyLVIIgTguGdCobxQ4nLI3gRLECO9axcwgNYQi81yH5KhGXZ1oU7XSH3YUnQ488YsesOCWrwxYOAgAtW1ZCEZKxoNR4TCILXGnPbjJ65v8ZrbB4fbI02pUaelSjuDKboCS1LifMEg1HwaOpRvV/2Ylja5ekjafyFYU2AnGOTMagh5Qbrs6OngFxTkhFPxUYUZePl3iQnSB7Y+3gcvQocDSYeWOuDYorXZagzhioeqWVSH3ivfvS54/EcW8LvB2eTSJDtbtkJXeGTD/1FwCbMNI/pnC0CjYi3ej2HhDvOD121dGzGFyHgM+5DUnhLNc0lKm0OYptQsWPTJKPMMuil0rhU6+E51th4obJqinOMntOBM59pzlg0wmICoRc3ML5tgpzpODRdk02MQmaEL8YIhdEElJniQbvDRSh7DicV9qjmQFeFHA3mosS8EU6+8g2jV8dzc3jpTK0ZFwWObITvpXZv1MRJXDSOs6WskFcxVKqIlKPMJpzxp9I+udrjLx3tKfB9unHslNi/Wj9AZt8+mGEnnTmPIzMYM5ZENgp1XVghv+uN4/ZE7sf4gXJV9yvHJp1/7EvJlTlz
 pUspOFJt723pVYz9c2cpgHYfKSMXVz72TvL/rJqxL92+D2cGuelri9Nkc5wX6Hjf6cqEsoPptle/Vtllqb3eEPkHU2QXL+sLC8kAAAAASUVORK5CYII=
X-PGP-Key: https://www.rahuljuliato.com/rahul_pub_key.asc
Date: Mon, 25 May 2026 21:02:19 -0300
Message-ID: <m2tsrv9gxg.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: Yuan Fu <casouri@HIDDEN>,
 =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>, 81019 <at> debbugs.gnu.org,
 Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable


Rahul Martim Juliato <rahuljuliato@HIDDEN> writes:
> Yuan Fu <casouri@HIDDEN> writes:
>
>> Sorry, I tried a couple gestures and incantations but couldn=E2=80=99t r=
epro
>> it and got distracted by other tasks. I=E2=80=99ll give it another try. =
In the
>> meantime, any thoughts and guesses? I can=E2=80=99t think of what else c=
ould
>> be different in our environment that can cause the difference.
>>
>> Yuan
>>
>
> Hi Yuan!
>
> Thanks for not giving up on us (and this problem) :)
>
> There have been a lot of changes since this bug first emerged. I'll try
> to reserve some time tonight to dissect it and will report back after
> that.


Hi Yuan,

Picking this up. Got the idea of writing a batch reproducer from
Andreas's (Alberti) approach on a recent bug. Two files attached:

  * bug81019_repro.el                          (reproducer)
  * bug81019-fix-treesit-local-parser.patch    (candidate fix)

Run:

    emacs -Q -l bug81019_repro.el -f bug81019-repro

Opens '*bug81019-repro*' with the test span and a verdict. Prints the
REUSED vs FRESH parser root nodes for the local markdown-inline parser:
BAD without the patch, GOOD with it. I can reproduce consistently
before, no repro after.

What surfaces the bug in batch is the ordering per keystroke:

  1. self-insert-command (through pre/post-command-hook)
  2. force every local markdown-inline parser to reparse at its CURRENT
     (still old) included-ranges
  3. treesit-update-ranges

Step 2 before step 3 is the trigger. Live editing hits the same order
because font-lock fontifies around point on every keystroke, querying
the local parser tree before the host parser's next range-rule run grows
the range to cover the new char. Tree-sitter commits to a tree shape for
the old range, and the subsequent range expansion plus edit never
re-fires the `code_span' rule when the closing backtick arrives. A
naive batch driver that updates ranges first does not see the bug, which
probably explains the hard-to-reproduce reports.

About the fix. My original patch checked overlay bounds in
`treesit--update-ranges-local'. That is a no-op: the overlay is created
with REAR-ADVANCE non-nil, so rear insertions advance overlay-end
automatically, and the bounds-match guard always succeeds for forward
typing. Apologies for the noise there.

The attached patch checks the parser's actual
`treesit-parser-included-ranges' instead. If they already match the new
range, reuse is safe. Otherwise fall through to the existing create-new
branch, and cleanup deletes the stale overlay at the end of
`treesit-update-ranges'.

Caveat: every range change on a local parser now drops the incremental
tree. Fine for fontification-driven modes like markdown-ts, but a
sledgehammer. A narrower fix probably belongs in treesit.c (invalidate
affected subtree on range change, keep the rest). I did not attempt that
without your input.

I still do not know why this hits me and St=C3=A9phane interactively but not
you. Could be input method (dead keys on pt-BR / en , or
whathever... here), jit-lock timing, or something else in the editor
env. The batch repro sidesteps that question (hopefully).

St=C3=A9phane, could you try the patch against the phantom-overlay symptom
you were seeing in fenced code blocks? Same path (local-parser overlay
reuse across range moves) so it might cover that too, but I would like
confirmation before claiming it.

Let me know what you think.

--=20
Rahul Martim Juliato



--=-=-=
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=bug81019_repro.el
Content-Transfer-Encoding: base64

Ozs7IGJ1ZzgxMDE5LXJlcHJvLmVsIC0tLSBzZWxmLWNvbnRhaW5lZCByZXByb2R1Y2VyIGZvciBi
dWcjODEwMTkgIC0qLSBsZXhpY2FsLWJpbmRpbmc6IHQ7IC0qLQoKOzsgUnVuIHdpdGg6ICBlbWFj
cyAtUSAtbCBidWc4MTAxOS1yZXByby5lbCAtZiBidWc4MTAxOS1yZXBybwo7Owo7OyBSZXF1aXJl
czogIG1hcmtkb3duLXRzLW1vZGUgdXNpbmcgOmxvY2FsICdtYXJrZG93bi1pbmxpbmUgcGFyc2Vy
cwo7OyAgICAgICAgICAgIChpLmUuIGN1cnJlbnQgZW1hY3MgbWFzdGVyICsgdHJlZS1zaXR0ZXIt
bWFya2Rvd24gZ3JhbW1hcikuCjs7Cjs7IEJ1ZyBzdW1tYXJ5IChidWcjODEwMTkpOgo7OyAgIEhv
c3QgbWFya2Rvd24gcGFyc2VyIHJlcGFyc2VzIGNvcnJlY3RseSBhbmQgcmVwb3J0cyB0aGUgbmV3
Cjs7ICAgYGlubGluZScgbm9kZSBib3VuZHMuICBUaGUgbG9jYWwgYG1hcmtkb3duLWlubGluZScg
cGFyc2VyIGF0IHRoYXQKOzsgICByYW5nZSBrZWVwcyBhIHN0YWxlIGluY3JlbWVudGFsIHRyZWUg
LS0tIG5vIGBjb2RlX3NwYW4nIHN1YnRyZWUgaXMKOzsgICBldmVyIHByb2R1Y2VkIGZvciBhIGNv
ZGUgc3BhbiB0aGF0IHdhcyBjb21wbGV0ZWQgYnkgdHlwaW5nIHRoZQo7OyAgIGNsb3NpbmcgYmFj
a3RpY2sgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci4gIE9ubHkgUkVUIChvciBhbnl0aGluZwo7OyAg
IHRoYXQgc2hpZnRzIHRoZSByYW5nZSBlbm91Z2ggdG8gcmVjcmVhdGUgdGhlIG92ZXJsYXkpIGNs
ZWFycyBpdC4KOzsKOzsgV2hhdCB0aGlzIHNjcmlwdCBkb2VzOgo7OyAgIDEuIEJ1aWxkcyBhIGZy
ZXNoICpidWc4MTAxOSogYnVmZmVyLCBlbmFibGVzIGBtYXJrZG93bi10cy1tb2RlJy4KOzsgICAy
LiBJbnNlcnRzIHRoZSBmaXJzdCBjb2RlIHNwYW4gImBmb29gIiBpbiBvbmUgc2hvdC4gIFJlcGFy
c2UuCjs7ICAgMy4gSW5zZXJ0cyB0aGUgc2Vjb25kIGxpbmUgYnkgc2ltdWxhdGluZyB0eXBpbmc6
IGVhY2ggY2hhcmFjdGVyCjs7ICAgICAgZ29lcyB0aHJvdWdoIGBzZWxmLWluc2VydC1jb21tYW5k
JyBzbyBgYWZ0ZXItY2hhbmdlLWZ1bmN0aW9ucycKOzsgICAgICBydW4gYmV0d2VlbiBldmVyeSBr
ZXlzdHJva2UuICBUaGlzIG1hdGNoZXMgd2hhdCB0cmlnZ2VycyB0aGUKOzsgICAgICBidWcgZm9y
IGxpdmUgZWRpdGluZzsgaXQgYWxzbyB0cmlnZ2VycyBmb3IKOzsgICAgICAgIChpbnNlcnQtY2hh
ciA/YCkgLi4uIChpbnNlcnQgImNvZGl1bSAgIikgLi4uIChpbnNlcnQtY2hhciA/YCkKOzsgICAg
ICBvbmUgZXhwcmVzc2lvbiBhdCBhIHRpbWUsIGJ1dCB0aGUgcGVyLWNoYXIgcGF0aCBpcyB0aGUg
Y2xlYW5lc3QKOzsgICAgICByZXByb2R1Y3Rpb24uCjs7ICAgNC4gV2l0aG91dCBwcmVzc2luZyBS
RVQsIHdhbGtzIHRoZSBsb2NhbCBgbWFya2Rvd24taW5saW5lJyBwYXJzZXIKOzsgICAgICBjb3Zl
cmluZyB0aGUgc2Vjb25kIHNwYW4gYW5kIHByaW50cyBpdHMgcm9vdCBub2RlIHN0cmluZy4KOzsg
ICAgICAgIC0gR09PRDogIChpbmxpbmUgKGNvZGVfc3BhbiAuLi4pKQo7OyAgICAgICAgLSBCQUQ6
ICAgKGlubGluZSkgICAgICAgICAgICA7OyA8LSBidWcjODEwMTkKOzsgICA1LiBBbHNvIGNyZWF0
ZXMgYSBmcmVzaCBwYXJzZXIgb24gdGhlIHNhbWUgcmFuZ2UgYW5kIHByaW50cyBpdHMKOzsgICAg
ICByb290IG5vZGUgc3RyaW5nLCB0byBwcm92ZSB0aGUgZ3JhbW1hcitpbnB1dCtyYW5nZSBhcmUg
ZmluZSBhbmQKOzsgICAgICBvbmx5IHRoZSByZXVzZWQgcGFyc2VyJ3MgYWNjdW11bGF0ZWQgc3Rh
dGUgaXMgYnJva2VuLgoKKHJlcXVpcmUgJ3RyZWVzaXQpCgooZGVmY29uc3QgYnVnODEwMTktcmVw
cm8tLWJhbm5lciAiXApidWc4MTAxOS1yZXBybyAtLS0gdHJlZXNpdCBsb2NhbCBwYXJzZXIgc3Rh
bGUgaW5jcmVtZW50YWwgdHJlZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQoKTW9kZTogYG1hcmtkb3duLXRzLW1vZGUnIHdpdGgg
OmxvY2FsICdtYXJrZG93bi1pbmxpbmUgcGFyc2Vycy4KClNldHVwIGlzIHR3byBjb2RlIHNwYW5z
IG9uIHRoZWlyIG93biBsaW5lcy4gIFRoZSBmaXJzdCBvbmUgaXMKaW5zZXJ0ZWQgaW4gYnVsayBh
bmQgaXMgaXJyZWxldmFudCAtLS0gaXQganVzdCBnaXZlcyB0aGUgaG9zdAptYXJrZG93biBwYXJz
ZXIgc29tZXRoaW5nIHN0YWJsZSBhYm92ZSB0aGUgbGluZSB1bmRlciB0ZXN0LgoKVGhlIHNlY29u
ZCBzcGFuIGlzIHR5cGVkIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgdmlhCmBzZWxmLWluc2VydC1j
b21tYW5kJy4gIFJFVCBpcyBOT1QgcHJlc3NlZC4gIFBlciB0aGUgYnVnLCBSRVQKd291bGQgc2hp
ZnQgdGhlIGhvc3QgaW5saW5lIHJhbmdlIHBhc3QgdGhlIG92ZXJsYXkgYm91bmRzIGFuZCBsZXQK
YHRyZWVzaXQtLWNsZWFudXAtbG9jYWwtcmFuZ2Utb3ZlcmxheXMnIGRlbGV0ZSB0aGUgc3RhbGUg
b3ZlcmxheSwKYWZ0ZXIgd2hpY2ggYSBmcmVzaCBwYXJzZXIgaXMgY3JlYXRlZCBhbmQgdGhlIGJ1
ZmZlciBmb250aWZpZXMuCgpPcmRlciBtYXR0ZXJzLiAgQmV0d2VlbiBldmVyeSBrZXlzdHJva2Ug
dGhpcyBzY3JpcHQgZG9lczoKCiAgMS4gYHNlbGYtaW5zZXJ0LWNvbW1hbmQnICh0aGUgZWRpdCwg
ZHJpdmVuIHRocm91Z2gKICAgICBwcmUvcG9zdC1jb21tYW5kLWhvb2sgc28gdGhlIGNvbW1hbmQg
bG9vcCBiZWhhdmVzIG5vcm1hbGx5KQogIDIuIGZvcmNlIGV2ZXJ5IGxvY2FsIGBtYXJrZG93bi1p
bmxpbmUnIHBhcnNlciB0byByZXBhcnNlIGF0IGl0cwogICAgIENVUlJFTlQgKHN0aWxsIG9sZCkg
aW5jbHVkZWQtcmFuZ2VzICAgICAgICAgIDwtLSB0aGUga2V5IHN0ZXAKICAzLiBgdHJlZXNpdC11
cGRhdGUtcmFuZ2VzJyBvdmVyIHRoZSB3aG9sZSBidWZmZXIgKHRoZQogICAgIGB0cmVlc2l0LS11
cGRhdGUtcmFuZ2VzLWxvY2FsJyBwYXRoIHRoZW4gZXhwYW5kcyB0aGUgbG9jYWwKICAgICBwYXJz
ZXIncyBvdmVybGF5ICsgaW5jbHVkZWQtcmFuZ2VzIGJ5IG9uZSkKClN0ZXAgMiBCRUZPUkUgc3Rl
cCAzIGlzIHdoYXQgcmVwcm9kdWNlcyB0aGUgYnVnIGZyb20gZWxpc3AuICBJbgpsaXZlIGVkaXRp
bmcsIGZvbnQtbG9jayBmb250aWZpZXMgdGhlIHJlZ2lvbiBhcm91bmQgcG9pbnQgb24gZWFjaApr
ZXlzdHJva2U7IHRoYXQgZm9udGlmaWNhdGlvbiBxdWVyaWVzIHRoZSBsb2NhbCBwYXJzZXIgdHJl
ZQpCRUZPUkUgdGhlIGhvc3QgcGFyc2VyJ3MgbmV4dCByYW5nZS1ydWxlIHJ1biBncm93cyB0aGUg
cmFuZ2UgdG8KY292ZXIgdGhlIG5ldyBjaGFyLiAgVHJlZS1zaXR0ZXIgY29tbWl0cyB0byBhIHRy
ZWUgc2hhcGUgZm9yIHRoZQpvbGQgcmFuZ2UsIGFuZCB0aGUgc3Vic2VxdWVudCByYW5nZSBleHBh
bnNpb24gKyBlZGl0IG9uIHRvcCBvZiBpdApuZXZlciByZS1maXJlcyB0aGUgYGNvZGVfc3Bhbicg
cnVsZSB3aGVuIHRoZSBjbG9zaW5nIGJhY2t0aWNrCmZpbmFsbHkgYXJyaXZlcy4KCkFmdGVyIHRo
ZSBzaW11bGF0ZWQgdHlwaW5nLCB0aGlzIHNjcmlwdCBpbnNwZWN0cyB0aGUgbG9jYWwKbWFya2Rv
d24taW5saW5lIHBhcnNlciB0aGF0IGNvdmVycyB0aGUgc2Vjb25kIHNwYW46CgogIFJFVVNFRCBw
YXJzZXIgYXQgKEJFRyAuIEVORCk6CiAgICAoaW5saW5lKSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDwtIGJ1ZyM4MTAxOSAoQkFEKQogICAgKGlubGluZSAoY29kZV9zcGFuIC4uLikpICAg
ICAgICAgICAgICA8LSBleHBlY3RlZCAgICAgKEdPT0QpCgpJdCB0aGVuIGNyZWF0ZXMgYSBmcmVz
aCBgbWFya2Rvd24taW5saW5lJyBwYXJzZXIgb24gdGhlIHNhbWUKcmFuZ2UgYW5kIHByaW50cyBp
dHMgcm9vdCBub2RlLCB3aGljaCBzaG91bGQgYWx3YXlzIGJlCiAgKGlubGluZSAoY29kZV9zcGFu
IC4uLikpCnJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYnVnIGZpcmVkLiAgU2FtZSBidWZmZXIs
IHNhbWUgcmFuZ2UsCnNhbWUgZ3JhbW1hciAtLS0gZGlmZmVyZW50IHRyZWUsIGRlcGVuZGluZyBv
bmx5IG9uIHdoZXRoZXIgdGhlCnBhcnNlciB3YXMgcmV1c2VkIGFjcm9zcyBlZGl0cy4KCklmIEdP
T0QsIGVpdGhlciB0aGUgYnVnIGlzIGdvbmUgb24gdGhpcyBidWlsZCBvciB0aGlzIGJ1aWxkCmFs
cmVhZHkgY2FycmllcyB0aGUgcHJvcG9zZWQgYHRyZWVzaXQtLXVwZGF0ZS1yYW5nZXMtbG9jYWwn
Cmd1YXJkIChvdmVybGF5IGJvdW5kcyBtdXN0IG1hdGNoIGV4YWN0bHkgdG8gYmUgcmV1c2VkKS4K
ClRoaXMgcmVwcm9kdWNlcyBpbiAtYmF0Y2ggYXMgd2VsbCBhcyBpbnRlcmFjdGl2ZS4KIikKCihk
ZWZ1biBidWc4MTAxOS1yZXByby0tcXVlcnktbG9jYWwtaW5saW5lLXBhcnNlcnMgKCkKICAiRm9y
Y2UgZXZlcnkgbG9jYWwgYG1hcmtkb3duLWlubGluZScgcGFyc2VyIHRvIHJlcGFyc2UgYXQgY3Vy
cmVudCByYW5nZXMuClRoaXMgaXMgd2hhdCBmb250LWxvY2sgZG9lcyBkdXJpbmcgbGl2ZSBlZGl0
aW5nIGJldHdlZW4gcmFuZ2UKdXBkYXRlczogaXQgcXVlcmllcyB0aGUgbG9jYWwgcGFyc2VyIHRy
ZWUgZm9yIGZvbnRpZmljYXRpb24gb24KdGhlIHJlZ2lvbiBhcm91bmQgcG9pbnQsIGNvbW1pdHRp
bmcgdHJlZS1zaXR0ZXIgdG8gYSB0cmVlIGF0IHRoZQpPTEQgcmFuZ2UgYmVmb3JlIHRoZSBob3N0
IHBhcnNlcidzIHJhbmdlLXJ1bGUgcnVuIGdyb3dzIHRoZSByYW5nZQp0byBpbmNsdWRlIHRoZSBm
cmVzaGx5IHR5cGVkIGNoYXJhY3Rlci4iCiAgKGRvbGlzdCAob3YgKG92ZXJsYXlzLWluIChwb2lu
dC1taW4pIChwb2ludC1tYXgpKSkKICAgIChsZXQgKChwciAob3ZlcmxheS1nZXQgb3YgJ3RyZWVz
aXQtcGFyc2VyKSkpCiAgICAgICh3aGVuIChhbmQgcHIKICAgICAgICAgICAgICAgICAob3Zlcmxh
eS1nZXQgb3YgJ3RyZWVzaXQtcGFyc2VyLWxvY2FsLXApCiAgICAgICAgICAgICAgICAgKGVxICh0
cmVlc2l0LXBhcnNlci1sYW5ndWFnZSBwcikgJ21hcmtkb3duLWlubGluZSkpCiAgICAgICAgKHRy
ZWVzaXQtbm9kZS1zdHJpbmcgKHRyZWVzaXQtcGFyc2VyLXJvb3Qtbm9kZSBwcikpKSkpKQoKKGRl
ZnVuIGJ1ZzgxMDE5LXJlcHJvLS10eXBlIChzKQogICJTaW11bGF0ZSB0eXBpbmcgZWFjaCBjaGFy
YWN0ZXIgb2YgUyB2aWEgYHNlbGYtaW5zZXJ0LWNvbW1hbmQnLgoKT3JkZXIgbWF0dGVycy4gIEJl
dHdlZW4gZXZlcnkga2V5c3Ryb2tlIHRoaXMgZG9lczoKCiAgMS4gYHNlbGYtaW5zZXJ0LWNvbW1h
bmQnICAgICAgICAgICAgICAgICAgICAtLSB0aGUgZWRpdAogIDIuIGZvcmNlIGVhY2ggbG9jYWwg
YG1hcmtkb3duLWlubGluZScgcGFyc2VyIHRvIHJlcGFyc2UgYXQgaXRzCiAgICAgQ1VSUkVOVCAo
c3RpbGwgb2xkKSBpbmNsdWRlZC1yYW5nZXMgICAgIDwtLSB0aGUga2V5IHN0ZXAKICAzLiBgdHJl
ZXNpdC11cGRhdGUtcmFuZ2VzJyAgICAgICAgICAgICAgICAgLS0gdGhlCiAgICAgYHRyZWVzaXQt
LXVwZGF0ZS1yYW5nZXMtbG9jYWwnIHBhdGggdGhlbiBleHBhbmRzIHRoZSBsb2NhbAogICAgIHBh
cnNlcidzIG92ZXJsYXkgKyBpbmNsdWRlZC1yYW5nZXMgYnkgb25lCgpTdGVwIDIgQkVGT1JFIHN0
ZXAgMyBpcyB3aGF0IHRyaWdnZXJzIHRoZSBidWcuICBEdXJpbmcgbGl2ZQplZGl0aW5nLCBmb250
LWxvY2sgZm9udGlmaWVzIHRoZSByZWdpb24gYXJvdW5kIHBvaW50IG9uIGVhY2gKa2V5c3Ryb2tl
OyB0aGF0IGZvbnRpZmljYXRpb24gcXVlcmllcyB0aGUgbG9jYWwgcGFyc2VyIHRyZWUKQkVGT1JF
IHRoZSBob3N0IHBhcnNlcidzIG5leHQgcmFuZ2UtcnVsZSBydW4gZ3Jvd3MgdGhlIHJhbmdlIHRv
CmNvdmVyIHRoZSBuZXcgY2hhci4gIFRyZWUtc2l0dGVyIGNvbW1pdHMgdG8gYSB0cmVlIHNoYXBl
IGZvciB0aGUKb2xkIHJhbmdlLCBhbmQgdGhlIHN1YnNlcXVlbnQgcmFuZ2UgZXhwYW5zaW9uICsg
ZWRpdCBvbiB0b3Agb2YgaXQKbmV2ZXIgcmUtZmlyZXMgdGhlIGBjb2RlX3NwYW4nIHJ1bGUgd2hl
biB0aGUgY2xvc2luZyBiYWNrdGljawpmaW5hbGx5IGFycml2ZXMuCgpJZiB0aGUgcXVlcnkgaGFw
cGVucyBvbmx5IEFGVEVSIHJhbmdlcyBhcmUgdXBkYXRlZCAodGhlIG9yZGVyIGEKbmFpdmUgYmF0
Y2ggZHJpdmVyIHVzZXMpLCB0aGUgYnVnIGRvZXMgTk9UIGZpcmUuIgogIChkb2xpc3QgKGNoIChh
cHBlbmQgcyBuaWwpKQogICAgKGxldCAoKGxhc3QtY29tbWFuZC1ldmVudCBjaCkpCiAgICAgIDs7
IERyaXZlIHRoZSBjb21tYW5kIGxvb3Agc28gYW55dGhpbmcgdGllZCB0byBwcmUvcG9zdC1jb21t
YW5kLWhvb2sKICAgICAgOzsgZmlyZXMgLS0tIHNhbWUgYXMgYGV4ZWN1dGUta2JkLW1hY3JvJyB3
b3VsZC4KICAgICAgKHJ1bi1ob29rcyAncHJlLWNvbW1hbmQtaG9vaykKICAgICAgKHNldHEgdGhp
cy1jb21tYW5kICdzZWxmLWluc2VydC1jb21tYW5kKQogICAgICAoc2VsZi1pbnNlcnQtY29tbWFu
ZCAxKQogICAgICAoc2V0cSBsYXN0LWNvbW1hbmQgJ3NlbGYtaW5zZXJ0LWNvbW1hbmQpCiAgICAg
IChydW4taG9va3MgJ3Bvc3QtY29tbWFuZC1ob29rKQogICAgICAoYnVnODEwMTktcmVwcm8tLXF1
ZXJ5LWxvY2FsLWlubGluZS1wYXJzZXJzKQogICAgICAodHJlZXNpdC11cGRhdGUtcmFuZ2VzIChw
b2ludC1taW4pIChwb2ludC1tYXgpKSkpKQoKKGRlZnVuIGJ1ZzgxMDE5LXJlcHJvLS1maW5kLWxv
Y2FsLWlubGluZS1wYXJzZXIgKHBvcykKICAiUmV0dXJuIHRoZSBsb2NhbCBgbWFya2Rvd24taW5s
aW5lJyBwYXJzZXIgb3ZlcmxheSBjb3ZlcmluZyBQT1MsIG9yIG5pbC4KSWYgc2V2ZXJhbCBtYXRj
aCwgcmV0dXJuIG9uZSB3aG9zZSBib3VuZHMgZXhhY3RseSBtYXRjaCB0aGUgaG9zdCBpbmxpbmUK
bm9kZSBjb250YWluaW5nIFBPUywgZmFsbGluZyBiYWNrIHRvIHRoZSBsYXJnZXN0IG9uZS4iCiAg
KGxldCAoKG1hdGNoZXMgbmlsKSkKICAgIChkb2xpc3QgKG92IChvdmVybGF5cy1pbiAocG9pbnQt
bWluKSAocG9pbnQtbWF4KSkpCiAgICAgIChsZXQgKChwciAob3ZlcmxheS1nZXQgb3YgJ3RyZWVz
aXQtcGFyc2VyKSkpCiAgICAgICAgKHdoZW4gKGFuZCBwcgogICAgICAgICAgICAgICAgICAgKG92
ZXJsYXktZ2V0IG92ICd0cmVlc2l0LXBhcnNlci1sb2NhbC1wKQogICAgICAgICAgICAgICAgICAg
KGVxICh0cmVlc2l0LXBhcnNlci1sYW5ndWFnZSBwcikgJ21hcmtkb3duLWlubGluZSkKICAgICAg
ICAgICAgICAgICAgICg8PSAob3ZlcmxheS1zdGFydCBvdikgcG9zIChvdmVybGF5LWVuZCBvdikp
KQogICAgICAgICAgKHB1c2ggb3YgbWF0Y2hlcykpKSkKICAgICh3aGVuIG1hdGNoZXMKICAgICAg
KG1lc3NhZ2UgImZpbmQtbG9jYWwtaW5saW5lOiAlZCBtYXRjaGVzOiAlUyIKICAgICAgICAgICAg
ICAgKGxlbmd0aCBtYXRjaGVzKQogICAgICAgICAgICAgICAobWFwY2FyIChsYW1iZGEgKG92KSAo
Y29ucyAob3ZlcmxheS1zdGFydCBvdikgKG92ZXJsYXktZW5kIG92KSkpCiAgICAgICAgICAgICAg
ICAgICAgICAgbWF0Y2hlcykpCiAgICAgIChjYXIgKHNvcnQgbWF0Y2hlcyAobGFtYmRhIChhIGIp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICg+ICgtIChvdmVybGF5LWVuZCBhKSAob3Zlcmxh
eS1zdGFydCBhKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0gKG92ZXJsYXktZW5k
IGIpIChvdmVybGF5LXN0YXJ0IGIpKSkpKSkpKSkKCihkZWZ1biBidWc4MTAxOS1yZXBybyAoKQog
ICJSZXByb2R1Y2UgYnVnIzgxMDE5IGluIGEgZnJlc2ggYnVmZmVyLiAgU2VlIGJhbm5lci4iCiAg
KGludGVyYWN0aXZlKQogICh1bmxlc3MgKGZib3VuZHAgJ21hcmtkb3duLXRzLW1vZGUpCiAgICAo
dXNlci1lcnJvciAibWFya2Rvd24tdHMtbW9kZSBub3QgYXZhaWxhYmxlOyBuZWVkIEVtYWNzIDMx
IG1hc3RlciIpKQogICh1bmxlc3MgKHRyZWVzaXQtbGFuZ3VhZ2UtYXZhaWxhYmxlLXAgJ21hcmtk
b3duKQogICAgKHVzZXItZXJyb3IgInRyZWUtc2l0dGVyIGBtYXJrZG93bicgZ3JhbW1hciBub3Qg
YXZhaWxhYmxlIikpCiAgKHVubGVzcyAodHJlZXNpdC1sYW5ndWFnZS1hdmFpbGFibGUtcCAnbWFy
a2Rvd24taW5saW5lKQogICAgKHVzZXItZXJyb3IgInRyZWUtc2l0dGVyIGBtYXJrZG93bi1pbmxp
bmUnIGdyYW1tYXIgbm90IGF2YWlsYWJsZSIpKQogIChsZXQgKChidWYgKGdldC1idWZmZXItY3Jl
YXRlICIqYnVnODEwMTktcmVwcm8qIikpKQogICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmCiAg
ICAgIChyZWFkLW9ubHktbW9kZSAtMSkKICAgICAgKGVyYXNlLWJ1ZmZlcikKICAgICAgKGtpbGwt
YWxsLWxvY2FsLXZhcmlhYmxlcykKICAgICAgKGluc2VydCBidWc4MTAxOS1yZXByby0tYmFubmVy
KQogICAgICAoaW5zZXJ0ICJcbi0tLS0tIGJ1ZmZlciBjb250ZW50IHVzZWQgZm9yIHRoZSByZXBy
byAtLS0tLVxuXG4iKQogICAgICAobWFya2Rvd24tdHMtbW9kZSkKCiAgICAgIDs7IEZpcnN0IGNv
ZGUgc3BhbjogYnVsayBpbnNlcnQsIHRoZW4gYSBibGFuayBsaW5lLiAgTm90IHVuZGVyCiAgICAg
IDs7IHRlc3Q7IGp1c3QgZ2l2ZXMgdGhlIGhvc3QgcGFyc2VyIHNvbWV0aGluZyBzdGFibGUgYWJv
dmUuCiAgICAgIChpbnNlcnQgImBmb29gXG5cbiIpCgogICAgICA7OyBTZWNvbmQgY29kZSBzcGFu
OiB0eXBlIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIuICBUaGlzIGlzIHRoZQogICAgICA7OyBsaW5l
IHVuZGVyIHRlc3QuICBSZW1lbWJlciB3aGVyZSBpdCBzdGFydHMuCiAgICAgIChsZXQgKChsaW5l
Mi1iZWcgKHBvaW50KSkKICAgICAgICAgICAgKHRhcmdldC1wb3MgbmlsKSkKICAgICAgICAoYnVn
ODEwMTktcmVwcm8tLXR5cGUgImBjb2RpdW0gIGAiKQogICAgICAgIDs7IERvIE5PVCBpbnNlcnQg
UkVUIC0tLSB0aGF0IGVzY2FwZXMgdGhlIGJ1Zy4KICAgICAgICAoc2V0cSB0YXJnZXQtcG9zICgx
KyBsaW5lMi1iZWcpKSAgIDsgaW5zaWRlIHRoZSBiYWNrdGlja3MKCiAgICAgICAgOzsgRm9yY2Ug
YW55IHBlbmRpbmcgcmVwYXJzZSB0byBzZXR0bGUuCiAgICAgICAgKHJlZGlzcGxheSB0KQogICAg
ICAgICh0cmVlc2l0LXVwZGF0ZS1yYW5nZXMpCgogICAgICAgIDs7IEluc3BlY3QuCiAgICAgICAg
KGxldCogKChvdiAoYnVnODEwMTktcmVwcm8tLWZpbmQtbG9jYWwtaW5saW5lLXBhcnNlciB0YXJn
ZXQtcG9zKSkKICAgICAgICAgICAgICAgKHByIChhbmQgb3YgKG92ZXJsYXktZ2V0IG92ICd0cmVl
c2l0LXBhcnNlcikpKQogICAgICAgICAgICAgICAocmV1c2VkLXRyZWUKICAgICAgICAgICAgICAg
IChhbmQgcHIgKHRyZWVzaXQtbm9kZS1zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICh0
cmVlc2l0LXBhcnNlci1yb290LW5vZGUgcHIpKSkpCiAgICAgICAgICAgICAgIChyLXN0YXJ0IChh
bmQgb3YgKG92ZXJsYXktc3RhcnQgb3YpKSkKICAgICAgICAgICAgICAgKHItZW5kICAgKGFuZCBv
diAob3ZlcmxheS1lbmQgb3YpKSkKICAgICAgICAgICAgICAgKGZyZXNoCiAgICAgICAgICAgICAg
ICAoYW5kIG92CiAgICAgICAgICAgICAgICAgICAgIChsZXQgKChucCAodHJlZXNpdC1wYXJzZXIt
Y3JlYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmtkb3duLWlubGluZSBu
aWwgdCAnZW1iZWRkZWQpKSkKICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1wYXJzZXIt
c2V0LWluY2x1ZGVkLXJhbmdlcwogICAgICAgICAgICAgICAgICAgICAgICBucCBgKCgsci1zdGFy
dCAuICxyLWVuZCkpKQogICAgICAgICAgICAgICAgICAgICAgIChwcm9nMQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLXN0cmluZwogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKHRyZWVzaXQtcGFyc2VyLXJvb3Qtbm9kZSBucCkpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAodHJlZXNpdC1wYXJzZXItZGVsZXRlIG5wKSkpKSkpCiAgICAgICAgICAoZ290by1jaGFy
IChwb2ludC1tYXgpKQogICAgICAgICAgKGluc2VydCAiXG4tLS0tLSByZXN1bHQgLS0tLS1cblxu
IikKICAgICAgICAgIChpZiAobm90IG92KQogICAgICAgICAgICAgIChpbnNlcnQgIk5vIGxvY2Fs
IG1hcmtkb3duLWlubGluZSBvdmVybGF5IGNvdmVycyBwb2ludC5cbiIKICAgICAgICAgICAgICAg
ICAgICAgICIgIC0tIGNhbid0IHRlbGwgYW55dGhpbmc7IG1hcmtkb3duLXRzLW1vZGUgbWlnaHRc
biIKICAgICAgICAgICAgICAgICAgICAgICIgIC0tIG5vdCBoYXZlIGNyZWF0ZWQgdGhlIGxvY2Fs
IHBhcnNlciB5ZXQuXG4iKQogICAgICAgICAgICAoaW5zZXJ0IChmb3JtYXQgIlNwYW4gYnVmZmVy
LXN1YnN0cmluZzogJVNcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXItc3Vi
c3RyaW5nIHItc3RhcnQgci1lbmQpKSkKICAgICAgICAgICAgKGluc2VydCAoZm9ybWF0ICJPdmVy
bGF5IHJhbmdlOiAgICAgICAgICglZCAuICVkKVxuIgogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgci1zdGFydCByLWVuZCkpCiAgICAgICAgICAgIChpbnNlcnQgIlxuIikKICAgICAgICAgICAg
KGluc2VydCAiUkVVU0VEIGxvY2FsIHBhcnNlciByb290IG5vZGU6XG4gICIpCiAgICAgICAgICAg
IChpbnNlcnQgcmV1c2VkLXRyZWUgIlxuXG4iKQogICAgICAgICAgICAoaW5zZXJ0ICJGUkVTSCBw
YXJzZXIgcm9vdCBub2RlIG9uIHNhbWUgcmFuZ2U6XG4gICIpCiAgICAgICAgICAgIChpbnNlcnQg
ZnJlc2ggIlxuXG4iKQogICAgICAgICAgICAoY29uZAogICAgICAgICAgICAgKChzdHJpbmctbWF0
Y2gtcCAiY29kZV9zcGFuIiByZXVzZWQtdHJlZSkKICAgICAgICAgICAgICAoaW5zZXJ0ICJWRVJE
SUNUOiBHT09EIC0tLSByZXVzZWQgcGFyc2VyIHNlZXMgdGhlIGNvZGVfc3Bhbi5cbiIKICAgICAg
ICAgICAgICAgICAgICAgICJFaXRoZXIgYnVnIGlzIGdvbmUgb24gdGhpcyBidWlsZCwgb3IgdGhl
XG4iCiAgICAgICAgICAgICAgICAgICAgICAiYHRyZWVzaXQtLXVwZGF0ZS1yYW5nZXMtbG9jYWwn
IG92ZXJsYXktYm91bmRzIGd1YXJkXG4iCiAgICAgICAgICAgICAgICAgICAgICAiaXMgaW4gcGxh
Y2UuXG4iKSkKICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgKGluc2VydCAiVkVSRElDVDog
QkFEIC0tLSByZXVzZWQgcGFyc2VyIHRyZWUgaXMgc3RhbGUuXG4iCiAgICAgICAgICAgICAgICAg
ICAgICAiUmVwcm9kdWN0aW9uIG9mIGJ1ZyM4MTAxOSBjb25maXJtZWQgb24gdGhpcyBidWlsZC5c
biIKICAgICAgICAgICAgICAgICAgICAgICJTYW1lIHJhbmdlICsgc2FtZSBncmFtbWFyIHZpYSBh
IGZyZXNoIHBhcnNlciBkb2VzXG4iCiAgICAgICAgICAgICAgICAgICAgICAic2VlIHRoZSBjb2Rl
X3NwYW4sIHNvIHRoZSBncmFtbWFyIGFuZCBpbnB1dCBhcmVcbiIKICAgICAgICAgICAgICAgICAg
ICAgICJmaW5lOyB0aGUgcmV1c2VkIHBhcnNlcidzIGluY3JlbWVudGFsIHN0YXRlIGlzIG5vdC5c
biIpKSkpKSkKICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkpCiAgICAoc3dpdGNoLXRvLWJ1
ZmZlciBidWYpKSkKCihwcm92aWRlICdidWc4MTAxOS1yZXBybykKOzs7IGJ1ZzgxMDE5LXJlcHJv
LmVsIGVuZHMgaGVyZQo=
--=-=-=
Content-Type: application/octet-stream; charset=utf-8
Content-Disposition: attachment;
 filename=bug81019-fix-treesit-local-parser.patch
Content-Transfer-Encoding: base64

IGxpc3AvdHJlZXNpdC5lbCB8IDE5ICsrKysrKysrKysrKysrKysrKy0KIDEgZmlsZSBjaGFuZ2Vk
LCAxOCBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCgpkaWZmIC0tZ2l0IGEvbGlzcC90cmVl
c2l0LmVsIGIvbGlzcC90cmVlc2l0LmVsCmluZGV4IGUyZTYyYmI3MWEyLi5mZTlkZTA4YjA1MiAx
MDA2NDQKLS0tIGEvbGlzcC90cmVlc2l0LmVsCisrKyBiL2xpc3AvdHJlZXNpdC5lbApAQCAtMTI1
MCw3ICsxMjUwLDI0IEBAIHRyZWVzaXQtLXVwZGF0ZS1yYW5nZXMtbG9jYWwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZC1wYXJzZXIpKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuIChhbmQgKG92ZXJsYXktZ2V0IG92ICd0cmVl
c2l0LXBhcnNlci1sb2NhbC1wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
ZXEgcGFyc2VyLWxhbmcgZW1iZWRkZWQtbGFuZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKGVxIGVtYmVkLWxldmVsIHBhcnNlci1sZXZlbCkpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChlcSBlbWJlZC1sZXZlbCBwYXJzZXItbGV2ZWwpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IE9ubHkgcmV1c2UgaWYgdGhlIHBhcnNlcidz
IGV4aXN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGluY2x1ZGVk
LXJhbmdlcyBhbHJlYWR5IG1hdGNoIHRoZSBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgOzsgcmFuZ2UgZXhhY3RseS4gIE90aGVyd2lzZSB0cmVlLXNpdHRlcgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyB3b3VsZCBkbyBhbiBpbmNyZW1lbnRhbCBy
ZXBhcnNlIG92ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgdGhlIG9s
ZCB0cmVlIHVuZGVyIG5ldyByYW5nZXMsIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA7OyBmb3Igc29tZSBncmFtbWFycyAobWFya2Rvd24taW5saW5lCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGNvZGVfc3BhbikgdGhhdCBsZWF2ZXMgdGhlIHBh
cnNlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGFuIGluY29uc2lz
dGVudCBzdGF0ZSAoYnVnIzgxMDE5KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgOzsgTm90ZTogY2hlY2tpbmcgb3ZlcmxheSBib3VuZHMgaXMgbm90CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDs7IHN1ZmZpY2llbnQgYmVjYXVzZSB0aGUgb3ZlcmxheSBo
YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgcmVhci1hZHZhbmNlIHNl
dCBhbmQgZ3Jvd3Mgd2l0aCByZWFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IDs7IGluc2VydGlvbnMgZXZlbiB3aGlsZSB0aGUgcGFyc2VyJ3MKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgOzsgaW5jbHVkZWQtcmFuZ2VzIHN0aWxsIHBvaW50IGF0IHRoZQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBvbGQsIG5hcnJvd2VyIHJhbmdl
LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWwgKHRyZWVzaXQtcGFy
c2VyLWluY2x1ZGVkLXJhbmdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGVtYmVkZGVkLXBhcnNlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChsaXN0IChjb25zIHItc3RhcnQgci1lbmQpKSkpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICh0cmVlc2l0LS1zZXQtZW1iZWQtcmFuZ2VzCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByYW5nZSBlbWJlZGRlZC1wYXJzZXIgaG9zdC1wYXJzZXIpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChtb3ZlLW92ZXJsYXkgb3Ygci1zdGFydCByLWVuZCkK
--=-=-=--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 25 May 2026 12:54:10 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon May 25 08:54:10 2026
Received: from localhost ([127.0.0.1]:47182 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wRUor-00052K-LE
	for submit <at> debbugs.gnu.org; Mon, 25 May 2026 08:54:09 -0400
Received: from mail-vs1-xe31.google.com ([2607:f8b0:4864:20::e31]:47593)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <rahuljuliato@HIDDEN>)
 id 1wRUop-000528-MR
 for 81019 <at> debbugs.gnu.org; Mon, 25 May 2026 08:54:08 -0400
Received: by mail-vs1-xe31.google.com with SMTP id
 ada2fe7eead31-63127c440ccso7282171137.3
 for <81019 <at> debbugs.gnu.org>; Mon, 25 May 2026 05:54:07 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1779713647; x=1780318447; darn=debbugs.gnu.org;
 h=content-transfer-encoding:mime-version:user-agent:message-id:date
 :face:references:in-reply-to:subject:cc:to:from:from:to:cc:subject
 :date:message-id:reply-to;
 bh=DIU2jMo8xywUpU7fD+O70MbRnU6hhlnhlpOWkPb874o=;
 b=RSfhdVXTCb3H1k4QtZHQoRRaaCrX57V3bLK73zp2ep4JxcuTl+solv1TWDkggZUbfS
 02z4ZgYVr3bHABrhfPRYJiRhFAqadt/JXH7XWaqVbvaH8+bCHQWPh0p5nH0qbrL+/DkH
 cWQhGs3/eD2pR9f/BQlSpwBKTIycMHGo19bSnL77d0O7G+yJeifYk7F59BhIEWqeiT7m
 166WB4+dHxvKTuNyRbrIbHEiSbLEg5t4PWoUiGWQjRjRt5b0JGe8kW8Uab5limqE/g6w
 uTZqzhyIvHbUflEzuL39gvxt72A7D3cphe8yV/9BStVeJbLaI9xyDlEZCy+S1voovchn
 D2Dg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1779713647; x=1780318447;
 h=content-transfer-encoding:mime-version:user-agent:message-id:date
 :face:references:in-reply-to:subject:cc:to:from:x-gm-gg
 :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=DIU2jMo8xywUpU7fD+O70MbRnU6hhlnhlpOWkPb874o=;
 b=Y9s16qvfAZTyMjDgmla8SlGsnXC37nCvT21RLfKIi/QOOA/OsK6bCDhFKHmAqolcaN
 UJIApKhvVm4ii4geMT6cj+RzQO+zhdt1hByC57sbGWutEgBvMOIgqDGZJY9mniwlrc6Q
 pd/oRtv3FF8nUQeniifT5g+MeSVnJEuAZIb+0k6S6Pcpq7Z2lr1V6LdtALOTVMld3ymd
 +2Q7YuS9YWq3pweo3yXoX++pFlz+KTRy9fHns+lSrKUBU9fCKzlvat3p5cIN1C9nZOnw
 K6NIwHpiU8wL3qCXhhT1lbhfknuC/2MNhbbd86K90h4ZxTGVAKHMUCF2Aua7lyLa5LtA
 fMxw==
X-Forwarded-Encrypted: i=1;
 AFNElJ/ftJpQd97cfa4pgP/7UokA7N2PS+NGDBeC7HRFqG0owX5rOqhOV0rGhCOIpST88kHplWvf9w==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YzQKfo21csWSm63FNsaa05AQOa3HupLt3ieeBXegu5bbcNmD/a9
 jVkaGbjxMmb9RVoLz8VVvRM7aTjwvk1NtqS9BIL1hUr9ZQUibI9yWs0U
X-Gm-Gg: Acq92OF+NXrlOmEUWxgK/pYABidyq6mSU3zS+BmlXuyNkbE9CpOwysbj56KNQ27Z6Uz
 lANBANftk9jNUWvFq7aR9OjDuRE6ZoZaAEuYNyruW3vI8u5TmCeDwfKZWcxZepUIoX6sMeGus5q
 p3EXa6DVROn7EB+wjT9IfD5jvJtN8aWBmzXrHloB1dSgf4m0+VR26PMAbD+G/q+1WJ546d3KY0Z
 BxkvxtpYbbl7TMzOl/GdLzIyezCIegYGJ3DEj9cL3Dl4Mjho+wVJNw9W07zjuWWj3LS/07rlRm+
 x+/aIE53MvTafVGYiiJAmN2LEwB4wdiIQ2kPTW/xhY1+SXq44uWGm24wCBi68VjM/8rVDM8A3VX
 hpX5RSoUQ6tHpI22vB5VWu23DxoLxcjifr+LmEk8SvXqkYL7mjb/rHTqZ67W1DCqfh0lzm47t1d
 GK7ceVADoRWO5LUewn8N4v4HXAbs3rQBlZhC0HFLfWeMhrwCzqs1xYrvyiW0kqiqH8YSayrE9bQ
 hc7NcWtJEfpp2CwTO1Wv9OyrrGUZVZemw+lMe+EPe9JsGgy
X-Received: by 2002:a05:6102:3e03:b0:631:44bc:c119 with SMTP id
 ada2fe7eead31-67c7300bed4mr6787172137.7.1779713646526; 
 Mon, 25 May 2026 05:54:06 -0700 (PDT)
Received: from MacBook-Pro.local (201-93-59-247.dial-up.telesp.net.br.
 [201.93.59.247]) by smtp.gmail.com with ESMTPSA id
 ada2fe7eead31-67fd8850c32sm9669080137.2.2026.05.25.05.54.04
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Mon, 25 May 2026 05:54:06 -0700 (PDT)
From: Rahul Martim Juliato <rahuljuliato@HIDDEN>
X-Google-Original-From: Rahul Martim Juliato <rahul.juliato@HIDDEN>
To: Yuan Fu <casouri@HIDDEN>
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
In-Reply-To: <95156828-ABD4-4C83-B23A-082E71FE098F@HIDDEN>
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
 <m2mry3cgqa.fsf@HIDDEN>
 <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
 <1801F912-77A8-4106-8F74-4A7F4F95B7A3@HIDDEN>
 <CACah_w2AvKug824TMKeibrrqiJmyYxS_EfZAyT0BNZZ9tNkBhQ@HIDDEN>
 <CAN+1Hbo=Y4TRJohfgm3puQOJjOdehSN+30-F__fwgRARtWkMBQ@HIDDEN>
 <95156828-ABD4-4C83-B23A-082E71FE098F@HIDDEN>
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABhQTFRFDxIfFR9FMD+RM2CBkZPbZKPEn+Xt////lKVMgwAAAAFiS0dEAIgFHUgAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfqAhsDFwcfcr7WAAACY0lEQVRIx7VVWbLbMAwzBZG6/41LcJHXpl/Vm/G8OADBBWKOo44c//mM2yeoH7go/kqQG3zlucDxgwTzkwz9XVl+K8Z8igL5p4KYKbApCHDC5aGXn7EcD1KCkUl9154EtSJUJWwWIIJbZyLVIIgTguGdCobxQ4nLI3gRLECO9axcwgNYQi81yH5KhGXZ1oU7XSH3YUnQ488YsesOCWrwxYOAgAtW1ZCEZKxoNR4TCILXGnPbjJ65v8ZrbB4fbI02pUaelSjuDKboCS1LifMEg1HwaOpRvV/2Ylja5ekjafyFYU2AnGOTMagh5Qbrs6OngFxTkhFPxUYUZePl3iQnSB7Y+3gcvQocDSYeWOuDYorXZagzhioeqWVSH3ivfvS54/EcW8LvB2eTSJDtbtkJXeGTD/1FwCbMNI/pnC0CjYi3ej2HhDvOD121dGzGFyHgM+5DUnhLNc0lKm0OYptQsWPTJKPMMuil0rhU6+E51th4obJqinOMntOBM59pzlg0wmICoRc3ML5tgpzpODRdk02MQmaEL8YIhdEElJniQbvDRSh7DicV9qjmQFeFHA3mosS8EU6+8g2jV8dzc3jpTK0ZFwWObITvpXZv1MRJXDSOs6WskFcxVKqIlKPMJpzxp9I+udrjLx3tKfB9unHslNi/Wj9AZt8+mGEnnTmPIzMYM5ZENgp1XVghv+uN4/ZE7sf4gXJV9yvHJp1/7EvJlTlz
 pUspOFJt723pVYz9c2cpgHYfKSMXVz72TvL/rJqxL92+D2cGuelri9Nkc5wX6Hjf6cqEsoPptle/Vtllqb3eEPkHU2QXL+sLC8kAAAAASUVORK5CYII=
X-PGP-Key: https://www.rahuljuliato.com/rahul_pub_key.asc
Date: Mon, 25 May 2026 09:54:02 -0300
Message-ID: <m2v7cbzm39.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: Rahul Juliato <rahuljuliato@HIDDEN>,
 =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>, 81019 <at> debbugs.gnu.org,
 Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)


Yuan Fu <casouri@HIDDEN> writes:

> Sorry, I tried a couple gestures and incantations but couldn=E2=80=99t re=
pro
> it and got distracted by other tasks. I=E2=80=99ll give it another try. I=
n the
> meantime, any thoughts and guesses? I can=E2=80=99t think of what else co=
uld
> be different in our environment that can cause the difference.
>
> Yuan
>

Hi Yuan!

Thanks for not giving up on us (and this problem) :)

There have been a lot of changes since this bug first emerged. I'll try
to reserve some time tonight to dissect it and will report back after
that.

--=20
Rahul Martim Juliato




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 24 May 2026 08:40:42 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun May 24 04:40:42 2026
Received: from localhost ([127.0.0.1]:60537 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wR4O0-0002Xg-HQ
	for submit <at> debbugs.gnu.org; Sun, 24 May 2026 04:40:41 -0400
Received: from mail-dl1-x122d.google.com ([2607:f8b0:4864:20::122d]:56528)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <casouri@HIDDEN>) id 1wR4Nx-0002XX-82
 for 81019 <at> debbugs.gnu.org; Sun, 24 May 2026 04:40:38 -0400
Received: by mail-dl1-x122d.google.com with SMTP id
 a92af1059eb24-13663f68983so2504018c88.0
 for <81019 <at> debbugs.gnu.org>; Sun, 24 May 2026 01:40:37 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1779612036; x=1780216836; darn=debbugs.gnu.org;
 h=to:references:message-id:content-transfer-encoding:cc:date
 :in-reply-to:from:subject:mime-version:from:to:cc:subject:date
 :message-id:reply-to;
 bh=lF0gT1n1BUEiFJsBCqw526mvC2/6oyupCgoZlHBUmEU=;
 b=R+d2VLtM+F8JZZmkhfihgm4bX5JFhirdmJEiwIfReZBzGTpHjR8hY0siRBrD/lf1v5
 sy9Prfuc+Vgyg/0bomSt3GctUCSZHtOwiE7JpDIzMFoeCLNM49WOIvSq+cdLfxTYozfr
 oKJ8URvHTxIrraJ82AVQp59K4b3kviN90G9fied6OpUNYH4UopIRo7brgYKfasgBe2Le
 baBFRTErN8pWhMx7fTTO9ukAbH1oezoR4BPunXFOFBFILRB2z/ix7eFYxSWXOp7hWhS2
 SnSzPF5R+LIVdcrsAWeNGxJxNcPYODCQqXxUCoiBKHBoHB4WdQVOLLpW3/fWDIK5bZo4
 fH/Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1779612036; x=1780216836;
 h=to:references:message-id:content-transfer-encoding:cc:date
 :in-reply-to:from:subject:mime-version:x-gm-gg:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=lF0gT1n1BUEiFJsBCqw526mvC2/6oyupCgoZlHBUmEU=;
 b=T69EBKIZZdx1n7jJ/D+HjWQP+L34rdVbZHWy4CFTIgWRrVKQMz0OezsBc8X8mkaUGs
 vPtiClnBTLxsWIWlqv6v5eCy+tJBUuAk8kQhsn5q1s+PqWfIdbaiEJGd1dg+5tVnltMy
 3mynTOPq3Bc13EPOszWraSlb0pTTGbcr2dIcp1tieuiW3YTMm/RqfitC62asmSANtIRJ
 QxH9JYpDUWLmhzQguMiIqmwIB6Z6RDJSjCcVK1nWafacjEj7vyq3RctCKFfNTRNHvcpe
 wnAel+2DkAU8n+v912tzi6YD3D2SID/Kp5mUXH+7Za35NHwgGHt6tvBI6uSCwZauPUsd
 0+/g==
X-Forwarded-Encrypted: i=1;
 AFNElJ/pwQfTVKnyHlbVTWxemP2X/MNolZs3hR2r+usSwJeahmbeUhgYKw0ZpbxljKGwaetCQ8PHlQ==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YwSKyi1iMpX1y+djRybN4BbBxdGfnvH0A0uACnqNEsWpaAmvdUT
 D8vczbkAWiujp0GI6Yu46RSySSUiEzaJKIng2CVsh3vg/7IRudjgNZn9
X-Gm-Gg: Acq92OFAoe5pbIb8YVWpk2x6kAmBHBZbxstKVncy89TOpcCMiuS4e73h1NOYvfOnCkI
 tSfia7Thy9OaInZXms1A9kL9VSa6jdqAFLIxmAyCjENwlbeLyjnTajEatCdxtleuobQBkSxMO5R
 raWuvUIdAE8Y556hOazqlokb1yECectaA6zdhK7Pk8l1tl57JqmQP1NunRrhoMrWRlIxawDsnkS
 FkKwOsE1wUYOqL/y0Hu0q7KglfxkocKQrjDCmRQm/N8Cb8KIZaGvSKT527wAVInzPt+yPOYa2vE
 vUy4qyoyIHDd0b8v5J65Ca6m9Ca4uliFGx2x6tKR5ZKKKW2i4uuEprOudgU/rnj6oqNW7vb9JFq
 26qzz0ElInnWGUMmAhFoXt5sp/d9AOhOzrX6vmkgyvj/6GYNpFXaG7w+lCQsgZ5sfIkIMrhJ7qv
 l4fh8qhXj3V4Vx1TCHAuJoJWxRVHLFLOKV5Nvk7hvU7SSY6g==
X-Received: by 2002:a05:7300:6d07:b0:2ed:e14:7f57 with SMTP id
 5a478bee46e88-30449126b25mr5033068eec.33.1779612035392; 
 Sun, 24 May 2026 01:40:35 -0700 (PDT)
Received: from smtpclient.apple ([2601:645:c686:b320:34b5:5eba:c339:b60c])
 by smtp.gmail.com with ESMTPSA id
 5a478bee46e88-30451ef5492sm5052442eec.6.2026.05.24.01.40.34
 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
 Sun, 24 May 2026 01:40:34 -0700 (PDT)
Content-Type: text/plain;
	charset=utf-8
Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81\))
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
From: Yuan Fu <casouri@HIDDEN>
In-Reply-To: <CAN+1Hbo=Y4TRJohfgm3puQOJjOdehSN+30-F__fwgRARtWkMBQ@HIDDEN>
Date: Sun, 24 May 2026 01:40:23 -0700
Content-Transfer-Encoding: quoted-printable
Message-Id: <95156828-ABD4-4C83-B23A-082E71FE098F@HIDDEN>
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN> <m2mry3cgqa.fsf@HIDDEN>
 <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
 <1801F912-77A8-4106-8F74-4A7F4F95B7A3@HIDDEN>
 <CACah_w2AvKug824TMKeibrrqiJmyYxS_EfZAyT0BNZZ9tNkBhQ@HIDDEN>
 <CAN+1Hbo=Y4TRJohfgm3puQOJjOdehSN+30-F__fwgRARtWkMBQ@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
X-Mailer: Apple Mail (2.3826.700.81)
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: Rahul Juliato <rahuljuliato@HIDDEN>, 81019 <at> debbugs.gnu.org,
 Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)



> On May 22, 2026, at 5:28=E2=80=AFAM, St=C3=A9phane Marks =
<shipmints@HIDDEN> wrote:
>=20
> On Fri, May 15, 2026 at 9:06=E2=80=AFAM Rahul Juliato =
<rahuljuliato@HIDDEN> wrote:
> Hi Yuan!
>=20
> I tested your docker file and made a small video of it happening and =
how I trigger it: https://youtu.be/rJ7hvuinuRI
>=20
> Maybe there's something special I'm doing while navigating the buffer?
>=20
> As my system is set to Brazilian Portuguese, I use dead-keys, meaning =
` must be followed by C-f or C-b or space.
> I think this is not important for the bug as I said before I could =
insert the char with M-: and trigger the bug too.
>=20
> If anybody else would like to try the Dockerfile file, I ran with:
>=20
>      $ podman build -t emacs-ts .
>      $ podman run -it --rm emacs-ts
>=20
> `podman` can be replaced by `docker`.
>=20
>=20
> Em sex., 15 de mai. de 2026 =C3=A0s 04:40, Yuan Fu <casouri@HIDDEN> =
escreveu:
>=20
>=20
> > On May 14, 2026, at 1:29=E2=80=AFPM, St=C3=A9phane Marks =
<shipmints@HIDDEN> wrote:
> >=20
> > On Wed, May 13, 2026 at 14:22 Rahul Martim Juliato =
<rahuljuliato@HIDDEN> wrote:
> > Yuan Fu <casouri@HIDDEN> writes:
> >=20
> > >> On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato =
<rahuljuliato@HIDDEN> wrote:
> > >>=20
> > >> Hello,
> > >>=20
> > >> While debugging an "it doesn't fontify" report against =
markdown-ts-mode,
> > >> I ended up in treesit.el territory and would like a second =
opinion
> > >> before assuming I've correctly identified the layer the fix =
belongs in.
> > >>=20
> > >> The bug shows up easily in markdown-ts-mode but I suspect it can =
hit any
> > >> major mode that drives local parsers via `treesit-range-rules' =
with
> > >> `:local t'. markdown-ts just exercises that path very heavily =
(one local
> > >> `markdown-inline' parser per paragraph), so we are likely seeing
> > >> spoilers ahead of the html and other multi-parser modes.
> > >>=20
> > >>=20
> > >> How to Reproduce:
> > >> -----------------
> > >>=20
> > >> 1. emacs -Q on current master.
> > >> 2. M-x markdown-ts-mode.
> > >> 3. Insert a backtick code span on its own line, for example:
> > >>=20
> > >>       `foo`
> > >>=20
> > >>       `codium  `
> > >>=20
> > >>   typing the second line character by character and stopping =
right
> > >>   after the closing backtick. Do not press RET afterwards.
> > >>=20
> > >> 4. The first code span is fontified. The second is not.
> > >>=20
> > >> 5. Press RET. The second code span now fontifies correctly.
> > >>=20
> > >> `(font-lock-flush)' + `(font-lock-ensure)' do not fix it. Calling
> > >> `(treesit-parser-set-included-ranges PR same-ranges)' does not =
fix
> > >> it either. The only thing that fixes it without typing further is
> > >> deleting and recreating the local markdown-inline parser that =
covers
> > >> the range.
> > >>=20
> > >>=20
> > >> What is happening
> > >> -----------------
> > >>=20
> > >> The host markdown parser reparses fine and reports the new inline
> > >> node bounds. The local markdown-inline parser at that range,
> > >> however, keeps an outdated tree. I confirmed this directly in the
> > >> bugged buffer:
> > >>=20
> > >>  (buffer-substring 8 18) =3D> "`codium  `"
> > >>=20
> > >>  ;; existing local parser covering (8 . 18)
> > >>  (treesit-node-string (treesit-parser-root-node pr))
> > >>    =3D> "(inline)"
> > >>=20
> > >>  ;; force re-set ranges to the same value
> > >>  (treesit-parser-set-included-ranges pr '((8 . 18)))
> > >>  (treesit-node-string (treesit-parser-root-node pr))
> > >>    =3D> "(inline)"
> > >>=20
> > >>  ;; fresh parser, same buffer, same range
> > >>  (let ((new (treesit-parser-create 'markdown-inline nil t =
'embedded)))
> > >>    (treesit-parser-set-included-ranges new '((8 . 18)))
> > >>    (treesit-node-string (treesit-parser-root-node new)))
> > >>    =3D> "(inline (code_span (code_span_delimiter)
> > >>                            (code_span_delimiter)))"
> > >>=20
> > >> So, same buffer, same range, same grammar, resulting in different =
tree
> > >> depending on whether the parser was reused across edits or =
created
> > >> fresh.
> > >>=20
> > >> So the grammar, the input, and the range are all fine. What is
> > >> wrong is the parser's accumulated incremental state.
> > >>=20
> > >> Reading `treesit--update-ranges-local', the reuse path goes =
through:
> > >>=20
> > >>  (treesit--set-embed-ranges range embedded-parser host-parser)
> > >>  (move-overlay ov r-start r-end)
> > >>  (overlay-put ov 'treesit-parser-ov-timestamp modified-tick)
> > >>=20
> > >> Tree-sitter is left to apply the buffered edits on top of its old
> > >> tree. For markdown-inline plus the backtick code_span rule, that
> > >> incremental update never re-fires the rule when the closing =
backtick
> > >> finally arrives, so the parser stays with `(inline)' empty.
> > >>=20
> > >> Pressing RET escapes the bug. I am not certain why, two =
candidates:
> > >> the newline grows the host paragraph past the overlay bounds and
> > >> `treesit--cleanup-local-range-overlays' deletes the old overlay =
on
> > >> the timestamp mismatch, after which a fresh parser is created; or
> > >> the larger range shift is enough to make tree-sitter invalidate =
the
> > >> right subtree and re-evaluate code_span. Either way the practical
> > >> outcome is the same: only a fresh parser fixes it.
> > >>=20
> > >>=20
> > >> My workaround on markdown-ts-mode (for debugging)=20
> > >> -------------------------------------------------
> > >>=20
> > >> I made this small interactive helper to help me find the local =
parser
> > >> covering point which would them delete its parser + overlay, and =
create
> > >> a fresh one on the same range:
> > >>=20
> > >>  (defun my/md-recreate-inline-parser-at-point ()
> > >>    "Delete stale local markdown-inline parser+overlay covering =
point, recreate."
> > >>    (interactive)
> > >>    (let* ((p (point))
> > >>           (target-ov
> > >>            (catch 'f
> > >>              (dolist (ov (overlays-in (point-min) (point-max)))
> > >>                (let ((pr (overlay-get ov 'treesit-parser)))
> > >>                  (when (and pr
> > >>                             (overlay-get ov =
'treesit-parser-local-p)
> > >>                             (eq (treesit-parser-language pr) =
'markdown-inline)
> > >>                             (<=3D (overlay-start ov) p =
(overlay-end ov)))
> > >>                    (throw 'f ov)))))))
> > >>      (unless target-ov (user-error "No markdown-inline overlay =
covers point"))
> > >>      (let* ((old-pr (overlay-get target-ov 'treesit-parser))
> > >>             (host (overlay-get target-ov 'treesit-host-parser))
> > >>             (level (treesit-parser-embed-level old-pr))
> > >>             (r-start (overlay-start target-ov))
> > >>             (r-end (overlay-end target-ov)))
> > >>        (treesit-parser-delete old-pr)
> > >>        (delete-overlay target-ov)
> > >>        (let ((new (treesit-parser-create 'markdown-inline nil t =
'embedded))
> > >>              (ov (make-overlay r-start r-end nil nil t)))
> > >>          (treesit-parser-set-embed-level new level)
> > >>          (overlay-put ov 'treesit-parser new)
> > >>          (overlay-put ov 'treesit-parser-local-p t)
> > >>          (overlay-put ov 'treesit-host-parser host)
> > >>          (overlay-put ov 'treesit-parser-ov-timestamp =
(buffer-chars-modified-tick))
> > >>          (treesit-parser-set-included-ranges new `((,r-start . =
,r-end)))
> > >>          (font-lock-flush r-start r-end)
> > >>          (message "Recreated markdown-inline parser for (%d . =
%d)" r-start r-end)))))
> > >>=20
> > >> This always recovers the buffer's fontification immediately.
> > >>=20
> > >>=20
> > >> A possible treesit.el patch
> > >> ---------------------------
> > >>=20
> > >> The change I have been testing locally is small: in
> > >> `treesit--update-ranges-local', only reuse an existing =
local-parser
> > >> overlay when its bounds already match the new range exactly. If =
the
> > >> overlay would have to move, do not reuse it. Let
> > >> `treesit--cleanup-local-range-overlays' delete it on the =
timestamp
> > >> mismatch and the existing "create new" branch will produce a =
fresh
> > >> parser on the right range.
> > >>=20
> > >>     lisp/treesit.el | 11 +++++++++--
> > >>     1 file changed, 9 insertions(+), 2 deletions(-)
> > >>=20
> > >>    diff --git a/lisp/treesit.el b/lisp/treesit.el
> > >>    index 01e82b56bb8..d80e4fe312d 100644
> > >>    --- a/lisp/treesit.el
> > >>    +++ b/lisp/treesit.el
> > >>    @@ -1248,10 +1248,17 @@ treesit--update-ranges-local
> > >>                                                      =
embedded-parser)))
> > >>                             (when (and (overlay-get ov =
'treesit-parser-local-p)
> > >>                                        (eq parser-lang =
embedded-lang)
> > >>    -                                   (eq embed-level =
parser-level))
> > >>    +                                   (eq embed-level =
parser-level)
> > >>    +                                   ;; Only reuse if overlay =
bounds match
> > >>    +                                   ;; the new range exactly.  =
Reusing
> > >>    +                                   ;; across range moves can =
leave the
> > >>    +                                   ;; embedded parser with a =
stale
> > >>    +                                   ;; incremental tree (bug =
seen with
> > >>    +                                   ;; markdown-inline =
code_span).
> > >>    +                                   (=3D (overlay-start ov) =
r-start)
> > >>    +                                   (=3D (overlay-end ov) =
r-end))
> > >>                               (treesit--set-embed-ranges
> > >>                                range embedded-parser host-parser)
> > >>    -                          (move-overlay ov r-start r-end)
> > >>                               (overlay-put ov =
'treesit-parser-ov-timestamp
> > >>                                            modified-tick)
> > >>                               (throw 'done embedded-parser)))))))
> > >>=20
> > >>=20
> > >> With this in place the markdown-ts reproduction fontifies as you =
type,
> > >> no RET needed, no recreate helper needed.
> > >>=20
> > >> I am very aware this is potentially a sledgehammer. It forces a =
fresh
> > >> local parser on every range change, throwing away tree-sitter's
> > >> incremental work for that subtree. For modes that just rely on =
local
> > >> parsers for fontification it should be fine, but it may not be =
the right
> > >> answer if the rest of treesit depends on parser identity =
surviving
> > >> across range moves.
> > >>=20
> > >>=20
> > >> Where I am not sure
> > >> -------------------
> > >>=20
> > >> 1. Is this the right layer to address? My patch is in
> > >>   `treesit--update-ranges-local'. It feels like the deeper truth =
could
> > >>   live in `treesit.c''s edit replay when ranges shift, where
> > >>   `need_reparse' for a local parser does not get set even though =
its
> > >>   tree is stale. The C code is quiet on local parser treatment, =
so it
> > >>   is hard to tell from outside whether primary-parser reparse
> > >>   notifications are supposed to propagate to local parsers in =
this
> > >>   case.
> > >>=20
> > >> 2. Is there a one-liner I am missing on the elisp side? For =
example a
> > >>   call I should be making after =
`treesit-parser-set-included-ranges' to
> > >>   force the parser to throw away its cached tree.
> > >>=20
> > >> 3. Or is the right fix on the grammar side, in =
tree-sitter-markdown's
> > >>   incremental behaviour around backtick spans, in which case =
treesit
> > >>   should probably still gain a way to recover.
> > >>=20
> > >> 4. As mentioned at the top, I believe any `:local t' range rule =
could
> > >>   reach this state. markdown-ts is the first heavy customer, but =
the
> > >>   html-embedded modes look structurally similar enough that they =
would
> > >>   hit it too, just less often.
> > >>=20
> > >> If the analysis is correct but the proposed fix is not, I would =
be happy
> > >> to revise the diff. If the analysis itself is wrong, I would also =
very
> > >> much appreciate corrections so we can avoid carrying the helper =
above.
> > >>=20
> > >> I am mostly interested in validating the analysis here. I am not
> > >> attached to this particular fix, and would be perfectly happy if =
a
> > >> different implementation lands instead.
> > >>=20
> > >> Thanks for reading,
> > >
> > > Thanks for the investigation. Before knowing more I can=E2=80=99t =
tell if this should be fixed at the treesit.el level or treesit.c level. =
But I=E2=80=99m still at the stage of trying to reproduce it. So the =
reproduce step is:
> > >
> > > 1. Type `code` RET
> > > 2. Type `code`
> > >
> > > And at this point the second `code` should be unfortified? Even =
with
> > > latest master and tree-sitter, I can=E2=80=99t reproduce it. And =
if I get
> > > latest markdown without my patch, opening a markdown file just =
crashes
> > > Emacs. I=E2=80=99ll try to get my patch merged upstream.
> > >
> > > Yuan
> >=20
> >=20
> > Hi there Yuan!
> >=20
> > Thanks for helping!
> >=20
> > I'm on master, stopped on:
> >=20
> > *  (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 ; *
> >    lisp/treesit.el (treesit--update-ranges-local): Fix let-binding.
> >=20
> >=20
> > To reproduce:
> >=20
> > ```markdown
> >=20
> > `foo`
> >=20
> > `bar    `       (you can add spaces here too, only RET refontifies)
> >=20
> >=20
> > ```
> >=20
> > One detail, we are inserting ` manually so, no `` and then filling =
in
> > (in this case the bug won't trigger). Also, if you copy/paste and =
then
> > edit it, the bug won't trigger, only on "manual typing".
> >=20
> > I tested using M-: (insert-char ?`) RET and this *does* trigger the =
bug.
> >=20
> >=20
> > Please find the updated markdown-ts-mode.el and =
markdown-ts-mode-x.el
> > attached.
> >=20
> >=20
> > These files contain all the latest bug fixes we are trying to push =
to
> > the Emacs 31 branch (disscussion with Jo=C3=A3o from Eglot helping =
on get
> > everything installed is happening on #bug81023
> > https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D81023).
> >=20
> >=20
> > Maybe it is easier to navigate diffs / read docs (if you need) / =
check
> > what patches are pending in my mirror branch:
> > =
https://github.com/LionyxML/emacs-mirror/commits/feat/markdown-ts-mode/.
> >=20
> >=20
> > Let me know if we can help you with anything else.=20
> >=20
> > Yuan, this seems to also be manifesting as phantoms in fenced code =
blocks where our identifying overlays are accumulating multiple =
overlays.=20
>=20
> Sorry guys, I don=E2=80=99t know what I=E2=80=99m smoking, but I =
can=E2=80=99t repro this. In a desperate attempt, I had Claude write =
this Dockerfile that pulls Rahul=E2=80=99s mirror, tree-sitter, my =
patched tree-sitter markdown, and builds a fresh emacs build. Still no =
repro.
>=20
> Yuan, were you able to repro the issue?  Baking in Rahul's "hack" =
function into `markdown-ts-mode` seems like the wrong thing to do as =
this might crop up for other treesit users.

Sorry, I tried a couple gestures and incantations but couldn=E2=80=99t =
repro it and got distracted by other tasks. I=E2=80=99ll give it another =
try. In the meantime, any thoughts and guesses? I can=E2=80=99t think of =
what else could be different in our environment that can cause the =
difference.

Yuan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 22 May 2026 12:28:24 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 22 08:28:24 2026
Received: from localhost ([127.0.0.1]:54949 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wQOzF-00021f-Q9
	for submit <at> debbugs.gnu.org; Fri, 22 May 2026 08:28:24 -0400
Received: from mail-ua1-x92c.google.com ([2607:f8b0:4864:20::92c]:47482)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1wQOz6-00020O-Pr
 for 81019 <at> debbugs.gnu.org; Fri, 22 May 2026 08:28:19 -0400
Received: by mail-ua1-x92c.google.com with SMTP id
 a1e0cc1a2514c-95cd9bc6398so4880694241.3
 for <81019 <at> debbugs.gnu.org>; Fri, 22 May 2026 05:28:12 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1779452892; cv=none;
 d=google.com; s=arc-20240605;
 b=PjmLhcPaMTv+U4h5ewGYBaDE76xMNQcr7MeYk/7E0YWLeiJbXAAluiyKLZcdvkydhe
 oElmDEg2LRtrJpSBCpmRoejQFVtTxsofqEJEphovKn8bBM1it8qJeC24kXyMxnniHXxH
 Y4sIRJAVYgBqH1umTQiA3l780KohMmsN2PUy+bKVV1BBCVJ7xXl45GGCeLFYRdOPQo0z
 q0eQKiLGRta0NGU4MvX9aGp4Ca1CuvlKZ50QKExHLSNyq7Ao6z1Ox8rgNlTM4dyZAE+R
 g8EvFvi2tbOXs6kz4YLczV4XdQmJou7HhazDupOzeMgqKbTlzynT7brXJp7SGxQOZi3y
 leVw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;
 s=arc-20240605; 
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:dkim-signature;
 bh=SEivpkGrZ2tM2tf7CspTQhixIL4WhFObQd9+8ctSHnI=;
 fh=ZIatquQU+nVyTb/OxlwABd30TFi7pY9jk5E3o2NUtFk=;
 b=XuA8scP+JHwM5EikXL/VTyTzGfabY/4rxc9G3LNhxjliflzraGsEKohVLWaqQ6p5iR
 NrghRkZgJS0mnMTXy8rTY93tHTa0H268iYxM4/caVEH26ZZx6ytPYdX+2dzXd+2derbo
 0IQEAt9wkgxDRchWNyr6H92xQkmYsrU6B0f5EVgJC+FVT4S9q+YCnu70T8NKZY88Ybx/
 Q/pYNVVxu8ywLXyTIFvjAwIk5bXvjfINqyJtv0vbRi86/8RHzD0MnkPyj18YKXBg3mid
 G8dV/6ncMWIy4+vaeWRYoVw6c5Gjd/blntiuF+XbZMGLzbK/p7wLXexQw/4bow5/Y0SU
 BUcQ==; darn=debbugs.gnu.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1779452892; x=1780057692; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=SEivpkGrZ2tM2tf7CspTQhixIL4WhFObQd9+8ctSHnI=;
 b=ifmk+NL3X72pHkn3Aey7gtGMSNNp0bExGbnJgTIHzHeTolV2fp4sBTz1IIrDNNbeRg
 5uxogHfMKm2g9yeA+af6XpkDR7Z/nAWQY1kpxxD8c09DOy4BlZ6Yr5438DeSAHdOhH/t
 bw8Jy8mJDPyllMDKNiGaWOzeeoQh8FBvt0EDqgh5kpvXVtpK/rw8Wk9isVraZ4Z1abOx
 22Vpn/Rrxv8BACl7i8aZmNIbGNZe5tpRifo5zeALWPwV0/HZgmhjDAr/rvbUALMKokAR
 EU5q/gchi6KUfCZnTMooIxuenBq4Da206qjX735p8zahv4PTcqyYlpxqkZv0j+xkp8l9
 b8SQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1779452892; x=1780057692;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=SEivpkGrZ2tM2tf7CspTQhixIL4WhFObQd9+8ctSHnI=;
 b=g84jRjWzs+mMCLxfNnDbTrQXTE6dBRIO6PrxcTgZDnXfJTXrq1q5je0JQbTvuGr/L3
 iGBB5J1VuXWh8F0udjb9v3B+YIWbzqq72gGvE99YFnDe6lkYFXTi8OlsrraaDc7RFacv
 Vn8X8LU0YlfzIljBa3Q52VmI8EjOwPN8QkCKWaGts17WmV1IM7ANCw/A8Pt8g/d4njMi
 119h4OM4dV5laR1WO4jLs7FFZBk46NjtFyhmamF95zeWXpn1gLDdX8u4SQcqTt0ghnxv
 LJ7BTQZpTixRJKErgtRhx7EDhGn+/IP+4hzB0kPga9cNfwyNhDsKaLm5RLW2xnO6dJNb
 1Syg==
X-Forwarded-Encrypted: i=1;
 AFNElJ96kb5EMVqUcOQlVKNJgzLOsYXnOzxx68ewcDXO/8X+aE/UUTq4ckccNfpJqDhrz3Wes8+ejg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yy9uxCVTRfA7FMoW8yO5h6GUpWfD6ROsCnBQc2epPOTDtyNTJ7A
 G4gB4FXpNPDUqP08t2SdmBIDhh8PaLgCYKj3dehMx9yrUc9fyvz74jJ8ev0epolTlGEuomLeLPP
 OOcenvM+mitcYZLnEJD6c/V653b9ZmUk=
X-Gm-Gg: Acq92OEBSH8SDY46qyOWQArUt1uwlLP2v70uharrvpfpVRfJ1KaqDIWHTN7lxu7caT1
 2S2h9SdIM/zEYD45+4+iBgt/+Iy1WPJc3EwhebozC0xvXPpjvAcYU1kG0+kuh+C1hvpZ5XlVD3O
 sGxYj2TFsA4J1dzCq8XDgKPnBN5hAUwz3pgIBs3Q43o/XCTTD3SnNmnqCXOPrD0airgSF2m/El2
 lQle1c+CPb7AmfELFhQWeyE7iaW0FE9qwawanjlGKuePNjwfVfqTbe1ZQhMk7kNqY7t1tYSMfHI
 cJzB9YP5FWfnk1DetBullI9IhQJ7aDbhHYiPv/yI0uDwrLUBkCzuHnyHy79U3wBHazJtbZuiRhd
 eNQJ0yAK7VPC4iFUeliWio/6tssYBTJ8WK+V0w5Hd44Py1KYt
X-Received: by 2002:a05:6102:5709:b0:62f:2d6f:cc11 with SMTP id
 ada2fe7eead31-67c6f740a37mr1583462137.2.1779452891688; Fri, 22 May 2026
 05:28:11 -0700 (PDT)
MIME-Version: 1.0
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
 <m2mry3cgqa.fsf@HIDDEN>
 <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
 <1801F912-77A8-4106-8F74-4A7F4F95B7A3@HIDDEN>
 <CACah_w2AvKug824TMKeibrrqiJmyYxS_EfZAyT0BNZZ9tNkBhQ@HIDDEN>
In-Reply-To: <CACah_w2AvKug824TMKeibrrqiJmyYxS_EfZAyT0BNZZ9tNkBhQ@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Fri, 22 May 2026 08:28:00 -0400
X-Gm-Features: AVHnY4KJKhGxxzxwyyn713HvbD3GcNI47cfRLrY5iinVuSRNMUsZdfbpJv_NbHo
Message-ID: <CAN+1Hbo=Y4TRJohfgm3puQOJjOdehSN+30-F__fwgRARtWkMBQ@HIDDEN>
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
To: Rahul Juliato <rahuljuliato@HIDDEN>
Content-Type: multipart/alternative; boundary="00000000000080f2370652672913"
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: Yuan Fu <casouri@HIDDEN>, 81019 <at> debbugs.gnu.org,
 Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)

--00000000000080f2370652672913
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, May 15, 2026 at 9:06=E2=80=AFAM Rahul Juliato <rahuljuliato@HIDDEN=
om>
wrote:

> Hi Yuan!
>
> I tested your docker file and made a small video of it happening and how =
I
> trigger it: https://youtu.be/rJ7hvuinuRI
>
> Maybe there's something special I'm doing while navigating the buffer?
>
> As my system is set to Brazilian Portuguese, I use dead-keys, meaning `
> must be followed by C-f or C-b or space.
> I think this is not important for the bug as I said before I could insert
> the char with M-: and trigger the bug too.
>
> If anybody else would like to try the Dockerfile file, I ran with:
>
>      $ podman build -t emacs-ts .
>      $ podman run -it --rm emacs-ts
>
> `podman` can be replaced by `docker`.
>
>
> Em sex., 15 de mai. de 2026 =C3=A0s 04:40, Yuan Fu <casouri@HIDDEN>
> escreveu:
>
>>
>>
>> > On May 14, 2026, at 1:29=E2=80=AFPM, St=C3=A9phane Marks <shipmints@gm=
ail.com>
>> wrote:
>> >
>> > On Wed, May 13, 2026 at 14:22 Rahul Martim Juliato <
>> rahuljuliato@HIDDEN> wrote:
>> > Yuan Fu <casouri@HIDDEN> writes:
>> >
>> > >> On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato <
>> rahuljuliato@HIDDEN> wrote:
>> > >>
>> > >> Hello,
>> > >>
>> > >> While debugging an "it doesn't fontify" report against
>> markdown-ts-mode,
>> > >> I ended up in treesit.el territory and would like a second opinion
>> > >> before assuming I've correctly identified the layer the fix belongs
>> in.
>> > >>
>> > >> The bug shows up easily in markdown-ts-mode but I suspect it can hi=
t
>> any
>> > >> major mode that drives local parsers via `treesit-range-rules' with
>> > >> `:local t'. markdown-ts just exercises that path very heavily (one
>> local
>> > >> `markdown-inline' parser per paragraph), so we are likely seeing
>> > >> spoilers ahead of the html and other multi-parser modes.
>> > >>
>> > >>
>> > >> How to Reproduce:
>> > >> -----------------
>> > >>
>> > >> 1. emacs -Q on current master.
>> > >> 2. M-x markdown-ts-mode.
>> > >> 3. Insert a backtick code span on its own line, for example:
>> > >>
>> > >>       `foo`
>> > >>
>> > >>       `codium  `
>> > >>
>> > >>   typing the second line character by character and stopping right
>> > >>   after the closing backtick. Do not press RET afterwards.
>> > >>
>> > >> 4. The first code span is fontified. The second is not.
>> > >>
>> > >> 5. Press RET. The second code span now fontifies correctly.
>> > >>
>> > >> `(font-lock-flush)' + `(font-lock-ensure)' do not fix it. Calling
>> > >> `(treesit-parser-set-included-ranges PR same-ranges)' does not fix
>> > >> it either. The only thing that fixes it without typing further is
>> > >> deleting and recreating the local markdown-inline parser that cover=
s
>> > >> the range.
>> > >>
>> > >>
>> > >> What is happening
>> > >> -----------------
>> > >>
>> > >> The host markdown parser reparses fine and reports the new inline
>> > >> node bounds. The local markdown-inline parser at that range,
>> > >> however, keeps an outdated tree. I confirmed this directly in the
>> > >> bugged buffer:
>> > >>
>> > >>  (buffer-substring 8 18) =3D> "`codium  `"
>> > >>
>> > >>  ;; existing local parser covering (8 . 18)
>> > >>  (treesit-node-string (treesit-parser-root-node pr))
>> > >>    =3D> "(inline)"
>> > >>
>> > >>  ;; force re-set ranges to the same value
>> > >>  (treesit-parser-set-included-ranges pr '((8 . 18)))
>> > >>  (treesit-node-string (treesit-parser-root-node pr))
>> > >>    =3D> "(inline)"
>> > >>
>> > >>  ;; fresh parser, same buffer, same range
>> > >>  (let ((new (treesit-parser-create 'markdown-inline nil t
>> 'embedded)))
>> > >>    (treesit-parser-set-included-ranges new '((8 . 18)))
>> > >>    (treesit-node-string (treesit-parser-root-node new)))
>> > >>    =3D> "(inline (code_span (code_span_delimiter)
>> > >>                            (code_span_delimiter)))"
>> > >>
>> > >> So, same buffer, same range, same grammar, resulting in different
>> tree
>> > >> depending on whether the parser was reused across edits or created
>> > >> fresh.
>> > >>
>> > >> So the grammar, the input, and the range are all fine. What is
>> > >> wrong is the parser's accumulated incremental state.
>> > >>
>> > >> Reading `treesit--update-ranges-local', the reuse path goes through=
:
>> > >>
>> > >>  (treesit--set-embed-ranges range embedded-parser host-parser)
>> > >>  (move-overlay ov r-start r-end)
>> > >>  (overlay-put ov 'treesit-parser-ov-timestamp modified-tick)
>> > >>
>> > >> Tree-sitter is left to apply the buffered edits on top of its old
>> > >> tree. For markdown-inline plus the backtick code_span rule, that
>> > >> incremental update never re-fires the rule when the closing backtic=
k
>> > >> finally arrives, so the parser stays with `(inline)' empty.
>> > >>
>> > >> Pressing RET escapes the bug. I am not certain why, two candidates:
>> > >> the newline grows the host paragraph past the overlay bounds and
>> > >> `treesit--cleanup-local-range-overlays' deletes the old overlay on
>> > >> the timestamp mismatch, after which a fresh parser is created; or
>> > >> the larger range shift is enough to make tree-sitter invalidate the
>> > >> right subtree and re-evaluate code_span. Either way the practical
>> > >> outcome is the same: only a fresh parser fixes it.
>> > >>
>> > >>
>> > >> My workaround on markdown-ts-mode (for debugging)
>> > >> -------------------------------------------------
>> > >>
>> > >> I made this small interactive helper to help me find the local pars=
er
>> > >> covering point which would them delete its parser + overlay, and
>> create
>> > >> a fresh one on the same range:
>> > >>
>> > >>  (defun my/md-recreate-inline-parser-at-point ()
>> > >>    "Delete stale local markdown-inline parser+overlay covering
>> point, recreate."
>> > >>    (interactive)
>> > >>    (let* ((p (point))
>> > >>           (target-ov
>> > >>            (catch 'f
>> > >>              (dolist (ov (overlays-in (point-min) (point-max)))
>> > >>                (let ((pr (overlay-get ov 'treesit-parser)))
>> > >>                  (when (and pr
>> > >>                             (overlay-get ov 'treesit-parser-local-p=
)
>> > >>                             (eq (treesit-parser-language pr)
>> 'markdown-inline)
>> > >>                             (<=3D (overlay-start ov) p (overlay-end
>> ov)))
>> > >>                    (throw 'f ov)))))))
>> > >>      (unless target-ov (user-error "No markdown-inline overlay
>> covers point"))
>> > >>      (let* ((old-pr (overlay-get target-ov 'treesit-parser))
>> > >>             (host (overlay-get target-ov 'treesit-host-parser))
>> > >>             (level (treesit-parser-embed-level old-pr))
>> > >>             (r-start (overlay-start target-ov))
>> > >>             (r-end (overlay-end target-ov)))
>> > >>        (treesit-parser-delete old-pr)
>> > >>        (delete-overlay target-ov)
>> > >>        (let ((new (treesit-parser-create 'markdown-inline nil t
>> 'embedded))
>> > >>              (ov (make-overlay r-start r-end nil nil t)))
>> > >>          (treesit-parser-set-embed-level new level)
>> > >>          (overlay-put ov 'treesit-parser new)
>> > >>          (overlay-put ov 'treesit-parser-local-p t)
>> > >>          (overlay-put ov 'treesit-host-parser host)
>> > >>          (overlay-put ov 'treesit-parser-ov-timestamp
>> (buffer-chars-modified-tick))
>> > >>          (treesit-parser-set-included-ranges new `((,r-start .
>> ,r-end)))
>> > >>          (font-lock-flush r-start r-end)
>> > >>          (message "Recreated markdown-inline parser for (%d . %d)"
>> r-start r-end)))))
>> > >>
>> > >> This always recovers the buffer's fontification immediately.
>> > >>
>> > >>
>> > >> A possible treesit.el patch
>> > >> ---------------------------
>> > >>
>> > >> The change I have been testing locally is small: in
>> > >> `treesit--update-ranges-local', only reuse an existing local-parser
>> > >> overlay when its bounds already match the new range exactly. If the
>> > >> overlay would have to move, do not reuse it. Let
>> > >> `treesit--cleanup-local-range-overlays' delete it on the timestamp
>> > >> mismatch and the existing "create new" branch will produce a fresh
>> > >> parser on the right range.
>> > >>
>> > >>     lisp/treesit.el | 11 +++++++++--
>> > >>     1 file changed, 9 insertions(+), 2 deletions(-)
>> > >>
>> > >>    diff --git a/lisp/treesit.el b/lisp/treesit.el
>> > >>    index 01e82b56bb8..d80e4fe312d 100644
>> > >>    --- a/lisp/treesit.el
>> > >>    +++ b/lisp/treesit.el
>> > >>    @@ -1248,10 +1248,17 @@ treesit--update-ranges-local
>> > >>
>> embedded-parser)))
>> > >>                             (when (and (overlay-get ov
>> 'treesit-parser-local-p)
>> > >>                                        (eq parser-lang embedded-lan=
g)
>> > >>    -                                   (eq embed-level parser-level=
))
>> > >>    +                                   (eq embed-level parser-level=
)
>> > >>    +                                   ;; Only reuse if overlay
>> bounds match
>> > >>    +                                   ;; the new range exactly.
>> Reusing
>> > >>    +                                   ;; across range moves can
>> leave the
>> > >>    +                                   ;; embedded parser with a
>> stale
>> > >>    +                                   ;; incremental tree (bug see=
n
>> with
>> > >>    +                                   ;; markdown-inline code_span=
).
>> > >>    +                                   (=3D (overlay-start ov) r-st=
art)
>> > >>    +                                   (=3D (overlay-end ov) r-end)=
)
>> > >>                               (treesit--set-embed-ranges
>> > >>                                range embedded-parser host-parser)
>> > >>    -                          (move-overlay ov r-start r-end)
>> > >>                               (overlay-put ov
>> 'treesit-parser-ov-timestamp
>> > >>                                            modified-tick)
>> > >>                               (throw 'done embedded-parser)))))))
>> > >>
>> > >>
>> > >> With this in place the markdown-ts reproduction fontifies as you
>> type,
>> > >> no RET needed, no recreate helper needed.
>> > >>
>> > >> I am very aware this is potentially a sledgehammer. It forces a fre=
sh
>> > >> local parser on every range change, throwing away tree-sitter's
>> > >> incremental work for that subtree. For modes that just rely on loca=
l
>> > >> parsers for fontification it should be fine, but it may not be the
>> right
>> > >> answer if the rest of treesit depends on parser identity surviving
>> > >> across range moves.
>> > >>
>> > >>
>> > >> Where I am not sure
>> > >> -------------------
>> > >>
>> > >> 1. Is this the right layer to address? My patch is in
>> > >>   `treesit--update-ranges-local'. It feels like the deeper truth
>> could
>> > >>   live in `treesit.c''s edit replay when ranges shift, where
>> > >>   `need_reparse' for a local parser does not get set even though it=
s
>> > >>   tree is stale. The C code is quiet on local parser treatment, so =
it
>> > >>   is hard to tell from outside whether primary-parser reparse
>> > >>   notifications are supposed to propagate to local parsers in this
>> > >>   case.
>> > >>
>> > >> 2. Is there a one-liner I am missing on the elisp side? For example=
 a
>> > >>   call I should be making after `treesit-parser-set-included-ranges=
'
>> to
>> > >>   force the parser to throw away its cached tree.
>> > >>
>> > >> 3. Or is the right fix on the grammar side, in tree-sitter-markdown=
's
>> > >>   incremental behaviour around backtick spans, in which case treesi=
t
>> > >>   should probably still gain a way to recover.
>> > >>
>> > >> 4. As mentioned at the top, I believe any `:local t' range rule cou=
ld
>> > >>   reach this state. markdown-ts is the first heavy customer, but th=
e
>> > >>   html-embedded modes look structurally similar enough that they
>> would
>> > >>   hit it too, just less often.
>> > >>
>> > >> If the analysis is correct but the proposed fix is not, I would be
>> happy
>> > >> to revise the diff. If the analysis itself is wrong, I would also
>> very
>> > >> much appreciate corrections so we can avoid carrying the helper
>> above.
>> > >>
>> > >> I am mostly interested in validating the analysis here. I am not
>> > >> attached to this particular fix, and would be perfectly happy if a
>> > >> different implementation lands instead.
>> > >>
>> > >> Thanks for reading,
>> > >
>> > > Thanks for the investigation. Before knowing more I can=E2=80=99t te=
ll if
>> this should be fixed at the treesit.el level or treesit.c level. But I=
=E2=80=99m
>> still at the stage of trying to reproduce it. So the reproduce step is:
>> > >
>> > > 1. Type `code` RET
>> > > 2. Type `code`
>> > >
>> > > And at this point the second `code` should be unfortified? Even with
>> > > latest master and tree-sitter, I can=E2=80=99t reproduce it. And if =
I get
>> > > latest markdown without my patch, opening a markdown file just crash=
es
>> > > Emacs. I=E2=80=99ll try to get my patch merged upstream.
>> > >
>> > > Yuan
>> >
>> >
>> > Hi there Yuan!
>> >
>> > Thanks for helping!
>> >
>> > I'm on master, stopped on:
>> >
>> > *  (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 ; *
>> >    lisp/treesit.el (treesit--update-ranges-local): Fix let-binding.
>> >
>> >
>> > To reproduce:
>> >
>> > ```markdown
>> >
>> > `foo`
>> >
>> > `bar    `       (you can add spaces here too, only RET refontifies)
>> >
>> >
>> > ```
>> >
>> > One detail, we are inserting ` manually so, no `` and then filling in
>> > (in this case the bug won't trigger). Also, if you copy/paste and then
>> > edit it, the bug won't trigger, only on "manual typing".
>> >
>> > I tested using M-: (insert-char ?`) RET and this *does* trigger the bu=
g.
>> >
>> >
>> > Please find the updated markdown-ts-mode.el and markdown-ts-mode-x.el
>> > attached.
>> >
>> >
>> > These files contain all the latest bug fixes we are trying to push to
>> > the Emacs 31 branch (disscussion with Jo=C3=A3o from Eglot helping on =
get
>> > everything installed is happening on #bug81023
>> > https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D81023).
>> >
>> >
>> > Maybe it is easier to navigate diffs / read docs (if you need) / check
>> > what patches are pending in my mirror branch:
>> > https://github.com/LionyxML/emacs-mirror/commits/feat/markdown-ts-mode=
/
>> .
>> >
>> >
>> > Let me know if we can help you with anything else.
>> >
>> > Yuan, this seems to also be manifesting as phantoms in fenced code
>> blocks where our identifying overlays are accumulating multiple overlays=
.
>>
>> Sorry guys, I don=E2=80=99t know what I=E2=80=99m smoking, but I can=E2=
=80=99t repro this. In a
>> desperate attempt, I had Claude write this Dockerfile that pulls Rahul=
=E2=80=99s
>> mirror, tree-sitter, my patched tree-sitter markdown, and builds a fresh
>> emacs build. Still no repro.
>>
>
Yuan, were you able to repro the issue?  Baking in Rahul's "hack" function
into `markdown-ts-mode` seems like the wrong thing to do as this might crop
up for other treesit users.

--00000000000080f2370652672913
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Fri, May 15, 2026 at 9:06=E2=80=AFAM Rahul Juliato &lt;<a href=3D"mailto=
:rahuljuliato@HIDDEN">rahuljuliato@HIDDEN</a>&gt; wrote:</span></div>=
</div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D=
"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(2=
04,204,204);padding-left:1ex"><div dir=3D"ltr"><div>Hi Yuan!</div><div><br>=
</div><div>I tested your docker file and made a small video of it happening=
 and how I trigger it:=C2=A0<a href=3D"https://youtu.be/rJ7hvuinuRI" target=
=3D"_blank">https://youtu.be/rJ7hvuinuRI</a></div><div><br></div><div>Maybe=
 there&#39;s something special I&#39;m doing while navigating the buffer?</=
div><div><br></div><div>As my system is set to Brazilian Portuguese, I use =
dead-keys, meaning ` must be followed by C-f or C-b or space.</div><div>I t=
hink this is not important for the bug as I said before I could insert the =
char with M-: and trigger the bug too.</div><div><br></div><div>If anybody =
else would like to try the Dockerfile file, I ran with:</div><div><br></div=
><div>=C2=A0 =C2=A0 =C2=A0$ podman build -t emacs-ts .</div><div>=C2=A0 =C2=
=A0 =C2=A0$=C2=A0podman run -it --rm emacs-ts</div><div><br></div><div>`pod=
man` can be replaced by `docker`.</div><div><br></div></div><br><div class=
=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">Em sex., 15 de mai. =
de 2026 =C3=A0s 04:40, Yuan Fu &lt;<a href=3D"mailto:casouri@HIDDEN" tar=
get=3D"_blank">casouri@HIDDEN</a>&gt; escreveu:<br></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid =
rgb(204,204,204);padding-left:1ex"><br>
<br>
&gt; On May 14, 2026, at 1:29=E2=80=AFPM, St=C3=A9phane Marks &lt;<a href=
=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&g=
t; wrote:<br>
&gt; <br>
&gt; On Wed, May 13, 2026 at 14:22 Rahul Martim Juliato &lt;<a href=3D"mail=
to:rahuljuliato@HIDDEN" target=3D"_blank">rahuljuliato@HIDDEN</a>&gt;=
 wrote:<br>
&gt; Yuan Fu &lt;<a href=3D"mailto:casouri@HIDDEN" target=3D"_blank">cas=
ouri@HIDDEN</a>&gt; writes:<br>
&gt; <br>
&gt; &gt;&gt; On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato &l=
t;<a href=3D"mailto:rahuljuliato@HIDDEN" target=3D"_blank">rahuljuliato@=
gmail.com</a>&gt; wrote:<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Hello,<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; While debugging an &quot;it doesn&#39;t fontify&quot; report =
against markdown-ts-mode,<br>
&gt; &gt;&gt; I ended up in treesit.el territory and would like a second op=
inion<br>
&gt; &gt;&gt; before assuming I&#39;ve correctly identified the layer the f=
ix belongs in.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; The bug shows up easily in markdown-ts-mode but I suspect it =
can hit any<br>
&gt; &gt;&gt; major mode that drives local parsers via `treesit-range-rules=
&#39; with<br>
&gt; &gt;&gt; `:local t&#39;. markdown-ts just exercises that path very hea=
vily (one local<br>
&gt; &gt;&gt; `markdown-inline&#39; parser per paragraph), so we are likely=
 seeing<br>
&gt; &gt;&gt; spoilers ahead of the html and other multi-parser modes.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; How to Reproduce:<br>
&gt; &gt;&gt; -----------------<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 1. emacs -Q on current master.<br>
&gt; &gt;&gt; 2. M-x markdown-ts-mode.<br>
&gt; &gt;&gt; 3. Insert a backtick code span on its own line, for example:<=
br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0`foo`<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0`codium=C2=A0 `<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 =C2=A0typing the second line character by character and=
 stopping right<br>
&gt; &gt;&gt;=C2=A0 =C2=A0after the closing backtick. Do not press RET afte=
rwards.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 4. The first code span is fontified. The second is not.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 5. Press RET. The second code span now fontifies correctly.<b=
r>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; `(font-lock-flush)&#39; + `(font-lock-ensure)&#39; do not fix=
 it. Calling<br>
&gt; &gt;&gt; `(treesit-parser-set-included-ranges PR same-ranges)&#39; doe=
s not fix<br>
&gt; &gt;&gt; it either. The only thing that fixes it without typing furthe=
r is<br>
&gt; &gt;&gt; deleting and recreating the local markdown-inline parser that=
 covers<br>
&gt; &gt;&gt; the range.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; What is happening<br>
&gt; &gt;&gt; -----------------<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; The host markdown parser reparses fine and reports the new in=
line<br>
&gt; &gt;&gt; node bounds. The local markdown-inline parser at that range,<=
br>
&gt; &gt;&gt; however, keeps an outdated tree. I confirmed this directly in=
 the<br>
&gt; &gt;&gt; bugged buffer:<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 (buffer-substring 8 18) =3D&gt; &quot;`codium=C2=A0 `&q=
uot;<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 ;; existing local parser covering (8 . 18)<br>
&gt; &gt;&gt;=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline)&quot;<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 ;; force re-set ranges to the same value<br>
&gt; &gt;&gt;=C2=A0 (treesit-parser-set-included-ranges pr &#39;((8 . 18)))=
<br>
&gt; &gt;&gt;=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline)&quot;<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 ;; fresh parser, same buffer, same range<br>
&gt; &gt;&gt;=C2=A0 (let ((new (treesit-parser-create &#39;markdown-inline =
nil t &#39;embedded)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 (treesit-parser-set-included-ranges new &#39;((8=
 . 18)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 (treesit-node-string (treesit-parser-root-node n=
ew)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline (code_span (code_span_deli=
miter)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (code_span_delimiter)))&quot;<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; So, same buffer, same range, same grammar, resulting in diffe=
rent tree<br>
&gt; &gt;&gt; depending on whether the parser was reused across edits or cr=
eated<br>
&gt; &gt;&gt; fresh.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; So the grammar, the input, and the range are all fine. What i=
s<br>
&gt; &gt;&gt; wrong is the parser&#39;s accumulated incremental state.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Reading `treesit--update-ranges-local&#39;, the reuse path go=
es through:<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 (treesit--set-embed-ranges range embedded-parser host-p=
arser)<br>
&gt; &gt;&gt;=C2=A0 (move-overlay ov r-start r-end)<br>
&gt; &gt;&gt;=C2=A0 (overlay-put ov &#39;treesit-parser-ov-timestamp modifi=
ed-tick)<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Tree-sitter is left to apply the buffered edits on top of its=
 old<br>
&gt; &gt;&gt; tree. For markdown-inline plus the backtick code_span rule, t=
hat<br>
&gt; &gt;&gt; incremental update never re-fires the rule when the closing b=
acktick<br>
&gt; &gt;&gt; finally arrives, so the parser stays with `(inline)&#39; empt=
y.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Pressing RET escapes the bug. I am not certain why, two candi=
dates:<br>
&gt; &gt;&gt; the newline grows the host paragraph past the overlay bounds =
and<br>
&gt; &gt;&gt; `treesit--cleanup-local-range-overlays&#39; deletes the old o=
verlay on<br>
&gt; &gt;&gt; the timestamp mismatch, after which a fresh parser is created=
; or<br>
&gt; &gt;&gt; the larger range shift is enough to make tree-sitter invalida=
te the<br>
&gt; &gt;&gt; right subtree and re-evaluate code_span. Either way the pract=
ical<br>
&gt; &gt;&gt; outcome is the same: only a fresh parser fixes it.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; My workaround on markdown-ts-mode (for debugging) <br>
&gt; &gt;&gt; -------------------------------------------------<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; I made this small interactive helper to help me find the loca=
l parser<br>
&gt; &gt;&gt; covering point which would them delete its parser + overlay, =
and create<br>
&gt; &gt;&gt; a fresh one on the same range:<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 (defun my/md-recreate-inline-parser-at-point ()<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 &quot;Delete stale local markdown-inline parser+=
overlay covering point, recreate.&quot;<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 (interactive)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 (let* ((p (point))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(target-ov<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (catch &#39;f<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolist (ov (=
overlays-in (point-min) (point-max)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let (=
(pr (overlay-get ov &#39;treesit-parser)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 (when (and pr<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-get ov &#39;treesit-pars=
er-local-p)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eq (treesit-parser-language pr) =
&#39;markdown-inline)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(&lt;=3D (overlay-start ov) p (ov=
erlay-end ov)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 (throw &#39;f ov)))))))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 (unless target-ov (user-error &quot;No ma=
rkdown-inline overlay covers point&quot;))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 (let* ((old-pr (overlay-get target-ov &#3=
9;treesit-parser))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(host (overlay=
-get target-ov &#39;treesit-host-parser))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(level (treesi=
t-parser-embed-level old-pr))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-start (over=
lay-start target-ov))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-end (overla=
y-end target-ov)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-delete old-pr)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-overlay target-ov)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((new (treesit-parser-create =
&#39;markdown-inline nil t &#39;embedded))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (ov (make-ove=
rlay r-start r-end nil nil t)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-embed-l=
evel new level)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesi=
t-parser new)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesi=
t-parser-local-p t)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesi=
t-host-parser host)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesi=
t-parser-ov-timestamp (buffer-chars-modified-tick))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-include=
d-ranges new `((,r-start . ,r-end)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (font-lock-flush r-start r-=
end)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (message &quot;Recreated ma=
rkdown-inline parser for (%d . %d)&quot; r-start r-end)))))<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; This always recovers the buffer&#39;s fontification immediate=
ly.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; A possible treesit.el patch<br>
&gt; &gt;&gt; ---------------------------<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; The change I have been testing locally is small: in<br>
&gt; &gt;&gt; `treesit--update-ranges-local&#39;, only reuse an existing lo=
cal-parser<br>
&gt; &gt;&gt; overlay when its bounds already match the new range exactly. =
If the<br>
&gt; &gt;&gt; overlay would have to move, do not reuse it. Let<br>
&gt; &gt;&gt; `treesit--cleanup-local-range-overlays&#39; delete it on the =
timestamp<br>
&gt; &gt;&gt; mismatch and the existing &quot;create new&quot; branch will =
produce a fresh<br>
&gt; &gt;&gt; parser on the right range.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0lisp/treesit.el | 11 +++++++++--<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A01 file changed, 9 insertions(+), 2 deletio=
ns(-)<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 =C2=A0 diff --git a/lisp/treesit.el b/lisp/treesit.el<b=
r>
&gt; &gt;&gt;=C2=A0 =C2=A0 index 01e82b56bb8..d80e4fe312d 100644<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 --- a/lisp/treesit.el<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +++ b/lisp/treesit.el<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 @@ -1248,10 +1248,17 @@ treesit--update-ranges-l=
ocal<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 embedded-parser)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when (and (overlay-get ov &#39;t=
reesit-parser-local-p)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 (eq parser-lang embedded-lang)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0(eq embed-level parser-level))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0(eq embed-level parser-level)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; Only reuse if overlay bounds match<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; the new range exactly.=C2=A0 Reusing<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; across range moves can leave the<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; embedded parser with a stale<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; incremental tree (bug seen with<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; markdown-inline code_span).<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0(=3D (overlay-start ov) r-start)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0(=3D (overlay-end ov) r-end))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(treesit--set-embed-ranges=
<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 range embedded-parser hos=
t-parser)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (move-overlay ov r-start r-en=
d)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-put ov &#39;trees=
it-parser-ov-timestamp<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 modified-tick)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(throw &#39;done embedded-=
parser)))))))<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; With this in place the markdown-ts reproduction fontifies as =
you type,<br>
&gt; &gt;&gt; no RET needed, no recreate helper needed.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; I am very aware this is potentially a sledgehammer. It forces=
 a fresh<br>
&gt; &gt;&gt; local parser on every range change, throwing away tree-sitter=
&#39;s<br>
&gt; &gt;&gt; incremental work for that subtree. For modes that just rely o=
n local<br>
&gt; &gt;&gt; parsers for fontification it should be fine, but it may not b=
e the right<br>
&gt; &gt;&gt; answer if the rest of treesit depends on parser identity surv=
iving<br>
&gt; &gt;&gt; across range moves.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Where I am not sure<br>
&gt; &gt;&gt; -------------------<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 1. Is this the right layer to address? My patch is in<br>
&gt; &gt;&gt;=C2=A0 =C2=A0`treesit--update-ranges-local&#39;. It feels like=
 the deeper truth could<br>
&gt; &gt;&gt;=C2=A0 =C2=A0live in `treesit.c&#39;&#39;s edit replay when ra=
nges shift, where<br>
&gt; &gt;&gt;=C2=A0 =C2=A0`need_reparse&#39; for a local parser does not ge=
t set even though its<br>
&gt; &gt;&gt;=C2=A0 =C2=A0tree is stale. The C code is quiet on local parse=
r treatment, so it<br>
&gt; &gt;&gt;=C2=A0 =C2=A0is hard to tell from outside whether primary-pars=
er reparse<br>
&gt; &gt;&gt;=C2=A0 =C2=A0notifications are supposed to propagate to local =
parsers in this<br>
&gt; &gt;&gt;=C2=A0 =C2=A0case.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 2. Is there a one-liner I am missing on the elisp side? For e=
xample a<br>
&gt; &gt;&gt;=C2=A0 =C2=A0call I should be making after `treesit-parser-set=
-included-ranges&#39; to<br>
&gt; &gt;&gt;=C2=A0 =C2=A0force the parser to throw away its cached tree.<b=
r>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 3. Or is the right fix on the grammar side, in tree-sitter-ma=
rkdown&#39;s<br>
&gt; &gt;&gt;=C2=A0 =C2=A0incremental behaviour around backtick spans, in w=
hich case treesit<br>
&gt; &gt;&gt;=C2=A0 =C2=A0should probably still gain a way to recover.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 4. As mentioned at the top, I believe any `:local t&#39; rang=
e rule could<br>
&gt; &gt;&gt;=C2=A0 =C2=A0reach this state. markdown-ts is the first heavy =
customer, but the<br>
&gt; &gt;&gt;=C2=A0 =C2=A0html-embedded modes look structurally similar eno=
ugh that they would<br>
&gt; &gt;&gt;=C2=A0 =C2=A0hit it too, just less often.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; If the analysis is correct but the proposed fix is not, I wou=
ld be happy<br>
&gt; &gt;&gt; to revise the diff. If the analysis itself is wrong, I would =
also very<br>
&gt; &gt;&gt; much appreciate corrections so we can avoid carrying the help=
er above.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; I am mostly interested in validating the analysis here. I am =
not<br>
&gt; &gt;&gt; attached to this particular fix, and would be perfectly happy=
 if a<br>
&gt; &gt;&gt; different implementation lands instead.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Thanks for reading,<br>
&gt; &gt;<br>
&gt; &gt; Thanks for the investigation. Before knowing more I can=E2=80=99t=
 tell if this should be fixed at the treesit.el level or treesit.c level. B=
ut I=E2=80=99m still at the stage of trying to reproduce it. So the reprodu=
ce step is:<br>
&gt; &gt;<br>
&gt; &gt; 1. Type `code` RET<br>
&gt; &gt; 2. Type `code`<br>
&gt; &gt;<br>
&gt; &gt; And at this point the second `code` should be unfortified? Even w=
ith<br>
&gt; &gt; latest master and tree-sitter, I can=E2=80=99t reproduce it. And =
if I get<br>
&gt; &gt; latest markdown without my patch, opening a markdown file just cr=
ashes<br>
&gt; &gt; Emacs. I=E2=80=99ll try to get my patch merged upstream.<br>
&gt; &gt;<br>
&gt; &gt; Yuan<br>
&gt; <br>
&gt; <br>
&gt; Hi there Yuan!<br>
&gt; <br>
&gt; Thanks for helping!<br>
&gt; <br>
&gt; I&#39;m on master, stopped on:<br>
&gt; <br>
&gt; *=C2=A0 (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 =
; *<br>
&gt;=C2=A0 =C2=A0 lisp/treesit.el (treesit--update-ranges-local): Fix let-b=
inding.<br>
&gt; <br>
&gt; <br>
&gt; To reproduce:<br>
&gt; <br>
&gt; ```markdown<br>
&gt; <br>
&gt; `foo`<br>
&gt; <br>
&gt; `bar=C2=A0 =C2=A0 `=C2=A0 =C2=A0 =C2=A0 =C2=A0(you can add spaces here=
 too, only RET refontifies)<br>
&gt; <br>
&gt; <br>
&gt; ```<br>
&gt; <br>
&gt; One detail, we are inserting ` manually so, no `` and then filling in<=
br>
&gt; (in this case the bug won&#39;t trigger). Also, if you copy/paste and =
then<br>
&gt; edit it, the bug won&#39;t trigger, only on &quot;manual typing&quot;.=
<br>
&gt; <br>
&gt; I tested using M-: (insert-char ?`) RET and this *does* trigger the bu=
g.<br>
&gt; <br>
&gt; <br>
&gt; Please find the updated markdown-ts-mode.el and markdown-ts-mode-x.el<=
br>
&gt; attached.<br>
&gt; <br>
&gt; <br>
&gt; These files contain all the latest bug fixes we are trying to push to<=
br>
&gt; the Emacs 31 branch (disscussion with Jo=C3=A3o from Eglot helping on =
get<br>
&gt; everything installed is happening on #bug81023<br>
&gt; <a href=3D"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D81023" rel=
=3D"noreferrer" target=3D"_blank">https://debbugs.gnu.org/cgi/bugreport.cgi=
?bug=3D81023</a>).<br>
&gt; <br>
&gt; <br>
&gt; Maybe it is easier to navigate diffs / read docs (if you need) / check=
<br>
&gt; what patches are pending in my mirror branch:<br>
&gt; <a href=3D"https://github.com/LionyxML/emacs-mirror/commits/feat/markd=
own-ts-mode/" rel=3D"noreferrer" target=3D"_blank">https://github.com/Liony=
xML/emacs-mirror/commits/feat/markdown-ts-mode/</a>.<br>
&gt; <br>
&gt; <br>
&gt; Let me know if we can help you with anything else. <br>
&gt; <br>
&gt; Yuan, this seems to also be manifesting as phantoms in fenced code blo=
cks where our identifying overlays are accumulating multiple overlays. <br>
<br>
Sorry guys, I don=E2=80=99t know what I=E2=80=99m smoking, but I can=E2=80=
=99t repro this. In a desperate attempt, I had Claude write this Dockerfile=
 that pulls Rahul=E2=80=99s mirror, tree-sitter, my patched tree-sitter mar=
kdown, and builds a fresh emacs build. Still no repro.<br></blockquote></di=
v></blockquote><div><br></div><div class=3D"gmail_default" style=3D"font-fa=
mily:monospace">Yuan, were you able to repro the issue?=C2=A0 Baking in Rah=
ul&#39;s &quot;hack&quot; function into `markdown-ts-mode` seems like the w=
rong thing to do as this might crop up for other treesit users.</div></div>=
</div>

--00000000000080f2370652672913--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 15 May 2026 13:06:54 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 09:06:53 2026
Received: from localhost ([127.0.0.1]:43839 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wNsFf-00019M-Tu
	for submit <at> debbugs.gnu.org; Fri, 15 May 2026 09:06:53 -0400
Received: from mail-pj1-x102c.google.com ([2607:f8b0:4864:20::102c]:61820)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <rahuljuliato@HIDDEN>)
 id 1wNsFb-00018k-JS
 for 81019 <at> debbugs.gnu.org; Fri, 15 May 2026 09:06:50 -0400
Received: by mail-pj1-x102c.google.com with SMTP id
 98e67ed59e1d1-369002b26f4so1918251a91.3
 for <81019 <at> debbugs.gnu.org>; Fri, 15 May 2026 06:06:47 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1778850401; cv=none;
 d=google.com; s=arc-20240605;
 b=ATKzwysWAI9duFRwXCAdUYt2MqZoxQpenDmerRwX97xjjrzQ3i2ZYH8MJpFODF34xL
 uZpqA2yBNMvbyPUtJejiivimKMKJD3UvNOOuHVnToOTumWCXoTrzeww+dBZKBxMaISrV
 ZgBg//zZz22ikiCTkCxQVRX3tpe8zybav2pv/6mTprfzAAtxRqGAfyrzbSklx/Yean4X
 UbQgYQ5iT2mqrkRzVgP9XFFHPKmmtH2i+3kcL6No9h1Y0VMBm3/qP8xP7bkcgIGXSlmz
 Zwp0TPeCRShc/gtQBdwcT6EWaWNf4bixW5uSeDiThsL5SMMt08+6Ws8A/e/8x6O1DKFp
 Ra/g==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;
 s=arc-20240605; 
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:dkim-signature;
 bh=wKOH/7BR+vCfEOezYhO5Oc4Xi8Lt3sEr7+CHsl/acXI=;
 fh=AG2dgoj+Yvi/QJOgV+6qwi0VBlMuZjONXGryV2soPMQ=;
 b=Z0pFQXyYS51u65lNgDTU1rXeHL3TXGMIuQ4igObj2RuEwF3ob13etd+pCKQwMmxUC0
 8/eV8HZ+CYGgwQOyckt3XwQdF/t4gcHZRfmjgf0aNv7Y1RKkhOJiv59vesTXel32g4Xf
 YDO6NdVp7Mx9v4dxY1cgwY0qBeT6Z6mx0YvwWN1/XTKNzpPKCSGa9hqY58CIrVg6gmFE
 jXmAXIuAiYuJMGLzoSBqw2eu/7Nsvdb/LxXq+o7gLYs4GA9oXvJx3uG5w1ORMEbARnDq
 IlRavgTW5i3pWv3WuZncVhD47EZtsWiQwmGsdZFTd2yPerTpywH6MzKn6jy2ZrM8RWRq
 brIQ==; darn=debbugs.gnu.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1778850401; x=1779455201; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=wKOH/7BR+vCfEOezYhO5Oc4Xi8Lt3sEr7+CHsl/acXI=;
 b=EnSnwvVefILw6dW1RcXacvUyWcFnUTJk8gXG0qA4loy67iZCsKaEbOoBdoiZzWikgW
 CCRdJlDcjwFuFwjeqMi/vyorcFYKfiJugoL3p8P01+OA4gLXzO0w9w2saXjbzwyhNSLA
 o9gdFTFDzuNH0Z5TIwSnYBbPuCIHJYjbkitvWb8O0hj4uC7zl2axc88L12yKRWUCXvTo
 Qxs2tCKe4iXqiT6PSfTcmghQA+ysjSmuuLAfyuPF4Sgewl3KLd1z9ALIb+rien366m5o
 WxSjAmixMt/ZOA/8q5NgEqPEhSeASODM1i2JABjqVF8ww86LV+/UUV9PnSOCe3FWf7Y7
 Yihg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1778850401; x=1779455201;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=wKOH/7BR+vCfEOezYhO5Oc4Xi8Lt3sEr7+CHsl/acXI=;
 b=WQyhdipQGBSchaO1kVgtoxscCBOBmoKJYV0rwCJ8iRCLRdeFaGDVFQQDAQgDKWEwgQ
 c70GP7jnAmf5ry8vlkBuwcvw4vbcK0EA8GrCjAq0PDTrpxNzK+wgAHqOZrX9TKnZMW9k
 P8sXBvyWg/CAqfxtndL1hzx6PLHSQnnBevEswCTy8fvLzBZmB6AcwUxb4xnqEOtFaGzG
 EPgX6n2ODLVh13Ex7nNq3MsdxR8hWq/gfbLpdy42dTk7z7QUm+INbl9+8cYlrQzekvg/
 0X0BNOZPHl0wu3ePH8SBm7ySxrCj1pYuUj4CUsUsbhoj2bVCDXvqgy/FE2JWXmHJr/YA
 waIA==
X-Forwarded-Encrypted: i=1;
 AFNElJ9jRTHgnboytVWabtd2BoNKEMPg6Nu2xAgFzE/eBvzCZ4luWq6JNTj0+HCowHX4Q39dQvISHQ==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YxPcR5hw4wZSRtQvCg+DPyOOQxmW8J6akHDfRSnx3aAwddEEVb5
 BLMF8X8wZO2wSgYn2daTSKEwMumTaDhTDr8brAu2a/d2t33y/xf7alN/67KbH7PP49ttnYT3eKl
 zQ5CXf3AhlruiEk4zZEKueWidOsUxZZs=
X-Gm-Gg: Acq92OGwRDi2WeeemkkiafwmFPFtb0I5hmmBxFOtmgYnZuGLiXRCNqcJycR4kQTyI9b
 ZBVBWV2D9NPX+7XHovw8J6gc8Cmr71BjVMEAtZ7zF9noidsDrU0HfADDeoJfzZCargwb0i6tVtR
 3fQQUhAYfCQkhUUjpbdGmewm+DitxbIMNLfAQXcxyy2rViYqMj9crIqIW5v9VhY6FcXAOdd3AHo
 jzsD0MUfmkj4uBB5K7ffbxRH6pnvskDsFQ3VeAPLxxLmdhYRzpmm8YFnAHgnruKyBnKevkpV/n7
 kaFREvVYa9xT9G7GR6sYgJXW+BMqk/6jt045e7X6
X-Received: by 2002:a17:90b:3c4a:b0:368:cff1:ed99 with SMTP id
 98e67ed59e1d1-36951a6d26cmr3858122a91.18.1778850400988; Fri, 15 May 2026
 06:06:40 -0700 (PDT)
MIME-Version: 1.0
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
 <m2mry3cgqa.fsf@HIDDEN>
 <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
 <1801F912-77A8-4106-8F74-4A7F4F95B7A3@HIDDEN>
In-Reply-To: <1801F912-77A8-4106-8F74-4A7F4F95B7A3@HIDDEN>
From: Rahul Juliato <rahuljuliato@HIDDEN>
Date: Fri, 15 May 2026 10:06:23 -0300
X-Gm-Features: AVHnY4IfLT1qeR4mdnj3o1g3mGTpIXOfM3ZBRynNWbmwe5iQaGyagBmGoOUvfnU
Message-ID: <CACah_w2AvKug824TMKeibrrqiJmyYxS_EfZAyT0BNZZ9tNkBhQ@HIDDEN>
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
To: Yuan Fu <casouri@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000426fb60651dae2e3"
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>,
 81019 <at> debbugs.gnu.org, Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)

--000000000000426fb60651dae2e3
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hi Yuan!

I tested your docker file and made a small video of it happening and how I
trigger it: https://youtu.be/rJ7hvuinuRI

Maybe there's something special I'm doing while navigating the buffer?

As my system is set to Brazilian Portuguese, I use dead-keys, meaning `
must be followed by C-f or C-b or space.
I think this is not important for the bug as I said before I could insert
the char with M-: and trigger the bug too.

If anybody else would like to try the Dockerfile file, I ran with:

     $ podman build -t emacs-ts .
     $ podman run -it --rm emacs-ts

`podman` can be replaced by `docker`.


Em sex., 15 de mai. de 2026 =C3=A0s 04:40, Yuan Fu <casouri@HIDDEN> escr=
eveu:

>
>
> > On May 14, 2026, at 1:29=E2=80=AFPM, St=C3=A9phane Marks <shipmints@gma=
il.com> wrote:
> >
> > On Wed, May 13, 2026 at 14:22 Rahul Martim Juliato <
> rahuljuliato@HIDDEN> wrote:
> > Yuan Fu <casouri@HIDDEN> writes:
> >
> > >> On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato <
> rahuljuliato@HIDDEN> wrote:
> > >>
> > >> Hello,
> > >>
> > >> While debugging an "it doesn't fontify" report against
> markdown-ts-mode,
> > >> I ended up in treesit.el territory and would like a second opinion
> > >> before assuming I've correctly identified the layer the fix belongs
> in.
> > >>
> > >> The bug shows up easily in markdown-ts-mode but I suspect it can hit
> any
> > >> major mode that drives local parsers via `treesit-range-rules' with
> > >> `:local t'. markdown-ts just exercises that path very heavily (one
> local
> > >> `markdown-inline' parser per paragraph), so we are likely seeing
> > >> spoilers ahead of the html and other multi-parser modes.
> > >>
> > >>
> > >> How to Reproduce:
> > >> -----------------
> > >>
> > >> 1. emacs -Q on current master.
> > >> 2. M-x markdown-ts-mode.
> > >> 3. Insert a backtick code span on its own line, for example:
> > >>
> > >>       `foo`
> > >>
> > >>       `codium  `
> > >>
> > >>   typing the second line character by character and stopping right
> > >>   after the closing backtick. Do not press RET afterwards.
> > >>
> > >> 4. The first code span is fontified. The second is not.
> > >>
> > >> 5. Press RET. The second code span now fontifies correctly.
> > >>
> > >> `(font-lock-flush)' + `(font-lock-ensure)' do not fix it. Calling
> > >> `(treesit-parser-set-included-ranges PR same-ranges)' does not fix
> > >> it either. The only thing that fixes it without typing further is
> > >> deleting and recreating the local markdown-inline parser that covers
> > >> the range.
> > >>
> > >>
> > >> What is happening
> > >> -----------------
> > >>
> > >> The host markdown parser reparses fine and reports the new inline
> > >> node bounds. The local markdown-inline parser at that range,
> > >> however, keeps an outdated tree. I confirmed this directly in the
> > >> bugged buffer:
> > >>
> > >>  (buffer-substring 8 18) =3D> "`codium  `"
> > >>
> > >>  ;; existing local parser covering (8 . 18)
> > >>  (treesit-node-string (treesit-parser-root-node pr))
> > >>    =3D> "(inline)"
> > >>
> > >>  ;; force re-set ranges to the same value
> > >>  (treesit-parser-set-included-ranges pr '((8 . 18)))
> > >>  (treesit-node-string (treesit-parser-root-node pr))
> > >>    =3D> "(inline)"
> > >>
> > >>  ;; fresh parser, same buffer, same range
> > >>  (let ((new (treesit-parser-create 'markdown-inline nil t 'embedded)=
))
> > >>    (treesit-parser-set-included-ranges new '((8 . 18)))
> > >>    (treesit-node-string (treesit-parser-root-node new)))
> > >>    =3D> "(inline (code_span (code_span_delimiter)
> > >>                            (code_span_delimiter)))"
> > >>
> > >> So, same buffer, same range, same grammar, resulting in different tr=
ee
> > >> depending on whether the parser was reused across edits or created
> > >> fresh.
> > >>
> > >> So the grammar, the input, and the range are all fine. What is
> > >> wrong is the parser's accumulated incremental state.
> > >>
> > >> Reading `treesit--update-ranges-local', the reuse path goes through:
> > >>
> > >>  (treesit--set-embed-ranges range embedded-parser host-parser)
> > >>  (move-overlay ov r-start r-end)
> > >>  (overlay-put ov 'treesit-parser-ov-timestamp modified-tick)
> > >>
> > >> Tree-sitter is left to apply the buffered edits on top of its old
> > >> tree. For markdown-inline plus the backtick code_span rule, that
> > >> incremental update never re-fires the rule when the closing backtick
> > >> finally arrives, so the parser stays with `(inline)' empty.
> > >>
> > >> Pressing RET escapes the bug. I am not certain why, two candidates:
> > >> the newline grows the host paragraph past the overlay bounds and
> > >> `treesit--cleanup-local-range-overlays' deletes the old overlay on
> > >> the timestamp mismatch, after which a fresh parser is created; or
> > >> the larger range shift is enough to make tree-sitter invalidate the
> > >> right subtree and re-evaluate code_span. Either way the practical
> > >> outcome is the same: only a fresh parser fixes it.
> > >>
> > >>
> > >> My workaround on markdown-ts-mode (for debugging)
> > >> -------------------------------------------------
> > >>
> > >> I made this small interactive helper to help me find the local parse=
r
> > >> covering point which would them delete its parser + overlay, and
> create
> > >> a fresh one on the same range:
> > >>
> > >>  (defun my/md-recreate-inline-parser-at-point ()
> > >>    "Delete stale local markdown-inline parser+overlay covering point=
,
> recreate."
> > >>    (interactive)
> > >>    (let* ((p (point))
> > >>           (target-ov
> > >>            (catch 'f
> > >>              (dolist (ov (overlays-in (point-min) (point-max)))
> > >>                (let ((pr (overlay-get ov 'treesit-parser)))
> > >>                  (when (and pr
> > >>                             (overlay-get ov 'treesit-parser-local-p)
> > >>                             (eq (treesit-parser-language pr)
> 'markdown-inline)
> > >>                             (<=3D (overlay-start ov) p (overlay-end
> ov)))
> > >>                    (throw 'f ov)))))))
> > >>      (unless target-ov (user-error "No markdown-inline overlay cover=
s
> point"))
> > >>      (let* ((old-pr (overlay-get target-ov 'treesit-parser))
> > >>             (host (overlay-get target-ov 'treesit-host-parser))
> > >>             (level (treesit-parser-embed-level old-pr))
> > >>             (r-start (overlay-start target-ov))
> > >>             (r-end (overlay-end target-ov)))
> > >>        (treesit-parser-delete old-pr)
> > >>        (delete-overlay target-ov)
> > >>        (let ((new (treesit-parser-create 'markdown-inline nil t
> 'embedded))
> > >>              (ov (make-overlay r-start r-end nil nil t)))
> > >>          (treesit-parser-set-embed-level new level)
> > >>          (overlay-put ov 'treesit-parser new)
> > >>          (overlay-put ov 'treesit-parser-local-p t)
> > >>          (overlay-put ov 'treesit-host-parser host)
> > >>          (overlay-put ov 'treesit-parser-ov-timestamp
> (buffer-chars-modified-tick))
> > >>          (treesit-parser-set-included-ranges new `((,r-start .
> ,r-end)))
> > >>          (font-lock-flush r-start r-end)
> > >>          (message "Recreated markdown-inline parser for (%d . %d)"
> r-start r-end)))))
> > >>
> > >> This always recovers the buffer's fontification immediately.
> > >>
> > >>
> > >> A possible treesit.el patch
> > >> ---------------------------
> > >>
> > >> The change I have been testing locally is small: in
> > >> `treesit--update-ranges-local', only reuse an existing local-parser
> > >> overlay when its bounds already match the new range exactly. If the
> > >> overlay would have to move, do not reuse it. Let
> > >> `treesit--cleanup-local-range-overlays' delete it on the timestamp
> > >> mismatch and the existing "create new" branch will produce a fresh
> > >> parser on the right range.
> > >>
> > >>     lisp/treesit.el | 11 +++++++++--
> > >>     1 file changed, 9 insertions(+), 2 deletions(-)
> > >>
> > >>    diff --git a/lisp/treesit.el b/lisp/treesit.el
> > >>    index 01e82b56bb8..d80e4fe312d 100644
> > >>    --- a/lisp/treesit.el
> > >>    +++ b/lisp/treesit.el
> > >>    @@ -1248,10 +1248,17 @@ treesit--update-ranges-local
> > >>
> embedded-parser)))
> > >>                             (when (and (overlay-get ov
> 'treesit-parser-local-p)
> > >>                                        (eq parser-lang embedded-lang=
)
> > >>    -                                   (eq embed-level parser-level)=
)
> > >>    +                                   (eq embed-level parser-level)
> > >>    +                                   ;; Only reuse if overlay
> bounds match
> > >>    +                                   ;; the new range exactly.
> Reusing
> > >>    +                                   ;; across range moves can
> leave the
> > >>    +                                   ;; embedded parser with a sta=
le
> > >>    +                                   ;; incremental tree (bug seen
> with
> > >>    +                                   ;; markdown-inline code_span)=
.
> > >>    +                                   (=3D (overlay-start ov) r-sta=
rt)
> > >>    +                                   (=3D (overlay-end ov) r-end))
> > >>                               (treesit--set-embed-ranges
> > >>                                range embedded-parser host-parser)
> > >>    -                          (move-overlay ov r-start r-end)
> > >>                               (overlay-put ov
> 'treesit-parser-ov-timestamp
> > >>                                            modified-tick)
> > >>                               (throw 'done embedded-parser)))))))
> > >>
> > >>
> > >> With this in place the markdown-ts reproduction fontifies as you typ=
e,
> > >> no RET needed, no recreate helper needed.
> > >>
> > >> I am very aware this is potentially a sledgehammer. It forces a fres=
h
> > >> local parser on every range change, throwing away tree-sitter's
> > >> incremental work for that subtree. For modes that just rely on local
> > >> parsers for fontification it should be fine, but it may not be the
> right
> > >> answer if the rest of treesit depends on parser identity surviving
> > >> across range moves.
> > >>
> > >>
> > >> Where I am not sure
> > >> -------------------
> > >>
> > >> 1. Is this the right layer to address? My patch is in
> > >>   `treesit--update-ranges-local'. It feels like the deeper truth cou=
ld
> > >>   live in `treesit.c''s edit replay when ranges shift, where
> > >>   `need_reparse' for a local parser does not get set even though its
> > >>   tree is stale. The C code is quiet on local parser treatment, so i=
t
> > >>   is hard to tell from outside whether primary-parser reparse
> > >>   notifications are supposed to propagate to local parsers in this
> > >>   case.
> > >>
> > >> 2. Is there a one-liner I am missing on the elisp side? For example =
a
> > >>   call I should be making after `treesit-parser-set-included-ranges'
> to
> > >>   force the parser to throw away its cached tree.
> > >>
> > >> 3. Or is the right fix on the grammar side, in tree-sitter-markdown'=
s
> > >>   incremental behaviour around backtick spans, in which case treesit
> > >>   should probably still gain a way to recover.
> > >>
> > >> 4. As mentioned at the top, I believe any `:local t' range rule coul=
d
> > >>   reach this state. markdown-ts is the first heavy customer, but the
> > >>   html-embedded modes look structurally similar enough that they wou=
ld
> > >>   hit it too, just less often.
> > >>
> > >> If the analysis is correct but the proposed fix is not, I would be
> happy
> > >> to revise the diff. If the analysis itself is wrong, I would also ve=
ry
> > >> much appreciate corrections so we can avoid carrying the helper abov=
e.
> > >>
> > >> I am mostly interested in validating the analysis here. I am not
> > >> attached to this particular fix, and would be perfectly happy if a
> > >> different implementation lands instead.
> > >>
> > >> Thanks for reading,
> > >
> > > Thanks for the investigation. Before knowing more I can=E2=80=99t tel=
l if this
> should be fixed at the treesit.el level or treesit.c level. But I=E2=80=
=99m still
> at the stage of trying to reproduce it. So the reproduce step is:
> > >
> > > 1. Type `code` RET
> > > 2. Type `code`
> > >
> > > And at this point the second `code` should be unfortified? Even with
> > > latest master and tree-sitter, I can=E2=80=99t reproduce it. And if I=
 get
> > > latest markdown without my patch, opening a markdown file just crashe=
s
> > > Emacs. I=E2=80=99ll try to get my patch merged upstream.
> > >
> > > Yuan
> >
> >
> > Hi there Yuan!
> >
> > Thanks for helping!
> >
> > I'm on master, stopped on:
> >
> > *  (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 ; *
> >    lisp/treesit.el (treesit--update-ranges-local): Fix let-binding.
> >
> >
> > To reproduce:
> >
> > ```markdown
> >
> > `foo`
> >
> > `bar    `       (you can add spaces here too, only RET refontifies)
> >
> >
> > ```
> >
> > One detail, we are inserting ` manually so, no `` and then filling in
> > (in this case the bug won't trigger). Also, if you copy/paste and then
> > edit it, the bug won't trigger, only on "manual typing".
> >
> > I tested using M-: (insert-char ?`) RET and this *does* trigger the bug=
.
> >
> >
> > Please find the updated markdown-ts-mode.el and markdown-ts-mode-x.el
> > attached.
> >
> >
> > These files contain all the latest bug fixes we are trying to push to
> > the Emacs 31 branch (disscussion with Jo=C3=A3o from Eglot helping on g=
et
> > everything installed is happening on #bug81023
> > https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D81023).
> >
> >
> > Maybe it is easier to navigate diffs / read docs (if you need) / check
> > what patches are pending in my mirror branch:
> > https://github.com/LionyxML/emacs-mirror/commits/feat/markdown-ts-mode/=
.
> >
> >
> > Let me know if we can help you with anything else.
> >
> > Yuan, this seems to also be manifesting as phantoms in fenced code
> blocks where our identifying overlays are accumulating multiple overlays.
>
> Sorry guys, I don=E2=80=99t know what I=E2=80=99m smoking, but I can=E2=
=80=99t repro this. In a
> desperate attempt, I had Claude write this Dockerfile that pulls Rahul=E2=
=80=99s
> mirror, tree-sitter, my patched tree-sitter markdown, and builds a fresh
> emacs build. Still no repro.
>
> Yuan
>
>

--000000000000426fb60651dae2e3
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>Hi Yuan!</div><div><br></div><div>I tested your docke=
r file and made a small video of it happening and how I trigger it:=C2=A0<a=
 href=3D"https://youtu.be/rJ7hvuinuRI">https://youtu.be/rJ7hvuinuRI</a></di=
v><div><br></div><div>Maybe there&#39;s something special I&#39;m doing whi=
le navigating the buffer?</div><div><br></div><div>As my system is set to B=
razilian Portuguese, I use dead-keys, meaning ` must be followed by C-f or =
C-b or space.</div><div>I think this is not important for the bug as I said=
 before I could insert the char with M-: and trigger the bug too.</div><div=
><br></div><div>If anybody else would like to try the Dockerfile file, I ra=
n with:</div><div><br></div><div>=C2=A0 =C2=A0 =C2=A0$ podman build -t emac=
s-ts .</div><div>=C2=A0 =C2=A0 =C2=A0$=C2=A0podman run -it --rm emacs-ts</d=
iv><div><br></div><div>`podman` can be replaced by `docker`.</div><div><br>=
</div></div><br><div class=3D"gmail_quote gmail_quote_container"><div dir=
=3D"ltr" class=3D"gmail_attr">Em sex., 15 de mai. de 2026 =C3=A0s 04:40, Yu=
an Fu &lt;<a href=3D"mailto:casouri@HIDDEN">casouri@HIDDEN</a>&gt; es=
creveu:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px =
0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
&gt; On May 14, 2026, at 1:29=E2=80=AFPM, St=C3=A9phane Marks &lt;<a href=
=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&g=
t; wrote:<br>
&gt; <br>
&gt; On Wed, May 13, 2026 at 14:22 Rahul Martim Juliato &lt;<a href=3D"mail=
to:rahuljuliato@HIDDEN" target=3D"_blank">rahuljuliato@HIDDEN</a>&gt;=
 wrote:<br>
&gt; Yuan Fu &lt;<a href=3D"mailto:casouri@HIDDEN" target=3D"_blank">cas=
ouri@HIDDEN</a>&gt; writes:<br>
&gt; <br>
&gt; &gt;&gt; On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato &l=
t;<a href=3D"mailto:rahuljuliato@HIDDEN" target=3D"_blank">rahuljuliato@=
gmail.com</a>&gt; wrote:<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Hello,<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; While debugging an &quot;it doesn&#39;t fontify&quot; report =
against markdown-ts-mode,<br>
&gt; &gt;&gt; I ended up in treesit.el territory and would like a second op=
inion<br>
&gt; &gt;&gt; before assuming I&#39;ve correctly identified the layer the f=
ix belongs in.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; The bug shows up easily in markdown-ts-mode but I suspect it =
can hit any<br>
&gt; &gt;&gt; major mode that drives local parsers via `treesit-range-rules=
&#39; with<br>
&gt; &gt;&gt; `:local t&#39;. markdown-ts just exercises that path very hea=
vily (one local<br>
&gt; &gt;&gt; `markdown-inline&#39; parser per paragraph), so we are likely=
 seeing<br>
&gt; &gt;&gt; spoilers ahead of the html and other multi-parser modes.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; How to Reproduce:<br>
&gt; &gt;&gt; -----------------<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 1. emacs -Q on current master.<br>
&gt; &gt;&gt; 2. M-x markdown-ts-mode.<br>
&gt; &gt;&gt; 3. Insert a backtick code span on its own line, for example:<=
br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0`foo`<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0`codium=C2=A0 `<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 =C2=A0typing the second line character by character and=
 stopping right<br>
&gt; &gt;&gt;=C2=A0 =C2=A0after the closing backtick. Do not press RET afte=
rwards.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 4. The first code span is fontified. The second is not.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 5. Press RET. The second code span now fontifies correctly.<b=
r>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; `(font-lock-flush)&#39; + `(font-lock-ensure)&#39; do not fix=
 it. Calling<br>
&gt; &gt;&gt; `(treesit-parser-set-included-ranges PR same-ranges)&#39; doe=
s not fix<br>
&gt; &gt;&gt; it either. The only thing that fixes it without typing furthe=
r is<br>
&gt; &gt;&gt; deleting and recreating the local markdown-inline parser that=
 covers<br>
&gt; &gt;&gt; the range.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; What is happening<br>
&gt; &gt;&gt; -----------------<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; The host markdown parser reparses fine and reports the new in=
line<br>
&gt; &gt;&gt; node bounds. The local markdown-inline parser at that range,<=
br>
&gt; &gt;&gt; however, keeps an outdated tree. I confirmed this directly in=
 the<br>
&gt; &gt;&gt; bugged buffer:<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 (buffer-substring 8 18) =3D&gt; &quot;`codium=C2=A0 `&q=
uot;<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 ;; existing local parser covering (8 . 18)<br>
&gt; &gt;&gt;=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline)&quot;<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 ;; force re-set ranges to the same value<br>
&gt; &gt;&gt;=C2=A0 (treesit-parser-set-included-ranges pr &#39;((8 . 18)))=
<br>
&gt; &gt;&gt;=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline)&quot;<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 ;; fresh parser, same buffer, same range<br>
&gt; &gt;&gt;=C2=A0 (let ((new (treesit-parser-create &#39;markdown-inline =
nil t &#39;embedded)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 (treesit-parser-set-included-ranges new &#39;((8=
 . 18)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 (treesit-node-string (treesit-parser-root-node n=
ew)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline (code_span (code_span_deli=
miter)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (code_span_delimiter)))&quot;<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; So, same buffer, same range, same grammar, resulting in diffe=
rent tree<br>
&gt; &gt;&gt; depending on whether the parser was reused across edits or cr=
eated<br>
&gt; &gt;&gt; fresh.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; So the grammar, the input, and the range are all fine. What i=
s<br>
&gt; &gt;&gt; wrong is the parser&#39;s accumulated incremental state.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Reading `treesit--update-ranges-local&#39;, the reuse path go=
es through:<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 (treesit--set-embed-ranges range embedded-parser host-p=
arser)<br>
&gt; &gt;&gt;=C2=A0 (move-overlay ov r-start r-end)<br>
&gt; &gt;&gt;=C2=A0 (overlay-put ov &#39;treesit-parser-ov-timestamp modifi=
ed-tick)<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Tree-sitter is left to apply the buffered edits on top of its=
 old<br>
&gt; &gt;&gt; tree. For markdown-inline plus the backtick code_span rule, t=
hat<br>
&gt; &gt;&gt; incremental update never re-fires the rule when the closing b=
acktick<br>
&gt; &gt;&gt; finally arrives, so the parser stays with `(inline)&#39; empt=
y.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Pressing RET escapes the bug. I am not certain why, two candi=
dates:<br>
&gt; &gt;&gt; the newline grows the host paragraph past the overlay bounds =
and<br>
&gt; &gt;&gt; `treesit--cleanup-local-range-overlays&#39; deletes the old o=
verlay on<br>
&gt; &gt;&gt; the timestamp mismatch, after which a fresh parser is created=
; or<br>
&gt; &gt;&gt; the larger range shift is enough to make tree-sitter invalida=
te the<br>
&gt; &gt;&gt; right subtree and re-evaluate code_span. Either way the pract=
ical<br>
&gt; &gt;&gt; outcome is the same: only a fresh parser fixes it.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; My workaround on markdown-ts-mode (for debugging) <br>
&gt; &gt;&gt; -------------------------------------------------<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; I made this small interactive helper to help me find the loca=
l parser<br>
&gt; &gt;&gt; covering point which would them delete its parser + overlay, =
and create<br>
&gt; &gt;&gt; a fresh one on the same range:<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 (defun my/md-recreate-inline-parser-at-point ()<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 &quot;Delete stale local markdown-inline parser+=
overlay covering point, recreate.&quot;<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 (interactive)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 (let* ((p (point))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(target-ov<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (catch &#39;f<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolist (ov (=
overlays-in (point-min) (point-max)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let (=
(pr (overlay-get ov &#39;treesit-parser)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 (when (and pr<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-get ov &#39;treesit-pars=
er-local-p)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eq (treesit-parser-language pr) =
&#39;markdown-inline)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(&lt;=3D (overlay-start ov) p (ov=
erlay-end ov)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 (throw &#39;f ov)))))))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 (unless target-ov (user-error &quot;No ma=
rkdown-inline overlay covers point&quot;))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 (let* ((old-pr (overlay-get target-ov &#3=
9;treesit-parser))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(host (overlay=
-get target-ov &#39;treesit-host-parser))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(level (treesi=
t-parser-embed-level old-pr))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-start (over=
lay-start target-ov))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-end (overla=
y-end target-ov)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-delete old-pr)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-overlay target-ov)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((new (treesit-parser-create =
&#39;markdown-inline nil t &#39;embedded))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (ov (make-ove=
rlay r-start r-end nil nil t)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-embed-l=
evel new level)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesi=
t-parser new)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesi=
t-parser-local-p t)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesi=
t-host-parser host)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesi=
t-parser-ov-timestamp (buffer-chars-modified-tick))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-include=
d-ranges new `((,r-start . ,r-end)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (font-lock-flush r-start r-=
end)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (message &quot;Recreated ma=
rkdown-inline parser for (%d . %d)&quot; r-start r-end)))))<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; This always recovers the buffer&#39;s fontification immediate=
ly.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; A possible treesit.el patch<br>
&gt; &gt;&gt; ---------------------------<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; The change I have been testing locally is small: in<br>
&gt; &gt;&gt; `treesit--update-ranges-local&#39;, only reuse an existing lo=
cal-parser<br>
&gt; &gt;&gt; overlay when its bounds already match the new range exactly. =
If the<br>
&gt; &gt;&gt; overlay would have to move, do not reuse it. Let<br>
&gt; &gt;&gt; `treesit--cleanup-local-range-overlays&#39; delete it on the =
timestamp<br>
&gt; &gt;&gt; mismatch and the existing &quot;create new&quot; branch will =
produce a fresh<br>
&gt; &gt;&gt; parser on the right range.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0lisp/treesit.el | 11 +++++++++--<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A01 file changed, 9 insertions(+), 2 deletio=
ns(-)<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt;=C2=A0 =C2=A0 diff --git a/lisp/treesit.el b/lisp/treesit.el<b=
r>
&gt; &gt;&gt;=C2=A0 =C2=A0 index 01e82b56bb8..d80e4fe312d 100644<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 --- a/lisp/treesit.el<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +++ b/lisp/treesit.el<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 @@ -1248,10 +1248,17 @@ treesit--update-ranges-l=
ocal<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 embedded-parser)))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when (and (overlay-get ov &#39;t=
reesit-parser-local-p)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 (eq parser-lang embedded-lang)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0(eq embed-level parser-level))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0(eq embed-level parser-level)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; Only reuse if overlay bounds match<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; the new range exactly.=C2=A0 Reusing<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; across range moves can leave the<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; embedded parser with a stale<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; incremental tree (bug seen with<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0;; markdown-inline code_span).<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0(=3D (overlay-start ov) r-start)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0(=3D (overlay-end ov) r-end))<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(treesit--set-embed-ranges=
<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 range embedded-parser hos=
t-parser)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (move-overlay ov r-start r-en=
d)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-put ov &#39;trees=
it-parser-ov-timestamp<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 modified-tick)<br>
&gt; &gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(throw &#39;done embedded-=
parser)))))))<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; With this in place the markdown-ts reproduction fontifies as =
you type,<br>
&gt; &gt;&gt; no RET needed, no recreate helper needed.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; I am very aware this is potentially a sledgehammer. It forces=
 a fresh<br>
&gt; &gt;&gt; local parser on every range change, throwing away tree-sitter=
&#39;s<br>
&gt; &gt;&gt; incremental work for that subtree. For modes that just rely o=
n local<br>
&gt; &gt;&gt; parsers for fontification it should be fine, but it may not b=
e the right<br>
&gt; &gt;&gt; answer if the rest of treesit depends on parser identity surv=
iving<br>
&gt; &gt;&gt; across range moves.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Where I am not sure<br>
&gt; &gt;&gt; -------------------<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 1. Is this the right layer to address? My patch is in<br>
&gt; &gt;&gt;=C2=A0 =C2=A0`treesit--update-ranges-local&#39;. It feels like=
 the deeper truth could<br>
&gt; &gt;&gt;=C2=A0 =C2=A0live in `treesit.c&#39;&#39;s edit replay when ra=
nges shift, where<br>
&gt; &gt;&gt;=C2=A0 =C2=A0`need_reparse&#39; for a local parser does not ge=
t set even though its<br>
&gt; &gt;&gt;=C2=A0 =C2=A0tree is stale. The C code is quiet on local parse=
r treatment, so it<br>
&gt; &gt;&gt;=C2=A0 =C2=A0is hard to tell from outside whether primary-pars=
er reparse<br>
&gt; &gt;&gt;=C2=A0 =C2=A0notifications are supposed to propagate to local =
parsers in this<br>
&gt; &gt;&gt;=C2=A0 =C2=A0case.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 2. Is there a one-liner I am missing on the elisp side? For e=
xample a<br>
&gt; &gt;&gt;=C2=A0 =C2=A0call I should be making after `treesit-parser-set=
-included-ranges&#39; to<br>
&gt; &gt;&gt;=C2=A0 =C2=A0force the parser to throw away its cached tree.<b=
r>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 3. Or is the right fix on the grammar side, in tree-sitter-ma=
rkdown&#39;s<br>
&gt; &gt;&gt;=C2=A0 =C2=A0incremental behaviour around backtick spans, in w=
hich case treesit<br>
&gt; &gt;&gt;=C2=A0 =C2=A0should probably still gain a way to recover.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; 4. As mentioned at the top, I believe any `:local t&#39; rang=
e rule could<br>
&gt; &gt;&gt;=C2=A0 =C2=A0reach this state. markdown-ts is the first heavy =
customer, but the<br>
&gt; &gt;&gt;=C2=A0 =C2=A0html-embedded modes look structurally similar eno=
ugh that they would<br>
&gt; &gt;&gt;=C2=A0 =C2=A0hit it too, just less often.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; If the analysis is correct but the proposed fix is not, I wou=
ld be happy<br>
&gt; &gt;&gt; to revise the diff. If the analysis itself is wrong, I would =
also very<br>
&gt; &gt;&gt; much appreciate corrections so we can avoid carrying the help=
er above.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; I am mostly interested in validating the analysis here. I am =
not<br>
&gt; &gt;&gt; attached to this particular fix, and would be perfectly happy=
 if a<br>
&gt; &gt;&gt; different implementation lands instead.<br>
&gt; &gt;&gt; <br>
&gt; &gt;&gt; Thanks for reading,<br>
&gt; &gt;<br>
&gt; &gt; Thanks for the investigation. Before knowing more I can=E2=80=99t=
 tell if this should be fixed at the treesit.el level or treesit.c level. B=
ut I=E2=80=99m still at the stage of trying to reproduce it. So the reprodu=
ce step is:<br>
&gt; &gt;<br>
&gt; &gt; 1. Type `code` RET<br>
&gt; &gt; 2. Type `code`<br>
&gt; &gt;<br>
&gt; &gt; And at this point the second `code` should be unfortified? Even w=
ith<br>
&gt; &gt; latest master and tree-sitter, I can=E2=80=99t reproduce it. And =
if I get<br>
&gt; &gt; latest markdown without my patch, opening a markdown file just cr=
ashes<br>
&gt; &gt; Emacs. I=E2=80=99ll try to get my patch merged upstream.<br>
&gt; &gt;<br>
&gt; &gt; Yuan<br>
&gt; <br>
&gt; <br>
&gt; Hi there Yuan!<br>
&gt; <br>
&gt; Thanks for helping!<br>
&gt; <br>
&gt; I&#39;m on master, stopped on:<br>
&gt; <br>
&gt; *=C2=A0 (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 =
; *<br>
&gt;=C2=A0 =C2=A0 lisp/treesit.el (treesit--update-ranges-local): Fix let-b=
inding.<br>
&gt; <br>
&gt; <br>
&gt; To reproduce:<br>
&gt; <br>
&gt; ```markdown<br>
&gt; <br>
&gt; `foo`<br>
&gt; <br>
&gt; `bar=C2=A0 =C2=A0 `=C2=A0 =C2=A0 =C2=A0 =C2=A0(you can add spaces here=
 too, only RET refontifies)<br>
&gt; <br>
&gt; <br>
&gt; ```<br>
&gt; <br>
&gt; One detail, we are inserting ` manually so, no `` and then filling in<=
br>
&gt; (in this case the bug won&#39;t trigger). Also, if you copy/paste and =
then<br>
&gt; edit it, the bug won&#39;t trigger, only on &quot;manual typing&quot;.=
<br>
&gt; <br>
&gt; I tested using M-: (insert-char ?`) RET and this *does* trigger the bu=
g.<br>
&gt; <br>
&gt; <br>
&gt; Please find the updated markdown-ts-mode.el and markdown-ts-mode-x.el<=
br>
&gt; attached.<br>
&gt; <br>
&gt; <br>
&gt; These files contain all the latest bug fixes we are trying to push to<=
br>
&gt; the Emacs 31 branch (disscussion with Jo=C3=A3o from Eglot helping on =
get<br>
&gt; everything installed is happening on #bug81023<br>
&gt; <a href=3D"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D81023" rel=
=3D"noreferrer" target=3D"_blank">https://debbugs.gnu.org/cgi/bugreport.cgi=
?bug=3D81023</a>).<br>
&gt; <br>
&gt; <br>
&gt; Maybe it is easier to navigate diffs / read docs (if you need) / check=
<br>
&gt; what patches are pending in my mirror branch:<br>
&gt; <a href=3D"https://github.com/LionyxML/emacs-mirror/commits/feat/markd=
own-ts-mode/" rel=3D"noreferrer" target=3D"_blank">https://github.com/Liony=
xML/emacs-mirror/commits/feat/markdown-ts-mode/</a>.<br>
&gt; <br>
&gt; <br>
&gt; Let me know if we can help you with anything else. <br>
&gt; <br>
&gt; Yuan, this seems to also be manifesting as phantoms in fenced code blo=
cks where our identifying overlays are accumulating multiple overlays. <br>
<br>
Sorry guys, I don=E2=80=99t know what I=E2=80=99m smoking, but I can=E2=80=
=99t repro this. In a desperate attempt, I had Claude write this Dockerfile=
 that pulls Rahul=E2=80=99s mirror, tree-sitter, my patched tree-sitter mar=
kdown, and builds a fresh emacs build. Still no repro.<br>
<br>
Yuan<br>
<br>
</blockquote></div>

--000000000000426fb60651dae2e3--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 15 May 2026 07:40:41 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 03:40:41 2026
Received: from localhost ([127.0.0.1]:48060 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wNn9z-00073i-5D
	for submit <at> debbugs.gnu.org; Fri, 15 May 2026 03:40:41 -0400
Received: from mail-dy1-x1329.google.com ([2607:f8b0:4864:20::1329]:44035)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <casouri@HIDDEN>) id 1wNn9w-00073J-56
 for 81019 <at> debbugs.gnu.org; Fri, 15 May 2026 03:40:37 -0400
Received: by mail-dy1-x1329.google.com with SMTP id
 5a478bee46e88-2f68f3b075fso13112452eec.0
 for <81019 <at> debbugs.gnu.org>; Fri, 15 May 2026 00:40:36 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1778830835; x=1779435635; darn=debbugs.gnu.org;
 h=references:to:cc:in-reply-to:date:subject:mime-version:message-id
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=R5XzKbCG9T8Sq9rKd2uUR0bTF/60wPQCQnkuYm1JQWQ=;
 b=Xpgq6yImwTWM58bkXtVQ7/V8E4SnrP41gHfGlA0C/kVQ1mIrG85YSd38/Jj+hkjj02
 s0zJF4bOw5f/PazZz35lPCMC0TEI9gHZZMJxoWt6SfruTMwIcL4bUuzWbDp4dz8WMoHZ
 rBCIpfSm8PFxtszBKrSBQTq4YqXks2oW4oUbkU0+Jp4IXOig9xU4gO8sVussMzh+Mpig
 iYssMABWoTvoWu7ul82KBJP9bpRDxvhEZADY/QGmbKCMZKC0wnC4PpgDhM/LOjkbQiN0
 SsvCVYMZXFJd2KRdz3xruuup5HhQS2F0PvcvB1oUMl9qJ5rLNByLmdkK8Otz50HEEBHJ
 Ou5A==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1778830835; x=1779435635;
 h=references:to:cc:in-reply-to:date:subject:mime-version:message-id
 :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=R5XzKbCG9T8Sq9rKd2uUR0bTF/60wPQCQnkuYm1JQWQ=;
 b=hhAM4VIC/oqw0hG3i3wY7Fi0PtiBW23ErLjPaCr/PplZ+EZZyUqUwsTO7jP/iue9Dr
 b5/5mydUN6LOnW/4USyQFihXyNbzauPYXkNvApdORKjbcgsLHK27yam+uZDE1sFM3/T5
 p9miNR2WugDhTCHEOcsc7fT62SKSU1b77qtIxztHu+WvkwLMP3RQEDNvjhU6UmaMj3wX
 ERDUlkingw8cXt/pSkkqgUPi4jbjWo+HAXfZEoA7iQp1v45bJfsq5xguM0oYkha5Gpwf
 gizCFtkcyenHU9J7hEtDDG1SprVVzayEH9gLOrPsWZ8Ltb5B14Z0QOMbLHjlzdYugWd/
 JeUw==
X-Forwarded-Encrypted: i=1;
 AFNElJ/XpednH9J65LeQHfAi41ecaCl9GVsR5iD/9I79ISdKQ6u47+Bz55X++L2cMMDMdaMb4KxupA==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YyWtWqs6sznJQfm/HaNanmUb9uhNUC1EDPOb28hn6t405FbjHQq
 xI6Lghl6VXjcOc/xTjwRwmDpTHZwYD2ATRfLHVlfJuY4A2S8hLm90lCB
X-Gm-Gg: Acq92OE6m3uyCRQ9OTm7nmaBUx+R4D0XgmJ8BRiiyAD6w+OCWaM752riZb7dikRVpXs
 NFuvQ6GWAJqacAX0YzX4DoJCevo73oF6TzM162Y0VBpDV043bEPV+KqpQZ24DUffh0qXa5aXJ/R
 ujDubGoIP+8Bav9YN8QJbF8GleFlX8W0jLEqrX88FW4vxT4Lw688FIDmlBGxbuscOS5VEH1WbjT
 UWHSFe6IIuW0Bz3JUKiAFh5J7l9MwPcF3CkX3Dlt6r0hvEBaQ/JUmjuun/vvpkc73QfIoRVJWza
 FamG9+OQT4ohAFuogd7rWsDg3c33t1gO3sa4gAWv4GTqLqCq7IH+9OF3pNG9Ft9lgVmR7RmDtn/
 70TyEvP4zFfP0ygwkV9GyBVQraYu3jhRDi2XHbT2dlaICkOWxEwAXxIYGAWc6Q0mffxddAiygLo
 nkSX6D9IGFSlxpkYxd9VkwaeV8gd0TGAdeNiQmCQhlIU9suA==
X-Received: by 2002:a05:7301:4185:b0:2d8:97d6:6ac8 with SMTP id
 5a478bee46e88-30398625a6amr1448186eec.21.1778830834649; 
 Fri, 15 May 2026 00:40:34 -0700 (PDT)
Received: from smtpclient.apple ([2601:645:c686:b320:61c1:2b84:c9a4:b880])
 by smtp.gmail.com with ESMTPSA id
 5a478bee46e88-30293e2ea6dsm6152625eec.4.2026.05.15.00.40.33
 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
 Fri, 15 May 2026 00:40:34 -0700 (PDT)
From: Yuan Fu <casouri@HIDDEN>
Message-Id: <1801F912-77A8-4106-8F74-4A7F4F95B7A3@HIDDEN>
Content-Type: multipart/mixed;
 boundary="Apple-Mail=_E0C0CD83-AFD9-47C9-B23E-A03CF1CAEA74"
Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81\))
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
Date: Fri, 15 May 2026 00:40:22 -0700
In-Reply-To: <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN> <m2mry3cgqa.fsf@HIDDEN>
 <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
X-Mailer: Apple Mail (2.3826.700.81)
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: Rahul Martim Juliato <rahuljuliato@HIDDEN>, 81019 <at> debbugs.gnu.org,
 Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)


--Apple-Mail=_E0C0CD83-AFD9-47C9-B23E-A03CF1CAEA74
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8



> On May 14, 2026, at 1:29=E2=80=AFPM, St=C3=A9phane Marks =
<shipmints@HIDDEN> wrote:
>=20
> On Wed, May 13, 2026 at 14:22 Rahul Martim Juliato =
<rahuljuliato@HIDDEN> wrote:
> Yuan Fu <casouri@HIDDEN> writes:
>=20
> >> On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato =
<rahuljuliato@HIDDEN> wrote:
> >>=20
> >> Hello,
> >>=20
> >> While debugging an "it doesn't fontify" report against =
markdown-ts-mode,
> >> I ended up in treesit.el territory and would like a second opinion
> >> before assuming I've correctly identified the layer the fix belongs =
in.
> >>=20
> >> The bug shows up easily in markdown-ts-mode but I suspect it can =
hit any
> >> major mode that drives local parsers via `treesit-range-rules' with
> >> `:local t'. markdown-ts just exercises that path very heavily (one =
local
> >> `markdown-inline' parser per paragraph), so we are likely seeing
> >> spoilers ahead of the html and other multi-parser modes.
> >>=20
> >>=20
> >> How to Reproduce:
> >> -----------------
> >>=20
> >> 1. emacs -Q on current master.
> >> 2. M-x markdown-ts-mode.
> >> 3. Insert a backtick code span on its own line, for example:
> >>=20
> >>       `foo`
> >>=20
> >>       `codium  `
> >>=20
> >>   typing the second line character by character and stopping right
> >>   after the closing backtick. Do not press RET afterwards.
> >>=20
> >> 4. The first code span is fontified. The second is not.
> >>=20
> >> 5. Press RET. The second code span now fontifies correctly.
> >>=20
> >> `(font-lock-flush)' + `(font-lock-ensure)' do not fix it. Calling
> >> `(treesit-parser-set-included-ranges PR same-ranges)' does not fix
> >> it either. The only thing that fixes it without typing further is
> >> deleting and recreating the local markdown-inline parser that =
covers
> >> the range.
> >>=20
> >>=20
> >> What is happening
> >> -----------------
> >>=20
> >> The host markdown parser reparses fine and reports the new inline
> >> node bounds. The local markdown-inline parser at that range,
> >> however, keeps an outdated tree. I confirmed this directly in the
> >> bugged buffer:
> >>=20
> >>  (buffer-substring 8 18) =3D> "`codium  `"
> >>=20
> >>  ;; existing local parser covering (8 . 18)
> >>  (treesit-node-string (treesit-parser-root-node pr))
> >>    =3D> "(inline)"
> >>=20
> >>  ;; force re-set ranges to the same value
> >>  (treesit-parser-set-included-ranges pr '((8 . 18)))
> >>  (treesit-node-string (treesit-parser-root-node pr))
> >>    =3D> "(inline)"
> >>=20
> >>  ;; fresh parser, same buffer, same range
> >>  (let ((new (treesit-parser-create 'markdown-inline nil t =
'embedded)))
> >>    (treesit-parser-set-included-ranges new '((8 . 18)))
> >>    (treesit-node-string (treesit-parser-root-node new)))
> >>    =3D> "(inline (code_span (code_span_delimiter)
> >>                            (code_span_delimiter)))"
> >>=20
> >> So, same buffer, same range, same grammar, resulting in different =
tree
> >> depending on whether the parser was reused across edits or created
> >> fresh.
> >>=20
> >> So the grammar, the input, and the range are all fine. What is
> >> wrong is the parser's accumulated incremental state.
> >>=20
> >> Reading `treesit--update-ranges-local', the reuse path goes =
through:
> >>=20
> >>  (treesit--set-embed-ranges range embedded-parser host-parser)
> >>  (move-overlay ov r-start r-end)
> >>  (overlay-put ov 'treesit-parser-ov-timestamp modified-tick)
> >>=20
> >> Tree-sitter is left to apply the buffered edits on top of its old
> >> tree. For markdown-inline plus the backtick code_span rule, that
> >> incremental update never re-fires the rule when the closing =
backtick
> >> finally arrives, so the parser stays with `(inline)' empty.
> >>=20
> >> Pressing RET escapes the bug. I am not certain why, two candidates:
> >> the newline grows the host paragraph past the overlay bounds and
> >> `treesit--cleanup-local-range-overlays' deletes the old overlay on
> >> the timestamp mismatch, after which a fresh parser is created; or
> >> the larger range shift is enough to make tree-sitter invalidate the
> >> right subtree and re-evaluate code_span. Either way the practical
> >> outcome is the same: only a fresh parser fixes it.
> >>=20
> >>=20
> >> My workaround on markdown-ts-mode (for debugging)=20
> >> -------------------------------------------------
> >>=20
> >> I made this small interactive helper to help me find the local =
parser
> >> covering point which would them delete its parser + overlay, and =
create
> >> a fresh one on the same range:
> >>=20
> >>  (defun my/md-recreate-inline-parser-at-point ()
> >>    "Delete stale local markdown-inline parser+overlay covering =
point, recreate."
> >>    (interactive)
> >>    (let* ((p (point))
> >>           (target-ov
> >>            (catch 'f
> >>              (dolist (ov (overlays-in (point-min) (point-max)))
> >>                (let ((pr (overlay-get ov 'treesit-parser)))
> >>                  (when (and pr
> >>                             (overlay-get ov =
'treesit-parser-local-p)
> >>                             (eq (treesit-parser-language pr) =
'markdown-inline)
> >>                             (<=3D (overlay-start ov) p (overlay-end =
ov)))
> >>                    (throw 'f ov)))))))
> >>      (unless target-ov (user-error "No markdown-inline overlay =
covers point"))
> >>      (let* ((old-pr (overlay-get target-ov 'treesit-parser))
> >>             (host (overlay-get target-ov 'treesit-host-parser))
> >>             (level (treesit-parser-embed-level old-pr))
> >>             (r-start (overlay-start target-ov))
> >>             (r-end (overlay-end target-ov)))
> >>        (treesit-parser-delete old-pr)
> >>        (delete-overlay target-ov)
> >>        (let ((new (treesit-parser-create 'markdown-inline nil t =
'embedded))
> >>              (ov (make-overlay r-start r-end nil nil t)))
> >>          (treesit-parser-set-embed-level new level)
> >>          (overlay-put ov 'treesit-parser new)
> >>          (overlay-put ov 'treesit-parser-local-p t)
> >>          (overlay-put ov 'treesit-host-parser host)
> >>          (overlay-put ov 'treesit-parser-ov-timestamp =
(buffer-chars-modified-tick))
> >>          (treesit-parser-set-included-ranges new `((,r-start . =
,r-end)))
> >>          (font-lock-flush r-start r-end)
> >>          (message "Recreated markdown-inline parser for (%d . %d)" =
r-start r-end)))))
> >>=20
> >> This always recovers the buffer's fontification immediately.
> >>=20
> >>=20
> >> A possible treesit.el patch
> >> ---------------------------
> >>=20
> >> The change I have been testing locally is small: in
> >> `treesit--update-ranges-local', only reuse an existing local-parser
> >> overlay when its bounds already match the new range exactly. If the
> >> overlay would have to move, do not reuse it. Let
> >> `treesit--cleanup-local-range-overlays' delete it on the timestamp
> >> mismatch and the existing "create new" branch will produce a fresh
> >> parser on the right range.
> >>=20
> >>     lisp/treesit.el | 11 +++++++++--
> >>     1 file changed, 9 insertions(+), 2 deletions(-)
> >>=20
> >>    diff --git a/lisp/treesit.el b/lisp/treesit.el
> >>    index 01e82b56bb8..d80e4fe312d 100644
> >>    --- a/lisp/treesit.el
> >>    +++ b/lisp/treesit.el
> >>    @@ -1248,10 +1248,17 @@ treesit--update-ranges-local
> >>                                                      =
embedded-parser)))
> >>                             (when (and (overlay-get ov =
'treesit-parser-local-p)
> >>                                        (eq parser-lang =
embedded-lang)
> >>    -                                   (eq embed-level =
parser-level))
> >>    +                                   (eq embed-level =
parser-level)
> >>    +                                   ;; Only reuse if overlay =
bounds match
> >>    +                                   ;; the new range exactly.  =
Reusing
> >>    +                                   ;; across range moves can =
leave the
> >>    +                                   ;; embedded parser with a =
stale
> >>    +                                   ;; incremental tree (bug =
seen with
> >>    +                                   ;; markdown-inline =
code_span).
> >>    +                                   (=3D (overlay-start ov) =
r-start)
> >>    +                                   (=3D (overlay-end ov) =
r-end))
> >>                               (treesit--set-embed-ranges
> >>                                range embedded-parser host-parser)
> >>    -                          (move-overlay ov r-start r-end)
> >>                               (overlay-put ov =
'treesit-parser-ov-timestamp
> >>                                            modified-tick)
> >>                               (throw 'done embedded-parser)))))))
> >>=20
> >>=20
> >> With this in place the markdown-ts reproduction fontifies as you =
type,
> >> no RET needed, no recreate helper needed.
> >>=20
> >> I am very aware this is potentially a sledgehammer. It forces a =
fresh
> >> local parser on every range change, throwing away tree-sitter's
> >> incremental work for that subtree. For modes that just rely on =
local
> >> parsers for fontification it should be fine, but it may not be the =
right
> >> answer if the rest of treesit depends on parser identity surviving
> >> across range moves.
> >>=20
> >>=20
> >> Where I am not sure
> >> -------------------
> >>=20
> >> 1. Is this the right layer to address? My patch is in
> >>   `treesit--update-ranges-local'. It feels like the deeper truth =
could
> >>   live in `treesit.c''s edit replay when ranges shift, where
> >>   `need_reparse' for a local parser does not get set even though =
its
> >>   tree is stale. The C code is quiet on local parser treatment, so =
it
> >>   is hard to tell from outside whether primary-parser reparse
> >>   notifications are supposed to propagate to local parsers in this
> >>   case.
> >>=20
> >> 2. Is there a one-liner I am missing on the elisp side? For example =
a
> >>   call I should be making after =
`treesit-parser-set-included-ranges' to
> >>   force the parser to throw away its cached tree.
> >>=20
> >> 3. Or is the right fix on the grammar side, in =
tree-sitter-markdown's
> >>   incremental behaviour around backtick spans, in which case =
treesit
> >>   should probably still gain a way to recover.
> >>=20
> >> 4. As mentioned at the top, I believe any `:local t' range rule =
could
> >>   reach this state. markdown-ts is the first heavy customer, but =
the
> >>   html-embedded modes look structurally similar enough that they =
would
> >>   hit it too, just less often.
> >>=20
> >> If the analysis is correct but the proposed fix is not, I would be =
happy
> >> to revise the diff. If the analysis itself is wrong, I would also =
very
> >> much appreciate corrections so we can avoid carrying the helper =
above.
> >>=20
> >> I am mostly interested in validating the analysis here. I am not
> >> attached to this particular fix, and would be perfectly happy if a
> >> different implementation lands instead.
> >>=20
> >> Thanks for reading,
> >
> > Thanks for the investigation. Before knowing more I can=E2=80=99t =
tell if this should be fixed at the treesit.el level or treesit.c level. =
But I=E2=80=99m still at the stage of trying to reproduce it. So the =
reproduce step is:
> >
> > 1. Type `code` RET
> > 2. Type `code`
> >
> > And at this point the second `code` should be unfortified? Even with
> > latest master and tree-sitter, I can=E2=80=99t reproduce it. And if =
I get
> > latest markdown without my patch, opening a markdown file just =
crashes
> > Emacs. I=E2=80=99ll try to get my patch merged upstream.
> >
> > Yuan
>=20
>=20
> Hi there Yuan!
>=20
> Thanks for helping!
>=20
> I'm on master, stopped on:
>=20
> *  (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 ; *
>    lisp/treesit.el (treesit--update-ranges-local): Fix let-binding.
>=20
>=20
> To reproduce:
>=20
> ```markdown
>=20
> `foo`
>=20
> `bar    `       (you can add spaces here too, only RET refontifies)
>=20
>=20
> ```
>=20
> One detail, we are inserting ` manually so, no `` and then filling in
> (in this case the bug won't trigger). Also, if you copy/paste and then
> edit it, the bug won't trigger, only on "manual typing".
>=20
> I tested using M-: (insert-char ?`) RET and this *does* trigger the =
bug.
>=20
>=20
> Please find the updated markdown-ts-mode.el and markdown-ts-mode-x.el
> attached.
>=20
>=20
> These files contain all the latest bug fixes we are trying to push to
> the Emacs 31 branch (disscussion with Jo=C3=A3o from Eglot helping on =
get
> everything installed is happening on #bug81023
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D81023).
>=20
>=20
> Maybe it is easier to navigate diffs / read docs (if you need) / check
> what patches are pending in my mirror branch:
> =
https://github.com/LionyxML/emacs-mirror/commits/feat/markdown-ts-mode/.
>=20
>=20
> Let me know if we can help you with anything else.=20
>=20
> Yuan, this seems to also be manifesting as phantoms in fenced code =
blocks where our identifying overlays are accumulating multiple =
overlays.=20

Sorry guys, I don=E2=80=99t know what I=E2=80=99m smoking, but I can=E2=80=
=99t repro this. In a desperate attempt, I had Claude write this =
Dockerfile that pulls Rahul=E2=80=99s mirror, tree-sitter, my patched =
tree-sitter markdown, and builds a fresh emacs build. Still no repro.

Yuan


--Apple-Mail=_E0C0CD83-AFD9-47C9-B23E-A03CF1CAEA74
Content-Disposition: attachment;
	filename=Dockerfile
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="Dockerfile"
Content-Transfer-Encoding: 7bit

FROM debian:stable-slim

# --- 1. apt dependencies (build-essential + Emacs build deps) ---
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
      build-essential git ca-certificates pkg-config \
      autoconf automake texinfo \
      libgnutls28-dev libncurses-dev libgmp-dev \
      libxml2-dev libjansson-dev libsqlite3-dev \
 && rm -rf /var/lib/apt/lists/*

# --- 2. tree-sitter library (pinned) ---
ARG TS_SHA=a858378ce7f4c124339cf67d8ad37341964fc0ee
RUN git clone https://github.com/tree-sitter/tree-sitter.git /src/tree-sitter \
 && git -C /src/tree-sitter checkout ${TS_SHA} \
 && make -C /src/tree-sitter -j"$(nproc)" \
 && make -C /src/tree-sitter install PREFIX=/usr/local \
 && ldconfig

# --- 3. tree-sitter-markdown grammars (pinned, branch split_parser) ---
ARG TSM_SHA=a374d3ad4b042b989116061cf7457ff46aea336a
RUN git clone https://github.com/casouri/tree-sitter-markdown.git /src/tsm \
 && git -C /src/tsm checkout ${TSM_SHA} \
 && mkdir -p /root/.emacs.d/tree-sitter

# Build both grammars as ~/.emacs.d/tree-sitter/libtree-sitter-<name>.so.
# Defensive: support either scanner.c or scanner.cc.
RUN set -eux; \
    build_grammar() { \
      dir="$1"; name="$2"; \
      cd "$dir/src"; \
      if [ -f scanner.cc ]; then \
        g++ -shared -fPIC -O2 -I . parser.c scanner.cc \
            -o /root/.emacs.d/tree-sitter/libtree-sitter-"$name".so; \
      elif [ -f scanner.c ]; then \
        cc  -shared -fPIC -O2 -I . parser.c scanner.c \
            -o /root/.emacs.d/tree-sitter/libtree-sitter-"$name".so; \
      else \
        cc  -shared -fPIC -O2 -I . parser.c \
            -o /root/.emacs.d/tree-sitter/libtree-sitter-"$name".so; \
      fi; \
    }; \
    build_grammar /src/tsm/tree-sitter-markdown        markdown; \
    build_grammar /src/tsm/tree-sitter-markdown-inline markdown-inline

# --- 4. Emacs source (pinned) ---
ARG EMACS_SHA=025ecf9e7b45aa7a8d5825559f0e6226bfebb9d2
RUN git clone https://github.com/LionyxML/emacs-mirror.git /src/emacs \
 && git -C /src/emacs checkout ${EMACS_SHA}

# --- 5. Build Emacs (terminal only, with tree-sitter, no native-comp) ---
WORKDIR /src/emacs
RUN ./autogen.sh \
 && ./configure --with-x-toolkit=no --without-x \
                --with-tree-sitter --without-native-compilation \
 && make -j"$(nproc)"

# --- 6. Run ---
ENV TERM=xterm-256color
CMD ["./src/emacs"]

--Apple-Mail=_E0C0CD83-AFD9-47C9-B23E-A03CF1CAEA74--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 14 May 2026 20:30:28 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu May 14 16:30:28 2026
Received: from localhost ([127.0.0.1]:40529 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wNchH-0006zv-D6
	for submit <at> debbugs.gnu.org; Thu, 14 May 2026 16:30:27 -0400
Received: from mail-vs1-xe2c.google.com ([2607:f8b0:4864:20::e2c]:48224)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1wNchB-0006vJ-JZ
 for 81019 <at> debbugs.gnu.org; Thu, 14 May 2026 16:30:17 -0400
Received: by mail-vs1-xe2c.google.com with SMTP id
 ada2fe7eead31-6314adf187fso2365948137.0
 for <81019 <at> debbugs.gnu.org>; Thu, 14 May 2026 13:30:13 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1778790607; cv=none;
 d=google.com; s=arc-20240605;
 b=a9NB0WeErhcktGmCcS1LQ+UlMuWONtN4IPuelkVK8xrekUPbplHhEuBLIkfel/ypOn
 aoYwNk52RuvYU4m7VLopbFzNeuvbcqaDxYHEsGUuDOpFjGTy5AuU1DQ/ckmgHjLfkoLe
 QSjvzx1Ds64pvm7xUmgjLuhA0HRltmXiMDow+RHirHAgQv9gbGtrs5qVe7T3Y7KXEOGZ
 MFhQNf1eFbhVe8k6+V/mNpnuVdaLLefv7j3hCaeFMMGLmA+mEM1CMeNTKmRtVPNHyacj
 E7kS1PAqKW0CGia5hoUD+dEBdbcx3C2manpAj4OlGdCGIacagIJMMI+BEWH/qc40wRsJ
 7BPg==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;
 s=arc-20240605; 
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:dkim-signature;
 bh=PL2TPgzgN4d6EdYb8SPZ6d/2adB8GOKuaCI7xXk5x6k=;
 fh=vBnad3atQW0kH7IfcthxHHU1lWlIjQn3Q31GgM01GSM=;
 b=E/OMR0DFobKr1c6P/3oBbPXKPJn/osbtL/FGqLd3HUAk9w+0RxCwgrTaZehMuU8rdB
 E526j3LiH3NFScpYBZFFOAxkd61vdZvinEvmfnXHHi4n+2DhRcf1tu+GcF81dT5S+Xaf
 0uaEUIkyRpwO053M8caZ3L7uUlv3QC8JTp4L2w6pNTqtvAU6yNVaNK0LAtcfiavHnYoH
 5TZL/yjenD1SJD64oWn83JatWjbOTtRX/L2kSyF1wvFmFHDDIBFuIRkRXgYvuI14HkUL
 efeNcSj3HB9daOpP0WR07UVzyb/ikhvd8YIgJUWSvGDt6G/OOT2iNXmVZf0pVEomxrN3
 UPlQ==; darn=debbugs.gnu.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1778790607; x=1779395407; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=PL2TPgzgN4d6EdYb8SPZ6d/2adB8GOKuaCI7xXk5x6k=;
 b=Dssea3K4kBEVIqc6Dma/+sBJRc52wrbadw23lEYRls7ZNCpUnTT0MiB/IRWyYzTURy
 DOISo6q06uni+KITNMdhEDpJ0gJLW9MyLSyySROdV5IQaPyNRgPthtd83oIVLrec1Prm
 JfOsOb0OZIiU/8c5FTp2B3zjRdDhfzCPC0TisBC7UlOOUNWJ/o0JSjPLuYXSKZCPerfL
 l/Q9hndj2msOudSChW+6oCLB5TAritbjhp8kZQ5p83YMM/dqIeoKPtV/kP/C9M5XgwTv
 4O+KREs6WMXE4r1pfCkIr1n/1qkWCjulkO2X4c/Uo7pp7P8RXfCN6t1PvfRIMZ1cXlBK
 Nz0Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1778790607; x=1779395407;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=PL2TPgzgN4d6EdYb8SPZ6d/2adB8GOKuaCI7xXk5x6k=;
 b=BhSongTi8eNwzzwXqaH0lSj/z61nOLRDsYodp97fbmb3ZLj8OwHlBgYrxqaRkuDTbp
 3zqi5H+aa6Y3XAk3oO3FDoPD2ld4zjQz5QtdmZRRG1AI7ijExoYeUPJdswwGcOsTQ/C9
 RF4yqtiT+n4KeaO5feylZrok82pOlpsZsL0sh50hYjzNVSlB5s+mNZPOelICZAa1f6DV
 uFSd4WK6ENOM48DU0t6xfxx5utfEzN13cIGGYqpQ1e4lV3aZecyLcewWmdLpJ2hamrPm
 Lby9ZFxAbLtyXY/2odO5wx6lDCWFsmQ7hsuD/9+t8g4QJyU2tLYk8xkPOKUwNzKQEfvM
 iCFQ==
X-Forwarded-Encrypted: i=1;
 AFNElJ9KDsGWI0yTC1IjmevpzsEjOIe8FcvxqWucoJe8iipzp8YJC2APpbi/rZK1wDPMW82Lop6kwA==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yw4KMi3KftbKhYtt5xfvqeG/VufRF5l0e1jNzoRHTJfwd0bBzlu
 sCU3tDBKMnaX/PwOL0OlbVA0xIp+euKLdZ6avy48QPTBMs1fweZ2yzcP2Dxr0EJ6TU1B+FMnJVC
 uH8SA9koINhPztnBPYJaAnBM7pBMqY+c=
X-Gm-Gg: Acq92OHkEBMvIYdoHUbIaIhA/OB0u6JGxolkCq/0gWYzYDPFjZVR2k90iTvsLa97GmU
 L63WTpaLnwfjBkV2aBSlbEql5l5l9T5rxQiZm1CeQupyJ1RqwWeSc94MQrPc8T1j+B4/70/5OJg
 NMx+uhXX3avAJDsuSmEcpVmRkKdMdUBEaECXzyXM1x6D435tQ7qZyLIpSOJuh3dVlx2nFr/3Zwp
 VgWIDQ6NTfuNGqapoNdIhPixJpPFtvEK1o12dE7RWTUN/fV2zziW4KeYRJiiuELnqroH19hPGMt
 Z4ZgoVfF1EBZp36JDJXnYeN8bYs1fWSs7T5Rn69+kmbqpiaUagxKFFQpnnJ5lIUQLKJJIpSFKBH
 dV6oONrspjfrYecilgiiC7WrtKe0ROnW3aOYWirgeFhTOGMrr+Iz44sRH+An21SHjBGXTl9NQb1
 YXamlbIw==
X-Received: by 2002:a67:e105:0:b0:611:61d3:819c with SMTP id
 ada2fe7eead31-63a3cf120a2mr562467137.10.1778790607433; Thu, 14 May 2026
 13:30:07 -0700 (PDT)
MIME-Version: 1.0
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
 <m2mry3cgqa.fsf@HIDDEN>
In-Reply-To: <m2mry3cgqa.fsf@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Thu, 14 May 2026 16:29:56 -0400
X-Gm-Features: AVHnY4Ibj2fP8xIt2QDFAh-I5t2tHlsegzitxH2zmHzdBTEKU6yntMrTaBkYDVk
Message-ID: <CAN+1HbogypZErCsRZzMGaBqACJvry-8nBTzBwY2pnRx2R3x2LA@HIDDEN>
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
To: Rahul Martim Juliato <rahuljuliato@HIDDEN>
Content-Type: multipart/alternative; boundary="0000000000004932cd0651ccf683"
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: Yuan Fu <casouri@HIDDEN>, 81019 <at> debbugs.gnu.org,
 Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)

--0000000000004932cd0651ccf683
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Wed, May 13, 2026 at 14:22 Rahul Martim Juliato <rahuljuliato@HIDDEN>
wrote:

> Yuan Fu <casouri@HIDDEN> writes:
>
> >> On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato <
> rahuljuliato@HIDDEN> wrote:
> >>
> >> Hello,
> >>
> >> While debugging an "it doesn't fontify" report against markdown-ts-mod=
e,
> >> I ended up in treesit.el territory and would like a second opinion
> >> before assuming I've correctly identified the layer the fix belongs in=
.
> >>
> >> The bug shows up easily in markdown-ts-mode but I suspect it can hit a=
ny
> >> major mode that drives local parsers via `treesit-range-rules' with
> >> `:local t'. markdown-ts just exercises that path very heavily (one loc=
al
> >> `markdown-inline' parser per paragraph), so we are likely seeing
> >> spoilers ahead of the html and other multi-parser modes.
> >>
> >>
> >> How to Reproduce:
> >> -----------------
> >>
> >> 1. emacs -Q on current master.
> >> 2. M-x markdown-ts-mode.
> >> 3. Insert a backtick code span on its own line, for example:
> >>
> >>       `foo`
> >>
> >>       `codium  `
> >>
> >>   typing the second line character by character and stopping right
> >>   after the closing backtick. Do not press RET afterwards.
> >>
> >> 4. The first code span is fontified. The second is not.
> >>
> >> 5. Press RET. The second code span now fontifies correctly.
> >>
> >> `(font-lock-flush)' + `(font-lock-ensure)' do not fix it. Calling
> >> `(treesit-parser-set-included-ranges PR same-ranges)' does not fix
> >> it either. The only thing that fixes it without typing further is
> >> deleting and recreating the local markdown-inline parser that covers
> >> the range.
> >>
> >>
> >> What is happening
> >> -----------------
> >>
> >> The host markdown parser reparses fine and reports the new inline
> >> node bounds. The local markdown-inline parser at that range,
> >> however, keeps an outdated tree. I confirmed this directly in the
> >> bugged buffer:
> >>
> >>  (buffer-substring 8 18) =3D> "`codium  `"
> >>
> >>  ;; existing local parser covering (8 . 18)
> >>  (treesit-node-string (treesit-parser-root-node pr))
> >>    =3D> "(inline)"
> >>
> >>  ;; force re-set ranges to the same value
> >>  (treesit-parser-set-included-ranges pr '((8 . 18)))
> >>  (treesit-node-string (treesit-parser-root-node pr))
> >>    =3D> "(inline)"
> >>
> >>  ;; fresh parser, same buffer, same range
> >>  (let ((new (treesit-parser-create 'markdown-inline nil t 'embedded)))
> >>    (treesit-parser-set-included-ranges new '((8 . 18)))
> >>    (treesit-node-string (treesit-parser-root-node new)))
> >>    =3D> "(inline (code_span (code_span_delimiter)
> >>                            (code_span_delimiter)))"
> >>
> >> So, same buffer, same range, same grammar, resulting in different tree
> >> depending on whether the parser was reused across edits or created
> >> fresh.
> >>
> >> So the grammar, the input, and the range are all fine. What is
> >> wrong is the parser's accumulated incremental state.
> >>
> >> Reading `treesit--update-ranges-local', the reuse path goes through:
> >>
> >>  (treesit--set-embed-ranges range embedded-parser host-parser)
> >>  (move-overlay ov r-start r-end)
> >>  (overlay-put ov 'treesit-parser-ov-timestamp modified-tick)
> >>
> >> Tree-sitter is left to apply the buffered edits on top of its old
> >> tree. For markdown-inline plus the backtick code_span rule, that
> >> incremental update never re-fires the rule when the closing backtick
> >> finally arrives, so the parser stays with `(inline)' empty.
> >>
> >> Pressing RET escapes the bug. I am not certain why, two candidates:
> >> the newline grows the host paragraph past the overlay bounds and
> >> `treesit--cleanup-local-range-overlays' deletes the old overlay on
> >> the timestamp mismatch, after which a fresh parser is created; or
> >> the larger range shift is enough to make tree-sitter invalidate the
> >> right subtree and re-evaluate code_span. Either way the practical
> >> outcome is the same: only a fresh parser fixes it.
> >>
> >>
> >> My workaround on markdown-ts-mode (for debugging)
> >> -------------------------------------------------
> >>
> >> I made this small interactive helper to help me find the local parser
> >> covering point which would them delete its parser + overlay, and creat=
e
> >> a fresh one on the same range:
> >>
> >>  (defun my/md-recreate-inline-parser-at-point ()
> >>    "Delete stale local markdown-inline parser+overlay covering point,
> recreate."
> >>    (interactive)
> >>    (let* ((p (point))
> >>           (target-ov
> >>            (catch 'f
> >>              (dolist (ov (overlays-in (point-min) (point-max)))
> >>                (let ((pr (overlay-get ov 'treesit-parser)))
> >>                  (when (and pr
> >>                             (overlay-get ov 'treesit-parser-local-p)
> >>                             (eq (treesit-parser-language pr)
> 'markdown-inline)
> >>                             (<=3D (overlay-start ov) p (overlay-end ov=
)))
> >>                    (throw 'f ov)))))))
> >>      (unless target-ov (user-error "No markdown-inline overlay covers
> point"))
> >>      (let* ((old-pr (overlay-get target-ov 'treesit-parser))
> >>             (host (overlay-get target-ov 'treesit-host-parser))
> >>             (level (treesit-parser-embed-level old-pr))
> >>             (r-start (overlay-start target-ov))
> >>             (r-end (overlay-end target-ov)))
> >>        (treesit-parser-delete old-pr)
> >>        (delete-overlay target-ov)
> >>        (let ((new (treesit-parser-create 'markdown-inline nil t
> 'embedded))
> >>              (ov (make-overlay r-start r-end nil nil t)))
> >>          (treesit-parser-set-embed-level new level)
> >>          (overlay-put ov 'treesit-parser new)
> >>          (overlay-put ov 'treesit-parser-local-p t)
> >>          (overlay-put ov 'treesit-host-parser host)
> >>          (overlay-put ov 'treesit-parser-ov-timestamp
> (buffer-chars-modified-tick))
> >>          (treesit-parser-set-included-ranges new `((,r-start . ,r-end)=
))
> >>          (font-lock-flush r-start r-end)
> >>          (message "Recreated markdown-inline parser for (%d . %d)"
> r-start r-end)))))
> >>
> >> This always recovers the buffer's fontification immediately.
> >>
> >>
> >> A possible treesit.el patch
> >> ---------------------------
> >>
> >> The change I have been testing locally is small: in
> >> `treesit--update-ranges-local', only reuse an existing local-parser
> >> overlay when its bounds already match the new range exactly. If the
> >> overlay would have to move, do not reuse it. Let
> >> `treesit--cleanup-local-range-overlays' delete it on the timestamp
> >> mismatch and the existing "create new" branch will produce a fresh
> >> parser on the right range.
> >>
> >>     lisp/treesit.el | 11 +++++++++--
> >>     1 file changed, 9 insertions(+), 2 deletions(-)
> >>
> >>    diff --git a/lisp/treesit.el b/lisp/treesit.el
> >>    index 01e82b56bb8..d80e4fe312d 100644
> >>    --- a/lisp/treesit.el
> >>    +++ b/lisp/treesit.el
> >>    @@ -1248,10 +1248,17 @@ treesit--update-ranges-local
> >>                                                      embedded-parser))=
)
> >>                             (when (and (overlay-get ov
> 'treesit-parser-local-p)
> >>                                        (eq parser-lang embedded-lang)
> >>    -                                   (eq embed-level parser-level))
> >>    +                                   (eq embed-level parser-level)
> >>    +                                   ;; Only reuse if overlay bounds
> match
> >>    +                                   ;; the new range exactly.
> Reusing
> >>    +                                   ;; across range moves can leave
> the
> >>    +                                   ;; embedded parser with a stale
> >>    +                                   ;; incremental tree (bug seen
> with
> >>    +                                   ;; markdown-inline code_span).
> >>    +                                   (=3D (overlay-start ov) r-start=
)
> >>    +                                   (=3D (overlay-end ov) r-end))
> >>                               (treesit--set-embed-ranges
> >>                                range embedded-parser host-parser)
> >>    -                          (move-overlay ov r-start r-end)
> >>                               (overlay-put ov
> 'treesit-parser-ov-timestamp
> >>                                            modified-tick)
> >>                               (throw 'done embedded-parser)))))))
> >>
> >>
> >> With this in place the markdown-ts reproduction fontifies as you type,
> >> no RET needed, no recreate helper needed.
> >>
> >> I am very aware this is potentially a sledgehammer. It forces a fresh
> >> local parser on every range change, throwing away tree-sitter's
> >> incremental work for that subtree. For modes that just rely on local
> >> parsers for fontification it should be fine, but it may not be the rig=
ht
> >> answer if the rest of treesit depends on parser identity surviving
> >> across range moves.
> >>
> >>
> >> Where I am not sure
> >> -------------------
> >>
> >> 1. Is this the right layer to address? My patch is in
> >>   `treesit--update-ranges-local'. It feels like the deeper truth could
> >>   live in `treesit.c''s edit replay when ranges shift, where
> >>   `need_reparse' for a local parser does not get set even though its
> >>   tree is stale. The C code is quiet on local parser treatment, so it
> >>   is hard to tell from outside whether primary-parser reparse
> >>   notifications are supposed to propagate to local parsers in this
> >>   case.
> >>
> >> 2. Is there a one-liner I am missing on the elisp side? For example a
> >>   call I should be making after `treesit-parser-set-included-ranges' t=
o
> >>   force the parser to throw away its cached tree.
> >>
> >> 3. Or is the right fix on the grammar side, in tree-sitter-markdown's
> >>   incremental behaviour around backtick spans, in which case treesit
> >>   should probably still gain a way to recover.
> >>
> >> 4. As mentioned at the top, I believe any `:local t' range rule could
> >>   reach this state. markdown-ts is the first heavy customer, but the
> >>   html-embedded modes look structurally similar enough that they would
> >>   hit it too, just less often.
> >>
> >> If the analysis is correct but the proposed fix is not, I would be hap=
py
> >> to revise the diff. If the analysis itself is wrong, I would also very
> >> much appreciate corrections so we can avoid carrying the helper above.
> >>
> >> I am mostly interested in validating the analysis here. I am not
> >> attached to this particular fix, and would be perfectly happy if a
> >> different implementation lands instead.
> >>
> >> Thanks for reading,
> >
> > Thanks for the investigation. Before knowing more I can=E2=80=99t tell =
if this
> should be fixed at the treesit.el level or treesit.c level. But I=E2=80=
=99m still
> at the stage of trying to reproduce it. So the reproduce step is:
> >
> > 1. Type `code` RET
> > 2. Type `code`
> >
> > And at this point the second `code` should be unfortified? Even with
> > latest master and tree-sitter, I can=E2=80=99t reproduce it. And if I g=
et
> > latest markdown without my patch, opening a markdown file just crashes
> > Emacs. I=E2=80=99ll try to get my patch merged upstream.
> >
> > Yuan
>
>
> Hi there Yuan!
>
> Thanks for helping!
>
> I'm on master, stopped on:
>
> *  (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 ; *
>    lisp/treesit.el (treesit--update-ranges-local): Fix let-binding.
>
>
> To reproduce:
>
> ```markdown
>
> `foo`
>
> `bar    `       (you can add spaces here too, only RET refontifies)
>
>
> ```
>
> One detail, we are inserting ` manually so, no `` and then filling in
> (in this case the bug won't trigger). Also, if you copy/paste and then
> edit it, the bug won't trigger, only on "manual typing".
>
> I tested using M-: (insert-char ?`) RET and this *does* trigger the bug.
>
>
> Please find the updated markdown-ts-mode.el and markdown-ts-mode-x.el
> attached.
>
>
> These files contain all the latest bug fixes we are trying to push to
> the Emacs 31 branch (disscussion with Jo=C3=A3o from Eglot helping on get
> everything installed is happening on #bug81023
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D81023).
>
>
> Maybe it is easier to navigate diffs / read docs (if you need) / check
> what patches are pending in my mirror branch:
> https://github.com/LionyxML/emacs-mirror/commits/feat/markdown-ts-mode/.
>
>
> Let me know if we can help you with anything else.


Yuan, this seems to also be manifesting as phantoms in fenced code blocks
where our identifying overlays are accumulating multiple overlays.

--0000000000004932cd0651ccf683
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"auto"><span style=3D"font-family:-apple-system,sans-serif">On W=
ed, May 13, 2026 at 14:22 Rahul Martim Juliato &lt;<a href=3D"mailto:rahulj=
uliato@HIDDEN">rahuljuliato@HIDDEN</a>&gt; wrote:</span><br></div><di=
v dir=3D"auto"><div class=3D"gmail_quote gmail_quote_container"><blockquote=
 class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc soli=
d;padding-left:1ex" dir=3D"auto">Yuan Fu &lt;<a href=3D"mailto:casouri@gmai=
l.com" target=3D"_blank">casouri@HIDDEN</a>&gt; writes:<br>
<br>
&gt;&gt; On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato &lt;<a =
href=3D"mailto:rahuljuliato@HIDDEN" target=3D"_blank">rahuljuliato@gmail=
.com</a>&gt; wrote:<br>
&gt;&gt; <br>
&gt;&gt; Hello,<br>
&gt;&gt; <br>
&gt;&gt; While debugging an &quot;it doesn&#39;t fontify&quot; report again=
st markdown-ts-mode,<br>
&gt;&gt; I ended up in treesit.el territory and would like a second opinion=
<br>
&gt;&gt; before assuming I&#39;ve correctly identified the layer the fix be=
longs in.<br>
&gt;&gt; <br>
&gt;&gt; The bug shows up easily in markdown-ts-mode but I suspect it can h=
it any<br>
&gt;&gt; major mode that drives local parsers via `treesit-range-rules&#39;=
 with<br>
&gt;&gt; `:local t&#39;. markdown-ts just exercises that path very heavily =
(one local<br>
&gt;&gt; `markdown-inline&#39; parser per paragraph), so we are likely seei=
ng<br>
&gt;&gt; spoilers ahead of the html and other multi-parser modes.<br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; How to Reproduce:<br>
&gt;&gt; -----------------<br>
&gt;&gt; <br>
&gt;&gt; 1. emacs -Q on current master.<br>
&gt;&gt; 2. M-x markdown-ts-mode.<br>
&gt;&gt; 3. Insert a backtick code span on its own line, for example:<br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0`foo`<br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0`codium=C2=A0 `<br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 =C2=A0typing the second line character by character and stop=
ping right<br>
&gt;&gt;=C2=A0 =C2=A0after the closing backtick. Do not press RET afterward=
s.<br>
&gt;&gt; <br>
&gt;&gt; 4. The first code span is fontified. The second is not.<br>
&gt;&gt; <br>
&gt;&gt; 5. Press RET. The second code span now fontifies correctly.<br>
&gt;&gt; <br>
&gt;&gt; `(font-lock-flush)&#39; + `(font-lock-ensure)&#39; do not fix it. =
Calling<br>
&gt;&gt; `(treesit-parser-set-included-ranges PR same-ranges)&#39; does not=
 fix<br>
&gt;&gt; it either. The only thing that fixes it without typing further is<=
br>
&gt;&gt; deleting and recreating the local markdown-inline parser that cove=
rs<br>
&gt;&gt; the range.<br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; What is happening<br>
&gt;&gt; -----------------<br>
&gt;&gt; <br>
&gt;&gt; The host markdown parser reparses fine and reports the new inline<=
br>
&gt;&gt; node bounds. The local markdown-inline parser at that range,<br>
&gt;&gt; however, keeps an outdated tree. I confirmed this directly in the<=
br>
&gt;&gt; bugged buffer:<br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 (buffer-substring 8 18) =3D&gt; &quot;`codium=C2=A0 `&quot;<=
br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 ;; existing local parser covering (8 . 18)<br>
&gt;&gt;=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
&gt;&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline)&quot;<br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 ;; force re-set ranges to the same value<br>
&gt;&gt;=C2=A0 (treesit-parser-set-included-ranges pr &#39;((8 . 18)))<br>
&gt;&gt;=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
&gt;&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline)&quot;<br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 ;; fresh parser, same buffer, same range<br>
&gt;&gt;=C2=A0 (let ((new (treesit-parser-create &#39;markdown-inline nil t=
 &#39;embedded)))<br>
&gt;&gt;=C2=A0 =C2=A0 (treesit-parser-set-included-ranges new &#39;((8 . 18=
)))<br>
&gt;&gt;=C2=A0 =C2=A0 (treesit-node-string (treesit-parser-root-node new)))=
<br>
&gt;&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline (code_span (code_span_delimiter=
)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (code_span_delimiter)))&quot;<br>
&gt;&gt; <br>
&gt;&gt; So, same buffer, same range, same grammar, resulting in different =
tree<br>
&gt;&gt; depending on whether the parser was reused across edits or created=
<br>
&gt;&gt; fresh.<br>
&gt;&gt; <br>
&gt;&gt; So the grammar, the input, and the range are all fine. What is<br>
&gt;&gt; wrong is the parser&#39;s accumulated incremental state.<br>
&gt;&gt; <br>
&gt;&gt; Reading `treesit--update-ranges-local&#39;, the reuse path goes th=
rough:<br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 (treesit--set-embed-ranges range embedded-parser host-parser=
)<br>
&gt;&gt;=C2=A0 (move-overlay ov r-start r-end)<br>
&gt;&gt;=C2=A0 (overlay-put ov &#39;treesit-parser-ov-timestamp modified-ti=
ck)<br>
&gt;&gt; <br>
&gt;&gt; Tree-sitter is left to apply the buffered edits on top of its old<=
br>
&gt;&gt; tree. For markdown-inline plus the backtick code_span rule, that<b=
r>
&gt;&gt; incremental update never re-fires the rule when the closing backti=
ck<br>
&gt;&gt; finally arrives, so the parser stays with `(inline)&#39; empty.<br=
>
&gt;&gt; <br>
&gt;&gt; Pressing RET escapes the bug. I am not certain why, two candidates=
:<br>
&gt;&gt; the newline grows the host paragraph past the overlay bounds and<b=
r>
&gt;&gt; `treesit--cleanup-local-range-overlays&#39; deletes the old overla=
y on<br>
&gt;&gt; the timestamp mismatch, after which a fresh parser is created; or<=
br>
&gt;&gt; the larger range shift is enough to make tree-sitter invalidate th=
e<br>
&gt;&gt; right subtree and re-evaluate code_span. Either way the practical<=
br>
&gt;&gt; outcome is the same: only a fresh parser fixes it.<br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; My workaround on markdown-ts-mode (for debugging) <br>
&gt;&gt; -------------------------------------------------<br>
&gt;&gt; <br>
&gt;&gt; I made this small interactive helper to help me find the local par=
ser<br>
&gt;&gt; covering point which would them delete its parser + overlay, and c=
reate<br>
&gt;&gt; a fresh one on the same range:<br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 (defun my/md-recreate-inline-parser-at-point ()<br>
&gt;&gt;=C2=A0 =C2=A0 &quot;Delete stale local markdown-inline parser+overl=
ay covering point, recreate.&quot;<br>
&gt;&gt;=C2=A0 =C2=A0 (interactive)<br>
&gt;&gt;=C2=A0 =C2=A0 (let* ((p (point))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(target-ov<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (catch &#39;f<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolist (ov (overl=
ays-in (point-min) (point-max)))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((pr (=
overlay-get ov &#39;treesit-parser)))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (whe=
n (and pr<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-get ov &#39;treesit-parser-l=
ocal-p)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eq (treesit-parser-language pr) &#39=
;markdown-inline)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(&lt;=3D (overlay-start ov) p (overla=
y-end ov)))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 (throw &#39;f ov)))))))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 (unless target-ov (user-error &quot;No markdow=
n-inline overlay covers point&quot;))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 (let* ((old-pr (overlay-get target-ov &#39;tre=
esit-parser))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(host (overlay-get =
target-ov &#39;treesit-host-parser))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(level (treesit-par=
ser-embed-level old-pr))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-start (overlay-s=
tart target-ov))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-end (overlay-end=
 target-ov)))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-delete old-pr)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-overlay target-ov)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((new (treesit-parser-create &#39;=
markdown-inline nil t &#39;embedded))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (ov (make-overlay =
r-start r-end nil nil t)))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-embed-level =
new level)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-par=
ser new)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-par=
ser-local-p t)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-hos=
t-parser host)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-par=
ser-ov-timestamp (buffer-chars-modified-tick))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-included-ran=
ges new `((,r-start . ,r-end)))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (font-lock-flush r-start r-end)<=
br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (message &quot;Recreated markdow=
n-inline parser for (%d . %d)&quot; r-start r-end)))))<br>
&gt;&gt; <br>
&gt;&gt; This always recovers the buffer&#39;s fontification immediately.<b=
r>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; A possible treesit.el patch<br>
&gt;&gt; ---------------------------<br>
&gt;&gt; <br>
&gt;&gt; The change I have been testing locally is small: in<br>
&gt;&gt; `treesit--update-ranges-local&#39;, only reuse an existing local-p=
arser<br>
&gt;&gt; overlay when its bounds already match the new range exactly. If th=
e<br>
&gt;&gt; overlay would have to move, do not reuse it. Let<br>
&gt;&gt; `treesit--cleanup-local-range-overlays&#39; delete it on the times=
tamp<br>
&gt;&gt; mismatch and the existing &quot;create new&quot; branch will produ=
ce a fresh<br>
&gt;&gt; parser on the right range.<br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0lisp/treesit.el | 11 +++++++++--<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A01 file changed, 9 insertions(+), 2 deletions(-)=
<br>
&gt;&gt; <br>
&gt;&gt;=C2=A0 =C2=A0 diff --git a/lisp/treesit.el b/lisp/treesit.el<br>
&gt;&gt;=C2=A0 =C2=A0 index 01e82b56bb8..d80e4fe312d 100644<br>
&gt;&gt;=C2=A0 =C2=A0 --- a/lisp/treesit.el<br>
&gt;&gt;=C2=A0 =C2=A0 +++ b/lisp/treesit.el<br>
&gt;&gt;=C2=A0 =C2=A0 @@ -1248,10 +1248,17 @@ treesit--update-ranges-local<=
br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 embedded-parser)))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when (and (overlay-get ov &#39;trees=
it-parser-local-p)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (=
eq parser-lang embedded-lang)<br>
&gt;&gt;=C2=A0 =C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(e=
q embed-level parser-level))<br>
&gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(e=
q embed-level parser-level)<br>
&gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;;=
 Only reuse if overlay bounds match<br>
&gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;;=
 the new range exactly.=C2=A0 Reusing<br>
&gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;;=
 across range moves can leave the<br>
&gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;;=
 embedded parser with a stale<br>
&gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;;=
 incremental tree (bug seen with<br>
&gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;;=
 markdown-inline code_span).<br>
&gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(=
=3D (overlay-start ov) r-start)<br>
&gt;&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(=
=3D (overlay-end ov) r-end))<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(treesit--set-embed-ranges<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 range embedded-parser host-pa=
rser)<br>
&gt;&gt;=C2=A0 =C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (move-overlay ov r-start r-end)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-put ov &#39;treesit-p=
arser-ov-timestamp<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 modified-tick)<br>
&gt;&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(throw &#39;done embedded-pars=
er)))))))<br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; With this in place the markdown-ts reproduction fontifies as you t=
ype,<br>
&gt;&gt; no RET needed, no recreate helper needed.<br>
&gt;&gt; <br>
&gt;&gt; I am very aware this is potentially a sledgehammer. It forces a fr=
esh<br>
&gt;&gt; local parser on every range change, throwing away tree-sitter&#39;=
s<br>
&gt;&gt; incremental work for that subtree. For modes that just rely on loc=
al<br>
&gt;&gt; parsers for fontification it should be fine, but it may not be the=
 right<br>
&gt;&gt; answer if the rest of treesit depends on parser identity surviving=
<br>
&gt;&gt; across range moves.<br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; Where I am not sure<br>
&gt;&gt; -------------------<br>
&gt;&gt; <br>
&gt;&gt; 1. Is this the right layer to address? My patch is in<br>
&gt;&gt;=C2=A0 =C2=A0`treesit--update-ranges-local&#39;. It feels like the =
deeper truth could<br>
&gt;&gt;=C2=A0 =C2=A0live in `treesit.c&#39;&#39;s edit replay when ranges =
shift, where<br>
&gt;&gt;=C2=A0 =C2=A0`need_reparse&#39; for a local parser does not get set=
 even though its<br>
&gt;&gt;=C2=A0 =C2=A0tree is stale. The C code is quiet on local parser tre=
atment, so it<br>
&gt;&gt;=C2=A0 =C2=A0is hard to tell from outside whether primary-parser re=
parse<br>
&gt;&gt;=C2=A0 =C2=A0notifications are supposed to propagate to local parse=
rs in this<br>
&gt;&gt;=C2=A0 =C2=A0case.<br>
&gt;&gt; <br>
&gt;&gt; 2. Is there a one-liner I am missing on the elisp side? For exampl=
e a<br>
&gt;&gt;=C2=A0 =C2=A0call I should be making after `treesit-parser-set-incl=
uded-ranges&#39; to<br>
&gt;&gt;=C2=A0 =C2=A0force the parser to throw away its cached tree.<br>
&gt;&gt; <br>
&gt;&gt; 3. Or is the right fix on the grammar side, in tree-sitter-markdow=
n&#39;s<br>
&gt;&gt;=C2=A0 =C2=A0incremental behaviour around backtick spans, in which =
case treesit<br>
&gt;&gt;=C2=A0 =C2=A0should probably still gain a way to recover.<br>
&gt;&gt; <br>
&gt;&gt; 4. As mentioned at the top, I believe any `:local t&#39; range rul=
e could<br>
&gt;&gt;=C2=A0 =C2=A0reach this state. markdown-ts is the first heavy custo=
mer, but the<br>
&gt;&gt;=C2=A0 =C2=A0html-embedded modes look structurally similar enough t=
hat they would<br>
&gt;&gt;=C2=A0 =C2=A0hit it too, just less often.<br>
&gt;&gt; <br>
&gt;&gt; If the analysis is correct but the proposed fix is not, I would be=
 happy<br>
&gt;&gt; to revise the diff. If the analysis itself is wrong, I would also =
very<br>
&gt;&gt; much appreciate corrections so we can avoid carrying the helper ab=
ove.<br>
&gt;&gt; <br>
&gt;&gt; I am mostly interested in validating the analysis here. I am not<b=
r>
&gt;&gt; attached to this particular fix, and would be perfectly happy if a=
<br>
&gt;&gt; different implementation lands instead.<br>
&gt;&gt; <br>
&gt;&gt; Thanks for reading,<br>
&gt;<br>
&gt; Thanks for the investigation. Before knowing more I can=E2=80=99t tell=
 if this should be fixed at the treesit.el level or treesit.c level. But I=
=E2=80=99m still at the stage of trying to reproduce it. So the reproduce s=
tep is:<br>
&gt;<br>
&gt; 1. Type `code` RET<br>
&gt; 2. Type `code`<br>
&gt;<br>
&gt; And at this point the second `code` should be unfortified? Even with<b=
r>
&gt; latest master and tree-sitter, I can=E2=80=99t reproduce it. And if I =
get<br>
&gt; latest markdown without my patch, opening a markdown file just crashes=
<br>
&gt; Emacs. I=E2=80=99ll try to get my patch merged upstream.<br>
&gt;<br>
&gt; Yuan<br>
<br>
<br>
Hi there Yuan!<br>
<br>
Thanks for helping!<br>
<br>
I&#39;m on master, stopped on:<br>
<br>
*=C2=A0 (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 ; *<b=
r>
=C2=A0 =C2=A0lisp/treesit.el (treesit--update-ranges-local): Fix let-bindin=
g.<br>
<br>
<br>
To reproduce:<br>
<br>
```markdown<br>
<br>
`foo`<br>
<br>
`bar=C2=A0 =C2=A0 `=C2=A0 =C2=A0 =C2=A0 =C2=A0(you can add spaces here too,=
 only RET refontifies)<br>
<br>
<br>
```<br>
<br>
One detail, we are inserting ` manually so, no `` and then filling in<br>
(in this case the bug won&#39;t trigger). Also, if you copy/paste and then<=
br>
edit it, the bug won&#39;t trigger, only on &quot;manual typing&quot;.<br>
<br>
I tested using M-: (insert-char ?`) RET and this *does* trigger the bug.<br=
>
<br>
<br>
Please find the updated markdown-ts-mode.el and markdown-ts-mode-x.el<br>
attached.<br>
<br>
<br>
These files contain all the latest bug fixes we are trying to push to<br>
the Emacs 31 branch (disscussion with Jo=C3=A3o from Eglot helping on get<b=
r>
everything installed is happening on #bug81023<br>
<a href=3D"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D81023" rel=3D"no=
referrer" target=3D"_blank">https://debbugs.gnu.org/cgi/bugreport.cgi?bug=
=3D81023</a>).<br>
<br>
<br>
Maybe it is easier to navigate diffs / read docs (if you need) / check<br>
what patches are pending in my mirror branch:<br>
<a href=3D"https://github.com/LionyxML/emacs-mirror/commits/feat/markdown-t=
s-mode/" rel=3D"noreferrer" target=3D"_blank">https://github.com/LionyxML/e=
macs-mirror/commits/feat/markdown-ts-mode/</a>.<br>
<br>
<br>
Let me know if we can help you with anything else.=C2=A0</blockquote><div d=
ir=3D"auto"><br></div><div dir=3D"auto">Yuan, this seems to also be manifes=
ting as phantoms in fenced code blocks where our identifying overlays are a=
ccumulating multiple overlays.=C2=A0</div><div dir=3D"auto"><br></div><div =
dir=3D"auto"><br></div></div></div>

--0000000000004932cd0651ccf683--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 13 May 2026 18:22:18 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed May 13 14:22:17 2026
Received: from localhost ([127.0.0.1]:54267 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wNEDp-0006qF-Ft
	for submit <at> debbugs.gnu.org; Wed, 13 May 2026 14:22:17 -0400
Received: from mail-dy1-x1331.google.com ([2607:f8b0:4864:20::1331]:54644)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <rahuljuliato@HIDDEN>)
 id 1wNEDn-0006pL-H9
 for 81019 <at> debbugs.gnu.org; Wed, 13 May 2026 14:22:16 -0400
Received: by mail-dy1-x1331.google.com with SMTP id
 5a478bee46e88-2ff5472f263so3337974eec.1
 for <81019 <at> debbugs.gnu.org>; Wed, 13 May 2026 11:22:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1778696531; x=1779301331; darn=debbugs.gnu.org;
 h=mime-version:user-agent:message-id:date:face:references:in-reply-to
 :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to;
 bh=N+9Y5NQ1K0QOFiH+FovEtvYQAfT765/Hn1VyhGCtvQA=;
 b=EwmtgS440+MeWsX3j8PinbSZlJxTdxanyoofzlB/+/a6o0WiwemUJMZeWGGHCEYLYP
 LsXn129eK1wpwpqeZgcOWltXrWGb9th3BB3QAik7FHzByJ1bTTdfbXI6UMPuYFqmngqD
 eeXTyuM+e+2/f6UOMSFD8+HzJIKSqK/aTpjfhf4oUL/LIJPXDYRglWG2Hp1aueOT/U8R
 sqIqOKf5PibPi8iwkJyHXLtdMOijpPfQiEsBmSYbpfO62tEcu13JyWmoPGv/8HAlewnP
 5nNCSz3QE7+BuY9kT46A9izhcbSWvdqekKY/Uweorcj+ZBWmq9d848NG+EJNE6JGd99U
 knGA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1778696531; x=1779301331;
 h=mime-version:user-agent:message-id:date:face:references:in-reply-to
 :subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject
 :date:message-id:reply-to;
 bh=N+9Y5NQ1K0QOFiH+FovEtvYQAfT765/Hn1VyhGCtvQA=;
 b=EVRNT51SI1f+FUMM2Y4GlNMBIke+0ytCCdRdqlVzP7oKz+KMtgckOIVTMVY/tYzS4x
 d30O3sPTZBOJhKtoRP3A4Kvl77FfwJVb41i8mLxDIqBHx9v5ATc6VOMgXWeinCal/c0G
 UMX9rjHBWvJoStphjXXexNCd73vWoidnjECxYdivhwfyrdLN6eyqE0ExSu6zHDiJXOsf
 Xg7wvDfzKBQa6myITJgYex0MaeiiEO/baSEv7uVdiGvypIuPS4olMBXphaDWJrAnXF1A
 YE6kYNNx3ktO8+YEoLIUkQ2SkT3rl45uHKdCNyUPvaw5g/e5YaH2uO3Oz27vZWT+SYXA
 jkMg==
X-Forwarded-Encrypted: i=1;
 AFNElJ8Up1UAInFefS8UUPxCmOHa3wOa4arHbkre4rziStNzjpV679TJPWS27GkgSnzuyT5Q9z/LtQ==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YziUwdck9p4RPORmpldvQOV4ZeIC7LNcOBm1zJ1zBs/zaaoizsE
 PNbTWJPjCWaJQH8GVQ8DWt3+u8gKL77hU0yVFgjZNdfJDxwdASbijDSf
X-Gm-Gg: Acq92OETjGe1rPW61bQkbCMgXrEJ0Qza630rvkepanjm6yukKK66ARTq9VYUWgW2nnd
 csf8w6TkMhkpB0qV2WRcG0ykQGDuLzHSlwcWImEhyjq50qGP1sgo6Z0WPXxp8FsUY0fiqFdqVeI
 6Rpg+0Q1sXOhHijJzPHxYEyI8Tcua0nnDxkMrWmfaLktsjHK6hHVWrQrJP+DhoFcy7AWHwG7Eah
 pLUJRjJHg4/Sf0RVrkTZ8fftDqA/Yd6/ABgnZTtFm9rmCIesoONFIU21EZWqy17Ldvlg7jzLJ2Q
 fjaCAyeYTH8FGk4APN8zOi5LDxNOcRG8zm5SADdKCuPZ+O+fTHbpKGyA4Iu3Le3pHgKhEvJ5dwn
 9DaSAv9tkJqak7Sd1QbweL/qrGgxnaSUGyRDzjP7mHZEmfn7vBkzSzWHP9Jdc54yZ3fJNp4xQyj
 jThkr1gK0yORagGtroNmC++0+ccJrdM/QkvfNQcQMmafKQ1lunkxtoTTowYIUv5lxQLIYUZ/SCH
 KHcxW3o7Zk=
X-Received: by 2002:a05:7301:5781:b0:2dd:144b:6c2 with SMTP id
 5a478bee46e88-30119299926mr2589886eec.27.1778696530679; 
 Wed, 13 May 2026 11:22:10 -0700 (PDT)
Received: from MacBook-Pro.local ([185.153.176.28])
 by smtp.gmail.com with ESMTPSA id
 5a478bee46e88-2f8860ce1bfsm24202390eec.9.2026.05.13.11.22.07
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Wed, 13 May 2026 11:22:09 -0700 (PDT)
From: Rahul Martim Juliato <rahuljuliato@HIDDEN>
X-Google-Original-From: Rahul Martim Juliato <rahul.juliato@HIDDEN>
To: Yuan Fu <casouri@HIDDEN>
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
In-Reply-To: <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABhQTFRFDxIfFR9FMD+RM2CBkZPbZKPEn+Xt////lKVMgwAAAAFiS0dEAIgFHUgAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfqAhsDFwcfcr7WAAACY0lEQVRIx7VVWbLbMAwzBZG6/41LcJHXpl/Vm/G8OADBBWKOo44c//mM2yeoH7go/kqQG3zlucDxgwTzkwz9XVl+K8Z8igL5p4KYKbApCHDC5aGXn7EcD1KCkUl9154EtSJUJWwWIIJbZyLVIIgTguGdCobxQ4nLI3gRLECO9axcwgNYQi81yH5KhGXZ1oU7XSH3YUnQ488YsesOCWrwxYOAgAtW1ZCEZKxoNR4TCILXGnPbjJ65v8ZrbB4fbI02pUaelSjuDKboCS1LifMEg1HwaOpRvV/2Ylja5ekjafyFYU2AnGOTMagh5Qbrs6OngFxTkhFPxUYUZePl3iQnSB7Y+3gcvQocDSYeWOuDYorXZagzhioeqWVSH3ivfvS54/EcW8LvB2eTSJDtbtkJXeGTD/1FwCbMNI/pnC0CjYi3ej2HhDvOD121dGzGFyHgM+5DUnhLNc0lKm0OYptQsWPTJKPMMuil0rhU6+E51th4obJqinOMntOBM59pzlg0wmICoRc3ML5tgpzpODRdk02MQmaEL8YIhdEElJniQbvDRSh7DicV9qjmQFeFHA3mosS8EU6+8g2jV8dzc3jpTK0ZFwWObITvpXZv1MRJXDSOs6WskFcxVKqIlKPMJpzxp9I+udrjLx3tKfB9unHslNi/Wj9AZt8+mGEnnTmPIzMYM5ZENgp1XVghv+uN4/ZE7sf4gXJV9yvHJp1/7EvJlTlz
 pUspOFJt723pVYz9c2cpgHYfKSMXVz72TvL/rJqxL92+D2cGuelri9Nkc5wX6Hjf6cqEsoPptle/Vtllqb3eEPkHU2QXL+sLC8kAAAAASUVORK5CYII=
X-PGP-Key: https://www.rahuljuliato.com/rahul_pub_key.asc
Date: Wed, 13 May 2026 15:22:05 -0300
Message-ID: <m2mry3cgqa.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Debbugs-Envelope-To: 81019
Cc: Rahul Martim Juliato <rahuljuliato@HIDDEN>,
 =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>, 81019 <at> debbugs.gnu.org,
 Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Yuan Fu <casouri@HIDDEN> writes:

>> On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato <rahuljuliato=
@gmail.com> wrote:
>>=20
>> Hello,
>>=20
>> While debugging an "it doesn't fontify" report against markdown-ts-mode,
>> I ended up in treesit.el territory and would like a second opinion
>> before assuming I've correctly identified the layer the fix belongs in.
>>=20
>> The bug shows up easily in markdown-ts-mode but I suspect it can hit any
>> major mode that drives local parsers via `treesit-range-rules' with
>> `:local t'. markdown-ts just exercises that path very heavily (one local
>> `markdown-inline' parser per paragraph), so we are likely seeing
>> spoilers ahead of the html and other multi-parser modes.
>>=20
>>=20
>> How to Reproduce:
>> -----------------
>>=20
>> 1. emacs -Q on current master.
>> 2. M-x markdown-ts-mode.
>> 3. Insert a backtick code span on its own line, for example:
>>=20
>>       `foo`
>>=20
>>       `codium  `
>>=20
>>   typing the second line character by character and stopping right
>>   after the closing backtick. Do not press RET afterwards.
>>=20
>> 4. The first code span is fontified. The second is not.
>>=20
>> 5. Press RET. The second code span now fontifies correctly.
>>=20
>> `(font-lock-flush)' + `(font-lock-ensure)' do not fix it. Calling
>> `(treesit-parser-set-included-ranges PR same-ranges)' does not fix
>> it either. The only thing that fixes it without typing further is
>> deleting and recreating the local markdown-inline parser that covers
>> the range.
>>=20
>>=20
>> What is happening
>> -----------------
>>=20
>> The host markdown parser reparses fine and reports the new inline
>> node bounds. The local markdown-inline parser at that range,
>> however, keeps an outdated tree. I confirmed this directly in the
>> bugged buffer:
>>=20
>>  (buffer-substring 8 18) =3D> "`codium  `"
>>=20
>>  ;; existing local parser covering (8 . 18)
>>  (treesit-node-string (treesit-parser-root-node pr))
>>    =3D> "(inline)"
>>=20
>>  ;; force re-set ranges to the same value
>>  (treesit-parser-set-included-ranges pr '((8 . 18)))
>>  (treesit-node-string (treesit-parser-root-node pr))
>>    =3D> "(inline)"
>>=20
>>  ;; fresh parser, same buffer, same range
>>  (let ((new (treesit-parser-create 'markdown-inline nil t 'embedded)))
>>    (treesit-parser-set-included-ranges new '((8 . 18)))
>>    (treesit-node-string (treesit-parser-root-node new)))
>>    =3D> "(inline (code_span (code_span_delimiter)
>>                            (code_span_delimiter)))"
>>=20
>> So, same buffer, same range, same grammar, resulting in different tree
>> depending on whether the parser was reused across edits or created
>> fresh.
>>=20
>> So the grammar, the input, and the range are all fine. What is
>> wrong is the parser's accumulated incremental state.
>>=20
>> Reading `treesit--update-ranges-local', the reuse path goes through:
>>=20
>>  (treesit--set-embed-ranges range embedded-parser host-parser)
>>  (move-overlay ov r-start r-end)
>>  (overlay-put ov 'treesit-parser-ov-timestamp modified-tick)
>>=20
>> Tree-sitter is left to apply the buffered edits on top of its old
>> tree. For markdown-inline plus the backtick code_span rule, that
>> incremental update never re-fires the rule when the closing backtick
>> finally arrives, so the parser stays with `(inline)' empty.
>>=20
>> Pressing RET escapes the bug. I am not certain why, two candidates:
>> the newline grows the host paragraph past the overlay bounds and
>> `treesit--cleanup-local-range-overlays' deletes the old overlay on
>> the timestamp mismatch, after which a fresh parser is created; or
>> the larger range shift is enough to make tree-sitter invalidate the
>> right subtree and re-evaluate code_span. Either way the practical
>> outcome is the same: only a fresh parser fixes it.
>>=20
>>=20
>> My workaround on markdown-ts-mode (for debugging)=20
>> -------------------------------------------------
>>=20
>> I made this small interactive helper to help me find the local parser
>> covering point which would them delete its parser + overlay, and create
>> a fresh one on the same range:
>>=20
>>  (defun my/md-recreate-inline-parser-at-point ()
>>    "Delete stale local markdown-inline parser+overlay covering point, re=
create."
>>    (interactive)
>>    (let* ((p (point))
>>           (target-ov
>>            (catch 'f
>>              (dolist (ov (overlays-in (point-min) (point-max)))
>>                (let ((pr (overlay-get ov 'treesit-parser)))
>>                  (when (and pr
>>                             (overlay-get ov 'treesit-parser-local-p)
>>                             (eq (treesit-parser-language pr) 'markdown-i=
nline)
>>                             (<=3D (overlay-start ov) p (overlay-end ov)))
>>                    (throw 'f ov)))))))
>>      (unless target-ov (user-error "No markdown-inline overlay covers po=
int"))
>>      (let* ((old-pr (overlay-get target-ov 'treesit-parser))
>>             (host (overlay-get target-ov 'treesit-host-parser))
>>             (level (treesit-parser-embed-level old-pr))
>>             (r-start (overlay-start target-ov))
>>             (r-end (overlay-end target-ov)))
>>        (treesit-parser-delete old-pr)
>>        (delete-overlay target-ov)
>>        (let ((new (treesit-parser-create 'markdown-inline nil t 'embedde=
d))
>>              (ov (make-overlay r-start r-end nil nil t)))
>>          (treesit-parser-set-embed-level new level)
>>          (overlay-put ov 'treesit-parser new)
>>          (overlay-put ov 'treesit-parser-local-p t)
>>          (overlay-put ov 'treesit-host-parser host)
>>          (overlay-put ov 'treesit-parser-ov-timestamp (buffer-chars-modi=
fied-tick))
>>          (treesit-parser-set-included-ranges new `((,r-start . ,r-end)))
>>          (font-lock-flush r-start r-end)
>>          (message "Recreated markdown-inline parser for (%d . %d)" r-sta=
rt r-end)))))
>>=20
>> This always recovers the buffer's fontification immediately.
>>=20
>>=20
>> A possible treesit.el patch
>> ---------------------------
>>=20
>> The change I have been testing locally is small: in
>> `treesit--update-ranges-local', only reuse an existing local-parser
>> overlay when its bounds already match the new range exactly. If the
>> overlay would have to move, do not reuse it. Let
>> `treesit--cleanup-local-range-overlays' delete it on the timestamp
>> mismatch and the existing "create new" branch will produce a fresh
>> parser on the right range.
>>=20
>>     lisp/treesit.el | 11 +++++++++--
>>     1 file changed, 9 insertions(+), 2 deletions(-)
>>=20
>>    diff --git a/lisp/treesit.el b/lisp/treesit.el
>>    index 01e82b56bb8..d80e4fe312d 100644
>>    --- a/lisp/treesit.el
>>    +++ b/lisp/treesit.el
>>    @@ -1248,10 +1248,17 @@ treesit--update-ranges-local
>>                                                      embedded-parser)))
>>                             (when (and (overlay-get ov 'treesit-parser-l=
ocal-p)
>>                                        (eq parser-lang embedded-lang)
>>    -                                   (eq embed-level parser-level))
>>    +                                   (eq embed-level parser-level)
>>    +                                   ;; Only reuse if overlay bounds m=
atch
>>    +                                   ;; the new range exactly.  Reusing
>>    +                                   ;; across range moves can leave t=
he
>>    +                                   ;; embedded parser with a stale
>>    +                                   ;; incremental tree (bug seen with
>>    +                                   ;; markdown-inline code_span).
>>    +                                   (=3D (overlay-start ov) r-start)
>>    +                                   (=3D (overlay-end ov) r-end))
>>                               (treesit--set-embed-ranges
>>                                range embedded-parser host-parser)
>>    -                          (move-overlay ov r-start r-end)
>>                               (overlay-put ov 'treesit-parser-ov-timesta=
mp
>>                                            modified-tick)
>>                               (throw 'done embedded-parser)))))))
>>=20
>>=20
>> With this in place the markdown-ts reproduction fontifies as you type,
>> no RET needed, no recreate helper needed.
>>=20
>> I am very aware this is potentially a sledgehammer. It forces a fresh
>> local parser on every range change, throwing away tree-sitter's
>> incremental work for that subtree. For modes that just rely on local
>> parsers for fontification it should be fine, but it may not be the right
>> answer if the rest of treesit depends on parser identity surviving
>> across range moves.
>>=20
>>=20
>> Where I am not sure
>> -------------------
>>=20
>> 1. Is this the right layer to address? My patch is in
>>   `treesit--update-ranges-local'. It feels like the deeper truth could
>>   live in `treesit.c''s edit replay when ranges shift, where
>>   `need_reparse' for a local parser does not get set even though its
>>   tree is stale. The C code is quiet on local parser treatment, so it
>>   is hard to tell from outside whether primary-parser reparse
>>   notifications are supposed to propagate to local parsers in this
>>   case.
>>=20
>> 2. Is there a one-liner I am missing on the elisp side? For example a
>>   call I should be making after `treesit-parser-set-included-ranges' to
>>   force the parser to throw away its cached tree.
>>=20
>> 3. Or is the right fix on the grammar side, in tree-sitter-markdown's
>>   incremental behaviour around backtick spans, in which case treesit
>>   should probably still gain a way to recover.
>>=20
>> 4. As mentioned at the top, I believe any `:local t' range rule could
>>   reach this state. markdown-ts is the first heavy customer, but the
>>   html-embedded modes look structurally similar enough that they would
>>   hit it too, just less often.
>>=20
>> If the analysis is correct but the proposed fix is not, I would be happy
>> to revise the diff. If the analysis itself is wrong, I would also very
>> much appreciate corrections so we can avoid carrying the helper above.
>>=20
>> I am mostly interested in validating the analysis here. I am not
>> attached to this particular fix, and would be perfectly happy if a
>> different implementation lands instead.
>>=20
>> Thanks for reading,
>
> Thanks for the investigation. Before knowing more I can=E2=80=99t tell if=
 this should be fixed at the treesit.el level or treesit.c level. But I=E2=
=80=99m still at the stage of trying to reproduce it. So the reproduce step=
 is:
>
> 1. Type `code` RET
> 2. Type `code`
>
> And at this point the second `code` should be unfortified? Even with
> latest master and tree-sitter, I can=E2=80=99t reproduce it. And if I get
> latest markdown without my patch, opening a markdown file just crashes
> Emacs. I=E2=80=99ll try to get my patch merged upstream.
>
> Yuan


Hi there Yuan!

Thanks for helping!

I'm on master, stopped on:

*  (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 ; *
   lisp/treesit.el (treesit--update-ranges-local): Fix let-binding.


To reproduce:

```markdown

`foo`

`bar    `       (you can add spaces here too, only RET refontifies)


```

One detail, we are inserting ` manually so, no `` and then filling in
(in this case the bug won't trigger). Also, if you copy/paste and then
edit it, the bug won't trigger, only on "manual typing".

I tested using M-: (insert-char ?`) RET and this *does* trigger the bug.


Please find the updated markdown-ts-mode.el and markdown-ts-mode-x.el
attached.


These files contain all the latest bug fixes we are trying to push to
the Emacs 31 branch (disscussion with Jo=C3=A3o from Eglot helping on get
everything installed is happening on #bug81023
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D81023).


Maybe it is easier to navigate diffs / read docs (if you need) / check
what patches are pending in my mirror branch:
https://github.com/LionyxML/emacs-mirror/commits/feat/markdown-ts-mode/.


Let me know if we can help you with anything else.


--=20
Rahul Martim Juliato


--=-=-=
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=markdown-ts-mode-x.el
Content-Transfer-Encoding: base64

Ozs7IG1hcmtkb3duLXRzLW1vZGUteC5lbCAtLS0gbWFya2Rvd24tdHMtbW9kZSBleHRyYXMgLSot
IGxleGljYWwtYmluZGluZzogdDsgLSotCgo7OyBDb3B5cmlnaHQgKEMpIDIwMjYgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgo7OyBBdXRob3IgICAgICAgICAgIDogUmFodWwgTWFydGlt
IEp1bGlhdG8gPHJhaHVsLmp1bGlhdG9AZ21haWwuY29tPgo7OyAgICAgICAgICAgICAgICAgIDog
U3TDqXBoYW5lIE1hcmtzIDxzaGlwbWludHNAZ21haWwuY29tPgo7OyBNYWludGFpbmVyICAgICAg
IDogUmFodWwgTWFydGltIEp1bGlhdG8gPHJhaHVsLmp1bGlhdG9AZ21haWwuY29tPgo7OyBDcmVh
dGVkICAgICAgICAgIDogQXByaWwgMjAyNgo7OyBWZXJzaW9uICAgICAgICAgIDogMS4wCjs7IFBh
Y2thZ2UtUmVxdWlyZXMgOiAoKGVtYWNzICIzMS4xIikpCjs7IEtleXdvcmRzICAgICAgICAgOiBt
YXJrZG93biBtZCB0ZXh0IGVkaXQgbGFuZ3VhZ2VzIHRyZWUtc2l0dGVyCgo7OyBUaGlzIGZpbGUg
aXMgcGFydCBvZiBHTlUgRW1hY3MuCgo7OyBHTlUgRW1hY3MgaXMgZnJlZSBzb2Z0d2FyZTogeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo7OyBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo7OyB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNl
LCBvcgo7OyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKOzsgR05VIEVtYWNz
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCjs7IGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCjs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUKOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KCjs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCjs7IGFsb25nIHdpdGggR05VIEVtYWNzLiAgSWYgbm90LCBzZWUgPGh0
dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KCjs7OyBDb21tZW50YXJ5OgoKOzs7IENvZGU6
CgoocmVxdWlyZSAnbWFya2Rvd24tdHMtbW9kZSkKCjs7OyBDb252ZW5pZW5jZToKCihkZWZjb25z
dCBtYXJrZG93bi10cy1jb21tb25tYXJrLXNwZWMtdXJsCiAgImh0dHBzOi8vc3BlYy5jb21tb25t
YXJrLm9yZy9jdXJyZW50LyIpCgooZGVmY29uc3QgbWFya2Rvd24tdHMtZ2ZtLXNwZWMtdXJsCiAg
Imh0dHBzOi8vZ2l0aHViLmdpdGh1Yi5jb20vZ2ZtLyIpCgooZGVmdW4gbWFya2Rvd24tdHMtYnJv
d3NlLWNvbW1vbm1hcmstc3BlYyAoKQogICJCcm93c2UgdGhlIENvbW1vbk1hcmsgTWFya2Rvd24g
c3BlYyBpbiBhIHdlYiBicm93c2VyLiIKICAoaW50ZXJhY3RpdmUpCiAgKGJyb3dzZS11cmwgbWFy
a2Rvd24tdHMtY29tbW9ubWFyay1zcGVjLXVybCkpCgooZGVmdW4gbWFya2Rvd24tdHMtYnJvd3Nl
LWdmbS1zcGVjICgpCiAgIkJyb3dzZSB0aGUgR2l0SHViIEZsYXZvcmVkIE1hcmtkb3duIHNwZWMg
aW4gYSB3ZWIgYnJvd3Nlci4iCiAgKGludGVyYWN0aXZlKQogIChicm93c2UtdXJsIG1hcmtkb3du
LXRzLWdmbS1zcGVjLXVybCkpCgo7OzsgRXhwb3J0IGFuZCBwcmV2aWV3OgoKKGRlZmdyb3VwIG1h
cmtkb3duLXRzLWNvbnZlcnQgbmlsCiAgIkNvbnZlcnQgYG1hcmtkb3duLXRzLW1vZGUnIGJ1ZmZl
cnMgb3IgZmlsZXMuIgogIDpwcmVmaXggIm1hcmtkb3duLXRzLWNvbnZlcnQtIgogIDpncm91cCAn
dGV4dAogIDpncm91cCAnZWRpdGluZwogIDp2ZXJzaW9uICIzMS4xIikKCihkZWZjdXN0b20gbWFy
a2Rvd24tdHMtZGVmYXVsdC1jb252ZXJ0ZXIgbmlsCiAgIkRlZmF1bHQgTWFya2Rvd24gZm9ybWF0
IGFuZCBjb252ZXJ0ZXIuCklmIG5pbCwgeW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIGEgZm9ybWF0
IGFuZCBhIGNvbnZlcnRlci4KU2VlIGBtYXJrZG93bi10cy1jb252ZXJ0ZXJzJy4iCiAgOnR5cGUg
JyhjaG9pY2UgKGNvbnN0IDp0YWcgIlByb21wdCBmb3IgZm9ybWF0IGFuZCBjb252ZXJ0ZXIiIG5p
bCkKICAgICAgICAgICAgICAgICAoY29uc3QgOnRhZyAiUERGIHZpYSBQYW5kb2MiIChwZGYgLiBw
YW5kb2MpKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJIVE1MIHZpYSBQYW5kb2MiICho
dG1sIC4gcGFuZG9jKSkKICAgICAgICAgICAgICAgICAoY29uc3QgOnRhZyAiSFRNTCB2aWEgY21h
cmsiIChodG1sIC4gY21hcmspKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJIVE1MIHZp
YSBjbWFyay1nZm0gKEdpdEh1YiBiZWxscyBhbmQgd2hpc3RsZXMpIiAoaHRtbCAuIGNtYXJrLWdm
bSkpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIkhUTUwgdmlhIG1hcmtkb3duIiAoaHRt
bCAuIG1hcmtkb3duKSkKICAgICAgICAgICAgICAgICAoY29uc3QgOnRhZyAiSFRNTCB2aWEgbWFy
a2Rvd24ucGwiIChodG1sIC4gbWFya2Rvd24ucGwpKQogICAgICAgICAgICAgICAgIChjb25zICA6
dGFnICJGb3JtYXQgYW5kIENvbnZlcnRlciIKICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJv
bCA6dGFnICJGb3JtYXQiKQogICAgICAgICAgICAgICAgICAgICAgICAoc3ltYm9sIDp0YWcgIkNv
bnZlcnRlciIpKSkKICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAiKQoK
KGRlZmN1c3RvbSBtYXJrZG93bi10cy1jb252ZXJ0LWRpc3BsYXktZnVuY3Rpb24gIydld3ctb3Bl
bi1maWxlCiAgIkZ1bmN0aW9uIHRvIGRpc3BsYXkgY29udmVydGVkIE1hcmtkb3duIHRoZSBvdXRw
dXQgZmlsZS4KVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCwgdGhlIGZp
bGUgbmFtZS4iCiAgOnR5cGUgJyhjaG9pY2UgKGNvbnN0IDp0YWcgIkRpc3BsYXkgdXNpbmcgYGV3
dyciIGV3dy1vcGVuLWZpbGUpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIkRpc3BsYXkg
aW4gYSBicm93c2VyIiBicm93c2UtdXJsLW9mLWZpbGUpCiAgICAgICAgICAgICAgICAgKGNvbnN0
IDp0YWcgIkRpc3BsYXkgb3V0cHV0IGZpbGUgaW4gYSBidWZmZXIiIGZpbmQtZmlsZS1vdGhlci13
aW5kb3cpCiAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uIDp0YWcgIk90aGVyIGZ1bmN0aW9uIikp
CiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCihkZWZjb25zdCBt
YXJrZG93bi10cy0tY29udmVydC1lcnJvci1idWZmZXIKICAiKm1hcmtkb3duLXRzLWNvbnZlcnQg
ZXJyb3JzKiIpCgooZGVmY29uc3QgbWFya2Rvd24tdHMtLWNvbnZlcnQtb3V0cHV0LWJ1ZmZlcgog
ICIqbWFya2Rvd24tdHMtY29udmVydCBvdXRwdXQqIikKCih0cmVlc2l0LWRlY2xhcmUtdW5hdmFp
bGFibGUtZnVuY3Rpb25zKQoKKGRlZnZhciBtYXJrZG93bi10cy1jb252ZXJ0ZXJzCiAgKGxpc3QK
ICAgKGNvbnMgJ2h0bWwKICAgICAgICAgKGxpc3QKICAgICAgICAgIChjb25zICdwYW5kb2MKICAg
ICAgICAgICAgICAgIChsaXN0IDpjb21tYW5kICJwYW5kb2MiCiAgICAgICAgICAgICAgICAgICAg
ICA6aW5wdXQgJyhmaWxlIHN0ZGluKQogICAgICAgICAgICAgICAgICAgICAgOm91dHB1dCAnKGZp
bGUpCiAgICAgICAgICAgICAgICAgICAgICA6YXJndW1lbnRzLWZ1bmN0aW9uCiAgICAgICAgICAg
ICAgICAgICAgICAobGFtYmRhIChpbnB1dC1maWxlIG91dHB1dC1maWxlKQogICAgICAgICAgICAg
ICAgICAgICAgICAoYXBwZW5kIChsaXN0ICItZiIgImdmbSIKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAiLXQiICJodG1sNSIKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiLS1zdGFuZGFsb25lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICItbyIgb3V0cHV0LWZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KHdoZW4gaW5wdXQtZmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3Qg
aW5wdXQtZmlsZSkpKSkpKQogICAgICAgICAgKGNvbnMgJ2NtYXJrCiAgICAgICAgICAgICAgICAo
bGlzdCA6Y29tbWFuZCAiY21hcmsiCiAgICAgICAgICAgICAgICAgICAgICA6aW5wdXQgJyhmaWxl
IHN0ZGluKQogICAgICAgICAgICAgICAgICAgICAgOm91dHB1dCAnKHN0ZG91dCkKICAgICAgICAg
ICAgICAgICAgICAgIDphcmd1bWVudHMtZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgIChs
YW1iZGEgKGlucHV0LWZpbGUgX291dHB1dC1maWxlKQogICAgICAgICAgICAgICAgICAgICAgICAo
YXBwZW5kIChsaXN0ICItdCIgImh0bWwiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICh3aGVuIGlucHV0LWZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0
IGlucHV0LWZpbGUpKSkpKSkKICAgICAgICAgIChjb25zICdjbWFyay1nZm0KICAgICAgICAgICAg
ICAgIChsaXN0IDpjb21tYW5kICJjbWFyay1nZm0iCiAgICAgICAgICAgICAgICAgICAgICA6aW5w
dXQgJyhmaWxlIHN0ZGluKQogICAgICAgICAgICAgICAgICAgICAgOm91dHB1dCAnKHN0ZG91dCkK
ICAgICAgICAgICAgICAgICAgICAgIDphcmd1bWVudHMtZnVuY3Rpb24KICAgICAgICAgICAgICAg
ICAgICAgIChsYW1iZGEgKGlucHV0LWZpbGUgX291dHB1dC1maWxlKQogICAgICAgICAgICAgICAg
ICAgICAgICAoYXBwZW5kIChsaXN0ICItdCIgImh0bWwiCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgOzsgVXNlIEdpdEh1Yi1zdHlsZSA8cHJlIGxhbmc+IGZvciBjb2RlIGJs
b2NrcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWdpdGh1Yi1wcmUt
bGFuZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBJbmNsdWRlIHJl
bWFpbmRlciBvZiBjb2RlIGJsb2NrIGluZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA7OyBzdHJpbmcgaW4gYSBzZXBhcmF0ZSBhdHRyaWJ1dGUuCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIi0tZnVsbC1pbmZvLXN0cmluZyIKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBVc2Ugc3R5bGUgYXR0cmlidXRlcyB0byBhbGln
biB0YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGNlbGxzIGlu
c3RlYWQgb2YgYWxpZ24gYXR0cmlidXRlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiLS10YWJsZS1wcmVmZXItc3R5bGUtYXR0cmlidXRlcyIKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAiLS1leHRlbnNpb24iICJmb290bm90ZXMiCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZXh0ZW5zaW9uIiAidGFibGUiCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZXh0ZW5zaW9uIiAic3RyaWtldGhy
b3VnaCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1leHRlbnNpb24i
ICJhdXRvbGluayIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1leHRl
bnNpb24iICJ0YWdmaWx0ZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ii0tZXh0ZW5zaW9uIiAidGFza2xpc3QiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICh3aGVuIGlucHV0LWZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0
IGlucHV0LWZpbGUpKSkpKSkKICAgICAgICAgIDs7ICdtYXJrZG93bi5wbCBpcyB0aGUgc2FtZSBh
cyAnbWFya2Rvd24gd2l0aCBhbm90aGVyIGNvbW1vbiBmaWxlCiAgICAgICAgICA7OyBuYW1lLgog
ICAgICAgICAgKGNvbnMgJ21hcmtkb3duLnBsCiAgICAgICAgICAgICAgICAobGlzdCA6Y29tbWFu
ZCAibWFya2Rvd24ucGwiCiAgICAgICAgICAgICAgICAgICAgICA6aW5wdXQgJyhmaWxlIHN0ZGlu
KQogICAgICAgICAgICAgICAgICAgICAgOm91dHB1dCAnKHN0ZG91dCkKICAgICAgICAgICAgICAg
ICAgICAgIDphcmd1bWVudHMtZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEg
KGlucHV0LWZpbGUgX291dHB1dC1maWxlKQogICAgICAgICAgICAgICAgICAgICAgICAoYXBwZW5k
IChsaXN0ICItLWh0bWw0dGFncyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdo
ZW4gaW5wdXQtZmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgIi0t
IiBpbnB1dC1maWxlKSkpKSkpCiAgICAgICAgICA7OyAnbWFya2Rvd24gaXMgdGhlIHNhbWUgYXMg
J21hcmtkb3duLnBsIHdpdGggYW5vdGhlciBjb21tb24gZmlsZQogICAgICAgICAgOzsgbmFtZS4K
ICAgICAgICAgIChjb25zICdtYXJrZG93bgogICAgICAgICAgICAgICAgKGxpc3QgOmNvbW1hbmQg
Im1hcmtkb3duIgogICAgICAgICAgICAgICAgICAgICAgOmlucHV0ICcoZmlsZSBzdGRpbikKICAg
ICAgICAgICAgICAgICAgICAgIDpvdXRwdXQgJyhzdGRvdXQpCiAgICAgICAgICAgICAgICAgICAg
ICA6YXJndW1lbnRzLWZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChpbnB1
dC1maWxlIF9vdXRwdXQtZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgKGFwcGVuZCAobGlz
dCAiLS1odG1sNHRhZ3MiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuIGlu
cHV0LWZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0ICItLSIgaW5w
dXQtZmlsZSkpKSkpKSkpCiAgIChjb25zICdwZGYKICAgICAgICAgKGxpc3QKICAgICAgICAgIChj
b25zICdwYW5kb2MKICAgICAgICAgICAgICAgIChsaXN0IDpjb21tYW5kICJwYW5kb2MiCiAgICAg
ICAgICAgICAgICAgICAgICA6aW5wdXQgJyhmaWxlIHN0ZGluKQogICAgICAgICAgICAgICAgICAg
ICAgOm91dHB1dCAnKGZpbGUpCiAgICAgICAgICAgICAgICAgICAgICA6YXJndW1lbnRzLWZ1bmN0
aW9uCiAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChpbnB1dC1maWxlIG91dHB1dC1maWxl
KQogICAgICAgICAgICAgICAgICAgICAgICAoYXBwZW5kIChsaXN0ICItZiIgImdmbSIKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLXQiICJwZGYiCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIi1vIiBvdXRwdXQtZmlsZSkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAod2hlbiBpbnB1dC1maWxlCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAobGlzdCBpbnB1dC1maWxlKSkpKSkpKSkpCiAgIkFuIGFsaXN0IG9mIGZvcm1h
dC9jb252ZXJ0ZXIgY29uZmlndXJhdGlvbnMuCkl0IGlzIGEgdHdvIGxldmVsIGFsaXN0IHdpdGgg
dGhlIGZpcnN0IGxldmVsIGJlaW5nIGZvcm1hdCwgZm9yIGV4YW1wbGUKYGh0bWwnIG9yIGBwZGYn
LCBhbmQgdGhlIHNlY29uZCBiZWluZyB0aGUgY29udmVydGVyIG5hbWUsIGZvciBleGFtcGxlCmBw
YW5kb2MnLiAgQSBjb252ZXJ0ZXIgY29uZmlndXJhdGlvbiBlbnRyeSBpcyBhIHBsaXN0IG9mIHRo
ZSBmb3JtOgoKICBcXD0nKDpjb21tYW5kIFwiY29tbWFuZCBuYW1lXCIKICAgIDppbnB1dCAoZmls
ZSBzdGRpbikgOyBhY2NlcHRzIGZpbGUgbmFtZSBvciBzdGRpbgogICAgOm91dHB1dCAoc3Rkb3V0
KSAgICA7IHByb2R1Y2VzIHN0ZG91dCBvbmx5CiAgICA6YXJndW1lbnRzLWZ1bmN0aW9uIDsgZnVu
Y3Rpb247IGUuZy4sCiAgICAgKGxhbWJkYSAoaW5wdXQtZmlsZSBfb3V0cHV0LWZpbGUpCiAgICAg
ICAoYXBwZW5kIChsaXN0IFwiLXRcIiBcImh0bWxcIikKICAgICAgICAgICAgICAgKHdoZW4gaW5w
dXQtZmlsZQogICAgICAgICAgICAgICAgIChsaXN0IGlucHV0LWZpbGUpKSkpKQoKYGFyZ3VtZW50
cy1mdW5jdGlvbicgaXMgcGFzc2VkIHR3byBhcmd1bWVudHMsIElOUFVULUZJTEUgYW5kCk9VVFBV
VC1GSUxFLiAgSWYgSU5QVVQtRklMRSBpcyBuaWwsIGFzc3VtZSBzdGRpbiwgb3IgaXQgaXMgYQpm
dWxseS1xdWFsaWZpZWQgZmlsZSBuYW1lLiAgSWYgT1VUUFVULUZJTEUgaXMgbmlsLCBhc3N1bWUg
c3Rkb3V0LCBvciBpdAppcyBhIGZ1bGx5LXF1YWxpZmllZCBmaWxlIG5hbWUuICBJdCBzaG91bGQg
cmV0dXJuIGEgbGlzdCBvZgphcmd1bWVudHMgc3VpdGFibGUgZm9yIGBjYWxsLXByb2Nlc3MnLiIp
Cgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gbWFya2Rvd24tdHMtY29udmVydC1maWxlIChpbnB1dC1m
aWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25hbAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgb3V0cHV0LWZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxh
eSBvdmVyd3JpdGUgcXVpZXQpCiAgIkNvbnZlcnQgTWFya2Rvd24gSU5QVVQtRklMRSB0byBGT1JN
QVQuCklmIG9wdGlvbmFsIERJU1BMQVkgaXMgbm9uLW5pbCwgc2hvdyB0aGUgb3V0cHV0IGZpbGUg
aW4gYSBidWZmZXIsIGlmCnBvc3NpYmxlLCB1c2luZyB0aGUgZnVuY3Rpb24gYG1hcmtkb3duLXRz
LWNvbnZlcnQtZGlzcGxheS1mdW5jdGlvbicuCgpXaXRoIGEgcHJlZml4IGFyZ3VtZW50LCBESVNQ
TEFZIHdpbGwgYmUgbm9uLW5pbC4KCk9wdGlvbmFsIEZPUk1BVCBpcyBhIGZvcm1hdC9jb252ZXJ0
ZXIgcGFpciBzcGVjaWZpZWQgYXMgYSBjb25zClxcPScoZm9ybWF0IC4gY29udmVydGVyKSBmb3Ig
ZXhhbXBsZSBcXD0nKGh0bWwgLiBwYW5kb2MpLiAgU2VlCmBtYXJrZG93bi10cy1jb252ZXJ0ZXJz
Jy4gIElmIG5pbCwgcHJvbXB0IGZvciB0aGUgZm9ybWF0IGFuZCBjb252ZXJ0ZXIuCgpJZiBvcHRp
b25hbCBPVkVSV1JJVEUgaXMgbm9uLW5pbCwgc2lsZW50bHkgb3ZlcndyaXRlIE9VVFBVVC1GSUxF
IGlmIGl0CmV4aXN0cy4KCklmIFFVSUVUIGlzIG5vbi1uaWwsIGluaGliaXQgc2hvd2luZyBjb252
ZXJzaW9uIHdhcm5pbmdzIG9yIGVycm9ycy4KClRoZSBleHRlcm5hbCBleGVjdXRhYmxlIHNwZWNp
ZmllZCBieSBhIGNvbnZlcnRlciBtdXN0IGJlIGluc3RhbGxlZCBhbmQKZm91bmQ7IHNlZSB0aGUg
dmFyaWFibGUgYGV4ZWMtcGF0aCcuIgogIChpbnRlcmFjdGl2ZSAiZkNvbnZlcnQgTWFya2Rvd24g
ZmlsZTogIikKICAobWFya2Rvd24tdHMtY29udmVydCBpbnB1dC1maWxlIG91dHB1dC1maWxlCiAg
ICAgICAgICAgICAgICAgICAgICAgZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgICAgKG9yIGRp
c3BsYXkgY3VycmVudC1wcmVmaXgtYXJnKQogICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0
ZQogICAgICAgICAgICAgICAgICAgICAgIHF1aWV0KSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBt
YXJrZG93bi10cy1jb252ZXJ0ICgmb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlucHV0LWZpbGUgb3V0cHV0LWZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1h
dCBkaXNwbGF5IG92ZXJ3cml0ZSBxdWlldCkKICAiQ29udmVydCBhIGBtYXJrZG93bi10cy1tb2Rl
JyBidWZmZXIgb3IgZmlsZSB0byBGT1JNQVQuCkNvbnZlcnQgSU5QVVQtRklMRSB0byBPVVRQVVQt
RklMRS4KCklmIElOUFVULUZJTEUgaXMgbmlsLCB1c2UgdGhlIGN1cnJlbnQgYnVmZmVyLgoKSWYg
T1VUUFVULUZJTEUgaXMgbmlsLCBwcm9tcHQgZm9yIGFuIG91dHB1dCBmaWxlLgoKT3B0aW9uYWwg
Rk9STUFUIGlzIGEgZm9ybWF0L2NvbnZlcnRlciBwYWlyIHNwZWNpZmllZCBhcyBhIGNvbnMKXFw9
Jyhmb3JtYXQgLiBjb252ZXJ0ZXIpIGZvciBleGFtcGxlIFxcPScoaHRtbCAuIHBhbmRvYykuICBT
ZWUKYG1hcmtkb3duLXRzLWNvbnZlcnRlcnMnLiAgSWYgbmlsLCBwcm9tcHQgZm9yIHRoZSBmb3Jt
YXQgYW5kIGNvbnZlcnRlci4KCklmIG9wdGlvbmFsIERJU1BMQVkgaXMgbm9uLW5pbCwgc2hvdyB0
aGUgb3V0cHV0IGZpbGUgaW4gYSBidWZmZXIsIGlmCnBvc3NpYmxlLCB1c2luZyB0aGUgZnVuY3Rp
b24gYG1hcmtkb3duLXRzLWNvbnZlcnQtZGlzcGxheS1mdW5jdGlvbicuCgpXaXRoIGEgcHJlZml4
IGFyZ3VtZW50LCBESVNQTEFZIHdpbGwgYmUgbm9uLW5pbC4KCklmIG9wdGlvbmFsIE9WRVJXUklU
RSBpcyBub24tbmlsLCBzaWxlbnRseSBvdmVyd3JpdGUgT1VUUFVULUZJTEUgaWYgaXQKZXhpc3Rz
LgoKSWYgUVVJRVQgaXMgbm9uLW5pbCwgaW5oaWJpdCBzaG93aW5nIGNvbnZlcnNpb24gd2Fybmlu
Z3Mgb3IgZXJyb3JzLgoKVGhlIGV4dGVybmFsIGV4ZWN1dGFibGUgc3BlY2lmaWVkIGJ5IGEgY29u
dmVydGVyIG11c3QgYmUgaW5zdGFsbGVkIGFuZApmb3VuZDsgc2VlIHRoZSB2YXJpYWJsZSBgZXhl
Yy1wYXRoJy4iCiAgKGludGVyYWN0aXZlKQogICh3aGVuIChhbmQgaW5wdXQtZmlsZQogICAgICAg
ICAgICAgKGVxdWFsIGJ1ZmZlci1maWxlLW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgaW5wdXQtZmls
ZSkpCiAgICAgICAgICAgICAoYnVmZmVyLW1vZGlmaWVkLXApKQogICAgKHdoZW4gKHllcy1vci1u
by1wICJTYXZlIG1vZGlmaWVkIGJ1ZmZlciBiZWZvcmUgY29udmVydGluZz8gIikKICAgICAgKHNh
dmUtYnVmZmVyKSkpCiAgKHVubGVzcyBpbnB1dC1maWxlCiAgICAobWFya2Rvd24tdHMtLWJhcmYt
aWYtbm90LW1vZGUgJ21hcmtkb3duLXRzLWNvbnZlcnQpKQoKICAoc2V0cSBkaXNwbGF5IChvciBk
aXNwbGF5IGN1cnJlbnQtcHJlZml4LWFyZykpCgogIChsZXQqICgoY29udmVydGVyLWZvcm1hdAog
ICAgICAgICAgKG9yIChjYXIgZm9ybWF0KQogICAgICAgICAgICAgIChjYXIgbWFya2Rvd24tdHMt
ZGVmYXVsdC1jb252ZXJ0ZXIpCiAgICAgICAgICAgICAgKGludGVybgogICAgICAgICAgICAgICAo
Y29tcGxldGluZy1yZWFkCiAgICAgICAgICAgICAgICAiU2VsZWN0IGFuIG91dHB1dCBmb3JtYXQ6
ICIKICAgICAgICAgICAgICAgIChtYXBjYXIgKGxhbWJkYSAoZWx0KSAoc3ltYm9sLW5hbWUgKGNh
ciBlbHQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtY29udmVydGVycykK
ICAgICAgICAgICAgICAgIG5pbAogICAgICAgICAgICAgICAgdAogICAgICAgICAgICAgICAgbmls
CiAgICAgICAgICAgICAgICAnbWFya2Rvd24tdHMtY29udmVydGVyLWZvcm1hdCkpKSkKICAgICAg
ICAgKGNvbnZlcnRlcgogICAgICAgICAgKG9yIChjZHIgZm9ybWF0KQogICAgICAgICAgICAgIChj
ZHIgbWFya2Rvd24tdHMtZGVmYXVsdC1jb252ZXJ0ZXIpCiAgICAgICAgICAgICAgKGludGVybgog
ICAgICAgICAgICAgICAoY29tcGxldGluZy1yZWFkCiAgICAgICAgICAgICAgICAiU2VsZWN0IGEg
Y29udmVydGVyOiAiCiAgICAgICAgICAgICAgICAobWFwY2FyIChsYW1iZGEgKGVsdCkgKHN5bWJv
bC1uYW1lIChjYXIgZWx0KSkpCiAgICAgICAgICAgICAgICAgICAgICAgIChhbGlzdC1nZXQgY29u
dmVydGVyLWZvcm1hdCBtYXJrZG93bi10cy1jb252ZXJ0ZXJzKSkKICAgICAgICAgICAgICAgIG5p
bAogICAgICAgICAgICAgICAgdAogICAgICAgICAgICAgICAgbmlsCiAgICAgICAgICAgICAgICAn
bWFya2Rvd24tdHMtY29udmVydGVyKSkpKQogICAgICAgICAoY29uZmlnIChhbGlzdC1nZXQgY29u
dmVydGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxpc3QtZ2V0IGNvbnZlcnRlci1m
b3JtYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMt
Y29udmVydGVycykpKQogICAgICAgICAoY29tbWFuZCAocGxpc3QtZ2V0IGNvbmZpZyA6Y29tbWFu
ZCkpCiAgICAgICAgIChjb21tYW5kLWlucHV0IChwbGlzdC1nZXQgY29uZmlnIDppbnB1dCkpCiAg
ICAgICAgIChjb21tYW5kLW91dHB1dCAocGxpc3QtZ2V0IGNvbmZpZyA6b3V0cHV0KSkKICAgICAg
ICAgKHN0ZGluLW9ubHkgKGVxdWFsIGNvbW1hbmQtaW5wdXQgJyhzdGRpbikpKQogICAgICAgICAo
c3Rkb3V0LW9ubHkgKGVxdWFsIGNvbW1hbmQtb3V0cHV0ICcoc3Rkb3V0KSkpKQogICAgKHVubGVz
cyBvdXRwdXQtZmlsZQogICAgICAoc2V0cSBvdXRwdXQtZmlsZQogICAgICAgICAgICAocmVhZC1m
aWxlLW5hbWUgIk91dHB1dCBmaWxlIG5hbWU6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5pbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQgKGZpbGUtbmFt
ZS1zYW5zLWV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZp
bGUtcmVsYXRpdmUtbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChv
ciBpbnB1dC1maWxlIGJ1ZmZlci1maWxlLW5hbWUpKSkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIi4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzeW1i
b2wtbmFtZSBjb252ZXJ0ZXItZm9ybWF0KSkpKQogICAgICAodW5sZXNzIG91dHB1dC1maWxlCiAg
ICAgICAgKHVzZXItZXJyb3IgIk91dHB1dCBmaWxlIG5hbWUgaXMgcmVxdWlyZWQiKSkpCiAgICAo
d2hlbiBvdXRwdXQtZmlsZQogICAgICAod2hlbiAoYW5kIChub3Qgb3ZlcndyaXRlKQogICAgICAg
ICAgICAgICAgIChmaWxlLWV4aXN0cy1wIG91dHB1dC1maWxlKQogICAgICAgICAgICAgICAgIChu
b3QgKHllcy1vci1uby1wIChmb3JtYXQgIiVzIGV4aXN0czsgb3ZlcndyaXRlPyIgb3V0cHV0LWZp
bGUpKSkpCiAgICAgICAgKHVzZXItZXJyb3IgIk5vdCBvdmVyd3JpdGluZyBleGlzdGluZyBmaWxl
OiAlcyIgb3V0cHV0LWZpbGUpKQogICAgICAoc2V0cSBvdXRwdXQtZmlsZSAoZXhwYW5kLWZpbGUt
bmFtZSBvdXRwdXQtZmlsZSkpKQoKCiAgICAobGV0ICgoY29tbWFuZC1hcmdzIChmdW5jYWxsIChw
bGlzdC1nZXQgY29uZmlnIDphcmd1bWVudHMtZnVuY3Rpb24pCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICh3aGVuIGlucHV0LWZpbGUgKGV4cGFuZC1maWxlLW5hbWUgaW5wdXQtZmls
ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC1maWxlKSkpCiAgICAg
ICh1bmxlc3MgKGV4ZWN1dGFibGUtZmluZCBjb21tYW5kKQogICAgICAgICh1c2VyLWVycm9yICJg
JXMnIGV4ZWN1dGFibGUgbm90IGZvdW5kIiBjb21tYW5kKSkKICAgICAgKGxldCAoKGVycm9yLWJ1
ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Rv
d24tdHMtLWNvbnZlcnQtZXJyb3ItYnVmZmVyKSkKICAgICAgICAgICAgKGVycm9yLXRlbXAtZmls
ZSAobWFrZS10ZW1wLWZpbGUgIm1hcmtkb3duLXRzLWNvbnZlcnQtc3RkZXJyIgogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwgIi5sb2ciKSkKICAgICAgICAg
ICAgKHN0ZG91dC1idWZmZXIgKHdoZW4gc3Rkb3V0LW9ubHkKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoZ2V0LWJ1ZmZlci1jcmVhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bWFya2Rvd24tdHMtLWNvbnZlcnQtb3V0cHV0LWJ1ZmZlcikpKSkKICAgICAgICAodW53aW5kLXBy
b3RlY3QKICAgICAgICAgICAgKGxldCAoZXhpdC1zdGF0dXMpCiAgICAgICAgICAgICAgKHdpdGgt
Y3VycmVudC1idWZmZXIgZXJyb3ItYnVmZmVyCiAgICAgICAgICAgICAgICAoc3BlY2lhbC1tb2Rl
KQogICAgICAgICAgICAgICAgKHNldHEgYnVmZmVyLXJlYWQtb25seSBuaWwpCiAgICAgICAgICAg
ICAgICAod2lkZW4pCiAgICAgICAgICAgICAgICAoZXJhc2UtYnVmZmVyKSkKICAgICAgICAgICAg
ICAod2hlbiBzdGRvdXQtYnVmZmVyCiAgICAgICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZl
ciBzdGRvdXQtYnVmZmVyCiAgICAgICAgICAgICAgICAgIChzcGVjaWFsLW1vZGUpCiAgICAgICAg
ICAgICAgICAgIChzZXRxIGJ1ZmZlci1yZWFkLW9ubHkgbmlsKQogICAgICAgICAgICAgICAgICAo
d2lkZW4pCiAgICAgICAgICAgICAgICAgIChlcmFzZS1idWZmZXIpKSkKICAgICAgICAgICAgICAo
Y29uZAogICAgICAgICAgICAgICAoKGFuZCBpbnB1dC1maWxlIChub3Qgc3RkaW4tb25seSkpCiAg
ICAgICAgICAgICAgICAoc2V0cSBleGl0LXN0YXR1cwogICAgICAgICAgICAgICAgICAgICAgKGFw
cGx5ICMnY2FsbC1wcm9jZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChsaXN0IHN0ZG91dC1idWZmZXIgZXJyb3ItdGVtcC1maWxlKQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG5pbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtYXJn
cykpKQogICAgICAgICAgICAgICAoKGFuZCBpbnB1dC1maWxlIHN0ZGluLW9ubHkpCiAgICAgICAg
ICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAgICAgICAgICAgICAoaW5zZXJ0LWZpbGUt
Y29udGVudHMgaW5wdXQtZmlsZSkKICAgICAgICAgICAgICAgICAgKHNldHEgZXhpdC1zdGF0dXMK
ICAgICAgICAgICAgICAgICAgICAgICAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzLXJlZ2lvbgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG5pbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGxpc3Qgc3Rkb3V0LWJ1ZmZlciBlcnJvci10ZW1wLWZpbGUpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtYXJn
cykpKSkKICAgICAgICAgICAgICAgKHQKICAgICAgICAgICAgICAgICh3aXRob3V0LXJlc3RyaWN0
aW9uCiAgICAgICAgICAgICAgICAgIChzZXRxIGV4aXQtc3RhdHVzCiAgICAgICAgICAgICAgICAg
ICAgICAgIChhcHBseSAjJ2NhbGwtcHJvY2Vzcy1yZWdpb24KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5pbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0IHN0ZG91dC1idWZm
ZXIgZXJyb3ItdGVtcC1maWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLWFyZ3MpKSkpKQogICAgICAgICAg
ICAgIChsZXQgKChlcnJvci1zaXplIChmaWxlLWF0dHJpYnV0ZS1zaXplIChmaWxlLWF0dHJpYnV0
ZXMgZXJyb3ItdGVtcC1maWxlKSkpKQogICAgICAgICAgICAgICAgKHdoZW4gKGFuZCBlcnJvci1z
aXplICg+IGVycm9yLXNpemUgMCkpCiAgICAgICAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVm
ZmVyIGVycm9yLWJ1ZmZlcgogICAgICAgICAgICAgICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50
cyBlcnJvci10ZW1wLWZpbGUpCiAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQt
bWluKSkpKSkKICAgICAgICAgICAgICAoY29uZCAoKGVxIDAgZXhpdC1zdGF0dXMpIDsgSW50ZWdl
ciBvciBzdHJpbmcuCiAgICAgICAgICAgICAgICAgICAgICh3aGVuIHN0ZG91dC1idWZmZXIKICAg
ICAgICAgICAgICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBzdGRvdXQtYnVmZmVyCiAg
ICAgICAgICAgICAgICAgICAgICAgICAod3JpdGUtcmVnaW9uIChwb2ludC1taW4pIChwb2ludC1t
YXgpIG91dHB1dC1maWxlKSkpCiAgICAgICAgICAgICAgICAgICAgICh3aGVuIGRpc3BsYXkKICAg
ICAgICAgICAgICAgICAgICAgICAoZnVuY2FsbCBtYXJrZG93bi10cy1jb252ZXJ0LWRpc3BsYXkt
ZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtZmlsZSkpCiAg
ICAgICAgICAgICAgICAgICAgICh3aGVuIChhbmQgKG5vdCBxdWlldCkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAobm90ICh6ZXJvcCAoYnVmZmVyLXNpemUgZXJyb3ItYnVmZmVyKSkp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHllcy1vci1uby1wCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQtbWVzc2FnZQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIkNvbnZlcnNpb24gZmlsZSBgJXMnIHN1Y2Nlc3NmdWxseSBjcmVhdGVk
IHdpdGggd2FybmluZ3M7IGRpc3BsYXkgdGhlbT8iCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBvdXRwdXQtZmlsZSkpKQogICAgICAgICAgICAgICAgICAgICAgIChkaXNwbGF5LWJ1
ZmZlciBlcnJvci1idWZmZXIpKQogICAgICAgICAgICAgICAgICAgICAobWVzc2FnZSAiQ29udmVy
c2lvbiBmaWxlIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGAlcyclcyIKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgb3V0cHV0LWZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlm
ICh6ZXJvcCAoYnVmZmVyLXNpemUgZXJyb3ItYnVmZmVyKSkKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAi
IHdpdGggd2FybmluZ3M7IHNlZSBidWZmZXIgYCVzJyIgZXJyb3ItYnVmZmVyKSkpKQogICAgICAg
ICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAgIChpZiBxdWlldAogICAgICAgICAg
ICAgICAgICAgICAgICAgKGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnZlcnRl
ciBhYm9ydGVkIHdpdGggZXhpdCBjb2RlICVTOyBzZWUgYnVmZmVyIGAlcycgZm9yIGVycm9ycyIK
ICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0LXN0YXR1cwogICAgICAgICAgICAgICAgICAg
ICAgICAgIG1hcmtkb3duLXRzLS1jb252ZXJ0LWVycm9yLWJ1ZmZlcikKICAgICAgICAgICAgICAg
ICAgICAgICAod2hlbiAoeWVzLW9yLW5vLXAgKGZvcm1hdAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIkNvbnZlcnRlciBhYm9ydGVkIHdpdGggZXhpdCBjb2RlICVT
OyBkaXNwbGF5IGVycm9ycz8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBleGl0LXN0YXR1cykpCiAgICAgICAgICAgICAgICAgICAgICAgICAoZGlzcGxheS1idWZm
ZXIgZXJyb3ItYnVmZmVyKSkpKSkpCiAgICAgICAgICAoZGVsZXRlLWZpbGUgZXJyb3ItdGVtcC1m
aWxlKSkpKSkpCgo7OzsgVGFibGUgb2YgY29udGVudHM6CgooZGVmZ3JvdXAgbWFya2Rvd24tdHMt
dG9jIG5pbAogICJUYWJsZSBvZiBjb250ZW50cyBmb3IgYG1hcmtkb3duLXRzLW1vZGUnIGJ1ZmZl
cnMuIgogIDpwcmVmaXggIm1hcmtkb3duLXRzLXRvYy0iCiAgOmdyb3VwICd0ZXh0CiAgOmdyb3Vw
ICdlZGl0aW5nCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy10b2Mt
Z2VuZXJhdGUtd2Fybi1pZi1ub25lICdpbnNlcnQtdGVtcGxhdGUKICAiV2FybiBpZiBubyB0YWJs
ZXMgd2VyZSBwcm9jZXNzZWQgd2hlbiBjYWxsaW5nIGBtYXJrZG93bi10cy10b2MtZ2VuZXJhdGUn
LgpJZiBuaWwsIGRvIG5vdGhpbmcuICBJZiB0aGUgc3ltYm9sIGBpbnNlcnQtdGVtcGxhdGUnIGFu
ZApgbWFya2Rvd24tdHMtdG9jLWdlbmVyYXRlJyB3YXMgY2FsbGVkIGludGVyYWN0aXZlbHksIG9m
ZmVyIHRvIGluc2VydCBhCnRlbXBsYXRlIGlmIHRoZXJlIGFyZSBub25lLiAgSWYgYG5vLXRhYmxl
cycsIHdhcm4gd2hlbiB0aGVyZSBhcmUgbm8KdGFibGVzIGluIHRoZSBidWZmZXIuICBgbm8tYWN0
aXZlLXRhYmxlcycsIGlzIHRoZSBzYW1lIGFzIGBuby10YWJsZXMnCndpdGggdGhlIGFkZGl0aW9u
IG9mIGEgd2FybmluZyBpZiB0aGVyZSBhcmUgdGFibGVzLCBidXQgbm9uZSBhcmUgYWN0aXZlLiIK
ICA6dHlwZSAnKGNob2ljZSAoY29uc3QgOnRhZyAiTm8gd2FybmluZ3MiIG5pbCkKICAgICAgICAg
ICAgICAgICAoY29uc3QgOnRhZyAiSW5zZXJ0IGEgdGFibGUgdGVtcGxhdGUgKGlmIGludGVyYWN0
aXZlKSIgaW5zZXJ0LXRlbXBsYXRlKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJXYXJu
IGlmIG5vIHRhYmxlcyB3ZXJlIHByb2Nlc3NlZCIgbm8tdGFibGVzKQogICAgICAgICAgICAgICAg
IChjb25zdCA6dGFnICJXYXJuIGlmIG5vIGFjdGl2ZSB0YWJsZXMgd2VyZSBwcm9jZXNzZWQiIG5v
LWFjdGl2ZS10YWJsZXMpKQogIDp2ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEu
MCIpCgooZGVmY3VzdG9tIG1hcmtkb3duLXRzLXRvYy11cGRhdGUtYmVmb3JlLXNhdmUtbW9kZS1s
aWdodGVyICIgW3RvYyBvbiBzYXZlXSIKICAiTWlub3ItbW9kZSBcImxpZ2h0ZXJcIiBmb3IgYG1h
cmtkb3duLXRzLXRvYy11cGRhdGUtYmVmb3JlLXNhdmUtbW9kZScuCk5vdGUgdGhlIHNpbmdsZSBz
cGFjZSBwcmVmaXguIgogIDp0eXBlICcoY2hvaWNlIChjb25zdCA6dGFnICJEZWZhdWx0IiAiIFt0
b2Mgb24gc2F2ZV0iKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJOb25lIiBuaWwpCiAg
ICAgICAgICAgICAgICAgKHN0cmluZyA6dGFnICJPdGhlciBzdHJpbmciKSkKICA6dmVyc2lvbiAi
MzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy10
b2Mtc2x1Zy1mdW5jdGlvbiAjJ21hcmtkb3duLXRzLS1zbHVnLWdpdGh1YgogICJGdW5jdGlvbiB0
byBnZW5lcmF0ZSBNYXJrZG93biBoZWFkaW5nIFwic2x1Z3NcIiBpbiB0YWJsZXMgb2YgY29udGVu
dHMuIgogIDp0eXBlICcoY2hvaWNlIChjb25zdCA6dGFnICJHaXRIdWIgc2x1ZyIgbWFya2Rvd24t
dHMtLXNsdWctZ2l0aHViKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJQYW5kb2Mgc2x1
ZyIgbWFya2Rvd24tdHMtLXNsdWctcGFuZG9jKQogICAgICAgICAgICAgICAgIChmdW5jdGlvbiA6
dGFnICJPdGhlciBmdW5jdGlvbiIpKQogIDp2ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZlcnNp
b24gIjEuMCIpCgooZGVmdmFyIG1hcmtkb3duLXRzLS10b2MtaGFuZGxlcwogICcoKGhlYWRpbmcg
LiAoaDEgaDIgaDMgaDQgaDUgaDYpKQogICAgKHNldGV4dCAuIChzaDEgc2gyKSkKICAgIChpdGVt
IC4gKG1pbnVzIHBsdXMgc3RhcikpCiAgICAobnVtYmVyZWQtaXRlbSAuIChkb3QgcGFyZW4pKQog
ICAgKGNvZGUgLiAoY29kZSkpKQogICJNYXAgaGlnaCBsZXZlbCBub2RlIGhhbmRsZXMgdG8gdGhl
aXIgYmFzZSBjb25zdGl0dWVudHMuClRoZSBzcGVjaWFsIHN5bWJvbCBgYWxsJyBtZWFucyBhbGwg
aGFuZGxlcy4iKQoKKGRlZnZhciBtYXJrZG93bi10cy0tdG9jLWhhbmRsZS1jbGFzc2VzCiAgKGxl
dCAoKHgpKQogICAgKGRvbGlzdCAoZWx0IG1hcmtkb3duLXRzLS10b2MtaGFuZGxlcykKICAgICAg
KGRvbGlzdCAodmFsIChjZHIgZWx0KSkKICAgICAgICAocHVzaCBgKCx2YWwgLiAsKGNhciBlbHQp
KSB4KSkpCiAgICB4KQoiSW52ZXJzZSBvZiBgbWFya2Rvd24tdHMtLXRvYy1oYW5kbGVzJy4iKQoK
KGRlZnVuIG1hcmtkb3duLXRzLS10b2MtZXhwYW5kLWNhbmRpZGF0ZS1oYW5kbGVzIChoYW5kbGVz
KQogICJFeHBhbmQgY2FuZGlkYXRlIEhBTkRMRVMgYW5kIGtlZXAgb25seSBiYXNlIGhhbmRsZXMu
ClNlZSBgbWFya2Rvd24tdHMtLXRvYy1oYW5kbGVzJy4iCiAgKGxldCAoKGV4cGFuZGVkIChtYWtl
LWhhc2gtdGFibGUpKQogICAgICAgIChyZXMpKQogICAgKHVubGVzcyAobGlzdHAgaGFuZGxlcykK
ICAgICAgKHNldHEgaGFuZGxlcyAobGlzdCBoYW5kbGVzKSkpCiAgICAod2hlbiAoZXF1YWwgaGFu
ZGxlcyAnKGFsbCkpCiAgICAgIChzZXRxIGhhbmRsZXMgKG1hcGNhciAjJ2NhciBtYXJrZG93bi10
cy0tdG9jLWhhbmRsZXMpKSkKICAgIChkb2xpc3QgKGVsdCBoYW5kbGVzKQogICAgICAoc2V0cSBl
bHQgKGFsaXN0LWdldCBlbHQgbWFya2Rvd24tdHMtLXRvYy1oYW5kbGVzIGVsdCkpCiAgICAgIChj
b25kICgoY29uc3AgZWx0KQogICAgICAgICAgICAgKGRvbGlzdCAoayBlbHQpIChwdXRoYXNoIGsg
dCBleHBhbmRlZCkpKQogICAgICAgICAgICAodCAocHV0aGFzaCBlbHQgdCBleHBhbmRlZCkpKSkK
ICAgIChtYXBoYXNoIChsYW1iZGEgKGsgX3YpIChwdXNoIGsgcmVzKSkgZXhwYW5kZWQpCiAgICBy
ZXMpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS10b2NzICgmb3B0aW9uYWwgYmVnIGVuZCkKICAiU2Nh
biB0aGUgY3VycmVudCBidWZmZXIgZm9yIHRvYyBlbnRyaWVzIGZyb20gQkVHIHRvIEVORC4KSWYg
QkVHIGlzIG5pbCwgdXNlIGBwb2ludC1taW4nLiAgSWYgRU5EIGlzIG5pbCwgdXNlIGBwb2ludC1t
YXgnLgoKUmV0dXJuIGFuIGFsaXN0IG9mIHRoZSBmb3JtOgogIFxcPScoKGtleXdvcmQgKG5vZGUg
YmVnIGVuZCB2YXJzKSkpCgpWYXJzIGFyZSBleHBhbmRlZCB2aWEgYGhhY2stbG9jYWwtdmFyaWFi
bGVzLXByb3AtbGluZScuCgpSZXR1cm4gdGhlIGxpc3QgaW4gdGhlIG9yZGVyIG9mIGFwcGVhcmFu
Y2UgaW4gdGhlIGJ1ZmZlci4iCiAgOzsgTk9URTogVGhpcyBzY2FucyBhbGwgbWF0Y2hpbmcgbm9k
ZXMgYmVsb3cgQkVHIHdpdGggbm8gbWF4aW11bSBjb3VudAogIDs7IGV2ZW4gd2hlbiB3ZSB3YW50
IG9ubHkgYSBzaW5nbGUgbmV4dCBtYXRjaGluZyBpdGVtLiAgUGVyaGFwcwogIDs7IGB0cmVlc2l0
LXF1ZXJ5LWNhcHR1cmUnIGNvdWxkIGJlIGltcHJvdmVkIHRvIGFjY2VwdCBhIG1heC1jb3VudAog
IDs7IGFyZ3VtZW50LgogIDs7CiAgOzsgTWF0Y2ggIm1hcmtkb3duLXRzLXRvYzoiLCAibWFya2Rv
d24tdHMtdG9jLWFiYzEyMzoiIGJ1dCBub3QKICA7OyAibWFya2Rvd24tdHMtdG9jeHh4OiIuCiAg
KGxldCAoKHJlcykpCiAgICAoZG9saXN0IChub2RlCiAgICAgICAgICAgICAodHJlZXNpdC1xdWVy
eS1jYXB0dXJlCiAgICAgICAgICAgICAgJ21hcmtkb3duCiAgICAgICAgICAgICAgJygoKChodG1s
X2Jsb2NrKSBAbWFya2Rvd24tdHMtdG9jKQogICAgICAgICAgICAgICAgICg6bWF0Y2ggIjwhLS1b
WzpibGFuazpdXSptYXJrZG93bi10cy10b2NcXCgtW1s6YWxudW06XV0rXFwpKjoiIEBtYXJrZG93
bi10cy10b2MpKSkKICAgICAgICAgICAgICAob3IgYmVnIChwb2ludC1taW4pKQogICAgICAgICAg
ICAgIChvciBlbmQgKHBvaW50LW1heCkpCiAgICAgICAgICAgICAgJ25vZGUtb25seSkpCiAgICAg
IChsZXQqICgocyAodHJlZXNpdC1ub2RlLXRleHQgbm9kZSAnbm8tcHJvcGVydHkpKQogICAgICAg
ICAgICAgKG1hdGNoIChzdHJpbmctbWF0Y2ggIlxcKG1hcmtkb3duLXRzLXRvY1xcKC1bWzphbG51
bTpdXStcXCkqXFwpOi4qIiBzKSkKICAgICAgICAgICAgIChrZXl3b3JkICh3aGVuIG1hdGNoICht
YXRjaC1zdHJpbmcgMSBzKSkpKQogICAgICAgIChsZXQgKCh2YXJzKSkKICAgICAgICAgICh3aXRo
LXdvcmstYnVmZmVyCiAgICAgICAgICAgIChpbnNlcnQgcykKICAgICAgICAgICAgKHNldHEgdmFy
cyAoaGFjay1sb2NhbC12YXJpYWJsZXMtcHJvcC1saW5lKSkpCiAgICAgICAgICAocHVzaAogICAg
ICAgICAgIGAoLGtleXdvcmQKICAgICAgICAgICAgIChub2RlIC4gLG5vZGUpCiAgICAgICAgICAg
ICAoYmVnIC4gLCh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAgICAgICAgICAoZW5kIC4g
LCh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAgICAgICAgKHZhcnMgLiAsdmFycykpCiAg
ICAgICAgICAgcmVzKSkpKQogICAgKG5yZXZlcnNlIHJlcykpKQoKKGRlZnVuIG1hcmtkb3duLXRz
LS10b2NzLXNhbml0eS1jaGVjayAodG9jcykKICAiU2FuaXR5IGNoZWNrIFRPQ1MgZm9yIHBhaXJl
ZCBtYXJrZG93bi10cy10b2M6IG1hcmtkb3duLXRzLXRvYy1lbmQ6IG5vZGVzLgpTaWduYWwgYW4g
ZXJyb3IgaWYgVE9DUyBhcmUgaW5zYW5lLgpTZWUgYG1hcmtkb3duLXRzLS10b2NzJy4iCiAgKHNl
cS1tYXAtaW5kZXhlZAogICAobGFtYmRhIChlbHQgaWR4KQogICAgICh3aGVuIChlcXVhbCAibWFy
a2Rvd24tdHMtdG9jIiAoY2FyIGVsdCkpCiAgICAgICAodW5sZXNzIChlcXVhbCAibWFya2Rvd24t
dHMtdG9jLWVuZCIgKGNhciAobnRoICgxKyBpZHgpIHRvY3MpKSkKICAgICAgICAgKHVzZXItZXJy
b3IKICAgICAgICAgICJcIm1hcmtkb3duLXRzLXRvY1wiIGF0IHBvc2l0aW9uICVkIG11c3QgYmUg
Zm9sbG93ZWQgYnkgYSBtYXRjaGluZyBcIm1hcmtkb3duLXRzLXRvYy1lbmRcIiIKICAgICAgICAg
IChhbGlzdC1nZXQgJ2JlZyBlbHQpKSkpKQogICB0b2NzKSkKCihkZWZ1biBtYXJrZG93bi10cy0t
dG9jLWNvbGxlY3QtY2FuZGlkYXRlcyAodG9jLXN0YXJ0LW5vZGUKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0b2MtZW5kLW5vZGUgaGFuZGxlcyBmcm9tKQogICJS
ZXR1cm4gYW4gYWxpc3Qgb2YgdG9jIGVudHJ5IGNhbmRpZGF0ZXMgZnJvbSB0aGUgY3VycmVudCBi
dWZmZXIuCkhBTkRMRVMgaXMgYSBsaXN0IG9mIGJhc2UgaGFuZGxlczsgc2VlIGBtYXJrZG93bi10
cy0tdG9jLWhhbmRsZXMnLgoKVE9DLVNUQVJULU5PREUgaXMgdGhlIFwibWFya2Rvd24tdHMtdG9j
LXN0YXJ0XCIgbm9kZS4KVE9DLUVORC1OT0RFIGlzIHRoZSBcIm1hcmtkb3duLXRzLXRvYy1lbmRc
IiBub2RlLgoKSWYgRlJPTSBpcyB0aGUgc3ltYm9sIGBhYm92ZScsIHNvdXJjZSBjYW5kaWRhdGVz
IGZyb20gdGhlIGJlZ2lubmluZyBvZgp0aGUgYnVmZmVyIHVudGlsIHRoZSB0b2Mgc3RhcnQgbm9k
ZS4gIElmIGBiZWxvdycsIHNvdXJjZSBjYW5kaWRhdGVzIGZyb20KdG9jIHN0YXJ0IG5vZGUgdW50
aWwgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgSWYgYGFsbCcsIHVzZSB0aGUgd2hvbGUKYnVmZmVy
LgoKUmVtb3ZlIGlnbm9yZWQgY2FuZGlkYXRlcyBjb250YWluaW5nIFwiPCEtLSBtYXJrZG93bi10
cy1pZ25vcmU6IC0tPlwiLgoKU29ydCB0aGUgbGlzdCBieSB0aGUgc3RhcnRpbmcgY2hhcmFjdGVy
IHBvc2l0aW9ucyBvZiBub2Rlcy4KClRoZSBhbGlzdCBpcyBvZiB0aGUgZm9ybToKICBcXD0nKCho
YW5kbGUgLiBub2RlKSkiCiAgKGxldCAoY2FuZGlkYXRlcyBiZWcgZW5kKQogICAgKHBjYXNlIGZy
b20KICAgICAgKCdhYm92ZQogICAgICAgKHNldHEgYmVnIChwb2ludC1taW4pKQogICAgICAgKHNl
dHEgZW5kICh0cmVlc2l0LW5vZGUtc3RhcnQgdG9jLXN0YXJ0LW5vZGUpKSkKICAgICAgKCdiZWxv
dwogICAgICAgKHNldHEgYmVnICh0cmVlc2l0LW5vZGUtZW5kIHRvYy1lbmQtbm9kZSkpCiAgICAg
ICAoc2V0cSBlbmQgKHBvaW50LW1heCkpKQogICAgICAoJ2FsbAogICAgICAgKHNldHEgYmVnIChw
b2ludC1taW4pKQogICAgICAgKHNldHEgZW5kIChwb2ludC1tYXgpKSkpCgogICAgOzsgSXQgbG9v
a3MgbGlrZSB3ZSBjYW5ub3QgZ2V0IHRoZW0gaW4gb25lIGZlbGwgc3dvb3AuCiAgICAoZG9saXN0
IChlbHQgaGFuZGxlcykKICAgICAgKHNldHEKICAgICAgIGNhbmRpZGF0ZXMKICAgICAgIChhcHBl
bmQKICAgICAgICBjYW5kaWRhdGVzCiAgICAgICAgKHBjYXNlIGVsdAogICAgICAgICAgKCdoMSAo
dHJlZXNpdC1xdWVyeS1jYXB0dXJlCiAgICAgICAgICAgICAgICAnbWFya2Rvd24gJygoYXR4X2hl
YWRpbmcgKGF0eF9oMV9tYXJrZXIpIChpbmxpbmUpIEBoMSkpIGJlZyBlbmQpKQogICAgICAgICAg
KCdoMiAodHJlZXNpdC1xdWVyeS1jYXB0dXJlCiAgICAgICAgICAgICAgICAnbWFya2Rvd24gJygo
YXR4X2hlYWRpbmcgKGF0eF9oMl9tYXJrZXIpIChpbmxpbmUpIEBoMikpIGJlZyBlbmQpKQogICAg
ICAgICAgKCdoMyAodHJlZXNpdC1xdWVyeS1jYXB0dXJlCiAgICAgICAgICAgICAgICAnbWFya2Rv
d24gJygoYXR4X2hlYWRpbmcgKGF0eF9oM19tYXJrZXIpIChpbmxpbmUpIEBoMykpIGJlZyBlbmQp
KQogICAgICAgICAgKCdoNCAodHJlZXNpdC1xdWVyeS1jYXB0dXJlCiAgICAgICAgICAgICAgICAn
bWFya2Rvd24gJygoYXR4X2hlYWRpbmcgKGF0eF9oNF9tYXJrZXIpIChpbmxpbmUpIEBoNCkpIGJl
ZyBlbmQpKQogICAgICAgICAgKCdoNSAodHJlZXNpdC1xdWVyeS1jYXB0dXJlCiAgICAgICAgICAg
ICAgICAnbWFya2Rvd24gJygoYXR4X2hlYWRpbmcgKGF0eF9oNV9tYXJrZXIpIChpbmxpbmUpIEBo
NSkpIGJlZyBlbmQpKQogICAgICAgICAgKCdoNiAodHJlZXNpdC1xdWVyeS1jYXB0dXJlCiAgICAg
ICAgICAgICAgICAnbWFya2Rvd24gJygoYXR4X2hlYWRpbmcgKGF0eF9oNl9tYXJrZXIpIChpbmxp
bmUpIEBoNikpIGJlZyBlbmQpKQogICAgICAgICAgKCdzaDEgKHRyZWVzaXQtcXVlcnktY2FwdHVy
ZQogICAgICAgICAgICAgICAgICdtYXJrZG93biAnKChzZXRleHRfaGVhZGluZyBoZWFkaW5nX2Nv
bnRlbnQ6IChfKSBAc2gxIChzZXRleHRfaDFfdW5kZXJsaW5lKSkpIGJlZyBlbmQpKQogICAgICAg
ICAgKCdzaDIgKHRyZWVzaXQtcXVlcnktY2FwdHVyZQogICAgICAgICAgICAgICAgICdtYXJrZG93
biAnKChzZXRleHRfaGVhZGluZyBoZWFkaW5nX2NvbnRlbnQ6IChfKSBAc2gyIChzZXRleHRfaDJf
dW5kZXJsaW5lKSkpIGJlZyBlbmQpKQogICAgICAgICAgKCdtaW51cyAodHJlZXNpdC1xdWVyeS1j
YXB0dXJlCiAgICAgICAgICAgICAgICAgICAnbWFya2Rvd24gJygobGlzdF9pdGVtIChsaXN0X21h
cmtlcl9taW51cykgKHBhcmFncmFwaCAoaW5saW5lKSBAbWludXMpKSkgYmVnIGVuZCkpCiAgICAg
ICAgICAoJ3BsdXMgKHRyZWVzaXQtcXVlcnktY2FwdHVyZQogICAgICAgICAgICAgICAgICAnbWFy
a2Rvd24gJygobGlzdF9pdGVtIChsaXN0X21hcmtlcl9wbHVzKSAocGFyYWdyYXBoIChpbmxpbmUp
IEBwbHVzKSkpIGJlZyBlbmQpKQogICAgICAgICAgKCdzdGFyICh0cmVlc2l0LXF1ZXJ5LWNhcHR1
cmUKICAgICAgICAgICAgICAgICAgJ21hcmtkb3duICcoKGxpc3RfaXRlbSAobGlzdF9tYXJrZXJf
c3RhcikgKHBhcmFncmFwaCAoaW5saW5lKSBAc3RhcikpKSBiZWcgZW5kKSkKICAgICAgICAgICgn
ZG90ICh0cmVlc2l0LXF1ZXJ5LWNhcHR1cmUKICAgICAgICAgICAgICAgICAnbWFya2Rvd24gJygo
bGlzdF9pdGVtIChsaXN0X21hcmtlcl9kb3QpIChwYXJhZ3JhcGggKGlubGluZSkgQGRvdCkpKSBi
ZWcgZW5kKSkKICAgICAgICAgICgncGFyZW4gKHRyZWVzaXQtcXVlcnktY2FwdHVyZQogICAgICAg
ICAgICAgICAgICAgJ21hcmtkb3duICcoKGxpc3RfaXRlbSAobGlzdF9tYXJrZXJfcGFyZW50aGVz
aXMpIChwYXJhZ3JhcGggKGlubGluZSkgQHBhcmVuKSkpIGJlZyBlbmQpKQogICAgICAgICAgKCdj
b2RlICh0cmVlc2l0LXF1ZXJ5LWNhcHR1cmUKICAgICAgICAgICAgICAgICAgJ21hcmtkb3duICco
KGZlbmNlZF9jb2RlX2Jsb2NrIChpbmZvX3N0cmluZyAobGFuZ3VhZ2UpKSBAY29kZSkpIGJlZyBl
bmQpKSkpKSkKICAgIChzb3J0CiAgICAgKHNlcS1yZW1vdmUKICAgICAgKGxhbWJkYSAoZWx0KQog
ICAgICAgIChzdHJpbmctbWF0Y2gtcCAiPCEtLVtbOmJsYW5rOl1dKm1hcmtkb3duLXRzLWlnbm9y
ZTpbWzpibGFuazpdXSotLT4iCiAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUt
dGV4dCAoY2RyIGVsdCkgdCkpKQogICAgICBjYW5kaWRhdGVzKQogICAgIDprZXkgKGxhbWJkYSAo
ZWx0KQogICAgICAgICAgICAodHJlZXNpdC1ub2RlLXN0YXJ0IChjZHIgZWx0KSkpCiAgICAgOmxl
c3NwICMnPAogICAgIDppbi1wbGFjZSB0KSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLXRvYy1saXN0
LWl0ZW0tZGVwdGggKG5vZGUpCiAgIlJldHVybiBOT0RFJ3MgaXRlbSBkZXB0aCByZWxhdGl2ZSB0
byBpdHMgcHJlZGVjZXNzb3JzLgpJZiBOT0RFIGlzIG5vdCBwYXJ0IG9mIGEgbGlzdCwgcmV0dXJu
IG5pbC4iCiAgICAobGV0ICgoZGVwdGggbmlsKSAobiAodHJlZXNpdC1ub2RlLXBhcmVudCBub2Rl
KSkpCiAgICAgICh3aGlsZSBuCiAgICAgICAgKHdoZW4gKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlw
ZSBuKSAibGlzdCIpCiAgICAgICAgICAoc2V0cSBkZXB0aCAoMSsgKG9yIGRlcHRoIDApKSkpCiAg
ICAgICAgKHNldHEgbiAodHJlZXNpdC1ub2RlLXBhcmVudCBuKSkpCiAgICAgIGRlcHRoKSkKCihk
ZWZ1biBtYXJrZG93bi10cy0tdG9jLWF0eF9oZWFkZXItbm9ybWFsaXplICh0ZXh0KQogICJSZW1v
dmUgdHJhaWxpbmcgIyBmcm9tIFRFWFQgdW5sZXNzIHRoZXkgYXJlIGJhY2tzbGFzaCBlc2NhcGVk
LgpGaXJzdCByZW1vdmUgSFRNTCBjb21tZW50cy4iCiAgKGlmIChzdHJpbmctbWF0Y2gtcCAiW1s6
Ymxhbms6XV0qXFxcXCsjK1tbOmJsYW5rOl1dKlxuKlxcJyIgdGV4dCkKICAgICAgdGV4dAogICAg
KHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZyAiW1s6Ymxhbms6XV0qIytbWzpibGFuazpdXSpcbipc
XCciICIiIHRleHQpKSkKCihkZWZ2YXIgbWFya2Rvd24tdHMtLXRvYy10ZXh0LW5vcm1hbGl6ZXJz
CiAgYCgoaGVhZGluZyAuIG1hcmtkb3duLXRzLS10b2MtYXR4X2hlYWRlci1ub3JtYWxpemUpCiAg
ICAoaDEgLiBtYXJrZG93bi10cy0tdG9jLWF0eF9oZWFkZXItbm9ybWFsaXplKQogICAgKGgyIC4g
bWFya2Rvd24tdHMtLXRvYy1hdHhfaGVhZGVyLW5vcm1hbGl6ZSkKICAgIChoMyAuIG1hcmtkb3du
LXRzLS10b2MtYXR4X2hlYWRlci1ub3JtYWxpemUpCiAgICAoaDQgLiBtYXJrZG93bi10cy0tdG9j
LWF0eF9oZWFkZXItbm9ybWFsaXplKQogICAgKGg1IC4gbWFya2Rvd24tdHMtLXRvYy1hdHhfaGVh
ZGVyLW5vcm1hbGl6ZSkKICAgIChoNiAuIG1hcmtkb3duLXRzLS10b2MtYXR4X2hlYWRlci1ub3Jt
YWxpemUpKQogICJNYXAgbm9kZSB0eXBlIGhhbmRsZXMgdG8gZnVuY3Rpb25zIHRoYXQgbm9ybWFs
aXplIGl0cyB0ZXh0LgpTZWUgYG1hcmtkb3duLXRzLS10b2MtdGV4dC1ub3JtYWxpemUnLgpFYWNo
IGZ1bmN0aW9uIGFjY2VwdHMgb25lIGFyZ3VtZW50LCB0aGUgc3RyaW5nIFRFWFQsIGFuZCByZXR1
cm5zIGEgc3RyaW5nLiIpCgooZGVmdW4gbWFya2Rvd24tdHMtLXRvYy10ZXh0LW5vcm1hbGl6ZSAo
aGFuZGxlIG5vZGUgJm9wdGlvbmFsIHRleHQpCiAgIk5vcm1hbGl6ZSBOT0RFJ3MgVEVYVCBhY2Nv
cmRpbmcgdG8gaXRzIEhBTkRMRS4KVEVYVCBzaG91bGQgaGF2ZSBubyB0ZXh0IHByb3BlcnRpZXMu
ICBJZiBURVhUIGlzIG5pbCwgdXNlIHRoZSBOT0RFJ3MKdGV4dC4gIFRoaXMgaXMgbm90IGFsd2F5
cyBjb3JyZWN0IHNvIGl0J3MgYmVzdCB0byBwYXNzIFRFWFQgaWYgeW91IGtub3cKaXQgaW4gdGhl
IGNhbGxpbmcgY29udGV4dC4KCklmIG5vIG5vcm1hbGl6ZXIgaXMgZm91bmQsIHJldHVybiBURVhU
LgoKT25lIGV4YW1wbGUgbm9ybWFsaXphdGlvbiBpcyBhdHhfaGVhZGluZyB0ZXh0IHRoYXQgZW5k
cyBpbiB0cmFpbGluZyBoYXNoCnNpZ25zIHdoaWNoIGFyZSBpbnRlbmRlZCB0byBiZSBlbGlkZWQg
c28gXCJIZWFkaW5nIFRleHQgIyNcIiBpcwp0cmFuc2Zvcm1lZCBpbnRvIFwiSGVhZGluZyBUZXh0
XCIuIgogIChzZXRxIHRleHQgKG9yIHRleHQgKHRyZWVzaXQtbm9kZS10ZXh0IG5vZGUgJ25vLXBy
b3BlcnR5KSkpCiAgKGlmLWxldCogKChmaXhlciAoYWxpc3QtZ2V0IGhhbmRsZSBtYXJrZG93bi10
cy0tdG9jLXRleHQtbm9ybWFsaXplcnMpKSkKICAgICAgKGZ1bmNhbGwgZml4ZXIgdGV4dCkKICAg
IHRleHQpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZmluZS1taW5vci1tb2RlIG1hcmtkb3duLXRzLXRv
Yy11cGRhdGUtYmVmb3JlLXNhdmUtbW9kZQogICJJZiBlbmFibGVkLCB1cGRhdGUgYG1hcmtkb3du
LXRzLW1vZGUnIHRhYmxlcyBvZiBjb250ZW50cyBiZWZvcmUgc2F2aW5nLiIKICA6aW5pdC12YWx1
ZSBuaWwKICA6Z2xvYmFsIG5pbAogIDpsaWdodGVyIG1hcmtkb3duLXRzLXRvYy11cGRhdGUtYmVm
b3JlLXNhdmUtbW9kZS1saWdodGVyCiAgKGlmIChkZXJpdmVkLW1vZGUtcCAnbWFya2Rvd24tdHMt
bW9kZSkKICAgICAgKGlmIG1hcmtkb3duLXRzLXRvYy11cGRhdGUtYmVmb3JlLXNhdmUtbW9kZQog
ICAgICAgICAgKGFkZC1ob29rICdiZWZvcmUtc2F2ZS1ob29rICMnbWFya2Rvd24tdHMtdG9jLWdl
bmVyYXRlIG5pbCAnbG9jYWwpCiAgICAgICAgKHJlbW92ZS1ob29rICdiZWZvcmUtc2F2ZS1ob29r
ICMnbWFya2Rvd24tdHMtdG9jLWdlbmVyYXRlICdsb2NhbCkpCiAgICAoc2V0cSBtYXJrZG93bi10
cy10b2MtdXBkYXRlLWJlZm9yZS1zYXZlLW1vZGUgbmlsKQogICAgKGx3YXJuICdtYXJrZG93bi10
cy10b2MtdXBkYXRlLWJlZm9yZS1zYXZlLW1vZGUKICAgICAgICAgICA6d2FybmluZwogICAgICAg
ICAgICJNaW5vciBtb2RlIHZhbGlkIG9ubHkgaW4gYG1hcmtkb3duLXRzLW1vZGUnIGJ1ZmZlcnMu
IikpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIG1hcmtkb3duLXRzLXRvYy1jbGVhci1hbmQtcmVt
b3ZlICgmb3B0aW9uYWwgYmVnIGVuZCkKICAiUmVtb3ZlIGBtYXJrZG93bi10cy1tb2RlJyB0YWJs
ZSBvZiBjb250ZW50cyBib2RpZXMgYW5kIHRlbXBsYXRlcy4KT3BlcmF0ZSBvbiB0aGUgYWN0aXZl
IHJlZ2lvbiBCRUcgdG8gRU5ELCBvdGhlcndpc2Ugb3BlcmF0ZSBvbiB0aGUKYnVmZmVyLCB3aGlj
aCBtYXkgYmUgbmFycm93ZWQuIgogIChpbnRlcmFjdGl2ZSAiUiIpCiAgKG1hcmtkb3duLXRzLS1i
YXJmLWlmLW5vdC1tb2RlICdtYXJrZG93bi10cy10b2MtY2xlYXItYW5kLXJlbW92ZSkKICAobWFy
a2Rvd24tdHMtdG9jLWNsZWFyIGJlZyBlbmQgJ3JlbW92ZSkpCgo7OzsjIyNhdXRvbG9hZAooZGVm
dW4gbWFya2Rvd24tdHMtdG9jLWNsZWFyICgmb3B0aW9uYWwgYmVnIGVuZCByZW1vdmUpCiAgIkNs
ZWFyIGBtYXJrZG93bi10cy1tb2RlJyB0YWJsZSBvZiBjb250ZW50cyBib2RpZXMuCk9wZXJhdGUg
b24gdGhlIGFjdGl2ZSByZWdpb24gQkVHIHRvIEVORCwgb3RoZXJ3aXNlIG9wZXJhdGUgb24gdGhl
CmJ1ZmZlciwgd2hpY2ggbWF5IGJlIG5hcnJvd2VkLgpJZiBvcHRpb25hbCBSRU1PVkUgaXMgbm9u
LW5pbCwgcmVtb3ZlIHRhYmxlcyBpbmNsdWRpbmcgdGhlaXIgdGVtcGxhdGVzLiIKICAoaW50ZXJh
Y3RpdmUgIlIiKQogIChtYXJrZG93bi10cy0tYmFyZi1pZi1ub3QtbW9kZSAnbWFya2Rvd24tdHMt
dG9jLWNsZWFyKQogIChzZXRxIGJlZyAob3IgYmVnIChwb2ludC1taW4pKSkKICAoc2V0cSBlbmQg
KG9yIGVuZCAocG9pbnQtbWF4KSkpCiAgKHVubGVzcyAoZXEgYmVnIGVuZCkKICAgIDs7IENvbnZl
cnQgbWFya2VycyB0byBhYnNvbHV0ZSBwb3NpdGlvbnMuCiAgICAoc2V0cSBiZWcgKGlmIChtYXJr
ZXJwIGJlZykgKG1hcmtlci1wb3NpdGlvbiBiZWcpIGJlZykpCiAgICAoc2V0cSBlbmQgKGlmICht
YXJrZXJwIGVuZCkgKG1hcmtlci1wb3NpdGlvbiBlbmQpIGVuZCkpCiAgICA7OyBOT1RFOiBPcGVy
YXRlIG9uIHRoZSB3aWRlbmVkIGJ1ZmZlciB0byBhdm9pZCB0cmVlc2l0ZXIgY3Jhc2ggaXNzdWVz
LgogICAgKHdpdGhvdXQtcmVzdHJpY3Rpb24KICAgICAgKGxldCAoKHRvY3MpCiAgICAgICAgICAg
IChiZWctcG9zIGJlZykKICAgICAgICAgICAgKGVuZC1wb3MgZW5kKSkKICAgICAgICA7OyBXZSBz
Y2FuIGVhY2ggcGFzcyBiZWNhdXNlIHRoZWlyIHBvc2l0aW9ucyBjaGFuZ2UuCiAgICAgICAgKHdo
aWxlIChhbmQgKDwgYmVnLXBvcyBlbmQtcG9zKQogICAgICAgICAgICAgICAgICAgIChzZXRxIHRv
Y3MgKG1hcmtkb3duLXRzLS10b2NzIGJlZy1wb3MgZW5kLXBvcykpKQogICAgICAgICAgKG1hcmtk
b3duLXRzLS10b2NzLXNhbml0eS1jaGVjayB0b2NzKQogICAgICAgICAgOzsgQWZ0ZXIgc2FuaXR5
IGNoZWNraW5nLCB3ZSBrbm93IHRoZSBzZWNvbmQgZWxlbWVudCBpcyBhCiAgICAgICAgICA7OyB0
b2MtZW5kLgogICAgICAgICAgKGxldCogKCh0b2MgKG50aCAwIHRvY3MpKQogICAgICAgICAgICAg
ICAgICh0b2MtZW5kIChudGggMSB0b2NzKSkKICAgICAgICAgICAgICAgICAocmVnLWJlZyAoaWYg
cmVtb3ZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGlzdC1nZXQgJ2JlZyB0b2Mp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxpc3QtZ2V0ICdlbmQgdG9jKSkpCiAgICAg
ICAgICAgICAgICAgKHJlZy1lbmQgKGlmIHJlbW92ZQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAoYWxpc3QtZ2V0ICdlbmQgdG9jLWVuZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChhbGlzdC1nZXQgJ2JlZyB0b2MtZW5kKSkpCiAgICAgICAgICAgICAgICAgKHJlZy1zaXplICgt
IHJlZy1lbmQgcmVnLWJlZykpKQogICAgICAgICAgICAoZGVsZXRlLXJlZ2lvbiByZWctYmVnIHJl
Zy1lbmQpCiAgICAgICAgICAgIDs7IFN0YXJ0IHRoZSBuZXh0IHBhc3MgYWZ0ZXIgdGhpcyB0b2Mt
ZW5kLiAgQWRqdXN0IGZvciB0aGUKICAgICAgICAgICAgOzsgZGVsZXRlZCByZWdpb24uCiAgICAg
ICAgICAgIChzZXRxIGJlZy1wb3MgKC0gKGFsaXN0LWdldCAnZW5kIHRvYy1lbmQpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmVnLXNpemUpKQogICAgICAgICAgICAoc2V0cSBlbmQtcG9z
IChtaW4gKHBvaW50LW1heCkgKC0gZW5kLXBvcyByZWctc2l6ZSkpKSkpKSkpKQoKOzs7IyMjYXV0
b2xvYWQKKGRlZnVuIG1hcmtkb3duLXRzLXRvYy1pbnNlcnQtdGVtcGxhdGUgKCZvcHRpb25hbCBj
aGFyKQogICJJbnNlcnQgYSBgbWFya2Rvd24tdHMtbW9kZWAgdGFibGUgb2YgY29udGVudHMgdGVt
cGxhdGUgYXQgcG9pbnQuCgpDSEFSIGlzIHRoZSB0ZW1wbGF0ZSB0eXBlIFwiYlwiIGZvciBiYXNp
YywgXCJjXCIgZm9yIGNvbXBsZXRlLiAgSWYgQ0hBUgppcyBuaWwgYW5kIHRoZSBjb21tYW5kIGlz
IHJ1biBpbnRlcmFjdGl2ZWx5LCBwcm9tcHQgZm9yIGEgdGVtcGxhdGUuCgpUaGUgYmFzaWMgdGVt
cGxhdGUgdXNlcyBhbGwgZGVmYXVsdHMgYW5kIGlzIGxpa2VseSB0aGUgYmVzdCBjaG9pY2UgZm9y
Cm1vc3QgdXNlcy4gIFRoZSBjb21wbGV0ZSB0ZW1wbGF0ZSBpbGx1c3RyYXRlcyBhbGwgcGFyYW1l
dGVycyBzZXQgdG8KdGhlaXIgZGVmYXVsdHMgYW5kIGlzIHVzZWZ1bCBhcyBhIHN0YXJ0aW5nIHBv
aW50IHRvIGN1c3RvbWl6ZSBhIHRhYmxlLiIKICAoaW50ZXJhY3RpdmUKICAgKGxpc3QgKGNhciAo
cmVhZC1tdWx0aXBsZS1jaG9pY2UKICAgICAgICAgICAgICAgIlRhYmxlIG9mIGNvbnRlbnRzIHRl
bXBsYXRlIgogICAgICAgICAgICAgICAnKCg/YiAiYmFzaWMiKQogICAgICAgICAgICAgICAgICg/
YyAiY29tcGxldGUiKSkpKSkpCiAgKHBjYXNlIGNoYXIKICAgICg/YgogICAgIChpbnNlcnQgIjwh
LS0gbWFya2Rvd24tdHMtdG9jOiAtLT5cbiIKICAgICAgICAgICAgICI8IS0tIG1hcmtkb3duLXRz
LXRvYy1lbmQ6IC0tPlxuIikpCiAgICAoP2MKICAgICAoaW5zZXJ0ICI8IS0tIG1hcmtkb3duLXRz
LXRvYzogLSotICIKICAgICAgICAgICAgICJtaW4tZGVwdGg6IDE7ICIKICAgICAgICAgICAgICJt
YXgtZGVwdGg6IG5pbDsgIgogICAgICAgICAgICAgImNhbmRpZGF0ZXM6IChoZWFkaW5nKTsgIgog
ICAgICAgICAgICAgImZyb206IGJlbG93OyAiCiAgICAgICAgICAgICAic3R5bGU6IGl0ZW07ICIK
ICAgICAgICAgICAgICJpbmRlbnQ6IDE7ICIKICAgICAgICAgICAgICJuby1saW5rOiBuaWw7ICIK
ICAgICAgICAgICAgICJyZWxhdGl2ZS1kZXB0aDogbmlsOyAiCiAgICAgICAgICAgICAiaWdub3Jl
OiBuaWw7ICIKICAgICAgICAgICAgICItKi0gLS0+XG4iCiAgICAgICAgICAgICAiPCEtLSBtYXJr
ZG93bi10cy10b2MtZW5kOiAtLT5cbiIpKQogICAgKF8gKHVzZXItZXJyb3IgIk5vIHN1Y2ggdGVt
cGxhdGUgdHlwZTogJWMiIGNoYXIpKSkpCgo7OzsjIyNhdXRvbG9hZAooZGVmdW4gbWFya2Rvd24t
dHMtdG9jLWdlbmVyYXRlICgmb3B0aW9uYWwgaW50ZXJhY3RpdmUgYmVnIGVuZCkKICAiR2VuZXJh
dGUgdGFibGVzIG9mIGNvbnRlbnRzIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KYG1hcmtkb3duLXRz
LW1vZGUnIHVzZXMgTWFya2Rvd24gSFRNTCBjb21tZW50IGVsZW1lbnRzIHRvIGlkZW50aWZ5IHRh
YmxlCm9mIGNvbnRlbnRzIChha2EgdG9jKSBpbnNlcnRpb24gYm91bmRhcmllcyBhbmQgdGhlIHBh
cmFtZXRlcnMgZm9yIGVhY2gKdGFibGUuICBEZXJpdmUgdGFibGUgY29udGVudCBmcm9tIHRoZSBN
YXJrZG93biBlbGVtZW50cyBpbiB0aGUgY3VycmVudApidWZmZXIgd2hpY2ggYXJlIHVzdWFsbHkg
aGVhZGluZ3MgYnV0IGNhbiBhbHNvIGJlIGxpc3QgaXRlbXMsIHNldGV4dApoZWFkZXJzLCBuYW1l
ZCBjb2RlIGJsb2Nrcy4KCk9wZXJhdGUgb24gdGhlIGFjdGl2ZSByZWdpb24gQkVHIHRvIEVORCwg
b3RoZXJ3aXNlIG9wZXJhdGUgb24gdGhlCmJ1ZmZlciwgd2hpY2ggbWF5IGJlIG5hcnJvd2VkLgoK
RWFjaCB0aW1lIHlvdSBydW4gdGhpcyBjb21tYW5kLCBleGlzdGluZyB0YWJsZXMgb2YgY29udGVu
dHMgYXJlIGNsZWFyZWQKYW5kIHJlZnJlc2hlZCB3aXRoIG5ldyBjb250ZW50LiAgU28gZG9uJ3Qg
cGxhY2UgdG9jIGVsZW1lbnRzIGFyb3VuZAppbXBvcnRhbnQgdGV4dC4KClRoZSBidWZmZXIgY2Fu
IGhhdmUgb25lIG9yIG1vcmUgdG9jcy4gIEJ5IGRlZmF1bHQsIHBvcHVsYXRlIGVhY2ggdG9jCndp
dGggZWxlbWVudHMgdGhhdCBhcHBlYXIgaW4gdGhlIGJ1ZmZlciBiZWxvdyB0aGUgdG9jLiAgVGhl
cmVmb3JlLCB0aGUKZWFzaWVzdCB3YXkgdG8gaW5zZXJ0IGEgY29tcGxldGUgdGFibGUgb2YgY29u
dGVudHMsIGlzIHRvIHB1dCB0aGUgdG9jCnRlbXBsYXRlIG5lYXIgdGhlIHRvcCBvZiB5b3VyIGJ1
ZmZlci4KCkEgYmFzaWMgZW1wdHkgdG9jIHRlbXBsYXRlIGxvb2tzIGxpa2UgdGhpczoKCkhlYWRl
ciB0ZXh0IHlvdSB3YW50IGhlcmUuCgo8IS0tIG1hcmtkb3duLXRzLXRvYzogLS0+CkNvbnRlbnRz
IGluc2VydGVkIGJldHdlZW4gdGhlc2UgZWxlbWVudHMuCjwhLS0gbWFya2Rvd24tdHMtdG9jLWVu
ZDogLS0+CgpGb290ZXIgdGV4dCB5b3Ugd2FudCBoZXJlLgoKVXNlIHRoZSBjb21tYW5kIGBtYXJr
ZG93bi10cy10b2MtaW5zZXJ0LXRlbXBsYXRlJyB0byBpbnNlcnQgYSB0YWJsZSBvZgpjb250ZW50
cyB0ZW1wbGF0ZS4KClVzZSB0aGUgY29tbWFuZCBgbWFya2Rvd24tdHMtdG9jLWNsZWFyJyB0byBj
bGVhciB0YWJsZSBjb250ZW50LCBhbmQgdGhlCmNvbW1hbmQgYG1hcmtkb3duLXRzLXRvYy1jbGVh
ci1hbmQtcmVtb3ZlJyB0byBib3RoIGNsZWFyIGFuZCByZW1vdmUKdGFibGUgY29udGVudCBhbmQg
dGVtcGxhdGVzLgoKQnkgZGVmYXVsdCwgYSB0b2MgaW5jbHVkZXMgaGVhZGVycyBhdCBhbGwgbGV2
ZWxzIGJlbG93IHRoZSB0b2Mgd2hpY2ggYXJlCnByZXNlbnRlZCBhcyBsaXN0IGl0ZW1zIHdpdGgg
bGlua3MuCgpUbyBpZ25vcmUgYSBNYXJrZG93biBlbGVtZW50IHRoYXQgd291bGQgb3RoZXJ3aXNl
IGJlIGluY2x1ZGVkIGluIHRoZQp0b2MsIGFkZCBhIHRvYyBpZ25vcmUgZWxlbWVudDoKCiMjIEln
bm9yZSBNZSA8IS0tIG1hcmtkb3duLXRzLXRvYy1pZ25vcmU6IC0tPgoKVGhlIHN0YXJ0aW5nIHRv
YyBlbGVtZW50IGFjY2VwdHMgcGFyYW1ldGVycyBpbiB0aGUgc3ludGF4IG9mIEVtYWNzIGZpbGUK
dmFyaWFibGVzLgoKRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGdlbmVyYXRlIGEgdGFibGUg
b2YgY29udGVudHMgbGltaXRlZCB0bwpoZWFkaW5ncyB0d28gbGV2ZWxzIGRlZXA6Cgo8IS0tIG1h
cmtkb3duLXRzLXRvYzogLSotIG1heC1kZXB0aDogMjsgLSotIC0tPgo8IS0tIG1hcmtkb3duLXRz
LXRvYy1lbmQ6IC0tPgoKT3IgdXNlIG9ubHkgaGVhZGluZ3MgdHdvIGFuZCB0aHJlZSBsZXZlbHMg
ZGVlcC4KCjwhLS0gbWFya2Rvd24tdHMtdG9jOiAtKi0gbWluLWRlcHRoOiAyOyBtYXgtZGVwdGg6
IDM7IC0qLSAtLT4KPCEtLSBtYXJrZG93bi10cy10b2MtZW5kOiAtLT4KClRoZXNlIGFyZSB0aGUg
c3VwcG9ydGVkIHBhcmFtZXRlcnMgd2hpY2ggYXJlIG9wdGlvbmFsLiAgVGhleSBlYWNoIGxpc3QK
dGhlaXIgZGVmYXVsdHMuCgogIG1pbi1kZXB0aDogMSAgICAgICAgICA7IGFuIGludGVnZXIKICBt
YXgtZGVwdGg6IG5pbCAgICAgICAgOyBhbiBpbnRlZ2VyCiAgY2FuZGlkYXRlczogKGhlYWRpbmcp
IDsgYSBsaXN0CiAgZnJvbTogYmVsb3cgICAgICAgICAgIDsgYSBzeW1ib2wKICBzdHlsZTogaXRl
bSAgICAgICAgICAgOyBhIHN5bWJvbAogIGluZGVudDogMSAgICAgICAgICAgICA7IGEgbnVtYmVy
CiAgbm8tbGluazogbmlsICAgICAgICAgIDsgYSBib29sZWFuCiAgcmVsYXRpdmUtZGVwdGg6IG5p
bCAgIDsgYSBib29sZWFuCiAgaWdub3JlOiBuaWwgICAgICAgICAgIDsgYSBib29sZWFuCgpgbWlu
LWRlcHRoJyBhbmQgYG1heC1kZXB0aCcgYm90aCBkZWZhdWx0IHRvIHVzaW5nIGFsbCBjYW5kaWRh
dGVzIGF0CmV2ZXJ5IGxldmVsLiAgVXNlIGBtaW4tZGVwdGgnIHRvIGlnbm9yZSBsZXZlbCAxIGhl
YWRpbmdzIGxpa2UgXCIjCkhlYWRpbmdcIiwgYnkgdXNpbmcgMi4gIFVzZSBgbWF4LWRlcHRoJyB0
byBjb250cm9sIGhvdyBkZWVwIGludG8gdGhlCmhlYWRpbmcgaGllcmFyY2h5IHlvdSBuZWVkIHlv
dXIgdG9jIHRvIGdvLiAgVXNlIDMgdG8gc3RvcCBhdCBsZXZlbCB0aHJlZQpoZWFkaW5ncy4KCkhl
YWRpbmdzIGRpY3RhdGUgdGhlIGxldmVsIG9mIHRoZWlyIGNoaWxkcmVuIGV2ZW4gaWYgaGVhZGlu
Z3MgYXJlCmV4Y2x1ZGVkIGZyb20gY2FuZGlkYXRlcy4gIE90aGVyIGVsZW1lbnQgdHlwZXMgaW5o
ZXJpdCB0aGUgbGV2ZWwgb2YKdGhlaXIgcHJlY2VkaW5nIGhlYWRpbmcuCgpgY2FuZGlkYXRlcycg
aXMgYSBsaXN0IGFuZCBjYW4gY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBNYXJrZG93bgpl
bGVtZW50IHNob3J0Y3V0IG5hbWVzLiAgWW91IGNhbiBtaXggaGlnaGVyLWxldmVsIGdyb3VwaW5n
IHN5bWJvbHMgYW5kCmxvd2VyIGxldmVsIHN5bWJvbHMuCgogIGFsbCAoaW5jbHVkZXMgZXZlcnl0
aGluZykKICBoZWFkaW5nIChpbmNsdWRlcyB0aGUgYmVsb3cpCiAgICBoMSBoMiBoMyBoNCBoNSBo
NgogIHNldGV4dCAoaW5jbHVkZXMgdGhlIGJlbG93KQogICAgc2gxIHNoMgogIGl0ZW0gKGluY2x1
ZGVzIHRoZSBiZWxvdykKICAgIG1pbnVzIHBsdXMgc3RhcgogIG51bWJlcmVkLWl0ZW0gKGluY2x1
ZGVzIHRoZSBiZWxvdykKICAgIGRvdCBwYXJlbgogIGNvZGUgKG5hbWVkIGNvZGUgYmxvY2tzKQoK
YGZyb20nIGNvbnRyb2xzIHRoZSBkaXJlY3Rpb24gYW5kIHNjb3BlIGZyb20gd2hpY2ggY2FuZGlk
YXRlcyBhcmUKc2VsZWN0ZWQuICBUeXBpY2FsbHksIGEgdG9jIGlzIHBsYWNlZCBhdCB0aGUgYmVn
aW5uaW5nIG9mIGEgYnVmZmVyIGFuZApgZnJvbScgaXMgYGJlbG93JyB0byBjYXB0dXJlIGVudHJ5
IGNhbmRpZGF0ZXMgYWZ0ZXIgdGhlIHRvYy4gIElmIHlvdSBzZXQKYGZyb20nIHRvIGBhYm92ZScs
IGNhbmRpZGF0ZXMgYXJlIHNlbGVjdGVkIGZyb20gYWJvdmUgdGhlIHRvYy4gIFVzZQpgYWxsJyB0
byBjYXB0dXJlIGV2ZXJ5IGVudHJ5IGNhbmRpZGF0ZS4gIFRoaXMgaXMgdXNlZnVsIHRvIGNyZWF0
ZSBhCmNvbXBsZXRlIHRvYyBhdCB0aGUgZW5kIG9mIHlvdXIgYnVmZmVyLgoKVGhlIGBzdHlsZScg
cGFyYW1ldGVyIGNhbiBiZSBuaWwsIGBpdGVtJywgYG51bWJlcicgb3IgYG51bWJlci4nLiAgVW5k
ZXIKbmlsLCBlbnRyaWVzIGhhdmUgbm8gZGVjb3JhdGlvbnMuICBJZiBgaXRlbScsIGVudHJpZXMg
YXJlIHByZWZpeGVkIHdpdGgKXCItXCIuICBJZiBgYnVsbGV0JywgcHJlZml4IHdpdGggXCIqXCIu
ICBJZiBgbnVtYmVyJywgbnVtZXJpYyBwcmVmaXhlcwphcmUgZ2VuZXJhdGVkLCBmb3IgZXhhbXBs
ZSAxLCAxLjEsIDIsIDIuMSwgMi4xLjEsIDIuMS4yLiAgVXNlIGBudW1iZXIuJwp0byBhZGQgYSBw
ZXJpb2QgdG8gZWFjaCBlbnRyeSdzIG51bWJlci4KCmBpbmRlbnQnIGlzIGFuIGludGVnZXIgYmV0
d2VlbiAwIGFuZCAxMC4gIDAgbWVhbnMgbm90aGluZyBzaG91bGQgYmUKaW5kZW50ZWQuICBPdGhl
cndpc2UsIGVhY2ggZW50cnkgaXMgaW5kZW50ZWQgYnkgdGhlIG51bWJlciBvZiBzcGFjZXMgb2YK
aXRzIE1hcmtkb3duIGxldmVsIG11bHRpcGxpZWQgYnkgdGhpcyB2YWx1ZS4gIENhbmRpZGF0ZXMg
dGhhdCBoYXZlIG5vCm5hdGl2ZSBsZXZlbCBzdWNoIGFzIGxpc3QgaXRlbXMgaW5oZXJpdCB0aGUg
YmFzZSBpbmRlbnRhdGlvbiBsZXZlbCBvZgppdHMgcHJlY2VkaW5nIGhlYWRlci4gIExpc3QgaXRl
bSBoaWVyYXJjaGllcyBhbmQgY29kZSBibG9ja3MgaW5kZW50CnVuZGVyIHRoYXQgYmFzZS4KClNl
dCBgbm8tbGluaycgdG8gdCBpZiB5b3UgZG8gbm90IHdhbnQgeW91ciBlbnRyaWVzIHRvIGhhdmUg
aGVhZGVyIGxpbmtzLgpCeSBkZWZhdWx0LCBlYWNoIGVudHJ5IGRlcml2ZWQgZnJvbSBhIGhlYWRp
bmcgaXMgcHJlc2VudGVkIGFzIGEgbGluayB0bwppdHMgc291cmNlIGhlYWRpbmcuICBOT1RFOiBU
aGUgZWxlbWVudHMgcmVwcmVzZW50ZWQgYnkgYHNldGV4dCcsIGBpdGVtJywKYG51bWJlcmVkLWl0
ZW0nLCBgY29kZScgZG8gbm90IHN1cHBvcnQgbGlua3MuCgpVc2UgYHJlbGF0aXZlLWRlcHRoJyB0
byBjcmVhdGUgYSB0b2MgdW5kZXJuZWF0aCBhIGhlYWRpbmcsIGxpbWl0aW5nIHRoZQp0b2MgdG8g
aGVhZGluZyBkZXB0aHMgdW5kZXJuZWF0aCB0aGUgcHJlY2VkaW5nIGhlYWRlciBhbmQgc3BlY2lm
eSB0aGUKbGV2ZWxzIHJlbGF0aXZlIHRvIHRoYXQgaGVhZGVyLiAgTW9yZSBjb25jcmV0ZWx5LCBp
ZiB0aGUgcHJlY2VkaW5nCmhlYWRlciBpcyBhIGxldmVsIDEgXCIjXCIgaGVhZGVyLCBgbWluLWRl
cHRoJyAxIGFuZCBgbWF4LWRlcHRoJyAyIHdpbGwKYmUgaW50ZXJwcmV0ZWQgdG8gYmUgMiBhbmQg
My4gIElmIHlvdSBkZW1vdGUgdGhlIGhlYWRlciB0byBsZXZlbCAyClwiIyNcIiB0aGV5IHdpbGwg
YmUgaW50ZXJwcmV0ZWQgYXMgMyBhbmQgNC4gIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkCmZ1c3Np
bmcgd2l0aCB0b2MgY29uZmlndXJhdGlvbnMgdW5kZXIgaGVhZGVycyB3aGVuIHlvdSBjaGFuZ2Ug
dGhlaXIKbGV2ZWxzLgoKRm9yIGV4YW1wbGU6Cgo8IS0tIG1hcmtkb3duLXRzLXRvYzogLSotIHJl
bGF0aXZlLWRlcHRoOiB0OyBtaW4tZGVwdGg6IDE7IG1heC1kZXB0aDogMjsgLSotIC0tPgo8IS0t
IG1hcmtkb3duLXRzLXRvYy1lbmQ6IC0tPgoKRmluYWxseSwgaWYgYGlnbm9yZScgaXMgdCwgeW91
IGNhbiBrZWVwIGEgdG9jIGVsZW1lbnQgaW4gcGxhY2UgYW5kIHNraXAKaXQuCgpJTlRFUkFDVElW
RSB3aWxsIGJlIG5vbi1uaWwgaWYgdGhpcyBjb21tYW5kIHdhcyBpbnZva2VkIGludGVyYWN0aXZl
bHkuCgpTZWUgYG1hcmtkb3duLXRzLXRvYy1nZW5lcmF0ZS13YXJuLWlmLW5vbmUnIHRvIGNvbmZp
Z3VyZSB3YXJuaW5ncyBhYm91dAp0YWJsZXMgbm90IGJlaW5nIHByb2Nlc3NlZCB3aGVuIHRoaXMg
ZnVuY3Rpb24gaXMgY2FsbGVkLiIKICAoaW50ZXJhY3RpdmUgInBcblIiKQogIDs7IE5PVEU6IElm
IHBhcmFtZXRlcnMgb3IgdGhlaXIgZGVmYXVsdHMgY2hhbmdlLCBiZSBzdXJlIHRvIG1pcnJvcgog
IDs7IHRoZW0gaW4gYG1hcmtkb3duLXRzLXRvYy1pbnNlcnQtdGVtcGxhdGUnLgogIChtYXJrZG93
bi10cy0tYmFyZi1pZi1ub3QtbW9kZSAnbWFya2Rvd24tdHMtdG9jLWdlbmVyYXRlKQogIChzZXRx
IGJlZyAob3IgYmVnIChwb2ludC1taW4pKSkKICAoc2V0cSBlbmQgKG9yIGVuZCAocG9pbnQtbWF4
KSkpCiAgKHVubGVzcyAoZXEgYmVnIGVuZCkKICAgIDs7IENvbnZlcnQgbWFya2VycyB0byBhYnNv
bHV0ZSBwb3NpdGlvbnMuCiAgICAoc2V0cSBiZWcgKGlmIChtYXJrZXJwIGJlZykgKG1hcmtlci1w
b3NpdGlvbiBiZWcpIGJlZykpCiAgICAoc2V0cSBlbmQgKGlmIChtYXJrZXJwIGVuZCkgKG1hcmtl
ci1wb3NpdGlvbiBlbmQpIGVuZCkpCiAgICA7OyBOT1RFOiBPcGVyYXRlIG9uIHRoZSB3aWRlbmVk
IGJ1ZmZlciB0byBhdm9pZCB0cmVlc2l0ZXIgY3Jhc2ggaXNzdWVzLgogICAgKHdpdGhvdXQtcmVz
dHJpY3Rpb24KICAgICAgKGxldCAoKHRvY3MgKG1hcmtkb3duLXRzLS10b2NzIGJlZyBlbmQpKSkK
ICAgICAgICAodW5sZXNzIHRvY3MKICAgICAgICAgIChpZiAoYW5kIGludGVyYWN0aXZlCiAgICAg
ICAgICAgICAgICAgICAoZXEgJ2luc2VydC10ZW1wbGF0ZSBtYXJrZG93bi10cy10b2MtZ2VuZXJh
dGUtd2Fybi1pZi1ub25lKSkKICAgICAgICAgICAgICAocHJvZ24KICAgICAgICAgICAgICAgICht
YXJrZG93bi10cy10b2MtaW5zZXJ0LXRlbXBsYXRlKQogICAgICAgICAgICAgICAgOzsgSWYgdGhl
IHVzZXIgZGlkbid0IHF1aXQgdGhlIHByb21wdCwgYSB0ZW1wbGF0ZSBtYXkgaGF2ZQogICAgICAg
ICAgICAgICAgOzsgYmVlbiBhZGRlZCwgc28gcmVzY2FuIHRoZSBidWZmZXIuCiAgICAgICAgICAg
ICAgICAoc2V0cSB0b2NzIChtYXJrZG93bi10cy0tdG9jcykpKQogICAgICAgICAgICAod2hlbiAo
ZXEgJ25vLXRhYmxlcyBtYXJrZG93bi10cy10b2MtZ2VuZXJhdGUtd2Fybi1pZi1ub25lKQogICAg
ICAgICAgICAgIChsd2FybiAnbWFya2Rvd24tdHMtdG9jLWdlbmVyYXRlCiAgICAgICAgICAgICAg
ICAgICAgIDp3YXJuaW5nCiAgICAgICAgICAgICAgICAgICAgICJObyB0YWJsZXMgb2YgY29udGVu
dHMgZm91bmQgaW4gJXMuIgogICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLW5hbWUgKGN1cnJl
bnQtYnVmZmVyKSkpKSkpCiAgICAgICAgKG1hcmtkb3duLXRzLS10b2NzLXNhbml0eS1jaGVjayB0
b2NzKQoKICAgICAgICA7OyBTdHJhdGVneSBpcyBwcm9jZXNzIG9uZSB0b2MgYXQgYSB0aW1lIGZy
b20gdGhlIHRvcCB0byB0aGUKICAgICAgICA7OyBib3R0b20gb2YgdGhlIHJhbmdlIEJFRyBFTkQu
ICBTdWJzZXF1ZW50IHRvYyBhbmQgZW50cnkKICAgICAgICA7OyBjYW5kaWRhdGUgbm9kZSBwb3Np
dGlvbnMgY2hhbmdlIGFzIHdlIHVwZGF0ZSBlYWNoIHRvYyB0ZXh0IHNvCiAgICAgICAgOzsgd2Ug
aGF2ZSB0byByZXRyaWV2ZSB0aGVtIGZyZXNoIGZyb20gdGhlIGVuZCBvZiB0aGUgbW9zdCByZWNl
bnQKICAgICAgICA7OyB0b2MuCiAgICAgICAgKGxldCAoKHRvY3MpCiAgICAgICAgICAgICAgKG51
bS10b2NzLXByb2Nlc3NlZCAwKQogICAgICAgICAgICAgICh0b2MpCiAgICAgICAgICAgICAgKHRv
Yy1lbmQpCiAgICAgICAgICAgICAgKHRvYy1zaXplKQogICAgICAgICAgICAgIDs7IFRoZXNlIGFy
ZSBhZGp1c3RlZCBieSB0aGUgc2l6ZSBvZiBpbnNlcnRlZCB0ZXh0IGVhY2ggcGFzcy4KICAgICAg
ICAgICAgICAoYmVnLXBvcyBiZWcpCiAgICAgICAgICAgICAgKGVuZC1wb3MgZW5kKQogICAgICAg
ICAgICAgIChzb3VyY2UtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKQogICAgICAgICAgOzsgRmlu
ZCBlYWNoICJtYXJrZG93bi10cy10b2MiIGluIHN1Y2Nlc3Npb24gc3RhcnRpbmcgYXQgdGhlIGVu
ZAogICAgICAgICAgOzsgb2YgZWFjaCBwcmV2aW91cyBvbmUgd2UgZmluZCB3aXRoaW4gdGhlIHJl
cXVlc3RlZCByZWdpb24uCiAgICAgICAgICAod2hpbGUgKGFuZCAoPCBiZWctcG9zIGVuZC1wb3Mp
CiAgICAgICAgICAgICAgICAgICAgICAoc2V0cSB0b2NzIChtYXJrZG93bi10cy0tdG9jcyBiZWct
cG9zIGVuZC1wb3MpKSkKICAgICAgICAgICAgKHNldHEgdG9jIChjYXIgdG9jcykpCiAgICAgICAg
ICAgIChzZXRxIHRvYy1zaXplIDApCgogICAgICAgICAgICAod2hlbiAoZXF1YWwgIm1hcmtkb3du
LXRzLXRvYyIgKGNhciB0b2MpKQogICAgICAgICAgICAgIDs7IEFmdGVyIHNhbml0eSBjaGVja2lu
Zywgd2Uga25vdyB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgYQogICAgICAgICAgICAgIDs7IHRvYy1l
bmQuCiAgICAgICAgICAgICAgKHNldHEgdG9jLWVuZCAobnRoIDEgdG9jcykpCiAgICAgICAgICAg
ICAgKGxldCogKCh0b2Mtbm9kZSAoYWxpc3QtZ2V0ICdub2RlIHRvYykpCiAgICAgICAgICAgICAg
ICAgICAgICh0b2MtdmFycyAoYWxpc3QtZ2V0ICd2YXJzIHRvYykpCiAgICAgICAgICAgICAgICAg
ICAgICh0b2MtaWdub3JlIChhbGlzdC1nZXQgJ2lnbm9yZSB0b2MtdmFycykpKQogICAgICAgICAg
ICAgICAgKHVubGVzcyB0b2MtaWdub3JlCiAgICAgICAgICAgICAgICAgIDs7IEJ1aWxkIHRoZSB0
b2Mgb25lIGNhbmRpZGF0ZSBhdCBhIHRpbWUsIHRyYWNraW5nCiAgICAgICAgICAgICAgICAgIDs7
IGluZGVudGF0aW9uIGFuZCBjcmVhdGluZyBsaW5rcyBpZiBuZWVkZWQuCiAgICAgICAgICAgICAg
ICAgIChsZXQqICgodG9jLWVuZC1ub2RlIChhbGlzdC1nZXQgJ25vZGUgdG9jLWVuZCkpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAocmVnLWJlZyAodHJlZXNpdC1ub2RlLWVuZCB0b2Mtbm9kZSkp
CiAgICAgICAgICAgICAgICAgICAgICAgICAocmVnLWVuZCAodHJlZXNpdC1ub2RlLXN0YXJ0IHRv
Yy1lbmQtbm9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAodG9jLWhhbmRsZXMgKG1hcmtk
b3duLXRzLS10b2MtZXhwYW5kLWNhbmRpZGF0ZS1oYW5kbGVzCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChvciAoY2RyLXNhZmUgKGFzc3EgJ2NhbmRpZGF0ZXMgdG9jLXZh
cnMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlYWRpbmcp
KSkKICAgICAgICAgICAgICAgICAgICAgICAgIDs7IE5vdyBhZGQgaGVhZGluZ3MgdG8gYWx3YXlz
IHJldHJpZXZlIGFuZCBkZXJpdmUKICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGxldmVscyBl
dmVuIGlmIHRoZXkgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHRvYy4KICAgICAgICAgICAgICAgICAg
ICAgICAgIChzZWVkLWhhbmRsZXMgKGNvcHktdHJlZSB0b2MtaGFuZGxlcykpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAoXyAoZG9saXN0IChlbHQgKGFsaXN0LWdldCAnaGVhZGluZyBtYXJrZG93
bi10cy0tdG9jLWhhbmRsZXMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2wtcHVz
aG5ldyBlbHQgc2VlZC1oYW5kbGVzKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAodG9jLWZy
b20gKG9yIChjZHItc2FmZSAoYXNzcSAnZnJvbSB0b2MtdmFycykpICdiZWxvdykpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAodG9jLXN0eWxlIChvciAoY2RyLXNhZmUgKGFzc3EgJ3N0eWxlIHRv
Yy12YXJzKSkgJ2l0ZW0pKQogICAgICAgICAgICAgICAgICAgICAgICAgKHRvYy1uby1saW5rIChh
bGlzdC1nZXQgJ25vLWxpbmsgdG9jLXZhcnMpKQogICAgICAgICAgICAgICAgICAgICAgICAgKHRv
Yy1pbmRlbnQgKG1pbiAxMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAobWF4IDAgKG9yIChjZHItc2FmZSAoYXNzcSAnaW5kZW50IHRvYy12YXJzKSkgMSkpKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgICh0b2MtbWluLWRlcHRoIChtYXggMQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgKGNkci1zYWZlIChhc3NxICdtaW4t
ZGVwdGggdG9jLXZhcnMpKSAxKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAodG9jLW1heC1k
ZXB0aCAobWF4IHRvYy1taW4tZGVwdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKG9yIChjZHItc2FmZSAoYXNzcSAnbWF4LWRlcHRoIHRvYy12YXJzKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc3QtcG9zaXRp
dmUtZml4bnVtKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAodG9jLXJlbGF0aXZlLWRlcHRo
IChjZHItc2FmZSAoYXNzcSAncmVsYXRpdmUtZGVwdGggdG9jLXZhcnMpKSkKICAgICAgICAgICAg
ICAgICAgICAgICAgICh0b2MtY2FuZGlkYXRlcyAobWFya2Rvd24tdHMtLXRvYy1jb2xsZWN0LWNh
bmRpZGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9jLW5v
ZGUgdG9jLWVuZC1ub2RlIHNlZWQtaGFuZGxlcyB0b2MtZnJvbSkpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAodG9jLXJlbGF0aXZlLWhlYWRpbmctZGVwdGgKICAgICAgICAgICAgICAgICAgICAg
ICAgICAoMSsgKG9yIChzZXEtcG9zaXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAnKCJhdHhfaDFfbWFya2VyIiAiYXR4X2gyX21hcmtlciIgImF0eF9oM19tYXJrZXIiCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR4X2g0X21hcmtlciIgImF0eF9o
NV9tYXJrZXIiICJhdHhfaDZfbWFya2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAodHJlZXNpdC1ub2RlLXR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKHRyZWVzaXQtbm9kZS1jaGlsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKHRyZWVzaXQtc2VhcmNoLWZvcndhcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB0b2Mtbm9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJh
dHhfaGVhZGluZyIgJ2JhY2t3YXJkKSAwICduYW1lZCkpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIydlcXVhbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0x
KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAoc2x1Zy10by1wb3MgKG1hcmtkb3duLXRzLS1o
ZWFkaW5nLWlkcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAocG9zLXRvLXNsdWcKICAgICAg
ICAgICAgICAgICAgICAgICAgICAobGV0ICgoaHQgKG1ha2UtaGFzaC10YWJsZSA6c2l6ZSAoaGFz
aC10YWJsZS1jb3VudCBzbHVnLXRvLXBvcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICA6dGVzdCAjJ2VxdWFsKSkpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAobWFwaGFzaCAobGFtYmRhIChrIHYpIChwdXRoYXNoIHYgayBodCkpIHNsdWct
dG8tcG9zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHQpKSkKCiAgICAgICAgICAgICAg
ICAgICAgKHdpdGgtd29yay1idWZmZXIKICAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQgIjwh
LS0gTk9URTogbWFya2Rvd24tdHMtdG9jIGdlbmVyYXRlZCB0ZXh0IHNlY3Rpb24gbWF5IGJlIG92
ZXJ3cml0dGVuLiAtLT5cbiIpCiAgICAgICAgICAgICAgICAgICAgICAobGV0ICgoaGFuZGxlKSAo
aGFuZGxlLWNsYXNzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vZGUpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoaW5kZW50IDApIChsZXZlbCAxKSAobGV2ZWwtcHJldiAwKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgSGVhZGluZyBsZXZlbCB0YWtlcyBwcmVjZWRl
bmNlIG92ZXIgaXRlbXMgdW5kZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGl0LiAg
SWYgdGhlcmUgYXJlIG5vIGhlYWRpbmdzLCBpdCB3aWxsIHJlbWFpbiAxLgogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGxldmVsLWhlYWRpbmcgMSkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDs7IEFkanVzdCBmb3Igbm9uIGhlYWRpbmdzIHVuZGVyIGhlYWRpbmdzLgogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKG51bWJlci1zdGFjaykpCgogICAgICAgICAgICAgICAgICAgICAg
ICA7OyBDYW5kaWRhdGVzIHNob3VsZCBiZSBpbiBidWZmZXIgb3JkZXIuCiAgICAgICAgICAgICAg
ICAgICAgICAgIChkb2xpc3QgKGNhbmRpZGF0ZSB0b2MtY2FuZGlkYXRlcykKICAgICAgICAgICAg
ICAgICAgICAgICAgICAobGV0ICgoc2x1Zy1wb3MpICh0ZXh0KSAobGluay10YXJnZXQpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldmVsLWFkaiAwKSkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChzZXRxIGhhbmRsZSAoY2FyIGNhbmRpZGF0ZSkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGhhbmRsZS1jbGFzcyAoYWxpc3QtZ2V0CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBtYXJrZG93bi10cy0tdG9j
LWhhbmRsZS1jbGFzc2VzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIG5vZGUg
KGNkciBjYW5kaWRhdGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgc2x1Zy1w
b3MgbmlsKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFN0cmlwIHRyYWlsaW5nIG5l
d2xpbmVzLiAgQWRkIHRoZW0gY29uc2lzdGVudGx5IGJlbG93LgogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKHNldHEgdGV4dCAoc3RyaW5nLXRyaW0tcmlnaHQKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChtYXJrZG93bi10cy0tdG9jLXRleHQtbm9ybWFsaXplCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIG5vZGUKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLXRleHQgbm9k
ZSAnbm8tcHJvcGVydHkpKSkpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgQ2FuZGlk
YXRlIG5vZGUgdHlwZSBsb2dpYy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwY2FzZSBo
YW5kbGUtY2xhc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdoZWFkaW5nCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgoeCAoc2VxLXBvc2l0aW9uICcoaDEgaDIg
aDMgaDQgaDUgaDYpIGhhbmRsZSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
c2V0cSBzbHVnLXBvcyAodHJlZXNpdC1ub2RlLXN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1zZWFyY2gtZm9yd2FyZCBub2RlICJh
dHhfaGVhZGluZyIgJ2JhY2t3YXJkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChzZXRxIGxldmVsIChzZXRxIGxldmVsLWhlYWRpbmcgKDErIHgpKSkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHNldHEgbGV2ZWwtYWRqIDApCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChzZXRxIGluZGVudCAoMS0gbGV2ZWwpKQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoc2V0cSBsaW5rLXRhcmdldCB0ZXh0KSkpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICgnc2V0ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0
ICgoeCAoc2VxLXBvc2l0aW9uICcoc2gxIHNoMikgaGFuZGxlKSkpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChzZXRxIGxldmVsICgxKyB4KSkKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKHNldHEgbGV2ZWwtYWRqIDApCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChzZXRxIGluZGVudCAoMS0gbGV2ZWwpKQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoc2V0cSBsaW5rLXRhcmdldCBuaWwpKSkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKChvciAnaXRlbSAnbnVtYmVyZWQtaXRlbSkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChzZXRxIGxldmVsIGxldmVsLWhlYWRpbmcpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoc2V0cSBsZXZlbC1hZGogKG1hcmtkb3duLXRzLS10b2MtbGlzdC1pdGVtLWRlcHRo
IG5vZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgaW5kZW50ICgxLSAg
KCsgbGV2ZWwgbGV2ZWwtYWRqKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0
cSBsaW5rLXRhcmdldCBuaWwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2NvZGUK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IEluaGVyaXQgdGhlIGFtYmllbnQgbGV2
ZWwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBsZXZlbC1hZGogMSkKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIGluZGVudCAoMS0gICgrIGxldmVsIGxl
dmVsLWFkaikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgbGluay10YXJn
ZXQgbmlsKSkpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgRmlsdGVyIGRlc2lyZWQg
aGFuZGxlcyBhbmQgbGV2ZWxzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4gKGFu
ZCAobWVtcSBoYW5kbGUgdG9jLWhhbmRsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICg+PSBsZXZlbCAoKyB0b2MtbWluLWRlcHRoCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgdG9jLXJlbGF0aXZlLWRlcHRoCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9j
LXJlbGF0aXZlLWhlYWRpbmctZGVwdGggMCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoPD0gbGV2ZWwgKCsgdG9jLW1heC1kZXB0aAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIHRvYy1yZWxhdGl2ZS1kZXB0aAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRv
Yy1yZWxhdGl2ZS1oZWFkaW5nLWRlcHRoIDApKSkpCgogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICA7OyBDcmVhdGUgdGhlIGVudHJ5IHdpdGggaW5kZW50LCBpdGVtL251bWJlciBwcmVmaXgs
IGxpbmsuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBDb3JuZXIgY2FzZTogaW5p
dGlhbCBsZXZlbCBoaWdoZXIgdGhhbiAxLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
d2hlbiAoYW5kICg+IGxldmVsIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGVxIGxldmVsLXByZXYgMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KHNldHEgbGV2ZWwgMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuIChhbmQg
KG5vdCB0b2Mtbm8tbGluaykgbGluay10YXJnZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgOzsgU2FuaXRpemUgdGhlIGlkIHRvIGNvbmZvcm0gdG8gQ1NTIGlkZW50IHN5bnRheC4K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSB0ZXh0CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiWyVzXSgjJXMpIgogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmLWxldCogKChzbHVnIChnZXRoYXNoIHNsdWct
cG9zIHBvcy10by1zbHVnKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2x1ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoZnVuY2FsbCBtYXJrZG93bi10cy10b2Mtc2x1Zy1mdW5jdGlvbgogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLXRhcmdl
dCkpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQgKG1ha2Utc3RyaW5n
ICgqICgxLSAobWF4IGluZGVudCAxKSkgdG9jLWluZGVudCkgP1xzKQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChwY2FzZSB0b2Mtc3R5bGUKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICgnaXRlbSAiLSAiKQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKCdidWxsZXQgIiogIikKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICgob3IgJ251bWJlciAnbnVtYmVyLikKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgobGV2ZWwgKCsgbGV2ZWwgbGV2ZWwtYWRqKSkp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZCAoKG9yIChu
b3QgbnVtYmVyLXN0YWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoPiBsZXZlbCAoY2FhciBudW1iZXItc3RhY2spKSkKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHVzaCBgKCxsZXZlbCAuIDAp
IG51bWJlci1zdGFjaykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoKGFuZCBudW1iZXItc3RhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICg8IGxldmVsIChjYWFyIG51bWJlci1zdGFjaykpKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGlsZSAo
YW5kIG51bWJlci1zdGFjawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICg8IGxldmVsIChjYWFyIG51bWJlci1zdGFjaykpKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvcCBudW1i
ZXItc3RhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICh1bmxlc3MgbnVtYmVyLXN0YWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAocHVzaCBgKCxsZXZlbCAuIDApIG51bWJlci1zdGFjaykpKSkp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldGNkciAoY2FyIG51
bWJlci1zdGFjaykgKDErIChjZGFyIG51bWJlci1zdGFjaykpKQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChzKSAobiAobGVuZ3RoIG51bWJlci1zdGFjaykp
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlcS1tYXAtaW5k
ZXhlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEg
KGVsdCBpZHgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
c2V0cSBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoY29uY2F0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChmb3JtYXQgIiVkIiAoY2RyIGVsdCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChlcSAoMSsgaWR4KSBuKSAiIiAiLiIpKSkpCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJldmVyc2UgbnVtYmVy
LXN0YWNrKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25j
YXQgcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
d2hlbiAoZXEgdG9jLXN0eWxlICdudW1iZXIuKSAiLiIpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpICIpKSkKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChfICIiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB0ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgQWRk
IGEgaGFyZCBsaW5lIGJyZWFrLiAgQmFja3NsYXNoCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgOzsgc2VlbXMgbGVzcyB3ZWxsIHN1cHBvcnRlZCBieQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHJlbmRlcmVycy4KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAobWFrZS1zdHJpbmcgMiA/XHMpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIlxuIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
c2V0cSBsZXZlbC1wcmV2IGxldmVsKSkpKQogICAgICAgICAgICAgICAgICAgICAgKHNldHEgdG9j
LXNpemUgKGJ1ZmZlci1zaXplKSkKICAgICAgICAgICAgICAgICAgICAgIChsZXQgKCh0ZW1wLWJ1
ZmZlciAoY3VycmVudC1idWZmZXIpKSkKICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGgtY3Vy
cmVudC1idWZmZXIgc291cmNlLWJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBs
YWNlLXJlZ2lvbi1jb250ZW50cyByZWctYmVnIHJlZy1lbmQgdGVtcC1idWZmZXIpKSkpKQogICAg
ICAgICAgICAgICAgICAoc2V0cSBudW0tdG9jcy1wcm9jZXNzZWQgKDErIG51bS10b2NzLXByb2Nl
c3NlZCkpKSkpCiAgICAgICAgICAgIDs7IFN0YXJ0IHRoZSBuZXh0IHBhc3MgYWZ0ZXIgdGhpcyB0
b2MtZW5kLiAgQWRqdXN0IGZvciB0aGUKICAgICAgICAgICAgOzsgaW5zZXJ0ZWQgdGV4dCBzaXpl
LgogICAgICAgICAgICAoc2V0cSBiZWctcG9zICgrIChhbGlzdC1nZXQgJ2VuZCB0b2MtZW5kKSB0
b2Mtc2l6ZSkpCiAgICAgICAgICAgIChzZXRxIGVuZC1wb3MgKG1pbiAocG9pbnQtbWF4KSAoKyBl
bmQtcG9zIHRvYy1zaXplKSkpKQogICAgICAgICAgKHdoZW4gKGFuZCAoZXEgbnVtLXRvY3MtcHJv
Y2Vzc2VkIDApCiAgICAgICAgICAgICAgICAgICAgIChlcSAnbm8tYWN0aXZlLXRhYmxlcyBtYXJr
ZG93bi10cy10b2MtZ2VuZXJhdGUtd2Fybi1pZi1ub25lKSkKICAgICAgICAgICAgKGx3YXJuICdt
YXJrZG93bi10cy10b2MtZ2VuZXJhdGUKICAgICAgICAgICAgICAgICAgIDp3YXJuaW5nCiAgICAg
ICAgICAgICAgICAgICAiTm8gdGFibGVzIG9mIGNvbnRlbnRzIGdlbmVyYXRlZCBpbiAlcy4iCiAg
ICAgICAgICAgICAgICAgICAoYnVmZmVyLW5hbWUgKGN1cnJlbnQtYnVmZmVyKSkpKSkpKSkpCgoo
cHJvdmlkZSAnbWFya2Rvd24tdHMtbW9kZS14KQo7OzsgbWFya2Rvd24tdHMtbW9kZS14LmVsIGVu
ZHMgaGVyZQo=
--=-=-=
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=markdown-ts-mode.el
Content-Transfer-Encoding: base64

Ozs7IG1hcmtkb3duLXRzLW1vZGUuZWwgLS0tIHRyZWUgc2l0dGVyIHN1cHBvcnQgZm9yIE1hcmtk
b3duIC0qLSBsZXhpY2FsLWJpbmRpbmc6IHQ7IC0qLQoKOzsgQ29weXJpZ2h0IChDKSAyMDI0LTIw
MjYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgo7OyBBdXRob3IgICAgICAgICAgIDog
UmFodWwgTWFydGltIEp1bGlhdG8gPHJhaHVsLmp1bGlhdG9AZ21haWwuY29tPgo7OyAgICAgICAg
ICAgICAgICAgIDogU3TDqXBoYW5lIE1hcmtzIDxzaGlwbWludHNAZ21haWwuY29tPgo7OyBNYWlu
dGFpbmVyICAgICAgIDogUmFodWwgTWFydGltIEp1bGlhdG8gPHJhaHVsLmp1bGlhdG9AZ21haWwu
Y29tPgo7OyBDcmVhdGVkICAgICAgICAgIDogQXByaWwgMjAyNAo7OyBWZXJzaW9uICAgICAgICAg
IDogMS4wCjs7IFBhY2thZ2UtUmVxdWlyZXMgOiAoKGVtYWNzICIzMS4xIikpCjs7IEtleXdvcmRz
ICAgICAgICAgOiBtYXJrZG93biBtZCB0ZXh0IGVkaXQgbGFuZ3VhZ2VzIHRyZWUtc2l0dGVyCgo7
OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuCgo7OyBHTlUgRW1hY3MgaXMgZnJlZSBz
b2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo7OyBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieQo7OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9m
IHRoZSBMaWNlbnNlLCBvcgo7OyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoK
OzsgR05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCjs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCjs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KCjs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCjs7IGFsb25nIHdpdGggR05VIEVtYWNzLiAgSWYg
bm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KCjs7OyBDb21tZW50YXJ5
OgoKOzs7OyBUcmVlLXNpdHRlciBMYW5ndWFnZSBWZXJzaW9ucwo7Owo7OyBtYXJrZG93bi10cy1t
b2RlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcnMgYW5kIHZlcnNp
b246Cjs7IC0gdHJlZS1zaXR0ZXItbWFya2Rvd246IHYwLjQuMQo7OyAtIHRyZWUtc2l0dGVyLW1h
cmtkb3duLWlubGluZTogdjAuNC4xCjs7Cjs7IFdlIHRyeSBvdXIgYmVzdCB0byBtYWtlIGJ1aWx0
LWluIG1vZGVzIHdvcmsgd2l0aCBsYXRlc3QgZ3JhbW1hcgo7OyB2ZXJzaW9ucywgc28gYSBtb3Jl
IHJlY2VudCBncmFtbWFyIGhhcyBhIGdvb2QgY2hhbmNlIHRvIHdvcmsuICBTZW5kCjs7IHVzIGEg
YnVnIHJlcG9ydCBpZiBpdCBkb2Vzbid0Lgo7Owo7OyBCaWRpcmVjdGlvbmFsIFRleHQgQ29uc2lk
ZXJhdGlvbnMKOzsKOzsgVGV4dCB3aXRoIG1hcmt1cCBtYXkgbmVlZCBhbiBleHRyYSBuZXdsaW5l
IGJlZm9yZSBiaWRpcmVjdGlvbmFsIHRleHQKOzsgZm9yIGl0IHRvIHNob3cgY29ycmVjdGx5LiAg
VGhpcyBpcyBhIGxpbWl0YXRpb24gaW4gdGhlIEVtYWNzIGRpc3BsYXkKOzsgZW5naW5lLgo7Owo7
OyBDb2RlIEJsb2NrIExhbmd1YWdlIE1vZGUgQ29uc2lkZXJhdGlvbnMKOzsKOzsgRmVuY2VkIGNv
ZGUgYmxvY2sgbGFuZ3VhZ2UgbW9kZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgdGFibGUKOzsgYG1h
cmtkb3duLXRzLWNvZGUtYmxvY2stbW9kZXMnIGFuZCBoZXVyaXN0aWNzIGFkZGluZyAiLXRzLW1v
ZGUiIGFuZAo7OyAiLW1vZGUiIHRvIHRoZSBsYW5ndWFnZSBuYW1lLiAgSWYgeW91ciBsYW5ndWFn
ZSdzIG1vZGUgaXMgbm90Cjs7IHByb3Blcmx5IHJlY29nbml6ZWQsIGFkZCBpdCB0byBgbWFya2Rv
d24tdHMtY29kZS1ibG9jay1tb2RlcycsIHdoaWNoCjs7IHNlZS4KOzsKOzsgRWFjaCBsYW5ndWFn
ZSdzIG1ham9yIG1vZGUgaXMgZW5hYmxlZCBvbmNlIHBlciBgbWFya2Rvd24tdHMtbW9kZScKOzsg
YnVmZmVyIGluIGEgdGVtcG9yYXJ5IGJ1ZmZlciB0byBleHRyYWN0IGl0cyBkZWZhdWx0IGZvbnQt
bG9jayBhbmQKOzsgdHJlZS1zaXR0ZXIgc2V0dGluZ3MuICBJbiBjb252ZW50aW9uYWwgbm9uLXRy
ZWVzaXQgY29kZSBibG9ja3MsIHRoZQo7OyBtYWpvciBtb2RlIGlzIGVuYWJsZWQgZWFjaCB0aW1l
IHRoZSBibG9jayBpcyBmb250aWZpZWQuCjs7Cjs7IE5PVEU6IE1ham9yIG1vZGUgaG9va3MgYXJl
IG5vdCBydW4gYW5kIGZvbnQtbG9jaywgdHJlZXNpdCwgaW5kZW50LAo7OyBjb21tZW50IHJlY29n
bml0aW9uLCBldGMuIGN1c3RvbWl6YXRpb25zIHRoYXQgeW91IG1pZ2h0IGhhdmUgaW4geW91cgo7
OyBob29rcyBhcmUgbm90IGFwcGxpZWQuICBBcyBhIHJlc3VsdCwgeW91ciBjb2RlIGJsb2NrcyBt
aWdodCBhcHBlYXIKOzsgZGlmZmVyZW50IGluIGBtYXJrZG93bi10cy1tb2RlJyBtb2RlIHRoYW4g
aW4gbmF0aXZlIG1ham9yIG1vZGUKOzsgYnVmZmVycy4gIE5vdCBydW5uaW5nIGhvb2tzIGF2b2lk
cyB0aGUgY29zdCBvZiBlYWNoIG1vZGUgaG9vayBhbmQKOzsgYXZvaWRzIHBvdGVudGlhbCByZWN1
cnNpdmUgdHJlZXNpdCBjYWxsYmFjayBpc3N1ZXMuCjs7Cjs7OzsgQ29kZSBCbG9jayBDb21tYW5k
cwo7Owo7OyBTb21lIGNvbW1vbiBjb21tYW5kcyB3aWxsIG9wZXJhdGUgd2l0aGluIGEgY29kZSBi
bG9jayBhbmQgaW4gaXRzCjs7IG1vZGUuICBUaGVzZSBvcGVyYXRlIGluIGFuIGluZGlyZWN0IGJ1
ZmZlciBhbmQgc29tZSBjb21tYW5kcyBtYXkKOzsgb3BlcmF0ZSBzbGlnaHRseSBkaWZmZXJlbnRs
eSB0byB0aGUgc2FtZSBjb21tYW5kcyBpbnZva2VkIGluIGEgbmF0aXZlCjs7IG1vZGUgYnVmZmVy
LiAgYGluZGVudC1mb3ItdGFiLWNvbW1hbmQnIG1heSBpbnZva2UKOzsgYGNvbXBsZXRpb24tYXQt
cG9pbnQnIHVuZGVyIHRoZSBjb3ZlcnMgYW5kIG1heSByZXR1cm4gcmVzdWx0cyBmcm9tCjs7IHRo
ZSBzdXJyb3VuZGluZyBNYXJrZG93biBidWZmZXIgaW5zdGVhZCBvZiB0aGUgY29kZSBibG9jaydz
IGNvbnRleHQuCjs7IFlvdSBjYW4gaW52b2tlIGBjb21wbGV0aW9uLWF0LXBvaW50JyBkaXJlY3Rs
eSBieSB1c2luZyBpdHMga2V5Cjs7IGJpbmRpbmcsIGBDLU0taWAuCjs7Cjs7OzsgUGlwZSBUYWJs
ZXMKOzsKOzsgVGhlc2UgYXJlIGEgR2l0SHViIEZsYXZvcmVkIE1hcmtkb3duIChHRk0pIGV4dGVu
c2lvbiBhbmQgYXJlIGEgZGUKOzsgZmFjdG8gc3RhbmRhcmQgZ2l2ZW4gdGhlaXIgcG9wdWxhcml0
eSBhbmQgaW1wbGVtZW50YXRpb25zIGFjcm9zcwo7OyBwcm9kdWN0cy4gIFRoZXkgbWlnaHQgYXMg
d2VsbCBiZSBmb2xkZWQgaW50byB0aGUgQ29tbW9uTWFyayBzdGFuZGFyZC4KOzsKOzsgQSBwaXBl
IHRhYmxlIGlzIGEgcmVjdGFuZ2xlIG9mIHRleHQgc3Vycm91bmRlZCB0byB0aGUgZWFzdCBhbmQg
d2VzdAo7OyBieSBwaXBlIHN5bWJvbHMgYW5kIHdoZXJlIHBpcGVzIHNlcGFyYXRlIGNvbHVtbnMu
ICBJdCBoYXMgYSBoZWFkZXIKOzsgcm93IGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGhlYWRlciBh
bGlnbm1lbnQgcm93LCBib3RoIG9mIHdoaWNoIG11c3QKOzsgY29udGFpbiB0aGUgc2FtZSBudW1i
ZXIgb2YgY2VsbHMuICBCb2R5IHJvd3MgYXJlIG9wdGlvbmFsLiAgQSB0YWJsZQo7OyBlbmRzIHdp
dGggYSBibGFuayBsaW5lIG9yIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBNYXJrZG93biBibG9jawo7
OyBlbGVtZW50Lgo7Owo7OyBUaGUgaGVhZGVyIGFsaWdubWVudCByb3cgY29sdW1uIG11c3QgaGF2
ZSBhIG1pbmltdW0gb2YgdGhyZWUgaHlwaGVucwo7OyB3aGljaCBpbmRpY2F0ZXMgZGVmYXVsdCBh
bGlnbm1lbnQgKGkuZS4sIHdoYXRldmVyIGEgcmVuZGVyZXIKOzsgY2hvb3NlcykuICBUbyBpbmRp
Y2F0ZSBsZWZ0IGFsaWdubWVudCwgcHJlZml4IHRoZSBoeXBoZW4gc3RyaW5nIHdpdGgKOzsgYSBj
b2xvbiBsaWtlIHRoaXMgOi0tLS4gIEZvciBjZW50ZXIgYWxpZ25tZW50LCBwcmVmaXggYW5kIHN1
ZmZpeCB3aXRoCjs7IGNvbG9ucyBsaWtlIHRoaXMgOi0tLTouICBGb3IgcmlnaHQgYWxpZ25tZW50
LCBzdWZmaXggd2l0aCBhIGNvbG9uCjs7IGxpa2UgdGhpcyAtLS06Lgo7Owo7OyBFYWNoIHRhYmxl
IGhlYWRlciBvciBib2R5IGNlbGwgY2FuIGNvbnRhaW4gdGhlIHVzdWFsIE1hcmtkb3duIGlubGlu
ZQo7OyBzdHlsZSBpbmRpY2F0b3JzLiAgQSBjZWxsIGNhbm5vdCBjb250YWluIGEgYmxvY2sgZWxl
bWVudCBzdWNoIGFzIGEKOzsgaGVhZGluZ3MsIHRoZW1hdGljIGJyZWFrcywgYmxvY2sgcXVvdGVz
LCBmZW5jZWQgY29kZSBibG9ja3MuCjs7Cjs7IFRhYmxlIGNlbGxzIGRvIG5vdCBuZWVkIHRvIGFs
aWduIHZpc3VhbGx5OyBpLmUuLCB0aGUgcGlwZSBzeW1ib2xzIGRvCjs7IG5vdCBuZWVkIHRvIGxp
bmUgdXAgdmVydGljYWxseS4gIFRoZSB0cmVlLXNpdHRlciBwYXJzZXIgYW5kIHJlbmRlcmVycwo7
OyBkZXRlY3QgY2VsbCBib3VuZGFyaWVzIHVzaW5nIHBpcGUgc3ltYm9scywgbm90IHRoZWlyIHJl
bGF0aXZlIGFsaWdubWVudC4KOzsKOzsgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSB3aGF0IGxvb2tz
IGxpa2UgY29kZSwgeW91IGNhbiB1c2UgYmFja3RpY2tzIHRvCjs7IHdyYXAgc3VjaCB0ZXh0IGFs
YSBgdGhpcyBpcyBjb2RlYC4gIFRoaXMgbW9kZSB3aWxsIG5vdCBmb250aWZ5IHN1Y2gKOzsgY29k
ZS4KOzsKOzsgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIHBpcGUgc3ltYm9sIGluIGEgY2VsbCwg
ZXNjYXBlIGl0IHRodXNseSBcfC4KOzsKOzsgVGVjaG5pY2FsbHksIGJvZHkgcm93cyBkbyBub3Qg
bmVlZCB0byBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZgo7OyBjZWxscyBhcyB0aGUgaGVhZGVy
IGhhcyBjb2x1bW5zIGFuZCByb3dzIGRvIG5vdCBuZWVkIHRvIHNoYXJlIHRoZQo7OyBzYW1lIG51
bWJlciBvZiBjZWxscyBhbW9uZyB0aGVtc2VsdmVzLiAgTm90ZTogTWFueSByZW5kZXJlcnMgZ2V0
Cjs7IGNvbmZ1c2VkIGlmIHRoZSB0YWJsZSBpcyAicmFnZ2VkIiB3aXRoIGFuIHVuZXZlbiBudW1i
ZXIgb2YgY29sdW1ucwo7OyBhbW9uZyByb3dzLiAgU29tZSByZW5kZXJlcnMgd2lsbCBpbnNlcnQg
ZW1wdHkgY2VsbHMgb24gYSByb3cgdGhhdAo7OyBjb250YWlucyBmZXdlciBjZWxscyB0aGFuIHRo
ZSBoZWFkZXIgaGFzIGNvbHVtbnMuICBTb21lIGVsaWRlIGNlbGxzCjs7IHRoYXQgZXhjZWVkIHRo
ZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgaGVhZGVyLgo7Owo7Ozs7IFBpcGUgVGFibGUgUmVj
b21tZW5kYXRpb25zCjs7Cjs7IC0gQWx3YXlzIHVzZSBwaXBlIHN5bWJvbHMgYXQgdGhlIHN0YXJ0
IGFuZCBlbmQgb2YgZWFjaCB0YWJsZSBsaW5lLgo7OyAtIFVzZSBhIHVuaWZvcm0gbnVtYmVyIG9m
IGNvbHVtbnMgc3Bhbm5pbmcgdGhlIHRhYmxlLgo7OyAtIElmIHlvdSBkZXRlY3QgYSBwYXJzaW5n
IGVycm9yIHdoaWNoIHByZXNlbnRzIGFzIGRpZmZlcmVudAo7OyAgIGZvbnRpZmljYXRpb24gYW5k
IHdoaWNoIGlzIG9mdGVuIGNhdXNlZCBieSBhbiBlbXB0eSBmaXJzdCBjZWxsIG9uIHRoZQo7OyAg
IGZpbmFsIHJvdywgdHJ5IHB1dHRpbmcgc29tZSBjaGFyYWN0ZXJzIGluIHRoYXQgY2VsbC4KOzsg
LSBSZW5kZXJlcnMgb2Z0ZW4gZXhjbHVkZSBjZXJ0YWluIGVtcHR5IGNlbGxzIHN1Y2ggYXMgYW4g
ImVtcHR5IiBmaW5hbAo7OyAgIGNlbGwgaW4gYSB0YWJsZS4gIEZvbGxvdyB0aGUgbmV4dCBpdGVt
IHRvIGF2b2lkIHRoaXMuCjs7IC0gSWYgeW91IG5lZWQgdGhhdCBjZWxsIHRvIGFwcGVhciBibGFu
ayBhbmQgYXJlIGNvbnZlcnRpbmcgdG8gSFRNTCwKOzsgICB0cnkgdXNpbmcgYSBub24tcHJpbnRp
bmcgSFRNTCBlbnRpdHksIHN1Y2ggYXMgYSBub24tYnJlYWtpbmcgc3BhY2UKOzsgICAiJm5ic3A7
Iiwgd2hpY2ggcGFyc2UgYXMgY29uY3JldGUgY2hhcmFjdGVycyB5ZXQgcmVuZGVyIGFzIGJsYW5r
Lgo7OyAtIEhUTUwgY29tbWVudHMgPCEtLSAtLT4gY2FuIGFsc28gYmUgdXNlZCBhcyBhIG5vbi1i
bGFuayBjaGFyYWN0ZXIKOzsgICBzdHJpbmcgdGhhdCBkb2VzIG5vdCBnZXQgcmVuZGVyZWQuICBU
aGVzZSBhcmUgY29uc2lkZXJlZCBjZWxsIHRleHQKOzsgICBhbmQgd2hlbiBwbGFjZWQgYXQgdGhl
IGVuZCBvZiBhIHJvdywgdGhhdCByb3cncyBudW1iZXIgb2YgY29sdW1ucyBpcwo7OyAgIGluY3Jl
YXNlZCBhbmQgbWlnaHQgZXhjZWVkIHRoZSBudW1iZXIgb2YgaGVhZGVyIGNvbHVtbnMuCjs7IC0g
VGhlcmUgYXJlIHRyZWUtc2l0dGVyIHBhcnNlciBxdWlya3MuICBDb21tYW5kcyBzdWNoIGFzCjs7
ICAgYG1hcmtkb3duLXRzLXRhYmxlLWRlbGV0ZS1jb2x1bW4nIGFuZCBgbWFya2Rvd24tdHMtdGFi
bGUtbW92ZS1jb2x1bW4nCjs7ICAgZm9sbG93IHRoZSBwYXJzZXIgdHJlZSBhbmQgY2FuIGxlYWQg
dG8gdW5leHBlY3RlZCByZXN1bHRzIHNvIGZvbGxvdwo7OyAgIHRoZXNlIHJlY29tbWVuZGF0aW9u
cyBhbmQgdGFibGUgb3BlcmF0aW9ucyBzaG91bGQgYmUgYXMgZXhwZWN0ZWQuCjs7Cjs7OzsgVHJl
ZSBTaXR0ZXIgQnVncwo7Owo7OyBgbWFya2Rvd24tdHMtbW9kZScgcmVsaWVzIG9uIHRoZSB1bmRl
cmx5aW5nIHRyZWUtc2l0dGVyIGxpYnJhcnkgaW4KOzsgRW1hY3MgKGNob3NlbiBhdCBpdHMgYnVp
bGQgdGltZSksIGFuZCBsYW5ndWFnZSBncmFtbWFycyB5b3UgaGF2ZQo7OyBpbnN0YWxsZWQuICBU
aGVyZSBhcmUga25vd24gYW5kIHJlcG9ydGVkIGJ1Z3Mgd2hpY2ggbmVnYXRpdmVseSBhZmZlY3QK
OzsgY2VydGFpbiBmZWF0dXJlcy4gIFRoaXMgbW9kZSBzaG91bGQgYmVuZWZpdCBhcyB0aGVzZSBi
dWdzIGFyZSBmaXhlZAo7OyBvciB3b3JrZWQgYXJvdW5kLgo7Owo7OyAtIFRoZSBNYXJrZG93biBn
cmFtbWFyIGluc2VydHMgYmxvY2tfY29udGludWF0aW9uIG5vZGVzIGFzIGNoaWxkcmVuCjs7ICAg
b2YgY29kZV9mZW5jZV9jb250ZW50LCB3aGljaCBjb25mdXNlcyBib3RoIHRoZSBpbnNwZWN0b3Ig
YW5kIHRoZQo7OyAgIGVtYmVkZGVkIHBhcnNlci4gIFRoaXMgYWZmZWN0cyBjb2RlIGJsb2NrcyBp
bnNpZGUgYmxvY2sgcXVvdGVzLgo7Owo7OyAtIEhUTUwgYmxvY2sgdHlwZSA0IChgPCEnIGZvbGxv
d2VkIGJ5IGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGUuZy4sCjs7ICAgYDwhRE9DVFlQRSBodG1sPicp
IGNhdXNlcyB0aGUgcGFyc2VyIHRvIGNvbnN1bWUgYWxsIHN1YnNlcXVlbnQKOzsgICBjb250ZW50
LiAgTG93ZXJjYXNlIGA8IWRvY3R5cGUgaHRtbD4nIHdvcmtzIGFzIGEgd29ya2Fyb3VuZC4KOzsg
ICBTZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS90cmVlLXNpdHRlci1ncmFtbWFycy90cmVlLXNpdHRl
ci1tYXJrZG93bi9pc3N1ZXMvMjMzPi4KOzsKOzsgLSBUaGUgZ3JhbW1hciBwYXJzZXMgc29sbyB0
aWxkZXMsIGluY29ycmVjdGx5IGFwcGx5aW5nIHN0cmlrZXRocm91Z2guCjs7ICAgRm9yIGV4YW1w
bGUsIHdyaXRpbmc6Cjs7Cjs7ICAgICBJIHNlZSB+YXBwcm94aW1hdGVseSBmb3VyIGxpZ2h0cy4K
OzsgICAgIEkgZG8gbm90IHNlZSB+YXBwcm94aW1hdGVseSBmaXZlIGxpZ2h0cy4KOzsKOzsgICBS
ZXN1bHRzIGluIHN0cmlrZXRocm91Z2ggaW5jb3JyZWN0bHkgc3RhcnRpbmcgYXQgdGhlIGZpcnN0
Cjs7ICAgfmFwcHJveGltYXRlbHkgYW5kIGV4dGVuZGluZyB0aWxsIHRoZSB0aWxkZSBhdCB0aGUg
c2Vjb25kCjs7ICAgfmFwcHJveGltYXRlbHkuCjs7ICAgU2VlIDxodHRwczovL2dpdGh1Yi5jb20v
dHJlZS1zaXR0ZXItZ3JhbW1hcnMvdHJlZS1zaXR0ZXItbWFya2Rvd24vaXNzdWVzLzIzNj4uCjs7
Cjs7IC0gU3VwZXJzY3JpcHQgKGBedGV4dF4nKSBhbmQgc3Vic2NyaXB0IChgfnRleHR+Jykgc3lu
dGF4IGlzIG5vdAo7OyAgIHN1cHBvcnRlZCBieSB0aGUgZ3JhbW1hci4gIE5vIEVYVEVOU0lPTl8g
YnVpbGQgZmxhZyBleGlzdHMgZm9yCjs7ICAgdGhpcy4gIFRoaXMgaXMgUGFuZG9jIC8gUEhQIE1h
cmtkb3duIEV4dHJhIHN5bnRheCwgbm90IENvbW1vbk1hcmsKOzsgICBvciBHRk0uCjs7Cjs7IC0g
T3JkZXJlZCAobnVtYmVyZWQpIGxpc3RzIGRvIG5vdCBuZXN0IGJ5IGluZGVudGF0aW9uLiAgSW5k
ZW50aW5nCjs7ICAgYSBgMS4nIGl0ZW0gdW5kZXIgYW5vdGhlciBvcmRlcmVkIGl0ZW0gZG9lcyBu
b3QgcHJvZHVjZSBhIG5lc3RlZAo7OyAgIGxpc3Qgbm9kZTsgdGhlIHBhcnNlciBlaXRoZXIgdHJl
YXRzIGl0IGFzIGEgZmxhdCBzaWJsaW5nIG9yCjs7ICAgYWJzb3JicyBpdCBpbnRvIHRoZSBwYXJl
bnQgaXRlbSdzIHBhcmFncmFwaCBhcyBhCjs7ICAgYmxvY2tfY29udGludWF0aW9uLiAgVW5vcmRl
cmVkIChgLScsIGAqJywgYCsnKSBsaXN0cyBuZXN0Cjs7ICAgY29ycmVjdGx5LiAgRGVtb3RlL3By
b21vdGUgb2Ygb3JkZXJlZCBsaXN0IGl0ZW1zIGlzIHRoZXJlZm9yZQo7OyAgIGRpc2FibGVkLgo7
Owo7OyAtIFJlbnVtYmVyaW5nIG9yZGVyZWQgbGlzdHMgKGBtYXJrZG93bi10cy1yZW51bWJlci1s
aXN0JykgbWF5IG9ubHkKOzsgICBhZmZlY3QgaXRlbXMgZnJvbSBwb2ludCBkb3dud2FyZCBpZiB0
aGUgcGFyc2VyIHNwbGl0cyBhIHNpbmdsZQo7OyAgIGxpc3QgaW50byBzZXBhcmF0ZSBgbGlzdCcg
bm9kZXMsIG9yIG1heSBjb250aW51ZSBudW1iZXJpbmcgYWNyb3NzCjs7ICAgdHdvIHNlcGFyYXRl
IGxpc3RzIGlmIHRoZSBwYXJzZXIgbWVyZ2VzIHRoZW0gaW50byBvbmUgbm9kZS4KOzsKOzsgLSBF
bXB0eSBsaW5lcyBmb2xsb3dpbmcgYW4gYGluZGVudGVkX2NvZGVfYmxvY2snIG1heSBiZSBjbGFp
bWVkIGJ5Cjs7ICAgdGhlIHBhcnNlciBhcyBjb250aW51YXRpb24gbGluZXMgb2YgdGhhdCBibG9j
aywgcmF0aGVyIHRoYW4gYmVpbmcKOzsgICB0cmVhdGVkIGFzIGJsYW5rIHNlcGFyYXRvcnMuCjs7
Cjs7IC0gUGlwZSB0YWJsZXMgYXJlIGluY29uc2lzdGVudGx5IHBhcnNlZC4gIFdoaXRlc3BhY2Ug
aXMgY29ycmVjdGx5Cjs7ICAgdHJpbW1lZCBhdCB0aGUgc3RhcnQgb2YgYSBjZWxsIGNvbnRlbnQg
YnV0IHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMKOzsgICBpbmNvcnJlY3RseSBpbmNsdWRlZC4gIEVt
cHR5IGNlbGxzIGNhbiBjb250YWluIHVuZXZlbiAicmFnZ2VkIiByb3cKOzsgICBjb2x1bW4gY29u
ZmlndXJhdGlvbnMgdGhhdCBjYW4gY29uZnVzZSB0aGUgcGFyc2VyLgo7Owo7OyAgIE1hcmtkb3du
IHBpcGUgdGFibGVzIHdpdGggcGFyc2luZyBpc3N1ZXM6Cjs7Cjs7ICAgfENvbHVtbiAxfENvbHVt
biAyfENvbHVtbiAzfAo7OyAgIHwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwKOzsgICB8ICAg
ICAgICB8ICAgICAgICB8ICAgICAgICB8Cjs7ICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAg
fCA8LS0gcGFyc2UgZXJyb3IKOzsKOzsgICB8Q29sdW1uIDF8Q29sdW1uIDJ8Q29sdW1uIDN8Cjs7
ICAgfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfAo7OyAgIHwgICAgICAgIHwgICAgICAgIHwg
ICAgICAgIHwKOzsgICB8IHh4eCAgICB8ICAgICAgICB8ICAgICAgICB8IDwtLSBwYXJzZWQgY29y
cmVjdGx5Cjs7Cjs7ICAgfENvbHVtbiAxfENvbHVtbiAyfCA8LS0gMiBjb2x1bW5zIGNvcnJlY3QK
OzsgICB8LS0tLS0tLS18LS0tLS0tLS18IDwtLSAyIGNvbHVtbnMgY29ycmVjdAo7OyAgICAgICAg
ICAgIHwgICAgICAgIHwgPC0tIDEgY29sdW1uIGluY29ycmVjdAo7OyAgICAgICAgICAgIHwgICAg
ICAgIHwgPC0tIHBhcnNlIGVycm9yCjs7ICAgfCAgICAgICAgfCAgICAgICAgfCA8LS0gbm90IGEg
cm93IGFmdGVyIHRoZSBlcnJvciwgYWJvdmUKOzsKOzsgICBTZWUgPGh0dHBzOi8vZ2l0aHViLmNv
bS90cmVlLXNpdHRlci1ncmFtbWFycy90cmVlLXNpdHRlci1tYXJrZG93bi9pc3N1ZXMvMjQxPgo7
OyAgICAgICA8aHR0cHM6Ly9naXRodWIuY29tL3RyZWUtc2l0dGVyLWdyYW1tYXJzL3RyZWUtc2l0
dGVyLW1hcmtkb3duL2lzc3Vlcy8yNDI+Cjs7Cjs7IC0gVGhlIGdyYW1tYXIncyBleHRlcm5hbCBz
Y2FubmVyIGhhcyBhIGJ1ZmZlciBvdmVyZmxvdyBpbiBpdHMKOzsgICBgc2VyaWFsaXplJyBmdW5j
dGlvbjogd2hlbiB0aGUgcGFyc2VyIHN0YXRlIGV4Y2VlZHMgdGhlCjs7ICAgc2VyaWFsaXphdGlv
biBidWZmZXIgcHJvdmlkZWQgYnkgdHJlZS1zaXR0ZXIsIGBtZW1jcHknIHdyaXRlcyBwYXN0Cjs7
ICAgdGhlIGVuZCBhbmQgY2FuIGNvcnJ1cHQgdGhlIHN0YWNrLiAgVHJpZ2dlcmVkIGluIHByYWN0
aWNlIHdoaWxlCjs7ICAgcGFyc2luZyBNYXJrZG93biBpbiBFbWFjcy4KOzsgICBTZWUgPGh0dHBz
Oi8vZ2l0aHViLmNvbS90cmVlLXNpdHRlci1ncmFtbWFycy90cmVlLXNpdHRlci1tYXJrZG93bi9p
c3N1ZXMvMjQzPi4KOzsKOzs7OyBCYXRjaCBGb250aWZpY2F0aW9uCjs7Cjs7IFNvbWUgZG93bnN0
cmVhbSBwYWNrYWdlcyBmb250aWZ5IG11bHRpcGxlIHVucmVsYXRlZCBNYXJrZG93bgo7OyBmcmFn
bWVudHMgYnkgam9pbmluZyB0aGVtIGluIGEgc2luZ2xlIGJ1ZmZlciB3aXRoIGEgc2VwYXJhdG9y
IGFuZAo7OyBydW5uaW5nIGBtYXJrZG93bi10cy1tb2RlJyBvdmVyIHRoZSB3aG9sZSB0aGluZy4g
IENob2ljZSBvZiBzZXBhcmF0b3IKOzsgbWF0dGVyczogdGhlIHRyZWUtc2l0dGVyLW1hcmtkb3du
IGdyYW1tYXIgZG9lcyBub3QgbGlzdCB0aGUgTlVMIGJ5dGUKOzsgKGBcMCcpIGFzIGV4dHJhL3do
aXRlc3BhY2UsIHNvIGEgTlVMIHNlcGFyYXRvciB5aWVsZHMgYW4gRVJST1Igbm9kZQo7OyBhbmQg
dGhlIHBhcnNlciBlbnRlcnMgZXJyb3IgcmVjb3ZlcnksIHdoaWNoIGNhbiBsZWFrIGlubGluZSBm
YWNlcwo7OyAoZS5nLiwgc3RyaWtldGhyb3VnaCkgYWNyb3NzIGZyYWdtZW50IGJvdW5kYXJpZXMu
ICBSZWdleC1iYXNlZCBtb2Rlcwo7OyB0b2xlcmF0ZSBOVUwgc2lsZW50bHkgYmVjYXVzZSB0aGV5
IGRvIG5vdCBwYXJzZSBzdHJ1Y3R1cmU7IHRoaXMgaXMgYQo7OyBiZWhhdmlvcmFsIGRpZmZlcmVu
Y2UsIG5vdCBhIHJlZ3Jlc3Npb24uCjs7Cjs7IEEgZm9ybSBmZWVkIChgXkwnLCBgXGYnKSBmbGFu
a2VkIGJ5IGJsYW5rIGxpbmVzIHdvcmtzIGFzIGEgY2xlYW4KOzsgZHJvcC1pbiBzZXBhcmF0b3I6
IHRoZSBwYXJzZXIgdHJlYXRzIGl0IGFzIGEgcGFyYWdyYXBoIGJyZWFrIGFuZAo7OyBpbmxpbmUg
c3RhdGUgZG9lcyBub3QgYmxlZWQgYWNyb3NzIGZyYWdtZW50cy4KCjs7OyBDb2RlOgoKKHJlcXVp
cmUgJ3RyZWVzaXQpCihyZXF1aXJlICdzdWJyLXgpCihyZXF1aXJlICdzZXEpCihyZXF1aXJlICdv
dXRsaW5lKQoocmVxdWlyZSAnZ290by1hZGRyKQoocmVxdWlyZSAneHJlZikKKHJlcXVpcmUgJ2lj
b25zKQoKOzs7IEN1c3RvbWl6YXRpb25zOgoKKGRlZmdyb3VwIG1hcmtkb3duLXRzIG5pbAogICJN
YWpvciBtb2RlIGZvciB2aWV3aW5nIGFuZCBlZGl0aW5nIE1hcmtkb3duIGJ1ZmZlcnMuIgogIDpw
cmVmaXggIm1hcmtkb3duLXRzLSIKICA6Z3JvdXAgJ3RleHQKICA6Z3JvdXAgJ2VkaXRpbmcKICA6
dmVyc2lvbiAiMzEuMSIpCgooZGVmY3VzdG9tIG1hcmtkb3duLXRzLWhpZGUtbWFya3VwIG5pbAog
ICJOb24tbmlsIG1lYW5zIGhpZGUgTWFya2Rvd24gbWFya3VwIGRlbGltaXRlcnMgaW4gdGhpcyBi
dWZmZXIuIgogIDp0eXBlICdib29sZWFuCiAgOmxvY2FsIHQKICA6c2FmZSAjJ2Jvb2xlYW5wCiAg
OnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCihkZWZjdXN0b20gbWFy
a2Rvd24tdHMtZWxsaXBzaXMgbmlsCiAgIlRoZSBlbGxpcHNpcyB0byB1c2UgaW4gZm9sZGVkIGhl
YWRpbmdzLgpXaGVuIG5pbCwgdXNlIHRoZSBzdGFuZGFyZCB0aHJlZSBkb3RzLiAgV2hlbiBhIG5v
bi1lbXB0eSBzdHJpbmcsCnVzZSB0aGF0IHN0cmluZyBpbnN0ZWFkLiIKICA6dHlwZSAnKGNob2lj
ZSAoY29uc3QgIDp0YWcgIkRlZmF1bHQgKC4uLikiIG5pbCkKICAgICAgICAgICAgICAgICAoc3Ry
aW5nIDp0YWcgIlN0cmluZyIgOnZhbHVlICIg4oyEIikpCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBh
Y2thZ2UtdmVyc2lvbiAiMS4wIikKCihkZWZjdXN0b20gbWFya2Rvd24tdHMtbWVudS1iYXItc2hv
dyB0CiAgIk5vbi1uaWwgbWVhbnMgc2hvdyB0aGUgTWFya2Rvd24gbWVudSBpbiB0aGUgbWVudSBi
YXIuIgogIDp0eXBlICdib29sZWFuCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lv
biAiMS4wIikKCihkZWZjdXN0b20gbWFya2Rvd24tdHMtZGVmYXVsdC1mb2xkaW5nICdzaG93LWFs
bAogICJEZWZhdWx0IGhlYWRpbmcgZm9sZGluZyBsZXZlbC4iCiAgOnR5cGUgJyhjaG9pY2UKICAg
ICAgICAgIChjb25zdCA6dGFnICJTaG93IGV2ZXJ5dGhpbmciIHNob3ctYWxsKQogICAgICAgICAg
KGNvbnN0IDp0YWcgIkZvbGQgZXZlcnl0aGluZywgc2hvd2luZyB0b3AtbGV2ZWwgaGVhZGluZ3Mi
IGZvbGQtYWxsKQogICAgICAgICAgKGNvbnN0IDp0YWcgIkZvbGQgaGVhZGluZ3MsIHNob3dpbmcg
YWxsIGhlYWRpbmcgbGV2ZWxzIiBmb2xkLWhlYWRpbmdzKSkKICA6dmVyc2lvbiAiMzEuMSIKICA6
cGFja2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy1pbmxpbmUtaW1h
Z2VzIG5pbAogICJOb24tbmlsIG1lYW5zIGRpc3BsYXkgaW5saW5lIGltYWdlcyBiZWxvdyBpbWFn
ZSBsaW5rcy4iCiAgOnR5cGUgJ2Jvb2xlYW4KICA6bG9jYWwgdAogIDpzYWZlICMnYm9vbGVhbnAK
ICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZmN1c3RvbSBt
YXJrZG93bi10cy1pbWFnZS1tYXgtd2lkdGggJ3dpbmRvdwogICJNYXhpbXVtIHdpZHRoIG9mIGlu
bGluZSBpbWFnZXMgaW4gcGl4ZWxzLgpXaGVuIGB3aW5kb3cnLCB1c2UgdGhlIHdpbmRvdyBib2R5
IHdpZHRoLiAgV2hlbiBhIG51bWJlciwgdXNlCnRoYXQgYXMgdGhlIG1heGltdW0gcGl4ZWwgd2lk
dGguIgogIDp0eXBlICcoY2hvaWNlIChjb25zdCAgOnRhZyAiV2luZG93IHdpZHRoIiB3aW5kb3cp
CiAgICAgICAgICAgICAgICAgKG5hdG51bSA6dGFnICJQaXhlbCB3aWR0aCIpKQogIDp2ZXJzaW9u
ICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIpCgooZGVmY3VzdG9tIG1hcmtkb3duLXRz
LWRpc3BsYXktcmVtb3RlLWlubGluZS1pbWFnZXMgbmlsCiAgIkhvdyB0byBkaXNwbGF5IHJlbW90
ZSBpbmxpbmUgaW1hZ2VzLgpXaGVuIG5pbCwgZG8gbm90IGRpc3BsYXkgcmVtb3RlIGltYWdlcy4g
IFdoZW4gYGRvd25sb2FkJywgZmV0Y2ggdGhlCmltYWdlIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVy
IGFuZCBkaXNwbGF5IGl0LgoKUmVtb3RlIGltYWdlcyBhcmUgc2tpcHBlZCBieSBkZWZhdWx0IGZv
ciBzZWN1cml0eS4iCiAgOnR5cGUgJyhjaG9pY2UgKGNvbnN0IDp0YWcgIlNraXAgcmVtb3RlIGlt
YWdlcyIgbmlsKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJEb3dubG9hZCByZW1vdGUg
aW1hZ2VzIiBkb3dubG9hZCkpCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAi
MS4wIikKCihkZWZjdXN0b20gbWFya2Rvd24tdHMtdW5vcmRlcmVkLWxpc3QtbWFya2VyICcoKCLi
l48gIiAuICItICIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKCLil4sgIiAuICItICIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKCLil7wgIiAuICItICIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKCLigKIgIiAuICItICIpKQogICJJZiBtYXJrdXAgaXMgaGlkZGVuLCBk
aXNwbGF5IHRoZXNlIGZvciBhbiB1bm9yZGVyZWQgbGlzdCBtYXJrZXIuCkVhY2ggbGlzdCBpdGVt
IG1hcmtlcidzIGRlcHRoIGluIGl0cyBsaXN0IGNvbnRyb2xzIGl0cyBzZWxlY3RlZCBzdHJpbmcK
c3RhcnRpbmcgYXQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGN5Y2xpbmcgdGhyb3VnaCB0aGUgb3Ro
ZXJzIGZvciBkZWVwZXIKaXRlbXMuICBUaGUgbGlzdCB3aWxsIGJlIGN5Y2xlIGFyb3VuZCBiYWNr
IHRvIHRoZSBiZWdpbm5pbmcgaWYgdGhlcmUgYXJlCmluc3VmZmljaWVudCBzdHJpbmdzIHRvIHJl
cHJlc2VudCBkZWVwIGxldmVscy4KCk5vdGUgdGhhdCB0aGUgZGVmYXVsdCBzdHJpbmdzIGhhdmUg
dHJhaWxpbmcgc3BhY2VzLgoKVmFsdWUgZm9ybXM6CiAtIChsaXN0IChjb25zIChQUkVGRVJSRUQg
LiBGQUxMQkFDSykpIC4uLik6IHdoZXJlIFBSRUZFUlJFRCBpcyB1c2VkIGlmCiAgIGl0cyBmaXJz
dCBjaGFyYWN0ZXIgcGFzc2VzIGBjaGFyLWRpc3BsYXlhYmxlLXAnLCBvdGhlcndpc2UgRkFMTEJB
Q0suCiAtIG5pbDogZGlzcGxheSB0aGUgcmF3IG1hcmt1cC4iCiAgOnR5cGUgJyhjaG9pY2UgKHJl
cGVhdCAoY29ucyAoc3RyaW5nIDp0YWcgIlByZWZlcnJlZCAoR1VJKSIpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoc3RyaW5nIDp0YWcgIkZhbGxiYWNrIChUVFkpIikpKQogICAgICAg
ICAgICAgICAgIChjb25zdCA6dGFnICJEaXNwbGF5IG9yaWdpbmFsIG1hcmt1cCIgbmlsKSkKICA6
dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZmN1c3RvbSBtYXJr
ZG93bi10cy1jaGVja2VkLWNoZWNrYm94ICcoIuKYkSIgLiAiKyIpCiAgIklmIG1hcmt1cCBpcyBo
aWRkZW4sIGRpc3BsYXkgdGhpcyBmb3IgYSBjaGVja2VkIHRhc2sgbGlzdCBtYXJrZXIuClZhbHVl
IGZvcm1zOgogLSBjb25zIChQUkVGRVJSRUQgLiBGQUxMQkFDSyk6IFBSRUZFUlJFRCBpcyB1c2Vk
IGlmIGl0cyBmaXJzdCBjaGFyYWN0ZXIKICAgcGFzc2VzIGBjaGFyLWRpc3BsYXlhYmxlLXAnLCBv
dGhlcndpc2UgRkFMTEJBQ0suCiAtIHN5bWJvbCBgaWNvbic6IGRlZmVyIHRvIHRoZSBpY29ucy5l
bCBpY29uCiAgIGBtYXJrZG93bi10cy1jaGVja2VkLWNoZWNrYm94LWljb24nOyBjdXN0b21pemUg
dmlhCiAgIFxcW2N1c3RvbWl6ZS1pY29uXS4KIC0gbmlsOiBkaXNwbGF5IHRoZSByYXcgbWFya3Vw
LiIKICA6dHlwZSAnKGNob2ljZSAoY29ucyAoc3RyaW5nIDp0YWcgIlByZWZlcnJlZCAoR1VJKSIp
CiAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZyA6dGFnICJGYWxsYmFjayAoVFRZKSIpKQog
ICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJVc2UgaWNvbnMuZWwgaWNvbiIgaWNvbikKICAg
ICAgICAgICAgICAgICAoY29uc3QgOnRhZyAiRGlzcGxheSBvcmlnaW5hbCBtYXJrdXAiIG5pbCkp
CiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCihkZWZpbmUtaWNv
biBtYXJrZG93bi10cy1jaGVja2VkLWNoZWNrYm94LWljb24gbmlsCiAgJygoaW1hZ2UgImNoZWNr
ZWQuc3ZnIiA6aGVpZ2h0IGxpbmUgOmFzY2VudCBjZW50ZXIpCiAgICAoc3ltYm9sICLimJEiKQog
ICAgKHRleHQgIisiKSkKICAiSWNvbiB1c2VkIGZvciBhIGNoZWNrZWQgdGFzayBsaXN0IG1hcmtl
ciB3aGVuIG1hcmt1cCBpcyBoaWRkZW4uCkNvbnN1bHRlZCBvbmx5IHdoZW4gYG1hcmtkb3duLXRz
LWNoZWNrZWQtY2hlY2tib3gnIGlzIHRoZSBzeW1ib2wKYGljb24nLiIKICA6dmVyc2lvbiAiMzEu
MSIpCgooZGVmY3VzdG9tIG1hcmtkb3duLXRzLXVuY2hlY2tlZC1jaGVja2JveCAnKCLimJAiIC4g
Ii0iKQogICJJZiBtYXJrdXAgaXMgaGlkZGVuLCBkaXNwbGF5IHRoaXMgZm9yIGFuIHVuY2hlY2tl
ZCB0YXNrIGxpc3QgbWFya2VyLgpWYWx1ZSBmb3JtczoKIC0gY29ucyAoUFJFRkVSUkVEIC4gRkFM
TEJBQ0spOiBQUkVGRVJSRUQgaXMgdXNlZCBpZiBpdHMgZmlyc3QgY2hhcmFjdGVyCiAgIHBhc3Nl
cyBgY2hhci1kaXNwbGF5YWJsZS1wJywgb3RoZXJ3aXNlIEZBTExCQUNLLgogLSBzeW1ib2wgYGlj
b24nOiBkZWZlciB0byB0aGUgaWNvbnMuZWwgaWNvbgogICBgbWFya2Rvd24tdHMtdW5jaGVja2Vk
LWNoZWNrYm94LWljb24nOyBjdXN0b21pemUgdmlhCiAgIFxcW2N1c3RvbWl6ZS1pY29uXS4KIC0g
bmlsOiBkaXNwbGF5IHRoZSByYXcgbWFya3VwLiIKICA6dHlwZSAnKGNob2ljZSAoY29ucyAoc3Ry
aW5nIDp0YWcgIlByZWZlcnJlZCAoR1VJKSIpCiAgICAgICAgICAgICAgICAgICAgICAgKHN0cmlu
ZyA6dGFnICJGYWxsYmFjayAoVFRZKSIpKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJV
c2UgaWNvbnMuZWwgaWNvbiIgaWNvbikKICAgICAgICAgICAgICAgICAoY29uc3QgOnRhZyAiRGlz
cGxheSBvcmlnaW5hbCBtYXJrdXAiIG5pbCkpCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2Ut
dmVyc2lvbiAiMS4wIikKCihkZWZpbmUtaWNvbiBtYXJrZG93bi10cy11bmNoZWNrZWQtY2hlY2ti
b3gtaWNvbiBuaWwKICAnKChpbWFnZSAidW5jaGVja2VkLnN2ZyIgOmhlaWdodCBsaW5lIDphc2Nl
bnQgY2VudGVyKQogICAgKHN5bWJvbCAi4piQIikKICAgICh0ZXh0ICItIikpCiAgIkljb24gdXNl
ZCBmb3IgYW4gdW5jaGVja2VkIHRhc2sgbGlzdCBtYXJrZXIgd2hlbiBtYXJrdXAgaXMgaGlkZGVu
LgpDb25zdWx0ZWQgb25seSB3aGVuIGBtYXJrZG93bi10cy11bmNoZWNrZWQtY2hlY2tib3gnIGlz
IHRoZSBzeW1ib2wKYGljb24nLiIKICA6dmVyc2lvbiAiMzEuMSIpCgooZGVmY3VzdG9tIG1hcmtk
b3duLXRzLXRoZW1hdGljLWJyZWFrLWNoYXJhY3RlciAnKD/ilIAgLiA/LSkKICAiSWYgbWFya3Vw
IGlzIGhpZGRlbiwgZGlzcGxheSB0aGlzIGNoYXJhY3RlciBmb3IgdGhlbWF0aWMgYnJlYWtzLgpJ
dCBpcyByZXBlYXRlZCB0byBmaWxsIHRoZSB3aW5kb3cgd2lkdGguICBUaGlzIGFzc3VtZXMgYSBz
dGF0aWMgd2luZG93CndpZHRoLgpZb3UgbWF5IHByZWZlciBhbiBgOmV4dGVuZCcgYXR0cmlidXRl
IG9uIHRoZQpgbWFya2Rvd24tdHMtdGhlbWF0aWMtYnJlYWsnIHdoaWNoIHdpbGwgc3BhbiB3aW5k
b3cgd2lkdGggZHluYW1pY2FsbHkKdXNpbmcgYW4gdW5kZXJsaW5lLCBpbiB3aGljaCBjYXNlIHRo
aXMgY2hhcmFjdGVyIGlzIGlnbm9yZWQuClRoZSB2YWx1ZSBpcyBhIGNvbnMgKFBSRUZFUlJFRCAu
IEZBTExCQUNLKTogUFJFRkVSUkVEIGlzIHVzZWQgaWYgaXQgcGFzc2VzCmBjaGFyLWRpc3BsYXlh
YmxlLXAnLCBvdGhlcndpc2UgRkFMTEJBQ0sgaXMgdXNlZC4KVXNlIG5pbCB0byBkaXNwbGF5IHRo
ZSByYXcgbWFya3VwLiIKICA6dHlwZSAnKGNob2ljZSAoY29ucyAoY2hhcmFjdGVyIDp0YWcgIlBy
ZWZlcnJlZCAoR1VJKSIpCiAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJhY3RlciA6dGFnICJG
YWxsYmFjayAoVFRZKSIpKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJEaXNwbGF5IG9y
aWdpbmFsIG1hcmt1cCIgbmlsKSkKICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9u
ICIxLjAiKQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy1oYXJkLWxpbmUtYnJlYWstYmFja3NsYXNo
ICcoP8K2IC4gP3wpCiAgIklmIG1hcmt1cCBpcyBoaWRkZW4sIGRpc3BsYXkgdGhpcyBjaGFyYWN0
ZXIgZm9yIGEgYmFja3NsYXNoIGhhcmQgbGluZSBicmVhay4KVGhlIHZhbHVlIGlzIGEgY29ucyAo
UFJFRkVSUkVEIC4gRkFMTEJBQ0spOiBQUkVGRVJSRUQgaXMgdXNlZCBpZiBpdCBwYXNzZXMKYGNo
YXItZGlzcGxheWFibGUtcCcsIG90aGVyd2lzZSBGQUxMQkFDSyBpcyB1c2VkLgpuaWwga2VlcHMg
dGhlIHJhdyBtYXJrdXAuIgogIDp0eXBlICcoY2hvaWNlIChjb25zIChjaGFyYWN0ZXIgOnRhZyAi
UHJlZmVycmVkIChHVUkpIikKICAgICAgICAgICAgICAgICAgICAgICAoY2hhcmFjdGVyIDp0YWcg
IkZhbGxiYWNrIChUVFkpIikpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIkRpc3BsYXkg
b3JpZ2luYWwgbWFya3VwIiBuaWwpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIkhpZGUg
bWFya3VwIiBoaWRlKSkKICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAi
KQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy1oYXJkLWxpbmUtYnJlYWstc3BhY2UKICAobGFtYmRh
IChuKQogICAgKGxldCogKCh2YWwgKG1hcmtkb3duLXRzLS1yZXNvbHZlLWRpc3BsYXktdmFsdWUK
ICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy1oYXJkLWxpbmUtYnJlYWstYmFja3NsYXNoKSkK
ICAgICAgICAgICAoY2ggKGlmIChjaGFyYWN0ZXJwIHZhbCkgdmFsID98KSkpCiAgICAgIChtYWtl
LXN0cmluZyBuIGNoKSkpCiAgIklmIG1hcmt1cCBpcyBoaWRkZW4sIGRpc3BsYXkgdGhpcyBmb3Ig
YSB0cmFpbGluZy1zcGFjZXMgaGFyZCBsaW5lIGJyZWFrLgpUaGUgdmFsdWUgY2FuIGJlOgotIGEg
Y2hhcmFjdGVyIG9yIHN0cmluZzogc2hvd24gb25jZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRyYWls
aW5nIHNwYWNlcywKICB3aXRoIG5vIHJlcGV0aXRpb24gKHRoZSByZW1haW5pbmcgc3BhY2VzIHN0
YXkgaW52aXNpYmxlKTsKLSBhIGZ1bmN0aW9uOiBjYWxsZWQgd2l0aCBvbmUgYXJndW1lbnQsIHRo
ZSBudW1iZXIgb2YgdHJhaWxpbmcgc3BhY2VzLAogIGFuZCBtdXN0IHJldHVybiB0aGUgc3RyaW5n
IHRvIGRpc3BsYXkgaW4gcGxhY2Ugb2YgdGhlIHJ1bjsKLSBuaWw6IGtlZXAgdGhlIHJhdyBtYXJr
dXAuIgogIDp0eXBlICcoY2hvaWNlIChjaGFyYWN0ZXIgOnRhZyAiRGlzcGxheSBzcGVjaWZpZWQg
Y2hhcmFjdGVyIChubyByZXBldGl0aW9uKSIpCiAgICAgICAgICAgICAgICAgKHN0cmluZyA6dGFn
ICJEaXNwbGF5IHNwZWNpZmllZCBzdHJpbmcgKG5vIHJlcGV0aXRpb24pIikKICAgICAgICAgICAg
ICAgICAoZnVuY3Rpb24gOnRhZyAiRnVuY3Rpb24gZnJvbSBjb3VudCB0byBkaXNwbGF5IHN0cmlu
ZyIpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIkRpc3BsYXkgb3JpZ2luYWwgbWFya3Vw
IiBuaWwpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIkhpZGUgbWFya3VwIiBoaWRlKSkK
ICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZmN1c3RvbSBt
YXJrZG93bi10cy1mb250aWZ5LWNvZGUtYmxvY2tzLW5hdGl2ZWx5IHQKICAiTm9uLW5pbCBtZWFu
cyBmb250aWZ5IGNvZGUgYmxvY2sgY29udGVudHMgdXNpbmcgdGhlIGxhbmd1YWdlJ3MgbW9kZS4K
V2hlbiBub24tbmlsLCBmZW5jZWQgY29kZSBibG9ja3MgYXJlIGhpZ2hsaWdodGVkIHdpdGggc3lu
dGF4IG9mIHRoZQplbWJlZGRlZCBsYW5ndWFnZSAodmlhIHRyZWUtc2l0dGVyIGZvciBsYW5ndWFn
ZXMgd2l0aCBhIHRyZWUtc2l0dGVyCm1vZGUsIG9yIHZpYSBjb252ZW50aW9uYWwgZm9udC1sb2Nr
IGZvciB0aGUgcmVzdCkuICBXaGVuIG5pbCwgY29kZQpibG9ja3Mga2VlcCBvbmx5IHRoZSBgbWFy
a2Rvd24tdHMtY29kZS1ibG9jaycgYmFja2dyb3VuZCBmYWNlLiAgVG9nZ2xpbmcKZm9yIHRoZSB0
cy1lbWJlZGRlZCBwYXRoIHRha2VzIGVmZmVjdCBhZnRlciByZXN0YXJ0aW5nCmBtYXJrZG93bi10
cy1tb2RlJyBpbiB0aGUgYnVmZmVyLiIKICA6dHlwZSAnYm9vbGVhbgogIDp2ZXJzaW9uICIzMS4x
IgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIpCgooZGVmY3VzdG9tIG1hcmtkb3duLXRzLWVuYWJs
ZS1jb2RlLWJsb2NrLWNvbnRleHQtbW9kZSB0CiAgIk5vbi1uaWwgYXV0b21hdGljYWxseSBlbmFi
bGVzIGBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWNvbnRleHQtbW9kZScuCklmIG5vbi1uaWwgYW5k
IGBwb2ludCcgaXMgaW4gYSBmZW5jZWQgY29kZSBibG9jaywgdGhpcyBydW5zCmBpbmRlbnQtZm9y
LXRhYi1jb21tYW5kJywgYG5ld2xpbmUnLCBldC5hbC4sIGluIHRoZSBtb2RlIG9mIHRoZSBjb2Rl
CmJsb2NrLiIKICA6dHlwZSAnYm9vbGVhbgogIDp2ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZl
cnNpb24gIjEuMCIpCgooZGVmY3VzdG9tIG1hcmtkb3duLXRzLWNvZGUtYmxvY2staW4tY29udGV4
dC1tb2RlLWxpZ2h0ZXIgIiBbY29kZV0iCiAgIk1pbm9yIG1vZGUgYG1hcmtkb3duLXRzLWNvZGUt
YmxvY2stY29udGV4dC1tb2RlJyBsaWdodGVyIHN0cmluZy4KU2V0IHRvIG5pbCB0byBkaXNhYmxl
IHRoZSBsaWdodGVyLiIKICA6dHlwZSAnc3RyaW5nCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2th
Z2UtdmVyc2lvbiAiMS4wIikKCihkZWZjdXN0b20gbWFya2Rvd24tdHMtaW5oaWJpdC1jb2RlLWJs
b2NrLW1vZGUtd2FybmluZ3MgdAogICJJZiBub24tbmlsLCBpbmhpYml0IGNvZGUtYmxvY2sgbWFq
b3ItbW9kZSBtZXNzYWdlcyBhbmQgd2FybmluZ3MuClNvbWUgZmVuY2VkIGNvZGUtYmxvY2sgbWFq
b3IgbW9kZXMgcHJvZHVjZSBtZXNzYWdlcyBvciB3YXJuaW5ncyB3aGljaApoYXZlIGxpdHRsZSBy
ZWxldmFuY2UgdG8gTWFya2Rvd24gYnVmZmVycy4gIFVzZSB0aGlzIG9wdGlvbiB0byBpbmhpYml0
CnRoZW0uICBNYWpvciBtb2RlcyBtYXkgYmUgZW5hYmxlZCBmb3IgZm9udGlmaWNhdGlvbiBvciBl
ZGl0aW5nIGluIHRoZQptb2RlJ3MgY29udGV4dC4iCiAgOnR5cGUgJ2Jvb2xlYW4KICA6dmVyc2lv
biAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZnZhciB3YXJuaW5nLW1pbmlt
dW0tbGV2ZWwpCgooZGVmbWFjcm8gbWFya2Rvd24tdHMtLWluaGliaXQtbWVzc2FnZXMtYW5kLXdh
cm5pbmdzICh2YXIgJnJlc3QgYm9keSkKICAiRXhlY3V0ZSBCT0RZIHdpdGggbWVzc2FnZXMgYW5k
IHdhcm5pbmdzIGluaGliaXRlZC4KVkFSIGlzIGEgdmFyaWFibGUncyBzeW1ib2w7IGUuZy4sClxc
PSdtYXJrZG93bi10cy1pbmhpYml0LWNvZGUtYmxvY2stbW9kZS13YXJuaW5ncy4gIElmIHRoZSBz
eW1ib2wncyB2YWx1ZQppcyBub24tbmlsLCBkbyB3aGF0IGl0IHNheXMgb24gdGhlIHRpbi4KSW5o
aWJpdCBtZXNzYWdlcyBpbiB0aGUgZWNobyBhcmVhLgpJbmhpYml0IG1lc3NhZ2VzIGluIHRoZSBs
b2cuCkluaGliaXQgd2FybmluZ3Mgd2l0aCBsZXZlbCA8IDplcnJvci4iCiAgKGRlY2xhcmUgKGlu
ZGVudCBkZWZ1bikpCiAgYChsZXQqICgodmFsIChzeW1ib2wtdmFsdWUgLHZhcikpCiAgICAgICAg
ICAoaW5oaWJpdC1tZXNzYWdlIHZhbCkKICAgICAgICAgOzsgQWxzbyBpbmhpYml0IGxvZ2dpbmcg
dG8gKk1lc3NhZ2VzKgogICAgICAgICAobWVzc2FnZS1sb2ctbWF4IChpZiB2YWwgbmlsIG1lc3Nh
Z2UtbG9nLW1heCkpCiAgICAgICAgICh3YXJuaW5nLW1pbmltdW0tbGV2ZWwKICAgICAgICAgIChp
ZiB2YWwgOmVycm9yIHdhcm5pbmctbWluaW11bS1sZXZlbCkpKQogICAgIChwcm9nbiAsQGJvZHkp
KSkKCihkZWZjdXN0b20gbWFya2Rvd24tdHMtZGVmYXVsdC1jb2RlLWJsb2NrLW1vZGUgJ3RleHQt
bW9kZQogICJEZWZhdWx0IG1vZGUgZm9yIGFub255bW91cyBjb2RlIGJsb2Nrcy4iCiAgOnR5cGUg
JyhjaG9pY2UKICAgICAgICAgIChjb25zdCAgOnRhZyAiVGV4dCBtb2RlIiB0ZXh0LW1vZGUpCiAg
ICAgICAgICAoY29uc3QgIDp0YWcgIkZ1bmRhbWVudGFsIG1vZGUiIGZ1bmRhbWVudGFsLW1vZGUp
CiAgICAgICAgICAoc3ltYm9sIDp0YWcgIk90aGVyIG1vZGUgc3ltYm9sIgogICAgICAgICAgICAg
ICAgICA6dmFsaWRhdGUgKGxhbWJkYSAod2lkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAobGV0ICgodmFsICh3aWRnZXQtdmFsdWUgd2lkKSkpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKHVubGVzcyAoYW5kIHZhbCAoZXEgJ3N5bWJvbCAodHlwZS1vZiB2YWwpKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aWRnZXQtcHV0IHdpZCA6ZXJyb3IgIk11
c3QgYmUgYSBub24tbmlsIHN5bWJvbCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB3aWQpKSkpKQogIDp2ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIpCgoo
ZGVmY3VzdG9tIG1hcmtkb3duLXRzLXRhYmxlLWRlZmF1bHQtY29sdW1uLXdpZHRoIDUKICAiQ29s
dW1uIHdpZHRoIGZvciBuZXcgY29sdW1ucy4KWW91IG1heSBtYWtlIHRoaXMgd2lkZXIsIGJ1dCBz
bWFsbGVyIHRoYW4gNSBpcyBub3QgcmVjb21tZW5kZWQuIgogIDp0eXBlICdpbnRlZ2VyCiAgOnZl
cnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCihkZWZjdXN0b20gbWFya2Rv
d24tdHMtZW5hYmxlLXRhYmxlLW1vZGUgdAogICJOb24tbmlsIGF1dG9tYXRpY2FsbHkgZW5hYmxl
cyBgbWFya2Rvd24tdHMtdGFibGUtbW9kZScuCklmIG5vbi1uaWwsIGVuYWJsZSBgbWFya2Rvd24t
dHMtdGFibGUtbW9kZScgaWYgYHBvaW50JyBpcyBpbiBhIE1hcmtkb3duCnRhYmxlLiIKICA6dHlw
ZSAnYm9vbGVhbgogIDp2ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIpCgoo
ZGVmY3VzdG9tIG1hcmtkb3duLXRzLXRhYmxlLWF1dG8tYWxpZ24gJyhjZWxsLW5hdmlnYXRpb24g
dHJhbnNwb3NlKQogICJBdXRvbWF0aWNhbGx5IGFsaWduIHRoZSB0YWJsZSBhdCBwb2ludCBkdXJp
bmcgdGhlc2Ugb3BlcmF0aW9ucy4KSWYgdCwgdHJpZ2dlciBvbiBhbGwgc3VwcG9ydGVkIG9wZXJh
dGlvbnMuCklmIG5pbCwgZG8gbm90IGF1dG8gYWxpZ24uCk90aGVyd2lzZSwgaXQgaXMgYSBsaXN0
IG9mIHN5bWJvbHMgcmVwcmVzZW50aW5nIHRhYmxlIG9wZXJhdGlvbnMuIgogIDp0eXBlICcoY2hv
aWNlCiAgICAgICAgICAoY29uc3QgOnRhZyAiRG8gbm90IGF1dG9tYXRpY2FsbHkgYWxpZ24iIG5p
bCkKICAgICAgICAgIChjb25zdCA6dGFnICJBbHdheXMgYXV0b21hdGljYWxseSBhbGlnbiIgdCkK
ICAgICAgICAgIChzZXQKICAgICAgICAgICAoY29uc3QgOnRhZyAiQ2VsbCBuYXZpZ2F0aW9uIiBj
ZWxsLW5hdmlnYXRpb24pCiAgICAgICAgICAgKGNvbnN0IDp0YWcgIlRyYW5zcG9zZSIgdHJhbnNw
b3NlKSkpCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCihkZWZj
dXN0b20gbWFya2Rvd24tdHMtdGFibGUtYWxpZ24tZmVhdHVyZXMgJyhqdXN0aWZ5LWNlbGxzKQog
ICJVc2UgdGhlc2Ugb3B0aW9uYWwgZmVhdHVyZXMgd2hlbiBhbGlnbmluZyBhIHRhYmxlLgpBbGln
bmluZyBhIHRhYmxlIGFsaWducyBlYWNoIGNvbHVtbiB0byB0aGUgd2lkdGggb2YgaXRzIHdpZGVz
dCBjZWxsLiAgSXQKY2FuIGFsc28ganVzdGlmeSBlYWNoIGNlbGwgYWNjb3JkaW5nIHRvIHRoZSB0
YWJsZSdzIGRlbGltaXRlciBsaW5lIGxlZnQsCmNlbnRlciwgb3IgcmlnaHQtaGFuZCBqdXN0aWZp
Y2F0aW9uIHJ1bGVzLgoKQ3VzdG9taXppbmcgdGhpcyB1c2VyIG9wdGlvbiBpcyBtb3N0IHVzZWZ1
bCB3aGVuIHRoZSB1c2VyIG9wdGlvbgpgbWFya2Rvd24tdHMtdGFibGUtYXV0by1hbGlnbicgaXMg
ZW5hYmxlZCBhbmQgdG8gYXZvaWQgaGF2aW5nIHRvIHVzZSBhCnByZWZpeCBhcmd1bWVudCBiZWZv
cmUgZXZlcnkgYXV0by1hbGlnbm1lbnQgb3BlcmF0aW9uLgoKSWYgdCwgZW5hYmxlIGFsbCBvcHRp
b25hbCBhbGlnbm1lbnQgb3BlcmF0aW9ucy4KSWYgbmlsLCBvcGVyYXRpb25zIGFyZSBlbmFibGVk
IGJleW9uZCBiYXNpYyBjb2x1bW4gYWxpZ25tZW50LgpPdGhlcndpc2UsIGl0IGlzIGEgbGlzdCBv
ZiBzeW1ib2xzLiIKICA6dHlwZSAnKGNob2ljZQogICAgICAgICAgKGNvbnN0IDp0YWcgIk5vIG9w
dGlvbmFsIGZlYXR1cmVzIiBuaWwpCiAgICAgICAgICAoY29uc3QgOnRhZyAiQWxsIG9wdGlvbmFs
IGZlYXR1cmVzIiB0KQogICAgICAgICAgKHNldAogICAgICAgICAgIChjb25zdCA6dGFnICJKdXN0
aWZ5IGNlbGxzIiBqdXN0aWZ5LWNlbGxzKSkpCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2Ut
dmVyc2lvbiAiMS4wIikKCihkZWZjdXN0b20gbWFya2Rvd24tdHMtaW4tdGFibGUtbW9kZS1saWdo
dGVyICIgW3RhYmxlXSIKICAiTWlub3IgbW9kZSBgbWFya2Rvd24tdHMtaW4tdGFibGUtbW9kZScg
bGlnaHRlciBzdHJpbmcuClNldCB0byBuaWwgdG8gZGlzYWJsZSB0aGUgbGlnaHRlci4iCiAgOnR5
cGUgJ3N0cmluZwogIDp2ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIpCgoo
ZGVmY3VzdG9tIG1hcmtkb3duLXRzLXZpZXctbW9kZS1wcmUtaW5pdC1ob29rIChsaXN0ICMnbWFy
a2Rvd24tdHMtYWRkLWZpbmFsLW5ld2xpbmUpCiAgIkhvb2tzIHJ1biBiZWZvcmUgYG1hcmtkb3du
LXRzLXZpZXctbW9kZWAgaW5pdGlhbGl6YXRpb24uCkZ1bmN0aW9ucyBvbiB0aGlzIGxpc3QgYXJl
IGludGVuZGVkIHRvIGFtZW5kIGJ1ZmZlciBjb250ZW50IGZvcgpgbWFya2Rvd24tdHMtdmlldy1t
b2RlJyBhbmQgdHJlZS1zaXR0ZXIgTWFya2Rvd24gZ3JhbW1hciBjb21wYXRpYmlsaXR5LgoKRm9y
IGV4YW1wbGUsIGBtYXJrZG93bi10cy1hZGQtZmluYWwtbmV3bGluZScgZW5zdXJlcyB0aGUgZ3Jh
bW1hcgpjb3JyZWN0bHkgcGFyc2VzIG1hcmt1cCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdGhh
dCBkZXBlbmRzIG9uIGEgZmluYWwKbmV3bGluZS4iCiAgOnR5cGUgJyhob29rKQogIDp2ZXJzaW9u
ICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIpCgo7OzsgRmFjZXM6CgooZGVmZ3JvdXAg
bWFya2Rvd24tdHMtZmFjZXMgbmlsCiAgIkZhY2VzIHVzZWQgYnkgTWFya2Rvd24tVFMuIgogIDpn
cm91cCAnbWFya2Rvd24tdHMtZmFjZXMKICA6Z3JvdXAgJ2ZhY2VzKQoKKGRlZmZhY2UgbWFya2Rv
d24tdHMtZGVsaW1pdGVyICcoKHQgKDppbmhlcml0IHNoYWRvdykpKQogICJGYWNlIGZvciB0aGUg
IyBiZWZvcmUgTWFya2Rvd24gaGVhZGluZ3MuIgogIDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNl
IG1hcmtkb3duLXRzLWhlYWRpbmctMSAnKCh0ICg6aW5oZXJpdCBvdXRsaW5lLTEpKSkKICAiRmFj
ZSBmb3IgZmlyc3QgbGV2ZWwgTWFya2Rvd24gaGVhZGluZ3MuIgogIDp2ZXJzaW9uICIzMS4xIikK
CihkZWZmYWNlIG1hcmtkb3duLXRzLXNldGV4dC1oZWFkaW5nICcoKHQgKDppbmhlcml0IG1hcmtk
b3duLXRzLWhlYWRpbmctMSkpKQogICJGYWNlIGZvciBzZXRleHQgTWFya2Rvd24gaGVhZGluZ3Mg
KGhlYWRpbmdzIHVuZGVybGluZWQgYnkgPT09IG9yIC0tLSkuIgogIDp2ZXJzaW9uICIzMS4xIikK
CihkZWZmYWNlIG1hcmtkb3duLXRzLWhlYWRpbmctMiAnKCh0ICg6aW5oZXJpdCBvdXRsaW5lLTIp
KSkKICAiRmFjZSBmb3Igc2Vjb25kIGxldmVsIE1hcmtkb3duIGhlYWRpbmdzLiIKICA6dmVyc2lv
biAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1oZWFkaW5nLTMgJygodCAoOmluaGVyaXQg
b3V0bGluZS0zKSkpCiAgIkZhY2UgZm9yIHRoaXJkIGxldmVsIE1hcmtkb3duIGhlYWRpbmdzLiIK
ICA6dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1oZWFkaW5nLTQgJygodCAo
OmluaGVyaXQgb3V0bGluZS00KSkpCiAgIkZhY2UgZm9yIGZvdXJ0aCBsZXZlbCBNYXJrZG93biBo
ZWFkaW5ncy4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtaGVhZGlu
Zy01ICcoKHQgKDppbmhlcml0IG91dGxpbmUtNSkpKQogICJGYWNlIGZvciBmaWZ0aCBsZXZlbCBN
YXJrZG93biBoZWFkaW5ncy4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24t
dHMtaGVhZGluZy02ICcoKHQgKDppbmhlcml0IG91dGxpbmUtNikpKQogICJGYWNlIGZvciBzaXh0
aCBsZXZlbCBNYXJrZG93biBoZWFkaW5ncy4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2Ug
bWFya2Rvd24tdHMtZW1waGFzaXMgJygodCAoOmluaGVyaXQgaXRhbGljKSkpCiAgIkZhY2UgZm9y
IE1hcmtkb3duIGVtcGhhc2lzIChpdGFsaWMpIHRleHQuIgogIDp2ZXJzaW9uICIzMS4xIikKCihk
ZWZmYWNlIG1hcmtkb3duLXRzLWJvbGQgJygodCAoOmluaGVyaXQgYm9sZCkpKQogICJGYWNlIGZv
ciBNYXJrZG93biBzdHJvbmcgZW1waGFzaXMgKGJvbGQpIHRleHQuIgogIDp2ZXJzaW9uICIzMS4x
IikKCihkZWZmYWNlIG1hcmtkb3duLXRzLXN0cmlrZXRocm91Z2ggJygodCAoOnN0cmlrZS10aHJv
dWdoIHQpKSkKICAiRmFjZSBmb3IgTWFya2Rvd24gc3RyaWtldGhyb3VnaCB0ZXh0LiIKICA6dmVy
c2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1ibG9jay1xdW90ZSAnKCh0ICg6aW5o
ZXJpdCBpdGFsaWMpKSkKICAiRmFjZSBmb3IgTWFya2Rvd24gYmxvY2sgcXVvdGVzLiIKICA6dmVy
c2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1saW5rICcoKHQgKDppbmhlcml0IGxp
bmspKSkKICAiRmFjZSBmb3IgTWFya2Rvd24gbGluayB0ZXh0IGFuZCBpbWFnZSBkZXNjcmlwdGlv
bnMuIgogIDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWxpbmstZGVzdGlu
YXRpb24gJygodCAoOmluaGVyaXQgZm9udC1sb2NrLXN0cmluZy1mYWNlKSkpCiAgIkZhY2UgZm9y
IE1hcmtkb3duIGxpbmsgZGVzdGluYXRpb25zIChVUkxzKS4iCiAgOnZlcnNpb24gIjMxLjEiKQoK
KGRlZmZhY2UgbWFya2Rvd24tdHMtY29kZS1zcGFuICcoKHQgKDppbmhlcml0IGZvbnQtbG9jay1r
ZXl3b3JkLWZhY2UpKSkKICAiRmFjZSBmb3IgTWFya2Rvd24gaW5saW5lIGNvZGUgc3BhbnMuIgog
IDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWNvZGUtYmxvY2sgJygodCAo
OmV4dGVuZCB0KSkpCiAgIkZhY2UgZm9yIE1hcmtkb3duIGZlbmNlZCBjb2RlIGJsb2NrIGNvbnRl
bnQuCkFsdGVyIHRoaXMgZmFjZSB0byBhZGQgYSBgOmJhY2tncm91bmQnIGZvciBhIHZpc3VhbGx5
IGRpc3RpbmN0CmNvZGUgYmxvY2sgcmVnaW9uLCBlLmcuOgogIChzZXQtZmFjZS1hdHRyaWJ1dGUg
XFw9J21hcmtkb3duLXRzLWNvZGUtYmxvY2sgbmlsIDpiYWNrZ3JvdW5kIFwiZ3JheTk1XCIpIgog
IDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWluLWNvZGUtYmxvY2sgJygo
dCAoOmV4dGVuZCB0KSkpCiAgIkZhY2UgZm9yIHdoZW4gcG9pbnQgaXMgaW4gYSBNYXJrZG93biBj
b2RlIGJsb2NrLgpTZWUgYG1hcmtkb3duLXRzLWNvZGUtYmxvY2staW4tY29udGV4dC1tb2RlJy4K
QWx0ZXIgdGhpcyBmYWNlIHRvIGFkZCBhIGA6YmFja2dyb3VuZCcgZm9yIGEgdmlzdWFsbHkgZGlz
dGluY3QgdGFibGUKcmVnaW9uLCBlLmcuOgogIChzZXQtZmFjZS1hdHRyaWJ1dGUgXFw9J21hcmtk
b3duLXRzLWluLWNvZGUtYmxvY2sgOmJhY2tncm91bmQgXCJncmF5OTVcIikiCiAgOnZlcnNpb24g
IjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtY29kZS1ibG9jay1tYXJrdXAtaGlkZGVuCiAg
JygoKChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpiYWNrZ3JvdW5kICJncmF5OTUiIDpleHRlbmQgdCkp
CiAgICAoKChiYWNrZ3JvdW5kIGRhcmspKSAgKDpiYWNrZ3JvdW5kICJncmF5MTUiIDpleHRlbmQg
dCkpKQogICJGYWNlIGZvciBNYXJrZG93biBmZW5jZWQgY29kZSBibG9jayBjb250ZW50IHdoZW4g
bWFya3VwIGlzIGhpZGRlbi4KVXNlZCBpbnN0ZWFkIG9mIGBtYXJrZG93bi10cy1jb2RlLWJsb2Nr
JyB3aGVuIGBtYXJrZG93bi10cy1oaWRlLW1hcmt1cCcKaXMgbm9uLW5pbC4iCiAgOnZlcnNpb24g
IjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtaW5kZW50ZWQtY29kZS1ibG9jayAnKCh0ICg6
aW5oZXJpdCBmb250LWxvY2stc3RyaW5nLWZhY2UpKSkKICAiRmFjZSBmb3IgTWFya2Rvd24gaW5k
ZW50ZWQgY29kZSBibG9ja3MuIgogIDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3du
LXRzLWh0bWwtdGFnICcoKHQgKDppbmhlcml0IGZvbnQtbG9jay1kb2MtbWFya3VwLWZhY2UpKSkK
ICAiRmFjZSBmb3IgaW5saW5lIEhUTUwgdGFncyBpbiBNYXJrZG93bi4iCiAgOnZlcnNpb24gIjMx
LjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtaHRtbC1ibG9jayAnKCh0ICg6aW5oZXJpdCBmb250
LWxvY2stZG9jLW1hcmt1cC1mYWNlKSkpCiAgIkZhY2UgZm9yIEhUTUwgYmxvY2tzIGluIE1hcmtk
b3duLiIKICA6dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy10aGVtYXRpYy1i
cmVhayAnKCh0ICg6aW5oZXJpdCBzaGFkb3cgOmV4dGVuZCB0KSkpCiAgIkZhY2UgZm9yIE1hcmtk
b3duIHRoZW1hdGljIGJyZWFrcyAoaG9yaXpvbnRhbCBydWxlcykuCkN1c3RvbWl6ZSB0aGlzIGZh
Y2UgdG8gYWRkIGEgOmJhY2tncm91bmQgZm9yIGEgZnVsbC13aWR0aCB2aXN1YWwgcnVsZS4iCiAg
OnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtZW50aXR5LXJlZmVyZW5jZSAn
KCh0ICg6aW5oZXJpdCBmb250LWxvY2stYnVpbHRpbi1mYWNlKSkpCiAgIkZhY2UgZm9yIG5hbWVk
IEhUTUwgZW50aXR5IHJlZmVyZW5jZXMgbGlrZSAmYW1wOyBhbmQgJmNvcHk7LiIKICA6dmVyc2lv
biAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1udW1lcmljLWNoYXJhY3Rlci1yZWZlcmVu
Y2UKICAnKCh0ICg6aW5oZXJpdCBmb250LWxvY2stZXNjYXBlLWZhY2UpKSkKICAiRmFjZSBmb3Ig
bnVtZXJpYyBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBsaWtlICYjNjU7IGFuZCAmI3g0MTsuIgogIDp2
ZXJzaW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWxhdGV4ICcoKHQgKDppbmhlcml0
IGZvbnQtbG9jay1zdHJpbmctZmFjZSkpKQogICJGYWNlIGZvciBMYVRlWCAvIG1hdGggY29udGVu
dCBpbiBNYXJrZG93biAoJC4uLiQgYW5kICQkLi4uJCQpLiIKICA6dmVyc2lvbiAiMzEuMSIpCgoo
ZGVmZmFjZSBtYXJrZG93bi10cy10YWJsZS1oZWFkZXIgJygodCAoOmluaGVyaXQgKGJvbGQgZm9u
dC1sb2NrLWRvYy1mYWNlKSkpKQogICJGYWNlIGZvciBNYXJrZG93biBwaXBlIHRhYmxlIGhlYWRl
ciBjZWxscy4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtdGFibGUt
Y2VsbCAnKCh0ICg6aW5oZXJpdCBkZWZhdWx0KSkpCiAgIkZhY2UgZm9yIE1hcmtkb3duIHBpcGUg
dGFibGUgZGF0YSBjZWxscy4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24t
dHMtdGFibGUtZGVsaW1pdGVyLWNlbGwgJygodCAoOmluaGVyaXQgZm9udC1sb2NrLWRvYy1mYWNl
KSkpCiAgIkZhY2UgZm9yIE1hcmtkb3duIHBpcGUgdGFibGUgZGVsaW1pdGVyIGNlbGxzICgtLS0g
c2VwYXJhdG9ycykuIgogIDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLXRh
YmxlICcoKHQgKDpleHRlbmQgdCkpKQogICJGYWNlIGZvciBNYXJrZG93biB0YWJsZS4KQWx0ZXIg
dGhpcyBmYWNlIHRvIGFkZCBhIGA6YmFja2dyb3VuZCcgZm9yIGEgdmlzdWFsbHkgZGlzdGluY3Qg
dGFibGUKcmVnaW9uLCBlLmcuOgogIChzZXQtZmFjZS1hdHRyaWJ1dGUgXFw9J21hcmtkb3duLXRz
LXRhYmxlIG5pbCA6YmFja2dyb3VuZCBcImdyYXk5NVwiKSIKICA6dmVyc2lvbiAiMzEuMSIpCgoo
ZGVmZmFjZSBtYXJrZG93bi10cy1pbi10YWJsZSAnKCh0ICg6ZXh0ZW5kIHQpKSkKICAiRmFjZSBm
b3IgTWFya2Rvd24gYG1hcmtkb3duLXRzLWluLXRhYmxlLW1vZGUnIHdoZW4gcG9pbnQgaXMgaW4g
YSB0YWJsZS4KQWx0ZXIgdGhpcyBmYWNlIHRvIGFkZCBhIGA6YmFja2dyb3VuZCcgZm9yIGEgdmlz
dWFsbHkgZGlzdGluY3QgdGFibGUKcmVnaW9uLCBlLmcuOgogIChzZXQtZmFjZS1hdHRyaWJ1dGUg
XFw9J21hcmtkb3duLXRzLWluLXRhYmxlIG5pbCA6YmFja2dyb3VuZCBcImdyYXk5NVwiKSIKICA6
dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1sYW5ndWFnZS1rZXl3b3JkICco
KHQgKDppbmhlcml0IGZvbnQtbG9jay1rZXl3b3JkLWZhY2UpKSkKICAiRmFjZSBmb3IgdGhlIGxh
bmd1YWdlIGtleXdvcmQgZm9yIE1hcmtkb3duIGNvZGUgYmxvY2tzLiIKICA6dmVyc2lvbiAiMzEu
MSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1saXN0LW1hcmtlciAnKCh0ICg6aW5oZXJpdCBzaGFk
b3cpKSkKICAiRmFjZSBmb3IgTWFya2Rvd24gbGlzdCBtYXJrZXJzIGxpa2UgLSBhbmQgKi4iCiAg
OnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtaGFyZC1saW5lLWJyZWFrLWJh
Y2tzbGFzaAogICcoKHQgKDppbmhlcml0IG91dGxpbmUtNCA6d2VpZ2h0IGJvbGQpKSkKICAiRmFj
ZSBmb3IgTWFya2Rvd24gaGFyZCBsaW5lIGJyZWFrcyBpbnRyb2R1Y2VkIGJ5IGEgdHJhaWxpbmcg
YmFja3NsYXNoLiIKICA6dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1oYXJk
LWxpbmUtYnJlYWstYmFja3NsYXNoLWhpZGRlbgogICcoKHQgKDppbmhlcml0IG91dGxpbmUtNCA6
d2VpZ2h0IGJvbGQpKSkKICAiRmFjZSBmb3IgdHJhaWxpbmctYmFja3NsYXNoIGhhcmQgbGluZSBi
cmVhayB3aGVuIG1hcmt1cCBpcyBoaWRkZW4uIgogIDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNl
IG1hcmtkb3duLXRzLWhhcmQtbGluZS1icmVhay1zcGFjZQogICcoKCgoYmFja2dyb3VuZCBsaWdo
dCkpICg6YmFja2dyb3VuZCAiZ3JheTcwIiA6d2VpZ2h0IGJvbGQpKQogICAgKCgoYmFja2dyb3Vu
ZCBkYXJrKSkgICg6YmFja2dyb3VuZCAiZ3JheTQwIiA6d2VpZ2h0IGJvbGQpKSkKICAiRmFjZSBm
b3IgTWFya2Rvd24gaGFyZCBsaW5lIGJyZWFrcyBpbnRyb2R1Y2VkIGJ5IHR3byB0cmFpbGluZyBz
cGFjZXMuClRoZSB0cmFpbGluZyBzcGFjZXMgYXJlIG90aGVyd2lzZSBpbnZpc2libGUsIHNvIHRo
ZXkgYXJlIHNob3duIGFzIGEKc2hhZG93LWNvbG9yZWQgYmxvY2suIgogIDp2ZXJzaW9uICIzMS4x
IikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWhhcmQtbGluZS1icmVhay1zcGFjZS1oaWRkZW4KICAn
KCh0ICg6aW5oZXJpdCBvdXRsaW5lLTQgOndlaWdodCBib2xkKSkpCiAgIkZhY2UgZm9yIHRyYWls
aW5nLXNwYWNlcyBoYXJkIGxpbmUgYnJlYWsgd2hlbiBtYXJrdXAgaXMgaGlkZGVuLiIKICA6dmVy
c2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy10YXNrLXVuY2hlY2tlZCAnKCh0ICg6
aW5oZXJpdCBtYXJrZG93bi10cy1saXN0LW1hcmtlcikpKQogICJGYWNlIGZvciBNYXJrZG93biB1
bmNoZWNrZWQgdGFzayBsaXN0IG1hcmtlcnMuIgogIDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNl
IG1hcmtkb3duLXRzLXRhc2stY2hlY2tlZCAnKCh0ICg6aW5oZXJpdCBtYXJrZG93bi10cy1saXN0
LW1hcmtlcikpKQogICJGYWNlIGZvciBNYXJrZG93biBjaGVja2VkIHRhc2sgbGlzdCBtYXJrZXJz
LiIKICA6dmVyc2lvbiAiMzEuMSIpCgoodHJlZXNpdC1kZWNsYXJlLXVuYXZhaWxhYmxlLWZ1bmN0
aW9ucykKCihhZGQtdG8tbGlzdAogJ3RyZWVzaXQtbGFuZ3VhZ2Utc291cmNlLWFsaXN0CiAnKG1h
cmtkb3duCiAgICJodHRwczovL2dpdGh1Yi5jb20vdHJlZS1zaXR0ZXItZ3JhbW1hcnMvdHJlZS1z
aXR0ZXItbWFya2Rvd24iCiAgIDpjb21taXQgIjQxMzI4NTIzMWNlOGZhOGIxMWU3MDc0YmJlMjY1
YjQ4YWE3Mjc3ZjkiCiAgIDpzb3VyY2UtZGlyICJ0cmVlLXNpdHRlci1tYXJrZG93bi9zcmMiKQog
dCkKCihhZGQtdG8tbGlzdAogJ3RyZWVzaXQtbGFuZ3VhZ2Utc291cmNlLWFsaXN0CiAnKG1hcmtk
b3duLWlubGluZQogICAiaHR0cHM6Ly9naXRodWIuY29tL3RyZWUtc2l0dGVyLWdyYW1tYXJzL3Ry
ZWUtc2l0dGVyLW1hcmtkb3duIgogICA6Y29tbWl0ICI0MTMyODUyMzFjZThmYThiMTFlNzA3NGJi
ZTI2NWI0OGFhNzI3N2Y5IgogICA6c291cmNlLWRpciAidHJlZS1zaXR0ZXItbWFya2Rvd24taW5s
aW5lL3NyYyIpCiB0KQoKOzs7IFZhcmlhYmxlczoKCihkZWZ2YXIgbWFya2Rvd24tdHMtLXNldC11
cC1pbmxpbmUgbmlsCiAgIkxldCBiaW5kIHRoaXMgdG8gbm9uLW5pbCBmb3IgaW5saW5lIGBtYXJr
ZG93bi10cy1tb2RlJyBidWZmZXJzLiIpCgooZGVmdmFyIG1hcmtkb3duLXRzLWNvZGUtYmxvY2st
bW9kZXMKICBgKChzaCBiYXNoLXRzLW1vZGUpCiAgICAoc2hlbGwgYmFzaC10cy1tb2RlKQogICAg
KCwoaW50ZXJuICJjIyIpIGNzaGFycC10cy1tb2RlKQogICAgKGNwcCBjKystdHMtbW9kZSkKICAg
IChlbCBlbWFjcy1saXNwLW1vZGUpCiAgICAoZWxpc3AgZW1hY3MtbGlzcC1tb2RlKQogICAgKGdv
bGFuZyBnby10cy1tb2RlKQogICAgKGdvbW9kIGdvLW1vZC10cy1tb2RlKQogICAgKGdvd29yayBn
by13b3JrLXRzLW1vZGUpCiAgICAoamF2YXNjcmlwdCBqcy10cy1tb2RlKQogICAgKG1kIG1hcmtk
b3duLXRzLW1vZGUpCiAgICAocHkgcHl0aG9uLXRzLW1vZGUpCiAgICAocmIgcnVieS10cy1tb2Rl
KQogICAgKHJzIHJ1c3QtdHMtbW9kZSkKICAgICh0ZXggbGF0ZXgtbW9kZSkKICAgICh0cyB0eXBl
c2NyaXB0LXRzLW1vZGUpCiAgICAoeW1sIHlhbWwtdHMtbW9kZSkpCiAgIkV4dHJhIG1hcHBpbmdz
IGZyb20gY29kZSBibG9jayBsYW5ndWFnZSB0YWdzIHRvIG1ham9yIG1vZGVzLgpFbnRyaWVzIGhl
cmUgYXJlIG9ubHkgbmVlZGVkIHdoZW4gdGhlIGxhbmd1YWdlIHRhZyBpbiBhIGZlbmNlZCBjb2Rl
CmJsb2NrIGRvZXMgTk9UIG1hdGNoIHRoZSBjb252ZW50aW9uYWwgbW9kZSBuYW1lIGRlcml2YXRp
b24sIGUuZy4gdGhlCnVzZXIgd3JpdGVzIFxcPWBcXD1gXFw9YHRzIGluc3RlYWQgb2YgXFw9YFxc
PWBcXD1gdHlwZXNjcmlwdCwgb3IKXFw9YFxcPWBcXD1gcHkgaW5zdGVhZCBvZiBcXD1gXFw9YFxc
PWBweXRob24uICBGb3IgdGFncyB0aGF0IGFscmVhZHkKcmVzb2x2ZSB2aWEgdGhlIHN0YW5kYXJk
IFwiLXRzLW1vZGVcIi9cIi1tb2RlXCIgaGV1cmlzdGljcyB0aGVyZSBpcyBubwpuZWVkIHRvIGFk
ZCBhbiBlbnRyeS4KClRoZSBhbGlzdCBpcyBvZiB0aGUgZm9ybSAoTEFOR1VBR0UgTUFKT1ItTU9E
RSkuIE1BSk9SLU1PREUgY2FuIGJlIGEKdHJlZS1zaXR0ZXIgb3IgYSBjb252ZW50aW9uYWwgbW9k
ZS4KCklmIHlvdSBwcmVmZXIgYSBjb252ZW50aW9uYWwgbW9kZSBvdmVyIGl0cyB0cmVlLXNpdHRl
ciB2YXJpYW50LCBhZGQgb3IKcmVwbGFjZSByZWxldmFudCBlbnRyaWVzLiAgRm9yIGV4YW1wbGU6
CgogICAgKGFkZC10by1saXN0IFxcPSdtYXJrZG93bi10cy1jb2RlLWJsb2NrLW1vZGVzCiAgICAg
IFxcPScocHl0aG9uIHB5dGhvbi1tb2RlKSkKICAgIChzZXRmIChhbGlzdC1nZXQgXFw9J3B5IG1h
cmtkb3duLXRzLWNvZGUtYmxvY2stbW9kZXMpCiAgICAgICAgICBcXD0nKHB5dGhvbi1tb2RlKSkK
CkNvZGUgYmxvY2tzIGZvciB0aGF0IG5vbiB0cmVlLXNpdHRlciBtb2RlcyB3aWxsIGJlIGZvbnRp
ZmllZCB1c2luZyB0aGUKbW9kZSdzIGNvbnZlbnRpb25hbCBmb250LWxvY2sgcnVsZXMuIikKCihk
ZWZ2YXIgbWFya2Rvd24tdHMtY29kZS1ibG9jay1mb3JjZS1jb252ZW50aW9uYWwtbW9kZXMKICAn
KG1hcmtkb3duLXRzLW1vZGUKICAgIHBocC10cy1tb2RlKQogICJUcmVhdCB0aGVzZSBjb2RlIGJs
b2NrIHRyZWUtc2l0dGVyIG1vZGVzIGFzIGNvbnZlbnRpb25hbC4KU29tZSBtb2RlcyB0aGF0IGVt
YmVkIG11bHRpcGxlIGB0cmVlc2l0JyBwYXJzZXJzIG5lZWQgdG8gYmUgdHJlYXRlZCB3aXRoCmNv
bnZlbnRpb25hbCBmb250LWxvY2suICBgbWFya2Rvd24tdHMtbW9kZScgaXRzZWxmIGlzIG9uZSBv
ZiB0aGVtLiIpCgo7OzsgRm9udC1sb2NrOgoKKGRlZnVuIG1hcmtkb3duLXRzLS1mb250aWZ5LWRl
bGltaXRlciAobm9kZSBvdmVycmlkZSBzdGFydCBlbmQgJnJlc3QgXykKICAiRm9udGlmeSBkZWxp
bWl0ZXIgTk9ERSBhbmQgb3B0aW9uYWxseSBoaWRlIGl0cyBtYXJrdXAuCk5PREUgaXMgdGhlIHRy
ZWUtc2l0dGVyIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBkZWxpbWl0ZXIuCk9WRVJSSURFLCBTVEFS
VCwgYW5kIEVORCBhcmUgcGFzc2VkIHRocm91Z2ggdG8KYHRyZWVzaXQtZm9udGlmeS13aXRoLW92
ZXJyaWRlJy4iCiAgKHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlCiAgICh0cmVlc2l0LW5v
ZGUtc3RhcnQgbm9kZSkgKHRyZWVzaXQtbm9kZS1lbmQgbm9kZSkKICAgJ21hcmtkb3duLXRzLWRl
bGltaXRlciBvdmVycmlkZSBzdGFydCBlbmQpCiAgKHdoZW4gbWFya2Rvd24tdHMtaGlkZS1tYXJr
dXAKICAgIChwdXQtdGV4dC1wcm9wZXJ0eSAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpICh0cmVl
c2l0LW5vZGUtZW5kIG5vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgJ2ludmlzaWJsZSAnbWFy
a2Rvd24tdHMtLW1hcmt1cCkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1mb250aWZ5LWF0eC1kZWxp
bWl0ZXIgKG5vZGUgb3ZlcnJpZGUgc3RhcnQgZW5kICZyZXN0IF8pCiAgIkZvbnRpZnkgYXR4X2hl
YWRpbmcgZGVsaW1pdGVyIE5PREUgYW5kIG9wdGlvbmFsbHkgaGlkZSBpdHMgbWFya3VwLgpOT0RF
IGlzIHRoZSB0cmVlLXNpdHRlciBub2RlIHJlcHJlc2VudGluZyB0aGUgZGVsaW1pdGVyLgpMZWFk
aW5nIHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgZGVsaW1pdGVyIGFuZCB0aGUgaGVhZGluZyB0ZXh0
IGlzIGhpZGRlbgphbG9uZyB3aXRoIHRoZSBkZWxpbWl0ZXIgd2hlbiBoaWRpbmcgbWFya3VwLgpP
VkVSUklERSwgU1RBUlQsIGFuZCBFTkQgYXJlIHBhc3NlZCB0aHJvdWdoIHRvCmB0cmVlc2l0LWZv
bnRpZnktd2l0aC1vdmVycmlkZScuIgogICh0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVycmlkZQog
ICAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpCiAgICdt
YXJrZG93bi10cy1kZWxpbWl0ZXIgb3ZlcnJpZGUgc3RhcnQgZW5kKQogICh3aGVuIG1hcmtkb3du
LXRzLWhpZGUtbWFya3VwCiAgICAocHV0LXRleHQtcHJvcGVydHkgKHRyZWVzaXQtbm9kZS1zdGFy
dCBub2RlKQogICAgICAgICAgICAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAg
ICAgICAgICAgICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLWVuZCBub2RlKSkKICAgICAg
ICAgICAgICAgICAgICAgICAgIChyZS1zZWFyY2gtZm9yd2FyZCAiW15bOmJsYW5rOl1dIiAocG9z
LWVvbCkgJ25vLWVycm9yKQogICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChlcSAocG9pbnQp
IChwb3MtZW9sKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnQpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICgxLSAocG9pbnQpKSkpCiAgICAgICAgICAgICAgICAgICAgICAg
J2ludmlzaWJsZSAnbWFya2Rvd24tdHMtLW1hcmt1cCkpKQoKKGRlZnZhciB1cmwtbWFpbC1jb21t
YW5kKSA7IHVybC91cmwtdmFycy5lbAoKKGRlZnVuIG1hcmtkb3duLXRzLS1tYWtlLWxpbmstYnV0
dG9uIChiZWcgZW5kIHVybCkKICAiTWFrZSB0aGUgcmVnaW9uIGZyb20gQkVHIHRvIEVORCBhIGNs
aWNrYWJsZSBidXR0b24gZm9yIFVSTC4KRm9yIG1haWx0bzogVVJJcywgdXNlIGB1cmwtbWFpbC1j
b21tYW5kJy4gIEZvciBvdGhlciBzY2hlbWVzClwoZS5nLiwgaHR0cCwgZnRwKSwgb3BlbiB3aXRo
IGBicm93c2UtdXJsJy4gIE90aGVyd2lzZSwgdHJlYXQgYXMKYSByZWxhdGl2ZSBmaWxlIHBhdGgg
YW5kIG9wZW4gd2l0aCBgZmluZC1maWxlJy4KCkRvIG5vdCBwYXNzIGBmYWNlJyB0byBgbWFrZS10
ZXh0LWJ1dHRvbic6IHRoZSBsaW5rIGZhY2UgaXMgYWxyZWFkeQphcHBsaWVkIGJ5IGBtYXJrZG93
bi10cy0tZm9udGlmeS1saW5rLW5vZGUnIHZpYQpgdHJlZXNpdC1mb250aWZ5LXdpdGgtb3ZlcnJp
ZGUnICh3aXRoIGA6b3ZlcnJpZGUgYXBwZW5kJyksIGFuZApgYWRkLXRleHQtcHJvcGVydGllcycg
d291bGQgb3RoZXJ3aXNlIHJlcGxhY2UgdGhlIGFwcGVuZGVkIGZhY2UKbGlzdCB3aXRoIGEgc2lu
Z2xlIGBtYXJrZG93bi10cy1saW5rJywgY2xvYmJlcmluZyBhbiBlbmNsb3NpbmcKaGVhZGluZyBm
YWNlLiIKICA7OyBOT1RFOiBVUkkgc2NoZW1lIGFuZCBob3N0IG5hbWUgYXJlIGNhc2UtaW5zZW5z
aXRpdmUgcGVyIFJGQyAzOTg2CiAgOzsgYW5kIFJGQyA3MjMwLgogIChsZXQgKChjYXNlLWZvbGQt
c2VhcmNoIG5pbCkpCiAgICAobWFrZS10ZXh0LWJ1dHRvbiBiZWcgZW5kCiAgICAgICAgICAgICAg
ICAgICAgICAnYWN0aW9uIChsYW1iZGEgKF9idXR0b24pCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKGNvbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJpbmct
cHJlZml4LXAgIiMiIHVybCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXJr
ZG93bi10cy0tZm9sbG93LWZyYWdtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKHN1YnN0cmluZyB1cmwgMSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
KHN0cmluZy1tYXRjaC1wICJcXGBtYWlsdG86IiB1cmwpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoZnVuY2FsbCB1cmwtbWFpbC1jb21tYW5kCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYG1haWx0bzoiICIiIHVybCkp
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cmluZy1tYXRjaC1wICJcXGBb
YS16XSs6IiB1cmwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnJvd3NlLXVy
bCB1cmwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCAoZmluZC1maWxlIHVy
bCkpKSkKICAgICAgICAgICAgICAgICAgICAgICdoZWxwLWVjaG8gdXJsKSkpCgooZGVmdW4gbWFy
a2Rvd24tdHMtLWZvbnRpZnktbGluay1kZXN0aW5hdGlvbiAobm9kZSBvdmVycmlkZSBzdGFydCBl
bmQgJnJlc3QgXykKICAiRm9udGlmeSBsaW5rIGRlc3RpbmF0aW9uIE5PREUgYW5kIGhpZGUgaXQg
d2hlbiBtYXJrdXAgaXMgaGlkZGVuLgpPVkVSUklERSwgU1RBUlQsIGFuZCBFTkQgYXJlIHBhc3Nl
ZCB0aHJvdWdoIHRvCmB0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVycmlkZScuIgogICh0cmVlc2l0
LWZvbnRpZnktd2l0aC1vdmVycmlkZQogICAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpICh0cmVl
c2l0LW5vZGUtZW5kIG5vZGUpCiAgICdtYXJrZG93bi10cy1saW5rLWRlc3RpbmF0aW9uIG92ZXJy
aWRlIHN0YXJ0IGVuZCkKICAod2hlbiBtYXJrZG93bi10cy1oaWRlLW1hcmt1cAogICAgKHB1dC10
ZXh0LXByb3BlcnR5ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkgKHRyZWVzaXQtbm9kZS1lbmQg
bm9kZSkKICAgICAgICAgICAgICAgICAgICAgICAnaW52aXNpYmxlICdtYXJrZG93bi10cy0tbWFy
a3VwKSkpCgooZGVmdmFyLWxvY2FsIG1hcmtkb3duLXRzLS1saW5rLXJlZi1jYWNoZSBuaWwKICAi
Q2FjaGVkIGFsaXN0IG9mIChMQUJFTCAuIFVSTCkgZnJvbSBsaW5rIHJlZmVyZW5jZSBkZWZpbml0
aW9ucy4KRWFjaCBlbnRyeSBpcyBhIGNvbnMgY2VsbCBtYXBwaW5nIGEgZG93bmNhc2VkIGxhYmVs
IHN0cmluZyB0byBpdHMKZGVzdGluYXRpb24gVVJMLiIpCgooZGVmdmFyLWxvY2FsIG1hcmtkb3du
LXRzLS1saW5rLXJlZi1jYWNoZS10aWNrIG5pbAogICJWYWx1ZSBvZiBgYnVmZmVyLWNoYXJzLW1v
ZGlmaWVkLXRpY2snIHdoZW4gdGhlIGNhY2hlIHdhcyBidWlsdC4iKQoKKGRlZnVuIG1hcmtkb3du
LXRzLS1saW5rLXJlZi1kZWZpbml0aW9ucyAoKQogICJSZXR1cm4gYW4gYWxpc3Qgb2YgKExBQkVM
IC4gVVJMKSBmcm9tIGxpbmsgcmVmZXJlbmNlIGRlZmluaXRpb25zLgpMQUJFTCBpcyBkb3duY2Fz
ZWQgZm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcuICBSZXN1bHRzIGFyZQpjYWNoZWQgYW5k
IHJlYnVpbHQgb25seSB3aGVuIHRoZSBidWZmZXIgY2hhbmdlcy4iCiAgKGxldCAoKHRpY2sgKGJ1
ZmZlci1jaGFycy1tb2RpZmllZC10aWNrKSkpCiAgICAodW5sZXNzIChlcSB0aWNrIG1hcmtkb3du
LXRzLS1saW5rLXJlZi1jYWNoZS10aWNrKQogICAgICAobGV0KiAoKHJvb3QgKHRyZWVzaXQtYnVm
ZmVyLXJvb3Qtbm9kZSAnbWFya2Rvd24pKQogICAgICAgICAgICAgKG1hdGNoZXMgKHRyZWVzaXQt
cXVlcnktY2FwdHVyZQogICAgICAgICAgICAgICAgICAgICAgIHJvb3QKICAgICAgICAgICAgICAg
ICAgICAgICAnKChsaW5rX3JlZmVyZW5jZV9kZWZpbml0aW9uCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGxpbmtfbGFiZWwpIEBsYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5r
X2Rlc3RpbmF0aW9uKSBAZGVzdCkpKSkKICAgICAgICAgICAgIGRlZnMpCiAgICAgICAgKHdoaWxl
IG1hdGNoZXMKICAgICAgICAgIChsZXQqICgobGFiZWwtcGFpciAocG9wIG1hdGNoZXMpKQogICAg
ICAgICAgICAgICAgIChkZXN0LXBhaXIgKHBvcCBtYXRjaGVzKSkKICAgICAgICAgICAgICAgICAo
bGJsLXRleHQgKHN0cmluZy10cmltICh0cmVlc2l0LW5vZGUtdGV4dCAoY2RyIGxhYmVsLXBhaXIp
IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxbIiAiXFxdIikp
KQogICAgICAgICAgICAocHVzaCAoY29ucyAoZG93bmNhc2UgbGJsLXRleHQpCiAgICAgICAgICAg
ICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtdGV4dCAoY2RyIGRlc3QtcGFpcikgdCkpCiAgICAg
ICAgICAgICAgICAgIGRlZnMpKSkKICAgICAgICAoc2V0cSBtYXJrZG93bi10cy0tbGluay1yZWYt
Y2FjaGUgKG5yZXZlcnNlIGRlZnMpCiAgICAgICAgICAgICAgbWFya2Rvd24tdHMtLWxpbmstcmVm
LWNhY2hlLXRpY2sgdGljaykpKQogICAgbWFya2Rvd24tdHMtLWxpbmstcmVmLWNhY2hlKSkKCihk
ZWZ1biBtYXJrZG93bi10cy0tcmVzb2x2ZS1saW5rLXJlZiAobGFiZWwpCiAgIlJlc29sdmUgTEFC
RUwgdG8gYSBVUkwgdmlhIGxpbmsgcmVmZXJlbmNlIGRlZmluaXRpb25zLgpMQUJFTCBzaG91bGQg
YmUgdGhlIHRleHQgd2l0aG91dCBicmFja2V0cy4gIE1hdGNoaW5nIGlzCmNhc2UtaW5zZW5zaXRp
dmUgcGVyIENvbW1vbk1hcmsgc3BlYyBzZWN0aW9uIDQuNy4iCiAgKGFsaXN0LWdldCAoZG93bmNh
c2UgbGFiZWwpIChtYXJrZG93bi10cy0tbGluay1yZWYtZGVmaW5pdGlvbnMpCiAgICAgICAgICAg
ICBuaWwgbmlsICMnZXF1YWwpKQoKOzs7IEZyYWdtZW50IGxpbmtzOgoKKGRlZmNvbnN0IG1hcmtk
b3duLXRzLS1zbHVnLWdpdGh1Yi1zdHJpcC1yZQogICJbXVshXCIjJCUmJygpKissLi86Ozw9Pj9A
XFxeYHt8fX5dIgogICJQdW5jdHVhdGlvbiBzdHJpcHBlZCBieSBHaXRIdWIncyBnaC1zbHVnZ2Vy
IGJlZm9yZSBoeXBoZW5hdGlvbi4iKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1zbHVnLWdpdGh1YiAo
dGV4dCkKICAiUmV0dXJuIHRoZSBHaXRIdWItZmxhdm9yIHNsdWcgZm9yIGhlYWRpbmcgVEVYVC4K
TWlycm9ycyB0aGUgZ2gtc2x1Z2dlciBhbGdvcml0aG06IGxvd2VyY2FzZSwgc3RyaXAgYSBmaXhl
ZApwdW5jdHVhdGlvbiBzZXQsIHJlcGxhY2Ugc3BhY2VzIHdpdGggaHlwaGVucy4iCiAgKGxldCog
KChsYyAoZG93bmNhc2UgdGV4dCkpCiAgICAgICAgIChzdHJpcHBlZCAocmVwbGFjZS1yZWdleHAt
aW4tc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtLXNsdWctZ2l0aHViLXN0
cmlwLXJlICIiIGxjKSkpCiAgICAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nICJbWzpibGFuazpd
XSIgIi0iIHN0cmlwcGVkKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLXNsdWctcGFuZG9jICh0ZXh0
KQogICJSZXR1cm4gdGhlIFBhbmRvYy1mbGF2b3IgYXV0by1pZCBzbHVnIGZvciBoZWFkaW5nIFRF
WFQuCk1pcnJvcnMgUGFuZG9jJ3MgYWxnb3JpdGhtOiBkcm9wIGV2ZXJ5dGhpbmcgYmVmb3JlIHRo
ZSBmaXJzdApsZXR0ZXIsIGtlZXAgYWxwaGFudW1lcmljcyBhbmQgYF8tLicsIGNvbGxhcHNlIHdo
aXRlc3BhY2UgcnVucyB0bwpoeXBoZW5zLCBsb3dlcmNhc2UuICBGYWxscyBiYWNrIHRvIFwic2Vj
dGlvblwiIGlmIGVtcHR5LiIKICAobGV0KiAoKGxjIChkb3duY2FzZSB0ZXh0KSkKICAgICAgICAg
KGZyb20tbGV0dGVyIChpZiAoc3RyaW5nLW1hdGNoICJbWzphbHBoYTpdXSIgbGMpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHN1YnN0cmluZyBsYyAobWF0Y2gtYmVnaW5uaW5nIDApKQogICAg
ICAgICAgICAgICAgICAgICAgICAiIikpCiAgICAgICAgIChrZXB0IChyZXBsYWNlLXJlZ2V4cC1p
bi1zdHJpbmcKICAgICAgICAgICAgICAgICJbXls6YWxudW06XV8uXG5cdFs6Ymxhbms6XS1dIiAi
IiBmcm9tLWxldHRlcikpCiAgICAgICAgIChoeXBoZW5hdGVkIChyZXBsYWNlLXJlZ2V4cC1pbi1z
dHJpbmcgIltbOmJsYW5rOl1cdFxuXSsiICItIiBrZXB0KSkKICAgICAgICAgKHRyaW1tZWQgKHJl
cGxhY2UtcmVnZXhwLWluLXN0cmluZyAiLStcXCciICIiIGh5cGhlbmF0ZWQpKSkKICAgIChpZiAo
c3RyaW5nLWVtcHR5LXAgdHJpbW1lZCkgInNlY3Rpb24iIHRyaW1tZWQpKSkKCihkZWZjb25zdCBt
YXJrZG93bi10cy0tZXhwbGljaXQtaWQtcmUKICAiWyBcdF0qe1sgXHRdKiNcXChbXn0gXHRdK1xc
KVsgXHRdKn1bIFx0XSpcXCciCiAgIk1hdGNoIGEgUGFuZG9jLXN0eWxlIHRyYWlsaW5nIGB7I2lk
fScgb24gYSBoZWFkaW5nIGxpbmUuCkNhcHR1cmUgZ3JvdXAgMSBpcyB0aGUgZXhwbGljaXQgaWQu
IikKCihkZWZ1biBtYXJrZG93bi10cy0taGVhZGluZy10ZXh0LWFuZC1pZCAocmF3KQogICJTcGxp
dCBSQVcgaGVhZGluZyB0ZXh0IGludG8gKFZJU0lCTEUgLiBFWFBMSUNJVC1JRCkuCkVYUExJQ0lU
LUlEIGlzIG5vbi1uaWwgaWYgUkFXIGVuZHMgd2l0aCBhIFBhbmRvYy1zdHlsZSBgeyNpZH0nLApp
biB3aGljaCBjYXNlIFZJU0lCTEUgaXMgUkFXIHdpdGggdGhhdCBzdWZmaXggcmVtb3ZlZC4iCiAg
KGlmIChzdHJpbmctbWF0Y2ggbWFya2Rvd24tdHMtLWV4cGxpY2l0LWlkLXJlIHJhdykKICAgICAg
KGNvbnMgKHN1YnN0cmluZyByYXcgMCAobWF0Y2gtYmVnaW5uaW5nIDApKQogICAgICAgICAgICAo
bWF0Y2gtc3RyaW5nIDEgcmF3KSkKICAgIChjb25zIHJhdyBuaWwpKSkKCihkZWZ2YXItbG9jYWwg
bWFya2Rvd24tdHMtLWhlYWRpbmctaWQtY2FjaGUgbmlsCiAgIkNhY2hlZCBoYXNoIHRhYmxlIG1h
cHBpbmcgaGVhZGluZyBzbHVnIHN0cmluZ3MgdG8gYnVmZmVyIHBvc2l0aW9ucy4KRWFjaCB2YWx1
ZSBpcyB0aGUgYnVmZmVyIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hpbmcKYGF0
eF9oZWFkaW5nJyBvciBgc2V0ZXh0X2hlYWRpbmcnIG5vZGUuICBCdWlsdCBsYXppbHkgYnkKYG1h
cmtkb3duLXRzLS1oZWFkaW5nLWlkcycsIGludmFsaWRhdGVkIGJ5IGJ1ZmZlci10aWNrIGNoYW5n
ZS4iKQoKKGRlZnZhci1sb2NhbCBtYXJrZG93bi10cy0taGVhZGluZy1pZC1jYWNoZS10aWNrIG5p
bAogICJWYWx1ZSBvZiBgYnVmZmVyLWNoYXJzLW1vZGlmaWVkLXRpY2snIHdoZW4gdGhlIGhlYWRp
bmctaWQgY2FjaGUgd2FzIGJ1aWx0LiIpCgooZGVmdW4gbWFya2Rvd24tdHMtLWJ1aWxkLWhlYWRp
bmctaWRzICgpCiAgIldhbGsgYWxsIGhlYWRpbmdzIGluIHRoZSBidWZmZXIgYW5kIHJldHVybiBh
IGhhc2ggdGFibGUuCldoaWNoIG1hcHMgZWFjaCBzbHVnIHRvIHRoZSBidWZmZXIgcG9zaXRpb24g
b2YgaXRzIGhlYWRpbmcuICBFYWNoCmhlYWRpbmcgY29udHJpYnV0ZXMgaXRzIEdpdEh1YiBzbHVn
LCBpdHMgUGFuZG9jIHNsdWcsIGFuZCBpdHMgZXhwbGljaXQKYHsjaWR9JyBpZiBwcmVzZW50LiAg
Qm90aCBzbHVnIGFsZ29yaXRobXMgYXJlIHN0b3JlZCBpbiB0aGUgc2FtZSBidWZmZXIKYmVjYXVz
ZSBhIG1hcmtkb3duIGZpbGUgaXMgb2Z0ZW4gcHJldmlld2VkIGJ5IHNldmVyYWwgcmVuZGVyZXJz
IChHaXRIdWIKd2ViIFVJLCBQYW5kb2MsIG1kQm9vaywgSHVnbywgYW5kIHNvIG9uKSBhbmQgdGhl
IHNhbWUgc291cmNlIHNob3VsZApyZXNvbHZlIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lIHRoZSBh
dXRob3Igd3JvdGUgdGhlIGxpbmsgZm9yLiAgRm9yIG1vc3QKaGVhZGluZ3MgdGhlIHR3byBhbGdv
cml0aG1zIHByb2R1Y2UgdGhlIHNhbWUgc2x1ZyBhbnl3YXkuCkR1cGxpY2F0ZSBzbHVncyAod2l0
aGluIG9uZSBhbGdvcml0aG0pIGFyZSBkaXNhbWJpZ3VhdGVkIGJ5IGFwcGVuZGluZwpgLTEnLCBg
LTInLCBhbmQgc28gb24sIGluIGRvY3VtZW50IG9yZGVyLCBtYXRjaGluZyBHaXRIdWIncyBiZWhh
dmlvci4KV2hlbiB0d28gZGlzdGluY3QgaGVhZGluZ3Mgd291bGQgb3RoZXJ3aXNlIHNoYXJlIGEg
c2x1ZywgdGhlIGZpcnN0Cm9jY3VycmVuY2UgaW4gZG9jdW1lbnQgb3JkZXIgd2lucy4iCiAgKGxl
dCAoKHRhYmxlIChtYWtlLWhhc2gtdGFibGUgOnRlc3QgIydlcXVhbCkpCiAgICAgICAgOzsgUGVy
LWFsZ29yaXRobSBkZWR1cGUgY291bnRlcnM6IGhvdyBtYW55IHRpbWVzIHRoaXMgYmFzZSBzbHVn
CiAgICAgICAgOzsgaGFzIGJlZW4gc2VlbiBzbyBmYXIgaW4gZG9jdW1lbnQgb3JkZXIuCiAgICAg
ICAgKGdoLWNvdW50cyAobWFrZS1oYXNoLXRhYmxlIDp0ZXN0ICMnZXF1YWwpKQogICAgICAgIChw
ZC1jb3VudHMgKG1ha2UtaGFzaC10YWJsZSA6dGVzdCAjJ2VxdWFsKSkKICAgICAgICAocm9vdCAo
dHJlZXNpdC1idWZmZXItcm9vdC1ub2RlICdtYXJrZG93bikpKQogICAgKGRvbGlzdCAoY2FwICh0
cmVlc2l0LXF1ZXJ5LWNhcHR1cmUKICAgICAgICAgICAgICAgICAgcm9vdAogICAgICAgICAgICAg
ICAgICAnKCgoYXR4X2hlYWRpbmcpIEBoKQogICAgICAgICAgICAgICAgICAgICgoc2V0ZXh0X2hl
YWRpbmcpIEBoKSkpKQogICAgICAobGV0KiAoKG5vZGUgKGNkciBjYXApKQogICAgICAgICAgICAg
KHBvcyAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQogICAgICAgICAgICAgKHJhdyAoc3RyaW5n
LXRyaW0gKHRyZWVzaXQtbm9kZS10ZXh0IG5vZGUgdCkpKQogICAgICAgICAgICAgOzsgU3RyaXAg
dGhlIGxlYWRpbmcgbWFya2VyICgjIyMgb3IgPT09PS8tLS0tKS4KICAgICAgICAgICAgIDs7IEZv
ciBhdHgsIGRyb3AgbGVhZGluZyAjJ3MgYW5kIGZvbGxvd2luZyBzcGFjZS4KICAgICAgICAgICAg
IDs7IEZvciBzZXRleHQsIGRyb3AgdGhlIHRyYWlsaW5nIHVuZGVybGluZSBsaW5lLgogICAgICAg
ICAgICAgKHRleHQgKGNvbmQKICAgICAgICAgICAgICAgICAgICAoKHN0cmluZy1tYXRjaCAiXFxg
IytbIFx0XSpcXCguKj9cXClbIFx0XSojKlsgXHRdKlxcJyIgcmF3KQogICAgICAgICAgICAgICAg
ICAgICAobWF0Y2gtc3RyaW5nIDEgcmF3KSkKICAgICAgICAgICAgICAgICAgICAoKHN0cmluZy1t
YXRjaCAiXFxgXFwoLio/XFwpXG5bPS1dK1sgXHRdKlxcJyIgcmF3KQogICAgICAgICAgICAgICAg
ICAgICAobWF0Y2gtc3RyaW5nIDEgcmF3KSkKICAgICAgICAgICAgICAgICAgICAodCByYXcpKSkK
ICAgICAgICAgICAgIChzcGxpdCAobWFya2Rvd24tdHMtLWhlYWRpbmctdGV4dC1hbmQtaWQgdGV4
dCkpCiAgICAgICAgICAgICAodmlzaWJsZSAoY2FyIHNwbGl0KSkKICAgICAgICAgICAgIChleHBs
aWNpdCAoY2RyIHNwbGl0KSkpCiAgICAgICAgOzsgRXhwbGljaXQgeyNpZH0gd2lucyBvdXRyaWdo
dDsgZmlyc3Qgb2NjdXJyZW5jZSBrZWVwcyBpdC4KICAgICAgICAod2hlbiAoYW5kIGV4cGxpY2l0
IChub3QgKGdldGhhc2ggZXhwbGljaXQgdGFibGUpKSkKICAgICAgICAgIChwdXRoYXNoIGV4cGxp
Y2l0IHBvcyB0YWJsZSkpCiAgICAgICAgOzsgQXV0byBzbHVncyAoR2l0SHViICsgUGFuZG9jKSwg
ZGVkdXBlZCBwZXIgYWxnb3JpdGhtLgogICAgICAgIChsZXQqICgoZ2gtYmFzZSAobWFya2Rvd24t
dHMtLXNsdWctZ2l0aHViIHZpc2libGUpKQogICAgICAgICAgICAgICAocGQtYmFzZSAobWFya2Rv
d24tdHMtLXNsdWctcGFuZG9jIHZpc2libGUpKQogICAgICAgICAgICAgICAoZ2gtbiAoZ2V0aGFz
aCBnaC1iYXNlIGdoLWNvdW50cyAwKSkKICAgICAgICAgICAgICAgKHBkLW4gKGdldGhhc2ggcGQt
YmFzZSBwZC1jb3VudHMgMCkpCiAgICAgICAgICAgICAgIChnaC1pZCAoaWYgKHplcm9wIGdoLW4p
IGdoLWJhc2UKICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiJXMtJWQiIGdoLWJhc2Ug
Z2gtbikpKQogICAgICAgICAgICAgICAocGQtaWQgKGlmICh6ZXJvcCBwZC1uKSBwZC1iYXNlCiAg
ICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIiVzLSVkIiBwZC1iYXNlIHBkLW4pKSkpCiAg
ICAgICAgICAocHV0aGFzaCBnaC1iYXNlICgxKyBnaC1uKSBnaC1jb3VudHMpCiAgICAgICAgICAo
cHV0aGFzaCBwZC1iYXNlICgxKyBwZC1uKSBwZC1jb3VudHMpCiAgICAgICAgICA7OyBGaXJzdC13
cml0ZXItd2lucyBzbyBkb2N1bWVudCBvcmRlciB0aWVicmVha3MgY29sbGlzaW9ucy4KICAgICAg
ICAgICh1bmxlc3MgKGdldGhhc2ggZ2gtaWQgdGFibGUpIChwdXRoYXNoIGdoLWlkIHBvcyB0YWJs
ZSkpCiAgICAgICAgICAodW5sZXNzIChnZXRoYXNoIHBkLWlkIHRhYmxlKSAocHV0aGFzaCBwZC1p
ZCBwb3MgdGFibGUpKSkpKQogICAgdGFibGUpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1oZWFkaW5n
LWlkcyAoKQogICJSZXR1cm4gdGhlIGhlYWRpbmctaWQgaGFzaCB0YWJsZSBmb3IgdGhlIGN1cnJl
bnQgYnVmZmVyLgpDYWNoZSBpcyByZWJ1aWx0IG9ubHkgd2hlbiBgYnVmZmVyLWNoYXJzLW1vZGlm
aWVkLXRpY2snIGhhcyBhZHZhbmNlZApzaW5jZSB0aGUgbGFzdCBjYWxsIChtaXJyb3JzIGBtYXJr
ZG93bi10cy0tbGluay1yZWYtY2FjaGUnKS4iCiAgKGxldCAoKHRpY2sgKGJ1ZmZlci1jaGFycy1t
b2RpZmllZC10aWNrKSkpCiAgICAodW5sZXNzIChlcSB0aWNrIG1hcmtkb3duLXRzLS1oZWFkaW5n
LWlkLWNhY2hlLXRpY2spCiAgICAgIChzZXRxIG1hcmtkb3duLXRzLS1oZWFkaW5nLWlkLWNhY2hl
IChtYXJrZG93bi10cy0tYnVpbGQtaGVhZGluZy1pZHMpCiAgICAgICAgICAgIG1hcmtkb3duLXRz
LS1oZWFkaW5nLWlkLWNhY2hlLXRpY2sgdGljaykpCiAgICBtYXJrZG93bi10cy0taGVhZGluZy1p
ZC1jYWNoZSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbGxvdy1mcmFnbWVudCAoaWQpCiAgIkp1
bXAgdG8gdGhlIGhlYWRpbmcgd2hvc2Ugc2x1ZyBtYXRjaGVzIElEICh3aXRob3V0IGxlYWRpbmcg
YCMnKS4KUHVzaGVzIHRoZSBtYXJrIGJlZm9yZSBtb3Zpbmcgc28gYEMtdSBDLVNQQycgcmV0dXJu
cy4gIFNpZ25hbHMKYHVzZXItZXJyb3InIGlmIG5vIGhlYWRpbmcgbWF0Y2hlcy4iCiAgKGlmLWxl
dCogKChwb3MgKGdldGhhc2ggaWQgKG1hcmtkb3duLXRzLS1oZWFkaW5nLWlkcykpKSkKICAgICAg
KHByb2duCiAgICAgICAgKHB1c2gtbWFyaykKICAgICAgICAoZ290by1jaGFyIHBvcykKICAgICAg
ICAocmVjZW50ZXIpKQogICAgKHVzZXItZXJyb3IgIk5vIGhlYWRpbmcgZm9yIGZyYWdtZW50OiAj
JXMiIGlkKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktYXR4LWhlYWRpbmcgKG5vZGUg
X292ZXJyaWRlIF9zdGFydCBfZW5kICZyZXN0IF8pCiAgIkFwcGx5IHRoZSBoZWFkaW5nIGZhY2Ug
YWNyb3NzIGFuIGF0eF9oZWFkaW5nIE5PREUuCkxheWVyIHRoZSBmYWNlIG9uIHRvcCBvZiBjaGls
ZCBzdWItbm9kZXMgKGUuZy4gYW4gaW5saW5lIGxpbmspIHNvCnRoZWlyIG93biBmYWNlcyBhcmUg
cHJlc2VydmVkLiAgU3RyaXAgYW55IHByaW9yIGNvcHkgb2YgdGhlIGZhY2UKZmlyc3Qgc28gaXQg
ZG9lcyBub3QgYWNjdW11bGF0ZSB3aGVuIHRoZSBoZWFkaW5nIGlzIHJlZm9udGlmaWVkIG9yCml0
cyBsZXZlbC90eXBlIGNoYW5nZXMgZHVyaW5nIGVkaXRpbmcuCkRvIG5vdCBmb250aWZ5IHRoZSBo
ZWFkZXIncyB0cmFpbGluZyBuZXdsaW5lLgpFbGlkZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHdoZW4g
aGlkaW5nIG1hcmt1cC4KRm9udGlmeSBhbnkgb3B0aW9uYWwgdHJhaWxpbmcgY2xvc2luZy1gIycg
c2VxdWVuY2UgYXMgYSBkZWxpbWl0ZXIuICBUaGUKdHJlZS1zaXR0ZXIgZ3JhbW1hciBkb2VzIG5v
dCBwcm9kdWNlIGEgc2VwYXJhdGUgbm9kZSBmb3IgdGhlc2U7IHBlcgpDb21tb25NYXJrIHRoZXkg
YXJlIGRlY29yYXRpdmUgYW5kIG11c3QgYmUgcHJlY2VkZWQgYnkgYSBzcGFjZSBvciB0YWIuIgog
IChsZXQqICgobi1zdGFydCAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQogICAgICAgICAobi1l
bmQgICAodHJlZXNpdC1ub2RlLWVuZCBub2RlKSkKICAgICAgICAgKGZhY2UgKGxldCAoKG1hcmtl
ciAodHJlZXNpdC1ub2RlLWNoaWxkIG5vZGUgMCkpKQogICAgICAgICAgICAgICAgIChpbnRlcm4g
KGZvcm1hdCAibWFya2Rvd24tdHMtaGVhZGluZy0lZCIKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKGxlbmd0aCAodHJlZXNpdC1ub2RlLXRleHQgbWFya2VyIHQpKSkpKSkpCiAgICAo
Zm9udC1sb2NrLS1yZW1vdmUtZmFjZS1mcm9tLXRleHQtcHJvcGVydHkgbi1zdGFydCBuLWVuZCAn
ZmFjZSBmYWNlKQogICAgKGZvbnQtbG9jay1hcHBlbmQtdGV4dC1wcm9wZXJ0eSBuLXN0YXJ0ICgx
LSBuLWVuZCkgJ2ZhY2UgZmFjZSkKICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAoZ290by1jaGFy
IG4tZW5kKQogICAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiWzpzcGFjZTpdIiBuLXN0YXJ0KQog
ICAgICAobGV0ICgodHJhaWxpbmctZW5kIChwb2ludCkpKQogICAgICAgIChza2lwLWNoYXJzLWJh
Y2t3YXJkICIjIiBuLXN0YXJ0KQogICAgICAgIChsZXQgKCh0cmFpbGluZy1zdGFydCAocG9pbnQp
KSkKICAgICAgICAgIChjb25kICgoYW5kICg8IHRyYWlsaW5nLXN0YXJ0IHRyYWlsaW5nLWVuZCkK
ICAgICAgICAgICAgICAgICAgICAgICg+IHRyYWlsaW5nLXN0YXJ0IG4tc3RhcnQpCiAgICAgICAg
ICAgICAgICAgICAgICAobWVtcSAoY2hhci1iZWZvcmUgdHJhaWxpbmctc3RhcnQpICcoP1xzID9c
dCkpKQogICAgICAgICAgICAgICAgIDs7IElkZW50aWZ5IHRoZSBvcHRpb25hbCB0cmFpbGluZyBj
bG9zaW5nLSMgc2VxdWVuY2UsCiAgICAgICAgICAgICAgICAgOzsgZm9udGlmeSBpdCBhcyBhIGRl
bGltaXRlciwgYW5kIHJlbW92ZSB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgOzsgYmV0d2Vl
biB0aGUgaGVhZGluZyB0ZXh0IGFuZCB0aGUgZGVsaW1pdGVyLiAgVGhlCiAgICAgICAgICAgICAg
ICAgOzsgZ3JhbW1hciBvbWl0cyBhIG5vZGUgZm9yIHRoaXMgcnVuIGRlc3BpdGUgQ29tbW9uTWFy
ay4KICAgICAgICAgICAgICAgICAoZm9udC1sb2NrLS1yZW1vdmUtZmFjZS1mcm9tLXRleHQtcHJv
cGVydHkKICAgICAgICAgICAgICAgICAgdHJhaWxpbmctc3RhcnQgdHJhaWxpbmctZW5kCiAgICAg
ICAgICAgICAgICAgICdmYWNlICdtYXJrZG93bi10cy1kZWxpbWl0ZXIpCiAgICAgICAgICAgICAg
ICAgKGZvbnQtbG9jay1wcmVwZW5kLXRleHQtcHJvcGVydHkKICAgICAgICAgICAgICAgICAgdHJh
aWxpbmctc3RhcnQgdHJhaWxpbmctZW5kCiAgICAgICAgICAgICAgICAgICdmYWNlICdtYXJrZG93
bi10cy1kZWxpbWl0ZXIpCiAgICAgICAgICAgICAgICAgKHdoZW4gbWFya2Rvd24tdHMtaGlkZS1t
YXJrdXAKICAgICAgICAgICAgICAgICAgIChsZXQgKChoaWRlLXN0YXJ0IChzYXZlLWV4Y3Vyc2lv
bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIHRyYWls
aW5nLXN0YXJ0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2tpcC1j
aGFycy1iYWNrd2FyZCAiWzpzcGFjZTpdIiBuLXN0YXJ0KQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAocG9pbnQpKSkpCiAgICAgICAgICAgICAgICAgICAgIChwdXQtdGV4
dC1wcm9wZXJ0eSBoaWRlLXN0YXJ0IChwb3MtZW9sKQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJ2ludmlzaWJsZSAnbWFya2Rvd24tdHMtLW1hcmt1cCkpKSkKICAgICAg
ICAgICAgICAgIChtYXJrZG93bi10cy1oaWRlLW1hcmt1cAogICAgICAgICAgICAgICAgIDs7IEhp
ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZSBpbiB0aGUgbm9taW5hbCBjYXNlLgogICAgICAgICAgICAg
ICAgIChwdXQtdGV4dC1wcm9wZXJ0eSB0cmFpbGluZy1lbmQgKHBvcy1lb2wpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICdpbnZpc2libGUgJ21hcmtkb3duLXRzLS1tYXJrdXAp
KSkpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1mb250aWZ5LXNldGV4dC1oZWFkaW5nIChub2Rl
IF9vdmVycmlkZSBfc3RhcnQgX2VuZCAmcmVzdCBfKQogICJBcHBseSB0aGUgaGVhZGluZyBmYWNl
IGFjcm9zcyBhIHNldGV4dCBOT0RFLgpMYXllciB0aGUgZmFjZSBvbiB0b3Agb2YgY2hpbGQgc3Vi
LW5vZGVzIChlLmcuIGFuIGlubGluZSBsaW5rKSBzbwp0aGVpciBvd24gZmFjZXMgYXJlIHByZXNl
cnZlZC4gIFN0cmlwIGFueSBwcmlvciBjb3B5IG9mIHRoZSBmYWNlCmZpcnN0IHNvIGl0IGRvZXMg
bm90IGFjY3VtdWxhdGUgd2hlbiB0aGUgaGVhZGluZyBpcyByZWZvbnRpZmllZCBvcgppdHMgbGV2
ZWwvdHlwZSBjaGFuZ2VzIGR1cmluZyBlZGl0aW5nLgpBcHBseSB0aGUgZmFjZSB0byB0aGUgc2V0
ZXh0IGhlYWRpbmdfY29udGVudCBzZXBhcmF0ZWx5IGZyb20gdGhlCnVuZGVybGluZSByYXRoZXIg
dGhhbiB0cmVhdCB0aGVtIGFzIGEgc2luZ2xlIHJhbmdlLiAgVGhpcyBhdm9pZHMgcHV0dGluZwp0
aGUgZmFjZSBvbiB0aGUgaGVhZGluZ19jb250ZW50IG5ld2xpbmUuICBJZiBgbWFya2Rvd24tdHMt
aGlkZS1tYXJrdXAnCmlzIG5vbi1uaWwsIGhpZGUgdGhlIHVuZGVybGluZSBsaW5lIGVudGlyZWx5
IGJ5IHNldHRpbmcgaXRzIGxpbmUtaGVpZ2h0CnRleHQgcHJvcGVydHkgdG8gMC4KRWxpZGUgdHJh
aWxpbmcgd2hpdGVzcGFjZSB3aGVuIGhpZGluZyBtYXJrdXAuIgogIChsZXQqICgobi1zdGFydCAo
dHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQogICAgICAgICAobi1lbmQgKHRyZWVzaXQtbm9kZS1l
bmQgbm9kZSkpCiAgICAgICAgIChjb250ZW50ICh0cmVlc2l0LW5vZGUtY2hpbGQgbm9kZSAwICdu
YW1lZCkpCiAgICAgICAgIChjb250ZW50LXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgY29udGVu
dCkpCiAgICAgICAgIChjb250ZW50LWVuZCAodHJlZXNpdC1ub2RlLWVuZCBjb250ZW50KSkKICAg
ICAgICAgKHVuZGVybGluZSAodHJlZXNpdC1ub2RlLWNoaWxkIG5vZGUgMSAnbmFtZWQpKQogICAg
ICAgICAodW5kZXJsaW5lLXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgdW5kZXJsaW5lKSkKICAg
ICAgICAgKHVuZGVybGluZS1lbmQgKHRyZWVzaXQtbm9kZS1lbmQgdW5kZXJsaW5lKSkKICAgICAg
ICAgKGZhY2UgJ21hcmtkb3duLXRzLXNldGV4dC1oZWFkaW5nKSkKICAgIChmb250LWxvY2stLXJl
bW92ZS1mYWNlLWZyb20tdGV4dC1wcm9wZXJ0eSBuLXN0YXJ0IG4tZW5kICdmYWNlIGZhY2UpCiAg
ICA7OyAxLSBjb250ZW50LWVuZCBhdm9pZHMgdGhlIG5ld2xpbmUgc28gaXQgaGlkZXMgY29ycmVj
dGx5LgogICAgKGZvbnQtbG9jay1hcHBlbmQtdGV4dC1wcm9wZXJ0eSBjb250ZW50LXN0YXJ0ICgx
LSBjb250ZW50LWVuZCkgJ2ZhY2UgZmFjZSkKICAgIChmb250LWxvY2stYXBwZW5kLXRleHQtcHJv
cGVydHkgdW5kZXJsaW5lLXN0YXJ0IHVuZGVybGluZS1lbmQgJ2ZhY2UgZmFjZSkKICAgICh3aGVu
IG1hcmtkb3duLXRzLWhpZGUtbWFya3VwCiAgICAgIDs7IEhpZGUgaGVhZGluZ19jb250ZW50IHRy
YWlsaW5nIHNwYWNlcy4KICAgICAgKHB1dC10ZXh0LXByb3BlcnR5IChzYXZlLWV4Y3Vyc2lvbgog
ICAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIGNvbnRlbnQtZW5kKQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiWzpzcGFjZTpdIiBjb250
ZW50LXN0YXJ0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnQpKQogICAgICAgICAg
ICAgICAgICAgICAgICAgY29udGVudC1lbmQKICAgICAgICAgICAgICAgICAgICAgICAgICdpbnZp
c2libGUgJ21hcmtkb3duLXRzLS1tYXJrdXApCiAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSB1bmRl
cmxpbmUtc3RhcnQgdW5kZXJsaW5lLWVuZCAnbGluZS1oZWlnaHQgMCkpKSkKCihkZWZ1biBtYXJr
ZG93bi10cy0tZm9udGlmeS1saW5rLW5vZGUgKG5vZGUgb3ZlcnJpZGUgc3RhcnQgZW5kICZyZXN0
IF8pCiAgIkZvbnRpZnkgbGluayBvciBpbWFnZSB0ZXh0IE5PREUgYXMgYSBjbGlja2FibGUgYnV0
dG9uLgpXb3JrcyBmb3IgaW5saW5lIGxpbmtzLCByZWZlcmVuY2UgbGlua3MsIHNob3J0Y3V0IGxp
bmtzLCBhbmQKaW1hZ2UgZGVzY3JpcHRpb25zLiAgVGhlIFVSTCBpcyB0YWtlbiBmcm9tIGEgc2li
bGluZwpgbGlua19kZXN0aW5hdGlvbicgbm9kZSB3aGVuIHByZXNlbnQsIG9yIHJlc29sdmVkIGZy
b20gYQpsaW5rIHJlZmVyZW5jZSBkZWZpbml0aW9uLCBvciB0aGUgbm9kZSB0ZXh0IGl0c2VsZiBp
cyB1c2VkIGFzCmZhbGxiYWNrLiAgT1ZFUlJJREUsIFNUQVJULCBhbmQgRU5EIGFyZSBwYXNzZWQg
dGhyb3VnaCB0bwpgdHJlZXNpdC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUnLiIKICAobGV0ICgocGFy
ZW50ICh0cmVlc2l0LW5vZGUtcGFyZW50IG5vZGUpKSkKICAgIDs7IFdoZW4gTk9ERSBpcyBhIGxp
bmtfbGFiZWwgaW5zaWRlIGEgZnVsbF9yZWZlcmVuY2VfbGluayB0aGF0CiAgICA7OyBhbHNvIGhh
cyBhIGxpbmtfdGV4dCwgc2tpcCBpdCwgbGlua190ZXh0IGhhbmRsZXMgdGhhdCBsaW5rLgogICAg
KHVubGVzcyAoYW5kIChzdHJpbmc9ICh0cmVlc2l0LW5vZGUtdHlwZSBub2RlKSAibGlua19sYWJl
bCIpCiAgICAgICAgICAgICAgICAgKHRyZWVzaXQtc2VhcmNoLXN1YnRyZWUgcGFyZW50ICJcXGBs
aW5rX3RleHRcXCciKSkKICAgICAgKHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlCiAgICAg
ICAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpCiAgICAg
ICAnbWFya2Rvd24tdHMtbGluayBvdmVycmlkZSBzdGFydCBlbmQpCiAgICAgIChsZXQqICgoZGVz
dCAodHJlZXNpdC1zZWFyY2gtc3VidHJlZSBwYXJlbnQgIlxcYGxpbmtfZGVzdGluYXRpb25cXCci
KSkKICAgICAgICAgICAgICh1cmwgKGlmIGRlc3QKICAgICAgICAgICAgICAgICAgICAgICh0cmVl
c2l0LW5vZGUtdGV4dCBkZXN0IHQpCiAgICAgICAgICAgICAgICAgICAgOzsgUmVmZXJlbmNlIGxp
bmtzOiByZXNvbHZlIHZpYSBsaW5rX2xhYmVsIG9yIGxpbmtfdGV4dC4KICAgICAgICAgICAgICAg
ICAgICAobGV0KiAoKGxhYmVsLW5vZGUgKHRyZWVzaXQtc2VhcmNoLXN1YnRyZWUKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCAiXFxgbGlua19sYWJlbFxcJyIp
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWwgKGlmIGxhYmVsLW5vZGUKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLXRyaW0gKHRyZWVzaXQtbm9k
ZS10ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBsYWJlbC1ub2RlIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJcXFsiICJcXF0iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAodHJlZXNpdC1ub2RlLXRleHQgbm9kZSB0KSkpKQogICAgICAgICAgICAgICAgICAgICAgKG9y
IChtYXJrZG93bi10cy0tcmVzb2x2ZS1saW5rLXJlZiBsYWJlbCkKICAgICAgICAgICAgICAgICAg
ICAgICAgICBsYWJlbCkpKSkpCiAgICAgICAgKG1hcmtkb3duLXRzLS1tYWtlLWxpbmstYnV0dG9u
CiAgICAgICAgICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkgKHRyZWVzaXQtbm9kZS1lbmQgbm9k
ZSkgdXJsKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS1hdXRvbGluayAobm9kZSBv
dmVycmlkZSBzdGFydCBlbmQgJnJlc3QgXykKICAiRm9udGlmeSBhdXRvbGluayBOT0RFIChVUkkg
b3IgZW1haWwpIGFzIGEgY2xpY2thYmxlIGJ1dHRvbi4KRm9yIGVtYWlsIGF1dG9saW5rcywgdGhl
IFVSTCBpcyBwcmVmaXhlZCB3aXRoIFwibWFpbHRvOlwiLgpBbmdsZSBicmFja2V0IGRlbGltaXRl
cnMgYXJlIGhpZGRlbiB3aGVuIG1hcmt1cCBpcyBoaWRkZW4uCk9WRVJSSURFLCBTVEFSVCwgYW5k
IEVORCBhcmUgcGFzc2VkIHRocm91Z2ggdG8KYHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRl
Jy4iCiAgKGxldCogKChub2RlLXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAg
ICAgIChub2RlLWVuZCAodHJlZXNpdC1ub2RlLWVuZCBub2RlKSkKICAgICAgICAgKGlubmVyIChi
dWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMKICAgICAgICAgICAgICAgICAoMSsgbm9kZS1z
dGFydCkgKDEtIG5vZGUtZW5kKSkpCiAgICAgICAgICh1cmwgKGlmIChzdHJpbmc9ICh0cmVlc2l0
LW5vZGUtdHlwZSBub2RlKSAiZW1haWxfYXV0b2xpbmsiKQogICAgICAgICAgICAgICAgICAoY29u
Y2F0ICJtYWlsdG86IiBpbm5lcikKICAgICAgICAgICAgICAgIGlubmVyKSkpCiAgICAodHJlZXNp
dC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUKICAgICBub2RlLXN0YXJ0IG5vZGUtZW5kICdtYXJrZG93
bi10cy1saW5rIG92ZXJyaWRlIHN0YXJ0IGVuZCkKICAgIChtYXJrZG93bi10cy0tbWFrZS1saW5r
LWJ1dHRvbiBub2RlLXN0YXJ0IG5vZGUtZW5kIHVybCkKICAgICh3aGVuIG1hcmtkb3duLXRzLWhp
ZGUtbWFya3VwCiAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSBub2RlLXN0YXJ0ICgxKyBub2RlLXN0
YXJ0KQogICAgICAgICAgICAgICAgICAgICAgICAgJ2ludmlzaWJsZSAnbWFya2Rvd24tdHMtLW1h
cmt1cCkKICAgICAgKHB1dC10ZXh0LXByb3BlcnR5ICgxLSBub2RlLWVuZCkgbm9kZS1lbmQKICAg
ICAgICAgICAgICAgICAgICAgICAgICdpbnZpc2libGUgJ21hcmtkb3duLXRzLS1tYXJrdXApKSkp
CgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktbGluay1yZWYtbGFiZWwgKG5vZGUgb3ZlcnJp
ZGUgc3RhcnQgZW5kICZyZXN0IF8pCiAgIkZvbnRpZnkgbGluayByZWZlcmVuY2UgZGVmaW5pdGlv
biBsYWJlbCBOT0RFIGFzIGEgY2xpY2thYmxlIGJ1dHRvbi4KVGhlIGJyYWNrZXRzIGFuZCBjb2xv
biBhcmUgaGlkZGVuIHdoZW4gbWFya3VwIGlzIGhpZGRlbi4KT1ZFUlJJREUsIFNUQVJULCBhbmQg
RU5EIGFyZSBwYXNzZWQgdGhyb3VnaCB0bwpgdHJlZXNpdC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUn
LiIKICAobGV0KiAoKG5vZGUtc3RhcnQgKHRyZWVzaXQtbm9kZS1zdGFydCBub2RlKSkKICAgICAg
ICAgKG5vZGUtZW5kICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAgICAocGFyZW50ICh0
cmVlc2l0LW5vZGUtcGFyZW50IG5vZGUpKQogICAgICAgICAoZGVzdC1ub2RlICh0cmVlc2l0LXNl
YXJjaC1zdWJ0cmVlIHBhcmVudCAiXFxgbGlua19kZXN0aW5hdGlvblxcJyIpKQogICAgICAgICAo
dXJsICh3aGVuIGRlc3Qtbm9kZSAodHJlZXNpdC1ub2RlLXRleHQgZGVzdC1ub2RlIHQpKSkpCiAg
ICA7OyBGb250aWZ5IHRoZSBsYWJlbCB0ZXh0IChpbnNpZGUgYnJhY2tldHMpLgogICAgKHRyZWVz
aXQtZm9udGlmeS13aXRoLW92ZXJyaWRlCiAgICAgKDErIG5vZGUtc3RhcnQpICgxLSBub2RlLWVu
ZCkKICAgICAnbWFya2Rvd24tdHMtbGluayBvdmVycmlkZSBzdGFydCBlbmQpCiAgICA7OyBNYWtl
IGl0IGEgY2xpY2thYmxlIGJ1dHRvbi4KICAgICh3aGVuIHVybAogICAgICAobWFya2Rvd24tdHMt
LW1ha2UtbGluay1idXR0b24gKDErIG5vZGUtc3RhcnQpICgxLSBub2RlLWVuZCkgdXJsKSkKICAg
IDs7IEhpZGUgIlsiIGJlZm9yZSBsYWJlbCBhbmQgIl06ICIgYmV0d2VlbiBsYWJlbCBhbmQgZGVz
dGluYXRpb24uCiAgICAod2hlbiBtYXJrZG93bi10cy1oaWRlLW1hcmt1cAogICAgICAocHV0LXRl
eHQtcHJvcGVydHkgbm9kZS1zdGFydCAoMSsgbm9kZS1zdGFydCkKICAgICAgICAgICAgICAgICAg
ICAgICAgICdpbnZpc2libGUgJ21hcmtkb3duLXRzLS1tYXJrdXApCiAgICAgIChsZXQgKChjb2xv
bi1lbmQgKGlmIGRlc3Qtbm9kZSAodHJlZXNpdC1ub2RlLXN0YXJ0IGRlc3Qtbm9kZSkKICAgICAg
ICAgICAgICAgICAgICAgICAgICgxKyBub2RlLWVuZCkpKSkKICAgICAgICAocHV0LXRleHQtcHJv
cGVydHkgKDEtIG5vZGUtZW5kKSBjb2xvbi1lbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAg
J2ludmlzaWJsZSAnbWFya2Rvd24tdHMtLW1hcmt1cCkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMt
LWZvbnRpZnktbGluay1yZWYtZGVzdGluYXRpb24gKG5vZGUgb3ZlcnJpZGUgc3RhcnQgZW5kCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVz
dCBfKQogICJGb250aWZ5IGxpbmsgcmVmZXJlbmNlIGRlc3RpbmF0aW9uIE5PREUgYW5kIGhpZGUg
d2hlbiBtYXJrdXAgaGlkZGVuLgpPVkVSUklERSwgU1RBUlQsIGFuZCBFTkQgYXJlIHBhc3NlZCB0
aHJvdWdoIHRvCmB0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVycmlkZScuIgogICh0cmVlc2l0LWZv
bnRpZnktd2l0aC1vdmVycmlkZQogICAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpICh0cmVlc2l0
LW5vZGUtZW5kIG5vZGUpCiAgICdtYXJrZG93bi10cy1saW5rLWRlc3RpbmF0aW9uIG92ZXJyaWRl
IHN0YXJ0IGVuZCkKICAod2hlbiBtYXJrZG93bi10cy1oaWRlLW1hcmt1cAogICAgKHB1dC10ZXh0
LXByb3BlcnR5ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkgKHRyZWVzaXQtbm9kZS1lbmQgbm9k
ZSkKICAgICAgICAgICAgICAgICAgICAgICAnaW52aXNpYmxlICdtYXJrZG93bi10cy0tbWFya3Vw
KSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWxhdGV4LWJsb2NrLXZhbGlkLXAgKG5vZGUpCiAgIlJl
dHVybiBub24tbmlsIGlmIGxhdGV4IGJsb2NrIE5PREUgaXMgd2l0aGluIGEgc2luZ2xlIGlubGlu
ZSBzY29wZS4KVGhlIGdsb2JhbCBpbmxpbmUgcGFyc2VyIGNhbiBjcmVhdGUgZmFsc2UgYGxhdGV4
X2Jsb2NrJyBtYXRjaGVzCnNwYW5uaW5nIGFjcm9zcyBwYXJhZ3JhcGggYm91bmRhcmllcy4gIENo
ZWNrIHRoYXQgdGhlIG9wZW5pbmcgYW5kCmNsb3NpbmcgZGVsaW1pdGVycyBzaGFyZSB0aGUgc2Ft
ZSBtYXJrZG93biBgaW5saW5lJyBhbmNlc3Rvci4iCiAgKGxldCAoKG5vZGUtc3RhcnQgKHRyZWVz
aXQtbm9kZS1zdGFydCBub2RlKSkKICAgICAgICAobm9kZS1lbmQgKDEtICh0cmVlc2l0LW5vZGUt
ZW5kIG5vZGUpKSkpCiAgICAod2hlbi1sZXQqICgobWQtc3RhcnQgKHRyZWVzaXQtbm9kZS1hdCBu
b2RlLXN0YXJ0ICdtYXJrZG93bikpCiAgICAgICAgICAgICAgICAobWQtZW5kICh0cmVlc2l0LW5v
ZGUtYXQgbm9kZS1lbmQgJ21hcmtkb3duKSkKICAgICAgICAgICAgICAgIChpbmxpbmUtc3RhcnQg
KHRyZWVzaXQtcGFyZW50LXVudGlsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZC1z
dGFydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAobikKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBuKSAiaW5s
aW5lIikpKSkKICAgICAgICAgICAgICAgIChpbmxpbmUtZW5kICh0cmVlc2l0LXBhcmVudC11bnRp
bAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kLWVuZAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChsYW1iZGEgKG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1
YWwgKHRyZWVzaXQtbm9kZS10eXBlIG4pICJpbmxpbmUiKSkpKSkKICAgICAgKGVxICh0cmVlc2l0
LW5vZGUtc3RhcnQgaW5saW5lLXN0YXJ0KQogICAgICAgICAgKHRyZWVzaXQtbm9kZS1zdGFydCBp
bmxpbmUtZW5kKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS1sYXRleC1ibG9jayAo
bm9kZSBvdmVycmlkZSBzdGFydCBlbmQgJnJlc3QgXykKICAiRm9udGlmeSBsYXRleCBibG9jayBO
T0RFIGFuZCBoaWRlIGl0cyBkZWxpbWl0ZXJzIHdoZW4gbWFya3VwIGlzIGhpZGRlbi4KU2tpcCBm
b250aWZpY2F0aW9uIGZvciBmYWxzZSBtYXRjaGVzIHRoYXQgc3BhbiBhY3Jvc3MgcGFyYWdyYXBo
IGJvdW5kYXJpZXMuCk9WRVJSSURFLCBTVEFSVCwgYW5kIEVORCBhcmUgcGFzc2VkIHRocm91Z2gg
dG8KYHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlJy4iCiAgKHdoZW4gKG1hcmtkb3duLXRz
LS1sYXRleC1ibG9jay12YWxpZC1wIG5vZGUpCiAgICAodHJlZXNpdC1mb250aWZ5LXdpdGgtb3Zl
cnJpZGUKICAgICAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpICh0cmVlc2l0LW5vZGUtZW5kIG5v
ZGUpCiAgICAgJ21hcmtkb3duLXRzLWxhdGV4IG92ZXJyaWRlIHN0YXJ0IGVuZCkKICAgICh3aGVu
IG1hcmtkb3duLXRzLWhpZGUtbWFya3VwCiAgICAgIChkb3RpbWVzIChpICh0cmVlc2l0LW5vZGUt
Y2hpbGQtY291bnQgbm9kZSkpCiAgICAgICAgKGxldCAoKGNoaWxkICh0cmVlc2l0LW5vZGUtY2hp
bGQgbm9kZSBpKSkpCiAgICAgICAgICAod2hlbiAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlIGNo
aWxkKSAibGF0ZXhfc3Bhbl9kZWxpbWl0ZXIiKQogICAgICAgICAgICAocHV0LXRleHQtcHJvcGVy
dHkgKHRyZWVzaXQtbm9kZS1zdGFydCBjaGlsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICh0cmVlc2l0LW5vZGUtZW5kIGNoaWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJ2ludmlzaWJsZSAnbWFya2Rvd24tdHMtLW1hcmt1cCkpKSkpKSkKCihkZWZ1biBtYXJrZG93
bi10cy0tZm9udGlmeS1iYWNrc2xhc2gtZXNjYXBlIChub2RlIG92ZXJyaWRlIHN0YXJ0IGVuZCAm
cmVzdCBfKQogICJGb250aWZ5IGJhY2tzbGFzaCBlc2NhcGUgTk9ERSwgaGlkaW5nIHRoZSBiYWNr
c2xhc2ggd2hlbiBtYXJrdXAgaXMgaGlkZGVuLgpTa2lwIGhpZGluZyBpbnNpZGUgYGxhdGV4X2Js
b2NrJyB3aGVyZSBiYWNrc2xhc2hlcyBhcmUgTGFUZVggc3ludGF4LgpPVkVSUklERSwgU1RBUlQs
IGFuZCBFTkQgYXJlIHBhc3NlZCB0aHJvdWdoIHRvCmB0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVy
cmlkZScuIgogIChsZXQgKChub2RlLXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAg
ICAgICAgKGluLWxhdGV4IChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUgKHRyZWVzaXQtbm9kZS1w
YXJlbnQgbm9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAibGF0ZXhfYmxvY2siKSkpCiAg
ICAodHJlZXNpdC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUKICAgICBub2RlLXN0YXJ0ICgxKyBub2Rl
LXN0YXJ0KQogICAgICdtYXJrZG93bi10cy1kZWxpbWl0ZXIgb3ZlcnJpZGUgc3RhcnQgZW5kKQog
ICAgKHdoZW4gKGFuZCBtYXJrZG93bi10cy1oaWRlLW1hcmt1cCAobm90IGluLWxhdGV4KSkKICAg
ICAgKHB1dC10ZXh0LXByb3BlcnR5IG5vZGUtc3RhcnQgKDErIG5vZGUtc3RhcnQpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAnaW52aXNpYmxlICdtYXJrZG93bi10cy0tbWFya3VwKSkpKQoKKGRl
ZnZhciBzZ21sLWNoYXItbmFtZXMpCihkZWNsYXJlLWZ1bmN0aW9uIG9yZy1lbnRpdHktZ2V0ICJv
cmcvb3JnLWVudGl0aWVzLmVsIikKCihkZWZ1biBtYXJrZG93bi10cy0tZGVjb2RlLWVudGl0eSAo
dGV4dCkKICAiRGVjb2RlIEhUTUwgZW50aXR5IFRFWFQgKGUuZy4sIFwiJmFtcDtcIikgdG8gaXRz
IGNoYXJhY3RlciBzdHJpbmcuClJldHVybiB0aGUgZGVjb2RlZCBzdHJpbmcsIG9yIG5pbCBpZiB0
aGUgZW50aXR5IGlzIHVua25vd24uIgogIChjb25kCiAgIDs7IE51bWVyaWMgaGV4ICYjeDFGNEE5
OwogICAoKHN0cmluZy1tYXRjaCAiXFxgJiN4XFwoW1s6eGRpZ2l0Ol1dK1xcKTtcXCciIHRleHQp
CiAgICAoY2hhci10by1zdHJpbmcgKHN0cmluZy10by1udW1iZXIgKG1hdGNoLXN0cmluZyAxIHRl
eHQpIDE2KSkpCiAgIDs7IE51bWVyaWMgZGVjaW1hbCAmIzEyMzsKICAgKChzdHJpbmctbWF0Y2gg
IlxcYCYjXFwoW1s6ZGlnaXQ6XV0rXFwpO1xcJyIgdGV4dCkKICAgIChjaGFyLXRvLXN0cmluZyAo
c3RyaW5nLXRvLW51bWJlciAobWF0Y2gtc3RyaW5nIDEgdGV4dCkpKSkKICAgOzsgTmFtZWQgJmFt
cDsgJmNvcHk7IHZpYSBvcmctZW50aXRpZXMsIGZhbGwgYmFjayB0byBzZ21sLWNoYXItbmFtZXMK
ICAgKChzdHJpbmctbWF0Y2ggIlxcYCZcXChbWzphbG51bTpdXStcXCk7XFwnIiB0ZXh0KQogICAg
KGxldCAoKG5hbWUgKG1hdGNoLXN0cmluZyAxIHRleHQpKSkKICAgICAgKHJlcXVpcmUgJ29yZy1l
bnRpdGllcykKICAgICAgKGlmLWxldCogKChlbnRyeSAob3JnLWVudGl0eS1nZXQgbmFtZSkpCiAg
ICAgICAgICAgICAgICAodXRmOCAobnRoIDYgZW50cnkpKSkKICAgICAgICAgIHV0ZjgKICAgICAg
ICAocmVxdWlyZSAnc2dtbC1tb2RlKQogICAgICAgICh3aGVuLWxldCogKChjb2RlIChzZXEtcG9z
aXRpb24gc2dtbC1jaGFyLW5hbWVzIG5hbWUgIydlcXVhbCkpKQogICAgICAgICAgKGNoYXItdG8t
c3RyaW5nIGNvZGUpKSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktZW50aXR5IChu
b2RlIG92ZXJyaWRlIHN0YXJ0IGVuZCAmcmVzdCBfKQogICJGb250aWZ5IGVudGl0eSBOT0RFIGFu
ZCBzaG93IGl0cyBkZWNvZGVkIHZhbHVlIHdoZW4gbWFya3VwIGlzIGhpZGRlbi4KT1ZFUlJJREUs
IFNUQVJULCBhbmQgRU5EIGFyZSBwYXNzZWQgdGhyb3VnaCB0bwpgdHJlZXNpdC1mb250aWZ5LXdp
dGgtb3ZlcnJpZGUnLiIKICAobGV0ICgobm9kZS1zdGFydCAodHJlZXNpdC1ub2RlLXN0YXJ0IG5v
ZGUpKQogICAgICAgIChub2RlLWVuZCAodHJlZXNpdC1ub2RlLWVuZCBub2RlKSkKICAgICAgICAo
ZmFjZSAoaWYgKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBub2RlKSAiZW50aXR5X3JlZmVyZW5j
ZSIpCiAgICAgICAgICAgICAgICAgICdtYXJrZG93bi10cy1lbnRpdHktcmVmZXJlbmNlCiAgICAg
ICAgICAgICAgICAnbWFya2Rvd24tdHMtbnVtZXJpYy1jaGFyYWN0ZXItcmVmZXJlbmNlKSkpCiAg
ICAodHJlZXNpdC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUgbm9kZS1zdGFydCBub2RlLWVuZCBmYWNl
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgc3RhcnQgZW5kKQog
ICAgKGlmIG1hcmtkb3duLXRzLWhpZGUtbWFya3VwCiAgICAgICAgKHdoZW4tbGV0KiAoKGRlY29k
ZWQgKG1hcmtkb3duLXRzLS1kZWNvZGUtZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICh0cmVlc2l0LW5vZGUtdGV4dCBub2RlIHQpKSkKICAgICAgICAgICAgICAgICAgICAoKGNo
YXItZGlzcGxheWFibGUtcCAoYXJlZiBkZWNvZGVkIDApKSkpCiAgICAgICAgICAocHV0LXRleHQt
cHJvcGVydHkgbm9kZS1zdGFydCBub2RlLWVuZCAnZGlzcGxheSBkZWNvZGVkKSkKICAgICAgKHJl
bW92ZS10ZXh0LXByb3BlcnRpZXMgbm9kZS1zdGFydCBub2RlLWVuZCAnKGRpc3BsYXkgbmlsKSkp
KSkKCihkZWZ1biBtYXJrZG93bi10cy0tcmVzb2x2ZS1kaXNwbGF5LXZhbHVlICh2YWwpCiAgIlJl
c29sdmUgVkFMLCBhIGNvbnMgKFBSRUZFUlJFRCAuIEZBTExCQUNLKSwgdG8gYSBkaXNwbGF5YWJs
ZSB2YWx1ZS4KUFJFRkVSUkVEIGFuZCBGQUxMQkFDSyBjYW4gYmUgYSBjaGFyYWN0ZXIgb3IgYSBz
dHJpbmcuICBSZXR1cm4gUFJFRkVSUkVECmlmIGl0LCBvciBpdHMgZmlyc3QgY2hhcmFjdGVyLCBp
cyBgY2hhci1kaXNwbGF5YWJsZS1wJywgb3RoZXJ3aXNlIHJldHVybgpGQUxMQkFDSy4KSWYgVkFM
IGlzIG5vdCBhIGNvbnMgb3IgaXMgbmlsLCByZXR1cm4gVkFMLiIKICAoaWYgKGNvbnNwIHZhbCkK
ICAgICAgKGxldCogKChwcmVmZXJyZWQgKGNhciB2YWwpKQogICAgICAgICAgICAgKGNoIChpZiAo
Y2hhcmFjdGVycCBwcmVmZXJyZWQpCiAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZAogICAg
ICAgICAgICAgICAgICAgKGFyZWYgcHJlZmVycmVkIDApKSkpCiAgICAgICAgKGlmIChjaGFyLWRp
c3BsYXlhYmxlLXAgY2gpCiAgICAgICAgICAgIChjYXIgdmFsKQogICAgICAgICAgKGNkciB2YWwp
KSkKICAgIHZhbCkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWxpc3QtaXRlbS1kZXB0aCAobm9kZSkK
ICAiQ29tcHV0ZSB0aGUgZGVwdGggb2YgbGlzdCBOT0RFIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnRz
LgpOT0RFIGNhbiBiZSBhIGxpc3QsIGxpc3RfaXRlbSwgb3Igb25lIG9mIHRoZSBsaXN0X21hcmtl
cl8ncy4KSWYgTk9ERSBpcyBub3QgaW4gYSBsaXN0LCByZXR1cm4gLTEuIgogIChsZXQgKChkZXB0
aCAtMSkpCiAgICAod2hpbGUgKGFuZCBub2RlCiAgICAgICAgICAgICAgICAobm90IChlcXVhbCAo
dHJlZXNpdC1ub2RlLXR5cGUgbm9kZSkgInNlY3Rpb24iKSkpCiAgICAgICh3aGVuIChlcXVhbCAo
dHJlZXNpdC1ub2RlLXR5cGUgbm9kZSkgImxpc3QiKQogICAgICAgIChzZXRxIGRlcHRoICgxKyBk
ZXB0aCkpKQogICAgICAoc2V0cSBub2RlICh0cmVlc2l0LW5vZGUtcGFyZW50IG5vZGUpKSkKICAg
IGRlcHRoKSkKCihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS11bm9yZGVyZWQtbGlzdC1tYXJr
ZXIgKG5vZGUgb3ZlcnJpZGUgc3RhcnQgZW5kICZyZXN0IF8pCiAgIkZvbnRpZnkgdW5vcmRlcmVk
IGxpc3QgbWFya2VyIE5PREUsIHNob3cgYSBzeW1ib2wgd2hlbiBtYXJrdXAgaXMgaGlkZGVuLgpP
VkVSUklERSwgU1RBUlQsIGFuZCBFTkQgYXJlIHBhc3NlZCB0aHJvdWdoIHRvCmB0cmVlc2l0LWZv
bnRpZnktd2l0aC1vdmVycmlkZScuIgogIChsZXQqICgobm9kZS1zdGFydCAodHJlZXNpdC1ub2Rl
LXN0YXJ0IG5vZGUpKQogICAgICAgICAobm9kZS1lbmQgKHRyZWVzaXQtbm9kZS1lbmQgbm9kZSkp
CiAgICAgICAgIChmYWNlICdtYXJrZG93bi10cy1saXN0LW1hcmtlcikpCiAgICAodHJlZXNpdC1m
b250aWZ5LXdpdGgtb3ZlcnJpZGUgbm9kZS1zdGFydCBub2RlLWVuZCBmYWNlCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgc3RhcnQgZW5kKQogICAgKGNvbmQgKG1h
cmtkb3duLXRzLWhpZGUtbWFya3VwCiAgICAgICAgICAgKGxldCogKChkZXB0aCAobWFya2Rvd24t
dHMtLWxpc3QtaXRlbS1kZXB0aCBub2RlKSkKICAgICAgICAgICAgICAgICAgKHZhbHVlIChpZiBt
YXJrZG93bi10cy11bm9yZGVyZWQtbGlzdC1tYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAobnRoIChtb2QgZGVwdGggKGxlbmd0aCBtYXJrZG93bi10cy11bm9yZGVyZWQtbGlzdC1t
YXJrZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtdW5v
cmRlcmVkLWxpc3QtbWFya2VyKQogICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwpKQogICAg
ICAgICAgICAgICAgICAoZGlzcGxheS1zcGVjIChtYXJrZG93bi10cy0tcmVzb2x2ZS1kaXNwbGF5
LXZhbHVlIHZhbHVlKSkpCiAgICAgICAgICAgICAocHV0LXRleHQtcHJvcGVydHkgbm9kZS1zdGFy
dCBub2RlLWVuZCAnZGlzcGxheSBkaXNwbGF5LXNwZWMpKSkKICAgICAgICAgICh0CiAgICAgICAg
ICAgKHJlbW92ZS10ZXh0LXByb3BlcnRpZXMgbm9kZS1zdGFydCBub2RlLWVuZCAnKGRpc3BsYXkg
bmlsKSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktY2hlY2tib3ggKG5vZGUgb3Zl
cnJpZGUgc3RhcnQgZW5kICZyZXN0IF8pCiAgIkZvbnRpZnkgdGFzayBsaXN0IGNoZWNrYm94IE5P
REUsIHNob3cgYSBVbmljb2RlIHN5bWJvbCB3aGVuIG1hcmt1cCBpcyBoaWRkZW4uCk9WRVJSSURF
LCBTVEFSVCwgYW5kIEVORCBhcmUgcGFzc2VkIHRocm91Z2ggdG8KYHRyZWVzaXQtZm9udGlmeS13
aXRoLW92ZXJyaWRlJy4iCiAgKGxldCogKChub2RlLXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQg
bm9kZSkpCiAgICAgICAgIChub2RlLWVuZCAodHJlZXNpdC1ub2RlLWVuZCBub2RlKSkKICAgICAg
ICAgKGNoZWNrZWQgKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBub2RlKSAidGFza19saXN0X21h
cmtlcl9jaGVja2VkIikpCiAgICAgICAgIChmYWNlIChpZiBjaGVja2VkICdtYXJrZG93bi10cy10
YXNrLWNoZWNrZWQKICAgICAgICAgICAgICAgICAnbWFya2Rvd24tdHMtdGFzay11bmNoZWNrZWQp
KQogICAgICAgICAodmFsdWUgKGlmIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICBtYXJrZG93
bi10cy1jaGVja2VkLWNoZWNrYm94CiAgICAgICAgICAgICAgICAgIG1hcmtkb3duLXRzLXVuY2hl
Y2tlZC1jaGVja2JveCkpCiAgICAgICAgIChyZXBsYWNlbWVudAogICAgICAgICAgKGNvbmQgKChl
cSB2YWx1ZSAnaWNvbikKICAgICAgICAgICAgICAgICAoaWNvbi1zdHJpbmcgKGlmIGNoZWNrZWQK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXJrZG93bi10cy1jaGVja2VkLWNo
ZWNrYm94LWljb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFya2Rvd24tdHMt
dW5jaGVja2VkLWNoZWNrYm94LWljb24pKSkKICAgICAgICAgICAgICAgICh0IChtYXJrZG93bi10
cy0tcmVzb2x2ZS1kaXNwbGF5LXZhbHVlIHZhbHVlKSkpKQogICAgICAgICA7OyBJZiBgaWNvbi1z
dHJpbmcnIHJldHVybmVkIGFuIGltYWdlLCBpdHMgYGRpc3BsYXknIHByb3BlcnR5CiAgICAgICAg
IDs7IG9uIGNoYXIgMCBob2xkcyB0aGUgYWN0dWFsIGltYWdlIHNwZWM7IG5lc3RlZCBgZGlzcGxh
eScKICAgICAgICAgOzsgcHJvcHMgYXJlIG5vdCBob25vcmVkIHdoZW4gYSBzdHJpbmcgaXMgdGhl
IHZhbHVlIG9mIGEKICAgICAgICAgOzsgYGRpc3BsYXknIHRleHQtcHJvcGVydHksIHNvIGFwcGx5
IHRoZSBzcGVjIGRpcmVjdGx5LgogICAgICAgICAoZGlzcGxheS1zcGVjCiAgICAgICAgICAob3Ig
KGFuZCAoZXEgdmFsdWUgJ2ljb24pIHJlcGxhY2VtZW50CiAgICAgICAgICAgICAgICAgICAoZ2V0
LXRleHQtcHJvcGVydHkgMCAnZGlzcGxheSByZXBsYWNlbWVudCkpCiAgICAgICAgICAgICAgcmVw
bGFjZW1lbnQpKSkKICAgICh0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVycmlkZSBub2RlLXN0YXJ0
IG5vZGUtZW5kIGZhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlk
ZSBzdGFydCBlbmQpCiAgICAoaWYgKGFuZCBtYXJrZG93bi10cy1oaWRlLW1hcmt1cCByZXBsYWNl
bWVudAogICAgICAgICAgICAgKG9yIChlcSB2YWx1ZSAnaWNvbikKICAgICAgICAgICAgICAgICAo
Y2hhci1kaXNwbGF5YWJsZS1wIChhcmVmIHJlcGxhY2VtZW50IDApKSkpCiAgICAgICAgKHB1dC10
ZXh0LXByb3BlcnR5IG5vZGUtc3RhcnQgbm9kZS1lbmQgJ2Rpc3BsYXkgZGlzcGxheS1zcGVjKQog
ICAgICAocmVtb3ZlLXRleHQtcHJvcGVydGllcyBub2RlLXN0YXJ0IG5vZGUtZW5kICcoZGlzcGxh
eSBuaWwpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1mb250aWZ5LWhhcmQtbGluZS1icmVhayAo
bm9kZSBvdmVycmlkZSBzdGFydCBlbmQgJnJlc3QgXykKICAiRm9udGlmeSBoYXJkIGxpbmUgYnJl
YWsgTk9ERTsgc2hvdyBhIFVuaWNvZGUgc3ltYm9sIHdoZW4gbWFya3VwIGlzIGhpZGRlbi4KQSBi
YWNrc2xhc2ggYnJlYWsgZ2V0cyBgbWFya2Rvd24tdHMtaGFyZC1saW5lLWJyZWFrLWJhY2tzbGFz
aCcgKG9yIGl0cwpgLWhpZGRlbicgdmFyaWFudCB3aGVuIG1hcmt1cCBpcyBoaWRkZW4pOyBhIHRy
YWlsaW5nLXNwYWNlcyBicmVhayBnZXRzCmBtYXJrZG93bi10cy1oYXJkLWxpbmUtYnJlYWstc3Bh
Y2UnIChvciBgLWhpZGRlbicpLiAgV2hlbiBoaWRkZW4sIGEKYmFja3NsYXNoIGJyZWFrIGlzIHJl
cGxhY2VkIGJ5IGEgc2luZ2xlIGBtYXJrZG93bi10cy1oYXJkLWxpbmUtYnJlYWsnCmdseXBoOyBh
IHRyYWlsaW5nLXNwYWNlcyBicmVhayByZXBsYWNlcyBlYWNoIHNwYWNlIHdpdGggdGhlIGdseXBo
LCBzbyB0aGUgcnVuCm9mIHBpbGNyb3dzIGZpbGxzIHRoZSBsaW5lIHVwIHRvIHRoZSBuZXdsaW5l
LgpJZiBgbWFya2Rvd24tdHMtaGFyZC1saW5lLWJyZWFrLWJhY2tzbGFzaCcgb3IKYG1hcmtkb3du
LXRzLWhhcmQtbGluZS1icmVhay1zcGFjZScgYXJlIHRoZSBzeW1ib2wgYGhpZGUnLCBoaWRlIHRo
ZQptYXJrdXAgZW50aXJlbHkuCk9WRVJSSURFLCBTVEFSVCwgYW5kIEVORCBhcmUgcGFzc2VkIHRo
cm91Z2ggdG8KYHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlJy4iCiAgKGxldCogKChub2Rl
LXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAgICAgIChub2RlLWVuZCAgICh0
cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAgICAodGV4dCAgICAgICAodHJlZXNpdC1ub2Rl
LXRleHQgbm9kZSB0KSkKICAgICAgICAgKGJhY2tzbGFzaCAgKGFuZCAoPiAobGVuZ3RoIHRleHQp
IDApIChlcSAoYXJlZiB0ZXh0IDApID9cXCkpKQogICAgICAgICA7OyBEZXRlcm1pbmUgdGhlIGFj
dHVhbCByYW5nZSB0byBmb250aWZ5IGFuZCByZXBsYWNlLiAgVGhlCiAgICAgICAgIDs7IGhhcmRf
bGluZV9icmVhayBub2RlIG1heSBub3QgY292ZXIgdGhlIGZ1bGwgcnVuIG9mIHRyYWlsaW5nCiAg
ICAgICAgIDs7IHNwYWNlcywgc28gd2FsayBiYWNrIGZyb20gZW5kLW9mLWxpbmUgb3Vyc2VsdmVz
IGZvciB0aGUKICAgICAgICAgOzsgc3BhY2VzIHZhcmlhbnQuCiAgICAgICAgIChyZWdpb24gICAg
IChpZiBiYWNrc2xhc2gKICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zIG5vZGUtc3RhcnQK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoYW5kICg+IG5vZGUtZW5kIG5vZGUt
c3RhcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEgKGNoYXIt
YmVmb3JlIG5vZGUtZW5kKSA/XG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICgxLSBub2RlLWVuZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS1lbmQp
KQogICAgICAgICAgICAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAg
ICAgICAgICAgKGdvdG8tY2hhciBub2RlLXN0YXJ0KQogICAgICAgICAgICAgICAgICAgICAgICAg
KGxldCAoKGVvbCAobGluZS1lbmQtcG9zaXRpb24pKSkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGNvbnMgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGdvdG8tY2hhciBlb2wpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNr
aXAtY2hhcnMtYmFja3dhcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAi
IChsaW5lLWJlZ2lubmluZy1wb3NpdGlvbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKHBvaW50KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW9sKSkpKSkK
ICAgICAgICAgKHJlZ2lvbi1zdGFydCAoY2FyIHJlZ2lvbikpCiAgICAgICAgIChyZWdpb24tZW5k
ICAgKGNkciByZWdpb24pKQogICAgICAgICAoZmFjZSAgICAgICAoY29uZAogICAgICAgICAgICAg
ICAgICAgICAgKChhbmQgYmFja3NsYXNoIG1hcmtkb3duLXRzLWhpZGUtbWFya3VwKQogICAgICAg
ICAgICAgICAgICAgICAgICdtYXJrZG93bi10cy1oYXJkLWxpbmUtYnJlYWstYmFja3NsYXNoLWhp
ZGRlbikKICAgICAgICAgICAgICAgICAgICAgIChiYWNrc2xhc2ggJ21hcmtkb3duLXRzLWhhcmQt
bGluZS1icmVhay1iYWNrc2xhc2gpCiAgICAgICAgICAgICAgICAgICAgICAobWFya2Rvd24tdHMt
aGlkZS1tYXJrdXAKICAgICAgICAgICAgICAgICAgICAgICAnbWFya2Rvd24tdHMtaGFyZC1saW5l
LWJyZWFrLXNwYWNlLWhpZGRlbikKICAgICAgICAgICAgICAgICAgICAgICh0ICdtYXJrZG93bi10
cy1oYXJkLWxpbmUtYnJlYWstc3BhY2UpKSkpCiAgICAodHJlZXNpdC1mb250aWZ5LXdpdGgtb3Zl
cnJpZGUgcmVnaW9uLXN0YXJ0IHJlZ2lvbi1lbmQgZmFjZQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG92ZXJyaWRlIHN0YXJ0IGVuZCkKICAgIDs7IEFsd2F5cyBzdGFydCBieSBj
bGVhcmluZyBhbnkgc3RhbGUgYGRpc3BsYXknIHByb3BlcnR5LiAgV2UgbmV2ZXIKICAgIDs7IHNw
YW4gdGhlIHRyYWlsaW5nIG5ld2xpbmUgd2l0aCBgZGlzcGxheScgKGl0IGNvbmZ1c2VzCiAgICA7
OyByZWRpc3BsYXkncyBjdXJzb3IgcGxhY2VtZW50KSwgYW5kIHdlIG9ubHkgcGFpbnQgYSBzaW5n
bGUKICAgIDs7IGNvbWJpbmVkIHN0cmluZyBvbnRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhl
IHJ1biwgbGVhdmluZwogICAgOzsgdGhlIHJlc3Qgb2YgdGhlIG1hcmt1cCBhbG9uZS4KICAgIChy
ZW1vdmUtdGV4dC1wcm9wZXJ0aWVzIHJlZ2lvbi1zdGFydCByZWdpb24tZW5kICcoZGlzcGxheSBu
aWwpKQogICAgKHdoZW4gbWFya2Rvd24tdHMtaGlkZS1tYXJrdXAKICAgICAgKGxldCogKChzcGVj
IChpZiBiYWNrc2xhc2gKICAgICAgICAgICAgICAgICAgICAgICAobWFya2Rvd24tdHMtLXJlc29s
dmUtZGlzcGxheS12YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy1oYXJk
LWxpbmUtYnJlYWstYmFja3NsYXNoKQogICAgICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy1o
YXJkLWxpbmUtYnJlYWstc3BhY2UpKQogICAgICAgICAgICAgKHN0ciAoY29uZAogICAgICAgICAg
ICAgICAgICAgKChudWxsIHNwZWMpIG5pbCkKICAgICAgICAgICAgICAgICAgICgoY2hhcmFjdGVy
cCBzcGVjKSAoY2hhci10by1zdHJpbmcgc3BlYykpCiAgICAgICAgICAgICAgICAgICAoKHN0cmlu
Z3Agc3BlYykgc3BlYykKICAgICAgICAgICAgICAgICAgICgoZnVuY3Rpb25wIHNwZWMpCiAgICAg
ICAgICAgICAgICAgICAgKGZ1bmNhbGwgc3BlYyAoLSByZWdpb24tZW5kIHJlZ2lvbi1zdGFydCkp
KSkpKQogICAgICAgIChpZiAoZXEgc3BlYyAnaGlkZSkKICAgICAgICAgICAgKHB1dC10ZXh0LXBy
b3BlcnR5IHJlZ2lvbi1zdGFydCByZWdpb24tZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAnaW52aXNpYmxlICdtYXJrZG93bi10cy0tbWFya3VwKQogICAgICAgICAgKHdoZW4gKGFu
ZCAoc3RyaW5ncCBzdHIpCiAgICAgICAgICAgICAgICAgICAgICg+IChsZW5ndGggc3RyKSAwKQog
ICAgICAgICAgICAgICAgICAgICAoY2hhci1kaXNwbGF5YWJsZS1wIChhcmVmIHN0ciAwKSkpCiAg
ICAgICAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSByZWdpb24tc3RhcnQgKDErIHJlZ2lvbi1zdGFy
dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5IHN0cikKICAgICAgICAg
ICAgOzsgRm9yIHRoZSB0cmFpbGluZy1zcGFjZXMgdmFyaWFudCwgaGlkZSB0aGUgcmVtYWluaW5n
CiAgICAgICAgICAgIDs7IHNwYWNlcyBpbiB0aGUgcnVuIHNvIHRoZSBsaW5lIGRvZXNuJ3QgZW5k
IHdpdGggbGVmdG92ZXIKICAgICAgICAgICAgOzsgd2hpdGVzcGFjZSBhZnRlciB0aGUgc3Vic3Rp
dHV0ZWQgZ2x5cGguICBFYWNoIHBvc2l0aW9uCiAgICAgICAgICAgIDs7IGdldHMgaXRzIG93biBl
bXB0eS1zdHJpbmcgYGRpc3BsYXknIHNvIGN1cnNvciBwbGFjZW1lbnQKICAgICAgICAgICAgOzsg
c3RheXMgdW5hbWJpZ3VvdXMuCiAgICAgICAgICAgICh1bmxlc3MgYmFja3NsYXNoCiAgICAgICAg
ICAgICAgKGxldCAoKGkgKDErIHJlZ2lvbi1zdGFydCkpKQogICAgICAgICAgICAgICAgKHdoaWxl
ICg8IGkgcmVnaW9uLWVuZCkKICAgICAgICAgICAgICAgICAgKHB1dC10ZXh0LXByb3BlcnR5IGkg
KDErIGkpICdkaXNwbGF5ICIiKQogICAgICAgICAgICAgICAgICAoc2V0cSBpICgxKyBpKSkpKSkp
KSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS10aGVtYXRpYy1icmVhayAobm9kZSBv
dmVycmlkZSBzdGFydCBlbmQgJnJlc3QgXykKICAiRm9udGlmeSB0aGVtYXRpYyBicmVhayBOT0RF
IGFuZCBzaG93IGEgbGluZSB3aGVuIG1hcmt1cCBpcyBoaWRkZW4uCk9WRVJSSURFLCBTVEFSVCwg
YW5kIEVORCBhcmUgcGFzc2VkIHRocm91Z2ggdG8KYHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJy
aWRlJy4iCiAgKGxldCAoKG5vZGUtc3RhcnQgKHRyZWVzaXQtbm9kZS1zdGFydCBub2RlKSkKICAg
ICAgICAobm9kZS1lbmQgKHRyZWVzaXQtbm9kZS1lbmQgbm9kZSkpKQogICAgKHRyZWVzaXQtZm9u
dGlmeS13aXRoLW92ZXJyaWRlIG5vZGUtc3RhcnQgbm9kZS1lbmQKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAnbWFya2Rvd24tdHMtdGhlbWF0aWMtYnJlYWsKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZSBzdGFydCBlbmQpCiAgICAoaWYgbWFya2Rv
d24tdHMtaGlkZS1tYXJrdXAKICAgICAgICAoY29uZAogICAgICAgICAoKGFuZCAoZGlzcGxheS1z
dXBwb3J0cy1mYWNlLWF0dHJpYnV0ZXMtcCAnKDpleHRlbmQgdCkpCiAgICAgICAgICAgICAgIChm
YWNlLWF0dHJpYnV0ZSAnbWFya2Rvd24tdHMtdGhlbWF0aWMtYnJlYWsKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIDpleHRlbmQgbmlsICdkZWZhdWx0KSkKICAgICAgICAgIChwdXQtdGV4
dC1wcm9wZXJ0eSBub2RlLXN0YXJ0IG5vZGUtZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJ2Rpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAiXG4i
ICdmYWNlICcoOmV4dGVuZCB0IDp1bmRlcmxpbmUgdCkpKSkKICAgICAgICAgKHQKICAgICAgICAg
ICh3aGVuLWxldCogKChjaGFyIChtYXJrZG93bi10cy0tcmVzb2x2ZS1kaXNwbGF5LXZhbHVlCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtdGhlbWF0aWMtYnJlYWstY2hh
cmFjdGVyKSkKICAgICAgICAgICAgICAgICAgICAgIChfIChjaGFyLWRpc3BsYXlhYmxlLXAgY2hh
cikpKQogICAgICAgICAgICAobGV0KiAoKGNvbCAoc2F2ZS1leGN1cnNpb24gKGdvdG8tY2hhciBu
b2RlLXN0YXJ0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJl
bnQtY29sdW1uKSkpCiAgICAgICAgICAgICAgICAgICAoc3Bhbi1sZW5ndGggKG1heCAxMiAoLSAo
d2luZG93LWJvZHktd2lkdGgpIGNvbCkpKSkKICAgICAgICAgICAgICAocHV0LXRleHQtcHJvcGVy
dHkgbm9kZS1zdGFydCBub2RlLWVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn
ZGlzcGxheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0CiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZS1zdHJpbmcgc3Bhbi1sZW5ndGggY2hhcikK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIpKSkpKSkKICAgICAgKHJlbW92
ZS10ZXh0LXByb3BlcnRpZXMgbm9kZS1zdGFydCBub2RlLWVuZCAnKGRpc3BsYXkgbmlsKSkpKSkK
CihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS1jb2RlLWJsb2NrIChub2RlIF9vdmVycmlkZSBf
c3RhcnQgX2VuZCAmcmVzdCBfKQogICJGb250aWZ5IGNvZGUgYmxvY2sgY29udGVudCBOT0RFIHdp
dGggYSBiYWNrZ3JvdW5kIG92ZXJsYXkuClVzZSBgbWFya2Rvd24tdHMtY29kZS1ibG9jay1tYXJr
dXAtaGlkZGVuJyB3aGVuIG1hcmt1cCBpcyBoaWRkZW4sCmBtYXJrZG93bi10cy1jb2RlLWJsb2Nr
JyBvdGhlcndpc2UuICBVc2UgYW4gb3ZlcmxheSBzbyB0aGUKYmFja2dyb3VuZCBsYXllcnMgaXRz
ZWxmIGJlaGluZCBsYW5ndWFnZS1zcGVjaWZpYyBmb250aWZpY2F0aW9uLgpUaGUgb3ZlcmxheSBh
bHNvIHN0b3JlcyB0aGUgY29kZSBibG9jayBsYW5ndWFnZSBhbmQgbW9kZSBhcwpwcm9wZXJ0aWVz
IGBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWxhbmd1YWdlJyBhbmQKYG1hcmtkb3duLXRzLWNvZGUt
YmxvY2stbW9kZScsIGFjY2Vzc2libGUgdmlhCmBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWxhbmd1
YWdlLWF0Jy4iCiAgKGxldCogKChub2RlLXN0YXJ0IChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAg
ICAgICAgICAgICAgIChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1zdGFydCBub2RlKSkKICAgICAg
ICAgICAgICAgICAgICAgICAobGluZS1iZWdpbm5pbmctcG9zaXRpb24pKSkKICAgICAgICAgKG5v
ZGUtZW5kIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyICh0
cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAgICAgICAgICAgICAgICAoc2tpcC1jaGFycy1i
YWNrd2FyZCAiIFx0IikKICAgICAgICAgICAgICAgICAgICAgKHBvaW50KSkpCiAgICAgICAgIChm
YWNlIChpZiBtYXJrZG93bi10cy1oaWRlLW1hcmt1cAogICAgICAgICAgICAgICAgICAgJ21hcmtk
b3duLXRzLWNvZGUtYmxvY2stbWFya3VwLWhpZGRlbgogICAgICAgICAgICAgICAgICdtYXJrZG93
bi10cy1jb2RlLWJsb2NrKSkKICAgICAgICAgKGxhbmcgKG1hcmtkb3duLXRzLS1sYW5ndWFnZS1h
dC1ub2RlIG5vZGUpKQogICAgICAgICAobW9kZSAod2hlbiBsYW5nCiAgICAgICAgICAgICAgICAg
KG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLWxhbmd1YWdlLW1vZGUgbGFuZykpKQogICAgICAgICAo
ZXhpc3RpbmcgKHNlcS1maW5kIChsYW1iZGEgKG92KQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKG92ZXJsYXktZ2V0IG92ICdtYXJrZG93bi10cy1jb2RlLWJsb2NrKSkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAob3ZlcmxheXMtYXQgbm9kZS1zdGFydCkpKSkKICAgIChpZiBl
eGlzdGluZwogICAgICAgIChwcm9nbgogICAgICAgICAgKG1vdmUtb3ZlcmxheSBleGlzdGluZyBu
b2RlLXN0YXJ0IG5vZGUtZW5kKQogICAgICAgICAgKG92ZXJsYXktcHV0IGV4aXN0aW5nICdmYWNl
IGZhY2UpCiAgICAgICAgICAob3ZlcmxheS1wdXQgZXhpc3RpbmcgJ21hcmtkb3duLXRzLWNvZGUt
YmxvY2stbGFuZ3VhZ2UgbGFuZykKICAgICAgICAgIChvdmVybGF5LXB1dCBleGlzdGluZyAnbWFy
a2Rvd24tdHMtY29kZS1ibG9jay1tb2RlIG1vZGUpKQogICAgICAobGV0ICgob3YgKG1ha2Utb3Zl
cmxheSBub2RlLXN0YXJ0IG5vZGUtZW5kIG5pbCB0IG5pbCkpKQogICAgICAgIDs7IE1hcmtlcnMg
bmVlZCB0byBiZSBzZXQgb25seSBvbmNlLgogICAgICAgIChvdmVybGF5LXB1dCBvdiAnbWFya2Rv
d24tdHMtY29kZS1iZWctbWFya2VyIChzZXQtbWFya2VyIChtYWtlLW1hcmtlcikKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
b2RlLXN0YXJ0KSkKICAgICAgICAob3ZlcmxheS1wdXQgb3YgJ21hcmtkb3duLXRzLWNvZGUtZW5k
LW1hcmtlciAoc2V0LW1hcmtlciAobWFrZS1tYXJrZXIpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS1lbmQpKQogICAg
ICAgIChvdmVybGF5LXB1dCBvdiAnbWFya2Rvd24tdHMtY29kZS1ibG9jayB0KQogICAgICAgIChv
dmVybGF5LXB1dCBvdiAnZmFjZSBmYWNlKQogICAgICAgIChvdmVybGF5LXB1dCBvdiAncHJpb3Jp
dHkgJyhuaWwgLiAxMCkpCiAgICAgICAgKG92ZXJsYXktcHV0IG92ICdtYXJrZG93bi10cy1jb2Rl
LWJsb2NrLWxhbmd1YWdlIGxhbmcpCiAgICAgICAgKG92ZXJsYXktcHV0IG92ICdtYXJrZG93bi10
cy1jb2RlLWJsb2NrLW1vZGUgbW9kZSkKICAgICAgICAob3ZlcmxheS1wdXQgb3YgJ2V2YXBvcmF0
ZSB0KSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy1hdC1jb2RlLWJsb2NrLXAgKCZvcHRpb25hbCBw
b3MpCiAgIlJldHVybiBub24gbmlsIGlmIHBvaW50IGlzIGluIGEgY29kZSBibG9jay4KSWYgUE9T
IGlzIG5pbCwgdXNlIHBvaW50LiIKICAoZ2V0LWNoYXItcHJvcGVydHkgKG9yIHBvcyAocG9pbnQp
KSAnbWFya2Rvd24tdHMtY29kZS1ibG9jaykpCgooZGVmdW4gbWFya2Rvd24tdHMtY29kZS1ibG9j
ay1sYW5ndWFnZS1hdCAoJm9wdGlvbmFsIHBvcykKICAiUmV0dXJuIHRoZSBsYW5ndWFnZSBzeW1i
b2wgb2YgdGhlIGNvZGUgYmxvY2sgYXQgUE9TLgpJZiBQT1MgaXMgbmlsLCB1c2UgcG9pbnQuICBS
ZXR1cm5zIG5pbCBpZiBQT1MgaXMgbm90IGluc2lkZSBhIGZlbmNlZApjb2RlIGJsb2NrLiAgVGhp
cyB3b3JrcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSBndWVzdCB0cmVlLXNpdHRlciBwYXJzZXIK
aXMgYWN0aXZlLCBzaW5jZSB0aGUgbGFuZ3VhZ2UgaXMgc3RvcmVkIG9uIHRoZSBjb2RlIGJsb2Nr
IG92ZXJsYXkgYnkgdGhlCmhvc3QgcGFyc2VyJ3MgZm9udGlmaWNhdGlvbi4iCiAgKGdldC1jaGFy
LXByb3BlcnR5IChvciBwb3MgKHBvaW50KSkgJ21hcmtkb3duLXRzLWNvZGUtYmxvY2stbGFuZ3Vh
Z2UpKQoKKGRlZnVuIG1hcmtkb3duLXRzLWNvZGUtYmxvY2stbW9kZS1hdCAoJm9wdGlvbmFsIHBv
cykKICAiUmV0dXJuIHRoZSBtYWpvciBtb2RlIGZvciB0aGUgY29kZSBibG9jayBhdCBQT1MuCklm
IFBPUyBpcyBuaWwsIHVzZSBwb2ludC4gIFJldHVybnMgbmlsIGlmIFBPUyBpcyBub3QgaW5zaWRl
IGEgZmVuY2VkCmNvZGUgYmxvY2sgb3IgaWYgdGhlIGxhbmd1YWdlIGhhcyBubyByZWNvZ25pemVk
IG1vZGUuIgogICh3aGVuIChtYXJrZG93bi10cy1hdC1jb2RlLWJsb2NrLXAgcG9zKQogICAgKG9y
IChnZXQtY2hhci1wcm9wZXJ0eSAob3IgcG9zIChwb2ludCkpICdtYXJrZG93bi10cy1jb2RlLWJs
b2NrLW1vZGUpCiAgICAgICAgbWFya2Rvd24tdHMtZGVmYXVsdC1jb2RlLWJsb2NrLW1vZGUpKSkK
CihkZWZ1biBtYXJrZG93bi10cy0taG9zdC1yYW5nZXMtbm90aWZpZXIgKHJhbmdlcyBfcGFyc2Vy
KQogICJQcnVuZSBzdGFsZSBjb2RlIGJsb2NrIG92ZXJsYXlzIGFmdGVyIHRoZSBob3N0IHBhcnNl
ciByZXBhcnNlcy4KUkFOR0VTIGlzIGEgbGlzdCBvZiAoU1RBUlQgLiBFTkQpIGNvbnMgY2VsbHMg
bWFya2luZyByZWdpb25zIHdoZXJlCnRoZSBtYXJrZG93biBwYXJzZSB0cmVlIGNoYW5nZWQuICBG
b3IgZWFjaCBgbWFya2Rvd24tdHMtY29kZS1ibG9jaycKb3ZlcmxheSBpbnRlcnNlY3RpbmcgYSBj
aGFuZ2VkIHJhbmdlLCB2ZXJpZnkgdGhhdCBhIGNvbnRhaW5pbmcKYGZlbmNlZF9jb2RlX2Jsb2Nr
JyBub2RlIHN0aWxsIGV4aXN0cyBpbiB0aGUgaG9zdCB0cmVlLiAgSWYgbm90LAp0aGUgZmVuY2Vz
IHdlcmUgZGVsZXRlZCwgc28gZGVsZXRlIHRoZSBvdmVybGF5IHRvIGF2b2lkIHJ1bm5pbmcKY29t
bWFuZHMgaW4gYSBzdGFsZSBibG9jayBjb250ZXh0LiIKICAoZG9saXN0IChyYW5nZSByYW5nZXMp
CiAgICAobGV0ICgoYmVnIChjYXIgcmFuZ2UpKQogICAgICAgICAgKGVuZCAoY2RyIHJhbmdlKSkp
CiAgICAgIChkb2xpc3QgKG92IChvdmVybGF5cy1pbiBiZWcgZW5kKSkKICAgICAgICAod2hlbiAo
b3ZlcmxheS1nZXQgb3YgJ21hcmtkb3duLXRzLWNvZGUtYmxvY2spCiAgICAgICAgICAobGV0KiAo
KG92LXN0YXJ0IChvdmVybGF5LXN0YXJ0IG92KSkKICAgICAgICAgICAgICAgICAobm9kZSAoYW5k
IG92LXN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWF0IG92
LXN0YXJ0ICdtYXJrZG93bikpKSkKICAgICAgICAgICAgKHVubGVzcyAoYW5kIG5vZGUKICAgICAg
ICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LXBhcmVudC11bnRpbAogICAgICAgICAgICAgICAg
ICAgICAgICAgIG5vZGUgIlxcYGZlbmNlZF9jb2RlX2Jsb2NrXFwnIiB0KSkKICAgICAgICAgICAg
ICAoZGVsZXRlLW92ZXJsYXkgb3YpKSkpKSkpKQoKOzs7IEltYWdlIGhhbmRsaW5nOgoKKGRlZnVu
IG1hcmtkb3duLXRzLS1pbWFnZS1hbG9uZS1vbi1saW5lLXAgKG5vZGUpCiAgIlJldHVybiBub24t
bmlsIGlmIGltYWdlIE5PREUgaXMgdGhlIG9ubHkgY29udGVudCBvbiBpdHMgbGluZS4KV2hpdGVz
cGFjZSwgYmxvY2sgcXVvdGUgbWFya2VycyAoYD4nKSwgYW5kIGxpc3QgbWFya2VycwpcKGAtJywg
YConLCBgKycsIGAxLicpIGJlZm9yZSB0aGUgaW1hZ2UgYXJlIGlnbm9yZWQuIgogIChsZXQgKChu
b2RlLXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAgICAgKG5vZGUtZW5kICh0
cmVlc2l0LW5vZGUtZW5kIG5vZGUpKSkKICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAoZ290by1j
aGFyIG5vZGUtc3RhcnQpCiAgICAgIChsZXQgKChib2wgKGxpbmUtYmVnaW5uaW5nLXBvc2l0aW9u
KSkKICAgICAgICAgICAgKGVvbCAobGluZS1lbmQtcG9zaXRpb24pKSkKICAgICAgICA7OyBCZWZv
cmUgdGhlIGltYWdlOiBvbmx5IGJsb2NrIHF1b3RlIG1hcmtlcnMsIHdoaXRlc3BhY2UsCiAgICAg
ICAgOzsgYW5kIGFuIG9wdGlvbmFsIGxpc3QgbWFya2VyIGFyZSBhbGxvd2VkLgogICAgICAgIChh
bmQgKHN0cmluZy1tYXRjaC1wCiAgICAgICAgICAgICAgKHJ4IGJvcwogICAgICAgICAgICAgICAg
ICAoemVyby1vci1tb3JlIChhbnkgIj4gXHQiKSkKICAgICAgICAgICAgICAgICAgKG9wdGlvbmFs
IChvciAoc2VxIChhbnkgIi0qKyIpICIgIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoc2VxIChvbmUtb3ItbW9yZSBkaWdpdCkgKGFueSAiLikiICkgIiAiKSkpCiAgICAgICAgICAg
ICAgICAgIGVvcykKICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVz
IGJvbCBub2RlLXN0YXJ0KSkKICAgICAgICAgICAgIDs7IEFmdGVyIHRoZSBpbWFnZTogb25seSB0
cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuCiAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoLXAK
ICAgICAgICAgICAgICAocnggYm9zICh6ZXJvLW9yLW1vcmUgKGFueSAiIFx0IikpIGVvcykKICAg
ICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVzIG5vZGUtZW5kIGVvbCkp
KSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS1pbWFnZSAobm9kZSBfb3ZlcnJpZGUg
X3N0YXJ0IF9lbmQgJnJlc3QgXykKICAiU2hvdyBhbiBpbmxpbmUgaW1hZ2UgYXQgTk9ERS4KV2hl
biBgbWFya2Rvd24tdHMtaW5saW5lLWltYWdlcycgaXMgbm9uLW5pbCwgZGlzcGxheSB0aGUgaW1h
Z2UuCklmIHRoZSBpbWFnZSBsaW5rIGlzIHRoZSBvbmx5IGNvbnRlbnQgb24gaXRzIGxpbmUsIGRp
c3BsYXkgdGhlCmltYWdlIGJlbG93IHRoZSBsaW5rLiAgSWYgdGhlIGltYWdlIGlzIGlubGluZSB3
aXRoaW4gYSBwYXJhZ3JhcGgsCmRpc3BsYXkgaXQgcmlnaHQgYWZ0ZXIgdGhlIGxpbmsgdGV4dC4K
UmVtb3RlIGltYWdlcyBhcmUgY29udHJvbGxlZCBieQpgbWFya2Rvd24tdHMtZGlzcGxheS1yZW1v
dGUtaW5saW5lLWltYWdlcycuIgogIChsZXQqICgobm9kZS1zdGFydCAodHJlZXNpdC1ub2RlLXN0
YXJ0IG5vZGUpKQogICAgICAgICAobm9kZS1lbmQgKHRyZWVzaXQtbm9kZS1lbmQgbm9kZSkpCiAg
ICAgICAgIChlb2wgKHNhdmUtZXhjdXJzaW9uIChnb3RvLWNoYXIgbm9kZS1lbmQpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChsaW5lLWVuZC1wb3NpdGlvbikpKQogICAgICAgICAoc2Vh
cmNoLWVuZCAobWluICgxKyBlb2wpIChwb2ludC1tYXgpKSkpCiAgICA7OyBBbHdheXMgY2xlYXIg
c3RhbGUgb3ZlcmxheXMgZm9yIHRoaXMgbm9kZSdzIHJhbmdlLgogICAgKGRvbGlzdCAob3YgKG92
ZXJsYXlzLWluIG5vZGUtc3RhcnQgc2VhcmNoLWVuZCkpCiAgICAgICh3aGVuIChhbmQgKG92ZXJs
YXktZ2V0IG92ICdtYXJrZG93bi10cy1pbWFnZSkKICAgICAgICAgICAgICAgICAoPj0gKG92ZXJs
YXktc3RhcnQgb3YpIG5vZGUtc3RhcnQpCiAgICAgICAgICAgICAgICAgKDw9IChvdmVybGF5LWVu
ZCBvdikgc2VhcmNoLWVuZCkpCiAgICAgICAgKGRlbGV0ZS1vdmVybGF5IG92KSkpCiAgICAod2hl
biAoYW5kIG1hcmtkb3duLXRzLWlubGluZS1pbWFnZXMKICAgICAgICAgICAgICAgKGRpc3BsYXkt
Z3JhcGhpYy1wKQogICAgICAgICAgICAgICA7OyBEb24ndCBjcmVhdGUgaW1hZ2Ugb3ZlcmxheXMg
Zm9yIG5vZGVzIGluc2lkZQogICAgICAgICAgICAgICA7OyBmb2xkZWQgKG91dGxpbmUtaW52aXNp
YmxlKSBoZWFkaW5ncywgc2luY2UgdGhlCiAgICAgICAgICAgICAgIDs7IGltYWdlcyB3b3VsZG4n
dCBiZSB2aXNpYmxlIGFuZCBjb3VsZCBpbnRlcmZlcmUKICAgICAgICAgICAgICAgOzsgd2l0aCB0
aGUgZm9sZGVkIGRpc3BsYXkuCiAgICAgICAgICAgICAgIChub3QgKG1hcmtkb3duLXRzLS1vdXRs
aW5lLWludmlzaWJsZS1wIG5vZGUtc3RhcnQpKSkKICAgICAgKGxldCogKChkZXN0ICh0cmVlc2l0
LXNlYXJjaC1zdWJ0cmVlIG5vZGUgIlxcYGxpbmtfZGVzdGluYXRpb25cXCciKSkKICAgICAgICAg
ICAgICh1cmwgKGFuZCBkZXN0ICh0cmVlc2l0LW5vZGUtdGV4dCBkZXN0IHQpKSkKICAgICAgICAg
ICAgIChyZW1vdGVwIChhbmQgdXJsIChzdHJpbmctbWF0Y2gtcCAiXFxgaHR0cHM/Oi8vIiB1cmwp
KSkKICAgICAgICAgICAgIChkaXNwbGF5YWJsZQogICAgICAgICAgICAgICh3aGVuIHVybAogICAg
ICAgICAgICAgICAgKGlmIHJlbW90ZXAKICAgICAgICAgICAgICAgICAgICAod2hlbiAoZXEgbWFy
a2Rvd24tdHMtZGlzcGxheS1yZW1vdGUtaW5saW5lLWltYWdlcwogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAnZG93bmxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAoaWdub3JlLWVycm9y
cwogICAgICAgICAgICAgICAgICAgICAgICAocmVxdWlyZSAndXJsLWhhbmRsZXJzKQogICAgICAg
ICAgICAgICAgICAgICAgICAod2l0aC13b3JrLWJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAg
ICAgIChzZXQtYnVmZmVyLW11bHRpYnl0ZSBuaWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
KHVybC1pbnNlcnQtZmlsZS1jb250ZW50cyB1cmwpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
KGJ1ZmZlci1zdHJpbmcpKSkpCiAgICAgICAgICAgICAgICAgIChsZXQgKChmaWxlIChleHBhbmQt
ZmlsZS1uYW1lIHVybCkpKQogICAgICAgICAgICAgICAgICAgIChhbmQgKG5vdCAoZmlsZS1yZW1v
dGUtcCBmaWxlKSkKICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlLWV4aXN0cy1wIGZpbGUp
CiAgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2Utc3VwcG9ydGVkLWZpbGUtcCBmaWxlKQog
ICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSkpKSkpCiAgICAgICAgICAgICAobWF4LXcgKGFu
ZCBkaXNwbGF5YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChlcSBtYXJrZG93bi10
cy1pbWFnZS1tYXgtd2lkdGggJ3dpbmRvdykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
d2luZG93LWJvZHktd2lkdGggbmlsIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtk
b3duLXRzLWltYWdlLW1heC13aWR0aCkpKQogICAgICAgICAgICAgKGltZyAoYW5kIG1heC13CiAg
ICAgICAgICAgICAgICAgICAgICAgKGNyZWF0ZS1pbWFnZSBkaXNwbGF5YWJsZSBuaWwgcmVtb3Rl
cAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1heC13aWR0aCBtYXgtdwog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnNjYWxlIDEpKSkpCiAgICAgICAg
KHdoZW4gaW1nCiAgICAgICAgICAobGV0KiAoKGFsb25lIChtYXJrZG93bi10cy0taW1hZ2UtYWxv
bmUtb24tbGluZS1wIG5vZGUpKQogICAgICAgICAgICAgICAgIChzdHIgKGlmIGFsb25lCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCAiXG4iIChwcm9wZXJ0aXplICIgIiAnZGlzcGxh
eSBpbWcpKQogICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAiICIgJ2Rpc3BsYXkg
aW1nKSkpCiAgICAgICAgICAgICAgICAgKG92IChtYWtlLW92ZXJsYXkgKDEtIG5vZGUtZW5kKSBu
b2RlLWVuZCBuaWwgdCBuaWwpKSkKICAgICAgICAgICAgKG92ZXJsYXktcHV0IG92ICdtYXJrZG93
bi10cy1pbWFnZSB0KQogICAgICAgICAgICAob3ZlcmxheS1wdXQgb3YgJ2FmdGVyLXN0cmluZyBz
dHIpCiAgICAgICAgICAgIChvdmVybGF5LXB1dCBvdiAnZXZhcG9yYXRlIHQpKSkpKSkpCgo7Ozsg
VVJML1VSSSBoYW5kbGluZzoKCihkZWZ2YXIgbWFya2Rvd24tdHMtLWJhcmUtdXJsLXJlZ2V4cCBn
b3RvLWFkZHJlc3MtdXJsLXJlZ2V4cAogICJSZWdleHAgbWF0Y2hpbmcgYmFyZSBVUkxzIG5vdCB3
cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzIG9yIGxpbmsgc3ludGF4LiIpCgooZGVmdmFyIG1hcmtk
b3duLXRzLS1iYXJlLWVtYWlsLXVyaS1yZWdleHAgZ290by1hZGRyZXNzLW1haWwtcmVnZXhwCiAg
IlJlZ2V4cCBtYXRjaGluZyBiYXJlIGVtYWlsIGFkZHJlc3NlcyBub3Qgd3JhcHBlZCBpbiBhbmds
ZSBicmFja2V0cy4iKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1mb250aWZ5LWJhcmUtdXJpIChzdGFy
dCBlbmQpCiAgIkZvbnRpZnkgYmFyZSBVUkwgb3IgZW1haWwgVVJJIGJldHdlZW4gU1RBUlQgYW5k
IEVORC4KU2tpcCBtYXRjaGVzIGFscmVhZHkgaW5zaWRlIHRyZWUtc2l0dGVyIGxpbmsgb3IgYXV0
b2xpbmsgbm9kZXMuIgogIChkb2xpc3QgKHJlIChsaXN0IG1hcmtkb3duLXRzLS1iYXJlLXVybC1y
ZWdleHAKICAgICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy0tYmFyZS1lbWFpbC11cmktcmVn
ZXhwKSkKICAgIChnb3RvLWNoYXIgc3RhcnQpCiAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJk
IHJlIGVuZCB0KQogICAgICAobGV0KiAoKHVyaS1zdGFydCAobWF0Y2gtYmVnaW5uaW5nIDApKQog
ICAgICAgICAgICAgKHVyaS1lbmQgKG1hdGNoLWVuZCAwKSkKICAgICAgICAgICAgICh1cmkgKG1h
dGNoLXN0cmluZyAwKSkKICAgICAgICAgICAgIChub2RlICh0cmVlc2l0LW5vZGUtYXQgdXJpLXN0
YXJ0ICdtYXJrZG93bi1pbmxpbmUpKQogICAgICAgICAgICAgKHBhcmVudCAoYW5kIG5vZGUgKHRy
ZWVzaXQtbm9kZS1wYXJlbnQgbm9kZSkpKQogICAgICAgICAgICAgKHBhcmVudC10eXBlIChhbmQg
cGFyZW50ICh0cmVlc2l0LW5vZGUtdHlwZSBwYXJlbnQpKSkpCiAgICAgICAgKHVubGVzcyAob3Ig
KG1lbWJlciBwYXJlbnQtdHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJygiaW5saW5l
X2xpbmsiICJmdWxsX3JlZmVyZW5jZV9saW5rIgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiY29sbGFwc2VkX3JlZmVyZW5jZV9saW5rIiAic2hvcnRjdXRfbGluayIKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgImltYWdlIiAidXJpX2F1dG9saW5rIiAiZW1haWxfYXV0b2xpbmsi
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rX2Rlc3RpbmF0aW9uIikpCiAgICAg
ICAgICAgICAgICAgICAgKG1lbWJlciAoYW5kIG5vZGUgKHRyZWVzaXQtbm9kZS10eXBlIG5vZGUp
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJygidXJpX2F1dG9saW5rIiAiZW1haWxfYXV0
b2xpbmsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rX2Rlc3RpbmF0aW9uIiAi
Y29kZV9zcGFuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kZV9mZW5jZV9jb250
ZW50IiAiaW5mb19zdHJpbmciKSkKICAgICAgICAgICAgICAgICAgICAoZ2V0LXRleHQtcHJvcGVy
dHkgdXJpLXN0YXJ0ICdidXR0b24pKQogICAgICAgICAgKG1hcmtkb3duLXRzLS1tYWtlLWxpbmst
YnV0dG9uCiAgICAgICAgICAgdXJpLXN0YXJ0IHVyaS1lbmQKICAgICAgICAgICAoaWYgKGVxIHVy
aS1zdGFydCAwKQogICAgICAgICAgICAgICB1cmkKICAgICAgICAgICAgIChjb25jYXQgIm1haWx0
bzoiIHVyaSkpKSkpKSkpCgo7OzsgdHJlZXNpdCBzZXR0aW5nczoKCihkZWZ2YXIgbWFya2Rvd24t
dHMtLXRyZWVzaXQtc2V0dGluZ3MKICAodHJlZXNpdC1mb250LWxvY2stcnVsZXMKICAgOmxhbmd1
YWdlICdtYXJrZG93bgogICA6ZmVhdHVyZSAnZXJyb3IKICAgOm92ZXJyaWRlIHQKICAgJygoRVJS
T1IpIEBmb250LWxvY2std2FybmluZy1mYWNlKQoKICAgOmxhbmd1YWdlICdtYXJrZG93bi1pbmxp
bmUKICAgOm92ZXJyaWRlIHQKICAgOmZlYXR1cmUgJ2RlbGltaXRlcgogICAnKChpbmxpbmVfbGlu
ayBbICJbIiAiXSIgIigiICIpIiBdIEBtYXJrZG93bi10cy0tZm9udGlmeS1kZWxpbWl0ZXIpCiAg
ICAgKGZ1bGxfcmVmZXJlbmNlX2xpbmsgWyAiWyIgIl0iIF0gQG1hcmtkb3duLXRzLS1mb250aWZ5
LWRlbGltaXRlcikKICAgICAoY29sbGFwc2VkX3JlZmVyZW5jZV9saW5rIFsgIlsiICJdIiBdIEBt
YXJrZG93bi10cy0tZm9udGlmeS1kZWxpbWl0ZXIpCiAgICAgKHNob3J0Y3V0X2xpbmsgWyAiWyIg
Il0iIF0gQG1hcmtkb3duLXRzLS1mb250aWZ5LWRlbGltaXRlcikKICAgICAoaW1hZ2UgWyAiISIg
IlsiICJdIiAiKCIgIikiIF0gQG1hcmtkb3duLXRzLS1mb250aWZ5LWRlbGltaXRlcikpCgogICA6
bGFuZ3VhZ2UgJ21hcmtkb3duCiAgIDpmZWF0dXJlICdoZWFkaW5nCiAgICcoKChhdHhfaGVhZGlu
ZykgICAgQG1hcmtkb3duLXRzLS1mb250aWZ5LWF0eC1oZWFkaW5nKQogICAgICgoc2V0ZXh0X2hl
YWRpbmcpIEBtYXJrZG93bi10cy0tZm9udGlmeS1zZXRleHQtaGVhZGluZykpCgogICA6bGFuZ3Vh
Z2UgJ21hcmtkb3duCiAgIDpmZWF0dXJlICdoZWFkaW5nCiAgIDpvdmVycmlkZSAncHJlcGVuZAog
ICAnKChhdHhfaDFfbWFya2VyKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktYXR4LWRlbGltaXRlcgog
ICAgIChhdHhfaDJfbWFya2VyKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktYXR4LWRlbGltaXRlcgog
ICAgIChhdHhfaDNfbWFya2VyKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktYXR4LWRlbGltaXRlcgog
ICAgIChhdHhfaDRfbWFya2VyKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktYXR4LWRlbGltaXRlcgog
ICAgIChhdHhfaDVfbWFya2VyKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktYXR4LWRlbGltaXRlcgog
ICAgIChhdHhfaDZfbWFya2VyKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktYXR4LWRlbGltaXRlcgog
ICAgIChzZXRleHRfaDFfdW5kZXJsaW5lKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktZGVsaW1pdGVy
CiAgICAgKHNldGV4dF9oMl91bmRlcmxpbmUpIEBtYXJrZG93bi10cy0tZm9udGlmeS1kZWxpbWl0
ZXIpCgogICA6bGFuZ3VhZ2UgJ21hcmtkb3duCiAgIDpmZWF0dXJlICdwYXJhZ3JhcGgKICAgJygo
KHRoZW1hdGljX2JyZWFrKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktdGhlbWF0aWMtYnJlYWspCiAg
ICAgKChodG1sX2Jsb2NrKSBAbWFya2Rvd24tdHMtaHRtbC1ibG9jaykKICAgICAoKGluZGVudGVk
X2NvZGVfYmxvY2spIEBtYXJrZG93bi10cy1pbmRlbnRlZC1jb2RlLWJsb2NrKQogICAgIChsaXN0
X2l0ZW0gKGxpc3RfbWFya2VyX3N0YXIpIEBtYXJrZG93bi10cy0tZm9udGlmeS11bm9yZGVyZWQt
bGlzdC1tYXJrZXIpCiAgICAgKGxpc3RfaXRlbSAobGlzdF9tYXJrZXJfcGx1cykgQG1hcmtkb3du
LXRzLS1mb250aWZ5LXVub3JkZXJlZC1saXN0LW1hcmtlcikKICAgICAobGlzdF9pdGVtIChsaXN0
X21hcmtlcl9taW51cykgQG1hcmtkb3duLXRzLS1mb250aWZ5LXVub3JkZXJlZC1saXN0LW1hcmtl
cikKICAgICAobGlzdF9pdGVtIChsaXN0X21hcmtlcl9kb3QpIEBtYXJrZG93bi10cy1saXN0LW1h
cmtlcikKICAgICAobGlzdF9pdGVtIChsaXN0X21hcmtlcl9wYXJlbnRoZXNpcykgQG1hcmtkb3du
LXRzLWxpc3QtbWFya2VyKQogICAgIChsaXN0X2l0ZW0gKHRhc2tfbGlzdF9tYXJrZXJfdW5jaGVj
a2VkKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktY2hlY2tib3gpCiAgICAgKGxpc3RfaXRlbSAodGFz
a19saXN0X21hcmtlcl9jaGVja2VkKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktY2hlY2tib3gpCiAg
ICAgKGxpbmtfcmVmZXJlbmNlX2RlZmluaXRpb24KICAgICAgKGxpbmtfbGFiZWwpIEBtYXJrZG93
bi10cy0tZm9udGlmeS1saW5rLXJlZi1sYWJlbCkKICAgICAobGlua19yZWZlcmVuY2VfZGVmaW5p
dGlvbgogICAgICAobGlua19kZXN0aW5hdGlvbikgQG1hcmtkb3duLXRzLS1mb250aWZ5LWxpbmst
cmVmLWRlc3RpbmF0aW9uKQogICAgIChsaW5rX3JlZmVyZW5jZV9kZWZpbml0aW9uCiAgICAgIChs
aW5rX3RpdGxlKSBAbWFya2Rvd24tdHMtbGluay1kZXN0aW5hdGlvbikpCgogICA6bGFuZ3VhZ2Ug
J21hcmtkb3duCiAgIDpmZWF0dXJlICdwYXJhZ3JhcGgKICAgOm92ZXJyaWRlICdwcmVwZW5kCiAg
ICcoKHBpcGVfdGFibGVfaGVhZGVyICJ8IiBAbWFya2Rvd24tdHMtdGFibGUtaGVhZGVyKQogICAg
IChwaXBlX3RhYmxlX2hlYWRlciAocGlwZV90YWJsZV9jZWxsKSBAbWFya2Rvd24tdHMtdGFibGUt
aGVhZGVyKQogICAgIChwaXBlX3RhYmxlX3JvdyAifCIgQG1hcmtkb3duLXRzLXRhYmxlLWRlbGlt
aXRlci1jZWxsKQogICAgIChwaXBlX3RhYmxlX3JvdyAocGlwZV90YWJsZV9jZWxsKSBAbWFya2Rv
d24tdHMtdGFibGUtY2VsbCkKICAgICAocGlwZV90YWJsZV9kZWxpbWl0ZXJfcm93ICJ8IiBAbWFy
a2Rvd24tdHMtdGFibGUtZGVsaW1pdGVyLWNlbGwpCiAgICAgKChwaXBlX3RhYmxlKSBAbWFya2Rv
d24tdHMtdGFibGUpCiAgICAgKHBpcGVfdGFibGVfZGVsaW1pdGVyX3JvdyAocGlwZV90YWJsZV9k
ZWxpbWl0ZXJfY2VsbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBtYXJrZG93bi10
cy10YWJsZS1kZWxpbWl0ZXItY2VsbCkpCgogICA6bGFuZ3VhZ2UgJ21hcmtkb3duCiAgIDpmZWF0
dXJlICdwYXJhZ3JhcGgKICAgOm92ZXJyaWRlICdwcmVwZW5kCiAgICcoKGJsb2NrX3F1b3RlKSBA
bWFya2Rvd24tdHMtYmxvY2stcXVvdGUKICAgICAoYmxvY2tfcXVvdGVfbWFya2VyKSBAbWFya2Rv
d24tdHMtLWZvbnRpZnktZGVsaW1pdGVyCiAgICAgKGZlbmNlZF9jb2RlX2Jsb2NrX2RlbGltaXRl
cikgQG1hcmtkb3duLXRzLS1mb250aWZ5LWRlbGltaXRlcgogICAgIChmZW5jZWRfY29kZV9ibG9j
awogICAgICAoaW5mb19zdHJpbmcgKGxhbmd1YWdlKSBAbWFya2Rvd24tdHMtbGFuZ3VhZ2Uta2V5
d29yZCkKICAgICAgQG1hcmtkb3duLXRzLS1mb250aWZ5LWRlbGltaXRlcikKICAgICAoYmxvY2tf
cXVvdGUKICAgICAgKGJsb2NrX3F1b3RlX21hcmtlcikgQG1hcmtkb3duLXRzLS1mb250aWZ5LWRl
bGltaXRlcgogICAgICAocGFyYWdyYXBoIChpbmxpbmUgKGJsb2NrX2NvbnRpbnVhdGlvbikgQG1h
cmtkb3duLXRzLS1mb250aWZ5LWRlbGltaXRlcikpKSkKCiAgIDpsYW5ndWFnZSAnbWFya2Rvd24K
ICAgOmZlYXR1cmUgJ3BhcmFncmFwaAogICA6b3ZlcnJpZGUgJ2FwcGVuZAogICAnKChmZW5jZWRf
Y29kZV9ibG9jawogICAgICAoaW5mb19zdHJpbmcgKGxhbmd1YWdlKSkKICAgICAgKGNvZGVfZmVu
Y2VfY29udGVudCkgQG1hcmtkb3duLXRzLS1mb250aWZ5LW5vbi10cy1jb2RlLWJsb2NrKSkKCiAg
IDpsYW5ndWFnZSAnbWFya2Rvd24KICAgOmZlYXR1cmUgJ3BhcmFncmFwaAogICA6b3ZlcnJpZGUg
J2FwcGVuZAogICAnKChmZW5jZWRfY29kZV9ibG9jayAoY29kZV9mZW5jZV9jb250ZW50KSBAbWFy
a2Rvd24tdHMtLWZvbnRpZnktY29kZS1ibG9jaykpCgogICA6bGFuZ3VhZ2UgJ21hcmtkb3duLWlu
bGluZQogICA6b3ZlcnJpZGUgJ3ByZXBlbmQKICAgOmZlYXR1cmUgJ3BhcmFncmFwaC1pbmxpbmUK
ICAgJygoKGNvZGVfc3BhbikgQG1hcmtkb3duLXRzLWNvZGUtc3BhbikKICAgICAoKGNvZGVfc3Bh
bl9kZWxpbWl0ZXIpIEBtYXJrZG93bi10cy0tZm9udGlmeS1kZWxpbWl0ZXIpKQoKICAgOmxhbmd1
YWdlICdtYXJrZG93bi1pbmxpbmUKICAgOm92ZXJyaWRlICdhcHBlbmQKICAgOmZlYXR1cmUgJ3Bh
cmFncmFwaC1pbmxpbmUKICAgJygoKGxpbmtfZGVzdGluYXRpb24pIEBtYXJrZG93bi10cy0tZm9u
dGlmeS1saW5rLWRlc3RpbmF0aW9uKQogICAgICgoZW1waGFzaXMpIEBtYXJrZG93bi10cy1lbXBo
YXNpcykKICAgICAoKHN0cm9uZ19lbXBoYXNpcykgQG1hcmtkb3duLXRzLWJvbGQpCiAgICAgKChz
dHJpa2V0aHJvdWdoKSBAbWFya2Rvd24tdHMtc3RyaWtldGhyb3VnaCkKICAgICAoaW5saW5lX2xp
bmsgKGxpbmtfdGV4dCkgQG1hcmtkb3duLXRzLS1mb250aWZ5LWxpbmstbm9kZSkKICAgICAoZnVs
bF9yZWZlcmVuY2VfbGluayAobGlua190ZXh0KSBAbWFya2Rvd24tdHMtLWZvbnRpZnktbGluay1u
b2RlKQogICAgIChmdWxsX3JlZmVyZW5jZV9saW5rIChsaW5rX2xhYmVsKSBAbWFya2Rvd24tdHMt
LWZvbnRpZnktbGluay1ub2RlKQogICAgIChjb2xsYXBzZWRfcmVmZXJlbmNlX2xpbmsgKGxpbmtf
dGV4dCkgQG1hcmtkb3duLXRzLS1mb250aWZ5LWxpbmstbm9kZSkKICAgICAoc2hvcnRjdXRfbGlu
ayAobGlua190ZXh0KSBAbWFya2Rvd24tdHMtLWZvbnRpZnktbGluay1ub2RlKQogICAgIChpbWFn
ZSAoaW1hZ2VfZGVzY3JpcHRpb24pIEBtYXJrZG93bi10cy0tZm9udGlmeS1saW5rLW5vZGUpCiAg
ICAgKCh1cmlfYXV0b2xpbmspIEBtYXJrZG93bi10cy0tZm9udGlmeS1hdXRvbGluaykKICAgICAo
KGVtYWlsX2F1dG9saW5rKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktYXV0b2xpbmspCiAgICAgKGlu
bGluZV9saW5rIChsaW5rX3RpdGxlKSBAbWFya2Rvd24tdHMtbGluay1kZXN0aW5hdGlvbikKICAg
ICAoKGJhY2tzbGFzaF9lc2NhcGUpIEBtYXJrZG93bi10cy0tZm9udGlmeS1iYWNrc2xhc2gtZXNj
YXBlKQogICAgICgoZW50aXR5X3JlZmVyZW5jZSkgQG1hcmtkb3duLXRzLS1mb250aWZ5LWVudGl0
eSkKICAgICAoKG51bWVyaWNfY2hhcmFjdGVyX3JlZmVyZW5jZSkgQG1hcmtkb3duLXRzLS1mb250
aWZ5LWVudGl0eSkKICAgICAoKGh0bWxfdGFnKSBAbWFya2Rvd24tdHMtaHRtbC10YWcpCiAgICAg
KChoYXJkX2xpbmVfYnJlYWspIEBtYXJrZG93bi10cy0tZm9udGlmeS1oYXJkLWxpbmUtYnJlYWsp
CiAgICAgKChsYXRleF9ibG9jaykgQG1hcmtkb3duLXRzLS1mb250aWZ5LWxhdGV4LWJsb2NrKSkK
CiAgIDpsYW5ndWFnZSAnbWFya2Rvd24taW5saW5lCiAgIDpmZWF0dXJlICdwYXJhZ3JhcGgtaW5s
aW5lCiAgIDpvdmVycmlkZSAnYXBwZW5kCiAgICcoKGVtcGhhc2lzX2RlbGltaXRlcikgQG1hcmtk
b3duLXRzLS1mb250aWZ5LWRlbGltaXRlcikKCiAgIDpsYW5ndWFnZSAnbWFya2Rvd24taW5saW5l
CiAgIDpmZWF0dXJlICdpbWFnZS1wcmV2aWV3CiAgIDpvdmVycmlkZSAnYXBwZW5kCiAgICcoKGlt
YWdlKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktaW1hZ2UpKSkKCjs7OyBJbWVudToKCihkZWZ1biBt
YXJrZG93bi10cy0taW1lbnUtaGVhZGluZy1ub2RlLXAgKG5vZGUpCiAgIkNoZWNrIGlmIE5PREUg
aXMgYSB2YWxpZCBlbnRyeSB0byBpbWVudS4iCiAgKGFuZCAoZXF1YWwgKHRyZWVzaXQtbm9kZS10
eXBlIG5vZGUpICJpbmxpbmUiKQogICAgICAgKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSAodHJl
ZXNpdC1ub2RlLXBhcmVudCBub2RlKSkKICAgICAgICAgICAgICAiYXR4X2hlYWRpbmciKSkpCgoo
ZGVmdW4gbWFya2Rvd24tdHMtLWltZW51LWhlYWRpbmctbmFtZS1mdW5jdGlvbiAobm9kZSkKICAi
UmV0dXJuIGFuIGltZW51IGVudHJ5IGlmIE5PREUgaXMgYSB2YWxpZCBoZWFkZXIuIgogIChsZXQg
KChuYW1lICh0cmVlc2l0LW5vZGUtdGV4dCBub2RlKSkpCiAgICAoaWYgKG1hcmtkb3duLXRzLS1p
bWVudS1oZWFkaW5nLW5vZGUtcCBub2RlKQogICAgICAgIChjYXIgKHNwbGl0LXN0cmluZyAodHJl
ZXNpdC1ub2RlLXRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1w
YXJlbnQgbm9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiB0ICIgIikpCiAgICAg
IG5hbWUpKSkKCihkZWZ1biBtYXJrZG93bi10cy0taW1lbnUtY29kZS1ibG9jay1ub2RlLXAgKG5v
ZGUpCiAgIkNoZWNrIGlmIE5PREUgaXMgYW4gaW5mb19zdHJpbmcgd2l0aCBkZXNjcmlwdGl2ZSB0
ZXh0IGFmdGVyIHRoZSBsYW5ndWFnZS4iCiAgKGFuZCAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBl
IG5vZGUpICJpbmZvX3N0cmluZyIpCiAgICAgICAod2hlbi1sZXQqICgobGFuZy1ub2RlICh0cmVl
c2l0LXNlYXJjaC1zdWJ0cmVlIG5vZGUgImxhbmd1YWdlIikpCiAgICAgICAgICAgICAgICAgICAo
KDwgKHRyZWVzaXQtbm9kZS1lbmQgbGFuZy1ub2RlKQogICAgICAgICAgICAgICAgICAgICAgICh0
cmVlc2l0LW5vZGUtZW5kIG5vZGUpKSkpCiAgICAgICAgIChub3QgKHN0cmluZy1ibGFuay1wCiAg
ICAgICAgICAgICAgIChidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMKICAgICAgICAgICAg
ICAgICh0cmVlc2l0LW5vZGUtZW5kIGxhbmctbm9kZSkKICAgICAgICAgICAgICAgICh0cmVlc2l0
LW5vZGUtZW5kIG5vZGUpKSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWltZW51LWNvZGUtYmxv
Y2stbmFtZS1mdW5jdGlvbiAobm9kZSkKICAiUmV0dXJuIGFuIGltZW51IGVudHJ5IG5hbWUgZm9y
IGEgY29kZSBibG9jayBpbmZvX3N0cmluZyBOT0RFLgpVc2VzIHRoZSBkZXNjcmlwdGl2ZSB0ZXh0
IGFmdGVyIHRoZSBsYW5ndWFnZSBuYW1lLiIKICAod2hlbi1sZXQqICgobGFuZy1ub2RlICh0cmVl
c2l0LXNlYXJjaC1zdWJ0cmVlIG5vZGUgImxhbmd1YWdlIikpCiAgICAgICAgICAgICAgKGRlc2Mg
KHN0cmluZy10cmltCiAgICAgICAgICAgICAgICAgICAgIChidWZmZXItc3Vic3RyaW5nLW5vLXBy
b3BlcnRpZXMKICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtZW5kIGxhbmctbm9k
ZSkKICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKSkpKQogICAg
KGZvcm1hdCAiJXM6ICVzIiAodHJlZXNpdC1ub2RlLXRleHQgbGFuZy1ub2RlKSBkZXNjKSkpCgoo
ZGVmdW4gbWFya2Rvd24tdHMtLW91dGxpbmUtcHJlZGljYXRlIChub2RlKQogICJNYXRjaCBOT0RF
IGlmIGl0IGlzIGEgaGllcmFyY2hpY2FsIHNlY3Rpb24gdGhhdCBoYXMgYSBoZWFkaW5nLiIKICAo
YW5kIChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUgbm9kZSkgInNlY3Rpb24iKQogICAgICAgKHdo
ZW4tbGV0KiAoKGNoaWxkICh0cmVlc2l0LW5vZGUtY2hpbGQgbm9kZSAwKSkpCiAgICAgICAgIChl
cXVhbCAodHJlZXNpdC1ub2RlLXR5cGUgY2hpbGQpICJhdHhfaGVhZGluZyIpKSkpCgo7OzsgSGVh
ZGluZyBtYW5pcHVsYXRpb246CgooZGVmY29uc3QgbWFya2Rvd24tdHMtLXBhcnNlci1oZWFkaW5n
LW1heC1sZXZlbCA2CiAgIk1heGltdW0gQVRYIGhlYWRpbmcgbGV2ZWwgaW4gTWFya2Rvd24gKGgx
LWg2KS4KRGVmaW5lZCBieSB0aGUgQ29tbW9uTWFyayBzcGVjIGFuZCB0aGUgdHJlZS1zaXR0ZXIg
Z3JhbW1hci4iKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1oZWFkaW5nLWF0LXBvaW50ICgpCiAgIlJl
dHVybiB0aGUgYXR4X2hlYWRpbmcgbm9kZSBhdCBvciBiZWZvcmUgcG9pbnQsIG9yIG5pbC4iCiAg
KHdoZW4tbGV0KiAoKG5vZGUgKHRyZWVzaXQtbm9kZS1hdCAocG9pbnQpICdtYXJrZG93bikpKQog
ICAgKGlmIChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUgbm9kZSkgImF0eF9oZWFkaW5nIikKICAg
ICAgICBub2RlCiAgICAgICh0cmVlc2l0LXBhcmVudC11bnRpbAogICAgICAgbm9kZSAobGFtYmRh
IChuKSAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlIG4pICJhdHhfaGVhZGluZyIpKSkpKSkKCihk
ZWZ1biBtYXJrZG93bi10cy0taGVhZGluZy1sZXZlbCAoaGVhZGluZykKICAiUmV0dXJuIEhFQURJ
TkcgbGV2ZWwgKHJhbmdlIDEgdG8gYG1hcmtkb3duLXRzLS1wYXJzZXItaGVhZGluZy1tYXgtbGV2
ZWwnKS4iCiAgKGxldCAoKG1hcmtlciAodHJlZXNpdC1ub2RlLWNoaWxkIGhlYWRpbmcgMCkpKQog
ICAgKGxlbmd0aCAodHJlZXNpdC1ub2RlLXRleHQgbWFya2VyIHQpKSkpCgooZGVmdW4gbWFya2Rv
d24tdHMtLXNlY3Rpb24tYXQtcG9pbnQgKCkKICAiUmV0dXJuIHRoZSBzZWN0aW9uIG5vZGUgY29u
dGFpbmluZyBwb2ludC4iCiAgKHdoZW4tbGV0KiAoKG5vZGUgKHRyZWVzaXQtbm9kZS1hdCAocG9p
bnQpICdtYXJrZG93bikpKQogICAgKHRyZWVzaXQtcGFyZW50LXVudGlsCiAgICAgbm9kZSAobGFt
YmRhIChuKSAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlIG4pICJzZWN0aW9uIikpKSkpCgooZGVm
dW4gbWFya2Rvd24tdHMtcHJvbW90ZSAoKQogICJQcm9tb3RlIHRoZSBoZWFkaW5nIG9yIGxpc3Qg
aXRlbSBhdCBwb2ludC4KRm9yIGhlYWRpbmdzLCBkZWNyZWFzZSB0aGUgbGV2ZWwgKGUuZy4sICMj
IHRvICMpLgpGb3IgbGlzdCBpdGVtcywgZGVjcmVhc2UgbmVzdGluZyAoZGVkZW50KS4KV2l0aCBg
dHJhbnNpZW50LW1hcmstbW9kZScgb24gYW5kIG1hcmsgYWN0aXZlLCBwcm9tb3RlIGFsbApoZWFk
aW5ncyBpbiB0aGUgcmVnaW9uLiIKICAoaW50ZXJhY3RpdmUpCiAgKGNvbmQKICAgKChhbmQgdHJh
bnNpZW50LW1hcmstbW9kZSBtYXJrLWFjdGl2ZSkKICAgIChtYXJrZG93bi10cy0tcHJvbW90ZS1v
ci1kZW1vdGUtcmVnaW9uIC0xKSkKICAgKChtYXJrZG93bi10cy0tbGlzdC1pdGVtLWF0LXBvaW50
KQogICAgKG1hcmtkb3duLXRzLS1saXN0LXByb21vdGUtb3ItZGVtb3RlIG5pbCkpCiAgICh0ICht
YXJrZG93bi10cy0tcHJvbW90ZS1vci1kZW1vdGUgLTEpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMt
ZGVtb3RlICgpCiAgIkRlbW90ZSB0aGUgaGVhZGluZyBvciBsaXN0IGl0ZW0gYXQgcG9pbnQuCkZv
ciBoZWFkaW5ncywgaW5jcmVhc2UgdGhlIGxldmVsIChlLmcuLCAjIHRvICMjKS4KRm9yIGxpc3Qg
aXRlbXMsIGluY3JlYXNlIG5lc3RpbmcgKGluZGVudCkuCldpdGggYHRyYW5zaWVudC1tYXJrLW1v
ZGUnIG9uIGFuZCBtYXJrIGFjdGl2ZSwgZGVtb3RlIGFsbCBoZWFkaW5ncwppbiB0aGUgcmVnaW9u
LiIKICAoaW50ZXJhY3RpdmUpCiAgKGNvbmQKICAgKChhbmQgdHJhbnNpZW50LW1hcmstbW9kZSBt
YXJrLWFjdGl2ZSkKICAgIChtYXJrZG93bi10cy0tcHJvbW90ZS1vci1kZW1vdGUtcmVnaW9uIDEp
KQogICAoKG1hcmtkb3duLXRzLS1saXN0LWl0ZW0tYXQtcG9pbnQpCiAgICAobWFya2Rvd24tdHMt
LWxpc3QtcHJvbW90ZS1vci1kZW1vdGUgdCkpCiAgICh0IChtYXJrZG93bi10cy0tcHJvbW90ZS1v
ci1kZW1vdGUgMSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tcHJvbW90ZS1vci1kZW1vdGUgKGRl
bHRhKQogICJDaGFuZ2UgdGhlIGhlYWRpbmcgYXQgcG9pbnQgYnkgREVMVEEgbGV2ZWxzLgpOZWdh
dGl2ZSBERUxUQSBwcm9tb3RlcyAoZmV3ZXIgIyksIHBvc2l0aXZlIGRlbW90ZXMgKG1vcmUgIyku
CklmIHRoZSBoZWFkaW5nIGhhcyBhbiBvcHRpb25hbCB0cmFpbGluZyBjbG9zaW5nLWAjJyBzZXF1
ZW5jZSwgdGhhdApzZXF1ZW5jZSBpcyByZXNpemVkIHRvIG1hdGNoIHRoZSBuZXcgbGV2ZWwuIgog
ICh3aGVuLWxldCogKChoZWFkaW5nIChtYXJrZG93bi10cy0taGVhZGluZy1hdC1wb2ludCkpCiAg
ICAgICAgICAgICAgKG1hcmtlciAodHJlZXNpdC1ub2RlLWNoaWxkIGhlYWRpbmcgMCkpCiAgICAg
ICAgICAgICAgKGxldmVsIChsZW5ndGggKHRyZWVzaXQtbm9kZS10ZXh0IG1hcmtlciB0KSkpCiAg
ICAgICAgICAgICAgKG5ldy1sZXZlbCAoKyBsZXZlbCBkZWx0YSkpKQogICAgKHdoZW4gKGFuZCAo
Pj0gbmV3LWxldmVsIDEpCiAgICAgICAgICAgICAgICg8PSBuZXctbGV2ZWwgbWFya2Rvd24tdHMt
LXBhcnNlci1oZWFkaW5nLW1heC1sZXZlbCkpCiAgICAgIChsZXQqICgob3BlbmVyLWJlZyAodHJl
ZXNpdC1ub2RlLXN0YXJ0IG1hcmtlcikpCiAgICAgICAgICAgICAob3BlbmVyLWVuZCAodHJlZXNp
dC1ub2RlLWVuZCBtYXJrZXIpKQogICAgICAgICAgICAgKGxpbmUtZW5kIChzYXZlLWV4Y3Vyc2lv
bgogICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciBvcGVuZXItZW5kKQogICAgICAg
ICAgICAgICAgICAgICAgICAgKGxpbmUtZW5kLXBvc2l0aW9uKSkpCiAgICAgICAgICAgICA7OyBE
ZXRlY3QgYSBDb21tb25NYXJrIGNsb3NpbmctYCMnIHNlcXVlbmNlOiBvcHRpb25hbAogICAgICAg
ICAgICAgOzsgdHJhaWxpbmcgd2hpdGVzcGFjZSwgYSBydW4gb2YgYCMnLCBhbmQgYXQgbGVhc3Qg
b25lCiAgICAgICAgICAgICA7OyBzcGFjZS90YWIgYmV0d2VlbiBpdCBhbmQgdGhlIGhlYWRpbmcg
dGV4dC4KICAgICAgICAgICAgIChjbG9zZXIgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAg
ICAgICAgICAgKGdvdG8tY2hhciBsaW5lLWVuZCkKICAgICAgICAgICAgICAgICAgICAgICAoc2tp
cC1jaGFycy1iYWNrd2FyZCAiIFx0IiBvcGVuZXItZW5kKQogICAgICAgICAgICAgICAgICAgICAg
IChsZXQgKChlbmQgKHBvaW50KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAoc2tpcC1jaGFy
cy1iYWNrd2FyZCAiIyIgb3BlbmVyLWVuZCkKICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQg
KChiZWcgKHBvaW50KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuIChhbmQgKDwg
YmVnIGVuZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPiBiZWcgb3Bl
bmVyLWVuZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtcSAoY2hh
ci1iZWZvcmUgYmVnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICcoP1xzID9cdCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zIGJlZyBlbmQp
KSkpKSkpCiAgICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICA7OyBSZXNpemUgdGhlIGNs
b3NlciBmaXJzdCBzbyBpdCBkb2Vzbid0IHNoaWZ0IHRoZSBvcGVuZXIuCiAgICAgICAgICAod2hl
biBjbG9zZXIKICAgICAgICAgICAgKGRlbGV0ZS1yZWdpb24gKGNhciBjbG9zZXIpIChjZHIgY2xv
c2VyKSkKICAgICAgICAgICAgKGdvdG8tY2hhciAoY2FyIGNsb3NlcikpCiAgICAgICAgICAgIChp
bnNlcnQgKG1ha2Utc3RyaW5nIG5ldy1sZXZlbCA/IykpKQogICAgICAgICAgKGRlbGV0ZS1yZWdp
b24gb3BlbmVyLWJlZyBvcGVuZXItZW5kKQogICAgICAgICAgKGdvdG8tY2hhciBvcGVuZXItYmVn
KQogICAgICAgICAgKGluc2VydCAobWFrZS1zdHJpbmcgbmV3LWxldmVsID8jKSkpKSkpKQoKKGRl
ZnVuIG1hcmtkb3duLXRzLS1wcm9tb3RlLW9yLWRlbW90ZS1yZWdpb24gKGRlbHRhKQogICJDaGFu
Z2UgYWxsIGhlYWRpbmdzIGluIHRoZSBhY3RpdmUgcmVnaW9uIGJ5IERFTFRBIGxldmVscy4KTmVn
YXRpdmUgREVMVEEgcHJvbW90ZXMgKGZld2VyICMpLCBwb3NpdGl2ZSBkZW1vdGVzIChtb3JlICMp
LiIKICAobGV0ICgoYmVnIChyZWdpb24tYmVnaW5uaW5nKSkKICAgICAgICAoZW5kIChyZWdpb24t
ZW5kKSkpCiAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgKGdvdG8tY2hhciBiZWcpCiAgICAgICh3
aGlsZSAoPCAocG9pbnQpIGVuZCkKICAgICAgICAod2hlbiAobWFya2Rvd24tdHMtLWhlYWRpbmct
YXQtcG9pbnQpCiAgICAgICAgICAobWFya2Rvd24tdHMtLXByb21vdGUtb3ItZGVtb3RlIGRlbHRh
KSkKICAgICAgICAoZm9yd2FyZC1saW5lIDEpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLW1vdmUt
c3VidHJlZS11cCAoKQogICJNb3ZlIHRoZSBjdXJyZW50IHNlY3Rpb24gb3IgbGlzdCBpdGVtIHVw
IHBhc3QgdGhlIHByZXZpb3VzIHNpYmxpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAoaWYgKG1hcmtk
b3duLXRzLS1saXN0LWl0ZW0tYXQtcG9pbnQpCiAgICAgIChtYXJrZG93bi10cy0tbGlzdC1tb3Zl
IHQpCiAgICAobWFya2Rvd24tdHMtLW1vdmUtc3VidHJlZS11cC1vci1kb3duIHQpKSkKCihkZWZ1
biBtYXJrZG93bi10cy1tb3ZlLXN1YnRyZWUtZG93biAoKQogICJNb3ZlIHRoZSBjdXJyZW50IHNl
Y3Rpb24gb3IgbGlzdCBpdGVtIGRvd24gcGFzdCB0aGUgbmV4dCBzaWJsaW5nLiIKICAoaW50ZXJh
Y3RpdmUpCiAgKGlmIChtYXJrZG93bi10cy0tbGlzdC1pdGVtLWF0LXBvaW50KQogICAgICAobWFy
a2Rvd24tdHMtLWxpc3QtbW92ZSBuaWwpCiAgICAobWFya2Rvd24tdHMtLW1vdmUtc3VidHJlZS11
cC1vci1kb3duIG5pbCkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1zZWN0aW9uLWZvbGRlZC1wIChz
ZWN0aW9uKQogICJSZXR1cm4gbm9uLW5pbCBpZiBTRUNUSU9OJ3MgaGVhZGluZyBpcyBmb2xkZWQu
CkNoZWNrcyB3aGV0aGVyIHRoZSBlbmQgb2YgdGhlIGhlYWRpbmcgbGluZSBoYXMgYW4gb3V0bGlu
ZQppbnZpc2libGUgb3ZlcmxheS4iCiAgKGxldCAoKGhlYWRpbmcgKHRyZWVzaXQtbm9kZS1jaGls
ZCBzZWN0aW9uIDApKSkKICAgICh3aGVuIChhbmQgaGVhZGluZwogICAgICAgICAgICAgICAoZXF1
YWwgKHRyZWVzaXQtbm9kZS10eXBlIGhlYWRpbmcpICJhdHhfaGVhZGluZyIpKQogICAgICAoc2F2
ZS1leGN1cnNpb24KICAgICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtc3RhcnQgaGVhZGlu
ZykpCiAgICAgICAgKG91dGxpbmUtaW52aXNpYmxlLXAgKHBvcy1lb2wpKSkpKSkKCihkZWZ1biBt
YXJrZG93bi10cy0tbW92ZS1zdWJ0cmVlLXVwLW9yLWRvd24gKHVwKQogICJNb3ZlIHRoZSBjdXJy
ZW50IHNlY3Rpb24gc3VidHJlZS4KSWYgVVAgaXMgbm9uLW5pbCwgbW92ZSBwYXN0IHRoZSBwcmV2
aW91cyBzaWJsaW5nOyBvdGhlcndpc2UgbW92ZSBkb3duLgpQcmVzZXJ2ZXMgdGhlIGZvbGRpbmcg
c3RhdGUgb2YgYm90aCBzZWN0aW9ucy4iCiAgKHdoZW4tbGV0KiAoKHNlY3Rpb24gKG1hcmtkb3du
LXRzLS1zZWN0aW9uLWF0LXBvaW50KSkKICAgICAgICAgICAgICAoc2libGluZyAoaWYgdXAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1wcmV2LXNpYmxpbmcgc2VjdGlv
bikKICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtbmV4dC1zaWJsaW5nIHNl
Y3Rpb24pKSkpCiAgICAod2hlbiAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlIHNpYmxpbmcpICJz
ZWN0aW9uIikKICAgICAgKGxldCogKChmaXJzdCAoaWYgdXAgc2libGluZyBzZWN0aW9uKSkKICAg
ICAgICAgICAgIChzZWNvbmQgKGlmIHVwIHNlY3Rpb24gc2libGluZykpCiAgICAgICAgICAgICAo
Zmlyc3QtZm9sZGVkIChtYXJrZG93bi10cy0tc2VjdGlvbi1mb2xkZWQtcCBmaXJzdCkpCiAgICAg
ICAgICAgICAoc2Vjb25kLWZvbGRlZCAobWFya2Rvd24tdHMtLXNlY3Rpb24tZm9sZGVkLXAgc2Vj
b25kKSkKICAgICAgICAgICAgIChmaXJzdC1zdGFydCAodHJlZXNpdC1ub2RlLXN0YXJ0IGZpcnN0
KSkKICAgICAgICAgICAgIChzZWNvbmQtc3RhcnQgKHRyZWVzaXQtbm9kZS1zdGFydCBzZWNvbmQp
KQogICAgICAgICAgICAgKHNlY29uZC1lbmQgKHRyZWVzaXQtbm9kZS1lbmQgc2Vjb25kKSkKICAg
ICAgICAgICAgIDs7IEV4dHJhY3Qgc2VwYXJhdG9yIGJldHdlZW4gaXRlbXMgYW5kIHRyYWlsaW5n
IHdoaXRlc3BhY2UuCiAgICAgICAgICAgICAoZmlyc3QtcmF3IChidWZmZXItc3Vic3RyaW5nIGZp
cnN0LXN0YXJ0IHNlY29uZC1zdGFydCkpCiAgICAgICAgICAgICAoZmlyc3QtdGV4dCAoc3RyaW5n
LXRyaW0tcmlnaHQgZmlyc3QtcmF3KSkKICAgICAgICAgICAgIChzZXBhcmF0b3IgKHN1YnN0cmlu
ZyBmaXJzdC1yYXcgKGxlbmd0aCBmaXJzdC10ZXh0KSkpCiAgICAgICAgICAgICAoc2Vjb25kLXJh
dyAoYnVmZmVyLXN1YnN0cmluZyBzZWNvbmQtc3RhcnQgc2Vjb25kLWVuZCkpCiAgICAgICAgICAg
ICAoc2Vjb25kLXRleHQgKHN0cmluZy10cmltLXJpZ2h0IHNlY29uZC1yYXcpKQogICAgICAgICAg
ICAgKHRyYWlsaW5nIChzdWJzdHJpbmcgc2Vjb25kLXJhdyAobGVuZ3RoIHNlY29uZC10ZXh0KSkp
CiAgICAgICAgICAgICAobGluZS1vZmZzZXQgKC0gKGxpbmUtbnVtYmVyLWF0LXBvcyAocG9pbnQp
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5lLW51bWJlci1hdC1wb3MgKHRyZWVz
aXQtbm9kZS1zdGFydCBzZWN0aW9uKSkpKSkKICAgICAgICAoZGVsZXRlLXJlZ2lvbiBmaXJzdC1z
dGFydCBzZWNvbmQtZW5kKQogICAgICAgIChnb3RvLWNoYXIgZmlyc3Qtc3RhcnQpCiAgICAgICAg
KGluc2VydCBzZWNvbmQtdGV4dCBzZXBhcmF0b3IgZmlyc3QtdGV4dCB0cmFpbGluZykKICAgICAg
ICA7OyBSZXN0b3JlIGZvbGRpbmcgc3RhdGUKICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAg
ICAgIChnb3RvLWNoYXIgZmlyc3Qtc3RhcnQpCiAgICAgICAgICAod2hlbiAob3V0bGluZS1vbi1o
ZWFkaW5nLXApCiAgICAgICAgICAgIChpZiBzZWNvbmQtZm9sZGVkCiAgICAgICAgICAgICAgICAo
b3V0bGluZS1oaWRlLXN1YnRyZWUpCiAgICAgICAgICAgICAgKG91dGxpbmUtc2hvdy1zdWJ0cmVl
KSkpCiAgICAgICAgICAob3V0bGluZS1uZXh0LWhlYWRpbmcpCiAgICAgICAgICAod2hlbiAob3V0
bGluZS1vbi1oZWFkaW5nLXApCiAgICAgICAgICAgIChpZiBmaXJzdC1mb2xkZWQKICAgICAgICAg
ICAgICAgIChvdXRsaW5lLWhpZGUtc3VidHJlZSkKICAgICAgICAgICAgICAob3V0bGluZS1zaG93
LXN1YnRyZWUpKSkpCiAgICAgICAgKGdvdG8tY2hhciAoaWYgdXAKICAgICAgICAgICAgICAgICAg
ICAgICBmaXJzdC1zdGFydAogICAgICAgICAgICAgICAgICAgICAoKyBmaXJzdC1zdGFydCAobGVu
Z3RoIHNlY29uZC10ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoIHNlcGFyYXRv
cikpKSkKICAgICAgICAod2l0aC1zdXBwcmVzc2VkLXdhcm5pbmdzICgoaW50ZXJhY3RpdmUtb25s
eSBuZXh0LWxpbmUpKQogICAgICAgICAgKG5leHQtbGluZSBsaW5lLW9mZnNldCkpKSkpKQoKOzs7
IExpc3QgbWFuaXB1bGF0aW9uOgoKKGRlZnVuIG1hcmtkb3duLXRzLXRvZ2dsZS1jaGVja2JveCAo
KQogICJUb2dnbGUgdGhlIHRhc2sgbGlzdCBjaGVja2JveCBvbiB0aGUgY3VycmVudCBsaW5lLgpT
d2l0Y2hlcyBiZXR3ZWVuIGBbIF0nIGFuZCBgW3hdJy4iCiAgKGludGVyYWN0aXZlKQogICh3aGVu
LWxldCogKChwb3MgKHNhdmUtZXhjdXJzaW9uIChiYWNrLXRvLWluZGVudGF0aW9uKSAocG9pbnQp
KSkKICAgICAgICAgICAgICAobm9kZSAodHJlZXNpdC1ub2RlLWF0IHBvcyAnbWFya2Rvd24pKQog
ICAgICAgICAgICAgIChpdGVtICh0cmVlc2l0LXBhcmVudC11bnRpbAogICAgICAgICAgICAgICAg
ICAgICBub2RlIChsYW1iZGEgKG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWwg
KHRyZWVzaXQtbm9kZS10eXBlIG4pICJsaXN0X2l0ZW0iKSkpKSkKICAgICh3aGVuLWxldCogKCht
YXJrZXIgKHNlcS1maW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChjaGlsZCkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbWJlciAodHJlZXNpdC1ub2RlLXR5cGUgY2hp
bGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygidGFza19saXN0X21hcmtl
cl9jaGVja2VkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhc2tfbGlz
dF9tYXJrZXJfdW5jaGVja2VkIikpKQogICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQt
bm9kZS1jaGlsZHJlbiBpdGVtKSkpKQogICAgICAobGV0ICgoYmVnICh0cmVlc2l0LW5vZGUtc3Rh
cnQgbWFya2VyKSkKICAgICAgICAgICAgKGVuZCAodHJlZXNpdC1ub2RlLWVuZCBtYXJrZXIpKQog
ICAgICAgICAgICAoY2hlY2tlZCAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlIG1hcmtlcikKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXNrX2xpc3RfbWFya2VyX2NoZWNrZWQiKSkpCiAg
ICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAoZ290by1jaGFyIGJlZykKICAgICAgICAg
IChkZWxldGUtcmVnaW9uIGJlZyBlbmQpCiAgICAgICAgICAoaW5zZXJ0IChpZiBjaGVja2VkICJb
IF0iICJbeF0iKSkpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1saXN0LWl0ZW0tYXQtcG9pbnQg
KCkKICAiUmV0dXJuIHRoZSBpbm5lcm1vc3QgbGlzdF9pdGVtIG5vZGUgY29udGFpbmluZyBwb2lu
dCwgb3IgbmlsLgpVc2VzIHRoZSBwb3NpdGlvbiBhZnRlciBgYmFjay10by1pbmRlbnRhdGlvbicg
c28gdGhhdCBwb2ludCBpbgphIGxpbmUncyBsZWFkaW5nIHdoaXRlc3BhY2UgcmVzb2x2ZXMgdG8g
dGhlIGl0ZW0gb24gdGhhdCBsaW5lLApub3QgdG8gYSBwcmVjZWRpbmcgaXRlbSB3aG9zZSBub2Rl
IHNwYW5zIHRoZSB3aGl0ZXNwYWNlLgpJbnNpZGUgYmxvY2sgcXVvdGVzLCBhbHNvIHRyeSBmcm9t
IHRoZSBjb250ZW50IHBvc2l0aW9uIHBhc3QKdGhlIGA+JyBtYXJrZXJzLiIKICAod2hlbi1sZXQq
ICgocG9zIChzYXZlLWV4Y3Vyc2lvbiAoYmFjay10by1pbmRlbnRhdGlvbikgKHBvaW50KSkpCiAg
ICAgICAgICAgICAgKG5vZGUgKHRyZWVzaXQtbm9kZS1hdCBwb3MgJ21hcmtkb3duKSkKICAgICAg
ICAgICAgICAoYm9sIChsaW5lLWJlZ2lubmluZy1wb3NpdGlvbikpCiAgICAgICAgICAgICAgKGVv
bCAobGluZS1lbmQtcG9zaXRpb24pKSkKICAgIChvciAobGV0ICgoaXRlbSAodHJlZXNpdC1wYXJl
bnQtdW50aWwKICAgICAgICAgICAgICAgICAgICAgbm9kZSAobGFtYmRhIChuKQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBuKSAibGlzdF9pdGVt
IikpKSkpCiAgICAgICAgICA7OyBWZXJpZnkgdGhlIGN1cnJlbnQgbGluZSBpcyB3aXRoaW4gdGhl
IGl0ZW0ncyByYW5nZS4KICAgICAgICAgIDs7IGB0cmVlc2l0LW5vZGUtYXQnIGNhbiByZXR1cm4g
YSBub2RlIGluc2lkZSBhIGxpc3RfaXRlbQogICAgICAgICAgOzsgZXZlbiB3aGVuIHBvaW50IGlz
IG9uIGEgcHJlY2VkaW5nIGxpbmUuCiAgICAgICAgICAod2hlbiAoYW5kIGl0ZW0KICAgICAgICAg
ICAgICAgICAgICAgKDw9ICh0cmVlc2l0LW5vZGUtc3RhcnQgaXRlbSkgZW9sKQogICAgICAgICAg
ICAgICAgICAgICAoPj0gKHRyZWVzaXQtbm9kZS1lbmQgaXRlbSkgYm9sKSkKICAgICAgICAgICAg
aXRlbSkpCiAgICAgICAgOzsgV2hlbiBiYWNrLXRvLWluZGVudGF0aW9uIGxhbmRzIG9uIGJsb2Nr
IHF1b3RlIG1hcmtlcnMsCiAgICAgICAgOzsgc2tpcCBwYXN0IHRoZW0gYW5kIHRyeSBmcm9tIHRo
ZSBjb250ZW50IHBvc2l0aW9uLgogICAgICAgIChsZXQgKChjb250ZW50LXBvcyAoc2F2ZS1leGN1
cnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiPiBcdCIpCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50KSkpKQogICAgICAgICAgKHdoZW4gKD4g
Y29udGVudC1wb3MgcG9zKQogICAgICAgICAgICAod2hlbi1sZXQqICgoY25vZGUgKHRyZWVzaXQt
bm9kZS1hdCBjb250ZW50LXBvcyAnbWFya2Rvd24pKSkKICAgICAgICAgICAgICAobGV0ICgoaXRl
bSAodHJlZXNpdC1wYXJlbnQtdW50aWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY25vZGUK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAobikKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlIG4pICJsaXN0X2l0ZW0iKSkpKSkK
ICAgICAgICAgICAgICAgICh3aGVuIChhbmQgaXRlbQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAoPD0gKHRyZWVzaXQtbm9kZS1zdGFydCBpdGVtKSBlb2wpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICg+PSAodHJlZXNpdC1ub2RlLWVuZCBpdGVtKSBib2wpKQogICAgICAgICAgICAgICAg
ICBpdGVtKSkpKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tbGlzdC1tYXJrZXItd2lkdGggKGl0
ZW0pCiAgIlJldHVybiB0aGUgd2lkdGggb2YgSVRFTSdzIGxpc3QgbWFya2VyIGluY2x1ZGluZyB0
cmFpbGluZyBzcGFjZS4iCiAgKGxldCAoKG1hcmtlciAodHJlZXNpdC1ub2RlLWNoaWxkIGl0ZW0g
MCkpKQogICAgKC0gKHRyZWVzaXQtbm9kZS1lbmQgbWFya2VyKSAodHJlZXNpdC1ub2RlLXN0YXJ0
IG1hcmtlcikpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tbGlzdC1pdGVtLXJlZ2lvbiAoaXRlbSkK
ICAiUmV0dXJuIHRoZSAoQkVHIC4gRU5EKSByZWdpb24gZm9yIElURU0sIGNsYW1wZWQgdG8gZnVs
bCBsaW5lcy4KQkVHIHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGNvbnRhaW5p
bmcgdGhlIGl0ZW0uCkVORCBpcyBjbGFtcGVkIHNvIGl0IGRvZXMgbm90IGV4dGVuZCBpbnRvIHRo
ZSBuZXh0IGxpbmUncwppbmRlbnRhdGlvbiwgd2hpY2ggdHJlZS1zaXR0ZXIgbWF5IGluY2x1ZGUg
aW4gdGhlIG5vZGUuIgogIChsZXQgKChiZWcgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAg
IChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1zdGFydCBpdGVtKSkKICAgICAgICAgICAgICAgKGxp
bmUtYmVnaW5uaW5nLXBvc2l0aW9uKSkpCiAgICAgICAgKGVuZCAoc2F2ZS1leGN1cnNpb24KICAg
ICAgICAgICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLWVuZCBpdGVtKSkKICAgICAgICAg
ICAgICAgKGlmIChib2xwKSAocG9pbnQpIChsaW5lLWJlZ2lubmluZy1wb3NpdGlvbikpKSkpCiAg
ICAoY29ucyBiZWcgZW5kKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWxpc3Qtb3JkZXJlZC1pdGVt
LXAgKGl0ZW0pCiAgIlJldHVybiBub24tbmlsIGlmIElURU0gaXMgYW4gb3JkZXJlZCAobnVtYmVy
ZWQpIGxpc3QgaXRlbS4iCiAgKGxldCAoKG1hcmtlciAodHJlZXNpdC1ub2RlLWNoaWxkIGl0ZW0g
MCkpKQogICAgKG1lbWJlciAodHJlZXNpdC1ub2RlLXR5cGUgbWFya2VyKQogICAgICAgICAgICAn
KCJsaXN0X21hcmtlcl9kb3QiICJsaXN0X21hcmtlcl9wYXJlbnRoZXNpcyIpKSkpCgooZGVmdW4g
bWFya2Rvd24tdHMtLWxpc3QtcHJvbW90ZS1vci1kZW1vdGUgKGRlbW90ZSkKICAiQ2hhbmdlIG5l
c3Rpbmcgb2YgdGhlIGxpc3QgaXRlbSBhdCBwb2ludC4KSWYgREVNT1RFIGlzIG5vbi1uaWwsIGRl
bW90ZSAoaW5kZW50KTsgb3RoZXJ3aXNlIHByb21vdGUgKGRlZGVudCkuCk9yZGVyZWQgKG51bWJl
cmVkKSBsaXN0IGl0ZW1zIGFyZSBza2lwcGVkIGJlY2F1c2UgdGhlIGdyYW1tYXIgZG9lcwpub3Qg
c3VwcG9ydCBuZXN0aW5nIHRoZW0gYnkgaW5kZW50YXRpb24uIgogICh3aGVuLWxldCogKChpdGVt
IChtYXJrZG93bi10cy0tbGlzdC1pdGVtLWF0LXBvaW50KSkKICAgICAgICAgICAgICAocmVnaW9u
IChtYXJrZG93bi10cy0tbGlzdC1pdGVtLXJlZ2lvbiBpdGVtKSkKICAgICAgICAgICAgICAoYmVn
IChjYXIgcmVnaW9uKSkKICAgICAgICAgICAgICAoZW5kIChjZHIgcmVnaW9uKSkpCiAgICAod2hl
biAobWFya2Rvd24tdHMtLWxpc3Qtb3JkZXJlZC1pdGVtLXAgaXRlbSkKICAgICAgKHVzZXItZXJy
b3IgIk9yZGVyZWQgbGlzdCBpdGVtcyBjYW5ub3QgYmUgbmVzdGVkIChncmFtbWFyIGxpbWl0YXRp
b24pIikpCiAgICAoaWYgZGVtb3RlCiAgICAgICAgOzsgRGVtb3RlOiBpbmRlbnQgYnkgbWFya2Vy
IHdpZHRoLCBvbmx5IGlmIHRoZXJlIGlzIGEgcHJldmlvdXMKICAgICAgICA7OyBzaWJsaW5nIHRv
IG5lc3QgdW5kZXIgKGxpa2Ugb3JnLW1vZGUpLgogICAgICAgICh3aGVuICh0cmVlc2l0LW5vZGUt
cHJldi1zaWJsaW5nIGl0ZW0pCiAgICAgICAgICAoaW5kZW50LXJpZ2lkbHkgYmVnIGVuZCAobWFy
a2Rvd24tdHMtLWxpc3QtbWFya2VyLXdpZHRoIGl0ZW0pKSkKICAgICAgOzsgUHJvbW90ZTogZGVk
ZW50IHRvIGdyYW5kcGFyZW50IGxldmVsLgogICAgICAobGV0KiAoKHBhcmVudC1saXN0ICh0cmVl
c2l0LW5vZGUtcGFyZW50IGl0ZW0pKQogICAgICAgICAgICAgKGdyYW5kcGFyZW50IChhbmQgcGFy
ZW50LWxpc3QgKHRyZWVzaXQtbm9kZS1wYXJlbnQgcGFyZW50LWxpc3QpKSkKICAgICAgICAgICAg
IChpdGVtLWNvbCAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgIChnb3Rv
LWNoYXIgYmVnKSAoY3VycmVudC1pbmRlbnRhdGlvbikpKSkKICAgICAgICAod2hlbiAoYW5kIGdy
YW5kcGFyZW50CiAgICAgICAgICAgICAgICAgICAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlIGdy
YW5kcGFyZW50KSAibGlzdF9pdGVtIikKICAgICAgICAgICAgICAgICAgICg+IGl0ZW0tY29sIDAp
KQogICAgICAgICAgKGxldCAoKGdwLWNvbCAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAg
ICAgICAgICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtc3RhcnQgZ3JhbmRwYXJlbnQpKQog
ICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LWluZGVudGF0aW9uKSkpKQogICAgICAg
ICAgICAoaW5kZW50LXJpZ2lkbHkgYmVnIGVuZCAoLSBncC1jb2wgaXRlbS1jb2wpKSkpKSkpKQoK
KGRlZnVuIG1hcmtkb3duLXRzLS1saXN0LW5vZGUtYm9sIChub2RlKQogICJSZXR1cm4gdGhlIGJl
Z2lubmluZyBvZiB0aGUgbGluZSBjb250YWluaW5nIE5PREUncyBzdGFydC4iCiAgKHNhdmUtZXhj
dXJzaW9uCiAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAobGlu
ZS1iZWdpbm5pbmctcG9zaXRpb24pKSkKCihkZWZ1biBtYXJrZG93bi10cy0tbGlzdC1tb3ZlICh1
cCkKICAiTW92ZSB0aGUgbGlzdCBpdGVtIGF0IHBvaW50LgpJZiBVUCBpcyBub24tbmlsLCBtb3Zl
IHBhc3QgdGhlIHByZXZpb3VzIHNpYmxpbmc7IG90aGVyd2lzZSBtb3ZlIGRvd24uIgogICh3aGVu
LWxldCogKChpdGVtIChtYXJrZG93bi10cy0tbGlzdC1pdGVtLWF0LXBvaW50KSkKICAgICAgICAg
ICAgICAoc2libGluZyAoaWYgdXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQt
bm9kZS1wcmV2LXNpYmxpbmcgaXRlbSkKICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0
LW5vZGUtbmV4dC1zaWJsaW5nIGl0ZW0pKSkpCiAgICAod2hlbiAoZXF1YWwgKHRyZWVzaXQtbm9k
ZS10eXBlIHNpYmxpbmcpICJsaXN0X2l0ZW0iKQogICAgICAobGV0KiAoKGZpcnN0IChpZiB1cCBz
aWJsaW5nIGl0ZW0pKQogICAgICAgICAgICAgKHNlY29uZCAoaWYgdXAgaXRlbSBzaWJsaW5nKSkK
ICAgICAgICAgICAgIChmaXJzdC1zdGFydCAobWFya2Rvd24tdHMtLWxpc3Qtbm9kZS1ib2wgZmly
c3QpKQogICAgICAgICAgICAgKHNlY29uZC1zdGFydCAobWFya2Rvd24tdHMtLWxpc3Qtbm9kZS1i
b2wgc2Vjb25kKSkKICAgICAgICAgICAgIChzZWNvbmQtZW5kICh0cmVlc2l0LW5vZGUtZW5kIHNl
Y29uZCkpCiAgICAgICAgICAgICA7OyBFeHRyYWN0IHNlcGFyYXRvciBiZXR3ZWVuIGl0ZW1zIGFu
ZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAgICAgICAgICAgKGZpcnN0LXJhdyAoYnVmZmVyLXN1
YnN0cmluZyBmaXJzdC1zdGFydCBzZWNvbmQtc3RhcnQpKQogICAgICAgICAgICAgKGZpcnN0LXRl
eHQgKHN0cmluZy10cmltLXJpZ2h0IGZpcnN0LXJhdykpCiAgICAgICAgICAgICAoc2VwYXJhdG9y
IChzdWJzdHJpbmcgZmlyc3QtcmF3IChsZW5ndGggZmlyc3QtdGV4dCkpKQogICAgICAgICAgICAg
KHNlY29uZC1yYXcgKGJ1ZmZlci1zdWJzdHJpbmcgc2Vjb25kLXN0YXJ0IHNlY29uZC1lbmQpKQog
ICAgICAgICAgICAgKHNlY29uZC10ZXh0IChzdHJpbmctdHJpbS1yaWdodCBzZWNvbmQtcmF3KSkK
ICAgICAgICAgICAgICh0cmFpbGluZyAoc3Vic3RyaW5nIHNlY29uZC1yYXcgKGxlbmd0aCBzZWNv
bmQtdGV4dCkpKQogICAgICAgICAgICAgKGxpbmUtb2Zmc2V0ICgtIChsaW5lLW51bWJlci1hdC1w
b3MgKHBvaW50KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGluZS1udW1iZXItYXQt
cG9zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtc3RhcnQgaXRl
bSkpKSkpCiAgICAgICAgKGRlbGV0ZS1yZWdpb24gZmlyc3Qtc3RhcnQgc2Vjb25kLWVuZCkKICAg
ICAgICAoZ290by1jaGFyIGZpcnN0LXN0YXJ0KQogICAgICAgIChpbnNlcnQgc2Vjb25kLXRleHQg
c2VwYXJhdG9yIGZpcnN0LXRleHQgdHJhaWxpbmcpCiAgICAgICAgKGdvdG8tY2hhciAoaWYgdXAK
ICAgICAgICAgICAgICAgICAgICAgICBmaXJzdC1zdGFydAogICAgICAgICAgICAgICAgICAgICAo
KyBmaXJzdC1zdGFydCAobGVuZ3RoIHNlY29uZC10ZXh0KQogICAgICAgICAgICAgICAgICAgICAg
ICAobGVuZ3RoIHNlcGFyYXRvcikpKSkKICAgICAgICAod2l0aC1zdXBwcmVzc2VkLXdhcm5pbmdz
ICgoaW50ZXJhY3RpdmUtb25seSBuZXh0LWxpbmUpKQogICAgICAgICAgKG5leHQtbGluZSBsaW5l
LW9mZnNldCkpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXJlbnVtYmVyLWxpc3QgKCZvcHRpb25h
bCBzdGFydCkKICAiUmVudW1iZXIgdGhlIG9yZGVyZWQgbGlzdCBhdCBwb2ludC4KTnVtYmVycyBh
cmUgYXNzaWduZWQgc2VxdWVudGlhbGx5IHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IGl0ZW0ncwpu
dW1iZXIuICBXaXRoIGEgcHJlZml4IGFyZ3VtZW50IFNUQVJULCBzdGFydCBudW1iZXJpbmcgZnJv
bSB0aGF0CnZhbHVlIGluc3RlYWQuICBEb2VzIG5vdGhpbmcgZm9yIHVub3JkZXJlZCBsaXN0cy4i
CiAgKGludGVyYWN0aXZlICJQIikKICAod2hlbi1sZXQqICgoaXRlbSAobWFya2Rvd24tdHMtLWxp
c3QtaXRlbS1hdC1wb2ludCkpCiAgICAgICAgICAgICAgKGxpc3Qtbm9kZSAodHJlZXNpdC1ub2Rl
LXBhcmVudCBpdGVtKSkpCiAgICAod2hlbiAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlIGxpc3Qt
bm9kZSkgImxpc3QiKQogICAgICAobGV0KiAoKGNoaWxkcmVuICh0cmVlc2l0LW5vZGUtY2hpbGRy
ZW4gbGlzdC1ub2RlKSkKICAgICAgICAgICAgIChpdGVtcyAoc2VxLWZpbHRlciAobGFtYmRhIChu
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxdWFsICh0cmVlc2l0LW5vZGUt
dHlwZSBuKSAibGlzdF9pdGVtIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hp
bGRyZW4pKQogICAgICAgICAgICAgKGZpcnN0LW1hcmtlciAodHJlZXNpdC1ub2RlLWNoaWxkIChj
YXIgaXRlbXMpIDApKQogICAgICAgICAgICAgKG1hcmtlci10eXBlICh0cmVlc2l0LW5vZGUtdHlw
ZSBmaXJzdC1tYXJrZXIpKSkKICAgICAgICAod2hlbiAobWVtYmVyIG1hcmtlci10eXBlICcoImxp
c3RfbWFya2VyX2RvdCIgImxpc3RfbWFya2VyX3BhcmVudGhlc2lzIikpCiAgICAgICAgICAobGV0
KiAoKGJhc2UgKGlmIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmVmaXgtbnVt
ZXJpYy12YWx1ZSBzdGFydCkKICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctdG8tbnVt
YmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS10ZXh0IGZpcnN0LW1h
cmtlciB0KSkpKQogICAgICAgICAgICAgICAgIChjb3VudCAobGVuZ3RoIGl0ZW1zKSkKICAgICAg
ICAgICAgICAgICA7OyBTdGFydCBmcm9tIHRoZSBsYXN0IG51bWJlciBhbmQgd29yayBiYWNrd2Fy
ZHMgc28KICAgICAgICAgICAgICAgICA7OyB0aGF0IGVhcmxpZXIgYnVmZmVyIHBvc2l0aW9ucyBy
ZW1haW4gdmFsaWQuCiAgICAgICAgICAgICAgICAgKG51bSAoKyBiYXNlIGNvdW50IC0xKSkpCiAg
ICAgICAgICAgIChkb2xpc3QgKGl0IChyZXZlcnNlIGl0ZW1zKSkKICAgICAgICAgICAgICAobGV0
KiAoKG1hcmtlciAodHJlZXNpdC1ub2RlLWNoaWxkIGl0IDApKQogICAgICAgICAgICAgICAgICAg
ICAobWFya2VyLWVuZCAodHJlZXNpdC1ub2RlLWVuZCBtYXJrZXIpKQogICAgICAgICAgICAgICAg
ICAgICAoYm9sIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdv
dG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IG1hcmtlcikpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAobGluZS1iZWdpbm5pbmctcG9zaXRpb24pKSkKICAgICAgICAgICAgICAgICAgICAg
OzsgRnVsbCB0ZXh0IGZyb20gYm9sIHRvIGVuZCBvZiBtYXJrZXIgaW5jbHVkZXMKICAgICAgICAg
ICAgICAgICAgICAgOzsgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSwgdGhlIG51bWJlciwgYW5kIHRo
ZQogICAgICAgICAgICAgICAgICAgICA7OyBzZXBhcmF0b3IgKGUuZy4sICIuICIgb3IgIi5cdCIp
LgogICAgICAgICAgICAgICAgICAgICAoZnVsbC10ZXh0IChidWZmZXItc3Vic3RyaW5nLW5vLXBy
b3BlcnRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sIG1hcmtlci1lbmQp
KQogICAgICAgICAgICAgICAgICAgICAoaW5kZW50LXN0cgogICAgICAgICAgICAgICAgICAgICAg
KGlmIChzdHJpbmctbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYFxcKFtbOmJs
YW5rOl1dKlxcKVswLTldIiBmdWxsLXRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1h
dGNoLXN0cmluZyAxIGZ1bGwtdGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgIiIpKQogICAg
ICAgICAgICAgICAgICAgICAoc3VmZml4LXN0cgogICAgICAgICAgICAgICAgICAgICAgKGlmIChz
dHJpbmctbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYFtbOmJsYW5rOl1dKlsw
LTldK1xcKC4qXFwpXFwnIiBmdWxsLXRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1h
dGNoLXN0cmluZyAxIGZ1bGwtdGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgIi4gIikpCiAg
ICAgICAgICAgICAgICAgICAgIChuZXctdGV4dCAoY29uY2F0IGluZGVudC1zdHIKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bWJlci10by1zdHJpbmcgbnVtKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXgtc3RyKSkpCiAgICAgICAg
ICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAgKGRlbGV0ZS1yZWdpb24g
Ym9sIG1hcmtlci1lbmQpCiAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgYm9sKQogICAgICAg
ICAgICAgICAgICAoaW5zZXJ0IG5ldy10ZXh0KSkpCiAgICAgICAgICAgICAgKGNsLWRlY2YgbnVt
KSkKICAgICAgICAgICAgKG1lc3NhZ2UgIlJlbnVtYmVyZWQgJWQgaXRlbXMiIGNvdW50KSkpKSkp
KQoKKGRlZnVuIG1hcmtkb3duLXRzLS1saXN0LWl0ZW0tbmV3LW1hcmtlciAoaXRlbSkKICAiUmV0
dXJuIHRoZSBtYXJrZXIgc3RyaW5nIGZvciBhIG5ldyBpdGVtIGZvbGxvd2luZyBJVEVNLgpGb3Ig
dW5vcmRlcmVkIGl0ZW1zLCByZXVzZSB0aGUgc2FtZSBtYXJrZXIgY2hhcmFjdGVyLgpGb3Igb3Jk
ZXJlZCBpdGVtcywgaW5jcmVtZW50IHRoZSBudW1iZXIuIgogIChsZXQqICgobWFya2VyICh0cmVl
c2l0LW5vZGUtY2hpbGQgaXRlbSAwKSkKICAgICAgICAgKHR5cGUgKHRyZWVzaXQtbm9kZS10eXBl
IG1hcmtlcikpCiAgICAgICAgIChpbmRlbnQgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAg
ICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtc3RhcnQgaXRlbSkpCiAgICAgICAgICAgICAg
ICAgICAoY3VycmVudC1pbmRlbnRhdGlvbikpKQogICAgICAgICAocHJlZml4IChtYWtlLXN0cmlu
ZyBpbmRlbnQgP1xzKSkpCiAgICAocGNhc2UgdHlwZQogICAgICAoImxpc3RfbWFya2VyX21pbnVz
IiAoY29uY2F0IHByZWZpeCAiLSAiKSkKICAgICAgKCJsaXN0X21hcmtlcl9wbHVzIiAgKGNvbmNh
dCBwcmVmaXggIisgIikpCiAgICAgICgibGlzdF9tYXJrZXJfc3RhciIgIChjb25jYXQgcHJlZml4
ICIqICIpKQogICAgICAoImxpc3RfbWFya2VyX2RvdCIKICAgICAgIChsZXQgKChudW0gKHN0cmlu
Zy10by1udW1iZXIgKHRyZWVzaXQtbm9kZS10ZXh0IG1hcmtlciB0KSkpKQogICAgICAgICAoY29u
Y2F0IHByZWZpeCAobnVtYmVyLXRvLXN0cmluZyAoMSsgbnVtKSkgIi4gIikpKQogICAgICAoImxp
c3RfbWFya2VyX3BhcmVudGhlc2lzIgogICAgICAgKGxldCAoKG51bSAoc3RyaW5nLXRvLW51bWJl
ciAodHJlZXNpdC1ub2RlLXRleHQgbWFya2VyIHQpKSkpCiAgICAgICAgIChjb25jYXQgcHJlZml4
IChudW1iZXItdG8tc3RyaW5nICgxKyBudW0pKSAiKSAiKSkpCiAgICAgIChfIChjb25jYXQgcHJl
Zml4ICItICIpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1uZXctbWFya2VyLWZvci1saW5lIChp
dGVtKQogICJSZXR1cm4gdGhlIG1hcmtlciBzdHJpbmcgZm9yIGEgbmV3IGl0ZW0gZm9sbG93aW5n
IElURU0uCldoZW4gdGhlIGN1cnJlbnQgbGluZSBoYXMgYSBsaXN0IG1hcmtlciBwYXR0ZXJuIGF0
IGEgZGlmZmVyZW50CmluZGVudGF0aW9uIHRoYW4gSVRFTSAoZS5nLiwgYSBuZXN0ZWQgbWFya2Vy
IHRoYXQgdGhlIGdyYW1tYXIgZGlkCm5vdCByZWNvZ25pemUgYXMgYSBsaXN0X2l0ZW0pLCB1c2Ug
dGhlIGN1cnJlbnQgbGluZSdzIG1hcmtlci4KT3RoZXJ3aXNlLCBmYWxsIGJhY2sgdG8gYG1hcmtk
b3duLXRzLS1saXN0LWl0ZW0tbmV3LW1hcmtlcicuIgogIChsZXQgKChtYXJrZXItbm9kZSAodHJl
ZXNpdC1ub2RlLWNoaWxkIGl0ZW0gMCkpKQogICAgKGlmICg9IChsaW5lLW51bWJlci1hdC1wb3Mp
CiAgICAgICAgICAgIChsaW5lLW51bWJlci1hdC1wb3MgKHRyZWVzaXQtbm9kZS1zdGFydCBtYXJr
ZXItbm9kZSkpKQogICAgICAgIDs7IEl0ZW0ncyBtYXJrZXIgaXMgb24gdGhlIGN1cnJlbnQgbGlu
ZTogdXNlIGl0IG5vcm1hbGx5LgogICAgICAgIChtYXJrZG93bi10cy0tbGlzdC1pdGVtLW5ldy1t
YXJrZXIgaXRlbSkKICAgICAgOzsgSXRlbSdzIG1hcmtlciBpcyBvbiBhIGRpZmZlcmVudCBsaW5l
LiAgVGhlIHBhcnNlciBtYXkgaGF2ZQogICAgICA7OyBmYWlsZWQgdG8gcmVjb2duaXplIGEgbmVz
dGVkIG1hcmtlciAoZS5nLiwgYSBsb25lIGAgIC0gJwogICAgICA7OyBwYXJzZWQgYXMgYSBzZXRl
eHQgaGVhZGluZykuICBSZWFkIHRoZSBjdXJyZW50IGxpbmUuCiAgICAgIChsZXQgKChsaW5lIChi
dWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMKICAgICAgICAgICAgICAgICAgIChsaW5lLWJl
Z2lubmluZy1wb3NpdGlvbikgKGxpbmUtZW5kLXBvc2l0aW9uKSkpKQogICAgICAgIChpZiAoc3Ry
aW5nLW1hdGNoCiAgICAgICAgICAgICAiXFxgXFwoW1s6Ymxhbms6XV0qXFwpXFwoWy0qK10gXFx8
XFwoWzAtOV0rXFwpXFwoWy4pXSBcXClcXCkiCiAgICAgICAgICAgICBsaW5lKQogICAgICAgICAg
ICAobGV0ICgoaW5kZW50IChtYXRjaC1zdHJpbmcgMSBsaW5lKSkKICAgICAgICAgICAgICAgICAg
KG51bSAobWF0Y2gtc3RyaW5nIDMgbGluZSkpCiAgICAgICAgICAgICAgICAgIChzdWZmaXggKG1h
dGNoLXN0cmluZyA0IGxpbmUpKQogICAgICAgICAgICAgICAgICAodW5vcmRlcmVkIChtYXRjaC1z
dHJpbmcgMiBsaW5lKSkpCiAgICAgICAgICAgICAgKGlmIG51bQogICAgICAgICAgICAgICAgICAo
Y29uY2F0IGluZGVudCAobnVtYmVyLXRvLXN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKDErIChzdHJpbmctdG8tbnVtYmVyIG51bSkpKQogICAgICAgICAgICAgICAgICAg
ICAgICAgIHN1ZmZpeCkKICAgICAgICAgICAgICAgIChjb25jYXQgaW5kZW50IHVub3JkZXJlZCkp
KQogICAgICAgICAgOzsgTm8gbWFya2VyIHBhdHRlcm4gb24gY3VycmVudCBsaW5lOiB1c2UgaXRl
bSdzIG1hcmtlci4KICAgICAgICAgIChtYXJrZG93bi10cy0tbGlzdC1pdGVtLW5ldy1tYXJrZXIg
aXRlbSkpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1saW5lLWJsb2NrLXF1b3RlLWRlcHRoICgm
b3B0aW9uYWwgcG9zKQogICJDb3VudCB0aGUgbnVtYmVyIG9mIGA+JyBibG9jayBxdW90ZSBtYXJr
ZXJzIG9uIHRoZSBsaW5lIGF0IFBPUy4iCiAgKHNhdmUtZXhjdXJzaW9uCiAgICAod2hlbiBwb3Mg
KGdvdG8tY2hhciBwb3MpKQogICAgKGJlZ2lubmluZy1vZi1saW5lKQogICAgKGxldCAoKGNvdW50
IDApKQogICAgICAod2hpbGUgKGFuZCAobm90IChlb2xwKSkKICAgICAgICAgICAgICAgICAgKG1l
bXEgKGNoYXItYWZ0ZXIpICcoPz4gP1xzID9cdCkpKQogICAgICAgICh3aGVuIChlcSAoY2hhci1h
ZnRlcikgPz4pCiAgICAgICAgICAoc2V0cSBjb3VudCAoMSsgY291bnQpKSkKICAgICAgICAoZm9y
d2FyZC1jaGFyIDEpKQogICAgICBjb3VudCkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLW5ld2xpbmUg
KCkKICAiSW5zZXJ0IGEgbmV3bGluZSwgY29udGludWluZyB0aGUgY3VycmVudCBjb250ZXh0LgpJ
bnNpZGUgYSBsaXN0IGl0ZW0sIHRoZSBuZXcgbGluZSBpcyBpbmRlbnRlZCB0byB0aGUgaXRlbSdz
IHRleHQKY29sdW1uIHNvIHRoZSBwYXJhZ3JhcGggY29udGludWVzLiAgQSBzZWNvbmQgUkVUIG9u
IGEgYmxhbmsKY29udGludWF0aW9uIGxpbmUgcmVtb3ZlcyB0aGUgaW5kZW50YXRpb24sIGRyb3Bw
aW5nIHBvaW50IHRvCmNvbHVtbiAwIHNvIHRoZSB0cmVlLXNpdHRlciBncmFtbWFyIGVuZHMgdGhl
IGxpc3QuCkluc2lkZSBhIGJsb2NrIHF1b3RlLCB0aGUgbmV3IGxpbmUgaW5jbHVkZXMgdGhlIHF1
b3RlIHByZWZpeC4KT3RoZXJ3aXNlLCBpbnNlcnQgYSBwbGFpbiBuZXdsaW5lLiIKICAoaW50ZXJh
Y3RpdmUpCiAgKGxldCogKChub2RlICh0cmVlc2l0LW5vZGUtYXQKICAgICAgICAgICAgICAgIChz
YXZlLWV4Y3Vyc2lvbiAoYmFjay10by1pbmRlbnRhdGlvbikgKHBvaW50KSkKICAgICAgICAgICAg
ICAgICdtYXJrZG93bikpCiAgICAgICAgIDs7IFRyZWUtc2l0dGVyIG1heSByZXBvcnQgYSBub2Rl
IGluc2lkZSBhIGJsb2NrX3F1b3RlIGV2ZW4KICAgICAgICAgOzsgd2hlbiBwb2ludCBpcyBvbiBh
IGJsYW5rIGxpbmUgcGFzdCB0aGUgcXVvdGUgKHRoZSBub2RlCiAgICAgICAgIDs7IHNwYW4gY2Fu
IGV4dGVuZCBiZXlvbmQgdGhlIGA+JyBsaW5lcykuICBPbmx5IHRyZWF0IHRoZQogICAgICAgICA7
OyBsaW5lIGFzIGluc2lkZSBhIGJsb2NrIHF1b3RlIGlmIGl0IGFjdHVhbGx5IHN0YXJ0cyB3aXRo
CiAgICAgICAgIDs7IGEgYD4nIG1hcmtlci4KICAgICAgICAgKGluLWJxIChhbmQgKHRyZWVzaXQt
cGFyZW50LXVudGlsIG5vZGUgIlxcYGJsb2NrX3F1b3RlXFwnIikKICAgICAgICAgICAgICAgICAg
ICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgKGJlZ2lubmluZy1vZi1s
aW5lKQogICAgICAgICAgICAgICAgICAgICAgIChsb29raW5nLWF0LXAgIlsgXHRdKj4iKSkpKQog
ICAgICAgICAoaXRlbSAobWFya2Rvd24tdHMtLWxpc3QtaXRlbS1hdC1wb2ludCkpKQogICAgKGNv
bmQKICAgICAoaXRlbQogICAgICAobGV0KiAoKGNvbCAobWFya2Rvd24tdHMtLWxpc3QtaXRlbS10
ZXh0LWNvbHVtbiBpdGVtKSkKICAgICAgICAgICAgIChicS1wcmVmaXggKHdoZW4gaW4tYnEgKG1h
cmtkb3duLXRzLS1ibG9jay1xdW90ZS1wcmVmaXgpKSkKICAgICAgICAgICAgIDs7IGBjb2wnIGlz
IHRoZSBhYnNvbHV0ZSBjb2x1bW4gb2YgdGhlIGl0ZW0ncyB0ZXh0LAogICAgICAgICAgICAgOzsg
d2hpY2ggaW5zaWRlIGEgYmxvY2sgcXVvdGUgaW5jbHVkZXMgdGhlICI+ICIgcHJlZml4CiAgICAg
ICAgICAgICA7OyB3aWR0aC4gIFNpbmNlIHdlIGluc2VydCBgYnEtcHJlZml4JyBzZXBhcmF0ZWx5
LCB3ZQogICAgICAgICAgICAgOzsgbXVzdCBzdWJ0cmFjdCBpdHMgbGVuZ3RoIHRvIGF2b2lkIGRv
dWJsaW5nIGl0LgogICAgICAgICAgICAgKGluZGVudCAoLSBjb2wgKGxlbmd0aCAob3IgYnEtcHJl
Zml4ICIiKSkpKQogICAgICAgICAgICAgOzsgVGhlIGN1cnJlbnQgbGluZSBpcyAiYmxhbmsiIGlm
IGl0IGNvbnRhaW5zIG9ubHkKICAgICAgICAgICAgIDs7IHdoaXRlc3BhY2UgKG9yIHF1b3RlIHBy
ZWZpeCArIHdoaXRlc3BhY2UpIGFuZCBubwogICAgICAgICAgICAgOzsgYWN0dWFsIHRleHQgZnJv
bSBhIHByZXZpb3VzIFJFVCdzIGNvbnRpbnVhdGlvbiBpbmRlbnQuCiAgICAgICAgICAgICAoYmxh
bmstbGluZS1wIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChi
ZWdpbm5pbmctb2YtbGluZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9va2luZy1h
dC1wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeWz4gXHRdKiQiKSkpCiAgICAgICAg
ICAgICA7OyBQb2ludCBpcyBiZWZvcmUgdGhlIGl0ZW0ncyB0ZXh0IChhdCBvciBiZWZvcmUgdGhl
CiAgICAgICAgICAgICA7OyBtYXJrZXIpLiAgQSBwbGFpbiBuZXdsaW5lIGlzIGFwcHJvcHJpYXRl
IGhlcmUsIGFkZGluZwogICAgICAgICAgICAgOzsgY29udGludWF0aW9uIGluZGVudCB3b3VsZCBz
aGlmdCB0aGUgZXhpc3RpbmcgY29udGVudAogICAgICAgICAgICAgOzsgdG8gdGhlIHJpZ2h0Lgog
ICAgICAgICAgICAgKGJlZm9yZS10ZXh0LXAgKDw9IChjdXJyZW50LWNvbHVtbikgY29sKSkpCiAg
ICAgICAgKGNvbmQKICAgICAgICAgKGJsYW5rLWxpbmUtcAogICAgICAgICAgOzsgVGhlIHVzZXIg
cHJlc3NlZCBSRVQgb24gYW4gYWxyZWFkeS1ibGFuayBjb250aW51YXRpb24KICAgICAgICAgIDs7
IGxpbmUuICBJbnN0ZWFkIG9mIGFkZGluZyB5ZXQgYW5vdGhlciBpbmRlbnRlZCBibGFuawogICAg
ICAgICAgOzsgbGluZSwgcmVtb3ZlIHRoZSBpbmRlbnRhdGlvbiBhbmQgaW5zZXJ0IGEgcGxhaW4K
ICAgICAgICAgIDs7IG5ld2xpbmUuICBUaGlzIGRyb3BzIHBvaW50IHRvIGNvbHVtbiAwLCB3aGlj
aCBpcyB0aGUKICAgICAgICAgIDs7IG9ubHkgd2F5IHRoZSB0cmVlLXNpdHRlciBtYXJrZG93biBn
cmFtbWFyIGVuZHMgYSBsaXN0OgogICAgICAgICAgOzsgYmxhbmsgbGluZXMgYWxvbmUgZG8gTk9U
IGVuZCBhIGxpc3QsIG9ubHkKICAgICAgICAgIDs7IG5vbi1pbmRlbnRlZCBjb250ZW50IGRvZXMu
ICBTbyB0aGlzIGdpdmVzIHRoZSB1c2VyIGEKICAgICAgICAgIDs7IG5hdHVyYWwgIlJFVCBSRVQg
dG8gZXhpdCB0aGUgbGlzdCIgd29ya2Zsb3cuCiAgICAgICAgICAoZGVsZXRlLXJlZ2lvbiAobGlu
ZS1iZWdpbm5pbmctcG9zaXRpb24pIChsaW5lLWVuZC1wb3NpdGlvbikpCiAgICAgICAgICAobmV3
bGluZSkpCiAgICAgICAgIChiZWZvcmUtdGV4dC1wCiAgICAgICAgICA7OyBQb2ludCBpcyBvbiBv
ciBiZWZvcmUgdGhlIGxpc3QgbWFya2VyOyBqdXN0IGluc2VydCBhCiAgICAgICAgICA7OyBwbGFp
biBuZXdsaW5lIHNvIHRoZSBpdGVtIGlzIHB1c2hlZCBkb3duIHVuY2hhbmdlZC4KICAgICAgICAg
IChuZXdsaW5lKSkKICAgICAgICAgKHQKICAgICAgICAgIChkZWxldGUtaG9yaXpvbnRhbC1zcGFj
ZSkKICAgICAgICAgIChuZXdsaW5lKQogICAgICAgICAgKHdoZW4gYnEtcHJlZml4IChpbnNlcnQg
YnEtcHJlZml4KSkKICAgICAgICAgIChpbnNlcnQgKG1ha2Utc3RyaW5nIGluZGVudCA/XHMpKSkp
KSkKICAgICAoaW4tYnEKICAgICAgKGxldCAoKGJxLXByZWZpeCAobWFya2Rvd24tdHMtLWJsb2Nr
LXF1b3RlLXByZWZpeCkpCiAgICAgICAgICAgIDs7IEEgbGluZSB3aXRoIG9ubHkgcXVvdGUgbWFy
a2VycyBhbmQgd2hpdGVzcGFjZSAoZS5nLiwKICAgICAgICAgICAgOzsgIj4gIikgaXMgImJsYW5r
IiBpbnNpZGUgdGhlIHF1b3RlLiAgUkVUIGhlcmUgZXhpdHMgdGhlCiAgICAgICAgICAgIDs7IHF1
b3RlLCBzYW1lIGFzIFJFVCBvbiBhIGJsYW5rIGNvbnRpbnVhdGlvbiBsaW5lIGV4aXRzIGEKICAg
ICAgICAgICAgOzsgbGlzdDogcmVtb3ZlIHRoZSBwcmVmaXggYW5kIGRyb3AgdG8gY29sdW1uIDAu
CiAgICAgICAgICAgIChibGFuay1saW5lLXAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAobG9va2luZy1hdC1wICJeWz4gXHRdKiQiKSkpKQogICAgICAgIChpZiBibGFuay1saW5l
LXAKICAgICAgICAgICAgKHByb2duCiAgICAgICAgICAgICAgKGRlbGV0ZS1yZWdpb24gKGxpbmUt
YmVnaW5uaW5nLXBvc2l0aW9uKSAobGluZS1lbmQtcG9zaXRpb24pKQogICAgICAgICAgICAgIChu
ZXdsaW5lKSkKICAgICAgICAgIChkZWxldGUtaG9yaXpvbnRhbC1zcGFjZSkKICAgICAgICAgIChu
ZXdsaW5lKQogICAgICAgICAgKGluc2VydCBicS1wcmVmaXgpKSkpCiAgICAgOzsgRGVmYXVsdDog
cGxhaW4gbmV3bGluZS4gIFRoaXMgYWxzbyBoYW5kbGVzIGVtcHR5IGxpc3QgbWFya2VycwogICAg
IDs7IChlLmcuLCAiLSAiIHdpdGggbm8gdGV4dCkgdGhhdCB0aGUgZ3JhbW1hciBwYXJzZXMgYXMg
RVJST1IKICAgICA7OyBub2RlcyByYXRoZXIgdGhhbiBsaXN0X2l0ZW0gbm9kZXMuCiAgICAgOzsK
ICAgICA7OyBXaGVuIHRoZSBjdXJyZW50IGxpbmUgaXMgYmxhbmsgKHdoaXRlc3BhY2Ugb25seSks
IGl0IGlzIGEKICAgICA7OyBjb250aW51YXRpb24taW5kZW50IGxpbmUgbGVmdCBieSBhIHByZXZp
b3VzIFJFVCB0aGF0CiAgICAgOzsgdHJlZS1zaXR0ZXIgbm8gbG9uZ2VyIGNvbnNpZGVycyBwYXJ0
IG9mIGEgbGlzdF9pdGVtLiAgQ2xlYXIKICAgICA7OyB0aGUgd2hpdGVzcGFjZSBzbyBubyB0cmFp
bGluZyBzcGFjZXMgcmVtYWluLCBhbmQgaW5zZXJ0IGEKICAgICA7OyBwbGFpbiBuZXdsaW5lIGF0
IGNvbHVtbiAwIHRvIGV4aXQgdGhlIGxpc3QgY29udGV4dC4KICAgICAodAogICAgICAod2hlbiAo
c2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCiAgICAgICAg
ICAgICAgKGxvb2tpbmctYXQtcCAiXlsgXHRdKyQiKSkKICAgICAgICAoZGVsZXRlLXJlZ2lvbiAo
bGluZS1iZWdpbm5pbmctcG9zaXRpb24pIChsaW5lLWVuZC1wb3NpdGlvbikpKQogICAgICAobmV3
bGluZSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtaW5zZXJ0LWxpc3QtaXRlbSAoKQogICJJbnNl
cnQgYSBuZXcgbGlzdCBpdGVtLCBzcGxpdHRpbmcgdGV4dCBhdCBwb2ludC4KVGV4dCBhZnRlciBw
b2ludCBtb3ZlcyB0byB0aGUgbmV3IGl0ZW0uICBBdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSwK
YW4gZW1wdHkgaXRlbSBpcyBpbnNlcnRlZCBhYm92ZSBhbmQgdGhlIGN1cnJlbnQgY29udGVudCBp
cyBwdXNoZWQgZG93bi4KSW5zaWRlIGEgYmxvY2sgcXVvdGUsIHRoZSBuZXcgbGluZSBpbmNsdWRl
cyB0aGUgcXVvdGUgcHJlZml4LgpGb3Igb3JkZXJlZCBsaXN0cywgdGhlIG51bWJlciBpcyBpbmNy
ZW1lbnRlZC4KV2hlbiBub3QgaW5zaWRlIGEgbGlzdCwgZmFsbCBiYWNrIHRvIGBtYXJrZG93bi10
cy1uZXdsaW5lJy4iCiAgKGludGVyYWN0aXZlKQogIChsZXQqICgobm9kZSAodHJlZXNpdC1ub2Rl
LWF0CiAgICAgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24gKGJhY2stdG8taW5kZW50YXRpb24p
IChwb2ludCkpCiAgICAgICAgICAgICAgICAnbWFya2Rvd24pKQogICAgICAgICAoaW4tYnEgKGFu
ZCAodHJlZXNpdC1wYXJlbnQtdW50aWwgbm9kZSAiXFxgYmxvY2tfcXVvdGVcXCciKQogICAgICAg
ICAgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAgICAgICAoYmVn
aW5uaW5nLW9mLWxpbmUpCiAgICAgICAgICAgICAgICAgICAgICAgKGxvb2tpbmctYXQtcCAiWyBc
dF0qPiIpKSkpCiAgICAgICAgIChicS1wcmVmaXggKHdoZW4gaW4tYnEgKG1hcmtkb3duLXRzLS1i
bG9jay1xdW90ZS1wcmVmaXgpKSkKICAgICAgICAgKGl0ZW0gKG1hcmtkb3duLXRzLS1saXN0LWl0
ZW0tYXQtcG9pbnQpKSkKICAgIChjb25kCiAgICAgKChhbmQgaXRlbQogICAgICAgICAgIChvciAo
bm90IGluLWJxKQogICAgICAgICAgICAgICAoPj0gKG1hcmtkb3duLXRzLS1saW5lLWJsb2NrLXF1
b3RlLWRlcHRoKQogICAgICAgICAgICAgICAgICAgKG1hcmtkb3duLXRzLS1saW5lLWJsb2NrLXF1
b3RlLWRlcHRoCiAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1zdGFydCAodHJlZXNp
dC1ub2RlLWNoaWxkIGl0ZW0gMCkpKSkpKQogICAgICAobGV0KiAoKG5ldy1tYXJrZXIgKG1hcmtk
b3duLXRzLS1uZXctbWFya2VyLWZvci1saW5lIGl0ZW0pKQogICAgICAgICAgICAgKGF0LWJvbCAo
PD0gKGN1cnJlbnQtY29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICAgKHNhdmUtZXhjdXJz
aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYWNrLXRvLWluZGVudGF0aW9uKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudC1jb2x1bW4pKSkpCiAgICAgICAgICAgICAo
dGFpbCAod2hlbiAoYW5kIChub3QgYXQtYm9sKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAobm90IChsb29raW5nLWF0LXAgIlsgXHRdKiQiKSkpCiAgICAgICAgICAgICAgICAgICAgIChk
ZWxldGUtYW5kLWV4dHJhY3QtcmVnaW9uCiAgICAgICAgICAgICAgICAgICAgICAocG9pbnQpIChs
aW5lLWVuZC1wb3NpdGlvbikpKSkpCiAgICAgICAgKGlmIGF0LWJvbAogICAgICAgICAgICA7OyBB
dCBCT0w6IGluc2VydCBlbXB0eSBpdGVtIGFib3ZlLCBwdXNoIGN1cnJlbnQgbGluZSBkb3duLgog
ICAgICAgICAgICAocHJvZ24KICAgICAgICAgICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCiAgICAg
ICAgICAgICAgKHdoZW4gYnEtcHJlZml4IChpbnNlcnQgYnEtcHJlZml4KSkKICAgICAgICAgICAg
ICAoaW5zZXJ0IG5ldy1tYXJrZXIgIlxuIikKICAgICAgICAgICAgICAoYmFjay10by1pbmRlbnRh
dGlvbikpCiAgICAgICAgICA7OyBNaWQtbGluZSBvciBFT0w6IG5ldyBpdGVtIGJlbG93IHdpdGgg
dGFpbCB0ZXh0LgogICAgICAgICAgKGRlbGV0ZS1ob3Jpem9udGFsLXNwYWNlKQogICAgICAgICAg
KG5ld2xpbmUpCiAgICAgICAgICAod2hlbiBicS1wcmVmaXggKGluc2VydCBicS1wcmVmaXgpKQog
ICAgICAgICAgKGluc2VydCBuZXctbWFya2VyKQogICAgICAgICAgKHdoZW4gdGFpbCAoc2F2ZS1l
eGN1cnNpb24gKGluc2VydCAoc3RyaW5nLXRyaW0tbGVmdCB0YWlsKSkpKSkpKQoKICAgICA7OyBO
b3QgaW4gYSBsaXN0OiBmYWxsIGJhY2sgdG8gbmV3bGluZSBiZWhhdmlvci4KICAgICAodCAobWFy
a2Rvd24tdHMtbmV3bGluZSkpKSkpCgo7OzsgRmlsbGluZzoKCjs7IFRPRE86IFJlbW92ZSB0aGUg
cGlwZV90YWJsZSBibG9jayBpZiB3ZSBpbXBsZW1lbnQgcGlwZV90YWJsZSBmaWxsLgooZGVmY29u
c3QgbWFya2Rvd24tdHMtLWZpbGwtdW5maWxsYWJsZS1ibG9jay1xdWVyeQogICcoWyhmZW5jZWRf
Y29kZV9ibG9jaykgKGluZGVudGVkX2NvZGVfYmxvY2spIChwaXBlX3RhYmxlKV0gQGJsb2NrKQog
ICJUcmVlLXNpdHRlciBxdWVyeSBtYXRjaGluZyBibG9ja3Mgd2hlcmUgZmlsbGluZyBpcyBpbmhp
Yml0ZWQuIikKCihkZWZ1biBtYXJrZG93bi10cy0tbGlzdC1pdGVtLXRleHQtY29sdW1uIChpdGVt
KQogICJSZXR1cm4gdGhlIGNvbHVtbiB3aGVyZSB0aGUgdGV4dCBvZiBsaXN0IElURU0gc3RhcnRz
LgpUaGlzIGlzIHRoZSBjb2x1bW4gb2YgdGhlIGZpcnN0IHBhcmFncmFwaCBub2RlIGluc2lkZSBJ
VEVNLCBvcgp0aGUgd2lkdGggb2YgdGhlIGxpc3QgbWFya2VyIGlmIG5vIHBhcmFncmFwaCBpcyBm
b3VuZC4iCiAgKGxldCAoKHBhcmFncmFwaCAodHJlZXNpdC1zZWFyY2gtc3VidHJlZSBpdGVtICJc
XGBwYXJhZ3JhcGhcXCciKSkpCiAgICAoaWYgcGFyYWdyYXBoCiAgICAgICAgKHNhdmUtZXhjdXJz
aW9uCiAgICAgICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtc3RhcnQgcGFyYWdyYXBoKSkK
ICAgICAgICAgIChjdXJyZW50LWNvbHVtbikpCiAgICAgIChsZXQgKChtYXJrZXIgKHRyZWVzaXQt
bm9kZS1jaGlsZCBpdGVtIDApKSkKICAgICAgICAoLSAodHJlZXNpdC1ub2RlLWVuZCBtYXJrZXIp
CiAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1zdGFydCBtYXJrZXIpKSkpKSkKCihkZWZ1biBtYXJr
ZG93bi10cy0tZmlsbC1saXN0LWl0ZW0gKGl0ZW0ganVzdGlmeSkKICAiRmlsbCB0aGUgY29udGVu
dHMgb2YgbGlzdCBJVEVNLCBwcmVzZXJ2aW5nIGl0cyBpbmRlbnRhdGlvbi4KTmFycm93cyB0byBJ
VEVNJ3Mgb3duIHBhcmFncmFwaCBjb250ZW50IChleGNsdWRpbmcgbmVzdGVkIGxpc3RzKQphbmQg
c2V0cyBgZmlsbC1wcmVmaXgnIHRvIGFsaWduIGNvbnRpbnVhdGlvbiBsaW5lcyB3aXRoIHRoZSBz
dGFydApvZiB0aGUgaXRlbSdzIHRleHQuICBKVVNUSUZZIGlzIGFzIGluIGBmaWxsLXBhcmFncmFw
aCcuIgogIChsZXQqICgoZmlsbC1wcmVmaXggKG1ha2Utc3RyaW5nIChtYXJrZG93bi10cy0tbGlz
dC1pdGVtLXRleHQtY29sdW1uIGl0ZW0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgP1xzKSkKICAgICAgICAgOzsgRmluZCB0aGUgaXRlbSdzIG93biBwYXJhZ3JhcGggKGZpcnN0
IHBhcmFncmFwaCBjaGlsZCkuCiAgICAgICAgIDs7IElmIHRoZSBpdGVtIGhhcyBuZXN0ZWQgbGlz
dHMsIG5hcnJvdyB0byBqdXN0IHRoZQogICAgICAgICA7OyBwYXJhZ3JhcGggc28gd2UgZG9uJ3Qg
bWVyZ2UgbmVzdGVkIGl0ZW1zLgogICAgICAgICAocGFyYSAodHJlZXNpdC1zZWFyY2gtc3VidHJl
ZSBpdGVtICJcXGBwYXJhZ3JhcGhcXCciIG5pbCBuaWwgMSkpCiAgICAgICAgIChiZWcgKHRyZWVz
aXQtbm9kZS1zdGFydCBpdGVtKSkKICAgICAgICAgKGVuZCAoaWYgcGFyYQogICAgICAgICAgICAg
ICAgICAodHJlZXNpdC1ub2RlLWVuZCBwYXJhKQogICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9k
ZS1lbmQgaXRlbSkpKQogICAgICAgICA7OyBVc2UgZGVmYXVsdCBwYXJhZ3JhcGggbW90aW9uIGlu
c2lkZSB0aGUgbmFycm93ZWQgcmVnaW9uCiAgICAgICAgIDs7IHNvIHRoYXQgdGhlIGlubmVyIGBm
aWxsLXBhcmFncmFwaCcgZG9lcyBub3QgcmUtZW50ZXIgb3VyCiAgICAgICAgIDs7IGN1c3RvbSBw
YXJhZ3JhcGgtZmluZGluZyBsb2dpYy4KICAgICAgICAgKGZpbGwtZm9yd2FyZC1wYXJhZ3JhcGgt
ZnVuY3Rpb24gIydmb3J3YXJkLXBhcmFncmFwaCkpCiAgICAoc2F2ZS1yZXN0cmljdGlvbgogICAg
ICAobmFycm93LXRvLXJlZ2lvbiBiZWcgZW5kKQogICAgICAoZmlsbC1wYXJhZ3JhcGgganVzdGlm
eSkpCiAgICA7OyBSZXR1cm4gbm9uLW5pbCB0byBzaWduYWwgdGhhdCBmaWxsaW5nIGhhcyBiZWVu
IGhhbmRsZWQsCiAgICA7OyBhcyBwZXIgdGhlIGNvbnRyYWN0IG9mIGBmaWxsLXBhcmFncmFwaC1m
dW5jdGlvbicuCiAgICB0KSkKCihkZWZ1biBtYXJrZG93bi10cy0tYWRhcHRpdmUtZmlsbCAoKQog
ICJSZXR1cm4gdGhlIGZpbGwgcHJlZml4IGZvciB0aGUgY3VycmVudCBsaW5lIGluIE1hcmtkb3du
LgpXaGVuIGluc2lkZSBhIGxpc3QgaXRlbSwgcmV0dXJuIHNwYWNlcyBtYXRjaGluZyB0aGUgY29s
dW1uIHdoZXJlCnRoZSBpdGVtJ3MgdGV4dCBzdGFydHMuIgogIChhbmQtbGV0KiAoKG5vZGUgKHRy
ZWVzaXQtbm9kZS1hdAogICAgICAgICAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbiAoYmFjay10
by1pbmRlbnRhdGlvbikgKHBvaW50KSkKICAgICAgICAgICAgICAgICAgICAnbWFya2Rvd24pKQog
ICAgICAgICAgICAgKGl0ZW0gKHRyZWVzaXQtcGFyZW50LXVudGlsIG5vZGUgIlxcYGxpc3RfaXRl
bVxcJyIpKSkKICAgIChtYWtlLXN0cmluZyAobWFya2Rvd24tdHMtLWxpc3QtaXRlbS10ZXh0LWNv
bHVtbiBpdGVtKSA/XHMpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tZmlsbC1mb3J3YXJkLXBhcmFn
cmFwaCAoYXJnKQogICJNb3ZlIGZvcndhcmQgYnkgQVJHIHBhcmFncmFwaHMsIHJlc3BlY3Rpbmcg
TWFya2Rvd24gc3RydWN0dXJlLgpMaXN0IGl0ZW1zIGFyZSB0cmVhdGVkIGFzIGluZGl2aWR1YWwg
cGFyYWdyYXBocy4gIEJsb2NrcyBtYXRjaGVkCmJ5IGBtYXJrZG93bi10cy0tZmlsbC11bmZpbGxh
YmxlLWJsb2NrLXF1ZXJ5JyBhcmUgc2tpcHBlZDogYm90aApmb3J3YXJkIGFuZCBiYWNrd2FyZCBt
b3Rpb24gbW92ZSB0byB0aGUgZW5kIG9mIHRoZSBibG9jaywgc28KYGZpbGwtcmVnaW9uJyBzZWVz
IGEgemVyby1sZW5ndGggcmVnaW9uIGFuZCBsZWF2ZXMgdGhlIGJsb2NrCnVuZmlsbGVkLiIKICAo
bGV0ICgoZGlyZWN0aW9uIChpZiAoPiBhcmcgMCkgMSAtMSkpCiAgICAgICAgKGNvdW50IChhYnMg
YXJnKSkKICAgICAgICAobW92ZWQgMCkpCiAgICAoZG90aW1lcyAoXyBjb3VudCkKICAgICAgOzsg
Rm9yIGJhY2t3YXJkIG1vdGlvbiwgc2tpcCBiYWNrIG92ZXIgd2hpdGVzcGFjZSB0byBmaW5kCiAg
ICAgIDs7IHRoZSBpdGVtIHdlIGFyZSBsZWF2aW5nLCBub3QgdGhlIG5leHQgb25lLgogICAgICAo
bGV0KiAoKHBvcyAoaWYgKDwgZGlyZWN0aW9uIDApCiAgICAgICAgICAgICAgICAgICAgICAoc2F2
ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgKHNraXAtY2hhcnMtYmFja3dhcmQg
IiBcdFxuIikKICAgICAgICAgICAgICAgICAgICAgICAgKG1heCAocG9pbnQtbWluKSAoMS0gKHBv
aW50KSkpKQogICAgICAgICAgICAgICAgICAgIChwb2ludCkpKQogICAgICAgICAgICAgKGJsb2Nr
IChjYXIgKHRyZWVzaXQtcXVlcnktY2FwdHVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICh0
cmVlc2l0LWJ1ZmZlci1yb290LW5vZGUgJ21hcmtkb3duKQogICAgICAgICAgICAgICAgICAgICAg
ICAgIG1hcmtkb3duLXRzLS1maWxsLXVuZmlsbGFibGUtYmxvY2stcXVlcnkKICAgICAgICAgICAg
ICAgICAgICAgICAgICBwb3MgKDErIHBvcykpKSkKICAgICAgICAgICAgIChpbmRlbnRlZC1wb3Mg
KHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciBw
b3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhY2stdG8taW5kZW50YXRpb24pCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50KSkpCiAgICAgICAgICAgICAobm9kZSAo
dHJlZXNpdC1ub2RlLWF0IGluZGVudGVkLXBvcyAnbWFya2Rvd24pKQogICAgICAgICAgICAgKGl0
ZW0gKHRyZWVzaXQtcGFyZW50LXVudGlsIG5vZGUgIlxcYGxpc3RfaXRlbVxcJyIpKSkKICAgICAg
ICA7OyBXaGVuIG1vdmluZyBmb3J3YXJkIGZyb20gd2hpdGVzcGFjZSBiZXR3ZWVuIGxpc3QgaXRl
bXMsCiAgICAgICAgOzsgc2tpcCB0byB0aGUgbmV4dCBub24tYmxhbmsgcG9zaXRpb24gYW5kIGNo
ZWNrIGFnYWluLgogICAgICAgICh3aGVuIChhbmQgKG5vdCBpdGVtKSAobm90IGJsb2NrKSAoPiBk
aXJlY3Rpb24gMCkpCiAgICAgICAgICAobGV0ICgobmV4dC1wb3MgKHNhdmUtZXhjdXJzaW9uCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoc2tpcC1jaGFycy1mb3J3YXJkICIgXHRcbiIpCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnQpKSkpCiAgICAgICAgICAgIChzZXRxIG5v
ZGUgKHRyZWVzaXQtbm9kZS1hdCBuZXh0LXBvcyAnbWFya2Rvd24pKQogICAgICAgICAgICAoc2V0
cSBpdGVtICh0cmVlc2l0LXBhcmVudC11bnRpbCBub2RlICJcXGBsaXN0X2l0ZW1cXCciKSkpKQog
ICAgICAgIChjb25kCiAgICAgICAgIDs7IEluc2lkZSBhbiB1bmZpbGxhYmxlIGJsb2NrOiBza2lw
IG92ZXIgaXQgZW50aXJlbHkuCiAgICAgICAgIChibG9jawogICAgICAgICAgKGdvdG8tY2hhciAo
dHJlZXNpdC1ub2RlLWVuZCAoY2RyIGJsb2NrKSkpCiAgICAgICAgICAoc2V0cSBtb3ZlZCAoMSsg
bW92ZWQpKSkKICAgICAgICAgOzsgSW5zaWRlIGEgbGlzdCBpdGVtOiB0cmVhdCBhcyBwYXJhZ3Jh
cGggYm91bmRhcnkuCiAgICAgICAgIChpdGVtCiAgICAgICAgICAoaWYgKD4gZGlyZWN0aW9uIDAp
CiAgICAgICAgICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLWVuZCBpdGVtKSkKICAgICAg
ICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IGl0ZW0pKSkKICAgICAgICAgIChz
ZXRxIG1vdmVkICgxKyBtb3ZlZCkpKQogICAgICAgICA7OyBEZWZhdWx0OiB1c2Ugc3RhbmRhcmQg
cGFyYWdyYXBoIG1vdGlvbi4KICAgICAgICAgKHQKICAgICAgICAgIChmb3J3YXJkLXBhcmFncmFw
aCBkaXJlY3Rpb24pCiAgICAgICAgICAoc2V0cSBtb3ZlZCAoMSsgbW92ZWQpKSkpKSkKICAgIDs7
IFJldHVybiB0aGUgbnVtYmVyIG9mIHBhcmFncmFwaHMgbGVmdCB0byBtb3ZlICgwID0gYWxsIGRv
bmUpLgogICAgKC0gY291bnQgbW92ZWQpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tZmlsbC1wYXJh
Z3JhcGggKCZvcHRpb25hbCBqdXN0aWZ5KQogICJGaWxsIHRoZSBjdXJyZW50IHBhcmFncmFwaCwg
cmVzcGVjdGluZyBNYXJrZG93biBibG9jayBzdHJ1Y3R1cmUuClRoaXMgZnVuY3Rpb24gcHJldmVu
dHMgZmlsbGluZyBpbnNpZGUgYmxvY2tzIG1hdGNoZWQgYnkKYG1hcmtkb3duLXRzLS1maWxsLXVu
ZmlsbGFibGUtYmxvY2stcXVlcnknLCBhbmQgZmlsbHMgd2l0aGluIGxpc3QKaXRlbXMgd2l0aG91
dCBtZXJnaW5nIGFkamFjZW50IGl0ZW1zLiAgSlVTVElGWSBpcyBhcyBpbgpgZmlsbC1wYXJhZ3Jh
cGgnLiIKICAoY29uZCoKICAgOzsgRG9uJ3QgZmlsbCBpbnNpZGUgdW5maWxsYWJsZSBibG9ja3Mu
ICBVc2UgYSBxdWVyeSBhZ2FpbnN0IHRoZQogICA7OyByb290IG5vZGUgYmVjYXVzZSBgdHJlZXNp
dC1ub2RlLWF0JyBtYXkgbm90IHJldHVybiBhIG5vZGUKICAgOzsgaW5zaWRlIHRoZSBibG9jayB3
aGVuIHBvaW50IGlzIG9uIGFub255bW91cyAodW5uYW1lZCkgdGV4dC4KICAgKCh0cmVlc2l0LXF1
ZXJ5LWNhcHR1cmUKICAgICAodHJlZXNpdC1idWZmZXItcm9vdC1ub2RlICdtYXJrZG93bikKICAg
ICBtYXJrZG93bi10cy0tZmlsbC11bmZpbGxhYmxlLWJsb2NrLXF1ZXJ5CiAgICAgKHBvaW50KSAo
bWluICgxKyAocG9pbnQpKSAocG9pbnQtbWF4KSkpCiAgICB0KQogICA7OyBGaWxsIHdpdGhpbiB0
aGUgZW5jbG9zaW5nIGxpc3QgaXRlbS4gIFVzZQogICA7OyBgbWFya2Rvd24tdHMtLWxpc3QtaXRl
bS1hdC1wb2ludCcgd2hpY2ggaGFuZGxlcyBibG9jayBxdW90ZQogICA7OyBtYXJrZXJzLiAgV2hl
biB0aGUgbGlzdCBpdGVtIGlzIGluc2lkZSBhIGJsb2NrIHF1b3RlLCBkZWxlZ2F0ZQogICA7OyB0
byB0aGUgYmxvY2sgcXVvdGUgZmlsbGVyIHdoaWNoIGhhbmRsZXMgYD4gJyBwcmVmaXhlcyBjb3Jy
ZWN0bHkuCiAgICgoYmluZC1hbmQqIChpdGVtIChtYXJrZG93bi10cy0tbGlzdC1pdGVtLWF0LXBv
aW50KSkpCiAgICAoaWYgKHRyZWVzaXQtcGFyZW50LXVudGlsIGl0ZW0gIlxcYGJsb2NrX3F1b3Rl
XFwnIikKICAgICAgICAobWFya2Rvd24tdHMtLWZpbGwtYmxvY2stcXVvdGUganVzdGlmeSkKICAg
ICAgKG1hcmtkb3duLXRzLS1maWxsLWxpc3QtaXRlbSBpdGVtIGp1c3RpZnkpKSkKICAgOzsgUG9p
bnQgaXMgb24gYSBibGFuayBsaW5lIGJlZm9yZSBhIGxpc3QuICBJZiB0aGUgbmV4dAogICA7OyBu
b24td2hpdGVzcGFjZSBwb3NpdGlvbiBmYWxscyBpbnNpZGUgYSBsaXN0IGl0ZW0sIGZpbGwgdGhh
dCBpdGVtLgogICAoKHNhdmUtZXhjdXJzaW9uCiAgICAgIChiZWdpbm5pbmctb2YtbGluZSkKICAg
ICAgKGxvb2tpbmctYXQtcCAiWyBcdF0qJCIpKQogICAgKGFuZC1sZXQqICgobmV4dC1wb3MgKHNh
dmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2lwLWNoYXJzLWZvcndh
cmQgIiBcdFxuIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50KSkpCiAgICAgICAg
ICAgICAgIChuZXh0LW5vZGUgKHRyZWVzaXQtbm9kZS1hdCBuZXh0LXBvcyAnbWFya2Rvd24pKQog
ICAgICAgICAgICAgICAoaXRlbSAodHJlZXNpdC1wYXJlbnQtdW50aWwKICAgICAgICAgICAgICAg
ICAgICAgIG5leHQtbm9kZSAiXFxgbGlzdF9pdGVtXFwnIikpKQogICAgICAobWFya2Rvd24tdHMt
LWZpbGwtbGlzdC1pdGVtIGl0ZW0ganVzdGlmeSkpKQogICA7OyBGaWxsIHdpdGhpbiBhIGJsb2Nr
IHF1b3RlLiAgTmFycm93IHRvIHRoZSBwYXJhZ3JhcGggbm9kZSBhdAogICA7OyBwb2ludCdzIG5l
c3RpbmcgbGV2ZWwgc28gbGluZXMgd2l0aCBkaWZmZXJlbnQgYD4gJyBkZXB0aHMKICAgOzsgYXJl
IG5vdCBtZXJnZWQuCiAgICgodHJlZXNpdC1wYXJlbnQtdW50aWwKICAgICAodHJlZXNpdC1ub2Rl
LWF0CiAgICAgIChzYXZlLWV4Y3Vyc2lvbiAoYmFjay10by1pbmRlbnRhdGlvbikgKHBvaW50KSkK
ICAgICAgJ21hcmtkb3duKQogICAgICJcXGBibG9ja19xdW90ZVxcJyIpCiAgICAobWFya2Rvd24t
dHMtLWZpbGwtYmxvY2stcXVvdGUganVzdGlmeSkpCiAgIDs7IEZpbGwgd2l0aGluIGFuIEhUTUwg
Y29tbWVudC4gIFRoZSBub2RlIHR5cGUgaXMgImh0bWxfYmxvY2siCiAgIDs7IGluIGdyYW1tYXIg
djAuNC54IGFuZCAiY29tbWVudCIgaW4gc29tZSBvdGhlciB2ZXJzaW9ucy4KICAgKChiaW5kLWFu
ZCogKGJsb2NrIChsZXQgKChuICh0cmVlc2l0LW5vZGUtYXQgKHBvaW50KSAnbWFya2Rvd24pKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgKG9yICh0cmVlc2l0LXBhcmVudC11bnRpbAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG4gIlxcYFxcKD86aHRtbF9ibG9ja1xcfGNvbW1lbnRcXClc
XCciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCAobWVtYmVyICh0cmVlc2l0LW5v
ZGUtdHlwZSBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoImh0
bWxfYmxvY2siICJjb21tZW50IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4p
KSkpKQogICAgKG1hcmtkb3duLXRzLS1maWxsLWh0bWwtY29tbWVudCBibG9jayBqdXN0aWZ5KSkK
ICAgOzsgRGVmYXVsdDogbGV0IGZpbGwtcGFyYWdyYXBoIGhhbmRsZSBpdC4KICAgKHQgbmlsKSkp
CgooZGVmdW4gbWFya2Rvd24tdHMtLWZpbGwtaHRtbC1jb21tZW50IChub2RlIGp1c3RpZnkpCiAg
IkZpbGwgSFRNTCBjb21tZW50IE5PREUsIGFsaWduaW5nIGNvbnRpbnVhdGlvbiBsaW5lcy4KUmV0
dXJuIHQgaWYgTk9ERSBpcyBhIGNvbW1lbnQgYW5kIHdhcyBmaWxsZWQsIG5pbCBvdGhlcndpc2Uu
CkpVU1RJRlkgaXMgYXMgaW4gYGZpbGwtcGFyYWdyYXBoJy4iCiAgKHdoZW4gKHNhdmUtZXhjdXJz
aW9uCiAgICAgICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAg
ICAgICAobG9va2luZy1hdC1wICI8IS0tIikpCiAgICAobGV0ICgoZmlsbC1wcmVmaXggKHNhdmUt
ZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5v
ZGUtc3RhcnQgbm9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZS1zdHJpbmcgKCsg
KGN1cnJlbnQtY29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChsZW5ndGggIjwhLS0gIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
P1xzKSkpCiAgICAgICAgICAoYWRhcHRpdmUtZmlsbC1mdW5jdGlvbiBuaWwpCiAgICAgICAgICAo
ZmlsbC1mb3J3YXJkLXBhcmFncmFwaC1mdW5jdGlvbiAjJ2ZvcndhcmQtcGFyYWdyYXBoKQogICAg
ICAgICAgKGZpbGwtcGFyYWdyYXBoLWZ1bmN0aW9uIG5pbCkpCiAgICAgIChzYXZlLXJlc3RyaWN0
aW9uCiAgICAgICAgKG5hcnJvdy10by1yZWdpb24gKHRyZWVzaXQtbm9kZS1zdGFydCBub2RlKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAg
IChmaWxsLXBhcmFncmFwaCBqdXN0aWZ5KSkKICAgICAgdCkpKQoKKGRlZnVuIG1hcmtkb3duLXRz
LS1ibG9jay1xdW90ZS1wcmVmaXggKCkKICAiUmV0dXJuIHRoZSBibG9jayBxdW90ZSBwcmVmaXgg
c3RyaW5nIGZyb20gdGhlIGN1cnJlbnQgbGluZS4KUmVhZCB0aGUgYWN0dWFsIGA+JyBtYXJrZXJz
ICh3aXRoIHdoYXRldmVyIHNwYWNpbmcgdGhlIHVzZXIgd3JvdGUpCmZyb20gdGhlIGJlZ2lubmlu
ZyBvZiB0aGUgbGluZSBzbyB0aGF0IGZpbGwgcHJlc2VydmVzIHRoZSBleGlzdGluZwpzdHlsZSAo
ZS5nLiwgYD4+PiAnIHN0YXlzIGA+Pj4gJywgYD4gPiA+ICcgc3RheXMgYD4gPiA+ICcpLiIKICAo
c2F2ZS1leGN1cnNpb24KICAgIChiZWdpbm5pbmctb2YtbGluZSkKICAgIChpZiAobG9va2luZy1h
dCAiXFwoWz4gXHRdKj5cXClbIFx0XSoiKQogICAgICAgIChjb25jYXQgKG1hdGNoLXN0cmluZyAw
KSkKICAgICAgIj4gIikpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1maWxsLWJsb2NrLXF1b3RlIChq
dXN0aWZ5KQogICJGaWxsIHRoZSBwYXJhZ3JhcGggYXQgcG9pbnQgaW5zaWRlIGEgYmxvY2sgcXVv
dGUuCkZpbmQgdGhlIHBhcmFncmFwaCBub2RlIGF0IHBvaW50IHdpdGhpbiB0aGUgYmxvY2sgcXVv
dGUgYW5kIGZpbGwKb25seSB0aGF0IHBhcmFncmFwaCwgcHJlc2VydmluZyB0aGUgYD4gJyBwcmVm
aXguICBXaGVuIHRoZQpwYXJhZ3JhcGggaXMgaW5zaWRlIGEgbGlzdCBpdGVtLCBhbGlnbiBjb250
aW51YXRpb24gbGluZXMgd2l0aAp0aGUgaXRlbSdzIHRleHQgY29sdW1uLiAgSlVTVElGWSBpcyBh
cyBpbiBgZmlsbC1wYXJhZ3JhcGgnLiIKICA7OyBTa2lwIHBhc3QgYD4gJyBtYXJrZXJzIGFuZCBh
bnkgbGlzdCBtYXJrZXIgdG8gbGFuZCBpbnNpZGUgdGhlCiAgOzsgY29udGVudCwgd2hlcmUgdGhl
IHBhcmFncmFwaCBub2RlIGxpdmVzLgogIChsZXQqICgoY29udGVudC1wb3MgKHNhdmUtZXhjdXJz
aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIChiZWdpbm5pbmctb2YtbGluZSkKICAgICAgICAg
ICAgICAgICAgICAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiPiBcdCIpCiAgICAgICAgICAgICAg
ICAgICAgICAgIDs7IElmIHdlIGxhbmQgb24gYSBsaXN0IG1hcmtlciwgc2tpcCBwYXN0IGl0Lgog
ICAgICAgICAgICAgICAgICAgICAgICAod2hlbiAobG9va2luZy1hdCAiWy0qK10gXFx8WzAtOV0r
Wy4pXVxzIikKICAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIChtYXRjaC1lbmQg
MCkpKQogICAgICAgICAgICAgICAgICAgICAgICAobWluICgxKyAocG9pbnQpKSAocG9pbnQtbWF4
KSkpKQogICAgICAgICAobm9kZSAodHJlZXNpdC1ub2RlLWF0IGNvbnRlbnQtcG9zICdtYXJrZG93
bikpCiAgICAgICAgIChwYXJhICh0cmVlc2l0LXBhcmVudC11bnRpbAogICAgICAgICAgICAgICAg
bm9kZSAobGFtYmRhIChuKQogICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAodHJlZXNpdC1u
b2RlLXR5cGUgbikgInBhcmFncmFwaCIpKSkpKQogICAgKHdoZW4gcGFyYQogICAgICA7OyBUaGUg
Z3JhbW1hciBtYXkgaW5jbHVkZSB0cmFpbGluZyBibG9ja19jb250aW51YXRpb24gbm9kZXMKICAg
ICAgOzsgKGJsYW5rIGA+ID4nIGxpbmVzKSBhcyBjaGlsZHJlbiBvZiB0aGUgcGFyYWdyYXBoLiAg
VXNlIHRoZQogICAgICA7OyBlbmQgb2YgdGhlIGxhc3QgaW5saW5lIGNoaWxkIHNvIGZpbGwgZG9l
cyBub3QgbWVyZ2UgYWNyb3NzCiAgICAgIDs7IHdoYXQgc2hvdWxkIGJlIGEgcGFyYWdyYXBoIGJv
dW5kYXJ5LgogICAgICAobGV0KiAoKGxhc3QtaW5saW5lCiAgICAgICAgICAgICAgKHNlcS1maW5k
IChsYW1iZGEgKGNoaWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAodHJlZXNp
dC1ub2RlLXR5cGUgY2hpbGQpICJpbmxpbmUiKSkKICAgICAgICAgICAgICAgICAgICAgICAgKHJl
dmVyc2UgKHRyZWVzaXQtbm9kZS1jaGlsZHJlbiBwYXJhKSkpKQogICAgICAgICAgICAgKHBhcmEt
ZW5kIChpZiBsYXN0LWlubGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1u
b2RlLWVuZCBsYXN0LWlubGluZSkKICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5v
ZGUtZW5kIHBhcmEpKSkKICAgICAgICAgICAgIChicS1wcmVmaXggKG1hcmtkb3duLXRzLS1ibG9j
ay1xdW90ZS1wcmVmaXgpKQogICAgICAgICAgICAgOzsgV2hlbiBpbnNpZGUgYSBsaXN0IGl0ZW0s
IGV4dGVuZCB0aGUgcHJlZml4IHdpdGggc3BhY2VzCiAgICAgICAgICAgICA7OyBzbyBjb250aW51
YXRpb24gbGluZXMgYWxpZ24gd2l0aCB0aGUgaXRlbSdzIHRleHQuCiAgICAgICAgICAgICAobGlz
dC1pdGVtICh0cmVlc2l0LXBhcmVudC11bnRpbCBwYXJhICJcXGBsaXN0X2l0ZW1cXCciKSkKICAg
ICAgICAgICAgIChwcmVmaXggKGlmIGxpc3QtaXRlbQogICAgICAgICAgICAgICAgICAgICAgICAg
KGxldCogKCh0ZXh0LWNvbCAobWFya2Rvd24tdHMtLWxpc3QtaXRlbS10ZXh0LWNvbHVtbgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC1pdGVtKSkKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoZXh0cmEgKG1heCAwICgtIHRleHQtY29sIChsZW5n
dGggYnEtcHJlZml4KSkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCBicS1w
cmVmaXggKG1ha2Utc3RyaW5nIGV4dHJhID9ccykpKQogICAgICAgICAgICAgICAgICAgICAgIGJx
LXByZWZpeCkpCiAgICAgICAgICAgICAoYWRhcHRpdmUtZmlsbC1mdW5jdGlvbiBuaWwpCiAgICAg
ICAgICAgICAoZmlsbC1mb3J3YXJkLXBhcmFncmFwaC1mdW5jdGlvbiAjJ2ZvcndhcmQtcGFyYWdy
YXBoKQogICAgICAgICAgICAgKGZpbGwtcGFyYWdyYXBoLWZ1bmN0aW9uIG5pbCkpCiAgICAgICAg
KHNhdmUtcmVzdHJpY3Rpb24KICAgICAgICAgIDs7IE5hcnJvdyB0byB0aGUgZnVsbCBsaW5lcyBv
ZiB0aGUgcGFyYWdyYXBoIHNvIHRoYXQgdGhlCiAgICAgICAgICA7OyBgPiAnIG1hcmtlcnMgYXJl
IGluY2x1ZGVkIGluIHRoZSBmaWxsIHJlZ2lvbi4KICAgICAgICAgIChuYXJyb3ctdG8tcmVnaW9u
CiAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAoZ290by1jaGFyICh0cmVl
c2l0LW5vZGUtc3RhcnQgcGFyYSkpCiAgICAgICAgICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCiAg
ICAgICAgICAgICAocG9pbnQpKQogICAgICAgICAgIHBhcmEtZW5kKQogICAgICAgICAgKGxldCAo
KGZpbGwtcHJlZml4IHByZWZpeCkpCiAgICAgICAgICAgIChmaWxsLXBhcmFncmFwaCBqdXN0aWZ5
KSkpKSkpCiAgdCkKCjs7OyBDb2RlIGJsb2NrczoKCihkZWZ2YXItbG9jYWwgbWFya2Rvd24tdHMt
LWNvZGUtYmxvY2stbGFuZ3VhZ2VzIG5pbAogICJBbGlzdCBtYXBwaW5nIGxhbmd1YWdlIG5vZGUg
bmFtZXMgdG8gdHMgbGFuZ3VhZ2UuCklmIGEgbGFuZ3VhZ2UgaXMgbm90IGEgdHMgbGFuZ3VhZ2Ug
b3IgaXMgbm90IG1hcHBlZCB0byBvbmUsIGl0IHdpbGwgYmUKaW4gYG1hcmtkb3duLXRzLS1jb2Rl
LWJsb2NrLW5vbi10cy1tb2RlcycuIikKCihkZWZ2YXItbG9jYWwgbWFya2Rvd24tdHMtLWNvZGUt
YmxvY2stbm9uLXRzLW1vZGVzIG5pbAogICJBbGlzdCBtYXBwaW5nIGxhbmd1YWdlcyB0byBub24t
dHJlZS1zaXR0ZXIgbW9kZXMgZm9yIGNvZGUgYmxvY2tzLgpQb3B1bGF0ZWQgYnkgYG1hcmtkb3du
LXRzLS1jb2RlLWJsb2NrLXRzLWxhbmd1YWdlJyB0byBpZGVudGlmeSBhCmNvZGUtYmxvY2sgbGFu
Z3VhZ2UgbW9kZSB3aGljaCBpcyBub3QgYSB0cmVlLXNpdHRlciBtb2RlIG9yIGZvciB3aGljaAp0
aGUgdHJlZS1zaXR0ZXIgZ3JhbW1hciBpcyB1bmF2YWlsYWJsZS4iKQoKKGRlZnVuIG1hcmtkb3du
LXRzLS1oYXJ2ZXN0LW1vZGUtdHJlZXNpdC1jb25maWd1cmF0aW9uIChtb2RlKQogICJIYXJ2ZXN0
IHRyZWUtc2l0dGVyIGNvbmZpZ3VyYXRpb24gZnJvbSBNT0RFLgpSZXR1cm4gYSBwbGlzdCB3aXRo
IHRoZSBmb2xsb3dpbmcga2V5cyBhbmQgdmFsdWVzOgoKICAgIDpmb250LWxvY2sgKGZyb20gYHRy
ZWVzaXQtZm9udC1sb2NrLXNldHRpbmdzJykKICAgIDpzaW1wbGUtaW5kZW50IChmcm9tIGB0cmVl
c2l0LXNpbXBsZS1pbmRlbnQtcnVsZXMnKQogICAgOnJhbmdlIChmcm9tIGB0cmVlc2l0LXJhbmdl
LXNldHRpbmdzJykiCiAgKHdpdGgtd29yay1idWZmZXIKICAgIChtYXJrZG93bi10cy0taW5oaWJp
dC1tZXNzYWdlcy1hbmQtd2FybmluZ3MKICAgICAgJ21hcmtkb3duLXRzLWluaGliaXQtY29kZS1i
bG9jay1tb2RlLXdhcm5pbmdzCiAgICAgIChkZWxheS1tb2RlLWhvb2tzIChmdW5jYWxsIG1vZGUp
KSkKICAgIChsaXN0IDpsYW5ndWFnZSAodHJlZXNpdC1sYW5ndWFnZS1hdCAocG9pbnQtbWluKSkK
ICAgICAgICAgIDpmb250LWxvY2sgdHJlZXNpdC1mb250LWxvY2stc2V0dGluZ3MKICAgICAgICAg
IDpzaW1wbGUtaW5kZW50IHRyZWVzaXQtc2ltcGxlLWluZGVudC1ydWxlcwogICAgICAgICAgOnJh
bmdlIHRyZWVzaXQtcmFuZ2Utc2V0dGluZ3MpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tY29uZmln
dXJlLWN1cnJlbnQtYnVmZmVyIChjb25maWd1cmF0aW9uKQogICJBZGQgQ09ORklHVVJBVElPTiB0
byB0aGUgY3VycmVudCBidWZmZXIuCkNPTkZJR1VSQVRJT04gaW5jbHVkZXMgZm9udC1sb2NrIGFu
ZCBpbmRlbnQgcnVsZXMuICBGb3IgZm9udC1sb2NrIHJ1bGVzLAp1c2UgdGhlIHNhbWUgZmVhdHVy
ZXMgZW5hYmxlZCBpbiBNT0RFLiIKICAoc2V0cSB0cmVlc2l0LWZvbnQtbG9jay1zZXR0aW5ncwog
ICAgICAgIChhcHBlbmQgdHJlZXNpdC1mb250LWxvY2stc2V0dGluZ3MKICAgICAgICAgICAgICAg
IDs7IEdldCBhbGwgdGhlIGZvbnQtbG9jayBzZXR0aW5ncywgaW5jbHVkaW5nIG9uZXMgdGhhdAog
ICAgICAgICAgICAgICAgOzsgZG9uJ3QgcGVydGFpbiB0byBNT0RFLiAgVGhpcyB3YXksIHdlIGdl
dCBqc2RvYwogICAgICAgICAgICAgICAgOzsgZnJvbSBqcy10cy1tb2RlLCBmb3IgZXhhbXBsZS4K
ICAgICAgICAgICAgICAgIChwbGlzdC1nZXQgY29uZmlndXJhdGlvbiA6Zm9udC1sb2NrKSkpCiAg
KHNldHEgdHJlZXNpdC1zaW1wbGUtaW5kZW50LXJ1bGVzCiAgICAgICAgKGFwcGVuZCB0cmVlc2l0
LXNpbXBsZS1pbmRlbnQtcnVsZXMKICAgICAgICAgICAgICAgIDs7IFNpbWlsYXJseSwgZ2V0IGFs
bCBpbmRlbnQgcnVsZXMuCiAgICAgICAgICAgICAgICAocGxpc3QtZ2V0IGNvbmZpZ3VyYXRpb24g
OnNpbXBsZS1pbmRlbnQpKSkKICAgIChzZXRxIHRyZWVzaXQtcmFuZ2Utc2V0dGluZ3MKICAgICAg
ICAgIChhcHBlbmQgdHJlZXNpdC1yYW5nZS1zZXR0aW5ncwogICAgICAgICAgICAgICAgICA7OyBG
aWx0ZXIgb3V0IGZ1bmN0aW9uIHF1ZXJpZXMsIGJlY2F1c2UgdGhleSBhcmUKICAgICAgICAgICAg
ICAgICAgOzsgdXN1YWxseSBzb21lIGhhY2sgYW5kIG1pZ2h0IGVzY2FwZSB0aGUgY29kZSBibG9j
ay4KICAgICAgICAgICAgICAgICAgOzsgQ2FzZSBpbiBwb2ludDogYy10cy1tb2RlJ3MgcmFuZ2Ug
c2V0dGluZy4KICAgICAgICAgICAgICAgICAgKHNlcS1maWx0ZXIgKGxhbWJkYSAoc2V0dGluZykK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IChmdW5jdGlvbnAgKGNhciBzZXR0
aW5nKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxpc3QtZ2V0IGNvbmZpZ3Vy
YXRpb24gOnJhbmdlKSkpKQogIChzZXRxLWxvY2FsIGluZGVudC1saW5lLWZ1bmN0aW9uICMndHJl
ZXNpdC1pbmRlbnQpCiAgKHNldHEtbG9jYWwgaW5kZW50LXJlZ2lvbi1mdW5jdGlvbiAjJ3RyZWVz
aXQtaW5kZW50LXJlZ2lvbikpCgooZGVmdW4gbWFya2Rvd24tdHMtLWxhbmd1YWdlLWF0LW5vZGUg
KG5vZGUpCiAgIlJldHVybiB0aGUgbGFuZ3VhZ2Ugc3ltYm9sIGZvciBjb2RlX2ZlbmNlX2NvbnRl
bnQgTk9ERS4iCiAgKHdoZW4tbGV0KiAoKHBhcmVudCAodHJlZXNpdC1ub2RlLXBhcmVudCBub2Rl
KSkKICAgICAgICAgICAgICAobGFuZy1ub2RlICh3aGVuIHBhcmVudAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAodHJlZXNpdC1zZWFyY2gtc3VidHJlZSBwYXJlbnQgIlxcYGxhbmd1YWdlXFwn
IikpKSkKICAgIChpbnRlcm4gKHRyZWVzaXQtbm9kZS10ZXh0IGxhbmctbm9kZSB0KSkpKQoKKGRl
ZnZhci1sb2NhbCBtYXJrZG93bi10cy0tbm9uLXRzLWZvbnRpZnktY2FjaGUgKG1ha2UtaGFzaC10
YWJsZSA6dGVzdCAjJ2VxdWFsKQogICJDYWNoZSBmb3Igbm9uLXRyZWUtc2l0dGVyIGNvZGUgYmxv
Y2sgZm9udGlmaWNhdGlvbi4KS2V5cyBhcmUgKExBTkcgLiBDT05URU5ULUhBU0gpIGNvbnMgY2Vs
bHMsIHZhbHVlcyBhcmUgbGlzdHMgb2YKXChPRkZTRVQtU1RBUlQgT0ZGU0VULUVORCBGQUNFKSB0
cmlwbGVzLiIpCgooZGVmdmFyLWxvY2FsIG1hcmtkb3duLXRzLS1ub24tdHMtZm9udGlmeS1jYWNo
ZS10aWNrIG5pbAogICJGb3IgYmx1bnQgYGJ1ZmZlci1jaGFycy1tb2RpZmllZC10aWNrJyBjYWNo
ZSBpbnZhbGlkYXRpb24uIikKCihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS1ub24tdHMtY29k
ZS1ibG9jayAobm9kZSBvdmVycmlkZSBzdGFydCBlbmQgJnJlc3QgXykKICAiRm9udGlmeSBjb2Rl
X2ZlbmNlX2NvbnRlbnQgTk9ERSB1c2luZyBhIG5vbi10cmVlLXNpdHRlciBtb2RlLgpBcHBseSB0
aGUgY29kZS1ibG9jayBtb2RlJ3MgY29udmVudGlvbmFsIGZvbnQtbG9jayBpbiBhIHRlbXBvcmFy
eQpidWZmZXIuICBPVkVSUklERSwgU1RBUlQsIGFuZCBFTkQgYXJlIHBhc3NlZCB0aHJvdWdoIHRv
CmB0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVycmlkZScuCgpDYWNoZSByZXN1bHRzIHRvIGF2b2lk
IGZvbnRpZmljYXRpb24gb2YgdW5jaGFuZ2VkIGNvZGUgYmxvY2tzLgoKTk9ERSBzaG91bGQgYWxy
ZWFkeSBoYXZlIHBhc3NlZCB0aHJvdWdoCmBtYXJrZG93bi10cy0tY29kZS1ibG9jay10cy1sYW5n
dWFnZScgd2hpY2ggbWF5IGhhdmUgY2xhc3NpZmllZCB0aGlzCm5vZGUgYXMgYSBub24tdHMgbW9k
ZS4iCiAgKHdoZW4tbGV0KiAoKF8gbWFya2Rvd24tdHMtZm9udGlmeS1jb2RlLWJsb2Nrcy1uYXRp
dmVseSkKICAgICAgICAgICAgICAobGFuZyAobWFya2Rvd24tdHMtLWxhbmd1YWdlLWF0LW5vZGUg
bm9kZSkpCiAgICAgICAgICAgICAgKG1vZGUgKGFsaXN0LWdldCBsYW5nIG1hcmtkb3duLXRzLS1j
b2RlLWJsb2NrLW5vbi10cy1tb2RlcykpCiAgICAgICAgICAgICAgKHRpY2sgKGJ1ZmZlci1jaGFy
cy1tb2RpZmllZC10aWNrKSkKICAgICAgICAgICAgICAoYmxvY2stc3RhcnQgKHRyZWVzaXQtbm9k
ZS1zdGFydCBub2RlKSkKICAgICAgICAgICAgICA7OyBDYW5ub3QgdXNlIG1hcmtlcnMgJ21hcmtk
b3duLXRzLWNvZGUtYmVnLW1hcmtlcgogICAgICAgICAgICAgIDs7ICdtYXJrZG93bi10cy1jb2Rl
LWVuZC1tYXJrZXIgdGhleSBhcmUgc2V0IGFmdGVyIHRoaXMKICAgICAgICAgICAgICA7OyBmdW5j
dGlvbiBydW5zLgogICAgICAgICAgICAgIChub2RlLXN0YXJ0IChzYXZlLWV4Y3Vyc2lvbgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IG5v
ZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmUtYmVnaW5uaW5nLXBvc2l0aW9u
KSkpCiAgICAgICAgICAgICAgKG5vZGUtZW5kIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAg
ICAgICAgICAgICAgIChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1lbmQgbm9kZSkpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdCIpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgKHBvaW50KSkpKQogICAgKHdoZW4gKD4gbm9kZS1lbmQgbm9kZS1zdGFy
dCkKICAgICAgKHVubGVzcyAoZXEgdGljayBtYXJrZG93bi10cy0tbm9uLXRzLWZvbnRpZnktY2Fj
aGUtdGljaykKICAgICAgICAoY2xyaGFzaCBtYXJrZG93bi10cy0tbm9uLXRzLWZvbnRpZnktY2Fj
aGUpKQogICAgICAobGV0KiAoKGNhY2hlLWtleSAoY29ucyBsYW5nIChzZWN1cmUtaGFzaAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhMjU2CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChjdXJyZW50LWJ1ZmZlcikgbm9kZS1zdGFydCBub2RlLWVuZCkp
KQogICAgICAgICAgICAgKHByb3BzCiAgICAgICAgICAgICAgKG9yIChnZXRoYXNoIGNhY2hlLWtl
eQogICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy0tbm9uLXRzLWZvbnRpZnkt
Y2FjaGUpCiAgICAgICAgICAgICAgICAgIChsZXQgKChyZXN1bHQKICAgICAgICAgICAgICAgICAg
ICAgICAgIChtYXJrZG93bi10cy0tZm9udGlmeS1ub24tdHMtY29sbGVjdC1mYWNlcwogICAgICAg
ICAgICAgICAgICAgICAgICAgIG1vZGUgbm9kZS1zdGFydCBub2RlLWVuZCkpKQogICAgICAgICAg
ICAgICAgICAgIChwdXRoYXNoIGNhY2hlLWtleSByZXN1bHQKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtYXJrZG93bi10cy0tbm9uLXRzLWZvbnRpZnktY2FjaGUpCiAgICAgICAgICAgICAg
ICAgICAgKHNldHEgbWFya2Rvd24tdHMtLW5vbi10cy1mb250aWZ5LWNhY2hlLXRpY2sgdGljaykK
ICAgICAgICAgICAgICAgICAgICByZXN1bHQpKSkpCiAgICAgICAgKGRvbGlzdCAocmFuZ2UgcHJv
cHMpCiAgICAgICAgICAodHJlZXNpdC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUKICAgICAgICAgICAo
bnRoIDAgcmFuZ2UpCiAgICAgICAgICAgKG50aCAxIHJhbmdlKQogICAgICAgICAgIChudGggMiBy
YW5nZSkKICAgICAgICAgICBvdmVycmlkZSBzdGFydCBlbmQpKSkpKSkKCihkZWZ1biBtYXJrZG93
bi10cy0tZm9udGlmeS1ub24tdHMtY29sbGVjdC1mYWNlcyAobW9kZSBiZWcgZW5kKQogICJSdW4g
TU9ERSBvbiB0aGUgQkVHLi5FTkQgcmVnaW9uJ3MgdGV4dCBhbmQgaGFydmVzdCBmYWNlIHByb3Bl
cnRpZXMuClJldHVybiBhIGxpc3Qgb2YgKEJVRi1CRUcgQlVGLUVORCBGQUNFKSB0cmlwbGVzIGlu
IGJhc2UtYnVmZmVyCmNvb3JkaW5hdGVzLgoKRm9yIG5vbi10cmVlLXNpdHRlciBtb2RlcyB1c2Ug
YW4gaW5kaXJlY3QgYnVmZmVyIG5hcnJvd2VkIHRvIEJFRy4uRU5EOgpyZWdleC9zeW50YWN0aWMg
Zm9udC1sb2NrIGhvbm9ycyBuYXJyb3dpbmcgYW5kIHRoZSBpbmRpcmVjdCBidWZmZXIKc2hhcmVz
IHRleHQgd2l0aCB0aGUgYmFzZSwgc28gdGhpcyBpcyBsZXNzIGV4cGVuc2l2ZSBhbmQgY29weS1m
cmVlLgoKRm9yIHRzIG1vZGVzIGluIGBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWZvcmNlLWNvbnZl
bnRpb25hbC1tb2RlcycsIGZhbGwKYmFjayB0byBhIHRlbXAgYnVmZmVyLiAgQSBwYXJzZXIgY3Jl
YXRlZCBpbiB0aGUgc291cmNlIGJ1ZmZlciBkb2VzIG5vdApyZWFjdCB0byBuYXJyb3dpbmcgaW4g
YW4gaW5kaXJlY3QgYnVmZmVyIGRlcml2ZWQgZnJvbSBpdCAob25seSBwYXJzZXJzCmNyZWF0ZWQg
aW4gdGhhdCBpbmRpcmVjdCBidWZmZXIgd291bGQgaG9ub3IgaXRzIG5hcnJvd2luZyksIHNvIHJl
dXNpbmcKdGhlIGhvc3QgcGFyc2VyIHZpYSBhbiBpbmRpcmVjdCBidWZmZXIgaXMgbm90IGFuIG9w
dGlvbiBoZXJlLiAgQW5kIGluCnRoZSBob3N0IGJ1ZmZlciBpdHNlbGYsIHRoZSBpbm5lciBjb250
ZW50IG9mIGEgZmVuY2VkIGNvZGUgYmxvY2sgaXMKanVzdCBvcGFxdWUgdGV4dCBpbnNpZGUgYSBg
Y29kZV9mZW5jZV9jb250ZW50JyBub2RlLCBuZXZlciByZS1wYXJzZWQKYXMgYSBmcmVzaCBkb2N1
bWVudC4gIEEgdGVtcCBidWZmZXIgd2l0aCBhIGZyZXNoIHBhcnNlciBzZWVzIHRoZSBpbm5lcgpj
b250ZW50IGFzIGEgc3RhbmRhbG9uZSBtYXJrZG93biBkb2N1bWVudCwgd2hpY2ggaXMgd2hhdCB3
ZSB3YW50LiIKICAoY29uZCAoKG1lbXEgbW9kZSBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWZvcmNl
LWNvbnZlbnRpb25hbC1tb2RlcykKICAgICAgICAgKGxldCAoKGNvbnRlbnQgKGJ1ZmZlci1zdWJz
dHJpbmctbm8tcHJvcGVydGllcyBiZWcgZW5kKSkKICAgICAgICAgICAgICAgcmVzKQogICAgICAg
ICAgICh3aXRoLXdvcmstYnVmZmVyCiAgICAgICAgICAgICAoaW5zZXJ0IGNvbnRlbnQpCiAgICAg
ICAgICAgICAobWFya2Rvd24tdHMtLWluaGliaXQtbWVzc2FnZXMtYW5kLXdhcm5pbmdzCiAgICAg
ICAgICAgICAgICdtYXJrZG93bi10cy1pbmhpYml0LWNvZGUtYmxvY2stbW9kZS13YXJuaW5ncwog
ICAgICAgICAgICAgICAoZGVsYXktbW9kZS1ob29rcwogICAgICAgICAgICAgICAgIChsZXQgKCht
YXJrZG93bi10cy0tc2V0LXVwLWlubGluZSB0KSkKICAgICAgICAgICAgICAgICAgIChtYXJrZG93
bi10cy1tb2RlKSkpKQogICAgICAgICAgICAgKGZvbnQtbG9jay1lbnN1cmUpCiAgICAgICAgICAg
ICAobGV0ICgocG9zIChwb2ludC1taW4pKSkKICAgICAgICAgICAgICAgKHdoaWxlICg8IHBvcyAo
cG9pbnQtbWF4KSkKICAgICAgICAgICAgICAgICAobGV0ICgobmV4dCAobmV4dC1zaW5nbGUtcHJv
cGVydHktY2hhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAnZmFjZSBuaWwg
KHBvaW50LW1heCkpKQogICAgICAgICAgICAgICAgICAgICAgIChmYWNlIChnZXQtdGV4dC1wcm9w
ZXJ0eSBwb3MgJ2ZhY2UpKSkKICAgICAgICAgICAgICAgICAgICh3aGVuIGZhY2UKICAgICAgICAg
ICAgICAgICAgICAgOzsgVHJhbnNsYXRlIHRlbXAtYnVmZmVyIG9mZnNldHMgYmFjayB0byBiYXNl
LWJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICA7OyBwb3NpdGlvbnM6IHRlbXAgYHBvaW50LW1p
bicgY29ycmVzcG9uZHMgdG8gQkVHLgogICAgICAgICAgICAgICAgICAgICAocHVzaCAobGlzdCAo
KyBiZWcgKDEtIHBvcykpICgrIGJlZyAoMS0gbmV4dCkpIGZhY2UpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlcykpCiAgICAgICAgICAgICAgICAgICAoc2V0cSBwb3MgbmV4dCkpKSkpCiAg
ICAgICAgICAgKG5yZXZlcnNlIHJlcykpKQogICAgICAgICh0CiAgICAgICAgIChsZXQgKChpbmRp
cmVjdC1idWZmZXIgKG1ha2UtaW5kaXJlY3QtYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChjdXJyZW50LWJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGdlbmVyYXRlLW5ldy1idWZmZXItbmFtZSAoYnVmZmVyLW5hbWUpKQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBuaWwgJ2luaGliaXQtYnVmZmVyLWhvb2tzKSkKICAgICAgICAg
ICAgICAgcmVzKQogICAgICAgICAgICh1bndpbmQtcHJvdGVjdAogICAgICAgICAgICAgICAod2l0
aC1jdXJyZW50LWJ1ZmZlciBpbmRpcmVjdC1idWZmZXIKICAgICAgICAgICAgICAgICAobWFya2Rv
d24tdHMtLWluaGliaXQtbWVzc2FnZXMtYW5kLXdhcm5pbmdzCiAgICAgICAgICAgICAgICAgICAn
bWFya2Rvd24tdHMtaW5oaWJpdC1jb2RlLWJsb2NrLW1vZGUtd2FybmluZ3MKICAgICAgICAgICAg
ICAgICAgIChkZWxheS1tb2RlLWhvb2tzIChmdW5jYWxsIG1vZGUpKSkKICAgICAgICAgICAgICAg
ICAobmFycm93LXRvLXJlZ2lvbiBiZWcgZW5kKQogICAgICAgICAgICAgICAgIChmb250LWxvY2st
ZW5zdXJlKQogICAgICAgICAgICAgICAgIChsZXQgKChwb3MgKHBvaW50LW1pbikpKQogICAgICAg
ICAgICAgICAgICAgKHdoaWxlICg8IHBvcyAocG9pbnQtbWF4KSkKICAgICAgICAgICAgICAgICAg
ICAgKGxldCAoKG5leHQgKG5leHQtc2luZ2xlLXByb3BlcnR5LWNoYW5nZQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcG9zICdmYWNlIG5pbCAocG9pbnQtbWF4KSkpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChmYWNlIChnZXQtdGV4dC1wcm9wZXJ0eSBwb3MgJ2ZhY2UpKSkK
ICAgICAgICAgICAgICAgICAgICAgICAod2hlbiBmYWNlCiAgICAgICAgICAgICAgICAgICAgICAg
ICAocHVzaCAobGlzdCBwb3MgbmV4dCBmYWNlKSByZXMpKQogICAgICAgICAgICAgICAgICAgICAg
IChzZXRxIHBvcyBuZXh0KSkpKSkKICAgICAgICAgICAgIChraWxsLWJ1ZmZlciBpbmRpcmVjdC1i
dWZmZXIpKQogICAgICAgICAgIChucmV2ZXJzZSByZXMpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRz
LS1jb2RlLWJsb2NrLWxhbmd1YWdlLW1vZGUgKGxhbmcpCiAgIkNvbXB1dGUgYW5kIGNhY2hlIGEg
bW9kZSBzeW1ib2wgZnJvbSBMQU5HLCBhIHN5bWJvbC4KQ29uc3VsdCB0aGUgYG1hcmtkb3duLXRz
LWNvZGUtYmxvY2stbW9kZXMnIGNhY2hlLCBvciBjb25zdWx0CmB0cmVlc2l0LW1ham9yLW1vZGUt
cmVtYXAtYWxpc3QnIGFuZCBgbWFqb3ItbW9kZS1yZW1hcC1hbGlzdCcsIG9yIGJydXRlCmZvcmNl
IG1vZGUgcHJvYmUuICBSZXR1cm4gYSB2YWxpZCBtb2RlIHN5bWJvbCBvciBuaWwuIgogIChpZi1s
ZXQqICgobWFwcGVkLW1vZGUgKGNhciAoYWxpc3QtZ2V0IGxhbmcgbWFya2Rvd24tdHMtY29kZS1i
bG9jay1tb2RlcykpKSkKICAgICAgbWFwcGVkLW1vZGUKICAgIChsZXQqICgobGFuZy1zdHJpbmcg
KHN5bWJvbC1uYW1lIGxhbmcpKQogICAgICAgICAgIChsYW5nLW1vZGUgKGNvbmNhdCBsYW5nLXN0
cmluZyAiLW1vZGUiKSkKICAgICAgICAgICAobW9kZSkpCiAgICAgIChpZiAoc2V0cSBtb2RlIChh
bGlzdC1nZXQgbGFuZy1tb2RlIHRyZWVzaXQtbWFqb3ItbW9kZS1yZW1hcC1hbGlzdCkpCiAgICAg
ICAgICBtb2RlCiAgICAgICAgKGlmIChzZXRxIG1vZGUgKGFsaXN0LWdldCBsYW5nLW1vZGUgbWFq
b3ItbW9kZS1yZW1hcC1hbGlzdCkpCiAgICAgICAgICAgIG1vZGUKICAgICAgICAgIChjYXRjaCA6
bW9kZQogICAgICAgICAgICAoZG9saXN0IChtb2RlCiAgICAgICAgICAgICAgICAgICAgIChsaXN0
CiAgICAgICAgICAgICAgICAgICAgICA7OyBUcnkgYSB0cmVlc2l0IG1vZGUgdXNpbmcgdGhlIHJh
dyBzdHJpbmcuCiAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0IGxhbmctc3RyaW5nICItdHMt
bW9kZSIpCiAgICAgICAgICAgICAgICAgICAgICA7OyBUcnkgYSBjb252ZW50aW9uYWwgbW9kZSB1
c2luZyB0aGUgcmF3IHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAgIGxhbmctbW9kZQogICAg
ICAgICAgICAgICAgICAgICAgOzsgVHJ5IGEgdHJlZXNpdCBtb2RlIHVzaW5nIHRoZSBkb3duY2Fz
ZWQgc3RyaW5nLgogICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCAoZG93bmNhc2UgbGFuZy1z
dHJpbmcpICItdHMtbW9kZSIpCiAgICAgICAgICAgICAgICAgICAgICA7OyBUcnkgYSBjb252ZW50
aW9uYWwgbW9kZSB1c2luZyB0aGUgZG93bmNhc2VkIHN0cmluZy4KICAgICAgICAgICAgICAgICAg
ICAgIChjb25jYXQgKGRvd25jYXNlIGxhbmctc3RyaW5nKSAiLW1vZGUiKSkpCiAgICAgICAgICAg
ICAgKHNldHEgbW9kZSAoaW50ZXJuIG1vZGUpKQogICAgICAgICAgICAgICh3aGVuIChmYm91bmRw
IG1vZGUpCiAgICAgICAgICAgICAgICAocHVzaCAobGlzdCBsYW5nIG1vZGUpIG1hcmtkb3duLXRz
LWNvZGUtYmxvY2stbW9kZXMpCiAgICAgICAgICAgICAgICAodGhyb3cgOm1vZGUgbW9kZSkpKSkp
KSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLXRzLWxhbmd1YWdlIChub2RlKQog
ICJDb252ZXJ0IE5PREUgdG8gYSBsYW5ndWFnZSBmb3IgdGhlIGNvZGUgYmxvY2suIgogIChsZXQq
ICgobGFuZyAoaW50ZXJuICh0cmVlc2l0LW5vZGUtdGV4dCBub2RlKSkpCiAgICAgICAgIChtb2Rl
IChtYXJrZG93bi10cy0tY29kZS1ibG9jay1sYW5ndWFnZS1tb2RlIGxhbmcpKQogICAgICAgICAo
dHMtbGFuZ3VhZ2UgKGFsaXN0LWdldCBsYW5nIG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLWxhbmd1
YWdlcykpCiAgICAgICAgIChub24tdHMtbGFuZ3VhZ2UgKGFsaXN0LWdldCBsYW5nIG1hcmtkb3du
LXRzLS1jb2RlLWJsb2NrLW5vbi10cy1tb2RlcykpKQogICAgKGNvbmQKICAgICAoKGZib3VuZHAg
bW9kZSkKICAgICAgKGNvbmQKICAgICAgIDs7IFJldHVybiBrbm93biB0cmVlc2l0IGxhbmd1YWdl
LgogICAgICAgKHRzLWxhbmd1YWdlIHRzLWxhbmd1YWdlKQogICAgICAgOzsgUmV0dXJuIG5pbCBm
b3Iga25vd24gbm9uLXRyZWVzaXQgbGFuZ3VhZ2UgZm9yIGZvbnQtbG9jay4KICAgICAgIChub24t
dHMtbGFuZ3VhZ2UgbmlsKQogICAgICAgOzsgTWFya2Rvd24gaXRzZWxmIG5lZWRzIHR3byBwYXJz
ZXJzIChtYXJrZG93biArCiAgICAgICA7OyBtYXJrZG93bi1pbmxpbmUpLCBzbyB0cmVlc2l0IGVt
YmVkZGluZyAod2hpY2ggY3JlYXRlcyBvbmx5CiAgICAgICA7OyBvbmUpIGNhbm5vdCBmdWxseSBm
b250aWZ5IGl0LiAgUm91dGUgdGhyb3VnaCB0aGUgbm9uLXRzCiAgICAgICA7OyBwYXRoIHNvIHRo
ZSB0ZW1wIGJ1ZmZlciBydW5zIHRoZSBmdWxsIG1vZGUgd2l0aCBib3RoCiAgICAgICA7OyBwYXJz
ZXJzLgogICAgICAgKChwcm92aWRlZC1tb2RlLWRlcml2ZWQtcCBtb2RlICdtYXJrZG93bi10cy1t
b2RlKQogICAgICAgICh1bmxlc3MgKGFzc3EgbGFuZyBtYXJrZG93bi10cy0tY29kZS1ibG9jay1u
b24tdHMtbW9kZXMpCiAgICAgICAgICAocHVzaCAoY29ucyBsYW5nIG1vZGUpIG1hcmtkb3duLXRz
LS1jb2RlLWJsb2NrLW5vbi10cy1tb2RlcykpCiAgICAgICAgbmlsKQogICAgICAgKHQKICAgICAg
ICAobGV0KiAoKGNvbmZpZ3VyYXRpb24gKG1hcmtkb3duLXRzLS1oYXJ2ZXN0LW1vZGUtdHJlZXNp
dC1jb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlKSkKICAg
ICAgICAgICAgICAgKHRzLWxhbmd1YWdlIChwbGlzdC1nZXQgY29uZmlndXJhdGlvbiA6bGFuZ3Vh
Z2UpKSkKICAgICAgICAgIChjb25kCiAgICAgICAgICAgKChhbmQgdHMtbGFuZ3VhZ2UKICAgICAg
ICAgICAgICAgICAocGxpc3QtZ2V0IGNvbmZpZ3VyYXRpb24gOmZvbnQtbG9jaykpCiAgICAgICAg
ICAgIChtYXJrZG93bi10cy0tY29uZmlndXJlLWN1cnJlbnQtYnVmZmVyIGNvbmZpZ3VyYXRpb24p
CiAgICAgICAgICAgICh1bmxlc3MgKGFzc3EgbGFuZyBtYXJrZG93bi10cy0tY29kZS1ibG9jay1s
YW5ndWFnZXMpCiAgICAgICAgICAgICAgKHB1c2ggKGNvbnMgbGFuZyB0cy1sYW5ndWFnZSkgbWFy
a2Rvd24tdHMtLWNvZGUtYmxvY2stbGFuZ3VhZ2VzKSkKICAgICAgICAgICAgdHMtbGFuZ3VhZ2Up
CiAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBjbGFzc2lmeSBtb2RlIGFzIG5vbi10cmVlLXNpdHRl
ci4KICAgICAgICAgICAodAogICAgICAgICAgICAodW5sZXNzIChhc3NxIGxhbmcgbWFya2Rvd24t
dHMtLWNvZGUtYmxvY2stbm9uLXRzLW1vZGVzKQogICAgICAgICAgICAgIChwdXNoIChjb25zIGxh
bmcgbW9kZSkgbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stbm9uLXRzLW1vZGVzKSkKICAgICAgICAg
ICAgbmlsKSkpKSkpCiAgICAgKHQgbmlsKSkpKQoKOzs7IENvZGUgYmxvY2sgbWlub3IgbW9kZSBz
dXBwb3J0IGFuZCBjb2RlLWJsb2NrIGNvbnRleHQgY29tbWFuZHM6CgooZGVmdmFyIG1hcmtkb3du
LXRzLWNvZGUtYmxvY2stY29tbWFuZHMgJyhpbmRlbnQtZm9yLXRhYi1jb21tYW5kCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0cmljLW5ld2xpbmUtYW5kLW1h
eWJlLWluZGVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21w
bGV0aW9uLWF0LXBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5ld2xpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVu
dC1kd2ltCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQt
bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LW9y
LXVuY29tbWVudC1yZWdpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stZmlsbC1wYXJhZ3JhcGgKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZy1maWxsLXJlaW5kZW50LWRlZnVuKQogICJD
b21tYW5kcyB0byBleGVjdXRlIGluIGEgY29kZS1ibG9jayBjb250ZXh0LgpTZWUgYG1hcmtkb3du
LXRzLS1ydW4tY29tbWFuZC1pbi1jb2RlLWJsb2NrJy4iKQoKKGRlZnZhciBtYXJrZG93bi10cy1j
b2RlLWJsb2NrLXRoaW5nLWNvbW1hbmRzICcoeHJlZi1maW5kLWRlZmluaXRpb25zKQogICJDb21t
YW5kcyB0aGF0IG5lZWQgYSBcInRoaW5nXCIgYXQgcG9pbnQgaW4gYSBjb2RlLWJsb2NrIGNvbnRl
eHQuClNlZSBgbWFya2Rvd24tdHMtLXJ1bi1jb21tYW5kLWluLWNvZGUtYmxvY2snLiIpCgooZGVm
dmFyIG1hcmtkb3duLXRzLWNvZGUtYmxvY2stcmVnaW9uLWNvbW1hbmRzICcoY29tbWVudC1vci11
bmNvbW1lbnQtcmVnaW9uKQogICJDb21tYW5kcyB0aGF0IG5lZWQgYSByZWdpb24gaW4gYSBjb2Rl
LWJsb2NrIGNvbnRleHQuClNlZSBgbWFya2Rvd24tdHMtLXJ1bi1jb21tYW5kLWluLWNvZGUtYmxv
Y2snLiIpCgooZGVmdW4gbWFya2Rvd24tdHMtLWVuYWJsZS1jb2RlLWJsb2NrLWluLWNvbnRleHQt
bW9kZSAoKQogICJFbmFibGUgYG1hcmtkb3duLXRzLWNvZGUtYmxvY2staW4tY29udGV4dC1tb2Rl
JyBpZiBpbiBhIGZlbmNlZCBjb2RlIGJsb2NrLiIKICAobWFya2Rvd24tdHMtY29kZS1ibG9jay1p
bi1jb250ZXh0LW1vZGUKICAgKGlmIChtYXJrZG93bi10cy1hdC1jb2RlLWJsb2NrLXApIDEgLTEp
KSkKCjs7IE5PVEU6IERvIG5vdCBhZGQgdGhpcyBjb21tYW5kIHRvIGBtYXJrZG93bi10cy1jb2Rl
LWJsb2NrLWNvbW1hbmRzJy4KKGRlZnVuIG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLW5ld2xpbmUg
KCZvcHRpb25hbCBhcmcgaW50ZXJhY3RpdmUpCiAgIkluc2VydCBhIG5ld2xpbmUsIGFuZCBtb3Zl
IHRvIGxlZnQgbWFyZ2luIG9mIHRoZSBuZXcgbGluZS4KV2l0aCBwcmVmaXggYXJndW1lbnQgQVJH
LCBpbnNlcnQgdGhhdCBtYW55IG5ld2xpbmVzLgoKSWYgYGVsZWN0cmljLWluZGVudC1tb2RlJyBp
cyBlbmFibGVkLCB0aGlzIGluZGVudHMgdGhlIGZpbmFsIG5ldyBsaW5lCnRoYXQgaXQgYWRkcywg
YW5kIHJlaW5kZW50cyB0aGUgcHJlY2VkaW5nIGxpbmUuICBUbyBqdXN0IGluc2VydAphIG5ld2xp
bmUsIHVzZSBcXFtlbGVjdHJpYy1pbmRlbnQtanVzdC1uZXdsaW5lXS4KCklmIGBhdXRvLWZpbGwt
bW9kZScgaXMgZW5hYmxlZCwgdGhpcyBtYXkgY2F1c2UgYXV0b21hdGljIGxpbmUKYnJlYWtpbmcg
b2YgdGhlIHByZWNlZGluZyBsaW5lLiAgQSBub24tbmlsIEFSRyBpbmhpYml0cyB0aGlzLgoKSWYg
dmFyaWFibGUgYHVzZS1oYXJkLW5ld2xpbmVzJyBpcyBlbmFibGVkLCB0aGUgbmV3bGluZSBpcyBt
YXJrZWQgd2l0aAp0aGUgdGV4dC1wcm9wZXJ0eSBgaGFyZCcuCgpBIG5vbi1uaWwgSU5URVJBQ1RJ
VkUgYXJndW1lbnQgbWVhbnMgdG8gcnVuIHRoZSBgcG9zdC1zZWxmLWluc2VydC1ob29rJy4iCiAg
KGludGVyYWN0aXZlICIqUFxucCIpCiAgKGlmLWxldCogKChibG9jay1tb2RlIChtYXJrZG93bi10
cy1jb2RlLWJsb2NrLW1vZGUtYXQpKQogICAgICAgICAgICAoKGZib3VuZHAgYmxvY2stbW9kZSkp
KQogICAgICAobWFya2Rvd24tdHMtLXJ1bi1jb21tYW5kLWluLWNvZGUtYmxvY2sgYmxvY2stbW9k
ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyduZXdsaW5l
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlKQogICAg
KGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAjJ25ld2xpbmUgYXJnIGludGVyYWN0aXZlKSkpCgooZGVm
dW4gbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stZmlsbC1wYXJhZ3JhcGggKCZvcHRpb25hbCBqdXN0
aWZ5KQogICJSZWZpbGwgb3IgcmVpbmRlbnQgdGhlIG1hcmtkb3duIGNvbnRlbnQgdGhhdCBjb250
YWlucyBwb2ludC4KSWYgdGhlIHBvaW50IGlzIGluIGEgc3RyaW5nIG9yIGEgY29tbWVudCwgZmls
bCB0aGUgcGFyYWdyYXBoIHRoYXQKY29udGFpbnMgcG9pbnQgb3IgZm9sbG93cyBwb2ludC4KCk90
aGVyd2lzZSwgcmVpbmRlbnQgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gdGhhdCBjb250YWlucyBw
b2ludCBvcgpmb2xsb3dzIHBvaW50LgoKSWYgSlVTVElGWSBpcyBub24tbmlsIChpbnRlcmFjdGl2
ZWx5LCB3aXRoIHByZWZpeCBhcmd1bWVudCksIGp1c3RpZnkgYXMKd2VsbC4iCiAgKGludGVyYWN0
aXZlICJQIikKICAoY29uZCAoKGRlcml2ZWQtbW9kZS1wICdwcm9nLW1vZGUpCiAgICAgICAgIChj
YWxsLWludGVyYWN0aXZlbHkgIydwcm9nLWZpbGwtcmVpbmRlbnQtZGVmdW4ganVzdGlmeSkpCiAg
ICAgICAgKHQKICAgICAgICAgKGNhbGwtaW50ZXJhY3RpdmVseSAjJ2ZpbGwtcGFyYWdyYXBoIGp1
c3RpZnkpKSkpCgo7OyBOT1RFOiBEbyBub3QgYWRkIHRoaXMgY29tbWFuZCB0byBgbWFya2Rvd24t
dHMtY29kZS1ibG9jay1jb21tYW5kcycuCihkZWZ1biBtYXJrZG93bi10cy0tY29kZS1ibG9jay14
cmVmLWZpbmQtZGVmaW5pdGlvbnMgKCZyZXN0IGFyZ3MpCiAgIkhlbHBlciBjb21tYW5kIGZvciBg
eHJlZi1maW5kLWRlZmluaXRpb25zJyBpbiBhIGNvZGUtYmxvY2sgY29udGV4dC4KRmluZCB0aGlu
ZyBhdCBwb2ludC4KQWRqdXN0IHRoZSByZWZlcmVuY2VzIG9uIHRoZSB4cmVmIHN0YWNrIHRvIHRo
ZSBiYXNlIGJ1ZmZlci4KUGFzcyB0aHJvdWdoIEFSR1MgaWYgbm90IGluIGEgY29kZSBibG9jayB3
aXRoIGFuIGF2YWlsYWJsZSBtb2RlLiIKICAoaW50ZXJhY3RpdmUpCiAgKGlmLWxldCogKChibG9j
ay1tb2RlIChtYXJrZG93bi10cy1jb2RlLWJsb2NrLW1vZGUtYXQpKQogICAgICAgICAgICAoKGZi
b3VuZHAgYmxvY2stbW9kZSkpKQogICAgICAoY29uZGl0aW9uLWNhc2UgZXJyCiAgICAgICAgICAo
dW53aW5kLXByb3RlY3QKICAgICAgICAgICAgICAocHJvZ24KICAgICAgICAgICAgICAgIDs7IFJl
Y29yZCBhIHBsYWNlaG9sZGVyIHhyZWYgbWFya2VyIGluIHRoZSBiYXNlIGJ1ZmZlci4gIFRoaXMK
ICAgICAgICAgICAgICAgIDs7IHdpbGwgYmUgcmV0YWluZWQgaWYgdGhlIGNvbW1hbmQgc3VjY2Vl
ZHMgdG8gcHVzaCBhIG1hcmtlciBpbgogICAgICAgICAgICAgICAgOzsgdGhlIGNvZGUtYmxvY2sg
YnVmZmVyIHdoaWNoIHdlIHdpbGwgcG9wLgogICAgICAgICAgICAgICAgKHhyZWYtcHVzaC1tYXJr
ZXItc3RhY2spCiAgICAgICAgICAgICAgICA7OyBgeHJlZi1maW5kLWRlZmluaXRpb25zJyBpcyBh
IHRoaW5nIGNvbW1hbmQgaW4KICAgICAgICAgICAgICAgIDs7IGBtYXJrZG93bi10cy1jb2RlLWJs
b2NrLXRoaW5nLWNvbW1hbmRzJy4KICAgICAgICAgICAgICAgIChtYXJrZG93bi10cy0tcnVuLWNv
bW1hbmQtaW4tY29kZS1ibG9jayBibG9jay1tb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyd4cmVmLWZpbmQtZGVmaW5pdGlvbnMKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdz
KSkKICAgICAgICAgICAgOzsgUG9wIHRoZSB0b3AgeHJlZiBtYXJrZXIuICBJZiB0aGUgY29tbWFu
ZCBzdWNjZWVkZWQsIHRoZQogICAgICAgICAgICA7OyB0b3AgbWFya2VyIHdpbGwgYmUgdGhlIGNv
ZGUtYmxvY2sgYnVmZmVyIG1hcmtlci4gIElmIGl0CiAgICAgICAgICAgIDs7IGZhaWxlZCwgd2Un
bGwgcG9wIHRoZSBwbGFjZWhvbGRlciB3aGljaCBpcyBub3cgb2Ygbm8KICAgICAgICAgICAgOzsg
dmFsdWUuCiAgICAgICAgICAgIDs7IFRPRE86IFByb3Bvc2UgYW4gYHhyZWYnIHBvcCBmdW5jdGlv
biB0aGF0IGRvZXNuJ3QgImdvCiAgICAgICAgICAgIDs7IGJhY2siLgogICAgICAgICAgICAobGV0
ICgoaGlzdG9yeSAoeHJlZi0tZ2V0LWhpc3RvcnkpKSkKICAgICAgICAgICAgICAodW5sZXNzIChu
dWxsIChjYXIgaGlzdG9yeSkpCiAgICAgICAgICAgICAgICAocG9wIChjYXIgaGlzdG9yeSkpKSkp
CiAgICAgICAgKGVycm9yCiAgICAgICAgIDs7IFByb3BhZ2F0ZSB0aGUgc2lnbmFsLgogICAgICAg
ICAoc2lnbmFsIChjYXIgZXJyKSAoY2RyIGVycikpKSkKICAgIDs7IE5vdCBpbiBhIGNvZGUgYmxv
Y2sgY29udGV4dC4gIFRoaXMgc2hvdWxkIHJlYWxseSBuZXZlciBoYXBwZW4uCiAgICAoZnVuY2Fs
bC1pbnRlcmFjdGl2ZWx5ICMneHJlZi1maW5kLWRlZmluaXRpb25zIGFyZ3MpKSkKCihkZWZ1biBt
YXJrZG93bi10cy0tbWF5YmUtcnVuLWNvbW1hbmQtaW4tY29kZS1ibG9jayAoKQogICJIZWxwZXIg
ZnVuY3Rpb24gdG8gd3JhcCBhIGNvbW1hbmQgZm9yIGEgY29kZS1ibG9jayBjb250ZXh0LgpJZiBg
dGhpcy1jb21tYW5kJyBpcyBhIG1lbWJlciBvZiBgbWFya2Rvd24tdHMtY29kZS1ibG9jay1jb21t
YW5kcycgYW5kCnBvaW50IGlzIHdpdGhpbiBhIGNvZGUgYmxvY2sgd2l0aCBhbiBhdmFpbGFibGUg
bW9kZSwgaXQgd2lsbCBydW4gaW4gdGhhdApjb2RlIGJsb2NrJ3MgbW9kZSBpbiBhIGJ1ZmZlciBu
YXJyb3dlZCB0byBpdHMgY29udGVudC4gIE90aGVyd2lzZSwgdGhlCmNvbW1hbmQgd2lsbCBydW4g
aW4gdGhlIGNvbnRleHQgb2YgdGhlIGBtYXJrZG93bi10cy1tb2RlJyBidWZmZXIuIgogICh3aGVu
IChtZW1xIHRoaXMtY29tbWFuZCBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWNvbW1hbmRzKQogICAg
KHdoZW4tbGV0KiAoKGNvbW1hbmQgdGhpcy1jb21tYW5kKQogICAgICAgICAgICAgICAgKGJsb2Nr
LW1vZGUgKG1hcmtkb3duLXRzLWNvZGUtYmxvY2stbW9kZS1hdCkpCiAgICAgICAgICAgICAgICAo
KGZib3VuZHAgYmxvY2stbW9kZSkpKQogICAgICAoc2V0cSB0aGlzLWNvbW1hbmQgKGxhbWJkYSAo
JnJlc3QgYXJncykKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludGVyYWN0aXZlKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAoYXBwbHkgIydtYXJrZG93bi10cy0tcnVuLWNvbW1hbmQt
aW4tY29kZS1ibG9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stbW9k
ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYXJncykpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1ydW4t
Y29tbWFuZC1pbi1jb2RlLWJsb2NrIChibG9jay1tb2RlIGNvbW1hbmQgJnJlc3QgYXJncykKICAi
UnVuIENPTU1BTkQgaW4gQkxPQ0stTU9ERS4KQVJHUyBhcmUgY2FwdHVyZWQgYnkgYG1hcmtkb3du
LXRzLS1tYXliZS1ydW4tY29tbWFuZC1pbi1jb2RlLWJsb2NrJy4iCiAgKHdoZW4tbGV0KiAoKGJl
ZyAoZ2V0LWNoYXItcHJvcGVydHkgKHBvaW50KSAnbWFya2Rvd24tdHMtY29kZS1iZWctbWFya2Vy
KSkKICAgICAgICAgICAgICAoZW5kIChnZXQtY2hhci1wcm9wZXJ0eSAocG9pbnQpICdtYXJrZG93
bi10cy1jb2RlLWVuZC1tYXJrZXIpKQogICAgICAgICAgICAgIChzdHIgKGJ1ZmZlci1zdWJzdHJp
bmctbm8tcHJvcGVydGllcyBiZWcgZW5kKSkpCiAgICA7OyBVc2UgYSB0ZW1wIChvciB3b3JrKSBi
dWZmZXIgYmVjYXVzZSB0cmVlc2l0IGN1cnJlbnRseSBjb25mdXNlcwogICAgOzsgbm9kZXMgaW4g
YW4gaW5kaXJlY3QgYnVmZmVyIGV2ZW4gaWYgdGhlIGluZGlyZWN0IGJ1ZmZlciBpcyBub3QKICAg
IDs7IG5hcnJvd2VkLgogICAgKGxldCogKCh0ZW1wLWRlYWN0aXZhdGUtbWFyaykKICAgICAgICAg
ICAob3JpZy1wb2ludCAocG9pbnQpKQogICAgICAgICAgIChvcmlnLW1hcmsgKG1hcmsgdCkpCiAg
ICAgICAgICAgKG9yaWctbWFyay1hY3RpdmUgbWFyay1hY3RpdmUpCiAgICAgICAgICAgKHJlZ2lv
bi1iZWcgKHVzZS1yZWdpb24tYmVnaW5uaW5nKSkKICAgICAgICAgICAocmVnaW9uLWVuZCAodXNl
LXJlZ2lvbi1lbmQpKQogICAgICAgICAgIChhZGotcG9pbnQgKDErICgtIG9yaWctcG9pbnQgYmVn
KSkpCiAgICAgICAgICAgKGFkai1tYXJrICh3aGVuIG9yaWctbWFyayAoMSsgKC0gb3JpZy1tYXJr
IGJlZykpKSkKICAgICAgICAgICAoYWRqLXJlZ2lvbi1iZWcgKHdoZW4gcmVnaW9uLWJlZyAoMSsg
KC0gb3JpZy1wb2ludCByZWdpb24tYmVnKSkpKQogICAgICAgICAgIChhZGotcmVnaW9uLWVuZCAo
d2hlbiByZWdpb24tZW5kICgxKyAoLSBvcmlnLXBvaW50IHJlZ2lvbi1lbmQpKSkpCiAgICAgICAg
ICAgKHBvaW50LWRlbHRhIDApCiAgICAgICAgICAgKHNvdXJjZS1idWZmZXIgKGN1cnJlbnQtYnVm
ZmVyKSkpCiAgICAgICh3aXRoLXdvcmstYnVmZmVyCiAgICAgICAgKGluc2VydCBzdHIpCiAgICAg
ICAgKGdvdG8tY2hhciBhZGotcG9pbnQpCiAgICAgICAgOzsgUHJvcGFnYXRlIG1hcmsgKGFuZCBy
ZWdpb24pLgogICAgICAgICh3aGVuIG9yaWctbWFyay1hY3RpdmUKICAgICAgICAgIChzZXQtbWFy
ayBhZGotbWFyaykpCiAgICAgICAgKG1hcmtkb3duLXRzLS1pbmhpYml0LW1lc3NhZ2VzLWFuZC13
YXJuaW5ncwogICAgICAgICAgJ21hcmtkb3duLXRzLWluaGliaXQtY29kZS1ibG9jay1tb2RlLXdh
cm5pbmdzCiAgICAgICAgICAoZGVsYXktbW9kZS1ob29rcwogICAgICAgICAgICAobGV0ICgobWFy
a2Rvd24tdHMtLXNldC11cC1pbmxpbmUKICAgICAgICAgICAgICAgICAgIChwcm92aWRlZC1tb2Rl
LWRlcml2ZWQtcCBibG9jay1tb2RlICdtYXJrZG93bi10cy1tb2RlKSkpCiAgICAgICAgICAgICAg
KGZ1bmNhbGwgYmxvY2stbW9kZSkpKSkKICAgICAgICAobGV0ICgocG9pbnQgKHBvaW50KSkKICAg
ICAgICAgICAgICAoYXJpdHkgKGNkciAoZnVuYy1hcml0eSBjb21tYW5kKSkpKQogICAgICAgICAg
KGNvbmQKICAgICAgICAgICAoKG1lbXEgY29tbWFuZCBtYXJrZG93bi10cy1jb2RlLWJsb2NrLXRo
aW5nLWNvbW1hbmRzKQogICAgICAgICAgICAod2hlbi1sZXQqICgodGhpbmcgKHRoaW5nLWF0LXBv
aW50ICdzeW1ib2wpKSkKICAgICAgICAgICAgICAoZnVuY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1h
bmQgdGhpbmcpKSkKICAgICAgICAgICAoKG1lbXEgY29tbWFuZCBtYXJrZG93bi10cy1jb2RlLWJs
b2NrLXJlZ2lvbi1jb21tYW5kcykKICAgICAgICAgICAgKHdoZW4gKGFuZCBhZGotcmVnaW9uLWJl
ZyBhZGotcmVnaW9uLWVuZCkKICAgICAgICAgICAgICAoYXBwbHkgIydmdW5jYWxsLWludGVyYWN0
aXZlbHkgY29tbWFuZAogICAgICAgICAgICAgICAgICAgICBhZGotcmVnaW9uLWJlZyBhZGotcmVn
aW9uLWVuZCBhcmdzKSkpCiAgICAgICAgICAgKCh6ZXJvcCBhcml0eSkKICAgICAgICAgICAgKGZ1
bmNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kKSkKICAgICAgICAgICAoKGVxIDEgYXJpdHkpCiAg
ICAgICAgICAgIChmdW5jYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZCAoY2FyIGFyZ3MpKSkKICAg
ICAgICAgICAodAogICAgICAgICAgICAoYXBwbHkgIydmdW5jYWxsLWludGVyYWN0aXZlbHkgY29t
bWFuZCBhcmdzKSkpCiAgICAgICAgICAoc2V0cSBzdHIgKGJ1ZmZlci1zdWJzdHJpbmctbm8tcHJv
cGVydGllcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkpCiAgICAgICAgICAoc2V0cSB0ZW1wLWRl
YWN0aXZhdGUtbWFyayBkZWFjdGl2YXRlLW1hcmspCiAgICAgICAgICAoc2V0cSBwb2ludC1kZWx0
YSAoLSAocG9pbnQpIHBvaW50KSkpCiAgICAgICAgKGxldCAoKHdvcmstYnVmZmVyIChjdXJyZW50
LWJ1ZmZlcikpKQogICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgc291cmNlLWJ1ZmZlcgog
ICAgICAgICAgICAocmVwbGFjZS1yZWdpb24tY29udGVudHMgYmVnIGVuZCB3b3JrLWJ1ZmZlcikK
ICAgICAgICAgICAgOzsgUHJvcGFnYXRlIG1hcmsgZGVhY3RpdmF0aW9uIHRvIHRoZSBzb3VyY2Ug
YnVmZmVyLgogICAgICAgICAgICAoc2V0cSBkZWFjdGl2YXRlLW1hcmsgdGVtcC1kZWFjdGl2YXRl
LW1hcmspCiAgICAgICAgICAgIDs7IE1vdmUgcG9pbnQgaWYgaXQgbW92ZWQgaW4gdGhlIHRlbXAg
YnVmZmVyLgogICAgICAgICAgICAoZ290by1jaGFyICgrIG9yaWctcG9pbnQgcG9pbnQtZGVsdGEp
KQogICAgICAgICAgICA7OyBSZWNvcmQgdGhlIG9yaWdpbmFsIGNvbW1hbmQuCiAgICAgICAgICAg
IChzZXRxIHRoaXMtY29tbWFuZCBjb21tYW5kKQogICAgICAgICAgICA7OyBUaGlzIGhlbHBzIG1h
aW50YWluIGRpc2NyZXRlIGNvbW1hbmQgYWN0aW9ucy4KICAgICAgICAgICAgKHVuZG8tYm91bmRh
cnkpCiAgICAgICAgICAgIDs7IE1ha2Ugc3VyZSB0aGUgb3JpZ2luYXRpbmcgcmVnaW9uIGlzIHJl
Zm9udGlmaWVkLgogICAgICAgICAgICAoZm9udC1sb2NrLWZsdXNoIGJlZyBlbmQpKSkpKSkpCgoo
ZGVmdW4gbWFya2Rvd24tdHMtLWZpbmQtY29kZS1ibG9jay1kZWxpbWl0ZXIgKHBvcyAmb3B0aW9u
YWwgYmFja3dhcmQpCiAgIlJldHVybiB0aGUgbmV4dCBvciBwcmV2aW91cyBmZW5jZWRfY29kZV9i
bG9ja19kZWxpbWl0ZXIgbm9kZSwgb3IgbmlsLgpTZWFyY2ggc3RhcnRpbmcgYXQgUE9TLgpTZWFy
Y2ggYmFja3dhcmQgaWYgQkFDS1dBUkQgaXMgbm9uLW5pbC4iCiAgKHRyZWVzaXQtc2VhcmNoLWZv
cndhcmQgKHRyZWVzaXQtbm9kZS1hdCBwb3MgJ21hcmtkb3duKQogICAgICAgICAgICAgICAgICAg
ICAgICAgIChsYW1iZGEgKG5vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5n
PSAodHJlZXNpdC1ub2RlLXR5cGUgbm9kZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICJmZW5jZWRfY29kZV9ibG9ja19kZWxpbWl0ZXIiKSkKICAgICAgICAgICAgICAgICAg
ICAgICAgICBiYWNrd2FyZCkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZpbmQtbmV4dC1jb2RlLWJs
b2NrLWRlbGltaXRlciAoJm9wdGlvbmFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBwb3MgYmFja3dhcmQgcmVtYWluKQogICJSZXR1cm4gdGhlIG5l
eHQgb3IgcHJldmlvdXMgZmVuY2VkX2NvZGVfYmxvY2tfZGVsaW1pdGVyIG5vZGUsIG9yIG5pbC4K
U2VhcmNoIHN0YXJ0aW5nIGF0IFBPUyBvciBgcG9pbnQnLCBpZiBQT1MgaXMgbmlsLgpTZWFyY2gg
YmFja3dhcmQgaWYgQkFDS1dBUkQgaXMgbm9uLW5pbC4KSWYgUkVNQUlOIGlzIG5vbi1uaWwsIG1v
dmUgdG8gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGN1cnJlbnQgY29kZQpibG9jaywgaWYgaW4g
b25lLiIKICAoc2V0cSBwb3MgKG9yIHBvcyAocG9pbnQpKSkKICAoYW5kLWxldCogKChub2RlICht
YXJrZG93bi10cy0tZmluZC1jb2RlLWJsb2NrLWRlbGltaXRlciBwb3MgYmFja3dhcmQpKSkKICAg
IChsZXQgKChpbi1ibG9jayAobWFya2Rvd24tdHMtYXQtY29kZS1ibG9jay1wIHBvcykpKQogICAg
ICAoY29uZAogICAgICAgKChhbmQgcmVtYWluIGluLWJsb2NrKQogICAgICAgIG5vZGUpCiAgICAg
ICAocmVtYWluCiAgICAgICAgbmlsKQogICAgICAgKHQKICAgICAgICAod2hpbGUgKGFuZCBub2Rl
CiAgICAgICAgICAgICAgICAgICAgOzsgSWYgYmFja3dhcmQsIHNraXAgdGhlIGN1cnJlbnQgYmxv
Y2sncwogICAgICAgICAgICAgICAgICAgIDs7IHN0YXJ0aW5nIGRlbGltaXRlci4KICAgICAgICAg
ICAgICAgICAgICAob3IgKGFuZCBiYWNrd2FyZCBpbi1ibG9jayAodHJlZXNpdC1ub2RlLW5leHQt
c2libGluZyBub2RlKSkKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAodHJlZXNpdC1ub2Rl
LW5leHQtc2libGluZyBub2RlKSkpKQogICAgICAgICAgKHNldHEgaW4tYmxvY2sgKG1hcmtkb3du
LXRzLWF0LWNvZGUtYmxvY2stcCBwb3MpKQogICAgICAgICAgKHNldHEgcG9zIChpZiBiYWNrd2Fy
ZAogICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpCiAgICAg
ICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWVuZCBub2RlKSkpCiAgICAgICAgICAoc2V0
cSBub2RlIChtYXJrZG93bi10cy0tZmluZC1jb2RlLWJsb2NrLWRlbGltaXRlciBwb3MgYmFja3dh
cmQpKSkKICAgICAgICBub2RlKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy1tb3ZlLXRvLW5leHQt
Y29kZS1ibG9jayAoYXJnKQogICJNb3ZlIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBj
b2RlIGJsb2NrLgpXaXRoIHRoZSBwcmVmaXggYXJndW1lbnQgQVJHLCByZW1haW4gd2l0aGluIHRo
ZSBjdXJyZW50IGNvZGUgYmxvY2suIgogIChpbnRlcmFjdGl2ZSAiUCIpCiAgKHdoZW4tbGV0KiAo
KG5vZGUKICAgICAgICAgICAgICAgKG1hcmtkb3duLXRzLS1maW5kLW5leHQtY29kZS1ibG9jay1k
ZWxpbWl0ZXIgbmlsIG5pbCBhcmcpKSkKICAgIChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1zdGFy
dCBub2RlKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLW1vdmUtdG8tcHJldmlvdXMtY29kZS1ibG9j
ayAoYXJnKQogICJNb3ZlIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgcHJldmlvdXMgY29kZSBi
bG9jay4KV2l0aCB0aGUgcHJlZml4IGFyZ3VtZW50IEFSRywgcmVtYWluIHdpdGhpbiB0aGUgY3Vy
cmVudCBjb2RlIGJsb2NrLiIKICAoaW50ZXJhY3RpdmUgIlAiKQogICh3aGVuLWxldCogKChub2Rl
CiAgICAgICAgICAgICAgIChtYXJrZG93bi10cy0tZmluZC1uZXh0LWNvZGUtYmxvY2stZGVsaW1p
dGVyIG5pbCAnYmFja3dhcmQgYXJnKSkpCiAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtc3Rh
cnQgbm9kZSkpKSkKCjs7OyBUYWJsZXMgYWthIHBpcGUgdGFibGVzOgoKOzs7OyBVdGlsaXRpZXM6
CgooZGVmY29uc3QgbWFya2Rvd24tdHMtdGFibGUtZXhwb3J0LWJ1ZmZlcgogICIqbWFya2Rvd24t
dHMtdGFibGUtZXhwb3J0KiIpCgo7OyBJbiBmcmVxdWVuY3kgbWF0Y2hpbmcgb3JkZXIuCihkZWZj
b25zdCBtYXJrZG93bi10cy0tdGFibGUtcm93LXR5cGVzCiAgJygicGlwZV90YWJsZV9yb3ciCiAg
ICAicGlwZV90YWJsZV9kZWxpbWl0ZXJfcm93IgogICAgInBpcGVfdGFibGVfaGVhZGVyIikpCgo7
OyBJbiBmcmVxdWVuY3kgbWF0Y2hpbmcgb3JkZXIuCihkZWZjb25zdCBtYXJrZG93bi10cy0tdGFi
bGUtY2VsbC10eXBlcwogICcoInBpcGVfdGFibGVfY2VsbCIKICAgICJwaXBlX3RhYmxlX2RlbGlt
aXRlcl9jZWxsIikpCgooZGVmY29uc3QgbWFya2Rvd24tdHMtLXRhYmxlLWRlbGltaXRlci1jZWxs
LXR5cGVzCiAgJygicGlwZV90YWJsZV9kZWxpbWl0ZXJfY2VsbCIKICAgICJwaXBlX3RhYmxlX2Fs
aWduX2xlZnQiCiAgICAicGlwZV90YWJsZV9hbGlnbl9yaWdodCIpKQoKKGRlZmNvbnN0IG1hcmtk
b3duLXRzLS10YWJsZS1kZWxpbWl0ZXItY2VsbC1zdWJ0eXBlcwogICcoInBpcGVfdGFibGVfYWxp
Z25fbGVmdCIKICAgICJwaXBlX3RhYmxlX2FsaWduX3JpZ2h0IikpCgooZGVmdW4gbWFya2Rvd24t
dHMtLXRhYmxlLWFidXR0aW5nLXBvcyAocG9zKQogICJBZGp1c3QgUE9TIHRvIGFidXQgaXRzIGNs
b3Nlc3QgdGV4dC4KUmV0dXJuIHBvcyBhZGp1c3RlZCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIG5l
YXJlc3Qgbm9uLWJsYW5rIGNoYXJhY3Rlci4KT3RoZXJ3aXNlLCByZXR1cm4gbmlsLCBmb3IgZXhh
bXBsZSwgaWYgdGhlIGxpbmUgaXMgZW1wdHkuIgogIChzYXZlLWV4Y3Vyc2lvbgogICAgKGdvdG8t
Y2hhciBwb3MpCiAgICAoc2tpcC1jaGFycy1mb3J3YXJkICJbWzpibGFuazpdXSIgKHBvcy1lb2wp
KQogICAgKGlmIChlcSBwb3MgKHBvcy1lb2wpKQogICAgICAgIChwcm9nbgogICAgICAgICAgKGdv
dG8tY2hhciBwb3MpCiAgICAgICAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiW1s6Ymxhbms6XV0i
IChwb3MtYm9sKSkKICAgICAgICAgICh1bmxlc3MgKGVxIHBvcyAocG9zLWJvbCkpCiAgICAgICAg
ICAgIChtYXggKHBvaW50LW1pbikgKDEtIChwb2ludCkpKSkpCiAgICAgIChtaW4gKHBvaW50LW1h
eCkgKDErIChwb2ludCkpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS10YWJsZS1ub2RlLWNlbGwg
KCZvcHRpb25hbCBub2RlIHBvcyBhYnV0dGluZykKICAiQ29tcHV0ZSB0YWJsZSBjZWxsIGZyb20g
bmFtZWQgTk9ERSBhdCBQT1MuCklmIE5PREUgaXMgbmlsLCB1c2UgdGhlIG5vZGUgYXQgUE9TLgpJ
ZiBQT1MgaXMgbmlsLCB1c2UgYHBvaW50Jy4KSWYgTk9ERSBpcyBhIGNlbGwgdHlwZSwgcmV0dXJu
IGl0LgpJZiBOT0RFIGlzIGEgc3VidHlwZSwgcHJvbW90ZSBpdC4KSWYgQUJVVFRJTkcgaXMgbm9u
LW5pbCwgYWRqdXN0IFBPUyB0byB0aGUgbmVhcmVzdCBub24tYmxhbmsgY2hhcmFjdGVyLgpPdGhl
cndpc2UsIHJldHVybiBuaWwuIgogIDs7IFdlIGNvdWxkIHNhbml0eSBjaGVjayB2aWEgYHRyZWVz
aXQtbm9kZS1uYW1lZCcgYW5kIGVycm9yIGlmIG5vdC4KICAoc2V0cSBwb3MgKG9yIHBvcyAocG9p
bnQpKSkKICAod2hlbiBhYnV0dGluZwogICAgKHNldHEgcG9zIChvciAobWFya2Rvd24tdHMtLXRh
YmxlLWFidXR0aW5nLXBvcyBwb3MpIHBvcykpKQogICh3aGVuLWxldCogKChub2RlIChvciBub2Rl
CiAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtYXQgcG9zICdtYXJrZG93biAn
bmFtZWQpKSkKICAgICAgICAgICAgICAodHlwZSAodHJlZXNpdC1ub2RlLXR5cGUgbm9kZSkpKQog
ICAgKGNvbmQgKChtZW1iZXIgdHlwZSBtYXJrZG93bi10cy0tdGFibGUtY2VsbC10eXBlcykKICAg
ICAgICAgICBub2RlKQogICAgICAgICAgKChtZW1iZXIgdHlwZSBtYXJrZG93bi10cy0tdGFibGUt
ZGVsaW1pdGVyLWNlbGwtc3VidHlwZXMpCiAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1wYXJlbnQg
bm9kZSkpCiAgICAgICAgICAoKG1lbWJlciB0eXBlIG1hcmtkb3duLXRzLS10YWJsZS1yb3ctdHlw
ZXMpCiAgICAgICAgICAgKGNvbmQgKChlcSBhYnV0dGluZyAnbGVmdCkKICAgICAgICAgICAgICAg
ICAgKHRyZWVzaXQtbm9kZS1jaGlsZCBub2RlIDAgJ25hbWVkKSkKICAgICAgICAgICAgICAgICA7
OyBBY2NvdW50IGZvciAncmlnaHQgb3IgdC4KICAgICAgICAgICAgICAgICAodAogICAgICAgICAg
ICAgICAgICAodHJlZXNpdC1ub2RlLWNoaWxkIG5vZGUgLTEgJ25hbWVkKSkpKSkpKQoKKGRlZnVu
IG1hcmtkb3duLXRzLS10YWJsZS1ub2RlLXJvdyAoJm9wdGlvbmFsIG5vZGUgcG9zKQogICJDb21w
dXRlIHRhYmxlIHJvdyBmcm9tIG5hbWVkIE5PREUgYXQgUE9TLgpJZiBOT0RFIGlzIG5pbCwgdXNl
IHRoZSBub2RlIGF0IFBPUy4KSWYgUE9TIGlzIG5pbCwgdXNlIGBwb2ludCcuCklmIE5PREUgaXMg
YSByb3cgdHlwZSwgcmV0dXJuIGl0LgpJZiBOT0RFIGlzIGEgdGFibGUgY2VsbCB0eXBlLCByZXR1
cm4gaXRzIHJvdy4KT3RoZXJ3aXNlLCByZXR1cm4gbmlsLiIKICA7OyBXZSBjb3VsZCBzYW5pdHkg
Y2hlY2sgdmlhIGB0cmVlc2l0LW5vZGUtbmFtZWQnIGFuZCBlcnJvciBpZiBub3QuCiAgKHdoZW4t
bGV0KiAoKG5vZGUgKG9yIG5vZGUKICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9k
ZS1hdCAob3IgcG9zIChwb2ludCkpICdtYXJrZG93biAnbmFtZWQpKSkKICAgICAgICAgICAgICAo
dHlwZSAodHJlZXNpdC1ub2RlLXR5cGUgbm9kZSkpKQogICAgKGlmIChtZW1iZXIgdHlwZSBtYXJr
ZG93bi10cy0tdGFibGUtcm93LXR5cGVzKQogICAgICAgIG5vZGUKICAgICAgICh0cmVlc2l0LW5v
ZGUtcGFyZW50IChtYXJrZG93bi10cy0tdGFibGUtbm9kZS1jZWxsIG5vZGUpKSkpKQoKKGRlZnVu
IG1hcmtkb3duLXRzLS10YWJsZS1wYXJzZS1lcnJvci1wICgmb3B0aW9uYWwgbm9kZSBwb3MpCiAg
IlJldHVybiBub24tbmlsIGlmIG5hbWVkIE5PREUgYXQgUE9TIGlzIGluIGFuIFwiRVJST1JcIiBz
dWJ0cmVlLgpOT0RFIG11c3QgYmUgYSB0YWJsZSBlbGVtZW50OyBpLmUuLCBpdHMgdHlwZSBwcmVm
aXggaXMgXCJwaXBlX3RhYmxlXCIuCklmIE5PREUgaXMgYSB0YWJsZSwgcmV0dXJuIG5pbCAoaXQg
c2hvdWxkbid0IGJlIGluIEVSUk9SKS4KSWYgTk9ERSBpcyBub3QgYSB0YWJsZSBlbGVtZW50LCBy
ZXR1cm4gbmlsLgpJZiBOT0RFJ3MgbmVhcmJ5IGFuY2VzdG9yIGlzIGFuIFwiRVJST1JcIiBub2Rl
LCByZXR1cm4gdC4KT3RoZXJ3aXNlLCByZXR1cm4gbmlsLiIKICA7OyBXZSBjb3VsZCBzYW5pdHkg
Y2hlY2sgdmlhIGB0cmVlc2l0LW5vZGUtbmFtZWQnIGFuZCBlcnJvciBpZiBub3QuCiAgKHdoZW4t
bGV0KiAoKHJvdyAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtcm93IG5vZGUgcG9zKSkKICAgICAg
ICAgICAgICAodHlwZSAodHJlZXNpdC1ub2RlLXR5cGUgcm93KSkKICAgICAgICAgICAgICAocGFy
ZW50ICh0cmVlc2l0LW5vZGUtcGFyZW50IHJvdykpCiAgICAgICAgICAgICAgKHBhcmVudC10eXBl
ICh0cmVlc2l0LW5vZGUtdHlwZSBwYXJlbnQpKSkKICAgIChjb25kICgoZXF1YWwgdHlwZSAicGlw
ZV90YWJsZSIpCiAgICAgICAgICAgbmlsKQogICAgICAgICAgKChlcXVhbCBwYXJlbnQtdHlwZSAi
cGlwZV90YWJsZSIpCiAgICAgICAgICAgbmlsKQogICAgICAgICAgKChlcXVhbCBwYXJlbnQtdHlw
ZSAiRVJST1IiKQogICAgICAgICAgIHQpCiAgICAgICAgICAodAogICAgICAgICAgIChlcnJvciAi
U2hvdWxkIG5ldmVyIGhhcHBlbiIpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLWF0LXRhYmxlLXAg
KCZvcHRpb25hbCBwb3MgYWJ1dHRpbmcpCiAgIlJldHVybiBub24tbmlsIGlmIFBPUyBpcyBhdCBv
ciBpbiBhIHBpcGUgdGFibGUuCklmIFBPUyBpcyBuaWwsIHVzZSBwb2ludC4KUmV0dXJuIGNvbnMg
KHBvcyAuIHRhYmxlLW5vZGUpIGlmIFBPUyBpcyB3aXRoaW4gYSB0YWJsZSwgb3RoZXJ3aXNlCnJl
dHVybiBuaWwuCmlmIFBPUyBpcyB3aXRoaW4gYSB0YWJsZSBidXQgd2l0aCBwYXJzZSBlcnJvcnMs
IHNpZ25hbCBhbiBlcnJvci4KSWYgQUJVVFRJTkcgaXMgbm9uLW5pbCwgYWRqdXN0IFBPUyB0byB0
aGUgbmVhcmVzdCBub24tYmxhbmsgY2hhcmFjdGVyLgpJZiB0aGUgcGFyc2VkIHRhYmxlIGlzIGlu
IEVSUk9SLCByZXR1cm4gbmlsLiIKICAoc2V0cSBwb3MgKG9yIHBvcyAocG9pbnQpKSkKICAoc2F2
ZS1leGN1cnNpb24KICAgIChnb3RvLWNoYXIgcG9zKQogICAgOzsgSWYgcG9pbnQgaXMgb24gYW4g
ZW1wdHkgbGluZSwgaXQgaXMgbmV2ZXIgYSB0YWJsZS4KICAgICh1bmxlc3MgKGFuZCAoZW9scCkg
KGJvbHApKQogICAgICA7OyBJZiBwb2ludCBpcyBib2wgb3IgZW9sIGl0IG1pZ2h0IGJlIGFidXR0
aW5nIGEgcGlwZSBzeW1ib2wgc28KICAgICAgOzsgbG9vayBmb3J3YXJkcyBvciBiYWNrd2FyZHMg
b25lIGNoYXJhY3RlciB0byB0ZXN0IGlmIHRoYXQgcG9zCiAgICAgIDs7IGlzIGEgdGFibGUuCiAg
ICAgICh3aGVuIGFidXR0aW5nCiAgICAgICAgKHNldHEgcG9zIChvciAobWFya2Rvd24tdHMtLXRh
YmxlLWFidXR0aW5nLXBvcyBwb3MpIHBvcykpKQogICAgICAod2hlbi1sZXQqICgocm93IChtYXJr
ZG93bi10cy0tdGFibGUtbm9kZS1yb3cgbmlsIHBvcykpKQogICAgICAgIChpZiAobWFya2Rvd24t
dHMtLXRhYmxlLXBhcnNlLWVycm9yLXAgcm93KQogICAgICAgICAgICA7OyBEbyBub3QgdXNlIGVy
cm9yIG9yIHdhcm5pbmcgaGVyZS4gIEVycm9ycyBpbnRlcmZlcmUgd2l0aAogICAgICAgICAgICA7
OyB0aGUgY29tbWFuZCBsb29wLiAgV2FybmluZ3MgYXJlIGFubm95aW5nLgogICAgICAgICAgICAo
cHJvZ24KICAgICAgICAgICAgICAobWVzc2FnZSAiSW5jb3JyZWN0bHkgZm9ybWF0dGVkIE1hcmtk
b3duIHRhYmxlIChwYXJzZXIgZXJyb3IpIikKICAgICAgICAgICAgICBuaWwpCiAgICAgICAgICAo
Y29ucyBwb3MgKHRyZWVzaXQtc2VhcmNoLWZvcndhcmQKICAgICAgICAgICAgICAgICAgICAgcm93
CiAgICAgICAgICAgICAgICAgICAgICJcXGBwaXBlX3RhYmxlXFwnIiAnYmFja3dhcmQpKSkpKSkp
CgooZGVmdW4gbWFya2Rvd24tdHMtLWVuYWJsZS1pbi10YWJsZS1tb2RlICgpCiAgIkVuYWJsZSBg
bWFya2Rvd24tdHMtaW4tdGFibGUtbW9kZScgaWYgaW4gYSB0YWJsZS4KQSB0YWJsZSB3aXRoIGEg
cGFyc2VyIEVSUk9SIGlzIGluZWxpZ2libGUuIgogIChtYXJrZG93bi10cy1pbi10YWJsZS1tb2Rl
CiAgIChpZiAobWFya2Rvd24tdHMtYXQtdGFibGUtcCBuaWwgdCkgMSAtMSkpKQoKKGRlZnVuIG1h
cmtkb3duLXRzLS10YWJsZS1ib2R5LXJvdy1uZWFyLXBvcyAoJm9wdGlvbmFsIHBvcyBhYnV0dGlu
ZykKICAiUmV0dXJuIHRoZSByb3cgbmVhciBQT1MuClJldHVybiBuaWwgaWYgbm90IGF0IGEgdGFi
bGUgb3IgdGhlcmUgaXMgbm8gcm93LgpPdGhlcndpc2UgcmV0dXJuIGNvbnMgKHJvdyAuIGluLWhl
YWRlcikgd2hlcmUgaW4taGVhZGVyIGlzIG5pbCBvciB0LgpUaGlzIGlzIHVzZWZ1bCB0byBpbnNl
cnQgYSBuZXcgcm93IGp1c3QgYmVsb3cgdGhlIGhlYWRlciBpbnN0ZWFkIG9mIGp1c3QKYmVsb3cg
dGhlIGZpcnN0IHJvdy4KSWYgUE9TIGlzIG5pbCB1c2UgYHBvaW50Jy4KSWYgQUJVVFRJTkcgaXMg
bm9uLW5pbCwgdXNlICgxLSBQT1MpIGlmIFBPUyBpcyBpbW1lZGlhdGVseSBhZnRlciBhIHBpcGUK
c3ltYm9sLiIKICAoc2V0cSBwb3MgKG9yIHBvcyAocG9pbnQpKSkKICAobGV0IChpbi1oZWFkZXIp
CiAgICAod2hlbi1sZXQqICgoYXQtdGFibGUgKG1hcmtkb3duLXRzLWF0LXRhYmxlLXAgcG9zIGFi
dXR0aW5nKSkKICAgICAgICAgICAgICAgIChwb3MgKGNhciBhdC10YWJsZSkpCiAgICAgICAgICAg
ICAgICAodGFibGUgKGNkciBhdC10YWJsZSkpCiAgICAgICAgICAgICAgICAoY2VsbCAobWFya2Rv
d24tdHMtLXRhYmxlLW5vZGUtY2VsbCBuaWwgcG9zIGFidXR0aW5nKSkKICAgICAgICAgICAgICAg
IChjZWxsLXR5cGUgKHRyZWVzaXQtbm9kZS10eXBlIGNlbGwpKQogICAgICAgICAgICAgICAgKHBh
cmVudCAodHJlZXNpdC1ub2RlLXBhcmVudCBjZWxsKSkKICAgICAgICAgICAgICAgIChwYXJlbnQt
dHlwZSAodHJlZXNpdC1ub2RlLXR5cGUgcGFyZW50KSkKICAgICAgICAgICAgICAgIChsaW5lYWdl
IChsaXN0IGNlbGwtdHlwZSBwYXJlbnQtdHlwZSkpCiAgICAgICAgICAgICAgICA7OyBGaW5kIHRo
ZSBmaXJzdCByb3cgYWZ0ZXIgdGhlIGhlYWRlciBvciB0aGUgcm93IGF0IFBPUyBpcwogICAgICAg
ICAgICAgICAgOzsgb24gYW5kIGluIHRoZSBzYW1lIHRhYmxlLgogICAgICAgICAgICAgICAgKHJv
dyAoY29uZCAoKG9yIChtZW1iZXIgInBpcGVfdGFibGVfaGVhZGVyIiBsaW5lYWdlKQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChtZW1iZXIgInBpcGVfdGFibGVfZGVsaW1pdGVyX3Jv
dyIgbGluZWFnZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBpbi1oZWFkZXIg
dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LXNlYXJjaC1mb3J3YXJkIGNl
bGwgIlxcYHBpcGVfdGFibGVfcm93XFwnIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgo
ZXF1YWwgY2VsbC10eXBlICJwaXBlX3RhYmxlX3JvdyIpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjZWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVxdWFsIHBhcmVudC10eXBl
ICJwaXBlX3RhYmxlX3JvdyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQpKSkp
CiAgICAgICh3aGVuICh0cmVlc2l0LW5vZGUtZXEgdGFibGUgKHRyZWVzaXQtc2VhcmNoLWZvcndh
cmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJcXGBwaXBlX3RhYmxlXFwnIiAnYmFja3dhcmQpKQogICAg
ICAgIChjb25zIHJvdyBpbi1oZWFkZXIpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS10YWJsZS1j
b21wdXRlLW5vZGUtY29sdW1uIChyb3cgbm9kZSkKICAiQ29tcHV0ZSBOT0RFJ3MgY29sdW1uIGlu
IFJPVy4KUmV0dXJuIG5pbCBpZiBOT0RFIGlzIG5vdCBpbiBST1cgKHRoaXMgc2hvdWxkIG5vdCBo
YXBwZW4pLgpOT0RFIG11c3QgYmUgYSBub2RlIGluIFJPVy4KUk9XIG11c3QgYmUgYSBwaXBlX3Rh
YmxlX2hlYWRlciwgcGlwZV90YWJsZV9kZWxpbWl0ZXJfcm93LCBvcgpwaXBlX3RhYmxlX3Jvdy4i
CiAgKGNhdGNoIDpjb2x1bW4KICAgIChsZXQgKChjb3VudCAwKSkKICAgICAgKGRvbGlzdCAoY2Vs
bCAodHJlZXNpdC1ub2RlLWNoaWxkcmVuIHJvdyAnbmFtZWQpKQogICAgICAgICh3aGVuICh0cmVl
c2l0LW5vZGUtZXEgbm9kZSBjZWxsKQogICAgICAgICAgKHRocm93IDpjb2x1bW4gY291bnQpKQog
ICAgICAgIChzZXRxIGNvdW50ICgxKyBjb3VudCkpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRh
YmxlLS1nb3RvLWNvbHVtbiAoY29sdW1uICZvcHRpb25hbCBuby1lcnJvcikKICAiTW92ZSBwb2lu
dCBvbiB0aGUgY3VycmVudCByb3cgdG8gQ09MVU1OLgpDT0xVTU4gaXMgYSAwLWJhc2VkIGluZGV4
LgpSZXR1cm4gbm9uLW5pbCBpZiBzdWNjZXNzZnVsLgpJZiBOTy1FUlJPUiBpcyBub24tbmlsLCBy
ZXR1cm4gbmlsIGlmIHRoZSBjdXJyZW50IHJvdyBkb2VzIG5vdCBleHRlbmQgdG8KQ09MVU1OLCBv
dGhlcndpc2Ugc2lnbmFsIGFuIGVycm9yLgpTaWduYWwgYW4gZXJyb3IgaWYgcG9pbnQgaXMgbm90
IGF0IGEgdGFibGUuIgogIChpZi1sZXQqICgoY2VsbCAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUt
Y2VsbCBuaWwgbmlsIHQpKQogICAgICAgICAgICAocm93IChtYXJrZG93bi10cy0tdGFibGUtbm9k
ZS1yb3cgY2VsbCkpCiAgICAgICAgICAgIChjb2xzICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4gcm93
ICduYW1lZCkpKQogICAgICAoaWYtbGV0KiAoKHRhcmdldC1jZWxsIChudGggY29sdW1uIGNvbHMp
KSkKICAgICAgICAgIChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1zdGFydCB0YXJnZXQtY2VsbCkp
CiAgICAgICAgKHVubGVzcyBuby1lcnJvcgogICAgICAgICAgKGVycm9yICJDb2x1bW4gJVMgbm90
IGZvdW5kIiBjb2x1bW4pKSkKICAgIChlcnJvciAiTm90IGF0IGEgdGFibGUiKSkpCgooZGVmdW4g
bWFya2Rvd24tdHMtLXRhYmxlLWFsaWduZXJzICh0YWJsZSkKICAiRXh0cmFjdCB0aGUgaGVhZGVy
IGxpbmUgYWxpZ25lcnMgZnJvbSBub2RlIFRBQkxFLgpSZXR1cm4gYSBsaXN0IG9mIGxpc3RzIG9m
IHRoZSBmb3JtOgogICg6YmVnIHh4eCA6ZW5kIHh4eCA6YWxpZ24gbGVmdCkKOmFsaWduIGlzIG9u
ZSBvZiBgbGVmdCcgYGNlbnRlcicgYHJpZ2h0JyBgdW5zcGVjaWZpZWQnLiIKICAobGV0KiAoKGRl
bGltaXRlci1yb3cgKHRyZWVzaXQtc2VhcmNoLXN1YnRyZWUKICAgICAgICAgICAgICAgICAgICAg
ICAgIHRhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAiXFxgcGlwZV90YWJsZV9kZWxpbWl0
ZXJfcm93XFwnIikpCiAgICAgICAgIChhbGlnbmVycwogICAgICAgICAgKGxldCAocmVzKQogICAg
ICAgICAgICAoZG9saXN0IChlbHQgKHRyZWVzaXQtbm9kZS1jaGlsZHJlbiBkZWxpbWl0ZXItcm93
ICduYW1lZCkpCiAgICAgICAgICAgICAgKGxldCAoKGFsaWduLWJlZyAodHJlZXNpdC1ub2RlLXR5
cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWNoaWxkIGVs
dCAwICduYW1lKSkpCiAgICAgICAgICAgICAgICAgICAgKGFsaWduLWVuZCAodHJlZXNpdC1ub2Rl
LXR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWNoaWxk
IGVsdCAtMSAnbmFtZSkpKSkKICAgICAgICAgICAgICAgIChwdXNoIChsaXN0CiAgICAgICAgICAg
ICAgICAgICAgICAgOmJlZyAodHJlZXNpdC1ub2RlLXN0YXJ0IGVsdCkKICAgICAgICAgICAgICAg
ICAgICAgICA6ZW5kICh0cmVlc2l0LW5vZGUtZW5kIGVsdCkKICAgICAgICAgICAgICAgICAgICAg
ICA6YWxpZ24KICAgICAgICAgICAgICAgICAgICAgICAoY29uZCAoKGFuZAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGVxdWFsIGFsaWduLWJlZyAicGlwZV90YWJsZV9hbGlnbl9sZWZ0
IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCBhbGlnbi1lbmQgInBpcGVf
dGFibGVfYWxpZ25fbGVmdCIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGVmdCkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGFuZAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKGVxdWFsIGFsaWduLWJlZyAicGlwZV90YWJsZV9hbGlnbl9sZWZ0IikKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCBhbGlnbi1lbmQgInBpcGVfdGFibGVfYWxp
Z25fcmlnaHQiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NlbnRlcikKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoKGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGVxdWFsIGFsaWduLWJlZyAicGlwZV90YWJsZV9hbGlnbl9yaWdodCIpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoZXF1YWwgYWxpZ24tZW5kICJwaXBlX3RhYmxlX2FsaWduX3Jp
Z2h0IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaWdodCkKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAodCAndW5zcGVjaWZpZWQpKSkKICAgICAgICAgICAgICAgICAgICAg
IHJlcykpKQogICAgICAgICAgICAobnJldmVyc2UgcmVzKSkpKQogICAgYWxpZ25lcnMpKQoKKGRl
ZnVuIG1hcmtkb3duLXRzLS10YWJsZS1tYWtlLWFsaWduZXIgKHdpZHRoIGFsaWduKQogICJNYWtl
IGEgTWFya2Rvd24gY29sdW1uIGFsaWduZXIuCldJRFRIIGlzIHRoZSBjb2x1bW4gd2lkdGguCkFM
SUdOIGlzIG9uZSBvZiBgbGVmdCcgYGNlbnRlcicgYHJpZ2h0JyBgdW5zcGVjaWZpZWQnLiIKICAo
cGNhc2UgYWxpZ24KICAgICgnbGVmdAogICAgIChjb25jYXQgIjoiIChtYWtlLXN0cmluZyAoMS0g
d2lkdGgpID8tKSkpCiAgICAoJ2NlbnRlcgogICAgIChjb25jYXQgIjoiIChtYWtlLXN0cmluZyAo
LSB3aWR0aCAyKSA/LSkgIjoiKSkKICAgICgncmlnaHQKICAgICAoY29uY2F0IChtYWtlLXN0cmlu
ZyAoMS0gd2lkdGgpID8tKSAiOiIpKQogICAgKF8KICAgICAoY29uY2F0IChtYWtlLXN0cmluZyB3
aWR0aCA/LSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLXRhYmxlLWFsaWduLWNlbGwgKHRleHQg
d2lkdGggYWxpZ24pCiAgIlJldHVybiBURVhUIHBhZGRlZCB0byBXSURUSCBhbGlnbmVkIHVzaW5n
IEFMSUdOLgpUcnVuY2F0ZSBURVhUIHdpZGVyIHRoYW4gV0lEVEguICBJdCBpcyB0aGUgY2FsbGVy
J3MgcmVzcG9uc2liaWxpdHkgdG8KZW5zdXJlIHRleHQgd2lsbCBmaXQuCkFMSUdOIGlzIG9uZSBv
ZiBgbGVmdCcgYGNlbnRlcicgYHJpZ2h0JyBgdW5zcGVjaWZpZWQnLiIKICAobGV0KiAoKHN0cmxl
biAobGVuZ3RoIHRleHQpKQogICAgICAgICAoc3RybGVuMCAobWluIHdpZHRoIHN0cmxlbikpCiAg
ICAgICAgICh0ZXh0MCAoc3Vic3RyaW5nIHRleHQgMCBzdHJsZW4wKSkKICAgICAgICAgKHBhZCAo
LSB3aWR0aCBzdHJsZW4wKSkpCiAgICAocGNhc2UgYWxpZ24KICAgICAgKCdjZW50ZXIKICAgICAg
IChsZXQqICgoaGFsZi1wYWQgKG1ha2Utc3RyaW5nIChmbG9vciAoLyBwYWQgMikpID9ccykpCiAg
ICAgICAgICAgICAgKHMgKGNvbmNhdAogICAgICAgICAgICAgICAgICBoYWxmLXBhZAogICAgICAg
ICAgICAgICAgICB0ZXh0MAogICAgICAgICAgICAgICAgICBoYWxmLXBhZCkpKQogICAgICAgICAo
c3RyaW5nLXBhZAogICAgICAgICAgKHN1YnN0cmluZyBzIDAgKG1pbiAobGVuZ3RoIHMpIHdpZHRo
KSkKICAgICAgICAgIHdpZHRoKSkpCiAgICAgICgncmlnaHQKICAgICAgIChzdHJpbmctcGFkIHRl
eHQgd2lkdGggbmlsICdzdGFydCkpCiAgICAgIChfCiAgICAgICAoc3RyaW5nLXBhZCB0ZXh0IHdp
ZHRoKSkpKSkKCjs7OzsgQ29tbWFuZHM6CgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0
LXRhYmxlICgmb3B0aW9uYWwgbnJvd3MgbmNvbHMgaGVhZGluZ3MgYm9keSkKICAiSW5zZXJ0IGEg
TWFya2Rvd24gcGlwZSB0YWJsZS4KTlJPV1MgaXMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBu
ZXcgdGFibGUgYW5kIGRlZmF1bHRzIHRvIDMuCgpOQ09MUyBpcyB0aGUgbnVtYmVyIG9mIGNvbHVt
bnMgYW5kIGRlZmF1bHRzIHRvIDMuCgpIRUFESU5HUyBpcyBhIGxpc3Qgb2YgaGVhZGluZ3MgYW5k
IGRlZmF1bHRzIHRvIGxlZnQtYWxpZ25lZCBzeW50aGVzaXplZApjb2x1bW4gbmFtZXMuICBJZiBO
Q09MUyBpcyBuaWwsIHVzZSBIRUFESU5HUyBsZW5ndGguICBJZiBib3RoIE5DT0xTIGFuZApIRUFE
SU5HUyBhcmUgbm9uLW5pbCwgdXNlIHVwIHRvIE5DT0xTIGhlYWRpbmdzLCBzeW50aGVzaXppbmcg
dGhlCnJlbWFpbmRlci4KCkVhY2ggaGVhZGluZyBpbiB0aGUgbGlzdCBjYW4gYmUgYSBzdHJpbmcg
Y29sdW1uIG5hbWUgb3IgYSBjb25zIG9mIHRoZQpmb3JtIChuYW1lIC4gYWxpZ25tZW50KSB3aGVy
ZSBhbGlnbm1lbnQgaXMgb25lIG9mIHRoZSBzeW1ib2xzIGBsZWZ0JywKYHJpZ2h0Jywgb3IgYGNl
bnRlcicuICBJZiBhIHN0cmluZywgZGVmYXVsdCBhbGlnbm1lbnQgaXMgdW5zcGVjaWZpZWQuCgpJ
ZiBCT0RZIGlzIG5vbi1uaWwsIGl0IGlzIGEgbGlzdCBvZiBOUk9XUyByb3dzIHdoZXJlIGVhY2gg
cm93IGlzIGEgbGlzdApvZiBOQ09MUyBib2R5IGNlbGxzLgoKRm9yIGNvbnZlbmllbmNlIGFuZCBh
ZXN0aGV0aWNzLCBwYWQgZWFjaCBib2R5IGNlbGwgdG8gdGhlIHdpZHRoIG9mIGl0cwpjb2x1bW4n
cyBoZWFkZXIsIGFuZCBhY2NvbW1vZGF0ZSBhbGlnbm1lbnQgaW5kaWNhdG9ycy4gIElmIGEgQk9E
WSBjZWxsCmlzIGxvbmdlciB0aGFuIGl0cyBjb2x1bW4gaGVhZGVyLCBpbnNlcnQgaXQgdW5jaGFu
Z2VkLgoKTm90ZTogQSBibGFuayBsaW5lIGlzIG5lZWRlZCBiZWZvcmUgdGhlIHRhYmxlIGZvciBp
dCB0byBwcm9wZXJseSByZW5kZXIuCklmIHRoZSBsaW5lIHByZWNlZGluZyBgcG9pbnQnIGlzIG5v
dCBibGFuaywgaW5zZXJ0IG9uZS4KCk5vdGU6IER1ZSB0byBhbiBpc3N1ZSB3aXRoIHRoZSB0cmVl
LXNpdHRlciBNYXJrZG93biBncmFtbWFyLCBhIHJvdyBvZgplbXB0eSBjZWxscyBjYXVzZXMgYSBw
YXJzaW5nIGVycm9yLiAgVG8gYXZvaWQgdGhpcywgYW4gZW1wdHkgcm93IHdpbGwKY29udGFpbiBh
IHNpbmdsZSBwZXJpb2QgaW4gaXRzIGZpcnN0IGNlbGwuIgogIChpbnRlcmFjdGl2ZSkKICAoc2V0
cSBucm93cyAob3IgbnJvd3MgMykpCiAgKHNldHEgbmNvbHMgKG9yIG5jb2xzIChhbmQgaGVhZGlu
Z3MgKGxlbmd0aCBoZWFkaW5ncykpIDMpKQogIChzZXRxIGhlYWRpbmdzCiAgICAgICAgKGxldCAo
cmVzKQogICAgICAgICAgKGRvdGltZXMgKHggbmNvbHMpCiAgICAgICAgICAgIChwdXNoIChvciAo
bnRoIHggaGVhZGluZ3MpCiAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICJDb2x1bW4gJWQi
ICgxKyB4KSkpCiAgICAgICAgICAgICAgICAgIHJlcykpCiAgICAgICAgICAobnJldmVyc2UgcmVz
KSkpCiAgKGxldCAoKGhlYWRpbmctd2lkdGhzCiAgICAgICAgIChsZXQgKHJlcykKICAgICAgICAg
ICAoZG9saXN0IChlbHQgaGVhZGluZ3MpCiAgICAgICAgICAgICAobGV0ICgoc3RyIChpZiAoY29u
c3AgZWx0KSAoY2FyIGVsdCkgZWx0KSkpCiAgICAgICAgICAgICAgIChwdXNoIChtYXggbWFya2Rv
d24tdHMtdGFibGUtZGVmYXVsdC1jb2x1bW4td2lkdGgKICAgICAgICAgICAgICAgICAgICAgICAg
ICAobGVuZ3RoIHN0cikpCiAgICAgICAgICAgICAgICAgICAgIHJlcykpKQogICAgICAgICAgIChu
cmV2ZXJzZSByZXMpKSkpCiAgICA7OyBJZiBwb2ludCBpcyBub3QgYXQgYm9sLCBpbnNlcnQgYSBu
ZXdsaW5lLgogICAgKHVubGVzcyAoZXEgKHBvaW50KSAocG9zLWJvbCkpCiAgICAgIChpbnNlcnQg
IlxuIikpCiAgICA7OyBJbnNlcnQgYW4gZW1wdHkgbGluZSBpZiBuZWVkZWQuCiAgICAodW5sZXNz
IChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgIChmb3J3YXJkLWxpbmUgLTEpCiAgICAgICAg
ICAgICAgKGVxIChwb3MtYm9sKSAocG9zLWVvbCkpKQogICAgICAoaW5zZXJ0ICJcbiIpKQogICAg
OzsgSW5zZXJ0IHBhZGRlZCBoZWFkaW5nIHRleHQuCiAgICAoaW5zZXJ0ICJ8IikKICAgIChkb3Rp
bWVzICh4IG5jb2xzKQogICAgICAobGV0KiAoKGVsdCAobnRoIHggaGVhZGluZ3MpKQogICAgICAg
ICAgICAgKHN0ciAoaWYgKGNvbnNwIGVsdCkgKGNhciBlbHQpIGVsdCkpCiAgICAgICAgICAgICAo
d2lkdGggKG1heCAzIChudGggeCBoZWFkaW5nLXdpZHRocykpKQogICAgICAgICAgICAgKHBhZC13
aWR0aCAoLSB3aWR0aCAobGVuZ3RoIHN0cikpKSkKICAgICAgICAoaW5zZXJ0IHN0ciAobWFrZS1z
dHJpbmcgcGFkLXdpZHRoID9ccykgInwiKSkpCiAgICAoaW5zZXJ0ICJcbiIpCiAgICA7OyBJbnNl
cnQgcGFkZGVkIGhlYWRpbmcgYWxpZ25lcnMuCiAgICAoaW5zZXJ0ICJ8IikKICAgIChkb3RpbWVz
ICh4IG5jb2xzKQogICAgICAobGV0KiAoKGVsdCAobnRoIHggaGVhZGluZ3MpKQogICAgICAgICAg
ICAgKGFsaWduIChpZiAoY29uc3AgZWx0KSAoY2RyIGVsdCkgJ3Vuc3BlY2lmaWVkKSkKICAgICAg
ICAgICAgICh3aWR0aCAobWF4IDMgKG50aCB4IGhlYWRpbmctd2lkdGhzKSkpKQogICAgICAgIChp
bnNlcnQgKG1hcmtkb3duLXRzLS10YWJsZS1tYWtlLWFsaWduZXIgd2lkdGggYWxpZ24pKSkKICAg
ICAgKGluc2VydCAifCIpKQogICAgKGluc2VydCAiXG4iKQogICAgOzsgSW5zZXJ0IEJPRFkgY2Vs
bHMgb3IgZW1wdHkgY2VsbHMuCiAgICAoZG90aW1lcyAoeSBucm93cykKICAgICAgKGluc2VydCAi
fCIpCiAgICAgIChsZXQgKChyb3cgKG50aCB5IGJvZHkpKSkKICAgICAgICAoZG90aW1lcyAoeCBu
Y29scykKICAgICAgICAgIDs7IFRPRE86IFJlbW92ZSB0aGUgcGxhY2Vob2xkZXIgY2hhcmFjdGVy
IGlmIHRoZSB0cmVlLXNpdHRlcgogICAgICAgICAgOzsgZ3JhbW1hciBpcyByZXBhaXJlZC4KICAg
ICAgICAgIChsZXQqICgoc3RyIChvciAobnRoIHggcm93KSAoYW5kIChlcSB4IDApICIuIikgIiIp
KQogICAgICAgICAgICAgICAgIChzdHJsZW4gKGxlbmd0aCBzdHIpKQogICAgICAgICAgICAgICAg
ICh3aWR0aCAobnRoIHggaGVhZGluZy13aWR0aHMpKQogICAgICAgICAgICAgICAgIChwYWQtd2lk
dGggKG1heCAwICgtIHdpZHRoIHN0cmxlbikpKSkKICAgICAgICAgICAgKGluc2VydCBzdHIKICAg
ICAgICAgICAgICAgICAgICAobWFrZS1zdHJpbmcgcGFkLXdpZHRoID9ccykKICAgICAgICAgICAg
ICAgICAgICAifCIpKSkKICAgICAgICAoaW5zZXJ0ICJcbiIpKSkpKQoKKGRlZnVuIG1hcmtkb3du
LXRzLXRhYmxlLWRlbGV0ZS10YWJsZSAoKQogICJSZW1vdmUgdGhlIE1hcmtkb3duIHRhYmxlIGF0
IHBvaW50LgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVy
YWN0aXZlKQogIChtYXJrZG93bi10cy0tYmFyZi1pZi1ub3QtbW9kZSAnbWFya2Rvd24tdHMtdGFi
bGUtZGVsZXRlLXRhYmxlKQogICh3aGVuLWxldCogKChhdC10YWJsZSAobWFya2Rvd24tdHMtYXQt
dGFibGUtcCBuaWwgdCkpCiAgICAgICAgICAgICAgKHRhYmxlIChjZHIgYXQtdGFibGUpKSkKICAg
IDs7IFRPRE86IFJlbW92ZSBhZnRlciBidWcjMjM5MDMgVW5kbyBhZnRlciBrYiBkaWZmZXJzIGZy
b20gYWZ0ZXIgTS14CiAgICAocHVzaCAocG9pbnQpIGJ1ZmZlci11bmRvLWxpc3QpCiAgICAoZGVs
ZXRlLXJlZ2lvbiAodHJlZXNpdC1ub2RlLXN0YXJ0IHRhYmxlKSAodHJlZXNpdC1ub2RlLWVuZCB0
YWJsZSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1wcmV2aW91cy1yb3cgKCkKICAiTW92
ZSB0byB0aGUgcHJldmlvdXMgcm93IGluIHRoZSB0YWJsZS4KSWYgbm90IGluIGEgdGFibGUsIGRv
IG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24tdHMtdGFibGUtbmV4dC1yb3cg
LTEpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLW5leHQtcm93ICgmb3B0aW9uYWwgbikKICAi
TW92ZSB0byB0aGUgbmV4dCByb3cgaW4gdGhlIHRhYmxlLgpJZiBOIGlzIG5lZ2F0aXZlLCBtb3Zl
IHRvIHRoZSBwcmV2aW91cyByb3cuCklmIHBvaW50IGlzIG9uIHRoZSBsYXN0IHJvdyBvZiB0aGUg
dGFibGUsIGluc2VydCBhIG5ldyByb3cgYmVsb3cgYW5kCm1vdmUgaW50byBpdC4gIFdpdGggYSBw
cmVmaXggYXJndW1lbnQsIGNsb25lIHRoZSBmaW5hbCByb3cgaW50byB0aGUgbmV3Cm9uZS4KSWYg
bm90IGluIGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24t
dHMtLWJhcmYtaWYtbm90LW1vZGUgJ21hcmtkb3duLXRzLXRhYmxlLW5leHQtcm93KQogIChsZXQg
KChiYWNrd2FyZHMgKGFuZCBuICg8IG4gMCkpKSkKICAgIDs7IERvbid0IHVzZSBgbWFya2Rvd24t
dHMtLXRhYmxlLWJvZHktcm93LW5lYXItcG9zJyBiZWNhdXNlIHdlIHdhbnQKICAgIDs7IHRvIG9w
ZXJhdGUgaW4gdGhlIGhlYWRlci4KICAgICh3aGVuLWxldCogKChhdC10YWJsZSAobWFya2Rvd24t
dHMtYXQtdGFibGUtcCBuaWwgdCkpCiAgICAgICAgICAgICAgICAocG9zIChjYXIgYXQtdGFibGUp
KQogICAgICAgICAgICAgICAgKHRhYmxlIChjZHIgYXQtdGFibGUpKQogICAgICAgICAgICAgICAg
KHJvdyAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtcm93IG5pbCBwb3MpKSkKICAgICAgOzsgSWYg
bm8gbmV4dCBvciBwcmV2IHNpYmxpbmcsIHdlJ3JlIG9uIHRoZSBsYXN0L2ZpcnN0IHJvdy4KICAg
ICAgKGxldCAoKGN1cnJlbnQtY29sdW1uIChjdXJyZW50LWNvbHVtbikpCiAgICAgICAgICAgIChu
ZXh0LXJvdyAoaWYgYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQt
bm9kZS1wcmV2LXNpYmxpbmcgcm93ICduYW1lZCkKICAgICAgICAgICAgICAgICAgICAgICAgKHRy
ZWVzaXQtbm9kZS1uZXh0LXNpYmxpbmcgcm93ICduYW1lZCkpKSkKICAgICAgICAoaWYgbmV4dC1y
b3cKICAgICAgICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IG5leHQtcm93KSkK
ICAgICAgICAgICh1bmxlc3MgYmFja3dhcmRzCiAgICAgICAgICAgIChtYXJrZG93bi10cy10YWJs
ZS1pbnNlcnQtcm93LWJlbG93IGN1cnJlbnQtcHJlZml4LWFyZykpKQogICAgICAgIChtb3ZlLXRv
LWNvbHVtbiBjdXJyZW50LWNvbHVtbikpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtcHJl
dmlvdXMtY2VsbCAoKQogICJNb3ZlIHRvIHRoZSBwcmV2aW91cyBjZWxsIGluIHRoZSB0YWJsZS4K
SWYgbm90IGluIGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAobWFya2Rv
d24tdHMtdGFibGUtbmV4dC1jZWxsIC0xKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1uZXh0
LWNlbGwgKCZvcHRpb25hbCBuKQogICJNb3ZlIHRvIHRoZSBuZXh0IGNlbGwgaW4gdGhlIHRhYmxl
LgpJZiBOIGlzIG5lZ2F0aXZlLCBtb3ZlIHRvIHRoZSBwcmV2aW91cyBjZWxsLgpJZiBub3QgaW4g
YSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVyYWN0aXZlKQogIChtYXJrZG93bi10cy0tYmFy
Zi1pZi1ub3QtbW9kZSAnbWFya2Rvd24tdHMtdGFibGUtbmV4dC1jZWxsKQogIChsZXQgKChiYWNr
d2FyZHMgKGFuZCBuICg8IG4gMCkpKSkKICAgICh3aGVuLWxldCogKChhdC10YWJsZSAobWFya2Rv
d24tdHMtYXQtdGFibGUtcCBuaWwgdCkpCiAgICAgICAgICAgICAgICAocG9zIChjYXIgYXQtdGFi
bGUpKQogICAgICAgICAgICAgICAgKHRhYmxlIChjZHIgYXQtdGFibGUpKQogICAgICAgICAgICAg
ICAgKG5vZGUgKHRyZWVzaXQtbm9kZS1hdCBwb3MgJ21hcmtkb3duICduYW1lZCkpCiAgICAgICAg
ICAgICAgICAoY2VsbCAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtY2VsbCBub2RlKSkKICAgICAg
ICAgICAgICAgIChjZWxsLXR5cGUgKHRyZWVzaXQtbm9kZS10eXBlIG5vZGUpKQogICAgICAgICAg
ICAgICAgKHJvdyAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtcm93IGNlbGwpKQogICAgICAgICAg
ICAgICAgKHJvdy10eXBlICh0cmVlc2l0LW5vZGUtdHlwZSByb3cpKQogICAgICAgICAgICAgICAg
KG5leHQtY2VsbAogICAgICAgICAgICAgICAgIChjb25kCiAgICAgICAgICAgICAgICAgIDs7IElm
IGluIGEgcGlwZV90YWJsZV9kZWxpbWl0ZXJfcm93IGFuZCBub3QgdGhlIGZpcnN0CiAgICAgICAg
ICAgICAgICAgIDs7IG9yIGZpbmFsIGNlbGwgaW4gdGhlIHJvdywgc3RheSB3aXRoaW4gdGhlIHJv
dwogICAgICAgICAgICAgICAgICA7OyBvdGhlcndpc2UsIHRoZSBkZWZhdWx0IGNvbmRpdGlvbiBz
aG91bGQgbWF0Y2guCiAgICAgICAgICAgICAgICAgICgoYW5kIChlcXVhbCByb3ctdHlwZSAicGlw
ZV90YWJsZV9kZWxpbWl0ZXJfcm93IikKICAgICAgICAgICAgICAgICAgICAgICAgKGlmIGJhY2t3
YXJkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1wcmV2LXNpYmxp
bmcgY2VsbCAnbmFtZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1u
ZXh0LXNpYmxpbmcgY2VsbCAnbmFtZWQpKSkKICAgICAgICAgICAgICAgICAgIChpZiBiYWNrd2Fy
ZHMKICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLXByZXYtc2libGluZyBjZWxs
ICduYW1lZCkKICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1uZXh0LXNpYmxpbmcg
Y2VsbCAnbmFtZWQpKSkKICAgICAgICAgICAgICAgICAgOzsgSWYgb24gdGhlIGZpcnN0IHBpcGVf
dGFibGVfcm93J3MgZmlyc3QgY2VsbCBtb3ZpbmcKICAgICAgICAgICAgICAgICAgOzsgYmFja3dh
cmRzLCBtb3ZlIGludG8gdGhlIGZpbmFsCiAgICAgICAgICAgICAgICAgIDs7IHBpcGVfdGFibGVf
ZGVsaW1pdGVyX2NlbGwuCiAgICAgICAgICAgICAgICAgICgoYW5kIChlcXVhbCBjZWxsLXR5cGUg
InBpcGVfdGFibGVfY2VsbCIpCiAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAodHJlZXNp
dC1ub2RlLXR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2Rl
LXByZXYtc2libGluZyByb3cgJ25hbWVkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJwaXBlX3RhYmxlX2RlbGltaXRlcl9yb3ciKQogICAgICAgICAgICAgICAgICAgICAgICAobm90
ICh0cmVlc2l0LW5vZGUtcHJldi1zaWJsaW5nIGNlbGwgJ25hbWVkKSkKICAgICAgICAgICAgICAg
ICAgICAgICAgYmFja3dhcmRzKQogICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtc2VhcmNoLWZv
cndhcmQKICAgICAgICAgICAgICAgICAgICBjZWxsCiAgICAgICAgICAgICAgICAgICAgIlxcYHBp
cGVfdGFibGVfZGVsaW1pdGVyX2NlbGxcXCciIGJhY2t3YXJkcykpCiAgICAgICAgICAgICAgICAg
IDs7IElmIG9uIHRoZSBmaXJzdCBwaXBlX3RhYmxlX2hlYWRlcidzIGZpbmFsIGNlbGwKICAgICAg
ICAgICAgICAgICAgOzsgbW92aW5nIGZvcndhcmRzLCBtb3ZlIGludG8gdGhlIGZpcnN0CiAgICAg
ICAgICAgICAgICAgIDs7IHBpcGVfdGFibGVfZGVsaW1pdGVyX2NlbGwuCiAgICAgICAgICAgICAg
ICAgICgoYW5kIChlcXVhbCBjZWxsLXR5cGUgInBpcGVfdGFibGVfY2VsbCIpCiAgICAgICAgICAg
ICAgICAgICAgICAgIChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLW5leHQtc2libGluZyByb3cgJ25hbWVkKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaXBlX3RhYmxlX2RlbGltaXRlcl9yb3ciKQog
ICAgICAgICAgICAgICAgICAgICAgICAobm90ICh0cmVlc2l0LW5vZGUtbmV4dC1zaWJsaW5nIGNl
bGwgJ25hbWVkKSkKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBiYWNrd2FyZHMpKQogICAg
ICAgICAgICAgICAgICAgKHRyZWVzaXQtc2VhcmNoLWZvcndhcmQKICAgICAgICAgICAgICAgICAg
ICBjZWxsCiAgICAgICAgICAgICAgICAgICAgIlxcYHBpcGVfdGFibGVfZGVsaW1pdGVyX2NlbGxc
XCciIGJhY2t3YXJkcykpCiAgICAgICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAo
dHJlZXNpdC1zZWFyY2gtZm9yd2FyZAogICAgICAgICAgICAgICAgICAgIGNlbGwKICAgICAgICAg
ICAgICAgICAgICAiXFxgcGlwZV90YWJsZV9jZWxsXFwnIiBiYWNrd2FyZHMpKSkpKQogICAgICA7
OyBLZWVwIHBvaW50IHdpdGhpbiB0aGUgY3VycmVudCB0YWJsZS4KICAgICAgKHdoZW4gKHRyZWVz
aXQtbm9kZS1lcSB0YWJsZSAodHJlZXNpdC1zZWFyY2gtZm9yd2FyZAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBuZXh0LWNlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIlxcYHBpcGVfdGFibGVcXCciICdiYWNrd2FyZCkpCiAgICAgICAgKGdvdG8tY2hh
ciAodHJlZXNpdC1ub2RlLXN0YXJ0IG5leHQtY2VsbCkpKQogICAgICAod2hlbiAob3IgKGVxIG1h
cmtkb3duLXRzLXRhYmxlLWF1dG8tYWxpZ24gdCkKICAgICAgICAgICAgICAgIChtZW1xICdjZWxs
LW5hdmlnYXRpb24gbWFya2Rvd24tdHMtdGFibGUtYXV0by1hbGlnbikpCiAgICAgICAgKG1hcmtk
b3duLXRzLXRhYmxlLWFsaWduLXRhYmxlKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1p
bnNlcnQtcm93LWJlbG93ICgmb3B0aW9uYWwgY2xvbmUpCiAgIkluc2VydCBhIHRhYmxlIHJvdyBi
ZWxvdyBwb2ludC4KSWYgcG9pbnQgaXMgaW4gdGhlIGhlYWRlciwgaW5zZXJ0IGJlbG93IHRoZSBm
aXJzdCByb3cgb2YgdGhlIHRhYmxlLgpJZiBDTE9ORSBpcyBub24tbmlsLCBvciB3aXRoIGEgcHJl
Zml4IGFyZ3VtZW50LCBjbG9uZSB0aGUgY3VycmVudCByb3cuCklmIHBvaW50IGlzIG5vdCBhdCBh
IHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUgIlAiKQogIChzZXRxIGNsb25lIChv
ciBjbG9uZSBjdXJyZW50LXByZWZpeC1hcmcpKQogICAgKG1hcmtkb3duLXRzLXRhYmxlLWluc2Vy
dC1yb3cgJ2JlbG93IGNsb25lKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtcm93
LWFib3ZlICgmb3B0aW9uYWwgY2xvbmUpCiAgIkluc2VydCBhIHRhYmxlIHJvdyBhYm92ZSBwb2lu
dC4KSWYgcG9pbnQgaXMgaW4gdGhlIGhlYWRlciwgaW5zZXJ0IGFib3ZlIHRoZSBmaXJzdCByb3cg
b2YgdGhlIHRhYmxlLgpJZiBDTE9ORSBpcyBub24tbmlsLCBvciB3aXRoIGEgcHJlZml4IGFyZ3Vt
ZW50LCBjbG9uZSB0aGUgY3VycmVudCByb3cuCklmIHBvaW50IGlzIG5vdCBhdCBhIHRhYmxlLCBk
byBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUgIlAiKQogIChzZXRxIGNsb25lIChvciBjbG9uZSBj
dXJyZW50LXByZWZpeC1hcmcpKQogICAgKG1hcmtkb3duLXRzLXRhYmxlLWluc2VydC1yb3cgJ2Fi
b3ZlIGNsb25lKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1jbG9uZS1yb3ctYmVsb3cgKCkK
ICAiSW5zZXJ0IGEgdGFibGUgcm93IGJlbG93IHBvaW50LgpJZiBwb2ludCBpcyBpbiB0aGUgaGVh
ZGVyLCBpbnNlcnQgYmVsb3cgdGhlIGZpcnN0IHJvdyBvZiB0aGUgdGFibGUuCklmIHBvaW50IGlz
IG5vdCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUpCiAgKG1hcmtkb3du
LXRzLXRhYmxlLWluc2VydC1yb3ctYmVsb3cgJ2Nsb25lKSkKCihkZWZ1biBtYXJrZG93bi10cy10
YWJsZS1jbG9uZS1yb3ctYWJvdmUgKCkKICAiSW5zZXJ0IGEgdGFibGUgcm93IGFib3ZlIHBvaW50
LgpJZiBwb2ludCBpcyBpbiB0aGUgaGVhZGVyLCBpbnNlcnQgYWJvdmUgdGhlIGZpcnN0IHJvdyBv
ZiB0aGUgdGFibGUuCklmIHBvaW50IGlzIG5vdCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIKICAo
aW50ZXJhY3RpdmUpCiAgKG1hcmtkb3duLXRzLXRhYmxlLWluc2VydC1yb3ctYWJvdmUgJ2Nsb25l
KSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtcm93ICgmb3B0aW9uYWwgYWJvdmUg
Y2xvbmUpCiAgIkluc2VydCBhIHRhYmxlIHJvdyBiZWxvdyBwb2ludC4KSWYgcG9pbnQgaXMgaW4g
dGhlIGhlYWRlciwgaW5zZXJ0IGJlbG93IHRoZSBmaXJzdCByb3cgb2YgdGhlIHRhYmxlLgpJZiBB
Qk9WRSBpcyBub24tbmlsIGFuZCBpcyBub3QgYGJlbG93Jywgb3Igd2l0aCBhIHByZWZpeCBhcmd1
bWVudCwKaW5zZXJ0IHRoZSByb3cgYWJvdmUgcG9pbnQuCklmIENMT05FIGlzIG5vbi1uaWwsIGNs
b25lIHRoZSBjdXJyZW50IHJvdywgb3RoZXJ3aXNlIGluc2VydCBlbXB0eQpjZWxscy4KSWYgcG9p
bnQgaXMgbm90IGF0IGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSAiUCIpCiAg
KG1hcmtkb3duLXRzLS1iYXJmLWlmLW5vdC1tb2RlICdtYXJrZG93bi10cy10YWJsZS1pbnNlcnQt
cm93KQogIChzZXRxIGFib3ZlIChjb25kICgoZXEgYWJvdmUgJ2JlbG93KSBuaWwpCiAgICAgICAg
ICAgICAgICAgICAgKGFib3ZlIGFib3ZlKQogICAgICAgICAgICAgICAgICAgIChjdXJyZW50LXBy
ZWZpeC1hcmcgdCkpKQogICh3aGVuLWxldCogKChhdC10YWJsZSAobWFya2Rvd24tdHMtYXQtdGFi
bGUtcCBuaWwgdCkpCiAgICAgICAgICAgICAgKHBvcyAoY2FyIGF0LXRhYmxlKSkKICAgICAgICAg
ICAgICAodGFibGUgKGNkciBhdC10YWJsZSkpCiAgICAgICAgICAgICAgKGRlbGltaXRlci1yb3cg
KHRyZWVzaXQtc2VhcmNoLXN1YnRyZWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFi
bGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYHBpcGVfdGFibGVfZGVsaW1pdGVy
X3Jvd1xcJyIpKQogICAgICAgICAgICAgIChuY29scyAodHJlZXNpdC1ub2RlLWNoaWxkLWNvdW50
IGRlbGltaXRlci1yb3cgJ25hbWVkKSkKICAgICAgICAgICAgICAoaGVhZGluZy13aWR0aHMKICAg
ICAgICAgICAgICAgKGxldCAocmVzKQogICAgICAgICAgICAgICAgIChkb2xpc3QgKGVsdCAodHJl
ZXNpdC1ub2RlLWNoaWxkcmVuIGRlbGltaXRlci1yb3cgJ25hbWVkKSkKICAgICAgICAgICAgICAg
ICAgIChwdXNoIChsZW5ndGggKHRyZWVzaXQtbm9kZS10ZXh0IGVsdCkpIHJlcykpCiAgICAgICAg
ICAgICAgICAgKG5yZXZlcnNlIHJlcykpKSkKICAgIChsZXQqICgobmVhciAobWFya2Rvd24tdHMt
LXRhYmxlLWJvZHktcm93LW5lYXItcG9zIHBvcykpCiAgICAgICAgICAgKHJvdyAoY2FyIG5lYXIp
KQogICAgICAgICAgIChjdXJyZW50LWNvbHVtbiAoY3VycmVudC1jb2x1bW4pKSkKICAgICAgOzsg
SWYgcm93IGlzIG5pbCwgdGhlcmUgYXJlIHplcm8gcm93cyBzbyBhZGQgb25lIGJlbG93IHRoZQog
ICAgICA7OyBkZWxpbWl0ZXItcm93LgogICAgICAodW5sZXNzIHJvdwogICAgICAgIChzZXRxIGNs
b25lIG5pbCkKICAgICAgICAoc2V0cSByb3cgZGVsaW1pdGVyLXJvdykKICAgICAgICAoc2V0cSBh
Ym92ZSBuaWwpKQogICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAoY29uZCAoYWJvdmUKICAg
ICAgICAgICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IHJvdykpKQogICAgICAg
ICAgICAgICh0CiAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1lbmQgcm93
KSkKICAgICAgICAgICAgICAgKGluc2VydCAiXG4iKSkpCiAgICAgICAgKGNvbmQgKGNsb25lCiAg
ICAgICAgICAgICAgIDs7IFRoZSBjbG9uZSBzdHJhdGVneSBpcyBXWVNJV1lHLiAgSnVzdCBjb3B5
IHRoZSB0ZXh0CiAgICAgICAgICAgICAgIDs7IGFuZCBkb24ndCBmdXNzIHdpdGggY2VsbCBjb250
ZW50IGFuZCBwaXBlIHN5bWJvbHMuCiAgICAgICAgICAgICAgIDs7IFRoZSBncmFtbWFyIGluY2x1
ZGVzIHRoZSBmaW5hbCBuZXdsaW5lIChhbmQKICAgICAgICAgICAgICAgOzsgc29tZXRpbWVzIG5v
dCkuCiAgICAgICAgICAgICAgIChpbnNlcnQgKHN0cmluZy10cmltLXJpZ2h0CiAgICAgICAgICAg
ICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtdGV4dCByb3cgJ25vLXByb3BlcnR5KSAiXG4iKSkp
CiAgICAgICAgICAgICAgKHQKICAgICAgICAgICAgICAgKGluc2VydCAifCIpCiAgICAgICAgICAg
ICAgIChkb3RpbWVzICh4IG5jb2xzKQogICAgICAgICAgICAgICAgIChsZXQgKChwYWQtd2lkdGgg
KG50aCB4IGhlYWRpbmctd2lkdGhzKSkpCiAgICAgICAgICAgICAgICAgICA7OyBUT0RPOiBSZW1v
dmUgdGhlIHBsYWNlaG9sZGVyIGNoYXJhY3RlciBpZiB0aGUKICAgICAgICAgICAgICAgICAgIDs7
IHRyZWUtc2l0dGVyIGdyYW1tYXIgaXMgcmVwYWlyZWQuCiAgICAgICAgICAgICAgICAgICAoaW5z
ZXJ0IChpZiAoZXEgeCAwKSAiLiIgIiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWtl
LXN0cmluZyAoLSBwYWQtd2lkdGggKGlmIChlcSB4IDApIDEgMCkpID9ccykKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgInwiKSkpKSkKICAgICAgICAod2hlbiBhYm92ZQogICAgICAgICAgKGlu
c2VydCAiXG4iKSkpCiAgICAgIChjb25kIChhYm92ZQogICAgICAgICAgICAgKHdoZW4gKD4gY3Vy
cmVudC1jb2x1bW4gMCkKICAgICAgICAgICAgICAgKHdpdGgtc3VwcHJlc3NlZC13YXJuaW5ncyAo
KGludGVyYWN0aXZlLW9ubHkgcHJldmlvdXMtbGluZSkpCiAgICAgICAgICAgICAgICAgKHByZXZp
b3VzLWxpbmUpKSkpCiAgICAgICAgICAgICh0ICh3aXRoLXN1cHByZXNzZWQtd2FybmluZ3MgKChp
bnRlcmFjdGl2ZS1vbmx5IG5leHQtbGluZSkpCiAgICAgICAgICAgICAgICAgKG5leHQtbGluZSkp
KSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1kZWxldGUtcm93ICgpCiAgIkRlbGV0ZSB0
aGUgdGFibGUgcm93IGF0IHBvaW50LgpJZiBwb2ludCBpcyBvbiB0aGUgaGVhZGVyIG9yIGRlbGlt
aXRlciByb3csIGRvIG5vdGhpbmcuCklmIHBvaW50IGlzIG5vdCBhdCBhIHRhYmxlLCBkbyBub3Ro
aW5nLiIKICAoaW50ZXJhY3RpdmUpCiAgKG1hcmtkb3duLXRzLS1iYXJmLWlmLW5vdC1tb2RlICdt
YXJrZG93bi10cy10YWJsZS1kZWxldGUtcm93KQogICh3aGVuLWxldCogKChuZWFyIChtYXJrZG93
bi10cy0tdGFibGUtYm9keS1yb3ctbmVhci1wb3MgbmlsIHQpKQogICAgICAgICAgICAgIDs7IEJh
aWwgaWYgcG9pbnQgaXMgb24gdGhlIGhlYWRlciBvciBkZWxpbWl0ZXIgcm93IOKAlCBkbwogICAg
ICAgICAgICAgIDs7IG5vdCBzaWxlbnRseSBkZWxldGUgYSBib2R5IHJvdyB0aGUgdXNlciBkaWQg
bm90IHNlbGVjdC4KICAgICAgICAgICAgICAoKG5vdCAoY2RyIG5lYXIpKSkKICAgICAgICAgICAg
ICAocm93IChjYXIgbmVhcikpKQogICAgKGxldCAoKGN1cnJlbnQtY29sdW1uIChjdXJyZW50LWNv
bHVtbikpKQogICAgICAoZGVsZXRlLXJlZ2lvbiAodHJlZXNpdC1ub2RlLXN0YXJ0IHJvdykKICAg
ICAgICAgICAgICAgICAgICAgKG1pbiAoMSsgKHRyZWVzaXQtbm9kZS1lbmQgcm93KSkgKHBvaW50
LW1heCkpKQogICAgICAobW92ZS10by1jb2x1bW4gY3VycmVudC1jb2x1bW4pKSkpCgooZGVmdW4g
bWFya2Rvd24tdHMtdGFibGUtbW92ZS1yb3ctdXAgKCkKICAiTW92ZSB0aGUgcm93IGF0IHBvaW50
IHVwIG9uZSBsaW5lLgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAg
KGludGVyYWN0aXZlKQogIChtYXJrZG93bi10cy10YWJsZS1tb3ZlLXJvdykpCgooZGVmdW4gbWFy
a2Rvd24tdHMtdGFibGUtbW92ZS1yb3ctZG93biAoKQogICJNb3ZlIHRoZSByb3cgYXQgcG9pbnQg
ZG93biBvbmUgbGluZS4KSWYgcG9pbnQgaXMgbm90IGF0IGEgdGFibGUsIGRvIG5vdGhpbmcuIgog
IChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24tdHMtdGFibGUtbW92ZS1yb3cgJ2Rvd24pKQoKKGRl
ZnVuIG1hcmtkb3duLXRzLXRhYmxlLW1vdmUtcm93ICgmb3B0aW9uYWwgZG93bikKICAiTW92ZSB0
aGUgcm93IGF0IHBvaW50IHVwIG9uZSBsaW5lLgpJZiBET1dOIGlzIG5vbi1uaWwsIG9yIHdpdGgg
YSBwcmVmaXggYXJndW1lbnQsIG1vdmUgdGhlIHJvdyBkb3duIG9uZQpsaW5lLgpJZiBwb2ludCBp
cyBvbiB0aGUgaGVhZGVyIG9yIGRlbGltaXRlciByb3csIGRvIG5vdGhpbmcuCklmIHBvaW50IGlz
IG5vdCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUpCiAgKG1hcmtkb3du
LXRzLS1iYXJmLWlmLW5vdC1tb2RlICdtYXJrZG93bi10cy10YWJsZS1tb3ZlLXJvdykKICAoc2V0
cSBkb3duIChvciBkb3duIGN1cnJlbnQtcHJlZml4LWFyZykpCiAgKHdoZW4tbGV0KiAoKGF0LXRh
YmxlIChtYXJrZG93bi10cy1hdC10YWJsZS1wIG5pbCB0KSkKICAgICAgICAgICAgICAocG9zIChj
YXIgYXQtdGFibGUpKQogICAgICAgICAgICAgICh0YWJsZSAoY2RyIGF0LXRhYmxlKSkKICAgICAg
ICAgICAgICAobmVhciAobWFya2Rvd24tdHMtLXRhYmxlLWJvZHktcm93LW5lYXItcG9zIHBvcykp
CiAgICAgICAgICAgICAgOzsgQmFpbCBpZiBwb2ludCBpcyBvbiB0aGUgaGVhZGVyIG9yIGRlbGlt
aXRlciByb3cg4oCUIGRvCiAgICAgICAgICAgICAgOzsgbm90IHNpbGVudGx5IG1vdmUgYSBib2R5
IHJvdyB0aGUgdXNlciBkaWQgbm90IHNlbGVjdC4KICAgICAgICAgICAgICAoKG5vdCAoY2RyIG5l
YXIpKSkKICAgICAgICAgICAgICAocm93IChjYXIgbmVhcikpKQogICAgOzsgRG8gbm90IG1vdmUg
YWJvdmUgdGhlIHBpcGVfdGFibGVfZGVsaW1pdGVyX3Jvdy4KICAgIDs7IERvIG5vdCBtb3ZlIGJl
bG93IHRoZSBib3R0b20gb2YgdGhlIHRhYmxlLgogICAgKHVubGVzcyAob3IgKGFuZCAobm90IGRv
d24pCiAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLXByZXYtc2libGluZyByb3cgJ25h
bWVkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaXBlX3RhYmxlX2RlbGltaXRlcl9y
b3ciKSkKICAgICAgICAgICAgICAgIChhbmQgZG93bgogICAgICAgICAgICAgICAgICAgICAobm90
ICh0cmVlc2l0LW5vZGUtbmV4dC1zaWJsaW5nIHJvdyAnbmFtZWQpKSkpCiAgICAgIChsZXQgKChy
b3cyIChpZiBkb3duCiAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLW5leHQtc2li
bGluZyByb3cgJ25hbWVkKQogICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtcHJldi1z
aWJsaW5nIHJvdyAnbmFtZWQpKSkKICAgICAgICAgICAgKHJvdy1lbmQgKHRyZWVzaXQtbm9kZS1l
bmQgcm93KSkpCiAgICAgICAgOzsgVE9ETzogUmVtb3ZlIGFmdGVyIGJ1ZyMyMzkwMyBVbmRvIGFm
dGVyIGtiIGRpZmZlcnMgZnJvbSBhZnRlciBNLXgKICAgICAgICAocHVzaCAocG9pbnQpIGJ1ZmZl
ci11bmRvLWxpc3QpCiAgICAgICAgOzsgSWYgcm93IHBvaW50IGlzIG91dHNpZGUgaXRzIHNvdXJj
ZSByZWdpb24sIGUuZy4sIGF0IGVvbCwgbW92ZQogICAgICAgIDs7IGl0IGluc2lkZSB0aGUgcmVn
aW9uIGZvciBzdGFiaWxpdHkuCiAgICAgICAgKHdoZW4gKD49IChwb2ludCkgcm93LWVuZCkKICAg
ICAgICAgIChnb3RvLWNoYXIgKG1heCAocG9pbnQtbWluKSAoMS0gcm93LWVuZCkpKSkKICAgICAg
ICAodHJhbnNwb3NlLXJlZ2lvbnMgKHRyZWVzaXQtbm9kZS1zdGFydCByb3cpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtZW5kIHJvdykKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKHRyZWVzaXQtbm9kZS1zdGFydCByb3cyKQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAodHJlZXNpdC1ub2RlLWVuZCByb3cyKSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFi
bGUtaW5zZXJ0LWNvbHVtbi1sZWZ0ICgmb3B0aW9uYWwgY2xvbmUpCiAgIkluc2VydCBhIHRhYmxl
IGNvbHVtbiB0byB0aGUgbGVmdCBvZiBwb2ludCdzIGNvbHVtbi4KSWYgQ0xPTkUgaXMgbm9uLW5p
bCwgb3Igd2l0aCBhIHByZWZpeCBhcmd1bWVudCwgY2xvbmUgdGhlIGN1cnJlbnQKY29sdW1uLCBv
dGhlcndpc2UgaW5zZXJ0IGVtcHR5IGNlbGxzLgpQb2ludCBjYW4gYmUgaW4gdGhlIHRhYmxlIGhl
YWRlciBvciBib2R5LgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAg
KGludGVyYWN0aXZlICJQIikKICAobWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LWNvbHVtbiAnbGVm
dCBjbG9uZSkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LWNvbHVtbi1yaWdodCAo
Jm9wdGlvbmFsIGNsb25lKQogICJJbnNlcnQgYSB0YWJsZSBjb2x1bW4gdG8gdGhlIHJpZ2h0IG9m
IHBvaW50J3MgY29sdW1uLgpJZiBDTE9ORSBpcyBub24tbmlsLCBvciB3aXRoIGEgcHJlZml4IGFy
Z3VtZW50LCBjbG9uZSB0aGUgY3VycmVudApjb2x1bW4sIG90aGVyd2lzZSBpbnNlcnQgZW1wdHkg
Y2VsbHMuClBvaW50IGNhbiBiZSBpbiB0aGUgdGFibGUgaGVhZGVyIG9yIGJvZHkuCklmIHBvaW50
IGlzIG5vdCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUgIlAiKQogICht
YXJrZG93bi10cy10YWJsZS1pbnNlcnQtY29sdW1uICdyaWdodCBjbG9uZSkpCgooZGVmdW4gbWFy
a2Rvd24tdHMtdGFibGUtY2xvbmUtY29sdW1uLWxlZnQgKCkKICAiQ2xvbmUgdGhlIGN1cnJlbnQg
Y29sdW1uIHRvIGl0cyBsZWZ0LgpQb2ludCBjYW4gYmUgaW4gdGhlIHRhYmxlIGhlYWRlciBvciBi
b2R5LgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVyYWN0
aXZlKQogIChtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtY29sdW1uLWxlZnQgJ2Nsb25lKSkKCihk
ZWZ1biBtYXJrZG93bi10cy10YWJsZS1jbG9uZS1jb2x1bW4tcmlnaHQgKCkKICAiQ2xvbmUgdGhl
IGN1cnJlbnQgY29sdW1uIHRvIGl0cyByaWdodC4KUG9pbnQgY2FuIGJlIGluIHRoZSB0YWJsZSBo
ZWFkZXIgb3IgYm9keS4KSWYgcG9pbnQgaXMgbm90IGF0IGEgdGFibGUsIGRvIG5vdGhpbmcuIgog
IChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LWNvbHVtbi1yaWdodCAn
Y2xvbmUpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWluc2VydC1jb2x1bW4gKCZvcHRpb25h
bCBsZWZ0IGNsb25lKQogICJJbnNlcnQgYSB0YWJsZSBjb2x1bW4gYWZ0ZXIgcG9pbnQncyBjdXJy
ZW50IGNvbHVtbi4KSWYgTEVGVCBpcyBub24tbmlsIGFuZCBpcyBub3QgYHJpZ2h0Jywgb3Igd2l0
aCBhIHByZWZpeCBhcmd1bWVudCwKaW5zZXJ0IHRoZSBjb2x1bW4gdG8gdGhlIGxlZnQgb2YgdGhl
IGN1cnJlbnQgY29sdW1uLgpJZiBDTE9ORSBpcyBub24tbmlsLCBjbG9uZSB0aGUgY3VycmVudCBj
b2x1bW4sIG90aGVyd2lzZSBpbnNlcnQgZW1wdHkKY2VsbHMuCklmIENMT05FIGlzIGEgbGlzdCwg
aXRzIGZpcnN0IGVsZW1lbnQgaXMgdGFyZ2V0LWNvbHVtbi1udW1iZXIuICBJdCBpcwp0aGUgY2Fs
bGVyJ3MgcmVzcG9uc2liaWxpdHkgdGhhdCB0aGlzIHZhbHVlIGlzIHZhbGlkIGZvciB0aGUgdGFi
bGUsCnRob3VnaCBpdCBtYXkgYmUgaW52YWxpZCBmb3IgYSBub24tdW5pZm9ybSByYWdnZWQgcm93
LgpQb2ludCBjYW4gYmUgaW4gdGhlIHRhYmxlIGhlYWRlciBvciBib2R5LgpJZiBwb2ludCBpcyBu
b3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVyYWN0aXZlKQogIChtYXJrZG93bi10
cy0tYmFyZi1pZi1ub3QtbW9kZSAnbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LWNvbHVtbikKICAo
c2V0cSBsZWZ0IChjb25kICgoZXEgbGVmdCAncmlnaHQpIG5pbCkKICAgICAgICAgICAgICAgICAg
IChsZWZ0IGxlZnQpCiAgICAgICAgICAgICAgICAgICAoY3VycmVudC1wcmVmaXgtYXJnIHQpKSkK
ICAod2hlbi1sZXQqICgoYXQtdGFibGUgKG1hcmtkb3duLXRzLWF0LXRhYmxlLXAgbmlsIHQpKQog
ICAgICAgICAgICAgIChwb3MgKGNhciBhdC10YWJsZSkpCiAgICAgICAgICAgICAgKHRhYmxlIChj
ZHIgYXQtdGFibGUpKQogICAgICAgICAgICAgIChkZWxpbWl0ZXItcm93ICh0cmVlc2l0LXNlYXJj
aC1zdWJ0cmVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICJcXGBwaXBlX3Rh
YmxlX2RlbGltaXRlcl9yb3dcXCciKSkKICAgICAgICAgICAgICA7OyBDb2x1bW4gcG9zIGZvciBp
bnNlcnRpbmcgbWlzc2luZyBsZWFkaW5nIHBpcGVzLgogICAgICAgICAgICAgIChkZWxpbTAtcGlw
ZS1jb2wKICAgICAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgKGxl
dCogKChkZWxpbS1jZWxsICh0cmVlc2l0LW5vZGUtY2hpbGQKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGRlbGltaXRlci1yb3cgMCAnbmFtZWQpKQogICAgICAgICAgICAgICAg
ICAgICAgICAoYmVnICh0cmVlc2l0LW5vZGUtc3RhcnQgZGVsaW0tY2VsbCkpKQogICAgICAgICAg
ICAgICAgICAgKGdvdG8tY2hhciBiZWcpCiAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIChw
b3MtYm9sKSkKICAgICAgICAgICAgICAgICAgIChpZiAoc2VhcmNoLWZvcndhcmQgInwiIGJlZyB0
KQogICAgICAgICAgICAgICAgICAgICAgICgxLSAoY3VycmVudC1jb2x1bW4pKQogICAgICAgICAg
ICAgICAgICAgICAoZ290by1jaGFyIGJlZykKICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQt
Y29sdW1uKSkpKSkKICAgICAgICAgICAgICAobm9kZSAodHJlZXNpdC1ub2RlLWF0IHBvcyAnbWFy
a2Rvd24gJ25hbWVkKSkKICAgICAgICAgICAgICAoY2VsbCAobWFya2Rvd24tdHMtLXRhYmxlLW5v
ZGUtY2VsbCBub2RlKSkKICAgICAgICAgICAgICAocG9pbnQtcm93IChtYXJrZG93bi10cy0tdGFi
bGUtbm9kZS1yb3cgY2VsbCkpKQogICAgKGxldCAoKHRhYmxlLWNvbHVtbiAobWFya2Rvd24tdHMt
LXRhYmxlLWNvbXB1dGUtbm9kZS1jb2x1bW4gcG9pbnQtcm93IGNlbGwpKSkKICAgICAgKHVubGVz
cyB0YWJsZS1jb2x1bW4KICAgICAgICAoZXJyb3IgIkNvdWxkIG5vdCBjb21wdXRlIHRoZSB0YWJs
ZSBjb2x1bW4iKSkKICAgICAgOzsgTk9URTogR0ZNIHRhYmxlcyBhbGxvdyBub24tdW5pZm9ybSB0
YWJsZSByb3dzLiAgVGhlIGN1cnJlbnQgcm93CiAgICAgIDs7IGNvdWxkIGhhdmUgYSBkaWZmZXJp
bmcgbnVtYmVyIG9mIGNvbHVtbnMgZnJvbSBvdGhlciByb3dzLiAgV2UKICAgICAgOzsgc2lsZW50
bHkgZG8gbm90aGluZyB0byBhIHJvdyB0aGF0IGRvZXMgbm90IGV4dGVuZCB0byB0aGUKICAgICAg
OzsgY29tcHV0ZWQgY29sdW1uLgogICAgICA7OwogICAgICA7OyBOT1RFOiBUaGUgZ3JhbW1hciBh
bm5veWluZ2x5IGlnbm9yZXMgY2VsbCBsZWFkaW5nIHdoaXRlc3BhY2UKICAgICAgOzsgYnV0IGlu
Y2x1ZGVzIHRyYWlsaW5nIHdoaXRlc3BhY2UsIHNvIGNlbGxzIGFyZSBib3VuZGVkIGJ5IHRoZQog
ICAgICA7OyBmaXJzdCBncmFwaCBjaGFyYWN0ZXIgdXAgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIGp1
c3QgYmVmb3JlIHRoZQogICAgICA7OyBwaXBlIHN5bWJvbCwgaW5jbHVkaW5nIHdoaXRlc3BhY2Uu
ICBUaGUgcmVzdWx0IGlzIHRoZSByYW5nZQogICAgICA7OyBkb2VzIG5vdCBzdGFydCBpbW1lZGlh
dGVseSBhZnRlciB0aGUgb3B0aW9uYWwgbGVhZGluZyBwaXBlCiAgICAgIDs7IHN5bWJvbCB5ZXQg
aW5jb25zaXN0ZW50bHkgY29udGludWVzIHVudGlsIGp1c3QgYmVmb3JlIHRoZQogICAgICA7OyB0
cmFpbGluZyBwaXBlLgogICAgICAobGV0KiAoKGFkaiAwKSA7IEFkanVzdCBub2RlIHBvc2l0aW9u
IG9mZnNldHMgYnkgaW5zZXJ0ZWQgdGV4dC4KICAgICAgICAgICAgICh3aWR0aCBtYXJrZG93bi10
cy10YWJsZS1kZWZhdWx0LWNvbHVtbi13aWR0aCkKICAgICAgICAgICAgIChlbXB0eSAobWFrZS1z
dHJpbmcgd2lkdGggP1xzKSkKICAgICAgICAgICAgIDs7IFRPRE86IFJlbW92ZSB0aGUgcGxhY2Vo
b2xkZXIgY2hhcmFjdGVyIGlmIHRoZSB0cmVlLXNpdHRlcgogICAgICAgICAgICAgOzsgZ3JhbW1h
ciBpcyByZXBhaXJlZC4KICAgICAgICAgICAgIChwbGFjZWhvbGRlciAoY29uY2F0ICIuIiAobWFr
ZS1zdHJpbmcgKDEtIHdpZHRoKSA/XHMpKSkKICAgICAgICAgICAgIChkZWxpbSAobWFrZS1zdHJp
bmcgd2lkdGggPy0pKQogICAgICAgICAgICAgKHJvd3MgKHRyZWVzaXQtbm9kZS1jaGlsZHJlbiB0
YWJsZSAnbmFtZWQpKQogICAgICAgICAgICAgKG5yb3dzIChsZW5ndGggcm93cykpCiAgICAgICAg
ICAgICAodGFyZ2V0LWNvbHVtbi1udW1iZXIgKGFuZCAobGlzdHAgY2xvbmUpIChjYXIgY2xvbmUp
KSkKICAgICAgICAgICAgIDs7IFBvc2l0aW9uIHRvIG1vdmUgcG9pbnQgdG8gYWZ0ZXIgYWxsIHJv
d3MgaGF2ZSBiZWVuCiAgICAgICAgICAgICA7OyB1cGRhdGVkLiAgRGV0ZXJtaW5pc3RpYyBwbGFj
ZW1lbnQgYXZvaWRzIGRlcGVuZGluZyBvbgogICAgICAgICAgICAgOzsgdHJlZS1zaXR0ZXIgbmF2
aWdhdGlvbiB0aHJvdWdoIGZyZXNobHktaW5zZXJ0ZWQgZW1wdHkKICAgICAgICAgICAgIDs7IGNl
bGxzLCB3aGljaCB0aGUgZ3JhbW1hciBkb2VzIG5vdCBhbHdheXMgcmVwYXJzZSBhcwogICAgICAg
ICAgICAgOzsgcGlwZV90YWJsZV9jZWxsIG5vZGVzLgogICAgICAgICAgICAgKHRhcmdldC1wb3Mp
KQogICAgICAgIDs7IFRPRE86IFJlbW92ZSBhZnRlciBidWcjMjM5MDMgVW5kbyBhZnRlciBrYiBk
aWZmZXJzIGZyb20gYWZ0ZXIgTS14CiAgICAgICAgKHB1c2ggKHBvaW50KSBidWZmZXItdW5kby1s
aXN0KQogICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgKHdpdGhvdXQtcmVzdHJpY3Rp
b24KICAgICAgICAgICAgKGRvdGltZXMgKHggbnJvd3MpCiAgICAgICAgICAgICAgKHdoZW4tbGV0
KiAoKHJvdyAobnRoIHggcm93cykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvdy10eXBl
ICh0cmVlc2l0LW5vZGUtdHlwZSByb3cpKQogICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xz
ICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4gcm93ICduYW1lZCkpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgKG5jb2xzIChsZW5ndGggY29scykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgOzsg
c291cmNlLWNlbGwgd2lsbCBiZSBuaWwgaWYgdGFibGUtY29sdW1uIGlzIGJleW9uZCB0aGlzCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgOzsgcm93J3MgY29sdW1uIHNldCBhbmQgdGhhdCByb3cg
d2lsbCBiZSBza2lwcGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2UtY2VsbCAo
bnRoIHRhYmxlLWNvbHVtbiBjb2xzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBJZiBj
bG9uaW5nIHdpdGggYSBzcGVjaWZpZWQgdGFyZ2V0LWNvbHVtbi1udW1iZXIsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgOzsgdGFyZ2V0LWNlbGwgd2lsbCBiZSBuaWwgYW5kIHRoZSByb3cgd2ls
bCBiZSBza2lwcGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQtY2VsbCAoaWYg
dGFyZ2V0LWNvbHVtbi1udW1iZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKG50aCB0YXJnZXQtY29sdW1uLW51bWJlciBjb2xzKQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc291cmNlLWNlbGwpKQogICAgICAgICAgICAgICAgICAgICAg
ICAgIDs7IENvbXB1dGUgdGhlIGluc2VydGlvbiBwb2ludC4KICAgICAgICAgICAgICAgICAgICAg
ICAgICAoYmVnIChjb25kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgSWYgY2xv
bmluZyB0byBhIHNwZWNpZmllZCB0YXJnZXQsIHVzZQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDs7IHRhcmdldC1jZWxsJ3MgZW5kLgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICh0YXJnZXQtY29sdW1uLW51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoKyBhZGoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9k
ZS1lbmQgdGFyZ2V0LWNlbGwpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBJ
ZiBpbnNlcnRpbmcgdG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0CiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgOzsgY29sdW1uLCB1c2Ugc291cmNlIGNlbGwncyBzdGFydAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDs7IGFkanVzdGVkIGZvciBpdHMgb3B0aW9uYWwgcGlwZSB0
bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGNhcHR1cmUgaXRzIHdoaXRlc3Bh
Y2UuICBJZiB0aGVyZSBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IG5vIHBp
cGUsIHVzZSBib2wuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhbmQgbGVmdCAo
ZXEgdGFibGUtY29sdW1uIDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0
ICgocCAoKyBhZGoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KHRyZWVzaXQtbm9kZS1zdGFydCBzb3VyY2UtY2VsbCkpKSkKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoZ290by1jaGFyIHApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGdvdG8tY2hhciAocG9zLWJvbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGlmIChzZWFyY2gtZm9yd2FyZCAifCIgcCB0KQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoc2V0cSBwICgxLSAocG9pbnQpKSkKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChzZXRxIHAgKHBvcy1ib2wpKSkKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBJ
ZiBpbnNlcnRpbmcgbGVmdCBhbmQgYW55IG90aGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgOzsgY29sdW1uLCB1c2UgdGhlIGVuZCBvZiB0aGUgcHJpb3IKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICA7OyBjZWxsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChsZWZ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgrIGFkagogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoMSsgKHRyZWVzaXQtbm9kZS1lbmQKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoICgxLSB0YWJsZS1jb2x1bW4pIGNv
bHMpKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IElmIGluc2VydGluZyBy
aWdodCwgdXNlIHRoZSBlbmQgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyB0
aGUgY3VycmVudCBjZWxsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0CiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICgrIGFkagogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWVuZCBzb3VyY2UtY2VsbCkpKSkpKQogICAgICAg
ICAgICAgICAgKGdvdG8tY2hhciBiZWcpCiAgICAgICAgICAgICAgICAobGV0KiAoKG9yaWctcG9p
bnQgKHBvaW50KSkKICAgICAgICAgICAgICAgICAgICAgICAobWlzc2luZy1sZWFkaW5nLXBpcGUK
ICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4gKGVxIHRhYmxlLWNvbHVtbiAwKQogICAgICAg
ICAgICAgICAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGdvdG8tY2hhciAocG9zLWJvbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
dW5sZXNzIChzZWFyY2gtZm9yd2FyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgInwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKyBhZGogKHRyZWVz
aXQtbm9kZS1zdGFydCBzb3VyY2UtY2VsbCkpIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICJ8IikpKSkKICAgICAgICAgICAgICAgICAgICAgICAodGV4dCAoY29uZAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA7OyBJZiBjbG9uaW5nLCByZXRyaWV2ZSB0aGUgc291cmNlIGNl
bGwgdGV4dC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsb25lIChidWZmZXItc3Vi
c3RyaW5nLW5vLXByb3BlcnRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICA7OyBCYWNrIHVwIHRvIGJvbCBvciB0aGUgcGlwZQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDs7IHRvIGNhcHR1cmUgdGhlIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICA7OyB0aGUgZ3JhbW1hciBsZWF2ZXMgb3V0LgogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhcgogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICgrIGFkagogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtc3RhcnQgc291cmNlLWNlbGwpKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2lwLWNoYXJzLWJhY2t3YXJk
ICJbWzpibGFuazpdXSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChwb3MtYm9sKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChwb2ludCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKCsgYWRqICh0cmVlc2l0LW5vZGUtZW5kIHNvdXJjZS1jZWxsKSkpKQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICA7OyBJZiBuZXcgY29sdW1uLCBhbmQgdGhpcyBpcyB0aGUKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgOzsgZGVsaW1pdGVyIHJvdywgaW5zZXJ0IGEgZGVmYXVs
dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBkZWxpbWl0ZXIuCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICgoZXF1YWwgcm93LXR5cGUgInBpcGVfdGFibGVfZGVsaW1pdGVy
X3JvdyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSkKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgOzsgSWYgbmV3IGNvbHVtbiwgYW5kIHRoaXMgaXMgdGhlIGEgaGVh
ZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IG9yIGJvZHkgcm93LCBpbnNlcnQg
YSBkZWZhdWx0IGVtcHR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHN0cmluZy4K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGVtcHR5KSkpKQogICAgICAgICAgICAgICAgICAoY29uZAogICAgICAgICAgICAgICAg
ICAgKGNsb25lCiAgICAgICAgICAgICAgICAgICAgKGNvbmQKICAgICAgICAgICAgICAgICAgICA7
OyBDbG9uZSB0aGUgZmlyc3QgY29sdW1uIHRvIHRoZSBsZWZ0LiAgSWYgdGhlcmUgaXMKICAgICAg
ICAgICAgICAgICAgICA7OyBubyBwaXBlIGJlZm9yZSB0aGUgY2VsbCBjb250ZW50LCBpbnNlcnQg
b25lLgogICAgICAgICAgICAgICAgICAgICAoKGFuZCBsZWZ0IChlcSB0YWJsZS1jb2x1bW4gMCkp
CiAgICAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQgInwiCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciBtaXNz
aW5nLWxlYWRpbmctcGlwZSAiIikpKQogICAgICAgICAgICAgICAgICAgIDs7IENsb25lIHRoZSBm
aXJzdCBjb2x1bW4gdG8gdGhlIHJpZ2h0LgogICAgICAgICAgICAgICAgICAgICAoKGFuZCAobm90
IGxlZnQpIChlcSB0YWJsZS1jb2x1bW4gMCkpCiAgICAgICAgICAgICAgICAgICAgICAoaW5zZXJ0
ICJ8IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KQogICAgICAgICAgICAgICAg
ICAgICAgOzsgRm9yIGEgcG9zaXRpdmUgdXNlciBleHBlcmllbmNlIGdpdmVuIGdyYW1tYXIKICAg
ICAgICAgICAgICAgICAgICAgIDs7IGJ1Z3MsIGFkZCBhIG1pc3NpbmcgbGVhZGluZyBwaXBlIHRv
IHRoZSBmaXJzdAogICAgICAgICAgICAgICAgICAgICAgOzsgY2VsbCBhdCBhIHBsZWFzaW5nIHBv
c2l0aW9uIGFmdGVyIGNsb25pbmcuCiAgICAgICAgICAgICAgICAgICAgICAod2hlbiBtaXNzaW5n
LWxlYWRpbmctcGlwZQogICAgICAgICAgICAgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAg
ICAgICAgICAgICAgICAgICAgICAgICAobW92ZS10by1jb2x1bW4gZGVsaW0wLXBpcGUtY29sKQog
ICAgICAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQgInwiKSkpKQogICAgICAgICAgICAgICAg
ICAgIDs7IENsb25lIHRoZSBmaW5hbCBjb2x1bW4gdG8gdGhlIGxlZnQuCiAgICAgICAgICAgICAg
ICAgICAgICgoYW5kIGxlZnQgKGVxIHRhYmxlLWNvbHVtbiAoMS0gbmNvbHMpKSkKICAgICAgICAg
ICAgICAgICAgICAgIChpbnNlcnQgdGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi
fCIpKQogICAgICAgICAgICAgICAgICAgICA7OyBDbG9uZSBhIG1pZGRsZSBjb2x1bW4gdG8gdGhl
IGxlZnQuCiAgICAgICAgICAgICAgICAgICAgIChsZWZ0CiAgICAgICAgICAgICAgICAgICAgICAo
aW5zZXJ0IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInwiKSkKICAgICAgICAg
ICAgICAgICAgICAgOzsgQ2xvbmUgYSBtaWRkbGUgb3IgZmluYWwgY29sdW1uIHRvIHRoZSByaWdo
dC4KICAgICAgICAgICAgICAgICAgICAgKHQKICAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQg
InwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpKSkpCgogICAgICAgICAgICAg
ICAgICAgOzsgTm90IGNsb25pbmcsIGluc2VydCBhIG5ldyBjb2x1bW4uCiAgICAgICAgICAgICAg
ICAgICAoKGFuZCBsZWZ0IChlcSB0YWJsZS1jb2x1bW4gMCkgKGVxIHggKDEtIG5yb3dzKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgIChub3QgKGVxdWFsIHJvdy10eXBlICJwaXBlX3RhYmxlX2Rl
bGltaXRlcl9yb3ciKSkpCiAgICAgICAgICAgICAgICAgICA7OyBUT0RPOiByZW1vdmUgcGxhY2Vo
b2xkZXIgbG9naWMuCiAgICAgICAgICAgICAgICAgICAgKGluc2VydAogICAgICAgICAgICAgICAg
ICAgICAifCIKICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAg
ICAgICAgKG9yIG1pc3NpbmctbGVhZGluZy1waXBlICIiKSkpCiAgICAgICAgICAgICAgICAgICAo
KGFuZCBsZWZ0IChlcSB0YWJsZS1jb2x1bW4gMCkpCiAgICAgICAgICAgICAgICAgICAgICAoaW5z
ZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgInwiCiAgICAgICAgICAgICAgICAgICAgICAgdGV4
dAogICAgICAgICAgICAgICAgICAgICAgIChvciBtaXNzaW5nLWxlYWRpbmctcGlwZSAiIikpKQog
ICAgICAgICAgICAgICAgICAgKGxlZnQKICAgICAgICAgICAgICAgICAgICAoaW5zZXJ0CiAgICAg
ICAgICAgICAgICAgICAgIHRleHQKICAgICAgICAgICAgICAgICAgICAgInwiKSkKICAgICAgICAg
ICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAgKGluc2VydAogICAgICAgICAgICAgICAg
ICAgICAifCIKICAgICAgICAgICAgICAgICAgICAgdGV4dCkpKQoKICAgICAgICAgICAgICAgICAg
OzsgQ2FwdHVyZSB0aGUgc3RhcnQgb2YgdGhlIG5ldyBjZWxsJ3MgY29udGVudCBpbgogICAgICAg
ICAgICAgICAgICA7OyB0aGUgcm93IHRoYXQgb3JpZ2luYWxseSBjb250YWluZWQgcG9pbnQuCiAg
ICAgICAgICAgICAgICAgICh3aGVuIChhbmQgKG5vdCB0YXJnZXQtcG9zKQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtZXEgcm93IHBvaW50LXJvdykpCiAgICAgICAg
ICAgICAgICAgICAgKHNldHEgdGFyZ2V0LXBvcwogICAgICAgICAgICAgICAgICAgICAgICAgIChj
b25kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQtY29sdW1uLW51bWJlcgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1zdGFydCB0YXJnZXQtY2VsbCkp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoaWYgKGFuZCBsZWZ0IChub3QgKGVxIHRhYmxlLWNvbHVtbiAwKSkpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgOzsgInRleHQgfCIgaW5zZXJ0ZWQgYXQgYmVnLgogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG9yaWctcG9pbnQKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgOzsgQWxsIG90aGVyIGJyYW5jaGVzIGluc2VydCAifCIgZmlyc3QuCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICgxKyBvcmlnLXBvaW50KSkpKSkpCgogICAgICAgICAgICAgICAg
ICA7OyBBZGp1c3Qgb2Zmc2V0IGZvciBkZWxldGVkIHRleHQuCiAgICAgICAgICAgICAgICAgIChz
ZXRxIGFkaiAoKyBhZGogKC0gKHBvaW50KSBvcmlnLXBvaW50KSkKICAgICAgICAgICAgICAgICAg
ICAgICAgb3JpZy1wb2ludCAocG9pbnQpKSkpKSkpCiAgICAgICAgKHdoZW4gdGFyZ2V0LXBvcwog
ICAgICAgICAgKGdvdG8tY2hhciB0YXJnZXQtcG9zKSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMt
dGFibGUtZGVsZXRlLWNvbHVtbiAoKQogICJEZWxldGUgdGhlIHRhYmxlIGNvbHVtbiBhdCBwb2lu
dC4KUG9pbnQgY2FuIGJlIGluIHRoZSB0YWJsZSBoZWFkZXIgb3IgYm9keS4KSWYgcG9pbnQgaXMg
bm90IGF0IGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24t
dHMtLWJhcmYtaWYtbm90LW1vZGUgJ21hcmtkb3duLXRzLXRhYmxlLWRlbGV0ZS1jb2x1bW4pCiAg
KHdoZW4tbGV0KiAoKGF0LXRhYmxlIChtYXJrZG93bi10cy1hdC10YWJsZS1wIG5pbCB0KSkKICAg
ICAgICAgICAgICAocG9zIChjYXIgYXQtdGFibGUpKQogICAgICAgICAgICAgICh0YWJsZSAoY2Ry
IGF0LXRhYmxlKSkKICAgICAgICAgICAgICAoY2VsbCAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUt
Y2VsbCBuaWwgcG9zKSkKICAgICAgICAgICAgICAocm93IChtYXJrZG93bi10cy0tdGFibGUtbm9k
ZS1yb3cgY2VsbCkpCiAgICAgICAgICAgICAgKGNvbHMgKHRyZWVzaXQtbm9kZS1jaGlsZHJlbiBy
b3cgJ25hbWVkKSkKICAgICAgICAgICAgICAobmNvbHMgKGxlbmd0aCBjb2xzKSkpCiAgICAobGV0
ICgodGFibGUtY29sdW1uIChtYXJrZG93bi10cy0tdGFibGUtY29tcHV0ZS1ub2RlLWNvbHVtbiBy
b3cgY2VsbCkpKQogICAgICAodW5sZXNzIHRhYmxlLWNvbHVtbgogICAgICAgIChlcnJvciAiQ291
bGQgbm90IGNvbXB1dGUgdGhlIHRhYmxlIGNvbHVtbiIpKQogICAgICA7OyBOT1RFOiBHRk0gdGFi
bGVzIGFsbG93IG5vbi11bmlmb3JtIHRhYmxlIHJvd3MuICBUaGUgY3VycmVudCByb3cKICAgICAg
OzsgY291bGQgaGF2ZSBhIGRpZmZlcmluZyBudW1iZXIgb2YgY29sdW1ucyBmcm9tIG90aGVyIHJv
d3MuICBXZQogICAgICA7OyBzaWxlbnRseSBkbyBub3RoaW5nIHRvIGEgcm93IHRoYXQgZG9lcyBu
b3QgZXh0ZW5kIHRvIHRoZQogICAgICA7OyBjb21wdXRlZCBjb2x1bW4uCiAgICAgIDs7CiAgICAg
IDs7IE5PVEU6IFRoZSBncmFtbWFyIGFubm95aW5nbHkgaWdub3JlcyBjZWxsIGxlYWRpbmcgd2hp
dGVzcGFjZQogICAgICA7OyBidXQgZG9lcyBpbmNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2Ugc28g
Y2VsbHMgYXJlIGJvdW5kZWQgYnkKICAgICAgOzsgdGhlIGZpcnN0IGdyYXBoIGNoYXJhY3RlciB1
cCB0byB0aGUgbGFzdCBjaGFyYWN0ZXIganVzdCBiZWZvcmUKICAgICAgOzsgdGhlIHBpcGUgc3lt
Ym9sLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KICAgICAgOzsKICAgICAgOzsgVGhlIGdyYW1tYXIg
YWxzbyBjb25zaWRlcnMgdGhlIHRyYWlsaW5nIHBpcGUgc3ltYm9sIHRvIGJlIGEKICAgICAgOzsg
cGFydCBvZiBpdHMgcHJlY2VkaW5nIGNlbGwgc28gdGhhdCdzIHdoYXQgd2UgZGVsZXRlIHdoZW4g
d2UKICAgICAgOzsgZGVsZXRlIGEgY29sdW1uJ3MgY2VsbDsgaS5lLiwgaWYgdGhlcmUgaXMgYSBw
aXBlIGJlZm9yZSB0aGUKICAgICAgOzsgZmlyc3QgY29sdW1uLCB3ZSBkZWxldGUgaXQuCiAgICAg
IChsZXQqICgoYWRqIDApIDsgQWRqdXN0IG5vZGUgcG9zaXRpb24gb2Zmc2V0cyBieSBkZWxldGVk
IHRleHQuCiAgICAgICAgICAgICAocm93cyAodHJlZXNpdC1ub2RlLWNoaWxkcmVuIHRhYmxlICdu
YW1lZCkpCiAgICAgICAgICAgICAobnJvd3MgKGxlbmd0aCByb3dzKSkpCiAgICAgICAgKHNhdmUt
ZXhjdXJzaW9uCiAgICAgICAgICAod2l0aG91dC1yZXN0cmljdGlvbgogICAgICAgICAgICAoZG90
aW1lcyAoeCBucm93cykKICAgICAgICAgICAgICA7OyBJZiBjZWxsIGlzIG5pbCwgaXQgaXMgYmV5
b25kIHRoZSB0YWJsZS1jb2x1bW4gYW5kIGl0cwogICAgICAgICAgICAgIDs7IHJvdyBpcyBpZ25v
cmVkLgogICAgICAgICAgICAgICh3aGVuLWxldCogKChyb3cgKG50aCB4IHJvd3MpKQogICAgICAg
ICAgICAgICAgICAgICAgICAgIChjb2xzICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4gcm93ICduYW1l
ZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5jb2xzIChsZW5ndGggY29scykpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGNlbGwgKG50aCB0YWJsZS1jb2x1bW4gY29scykpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGNlbGwtYmVnICh0cmVlc2l0LW5vZGUtc3RhcnQgY2VsbCkp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwtZW5kICh0cmVlc2l0LW5vZGUtZW5kIGNl
bGwpKQogICAgICAgICAgICAgICAgICAgICAgICAgIDs7IEFkanVzdCBiZWcgdG8gdHJpbSB0aGUg
Z3JhbW1hcgogICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHVuYWNjb3VudGVkLWZvciBsZWFk
aW5nIHdoaXRlc3BhY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJlZyAoY29uZAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IElmIHRoaXMgaXMgdGhlIHNvbGUgY29sdW1u
LCBkZWxldGUgZnJvbSBib2wuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlcSBu
Y29scyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyICgtIGNl
bGwtYmVnIGFkaikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3MtYm9sKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBj
b2x1bW4sIGRlbGV0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGZyb20gdGhl
IHBpcGUsIGlmIHRoZXJlIGlzIG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7
OyBvdGhlcndpc2UgY2VsbC1iZWcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChl
cSB0YWJsZS1jb2x1bW4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAo
KHAgKC0gY2VsbC1iZWcgYWRqKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGdvdG8tY2hhciBwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNo
YXIgKHBvcy1ib2wpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoc2Vh
cmNoLWZvcndhcmQgInwiIHAgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKDEtIChwb2ludCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKSkp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgSWYgdGhpcyBpcyB0aGUgZmluYWwg
Y29sdW1uLCBkZWxldGUgZnJvbSB0aGUgcHJpb3IgcGlwZSBzeW1ib2wuCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKChlcSB0YWJsZS1jb2x1bW4gKDEtIG5jb2xzKSkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKHAgKC0gKHRyZWVzaXQtbm9kZS1lbmQKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudGggKDEtIHRhYmxl
LWNvbHVtbikgY29scykpIGFkaikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChnb3RvLWNoYXIgcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKHNl
YXJjaC1mb3J3YXJkICJ8IiAoLSBjZWxsLWJlZyBhZGopIHQpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChwb2ludCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHApKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBPdGhlcndpc2Us
IHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
OzsgcHJpb3IgY2VsbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoLSAodHJlZXNpdC1ub2RlLWVuZAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudGggKDEtIHRhYmxlLWNvbHVtbikgY29s
cykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkaikpKSkKICAgICAgICAg
ICAgICAgICAgICAgICAgICA7OyBBZGp1c3QgZW5kIHRvIHRyaW0gdGhlIHRyYWlsaW5nIHBpcGUg
c3ltYm9sCiAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgY29uc2lkZXJlZCBieSB0aGUgZ3Jh
bW1hciB0byBiZSBwYXJ0IG9mIGl0cwogICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHByZWNl
ZGluZyBjZWxsLgogICAgICAgICAgICAgICAgICAgICAgICAgIChlbmQgKGNvbmQKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICA7OyBJZiB0aGlzIGlzIHRoZSBzb2xlIGNvbHVtbiwgZGVs
ZXRlIHVudGlsIGVvbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVxIG5jb2xz
IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKC0gY2VsbC1i
ZWcgYWRqKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvcy1lb2wpKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IElmIHRoaXMgaXMgdGhlIGZpbmFsIGNvbHVt
biwgZGVsZXRlIHVudGlsIGVvbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVx
IHRhYmxlLWNvbHVtbiAoMS0gbmNvbHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoZ290by1jaGFyICgtIGNlbGwtZW5kIGFkaikpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChwb3MtZW9sKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBPdGhl
cndpc2UsIGxvb2sgZm9yd2FyZCBmcm9tIGNlbGwtZW5kCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgOzsgKHdoaWNoIGluY2x1ZGVzIHRoZSBjZWxsJ3MgdHJhaWxpbmcKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICA7OyB3aGl0ZXNwYWNlKSBmb3IgYSBwaXBlIHN5bWJvbC4K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoZ290by1jaGFyICgtIGNlbGwtZW5kIGFkaikpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChpZiAocmUtc2VhcmNoLWZvcndhcmQgInwrPyIgKHBvcy1lb2wpIHQp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS0gKHBvaW50KSkKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLWVuZCkpKSkpCiAgICAgICAgICAgICAg
ICAoZGVsZXRlLXJlZ2lvbiBiZWcgZW5kKQogICAgICAgICAgICAgICAgKHNldHEgYWRqICgrIGFk
aiAoLSBlbmQgYmVnKSkpKSkpKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1tb3ZlLWNv
bHVtbi1sZWZ0ICgpCiAgIk1vdmUgdGhlIHRhYmxlIGNvbHVtbiBhdCBwb2ludCB0byBpdHMgbGVm
dC4KUG9pbnQgY2FuIGJlIGluIHRoZSB0YWJsZSBoZWFkZXIgb3IgYm9keS4KSWYgcG9pbnQgaXMg
bm90IGF0IGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24t
dHMtdGFibGUtbW92ZS1jb2x1bW4gJ2xlZnQpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLW1v
dmUtY29sdW1uLXJpZ2h0ICgpCiAgIk1vdmUgdGhlIHRhYmxlIGNvbHVtbiBhdCBwb2ludCB0byBp
dHMgcmlnaHQuClBvaW50IGNhbiBiZSBpbiB0aGUgdGFibGUgaGVhZGVyIG9yIGJvZHkuCklmIHBv
aW50IGlzIG5vdCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUpCiAgKG1h
cmtkb3duLXRzLXRhYmxlLW1vdmUtY29sdW1uICdyaWdodCkpCgooZGVmdW4gbWFya2Rvd24tdHMt
dGFibGUtbW92ZS1jb2x1bW4gKCZvcHRpb25hbCBsZWZ0KQogICJNb3ZlIHRoZSB0YWJsZSBjb2x1
bW4gYXQgcG9pbnQgcmlnaHQgb3IgbGVmdC4KSWYgTEVGVCBpcyBub24tbmlsIGFuZCBpcyBub3Qg
YHJpZ2h0Jywgb3Igd2l0aCBhIHByZWZpeCBhcmd1bWVudCwKbW92ZSB0aGUgY29sdW1uIHRvIGl0
cyBsZWZ0LgpEbyBub3RoaW5nIGlmIGEgcm93IGJlaW5nIG1vdmVkIGlzIG5vdCB3aXRoaW4gdGhl
IGNvbHVtbnMgb2YgdGhlIGhlYWRlci4KRG8gbm90aGluZyBpZiBtb3ZpbmcgbGVmdCBhbmQgdGhl
IGN1cnJlbnQgY29sdW1uIGlzIHRoZSBmaXJzdCBjb2x1bW4gb2YKdGhlIGN1cnJlbnQgcm93LgpE
byBub3RoaW5nIGlmIG1vdmluZyByaWdodCBhbmQgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHRoZSBm
aW5hbCBjb2x1bW4gb2YKdGhlIGN1cnJlbnQgcm93LgpQb2ludCBjYW4gYmUgaW4gdGhlIHRhYmxl
IGhlYWRlciBvciBib2R5LgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4i
CiAgKGludGVyYWN0aXZlKQogIChtYXJrZG93bi10cy0tYmFyZi1pZi1ub3QtbW9kZSAnbWFya2Rv
d24tdHMtdGFibGUtbW92ZS1jb2x1bW4pCiAgKHNldHEgbGVmdCAoY29uZCAoKGVxIGxlZnQgJ3Jp
Z2h0KSBuaWwpCiAgICAgICAgICAgICAgICAgICAobGVmdCBsZWZ0KQogICAgICAgICAgICAgICAg
ICAgKGN1cnJlbnQtcHJlZml4LWFyZyB0KSkpCiAgKHdoZW4tbGV0KiAoKGF0LXRhYmxlIChtYXJr
ZG93bi10cy1hdC10YWJsZS1wIG5pbCB0KSkKICAgICAgICAgICAgICAocG9zIChjYXIgYXQtdGFi
bGUpKQogICAgICAgICAgICAgICh0YWJsZSAoY2RyIGF0LXRhYmxlKSkKICAgICAgICAgICAgICAo
bm9kZSAodHJlZXNpdC1ub2RlLWF0IHBvcyAnbWFya2Rvd24gJ25hbWVkKSkKICAgICAgICAgICAg
ICAoY2VsbCAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtY2VsbCBub2RlKSkKICAgICAgICAgICAg
ICAocm93IChtYXJrZG93bi10cy0tdGFibGUtbm9kZS1yb3cgbm9kZSkpCiAgICAgICAgICAgICAg
KGhlYWRlci1yb3cgKHRyZWVzaXQtc2VhcmNoLXN1YnRyZWUKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYHBpcGVfdGFi
bGVfaGVhZGVyXFwnIikpCiAgICAgICAgICAgICAgKG5oZWFkZXJzIChsZW5ndGggKHRyZWVzaXQt
bm9kZS1jaGlsZHJlbiBoZWFkZXItcm93ICduYW1lZCkpKQogICAgICAgICAgICAgIChjb2xzICh0
cmVlc2l0LW5vZGUtY2hpbGRyZW4gcm93ICduYW1lZCkpCiAgICAgICAgICAgICAgKG5jb2xzIChs
ZW5ndGggY29scykpKQogICAgKGxldCAoKHRhYmxlLWNvbHVtbiAobWFya2Rvd24tdHMtLXRhYmxl
LWNvbXB1dGUtbm9kZS1jb2x1bW4gcm93IGNlbGwpKSkKICAgICAgKHVubGVzcyB0YWJsZS1jb2x1
bW4KICAgICAgICAoZXJyb3IgIkNvdWxkIG5vdCBjb21wdXRlIHRoZSB0YWJsZSBjb2x1bW4iKSkK
ICAgICAgKGlmICg+PSB0YWJsZS1jb2x1bW4gbmhlYWRlcnMpCiAgICAgICAgICAobWVzc2FnZSAi
UmFnZ2VkL3VuZXZlbiBjb2x1bW4gY2Fubm90IGJlIG1vdmVkIikKICAgICAgICA7OyBBIEIgQyBE
IC0+IEIgQSBDIEQKICAgICAgICA7OyBNb3ZlIEEgbGVmdDogZG8gbm90aGluZwogICAgICAgIDs7
IE1vdmUgRCByaWdodDogZG8gbm90aGluZwogICAgICAgIDs7IE1vdmUgY3VycmVudCBjb2x1bW4g
bGVmdDoKICAgICAgICA7OyAgIHNvdXJjZSBjb2x1bW4gPSB0IC0gMQogICAgICAgIDs7IE1vdmUg
Y3VycmVudCBjb2x1bW4gcmlnaHQ6CiAgICAgICAgOzsgICBjbG9uZSB0IHRvIHQrMSBpZiB0aGUg
ZmluYWwgY29sdW1uLCBvdGhlcndpc2UgdCsyCiAgICAgICAgOzsgICBkZWxldGUgdAogICAgICAg
IChjb25kICgoYW5kIGxlZnQgKGVxIHRhYmxlLWNvbHVtbiAwKSkKICAgICAgICAgICAgICAgKG1l
c3NhZ2UgIkxlZnRtb3N0IGNvbHVtbiBjYW5ub3QgYmUgbW92ZWQgbGVmdCIpCiAgICAgICAgICAg
ICAgIG5pbCkKICAgICAgICAgICAgICAoKGFuZCAobm90IGxlZnQpIChlcSB0YWJsZS1jb2x1bW4g
KDEtIG5jb2xzKSkpCiAgICAgICAgICAgICAgIChtZXNzYWdlICJSaWdodG1vc3QgY29sdW1uIGNh
bm5vdCBiZSBtb3ZlZCByaWdodCIpCiAgICAgICAgICAgICAgIG5pbCkKICAgICAgICAgICAgICAo
dAogICAgICAgICAgICAgICAobGV0ICgoc291cmNlLWNvbHVtbiAoaWYgbGVmdAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEtIHRhYmxlLWNvbHVtbikKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS1jb2x1bW4pKQogICAgICAgICAgICAg
ICAgICAgICAodGFyZ2V0LWNvbHVtbiAoaWYgbGVmdAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdGFibGUtY29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKDErIHRhYmxlLWNvbHVtbikpKSkKICAgICAgICAgICAgICAgICAoc2F2ZS1leGN1
cnNpb24KICAgICAgICAgICAgICAgICAgIChtYXJrZG93bi10cy10YWJsZS0tZ290by1jb2x1bW4g
c291cmNlLWNvbHVtbikKICAgICAgICAgICAgICAgICAgIChtYXJrZG93bi10cy10YWJsZS1pbnNl
cnQtY29sdW1uCiAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0IChsaXN0CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0YXJnZXQtY29sdW1uKSkpCiAgICAgICAgICAgICAgICAgKG1hcmtkb3du
LXRzLXRhYmxlLS1nb3RvLWNvbHVtbiBzb3VyY2UtY29sdW1uKQogICAgICAgICAgICAgICAgICht
YXJrZG93bi10cy10YWJsZS1kZWxldGUtY29sdW1uKQogICAgICAgICAgICAgICAgIDs7IEVtcHR5
IGNlbGxzIGNhbiBjb25mdXNlIHRoZSBncmFtbWFyLCBzbyBuby1lcnJvciBoZXJlLgogICAgICAg
ICAgICAgICAgIChpZiBsZWZ0CiAgICAgICAgICAgICAgICAgICAgIChtYXJrZG93bi10cy10YWJs
ZS0tZ290by1jb2x1bW4KICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS1jb2x1bW4gJ25vLWVy
cm9yKQogICAgICAgICAgICAgICAgICAgKG1hcmtkb3duLXRzLXRhYmxlLS1nb3RvLWNvbHVtbgog
ICAgICAgICAgICAgICAgICAgIHRhcmdldC1jb2x1bW4gJ25vLWVycm9yKSkpKSkpKSkpCgooZGVm
dW4gbWFya2Rvd24tdHMtdGFibGUtYWxpZ24tY29sdW1uLWxlZnQgKCkKICAiQWxpZ24gdGhlIHRh
YmxlIGNvbHVtbiBhdCBwb2ludCB0byB0aGUgbGVmdC4KRG8gdGhlIHdvcmsgd2l0aCBgbWFya2Rv
d24tdHMtdGFibGUtYWxpZ24tY29sdW1uJywgd2hpY2ggc2VlIGZvciBtb3JlCmRldGFpbHMuIgog
IChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24tdHMtdGFibGUtYWxpZ24tY29sdW1uICdsZWZ0KSkK
CihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1hbGlnbi1jb2x1bW4tY2VudGVyICgpCiAgIkFsaWdu
IHRoZSB0YWJsZSBjb2x1bW4gYXQgcG9pbnQgdG8gdGhlIGNlbnRlci4KRG8gdGhlIHdvcmsgd2l0
aCBgbWFya2Rvd24tdHMtdGFibGUtYWxpZ24tY29sdW1uJywgd2hpY2ggc2VlIGZvciBtb3JlCmRl
dGFpbHMuIgogIChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24tdHMtdGFibGUtYWxpZ24tY29sdW1u
ICdjZW50ZXIpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWFsaWduLWNvbHVtbi1yaWdodCAo
KQogICJBbGlnbiB0aGUgdGFibGUgY29sdW1uIGF0IHBvaW50IHRvIHRoZSByaWdodC4KRG8gdGhl
IHdvcmsgd2l0aCBgbWFya2Rvd24tdHMtdGFibGUtYWxpZ24tY29sdW1uJywgd2hpY2ggc2VlIGZv
ciBtb3JlCmRldGFpbHMuIgogIChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24tdHMtdGFibGUtYWxp
Z24tY29sdW1uICdyaWdodCkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtYWxpZ24tY29sdW1u
ICgmb3B0aW9uYWwgYWxpZ24pCiAgIkFsdGVyIHRoZSB0YWJsZSBjb2x1bW4gYWxpZ25tZW50IGF0
IHBvaW50LgpBbHRlciB0aGUgY29sdW1uIHBvaW50IGlzIGluLgoKTm90ZTogVG8gY29tcHV0ZSB0
aGUgY29sdW1uLCBwb2ludCBtdXN0IGJlIHdpdGhpbiB0aGUgY29sdW1uIGFuZCBjYW5ub3QKYmUg
b24gdGhlIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBvbiBhIGNvbHVtbiBkZWxp
bWl0ZXIuCgpBTElHTiBjYW4gYmUgb25lIG9mIHRoZSBzeW1ib2xzIGBsZWZ0JywgYGNlbnRlcics
IGByaWdodCcgb3IgbmlsIGZvcgp1bnNwZWNpZmllZCwgb3IgdGhlIGNoYXJhY3RlcnMgbCwgYywg
b3Igci4KCklmIEFMSUdOIGlzIG5pbCwgYXNzdW1lIHVuc3BlY2lmaWVkLiAgTWFrZSB0aGUgYWxp
Z25tZW50IHN0cmluZyBhCm1pbmltdW0gb2YgNSBjaGFyYWN0ZXJzIHRvIGFjY29tbW9kYXRlIE1h
cmtkb3duIGNvbnZlbnRpb25zLgoKSWYgcG9pbnQgaXMgbm90IGF0IGEgdGFibGUsIGRvIG5vdGhp
bmcuIgogIChpbnRlcmFjdGl2ZQogICAobGlzdCAoY2FyIChyZWFkLW11bHRpcGxlLWNob2ljZQog
ICAgICAgICAgICAgICAiQWxpZ24gY29sdW1uIiAnKCg/bCAibGVmdCIpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKD9jICJjZW50ZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICg/ciAicmlnaHQiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg/dSAi
dW5zcGVjaWZpZWQiKSkpKSkpCiAgKG1hcmtkb3duLXRzLS1iYXJmLWlmLW5vdC1tb2RlICdtYXJr
ZG93bi10cy10YWJsZS1hbGlnbi1jb2x1bW4pCiAgKHNldHEgYWxpZ24gKGlmIChjaGFyYWN0ZXJw
IGFsaWduKQogICAgICAgICAgICAgICAgICAocGNhc2UgYWxpZ24gKD9sICdsZWZ0KSAoP2MgJ2Nl
bnRlcikgKD9yICdyaWdodCkpCiAgICAgICAgICAgICAgICBhbGlnbikpCiAgKHdoZW4tbGV0KiAo
KGF0LXRhYmxlIChtYXJrZG93bi10cy1hdC10YWJsZS1wIG5pbCB0KSkKICAgICAgICAgICAgICAo
cG9zIChjYXIgYXQtdGFibGUpKQogICAgICAgICAgICAgICh0YWJsZSAoY2RyIGF0LXRhYmxlKSkK
ICAgICAgICAgICAgICAobm9kZSAodHJlZXNpdC1ub2RlLWF0IHBvcyAnbWFya2Rvd24gJ25hbWVk
KSkKICAgICAgICAgICAgICAoY2VsbCAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtY2VsbCBub2Rl
KSkKICAgICAgICAgICAgICAocm93IChtYXJrZG93bi10cy0tdGFibGUtbm9kZS1yb3cgY2VsbCkp
CiAgICAgICAgICAgICAgKGFsaWduZXJzIChtYXJrZG93bi10cy0tdGFibGUtYWxpZ25lcnMgdGFi
bGUpKSkKICAgIChsZXQgKCh0YWJsZS1jb2x1bW4gKG1hcmtkb3duLXRzLS10YWJsZS1jb21wdXRl
LW5vZGUtY29sdW1uIHJvdyBjZWxsKSkpCiAgICAgICh1bmxlc3MgdGFibGUtY29sdW1uCiAgICAg
ICAgKGVycm9yICJDb3VsZCBub3QgY29tcHV0ZSB0aGUgdGFibGUgY29sdW1uIikpCiAgICAgIDs7
IE5PVEU6IEdGTSB0YWJsZXMgYWxsb3cgbm9uLXVuaWZvcm0gdGFibGUgcm93cy4gIFRoZSBjdXJy
ZW50IHJvdwogICAgICA7OyBjb3VsZCBoYXZlIGEgZGlmZmVyaW5nIG51bWJlciBvZiBjb2x1bW5z
IGZyb20gdGhlIGhlYWRlci4gIFdlCiAgICAgIDs7IHNpbGVudGx5IGRvIG5vdGhpbmcgaWYgd2Ug
Y2FuJ3QgZmluZCBhIG1hdGNoaW5nIGhlYWRlciBjb2x1bW4uCiAgICAgICh3aGVuLWxldCogKChh
bGlnbmVyIChudGggdGFibGUtY29sdW1uIGFsaWduZXJzKSkKICAgICAgICAgICAgICAgICAgKGJl
ZyAocGxpc3QtZ2V0IGFsaWduZXIgOmJlZykpCiAgICAgICAgICAgICAgICAgIChlbmQgKHBsaXN0
LWdldCBhbGlnbmVyIDplbmQpKQogICAgICAgICAgICAgICAgICAoc3RyIChidWZmZXItc3Vic3Ry
aW5nLW5vLXByb3BlcnRpZXMgYmVnIGVuZCkpCiAgICAgICAgICAgICAgICAgIChzdHJsZW4gKG1h
eCA1IChsZW5ndGggc3RyKSkpKQogICAgICAgIChkZWxldGUtcmVnaW9uIGJlZyBlbmQpCiAgICAg
ICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAoZ290by1jaGFyIGJlZykKICAgICAgICAgIChp
bnNlcnQgKG1hcmtkb3duLXRzLS10YWJsZS1tYWtlLWFsaWduZXIgc3RybGVuIGFsaWduKSkpKSkp
KQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWFsaWduLXRhYmxlICgmb3B0aW9uYWwgYWxpZ24t
Y2VsbHMpCiAgIkFsaWduIHRoZSBNYXJrZG93biB0YWJsZSBhdCBwb2ludC4KQWRqdXN0IGVhY2gg
Y29sdW1uJ3Mgd2lkdGggdG8gYWNjb21tb2RhdGUgaXRzIHdpZGVzdCBjb25zdGl0dWVudCBjZWxs
LgpJZiBBTElHTi1DRUxMUyBpcyBub24tbmlsLCBvciB3aXRoIGEgcHJlZml4IGFyZ3VtZW50LCBh
cHBseSB0aGUKZGVsaW1pdGVyIHJvdydzIGFsaWdubWVudCB0byBjZWxsIGNvbnRlbnQuICBBTElH
Ti1DRUxMUyBpcyBub24tbmlsIGlmCnRoZSB1c2VyIG9wdGlvbiBgbWFya2Rvd24tdHMtdGFibGUt
YWxpZ24tZmVhdHVyZXMnIGluY2x1ZGVzCmBqdXN0aWZ5LWNlbGxzJy4KQW5jaG9yIHRoZSBjb2x1
bW5zIHRvIHRoZSBkZWxpbWl0ZXIgcm93LiAgSWdub3JlIHJvd3MgdGhhdCBjb250YWluCmNvbHVt
bnMgYmV5b25kIHRoZSBkZWxpbWl0ZXIgcm93LgpJZiBub3QgaW4gYSB0YWJsZSwgZG8gbm90aGlu
Zy4iCiAgKGludGVyYWN0aXZlICJQIikKICAobWFya2Rvd24tdHMtLWJhcmYtaWYtbm90LW1vZGUg
J21hcmtkb3duLXRzLXRhYmxlLWFsaWduLXRhYmxlKQogICh3aGVuLWxldCogKChhdC10YWJsZSAo
bWFya2Rvd24tdHMtYXQtdGFibGUtcCBuaWwgdCkpCiAgICAgICAgICAgICAgKHRhYmxlIChjZHIg
YXQtdGFibGUpKQogICAgICAgICAgICAgIChiZWcgKHRyZWVzaXQtbm9kZS1zdGFydCB0YWJsZSkp
CiAgICAgICAgICAgICAgKGVuZCAodHJlZXNpdC1ub2RlLWVuZCB0YWJsZSkpCiAgICAgICAgICAg
ICAgKF8gKG1hcmtkb3duLXRzLS10YWJsZS10aWNrLXN0YWxlLXAgYmVnKSkKICAgICAgICAgICAg
ICAocm93cyAodHJlZXNpdC1ub2RlLWNoaWxkcmVuIHRhYmxlICduYW1lZCkpCiAgICAgICAgICAg
ICAgKG5yb3dzIChsZW5ndGggcm93cykpCiAgICAgICAgICAgICAgKGRlbGltaXRlci1yb3cgKHRy
ZWVzaXQtc2VhcmNoLXN1YnRyZWUKICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlCiAgICAg
ICAgICAgICAgICAgICAgICAgICAiXFxgcGlwZV90YWJsZV9kZWxpbWl0ZXJfcm93XFwnIikpCiAg
ICAgICAgICAgICAgKGFsaWduZXJzIChtYXJrZG93bi10cy0tdGFibGUtYWxpZ25lcnMgdGFibGUp
KQogICAgICAgICAgICAgIChjb2xzICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4gZGVsaW1pdGVyLXJv
dyAnbmFtZWQpKQogICAgICAgICAgICAgIChuY29scyAobGVuZ3RoIGNvbHMpKQogICAgICAgICAg
ICAgIChjb2wtd2lkdGhzIChtYWtlLWhhc2gtdGFibGUgOnNpemUgbmNvbHMgOnRlc3QgJ2VxdWFs
KSkKICAgICAgICAgICAgICAoY2VsbC10ZXh0IChtYWtlLWhhc2gtdGFibGUgOnNpemUgKCogbnJv
d3MgbmNvbHMpIDp0ZXN0ICdlcXVhbCkpKQogICAgKHNldHEgYWxpZ24tY2VsbHMgKG9yIGFsaWdu
LWNlbGxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC1wcmVmaXgtYXJnCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgKG1lbXEgJ2p1c3RpZnktY2VsbHMgbWFya2Rvd24tdHMtdGFi
bGUtYWxpZ24tZmVhdHVyZXMpKSkKICAgICh3aXRob3V0LXJlc3RyaWN0aW9uCiAgICAgIDs7IENv
bGxlY3QgY2VsbCB0ZXh0IGFuZCBjb21wdXRlIG1heCBjb2x1bW4gd2lkdGhzLgogICAgICA7OyBE
byBub3QgdXNlIHRoZSBkZWxpbWl0ZXIgcm93IGZvciB3aWR0aCBjb21wdXRhdGlvbi4KICAgICAg
KGRvdGltZXMgKHggbnJvd3MpCiAgICAgICAgKGxldCogKChyb3cgKG50aCB4IHJvd3MpKQogICAg
ICAgICAgICAgICAoY2VsbHMgKHRyZWVzaXQtbm9kZS1jaGlsZHJlbiByb3cgJ25hbWVkKSkpCiAg
ICAgICAgICAoZG90aW1lcyAoeSBuY29scykKICAgICAgICAgICAgOzsgU2tpcCBuaWwgY2VsbHMt
LXRoZSBwYXJzZXIgZ290IGNvbmZ1c2VkLgogICAgICAgICAgICAod2hlbi1sZXQqICgoY2VsbCAo
bnRoIHkgY2VsbHMpKQogICAgICAgICAgICAgICAgICAgICAgICAodGV4dCAoc3RyaW5nLXRyaW0t
cmlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtdGV4dCBj
ZWxsICduby1wcm9wZXJ0eSkpKQogICAgICAgICAgICAgICAgICAgICAgICAodyAobGVuZ3RoIHRl
eHQpKQogICAgICAgICAgICAgICAgICAgICAgICAodzAgKG9yIChnZXRoYXNoIHkgY29sLXdpZHRo
cykgMCkpKQogICAgICAgICAgICAgIDs7IEVsaWRlIGRlbGltaXRlciB3aWR0aHMuCiAgICAgICAg
ICAgICAgKHVubGVzcyAoZXEgeCAxKQogICAgICAgICAgICAgICAgKHdoZW4gKD4gdyB3MCkKICAg
ICAgICAgICAgICAgICAgKHB1dGhhc2ggeSB3IGNvbC13aWR0aHMpKSkKICAgICAgICAgICAgICAo
cHV0aGFzaCAoY29ucyB4IHkpIHRleHQgY2VsbC10ZXh0KSkpKSkKCiAgICAgIChsZXQgKChzb3Vy
Y2UtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKQogICAgICAgICh3aXRoLXRlbXAtYnVmZmVyCiAg
ICAgICAgICAoZG90aW1lcyAoeCBucm93cykKICAgICAgICAgICAgKGRvdGltZXMgKHkgbmNvbHMp
CiAgICAgICAgICAgICAgKGxldCogKCh3aWR0aCAob3IgKGdldGhhc2ggeSBjb2wtd2lkdGhzKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLWRlZmF1bHQt
Y29sdW1uLXdpZHRoKSkKICAgICAgICAgICAgICAgICAgICAgKGFsaWduIChvciAocGxpc3QtZ2V0
IChudGggeSBhbGlnbmVycykgOmFsaWduKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICd1bnNwZWNpZmllZCkpCiAgICAgICAgICAgICAgICAgICAgIDs7IENvbmZ1c2VkIGNlbGxzIGhh
dmUgbmlsIHRleHQuCiAgICAgICAgICAgICAgICAgICAgICh0ZXh0IChvciAoZ2V0aGFzaCAoY29u
cyB4IHkpIGNlbGwtdGV4dCkgIiIpKQogICAgICAgICAgICAgICAgICAgICAodGV4dDAgKG1hcmtk
b3duLXRzLS10YWJsZS1hbGlnbi1jZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4
dCB3aWR0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBhbGlnbi1jZWxscwogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJ3Vuc3BlY2lmaWVkKSkpKQogICAgICAgICAgICAgICAgKGNvbmQKICAgICAgICAg
ICAgICAgICA7OyBIZWFkZXIgcm93LgogICAgICAgICAgICAgICAgICgoZXEgeCAwKQogICAgICAg
ICAgICAgICAgICAoaW5zZXJ0ICJ8IiB0ZXh0MCkpCiAgICAgICAgICAgICAgICAgOzsgRGVsaW1p
dGVyIHJvdy4gIFVzZSB1bmFsaWduZWQgdGV4dC4KICAgICAgICAgICAgICAgICAoKGVxIHggMSkK
ICAgICAgICAgICAgICAgICAgKGluc2VydCAifCIKICAgICAgICAgICAgICAgICAgICAgICAgICAo
bWFya2Rvd24tdHMtLXRhYmxlLW1ha2UtYWxpZ25lciB3aWR0aCBhbGlnbikpKQogICAgICAgICAg
ICAgICAgIDs7IEJvZHkgcm93LgogICAgICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAg
IChpbnNlcnQgInwiIHRleHQwKSkpKSkKICAgICAgICAgICAgKGluc2VydCAifCIgIlxuIikpCiAg
ICAgICAgICAobGV0ICgodGVtcC1idWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkpCiAgICAgICAgICAg
ICh3aXRoLWN1cnJlbnQtYnVmZmVyIHNvdXJjZS1idWZmZXIKICAgICAgICAgICAgICAocmVwbGFj
ZS1yZWdpb24tY29udGVudHMgYmVnIGVuZCB0ZW1wLWJ1ZmZlcikpKSkpKQogICAgKG1hcmtkb3du
LXRzLS10YWJsZS10aWNrLXVwZGF0ZSBiZWcpKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS10
cmFuc3Bvc2UtdGFibGUgKCkKICAiVHJhbnNwb3NlIHRoZSByb3dzIGFuZCBjb2x1bW5zIG9mIHRo
ZSBNYXJrZG93biB0YWJsZSBhdCBwb2ludC4KVXNlIHVuc3BlY2lmaWVkIGNvbHVtbiBhbGlnbm1l
bnQgaW4gdGhlIHRyYW5zcG9zZWQgdGFibGUuCklmIHRhYmxlJ3Mgcm93cyBhcmUgbm90IHVuaWZv
cm0gd2l0aCB0aG9zZSBvbiB0aGUgZGVsaW1pdGVyIHJvdywgc2lnbmFsCmFuIGVycm9yLgpJZiBu
b3QgaW4gYSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVyYWN0aXZlKQogIChtYXJrZG93bi10
cy0tYmFyZi1pZi1ub3QtbW9kZSAnbWFya2Rvd24tdHMtdGFibGUtdHJhbnNwb3NlLXRhYmxlKQog
ICh3aGVuLWxldCogKChhdC10YWJsZSAobWFya2Rvd24tdHMtYXQtdGFibGUtcCBuaWwgdCkpCiAg
ICAgICAgICAgICAgKHRhYmxlIChjZHIgYXQtdGFibGUpKQogICAgICAgICAgICAgIChiZWcgKHRy
ZWVzaXQtbm9kZS1zdGFydCB0YWJsZSkpCiAgICAgICAgICAgICAgKGVuZCAodHJlZXNpdC1ub2Rl
LWVuZCB0YWJsZSkpCiAgICAgICAgICAgICAgKHJvd3MgKHRyZWVzaXQtbm9kZS1jaGlsZHJlbiB0
YWJsZSAnbmFtZWQpKQogICAgICAgICAgICAgIChucm93cyAobGVuZ3RoIHJvd3MpKQogICAgICAg
ICAgICAgIChkZWxpbWl0ZXItcm93ICh0cmVlc2l0LXNlYXJjaC1zdWJ0cmVlCiAgICAgICAgICAg
ICAgICAgICAgICAgICB0YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgIlxcYHBpcGVfdGFi
bGVfZGVsaW1pdGVyX3Jvd1xcJyIpKQogICAgICAgICAgICAgIChhbGlnbmVycyAobWFya2Rvd24t
dHMtLXRhYmxlLWFsaWduZXJzIHRhYmxlKSkKICAgICAgICAgICAgICAoY29scyAodHJlZXNpdC1u
b2RlLWNoaWxkcmVuIGRlbGltaXRlci1yb3cgJ25hbWVkKSkKICAgICAgICAgICAgICAobmNvbHMg
KGxlbmd0aCBjb2xzKSkKICAgICAgICAgICAgICAoY2VsbC10ZXh0IChtYWtlLWhhc2gtdGFibGUg
OnNpemUgKCogbnJvd3MgbmNvbHMpIDp0ZXN0ICdlcXVhbCkpKQogICAgKHdpdGhvdXQtcmVzdHJp
Y3Rpb24KICAgICAgOzsgQ29sbGVjdCBjZWxsIHRleHQgYW5kIGludmVydCBjb29yZGluYXRlcy4K
ICAgICAgKGRvdGltZXMgKHggbnJvd3MpCiAgICAgICAgKGxldCogKChyb3cgKG50aCB4IHJvd3Mp
KQogICAgICAgICAgICAgICAoY2VsbHMgKHRyZWVzaXQtbm9kZS1jaGlsZHJlbiByb3cgJ25hbWVk
KSkpCiAgICAgICAgICAoZG90aW1lcyAoeSBuY29scykKICAgICAgICAgICAgOzsgU2tpcCBuaWwg
Y2VsbHMtLXRoZSBwYXJzZXIgZ290IGNvbmZ1c2VkLgogICAgICAgICAgICAod2hlbi1sZXQqICgo
Y2VsbCAobnRoIHkgY2VsbHMpKQogICAgICAgICAgICAgICAgICAgICAgICAodGV4dCAoc3RyaW5n
LXRyaW0tcmlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUt
dGV4dCBjZWxsICduby1wcm9wZXJ0eSkpKSkKICAgICAgICAgICAgICAocHV0aGFzaCAoY29ucyB5
IHgpIHRleHQgY2VsbC10ZXh0KSkpKSkKCiAgICAgIChsZXQgKChzb3VyY2UtYnVmZmVyIChjdXJy
ZW50LWJ1ZmZlcikpKQogICAgICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgICAoZG90aW1l
cyAoeCBuY29scykKICAgICAgICAgICAgOzsgU3ludGhlc2l6ZSBhIGRlbGltaXRlciByb3cuCiAg
ICAgICAgICAgICh3aGVuIChlcSB4IDEpCiAgICAgICAgICAgICAgKGRvdGltZXMgKF95ICgxLSBu
cm93cykpCiAgICAgICAgICAgICAgICAoaW5zZXJ0ICJ8IgogICAgICAgICAgICAgICAgICAgICAg
ICAobWFya2Rvd24tdHMtLXRhYmxlLW1ha2UtYWxpZ25lcgogICAgICAgICAgICAgICAgICAgICAg
ICAgKG1heCA1IG1hcmtkb3duLXRzLXRhYmxlLWRlZmF1bHQtY29sdW1uLXdpZHRoKQogICAgICAg
ICAgICAgICAgICAgICAgICAgJ3Vuc3BlY2lmaWVkKSkpCiAgICAgICAgICAgICAgKGluc2VydCAi
fCIgIlxuIikpCiAgICAgICAgICAgIChkb3RpbWVzICh5IG5yb3dzKQogICAgICAgICAgICAgIDs7
IFNraXAgdGhlIG9yaWdpbmFsIGRlbGltaXRlciByb3cuCiAgICAgICAgICAgICAgKHVubGVzcyAo
ZXEgeSAxKQogICAgICAgICAgICAgICAgOzsgQ29uZnVzZWQgY2VsbHMgaGF2ZSBuaWwgdGV4dC4K
ICAgICAgICAgICAgICAgIChsZXQgKCh0ZXh0IChvciAoZ2V0aGFzaCAoY29ucyB4IHkpIGNlbGwt
dGV4dCkgIiIpKSkKICAgICAgICAgICAgICAgICAgKGluc2VydCAifCIgdGV4dCkpKSkKICAgICAg
ICAgICAgKGluc2VydCAifCIgIlxuIikpCiAgICAgICAgICAobGV0ICgodGVtcC1idWZmZXIgKGN1
cnJlbnQtYnVmZmVyKSkpCiAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHNvdXJjZS1i
dWZmZXIKICAgICAgICAgICAgICAocmVwbGFjZS1yZWdpb24tY29udGVudHMgYmVnIGVuZCB0ZW1w
LWJ1ZmZlcikpKSkpKQogICAgKHdoZW4gKG9yIChlcSBtYXJrZG93bi10cy10YWJsZS1hdXRvLWFs
aWduIHQpCiAgICAgICAgICAgICAgKG1lbXEgJ3RyYW5zcG9zZSBtYXJrZG93bi10cy10YWJsZS1h
dXRvLWFsaWduKSkKICAgICAgKG1hcmtkb3duLXRzLXRhYmxlLWFsaWduLXRhYmxlKSkpKQoKKGRl
ZnVuIG1hcmtkb3duLXRzLXRhYmxlLWNvbnZlcnQtY3N2LXJlZ2lvbiAoIGJlZyBlbmQKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25hbAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLWxpbmUgcmVwbGFj
ZSkKICAiQ29udmVydCB0aGUgY29tbWEtc2VwYXJhdGVkIHJlZ2lvbiBCRUcgdG8gRU5EIHRvIGEg
TWFya2Rvd24gdGFibGUuCklmIEhFQURFUi1MSU5FIGlzIG5vbi1uaWwsIHVzZSB0aGUgZmlyc3Qg
bGluZSBvZiB0aGUgcmVnaW9uIGFzIHRoZSB0YWJsZQpjb2x1bW4gaGVhZGVyLiAgSWYgbmlsLCBp
bmZlciB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYW5kIHN5bnRoZXNpemUKY29sdW1uIG5hbWVzIGZy
b20gdGhlIGZpcnN0IGxpbmUuCgpOb3RlOiBCb2R5IGNvbHVtbnMgYmV5b25kIHRoZSBwcm92aWRl
ZCBvciBpbmZlcnJlZCBudW1iZXIgb2YgY29sdW1ucyBhcmUKZHJvcHBlZC4KCklmIFJFUExBQ0Ug
aXMgbm9uLW5pbCwgb3ZlcndyaXRlIHRoZSByZWdpb24gQkVHIEVORCB3aXRoIHRoZSBNYXJrZG93
bgp0YWJsZSwgb3RoZXJ3aXNlIGluc2VydCB0aGUgdGFibGUgYWZ0ZXIgRU5ELgoKV2l0aCBhIHNp
bmdsZSBwcmVmaXggYXJndW1lbnQsIEhFQURFUi1MSU5FIGlzIG5vbi1uaWwuCldpdGggYSBkb3Vi
bGUgcHJlZml4IGFyZ3VtZW50LCBSRVBMQUNFIGlzIG5vbi1uaWwuCldpdGggYSB0cmlwbGUgcHJl
Zml4IGFyZ3VtZW50LCBib3RoIGFyZSBub24tbmlsLiIKICAoaW50ZXJhY3RpdmUgIlIiKQogICht
YXJrZG93bi10cy10YWJsZS1jb252ZXJ0LXJlZ2lvbiBiZWcgZW5kIGhlYWRlci1saW5lIHJlcGxh
Y2UgJ2NzdikpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtY29udmVydC10c3YtcmVnaW9uICgg
YmVnIGVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9w
dGlvbmFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFk
ZXItbGluZSByZXBsYWNlKQogICJDb252ZXJ0IHRoZSB0YWItc2VwYXJhdGVkIHJlZ2lvbiBCRUcg
dG8gRU5EIHRvIGEgTWFya2Rvd24gdGFibGUuCklmIEhFQURFUi1MSU5FIGlzIG5vbi1uaWwsIHVz
ZSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgcmVnaW9uIGFzIHRoZSB0YWJsZQpjb2x1bW4gaGVhZGVy
LiAgSWYgbmlsLCBpbmZlciB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYW5kIHN5bnRoZXNpemUKY29s
dW1uIG5hbWVzIGZyb20gdGhlIGZpcnN0IGxpbmUuCgpOb3RlOiBCb2R5IGNvbHVtbnMgYmV5b25k
IHRoZSBwcm92aWRlZCBvciBpbmZlcnJlZCBudW1iZXIgb2YgY29sdW1ucyBhcmUKZHJvcHBlZC4K
CklmIFJFUExBQ0UgaXMgbm9uLW5pbCwgb3ZlcndyaXRlIHRoZSByZWdpb24gQkVHIEVORCB3aXRo
IHRoZSBNYXJrZG93bgp0YWJsZSwgb3RoZXJ3aXNlIGluc2VydCB0aGUgdGFibGUgYWZ0ZXIgRU5E
LgoKV2l0aCBhIHNpbmdsZSBwcmVmaXggYXJndW1lbnQsIEhFQURFUi1MSU5FIGlzIG5vbi1uaWwu
CldpdGggYSBkb3VibGUgcHJlZml4IGFyZ3VtZW50LCBSRVBMQUNFIGlzIG5vbi1uaWwuCldpdGgg
YSB0cmlwbGUgcHJlZml4IGFyZ3VtZW50LCBib3RoIGFyZSBub24tbmlsLiIKICAoaW50ZXJhY3Rp
dmUgIlIiKQogIChtYXJrZG93bi10cy10YWJsZS1jb252ZXJ0LXJlZ2lvbiBiZWcgZW5kIGhlYWRl
ci1saW5lIHJlcGxhY2UgJ3RzdikpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtY29udmVydC1y
ZWdpb24gKCBiZWcgZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICZvcHRpb25hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFk
ZXItbGluZSByZXBsYWNlIGZvcm1hdCkKICAiQ29udmVydCB0aGUgY29tbWEtc2VwYXJhdGVkIHJl
Z2lvbiBCRUcgdG8gRU5EIHRvIGEgTWFya2Rvd24gdGFibGUuCklmIEhFQURFUi1MSU5FIGlzIG5v
bi1uaWwsIHVzZSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgcmVnaW9uIGFzIHRoZSB0YWJsZQpjb2x1
bW4gaGVhZGVyLiAgSWYgbmlsLCBpbmZlciB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYW5kIHN5bnRo
ZXNpemUKY29sdW1uIG5hbWVzIGZyb20gdGhlIGZpcnN0IGxpbmUuCgpOb3RlOiBCb2R5IGNvbHVt
bnMgYmV5b25kIHRoZSBwcm92aWRlZCBvciBpbmZlcnJlZCBudW1iZXIgb2YgY29sdW1ucyBhcmUK
ZHJvcHBlZC4KCklmIFJFUExBQ0UgaXMgbm9uLW5pbCwgb3ZlcndyaXRlIHRoZSByZWdpb24gQkVH
IEVORCB3aXRoIHRoZSBNYXJrZG93bgp0YWJsZSwgb3RoZXJ3aXNlIGluc2VydCB0aGUgdGFibGUg
YWZ0ZXIgRU5ELgoKRk9STUFUIGlzIG9uZSBvZiB0aGUgc3ltYm9scyBgY3N2JyBmb3IgY29tbWEt
c2VwYXJhdGVkIHZhbHVlcywgb3IgYHRzdicKZm9yIHRhYi1zZXBhcmF0ZWQgdmFsdWVzLiAgSWYg
YW55IG90aGVyIHZhbHVlLCB1c2UgYGNzdicuCgpXaXRoIGEgc2luZ2xlIHByZWZpeCBhcmd1bWVu
dCwgSEVBREVSLUxJTkUgaXMgbm9uLW5pbC4KV2l0aCBhIGRvdWJsZSBwcmVmaXggYXJndW1lbnQs
IFJFUExBQ0UgaXMgbm9uLW5pbC4KV2l0aCBhIHRyaXBsZSBwcmVmaXggYXJndW1lbnQsIGJvdGgg
YXJlIG5vbi1uaWwuIgogIChpbnRlcmFjdGl2ZSAiUiIpCiAgKG1hcmtkb3duLXRzLS1iYXJmLWlm
LW5vdC1tb2RlICdtYXJrZG93bi10cy10YWJsZS1jb252ZXJ0LXJlZ2lvbikKCiAgKGNvbmQgKChl
cXVhbCBjdXJyZW50LXByZWZpeC1hcmcgJyg0KSkKICAgICAgICAgKHNldHEgaGVhZGVyLWxpbmUg
dCkpCiAgICAgICAgKChlcXVhbCBjdXJyZW50LXByZWZpeC1hcmcgJygxNikpCiAgICAgICAgIChz
ZXRxIHJlcGxhY2UgdCkpCiAgICAgICAgKChlcXVhbCBjdXJyZW50LXByZWZpeC1hcmcgJyg2NCkp
CiAgICAgICAgIChzZXRxIGhlYWRlci1saW5lIHQKICAgICAgICAgICAgICAgcmVwbGFjZSB0KSkp
CiAgKGxldCAocm93cykKICAgIChzYXZlLXJlc3RyaWN0aW9uCiAgICAgIChuYXJyb3ctdG8tcmVn
aW9uIGJlZyBlbmQpCiAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCiAgICAgICh3aGlsZSAo
PCAocG9pbnQpIChwb2ludC1tYXgpKQogICAgICAgIChwY2FzZSBmb3JtYXQKICAgICAgICAgICgn
dHN2CiAgICAgICAgICAgICAocHVzaAogICAgICAgICAgICAgIChzcGxpdC1zdHJpbmcKICAgICAg
ICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmctbm8tcHJvcGVydGllcyAocG9pbnQpIChwb3MtZW9s
KSkgIlx0IikKICAgICAgICAgICAgICByb3dzKSkKICAgICAgICAgICAoXwogICAgICAgICAgICAo
bGV0IChyb3cpCiAgICAgICAgICAgICAgKHdoaWxlIChyZS1zZWFyY2gtZm9yd2FyZAogICAgICAg
ICAgICAgICAgICAgICAgIlwiXFwoPzpbXlwiXVxcfFwiXCJcXCkqXCJcXHxbXixdK1xcfFwiXCIi
CiAgICAgICAgICAgICAgICAgICAgICAocG9zLWVvbCkgdCkKICAgICAgICAgICAgICAgIChwdXNo
CiAgICAgICAgICAgICAgICAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwogICAgICAgICAgICAg
ICAgICAiXCJcIiIgIlwiIgogICAgICAgICAgICAgICAgICAocmVwbGFjZS1yZWdleHAtaW4tc3Ry
aW5nCiAgICAgICAgICAgICAgICAgICAiXFxgXCJcXChcLipcXClcIlxcJyIKICAgICAgICAgICAg
ICAgICAgICJcXDEiCiAgICAgICAgICAgICAgICAgICAoc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMg
KG1hdGNoLXN0cmluZyAwKSkpKQogICAgICAgICAgICAgICAgIHJvdykpCiAgICAgICAgICAgICAg
KHB1c2ggKG5yZXZlcnNlIHJvdykgcm93cykpKSkKICAgICAgICAoZm9yd2FyZC1saW5lIDEpKQog
ICAgICAgIChzZXRxIHJvd3MgKG5yZXZlcnNlIHJvd3MpKQogICAgICAgIChjb25kIChyZXBsYWNl
IChkZWxldGUtcmVnaW9uIGJlZyBlbmQpKQogICAgICAgICAgICAgICh0IChnb3RvLWNoYXIgZW5k
KSkpCiAgICAgICAgKGlmIGhlYWRlci1saW5lCiAgICAgICAgICAgIChtYXJrZG93bi10cy10YWJs
ZS1pbnNlcnQtdGFibGUgKDEtIChsZW5ndGggcm93cykpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCAoY2FyIHJvd3MpKQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgcm93cykKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIHJvd3MpKQogICAgICAgICAgKG1hcmtkb3du
LXRzLXRhYmxlLWluc2VydC10YWJsZSAobGVuZ3RoIHJvd3MpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKGNhciByb3dzKSkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJvd3MpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWV4cG9y
dC10YWJsZS1jc3YgKCZvcHRpb25hbCBkaXNwbGF5KQogICJFeHBvcnQgdGhlIE1hcmtkb3duIHRh
YmxlIGF0IHBvaW50IHRvIGNvbW1hLXNlcGFyYXRlZCBpbiBhIGJ1ZmZlci4KSWYgRElTUExBWSBp
cyBub24tbmlsLCBvciB3aXRoIGEgcHJlZml4IGFyZ3VtZW50LCBkaXNwbGF5IHRoZSBleHBvcnQK
YnVmZmVyIGFmdGVyIGV4cG9ydGluZy4KSWYgcG9pbnQgaXMgbm90IGF0IGEgdGFibGUsIGRvIG5v
dGhpbmcuIgogIChpbnRlcmFjdGl2ZSAiUCIpCiAgKG1hcmtkb3duLXRzLXRhYmxlLWV4cG9ydC10
YWJsZSBkaXNwbGF5ICdjc3YpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWV4cG9ydC10YWJs
ZS10c3YgKCZvcHRpb25hbCBkaXNwbGF5KQogICJFeHBvcnQgdGhlIE1hcmtkb3duIHRhYmxlIGF0
IHBvaW50IHRvIHRhYi1zZXBhcmF0ZWQgaW4gYSBidWZmZXIuCklmIERJU1BMQVkgaXMgbm9uLW5p
bCwgb3Igd2l0aCBhIHByZWZpeCBhcmd1bWVudCwgZGlzcGxheSB0aGUgZXhwb3J0CmJ1ZmZlciBh
ZnRlciBleHBvcnRpbmcuCklmIHBvaW50IGlzIG5vdCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIK
ICAoaW50ZXJhY3RpdmUgIlAiKQogIChtYXJrZG93bi10cy10YWJsZS1leHBvcnQtdGFibGUgZGlz
cGxheSAndHN2KSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1leHBvcnQtdGFibGUgKCZvcHRp
b25hbCBkaXNwbGF5IGZvcm1hdCkKICAiRXhwb3J0IHRoZSBNYXJrZG93biB0YWJsZSBhdCBwb2lu
dCB0byBDU1YgaW4gYSBidWZmZXIuCklmIERJU1BMQVkgaXMgbm9uLW5pbCwgb3Igd2l0aCBhIHBy
ZWZpeCBhcmd1bWVudCwgZGlzcGxheSB0aGUgZXhwb3J0CmJ1ZmZlciBhZnRlciBleHBvcnRpbmcu
CkZPUk1BVCBpcyBvbmUgb2YgdGhlIHN5bWJvbHMgYGNzdicgZm9yIGNvbW1hLXNlcGFyYXRlZCB2
YWx1ZXMgYWthIENTViwKb3IgYHRzdicgZm9yIHRhYi1zZXBhcmF0ZWQgdmFsdWVzIGFrYSBUU1Yu
ICBJZiBhbnkgb3RoZXIgdmFsdWUsIHVzZQpgY3N2Jy4gIElmIFRTViwgcmVwbGFjZSBhbnkgdGFi
cyB3aXRoaW4gYSBmaWVsZCB3aXRoIGEgc3BhY2UuCkRvIG5vdCBleHBvcnQgdGhlIHRhYmxlJ3Mg
aGVhZGVyIGRlbGltaXRlciByb3cuCklmIHBvaW50IGlzIG5vdCBhdCBhIHRhYmxlLCBkbyBub3Ro
aW5nLiIKICAoaW50ZXJhY3RpdmUgIlAiKQogIChtYXJrZG93bi10cy0tYmFyZi1pZi1ub3QtbW9k
ZSAnbWFya2Rvd24tdHMtdGFibGUtZXhwb3J0LXRhYmxlKQogICh3aGVuLWxldCogKChhdC10YWJs
ZSAobWFya2Rvd24tdHMtYXQtdGFibGUtcCBuaWwgdCkpCiAgICAgICAgICAgICAgKHRhYmxlIChj
ZHIgYXQtdGFibGUpKQogICAgICAgICAgICAgIChyb3dzICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4g
dGFibGUgJ25hbWVkKSkKICAgICAgICAgICAgICAoaGVhZGVyICh0cmVlc2l0LXNlYXJjaC1zdWJ0
cmVlIHRhYmxlICJcXGBwaXBlX3RhYmxlX2hlYWRlclxcJyIpKQogICAgICAgICAgICAgIChkZWxp
bWl0ZXItcm93ICh0cmVlc2l0LXNlYXJjaC1zdWJ0cmVlCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRhYmxlICJcXGBwaXBlX3RhYmxlX2RlbGltaXRlcl9yb3dcXCciKSkKICAgICAgICAg
ICAgICAoZXhwb3J0LWJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbWFya2Rvd24tdHMtdGFibGUtZXhwb3J0LWJ1ZmZlcikpKQogICAgKHdpdGgt
Y3VycmVudC1idWZmZXIgZXhwb3J0LWJ1ZmZlcgogICAgICAoc3BlY2lhbC1tb2RlKQogICAgICAo
bGV0ICgoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCiAgICAgICAgKHdpZGVuKQogICAgICAgIChlcmFz
ZS1idWZmZXIpCiAgICAgICAgKGRvbGlzdCAocm93IHJvd3MpCiAgICAgICAgICAodW5sZXNzIChl
cXVhbCByb3cgZGVsaW1pdGVyLXJvdykKICAgICAgICAgICAgKGxldCogKChlbHRzICh0cmVlc2l0
LW5vZGUtY2hpbGRyZW4gcm93ICduYW1lZCkpCiAgICAgICAgICAgICAgICAgICAobGVuIChsZW5n
dGggZWx0cykpKQogICAgICAgICAgICAgIChkb3RpbWVzICh4IGxlbikKICAgICAgICAgICAgICAg
IChsZXQgKChzIChzdHJpbmctdHJpbSAodHJlZXNpdC1ub2RlLXRleHQgKG50aCB4IGVsdHMpCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdu
by1wcm9wZXJ0eSkpKSkKICAgICAgICAgICAgICAgICAgKHBjYXNlIGZvcm1hdAogICAgICAgICAg
ICAgICAgICAgICgndHN2CiAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQgKHJlcGxhY2UtcmVn
ZXhwLWluLXN0cmluZyAiXHQiICJccyIgcykpCiAgICAgICAgICAgICAgICAgICAgICh3aGVuICg8
IHggKDEtIGxlbikpCiAgICAgICAgICAgICAgICAgICAgICAgKGluc2VydCAiXHQiKSkpCiAgICAg
ICAgICAgICAgICAgICAgKF8KICAgICAgICAgICAgICAgICAgICAgKGluc2VydAogICAgICAgICAg
ICAgICAgICAgICAgKGlmIChzdHJpbmctbWF0Y2ggIltcIixdIiBzKQogICAgICAgICAgICAgICAg
ICAgICAgICAgIChjb25jYXQgIlwiIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KG1hcGNvbmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZGVudGl0eSAo
c3BsaXQtc3RyaW5nIHMgIlwiIikgIlwiXCIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIlwiIikKICAgICAgICAgICAgICAgICAgICAgICAgcykpCiAgICAgICAgICAgICAgICAg
ICAgICh3aGVuICg8IHggKDEtIGxlbikpCiAgICAgICAgICAgICAgICAgICAgICAgKGluc2VydCAi
LCIpKSkpKSkKICAgICAgICAgICAgICAoaW5zZXJ0ICJcbiIpKSkpCiAgICAgICAgKGdvdG8tY2hh
ciAocG9pbnQtbWluKSkpKQogICAgKHdoZW4gZGlzcGxheQogICAgICAoZGlzcGxheS1idWZmZXIg
ZXhwb3J0LWJ1ZmZlcikpKSkKCjs7OyBIZWxwZXJzOgoKKGRlZnVuIG1hcmtkb3duLXRzLS1vdXRs
aW5lLWludmlzaWJsZS1wIChwb3MpCiAgIlJldHVybiBub24tbmlsIGlmIFBPUyBpcyBpbnNpZGUg
YW4gb3V0bGluZS1mb2xkZWQgcmVnaW9uLiIKICAoY2wtc29tZSAobGFtYmRhIChvdikgKGVxIChv
dmVybGF5LWdldCBvdiAnaW52aXNpYmxlKSAnb3V0bGluZSkpCiAgICAgICAgICAgKG92ZXJsYXlz
LWF0IHBvcykpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1yYW5nZS1zZXR0aW5ncyAoKQogICJSZXR1
cm4gcmFuZ2Ugc2V0dGluZ3MgZm9yIGBtYXJrZG93bi10cy1tb2RlJy4iCiAgKGFwcGx5CiAgICMn
dHJlZXNpdC1yYW5nZS1ydWxlcwogICBgKCA6ZW1iZWQgbWFya2Rvd24taW5saW5lCiAgICAgIDpo
b3N0IG1hcmtkb3duCiAgICAgIDpsb2NhbCB0CiAgICAgKChpbmxpbmUpIEBtYXJrZG93bi1pbmxp
bmUpCiAgICAgLEAod2hlbiBtYXJrZG93bi10cy1mb250aWZ5LWNvZGUtYmxvY2tzLW5hdGl2ZWx5
CiAgICAgICAgICcoIDplbWJlZCBtYXJrZG93bi10cy0tY29kZS1ibG9jay10cy1sYW5ndWFnZQog
ICAgICAgICAgICA6aG9zdCBtYXJrZG93bgogICAgICAgICAgICA6bG9jYWwgdAogICAgICAgICAg
ICAoKGZlbmNlZF9jb2RlX2Jsb2NrIChpbmZvX3N0cmluZyAobGFuZ3VhZ2UpIEBsYW5ndWFnZSkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29kZV9mZW5jZV9jb250ZW50KSBAY29u
dGVudCkpKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tcmVtb3ZlLWltYWdlLW92ZXJsYXlzICgp
CiAgIlJlbW92ZSBhbGwgaW5saW5lIGltYWdlIG92ZXJsYXlzIGZyb20gdGhlIGN1cnJlbnQgYnVm
ZmVyLiIKICAoZG9saXN0IChvdiAob3ZlcmxheXMtaW4gKHBvaW50LW1pbikgKHBvaW50LW1heCkp
KQogICAgKHdoZW4gKG92ZXJsYXktZ2V0IG92ICdtYXJrZG93bi10cy1pbWFnZSkKICAgICAgKGRl
bGV0ZS1vdmVybGF5IG92KSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1vdXRsaW5lLXZpZXctY2hh
bmdlICgpCiAgIlVwZGF0ZSBpbWFnZSBvdmVybGF5cyBhZnRlciBvdXRsaW5lIGZvbGQvdW5mb2xk
LgpSZW1vdmVzIGltYWdlIG92ZXJsYXlzIGluIGZvbGRlZCByZWdpb25zIGFuZCB0cmlnZ2Vycwpy
ZWZvbnRpZmljYXRpb24gc28gdGhhdCBpbWFnZXMgaW4gdW5mb2xkZWQgcmVnaW9ucyBhcmUgcmVj
cmVhdGVkLiIKICAod2hlbiBtYXJrZG93bi10cy1pbmxpbmUtaW1hZ2VzCiAgICAobWFya2Rvd24t
dHMtLXJlbW92ZS1pbWFnZS1vdmVybGF5cykKICAgIChmb250LWxvY2stZmx1c2gpKSkKCihkZWZ1
biBtYXJrZG93bi10cy0tc2V0LWhpZGUtbWFya3VwICh2YWx1ZSkKICAiU2V0IGhpZGluZyBvZiBN
YXJrZG93biBtYXJrdXAgZGVsaW1pdGVycyBpbiB0aGUgY3VycmVudCBidWZmZXIuClZBTFVFIG5v
bi1uaWwgaGlkZXMgbWFya3VwLCBuaWwgc2hvd3MgaXQuIgogIChpZiB2YWx1ZQogICAgICAoYWRk
LXRvLWludmlzaWJpbGl0eS1zcGVjICdtYXJrZG93bi10cy0tbWFya3VwKQogICAgKHJlbW92ZS1m
cm9tLWludmlzaWJpbGl0eS1zcGVjICdtYXJrZG93bi10cy0tbWFya3VwKSkKICAod2hlbiBtYXJr
ZG93bi10cy1pbmxpbmUtaW1hZ2VzCiAgICAobWFya2Rvd24tdHMtLXJlbW92ZS1pbWFnZS1vdmVy
bGF5cykpCiAgKGZvbnQtbG9jay1mbHVzaCkpCgooZGVmdW4gbWFya2Rvd24tdHMtdG9nZ2xlLWhp
ZGUtbWFya3VwICgpCiAgIlRvZ2dsZSBoaWRpbmcgb2YgTWFya2Rvd24gbWFya3VwIGRlbGltaXRl
cnMgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiIKICAoaW50ZXJhY3RpdmUpCiAgKHNldHEgbWFya2Rv
d24tdHMtaGlkZS1tYXJrdXAgKG5vdCBtYXJrZG93bi10cy1oaWRlLW1hcmt1cCkpCiAgKG1hcmtk
b3duLXRzLS1zZXQtaGlkZS1tYXJrdXAgbWFya2Rvd24tdHMtaGlkZS1tYXJrdXApKQoKKGRlZnVu
IG1hcmtkb3duLXRzLS1zZXQtaW5saW5lLWltYWdlcyAodmFsdWUpCiAgIlNldCBkaXNwbGF5IG9m
IGlubGluZSBpbWFnZXMgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgpWQUxVRSBub24tbmlsIGRpc3Bs
YXlzIGltYWdlcywgbmlsIHJlbW92ZXMgdGhlbS4iCiAgKGlmIHZhbHVlCiAgICAgICh0cmVlc2l0
LWZvbnQtbG9jay1yZWNvbXB1dGUtZmVhdHVyZXMgJyhpbWFnZS1wcmV2aWV3KSkKICAgICh0cmVl
c2l0LWZvbnQtbG9jay1yZWNvbXB1dGUtZmVhdHVyZXMgbmlsICcoaW1hZ2UtcHJldmlldykpKQog
IChtYXJrZG93bi10cy0tcmVtb3ZlLWltYWdlLW92ZXJsYXlzKQogIChmb250LWxvY2stZmx1c2gp
KQoKKGRlZnVuIG1hcmtkb3duLXRzLXRvZ2dsZS1pbmxpbmUtaW1hZ2VzICgpCiAgIlRvZ2dsZSBk
aXNwbGF5IG9mIGlubGluZSBpbWFnZXMgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiIKICAoaW50ZXJh
Y3RpdmUpCiAgKHNldHEgbWFya2Rvd24tdHMtaW5saW5lLWltYWdlcyAobm90IG1hcmtkb3duLXRz
LWlubGluZS1pbWFnZXMpKQogIChtYXJrZG93bi10cy0tc2V0LWlubGluZS1pbWFnZXMgbWFya2Rv
d24tdHMtaW5saW5lLWltYWdlcykKICAobWVzc2FnZSAiSW5saW5lIGltYWdlcyAlcyIgKGlmIG1h
cmtkb3duLXRzLWlubGluZS1pbWFnZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJlbmFibGVkIiAiZGlzYWJsZWQiKSkpCgo7OzsgRW1waGFzaXM6CgooZGVmdmFyIG1hcmtkb3du
LXRzLWVtcGhhc2lzLWFsaXN0CiAgJygoP2IgLiAiKioiKQogICAgKD9CIC4gIl9fIikKICAgICg/
aSAuICIqIikKICAgICg/SSAuICJfIikKICAgICg/cyAuICJ+fiIpCiAgICAoP2MgLiAiYCIpCiAg
ICAoP2EgLiAiKioqIikpCiAgIkFsaXN0IG9mIGVtcGhhc2lzIG1hcmtlcnMgZm9yIGBtYXJrZG93
bi10cy1lbXBoYXNpemUnLgpFYWNoIGVudHJ5IGlzIChLRVkgLiBNQVJLRVIpIHdoZXJlIEtFWSBp
cyBhIGNoYXJhY3RlciAobm90IGEgc3RyaW5nKSBhbmQKTUFSS0VSIGlzIHRoZSBNYXJrZG93biBl
bXBoYXNpemVkIHRleHQgcHJlZml4L3N1ZmZpeC4iKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1lbXBo
YXNpcy1ub2RlLWF0LXBvaW50ICgpCiAgIlJldHVybiB0aGUgZW1waGFzaXMgbm9kZSBhdCBwb2lu
dCwgb3IgbmlsLgpGaW5kcyB0aGUgaW5uZXJtb3N0IGBlbXBoYXNpcycsIGBzdHJvbmdfZW1waGFz
aXMnLApgc3RyaWtldGhyb3VnaCcsIG9yIGBjb2RlX3NwYW4nIG5vZGUuIgogICh3aGVuLWxldCog
KChub2RlICh0cmVlc2l0LW5vZGUtYXQgKHBvaW50KSAnbWFya2Rvd24taW5saW5lKSkpCiAgICAo
dHJlZXNpdC1wYXJlbnQtdW50aWwKICAgICBub2RlIChsYW1iZGEgKG4pCiAgICAgICAgICAgICht
ZW1iZXIgKHRyZWVzaXQtbm9kZS10eXBlIG4pCiAgICAgICAgICAgICAgICAgICAgJygiZW1waGFz
aXMiICJzdHJvbmdfZW1waGFzaXMiCiAgICAgICAgICAgICAgICAgICAgICAic3RyaWtldGhyb3Vn
aCIgImNvZGVfc3BhbiIpKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy1yZW1vdmUtZW1waGFzaXMg
KCkKICAiUmVtb3ZlIGVtcGhhc2lzIGFyb3VuZCBwb2ludCBvciByZWdpb24uCldpdGggYW4gYWN0
aXZlIHJlZ2lvbiwgc3RyaXAgdGhlIG91dGVybW9zdCBlbXBoYXNpcyBtYXJrZXJzIGZyb20KdGhl
IHNlbGVjdGVkIHRleHQuICBXaXRob3V0IGEgcmVnaW9uLCBmaW5kIHRoZSBlbXBoYXNpcyBub2Rl
IGF0CnBvaW50IHVzaW5nIHRyZWUtc2l0dGVyIGFuZCByZW1vdmUgaXRzIG1hcmtlcnMuIgogIChp
bnRlcmFjdGl2ZSkKICAoaWYgKHVzZS1yZWdpb24tcCkKICAgICAgKGxldCogKChiZWcgKHJlZ2lv
bi1iZWdpbm5pbmcpKQogICAgICAgICAgICAgKGVuZCAocmVnaW9uLWVuZCkpCiAgICAgICAgICAg
ICAodGV4dCAoYnVmZmVyLXN1YnN0cmluZyBiZWcgZW5kKSkKICAgICAgICAgICAgIChzdHJpcHBl
ZCBuaWwpKQogICAgICAgIChjbC1sb29wIGZvciAoX2tleSAuIG0pIGluIChzb3J0IChjb3B5LXNl
cXVlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtkb3du
LXRzLWVtcGhhc2lzLWFsaXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChsYW1iZGEgKGEgYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICg+IChsZW5ndGggKGNkciBhKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChsZW5ndGggKGNkciBiKSkpKSkKICAgICAgICAgICAgICAgICBmb3IgcmUg
PSAoY29uY2F0ICJcXGAiIChyZWdleHAtcXVvdGUgbSkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJcXChcXCg/Oi5cXHxcblxcKSpcXCkiCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAocmVnZXhwLXF1b3RlIG0pICJcXCciKQogICAgICAgICAgICAgICAgIHdoZW4g
KHN0cmluZy1tYXRjaCByZSB0ZXh0KQogICAgICAgICAgICAgICAgIGRvIChzZXRxIHN0cmlwcGVk
IChtYXRjaC1zdHJpbmcgMSB0ZXh0KSkKICAgICAgICAgICAgICAgICBhbmQgcmV0dXJuIG5pbCkK
ICAgICAgICAod2hlbiBzdHJpcHBlZAogICAgICAgICAgKGRlbGV0ZS1yZWdpb24gYmVnIGVuZCkK
ICAgICAgICAgIChpbnNlcnQgc3RyaXBwZWQpKSkKICAgIDs7IEZpbmQgdGhlIG91dGVybW9zdCBl
bXBoYXNpcyBub2RlIGF0IHBvaW50LgogICAgKHdoZW4tbGV0KiAoKGlubmVyIChtYXJrZG93bi10
cy0tZW1waGFzaXMtbm9kZS1hdC1wb2ludCkpCiAgICAgICAgICAgICAgICAobm9kZSAobGV0ICgo
biBpbm5lcikpCiAgICAgICAgICAgICAgICAgICAgICAgICh3aGlsZSAobGV0ICgocGFyZW50ICh0
cmVlc2l0LW5vZGUtcGFyZW50IG4pKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KHdoZW4gKGFuZCBwYXJlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAobWVtYmVyICh0cmVlc2l0LW5vZGUtdHlwZSBwYXJlbnQpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKCJlbXBoYXNpcyIKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cm9uZ19lbXBo
YXNpcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgInN0cmlrZXRocm91Z2giCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJjb2RlX3NwYW4iKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKHNldHEgbiBwYXJlbnQpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIG4pKQog
ICAgICAgICAgICAgICAgKHN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAgICAg
ICAgICAgICAoZW5kICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAgICAgICAgICAgKHRl
eHQgKHRyZWVzaXQtbm9kZS10ZXh0IG5vZGUgdCkpCiAgICAgICAgICAgICAgICAodHlwZSAodHJl
ZXNpdC1ub2RlLXR5cGUgbm9kZSkpCiAgICAgICAgICAgICAgICAobWxlbiAocGNhc2UgdHlwZQog
ICAgICAgICAgICAgICAgICAgICAgICAoInN0cm9uZ19lbXBoYXNpcyIKICAgICAgICAgICAgICAg
ICAgICAgICAgIChpZiAoc3RyaW5nLXByZWZpeC1wICJfIiB0ZXh0KSAyIDIpKQogICAgICAgICAg
ICAgICAgICAgICAgICAoImVtcGhhc2lzIgogICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChz
dHJpbmctcHJlZml4LXAgIl8iIHRleHQpIDEgMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICgi
c3RyaWtldGhyb3VnaCIgMikKICAgICAgICAgICAgICAgICAgICAgICAgKCJjb2RlX3NwYW4iIDEp
KSkKICAgICAgICAgICAgICAgIChpbm5lci10ZXh0IChzdWJzdHJpbmcgdGV4dCBtbGVuICgtIChs
ZW5ndGggdGV4dCkgbWxlbikpKSkKICAgICAgKGxldCAoKG9mZnNldCAoLSAocG9pbnQpIHN0YXJ0
IG1sZW4pKSkKICAgICAgICAoZGVsZXRlLXJlZ2lvbiBzdGFydCBlbmQpCiAgICAgICAgKGdvdG8t
Y2hhciBzdGFydCkKICAgICAgICAoaW5zZXJ0IGlubmVyLXRleHQpCiAgICAgICAgKGdvdG8tY2hh
ciAoKyBzdGFydCAobWF4IDAgb2Zmc2V0KSkpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLWVtcGhh
c2l6ZSAoJm9wdGlvbmFsIGNoYXIpCiAgIkluc2VydCBvciBjaGFuZ2UgZW1waGFzaXMgb24gdGV4
dC4KSWYgdGhlcmUgaXMgYW4gYWN0aXZlIHJlZ2lvbiwgd3JhcCBpdCB3aXRoIGVtcGhhc2lzIG1h
cmtlcnMuCklmIHRoZXJlIGlzIG5vIHJlZ2lvbiwgaW5zZXJ0IG1hcmtlciBwYWlycyBhbmQgcGxh
Y2UgcG9pbnQgYmV0d2Vlbgp0aGVtLiAgQ0hBUiBzZWxlY3RzIHRoZSBlbXBoYXNpcyB0eXBlOgoK
ICBiICAgKipib2xkKiogICAgICAgQiAgX19ib2xkX18KICBpICAgKml0YWxpYyogICAgICAgSSAg
X2l0YWxpY18KICBhICAgKioqYm9sZCtpdGFsaWMqKioKICBzICAgfn5zdHJpa2V0aHJvdWdofn4K
ICBjICAgYGNvZGVgCiAgU1BDIHJlbW92ZSBlbXBoYXNpcyBhdCBwb2ludCBvciByZWdpb24iCiAg
KGludGVyYWN0aXZlCiAgICJjRW1waGFzaXMgW2Jdb2xkIFtCXW9sZF8gW2lddGFsaWMgW0lddGFs
aWNfIFthXWxsIFtzXXRyaWtlIFtjXW9kZSBTUEMgcmVtb3ZlOiIpCiAgKGlmIChlcSBjaGFyID9c
cykKICAgICAgKG1hcmtkb3duLXRzLXJlbW92ZS1lbXBoYXNpcykKICAgIChpZi1sZXQqICgobWFy
a2VyIChjZHIgKGFzc3EgY2hhciBtYXJrZG93bi10cy1lbXBoYXNpcy1hbGlzdCkpKSkKICAgICAg
ICAoaWYgKHVzZS1yZWdpb24tcCkKICAgICAgICAgICAgKGxldCAoKGJlZyAocmVnaW9uLWJlZ2lu
bmluZykpCiAgICAgICAgICAgICAgICAgIChlbmQgKGNvcHktbWFya2VyIChyZWdpb24tZW5kKSkp
KQogICAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgKGdvdG8tY2hh
ciBlbmQpCiAgICAgICAgICAgICAgICAoaW5zZXJ0IG1hcmtlcikKICAgICAgICAgICAgICAgIChn
b3RvLWNoYXIgYmVnKQogICAgICAgICAgICAgICAgKGluc2VydCBtYXJrZXIpKSkKICAgICAgICAg
IChpZi1sZXQqICgoYm91bmRzIChib3VuZHMtb2YtdGhpbmctYXQtcG9pbnQgJ3dvcmQpKSkKICAg
ICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKGNk
ciBib3VuZHMpKQogICAgICAgICAgICAgICAgKGluc2VydCBtYXJrZXIpCiAgICAgICAgICAgICAg
ICAoZ290by1jaGFyIChjYXIgYm91bmRzKSkKICAgICAgICAgICAgICAgIChpbnNlcnQgbWFya2Vy
KSkKICAgICAgICAgICAgKGluc2VydCBtYXJrZXIgbWFya2VyKQogICAgICAgICAgICAoYmFja3dh
cmQtY2hhciAobGVuZ3RoIG1hcmtlcikpKSkKICAgICAgKHVzZXItZXJyb3IgIk5vIHN1Y2ggZW1w
aGFzaXMgbWFya2VyOiAlYyIgY2hhcikpKSkKCjs7OyBCbG9jayBzdHJ1Y3R1cmU6CgooZGVmdW4g
bWFya2Rvd24tdHMtaW5zZXJ0LXN0cnVjdHVyZSAoJm9wdGlvbmFsIGNoYXIpCiAgIkluc2VydCBh
IGJsb2NrIHN0cnVjdHVyZS4KSWYgdGhlcmUgaXMgYW4gYWN0aXZlIHJlZ2lvbiwgd3JhcCBpdC4g
IE90aGVyd2lzZSwgaW5zZXJ0IGFuIGVtcHR5CmJsb2NrIGFuZCBwbGFjZSBwb2ludCBpbnNpZGUu
ICBDSEFSIHNlbGVjdHMgdGhlIHN0cnVjdHVyZSB0eXBlOgoKICBgICBmZW5jZWQgY29kZSBibG9j
ayAoYGBgKQogIH4gIHRpbGRlIGZlbmNlZCBjb2RlIGJsb2NrICh+fn4pCiAgcSAgYmxvY2sgcXVv
dGUgKD4gKQogIGQgIGhvcml6b250YWwgZGl2aWRlci9ydWxlICgtLS0pCiAgdCAgdGFibGUiCiAg
KGludGVyYWN0aXZlCiAgICJjU3RydWN0dXJlIFtgXWJhY2stdGljayBjb2RlIGJsb2NrIFt+XXRp
bGRlIGNvZGUgYmxvY2sgW3FddW90ZSBbZF1pdmlkZXIgW3RdYWJsZToiKQogIChwY2FzZSBjaGFy
CiAgICAoP2AgKG1hcmtkb3duLXRzLS1pbnNlcnQtY29kZS1ibG9jayA/YCkpCiAgICAoP34gKG1h
cmtkb3duLXRzLS1pbnNlcnQtY29kZS1ibG9jayA/fikpCiAgICAoP3EgKG1hcmtkb3duLXRzLS1p
bnNlcnQtYmxvY2stcXVvdGUpKQogICAgKD9kIChtYXJrZG93bi10cy0taW5zZXJ0LWRpdmlkZXIp
KQogICAgKD90IChtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtdGFibGUpKQogICAgKF8gKHVzZXIt
ZXJyb3IgIk5vIHN1Y2ggc3RydWN0dXJlOiAlYyIgY2hhcikpKSkKCihkZWZ1biBtYXJrZG93bi10
cy0taW5zZXJ0LWNvZGUtYmxvY2sgKGNoYXIgJm9wdGlvbmFsIGxhbmd1YWdlKQogICJJbnNlcnQg
YSBmZW5jZWQgY29kZSBibG9jayB1c2luZyBhIENIQVIgc2VxdWVuY2UuCkNIQVIgc2hvdWxkIGJl
IG9uZSBvZiBhIGJhY2t0aWNrIG9yIGEgdGlsZGUuCkxBTkdVQUdFIGlzIGEgd2hpdGVzcGFjZSBm
cmVlIGxhbmd1YWdlIHN0cmluZy4iCiAgKHNldHEgbGFuZ3VhZ2UKICAgICAgICAob3IgbGFuZ3Vh
Z2UKICAgICAgICAgICAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwogICAgICAgICAgICAgIltb
OmJsYW5rOl1dIiAiIgogICAgICAgICAgICAgKGxldCAoKGNvbXBsZXRpb24taWdub3JlLWNhc2Ug
bmlsKQogICAgICAgICAgICAgICAgICAgKGNhbmRpZGF0ZXMKICAgICAgICAgICAgICAgICAgICAo
c2VxLW1hcAogICAgICAgICAgICAgICAgICAgICAjJ3N5bWJvbC1uYW1lCiAgICAgICAgICAgICAg
ICAgICAgIChzZXEtdW5pcQogICAgICAgICAgICAgICAgICAgICAgKGFwcGVuZCAobWFwY2FyICMn
Y2FyIG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLWxhbmd1YWdlcykKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKG1hcGNhciAjJ2NhciBtYXJrZG93bi10cy0tY29kZS1ibG9jay1ub24tdHMt
bW9kZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjYXIgIydjYXIgbWFya2Rv
d24tdHMtY29kZS1ibG9jay1tb2RlcykpKSkpKQogICAgICAgICAgICAgICAoY29tcGxldGluZy1y
ZWFkCiAgICAgICAgICAgICAgICAiQ29kZSBibG9jayBsYW5ndWFnZTogIgogICAgICAgICAgICAg
ICAgY2FuZGlkYXRlcwogICAgICAgICAgICAgICAgbmlsCiAgICAgICAgICAgICAgICAnY29uZmly
bSA7IFByb21wdCBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IG9uIG91ciBsaXN0LgogICAgICAgICAg
ICAgICAgbmlsCiAgICAgICAgICAgICAgICAnbWFya2Rvd24tdHMtbGFuZ3VhZ2UtaGlzdG9yeSkp
KSkpCiAgKGxldCAoKGZlbmNlLXN0cmluZyAobWFrZS1zdHJpbmcgMyBjaGFyKSkpCiAgICAoaWYg
KHVzZS1yZWdpb24tcCkKICAgICAgICAobGV0ICgoYmVnIChyZWdpb24tYmVnaW5uaW5nKSkKICAg
ICAgICAgICAgICAoZW5kIChyZWdpb24tZW5kKSkpCiAgICAgICAgICAoc2F2ZS1leGN1cnNpb24K
ICAgICAgICAgICAgKGdvdG8tY2hhciBlbmQpCiAgICAgICAgICAgICh1bmxlc3MgKGJvbHApIChp
bnNlcnQgIlxuIikpCiAgICAgICAgICAgIChpbnNlcnQgZmVuY2Utc3RyaW5nICJcbiIpCiAgICAg
ICAgICAgIChnb3RvLWNoYXIgYmVnKQogICAgICAgICAgICAoaW5zZXJ0IGZlbmNlLXN0cmluZyBs
YW5ndWFnZSAiXG4iKSkpCiAgICAgIChpbnNlcnQgZmVuY2Utc3RyaW5nIGxhbmd1YWdlICJcblxu
IiBmZW5jZS1zdHJpbmcpCiAgICAgIChmb3J3YXJkLWxpbmUgLTEpKSkpCgooZGVmdW4gbWFya2Rv
d24tdHMtLWluc2VydC1ibG9jay1xdW90ZSAoKQogICJJbnNlcnQgYSBibG9jayBxdW90ZS4iCiAg
KGlmICh1c2UtcmVnaW9uLXApCiAgICAgIChsZXQgKChiZWcgKHJlZ2lvbi1iZWdpbm5pbmcpKQog
ICAgICAgICAgICAoZW5kIChjb3B5LW1hcmtlciAocmVnaW9uLWVuZCkpKSkKICAgICAgICAoc2F2
ZS1leGN1cnNpb24KICAgICAgICAgIChnb3RvLWNoYXIgYmVnKQogICAgICAgICAgKHdoaWxlICg8
IChwb2ludCkgZW5kKQogICAgICAgICAgICAoaW5zZXJ0ICI+ICIpCiAgICAgICAgICAgIChmb3J3
YXJkLWxpbmUgMSkpKSkKICAgIChpbnNlcnQgIj4gIikpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1p
bnNlcnQtZGl2aWRlciAoKQogICJJbnNlcnQgYSBob3Jpem9udGFsIHJ1bGUuIgogICh1bmxlc3Mg
KGJvbHApIChpbnNlcnQgIlxuIikpCiAgKGluc2VydCAiXG4tLS1cblxuIikpCgooZGVmdW4gbWFy
a2Rvd24tdHMtLWFwcGx5LWVsbGlwc2lzICgpCiAgIkFwcGx5IGBtYXJrZG93bi10cy1lbGxpcHNp
cycgdG8gdGhlIGN1cnJlbnQgYnVmZmVyJ3MgZGlzcGxheSB0YWJsZS4iCiAgKGlmIChhbmQgKHN0
cmluZ3AgbWFya2Rvd24tdHMtZWxsaXBzaXMpCiAgICAgICAgICAgKG5vdCAoc3RyaW5nLWVtcHR5
LXAgbWFya2Rvd24tdHMtZWxsaXBzaXMpKSkKICAgICAgKGxldCAoKHRhYmxlIChvciBidWZmZXIt
ZGlzcGxheS10YWJsZQogICAgICAgICAgICAgICAgICAgICAgIChtYWtlLWRpc3BsYXktdGFibGUp
KSkpCiAgICAgICAgKHNldC1kaXNwbGF5LXRhYmxlLXNsb3QKICAgICAgICAgdGFibGUgNAogICAg
ICAgICAodmNvbmNhdCAobWFwY2FyIChsYW1iZGEgKGMpIChtYWtlLWdseXBoLWNvZGUgYyAnc2hh
ZG93KSkKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy1lbGxpcHNpcykpKQog
ICAgICAgIChzZXRxIGJ1ZmZlci1kaXNwbGF5LXRhYmxlIHRhYmxlKSkKICAgICh3aGVuIGJ1ZmZl
ci1kaXNwbGF5LXRhYmxlCiAgICAgIChzZXQtZGlzcGxheS10YWJsZS1zbG90IGJ1ZmZlci1kaXNw
bGF5LXRhYmxlIDQgbmlsKSkpKQoKOzs7IE1ham9yIG1vZGU6CgooZGVmdW4gbWFya2Rvd24tdHMt
b3V0bGluZS1jeWNsZSAoKQogICJDeWNsZSB2aXNpYmlsaXR5IG9mIHRoZSBoZWFkaW5nIGF0IHBv
aW50LgpPbiBhIGhlYWRpbmcsIGNhbGwgYG91dGxpbmUtY3ljbGUnLiAgT3RoZXJ3aXNlIGRvIG5v
dGhpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAod2hlbiAob3V0bGluZS1vbi1oZWFkaW5nLXApCiAg
ICAob3V0bGluZS1jeWNsZSkpKQoKKGRlZnZhci1rZXltYXAgbWFya2Rvd24tdHMtbW9kZS1tYXAK
ICA6ZG9jICJLZXltYXAgZm9yIGBtYXJrZG93bi10cy1tb2RlJy4iCiAgIk0tPGxlZnQ+IiAgICAj
J21hcmtkb3duLXRzLXByb21vdGUKICAiTS08cmlnaHQ+IiAgICMnbWFya2Rvd24tdHMtZGVtb3Rl
CiAgIk0tPHVwPiIgICAgICAjJ21hcmtkb3duLXRzLW1vdmUtc3VidHJlZS11cAogICJNLTxkb3du
PiIgICAgIydtYXJrZG93bi10cy1tb3ZlLXN1YnRyZWUtZG93bgogICJDLWMgQy1uIiAgICAgIydv
dXRsaW5lLW5leHQtaGVhZGluZwogICJDLWMgQy1wIiAgICAgIydvdXRsaW5lLXByZXZpb3VzLWhl
YWRpbmcKICAiQy1jIEMtdSIgICAgICMnb3V0bGluZS11cC1oZWFkaW5nCiAgIkMtYyBDLWYiICAg
ICAjJ291dGxpbmUtZm9yd2FyZC1zYW1lLWxldmVsCiAgIkMtYyBDLWIiICAgICAjJ291dGxpbmUt
YmFja3dhcmQtc2FtZS1sZXZlbAogICJDLWMgQy14IEMtZiIgIydtYXJrZG93bi10cy1lbXBoYXNp
emUKICAiQy1jIEMteCBDLW0iICMnbWFya2Rvd24tdHMtdG9nZ2xlLWhpZGUtbWFya3VwCiAgIkMt
YyBDLXggQy12IiAjJ21hcmtkb3duLXRzLXRvZ2dsZS1pbmxpbmUtaW1hZ2VzCiAgIkMtYyBDLWMi
ICAgICAjJ21hcmtkb3duLXRzLXRvZ2dsZS1jaGVja2JveAogICJDLWMgQy1yIiAgICAgIydtYXJr
ZG93bi10cy1yZW51bWJlci1saXN0CiAgIkMtYyBDLSwiICAgICAjJ21hcmtkb3duLXRzLWluc2Vy
dC1zdHJ1Y3R1cmUKICAiQy1jIEMtdiBuIiAgICMnbWFya2Rvd24tdHMtbW92ZS10by1uZXh0LWNv
ZGUtYmxvY2sKICAiQy1jIEMtdiBwIiAgICMnbWFya2Rvd24tdHMtbW92ZS10by1wcmV2aW91cy1j
b2RlLWJsb2NrCiAgIlJFVCIgICAgICAgICAjJ21hcmtkb3duLXRzLW5ld2xpbmUKICAiTS1SRVQi
ICAgICAgICMnbWFya2Rvd24tdHMtaW5zZXJ0LWxpc3QtaXRlbQogICJUQUIiICAgICAgICAgIydt
YXJrZG93bi10cy1vdXRsaW5lLWN5Y2xlKQoKKGRlZnZhci1rZXltYXAgbWFya2Rvd24tdHMtdmll
dy1tb2RlLW1hcAogIDpkb2MgIktleW1hcCBmb3IgYG1hcmtkb3duLXRzLXZpZXctbW9kZScuIgog
IDpwYXJlbnQgc3BlY2lhbC1tb2RlLW1hcAogIDptZW51IG5pbAogICJnIiAgICAgICAgICAgIydp
Z25vcmUgOyBPdmVycmlkZSBzcGVjaWFsLW1vZGUtbWFwICMncmV2ZXJ0LWJ1ZmZlcgogICJDLWMg
Qy1uIiAgICAgIydvdXRsaW5lLW5leHQtaGVhZGluZwogICJuIiAgICAgICAgICAgIydvdXRsaW5l
LW5leHQtaGVhZGluZwogICJDLWMgQy1wIiAgICAgIydvdXRsaW5lLXByZXZpb3VzLWhlYWRpbmcK
ICAicCIgICAgICAgICAgICMnb3V0bGluZS1wcmV2aW91cy1oZWFkaW5nCiAgIkMtYyBDLXUiICAg
ICAjJ291dGxpbmUtdXAtaGVhZGluZwogICJ1IiAgICAgICAgICAgIydvdXRsaW5lLXVwLWhlYWRp
bmcKICAiQy1jIEMtZiIgICAgICMnb3V0bGluZS1mb3J3YXJkLXNhbWUtbGV2ZWwKICAiZiIgICAg
ICAgICAgICMnb3V0bGluZS1mb3J3YXJkLXNhbWUtbGV2ZWwKICAiQy1jIEMtYiIgICAgICMnb3V0
bGluZS1iYWNrd2FyZC1zYW1lLWxldmVsCiAgImIiICAgICAgICAgICAjJ291dGxpbmUtYmFja3dh
cmQtc2FtZS1sZXZlbAogICJDLWMgQy14IEMtbSIgIydtYXJrZG93bi10cy10b2dnbGUtaGlkZS1t
YXJrdXAKICAiQy1jIEMteCBDLXYiICMnbWFya2Rvd24tdHMtdG9nZ2xlLWlubGluZS1pbWFnZXMK
ICAiQy1jIEMtdiBuIiAgICMnbWFya2Rvd24tdHMtbW92ZS10by1uZXh0LWNvZGUtYmxvY2sKICAi
Qy1jIEMtdiBwIiAgICMnbWFya2Rvd24tdHMtbW92ZS10by1wcmV2aW91cy1jb2RlLWJsb2NrCiAg
IlRBQiIgICAgICAgICAjJ21hcmtkb3duLXRzLW91dGxpbmUtY3ljbGUpCgooZGVmdmFyLWtleW1h
cCBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZS1tYXAKICA6ZG9jICJLZXlt
YXAgZm9yIGBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZScuClRoZXNlIG92
ZXJyaWRlIGtleXMgaW4gYG1hcmtkb3duLXRzLW1vZGUtbWFwJyB0byBzdXBwb3J0IGV4ZWN1dGlu
ZyB0aGVpcgpjb21tYW5kcyBpbiBhIGNvZGUtYmxvY2sgY29udGV4dC4iCiAgOnBhcmVudCBtYXJr
ZG93bi10cy1tb2RlLW1hcAogIDptZW51IG5pbAogICJNLS4iICAgICAgICAgIydtYXJrZG93bi10
cy0tY29kZS1ibG9jay14cmVmLWZpbmQtZGVmaW5pdGlvbnMKICAiVEFCIiAgICAgICAgICMnaW5k
ZW50LWZvci10YWItY29tbWFuZAogICJSRVQiICAgICAgICAgIydtYXJrZG93bi10cy0tY29kZS1i
bG9jay1uZXdsaW5lCiAgIkMtaiIgICAgICAgICAjJ21hcmtkb3duLXRzLS1jb2RlLWJsb2NrLW5l
d2xpbmUKICAiTS1SRVQiICAgICAgICMnbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stbmV3bGluZQog
ICJNLXEiICAgICAgICAgIydtYXJrZG93bi10cy0tY29kZS1ibG9jay1maWxsLXBhcmFncmFwaCkK
CihkZWZ2YXIta2V5bWFwIG1hcmtkb3duLXRzLWluLXRhYmxlLW1vZGUtbWFwCiAgOmRvYyAiS2V5
bWFwIGZvciBgbWFya2Rvd24tdHMtaW4tdGFibGUtbW9kZScuClRoZXNlIG92ZXJyaWRlIGtleXMg
aW4gYG1hcmtkb3duLXRzLW1vZGUtbWFwJyB0byBzdXBwb3J0IGV4ZWN1dGluZyB0aGVpcgpjb21t
YW5kcyBpbiBhIHRhYmxlIGNvbnRleHQuIgogIDpwYXJlbnQgbWFya2Rvd24tdHMtbW9kZS1tYXAK
ICA6bWVudSBuaWwKICAiPHJldHVybj4iICAgICMnbWFya2Rvd24tdHMtdGFibGUtbmV4dC1yb3cK
ICAiUy08cmV0dXJuPiIgICMnbWFya2Rvd24tdHMtdGFibGUtcHJldmlvdXMtcm93CiAgIjx0YWI+
IiAgICAgICAjJ21hcmtkb3duLXRzLXRhYmxlLW5leHQtY2VsbAogICI8YmFja3RhYj4iICAgIydt
YXJrZG93bi10cy10YWJsZS1wcmV2aW91cy1jZWxsCiAgIk0tPHVwPiIgICAgICAjJ21hcmtkb3du
LXRzLXRhYmxlLW1vdmUtcm93LXVwCiAgIk0tPGRvd24+IiAgICAjJ21hcmtkb3duLXRzLXRhYmxl
LW1vdmUtcm93LWRvd24KICAiTS08bGVmdD4iICAgICMnbWFya2Rvd24tdHMtdGFibGUtbW92ZS1j
b2x1bW4tbGVmdAogICJNLTxyaWdodD4iICAgIydtYXJrZG93bi10cy10YWJsZS1tb3ZlLWNvbHVt
bi1yaWdodAogICJNLVMtPHVwPiIgICAgIydtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtcm93LWFi
b3ZlCiAgIk0tUy08ZG93bj4iICAjJ21hcmtkb3duLXRzLXRhYmxlLWRlbGV0ZS1yb3cKICAiTS1T
LTxyaWdodD4iICMnbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LWNvbHVtbi1sZWZ0CiAgIk0tUy08
bGVmdD4iICAjJ21hcmtkb3duLXRzLXRhYmxlLWRlbGV0ZS1jb2x1bW4KICAiQy1jIEMtdCBhIiAg
ICMnbWFya2Rvd24tdHMtdGFibGUtYWxpZ24tY29sdW1uCiAgIkMtYyBDLWMiICAgICAjJ21hcmtk
b3duLXRzLXRhYmxlLWFsaWduLXRhYmxlCiAgIkMtYyBDLXQgdCIgICAjJ21hcmtkb3duLXRzLXRh
YmxlLXRyYW5zcG9zZS10YWJsZSkKCihlYXN5LW1lbnUtZGVmaW5lIG1hcmtkb3duLXRzLW1vZGUt
bWVudSBtYXJrZG93bi10cy1tb2RlLW1hcAogICJgbWFya2Rvd24tdHMtbW9kZScgbWVudS4iCiAg
JygiTWFya2Rvd24iIDp2aXNpYmxlIG1hcmtkb3duLXRzLW1lbnUtYmFyLXNob3cKICAgICItLSIK
ICAgIFsiQ3ljbGUgT3V0bGluZSBWaXNpYmlsaXR5IiAgbWFya2Rvd24tdHMtb3V0bGluZS1jeWNs
ZSAgICAgICAgICAgICAgOmhlbHAgIkN5Y2xlIGhlYWRpbmcgdmlzaWJpbGl0eSBmcm9tIHBvaW50
Il0KICAgIFsiVG9nZ2xlIEhpZGUgTWFya3VwIiAgICAgICAgbWFya2Rvd24tdHMtdG9nZ2xlLWhp
ZGUtbWFya3VwICAgICAgICAgOmhlbHAgIlRvZ2dsZSBkaXNwbGF5IG9mIG1hcmt1cCBjaGFyYWN0
ZXJzIiA6c3R5bGUgdG9nZ2xlIDpzZWxlY3RlZCBtYXJrZG93bi10cy1oaWRlLW1hcmt1cF0KICAg
IFsiVG9nZ2xlIElubGluZSBJbWFnZXMiICAgICAgbWFya2Rvd24tdHMtdG9nZ2xlLWlubGluZS1p
bWFnZXMgICAgICAgOmhlbHAgIlRvZ2dsZSBkaXNwbGF5IG9mIGlubGluZSBpbWFnZXMgYmVsb3cg
bGlua3MiIDpzdHlsZSB0b2dnbGUgOnNlbGVjdGVkIG1hcmtkb3duLXRzLWlubGluZS1pbWFnZXNd
CiAgICAiLS0iCiAgICBbIlVwIiAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtdXAtaGVh
ZGluZyAgICAgICAgICAgICAgICAgICAgIDpoZWxwICJNb3ZlIHRvIHRoZSBwYXJlbnQgaGVhZGlu
ZyJdCiAgICBbIk5leHQiICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtbmV4dC1oZWFkaW5n
ICAgICAgICAgICAgICAgICAgIDpoZWxwICJNb3ZlIHRvIHRoZSBuZXh0IGhlYWRpbmciXQogICAg
WyJQcmV2aW91cyIgICAgICAgICAgICAgICAgICBvdXRsaW5lLXByZXZpb3VzLWhlYWRpbmcgICAg
ICAgICAgICAgICA6aGVscCAiTW92ZSB0byB0aGUgcHJldmlvdXMgaGVhZGluZyJdCiAgICBbIk5l
eHQgU2FtZSBMZXZlbCIgICAgICAgICAgIG91dGxpbmUtZm9yd2FyZC1zYW1lLWxldmVsICAgICAg
ICAgICAgIDpoZWxwICJNb3ZlIHRvIHRoZSBuZXh0IGhlYWRpbmcgYXQgdGhlIHNhbWUgbGV2ZWwi
XQogICAgWyJQcmV2aW91cyBTYW1lIExldmVsIiAgICAgICBvdXRsaW5lLWJhY2t3YXJkLXNhbWUt
bGV2ZWwgICAgICAgICAgICA6aGVscCAiTW92ZSB0byB0aGUgcHJldmlvdXMgaGVhZGluZyBhdCB0
aGUgc2FtZSBsZXZlbCJdCiAgICAiLS0iCiAgICBbIkp1bXAiICAgICAgICAgICAgICAgICAgICAg
IGltZW51ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpoZWxwICJKdW1wIHRvIGEg
aGVhZGluZyB2aWEgY29tcGxldGlvbiJdCiAgICAiLS0iCiAgICBbIk1vdmUgU3VidHJlZSBVcCIg
ICAgICAgICAgIG1hcmtkb3duLXRzLW1vdmUtc3VidHJlZS11cCAgICAgICAgICAgIDpoZWxwICJN
b3ZlIHRoZSBjdXJyZW50IHNlY3Rpb24gb3IgbGlzdCBpdGVtIHVwIl0KICAgIFsiTW92ZSBTdWJ0
cmVlIERvd24iICAgICAgICAgbWFya2Rvd24tdHMtbW92ZS1zdWJ0cmVlLWRvd24gICAgICAgICAg
OmhlbHAgIk1vdmUgdGhlIGN1cnJlbnQgc2VjdGlvbiBvciBsaXN0IGl0ZW0gZG93biJdCiAgICBb
IlByb21vdGUiICAgICAgICAgICAgICAgICAgIG1hcmtkb3duLXRzLXByb21vdGUgICAgICAgICAg
ICAgICAgICAgIDpoZWxwICJQcm9tb3RlIGhlYWRpbmcgb3IgbGlzdCBpdGVtIl0KICAgIFsiRGVt
b3RlIiAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtZGVtb3RlICAgICAgICAgICAgICAg
ICAgICAgOmhlbHAgIkRlbW90ZSBoZWFkaW5nIG9yIGxpc3QgaXRlbSJdCiAgICAiLS0iCiAgICBb
IkVtcGhhc2lzLi4uIiAgICAgICAgICAgICAgIG1hcmtkb3duLXRzLWVtcGhhc2l6ZSAgICAgICAg
ICAgICAgICAgIDpoZWxwICJBZGQgb3IgY2hhbmdlIGVtcGhhc2lzIG9uIHJlZ2lvbiJdCiAgICBb
IkFkZCBCbG9jayBTdHJ1Y3R1cmUiICAgICAgIG1hcmtkb3duLXRzLWluc2VydC1zdHJ1Y3R1cmUg
ICAgICAgICAgIDpoZWxwICJJbnNlcnQgYSBjb2RlIGJsb2NrLCBxdW90ZSwgb3Igb3RoZXIgc3Ry
dWN0dXJlIl0KICAgICItLSIKICAgIFsiVG9nZ2xlIENoZWNrYm94IiAgICAgICAgICAgbWFya2Rv
d24tdHMtdG9nZ2xlLWNoZWNrYm94ICAgICAgICAgICAgOmhlbHAgIlRvZ2dsZSB0YXNrIGxpc3Qg
Y2hlY2tib3ggYXQgcG9pbnQiXQogICAgWyJOZXcgTGlzdCBJdGVtIiAgICAgICAgICAgICBtYXJr
ZG93bi10cy1pbnNlcnQtbGlzdC1pdGVtICAgICAgICAgICA6aGVscCAiSW5zZXJ0IGEgbmV3IGxp
c3QgaXRlbSBhZnRlciB0aGUgY3VycmVudCBvbmUiXQogICAgWyJSZW51bWJlciBMaXN0IiAgICAg
ICAgICAgICBtYXJrZG93bi10cy1yZW51bWJlci1saXN0ICAgICAgICAgICAgICA6aGVscCAiUmVu
dW1iZXIgdGhlIG9yZGVyZWQgbGlzdCBhdCBwb2ludCJdCiAgICAiLS0iCiAgICAoIlRhYmxlIgog
ICAgIFsiSW5zZXJ0IHRhYmxlIiAgICAgICAgICAgICBtYXJrZG93bi10cy10YWJsZS1pbnNlcnQt
dGFibGUgICAgICAgICA6aGVscCAiSW5zZXJ0IGFuIGVtcHR5IHRhYmxlIGF0IHBvaW50Il0KICAg
ICBbIkRlbGV0ZSB0YWJsZSIgICAgICAgICAgICAgbWFya2Rvd24tdHMtdGFibGUtZGVsZXRlLXRh
YmxlICAgICAgICAgOmhlbHAgIkRlbGV0ZSB0aGUgdGFibGUgYXQgcG9pbnQiXQogICAgICItLSIK
ICAgICBbIk5leHQgY2VsbCIgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtdGFibGUtbmV4dC1j
ZWxsICAgICAgICAgICAgOmhlbHAgIk1vdmUgcG9pbnQgdG8gdGhlIG5leHQgY2VsbCJdCiAgICAg
WyJQcmV2aW91cyBjZWxsIiAgICAgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLXByZXZpb3VzLWNl
bGwgICAgICAgIDpoZWxwICJNb3ZlIHBvaW50IHRvIHRoZSBwcmV2aW91cyBjZWxsIl0KICAgICAi
LS0iCiAgICAgWyJOZXh0IHJvdyIgICAgICAgICAgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLW5l
eHQtcm93ICAgICAgICAgICAgIDpoZWxwICJNb3ZlIHBvaW50IHRvIHRoZSBuZXh0IHJvdyJdCiAg
ICAgWyJQcmV2aW91cyByb3ciICAgICAgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLXByZXZpb3Vz
LXJvdyAgICAgICAgIDpoZWxwICJNb3ZlIHBvaW50IHRvIHRoZSBwcmV2aW91cyByb3ciXQogICAg
IFsiSW5zZXJ0IHJvdyBiZWxvdyIgICAgICAgICBtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtcm93
LWJlbG93ICAgICA6aGVscCAiSW5zZXJ0IGFuIGVtcHR5IHJvdyBiZWxvdyBwb2ludCJdCiAgICAg
WyJJbnNlcnQgcm93IGFib3ZlIiAgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLWluc2VydC1yb3ct
YWJvdmUgICAgIDpoZWxwICJJbnNlcnQgYW4gZW1wdHkgcm93IGFib3ZlIHBvaW50Il0KICAgICBb
IkNsb25lIHJvdyBiZWxvdyIgICAgICAgICAgbWFya2Rvd24tdHMtdGFibGUtY2xvbmUtcm93LWJl
bG93ICAgICAgOmhlbHAgIkNsb25lIHRoZSBjdXJyZW50IHJvdyBiZWxvdyBpdCJdCiAgICAgWyJD
bG9uZSByb3cgYWJvdmUiICAgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLWNsb25lLXJvdy1hYm92
ZSAgICAgIDpoZWxwICJDbG9uZSB0aGUgY3VycmVudCByb3cgYWJvdmUgaXQiXQogICAgIFsiTW92
ZSByb3cgdXAiICAgICAgICAgICAgICBtYXJrZG93bi10cy10YWJsZS1tb3ZlLXJvdy11cCAgICAg
ICAgICA6aGVscCAiTW92ZSB0aGUgcm93IGF0IHBvaW50IHVwIl0KICAgICBbIk1vdmUgcm93IGRv
d24iICAgICAgICAgICAgbWFya2Rvd24tdHMtdGFibGUtbW92ZS1yb3ctZG93biAgICAgICAgOmhl
bHAgIk1vdmUgdGhlIHJvdyBhdCBwb2ludCBkb3duIl0KICAgICBbIkRlbGV0ZSByb3ciICAgICAg
ICAgICAgICAgbWFya2Rvd24tdHMtdGFibGUtZGVsZXRlLXJvdyAgICAgICAgICAgOmhlbHAgIkRl
bGV0ZSB0aGUgcm93IGF0IHBvaW50Il0KICAgICAiLS0iCiAgICAgWyJJbnNlcnQgY29sdW1uIGxl
ZnQiICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLWluc2VydC1jb2x1bW4tbGVmdCAgIDpoZWxwICJJ
bnNlcnQgYW4gZW1wdHkgY29sdW1uIHRvIHRoZSBsZWZ0IG9mIHBvaW50Il0KICAgICBbIkluc2Vy
dCBjb2x1bW4gcmlnaHQiICAgICAgbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LWNvbHVtbi1yaWdo
dCAgOmhlbHAgIkluc2VydCBhbiBlbXB0eSBjb2x1bW4gdG8gdGhlIHJpZ2h0IG9mIHBvaW50Il0K
ICAgICBbIkNsb25lIGNvbHVtbiBsZWZ0IiAgICAgICAgbWFya2Rvd24tdHMtdGFibGUtY2xvbmUt
Y29sdW1uLWxlZnQgICAgOmhlbHAgIkluc2VydCBhbiBlbXB0eSBjb2x1bW4gdG8gdGhlIGxlZnQg
b2YgcG9pbnQiXQogICAgIFsiQ2xvbmUgY29sdW1uIHJpZ2h0IiAgICAgICBtYXJrZG93bi10cy10
YWJsZS1jbG9uZS1jb2x1bW4tcmlnaHQgICA6aGVscCAiSW5zZXJ0IGFuIGVtcHR5IGNvbHVtbiB0
byB0aGUgcmlnaHQgb2YgcG9pbnQiXQogICAgIFsiTW92ZSBjb2x1bW4gbGVmdCIgICAgICAgICBt
YXJrZG93bi10cy10YWJsZS1tb3ZlLWNvbHVtbi1sZWZ0ICAgICA6aGVscCAiTW92ZSB0aGUgY3Vy
cmVudCBjb2x1bW4gdG8gaXRzIGxlZnQiXQogICAgIFsiTW92ZSBjb2x1bW4gcmlnaHQiICAgICAg
ICBtYXJrZG93bi10cy10YWJsZS1tb3ZlLWNvbHVtbi1yaWdodCAgICA6aGVscCAiTW92ZSB0aGUg
Y3VycmVudCBjb2x1bW4gdG8gaXRzIHJpZ2h0Il0KICAgICBbIkFsaWduIGNvbHVtbi4uLiIgICAg
ICAgICAgbWFya2Rvd24tdHMtdGFibGUtYWxpZ24tY29sdW1uICAgICAgICAgOmhlbHAgIkFsaWdu
IGNvbHVtbiBhdCBwb2ludCB0byB0aGUgbGVmdCwgY2VudGVyLCBvciByaWdodCJdCiAgICAgWyJE
ZWxldGUgY29sdW1uIiAgICAgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLWRlbGV0ZS1jb2x1bW4g
ICAgICAgIDpoZWxwICJEZWxldGUgdGhlIGNvbHVtbiBhdCBwb2ludCJdCiAgICAgIi0tIgogICAg
IFsiQWxpZ24gdGFibGUgY29sdW1ucyIgICAgICBtYXJrZG93bi10cy10YWJsZS1hbGlnbi10YWJs
ZSAgICAgICAgICA6aGVscCAiQWxpZ24gdGhlIHRhYmxlIGF0IHBvaW50IGluIGFuIGVhc3ktdG8t
ZWRpdCBmb3JtYXQiXQogICAgIFsiVHJhbnNwb3NlIHRhYmxlIiAgICAgICAgICBtYXJrZG93bi10
cy10YWJsZS10cmFuc3Bvc2UtdGFibGUgICAgICA6aGVscCAiVHJhbnNwb3NlIHRoZSB0YWJsZSBh
dCBwb2ludCBzd2FwcGluZyBpdHMgcm93cyBhbmQgY29sdW1ucyJdCiAgICAgIi0tIgogICAgIFsi
Q29udmVydCBDU1YgdG8gdGFibGUiICAgICBtYXJrZG93bi10cy10YWJsZS1jb252ZXJ0LWNzdi1y
ZWdpb24gICA6aGVscCAiQ29udmVydCBhIHJhbmdlIG9mIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMg
dG8gYSBuZXcgdGFibGUgYXQgcG9pbnQiXQogICAgIFsiQ29udmVydCBUU1YgdG8gdGFibGUiICAg
ICBtYXJrZG93bi10cy10YWJsZS1jb252ZXJ0LXRzdi1yZWdpb24gICA6aGVscCAiQ29udmVydCBh
IHJhbmdlIG9mIHRhYi1zZXBhcmF0ZWQgdmFsdWVzIHRvIGEgbmV3IHRhYmxlIGF0IHBvaW50Il0K
ICAgICBbIkV4cG9ydCB0YWJsZSB0byBDU1YiICAgICAgbWFya2Rvd24tdHMtdGFibGUtZXhwb3J0
LXRhYmxlLWNzdiAgICAgOmhlbHAgIkV4cG9ydCB0aGUgdGFibGUgYXQgcG9pbnQgdG8gYSBjb21t
YS1zZXBhcmF0ZWQgdmFsdWVzIGJ1ZmZlciJdCiAgICAgWyJFeHBvcnQgdGFibGUgdG8gVFNWIiAg
ICAgIG1hcmtkb3duLXRzLXRhYmxlLWV4cG9ydC10YWJsZS10c3YgICAgIDpoZWxwICJFeHBvcnQg
dGhlIHRhYmxlIGF0IHBvaW50IHRvIGEgdGFiLXNlcGFyYXRlZCB2YWx1ZXMgYnVmZmVyIl0pKSkK
CihkZWZ1biBtYXJrZG93bi10cy0tc2V0LXVwICgpCiAgIlNldCB1cCB0aGUgYnVmZmVyIGZvciBg
bWFya2Rvd24tdHMtbW9kZScuCklmIGBtYXJrZG93bi10cy0tc2V0LXVwLWlubGluZScgaXMgbm9u
LW5pbCwgdXNlIGEgbGlnaHR3ZWlnaHQgc2V0IHVwIGZvcgplbWJlZGRlZCBpbmxpbmUgYG1hcmtk
b3duLXRzLW1vZGUnIGJ1ZmZlcnMuCgpOT1RFOiBDYWxsIHRoaXMgZnVuY3Rpb24gb25seSB3aGVu
IHRoZSB0cmVlc2l0IGBtYXJrZG93bicgYW5kCmBtYXJrZG93bi1pbmxpbmUnIHBhcnNlcnMgYXJl
IGF2YWlsYWJsZS4iCgogIDs7IFNldCB0aGVzZSB1cCBmb3IgYm90aCBtYXN0ZXIgYW5kIGlubGlu
ZSBmb3IgY29kZS1ibG9jayBidWZmZXJzLgogIChzZXRxLWxvY2FsIGNvbW1lbnQtc3RhcnQgIjwh
LS0gIgogICAgICAgICAgICAgIGNvbW1lbnQtZW5kICIgLS0+IgogICAgICAgICAgICAgIGNvbW1l
bnQtc3RhcnQtc2tpcCAiPCEtLVsgXHRdKiIKICAgICAgICAgICAgICBjb21tZW50LWVuZC1za2lw
ICJbIFx0XSotLT4iCiAgICAgICAgICAgICAgY29tbWVudC11c2Utc3ludGF4IG5pbCkKCiAgKHNl
dHEtbG9jYWwgZmlsbC1wYXJhZ3JhcGgtZnVuY3Rpb24KICAgICAgICAgICAgICAjJ21hcmtkb3du
LXRzLS1maWxsLXBhcmFncmFwaAogICAgICAgICAgICAgIGZpbGwtZm9yd2FyZC1wYXJhZ3JhcGgt
ZnVuY3Rpb24KICAgICAgICAgICAgICAjJ21hcmtkb3duLXRzLS1maWxsLWZvcndhcmQtcGFyYWdy
YXBoKQoKICA7OyBgYWRhcHRpdmUtZmlsbC1mdW5jdGlvbicgdGFrZXMgcHJlY2VkZW5jZSBvdmVy
CiAgOzsgYGFkYXB0aXZlLWZpbGwtcmVnZXhwJzsgdGhlIGRlZmF1bHQgcmVnZXhwIGlzIGZpbmUg
YXMgYQogIDs7IGZhbGxiYWNrIGZvciBwbGFpbiAobm9uLWxpc3QpIHBhcmFncmFwaHMuCiAgKHNl
dHEtbG9jYWwgYWRhcHRpdmUtZmlsbC1mdW5jdGlvbiAjJ21hcmtkb3duLXRzLS1hZGFwdGl2ZS1m
aWxsKQoKICA7OyBDcmVhdGUgYW5kIGNvbmZpZ3VyZSB0aGUgcGFyc2Vycy4KICAoc2V0cSB0cmVl
c2l0LXByaW1hcnktcGFyc2VyCiAgICAgICAgKHRyZWVzaXQtcGFyc2VyLWNyZWF0ZSAnbWFya2Rv
d24pKQoKICAoc2V0cS1sb2NhbCBmb250LWxvY2stZGVmYXVsdHMgbmlsKQogIChzZXRxLWxvY2Fs
IHRyZWVzaXQtZm9udC1sb2NrLXNldHRpbmdzIG1hcmtkb3duLXRzLS10cmVlc2l0LXNldHRpbmdz
KQogIChzZXRxLWxvY2FsIHRyZWVzaXQtZm9udC1sb2NrLWZlYXR1cmUtbGlzdCAnKChkZWxpbWl0
ZXIgaGVhZGluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAocGFyYWdyYXBoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChwYXJhZ3JhcGgtaW5saW5lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChpbWFnZS1wcmV2aWV3IGVycm9yKSkpCgogIChjb25kIChtYXJrZG93bi10
cy0tc2V0LXVwLWlubGluZQogICAgICAgICAodHJlZXNpdC1wYXJzZXItY3JlYXRlICdtYXJrZG93
bi1pbmxpbmUpCiAgICAgICAgIChzZXRxLWxvY2FsIHRyZWVzaXQtcmFuZ2Utc2V0dGluZ3MKICAg
ICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtcmFuZ2UtcnVsZXMKICAgICAgICAgICAgICAgICAg
ICAgIDplbWJlZCAnbWFya2Rvd24taW5saW5lCiAgICAgICAgICAgICAgICAgICAgICA6aG9zdCAn
bWFya2Rvd24KICAgICAgICAgICAgICAgICAgICAgICcoKGlubGluZSkgQG1hcmtkb3duLWlubGlu
ZSkpKSkKICAgICAgICAodAogICAgICAgICA7OyBSYW5nZSBzZXR0aW5ncyBkaWZmZXIgaW4gdGhl
IG1hc3RlciBidWZmZXIgdnMuIGlubGluZSBhYm92ZS4KICAgICAgICAgKHNldHEtbG9jYWwgdHJl
ZXNpdC1yYW5nZS1zZXR0aW5ncyAobWFya2Rvd24tdHMtLXJhbmdlLXNldHRpbmdzKSkKCiAgICAg
ICAgIDs7IENvbmZpZ3VyZSBmZWF0dXJlcyBuZWVkZWQgb25seSBpbiB0aGUgbWFzdGVyIGJ1ZmZl
ci4KCiAgICAgICAgIDs7IEltZW51IHN1cHBvcnQuCiAgICAgICAgIChzZXRxLWxvY2FsIHRyZWVz
aXQtc2ltcGxlLWltZW51LXNldHRpbmdzCiAgICAgICAgICAgICAgICAgICAgIGAoKCJIZWFkaW5n
cyIgLCMnbWFya2Rvd24tdHMtLWltZW51LWhlYWRpbmctbm9kZS1wCiAgICAgICAgICAgICAgICAg
ICAgICAgIG5pbCAsIydtYXJrZG93bi10cy0taW1lbnUtaGVhZGluZy1uYW1lLWZ1bmN0aW9uKQog
ICAgICAgICAgICAgICAgICAgICAgICgiQ29kZSBCbG9ja3MiICwjJ21hcmtkb3duLXRzLS1pbWVu
dS1jb2RlLWJsb2NrLW5vZGUtcAogICAgICAgICAgICAgICAgICAgICAgICBuaWwgLCMnbWFya2Rv
d24tdHMtLWltZW51LWNvZGUtYmxvY2stbmFtZS1mdW5jdGlvbikpKQoKICAgICAgICAgOzsgT3V0
bGluZSBzdXBwb3J0LgogICAgICAgICAoc2V0cS1sb2NhbCB0cmVlc2l0LW91dGxpbmUtcHJlZGlj
YXRlICMnbWFya2Rvd24tdHMtLW91dGxpbmUtcHJlZGljYXRlKQogICAgICAgICAoc2V0cS1sb2Nh
bCBvdXRsaW5lLW1pbm9yLW1vZGUtY3ljbGUgdCkKICAgICAgICAgKG91dGxpbmUtbWlub3ItbW9k
ZSAxKQogICAgICAgICAobWFya2Rvd24tdHMtLWFwcGx5LWVsbGlwc2lzKQoKICAgICAgICAgOzsg
Tk9URTogYG91dGxpbmUtdmlldy1jaGFuZ2UtaG9vaycgd2FzIG9ic29sZXRlZCBpbiAyOS4xIChj
b21taXQKICAgICAgICAgOzsgNTNiMWU2Zjk2Y2IpIG9uIHRoZSBncm91bmRzIHRoYXQgb25seSBs
YXp5LWxvY2sgdXNlZCBpdCwgYnV0IG5vCiAgICAgICAgIDs7IHJlcGxhY2VtZW50IHdhcyBwcm92
aWRlZCBhbmQgb3V0bGluZS5lbCBpdHNlbGYgc3RpbGwgcnVucyB0aGUgaG9vawogICAgICAgICA7
OyBpbiAxMCsgcGxhY2VzLgogICAgICAgICAod2l0aC1zdXBwcmVzc2VkLXdhcm5pbmdzICgob2Jz
b2xldGUgb3V0bGluZS12aWV3LWNoYW5nZS1ob29rKSkKICAgICAgICAgICAoYWRkLWhvb2sgJ291
dGxpbmUtdmlldy1jaGFuZ2UtaG9vawogICAgICAgICAgICAgICAgICAgICAjJ21hcmtkb3duLXRz
LS1vdXRsaW5lLXZpZXctY2hhbmdlIG5pbCB0KSkKCiAgICAgICAgIChwcm9nbgogICAgICAgICAg
IChtYWtlLWxvY2FsLXZhcmlhYmxlICdmb250LWxvY2stZXh0cmEtbWFuYWdlZC1wcm9wcykKICAg
ICAgICAgICAoZG9saXN0IChwcm9wICcoaW52aXNpYmxlIGRpc3BsYXkgYnV0dG9uIGNhdGVnb3J5
IGFjdGlvbiBoZWxwLWVjaG8pKQogICAgICAgICAgICAgKGFkZC10by1saXN0ICdmb250LWxvY2st
ZXh0cmEtbWFuYWdlZC1wcm9wcyBwcm9wKSkpCgogICAgICAgICAod2hlbiAodHJlZXNpdC1yZWFk
eS1wICdodG1sIHQpCiAgICAgICAgICAgKHRyZWVzaXQtcGFyc2VyLWNyZWF0ZSAnaHRtbCkKICAg
ICAgICAgICAocmVxdWlyZSAnaHRtbC10cy1tb2RlKQogICAgICAgICAgIChkZWZ2YXIgaHRtbC10
cy1tb2RlLS1mb250LWxvY2stc2V0dGluZ3MpCiAgICAgICAgICAgKGRlZnZhciBodG1sLXRzLW1v
ZGUtLXRyZWVzaXQtZm9udC1sb2NrLWZlYXR1cmUtbGlzdCkKICAgICAgICAgICAoc2V0cS1sb2Nh
bCB0cmVlc2l0LWZvbnQtbG9jay1zZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICAgIChhcHBl
bmQgdHJlZXNpdC1mb250LWxvY2stc2V0dGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGh0bWwtdHMtbW9kZS0tZm9udC1sb2NrLXNldHRpbmdzKSkKICAgICAgICAgICAoc2V0cS1s
b2NhbCB0cmVlc2l0LWZvbnQtbG9jay1mZWF0dXJlLWxpc3QKICAgICAgICAgICAgICAgICAgICAg
ICAodHJlZXNpdC1tZXJnZS1mb250LWxvY2stZmVhdHVyZS1saXN0CiAgICAgICAgICAgICAgICAg
ICAgICAgIHRyZWVzaXQtZm9udC1sb2NrLWZlYXR1cmUtbGlzdAogICAgICAgICAgICAgICAgICAg
ICAgICBodG1sLXRzLW1vZGUtLXRyZWVzaXQtZm9udC1sb2NrLWZlYXR1cmUtbGlzdCkpCiAgICAg
ICAgICAgKHNldHEtbG9jYWwgdHJlZXNpdC1yYW5nZS1zZXR0aW5ncwogICAgICAgICAgICAgICAg
ICAgICAgIChhcHBlbmQgdHJlZXNpdC1yYW5nZS1zZXR0aW5ncwogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKHRyZWVzaXQtcmFuZ2UtcnVsZXMKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA6ZW1iZWQgJ2h0bWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aG9z
dCAnbWFya2Rvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bG9jYWwgdAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoKGh0bWxfYmxvY2spIEBodG1sKQoKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICA6ZW1iZWQgJ2h0bWwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICA6aG9zdCAnbWFya2Rvd24taW5saW5lCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgJygoaHRtbF90YWcpIEBodG1sKSkpKSkKCiAgICAgICAgICh3aGVuICh0cmVl
c2l0LXJlYWR5LXAgJ3lhbWwgdCkKICAgICAgICAgICAocmVxdWlyZSAneWFtbC10cy1tb2RlKQog
ICAgICAgICAgIChkZWZ2YXIgeWFtbC10cy1tb2RlLS1mb250LWxvY2stc2V0dGluZ3MpCiAgICAg
ICAgICAgKGRlZnZhciB5YW1sLXRzLW1vZGUtLWZvbnQtbG9jay1mZWF0dXJlLWxpc3QpCiAgICAg
ICAgICAgKHNldHEtbG9jYWwgdHJlZXNpdC1mb250LWxvY2stc2V0dGluZ3MKICAgICAgICAgICAg
ICAgICAgICAgICAoYXBwZW5kIHRyZWVzaXQtZm9udC1sb2NrLXNldHRpbmdzCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB5YW1sLXRzLW1vZGUtLWZvbnQtbG9jay1zZXR0aW5ncykpCiAg
ICAgICAgICAgKHNldHEtbG9jYWwgdHJlZXNpdC1mb250LWxvY2stZmVhdHVyZS1saXN0CiAgICAg
ICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbWVyZ2UtZm9udC1sb2NrLWZlYXR1cmUtbGlzdAog
ICAgICAgICAgICAgICAgICAgICAgICB0cmVlc2l0LWZvbnQtbG9jay1mZWF0dXJlLWxpc3QKICAg
ICAgICAgICAgICAgICAgICAgICAgeWFtbC10cy1tb2RlLS1mb250LWxvY2stZmVhdHVyZS1saXN0
KSkKICAgICAgICAgICAoc2V0cS1sb2NhbCB0cmVlc2l0LXJhbmdlLXNldHRpbmdzCiAgICAgICAg
ICAgICAgICAgICAgICAgKGFwcGVuZCB0cmVlc2l0LXJhbmdlLXNldHRpbmdzCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1yYW5nZS1ydWxlcwogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIDplbWJlZCAneWFtbAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDpob3N0ICdtYXJrZG93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpsb2Nh
bCB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygobWludXNfbWV0YWRhdGEpIEB5
YW1sKSkpKSkKCiAgICAgICAgICh3aGVuICh0cmVlc2l0LXJlYWR5LXAgJ3RvbWwgdCkKICAgICAg
ICAgICAocmVxdWlyZSAndG9tbC10cy1tb2RlKQogICAgICAgICAgIChkZWZ2YXIgdG9tbC10cy1t
b2RlLS1mb250LWxvY2stc2V0dGluZ3MpCiAgICAgICAgICAgKGRlZnZhciB0b21sLXRzLW1vZGUt
LWZvbnQtbG9jay1mZWF0dXJlLWxpc3QpCiAgICAgICAgICAgKHNldHEgdHJlZXNpdC1mb250LWxv
Y2stc2V0dGluZ3MKICAgICAgICAgICAgICAgICAoYXBwZW5kIHRyZWVzaXQtZm9udC1sb2NrLXNl
dHRpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgICB0b21sLXRzLW1vZGUtLWZvbnQtbG9jay1z
ZXR0aW5ncykpCiAgICAgICAgICAgKHNldHEtbG9jYWwgdHJlZXNpdC1mb250LWxvY2stZmVhdHVy
ZS1saXN0CiAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbWVyZ2UtZm9udC1sb2NrLWZl
YXR1cmUtbGlzdAogICAgICAgICAgICAgICAgICAgICAgICB0cmVlc2l0LWZvbnQtbG9jay1mZWF0
dXJlLWxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgdG9tbC10cy1tb2RlLS1mb250LWxvY2st
ZmVhdHVyZS1saXN0KSkKICAgICAgICAgICAoc2V0cS1sb2NhbCB0cmVlc2l0LXJhbmdlLXNldHRp
bmdzCiAgICAgICAgICAgICAgICAgICAgICAgKGFwcGVuZCB0cmVlc2l0LXJhbmdlLXNldHRpbmdz
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1yYW5nZS1ydWxlcwogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplbWJlZCAndG9tbAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIDpob3N0ICdtYXJrZG93bgogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDpsb2NhbCB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygocGx1c19t
ZXRhZGF0YSkgQHRvbWwpKSkpKQoKICAgICAgICAgOzsgU3VwcG9ydCBmb3IgZXhlY3V0aW5nIGNv
bW1hbmRzIGluIGEgY29kZS1ibG9jayBjb250ZXh0LgogICAgICAgICAod2hlbiBtYXJrZG93bi10
cy1lbmFibGUtY29kZS1ibG9jay1jb250ZXh0LW1vZGUKICAgICAgICAgICAobWFya2Rvd24tdHMt
Y29kZS1ibG9jay1jb250ZXh0LW1vZGUpKQoKICAgICAgICAgOzsgU3VwcG9ydCBmb3IgdGFibGUg
bW9kZS4KICAgICAgICAgKHdoZW4gbWFya2Rvd24tdHMtZW5hYmxlLXRhYmxlLW1vZGUKICAgICAg
ICAgICAobWFya2Rvd24tdHMtdGFibGUtbW9kZSkpKSkKCiAgKHRyZWVzaXQtbWFqb3ItbW9kZS1z
ZXR1cCkKCiAgOzsgRG8gbm90IGVuYWJsZSBgaml0LWxvY2stbW9kZScgaW4gaW5kaXJlY3QgYnVm
ZmVycyBzdWNoIGFzIHRoZSBvbmUKICA7OyB3ZSB1c2UgZm9yIGNvZGUgYmxvY2sgY29tbWFuZHMu
CiAgKHVubGVzcyAoYnVmZmVyLWJhc2UtYnVmZmVyKQogICAgKGppdC1sb2NrLXJlZ2lzdGVyICMn
bWFya2Rvd24tdHMtLWZvbnRpZnktYmFyZS11cmkpKQoKICAodW5sZXNzIG1hcmtkb3duLXRzLS1z
ZXQtdXAtaW5saW5lCiAgICA7OyBPcmRlciBtYXR0ZXJzOiBgbWFya2Rvd24tdHMtLXNldC1oaWRl
LW1hcmt1cCcgY2FsbHMgYGZvbnQtbG9jay1mbHVzaCcKICAgIDs7IChvbmx5IG1lYW5pbmdmdWwg
b25jZSBgdHJlZXNpdC1tYWpvci1tb2RlLXNldHVwJyBoYXMgd2lyZWQgdXAKICAgIDs7IGZvbnQt
bG9jayksIGFuZCBgbWFya2Rvd24tdHMtZGVmYXVsdC1mb2xkaW5nJyBjYWxscyBvdXRsaW5lCiAg
ICA7OyBjb21tYW5kcyB0aGF0IHJlbHkgb24gYG91dGxpbmUtc2VhcmNoLWZ1bmN0aW9uJywgd2hp
Y2gKICAgIDs7IGB0cmVlc2l0LW1ham9yLW1vZGUtc2V0dXAnIGluc3RhbGxzIGZyb20gYHRyZWVz
aXQtb3V0bGluZS1wcmVkaWNhdGUnLgogICAgKG1hcmtkb3duLXRzLS1zZXQtaGlkZS1tYXJrdXAg
bWFya2Rvd24tdHMtaGlkZS1tYXJrdXApCiAgICA7OyBSZXNwZWN0IHRoZSB1c2VyJ3MgZGVmYXVs
dCBvdXRsaW5lIGZvbGRpbmcuCiAgICAocGNhc2UgbWFya2Rvd24tdHMtZGVmYXVsdC1mb2xkaW5n
CiAgICAgICgnc2hvdy1hbGwgKGlnbm9yZSkpCiAgICAgICgnZm9sZC1hbGwgKG91dGxpbmUtaGlk
ZS1zdWJsZXZlbHMgMSkpCiAgICAgICgnZm9sZC1oZWFkaW5ncyAob3V0bGluZS1zaG93LWFsbCkK
ICAgICAgICAgICAgICAgICAgICAgIChvdXRsaW5lLWhpZGUtcmVnaW9uLWJvZHkgKHBvaW50LW1p
bikgKHBvaW50LW1heCkpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLW1vZGUtaW5zdGFsbC1wYXJz
ZXJzIChhcmcpCiAgIkluc3RhbGwgYG1hcmtkb3duLXRzLW1vZGUnIHRyZWUtc2l0dGVyIGxhbmd1
YWdlIHBhcnNlcnMuCklmIG5lZWRlZCwgaW5zdGFsbCB0aGUgcmVxdWlyZWQgcGFyc2VycyBmb3Ig
YG1hcmtkb3duJyBhbmQgYG1hcmtkb3duLWlubGluZScuCldpdGggYSBwcmVmaXggYXJndW1lbnQs
IEFSRywgaWYgbmVlZGVkLCBpbnN0YWxsIHBhcnNlcnMgZm9yIGBodG1sJywKYHlhbWwnLCBhbmQg
YHRvbWwnLiIKICAoaW50ZXJhY3RpdmUgIlAiKQogICh1bmxlc3MgKHRyZWVzaXQtbGFuZ3VhZ2Ut
YXZhaWxhYmxlLXAgJ21hcmtkb3duKQogICAgKHRyZWVzaXQtaW5zdGFsbC1sYW5ndWFnZS1ncmFt
bWFyICdtYXJrZG93bikpCiAgKHVubGVzcyAodHJlZXNpdC1sYW5ndWFnZS1hdmFpbGFibGUtcCAn
bWFya2Rvd24taW5saW5lKQogICAgKHRyZWVzaXQtaW5zdGFsbC1sYW5ndWFnZS1ncmFtbWFyICdt
YXJrZG93bi1pbmxpbmUpKQogICh3aGVuIGFyZwogICAgKHVubGVzcyAodHJlZXNpdC1sYW5ndWFn
ZS1hdmFpbGFibGUtcCAnaHRtbCkKICAgICAgKHJlcXVpcmUgJ2h0bWwtdHMtbW9kZSkKICAgICAg
KHRyZWVzaXQtaW5zdGFsbC1sYW5ndWFnZS1ncmFtbWFyICdodG1sKSkKICAgICh1bmxlc3MgKHRy
ZWVzaXQtbGFuZ3VhZ2UtYXZhaWxhYmxlLXAgJ3lhbWwpCiAgICAgIChyZXF1aXJlICd5YW1sLXRz
LW1vZGUpCiAgICAgICh0cmVlc2l0LWluc3RhbGwtbGFuZ3VhZ2UtZ3JhbW1hciAneWFtbCkpCiAg
ICAodW5sZXNzICh0cmVlc2l0LWxhbmd1YWdlLWF2YWlsYWJsZS1wICd0b21sKQogICAgICAocmVx
dWlyZSAndG9tbC10cy1tb2RlKQogICAgICAodHJlZXNpdC1pbnN0YWxsLWxhbmd1YWdlLWdyYW1t
YXIgJ3RvbWwpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtbW9kZS0taW5pdGlhbGl6ZSAoKQogICJJ
bnZva2UgdGhpcyBmcm9tIG1ham9yIG1vZGUgZGVmaW5pdGlvbnMgYWZ0ZXIgbG9jYWwgdmFyaWFi
bGUgc2V0IHVwLiIKICAodHJlZXNpdC1lbnN1cmUtaW5zdGFsbGVkICdtYXJrZG93bikKICAodHJl
ZXNpdC1lbnN1cmUtaW5zdGFsbGVkICdtYXJrZG93bi1pbmxpbmUpCiAgOzsgQnlwYXNzIGB0cmVl
c2l0LW1heC1idWZmZXItc2l6ZScgc28gdGhlIG1vZGUgYWN0aXZhdGVzIGluIGxhcmdlCiAgOzsg
YnVmZmVycyBpbnN0ZWFkIG9mIHJlZnVzaW5nLiAgYHRyZWVzaXQtcmVhZHktcCcgd291bGQgb3Ro
ZXJ3aXNlCiAgOzsgcmVmdXNlIGFuZCBlbWl0IGEgbWlzbGVhZGluZyAicGFyc2VycyBub3QgZm91
bmQiIG1lc3NhZ2UgZXZlbiB3aGVuCiAgOzsgdGhleSBhcmUgaW5zdGFsbGVkLiAgUmV2aXNpdCBp
ZiBgdHJlZXNpdC1wYXJzZXItY3JlYXRlJyBnYWlucyBpdHMKICA7OyBvd24gYnVmZmVyLXNpemUg
Z3VhcmQgKHNlZSBidWcjODA5MDkpLgogIChsZXQgKCh0cmVlc2l0LW1heC1idWZmZXItc2l6ZSBt
b3N0LXBvc2l0aXZlLWZpeG51bSkpCiAgICAoY29uZCAoKHRyZWVzaXQtcmVhZHktcCAnKG1hcmtk
b3duIG1hcmtkb3duLWlubGluZSkgdCkKICAgICAgICAgICAobWFya2Rvd24tdHMtLXNldC11cCkp
CiAgICAgICAgICAodAogICAgICAgICAgICh3YXJuICJtYXJrZG93bi10cy1tb2RlIGNhbm5vdCBi
ZSBzZXQgdXA7IHVzaW5nIGZ1bmRhbWVudGFsLW1vZGUuClRoZSB0cmVlLXNpdHRlciBwYXJzZXJz
IGBtYXJrZG93bicgYW5kIGBtYXJrZG93bi1pbmxpbmUnIHdlcmUgbm90IGZvdW5kLgpVc2UgdGhl
IGNvbW1hbmQgYG1hcmtkb3duLXRzLW1vZGUtaW5zdGFsbC1wYXJzZXJzJyB0byBpbnN0YWxsIHRo
ZW0uCldpdGggYSBwcmVmaXggYXJndW1lbnQsIGl0IGNhbiBhbHNvIGluc3RhbGwgb3B0aW9uYWwg
cGFyc2Vycy4iKQogICAgICAgICAgIChmdW5kYW1lbnRhbC1tb2RlKSkpKSkKCjs7OyMjI2F1dG9s
b2FkCihkZWZpbmUtZGVyaXZlZC1tb2RlIG1hcmtkb3duLXRzLW1vZGUgdGV4dC1tb2RlICJNYXJr
ZG93biIKICAiTWFqb3IgbW9kZSBmb3IgZWRpdGluZyBNYXJrZG93biB1c2luZyB0cmVlLXNpdHRl
ciBncmFtbWFyLgpOT1RFOiBTZWUgYG1hcmtkb3duLXRzLS1zZXQtdXAtaW5saW5lJy4iCiAgKG1h
cmtkb3duLXRzLW1vZGUtLWluaXRpYWxpemUpKQoKKGRlcml2ZWQtbW9kZS1hZGQtcGFyZW50cyAn
bWFya2Rvd24tdHMtbW9kZSAnKG1hcmtkb3duLW1vZGUpKQoKOzs7IFZpZXcgbW9kZToKCjs7OyMj
I2F1dG9sb2FkCihkZWZpbmUtZGVyaXZlZC1tb2RlIG1hcmtkb3duLXRzLXZpZXctbW9kZQogIG5p
bCA7IEludGVudGlvbmFsbHkgbGVmdCBibGFuay4KICAiTWFya2Rvd24gVmlldyIKICAiTWFqb3Ig
bW9kZSBmb3IgcmVhZC1vbmx5IHZpZXdpbmcgTWFya2Rvd24gdXNpbmcgdHJlZS1zaXR0ZXIgZ3Jh
bW1hci4iCiAgOzsgTk9URTogYG1hcmtkb3duLXRzLW1vZGUnIGlzIG1hbnVhbGx5IGFkZGVkIGFz
IGEgcGFyZW50IHRvIGF2b2lkCiAgOzsgaW52b2tpbmcgaXRzIGluaXRpYWxpemF0aW9uIGJlZm9y
ZSB3ZSBzZXQgb3ZlcnJpZGUgdmFyaWFibGVzLgogIChzZXRxLWxvY2FsIG1hcmtkb3duLXRzLW1l
bnUtYmFyLXNob3cgbmlsKQogIChzZXRxLWxvY2FsIG1hcmtkb3duLXRzLWhpZGUtbWFya3VwIHQp
CiAgKHNldHEtbG9jYWwgbWFya2Rvd24tdHMtaW5saW5lLWltYWdlcyB0KQogIChzZXRxLWxvY2Fs
IG1hcmtkb3duLXRzLWhhcmQtbGluZS1icmVhay1iYWNrc2xhc2ggJ2hpZGUpCiAgKHNldHEtbG9j
YWwgbWFya2Rvd24tdHMtaGFyZC1saW5lLWJyZWFrLXNwYWNlICdoaWRlKQogIChzZXRxLWxvY2Fs
IG1hcmtkb3duLXRzLWZvbnRpZnktY29kZS1ibG9ja3MtbmF0aXZlbHkgdCkKICAoc2V0cS1sb2Nh
bCBtYXJrZG93bi10cy1lbmFibGUtY29kZS1ibG9jay1jb250ZXh0LW1vZGUgbmlsKQogIChzZXRx
LWxvY2FsIG1hcmtkb3duLXRzLWVuYWJsZS10YWJsZS1tb2RlIG5pbCkKICAocnVuLWhvb2tzICdt
YXJrZG93bi10cy12aWV3LW1vZGUtcHJlLWluaXQtaG9vaykKICAobWFya2Rvd24tdHMtbW9kZS0t
aW5pdGlhbGl6ZSkKICAoc2V0cSBidWZmZXItcmVhZC1vbmx5IHQpKQoKKGRlcml2ZWQtbW9kZS1h
ZGQtcGFyZW50cyAnbWFya2Rvd24tdHMtdmlldy1tb2RlICcobWFya2Rvd24tdHMtbW9kZSBzcGVj
aWFsLW1vZGUpKQoKOzs7IE1vZGUgdXRpbGl0aWVzOgoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIG1h
cmtkb3duLXRzLWJ1ZmZlci1zdHJpbmcgKCkKICAiTGlrZSBgYnVmZmVyLXN0cmluZycsIGFuZCBj
b252ZXJ0IG92ZXJsYXkgcHJvcGVydGllcyB0byB0ZXh0IHByb3BlcnRpZXMuIgogIChsZXQgKChz
dHIgKGJ1ZmZlci1zdHJpbmcpKSkKICAgIChkb2xpc3QgKG92IChvdmVybGF5cy1pbiAocG9pbnQt
bWluKSAocG9pbnQtbWF4KSkgc3RyKQogICAgICAod2hlbi1sZXQqICgoZmFjZSAob3ZlcmxheS1n
ZXQgb3YgJ2ZhY2UpKSkKICAgICAgICAoZm9udC1sb2NrLWFwcGVuZC10ZXh0LXByb3BlcnR5CiAg
ICAgICAgIChvdmVybGF5LXN0YXJ0IG92KSAob3ZlcmxheS1lbmQgb3YpICdmYWNlIGZhY2Ugc3Ry
KSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tYmFyZi1pZi1ub3QtbW9kZSAoJm9wdGlvbmFsIGNv
bnRleHQpCiAgIlNpZ25hbCBhbiBlcnJvciBpZiB0aGUgY3VycmVudCBidWZmZXIgaXMgbm90IGEg
YG1hcmtkb3duLXRzLW1vZGUnIGJ1ZmZlci4KUHJlZml4IHRoZSBlcnJvciBtZXNzYWdlIHdpdGgg
Q09OVEVYVC4iCiAgKHVubGVzcyAoZGVyaXZlZC1tb2RlLXAgJ21hcmtkb3duLXRzLW1vZGUpCiAg
ICAodXNlci1lcnJvciAiJXNpcyB2YWxpZCBvbmx5IGluIGBtYXJrZG93bi10cy1tb2RlJyBidWZm
ZXJzIgogICAgICAgICAgICAgICAgKGlmIGNvbnRleHQgKGZvcm1hdCAiJXM6ICIgY29udGV4dCkg
IiIpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtYWRkLWZpbmFsLW5ld2xpbmUgKCkKICAiQWRkIGEg
ZmluYWwgbmV3bGluZSB0byB0aGUgY3VycmVudCBidWZmZXIsIGlmIG5lY2Vzc2FyeS4iCiAgOzsg
SW5zcGlyZWQgYnkgZmlsZXMuZWwuCiAgKGxldCAoKGluaGliaXQtcmVhZC1vbmx5IHQpKQogICAg
KHdoZW4gKG9yIChlcSAoYnVmZmVyLXNpemUpIDApCiAgICAgICAgICAgICAgKGFuZCAoLz0gKGNo
YXItYWZ0ZXIgKDEtIChwb2ludC1tYXgpKSkgP1xuKQogICAgICAgICAgICAgICAgICAgKG5vdCAo
YW5kIChlcSBzZWxlY3RpdmUtZGlzcGxheSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICg9IChjaGFyLWFmdGVyICgxLSAocG9pbnQtbWF4KSkpID9ccikpKSkpCiAgICAgIChzYXZlLWV4
Y3Vyc2lvbgogICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCiAgICAgICAgKGluc2VydCA/
XG4pKSkpKQoKKGRlZmluZS1taW5vci1tb2RlIG1hcmtkb3duLXRzLWNvZGUtYmxvY2staW4tY29u
dGV4dC1tb2RlCiAgIk1pbm9yIG1vZGUgZW5hYmxlZCBpZiBwb2ludCBpcyB3aXRoaW4gYSBmZW5j
ZWQgY29kZSBibG9jay4KVGhpcyBlbmFibGVzIHRoZSBrZXltYXAgYG1hcmtkb3duLXRzLWNvZGUt
YmxvY2staW4tY29udGV4dC1tb2RlLW1hcCcuIgogIDpncm91cCAnbWFya2Rvd24tdHMKICA6bGln
aHRlciBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZS1saWdodGVyCiAgOmlu
dGVyYWN0aXZlIG5pbAogIChtYXJrZG93bi10cy0tY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUt
dXBkYXRlLW92KSkKCihkZWZ2YXItbG9jYWwgbWFya2Rvd24tdHMtLWNvZGUtYmxvY2staW4tY29u
dGV4dC1tb2RlLW92IG5pbCkKCihkZWZ1biBtYXJrZG93bi10cy0tY29kZS1ibG9jay1pbi1jb250
ZXh0LW1vZGUtdXBkYXRlLW92ICgpCiAgIk1hbmFnZSBgbWFya2Rvd24tdHMtLWNvZGUtYmxvY2st
aW4tY29udGV4dC1tb2RlLW92Jy4iCiAgKGNvbmQgKG1hcmtkb3duLXRzLWNvZGUtYmxvY2staW4t
Y29udGV4dC1tb2RlCiAgICAgICAgIChsZXQgKChiZWcgKGdldC1jaGFyLXByb3BlcnR5IChwb2lu
dCkgJ21hcmtkb3duLXRzLWNvZGUtYmVnLW1hcmtlcikpCiAgICAgICAgICAgICAgIChlbmQgKGdl
dC1jaGFyLXByb3BlcnR5IChwb2ludCkgJ21hcmtkb3duLXRzLWNvZGUtZW5kLW1hcmtlcikpKQog
ICAgICAgICAgIChpZiBtYXJrZG93bi10cy0tY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUtb3YK
ICAgICAgICAgICAgICAgKG1vdmUtb3ZlcmxheSBtYXJrZG93bi10cy0tY29kZS1ibG9jay1pbi1j
b250ZXh0LW1vZGUtb3YgYmVnIGVuZCkKICAgICAgICAgICAgIChzZXRxIG1hcmtkb3duLXRzLS1j
b2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZS1vdgogICAgICAgICAgICAgICAgICAgKG1ha2Utb3Zl
cmxheSBiZWcgZW5kIG5pbCB0IG5pbCkpKQogICAgICAgICAgIChvdmVybGF5LXB1dCBtYXJrZG93
bi10cy0tY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUtb3YKICAgICAgICAgICAgICAgICAgICAg
ICAgJ21hcmtkb3duLXRzLWluLWNvZGUtYmxvY2sgdCkKICAgICAgICAgICAob3ZlcmxheS1wdXQg
bWFya2Rvd24tdHMtLWNvZGUtYmxvY2staW4tY29udGV4dC1tb2RlLW92CiAgICAgICAgICAgICAg
ICAgICAgICAgICdldmFwb3JhdGUgdCkKICAgICAgICAgICAob3ZlcmxheS1wdXQgbWFya2Rvd24t
dHMtLWNvZGUtYmxvY2staW4tY29udGV4dC1tb2RlLW92CiAgICAgICAgICAgICAgICAgICAgICAg
ICdwcmlvcml0eSAnKG5pbCAuIDIwKSkKICAgICAgICAgICAob3ZlcmxheS1wdXQgbWFya2Rvd24t
dHMtLWNvZGUtYmxvY2staW4tY29udGV4dC1tb2RlLW92CiAgICAgICAgICAgICAgICAgICAgICAg
ICdmYWNlICdtYXJrZG93bi10cy1pbi1jb2RlLWJsb2NrKSkpCiAgICAgICAgKHQKICAgICAgICAg
KHdoZW4gbWFya2Rvd24tdHMtLWNvZGUtYmxvY2staW4tY29udGV4dC1tb2RlLW92CiAgICAgICAg
ICAgKGRlbGV0ZS1vdmVybGF5IG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9k
ZS1vdikpKSkpCgooZGVmaW5lLW1pbm9yLW1vZGUgbWFya2Rvd24tdHMtY29kZS1ibG9jay1jb250
ZXh0LW1vZGUKICAiTWlub3IgbW9kZSB0byBlbmFibGUgY29tbWFuZHMgaW4gZmVuY2VkIGNvZGUg
YmxvY2sgY29udGV4dC4KSWYgbm9uLW5pbCBhbmQgYHBvaW50JyBpcyBpbiBhIGZlbmNlZCBjb2Rl
IGJsb2NrLCBydW4gYGluZGVudC1mb3ItdGFiLWNvbW1hbmQnLApgbmV3bGluZScsIGV0LmFsLiwg
aW4gdGhlIG1vZGUgb2YgdGhlIGNvZGUgYmxvY2suIgogIDpncm91cCAnbWFya2Rvd24tdHMKICA6
aW50ZXJhY3RpdmUgbmlsCiAgKG1hcmtkb3duLXRzLS1iYXJmLWlmLW5vdC1tb2RlICdtYXJrZG93
bi10cy1jb2RlLWJsb2NrLWNvbnRleHQtbW9kZSkKICAoY29uZCAobWFya2Rvd24tdHMtY29kZS1i
bG9jay1jb250ZXh0LW1vZGUKICAgICAgICAgOzsgRW5hYmxlIHRoZSBtaW5vciBtb2RlIGBtYXJr
ZG93bi10cy1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZScgYW5kCiAgICAgICAgIDs7IGl0cyBr
ZXltYXAgd2hlbiBwb2ludCBpcyB3aXRoaW4gYSBjb2RlIGJsb2NrLgogICAgICAgICAoYWRkLWhv
b2sgJ3Bvc3QtY29tbWFuZC1ob29rCiAgICAgICAgICAgICAgICAgICAjJ21hcmtkb3duLXRzLS1l
bmFibGUtY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUgbmlsICdsb2NhbCkKICAgICAgICAgOzsg
SWYgYHNhdmUtcGxhY2UtbW9kZScgb3Igc2ltaWxhciBpcyB1c2VkLCBwb2ludCBjb3VsZCBzdGFy
dCB3aXRoaW4KICAgICAgICAgOzsgYSBjb2RlIGJsb2NrIHNvIGluaXRpYWxpemUgZnJvbSB0aGF0
IHN0YXRlLgogICAgICAgICAocnVuLXdpdGgtdGltZXIgMC4wMSBuaWwKICAgICAgICAgICAgICAg
ICAgICAgICAgICMnbWFya2Rvd24tdHMtLWVuYWJsZS1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9k
ZSkKICAgICAgICAgOzsgRm9yIGVhY2ggZWxpZ2libGUgY29tbWFuZCwgZXhlY3V0ZSBpdCBpbiBh
IGNvZGUtYmxvY2sgY29udGV4dCwKICAgICAgICAgOzsgb3RoZXJ3aXNlIGluIHRoZSBgbWFya2Rv
d24tdHMtbW9kZScgYnVmZmVyJ3MgY29udGV4dC4KICAgICAgICAgKGFkZC1ob29rICdwcmUtY29t
bWFuZC1ob29rCiAgICAgICAgICAgICAgICAgICAjJ21hcmtkb3duLXRzLS1tYXliZS1ydW4tY29t
bWFuZC1pbi1jb2RlLWJsb2NrIG5pbCAnbG9jYWwpCiAgICAgICAgIDs7IFBydW5lIHN0YWxlIGNv
ZGUgYmxvY2sgb3ZlcmxheXMgd2hlbiB0aGUgaG9zdCBwYXJzZSB0cmVlCiAgICAgICAgIDs7IGNo
YW5nZXMgKGUuZy4sIHdoZW4gZmVuY2VkIGNvZGUgYmxvY2sgZGVsaW1pdGVycyBhcmUKICAgICAg
ICAgOzsgZGVsZXRlZCBidXQgdGhlIG92ZXJsYXkgZnJvbSBhIHByaW9yIGZvbnRpZmljYXRpb24g
cmVtYWlucykuCiAgICAgICAgICh0cmVlc2l0LXBhcnNlci1hZGQtbm90aWZpZXIKICAgICAgICAg
IHRyZWVzaXQtcHJpbWFyeS1wYXJzZXIKICAgICAgICAgICMnbWFya2Rvd24tdHMtLWhvc3QtcmFu
Z2VzLW5vdGlmaWVyKSkKICAgICAgICAodAogICAgICAgICAocmVtb3ZlLWhvb2sgJ3Bvc3QtY29t
bWFuZC1ob29rCiAgICAgICAgICAgICAgICAgICAgICAjJ21hcmtkb3duLXRzLS1lbmFibGUtY29k
ZS1ibG9jay1pbi1jb250ZXh0LW1vZGUgJ2xvY2FsKQogICAgICAgICAocmVtb3ZlLWhvb2sgJ3By
ZS1jb21tYW5kLWhvb2sKICAgICAgICAgICAgICAgICAgICAgICMnbWFya2Rvd24tdHMtLW1heWJl
LXJ1bi1jb21tYW5kLWluLWNvZGUtYmxvY2sgJ2xvY2FsKQogICAgICAgICAodHJlZXNpdC1wYXJz
ZXItcmVtb3ZlLW5vdGlmaWVyCiAgICAgICAgICB0cmVlc2l0LXByaW1hcnktcGFyc2VyCiAgICAg
ICAgICAjJ21hcmtkb3duLXRzLS1ob3N0LXJhbmdlcy1ub3RpZmllcikpKSkKCihkZWZpbmUtbWlu
b3ItbW9kZSBtYXJrZG93bi10cy1pbi10YWJsZS1tb2RlCiAgIk1pbm9yIG1vZGUgZW5hYmxlZCBp
ZiBwb2ludCBpcyB3aXRoaW4gYSB0YWJsZS4KVGhpcyBlbmFibGVzIHRoZSBrZXltYXAgYG1hcmtk
b3duLXRzLWluLXRhYmxlLW1vZGUtbWFwJy4iCiAgOmdyb3VwICdtYXJrZG93bi10cwogIDpsaWdo
dGVyIG1hcmtkb3duLXRzLWluLXRhYmxlLW1vZGUtbGlnaHRlcgogIDppbnRlcmFjdGl2ZSBuaWwK
ICAobWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtdXBkYXRlLW92KSkKCihkZWZ2YXItbG9jYWwg
bWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtb3YgbmlsKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1p
bi10YWJsZS1tb2RlLWdldC1vdiAocG9zKQogICJSZXR1cm4gdGhlIGBtYXJrZG93bi10cy1pbi10
YWJsZS1tb2RlJyBvdmVybGF5IGF0IFBPUy4iCiAgKHNlcS1maW5kIChsYW1iZGEgKG92KQogICAg
ICAgICAgICAgICh3aGVuIChvdmVybGF5LWdldCBvdiAnbWFya2Rvd24tdHMtaW4tdGFibGUpCiAg
ICAgICAgICAgICAgICBvdikpCiAgICAgICAgICAgIChvdmVybGF5cy1hdCBwb3MpKSkKCihkZWZ1
biBtYXJrZG93bi10cy0tdGFibGUtdGljay11cGRhdGUgKHBvcykKICAiVXBkYXRlIHRoZSBgbWFy
a2Rvd24tdHMtaW4tdGFibGUtbW9kZScgb3ZlcmxheSB0aWNrIGF0IFBPUy4KSWYgdGhlIG92ZXJs
YXkgaXMgbm90IGZvdW5kLCBkbyBub3RoaW5nLiIKICAod2hlbi1sZXQqICgob3YgKG1hcmtkb3du
LXRzLS1pbi10YWJsZS1tb2RlLWdldC1vdiBwb3MpKSkKICAgIChvdmVybGF5LXB1dCBvdgogICAg
ICAgICAgICAgICAgICdtYXJrZG93bi10cy1pbi10YWJsZS10aWNrCiAgICAgICAgICAgICAgICAg
KGJ1ZmZlci1jaGFycy1tb2RpZmllZC10aWNrKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS10YWJs
ZS10aWNrLXN0YWxlLXAgKHBvcykKICAiUmV0dXJuIG5vbi1uaWwgaWYgdGhlIHRhYmxlIGF0IFBP
UyBtaWdodCBoYXZlIGNoYW5nZWQuCkl0IGlzIHVwIHRvIHRoaXMgZnVuY3Rpb24ncyBjYWxsZXJz
IHRvIGNhbGwKYG1hcmtkb3duLXRzLS10YWJsZS10aWNrLXVwZGF0ZScuIgogICh3aGVuLWxldCog
KChvdiAobWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtZ2V0LW92IHBvcykpKQogICAgKG5vdCAo
ZXEgKG92ZXJsYXktZ2V0IG92ICdtYXJrZG93bi10cy1pbi10YWJsZS10aWNrKQogICAgICAgICAg
ICAgKGJ1ZmZlci1jaGFycy1tb2RpZmllZC10aWNrKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0t
aW4tdGFibGUtbW9kZS11cGRhdGUtb3YgKCkKICAiTWFuYWdlIGBtYXJrZG93bi10cy0taW4tdGFi
bGUtbW9kZS1vdicuIgogIChjb25kIChtYXJrZG93bi10cy1pbi10YWJsZS1tb2RlCiAgICAgICAg
ICh3aGVuLWxldCogKChhdC10YWJsZSAobWFya2Rvd24tdHMtYXQtdGFibGUtcCBuaWwgdCkpCiAg
ICAgICAgICAgICAgICAgICAgICh0YWJsZSAoY2RyIGF0LXRhYmxlKSkKICAgICAgICAgICAgICAg
ICAgICAgKGJlZyAodHJlZXNpdC1ub2RlLXN0YXJ0IHRhYmxlKSkKICAgICAgICAgICAgICAgICAg
ICAgKGVuZCAodHJlZXNpdC1ub2RlLWVuZCB0YWJsZSkpKQogICAgICAgICAgIChpZiBtYXJrZG93
bi10cy0taW4tdGFibGUtbW9kZS1vdgogICAgICAgICAgICAgICA7OyBNb3ZlIHRoZSBvdmVybGF5
LCBpZiBuZWVkZWQsIGFuZCByZXNldCB0aGUgdGljayBpZiBzby4KICAgICAgICAgICAgICAgKHdo
ZW4gKG5vdCAoZXEgKG92ZXJsYXktc3RhcnQgbWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtb3Yp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZykpCiAgICAgICAgICAgICAgICAgKG1v
dmUtb3ZlcmxheSBtYXJrZG93bi10cy0taW4tdGFibGUtbW9kZS1vdiBiZWcgZW5kKQogICAgICAg
ICAgICAgICAgIChvdmVybGF5LXB1dCBtYXJrZG93bi10cy0taW4tdGFibGUtbW9kZS1vdgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFya2Rvd24tdHMtaW4tdGFibGUtdGljayBuaWwp
KQogICAgICAgICAgICAgKHNldHEgbWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtb3YKICAgICAg
ICAgICAgICAgICAgIChtYWtlLW92ZXJsYXkgYmVnIGVuZCBuaWwgdCBuaWwpKSkKICAgICAgICAg
ICAob3ZlcmxheS1wdXQgbWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtb3YKICAgICAgICAgICAg
ICAgICAgICAgICAgJ21hcmtkb3duLXRzLWluLXRhYmxlIHQpCiAgICAgICAgICAgKG92ZXJsYXkt
cHV0IG1hcmtkb3duLXRzLS1pbi10YWJsZS1tb2RlLW92CiAgICAgICAgICAgICAgICAgICAgICAg
ICdldmFwb3JhdGUgdCkKICAgICAgICAgICAob3ZlcmxheS1wdXQgbWFya2Rvd24tdHMtLWluLXRh
YmxlLW1vZGUtb3YKICAgICAgICAgICAgICAgICAgICAgICAgJ3ByaW9yaXR5ICcobmlsIC4gMjAp
KQogICAgICAgICAgIChvdmVybGF5LXB1dCBtYXJrZG93bi10cy0taW4tdGFibGUtbW9kZS1vdgog
ICAgICAgICAgICAgICAgICAgICAgICAnZmFjZSAnbWFya2Rvd24tdHMtaW4tdGFibGUpCiAgICAg
ICAgICAgKSkKICAgICAgICAodAogICAgICAgICAod2hlbiBtYXJrZG93bi10cy0taW4tdGFibGUt
bW9kZS1vdgogICAgICAgICAgIChkZWxldGUtb3ZlcmxheSBtYXJrZG93bi10cy0taW4tdGFibGUt
bW9kZS1vdikpKSkpCgooZGVmaW5lLW1pbm9yLW1vZGUgbWFya2Rvd24tdHMtdGFibGUtbW9kZQog
ICJNaW5vciBtb2RlIHRvIGVuYWJsZSBjb21tYW5kcyBpbiB0YWJsZXMuCklmIG5vbi1uaWwgYW5k
IGBwb2ludCcgaXMgaW4gYSB0YWJsZSwgZW5hYmxlCmBtYXJrZG93bi10cy1pbi10YWJsZS1tb2Rl
Jy4iCiAgOmdyb3VwICdtYXJrZG93bi10cwogIDppbnRlcmFjdGl2ZSBuaWwKICAobWFya2Rvd24t
dHMtLWJhcmYtaWYtbm90LW1vZGUgJ21hcmtkb3duLXRzLXRhYmxlLW1vZGUpCiAgKGNvbmQgKG1h
cmtkb3duLXRzLXRhYmxlLW1vZGUKICAgICAgICAgOzsgRW5hYmxlIHRoZSBtaW5vciBtb2RlIGBt
YXJrZG93bi10cy1pbi10YWJsZS1tb2RlJyBhbmQKICAgICAgICAgOzsgaXRzIGtleW1hcCB3aGVu
IHBvaW50IGlzIHdpdGhpbiBhIGNvZGUgYmxvY2suCiAgICAgICAgIChhZGQtaG9vayAncG9zdC1j
b21tYW5kLWhvb2sKICAgICAgICAgICAgICAgICAgICMnbWFya2Rvd24tdHMtLWVuYWJsZS1pbi10
YWJsZS1tb2RlIG5pbCAnbG9jYWwpCiAgICAgICAgIDs7IElmIGBzYXZlLXBsYWNlLW1vZGUnIG9y
IHNpbWlsYXIgaXMgdXNlZCwgcG9pbnQgY291bGQgc3RhcnQgd2l0aGluCiAgICAgICAgIDs7IGEg
dGFibGUsIHNvIGluaXRpYWxpemUgZnJvbSB0aGF0IHN0YXRlLgogICAgICAgICAocnVuLXdpdGgt
dGltZXIgMC4wMSBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICMnbWFya2Rvd24tdHMtLWVu
YWJsZS1pbi10YWJsZS1tb2RlKSkKICAgICAgICAodAogICAgICAgICAocmVtb3ZlLWhvb2sgJ3Bv
c3QtY29tbWFuZC1ob29rCiAgICAgICAgICAgICAgICAgICAgICAjJ21hcmtkb3duLXRzLS1lbmFi
bGUtaW4tdGFibGUtbW9kZSAnbG9jYWwpKSkpCgo7OzsjIyNhdXRvbG9hZAood2hlbiAoYm91bmRw
ICd0cmVlc2l0LW1ham9yLW1vZGUtcmVtYXAtYWxpc3QpCiAgKGFkZC10by1saXN0ICdhdXRvLW1v
ZGUtYWxpc3QgJygiXFwubWRcXCciIC4gbWFya2Rvd24tdHMtbW9kZSkpCiAgKGFkZC10by1saXN0
ICdhdXRvLW1vZGUtYWxpc3QgJygiXFwubWFya2Rvd25cXCciIC4gbWFya2Rvd24tdHMtbW9kZSkp
CiAgKGFkZC10by1saXN0ICdhdXRvLW1vZGUtYWxpc3QgJygiXFwubWR4XFwnIiAuIG1hcmtkb3du
LXRzLW1vZGUpKQogIChhZGQtdG8tbGlzdCAndHJlZXNpdC1tYWpvci1tb2RlLXJlbWFwLWFsaXN0
CiAgICAgICAgICAgICAgICcobWFya2Rvd24tbW9kZSAuIG1hcmtkb3duLXRzLW1vZGUpKSkKCihw
cm92aWRlICdtYXJrZG93bi10cy1tb2RlKQo7OzsgbWFya2Rvd24tdHMtbW9kZS5lbCBlbmRzIGhl
cmUK
--=-=-=--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 13 May 2026 18:07:55 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed May 13 14:07:54 2026
Received: from localhost ([127.0.0.1]:54008 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wNDzu-0004ua-8W
	for submit <at> debbugs.gnu.org; Wed, 13 May 2026 14:07:54 -0400
Received: from mail-vk1-xa35.google.com ([2607:f8b0:4864:20::a35]:46184)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1wNDzr-0004uC-Ia
 for 81019 <at> debbugs.gnu.org; Wed, 13 May 2026 14:07:51 -0400
Received: by mail-vk1-xa35.google.com with SMTP id
 71dfb90a1353d-56739adfa1aso4770467e0c.0
 for <81019 <at> debbugs.gnu.org>; Wed, 13 May 2026 11:07:51 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1778695671; cv=none;
 d=google.com; s=arc-20240605;
 b=SNsR6kRkCNrbHF3FiveHvlEkdHMNfJe0Yi85usXFAdsPYuuluGMHkNpgSReBqm7IKz
 E4Vu+2cvwweW9fNeuw+qUsEtgbaZxAOsTyQE3jZw8mSiBFA2WLksFWWeWzXoD5LNqMBx
 uhyIOzAelbFRZcQEckrQXu6Fv66oq45YeQfERqjSJWpKoi8VWC0uNiBjCMz3M0uep1iT
 RS7T3WFRj/Pdbf7j+bF3c+sYgyZZLj/VThWv6mo0vXlgBhy2eFs4Woh0lSeclY6917W2
 x1Gc4tTnHY9gZ8qY339l/jZFRd1scXxVw4kmBR4FnTgnEU9zZeBEbvkBHavV34vMVxBv
 mNEA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;
 s=arc-20240605; 
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:dkim-signature;
 bh=Q6W/MEld5aC7K6s9H2MUJT9vyZ0B7n+NL5/3p+Qg/Ik=;
 fh=nIqdxicWJMiPUvbui5snwxlQy7CPtRdu6QcZnw4EIyw=;
 b=D2i990istV+2+3yWT7aV6SuAmbOFgV7wASX6pKhttwNlr5xv9cu9lC5h/kFC4JdMeV
 ywwAYHhUodFaZzF7A0vYH6nGn9PE3yj7d9h4AE9woFxDMjlWThjv8yK7ExeK7Z3c9oxW
 o4Hr0BNbwMcaPdOwFjKy4ESPtoCrmaTf4O4WyaGLcyvH2i8uhTj2nOyK1kVoxUMoVU7f
 qdg79o/hoz7uiLtonLq7j12Gb56ns7F5dhMeUZ8MiNiWnZBihEaV8AQ/quFXA/STX93j
 toO4xUF0JQkYz4Q/Y5TI83gbQP40hz+MCMcIw8RQo2eJPoCFdMCkHdog2/JsnPC8XXt4
 Jg9w==; darn=debbugs.gnu.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1778695671; x=1779300471; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=Q6W/MEld5aC7K6s9H2MUJT9vyZ0B7n+NL5/3p+Qg/Ik=;
 b=UPH8LkGhJ2yXPz1GCpAme0blBwRL1YjqdfygSsLMA6c94L7OAmA0s1k6OJUUR7hxkp
 RCltOPgmasViaKKVz4xKKKgB58NLa463VkzJ+cZWyqwSfPu9O33tnws4E9zi9anyMB6x
 LQ2CkU/dTFZY20e707ELY5QNVoiXn6sL/lMF8E8fJxd1hk/sTPpH8BNPZTI3vsuY5hH2
 mspBddBHZZTUP6mfjHOk9+im2jt/H0tK1Ms46JCEZXIlER2UfbyjwKV4t7C3oidNn0AA
 00FBytfqqMZkFqmolY5yD3PFx9Ix7OKTe2n0JanfGoo8H9XwtIELNtCErL/xOQjM+nk0
 /sXA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1778695671; x=1779300471;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=Q6W/MEld5aC7K6s9H2MUJT9vyZ0B7n+NL5/3p+Qg/Ik=;
 b=BAog9eUc4XEAcFhCsxgpAzav/XRZF4GqKw1n4SjGAJNCjm70QxvP54MCfbEx5pwTw+
 UNGPlB2sRNxe9L8ALfKnzeKV83EUvY5LAnsGgZ6HtHzVZ+D7t9jG+LsgAxaqsNLGBZZ3
 bxcP8JwEeGaVfRMAhY9sH1LaYHrJY4sAuETqsO//1MdOBEK4U7F4mXbzXCwGEtMCQ/dK
 WwSYCf4WMBbaincmnASEGXMwnQf7BhDs/2HAuxRK02CqDYYlP5vSMh6uBMVdaSPaMwA3
 wUsAT67OPGZDHEpQ+valJRaQlsCZz7ed9kmQQ8q5gD0zhHC8V5aY+2hq4dMaOkv5jx7U
 Uflg==
X-Forwarded-Encrypted: i=1;
 AFNElJ91/j1sowiBeUOEYtdTH4so33S7FItZ7ESE9XmRcOejcJ8PaZOj4VKx2D1dFBW/lZrUTjMFBg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YzNBBirsLt2Udjnf+tN5XpfuC3VH/avejoIfMSt69t0byDcJzaj
 /0bo4HC8lvG+0qgkgIXJtdHGKw3gZArqj8pY9bwXQjoIfrSTefLpSmBgbWy/L7evcSlYSLOaCw7
 YwuPVqRhUMYDSs/pTdPR/+UCkTJljrOg=
X-Gm-Gg: Acq92OEjr1jrxoNhIpuFMJxWsQs60+5DbccgwqxHrR8i8bcf10YNKEyx7thO1a3pIWe
 nAjE6DrknEwlzeVVKa2ns5BDqlwXO4uE7+MGr7IKcXaRLKnEW+ru06sVG0E4UKSTpkFEmJ22xVb
 MkNUHFJyqGNTgzP3atcfo94fYkvxqto/ySrzYN+M69ANo+lRprlbhv730P1Qd1nuYNenWd9FrJh
 eCizL22oqbmNmv/6sOptC1algLPrwt0Ox+/G2jpqp9dP9ZThya3j1Vd++AUd75VGrPCb4VsUfhX
 N/C8OmHSI4kJYFI9SrLM5SGbbztd4O7l2oD9LTOMlcBoN098EGGTHepodveFRoIgLzWuFa6NHFx
 hJGuc5kE1Bqt2/f9+Gpd49hZ6xC6+LwDbacbmR61D0U8Zr5U=
X-Received: by 2002:a05:6122:6187:b0:567:4e8a:fb13 with SMTP id
 71dfb90a1353d-575e6fc03eamr1909784e0c.8.1778695670561; Wed, 13 May 2026
 11:07:50 -0700 (PDT)
MIME-Version: 1.0
References: <m2se7xg9ce.fsf@HIDDEN>
 <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
In-Reply-To: <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Wed, 13 May 2026 14:07:39 -0400
X-Gm-Features: AVHnY4KiXnI3Yg6CpKiVyPCOX5uDMgmWHh3ERP6fFWp3ZbjmQq8Gq9BiUFsjjPQ
Message-ID: <CAN+1HboemfxdPz_Y9UXzqp+CuMmr1ck=dCxP6LCcGVfK9DWVLQ@HIDDEN>
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
To: Yuan Fu <casouri@HIDDEN>
Content-Type: multipart/mixed; boundary="0000000000009c770d0651b6dbe8"
X-Debbugs-Envelope-To: 81019
Cc: Rahul Martim Juliato <rahuljuliato@HIDDEN>, 81019 <at> debbugs.gnu.org,
 Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>

--0000000000009c770d0651b6dbe8
Content-Type: multipart/alternative; boundary="0000000000009c770b0651b6dbe6"

--0000000000009c770b0651b6dbe6
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Wed, May 13, 2026 at 11:37=E2=80=AFAM Yuan Fu <casouri@HIDDEN> wrote:

>
>
> > On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato <
> rahuljuliato@HIDDEN> wrote:
> >
> > Hello,
> >
> > While debugging an "it doesn't fontify" report against markdown-ts-mode=
,
> > I ended up in treesit.el territory and would like a second opinion
> > before assuming I've correctly identified the layer the fix belongs in.
> >
> > The bug shows up easily in markdown-ts-mode but I suspect it can hit an=
y
> > major mode that drives local parsers via `treesit-range-rules' with
> > `:local t'. markdown-ts just exercises that path very heavily (one loca=
l
> > `markdown-inline' parser per paragraph), so we are likely seeing
> > spoilers ahead of the html and other multi-parser modes.
> >
> >
> > How to Reproduce:
> > -----------------
> >
> > 1. emacs -Q on current master.
> > 2. M-x markdown-ts-mode.
> > 3. Insert a backtick code span on its own line, for example:
> >
> >       `foo`
> >
> >       `codium  `
> >
> >   typing the second line character by character and stopping right
> >   after the closing backtick. Do not press RET afterwards.
> >
> > 4. The first code span is fontified. The second is not.
> >
> > 5. Press RET. The second code span now fontifies correctly.
> >
> > `(font-lock-flush)' + `(font-lock-ensure)' do not fix it. Calling
> > `(treesit-parser-set-included-ranges PR same-ranges)' does not fix
> > it either. The only thing that fixes it without typing further is
> > deleting and recreating the local markdown-inline parser that covers
> > the range.
> >
> >
> > What is happening
> > -----------------
> >
> > The host markdown parser reparses fine and reports the new inline
> > node bounds. The local markdown-inline parser at that range,
> > however, keeps an outdated tree. I confirmed this directly in the
> > bugged buffer:
> >
> >  (buffer-substring 8 18) =3D> "`codium  `"
> >
> >  ;; existing local parser covering (8 . 18)
> >  (treesit-node-string (treesit-parser-root-node pr))
> >    =3D> "(inline)"
> >
> >  ;; force re-set ranges to the same value
> >  (treesit-parser-set-included-ranges pr '((8 . 18)))
> >  (treesit-node-string (treesit-parser-root-node pr))
> >    =3D> "(inline)"
> >
> >  ;; fresh parser, same buffer, same range
> >  (let ((new (treesit-parser-create 'markdown-inline nil t 'embedded)))
> >    (treesit-parser-set-included-ranges new '((8 . 18)))
> >    (treesit-node-string (treesit-parser-root-node new)))
> >    =3D> "(inline (code_span (code_span_delimiter)
> >                            (code_span_delimiter)))"
> >
> > So, same buffer, same range, same grammar, resulting in different tree
> > depending on whether the parser was reused across edits or created
> > fresh.
> >
> > So the grammar, the input, and the range are all fine. What is
> > wrong is the parser's accumulated incremental state.
> >
> > Reading `treesit--update-ranges-local', the reuse path goes through:
> >
> >  (treesit--set-embed-ranges range embedded-parser host-parser)
> >  (move-overlay ov r-start r-end)
> >  (overlay-put ov 'treesit-parser-ov-timestamp modified-tick)
> >
> > Tree-sitter is left to apply the buffered edits on top of its old
> > tree. For markdown-inline plus the backtick code_span rule, that
> > incremental update never re-fires the rule when the closing backtick
> > finally arrives, so the parser stays with `(inline)' empty.
> >
> > Pressing RET escapes the bug. I am not certain why, two candidates:
> > the newline grows the host paragraph past the overlay bounds and
> > `treesit--cleanup-local-range-overlays' deletes the old overlay on
> > the timestamp mismatch, after which a fresh parser is created; or
> > the larger range shift is enough to make tree-sitter invalidate the
> > right subtree and re-evaluate code_span. Either way the practical
> > outcome is the same: only a fresh parser fixes it.
> >
> >
> > My workaround on markdown-ts-mode (for debugging)
> > -------------------------------------------------
> >
> > I made this small interactive helper to help me find the local parser
> > covering point which would them delete its parser + overlay, and create
> > a fresh one on the same range:
> >
> >  (defun my/md-recreate-inline-parser-at-point ()
> >    "Delete stale local markdown-inline parser+overlay covering point,
> recreate."
> >    (interactive)
> >    (let* ((p (point))
> >           (target-ov
> >            (catch 'f
> >              (dolist (ov (overlays-in (point-min) (point-max)))
> >                (let ((pr (overlay-get ov 'treesit-parser)))
> >                  (when (and pr
> >                             (overlay-get ov 'treesit-parser-local-p)
> >                             (eq (treesit-parser-language pr)
> 'markdown-inline)
> >                             (<=3D (overlay-start ov) p (overlay-end ov)=
))
> >                    (throw 'f ov)))))))
> >      (unless target-ov (user-error "No markdown-inline overlay covers
> point"))
> >      (let* ((old-pr (overlay-get target-ov 'treesit-parser))
> >             (host (overlay-get target-ov 'treesit-host-parser))
> >             (level (treesit-parser-embed-level old-pr))
> >             (r-start (overlay-start target-ov))
> >             (r-end (overlay-end target-ov)))
> >        (treesit-parser-delete old-pr)
> >        (delete-overlay target-ov)
> >        (let ((new (treesit-parser-create 'markdown-inline nil t
> 'embedded))
> >              (ov (make-overlay r-start r-end nil nil t)))
> >          (treesit-parser-set-embed-level new level)
> >          (overlay-put ov 'treesit-parser new)
> >          (overlay-put ov 'treesit-parser-local-p t)
> >          (overlay-put ov 'treesit-host-parser host)
> >          (overlay-put ov 'treesit-parser-ov-timestamp
> (buffer-chars-modified-tick))
> >          (treesit-parser-set-included-ranges new `((,r-start . ,r-end))=
)
> >          (font-lock-flush r-start r-end)
> >          (message "Recreated markdown-inline parser for (%d . %d)"
> r-start r-end)))))
> >
> > This always recovers the buffer's fontification immediately.
> >
> >
> > A possible treesit.el patch
> > ---------------------------
> >
> > The change I have been testing locally is small: in
> > `treesit--update-ranges-local', only reuse an existing local-parser
> > overlay when its bounds already match the new range exactly. If the
> > overlay would have to move, do not reuse it. Let
> > `treesit--cleanup-local-range-overlays' delete it on the timestamp
> > mismatch and the existing "create new" branch will produce a fresh
> > parser on the right range.
> >
> >     lisp/treesit.el | 11 +++++++++--
> >     1 file changed, 9 insertions(+), 2 deletions(-)
> >
> >    diff --git a/lisp/treesit.el b/lisp/treesit.el
> >    index 01e82b56bb8..d80e4fe312d 100644
> >    --- a/lisp/treesit.el
> >    +++ b/lisp/treesit.el
> >    @@ -1248,10 +1248,17 @@ treesit--update-ranges-local
> >                                                      embedded-parser)))
> >                             (when (and (overlay-get ov
> 'treesit-parser-local-p)
> >                                        (eq parser-lang embedded-lang)
> >    -                                   (eq embed-level parser-level))
> >    +                                   (eq embed-level parser-level)
> >    +                                   ;; Only reuse if overlay bounds
> match
> >    +                                   ;; the new range exactly.  Reusi=
ng
> >    +                                   ;; across range moves can leave
> the
> >    +                                   ;; embedded parser with a stale
> >    +                                   ;; incremental tree (bug seen wi=
th
> >    +                                   ;; markdown-inline code_span).
> >    +                                   (=3D (overlay-start ov) r-start)
> >    +                                   (=3D (overlay-end ov) r-end))
> >                               (treesit--set-embed-ranges
> >                                range embedded-parser host-parser)
> >    -                          (move-overlay ov r-start r-end)
> >                               (overlay-put ov
> 'treesit-parser-ov-timestamp
> >                                            modified-tick)
> >                               (throw 'done embedded-parser)))))))
> >
> >
> > With this in place the markdown-ts reproduction fontifies as you type,
> > no RET needed, no recreate helper needed.
> >
> > I am very aware this is potentially a sledgehammer. It forces a fresh
> > local parser on every range change, throwing away tree-sitter's
> > incremental work for that subtree. For modes that just rely on local
> > parsers for fontification it should be fine, but it may not be the righ=
t
> > answer if the rest of treesit depends on parser identity surviving
> > across range moves.
> >
> >
> > Where I am not sure
> > -------------------
> >
> > 1. Is this the right layer to address? My patch is in
> >   `treesit--update-ranges-local'. It feels like the deeper truth could
> >   live in `treesit.c''s edit replay when ranges shift, where
> >   `need_reparse' for a local parser does not get set even though its
> >   tree is stale. The C code is quiet on local parser treatment, so it
> >   is hard to tell from outside whether primary-parser reparse
> >   notifications are supposed to propagate to local parsers in this
> >   case.
> >
> > 2. Is there a one-liner I am missing on the elisp side? For example a
> >   call I should be making after `treesit-parser-set-included-ranges' to
> >   force the parser to throw away its cached tree.
> >
> > 3. Or is the right fix on the grammar side, in tree-sitter-markdown's
> >   incremental behaviour around backtick spans, in which case treesit
> >   should probably still gain a way to recover.
> >
> > 4. As mentioned at the top, I believe any `:local t' range rule could
> >   reach this state. markdown-ts is the first heavy customer, but the
> >   html-embedded modes look structurally similar enough that they would
> >   hit it too, just less often.
> >
> > If the analysis is correct but the proposed fix is not, I would be happ=
y
> > to revise the diff. If the analysis itself is wrong, I would also very
> > much appreciate corrections so we can avoid carrying the helper above.
> >
> > I am mostly interested in validating the analysis here. I am not
> > attached to this particular fix, and would be perfectly happy if a
> > different implementation lands instead.
> >
> > Thanks for reading,
>
> Thanks for the investigation. Before knowing more I can=E2=80=99t tell if=
 this
> should be fixed at the treesit.el level or treesit.c level. But I=E2=80=
=99m still
> at the stage of trying to reproduce it. So the reproduce step is:
>

You need to be running the version of markdown-ts-mode.el that uses :local
'markdown-inline parsers.  I'm attaching a recent one that has the patches
Rahul submitted applied.


>
> 1. Type `code` RET
>

You may need an extra RET in there



> 2. Type `code`
>
> And at this point the second `code` should be unfortified? Even with
> latest master and tree-sitter, I can=E2=80=99t reproduce it.




> And if I get latest markdown without my patch, opening a markdown file
> just crashes Emacs. I=E2=80=99ll try to get my patch merged upstream.
>

Ouch.

--0000000000009c770b0651b6dbe6
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Wed, May 13, 2026 at 11:37=E2=80=AFAM Yuan Fu &lt;<a href=3D"mailto:caso=
uri@HIDDEN">casouri@HIDDEN</a>&gt; wrote:</span></div></div><div clas=
s=3D"gmail_quote gmail_quote_container"><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);pad=
ding-left:1ex"><br>
<br>
&gt; On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato &lt;<a href=
=3D"mailto:rahuljuliato@HIDDEN" target=3D"_blank">rahuljuliato@HIDDEN=
</a>&gt; wrote:<br>
&gt; <br>
&gt; Hello,<br>
&gt; <br>
&gt; While debugging an &quot;it doesn&#39;t fontify&quot; report against m=
arkdown-ts-mode,<br>
&gt; I ended up in treesit.el territory and would like a second opinion<br>
&gt; before assuming I&#39;ve correctly identified the layer the fix belong=
s in.<br>
&gt; <br>
&gt; The bug shows up easily in markdown-ts-mode but I suspect it can hit a=
ny<br>
&gt; major mode that drives local parsers via `treesit-range-rules&#39; wit=
h<br>
&gt; `:local t&#39;. markdown-ts just exercises that path very heavily (one=
 local<br>
&gt; `markdown-inline&#39; parser per paragraph), so we are likely seeing<b=
r>
&gt; spoilers ahead of the html and other multi-parser modes.<br>
&gt; <br>
&gt; <br>
&gt; How to Reproduce:<br>
&gt; -----------------<br>
&gt; <br>
&gt; 1. emacs -Q on current master.<br>
&gt; 2. M-x markdown-ts-mode.<br>
&gt; 3. Insert a backtick code span on its own line, for example:<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0`foo`<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0`codium=C2=A0 `<br>
&gt; <br>
&gt;=C2=A0 =C2=A0typing the second line character by character and stopping=
 right<br>
&gt;=C2=A0 =C2=A0after the closing backtick. Do not press RET afterwards.<b=
r>
&gt; <br>
&gt; 4. The first code span is fontified. The second is not.<br>
&gt; <br>
&gt; 5. Press RET. The second code span now fontifies correctly.<br>
&gt; <br>
&gt; `(font-lock-flush)&#39; + `(font-lock-ensure)&#39; do not fix it. Call=
ing<br>
&gt; `(treesit-parser-set-included-ranges PR same-ranges)&#39; does not fix=
<br>
&gt; it either. The only thing that fixes it without typing further is<br>
&gt; deleting and recreating the local markdown-inline parser that covers<b=
r>
&gt; the range.<br>
&gt; <br>
&gt; <br>
&gt; What is happening<br>
&gt; -----------------<br>
&gt; <br>
&gt; The host markdown parser reparses fine and reports the new inline<br>
&gt; node bounds. The local markdown-inline parser at that range,<br>
&gt; however, keeps an outdated tree. I confirmed this directly in the<br>
&gt; bugged buffer:<br>
&gt; <br>
&gt;=C2=A0 (buffer-substring 8 18) =3D&gt; &quot;`codium=C2=A0 `&quot;<br>
&gt; <br>
&gt;=C2=A0 ;; existing local parser covering (8 . 18)<br>
&gt;=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline)&quot;<br>
&gt; <br>
&gt;=C2=A0 ;; force re-set ranges to the same value<br>
&gt;=C2=A0 (treesit-parser-set-included-ranges pr &#39;((8 . 18)))<br>
&gt;=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline)&quot;<br>
&gt; <br>
&gt;=C2=A0 ;; fresh parser, same buffer, same range<br>
&gt;=C2=A0 (let ((new (treesit-parser-create &#39;markdown-inline nil t &#3=
9;embedded)))<br>
&gt;=C2=A0 =C2=A0 (treesit-parser-set-included-ranges new &#39;((8 . 18)))<=
br>
&gt;=C2=A0 =C2=A0 (treesit-node-string (treesit-parser-root-node new)))<br>
&gt;=C2=A0 =C2=A0 =3D&gt; &quot;(inline (code_span (code_span_delimiter)<br=
>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (code_span_delimiter)))&quot;<br>
&gt; <br>
&gt; So, same buffer, same range, same grammar, resulting in different tree=
<br>
&gt; depending on whether the parser was reused across edits or created<br>
&gt; fresh.<br>
&gt; <br>
&gt; So the grammar, the input, and the range are all fine. What is<br>
&gt; wrong is the parser&#39;s accumulated incremental state.<br>
&gt; <br>
&gt; Reading `treesit--update-ranges-local&#39;, the reuse path goes throug=
h:<br>
&gt; <br>
&gt;=C2=A0 (treesit--set-embed-ranges range embedded-parser host-parser)<br=
>
&gt;=C2=A0 (move-overlay ov r-start r-end)<br>
&gt;=C2=A0 (overlay-put ov &#39;treesit-parser-ov-timestamp modified-tick)<=
br>
&gt; <br>
&gt; Tree-sitter is left to apply the buffered edits on top of its old<br>
&gt; tree. For markdown-inline plus the backtick code_span rule, that<br>
&gt; incremental update never re-fires the rule when the closing backtick<b=
r>
&gt; finally arrives, so the parser stays with `(inline)&#39; empty.<br>
&gt; <br>
&gt; Pressing RET escapes the bug. I am not certain why, two candidates:<br=
>
&gt; the newline grows the host paragraph past the overlay bounds and<br>
&gt; `treesit--cleanup-local-range-overlays&#39; deletes the old overlay on=
<br>
&gt; the timestamp mismatch, after which a fresh parser is created; or<br>
&gt; the larger range shift is enough to make tree-sitter invalidate the<br=
>
&gt; right subtree and re-evaluate code_span. Either way the practical<br>
&gt; outcome is the same: only a fresh parser fixes it.<br>
&gt; <br>
&gt; <br>
&gt; My workaround on markdown-ts-mode (for debugging) <br>
&gt; -------------------------------------------------<br>
&gt; <br>
&gt; I made this small interactive helper to help me find the local parser<=
br>
&gt; covering point which would them delete its parser + overlay, and creat=
e<br>
&gt; a fresh one on the same range:<br>
&gt; <br>
&gt;=C2=A0 (defun my/md-recreate-inline-parser-at-point ()<br>
&gt;=C2=A0 =C2=A0 &quot;Delete stale local markdown-inline parser+overlay c=
overing point, recreate.&quot;<br>
&gt;=C2=A0 =C2=A0 (interactive)<br>
&gt;=C2=A0 =C2=A0 (let* ((p (point))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(target-ov<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (catch &#39;f<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolist (ov (overlays-=
in (point-min) (point-max)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((pr (over=
lay-get ov &#39;treesit-parser)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (a=
nd pr<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-get ov &#39;treesit-parser-local=
-p)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eq (treesit-parser-language pr) &#39;mar=
kdown-inline)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(&lt;=3D (overlay-start ov) p (overlay-en=
d ov)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (=
throw &#39;f ov)))))))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (unless target-ov (user-error &quot;No markdown-in=
line overlay covers point&quot;))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (let* ((old-pr (overlay-get target-ov &#39;treesit=
-parser))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(host (overlay-get targ=
et-ov &#39;treesit-host-parser))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(level (treesit-parser-=
embed-level old-pr))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-start (overlay-start=
 target-ov))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-end (overlay-end tar=
get-ov)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-delete old-pr)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-overlay target-ov)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((new (treesit-parser-create &#39;mark=
down-inline nil t &#39;embedded))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (ov (make-overlay r-st=
art r-end nil nil t)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-embed-level new =
level)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-parser =
new)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-parser-=
local-p t)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-host-pa=
rser host)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-parser-=
ov-timestamp (buffer-chars-modified-tick))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-included-ranges =
new `((,r-start . ,r-end)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (font-lock-flush r-start r-end)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (message &quot;Recreated markdown-in=
line parser for (%d . %d)&quot; r-start r-end)))))<br>
&gt; <br>
&gt; This always recovers the buffer&#39;s fontification immediately.<br>
&gt; <br>
&gt; <br>
&gt; A possible treesit.el patch<br>
&gt; ---------------------------<br>
&gt; <br>
&gt; The change I have been testing locally is small: in<br>
&gt; `treesit--update-ranges-local&#39;, only reuse an existing local-parse=
r<br>
&gt; overlay when its bounds already match the new range exactly. If the<br=
>
&gt; overlay would have to move, do not reuse it. Let<br>
&gt; `treesit--cleanup-local-range-overlays&#39; delete it on the timestamp=
<br>
&gt; mismatch and the existing &quot;create new&quot; branch will produce a=
 fresh<br>
&gt; parser on the right range.<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0lisp/treesit.el | 11 +++++++++--<br>
&gt;=C2=A0 =C2=A0 =C2=A01 file changed, 9 insertions(+), 2 deletions(-)<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 diff --git a/lisp/treesit.el b/lisp/treesit.el<br>
&gt;=C2=A0 =C2=A0 index 01e82b56bb8..d80e4fe312d 100644<br>
&gt;=C2=A0 =C2=A0 --- a/lisp/treesit.el<br>
&gt;=C2=A0 =C2=A0 +++ b/lisp/treesit.el<br>
&gt;=C2=A0 =C2=A0 @@ -1248,10 +1248,17 @@ treesit--update-ranges-local<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 embedded-parser)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when (and (overlay-get ov &#39;treesit-p=
arser-local-p)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eq p=
arser-lang embedded-lang)<br>
&gt;=C2=A0 =C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eq em=
bed-level parser-level))<br>
&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eq em=
bed-level parser-level)<br>
&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; Onl=
y reuse if overlay bounds match<br>
&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; the=
 new range exactly.=C2=A0 Reusing<br>
&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; acr=
oss range moves can leave the<br>
&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; emb=
edded parser with a stale<br>
&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; inc=
remental tree (bug seen with<br>
&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; mar=
kdown-inline code_span).<br>
&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(=3D (=
overlay-start ov) r-start)<br>
&gt;=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(=3D (=
overlay-end ov) r-end))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(treesit--set-embed-ranges<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 range embedded-parser host-parser=
)<br>
&gt;=C2=A0 =C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (move-overlay ov r-start r-end)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-put ov &#39;treesit-parse=
r-ov-timestamp<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 modified-tick)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(throw &#39;done embedded-parser))=
)))))<br>
&gt; <br>
&gt; <br>
&gt; With this in place the markdown-ts reproduction fontifies as you type,=
<br>
&gt; no RET needed, no recreate helper needed.<br>
&gt; <br>
&gt; I am very aware this is potentially a sledgehammer. It forces a fresh<=
br>
&gt; local parser on every range change, throwing away tree-sitter&#39;s<br=
>
&gt; incremental work for that subtree. For modes that just rely on local<b=
r>
&gt; parsers for fontification it should be fine, but it may not be the rig=
ht<br>
&gt; answer if the rest of treesit depends on parser identity surviving<br>
&gt; across range moves.<br>
&gt; <br>
&gt; <br>
&gt; Where I am not sure<br>
&gt; -------------------<br>
&gt; <br>
&gt; 1. Is this the right layer to address? My patch is in<br>
&gt;=C2=A0 =C2=A0`treesit--update-ranges-local&#39;. It feels like the deep=
er truth could<br>
&gt;=C2=A0 =C2=A0live in `treesit.c&#39;&#39;s edit replay when ranges shif=
t, where<br>
&gt;=C2=A0 =C2=A0`need_reparse&#39; for a local parser does not get set eve=
n though its<br>
&gt;=C2=A0 =C2=A0tree is stale. The C code is quiet on local parser treatme=
nt, so it<br>
&gt;=C2=A0 =C2=A0is hard to tell from outside whether primary-parser repars=
e<br>
&gt;=C2=A0 =C2=A0notifications are supposed to propagate to local parsers i=
n this<br>
&gt;=C2=A0 =C2=A0case.<br>
&gt; <br>
&gt; 2. Is there a one-liner I am missing on the elisp side? For example a<=
br>
&gt;=C2=A0 =C2=A0call I should be making after `treesit-parser-set-included=
-ranges&#39; to<br>
&gt;=C2=A0 =C2=A0force the parser to throw away its cached tree.<br>
&gt; <br>
&gt; 3. Or is the right fix on the grammar side, in tree-sitter-markdown&#3=
9;s<br>
&gt;=C2=A0 =C2=A0incremental behaviour around backtick spans, in which case=
 treesit<br>
&gt;=C2=A0 =C2=A0should probably still gain a way to recover.<br>
&gt; <br>
&gt; 4. As mentioned at the top, I believe any `:local t&#39; range rule co=
uld<br>
&gt;=C2=A0 =C2=A0reach this state. markdown-ts is the first heavy customer,=
 but the<br>
&gt;=C2=A0 =C2=A0html-embedded modes look structurally similar enough that =
they would<br>
&gt;=C2=A0 =C2=A0hit it too, just less often.<br>
&gt; <br>
&gt; If the analysis is correct but the proposed fix is not, I would be hap=
py<br>
&gt; to revise the diff. If the analysis itself is wrong, I would also very=
<br>
&gt; much appreciate corrections so we can avoid carrying the helper above.=
<br>
&gt; <br>
&gt; I am mostly interested in validating the analysis here. I am not<br>
&gt; attached to this particular fix, and would be perfectly happy if a<br>
&gt; different implementation lands instead.<br>
&gt; <br>
&gt; Thanks for reading,<br>
<br>
Thanks for the investigation. Before knowing more I can=E2=80=99t tell if t=
his should be fixed at the treesit.el level or treesit.c level. But I=E2=80=
=99m still at the stage of trying to reproduce it. So the reproduce step is=
:<br></blockquote><div><br></div><div><div class=3D"gmail_default" style=3D=
"font-family:monospace">You need to be running the version of markdown-ts-m=
ode.el that uses :local &#39;markdown-inline parsers.=C2=A0 I&#39;m attachi=
ng a recent one that has the patches Rahul submitted applied.</div></div><d=
iv>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0p=
x 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
1. Type `code` RET<br></blockquote><div><br></div><div><div class=3D"gmail_=
default" style=3D"font-family:monospace">You may need an extra RET in there=
</div><br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D=
"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-le=
ft:1ex">
2. Type `code`<br>
<br>
And at this point the second `code` should be unfortified? Even with latest=
 master and tree-sitter, I can=E2=80=99t reproduce it.</blockquote><div><br=
></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0=
px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">A=
nd if I get latest markdown without my patch, opening a markdown file just =
crashes Emacs. I=E2=80=99ll try to get my patch merged upstream.<br></block=
quote><div><br></div><div class=3D"gmail_default" style=3D"font-family:mono=
space">Ouch.</div></div></div>

--0000000000009c770b0651b6dbe6--

--0000000000009c770d0651b6dbe8
Content-Type: application/octet-stream; name="markdown-ts-mode.el"
Content-Disposition: attachment; filename="markdown-ts-mode.el"
Content-Transfer-Encoding: base64
Content-ID: <f_mp4dglfs0>
X-Attachment-Id: f_mp4dglfs0

Ozs7IG1hcmtkb3duLXRzLW1vZGUuZWwgLS0tIHRyZWUgc2l0dGVyIHN1cHBvcnQgZm9yIE1hcmtk
b3duIC0qLSBsZXhpY2FsLWJpbmRpbmc6IHQ7IC0qLQoKOzsgQ29weXJpZ2h0IChDKSAyMDI0LTIw
MjYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgo7OyBBdXRob3IgICAgICAgICAgIDog
UmFodWwgTWFydGltIEp1bGlhdG8gPHJhaHVsLmp1bGlhdG9AZ21haWwuY29tPgo7OyAgICAgICAg
ICAgICAgICAgIDogU3TDqXBoYW5lIE1hcmtzIDxzaGlwbWludHNAZ21haWwuY29tPgo7OyBNYWlu
dGFpbmVyICAgICAgIDogUmFodWwgTWFydGltIEp1bGlhdG8gPHJhaHVsLmp1bGlhdG9AZ21haWwu
Y29tPgo7OyBDcmVhdGVkICAgICAgICAgIDogQXByaWwgMjAyNAo7OyBWZXJzaW9uICAgICAgICAg
IDogMS4wCjs7IFBhY2thZ2UtUmVxdWlyZXMgOiAoKGVtYWNzICIzMS4xIikpCjs7IEtleXdvcmRz
ICAgICAgICAgOiBtYXJrZG93biBtZCB0ZXh0IGVkaXQgbGFuZ3VhZ2VzIHRyZWUtc2l0dGVyCgo7
OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuCgo7OyBHTlUgRW1hY3MgaXMgZnJlZSBz
b2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo7OyBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieQo7OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9m
IHRoZSBMaWNlbnNlLCBvcgo7OyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoK
OzsgR05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCjs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCjs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KCjs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCjs7IGFsb25nIHdpdGggR05VIEVtYWNzLiAgSWYg
bm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KCjs7OyBDb21tZW50YXJ5
OgoKOzs7OyBUcmVlLXNpdHRlciBMYW5ndWFnZSBWZXJzaW9ucwo7Owo7OyBtYXJrZG93bi10cy1t
b2RlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcnMgYW5kIHZlcnNp
b246Cjs7IC0gdHJlZS1zaXR0ZXItbWFya2Rvd246IHYwLjQuMQo7OyAtIHRyZWUtc2l0dGVyLW1h
cmtkb3duLWlubGluZTogdjAuNC4xCjs7Cjs7IFdlIHRyeSBvdXIgYmVzdCB0byBtYWtlIGJ1aWx0
LWluIG1vZGVzIHdvcmsgd2l0aCBsYXRlc3QgZ3JhbW1hcgo7OyB2ZXJzaW9ucywgc28gYSBtb3Jl
IHJlY2VudCBncmFtbWFyIGhhcyBhIGdvb2QgY2hhbmNlIHRvIHdvcmsuICBTZW5kCjs7IHVzIGEg
YnVnIHJlcG9ydCBpZiBpdCBkb2Vzbid0Lgo7Owo7OyBCaWRpcmVjdGlvbmFsIFRleHQgQ29uc2lk
ZXJhdGlvbnMKOzsKOzsgVGV4dCB3aXRoIG1hcmt1cCBtYXkgbmVlZCBhbiBleHRyYSBuZXdsaW5l
IGJlZm9yZSBiaWRpcmVjdGlvbmFsIHRleHQKOzsgZm9yIGl0IHRvIHNob3cgY29ycmVjdGx5LiAg
VGhpcyBpcyBhIGxpbWl0YXRpb24gaW4gdGhlIEVtYWNzIGRpc3BsYXkKOzsgZW5naW5lLgo7Owo7
OyBDb2RlIEJsb2NrIExhbmd1YWdlIE1vZGUgQ29uc2lkZXJhdGlvbnMKOzsKOzsgRmVuY2VkIGNv
ZGUgYmxvY2sgbGFuZ3VhZ2UgbW9kZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgdGFibGUKOzsgYG1h
cmtkb3duLXRzLWNvZGUtYmxvY2stbW9kZXMnIGFuZCBoZXVyaXN0aWNzIGFkZGluZyAiLXRzLW1v
ZGUiIGFuZAo7OyAiLW1vZGUiIHRvIHRoZSBsYW5ndWFnZSBuYW1lLiAgSWYgeW91ciBsYW5ndWFn
ZSdzIG1vZGUgaXMgbm90Cjs7IHByb3Blcmx5IHJlY29nbml6ZWQsIGFkZCBpdCB0byBgbWFya2Rv
d24tdHMtY29kZS1ibG9jay1tb2RlcycsIHdoaWNoCjs7IHNlZS4KOzsKOzsgRWFjaCBsYW5ndWFn
ZSdzIG1ham9yIG1vZGUgaXMgZW5hYmxlZCBvbmNlIHBlciBgbWFya2Rvd24tdHMtbW9kZScKOzsg
YnVmZmVyIGluIGEgdGVtcG9yYXJ5IGJ1ZmZlciB0byBleHRyYWN0IGl0cyBkZWZhdWx0IGZvbnQt
bG9jayBhbmQKOzsgdHJlZS1zaXR0ZXIgc2V0dGluZ3MuICBJbiBjb252ZW50aW9uYWwgbm9uLXRy
ZWVzaXQgY29kZSBibG9ja3MsIHRoZQo7OyBtYWpvciBtb2RlIGlzIGVuYWJsZWQgZWFjaCB0aW1l
IHRoZSBibG9jayBpcyBmb250aWZpZWQuCjs7Cjs7IE5PVEU6IE1ham9yIG1vZGUgaG9va3MgYXJl
IG5vdCBydW4gYW5kIGZvbnQtbG9jaywgdHJlZXNpdCwgaW5kZW50LAo7OyBjb21tZW50IHJlY29n
bml0aW9uLCBldGMuIGN1c3RvbWl6YXRpb25zIHRoYXQgeW91IG1pZ2h0IGhhdmUgaW4geW91cgo7
OyBob29rcyBhcmUgbm90IGFwcGxpZWQuICBBcyBhIHJlc3VsdCwgeW91ciBjb2RlIGJsb2NrcyBt
aWdodCBhcHBlYXIKOzsgZGlmZmVyZW50IGluIGBtYXJrZG93bi10cy1tb2RlJyBtb2RlIHRoYW4g
aW4gbmF0aXZlIG1ham9yIG1vZGUKOzsgYnVmZmVycy4gIE5vdCBydW5uaW5nIGhvb2tzIGF2b2lk
cyB0aGUgY29zdCBvZiBlYWNoIG1vZGUgaG9vayBhbmQKOzsgYXZvaWRzIHBvdGVudGlhbCByZWN1
cnNpdmUgdHJlZXNpdCBjYWxsYmFjayBpc3N1ZXMuCjs7Cjs7OzsgQ29kZSBCbG9jayBDb21tYW5k
cwo7Owo7OyBTb21lIGNvbW1vbiBjb21tYW5kcyB3aWxsIG9wZXJhdGUgd2l0aGluIGEgY29kZSBi
bG9jayBhbmQgaW4gaXRzCjs7IG1vZGUuICBUaGVzZSBvcGVyYXRlIGluIGFuIGluZGlyZWN0IGJ1
ZmZlciBhbmQgc29tZSBjb21tYW5kcyBtYXkKOzsgb3BlcmF0ZSBzbGlnaHRseSBkaWZmZXJlbnRs
eSB0byB0aGUgc2FtZSBjb21tYW5kcyBpbnZva2VkIGluIGEgbmF0aXZlCjs7IG1vZGUgYnVmZmVy
LiAgYGluZGVudC1mb3ItdGFiLWNvbW1hbmQnIG1heSBpbnZva2UKOzsgYGNvbXBsZXRpb24tYXQt
cG9pbnQnIHVuZGVyIHRoZSBjb3ZlcnMgYW5kIG1heSByZXR1cm4gcmVzdWx0cyBmcm9tCjs7IHRo
ZSBzdXJyb3VuZGluZyBNYXJrZG93biBidWZmZXIgaW5zdGVhZCBvZiB0aGUgY29kZSBibG9jaydz
IGNvbnRleHQuCjs7IFlvdSBjYW4gaW52b2tlIGBjb21wbGV0aW9uLWF0LXBvaW50JyBkaXJlY3Rs
eSBieSB1c2luZyBpdHMga2V5Cjs7IGJpbmRpbmcsIGBDLU0taWAuCjs7Cjs7OzsgUGlwZSBUYWJs
ZXMKOzsKOzsgVGhlc2UgYXJlIGEgR2l0SHViIEZsYXZvcmVkIE1hcmtkb3duIChHRk0pIGV4dGVu
c2lvbiBhbmQgYXJlIGEgZGUKOzsgZmFjdG8gc3RhbmRhcmQgZ2l2ZW4gdGhlaXIgcG9wdWxhcml0
eSBhbmQgaW1wbGVtZW50YXRpb25zIGFjcm9zcwo7OyBwcm9kdWN0cy4gIFRoZXkgbWlnaHQgYXMg
d2VsbCBiZSBmb2xkZWQgaW50byB0aGUgQ29tbW9uTWFyayBzdGFuZGFyZC4KOzsKOzsgQSBwaXBl
IHRhYmxlIGlzIGEgcmVjdGFuZ2xlIG9mIHRleHQgc3Vycm91bmRlZCB0byB0aGUgZWFzdCBhbmQg
d2VzdAo7OyBieSBwaXBlIHN5bWJvbHMgYW5kIHdoZXJlIHBpcGVzIHNlcGFyYXRlIGNvbHVtbnMu
ICBJdCBoYXMgYSBoZWFkZXIKOzsgcm93IGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGhlYWRlciBh
bGlnbm1lbnQgcm93LCBib3RoIG9mIHdoaWNoIG11c3QKOzsgY29udGFpbiB0aGUgc2FtZSBudW1i
ZXIgb2YgY2VsbHMuICBCb2R5IHJvd3MgYXJlIG9wdGlvbmFsLiAgQSB0YWJsZQo7OyBlbmRzIHdp
dGggYSBibGFuayBsaW5lIG9yIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBNYXJrZG93biBibG9jawo7
OyBlbGVtZW50Lgo7Owo7OyBUaGUgaGVhZGVyIGFsaWdubWVudCByb3cgY29sdW1uIG11c3QgaGF2
ZSBhIG1pbmltdW0gb2YgdGhyZWUgaHlwaGVucwo7OyB3aGljaCBpbmRpY2F0ZXMgZGVmYXVsdCBh
bGlnbm1lbnQgKGkuZS4sIHdoYXRldmVyIGEgcmVuZGVyZXIKOzsgY2hvb3NlcykuICBUbyBpbmRp
Y2F0ZSBsZWZ0IGFsaWdubWVudCwgcHJlZml4IHRoZSBoeXBoZW4gc3RyaW5nIHdpdGgKOzsgYSBj
b2xvbiBsaWtlIHRoaXMgOi0tLS4gIEZvciBjZW50ZXIgYWxpZ25tZW50LCBwcmVmaXggYW5kIHN1
ZmZpeCB3aXRoCjs7IGNvbG9ucyBsaWtlIHRoaXMgOi0tLTouICBGb3IgcmlnaHQgYWxpZ25tZW50
LCBzdWZmaXggd2l0aCBhIGNvbG9uCjs7IGxpa2UgdGhpcyAtLS06Lgo7Owo7OyBFYWNoIHRhYmxl
IGhlYWRlciBvciBib2R5IGNlbGwgY2FuIGNvbnRhaW4gdGhlIHVzdWFsIE1hcmtkb3duIGlubGlu
ZQo7OyBzdHlsZSBpbmRpY2F0b3JzLiAgQSBjZWxsIGNhbm5vdCBjb250YWluIGEgYmxvY2sgZWxl
bWVudCBzdWNoIGFzIGEKOzsgaGVhZGluZ3MsIHRoZW1hdGljIGJyZWFrcywgYmxvY2sgcXVvdGVz
LCBmZW5jZWQgY29kZSBibG9ja3MuCjs7Cjs7IFRhYmxlIGNlbGxzIGRvIG5vdCBuZWVkIHRvIGFs
aWduIHZpc3VhbGx5OyBpLmUuLCB0aGUgcGlwZSBzeW1ib2xzIGRvCjs7IG5vdCBuZWVkIHRvIGxp
bmUgdXAgdmVydGljYWxseS4gIFRoZSB0cmVlLXNpdHRlciBwYXJzZXIgYW5kIHJlbmRlcmVycwo7
OyBkZXRlY3QgY2VsbCBib3VuZGFyaWVzIHVzaW5nIHBpcGUgc3ltYm9scywgbm90IHRoZWlyIHJl
bGF0aXZlIGFsaWdubWVudC4KOzsKOzsgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSB3aGF0IGxvb2tz
IGxpa2UgY29kZSwgeW91IGNhbiB1c2UgYmFja3RpY2tzIHRvCjs7IHdyYXAgc3VjaCB0ZXh0IGFs
YSBgdGhpcyBpcyBjb2RlYC4gIFRoaXMgbW9kZSB3aWxsIG5vdCBmb250aWZ5IHN1Y2gKOzsgY29k
ZS4KOzsKOzsgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIHBpcGUgc3ltYm9sIGluIGEgY2VsbCwg
ZXNjYXBlIGl0IHRodXNseSBcfC4KOzsKOzsgVGVjaG5pY2FsbHksIGJvZHkgcm93cyBkbyBub3Qg
bmVlZCB0byBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZgo7OyBjZWxscyBhcyB0aGUgaGVhZGVy
IGhhcyBjb2x1bW5zIGFuZCByb3dzIGRvIG5vdCBuZWVkIHRvIHNoYXJlIHRoZQo7OyBzYW1lIG51
bWJlciBvZiBjZWxscyBhbW9uZyB0aGVtc2VsdmVzLiAgTm90ZTogTWFueSByZW5kZXJlcnMgZ2V0
Cjs7IGNvbmZ1c2VkIGlmIHRoZSB0YWJsZSBpcyAicmFnZ2VkIiB3aXRoIGFuIHVuZXZlbiBudW1i
ZXIgb2YgY29sdW1ucwo7OyBhbW9uZyByb3dzLiAgU29tZSByZW5kZXJlcnMgd2lsbCBpbnNlcnQg
ZW1wdHkgY2VsbHMgb24gYSByb3cgdGhhdAo7OyBjb250YWlucyBmZXdlciBjZWxscyB0aGFuIHRo
ZSBoZWFkZXIgaGFzIGNvbHVtbnMuICBTb21lIGVsaWRlIGNlbGxzCjs7IHRoYXQgZXhjZWVkIHRo
ZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgaGVhZGVyLgo7Owo7Ozs7IFBpcGUgVGFibGUgUmVj
b21tZW5kYXRpb25zCjs7Cjs7IC0gQWx3YXlzIHVzZSBwaXBlIHN5bWJvbHMgYXQgdGhlIHN0YXJ0
IGFuZCBlbmQgb2YgZWFjaCB0YWJsZSBsaW5lLgo7OyAtIFVzZSBhIHVuaWZvcm0gbnVtYmVyIG9m
IGNvbHVtbnMgc3Bhbm5pbmcgdGhlIHRhYmxlLgo7OyAtIElmIHlvdSBkZXRlY3QgYSBwYXJzaW5n
IGVycm9yIHdoaWNoIHByZXNlbnRzIGFzIGRpZmZlcmVudAo7OyAgIGZvbnRpZmljYXRpb24gYW5k
IHdoaWNoIGlzIG9mdGVuIGNhdXNlZCBieSBhbiBlbXB0eSBmaXJzdCBjZWxsIG9uIHRoZQo7OyAg
IGZpbmFsIHJvdywgdHJ5IHB1dHRpbmcgc29tZSBjaGFyYWN0ZXJzIGluIHRoYXQgY2VsbC4KOzsg
LSBSZW5kZXJlcnMgb2Z0ZW4gZXhjbHVkZSBjZXJ0YWluIGVtcHR5IGNlbGxzIHN1Y2ggYXMgYW4g
ImVtcHR5IiBmaW5hbAo7OyAgIGNlbGwgaW4gYSB0YWJsZS4gIEZvbGxvdyB0aGUgbmV4dCBpdGVt
IHRvIGF2b2lkIHRoaXMuCjs7IC0gSWYgeW91IG5lZWQgdGhhdCBjZWxsIHRvIGFwcGVhciBibGFu
ayBhbmQgYXJlIGNvbnZlcnRpbmcgdG8gSFRNTCwKOzsgICB0cnkgdXNpbmcgYSBub24tcHJpbnRp
bmcgSFRNTCBlbnRpdHksIHN1Y2ggYXMgYSBub24tYnJlYWtpbmcgc3BhY2UKOzsgICAiJm5ic3A7
Iiwgd2hpY2ggcGFyc2UgYXMgY29uY3JldGUgY2hhcmFjdGVycyB5ZXQgcmVuZGVyIGFzIGJsYW5r
Lgo7OyAtIEhUTUwgY29tbWVudHMgPCEtLSAtLT4gY2FuIGFsc28gYmUgdXNlZCBhcyBhIG5vbi1i
bGFuayBjaGFyYWN0ZXIKOzsgICBzdHJpbmcgdGhhdCBkb2VzIG5vdCBnZXQgcmVuZGVyZWQuICBU
aGVzZSBhcmUgY29uc2lkZXJlZCBjZWxsIHRleHQKOzsgICBhbmQgd2hlbiBwbGFjZWQgYXQgdGhl
IGVuZCBvZiBhIHJvdywgdGhhdCByb3cncyBudW1iZXIgb2YgY29sdW1ucyBpcwo7OyAgIGluY3Jl
YXNlZCBhbmQgbWlnaHQgZXhjZWVkIHRoZSBudW1iZXIgb2YgaGVhZGVyIGNvbHVtbnMuCjs7IC0g
VGhlcmUgYXJlIHRyZWUtc2l0dGVyIHBhcnNlciBxdWlya3MuICBDb21tYW5kcyBzdWNoIGFzCjs7
ICAgYG1hcmtkb3duLXRzLXRhYmxlLWRlbGV0ZS1jb2x1bW4nIGFuZCBgbWFya2Rvd24tdHMtdGFi
bGUtbW92ZS1jb2x1bW4nCjs7ICAgZm9sbG93IHRoZSBwYXJzZXIgdHJlZSBhbmQgY2FuIGxlYWQg
dG8gdW5leHBlY3RlZCByZXN1bHRzIHNvIGZvbGxvdwo7OyAgIHRoZXNlIHJlY29tbWVuZGF0aW9u
cyBhbmQgdGFibGUgb3BlcmF0aW9ucyBzaG91bGQgYmUgYXMgZXhwZWN0ZWQuCjs7Cjs7OzsgVHJl
ZSBTaXR0ZXIgQnVncwo7Owo7OyBgbWFya2Rvd24tdHMtbW9kZScgcmVsaWVzIG9uIHRoZSB1bmRl
cmx5aW5nIHRyZWUtc2l0dGVyIGxpYnJhcnkgaW4KOzsgRW1hY3MgKGNob3NlbiBhdCBpdHMgYnVp
bGQgdGltZSksIGFuZCBsYW5ndWFnZSBncmFtbWFycyB5b3UgaGF2ZQo7OyBpbnN0YWxsZWQuICBU
aGVyZSBhcmUga25vd24gYW5kIHJlcG9ydGVkIGJ1Z3Mgd2hpY2ggbmVnYXRpdmVseSBhZmZlY3QK
OzsgY2VydGFpbiBmZWF0dXJlcy4gIFRoaXMgbW9kZSBzaG91bGQgYmVuZWZpdCBhcyB0aGVzZSBi
dWdzIGFyZSBmaXhlZAo7OyBvciB3b3JrZWQgYXJvdW5kLgo7Owo7OyAtIFRoZSBNYXJrZG93biBn
cmFtbWFyIGluc2VydHMgYmxvY2tfY29udGludWF0aW9uIG5vZGVzIGFzIGNoaWxkcmVuCjs7ICAg
b2YgY29kZV9mZW5jZV9jb250ZW50LCB3aGljaCBjb25mdXNlcyBib3RoIHRoZSBpbnNwZWN0b3Ig
YW5kIHRoZQo7OyAgIGVtYmVkZGVkIHBhcnNlci4gIFRoaXMgYWZmZWN0cyBjb2RlIGJsb2NrcyBp
bnNpZGUgYmxvY2sgcXVvdGVzLgo7Owo7OyAtIEhUTUwgYmxvY2sgdHlwZSA0IChgPCEnIGZvbGxv
d2VkIGJ5IGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGUuZy4sCjs7ICAgYDwhRE9DVFlQRSBodG1sPicp
IGNhdXNlcyB0aGUgcGFyc2VyIHRvIGNvbnN1bWUgYWxsIHN1YnNlcXVlbnQKOzsgICBjb250ZW50
LiAgTG93ZXJjYXNlIGA8IWRvY3R5cGUgaHRtbD4nIHdvcmtzIGFzIGEgd29ya2Fyb3VuZC4KOzsg
ICBTZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS90cmVlLXNpdHRlci1ncmFtbWFycy90cmVlLXNpdHRl
ci1tYXJrZG93bi9pc3N1ZXMvMjMzPi4KOzsKOzsgLSBUaGUgZ3JhbW1hciBwYXJzZXMgc29sbyB0
aWxkZXMsIGluY29ycmVjdGx5IGFwcGx5aW5nIHN0cmlrZXRocm91Z2guCjs7ICAgRm9yIGV4YW1w
bGUsIHdyaXRpbmc6Cjs7Cjs7ICAgICBJIHNlZSB+YXBwcm94aW1hdGVseSBmb3VyIGxpZ2h0cy4K
OzsgICAgIEkgZG8gbm90IHNlZSB+YXBwcm94aW1hdGVseSBmaXZlIGxpZ2h0cy4KOzsKOzsgICBS
ZXN1bHRzIGluIHN0cmlrZXRocm91Z2ggaW5jb3JyZWN0bHkgc3RhcnRpbmcgYXQgdGhlIGZpcnN0
Cjs7ICAgfmFwcHJveGltYXRlbHkgYW5kIGV4dGVuZGluZyB0aWxsIHRoZSB0aWxkZSBhdCB0aGUg
c2Vjb25kCjs7ICAgfmFwcHJveGltYXRlbHkuCjs7ICAgU2VlIDxodHRwczovL2dpdGh1Yi5jb20v
dHJlZS1zaXR0ZXItZ3JhbW1hcnMvdHJlZS1zaXR0ZXItbWFya2Rvd24vaXNzdWVzLzIzNj4KOzsK
OzsgLSBTdXBlcnNjcmlwdCAoYF50ZXh0XicpIGFuZCBzdWJzY3JpcHQgKGB+dGV4dH4nKSBzeW50
YXggaXMgbm90Cjs7ICAgc3VwcG9ydGVkIGJ5IHRoZSBncmFtbWFyLiAgTm8gRVhURU5TSU9OXyBi
dWlsZCBmbGFnIGV4aXN0cyBmb3IKOzsgICB0aGlzLiAgVGhpcyBpcyBQYW5kb2MgLyBQSFAgTWFy
a2Rvd24gRXh0cmEgc3ludGF4LCBub3QgQ29tbW9uTWFyawo7OyAgIG9yIEdGTS4KOzsKOzsgLSBP
cmRlcmVkIChudW1iZXJlZCkgbGlzdHMgZG8gbm90IG5lc3QgYnkgaW5kZW50YXRpb24uICBJbmRl
bnRpbmcKOzsgICBhIGAxLicgaXRlbSB1bmRlciBhbm90aGVyIG9yZGVyZWQgaXRlbSBkb2VzIG5v
dCBwcm9kdWNlIGEgbmVzdGVkCjs7ICAgbGlzdCBub2RlOyB0aGUgcGFyc2VyIGVpdGhlciB0cmVh
dHMgaXQgYXMgYSBmbGF0IHNpYmxpbmcgb3IKOzsgICBhYnNvcmJzIGl0IGludG8gdGhlIHBhcmVu
dCBpdGVtJ3MgcGFyYWdyYXBoIGFzIGEKOzsgICBibG9ja19jb250aW51YXRpb24uICBVbm9yZGVy
ZWQgKGAtJywgYConLCBgKycpIGxpc3RzIG5lc3QKOzsgICBjb3JyZWN0bHkuICBEZW1vdGUvcHJv
bW90ZSBvZiBvcmRlcmVkIGxpc3QgaXRlbXMgaXMgdGhlcmVmb3JlCjs7ICAgZGlzYWJsZWQuCjs7
Cjs7IC0gUmVudW1iZXJpbmcgb3JkZXJlZCBsaXN0cyAoYG1hcmtkb3duLXRzLXJlbnVtYmVyLWxp
c3QnKSBtYXkgb25seQo7OyAgIGFmZmVjdCBpdGVtcyBmcm9tIHBvaW50IGRvd253YXJkIGlmIHRo
ZSBwYXJzZXIgc3BsaXRzIGEgc2luZ2xlCjs7ICAgbGlzdCBpbnRvIHNlcGFyYXRlIGBsaXN0JyBu
b2Rlcywgb3IgbWF5IGNvbnRpbnVlIG51bWJlcmluZyBhY3Jvc3MKOzsgICB0d28gc2VwYXJhdGUg
bGlzdHMgaWYgdGhlIHBhcnNlciBtZXJnZXMgdGhlbSBpbnRvIG9uZSBub2RlLgo7Owo7OyAtIEVt
cHR5IGxpbmVzIGZvbGxvd2luZyBhbiBgaW5kZW50ZWRfY29kZV9ibG9jaycgbWF5IGJlIGNsYWlt
ZWQgYnkKOzsgICB0aGUgcGFyc2VyIGFzIGNvbnRpbnVhdGlvbiBsaW5lcyBvZiB0aGF0IGJsb2Nr
LCByYXRoZXIgdGhhbiBiZWluZwo7OyAgIHRyZWF0ZWQgYXMgYmxhbmsgc2VwYXJhdG9ycy4KOzsK
OzsgLSBQaXBlIHRhYmxlcyBhcmUgaW5jb25zaXN0ZW50bHkgcGFyc2VkLiAgV2hpdGVzcGFjZSBp
cyBjb3JyZWN0bHkKOzsgICB0cmltbWVkIGF0IHRoZSBzdGFydCBvZiBhIGNlbGwgY29udGVudCBi
dXQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcwo7OyAgIGluY29ycmVjdGx5IGluY2x1ZGVkLiAgRW1w
dHkgY2VsbHMgY2FuIGNvbnRhaW4gdW5ldmVuICJyYWdnZWQiIHJvdwo7OyAgIGNvbHVtbiBjb25m
aWd1cmF0aW9ucyB0aGF0IGNhbiBjb25mdXNlIHRoZSBwYXJzZXIuCjs7Cjs7ICAgTWFya2Rvd24g
cGlwZSB0YWJsZXMgd2l0aCBwYXJzaW5nIGlzc3VlczoKOzsKOzsgICB8Q29sdW1uIDF8Q29sdW1u
IDJ8Q29sdW1uIDN8Cjs7ICAgfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfAo7OyAgIHwgICAg
ICAgIHwgICAgICAgIHwgICAgICAgIHwKOzsgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8
IDwtLSBwYXJzZSBlcnJvcgo7Owo7OyAgIHxDb2x1bW4gMXxDb2x1bW4gMnxDb2x1bW4gM3wKOzsg
ICB8LS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS18Cjs7ICAgfCAgICAgICAgfCAgICAgICAgfCAg
ICAgICAgfAo7OyAgIHwgeHh4ICAgIHwgICAgICAgIHwgICAgICAgIHwgPC0tIHBhcnNlZCBjb3Jy
ZWN0bHkKOzsKOzsgICB8Q29sdW1uIDF8Q29sdW1uIDJ8IDwtLSAyIGNvbHVtbnMgY29ycmVjdAo7
OyAgIHwtLS0tLS0tLXwtLS0tLS0tLXwgPC0tIDIgY29sdW1ucyBjb3JyZWN0Cjs7ICAgICAgICAg
ICAgfCAgICAgICAgfCA8LS0gMSBjb2x1bW4gaW5jb3JyZWN0Cjs7ICAgICAgICAgICAgfCAgICAg
ICAgfCA8LS0gcGFyc2UgZXJyb3IKOzsgICB8ICAgICAgICB8ICAgICAgICB8IDwtLSBub3QgYSBy
b3cgYWZ0ZXIgdGhlIGVycm9yLCBhYm92ZQo7Owo7OyAgIFNlZSA8aHR0cHM6Ly9naXRodWIuY29t
L3RyZWUtc2l0dGVyLWdyYW1tYXJzL3RyZWUtc2l0dGVyLW1hcmtkb3duL2lzc3Vlcy8yNDE+Cjs7
ICAgICAgIDxodHRwczovL2dpdGh1Yi5jb20vdHJlZS1zaXR0ZXItZ3JhbW1hcnMvdHJlZS1zaXR0
ZXItbWFya2Rvd24vaXNzdWVzLzI0Mj4KOzsKOzsgLSBUaGUgZ3JhbW1hcidzIGV4dGVybmFsIHNj
YW5uZXIgaGFzIGEgYnVmZmVyIG92ZXJmbG93IGluIGl0cwo7OyAgIGBzZXJpYWxpemUnIGZ1bmN0
aW9uOiB3aGVuIHRoZSBwYXJzZXIgc3RhdGUgZXhjZWVkcyB0aGUKOzsgICBzZXJpYWxpemF0aW9u
IGJ1ZmZlciBwcm92aWRlZCBieSB0cmVlLXNpdHRlciwgYG1lbWNweScgd3JpdGVzIHBhc3QKOzsg
ICB0aGUgZW5kIGFuZCBjYW4gY29ycnVwdCB0aGUgc3RhY2suICBUcmlnZ2VyZWQgaW4gcHJhY3Rp
Y2Ugd2hpbGUKOzsgICBwYXJzaW5nIE1hcmtkb3duIGluIEVtYWNzLgo7OyAgIFNlZSA8aHR0cHM6
Ly9naXRodWIuY29tL3RyZWUtc2l0dGVyLWdyYW1tYXJzL3RyZWUtc2l0dGVyLW1hcmtkb3duL2lz
c3Vlcy8yNDM+Lgo7Owo7Ozs7IEJhdGNoIEZvbnRpZmljYXRpb24KOzsKOzsgU29tZSBkb3duc3Ry
ZWFtIHBhY2thZ2VzIGZvbnRpZnkgbXVsdGlwbGUgdW5yZWxhdGVkIE1hcmtkb3duCjs7IGZyYWdt
ZW50cyBieSBqb2luaW5nIHRoZW0gaW4gYSBzaW5nbGUgYnVmZmVyIHdpdGggYSBzZXBhcmF0b3Ig
YW5kCjs7IHJ1bm5pbmcgYG1hcmtkb3duLXRzLW1vZGUnIG92ZXIgdGhlIHdob2xlIHRoaW5nLiAg
Q2hvaWNlIG9mIHNlcGFyYXRvcgo7OyBtYXR0ZXJzOiB0aGUgdHJlZS1zaXR0ZXItbWFya2Rvd24g
Z3JhbW1hciBkb2VzIG5vdCBsaXN0IHRoZSBOVUwgYnl0ZQo7OyAoYFwwJykgYXMgZXh0cmEvd2hp
dGVzcGFjZSwgc28gYSBOVUwgc2VwYXJhdG9yIHlpZWxkcyBhbiBFUlJPUiBub2RlCjs7IGFuZCB0
aGUgcGFyc2VyIGVudGVycyBlcnJvciByZWNvdmVyeSwgd2hpY2ggY2FuIGxlYWsgaW5saW5lIGZh
Y2VzCjs7IChlLmcuLCBzdHJpa2V0aHJvdWdoKSBhY3Jvc3MgZnJhZ21lbnQgYm91bmRhcmllcy4g
IFJlZ2V4LWJhc2VkIG1vZGVzCjs7IHRvbGVyYXRlIE5VTCBzaWxlbnRseSBiZWNhdXNlIHRoZXkg
ZG8gbm90IHBhcnNlIHN0cnVjdHVyZTsgdGhpcyBpcyBhCjs7IGJlaGF2aW9yYWwgZGlmZmVyZW5j
ZSwgbm90IGEgcmVncmVzc2lvbi4KOzsKOzsgQSBmb3JtIGZlZWQgKGBeTCcsIGBcZicpIGZsYW5r
ZWQgYnkgYmxhbmsgbGluZXMgd29ya3MgYXMgYSBjbGVhbgo7OyBkcm9wLWluIHNlcGFyYXRvcjog
dGhlIHBhcnNlciB0cmVhdHMgaXQgYXMgYSBwYXJhZ3JhcGggYnJlYWsgYW5kCjs7IGlubGluZSBz
dGF0ZSBkb2VzIG5vdCBibGVlZCBhY3Jvc3MgZnJhZ21lbnRzLgoKOzs7IENvZGU6CgoocmVxdWly
ZSAndHJlZXNpdCkKKHJlcXVpcmUgJ3N1YnIteCkKKHJlcXVpcmUgJ3NlcSkKKHJlcXVpcmUgJ291
dGxpbmUpCihyZXF1aXJlICdnb3RvLWFkZHIpCihyZXF1aXJlICd4cmVmKQoocmVxdWlyZSAnaWNv
bnMpCgo7OzsgQ3VzdG9taXphdGlvbnM6CgooZGVmZ3JvdXAgbWFya2Rvd24tdHMgbmlsCiAgIk1h
am9yIG1vZGUgZm9yIHZpZXdpbmcgYW5kIGVkaXRpbmcgTWFya2Rvd24gYnVmZmVycy4iCiAgOnBy
ZWZpeCAibWFya2Rvd24tdHMtIgogIDpncm91cCAndGV4dAogIDpncm91cCAnZWRpdGluZwogIDp2
ZXJzaW9uICIzMS4xIikKCihkZWZjdXN0b20gbWFya2Rvd24tdHMtaGlkZS1tYXJrdXAgbmlsCiAg
Ik5vbi1uaWwgbWVhbnMgaGlkZSBNYXJrZG93biBtYXJrdXAgZGVsaW1pdGVycyBpbiB0aGlzIGJ1
ZmZlci4iCiAgOnR5cGUgJ2Jvb2xlYW4KICA6bG9jYWwgdAogIDpzYWZlICMnYm9vbGVhbnAKICA6
dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZmN1c3RvbSBtYXJr
ZG93bi10cy1lbGxpcHNpcyBuaWwKICAiVGhlIGVsbGlwc2lzIHRvIHVzZSBpbiBmb2xkZWQgaGVh
ZGluZ3MuCldoZW4gbmlsLCB1c2UgdGhlIHN0YW5kYXJkIHRocmVlIGRvdHMuICBXaGVuIGEgbm9u
LWVtcHR5IHN0cmluZywKdXNlIHRoYXQgc3RyaW5nIGluc3RlYWQuIgogIDp0eXBlICcoY2hvaWNl
IChjb25zdCAgOnRhZyAiRGVmYXVsdCAoLi4uKSIgbmlsKQogICAgICAgICAgICAgICAgIChzdHJp
bmcgOnRhZyAiU3RyaW5nIiA6dmFsdWUgIiDijIQiKSkKICA6dmVyc2lvbiAiMzEuMSIKICA6cGFj
a2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy1tZW51LWJhci1zaG93
IHQKICAiTm9uLW5pbCBtZWFucyBzaG93IHRoZSBNYXJrZG93biBtZW51IGluIHRoZSBtZW51IGJh
ci4iCiAgOnR5cGUgJ2Jvb2xlYW4KICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9u
ICIxLjAiKQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy1kZWZhdWx0LWZvbGRpbmcgJ3Nob3ctYWxs
CiAgIkRlZmF1bHQgaGVhZGluZyBmb2xkaW5nIGxldmVsLiIKICA6dHlwZSAnKGNob2ljZQogICAg
ICAgICAgKGNvbnN0IDp0YWcgIlNob3cgZXZlcnl0aGluZyIgc2hvdy1hbGwpCiAgICAgICAgICAo
Y29uc3QgOnRhZyAiRm9sZCBldmVyeXRoaW5nLCBzaG93aW5nIHRvcC1sZXZlbCBoZWFkaW5ncyIg
Zm9sZC1hbGwpCiAgICAgICAgICAoY29uc3QgOnRhZyAiRm9sZCBoZWFkaW5ncywgc2hvd2luZyBh
bGwgaGVhZGluZyBsZXZlbHMiIGZvbGQtaGVhZGluZ3MpKQogIDp2ZXJzaW9uICIzMS4xIgogIDpw
YWNrYWdlLXZlcnNpb24gIjEuMCIpCgooZGVmY3VzdG9tIG1hcmtkb3duLXRzLWlubGluZS1pbWFn
ZXMgbmlsCiAgIk5vbi1uaWwgbWVhbnMgZGlzcGxheSBpbmxpbmUgaW1hZ2VzIGJlbG93IGltYWdl
IGxpbmtzLiIKICA6dHlwZSAnYm9vbGVhbgogIDpsb2NhbCB0CiAgOnNhZmUgIydib29sZWFucAog
IDp2ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIpCgooZGVmY3VzdG9tIG1h
cmtkb3duLXRzLWltYWdlLW1heC13aWR0aCAnd2luZG93CiAgIk1heGltdW0gd2lkdGggb2YgaW5s
aW5lIGltYWdlcyBpbiBwaXhlbHMuCldoZW4gYHdpbmRvdycsIHVzZSB0aGUgd2luZG93IGJvZHkg
d2lkdGguICBXaGVuIGEgbnVtYmVyLCB1c2UKdGhhdCBhcyB0aGUgbWF4aW11bSBwaXhlbCB3aWR0
aC4iCiAgOnR5cGUgJyhjaG9pY2UgKGNvbnN0ICA6dGFnICJXaW5kb3cgd2lkdGgiIHdpbmRvdykK
ICAgICAgICAgICAgICAgICAobmF0bnVtIDp0YWcgIlBpeGVsIHdpZHRoIikpCiAgOnZlcnNpb24g
IjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCihkZWZjdXN0b20gbWFya2Rvd24tdHMt
ZGlzcGxheS1yZW1vdGUtaW5saW5lLWltYWdlcyBuaWwKICAiSG93IHRvIGRpc3BsYXkgcmVtb3Rl
IGlubGluZSBpbWFnZXMuCldoZW4gbmlsLCBkbyBub3QgZGlzcGxheSByZW1vdGUgaW1hZ2VzLiAg
V2hlbiBgZG93bmxvYWQnLCBmZXRjaCB0aGUKaW1hZ2UgaW50byBhIHRlbXBvcmFyeSBidWZmZXIg
YW5kIGRpc3BsYXkgaXQuCgpSZW1vdGUgaW1hZ2VzIGFyZSBza2lwcGVkIGJ5IGRlZmF1bHQgZm9y
IHNlY3VyaXR5LiIKICA6dHlwZSAnKGNob2ljZSAoY29uc3QgOnRhZyAiU2tpcCByZW1vdGUgaW1h
Z2VzIiBuaWwpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIkRvd25sb2FkIHJlbW90ZSBp
bWFnZXMiIGRvd25sb2FkKSkKICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIx
LjAiKQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy11bm9yZGVyZWQtbGlzdC1tYXJrZXIgJygoIuKX
jyAiIC4gIi0gIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoIuKXiyAiIC4gIi0gIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoIuKXvCAiIC4gIi0gIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoIuKAoiAiIC4gIi0gIikpCiAgIklmIG1hcmt1cCBpcyBoaWRkZW4sIGRp
c3BsYXkgdGhlc2UgZm9yIGFuIHVub3JkZXJlZCBsaXN0IG1hcmtlci4KRWFjaCBsaXN0IGl0ZW0g
bWFya2VyJ3MgZGVwdGggaW4gaXRzIGxpc3QgY29udHJvbHMgaXRzIHNlbGVjdGVkIHN0cmluZwpz
dGFydGluZyBhdCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgY3ljbGluZyB0aHJvdWdoIHRoZSBvdGhl
cnMgZm9yIGRlZXBlcgppdGVtcy4gIFRoZSBsaXN0IHdpbGwgYmUgY3ljbGUgYXJvdW5kIGJhY2sg
dG8gdGhlIGJlZ2lubmluZyBpZiB0aGVyZSBhcmUKaW5zdWZmaWNpZW50IHN0cmluZ3MgdG8gcmVw
cmVzZW50IGRlZXAgbGV2ZWxzLgoKTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHN0cmluZ3MgaGF2ZSB0
cmFpbGluZyBzcGFjZXMuCgpWYWx1ZSBmb3JtczoKIC0gKGxpc3QgKGNvbnMgKFBSRUZFUlJFRCAu
IEZBTExCQUNLKSkgLi4uKTogd2hlcmUgUFJFRkVSUkVEIGlzIHVzZWQgaWYKICAgaXRzIGZpcnN0
IGNoYXJhY3RlciBwYXNzZXMgYGNoYXItZGlzcGxheWFibGUtcCcsIG90aGVyd2lzZSBGQUxMQkFD
Sy4KIC0gbmlsOiBkaXNwbGF5IHRoZSByYXcgbWFya3VwLiIKICA6dHlwZSAnKGNob2ljZSAocmVw
ZWF0IChjb25zIChzdHJpbmcgOnRhZyAiUHJlZmVycmVkIChHVUkpIikKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChzdHJpbmcgOnRhZyAiRmFsbGJhY2sgKFRUWSkiKSkpCiAgICAgICAg
ICAgICAgICAgKGNvbnN0IDp0YWcgIkRpc3BsYXkgb3JpZ2luYWwgbWFya3VwIiBuaWwpKQogIDp2
ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIpCgooZGVmY3VzdG9tIG1hcmtk
b3duLXRzLWNoZWNrZWQtY2hlY2tib3ggJygi4piRIiAuICIrIikKICAiSWYgbWFya3VwIGlzIGhp
ZGRlbiwgZGlzcGxheSB0aGlzIGZvciBhIGNoZWNrZWQgdGFzayBsaXN0IG1hcmtlci4KVmFsdWUg
Zm9ybXM6CiAtIGNvbnMgKFBSRUZFUlJFRCAuIEZBTExCQUNLKTogUFJFRkVSUkVEIGlzIHVzZWQg
aWYgaXRzIGZpcnN0IGNoYXJhY3RlcgogICBwYXNzZXMgYGNoYXItZGlzcGxheWFibGUtcCcsIG90
aGVyd2lzZSBGQUxMQkFDSy4KIC0gc3ltYm9sIGBpY29uJzogZGVmZXIgdG8gdGhlIGljb25zLmVs
IGljb24KICAgYG1hcmtkb3duLXRzLWNoZWNrZWQtY2hlY2tib3gtaWNvbic7IGN1c3RvbWl6ZSB2
aWEKICAgXFxbY3VzdG9taXplLWljb25dLgogLSBuaWw6IGRpc3BsYXkgdGhlIHJhdyBtYXJrdXAu
IgogIDp0eXBlICcoY2hvaWNlIChjb25zIChzdHJpbmcgOnRhZyAiUHJlZmVycmVkIChHVUkpIikK
ICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nIDp0YWcgIkZhbGxiYWNrIChUVFkpIikpCiAg
ICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIlVzZSBpY29ucy5lbCBpY29uIiBpY29uKQogICAg
ICAgICAgICAgICAgIChjb25zdCA6dGFnICJEaXNwbGF5IG9yaWdpbmFsIG1hcmt1cCIgbmlsKSkK
ICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZmluZS1pY29u
IG1hcmtkb3duLXRzLWNoZWNrZWQtY2hlY2tib3gtaWNvbiBuaWwKICAnKChpbWFnZSAiY2hlY2tl
ZC5zdmciIDpoZWlnaHQgbGluZSA6YXNjZW50IGNlbnRlcikKICAgIChzeW1ib2wgIuKYkSIpCiAg
ICAodGV4dCAiKyIpKQogICJJY29uIHVzZWQgZm9yIGEgY2hlY2tlZCB0YXNrIGxpc3QgbWFya2Vy
IHdoZW4gbWFya3VwIGlzIGhpZGRlbi4KQ29uc3VsdGVkIG9ubHkgd2hlbiBgbWFya2Rvd24tdHMt
Y2hlY2tlZC1jaGVja2JveCcgaXMgdGhlIHN5bWJvbApgaWNvbicuIgogIDp2ZXJzaW9uICIzMS4x
IikKCihkZWZjdXN0b20gbWFya2Rvd24tdHMtdW5jaGVja2VkLWNoZWNrYm94ICcoIuKYkCIgLiAi
LSIpCiAgIklmIG1hcmt1cCBpcyBoaWRkZW4sIGRpc3BsYXkgdGhpcyBmb3IgYW4gdW5jaGVja2Vk
IHRhc2sgbGlzdCBtYXJrZXIuClZhbHVlIGZvcm1zOgogLSBjb25zIChQUkVGRVJSRUQgLiBGQUxM
QkFDSyk6IFBSRUZFUlJFRCBpcyB1c2VkIGlmIGl0cyBmaXJzdCBjaGFyYWN0ZXIKICAgcGFzc2Vz
IGBjaGFyLWRpc3BsYXlhYmxlLXAnLCBvdGhlcndpc2UgRkFMTEJBQ0suCiAtIHN5bWJvbCBgaWNv
bic6IGRlZmVyIHRvIHRoZSBpY29ucy5lbCBpY29uCiAgIGBtYXJrZG93bi10cy11bmNoZWNrZWQt
Y2hlY2tib3gtaWNvbic7IGN1c3RvbWl6ZSB2aWEKICAgXFxbY3VzdG9taXplLWljb25dLgogLSBu
aWw6IGRpc3BsYXkgdGhlIHJhdyBtYXJrdXAuIgogIDp0eXBlICcoY2hvaWNlIChjb25zIChzdHJp
bmcgOnRhZyAiUHJlZmVycmVkIChHVUkpIikKICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5n
IDp0YWcgIkZhbGxiYWNrIChUVFkpIikpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIlVz
ZSBpY29ucy5lbCBpY29uIiBpY29uKQogICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJEaXNw
bGF5IG9yaWdpbmFsIG1hcmt1cCIgbmlsKSkKICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12
ZXJzaW9uICIxLjAiKQoKKGRlZmluZS1pY29uIG1hcmtkb3duLXRzLXVuY2hlY2tlZC1jaGVja2Jv
eC1pY29uIG5pbAogICcoKGltYWdlICJ1bmNoZWNrZWQuc3ZnIiA6aGVpZ2h0IGxpbmUgOmFzY2Vu
dCBjZW50ZXIpCiAgICAoc3ltYm9sICLimJAiKQogICAgKHRleHQgIi0iKSkKICAiSWNvbiB1c2Vk
IGZvciBhbiB1bmNoZWNrZWQgdGFzayBsaXN0IG1hcmtlciB3aGVuIG1hcmt1cCBpcyBoaWRkZW4u
CkNvbnN1bHRlZCBvbmx5IHdoZW4gYG1hcmtkb3duLXRzLXVuY2hlY2tlZC1jaGVja2JveCcgaXMg
dGhlIHN5bWJvbApgaWNvbicuIgogIDp2ZXJzaW9uICIzMS4xIikKCihkZWZjdXN0b20gbWFya2Rv
d24tdHMtdGhlbWF0aWMtYnJlYWstY2hhcmFjdGVyICcoP+KUgCAuID8tKQogICJJZiBtYXJrdXAg
aXMgaGlkZGVuLCBkaXNwbGF5IHRoaXMgY2hhcmFjdGVyIGZvciB0aGVtYXRpYyBicmVha3MuCkl0
IGlzIHJlcGVhdGVkIHRvIGZpbGwgdGhlIHdpbmRvdyB3aWR0aC4gIFRoaXMgYXNzdW1lcyBhIHN0
YXRpYyB3aW5kb3cKd2lkdGguCllvdSBtYXkgcHJlZmVyIGFuIGA6ZXh0ZW5kJyBhdHRyaWJ1dGUg
b24gdGhlCmBtYXJrZG93bi10cy10aGVtYXRpYy1icmVhaycgd2hpY2ggd2lsbCBzcGFuIHdpbmRv
dyB3aWR0aCBkeW5hbWljYWxseQp1c2luZyBhbiB1bmRlcmxpbmUsIGluIHdoaWNoIGNhc2UgdGhp
cyBjaGFyYWN0ZXIgaXMgaWdub3JlZC4KVGhlIHZhbHVlIGlzIGEgY29ucyAoUFJFRkVSUkVEIC4g
RkFMTEJBQ0spOiBQUkVGRVJSRUQgaXMgdXNlZCBpZiBpdCBwYXNzZXMKYGNoYXItZGlzcGxheWFi
bGUtcCcsIG90aGVyd2lzZSBGQUxMQkFDSyBpcyB1c2VkLgpVc2UgbmlsIHRvIGRpc3BsYXkgdGhl
IHJhdyBtYXJrdXAuIgogIDp0eXBlICcoY2hvaWNlIChjb25zIChjaGFyYWN0ZXIgOnRhZyAiUHJl
ZmVycmVkIChHVUkpIikKICAgICAgICAgICAgICAgICAgICAgICAoY2hhcmFjdGVyIDp0YWcgIkZh
bGxiYWNrIChUVFkpIikpCiAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIkRpc3BsYXkgb3Jp
Z2luYWwgbWFya3VwIiBuaWwpKQogIDp2ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24g
IjEuMCIpCgooZGVmY3VzdG9tIG1hcmtkb3duLXRzLWhhcmQtbGluZS1icmVhay1iYWNrc2xhc2gg
Jyg/wrYgLiA/fCkKICAiSWYgbWFya3VwIGlzIGhpZGRlbiwgZGlzcGxheSB0aGlzIGNoYXJhY3Rl
ciBmb3IgYSBiYWNrc2xhc2ggaGFyZCBsaW5lIGJyZWFrLgpUaGUgdmFsdWUgaXMgYSBjb25zIChQ
UkVGRVJSRUQgLiBGQUxMQkFDSyk6IFBSRUZFUlJFRCBpcyB1c2VkIGlmIGl0IHBhc3NlcwpgY2hh
ci1kaXNwbGF5YWJsZS1wJywgb3RoZXJ3aXNlIEZBTExCQUNLIGlzIHVzZWQuCm5pbCBrZWVwcyB0
aGUgcmF3IG1hcmt1cC4iCiAgOnR5cGUgJyhjaG9pY2UgKGNvbnMgKGNoYXJhY3RlciA6dGFnICJQ
cmVmZXJyZWQgKEdVSSkiKQogICAgICAgICAgICAgICAgICAgICAgIChjaGFyYWN0ZXIgOnRhZyAi
RmFsbGJhY2sgKFRUWSkiKSkKICAgICAgICAgICAgICAgICAoY29uc3QgOnRhZyAiRGlzcGxheSBv
cmlnaW5hbCBtYXJrdXAiIG5pbCkKICAgICAgICAgICAgICAgICAoY29uc3QgOnRhZyAiSGlkZSBt
YXJrdXAiIGhpZGUpKQogIDp2ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIp
CgooZGVmY3VzdG9tIG1hcmtkb3duLXRzLWhhcmQtbGluZS1icmVhay1zcGFjZQogIChsYW1iZGEg
KG4pCiAgICAobGV0KiAoKHZhbCAobWFya2Rvd24tdHMtLXJlc29sdmUtZGlzcGxheS12YWx1ZQog
ICAgICAgICAgICAgICAgIG1hcmtkb3duLXRzLWhhcmQtbGluZS1icmVhay1iYWNrc2xhc2gpKQog
ICAgICAgICAgIChjaCAoaWYgKGNoYXJhY3RlcnAgdmFsKSB2YWwgP3wpKSkKICAgICAgKG1ha2Ut
c3RyaW5nIG4gY2gpKSkKICAiSWYgbWFya3VwIGlzIGhpZGRlbiwgZGlzcGxheSB0aGlzIGZvciBh
IHRyYWlsaW5nLXNwYWNlcyBoYXJkIGxpbmUgYnJlYWsuClRoZSB2YWx1ZSBjYW4gYmU6Ci0gYSBj
aGFyYWN0ZXIgb3Igc3RyaW5nOiBzaG93biBvbmNlIGF0IHRoZSBzdGFydCBvZiB0aGUgdHJhaWxp
bmcgc3BhY2VzLAogIHdpdGggbm8gcmVwZXRpdGlvbiAodGhlIHJlbWFpbmluZyBzcGFjZXMgc3Rh
eSBpbnZpc2libGUpOwotIGEgZnVuY3Rpb246IGNhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCwgdGhl
IG51bWJlciBvZiB0cmFpbGluZyBzcGFjZXMsCiAgYW5kIG11c3QgcmV0dXJuIHRoZSBzdHJpbmcg
dG8gZGlzcGxheSBpbiBwbGFjZSBvZiB0aGUgcnVuOwotIG5pbDoga2VlcCB0aGUgcmF3IG1hcmt1
cC4iCiAgOnR5cGUgJyhjaG9pY2UgKGNoYXJhY3RlciA6dGFnICJEaXNwbGF5IHNwZWNpZmllZCBj
aGFyYWN0ZXIgKG5vIHJlcGV0aXRpb24pIikKICAgICAgICAgICAgICAgICAoc3RyaW5nIDp0YWcg
IkRpc3BsYXkgc3BlY2lmaWVkIHN0cmluZyAobm8gcmVwZXRpdGlvbikiKQogICAgICAgICAgICAg
ICAgIChmdW5jdGlvbiA6dGFnICJGdW5jdGlvbiBmcm9tIGNvdW50IHRvIGRpc3BsYXkgc3RyaW5n
IikKICAgICAgICAgICAgICAgICAoY29uc3QgOnRhZyAiRGlzcGxheSBvcmlnaW5hbCBtYXJrdXAi
IG5pbCkKICAgICAgICAgICAgICAgICAoY29uc3QgOnRhZyAiSGlkZSBtYXJrdXAiIGhpZGUpKQog
IDp2ZXJzaW9uICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIpCgooZGVmY3VzdG9tIG1h
cmtkb3duLXRzLWZvbnRpZnktY29kZS1ibG9ja3MtbmF0aXZlbHkgdAogICJOb24tbmlsIG1lYW5z
IGZvbnRpZnkgY29kZSBibG9jayBjb250ZW50cyB1c2luZyB0aGUgbGFuZ3VhZ2UncyBtb2RlLgpX
aGVuIG5vbi1uaWwsIGZlbmNlZCBjb2RlIGJsb2NrcyBhcmUgaGlnaGxpZ2h0ZWQgd2l0aCBzeW50
YXggb2YgdGhlCmVtYmVkZGVkIGxhbmd1YWdlICh2aWEgdHJlZS1zaXR0ZXIgZm9yIGxhbmd1YWdl
cyB3aXRoIGEgdHJlZS1zaXR0ZXIKbW9kZSwgb3IgdmlhIGNvbnZlbnRpb25hbCBmb250LWxvY2sg
Zm9yIHRoZSByZXN0KS4gIFdoZW4gbmlsLCBjb2RlCmJsb2NrcyBrZWVwIG9ubHkgdGhlIGBtYXJr
ZG93bi10cy1jb2RlLWJsb2NrJyBiYWNrZ3JvdW5kIGZhY2UuICBUb2dnbGluZwpmb3IgdGhlIHRz
LWVtYmVkZGVkIHBhdGggdGFrZXMgZWZmZWN0IGFmdGVyIHJlc3RhcnRpbmcKYG1hcmtkb3duLXRz
LW1vZGUnIGluIHRoZSBidWZmZXIuIgogIDp0eXBlICdib29sZWFuCiAgOnZlcnNpb24gIjMxLjEi
CiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCihkZWZjdXN0b20gbWFya2Rvd24tdHMtZW5hYmxl
LWNvZGUtYmxvY2stY29udGV4dC1tb2RlIHQKICAiTm9uLW5pbCBhdXRvbWF0aWNhbGx5IGVuYWJs
ZXMgYG1hcmtkb3duLXRzLWNvZGUtYmxvY2stY29udGV4dC1tb2RlJy4KSWYgbm9uLW5pbCBhbmQg
YHBvaW50JyBpcyBpbiBhIGZlbmNlZCBjb2RlIGJsb2NrLCB0aGlzIHJ1bnMKYGluZGVudC1mb3It
dGFiLWNvbW1hbmQnLCBgbmV3bGluZScsIGV0LmFsLiwgaW4gdGhlIG1vZGUgb2YgdGhlIGNvZGUK
YmxvY2suIgogIDp0eXBlICdib29sZWFuCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVy
c2lvbiAiMS4wIikKCihkZWZjdXN0b20gbWFya2Rvd24tdHMtY29kZS1ibG9jay1pbi1jb250ZXh0
LW1vZGUtbGlnaHRlciAiIFtjb2RlXSIKICAiTWlub3IgbW9kZSBgbWFya2Rvd24tdHMtY29kZS1i
bG9jay1jb250ZXh0LW1vZGUnIGxpZ2h0ZXIgc3RyaW5nLgpTZXQgdG8gbmlsIHRvIGRpc2FibGUg
dGhlIGxpZ2h0ZXIuIgogIDp0eXBlICdzdHJpbmcKICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2Fn
ZS12ZXJzaW9uICIxLjAiKQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy1pbmhpYml0LWNvZGUtYmxv
Y2stbW9kZS13YXJuaW5ncyB0CiAgIklmIG5vbi1uaWwsIGluaGliaXQgY29kZS1ibG9jayBtYWpv
ci1tb2RlIG1lc3NhZ2VzIGFuZCB3YXJuaW5ncy4KU29tZSBmZW5jZWQgY29kZS1ibG9jayBtYWpv
ciBtb2RlcyBwcm9kdWNlIG1lc3NhZ2VzIG9yIHdhcm5pbmdzIHdoaWNoCmhhdmUgbGl0dGxlIHJl
bGV2YW5jZSB0byBNYXJrZG93biBidWZmZXJzLiAgVXNlIHRoaXMgb3B0aW9uIHRvIGluaGliaXQK
dGhlbS4gIE1ham9yIG1vZGVzIG1heSBiZSBlbmFibGVkIGZvciBmb250aWZpY2F0aW9uIG9yIGVk
aXRpbmcgaW4gdGhlCm1vZGUncyBjb250ZXh0LiIKICA6dHlwZSAnYm9vbGVhbgogIDp2ZXJzaW9u
ICIzMS4xIgogIDpwYWNrYWdlLXZlcnNpb24gIjEuMCIpCgooZGVmdmFyIHdhcm5pbmctbWluaW11
bS1sZXZlbCkKCihkZWZtYWNybyBtYXJrZG93bi10cy0taW5oaWJpdC1tZXNzYWdlcy1hbmQtd2Fy
bmluZ3MgKHZhciAmcmVzdCBib2R5KQogICJFeGVjdXRlIEJPRFkgd2l0aCBtZXNzYWdlcyBhbmQg
d2FybmluZ3MgaW5oaWJpdGVkLgpWQVIgaXMgYSB2YXJpYWJsZSdzIHN5bWJvbDsgZS5nLiwKXFw9
J21hcmtkb3duLXRzLWluaGliaXQtY29kZS1ibG9jay1tb2RlLXdhcm5pbmdzLiAgSWYgdGhlIHN5
bWJvbCdzIHZhbHVlCmlzIG5vbi1uaWwsIGRvIHdoYXQgaXQgc2F5cyBvbiB0aGUgdGluLgpJbmhp
Yml0IG1lc3NhZ2VzIGluIHRoZSBlY2hvIGFyZWEuCkluaGliaXQgbWVzc2FnZXMgaW4gdGhlIGxv
Zy4KSW5oaWJpdCB3YXJuaW5ncyB3aXRoIGxldmVsIDwgOmVycm9yLiIKICAoZGVjbGFyZSAoaW5k
ZW50IGRlZnVuKSkKICBgKGxldCogKCh2YWwgKHN5bWJvbC12YWx1ZSAsdmFyKSkKICAgICAgICAg
IChpbmhpYml0LW1lc3NhZ2UgdmFsKQogICAgICAgICA7OyBBbHNvIGluaGliaXQgbG9nZ2luZyB0
byAqTWVzc2FnZXMqCiAgICAgICAgIChtZXNzYWdlLWxvZy1tYXggKGlmIHZhbCBuaWwgbWVzc2Fn
ZS1sb2ctbWF4KSkKICAgICAgICAgKHdhcm5pbmctbWluaW11bS1sZXZlbAogICAgICAgICAgKGlm
IHZhbCA6ZXJyb3Igd2FybmluZy1taW5pbXVtLWxldmVsKSkpCiAgICAgKHByb2duICxAYm9keSkp
KQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy1kZWZhdWx0LWNvZGUtYmxvY2stbW9kZSAndGV4dC1t
b2RlCiAgIkRlZmF1bHQgbW9kZSBmb3IgYW5vbnltb3VzIGNvZGUgYmxvY2tzLiIKICA6dHlwZSAn
KGNob2ljZQogICAgICAgICAgKGNvbnN0ICA6dGFnICJUZXh0IG1vZGUiIHRleHQtbW9kZSkKICAg
ICAgICAgIChjb25zdCAgOnRhZyAiRnVuZGFtZW50YWwgbW9kZSIgZnVuZGFtZW50YWwtbW9kZSkK
ICAgICAgICAgIChzeW1ib2wgOnRhZyAiT3RoZXIgbW9kZSBzeW1ib2wiCiAgICAgICAgICAgICAg
ICAgIDp2YWxpZGF0ZSAobGFtYmRhICh3aWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChsZXQgKCh2YWwgKHdpZGdldC12YWx1ZSB3aWQpKSkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAodW5sZXNzIChhbmQgdmFsIChlcSAnc3ltYm9sICh0eXBlLW9mIHZhbCkpKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpZGdldC1wdXQgd2lkIDplcnJvciAiTXVz
dCBiZSBhIG5vbi1uaWwgc3ltYm9sIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHdpZCkpKSkpCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCihk
ZWZjdXN0b20gbWFya2Rvd24tdHMtdGFibGUtZGVmYXVsdC1jb2x1bW4td2lkdGggNQogICJDb2x1
bW4gd2lkdGggZm9yIG5ldyBjb2x1bW5zLgpZb3UgbWF5IG1ha2UgdGhpcyB3aWRlciwgYnV0IHNt
YWxsZXIgdGhhbiA1IGlzIG5vdCByZWNvbW1lbmRlZC4iCiAgOnR5cGUgJ2ludGVnZXIKICA6dmVy
c2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZmN1c3RvbSBtYXJrZG93
bi10cy1lbmFibGUtdGFibGUtbW9kZSB0CiAgIk5vbi1uaWwgYXV0b21hdGljYWxseSBlbmFibGVz
IGBtYXJrZG93bi10cy10YWJsZS1tb2RlJy4KSWYgbm9uLW5pbCwgZW5hYmxlIGBtYXJrZG93bi10
cy10YWJsZS1tb2RlJyBpZiBgcG9pbnQnIGlzIGluIGEgTWFya2Rvd24KdGFibGUuIgogIDp0eXBl
ICdib29sZWFuCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCihk
ZWZjdXN0b20gbWFya2Rvd24tdHMtdGFibGUtYXV0by1hbGlnbiAnKGNlbGwtbmF2aWdhdGlvbiB0
cmFuc3Bvc2UpCiAgIkF1dG9tYXRpY2FsbHkgYWxpZ24gdGhlIHRhYmxlIGF0IHBvaW50IGR1cmlu
ZyB0aGVzZSBvcGVyYXRpb25zLgpJZiB0LCB0cmlnZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgb3BlcmF0
aW9ucy4KSWYgbmlsLCBkbyBub3QgYXV0byBhbGlnbi4KT3RoZXJ3aXNlLCBpdCBpcyBhIGxpc3Qg
b2Ygc3ltYm9scyByZXByZXNlbnRpbmcgdGFibGUgb3BlcmF0aW9ucy4iCiAgOnR5cGUgJyhjaG9p
Y2UKICAgICAgICAgIChjb25zdCA6dGFnICJEbyBub3QgYXV0b21hdGljYWxseSBhbGlnbiIgbmls
KQogICAgICAgICAgKGNvbnN0IDp0YWcgIkFsd2F5cyBhdXRvbWF0aWNhbGx5IGFsaWduIiB0KQog
ICAgICAgICAgKHNldAogICAgICAgICAgIChjb25zdCA6dGFnICJDZWxsIG5hdmlnYXRpb24iIGNl
bGwtbmF2aWdhdGlvbikKICAgICAgICAgICAoY29uc3QgOnRhZyAiVHJhbnNwb3NlIiB0cmFuc3Bv
c2UpKSkKICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12ZXJzaW9uICIxLjAiKQoKKGRlZmN1
c3RvbSBtYXJrZG93bi10cy10YWJsZS1hbGlnbi1mZWF0dXJlcyAnKGp1c3RpZnktY2VsbHMpCiAg
IlVzZSB0aGVzZSBvcHRpb25hbCBmZWF0dXJlcyB3aGVuIGFsaWduaW5nIGEgdGFibGUuCkFsaWdu
aW5nIGEgdGFibGUgYWxpZ25zIGVhY2ggY29sdW1uIHRvIHRoZSB3aWR0aCBvZiBpdHMgd2lkZXN0
IGNlbGwuICBJdApjYW4gYWxzbyBqdXN0aWZ5IGVhY2ggY2VsbCBhY2NvcmRpbmcgdG8gdGhlIHRh
YmxlJ3MgZGVsaW1pdGVyIGxpbmUgbGVmdCwKY2VudGVyLCBvciByaWdodC1oYW5kIGp1c3RpZmlj
YXRpb24gcnVsZXMuCgpDdXN0b21pemluZyB0aGlzIHVzZXIgb3B0aW9uIGlzIG1vc3QgdXNlZnVs
IHdoZW4gdGhlIHVzZXIgb3B0aW9uCmBtYXJrZG93bi10cy10YWJsZS1hdXRvLWFsaWduJyBpcyBl
bmFibGVkIGFuZCB0byBhdm9pZCBoYXZpbmcgdG8gdXNlIGEKcHJlZml4IGFyZ3VtZW50IGJlZm9y
ZSBldmVyeSBhdXRvLWFsaWdubWVudCBvcGVyYXRpb24uCgpJZiB0LCBlbmFibGUgYWxsIG9wdGlv
bmFsIGFsaWdubWVudCBvcGVyYXRpb25zLgpJZiBuaWwsIG9wZXJhdGlvbnMgYXJlIGVuYWJsZWQg
YmV5b25kIGJhc2ljIGNvbHVtbiBhbGlnbm1lbnQuCk90aGVyd2lzZSwgaXQgaXMgYSBsaXN0IG9m
IHN5bWJvbHMuIgogIDp0eXBlICcoY2hvaWNlCiAgICAgICAgICAoY29uc3QgOnRhZyAiTm8gb3B0
aW9uYWwgZmVhdHVyZXMiIG5pbCkKICAgICAgICAgIChjb25zdCA6dGFnICJBbGwgb3B0aW9uYWwg
ZmVhdHVyZXMiIHQpCiAgICAgICAgICAoc2V0CiAgICAgICAgICAgKGNvbnN0IDp0YWcgIkp1c3Rp
ZnkgY2VsbHMiIGp1c3RpZnktY2VsbHMpKSkKICA6dmVyc2lvbiAiMzEuMSIKICA6cGFja2FnZS12
ZXJzaW9uICIxLjAiKQoKKGRlZmN1c3RvbSBtYXJrZG93bi10cy1pbi10YWJsZS1tb2RlLWxpZ2h0
ZXIgIiBbdGFibGVdIgogICJNaW5vciBtb2RlIGBtYXJrZG93bi10cy1pbi10YWJsZS1tb2RlJyBs
aWdodGVyIHN0cmluZy4KU2V0IHRvIG5pbCB0byBkaXNhYmxlIHRoZSBsaWdodGVyLiIKICA6dHlw
ZSAnc3RyaW5nCiAgOnZlcnNpb24gIjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCihk
ZWZjdXN0b20gbWFya2Rvd24tdHMtdmlldy1tb2RlLXByZS1pbml0LWhvb2sgKGxpc3QgIydtYXJr
ZG93bi10cy1hZGQtZmluYWwtbmV3bGluZSkKICAiSG9va3MgcnVuIGJlZm9yZSBgbWFya2Rvd24t
dHMtdmlldy1tb2RlYCBpbml0aWFsaXphdGlvbi4KRnVuY3Rpb25zIG9uIHRoaXMgbGlzdCBhcmUg
aW50ZW5kZWQgdG8gYW1lbmQgYnVmZmVyIGNvbnRlbnQgZm9yCmBtYXJrZG93bi10cy12aWV3LW1v
ZGUnIGFuZCB0cmVlLXNpdHRlciBNYXJrZG93biBncmFtbWFyIGNvbXBhdGliaWxpdHkuCgpGb3Ig
ZXhhbXBsZSwgYG1hcmtkb3duLXRzLWFkZC1maW5hbC1uZXdsaW5lJyBlbnN1cmVzIHRoZSBncmFt
bWFyCmNvcnJlY3RseSBwYXJzZXMgbWFya3VwIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB0aGF0
IGRlcGVuZHMgb24gYSBmaW5hbApuZXdsaW5lLiIKICA6dHlwZSAnKGhvb2spCiAgOnZlcnNpb24g
IjMxLjEiCiAgOnBhY2thZ2UtdmVyc2lvbiAiMS4wIikKCjs7OyBGYWNlczoKCihkZWZncm91cCBt
YXJrZG93bi10cy1mYWNlcyBuaWwKICAiRmFjZXMgdXNlZCBieSBNYXJrZG93bi1UUy4iCiAgOmdy
b3VwICdtYXJrZG93bi10cy1mYWNlcwogIDpncm91cCAnZmFjZXMpCgooZGVmZmFjZSBtYXJrZG93
bi10cy1kZWxpbWl0ZXIgJygodCAoOmluaGVyaXQgc2hhZG93KSkpCiAgIkZhY2UgZm9yIHRoZSAj
IGJlZm9yZSBNYXJrZG93biBoZWFkaW5ncy4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2Ug
bWFya2Rvd24tdHMtaGVhZGluZy0xICcoKHQgKDppbmhlcml0IG91dGxpbmUtMSkpKQogICJGYWNl
IGZvciBmaXJzdCBsZXZlbCBNYXJrZG93biBoZWFkaW5ncy4iCiAgOnZlcnNpb24gIjMxLjEiKQoK
KGRlZmZhY2UgbWFya2Rvd24tdHMtc2V0ZXh0LWhlYWRpbmcgJygodCAoOmluaGVyaXQgbWFya2Rv
d24tdHMtaGVhZGluZy0xKSkpCiAgIkZhY2UgZm9yIHNldGV4dCBNYXJrZG93biBoZWFkaW5ncyAo
aGVhZGluZ3MgdW5kZXJsaW5lZCBieSA9PT0gb3IgLS0tKS4iCiAgOnZlcnNpb24gIjMxLjEiKQoK
KGRlZmZhY2UgbWFya2Rvd24tdHMtaGVhZGluZy0yICcoKHQgKDppbmhlcml0IG91dGxpbmUtMikp
KQogICJGYWNlIGZvciBzZWNvbmQgbGV2ZWwgTWFya2Rvd24gaGVhZGluZ3MuIgogIDp2ZXJzaW9u
ICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWhlYWRpbmctMyAnKCh0ICg6aW5oZXJpdCBv
dXRsaW5lLTMpKSkKICAiRmFjZSBmb3IgdGhpcmQgbGV2ZWwgTWFya2Rvd24gaGVhZGluZ3MuIgog
IDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWhlYWRpbmctNCAnKCh0ICg6
aW5oZXJpdCBvdXRsaW5lLTQpKSkKICAiRmFjZSBmb3IgZm91cnRoIGxldmVsIE1hcmtkb3duIGhl
YWRpbmdzLiIKICA6dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1oZWFkaW5n
LTUgJygodCAoOmluaGVyaXQgb3V0bGluZS01KSkpCiAgIkZhY2UgZm9yIGZpZnRoIGxldmVsIE1h
cmtkb3duIGhlYWRpbmdzLiIKICA6dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10
cy1oZWFkaW5nLTYgJygodCAoOmluaGVyaXQgb3V0bGluZS02KSkpCiAgIkZhY2UgZm9yIHNpeHRo
IGxldmVsIE1hcmtkb3duIGhlYWRpbmdzLiIKICA6dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBt
YXJrZG93bi10cy1lbXBoYXNpcyAnKCh0ICg6aW5oZXJpdCBpdGFsaWMpKSkKICAiRmFjZSBmb3Ig
TWFya2Rvd24gZW1waGFzaXMgKGl0YWxpYykgdGV4dC4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRl
ZmZhY2UgbWFya2Rvd24tdHMtYm9sZCAnKCh0ICg6aW5oZXJpdCBib2xkKSkpCiAgIkZhY2UgZm9y
IE1hcmtkb3duIHN0cm9uZyBlbXBoYXNpcyAoYm9sZCkgdGV4dC4iCiAgOnZlcnNpb24gIjMxLjEi
KQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtc3RyaWtldGhyb3VnaCAnKCh0ICg6c3RyaWtlLXRocm91
Z2ggdCkpKQogICJGYWNlIGZvciBNYXJrZG93biBzdHJpa2V0aHJvdWdoIHRleHQuIgogIDp2ZXJz
aW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWJsb2NrLXF1b3RlICcoKHQgKDppbmhl
cml0IGl0YWxpYykpKQogICJGYWNlIGZvciBNYXJrZG93biBibG9jayBxdW90ZXMuIgogIDp2ZXJz
aW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWxpbmsgJygodCAoOmluaGVyaXQgbGlu
aykpKQogICJGYWNlIGZvciBNYXJrZG93biBsaW5rIHRleHQgYW5kIGltYWdlIGRlc2NyaXB0aW9u
cy4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtbGluay1kZXN0aW5h
dGlvbiAnKCh0ICg6aW5oZXJpdCBmb250LWxvY2stc3RyaW5nLWZhY2UpKSkKICAiRmFjZSBmb3Ig
TWFya2Rvd24gbGluayBkZXN0aW5hdGlvbnMgKFVSTHMpLiIKICA6dmVyc2lvbiAiMzEuMSIpCgoo
ZGVmZmFjZSBtYXJrZG93bi10cy1jb2RlLXNwYW4gJygodCAoOmluaGVyaXQgZm9udC1sb2NrLWtl
eXdvcmQtZmFjZSkpKQogICJGYWNlIGZvciBNYXJrZG93biBpbmxpbmUgY29kZSBzcGFucy4iCiAg
OnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtY29kZS1ibG9jayAnKCh0ICg6
ZXh0ZW5kIHQpKSkKICAiRmFjZSBmb3IgTWFya2Rvd24gZmVuY2VkIGNvZGUgYmxvY2sgY29udGVu
dC4KQWx0ZXIgdGhpcyBmYWNlIHRvIGFkZCBhIGA6YmFja2dyb3VuZCcgZm9yIGEgdmlzdWFsbHkg
ZGlzdGluY3QKY29kZSBibG9jayByZWdpb24sIGUuZy46CiAgKHNldC1mYWNlLWF0dHJpYnV0ZSBc
XD0nbWFya2Rvd24tdHMtY29kZS1ibG9jayBuaWwgOmJhY2tncm91bmQgXCJncmF5OTVcIikiCiAg
OnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtaW4tY29kZS1ibG9jayAnKCh0
ICg6ZXh0ZW5kIHQpKSkKICAiRmFjZSBmb3Igd2hlbiBwb2ludCBpcyBpbiBhIE1hcmtkb3duIGNv
ZGUgYmxvY2suClNlZSBgbWFya2Rvd24tdHMtY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUnLgpB
bHRlciB0aGlzIGZhY2UgdG8gYWRkIGEgYDpiYWNrZ3JvdW5kJyBmb3IgYSB2aXN1YWxseSBkaXN0
aW5jdCB0YWJsZQpyZWdpb24sIGUuZy46CiAgKHNldC1mYWNlLWF0dHJpYnV0ZSBcXD0nbWFya2Rv
d24tdHMtaW4tY29kZS1ibG9jayA6YmFja2dyb3VuZCBcImdyYXk5NVwiKSIKICA6dmVyc2lvbiAi
MzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1jb2RlLWJsb2NrLW1hcmt1cC1oaWRkZW4KICAn
KCgoKGJhY2tncm91bmQgbGlnaHQpKSAoOmJhY2tncm91bmQgImdyYXk5NSIgOmV4dGVuZCB0KSkK
ICAgICgoKGJhY2tncm91bmQgZGFyaykpICAoOmJhY2tncm91bmQgImdyYXkxNSIgOmV4dGVuZCB0
KSkpCiAgIkZhY2UgZm9yIE1hcmtkb3duIGZlbmNlZCBjb2RlIGJsb2NrIGNvbnRlbnQgd2hlbiBt
YXJrdXAgaXMgaGlkZGVuLgpVc2VkIGluc3RlYWQgb2YgYG1hcmtkb3duLXRzLWNvZGUtYmxvY2sn
IHdoZW4gYG1hcmtkb3duLXRzLWhpZGUtbWFya3VwJwppcyBub24tbmlsLiIKICA6dmVyc2lvbiAi
MzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1pbmRlbnRlZC1jb2RlLWJsb2NrICcoKHQgKDpp
bmhlcml0IGZvbnQtbG9jay1zdHJpbmctZmFjZSkpKQogICJGYWNlIGZvciBNYXJrZG93biBpbmRl
bnRlZCBjb2RlIGJsb2Nrcy4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24t
dHMtaHRtbC10YWcgJygodCAoOmluaGVyaXQgZm9udC1sb2NrLWRvYy1tYXJrdXAtZmFjZSkpKQog
ICJGYWNlIGZvciBpbmxpbmUgSFRNTCB0YWdzIGluIE1hcmtkb3duLiIKICA6dmVyc2lvbiAiMzEu
MSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1odG1sLWJsb2NrICcoKHQgKDppbmhlcml0IGZvbnQt
bG9jay1kb2MtbWFya3VwLWZhY2UpKSkKICAiRmFjZSBmb3IgSFRNTCBibG9ja3MgaW4gTWFya2Rv
d24uIgogIDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLXRoZW1hdGljLWJy
ZWFrICcoKHQgKDppbmhlcml0IHNoYWRvdyA6ZXh0ZW5kIHQpKSkKICAiRmFjZSBmb3IgTWFya2Rv
d24gdGhlbWF0aWMgYnJlYWtzIChob3Jpem9udGFsIHJ1bGVzKS4KQ3VzdG9taXplIHRoaXMgZmFj
ZSB0byBhZGQgYSA6YmFja2dyb3VuZCBmb3IgYSBmdWxsLXdpZHRoIHZpc3VhbCBydWxlLiIKICA6
dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1lbnRpdHktcmVmZXJlbmNlICco
KHQgKDppbmhlcml0IGZvbnQtbG9jay1idWlsdGluLWZhY2UpKSkKICAiRmFjZSBmb3IgbmFtZWQg
SFRNTCBlbnRpdHkgcmVmZXJlbmNlcyBsaWtlICZhbXA7IGFuZCAmY29weTsuIgogIDp2ZXJzaW9u
ICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5j
ZQogICcoKHQgKDppbmhlcml0IGZvbnQtbG9jay1lc2NhcGUtZmFjZSkpKQogICJGYWNlIGZvciBu
dW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2VzIGxpa2UgJiM2NTsgYW5kICYjeDQxOy4iCiAgOnZl
cnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtbGF0ZXggJygodCAoOmluaGVyaXQg
Zm9udC1sb2NrLXN0cmluZy1mYWNlKSkpCiAgIkZhY2UgZm9yIExhVGVYIC8gbWF0aCBjb250ZW50
IGluIE1hcmtkb3duICgkLi4uJCBhbmQgJCQuLi4kJCkuIgogIDp2ZXJzaW9uICIzMS4xIikKCihk
ZWZmYWNlIG1hcmtkb3duLXRzLXRhYmxlLWhlYWRlciAnKCh0ICg6aW5oZXJpdCAoYm9sZCBmb250
LWxvY2stZG9jLWZhY2UpKSkpCiAgIkZhY2UgZm9yIE1hcmtkb3duIHBpcGUgdGFibGUgaGVhZGVy
IGNlbGxzLiIKICA6dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy10YWJsZS1j
ZWxsICcoKHQgKDppbmhlcml0IGRlZmF1bHQpKSkKICAiRmFjZSBmb3IgTWFya2Rvd24gcGlwZSB0
YWJsZSBkYXRhIGNlbGxzLiIKICA6dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10
cy10YWJsZS1kZWxpbWl0ZXItY2VsbCAnKCh0ICg6aW5oZXJpdCBmb250LWxvY2stZG9jLWZhY2Up
KSkKICAiRmFjZSBmb3IgTWFya2Rvd24gcGlwZSB0YWJsZSBkZWxpbWl0ZXIgY2VsbHMgKC0tLSBz
ZXBhcmF0b3JzKS4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtdGFi
bGUgJygodCAoOmV4dGVuZCB0KSkpCiAgIkZhY2UgZm9yIE1hcmtkb3duIHRhYmxlLgpBbHRlciB0
aGlzIGZhY2UgdG8gYWRkIGEgYDpiYWNrZ3JvdW5kJyBmb3IgYSB2aXN1YWxseSBkaXN0aW5jdCB0
YWJsZQpyZWdpb24sIGUuZy46CiAgKHNldC1mYWNlLWF0dHJpYnV0ZSBcXD0nbWFya2Rvd24tdHMt
dGFibGUgbmlsIDpiYWNrZ3JvdW5kIFwiZ3JheTk1XCIpIgogIDp2ZXJzaW9uICIzMS4xIikKCihk
ZWZmYWNlIG1hcmtkb3duLXRzLWluLXRhYmxlICcoKHQgKDpleHRlbmQgdCkpKQogICJGYWNlIGZv
ciBNYXJrZG93biBgbWFya2Rvd24tdHMtaW4tdGFibGUtbW9kZScgd2hlbiBwb2ludCBpcyBpbiBh
IHRhYmxlLgpBbHRlciB0aGlzIGZhY2UgdG8gYWRkIGEgYDpiYWNrZ3JvdW5kJyBmb3IgYSB2aXN1
YWxseSBkaXN0aW5jdCB0YWJsZQpyZWdpb24sIGUuZy46CiAgKHNldC1mYWNlLWF0dHJpYnV0ZSBc
XD0nbWFya2Rvd24tdHMtaW4tdGFibGUgbmlsIDpiYWNrZ3JvdW5kIFwiZ3JheTk1XCIpIgogIDp2
ZXJzaW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWxhbmd1YWdlLWtleXdvcmQgJygo
dCAoOmluaGVyaXQgZm9udC1sb2NrLWtleXdvcmQtZmFjZSkpKQogICJGYWNlIGZvciB0aGUgbGFu
Z3VhZ2Uga2V5d29yZCBmb3IgTWFya2Rvd24gY29kZSBibG9ja3MuIgogIDp2ZXJzaW9uICIzMS4x
IikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWxpc3QtbWFya2VyICcoKHQgKDppbmhlcml0IHNoYWRv
dykpKQogICJGYWNlIGZvciBNYXJrZG93biBsaXN0IG1hcmtlcnMgbGlrZSAtIGFuZCAqLiIKICA6
dmVyc2lvbiAiMzEuMSIpCgooZGVmZmFjZSBtYXJrZG93bi10cy1oYXJkLWxpbmUtYnJlYWstYmFj
a3NsYXNoCiAgJygodCAoOmluaGVyaXQgb3V0bGluZS00IDp3ZWlnaHQgYm9sZCkpKQogICJGYWNl
IGZvciBNYXJrZG93biBoYXJkIGxpbmUgYnJlYWtzIGludHJvZHVjZWQgYnkgYSB0cmFpbGluZyBi
YWNrc2xhc2guIgogIDp2ZXJzaW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLWhhcmQt
bGluZS1icmVhay1iYWNrc2xhc2gtaGlkZGVuCiAgJygodCAoOmluaGVyaXQgb3V0bGluZS00IDp3
ZWlnaHQgYm9sZCkpKQogICJGYWNlIGZvciB0cmFpbGluZy1iYWNrc2xhc2ggaGFyZCBsaW5lIGJy
ZWFrIHdoZW4gbWFya3VwIGlzIGhpZGRlbi4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2Ug
bWFya2Rvd24tdHMtaGFyZC1saW5lLWJyZWFrLXNwYWNlCiAgJygoKChiYWNrZ3JvdW5kIGxpZ2h0
KSkgKDpiYWNrZ3JvdW5kICJncmF5NzAiIDp3ZWlnaHQgYm9sZCkpCiAgICAoKChiYWNrZ3JvdW5k
IGRhcmspKSAgKDpiYWNrZ3JvdW5kICJncmF5NDAiIDp3ZWlnaHQgYm9sZCkpKQogICJGYWNlIGZv
ciBNYXJrZG93biBoYXJkIGxpbmUgYnJlYWtzIGludHJvZHVjZWQgYnkgdHdvIHRyYWlsaW5nIHNw
YWNlcy4KVGhlIHRyYWlsaW5nIHNwYWNlcyBhcmUgb3RoZXJ3aXNlIGludmlzaWJsZSwgc28gdGhl
eSBhcmUgc2hvd24gYXMgYQpzaGFkb3ctY29sb3JlZCBibG9jay4iCiAgOnZlcnNpb24gIjMxLjEi
KQoKKGRlZmZhY2UgbWFya2Rvd24tdHMtaGFyZC1saW5lLWJyZWFrLXNwYWNlLWhpZGRlbgogICco
KHQgKDppbmhlcml0IG91dGxpbmUtNCA6d2VpZ2h0IGJvbGQpKSkKICAiRmFjZSBmb3IgdHJhaWxp
bmctc3BhY2VzIGhhcmQgbGluZSBicmVhayB3aGVuIG1hcmt1cCBpcyBoaWRkZW4uIgogIDp2ZXJz
aW9uICIzMS4xIikKCihkZWZmYWNlIG1hcmtkb3duLXRzLXRhc2stdW5jaGVja2VkICcoKHQgKDpp
bmhlcml0IG1hcmtkb3duLXRzLWxpc3QtbWFya2VyKSkpCiAgIkZhY2UgZm9yIE1hcmtkb3duIHVu
Y2hlY2tlZCB0YXNrIGxpc3QgbWFya2Vycy4iCiAgOnZlcnNpb24gIjMxLjEiKQoKKGRlZmZhY2Ug
bWFya2Rvd24tdHMtdGFzay1jaGVja2VkICcoKHQgKDppbmhlcml0IG1hcmtkb3duLXRzLWxpc3Qt
bWFya2VyKSkpCiAgIkZhY2UgZm9yIE1hcmtkb3duIGNoZWNrZWQgdGFzayBsaXN0IG1hcmtlcnMu
IgogIDp2ZXJzaW9uICIzMS4xIikKCih0cmVlc2l0LWRlY2xhcmUtdW5hdmFpbGFibGUtZnVuY3Rp
b25zKQoKKGFkZC10by1saXN0CiAndHJlZXNpdC1sYW5ndWFnZS1zb3VyY2UtYWxpc3QKICcobWFy
a2Rvd24KICAgImh0dHBzOi8vZ2l0aHViLmNvbS90cmVlLXNpdHRlci1ncmFtbWFycy90cmVlLXNp
dHRlci1tYXJrZG93biIKICAgOmNvbW1pdCAiNDEzMjg1MjMxY2U4ZmE4YjExZTcwNzRiYmUyNjVi
NDhhYTcyNzdmOSIKICAgOnNvdXJjZS1kaXIgInRyZWUtc2l0dGVyLW1hcmtkb3duL3NyYyIpCiB0
KQoKKGFkZC10by1saXN0CiAndHJlZXNpdC1sYW5ndWFnZS1zb3VyY2UtYWxpc3QKICcobWFya2Rv
d24taW5saW5lCiAgICJodHRwczovL2dpdGh1Yi5jb20vdHJlZS1zaXR0ZXItZ3JhbW1hcnMvdHJl
ZS1zaXR0ZXItbWFya2Rvd24iCiAgIDpjb21taXQgIjQxMzI4NTIzMWNlOGZhOGIxMWU3MDc0YmJl
MjY1YjQ4YWE3Mjc3ZjkiCiAgIDpzb3VyY2UtZGlyICJ0cmVlLXNpdHRlci1tYXJrZG93bi1pbmxp
bmUvc3JjIikKIHQpCgo7OzsgVmFyaWFibGVzOgoKKGRlZnZhciBtYXJrZG93bi10cy0tc2V0LXVw
LWlubGluZSBuaWwKICAiTGV0IGJpbmQgdGhpcyB0byBub24tbmlsIGZvciBpbmxpbmUgYG1hcmtk
b3duLXRzLW1vZGUnIGJ1ZmZlcnMuIikKCihkZWZ2YXIgbWFya2Rvd24tdHMtY29kZS1ibG9jay1t
b2RlcwogIGAoKHNoIGJhc2gtdHMtbW9kZSkKICAgIChzaGVsbCBiYXNoLXRzLW1vZGUpCiAgICAo
LChpbnRlcm4gImMjIikgY3NoYXJwLXRzLW1vZGUpCiAgICAoY3BwIGMrKy10cy1tb2RlKQogICAg
KGVsIGVtYWNzLWxpc3AtbW9kZSkKICAgIChlbGlzcCBlbWFjcy1saXNwLW1vZGUpCiAgICAoZ29s
YW5nIGdvLXRzLW1vZGUpCiAgICAoZ29tb2QgZ28tbW9kLXRzLW1vZGUpCiAgICAoZ293b3JrIGdv
LXdvcmstdHMtbW9kZSkKICAgIChqYXZhc2NyaXB0IGpzLXRzLW1vZGUpCiAgICAobWQgbWFya2Rv
d24tdHMtbW9kZSkKICAgIChweSBweXRob24tdHMtbW9kZSkKICAgIChyYiBydWJ5LXRzLW1vZGUp
CiAgICAocnMgcnVzdC10cy1tb2RlKQogICAgKHRleCBsYXRleC1tb2RlKQogICAgKHRzIHR5cGVz
Y3JpcHQtdHMtbW9kZSkKICAgICh5bWwgeWFtbC10cy1tb2RlKSkKICAiRXh0cmEgbWFwcGluZ3Mg
ZnJvbSBjb2RlIGJsb2NrIGxhbmd1YWdlIHRhZ3MgdG8gbWFqb3IgbW9kZXMuCkVudHJpZXMgaGVy
ZSBhcmUgb25seSBuZWVkZWQgd2hlbiB0aGUgbGFuZ3VhZ2UgdGFnIGluIGEgZmVuY2VkIGNvZGUK
YmxvY2sgZG9lcyBOT1QgbWF0Y2ggdGhlIGNvbnZlbnRpb25hbCBtb2RlIG5hbWUgZGVyaXZhdGlv
biwgZS5nLiB0aGUKdXNlciB3cml0ZXMgXFw9YFxcPWBcXD1gdHMgaW5zdGVhZCBvZiBcXD1gXFw9
YFxcPWB0eXBlc2NyaXB0LCBvcgpcXD1gXFw9YFxcPWBweSBpbnN0ZWFkIG9mIFxcPWBcXD1gXFw9
YHB5dGhvbi4gIEZvciB0YWdzIHRoYXQgYWxyZWFkeQpyZXNvbHZlIHZpYSB0aGUgc3RhbmRhcmQg
XCItdHMtbW9kZVwiL1wiLW1vZGVcIiBoZXVyaXN0aWNzIHRoZXJlIGlzIG5vCm5lZWQgdG8gYWRk
IGFuIGVudHJ5LgoKVGhlIGFsaXN0IGlzIG9mIHRoZSBmb3JtIChMQU5HVUFHRSBNQUpPUi1NT0RF
KS4gTUFKT1ItTU9ERSBjYW4gYmUgYQp0cmVlLXNpdHRlciBvciBhIGNvbnZlbnRpb25hbCBtb2Rl
LgoKSWYgeW91IHByZWZlciBhIGNvbnZlbnRpb25hbCBtb2RlIG92ZXIgaXRzIHRyZWUtc2l0dGVy
IHZhcmlhbnQsIGFkZCBvcgpyZXBsYWNlIHJlbGV2YW50IGVudHJpZXMuICBGb3IgZXhhbXBsZToK
CiAgICAoYWRkLXRvLWxpc3QgXFw9J21hcmtkb3duLXRzLWNvZGUtYmxvY2stbW9kZXMKICAgICAg
XFw9JyhweXRob24gcHl0aG9uLW1vZGUpKQogICAgKHNldGYgKGFsaXN0LWdldCBcXD0ncHkgbWFy
a2Rvd24tdHMtY29kZS1ibG9jay1tb2RlcykKICAgICAgICAgIFxcPScocHl0aG9uLW1vZGUpKQoK
Q29kZSBibG9ja3MgZm9yIHRoYXQgbm9uIHRyZWUtc2l0dGVyIG1vZGVzIHdpbGwgYmUgZm9udGlm
aWVkIHVzaW5nIHRoZQptb2RlJ3MgY29udmVudGlvbmFsIGZvbnQtbG9jayBydWxlcy4iKQoKKGRl
ZnZhciBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWZvcmNlLWNvbnZlbnRpb25hbC1tb2RlcwogICco
bWFya2Rvd24tdHMtbW9kZQogICAgcGhwLXRzLW1vZGUpCiAgIlRyZWF0IHRoZXNlIGNvZGUgYmxv
Y2sgdHJlZS1zaXR0ZXIgbW9kZXMgYXMgY29udmVudGlvbmFsLgpTb21lIG1vZGVzIHRoYXQgZW1i
ZWQgbXVsdGlwbGUgYHRyZWVzaXQnIHBhcnNlcnMgbmVlZCB0byBiZSB0cmVhdGVkIHdpdGgKY29u
dmVudGlvbmFsIGZvbnQtbG9jay4gIGBtYXJrZG93bi10cy1tb2RlJyBpdHNlbGYgaXMgb25lIG9m
IHRoZW0uIikKCjs7OyBGb250LWxvY2s6CgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktZGVs
aW1pdGVyIChub2RlIG92ZXJyaWRlIHN0YXJ0IGVuZCAmcmVzdCBfKQogICJGb250aWZ5IGRlbGlt
aXRlciBOT0RFIGFuZCBvcHRpb25hbGx5IGhpZGUgaXRzIG1hcmt1cC4KTk9ERSBpcyB0aGUgdHJl
ZS1zaXR0ZXIgbm9kZSByZXByZXNlbnRpbmcgdGhlIGRlbGltaXRlci4KT1ZFUlJJREUsIFNUQVJU
LCBhbmQgRU5EIGFyZSBwYXNzZWQgdGhyb3VnaCB0bwpgdHJlZXNpdC1mb250aWZ5LXdpdGgtb3Zl
cnJpZGUnLiIKICAodHJlZXNpdC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUKICAgKHRyZWVzaXQtbm9k
ZS1zdGFydCBub2RlKSAodHJlZXNpdC1ub2RlLWVuZCBub2RlKQogICAnbWFya2Rvd24tdHMtZGVs
aW1pdGVyIG92ZXJyaWRlIHN0YXJ0IGVuZCkKICAod2hlbiBtYXJrZG93bi10cy1oaWRlLW1hcmt1
cAogICAgKHB1dC10ZXh0LXByb3BlcnR5ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkgKHRyZWVz
aXQtbm9kZS1lbmQgbm9kZSkKICAgICAgICAgICAgICAgICAgICAgICAnaW52aXNpYmxlICdtYXJr
ZG93bi10cy0tbWFya3VwKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktYXR4LWRlbGlt
aXRlciAobm9kZSBvdmVycmlkZSBzdGFydCBlbmQgJnJlc3QgXykKICAiRm9udGlmeSBhdHhfaGVh
ZGluZyBkZWxpbWl0ZXIgTk9ERSBhbmQgb3B0aW9uYWxseSBoaWRlIGl0cyBtYXJrdXAuCk5PREUg
aXMgdGhlIHRyZWUtc2l0dGVyIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBkZWxpbWl0ZXIuCkxlYWRp
bmcgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBkZWxpbWl0ZXIgYW5kIHRoZSBoZWFkaW5nIHRleHQg
aXMgaGlkZGVuCmFsb25nIHdpdGggdGhlIGRlbGltaXRlciB3aGVuIGhpZGluZyBtYXJrdXAuCk9W
RVJSSURFLCBTVEFSVCwgYW5kIEVORCBhcmUgcGFzc2VkIHRocm91Z2ggdG8KYHRyZWVzaXQtZm9u
dGlmeS13aXRoLW92ZXJyaWRlJy4iCiAgKHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlCiAg
ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkgKHRyZWVzaXQtbm9kZS1lbmQgbm9kZSkKICAgJ21h
cmtkb3duLXRzLWRlbGltaXRlciBvdmVycmlkZSBzdGFydCBlbmQpCiAgKHdoZW4gbWFya2Rvd24t
dHMtaGlkZS1tYXJrdXAKICAgIChwdXQtdGV4dC1wcm9wZXJ0eSAodHJlZXNpdC1ub2RlLXN0YXJ0
IG5vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAg
ICAgICAgICAgICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAg
ICAgICAgICAgICAgICAgICAgKHJlLXNlYXJjaC1mb3J3YXJkICJbXls6Ymxhbms6XV0iIChwb3Mt
ZW9sKSAnbm8tZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGVxIChwb2ludCkg
KHBvcy1lb2wpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludCkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKDEtIChwb2ludCkpKSkKICAgICAgICAgICAgICAgICAgICAgICAn
aW52aXNpYmxlICdtYXJrZG93bi10cy0tbWFya3VwKSkpCgooZGVmdmFyIHVybC1tYWlsLWNvbW1h
bmQpIDsgdXJsL3VybC12YXJzLmVsCgooZGVmdW4gbWFya2Rvd24tdHMtLW1ha2UtbGluay1idXR0
b24gKGJlZyBlbmQgdXJsKQogICJNYWtlIHRoZSByZWdpb24gZnJvbSBCRUcgdG8gRU5EIGEgY2xp
Y2thYmxlIGJ1dHRvbiBmb3IgVVJMLgpGb3IgbWFpbHRvOiBVUklzLCB1c2UgYHVybC1tYWlsLWNv
bW1hbmQnLiAgRm9yIG90aGVyIHNjaGVtZXMKXChlLmcuLCBodHRwLCBmdHApLCBvcGVuIHdpdGgg
YGJyb3dzZS11cmwnLiAgT3RoZXJ3aXNlLCB0cmVhdCBhcwphIHJlbGF0aXZlIGZpbGUgcGF0aCBh
bmQgb3BlbiB3aXRoIGBmaW5kLWZpbGUnLgoKRG8gbm90IHBhc3MgYGZhY2UnIHRvIGBtYWtlLXRl
eHQtYnV0dG9uJzogdGhlIGxpbmsgZmFjZSBpcyBhbHJlYWR5CmFwcGxpZWQgYnkgYG1hcmtkb3du
LXRzLS1mb250aWZ5LWxpbmstbm9kZScgdmlhCmB0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVycmlk
ZScgKHdpdGggYDpvdmVycmlkZSBhcHBlbmQnKSwgYW5kCmBhZGQtdGV4dC1wcm9wZXJ0aWVzJyB3
b3VsZCBvdGhlcndpc2UgcmVwbGFjZSB0aGUgYXBwZW5kZWQgZmFjZQpsaXN0IHdpdGggYSBzaW5n
bGUgYG1hcmtkb3duLXRzLWxpbmsnLCBjbG9iYmVyaW5nIGFuIGVuY2xvc2luZwpoZWFkaW5nIGZh
Y2UuIgogIDs7IE5PVEU6IFVSSSBzY2hlbWUgYW5kIGhvc3QgbmFtZSBhcmUgY2FzZS1pbnNlbnNp
dGl2ZSBwZXIgUkZDIDM5ODYKICA7OyBhbmQgUkZDIDcyMzAuCiAgKGxldCAoKGNhc2UtZm9sZC1z
ZWFyY2ggbmlsKSkKICAgIChtYWtlLXRleHQtYnV0dG9uIGJlZyBlbmQKICAgICAgICAgICAgICAg
ICAgICAgICdhY3Rpb24gKGxhbWJkYSAoX2J1dHRvbikKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoY29uZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cmluZy1w
cmVmaXgtcCAiIyIgdXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcmtk
b3duLXRzLS1mb2xsb3ctZnJhZ21lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoc3Vic3RyaW5nIHVybCAxKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgo
c3RyaW5nLW1hdGNoLXAgIlxcYG1haWx0bzoiIHVybCkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChmdW5jYWxsIHVybC1tYWlsLWNvbW1hbmQKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxgbWFpbHRvOiIgIiIgdXJsKSkp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3RyaW5nLW1hdGNoLXAgIlxcYFth
LXpdKzoiIHVybCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChicm93c2UtdXJs
IHVybCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0IChmaW5kLWZpbGUgdXJs
KSkpKQogICAgICAgICAgICAgICAgICAgICAgJ2hlbHAtZWNobyB1cmwpKSkKCihkZWZ1biBtYXJr
ZG93bi10cy0tZm9udGlmeS1saW5rLWRlc3RpbmF0aW9uIChub2RlIG92ZXJyaWRlIHN0YXJ0IGVu
ZCAmcmVzdCBfKQogICJGb250aWZ5IGxpbmsgZGVzdGluYXRpb24gTk9ERSBhbmQgaGlkZSBpdCB3
aGVuIG1hcmt1cCBpcyBoaWRkZW4uCk9WRVJSSURFLCBTVEFSVCwgYW5kIEVORCBhcmUgcGFzc2Vk
IHRocm91Z2ggdG8KYHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlJy4iCiAgKHRyZWVzaXQt
Zm9udGlmeS13aXRoLW92ZXJyaWRlCiAgICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkgKHRyZWVz
aXQtbm9kZS1lbmQgbm9kZSkKICAgJ21hcmtkb3duLXRzLWxpbmstZGVzdGluYXRpb24gb3ZlcnJp
ZGUgc3RhcnQgZW5kKQogICh3aGVuIG1hcmtkb3duLXRzLWhpZGUtbWFya3VwCiAgICAocHV0LXRl
eHQtcHJvcGVydHkgKHRyZWVzaXQtbm9kZS1zdGFydCBub2RlKSAodHJlZXNpdC1ub2RlLWVuZCBu
b2RlKQogICAgICAgICAgICAgICAgICAgICAgICdpbnZpc2libGUgJ21hcmtkb3duLXRzLS1tYXJr
dXApKSkKCihkZWZ2YXItbG9jYWwgbWFya2Rvd24tdHMtLWxpbmstcmVmLWNhY2hlIG5pbAogICJD
YWNoZWQgYWxpc3Qgb2YgKExBQkVMIC4gVVJMKSBmcm9tIGxpbmsgcmVmZXJlbmNlIGRlZmluaXRp
b25zLgpFYWNoIGVudHJ5IGlzIGEgY29ucyBjZWxsIG1hcHBpbmcgYSBkb3duY2FzZWQgbGFiZWwg
c3RyaW5nIHRvIGl0cwpkZXN0aW5hdGlvbiBVUkwuIikKCihkZWZ2YXItbG9jYWwgbWFya2Rvd24t
dHMtLWxpbmstcmVmLWNhY2hlLXRpY2sgbmlsCiAgIlZhbHVlIG9mIGBidWZmZXItY2hhcnMtbW9k
aWZpZWQtdGljaycgd2hlbiB0aGUgY2FjaGUgd2FzIGJ1aWx0LiIpCgooZGVmdW4gbWFya2Rvd24t
dHMtLWxpbmstcmVmLWRlZmluaXRpb25zICgpCiAgIlJldHVybiBhbiBhbGlzdCBvZiAoTEFCRUwg
LiBVUkwpIGZyb20gbGluayByZWZlcmVuY2UgZGVmaW5pdGlvbnMuCkxBQkVMIGlzIGRvd25jYXNl
ZCBmb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZy4gIFJlc3VsdHMgYXJlCmNhY2hlZCBhbmQg
cmVidWlsdCBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBjaGFuZ2VzLiIKICAobGV0ICgodGljayAoYnVm
ZmVyLWNoYXJzLW1vZGlmaWVkLXRpY2spKSkKICAgICh1bmxlc3MgKGVxIHRpY2sgbWFya2Rvd24t
dHMtLWxpbmstcmVmLWNhY2hlLXRpY2spCiAgICAgIChsZXQqICgocm9vdCAodHJlZXNpdC1idWZm
ZXItcm9vdC1ub2RlICdtYXJrZG93bikpCiAgICAgICAgICAgICAobWF0Y2hlcyAodHJlZXNpdC1x
dWVyeS1jYXB0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgcm9vdAogICAgICAgICAgICAgICAg
ICAgICAgICcoKGxpbmtfcmVmZXJlbmNlX2RlZmluaXRpb24KICAgICAgICAgICAgICAgICAgICAg
ICAgICAobGlua19sYWJlbCkgQGxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmtf
ZGVzdGluYXRpb24pIEBkZXN0KSkpKQogICAgICAgICAgICAgZGVmcykKICAgICAgICAod2hpbGUg
bWF0Y2hlcwogICAgICAgICAgKGxldCogKChsYWJlbC1wYWlyIChwb3AgbWF0Y2hlcykpCiAgICAg
ICAgICAgICAgICAgKGRlc3QtcGFpciAocG9wIG1hdGNoZXMpKQogICAgICAgICAgICAgICAgIChs
YmwtdGV4dCAoc3RyaW5nLXRyaW0gKHRyZWVzaXQtbm9kZS10ZXh0IChjZHIgbGFiZWwtcGFpcikg
dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXFsiICJcXF0iKSkp
CiAgICAgICAgICAgIChwdXNoIChjb25zIChkb3duY2FzZSBsYmwtdGV4dCkKICAgICAgICAgICAg
ICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS10ZXh0IChjZHIgZGVzdC1wYWlyKSB0KSkKICAgICAg
ICAgICAgICAgICAgZGVmcykpKQogICAgICAgIChzZXRxIG1hcmtkb3duLXRzLS1saW5rLXJlZi1j
YWNoZSAobnJldmVyc2UgZGVmcykKICAgICAgICAgICAgICBtYXJrZG93bi10cy0tbGluay1yZWYt
Y2FjaGUtdGljayB0aWNrKSkpCiAgICBtYXJrZG93bi10cy0tbGluay1yZWYtY2FjaGUpKQoKKGRl
ZnVuIG1hcmtkb3duLXRzLS1yZXNvbHZlLWxpbmstcmVmIChsYWJlbCkKICAiUmVzb2x2ZSBMQUJF
TCB0byBhIFVSTCB2aWEgbGluayByZWZlcmVuY2UgZGVmaW5pdGlvbnMuCkxBQkVMIHNob3VsZCBi
ZSB0aGUgdGV4dCB3aXRob3V0IGJyYWNrZXRzLiAgTWF0Y2hpbmcgaXMKY2FzZS1pbnNlbnNpdGl2
ZSBwZXIgQ29tbW9uTWFyayBzcGVjIHNlY3Rpb24gNC43LiIKICAoYWxpc3QtZ2V0IChkb3duY2Fz
ZSBsYWJlbCkgKG1hcmtkb3duLXRzLS1saW5rLXJlZi1kZWZpbml0aW9ucykKICAgICAgICAgICAg
IG5pbCBuaWwgIydlcXVhbCkpCgo7OzsgRnJhZ21lbnQgbGlua3M6CgooZGVmY29uc3QgbWFya2Rv
d24tdHMtLXNsdWctZ2l0aHViLXN0cmlwLXJlCiAgIltdWyFcIiMkJSYnKCkqKywuLzo7PD0+P0Bc
XF5ge3x9fl0iCiAgIlB1bmN0dWF0aW9uIHN0cmlwcGVkIGJ5IEdpdEh1YidzIGdoLXNsdWdnZXIg
YmVmb3JlIGh5cGhlbmF0aW9uLiIpCgooZGVmdW4gbWFya2Rvd24tdHMtLXNsdWctZ2l0aHViICh0
ZXh0KQogICJSZXR1cm4gdGhlIEdpdEh1Yi1mbGF2b3Igc2x1ZyBmb3IgaGVhZGluZyBURVhULgpN
aXJyb3JzIHRoZSBnaC1zbHVnZ2VyIGFsZ29yaXRobTogbG93ZXJjYXNlLCBzdHJpcCBhIGZpeGVk
CnB1bmN0dWF0aW9uIHNldCwgcmVwbGFjZSBzcGFjZXMgd2l0aCBoeXBoZW5zLiIKICAobGV0KiAo
KGxjIChkb3duY2FzZSB0ZXh0KSkKICAgICAgICAgKHN0cmlwcGVkIChyZXBsYWNlLXJlZ2V4cC1p
bi1zdHJpbmcKICAgICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy0tc2x1Zy1naXRodWItc3Ry
aXAtcmUgIiIgbGMpKSkKICAgIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgIltbOmJsYW5rOl1d
IiAiLSIgc3RyaXBwZWQpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tc2x1Zy1wYW5kb2MgKHRleHQp
CiAgIlJldHVybiB0aGUgUGFuZG9jLWZsYXZvciBhdXRvLWlkIHNsdWcgZm9yIGhlYWRpbmcgVEVY
VC4KTWlycm9ycyBQYW5kb2MncyBhbGdvcml0aG06IGRyb3AgZXZlcnl0aGluZyBiZWZvcmUgdGhl
IGZpcnN0CmxldHRlciwga2VlcCBhbHBoYW51bWVyaWNzIGFuZCBgXy0uJywgY29sbGFwc2Ugd2hp
dGVzcGFjZSBydW5zIHRvCmh5cGhlbnMsIGxvd2VyY2FzZS4gIEZhbGxzIGJhY2sgdG8gXCJzZWN0
aW9uXCIgaWYgZW1wdHkuIgogIChsZXQqICgobGMgKGRvd25jYXNlIHRleHQpKQogICAgICAgICAo
ZnJvbS1sZXR0ZXIgKGlmIChzdHJpbmctbWF0Y2ggIltbOmFscGhhOl1dIiBsYykKICAgICAgICAg
ICAgICAgICAgICAgICAgICAoc3Vic3RyaW5nIGxjIChtYXRjaC1iZWdpbm5pbmcgMCkpCiAgICAg
ICAgICAgICAgICAgICAgICAgICIiKSkKICAgICAgICAgKGtlcHQgKHJlcGxhY2UtcmVnZXhwLWlu
LXN0cmluZwogICAgICAgICAgICAgICAgIlteWzphbG51bTpdXy5cblx0WzpibGFuazpdLV0iICIi
IGZyb20tbGV0dGVyKSkKICAgICAgICAgKGh5cGhlbmF0ZWQgKHJlcGxhY2UtcmVnZXhwLWluLXN0
cmluZyAiW1s6Ymxhbms6XVx0XG5dKyIgIi0iIGtlcHQpKQogICAgICAgICAodHJpbW1lZCAocmVw
bGFjZS1yZWdleHAtaW4tc3RyaW5nICItK1xcJyIgIiIgaHlwaGVuYXRlZCkpKQogICAgKGlmIChz
dHJpbmctZW1wdHktcCB0cmltbWVkKSAic2VjdGlvbiIgdHJpbW1lZCkpKQoKKGRlZmNvbnN0IG1h
cmtkb3duLXRzLS1leHBsaWNpdC1pZC1yZQogICJbIFx0XSp7WyBcdF0qI1xcKFtefSBcdF0rXFwp
WyBcdF0qfVsgXHRdKlxcJyIKICAiTWF0Y2ggYSBQYW5kb2Mtc3R5bGUgdHJhaWxpbmcgYHsjaWR9
JyBvbiBhIGhlYWRpbmcgbGluZS4KQ2FwdHVyZSBncm91cCAxIGlzIHRoZSBleHBsaWNpdCBpZC4i
KQoKKGRlZnVuIG1hcmtkb3duLXRzLS1oZWFkaW5nLXRleHQtYW5kLWlkIChyYXcpCiAgIlNwbGl0
IFJBVyBoZWFkaW5nIHRleHQgaW50byAoVklTSUJMRSAuIEVYUExJQ0lULUlEKS4KRVhQTElDSVQt
SUQgaXMgbm9uLW5pbCBpZiBSQVcgZW5kcyB3aXRoIGEgUGFuZG9jLXN0eWxlIGB7I2lkfScsCmlu
IHdoaWNoIGNhc2UgVklTSUJMRSBpcyBSQVcgd2l0aCB0aGF0IHN1ZmZpeCByZW1vdmVkLiIKICAo
aWYgKHN0cmluZy1tYXRjaCBtYXJrZG93bi10cy0tZXhwbGljaXQtaWQtcmUgcmF3KQogICAgICAo
Y29ucyAoc3Vic3RyaW5nIHJhdyAwIChtYXRjaC1iZWdpbm5pbmcgMCkpCiAgICAgICAgICAgICht
YXRjaC1zdHJpbmcgMSByYXcpKQogICAgKGNvbnMgcmF3IG5pbCkpKQoKKGRlZnZhci1sb2NhbCBt
YXJrZG93bi10cy0taGVhZGluZy1pZC1jYWNoZSBuaWwKICAiQ2FjaGVkIGhhc2ggdGFibGUgbWFw
cGluZyBoZWFkaW5nIHNsdWcgc3RyaW5ncyB0byBidWZmZXIgcG9zaXRpb25zLgpFYWNoIHZhbHVl
IGlzIHRoZSBidWZmZXIgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGluZwpgYXR4
X2hlYWRpbmcnIG9yIGBzZXRleHRfaGVhZGluZycgbm9kZS4gIEJ1aWx0IGxhemlseSBieQpgbWFy
a2Rvd24tdHMtLWhlYWRpbmctaWRzJywgaW52YWxpZGF0ZWQgYnkgYnVmZmVyLXRpY2sgY2hhbmdl
LiIpCgooZGVmdmFyLWxvY2FsIG1hcmtkb3duLXRzLS1oZWFkaW5nLWlkLWNhY2hlLXRpY2sgbmls
CiAgIlZhbHVlIG9mIGBidWZmZXItY2hhcnMtbW9kaWZpZWQtdGljaycgd2hlbiB0aGUgaGVhZGlu
Zy1pZCBjYWNoZSB3YXMgYnVpbHQuIikKCihkZWZ1biBtYXJrZG93bi10cy0tYnVpbGQtaGVhZGlu
Zy1pZHMgKCkKICAiV2FsayBhbGwgaGVhZGluZ3MgaW4gdGhlIGJ1ZmZlciBhbmQgcmV0dXJuIGEg
aGFzaCB0YWJsZS4KV2hpY2ggbWFwcyBlYWNoIHNsdWcgdG8gdGhlIGJ1ZmZlciBwb3NpdGlvbiBv
ZiBpdHMgaGVhZGluZy4gIEVhY2gKaGVhZGluZyBjb250cmlidXRlcyBpdHMgR2l0SHViIHNsdWcs
IGl0cyBQYW5kb2Mgc2x1ZywgYW5kIGl0cyBleHBsaWNpdApgeyNpZH0nIGlmIHByZXNlbnQuICBC
b3RoIHNsdWcgYWxnb3JpdGhtcyBhcmUgc3RvcmVkIGluIHRoZSBzYW1lIGJ1ZmZlcgpiZWNhdXNl
IGEgbWFya2Rvd24gZmlsZSBpcyBvZnRlbiBwcmV2aWV3ZWQgYnkgc2V2ZXJhbCByZW5kZXJlcnMg
KEdpdEh1Ygp3ZWIgVUksIFBhbmRvYywgbWRCb29rLCBIdWdvLCBhbmQgc28gb24pIGFuZCB0aGUg
c2FtZSBzb3VyY2Ugc2hvdWxkCnJlc29sdmUgcmVnYXJkbGVzcyBvZiB3aGljaCBvbmUgdGhlIGF1
dGhvciB3cm90ZSB0aGUgbGluayBmb3IuICBGb3IgbW9zdApoZWFkaW5ncyB0aGUgdHdvIGFsZ29y
aXRobXMgcHJvZHVjZSB0aGUgc2FtZSBzbHVnIGFueXdheS4KRHVwbGljYXRlIHNsdWdzICh3aXRo
aW4gb25lIGFsZ29yaXRobSkgYXJlIGRpc2FtYmlndWF0ZWQgYnkgYXBwZW5kaW5nCmAtMScsIGAt
MicsIGFuZCBzbyBvbiwgaW4gZG9jdW1lbnQgb3JkZXIsIG1hdGNoaW5nIEdpdEh1YidzIGJlaGF2
aW9yLgpXaGVuIHR3byBkaXN0aW5jdCBoZWFkaW5ncyB3b3VsZCBvdGhlcndpc2Ugc2hhcmUgYSBz
bHVnLCB0aGUgZmlyc3QKb2NjdXJyZW5jZSBpbiBkb2N1bWVudCBvcmRlciB3aW5zLiIKICAobGV0
ICgodGFibGUgKG1ha2UtaGFzaC10YWJsZSA6dGVzdCAjJ2VxdWFsKSkKICAgICAgICA7OyBQZXIt
YWxnb3JpdGhtIGRlZHVwZSBjb3VudGVyczogaG93IG1hbnkgdGltZXMgdGhpcyBiYXNlIHNsdWcK
ICAgICAgICA7OyBoYXMgYmVlbiBzZWVuIHNvIGZhciBpbiBkb2N1bWVudCBvcmRlci4KICAgICAg
ICAoZ2gtY291bnRzIChtYWtlLWhhc2gtdGFibGUgOnRlc3QgIydlcXVhbCkpCiAgICAgICAgKHBk
LWNvdW50cyAobWFrZS1oYXNoLXRhYmxlIDp0ZXN0ICMnZXF1YWwpKQogICAgICAgIChyb290ICh0
cmVlc2l0LWJ1ZmZlci1yb290LW5vZGUgJ21hcmtkb3duKSkpCiAgICAoZG9saXN0IChjYXAgKHRy
ZWVzaXQtcXVlcnktY2FwdHVyZQogICAgICAgICAgICAgICAgICByb290CiAgICAgICAgICAgICAg
ICAgICcoKChhdHhfaGVhZGluZykgQGgpCiAgICAgICAgICAgICAgICAgICAgKChzZXRleHRfaGVh
ZGluZykgQGgpKSkpCiAgICAgIChsZXQqICgobm9kZSAoY2RyIGNhcCkpCiAgICAgICAgICAgICAo
cG9zICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAgICAgICAgICAocmF3IChzdHJpbmct
dHJpbSAodHJlZXNpdC1ub2RlLXRleHQgbm9kZSB0KSkpCiAgICAgICAgICAgICA7OyBTdHJpcCB0
aGUgbGVhZGluZyBtYXJrZXIgKCMjIyBvciA9PT09Ly0tLS0pLgogICAgICAgICAgICAgOzsgRm9y
IGF0eCwgZHJvcCBsZWFkaW5nICMncyBhbmQgZm9sbG93aW5nIHNwYWNlLgogICAgICAgICAgICAg
OzsgRm9yIHNldGV4dCwgZHJvcCB0aGUgdHJhaWxpbmcgdW5kZXJsaW5lIGxpbmUuCiAgICAgICAg
ICAgICAodGV4dCAoY29uZAogICAgICAgICAgICAgICAgICAgICgoc3RyaW5nLW1hdGNoICJcXGAj
K1sgXHRdKlxcKC4qP1xcKVsgXHRdKiMqWyBcdF0qXFwnIiByYXcpCiAgICAgICAgICAgICAgICAg
ICAgIChtYXRjaC1zdHJpbmcgMSByYXcpKQogICAgICAgICAgICAgICAgICAgICgoc3RyaW5nLW1h
dGNoICJcXGBcXCguKj9cXClcbls9LV0rWyBcdF0qXFwnIiByYXcpCiAgICAgICAgICAgICAgICAg
ICAgIChtYXRjaC1zdHJpbmcgMSByYXcpKQogICAgICAgICAgICAgICAgICAgICh0IHJhdykpKQog
ICAgICAgICAgICAgKHNwbGl0IChtYXJrZG93bi10cy0taGVhZGluZy10ZXh0LWFuZC1pZCB0ZXh0
KSkKICAgICAgICAgICAgICh2aXNpYmxlIChjYXIgc3BsaXQpKQogICAgICAgICAgICAgKGV4cGxp
Y2l0IChjZHIgc3BsaXQpKSkKICAgICAgICA7OyBFeHBsaWNpdCB7I2lkfSB3aW5zIG91dHJpZ2h0
OyBmaXJzdCBvY2N1cnJlbmNlIGtlZXBzIGl0LgogICAgICAgICh3aGVuIChhbmQgZXhwbGljaXQg
KG5vdCAoZ2V0aGFzaCBleHBsaWNpdCB0YWJsZSkpKQogICAgICAgICAgKHB1dGhhc2ggZXhwbGlj
aXQgcG9zIHRhYmxlKSkKICAgICAgICA7OyBBdXRvIHNsdWdzIChHaXRIdWIgKyBQYW5kb2MpLCBk
ZWR1cGVkIHBlciBhbGdvcml0aG0uCiAgICAgICAgKGxldCogKChnaC1iYXNlIChtYXJrZG93bi10
cy0tc2x1Zy1naXRodWIgdmlzaWJsZSkpCiAgICAgICAgICAgICAgIChwZC1iYXNlIChtYXJrZG93
bi10cy0tc2x1Zy1wYW5kb2MgdmlzaWJsZSkpCiAgICAgICAgICAgICAgIChnaC1uIChnZXRoYXNo
IGdoLWJhc2UgZ2gtY291bnRzIDApKQogICAgICAgICAgICAgICAocGQtbiAoZ2V0aGFzaCBwZC1i
YXNlIHBkLWNvdW50cyAwKSkKICAgICAgICAgICAgICAgKGdoLWlkIChpZiAoemVyb3AgZ2gtbikg
Z2gtYmFzZQogICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICIlcy0lZCIgZ2gtYmFzZSBn
aC1uKSkpCiAgICAgICAgICAgICAgIChwZC1pZCAoaWYgKHplcm9wIHBkLW4pIHBkLWJhc2UKICAg
ICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiJXMtJWQiIHBkLWJhc2UgcGQtbikpKSkKICAg
ICAgICAgIChwdXRoYXNoIGdoLWJhc2UgKDErIGdoLW4pIGdoLWNvdW50cykKICAgICAgICAgIChw
dXRoYXNoIHBkLWJhc2UgKDErIHBkLW4pIHBkLWNvdW50cykKICAgICAgICAgIDs7IEZpcnN0LXdy
aXRlci13aW5zIHNvIGRvY3VtZW50IG9yZGVyIHRpZWJyZWFrcyBjb2xsaXNpb25zLgogICAgICAg
ICAgKHVubGVzcyAoZ2V0aGFzaCBnaC1pZCB0YWJsZSkgKHB1dGhhc2ggZ2gtaWQgcG9zIHRhYmxl
KSkKICAgICAgICAgICh1bmxlc3MgKGdldGhhc2ggcGQtaWQgdGFibGUpIChwdXRoYXNoIHBkLWlk
IHBvcyB0YWJsZSkpKSkpCiAgICB0YWJsZSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWhlYWRpbmct
aWRzICgpCiAgIlJldHVybiB0aGUgaGVhZGluZy1pZCBoYXNoIHRhYmxlIGZvciB0aGUgY3VycmVu
dCBidWZmZXIuCkNhY2hlIGlzIHJlYnVpbHQgb25seSB3aGVuIGBidWZmZXItY2hhcnMtbW9kaWZp
ZWQtdGljaycgaGFzIGFkdmFuY2VkCnNpbmNlIHRoZSBsYXN0IGNhbGwgKG1pcnJvcnMgYG1hcmtk
b3duLXRzLS1saW5rLXJlZi1jYWNoZScpLiIKICAobGV0ICgodGljayAoYnVmZmVyLWNoYXJzLW1v
ZGlmaWVkLXRpY2spKSkKICAgICh1bmxlc3MgKGVxIHRpY2sgbWFya2Rvd24tdHMtLWhlYWRpbmct
aWQtY2FjaGUtdGljaykKICAgICAgKHNldHEgbWFya2Rvd24tdHMtLWhlYWRpbmctaWQtY2FjaGUg
KG1hcmtkb3duLXRzLS1idWlsZC1oZWFkaW5nLWlkcykKICAgICAgICAgICAgbWFya2Rvd24tdHMt
LWhlYWRpbmctaWQtY2FjaGUtdGljayB0aWNrKSkKICAgIG1hcmtkb3duLXRzLS1oZWFkaW5nLWlk
LWNhY2hlKSkKCihkZWZ1biBtYXJrZG93bi10cy0tZm9sbG93LWZyYWdtZW50IChpZCkKICAiSnVt
cCB0byB0aGUgaGVhZGluZyB3aG9zZSBzbHVnIG1hdGNoZXMgSUQgKHdpdGhvdXQgbGVhZGluZyBg
IycpLgpQdXNoZXMgdGhlIG1hcmsgYmVmb3JlIG1vdmluZyBzbyBgQy11IEMtU1BDJyByZXR1cm5z
LiAgU2lnbmFscwpgdXNlci1lcnJvcicgaWYgbm8gaGVhZGluZyBtYXRjaGVzLiIKICAoaWYtbGV0
KiAoKHBvcyAoZ2V0aGFzaCBpZCAobWFya2Rvd24tdHMtLWhlYWRpbmctaWRzKSkpKQogICAgICAo
cHJvZ24KICAgICAgICAocHVzaC1tYXJrKQogICAgICAgIChnb3RvLWNoYXIgcG9zKQogICAgICAg
IChyZWNlbnRlcikpCiAgICAodXNlci1lcnJvciAiTm8gaGVhZGluZyBmb3IgZnJhZ21lbnQ6ICMl
cyIgaWQpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS1hdHgtaGVhZGluZyAobm9kZSBf
b3ZlcnJpZGUgX3N0YXJ0IF9lbmQgJnJlc3QgXykKICAiQXBwbHkgdGhlIGhlYWRpbmcgZmFjZSBh
Y3Jvc3MgYW4gYXR4X2hlYWRpbmcgTk9ERS4KTGF5ZXIgdGhlIGZhY2Ugb24gdG9wIG9mIGNoaWxk
IHN1Yi1ub2RlcyAoZS5nLiBhbiBpbmxpbmUgbGluaykgc28KdGhlaXIgb3duIGZhY2VzIGFyZSBw
cmVzZXJ2ZWQuICBTdHJpcCBhbnkgcHJpb3IgY29weSBvZiB0aGUgZmFjZQpmaXJzdCBzbyBpdCBk
b2VzIG5vdCBhY2N1bXVsYXRlIHdoZW4gdGhlIGhlYWRpbmcgaXMgcmVmb250aWZpZWQgb3IKaXRz
IGxldmVsL3R5cGUgY2hhbmdlcyBkdXJpbmcgZWRpdGluZy4KRG8gbm90IGZvbnRpZnkgdGhlIGhl
YWRlcidzIHRyYWlsaW5nIG5ld2xpbmUuCkVsaWRlIHRyYWlsaW5nIHdoaXRlc3BhY2Ugd2hlbiBo
aWRpbmcgbWFya3VwLgpGb250aWZ5IGFueSBvcHRpb25hbCB0cmFpbGluZyBjbG9zaW5nLWAjJyBz
ZXF1ZW5jZSBhcyBhIGRlbGltaXRlci4gIFRoZQp0cmVlLXNpdHRlciBncmFtbWFyIGRvZXMgbm90
IHByb2R1Y2UgYSBzZXBhcmF0ZSBub2RlIGZvciB0aGVzZTsgcGVyCkNvbW1vbk1hcmsgdGhleSBh
cmUgZGVjb3JhdGl2ZSBhbmQgbXVzdCBiZSBwcmVjZWRlZCBieSBhIHNwYWNlIG9yIHRhYi4iCiAg
KGxldCogKChuLXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAgICAgIChuLWVu
ZCAgICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAgICAoZmFjZSAobGV0ICgobWFya2Vy
ICh0cmVlc2l0LW5vZGUtY2hpbGQgbm9kZSAwKSkpCiAgICAgICAgICAgICAgICAgKGludGVybiAo
Zm9ybWF0ICJtYXJrZG93bi10cy1oZWFkaW5nLSVkIgogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAobGVuZ3RoICh0cmVlc2l0LW5vZGUtdGV4dCBtYXJrZXIgdCkpKSkpKSkKICAgIChm
b250LWxvY2stLXJlbW92ZS1mYWNlLWZyb20tdGV4dC1wcm9wZXJ0eSBuLXN0YXJ0IG4tZW5kICdm
YWNlIGZhY2UpCiAgICAoZm9udC1sb2NrLWFwcGVuZC10ZXh0LXByb3BlcnR5IG4tc3RhcnQgKDEt
IG4tZW5kKSAnZmFjZSBmYWNlKQogICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgIChnb3RvLWNoYXIg
bi1lbmQpCiAgICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICJbOnNwYWNlOl0iIG4tc3RhcnQpCiAg
ICAgIChsZXQgKCh0cmFpbGluZy1lbmQgKHBvaW50KSkpCiAgICAgICAgKHNraXAtY2hhcnMtYmFj
a3dhcmQgIiMiIG4tc3RhcnQpCiAgICAgICAgKGxldCAoKHRyYWlsaW5nLXN0YXJ0IChwb2ludCkp
KQogICAgICAgICAgKGNvbmQgKChhbmQgKDwgdHJhaWxpbmctc3RhcnQgdHJhaWxpbmctZW5kKQog
ICAgICAgICAgICAgICAgICAgICAgKD4gdHJhaWxpbmctc3RhcnQgbi1zdGFydCkKICAgICAgICAg
ICAgICAgICAgICAgIChtZW1xIChjaGFyLWJlZm9yZSB0cmFpbGluZy1zdGFydCkgJyg/XHMgP1x0
KSkpCiAgICAgICAgICAgICAgICAgOzsgVGhlc2Ugc2hlbmFuaWdhbnMgYXJlIHRvIGlkZW50aWZ5
IG9wdGlvbmFsCiAgICAgICAgICAgICAgICAgOzsgdHJhaWxpbmcgc2VxdWVudGlhbCBvY3RvdGhv
cnBlcywgZm9udGlmeSB0aGVtIGFzCiAgICAgICAgICAgICAgICAgOzsgdGhlIGRlbGltaXRlcnMg
dGhleSBhcmUsIGFuZCByZW1vdmUgd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgIDs7IGJldHdl
ZW4gaGVhZGluZyB0ZXh0IGFuZCB0aGUgb2N0b3Rob3JwZXMuICBUaGUKICAgICAgICAgICAgICAg
ICA7OyBncmFtbWFyIGlzIHNpbGVudCBvbiB0aGVzZSBkZXNwaXRlIENvbW1vbk1hcmsuCiAgICAg
ICAgICAgICAgICAgKGZvbnQtbG9jay0tcmVtb3ZlLWZhY2UtZnJvbS10ZXh0LXByb3BlcnR5CiAg
ICAgICAgICAgICAgICAgIHRyYWlsaW5nLXN0YXJ0IHRyYWlsaW5nLWVuZAogICAgICAgICAgICAg
ICAgICAnZmFjZSAnbWFya2Rvd24tdHMtZGVsaW1pdGVyKQogICAgICAgICAgICAgICAgIChmb250
LWxvY2stcHJlcGVuZC10ZXh0LXByb3BlcnR5CiAgICAgICAgICAgICAgICAgIHRyYWlsaW5nLXN0
YXJ0IHRyYWlsaW5nLWVuZAogICAgICAgICAgICAgICAgICAnZmFjZSAnbWFya2Rvd24tdHMtZGVs
aW1pdGVyKQogICAgICAgICAgICAgICAgICh3aGVuIG1hcmtkb3duLXRzLWhpZGUtbWFya3VwCiAg
ICAgICAgICAgICAgICAgICAobGV0ICgoaGlkZS1zdGFydCAoc2F2ZS1leGN1cnNpb24KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciB0cmFpbGluZy1zdGFy
dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNraXAtY2hhcnMtYmFj
a3dhcmQgIls6c3BhY2U6XSIgbi1zdGFydCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKHBvaW50KSkpKQogICAgICAgICAgICAgICAgICAgICAocHV0LXRleHQtcHJvcGVy
dHkgaGlkZS1zdGFydCAocG9zLWVvbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICdpbnZpc2libGUgJ21hcmtkb3duLXRzLS1tYXJrdXApKSkpCiAgICAgICAgICAgICAg
ICAobWFya2Rvd24tdHMtaGlkZS1tYXJrdXAKICAgICAgICAgICAgICAgICA7OyBIaWRlIHRyYWls
aW5nIHdoaXRlc3BhY2UgaW4gdGhlIG5vbWluYWwgY2FzZS4KICAgICAgICAgICAgICAgICAocHV0
LXRleHQtcHJvcGVydHkgdHJhaWxpbmctZW5kIChwb3MtZW9sKQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAnaW52aXNpYmxlICdtYXJrZG93bi10cy0tbWFya3VwKSkpKSkpKSkK
CihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS1zZXRleHQtaGVhZGluZyAobm9kZSBfb3ZlcnJp
ZGUgX3N0YXJ0IF9lbmQgJnJlc3QgXykKICAiQXBwbHkgdGhlIGhlYWRpbmcgZmFjZSBhY3Jvc3Mg
YSBzZXRleHQgTk9ERS4KTGF5ZXIgdGhlIGZhY2Ugb24gdG9wIG9mIGNoaWxkIHN1Yi1ub2RlcyAo
ZS5nLiBhbiBpbmxpbmUgbGluaykgc28KdGhlaXIgb3duIGZhY2VzIGFyZSBwcmVzZXJ2ZWQuICBT
dHJpcCBhbnkgcHJpb3IgY29weSBvZiB0aGUgZmFjZQpmaXJzdCBzbyBpdCBkb2VzIG5vdCBhY2N1
bXVsYXRlIHdoZW4gdGhlIGhlYWRpbmcgaXMgcmVmb250aWZpZWQgb3IKaXRzIGxldmVsL3R5cGUg
Y2hhbmdlcyBkdXJpbmcgZWRpdGluZy4KQXBwbHkgdGhlIGZhY2UgdG8gdGhlIHNldGV4dCBoZWFk
aW5nX2NvbnRlbnQgc2VwYXJhdGVseSBmcm9tIHRoZQp1bmRlcmxpbmUgcmF0aGVyIHRoYW4gdHJl
YXQgdGhlbSBhcyBhIHNpbmdsZSByYW5nZS4gIFRoaXMgYXZvaWRzIHB1dHRpbmcKdGhlIGZhY2Ug
b24gdGhlIGhlYWRpbmdfY29udGVudCBuZXdsaW5lLiAgSWYgYG1hcmtkb3duLXRzLWhpZGUtbWFy
a3VwJwppcyBub24tbmlsLCBoaWRlIHRoZSB1bmRlcmxpbmUgbGluZSBlbnRpcmVseSBieSBzZXR0
aW5nIGl0cyBsaW5lLWhlaWdodAp0ZXh0IHByb3BlcnR5IHRvIDAuCkVsaWRlIHRyYWlsaW5nIHdo
aXRlc3BhY2Ugd2hlbiBoaWRpbmcgbWFya3VwLiIKICAobGV0KiAoKG4tc3RhcnQgKHRyZWVzaXQt
bm9kZS1zdGFydCBub2RlKSkKICAgICAgICAgKG4tZW5kICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUp
KQogICAgICAgICAoY29udGVudCAodHJlZXNpdC1ub2RlLWNoaWxkIG5vZGUgMCAnbmFtZWQpKQog
ICAgICAgICAoY29udGVudC1zdGFydCAodHJlZXNpdC1ub2RlLXN0YXJ0IGNvbnRlbnQpKQogICAg
ICAgICAoY29udGVudC1lbmQgKHRyZWVzaXQtbm9kZS1lbmQgY29udGVudCkpCiAgICAgICAgICh1
bmRlcmxpbmUgKHRyZWVzaXQtbm9kZS1jaGlsZCBub2RlIDEgJ25hbWVkKSkKICAgICAgICAgKHVu
ZGVybGluZS1zdGFydCAodHJlZXNpdC1ub2RlLXN0YXJ0IHVuZGVybGluZSkpCiAgICAgICAgICh1
bmRlcmxpbmUtZW5kICh0cmVlc2l0LW5vZGUtZW5kIHVuZGVybGluZSkpCiAgICAgICAgIChmYWNl
ICdtYXJrZG93bi10cy1zZXRleHQtaGVhZGluZykpCiAgICAoZm9udC1sb2NrLS1yZW1vdmUtZmFj
ZS1mcm9tLXRleHQtcHJvcGVydHkgbi1zdGFydCBuLWVuZCAnZmFjZSBmYWNlKQogICAgOzsgMS0g
Y29udGVudC1lbmQgYXZvaWRzIHRoZSBuZXdsaW5lIHNvIGl0IGhpZGVzIGNvcnJlY3RseS4KICAg
IChmb250LWxvY2stYXBwZW5kLXRleHQtcHJvcGVydHkgY29udGVudC1zdGFydCAoMS0gY29udGVu
dC1lbmQpICdmYWNlIGZhY2UpCiAgICAoZm9udC1sb2NrLWFwcGVuZC10ZXh0LXByb3BlcnR5IHVu
ZGVybGluZS1zdGFydCB1bmRlcmxpbmUtZW5kICdmYWNlIGZhY2UpCiAgICAod2hlbiBtYXJrZG93
bi10cy1oaWRlLW1hcmt1cAogICAgICA7OyBIaWRlIGhlYWRpbmdfY29udGVudCB0cmFpbGluZyBz
cGFjZXMuCiAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSAoc2F2ZS1leGN1cnNpb24KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciBjb250ZW50LWVuZCkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIls6c3BhY2U6XSIgY29udGVudC1zdGFy
dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50KSkKICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnRlbnQtZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAnaW52aXNpYmxlICdt
YXJrZG93bi10cy0tbWFya3VwKQogICAgICAocHV0LXRleHQtcHJvcGVydHkgdW5kZXJsaW5lLXN0
YXJ0IHVuZGVybGluZS1lbmQgJ2xpbmUtaGVpZ2h0IDApKSkpCgooZGVmdW4gbWFya2Rvd24tdHMt
LWZvbnRpZnktbGluay1ub2RlIChub2RlIG92ZXJyaWRlIHN0YXJ0IGVuZCAmcmVzdCBfKQogICJG
b250aWZ5IGxpbmsgb3IgaW1hZ2UgdGV4dCBOT0RFIGFzIGEgY2xpY2thYmxlIGJ1dHRvbi4KV29y
a3MgZm9yIGlubGluZSBsaW5rcywgcmVmZXJlbmNlIGxpbmtzLCBzaG9ydGN1dCBsaW5rcywgYW5k
CmltYWdlIGRlc2NyaXB0aW9ucy4gIFRoZSBVUkwgaXMgdGFrZW4gZnJvbSBhIHNpYmxpbmcKYGxp
bmtfZGVzdGluYXRpb24nIG5vZGUgd2hlbiBwcmVzZW50LCBvciByZXNvbHZlZCBmcm9tIGEKbGlu
ayByZWZlcmVuY2UgZGVmaW5pdGlvbiwgb3IgdGhlIG5vZGUgdGV4dCBpdHNlbGYgaXMgdXNlZCBh
cwpmYWxsYmFjay4gIE9WRVJSSURFLCBTVEFSVCwgYW5kIEVORCBhcmUgcGFzc2VkIHRocm91Z2gg
dG8KYHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlJy4iCiAgKGxldCAoKHBhcmVudCAodHJl
ZXNpdC1ub2RlLXBhcmVudCBub2RlKSkpCiAgICA7OyBXaGVuIE5PREUgaXMgYSBsaW5rX2xhYmVs
IGluc2lkZSBhIGZ1bGxfcmVmZXJlbmNlX2xpbmsgdGhhdAogICAgOzsgYWxzbyBoYXMgYSBsaW5r
X3RleHQsIHNraXAgaXQsIGxpbmtfdGV4dCBoYW5kbGVzIHRoYXQgbGluay4KICAgICh1bmxlc3Mg
KGFuZCAoc3RyaW5nPSAodHJlZXNpdC1ub2RlLXR5cGUgbm9kZSkgImxpbmtfbGFiZWwiKQogICAg
ICAgICAgICAgICAgICh0cmVlc2l0LXNlYXJjaC1zdWJ0cmVlIHBhcmVudCAiXFxgbGlua190ZXh0
XFwnIikpCiAgICAgICh0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVycmlkZQogICAgICAgKHRyZWVz
aXQtbm9kZS1zdGFydCBub2RlKSAodHJlZXNpdC1ub2RlLWVuZCBub2RlKQogICAgICAgJ21hcmtk
b3duLXRzLWxpbmsgb3ZlcnJpZGUgc3RhcnQgZW5kKQogICAgICAobGV0KiAoKGRlc3QgKHRyZWVz
aXQtc2VhcmNoLXN1YnRyZWUgcGFyZW50ICJcXGBsaW5rX2Rlc3RpbmF0aW9uXFwnIikpCiAgICAg
ICAgICAgICAodXJsIChpZiBkZXN0CiAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2Rl
LXRleHQgZGVzdCB0KQogICAgICAgICAgICAgICAgICAgIDs7IFJlZmVyZW5jZSBsaW5rczogcmVz
b2x2ZSB2aWEgbGlua19sYWJlbCBvciBsaW5rX3RleHQuCiAgICAgICAgICAgICAgICAgICAgKGxl
dCogKChsYWJlbC1ub2RlICh0cmVlc2l0LXNlYXJjaC1zdWJ0cmVlCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgIlxcYGxpbmtfbGFiZWxcXCciKSkKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGxhYmVsIChpZiBsYWJlbC1ub2RlCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy10cmltICh0cmVlc2l0LW5vZGUtdGV4dAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwt
bm9kZSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiXFxbIiAiXFxdIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVz
aXQtbm9kZS10ZXh0IG5vZGUgdCkpKSkKICAgICAgICAgICAgICAgICAgICAgIChvciAobWFya2Rv
d24tdHMtLXJlc29sdmUtbGluay1yZWYgbGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
bGFiZWwpKSkpKQogICAgICAgIChtYXJrZG93bi10cy0tbWFrZS1saW5rLWJ1dHRvbgogICAgICAg
ICAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpIHVybCkp
KSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktYXV0b2xpbmsgKG5vZGUgb3ZlcnJpZGUg
c3RhcnQgZW5kICZyZXN0IF8pCiAgIkZvbnRpZnkgYXV0b2xpbmsgTk9ERSAoVVJJIG9yIGVtYWls
KSBhcyBhIGNsaWNrYWJsZSBidXR0b24uCkZvciBlbWFpbCBhdXRvbGlua3MsIHRoZSBVUkwgaXMg
cHJlZml4ZWQgd2l0aCBcIm1haWx0bzpcIi4KQW5nbGUgYnJhY2tldCBkZWxpbWl0ZXJzIGFyZSBo
aWRkZW4gd2hlbiBtYXJrdXAgaXMgaGlkZGVuLgpPVkVSUklERSwgU1RBUlQsIGFuZCBFTkQgYXJl
IHBhc3NlZCB0aHJvdWdoIHRvCmB0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVycmlkZScuIgogIChs
ZXQqICgobm9kZS1zdGFydCAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQogICAgICAgICAobm9k
ZS1lbmQgKHRyZWVzaXQtbm9kZS1lbmQgbm9kZSkpCiAgICAgICAgIChpbm5lciAoYnVmZmVyLXN1
YnN0cmluZy1uby1wcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgKDErIG5vZGUtc3RhcnQpICgx
LSBub2RlLWVuZCkpKQogICAgICAgICAodXJsIChpZiAoc3RyaW5nPSAodHJlZXNpdC1ub2RlLXR5
cGUgbm9kZSkgImVtYWlsX2F1dG9saW5rIikKICAgICAgICAgICAgICAgICAgKGNvbmNhdCAibWFp
bHRvOiIgaW5uZXIpCiAgICAgICAgICAgICAgICBpbm5lcikpKQogICAgKHRyZWVzaXQtZm9udGlm
eS13aXRoLW92ZXJyaWRlCiAgICAgbm9kZS1zdGFydCBub2RlLWVuZCAnbWFya2Rvd24tdHMtbGlu
ayBvdmVycmlkZSBzdGFydCBlbmQpCiAgICAobWFya2Rvd24tdHMtLW1ha2UtbGluay1idXR0b24g
bm9kZS1zdGFydCBub2RlLWVuZCB1cmwpCiAgICAod2hlbiBtYXJrZG93bi10cy1oaWRlLW1hcmt1
cAogICAgICAocHV0LXRleHQtcHJvcGVydHkgbm9kZS1zdGFydCAoMSsgbm9kZS1zdGFydCkKICAg
ICAgICAgICAgICAgICAgICAgICAgICdpbnZpc2libGUgJ21hcmtkb3duLXRzLS1tYXJrdXApCiAg
ICAgIChwdXQtdGV4dC1wcm9wZXJ0eSAoMS0gbm9kZS1lbmQpIG5vZGUtZW5kCiAgICAgICAgICAg
ICAgICAgICAgICAgICAnaW52aXNpYmxlICdtYXJrZG93bi10cy0tbWFya3VwKSkpKQoKKGRlZnVu
IG1hcmtkb3duLXRzLS1mb250aWZ5LWxpbmstcmVmLWxhYmVsIChub2RlIG92ZXJyaWRlIHN0YXJ0
IGVuZCAmcmVzdCBfKQogICJGb250aWZ5IGxpbmsgcmVmZXJlbmNlIGRlZmluaXRpb24gbGFiZWwg
Tk9ERSBhcyBhIGNsaWNrYWJsZSBidXR0b24uClRoZSBicmFja2V0cyBhbmQgY29sb24gYXJlIGhp
ZGRlbiB3aGVuIG1hcmt1cCBpcyBoaWRkZW4uCk9WRVJSSURFLCBTVEFSVCwgYW5kIEVORCBhcmUg
cGFzc2VkIHRocm91Z2ggdG8KYHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlJy4iCiAgKGxl
dCogKChub2RlLXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAgICAgIChub2Rl
LWVuZCAodHJlZXNpdC1ub2RlLWVuZCBub2RlKSkKICAgICAgICAgKHBhcmVudCAodHJlZXNpdC1u
b2RlLXBhcmVudCBub2RlKSkKICAgICAgICAgKGRlc3Qtbm9kZSAodHJlZXNpdC1zZWFyY2gtc3Vi
dHJlZSBwYXJlbnQgIlxcYGxpbmtfZGVzdGluYXRpb25cXCciKSkKICAgICAgICAgKHVybCAod2hl
biBkZXN0LW5vZGUgKHRyZWVzaXQtbm9kZS10ZXh0IGRlc3Qtbm9kZSB0KSkpKQogICAgOzsgRm9u
dGlmeSB0aGUgbGFiZWwgdGV4dCAoaW5zaWRlIGJyYWNrZXRzKS4KICAgICh0cmVlc2l0LWZvbnRp
Znktd2l0aC1vdmVycmlkZQogICAgICgxKyBub2RlLXN0YXJ0KSAoMS0gbm9kZS1lbmQpCiAgICAg
J21hcmtkb3duLXRzLWxpbmsgb3ZlcnJpZGUgc3RhcnQgZW5kKQogICAgOzsgTWFrZSBpdCBhIGNs
aWNrYWJsZSBidXR0b24uCiAgICAod2hlbiB1cmwKICAgICAgKG1hcmtkb3duLXRzLS1tYWtlLWxp
bmstYnV0dG9uICgxKyBub2RlLXN0YXJ0KSAoMS0gbm9kZS1lbmQpIHVybCkpCiAgICA7OyBIaWRl
ICJbIiBiZWZvcmUgbGFiZWwgYW5kICJdOiAiIGJldHdlZW4gbGFiZWwgYW5kIGRlc3RpbmF0aW9u
LgogICAgKHdoZW4gbWFya2Rvd24tdHMtaGlkZS1tYXJrdXAKICAgICAgKHB1dC10ZXh0LXByb3Bl
cnR5IG5vZGUtc3RhcnQgKDErIG5vZGUtc3RhcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAn
aW52aXNpYmxlICdtYXJrZG93bi10cy0tbWFya3VwKQogICAgICAobGV0ICgoY29sb24tZW5kIChp
ZiBkZXN0LW5vZGUgKHRyZWVzaXQtbm9kZS1zdGFydCBkZXN0LW5vZGUpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAoMSsgbm9kZS1lbmQpKSkpCiAgICAgICAgKHB1dC10ZXh0LXByb3BlcnR5ICgx
LSBub2RlLWVuZCkgY29sb24tZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnZpc2li
bGUgJ21hcmtkb3duLXRzLS1tYXJrdXApKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1mb250aWZ5
LWxpbmstcmVmLWRlc3RpbmF0aW9uIChub2RlIG92ZXJyaWRlIHN0YXJ0IGVuZAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3QgXykKICAi
Rm9udGlmeSBsaW5rIHJlZmVyZW5jZSBkZXN0aW5hdGlvbiBOT0RFIGFuZCBoaWRlIHdoZW4gbWFy
a3VwIGhpZGRlbi4KT1ZFUlJJREUsIFNUQVJULCBhbmQgRU5EIGFyZSBwYXNzZWQgdGhyb3VnaCB0
bwpgdHJlZXNpdC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUnLiIKICAodHJlZXNpdC1mb250aWZ5LXdp
dGgtb3ZlcnJpZGUKICAgKHRyZWVzaXQtbm9kZS1zdGFydCBub2RlKSAodHJlZXNpdC1ub2RlLWVu
ZCBub2RlKQogICAnbWFya2Rvd24tdHMtbGluay1kZXN0aW5hdGlvbiBvdmVycmlkZSBzdGFydCBl
bmQpCiAgKHdoZW4gbWFya2Rvd24tdHMtaGlkZS1tYXJrdXAKICAgIChwdXQtdGV4dC1wcm9wZXJ0
eSAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpCiAgICAg
ICAgICAgICAgICAgICAgICAgJ2ludmlzaWJsZSAnbWFya2Rvd24tdHMtLW1hcmt1cCkpKQoKKGRl
ZnVuIG1hcmtkb3duLXRzLS1sYXRleC1ibG9jay12YWxpZC1wIChub2RlKQogICJSZXR1cm4gbm9u
LW5pbCBpZiBsYXRleCBibG9jayBOT0RFIGlzIHdpdGhpbiBhIHNpbmdsZSBpbmxpbmUgc2NvcGUu
ClRoZSBnbG9iYWwgaW5saW5lIHBhcnNlciBjYW4gY3JlYXRlIGZhbHNlIGBsYXRleF9ibG9jaycg
bWF0Y2hlcwpzcGFubmluZyBhY3Jvc3MgcGFyYWdyYXBoIGJvdW5kYXJpZXMuICBDaGVjayB0aGF0
IHRoZSBvcGVuaW5nIGFuZApjbG9zaW5nIGRlbGltaXRlcnMgc2hhcmUgdGhlIHNhbWUgbWFya2Rv
d24gYGlubGluZScgYW5jZXN0b3IuIgogIChsZXQgKChub2RlLXN0YXJ0ICh0cmVlc2l0LW5vZGUt
c3RhcnQgbm9kZSkpCiAgICAgICAgKG5vZGUtZW5kICgxLSAodHJlZXNpdC1ub2RlLWVuZCBub2Rl
KSkpKQogICAgKHdoZW4tbGV0KiAoKG1kLXN0YXJ0ICh0cmVlc2l0LW5vZGUtYXQgbm9kZS1zdGFy
dCAnbWFya2Rvd24pKQogICAgICAgICAgICAgICAgKG1kLWVuZCAodHJlZXNpdC1ub2RlLWF0IG5v
ZGUtZW5kICdtYXJrZG93bikpCiAgICAgICAgICAgICAgICAoaW5saW5lLXN0YXJ0ICh0cmVlc2l0
LXBhcmVudC11bnRpbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWQtc3RhcnQKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKG4pCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUgbikgImlubGluZSIpKSkp
CiAgICAgICAgICAgICAgICAoaW5saW5lLWVuZCAodHJlZXNpdC1wYXJlbnQtdW50aWwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtZC1lbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAobGFtYmRhIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxdWFsICh0cmVl
c2l0LW5vZGUtdHlwZSBuKSAiaW5saW5lIikpKSkpCiAgICAgIChlcSAodHJlZXNpdC1ub2RlLXN0
YXJ0IGlubGluZS1zdGFydCkKICAgICAgICAgICh0cmVlc2l0LW5vZGUtc3RhcnQgaW5saW5lLWVu
ZCkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktbGF0ZXgtYmxvY2sgKG5vZGUgb3Zl
cnJpZGUgc3RhcnQgZW5kICZyZXN0IF8pCiAgIkZvbnRpZnkgbGF0ZXggYmxvY2sgTk9ERSBhbmQg
aGlkZSBpdHMgZGVsaW1pdGVycyB3aGVuIG1hcmt1cCBpcyBoaWRkZW4uClNraXAgZm9udGlmaWNh
dGlvbiBmb3IgZmFsc2UgbWF0Y2hlcyB0aGF0IHNwYW4gYWNyb3NzIHBhcmFncmFwaCBib3VuZGFy
aWVzLgpPVkVSUklERSwgU1RBUlQsIGFuZCBFTkQgYXJlIHBhc3NlZCB0aHJvdWdoIHRvCmB0cmVl
c2l0LWZvbnRpZnktd2l0aC1vdmVycmlkZScuIgogICh3aGVuIChtYXJrZG93bi10cy0tbGF0ZXgt
YmxvY2stdmFsaWQtcCBub2RlKQogICAgKHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlCiAg
ICAgKHRyZWVzaXQtbm9kZS1zdGFydCBub2RlKSAodHJlZXNpdC1ub2RlLWVuZCBub2RlKQogICAg
ICdtYXJrZG93bi10cy1sYXRleCBvdmVycmlkZSBzdGFydCBlbmQpCiAgICAod2hlbiBtYXJrZG93
bi10cy1oaWRlLW1hcmt1cAogICAgICAoZG90aW1lcyAoaSAodHJlZXNpdC1ub2RlLWNoaWxkLWNv
dW50IG5vZGUpKQogICAgICAgIChsZXQgKChjaGlsZCAodHJlZXNpdC1ub2RlLWNoaWxkIG5vZGUg
aSkpKQogICAgICAgICAgKHdoZW4gKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBjaGlsZCkgImxh
dGV4X3NwYW5fZGVsaW1pdGVyIikKICAgICAgICAgICAgKHB1dC10ZXh0LXByb3BlcnR5ICh0cmVl
c2l0LW5vZGUtc3RhcnQgY2hpbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJl
ZXNpdC1ub2RlLWVuZCBjaGlsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnZp
c2libGUgJ21hcmtkb3duLXRzLS1tYXJrdXApKSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZv
bnRpZnktYmFja3NsYXNoLWVzY2FwZSAobm9kZSBvdmVycmlkZSBzdGFydCBlbmQgJnJlc3QgXykK
ICAiRm9udGlmeSBiYWNrc2xhc2ggZXNjYXBlIE5PREUsIGhpZGluZyB0aGUgYmFja3NsYXNoIHdo
ZW4gbWFya3VwIGlzIGhpZGRlbi4KU2tpcCBoaWRpbmcgaW5zaWRlIGBsYXRleF9ibG9jaycgd2hl
cmUgYmFja3NsYXNoZXMgYXJlIExhVGVYIHN5bnRheC4KT1ZFUlJJREUsIFNUQVJULCBhbmQgRU5E
IGFyZSBwYXNzZWQgdGhyb3VnaCB0bwpgdHJlZXNpdC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUnLiIK
ICAobGV0ICgobm9kZS1zdGFydCAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQogICAgICAgIChp
bi1sYXRleCAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlICh0cmVlc2l0LW5vZGUtcGFyZW50IG5v
ZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgImxhdGV4X2Jsb2NrIikpKQogICAgKHRyZWVz
aXQtZm9udGlmeS13aXRoLW92ZXJyaWRlCiAgICAgbm9kZS1zdGFydCAoMSsgbm9kZS1zdGFydCkK
ICAgICAnbWFya2Rvd24tdHMtZGVsaW1pdGVyIG92ZXJyaWRlIHN0YXJ0IGVuZCkKICAgICh3aGVu
IChhbmQgbWFya2Rvd24tdHMtaGlkZS1tYXJrdXAgKG5vdCBpbi1sYXRleCkpCiAgICAgIChwdXQt
dGV4dC1wcm9wZXJ0eSBub2RlLXN0YXJ0ICgxKyBub2RlLXN0YXJ0KQogICAgICAgICAgICAgICAg
ICAgICAgICAgJ2ludmlzaWJsZSAnbWFya2Rvd24tdHMtLW1hcmt1cCkpKSkKCihkZWZ2YXIgc2dt
bC1jaGFyLW5hbWVzKQooZGVjbGFyZS1mdW5jdGlvbiBvcmctZW50aXR5LWdldCAib3JnL29yZy1l
bnRpdGllcy5lbCIpCgooZGVmdW4gbWFya2Rvd24tdHMtLWRlY29kZS1lbnRpdHkgKHRleHQpCiAg
IkRlY29kZSBIVE1MIGVudGl0eSBURVhUIChlLmcuLCBcIiZhbXA7XCIpIHRvIGl0cyBjaGFyYWN0
ZXIgc3RyaW5nLgpSZXR1cm4gdGhlIGRlY29kZWQgc3RyaW5nLCBvciBuaWwgaWYgdGhlIGVudGl0
eSBpcyB1bmtub3duLiIKICAoY29uZAogICA7OyBOdW1lcmljIGhleCAmI3gxRjRBOTsKICAgKChz
dHJpbmctbWF0Y2ggIlxcYCYjeFxcKFtbOnhkaWdpdDpdXStcXCk7XFwnIiB0ZXh0KQogICAgKGNo
YXItdG8tc3RyaW5nIChzdHJpbmctdG8tbnVtYmVyIChtYXRjaC1zdHJpbmcgMSB0ZXh0KSAxNikp
KQogICA7OyBOdW1lcmljIGRlY2ltYWwgJiMxMjM7CiAgICgoc3RyaW5nLW1hdGNoICJcXGAmI1xc
KFtbOmRpZ2l0Ol1dK1xcKTtcXCciIHRleHQpCiAgICAoY2hhci10by1zdHJpbmcgKHN0cmluZy10
by1udW1iZXIgKG1hdGNoLXN0cmluZyAxIHRleHQpKSkpCiAgIDs7IE5hbWVkICZhbXA7ICZjb3B5
OyB2aWEgb3JnLWVudGl0aWVzLCBmYWxsIGJhY2sgdG8gc2dtbC1jaGFyLW5hbWVzCiAgICgoc3Ry
aW5nLW1hdGNoICJcXGAmXFwoW1s6YWxudW06XV0rXFwpO1xcJyIgdGV4dCkKICAgIChsZXQgKChu
YW1lIChtYXRjaC1zdHJpbmcgMSB0ZXh0KSkpCiAgICAgIChyZXF1aXJlICdvcmctZW50aXRpZXMp
CiAgICAgIChpZi1sZXQqICgoZW50cnkgKG9yZy1lbnRpdHktZ2V0IG5hbWUpKQogICAgICAgICAg
ICAgICAgKHV0ZjggKG50aCA2IGVudHJ5KSkpCiAgICAgICAgICB1dGY4CiAgICAgICAgKHJlcXVp
cmUgJ3NnbWwtbW9kZSkKICAgICAgICAod2hlbi1sZXQqICgoY29kZSAoc2VxLXBvc2l0aW9uIHNn
bWwtY2hhci1uYW1lcyBuYW1lICMnZXF1YWwpKSkKICAgICAgICAgIChjaGFyLXRvLXN0cmluZyBj
b2RlKSkpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1mb250aWZ5LWVudGl0eSAobm9kZSBvdmVy
cmlkZSBzdGFydCBlbmQgJnJlc3QgXykKICAiRm9udGlmeSBlbnRpdHkgTk9ERSBhbmQgc2hvdyBp
dHMgZGVjb2RlZCB2YWx1ZSB3aGVuIG1hcmt1cCBpcyBoaWRkZW4uCk9WRVJSSURFLCBTVEFSVCwg
YW5kIEVORCBhcmUgcGFzc2VkIHRocm91Z2ggdG8KYHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJy
aWRlJy4iCiAgKGxldCAoKG5vZGUtc3RhcnQgKHRyZWVzaXQtbm9kZS1zdGFydCBub2RlKSkKICAg
ICAgICAobm9kZS1lbmQgKHRyZWVzaXQtbm9kZS1lbmQgbm9kZSkpCiAgICAgICAgKGZhY2UgKGlm
IChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUgbm9kZSkgImVudGl0eV9yZWZlcmVuY2UiKQogICAg
ICAgICAgICAgICAgICAnbWFya2Rvd24tdHMtZW50aXR5LXJlZmVyZW5jZQogICAgICAgICAgICAg
ICAgJ21hcmtkb3duLXRzLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZSkpKQogICAgKHRyZWVz
aXQtZm9udGlmeS13aXRoLW92ZXJyaWRlIG5vZGUtc3RhcnQgbm9kZS1lbmQgZmFjZQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlIHN0YXJ0IGVuZCkKICAgIChpZiBt
YXJrZG93bi10cy1oaWRlLW1hcmt1cAogICAgICAgICh3aGVuLWxldCogKChkZWNvZGVkIChtYXJr
ZG93bi10cy0tZGVjb2RlLWVudGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJl
ZXNpdC1ub2RlLXRleHQgbm9kZSB0KSkpCiAgICAgICAgICAgICAgICAgICAgKChjaGFyLWRpc3Bs
YXlhYmxlLXAgKGFyZWYgZGVjb2RlZCAwKSkpKQogICAgICAgICAgKHB1dC10ZXh0LXByb3BlcnR5
IG5vZGUtc3RhcnQgbm9kZS1lbmQgJ2Rpc3BsYXkgZGVjb2RlZCkpCiAgICAgIChyZW1vdmUtdGV4
dC1wcm9wZXJ0aWVzIG5vZGUtc3RhcnQgbm9kZS1lbmQgJyhkaXNwbGF5IG5pbCkpKSkpCgooZGVm
dW4gbWFya2Rvd24tdHMtLXJlc29sdmUtZGlzcGxheS12YWx1ZSAodmFsKQogICJSZXNvbHZlIFZB
TCwgYSBjb25zIChQUkVGRVJSRUQgLiBGQUxMQkFDSyksIHRvIGEgZGlzcGxheWFibGUgdmFsdWUu
ClBSRUZFUlJFRCBhbmQgRkFMTEJBQ0sgY2FuIGJlIGEgY2hhcmFjdGVyIG9yIGEgc3RyaW5nLiAg
UmV0dXJuIFBSRUZFUlJFRAppZiBpdCwgb3IgaXRzIGZpcnN0IGNoYXJhY3RlciwgaXMgYGNoYXIt
ZGlzcGxheWFibGUtcCcsIG90aGVyd2lzZSByZXR1cm4KRkFMTEJBQ0suCklmIFZBTCBpcyBub3Qg
YSBjb25zIG9yIGlzIG5pbCwgcmV0dXJuIFZBTC4iCiAgKGlmIChjb25zcCB2YWwpCiAgICAgIChs
ZXQqICgocHJlZmVycmVkIChjYXIgdmFsKSkKICAgICAgICAgICAgIChjaCAoaWYgKGNoYXJhY3Rl
cnAgcHJlZmVycmVkKQogICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWQKICAgICAgICAgICAg
ICAgICAgIChhcmVmIHByZWZlcnJlZCAwKSkpKQogICAgICAgIChpZiAoY2hhci1kaXNwbGF5YWJs
ZS1wIGNoKQogICAgICAgICAgICAoY2FyIHZhbCkKICAgICAgICAgIChjZHIgdmFsKSkpCiAgICB2
YWwpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1saXN0LWl0ZW0tZGVwdGggKG5vZGUpCiAgIkNvbXB1
dGUgdGhlIGRlcHRoIG9mIGxpc3QgTk9ERSByZWxhdGl2ZSB0byBpdHMgcGFyZW50cy4KTk9ERSBj
YW4gYmUgYSBsaXN0LCBsaXN0X2l0ZW0sIG9yIG9uZSBvZiB0aGUgbGlzdF9tYXJrZXJfJ3MuCklm
IE5PREUgaXMgbm90IGluIGEgbGlzdCwgcmV0dXJuIC0xLiIKICAobGV0ICgoZGVwdGggLTEpKQog
ICAgKHdoaWxlIChhbmQgbm9kZQogICAgICAgICAgICAgICAgKG5vdCAoZXF1YWwgKHRyZWVzaXQt
bm9kZS10eXBlIG5vZGUpICJzZWN0aW9uIikpKQogICAgICAod2hlbiAoZXF1YWwgKHRyZWVzaXQt
bm9kZS10eXBlIG5vZGUpICJsaXN0IikKICAgICAgICAoc2V0cSBkZXB0aCAoMSsgZGVwdGgpKSkK
ICAgICAgKHNldHEgbm9kZSAodHJlZXNpdC1ub2RlLXBhcmVudCBub2RlKSkpCiAgICBkZXB0aCkp
CgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktdW5vcmRlcmVkLWxpc3QtbWFya2VyIChub2Rl
IG92ZXJyaWRlIHN0YXJ0IGVuZCAmcmVzdCBfKQogICJGb250aWZ5IHVub3JkZXJlZCBsaXN0IG1h
cmtlciBOT0RFLCBzaG93IGEgc3ltYm9sIHdoZW4gbWFya3VwIGlzIGhpZGRlbi4KT1ZFUlJJREUs
IFNUQVJULCBhbmQgRU5EIGFyZSBwYXNzZWQgdGhyb3VnaCB0bwpgdHJlZXNpdC1mb250aWZ5LXdp
dGgtb3ZlcnJpZGUnLiIKICAobGV0KiAoKG5vZGUtc3RhcnQgKHRyZWVzaXQtbm9kZS1zdGFydCBu
b2RlKSkKICAgICAgICAgKG5vZGUtZW5kICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAg
ICAoZmFjZSAnbWFya2Rvd24tdHMtbGlzdC1tYXJrZXIpKQogICAgKHRyZWVzaXQtZm9udGlmeS13
aXRoLW92ZXJyaWRlIG5vZGUtc3RhcnQgbm9kZS1lbmQgZmFjZQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG92ZXJyaWRlIHN0YXJ0IGVuZCkKICAgIChjb25kIChtYXJrZG93bi10
cy1oaWRlLW1hcmt1cAogICAgICAgICAgIChsZXQqICgoZGVwdGggKG1hcmtkb3duLXRzLS1saXN0
LWl0ZW0tZGVwdGggbm9kZSkpCiAgICAgICAgICAgICAgICAgICh2YWx1ZSAoaWYgbWFya2Rvd24t
dHMtdW5vcmRlcmVkLWxpc3QtbWFya2VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG50
aCAobW9kIGRlcHRoIChsZW5ndGggbWFya2Rvd24tdHMtdW5vcmRlcmVkLWxpc3QtbWFya2VyKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtkb3duLXRzLXVub3JkZXJlZC1s
aXN0LW1hcmtlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsKSkKICAgICAgICAgICAg
ICAgICAgKGRpc3BsYXktc3BlYyAobWFya2Rvd24tdHMtLXJlc29sdmUtZGlzcGxheS12YWx1ZSB2
YWx1ZSkpKQogICAgICAgICAgICAgKHB1dC10ZXh0LXByb3BlcnR5IG5vZGUtc3RhcnQgbm9kZS1l
bmQgJ2Rpc3BsYXkgZGlzcGxheS1zcGVjKSkpCiAgICAgICAgICAodAogICAgICAgICAgIChyZW1v
dmUtdGV4dC1wcm9wZXJ0aWVzIG5vZGUtc3RhcnQgbm9kZS1lbmQgJyhkaXNwbGF5IG5pbCkpKSkp
KQoKKGRlZnVuIG1hcmtkb3duLXRzLS1mb250aWZ5LWNoZWNrYm94IChub2RlIG92ZXJyaWRlIHN0
YXJ0IGVuZCAmcmVzdCBfKQogICJGb250aWZ5IHRhc2sgbGlzdCBjaGVja2JveCBOT0RFLCBzaG93
IGEgVW5pY29kZSBzeW1ib2wgd2hlbiBtYXJrdXAgaXMgaGlkZGVuLgpPVkVSUklERSwgU1RBUlQs
IGFuZCBFTkQgYXJlIHBhc3NlZCB0aHJvdWdoIHRvCmB0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVy
cmlkZScuIgogIChsZXQqICgobm9kZS1zdGFydCAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQog
ICAgICAgICAobm9kZS1lbmQgKHRyZWVzaXQtbm9kZS1lbmQgbm9kZSkpCiAgICAgICAgIChjaGVj
a2VkIChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUgbm9kZSkgInRhc2tfbGlzdF9tYXJrZXJfY2hl
Y2tlZCIpKQogICAgICAgICAoZmFjZSAoaWYgY2hlY2tlZCAnbWFya2Rvd24tdHMtdGFzay1jaGVj
a2VkCiAgICAgICAgICAgICAgICAgJ21hcmtkb3duLXRzLXRhc2stdW5jaGVja2VkKSkKICAgICAg
ICAgKHZhbHVlIChpZiBjaGVja2VkCiAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtY2hl
Y2tlZC1jaGVja2JveAogICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy11bmNoZWNrZWQtY2hl
Y2tib3gpKQogICAgICAgICAocmVwbGFjZW1lbnQKICAgICAgICAgIChjb25kICgoZXEgdmFsdWUg
J2ljb24pCiAgICAgICAgICAgICAgICAgKGljb24tc3RyaW5nIChpZiBjaGVja2VkCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFya2Rvd24tdHMtY2hlY2tlZC1jaGVja2JveC1p
Y29uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmtkb3duLXRzLXVuY2hlY2tl
ZC1jaGVja2JveC1pY29uKSkpCiAgICAgICAgICAgICAgICAodCAobWFya2Rvd24tdHMtLXJlc29s
dmUtZGlzcGxheS12YWx1ZSB2YWx1ZSkpKSkKICAgICAgICAgOzsgSWYgYGljb24tc3RyaW5nJyBy
ZXR1cm5lZCBhbiBpbWFnZSwgaXRzIGBkaXNwbGF5JyBwcm9wZXJ0eQogICAgICAgICA7OyBvbiBj
aGFyIDAgaG9sZHMgdGhlIGFjdHVhbCBpbWFnZSBzcGVjOyBuZXN0ZWQgYGRpc3BsYXknCiAgICAg
ICAgIDs7IHByb3BzIGFyZSBub3QgaG9ub3JlZCB3aGVuIGEgc3RyaW5nIGlzIHRoZSB2YWx1ZSBv
ZiBhCiAgICAgICAgIDs7IGBkaXNwbGF5JyB0ZXh0LXByb3BlcnR5LCBzbyBhcHBseSB0aGUgc3Bl
YyBkaXJlY3RseS4KICAgICAgICAgKGRpc3BsYXktc3BlYwogICAgICAgICAgKG9yIChhbmQgKGVx
IHZhbHVlICdpY29uKSByZXBsYWNlbWVudAogICAgICAgICAgICAgICAgICAgKGdldC10ZXh0LXBy
b3BlcnR5IDAgJ2Rpc3BsYXkgcmVwbGFjZW1lbnQpKQogICAgICAgICAgICAgIHJlcGxhY2VtZW50
KSkpCiAgICAodHJlZXNpdC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUgbm9kZS1zdGFydCBub2RlLWVu
ZCBmYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgc3RhcnQg
ZW5kKQogICAgKGlmIChhbmQgbWFya2Rvd24tdHMtaGlkZS1tYXJrdXAgcmVwbGFjZW1lbnQKICAg
ICAgICAgICAgIChvciAoZXEgdmFsdWUgJ2ljb24pCiAgICAgICAgICAgICAgICAgKGNoYXItZGlz
cGxheWFibGUtcCAoYXJlZiByZXBsYWNlbWVudCAwKSkpKQogICAgICAgIChwdXQtdGV4dC1wcm9w
ZXJ0eSBub2RlLXN0YXJ0IG5vZGUtZW5kICdkaXNwbGF5IGRpc3BsYXktc3BlYykKICAgICAgKHJl
bW92ZS10ZXh0LXByb3BlcnRpZXMgbm9kZS1zdGFydCBub2RlLWVuZCAnKGRpc3BsYXkgbmlsKSkp
KSkKCihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS1oYXJkLWxpbmUtYnJlYWsgKG5vZGUgb3Zl
cnJpZGUgc3RhcnQgZW5kICZyZXN0IF8pCiAgIkZvbnRpZnkgaGFyZCBsaW5lIGJyZWFrIE5PREU7
IHNob3cgYSBVbmljb2RlIHN5bWJvbCB3aGVuIG1hcmt1cCBpcyBoaWRkZW4uCkEgYmFja3NsYXNo
IGJyZWFrIGdldHMgYG1hcmtkb3duLXRzLWhhcmQtbGluZS1icmVhay1iYWNrc2xhc2gnIChvciBp
dHMKYC1oaWRkZW4nIHZhcmlhbnQgd2hlbiBtYXJrdXAgaXMgaGlkZGVuKTsgYSB0cmFpbGluZy1z
cGFjZXMgYnJlYWsgZ2V0cwpgbWFya2Rvd24tdHMtaGFyZC1saW5lLWJyZWFrLXNwYWNlJyAob3Ig
YC1oaWRkZW4nKS4gIFdoZW4gaGlkZGVuLCBhCmJhY2tzbGFzaCBicmVhayBpcyByZXBsYWNlZCBi
eSBhIHNpbmdsZSBgbWFya2Rvd24tdHMtaGFyZC1saW5lLWJyZWFrJwpnbHlwaDsgYSB0cmFpbGlu
Zy1zcGFjZXMgYnJlYWsgcmVwbGFjZXMgZWFjaCBzcGFjZSB3aXRoIHRoZSBnbHlwaCwgc28gdGhl
IHJ1bgpvZiBwaWxjcm93cyBmaWxscyB0aGUgbGluZSB1cCB0byB0aGUgbmV3bGluZS4KSWYgYG1h
cmtkb3duLXRzLWhhcmQtbGluZS1icmVhay1iYWNrc2xhc2gnIG9yCmBtYXJrZG93bi10cy1oYXJk
LWxpbmUtYnJlYWstc3BhY2UnIGFyZSB0aGUgc3ltYm9sIGBoaWRlJywgaGlkZSB0aGUKbWFya3Vw
IGVudGlyZWx5LgpPVkVSUklERSwgU1RBUlQsIGFuZCBFTkQgYXJlIHBhc3NlZCB0aHJvdWdoIHRv
CmB0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVycmlkZScuIgogIChsZXQqICgobm9kZS1zdGFydCAo
dHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQogICAgICAgICAobm9kZS1lbmQgICAodHJlZXNpdC1u
b2RlLWVuZCBub2RlKSkKICAgICAgICAgKHRleHQgICAgICAgKHRyZWVzaXQtbm9kZS10ZXh0IG5v
ZGUgdCkpCiAgICAgICAgIChiYWNrc2xhc2ggIChhbmQgKD4gKGxlbmd0aCB0ZXh0KSAwKSAoZXEg
KGFyZWYgdGV4dCAwKSA/XFwpKSkKICAgICAgICAgOzsgRGV0ZXJtaW5lIHRoZSBhY3R1YWwgcmFu
Z2UgdG8gZm9udGlmeSBhbmQgcmVwbGFjZS4gIFRoZQogICAgICAgICA7OyBoYXJkX2xpbmVfYnJl
YWsgbm9kZSBtYXkgbm90IGNvdmVyIHRoZSBmdWxsIHJ1biBvZiB0cmFpbGluZwogICAgICAgICA7
OyBzcGFjZXMsIHNvIHdhbGsgYmFjayBmcm9tIGVuZC1vZi1saW5lIG91cnNlbHZlcyBmb3IgdGhl
CiAgICAgICAgIDs7IHNwYWNlcyB2YXJpYW50LgogICAgICAgICAocmVnaW9uICAgICAoaWYgYmFj
a3NsYXNoCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucyBub2RlLXN0YXJ0CiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGFuZCAoPiBub2RlLWVuZCBub2RlLXN0YXJ0KQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxIChjaGFyLWJlZm9yZSBu
b2RlLWVuZCkgP1xuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS0gbm9k
ZS1lbmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtZW5kKSkKICAgICAg
ICAgICAgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAgICAgICAg
IChnb3RvLWNoYXIgbm9kZS1zdGFydCkKICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChl
b2wgKGxpbmUtZW5kLXBvc2l0aW9uKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25z
IChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb3Rv
LWNoYXIgZW9sKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2lwLWNoYXJz
LWJhY2t3YXJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiAobGluZS1i
ZWdpbm5pbmctcG9zaXRpb24pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChw
b2ludCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvbCkpKSkpCiAgICAgICAg
IChyZWdpb24tc3RhcnQgKGNhciByZWdpb24pKQogICAgICAgICAocmVnaW9uLWVuZCAgIChjZHIg
cmVnaW9uKSkKICAgICAgICAgKGZhY2UgICAgICAgKGNvbmQKICAgICAgICAgICAgICAgICAgICAg
ICgoYW5kIGJhY2tzbGFzaCBtYXJrZG93bi10cy1oaWRlLW1hcmt1cCkKICAgICAgICAgICAgICAg
ICAgICAgICAnbWFya2Rvd24tdHMtaGFyZC1saW5lLWJyZWFrLWJhY2tzbGFzaC1oaWRkZW4pCiAg
ICAgICAgICAgICAgICAgICAgICAoYmFja3NsYXNoICdtYXJrZG93bi10cy1oYXJkLWxpbmUtYnJl
YWstYmFja3NsYXNoKQogICAgICAgICAgICAgICAgICAgICAgKG1hcmtkb3duLXRzLWhpZGUtbWFy
a3VwCiAgICAgICAgICAgICAgICAgICAgICAgJ21hcmtkb3duLXRzLWhhcmQtbGluZS1icmVhay1z
cGFjZS1oaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgICAodCAnbWFya2Rvd24tdHMtaGFyZC1s
aW5lLWJyZWFrLXNwYWNlKSkpKQogICAgKHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlIHJl
Z2lvbi1zdGFydCByZWdpb24tZW5kIGZhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBvdmVycmlkZSBzdGFydCBlbmQpCiAgICA7OyBBbHdheXMgc3RhcnQgYnkgY2xlYXJpbmcg
YW55IHN0YWxlIGBkaXNwbGF5JyBwcm9wZXJ0eS4gIFdlIG5ldmVyCiAgICA7OyBzcGFuIHRoZSB0
cmFpbGluZyBuZXdsaW5lIHdpdGggYGRpc3BsYXknIChpdCBjb25mdXNlcwogICAgOzsgcmVkaXNw
bGF5J3MgY3Vyc29yIHBsYWNlbWVudCksIGFuZCB3ZSBvbmx5IHBhaW50IGEgc2luZ2xlCiAgICA7
OyBjb21iaW5lZCBzdHJpbmcgb250byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBydW4sIGxl
YXZpbmcKICAgIDs7IHRoZSByZXN0IG9mIHRoZSBtYXJrdXAgYWxvbmUuCiAgICAocmVtb3ZlLXRl
eHQtcHJvcGVydGllcyByZWdpb24tc3RhcnQgcmVnaW9uLWVuZCAnKGRpc3BsYXkgbmlsKSkKICAg
ICh3aGVuIG1hcmtkb3duLXRzLWhpZGUtbWFya3VwCiAgICAgIChsZXQqICgoc3BlYyAoaWYgYmFj
a3NsYXNoCiAgICAgICAgICAgICAgICAgICAgICAgKG1hcmtkb3duLXRzLS1yZXNvbHZlLWRpc3Bs
YXktdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtaGFyZC1saW5lLWJy
ZWFrLWJhY2tzbGFzaCkKICAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtaGFyZC1saW5l
LWJyZWFrLXNwYWNlKSkKICAgICAgICAgICAgIChzdHIgKGNvbmQKICAgICAgICAgICAgICAgICAg
ICgobnVsbCBzcGVjKSBuaWwpCiAgICAgICAgICAgICAgICAgICAoKGNoYXJhY3RlcnAgc3BlYykg
KGNoYXItdG8tc3RyaW5nIHNwZWMpKQogICAgICAgICAgICAgICAgICAgKChzdHJpbmdwIHNwZWMp
IHNwZWMpCiAgICAgICAgICAgICAgICAgICAoKGZ1bmN0aW9ucCBzcGVjKQogICAgICAgICAgICAg
ICAgICAgIChmdW5jYWxsIHNwZWMgKC0gcmVnaW9uLWVuZCByZWdpb24tc3RhcnQpKSkpKSkKICAg
ICAgICAoaWYgKGVxIHNwZWMgJ2hpZGUpCiAgICAgICAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSBy
ZWdpb24tc3RhcnQgcmVnaW9uLWVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lu
dmlzaWJsZSAnbWFya2Rvd24tdHMtLW1hcmt1cCkKICAgICAgICAgICh3aGVuIChhbmQgKHN0cmlu
Z3Agc3RyKQogICAgICAgICAgICAgICAgICAgICAoPiAobGVuZ3RoIHN0cikgMCkKICAgICAgICAg
ICAgICAgICAgICAgKGNoYXItZGlzcGxheWFibGUtcCAoYXJlZiBzdHIgMCkpKQogICAgICAgICAg
ICAocHV0LXRleHQtcHJvcGVydHkgcmVnaW9uLXN0YXJ0ICgxKyByZWdpb24tc3RhcnQpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSBzdHIpCiAgICAgICAgICAgIDs7IEZv
ciB0aGUgdHJhaWxpbmctc3BhY2VzIHZhcmlhbnQsIGhpZGUgdGhlIHJlbWFpbmluZwogICAgICAg
ICAgICA7OyBzcGFjZXMgaW4gdGhlIHJ1biBzbyB0aGUgbGluZSBkb2Vzbid0IGVuZCB3aXRoIGxl
ZnRvdmVyCiAgICAgICAgICAgIDs7IHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIHN1YnN0aXR1dGVkIGds
eXBoLiAgRWFjaCBwb3NpdGlvbgogICAgICAgICAgICA7OyBnZXRzIGl0cyBvd24gZW1wdHktc3Ry
aW5nIGBkaXNwbGF5JyBzbyBjdXJzb3IgcGxhY2VtZW50CiAgICAgICAgICAgIDs7IHN0YXlzIHVu
YW1iaWd1b3VzLgogICAgICAgICAgICAodW5sZXNzIGJhY2tzbGFzaAogICAgICAgICAgICAgIChs
ZXQgKChpICgxKyByZWdpb24tc3RhcnQpKSkKICAgICAgICAgICAgICAgICh3aGlsZSAoPCBpIHJl
Z2lvbi1lbmQpCiAgICAgICAgICAgICAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSBpICgxKyBpKSAn
ZGlzcGxheSAiIikKICAgICAgICAgICAgICAgICAgKHNldHEgaSAoMSsgaSkpKSkpKSkpKSkpCgoo
ZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktdGhlbWF0aWMtYnJlYWsgKG5vZGUgb3ZlcnJpZGUg
c3RhcnQgZW5kICZyZXN0IF8pCiAgIkZvbnRpZnkgdGhlbWF0aWMgYnJlYWsgTk9ERSBhbmQgc2hv
dyBhIGxpbmUgd2hlbiBtYXJrdXAgaXMgaGlkZGVuLgpPVkVSUklERSwgU1RBUlQsIGFuZCBFTkQg
YXJlIHBhc3NlZCB0aHJvdWdoIHRvCmB0cmVlc2l0LWZvbnRpZnktd2l0aC1vdmVycmlkZScuIgog
IChsZXQgKChub2RlLXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAgICAgKG5v
ZGUtZW5kICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKSkKICAgICh0cmVlc2l0LWZvbnRpZnktd2l0
aC1vdmVycmlkZSBub2RlLXN0YXJ0IG5vZGUtZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJ21hcmtkb3duLXRzLXRoZW1hdGljLWJyZWFrCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgb3ZlcnJpZGUgc3RhcnQgZW5kKQogICAgKGlmIG1hcmtkb3duLXRzLWhp
ZGUtbWFya3VwCiAgICAgICAgKGNvbmQKICAgICAgICAgKChhbmQgKGRpc3BsYXktc3VwcG9ydHMt
ZmFjZS1hdHRyaWJ1dGVzLXAgJyg6ZXh0ZW5kIHQpKQogICAgICAgICAgICAgICAoZmFjZS1hdHRy
aWJ1dGUgJ21hcmtkb3duLXRzLXRoZW1hdGljLWJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA6ZXh0ZW5kIG5pbCAnZGVmYXVsdCkpCiAgICAgICAgICAocHV0LXRleHQtcHJvcGVy
dHkgbm9kZS1zdGFydCBub2RlLWVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNw
bGF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnRpemUgIlxuIiAnZmFjZSAn
KDpleHRlbmQgdCA6dW5kZXJsaW5lIHQpKSkpCiAgICAgICAgICh0CiAgICAgICAgICAod2hlbi1s
ZXQqICgoY2hhciAobWFya2Rvd24tdHMtLXJlc29sdmUtZGlzcGxheS12YWx1ZQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1hcmtkb3duLXRzLXRoZW1hdGljLWJyZWFrLWNoYXJhY3Rlcikp
CiAgICAgICAgICAgICAgICAgICAgICAoXyAoY2hhci1kaXNwbGF5YWJsZS1wIGNoYXIpKSkKICAg
ICAgICAgICAgKGxldCogKChjb2wgKHNhdmUtZXhjdXJzaW9uIChnb3RvLWNoYXIgbm9kZS1zdGFy
dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LWNvbHVt
bikpKQogICAgICAgICAgICAgICAgICAgKHNwYW4tbGVuZ3RoIChtYXggMTIgKC0gKHdpbmRvdy1i
b2R5LXdpZHRoKSBjb2wpKSkpCiAgICAgICAgICAgICAgKHB1dC10ZXh0LXByb3BlcnR5IG5vZGUt
c3RhcnQgbm9kZS1lbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKG1ha2Utc3RyaW5nIHNwYW4tbGVuZ3RoIGNoYXIpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iKSkpKSkpCiAgICAgIChyZW1vdmUtdGV4dC1w
cm9wZXJ0aWVzIG5vZGUtc3RhcnQgbm9kZS1lbmQgJyhkaXNwbGF5IG5pbCkpKSkpCgooZGVmdW4g
bWFya2Rvd24tdHMtLWZvbnRpZnktY29kZS1ibG9jayAobm9kZSBfb3ZlcnJpZGUgX3N0YXJ0IF9l
bmQgJnJlc3QgXykKICAiRm9udGlmeSBjb2RlIGJsb2NrIGNvbnRlbnQgTk9ERSB3aXRoIGEgYmFj
a2dyb3VuZCBvdmVybGF5LgpVc2UgYG1hcmtkb3duLXRzLWNvZGUtYmxvY2stbWFya3VwLWhpZGRl
bicgd2hlbiBtYXJrdXAgaXMgaGlkZGVuLApgbWFya2Rvd24tdHMtY29kZS1ibG9jaycgb3RoZXJ3
aXNlLiAgVXNlIGFuIG92ZXJsYXkgc28gdGhlCmJhY2tncm91bmQgbGF5ZXJzIGl0c2VsZiBiZWhp
bmQgbGFuZ3VhZ2Utc3BlY2lmaWMgZm9udGlmaWNhdGlvbi4KVGhlIG92ZXJsYXkgYWxzbyBzdG9y
ZXMgdGhlIGNvZGUgYmxvY2sgbGFuZ3VhZ2UgYW5kIG1vZGUgYXMKcHJvcGVydGllcyBgbWFya2Rv
d24tdHMtY29kZS1ibG9jay1sYW5ndWFnZScgYW5kCmBtYXJrZG93bi10cy1jb2RlLWJsb2NrLW1v
ZGUnLCBhY2Nlc3NpYmxlIHZpYQpgbWFya2Rvd24tdHMtY29kZS1ibG9jay1sYW5ndWFnZS1hdCcu
IgogIChsZXQqICgobm9kZS1zdGFydCAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAg
ICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkpCiAgICAgICAgICAgICAg
ICAgICAgICAgKGxpbmUtYmVnaW5uaW5nLXBvc2l0aW9uKSkpCiAgICAgICAgIChub2RlLWVuZCAo
c2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1u
b2RlLWVuZCBub2RlKSkKICAgICAgICAgICAgICAgICAgICAgKHNraXAtY2hhcnMtYmFja3dhcmQg
IiBcdCIpCiAgICAgICAgICAgICAgICAgICAgIChwb2ludCkpKQogICAgICAgICAoZmFjZSAoaWYg
bWFya2Rvd24tdHMtaGlkZS1tYXJrdXAKICAgICAgICAgICAgICAgICAgICdtYXJrZG93bi10cy1j
b2RlLWJsb2NrLW1hcmt1cC1oaWRkZW4KICAgICAgICAgICAgICAgICAnbWFya2Rvd24tdHMtY29k
ZS1ibG9jaykpCiAgICAgICAgIChsYW5nIChtYXJrZG93bi10cy0tbGFuZ3VhZ2UtYXQtbm9kZSBu
b2RlKSkKICAgICAgICAgKG1vZGUgKHdoZW4gbGFuZwogICAgICAgICAgICAgICAgIChtYXJrZG93
bi10cy0tY29kZS1ibG9jay1sYW5ndWFnZS1tb2RlIGxhbmcpKSkKICAgICAgICAgKGV4aXN0aW5n
IChzZXEtZmluZCAobGFtYmRhIChvdikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChv
dmVybGF5LWdldCBvdiAnbWFya2Rvd24tdHMtY29kZS1ibG9jaykpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKG92ZXJsYXlzLWF0IG5vZGUtc3RhcnQpKSkpCiAgICAoaWYgZXhpc3RpbmcK
ICAgICAgICAocHJvZ24KICAgICAgICAgIChtb3ZlLW92ZXJsYXkgZXhpc3Rpbmcgbm9kZS1zdGFy
dCBub2RlLWVuZCkKICAgICAgICAgIChvdmVybGF5LXB1dCBleGlzdGluZyAnZmFjZSBmYWNlKQog
ICAgICAgICAgKG92ZXJsYXktcHV0IGV4aXN0aW5nICdtYXJrZG93bi10cy1jb2RlLWJsb2NrLWxh
bmd1YWdlIGxhbmcpCiAgICAgICAgICAob3ZlcmxheS1wdXQgZXhpc3RpbmcgJ21hcmtkb3duLXRz
LWNvZGUtYmxvY2stbW9kZSBtb2RlKSkKICAgICAgKGxldCAoKG92IChtYWtlLW92ZXJsYXkgbm9k
ZS1zdGFydCBub2RlLWVuZCBuaWwgdCBuaWwpKSkKICAgICAgICA7OyBNYXJrZXJzIG5lZWQgdG8g
YmUgc2V0IG9ubHkgb25jZS4KICAgICAgICAob3ZlcmxheS1wdXQgb3YgJ21hcmtkb3duLXRzLWNv
ZGUtYmVnLW1hcmtlciAoc2V0LW1hcmtlciAobWFrZS1tYXJrZXIpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS1zdGFy
dCkpCiAgICAgICAgKG92ZXJsYXktcHV0IG92ICdtYXJrZG93bi10cy1jb2RlLWVuZC1tYXJrZXIg
KHNldC1tYXJrZXIgKG1ha2UtbWFya2VyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtZW5kKSkKICAgICAgICAob3Zl
cmxheS1wdXQgb3YgJ21hcmtkb3duLXRzLWNvZGUtYmxvY2sgdCkKICAgICAgICAob3ZlcmxheS1w
dXQgb3YgJ2ZhY2UgZmFjZSkKICAgICAgICAob3ZlcmxheS1wdXQgb3YgJ3ByaW9yaXR5ICcobmls
IC4gMTApKQogICAgICAgIChvdmVybGF5LXB1dCBvdiAnbWFya2Rvd24tdHMtY29kZS1ibG9jay1s
YW5ndWFnZSBsYW5nKQogICAgICAgIChvdmVybGF5LXB1dCBvdiAnbWFya2Rvd24tdHMtY29kZS1i
bG9jay1tb2RlIG1vZGUpCiAgICAgICAgKG92ZXJsYXktcHV0IG92ICdldmFwb3JhdGUgdCkpKSkp
CgooZGVmdW4gbWFya2Rvd24tdHMtYXQtY29kZS1ibG9jay1wICgmb3B0aW9uYWwgcG9zKQogICJS
ZXR1cm4gbm9uIG5pbCBpZiBwb2ludCBpcyBpbiBhIGNvZGUgYmxvY2suCklmIFBPUyBpcyBuaWws
IHVzZSBwb2ludC4iCiAgKGdldC1jaGFyLXByb3BlcnR5IChvciBwb3MgKHBvaW50KSkgJ21hcmtk
b3duLXRzLWNvZGUtYmxvY2spKQoKKGRlZnVuIG1hcmtkb3duLXRzLWNvZGUtYmxvY2stbGFuZ3Vh
Z2UtYXQgKCZvcHRpb25hbCBwb3MpCiAgIlJldHVybiB0aGUgbGFuZ3VhZ2Ugc3ltYm9sIG9mIHRo
ZSBjb2RlIGJsb2NrIGF0IFBPUy4KSWYgUE9TIGlzIG5pbCwgdXNlIHBvaW50LiAgUmV0dXJucyBu
aWwgaWYgUE9TIGlzIG5vdCBpbnNpZGUgYSBmZW5jZWQKY29kZSBibG9jay4gIFRoaXMgd29ya3Mg
cmVnYXJkbGVzcyBvZiB3aGV0aGVyIGEgZ3Vlc3QgdHJlZS1zaXR0ZXIgcGFyc2VyCmlzIGFjdGl2
ZSwgc2luY2UgdGhlIGxhbmd1YWdlIGlzIHN0b3JlZCBvbiB0aGUgY29kZSBibG9jayBvdmVybGF5
IGJ5IHRoZQpob3N0IHBhcnNlcidzIGZvbnRpZmljYXRpb24uIgogIChnZXQtY2hhci1wcm9wZXJ0
eSAob3IgcG9zIChwb2ludCkpICdtYXJrZG93bi10cy1jb2RlLWJsb2NrLWxhbmd1YWdlKSkKCihk
ZWZ1biBtYXJrZG93bi10cy1jb2RlLWJsb2NrLW1vZGUtYXQgKCZvcHRpb25hbCBwb3MpCiAgIlJl
dHVybiB0aGUgbWFqb3IgbW9kZSBmb3IgdGhlIGNvZGUgYmxvY2sgYXQgUE9TLgpJZiBQT1MgaXMg
bmlsLCB1c2UgcG9pbnQuICBSZXR1cm5zIG5pbCBpZiBQT1MgaXMgbm90IGluc2lkZSBhIGZlbmNl
ZApjb2RlIGJsb2NrIG9yIGlmIHRoZSBsYW5ndWFnZSBoYXMgbm8gcmVjb2duaXplZCBtb2RlLiIK
ICAod2hlbiAobWFya2Rvd24tdHMtYXQtY29kZS1ibG9jay1wIHBvcykKICAgIChvciAoZ2V0LWNo
YXItcHJvcGVydHkgKG9yIHBvcyAocG9pbnQpKSAnbWFya2Rvd24tdHMtY29kZS1ibG9jay1tb2Rl
KQogICAgICAgIG1hcmtkb3duLXRzLWRlZmF1bHQtY29kZS1ibG9jay1tb2RlKSkpCgooZGVmdW4g
bWFya2Rvd24tdHMtLWhvc3QtcmFuZ2VzLW5vdGlmaWVyIChyYW5nZXMgX3BhcnNlcikKICAiUHJ1
bmUgc3RhbGUgY29kZSBibG9jayBvdmVybGF5cyBhZnRlciB0aGUgaG9zdCBwYXJzZXIgcmVwYXJz
ZXMuClJBTkdFUyBpcyBhIGxpc3Qgb2YgKFNUQVJUIC4gRU5EKSBjb25zIGNlbGxzIG1hcmtpbmcg
cmVnaW9ucyB3aGVyZQp0aGUgbWFya2Rvd24gcGFyc2UgdHJlZSBjaGFuZ2VkLiAgRm9yIGVhY2gg
YG1hcmtkb3duLXRzLWNvZGUtYmxvY2snCm92ZXJsYXkgaW50ZXJzZWN0aW5nIGEgY2hhbmdlZCBy
YW5nZSwgdmVyaWZ5IHRoYXQgYSBjb250YWluaW5nCmBmZW5jZWRfY29kZV9ibG9jaycgbm9kZSBz
dGlsbCBleGlzdHMgaW4gdGhlIGhvc3QgdHJlZS4gIElmIG5vdCwKdGhlIGZlbmNlcyB3ZXJlIGRl
bGV0ZWQsIHNvIGRlbGV0ZSB0aGUgb3ZlcmxheSB0byBhdm9pZCBydW5uaW5nCmNvbW1hbmRzIGlu
IGEgc3RhbGUgYmxvY2sgY29udGV4dC4iCiAgKGRvbGlzdCAocmFuZ2UgcmFuZ2VzKQogICAgKGxl
dCAoKGJlZyAoY2FyIHJhbmdlKSkKICAgICAgICAgIChlbmQgKGNkciByYW5nZSkpKQogICAgICAo
ZG9saXN0IChvdiAob3ZlcmxheXMtaW4gYmVnIGVuZCkpCiAgICAgICAgKHdoZW4gKG92ZXJsYXkt
Z2V0IG92ICdtYXJrZG93bi10cy1jb2RlLWJsb2NrKQogICAgICAgICAgKGxldCogKChvdi1zdGFy
dCAob3ZlcmxheS1zdGFydCBvdikpCiAgICAgICAgICAgICAgICAgKG5vZGUgKGFuZCBvdi1zdGFy
dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1hdCBvdi1zdGFydCAn
bWFya2Rvd24pKSkpCiAgICAgICAgICAgICh1bmxlc3MgKGFuZCBub2RlCiAgICAgICAgICAgICAg
ICAgICAgICAgICAodHJlZXNpdC1wYXJlbnQtdW50aWwKICAgICAgICAgICAgICAgICAgICAgICAg
ICBub2RlICJcXGBmZW5jZWRfY29kZV9ibG9ja1xcJyIgdCkpCiAgICAgICAgICAgICAgKGRlbGV0
ZS1vdmVybGF5IG92KSkpKSkpKSkKCjs7OyBJbWFnZSBoYW5kbGluZzoKCihkZWZ1biBtYXJrZG93
bi10cy0taW1hZ2UtYWxvbmUtb24tbGluZS1wIChub2RlKQogICJSZXR1cm4gbm9uLW5pbCBpZiBp
bWFnZSBOT0RFIGlzIHRoZSBvbmx5IGNvbnRlbnQgb24gaXRzIGxpbmUuCldoaXRlc3BhY2UsIGJs
b2NrIHF1b3RlIG1hcmtlcnMgKGA+JyksIGFuZCBsaXN0IG1hcmtlcnMKXChgLScsIGAqJywgYCsn
LCBgMS4nKSBiZWZvcmUgdGhlIGltYWdlIGFyZSBpZ25vcmVkLiIKICAobGV0ICgobm9kZS1zdGFy
dCAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQogICAgICAgIChub2RlLWVuZCAodHJlZXNpdC1u
b2RlLWVuZCBub2RlKSkpCiAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgKGdvdG8tY2hhciBub2Rl
LXN0YXJ0KQogICAgICAobGV0ICgoYm9sIChsaW5lLWJlZ2lubmluZy1wb3NpdGlvbikpCiAgICAg
ICAgICAgIChlb2wgKGxpbmUtZW5kLXBvc2l0aW9uKSkpCiAgICAgICAgOzsgQmVmb3JlIHRoZSBp
bWFnZTogb25seSBibG9jayBxdW90ZSBtYXJrZXJzLCB3aGl0ZXNwYWNlLAogICAgICAgIDs7IGFu
ZCBhbiBvcHRpb25hbCBsaXN0IG1hcmtlciBhcmUgYWxsb3dlZC4KICAgICAgICAoYW5kIChzdHJp
bmctbWF0Y2gtcAogICAgICAgICAgICAgIChyeCBib3MKICAgICAgICAgICAgICAgICAgKHplcm8t
b3ItbW9yZSAoYW55ICI+IFx0IikpCiAgICAgICAgICAgICAgICAgIChvcHRpb25hbCAob3IgKHNl
cSAoYW55ICItKisiKSAiICIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlcSAo
b25lLW9yLW1vcmUgZGlnaXQpIChhbnkgIi4pIiApICIgIikpKQogICAgICAgICAgICAgICAgICBl
b3MpCiAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmctbm8tcHJvcGVydGllcyBib2wgbm9k
ZS1zdGFydCkpCiAgICAgICAgICAgICA7OyBBZnRlciB0aGUgaW1hZ2U6IG9ubHkgdHJhaWxpbmcg
d2hpdGVzcGFjZSBhbGxvd2VkLgogICAgICAgICAgICAgKHN0cmluZy1tYXRjaC1wCiAgICAgICAg
ICAgICAgKHJ4IGJvcyAoemVyby1vci1tb3JlIChhbnkgIiBcdCIpKSBlb3MpCiAgICAgICAgICAg
ICAgKGJ1ZmZlci1zdWJzdHJpbmctbm8tcHJvcGVydGllcyBub2RlLWVuZCBlb2wpKSkpKSkpCgoo
ZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktaW1hZ2UgKG5vZGUgX292ZXJyaWRlIF9zdGFydCBf
ZW5kICZyZXN0IF8pCiAgIlNob3cgYW4gaW5saW5lIGltYWdlIGF0IE5PREUuCldoZW4gYG1hcmtk
b3duLXRzLWlubGluZS1pbWFnZXMnIGlzIG5vbi1uaWwsIGRpc3BsYXkgdGhlIGltYWdlLgpJZiB0
aGUgaW1hZ2UgbGluayBpcyB0aGUgb25seSBjb250ZW50IG9uIGl0cyBsaW5lLCBkaXNwbGF5IHRo
ZQppbWFnZSBiZWxvdyB0aGUgbGluay4gIElmIHRoZSBpbWFnZSBpcyBpbmxpbmUgd2l0aGluIGEg
cGFyYWdyYXBoLApkaXNwbGF5IGl0IHJpZ2h0IGFmdGVyIHRoZSBsaW5rIHRleHQuClJlbW90ZSBp
bWFnZXMgYXJlIGNvbnRyb2xsZWQgYnkKYG1hcmtkb3duLXRzLWRpc3BsYXktcmVtb3RlLWlubGlu
ZS1pbWFnZXMnLiIKICAobGV0KiAoKG5vZGUtc3RhcnQgKHRyZWVzaXQtbm9kZS1zdGFydCBub2Rl
KSkKICAgICAgICAgKG5vZGUtZW5kICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAgICAo
ZW9sIChzYXZlLWV4Y3Vyc2lvbiAoZ290by1jaGFyIG5vZGUtZW5kKQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAobGluZS1lbmQtcG9zaXRpb24pKSkKICAgICAgICAgKHNlYXJjaC1lbmQg
KG1pbiAoMSsgZW9sKSAocG9pbnQtbWF4KSkpKQogICAgOzsgQWx3YXlzIGNsZWFyIHN0YWxlIG92
ZXJsYXlzIGZvciB0aGlzIG5vZGUncyByYW5nZS4KICAgIChkb2xpc3QgKG92IChvdmVybGF5cy1p
biBub2RlLXN0YXJ0IHNlYXJjaC1lbmQpKQogICAgICAod2hlbiAoYW5kIChvdmVybGF5LWdldCBv
diAnbWFya2Rvd24tdHMtaW1hZ2UpCiAgICAgICAgICAgICAgICAgKD49IChvdmVybGF5LXN0YXJ0
IG92KSBub2RlLXN0YXJ0KQogICAgICAgICAgICAgICAgICg8PSAob3ZlcmxheS1lbmQgb3YpIHNl
YXJjaC1lbmQpKQogICAgICAgIChkZWxldGUtb3ZlcmxheSBvdikpKQogICAgKHdoZW4gKGFuZCBt
YXJrZG93bi10cy1pbmxpbmUtaW1hZ2VzCiAgICAgICAgICAgICAgIChkaXNwbGF5LWdyYXBoaWMt
cCkKICAgICAgICAgICAgICAgOzsgRG9uJ3QgY3JlYXRlIGltYWdlIG92ZXJsYXlzIGZvciBub2Rl
cyBpbnNpZGUKICAgICAgICAgICAgICAgOzsgZm9sZGVkIChvdXRsaW5lLWludmlzaWJsZSkgaGVh
ZGluZ3MsIHNpbmNlIHRoZQogICAgICAgICAgICAgICA7OyBpbWFnZXMgd291bGRuJ3QgYmUgdmlz
aWJsZSBhbmQgY291bGQgaW50ZXJmZXJlCiAgICAgICAgICAgICAgIDs7IHdpdGggdGhlIGZvbGRl
ZCBkaXNwbGF5LgogICAgICAgICAgICAgICAobm90IChtYXJrZG93bi10cy0tb3V0bGluZS1pbnZp
c2libGUtcCBub2RlLXN0YXJ0KSkpCiAgICAgIChsZXQqICgoZGVzdCAodHJlZXNpdC1zZWFyY2gt
c3VidHJlZSBub2RlICJcXGBsaW5rX2Rlc3RpbmF0aW9uXFwnIikpCiAgICAgICAgICAgICAodXJs
IChhbmQgZGVzdCAodHJlZXNpdC1ub2RlLXRleHQgZGVzdCB0KSkpCiAgICAgICAgICAgICAocmVt
b3RlcCAoYW5kIHVybCAoc3RyaW5nLW1hdGNoLXAgIlxcYGh0dHBzPzovLyIgdXJsKSkpCiAgICAg
ICAgICAgICAoZGlzcGxheWFibGUKICAgICAgICAgICAgICAod2hlbiB1cmwKICAgICAgICAgICAg
ICAgIChpZiByZW1vdGVwCiAgICAgICAgICAgICAgICAgICAgKHdoZW4gKGVxIG1hcmtkb3duLXRz
LWRpc3BsYXktcmVtb3RlLWlubGluZS1pbWFnZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJ2Rvd25sb2FkKQogICAgICAgICAgICAgICAgICAgICAgKGlnbm9yZS1lcnJvcnMKICAgICAg
ICAgICAgICAgICAgICAgICAgKHJlcXVpcmUgJ3VybC1oYW5kbGVycykKICAgICAgICAgICAgICAg
ICAgICAgICAgKHdpdGgtd29yay1idWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0
LWJ1ZmZlci1tdWx0aWJ5dGUgbmlsKQogICAgICAgICAgICAgICAgICAgICAgICAgICh1cmwtaW5z
ZXJ0LWZpbGUtY29udGVudHMgdXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXIt
c3RyaW5nKSkpKQogICAgICAgICAgICAgICAgICAobGV0ICgoZmlsZSAoZXhwYW5kLWZpbGUtbmFt
ZSB1cmwpKSkKICAgICAgICAgICAgICAgICAgICAoYW5kIChub3QgKGZpbGUtcmVtb3RlLXAgZmls
ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZS1leGlzdHMtcCBmaWxlKQogICAgICAg
ICAgICAgICAgICAgICAgICAgKGltYWdlLXN1cHBvcnRlZC1maWxlLXAgZmlsZSkKICAgICAgICAg
ICAgICAgICAgICAgICAgIGZpbGUpKSkpKQogICAgICAgICAgICAgKG1heC13IChhbmQgZGlzcGxh
eWFibGUKICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoZXEgbWFya2Rvd24tdHMtaW1hZ2Ut
bWF4LXdpZHRoICd3aW5kb3cpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpbmRvdy1i
b2R5LXdpZHRoIG5pbCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy1p
bWFnZS1tYXgtd2lkdGgpKSkKICAgICAgICAgICAgIChpbWcgKGFuZCBtYXgtdwogICAgICAgICAg
ICAgICAgICAgICAgIChjcmVhdGUtaW1hZ2UgZGlzcGxheWFibGUgbmlsIHJlbW90ZXAKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptYXgtd2lkdGggbWF4LXcKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzY2FsZSAxKSkpKQogICAgICAgICh3aGVuIGlt
ZwogICAgICAgICAgKGxldCogKChhbG9uZSAobWFya2Rvd24tdHMtLWltYWdlLWFsb25lLW9uLWxp
bmUtcCBub2RlKSkKICAgICAgICAgICAgICAgICAoc3RyIChpZiBhbG9uZQogICAgICAgICAgICAg
ICAgICAgICAgICAgIChjb25jYXQgIlxuIiAocHJvcGVydGl6ZSAiICIgJ2Rpc3BsYXkgaW1nKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnRpemUgIiAiICdkaXNwbGF5IGltZykpKQog
ICAgICAgICAgICAgICAgIChvdiAobWFrZS1vdmVybGF5ICgxLSBub2RlLWVuZCkgbm9kZS1lbmQg
bmlsIHQgbmlsKSkpCiAgICAgICAgICAgIChvdmVybGF5LXB1dCBvdiAnbWFya2Rvd24tdHMtaW1h
Z2UgdCkKICAgICAgICAgICAgKG92ZXJsYXktcHV0IG92ICdhZnRlci1zdHJpbmcgc3RyKQogICAg
ICAgICAgICAob3ZlcmxheS1wdXQgb3YgJ2V2YXBvcmF0ZSB0KSkpKSkpKQoKOzs7IFVSTC9VUkkg
aGFuZGxpbmc6CgooZGVmdmFyIG1hcmtkb3duLXRzLS1iYXJlLXVybC1yZWdleHAgZ290by1hZGRy
ZXNzLXVybC1yZWdleHAKICAiUmVnZXhwIG1hdGNoaW5nIGJhcmUgVVJMcyBub3Qgd3JhcHBlZCBp
biBhbmdsZSBicmFja2V0cyBvciBsaW5rIHN5bnRheC4iKQoKKGRlZnZhciBtYXJrZG93bi10cy0t
YmFyZS1lbWFpbC11cmktcmVnZXhwIGdvdG8tYWRkcmVzcy1tYWlsLXJlZ2V4cAogICJSZWdleHAg
bWF0Y2hpbmcgYmFyZSBlbWFpbCBhZGRyZXNzZXMgbm90IHdyYXBwZWQgaW4gYW5nbGUgYnJhY2tl
dHMuIikKCihkZWZ1biBtYXJrZG93bi10cy0tZm9udGlmeS1iYXJlLXVyaSAoc3RhcnQgZW5kKQog
ICJGb250aWZ5IGJhcmUgVVJMIG9yIGVtYWlsIFVSSSBiZXR3ZWVuIFNUQVJUIGFuZCBFTkQuClNr
aXAgbWF0Y2hlcyBhbHJlYWR5IGluc2lkZSB0cmVlLXNpdHRlciBsaW5rIG9yIGF1dG9saW5rIG5v
ZGVzLiIKICAoZG9saXN0IChyZSAobGlzdCBtYXJrZG93bi10cy0tYmFyZS11cmwtcmVnZXhwCiAg
ICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtLWJhcmUtZW1haWwtdXJpLXJlZ2V4cCkpCiAg
ICAoZ290by1jaGFyIHN0YXJ0KQogICAgKHdoaWxlIChyZS1zZWFyY2gtZm9yd2FyZCByZSBlbmQg
dCkKICAgICAgKGxldCogKCh1cmktc3RhcnQgKG1hdGNoLWJlZ2lubmluZyAwKSkKICAgICAgICAg
ICAgICh1cmktZW5kIChtYXRjaC1lbmQgMCkpCiAgICAgICAgICAgICAodXJpIChtYXRjaC1zdHJp
bmcgMCkpCiAgICAgICAgICAgICAobm9kZSAodHJlZXNpdC1ub2RlLWF0IHVyaS1zdGFydCAnbWFy
a2Rvd24taW5saW5lKSkKICAgICAgICAgICAgIChwYXJlbnQgKGFuZCBub2RlICh0cmVlc2l0LW5v
ZGUtcGFyZW50IG5vZGUpKSkKICAgICAgICAgICAgIChwYXJlbnQtdHlwZSAoYW5kIHBhcmVudCAo
dHJlZXNpdC1ub2RlLXR5cGUgcGFyZW50KSkpKQogICAgICAgICh1bmxlc3MgKG9yIChtZW1iZXIg
cGFyZW50LXR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoImlubGluZV9saW5rIiAi
ZnVsbF9yZWZlcmVuY2VfbGluayIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGxh
cHNlZF9yZWZlcmVuY2VfbGluayIgInNob3J0Y3V0X2xpbmsiCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJpbWFnZSIgInVyaV9hdXRvbGluayIgImVtYWlsX2F1dG9saW5rIgogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAibGlua19kZXN0aW5hdGlvbiIpKQogICAgICAgICAgICAg
ICAgICAgIChtZW1iZXIgKGFuZCBub2RlICh0cmVlc2l0LW5vZGUtdHlwZSBub2RlKSkKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICcoInVyaV9hdXRvbGluayIgImVtYWlsX2F1dG9saW5rIgog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlua19kZXN0aW5hdGlvbiIgImNvZGVfc3Bh
biIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGVfZmVuY2VfY29udGVudCIgImlu
Zm9fc3RyaW5nIikpCiAgICAgICAgICAgICAgICAgICAgKGdldC10ZXh0LXByb3BlcnR5IHVyaS1z
dGFydCAnYnV0dG9uKSkKICAgICAgICAgIChtYXJrZG93bi10cy0tbWFrZS1saW5rLWJ1dHRvbgog
ICAgICAgICAgIHVyaS1zdGFydCB1cmktZW5kCiAgICAgICAgICAgKGlmIChlcSB1cmktc3RhcnQg
MCkKICAgICAgICAgICAgICAgdXJpCiAgICAgICAgICAgICAoY29uY2F0ICJtYWlsdG86IiB1cmkp
KSkpKSkpKQoKOzs7IHRyZWVzaXQgc2V0dGluZ3M6CgooZGVmdmFyIG1hcmtkb3duLXRzLS10cmVl
c2l0LXNldHRpbmdzCiAgKHRyZWVzaXQtZm9udC1sb2NrLXJ1bGVzCiAgIDpsYW5ndWFnZSAnbWFy
a2Rvd24KICAgOmZlYXR1cmUgJ2Vycm9yCiAgIDpvdmVycmlkZSB0CiAgICcoKEVSUk9SKSBAZm9u
dC1sb2NrLXdhcm5pbmctZmFjZSkKCiAgIDpsYW5ndWFnZSAnbWFya2Rvd24taW5saW5lCiAgIDpv
dmVycmlkZSB0CiAgIDpmZWF0dXJlICdkZWxpbWl0ZXIKICAgJygoaW5saW5lX2xpbmsgWyAiWyIg
Il0iICIoIiAiKSIgXSBAbWFya2Rvd24tdHMtLWZvbnRpZnktZGVsaW1pdGVyKQogICAgIChmdWxs
X3JlZmVyZW5jZV9saW5rIFsgIlsiICJdIiBdIEBtYXJrZG93bi10cy0tZm9udGlmeS1kZWxpbWl0
ZXIpCiAgICAgKGNvbGxhcHNlZF9yZWZlcmVuY2VfbGluayBbICJbIiAiXSIgXSBAbWFya2Rvd24t
dHMtLWZvbnRpZnktZGVsaW1pdGVyKQogICAgIChzaG9ydGN1dF9saW5rIFsgIlsiICJdIiBdIEBt
YXJrZG93bi10cy0tZm9udGlmeS1kZWxpbWl0ZXIpCiAgICAgKGltYWdlIFsgIiEiICJbIiAiXSIg
IigiICIpIiBdIEBtYXJrZG93bi10cy0tZm9udGlmeS1kZWxpbWl0ZXIpKQoKICAgOmxhbmd1YWdl
ICdtYXJrZG93bgogICA6ZmVhdHVyZSAnaGVhZGluZwogICAnKCgoYXR4X2hlYWRpbmcpICAgIEBt
YXJrZG93bi10cy0tZm9udGlmeS1hdHgtaGVhZGluZykKICAgICAoKHNldGV4dF9oZWFkaW5nKSBA
bWFya2Rvd24tdHMtLWZvbnRpZnktc2V0ZXh0LWhlYWRpbmcpKQoKICAgOmxhbmd1YWdlICdtYXJr
ZG93bgogICA6ZmVhdHVyZSAnaGVhZGluZwogICA6b3ZlcnJpZGUgJ3ByZXBlbmQKICAgJygoYXR4
X2gxX21hcmtlcikgQG1hcmtkb3duLXRzLS1mb250aWZ5LWF0eC1kZWxpbWl0ZXIKICAgICAoYXR4
X2gyX21hcmtlcikgQG1hcmtkb3duLXRzLS1mb250aWZ5LWF0eC1kZWxpbWl0ZXIKICAgICAoYXR4
X2gzX21hcmtlcikgQG1hcmtkb3duLXRzLS1mb250aWZ5LWF0eC1kZWxpbWl0ZXIKICAgICAoYXR4
X2g0X21hcmtlcikgQG1hcmtkb3duLXRzLS1mb250aWZ5LWF0eC1kZWxpbWl0ZXIKICAgICAoYXR4
X2g1X21hcmtlcikgQG1hcmtkb3duLXRzLS1mb250aWZ5LWF0eC1kZWxpbWl0ZXIKICAgICAoYXR4
X2g2X21hcmtlcikgQG1hcmtkb3duLXRzLS1mb250aWZ5LWF0eC1kZWxpbWl0ZXIKICAgICAoc2V0
ZXh0X2gxX3VuZGVybGluZSkgQG1hcmtkb3duLXRzLS1mb250aWZ5LWRlbGltaXRlcgogICAgIChz
ZXRleHRfaDJfdW5kZXJsaW5lKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktZGVsaW1pdGVyKQoKICAg
Omxhbmd1YWdlICdtYXJrZG93bgogICA6ZmVhdHVyZSAncGFyYWdyYXBoCiAgICcoKCh0aGVtYXRp
Y19icmVhaykgQG1hcmtkb3duLXRzLS1mb250aWZ5LXRoZW1hdGljLWJyZWFrKQogICAgICgoaHRt
bF9ibG9jaykgQG1hcmtkb3duLXRzLWh0bWwtYmxvY2spCiAgICAgKChpbmRlbnRlZF9jb2RlX2Js
b2NrKSBAbWFya2Rvd24tdHMtaW5kZW50ZWQtY29kZS1ibG9jaykKICAgICAobGlzdF9pdGVtIChs
aXN0X21hcmtlcl9zdGFyKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktdW5vcmRlcmVkLWxpc3QtbWFy
a2VyKQogICAgIChsaXN0X2l0ZW0gKGxpc3RfbWFya2VyX3BsdXMpIEBtYXJrZG93bi10cy0tZm9u
dGlmeS11bm9yZGVyZWQtbGlzdC1tYXJrZXIpCiAgICAgKGxpc3RfaXRlbSAobGlzdF9tYXJrZXJf
bWludXMpIEBtYXJrZG93bi10cy0tZm9udGlmeS11bm9yZGVyZWQtbGlzdC1tYXJrZXIpCiAgICAg
KGxpc3RfaXRlbSAobGlzdF9tYXJrZXJfZG90KSBAbWFya2Rvd24tdHMtbGlzdC1tYXJrZXIpCiAg
ICAgKGxpc3RfaXRlbSAobGlzdF9tYXJrZXJfcGFyZW50aGVzaXMpIEBtYXJrZG93bi10cy1saXN0
LW1hcmtlcikKICAgICAobGlzdF9pdGVtICh0YXNrX2xpc3RfbWFya2VyX3VuY2hlY2tlZCkgQG1h
cmtkb3duLXRzLS1mb250aWZ5LWNoZWNrYm94KQogICAgIChsaXN0X2l0ZW0gKHRhc2tfbGlzdF9t
YXJrZXJfY2hlY2tlZCkgQG1hcmtkb3duLXRzLS1mb250aWZ5LWNoZWNrYm94KQogICAgIChsaW5r
X3JlZmVyZW5jZV9kZWZpbml0aW9uCiAgICAgIChsaW5rX2xhYmVsKSBAbWFya2Rvd24tdHMtLWZv
bnRpZnktbGluay1yZWYtbGFiZWwpCiAgICAgKGxpbmtfcmVmZXJlbmNlX2RlZmluaXRpb24KICAg
ICAgKGxpbmtfZGVzdGluYXRpb24pIEBtYXJrZG93bi10cy0tZm9udGlmeS1saW5rLXJlZi1kZXN0
aW5hdGlvbikKICAgICAobGlua19yZWZlcmVuY2VfZGVmaW5pdGlvbgogICAgICAobGlua190aXRs
ZSkgQG1hcmtkb3duLXRzLWxpbmstZGVzdGluYXRpb24pKQoKICAgOmxhbmd1YWdlICdtYXJrZG93
bgogICA6ZmVhdHVyZSAncGFyYWdyYXBoCiAgIDpvdmVycmlkZSAncHJlcGVuZAogICAnKChwaXBl
X3RhYmxlX2hlYWRlciAifCIgQG1hcmtkb3duLXRzLXRhYmxlLWhlYWRlcikKICAgICAocGlwZV90
YWJsZV9oZWFkZXIgKHBpcGVfdGFibGVfY2VsbCkgQG1hcmtkb3duLXRzLXRhYmxlLWhlYWRlcikK
ICAgICAocGlwZV90YWJsZV9yb3cgInwiIEBtYXJrZG93bi10cy10YWJsZS1kZWxpbWl0ZXItY2Vs
bCkKICAgICAocGlwZV90YWJsZV9yb3cgKHBpcGVfdGFibGVfY2VsbCkgQG1hcmtkb3duLXRzLXRh
YmxlLWNlbGwpCiAgICAgKHBpcGVfdGFibGVfZGVsaW1pdGVyX3JvdyAifCIgQG1hcmtkb3duLXRz
LXRhYmxlLWRlbGltaXRlci1jZWxsKQogICAgICgocGlwZV90YWJsZSkgQG1hcmtkb3duLXRzLXRh
YmxlKQogICAgIChwaXBlX3RhYmxlX2RlbGltaXRlcl9yb3cgKHBpcGVfdGFibGVfZGVsaW1pdGVy
X2NlbGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbWFya2Rvd24tdHMtdGFibGUt
ZGVsaW1pdGVyLWNlbGwpKQoKICAgOmxhbmd1YWdlICdtYXJrZG93bgogICA6ZmVhdHVyZSAncGFy
YWdyYXBoCiAgIDpvdmVycmlkZSAncHJlcGVuZAogICAnKChibG9ja19xdW90ZSkgQG1hcmtkb3du
LXRzLWJsb2NrLXF1b3RlCiAgICAgKGJsb2NrX3F1b3RlX21hcmtlcikgQG1hcmtkb3duLXRzLS1m
b250aWZ5LWRlbGltaXRlcgogICAgIChmZW5jZWRfY29kZV9ibG9ja19kZWxpbWl0ZXIpIEBtYXJr
ZG93bi10cy0tZm9udGlmeS1kZWxpbWl0ZXIKICAgICAoZmVuY2VkX2NvZGVfYmxvY2sKICAgICAg
KGluZm9fc3RyaW5nIChsYW5ndWFnZSkgQG1hcmtkb3duLXRzLWxhbmd1YWdlLWtleXdvcmQpCiAg
ICAgIEBtYXJrZG93bi10cy0tZm9udGlmeS1kZWxpbWl0ZXIpCiAgICAgKGJsb2NrX3F1b3RlCiAg
ICAgIChibG9ja19xdW90ZV9tYXJrZXIpIEBtYXJrZG93bi10cy0tZm9udGlmeS1kZWxpbWl0ZXIK
ICAgICAgKHBhcmFncmFwaCAoaW5saW5lIChibG9ja19jb250aW51YXRpb24pIEBtYXJrZG93bi10
cy0tZm9udGlmeS1kZWxpbWl0ZXIpKSkpCgogICA6bGFuZ3VhZ2UgJ21hcmtkb3duCiAgIDpmZWF0
dXJlICdwYXJhZ3JhcGgKICAgOm92ZXJyaWRlICdhcHBlbmQKICAgJygoZmVuY2VkX2NvZGVfYmxv
Y2sKICAgICAgKGluZm9fc3RyaW5nIChsYW5ndWFnZSkpCiAgICAgIChjb2RlX2ZlbmNlX2NvbnRl
bnQpIEBtYXJrZG93bi10cy0tZm9udGlmeS1ub24tdHMtY29kZS1ibG9jaykpCgogICA6bGFuZ3Vh
Z2UgJ21hcmtkb3duCiAgIDpmZWF0dXJlICdwYXJhZ3JhcGgKICAgOm92ZXJyaWRlICdhcHBlbmQK
ICAgJygoZmVuY2VkX2NvZGVfYmxvY2sgKGNvZGVfZmVuY2VfY29udGVudCkgQG1hcmtkb3duLXRz
LS1mb250aWZ5LWNvZGUtYmxvY2spKQoKICAgOmxhbmd1YWdlICdtYXJrZG93bi1pbmxpbmUKICAg
Om92ZXJyaWRlICdwcmVwZW5kCiAgIDpmZWF0dXJlICdwYXJhZ3JhcGgtaW5saW5lCiAgICcoKChj
b2RlX3NwYW4pIEBtYXJrZG93bi10cy1jb2RlLXNwYW4pCiAgICAgKChjb2RlX3NwYW5fZGVsaW1p
dGVyKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktZGVsaW1pdGVyKSkKCiAgIDpsYW5ndWFnZSAnbWFy
a2Rvd24taW5saW5lCiAgIDpvdmVycmlkZSAnYXBwZW5kCiAgIDpmZWF0dXJlICdwYXJhZ3JhcGgt
aW5saW5lCiAgICcoKChsaW5rX2Rlc3RpbmF0aW9uKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktbGlu
ay1kZXN0aW5hdGlvbikKICAgICAoKGVtcGhhc2lzKSBAbWFya2Rvd24tdHMtZW1waGFzaXMpCiAg
ICAgKChzdHJvbmdfZW1waGFzaXMpIEBtYXJrZG93bi10cy1ib2xkKQogICAgICgoc3RyaWtldGhy
b3VnaCkgQG1hcmtkb3duLXRzLXN0cmlrZXRocm91Z2gpCiAgICAgKGlubGluZV9saW5rIChsaW5r
X3RleHQpIEBtYXJrZG93bi10cy0tZm9udGlmeS1saW5rLW5vZGUpCiAgICAgKGZ1bGxfcmVmZXJl
bmNlX2xpbmsgKGxpbmtfdGV4dCkgQG1hcmtkb3duLXRzLS1mb250aWZ5LWxpbmstbm9kZSkKICAg
ICAoZnVsbF9yZWZlcmVuY2VfbGluayAobGlua19sYWJlbCkgQG1hcmtkb3duLXRzLS1mb250aWZ5
LWxpbmstbm9kZSkKICAgICAoY29sbGFwc2VkX3JlZmVyZW5jZV9saW5rIChsaW5rX3RleHQpIEBt
YXJrZG93bi10cy0tZm9udGlmeS1saW5rLW5vZGUpCiAgICAgKHNob3J0Y3V0X2xpbmsgKGxpbmtf
dGV4dCkgQG1hcmtkb3duLXRzLS1mb250aWZ5LWxpbmstbm9kZSkKICAgICAoaW1hZ2UgKGltYWdl
X2Rlc2NyaXB0aW9uKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktbGluay1ub2RlKQogICAgICgodXJp
X2F1dG9saW5rKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktYXV0b2xpbmspCiAgICAgKChlbWFpbF9h
dXRvbGluaykgQG1hcmtkb3duLXRzLS1mb250aWZ5LWF1dG9saW5rKQogICAgIChpbmxpbmVfbGlu
ayAobGlua190aXRsZSkgQG1hcmtkb3duLXRzLWxpbmstZGVzdGluYXRpb24pCiAgICAgKChiYWNr
c2xhc2hfZXNjYXBlKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktYmFja3NsYXNoLWVzY2FwZSkKICAg
ICAoKGVudGl0eV9yZWZlcmVuY2UpIEBtYXJrZG93bi10cy0tZm9udGlmeS1lbnRpdHkpCiAgICAg
KChudW1lcmljX2NoYXJhY3Rlcl9yZWZlcmVuY2UpIEBtYXJrZG93bi10cy0tZm9udGlmeS1lbnRp
dHkpCiAgICAgKChodG1sX3RhZykgQG1hcmtkb3duLXRzLWh0bWwtdGFnKQogICAgICgoaGFyZF9s
aW5lX2JyZWFrKSBAbWFya2Rvd24tdHMtLWZvbnRpZnktaGFyZC1saW5lLWJyZWFrKQogICAgICgo
bGF0ZXhfYmxvY2spIEBtYXJrZG93bi10cy0tZm9udGlmeS1sYXRleC1ibG9jaykpCgogICA6bGFu
Z3VhZ2UgJ21hcmtkb3duLWlubGluZQogICA6ZmVhdHVyZSAncGFyYWdyYXBoLWlubGluZQogICA6
b3ZlcnJpZGUgJ2FwcGVuZAogICAnKChlbXBoYXNpc19kZWxpbWl0ZXIpIEBtYXJrZG93bi10cy0t
Zm9udGlmeS1kZWxpbWl0ZXIpCgogICA6bGFuZ3VhZ2UgJ21hcmtkb3duLWlubGluZQogICA6ZmVh
dHVyZSAnaW1hZ2UtcHJldmlldwogICA6b3ZlcnJpZGUgJ2FwcGVuZAogICAnKChpbWFnZSkgQG1h
cmtkb3duLXRzLS1mb250aWZ5LWltYWdlKSkpCgo7OzsgSW1lbnU6CgooZGVmdW4gbWFya2Rvd24t
dHMtLWltZW51LWhlYWRpbmctbm9kZS1wIChub2RlKQogICJDaGVjayBpZiBOT0RFIGlzIGEgdmFs
aWQgZW50cnkgdG8gaW1lbnUuIgogIChhbmQgKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBub2Rl
KSAiaW5saW5lIikKICAgICAgIChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUgKHRyZWVzaXQtbm9k
ZS1wYXJlbnQgbm9kZSkpCiAgICAgICAgICAgICAgImF0eF9oZWFkaW5nIikpKQoKKGRlZnVuIG1h
cmtkb3duLXRzLS1pbWVudS1oZWFkaW5nLW5hbWUtZnVuY3Rpb24gKG5vZGUpCiAgIlJldHVybiBh
biBpbWVudSBlbnRyeSBpZiBOT0RFIGlzIGEgdmFsaWQgaGVhZGVyLiIKICAobGV0ICgobmFtZSAo
dHJlZXNpdC1ub2RlLXRleHQgbm9kZSkpKQogICAgKGlmIChtYXJrZG93bi10cy0taW1lbnUtaGVh
ZGluZy1ub2RlLXAgbm9kZSkKICAgICAgICAoY2FyIChzcGxpdC1zdHJpbmcgKHRyZWVzaXQtbm9k
ZS10ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtcGFyZW50IG5v
ZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIgdCAiICIpKQogICAgICBuYW1lKSkp
CgooZGVmdW4gbWFya2Rvd24tdHMtLWltZW51LWNvZGUtYmxvY2stbm9kZS1wIChub2RlKQogICJD
aGVjayBpZiBOT0RFIGlzIGFuIGluZm9fc3RyaW5nIHdpdGggZGVzY3JpcHRpdmUgdGV4dCBhZnRl
ciB0aGUgbGFuZ3VhZ2UuIgogIChhbmQgKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBub2RlKSAi
aW5mb19zdHJpbmciKQogICAgICAgKHdoZW4tbGV0KiAoKGxhbmctbm9kZSAodHJlZXNpdC1zZWFy
Y2gtc3VidHJlZSBub2RlICJsYW5ndWFnZSIpKQogICAgICAgICAgICAgICAgICAgKCg8ICh0cmVl
c2l0LW5vZGUtZW5kIGxhbmctbm9kZSkKICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1u
b2RlLWVuZCBub2RlKSkpKQogICAgICAgICAobm90IChzdHJpbmctYmxhbmstcAogICAgICAgICAg
ICAgICAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAodHJl
ZXNpdC1ub2RlLWVuZCBsYW5nLW5vZGUpCiAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWVu
ZCBub2RlKSkpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1pbWVudS1jb2RlLWJsb2NrLW5hbWUt
ZnVuY3Rpb24gKG5vZGUpCiAgIlJldHVybiBhbiBpbWVudSBlbnRyeSBuYW1lIGZvciBhIGNvZGUg
YmxvY2sgaW5mb19zdHJpbmcgTk9ERS4KVXNlcyB0aGUgZGVzY3JpcHRpdmUgdGV4dCBhZnRlciB0
aGUgbGFuZ3VhZ2UgbmFtZS4iCiAgKHdoZW4tbGV0KiAoKGxhbmctbm9kZSAodHJlZXNpdC1zZWFy
Y2gtc3VidHJlZSBub2RlICJsYW5ndWFnZSIpKQogICAgICAgICAgICAgIChkZXNjIChzdHJpbmct
dHJpbQogICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVz
CiAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWVuZCBsYW5nLW5vZGUpCiAgICAg
ICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWVuZCBub2RlKSkpKSkKICAgIChmb3JtYXQg
IiVzOiAlcyIgKHRyZWVzaXQtbm9kZS10ZXh0IGxhbmctbm9kZSkgZGVzYykpKQoKKGRlZnVuIG1h
cmtkb3duLXRzLS1vdXRsaW5lLXByZWRpY2F0ZSAobm9kZSkKICAiTWF0Y2ggTk9ERSBpZiBpdCBp
cyBhIGhpZXJhcmNoaWNhbCBzZWN0aW9uIHRoYXQgaGFzIGEgaGVhZGluZy4iCiAgKGFuZCAoZXF1
YWwgKHRyZWVzaXQtbm9kZS10eXBlIG5vZGUpICJzZWN0aW9uIikKICAgICAgICh3aGVuLWxldCog
KChjaGlsZCAodHJlZXNpdC1ub2RlLWNoaWxkIG5vZGUgMCkpKQogICAgICAgICAoZXF1YWwgKHRy
ZWVzaXQtbm9kZS10eXBlIGNoaWxkKSAiYXR4X2hlYWRpbmciKSkpKQoKOzs7IEhlYWRpbmcgbWFu
aXB1bGF0aW9uOgoKKGRlZmNvbnN0IG1hcmtkb3duLXRzLS1wYXJzZXItaGVhZGluZy1tYXgtbGV2
ZWwgNgogICJNYXhpbXVtIEFUWCBoZWFkaW5nIGxldmVsIGluIE1hcmtkb3duIChoMS1oNikuCkRl
ZmluZWQgYnkgdGhlIENvbW1vbk1hcmsgc3BlYyBhbmQgdGhlIHRyZWUtc2l0dGVyIGdyYW1tYXIu
IikKCihkZWZ1biBtYXJrZG93bi10cy0taGVhZGluZy1hdC1wb2ludCAoKQogICJSZXR1cm4gdGhl
IGF0eF9oZWFkaW5nIG5vZGUgYXQgb3IgYmVmb3JlIHBvaW50LCBvciBuaWwuIgogICh3aGVuLWxl
dCogKChub2RlICh0cmVlc2l0LW5vZGUtYXQgKHBvaW50KSAnbWFya2Rvd24pKSkKICAgIChpZiAo
ZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlIG5vZGUpICJhdHhfaGVhZGluZyIpCiAgICAgICAgbm9k
ZQogICAgICAodHJlZXNpdC1wYXJlbnQtdW50aWwKICAgICAgIG5vZGUgKGxhbWJkYSAobikgKGVx
dWFsICh0cmVlc2l0LW5vZGUtdHlwZSBuKSAiYXR4X2hlYWRpbmciKSkpKSkpCgooZGVmdW4gbWFy
a2Rvd24tdHMtLWhlYWRpbmctbGV2ZWwgKGhlYWRpbmcpCiAgIlJldHVybiBIRUFESU5HIGxldmVs
IChyYW5nZSAxIHRvIGBtYXJrZG93bi10cy0tcGFyc2VyLWhlYWRpbmctbWF4LWxldmVsJykuIgog
IChsZXQgKChtYXJrZXIgKHRyZWVzaXQtbm9kZS1jaGlsZCBoZWFkaW5nIDApKSkKICAgIChsZW5n
dGggKHRyZWVzaXQtbm9kZS10ZXh0IG1hcmtlciB0KSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1z
ZWN0aW9uLWF0LXBvaW50ICgpCiAgIlJldHVybiB0aGUgc2VjdGlvbiBub2RlIGNvbnRhaW5pbmcg
cG9pbnQuIgogICh3aGVuLWxldCogKChub2RlICh0cmVlc2l0LW5vZGUtYXQgKHBvaW50KSAnbWFy
a2Rvd24pKSkKICAgICh0cmVlc2l0LXBhcmVudC11bnRpbAogICAgIG5vZGUgKGxhbWJkYSAobikg
KGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBuKSAic2VjdGlvbiIpKSkpKQoKKGRlZnVuIG1hcmtk
b3duLXRzLXByb21vdGUgKCkKICAiUHJvbW90ZSB0aGUgaGVhZGluZyBvciBsaXN0IGl0ZW0gYXQg
cG9pbnQuCkZvciBoZWFkaW5ncywgZGVjcmVhc2UgdGhlIGxldmVsIChlLmcuLCAjIyB0byAjKS4K
Rm9yIGxpc3QgaXRlbXMsIGRlY3JlYXNlIG5lc3RpbmcgKGRlZGVudCkuCldpdGggYHRyYW5zaWVu
dC1tYXJrLW1vZGUnIG9uIGFuZCBtYXJrIGFjdGl2ZSwgcHJvbW90ZSBhbGwKaGVhZGluZ3MgaW4g
dGhlIHJlZ2lvbi4iCiAgKGludGVyYWN0aXZlKQogIChjb25kCiAgICgoYW5kIHRyYW5zaWVudC1t
YXJrLW1vZGUgbWFyay1hY3RpdmUpCiAgICAobWFya2Rvd24tdHMtLXByb21vdGUtb3ItZGVtb3Rl
LXJlZ2lvbiAtMSkpCiAgICgobWFya2Rvd24tdHMtLWxpc3QtaXRlbS1hdC1wb2ludCkKICAgICht
YXJrZG93bi10cy0tbGlzdC1wcm9tb3RlLW9yLWRlbW90ZSBuaWwpKQogICAodCAobWFya2Rvd24t
dHMtLXByb21vdGUtb3ItZGVtb3RlIC0xKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLWRlbW90ZSAo
KQogICJEZW1vdGUgdGhlIGhlYWRpbmcgb3IgbGlzdCBpdGVtIGF0IHBvaW50LgpGb3IgaGVhZGlu
Z3MsIGluY3JlYXNlIHRoZSBsZXZlbCAoZS5nLiwgIyB0byAjIykuCkZvciBsaXN0IGl0ZW1zLCBp
bmNyZWFzZSBuZXN0aW5nIChpbmRlbnQpLgpXaXRoIGB0cmFuc2llbnQtbWFyay1tb2RlJyBvbiBh
bmQgbWFyayBhY3RpdmUsIGRlbW90ZSBhbGwgaGVhZGluZ3MKaW4gdGhlIHJlZ2lvbi4iCiAgKGlu
dGVyYWN0aXZlKQogIChjb25kCiAgICgoYW5kIHRyYW5zaWVudC1tYXJrLW1vZGUgbWFyay1hY3Rp
dmUpCiAgICAobWFya2Rvd24tdHMtLXByb21vdGUtb3ItZGVtb3RlLXJlZ2lvbiAxKSkKICAgKCht
YXJrZG93bi10cy0tbGlzdC1pdGVtLWF0LXBvaW50KQogICAgKG1hcmtkb3duLXRzLS1saXN0LXBy
b21vdGUtb3ItZGVtb3RlIHQpKQogICAodCAobWFya2Rvd24tdHMtLXByb21vdGUtb3ItZGVtb3Rl
IDEpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLXByb21vdGUtb3ItZGVtb3RlIChkZWx0YSkKICAi
Q2hhbmdlIHRoZSBoZWFkaW5nIGF0IHBvaW50IGJ5IERFTFRBIGxldmVscy4KTmVnYXRpdmUgREVM
VEEgcHJvbW90ZXMgKGZld2VyICMpLCBwb3NpdGl2ZSBkZW1vdGVzIChtb3JlICMpLgpJZiB0aGUg
aGVhZGluZyBoYXMgYW4gb3B0aW9uYWwgdHJhaWxpbmcgY2xvc2luZy1gIycgc2VxdWVuY2UsIHRo
YXQKc2VxdWVuY2UgaXMgcmVzaXplZCB0byBtYXRjaCB0aGUgbmV3IGxldmVsLiIKICAod2hlbi1s
ZXQqICgoaGVhZGluZyAobWFya2Rvd24tdHMtLWhlYWRpbmctYXQtcG9pbnQpKQogICAgICAgICAg
ICAgIChtYXJrZXIgKHRyZWVzaXQtbm9kZS1jaGlsZCBoZWFkaW5nIDApKQogICAgICAgICAgICAg
IChsZXZlbCAobGVuZ3RoICh0cmVlc2l0LW5vZGUtdGV4dCBtYXJrZXIgdCkpKQogICAgICAgICAg
ICAgIChuZXctbGV2ZWwgKCsgbGV2ZWwgZGVsdGEpKSkKICAgICh3aGVuIChhbmQgKD49IG5ldy1s
ZXZlbCAxKQogICAgICAgICAgICAgICAoPD0gbmV3LWxldmVsIG1hcmtkb3duLXRzLS1wYXJzZXIt
aGVhZGluZy1tYXgtbGV2ZWwpKQogICAgICAobGV0KiAoKG9wZW5lci1iZWcgKHRyZWVzaXQtbm9k
ZS1zdGFydCBtYXJrZXIpKQogICAgICAgICAgICAgKG9wZW5lci1lbmQgKHRyZWVzaXQtbm9kZS1l
bmQgbWFya2VyKSkKICAgICAgICAgICAgIChsaW5lLWVuZCAoc2F2ZS1leGN1cnNpb24KICAgICAg
ICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgb3BlbmVyLWVuZCkKICAgICAgICAgICAgICAg
ICAgICAgICAgIChsaW5lLWVuZC1wb3NpdGlvbikpKQogICAgICAgICAgICAgOzsgRGV0ZWN0IGEg
Q29tbW9uTWFyayBjbG9zaW5nLWAjJyBzZXF1ZW5jZTogb3B0aW9uYWwKICAgICAgICAgICAgIDs7
IHRyYWlsaW5nIHdoaXRlc3BhY2UsIGEgcnVuIG9mIGAjJywgYW5kIGF0IGxlYXN0IG9uZQogICAg
ICAgICAgICAgOzsgc3BhY2UvdGFiIGJldHdlZW4gaXQgYW5kIHRoZSBoZWFkaW5nIHRleHQuCiAg
ICAgICAgICAgICAoY2xvc2VyIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICAg
IChnb3RvLWNoYXIgbGluZS1lbmQpCiAgICAgICAgICAgICAgICAgICAgICAgKHNraXAtY2hhcnMt
YmFja3dhcmQgIiBcdCIgb3BlbmVyLWVuZCkKICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgo
ZW5kIChwb2ludCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgKHNraXAtY2hhcnMtYmFja3dh
cmQgIiMiIG9wZW5lci1lbmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgoYmVnIChw
b2ludCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbiAoYW5kICg8IGJlZyBlbmQp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD4gYmVnIG9wZW5lci1lbmQp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbXEgKGNoYXItYmVmb3Jl
IGJlZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKD9ccyA/
XHQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucyBiZWcgZW5kKSkpKSkpKQog
ICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgOzsgUmVzaXplIHRoZSBjbG9zZXIgZmly
c3Qgc28gaXQgZG9lc24ndCBzaGlmdCB0aGUgb3BlbmVyLgogICAgICAgICAgKHdoZW4gY2xvc2Vy
CiAgICAgICAgICAgIChkZWxldGUtcmVnaW9uIChjYXIgY2xvc2VyKSAoY2RyIGNsb3NlcikpCiAg
ICAgICAgICAgIChnb3RvLWNoYXIgKGNhciBjbG9zZXIpKQogICAgICAgICAgICAoaW5zZXJ0ICht
YWtlLXN0cmluZyBuZXctbGV2ZWwgPyMpKSkKICAgICAgICAgIChkZWxldGUtcmVnaW9uIG9wZW5l
ci1iZWcgb3BlbmVyLWVuZCkKICAgICAgICAgIChnb3RvLWNoYXIgb3BlbmVyLWJlZykKICAgICAg
ICAgIChpbnNlcnQgKG1ha2Utc3RyaW5nIG5ldy1sZXZlbCA/IykpKSkpKSkKCihkZWZ1biBtYXJr
ZG93bi10cy0tcHJvbW90ZS1vci1kZW1vdGUtcmVnaW9uIChkZWx0YSkKICAiQ2hhbmdlIGFsbCBo
ZWFkaW5ncyBpbiB0aGUgYWN0aXZlIHJlZ2lvbiBieSBERUxUQSBsZXZlbHMuCk5lZ2F0aXZlIERF
TFRBIHByb21vdGVzIChmZXdlciAjKSwgcG9zaXRpdmUgZGVtb3RlcyAobW9yZSAjKS4iCiAgKGxl
dCAoKGJlZyAocmVnaW9uLWJlZ2lubmluZykpCiAgICAgICAgKGVuZCAocmVnaW9uLWVuZCkpKQog
ICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgIChnb3RvLWNoYXIgYmVnKQogICAgICAod2hpbGUgKDwg
KHBvaW50KSBlbmQpCiAgICAgICAgKHdoZW4gKG1hcmtkb3duLXRzLS1oZWFkaW5nLWF0LXBvaW50
KQogICAgICAgICAgKG1hcmtkb3duLXRzLS1wcm9tb3RlLW9yLWRlbW90ZSBkZWx0YSkpCiAgICAg
ICAgKGZvcndhcmQtbGluZSAxKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy1tb3ZlLXN1YnRyZWUt
dXAgKCkKICAiTW92ZSB0aGUgY3VycmVudCBzZWN0aW9uIG9yIGxpc3QgaXRlbSB1cCBwYXN0IHRo
ZSBwcmV2aW91cyBzaWJsaW5nLiIKICAoaW50ZXJhY3RpdmUpCiAgKGlmIChtYXJrZG93bi10cy0t
bGlzdC1pdGVtLWF0LXBvaW50KQogICAgICAobWFya2Rvd24tdHMtLWxpc3QtbW92ZSB0KQogICAg
KG1hcmtkb3duLXRzLS1tb3ZlLXN1YnRyZWUtdXAtb3ItZG93biB0KSkpCgooZGVmdW4gbWFya2Rv
d24tdHMtbW92ZS1zdWJ0cmVlLWRvd24gKCkKICAiTW92ZSB0aGUgY3VycmVudCBzZWN0aW9uIG9y
IGxpc3QgaXRlbSBkb3duIHBhc3QgdGhlIG5leHQgc2libGluZy4iCiAgKGludGVyYWN0aXZlKQog
IChpZiAobWFya2Rvd24tdHMtLWxpc3QtaXRlbS1hdC1wb2ludCkKICAgICAgKG1hcmtkb3duLXRz
LS1saXN0LW1vdmUgbmlsKQogICAgKG1hcmtkb3duLXRzLS1tb3ZlLXN1YnRyZWUtdXAtb3ItZG93
biBuaWwpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tc2VjdGlvbi1mb2xkZWQtcCAoc2VjdGlvbikK
ICAiUmV0dXJuIG5vbi1uaWwgaWYgU0VDVElPTidzIGhlYWRpbmcgaXMgZm9sZGVkLgpDaGVja3Mg
d2hldGhlciB0aGUgZW5kIG9mIHRoZSBoZWFkaW5nIGxpbmUgaGFzIGFuIG91dGxpbmUKaW52aXNp
YmxlIG92ZXJsYXkuIgogIChsZXQgKChoZWFkaW5nICh0cmVlc2l0LW5vZGUtY2hpbGQgc2VjdGlv
biAwKSkpCiAgICAod2hlbiAoYW5kIGhlYWRpbmcKICAgICAgICAgICAgICAgKGVxdWFsICh0cmVl
c2l0LW5vZGUtdHlwZSBoZWFkaW5nKSAiYXR4X2hlYWRpbmciKSkKICAgICAgKHNhdmUtZXhjdXJz
aW9uCiAgICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IGhlYWRpbmcpKQogICAg
ICAgIChvdXRsaW5lLWludmlzaWJsZS1wIChwb3MtZW9sKSkpKSkpCgooZGVmdW4gbWFya2Rvd24t
dHMtLW1vdmUtc3VidHJlZS11cC1vci1kb3duICh1cCkKICAiTW92ZSB0aGUgY3VycmVudCBzZWN0
aW9uIHN1YnRyZWUuCklmIFVQIGlzIG5vbi1uaWwsIG1vdmUgcGFzdCB0aGUgcHJldmlvdXMgc2li
bGluZzsgb3RoZXJ3aXNlIG1vdmUgZG93bi4KUHJlc2VydmVzIHRoZSBmb2xkaW5nIHN0YXRlIG9m
IGJvdGggc2VjdGlvbnMuIgogICh3aGVuLWxldCogKChzZWN0aW9uIChtYXJrZG93bi10cy0tc2Vj
dGlvbi1hdC1wb2ludCkpCiAgICAgICAgICAgICAgKHNpYmxpbmcgKGlmIHVwCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtcHJldi1zaWJsaW5nIHNlY3Rpb24pCiAgICAg
ICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLW5leHQtc2libGluZyBzZWN0aW9uKSkp
KQogICAgKHdoZW4gKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBzaWJsaW5nKSAic2VjdGlvbiIp
CiAgICAgIChsZXQqICgoZmlyc3QgKGlmIHVwIHNpYmxpbmcgc2VjdGlvbikpCiAgICAgICAgICAg
ICAoc2Vjb25kIChpZiB1cCBzZWN0aW9uIHNpYmxpbmcpKQogICAgICAgICAgICAgKGZpcnN0LWZv
bGRlZCAobWFya2Rvd24tdHMtLXNlY3Rpb24tZm9sZGVkLXAgZmlyc3QpKQogICAgICAgICAgICAg
KHNlY29uZC1mb2xkZWQgKG1hcmtkb3duLXRzLS1zZWN0aW9uLWZvbGRlZC1wIHNlY29uZCkpCiAg
ICAgICAgICAgICAoZmlyc3Qtc3RhcnQgKHRyZWVzaXQtbm9kZS1zdGFydCBmaXJzdCkpCiAgICAg
ICAgICAgICAoc2Vjb25kLXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQgc2Vjb25kKSkKICAgICAg
ICAgICAgIChzZWNvbmQtZW5kICh0cmVlc2l0LW5vZGUtZW5kIHNlY29uZCkpCiAgICAgICAgICAg
ICA7OyBFeHRyYWN0IHNlcGFyYXRvciBiZXR3ZWVuIGl0ZW1zIGFuZCB0cmFpbGluZyB3aGl0ZXNw
YWNlLgogICAgICAgICAgICAgKGZpcnN0LXJhdyAoYnVmZmVyLXN1YnN0cmluZyBmaXJzdC1zdGFy
dCBzZWNvbmQtc3RhcnQpKQogICAgICAgICAgICAgKGZpcnN0LXRleHQgKHN0cmluZy10cmltLXJp
Z2h0IGZpcnN0LXJhdykpCiAgICAgICAgICAgICAoc2VwYXJhdG9yIChzdWJzdHJpbmcgZmlyc3Qt
cmF3IChsZW5ndGggZmlyc3QtdGV4dCkpKQogICAgICAgICAgICAgKHNlY29uZC1yYXcgKGJ1ZmZl
ci1zdWJzdHJpbmcgc2Vjb25kLXN0YXJ0IHNlY29uZC1lbmQpKQogICAgICAgICAgICAgKHNlY29u
ZC10ZXh0IChzdHJpbmctdHJpbS1yaWdodCBzZWNvbmQtcmF3KSkKICAgICAgICAgICAgICh0cmFp
bGluZyAoc3Vic3RyaW5nIHNlY29uZC1yYXcgKGxlbmd0aCBzZWNvbmQtdGV4dCkpKQogICAgICAg
ICAgICAgKGxpbmUtb2Zmc2V0ICgtIChsaW5lLW51bWJlci1hdC1wb3MgKHBvaW50KSkKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAobGluZS1udW1iZXItYXQtcG9zICh0cmVlc2l0LW5vZGUt
c3RhcnQgc2VjdGlvbikpKSkpCiAgICAgICAgKGRlbGV0ZS1yZWdpb24gZmlyc3Qtc3RhcnQgc2Vj
b25kLWVuZCkKICAgICAgICAoZ290by1jaGFyIGZpcnN0LXN0YXJ0KQogICAgICAgIChpbnNlcnQg
c2Vjb25kLXRleHQgc2VwYXJhdG9yIGZpcnN0LXRleHQgdHJhaWxpbmcpCiAgICAgICAgOzsgUmVz
dG9yZSBmb2xkaW5nIHN0YXRlCiAgICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAoZ290
by1jaGFyIGZpcnN0LXN0YXJ0KQogICAgICAgICAgKHdoZW4gKG91dGxpbmUtb24taGVhZGluZy1w
KQogICAgICAgICAgICAoaWYgc2Vjb25kLWZvbGRlZAogICAgICAgICAgICAgICAgKG91dGxpbmUt
aGlkZS1zdWJ0cmVlKQogICAgICAgICAgICAgIChvdXRsaW5lLXNob3ctc3VidHJlZSkpKQogICAg
ICAgICAgKG91dGxpbmUtbmV4dC1oZWFkaW5nKQogICAgICAgICAgKHdoZW4gKG91dGxpbmUtb24t
aGVhZGluZy1wKQogICAgICAgICAgICAoaWYgZmlyc3QtZm9sZGVkCiAgICAgICAgICAgICAgICAo
b3V0bGluZS1oaWRlLXN1YnRyZWUpCiAgICAgICAgICAgICAgKG91dGxpbmUtc2hvdy1zdWJ0cmVl
KSkpKQogICAgICAgIChnb3RvLWNoYXIgKGlmIHVwCiAgICAgICAgICAgICAgICAgICAgICAgZmly
c3Qtc3RhcnQKICAgICAgICAgICAgICAgICAgICAgKCsgZmlyc3Qtc3RhcnQgKGxlbmd0aCBzZWNv
bmQtdGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCBzZXBhcmF0b3IpKSkpCiAg
ICAgICAgKHdpdGgtc3VwcHJlc3NlZC13YXJuaW5ncyAoKGludGVyYWN0aXZlLW9ubHkgbmV4dC1s
aW5lKSkKICAgICAgICAgIChuZXh0LWxpbmUgbGluZS1vZmZzZXQpKSkpKSkKCjs7OyBMaXN0IG1h
bmlwdWxhdGlvbjoKCihkZWZ1biBtYXJrZG93bi10cy10b2dnbGUtY2hlY2tib3ggKCkKICAiVG9n
Z2xlIHRoZSB0YXNrIGxpc3QgY2hlY2tib3ggb24gdGhlIGN1cnJlbnQgbGluZS4KU3dpdGNoZXMg
YmV0d2VlbiBgWyBdJyBhbmQgYFt4XScuIgogIChpbnRlcmFjdGl2ZSkKICAod2hlbi1sZXQqICgo
cG9zIChzYXZlLWV4Y3Vyc2lvbiAoYmFjay10by1pbmRlbnRhdGlvbikgKHBvaW50KSkpCiAgICAg
ICAgICAgICAgKG5vZGUgKHRyZWVzaXQtbm9kZS1hdCBwb3MgJ21hcmtkb3duKSkKICAgICAgICAg
ICAgICAoaXRlbSAodHJlZXNpdC1wYXJlbnQtdW50aWwKICAgICAgICAgICAgICAgICAgICAgbm9k
ZSAobGFtYmRhIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxdWFsICh0cmVlc2l0
LW5vZGUtdHlwZSBuKSAibGlzdF9pdGVtIikpKSkpCiAgICAod2hlbi1sZXQqICgobWFya2VyIChz
ZXEtZmluZAogICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoY2hpbGQpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChtZW1iZXIgKHRyZWVzaXQtbm9kZS10eXBlIGNoaWxkKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoInRhc2tfbGlzdF9tYXJrZXJfY2hlY2tl
ZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXNrX2xpc3RfbWFya2Vy
X3VuY2hlY2tlZCIpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtY2hp
bGRyZW4gaXRlbSkpKSkKICAgICAgKGxldCAoKGJlZyAodHJlZXNpdC1ub2RlLXN0YXJ0IG1hcmtl
cikpCiAgICAgICAgICAgIChlbmQgKHRyZWVzaXQtbm9kZS1lbmQgbWFya2VyKSkKICAgICAgICAg
ICAgKGNoZWNrZWQgKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBtYXJrZXIpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAidGFza19saXN0X21hcmtlcl9jaGVja2VkIikpKQogICAgICAgIChz
YXZlLWV4Y3Vyc2lvbgogICAgICAgICAgKGdvdG8tY2hhciBiZWcpCiAgICAgICAgICAoZGVsZXRl
LXJlZ2lvbiBiZWcgZW5kKQogICAgICAgICAgKGluc2VydCAoaWYgY2hlY2tlZCAiWyBdIiAiW3hd
IikpKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tbGlzdC1pdGVtLWF0LXBvaW50ICgpCiAgIlJl
dHVybiB0aGUgaW5uZXJtb3N0IGxpc3RfaXRlbSBub2RlIGNvbnRhaW5pbmcgcG9pbnQsIG9yIG5p
bC4KVXNlcyB0aGUgcG9zaXRpb24gYWZ0ZXIgYGJhY2stdG8taW5kZW50YXRpb24nIHNvIHRoYXQg
cG9pbnQgaW4KYSBsaW5lJ3MgbGVhZGluZyB3aGl0ZXNwYWNlIHJlc29sdmVzIHRvIHRoZSBpdGVt
IG9uIHRoYXQgbGluZSwKbm90IHRvIGEgcHJlY2VkaW5nIGl0ZW0gd2hvc2Ugbm9kZSBzcGFucyB0
aGUgd2hpdGVzcGFjZS4KSW5zaWRlIGJsb2NrIHF1b3RlcywgYWxzbyB0cnkgZnJvbSB0aGUgY29u
dGVudCBwb3NpdGlvbiBwYXN0CnRoZSBgPicgbWFya2Vycy4iCiAgKHdoZW4tbGV0KiAoKHBvcyAo
c2F2ZS1leGN1cnNpb24gKGJhY2stdG8taW5kZW50YXRpb24pIChwb2ludCkpKQogICAgICAgICAg
ICAgIChub2RlICh0cmVlc2l0LW5vZGUtYXQgcG9zICdtYXJrZG93bikpCiAgICAgICAgICAgICAg
KGJvbCAobGluZS1iZWdpbm5pbmctcG9zaXRpb24pKQogICAgICAgICAgICAgIChlb2wgKGxpbmUt
ZW5kLXBvc2l0aW9uKSkpCiAgICAob3IgKGxldCAoKGl0ZW0gKHRyZWVzaXQtcGFyZW50LXVudGls
CiAgICAgICAgICAgICAgICAgICAgIG5vZGUgKGxhbWJkYSAobikKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUgbikgImxpc3RfaXRlbSIpKSkpKQog
ICAgICAgICAgOzsgVmVyaWZ5IHRoZSBjdXJyZW50IGxpbmUgaXMgd2l0aGluIHRoZSBpdGVtJ3Mg
cmFuZ2UuCiAgICAgICAgICA7OyBgdHJlZXNpdC1ub2RlLWF0JyBjYW4gcmV0dXJuIGEgbm9kZSBp
bnNpZGUgYSBsaXN0X2l0ZW0KICAgICAgICAgIDs7IGV2ZW4gd2hlbiBwb2ludCBpcyBvbiBhIHBy
ZWNlZGluZyBsaW5lLgogICAgICAgICAgKHdoZW4gKGFuZCBpdGVtCiAgICAgICAgICAgICAgICAg
ICAgICg8PSAodHJlZXNpdC1ub2RlLXN0YXJ0IGl0ZW0pIGVvbCkKICAgICAgICAgICAgICAgICAg
ICAgKD49ICh0cmVlc2l0LW5vZGUtZW5kIGl0ZW0pIGJvbCkpCiAgICAgICAgICAgIGl0ZW0pKQog
ICAgICAgIDs7IFdoZW4gYmFjay10by1pbmRlbnRhdGlvbiBsYW5kcyBvbiBibG9jayBxdW90ZSBt
YXJrZXJzLAogICAgICAgIDs7IHNraXAgcGFzdCB0aGVtIGFuZCB0cnkgZnJvbSB0aGUgY29udGVu
dCBwb3NpdGlvbi4KICAgICAgICAobGV0ICgoY29udGVudC1wb3MgKHNhdmUtZXhjdXJzaW9uCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJlZ2lubmluZy1vZi1saW5lKQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChza2lwLWNoYXJzLWZvcndhcmQgIj4gXHQiKQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChwb2ludCkpKSkKICAgICAgICAgICh3aGVuICg+IGNvbnRlbnQt
cG9zIHBvcykKICAgICAgICAgICAgKHdoZW4tbGV0KiAoKGNub2RlICh0cmVlc2l0LW5vZGUtYXQg
Y29udGVudC1wb3MgJ21hcmtkb3duKSkpCiAgICAgICAgICAgICAgKGxldCAoKGl0ZW0gKHRyZWVz
aXQtcGFyZW50LXVudGlsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNub2RlCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBuKSAibGlzdF9pdGVtIikpKSkpCiAgICAgICAg
ICAgICAgICAod2hlbiAoYW5kIGl0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKDw9ICh0
cmVlc2l0LW5vZGUtc3RhcnQgaXRlbSkgZW9sKQogICAgICAgICAgICAgICAgICAgICAgICAgICAo
Pj0gKHRyZWVzaXQtbm9kZS1lbmQgaXRlbSkgYm9sKSkKICAgICAgICAgICAgICAgICAgaXRlbSkp
KSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWxpc3QtbWFya2VyLXdpZHRoIChpdGVtKQogICJS
ZXR1cm4gdGhlIHdpZHRoIG9mIElURU0ncyBsaXN0IG1hcmtlciBpbmNsdWRpbmcgdHJhaWxpbmcg
c3BhY2UuIgogIChsZXQgKChtYXJrZXIgKHRyZWVzaXQtbm9kZS1jaGlsZCBpdGVtIDApKSkKICAg
ICgtICh0cmVlc2l0LW5vZGUtZW5kIG1hcmtlcikgKHRyZWVzaXQtbm9kZS1zdGFydCBtYXJrZXIp
KSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWxpc3QtaXRlbS1yZWdpb24gKGl0ZW0pCiAgIlJldHVy
biB0aGUgKEJFRyAuIEVORCkgcmVnaW9uIGZvciBJVEVNLCBjbGFtcGVkIHRvIGZ1bGwgbGluZXMu
CkJFRyBzdGFydHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBjb250YWluaW5nIHRoZSBp
dGVtLgpFTkQgaXMgY2xhbXBlZCBzbyBpdCBkb2VzIG5vdCBleHRlbmQgaW50byB0aGUgbmV4dCBs
aW5lJ3MKaW5kZW50YXRpb24sIHdoaWNoIHRyZWUtc2l0dGVyIG1heSBpbmNsdWRlIGluIHRoZSBu
b2RlLiIKICAobGV0ICgoYmVnIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAoZ290by1j
aGFyICh0cmVlc2l0LW5vZGUtc3RhcnQgaXRlbSkpCiAgICAgICAgICAgICAgIChsaW5lLWJlZ2lu
bmluZy1wb3NpdGlvbikpKQogICAgICAgIChlbmQgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAg
ICAgIChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1lbmQgaXRlbSkpCiAgICAgICAgICAgICAgIChp
ZiAoYm9scCkgKHBvaW50KSAobGluZS1iZWdpbm5pbmctcG9zaXRpb24pKSkpKQogICAgKGNvbnMg
YmVnIGVuZCkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1saXN0LW9yZGVyZWQtaXRlbS1wIChpdGVt
KQogICJSZXR1cm4gbm9uLW5pbCBpZiBJVEVNIGlzIGFuIG9yZGVyZWQgKG51bWJlcmVkKSBsaXN0
IGl0ZW0uIgogIChsZXQgKChtYXJrZXIgKHRyZWVzaXQtbm9kZS1jaGlsZCBpdGVtIDApKSkKICAg
IChtZW1iZXIgKHRyZWVzaXQtbm9kZS10eXBlIG1hcmtlcikKICAgICAgICAgICAgJygibGlzdF9t
YXJrZXJfZG90IiAibGlzdF9tYXJrZXJfcGFyZW50aGVzaXMiKSkpKQoKKGRlZnVuIG1hcmtkb3du
LXRzLS1saXN0LXByb21vdGUtb3ItZGVtb3RlIChkZW1vdGUpCiAgIkNoYW5nZSBuZXN0aW5nIG9m
IHRoZSBsaXN0IGl0ZW0gYXQgcG9pbnQuCklmIERFTU9URSBpcyBub24tbmlsLCBkZW1vdGUgKGlu
ZGVudCk7IG90aGVyd2lzZSBwcm9tb3RlIChkZWRlbnQpLgpPcmRlcmVkIChudW1iZXJlZCkgbGlz
dCBpdGVtcyBhcmUgc2tpcHBlZCBiZWNhdXNlIHRoZSBncmFtbWFyIGRvZXMKbm90IHN1cHBvcnQg
bmVzdGluZyB0aGVtIGJ5IGluZGVudGF0aW9uLiIKICAod2hlbi1sZXQqICgoaXRlbSAobWFya2Rv
d24tdHMtLWxpc3QtaXRlbS1hdC1wb2ludCkpCiAgICAgICAgICAgICAgKHJlZ2lvbiAobWFya2Rv
d24tdHMtLWxpc3QtaXRlbS1yZWdpb24gaXRlbSkpCiAgICAgICAgICAgICAgKGJlZyAoY2FyIHJl
Z2lvbikpCiAgICAgICAgICAgICAgKGVuZCAoY2RyIHJlZ2lvbikpKQogICAgKHdoZW4gKG1hcmtk
b3duLXRzLS1saXN0LW9yZGVyZWQtaXRlbS1wIGl0ZW0pCiAgICAgICh1c2VyLWVycm9yICJPcmRl
cmVkIGxpc3QgaXRlbXMgY2Fubm90IGJlIG5lc3RlZCAoZ3JhbW1hciBsaW1pdGF0aW9uKSIpKQog
ICAgKGlmIGRlbW90ZQogICAgICAgIDs7IERlbW90ZTogaW5kZW50IGJ5IG1hcmtlciB3aWR0aCwg
b25seSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzCiAgICAgICAgOzsgc2libGluZyB0byBuZXN0IHVu
ZGVyIChsaWtlIG9yZy1tb2RlKS4KICAgICAgICAod2hlbiAodHJlZXNpdC1ub2RlLXByZXYtc2li
bGluZyBpdGVtKQogICAgICAgICAgKGluZGVudC1yaWdpZGx5IGJlZyBlbmQgKG1hcmtkb3duLXRz
LS1saXN0LW1hcmtlci13aWR0aCBpdGVtKSkpCiAgICAgIDs7IFByb21vdGU6IGRlZGVudCB0byBn
cmFuZHBhcmVudCBsZXZlbC4KICAgICAgKGxldCogKChwYXJlbnQtbGlzdCAodHJlZXNpdC1ub2Rl
LXBhcmVudCBpdGVtKSkKICAgICAgICAgICAgIChncmFuZHBhcmVudCAoYW5kIHBhcmVudC1saXN0
ICh0cmVlc2l0LW5vZGUtcGFyZW50IHBhcmVudC1saXN0KSkpCiAgICAgICAgICAgICAoaXRlbS1j
b2wgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIGJl
ZykgKGN1cnJlbnQtaW5kZW50YXRpb24pKSkpCiAgICAgICAgKHdoZW4gKGFuZCBncmFuZHBhcmVu
dAogICAgICAgICAgICAgICAgICAgKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBncmFuZHBhcmVu
dCkgImxpc3RfaXRlbSIpCiAgICAgICAgICAgICAgICAgICAoPiBpdGVtLWNvbCAwKSkKICAgICAg
ICAgIChsZXQgKChncC1jb2wgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IGdyYW5kcGFyZW50KSkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAoY3VycmVudC1pbmRlbnRhdGlvbikpKSkKICAgICAgICAgICAgKGlu
ZGVudC1yaWdpZGx5IGJlZyBlbmQgKC0gZ3AtY29sIGl0ZW0tY29sKSkpKSkpKSkKCihkZWZ1biBt
YXJrZG93bi10cy0tbGlzdC1ub2RlLWJvbCAobm9kZSkKICAiUmV0dXJuIHRoZSBiZWdpbm5pbmcg
b2YgdGhlIGxpbmUgY29udGFpbmluZyBOT0RFJ3Mgc3RhcnQuIgogIChzYXZlLWV4Y3Vyc2lvbgog
ICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQogICAgKGxpbmUtYmVnaW5u
aW5nLXBvc2l0aW9uKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWxpc3QtbW92ZSAodXApCiAgIk1v
dmUgdGhlIGxpc3QgaXRlbSBhdCBwb2ludC4KSWYgVVAgaXMgbm9uLW5pbCwgbW92ZSBwYXN0IHRo
ZSBwcmV2aW91cyBzaWJsaW5nOyBvdGhlcndpc2UgbW92ZSBkb3duLiIKICAod2hlbi1sZXQqICgo
aXRlbSAobWFya2Rvd24tdHMtLWxpc3QtaXRlbS1hdC1wb2ludCkpCiAgICAgICAgICAgICAgKHNp
YmxpbmcgKGlmIHVwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtcHJl
di1zaWJsaW5nIGl0ZW0pCiAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLW5l
eHQtc2libGluZyBpdGVtKSkpKQogICAgKHdoZW4gKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBz
aWJsaW5nKSAibGlzdF9pdGVtIikKICAgICAgKGxldCogKChmaXJzdCAoaWYgdXAgc2libGluZyBp
dGVtKSkKICAgICAgICAgICAgIChzZWNvbmQgKGlmIHVwIGl0ZW0gc2libGluZykpCiAgICAgICAg
ICAgICAoZmlyc3Qtc3RhcnQgKG1hcmtkb3duLXRzLS1saXN0LW5vZGUtYm9sIGZpcnN0KSkKICAg
ICAgICAgICAgIChzZWNvbmQtc3RhcnQgKG1hcmtkb3duLXRzLS1saXN0LW5vZGUtYm9sIHNlY29u
ZCkpCiAgICAgICAgICAgICAoc2Vjb25kLWVuZCAodHJlZXNpdC1ub2RlLWVuZCBzZWNvbmQpKQog
ICAgICAgICAgICAgOzsgRXh0cmFjdCBzZXBhcmF0b3IgYmV0d2VlbiBpdGVtcyBhbmQgdHJhaWxp
bmcgd2hpdGVzcGFjZS4KICAgICAgICAgICAgIChmaXJzdC1yYXcgKGJ1ZmZlci1zdWJzdHJpbmcg
Zmlyc3Qtc3RhcnQgc2Vjb25kLXN0YXJ0KSkKICAgICAgICAgICAgIChmaXJzdC10ZXh0IChzdHJp
bmctdHJpbS1yaWdodCBmaXJzdC1yYXcpKQogICAgICAgICAgICAgKHNlcGFyYXRvciAoc3Vic3Ry
aW5nIGZpcnN0LXJhdyAobGVuZ3RoIGZpcnN0LXRleHQpKSkKICAgICAgICAgICAgIChzZWNvbmQt
cmF3IChidWZmZXItc3Vic3RyaW5nIHNlY29uZC1zdGFydCBzZWNvbmQtZW5kKSkKICAgICAgICAg
ICAgIChzZWNvbmQtdGV4dCAoc3RyaW5nLXRyaW0tcmlnaHQgc2Vjb25kLXJhdykpCiAgICAgICAg
ICAgICAodHJhaWxpbmcgKHN1YnN0cmluZyBzZWNvbmQtcmF3IChsZW5ndGggc2Vjb25kLXRleHQp
KSkKICAgICAgICAgICAgIChsaW5lLW9mZnNldCAoLSAobGluZS1udW1iZXItYXQtcG9zIChwb2lu
dCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmUtbnVtYmVyLWF0LXBvcwogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLXN0YXJ0IGl0ZW0pKSkpKQog
ICAgICAgIChkZWxldGUtcmVnaW9uIGZpcnN0LXN0YXJ0IHNlY29uZC1lbmQpCiAgICAgICAgKGdv
dG8tY2hhciBmaXJzdC1zdGFydCkKICAgICAgICAoaW5zZXJ0IHNlY29uZC10ZXh0IHNlcGFyYXRv
ciBmaXJzdC10ZXh0IHRyYWlsaW5nKQogICAgICAgIChnb3RvLWNoYXIgKGlmIHVwCiAgICAgICAg
ICAgICAgICAgICAgICAgZmlyc3Qtc3RhcnQKICAgICAgICAgICAgICAgICAgICAgKCsgZmlyc3Qt
c3RhcnQgKGxlbmd0aCBzZWNvbmQtdGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0
aCBzZXBhcmF0b3IpKSkpCiAgICAgICAgKHdpdGgtc3VwcHJlc3NlZC13YXJuaW5ncyAoKGludGVy
YWN0aXZlLW9ubHkgbmV4dC1saW5lKSkKICAgICAgICAgIChuZXh0LWxpbmUgbGluZS1vZmZzZXQp
KSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy1yZW51bWJlci1saXN0ICgmb3B0aW9uYWwgc3RhcnQp
CiAgIlJlbnVtYmVyIHRoZSBvcmRlcmVkIGxpc3QgYXQgcG9pbnQuCk51bWJlcnMgYXJlIGFzc2ln
bmVkIHNlcXVlbnRpYWxseSBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBpdGVtJ3MKbnVtYmVyLiAg
V2l0aCBhIHByZWZpeCBhcmd1bWVudCBTVEFSVCwgc3RhcnQgbnVtYmVyaW5nIGZyb20gdGhhdAp2
YWx1ZSBpbnN0ZWFkLiAgRG9lcyBub3RoaW5nIGZvciB1bm9yZGVyZWQgbGlzdHMuIgogIChpbnRl
cmFjdGl2ZSAiUCIpCiAgKHdoZW4tbGV0KiAoKGl0ZW0gKG1hcmtkb3duLXRzLS1saXN0LWl0ZW0t
YXQtcG9pbnQpKQogICAgICAgICAgICAgIChsaXN0LW5vZGUgKHRyZWVzaXQtbm9kZS1wYXJlbnQg
aXRlbSkpKQogICAgKHdoZW4gKGVxdWFsICh0cmVlc2l0LW5vZGUtdHlwZSBsaXN0LW5vZGUpICJs
aXN0IikKICAgICAgKGxldCogKChjaGlsZHJlbiAodHJlZXNpdC1ub2RlLWNoaWxkcmVuIGxpc3Qt
bm9kZSkpCiAgICAgICAgICAgICAoaXRlbXMgKHNlcS1maWx0ZXIgKGxhbWJkYSAobikKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAodHJlZXNpdC1ub2RlLXR5cGUgbikg
Imxpc3RfaXRlbSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuKSkK
ICAgICAgICAgICAgIChmaXJzdC1tYXJrZXIgKHRyZWVzaXQtbm9kZS1jaGlsZCAoY2FyIGl0ZW1z
KSAwKSkKICAgICAgICAgICAgIChtYXJrZXItdHlwZSAodHJlZXNpdC1ub2RlLXR5cGUgZmlyc3Qt
bWFya2VyKSkpCiAgICAgICAgKHdoZW4gKG1lbWJlciBtYXJrZXItdHlwZSAnKCJsaXN0X21hcmtl
cl9kb3QiICJsaXN0X21hcmtlcl9wYXJlbnRoZXNpcyIpKQogICAgICAgICAgKGxldCogKChiYXNl
IChpZiBzdGFydAogICAgICAgICAgICAgICAgICAgICAgICAgICAocHJlZml4LW51bWVyaWMtdmFs
dWUgc3RhcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLXRvLW51bWJlcgogICAg
ICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtdGV4dCBmaXJzdC1tYXJrZXIgdCkp
KSkKICAgICAgICAgICAgICAgICAoY291bnQgKGxlbmd0aCBpdGVtcykpCiAgICAgICAgICAgICAg
ICAgOzsgU3RhcnQgZnJvbSB0aGUgbGFzdCBudW1iZXIgYW5kIHdvcmsgYmFja3dhcmRzIHNvCiAg
ICAgICAgICAgICAgICAgOzsgdGhhdCBlYXJsaWVyIGJ1ZmZlciBwb3NpdGlvbnMgcmVtYWluIHZh
bGlkLgogICAgICAgICAgICAgICAgIChudW0gKCsgYmFzZSBjb3VudCAtMSkpKQogICAgICAgICAg
ICAoZG9saXN0IChpdCAocmV2ZXJzZSBpdGVtcykpCiAgICAgICAgICAgICAgKGxldCogKChtYXJr
ZXIgKHRyZWVzaXQtbm9kZS1jaGlsZCBpdCAwKSkKICAgICAgICAgICAgICAgICAgICAgKG1hcmtl
ci1lbmQgKHRyZWVzaXQtbm9kZS1lbmQgbWFya2VyKSkKICAgICAgICAgICAgICAgICAgICAgKGJv
bCAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIg
KHRyZWVzaXQtbm9kZS1zdGFydCBtYXJrZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGxpbmUtYmVnaW5uaW5nLXBvc2l0aW9uKSkpCiAgICAgICAgICAgICAgICAgICAgIDs7IEZ1bGwg
dGV4dCBmcm9tIGJvbCB0byBlbmQgb2YgbWFya2VyIGluY2x1ZGVzCiAgICAgICAgICAgICAgICAg
ICAgIDs7IGFueSBsZWFkaW5nIHdoaXRlc3BhY2UsIHRoZSBudW1iZXIsIGFuZCB0aGUKICAgICAg
ICAgICAgICAgICAgICAgOzsgc2VwYXJhdG9yIChlLmcuLCAiLiAiIG9yICIuXHQiKS4KICAgICAg
ICAgICAgICAgICAgICAgKGZ1bGwtdGV4dCAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVz
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbCBtYXJrZXItZW5kKSkKICAgICAg
ICAgICAgICAgICAgICAgKGluZGVudC1zdHIKICAgICAgICAgICAgICAgICAgICAgIChpZiAoc3Ry
aW5nLW1hdGNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGBcXChbWzpibGFuazpdXSpc
XClbMC05XSIgZnVsbC10ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1zdHJp
bmcgMSBmdWxsLXRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICIiKSkKICAgICAgICAgICAg
ICAgICAgICAgKHN1ZmZpeC1zdHIKICAgICAgICAgICAgICAgICAgICAgIChpZiAoc3RyaW5nLW1h
dGNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGBbWzpibGFuazpdXSpbMC05XStcXCgu
KlxcKVxcJyIgZnVsbC10ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1zdHJp
bmcgMSBmdWxsLXRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICIuICIpKQogICAgICAgICAg
ICAgICAgICAgICAobmV3LXRleHQgKGNvbmNhdCBpbmRlbnQtc3RyCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChudW1iZXItdG8tc3RyaW5nIG51bSkKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4LXN0cikpKQogICAgICAgICAgICAgICAg
KHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgIChkZWxldGUtcmVnaW9uIGJvbCBtYXJr
ZXItZW5kKQogICAgICAgICAgICAgICAgICAoZ290by1jaGFyIGJvbCkKICAgICAgICAgICAgICAg
ICAgKGluc2VydCBuZXctdGV4dCkpKQogICAgICAgICAgICAgIChjbC1kZWNmIG51bSkpCiAgICAg
ICAgICAgIChtZXNzYWdlICJSZW51bWJlcmVkICVkIGl0ZW1zIiBjb3VudCkpKSkpKSkKCihkZWZ1
biBtYXJrZG93bi10cy0tbGlzdC1pdGVtLW5ldy1tYXJrZXIgKGl0ZW0pCiAgIlJldHVybiB0aGUg
bWFya2VyIHN0cmluZyBmb3IgYSBuZXcgaXRlbSBmb2xsb3dpbmcgSVRFTS4KRm9yIHVub3JkZXJl
ZCBpdGVtcywgcmV1c2UgdGhlIHNhbWUgbWFya2VyIGNoYXJhY3Rlci4KRm9yIG9yZGVyZWQgaXRl
bXMsIGluY3JlbWVudCB0aGUgbnVtYmVyLiIKICAobGV0KiAoKG1hcmtlciAodHJlZXNpdC1ub2Rl
LWNoaWxkIGl0ZW0gMCkpCiAgICAgICAgICh0eXBlICh0cmVlc2l0LW5vZGUtdHlwZSBtYXJrZXIp
KQogICAgICAgICAoaW5kZW50IChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgICAgKGdv
dG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IGl0ZW0pKQogICAgICAgICAgICAgICAgICAgKGN1
cnJlbnQtaW5kZW50YXRpb24pKSkKICAgICAgICAgKHByZWZpeCAobWFrZS1zdHJpbmcgaW5kZW50
ID9ccykpKQogICAgKHBjYXNlIHR5cGUKICAgICAgKCJsaXN0X21hcmtlcl9taW51cyIgKGNvbmNh
dCBwcmVmaXggIi0gIikpCiAgICAgICgibGlzdF9tYXJrZXJfcGx1cyIgIChjb25jYXQgcHJlZml4
ICIrICIpKQogICAgICAoImxpc3RfbWFya2VyX3N0YXIiICAoY29uY2F0IHByZWZpeCAiKiAiKSkK
ICAgICAgKCJsaXN0X21hcmtlcl9kb3QiCiAgICAgICAobGV0ICgobnVtIChzdHJpbmctdG8tbnVt
YmVyICh0cmVlc2l0LW5vZGUtdGV4dCBtYXJrZXIgdCkpKSkKICAgICAgICAgKGNvbmNhdCBwcmVm
aXggKG51bWJlci10by1zdHJpbmcgKDErIG51bSkpICIuICIpKSkKICAgICAgKCJsaXN0X21hcmtl
cl9wYXJlbnRoZXNpcyIKICAgICAgIChsZXQgKChudW0gKHN0cmluZy10by1udW1iZXIgKHRyZWVz
aXQtbm9kZS10ZXh0IG1hcmtlciB0KSkpKQogICAgICAgICAoY29uY2F0IHByZWZpeCAobnVtYmVy
LXRvLXN0cmluZyAoMSsgbnVtKSkgIikgIikpKQogICAgICAoXyAoY29uY2F0IHByZWZpeCAiLSAi
KSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tbmV3LW1hcmtlci1mb3ItbGluZSAoaXRlbSkKICAi
UmV0dXJuIHRoZSBtYXJrZXIgc3RyaW5nIGZvciBhIG5ldyBpdGVtIGZvbGxvd2luZyBJVEVNLgpX
aGVuIHRoZSBjdXJyZW50IGxpbmUgaGFzIGEgbGlzdCBtYXJrZXIgcGF0dGVybiBhdCBhIGRpZmZl
cmVudAppbmRlbnRhdGlvbiB0aGFuIElURU0gKGUuZy4sIGEgbmVzdGVkIG1hcmtlciB0aGF0IHRo
ZSBncmFtbWFyIGRpZApub3QgcmVjb2duaXplIGFzIGEgbGlzdF9pdGVtKSwgdXNlIHRoZSBjdXJy
ZW50IGxpbmUncyBtYXJrZXIuCk90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIGBtYXJrZG93bi10cy0t
bGlzdC1pdGVtLW5ldy1tYXJrZXInLiIKICAobGV0ICgobWFya2VyLW5vZGUgKHRyZWVzaXQtbm9k
ZS1jaGlsZCBpdGVtIDApKSkKICAgIChpZiAoPSAobGluZS1udW1iZXItYXQtcG9zKQogICAgICAg
ICAgICAobGluZS1udW1iZXItYXQtcG9zICh0cmVlc2l0LW5vZGUtc3RhcnQgbWFya2VyLW5vZGUp
KSkKICAgICAgICA7OyBJdGVtJ3MgbWFya2VyIGlzIG9uIHRoZSBjdXJyZW50IGxpbmU6IHVzZSBp
dCBub3JtYWxseS4KICAgICAgICAobWFya2Rvd24tdHMtLWxpc3QtaXRlbS1uZXctbWFya2VyIGl0
ZW0pCiAgICAgIDs7IEl0ZW0ncyBtYXJrZXIgaXMgb24gYSBkaWZmZXJlbnQgbGluZS4gIFRoZSBw
YXJzZXIgbWF5IGhhdmUKICAgICAgOzsgZmFpbGVkIHRvIHJlY29nbml6ZSBhIG5lc3RlZCBtYXJr
ZXIgKGUuZy4sIGEgbG9uZSBgICAtICcKICAgICAgOzsgcGFyc2VkIGFzIGEgc2V0ZXh0IGhlYWRp
bmcpLiAgUmVhZCB0aGUgY3VycmVudCBsaW5lLgogICAgICAobGV0ICgobGluZSAoYnVmZmVyLXN1
YnN0cmluZy1uby1wcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAobGluZS1iZWdpbm5pbmct
cG9zaXRpb24pIChsaW5lLWVuZC1wb3NpdGlvbikpKSkKICAgICAgICAoaWYgKHN0cmluZy1tYXRj
aAogICAgICAgICAgICAgIlxcYFxcKFtbOmJsYW5rOl1dKlxcKVxcKFstKitdIFxcfFxcKFswLTld
K1xcKVxcKFsuKV0gXFwpXFwpIgogICAgICAgICAgICAgbGluZSkKICAgICAgICAgICAgKGxldCAo
KGluZGVudCAobWF0Y2gtc3RyaW5nIDEgbGluZSkpCiAgICAgICAgICAgICAgICAgIChudW0gKG1h
dGNoLXN0cmluZyAzIGxpbmUpKQogICAgICAgICAgICAgICAgICAoc3VmZml4IChtYXRjaC1zdHJp
bmcgNCBsaW5lKSkKICAgICAgICAgICAgICAgICAgKHVub3JkZXJlZCAobWF0Y2gtc3RyaW5nIDIg
bGluZSkpKQogICAgICAgICAgICAgIChpZiBudW0KICAgICAgICAgICAgICAgICAgKGNvbmNhdCBp
bmRlbnQgKG51bWJlci10by1zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICgxKyAoc3RyaW5nLXRvLW51bWJlciBudW0pKSkKICAgICAgICAgICAgICAgICAgICAgICAgICBz
dWZmaXgpCiAgICAgICAgICAgICAgICAoY29uY2F0IGluZGVudCB1bm9yZGVyZWQpKSkKICAgICAg
ICAgIDs7IE5vIG1hcmtlciBwYXR0ZXJuIG9uIGN1cnJlbnQgbGluZTogdXNlIGl0ZW0ncyBtYXJr
ZXIuCiAgICAgICAgICAobWFya2Rvd24tdHMtLWxpc3QtaXRlbS1uZXctbWFya2VyIGl0ZW0pKSkp
KSkKCihkZWZ1biBtYXJrZG93bi10cy0tbGluZS1ibG9jay1xdW90ZS1kZXB0aCAoJm9wdGlvbmFs
IHBvcykKICAiQ291bnQgdGhlIG51bWJlciBvZiBgPicgYmxvY2sgcXVvdGUgbWFya2VycyBvbiB0
aGUgbGluZSBhdCBQT1MuIgogIChzYXZlLWV4Y3Vyc2lvbgogICAgKHdoZW4gcG9zIChnb3RvLWNo
YXIgcG9zKSkKICAgIChiZWdpbm5pbmctb2YtbGluZSkKICAgIChsZXQgKChjb3VudCAwKSkKICAg
ICAgKHdoaWxlIChhbmQgKG5vdCAoZW9scCkpCiAgICAgICAgICAgICAgICAgIChtZW1xIChjaGFy
LWFmdGVyKSAnKD8+ID9ccyA/XHQpKSkKICAgICAgICAod2hlbiAoZXEgKGNoYXItYWZ0ZXIpID8+
KQogICAgICAgICAgKHNldHEgY291bnQgKDErIGNvdW50KSkpCiAgICAgICAgKGZvcndhcmQtY2hh
ciAxKSkKICAgICAgY291bnQpKSkKCihkZWZ1biBtYXJrZG93bi10cy1uZXdsaW5lICgpCiAgIklu
c2VydCBhIG5ld2xpbmUsIGNvbnRpbnVpbmcgdGhlIGN1cnJlbnQgY29udGV4dC4KSW5zaWRlIGEg
bGlzdCBpdGVtLCB0aGUgbmV3IGxpbmUgaXMgaW5kZW50ZWQgdG8gdGhlIGl0ZW0ncyB0ZXh0CmNv
bHVtbiBzbyB0aGUgcGFyYWdyYXBoIGNvbnRpbnVlcy4gIEEgc2Vjb25kIFJFVCBvbiBhIGJsYW5r
CmNvbnRpbnVhdGlvbiBsaW5lIHJlbW92ZXMgdGhlIGluZGVudGF0aW9uLCBkcm9wcGluZyBwb2lu
dCB0bwpjb2x1bW4gMCBzbyB0aGUgdHJlZS1zaXR0ZXIgZ3JhbW1hciBlbmRzIHRoZSBsaXN0LgpJ
bnNpZGUgYSBibG9jayBxdW90ZSwgdGhlIG5ldyBsaW5lIGluY2x1ZGVzIHRoZSBxdW90ZSBwcmVm
aXguCk90aGVyd2lzZSwgaW5zZXJ0IGEgcGxhaW4gbmV3bGluZS4iCiAgKGludGVyYWN0aXZlKQog
IChsZXQqICgobm9kZSAodHJlZXNpdC1ub2RlLWF0CiAgICAgICAgICAgICAgICAoc2F2ZS1leGN1
cnNpb24gKGJhY2stdG8taW5kZW50YXRpb24pIChwb2ludCkpCiAgICAgICAgICAgICAgICAnbWFy
a2Rvd24pKQogICAgICAgICA7OyBUcmVlLXNpdHRlciBtYXkgcmVwb3J0IGEgbm9kZSBpbnNpZGUg
YSBibG9ja19xdW90ZSBldmVuCiAgICAgICAgIDs7IHdoZW4gcG9pbnQgaXMgb24gYSBibGFuayBs
aW5lIHBhc3QgdGhlIHF1b3RlICh0aGUgbm9kZQogICAgICAgICA7OyBzcGFuIGNhbiBleHRlbmQg
YmV5b25kIHRoZSBgPicgbGluZXMpLiAgT25seSB0cmVhdCB0aGUKICAgICAgICAgOzsgbGluZSBh
cyBpbnNpZGUgYSBibG9jayBxdW90ZSBpZiBpdCBhY3R1YWxseSBzdGFydHMgd2l0aAogICAgICAg
ICA7OyBhIGA+JyBtYXJrZXIuCiAgICAgICAgIChpbi1icSAoYW5kICh0cmVlc2l0LXBhcmVudC11
bnRpbCBub2RlICJcXGBibG9ja19xdW90ZVxcJyIpCiAgICAgICAgICAgICAgICAgICAgIChzYXZl
LWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICAgIChiZWdpbm5pbmctb2YtbGluZSkKICAg
ICAgICAgICAgICAgICAgICAgICAobG9va2luZy1hdC1wICJbIFx0XSo+IikpKSkKICAgICAgICAg
KGl0ZW0gKG1hcmtkb3duLXRzLS1saXN0LWl0ZW0tYXQtcG9pbnQpKSkKICAgIChjb25kCiAgICAg
KGl0ZW0KICAgICAgKGxldCogKChjb2wgKG1hcmtkb3duLXRzLS1saXN0LWl0ZW0tdGV4dC1jb2x1
bW4gaXRlbSkpCiAgICAgICAgICAgICAoYnEtcHJlZml4ICh3aGVuIGluLWJxIChtYXJrZG93bi10
cy0tYmxvY2stcXVvdGUtcHJlZml4KSkpCiAgICAgICAgICAgICA7OyBgY29sJyBpcyB0aGUgYWJz
b2x1dGUgY29sdW1uIG9mIHRoZSBpdGVtJ3MgdGV4dCwKICAgICAgICAgICAgIDs7IHdoaWNoIGlu
c2lkZSBhIGJsb2NrIHF1b3RlIGluY2x1ZGVzIHRoZSAiPiAiIHByZWZpeAogICAgICAgICAgICAg
Ozsgd2lkdGguICBTaW5jZSB3ZSBpbnNlcnQgYGJxLXByZWZpeCcgc2VwYXJhdGVseSwgd2UKICAg
ICAgICAgICAgIDs7IG11c3Qgc3VidHJhY3QgaXRzIGxlbmd0aCB0byBhdm9pZCBkb3VibGluZyBp
dC4KICAgICAgICAgICAgIChpbmRlbnQgKC0gY29sIChsZW5ndGggKG9yIGJxLXByZWZpeCAiIikp
KSkKICAgICAgICAgICAgIDs7IFRoZSBjdXJyZW50IGxpbmUgaXMgImJsYW5rIiBpZiBpdCBjb250
YWlucyBvbmx5CiAgICAgICAgICAgICA7OyB3aGl0ZXNwYWNlIChvciBxdW90ZSBwcmVmaXggKyB3
aGl0ZXNwYWNlKSBhbmQgbm8KICAgICAgICAgICAgIDs7IGFjdHVhbCB0ZXh0IGZyb20gYSBwcmV2
aW91cyBSRVQncyBjb250aW51YXRpb24gaW5kZW50LgogICAgICAgICAgICAgKGJsYW5rLWxpbmUt
cCAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVnaW5uaW5n
LW9mLWxpbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb2tpbmctYXQtcAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiXls+IFx0XSokIikpKQogICAgICAgICAgICAgOzsg
UG9pbnQgaXMgYmVmb3JlIHRoZSBpdGVtJ3MgdGV4dCAoYXQgb3IgYmVmb3JlIHRoZQogICAgICAg
ICAgICAgOzsgbWFya2VyKS4gIEEgcGxhaW4gbmV3bGluZSBpcyBhcHByb3ByaWF0ZSBoZXJlLCBh
ZGRpbmcKICAgICAgICAgICAgIDs7IGNvbnRpbnVhdGlvbiBpbmRlbnQgd291bGQgc2hpZnQgdGhl
IGV4aXN0aW5nIGNvbnRlbnQKICAgICAgICAgICAgIDs7IHRvIHRoZSByaWdodC4KICAgICAgICAg
ICAgIChiZWZvcmUtdGV4dC1wICg8PSAoY3VycmVudC1jb2x1bW4pIGNvbCkpKQogICAgICAgIChj
b25kCiAgICAgICAgIChibGFuay1saW5lLXAKICAgICAgICAgIDs7IFRoZSB1c2VyIHByZXNzZWQg
UkVUIG9uIGFuIGFscmVhZHktYmxhbmsgY29udGludWF0aW9uCiAgICAgICAgICA7OyBsaW5lLiAg
SW5zdGVhZCBvZiBhZGRpbmcgeWV0IGFub3RoZXIgaW5kZW50ZWQgYmxhbmsKICAgICAgICAgIDs7
IGxpbmUsIHJlbW92ZSB0aGUgaW5kZW50YXRpb24gYW5kIGluc2VydCBhIHBsYWluCiAgICAgICAg
ICA7OyBuZXdsaW5lLiAgVGhpcyBkcm9wcyBwb2ludCB0byBjb2x1bW4gMCwgd2hpY2ggaXMgdGhl
CiAgICAgICAgICA7OyBvbmx5IHdheSB0aGUgdHJlZS1zaXR0ZXIgbWFya2Rvd24gZ3JhbW1hciBl
bmRzIGEgbGlzdDoKICAgICAgICAgIDs7IGJsYW5rIGxpbmVzIGFsb25lIGRvIE5PVCBlbmQgYSBs
aXN0LCBvbmx5CiAgICAgICAgICA7OyBub24taW5kZW50ZWQgY29udGVudCBkb2VzLiAgU28gdGhp
cyBnaXZlcyB0aGUgdXNlciBhCiAgICAgICAgICA7OyBuYXR1cmFsICJSRVQgUkVUIHRvIGV4aXQg
dGhlIGxpc3QiIHdvcmtmbG93LgogICAgICAgICAgKGRlbGV0ZS1yZWdpb24gKGxpbmUtYmVnaW5u
aW5nLXBvc2l0aW9uKSAobGluZS1lbmQtcG9zaXRpb24pKQogICAgICAgICAgKG5ld2xpbmUpKQog
ICAgICAgICAoYmVmb3JlLXRleHQtcAogICAgICAgICAgOzsgUG9pbnQgaXMgb24gb3IgYmVmb3Jl
IHRoZSBsaXN0IG1hcmtlcjsganVzdCBpbnNlcnQgYQogICAgICAgICAgOzsgcGxhaW4gbmV3bGlu
ZSBzbyB0aGUgaXRlbSBpcyBwdXNoZWQgZG93biB1bmNoYW5nZWQuCiAgICAgICAgICAobmV3bGlu
ZSkpCiAgICAgICAgICh0CiAgICAgICAgICAoZGVsZXRlLWhvcml6b250YWwtc3BhY2UpCiAgICAg
ICAgICAobmV3bGluZSkKICAgICAgICAgICh3aGVuIGJxLXByZWZpeCAoaW5zZXJ0IGJxLXByZWZp
eCkpCiAgICAgICAgICAoaW5zZXJ0IChtYWtlLXN0cmluZyBpbmRlbnQgP1xzKSkpKSkpCiAgICAg
KGluLWJxCiAgICAgIChsZXQgKChicS1wcmVmaXggKG1hcmtkb3duLXRzLS1ibG9jay1xdW90ZS1w
cmVmaXgpKQogICAgICAgICAgICA7OyBBIGxpbmUgd2l0aCBvbmx5IHF1b3RlIG1hcmtlcnMgYW5k
IHdoaXRlc3BhY2UgKGUuZy4sCiAgICAgICAgICAgIDs7ICI+ICIpIGlzICJibGFuayIgaW5zaWRl
IHRoZSBxdW90ZS4gIFJFVCBoZXJlIGV4aXRzIHRoZQogICAgICAgICAgICA7OyBxdW90ZSwgc2Ft
ZSBhcyBSRVQgb24gYSBibGFuayBjb250aW51YXRpb24gbGluZSBleGl0cyBhCiAgICAgICAgICAg
IDs7IGxpc3Q6IHJlbW92ZSB0aGUgcHJlZml4IGFuZCBkcm9wIHRvIGNvbHVtbiAwLgogICAgICAg
ICAgICAoYmxhbmstbGluZS1wIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGJlZ2lubmluZy1vZi1saW5lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxv
b2tpbmctYXQtcCAiXls+IFx0XSokIikpKSkKICAgICAgICAoaWYgYmxhbmstbGluZS1wCiAgICAg
ICAgICAgIChwcm9nbgogICAgICAgICAgICAgIChkZWxldGUtcmVnaW9uIChsaW5lLWJlZ2lubmlu
Zy1wb3NpdGlvbikgKGxpbmUtZW5kLXBvc2l0aW9uKSkKICAgICAgICAgICAgICAobmV3bGluZSkp
CiAgICAgICAgICAoZGVsZXRlLWhvcml6b250YWwtc3BhY2UpCiAgICAgICAgICAobmV3bGluZSkK
ICAgICAgICAgIChpbnNlcnQgYnEtcHJlZml4KSkpKQogICAgIDs7IERlZmF1bHQ6IHBsYWluIG5l
d2xpbmUuICBUaGlzIGFsc28gaGFuZGxlcyBlbXB0eSBsaXN0IG1hcmtlcnMKICAgICA7OyAoZS5n
LiwgIi0gIiB3aXRoIG5vIHRleHQpIHRoYXQgdGhlIGdyYW1tYXIgcGFyc2VzIGFzIEVSUk9SCiAg
ICAgOzsgbm9kZXMgcmF0aGVyIHRoYW4gbGlzdF9pdGVtIG5vZGVzLgogICAgIDs7CiAgICAgOzsg
V2hlbiB0aGUgY3VycmVudCBsaW5lIGlzIGJsYW5rICh3aGl0ZXNwYWNlIG9ubHkpLCBpdCBpcyBh
CiAgICAgOzsgY29udGludWF0aW9uLWluZGVudCBsaW5lIGxlZnQgYnkgYSBwcmV2aW91cyBSRVQg
dGhhdAogICAgIDs7IHRyZWUtc2l0dGVyIG5vIGxvbmdlciBjb25zaWRlcnMgcGFydCBvZiBhIGxp
c3RfaXRlbS4gIENsZWFyCiAgICAgOzsgdGhlIHdoaXRlc3BhY2Ugc28gbm8gdHJhaWxpbmcgc3Bh
Y2VzIHJlbWFpbiwgYW5kIGluc2VydCBhCiAgICAgOzsgcGxhaW4gbmV3bGluZSBhdCBjb2x1bW4g
MCB0byBleGl0IHRoZSBsaXN0IGNvbnRleHQuCiAgICAgKHQKICAgICAgKHdoZW4gKHNhdmUtZXhj
dXJzaW9uCiAgICAgICAgICAgICAgKGJlZ2lubmluZy1vZi1saW5lKQogICAgICAgICAgICAgIChs
b29raW5nLWF0LXAgIl5bIFx0XSskIikpCiAgICAgICAgKGRlbGV0ZS1yZWdpb24gKGxpbmUtYmVn
aW5uaW5nLXBvc2l0aW9uKSAobGluZS1lbmQtcG9zaXRpb24pKSkKICAgICAgKG5ld2xpbmUpKSkp
KQoKKGRlZnVuIG1hcmtkb3duLXRzLWluc2VydC1saXN0LWl0ZW0gKCkKICAiSW5zZXJ0IGEgbmV3
IGxpc3QgaXRlbSwgc3BsaXR0aW5nIHRleHQgYXQgcG9pbnQuClRleHQgYWZ0ZXIgcG9pbnQgbW92
ZXMgdG8gdGhlIG5ldyBpdGVtLiAgQXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsCmFuIGVtcHR5
IGl0ZW0gaXMgaW5zZXJ0ZWQgYWJvdmUgYW5kIHRoZSBjdXJyZW50IGNvbnRlbnQgaXMgcHVzaGVk
IGRvd24uCkluc2lkZSBhIGJsb2NrIHF1b3RlLCB0aGUgbmV3IGxpbmUgaW5jbHVkZXMgdGhlIHF1
b3RlIHByZWZpeC4KRm9yIG9yZGVyZWQgbGlzdHMsIHRoZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQu
CldoZW4gbm90IGluc2lkZSBhIGxpc3QsIGZhbGwgYmFjayB0byBgbWFya2Rvd24tdHMtbmV3bGlu
ZScuIgogIChpbnRlcmFjdGl2ZSkKICAobGV0KiAoKG5vZGUgKHRyZWVzaXQtbm9kZS1hdAogICAg
ICAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uIChiYWNrLXRvLWluZGVudGF0aW9uKSAocG9pbnQp
KQogICAgICAgICAgICAgICAgJ21hcmtkb3duKSkKICAgICAgICAgKGluLWJxIChhbmQgKHRyZWVz
aXQtcGFyZW50LXVudGlsIG5vZGUgIlxcYGJsb2NrX3F1b3RlXFwnIikKICAgICAgICAgICAgICAg
ICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgKGJlZ2lubmluZy1v
Zi1saW5lKQogICAgICAgICAgICAgICAgICAgICAgIChsb29raW5nLWF0LXAgIlsgXHRdKj4iKSkp
KQogICAgICAgICAoYnEtcHJlZml4ICh3aGVuIGluLWJxIChtYXJrZG93bi10cy0tYmxvY2stcXVv
dGUtcHJlZml4KSkpCiAgICAgICAgIChpdGVtIChtYXJrZG93bi10cy0tbGlzdC1pdGVtLWF0LXBv
aW50KSkpCiAgICAoY29uZAogICAgICgoYW5kIGl0ZW0KICAgICAgICAgICAob3IgKG5vdCBpbi1i
cSkKICAgICAgICAgICAgICAgKD49IChtYXJrZG93bi10cy0tbGluZS1ibG9jay1xdW90ZS1kZXB0
aCkKICAgICAgICAgICAgICAgICAgIChtYXJrZG93bi10cy0tbGluZS1ibG9jay1xdW90ZS1kZXB0
aAogICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtc3RhcnQgKHRyZWVzaXQtbm9kZS1j
aGlsZCBpdGVtIDApKSkpKSkKICAgICAgKGxldCogKChuZXctbWFya2VyIChtYXJrZG93bi10cy0t
bmV3LW1hcmtlci1mb3ItbGluZSBpdGVtKSkKICAgICAgICAgICAgIChhdC1ib2wgKDw9IChjdXJy
ZW50LWNvbHVtbikKICAgICAgICAgICAgICAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAoYmFjay10by1pbmRlbnRhdGlvbikKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGN1cnJlbnQtY29sdW1uKSkpKQogICAgICAgICAgICAgKHRhaWwgKHdo
ZW4gKGFuZCAobm90IGF0LWJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAo
bG9va2luZy1hdC1wICJbIFx0XSokIikpKQogICAgICAgICAgICAgICAgICAgICAoZGVsZXRlLWFu
ZC1leHRyYWN0LXJlZ2lvbgogICAgICAgICAgICAgICAgICAgICAgKHBvaW50KSAobGluZS1lbmQt
cG9zaXRpb24pKSkpKQogICAgICAgIChpZiBhdC1ib2wKICAgICAgICAgICAgOzsgQXQgQk9MOiBp
bnNlcnQgZW1wdHkgaXRlbSBhYm92ZSwgcHVzaCBjdXJyZW50IGxpbmUgZG93bi4KICAgICAgICAg
ICAgKHByb2duCiAgICAgICAgICAgICAgKGJlZ2lubmluZy1vZi1saW5lKQogICAgICAgICAgICAg
ICh3aGVuIGJxLXByZWZpeCAoaW5zZXJ0IGJxLXByZWZpeCkpCiAgICAgICAgICAgICAgKGluc2Vy
dCBuZXctbWFya2VyICJcbiIpCiAgICAgICAgICAgICAgKGJhY2stdG8taW5kZW50YXRpb24pKQog
ICAgICAgICAgOzsgTWlkLWxpbmUgb3IgRU9MOiBuZXcgaXRlbSBiZWxvdyB3aXRoIHRhaWwgdGV4
dC4KICAgICAgICAgIChkZWxldGUtaG9yaXpvbnRhbC1zcGFjZSkKICAgICAgICAgIChuZXdsaW5l
KQogICAgICAgICAgKHdoZW4gYnEtcHJlZml4IChpbnNlcnQgYnEtcHJlZml4KSkKICAgICAgICAg
IChpbnNlcnQgbmV3LW1hcmtlcikKICAgICAgICAgICh3aGVuIHRhaWwgKHNhdmUtZXhjdXJzaW9u
IChpbnNlcnQgKHN0cmluZy10cmltLWxlZnQgdGFpbCkpKSkpKSkKCiAgICAgOzsgTm90IGluIGEg
bGlzdDogZmFsbCBiYWNrIHRvIG5ld2xpbmUgYmVoYXZpb3IuCiAgICAgKHQgKG1hcmtkb3duLXRz
LW5ld2xpbmUpKSkpKQoKOzs7IEZpbGxpbmc6Cgo7OyBUT0RPOiBSZW1vdmUgdGhlIHBpcGVfdGFi
bGUgYmxvY2sgaWYgd2UgaW1wbGVtZW50IHBpcGVfdGFibGUgZmlsbC4KKGRlZmNvbnN0IG1hcmtk
b3duLXRzLS1maWxsLXVuZmlsbGFibGUtYmxvY2stcXVlcnkKICAnKFsoZmVuY2VkX2NvZGVfYmxv
Y2spIChpbmRlbnRlZF9jb2RlX2Jsb2NrKSAocGlwZV90YWJsZSldIEBibG9jaykKICAiVHJlZS1z
aXR0ZXIgcXVlcnkgbWF0Y2hpbmcgYmxvY2tzIHdoZXJlIGZpbGxpbmcgaXMgaW5oaWJpdGVkLiIp
CgooZGVmdW4gbWFya2Rvd24tdHMtLWxpc3QtaXRlbS10ZXh0LWNvbHVtbiAoaXRlbSkKICAiUmV0
dXJuIHRoZSBjb2x1bW4gd2hlcmUgdGhlIHRleHQgb2YgbGlzdCBJVEVNIHN0YXJ0cy4KVGhpcyBp
cyB0aGUgY29sdW1uIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGggbm9kZSBpbnNpZGUgSVRFTSwgb3IK
dGhlIHdpZHRoIG9mIHRoZSBsaXN0IG1hcmtlciBpZiBubyBwYXJhZ3JhcGggaXMgZm91bmQuIgog
IChsZXQgKChwYXJhZ3JhcGggKHRyZWVzaXQtc2VhcmNoLXN1YnRyZWUgaXRlbSAiXFxgcGFyYWdy
YXBoXFwnIikpKQogICAgKGlmIHBhcmFncmFwaAogICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAg
ICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IHBhcmFncmFwaCkpCiAgICAgICAg
ICAoY3VycmVudC1jb2x1bW4pKQogICAgICAobGV0ICgobWFya2VyICh0cmVlc2l0LW5vZGUtY2hp
bGQgaXRlbSAwKSkpCiAgICAgICAgKC0gKHRyZWVzaXQtbm9kZS1lbmQgbWFya2VyKQogICAgICAg
ICAgICh0cmVlc2l0LW5vZGUtc3RhcnQgbWFya2VyKSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMt
LWZpbGwtbGlzdC1pdGVtIChpdGVtIGp1c3RpZnkpCiAgIkZpbGwgdGhlIGNvbnRlbnRzIG9mIGxp
c3QgSVRFTSwgcHJlc2VydmluZyBpdHMgaW5kZW50YXRpb24uCk5hcnJvd3MgdG8gSVRFTSdzIG93
biBwYXJhZ3JhcGggY29udGVudCAoZXhjbHVkaW5nIG5lc3RlZCBsaXN0cykKYW5kIHNldHMgYGZp
bGwtcHJlZml4JyB0byBhbGlnbiBjb250aW51YXRpb24gbGluZXMgd2l0aCB0aGUgc3RhcnQKb2Yg
dGhlIGl0ZW0ncyB0ZXh0LiAgSlVTVElGWSBpcyBhcyBpbiBgZmlsbC1wYXJhZ3JhcGgnLiIKICAo
bGV0KiAoKGZpbGwtcHJlZml4IChtYWtlLXN0cmluZyAobWFya2Rvd24tdHMtLWxpc3QtaXRlbS10
ZXh0LWNvbHVtbiBpdGVtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID9ccykp
CiAgICAgICAgIDs7IEZpbmQgdGhlIGl0ZW0ncyBvd24gcGFyYWdyYXBoIChmaXJzdCBwYXJhZ3Jh
cGggY2hpbGQpLgogICAgICAgICA7OyBJZiB0aGUgaXRlbSBoYXMgbmVzdGVkIGxpc3RzLCBuYXJy
b3cgdG8ganVzdCB0aGUKICAgICAgICAgOzsgcGFyYWdyYXBoIHNvIHdlIGRvbid0IG1lcmdlIG5l
c3RlZCBpdGVtcy4KICAgICAgICAgKHBhcmEgKHRyZWVzaXQtc2VhcmNoLXN1YnRyZWUgaXRlbSAi
XFxgcGFyYWdyYXBoXFwnIiBuaWwgbmlsIDEpKQogICAgICAgICAoYmVnICh0cmVlc2l0LW5vZGUt
c3RhcnQgaXRlbSkpCiAgICAgICAgIChlbmQgKGlmIHBhcmEKICAgICAgICAgICAgICAgICAgKHRy
ZWVzaXQtbm9kZS1lbmQgcGFyYSkKICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtZW5kIGl0
ZW0pKSkKICAgICAgICAgOzsgVXNlIGRlZmF1bHQgcGFyYWdyYXBoIG1vdGlvbiBpbnNpZGUgdGhl
IG5hcnJvd2VkIHJlZ2lvbgogICAgICAgICA7OyBzbyB0aGF0IHRoZSBpbm5lciBgZmlsbC1wYXJh
Z3JhcGgnIGRvZXMgbm90IHJlLWVudGVyIG91cgogICAgICAgICA7OyBjdXN0b20gcGFyYWdyYXBo
LWZpbmRpbmcgbG9naWMuCiAgICAgICAgIChmaWxsLWZvcndhcmQtcGFyYWdyYXBoLWZ1bmN0aW9u
ICMnZm9yd2FyZC1wYXJhZ3JhcGgpKQogICAgKHNhdmUtcmVzdHJpY3Rpb24KICAgICAgKG5hcnJv
dy10by1yZWdpb24gYmVnIGVuZCkKICAgICAgKGZpbGwtcGFyYWdyYXBoIGp1c3RpZnkpKQogICAg
OzsgUmV0dXJuIG5vbi1uaWwgdG8gc2lnbmFsIHRoYXQgZmlsbGluZyBoYXMgYmVlbiBoYW5kbGVk
LAogICAgOzsgYXMgcGVyIHRoZSBjb250cmFjdCBvZiBgZmlsbC1wYXJhZ3JhcGgtZnVuY3Rpb24n
LgogICAgdCkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWFkYXB0aXZlLWZpbGwgKCkKICAiUmV0dXJu
IHRoZSBmaWxsIHByZWZpeCBmb3IgdGhlIGN1cnJlbnQgbGluZSBpbiBNYXJrZG93bi4KV2hlbiBp
bnNpZGUgYSBsaXN0IGl0ZW0sIHJldHVybiBzcGFjZXMgbWF0Y2hpbmcgdGhlIGNvbHVtbiB3aGVy
ZQp0aGUgaXRlbSdzIHRleHQgc3RhcnRzLiIKICAoYW5kLWxldCogKChub2RlICh0cmVlc2l0LW5v
ZGUtYXQKICAgICAgICAgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24gKGJhY2stdG8taW5kZW50
YXRpb24pIChwb2ludCkpCiAgICAgICAgICAgICAgICAgICAgJ21hcmtkb3duKSkKICAgICAgICAg
ICAgIChpdGVtICh0cmVlc2l0LXBhcmVudC11bnRpbCBub2RlICJcXGBsaXN0X2l0ZW1cXCciKSkp
CiAgICAobWFrZS1zdHJpbmcgKG1hcmtkb3duLXRzLS1saXN0LWl0ZW0tdGV4dC1jb2x1bW4gaXRl
bSkgP1xzKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZpbGwtZm9yd2FyZC1wYXJhZ3JhcGggKGFy
ZykKICAiTW92ZSBmb3J3YXJkIGJ5IEFSRyBwYXJhZ3JhcGhzLCByZXNwZWN0aW5nIE1hcmtkb3du
IHN0cnVjdHVyZS4KTGlzdCBpdGVtcyBhcmUgdHJlYXRlZCBhcyBpbmRpdmlkdWFsIHBhcmFncmFw
aHMuICBCbG9ja3MgbWF0Y2hlZApieSBgbWFya2Rvd24tdHMtLWZpbGwtdW5maWxsYWJsZS1ibG9j
ay1xdWVyeScgYXJlIHNraXBwZWQ6IGJvdGgKZm9yd2FyZCBhbmQgYmFja3dhcmQgbW90aW9uIG1v
dmUgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2ssIHNvCmBmaWxsLXJlZ2lvbicgc2VlcyBhIHplcm8t
bGVuZ3RoIHJlZ2lvbiBhbmQgbGVhdmVzIHRoZSBibG9jawp1bmZpbGxlZC4iCiAgKGxldCAoKGRp
cmVjdGlvbiAoaWYgKD4gYXJnIDApIDEgLTEpKQogICAgICAgIChjb3VudCAoYWJzIGFyZykpCiAg
ICAgICAgKG1vdmVkIDApKQogICAgKGRvdGltZXMgKF8gY291bnQpCiAgICAgIDs7IEZvciBiYWNr
d2FyZCBtb3Rpb24sIHNraXAgYmFjayBvdmVyIHdoaXRlc3BhY2UgdG8gZmluZAogICAgICA7OyB0
aGUgaXRlbSB3ZSBhcmUgbGVhdmluZywgbm90IHRoZSBuZXh0IG9uZS4KICAgICAgKGxldCogKChw
b3MgKGlmICg8IGRpcmVjdGlvbiAwKQogICAgICAgICAgICAgICAgICAgICAgKHNhdmUtZXhjdXJz
aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHRcbiIp
CiAgICAgICAgICAgICAgICAgICAgICAgIChtYXggKHBvaW50LW1pbikgKDEtIChwb2ludCkpKSkK
ICAgICAgICAgICAgICAgICAgICAocG9pbnQpKSkKICAgICAgICAgICAgIChibG9jayAoY2FyICh0
cmVlc2l0LXF1ZXJ5LWNhcHR1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1i
dWZmZXItcm9vdC1ub2RlICdtYXJrZG93bikKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJr
ZG93bi10cy0tZmlsbC11bmZpbGxhYmxlLWJsb2NrLXF1ZXJ5CiAgICAgICAgICAgICAgICAgICAg
ICAgICAgcG9zICgxKyBwb3MpKSkpCiAgICAgICAgICAgICAoaW5kZW50ZWQtcG9zIChzYXZlLWV4
Y3Vyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgcG9zKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChiYWNrLXRvLWluZGVudGF0aW9uKQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChwb2ludCkpKQogICAgICAgICAgICAgKG5vZGUgKHRyZWVzaXQt
bm9kZS1hdCBpbmRlbnRlZC1wb3MgJ21hcmtkb3duKSkKICAgICAgICAgICAgIChpdGVtICh0cmVl
c2l0LXBhcmVudC11bnRpbCBub2RlICJcXGBsaXN0X2l0ZW1cXCciKSkpCiAgICAgICAgOzsgV2hl
biBtb3ZpbmcgZm9yd2FyZCBmcm9tIHdoaXRlc3BhY2UgYmV0d2VlbiBsaXN0IGl0ZW1zLAogICAg
ICAgIDs7IHNraXAgdG8gdGhlIG5leHQgbm9uLWJsYW5rIHBvc2l0aW9uIGFuZCBjaGVjayBhZ2Fp
bi4KICAgICAgICAod2hlbiAoYW5kIChub3QgaXRlbSkgKG5vdCBibG9jaykgKD4gZGlyZWN0aW9u
IDApKQogICAgICAgICAgKGxldCAoKG5leHQtcG9zIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0XG4iKQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHBvaW50KSkpKQogICAgICAgICAgICAoc2V0cSBub2RlICh0cmVl
c2l0LW5vZGUtYXQgbmV4dC1wb3MgJ21hcmtkb3duKSkKICAgICAgICAgICAgKHNldHEgaXRlbSAo
dHJlZXNpdC1wYXJlbnQtdW50aWwgbm9kZSAiXFxgbGlzdF9pdGVtXFwnIikpKSkKICAgICAgICAo
Y29uZAogICAgICAgICA7OyBJbnNpZGUgYW4gdW5maWxsYWJsZSBibG9jazogc2tpcCBvdmVyIGl0
IGVudGlyZWx5LgogICAgICAgICAoYmxvY2sKICAgICAgICAgIChnb3RvLWNoYXIgKHRyZWVzaXQt
bm9kZS1lbmQgKGNkciBibG9jaykpKQogICAgICAgICAgKHNldHEgbW92ZWQgKDErIG1vdmVkKSkp
CiAgICAgICAgIDs7IEluc2lkZSBhIGxpc3QgaXRlbTogdHJlYXQgYXMgcGFyYWdyYXBoIGJvdW5k
YXJ5LgogICAgICAgICAoaXRlbQogICAgICAgICAgKGlmICg+IGRpcmVjdGlvbiAwKQogICAgICAg
ICAgICAgIChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1lbmQgaXRlbSkpCiAgICAgICAgICAgIChn
b3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1zdGFydCBpdGVtKSkpCiAgICAgICAgICAoc2V0cSBtb3Zl
ZCAoMSsgbW92ZWQpKSkKICAgICAgICAgOzsgRGVmYXVsdDogdXNlIHN0YW5kYXJkIHBhcmFncmFw
aCBtb3Rpb24uCiAgICAgICAgICh0CiAgICAgICAgICAoZm9yd2FyZC1wYXJhZ3JhcGggZGlyZWN0
aW9uKQogICAgICAgICAgKHNldHEgbW92ZWQgKDErIG1vdmVkKSkpKSkpCiAgICA7OyBSZXR1cm4g
dGhlIG51bWJlciBvZiBwYXJhZ3JhcGhzIGxlZnQgdG8gbW92ZSAoMCA9IGFsbCBkb25lKS4KICAg
ICgtIGNvdW50IG1vdmVkKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZpbGwtcGFyYWdyYXBoICgm
b3B0aW9uYWwganVzdGlmeSkKICAiRmlsbCB0aGUgY3VycmVudCBwYXJhZ3JhcGgsIHJlc3BlY3Rp
bmcgTWFya2Rvd24gYmxvY2sgc3RydWN0dXJlLgpUaGlzIGZ1bmN0aW9uIHByZXZlbnRzIGZpbGxp
bmcgaW5zaWRlIGJsb2NrcyBtYXRjaGVkIGJ5CmBtYXJrZG93bi10cy0tZmlsbC11bmZpbGxhYmxl
LWJsb2NrLXF1ZXJ5JywgYW5kIGZpbGxzIHdpdGhpbiBsaXN0Cml0ZW1zIHdpdGhvdXQgbWVyZ2lu
ZyBhZGphY2VudCBpdGVtcy4gIEpVU1RJRlkgaXMgYXMgaW4KYGZpbGwtcGFyYWdyYXBoJy4iCiAg
KGNvbmQqCiAgIDs7IERvbid0IGZpbGwgaW5zaWRlIHVuZmlsbGFibGUgYmxvY2tzLiAgVXNlIGEg
cXVlcnkgYWdhaW5zdCB0aGUKICAgOzsgcm9vdCBub2RlIGJlY2F1c2UgYHRyZWVzaXQtbm9kZS1h
dCcgbWF5IG5vdCByZXR1cm4gYSBub2RlCiAgIDs7IGluc2lkZSB0aGUgYmxvY2sgd2hlbiBwb2lu
dCBpcyBvbiBhbm9ueW1vdXMgKHVubmFtZWQpIHRleHQuCiAgICgodHJlZXNpdC1xdWVyeS1jYXB0
dXJlCiAgICAgKHRyZWVzaXQtYnVmZmVyLXJvb3Qtbm9kZSAnbWFya2Rvd24pCiAgICAgbWFya2Rv
d24tdHMtLWZpbGwtdW5maWxsYWJsZS1ibG9jay1xdWVyeQogICAgIChwb2ludCkgKG1pbiAoMSsg
KHBvaW50KSkgKHBvaW50LW1heCkpKQogICAgdCkKICAgOzsgRmlsbCB3aXRoaW4gdGhlIGVuY2xv
c2luZyBsaXN0IGl0ZW0uICBVc2UKICAgOzsgYG1hcmtkb3duLXRzLS1saXN0LWl0ZW0tYXQtcG9p
bnQnIHdoaWNoIGhhbmRsZXMgYmxvY2sgcXVvdGUKICAgOzsgbWFya2Vycy4gIFdoZW4gdGhlIGxp
c3QgaXRlbSBpcyBpbnNpZGUgYSBibG9jayBxdW90ZSwgZGVsZWdhdGUKICAgOzsgdG8gdGhlIGJs
b2NrIHF1b3RlIGZpbGxlciB3aGljaCBoYW5kbGVzIGA+ICcgcHJlZml4ZXMgY29ycmVjdGx5Lgog
ICAoKGJpbmQtYW5kKiAoaXRlbSAobWFya2Rvd24tdHMtLWxpc3QtaXRlbS1hdC1wb2ludCkpKQog
ICAgKGlmICh0cmVlc2l0LXBhcmVudC11bnRpbCBpdGVtICJcXGBibG9ja19xdW90ZVxcJyIpCiAg
ICAgICAgKG1hcmtkb3duLXRzLS1maWxsLWJsb2NrLXF1b3RlIGp1c3RpZnkpCiAgICAgIChtYXJr
ZG93bi10cy0tZmlsbC1saXN0LWl0ZW0gaXRlbSBqdXN0aWZ5KSkpCiAgIDs7IFBvaW50IGlzIG9u
IGEgYmxhbmsgbGluZSBiZWZvcmUgYSBsaXN0LiAgSWYgdGhlIG5leHQKICAgOzsgbm9uLXdoaXRl
c3BhY2UgcG9zaXRpb24gZmFsbHMgaW5zaWRlIGEgbGlzdCBpdGVtLCBmaWxsIHRoYXQgaXRlbS4K
ICAgKChzYXZlLWV4Y3Vyc2lvbgogICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCiAgICAgIChsb29r
aW5nLWF0LXAgIlsgXHRdKiQiKSkKICAgIChhbmQtbGV0KiAoKG5leHQtcG9zIChzYXZlLWV4Y3Vy
c2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAoc2tpcC1jaGFycy1mb3J3YXJkICIgXHRc
biIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludCkpKQogICAgICAgICAgICAgICAo
bmV4dC1ub2RlICh0cmVlc2l0LW5vZGUtYXQgbmV4dC1wb3MgJ21hcmtkb3duKSkKICAgICAgICAg
ICAgICAgKGl0ZW0gKHRyZWVzaXQtcGFyZW50LXVudGlsCiAgICAgICAgICAgICAgICAgICAgICBu
ZXh0LW5vZGUgIlxcYGxpc3RfaXRlbVxcJyIpKSkKICAgICAgKG1hcmtkb3duLXRzLS1maWxsLWxp
c3QtaXRlbSBpdGVtIGp1c3RpZnkpKSkKICAgOzsgRmlsbCB3aXRoaW4gYSBibG9jayBxdW90ZS4g
IE5hcnJvdyB0byB0aGUgcGFyYWdyYXBoIG5vZGUgYXQKICAgOzsgcG9pbnQncyBuZXN0aW5nIGxl
dmVsIHNvIGxpbmVzIHdpdGggZGlmZmVyZW50IGA+ICcgZGVwdGhzCiAgIDs7IGFyZSBub3QgbWVy
Z2VkLgogICAoKHRyZWVzaXQtcGFyZW50LXVudGlsCiAgICAgKHRyZWVzaXQtbm9kZS1hdAogICAg
ICAoc2F2ZS1leGN1cnNpb24gKGJhY2stdG8taW5kZW50YXRpb24pIChwb2ludCkpCiAgICAgICdt
YXJrZG93bikKICAgICAiXFxgYmxvY2tfcXVvdGVcXCciKQogICAgKG1hcmtkb3duLXRzLS1maWxs
LWJsb2NrLXF1b3RlIGp1c3RpZnkpKQogICA7OyBGaWxsIHdpdGhpbiBhbiBIVE1MIGNvbW1lbnQu
ICBUaGUgbm9kZSB0eXBlIGlzICJodG1sX2Jsb2NrIgogICA7OyBpbiBncmFtbWFyIHYwLjQueCBh
bmQgImNvbW1lbnQiIGluIHNvbWUgb3RoZXIgdmVyc2lvbnMuCiAgICgoYmluZC1hbmQqIChibG9j
ayAobGV0ICgobiAodHJlZXNpdC1ub2RlLWF0IChwb2ludCkgJ21hcmtkb3duKSkpCiAgICAgICAg
ICAgICAgICAgICAgICAgIChvciAodHJlZXNpdC1wYXJlbnQtdW50aWwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBuICJcXGBcXCg/Omh0bWxfYmxvY2tcXHxjb21tZW50XFwpXFwnIikKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKG1lbWJlciAodHJlZXNpdC1ub2RlLXR5cGUg
bikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKCJodG1sX2Jsb2Nr
IiAiY29tbWVudCIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKSkpKSkKICAg
IChtYXJrZG93bi10cy0tZmlsbC1odG1sLWNvbW1lbnQgYmxvY2sganVzdGlmeSkpCiAgIDs7IERl
ZmF1bHQ6IGxldCBmaWxsLXBhcmFncmFwaCBoYW5kbGUgaXQuCiAgICh0IG5pbCkpKQoKKGRlZnVu
IG1hcmtkb3duLXRzLS1maWxsLWh0bWwtY29tbWVudCAobm9kZSBqdXN0aWZ5KQogICJGaWxsIEhU
TUwgY29tbWVudCBOT0RFLCBhbGlnbmluZyBjb250aW51YXRpb24gbGluZXMuClJldHVybiB0IGlm
IE5PREUgaXMgYSBjb21tZW50IGFuZCB3YXMgZmlsbGVkLCBuaWwgb3RoZXJ3aXNlLgpKVVNUSUZZ
IGlzIGFzIGluIGBmaWxsLXBhcmFncmFwaCcuIgogICh3aGVuIChzYXZlLWV4Y3Vyc2lvbgogICAg
ICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQogICAgICAgICAgKGxv
b2tpbmctYXQtcCAiPCEtLSIpKQogICAgKGxldCAoKGZpbGwtcHJlZml4IChzYXZlLWV4Y3Vyc2lv
bgogICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0
IG5vZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgKG1ha2Utc3RyaW5nICgrIChjdXJyZW50
LWNvbHVtbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3Ro
ICI8IS0tICIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID9ccykpKQog
ICAgICAgICAgKGFkYXB0aXZlLWZpbGwtZnVuY3Rpb24gbmlsKQogICAgICAgICAgKGZpbGwtZm9y
d2FyZC1wYXJhZ3JhcGgtZnVuY3Rpb24gIydmb3J3YXJkLXBhcmFncmFwaCkKICAgICAgICAgIChm
aWxsLXBhcmFncmFwaC1mdW5jdGlvbiBuaWwpKQogICAgICAoc2F2ZS1yZXN0cmljdGlvbgogICAg
ICAgIChuYXJyb3ctdG8tcmVnaW9uICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWVuZCBub2RlKSkKICAgICAgICAoZmlsbC1w
YXJhZ3JhcGgganVzdGlmeSkpCiAgICAgIHQpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tYmxvY2st
cXVvdGUtcHJlZml4ICgpCiAgIlJldHVybiB0aGUgYmxvY2sgcXVvdGUgcHJlZml4IHN0cmluZyBm
cm9tIHRoZSBjdXJyZW50IGxpbmUuClJlYWQgdGhlIGFjdHVhbCBgPicgbWFya2VycyAod2l0aCB3
aGF0ZXZlciBzcGFjaW5nIHRoZSB1c2VyIHdyb3RlKQpmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhl
IGxpbmUgc28gdGhhdCBmaWxsIHByZXNlcnZlcyB0aGUgZXhpc3RpbmcKc3R5bGUgKGUuZy4sIGA+
Pj4gJyBzdGF5cyBgPj4+ICcsIGA+ID4gPiAnIHN0YXlzIGA+ID4gPiAnKS4iCiAgKHNhdmUtZXhj
dXJzaW9uCiAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCiAgICAoaWYgKGxvb2tpbmctYXQgIlxcKFs+
IFx0XSo+XFwpWyBcdF0qIikKICAgICAgICAoY29uY2F0IChtYXRjaC1zdHJpbmcgMCkpCiAgICAg
ICI+ICIpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tZmlsbC1ibG9jay1xdW90ZSAoanVzdGlmeSkK
ICAiRmlsbCB0aGUgcGFyYWdyYXBoIGF0IHBvaW50IGluc2lkZSBhIGJsb2NrIHF1b3RlLgpGaW5k
IHRoZSBwYXJhZ3JhcGggbm9kZSBhdCBwb2ludCB3aXRoaW4gdGhlIGJsb2NrIHF1b3RlIGFuZCBm
aWxsCm9ubHkgdGhhdCBwYXJhZ3JhcGgsIHByZXNlcnZpbmcgdGhlIGA+ICcgcHJlZml4LiAgV2hl
biB0aGUKcGFyYWdyYXBoIGlzIGluc2lkZSBhIGxpc3QgaXRlbSwgYWxpZ24gY29udGludWF0aW9u
IGxpbmVzIHdpdGgKdGhlIGl0ZW0ncyB0ZXh0IGNvbHVtbi4gIEpVU1RJRlkgaXMgYXMgaW4gYGZp
bGwtcGFyYWdyYXBoJy4iCiAgOzsgU2tpcCBwYXN0IGA+ICcgbWFya2VycyBhbmQgYW55IGxpc3Qg
bWFya2VyIHRvIGxhbmQgaW5zaWRlIHRoZQogIDs7IGNvbnRlbnQsIHdoZXJlIHRoZSBwYXJhZ3Jh
cGggbm9kZSBsaXZlcy4KICAobGV0KiAoKGNvbnRlbnQtcG9zIChzYXZlLWV4Y3Vyc2lvbgogICAg
ICAgICAgICAgICAgICAgICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCiAgICAgICAgICAgICAgICAg
ICAgICAgIChza2lwLWNoYXJzLWZvcndhcmQgIj4gXHQiKQogICAgICAgICAgICAgICAgICAgICAg
ICA7OyBJZiB3ZSBsYW5kIG9uIGEgbGlzdCBtYXJrZXIsIHNraXAgcGFzdCBpdC4KICAgICAgICAg
ICAgICAgICAgICAgICAgKHdoZW4gKGxvb2tpbmctYXQgIlstKitdIFxcfFswLTldK1suKV1ccyIp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAobWF0Y2gtZW5kIDApKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgKG1pbiAoMSsgKHBvaW50KSkgKHBvaW50LW1heCkpKSkKICAg
ICAgICAgKG5vZGUgKHRyZWVzaXQtbm9kZS1hdCBjb250ZW50LXBvcyAnbWFya2Rvd24pKQogICAg
ICAgICAocGFyYSAodHJlZXNpdC1wYXJlbnQtdW50aWwKICAgICAgICAgICAgICAgIG5vZGUgKGxh
bWJkYSAobikKICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBl
IG4pICJwYXJhZ3JhcGgiKSkpKSkKICAgICh3aGVuIHBhcmEKICAgICAgOzsgVGhlIGdyYW1tYXIg
bWF5IGluY2x1ZGUgdHJhaWxpbmcgYmxvY2tfY29udGludWF0aW9uIG5vZGVzCiAgICAgIDs7IChi
bGFuayBgPiA+JyBsaW5lcykgYXMgY2hpbGRyZW4gb2YgdGhlIHBhcmFncmFwaC4gIFVzZSB0aGUK
ICAgICAgOzsgZW5kIG9mIHRoZSBsYXN0IGlubGluZSBjaGlsZCBzbyBmaWxsIGRvZXMgbm90IG1l
cmdlIGFjcm9zcwogICAgICA7OyB3aGF0IHNob3VsZCBiZSBhIHBhcmFncmFwaCBib3VuZGFyeS4K
ICAgICAgKGxldCogKChsYXN0LWlubGluZQogICAgICAgICAgICAgIChzZXEtZmluZCAobGFtYmRh
IChjaGlsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWwgKHRyZWVzaXQtbm9kZS10
eXBlIGNoaWxkKSAiaW5saW5lIikpCiAgICAgICAgICAgICAgICAgICAgICAgIChyZXZlcnNlICh0
cmVlc2l0LW5vZGUtY2hpbGRyZW4gcGFyYSkpKSkKICAgICAgICAgICAgIChwYXJhLWVuZCAoaWYg
bGFzdC1pbmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1lbmQg
bGFzdC1pbmxpbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWVuZCBw
YXJhKSkpCiAgICAgICAgICAgICAoYnEtcHJlZml4IChtYXJrZG93bi10cy0tYmxvY2stcXVvdGUt
cHJlZml4KSkKICAgICAgICAgICAgIDs7IFdoZW4gaW5zaWRlIGEgbGlzdCBpdGVtLCBleHRlbmQg
dGhlIHByZWZpeCB3aXRoIHNwYWNlcwogICAgICAgICAgICAgOzsgc28gY29udGludWF0aW9uIGxp
bmVzIGFsaWduIHdpdGggdGhlIGl0ZW0ncyB0ZXh0LgogICAgICAgICAgICAgKGxpc3QtaXRlbSAo
dHJlZXNpdC1wYXJlbnQtdW50aWwgcGFyYSAiXFxgbGlzdF9pdGVtXFwnIikpCiAgICAgICAgICAg
ICAocHJlZml4IChpZiBsaXN0LWl0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQqICgo
dGV4dC1jb2wgKG1hcmtkb3duLXRzLS1saXN0LWl0ZW0tdGV4dC1jb2x1bW4KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QtaXRlbSkpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGV4dHJhIChtYXggMCAoLSB0ZXh0LWNvbCAobGVuZ3RoIGJxLXBy
ZWZpeCkpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQgYnEtcHJlZml4ICht
YWtlLXN0cmluZyBleHRyYSA/XHMpKSkKICAgICAgICAgICAgICAgICAgICAgICBicS1wcmVmaXgp
KQogICAgICAgICAgICAgKGFkYXB0aXZlLWZpbGwtZnVuY3Rpb24gbmlsKQogICAgICAgICAgICAg
KGZpbGwtZm9yd2FyZC1wYXJhZ3JhcGgtZnVuY3Rpb24gIydmb3J3YXJkLXBhcmFncmFwaCkKICAg
ICAgICAgICAgIChmaWxsLXBhcmFncmFwaC1mdW5jdGlvbiBuaWwpKQogICAgICAgIChzYXZlLXJl
c3RyaWN0aW9uCiAgICAgICAgICA7OyBOYXJyb3cgdG8gdGhlIGZ1bGwgbGluZXMgb2YgdGhlIHBh
cmFncmFwaCBzbyB0aGF0IHRoZQogICAgICAgICAgOzsgYD4gJyBtYXJrZXJzIGFyZSBpbmNsdWRl
ZCBpbiB0aGUgZmlsbCByZWdpb24uCiAgICAgICAgICAobmFycm93LXRvLXJlZ2lvbgogICAgICAg
ICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2Rl
LXN0YXJ0IHBhcmEpKQogICAgICAgICAgICAgKGJlZ2lubmluZy1vZi1saW5lKQogICAgICAgICAg
ICAgKHBvaW50KSkKICAgICAgICAgICBwYXJhLWVuZCkKICAgICAgICAgIChsZXQgKChmaWxsLXBy
ZWZpeCBwcmVmaXgpKQogICAgICAgICAgICAoZmlsbC1wYXJhZ3JhcGgganVzdGlmeSkpKSkpKQog
IHQpCgo7OzsgQ29kZSBibG9ja3M6CgooZGVmdmFyLWxvY2FsIG1hcmtkb3duLXRzLS1jb2RlLWJs
b2NrLWxhbmd1YWdlcyBuaWwKICAiQWxpc3QgbWFwcGluZyBsYW5ndWFnZSBub2RlIG5hbWVzIHRv
IHRzIGxhbmd1YWdlLgpJZiBhIGxhbmd1YWdlIGlzIG5vdCBhIHRzIGxhbmd1YWdlIG9yIGlzIG5v
dCBtYXBwZWQgdG8gb25lLCBpdCB3aWxsIGJlCmluIGBtYXJrZG93bi10cy0tY29kZS1ibG9jay1u
b24tdHMtbW9kZXMnLiIpCgooZGVmdmFyLWxvY2FsIG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLW5v
bi10cy1tb2RlcyBuaWwKICAiQWxpc3QgbWFwcGluZyBsYW5ndWFnZXMgdG8gbm9uLXRyZWUtc2l0
dGVyIG1vZGVzIGZvciBjb2RlIGJsb2Nrcy4KUG9wdWxhdGVkIGJ5IGBtYXJrZG93bi10cy0tY29k
ZS1ibG9jay10cy1sYW5ndWFnZScgdG8gaWRlbnRpZnkgYQpjb2RlLWJsb2NrIGxhbmd1YWdlIG1v
ZGUgd2hpY2ggaXMgbm90IGEgdHJlZS1zaXR0ZXIgbW9kZSBvciBmb3Igd2hpY2gKdGhlIHRyZWUt
c2l0dGVyIGdyYW1tYXIgaXMgdW5hdmFpbGFibGUuIikKCihkZWZ1biBtYXJrZG93bi10cy0taGFy
dmVzdC1tb2RlLXRyZWVzaXQtY29uZmlndXJhdGlvbiAobW9kZSkKICAiSGFydmVzdCB0cmVlLXNp
dHRlciBjb25maWd1cmF0aW9uIGZyb20gTU9ERS4KUmV0dXJuIGEgcGxpc3Qgd2l0aCB0aGUgZm9s
bG93aW5nIGtleXMgYW5kIHZhbHVlczoKCiAgICA6Zm9udC1sb2NrIChmcm9tIGB0cmVlc2l0LWZv
bnQtbG9jay1zZXR0aW5ncycpCiAgICA6c2ltcGxlLWluZGVudCAoZnJvbSBgdHJlZXNpdC1zaW1w
bGUtaW5kZW50LXJ1bGVzJykKICAgIDpyYW5nZSAoZnJvbSBgdHJlZXNpdC1yYW5nZS1zZXR0aW5n
cycpIgogICh3aXRoLXdvcmstYnVmZmVyCiAgICAobWFya2Rvd24tdHMtLWluaGliaXQtbWVzc2Fn
ZXMtYW5kLXdhcm5pbmdzCiAgICAgICdtYXJrZG93bi10cy1pbmhpYml0LWNvZGUtYmxvY2stbW9k
ZS13YXJuaW5ncwogICAgICAoZGVsYXktbW9kZS1ob29rcyAoZnVuY2FsbCBtb2RlKSkpCiAgICAo
bGlzdCA6bGFuZ3VhZ2UgKHRyZWVzaXQtbGFuZ3VhZ2UtYXQgKHBvaW50LW1pbikpCiAgICAgICAg
ICA6Zm9udC1sb2NrIHRyZWVzaXQtZm9udC1sb2NrLXNldHRpbmdzCiAgICAgICAgICA6c2ltcGxl
LWluZGVudCB0cmVlc2l0LXNpbXBsZS1pbmRlbnQtcnVsZXMKICAgICAgICAgIDpyYW5nZSB0cmVl
c2l0LXJhbmdlLXNldHRpbmdzKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWNvbmZpZ3VyZS1jdXJy
ZW50LWJ1ZmZlciAoY29uZmlndXJhdGlvbikKICAiQWRkIENPTkZJR1VSQVRJT04gdG8gdGhlIGN1
cnJlbnQgYnVmZmVyLgpDT05GSUdVUkFUSU9OIGluY2x1ZGVzIGZvbnQtbG9jayBhbmQgaW5kZW50
IHJ1bGVzLiAgRm9yIGZvbnQtbG9jayBydWxlcywKdXNlIHRoZSBzYW1lIGZlYXR1cmVzIGVuYWJs
ZWQgaW4gTU9ERS4iCiAgKHNldHEgdHJlZXNpdC1mb250LWxvY2stc2V0dGluZ3MKICAgICAgICAo
YXBwZW5kIHRyZWVzaXQtZm9udC1sb2NrLXNldHRpbmdzCiAgICAgICAgICAgICAgICA7OyBHZXQg
YWxsIHRoZSBmb250LWxvY2sgc2V0dGluZ3MsIGluY2x1ZGluZyBvbmVzIHRoYXQKICAgICAgICAg
ICAgICAgIDs7IGRvbid0IHBlcnRhaW4gdG8gTU9ERS4gIFRoaXMgd2F5LCB3ZSBnZXQganNkb2MK
ICAgICAgICAgICAgICAgIDs7IGZyb20ganMtdHMtbW9kZSwgZm9yIGV4YW1wbGUuCiAgICAgICAg
ICAgICAgICAocGxpc3QtZ2V0IGNvbmZpZ3VyYXRpb24gOmZvbnQtbG9jaykpKQogIChzZXRxIHRy
ZWVzaXQtc2ltcGxlLWluZGVudC1ydWxlcwogICAgICAgIChhcHBlbmQgdHJlZXNpdC1zaW1wbGUt
aW5kZW50LXJ1bGVzCiAgICAgICAgICAgICAgICA7OyBTaW1pbGFybHksIGdldCBhbGwgaW5kZW50
IHJ1bGVzLgogICAgICAgICAgICAgICAgKHBsaXN0LWdldCBjb25maWd1cmF0aW9uIDpzaW1wbGUt
aW5kZW50KSkpCiAgICAoc2V0cSB0cmVlc2l0LXJhbmdlLXNldHRpbmdzCiAgICAgICAgICAoYXBw
ZW5kIHRyZWVzaXQtcmFuZ2Utc2V0dGluZ3MKICAgICAgICAgICAgICAgICAgOzsgRmlsdGVyIG91
dCBmdW5jdGlvbiBxdWVyaWVzLCBiZWNhdXNlIHRoZXkgYXJlCiAgICAgICAgICAgICAgICAgIDs7
IHVzdWFsbHkgc29tZSBoYWNrIGFuZCBtaWdodCBlc2NhcGUgdGhlIGNvZGUgYmxvY2suCiAgICAg
ICAgICAgICAgICAgIDs7IENhc2UgaW4gcG9pbnQ6IGMtdHMtbW9kZSdzIHJhbmdlIHNldHRpbmcu
CiAgICAgICAgICAgICAgICAgIChzZXEtZmlsdGVyIChsYW1iZGEgKHNldHRpbmcpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAoZnVuY3Rpb25wIChjYXIgc2V0dGluZykpKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsaXN0LWdldCBjb25maWd1cmF0aW9uIDpy
YW5nZSkpKSkKICAoc2V0cS1sb2NhbCBpbmRlbnQtbGluZS1mdW5jdGlvbiAjJ3RyZWVzaXQtaW5k
ZW50KQogIChzZXRxLWxvY2FsIGluZGVudC1yZWdpb24tZnVuY3Rpb24gIyd0cmVlc2l0LWluZGVu
dC1yZWdpb24pKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1sYW5ndWFnZS1hdC1ub2RlIChub2RlKQog
ICJSZXR1cm4gdGhlIGxhbmd1YWdlIHN5bWJvbCBmb3IgY29kZV9mZW5jZV9jb250ZW50IE5PREUu
IgogICh3aGVuLWxldCogKChwYXJlbnQgKHRyZWVzaXQtbm9kZS1wYXJlbnQgbm9kZSkpCiAgICAg
ICAgICAgICAgKGxhbmctbm9kZSAod2hlbiBwYXJlbnQKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKHRyZWVzaXQtc2VhcmNoLXN1YnRyZWUgcGFyZW50ICJcXGBsYW5ndWFnZVxcJyIpKSkpCiAg
ICAoaW50ZXJuICh0cmVlc2l0LW5vZGUtdGV4dCBsYW5nLW5vZGUgdCkpKSkKCihkZWZ2YXItbG9j
YWwgbWFya2Rvd24tdHMtLW5vbi10cy1mb250aWZ5LWNhY2hlIChtYWtlLWhhc2gtdGFibGUgOnRl
c3QgIydlcXVhbCkKICAiQ2FjaGUgZm9yIG5vbi10cmVlLXNpdHRlciBjb2RlIGJsb2NrIGZvbnRp
ZmljYXRpb24uCktleXMgYXJlIChMQU5HIC4gQ09OVEVOVC1IQVNIKSBjb25zIGNlbGxzLCB2YWx1
ZXMgYXJlIGxpc3RzIG9mClwoT0ZGU0VULVNUQVJUIE9GRlNFVC1FTkQgRkFDRSkgdHJpcGxlcy4i
KQoKKGRlZnZhci1sb2NhbCBtYXJrZG93bi10cy0tbm9uLXRzLWZvbnRpZnktY2FjaGUtdGljayBu
aWwKICAiRm9yIGJsdW50IGBidWZmZXItY2hhcnMtbW9kaWZpZWQtdGljaycgY2FjaGUgaW52YWxp
ZGF0aW9uLiIpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZvbnRpZnktbm9uLXRzLWNvZGUtYmxvY2sg
KG5vZGUgb3ZlcnJpZGUgc3RhcnQgZW5kICZyZXN0IF8pCiAgIkZvbnRpZnkgY29kZV9mZW5jZV9j
b250ZW50IE5PREUgdXNpbmcgYSBub24tdHJlZS1zaXR0ZXIgbW9kZS4KQXBwbHkgdGhlIGNvZGUt
YmxvY2sgbW9kZSdzIGNvbnZlbnRpb25hbCBmb250LWxvY2sgaW4gYSB0ZW1wb3JhcnkKYnVmZmVy
LiAgT1ZFUlJJREUsIFNUQVJULCBhbmQgRU5EIGFyZSBwYXNzZWQgdGhyb3VnaCB0bwpgdHJlZXNp
dC1mb250aWZ5LXdpdGgtb3ZlcnJpZGUnLgoKQ2FjaGUgcmVzdWx0cyB0byBhdm9pZCBmb250aWZp
Y2F0aW9uIG9mIHVuY2hhbmdlZCBjb2RlIGJsb2Nrcy4KCk5PREUgc2hvdWxkIGFscmVhZHkgaGF2
ZSBwYXNzZWQgdGhyb3VnaApgbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stdHMtbGFuZ3VhZ2UnIHdo
aWNoIG1heSBoYXZlIGNsYXNzaWZpZWQgdGhpcwpub2RlIGFzIGEgbm9uLXRzIG1vZGUuIgogICh3
aGVuLWxldCogKChfIG1hcmtkb3duLXRzLWZvbnRpZnktY29kZS1ibG9ja3MtbmF0aXZlbHkpCiAg
ICAgICAgICAgICAgKGxhbmcgKG1hcmtkb3duLXRzLS1sYW5ndWFnZS1hdC1ub2RlIG5vZGUpKQog
ICAgICAgICAgICAgIChtb2RlIChhbGlzdC1nZXQgbGFuZyBtYXJrZG93bi10cy0tY29kZS1ibG9j
ay1ub24tdHMtbW9kZXMpKQogICAgICAgICAgICAgICh0aWNrIChidWZmZXItY2hhcnMtbW9kaWZp
ZWQtdGljaykpCiAgICAgICAgICAgICAgKGJsb2NrLXN0YXJ0ICh0cmVlc2l0LW5vZGUtc3RhcnQg
bm9kZSkpCiAgICAgICAgICAgICAgOzsgQ2Fubm90IHVzZSBtYXJrZXJzICdtYXJrZG93bi10cy1j
b2RlLWJlZy1tYXJrZXIKICAgICAgICAgICAgICA7OyAnbWFya2Rvd24tdHMtY29kZS1lbmQtbWFy
a2VyIHRoZXkgYXJlIHNldCBhZnRlciB0aGlzCiAgICAgICAgICAgICAgOzsgZnVuY3Rpb24gcnVu
cy4KICAgICAgICAgICAgICAobm9kZS1zdGFydCAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1zdGFydCBub2RlKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5lLWJlZ2lubmluZy1wb3NpdGlvbikpKQogICAg
ICAgICAgICAgIChub2RlLWVuZCAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAgICAg
ICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtZW5kIG5vZGUpKQogICAgICAgICAgICAgICAg
ICAgICAgICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQiKQogICAgICAgICAgICAgICAgICAg
ICAgICAgIChwb2ludCkpKSkKICAgICh3aGVuICg+IG5vZGUtZW5kIG5vZGUtc3RhcnQpCiAgICAg
ICh1bmxlc3MgKGVxIHRpY2sgbWFya2Rvd24tdHMtLW5vbi10cy1mb250aWZ5LWNhY2hlLXRpY2sp
CiAgICAgICAgKGNscmhhc2ggbWFya2Rvd24tdHMtLW5vbi10cy1mb250aWZ5LWNhY2hlKSkKICAg
ICAgKGxldCogKChjYWNoZS1rZXkgKGNvbnMgbGFuZyAoc2VjdXJlLWhhc2gKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYTI1NgogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoY3VycmVudC1idWZmZXIpIG5vZGUtc3RhcnQgbm9kZS1lbmQpKSkKICAgICAg
ICAgICAgIChwcm9wcwogICAgICAgICAgICAgIChvciAoZ2V0aGFzaCBjYWNoZS1rZXkKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtLW5vbi10cy1mb250aWZ5LWNhY2hlKQog
ICAgICAgICAgICAgICAgICAobGV0ICgocmVzdWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAo
bWFya2Rvd24tdHMtLWZvbnRpZnktbm9uLXRzLWNvbGxlY3QtZmFjZXMKICAgICAgICAgICAgICAg
ICAgICAgICAgICBtb2RlIG5vZGUtc3RhcnQgbm9kZS1lbmQpKSkKICAgICAgICAgICAgICAgICAg
ICAocHV0aGFzaCBjYWNoZS1rZXkgcmVzdWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bWFya2Rvd24tdHMtLW5vbi10cy1mb250aWZ5LWNhY2hlKQogICAgICAgICAgICAgICAgICAgIChz
ZXRxIG1hcmtkb3duLXRzLS1ub24tdHMtZm9udGlmeS1jYWNoZS10aWNrIHRpY2spCiAgICAgICAg
ICAgICAgICAgICAgcmVzdWx0KSkpKQogICAgICAgIChkb2xpc3QgKHJhbmdlIHByb3BzKQogICAg
ICAgICAgKHRyZWVzaXQtZm9udGlmeS13aXRoLW92ZXJyaWRlCiAgICAgICAgICAgKG50aCAwIHJh
bmdlKQogICAgICAgICAgIChudGggMSByYW5nZSkKICAgICAgICAgICAobnRoIDIgcmFuZ2UpCiAg
ICAgICAgICAgb3ZlcnJpZGUgc3RhcnQgZW5kKSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWZv
bnRpZnktbm9uLXRzLWNvbGxlY3QtZmFjZXMgKG1vZGUgYmVnIGVuZCkKICAiUnVuIE1PREUgb24g
dGhlIEJFRy4uRU5EIHJlZ2lvbidzIHRleHQgYW5kIGhhcnZlc3QgZmFjZSBwcm9wZXJ0aWVzLgpS
ZXR1cm4gYSBsaXN0IG9mIChCVUYtQkVHIEJVRi1FTkQgRkFDRSkgdHJpcGxlcyBpbiBiYXNlLWJ1
ZmZlcgpjb29yZGluYXRlcy4KCkZvciBub24tdHJlZS1zaXR0ZXIgbW9kZXMgdXNlIGFuIGluZGly
ZWN0IGJ1ZmZlciBuYXJyb3dlZCB0byBCRUcuLkVORDoKcmVnZXgvc3ludGFjdGljIGZvbnQtbG9j
ayBob25vcnMgbmFycm93aW5nIGFuZCB0aGUgaW5kaXJlY3QgYnVmZmVyCnNoYXJlcyB0ZXh0IHdp
dGggdGhlIGJhc2UsIHNvIHRoaXMgaXMgbGVzcyBleHBlbnNpdmUgYW5kIGNvcHktZnJlZS4KCkZv
ciB0cyBtb2RlcyBpbiBgbWFya2Rvd24tdHMtY29kZS1ibG9jay1mb3JjZS1jb252ZW50aW9uYWwt
bW9kZXMnLCBmYWxsCmJhY2sgdG8gYSB0ZW1wIGJ1ZmZlci4gIEEgcGFyc2VyIGNyZWF0ZWQgaW4g
dGhlIHNvdXJjZSBidWZmZXIgZG9lcyBub3QKcmVhY3QgdG8gbmFycm93aW5nIGluIGFuIGluZGly
ZWN0IGJ1ZmZlciBkZXJpdmVkIGZyb20gaXQgKG9ubHkgcGFyc2VycwpjcmVhdGVkIGluIHRoYXQg
aW5kaXJlY3QgYnVmZmVyIHdvdWxkIGhvbm9yIGl0cyBuYXJyb3dpbmcpLCBzbyByZXVzaW5nCnRo
ZSBob3N0IHBhcnNlciB2aWEgYW4gaW5kaXJlY3QgYnVmZmVyIGlzIG5vdCBhbiBvcHRpb24gaGVy
ZS4gIEFuZCBpbgp0aGUgaG9zdCBidWZmZXIgaXRzZWxmLCB0aGUgaW5uZXIgY29udGVudCBvZiBh
IGZlbmNlZCBjb2RlIGJsb2NrIGlzCmp1c3Qgb3BhcXVlIHRleHQgaW5zaWRlIGEgYGNvZGVfZmVu
Y2VfY29udGVudCcgbm9kZSwgbmV2ZXIgcmUtcGFyc2VkCmFzIGEgZnJlc2ggZG9jdW1lbnQuICBB
IHRlbXAgYnVmZmVyIHdpdGggYSBmcmVzaCBwYXJzZXIgc2VlcyB0aGUgaW5uZXIKY29udGVudCBh
cyBhIHN0YW5kYWxvbmUgbWFya2Rvd24gZG9jdW1lbnQsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4i
CiAgKGNvbmQgKChtZW1xIG1vZGUgbWFya2Rvd24tdHMtY29kZS1ibG9jay1mb3JjZS1jb252ZW50
aW9uYWwtbW9kZXMpCiAgICAgICAgIChsZXQgKChjb250ZW50IChidWZmZXItc3Vic3RyaW5nLW5v
LXByb3BlcnRpZXMgYmVnIGVuZCkpCiAgICAgICAgICAgICAgIHJlcykKICAgICAgICAgICAod2l0
aC13b3JrLWJ1ZmZlcgogICAgICAgICAgICAgKGluc2VydCBjb250ZW50KQogICAgICAgICAgICAg
KG1hcmtkb3duLXRzLS1pbmhpYml0LW1lc3NhZ2VzLWFuZC13YXJuaW5ncwogICAgICAgICAgICAg
ICAnbWFya2Rvd24tdHMtaW5oaWJpdC1jb2RlLWJsb2NrLW1vZGUtd2FybmluZ3MKICAgICAgICAg
ICAgICAgKGRlbGF5LW1vZGUtaG9va3MKICAgICAgICAgICAgICAgICAobGV0ICgobWFya2Rvd24t
dHMtLXNldC11cC1pbmxpbmUgdCkpCiAgICAgICAgICAgICAgICAgICAobWFya2Rvd24tdHMtbW9k
ZSkpKSkKICAgICAgICAgICAgIChmb250LWxvY2stZW5zdXJlKQogICAgICAgICAgICAgKGxldCAo
KHBvcyAocG9pbnQtbWluKSkpCiAgICAgICAgICAgICAgICh3aGlsZSAoPCBwb3MgKHBvaW50LW1h
eCkpCiAgICAgICAgICAgICAgICAgKGxldCAoKG5leHQgKG5leHQtc2luZ2xlLXByb3BlcnR5LWNo
YW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgJ2ZhY2UgbmlsIChwb2ludC1t
YXgpKSkKICAgICAgICAgICAgICAgICAgICAgICAoZmFjZSAoZ2V0LXRleHQtcHJvcGVydHkgcG9z
ICdmYWNlKSkpCiAgICAgICAgICAgICAgICAgICAod2hlbiBmYWNlCiAgICAgICAgICAgICAgICAg
ICAgIDs7IFRyYW5zbGF0ZSB0ZW1wLWJ1ZmZlciBvZmZzZXRzIGJhY2sgdG8gYmFzZS1idWZmZXIK
ICAgICAgICAgICAgICAgICAgICAgOzsgcG9zaXRpb25zOiB0ZW1wIGBwb2ludC1taW4nIGNvcnJl
c3BvbmRzIHRvIEJFRy4KICAgICAgICAgICAgICAgICAgICAgKHB1c2ggKGxpc3QgKCsgYmVnICgx
LSBwb3MpKSAoKyBiZWcgKDEtIG5leHQpKSBmYWNlKQogICAgICAgICAgICAgICAgICAgICAgICAg
ICByZXMpKQogICAgICAgICAgICAgICAgICAgKHNldHEgcG9zIG5leHQpKSkpKQogICAgICAgICAg
IChucmV2ZXJzZSByZXMpKSkKICAgICAgICAodAogICAgICAgICAobGV0ICgoaW5kaXJlY3QtYnVm
ZmVyIChtYWtlLWluZGlyZWN0LWJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoY3VycmVudC1idWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZW5l
cmF0ZS1uZXctYnVmZmVyLW5hbWUgKGJ1ZmZlci1uYW1lKSkKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbmlsICdpbmhpYml0LWJ1ZmZlci1ob29rcykpCiAgICAgICAgICAgICAgIHJl
cykKICAgICAgICAgICAodW53aW5kLXByb3RlY3QKICAgICAgICAgICAgICAgKHdpdGgtY3VycmVu
dC1idWZmZXIgaW5kaXJlY3QtYnVmZmVyCiAgICAgICAgICAgICAgICAgKG1hcmtkb3duLXRzLS1p
bmhpYml0LW1lc3NhZ2VzLWFuZC13YXJuaW5ncwogICAgICAgICAgICAgICAgICAgJ21hcmtkb3du
LXRzLWluaGliaXQtY29kZS1ibG9jay1tb2RlLXdhcm5pbmdzCiAgICAgICAgICAgICAgICAgICAo
ZGVsYXktbW9kZS1ob29rcyAoZnVuY2FsbCBtb2RlKSkpCiAgICAgICAgICAgICAgICAgKG5hcnJv
dy10by1yZWdpb24gYmVnIGVuZCkKICAgICAgICAgICAgICAgICAoZm9udC1sb2NrLWVuc3VyZSkK
ICAgICAgICAgICAgICAgICAobGV0ICgocG9zIChwb2ludC1taW4pKSkKICAgICAgICAgICAgICAg
ICAgICh3aGlsZSAoPCBwb3MgKHBvaW50LW1heCkpCiAgICAgICAgICAgICAgICAgICAgIChsZXQg
KChuZXh0IChuZXh0LXNpbmdsZS1wcm9wZXJ0eS1jaGFuZ2UKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHBvcyAnZmFjZSBuaWwgKHBvaW50LW1heCkpKQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAoZmFjZSAoZ2V0LXRleHQtcHJvcGVydHkgcG9zICdmYWNlKSkpCiAgICAgICAg
ICAgICAgICAgICAgICAgKHdoZW4gZmFjZQogICAgICAgICAgICAgICAgICAgICAgICAgKHB1c2gg
KGxpc3QgcG9zIG5leHQgZmFjZSkgcmVzKSkKICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBw
b3MgbmV4dCkpKSkpCiAgICAgICAgICAgICAoa2lsbC1idWZmZXIgaW5kaXJlY3QtYnVmZmVyKSkK
ICAgICAgICAgICAobnJldmVyc2UgcmVzKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tY29kZS1i
bG9jay1sYW5ndWFnZS1tb2RlIChsYW5nKQogICJDb21wdXRlIGFuZCBjYWNoZSBhIG1vZGUgc3lt
Ym9sIGZyb20gTEFORywgYSBzeW1ib2wuCkNvbnN1bHQgdGhlIGBtYXJrZG93bi10cy1jb2RlLWJs
b2NrLW1vZGVzJyBjYWNoZSwgb3IgY29uc3VsdApgdHJlZXNpdC1tYWpvci1tb2RlLXJlbWFwLWFs
aXN0JyBhbmQgYG1ham9yLW1vZGUtcmVtYXAtYWxpc3QnLCBvciBicnV0ZQpmb3JjZSBtb2RlIHBy
b2JlLiAgUmV0dXJuIGEgdmFsaWQgbW9kZSBzeW1ib2wgb3IgbmlsLiIKICAoaWYtbGV0KiAoKG1h
cHBlZC1tb2RlIChjYXIgKGFsaXN0LWdldCBsYW5nIG1hcmtkb3duLXRzLWNvZGUtYmxvY2stbW9k
ZXMpKSkpCiAgICAgIG1hcHBlZC1tb2RlCiAgICAobGV0KiAoKGxhbmctc3RyaW5nIChzeW1ib2wt
bmFtZSBsYW5nKSkKICAgICAgICAgICAobGFuZy1tb2RlIChjb25jYXQgbGFuZy1zdHJpbmcgIi1t
b2RlIikpCiAgICAgICAgICAgKG1vZGUpKQogICAgICAoaWYgKHNldHEgbW9kZSAoYWxpc3QtZ2V0
IGxhbmctbW9kZSB0cmVlc2l0LW1ham9yLW1vZGUtcmVtYXAtYWxpc3QpKQogICAgICAgICAgbW9k
ZQogICAgICAgIChpZiAoc2V0cSBtb2RlIChhbGlzdC1nZXQgbGFuZy1tb2RlIG1ham9yLW1vZGUt
cmVtYXAtYWxpc3QpKQogICAgICAgICAgICBtb2RlCiAgICAgICAgICAoY2F0Y2ggOm1vZGUKICAg
ICAgICAgICAgKGRvbGlzdCAobW9kZQogICAgICAgICAgICAgICAgICAgICAobGlzdAogICAgICAg
ICAgICAgICAgICAgICAgOzsgVHJ5IGEgdHJlZXNpdCBtb2RlIHVzaW5nIHRoZSByYXcgc3RyaW5n
LgogICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCBsYW5nLXN0cmluZyAiLXRzLW1vZGUiKQog
ICAgICAgICAgICAgICAgICAgICAgOzsgVHJ5IGEgY29udmVudGlvbmFsIG1vZGUgdXNpbmcgdGhl
IHJhdyBzdHJpbmcuCiAgICAgICAgICAgICAgICAgICAgICBsYW5nLW1vZGUKICAgICAgICAgICAg
ICAgICAgICAgIDs7IFRyeSBhIHRyZWVzaXQgbW9kZSB1c2luZyB0aGUgZG93bmNhc2VkIHN0cmlu
Zy4KICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQgKGRvd25jYXNlIGxhbmctc3RyaW5nKSAi
LXRzLW1vZGUiKQogICAgICAgICAgICAgICAgICAgICAgOzsgVHJ5IGEgY29udmVudGlvbmFsIG1v
ZGUgdXNpbmcgdGhlIGRvd25jYXNlZCBzdHJpbmcuCiAgICAgICAgICAgICAgICAgICAgICAoY29u
Y2F0IChkb3duY2FzZSBsYW5nLXN0cmluZykgIi1tb2RlIikpKQogICAgICAgICAgICAgIChzZXRx
IG1vZGUgKGludGVybiBtb2RlKSkKICAgICAgICAgICAgICAod2hlbiAoZmJvdW5kcCBtb2RlKQog
ICAgICAgICAgICAgICAgKHB1c2ggKGxpc3QgbGFuZyBtb2RlKSBtYXJrZG93bi10cy1jb2RlLWJs
b2NrLW1vZGVzKQogICAgICAgICAgICAgICAgKHRocm93IDptb2RlIG1vZGUpKSkpKSkpKSkKCihk
ZWZ1biBtYXJrZG93bi10cy0tY29kZS1ibG9jay10cy1sYW5ndWFnZSAobm9kZSkKICAiQ29udmVy
dCBOT0RFIHRvIGEgbGFuZ3VhZ2UgZm9yIHRoZSBjb2RlIGJsb2NrLiIKICAobGV0KiAoKGxhbmcg
KGludGVybiAodHJlZXNpdC1ub2RlLXRleHQgbm9kZSkpKQogICAgICAgICAobW9kZSAobWFya2Rv
d24tdHMtLWNvZGUtYmxvY2stbGFuZ3VhZ2UtbW9kZSBsYW5nKSkKICAgICAgICAgKHRzLWxhbmd1
YWdlIChhbGlzdC1nZXQgbGFuZyBtYXJrZG93bi10cy0tY29kZS1ibG9jay1sYW5ndWFnZXMpKQog
ICAgICAgICAobm9uLXRzLWxhbmd1YWdlIChhbGlzdC1nZXQgbGFuZyBtYXJrZG93bi10cy0tY29k
ZS1ibG9jay1ub24tdHMtbW9kZXMpKSkKICAgIChjb25kCiAgICAgKChmYm91bmRwIG1vZGUpCiAg
ICAgIChjb25kCiAgICAgICA7OyBSZXR1cm4ga25vd24gdHJlZXNpdCBsYW5ndWFnZS4KICAgICAg
ICh0cy1sYW5ndWFnZSB0cy1sYW5ndWFnZSkKICAgICAgIDs7IFJldHVybiBuaWwgZm9yIGtub3du
IG5vbi10cmVlc2l0IGxhbmd1YWdlIGZvciBmb250LWxvY2suCiAgICAgICAobm9uLXRzLWxhbmd1
YWdlIG5pbCkKICAgICAgIDs7IE1hcmtkb3duIGl0c2VsZiBuZWVkcyB0d28gcGFyc2VycyAobWFy
a2Rvd24gKwogICAgICAgOzsgbWFya2Rvd24taW5saW5lKSwgc28gdHJlZXNpdCBlbWJlZGRpbmcg
KHdoaWNoIGNyZWF0ZXMgb25seQogICAgICAgOzsgb25lKSBjYW5ub3QgZnVsbHkgZm9udGlmeSBp
dC4gIFJvdXRlIHRocm91Z2ggdGhlIG5vbi10cwogICAgICAgOzsgcGF0aCBzbyB0aGUgdGVtcCBi
dWZmZXIgcnVucyB0aGUgZnVsbCBtb2RlIHdpdGggYm90aAogICAgICAgOzsgcGFyc2Vycy4KICAg
ICAgICgocHJvdmlkZWQtbW9kZS1kZXJpdmVkLXAgbW9kZSAnbWFya2Rvd24tdHMtbW9kZSkKICAg
ICAgICAodW5sZXNzIChhc3NxIGxhbmcgbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stbm9uLXRzLW1v
ZGVzKQogICAgICAgICAgKHB1c2ggKGNvbnMgbGFuZyBtb2RlKSBtYXJrZG93bi10cy0tY29kZS1i
bG9jay1ub24tdHMtbW9kZXMpKQogICAgICAgIG5pbCkKICAgICAgICh0CiAgICAgICAgKGxldCog
KChjb25maWd1cmF0aW9uIChtYXJrZG93bi10cy0taGFydmVzdC1tb2RlLXRyZWVzaXQtY29uZmln
dXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSkpCiAgICAgICAgICAg
ICAgICh0cy1sYW5ndWFnZSAocGxpc3QtZ2V0IGNvbmZpZ3VyYXRpb24gOmxhbmd1YWdlKSkpCiAg
ICAgICAgICAoY29uZAogICAgICAgICAgICgoYW5kIHRzLWxhbmd1YWdlCiAgICAgICAgICAgICAg
ICAgKHBsaXN0LWdldCBjb25maWd1cmF0aW9uIDpmb250LWxvY2spKQogICAgICAgICAgICAobWFy
a2Rvd24tdHMtLWNvbmZpZ3VyZS1jdXJyZW50LWJ1ZmZlciBjb25maWd1cmF0aW9uKQogICAgICAg
ICAgICAodW5sZXNzIChhc3NxIGxhbmcgbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stbGFuZ3VhZ2Vz
KQogICAgICAgICAgICAgIChwdXNoIChjb25zIGxhbmcgdHMtbGFuZ3VhZ2UpIG1hcmtkb3duLXRz
LS1jb2RlLWJsb2NrLWxhbmd1YWdlcykpCiAgICAgICAgICAgIHRzLWxhbmd1YWdlKQogICAgICAg
ICAgIDs7IE90aGVyd2lzZSwgY2xhc3NpZnkgbW9kZSBhcyBub24tdHJlZS1zaXR0ZXIuCiAgICAg
ICAgICAgKHQKICAgICAgICAgICAgKHVubGVzcyAoYXNzcSBsYW5nIG1hcmtkb3duLXRzLS1jb2Rl
LWJsb2NrLW5vbi10cy1tb2RlcykKICAgICAgICAgICAgICAocHVzaCAoY29ucyBsYW5nIG1vZGUp
IG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLW5vbi10cy1tb2RlcykpCiAgICAgICAgICAgIG5pbCkp
KSkpKQogICAgICh0IG5pbCkpKSkKCjs7OyBDb2RlIGJsb2NrIG1pbm9yIG1vZGUgc3VwcG9ydCBh
bmQgY29kZS1ibG9jayBjb250ZXh0IGNvbW1hbmRzOgoKKGRlZnZhciBtYXJrZG93bi10cy1jb2Rl
LWJsb2NrLWNvbW1hbmRzICcoaW5kZW50LWZvci10YWItY29tbWFuZAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVjdHJpYy1uZXdsaW5lLWFuZC1tYXliZS1pbmRl
bnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbi1h
dC1wb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5l
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQtZHdpbQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LWxpbmUKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudC1vci11bmNvbW1l
bnQtcmVnaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtk
b3duLXRzLS1jb2RlLWJsb2NrLWZpbGwtcGFyYWdyYXBoCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHByb2ctZmlsbC1yZWluZGVudC1kZWZ1bikKICAiQ29tbWFuZHMg
dG8gZXhlY3V0ZSBpbiBhIGNvZGUtYmxvY2sgY29udGV4dC4KU2VlIGBtYXJrZG93bi10cy0tcnVu
LWNvbW1hbmQtaW4tY29kZS1ibG9jaycuIikKCihkZWZ2YXIgbWFya2Rvd24tdHMtY29kZS1ibG9j
ay10aGluZy1jb21tYW5kcyAnKHhyZWYtZmluZC1kZWZpbml0aW9ucykKICAiQ29tbWFuZHMgdGhh
dCBuZWVkIGEgXCJ0aGluZ1wiIGF0IHBvaW50IGluIGEgY29kZS1ibG9jayBjb250ZXh0LgpTZWUg
YG1hcmtkb3duLXRzLS1ydW4tY29tbWFuZC1pbi1jb2RlLWJsb2NrJy4iKQoKKGRlZnZhciBtYXJr
ZG93bi10cy1jb2RlLWJsb2NrLXJlZ2lvbi1jb21tYW5kcyAnKGNvbW1lbnQtb3ItdW5jb21tZW50
LXJlZ2lvbikKICAiQ29tbWFuZHMgdGhhdCBuZWVkIGEgcmVnaW9uIGluIGEgY29kZS1ibG9jayBj
b250ZXh0LgpTZWUgYG1hcmtkb3duLXRzLS1ydW4tY29tbWFuZC1pbi1jb2RlLWJsb2NrJy4iKQoK
KGRlZnVuIG1hcmtkb3duLXRzLS1lbmFibGUtY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUgKCkK
ICAiRW5hYmxlIGBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZScgaWYgaW4g
YSBmZW5jZWQgY29kZSBibG9jay4iCiAgKG1hcmtkb3duLXRzLWNvZGUtYmxvY2staW4tY29udGV4
dC1tb2RlCiAgIChpZiAobWFya2Rvd24tdHMtYXQtY29kZS1ibG9jay1wKSAxIC0xKSkpCgo7OyBO
T1RFOiBEbyBub3QgYWRkIHRoaXMgY29tbWFuZCB0byBgbWFya2Rvd24tdHMtY29kZS1ibG9jay1j
b21tYW5kcycuCihkZWZ1biBtYXJrZG93bi10cy0tY29kZS1ibG9jay1uZXdsaW5lICgmb3B0aW9u
YWwgYXJnIGludGVyYWN0aXZlKQogICJJbnNlcnQgYSBuZXdsaW5lLCBhbmQgbW92ZSB0byBsZWZ0
IG1hcmdpbiBvZiB0aGUgbmV3IGxpbmUuCldpdGggcHJlZml4IGFyZ3VtZW50IEFSRywgaW5zZXJ0
IHRoYXQgbWFueSBuZXdsaW5lcy4KCklmIGBlbGVjdHJpYy1pbmRlbnQtbW9kZScgaXMgZW5hYmxl
ZCwgdGhpcyBpbmRlbnRzIHRoZSBmaW5hbCBuZXcgbGluZQp0aGF0IGl0IGFkZHMsIGFuZCByZWlu
ZGVudHMgdGhlIHByZWNlZGluZyBsaW5lLiAgVG8ganVzdCBpbnNlcnQKYSBuZXdsaW5lLCB1c2Ug
XFxbZWxlY3RyaWMtaW5kZW50LWp1c3QtbmV3bGluZV0uCgpJZiBgYXV0by1maWxsLW1vZGUnIGlz
IGVuYWJsZWQsIHRoaXMgbWF5IGNhdXNlIGF1dG9tYXRpYyBsaW5lCmJyZWFraW5nIG9mIHRoZSBw
cmVjZWRpbmcgbGluZS4gIEEgbm9uLW5pbCBBUkcgaW5oaWJpdHMgdGhpcy4KCklmIHZhcmlhYmxl
IGB1c2UtaGFyZC1uZXdsaW5lcycgaXMgZW5hYmxlZCwgdGhlIG5ld2xpbmUgaXMgbWFya2VkIHdp
dGgKdGhlIHRleHQtcHJvcGVydHkgYGhhcmQnLgoKQSBub24tbmlsIElOVEVSQUNUSVZFIGFyZ3Vt
ZW50IG1lYW5zIHRvIHJ1biB0aGUgYHBvc3Qtc2VsZi1pbnNlcnQtaG9vaycuIgogIChpbnRlcmFj
dGl2ZSAiKlBcbnAiKQogIChpZi1sZXQqICgoYmxvY2stbW9kZSAobWFya2Rvd24tdHMtY29kZS1i
bG9jay1tb2RlLWF0KSkKICAgICAgICAgICAgKChmYm91bmRwIGJsb2NrLW1vZGUpKSkKICAgICAg
KG1hcmtkb3duLXRzLS1ydW4tY29tbWFuZC1pbi1jb2RlLWJsb2NrIGJsb2NrLW1vZGUKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnbmV3bGluZQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZSkKICAgIChmdW5jYWxs
LWludGVyYWN0aXZlbHkgIyduZXdsaW5lIGFyZyBpbnRlcmFjdGl2ZSkpKQoKKGRlZnVuIG1hcmtk
b3duLXRzLS1jb2RlLWJsb2NrLWZpbGwtcGFyYWdyYXBoICgmb3B0aW9uYWwganVzdGlmeSkKICAi
UmVmaWxsIG9yIHJlaW5kZW50IHRoZSBtYXJrZG93biBjb250ZW50IHRoYXQgY29udGFpbnMgcG9p
bnQuCklmIHRoZSBwb2ludCBpcyBpbiBhIHN0cmluZyBvciBhIGNvbW1lbnQsIGZpbGwgdGhlIHBh
cmFncmFwaCB0aGF0CmNvbnRhaW5zIHBvaW50IG9yIGZvbGxvd3MgcG9pbnQuCgpPdGhlcndpc2Us
IHJlaW5kZW50IHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIHRoYXQgY29udGFpbnMgcG9pbnQgb3IK
Zm9sbG93cyBwb2ludC4KCklmIEpVU1RJRlkgaXMgbm9uLW5pbCAoaW50ZXJhY3RpdmVseSwgd2l0
aCBwcmVmaXggYXJndW1lbnQpLCBqdXN0aWZ5IGFzCndlbGwuIgogIChpbnRlcmFjdGl2ZSAiUCIp
CiAgKGNvbmQgKChkZXJpdmVkLW1vZGUtcCAncHJvZy1tb2RlKQogICAgICAgICAoY2FsbC1pbnRl
cmFjdGl2ZWx5ICMncHJvZy1maWxsLXJlaW5kZW50LWRlZnVuIGp1c3RpZnkpKQogICAgICAgICh0
CiAgICAgICAgIChjYWxsLWludGVyYWN0aXZlbHkgIydmaWxsLXBhcmFncmFwaCBqdXN0aWZ5KSkp
KQoKOzsgTk9URTogRG8gbm90IGFkZCB0aGlzIGNvbW1hbmQgdG8gYG1hcmtkb3duLXRzLWNvZGUt
YmxvY2stY29tbWFuZHMnLgooZGVmdW4gbWFya2Rvd24tdHMtLWNvZGUtYmxvY2steHJlZi1maW5k
LWRlZmluaXRpb25zICgmcmVzdCBhcmdzKQogICJIZWxwZXIgY29tbWFuZCBmb3IgYHhyZWYtZmlu
ZC1kZWZpbml0aW9ucycgaW4gYSBjb2RlLWJsb2NrIGNvbnRleHQuCkZpbmQgdGhpbmcgYXQgcG9p
bnQuCkFkanVzdCB0aGUgcmVmZXJlbmNlcyBvbiB0aGUgeHJlZiBzdGFjayB0byB0aGUgYmFzZSBi
dWZmZXIuClBhc3MgdGhyb3VnaCBBUkdTIGlmIG5vdCBpbiBhIGNvZGUgYmxvY2sgd2l0aCBhbiBh
dmFpbGFibGUgbW9kZS4iCiAgKGludGVyYWN0aXZlKQogIChpZi1sZXQqICgoYmxvY2stbW9kZSAo
bWFya2Rvd24tdHMtY29kZS1ibG9jay1tb2RlLWF0KSkKICAgICAgICAgICAgKChmYm91bmRwIGJs
b2NrLW1vZGUpKSkKICAgICAgKGNvbmRpdGlvbi1jYXNlIGVycgogICAgICAgICAgKHVud2luZC1w
cm90ZWN0CiAgICAgICAgICAgICAgKHByb2duCiAgICAgICAgICAgICAgICA7OyBSZWNvcmQgYSBw
bGFjZWhvbGRlciB4cmVmIG1hcmtlciBpbiB0aGUgYmFzZSBidWZmZXIuICBUaGlzCiAgICAgICAg
ICAgICAgICA7OyB3aWxsIGJlIHJldGFpbmVkIGlmIHRoZSBjb21tYW5kIHN1Y2NlZWRzIHRvIHB1
c2ggYSBtYXJrZXIgaW4KICAgICAgICAgICAgICAgIDs7IHRoZSBjb2RlLWJsb2NrIGJ1ZmZlciB3
aGljaCB3ZSB3aWxsIHBvcC4KICAgICAgICAgICAgICAgICh4cmVmLXB1c2gtbWFya2VyLXN0YWNr
KQogICAgICAgICAgICAgICAgOzsgYHhyZWYtZmluZC1kZWZpbml0aW9ucycgaXMgYSB0aGluZyBj
b21tYW5kIGluCiAgICAgICAgICAgICAgICA7OyBgbWFya2Rvd24tdHMtY29kZS1ibG9jay10aGlu
Zy1jb21tYW5kcycuCiAgICAgICAgICAgICAgICAobWFya2Rvd24tdHMtLXJ1bi1jb21tYW5kLWlu
LWNvZGUtYmxvY2sgYmxvY2stbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICMneHJlZi1maW5kLWRlZmluaXRpb25zCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncykpCiAgICAg
ICAgICAgIDs7IFBvcCB0aGUgdG9wIHhyZWYgbWFya2VyLiAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vl
ZGVkLCB0aGUKICAgICAgICAgICAgOzsgdG9wIG1hcmtlciB3aWxsIGJlIHRoZSBjb2RlLWJsb2Nr
IGJ1ZmZlciBtYXJrZXIuICBJZiBpdAogICAgICAgICAgICA7OyBmYWlsZWQsIHdlJ2xsIHBvcCB0
aGUgcGxhY2Vob2xkZXIgd2hpY2ggaXMgbm93IG9mIG5vCiAgICAgICAgICAgIDs7IHZhbHVlLgog
ICAgICAgICAgICA7OyBUT0RPOiBQcm9wb3NlIGFuIGB4cmVmJyBwb3AgZnVuY3Rpb24gdGhhdCBk
b2Vzbid0ICJnbwogICAgICAgICAgICA7OyBiYWNrIi4KICAgICAgICAgICAgKGxldCAoKGhpc3Rv
cnkgKHhyZWYtLWdldC1oaXN0b3J5KSkpCiAgICAgICAgICAgICAgKHVubGVzcyAobnVsbCAoY2Fy
IGhpc3RvcnkpKQogICAgICAgICAgICAgICAgKHBvcCAoY2FyIGhpc3RvcnkpKSkpKQogICAgICAg
IChlcnJvcgogICAgICAgICA7OyBQcm9wYWdhdGUgdGhlIHNpZ25hbC4KICAgICAgICAgKHNpZ25h
bCAoY2FyIGVycikgKGNkciBlcnIpKSkpCiAgICA7OyBOb3QgaW4gYSBjb2RlIGJsb2NrIGNvbnRl
eHQuICBUaGlzIHNob3VsZCByZWFsbHkgbmV2ZXIgaGFwcGVuLgogICAgKGZ1bmNhbGwtaW50ZXJh
Y3RpdmVseSAjJ3hyZWYtZmluZC1kZWZpbml0aW9ucyBhcmdzKSkpCgooZGVmdW4gbWFya2Rvd24t
dHMtLW1heWJlLXJ1bi1jb21tYW5kLWluLWNvZGUtYmxvY2sgKCkKICAiSGVscGVyIGZ1bmN0aW9u
IHRvIHdyYXAgYSBjb21tYW5kIGZvciBhIGNvZGUtYmxvY2sgY29udGV4dC4KSWYgYHRoaXMtY29t
bWFuZCcgaXMgYSBtZW1iZXIgb2YgYG1hcmtkb3duLXRzLWNvZGUtYmxvY2stY29tbWFuZHMnIGFu
ZApwb2ludCBpcyB3aXRoaW4gYSBjb2RlIGJsb2NrIHdpdGggYW4gYXZhaWxhYmxlIG1vZGUsIGl0
IHdpbGwgcnVuIGluIHRoYXQKY29kZSBibG9jaydzIG1vZGUgaW4gYSBidWZmZXIgbmFycm93ZWQg
dG8gaXRzIGNvbnRlbnQuICBPdGhlcndpc2UsIHRoZQpjb21tYW5kIHdpbGwgcnVuIGluIHRoZSBj
b250ZXh0IG9mIHRoZSBgbWFya2Rvd24tdHMtbW9kZScgYnVmZmVyLiIKICAod2hlbiAobWVtcSB0
aGlzLWNvbW1hbmQgbWFya2Rvd24tdHMtY29kZS1ibG9jay1jb21tYW5kcykKICAgICh3aGVuLWxl
dCogKChjb21tYW5kIHRoaXMtY29tbWFuZCkKICAgICAgICAgICAgICAgIChibG9jay1tb2RlICht
YXJrZG93bi10cy1jb2RlLWJsb2NrLW1vZGUtYXQpKQogICAgICAgICAgICAgICAgKChmYm91bmRw
IGJsb2NrLW1vZGUpKSkKICAgICAgKHNldHEgdGhpcy1jb21tYW5kIChsYW1iZGEgKCZyZXN0IGFy
Z3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRlcmFjdGl2ZSkKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGFwcGx5ICMnbWFya2Rvd24tdHMtLXJ1bi1jb21tYW5kLWluLWNvZGUt
YmxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLW1vZGUKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGFyZ3MpKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tcnVuLWNvbW1hbmQt
aW4tY29kZS1ibG9jayAoYmxvY2stbW9kZSBjb21tYW5kICZyZXN0IGFyZ3MpCiAgIlJ1biBDT01N
QU5EIGluIEJMT0NLLU1PREUuCkFSR1MgYXJlIGNhcHR1cmVkIGJ5IGBtYXJrZG93bi10cy0tbWF5
YmUtcnVuLWNvbW1hbmQtaW4tY29kZS1ibG9jaycuIgogICh3aGVuLWxldCogKChiZWcgKGdldC1j
aGFyLXByb3BlcnR5IChwb2ludCkgJ21hcmtkb3duLXRzLWNvZGUtYmVnLW1hcmtlcikpCiAgICAg
ICAgICAgICAgKGVuZCAoZ2V0LWNoYXItcHJvcGVydHkgKHBvaW50KSAnbWFya2Rvd24tdHMtY29k
ZS1lbmQtbWFya2VyKSkKICAgICAgICAgICAgICAoc3RyIChidWZmZXItc3Vic3RyaW5nLW5vLXBy
b3BlcnRpZXMgYmVnIGVuZCkpKQogICAgOzsgVXNlIGEgdGVtcCAob3Igd29yaykgYnVmZmVyIGJl
Y2F1c2UgdHJlZXNpdCBjdXJyZW50bHkgY29uZnVzZXMKICAgIDs7IG5vZGVzIGluIGFuIGluZGly
ZWN0IGJ1ZmZlciBldmVuIGlmIHRoZSBpbmRpcmVjdCBidWZmZXIgaXMgbm90CiAgICA7OyBuYXJy
b3dlZC4KICAgIChsZXQqICgodGVtcC1kZWFjdGl2YXRlLW1hcmspCiAgICAgICAgICAgKG9yaWct
cG9pbnQgKHBvaW50KSkKICAgICAgICAgICAob3JpZy1tYXJrIChtYXJrIHQpKQogICAgICAgICAg
IChvcmlnLW1hcmstYWN0aXZlIG1hcmstYWN0aXZlKQogICAgICAgICAgIChyZWdpb24tYmVnICh1
c2UtcmVnaW9uLWJlZ2lubmluZykpCiAgICAgICAgICAgKHJlZ2lvbi1lbmQgKHVzZS1yZWdpb24t
ZW5kKSkKICAgICAgICAgICAoYWRqLXBvaW50ICgxKyAoLSBvcmlnLXBvaW50IGJlZykpKQogICAg
ICAgICAgIChhZGotbWFyayAod2hlbiBvcmlnLW1hcmsgKDErICgtIG9yaWctbWFyayBiZWcpKSkp
CiAgICAgICAgICAgKGFkai1yZWdpb24tYmVnICh3aGVuIHJlZ2lvbi1iZWcgKDErICgtIG9yaWct
cG9pbnQgcmVnaW9uLWJlZykpKSkKICAgICAgICAgICAoYWRqLXJlZ2lvbi1lbmQgKHdoZW4gcmVn
aW9uLWVuZCAoMSsgKC0gb3JpZy1wb2ludCByZWdpb24tZW5kKSkpKQogICAgICAgICAgIChwb2lu
dC1kZWx0YSAwKQogICAgICAgICAgIChzb3VyY2UtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKQog
ICAgICAod2l0aC13b3JrLWJ1ZmZlcgogICAgICAgIChpbnNlcnQgc3RyKQogICAgICAgIChnb3Rv
LWNoYXIgYWRqLXBvaW50KQogICAgICAgIDs7IFByb3BhZ2F0ZSBtYXJrIChhbmQgcmVnaW9uKS4K
ICAgICAgICAod2hlbiBvcmlnLW1hcmstYWN0aXZlCiAgICAgICAgICAoc2V0LW1hcmsgYWRqLW1h
cmspKQogICAgICAgIChtYXJrZG93bi10cy0taW5oaWJpdC1tZXNzYWdlcy1hbmQtd2FybmluZ3MK
ICAgICAgICAgICdtYXJrZG93bi10cy1pbmhpYml0LWNvZGUtYmxvY2stbW9kZS13YXJuaW5ncwog
ICAgICAgICAgKGRlbGF5LW1vZGUtaG9va3MKICAgICAgICAgICAgKGxldCAoKG1hcmtkb3duLXRz
LS1zZXQtdXAtaW5saW5lCiAgICAgICAgICAgICAgICAgICAocHJvdmlkZWQtbW9kZS1kZXJpdmVk
LXAgYmxvY2stbW9kZSAnbWFya2Rvd24tdHMtbW9kZSkpKQogICAgICAgICAgICAgIChmdW5jYWxs
IGJsb2NrLW1vZGUpKSkpCiAgICAgICAgKGxldCAoKHBvaW50IChwb2ludCkpCiAgICAgICAgICAg
ICAgKGFyaXR5IChjZHIgKGZ1bmMtYXJpdHkgY29tbWFuZCkpKSkKICAgICAgICAgIChjb25kCiAg
ICAgICAgICAgKChtZW1xIGNvbW1hbmQgbWFya2Rvd24tdHMtY29kZS1ibG9jay10aGluZy1jb21t
YW5kcykKICAgICAgICAgICAgKHdoZW4tbGV0KiAoKHRoaW5nICh0aGluZy1hdC1wb2ludCAnc3lt
Ym9sKSkpCiAgICAgICAgICAgICAgKGZ1bmNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kIHRoaW5n
KSkpCiAgICAgICAgICAgKChtZW1xIGNvbW1hbmQgbWFya2Rvd24tdHMtY29kZS1ibG9jay1yZWdp
b24tY29tbWFuZHMpCiAgICAgICAgICAgICh3aGVuIChhbmQgYWRqLXJlZ2lvbi1iZWcgYWRqLXJl
Z2lvbi1lbmQpCiAgICAgICAgICAgICAgKGFwcGx5ICMnZnVuY2FsbC1pbnRlcmFjdGl2ZWx5IGNv
bW1hbmQKICAgICAgICAgICAgICAgICAgICAgYWRqLXJlZ2lvbi1iZWcgYWRqLXJlZ2lvbi1lbmQg
YXJncykpKQogICAgICAgICAgICgoemVyb3AgYXJpdHkpCiAgICAgICAgICAgIChmdW5jYWxsLWlu
dGVyYWN0aXZlbHkgY29tbWFuZCkpCiAgICAgICAgICAgKChlcSAxIGFyaXR5KQogICAgICAgICAg
ICAoZnVuY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQgKGNhciBhcmdzKSkpCiAgICAgICAgICAg
KHQKICAgICAgICAgICAgKGFwcGx5ICMnZnVuY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQgYXJn
cykpKQogICAgICAgICAgKHNldHEgc3RyIChidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMg
KHBvaW50LW1pbikgKHBvaW50LW1heCkpKQogICAgICAgICAgKHNldHEgdGVtcC1kZWFjdGl2YXRl
LW1hcmsgZGVhY3RpdmF0ZS1tYXJrKQogICAgICAgICAgKHNldHEgcG9pbnQtZGVsdGEgKC0gKHBv
aW50KSBwb2ludCkpKQogICAgICAgIChsZXQgKCh3b3JrLWJ1ZmZlciAoY3VycmVudC1idWZmZXIp
KSkKICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHNvdXJjZS1idWZmZXIKICAgICAgICAg
ICAgKHJlcGxhY2UtcmVnaW9uLWNvbnRlbnRzIGJlZyBlbmQgd29yay1idWZmZXIpCiAgICAgICAg
ICAgIDs7IFByb3BhZ2F0ZSBtYXJrIGRlYWN0aXZhdGlvbiB0byB0aGUgc291cmNlIGJ1ZmZlci4K
ICAgICAgICAgICAgKHNldHEgZGVhY3RpdmF0ZS1tYXJrIHRlbXAtZGVhY3RpdmF0ZS1tYXJrKQog
ICAgICAgICAgICA7OyBNb3ZlIHBvaW50IGlmIGl0IG1vdmVkIGluIHRoZSB0ZW1wIGJ1ZmZlci4K
ICAgICAgICAgICAgKGdvdG8tY2hhciAoKyBvcmlnLXBvaW50IHBvaW50LWRlbHRhKSkKICAgICAg
ICAgICAgOzsgUmVjb3JkIHRoZSBvcmlnaW5hbCBjb21tYW5kLgogICAgICAgICAgICAoc2V0cSB0
aGlzLWNvbW1hbmQgY29tbWFuZCkKICAgICAgICAgICAgOzsgVGhpcyBoZWxwcyBtYWludGFpbiBk
aXNjcmV0ZSBjb21tYW5kIGFjdGlvbnMuCiAgICAgICAgICAgICh1bmRvLWJvdW5kYXJ5KQogICAg
ICAgICAgICA7OyBNYWtlIHN1cmUgdGhlIG9yaWdpbmF0aW5nIHJlZ2lvbiBpcyByZWZvbnRpZmll
ZC4KICAgICAgICAgICAgKGZvbnQtbG9jay1mbHVzaCBiZWcgZW5kKSkpKSkpKQoKKGRlZnVuIG1h
cmtkb3duLXRzLS1maW5kLWNvZGUtYmxvY2stZGVsaW1pdGVyIChwb3MgJm9wdGlvbmFsIGJhY2t3
YXJkKQogICJSZXR1cm4gdGhlIG5leHQgb3IgcHJldmlvdXMgZmVuY2VkX2NvZGVfYmxvY2tfZGVs
aW1pdGVyIG5vZGUsIG9yIG5pbC4KU2VhcmNoIHN0YXJ0aW5nIGF0IFBPUy4KU2VhcmNoIGJhY2t3
YXJkIGlmIEJBQ0tXQVJEIGlzIG5vbi1uaWwuIgogICh0cmVlc2l0LXNlYXJjaC1mb3J3YXJkICh0
cmVlc2l0LW5vZGUtYXQgcG9zICdtYXJrZG93bikKICAgICAgICAgICAgICAgICAgICAgICAgICAo
bGFtYmRhIChub2RlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZz0gKHRyZWVz
aXQtbm9kZS10eXBlIG5vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi
ZmVuY2VkX2NvZGVfYmxvY2tfZGVsaW1pdGVyIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
YmFja3dhcmQpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1maW5kLW5leHQtY29kZS1ibG9jay1kZWxp
bWl0ZXIgKCZvcHRpb25hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcG9zIGJhY2t3YXJkIHJlbWFpbikKICAiUmV0dXJuIHRoZSBuZXh0IG9yIHBy
ZXZpb3VzIGZlbmNlZF9jb2RlX2Jsb2NrX2RlbGltaXRlciBub2RlLCBvciBuaWwuClNlYXJjaCBz
dGFydGluZyBhdCBQT1Mgb3IgYHBvaW50JywgaWYgUE9TIGlzIG5pbC4KU2VhcmNoIGJhY2t3YXJk
IGlmIEJBQ0tXQVJEIGlzIG5vbi1uaWwuCklmIFJFTUFJTiBpcyBub24tbmlsLCBtb3ZlIHRvIHRo
ZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBjdXJyZW50IGNvZGUKYmxvY2ssIGlmIGluIG9uZS4iCiAg
KHNldHEgcG9zIChvciBwb3MgKHBvaW50KSkpCiAgKGFuZC1sZXQqICgobm9kZSAobWFya2Rvd24t
dHMtLWZpbmQtY29kZS1ibG9jay1kZWxpbWl0ZXIgcG9zIGJhY2t3YXJkKSkpCiAgICAobGV0ICgo
aW4tYmxvY2sgKG1hcmtkb3duLXRzLWF0LWNvZGUtYmxvY2stcCBwb3MpKSkKICAgICAgKGNvbmQK
ICAgICAgICgoYW5kIHJlbWFpbiBpbi1ibG9jaykKICAgICAgICBub2RlKQogICAgICAgKHJlbWFp
bgogICAgICAgIG5pbCkKICAgICAgICh0CiAgICAgICAgKHdoaWxlIChhbmQgbm9kZQogICAgICAg
ICAgICAgICAgICAgIDs7IElmIGJhY2t3YXJkLCBza2lwIHRoZSBjdXJyZW50IGJsb2NrJ3MKICAg
ICAgICAgICAgICAgICAgICA7OyBzdGFydGluZyBkZWxpbWl0ZXIuCiAgICAgICAgICAgICAgICAg
ICAgKG9yIChhbmQgYmFja3dhcmQgaW4tYmxvY2sgKHRyZWVzaXQtbm9kZS1uZXh0LXNpYmxpbmcg
bm9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIChub3QgKHRyZWVzaXQtbm9kZS1uZXh0LXNp
Ymxpbmcgbm9kZSkpKSkKICAgICAgICAgIChzZXRxIGluLWJsb2NrIChtYXJrZG93bi10cy1hdC1j
b2RlLWJsb2NrLXAgcG9zKSkKICAgICAgICAgIChzZXRxIHBvcyAoaWYgYmFja3dhcmQKICAgICAg
ICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1zdGFydCBub2RlKQogICAgICAgICAgICAg
ICAgICAgICAgKHRyZWVzaXQtbm9kZS1lbmQgbm9kZSkpKQogICAgICAgICAgKHNldHEgbm9kZSAo
bWFya2Rvd24tdHMtLWZpbmQtY29kZS1ibG9jay1kZWxpbWl0ZXIgcG9zIGJhY2t3YXJkKSkpCiAg
ICAgICAgbm9kZSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtbW92ZS10by1uZXh0LWNvZGUtYmxv
Y2sgKGFyZykKICAiTW92ZSBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY29kZSBibG9j
ay4KV2l0aCB0aGUgcHJlZml4IGFyZ3VtZW50IEFSRywgcmVtYWluIHdpdGhpbiB0aGUgY3VycmVu
dCBjb2RlIGJsb2NrLiIKICAoaW50ZXJhY3RpdmUgIlAiKQogICh3aGVuLWxldCogKChub2RlCiAg
ICAgICAgICAgICAgIChtYXJrZG93bi10cy0tZmluZC1uZXh0LWNvZGUtYmxvY2stZGVsaW1pdGVy
IG5pbCBuaWwgYXJnKSkpCiAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtc3RhcnQgbm9kZSkp
KSkKCihkZWZ1biBtYXJrZG93bi10cy1tb3ZlLXRvLXByZXZpb3VzLWNvZGUtYmxvY2sgKGFyZykK
ICAiTW92ZSBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIHByZXZpb3VzIGNvZGUgYmxvY2suCldp
dGggdGhlIHByZWZpeCBhcmd1bWVudCBBUkcsIHJlbWFpbiB3aXRoaW4gdGhlIGN1cnJlbnQgY29k
ZSBibG9jay4iCiAgKGludGVyYWN0aXZlICJQIikKICAod2hlbi1sZXQqICgobm9kZQogICAgICAg
ICAgICAgICAobWFya2Rvd24tdHMtLWZpbmQtbmV4dC1jb2RlLWJsb2NrLWRlbGltaXRlciBuaWwg
J2JhY2t3YXJkIGFyZykpKQogICAgKGdvdG8tY2hhciAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUp
KSkpCgo7OzsgVGFibGVzIGFrYSBwaXBlIHRhYmxlczoKCjs7OzsgVXRpbGl0aWVzOgoKKGRlZmNv
bnN0IG1hcmtkb3duLXRzLXRhYmxlLWV4cG9ydC1idWZmZXIKICAiKm1hcmtkb3duLXRzLXRhYmxl
LWV4cG9ydCoiKQoKOzsgSW4gZnJlcXVlbmN5IG1hdGNoaW5nIG9yZGVyLgooZGVmY29uc3QgbWFy
a2Rvd24tdHMtLXRhYmxlLXJvdy10eXBlcwogICcoInBpcGVfdGFibGVfcm93IgogICAgInBpcGVf
dGFibGVfZGVsaW1pdGVyX3JvdyIKICAgICJwaXBlX3RhYmxlX2hlYWRlciIpKQoKOzsgSW4gZnJl
cXVlbmN5IG1hdGNoaW5nIG9yZGVyLgooZGVmY29uc3QgbWFya2Rvd24tdHMtLXRhYmxlLWNlbGwt
dHlwZXMKICAnKCJwaXBlX3RhYmxlX2NlbGwiCiAgICAicGlwZV90YWJsZV9kZWxpbWl0ZXJfY2Vs
bCIpKQoKKGRlZmNvbnN0IG1hcmtkb3duLXRzLS10YWJsZS1kZWxpbWl0ZXItY2VsbC10eXBlcwog
ICcoInBpcGVfdGFibGVfZGVsaW1pdGVyX2NlbGwiCiAgICAicGlwZV90YWJsZV9hbGlnbl9sZWZ0
IgogICAgInBpcGVfdGFibGVfYWxpZ25fcmlnaHQiKSkKCihkZWZjb25zdCBtYXJrZG93bi10cy0t
dGFibGUtZGVsaW1pdGVyLWNlbGwtc3VidHlwZXMKICAnKCJwaXBlX3RhYmxlX2FsaWduX2xlZnQi
CiAgICAicGlwZV90YWJsZV9hbGlnbl9yaWdodCIpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS10YWJs
ZS1hYnV0dGluZy1wb3MgKHBvcykKICAiQWRqdXN0IFBPUyB0byBhYnV0IGl0cyBjbG9zZXN0IHRl
eHQuClJldHVybiBwb3MgYWRqdXN0ZWQgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBuZWFyZXN0IG5v
bi1ibGFuayBjaGFyYWN0ZXIuCk90aGVyd2lzZSwgcmV0dXJuIG5pbCwgZm9yIGV4YW1wbGUsIGlm
IHRoZSBsaW5lIGlzIGVtcHR5LiIKICAoc2F2ZS1leGN1cnNpb24KICAgIChnb3RvLWNoYXIgcG9z
KQogICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiW1s6Ymxhbms6XV0iIChwb3MtZW9sKSkKICAgIChp
ZiAoZXEgcG9zIChwb3MtZW9sKSkKICAgICAgICAocHJvZ24KICAgICAgICAgIChnb3RvLWNoYXIg
cG9zKQogICAgICAgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIltbOmJsYW5rOl1dIiAocG9zLWJv
bCkpCiAgICAgICAgICAodW5sZXNzIChlcSBwb3MgKHBvcy1ib2wpKQogICAgICAgICAgICAobWF4
IChwb2ludC1taW4pICgxLSAocG9pbnQpKSkpKQogICAgICAobWluIChwb2ludC1tYXgpICgxKyAo
cG9pbnQpKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tdGFibGUtbm9kZS1jZWxsICgmb3B0aW9u
YWwgbm9kZSBwb3MgYWJ1dHRpbmcpCiAgIkNvbXB1dGUgdGFibGUgY2VsbCBmcm9tIG5hbWVkIE5P
REUgYXQgUE9TLgpJZiBOT0RFIGlzIG5pbCwgdXNlIHRoZSBub2RlIGF0IFBPUy4KSWYgUE9TIGlz
IG5pbCwgdXNlIGBwb2ludCcuCklmIE5PREUgaXMgYSBjZWxsIHR5cGUsIHJldHVybiBpdC4KSWYg
Tk9ERSBpcyBhIHN1YnR5cGUsIHByb21vdGUgaXQuCklmIEFCVVRUSU5HIGlzIG5vbi1uaWwsIGFk
anVzdCBQT1MgdG8gdGhlIG5lYXJlc3Qgbm9uLWJsYW5rIGNoYXJhY3Rlci4KT3RoZXJ3aXNlLCBy
ZXR1cm4gbmlsLiIKICA7OyBXZSBjb3VsZCBzYW5pdHkgY2hlY2sgdmlhIGB0cmVlc2l0LW5vZGUt
bmFtZWQnIGFuZCBlcnJvciBpZiBub3QuCiAgKHNldHEgcG9zIChvciBwb3MgKHBvaW50KSkpCiAg
KHdoZW4gYWJ1dHRpbmcKICAgIChzZXRxIHBvcyAob3IgKG1hcmtkb3duLXRzLS10YWJsZS1hYnV0
dGluZy1wb3MgcG9zKSBwb3MpKSkKICAod2hlbi1sZXQqICgobm9kZSAob3Igbm9kZQogICAgICAg
ICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLWF0IHBvcyAnbWFya2Rvd24gJ25hbWVkKSkp
CiAgICAgICAgICAgICAgKHR5cGUgKHRyZWVzaXQtbm9kZS10eXBlIG5vZGUpKSkKICAgIChjb25k
ICgobWVtYmVyIHR5cGUgbWFya2Rvd24tdHMtLXRhYmxlLWNlbGwtdHlwZXMpCiAgICAgICAgICAg
bm9kZSkKICAgICAgICAgICgobWVtYmVyIHR5cGUgbWFya2Rvd24tdHMtLXRhYmxlLWRlbGltaXRl
ci1jZWxsLXN1YnR5cGVzKQogICAgICAgICAgICh0cmVlc2l0LW5vZGUtcGFyZW50IG5vZGUpKQog
ICAgICAgICAgKChtZW1iZXIgdHlwZSBtYXJrZG93bi10cy0tdGFibGUtcm93LXR5cGVzKQogICAg
ICAgICAgIChjb25kICgoZXEgYWJ1dHRpbmcgJ2xlZnQpCiAgICAgICAgICAgICAgICAgICh0cmVl
c2l0LW5vZGUtY2hpbGQgbm9kZSAwICduYW1lZCkpCiAgICAgICAgICAgICAgICAgOzsgQWNjb3Vu
dCBmb3IgJ3JpZ2h0IG9yIHQuCiAgICAgICAgICAgICAgICAgKHQKICAgICAgICAgICAgICAgICAg
KHRyZWVzaXQtbm9kZS1jaGlsZCBub2RlIC0xICduYW1lZCkpKSkpKSkKCihkZWZ1biBtYXJrZG93
bi10cy0tdGFibGUtbm9kZS1yb3cgKCZvcHRpb25hbCBub2RlIHBvcykKICAiQ29tcHV0ZSB0YWJs
ZSByb3cgZnJvbSBuYW1lZCBOT0RFIGF0IFBPUy4KSWYgTk9ERSBpcyBuaWwsIHVzZSB0aGUgbm9k
ZSBhdCBQT1MuCklmIFBPUyBpcyBuaWwsIHVzZSBgcG9pbnQnLgpJZiBOT0RFIGlzIGEgcm93IHR5
cGUsIHJldHVybiBpdC4KSWYgTk9ERSBpcyBhIHRhYmxlIGNlbGwgdHlwZSwgcmV0dXJuIGl0cyBy
b3cuCk90aGVyd2lzZSwgcmV0dXJuIG5pbC4iCiAgOzsgV2UgY291bGQgc2FuaXR5IGNoZWNrIHZp
YSBgdHJlZXNpdC1ub2RlLW5hbWVkJyBhbmQgZXJyb3IgaWYgbm90LgogICh3aGVuLWxldCogKChu
b2RlIChvciBub2RlCiAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtYXQgKG9y
IHBvcyAocG9pbnQpKSAnbWFya2Rvd24gJ25hbWVkKSkpCiAgICAgICAgICAgICAgKHR5cGUgKHRy
ZWVzaXQtbm9kZS10eXBlIG5vZGUpKSkKICAgIChpZiAobWVtYmVyIHR5cGUgbWFya2Rvd24tdHMt
LXRhYmxlLXJvdy10eXBlcykKICAgICAgICBub2RlCiAgICAgICAodHJlZXNpdC1ub2RlLXBhcmVu
dCAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtY2VsbCBub2RlKSkpKSkKCihkZWZ1biBtYXJrZG93
bi10cy0tdGFibGUtcGFyc2UtZXJyb3ItcCAoJm9wdGlvbmFsIG5vZGUgcG9zKQogICJSZXR1cm4g
bm9uLW5pbCBpZiBuYW1lZCBOT0RFIGF0IFBPUyBpcyBpbiBhbiBcIkVSUk9SXCIgc3VidHJlZS4K
Tk9ERSBtdXN0IGJlIGEgdGFibGUgZWxlbWVudDsgaS5lLiwgaXRzIHR5cGUgcHJlZml4IGlzIFwi
cGlwZV90YWJsZVwiLgpJZiBOT0RFIGlzIGEgdGFibGUsIHJldHVybiBuaWwgKGl0IHNob3VsZG4n
dCBiZSBpbiBFUlJPUikuCklmIE5PREUgaXMgbm90IGEgdGFibGUgZWxlbWVudCwgcmV0dXJuIG5p
bC4KSWYgTk9ERSdzIG5lYXJieSBhbmNlc3RvciBpcyBhbiBcIkVSUk9SXCIgbm9kZSwgcmV0dXJu
IHQuCk90aGVyd2lzZSwgcmV0dXJuIG5pbC4iCiAgOzsgV2UgY291bGQgc2FuaXR5IGNoZWNrIHZp
YSBgdHJlZXNpdC1ub2RlLW5hbWVkJyBhbmQgZXJyb3IgaWYgbm90LgogICh3aGVuLWxldCogKChy
b3cgKG1hcmtkb3duLXRzLS10YWJsZS1ub2RlLXJvdyBub2RlIHBvcykpCiAgICAgICAgICAgICAg
KHR5cGUgKHRyZWVzaXQtbm9kZS10eXBlIHJvdykpCiAgICAgICAgICAgICAgKHBhcmVudCAodHJl
ZXNpdC1ub2RlLXBhcmVudCByb3cpKQogICAgICAgICAgICAgIChwYXJlbnQtdHlwZSAodHJlZXNp
dC1ub2RlLXR5cGUgcGFyZW50KSkpCiAgICAoY29uZCAoKGVxdWFsIHR5cGUgInBpcGVfdGFibGUi
KQogICAgICAgICAgIG5pbCkKICAgICAgICAgICgoZXF1YWwgcGFyZW50LXR5cGUgInBpcGVfdGFi
bGUiKQogICAgICAgICAgIG5pbCkKICAgICAgICAgICgoZXF1YWwgcGFyZW50LXR5cGUgIkVSUk9S
IikKICAgICAgICAgICB0KQogICAgICAgICAgKHQKICAgICAgICAgICAoZXJyb3IgIlNob3VsZCBu
ZXZlciBoYXBwZW4iKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy1hdC10YWJsZS1wICgmb3B0aW9u
YWwgcG9zIGFidXR0aW5nKQogICJSZXR1cm4gbm9uLW5pbCBpZiBQT1MgaXMgYXQgb3IgaW4gYSBw
aXBlIHRhYmxlLgpJZiBQT1MgaXMgbmlsLCB1c2UgcG9pbnQuClJldHVybiBjb25zIChwb3MgLiB0
YWJsZS1ub2RlKSBpZiBQT1MgaXMgd2l0aGluIGEgdGFibGUsIG90aGVyd2lzZQpyZXR1cm4gbmls
LgppZiBQT1MgaXMgd2l0aGluIGEgdGFibGUgYnV0IHdpdGggcGFyc2UgZXJyb3JzLCBzaWduYWwg
YW4gZXJyb3IuCklmIEFCVVRUSU5HIGlzIG5vbi1uaWwsIGFkanVzdCBQT1MgdG8gdGhlIG5lYXJl
c3Qgbm9uLWJsYW5rIGNoYXJhY3Rlci4KSWYgdGhlIHBhcnNlZCB0YWJsZSBpcyBpbiBFUlJPUiwg
cmV0dXJuIG5pbC4iCiAgKHNldHEgcG9zIChvciBwb3MgKHBvaW50KSkpCiAgKHNhdmUtZXhjdXJz
aW9uCiAgICAoZ290by1jaGFyIHBvcykKICAgIDs7IElmIHBvaW50IGlzIG9uIGFuIGVtcHR5IGxp
bmUsIGl0IGlzIG5ldmVyIGEgdGFibGUuCiAgICAodW5sZXNzIChhbmQgKGVvbHApIChib2xwKSkK
ICAgICAgOzsgSWYgcG9pbnQgaXMgYm9sIG9yIGVvbCBpdCBtaWdodCBiZSBhYnV0dGluZyBhIHBp
cGUgc3ltYm9sIHNvCiAgICAgIDs7IGxvb2sgZm9yd2FyZHMgb3IgYmFja3dhcmRzIG9uZSBjaGFy
YWN0ZXIgdG8gdGVzdCBpZiB0aGF0IHBvcwogICAgICA7OyBpcyBhIHRhYmxlLgogICAgICAod2hl
biBhYnV0dGluZwogICAgICAgIChzZXRxIHBvcyAob3IgKG1hcmtkb3duLXRzLS10YWJsZS1hYnV0
dGluZy1wb3MgcG9zKSBwb3MpKSkKICAgICAgKHdoZW4tbGV0KiAoKHJvdyAobWFya2Rvd24tdHMt
LXRhYmxlLW5vZGUtcm93IG5pbCBwb3MpKSkKICAgICAgICAoaWYgKG1hcmtkb3duLXRzLS10YWJs
ZS1wYXJzZS1lcnJvci1wIHJvdykKICAgICAgICAgICAgOzsgRG8gbm90IHVzZSBlcnJvciBvciB3
YXJuaW5nIGhlcmUuICBFcnJvcnMgaW50ZXJmZXJlIHdpdGgKICAgICAgICAgICAgOzsgdGhlIGNv
bW1hbmQgbG9vcC4gIFdhcm5pbmdzIGFyZSBhbm5veWluZy4KICAgICAgICAgICAgKHByb2duCiAg
ICAgICAgICAgICAgKG1lc3NhZ2UgIkluY29ycmVjdGx5IGZvcm1hdHRlZCBNYXJrZG93biB0YWJs
ZSAocGFyc2VyIGVycm9yKSIpCiAgICAgICAgICAgICAgbmlsKQogICAgICAgICAgKGNvbnMgcG9z
ICh0cmVlc2l0LXNlYXJjaC1mb3J3YXJkCiAgICAgICAgICAgICAgICAgICAgIHJvdwogICAgICAg
ICAgICAgICAgICAgICAiXFxgcGlwZV90YWJsZVxcJyIgJ2JhY2t3YXJkKSkpKSkpKQoKKGRlZnVu
IG1hcmtkb3duLXRzLS1lbmFibGUtaW4tdGFibGUtbW9kZSAoKQogICJFbmFibGUgYG1hcmtkb3du
LXRzLWluLXRhYmxlLW1vZGUnIGlmIGluIGEgdGFibGUuCkEgdGFibGUgd2l0aCBhIHBhcnNlciBF
UlJPUiBpcyBpbmVsaWdpYmxlLiIKICAobWFya2Rvd24tdHMtaW4tdGFibGUtbW9kZQogICAoaWYg
KG1hcmtkb3duLXRzLWF0LXRhYmxlLXAgbmlsIHQpIDEgLTEpKSkKCihkZWZ1biBtYXJrZG93bi10
cy0tdGFibGUtYm9keS1yb3ctbmVhci1wb3MgKCZvcHRpb25hbCBwb3MgYWJ1dHRpbmcpCiAgIlJl
dHVybiB0aGUgcm93IG5lYXIgUE9TLgpSZXR1cm4gbmlsIGlmIG5vdCBhdCBhIHRhYmxlIG9yIHRo
ZXJlIGlzIG5vIHJvdy4KT3RoZXJ3aXNlIHJldHVybiBjb25zIChyb3cgLiBpbi1oZWFkZXIpIHdo
ZXJlIGluLWhlYWRlciBpcyBuaWwgb3IgdC4KVGhpcyBpcyB1c2VmdWwgdG8gaW5zZXJ0IGEgbmV3
IHJvdyBqdXN0IGJlbG93IHRoZSBoZWFkZXIgaW5zdGVhZCBvZiBqdXN0CmJlbG93IHRoZSBmaXJz
dCByb3cuCklmIFBPUyBpcyBuaWwgdXNlIGBwb2ludCcuCklmIEFCVVRUSU5HIGlzIG5vbi1uaWws
IHVzZSAoMS0gUE9TKSBpZiBQT1MgaXMgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBwaXBlCnN5bWJvbC4i
CiAgKHNldHEgcG9zIChvciBwb3MgKHBvaW50KSkpCiAgKGxldCAoaW4taGVhZGVyKQogICAgKHdo
ZW4tbGV0KiAoKGF0LXRhYmxlIChtYXJrZG93bi10cy1hdC10YWJsZS1wIHBvcyBhYnV0dGluZykp
CiAgICAgICAgICAgICAgICAocG9zIChjYXIgYXQtdGFibGUpKQogICAgICAgICAgICAgICAgKHRh
YmxlIChjZHIgYXQtdGFibGUpKQogICAgICAgICAgICAgICAgKGNlbGwgKG1hcmtkb3duLXRzLS10
YWJsZS1ub2RlLWNlbGwgbmlsIHBvcyBhYnV0dGluZykpCiAgICAgICAgICAgICAgICAoY2VsbC10
eXBlICh0cmVlc2l0LW5vZGUtdHlwZSBjZWxsKSkKICAgICAgICAgICAgICAgIChwYXJlbnQgKHRy
ZWVzaXQtbm9kZS1wYXJlbnQgY2VsbCkpCiAgICAgICAgICAgICAgICAocGFyZW50LXR5cGUgKHRy
ZWVzaXQtbm9kZS10eXBlIHBhcmVudCkpCiAgICAgICAgICAgICAgICAobGluZWFnZSAobGlzdCBj
ZWxsLXR5cGUgcGFyZW50LXR5cGUpKQogICAgICAgICAgICAgICAgOzsgRmluZCB0aGUgZmlyc3Qg
cm93IGFmdGVyIHRoZSBoZWFkZXIgb3IgdGhlIHJvdyBhdCBQT1MgaXMKICAgICAgICAgICAgICAg
IDs7IG9uIGFuZCBpbiB0aGUgc2FtZSB0YWJsZS4KICAgICAgICAgICAgICAgIChyb3cgKGNvbmQg
KChvciAobWVtYmVyICJwaXBlX3RhYmxlX2hlYWRlciIgbGluZWFnZSkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAobWVtYmVyICJwaXBlX3RhYmxlX2RlbGltaXRlcl9yb3ciIGxpbmVh
Z2UpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgaW4taGVhZGVyIHQpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1zZWFyY2gtZm9yd2FyZCBjZWxsICJcXGBw
aXBlX3RhYmxlX3Jvd1xcJyIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVxdWFsIGNl
bGwtdHlwZSAicGlwZV90YWJsZV9yb3ciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Vs
bCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlcXVhbCBwYXJlbnQtdHlwZSAicGlwZV90
YWJsZV9yb3ciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50KSkpKQogICAgICAo
d2hlbiAodHJlZXNpdC1ub2RlLWVxIHRhYmxlICh0cmVlc2l0LXNlYXJjaC1mb3J3YXJkCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdwogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiXFxgcGlwZV90YWJsZVxcJyIgJ2JhY2t3YXJkKSkKICAgICAgICAoY29u
cyByb3cgaW4taGVhZGVyKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tdGFibGUtY29tcHV0ZS1u
b2RlLWNvbHVtbiAocm93IG5vZGUpCiAgIkNvbXB1dGUgTk9ERSdzIGNvbHVtbiBpbiBST1cuClJl
dHVybiBuaWwgaWYgTk9ERSBpcyBub3QgaW4gUk9XICh0aGlzIHNob3VsZCBub3QgaGFwcGVuKS4K
Tk9ERSBtdXN0IGJlIGEgbm9kZSBpbiBST1cuClJPVyBtdXN0IGJlIGEgcGlwZV90YWJsZV9oZWFk
ZXIsIHBpcGVfdGFibGVfZGVsaW1pdGVyX3Jvdywgb3IKcGlwZV90YWJsZV9yb3cuIgogIChjYXRj
aCA6Y29sdW1uCiAgICAobGV0ICgoY291bnQgMCkpCiAgICAgIChkb2xpc3QgKGNlbGwgKHRyZWVz
aXQtbm9kZS1jaGlsZHJlbiByb3cgJ25hbWVkKSkKICAgICAgICAod2hlbiAodHJlZXNpdC1ub2Rl
LWVxIG5vZGUgY2VsbCkKICAgICAgICAgICh0aHJvdyA6Y29sdW1uIGNvdW50KSkKICAgICAgICAo
c2V0cSBjb3VudCAoMSsgY291bnQpKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS0tZ290
by1jb2x1bW4gKGNvbHVtbiAmb3B0aW9uYWwgbm8tZXJyb3IpCiAgIk1vdmUgcG9pbnQgb24gdGhl
IGN1cnJlbnQgcm93IHRvIENPTFVNTi4KQ09MVU1OIGlzIGEgMC1iYXNlZCBpbmRleC4KUmV0dXJu
IG5vbi1uaWwgaWYgc3VjY2Vzc2Z1bC4KSWYgTk8tRVJST1IgaXMgbm9uLW5pbCwgcmV0dXJuIG5p
bCBpZiB0aGUgY3VycmVudCByb3cgZG9lcyBub3QgZXh0ZW5kIHRvCkNPTFVNTiwgb3RoZXJ3aXNl
IHNpZ25hbCBhbiBlcnJvci4KU2lnbmFsIGFuIGVycm9yIGlmIHBvaW50IGlzIG5vdCBhdCBhIHRh
YmxlLiIKICAoaWYtbGV0KiAoKGNlbGwgKG1hcmtkb3duLXRzLS10YWJsZS1ub2RlLWNlbGwgbmls
IG5pbCB0KSkKICAgICAgICAgICAgKHJvdyAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtcm93IGNl
bGwpKQogICAgICAgICAgICAoY29scyAodHJlZXNpdC1ub2RlLWNoaWxkcmVuIHJvdyAnbmFtZWQp
KSkKICAgICAgKGlmLWxldCogKCh0YXJnZXQtY2VsbCAobnRoIGNvbHVtbiBjb2xzKSkpCiAgICAg
ICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtc3RhcnQgdGFyZ2V0LWNlbGwpKQogICAgICAg
ICh1bmxlc3Mgbm8tZXJyb3IKICAgICAgICAgIChlcnJvciAiQ29sdW1uICVTIG5vdCBmb3VuZCIg
Y29sdW1uKSkpCiAgICAoZXJyb3IgIk5vdCBhdCBhIHRhYmxlIikpKQoKKGRlZnVuIG1hcmtkb3du
LXRzLS10YWJsZS1hbGlnbmVycyAodGFibGUpCiAgIkV4dHJhY3QgdGhlIGhlYWRlciBsaW5lIGFs
aWduZXJzIGZyb20gbm9kZSBUQUJMRS4KUmV0dXJuIGEgbGlzdCBvZiBsaXN0cyBvZiB0aGUgZm9y
bToKICAoOmJlZyB4eHggOmVuZCB4eHggOmFsaWduIGxlZnQpCjphbGlnbiBpcyBvbmUgb2YgYGxl
ZnQnIGBjZW50ZXInIGByaWdodCcgYHVuc3BlY2lmaWVkJy4iCiAgKGxldCogKChkZWxpbWl0ZXIt
cm93ICh0cmVlc2l0LXNlYXJjaC1zdWJ0cmVlCiAgICAgICAgICAgICAgICAgICAgICAgICB0YWJs
ZQogICAgICAgICAgICAgICAgICAgICAgICAgIlxcYHBpcGVfdGFibGVfZGVsaW1pdGVyX3Jvd1xc
JyIpKQogICAgICAgICAoYWxpZ25lcnMKICAgICAgICAgIChsZXQgKHJlcykKICAgICAgICAgICAg
KGRvbGlzdCAoZWx0ICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4gZGVsaW1pdGVyLXJvdyAnbmFtZWQp
KQogICAgICAgICAgICAgIChsZXQgKChhbGlnbi1iZWcgKHRyZWVzaXQtbm9kZS10eXBlCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1jaGlsZCBlbHQgMCAnbmFt
ZSkpKQogICAgICAgICAgICAgICAgICAgIChhbGlnbi1lbmQgKHRyZWVzaXQtbm9kZS10eXBlCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1jaGlsZCBlbHQgLTEg
J25hbWUpKSkpCiAgICAgICAgICAgICAgICAocHVzaCAobGlzdAogICAgICAgICAgICAgICAgICAg
ICAgIDpiZWcgKHRyZWVzaXQtbm9kZS1zdGFydCBlbHQpCiAgICAgICAgICAgICAgICAgICAgICAg
OmVuZCAodHJlZXNpdC1ub2RlLWVuZCBlbHQpCiAgICAgICAgICAgICAgICAgICAgICAgOmFsaWdu
CiAgICAgICAgICAgICAgICAgICAgICAgKGNvbmQgKChhbmQKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChlcXVhbCBhbGlnbi1iZWcgInBpcGVfdGFibGVfYWxpZ25fbGVmdCIpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWwgYWxpZ24tZW5kICJwaXBlX3RhYmxlX2Fs
aWduX2xlZnQiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlZnQpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKChhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChlcXVhbCBhbGlnbi1iZWcgInBpcGVfdGFibGVfYWxpZ25fbGVmdCIpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoZXF1YWwgYWxpZ24tZW5kICJwaXBlX3RhYmxlX2FsaWduX3JpZ2h0
IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZW50ZXIpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKChhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVh
bCBhbGlnbi1iZWcgInBpcGVfdGFibGVfYWxpZ25fcmlnaHQiKQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGVxdWFsIGFsaWduLWVuZCAicGlwZV90YWJsZV9hbGlnbl9yaWdodCIpKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmlnaHQpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKHQgJ3Vuc3BlY2lmaWVkKSkpCiAgICAgICAgICAgICAgICAgICAgICByZXMpKSkK
ICAgICAgICAgICAgKG5yZXZlcnNlIHJlcykpKSkKICAgIGFsaWduZXJzKSkKCihkZWZ1biBtYXJr
ZG93bi10cy0tdGFibGUtbWFrZS1hbGlnbmVyICh3aWR0aCBhbGlnbikKICAiTWFrZSBhIE1hcmtk
b3duIGNvbHVtbiBhbGlnbmVyLgpXSURUSCBpcyB0aGUgY29sdW1uIHdpZHRoLgpBTElHTiBpcyBv
bmUgb2YgYGxlZnQnIGBjZW50ZXInIGByaWdodCcgYHVuc3BlY2lmaWVkJy4iCiAgKHBjYXNlIGFs
aWduCiAgICAoJ2xlZnQKICAgICAoY29uY2F0ICI6IiAobWFrZS1zdHJpbmcgKDEtIHdpZHRoKSA/
LSkpKQogICAgKCdjZW50ZXIKICAgICAoY29uY2F0ICI6IiAobWFrZS1zdHJpbmcgKC0gd2lkdGgg
MikgPy0pICI6IikpCiAgICAoJ3JpZ2h0CiAgICAgKGNvbmNhdCAobWFrZS1zdHJpbmcgKDEtIHdp
ZHRoKSA/LSkgIjoiKSkKICAgIChfCiAgICAgKGNvbmNhdCAobWFrZS1zdHJpbmcgd2lkdGggPy0p
KSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS10YWJsZS1hbGlnbi1jZWxsICh0ZXh0IHdpZHRoIGFs
aWduKQogICJSZXR1cm4gVEVYVCBwYWRkZWQgdG8gV0lEVEggYWxpZ25lZCB1c2luZyBBTElHTi4K
VHJ1bmNhdGUgVEVYVCB3aWRlciB0aGFuIFdJRFRILiAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3Bv
bnNpYmlsaXR5IHRvCmVuc3VyZSB0ZXh0IHdpbGwgZml0LgpBTElHTiBpcyBvbmUgb2YgYGxlZnQn
IGBjZW50ZXInIGByaWdodCcgYHVuc3BlY2lmaWVkJy4iCiAgKGxldCogKChzdHJsZW4gKGxlbmd0
aCB0ZXh0KSkKICAgICAgICAgKHN0cmxlbjAgKG1pbiB3aWR0aCBzdHJsZW4pKQogICAgICAgICAo
dGV4dDAgKHN1YnN0cmluZyB0ZXh0IDAgc3RybGVuMCkpCiAgICAgICAgIChwYWQgKC0gd2lkdGgg
c3RybGVuMCkpKQogICAgKHBjYXNlIGFsaWduCiAgICAgICgnY2VudGVyCiAgICAgICAobGV0KiAo
KGhhbGYtcGFkIChtYWtlLXN0cmluZyAoZmxvb3IgKC8gcGFkIDIpKSA/XHMpKQogICAgICAgICAg
ICAgIChzIChjb25jYXQKICAgICAgICAgICAgICAgICAgaGFsZi1wYWQKICAgICAgICAgICAgICAg
ICAgdGV4dDAKICAgICAgICAgICAgICAgICAgaGFsZi1wYWQpKSkKICAgICAgICAgKHN0cmluZy1w
YWQKICAgICAgICAgIChzdWJzdHJpbmcgcyAwIChtaW4gKGxlbmd0aCBzKSB3aWR0aCkpCiAgICAg
ICAgICB3aWR0aCkpKQogICAgICAoJ3JpZ2h0CiAgICAgICAoc3RyaW5nLXBhZCB0ZXh0IHdpZHRo
IG5pbCAnc3RhcnQpKQogICAgICAoXwogICAgICAgKHN0cmluZy1wYWQgdGV4dCB3aWR0aCkpKSkp
Cgo7Ozs7IENvbW1hbmRzOgoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWluc2VydC10YWJsZSAo
Jm9wdGlvbmFsIG5yb3dzIG5jb2xzIGhlYWRpbmdzIGJvZHkpCiAgIkluc2VydCBhIE1hcmtkb3du
IHBpcGUgdGFibGUuCk5ST1dTIGlzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgbmV3IHRhYmxl
IGFuZCBkZWZhdWx0cyB0byAzLgoKTkNPTFMgaXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGFuZCBk
ZWZhdWx0cyB0byAzLgoKSEVBRElOR1MgaXMgYSBsaXN0IG9mIGhlYWRpbmdzIGFuZCBkZWZhdWx0
cyB0byBsZWZ0LWFsaWduZWQgc3ludGhlc2l6ZWQKY29sdW1uIG5hbWVzLiAgSWYgTkNPTFMgaXMg
bmlsLCB1c2UgSEVBRElOR1MgbGVuZ3RoLiAgSWYgYm90aCBOQ09MUyBhbmQKSEVBRElOR1MgYXJl
IG5vbi1uaWwsIHVzZSB1cCB0byBOQ09MUyBoZWFkaW5ncywgc3ludGhlc2l6aW5nIHRoZQpyZW1h
aW5kZXIuCgpFYWNoIGhlYWRpbmcgaW4gdGhlIGxpc3QgY2FuIGJlIGEgc3RyaW5nIGNvbHVtbiBu
YW1lIG9yIGEgY29ucyBvZiB0aGUKZm9ybSAobmFtZSAuIGFsaWdubWVudCkgd2hlcmUgYWxpZ25t
ZW50IGlzIG9uZSBvZiB0aGUgc3ltYm9scyBgbGVmdCcsCmByaWdodCcsIG9yIGBjZW50ZXInLiAg
SWYgYSBzdHJpbmcsIGRlZmF1bHQgYWxpZ25tZW50IGlzIHVuc3BlY2lmaWVkLgoKSWYgQk9EWSBp
cyBub24tbmlsLCBpdCBpcyBhIGxpc3Qgb2YgTlJPV1Mgcm93cyB3aGVyZSBlYWNoIHJvdyBpcyBh
IGxpc3QKb2YgTkNPTFMgYm9keSBjZWxscy4KCkZvciBjb252ZW5pZW5jZSBhbmQgYWVzdGhldGlj
cywgcGFkIGVhY2ggYm9keSBjZWxsIHRvIHRoZSB3aWR0aCBvZiBpdHMKY29sdW1uJ3MgaGVhZGVy
LCBhbmQgYWNjb21tb2RhdGUgYWxpZ25tZW50IGluZGljYXRvcnMuICBJZiBhIEJPRFkgY2VsbApp
cyBsb25nZXIgdGhhbiBpdHMgY29sdW1uIGhlYWRlciwgaW5zZXJ0IGl0IHVuY2hhbmdlZC4KCk5v
dGU6IEEgYmxhbmsgbGluZSBpcyBuZWVkZWQgYmVmb3JlIHRoZSB0YWJsZSBmb3IgaXQgdG8gcHJv
cGVybHkgcmVuZGVyLgpJZiB0aGUgbGluZSBwcmVjZWRpbmcgYHBvaW50JyBpcyBub3QgYmxhbmss
IGluc2VydCBvbmUuCgpOb3RlOiBEdWUgdG8gYW4gaXNzdWUgd2l0aCB0aGUgdHJlZS1zaXR0ZXIg
TWFya2Rvd24gZ3JhbW1hciwgYSByb3cgb2YKZW1wdHkgY2VsbHMgY2F1c2VzIGEgcGFyc2luZyBl
cnJvci4gIFRvIGF2b2lkIHRoaXMsIGFuIGVtcHR5IHJvdyB3aWxsCmNvbnRhaW4gYSBzaW5nbGUg
cGVyaW9kIGluIGl0cyBmaXJzdCBjZWxsLiIKICAoaW50ZXJhY3RpdmUpCiAgKHNldHEgbnJvd3Mg
KG9yIG5yb3dzIDMpKQogIChzZXRxIG5jb2xzIChvciBuY29scyAoYW5kIGhlYWRpbmdzIChsZW5n
dGggaGVhZGluZ3MpKSAzKSkKICAoc2V0cSBoZWFkaW5ncwogICAgICAgIChsZXQgKHJlcykKICAg
ICAgICAgIChkb3RpbWVzICh4IG5jb2xzKQogICAgICAgICAgICAocHVzaCAob3IgKG50aCB4IGhl
YWRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiQ29sdW1uICVkIiAoMSsgeCkp
KQogICAgICAgICAgICAgICAgICByZXMpKQogICAgICAgICAgKG5yZXZlcnNlIHJlcykpKQogIChs
ZXQgKChoZWFkaW5nLXdpZHRocwogICAgICAgICAobGV0IChyZXMpCiAgICAgICAgICAgKGRvbGlz
dCAoZWx0IGhlYWRpbmdzKQogICAgICAgICAgICAgKGxldCAoKHN0ciAoaWYgKGNvbnNwIGVsdCkg
KGNhciBlbHQpIGVsdCkpKQogICAgICAgICAgICAgICAocHVzaCAobWF4IG1hcmtkb3duLXRzLXRh
YmxlLWRlZmF1bHQtY29sdW1uLXdpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0
aCBzdHIpKQogICAgICAgICAgICAgICAgICAgICByZXMpKSkKICAgICAgICAgICAobnJldmVyc2Ug
cmVzKSkpKQogICAgOzsgSWYgcG9pbnQgaXMgbm90IGF0IGJvbCwgaW5zZXJ0IGEgbmV3bGluZS4K
ICAgICh1bmxlc3MgKGVxIChwb2ludCkgKHBvcy1ib2wpKQogICAgICAoaW5zZXJ0ICJcbiIpKQog
ICAgOzsgSW5zZXJ0IGFuIGVtcHR5IGxpbmUgaWYgbmVlZGVkLgogICAgKHVubGVzcyAoc2F2ZS1l
eGN1cnNpb24KICAgICAgICAgICAgICAoZm9yd2FyZC1saW5lIC0xKQogICAgICAgICAgICAgIChl
cSAocG9zLWJvbCkgKHBvcy1lb2wpKSkKICAgICAgKGluc2VydCAiXG4iKSkKICAgIDs7IEluc2Vy
dCBwYWRkZWQgaGVhZGluZyB0ZXh0LgogICAgKGluc2VydCAifCIpCiAgICAoZG90aW1lcyAoeCBu
Y29scykKICAgICAgKGxldCogKChlbHQgKG50aCB4IGhlYWRpbmdzKSkKICAgICAgICAgICAgIChz
dHIgKGlmIChjb25zcCBlbHQpIChjYXIgZWx0KSBlbHQpKQogICAgICAgICAgICAgKHdpZHRoICht
YXggMyAobnRoIHggaGVhZGluZy13aWR0aHMpKSkKICAgICAgICAgICAgIChwYWQtd2lkdGggKC0g
d2lkdGggKGxlbmd0aCBzdHIpKSkpCiAgICAgICAgKGluc2VydCBzdHIgKG1ha2Utc3RyaW5nIHBh
ZC13aWR0aCA/XHMpICJ8IikpKQogICAgKGluc2VydCAiXG4iKQogICAgOzsgSW5zZXJ0IHBhZGRl
ZCBoZWFkaW5nIGFsaWduZXJzLgogICAgKGluc2VydCAifCIpCiAgICAoZG90aW1lcyAoeCBuY29s
cykKICAgICAgKGxldCogKChlbHQgKG50aCB4IGhlYWRpbmdzKSkKICAgICAgICAgICAgIChhbGln
biAoaWYgKGNvbnNwIGVsdCkgKGNkciBlbHQpICd1bnNwZWNpZmllZCkpCiAgICAgICAgICAgICAo
d2lkdGggKG1heCAzIChudGggeCBoZWFkaW5nLXdpZHRocykpKSkKICAgICAgICAoaW5zZXJ0ICht
YXJrZG93bi10cy0tdGFibGUtbWFrZS1hbGlnbmVyIHdpZHRoIGFsaWduKSkpCiAgICAgIChpbnNl
cnQgInwiKSkKICAgIChpbnNlcnQgIlxuIikKICAgIDs7IEluc2VydCBCT0RZIGNlbGxzIG9yIGVt
cHR5IGNlbGxzLgogICAgKGRvdGltZXMgKHkgbnJvd3MpCiAgICAgIChpbnNlcnQgInwiKQogICAg
ICAobGV0ICgocm93IChudGggeSBib2R5KSkpCiAgICAgICAgKGRvdGltZXMgKHggbmNvbHMpCiAg
ICAgICAgICA7OyBUT0RPOiBSZW1vdmUgdGhlIHBsYWNlaG9sZGVyIGNoYXJhY3RlciBpZiB0aGUg
dHJlZS1zaXR0ZXIKICAgICAgICAgIDs7IGdyYW1tYXIgaXMgcmVwYWlyZWQuCiAgICAgICAgICAo
bGV0KiAoKHN0ciAob3IgKG50aCB4IHJvdykgKGFuZCAoZXEgeCAwKSAiLiIpICIiKSkKICAgICAg
ICAgICAgICAgICAoc3RybGVuIChsZW5ndGggc3RyKSkKICAgICAgICAgICAgICAgICAod2lkdGgg
KG50aCB4IGhlYWRpbmctd2lkdGhzKSkKICAgICAgICAgICAgICAgICAocGFkLXdpZHRoIChtYXgg
MCAoLSB3aWR0aCBzdHJsZW4pKSkpCiAgICAgICAgICAgIChpbnNlcnQgc3RyCiAgICAgICAgICAg
ICAgICAgICAgKG1ha2Utc3RyaW5nIHBhZC13aWR0aCA/XHMpCiAgICAgICAgICAgICAgICAgICAg
InwiKSkpCiAgICAgICAgKGluc2VydCAiXG4iKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJs
ZS1kZWxldGUtdGFibGUgKCkKICAiUmVtb3ZlIHRoZSBNYXJrZG93biB0YWJsZSBhdCBwb2ludC4K
SWYgcG9pbnQgaXMgbm90IGF0IGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSkK
ICAobWFya2Rvd24tdHMtLWJhcmYtaWYtbm90LW1vZGUgJ21hcmtkb3duLXRzLXRhYmxlLWRlbGV0
ZS10YWJsZSkKICAod2hlbi1sZXQqICgoYXQtdGFibGUgKG1hcmtkb3duLXRzLWF0LXRhYmxlLXAg
bmlsIHQpKQogICAgICAgICAgICAgICh0YWJsZSAoY2RyIGF0LXRhYmxlKSkpCiAgICA7OyBUT0RP
OiBSZW1vdmUgYWZ0ZXIgYnVnIzIzOTAzIFVuZG8gYWZ0ZXIga2IgZGlmZmVycyBmcm9tIGFmdGVy
IE0teAogICAgKHB1c2ggKHBvaW50KSBidWZmZXItdW5kby1saXN0KQogICAgKGRlbGV0ZS1yZWdp
b24gKHRyZWVzaXQtbm9kZS1zdGFydCB0YWJsZSkgKHRyZWVzaXQtbm9kZS1lbmQgdGFibGUpKSkp
CgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtcHJldmlvdXMtcm93ICgpCiAgIk1vdmUgdG8gdGhl
IHByZXZpb3VzIHJvdyBpbiB0aGUgdGFibGUuCklmIG5vdCBpbiBhIHRhYmxlLCBkbyBub3RoaW5n
LiIKICAoaW50ZXJhY3RpdmUpCiAgKG1hcmtkb3duLXRzLXRhYmxlLW5leHQtcm93IC0xKSkKCihk
ZWZ1biBtYXJrZG93bi10cy10YWJsZS1uZXh0LXJvdyAoJm9wdGlvbmFsIG4pCiAgIk1vdmUgdG8g
dGhlIG5leHQgcm93IGluIHRoZSB0YWJsZS4KSWYgTiBpcyBuZWdhdGl2ZSwgbW92ZSB0byB0aGUg
cHJldmlvdXMgcm93LgpJZiBwb2ludCBpcyBvbiB0aGUgbGFzdCByb3cgb2YgdGhlIHRhYmxlLCBp
bnNlcnQgYSBuZXcgcm93IGJlbG93IGFuZAptb3ZlIGludG8gaXQuICBXaXRoIGEgcHJlZml4IGFy
Z3VtZW50LCBjbG9uZSB0aGUgZmluYWwgcm93IGludG8gdGhlIG5ldwpvbmUuCklmIG5vdCBpbiBh
IHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUpCiAgKG1hcmtkb3duLXRzLS1iYXJm
LWlmLW5vdC1tb2RlICdtYXJrZG93bi10cy10YWJsZS1uZXh0LXJvdykKICAobGV0ICgoYmFja3dh
cmRzIChhbmQgbiAoPCBuIDApKSkpCiAgICA7OyBEb24ndCB1c2UgYG1hcmtkb3duLXRzLS10YWJs
ZS1ib2R5LXJvdy1uZWFyLXBvcycgYmVjYXVzZSB3ZSB3YW50CiAgICA7OyB0byBvcGVyYXRlIGlu
IHRoZSBoZWFkZXIuCiAgICAod2hlbi1sZXQqICgoYXQtdGFibGUgKG1hcmtkb3duLXRzLWF0LXRh
YmxlLXAgbmlsIHQpKQogICAgICAgICAgICAgICAgKHBvcyAoY2FyIGF0LXRhYmxlKSkKICAgICAg
ICAgICAgICAgICh0YWJsZSAoY2RyIGF0LXRhYmxlKSkKICAgICAgICAgICAgICAgIChyb3cgKG1h
cmtkb3duLXRzLS10YWJsZS1ub2RlLXJvdyBuaWwgcG9zKSkpCiAgICAgIDs7IElmIG5vIG5leHQg
b3IgcHJldiBzaWJsaW5nLCB3ZSdyZSBvbiB0aGUgbGFzdC9maXJzdCByb3cuCiAgICAgIChsZXQg
KChjdXJyZW50LWNvbHVtbiAoY3VycmVudC1jb2x1bW4pKQogICAgICAgICAgICAobmV4dC1yb3cg
KGlmIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtcHJl
di1zaWJsaW5nIHJvdyAnbmFtZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5v
ZGUtbmV4dC1zaWJsaW5nIHJvdyAnbmFtZWQpKSkpCiAgICAgICAgKGlmIG5leHQtcm93CiAgICAg
ICAgICAgIChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1zdGFydCBuZXh0LXJvdykpCiAgICAgICAg
ICAodW5sZXNzIGJhY2t3YXJkcwogICAgICAgICAgICAobWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0
LXJvdy1iZWxvdyBjdXJyZW50LXByZWZpeC1hcmcpKSkKICAgICAgICAobW92ZS10by1jb2x1bW4g
Y3VycmVudC1jb2x1bW4pKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLXByZXZpb3VzLWNl
bGwgKCkKICAiTW92ZSB0byB0aGUgcHJldmlvdXMgY2VsbCBpbiB0aGUgdGFibGUuCklmIG5vdCBp
biBhIHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUpCiAgKG1hcmtkb3duLXRzLXRh
YmxlLW5leHQtY2VsbCAtMSkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtbmV4dC1jZWxsICgm
b3B0aW9uYWwgbikKICAiTW92ZSB0byB0aGUgbmV4dCBjZWxsIGluIHRoZSB0YWJsZS4KSWYgTiBp
cyBuZWdhdGl2ZSwgbW92ZSB0byB0aGUgcHJldmlvdXMgY2VsbC4KSWYgbm90IGluIGEgdGFibGUs
IGRvIG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24tdHMtLWJhcmYtaWYtbm90
LW1vZGUgJ21hcmtkb3duLXRzLXRhYmxlLW5leHQtY2VsbCkKICAobGV0ICgoYmFja3dhcmRzIChh
bmQgbiAoPCBuIDApKSkpCiAgICAod2hlbi1sZXQqICgoYXQtdGFibGUgKG1hcmtkb3duLXRzLWF0
LXRhYmxlLXAgbmlsIHQpKQogICAgICAgICAgICAgICAgKHBvcyAoY2FyIGF0LXRhYmxlKSkKICAg
ICAgICAgICAgICAgICh0YWJsZSAoY2RyIGF0LXRhYmxlKSkKICAgICAgICAgICAgICAgIChub2Rl
ICh0cmVlc2l0LW5vZGUtYXQgcG9zICdtYXJrZG93biAnbmFtZWQpKQogICAgICAgICAgICAgICAg
KGNlbGwgKG1hcmtkb3duLXRzLS10YWJsZS1ub2RlLWNlbGwgbm9kZSkpCiAgICAgICAgICAgICAg
ICAoY2VsbC10eXBlICh0cmVlc2l0LW5vZGUtdHlwZSBub2RlKSkKICAgICAgICAgICAgICAgIChy
b3cgKG1hcmtkb3duLXRzLS10YWJsZS1ub2RlLXJvdyBjZWxsKSkKICAgICAgICAgICAgICAgIChy
b3ctdHlwZSAodHJlZXNpdC1ub2RlLXR5cGUgcm93KSkKICAgICAgICAgICAgICAgIChuZXh0LWNl
bGwKICAgICAgICAgICAgICAgICAoY29uZAogICAgICAgICAgICAgICAgICA7OyBJZiBpbiBhIHBp
cGVfdGFibGVfZGVsaW1pdGVyX3JvdyBhbmQgbm90IHRoZSBmaXJzdAogICAgICAgICAgICAgICAg
ICA7OyBvciBmaW5hbCBjZWxsIGluIHRoZSByb3csIHN0YXkgd2l0aGluIHRoZSByb3cKICAgICAg
ICAgICAgICAgICAgOzsgb3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBjb25kaXRpb24gc2hvdWxkIG1h
dGNoLgogICAgICAgICAgICAgICAgICAoKGFuZCAoZXF1YWwgcm93LXR5cGUgInBpcGVfdGFibGVf
ZGVsaW1pdGVyX3JvdyIpCiAgICAgICAgICAgICAgICAgICAgICAgIChpZiBiYWNrd2FyZHMKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtcHJldi1zaWJsaW5nIGNlbGwg
J25hbWVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtbmV4dC1zaWJs
aW5nIGNlbGwgJ25hbWVkKSkpCiAgICAgICAgICAgICAgICAgICAoaWYgYmFja3dhcmRzCiAgICAg
ICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1wcmV2LXNpYmxpbmcgY2VsbCAnbmFtZWQp
CiAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtbmV4dC1zaWJsaW5nIGNlbGwgJ25h
bWVkKSkpCiAgICAgICAgICAgICAgICAgIDs7IElmIG9uIHRoZSBmaXJzdCBwaXBlX3RhYmxlX3Jv
dydzIGZpcnN0IGNlbGwgbW92aW5nCiAgICAgICAgICAgICAgICAgIDs7IGJhY2t3YXJkcywgbW92
ZSBpbnRvIHRoZSBmaW5hbAogICAgICAgICAgICAgICAgICA7OyBwaXBlX3RhYmxlX2RlbGltaXRl
cl9jZWxsLgogICAgICAgICAgICAgICAgICAoKGFuZCAoZXF1YWwgY2VsbC10eXBlICJwaXBlX3Rh
YmxlX2NlbGwiKQogICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWwgKHRyZWVzaXQtbm9kZS10
eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1wcmV2LXNp
Ymxpbmcgcm93ICduYW1lZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGlwZV90
YWJsZV9kZWxpbWl0ZXJfcm93IikKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAodHJlZXNp
dC1ub2RlLXByZXYtc2libGluZyBjZWxsICduYW1lZCkpCiAgICAgICAgICAgICAgICAgICAgICAg
IGJhY2t3YXJkcykKICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LXNlYXJjaC1mb3J3YXJkCiAg
ICAgICAgICAgICAgICAgICAgY2VsbAogICAgICAgICAgICAgICAgICAgICJcXGBwaXBlX3RhYmxl
X2RlbGltaXRlcl9jZWxsXFwnIiBiYWNrd2FyZHMpKQogICAgICAgICAgICAgICAgICA7OyBJZiBv
biB0aGUgZmlyc3QgcGlwZV90YWJsZV9oZWFkZXIncyBmaW5hbCBjZWxsCiAgICAgICAgICAgICAg
ICAgIDs7IG1vdmluZyBmb3J3YXJkcywgbW92ZSBpbnRvIHRoZSBmaXJzdAogICAgICAgICAgICAg
ICAgICA7OyBwaXBlX3RhYmxlX2RlbGltaXRlcl9jZWxsLgogICAgICAgICAgICAgICAgICAoKGFu
ZCAoZXF1YWwgY2VsbC10eXBlICJwaXBlX3RhYmxlX2NlbGwiKQogICAgICAgICAgICAgICAgICAg
ICAgICAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKHRyZWVzaXQtbm9kZS1uZXh0LXNpYmxpbmcgcm93ICduYW1lZCkpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAicGlwZV90YWJsZV9kZWxpbWl0ZXJfcm93IikKICAgICAgICAg
ICAgICAgICAgICAgICAgKG5vdCAodHJlZXNpdC1ub2RlLW5leHQtc2libGluZyBjZWxsICduYW1l
ZCkpCiAgICAgICAgICAgICAgICAgICAgICAgIChub3QgYmFja3dhcmRzKSkKICAgICAgICAgICAg
ICAgICAgICh0cmVlc2l0LXNlYXJjaC1mb3J3YXJkCiAgICAgICAgICAgICAgICAgICAgY2VsbAog
ICAgICAgICAgICAgICAgICAgICJcXGBwaXBlX3RhYmxlX2RlbGltaXRlcl9jZWxsXFwnIiBiYWNr
d2FyZHMpKQogICAgICAgICAgICAgICAgICAodAogICAgICAgICAgICAgICAgICAgKHRyZWVzaXQt
c2VhcmNoLWZvcndhcmQKICAgICAgICAgICAgICAgICAgICBjZWxsCiAgICAgICAgICAgICAgICAg
ICAgIlxcYHBpcGVfdGFibGVfY2VsbFxcJyIgYmFja3dhcmRzKSkpKSkKICAgICAgOzsgS2VlcCBw
b2ludCB3aXRoaW4gdGhlIGN1cnJlbnQgdGFibGUuCiAgICAgICh3aGVuICh0cmVlc2l0LW5vZGUt
ZXEgdGFibGUgKHRyZWVzaXQtc2VhcmNoLWZvcndhcmQKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbmV4dC1jZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJcXGBwaXBlX3RhYmxlXFwnIiAnYmFja3dhcmQpKQogICAgICAgIChnb3RvLWNoYXIgKHRyZWVz
aXQtbm9kZS1zdGFydCBuZXh0LWNlbGwpKSkKICAgICAgKHdoZW4gKG9yIChlcSBtYXJrZG93bi10
cy10YWJsZS1hdXRvLWFsaWduIHQpCiAgICAgICAgICAgICAgICAobWVtcSAnY2VsbC1uYXZpZ2F0
aW9uIG1hcmtkb3duLXRzLXRhYmxlLWF1dG8tYWxpZ24pKQogICAgICAgIChtYXJrZG93bi10cy10
YWJsZS1hbGlnbi10YWJsZSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LXJv
dy1iZWxvdyAoJm9wdGlvbmFsIGNsb25lKQogICJJbnNlcnQgYSB0YWJsZSByb3cgYmVsb3cgcG9p
bnQuCklmIHBvaW50IGlzIGluIHRoZSBoZWFkZXIsIGluc2VydCBiZWxvdyB0aGUgZmlyc3Qgcm93
IG9mIHRoZSB0YWJsZS4KSWYgQ0xPTkUgaXMgbm9uLW5pbCwgb3Igd2l0aCBhIHByZWZpeCBhcmd1
bWVudCwgY2xvbmUgdGhlIGN1cnJlbnQgcm93LgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwg
ZG8gbm90aGluZy4iCiAgKGludGVyYWN0aXZlICJQIikKICAoc2V0cSBjbG9uZSAob3IgY2xvbmUg
Y3VycmVudC1wcmVmaXgtYXJnKSkKICAgIChtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtcm93ICdi
ZWxvdyBjbG9uZSkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LXJvdy1hYm92ZSAo
Jm9wdGlvbmFsIGNsb25lKQogICJJbnNlcnQgYSB0YWJsZSByb3cgYWJvdmUgcG9pbnQuCklmIHBv
aW50IGlzIGluIHRoZSBoZWFkZXIsIGluc2VydCBhYm92ZSB0aGUgZmlyc3Qgcm93IG9mIHRoZSB0
YWJsZS4KSWYgQ0xPTkUgaXMgbm9uLW5pbCwgb3Igd2l0aCBhIHByZWZpeCBhcmd1bWVudCwgY2xv
bmUgdGhlIGN1cnJlbnQgcm93LgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwgZG8gbm90aGlu
Zy4iCiAgKGludGVyYWN0aXZlICJQIikKICAoc2V0cSBjbG9uZSAob3IgY2xvbmUgY3VycmVudC1w
cmVmaXgtYXJnKSkKICAgIChtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtcm93ICdhYm92ZSBjbG9u
ZSkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtY2xvbmUtcm93LWJlbG93ICgpCiAgIkluc2Vy
dCBhIHRhYmxlIHJvdyBiZWxvdyBwb2ludC4KSWYgcG9pbnQgaXMgaW4gdGhlIGhlYWRlciwgaW5z
ZXJ0IGJlbG93IHRoZSBmaXJzdCByb3cgb2YgdGhlIHRhYmxlLgpJZiBwb2ludCBpcyBub3QgYXQg
YSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVyYWN0aXZlKQogIChtYXJrZG93bi10cy10YWJs
ZS1pbnNlcnQtcm93LWJlbG93ICdjbG9uZSkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtY2xv
bmUtcm93LWFib3ZlICgpCiAgIkluc2VydCBhIHRhYmxlIHJvdyBhYm92ZSBwb2ludC4KSWYgcG9p
bnQgaXMgaW4gdGhlIGhlYWRlciwgaW5zZXJ0IGFib3ZlIHRoZSBmaXJzdCByb3cgb2YgdGhlIHRh
YmxlLgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVyYWN0
aXZlKQogIChtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtcm93LWFib3ZlICdjbG9uZSkpCgooZGVm
dW4gbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LXJvdyAoJm9wdGlvbmFsIGFib3ZlIGNsb25lKQog
ICJJbnNlcnQgYSB0YWJsZSByb3cgYmVsb3cgcG9pbnQuCklmIHBvaW50IGlzIGluIHRoZSBoZWFk
ZXIsIGluc2VydCBiZWxvdyB0aGUgZmlyc3Qgcm93IG9mIHRoZSB0YWJsZS4KSWYgQUJPVkUgaXMg
bm9uLW5pbCBhbmQgaXMgbm90IGBiZWxvdycsIG9yIHdpdGggYSBwcmVmaXggYXJndW1lbnQsCmlu
c2VydCB0aGUgcm93IGFib3ZlIHBvaW50LgpJZiBDTE9ORSBpcyBub24tbmlsLCBjbG9uZSB0aGUg
Y3VycmVudCByb3csIG90aGVyd2lzZSBpbnNlcnQgZW1wdHkKY2VsbHMuCklmIHBvaW50IGlzIG5v
dCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUgIlAiKQogIChtYXJrZG93
bi10cy0tYmFyZi1pZi1ub3QtbW9kZSAnbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LXJvdykKICAo
c2V0cSBhYm92ZSAoY29uZCAoKGVxIGFib3ZlICdiZWxvdykgbmlsKQogICAgICAgICAgICAgICAg
ICAgIChhYm92ZSBhYm92ZSkKICAgICAgICAgICAgICAgICAgICAoY3VycmVudC1wcmVmaXgtYXJn
IHQpKSkKICAod2hlbi1sZXQqICgoYXQtdGFibGUgKG1hcmtkb3duLXRzLWF0LXRhYmxlLXAgbmls
IHQpKQogICAgICAgICAgICAgIChwb3MgKGNhciBhdC10YWJsZSkpCiAgICAgICAgICAgICAgKHRh
YmxlIChjZHIgYXQtdGFibGUpKQogICAgICAgICAgICAgIChkZWxpbWl0ZXItcm93ICh0cmVlc2l0
LXNlYXJjaC1zdWJ0cmVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJcXGBwaXBlX3RhYmxlX2RlbGltaXRlcl9yb3dcXCci
KSkKICAgICAgICAgICAgICAobmNvbHMgKHRyZWVzaXQtbm9kZS1jaGlsZC1jb3VudCBkZWxpbWl0
ZXItcm93ICduYW1lZCkpCiAgICAgICAgICAgICAgKGhlYWRpbmctd2lkdGhzCiAgICAgICAgICAg
ICAgIChsZXQgKHJlcykKICAgICAgICAgICAgICAgICAoZG9saXN0IChlbHQgKHRyZWVzaXQtbm9k
ZS1jaGlsZHJlbiBkZWxpbWl0ZXItcm93ICduYW1lZCkpCiAgICAgICAgICAgICAgICAgICAocHVz
aCAobGVuZ3RoICh0cmVlc2l0LW5vZGUtdGV4dCBlbHQpKSByZXMpKQogICAgICAgICAgICAgICAg
IChucmV2ZXJzZSByZXMpKSkpCiAgICAobGV0KiAoKG5lYXIgKG1hcmtkb3duLXRzLS10YWJsZS1i
b2R5LXJvdy1uZWFyLXBvcyBwb3MpKQogICAgICAgICAgIChyb3cgKGNhciBuZWFyKSkKICAgICAg
ICAgICAoY3VycmVudC1jb2x1bW4gKGN1cnJlbnQtY29sdW1uKSkpCiAgICAgIDs7IElmIHJvdyBp
cyBuaWwsIHRoZXJlIGFyZSB6ZXJvIHJvd3Mgc28gYWRkIG9uZSBiZWxvdyB0aGUKICAgICAgOzsg
ZGVsaW1pdGVyLXJvdy4KICAgICAgKHVubGVzcyByb3cKICAgICAgICAoc2V0cSBjbG9uZSBuaWwp
CiAgICAgICAgKHNldHEgcm93IGRlbGltaXRlci1yb3cpCiAgICAgICAgKHNldHEgYWJvdmUgbmls
KSkKICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgKGNvbmQgKGFib3ZlCiAgICAgICAgICAg
ICAgIChnb3RvLWNoYXIgKHRyZWVzaXQtbm9kZS1zdGFydCByb3cpKSkKICAgICAgICAgICAgICAo
dAogICAgICAgICAgICAgICAoZ290by1jaGFyICh0cmVlc2l0LW5vZGUtZW5kIHJvdykpCiAgICAg
ICAgICAgICAgIChpbnNlcnQgIlxuIikpKQogICAgICAgIChjb25kIChjbG9uZQogICAgICAgICAg
ICAgICA7OyBUaGUgY2xvbmUgc3RyYXRlZ3kgaXMgV1lTSVdZRy4gIEp1c3QgY29weSB0aGUgdGV4
dAogICAgICAgICAgICAgICA7OyBhbmQgZG9uJ3QgZnVzcyB3aXRoIGNlbGwgY29udGVudCBhbmQg
cGlwZSBzeW1ib2xzLgogICAgICAgICAgICAgICA7OyBUaGUgZ3JhbW1hciBpbmNsdWRlcyB0aGUg
ZmluYWwgbmV3bGluZSAoYW5kCiAgICAgICAgICAgICAgIDs7IHNvbWV0aW1lcyBub3QpLgogICAg
ICAgICAgICAgICAoaW5zZXJ0IChzdHJpbmctdHJpbS1yaWdodAogICAgICAgICAgICAgICAgICAg
ICAgICAodHJlZXNpdC1ub2RlLXRleHQgcm93ICduby1wcm9wZXJ0eSkgIlxuIikpKQogICAgICAg
ICAgICAgICh0CiAgICAgICAgICAgICAgIChpbnNlcnQgInwiKQogICAgICAgICAgICAgICAoZG90
aW1lcyAoeCBuY29scykKICAgICAgICAgICAgICAgICAobGV0ICgocGFkLXdpZHRoIChudGggeCBo
ZWFkaW5nLXdpZHRocykpKQogICAgICAgICAgICAgICAgICAgOzsgVE9ETzogUmVtb3ZlIHRoZSBw
bGFjZWhvbGRlciBjaGFyYWN0ZXIgaWYgdGhlCiAgICAgICAgICAgICAgICAgICA7OyB0cmVlLXNp
dHRlciBncmFtbWFyIGlzIHJlcGFpcmVkLgogICAgICAgICAgICAgICAgICAgKGluc2VydCAoaWYg
KGVxIHggMCkgIi4iICIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZS1zdHJpbmcg
KC0gcGFkLXdpZHRoIChpZiAoZXEgeCAwKSAxIDApKSA/XHMpCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICJ8IikpKSkpCiAgICAgICAgKHdoZW4gYWJvdmUKICAgICAgICAgIChpbnNlcnQgIlxu
IikpKQogICAgICAoY29uZCAoYWJvdmUKICAgICAgICAgICAgICh3aGVuICg+IGN1cnJlbnQtY29s
dW1uIDApCiAgICAgICAgICAgICAgICh3aXRoLXN1cHByZXNzZWQtd2FybmluZ3MgKChpbnRlcmFj
dGl2ZS1vbmx5IHByZXZpb3VzLWxpbmUpKQogICAgICAgICAgICAgICAgIChwcmV2aW91cy1saW5l
KSkpKQogICAgICAgICAgICAodCAod2l0aC1zdXBwcmVzc2VkLXdhcm5pbmdzICgoaW50ZXJhY3Rp
dmUtb25seSBuZXh0LWxpbmUpKQogICAgICAgICAgICAgICAgIChuZXh0LWxpbmUpKSkpKSkpCgoo
ZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtZGVsZXRlLXJvdyAoKQogICJEZWxldGUgdGhlIHRhYmxl
IHJvdyBhdCBwb2ludC4KSWYgcG9pbnQgaXMgb24gdGhlIGhlYWRlciBvciBkZWxpbWl0ZXIgcm93
LCBkbyBub3RoaW5nLgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAg
KGludGVyYWN0aXZlKQogIChtYXJrZG93bi10cy0tYmFyZi1pZi1ub3QtbW9kZSAnbWFya2Rvd24t
dHMtdGFibGUtZGVsZXRlLXJvdykKICAod2hlbi1sZXQqICgobmVhciAobWFya2Rvd24tdHMtLXRh
YmxlLWJvZHktcm93LW5lYXItcG9zIG5pbCB0KSkKICAgICAgICAgICAgICA7OyBCYWlsIGlmIHBv
aW50IGlzIG9uIHRoZSBoZWFkZXIgb3IgZGVsaW1pdGVyIHJvdyDigJQgZG8KICAgICAgICAgICAg
ICA7OyBub3Qgc2lsZW50bHkgZGVsZXRlIGEgYm9keSByb3cgdGhlIHVzZXIgZGlkIG5vdCBzZWxl
Y3QuCiAgICAgICAgICAgICAgKChub3QgKGNkciBuZWFyKSkpCiAgICAgICAgICAgICAgKHJvdyAo
Y2FyIG5lYXIpKSkKICAgIChsZXQgKChjdXJyZW50LWNvbHVtbiAoY3VycmVudC1jb2x1bW4pKSkK
ICAgICAgKGRlbGV0ZS1yZWdpb24gKHRyZWVzaXQtbm9kZS1zdGFydCByb3cpCiAgICAgICAgICAg
ICAgICAgICAgIChtaW4gKDErICh0cmVlc2l0LW5vZGUtZW5kIHJvdykpIChwb2ludC1tYXgpKSkK
ICAgICAgKG1vdmUtdG8tY29sdW1uIGN1cnJlbnQtY29sdW1uKSkpKQoKKGRlZnVuIG1hcmtkb3du
LXRzLXRhYmxlLW1vdmUtcm93LXVwICgpCiAgIk1vdmUgdGhlIHJvdyBhdCBwb2ludCB1cCBvbmUg
bGluZS4KSWYgcG9pbnQgaXMgbm90IGF0IGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFj
dGl2ZSkKICAobWFya2Rvd24tdHMtdGFibGUtbW92ZS1yb3cpKQoKKGRlZnVuIG1hcmtkb3duLXRz
LXRhYmxlLW1vdmUtcm93LWRvd24gKCkKICAiTW92ZSB0aGUgcm93IGF0IHBvaW50IGRvd24gb25l
IGxpbmUuCklmIHBvaW50IGlzIG5vdCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJh
Y3RpdmUpCiAgKG1hcmtkb3duLXRzLXRhYmxlLW1vdmUtcm93ICdkb3duKSkKCihkZWZ1biBtYXJr
ZG93bi10cy10YWJsZS1tb3ZlLXJvdyAoJm9wdGlvbmFsIGRvd24pCiAgIk1vdmUgdGhlIHJvdyBh
dCBwb2ludCB1cCBvbmUgbGluZS4KSWYgRE9XTiBpcyBub24tbmlsLCBvciB3aXRoIGEgcHJlZml4
IGFyZ3VtZW50LCBtb3ZlIHRoZSByb3cgZG93biBvbmUKbGluZS4KSWYgcG9pbnQgaXMgb24gdGhl
IGhlYWRlciBvciBkZWxpbWl0ZXIgcm93LCBkbyBub3RoaW5nLgpJZiBwb2ludCBpcyBub3QgYXQg
YSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVyYWN0aXZlKQogIChtYXJrZG93bi10cy0tYmFy
Zi1pZi1ub3QtbW9kZSAnbWFya2Rvd24tdHMtdGFibGUtbW92ZS1yb3cpCiAgKHNldHEgZG93biAo
b3IgZG93biBjdXJyZW50LXByZWZpeC1hcmcpKQogICh3aGVuLWxldCogKChhdC10YWJsZSAobWFy
a2Rvd24tdHMtYXQtdGFibGUtcCBuaWwgdCkpCiAgICAgICAgICAgICAgKHBvcyAoY2FyIGF0LXRh
YmxlKSkKICAgICAgICAgICAgICAodGFibGUgKGNkciBhdC10YWJsZSkpCiAgICAgICAgICAgICAg
KG5lYXIgKG1hcmtkb3duLXRzLS10YWJsZS1ib2R5LXJvdy1uZWFyLXBvcyBwb3MpKQogICAgICAg
ICAgICAgIDs7IEJhaWwgaWYgcG9pbnQgaXMgb24gdGhlIGhlYWRlciBvciBkZWxpbWl0ZXIgcm93
IOKAlCBkbwogICAgICAgICAgICAgIDs7IG5vdCBzaWxlbnRseSBtb3ZlIGEgYm9keSByb3cgdGhl
IHVzZXIgZGlkIG5vdCBzZWxlY3QuCiAgICAgICAgICAgICAgKChub3QgKGNkciBuZWFyKSkpCiAg
ICAgICAgICAgICAgKHJvdyAoY2FyIG5lYXIpKSkKICAgIDs7IERvIG5vdCBtb3ZlIGFib3ZlIHRo
ZSBwaXBlX3RhYmxlX2RlbGltaXRlcl9yb3cuCiAgICA7OyBEbyBub3QgbW92ZSBiZWxvdyB0aGUg
Ym90dG9tIG9mIHRoZSB0YWJsZS4KICAgICh1bmxlc3MgKG9yIChhbmQgKG5vdCBkb3duKQogICAg
ICAgICAgICAgICAgICAgICAoZXF1YWwgKHRyZWVzaXQtbm9kZS10eXBlCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1wcmV2LXNpYmxpbmcgcm93ICduYW1lZCkpCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAicGlwZV90YWJsZV9kZWxpbWl0ZXJfcm93IikpCiAg
ICAgICAgICAgICAgICAoYW5kIGRvd24KICAgICAgICAgICAgICAgICAgICAgKG5vdCAodHJlZXNp
dC1ub2RlLW5leHQtc2libGluZyByb3cgJ25hbWVkKSkpKQogICAgICAobGV0ICgocm93MiAoaWYg
ZG93bgogICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtbm9kZS1uZXh0LXNpYmxpbmcgcm93
ICduYW1lZCkKICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLXByZXYtc2libGluZyBy
b3cgJ25hbWVkKSkpCiAgICAgICAgICAgIChyb3ctZW5kICh0cmVlc2l0LW5vZGUtZW5kIHJvdykp
KQogICAgICAgIDs7IFRPRE86IFJlbW92ZSBhZnRlciBidWcjMjM5MDMgVW5kbyBhZnRlciBrYiBk
aWZmZXJzIGZyb20gYWZ0ZXIgTS14CiAgICAgICAgKHB1c2ggKHBvaW50KSBidWZmZXItdW5kby1s
aXN0KQogICAgICAgIDs7IElmIHJvdyBwb2ludCBpcyBvdXRzaWRlIGl0cyBzb3VyY2UgcmVnaW9u
LCBlLmcuLCBhdCBlb2wsIG1vdmUKICAgICAgICA7OyBpdCBpbnNpZGUgdGhlIHJlZ2lvbiBmb3Ig
c3RhYmlsaXR5LgogICAgICAgICh3aGVuICg+PSAocG9pbnQpIHJvdy1lbmQpCiAgICAgICAgICAo
Z290by1jaGFyIChtYXggKHBvaW50LW1pbikgKDEtIHJvdy1lbmQpKSkpCiAgICAgICAgKHRyYW5z
cG9zZS1yZWdpb25zICh0cmVlc2l0LW5vZGUtc3RhcnQgcm93KQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAodHJlZXNpdC1ub2RlLWVuZCByb3cpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICh0cmVlc2l0LW5vZGUtc3RhcnQgcm93MikKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRy
ZWVzaXQtbm9kZS1lbmQgcm93MikpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWluc2Vy
dC1jb2x1bW4tbGVmdCAoJm9wdGlvbmFsIGNsb25lKQogICJJbnNlcnQgYSB0YWJsZSBjb2x1bW4g
dG8gdGhlIGxlZnQgb2YgcG9pbnQncyBjb2x1bW4uCklmIENMT05FIGlzIG5vbi1uaWwsIG9yIHdp
dGggYSBwcmVmaXggYXJndW1lbnQsIGNsb25lIHRoZSBjdXJyZW50CmNvbHVtbiwgb3RoZXJ3aXNl
IGluc2VydCBlbXB0eSBjZWxscy4KUG9pbnQgY2FuIGJlIGluIHRoZSB0YWJsZSBoZWFkZXIgb3Ig
Ym9keS4KSWYgcG9pbnQgaXMgbm90IGF0IGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFj
dGl2ZSAiUCIpCiAgKG1hcmtkb3duLXRzLXRhYmxlLWluc2VydC1jb2x1bW4gJ2xlZnQgY2xvbmUp
KQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWluc2VydC1jb2x1bW4tcmlnaHQgKCZvcHRpb25h
bCBjbG9uZSkKICAiSW5zZXJ0IGEgdGFibGUgY29sdW1uIHRvIHRoZSByaWdodCBvZiBwb2ludCdz
IGNvbHVtbi4KSWYgQ0xPTkUgaXMgbm9uLW5pbCwgb3Igd2l0aCBhIHByZWZpeCBhcmd1bWVudCwg
Y2xvbmUgdGhlIGN1cnJlbnQKY29sdW1uLCBvdGhlcndpc2UgaW5zZXJ0IGVtcHR5IGNlbGxzLgpQ
b2ludCBjYW4gYmUgaW4gdGhlIHRhYmxlIGhlYWRlciBvciBib2R5LgpJZiBwb2ludCBpcyBub3Qg
YXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVyYWN0aXZlICJQIikKICAobWFya2Rvd24t
dHMtdGFibGUtaW5zZXJ0LWNvbHVtbiAncmlnaHQgY2xvbmUpKQoKKGRlZnVuIG1hcmtkb3duLXRz
LXRhYmxlLWNsb25lLWNvbHVtbi1sZWZ0ICgpCiAgIkNsb25lIHRoZSBjdXJyZW50IGNvbHVtbiB0
byBpdHMgbGVmdC4KUG9pbnQgY2FuIGJlIGluIHRoZSB0YWJsZSBoZWFkZXIgb3IgYm9keS4KSWYg
cG9pbnQgaXMgbm90IGF0IGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAo
bWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LWNvbHVtbi1sZWZ0ICdjbG9uZSkpCgooZGVmdW4gbWFy
a2Rvd24tdHMtdGFibGUtY2xvbmUtY29sdW1uLXJpZ2h0ICgpCiAgIkNsb25lIHRoZSBjdXJyZW50
IGNvbHVtbiB0byBpdHMgcmlnaHQuClBvaW50IGNhbiBiZSBpbiB0aGUgdGFibGUgaGVhZGVyIG9y
IGJvZHkuCklmIHBvaW50IGlzIG5vdCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJh
Y3RpdmUpCiAgKG1hcmtkb3duLXRzLXRhYmxlLWluc2VydC1jb2x1bW4tcmlnaHQgJ2Nsb25lKSkK
CihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtY29sdW1uICgmb3B0aW9uYWwgbGVmdCBj
bG9uZSkKICAiSW5zZXJ0IGEgdGFibGUgY29sdW1uIGFmdGVyIHBvaW50J3MgY3VycmVudCBjb2x1
bW4uCklmIExFRlQgaXMgbm9uLW5pbCBhbmQgaXMgbm90IGByaWdodCcsIG9yIHdpdGggYSBwcmVm
aXggYXJndW1lbnQsCmluc2VydCB0aGUgY29sdW1uIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50
IGNvbHVtbi4KSWYgQ0xPTkUgaXMgbm9uLW5pbCwgY2xvbmUgdGhlIGN1cnJlbnQgY29sdW1uLCBv
dGhlcndpc2UgaW5zZXJ0IGVtcHR5CmNlbGxzLgpJZiBDTE9ORSBpcyBhIGxpc3QsIGl0cyBmaXJz
dCBlbGVtZW50IGlzIHRhcmdldC1jb2x1bW4tbnVtYmVyLiAgSXQgaXMKdGhlIGNhbGxlcidzIHJl
c3BvbnNpYmlsaXR5IHRoYXQgdGhpcyB2YWx1ZSBpcyB2YWxpZCBmb3IgdGhlIHRhYmxlLAp0aG91
Z2ggaXQgbWF5IGJlIGludmFsaWQgZm9yIGEgbm9uLXVuaWZvcm0gcmFnZ2VkIHJvdy4KUG9pbnQg
Y2FuIGJlIGluIHRoZSB0YWJsZSBoZWFkZXIgb3IgYm9keS4KSWYgcG9pbnQgaXMgbm90IGF0IGEg
dGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24tdHMtLWJhcmYt
aWYtbm90LW1vZGUgJ21hcmtkb3duLXRzLXRhYmxlLWluc2VydC1jb2x1bW4pCiAgKHNldHEgbGVm
dCAoY29uZCAoKGVxIGxlZnQgJ3JpZ2h0KSBuaWwpCiAgICAgICAgICAgICAgICAgICAobGVmdCBs
ZWZ0KQogICAgICAgICAgICAgICAgICAgKGN1cnJlbnQtcHJlZml4LWFyZyB0KSkpCiAgKHdoZW4t
bGV0KiAoKGF0LXRhYmxlIChtYXJrZG93bi10cy1hdC10YWJsZS1wIG5pbCB0KSkKICAgICAgICAg
ICAgICAocG9zIChjYXIgYXQtdGFibGUpKQogICAgICAgICAgICAgICh0YWJsZSAoY2RyIGF0LXRh
YmxlKSkKICAgICAgICAgICAgICAoZGVsaW1pdGVyLXJvdyAodHJlZXNpdC1zZWFyY2gtc3VidHJl
ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSAiXFxgcGlwZV90YWJsZV9kZWxp
bWl0ZXJfcm93XFwnIikpCiAgICAgICAgICAgICAgOzsgQ29sdW1uIHBvcyBmb3IgaW5zZXJ0aW5n
IG1pc3NpbmcgbGVhZGluZyBwaXBlcy4KICAgICAgICAgICAgICAoZGVsaW0wLXBpcGUtY29sCiAg
ICAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgICAgICAgIChsZXQqICgoZGVs
aW0tY2VsbCAodHJlZXNpdC1ub2RlLWNoaWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBkZWxpbWl0ZXItcm93IDAgJ25hbWVkKSkKICAgICAgICAgICAgICAgICAgICAgICAg
KGJlZyAodHJlZXNpdC1ub2RlLXN0YXJ0IGRlbGltLWNlbGwpKSkKICAgICAgICAgICAgICAgICAg
IChnb3RvLWNoYXIgYmVnKQogICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAocG9zLWJvbCkp
CiAgICAgICAgICAgICAgICAgICAoaWYgKHNlYXJjaC1mb3J3YXJkICJ8IiBiZWcgdCkKICAgICAg
ICAgICAgICAgICAgICAgICAoMS0gKGN1cnJlbnQtY29sdW1uKSkKICAgICAgICAgICAgICAgICAg
ICAgKGdvdG8tY2hhciBiZWcpCiAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LWNvbHVtbikp
KSkpCiAgICAgICAgICAgICAgKG5vZGUgKHRyZWVzaXQtbm9kZS1hdCBwb3MgJ21hcmtkb3duICdu
YW1lZCkpCiAgICAgICAgICAgICAgKGNlbGwgKG1hcmtkb3duLXRzLS10YWJsZS1ub2RlLWNlbGwg
bm9kZSkpCiAgICAgICAgICAgICAgKHBvaW50LXJvdyAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUt
cm93IGNlbGwpKSkKICAgIChsZXQgKCh0YWJsZS1jb2x1bW4gKG1hcmtkb3duLXRzLS10YWJsZS1j
b21wdXRlLW5vZGUtY29sdW1uIHBvaW50LXJvdyBjZWxsKSkpCiAgICAgICh1bmxlc3MgdGFibGUt
Y29sdW1uCiAgICAgICAgKGVycm9yICJDb3VsZCBub3QgY29tcHV0ZSB0aGUgdGFibGUgY29sdW1u
IikpCiAgICAgIDs7IE5PVEU6IEdGTSB0YWJsZXMgYWxsb3cgbm9uLXVuaWZvcm0gdGFibGUgcm93
cy4gIFRoZSBjdXJyZW50IHJvdwogICAgICA7OyBjb3VsZCBoYXZlIGEgZGlmZmVyaW5nIG51bWJl
ciBvZiBjb2x1bW5zIGZyb20gb3RoZXIgcm93cy4gIFdlCiAgICAgIDs7IHNpbGVudGx5IGRvIG5v
dGhpbmcgdG8gYSByb3cgdGhhdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlCiAgICAgIDs7IGNvbXB1
dGVkIGNvbHVtbi4KICAgICAgOzsKICAgICAgOzsgTk9URTogVGhlIGdyYW1tYXIgYW5ub3lpbmds
eSBpZ25vcmVzIGNlbGwgbGVhZGluZyB3aGl0ZXNwYWNlCiAgICAgIDs7IGJ1dCBpbmNsdWRlcyB0
cmFpbGluZyB3aGl0ZXNwYWNlLCBzbyBjZWxscyBhcmUgYm91bmRlZCBieSB0aGUKICAgICAgOzsg
Zmlyc3QgZ3JhcGggY2hhcmFjdGVyIHVwIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBqdXN0IGJlZm9y
ZSB0aGUKICAgICAgOzsgcGlwZSBzeW1ib2wsIGluY2x1ZGluZyB3aGl0ZXNwYWNlLiAgVGhlIHJl
c3VsdCBpcyB0aGUgcmFuZ2UKICAgICAgOzsgZG9lcyBub3Qgc3RhcnQgaW1tZWRpYXRlbHkgYWZ0
ZXIgdGhlIG9wdGlvbmFsIGxlYWRpbmcgcGlwZQogICAgICA7OyBzeW1ib2wgeWV0IGluY29uc2lz
dGVudGx5IGNvbnRpbnVlcyB1bnRpbCBqdXN0IGJlZm9yZSB0aGUKICAgICAgOzsgdHJhaWxpbmcg
cGlwZS4KICAgICAgKGxldCogKChhZGogMCkgOyBBZGp1c3Qgbm9kZSBwb3NpdGlvbiBvZmZzZXRz
IGJ5IGluc2VydGVkIHRleHQuCiAgICAgICAgICAgICAod2lkdGggbWFya2Rvd24tdHMtdGFibGUt
ZGVmYXVsdC1jb2x1bW4td2lkdGgpCiAgICAgICAgICAgICAoZW1wdHkgKG1ha2Utc3RyaW5nIHdp
ZHRoID9ccykpCiAgICAgICAgICAgICA7OyBUT0RPOiBSZW1vdmUgdGhlIHBsYWNlaG9sZGVyIGNo
YXJhY3RlciBpZiB0aGUgdHJlZS1zaXR0ZXIKICAgICAgICAgICAgIDs7IGdyYW1tYXIgaXMgcmVw
YWlyZWQuCiAgICAgICAgICAgICAocGxhY2Vob2xkZXIgKGNvbmNhdCAiLiIgKG1ha2Utc3RyaW5n
ICgxLSB3aWR0aCkgP1xzKSkpCiAgICAgICAgICAgICAoZGVsaW0gKG1ha2Utc3RyaW5nIHdpZHRo
ID8tKSkKICAgICAgICAgICAgIChyb3dzICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4gdGFibGUgJ25h
bWVkKSkKICAgICAgICAgICAgIChucm93cyAobGVuZ3RoIHJvd3MpKQogICAgICAgICAgICAgKHRh
cmdldC1jb2x1bW4tbnVtYmVyIChhbmQgKGxpc3RwIGNsb25lKSAoY2FyIGNsb25lKSkpCiAgICAg
ICAgICAgICA7OyBQb3NpdGlvbiB0byBtb3ZlIHBvaW50IHRvIGFmdGVyIGFsbCByb3dzIGhhdmUg
YmVlbgogICAgICAgICAgICAgOzsgdXBkYXRlZC4gIERldGVybWluaXN0aWMgcGxhY2VtZW50IGF2
b2lkcyBkZXBlbmRpbmcgb24KICAgICAgICAgICAgIDs7IHRyZWUtc2l0dGVyIG5hdmlnYXRpb24g
dGhyb3VnaCBmcmVzaGx5LWluc2VydGVkIGVtcHR5CiAgICAgICAgICAgICA7OyBjZWxscywgd2hp
Y2ggdGhlIGdyYW1tYXIgZG9lcyBub3QgYWx3YXlzIHJlcGFyc2UgYXMKICAgICAgICAgICAgIDs7
IHBpcGVfdGFibGVfY2VsbCBub2Rlcy4KICAgICAgICAgICAgICh0YXJnZXQtcG9zKSkKICAgICAg
ICA7OyBUT0RPOiBSZW1vdmUgYWZ0ZXIgYnVnIzIzOTAzIFVuZG8gYWZ0ZXIga2IgZGlmZmVycyBm
cm9tIGFmdGVyIE0teAogICAgICAgIChwdXNoIChwb2ludCkgYnVmZmVyLXVuZG8tbGlzdCkKICAg
ICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICh3aXRob3V0LXJlc3RyaWN0aW9uCiAgICAg
ICAgICAgIChkb3RpbWVzICh4IG5yb3dzKQogICAgICAgICAgICAgICh3aGVuLWxldCogKChyb3cg
KG50aCB4IHJvd3MpKQogICAgICAgICAgICAgICAgICAgICAgICAgIChyb3ctdHlwZSAodHJlZXNp
dC1ub2RlLXR5cGUgcm93KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAoY29scyAodHJlZXNp
dC1ub2RlLWNoaWxkcmVuIHJvdyAnbmFtZWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgIChu
Y29scyAobGVuZ3RoIGNvbHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHNvdXJjZS1j
ZWxsIHdpbGwgYmUgbmlsIGlmIHRhYmxlLWNvbHVtbiBpcyBiZXlvbmQgdGhpcwogICAgICAgICAg
ICAgICAgICAgICAgICAgIDs7IHJvdydzIGNvbHVtbiBzZXQgYW5kIHRoYXQgcm93IHdpbGwgYmUg
c2tpcHBlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAoc291cmNlLWNlbGwgKG50aCB0YWJs
ZS1jb2x1bW4gY29scykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgSWYgY2xvbmluZyB3
aXRoIGEgc3BlY2lmaWVkIHRhcmdldC1jb2x1bW4tbnVtYmVyLAogICAgICAgICAgICAgICAgICAg
ICAgICAgIDs7IHRhcmdldC1jZWxsIHdpbGwgYmUgbmlsIGFuZCB0aGUgcm93IHdpbGwgYmUgc2tp
cHBlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0LWNlbGwgKGlmIHRhcmdldC1j
b2x1bW4tbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChu
dGggdGFyZ2V0LWNvbHVtbi1udW1iZXIgY29scykKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHNvdXJjZS1jZWxsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBD
b21wdXRlIHRoZSBpbnNlcnRpb24gcG9pbnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJl
ZyAoY29uZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IElmIGNsb25pbmcgdG8g
YSBzcGVjaWZpZWQgdGFyZ2V0LCB1c2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7
OyB0YXJnZXQtY2VsbCdzIGVuZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFy
Z2V0LWNvbHVtbi1udW1iZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCsgYWRq
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtZW5kIHRh
cmdldC1jZWxsKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgSWYgaW5zZXJ0
aW5nIHRvIHRoZSBsZWZ0IG9mIHRoZSBmaXJzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDs7IGNvbHVtbiwgdXNlIHNvdXJjZSBjZWxsJ3Mgc3RhcnQKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICA7OyBhZGp1c3RlZCBmb3IgaXRzIG9wdGlvbmFsIHBpcGUgdG8KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBjYXB0dXJlIGl0cyB3aGl0ZXNwYWNlLiAgSWYg
dGhlcmUgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBubyBwaXBlLCB1c2Ug
Ym9sLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYW5kIGxlZnQgKGVxIHRhYmxl
LWNvbHVtbiAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKHAgKCsg
YWRqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0
LW5vZGUtc3RhcnQgc291cmNlLWNlbGwpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGdvdG8tY2hhciBwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChn
b3RvLWNoYXIgKHBvcy1ib2wpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChp
ZiAoc2VhcmNoLWZvcndhcmQgInwiIHAgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKHNldHEgcCAoMS0gKHBvaW50KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoc2V0cSBwIChwb3MtYm9sKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgSWYgaW5zZXJ0
aW5nIGxlZnQgYW5kIGFueSBvdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7
IGNvbHVtbiwgdXNlIHRoZSBlbmQgb2YgdGhlIHByaW9yCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgOzsgY2VsbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVmdAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKyBhZGoKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKDErICh0cmVlc2l0LW5vZGUtZW5kCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKG50aCAoMS0gdGFibGUtY29sdW1uKSBjb2xzKSkpKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBJZiBpbnNlcnRpbmcgcmlnaHQsIHVz
ZSB0aGUgZW5kIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgdGhlIGN1cnJl
bnQgY2VsbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoKyBhZGoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKHRyZWVzaXQtbm9kZS1lbmQgc291cmNlLWNlbGwpKSkpKSkKICAgICAgICAgICAgICAg
IChnb3RvLWNoYXIgYmVnKQogICAgICAgICAgICAgICAgKGxldCogKChvcmlnLXBvaW50IChwb2lu
dCkpCiAgICAgICAgICAgICAgICAgICAgICAgKG1pc3NpbmctbGVhZGluZy1waXBlCiAgICAgICAg
ICAgICAgICAgICAgICAgICh3aGVuIChlcSB0YWJsZS1jb2x1bW4gMCkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChn
b3RvLWNoYXIgKHBvcy1ib2wpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVubGVzcyAo
c2VhcmNoLWZvcndhcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8Igog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCsgYWRqICh0cmVlc2l0LW5vZGUt
c3RhcnQgc291cmNlLWNlbGwpKSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifCIp
KSkpCiAgICAgICAgICAgICAgICAgICAgICAgKHRleHQgKGNvbmQKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgOzsgSWYgY2xvbmluZywgcmV0cmlldmUgdGhlIHNvdXJjZSBjZWxsIHRleHQu
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbG9uZSAoYnVmZmVyLXN1YnN0cmluZy1u
by1wcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgQmFj
ayB1cCB0byBib2wgb3IgdGhlIHBpcGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICA7OyB0byBjYXB0dXJlIHRoZSB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgOzsgdGhlIGdyYW1tYXIgbGVhdmVzIG91dC4KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoKyBhZGoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAodHJlZXNpdC1ub2RlLXN0YXJ0IHNvdXJjZS1jZWxsKSkpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiW1s6Ymxh
bms6XV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAocG9zLWJvbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAocG9pbnQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgrIGFk
aiAodHJlZXNpdC1ub2RlLWVuZCBzb3VyY2UtY2VsbCkpKSkKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgOzsgSWYgbmV3IGNvbHVtbiwgYW5kIHRoaXMgaXMgdGhlCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIDs7IGRlbGltaXRlciByb3csIGluc2VydCBhIGRlZmF1bHQKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgOzsgZGVsaW1pdGVyLgogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoKGVxdWFsIHJvdy10eXBlICJwaXBlX3RhYmxlX2RlbGltaXRlcl9yb3ciKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW0pCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIDs7IElmIG5ldyBjb2x1bW4sIGFuZCB0aGlzIGlzIHRoZSBhIGhlYWRlcgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBvciBib2R5IHJvdywgaW5zZXJ0IGEgZGVmYXVs
dCBlbXB0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBzdHJpbmcuCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
bXB0eSkpKSkKICAgICAgICAgICAgICAgICAgKGNvbmQKICAgICAgICAgICAgICAgICAgIChjbG9u
ZQogICAgICAgICAgICAgICAgICAgIChjb25kCiAgICAgICAgICAgICAgICAgICAgOzsgQ2xvbmUg
dGhlIGZpcnN0IGNvbHVtbiB0byB0aGUgbGVmdC4gIElmIHRoZXJlIGlzCiAgICAgICAgICAgICAg
ICAgICAgOzsgbm8gcGlwZSBiZWZvcmUgdGhlIGNlbGwgY29udGVudCwgaW5zZXJ0IG9uZS4KICAg
ICAgICAgICAgICAgICAgICAgKChhbmQgbGVmdCAoZXEgdGFibGUtY29sdW1uIDApKQogICAgICAg
ICAgICAgICAgICAgICAgICAoaW5zZXJ0ICJ8IgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgbWlzc2luZy1sZWFk
aW5nLXBpcGUgIiIpKSkKICAgICAgICAgICAgICAgICAgICA7OyBDbG9uZSB0aGUgZmlyc3QgY29s
dW1uIHRvIHRoZSByaWdodC4KICAgICAgICAgICAgICAgICAgICAgKChhbmQgKG5vdCBsZWZ0KSAo
ZXEgdGFibGUtY29sdW1uIDApKQogICAgICAgICAgICAgICAgICAgICAgKGluc2VydCAifCIKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCkKICAgICAgICAgICAgICAgICAgICAgIDs7
IEZvciBhIHBvc2l0aXZlIHVzZXIgZXhwZXJpZW5jZSBnaXZlbiBncmFtbWFyCiAgICAgICAgICAg
ICAgICAgICAgICA7OyBidWdzLCBhZGQgYSBtaXNzaW5nIGxlYWRpbmcgcGlwZSB0byB0aGUgZmly
c3QKICAgICAgICAgICAgICAgICAgICAgIDs7IGNlbGwgYXQgYSBwbGVhc2luZyBwb3NpdGlvbiBh
ZnRlciBjbG9uaW5nLgogICAgICAgICAgICAgICAgICAgICAgKHdoZW4gbWlzc2luZy1sZWFkaW5n
LXBpcGUKICAgICAgICAgICAgICAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgKG1vdmUtdG8tY29sdW1uIGRlbGltMC1waXBlLWNvbCkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAoaW5zZXJ0ICJ8IikpKSkKICAgICAgICAgICAgICAgICAgICA7OyBD
bG9uZSB0aGUgZmluYWwgY29sdW1uIHRvIHRoZSBsZWZ0LgogICAgICAgICAgICAgICAgICAgICAo
KGFuZCBsZWZ0IChlcSB0YWJsZS1jb2x1bW4gKDEtIG5jb2xzKSkpCiAgICAgICAgICAgICAgICAg
ICAgICAoaW5zZXJ0IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInwiKSkKICAg
ICAgICAgICAgICAgICAgICAgOzsgQ2xvbmUgYSBtaWRkbGUgY29sdW1uIHRvIHRoZSBsZWZ0Lgog
ICAgICAgICAgICAgICAgICAgICAobGVmdAogICAgICAgICAgICAgICAgICAgICAgKGluc2VydCB0
ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8IikpCiAgICAgICAgICAgICAgICAg
ICAgIDs7IENsb25lIGEgbWlkZGxlIG9yIGZpbmFsIGNvbHVtbiB0byB0aGUgcmlnaHQuCiAgICAg
ICAgICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAgICAoaW5zZXJ0ICJ8IgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KSkpKQoKICAgICAgICAgICAgICAgICAgIDs7
IE5vdCBjbG9uaW5nLCBpbnNlcnQgYSBuZXcgY29sdW1uLgogICAgICAgICAgICAgICAgICAgKChh
bmQgbGVmdCAoZXEgdGFibGUtY29sdW1uIDApIChlcSB4ICgxLSBucm93cykpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAobm90IChlcXVhbCByb3ctdHlwZSAicGlwZV90YWJsZV9kZWxpbWl0ZXJf
cm93IikpKQogICAgICAgICAgICAgICAgICAgOzsgVE9ETzogcmVtb3ZlIHBsYWNlaG9sZGVyIGxv
Z2ljLgogICAgICAgICAgICAgICAgICAgIChpbnNlcnQKICAgICAgICAgICAgICAgICAgICAgInwi
CiAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyCiAgICAgICAgICAgICAgICAgICAgIChv
ciBtaXNzaW5nLWxlYWRpbmctcGlwZSAiIikpKQogICAgICAgICAgICAgICAgICAgKChhbmQgbGVm
dCAoZXEgdGFibGUtY29sdW1uIDApKQogICAgICAgICAgICAgICAgICAgICAgKGluc2VydAogICAg
ICAgICAgICAgICAgICAgICAgICJ8IgogICAgICAgICAgICAgICAgICAgICAgIHRleHQKICAgICAg
ICAgICAgICAgICAgICAgICAob3IgbWlzc2luZy1sZWFkaW5nLXBpcGUgIiIpKSkKICAgICAgICAg
ICAgICAgICAgIChsZWZ0CiAgICAgICAgICAgICAgICAgICAgKGluc2VydAogICAgICAgICAgICAg
ICAgICAgICB0ZXh0CiAgICAgICAgICAgICAgICAgICAgICJ8IikpCiAgICAgICAgICAgICAgICAg
ICAodAogICAgICAgICAgICAgICAgICAgIChpbnNlcnQKICAgICAgICAgICAgICAgICAgICAgInwi
CiAgICAgICAgICAgICAgICAgICAgIHRleHQpKSkKCiAgICAgICAgICAgICAgICAgIDs7IENhcHR1
cmUgdGhlIHN0YXJ0IG9mIHRoZSBuZXcgY2VsbCdzIGNvbnRlbnQgaW4KICAgICAgICAgICAgICAg
ICAgOzsgdGhlIHJvdyB0aGF0IG9yaWdpbmFsbHkgY29udGFpbmVkIHBvaW50LgogICAgICAgICAg
ICAgICAgICAod2hlbiAoYW5kIChub3QgdGFyZ2V0LXBvcykKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAodHJlZXNpdC1ub2RlLWVxIHJvdyBwb2ludC1yb3cpKQogICAgICAgICAgICAgICAg
ICAgIChzZXRxIHRhcmdldC1wb3MKICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0LWNvbHVtbi1udW1iZXIKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICh0cmVlc2l0LW5vZGUtc3RhcnQgdGFyZ2V0LWNlbGwpKQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChh
bmQgbGVmdCAobm90IChlcSB0YWJsZS1jb2x1bW4gMCkpKQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIDs7ICJ0ZXh0IHwiIGluc2VydGVkIGF0IGJlZy4KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBvcmlnLXBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7
IEFsbCBvdGhlciBicmFuY2hlcyBpbnNlcnQgInwiIGZpcnN0LgogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoMSsgb3JpZy1wb2ludCkpKSkpKQoKICAgICAgICAgICAgICAgICAgOzsgQWRq
dXN0IG9mZnNldCBmb3IgZGVsZXRlZCB0ZXh0LgogICAgICAgICAgICAgICAgICAoc2V0cSBhZGog
KCsgYWRqICgtIChwb2ludCkgb3JpZy1wb2ludCkpCiAgICAgICAgICAgICAgICAgICAgICAgIG9y
aWctcG9pbnQgKHBvaW50KSkpKSkpKQogICAgICAgICh3aGVuIHRhcmdldC1wb3MKICAgICAgICAg
IChnb3RvLWNoYXIgdGFyZ2V0LXBvcykpKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWRl
bGV0ZS1jb2x1bW4gKCkKICAiRGVsZXRlIHRoZSB0YWJsZSBjb2x1bW4gYXQgcG9pbnQuClBvaW50
IGNhbiBiZSBpbiB0aGUgdGFibGUgaGVhZGVyIG9yIGJvZHkuCklmIHBvaW50IGlzIG5vdCBhdCBh
IHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUpCiAgKG1hcmtkb3duLXRzLS1iYXJm
LWlmLW5vdC1tb2RlICdtYXJrZG93bi10cy10YWJsZS1kZWxldGUtY29sdW1uKQogICh3aGVuLWxl
dCogKChhdC10YWJsZSAobWFya2Rvd24tdHMtYXQtdGFibGUtcCBuaWwgdCkpCiAgICAgICAgICAg
ICAgKHBvcyAoY2FyIGF0LXRhYmxlKSkKICAgICAgICAgICAgICAodGFibGUgKGNkciBhdC10YWJs
ZSkpCiAgICAgICAgICAgICAgKGNlbGwgKG1hcmtkb3duLXRzLS10YWJsZS1ub2RlLWNlbGwgbmls
IHBvcykpCiAgICAgICAgICAgICAgKHJvdyAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtcm93IGNl
bGwpKQogICAgICAgICAgICAgIChjb2xzICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4gcm93ICduYW1l
ZCkpCiAgICAgICAgICAgICAgKG5jb2xzIChsZW5ndGggY29scykpKQogICAgKGxldCAoKHRhYmxl
LWNvbHVtbiAobWFya2Rvd24tdHMtLXRhYmxlLWNvbXB1dGUtbm9kZS1jb2x1bW4gcm93IGNlbGwp
KSkKICAgICAgKHVubGVzcyB0YWJsZS1jb2x1bW4KICAgICAgICAoZXJyb3IgIkNvdWxkIG5vdCBj
b21wdXRlIHRoZSB0YWJsZSBjb2x1bW4iKSkKICAgICAgOzsgTk9URTogR0ZNIHRhYmxlcyBhbGxv
dyBub24tdW5pZm9ybSB0YWJsZSByb3dzLiAgVGhlIGN1cnJlbnQgcm93CiAgICAgIDs7IGNvdWxk
IGhhdmUgYSBkaWZmZXJpbmcgbnVtYmVyIG9mIGNvbHVtbnMgZnJvbSBvdGhlciByb3dzLiAgV2UK
ICAgICAgOzsgc2lsZW50bHkgZG8gbm90aGluZyB0byBhIHJvdyB0aGF0IGRvZXMgbm90IGV4dGVu
ZCB0byB0aGUKICAgICAgOzsgY29tcHV0ZWQgY29sdW1uLgogICAgICA7OwogICAgICA7OyBOT1RF
OiBUaGUgZ3JhbW1hciBhbm5veWluZ2x5IGlnbm9yZXMgY2VsbCBsZWFkaW5nIHdoaXRlc3BhY2UK
ICAgICAgOzsgYnV0IGRvZXMgaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHNvIGNlbGxzIGFy
ZSBib3VuZGVkIGJ5CiAgICAgIDs7IHRoZSBmaXJzdCBncmFwaCBjaGFyYWN0ZXIgdXAgdG8gdGhl
IGxhc3QgY2hhcmFjdGVyIGp1c3QgYmVmb3JlCiAgICAgIDs7IHRoZSBwaXBlIHN5bWJvbCwgaW5j
bHVkaW5nIHdoaXRlc3BhY2UuCiAgICAgIDs7CiAgICAgIDs7IFRoZSBncmFtbWFyIGFsc28gY29u
c2lkZXJzIHRoZSB0cmFpbGluZyBwaXBlIHN5bWJvbCB0byBiZSBhCiAgICAgIDs7IHBhcnQgb2Yg
aXRzIHByZWNlZGluZyBjZWxsIHNvIHRoYXQncyB3aGF0IHdlIGRlbGV0ZSB3aGVuIHdlCiAgICAg
IDs7IGRlbGV0ZSBhIGNvbHVtbidzIGNlbGw7IGkuZS4sIGlmIHRoZXJlIGlzIGEgcGlwZSBiZWZv
cmUgdGhlCiAgICAgIDs7IGZpcnN0IGNvbHVtbiwgd2UgZGVsZXRlIGl0LgogICAgICAobGV0KiAo
KGFkaiAwKSA7IEFkanVzdCBub2RlIHBvc2l0aW9uIG9mZnNldHMgYnkgZGVsZXRlZCB0ZXh0Lgog
ICAgICAgICAgICAgKHJvd3MgKHRyZWVzaXQtbm9kZS1jaGlsZHJlbiB0YWJsZSAnbmFtZWQpKQog
ICAgICAgICAgICAgKG5yb3dzIChsZW5ndGggcm93cykpKQogICAgICAgIChzYXZlLWV4Y3Vyc2lv
bgogICAgICAgICAgKHdpdGhvdXQtcmVzdHJpY3Rpb24KICAgICAgICAgICAgKGRvdGltZXMgKHgg
bnJvd3MpCiAgICAgICAgICAgICAgOzsgSWYgY2VsbCBpcyBuaWwsIGl0IGlzIGJleW9uZCB0aGUg
dGFibGUtY29sdW1uIGFuZCBpdHMKICAgICAgICAgICAgICA7OyByb3cgaXMgaWdub3JlZC4KICAg
ICAgICAgICAgICAod2hlbi1sZXQqICgocm93IChudGggeCByb3dzKSkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAoY29scyAodHJlZXNpdC1ub2RlLWNoaWxkcmVuIHJvdyAnbmFtZWQpKQogICAg
ICAgICAgICAgICAgICAgICAgICAgIChuY29scyAobGVuZ3RoIGNvbHMpKQogICAgICAgICAgICAg
ICAgICAgICAgICAgIChjZWxsIChudGggdGFibGUtY29sdW1uIGNvbHMpKQogICAgICAgICAgICAg
ICAgICAgICAgICAgIChjZWxsLWJlZyAodHJlZXNpdC1ub2RlLXN0YXJ0IGNlbGwpKQogICAgICAg
ICAgICAgICAgICAgICAgICAgIChjZWxsLWVuZCAodHJlZXNpdC1ub2RlLWVuZCBjZWxsKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgICA7OyBBZGp1c3QgYmVnIHRvIHRyaW0gdGhlIGdyYW1tYXIK
ICAgICAgICAgICAgICAgICAgICAgICAgICA7OyB1bmFjY291bnRlZC1mb3IgbGVhZGluZyB3aGl0
ZXNwYWNlLgogICAgICAgICAgICAgICAgICAgICAgICAgIChiZWcgKGNvbmQKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA7OyBJZiB0aGlzIGlzIHRoZSBzb2xlIGNvbHVtbiwgZGVsZXRl
IGZyb20gYm9sLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXEgbmNvbHMgMSkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAoLSBjZWxsLWJlZyBh
ZGopKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9zLWJvbCkpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgOzsgSWYgdGhpcyBpcyB0aGUgZmlyc3QgY29sdW1uLCBk
ZWxldGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBmcm9tIHRoZSBwaXBlLCBp
ZiB0aGVyZSBpcyBvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgb3RoZXJ3
aXNlIGNlbGwtYmVnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXEgdGFibGUt
Y29sdW1uIDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChwICgtIGNl
bGwtYmVnIGFkaikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNo
YXIgcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIChwb3Mt
Ym9sKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKHNlYXJjaC1mb3J3
YXJkICJ8IiBwIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLSAo
cG9pbnQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCkpKQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDs7IElmIHRoaXMgaXMgdGhlIGZpbmFsIGNvbHVtbiwg
ZGVsZXRlIGZyb20gdGhlIHByaW9yIHBpcGUgc3ltYm9sLgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICgoZXEgdGFibGUtY29sdW1uICgxLSBuY29scykpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChsZXQgKChwICgtICh0cmVlc2l0LW5vZGUtZW5kCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoICgxLSB0YWJsZS1jb2x1bW4p
IGNvbHMpKSBhZGopKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1j
aGFyIHApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChzZWFyY2gtZm9y
d2FyZCAifCIgKC0gY2VsbC1iZWcgYWRqKSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAocG9pbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw
KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBzdGFydCBh
dCB0aGUgZW5kIG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHByaW9y
IGNlbGwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKC0gKHRyZWVzaXQtbm9kZS1lbmQKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAobnRoICgxLSB0YWJsZS1jb2x1bW4pIGNvbHMpKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGopKSkpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgOzsgQWRqdXN0IGVuZCB0byB0cmltIHRoZSB0cmFpbGluZyBwaXBlIHN5bWJvbAog
ICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGNvbnNpZGVyZWQgYnkgdGhlIGdyYW1tYXIgdG8g
YmUgcGFydCBvZiBpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBwcmVjZWRpbmcgY2Vs
bC4KICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5kIChjb25kCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgOzsgSWYgdGhpcyBpcyB0aGUgc29sZSBjb2x1bW4sIGRlbGV0ZSB1bnRp
bCBlb2wuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlcSBuY29scyAxKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyICgtIGNlbGwtYmVnIGFkaikp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3MtZW9sKSkKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA7OyBJZiB0aGlzIGlzIHRoZSBmaW5hbCBjb2x1bW4sIGRlbGV0
ZSB1bnRpbCBlb2wuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlcSB0YWJsZS1j
b2x1bW4gKDEtIG5jb2xzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8t
Y2hhciAoLSBjZWxsLWVuZCBhZGopKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
cG9zLWVvbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBs
b29rIGZvcndhcmQgZnJvbSBjZWxsLWVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IDs7ICh3aGljaCBpbmNsdWRlcyB0aGUgY2VsbCdzIHRyYWlsaW5nCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgOzsgd2hpdGVzcGFjZSkgZm9yIGEgcGlwZSBzeW1ib2wuCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGdvdG8tY2hhciAoLSBjZWxsLWVuZCBhZGopKQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoaWYgKHJlLXNlYXJjaC1mb3J3YXJkICJ8Kz8iIChwb3MtZW9sKSB0KQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEtIChwb2ludCkpCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY2VsbC1lbmQpKSkpKQogICAgICAgICAgICAgICAgKGRlbGV0
ZS1yZWdpb24gYmVnIGVuZCkKICAgICAgICAgICAgICAgIChzZXRxIGFkaiAoKyBhZGogKC0gZW5k
IGJlZykpKSkpKSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtbW92ZS1jb2x1bW4tbGVm
dCAoKQogICJNb3ZlIHRoZSB0YWJsZSBjb2x1bW4gYXQgcG9pbnQgdG8gaXRzIGxlZnQuClBvaW50
IGNhbiBiZSBpbiB0aGUgdGFibGUgaGVhZGVyIG9yIGJvZHkuCklmIHBvaW50IGlzIG5vdCBhdCBh
IHRhYmxlLCBkbyBub3RoaW5nLiIKICAoaW50ZXJhY3RpdmUpCiAgKG1hcmtkb3duLXRzLXRhYmxl
LW1vdmUtY29sdW1uICdsZWZ0KSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1tb3ZlLWNvbHVt
bi1yaWdodCAoKQogICJNb3ZlIHRoZSB0YWJsZSBjb2x1bW4gYXQgcG9pbnQgdG8gaXRzIHJpZ2h0
LgpQb2ludCBjYW4gYmUgaW4gdGhlIHRhYmxlIGhlYWRlciBvciBib2R5LgpJZiBwb2ludCBpcyBu
b3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVyYWN0aXZlKQogIChtYXJrZG93bi10
cy10YWJsZS1tb3ZlLWNvbHVtbiAncmlnaHQpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLW1v
dmUtY29sdW1uICgmb3B0aW9uYWwgbGVmdCkKICAiTW92ZSB0aGUgdGFibGUgY29sdW1uIGF0IHBv
aW50IHJpZ2h0IG9yIGxlZnQuCklmIExFRlQgaXMgbm9uLW5pbCBhbmQgaXMgbm90IGByaWdodCcs
IG9yIHdpdGggYSBwcmVmaXggYXJndW1lbnQsCm1vdmUgdGhlIGNvbHVtbiB0byBpdHMgbGVmdC4K
RG8gbm90aGluZyBpZiBhIHJvdyBiZWluZyBtb3ZlZCBpcyBub3Qgd2l0aGluIHRoZSBjb2x1bW5z
IG9mIHRoZSBoZWFkZXIuCkRvIG5vdGhpbmcgaWYgbW92aW5nIGxlZnQgYW5kIHRoZSBjdXJyZW50
IGNvbHVtbiBpcyB0aGUgZmlyc3QgY29sdW1uIG9mCnRoZSBjdXJyZW50IHJvdy4KRG8gbm90aGlu
ZyBpZiBtb3ZpbmcgcmlnaHQgYW5kIHRoZSBjdXJyZW50IGNvbHVtbiBpcyB0aGUgZmluYWwgY29s
dW1uIG9mCnRoZSBjdXJyZW50IHJvdy4KUG9pbnQgY2FuIGJlIGluIHRoZSB0YWJsZSBoZWFkZXIg
b3IgYm9keS4KSWYgcG9pbnQgaXMgbm90IGF0IGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRl
cmFjdGl2ZSkKICAobWFya2Rvd24tdHMtLWJhcmYtaWYtbm90LW1vZGUgJ21hcmtkb3duLXRzLXRh
YmxlLW1vdmUtY29sdW1uKQogIChzZXRxIGxlZnQgKGNvbmQgKChlcSBsZWZ0ICdyaWdodCkgbmls
KQogICAgICAgICAgICAgICAgICAgKGxlZnQgbGVmdCkKICAgICAgICAgICAgICAgICAgIChjdXJy
ZW50LXByZWZpeC1hcmcgdCkpKQogICh3aGVuLWxldCogKChhdC10YWJsZSAobWFya2Rvd24tdHMt
YXQtdGFibGUtcCBuaWwgdCkpCiAgICAgICAgICAgICAgKHBvcyAoY2FyIGF0LXRhYmxlKSkKICAg
ICAgICAgICAgICAodGFibGUgKGNkciBhdC10YWJsZSkpCiAgICAgICAgICAgICAgKG5vZGUgKHRy
ZWVzaXQtbm9kZS1hdCBwb3MgJ21hcmtkb3duICduYW1lZCkpCiAgICAgICAgICAgICAgKGNlbGwg
KG1hcmtkb3duLXRzLS10YWJsZS1ub2RlLWNlbGwgbm9kZSkpCiAgICAgICAgICAgICAgKHJvdyAo
bWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtcm93IG5vZGUpKQogICAgICAgICAgICAgIChoZWFkZXIt
cm93ICh0cmVlc2l0LXNlYXJjaC1zdWJ0cmVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHRhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGBwaXBlX3RhYmxlX2hlYWRl
clxcJyIpKQogICAgICAgICAgICAgIChuaGVhZGVycyAobGVuZ3RoICh0cmVlc2l0LW5vZGUtY2hp
bGRyZW4gaGVhZGVyLXJvdyAnbmFtZWQpKSkKICAgICAgICAgICAgICAoY29scyAodHJlZXNpdC1u
b2RlLWNoaWxkcmVuIHJvdyAnbmFtZWQpKQogICAgICAgICAgICAgIChuY29scyAobGVuZ3RoIGNv
bHMpKSkKICAgIChsZXQgKCh0YWJsZS1jb2x1bW4gKG1hcmtkb3duLXRzLS10YWJsZS1jb21wdXRl
LW5vZGUtY29sdW1uIHJvdyBjZWxsKSkpCiAgICAgICh1bmxlc3MgdGFibGUtY29sdW1uCiAgICAg
ICAgKGVycm9yICJDb3VsZCBub3QgY29tcHV0ZSB0aGUgdGFibGUgY29sdW1uIikpCiAgICAgIChp
ZiAoPj0gdGFibGUtY29sdW1uIG5oZWFkZXJzKQogICAgICAgICAgKG1lc3NhZ2UgIlJhZ2dlZC91
bmV2ZW4gY29sdW1uIGNhbm5vdCBiZSBtb3ZlZCIpCiAgICAgICAgOzsgQSBCIEMgRCAtPiBCIEEg
QyBECiAgICAgICAgOzsgTW92ZSBBIGxlZnQ6IGRvIG5vdGhpbmcKICAgICAgICA7OyBNb3ZlIEQg
cmlnaHQ6IGRvIG5vdGhpbmcKICAgICAgICA7OyBNb3ZlIGN1cnJlbnQgY29sdW1uIGxlZnQ6CiAg
ICAgICAgOzsgICBzb3VyY2UgY29sdW1uID0gdCAtIDEKICAgICAgICA7OyBNb3ZlIGN1cnJlbnQg
Y29sdW1uIHJpZ2h0OgogICAgICAgIDs7ICAgY2xvbmUgdCB0byB0KzEgaWYgdGhlIGZpbmFsIGNv
bHVtbiwgb3RoZXJ3aXNlIHQrMgogICAgICAgIDs7ICAgZGVsZXRlIHQKICAgICAgICAoY29uZCAo
KGFuZCBsZWZ0IChlcSB0YWJsZS1jb2x1bW4gMCkpCiAgICAgICAgICAgICAgIChtZXNzYWdlICJM
ZWZ0bW9zdCBjb2x1bW4gY2Fubm90IGJlIG1vdmVkIGxlZnQiKQogICAgICAgICAgICAgICBuaWwp
CiAgICAgICAgICAgICAgKChhbmQgKG5vdCBsZWZ0KSAoZXEgdGFibGUtY29sdW1uICgxLSBuY29s
cykpKQogICAgICAgICAgICAgICAobWVzc2FnZSAiUmlnaHRtb3N0IGNvbHVtbiBjYW5ub3QgYmUg
bW92ZWQgcmlnaHQiKQogICAgICAgICAgICAgICBuaWwpCiAgICAgICAgICAgICAgKHQKICAgICAg
ICAgICAgICAgKGxldCAoKHNvdXJjZS1jb2x1bW4gKGlmIGxlZnQKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICgxLSB0YWJsZS1jb2x1bW4pCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdGFibGUtY29sdW1uKSkKICAgICAgICAgICAgICAgICAgICAg
KHRhcmdldC1jb2x1bW4gKGlmIGxlZnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRhYmxlLWNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICgxKyB0YWJsZS1jb2x1bW4pKSkpCiAgICAgICAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCiAg
ICAgICAgICAgICAgICAgICAobWFya2Rvd24tdHMtdGFibGUtLWdvdG8tY29sdW1uIHNvdXJjZS1j
b2x1bW4pCiAgICAgICAgICAgICAgICAgICAobWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LWNvbHVt
bgogICAgICAgICAgICAgICAgICAgICdyaWdodCAobGlzdAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdGFyZ2V0LWNvbHVtbikpKQogICAgICAgICAgICAgICAgIChtYXJrZG93bi10cy10YWJs
ZS0tZ290by1jb2x1bW4gc291cmNlLWNvbHVtbikKICAgICAgICAgICAgICAgICAobWFya2Rvd24t
dHMtdGFibGUtZGVsZXRlLWNvbHVtbikKICAgICAgICAgICAgICAgICA7OyBFbXB0eSBjZWxscyBj
YW4gY29uZnVzZSB0aGUgZ3JhbW1hciwgc28gbm8tZXJyb3IgaGVyZS4KICAgICAgICAgICAgICAg
ICAoaWYgbGVmdAogICAgICAgICAgICAgICAgICAgICAobWFya2Rvd24tdHMtdGFibGUtLWdvdG8t
Y29sdW1uCiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtY29sdW1uICduby1lcnJvcikKICAg
ICAgICAgICAgICAgICAgIChtYXJrZG93bi10cy10YWJsZS0tZ290by1jb2x1bW4KICAgICAgICAg
ICAgICAgICAgICB0YXJnZXQtY29sdW1uICduby1lcnJvcikpKSkpKSkpKQoKKGRlZnVuIG1hcmtk
b3duLXRzLXRhYmxlLWFsaWduLWNvbHVtbi1sZWZ0ICgpCiAgIkFsaWduIHRoZSB0YWJsZSBjb2x1
bW4gYXQgcG9pbnQgdG8gdGhlIGxlZnQuCkRvIHRoZSB3b3JrIHdpdGggYG1hcmtkb3duLXRzLXRh
YmxlLWFsaWduLWNvbHVtbicsIHdoaWNoIHNlZSBmb3IgbW9yZQpkZXRhaWxzLiIKICAoaW50ZXJh
Y3RpdmUpCiAgKG1hcmtkb3duLXRzLXRhYmxlLWFsaWduLWNvbHVtbiAnbGVmdCkpCgooZGVmdW4g
bWFya2Rvd24tdHMtdGFibGUtYWxpZ24tY29sdW1uLWNlbnRlciAoKQogICJBbGlnbiB0aGUgdGFi
bGUgY29sdW1uIGF0IHBvaW50IHRvIHRoZSBjZW50ZXIuCkRvIHRoZSB3b3JrIHdpdGggYG1hcmtk
b3duLXRzLXRhYmxlLWFsaWduLWNvbHVtbicsIHdoaWNoIHNlZSBmb3IgbW9yZQpkZXRhaWxzLiIK
ICAoaW50ZXJhY3RpdmUpCiAgKG1hcmtkb3duLXRzLXRhYmxlLWFsaWduLWNvbHVtbiAnY2VudGVy
KSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1hbGlnbi1jb2x1bW4tcmlnaHQgKCkKICAiQWxp
Z24gdGhlIHRhYmxlIGNvbHVtbiBhdCBwb2ludCB0byB0aGUgcmlnaHQuCkRvIHRoZSB3b3JrIHdp
dGggYG1hcmtkb3duLXRzLXRhYmxlLWFsaWduLWNvbHVtbicsIHdoaWNoIHNlZSBmb3IgbW9yZQpk
ZXRhaWxzLiIKICAoaW50ZXJhY3RpdmUpCiAgKG1hcmtkb3duLXRzLXRhYmxlLWFsaWduLWNvbHVt
biAncmlnaHQpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWFsaWduLWNvbHVtbiAoJm9wdGlv
bmFsIGFsaWduKQogICJBbHRlciB0aGUgdGFibGUgY29sdW1uIGFsaWdubWVudCBhdCBwb2ludC4K
QWx0ZXIgdGhlIGNvbHVtbiBwb2ludCBpcyBpbi4KCk5vdGU6IFRvIGNvbXB1dGUgdGhlIGNvbHVt
biwgcG9pbnQgbXVzdCBiZSB3aXRoaW4gdGhlIGNvbHVtbiBhbmQgY2Fubm90CmJlIG9uIHRoZSBs
ZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igb24gYSBjb2x1bW4gZGVsaW1pdGVyLgoK
QUxJR04gY2FuIGJlIG9uZSBvZiB0aGUgc3ltYm9scyBgbGVmdCcsIGBjZW50ZXInLCBgcmlnaHQn
IG9yIG5pbCBmb3IKdW5zcGVjaWZpZWQsIG9yIHRoZSBjaGFyYWN0ZXJzIGwsIGMsIG9yIHIuCgpJ
ZiBBTElHTiBpcyBuaWwsIGFzc3VtZSB1bnNwZWNpZmllZC4gIE1ha2UgdGhlIGFsaWdubWVudCBz
dHJpbmcgYQptaW5pbXVtIG9mIDUgY2hhcmFjdGVycyB0byBhY2NvbW1vZGF0ZSBNYXJrZG93biBj
b252ZW50aW9ucy4KCklmIHBvaW50IGlzIG5vdCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIKICAo
aW50ZXJhY3RpdmUKICAgKGxpc3QgKGNhciAocmVhZC1tdWx0aXBsZS1jaG9pY2UKICAgICAgICAg
ICAgICAgIkFsaWduIGNvbHVtbiIgJygoP2wgImxlZnQiKQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICg/YyAiY2VudGVyIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
P3IgInJpZ2h0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoP3UgInVuc3BlY2lm
aWVkIikpKSkpKQogIChtYXJrZG93bi10cy0tYmFyZi1pZi1ub3QtbW9kZSAnbWFya2Rvd24tdHMt
dGFibGUtYWxpZ24tY29sdW1uKQogIChzZXRxIGFsaWduIChpZiAoY2hhcmFjdGVycCBhbGlnbikK
ICAgICAgICAgICAgICAgICAgKHBjYXNlIGFsaWduICg/bCAnbGVmdCkgKD9jICdjZW50ZXIpICg/
ciAncmlnaHQpKQogICAgICAgICAgICAgICAgYWxpZ24pKQogICh3aGVuLWxldCogKChhdC10YWJs
ZSAobWFya2Rvd24tdHMtYXQtdGFibGUtcCBuaWwgdCkpCiAgICAgICAgICAgICAgKHBvcyAoY2Fy
IGF0LXRhYmxlKSkKICAgICAgICAgICAgICAodGFibGUgKGNkciBhdC10YWJsZSkpCiAgICAgICAg
ICAgICAgKG5vZGUgKHRyZWVzaXQtbm9kZS1hdCBwb3MgJ21hcmtkb3duICduYW1lZCkpCiAgICAg
ICAgICAgICAgKGNlbGwgKG1hcmtkb3duLXRzLS10YWJsZS1ub2RlLWNlbGwgbm9kZSkpCiAgICAg
ICAgICAgICAgKHJvdyAobWFya2Rvd24tdHMtLXRhYmxlLW5vZGUtcm93IGNlbGwpKQogICAgICAg
ICAgICAgIChhbGlnbmVycyAobWFya2Rvd24tdHMtLXRhYmxlLWFsaWduZXJzIHRhYmxlKSkpCiAg
ICAobGV0ICgodGFibGUtY29sdW1uIChtYXJrZG93bi10cy0tdGFibGUtY29tcHV0ZS1ub2RlLWNv
bHVtbiByb3cgY2VsbCkpKQogICAgICAodW5sZXNzIHRhYmxlLWNvbHVtbgogICAgICAgIChlcnJv
ciAiQ291bGQgbm90IGNvbXB1dGUgdGhlIHRhYmxlIGNvbHVtbiIpKQogICAgICA7OyBOT1RFOiBH
Rk0gdGFibGVzIGFsbG93IG5vbi11bmlmb3JtIHRhYmxlIHJvd3MuICBUaGUgY3VycmVudCByb3cK
ICAgICAgOzsgY291bGQgaGF2ZSBhIGRpZmZlcmluZyBudW1iZXIgb2YgY29sdW1ucyBmcm9tIHRo
ZSBoZWFkZXIuICBXZQogICAgICA7OyBzaWxlbnRseSBkbyBub3RoaW5nIGlmIHdlIGNhbid0IGZp
bmQgYSBtYXRjaGluZyBoZWFkZXIgY29sdW1uLgogICAgICAod2hlbi1sZXQqICgoYWxpZ25lciAo
bnRoIHRhYmxlLWNvbHVtbiBhbGlnbmVycykpCiAgICAgICAgICAgICAgICAgIChiZWcgKHBsaXN0
LWdldCBhbGlnbmVyIDpiZWcpKQogICAgICAgICAgICAgICAgICAoZW5kIChwbGlzdC1nZXQgYWxp
Z25lciA6ZW5kKSkKICAgICAgICAgICAgICAgICAgKHN0ciAoYnVmZmVyLXN1YnN0cmluZy1uby1w
cm9wZXJ0aWVzIGJlZyBlbmQpKQogICAgICAgICAgICAgICAgICAoc3RybGVuIChtYXggNSAobGVu
Z3RoIHN0cikpKSkKICAgICAgICAoZGVsZXRlLXJlZ2lvbiBiZWcgZW5kKQogICAgICAgIChzYXZl
LWV4Y3Vyc2lvbgogICAgICAgICAgKGdvdG8tY2hhciBiZWcpCiAgICAgICAgICAoaW5zZXJ0ICht
YXJrZG93bi10cy0tdGFibGUtbWFrZS1hbGlnbmVyIHN0cmxlbiBhbGlnbikpKSkpKSkKCihkZWZ1
biBtYXJrZG93bi10cy10YWJsZS1hbGlnbi10YWJsZSAoJm9wdGlvbmFsIGFsaWduLWNlbGxzKQog
ICJBbGlnbiB0aGUgTWFya2Rvd24gdGFibGUgYXQgcG9pbnQuCkFkanVzdCBlYWNoIGNvbHVtbidz
IHdpZHRoIHRvIGFjY29tbW9kYXRlIGl0cyB3aWRlc3QgY29uc3RpdHVlbnQgY2VsbC4KSWYgQUxJ
R04tQ0VMTFMgaXMgbm9uLW5pbCwgb3Igd2l0aCBhIHByZWZpeCBhcmd1bWVudCwgYXBwbHkgdGhl
CmRlbGltaXRlciByb3cncyBhbGlnbm1lbnQgdG8gY2VsbCBjb250ZW50LiAgQUxJR04tQ0VMTFMg
aXMgbm9uLW5pbCBpZgp0aGUgdXNlciBvcHRpb24gYG1hcmtkb3duLXRzLXRhYmxlLWFsaWduLWZl
YXR1cmVzJyBpbmNsdWRlcwpganVzdGlmeS1jZWxscycuCkFuY2hvciB0aGUgY29sdW1ucyB0byB0
aGUgZGVsaW1pdGVyIHJvdy4gIElnbm9yZSByb3dzIHRoYXQgY29udGFpbgpjb2x1bW5zIGJleW9u
ZCB0aGUgZGVsaW1pdGVyIHJvdy4KSWYgbm90IGluIGEgdGFibGUsIGRvIG5vdGhpbmcuIgogIChp
bnRlcmFjdGl2ZSAiUCIpCiAgKG1hcmtkb3duLXRzLS1iYXJmLWlmLW5vdC1tb2RlICdtYXJrZG93
bi10cy10YWJsZS1hbGlnbi10YWJsZSkKICAod2hlbi1sZXQqICgoYXQtdGFibGUgKG1hcmtkb3du
LXRzLWF0LXRhYmxlLXAgbmlsIHQpKQogICAgICAgICAgICAgICh0YWJsZSAoY2RyIGF0LXRhYmxl
KSkKICAgICAgICAgICAgICAoYmVnICh0cmVlc2l0LW5vZGUtc3RhcnQgdGFibGUpKQogICAgICAg
ICAgICAgIChlbmQgKHRyZWVzaXQtbm9kZS1lbmQgdGFibGUpKQogICAgICAgICAgICAgIChfICht
YXJrZG93bi10cy0tdGFibGUtdGljay1zdGFsZS1wIGJlZykpCiAgICAgICAgICAgICAgKHJvd3Mg
KHRyZWVzaXQtbm9kZS1jaGlsZHJlbiB0YWJsZSAnbmFtZWQpKQogICAgICAgICAgICAgIChucm93
cyAobGVuZ3RoIHJvd3MpKQogICAgICAgICAgICAgIChkZWxpbWl0ZXItcm93ICh0cmVlc2l0LXNl
YXJjaC1zdWJ0cmVlCiAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZQogICAgICAgICAgICAg
ICAgICAgICAgICAgIlxcYHBpcGVfdGFibGVfZGVsaW1pdGVyX3Jvd1xcJyIpKQogICAgICAgICAg
ICAgIChhbGlnbmVycyAobWFya2Rvd24tdHMtLXRhYmxlLWFsaWduZXJzIHRhYmxlKSkKICAgICAg
ICAgICAgICAoY29scyAodHJlZXNpdC1ub2RlLWNoaWxkcmVuIGRlbGltaXRlci1yb3cgJ25hbWVk
KSkKICAgICAgICAgICAgICAobmNvbHMgKGxlbmd0aCBjb2xzKSkKICAgICAgICAgICAgICAoY29s
LXdpZHRocyAobWFrZS1oYXNoLXRhYmxlIDpzaXplIG5jb2xzIDp0ZXN0ICdlcXVhbCkpCiAgICAg
ICAgICAgICAgKGNlbGwtdGV4dCAobWFrZS1oYXNoLXRhYmxlIDpzaXplICgqIG5yb3dzIG5jb2xz
KSA6dGVzdCAnZXF1YWwpKSkKICAgIChzZXRxIGFsaWduLWNlbGxzIChvciBhbGlnbi1jZWxscwog
ICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtcHJlZml4LWFyZwogICAgICAgICAgICAg
ICAgICAgICAgICAgIChtZW1xICdqdXN0aWZ5LWNlbGxzIG1hcmtkb3duLXRzLXRhYmxlLWFsaWdu
LWZlYXR1cmVzKSkpCiAgICAod2l0aG91dC1yZXN0cmljdGlvbgogICAgICA7OyBDb2xsZWN0IGNl
bGwgdGV4dCBhbmQgY29tcHV0ZSBtYXggY29sdW1uIHdpZHRocy4KICAgICAgOzsgRG8gbm90IHVz
ZSB0aGUgZGVsaW1pdGVyIHJvdyBmb3Igd2lkdGggY29tcHV0YXRpb24uCiAgICAgIChkb3RpbWVz
ICh4IG5yb3dzKQogICAgICAgIChsZXQqICgocm93IChudGggeCByb3dzKSkKICAgICAgICAgICAg
ICAgKGNlbGxzICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4gcm93ICduYW1lZCkpKQogICAgICAgICAg
KGRvdGltZXMgKHkgbmNvbHMpCiAgICAgICAgICAgIDs7IFNraXAgbmlsIGNlbGxzLS10aGUgcGFy
c2VyIGdvdCBjb25mdXNlZC4KICAgICAgICAgICAgKHdoZW4tbGV0KiAoKGNlbGwgKG50aCB5IGNl
bGxzKSkKICAgICAgICAgICAgICAgICAgICAgICAgKHRleHQgKHN0cmluZy10cmltLXJpZ2h0CiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLXRleHQgY2VsbCAnbm8t
cHJvcGVydHkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgKHcgKGxlbmd0aCB0ZXh0KSkKICAg
ICAgICAgICAgICAgICAgICAgICAgKHcwIChvciAoZ2V0aGFzaCB5IGNvbC13aWR0aHMpIDApKSkK
ICAgICAgICAgICAgICA7OyBFbGlkZSBkZWxpbWl0ZXIgd2lkdGhzLgogICAgICAgICAgICAgICh1
bmxlc3MgKGVxIHggMSkKICAgICAgICAgICAgICAgICh3aGVuICg+IHcgdzApCiAgICAgICAgICAg
ICAgICAgIChwdXRoYXNoIHkgdyBjb2wtd2lkdGhzKSkpCiAgICAgICAgICAgICAgKHB1dGhhc2gg
KGNvbnMgeCB5KSB0ZXh0IGNlbGwtdGV4dCkpKSkpCgogICAgICAobGV0ICgoc291cmNlLWJ1ZmZl
ciAoY3VycmVudC1idWZmZXIpKSkKICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAgICAg
KGRvdGltZXMgKHggbnJvd3MpCiAgICAgICAgICAgIChkb3RpbWVzICh5IG5jb2xzKQogICAgICAg
ICAgICAgIChsZXQqICgod2lkdGggKG9yIChnZXRoYXNoIHkgY29sLXdpZHRocykKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy10YWJsZS1kZWZhdWx0LWNvbHVtbi13
aWR0aCkpCiAgICAgICAgICAgICAgICAgICAgIChhbGlnbiAob3IgKHBsaXN0LWdldCAobnRoIHkg
YWxpZ25lcnMpIDphbGlnbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5zcGVj
aWZpZWQpKQogICAgICAgICAgICAgICAgICAgICA7OyBDb25mdXNlZCBjZWxscyBoYXZlIG5pbCB0
ZXh0LgogICAgICAgICAgICAgICAgICAgICAodGV4dCAob3IgKGdldGhhc2ggKGNvbnMgeCB5KSBj
ZWxsLXRleHQpICIiKSkKICAgICAgICAgICAgICAgICAgICAgKHRleHQwIChtYXJrZG93bi10cy0t
dGFibGUtYWxpZ24tY2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgd2lkdGgK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgYWxpZ24tY2VsbHMKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYWxpZ24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICd1bnNwZWNpZmllZCkpKSkKICAgICAgICAgICAgICAgIChjb25kCiAgICAgICAgICAgICAgICAg
OzsgSGVhZGVyIHJvdy4KICAgICAgICAgICAgICAgICAoKGVxIHggMCkKICAgICAgICAgICAgICAg
ICAgKGluc2VydCAifCIgdGV4dDApKQogICAgICAgICAgICAgICAgIDs7IERlbGltaXRlciByb3cu
ICBVc2UgdW5hbGlnbmVkIHRleHQuCiAgICAgICAgICAgICAgICAgKChlcSB4IDEpCiAgICAgICAg
ICAgICAgICAgIChpbnNlcnQgInwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcmtkb3du
LXRzLS10YWJsZS1tYWtlLWFsaWduZXIgd2lkdGggYWxpZ24pKSkKICAgICAgICAgICAgICAgICA7
OyBCb2R5IHJvdy4KICAgICAgICAgICAgICAgICAodAogICAgICAgICAgICAgICAgICAoaW5zZXJ0
ICJ8IiB0ZXh0MCkpKSkpCiAgICAgICAgICAgIChpbnNlcnQgInwiICJcbiIpKQogICAgICAgICAg
KGxldCAoKHRlbXAtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKQogICAgICAgICAgICAod2l0aC1j
dXJyZW50LWJ1ZmZlciBzb3VyY2UtYnVmZmVyCiAgICAgICAgICAgICAgKHJlcGxhY2UtcmVnaW9u
LWNvbnRlbnRzIGJlZyBlbmQgdGVtcC1idWZmZXIpKSkpKSkKICAgIChtYXJrZG93bi10cy0tdGFi
bGUtdGljay11cGRhdGUgYmVnKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtdHJhbnNwb3Nl
LXRhYmxlICgpCiAgIlRyYW5zcG9zZSB0aGUgcm93cyBhbmQgY29sdW1ucyBvZiB0aGUgTWFya2Rv
d24gdGFibGUgYXQgcG9pbnQuClVzZSB1bnNwZWNpZmllZCBjb2x1bW4gYWxpZ25tZW50IGluIHRo
ZSB0cmFuc3Bvc2VkIHRhYmxlLgpJZiB0YWJsZSdzIHJvd3MgYXJlIG5vdCB1bmlmb3JtIHdpdGgg
dGhvc2Ugb24gdGhlIGRlbGltaXRlciByb3csIHNpZ25hbAphbiBlcnJvci4KSWYgbm90IGluIGEg
dGFibGUsIGRvIG5vdGhpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAobWFya2Rvd24tdHMtLWJhcmYt
aWYtbm90LW1vZGUgJ21hcmtkb3duLXRzLXRhYmxlLXRyYW5zcG9zZS10YWJsZSkKICAod2hlbi1s
ZXQqICgoYXQtdGFibGUgKG1hcmtkb3duLXRzLWF0LXRhYmxlLXAgbmlsIHQpKQogICAgICAgICAg
ICAgICh0YWJsZSAoY2RyIGF0LXRhYmxlKSkKICAgICAgICAgICAgICAoYmVnICh0cmVlc2l0LW5v
ZGUtc3RhcnQgdGFibGUpKQogICAgICAgICAgICAgIChlbmQgKHRyZWVzaXQtbm9kZS1lbmQgdGFi
bGUpKQogICAgICAgICAgICAgIChyb3dzICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4gdGFibGUgJ25h
bWVkKSkKICAgICAgICAgICAgICAobnJvd3MgKGxlbmd0aCByb3dzKSkKICAgICAgICAgICAgICAo
ZGVsaW1pdGVyLXJvdyAodHJlZXNpdC1zZWFyY2gtc3VidHJlZQogICAgICAgICAgICAgICAgICAg
ICAgICAgdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICJcXGBwaXBlX3RhYmxlX2RlbGlt
aXRlcl9yb3dcXCciKSkKICAgICAgICAgICAgICAoYWxpZ25lcnMgKG1hcmtkb3duLXRzLS10YWJs
ZS1hbGlnbmVycyB0YWJsZSkpCiAgICAgICAgICAgICAgKGNvbHMgKHRyZWVzaXQtbm9kZS1jaGls
ZHJlbiBkZWxpbWl0ZXItcm93ICduYW1lZCkpCiAgICAgICAgICAgICAgKG5jb2xzIChsZW5ndGgg
Y29scykpCiAgICAgICAgICAgICAgKGNlbGwtdGV4dCAobWFrZS1oYXNoLXRhYmxlIDpzaXplICgq
IG5yb3dzIG5jb2xzKSA6dGVzdCAnZXF1YWwpKSkKICAgICh3aXRob3V0LXJlc3RyaWN0aW9uCiAg
ICAgIDs7IENvbGxlY3QgY2VsbCB0ZXh0IGFuZCBpbnZlcnQgY29vcmRpbmF0ZXMuCiAgICAgIChk
b3RpbWVzICh4IG5yb3dzKQogICAgICAgIChsZXQqICgocm93IChudGggeCByb3dzKSkKICAgICAg
ICAgICAgICAgKGNlbGxzICh0cmVlc2l0LW5vZGUtY2hpbGRyZW4gcm93ICduYW1lZCkpKQogICAg
ICAgICAgKGRvdGltZXMgKHkgbmNvbHMpCiAgICAgICAgICAgIDs7IFNraXAgbmlsIGNlbGxzLS10
aGUgcGFyc2VyIGdvdCBjb25mdXNlZC4KICAgICAgICAgICAgKHdoZW4tbGV0KiAoKGNlbGwgKG50
aCB5IGNlbGxzKSkKICAgICAgICAgICAgICAgICAgICAgICAgKHRleHQgKHN0cmluZy10cmltLXJp
Z2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlZXNpdC1ub2RlLXRleHQgY2Vs
bCAnbm8tcHJvcGVydHkpKSkpCiAgICAgICAgICAgICAgKHB1dGhhc2ggKGNvbnMgeSB4KSB0ZXh0
IGNlbGwtdGV4dCkpKSkpCgogICAgICAobGV0ICgoc291cmNlLWJ1ZmZlciAoY3VycmVudC1idWZm
ZXIpKSkKICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAgICAgKGRvdGltZXMgKHggbmNv
bHMpCiAgICAgICAgICAgIDs7IFN5bnRoZXNpemUgYSBkZWxpbWl0ZXIgcm93LgogICAgICAgICAg
ICAod2hlbiAoZXEgeCAxKQogICAgICAgICAgICAgIChkb3RpbWVzIChfeSAoMS0gbnJvd3MpKQog
ICAgICAgICAgICAgICAgKGluc2VydCAifCIKICAgICAgICAgICAgICAgICAgICAgICAgKG1hcmtk
b3duLXRzLS10YWJsZS1tYWtlLWFsaWduZXIKICAgICAgICAgICAgICAgICAgICAgICAgIChtYXgg
NSBtYXJrZG93bi10cy10YWJsZS1kZWZhdWx0LWNvbHVtbi13aWR0aCkKICAgICAgICAgICAgICAg
ICAgICAgICAgICd1bnNwZWNpZmllZCkpKQogICAgICAgICAgICAgIChpbnNlcnQgInwiICJcbiIp
KQogICAgICAgICAgICAoZG90aW1lcyAoeSBucm93cykKICAgICAgICAgICAgICA7OyBTa2lwIHRo
ZSBvcmlnaW5hbCBkZWxpbWl0ZXIgcm93LgogICAgICAgICAgICAgICh1bmxlc3MgKGVxIHkgMSkK
ICAgICAgICAgICAgICAgIDs7IENvbmZ1c2VkIGNlbGxzIGhhdmUgbmlsIHRleHQuCiAgICAgICAg
ICAgICAgICAobGV0ICgodGV4dCAob3IgKGdldGhhc2ggKGNvbnMgeCB5KSBjZWxsLXRleHQpICIi
KSkpCiAgICAgICAgICAgICAgICAgIChpbnNlcnQgInwiIHRleHQpKSkpCiAgICAgICAgICAgIChp
bnNlcnQgInwiICJcbiIpKQogICAgICAgICAgKGxldCAoKHRlbXAtYnVmZmVyIChjdXJyZW50LWJ1
ZmZlcikpKQogICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBzb3VyY2UtYnVmZmVyCiAg
ICAgICAgICAgICAgKHJlcGxhY2UtcmVnaW9uLWNvbnRlbnRzIGJlZyBlbmQgdGVtcC1idWZmZXIp
KSkpKSkKICAgICh3aGVuIChvciAoZXEgbWFya2Rvd24tdHMtdGFibGUtYXV0by1hbGlnbiB0KQog
ICAgICAgICAgICAgIChtZW1xICd0cmFuc3Bvc2UgbWFya2Rvd24tdHMtdGFibGUtYXV0by1hbGln
bikpCiAgICAgIChtYXJrZG93bi10cy10YWJsZS1hbGlnbi10YWJsZSkpKSkKCihkZWZ1biBtYXJr
ZG93bi10cy10YWJsZS1jb252ZXJ0LWNzdi1yZWdpb24gKCBiZWcgZW5kCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9uYWwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci1saW5lIHJlcGxhY2UpCiAgIkNv
bnZlcnQgdGhlIGNvbW1hLXNlcGFyYXRlZCByZWdpb24gQkVHIHRvIEVORCB0byBhIE1hcmtkb3du
IHRhYmxlLgpJZiBIRUFERVItTElORSBpcyBub24tbmlsLCB1c2UgdGhlIGZpcnN0IGxpbmUgb2Yg
dGhlIHJlZ2lvbiBhcyB0aGUgdGFibGUKY29sdW1uIGhlYWRlci4gIElmIG5pbCwgaW5mZXIgdGhl
IG51bWJlciBvZiBjb2x1bW5zIGFuZCBzeW50aGVzaXplCmNvbHVtbiBuYW1lcyBmcm9tIHRoZSBm
aXJzdCBsaW5lLgoKTm90ZTogQm9keSBjb2x1bW5zIGJleW9uZCB0aGUgcHJvdmlkZWQgb3IgaW5m
ZXJyZWQgbnVtYmVyIG9mIGNvbHVtbnMgYXJlCmRyb3BwZWQuCgpJZiBSRVBMQUNFIGlzIG5vbi1u
aWwsIG92ZXJ3cml0ZSB0aGUgcmVnaW9uIEJFRyBFTkQgd2l0aCB0aGUgTWFya2Rvd24KdGFibGUs
IG90aGVyd2lzZSBpbnNlcnQgdGhlIHRhYmxlIGFmdGVyIEVORC4KCldpdGggYSBzaW5nbGUgcHJl
Zml4IGFyZ3VtZW50LCBIRUFERVItTElORSBpcyBub24tbmlsLgpXaXRoIGEgZG91YmxlIHByZWZp
eCBhcmd1bWVudCwgUkVQTEFDRSBpcyBub24tbmlsLgpXaXRoIGEgdHJpcGxlIHByZWZpeCBhcmd1
bWVudCwgYm90aCBhcmUgbm9uLW5pbC4iCiAgKGludGVyYWN0aXZlICJSIikKICAobWFya2Rvd24t
dHMtdGFibGUtY29udmVydC1yZWdpb24gYmVnIGVuZCBoZWFkZXItbGluZSByZXBsYWNlICdjc3Yp
KQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWNvbnZlcnQtdHN2LXJlZ2lvbiAoIGJlZyBlbmQK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25hbAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLWxpbmUg
cmVwbGFjZSkKICAiQ29udmVydCB0aGUgdGFiLXNlcGFyYXRlZCByZWdpb24gQkVHIHRvIEVORCB0
byBhIE1hcmtkb3duIHRhYmxlLgpJZiBIRUFERVItTElORSBpcyBub24tbmlsLCB1c2UgdGhlIGZp
cnN0IGxpbmUgb2YgdGhlIHJlZ2lvbiBhcyB0aGUgdGFibGUKY29sdW1uIGhlYWRlci4gIElmIG5p
bCwgaW5mZXIgdGhlIG51bWJlciBvZiBjb2x1bW5zIGFuZCBzeW50aGVzaXplCmNvbHVtbiBuYW1l
cyBmcm9tIHRoZSBmaXJzdCBsaW5lLgoKTm90ZTogQm9keSBjb2x1bW5zIGJleW9uZCB0aGUgcHJv
dmlkZWQgb3IgaW5mZXJyZWQgbnVtYmVyIG9mIGNvbHVtbnMgYXJlCmRyb3BwZWQuCgpJZiBSRVBM
QUNFIGlzIG5vbi1uaWwsIG92ZXJ3cml0ZSB0aGUgcmVnaW9uIEJFRyBFTkQgd2l0aCB0aGUgTWFy
a2Rvd24KdGFibGUsIG90aGVyd2lzZSBpbnNlcnQgdGhlIHRhYmxlIGFmdGVyIEVORC4KCldpdGgg
YSBzaW5nbGUgcHJlZml4IGFyZ3VtZW50LCBIRUFERVItTElORSBpcyBub24tbmlsLgpXaXRoIGEg
ZG91YmxlIHByZWZpeCBhcmd1bWVudCwgUkVQTEFDRSBpcyBub24tbmlsLgpXaXRoIGEgdHJpcGxl
IHByZWZpeCBhcmd1bWVudCwgYm90aCBhcmUgbm9uLW5pbC4iCiAgKGludGVyYWN0aXZlICJSIikK
ICAobWFya2Rvd24tdHMtdGFibGUtY29udmVydC1yZWdpb24gYmVnIGVuZCBoZWFkZXItbGluZSBy
ZXBsYWNlICd0c3YpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRhYmxlLWNvbnZlcnQtcmVnaW9uICgg
YmVnIGVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9u
YWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLWxpbmUg
cmVwbGFjZSBmb3JtYXQpCiAgIkNvbnZlcnQgdGhlIGNvbW1hLXNlcGFyYXRlZCByZWdpb24gQkVH
IHRvIEVORCB0byBhIE1hcmtkb3duIHRhYmxlLgpJZiBIRUFERVItTElORSBpcyBub24tbmlsLCB1
c2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHJlZ2lvbiBhcyB0aGUgdGFibGUKY29sdW1uIGhlYWRl
ci4gIElmIG5pbCwgaW5mZXIgdGhlIG51bWJlciBvZiBjb2x1bW5zIGFuZCBzeW50aGVzaXplCmNv
bHVtbiBuYW1lcyBmcm9tIHRoZSBmaXJzdCBsaW5lLgoKTm90ZTogQm9keSBjb2x1bW5zIGJleW9u
ZCB0aGUgcHJvdmlkZWQgb3IgaW5mZXJyZWQgbnVtYmVyIG9mIGNvbHVtbnMgYXJlCmRyb3BwZWQu
CgpJZiBSRVBMQUNFIGlzIG5vbi1uaWwsIG92ZXJ3cml0ZSB0aGUgcmVnaW9uIEJFRyBFTkQgd2l0
aCB0aGUgTWFya2Rvd24KdGFibGUsIG90aGVyd2lzZSBpbnNlcnQgdGhlIHRhYmxlIGFmdGVyIEVO
RC4KCkZPUk1BVCBpcyBvbmUgb2YgdGhlIHN5bWJvbHMgYGNzdicgZm9yIGNvbW1hLXNlcGFyYXRl
ZCB2YWx1ZXMsIG9yIGB0c3YnCmZvciB0YWItc2VwYXJhdGVkIHZhbHVlcy4gIElmIGFueSBvdGhl
ciB2YWx1ZSwgdXNlIGBjc3YnLgoKV2l0aCBhIHNpbmdsZSBwcmVmaXggYXJndW1lbnQsIEhFQURF
Ui1MSU5FIGlzIG5vbi1uaWwuCldpdGggYSBkb3VibGUgcHJlZml4IGFyZ3VtZW50LCBSRVBMQUNF
IGlzIG5vbi1uaWwuCldpdGggYSB0cmlwbGUgcHJlZml4IGFyZ3VtZW50LCBib3RoIGFyZSBub24t
bmlsLiIKICAoaW50ZXJhY3RpdmUgIlIiKQogIChtYXJrZG93bi10cy0tYmFyZi1pZi1ub3QtbW9k
ZSAnbWFya2Rvd24tdHMtdGFibGUtY29udmVydC1yZWdpb24pCgogIChjb25kICgoZXF1YWwgY3Vy
cmVudC1wcmVmaXgtYXJnICcoNCkpCiAgICAgICAgIChzZXRxIGhlYWRlci1saW5lIHQpKQogICAg
ICAgICgoZXF1YWwgY3VycmVudC1wcmVmaXgtYXJnICcoMTYpKQogICAgICAgICAoc2V0cSByZXBs
YWNlIHQpKQogICAgICAgICgoZXF1YWwgY3VycmVudC1wcmVmaXgtYXJnICcoNjQpKQogICAgICAg
ICAoc2V0cSBoZWFkZXItbGluZSB0CiAgICAgICAgICAgICAgIHJlcGxhY2UgdCkpKQogIChsZXQg
KHJvd3MpCiAgICAoc2F2ZS1yZXN0cmljdGlvbgogICAgICAobmFycm93LXRvLXJlZ2lvbiBiZWcg
ZW5kKQogICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICAgICAod2hpbGUgKDwgKHBvaW50
KSAocG9pbnQtbWF4KSkKICAgICAgICAocGNhc2UgZm9ybWF0CiAgICAgICAgICAoJ3RzdgogICAg
ICAgICAgICAgKHB1c2gKICAgICAgICAgICAgICAoc3BsaXQtc3RyaW5nCiAgICAgICAgICAgICAg
IChidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMgKHBvaW50KSAocG9zLWVvbCkpICJcdCIp
CiAgICAgICAgICAgICAgcm93cykpCiAgICAgICAgICAgKF8KICAgICAgICAgICAgKGxldCAocm93
KQogICAgICAgICAgICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQKICAgICAgICAgICAgICAg
ICAgICAgICJcIlxcKD86W15cIl1cXHxcIlwiXFwpKlwiXFx8W14sXStcXHxcIlwiIgogICAgICAg
ICAgICAgICAgICAgICAgKHBvcy1lb2wpIHQpCiAgICAgICAgICAgICAgICAocHVzaAogICAgICAg
ICAgICAgICAgIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcKICAgICAgICAgICAgICAgICAgIlwi
XCIiICJcIiIKICAgICAgICAgICAgICAgICAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwogICAg
ICAgICAgICAgICAgICAgIlxcYFwiXFwoXC4qXFwpXCJcXCciCiAgICAgICAgICAgICAgICAgICAi
XFwxIgogICAgICAgICAgICAgICAgICAgKHN1YnN0cmluZy1uby1wcm9wZXJ0aWVzIChtYXRjaC1z
dHJpbmcgMCkpKSkKICAgICAgICAgICAgICAgICByb3cpKQogICAgICAgICAgICAgIChwdXNoIChu
cmV2ZXJzZSByb3cpIHJvd3MpKSkpCiAgICAgICAgKGZvcndhcmQtbGluZSAxKSkKICAgICAgICAo
c2V0cSByb3dzIChucmV2ZXJzZSByb3dzKSkKICAgICAgICAoY29uZCAocmVwbGFjZSAoZGVsZXRl
LXJlZ2lvbiBiZWcgZW5kKSkKICAgICAgICAgICAgICAodCAoZ290by1jaGFyIGVuZCkpKQogICAg
ICAgIChpZiBoZWFkZXItbGluZQogICAgICAgICAgICAobWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0
LXRhYmxlICgxLSAobGVuZ3RoIHJvd3MpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChsZW5ndGggKGNhciByb3dzKSkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoY2FyIHJvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGNkciByb3dzKSkKICAgICAgICAgIChtYXJrZG93bi10cy10YWJs
ZS1pbnNlcnQtdGFibGUgKGxlbmd0aCByb3dzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAobGVuZ3RoIChjYXIgcm93cykpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG5pbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByb3dzKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1leHBvcnQtdGFibGUt
Y3N2ICgmb3B0aW9uYWwgZGlzcGxheSkKICAiRXhwb3J0IHRoZSBNYXJrZG93biB0YWJsZSBhdCBw
b2ludCB0byBjb21tYS1zZXBhcmF0ZWQgaW4gYSBidWZmZXIuCklmIERJU1BMQVkgaXMgbm9uLW5p
bCwgb3Igd2l0aCBhIHByZWZpeCBhcmd1bWVudCwgZGlzcGxheSB0aGUgZXhwb3J0CmJ1ZmZlciBh
ZnRlciBleHBvcnRpbmcuCklmIHBvaW50IGlzIG5vdCBhdCBhIHRhYmxlLCBkbyBub3RoaW5nLiIK
ICAoaW50ZXJhY3RpdmUgIlAiKQogIChtYXJrZG93bi10cy10YWJsZS1leHBvcnQtdGFibGUgZGlz
cGxheSAnY3N2KSkKCihkZWZ1biBtYXJrZG93bi10cy10YWJsZS1leHBvcnQtdGFibGUtdHN2ICgm
b3B0aW9uYWwgZGlzcGxheSkKICAiRXhwb3J0IHRoZSBNYXJrZG93biB0YWJsZSBhdCBwb2ludCB0
byB0YWItc2VwYXJhdGVkIGluIGEgYnVmZmVyLgpJZiBESVNQTEFZIGlzIG5vbi1uaWwsIG9yIHdp
dGggYSBwcmVmaXggYXJndW1lbnQsIGRpc3BsYXkgdGhlIGV4cG9ydApidWZmZXIgYWZ0ZXIgZXhw
b3J0aW5nLgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAgKGludGVy
YWN0aXZlICJQIikKICAobWFya2Rvd24tdHMtdGFibGUtZXhwb3J0LXRhYmxlIGRpc3BsYXkgJ3Rz
dikpCgooZGVmdW4gbWFya2Rvd24tdHMtdGFibGUtZXhwb3J0LXRhYmxlICgmb3B0aW9uYWwgZGlz
cGxheSBmb3JtYXQpCiAgIkV4cG9ydCB0aGUgTWFya2Rvd24gdGFibGUgYXQgcG9pbnQgdG8gQ1NW
IGluIGEgYnVmZmVyLgpJZiBESVNQTEFZIGlzIG5vbi1uaWwsIG9yIHdpdGggYSBwcmVmaXggYXJn
dW1lbnQsIGRpc3BsYXkgdGhlIGV4cG9ydApidWZmZXIgYWZ0ZXIgZXhwb3J0aW5nLgpGT1JNQVQg
aXMgb25lIG9mIHRoZSBzeW1ib2xzIGBjc3YnIGZvciBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzIGFr
YSBDU1YsCm9yIGB0c3YnIGZvciB0YWItc2VwYXJhdGVkIHZhbHVlcyBha2EgVFNWLiAgSWYgYW55
IG90aGVyIHZhbHVlLCB1c2UKYGNzdicuICBJZiBUU1YsIHJlcGxhY2UgYW55IHRhYnMgd2l0aGlu
IGEgZmllbGQgd2l0aCBhIHNwYWNlLgpEbyBub3QgZXhwb3J0IHRoZSB0YWJsZSdzIGhlYWRlciBk
ZWxpbWl0ZXIgcm93LgpJZiBwb2ludCBpcyBub3QgYXQgYSB0YWJsZSwgZG8gbm90aGluZy4iCiAg
KGludGVyYWN0aXZlICJQIikKICAobWFya2Rvd24tdHMtLWJhcmYtaWYtbm90LW1vZGUgJ21hcmtk
b3duLXRzLXRhYmxlLWV4cG9ydC10YWJsZSkKICAod2hlbi1sZXQqICgoYXQtdGFibGUgKG1hcmtk
b3duLXRzLWF0LXRhYmxlLXAgbmlsIHQpKQogICAgICAgICAgICAgICh0YWJsZSAoY2RyIGF0LXRh
YmxlKSkKICAgICAgICAgICAgICAocm93cyAodHJlZXNpdC1ub2RlLWNoaWxkcmVuIHRhYmxlICdu
YW1lZCkpCiAgICAgICAgICAgICAgKGhlYWRlciAodHJlZXNpdC1zZWFyY2gtc3VidHJlZSB0YWJs
ZSAiXFxgcGlwZV90YWJsZV9oZWFkZXJcXCciKSkKICAgICAgICAgICAgICAoZGVsaW1pdGVyLXJv
dyAodHJlZXNpdC1zZWFyY2gtc3VidHJlZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
YWJsZSAiXFxgcGlwZV90YWJsZV9kZWxpbWl0ZXJfcm93XFwnIikpCiAgICAgICAgICAgICAgKGV4
cG9ydC1idWZmZXIgKGdldC1idWZmZXItY3JlYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1hcmtkb3duLXRzLXRhYmxlLWV4cG9ydC1idWZmZXIpKSkKICAgICh3aXRoLWN1cnJlbnQt
YnVmZmVyIGV4cG9ydC1idWZmZXIKICAgICAgKHNwZWNpYWwtbW9kZSkKICAgICAgKGxldCAoKGlu
aGliaXQtcmVhZC1vbmx5IHQpKQogICAgICAgICh3aWRlbikKICAgICAgICAoZXJhc2UtYnVmZmVy
KQogICAgICAgIChkb2xpc3QgKHJvdyByb3dzKQogICAgICAgICAgKHVubGVzcyAoZXF1YWwgcm93
IGRlbGltaXRlci1yb3cpCiAgICAgICAgICAgIChsZXQqICgoZWx0cyAodHJlZXNpdC1ub2RlLWNo
aWxkcmVuIHJvdyAnbmFtZWQpKQogICAgICAgICAgICAgICAgICAgKGxlbiAobGVuZ3RoIGVsdHMp
KSkKICAgICAgICAgICAgICAoZG90aW1lcyAoeCBsZW4pCiAgICAgICAgICAgICAgICAobGV0ICgo
cyAoc3RyaW5nLXRyaW0gKHRyZWVzaXQtbm9kZS10ZXh0IChudGggeCBlbHRzKQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm8tcHJvcGVy
dHkpKSkpCiAgICAgICAgICAgICAgICAgIChwY2FzZSBmb3JtYXQKICAgICAgICAgICAgICAgICAg
ICAoJ3RzdgogICAgICAgICAgICAgICAgICAgICAoaW5zZXJ0IChyZXBsYWNlLXJlZ2V4cC1pbi1z
dHJpbmcgIlx0IiAiXHMiIHMpKQogICAgICAgICAgICAgICAgICAgICAod2hlbiAoPCB4ICgxLSBs
ZW4pKQogICAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQgIlx0IikpKQogICAgICAgICAgICAg
ICAgICAgIChfCiAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQKICAgICAgICAgICAgICAgICAg
ICAgIChpZiAoc3RyaW5nLW1hdGNoICJbXCIsXSIgcykKICAgICAgICAgICAgICAgICAgICAgICAg
ICAoY29uY2F0ICJcIiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjb25j
YXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWRlbnRpdHkgKHNwbGl0LXN0
cmluZyBzICJcIiIpICJcIlwiIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJc
IiIpCiAgICAgICAgICAgICAgICAgICAgICAgIHMpKQogICAgICAgICAgICAgICAgICAgICAod2hl
biAoPCB4ICgxLSBsZW4pKQogICAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQgIiwiKSkpKSkp
CiAgICAgICAgICAgICAgKGluc2VydCAiXG4iKSkpKQogICAgICAgIChnb3RvLWNoYXIgKHBvaW50
LW1pbikpKSkKICAgICh3aGVuIGRpc3BsYXkKICAgICAgKGRpc3BsYXktYnVmZmVyIGV4cG9ydC1i
dWZmZXIpKSkpCgo7OzsgSGVscGVyczoKCihkZWZ1biBtYXJrZG93bi10cy0tb3V0bGluZS1pbnZp
c2libGUtcCAocG9zKQogICJSZXR1cm4gbm9uLW5pbCBpZiBQT1MgaXMgaW5zaWRlIGFuIG91dGxp
bmUtZm9sZGVkIHJlZ2lvbi4iCiAgKGNsLXNvbWUgKGxhbWJkYSAob3YpIChlcSAob3ZlcmxheS1n
ZXQgb3YgJ2ludmlzaWJsZSkgJ291dGxpbmUpKQogICAgICAgICAgIChvdmVybGF5cy1hdCBwb3Mp
KSkKCihkZWZ1biBtYXJrZG93bi10cy0tcmFuZ2Utc2V0dGluZ3MgKCkKICAiUmV0dXJuIHJhbmdl
IHNldHRpbmdzIGZvciBgbWFya2Rvd24tdHMtbW9kZScuIgogIChhcHBseQogICAjJ3RyZWVzaXQt
cmFuZ2UtcnVsZXMKICAgYCggOmVtYmVkIG1hcmtkb3duLWlubGluZQogICAgICA6aG9zdCBtYXJr
ZG93bgogICAgICA6bG9jYWwgdAogICAgICgoaW5saW5lKSBAbWFya2Rvd24taW5saW5lKQogICAg
ICxAKHdoZW4gbWFya2Rvd24tdHMtZm9udGlmeS1jb2RlLWJsb2Nrcy1uYXRpdmVseQogICAgICAg
ICAnKCA6ZW1iZWQgbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stdHMtbGFuZ3VhZ2UKICAgICAgICAg
ICAgOmhvc3QgbWFya2Rvd24KICAgICAgICAgICAgOmxvY2FsIHQKICAgICAgICAgICAgKChmZW5j
ZWRfY29kZV9ibG9jayAoaW5mb19zdHJpbmcgKGxhbmd1YWdlKSBAbGFuZ3VhZ2UpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGVfZmVuY2VfY29udGVudCkgQGNvbnRlbnQpKSkp
KSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLXJlbW92ZS1pbWFnZS1vdmVybGF5cyAoKQogICJSZW1v
dmUgYWxsIGlubGluZSBpbWFnZSBvdmVybGF5cyBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlci4iCiAg
KGRvbGlzdCAob3YgKG92ZXJsYXlzLWluIChwb2ludC1taW4pIChwb2ludC1tYXgpKSkKICAgICh3
aGVuIChvdmVybGF5LWdldCBvdiAnbWFya2Rvd24tdHMtaW1hZ2UpCiAgICAgIChkZWxldGUtb3Zl
cmxheSBvdikpKSkKCihkZWZ1biBtYXJrZG93bi10cy0tb3V0bGluZS12aWV3LWNoYW5nZSAoKQog
ICJVcGRhdGUgaW1hZ2Ugb3ZlcmxheXMgYWZ0ZXIgb3V0bGluZSBmb2xkL3VuZm9sZC4KUmVtb3Zl
cyBpbWFnZSBvdmVybGF5cyBpbiBmb2xkZWQgcmVnaW9ucyBhbmQgdHJpZ2dlcnMKcmVmb250aWZp
Y2F0aW9uIHNvIHRoYXQgaW1hZ2VzIGluIHVuZm9sZGVkIHJlZ2lvbnMgYXJlIHJlY3JlYXRlZC4i
CiAgKHdoZW4gbWFya2Rvd24tdHMtaW5saW5lLWltYWdlcwogICAgKG1hcmtkb3duLXRzLS1yZW1v
dmUtaW1hZ2Utb3ZlcmxheXMpCiAgICAoZm9udC1sb2NrLWZsdXNoKSkpCgooZGVmdW4gbWFya2Rv
d24tdHMtLXNldC1oaWRlLW1hcmt1cCAodmFsdWUpCiAgIlNldCBoaWRpbmcgb2YgTWFya2Rvd24g
bWFya3VwIGRlbGltaXRlcnMgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgpWQUxVRSBub24tbmlsIGhp
ZGVzIG1hcmt1cCwgbmlsIHNob3dzIGl0LiIKICAoaWYgdmFsdWUKICAgICAgKGFkZC10by1pbnZp
c2liaWxpdHktc3BlYyAnbWFya2Rvd24tdHMtLW1hcmt1cCkKICAgIChyZW1vdmUtZnJvbS1pbnZp
c2liaWxpdHktc3BlYyAnbWFya2Rvd24tdHMtLW1hcmt1cCkpCiAgKHdoZW4gbWFya2Rvd24tdHMt
aW5saW5lLWltYWdlcwogICAgKG1hcmtkb3duLXRzLS1yZW1vdmUtaW1hZ2Utb3ZlcmxheXMpKQog
IChmb250LWxvY2stZmx1c2gpKQoKKGRlZnVuIG1hcmtkb3duLXRzLXRvZ2dsZS1oaWRlLW1hcmt1
cCAoKQogICJUb2dnbGUgaGlkaW5nIG9mIE1hcmtkb3duIG1hcmt1cCBkZWxpbWl0ZXJzIGluIHRo
ZSBjdXJyZW50IGJ1ZmZlci4iCiAgKGludGVyYWN0aXZlKQogIChzZXRxIG1hcmtkb3duLXRzLWhp
ZGUtbWFya3VwIChub3QgbWFya2Rvd24tdHMtaGlkZS1tYXJrdXApKQogIChtYXJrZG93bi10cy0t
c2V0LWhpZGUtbWFya3VwIG1hcmtkb3duLXRzLWhpZGUtbWFya3VwKSkKCihkZWZ1biBtYXJrZG93
bi10cy0tc2V0LWlubGluZS1pbWFnZXMgKHZhbHVlKQogICJTZXQgZGlzcGxheSBvZiBpbmxpbmUg
aW1hZ2VzIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KVkFMVUUgbm9uLW5pbCBkaXNwbGF5cyBpbWFn
ZXMsIG5pbCByZW1vdmVzIHRoZW0uIgogIChpZiB2YWx1ZQogICAgICAodHJlZXNpdC1mb250LWxv
Y2stcmVjb21wdXRlLWZlYXR1cmVzICcoaW1hZ2UtcHJldmlldykpCiAgICAodHJlZXNpdC1mb250
LWxvY2stcmVjb21wdXRlLWZlYXR1cmVzIG5pbCAnKGltYWdlLXByZXZpZXcpKSkKICAobWFya2Rv
d24tdHMtLXJlbW92ZS1pbWFnZS1vdmVybGF5cykKICAoZm9udC1sb2NrLWZsdXNoKSkKCihkZWZ1
biBtYXJrZG93bi10cy10b2dnbGUtaW5saW5lLWltYWdlcyAoKQogICJUb2dnbGUgZGlzcGxheSBv
ZiBpbmxpbmUgaW1hZ2VzIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4iCiAgKGludGVyYWN0aXZlKQog
IChzZXRxIG1hcmtkb3duLXRzLWlubGluZS1pbWFnZXMgKG5vdCBtYXJrZG93bi10cy1pbmxpbmUt
aW1hZ2VzKSkKICAobWFya2Rvd24tdHMtLXNldC1pbmxpbmUtaW1hZ2VzIG1hcmtkb3duLXRzLWlu
bGluZS1pbWFnZXMpCiAgKG1lc3NhZ2UgIklubGluZSBpbWFnZXMgJXMiIChpZiBtYXJrZG93bi10
cy1pbmxpbmUtaW1hZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxl
ZCIgImRpc2FibGVkIikpKQoKOzs7IEVtcGhhc2lzOgoKKGRlZnZhciBtYXJrZG93bi10cy1lbXBo
YXNpcy1hbGlzdAogICcoKD9iIC4gIioqIikKICAgICg/QiAuICJfXyIpCiAgICAoP2kgLiAiKiIp
CiAgICAoP0kgLiAiXyIpCiAgICAoP3MgLiAifn4iKQogICAgKD9jIC4gImAiKQogICAgKD9hIC4g
IioqKiIpKQogICJBbGlzdCBvZiBlbXBoYXNpcyBtYXJrZXJzIGZvciBgbWFya2Rvd24tdHMtZW1w
aGFzaXplJy4KRWFjaCBlbnRyeSBpcyAoS0VZIC4gTUFSS0VSKSB3aGVyZSBLRVkgaXMgYSBjaGFy
YWN0ZXIgKG5vdCBhIHN0cmluZykgYW5kCk1BUktFUiBpcyB0aGUgTWFya2Rvd24gZW1waGFzaXpl
ZCB0ZXh0IHByZWZpeC9zdWZmaXguIikKCihkZWZ1biBtYXJrZG93bi10cy0tZW1waGFzaXMtbm9k
ZS1hdC1wb2ludCAoKQogICJSZXR1cm4gdGhlIGVtcGhhc2lzIG5vZGUgYXQgcG9pbnQsIG9yIG5p
bC4KRmluZHMgdGhlIGlubmVybW9zdCBgZW1waGFzaXMnLCBgc3Ryb25nX2VtcGhhc2lzJywKYHN0
cmlrZXRocm91Z2gnLCBvciBgY29kZV9zcGFuJyBub2RlLiIKICAod2hlbi1sZXQqICgobm9kZSAo
dHJlZXNpdC1ub2RlLWF0IChwb2ludCkgJ21hcmtkb3duLWlubGluZSkpKQogICAgKHRyZWVzaXQt
cGFyZW50LXVudGlsCiAgICAgbm9kZSAobGFtYmRhIChuKQogICAgICAgICAgICAobWVtYmVyICh0
cmVlc2l0LW5vZGUtdHlwZSBuKQogICAgICAgICAgICAgICAgICAgICcoImVtcGhhc2lzIiAic3Ry
b25nX2VtcGhhc2lzIgogICAgICAgICAgICAgICAgICAgICAgInN0cmlrZXRocm91Z2giICJjb2Rl
X3NwYW4iKSkpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtcmVtb3ZlLWVtcGhhc2lzICgpCiAgIlJl
bW92ZSBlbXBoYXNpcyBhcm91bmQgcG9pbnQgb3IgcmVnaW9uLgpXaXRoIGFuIGFjdGl2ZSByZWdp
b24sIHN0cmlwIHRoZSBvdXRlcm1vc3QgZW1waGFzaXMgbWFya2VycyBmcm9tCnRoZSBzZWxlY3Rl
ZCB0ZXh0LiAgV2l0aG91dCBhIHJlZ2lvbiwgZmluZCB0aGUgZW1waGFzaXMgbm9kZSBhdApwb2lu
dCB1c2luZyB0cmVlLXNpdHRlciBhbmQgcmVtb3ZlIGl0cyBtYXJrZXJzLiIKICAoaW50ZXJhY3Rp
dmUpCiAgKGlmICh1c2UtcmVnaW9uLXApCiAgICAgIChsZXQqICgoYmVnIChyZWdpb24tYmVnaW5u
aW5nKSkKICAgICAgICAgICAgIChlbmQgKHJlZ2lvbi1lbmQpKQogICAgICAgICAgICAgKHRleHQg
KGJ1ZmZlci1zdWJzdHJpbmcgYmVnIGVuZCkpCiAgICAgICAgICAgICAoc3RyaXBwZWQgbmlsKSkK
ICAgICAgICAoY2wtbG9vcCBmb3IgKF9rZXkgLiBtKSBpbiAoc29ydCAoY29weS1zZXF1ZW5jZQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy1lbXBo
YXNpcy1hbGlzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFt
YmRhIChhIGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPiAo
bGVuZ3RoIChjZHIgYSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAobGVuZ3RoIChjZHIgYikpKSkpCiAgICAgICAgICAgICAgICAgZm9yIHJlID0gKGNvbmNh
dCAiXFxgIiAocmVnZXhwLXF1b3RlIG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiXFwoXFwoPzouXFx8XG5cXCkqXFwpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKHJlZ2V4cC1xdW90ZSBtKSAiXFwnIikKICAgICAgICAgICAgICAgICB3aGVuIChzdHJpbmct
bWF0Y2ggcmUgdGV4dCkKICAgICAgICAgICAgICAgICBkbyAoc2V0cSBzdHJpcHBlZCAobWF0Y2gt
c3RyaW5nIDEgdGV4dCkpCiAgICAgICAgICAgICAgICAgYW5kIHJldHVybiBuaWwpCiAgICAgICAg
KHdoZW4gc3RyaXBwZWQKICAgICAgICAgIChkZWxldGUtcmVnaW9uIGJlZyBlbmQpCiAgICAgICAg
ICAoaW5zZXJ0IHN0cmlwcGVkKSkpCiAgICA7OyBGaW5kIHRoZSBvdXRlcm1vc3QgZW1waGFzaXMg
bm9kZSBhdCBwb2ludC4KICAgICh3aGVuLWxldCogKChpbm5lciAobWFya2Rvd24tdHMtLWVtcGhh
c2lzLW5vZGUtYXQtcG9pbnQpKQogICAgICAgICAgICAgICAgKG5vZGUgKGxldCAoKG4gaW5uZXIp
KQogICAgICAgICAgICAgICAgICAgICAgICAod2hpbGUgKGxldCAoKHBhcmVudCAodHJlZXNpdC1u
b2RlLXBhcmVudCBuKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuIChh
bmQgcGFyZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1l
bWJlciAodHJlZXNpdC1ub2RlLXR5cGUgcGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJygiZW1waGFzaXMiCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJvbmdfZW1waGFzaXMiCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJp
a2V0aHJvdWdoIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiY29kZV9zcGFuIikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChzZXRxIG4gcGFyZW50KSkpKQogICAgICAgICAgICAgICAgICAgICAgICBuKSkKICAgICAgICAg
ICAgICAgIChzdGFydCAodHJlZXNpdC1ub2RlLXN0YXJ0IG5vZGUpKQogICAgICAgICAgICAgICAg
KGVuZCAodHJlZXNpdC1ub2RlLWVuZCBub2RlKSkKICAgICAgICAgICAgICAgICh0ZXh0ICh0cmVl
c2l0LW5vZGUtdGV4dCBub2RlIHQpKQogICAgICAgICAgICAgICAgKHR5cGUgKHRyZWVzaXQtbm9k
ZS10eXBlIG5vZGUpKQogICAgICAgICAgICAgICAgKG1sZW4gKHBjYXNlIHR5cGUKICAgICAgICAg
ICAgICAgICAgICAgICAgKCJzdHJvbmdfZW1waGFzaXMiCiAgICAgICAgICAgICAgICAgICAgICAg
ICAoaWYgKHN0cmluZy1wcmVmaXgtcCAiXyIgdGV4dCkgMiAyKSkKICAgICAgICAgICAgICAgICAg
ICAgICAgKCJlbXBoYXNpcyIKICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoc3RyaW5nLXBy
ZWZpeC1wICJfIiB0ZXh0KSAxIDEpKQogICAgICAgICAgICAgICAgICAgICAgICAoInN0cmlrZXRo
cm91Z2giIDIpCiAgICAgICAgICAgICAgICAgICAgICAgICgiY29kZV9zcGFuIiAxKSkpCiAgICAg
ICAgICAgICAgICAoaW5uZXItdGV4dCAoc3Vic3RyaW5nIHRleHQgbWxlbiAoLSAobGVuZ3RoIHRl
eHQpIG1sZW4pKSkpCiAgICAgIChsZXQgKChvZmZzZXQgKC0gKHBvaW50KSBzdGFydCBtbGVuKSkp
CiAgICAgICAgKGRlbGV0ZS1yZWdpb24gc3RhcnQgZW5kKQogICAgICAgIChnb3RvLWNoYXIgc3Rh
cnQpCiAgICAgICAgKGluc2VydCBpbm5lci10ZXh0KQogICAgICAgIChnb3RvLWNoYXIgKCsgc3Rh
cnQgKG1heCAwIG9mZnNldCkpKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy1lbXBoYXNpemUgKCZv
cHRpb25hbCBjaGFyKQogICJJbnNlcnQgb3IgY2hhbmdlIGVtcGhhc2lzIG9uIHRleHQuCklmIHRo
ZXJlIGlzIGFuIGFjdGl2ZSByZWdpb24sIHdyYXAgaXQgd2l0aCBlbXBoYXNpcyBtYXJrZXJzLgpJ
ZiB0aGVyZSBpcyBubyByZWdpb24sIGluc2VydCBtYXJrZXIgcGFpcnMgYW5kIHBsYWNlIHBvaW50
IGJldHdlZW4KdGhlbS4gIENIQVIgc2VsZWN0cyB0aGUgZW1waGFzaXMgdHlwZToKCiAgYiAgICoq
Ym9sZCoqICAgICAgIEIgIF9fYm9sZF9fCiAgaSAgICppdGFsaWMqICAgICAgIEkgIF9pdGFsaWNf
CiAgYSAgICoqKmJvbGQraXRhbGljKioqCiAgcyAgIH5+c3RyaWtldGhyb3VnaH5+CiAgYyAgIGBj
b2RlYAogIFNQQyByZW1vdmUgZW1waGFzaXMgYXQgcG9pbnQgb3IgcmVnaW9uIgogIChpbnRlcmFj
dGl2ZQogICAiY0VtcGhhc2lzIFtiXW9sZCBbQl1vbGRfIFtpXXRhbGljIFtJXXRhbGljXyBbYV1s
bCBbc110cmlrZSBbY11vZGUgU1BDIHJlbW92ZToiKQogIChpZiAoZXEgY2hhciA/XHMpCiAgICAg
IChtYXJrZG93bi10cy1yZW1vdmUtZW1waGFzaXMpCiAgICAoaWYtbGV0KiAoKG1hcmtlciAoY2Ry
IChhc3NxIGNoYXIgbWFya2Rvd24tdHMtZW1waGFzaXMtYWxpc3QpKSkpCiAgICAgICAgKGlmICh1
c2UtcmVnaW9uLXApCiAgICAgICAgICAgIChsZXQgKChiZWcgKHJlZ2lvbi1iZWdpbm5pbmcpKQog
ICAgICAgICAgICAgICAgICAoZW5kIChjb3B5LW1hcmtlciAocmVnaW9uLWVuZCkpKSkKICAgICAg
ICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgZW5kKQog
ICAgICAgICAgICAgICAgKGluc2VydCBtYXJrZXIpCiAgICAgICAgICAgICAgICAoZ290by1jaGFy
IGJlZykKICAgICAgICAgICAgICAgIChpbnNlcnQgbWFya2VyKSkpCiAgICAgICAgICAoaWYtbGV0
KiAoKGJvdW5kcyAoYm91bmRzLW9mLXRoaW5nLWF0LXBvaW50ICd3b3JkKSkpCiAgICAgICAgICAg
ICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAgICAoZ290by1jaGFyIChjZHIgYm91bmRz
KSkKICAgICAgICAgICAgICAgIChpbnNlcnQgbWFya2VyKQogICAgICAgICAgICAgICAgKGdvdG8t
Y2hhciAoY2FyIGJvdW5kcykpCiAgICAgICAgICAgICAgICAoaW5zZXJ0IG1hcmtlcikpCiAgICAg
ICAgICAgIChpbnNlcnQgbWFya2VyIG1hcmtlcikKICAgICAgICAgICAgKGJhY2t3YXJkLWNoYXIg
KGxlbmd0aCBtYXJrZXIpKSkpCiAgICAgICh1c2VyLWVycm9yICJObyBzdWNoIGVtcGhhc2lzIG1h
cmtlcjogJWMiIGNoYXIpKSkpCgo7OzsgQmxvY2sgc3RydWN0dXJlOgoKKGRlZnVuIG1hcmtkb3du
LXRzLWluc2VydC1zdHJ1Y3R1cmUgKCZvcHRpb25hbCBjaGFyKQogICJJbnNlcnQgYSBibG9jayBz
dHJ1Y3R1cmUuCklmIHRoZXJlIGlzIGFuIGFjdGl2ZSByZWdpb24sIHdyYXAgaXQuICBPdGhlcndp
c2UsIGluc2VydCBhbiBlbXB0eQpibG9jayBhbmQgcGxhY2UgcG9pbnQgaW5zaWRlLiAgQ0hBUiBz
ZWxlY3RzIHRoZSBzdHJ1Y3R1cmUgdHlwZToKCiAgYCAgZmVuY2VkIGNvZGUgYmxvY2sgKGBgYCkK
ICB+ICB0aWxkZSBmZW5jZWQgY29kZSBibG9jayAofn5+KQogIHEgIGJsb2NrIHF1b3RlICg+ICkK
ICBkICBob3Jpem9udGFsIGRpdmlkZXIvcnVsZSAoLS0tKQogIHQgIHRhYmxlIgogIChpbnRlcmFj
dGl2ZQogICAiY1N0cnVjdHVyZSBbYF1iYWNrLXRpY2sgY29kZSBibG9jayBbfl10aWxkZSBjb2Rl
IGJsb2NrIFtxXXVvdGUgW2RdaXZpZGVyIFt0XWFibGU6IikKICAocGNhc2UgY2hhcgogICAgKD9g
IChtYXJrZG93bi10cy0taW5zZXJ0LWNvZGUtYmxvY2sgP2ApKQogICAgKD9+IChtYXJrZG93bi10
cy0taW5zZXJ0LWNvZGUtYmxvY2sgP34pKQogICAgKD9xIChtYXJrZG93bi10cy0taW5zZXJ0LWJs
b2NrLXF1b3RlKSkKICAgICg/ZCAobWFya2Rvd24tdHMtLWluc2VydC1kaXZpZGVyKSkKICAgICg/
dCAobWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LXRhYmxlKSkKICAgIChfICh1c2VyLWVycm9yICJO
byBzdWNoIHN0cnVjdHVyZTogJWMiIGNoYXIpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWluc2Vy
dC1jb2RlLWJsb2NrIChjaGFyICZvcHRpb25hbCBsYW5ndWFnZSkKICAiSW5zZXJ0IGEgZmVuY2Vk
IGNvZGUgYmxvY2sgdXNpbmcgYSBDSEFSIHNlcXVlbmNlLgpDSEFSIHNob3VsZCBiZSBvbmUgb2Yg
YSBiYWNrdGljayBvciBhIHRpbGRlLgpMQU5HVUFHRSBpcyBhIHdoaXRlc3BhY2UgZnJlZSBsYW5n
dWFnZSBzdHJpbmcuIgogIChzZXRxIGxhbmd1YWdlCiAgICAgICAgKG9yIGxhbmd1YWdlCiAgICAg
ICAgICAgIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcKICAgICAgICAgICAgICJbWzpibGFuazpd
XSIgIiIKICAgICAgICAgICAgIChsZXQgKChjb21wbGV0aW9uLWlnbm9yZS1jYXNlIG5pbCkKICAg
ICAgICAgICAgICAgICAgIChjYW5kaWRhdGVzCiAgICAgICAgICAgICAgICAgICAgKHNlcS1tYXAK
ICAgICAgICAgICAgICAgICAgICAgIydzeW1ib2wtbmFtZQogICAgICAgICAgICAgICAgICAgICAo
c2VxLXVuaXEKICAgICAgICAgICAgICAgICAgICAgIChhcHBlbmQgKG1hcGNhciAjJ2NhciBtYXJr
ZG93bi10cy0tY29kZS1ibG9jay1sYW5ndWFnZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChtYXBjYXIgIydjYXIgbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stbm9uLXRzLW1vZGVzKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwY2FyICMnY2FyIG1hcmtkb3duLXRzLWNv
ZGUtYmxvY2stbW9kZXMpKSkpKSkKICAgICAgICAgICAgICAgKGNvbXBsZXRpbmctcmVhZAogICAg
ICAgICAgICAgICAgIkNvZGUgYmxvY2sgbGFuZ3VhZ2U6ICIKICAgICAgICAgICAgICAgIGNhbmRp
ZGF0ZXMKICAgICAgICAgICAgICAgIG5pbAogICAgICAgICAgICAgICAgJ2NvbmZpcm0gOyBQcm9t
cHQgaWYgdGhlIGxhbmd1YWdlIGlzIG5vdCBvbiBvdXIgbGlzdC4KICAgICAgICAgICAgICAgIG5p
bAogICAgICAgICAgICAgICAgJ21hcmtkb3duLXRzLWxhbmd1YWdlLWhpc3RvcnkpKSkpKQogIChs
ZXQgKChmZW5jZS1zdHJpbmcgKG1ha2Utc3RyaW5nIDMgY2hhcikpKQogICAgKGlmICh1c2UtcmVn
aW9uLXApCiAgICAgICAgKGxldCAoKGJlZyAocmVnaW9uLWJlZ2lubmluZykpCiAgICAgICAgICAg
ICAgKGVuZCAocmVnaW9uLWVuZCkpKQogICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAg
ICAgIChnb3RvLWNoYXIgZW5kKQogICAgICAgICAgICAodW5sZXNzIChib2xwKSAoaW5zZXJ0ICJc
biIpKQogICAgICAgICAgICAoaW5zZXJ0IGZlbmNlLXN0cmluZyAiXG4iKQogICAgICAgICAgICAo
Z290by1jaGFyIGJlZykKICAgICAgICAgICAgKGluc2VydCBmZW5jZS1zdHJpbmcgbGFuZ3VhZ2Ug
IlxuIikpKQogICAgICAoaW5zZXJ0IGZlbmNlLXN0cmluZyBsYW5ndWFnZSAiXG5cbiIgZmVuY2Ut
c3RyaW5nKQogICAgICAoZm9yd2FyZC1saW5lIC0xKSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLS1p
bnNlcnQtYmxvY2stcXVvdGUgKCkKICAiSW5zZXJ0IGEgYmxvY2sgcXVvdGUuIgogIChpZiAodXNl
LXJlZ2lvbi1wKQogICAgICAobGV0ICgoYmVnIChyZWdpb24tYmVnaW5uaW5nKSkKICAgICAgICAg
ICAgKGVuZCAoY29weS1tYXJrZXIgKHJlZ2lvbi1lbmQpKSkpCiAgICAgICAgKHNhdmUtZXhjdXJz
aW9uCiAgICAgICAgICAoZ290by1jaGFyIGJlZykKICAgICAgICAgICh3aGlsZSAoPCAocG9pbnQp
IGVuZCkKICAgICAgICAgICAgKGluc2VydCAiPiAiKQogICAgICAgICAgICAoZm9yd2FyZC1saW5l
IDEpKSkpCiAgICAoaW5zZXJ0ICI+ICIpKSkKCihkZWZ1biBtYXJrZG93bi10cy0taW5zZXJ0LWRp
dmlkZXIgKCkKICAiSW5zZXJ0IGEgaG9yaXpvbnRhbCBydWxlLiIKICAodW5sZXNzIChib2xwKSAo
aW5zZXJ0ICJcbiIpKQogIChpbnNlcnQgIlxuLS0tXG5cbiIpKQoKKGRlZnVuIG1hcmtkb3duLXRz
LS1hcHBseS1lbGxpcHNpcyAoKQogICJBcHBseSBgbWFya2Rvd24tdHMtZWxsaXBzaXMnIHRvIHRo
ZSBjdXJyZW50IGJ1ZmZlcidzIGRpc3BsYXkgdGFibGUuIgogIChpZiAoYW5kIChzdHJpbmdwIG1h
cmtkb3duLXRzLWVsbGlwc2lzKQogICAgICAgICAgIChub3QgKHN0cmluZy1lbXB0eS1wIG1hcmtk
b3duLXRzLWVsbGlwc2lzKSkpCiAgICAgIChsZXQgKCh0YWJsZSAob3IgYnVmZmVyLWRpc3BsYXkt
dGFibGUKICAgICAgICAgICAgICAgICAgICAgICAobWFrZS1kaXNwbGF5LXRhYmxlKSkpKQogICAg
ICAgIChzZXQtZGlzcGxheS10YWJsZS1zbG90CiAgICAgICAgIHRhYmxlIDQKICAgICAgICAgKHZj
b25jYXQgKG1hcGNhciAobGFtYmRhIChjKSAobWFrZS1nbHlwaC1jb2RlIGMgJ3NoYWRvdykpCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Rvd24tdHMtZWxsaXBzaXMpKSkKICAgICAgICAo
c2V0cSBidWZmZXItZGlzcGxheS10YWJsZSB0YWJsZSkpCiAgICAod2hlbiBidWZmZXItZGlzcGxh
eS10YWJsZQogICAgICAoc2V0LWRpc3BsYXktdGFibGUtc2xvdCBidWZmZXItZGlzcGxheS10YWJs
ZSA0IG5pbCkpKSkKCjs7OyBNYWpvciBtb2RlOgoKKGRlZnVuIG1hcmtkb3duLXRzLW91dGxpbmUt
Y3ljbGUgKCkKICAiQ3ljbGUgdmlzaWJpbGl0eSBvZiB0aGUgaGVhZGluZyBhdCBwb2ludC4KT24g
YSBoZWFkaW5nLCBjYWxsIGBvdXRsaW5lLWN5Y2xlJy4gIE90aGVyd2lzZSBkbyBub3RoaW5nLiIK
ICAoaW50ZXJhY3RpdmUpCiAgKHdoZW4gKG91dGxpbmUtb24taGVhZGluZy1wKQogICAgKG91dGxp
bmUtY3ljbGUpKSkKCihkZWZ2YXIta2V5bWFwIG1hcmtkb3duLXRzLW1vZGUtbWFwCiAgOmRvYyAi
S2V5bWFwIGZvciBgbWFya2Rvd24tdHMtbW9kZScuIgogICJNLTxsZWZ0PiIgICAgIydtYXJrZG93
bi10cy1wcm9tb3RlCiAgIk0tPHJpZ2h0PiIgICAjJ21hcmtkb3duLXRzLWRlbW90ZQogICJNLTx1
cD4iICAgICAgIydtYXJrZG93bi10cy1tb3ZlLXN1YnRyZWUtdXAKICAiTS08ZG93bj4iICAgICMn
bWFya2Rvd24tdHMtbW92ZS1zdWJ0cmVlLWRvd24KICAiQy1jIEMtbiIgICAgICMnb3V0bGluZS1u
ZXh0LWhlYWRpbmcKICAiQy1jIEMtcCIgICAgICMnb3V0bGluZS1wcmV2aW91cy1oZWFkaW5nCiAg
IkMtYyBDLXUiICAgICAjJ291dGxpbmUtdXAtaGVhZGluZwogICJDLWMgQy1mIiAgICAgIydvdXRs
aW5lLWZvcndhcmQtc2FtZS1sZXZlbAogICJDLWMgQy1iIiAgICAgIydvdXRsaW5lLWJhY2t3YXJk
LXNhbWUtbGV2ZWwKICAiQy1jIEMteCBDLWYiICMnbWFya2Rvd24tdHMtZW1waGFzaXplCiAgIkMt
YyBDLXggQy1tIiAjJ21hcmtkb3duLXRzLXRvZ2dsZS1oaWRlLW1hcmt1cAogICJDLWMgQy14IEMt
diIgIydtYXJrZG93bi10cy10b2dnbGUtaW5saW5lLWltYWdlcwogICJDLWMgQy1jIiAgICAgIydt
YXJrZG93bi10cy10b2dnbGUtY2hlY2tib3gKICAiQy1jIEMtciIgICAgICMnbWFya2Rvd24tdHMt
cmVudW1iZXItbGlzdAogICJDLWMgQy0sIiAgICAgIydtYXJrZG93bi10cy1pbnNlcnQtc3RydWN0
dXJlCiAgIkMtYyBDLXYgbiIgICAjJ21hcmtkb3duLXRzLW1vdmUtdG8tbmV4dC1jb2RlLWJsb2Nr
CiAgIkMtYyBDLXYgcCIgICAjJ21hcmtkb3duLXRzLW1vdmUtdG8tcHJldmlvdXMtY29kZS1ibG9j
awogICJSRVQiICAgICAgICAgIydtYXJrZG93bi10cy1uZXdsaW5lCiAgIk0tUkVUIiAgICAgICAj
J21hcmtkb3duLXRzLWluc2VydC1saXN0LWl0ZW0KICAiVEFCIiAgICAgICAgICMnbWFya2Rvd24t
dHMtb3V0bGluZS1jeWNsZSkKCihkZWZ2YXIta2V5bWFwIG1hcmtkb3duLXRzLXZpZXctbW9kZS1t
YXAKICA6ZG9jICJLZXltYXAgZm9yIGBtYXJrZG93bi10cy12aWV3LW1vZGUnLiIKICA6cGFyZW50
IHNwZWNpYWwtbW9kZS1tYXAKICA6bWVudSBuaWwKICAiZyIgICAgICAgICAgICMnaWdub3JlIDsg
T3ZlcnJpZGUgc3BlY2lhbC1tb2RlLW1hcCAjJ3JldmVydC1idWZmZXIKICAiQy1jIEMtbiIgICAg
ICMnb3V0bGluZS1uZXh0LWhlYWRpbmcKICAibiIgICAgICAgICAgICMnb3V0bGluZS1uZXh0LWhl
YWRpbmcKICAiQy1jIEMtcCIgICAgICMnb3V0bGluZS1wcmV2aW91cy1oZWFkaW5nCiAgInAiICAg
ICAgICAgICAjJ291dGxpbmUtcHJldmlvdXMtaGVhZGluZwogICJDLWMgQy11IiAgICAgIydvdXRs
aW5lLXVwLWhlYWRpbmcKICAidSIgICAgICAgICAgICMnb3V0bGluZS11cC1oZWFkaW5nCiAgIkMt
YyBDLWYiICAgICAjJ291dGxpbmUtZm9yd2FyZC1zYW1lLWxldmVsCiAgImYiICAgICAgICAgICAj
J291dGxpbmUtZm9yd2FyZC1zYW1lLWxldmVsCiAgIkMtYyBDLWIiICAgICAjJ291dGxpbmUtYmFj
a3dhcmQtc2FtZS1sZXZlbAogICJiIiAgICAgICAgICAgIydvdXRsaW5lLWJhY2t3YXJkLXNhbWUt
bGV2ZWwKICAiQy1jIEMteCBDLW0iICMnbWFya2Rvd24tdHMtdG9nZ2xlLWhpZGUtbWFya3VwCiAg
IkMtYyBDLXggQy12IiAjJ21hcmtkb3duLXRzLXRvZ2dsZS1pbmxpbmUtaW1hZ2VzCiAgIkMtYyBD
LXYgbiIgICAjJ21hcmtkb3duLXRzLW1vdmUtdG8tbmV4dC1jb2RlLWJsb2NrCiAgIkMtYyBDLXYg
cCIgICAjJ21hcmtkb3duLXRzLW1vdmUtdG8tcHJldmlvdXMtY29kZS1ibG9jawogICJUQUIiICAg
ICAgICAgIydtYXJrZG93bi10cy1vdXRsaW5lLWN5Y2xlKQoKKGRlZnZhci1rZXltYXAgbWFya2Rv
d24tdHMtY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUtbWFwCiAgOmRvYyAiS2V5bWFwIGZvciBg
bWFya2Rvd24tdHMtY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUnLgpUaGVzZSBvdmVycmlkZSBr
ZXlzIGluIGBtYXJrZG93bi10cy1tb2RlLW1hcCcgdG8gc3VwcG9ydCBleGVjdXRpbmcgdGhlaXIK
Y29tbWFuZHMgaW4gYSBjb2RlLWJsb2NrIGNvbnRleHQuIgogIDpwYXJlbnQgbWFya2Rvd24tdHMt
bW9kZS1tYXAKICA6bWVudSBuaWwKICAiTS0uIiAgICAgICAgICMnbWFya2Rvd24tdHMtLWNvZGUt
YmxvY2steHJlZi1maW5kLWRlZmluaXRpb25zCiAgIlRBQiIgICAgICAgICAjJ2luZGVudC1mb3It
dGFiLWNvbW1hbmQKICAiUkVUIiAgICAgICAgICMnbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stbmV3
bGluZQogICJDLWoiICAgICAgICAgIydtYXJrZG93bi10cy0tY29kZS1ibG9jay1uZXdsaW5lCiAg
Ik0tUkVUIiAgICAgICAjJ21hcmtkb3duLXRzLS1jb2RlLWJsb2NrLW5ld2xpbmUKICAiTS1xIiAg
ICAgICAgICMnbWFya2Rvd24tdHMtLWNvZGUtYmxvY2stZmlsbC1wYXJhZ3JhcGgpCgooZGVmdmFy
LWtleW1hcCBtYXJrZG93bi10cy1pbi10YWJsZS1tb2RlLW1hcAogIDpkb2MgIktleW1hcCBmb3Ig
YG1hcmtkb3duLXRzLWluLXRhYmxlLW1vZGUnLgpUaGVzZSBvdmVycmlkZSBrZXlzIGluIGBtYXJr
ZG93bi10cy1tb2RlLW1hcCcgdG8gc3VwcG9ydCBleGVjdXRpbmcgdGhlaXIKY29tbWFuZHMgaW4g
YSB0YWJsZSBjb250ZXh0LiIKICA6cGFyZW50IG1hcmtkb3duLXRzLW1vZGUtbWFwCiAgOm1lbnUg
bmlsCiAgIjxyZXR1cm4+IiAgICAjJ21hcmtkb3duLXRzLXRhYmxlLW5leHQtcm93CiAgIlMtPHJl
dHVybj4iICAjJ21hcmtkb3duLXRzLXRhYmxlLXByZXZpb3VzLXJvdwogICI8dGFiPiIgICAgICAg
IydtYXJrZG93bi10cy10YWJsZS1uZXh0LWNlbGwKICAiPGJhY2t0YWI+IiAgICMnbWFya2Rvd24t
dHMtdGFibGUtcHJldmlvdXMtY2VsbAogICJNLTx1cD4iICAgICAgIydtYXJrZG93bi10cy10YWJs
ZS1tb3ZlLXJvdy11cAogICJNLTxkb3duPiIgICAgIydtYXJrZG93bi10cy10YWJsZS1tb3ZlLXJv
dy1kb3duCiAgIk0tPGxlZnQ+IiAgICAjJ21hcmtkb3duLXRzLXRhYmxlLW1vdmUtY29sdW1uLWxl
ZnQKICAiTS08cmlnaHQ+IiAgICMnbWFya2Rvd24tdHMtdGFibGUtbW92ZS1jb2x1bW4tcmlnaHQK
ICAiTS1TLTx1cD4iICAgICMnbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LXJvdy1hYm92ZQogICJN
LVMtPGRvd24+IiAgIydtYXJrZG93bi10cy10YWJsZS1kZWxldGUtcm93CiAgIk0tUy08cmlnaHQ+
IiAjJ21hcmtkb3duLXRzLXRhYmxlLWluc2VydC1jb2x1bW4tbGVmdAogICJNLVMtPGxlZnQ+IiAg
IydtYXJrZG93bi10cy10YWJsZS1kZWxldGUtY29sdW1uCiAgIkMtYyBDLXQgYSIgICAjJ21hcmtk
b3duLXRzLXRhYmxlLWFsaWduLWNvbHVtbgogICJDLWMgQy1jIiAgICAgIydtYXJrZG93bi10cy10
YWJsZS1hbGlnbi10YWJsZQogICJDLWMgQy10IHQiICAgIydtYXJrZG93bi10cy10YWJsZS10cmFu
c3Bvc2UtdGFibGUpCgooZWFzeS1tZW51LWRlZmluZSBtYXJrZG93bi10cy1tb2RlLW1lbnUgbWFy
a2Rvd24tdHMtbW9kZS1tYXAKICAiYG1hcmtkb3duLXRzLW1vZGUnIG1lbnUuIgogICcoIk1hcmtk
b3duIiA6dmlzaWJsZSBtYXJrZG93bi10cy1tZW51LWJhci1zaG93CiAgICAiLS0iCiAgICBbIkN5
Y2xlIE91dGxpbmUgVmlzaWJpbGl0eSIgIG1hcmtkb3duLXRzLW91dGxpbmUtY3ljbGUgICAgICAg
ICAgICAgIDpoZWxwICJDeWNsZSBoZWFkaW5nIHZpc2liaWxpdHkgZnJvbSBwb2ludCJdCiAgICBb
IlRvZ2dsZSBIaWRlIE1hcmt1cCIgICAgICAgIG1hcmtkb3duLXRzLXRvZ2dsZS1oaWRlLW1hcmt1
cCAgICAgICAgIDpoZWxwICJUb2dnbGUgZGlzcGxheSBvZiBtYXJrdXAgY2hhcmFjdGVycyIgOnN0
eWxlIHRvZ2dsZSA6c2VsZWN0ZWQgbWFya2Rvd24tdHMtaGlkZS1tYXJrdXBdCiAgICBbIlRvZ2ds
ZSBJbmxpbmUgSW1hZ2VzIiAgICAgIG1hcmtkb3duLXRzLXRvZ2dsZS1pbmxpbmUtaW1hZ2VzICAg
ICAgIDpoZWxwICJUb2dnbGUgZGlzcGxheSBvZiBpbmxpbmUgaW1hZ2VzIGJlbG93IGxpbmtzIiA6
c3R5bGUgdG9nZ2xlIDpzZWxlY3RlZCBtYXJrZG93bi10cy1pbmxpbmUtaW1hZ2VzXQogICAgIi0t
IgogICAgWyJVcCIgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLXVwLWhlYWRpbmcgICAg
ICAgICAgICAgICAgICAgICA6aGVscCAiTW92ZSB0byB0aGUgcGFyZW50IGhlYWRpbmciXQogICAg
WyJOZXh0IiAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLW5leHQtaGVhZGluZyAgICAgICAg
ICAgICAgICAgICA6aGVscCAiTW92ZSB0byB0aGUgbmV4dCBoZWFkaW5nIl0KICAgIFsiUHJldmlv
dXMiICAgICAgICAgICAgICAgICAgb3V0bGluZS1wcmV2aW91cy1oZWFkaW5nICAgICAgICAgICAg
ICAgOmhlbHAgIk1vdmUgdG8gdGhlIHByZXZpb3VzIGhlYWRpbmciXQogICAgWyJOZXh0IFNhbWUg
TGV2ZWwiICAgICAgICAgICBvdXRsaW5lLWZvcndhcmQtc2FtZS1sZXZlbCAgICAgICAgICAgICA6
aGVscCAiTW92ZSB0byB0aGUgbmV4dCBoZWFkaW5nIGF0IHRoZSBzYW1lIGxldmVsIl0KICAgIFsi
UHJldmlvdXMgU2FtZSBMZXZlbCIgICAgICAgb3V0bGluZS1iYWNrd2FyZC1zYW1lLWxldmVsICAg
ICAgICAgICAgOmhlbHAgIk1vdmUgdG8gdGhlIHByZXZpb3VzIGhlYWRpbmcgYXQgdGhlIHNhbWUg
bGV2ZWwiXQogICAgIi0tIgogICAgWyJKdW1wIiAgICAgICAgICAgICAgICAgICAgICBpbWVudSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aGVscCAiSnVtcCB0byBhIGhlYWRpbmcg
dmlhIGNvbXBsZXRpb24iXQogICAgIi0tIgogICAgWyJNb3ZlIFN1YnRyZWUgVXAiICAgICAgICAg
ICBtYXJrZG93bi10cy1tb3ZlLXN1YnRyZWUtdXAgICAgICAgICAgICA6aGVscCAiTW92ZSB0aGUg
Y3VycmVudCBzZWN0aW9uIG9yIGxpc3QgaXRlbSB1cCJdCiAgICBbIk1vdmUgU3VidHJlZSBEb3du
IiAgICAgICAgIG1hcmtkb3duLXRzLW1vdmUtc3VidHJlZS1kb3duICAgICAgICAgIDpoZWxwICJN
b3ZlIHRoZSBjdXJyZW50IHNlY3Rpb24gb3IgbGlzdCBpdGVtIGRvd24iXQogICAgWyJQcm9tb3Rl
IiAgICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy1wcm9tb3RlICAgICAgICAgICAgICAgICAg
ICA6aGVscCAiUHJvbW90ZSBoZWFkaW5nIG9yIGxpc3QgaXRlbSJdCiAgICBbIkRlbW90ZSIgICAg
ICAgICAgICAgICAgICAgIG1hcmtkb3duLXRzLWRlbW90ZSAgICAgICAgICAgICAgICAgICAgIDpo
ZWxwICJEZW1vdGUgaGVhZGluZyBvciBsaXN0IGl0ZW0iXQogICAgIi0tIgogICAgWyJFbXBoYXNp
cy4uLiIgICAgICAgICAgICAgICBtYXJrZG93bi10cy1lbXBoYXNpemUgICAgICAgICAgICAgICAg
ICA6aGVscCAiQWRkIG9yIGNoYW5nZSBlbXBoYXNpcyBvbiByZWdpb24iXQogICAgWyJBZGQgQmxv
Y2sgU3RydWN0dXJlIiAgICAgICBtYXJrZG93bi10cy1pbnNlcnQtc3RydWN0dXJlICAgICAgICAg
ICA6aGVscCAiSW5zZXJ0IGEgY29kZSBibG9jaywgcXVvdGUsIG9yIG90aGVyIHN0cnVjdHVyZSJd
CiAgICAiLS0iCiAgICBbIlRvZ2dsZSBDaGVja2JveCIgICAgICAgICAgIG1hcmtkb3duLXRzLXRv
Z2dsZS1jaGVja2JveCAgICAgICAgICAgIDpoZWxwICJUb2dnbGUgdGFzayBsaXN0IGNoZWNrYm94
IGF0IHBvaW50Il0KICAgIFsiTmV3IExpc3QgSXRlbSIgICAgICAgICAgICAgbWFya2Rvd24tdHMt
aW5zZXJ0LWxpc3QtaXRlbSAgICAgICAgICAgOmhlbHAgIkluc2VydCBhIG5ldyBsaXN0IGl0ZW0g
YWZ0ZXIgdGhlIGN1cnJlbnQgb25lIl0KICAgIFsiUmVudW1iZXIgTGlzdCIgICAgICAgICAgICAg
bWFya2Rvd24tdHMtcmVudW1iZXItbGlzdCAgICAgICAgICAgICAgOmhlbHAgIlJlbnVtYmVyIHRo
ZSBvcmRlcmVkIGxpc3QgYXQgcG9pbnQiXQogICAgIi0tIgogICAgKCJUYWJsZSIKICAgICBbIklu
c2VydCB0YWJsZSIgICAgICAgICAgICAgbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LXRhYmxlICAg
ICAgICAgOmhlbHAgIkluc2VydCBhbiBlbXB0eSB0YWJsZSBhdCBwb2ludCJdCiAgICAgWyJEZWxl
dGUgdGFibGUiICAgICAgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLWRlbGV0ZS10YWJsZSAgICAg
ICAgIDpoZWxwICJEZWxldGUgdGhlIHRhYmxlIGF0IHBvaW50Il0KICAgICAiLS0iCiAgICAgWyJO
ZXh0IGNlbGwiICAgICAgICAgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLW5leHQtY2VsbCAgICAg
ICAgICAgIDpoZWxwICJNb3ZlIHBvaW50IHRvIHRoZSBuZXh0IGNlbGwiXQogICAgIFsiUHJldmlv
dXMgY2VsbCIgICAgICAgICAgICBtYXJrZG93bi10cy10YWJsZS1wcmV2aW91cy1jZWxsICAgICAg
ICA6aGVscCAiTW92ZSBwb2ludCB0byB0aGUgcHJldmlvdXMgY2VsbCJdCiAgICAgIi0tIgogICAg
IFsiTmV4dCByb3ciICAgICAgICAgICAgICAgICBtYXJrZG93bi10cy10YWJsZS1uZXh0LXJvdyAg
ICAgICAgICAgICA6aGVscCAiTW92ZSBwb2ludCB0byB0aGUgbmV4dCByb3ciXQogICAgIFsiUHJl
dmlvdXMgcm93IiAgICAgICAgICAgICBtYXJrZG93bi10cy10YWJsZS1wcmV2aW91cy1yb3cgICAg
ICAgICA6aGVscCAiTW92ZSBwb2ludCB0byB0aGUgcHJldmlvdXMgcm93Il0KICAgICBbIkluc2Vy
dCByb3cgYmVsb3ciICAgICAgICAgbWFya2Rvd24tdHMtdGFibGUtaW5zZXJ0LXJvdy1iZWxvdyAg
ICAgOmhlbHAgIkluc2VydCBhbiBlbXB0eSByb3cgYmVsb3cgcG9pbnQiXQogICAgIFsiSW5zZXJ0
IHJvdyBhYm92ZSIgICAgICAgICBtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtcm93LWFib3ZlICAg
ICA6aGVscCAiSW5zZXJ0IGFuIGVtcHR5IHJvdyBhYm92ZSBwb2ludCJdCiAgICAgWyJDbG9uZSBy
b3cgYmVsb3ciICAgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLWNsb25lLXJvdy1iZWxvdyAgICAg
IDpoZWxwICJDbG9uZSB0aGUgY3VycmVudCByb3cgYmVsb3cgaXQiXQogICAgIFsiQ2xvbmUgcm93
IGFib3ZlIiAgICAgICAgICBtYXJrZG93bi10cy10YWJsZS1jbG9uZS1yb3ctYWJvdmUgICAgICA6
aGVscCAiQ2xvbmUgdGhlIGN1cnJlbnQgcm93IGFib3ZlIGl0Il0KICAgICBbIk1vdmUgcm93IHVw
IiAgICAgICAgICAgICAgbWFya2Rvd24tdHMtdGFibGUtbW92ZS1yb3ctdXAgICAgICAgICAgOmhl
bHAgIk1vdmUgdGhlIHJvdyBhdCBwb2ludCB1cCJdCiAgICAgWyJNb3ZlIHJvdyBkb3duIiAgICAg
ICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLW1vdmUtcm93LWRvd24gICAgICAgIDpoZWxwICJNb3Zl
IHRoZSByb3cgYXQgcG9pbnQgZG93biJdCiAgICAgWyJEZWxldGUgcm93IiAgICAgICAgICAgICAg
IG1hcmtkb3duLXRzLXRhYmxlLWRlbGV0ZS1yb3cgICAgICAgICAgIDpoZWxwICJEZWxldGUgdGhl
IHJvdyBhdCBwb2ludCJdCiAgICAgIi0tIgogICAgIFsiSW5zZXJ0IGNvbHVtbiBsZWZ0IiAgICAg
ICBtYXJrZG93bi10cy10YWJsZS1pbnNlcnQtY29sdW1uLWxlZnQgICA6aGVscCAiSW5zZXJ0IGFu
IGVtcHR5IGNvbHVtbiB0byB0aGUgbGVmdCBvZiBwb2ludCJdCiAgICAgWyJJbnNlcnQgY29sdW1u
IHJpZ2h0IiAgICAgIG1hcmtkb3duLXRzLXRhYmxlLWluc2VydC1jb2x1bW4tcmlnaHQgIDpoZWxw
ICJJbnNlcnQgYW4gZW1wdHkgY29sdW1uIHRvIHRoZSByaWdodCBvZiBwb2ludCJdCiAgICAgWyJD
bG9uZSBjb2x1bW4gbGVmdCIgICAgICAgIG1hcmtkb3duLXRzLXRhYmxlLWNsb25lLWNvbHVtbi1s
ZWZ0ICAgIDpoZWxwICJJbnNlcnQgYW4gZW1wdHkgY29sdW1uIHRvIHRoZSBsZWZ0IG9mIHBvaW50
Il0KICAgICBbIkNsb25lIGNvbHVtbiByaWdodCIgICAgICAgbWFya2Rvd24tdHMtdGFibGUtY2xv
bmUtY29sdW1uLXJpZ2h0ICAgOmhlbHAgIkluc2VydCBhbiBlbXB0eSBjb2x1bW4gdG8gdGhlIHJp
Z2h0IG9mIHBvaW50Il0KICAgICBbIk1vdmUgY29sdW1uIGxlZnQiICAgICAgICAgbWFya2Rvd24t
dHMtdGFibGUtbW92ZS1jb2x1bW4tbGVmdCAgICAgOmhlbHAgIk1vdmUgdGhlIGN1cnJlbnQgY29s
dW1uIHRvIGl0cyBsZWZ0Il0KICAgICBbIk1vdmUgY29sdW1uIHJpZ2h0IiAgICAgICAgbWFya2Rv
d24tdHMtdGFibGUtbW92ZS1jb2x1bW4tcmlnaHQgICAgOmhlbHAgIk1vdmUgdGhlIGN1cnJlbnQg
Y29sdW1uIHRvIGl0cyByaWdodCJdCiAgICAgWyJBbGlnbiBjb2x1bW4uLi4iICAgICAgICAgIG1h
cmtkb3duLXRzLXRhYmxlLWFsaWduLWNvbHVtbiAgICAgICAgIDpoZWxwICJBbGlnbiBjb2x1bW4g
YXQgcG9pbnQgdG8gdGhlIGxlZnQsIGNlbnRlciwgb3IgcmlnaHQiXQogICAgIFsiRGVsZXRlIGNv
bHVtbiIgICAgICAgICAgICBtYXJrZG93bi10cy10YWJsZS1kZWxldGUtY29sdW1uICAgICAgICA6
aGVscCAiRGVsZXRlIHRoZSBjb2x1bW4gYXQgcG9pbnQiXQogICAgICItLSIKICAgICBbIkFsaWdu
IHRhYmxlIGNvbHVtbnMiICAgICAgbWFya2Rvd24tdHMtdGFibGUtYWxpZ24tdGFibGUgICAgICAg
ICAgOmhlbHAgIkFsaWduIHRoZSB0YWJsZSBhdCBwb2ludCBpbiBhbiBlYXN5LXRvLWVkaXQgZm9y
bWF0Il0KICAgICBbIlRyYW5zcG9zZSB0YWJsZSIgICAgICAgICAgbWFya2Rvd24tdHMtdGFibGUt
dHJhbnNwb3NlLXRhYmxlICAgICAgOmhlbHAgIlRyYW5zcG9zZSB0aGUgdGFibGUgYXQgcG9pbnQg
c3dhcHBpbmcgaXRzIHJvd3MgYW5kIGNvbHVtbnMiXQogICAgICItLSIKICAgICBbIkNvbnZlcnQg
Q1NWIHRvIHRhYmxlIiAgICAgbWFya2Rvd24tdHMtdGFibGUtY29udmVydC1jc3YtcmVnaW9uICAg
OmhlbHAgIkNvbnZlcnQgYSByYW5nZSBvZiBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzIHRvIGEgbmV3
IHRhYmxlIGF0IHBvaW50Il0KICAgICBbIkNvbnZlcnQgVFNWIHRvIHRhYmxlIiAgICAgbWFya2Rv
d24tdHMtdGFibGUtY29udmVydC10c3YtcmVnaW9uICAgOmhlbHAgIkNvbnZlcnQgYSByYW5nZSBv
ZiB0YWItc2VwYXJhdGVkIHZhbHVlcyB0byBhIG5ldyB0YWJsZSBhdCBwb2ludCJdCiAgICAgWyJF
eHBvcnQgdGFibGUgdG8gQ1NWIiAgICAgIG1hcmtkb3duLXRzLXRhYmxlLWV4cG9ydC10YWJsZS1j
c3YgICAgIDpoZWxwICJFeHBvcnQgdGhlIHRhYmxlIGF0IHBvaW50IHRvIGEgY29tbWEtc2VwYXJh
dGVkIHZhbHVlcyBidWZmZXIiXQogICAgIFsiRXhwb3J0IHRhYmxlIHRvIFRTViIgICAgICBtYXJr
ZG93bi10cy10YWJsZS1leHBvcnQtdGFibGUtdHN2ICAgICA6aGVscCAiRXhwb3J0IHRoZSB0YWJs
ZSBhdCBwb2ludCB0byBhIHRhYi1zZXBhcmF0ZWQgdmFsdWVzIGJ1ZmZlciJdKSkpCgooZGVmdW4g
bWFya2Rvd24tdHMtLXNldC11cCAoKQogICJTZXQgdXAgdGhlIGJ1ZmZlciBmb3IgYG1hcmtkb3du
LXRzLW1vZGUnLgpJZiBgbWFya2Rvd24tdHMtLXNldC11cC1pbmxpbmUnIGlzIG5vbi1uaWwsIHVz
ZSBhIGxpZ2h0d2VpZ2h0IHNldCB1cCBmb3IKZW1iZWRkZWQgaW5saW5lIGBtYXJrZG93bi10cy1t
b2RlJyBidWZmZXJzLgoKTk9URTogQ2FsbCB0aGlzIGZ1bmN0aW9uIG9ubHkgd2hlbiB0aGUgdHJl
ZXNpdCBgbWFya2Rvd24nIGFuZApgbWFya2Rvd24taW5saW5lJyBwYXJzZXJzIGFyZSBhdmFpbGFi
bGUuIgoKICA7OyBTZXQgdGhlc2UgdXAgZm9yIGJvdGggbWFzdGVyIGFuZCBpbmxpbmUgZm9yIGNv
ZGUtYmxvY2sgYnVmZmVycy4KICAoc2V0cS1sb2NhbCBjb21tZW50LXN0YXJ0ICI8IS0tICIKICAg
ICAgICAgICAgICBjb21tZW50LWVuZCAiIC0tPiIKICAgICAgICAgICAgICBjb21tZW50LXN0YXJ0
LXNraXAgIjwhLS1bIFx0XSoiCiAgICAgICAgICAgICAgY29tbWVudC1lbmQtc2tpcCAiWyBcdF0q
LS0+IgogICAgICAgICAgICAgIGNvbW1lbnQtdXNlLXN5bnRheCBuaWwpCgogIChzZXRxLWxvY2Fs
IGZpbGwtcGFyYWdyYXBoLWZ1bmN0aW9uCiAgICAgICAgICAgICAgIydtYXJrZG93bi10cy0tZmls
bC1wYXJhZ3JhcGgKICAgICAgICAgICAgICBmaWxsLWZvcndhcmQtcGFyYWdyYXBoLWZ1bmN0aW9u
CiAgICAgICAgICAgICAgIydtYXJrZG93bi10cy0tZmlsbC1mb3J3YXJkLXBhcmFncmFwaCkKCiAg
OzsgYGFkYXB0aXZlLWZpbGwtZnVuY3Rpb24nIHRha2VzIHByZWNlZGVuY2Ugb3ZlcgogIDs7IGBh
ZGFwdGl2ZS1maWxsLXJlZ2V4cCc7IHRoZSBkZWZhdWx0IHJlZ2V4cCBpcyBmaW5lIGFzIGEKICA7
OyBmYWxsYmFjayBmb3IgcGxhaW4gKG5vbi1saXN0KSBwYXJhZ3JhcGhzLgogIChzZXRxLWxvY2Fs
IGFkYXB0aXZlLWZpbGwtZnVuY3Rpb24gIydtYXJrZG93bi10cy0tYWRhcHRpdmUtZmlsbCkKCiAg
OzsgQ3JlYXRlIGFuZCBjb25maWd1cmUgdGhlIHBhcnNlcnMuCiAgKHNldHEgdHJlZXNpdC1wcmlt
YXJ5LXBhcnNlcgogICAgICAgICh0cmVlc2l0LXBhcnNlci1jcmVhdGUgJ21hcmtkb3duKSkKCiAg
KHNldHEtbG9jYWwgZm9udC1sb2NrLWRlZmF1bHRzIG5pbCkKICAoc2V0cS1sb2NhbCB0cmVlc2l0
LWZvbnQtbG9jay1zZXR0aW5ncyBtYXJrZG93bi10cy0tdHJlZXNpdC1zZXR0aW5ncykKICAoc2V0
cS1sb2NhbCB0cmVlc2l0LWZvbnQtbG9jay1mZWF0dXJlLWxpc3QgJygoZGVsaW1pdGVyIGhlYWRp
bmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFn
cmFwaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFy
YWdyYXBoLWlubGluZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAoaW1hZ2UtcHJldmlldyBlcnJvcikpKQoKICAoY29uZCAobWFya2Rvd24tdHMtLXNldC11
cC1pbmxpbmUKICAgICAgICAgKHRyZWVzaXQtcGFyc2VyLWNyZWF0ZSAnbWFya2Rvd24taW5saW5l
KQogICAgICAgICAoc2V0cS1sb2NhbCB0cmVlc2l0LXJhbmdlLXNldHRpbmdzCiAgICAgICAgICAg
ICAgICAgICAgICh0cmVlc2l0LXJhbmdlLXJ1bGVzCiAgICAgICAgICAgICAgICAgICAgICA6ZW1i
ZWQgJ21hcmtkb3duLWlubGluZQogICAgICAgICAgICAgICAgICAgICAgOmhvc3QgJ21hcmtkb3du
CiAgICAgICAgICAgICAgICAgICAgICAnKChpbmxpbmUpIEBtYXJrZG93bi1pbmxpbmUpKSkpCiAg
ICAgICAgKHQKICAgICAgICAgOzsgUmFuZ2Ugc2V0dGluZ3MgZGlmZmVyIGluIHRoZSBtYXN0ZXIg
YnVmZmVyIHZzLiBpbmxpbmUgYWJvdmUuCiAgICAgICAgIChzZXRxLWxvY2FsIHRyZWVzaXQtcmFu
Z2Utc2V0dGluZ3MgKG1hcmtkb3duLXRzLS1yYW5nZS1zZXR0aW5ncykpCgogICAgICAgICA7OyBD
b25maWd1cmUgZmVhdHVyZXMgbmVlZGVkIG9ubHkgaW4gdGhlIG1hc3RlciBidWZmZXIuCgogICAg
ICAgICA7OyBJbWVudSBzdXBwb3J0LgogICAgICAgICAoc2V0cS1sb2NhbCB0cmVlc2l0LXNpbXBs
ZS1pbWVudS1zZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICBgKCgiSGVhZGluZ3MiICwjJ21h
cmtkb3duLXRzLS1pbWVudS1oZWFkaW5nLW5vZGUtcAogICAgICAgICAgICAgICAgICAgICAgICBu
aWwgLCMnbWFya2Rvd24tdHMtLWltZW51LWhlYWRpbmctbmFtZS1mdW5jdGlvbikKICAgICAgICAg
ICAgICAgICAgICAgICAoIkNvZGUgQmxvY2tzIiAsIydtYXJrZG93bi10cy0taW1lbnUtY29kZS1i
bG9jay1ub2RlLXAKICAgICAgICAgICAgICAgICAgICAgICAgbmlsICwjJ21hcmtkb3duLXRzLS1p
bWVudS1jb2RlLWJsb2NrLW5hbWUtZnVuY3Rpb24pKSkKCiAgICAgICAgIDs7IE91dGxpbmUgc3Vw
cG9ydC4KICAgICAgICAgKHNldHEtbG9jYWwgdHJlZXNpdC1vdXRsaW5lLXByZWRpY2F0ZSAjJ21h
cmtkb3duLXRzLS1vdXRsaW5lLXByZWRpY2F0ZSkKICAgICAgICAgKHNldHEtbG9jYWwgb3V0bGlu
ZS1taW5vci1tb2RlLWN5Y2xlIHQpCiAgICAgICAgIChvdXRsaW5lLW1pbm9yLW1vZGUgMSkKICAg
ICAgICAgKG1hcmtkb3duLXRzLS1hcHBseS1lbGxpcHNpcykKCiAgICAgICAgIDs7IE5PVEU6IGBv
dXRsaW5lLXZpZXctY2hhbmdlLWhvb2snIHdhcyBvYnNvbGV0ZWQgaW4gMjkuMSAoY29tbWl0CiAg
ICAgICAgIDs7IDUzYjFlNmY5NmNiKSBvbiB0aGUgZ3JvdW5kcyB0aGF0IG9ubHkgbGF6eS1sb2Nr
IHVzZWQgaXQsIGJ1dCBubwogICAgICAgICA7OyByZXBsYWNlbWVudCB3YXMgcHJvdmlkZWQgYW5k
IG91dGxpbmUuZWwgaXRzZWxmIHN0aWxsIHJ1bnMgdGhlIGhvb2sKICAgICAgICAgOzsgaW4gMTAr
IHBsYWNlcy4KICAgICAgICAgKHdpdGgtc3VwcHJlc3NlZC13YXJuaW5ncyAoKG9ic29sZXRlIG91
dGxpbmUtdmlldy1jaGFuZ2UtaG9vaykpCiAgICAgICAgICAgKGFkZC1ob29rICdvdXRsaW5lLXZp
ZXctY2hhbmdlLWhvb2sKICAgICAgICAgICAgICAgICAgICAgIydtYXJrZG93bi10cy0tb3V0bGlu
ZS12aWV3LWNoYW5nZSBuaWwgdCkpCgogICAgICAgICAocHJvZ24KICAgICAgICAgICAobWFrZS1s
b2NhbC12YXJpYWJsZSAnZm9udC1sb2NrLWV4dHJhLW1hbmFnZWQtcHJvcHMpCiAgICAgICAgICAg
KGRvbGlzdCAocHJvcCAnKGludmlzaWJsZSBkaXNwbGF5IGJ1dHRvbiBjYXRlZ29yeSBhY3Rpb24g
aGVscC1lY2hvKSkKICAgICAgICAgICAgIChhZGQtdG8tbGlzdCAnZm9udC1sb2NrLWV4dHJhLW1h
bmFnZWQtcHJvcHMgcHJvcCkpKQoKICAgICAgICAgKHdoZW4gKHRyZWVzaXQtcmVhZHktcCAnaHRt
bCB0KQogICAgICAgICAgICh0cmVlc2l0LXBhcnNlci1jcmVhdGUgJ2h0bWwpCiAgICAgICAgICAg
KHJlcXVpcmUgJ2h0bWwtdHMtbW9kZSkKICAgICAgICAgICAoZGVmdmFyIGh0bWwtdHMtbW9kZS0t
Zm9udC1sb2NrLXNldHRpbmdzKQogICAgICAgICAgIChkZWZ2YXIgaHRtbC10cy1tb2RlLS10cmVl
c2l0LWZvbnQtbG9jay1mZWF0dXJlLWxpc3QpCiAgICAgICAgICAgKHNldHEtbG9jYWwgdHJlZXNp
dC1mb250LWxvY2stc2V0dGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAoYXBwZW5kIHRyZWVz
aXQtZm9udC1sb2NrLXNldHRpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1s
LXRzLW1vZGUtLWZvbnQtbG9jay1zZXR0aW5ncykpCiAgICAgICAgICAgKHNldHEtbG9jYWwgdHJl
ZXNpdC1mb250LWxvY2stZmVhdHVyZS1saXN0CiAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVz
aXQtbWVyZ2UtZm9udC1sb2NrLWZlYXR1cmUtbGlzdAogICAgICAgICAgICAgICAgICAgICAgICB0
cmVlc2l0LWZvbnQtbG9jay1mZWF0dXJlLWxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgaHRt
bC10cy1tb2RlLS10cmVlc2l0LWZvbnQtbG9jay1mZWF0dXJlLWxpc3QpKQogICAgICAgICAgIChz
ZXRxLWxvY2FsIHRyZWVzaXQtcmFuZ2Utc2V0dGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAo
YXBwZW5kIHRyZWVzaXQtcmFuZ2Utc2V0dGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICh0cmVlc2l0LXJhbmdlLXJ1bGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
OmVtYmVkICdodG1sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmhvc3QgJ21hcmtk
b3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmxvY2FsIHQKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAnKChodG1sX2Jsb2NrKSBAaHRtbCkKCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgOmVtYmVkICdodG1sCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgOmhvc3QgJ21hcmtkb3duLWlubGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICcoKGh0bWxfdGFnKSBAaHRtbCkpKSkpCgogICAgICAgICAod2hlbiAodHJlZXNpdC1yZWFk
eS1wICd5YW1sIHQpCiAgICAgICAgICAgKHJlcXVpcmUgJ3lhbWwtdHMtbW9kZSkKICAgICAgICAg
ICAoZGVmdmFyIHlhbWwtdHMtbW9kZS0tZm9udC1sb2NrLXNldHRpbmdzKQogICAgICAgICAgIChk
ZWZ2YXIgeWFtbC10cy1tb2RlLS1mb250LWxvY2stZmVhdHVyZS1saXN0KQogICAgICAgICAgIChz
ZXRxLWxvY2FsIHRyZWVzaXQtZm9udC1sb2NrLXNldHRpbmdzCiAgICAgICAgICAgICAgICAgICAg
ICAgKGFwcGVuZCB0cmVlc2l0LWZvbnQtbG9jay1zZXR0aW5ncwogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgeWFtbC10cy1tb2RlLS1mb250LWxvY2stc2V0dGluZ3MpKQogICAgICAgICAg
IChzZXRxLWxvY2FsIHRyZWVzaXQtZm9udC1sb2NrLWZlYXR1cmUtbGlzdAogICAgICAgICAgICAg
ICAgICAgICAgICh0cmVlc2l0LW1lcmdlLWZvbnQtbG9jay1mZWF0dXJlLWxpc3QKICAgICAgICAg
ICAgICAgICAgICAgICAgdHJlZXNpdC1mb250LWxvY2stZmVhdHVyZS1saXN0CiAgICAgICAgICAg
ICAgICAgICAgICAgIHlhbWwtdHMtbW9kZS0tZm9udC1sb2NrLWZlYXR1cmUtbGlzdCkpCiAgICAg
ICAgICAgKHNldHEtbG9jYWwgdHJlZXNpdC1yYW5nZS1zZXR0aW5ncwogICAgICAgICAgICAgICAg
ICAgICAgIChhcHBlbmQgdHJlZXNpdC1yYW5nZS1zZXR0aW5ncwogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKHRyZWVzaXQtcmFuZ2UtcnVsZXMKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA6ZW1iZWQgJ3lhbWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aG9z
dCAnbWFya2Rvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bG9jYWwgdAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoKG1pbnVzX21ldGFkYXRhKSBAeWFtbCkpKSkp
CgogICAgICAgICAod2hlbiAodHJlZXNpdC1yZWFkeS1wICd0b21sIHQpCiAgICAgICAgICAgKHJl
cXVpcmUgJ3RvbWwtdHMtbW9kZSkKICAgICAgICAgICAoZGVmdmFyIHRvbWwtdHMtbW9kZS0tZm9u
dC1sb2NrLXNldHRpbmdzKQogICAgICAgICAgIChkZWZ2YXIgdG9tbC10cy1tb2RlLS1mb250LWxv
Y2stZmVhdHVyZS1saXN0KQogICAgICAgICAgIChzZXRxIHRyZWVzaXQtZm9udC1sb2NrLXNldHRp
bmdzCiAgICAgICAgICAgICAgICAgKGFwcGVuZCB0cmVlc2l0LWZvbnQtbG9jay1zZXR0aW5ncwog
ICAgICAgICAgICAgICAgICAgICAgICAgdG9tbC10cy1tb2RlLS1mb250LWxvY2stc2V0dGluZ3Mp
KQogICAgICAgICAgIChzZXRxLWxvY2FsIHRyZWVzaXQtZm9udC1sb2NrLWZlYXR1cmUtbGlzdAog
ICAgICAgICAgICAgICAgICAgICAgICh0cmVlc2l0LW1lcmdlLWZvbnQtbG9jay1mZWF0dXJlLWxp
c3QKICAgICAgICAgICAgICAgICAgICAgICAgdHJlZXNpdC1mb250LWxvY2stZmVhdHVyZS1saXN0
CiAgICAgICAgICAgICAgICAgICAgICAgIHRvbWwtdHMtbW9kZS0tZm9udC1sb2NrLWZlYXR1cmUt
bGlzdCkpCiAgICAgICAgICAgKHNldHEtbG9jYWwgdHJlZXNpdC1yYW5nZS1zZXR0aW5ncwogICAg
ICAgICAgICAgICAgICAgICAgIChhcHBlbmQgdHJlZXNpdC1yYW5nZS1zZXR0aW5ncwogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHRyZWVzaXQtcmFuZ2UtcnVsZXMKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA6ZW1iZWQgJ3RvbWwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA6aG9zdCAnbWFya2Rvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6
bG9jYWwgdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoKHBsdXNfbWV0YWRhdGEp
IEB0b21sKSkpKSkKCiAgICAgICAgIDs7IFN1cHBvcnQgZm9yIGV4ZWN1dGluZyBjb21tYW5kcyBp
biBhIGNvZGUtYmxvY2sgY29udGV4dC4KICAgICAgICAgKHdoZW4gbWFya2Rvd24tdHMtZW5hYmxl
LWNvZGUtYmxvY2stY29udGV4dC1tb2RlCiAgICAgICAgICAgKG1hcmtkb3duLXRzLWNvZGUtYmxv
Y2stY29udGV4dC1tb2RlKSkKCiAgICAgICAgIDs7IFN1cHBvcnQgZm9yIHRhYmxlIG1vZGUuCiAg
ICAgICAgICh3aGVuIG1hcmtkb3duLXRzLWVuYWJsZS10YWJsZS1tb2RlCiAgICAgICAgICAgKG1h
cmtkb3duLXRzLXRhYmxlLW1vZGUpKSkpCgogICh0cmVlc2l0LW1ham9yLW1vZGUtc2V0dXApCgog
IDs7IERvIG5vdCBlbmFibGUgYGppdC1sb2NrLW1vZGUnIGluIGluZGlyZWN0IGJ1ZmZlcnMgc3Vj
aCBhcyB0aGUgb25lCiAgOzsgd2UgdXNlIGZvciBjb2RlIGJsb2NrIGNvbW1hbmRzLgogICh1bmxl
c3MgKGJ1ZmZlci1iYXNlLWJ1ZmZlcikKICAgIChqaXQtbG9jay1yZWdpc3RlciAjJ21hcmtkb3du
LXRzLS1mb250aWZ5LWJhcmUtdXJpKSkKCiAgKHVubGVzcyBtYXJrZG93bi10cy0tc2V0LXVwLWlu
bGluZQogICAgOzsgT3JkZXIgbWF0dGVyczogYG1hcmtkb3duLXRzLS1zZXQtaGlkZS1tYXJrdXAn
IGNhbGxzIGBmb250LWxvY2stZmx1c2gnCiAgICA7OyAob25seSBtZWFuaW5nZnVsIG9uY2UgYHRy
ZWVzaXQtbWFqb3ItbW9kZS1zZXR1cCcgaGFzIHdpcmVkIHVwCiAgICA7OyBmb250LWxvY2spLCBh
bmQgYG1hcmtkb3duLXRzLWRlZmF1bHQtZm9sZGluZycgY2FsbHMgb3V0bGluZQogICAgOzsgY29t
bWFuZHMgdGhhdCByZWx5IG9uIGBvdXRsaW5lLXNlYXJjaC1mdW5jdGlvbicsIHdoaWNoCiAgICA7
OyBgdHJlZXNpdC1tYWpvci1tb2RlLXNldHVwJyBpbnN0YWxscyBmcm9tIGB0cmVlc2l0LW91dGxp
bmUtcHJlZGljYXRlJy4KICAgIChtYXJrZG93bi10cy0tc2V0LWhpZGUtbWFya3VwIG1hcmtkb3du
LXRzLWhpZGUtbWFya3VwKQogICAgOzsgUmVzcGVjdCB0aGUgdXNlcidzIGRlZmF1bHQgb3V0bGlu
ZSBmb2xkaW5nLgogICAgKHBjYXNlIG1hcmtkb3duLXRzLWRlZmF1bHQtZm9sZGluZwogICAgICAo
J3Nob3ctYWxsIChpZ25vcmUpKQogICAgICAoJ2ZvbGQtYWxsIChvdXRsaW5lLWhpZGUtc3VibGV2
ZWxzIDEpKQogICAgICAoJ2ZvbGQtaGVhZGluZ3MgKG91dGxpbmUtc2hvdy1hbGwpCiAgICAgICAg
ICAgICAgICAgICAgICAob3V0bGluZS1oaWRlLXJlZ2lvbi1ib2R5IChwb2ludC1taW4pIChwb2lu
dC1tYXgpKSkpKSkKCihkZWZ1biBtYXJrZG93bi10cy1tb2RlLWluc3RhbGwtcGFyc2VycyAoYXJn
KQogICJJbnN0YWxsIGBtYXJrZG93bi10cy1tb2RlJyB0cmVlLXNpdHRlciBsYW5ndWFnZSBwYXJz
ZXJzLgpJZiBuZWVkZWQsIGluc3RhbGwgdGhlIHJlcXVpcmVkIHBhcnNlcnMgZm9yIGBtYXJrZG93
bicgYW5kIGBtYXJrZG93bi1pbmxpbmUnLgpXaXRoIGEgcHJlZml4IGFyZ3VtZW50LCBBUkcsIGlm
IG5lZWRlZCwgaW5zdGFsbCBwYXJzZXJzIGZvciBgaHRtbCcsCmB5YW1sJywgYW5kIGB0b21sJy4i
CiAgKGludGVyYWN0aXZlICJQIikKICAodW5sZXNzICh0cmVlc2l0LWxhbmd1YWdlLWF2YWlsYWJs
ZS1wICdtYXJrZG93bikKICAgICh0cmVlc2l0LWluc3RhbGwtbGFuZ3VhZ2UtZ3JhbW1hciAnbWFy
a2Rvd24pKQogICh1bmxlc3MgKHRyZWVzaXQtbGFuZ3VhZ2UtYXZhaWxhYmxlLXAgJ21hcmtkb3du
LWlubGluZSkKICAgICh0cmVlc2l0LWluc3RhbGwtbGFuZ3VhZ2UtZ3JhbW1hciAnbWFya2Rvd24t
aW5saW5lKSkKICAod2hlbiBhcmcKICAgICh1bmxlc3MgKHRyZWVzaXQtbGFuZ3VhZ2UtYXZhaWxh
YmxlLXAgJ2h0bWwpCiAgICAgIChyZXF1aXJlICdodG1sLXRzLW1vZGUpCiAgICAgICh0cmVlc2l0
LWluc3RhbGwtbGFuZ3VhZ2UtZ3JhbW1hciAnaHRtbCkpCiAgICAodW5sZXNzICh0cmVlc2l0LWxh
bmd1YWdlLWF2YWlsYWJsZS1wICd5YW1sKQogICAgICAocmVxdWlyZSAneWFtbC10cy1tb2RlKQog
ICAgICAodHJlZXNpdC1pbnN0YWxsLWxhbmd1YWdlLWdyYW1tYXIgJ3lhbWwpKQogICAgKHVubGVz
cyAodHJlZXNpdC1sYW5ndWFnZS1hdmFpbGFibGUtcCAndG9tbCkKICAgICAgKHJlcXVpcmUgJ3Rv
bWwtdHMtbW9kZSkKICAgICAgKHRyZWVzaXQtaW5zdGFsbC1sYW5ndWFnZS1ncmFtbWFyICd0b21s
KSkpKQoKKGRlZnVuIG1hcmtkb3duLXRzLW1vZGUtLWluaXRpYWxpemUgKCkKICAiSW52b2tlIHRo
aXMgZnJvbSBtYWpvciBtb2RlIGRlZmluaXRpb25zIGFmdGVyIGxvY2FsIHZhcmlhYmxlIHNldCB1
cC4iCiAgKHRyZWVzaXQtZW5zdXJlLWluc3RhbGxlZCAnbWFya2Rvd24pCiAgKHRyZWVzaXQtZW5z
dXJlLWluc3RhbGxlZCAnbWFya2Rvd24taW5saW5lKQogIDs7IEJ5cGFzcyBgdHJlZXNpdC1tYXgt
YnVmZmVyLXNpemUnIHNvIHRoZSBtb2RlIGFjdGl2YXRlcyBpbiBsYXJnZQogIDs7IGJ1ZmZlcnMg
aW5zdGVhZCBvZiByZWZ1c2luZy4gIGB0cmVlc2l0LXJlYWR5LXAnIHdvdWxkIG90aGVyd2lzZQog
IDs7IHJlZnVzZSBhbmQgZW1pdCBhIG1pc2xlYWRpbmcgInBhcnNlcnMgbm90IGZvdW5kIiBtZXNz
YWdlIGV2ZW4gd2hlbgogIDs7IHRoZXkgYXJlIGluc3RhbGxlZC4gIFJldmlzaXQgaWYgYHRyZWVz
aXQtcGFyc2VyLWNyZWF0ZScgZ2FpbnMgaXRzCiAgOzsgb3duIGJ1ZmZlci1zaXplIGd1YXJkIChz
ZWUgYnVnIzgwOTA5KS4KICAobGV0ICgodHJlZXNpdC1tYXgtYnVmZmVyLXNpemUgbW9zdC1wb3Np
dGl2ZS1maXhudW0pKQogICAgKGNvbmQgKCh0cmVlc2l0LXJlYWR5LXAgJyhtYXJrZG93biBtYXJr
ZG93bi1pbmxpbmUpIHQpCiAgICAgICAgICAgKG1hcmtkb3duLXRzLS1zZXQtdXApKQogICAgICAg
ICAgKHQKICAgICAgICAgICAod2FybiAibWFya2Rvd24tdHMtbW9kZSBjYW5ub3QgYmUgc2V0IHVw
OyB1c2luZyBmdW5kYW1lbnRhbC1tb2RlLgpUaGUgdHJlZS1zaXR0ZXIgcGFyc2VycyBgbWFya2Rv
d24nIGFuZCBgbWFya2Rvd24taW5saW5lJyB3ZXJlIG5vdCBmb3VuZC4KVXNlIHRoZSBjb21tYW5k
IGBtYXJrZG93bi10cy1tb2RlLWluc3RhbGwtcGFyc2VycycgdG8gaW5zdGFsbCB0aGVtLgpXaXRo
IGEgcHJlZml4IGFyZ3VtZW50LCBpdCBjYW4gYWxzbyBpbnN0YWxsIG9wdGlvbmFsIHBhcnNlcnMu
IikKICAgICAgICAgICAoZnVuZGFtZW50YWwtbW9kZSkpKSkpCgo7OzsjIyNhdXRvbG9hZAooZGVm
aW5lLWRlcml2ZWQtbW9kZSBtYXJrZG93bi10cy1tb2RlIHRleHQtbW9kZSAiTWFya2Rvd24iCiAg
Ik1ham9yIG1vZGUgZm9yIGVkaXRpbmcgTWFya2Rvd24gdXNpbmcgdHJlZS1zaXR0ZXIgZ3JhbW1h
ci4KTk9URTogU2VlIGBtYXJrZG93bi10cy0tc2V0LXVwLWlubGluZScuIgogIChtYXJrZG93bi10
cy1tb2RlLS1pbml0aWFsaXplKSkKCihkZXJpdmVkLW1vZGUtYWRkLXBhcmVudHMgJ21hcmtkb3du
LXRzLW1vZGUgJyhtYXJrZG93bi1tb2RlKSkKCjs7OyBWaWV3IG1vZGU6Cgo7OzsjIyNhdXRvbG9h
ZAooZGVmaW5lLWRlcml2ZWQtbW9kZSBtYXJrZG93bi10cy12aWV3LW1vZGUKICBuaWwgOyBJbnRl
bnRpb25hbGx5IGxlZnQgYmxhbmsuCiAgIk1hcmtkb3duIFZpZXciCiAgIk1ham9yIG1vZGUgZm9y
IHJlYWQtb25seSB2aWV3aW5nIE1hcmtkb3duIHVzaW5nIHRyZWUtc2l0dGVyIGdyYW1tYXIuIgog
IDs7IE5PVEU6IGBtYXJrZG93bi10cy1tb2RlJyBpcyBtYW51YWxseSBhZGRlZCBhcyBhIHBhcmVu
dCB0byBhdm9pZAogIDs7IGludm9raW5nIGl0cyBpbml0aWFsaXphdGlvbiBiZWZvcmUgd2Ugc2V0
IG92ZXJyaWRlIHZhcmlhYmxlcy4KICAoc2V0cS1sb2NhbCBtYXJrZG93bi10cy1tZW51LWJhci1z
aG93IG5pbCkKICAoc2V0cS1sb2NhbCBtYXJrZG93bi10cy1oaWRlLW1hcmt1cCB0KQogIChzZXRx
LWxvY2FsIG1hcmtkb3duLXRzLWlubGluZS1pbWFnZXMgdCkKICAoc2V0cS1sb2NhbCBtYXJrZG93
bi10cy1oYXJkLWxpbmUtYnJlYWstYmFja3NsYXNoICdoaWRlKQogIChzZXRxLWxvY2FsIG1hcmtk
b3duLXRzLWhhcmQtbGluZS1icmVhay1zcGFjZSAnaGlkZSkKICAoc2V0cS1sb2NhbCBtYXJrZG93
bi10cy1mb250aWZ5LWNvZGUtYmxvY2tzLW5hdGl2ZWx5IHQpCiAgKHNldHEtbG9jYWwgbWFya2Rv
d24tdHMtZW5hYmxlLWNvZGUtYmxvY2stY29udGV4dC1tb2RlIG5pbCkKICAoc2V0cS1sb2NhbCBt
YXJrZG93bi10cy1lbmFibGUtdGFibGUtbW9kZSBuaWwpCiAgKHJ1bi1ob29rcyAnbWFya2Rvd24t
dHMtdmlldy1tb2RlLXByZS1pbml0LWhvb2spCiAgKG1hcmtkb3duLXRzLW1vZGUtLWluaXRpYWxp
emUpCiAgKHNldHEgYnVmZmVyLXJlYWQtb25seSB0KSkKCihkZXJpdmVkLW1vZGUtYWRkLXBhcmVu
dHMgJ21hcmtkb3duLXRzLXZpZXctbW9kZSAnKG1hcmtkb3duLXRzLW1vZGUgc3BlY2lhbC1tb2Rl
KSkKCjs7OyBNb2RlIHV0aWxpdGllczoKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBtYXJrZG93bi10
cy1idWZmZXItc3RyaW5nICgpCiAgIkxpa2UgYGJ1ZmZlci1zdHJpbmcnLCBhbmQgY29udmVydCBv
dmVybGF5IHByb3BlcnRpZXMgdG8gdGV4dCBwcm9wZXJ0aWVzLiIKICAobGV0ICgoc3RyIChidWZm
ZXItc3RyaW5nKSkpCiAgICAoZG9saXN0IChvdiAob3ZlcmxheXMtaW4gKHBvaW50LW1pbikgKHBv
aW50LW1heCkpIHN0cikKICAgICAgKHdoZW4tbGV0KiAoKGZhY2UgKG92ZXJsYXktZ2V0IG92ICdm
YWNlKSkpCiAgICAgICAgKGZvbnQtbG9jay1hcHBlbmQtdGV4dC1wcm9wZXJ0eQogICAgICAgICAo
b3ZlcmxheS1zdGFydCBvdikgKG92ZXJsYXktZW5kIG92KSAnZmFjZSBmYWNlIHN0cikpKSkpCgoo
ZGVmdW4gbWFya2Rvd24tdHMtLWJhcmYtaWYtbm90LW1vZGUgKCZvcHRpb25hbCBjb250ZXh0KQog
ICJTaWduYWwgYW4gZXJyb3IgaWYgdGhlIGN1cnJlbnQgYnVmZmVyIGlzIG5vdCBhIGBtYXJrZG93
bi10cy1tb2RlJyBidWZmZXIuClByZWZpeCB0aGUgZXJyb3IgbWVzc2FnZSB3aXRoIENPTlRFWFQu
IgogICh1bmxlc3MgKGRlcml2ZWQtbW9kZS1wICdtYXJrZG93bi10cy1tb2RlKQogICAgKHVzZXIt
ZXJyb3IgIiVzaXMgdmFsaWQgb25seSBpbiBgbWFya2Rvd24tdHMtbW9kZScgYnVmZmVycyIKICAg
ICAgICAgICAgICAgIChpZiBjb250ZXh0IChmb3JtYXQgIiVzOiAiIGNvbnRleHQpICIiKSkpKQoK
KGRlZnVuIG1hcmtkb3duLXRzLWFkZC1maW5hbC1uZXdsaW5lICgpCiAgIkFkZCBhIGZpbmFsIG5l
d2xpbmUgdG8gdGhlIGN1cnJlbnQgYnVmZmVyLCBpZiBuZWNlc3NhcnkuIgogIDs7IEluc3BpcmVk
IGJ5IGZpbGVzLmVsLgogIChsZXQgKChpbmhpYml0LXJlYWQtb25seSB0KSkKICAgICh3aGVuIChv
ciAoZXEgKGJ1ZmZlci1zaXplKSAwKQogICAgICAgICAgICAgIChhbmQgKC89IChjaGFyLWFmdGVy
ICgxLSAocG9pbnQtbWF4KSkpID9cbikKICAgICAgICAgICAgICAgICAgIChub3QgKGFuZCAoZXEg
c2VsZWN0aXZlLWRpc3BsYXkgdCkKCSAgICAgICAgICAgICAgICAgICAgICg9IChjaGFyLWFmdGVy
ICgxLSAocG9pbnQtbWF4KSkpID9ccikpKSkpCiAgICAgIChzYXZlLWV4Y3Vyc2lvbgoJKGdvdG8t
Y2hhciAocG9pbnQtbWF4KSkKCShpbnNlcnQgP1xuKSkpKSkKCihkZWZpbmUtbWlub3ItbW9kZSBt
YXJrZG93bi10cy1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZQogICJNaW5vciBtb2RlIGVuYWJs
ZWQgaWYgcG9pbnQgaXMgd2l0aGluIGEgZmVuY2VkIGNvZGUgYmxvY2suClRoaXMgZW5hYmxlcyB0
aGUga2V5bWFwIGBtYXJrZG93bi10cy1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZS1tYXAnLiIK
ICA6Z3JvdXAgJ21hcmtkb3duLXRzCiAgOmxpZ2h0ZXIgbWFya2Rvd24tdHMtY29kZS1ibG9jay1p
bi1jb250ZXh0LW1vZGUtbGlnaHRlcgogIDppbnRlcmFjdGl2ZSBuaWwKICAobWFya2Rvd24tdHMt
LWNvZGUtYmxvY2staW4tY29udGV4dC1tb2RlLXVwZGF0ZS1vdikpCgooZGVmdmFyLWxvY2FsIG1h
cmtkb3duLXRzLS1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZS1vdiBuaWwpCgooZGVmdW4gbWFy
a2Rvd24tdHMtLWNvZGUtYmxvY2staW4tY29udGV4dC1tb2RlLXVwZGF0ZS1vdiAoKQogICJNYW5h
Z2UgYG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZS1vdicuIgogIChjb25k
IChtYXJrZG93bi10cy1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9kZQogICAgICAgICAobGV0ICgo
YmVnIChnZXQtY2hhci1wcm9wZXJ0eSAocG9pbnQpICdtYXJrZG93bi10cy1jb2RlLWJlZy1tYXJr
ZXIpKQogICAgICAgICAgICAgICAoZW5kIChnZXQtY2hhci1wcm9wZXJ0eSAocG9pbnQpICdtYXJr
ZG93bi10cy1jb2RlLWVuZC1tYXJrZXIpKSkKICAgICAgICAgICAoaWYgbWFya2Rvd24tdHMtLWNv
ZGUtYmxvY2staW4tY29udGV4dC1tb2RlLW92CiAgICAgICAgICAgICAgIChtb3ZlLW92ZXJsYXkg
bWFya2Rvd24tdHMtLWNvZGUtYmxvY2staW4tY29udGV4dC1tb2RlLW92IGJlZyBlbmQpCiAgICAg
ICAgICAgICAoc2V0cSBtYXJrZG93bi10cy0tY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUtb3YK
ICAgICAgICAgICAgICAgICAgIChtYWtlLW92ZXJsYXkgYmVnIGVuZCBuaWwgdCBuaWwpKSkKICAg
ICAgICAgICAob3ZlcmxheS1wdXQgbWFya2Rvd24tdHMtLWNvZGUtYmxvY2staW4tY29udGV4dC1t
b2RlLW92CiAgICAgICAgICAgICAgICAgICAgICAgICdtYXJrZG93bi10cy1pbi1jb2RlLWJsb2Nr
IHQpCiAgICAgICAgICAgKG92ZXJsYXktcHV0IG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLWluLWNv
bnRleHQtbW9kZS1vdgogICAgICAgICAgICAgICAgICAgICAgICAnZXZhcG9yYXRlIHQpCiAgICAg
ICAgICAgKG92ZXJsYXktcHV0IG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9k
ZS1vdgogICAgICAgICAgICAgICAgICAgICAgICAncHJpb3JpdHkgJyhuaWwgLiAyMCkpCiAgICAg
ICAgICAgKG92ZXJsYXktcHV0IG1hcmtkb3duLXRzLS1jb2RlLWJsb2NrLWluLWNvbnRleHQtbW9k
ZS1vdgogICAgICAgICAgICAgICAgICAgICAgICAnZmFjZSAnbWFya2Rvd24tdHMtaW4tY29kZS1i
bG9jaykpKQogICAgICAgICh0CiAgICAgICAgICh3aGVuIG1hcmtkb3duLXRzLS1jb2RlLWJsb2Nr
LWluLWNvbnRleHQtbW9kZS1vdgogICAgICAgICAgIChkZWxldGUtb3ZlcmxheSBtYXJrZG93bi10
cy0tY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUtb3YpKSkpKQoKKGRlZmluZS1taW5vci1tb2Rl
IG1hcmtkb3duLXRzLWNvZGUtYmxvY2stY29udGV4dC1tb2RlCiAgIk1pbm9yIG1vZGUgdG8gZW5h
YmxlIGNvbW1hbmRzIGluIGZlbmNlZCBjb2RlIGJsb2NrIGNvbnRleHQuCklmIG5vbi1uaWwgYW5k
IGBwb2ludCcgaXMgaW4gYSBmZW5jZWQgY29kZSBibG9jaywgcnVuIGBpbmRlbnQtZm9yLXRhYi1j
b21tYW5kJywKYG5ld2xpbmUnLCBldC5hbC4sIGluIHRoZSBtb2RlIG9mIHRoZSBjb2RlIGJsb2Nr
LiIKICA6Z3JvdXAgJ21hcmtkb3duLXRzCiAgOmludGVyYWN0aXZlIG5pbAogIChtYXJrZG93bi10
cy0tYmFyZi1pZi1ub3QtbW9kZSAnbWFya2Rvd24tdHMtY29kZS1ibG9jay1jb250ZXh0LW1vZGUp
CiAgKGNvbmQgKG1hcmtkb3duLXRzLWNvZGUtYmxvY2stY29udGV4dC1tb2RlCiAgICAgICAgIDs7
IEVuYWJsZSB0aGUgbWlub3IgbW9kZSBgbWFya2Rvd24tdHMtY29kZS1ibG9jay1pbi1jb250ZXh0
LW1vZGUnIGFuZAogICAgICAgICA7OyBpdHMga2V5bWFwIHdoZW4gcG9pbnQgaXMgd2l0aGluIGEg
Y29kZSBibG9jay4KICAgICAgICAgKGFkZC1ob29rICdwb3N0LWNvbW1hbmQtaG9vawogICAgICAg
ICAgICAgICAgICAgIydtYXJrZG93bi10cy0tZW5hYmxlLWNvZGUtYmxvY2staW4tY29udGV4dC1t
b2RlIG5pbCAnbG9jYWwpCiAgICAgICAgIDs7IElmIGBzYXZlLXBsYWNlLW1vZGUnIG9yIHNpbWls
YXIgaXMgdXNlZCwgcG9pbnQgY291bGQgc3RhcnQgd2l0aGluCiAgICAgICAgIDs7IGEgY29kZSBi
bG9jayBzbyBpbml0aWFsaXplIGZyb20gdGhhdCBzdGF0ZS4KICAgICAgICAgKHJ1bi13aXRoLXRp
bWVyIDAuMDEgbmlsCiAgICAgICAgICAgICAgICAgICAgICAgICAjJ21hcmtkb3duLXRzLS1lbmFi
bGUtY29kZS1ibG9jay1pbi1jb250ZXh0LW1vZGUpCiAgICAgICAgIDs7IEZvciBlYWNoIGVsaWdp
YmxlIGNvbW1hbmQsIGV4ZWN1dGUgaXQgaW4gYSBjb2RlLWJsb2NrIGNvbnRleHQsCiAgICAgICAg
IDs7IG90aGVyd2lzZSBpbiB0aGUgYG1hcmtkb3duLXRzLW1vZGUnIGJ1ZmZlcidzIGNvbnRleHQu
CiAgICAgICAgIChhZGQtaG9vayAncHJlLWNvbW1hbmQtaG9vawogICAgICAgICAgICAgICAgICAg
IydtYXJrZG93bi10cy0tbWF5YmUtcnVuLWNvbW1hbmQtaW4tY29kZS1ibG9jayBuaWwgJ2xvY2Fs
KQogICAgICAgICA7OyBQcnVuZSBzdGFsZSBjb2RlIGJsb2NrIG92ZXJsYXlzIHdoZW4gdGhlIGhv
c3QgcGFyc2UgdHJlZQogICAgICAgICA7OyBjaGFuZ2VzIChlLmcuLCB3aGVuIGZlbmNlZCBjb2Rl
IGJsb2NrIGRlbGltaXRlcnMgYXJlCiAgICAgICAgIDs7IGRlbGV0ZWQgYnV0IHRoZSBvdmVybGF5
IGZyb20gYSBwcmlvciBmb250aWZpY2F0aW9uIHJlbWFpbnMpLgogICAgICAgICAodHJlZXNpdC1w
YXJzZXItYWRkLW5vdGlmaWVyCiAgICAgICAgICB0cmVlc2l0LXByaW1hcnktcGFyc2VyCiAgICAg
ICAgICAjJ21hcmtkb3duLXRzLS1ob3N0LXJhbmdlcy1ub3RpZmllcikpCiAgICAgICAgKHQKICAg
ICAgICAgKHJlbW92ZS1ob29rICdwb3N0LWNvbW1hbmQtaG9vawogICAgICAgICAgICAgICAgICAg
ICAgIydtYXJrZG93bi10cy0tZW5hYmxlLWNvZGUtYmxvY2staW4tY29udGV4dC1tb2RlICdsb2Nh
bCkKICAgICAgICAgKHJlbW92ZS1ob29rICdwcmUtY29tbWFuZC1ob29rCiAgICAgICAgICAgICAg
ICAgICAgICAjJ21hcmtkb3duLXRzLS1tYXliZS1ydW4tY29tbWFuZC1pbi1jb2RlLWJsb2NrICds
b2NhbCkKICAgICAgICAgKHRyZWVzaXQtcGFyc2VyLXJlbW92ZS1ub3RpZmllcgogICAgICAgICAg
dHJlZXNpdC1wcmltYXJ5LXBhcnNlcgogICAgICAgICAgIydtYXJrZG93bi10cy0taG9zdC1yYW5n
ZXMtbm90aWZpZXIpKSkpCgooZGVmaW5lLW1pbm9yLW1vZGUgbWFya2Rvd24tdHMtaW4tdGFibGUt
bW9kZQogICJNaW5vciBtb2RlIGVuYWJsZWQgaWYgcG9pbnQgaXMgd2l0aGluIGEgdGFibGUuClRo
aXMgZW5hYmxlcyB0aGUga2V5bWFwIGBtYXJrZG93bi10cy1pbi10YWJsZS1tb2RlLW1hcCcuIgog
IDpncm91cCAnbWFya2Rvd24tdHMKICA6bGlnaHRlciBtYXJrZG93bi10cy1pbi10YWJsZS1tb2Rl
LWxpZ2h0ZXIKICA6aW50ZXJhY3RpdmUgbmlsCiAgKG1hcmtkb3duLXRzLS1pbi10YWJsZS1tb2Rl
LXVwZGF0ZS1vdikpCgooZGVmdmFyLWxvY2FsIG1hcmtkb3duLXRzLS1pbi10YWJsZS1tb2RlLW92
IG5pbCkKCihkZWZ1biBtYXJrZG93bi10cy0taW4tdGFibGUtbW9kZS1nZXQtb3YgKHBvcykKICAi
UmV0dXJuIHRoZSBgbWFya2Rvd24tdHMtaW4tdGFibGUtbW9kZScgb3ZlcmxheSBhdCBQT1MuIgog
IChzZXEtZmluZCAobGFtYmRhIChvdikKICAgICAgICAgICAgICAod2hlbiAob3ZlcmxheS1nZXQg
b3YgJ21hcmtkb3duLXRzLWluLXRhYmxlKQogICAgICAgICAgICAgICAgb3YpKQogICAgICAgICAg
ICAob3ZlcmxheXMtYXQgcG9zKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLXRhYmxlLXRpY2stdXBk
YXRlIChwb3MpCiAgIlVwZGF0ZSB0aGUgYG1hcmtkb3duLXRzLWluLXRhYmxlLW1vZGUnIG92ZXJs
YXkgdGljayBhdCBQT1MuCklmIHRoZSBvdmVybGF5IGlzIG5vdCBmb3VuZCwgZG8gbm90aGluZy4i
CiAgKHdoZW4tbGV0KiAoKG92IChtYXJrZG93bi10cy0taW4tdGFibGUtbW9kZS1nZXQtb3YgcG9z
KSkpCiAgICAob3ZlcmxheS1wdXQgb3YKICAgICAgICAgICAgICAgICAnbWFya2Rvd24tdHMtaW4t
dGFibGUtdGljawogICAgICAgICAgICAgICAgIChidWZmZXItY2hhcnMtbW9kaWZpZWQtdGljaykp
KSkKCihkZWZ1biBtYXJrZG93bi10cy0tdGFibGUtdGljay1zdGFsZS1wIChwb3MpCiAgIlJldHVy
biBub24tbmlsIGlmIHRoZSB0YWJsZSBhdCBQT1MgbWlnaHQgaGF2ZSBjaGFuZ2VkLgpJdCBpcyB1
cCB0byB0aGlzIGZ1bmN0aW9uJ3MgY2FsbGVycyB0byBjYWxsCmBtYXJrZG93bi10cy0tdGFibGUt
dGljay11cGRhdGUnLiIKICAod2hlbi1sZXQqICgob3YgKG1hcmtkb3duLXRzLS1pbi10YWJsZS1t
b2RlLWdldC1vdiBwb3MpKSkKICAgIChub3QgKGVxIChvdmVybGF5LWdldCBvdiAnbWFya2Rvd24t
dHMtaW4tdGFibGUtdGljaykKICAgICAgICAgICAgIChidWZmZXItY2hhcnMtbW9kaWZpZWQtdGlj
aykpKSkpCgooZGVmdW4gbWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtdXBkYXRlLW92ICgpCiAg
Ik1hbmFnZSBgbWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtb3YnLiIKICAoY29uZCAobWFya2Rv
d24tdHMtaW4tdGFibGUtbW9kZQogICAgICAgICAod2hlbi1sZXQqICgoYXQtdGFibGUgKG1hcmtk
b3duLXRzLWF0LXRhYmxlLXAgbmlsIHQpKQogICAgICAgICAgICAgICAgICAgICAodGFibGUgKGNk
ciBhdC10YWJsZSkpCiAgICAgICAgICAgICAgICAgICAgIChiZWcgKHRyZWVzaXQtbm9kZS1zdGFy
dCB0YWJsZSkpCiAgICAgICAgICAgICAgICAgICAgIChlbmQgKHRyZWVzaXQtbm9kZS1lbmQgdGFi
bGUpKSkKICAgICAgICAgICAoaWYgbWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtb3YKICAgICAg
ICAgICAgICAgOzsgTW92ZSB0aGUgb3ZlcmxheSwgaWYgbmVlZGVkLCBhbmQgcmVzZXQgdGhlIHRp
Y2sgaWYgc28uCiAgICAgICAgICAgICAgICh3aGVuIChub3QgKGVxIChvdmVybGF5LXN0YXJ0IG1h
cmtkb3duLXRzLS1pbi10YWJsZS1tb2RlLW92KQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBiZWcpKQogICAgICAgICAgICAgICAgIChtb3ZlLW92ZXJsYXkgbWFya2Rvd24tdHMtLWluLXRh
YmxlLW1vZGUtb3YgYmVnIGVuZCkKICAgICAgICAgICAgICAgICAob3ZlcmxheS1wdXQgbWFya2Rv
d24tdHMtLWluLXRhYmxlLW1vZGUtb3YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21h
cmtkb3duLXRzLWluLXRhYmxlLXRpY2sgbmlsKSkKICAgICAgICAgICAgIChzZXRxIG1hcmtkb3du
LXRzLS1pbi10YWJsZS1tb2RlLW92CiAgICAgICAgICAgICAgICAgICAobWFrZS1vdmVybGF5IGJl
ZyBlbmQgbmlsIHQgbmlsKSkpCiAgICAgICAgICAgKG92ZXJsYXktcHV0IG1hcmtkb3duLXRzLS1p
bi10YWJsZS1tb2RlLW92CiAgICAgICAgICAgICAgICAgICAgICAgICdtYXJrZG93bi10cy1pbi10
YWJsZSB0KQogICAgICAgICAgIChvdmVybGF5LXB1dCBtYXJrZG93bi10cy0taW4tdGFibGUtbW9k
ZS1vdgogICAgICAgICAgICAgICAgICAgICAgICAnZXZhcG9yYXRlIHQpCiAgICAgICAgICAgKG92
ZXJsYXktcHV0IG1hcmtkb3duLXRzLS1pbi10YWJsZS1tb2RlLW92CiAgICAgICAgICAgICAgICAg
ICAgICAgICdwcmlvcml0eSAnKG5pbCAuIDIwKSkKICAgICAgICAgICAob3ZlcmxheS1wdXQgbWFy
a2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtb3YKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhY2Ug
J21hcmtkb3duLXRzLWluLXRhYmxlKQogICAgICAgICAgICkpCiAgICAgICAgKHQKICAgICAgICAg
KHdoZW4gbWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtb3YKICAgICAgICAgICAoZGVsZXRlLW92
ZXJsYXkgbWFya2Rvd24tdHMtLWluLXRhYmxlLW1vZGUtb3YpKSkpKQoKKGRlZmluZS1taW5vci1t
b2RlIG1hcmtkb3duLXRzLXRhYmxlLW1vZGUKICAiTWlub3IgbW9kZSB0byBlbmFibGUgY29tbWFu
ZHMgaW4gdGFibGVzLgpJZiBub24tbmlsIGFuZCBgcG9pbnQnIGlzIGluIGEgdGFibGUsIGVuYWJs
ZQpgbWFya2Rvd24tdHMtaW4tdGFibGUtbW9kZScuIgogIDpncm91cCAnbWFya2Rvd24tdHMKICA6
aW50ZXJhY3RpdmUgbmlsCiAgKG1hcmtkb3duLXRzLS1iYXJmLWlmLW5vdC1tb2RlICdtYXJrZG93
bi10cy10YWJsZS1tb2RlKQogIChjb25kIChtYXJrZG93bi10cy10YWJsZS1tb2RlCiAgICAgICAg
IDs7IEVuYWJsZSB0aGUgbWlub3IgbW9kZSBgbWFya2Rvd24tdHMtaW4tdGFibGUtbW9kZScgYW5k
CiAgICAgICAgIDs7IGl0cyBrZXltYXAgd2hlbiBwb2ludCBpcyB3aXRoaW4gYSBjb2RlIGJsb2Nr
LgogICAgICAgICAoYWRkLWhvb2sgJ3Bvc3QtY29tbWFuZC1ob29rCiAgICAgICAgICAgICAgICAg
ICAjJ21hcmtkb3duLXRzLS1lbmFibGUtaW4tdGFibGUtbW9kZSBuaWwgJ2xvY2FsKQogICAgICAg
ICA7OyBJZiBgc2F2ZS1wbGFjZS1tb2RlJyBvciBzaW1pbGFyIGlzIHVzZWQsIHBvaW50IGNvdWxk
IHN0YXJ0IHdpdGhpbgogICAgICAgICA7OyBhIHRhYmxlLCBzbyBpbml0aWFsaXplIGZyb20gdGhh
dCBzdGF0ZS4KICAgICAgICAgKHJ1bi13aXRoLXRpbWVyIDAuMDEgbmlsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAjJ21hcmtkb3duLXRzLS1lbmFibGUtaW4tdGFibGUtbW9kZSkpCiAgICAgICAg
KHQKICAgICAgICAgKHJlbW92ZS1ob29rICdwb3N0LWNvbW1hbmQtaG9vawogICAgICAgICAgICAg
ICAgICAgICAgIydtYXJrZG93bi10cy0tZW5hYmxlLWluLXRhYmxlLW1vZGUgJ2xvY2FsKSkpKQoK
Ozs7IyMjYXV0b2xvYWQKKHdoZW4gKGJvdW5kcCAndHJlZXNpdC1tYWpvci1tb2RlLXJlbWFwLWFs
aXN0KQogIChhZGQtdG8tbGlzdCAnYXV0by1tb2RlLWFsaXN0ICcoIlxcLm1kXFwnIiAuIG1hcmtk
b3duLXRzLW1vZGUpKQogIChhZGQtdG8tbGlzdCAnYXV0by1tb2RlLWFsaXN0ICcoIlxcLm1hcmtk
b3duXFwnIiAuIG1hcmtkb3duLXRzLW1vZGUpKQogIChhZGQtdG8tbGlzdCAnYXV0by1tb2RlLWFs
aXN0ICcoIlxcLm1keFxcJyIgLiBtYXJrZG93bi10cy1tb2RlKSkKICAoYWRkLXRvLWxpc3QgJ3Ry
ZWVzaXQtbWFqb3ItbW9kZS1yZW1hcC1hbGlzdAogICAgICAgICAgICAgICAnKG1hcmtkb3duLW1v
ZGUgLiBtYXJrZG93bi10cy1tb2RlKSkpCgoocHJvdmlkZSAnbWFya2Rvd24tdHMtbW9kZSkKOzs7
IG1hcmtkb3duLXRzLW1vZGUuZWwgZW5kcyBoZXJlCg==
--0000000000009c770d0651b6dbe8--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 13 May 2026 15:37:47 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed May 13 11:37:47 2026
Received: from localhost ([127.0.0.1]:52480 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wNBec-0006kj-Rp
	for submit <at> debbugs.gnu.org; Wed, 13 May 2026 11:37:47 -0400
Received: from mail-dy1-x1330.google.com ([2607:f8b0:4864:20::1330]:52317)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <casouri@HIDDEN>) id 1wNBeZ-0006ka-NE
 for 81019 <at> debbugs.gnu.org; Wed, 13 May 2026 11:37:44 -0400
Received: by mail-dy1-x1330.google.com with SMTP id
 5a478bee46e88-2f0d3e07e30so16494407eec.0
 for <81019 <at> debbugs.gnu.org>; Wed, 13 May 2026 08:37:43 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1778686657; x=1779291457; darn=debbugs.gnu.org;
 h=to:references:message-id:content-transfer-encoding:cc:date
 :in-reply-to:from:subject:mime-version:from:to:cc:subject:date
 :message-id:reply-to;
 bh=RZd/ux1TuB9OCESyiq5DYkf04DjQXd6QebEIEweCR80=;
 b=DQ/Yx/uwVL1kFyVY2q5vn5R3s80J++hgxhTqhdTGN3CZIdfNMUyeYmvN1UXpP+PN6F
 WGnlY1z0dwvNRzMP1CMY5JMRGyUVEw8RHYSkdy7N1nl3kJlX2mdeHHs1wTN8dbJgrum5
 Bn1JfwzvbJvV1hz1rIouSkXobHm8jEWB0i92iguj818eGPkg2lgvJP3BnEmpACfvuQyR
 rrKI7nrT3da1V1OSBPETs/v/nrwANZkQVsd8wEClZTMzPnYCaigk6WpWBLGOOkNpIbRj
 oLtzZOPORxZIcJ31e78TpKC7Ew1zThiOO+vJ+nxWCcxFn2X4QNYeBjs44JQrbgnpTNDu
 GcZQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1778686657; x=1779291457;
 h=to:references:message-id:content-transfer-encoding:cc:date
 :in-reply-to:from:subject:mime-version:x-gm-gg:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=RZd/ux1TuB9OCESyiq5DYkf04DjQXd6QebEIEweCR80=;
 b=FXUvkatEpgusILuGUjTyr9NHTZOgq2FBF2XSRqc0O0r4EABEZBxk000rBFz2ilm73i
 i+H4JS/ACng9ZMH9Ynnn5r+V6W97ZwSdlDN8rNwRopz1HizlcbAot9hLYA4hB43+/yEg
 YcWHniWIEW/mpf3SoLLJWL+ZBQB74YrBn/uKUToELCWH6NZwe3FpOJxM0pn+KGmo6WUI
 LonFnGVsb/dP8T1wvxgq7/xajwCTKIR+OFlvY1C78NMN4mkIEipbB1DnG7ZRN1vlGh/4
 V6NkbPXJeBY92hqspHNL6e7NkXWQQvObf0TVNA/kQwIPIvzsw8BbnYkPXUN+DoAGO9C/
 4vkQ==
X-Gm-Message-State: AOJu0YwBPUEswvKGkQPpzC/xcB5mFgHl0m+rObHB/yBSOPx50Xjy9wAY
 XayLSIqxQ3zwLgDvvLxdnZMvo+pc+3cgX7LZG1bxVFc3HSDrMl47q6hf
X-Gm-Gg: Acq92OFa1SRPgKtDtYJLrowHv2t4J20eP2lTEZW48mviIL2mE8riUSuXkLdQG6vqQNd
 TjLLq44vyHQus0CKMnMeJYj/fC31YG2t+PAwrAlIX+0lezEecOk4r5abEAj+a2ryr7lJz/v/WWL
 edsop1nqPBsnNbKXMhFoiC1/nFmhrRAYB7Ok5b13h5nTkBbU9m4o1xPyxJ1NWnSVn0Vy54bWB1X
 uzl5iGaVp5wSdqVfBvklg/sETjUD1SP45ZkMps+Gq2mFapYhhFkDhhGNoWeg33shXnAtC5EycCE
 jLr2r4Fx/U7pmuCPIekUkUcERgCUqG5OQXjjbPdkoQ5o6QVbqYS9gZ1cI6CPFzvILCi8d2NQ5o1
 YlII7XQNlSlbVIqU6mb61Vjzit3Dswm4H0tK+SxpRPBncoESnLYHtINRER4v2ZzTZKBm+mAXtSD
 HFYOOWiwaeik7u5gftInVKjDAPdGRvuXZBUoj7/Jk4Kz6R
X-Received: by 2002:a05:7300:fd84:b0:2ed:e15:c925 with SMTP id
 5a478bee46e88-30119968f31mr2293266eec.33.1778686657099; 
 Wed, 13 May 2026 08:37:37 -0700 (PDT)
Received: from smtpclient.apple ([2601:645:c686:b320:e5f8:7e1f:4734:34a])
 by smtp.gmail.com with ESMTPSA id
 5a478bee46e88-2f88885be8esm23003359eec.22.2026.05.13.08.37.36
 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
 Wed, 13 May 2026 08:37:36 -0700 (PDT)
Content-Type: text/plain;
	charset=utf-8
Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81\))
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
From: Yuan Fu <casouri@HIDDEN>
In-Reply-To: <m2se7xg9ce.fsf@HIDDEN>
Date: Wed, 13 May 2026 08:37:25 -0700
Content-Transfer-Encoding: quoted-printable
Message-Id: <AB05C371-8CB9-4073-98EE-CD26B3B6C16F@HIDDEN>
References: <m2se7xg9ce.fsf@HIDDEN>
To: Rahul Martim Juliato <rahuljuliato@HIDDEN>
X-Mailer: Apple Mail (2.3826.700.81)
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: =?utf-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>,
 81019 <at> debbugs.gnu.org, Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)



> On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato =
<rahuljuliato@HIDDEN> wrote:
>=20
> Hello,
>=20
> While debugging an "it doesn't fontify" report against =
markdown-ts-mode,
> I ended up in treesit.el territory and would like a second opinion
> before assuming I've correctly identified the layer the fix belongs =
in.
>=20
> The bug shows up easily in markdown-ts-mode but I suspect it can hit =
any
> major mode that drives local parsers via `treesit-range-rules' with
> `:local t'. markdown-ts just exercises that path very heavily (one =
local
> `markdown-inline' parser per paragraph), so we are likely seeing
> spoilers ahead of the html and other multi-parser modes.
>=20
>=20
> How to Reproduce:
> -----------------
>=20
> 1. emacs -Q on current master.
> 2. M-x markdown-ts-mode.
> 3. Insert a backtick code span on its own line, for example:
>=20
>       `foo`
>=20
>       `codium  `
>=20
>   typing the second line character by character and stopping right
>   after the closing backtick. Do not press RET afterwards.
>=20
> 4. The first code span is fontified. The second is not.
>=20
> 5. Press RET. The second code span now fontifies correctly.
>=20
> `(font-lock-flush)' + `(font-lock-ensure)' do not fix it. Calling
> `(treesit-parser-set-included-ranges PR same-ranges)' does not fix
> it either. The only thing that fixes it without typing further is
> deleting and recreating the local markdown-inline parser that covers
> the range.
>=20
>=20
> What is happening
> -----------------
>=20
> The host markdown parser reparses fine and reports the new inline
> node bounds. The local markdown-inline parser at that range,
> however, keeps an outdated tree. I confirmed this directly in the
> bugged buffer:
>=20
>  (buffer-substring 8 18) =3D> "`codium  `"
>=20
>  ;; existing local parser covering (8 . 18)
>  (treesit-node-string (treesit-parser-root-node pr))
>    =3D> "(inline)"
>=20
>  ;; force re-set ranges to the same value
>  (treesit-parser-set-included-ranges pr '((8 . 18)))
>  (treesit-node-string (treesit-parser-root-node pr))
>    =3D> "(inline)"
>=20
>  ;; fresh parser, same buffer, same range
>  (let ((new (treesit-parser-create 'markdown-inline nil t 'embedded)))
>    (treesit-parser-set-included-ranges new '((8 . 18)))
>    (treesit-node-string (treesit-parser-root-node new)))
>    =3D> "(inline (code_span (code_span_delimiter)
>                            (code_span_delimiter)))"
>=20
> So, same buffer, same range, same grammar, resulting in different tree
> depending on whether the parser was reused across edits or created
> fresh.
>=20
> So the grammar, the input, and the range are all fine. What is
> wrong is the parser's accumulated incremental state.
>=20
> Reading `treesit--update-ranges-local', the reuse path goes through:
>=20
>  (treesit--set-embed-ranges range embedded-parser host-parser)
>  (move-overlay ov r-start r-end)
>  (overlay-put ov 'treesit-parser-ov-timestamp modified-tick)
>=20
> Tree-sitter is left to apply the buffered edits on top of its old
> tree. For markdown-inline plus the backtick code_span rule, that
> incremental update never re-fires the rule when the closing backtick
> finally arrives, so the parser stays with `(inline)' empty.
>=20
> Pressing RET escapes the bug. I am not certain why, two candidates:
> the newline grows the host paragraph past the overlay bounds and
> `treesit--cleanup-local-range-overlays' deletes the old overlay on
> the timestamp mismatch, after which a fresh parser is created; or
> the larger range shift is enough to make tree-sitter invalidate the
> right subtree and re-evaluate code_span. Either way the practical
> outcome is the same: only a fresh parser fixes it.
>=20
>=20
> My workaround on markdown-ts-mode (for debugging)=20
> -------------------------------------------------
>=20
> I made this small interactive helper to help me find the local parser
> covering point which would them delete its parser + overlay, and =
create
> a fresh one on the same range:
>=20
>  (defun my/md-recreate-inline-parser-at-point ()
>    "Delete stale local markdown-inline parser+overlay covering point, =
recreate."
>    (interactive)
>    (let* ((p (point))
>           (target-ov
>            (catch 'f
>              (dolist (ov (overlays-in (point-min) (point-max)))
>                (let ((pr (overlay-get ov 'treesit-parser)))
>                  (when (and pr
>                             (overlay-get ov 'treesit-parser-local-p)
>                             (eq (treesit-parser-language pr) =
'markdown-inline)
>                             (<=3D (overlay-start ov) p (overlay-end =
ov)))
>                    (throw 'f ov)))))))
>      (unless target-ov (user-error "No markdown-inline overlay covers =
point"))
>      (let* ((old-pr (overlay-get target-ov 'treesit-parser))
>             (host (overlay-get target-ov 'treesit-host-parser))
>             (level (treesit-parser-embed-level old-pr))
>             (r-start (overlay-start target-ov))
>             (r-end (overlay-end target-ov)))
>        (treesit-parser-delete old-pr)
>        (delete-overlay target-ov)
>        (let ((new (treesit-parser-create 'markdown-inline nil t =
'embedded))
>              (ov (make-overlay r-start r-end nil nil t)))
>          (treesit-parser-set-embed-level new level)
>          (overlay-put ov 'treesit-parser new)
>          (overlay-put ov 'treesit-parser-local-p t)
>          (overlay-put ov 'treesit-host-parser host)
>          (overlay-put ov 'treesit-parser-ov-timestamp =
(buffer-chars-modified-tick))
>          (treesit-parser-set-included-ranges new `((,r-start . =
,r-end)))
>          (font-lock-flush r-start r-end)
>          (message "Recreated markdown-inline parser for (%d . %d)" =
r-start r-end)))))
>=20
> This always recovers the buffer's fontification immediately.
>=20
>=20
> A possible treesit.el patch
> ---------------------------
>=20
> The change I have been testing locally is small: in
> `treesit--update-ranges-local', only reuse an existing local-parser
> overlay when its bounds already match the new range exactly. If the
> overlay would have to move, do not reuse it. Let
> `treesit--cleanup-local-range-overlays' delete it on the timestamp
> mismatch and the existing "create new" branch will produce a fresh
> parser on the right range.
>=20
>     lisp/treesit.el | 11 +++++++++--
>     1 file changed, 9 insertions(+), 2 deletions(-)
>=20
>    diff --git a/lisp/treesit.el b/lisp/treesit.el
>    index 01e82b56bb8..d80e4fe312d 100644
>    --- a/lisp/treesit.el
>    +++ b/lisp/treesit.el
>    @@ -1248,10 +1248,17 @@ treesit--update-ranges-local
>                                                      =
embedded-parser)))
>                             (when (and (overlay-get ov =
'treesit-parser-local-p)
>                                        (eq parser-lang embedded-lang)
>    -                                   (eq embed-level parser-level))
>    +                                   (eq embed-level parser-level)
>    +                                   ;; Only reuse if overlay bounds =
match
>    +                                   ;; the new range exactly.  =
Reusing
>    +                                   ;; across range moves can leave =
the
>    +                                   ;; embedded parser with a stale
>    +                                   ;; incremental tree (bug seen =
with
>    +                                   ;; markdown-inline code_span).
>    +                                   (=3D (overlay-start ov) =
r-start)
>    +                                   (=3D (overlay-end ov) r-end))
>                               (treesit--set-embed-ranges
>                                range embedded-parser host-parser)
>    -                          (move-overlay ov r-start r-end)
>                               (overlay-put ov =
'treesit-parser-ov-timestamp
>                                            modified-tick)
>                               (throw 'done embedded-parser)))))))
>=20
>=20
> With this in place the markdown-ts reproduction fontifies as you type,
> no RET needed, no recreate helper needed.
>=20
> I am very aware this is potentially a sledgehammer. It forces a fresh
> local parser on every range change, throwing away tree-sitter's
> incremental work for that subtree. For modes that just rely on local
> parsers for fontification it should be fine, but it may not be the =
right
> answer if the rest of treesit depends on parser identity surviving
> across range moves.
>=20
>=20
> Where I am not sure
> -------------------
>=20
> 1. Is this the right layer to address? My patch is in
>   `treesit--update-ranges-local'. It feels like the deeper truth could
>   live in `treesit.c''s edit replay when ranges shift, where
>   `need_reparse' for a local parser does not get set even though its
>   tree is stale. The C code is quiet on local parser treatment, so it
>   is hard to tell from outside whether primary-parser reparse
>   notifications are supposed to propagate to local parsers in this
>   case.
>=20
> 2. Is there a one-liner I am missing on the elisp side? For example a
>   call I should be making after `treesit-parser-set-included-ranges' =
to
>   force the parser to throw away its cached tree.
>=20
> 3. Or is the right fix on the grammar side, in tree-sitter-markdown's
>   incremental behaviour around backtick spans, in which case treesit
>   should probably still gain a way to recover.
>=20
> 4. As mentioned at the top, I believe any `:local t' range rule could
>   reach this state. markdown-ts is the first heavy customer, but the
>   html-embedded modes look structurally similar enough that they would
>   hit it too, just less often.
>=20
> If the analysis is correct but the proposed fix is not, I would be =
happy
> to revise the diff. If the analysis itself is wrong, I would also very
> much appreciate corrections so we can avoid carrying the helper above.
>=20
> I am mostly interested in validating the analysis here. I am not
> attached to this particular fix, and would be perfectly happy if a
> different implementation lands instead.
>=20
> Thanks for reading,

Thanks for the investigation. Before knowing more I can=E2=80=99t tell =
if this should be fixed at the treesit.el level or treesit.c level. But =
I=E2=80=99m still at the stage of trying to reproduce it. So the =
reproduce step is:

1. Type `code` RET
2. Type `code`

And at this point the second `code` should be unfortified? Even with =
latest master and tree-sitter, I can=E2=80=99t reproduce it. And if I =
get latest markdown without my patch, opening a markdown file just =
crashes Emacs. I=E2=80=99ll try to get my patch merged upstream.

Yuan=




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at 81019 <at> debbugs.gnu.org:


Received: (at 81019) by debbugs.gnu.org; 12 May 2026 16:08:12 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 12 12:08:12 2026
Received: from localhost ([127.0.0.1]:37005 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wMpeT-0003rw-9W
	for submit <at> debbugs.gnu.org; Tue, 12 May 2026 12:08:12 -0400
Received: from mail-vs1-xe34.google.com ([2607:f8b0:4864:20::e34]:59661)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1wMpeP-0003r8-QC
 for 81019 <at> debbugs.gnu.org; Tue, 12 May 2026 12:08:07 -0400
Received: by mail-vs1-xe34.google.com with SMTP id
 ada2fe7eead31-63329e1c77aso826345137.3
 for <81019 <at> debbugs.gnu.org>; Tue, 12 May 2026 09:08:05 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1778602080; cv=none;
 d=google.com; s=arc-20240605;
 b=bUV6uDzyiYYgEcLluH6in49TWVGgprVWaidKpr8hrK9nRfCPbQ/Sm+34mnyznnnqDm
 fnGDmO940tIJriQh77yevooUzRSwiFK1MF4y3J8mIaXOHL74ZjOF/zNvxfITmf8GJWZP
 z51GGaMo2eZBTrHvpARBBBVaCEoQwzVuxQXM4FCvh/v1lRmulBr7s5P1JtgVzDhttH3R
 cKJ/gqN4matfrqDeqD+bpyQPOOKOij/Olt2NNHPMEckryiyxlSU5lgs1MjLWTZNzjpRb
 nkcxlV8RLSpDjA7d2gDm1qBVWJjXdhSwKkZ2+Idm2CupklK+y39f/5A1EodZ1IgLqFUU
 zvCA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;
 s=arc-20240605; 
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:dkim-signature;
 bh=D8AHsAHEXclq4ehBI08MnbQQsfevO2X5sbmYYay4X/k=;
 fh=KgGgcNny2Ahjk3Uvdo9CA1RfQa6fbu5kAwvpGJN3b7s=;
 b=Qu7R070RBicpdwcW8nap0w4CttLyk9H11vbmMTvzIV3hY8IIErS4wCyPrl6ZD032eD
 WllwqedmUgpsh2EoYToBXmMK9U417xJvfU1ZMW0kjQO/fRZIiR3OURf6noEYKw9D98Md
 Re0erReuFAJCRtmh7Q/N6qLuO1nsOaSJJ66z9IsB2AUbaNtSZvy7koD0RJ8winsREBup
 HUQ7Bi/mwDkHdpeGkCNYWVz/8Xs2t6V77R8LHm1krUWgCA4ToUJglT+CZUCtPOID5g//
 isvvZ735gcJ5N8mhwpXwy89rSxR8k48SNnhEIE2nkbtFAstkkiY6vC/2JSOOU7cV6XsE
 VRlg==; darn=debbugs.gnu.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1778602080; x=1779206880; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=D8AHsAHEXclq4ehBI08MnbQQsfevO2X5sbmYYay4X/k=;
 b=ewBHfL7xJNMiiYWtBVLFkE/ypY8VaQiUL8CDaQkLB6FvU2B0FhI2RB/k6erfRAifCm
 Bcd4SJz3BWDh2BgzQYhL/036Ni9Lw5OOdhfa2Csm7etE1Ipso4jm2Ov80pftNYOaeL+Y
 7KfDOsvIoZ0+8L2WAZRP59axxfxleQeAuJJ20cqsNSTDi8565oMdaO3A7CD7Gi6FhUDx
 7g6gQYeVEcdE9aZ6l4A+7WuZ4xbtD6X1nfMn8TakRsb/UDIGSNSrbwId8H5CKMHZEseY
 W2mu+MaRDNBVxzb/hA1oJcbR8vSq5o/IFnuEkeqLU9LnjKNNx52TyWSYE3nMpfDsj103
 fkfg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1778602080; x=1779206880;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=D8AHsAHEXclq4ehBI08MnbQQsfevO2X5sbmYYay4X/k=;
 b=cTrBYgH8n7I+jnMh6BG1cRD8HFcoEtMvCyw/g+prx/jhd05AuJz5F5WlFBPaF55Fgg
 Y1zqydn2DMBOw75uK7ZLkOOf1Mu4T2NVCDsGes+JMg+fGPGKGZ5Fk2zW6WNxfV0tXobf
 fuKbVGBpRW+0SG2lCRgFxHFnttIJjImXQCG5dSxqHZm3tOhEFGSU21+p7tE1c/uBgh9u
 Qfs8kNs231PCe2u0hRKPGW/9SjxKu8SuTBR8iAuR4/R6vVk365JFPjf9gdx30gWYv9nm
 3dF+0uQvU5ICgSSN5lnL9JSgfU0RoNL3IfiA+SU7lw/sdItTaoPnUsxh1SE0mR6hbLMB
 /jjQ==
X-Gm-Message-State: AOJu0YwdThg4Ud+o4i0ZOUql1GTFwG2o+bOaGX0qznd2yqd8AwU530K0
 aopzoen92e/G+eOkZ6Wamlwu9uwO1ZZiTd59dLMQmo/v8i3UFOrhrVKZbaJ4GGY9nbi91Q9d0wZ
 QN6r7fbFlulB7hIS2T/trgqxlBEFgd0Y=
X-Gm-Gg: Acq92OFQTEee2m4jhFs9Ftk246yB3HlbuCU01xgN3lgQjwtEPi01RfZ+GOJ8Hsgkdcd
 TWxgvJ6F1JH8MRaIjzOc09jm+EKErEYPryIkvGHHVUZj44FLYjC9ojmZ2OmNY65MCZUvRO8YRbY
 SKORi6wijjApiBoIZBmj0kaEnWStB63Q+PG3PdkSd9GzfKItq8mGxT4Tp9KnZo8J5ClKK9lsteg
 p5qpc3mt4zDt7avLnpRScHfQljQBxqu648/PrEsihHstP6kGJJpIAbfQYc2DRGsKPGiWla/v/Zx
 7Ezk64bEg6psYtdcDKnaBctyt3AGhRkCSCoF1dzRt+Jevn922uB4K0ITxg1xZyH7qaZ0803lenS
 ur7N6DbldWjNuYYXKDQy3cgppzcHPlvR3IhI9mGVBxugyC4A=
X-Received: by 2002:a05:6102:2b9a:b0:608:94e4:1c00 with SMTP id
 ada2fe7eead31-630f901a445mr13605976137.2.1778602079780; Tue, 12 May 2026
 09:07:59 -0700 (PDT)
MIME-Version: 1.0
References: <m2se7xg9ce.fsf@HIDDEN>
In-Reply-To: <m2se7xg9ce.fsf@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Tue, 12 May 2026 12:07:48 -0400
X-Gm-Features: AVHnY4KX8mo43aMYxlrWrdaAAE5v5O3AT6tjQKEIZJWKuvQGkcfdRYGjoV6jT2U
Message-ID: <CAN+1Hbo_Si5W7D4-JUk-YF8aK4xHXbDYAkC7WWzhCteJAv4fjA@HIDDEN>
Subject: Re: bug#81019: 31.0.50; [BUG] treesit: local parser keeps stale
 incremental tree across range moves
To: Rahul Martim Juliato <rahuljuliato@HIDDEN>
Content-Type: multipart/alternative; boundary="0000000000002983010651a11196"
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 81019
Cc: Yuan Fu <casouri@HIDDEN>, 81019 <at> debbugs.gnu.org,
 Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.0 (/)

--0000000000002983010651a11196
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Mon, May 11, 2026 at 1:12=E2=80=AFPM Rahul Martim Juliato <rahuljuliato@=
gmail.com>
wrote:

> Hello,
>
> While debugging an "it doesn't fontify" report against markdown-ts-mode,
> I ended up in treesit.el territory and would like a second opinion
> before assuming I've correctly identified the layer the fix belongs in.
>
> The bug shows up easily in markdown-ts-mode but I suspect it can hit any
> major mode that drives local parsers via `treesit-range-rules' with
> `:local t'. markdown-ts just exercises that path very heavily (one local
> `markdown-inline' parser per paragraph), so we are likely seeing
> spoilers ahead of the html and other multi-parser modes.
>
>
> How to Reproduce:
> -----------------
>
> 1. emacs -Q on current master.
> 2. M-x markdown-ts-mode.
> 3. Insert a backtick code span on its own line, for example:
>
>        `foo`
>
>        `codium  `
>
>    typing the second line character by character and stopping right
>    after the closing backtick. Do not press RET afterwards.
>
> 4. The first code span is fontified. The second is not.
>
> 5. Press RET. The second code span now fontifies correctly.
>
> `(font-lock-flush)' + `(font-lock-ensure)' do not fix it. Calling
> `(treesit-parser-set-included-ranges PR same-ranges)' does not fix
> it either. The only thing that fixes it without typing further is
> deleting and recreating the local markdown-inline parser that covers
> the range.
>
>
> What is happening
> -----------------
>
> The host markdown parser reparses fine and reports the new inline
> node bounds. The local markdown-inline parser at that range,
> however, keeps an outdated tree. I confirmed this directly in the
> bugged buffer:
>
>   (buffer-substring 8 18) =3D> "`codium  `"
>
>   ;; existing local parser covering (8 . 18)
>   (treesit-node-string (treesit-parser-root-node pr))
>     =3D> "(inline)"
>
>   ;; force re-set ranges to the same value
>   (treesit-parser-set-included-ranges pr '((8 . 18)))
>   (treesit-node-string (treesit-parser-root-node pr))
>     =3D> "(inline)"
>
>   ;; fresh parser, same buffer, same range
>   (let ((new (treesit-parser-create 'markdown-inline nil t 'embedded)))
>     (treesit-parser-set-included-ranges new '((8 . 18)))
>     (treesit-node-string (treesit-parser-root-node new)))
>     =3D> "(inline (code_span (code_span_delimiter)
>                             (code_span_delimiter)))"
>
> So, same buffer, same range, same grammar, resulting in different tree
> depending on whether the parser was reused across edits or created
> fresh.
>
> So the grammar, the input, and the range are all fine. What is
> wrong is the parser's accumulated incremental state.
>
> Reading `treesit--update-ranges-local', the reuse path goes through:
>
>   (treesit--set-embed-ranges range embedded-parser host-parser)
>   (move-overlay ov r-start r-end)
>   (overlay-put ov 'treesit-parser-ov-timestamp modified-tick)
>
> Tree-sitter is left to apply the buffered edits on top of its old
> tree. For markdown-inline plus the backtick code_span rule, that
> incremental update never re-fires the rule when the closing backtick
> finally arrives, so the parser stays with `(inline)' empty.
>
> Pressing RET escapes the bug. I am not certain why, two candidates:
> the newline grows the host paragraph past the overlay bounds and
> `treesit--cleanup-local-range-overlays' deletes the old overlay on
> the timestamp mismatch, after which a fresh parser is created; or
> the larger range shift is enough to make tree-sitter invalidate the
> right subtree and re-evaluate code_span. Either way the practical
> outcome is the same: only a fresh parser fixes it.
>
>
> My workaround on markdown-ts-mode (for debugging)
> -------------------------------------------------
>
> I made this small interactive helper to help me find the local parser
> covering point which would them delete its parser + overlay, and create
> a fresh one on the same range:
>
>   (defun my/md-recreate-inline-parser-at-point ()
>     "Delete stale local markdown-inline parser+overlay covering point,
> recreate."
>     (interactive)
>     (let* ((p (point))
>            (target-ov
>             (catch 'f
>               (dolist (ov (overlays-in (point-min) (point-max)))
>                 (let ((pr (overlay-get ov 'treesit-parser)))
>                   (when (and pr
>                              (overlay-get ov 'treesit-parser-local-p)
>                              (eq (treesit-parser-language pr)
> 'markdown-inline)
>                              (<=3D (overlay-start ov) p (overlay-end ov))=
)
>                     (throw 'f ov)))))))
>       (unless target-ov (user-error "No markdown-inline overlay covers
> point"))
>       (let* ((old-pr (overlay-get target-ov 'treesit-parser))
>              (host (overlay-get target-ov 'treesit-host-parser))
>              (level (treesit-parser-embed-level old-pr))
>              (r-start (overlay-start target-ov))
>              (r-end (overlay-end target-ov)))
>         (treesit-parser-delete old-pr)
>         (delete-overlay target-ov)
>         (let ((new (treesit-parser-create 'markdown-inline nil t
> 'embedded))
>               (ov (make-overlay r-start r-end nil nil t)))
>           (treesit-parser-set-embed-level new level)
>           (overlay-put ov 'treesit-parser new)
>           (overlay-put ov 'treesit-parser-local-p t)
>           (overlay-put ov 'treesit-host-parser host)
>           (overlay-put ov 'treesit-parser-ov-timestamp
> (buffer-chars-modified-tick))
>           (treesit-parser-set-included-ranges new `((,r-start . ,r-end)))
>           (font-lock-flush r-start r-end)
>           (message "Recreated markdown-inline parser for (%d . %d)"
> r-start r-end)))))
>
> This always recovers the buffer's fontification immediately.
>
>
> A possible treesit.el patch
> ---------------------------
>
> The change I have been testing locally is small: in
> `treesit--update-ranges-local', only reuse an existing local-parser
> overlay when its bounds already match the new range exactly. If the
> overlay would have to move, do not reuse it. Let
> `treesit--cleanup-local-range-overlays' delete it on the timestamp
> mismatch and the existing "create new" branch will produce a fresh
> parser on the right range.
>
>      lisp/treesit.el | 11 +++++++++--
>      1 file changed, 9 insertions(+), 2 deletions(-)
>
>     diff --git a/lisp/treesit.el b/lisp/treesit.el
>     index 01e82b56bb8..d80e4fe312d 100644
>     --- a/lisp/treesit.el
>     +++ b/lisp/treesit.el
>     @@ -1248,10 +1248,17 @@ treesit--update-ranges-local
>                                                       embedded-parser)))
>                              (when (and (overlay-get ov
> 'treesit-parser-local-p)
>                                         (eq parser-lang embedded-lang)
>     -                                   (eq embed-level parser-level))
>     +                                   (eq embed-level parser-level)
>     +                                   ;; Only reuse if overlay bounds
> match
>     +                                   ;; the new range exactly.  Reusin=
g
>     +                                   ;; across range moves can leave t=
he
>     +                                   ;; embedded parser with a stale
>     +                                   ;; incremental tree (bug seen wit=
h
>     +                                   ;; markdown-inline code_span).
>     +                                   (=3D (overlay-start ov) r-start)
>     +                                   (=3D (overlay-end ov) r-end))
>                                (treesit--set-embed-ranges
>                                 range embedded-parser host-parser)
>     -                          (move-overlay ov r-start r-end)
>                                (overlay-put ov 'treesit-parser-ov-timesta=
mp
>                                             modified-tick)
>                                (throw 'done embedded-parser)))))))
>
>
> With this in place the markdown-ts reproduction fontifies as you type,
> no RET needed, no recreate helper needed.
>
> I am very aware this is potentially a sledgehammer. It forces a fresh
> local parser on every range change, throwing away tree-sitter's
> incremental work for that subtree. For modes that just rely on local
> parsers for fontification it should be fine, but it may not be the right
> answer if the rest of treesit depends on parser identity surviving
> across range moves.
>
>
> Where I am not sure
> -------------------
>
> 1. Is this the right layer to address? My patch is in
>    `treesit--update-ranges-local'. It feels like the deeper truth could
>    live in `treesit.c''s edit replay when ranges shift, where
>    `need_reparse' for a local parser does not get set even though its
>    tree is stale. The C code is quiet on local parser treatment, so it
>    is hard to tell from outside whether primary-parser reparse
>    notifications are supposed to propagate to local parsers in this
>    case.
>
> 2. Is there a one-liner I am missing on the elisp side? For example a
>    call I should be making after `treesit-parser-set-included-ranges' to
>    force the parser to throw away its cached tree.
>
> 3. Or is the right fix on the grammar side, in tree-sitter-markdown's
>    incremental behaviour around backtick spans, in which case treesit
>    should probably still gain a way to recover.
>
> 4. As mentioned at the top, I believe any `:local t' range rule could
>    reach this state. markdown-ts is the first heavy customer, but the
>    html-embedded modes look structurally similar enough that they would
>    hit it too, just less often.
>
> If the analysis is correct but the proposed fix is not, I would be happy
> to revise the diff. If the analysis itself is wrong, I would also very
> much appreciate corrections so we can avoid carrying the helper above.
>
> I am mostly interested in validating the analysis here. I am not
> attached to this particular fix, and would be perfectly happy if a
> different implementation lands instead.
>

FYI, now that we've switched to :local markdown-inline trees, this issue
manifests itself quite often during editing operations as I'm noticing more
and more (I've switched completely to markdown-ts-mode and no longer using
markdown-mode so I've been eating our own dog food).

--0000000000002983010651a11196
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Mon, May 11, 2026 at 1:12=E2=80=AFPM Rahul Martim Juliato &lt;<a href=3D=
"mailto:rahuljuliato@HIDDEN">rahuljuliato@HIDDEN</a>&gt; wrote:</span=
></div></div><div class=3D"gmail_quote gmail_quote_container"><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px soli=
d rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
While debugging an &quot;it doesn&#39;t fontify&quot; report against markdo=
wn-ts-mode,<br>
I ended up in treesit.el territory and would like a second opinion<br>
before assuming I&#39;ve correctly identified the layer the fix belongs in.=
<br>
<br>
The bug shows up easily in markdown-ts-mode but I suspect it can hit any<br=
>
major mode that drives local parsers via `treesit-range-rules&#39; with<br>
`:local t&#39;. markdown-ts just exercises that path very heavily (one loca=
l<br>
`markdown-inline&#39; parser per paragraph), so we are likely seeing<br>
spoilers ahead of the html and other multi-parser modes.<br>
<br>
<br>
How to Reproduce:<br>
-----------------<br>
<br>
1. emacs -Q on current master.<br>
2. M-x markdown-ts-mode.<br>
3. Insert a backtick code span on its own line, for example:<br>
<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0`foo`<br>
<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0`codium=C2=A0 `<br>
<br>
=C2=A0 =C2=A0typing the second line character by character and stopping rig=
ht<br>
=C2=A0 =C2=A0after the closing backtick. Do not press RET afterwards.<br>
<br>
4. The first code span is fontified. The second is not.<br>
<br>
5. Press RET. The second code span now fontifies correctly.<br>
<br>
`(font-lock-flush)&#39; + `(font-lock-ensure)&#39; do not fix it. Calling<b=
r>
`(treesit-parser-set-included-ranges PR same-ranges)&#39; does not fix<br>
it either. The only thing that fixes it without typing further is<br>
deleting and recreating the local markdown-inline parser that covers<br>
the range.<br>
<br>
<br>
What is happening<br>
-----------------<br>
<br>
The host markdown parser reparses fine and reports the new inline<br>
node bounds. The local markdown-inline parser at that range,<br>
however, keeps an outdated tree. I confirmed this directly in the<br>
bugged buffer:<br>
<br>
=C2=A0 (buffer-substring 8 18) =3D&gt; &quot;`codium=C2=A0 `&quot;<br>
<br>
=C2=A0 ;; existing local parser covering (8 . 18)<br>
=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
=C2=A0 =C2=A0 =3D&gt; &quot;(inline)&quot;<br>
<br>
=C2=A0 ;; force re-set ranges to the same value<br>
=C2=A0 (treesit-parser-set-included-ranges pr &#39;((8 . 18)))<br>
=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
=C2=A0 =C2=A0 =3D&gt; &quot;(inline)&quot;<br>
<br>
=C2=A0 ;; fresh parser, same buffer, same range<br>
=C2=A0 (let ((new (treesit-parser-create &#39;markdown-inline nil t &#39;em=
bedded)))<br>
=C2=A0 =C2=A0 (treesit-parser-set-included-ranges new &#39;((8 . 18)))<br>
=C2=A0 =C2=A0 (treesit-node-string (treesit-parser-root-node new)))<br>
=C2=A0 =C2=A0 =3D&gt; &quot;(inline (code_span (code_span_delimiter)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 (code_span_delimiter)))&quot;<br>
<br>
So, same buffer, same range, same grammar, resulting in different tree<br>
depending on whether the parser was reused across edits or created<br>
fresh.<br>
<br>
So the grammar, the input, and the range are all fine. What is<br>
wrong is the parser&#39;s accumulated incremental state.<br>
<br>
Reading `treesit--update-ranges-local&#39;, the reuse path goes through:<br=
>
<br>
=C2=A0 (treesit--set-embed-ranges range embedded-parser host-parser)<br>
=C2=A0 (move-overlay ov r-start r-end)<br>
=C2=A0 (overlay-put ov &#39;treesit-parser-ov-timestamp modified-tick)<br>
<br>
Tree-sitter is left to apply the buffered edits on top of its old<br>
tree. For markdown-inline plus the backtick code_span rule, that<br>
incremental update never re-fires the rule when the closing backtick<br>
finally arrives, so the parser stays with `(inline)&#39; empty.<br>
<br>
Pressing RET escapes the bug. I am not certain why, two candidates:<br>
the newline grows the host paragraph past the overlay bounds and<br>
`treesit--cleanup-local-range-overlays&#39; deletes the old overlay on<br>
the timestamp mismatch, after which a fresh parser is created; or<br>
the larger range shift is enough to make tree-sitter invalidate the<br>
right subtree and re-evaluate code_span. Either way the practical<br>
outcome is the same: only a fresh parser fixes it.<br>
<br>
<br>
My workaround on markdown-ts-mode (for debugging) <br>
-------------------------------------------------<br>
<br>
I made this small interactive helper to help me find the local parser<br>
covering point which would them delete its parser + overlay, and create<br>
a fresh one on the same range:<br>
<br>
=C2=A0 (defun my/md-recreate-inline-parser-at-point ()<br>
=C2=A0 =C2=A0 &quot;Delete stale local markdown-inline parser+overlay cover=
ing point, recreate.&quot;<br>
=C2=A0 =C2=A0 (interactive)<br>
=C2=A0 =C2=A0 (let* ((p (point))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(target-ov<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (catch &#39;f<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolist (ov (overlays-in (=
point-min) (point-max)))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((pr (overlay-=
get ov &#39;treesit-parser)))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (and p=
r<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-get ov &#39;treesit-parser-local-p)=
<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eq (treesit-parser-language pr) &#39;markdo=
wn-inline)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(&lt;=3D (overlay-start ov) p (overlay-end o=
v)))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (thro=
w &#39;f ov)))))))<br>
=C2=A0 =C2=A0 =C2=A0 (unless target-ov (user-error &quot;No markdown-inline=
 overlay covers point&quot;))<br>
=C2=A0 =C2=A0 =C2=A0 (let* ((old-pr (overlay-get target-ov &#39;treesit-par=
ser))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(host (overlay-get target-o=
v &#39;treesit-host-parser))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(level (treesit-parser-embe=
d-level old-pr))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-start (overlay-start tar=
get-ov))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-end (overlay-end target-=
ov)))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-delete old-pr)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-overlay target-ov)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((new (treesit-parser-create &#39;markdown=
-inline nil t &#39;embedded))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (ov (make-overlay r-start =
r-end nil nil t)))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-embed-level new leve=
l)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-parser new)=
<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-parser-loca=
l-p t)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-host-parser=
 host)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov &#39;treesit-parser-ov-t=
imestamp (buffer-chars-modified-tick))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-included-ranges new =
`((,r-start . ,r-end)))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (font-lock-flush r-start r-end)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (message &quot;Recreated markdown-inline=
 parser for (%d . %d)&quot; r-start r-end)))))<br>
<br>
This always recovers the buffer&#39;s fontification immediately.<br>
<br>
<br>
A possible treesit.el patch<br>
---------------------------<br>
<br>
The change I have been testing locally is small: in<br>
`treesit--update-ranges-local&#39;, only reuse an existing local-parser<br>
overlay when its bounds already match the new range exactly. If the<br>
overlay would have to move, do not reuse it. Let<br>
`treesit--cleanup-local-range-overlays&#39; delete it on the timestamp<br>
mismatch and the existing &quot;create new&quot; branch will produce a fres=
h<br>
parser on the right range.<br>
<br>
=C2=A0 =C2=A0 =C2=A0lisp/treesit.el | 11 +++++++++--<br>
=C2=A0 =C2=A0 =C2=A01 file changed, 9 insertions(+), 2 deletions(-)<br>
<br>
=C2=A0 =C2=A0 diff --git a/lisp/treesit.el b/lisp/treesit.el<br>
=C2=A0 =C2=A0 index 01e82b56bb8..d80e4fe312d 100644<br>
=C2=A0 =C2=A0 --- a/lisp/treesit.el<br>
=C2=A0 =C2=A0 +++ b/lisp/treesit.el<br>
=C2=A0 =C2=A0 @@ -1248,10 +1248,17 @@ treesit--update-ranges-local<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 embedded-parser)))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when (and (overlay-get ov &#39;treesit-pars=
er-local-p)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eq pars=
er-lang embedded-lang)<br>
=C2=A0 =C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eq embed=
-level parser-level))<br>
=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eq embed=
-level parser-level)<br>
=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; Only r=
euse if overlay bounds match<br>
=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; the ne=
w range exactly.=C2=A0 Reusing<br>
=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; across=
 range moves can leave the<br>
=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; embedd=
ed parser with a stale<br>
=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; increm=
ental tree (bug seen with<br>
=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; markdo=
wn-inline code_span).<br>
=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(=3D (ove=
rlay-start ov) r-start)<br>
=C2=A0 =C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(=3D (ove=
rlay-end ov) r-end))<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(treesit--set-embed-ranges<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 range embedded-parser host-parser)<b=
r>
=C2=A0 =C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (move-overlay ov r-start r-end)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-put ov &#39;treesit-parser-o=
v-timestamp<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 modified-tick)<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(throw &#39;done embedded-parser)))))=
))<br>
<br>
<br>
With this in place the markdown-ts reproduction fontifies as you type,<br>
no RET needed, no recreate helper needed.<br>
<br>
I am very aware this is potentially a sledgehammer. It forces a fresh<br>
local parser on every range change, throwing away tree-sitter&#39;s<br>
incremental work for that subtree. For modes that just rely on local<br>
parsers for fontification it should be fine, but it may not be the right<br=
>
answer if the rest of treesit depends on parser identity surviving<br>
across range moves.<br>
<br>
<br>
Where I am not sure<br>
-------------------<br>
<br>
1. Is this the right layer to address? My patch is in<br>
=C2=A0 =C2=A0`treesit--update-ranges-local&#39;. It feels like the deeper t=
ruth could<br>
=C2=A0 =C2=A0live in `treesit.c&#39;&#39;s edit replay when ranges shift, w=
here<br>
=C2=A0 =C2=A0`need_reparse&#39; for a local parser does not get set even th=
ough its<br>
=C2=A0 =C2=A0tree is stale. The C code is quiet on local parser treatment, =
so it<br>
=C2=A0 =C2=A0is hard to tell from outside whether primary-parser reparse<br=
>
=C2=A0 =C2=A0notifications are supposed to propagate to local parsers in th=
is<br>
=C2=A0 =C2=A0case.<br>
<br>
2. Is there a one-liner I am missing on the elisp side? For example a<br>
=C2=A0 =C2=A0call I should be making after `treesit-parser-set-included-ran=
ges&#39; to<br>
=C2=A0 =C2=A0force the parser to throw away its cached tree.<br>
<br>
3. Or is the right fix on the grammar side, in tree-sitter-markdown&#39;s<b=
r>
=C2=A0 =C2=A0incremental behaviour around backtick spans, in which case tre=
esit<br>
=C2=A0 =C2=A0should probably still gain a way to recover.<br>
<br>
4. As mentioned at the top, I believe any `:local t&#39; range rule could<b=
r>
=C2=A0 =C2=A0reach this state. markdown-ts is the first heavy customer, but=
 the<br>
=C2=A0 =C2=A0html-embedded modes look structurally similar enough that they=
 would<br>
=C2=A0 =C2=A0hit it too, just less often.<br>
<br>
If the analysis is correct but the proposed fix is not, I would be happy<br=
>
to revise the diff. If the analysis itself is wrong, I would also very<br>
much appreciate corrections so we can avoid carrying the helper above.<br>
<br>
I am mostly interested in validating the analysis here. I am not<br>
attached to this particular fix, and would be perfectly happy if a<br>
different implementation lands instead.<br></blockquote><div><br></div><div=
 class=3D"gmail_default" style=3D"font-family:monospace">FYI, now that we&#=
39;ve switched to :local markdown-inline trees, this issue manifests itself=
 quite often during editing operations as I&#39;m noticing more and more (I=
&#39;ve switched completely to markdown-ts-mode and no longer using markdow=
n-mode so I&#39;ve been eating our own dog food).</div></div></div>

--0000000000002983010651a11196--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 11 May 2026 17:11:53 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon May 11 13:11:52 2026
Received: from localhost ([127.0.0.1]:51327 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1wMUAT-0003uR-P2
	for submit <at> debbugs.gnu.org; Mon, 11 May 2026 13:11:52 -0400
Received: from lists1p.gnu.org ([2001:470:142::17]:48478)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <rahuljuliato@HIDDEN>)
 id 1wMUAL-0003sC-Bx
 for submit <at> debbugs.gnu.org; Mon, 11 May 2026 13:11:42 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <rahuljuliato@HIDDEN>)
 id 1wMUA7-0006wD-D6
 for bug-gnu-emacs@HIDDEN; Mon, 11 May 2026 13:11:24 -0400
Received: from mail-dy1-x1336.google.com ([2607:f8b0:4864:20::1336])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <rahuljuliato@HIDDEN>)
 id 1wMUA4-0001Dx-UL
 for bug-gnu-emacs@HIDDEN; Mon, 11 May 2026 13:11:23 -0400
Received: by mail-dy1-x1336.google.com with SMTP id
 5a478bee46e88-2ecf9e398f4so12336340eec.1
 for <bug-gnu-emacs@HIDDEN>; Mon, 11 May 2026 10:11:19 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20251104; t=1778519478; x=1779124278; darn=gnu.org;
 h=mime-version:message-id:date:subject:to:from:from:to:cc:subject
 :date:message-id:reply-to;
 bh=CJqVZcAT/81WJNKnYQyCXOZUP21d/ewkIa1gDcHcUyU=;
 b=MBhdgNXJ7TkzGFzRwgga6jpq3gAVRoM+Bng0IbeYLcdj7OStlFChmgQOvYgJezntSu
 vhc0/UkgAWr7mVZmIYZw6GK0Yqenc3bWvDozu4bZRFtQqY5H4dClhLDR8j+ETmWaWMCQ
 dYDG1Q6f89IYHHGwSfKgbRIcpyNQBb9uBejta6V8PEIt7V7FVHKYeL5/PiJa7Ar3y/WA
 mpVabWWU0lsRiI21TRQuLbB3FjjWwak3pS190VsRhitB4/MH/ZVf2m4wsUQgXLx/lclw
 ZiiiFe0+KiOURg6Qkc04P1gDjqOMgC/3d3IVPBi4Cu+WAE6WHnmm2ySP8goNZO+J7L6a
 nCpw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20251104; t=1778519478; x=1779124278;
 h=mime-version:message-id:date:subject:to:from:x-gm-gg
 :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=CJqVZcAT/81WJNKnYQyCXOZUP21d/ewkIa1gDcHcUyU=;
 b=VEG3Ygs5qsbBSwOrQbufnXh+3ohh1Xb/o6qZRh8R4Df8BnATTtjKr/jgNVZK2YdkP/
 rlMesgsSxZC2JWWfnOsIgP7j8a1JBeU21FN+mJT1Xat6QmSiqz1RY61psexjCppzzIWR
 kTv7R/jh4rY+pl3V4OI+9yGzYzKwNi2TvaBj2+Z56udzfZ/wGQ4D7NPS4DvURqQFta/1
 Xeb2/KsZurFa3fV8oGDrrvstCRol86tdyevrSiDZSM1irsBcL0jdz5J659/vEVfAjxNN
 mhk0V/EcyXLG4RW7NqNTEZPHPk6fTSLQp1QrjsUoy2ez6sBxFV7QbvmjHOgYBzfCjeqv
 JjBA==
X-Gm-Message-State: AOJu0YwBW9CriU07momvEv2OCOc2xFolnXd3JhmDwxx1iVOacA4Ndem8
 YWhtpbXVV05bT7cYsO+y+ePgk0GG9CbkAoHtXAKuTm9lnOCyQ7MV/RvL6W+GYr+O4fk=
X-Gm-Gg: Acq92OFdesREhQjgarCIvXhZ7WOAInG1X6eb4B0K68udapjbdIElpqWKHDVT18wLo5I
 VfmJYsvWoRe2Vzktuvlooy9y9sjEwtNLRqRMbcps8g3m5bBp8GVD4qhHDWTYwzpnN3nCN0adgCS
 iRJMiHaaNbnZhxdqxBbdatFoBzZRNwcB2NAr1rMZGMznJjh5vYJrt6VEnzPDjsVm8FRQTve5aN4
 H0E2Hq/19EdOrrkthHK0h+kilQHxtq2Pk7dBVv50olR7JgyFTVojnsJjfuLKletkFfcFSEK95mT
 X5Uzvrl2gyy0nAjAKpHiB0CC2WyTs76Ecw8SxnoFfdIaYcA3Q18gJ2aul4ugw4hs0gPL55XT0Nk
 8yL7ajjt14ZPVgJWa7kc2q3saEYBb3UuO0s5u+w6rpKLvdlpCU66sig5ihNpO/g3FmjbZItNIWT
 XBUnQNBR41BzocsZgb/bGnpGeyuDXOBQ/W6oSvtpzcTMdZx8F3OGmhWlSuognawdsS3ADQW5UbY
 43j9pFfU6U=
X-Received: by 2002:a05:7300:6ca8:b0:2f5:3641:f110 with SMTP id
 5a478bee46e88-2f54d790853mr13038411eec.31.1778519477329; 
 Mon, 11 May 2026 10:11:17 -0700 (PDT)
Received: from MacBook-Pro.local ([185.153.176.28])
 by smtp.gmail.com with ESMTPSA id
 5a478bee46e88-2f885edb83fsm14056170eec.7.2026.05.11.10.11.15
 for <bug-gnu-emacs@HIDDEN>
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Mon, 11 May 2026 10:11:15 -0700 (PDT)
From: Rahul Martim Juliato <rahuljuliato@HIDDEN>
X-Google-Original-From: Rahul Martim Juliato <rahul.juliato@HIDDEN>
To: bug-gnu-emacs@HIDDEN
Subject: 31.0.50; [BUG] treesit: local parser keeps stale incremental tree
 across range moves
X-Debbugs-Cc: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>,  Yuan Fu
 <casouri@HIDDEN>,  Juri Linkov <juri@HIDDEN>
Date: Mon, 11 May 2026 14:11:13 -0300
Message-ID: <m2se7xg9ce.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
Received-SPF: pass client-ip=2607:f8b0:4864:20::1336;
 envelope-from=rahuljuliato@HIDDEN; helo=mail-dy1-x1336.google.com
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,
 RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,
 SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 2.0 (++)
X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 the administrator of that system for details.
 Content preview:  Hello, While debugging an "it doesn't fontify" report against
 markdown-ts-mode, I ended up in treesit.el territory and would like a second
 opinion before assuming I've correctly identified the layer the fix [...]
 Content analysis details:   (2.0 points, 10.0 required)
 pts rule name              description
 ---- ---------------------- --------------------------------------------------
 -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
 no trust [2001:470:142:0:0:0:0:17 listed in] [list.dnswl.org]
 0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
 provider (rahuljuliato[at]gmail.com)
 1.0 SPF_SOFTFAIL           SPF: sender does not match SPF record (softfail)
 -0.0 SPF_HELO_PASS          SPF: HELO matches SPF record
 1.0 FORGED_GMAIL_RCVD      'From' gmail.com does not match 'Received'
 headers
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Hello,

While debugging an "it doesn't fontify" report against markdown-ts-mode,
I ended up in treesit.el territory and would like a second opinion
before assuming I've correctly identified the layer the fix belongs in.

The bug shows up easily in markdown-ts-mode but I suspect it can hit any
major mode that drives local parsers via `treesit-range-rules' with
`:local t'. markdown-ts just exercises that path very heavily (one local
`markdown-inline' parser per paragraph), so we are likely seeing
spoilers ahead of the html and other multi-parser modes.


How to Reproduce:
-----------------

1. emacs -Q on current master.
2. M-x markdown-ts-mode.
3. Insert a backtick code span on its own line, for example:

       `foo`

       `codium  `

   typing the second line character by character and stopping right
   after the closing backtick. Do not press RET afterwards.

4. The first code span is fontified. The second is not.

5. Press RET. The second code span now fontifies correctly.

`(font-lock-flush)' + `(font-lock-ensure)' do not fix it. Calling
`(treesit-parser-set-included-ranges PR same-ranges)' does not fix
it either. The only thing that fixes it without typing further is
deleting and recreating the local markdown-inline parser that covers
the range.


What is happening
-----------------

The host markdown parser reparses fine and reports the new inline
node bounds. The local markdown-inline parser at that range,
however, keeps an outdated tree. I confirmed this directly in the
bugged buffer:

  (buffer-substring 8 18) => "`codium  `"

  ;; existing local parser covering (8 . 18)
  (treesit-node-string (treesit-parser-root-node pr))
    => "(inline)"

  ;; force re-set ranges to the same value
  (treesit-parser-set-included-ranges pr '((8 . 18)))
  (treesit-node-string (treesit-parser-root-node pr))
    => "(inline)"

  ;; fresh parser, same buffer, same range
  (let ((new (treesit-parser-create 'markdown-inline nil t 'embedded)))
    (treesit-parser-set-included-ranges new '((8 . 18)))
    (treesit-node-string (treesit-parser-root-node new)))
    => "(inline (code_span (code_span_delimiter)
                            (code_span_delimiter)))"

So, same buffer, same range, same grammar, resulting in different tree
depending on whether the parser was reused across edits or created
fresh.

So the grammar, the input, and the range are all fine. What is
wrong is the parser's accumulated incremental state.

Reading `treesit--update-ranges-local', the reuse path goes through:

  (treesit--set-embed-ranges range embedded-parser host-parser)
  (move-overlay ov r-start r-end)
  (overlay-put ov 'treesit-parser-ov-timestamp modified-tick)

Tree-sitter is left to apply the buffered edits on top of its old
tree. For markdown-inline plus the backtick code_span rule, that
incremental update never re-fires the rule when the closing backtick
finally arrives, so the parser stays with `(inline)' empty.

Pressing RET escapes the bug. I am not certain why, two candidates:
the newline grows the host paragraph past the overlay bounds and
`treesit--cleanup-local-range-overlays' deletes the old overlay on
the timestamp mismatch, after which a fresh parser is created; or
the larger range shift is enough to make tree-sitter invalidate the
right subtree and re-evaluate code_span. Either way the practical
outcome is the same: only a fresh parser fixes it.


My workaround on markdown-ts-mode (for debugging) 
-------------------------------------------------

I made this small interactive helper to help me find the local parser
covering point which would them delete its parser + overlay, and create
a fresh one on the same range:

  (defun my/md-recreate-inline-parser-at-point ()
    "Delete stale local markdown-inline parser+overlay covering point, recreate."
    (interactive)
    (let* ((p (point))
           (target-ov
            (catch 'f
              (dolist (ov (overlays-in (point-min) (point-max)))
                (let ((pr (overlay-get ov 'treesit-parser)))
                  (when (and pr
                             (overlay-get ov 'treesit-parser-local-p)
                             (eq (treesit-parser-language pr) 'markdown-inline)
                             (<= (overlay-start ov) p (overlay-end ov)))
                    (throw 'f ov)))))))
      (unless target-ov (user-error "No markdown-inline overlay covers point"))
      (let* ((old-pr (overlay-get target-ov 'treesit-parser))
             (host (overlay-get target-ov 'treesit-host-parser))
             (level (treesit-parser-embed-level old-pr))
             (r-start (overlay-start target-ov))
             (r-end (overlay-end target-ov)))
        (treesit-parser-delete old-pr)
        (delete-overlay target-ov)
        (let ((new (treesit-parser-create 'markdown-inline nil t 'embedded))
              (ov (make-overlay r-start r-end nil nil t)))
          (treesit-parser-set-embed-level new level)
          (overlay-put ov 'treesit-parser new)
          (overlay-put ov 'treesit-parser-local-p t)
          (overlay-put ov 'treesit-host-parser host)
          (overlay-put ov 'treesit-parser-ov-timestamp (buffer-chars-modified-tick))
          (treesit-parser-set-included-ranges new `((,r-start . ,r-end)))
          (font-lock-flush r-start r-end)
          (message "Recreated markdown-inline parser for (%d . %d)" r-start r-end)))))

This always recovers the buffer's fontification immediately.


A possible treesit.el patch
---------------------------

The change I have been testing locally is small: in
`treesit--update-ranges-local', only reuse an existing local-parser
overlay when its bounds already match the new range exactly. If the
overlay would have to move, do not reuse it. Let
`treesit--cleanup-local-range-overlays' delete it on the timestamp
mismatch and the existing "create new" branch will produce a fresh
parser on the right range.

     lisp/treesit.el | 11 +++++++++--
     1 file changed, 9 insertions(+), 2 deletions(-)

    diff --git a/lisp/treesit.el b/lisp/treesit.el
    index 01e82b56bb8..d80e4fe312d 100644
    --- a/lisp/treesit.el
    +++ b/lisp/treesit.el
    @@ -1248,10 +1248,17 @@ treesit--update-ranges-local
                                                      embedded-parser)))
                             (when (and (overlay-get ov 'treesit-parser-local-p)
                                        (eq parser-lang embedded-lang)
    -                                   (eq embed-level parser-level))
    +                                   (eq embed-level parser-level)
    +                                   ;; Only reuse if overlay bounds match
    +                                   ;; the new range exactly.  Reusing
    +                                   ;; across range moves can leave the
    +                                   ;; embedded parser with a stale
    +                                   ;; incremental tree (bug seen with
    +                                   ;; markdown-inline code_span).
    +                                   (= (overlay-start ov) r-start)
    +                                   (= (overlay-end ov) r-end))
                               (treesit--set-embed-ranges
                                range embedded-parser host-parser)
    -                          (move-overlay ov r-start r-end)
                               (overlay-put ov 'treesit-parser-ov-timestamp
                                            modified-tick)
                               (throw 'done embedded-parser)))))))


With this in place the markdown-ts reproduction fontifies as you type,
no RET needed, no recreate helper needed.

I am very aware this is potentially a sledgehammer. It forces a fresh
local parser on every range change, throwing away tree-sitter's
incremental work for that subtree. For modes that just rely on local
parsers for fontification it should be fine, but it may not be the right
answer if the rest of treesit depends on parser identity surviving
across range moves.


Where I am not sure
-------------------

1. Is this the right layer to address? My patch is in
   `treesit--update-ranges-local'. It feels like the deeper truth could
   live in `treesit.c''s edit replay when ranges shift, where
   `need_reparse' for a local parser does not get set even though its
   tree is stale. The C code is quiet on local parser treatment, so it
   is hard to tell from outside whether primary-parser reparse
   notifications are supposed to propagate to local parsers in this
   case.

2. Is there a one-liner I am missing on the elisp side? For example a
   call I should be making after `treesit-parser-set-included-ranges' to
   force the parser to throw away its cached tree.

3. Or is the right fix on the grammar side, in tree-sitter-markdown's
   incremental behaviour around backtick spans, in which case treesit
   should probably still gain a way to recover.

4. As mentioned at the top, I believe any `:local t' range rule could
   reach this state. markdown-ts is the first heavy customer, but the
   html-embedded modes look structurally similar enough that they would
   hit it too, just less often.

If the analysis is correct but the proposed fix is not, I would be happy
to revise the diff. If the analysis itself is wrong, I would also very
much appreciate corrections so we can avoid carrying the helper above.

I am mostly interested in validating the analysis here. I am not
attached to this particular fix, and would be perfectly happy if a
different implementation lands instead.

Thanks for reading,

-- 
Rahul Martim Juliato




Acknowledgement sent to Rahul Martim Juliato <rahuljuliato@HIDDEN>:
New bug report received and forwarded. Copy sent to shipmints@HIDDEN, casouri@HIDDEN, juri@HIDDEN, bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to shipmints@HIDDEN, casouri@HIDDEN, juri@HIDDEN, bug-gnu-emacs@HIDDEN:
bug#81019; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Fri, 29 May 2026 06:30:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.