From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Jackson Ray Hamilton Newsgroups: gmane.emacs.devel Subject: Re: Comprehensive JSX support in Emacs Date: Sat, 6 Apr 2019 08:55:30 -0700 Message-ID: <58f55351-67b9-a016-1a00-829c11395ffe@jacksonrayhamilton.com> References: <8f533e76-302f-bd45-9eb5-f23b0bbd0ce8@jacksonrayhamilton.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------44E1CF1FF772051C3907C1D8" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="111530"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org To: Dmitry Gutov Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Apr 06 17:56:23 2019 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hCng6-000Stq-W5 for ged-emacs-devel@m.gmane.org; Sat, 06 Apr 2019 17:56:23 +0200 Original-Received: from localhost ([127.0.0.1]:56470 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hCng6-0000vW-2N for ged-emacs-devel@m.gmane.org; Sat, 06 Apr 2019 11:56:22 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:37433) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hCnfM-0000nr-OH for emacs-devel@gnu.org; Sat, 06 Apr 2019 11:55:38 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hCnfK-00069i-Rr for emacs-devel@gnu.org; Sat, 06 Apr 2019 11:55:36 -0400 Original-Received: from mta-09-4.privateemail.com ([68.65.122.29]:55781) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hCnfK-00068o-Cl for emacs-devel@gnu.org; Sat, 06 Apr 2019 11:55:34 -0400 Original-Received: from MTA-09.privateemail.com (localhost [127.0.0.1]) by MTA-09.privateemail.com (Postfix) with ESMTP id 804CF6003F; Sat, 6 Apr 2019 11:55:31 -0400 (EDT) Original-Received: from [192.168.88.227] (unknown [10.20.151.205]) by MTA-09.privateemail.com (Postfix) with ESMTPA id 2416260034; Sat, 6 Apr 2019 15:55:31 +0000 (UTC) In-Reply-To: Content-Language: en-US X-Virus-Scanned: ClamAV using ClamSMTP X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 68.65.122.29 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:235036 Archived-At: This is a multi-part message in MIME format. --------------44E1CF1FF772051C3907C1D8 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable Hi Dmitry, First of all, thanks for taking the time to review my work. Regarding=20 your comments/questions=E2=80=A6 > It's probably still worth it to get the feature into master soon. I agree.=C2=A0 I=E2=80=99ll see if I can tackle the performance issue fir= st, then=20 I=E2=80=99ll rebase/merge the branch into master. > Do you have commit access? I=E2=80=99m not sure.=C2=A0 If not, will someone please grant it to me? > The colors are very nice to have. Do you think this approach is=20 > portable to js2-mode? Possibly=E2=80=A6=C2=A0 js-mode is using font-lock keywords to add the co= lors, but=20 js2-mode apparently isn=E2=80=99t.=C2=A0 js2-mode would need to pay atten= tion to the=20 js-jsx-* text properties like in js-jsx--font-lock-keywords and apply=20 colors like in the associated matcher functions (js-jsx--match-tag-name,=20 js-jsx--match-attribute-name, et al). I get the feeling from looking at the js2-mode code that it colors=20 solely according to the AST structure.=C2=A0 Perhaps in the long run, the= =20 best solution for that mode will be to extend or replace the ESX parsing=20 with JSX parsing, adding JSXElement nodes to the AST and coloring them=20 along the way, and suppressing JS coloring in the JSXText nodes. Until someone steps up to add proper JSX parsing to the JS2 AST=E2=80=A6 = perhaps=20 a fusion of the keywords-style and AST-style colorings could provide JSX=20 and JS coloring (respectively) in JS2. >> However, there is a noticeable delay when editing some lines in my=20 >> 1000-line monolith.jsx file,=20 > This sounds a bit worrisome. Slow font-lock rules? I=E2=80=99ll check for that.=C2=A0 I=E2=80=99m also planning on analyzing= the results of=20 elp-instrument-package and doing some step-debugging to deduce where and=20 why it=E2=80=99s lagging. I=E2=80=99ve already found that it=E2=80=99s lagging when I=E2=80=99m edi= ting a large chunk of=20 JSX code or the code before it.=C2=A0 However, if I edit code in the buff= er=20 following the chunk of JSX, then the lag noticeably drops.=C2=A0 You can = see=20 this by opening the attached =E2=80=9CSlow JSX.jsx=E2=80=9D file and edit= ing it.=C2=A0 This=20 might be related to how I extended syntax propertization and=20 font-locking to the boundaries of a root enclosing JSXElement; if a root=20 is hundreds of lines long, there could be negative consequences.=C2=A0 Ma= ybe=20 we can be more conservative with the parsing/coloring, somehow. Jackson --------------44E1CF1FF772051C3907C1D8 Content-Type: text/plain; charset=UTF-8; name="Slow JSX.jsx" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Slow JSX.jsx" Y2xhc3MgQ29tcG9uZW50IHsKICByZW5kZXIgKCkgewogICAgcmV0dXJuICgKICAgICAgPGRp dj5JcyBpdCBzbG93IHRvIGVkaXQgdGhpcyBub2RlPyAgVmVyeSBtdWNoIGZvciBtZS48L2Rp dj4KICAgICkKICB9CiAgcmVuZGVyICgpIHsKICAgIHJldHVybiAoCiAgICAgIDxkaXY+CiAg ICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAg ICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVm ZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAg fSl9PjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgp ID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAg ICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicK ICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhw cj17ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZics CiAgICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVm ZiBpcyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFz cz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjog J21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdv b2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAg ICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAg ICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6 ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0p fT48L2Rpdj4KICAgICAgICA8ZGl2PlRoYXQgd2FzIHs1fSB0aGluZ3MuICBDYW4gd2UgYWRk IG1vcmU/ICB7J1llcyBJIHRoaW5rIHNvLid9PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0i Y2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjogJ21v cmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2Qs IG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAgICAg IDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAg ICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdz dHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48 L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7 CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxv dHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAg ICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1 bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAg ICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMg YmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNs YXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3Jl IHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBt b3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8 ZGl2PlRoYXQgd2FzIHsxMH0gdGhpbmdzLiAgQ2FuIHdlIGFkZCBtb3JlPyAgeydZZXMgSSB0 aGluayBzby4nfTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5j YWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAg ICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJl dHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFz cyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBz dHVmZicsCiAgICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9y ZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRp diBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBz dHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZm IGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2 PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAg ICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09m U3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAg ICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2Fs bCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAg ICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0 ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdj5UaGF0IHdhcyB7MTV9 IHRoaW5ncy4gIENhbiB3ZSBhZGQgbW9yZT8gIHsnWWVzIEkgdGhpbmsgc28uJ308L2Rpdj4K ICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7CiAgICAg ICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxvdHNPZlN0 dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAgICAgICAg ICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwo KCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAg ICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVy JwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBl eHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZm JywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0 dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNs YXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZm OiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMg Z29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAg ICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAg ICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVm ZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAg fSl9PjwvZGl2PgogICAgICAgIDxkaXY+VGhhdCB3YXMgezIwfSB0aGluZ3MuICBDYW4gd2Ug YWRkIG1vcmU/ICB7J1llcyBJIHRoaW5rIHNvLid9PC9kaXY+CiAgICAgICAgPGRpdiBjbGFz cz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjog J21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdv b2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAg ICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAg ICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6 ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0p fT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9 PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAg IGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAg ICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9 e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAog ICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYg aXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9 ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdt b3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29k LCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAg ICA8ZGl2PlRoYXQgd2FzIHsyNX0gdGhpbmdzLiAgQ2FuIHdlIGFkZCBtb3JlPyAgeydZZXMg SSB0aGluayBzby4nfTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtm dW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAg ICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlz IGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJj bGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9y ZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwg bW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAg PGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAg ICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0 dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9Pjwv ZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsK ICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90 c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAg ICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVu Y2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAg ICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBi ZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdj5UaGF0IHdhcyB7 MzB9IHRoaW5ncy4gIENhbiB3ZSBhZGQgbW9yZT8gIHsnWWVzIEkgdGhpbmsgc28uJ308L2Rp dj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7CiAg ICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxvdHNP ZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAgICAg ICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNh bGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAg ICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0 dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNz IiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0 dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3Jl IHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2 IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0 dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYg aXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+ CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAg ICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZT dHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAg ICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXY+VGhhdCB3YXMgezM1fSB0aGluZ3MuICBDYW4g d2UgYWRkIG1vcmU/ICB7J1llcyBJIHRoaW5rIHNvLid9PC9kaXY+CiAgICAgICAgPGRpdiBj bGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVm ZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlz IGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2Pgog ICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAg ICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1 ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAg IH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgo KSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAg ICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXIn CiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4 cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYn LAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1 ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXYgY2xh c3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6 ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBn b29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAg ICAgICA8ZGl2PlRoYXQgd2FzIHs0MH0gdGhpbmdzLiAgQ2FuIHdlIGFkZCBtb3JlPyAgeydZ ZXMgSSB0aGluayBzby4nfTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHBy PXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywK ICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZm IGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNz PSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAn bW9yZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29v ZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAg ICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAg ICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjog J3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9 PjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+ IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAg bG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAg ICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17 ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAg ICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBp cyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdj5UaGF0IHdh cyB7NDV9IHRoaW5ncy4gIENhbiB3ZSBhZGQgbW9yZT8gIHsnWWVzIEkgdGhpbmsgc28uJ308 L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7 CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxv dHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAg ICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1 bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAg ICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMg YmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNs YXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3Jl IHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBt b3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8 ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAg IHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1 ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9k aXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewog ICAgICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3Rz T2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAg ICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXY+VGhhdCB3YXMgezUwfSB0aGluZ3MuICBD YW4gd2UgYWRkIG1vcmU/ICB7J1llcyBJIHRoaW5rIHNvLid9PC9kaXY+CiAgICAgICAgPGRp diBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBz dHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZm IGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2 PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAg ICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09m U3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAg ICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2Fs bCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAg ICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0 ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3Mi IGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1 ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUg c3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXYg Y2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1 ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBp cyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4K ICAgICAgICA8ZGl2PlRoYXQgd2FzIHs1NX0gdGhpbmdzLiAgQ2FuIHdlIGFkZCBtb3JlPyAg eydZZXMgSSB0aGluayBzby4nfTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBl eHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZm JywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0 dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNs YXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZm OiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMg Z29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAg ICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAg ICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVm ZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAg fSl9PjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgp ID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAg ICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicK ICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhw cj17ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZics CiAgICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVm ZiBpcyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdj5UaGF0 IHdhcyB7NjB9IHRoaW5ncy4gIENhbiB3ZSBhZGQgbW9yZT8gIHsnWWVzIEkgdGhpbmsgc28u J308L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9 PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAg IGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAg ICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9 e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAog ICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYg aXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9 ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAgc3R1ZmY6ICdt b3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29k LCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rpdj4KICAgICAg ICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVuY2FsbCgoKSA9PiB7CiAgICAgICAgICAg ICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAgICAgICAgICAgIGxvdHNPZlN0dWZmOiAn c3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBiZXR0ZXInCiAgICAgICAgICAgICB9KX0+ PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4g ewogICAgICAgICAgICAgICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBs b3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAg ICAgICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxkaXY+VGhhdCB3YXMgezY1fSB0aGluZ3Mu ICBDYW4gd2UgYWRkIG1vcmU/ICB7J1llcyBJIHRoaW5rIHNvLid9PC9kaXY+CiAgICAgICAg PGRpdiBjbGFzcz0iY2xhc3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAg ICBzdHVmZjogJ21vcmUgc3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0 dWZmIGlzIGdvb2QsIG1vcmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9Pjwv ZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsK ICAgICAgICAgICAgICAgc3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90 c09mU3R1ZmY6ICdzdHVmZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAg ICAgICAgIH0pfT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGFzcyIgZXhwcj17ZnVu Y2FsbCgoKSA9PiB7CiAgICAgICAgICAgICAgIHN0dWZmOiAnbW9yZSBzdHVmZicsCiAgICAg ICAgICAgICAgIGxvdHNPZlN0dWZmOiAnc3R1ZmYgaXMgZ29vZCwgbW9yZSBzdHVmZiBpcyBi ZXR0ZXInCiAgICAgICAgICAgICB9KX0+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2xh c3MiIGV4cHI9e2Z1bmNhbGwoKCkgPT4gewogICAgICAgICAgICAgICBzdHVmZjogJ21vcmUg c3R1ZmYnLAogICAgICAgICAgICAgICBsb3RzT2ZTdHVmZjogJ3N0dWZmIGlzIGdvb2QsIG1v cmUgc3R1ZmYgaXMgYmV0dGVyJwogICAgICAgICAgICAgfSl9PjwvZGl2PgogICAgICAgIDxk aXYgY2xhc3M9ImNsYXNzIiBleHByPXtmdW5jYWxsKCgpID0+IHsKICAgICAgICAgICAgICAg c3R1ZmY6ICdtb3JlIHN0dWZmJywKICAgICAgICAgICAgICAgbG90c09mU3R1ZmY6ICdzdHVm ZiBpcyBnb29kLCBtb3JlIHN0dWZmIGlzIGJldHRlcicKICAgICAgICAgICAgIH0pfT48L2Rp dj4KICAgICAgICA8ZGl2PlRoYXQgd2FzIHs3MH0gdGhpbmdzLiAgQ2FuIHdlIGFkZCBtb3Jl PyAgeydUaGF04oCZcyBlbm91Z2ggZm9yIG5vdy4nfTwvZGl2PgogICAgICAgIDxkaXY+SXMg aXQgc2xvdyB0byBlZGl0IHRoaXMgbm9kZT8gIFZlcnkgbXVjaCBmb3IgbWUuPC9kaXY+CiAg ICAgIDwvZGl2PgogICAgKQogIH0KICByZW5kZXIgKCkgewogICAgcmV0dXJuICgKICAgICAg PGRpdj5JcyBpdCBzbG93IHRvIGVkaXQgdGhpcyBub2RlPyAgTm90IGF0IGFsbCBmb3IgbWUu PC9kaXY+CiAgICApCiAgfQp9Cg== --------------44E1CF1FF772051C3907C1D8--