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--
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.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=
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.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 <<a href=3D= "mailto:rahuljuliato@HIDDEN">rahuljuliato@HIDDEN</a>> 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'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--
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.
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
--=-=-=--
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.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
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.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
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.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 <<a href=3D"mailto= :rahuljuliato@HIDDEN">rahuljuliato@HIDDEN</a>> 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's something special I'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 <<a href=3D"mailto:casouri@HIDDEN" tar= get=3D"_blank">casouri@HIDDEN</a>> 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> > On May 14, 2026, at 1:29=E2=80=AFPM, St=C3=A9phane Marks <<a href= =3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&g= t; wrote:<br> > <br> > On Wed, May 13, 2026 at 14:22 Rahul Martim Juliato <<a href=3D"mail= to:rahuljuliato@HIDDEN" target=3D"_blank">rahuljuliato@HIDDEN</a>>= wrote:<br> > Yuan Fu <<a href=3D"mailto:casouri@HIDDEN" target=3D"_blank">cas= ouri@HIDDEN</a>> writes:<br> > <br> > >> 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>> wrote:<br> > >> <br> > >> Hello,<br> > >> <br> > >> While debugging an "it doesn't fontify" report = against markdown-ts-mode,<br> > >> I ended up in treesit.el territory and would like a second op= inion<br> > >> before assuming I've correctly identified the layer the f= ix 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= ' with<br> > >> `:local t'. markdown-ts just exercises that path very hea= vily (one local<br> > >> `markdown-inline' 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 right<br> > >>=C2=A0 =C2=A0after the closing backtick. Do not press RET afte= rwards.<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.<b= r> > >> <br> > >> `(font-lock-flush)' + `(font-lock-ensure)' do not fix= it. Calling<br> > >> `(treesit-parser-set-included-ranges PR same-ranges)' doe= s not fix<br> > >> it either. The only thing that fixes it without typing furthe= r 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 in= line<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> "`codium=C2=A0 `&q= uot;<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> "(inline)"<br> > >> <br> > >>=C2=A0 ;; force re-set ranges to the same value<br> > >>=C2=A0 (treesit-parser-set-included-ranges pr '((8 . 18)))= <br> > >>=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br> > >>=C2=A0 =C2=A0 =3D> "(inline)"<br> > >> <br> > >>=C2=A0 ;; fresh parser, same buffer, same range<br> > >>=C2=A0 (let ((new (treesit-parser-create 'markdown-inline = nil t 'embedded)))<br> > >>=C2=A0 =C2=A0 (treesit-parser-set-included-ranges new '((8= . 18)))<br> > >>=C2=A0 =C2=A0 (treesit-node-string (treesit-parser-root-node n= ew)))<br> > >>=C2=A0 =C2=A0 =3D> "(inline (code_span (code_span_deli= miter)<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)))"<br> > >> <br> > >> So, same buffer, same range, same grammar, resulting in diffe= rent tree<br> > >> depending on whether the parser was reused across edits or cr= eated<br> > >> fresh.<br> > >> <br> > >> So the grammar, the input, and the range are all fine. What i= s<br> > >> wrong is the parser's accumulated incremental state.<br> > >> <br> > >> Reading `treesit--update-ranges-local', the reuse path go= es through:<br> > >> <br> > >>=C2=A0 (treesit--set-embed-ranges range embedded-parser host-p= arser)<br> > >>=C2=A0 (move-overlay ov r-start r-end)<br> > >>=C2=A0 (overlay-put ov 'treesit-parser-ov-timestamp modifi= ed-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, t= hat<br> > >> incremental update never re-fires the rule when the closing b= acktick<br> > >> finally arrives, so the parser stays with `(inline)' empt= y.<br> > >> <br> > >> Pressing RET escapes the bug. I am not certain why, two candi= dates:<br> > >> the newline grows the host paragraph past the overlay bounds = and<br> > >> `treesit--cleanup-local-range-overlays' deletes the old o= verlay on<br> > >> the timestamp mismatch, after which a fresh parser is created= ; or<br> > >> the larger range shift is enough to make tree-sitter invalida= te the<br> > >> right subtree and re-evaluate code_span. Either way the pract= ical<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 loca= l 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 "Delete stale local markdown-inline parser+= overlay covering point, recreate."<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 '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 'treesit-parser)))<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= (when (and pr<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 '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(eq (treesit-parser-language pr) = 'markdown-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(<=3D (overlay-start ov) p (ov= erlay-end ov)))<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 (throw 'f ov)))))))<br> > >>=C2=A0 =C2=A0 =C2=A0 (unless target-ov (user-error "No ma= rkdown-inline overlay covers point"))<br> > >>=C2=A0 =C2=A0 =C2=A0 (let* ((old-pr (overlay-get target-ov = 9;treesit-parser))<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(host (overlay= -get target-ov 'treesit-host-parser))<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(level (treesi= t-parser-embed-level old-pr))<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-start (over= lay-start target-ov))<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-end (overla= y-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 = 'markdown-inline nil t 'embedded))<br> > >>=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> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-embed-l= evel new level)<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesi= t-parser new)<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesi= t-parser-local-p t)<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesi= t-host-parser host)<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesi= t-parser-ov-timestamp (buffer-chars-modified-tick))<br> > >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-include= d-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 "Recreated ma= rkdown-inline parser for (%d . %d)" r-start r-end)))))<br> > >> <br> > >> This always recovers the buffer's fontification immediate= ly.<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', only reuse an existing lo= cal-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' delete it on the = timestamp<br> > >> mismatch and the existing "create new" branch will = produce a fresh<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 deletio= ns(-)<br> > >> <br> > >>=C2=A0 =C2=A0 diff --git a/lisp/treesit.el b/lisp/treesit.el<b= r> > >>=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-l= ocal<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 't= reesit-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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 (eq parser-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 reuse 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 new 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;; embedded 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;; incremental 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;; markdown-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 (overlay-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 (overlay-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 hos= t-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 (move-overlay ov r-start r-en= d)<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 'trees= it-parser-ov-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 '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= 's<br> > >> incremental work for that subtree. For modes that just rely o= n local<br> > >> parsers for fontification it should be fine, but it may not b= e the right<br> > >> answer if the rest of treesit depends on parser identity surv= iving<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'. It feels like= the deeper truth could<br> > >>=C2=A0 =C2=A0live in `treesit.c''s edit replay when ra= nges shift, where<br> > >>=C2=A0 =C2=A0`need_reparse' for a local parser does not ge= t set even though its<br> > >>=C2=A0 =C2=A0tree is stale. The C code is quiet on local parse= r treatment, so it<br> > >>=C2=A0 =C2=A0is hard to tell from outside whether primary-pars= er reparse<br> > >>=C2=A0 =C2=A0notifications are supposed to propagate to local = parsers in this<br> > >>=C2=A0 =C2=A0case.<br> > >> <br> > >> 2. Is there a one-liner I am missing on the elisp side? For e= xample a<br> > >>=C2=A0 =C2=A0call I should be making after `treesit-parser-set= -included-ranges' to<br> > >>=C2=A0 =C2=A0force the parser to throw away its cached tree.<b= r> > >> <br> > >> 3. Or is the right fix on the grammar side, in tree-sitter-ma= rkdown's<br> > >>=C2=A0 =C2=A0incremental behaviour around backtick spans, in w= hich case treesit<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' rang= e rule could<br> > >>=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 eno= ugh 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 wou= ld 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 help= er 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> > >> <br> > >> Thanks for reading,<br> > ><br> > > 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> > ><br> > > 1. Type `code` RET<br> > > 2. Type `code`<br> > ><br> > > And at this point the second `code` should be unfortified? Even w= ith<br> > > latest master and tree-sitter, I can=E2=80=99t reproduce it. And = if I get<br> > > latest markdown without my patch, opening a markdown file just cr= ashes<br> > > Emacs. I=E2=80=99ll try to get my patch merged upstream.<br> > ><br> > > Yuan<br> > <br> > <br> > Hi there Yuan!<br> > <br> > Thanks for helping!<br> > <br> > I'm on master, stopped on:<br> > <br> > *=C2=A0 (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 = ; *<br> >=C2=A0 =C2=A0 lisp/treesit.el (treesit--update-ranges-local): Fix let-b= inding.<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't trigger). Also, if you copy/paste and = then<br> > edit it, the bug won't trigger, only on "manual typing".= <br> > <br> > I tested using M-: (insert-char ?`) RET and this *does* trigger the bu= g.<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<br> > everything installed is happening on #bug81023<br> > <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> > <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/markd= own-ts-mode/" rel=3D"noreferrer" target=3D"_blank">https://github.com/Liony= xML/emacs-mirror/commits/feat/markdown-ts-mode/</a>.<br> > <br> > <br> > Let me know if we can help you with anything else. <br> > <br> > 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's "hack" 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--
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.
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's something special I'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 <<a href=3D"mailto:casouri@HIDDEN">casouri@HIDDEN</a>> 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>
> On May 14, 2026, at 1:29=E2=80=AFPM, St=C3=A9phane Marks <<a href=
=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&g=
t; wrote:<br>
> <br>
> On Wed, May 13, 2026 at 14:22 Rahul Martim Juliato <<a href=3D"mail=
to:rahuljuliato@HIDDEN" target=3D"_blank">rahuljuliato@HIDDEN</a>>=
wrote:<br>
> Yuan Fu <<a href=3D"mailto:casouri@HIDDEN" target=3D"_blank">cas=
ouri@HIDDEN</a>> writes:<br>
> <br>
> >> 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>> wrote:<br>
> >> <br>
> >> Hello,<br>
> >> <br>
> >> While debugging an "it doesn't fontify" report =
against markdown-ts-mode,<br>
> >> I ended up in treesit.el territory and would like a second op=
inion<br>
> >> before assuming I've correctly identified the layer the f=
ix 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=
' with<br>
> >> `:local t'. markdown-ts just exercises that path very hea=
vily (one local<br>
> >> `markdown-inline' 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 right<br>
> >>=C2=A0 =C2=A0after the closing backtick. Do not press RET afte=
rwards.<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.<b=
r>
> >> <br>
> >> `(font-lock-flush)' + `(font-lock-ensure)' do not fix=
it. Calling<br>
> >> `(treesit-parser-set-included-ranges PR same-ranges)' doe=
s not fix<br>
> >> it either. The only thing that fixes it without typing furthe=
r 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 in=
line<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> "`codium=C2=A0 `&q=
uot;<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> "(inline)"<br>
> >> <br>
> >>=C2=A0 ;; force re-set ranges to the same value<br>
> >>=C2=A0 (treesit-parser-set-included-ranges pr '((8 . 18)))=
<br>
> >>=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br>
> >>=C2=A0 =C2=A0 =3D> "(inline)"<br>
> >> <br>
> >>=C2=A0 ;; fresh parser, same buffer, same range<br>
> >>=C2=A0 (let ((new (treesit-parser-create 'markdown-inline =
nil t 'embedded)))<br>
> >>=C2=A0 =C2=A0 (treesit-parser-set-included-ranges new '((8=
. 18)))<br>
> >>=C2=A0 =C2=A0 (treesit-node-string (treesit-parser-root-node n=
ew)))<br>
> >>=C2=A0 =C2=A0 =3D> "(inline (code_span (code_span_deli=
miter)<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)))"<br>
> >> <br>
> >> So, same buffer, same range, same grammar, resulting in diffe=
rent tree<br>
> >> depending on whether the parser was reused across edits or cr=
eated<br>
> >> fresh.<br>
> >> <br>
> >> So the grammar, the input, and the range are all fine. What i=
s<br>
> >> wrong is the parser's accumulated incremental state.<br>
> >> <br>
> >> Reading `treesit--update-ranges-local', the reuse path go=
es through:<br>
> >> <br>
> >>=C2=A0 (treesit--set-embed-ranges range embedded-parser host-p=
arser)<br>
> >>=C2=A0 (move-overlay ov r-start r-end)<br>
> >>=C2=A0 (overlay-put ov 'treesit-parser-ov-timestamp modifi=
ed-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, t=
hat<br>
> >> incremental update never re-fires the rule when the closing b=
acktick<br>
> >> finally arrives, so the parser stays with `(inline)' empt=
y.<br>
> >> <br>
> >> Pressing RET escapes the bug. I am not certain why, two candi=
dates:<br>
> >> the newline grows the host paragraph past the overlay bounds =
and<br>
> >> `treesit--cleanup-local-range-overlays' deletes the old o=
verlay on<br>
> >> the timestamp mismatch, after which a fresh parser is created=
; or<br>
> >> the larger range shift is enough to make tree-sitter invalida=
te the<br>
> >> right subtree and re-evaluate code_span. Either way the pract=
ical<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 loca=
l 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 "Delete stale local markdown-inline parser+=
overlay covering point, recreate."<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 '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 'treesit-parser)))<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
(when (and pr<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 '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(eq (treesit-parser-language pr) =
'markdown-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(<=3D (overlay-start ov) p (ov=
erlay-end ov)))<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0 (throw 'f ov)))))))<br>
> >>=C2=A0 =C2=A0 =C2=A0 (unless target-ov (user-error "No ma=
rkdown-inline overlay covers point"))<br>
> >>=C2=A0 =C2=A0 =C2=A0 (let* ((old-pr (overlay-get target-ov =
9;treesit-parser))<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(host (overlay=
-get target-ov 'treesit-host-parser))<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(level (treesi=
t-parser-embed-level old-pr))<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-start (over=
lay-start target-ov))<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-end (overla=
y-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 =
'markdown-inline nil t 'embedded))<br>
> >>=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>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-embed-l=
evel new level)<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesi=
t-parser new)<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesi=
t-parser-local-p t)<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesi=
t-host-parser host)<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesi=
t-parser-ov-timestamp (buffer-chars-modified-tick))<br>
> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-include=
d-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 "Recreated ma=
rkdown-inline parser for (%d . %d)" r-start r-end)))))<br>
> >> <br>
> >> This always recovers the buffer's fontification immediate=
ly.<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', only reuse an existing lo=
cal-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' delete it on the =
timestamp<br>
> >> mismatch and the existing "create new" branch will =
produce a fresh<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 deletio=
ns(-)<br>
> >> <br>
> >>=C2=A0 =C2=A0 diff --git a/lisp/treesit.el b/lisp/treesit.el<b=
r>
> >>=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-l=
ocal<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 't=
reesit-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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 (eq parser-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 reuse 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 new 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;; embedded 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;; incremental 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;; markdown-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 (overlay-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 (overlay-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 hos=
t-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 (move-overlay ov r-start r-en=
d)<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 'trees=
it-parser-ov-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 '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=
's<br>
> >> incremental work for that subtree. For modes that just rely o=
n local<br>
> >> parsers for fontification it should be fine, but it may not b=
e the right<br>
> >> answer if the rest of treesit depends on parser identity surv=
iving<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'. It feels like=
the deeper truth could<br>
> >>=C2=A0 =C2=A0live in `treesit.c''s edit replay when ra=
nges shift, where<br>
> >>=C2=A0 =C2=A0`need_reparse' for a local parser does not ge=
t set even though its<br>
> >>=C2=A0 =C2=A0tree is stale. The C code is quiet on local parse=
r treatment, so it<br>
> >>=C2=A0 =C2=A0is hard to tell from outside whether primary-pars=
er reparse<br>
> >>=C2=A0 =C2=A0notifications are supposed to propagate to local =
parsers in this<br>
> >>=C2=A0 =C2=A0case.<br>
> >> <br>
> >> 2. Is there a one-liner I am missing on the elisp side? For e=
xample a<br>
> >>=C2=A0 =C2=A0call I should be making after `treesit-parser-set=
-included-ranges' to<br>
> >>=C2=A0 =C2=A0force the parser to throw away its cached tree.<b=
r>
> >> <br>
> >> 3. Or is the right fix on the grammar side, in tree-sitter-ma=
rkdown's<br>
> >>=C2=A0 =C2=A0incremental behaviour around backtick spans, in w=
hich case treesit<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' rang=
e rule could<br>
> >>=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 eno=
ugh 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 wou=
ld 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 help=
er 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>
> >> <br>
> >> Thanks for reading,<br>
> ><br>
> > 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>
> ><br>
> > 1. Type `code` RET<br>
> > 2. Type `code`<br>
> ><br>
> > And at this point the second `code` should be unfortified? Even w=
ith<br>
> > latest master and tree-sitter, I can=E2=80=99t reproduce it. And =
if I get<br>
> > latest markdown without my patch, opening a markdown file just cr=
ashes<br>
> > Emacs. I=E2=80=99ll try to get my patch merged upstream.<br>
> ><br>
> > Yuan<br>
> <br>
> <br>
> Hi there Yuan!<br>
> <br>
> Thanks for helping!<br>
> <br>
> I'm on master, stopped on:<br>
> <br>
> *=C2=A0 (origin/master, origin/HEAD)61e9dfe5f7d..: Yuan Fu 2026-05-05 =
; *<br>
>=C2=A0 =C2=A0 lisp/treesit.el (treesit--update-ranges-local): Fix let-b=
inding.<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't trigger). Also, if you copy/paste and =
then<br>
> edit it, the bug won't trigger, only on "manual typing".=
<br>
> <br>
> I tested using M-: (insert-char ?`) RET and this *does* trigger the bu=
g.<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<br>
> everything installed is happening on #bug81023<br>
> <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>
> <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/markd=
own-ts-mode/" rel=3D"noreferrer" target=3D"_blank">https://github.com/Liony=
xML/emacs-mirror/commits/feat/markdown-ts-mode/</a>.<br>
> <br>
> <br>
> Let me know if we can help you with anything else. <br>
> <br>
> 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--
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.
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--
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.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 <<a href=3D"mailto:rahulj= uliato@HIDDEN">rahuljuliato@HIDDEN</a>> 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 <<a href=3D"mailto:casouri@gmai= l.com" target=3D"_blank">casouri@HIDDEN</a>> writes:<br> <br> >> On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato <<a = href=3D"mailto:rahuljuliato@HIDDEN" target=3D"_blank">rahuljuliato@gmail= .com</a>> wrote:<br> >> <br> >> Hello,<br> >> <br> >> While debugging an "it doesn't fontify" report again= st markdown-ts-mode,<br> >> I ended up in treesit.el territory and would like a second opinion= <br> >> before assuming I've correctly identified the layer the fix be= longs in.<br> >> <br> >> The bug shows up easily in markdown-ts-mode but I suspect it can h= it any<br> >> major mode that drives local parsers via `treesit-range-rules'= with<br> >> `:local t'. markdown-ts just exercises that path very heavily = (one local<br> >> `markdown-inline' parser per paragraph), so we are likely seei= ng<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 stop= ping right<br> >>=C2=A0 =C2=A0after the closing backtick. Do not press RET afterward= s.<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)' + `(font-lock-ensure)' do not fix it. = Calling<br> >> `(treesit-parser-set-included-ranges PR same-ranges)' 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 cove= rs<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> "`codium=C2=A0 `"<= 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> "(inline)"<br> >> <br> >>=C2=A0 ;; force re-set ranges to the same value<br> >>=C2=A0 (treesit-parser-set-included-ranges pr '((8 . 18)))<br> >>=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br> >>=C2=A0 =C2=A0 =3D> "(inline)"<br> >> <br> >>=C2=A0 ;; fresh parser, same buffer, same range<br> >>=C2=A0 (let ((new (treesit-parser-create 'markdown-inline nil t= 'embedded)))<br> >>=C2=A0 =C2=A0 (treesit-parser-set-included-ranges new '((8 . 18= )))<br> >>=C2=A0 =C2=A0 (treesit-node-string (treesit-parser-root-node new)))= <br> >>=C2=A0 =C2=A0 =3D> "(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)))"<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's accumulated incremental state.<br> >> <br> >> Reading `treesit--update-ranges-local', the reuse path goes th= rough:<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 'treesit-parser-ov-timestamp modified-ti= ck)<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<b= r> >> incremental update never re-fires the rule when the closing backti= ck<br> >> finally arrives, so the parser stays with `(inline)' 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<b= r> >> `treesit--cleanup-local-range-overlays' deletes the old overla= y 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 th= e<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 par= ser<br> >> covering point which would them delete its parser + overlay, and c= reate<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 "Delete stale local markdown-inline parser+overl= ay covering point, recreate."<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 'f<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolist (ov (overl= ays-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 'treesit-parser)))<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (whe= n (and pr<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 'treesit-parser-l= ocal-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) '= ;markdown-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(<=3D (overlay-start ov) p (overla= y-end ov)))<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 (throw 'f ov)))))))<br> >>=C2=A0 =C2=A0 =C2=A0 (unless target-ov (user-error "No markdow= n-inline overlay covers point"))<br> >>=C2=A0 =C2=A0 =C2=A0 (let* ((old-pr (overlay-get target-ov 'tre= esit-parser))<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(host (overlay-get = target-ov 'treesit-host-parser))<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(level (treesit-par= ser-embed-level old-pr))<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-start (overlay-s= tart target-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 '= markdown-inline nil t '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 level)<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesit-par= ser new)<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesit-par= ser-local-p t)<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesit-hos= t-parser host)<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesit-par= ser-ov-timestamp (buffer-chars-modified-tick))<br> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-included-ran= ges 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 "Recreated markdow= n-inline parser for (%d . %d)" r-start r-end)))))<br> >> <br> >> This always recovers the buffer's fontification immediately.<b= r> >> <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', only reuse an existing local-p= arser<br> >> overlay when its bounds already match the new range exactly. If th= e<br> >> overlay would have to move, do not reuse it. Let<br> >> `treesit--cleanup-local-range-overlays' delete it on the times= tamp<br> >> mismatch and the existing "create new" branch will produ= ce a fresh<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 'trees= it-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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (= eq parser-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(e= q 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(e= q 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 reuse 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 new 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;;= embedded 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;;= incremental 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;;= markdown-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 (overlay-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 (overlay-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-pa= rser)<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 (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 'treesit-p= arser-ov-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 'done embedded-pars= er)))))))<br> >> <br> >> <br> >> With this in place the markdown-ts reproduction fontifies as you t= ype,<br> >> no RET needed, no recreate helper needed.<br> >> <br> >> I am very aware this is potentially a sledgehammer. It forces a fr= esh<br> >> local parser on every range change, throwing away tree-sitter'= s<br> >> incremental work for that subtree. For modes that just rely on loc= al<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'. It feels like the = deeper truth could<br> >>=C2=A0 =C2=A0live in `treesit.c''s edit replay when ranges = shift, where<br> >>=C2=A0 =C2=A0`need_reparse' for a local parser does not get set= even though its<br> >>=C2=A0 =C2=A0tree is stale. The C code is quiet on local parser tre= atment, so it<br> >>=C2=A0 =C2=A0is hard to tell from outside whether primary-parser re= parse<br> >>=C2=A0 =C2=A0notifications are supposed to propagate to local parse= rs in this<br> >>=C2=A0 =C2=A0case.<br> >> <br> >> 2. Is there a one-liner I am missing on the elisp side? For exampl= e a<br> >>=C2=A0 =C2=A0call I should be making after `treesit-parser-set-incl= uded-ranges' 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-markdow= n's<br> >>=C2=A0 =C2=A0incremental behaviour around backtick spans, in which = case treesit<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' range rul= e could<br> >>=C2=A0 =C2=A0reach this state. markdown-ts is the first heavy custo= mer, but the<br> >>=C2=A0 =C2=A0html-embedded modes look structurally similar enough t= hat 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 ab= ove.<br> >> <br> >> I am mostly interested in validating the analysis here. I am not<b= r> >> attached to this particular fix, and would be perfectly happy if a= <br> >> different implementation lands instead.<br> >> <br> >> Thanks for reading,<br> ><br> > 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> ><br> > 1. Type `code` RET<br> > 2. Type `code`<br> ><br> > And at this point the second `code` should be unfortified? Even with<b= r> > latest master and tree-sitter, I can=E2=80=99t reproduce it. And if I = get<br> > latest markdown without my patch, opening a markdown file just crashes= <br> > Emacs. I=E2=80=99ll try to get my patch merged upstream.<br> ><br> > Yuan<br> <br> <br> Hi there Yuan!<br> <br> Thanks for helping!<br> <br> I'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't trigger). Also, if you copy/paste and then<= br> edit it, the bug won't trigger, only on "manual typing".<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--
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.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 --=-=-=--
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.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 <<a href=3D"mailto:caso= uri@HIDDEN">casouri@HIDDEN</a>> 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> > On May 11, 2026, at 10:11=E2=80=AFAM, Rahul Martim Juliato <<a href= =3D"mailto:rahuljuliato@HIDDEN" target=3D"_blank">rahuljuliato@HIDDEN= </a>> wrote:<br> > <br> > Hello,<br> > <br> > While debugging an "it doesn't fontify" report against m= arkdown-ts-mode,<br> > I ended up in treesit.el territory and would like a second opinion<br> > before assuming I've correctly identified the layer the fix belong= s in.<br> > <br> > The bug shows up easily in markdown-ts-mode but I suspect it can hit a= ny<br> > major mode that drives local parsers via `treesit-range-rules' wit= h<br> > `:local t'. markdown-ts just exercises that path very heavily (one= local<br> > `markdown-inline' parser per paragraph), so we are likely seeing<b= r> > 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= right<br> >=C2=A0 =C2=A0after the closing backtick. Do not press RET afterwards.<b= r> > <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)' + `(font-lock-ensure)' do not fix it. Call= ing<br> > `(treesit-parser-set-included-ranges PR same-ranges)' 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<b= r> > 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> "`codium=C2=A0 `"<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> "(inline)"<br> > <br> >=C2=A0 ;; force re-set ranges to the same value<br> >=C2=A0 (treesit-parser-set-included-ranges pr '((8 . 18)))<br> >=C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br> >=C2=A0 =C2=A0 =3D> "(inline)"<br> > <br> >=C2=A0 ;; fresh parser, same buffer, same range<br> >=C2=A0 (let ((new (treesit-parser-create 'markdown-inline nil t = 9;embedded)))<br> >=C2=A0 =C2=A0 (treesit-parser-set-included-ranges new '((8 . 18)))<= br> >=C2=A0 =C2=A0 (treesit-node-string (treesit-parser-root-node new)))<br> >=C2=A0 =C2=A0 =3D> "(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)))"<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's accumulated incremental state.<br> > <br> > Reading `treesit--update-ranges-local', the reuse path goes throug= h:<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 '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<b= r> > finally arrives, so the parser stays with `(inline)' 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' 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 creat= e<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 "Delete stale local markdown-inline parser+overlay c= overing point, recreate."<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 '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 (over= lay-get ov 'treesit-parser)))<br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (a= nd pr<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 '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) 'mar= kdown-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(<=3D (overlay-start ov) p (overlay-en= d ov)))<br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (= throw 'f ov)))))))<br> >=C2=A0 =C2=A0 =C2=A0 (unless target-ov (user-error "No markdown-in= line overlay covers point"))<br> >=C2=A0 =C2=A0 =C2=A0 (let* ((old-pr (overlay-get target-ov 'treesit= -parser))<br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(host (overlay-get targ= et-ov 'treesit-host-parser))<br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(level (treesit-parser-= embed-level old-pr))<br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-start (overlay-start= target-ov))<br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(r-end (overlay-end tar= get-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 'mark= down-inline nil t 'embedded))<br> >=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> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (treesit-parser-set-embed-level new = level)<br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesit-parser = new)<br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesit-parser-= local-p t)<br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesit-host-pa= rser host)<br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesit-parser-= ov-timestamp (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 "Recreated markdown-in= line parser for (%d . %d)" r-start r-end)))))<br> > <br> > This always recovers the buffer'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', only reuse an existing local-parse= r<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' delete it on the timestamp= <br> > mismatch and the existing "create new" branch will produce a= fresh<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 'treesit-p= arser-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 p= arser-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 em= bed-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 em= bed-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;; Onl= y reuse 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= new 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;; acr= oss 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;; emb= edded 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;; inc= remental 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;; mar= kdown-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 (= overlay-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 (= overlay-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= )<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 (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 'treesit-parse= r-ov-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 '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's<br= > > incremental work for that subtree. For modes that just rely on local<b= r> > parsers for fontification it should be fine, but it may not be the rig= ht<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'. It feels like the deep= er truth could<br> >=C2=A0 =C2=A0live in `treesit.c''s edit replay when ranges shif= t, where<br> >=C2=A0 =C2=A0`need_reparse' for a local parser does not get set eve= n though its<br> >=C2=A0 =C2=A0tree is stale. The C code is quiet on local parser treatme= nt, so it<br> >=C2=A0 =C2=A0is hard to tell from outside whether primary-parser repars= e<br> >=C2=A0 =C2=A0notifications are supposed to propagate to local parsers i= n this<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= -ranges' 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= 9;s<br> >=C2=A0 =C2=A0incremental behaviour around backtick spans, in which case= treesit<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' range rule co= uld<br> >=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 hap= py<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> > <br> > 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 'markdown-inline parsers.=C2=A0 I'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--
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.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=
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.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 <<a href=3D= "mailto:rahuljuliato@HIDDEN">rahuljuliato@HIDDEN</a>> 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 "it doesn't fontify" report against markdo= wn-ts-mode,<br> I ended up in treesit.el territory and would like a second opinion<br> before assuming I'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' with<br> `:local t'. markdown-ts just exercises that path very heavily (one loca= l<br> `markdown-inline' 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)' + `(font-lock-ensure)' do not fix it. Calling<b= r> `(treesit-parser-set-included-ranges PR same-ranges)' 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> "`codium=C2=A0 `"<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> "(inline)"<br> <br> =C2=A0 ;; force re-set ranges to the same value<br> =C2=A0 (treesit-parser-set-included-ranges pr '((8 . 18)))<br> =C2=A0 (treesit-node-string (treesit-parser-root-node pr))<br> =C2=A0 =C2=A0 =3D> "(inline)"<br> <br> =C2=A0 ;; fresh parser, same buffer, same range<br> =C2=A0 (let ((new (treesit-parser-create 'markdown-inline nil t 'em= bedded)))<br> =C2=A0 =C2=A0 (treesit-parser-set-included-ranges new '((8 . 18)))<br> =C2=A0 =C2=A0 (treesit-node-string (treesit-parser-root-node new)))<br> =C2=A0 =C2=A0 =3D> "(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)))"<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's accumulated incremental state.<br> <br> Reading `treesit--update-ranges-local', 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 '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)' 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' 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 "Delete stale local markdown-inline parser+overlay cover= ing point, recreate."<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 '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 '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 '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) '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(<=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 'f ov)))))))<br> =C2=A0 =C2=A0 =C2=A0 (unless target-ov (user-error "No markdown-inline= overlay covers point"))<br> =C2=A0 =C2=A0 =C2=A0 (let* ((old-pr (overlay-get target-ov 'treesit-par= ser))<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(host (overlay-get target-o= v '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 'markdown= -inline nil t '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 'treesit-parser new)= <br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesit-parser-loca= l-p t)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov 'treesit-host-parser= host)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (overlay-put ov '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 "Recreated markdown-inline= parser for (%d . %d)" r-start r-end)))))<br> <br> This always recovers the buffer'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', 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' delete it on the timestamp<br> mismatch and the existing "create new" 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 '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 '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 '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'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'. It feels like the deeper t= ruth could<br> =C2=A0 =C2=A0live in `treesit.c''s edit replay when ranges shift, w= here<br> =C2=A0 =C2=A0`need_reparse' 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' 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'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' 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'm noticing more and more (I= 've switched completely to markdown-ts-mode and no longer using markdow= n-mode so I've been eating our own dog food).</div></div></div> --0000000000002983010651a11196--
bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.
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
Rahul Martim Juliato <rahuljuliato@HIDDEN>:shipmints@HIDDEN, casouri@HIDDEN, juri@HIDDEN, bug-gnu-emacs@HIDDEN.
Full text available.shipmints@HIDDEN, casouri@HIDDEN, juri@HIDDEN, bug-gnu-emacs@HIDDEN:bug#81019; Package emacs.
Full text available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.