From f7e1a9d5973f3c7994319f57a16747d7ab4844e3 Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Fri, 9 Dec 2022 09:00:07 +0300 Subject: [PATCH] refac connections --- grammar.js | 66 ++-- src/grammar.json | 350 +++++++++++---------- src/node-types.json | 25 +- src/parser.c | Bin 83068 -> 101295 bytes test/corpus/container.txt | 104 ++++-- test/corpus/shape.txt | 70 ++--- test/{corpus => old_corpus}/attributes.txt | 0 test/old_corpus/connection.txt | 198 ++++++++++++ test/old_corpus/container.txt | 97 ++++++ test/old_corpus/shape.txt | 134 ++++++++ tree-sitter-d2.wasm | Bin 15865 -> 22751 bytes 11 files changed, 774 insertions(+), 270 deletions(-) rename test/{corpus => old_corpus}/attributes.txt (100%) create mode 100644 test/old_corpus/connection.txt create mode 100644 test/old_corpus/container.txt create mode 100644 test/old_corpus/shape.txt diff --git a/grammar.js b/grammar.js index 5a822ba..9b8fae1 100644 --- a/grammar.js +++ b/grammar.js @@ -1,8 +1,10 @@ const PREC = { COMMENT: -2, - IDENTIFIER: 11, - SHAPE: 10, CONTAINER: 9, + CONNECTION: 9, + SHAPE: 11, + IDENTIFIER: 12, + ARROW: 13, }; spaces = /[ \t]/; @@ -18,6 +20,7 @@ module.exports = grammar({ word: ($) => $._word, conflicts: ($) => [ + [$._connection_path, $.container], //[$.shape_key], /* [$._shape_path], @@ -32,7 +35,26 @@ module.exports = grammar({ rules: { source_file: ($) => repeat($._new_root_definition), - _new_root_definition: ($) => choice($._eol, $.shape, $.container), + _new_root_definition: ($) => + choice($._eol, seq(choice($.shape, $.container, $.connection), $._end)), + + connection: ($) => + seq( + $._connection_path, + repeat1(seq($._arrow, $._connection_path)), + optional(seq($._colon, $.label)) + ), + + _connection_path: ($) => + seq( + repeat( + prec( + PREC.CONNECTION, + seq(alias($.shape_key, $.container_key), $._dot) + ) + ), + $.shape_key + ), container: ($) => prec( @@ -40,7 +62,7 @@ module.exports = grammar({ seq( alias($.shape_key, $.container_key), choice( - seq($._dot, $.shape), + seq($._dot, choice($.shape, $.container)), seq( seq( optional(seq($._colon, optional($.label))), @@ -61,23 +83,16 @@ module.exports = grammar({ optional(seq($._colon, optional($.label))), optional(seq(alias($._new_shape_block, $.block))) ) - ), - $._end + ) ) ), shape_key: ($) => choice( $.string, - prec.left( - seq( - optional($._dash), - choice( - $._word, - token(prec(PREC.IDENTIFIER, /([\w\d]+( +|\-)[\w\d]+)+/)) - ), - optional($._dash) - ) + seq( + token(prec(PREC.IDENTIFIER, /\-?([\w\d]+|([\w\d]+( +|\-)[\w\d]+)+)/)), + optional($._dash) ) ), @@ -93,7 +108,10 @@ module.exports = grammar({ ), _new_container_block_definition: ($) => - prec(PREC.CONTAINER, choice($._eol, $.shape, $.container)), + prec( + PREC.CONTAINER, + choice($._eol, seq(choice($.shape, $.container), $._end)) + ), // -------------------------------------------- @@ -107,16 +125,6 @@ module.exports = grammar({ $._shape_definition ), - connection: ($) => - seq( - $._shape_path, - repeat1(seq($._arrow, $._shape_path)), - optional( - choice(seq($.dot, $._connection_attribute), seq($._colon, $.label)) - ), - $._end - ), - _shape_definition: ($) => seq( $._shape_path, @@ -237,14 +245,14 @@ module.exports = grammar({ _colon: ($) => seq(":"), - _arrow: ($) => seq(spaces, $.arrow), + _arrow: ($) => seq($.arrow), - arrow: ($) => choice(/-+>/, /--+/, /<-+/, /<-+>/), + arrow: ($) => token(prec(PREC.ARROW, choice(/-+>/, /--+/, /<-+/, /<-+>/))), _dot: ($) => seq($.dot), dot: ($) => token("."), - _unquoted_string: ($) => token(prec(5, /[\w\-]([^'"`\n;{}]*[\w\-])?/)), + _unquoted_string: ($) => token(prec(5, /[\w\-?!]([^'"`\n;{}]*[\w\-?!])?/)), string: ($) => choice( diff --git a/src/grammar.json b/src/grammar.json index d6bdea1..ad1a7f4 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -16,13 +16,111 @@ "type": "SYMBOL", "name": "_eol" }, + { + "type": "SEQ", + "members": [ + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "shape" + }, + { + "type": "SYMBOL", + "name": "container" + }, + { + "type": "SYMBOL", + "name": "connection" + } + ] + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] + } + ] + }, + "connection": { + "type": "SEQ", + "members": [ { "type": "SYMBOL", - "name": "shape" + "name": "_connection_path" + }, + { + "type": "REPEAT1", + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_arrow" + }, + { + "type": "SYMBOL", + "name": "_connection_path" + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_colon" + }, + { + "type": "SYMBOL", + "name": "label" + } + ] + }, + { + "type": "BLANK" + } + ] + } + ] + }, + "_connection_path": { + "type": "SEQ", + "members": [ + { + "type": "REPEAT", + "content": { + "type": "PREC", + "value": 9, + "content": { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "shape_key" + }, + "named": true, + "value": "container_key" + }, + { + "type": "SYMBOL", + "name": "_dot" + } + ] + } + } }, { "type": "SYMBOL", - "name": "container" + "name": "shape_key" } ] }, @@ -52,8 +150,17 @@ "name": "_dot" }, { - "type": "SYMBOL", - "name": "shape" + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "shape" + }, + { + "type": "SYMBOL", + "name": "container" + } + ] } ] }, @@ -125,7 +232,7 @@ }, "shape": { "type": "PREC", - "value": 10, + "value": 11, "content": { "type": "SEQ", "members": [ @@ -196,10 +303,6 @@ "type": "BLANK" } ] - }, - { - "type": "SYMBOL", - "name": "_end" } ] } @@ -212,63 +315,38 @@ "name": "string" }, { - "type": "PREC_LEFT", - "value": 0, - "content": { - "type": "SEQ", - "members": [ - { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "_dash" - }, - { - "type": "BLANK" - } - ] - }, - { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "_word" - }, - { - "type": "TOKEN", - "content": { - "type": "PREC", - "value": 11, - "content": { - "type": "PATTERN", - "value": "([\\w\\d]+( +|\\-)[\\w\\d]+)+" - } - } - } - ] - }, - { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "_dash" - }, - { - "type": "BLANK" - } - ] + "type": "SEQ", + "members": [ + { + "type": "TOKEN", + "content": { + "type": "PREC", + "value": 12, + "content": { + "type": "PATTERN", + "value": "\\-?([\\w\\d]+|([\\w\\d]+( +|\\-)[\\w\\d]+)+)" + } } - ] - } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_dash" + }, + { + "type": "BLANK" + } + ] + } + ] } ] }, "_new_shape_block": { "type": "PREC", - "value": 10, + "value": 11, "content": { "type": "SEQ", "members": [ @@ -292,7 +370,7 @@ }, "_new_shape_block_definition": { "type": "PREC", - "value": 10, + "value": 11, "content": { "type": "CHOICE", "members": [ @@ -338,12 +416,26 @@ "name": "_eol" }, { - "type": "SYMBOL", - "name": "shape" - }, - { - "type": "SYMBOL", - "name": "container" + "type": "SEQ", + "members": [ + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "shape" + }, + { + "type": "SYMBOL", + "name": "container" + } + ] + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] } ] } @@ -369,74 +461,6 @@ } ] }, - "connection": { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "_shape_path" - }, - { - "type": "REPEAT1", - "content": { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "_arrow" - }, - { - "type": "SYMBOL", - "name": "_shape_path" - } - ] - } - }, - { - "type": "CHOICE", - "members": [ - { - "type": "CHOICE", - "members": [ - { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "dot" - }, - { - "type": "SYMBOL", - "name": "_connection_attribute" - } - ] - }, - { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "_colon" - }, - { - "type": "SYMBOL", - "name": "label" - } - ] - } - ] - }, - { - "type": "BLANK" - } - ] - }, - { - "type": "SYMBOL", - "name": "_end" - } - ] - }, "_shape_definition": { "type": "SEQ", "members": [ @@ -1084,10 +1108,6 @@ "_arrow": { "type": "SEQ", "members": [ - { - "type": "PATTERN", - "value": "[ \\t]" - }, { "type": "SYMBOL", "name": "arrow" @@ -1095,25 +1115,32 @@ ] }, "arrow": { - "type": "CHOICE", - "members": [ - { - "type": "PATTERN", - "value": "-+>" - }, - { - "type": "PATTERN", - "value": "--+" - }, - { - "type": "PATTERN", - "value": "<-+" - }, - { - "type": "PATTERN", - "value": "<-+>" + "type": "TOKEN", + "content": { + "type": "PREC", + "value": 13, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "PATTERN", + "value": "-+>" + }, + { + "type": "PATTERN", + "value": "--+" + }, + { + "type": "PATTERN", + "value": "<-+" + }, + { + "type": "PATTERN", + "value": "<-+>" + } + ] } - ] + } }, "_dot": { "type": "SEQ", @@ -1138,7 +1165,7 @@ "value": 5, "content": { "type": "PATTERN", - "value": "[\\w\\-]([^'\"`\\n;{}]*[\\w\\-])?" + "value": "[\\w\\-?!]([^'\"`\\n;{}]*[\\w\\-?!])?" } } }, @@ -1299,7 +1326,12 @@ "name": "line_comment" } ], - "conflicts": [], + "conflicts": [ + [ + "_connection_path", + "container" + ] + ], "precedences": [], "externals": [], "inline": [], diff --git a/src/node-types.json b/src/node-types.json index 08d15be..3c813bb 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -1,9 +1,4 @@ [ - { - "type": "arrow", - "named": true, - "fields": {} - }, { "type": "attr_key", "named": true, @@ -87,14 +82,6 @@ "type": "arrow", "named": true }, - { - "type": "attr_key", - "named": true - }, - { - "type": "attr_value", - "named": true - }, { "type": "container_key", "named": true @@ -126,6 +113,10 @@ "type": "block", "named": true }, + { + "type": "container", + "named": true + }, { "type": "container_key", "named": true @@ -248,6 +239,10 @@ "multiple": true, "required": false, "types": [ + { + "type": "connection", + "named": true + }, { "type": "container", "named": true @@ -300,6 +295,10 @@ "type": "animated", "named": false }, + { + "type": "arrow", + "named": true + }, { "type": "border-radius", "named": false diff --git a/src/parser.c b/src/parser.c index a0e3f0fd526b48cab3ddc81c2cc8e33b6aa4c1ff..bc35e889d4a348fceedb756cdaa0b5354c28a60e 100644 GIT binary patch literal 101295 zcmeHwYjYbnvgrNnUoq=cMbcKBtC`_5uPsGp5?2&CYsq_ZF0(aDOCyVAiqw+SIzBo6 z@3+xC02+hGa5%IRTjQ;*P(Y*6X!Hw>$9yuKU(D_<^XRMfGS9QsbiK}(|MzyXT;==S(~Ic#ZguUen*z`>zlkGEsGB z|NYaqPfuiJ?+>DA_2wqa zUN4rH(brM@85B(Je#=DR>UwgUXRq=%*?RFRpT|(2VEueCM}U)WpB){Kpg1*(pUL8m zC`R;`lhrlAbydM~u~=u5^?E7rLru@Xuv)*FC0**~{MPjmLGN0Z|)}VRN#$-&2WhPH%)A=g_spo&4 z|7Og8Qew;EZh1j$nJkx!*Vp+3(VDDTPnIup8khlP^5^*J31~R;iA{Ru- ze)((yu zNhmBpM~zh3C;_J?I1?mM)r;BULdafM&2_mlGsy0084ySm9hpL;7=nmO03~FKNzzJn z6;}ZD3>nqc9Fcm zO?m;tW`u!|;1?i*BgJgutZ`h1CRl7{7)dE4MhBlcR+pwQT%;;;kfeT8Ei|d;(io~1 zD$^rVF`G_S=+X3S7H$c6`u58Q4_51m2t}ZJwT>>XC(G!s#UE>I_+l~3=98OzHU1}H z6<&1=6)*0lU_Z%M!jy=rhw$Hr!W)fIb%fi+VsyY%;d8$Tr{ujbF+~&Ue8?jseqRKRy6yzfS1wC#PLm>=;{rb?4 zD6tSFC4wlbL9l=M@uU`>lz_!l^Ee0LctNSVlkX7X*RplM(*IKe7Qqize5pHQ@efw9 zzcmngy;3lQ(5?#I42)LcR1sMJsX@w)m#}I`^u`(-Dky-G29C zo0UaTMr%YhYc0ZhSy@6+iqIt#q3~2XP?Tqs4+CY)17M;m>>Y1x76rf!Lq`~-r8Dg- z)fx7zC@QeKqfj{`q`!qGS~2PQ+1Z;Lh(aSBkKRmftD;dmMzupz6nzn=VwIE}v>Ae! z!bu1!eRb5(4pEgOr>NBg)8VQDqasbA3|)~z@rSOmf>(qwO3m(65L*c-gIPruvckls zY={EF5)%j{6NF5psE~P*Kf2fiml3W)DGE#w73eA$EHQy}ysMz7$OL0yuYxPeOh6g^ zDkxE4g1|5#$z_a^idSXM2~Dzg~~Oc6IL za4IsvWW;RnO%|Gv)+tI11fW z_b1<()rQoYRWgoOZAAfshzVs8yd;7ZDKJ;)F5z8usv#I?7S)R$b%_FEWf;OM%o-NU zRRbv3k$r)b3KR&sB#B7-CmgfzUoyHk3RLTIY%UR%%e@UsvA5`@+?IiuXw>L*xbJEo zY{ZZow3l!*FojNeZqccB+DL+m|Mg$0on8T8rD;Rt8UU-f6#=IPn+uXg`b(oM)&bZG zezOW%2~fqn6qwmDzre55(XK|kvYrVYi-!HRM&q(5^Ppa$@WGgfJPQCm5=){AdTm7I zX?F|^k$K<@gfvI4ftfY_MlQQc6cvWo^a51nGO0xk_2geWz$UmWx$Ven%QeJL`Fe6W zSx@*{qA03bP>9TT6n*}m>1z4{w~4MMvsErggi?_p7yAYKEeW7Y1k zSkG_Q*tP1nFezqM&za5#SXd>U4pHOEnB2lL;W5NU+dsM-s-n7OpxZ z=?sL0W;>EFnznFlK$4I@o~GDT7bKY_^`g9nMTmsnV74|TK#i?Lfy|F=L4)80%a&|P zi5#5PNL+h4woEOW)F2pRY;<}B+khmEMCD|*Cr4*%EF6;j;D}T@!1YVd9B@m zv*ne&K78jyy4jq&mhVn<8}ZwPjpd4*h&Q9N)~ZF)$}~k~psZ=!tp9-X+z^4!eQwsA zawJX$%FzZjL7a4Sw%)9Jv2(srt`@x zBRu>B1cobe@8dJN$U>J>RN|1*lmQapJhepvBu(LLaQ@^{&~UqiTM^4QaA^RFvgze& z%q|ScvC>HKZ1xx#fJd;$C{2_C#`u&r%Q~VJ9+w_>#ZNp8J?@F0c<_1L7eDck^LQYB z;(_MzQ2fO6;Nut>OIKjVF?C2i#@Hp@cNxdnX-vJw*ezXb8OPW$-Derc*fm{Z8OPXp zOufh0J>5+i$4CI(LK!DW0bMy6CrAO^GZ`mD0Szia3g|Y;I6(>$8hL^g(Cv|Nf)vnw zk#T|)Bt$`i6ePrf1Sz09ALA4$pz9vv6e*y)9^(`#pt~L8lo(GuNRa}%zcEgcf|LkN zkpjA-F;0HQNI{o) z&_xR9&ce8h6wqyjaTh6|dkW(&Qb2bU#$BX_DxVfiYlLav~JFtf?v{3kELcMh%=# ziW)e~N_pHc5o*{<9@s<~lUEE{%!)lzX{r!$Ruu%Z$x}jLOrOF%=vy=j&I{x?4~pfS z96odzWglGZU%h|=>a&GXXkL?^Ow=HeVDr_$`@B)_p!;N zZ{Ux8{E1bo*VFaIb+pf#N72P(l}CqP6aoQPb@!psL3H%^A4hPNbU*H6Q^845H(M-T zP3R`x*U_N{8}|HQd%w>27-Tm9`H%q)1_8iN7~rrI0Q_~2K@LKFKVpDMsPE4?V1PY) zDFf`p0V2O(fJtaHUoya9sOzs7V0;+p`dbb9WYQ@;dn*nY z>Uzxp(~zM3&H$58*KavssO!H7^IwcWjKYxry}vOu19RTgcBy496^es{=z2{}RSnsMp%nX3Han{>}i>8Bz(6JPNPHF{{v0gy91+eeu z#dd2%b2YG8%1Moxhryb1(=7Z2;#>&ToofZCD=mUGIqvZf{Nv}b1>_j~>#NYxw*do8 z`BOZKYB7Kj?qbr9-~=icI~MSE;SqHSh+ zzs*dScOmxL%ygTXE{vPU=@=`k)`;xKz8F@-dVkZ-Xq?(pNdhdPmkiMWvqcmExzPgtl|L~h0R`o z_!A)JH1efUY_1L8*KC*sH4O=?=Sr=V>+|>{Wl5se&L&Ib2^PB5tE9~>yNOyiyOGeP z-YO(&DQqAS2N5&z5KUEcwIr-)ZYvB|ghb~EY`|Je`$R3@41$z}#EV^3gHj>AfkW^F z?{!r*SI)emxjoc(#1pr%6yt%D@>Qd8TSyd;(las&)9wdmV=V6&Z(}J;L-;ob>w6?2l_{xECgd=hLk_OV4>QJLv$js>t9In|$8vpoB4|ama-W> z?mDf!se=%$KP|^^X<)s$xx7u-W^YGt(A2eWf6im2rq8#R5HD(-V`-NVmI%5t1T|eO z7r}lgdl7cAtq6v;eLvbL&!1o_Ki(6_sTd;IT0yk81Wp7QNY;ODL(cWKa^k=BIl*W!ezuJa{twG$cJja#pWS`@LtxS48HLuRR ze3)V3q+OZt`?n%d$q#K*i{MT+H@FCPcDFLoUP_4X2jG)yN~2F%@2yYn>}2cXk{LvA zE}}Jv;vow!d+x6Y?qoN_5J8`s*B8OoAc{l1;-BV(aCsl?-dtxVdnH^NJNhz8(?yD& zgVsIE2Y^0qY23+93YW(I_9tQ5^~!xrV|RA4lfp%?>&w&DchB3Lz$zQj@)h!E`~IQ?(F@gbhzG>w^kbO`8mYSPIg}mY24j*bQ?+*FY12W3+kQh zzHkxj?`{v;G?%S={^;FvcPG0qhBUUxM)fqf^k-XoovKhGimg0y|#JBc4yl4lzew5yDwY>JMHcZ+ej845iotSFD-k2eezCr zU#8p&?#?H-OXmBqWbW={_l1jK#}|6Hj<|KiPDi|xO_f*73U+pvIBc^vbU^Ih91-j8 zWK(6vq_NlTGPhwNlZVPn1l^tNq|8~D{njA1shVw5H9Ofa<35TO+!Y-4`yl-S(DhD~;Pq<4!hW z3~Aima;MFL--j%CZzmfuTm%QZbI+{^-U|`j$wmwp!QSqCaw~%OLIiiR5wm2Op7v1A zr)}z+$wOu8ySJ0w7cPR`(1N)-?H)-6-MvNhizG$dD#@HTXbRA>t?_^Vji(s#H z&uy@{Ww6-a$)<`SjlSy}twC%JqSGMmWK)HUV88XrZ91_|I8SPpx z!uNNwslr9DySuQk-PgMh`+EJIY^w0Xhe?~pZdWGTu1t2asluhPHHfWGuIH0?vXjC^ zuzki;r`+3@nd-fTGuX*a${kyz^xGS!?K+vsL*=oX!A`bMxCr*zTUBj@xMhSm*vU?c z@z8slIBX4KErYm|?UVL+VSBs~4`Pf?T^l5WootZQ6S6krcONo-1NXkiWWJbZt2Z~< z+25Z(Js+tL(|g3zow=Ue{f0PJ>*aL*GFvZR<@3-P>ra^79hevMT&R-l;(D^2T&(kD zw#wI8ysuW4+?e?8wlqAe{Og{ZS`UZZiB;FId>nee^tw}TN-Q34Bo^-EiEGfIjS4On zL-XXH6V+y7;mb=mWb;EN6^vN7R1DqgdFQB<3Ys4ee6QrX*M3SUzTHG9hVGEvHRez# zZU}`5=t8xbtr+^mupyWK#f3r>>k$ffKKL%{^9LHa{Ev^u&+iGQXPK&DLK$pcA>v ze0{f^M^}^CD*qD7-adHy;K6D=Sx+yb7mLL#TCcKM{#*7cfAe~=yj<;{pPl5t<;&== zP?|44i_Xu^06Kqi8HrZ;LG(LdIXgdkcAlM#ei=R6M^f^|RrGa)O&)y%f9&H=tXjRE zt}m{mebzjRE+(ryQg+LfJ8`~i!erg&$^;z$a=B0K1f21?HpM)<-z(OymJ=I}Kf@eK ze)5M(eIbOPkH6n%#w;oti3HpYqc4>4;*YWUe3Zb)@9)N@S2R232Lj^IjPNu_9Ga3} z*P-t_#j*J%MU$FeuR?A2qEKzzI}D)i_RH1#gLs%k@Vc}np}gZTNDh;O0MbE{CgJKd zTs;g{5Bh=XI7tSBKz*;9^oIx0*^f_t-akAjtcKgJDaUQ=1DCg0I}|q_<-2V>hCFHo zbmLJj&c?&_F4hX_#-n^s1s<)yZam6w*m(F?Rbs8+Zam6;*m$_Ti?so8<57OZ#$(vm zkb&TgOtgV;cc{XByF;FNp?YwR1g?x7_C6)>1xCD}->~WJR9W04paMMR?NpiEB%lI3=ww%TJ#rFI0UkuM zXZt;f0xH10Ku6nLH=;D40$g%CRg#+qRDge|s#7JoX+Q@cB;>VC?MHf*Sgv!+d%*iJJ_e| zJv|0gfV&g+U2!*}&W0+$o>lZ93aEfFy;U~16HozebJ=UT9*P1gU{F*gxt)Lta5?E! z+2oE=furN&(a-1E`O_aqr~4|wc{QEQR0_f~sDSYEc(Ye!);*tWRT|b^hBro2=JMkrb;UC?LiLK~+vl ze;v#o8CP}oaR<-H0%FWv0(-5^gGh<7O%Znqy((4j287w5sLDy{Pi5E?8Cp@L>iUBR zHX?2_*w=VHJW?WUBjQe~U!|w|nQ``{lumWPt*N^N~SP!CVF}_^9t{Rq#u-&2qCpX~GMir7k zn8Bm#L6za^D?zT9@+zaF&&k_}xJw>X86ADv*+#_md{AX{JO@>k5H4;f7t?iB%ra0` z**#s8`Sb>M`YtObOrIvRN5vPh>_V^AT?H?S`{y{)u_10~KjJ=_-$ zs*KM-iL}9JaUd#NE*2XHnFA%!1|Bu-5W|CtO{Q#r+~RbNZDB+Q`@XOb{L|txmpjBa z@Ow3eo!|3OcKr1D>G?ll$5(6yj}P(J=dk6Q;U+JXAHMxe)Wmj8+@q?*UzPf+I{vDz zzpCf2>N~24z=5NtpnYgp$pJffAx9hsxDf}~5eN7Y2N)7NIFc0e65vSeVo5RZIKY(H z!4*05B*2y=z?Q_pmQEo*0j?wgt|ShwC^7?VNdjz10&GbfY$=2#b#aA8mpYgtTRC_l zs~kL$RSuTOssKmQ07p^>M-yQz zb+AK{;b4cTdi$k1v_#(N4xC-w%htj<-AQJUxsd5oRM$80^r&38sj_g^GD-2VF!eJnh zi48;0(q$8v?D5gr4;v6q7!le#&1(K$fVjcAbb)#~xt!ju!jxPs=4%ALSj-m7Ff1e} zU}YDEkpXiUO0E~eP-%tUi0rQu1IoOSlXZeAo~;&l%ZnV@Fj+1audnk-Mc3=e@+F-7 z7hK-3#qraVr>9Ob1ht67TYI@!d+V~h`M>WLu=avLTHJPU0;-YHt%@)V9kCC?(1~j& zj2I3-fXjhWX&DtkC*SdUWjR%SxK^BNwIRqElEc%6xR_*6V64jifw#;wy$r_pJfrb;;k|#J|N0UR@L)d|K zC72>acpNdx;w}%L^S%OBr=9US0EbbttmMieE@+6RRd51TOvo39g0qVZOme{|h@e9Vo$+ zF%z_$y;v|fp|U7atT_43D&oBe{uN?CbDlX&oWy`85G;cHTMn67PN~yIA66&Y5J*%4 zHI$N}iXoytRrf0MX2|1iZr{_`*)1N9(m%)XzZ!Q9CgKPAzSZBov1`iO7d3!k&IF-gGN6}a1ziUn@ z-m^O&?TZoGeqV`$SEdE^Vo@OFWm6d+$9>EqHV`F)*@{1|seU&B5rBqIB@5Z3QF^u_7hIRF;LXLQa*>^3omGlOh99vm4l=f zLdpPe7&x_F?o@a@=3NYEBj`mE9sZG8NMqL%gev=^l-XdpM>s~-d>;F_Lo+lvWO30SW4xPbv{b3Y+)ZZ4ShyiKOGrM98A=av zhKk5h&V7v;g2QK@MFX1PNbIkbHpgU*j3!9lbUIJfyJA6Z8!)kFLGu`oLGyTy6?=@( zI8AV`vrp)^;ex@jkPU(3UnSLMHiR@4ZbX+rxSc87fgz)kxe(+PnQ3RT##p(b%reU( zM-2zC8tZ-9!TsDqEF@-YSbn`XG*q$k&lwQXgcuYH-YP*Sp(>`$GVBf)Z7oVw>@LM$ z;THwtw2#uey_I#!lA^!JyPLXU4EH@wP{Bq+lBM*Qlc+8ofGgJ}-LfYjv7#Qu3qF^a z-ZGNvWdd+^I)}J%vb`?A!9hl{9IPVAJw1kd3eL~aFh~lN8&;{nLo;0@EjBl{f4DMq z=;YP*`ycV4Wv4Q+^=`_4d?@^0;V`&|!Lu3!%ZgbrNx67t^r=8a53H5PU5WE0YMxZg z+@a%3+sj#eXiCCH37z=REfa22?T)lvq86JWuo|u{Yq6oNQa#G5xUDU~)QzF!O7Td$ zdw4u)`}iq__dWh(f;2#b)nrJ*Vrkt73KA1#o;qR0T$ETbml{^g1%wrQRB7B9Vj8r; zU~%h74R!|s@H-uE_po7P_QAyp4eW#E2n^kq`PNWKG47_A8*Si@;O!SzJnm5zkDN#P zfFf>wc9e(OR5`bm%5j(00!=tz$Q-S;Jr232#wCLjo_S;Tz;eiq{cpF2GhJ|2hD??S z`PV!#ycfd)Juyy26opmr#z_f4L&y$e+o}hzMI|HdK+V# z?0UiTK_$njHqXXAS^+dLk7lM{F^orOied2B(>5EpA~H~7p(KyVk>iXCg8BCIc~f?r zWZb76*e2X?i;t5V@EX&fn;QvUS*p*C!bMnOr_Wau5C*eo#^#qLqW~{NvDsJhRVxVS zli`1dBQf$o?{Xw`jjVwSL-+cAB9VR%m)i}9#RE&lv_S;;&X;Tbeq)M-)6*2o=*6=T zt0%<+B(5aIvAD^h&s-}7aeA!Mu^q`zJhkOarN?;Y#z+C$YdF$ocs7yKVdCaic5sO2 zTpEZ41}(}Xs3F(l=79Eo%iP>#yvm=MzFN`2vv3;LoF!~E4W{S9p z@Z$l6`;ErY-+aR)hWCg3(@Y?HD32-VT9w1Qa zRhnj-o1UY3Tq+RRctCfG8*mfej%n<72R)1+8c?x|CBdNIRI>2cLQ{J)Xqao?#nH0C z5I4)q;_Y!EZaY?EEfwQ&ilBIJXY_`LuF!NNXQd2sX=hogDc@O9u)~mVLp3dAyfAvE z1u$(r8E=Fi59uM01_}aSXlbmbLwb{AL#c2wsFvFt8kt;|(c6-n+lKjao;Nw30Hk|dARAa$;n}5OlF!{W3^h+KOS2ShYk1llS85E4P`Svq;1;*ja1e;eyG9b z(ijfAG+Y!W<}nf1F1hp3mNcP9Tde!e+0Ep3tnNIY{d9D4LhrcjCkLV!PmYgyd5Yy7 zT=yFl9jqAIExK3%7o|irZ#3yqO`lvC@1>75aF4-iGoYFdZc!T8hE&tX1AImed}B!r z1`g?3=pglqRSC+3*@{>IhcN9{#05ApXjc&*;JBJyMVx@6RdyAz0uCS9Rm6)<50507 z6cRH!14m!P4LFx!A%siWV#siW!LA~1z;3%;McjaGXuFEI0Xw&L6>$T0IPEIp2J95t zRm2V0akHz48?ZHHR}nX0Z^o`7ZonRgRRy0Z5!`@mzg z!sk9jUyww!TM;+TcRHrZ9gjsCz3@K0j^Y!vB zhaRJ|AD(=7o{fGve|A)0z<8?$hG(P4&*A%)B2&*EdH5`XuvEA^boe#UAwm1a^Cjcr zVYW(c7{l2Iox{H6)0Z`ygCtV(t(dtFU$da*bva2xhoD*TjUuHQjPuO{tg;Z_cC0Ko zDPPOnn3DxHDk8RD0fG%XqKxj$xJH_oA}=R-L)?XIKO6l#IyzSpMLTitx;H6-@)=H> zZ@V0u6j(YV_^!t$<(sn1@4B}_0Mp|2Mw^i(yC{XEP^Lo03cd~@)W{Td_&_0bTi5oM6sxjZ9Glm!Y$oBAotR^jiq*yAb?=R(Qp37l zoBmElD^*RtU24nUyXltXr$^7<)eI)~#ZI%349bJKrYNYgvbC4f!PbTArtR|DeTy?d zNV-?3J)LvsD;_RU&aJ;44+}czLSBtwFgnUNS0JHCgQGp18c2(ftY9te>(^+`Xu{J% znvl9&E(j^i8(lBij*twV+f{T7wu|#%;f%sU8Oj=T6vHSy8y!Wc(VX#9C(D(<4ZKX< z&{Sxg#tV$%d{y-M?Q(H>hs&I7dI>8Rk-|4UEuDLI4d>nVFCD|sYd79)|I$NHp7;Ha zU%Codw~AG-i+~Mn7rsp-jRo9d+z_2y#7cR9%(yV6a2wEvpz(xA;me8`Uj{yKnee^! zDdjHqFE)2RPAO|}x$(V?Q^{AOg(*F1C0Bm2{CI;M*Hp`@GjL=ttf@}6UAyAhLvb)0 zKbqpiys2);MF}(AmE_BHyZmy*);!`zbonS$2X&VTg~68!?qB0>Fo`8^qudx=V)BW$ z2P;t}t~R0BNgK>fag{%kX(azj*F#G&&ocYL21$E@(5whzV);1>dwMrB8y?)|s!42{ zBUfs#gPFvV9Ek^R74fy##btD`qbVu#nzGG!jQYey-Qu+TipI8_4)$R3TWpdNzrE3z zXH+D`;-ogVm!I6QX%4nm{mXA})NBv?g+>2f=k4jgB>Ckvf`e~0+cPd9RZ8aRkzExf!SS@3mfj_+O;qr71b&zP$?4C}&&6i5IH~o?^a|D_QI=iY&hA#?{}13h==pLU zJv@F0AENjK5_Qun1@>Q0PSfPUC%BBsqXII6ON$q?)op&Ue>sECLEbKw>jT+Rq63z$ z*5dP$lljZL$;&+Y>w1~z*=o9m-m=SN|38cA?xcH5Fawjo;)^iUrqDbrGoqJ$>_waznT1&5l2?}zwh!nd{JqZ&tI;u zfyF-^{gM%X&PIQKJ~}-fWhbN4@6UgbwCE4A0raPEHjsa!?eL%Q!O#NIIt2*u0B#lg zz{R0KPZLpP&{G@=A#ft7D3aJoMCOy5d{rQ2B__~KzMfo8))NCx7Rqk#Ud*N!Ss{6v zQbMZ9BQ~pgamE-l;buAqSyFWcPIF2GnS#BgQsA#c#=%CB!~xq00@#G`TpYSe0g&*?|iyh&F9ngVzZgA{_FK@wVtm& zdiBQ#58hwA=v>TSEUxAkd(-KcC(jP2(?^|u|63HEFK1UTq4dG~uUE5|m$S~7hlibu z#q8zP^?I{7@4UWQzsl7u0BAM8=)Cvg|6DHC>&4Z}4__?i%Zm>eSBuSJwp{$*e6@b> z!Ta;8i^U6|hDhlgADn#o?BL6z>0ghYo<4qZ(kXgecY1bkb~HVF^6ccSGv4RoIE>)1$vUJ32W$njRmWe0lb#PM;Bf{q)J_&koOk&FN!@p?vUQesy!% z`SC%gvwm|qoqm74y6F6&Q+xmgvzs5Lrf~gg_If`3ZvJMvx&Cf`RX}}-^;g$d2ypz_ z(}Tk!DDJA_r>?kXiV^+AZ2b!0`dqNOzTQk{o6XALhnj)Hu-?2`&Y^UuOAS3xI#Q*} z+4K1lO2?}7{Q7FWSlMwRowzAO(`+!nE8Hju`x6jn#Wi3#miTSL^FB)dUn3p z7}5)5bLQ~8SS$@W1@g+JKn%#xln0!?nq6FfZ^|{Vmp9AJ;x!7P(EQG>7MHUP=sdL1 zJaiT<9gRZG0mgCBvspMY1 zxHf_-kz@S!&DB3|u7UO`hy!fZRBEGmEpCEf-vNREa%hn>&weIYE@VF`|%eBSogXq(fxgT^wnciifkLC>+74< z`FsjmW3;1-Y@@8M=HE}zO3-J4H$$cEBIgDGlz0RBJzqhy9`cRotc~=z!`X@r9CFI& zsp|Ri`rPP9j~ShsZ;Q&QBBAHa+Q2a#Q%1xJfQSNs02wQXv*R9%22d}N>7JJgsZ@`p zz>3so5lrXT#sK>)fhl-@Q=q%q%YC|fXV`rdS8Va71W}{ zaVSC%|1*Fy!xBQ6KY}_OoUjuA3TkPL!fN_6sJCMk0@%L;2s3D5wfQ5cqoE6H>Cdnp zhcK$gKZANVlp%!s5x}@X4Po4m0H#Z7*0svVL#r9$u$}pX+Mr^pferztswhB@10RBY zY-_B=$+3^<6N6zEv=@T*JZa#>uonLB3#Y;0h!A0+{hYHE8ZHs?p{9iVqO~vtP$dB# z8bA^3+xPN_$_P;zAfho9!TyoQ(~a9DegK zV%$aW5QnG_kTB^q!e>7gzzKx@gLxSL(WE;?lg5C6kl~-c&D7bH`NJ2J(qjwy(^r`= zfl$F8ve=GtCTgH!9?jyAfiTDAx?v=0JNDD(!(hu+CQyXJi_l~MG%D)|WMf@a0j@j% zVQ?-W8J`Hr+bGLgI!w(|@e0CwE=cL4=;iG6^vxy2D;*!XT+UwC#Vv6(69+MVE#Kv<%Ipie=`%zPY$=j7vyHMom~7^NxDARH1g43=mh9~m(e6=^ULATgXR z(||5cVklFfL4Zw|=_@X&C;;QAiE)8!VJ$#|xp+z8bA=kzg-r_76>3llrTD{LtM0B> zTtvkHrT{UZ!l)?9d@U~3pX1Pq5n>4eWuh!+Uo!g2HNaRa(E#UYI7_jkgCP|D^sFRe zE@UPs*X;PHi}|4M9q@akVL6kT5)O-wDgJ4T4AuH8_ka{1T2v!_4^LF4exWQSSQz zZUM&Vc6dS1V?JyJe~Su=`l#Y682;n<&fsU; zh^rB=s}H-;EjLLVIhYtxC{q!}sSjr06hiAS5-4;{zER5k*sw6)DCJqG5xJI%*f3L- zSmAOp;#c#{>|(Z=$ym`A)dh@Z4Xo4o=wFNV;yJF)zL+i7XxUI|mdebk;%0S&ML!|G zs6TE+Y=`!)3(=tj5oaTGOd`?49@7V+5gNyVU@C{j$EiDDAyc($by0i%q#(mlCS#-onRXzVDMnIF2Zhu$pznSaBy_q28oZ}+h7sF zeH%0`^lyU$I>^oqT4CX-LmMn^64BI%a?0yw7;W*;oTLp$ZrZW~4)jgYye2}#GN^Yh zJm-m!BpejuwT>Y(CyG#UJ3$YZWpUwjX%}2ZN_Hj{HBWHmiiGuxo5t`jd z!T>J9)qo_UKyreZ?EeH!t|*W-%_t*69CQQGG$nv}3n*|i(;a9qvJmssrj$75h!FH! zW~!Iio``5-CWK&ObUbm`og$tNMc(RTy8Ld9UZF-tTi zW`Pvq%f;1fIVC)DYYzuaw;T5XrK3`cDGwTE9R_k()8aIhkSG?B0INli9yNb_VQ6^0 zf(*;m8%R=wqUqvdJrQZYj#uIolg=h608BTVpf=IkJ4Q+LCq~?~8__oiFdu9(Fn?0% z(3g(PpP17%8Jj;b)ooIsU@4JxQqTwKiv@m?8Wi}=f|k(={Hptb-=(C~Nr7LcOw>t% z-=_4_Nr7LdjMGVh-=`$gNl64?F509-0w}3;QWDRWf1-dGERh0A7M+wt0p_|*N}_L7%#$j}*8cNCBl5 zPWniJ$s+^^_^3fvE*Ug6Vl)*o6=mS5~9}f0I zJcTH-Xbjk+M})|s8I}7b;~ABsp{8$CcE`W8EJq{$nk5<`f$B$(K6&sH=iI7Za$ zeZ!2)PGQEOS3^)o2>KuIj*8@0}vsd)6 zsgb0qTV7v(H+wao!4A?NI{O~1R{{3$+pC8HvYSWv@I3(t3UByHe)-}15^!7r`0Yap zxnBYKp#Ut43c!yf;GhDqD*$^{7(W((Wfj|>2*6&y;?tiBz+na4KLlL2ikBY+U{NLT zp9Em3<;}~Vkqcq9di1Ds`sc@A?-ivp9;0=85BDD$56xi4J@_BScaPz-|Nght7o#(K z4-e|v{BPW5TG!_P9s-HZIC>?E_UPnuI%G#yXzi+ycI65F)!9yCy}S*5+eVF~7Ag5Z z{Ll>SN?(4NI#zmPOY2yf)iEPs^6=ug>kp4@h3s82rNGBJp2a+-4A~RiAAeD@iY}B)i2QdLV8#oncXn;iQ`jq8jv+H}tM2C(VC9&%X+*a(ZK?PZfT= z1^?c>x7Jj_zo$FR|DYlN+GBEu(e$w*tZX5GT#&e(0(ipH0vP56puC?~$26Xi#B*0M zn(l|UKB9~zkNVp`R|KJ{Xe$8`UuIbKHtCNSnxA z&s}+??kSMB`cI_$>g2A?3Gok;O~MMxBc@AS%9w%VtBFV z;PCM1>odBfZZAGk&ue6vVTBh>6ds=HyVM?gaS3CKy-$8kR*&j30{1H#cNtM?dfLu2 zi@Ig0g4bnkQ^bvzdVdu%_P#5l#=P{iy^QZFB)n_2<5jHRj7Vy=gcrTENL&U8oylY$ zmsYismr>G4=tyQA5}t!9BzStj+$B=ioF@aSId33#FBrl7b*#0U&?Sd>X(`}|FBU|m zH`C*&8~@~G7mO($`{bBb`qkwa@Q-r&sczsXtH)+RoBw2n%k&Ur)D80anXydcv~NXS z4UUg7rkHaX9{i@pE-|y$QfaXF@vB^iF4F_kminYjPS1+(>42^SH6JbfX7waJT5qi< zVQR+Rq{I0BGfOjVCmGo#+TW^jbZeq8I*82UQF>(SrlT-7_^Wfsj7mFk)43|S!0%BT zz!a)D1)Oz7=1jEMGOrpobl#|^HY1@-ps7z<(Mj!$gj#Comh{$ygmf63Da|ll9TQ5m z@bars3m@yXR0|*K=`Xevvq}*1#AXCk9hf!|(4CT-j(&NzM91;#lp-AkrwqI*yj8wJ zkN7E64Sj{*Ji1k-P#e*n*o;!7!@3k#IRUj)itWhFM;G!!1lEeJ1?%$+;4q6z_)m+j zmmbV8(lK{eadS&J3aM|~y!FNBS3 za|TkKl~5cMMMb4KGFerPM_Q9v{~$v;N13ZNrzkb*J#*Ny`fL^+v(&8=GkDN7&#O85 zTHShFS&ipma}41L&x+=BNR!T_?Yji2v|r&A5X8cknk%jw$RMgPftRw^>U?sy!UUvI_UbgZTVVo9Ms=Fo ztuTS_Bx`j(xm)4f>3eA?`RKLzAcPlho+FIXhcC2tR?C949 zxD_TKhm(Gt&-LqyF-6h@`gNM?7t>-ys(b4+w^v~T(&zT;G`Ck_0*azK&Fxi~fYcMX z`>19SmrWp@jbyGXuR~Fx{4(Ag)G2?Dl|N03xlq22mI}3(x-+P=pB`&-nig|OcnvLm zULTLuPX=lOZ-Qx8-e*^?Xu)+(b=i0wK^1DO2&yyneuWxKQy&Bn;|Iym~Y(-I> zkqua}V~P}_Itv-FW-ANfy;8h?xW+mL6-q4!!eO0t3@VgbaaCs>g9@dVE0@DM>lm<7 zr^SPpp4N${LZ78!4C^dx!1|maX7gq_uOo(4IgJCK4XME~tk7b`P@Sa@E3{Zf2g5o` zAF>w5<{+^=b?cAJ(zOdYqOG zq=CTODs@O$hvS}-(ezvN0LYw7~JgRd#qY7=7W-+RBIwRKRw4m*K zIyI6W)u^(2Hl_|ug)+-YEZh=V9WRe6lvyFF^BSWXWp?lC)X~H094n9|#hY+Dr@DV!)fBc0ujAE?ToqoJ$b@bh&)}?(3f)5s4b`@fwJJ~bsDzt@eY|pf-P#3z-J>8D3ch_~c8|bokUFEzA-Tj`at1zNo zg;?mK_zcd3SR9!Z+S03#3f(cE{v2I7pQ)?xEp#D$rd@?t=(_q$yM)8FtkYfgx|yp= zNX1npgkr1c*83zvx&uF5m5_)-m@pq#m5_(4N@$6z%1dLA*O5V98iRy1`sAbN27b+Q z&sHVe$-q`6q~Q?er9n6M>u*_>hY4x8ZzZJRzLk)MYn70O<0~NzTScz{XbLStdK*Aj zxmI~;(7OTYRtep(e9@Z%x|Jg%Ar0rS=)nQqjO!Be;JSoBOuvZ72`I#que-dSt=9AD zW(LpcPL2pxJUco2`{eX*Uw!uE*#3g}?ng*BvQN!m;?X3&Z^FEga&UO| z_{quXUh# z9)#cP%7gegzM3HS3Tz$|zww#}@h`aMVZ{5ac_8=tY94~-|J6LfdKoMe%V}kt4oOu}k zRAwH=zg-!@7&_$H2`Qnja|KKgy%iZD;dIZFDsjSoXQ~Cga`$|Bef}LmyIz2#!4Eq4)|KfoFW@f-OcX^0 z#wNqbS|2)?Wk*RoQSlFLVH*I7Ibxt@e{p{x07q#LJc9UFzkTfvK(U6`3p$; z6Y#9z(k>ZPxmgC4w(3B&YB8v{-;Rr5lz|!9DdbZN3JnOwDhft%fn69Vdk^9n zJw~J+OO`kxXE1CLDtknH_@r(iYh!Tu5U6pdk)mON344N8<}2K4C#`nf0-3;Vt!+}! zLzV?TV7QYu|7u`Ps*EYn1@h04c99o_7+$I=JRTOP zX~H}zf*VH=B=<=*bH_iAbAf}6tc;Pcav~dnzZdV16WI`g*l;1V7WYWBV$TdYR@ca8 zI9PJ%%vVt~vLI#Mb)+z63d1Bh@CGif)3tEoWu{VM92cp%kk+kc{TL|(eCGB3l^W%^#bY-WwPQLv}TgB|f0qIbe z?O8hecYYk=91?=D?O%W!FUR;~b76-p*O!sIlk17(PaNp4IC^QM_382E?P$G|`M^-d zQ3jh@O>ANs;nUnM+UD_H1`4}I4(RB4k`V+o{G~)B(WPvP7Agq&-QkcGk2sL!EP!0d z#UZ4$(JTVFf4(!w-WF2ogdC5cgXueg-$Wvcuj2FNzZMENRuam|+*xa}AI}tG7g_A9alfI8?#B~`gpTfO?RTy;<@ySEoLlrh`<9gN zD>75V*!d}(EfueT%Rla`=JhdmrG@7G#sj_rH-UH$khN0=1-C!k{;DFr{yt7R#@d@J z-(w6kKj+wD{lBQ(hP54~!aVcoaBB$eT@W4#A!@dUaDjuhgmCKJ(Sh>djFZO0)J~@H zptrR(RN&$lZ)H}yda+3=wLGz8&(1kj9zU4HGB6CEduy7JiDyA)J~-y&d(S6kE%x3vZ%6%DavNZdwYv zD-j9N`mB#FYc}**@8#mLQ1GT^BX-A0e7qAbknL()X4>xw&Fy0d7?%Js>5nm&tA*5Y zg;u-6gw)BezmqzqolFJ=Zn3nHx>`iQAtohtw1{_7w^Hw78fc3E`DdSx7r3v@*5+;g zv!@4#M>^^%aQ}v3QAaAawi@kQ#U3^o-s)2c`Vo$33oWrH7i_g^PH$tge=uxol8Lx5 zVUm=!^3Ei!NsiGZ@7fXW9{40Jt|}h-g^v5f0yDK*2!1DZe<%1M&4TV)@QtT|zs@js z*vIo=Eu_BF#W4~Ka6u!Z1zYI!*q>C)0A53BD4KOEy~a0|ijG_iXpc(~Qx95i`1 z%a~sz(w7^}GUDaaFgvbxnGG)74Az3;Sw;jBW@!eqjP@&WlM(IFw6Mx||($%t;=Rj()G zVcS?fv7(w-o5X`LqxLTJ_C?TSgKIJ#;|6mJx0pDBoD!4Sd%3@2D)wpjsj!3PE?cc? zTb4&mso)N4CW}j^3oxkK8DOkFg+TZ|%$m`A8;PFM>BH6Im#0E87wEE0b&O^x@fjbT zOl8pUW;$6Ip^8syBA5Z06#I0yS_@A)Y_v~^DbDe@r1!SDL$bq_7oq7%PQ; z&^8g$eRr7SwyVeHE*yU%68k&ht}yeS2bO!LOa)!0+G6yr%;#g@f>~fJq+e2;*39S% zx|-B-;Mj`BoQgcBZE^s{3Nia1u`6juw0JQrx{0IyglS@`9<1CYBCP7I{aaXcgG}wE!PUtww;WLn)w)5jK)J;tcyu_OSGV1DIkDeT>*R0? z-+s%b-1rNLm0ax^@1H*RC?~*f2fKcZda>QI5_P;jql>x`#H{rzML)waNOPYfo=(0K z8O785;G|3GRahog5q$25Gm`?dX8nFDC*p}ye`3>6EbfcatW60RJ{DZ`%a(Jt zvW$lQ#La>Q9*4VI&S(~~y$ajGua#qWJ$f4_79r;h1EXCzsUM^hM=yAYVoq*jgQidK zb?wSYgJrf@8DmavW8thnYSkz0LaW>DlQGV=ckYuYMJBvmqe}m7l@oi~erHZVTLzxee_a&{LTKCuOM?k$Ft@`7l0lsw~z0BQ6M{^d*`K21`(78Ep;6lL+#S!6k_9 zW(~aG&0dm*$S1{sBJqfk2A^^QE%i-u%(YAoVpx5%eu`@wW)LGoM7yMdA)Ph%%5!}K6Mh3W;-Hs7u^UO$65A_At0cFUD z)kDjO(u@F{dc>&~B{kXpbb{MrA`IJ2a(cmRY!^TcMz{mII~j!z>vtt1>BSq_v=d#~ z(=NkBpGp1HPCe+SHu^cF_n%woXNHlqerjD#7@E@0k(QALSNb`m$U0&q?ZcBoZsL)- z_w#|XvK)m5Kr}p^+a`yNIyr6H1}GgecUc-#Yk7XR5y-D`Fa*KY@M;|JGuiIDPtee z#V4&8!SzQ@{a}rk@?}N_wO(t-ab%R43n=@o@miT4k*4bz*)sC10;e9aWIh9I0YMVibB)|-pe)2 zbcZnsu!mr(;2!e06^WqN$K(b@9^7naTEYFjaVwGoT;Cd3ktF)VL@N>n+%FloB3Zz) zOk7367<5s~HH9P%xTh^@1xw9__`x`C1y?$oD!A?{Zbj073z_07k_Oxw6jzZn;9i@! zilhNIuf$a(4Y(U5t|Do`%@A=FNdxXKh^t5%aJoLKg0&9AG8__*t4JE-Zv3q-NdwOA z#;r&ia0)f9vNke~WeD$f8Zyjj!?>BX6FA=%*O5HT39h(~1Y!;@#dRc+Vt*WW8Z0&- zEpSF9Y6sZ?RM(9~2`d3q*N=M}_HU^!VS_Lmpt^+i!;S~mL5g%ti&GSsF*(%@W3K=w z=&=scJz`p{Tp-CIuCsE1&HcE}$^|yH<2oxB*x`-pAiyJ95*`H(Nn;)C{l)F9TwwPs zuCsFKCu9cM5QMWI^A3kfsBVy;)5-;Q9pdjg69e$4yO$^{k~W1LnlgM>}P%RYp26x#}%Y^Ayce?u!5STu^iXXOIxFmaug3oLEK zbyhC0S`gL2q6yLh6Y#js$_3`Mah;V5OcUceD;Jn~#dTILFqw(#tXyDz5Z76`K*$}} zS-C*y8`oL6j0TB1E0>W80-{*$?DXr|YCS(VH!rUoU2RrxOw>lNvd^$^?V~l!&iV19 zIfB7k?H`?A-&}2A5ZV8r^U-R4vz|R)&f({a*>XMq2_AqqXQYkbQ*DZLo6ggt!zX_| zdb;-ro8vBbgXWvnjrn5d^iPk!IGY}QbN2MWV!$&TTVQy4^!c;HqdgOSi#KFG=)k(0 z;RiR}8lZDBAd2?P(-o#U<|8y{uK3~BMN?_&<|CMMVqfee%{}uV7B=5jl-L=2<_I=6 zZz?)XJoqMRzMJSE636D{wxSby;9ntv`Dy2)*Q@J`8?=q-;=+Vb_6tp=%c`;cCwA)r z+kdnmv9#6>gwBw)JjubENO4xDa3y>AMNeBuyC3 zdrbvbqgG{JbLkd~EfgcIxK&?h+5yZ2b-&pcMj`Ch1?Ck&Y`$9;3}KPeH19X<0?S*N zw<=P^^=FV9eJVlw)%#78Om6|jZv?NM0N|7714=u^K4KW|>=A(Le zXmCp!t+8(NiKb(AiVc5`(8MAnmTdzjL2?3J<4I?dJj{!QgG`n-dY!64mj&Jd9es$a zY1dQ{=7dHECfX6kxVG&8((AsRDZ!goTk0IOHwS1?0UA$5lY(*k@{mX1@HG{5s?!qa zn(BKsI;T>U*w&!uYPfayww|a8^P&6qS#Xp$y(4KMuBM%kVly>~fm3I;f9dA124p5W zqz3c0mLOyqJygK-Zap0qSm|hX#|ZHSM8<7{zGRs~C;w2vLKcN-06pZ#3;Q z{sy@plLUtDCqLy5hGi#*uzfaQt!zJX?vwH=cN9`epXEVYwrx5y+u$pXOQAT;Khm@> zav!1b9G_!OaxrQ;)Np4@Hq7xd7RYGZZp&k8VMx}#oiiUb9cxnjg}9n_Mg=Z6kH}B6 zGdeDWWyxYx+sfTW3vNG)E)>5#MfSlS9m{BdIVG@^jR@3D`@$IpF>OvF8y^MtzcdW7 zQl!}qu>KCN(rJjx(GvG1quN&Ui7iMWuxvF|cSnkKy>5RmKbx*rOSe`Kj@i-bN15M! zZ8l%8{DNMRFlURfvnd<8fgWn9n7mbLpIy?(NQI>8zn`5}SGG5&81egbYu48En^%;m zJs#I>(4LjuS_>oCc6pB4o1>CMKvMx~0#phD9EEIXW{kwznNv=C{?ld3yKu6kyNXld zX{M41yjl^>;TDubTVjFm1}xaQU`db2q`nmBGP6LsU~Wo48Bij8 z0|bFFx*hahQ)PDTg|`iz2ahLk{BK+3vTWH=xa>7maYq)lHyQLKmZsXR+nd8J*q(Cv zw-&282}kX>6{|IIM?c-jw)OYfH0bTp2JHjADx6->dpr#gXaSnkd=vm3JZR9K38-=} zu%zg0lg_K95bxk#2(PwH)`1=OY0dK)B!Z^V1B<{Kfg334Le&(jfpgG(V6IU`0vgX8 z0|LzZD}-R%P>dMx?VHA50RiSwAtIou2(<)!`)%Xe&cWf~(bs3w$0uJuJ2TmOCOh%{ z#fyvii_Ua<{(5<{Hvc`C|FD^_t~&1>zSsHj!TT_ATfAVf|9O1UEg!rOO%_-4j)k1U zeDQp_emy_myI3ygKfJzPZ63Ln4jn8htT&yr)8pCI%bVHDdFS_=)qFl(FE;SC=|#Es zuj|FdBlsdbfU=ow7U!L)#nLr}3`YR#bUymme6@x|N=OPjJ~;XE*}<1bQ^;jJef;Fa z$QS@%G5GoQ5?1gjaq{$UUw!uEczXEc*~yuOm@OBxH3J+RKR!5B^?1gU>(8G2`RGK| zlMH4{x-5bLAtmzY>B+(IG;U$on=>GuJX9E$v(-xwjDk8ocnZA5uqro>aen>u2_z<* zff%NbKUcV4EauA#hWq02(Xp<-oc%B*iLB@UyqRB}&!@}z)yvH*5b;+B-%Lq9r$>Kz zc64%hG(A2#`SR>fR+5y(y0J;AzvH}CESc>89sYH_ayeTrZPu%UPaR&$fty23Kv1fQ zsZ#XVtXcwBiM9?qsmRsra=x}mMTrKwoNs0qv&~GwxkC5Zo9D~L`P6Ejr<9O-@<_~F zZ;pS0C0s79K$p1A;?!MY$TZ>&N|lJg45ydZ7mg+VX%U*=FO1y)8u;6mem8$(4&|8= zSv$4m>j3P0_Ih)(nv>=OF0=C@u9Aer&Bf(x^~S35;=+nIDmG}r7j-(TIpDkM{LUHr QCl7vN&m$ZZ6p~l^f2Jbaz +biz<->baz +biz<-baz + +-------------------------------------------------------------------------------- + +(source_file + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) +) + +================================================================================ +Formatted connection +================================================================================ +foo -- bar +biz -> baz +biz <-> baz +biz <- baz + +-------------------------------------------------------------------------------- + +(source_file + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) +) + +================================================================================ +Connection with looooong arrow +================================================================================ +foo ----------- bar +biz ----------> baz +biz <---------> baz +biz <---------- baz + +-------------------------------------------------------------------------------- + +(source_file + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) +) + + +================================================================================ +Complex identifier connection +================================================================================ +Foo Bar -- Biz Baz +-Bar-Foo- <- -Baz-Biz- + +-------------------------------------------------------------------------------- + +(source_file + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) +) + +================================================================================ +Inline connection +================================================================================ +foo--bar->biz->baz + +-------------------------------------------------------------------------------- + +(source_file + (connection + (shape_key) + (arrow) + (shape_key) + (arrow) + (shape_key) + (arrow) + (shape_key) + ) +) + +================================================================================ +Many connections inline +================================================================================ +foo--bar;biz->baz + +-------------------------------------------------------------------------------- + +(source_file + (connection + (shape_key) + (arrow) + (shape_key) + ) + (connection + (shape_key) + (arrow) + (shape_key) + ) +) + +================================================================================ +Labeled connections +================================================================================ +foo--bar: Question? +bar -> baz: Yes + +-------------------------------------------------------------------------------- + +(source_file + (connection + (shape_key) + (arrow) + (shape_key) + (label) + ) + (connection + (shape_key) + (arrow) + (shape_key) + (label) + ) +) + +================================================================================ +Connection of shapes inside a containers +================================================================================ +foo.biz.baz -> bar.baz.biz: Label + +-------------------------------------------------------------------------------- + +(source_file + (connection + (container_key) (dot) (container_key) (dot) (shape_key) + (arrow) + (container_key) (dot) (container_key) (dot) (shape_key) + (label) + ) +) diff --git a/test/old_corpus/container.txt b/test/old_corpus/container.txt new file mode 100644 index 0000000..d0b5691 --- /dev/null +++ b/test/old_corpus/container.txt @@ -0,0 +1,97 @@ +================================================================================ +Declare a shape inside a container +================================================================================ +foo.baz + +-------------------------------------------------------------------------------- + +(source_file + (container_key) (dot) (shape_key) +) + +================================================================================ +Use quoted string as a shape key +================================================================================ +'foo'.'baz' + +-------------------------------------------------------------------------------- + +(source_file + (container_key (string)) (dot) (shape_key (string)) +) + +================================================================================ +Declare container inside a container using block +================================================================================ + +foo: { + bar: { + baz: { + biz + } + } +} + +-------------------------------------------------------------------------------- + +(source_file + (shape_key) + (block + (shape_key) + (block + (shape_key) + (block + (shape_key) + ) + ) + ) +) + +================================================================================ +Declare labaled container inside a labeled container using block +================================================================================ + +foo: Foo { + bar: Bar { + baz: Baz { + biz: Biz + } + } +} + +-------------------------------------------------------------------------------- + +(source_file + (shape_key) (label) + (block + (shape_key) (label) + (block + (shape_key) (label) + (block + (shape_key) (label) + ) + ) + ) +) + +================================================================================ +Declare many shapes inside a container +================================================================================ + +foo: { + bar + biz + baz +} + +-------------------------------------------------------------------------------- + +(source_file + (shape_key) + (block + (shape_key) + (shape_key) + (shape_key) + ) +) + diff --git a/test/old_corpus/shape.txt b/test/old_corpus/shape.txt new file mode 100644 index 0000000..c73d2f7 --- /dev/null +++ b/test/old_corpus/shape.txt @@ -0,0 +1,134 @@ +================================================================================ +Simple shape key +================================================================================ +foo +bar + +-------------------------------------------------------------------------------- + +(source_file + (shape_key) + (shape_key) +) + +================================================================================ +Complex shape key +================================================================================ + Foo bar +-Biz-baz- + +-------------------------------------------------------------------------------- + +(source_file + (shape_key) + (shape_key) +) + +================================================================================ +Use quoted string as a shape key +================================================================================ +'foo' + +-------------------------------------------------------------------------------- + +(source_file + (shape_key (string)) +) + +================================================================================ +Define multiple shapes using semicolons +================================================================================ +a;b;c + +-------------------------------------------------------------------------------- + +(source_file + (shape_key) + (shape_key) + (shape_key) +) + +================================================================================ +Labeled shapes +================================================================================ +a: Foo Bar +a: Foo Bar; b: Biz Baz + +-------------------------------------------------------------------------------- + +(source_file + (shape_key) (label) + (shape_key) (label) + (shape_key) (label) +) + +================================================================================ +It should skip white spaces +================================================================================ + +foo + +bar : Foo Bar; baz + +-------------------------------------------------------------------------------- + +(source_file + (shape_key) + (shape_key) (label) + (shape_key) +) + +================================================================================ +Shape block +================================================================================ + +foo: { + bar: { + baz: { + biz + } + } +} + +-------------------------------------------------------------------------------- + +(source_file + (shape_key) + (block + (shape_key) + (block + (shape_key) + (block + (shape_key) + ) + ) + ) +) + +================================================================================ +Aliased shape block +================================================================================ + +foo: Foo { + bar: Bar { + baz: Baz { + biz: Biz + } + } +} + +-------------------------------------------------------------------------------- + +(source_file + (shape_key) (label) + (block + (shape_key) (label) + (block + (shape_key) (label) + (block + (shape_key) (label) + ) + ) + ) +) + diff --git a/tree-sitter-d2.wasm b/tree-sitter-d2.wasm index e91ec96cf1556c296e00df4dc8fe108101eee203..ad324c52c27e04c0848fdd1ab15027582f0dd877 100755 GIT binary patch literal 22751 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 CHG literal 15865 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 z zOQMGLl0|MW!Hr3>=1JE7g0&b|9?6<7Sv1~7%83OjTbJMpBDEGu)_c%uq8kO7Z;-6> zU^QCu&Z|3(l0}1Sz%4*(HAxmF+(KLhoJ&$6pfN5$2qJURwJ{PN*1{=7sqAUU$bP<#MIJ(m>gY}(wbu}U{;G{kyo>E*p*tXl11rS zqnubSS=3`S9dOCk3dy3Zt+MJ&tOOmWPboPeQld)5dy089j0$TG>wS-TG*dA;jgr;x zGmpX>r2``Ip7!+0=_E+JXP8G$meI+Mc+WDAf>3JBV%`s!M-x$ERWk3Sr&nxMFz-2! zS7gO#=hCfm7Cp}*nw=Sn_d`#;&?;lS7nt{d(3_6i81_INhdYNndyz#n(y7GDf@mh~ zggTwwNaIJIMuFn}n0YjV`M5Poy;IDiuurmZ(z9V=DvMrX5lxbag_@}HvIhdn(FEfui$)-ab>Ak`{n!qeN(Gl-w%%fpN=y;b0vnFk&x|Pcs zud)WMDMRsI^LV2Ui&55#)hOqRadJNj6N!F`S7Ksqb1(LH+avISK z*=<7Egdc3kdX3MzjyB5rBuL12wp)+qVlf|O3H;O0KiMK5G;qsMHn@E(z;iti^|1ow zTro%bOiwz#p|n2p+&;$IrD$j}4!T&1r;u2NGA#9L#S}a@ASM*IR@kKYw4km-{4D6s zMxXQ0T8)9cECC|F3s6Sgxgh_FMIOreaz+|NHJ+Q$p2ooQvI@`sG0+@%vvP4`VDBmB zp^F$pcG?)Mi;5B3r;PF2Z*!xQgV=FY8W9&|vjh5?SO?O@dfB!IWms%RSt7QfEEAWa zjQV`uIibxg=xZVeq~pRv*2YHvO7JO)ny5uTG?%+vnBuiW8hy3K1Qv^jCkaXgR0=EcM_$DN}X^bPU1C^dIA)Z(cg`9oQ? z24(t+yB6y?eZ?s&yic$dve<-G=;h-|X~oMwvO=*`>(+36IR-sVd=4?x!J&0sh&_RK z4&G0c=5oIp%Esm%wV8NRJ{JTrYP^ zdv}U#-)bV;DkAqvjepIckqaGqSB}m4f0J$g9i=WFKuNvQen-1cE#A%=-c-udZvkoI zKVT~)$Mi6?$NKr0)cQ8ONZ&is{rry9_|FV}s*yY)HJ+Tn2Jb%CX0Va%j+NK*Q?Nw) zO7I-B8k|g7<;8G3@4a~#PvaTs{r5BYrpD)KjAz4(VtOu66#e7-fgImtIX>R6GM}DQ z&tBZd>)DHauxDk%o4@gF%#jh8JHh-tCpCU}Q5r!%K7BURd1(&5l+$Vyo{vHM5nl$y z(5lHjYX#qJeoc;l=69)DLodQwNcky7FaXZY`lrIK=6K2eWtn;t*!RG`|X z@AqS+Y`I4En{N3HaH8T2%9wZ)WraKuHY19R-U6>o{13`<(T;LyO7d%<67e3&Qqh5O zNlNltpr|;9GA6oFHY3KoYrc<~W~(a2@pg69<9W0w5r0G(v`dnxxPUSywxT32$^R19 z*AMVqDmJ1dUr18sNbR6_N=sc)U7or)|1L^}E1sw-H26`TJ8gw3nf6E}s zK#iaspkdJUps#|y3HmS4Pe8u{od-<`2~iDN3|b4i473mQdC)(B?gc##dJgn+&>ujN zF#G|{1}z1x1MLKT7IYKnIOs9ZGoV*MZ-agh(r|pv2bF{7fm%V`pq-$-pu?cQ2i*d? z9dsw?LC|+VCqb`(-UR&)^dTrGONi;9O3(sOGiVKH0|=8ue^NDOjsGYP%O@z&TpEx@ zq#i?GDRrcf>{FApKMYf4`U4sDe*(Edw$zy{g7a23?s>Vm?OR`tKEBEEzSvbpm{hGEx>OJ4cM=naQ9n;d+HLb z%x2vDYtd^h>hVA0%jm4B$aJ4ot@xi*Q*qZyeH|xa) z?6X~nrT} zQ}D%3iMgRKHeKJRBsFI~whNTE*m~tBec8)#xe6MhPamZ(5Os-Dj3C|~kZ%j%EdjhX zfGN|^pXy(mO(@mBrf{l%&S<62+3K|y*j3W)VaE?(+N9IFb*FWX2 z!mb=|!9e@<0lXoA+ZfA|is_6~;|=0yK>nEkp2b*}RFpDK*((p=`T*uURoSKKi=|xp z1si&5+Lj&my+w3NVYdl#xmc1 z_CJY_{LiS5b&!#d^^lQ|b&-(|zrk023+$8h0ZV=~Ban{@E4g0FdTs+vVI?;j{Bnhr zTo1?t7^fd!`&7QE_FAC-AU0gN(pOmdtI=sSZM;FO`}0>DgXeO4WiK?xZ%^TrJh1Sl}#@t|xFprjO@uw-0NEo0pPH#Y~@E z+5^XHzcnD=7{HqX7=GiU#)lhFK;Gk%YdWuEZ~Tk}PEvAQDMMYpcDRuR?7CQTsi5;q z`Z!!Hxm2{uCvTj7toG+?@pmr62YUDPCy$DFGVwRbcyBT}5+6t$6?=wF-PKg|EGbP#zvScz8IO=!?VW{-LXROk)4x!DRn|!Gt(8e0XF}A`U}%PL2!@Bt-nk z@JJu*5A})Oq5l27Xe=80#4fC=X3;w`GJGVSgx*jSHGoO{AJzkj-ehCCtWn9NW(u)p zgHPCyITozCkcH`iPy%1)3)2VUIs~4YKXw=lc33*K5VwO0dCpbolZOYo8B%)k8y~+v z;FI620V{~?!fZ^>MzkVs1=k1?=I9Q zK=**|2HuML0Q%Vt8Ueiv{B_WaphqB2f_Dw*IB*j5DtOO=$cNiduR?8ss6Go!ew{*n e7wAen*Mn{bwZg_U&;>ltL;VZX4}-3Q-v0wN9%GpR