From ba23994c6838f0bb206a226b64ca9ab66e9d558e Mon Sep 17 00:00:00 2001 From: GitHub Copilot Date: Sat, 24 Jan 2026 20:11:46 +0000 Subject: [PATCH] Scale box-drawing characters vertically to fill line height MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Box-drawing characters (│┃║┌┐└┘├┤etc) are designed to connect between lines but the font's em-box is smaller than our line-height (14px vs 16.8px), creating visible gaps. Solution: Render box-drawing characters as separate text elements with a vertical scale transform of 1.2 (matching line-height) to stretch them to fill the full cell height and connect properly. This fixes disconnected vertical lines and corners in TUI applications. --- Screenshot 2026-01-24 at 20.02.12.png | Bin 0 -> 73160 bytes pyproject.toml | 2 +- src/textual_webterm/svg_exporter.py | 34 +++++++++++++++++++++++++- tests/test_svg_exporter.py | 16 ++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 Screenshot 2026-01-24 at 20.02.12.png diff --git a/Screenshot 2026-01-24 at 20.02.12.png b/Screenshot 2026-01-24 at 20.02.12.png new file mode 100644 index 0000000000000000000000000000000000000000..49ca9b52ddcfaf9360fc10038464f504fda4ee00 GIT binary patch literal 73160 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 OX9`hInclYsu~=&!+=O zY)GQ;=UKT7&gy5z-WHtxpjndZWrf#$SVubSzb=Z=;4h=mZL}9W_n1aqj>_k8v~6ip zv)k?5mvBXJl|8gvWN9^bE4$&DTe@&*a3*OXvunKr~k)aW0{TfH3Jjy7yM1N~>G@Se5VZ8UOqcwFGYH#kv zN8E}0d}s`L81hA!uh?{-s+XJRf48WB#Orxx2+tV=SxN4QRQ6?B!#&Sl(W~jTZJoA4 z37Q6=<*2!kLbeyM#xi0`D5y{`Y+zOoA-}^-HD%1?<)IiM&j?VkF9@OFAWttKU!fO7 z|9+NyK@SDK{b@MMvD!(bxfG=LE8~A%CK4Xk_c` zBuGj5)X={_|LCWw8|c4UvT^+9upk3ueac~Ff6d1FZ`zQm0#B)YN+37W4_e|NYsj2I z+7ROA;T8C+{D0*9SBrnEsrg?udAYd$Uh{7`&ugkVnmUNtT0@$268f*@`e)_8Xa2LI z0PEAp|27l*jJT+(+l#$4_<3T9>t4EM3@ii;OUR~J_9KQz%qN8R;;m*>&LGNB}ges+-{oW%ln+Qf;(MPUE9$SKI%a{~XP{3}>$Fh`q3 z6+-C8KQ3uD2GnOsp&~C|Am*X4{bGLJC>B5#=2<@|KZ}a^Gr&Z0NBl`Q^doHC*z+U= z6O7NmeyHrh=R_b~=K7y5|8u(kUz_C-7k|(Im_0~vQZ(RY5F9dIphN`TB(B-x!@XFB zkT()y1TTwLCG|imPgyCiy#wbWS+U3Ef!@r0n3{E8&NnAD6KxIcZ~L?M@tQTyzib5_XF7x(b$FGi8trWxf-v7y-BCv%J9w>yCYW#z1 zMPNO+AxxKkf9HJpj5*X0q}kN`vh|)N3#NXART=hq`0j~`@#1fnA0vd*3)@Ct|1AxY z@0Ttw;$L7c?7PtX2mgnP;6h^o)P7qeJxd;@C2yao%4j{%|8oFeks$qKw5yhTmTZpw z8Mre$Y~afJr_?9~LHdcy`-|q!ZF)s7xs?XYF=`R=Y%1swxoUuwp2_T{ z>TYH$j)u!kLA4ByTGhZ54pUh$x3%`hd9~QH>F`G6Qe{KcF}2uQ$ake}reI=LsVLJZ z)6ZP`*pm79)yHrv)D)(5aAN>WMA~o=R&LUVH5dOq9w^(L74>YT^~gt*+9!gp;uT-< znuuuHhB$Y8HHA;CYd#v0Th8s(XLwZ5i2=%HXIVe5NHJ3FAC|h!Q*JP0msDXoTJ3hc za&**6if%jL!Fj6xzaQ+1K88HeeyzUyNhm{fD^|MiQSQK8Jg{Fpo8(y=Y1AWU{$aOT zrVE&cXMr(&C4(O4=SMSxaU8ZP{tVbrF3*&!Q>=&_0u0o6weq+2AYKmd?#f`1LnJqcdmc7hDi`9S_h7Y zSUEz0>i)>9W`{8Jmk_4*co^wMiN9NuuTc;lT^GEqY$biftFMo-*Nxw z5QZNf#R!K#D9w5bNlc1471(?^2CoBKmc{VLh$u(;VYMaMU>iV#A#$-Cjt(plbpg=kMO zyD^f4u=CCYoB7a}cb%%hXQfI+pGraG9GOPgv_GEB`d9UTTk2_<-pc$xwoDLRHq@B_ z?0=E7@JEM6dLW~8AT5PeK_lPC`@8D$dH*w{C-eCK%T;<3`vr*D z-@m+&Bkj)S5lp_8mi$Eg3W91#ZZ7sy|57T0srVZM$=GItDQf>Wl*)Vb@e$0Qw3=iM z2ghuWQE)8&nxi;>=l>U&7HUtLnRc&PnV@{&W8kT`h5+%#aN1Jg0IuzSXetQkphTB_ zPGZXkqEr`#bv2%o#)PD^oP5QRe@5tl4npXDz**v1Iz$!z69i^u@Htzau;jgiQG2di zSpKbB;Qo8vGNJ~3e}jVJeRGCRQJ`hP~DQY9MjFbkWUj}&PfvTY7-8}1CqEKj~t43eTX zz|9-<$jdyo=xM7X@U+u3y}H3wZd`9)3YuPWt1(KwpK)kL4@yWPvl5P5A4GrP9`G@? z?5ABFs z>f1P=tQ=z69Bq4ir`(^Wk1Mc^n~0duh4gVYho@i)8Q^g|WjET|N{Yv-rMk<&;{63y zWqmacSh%JObu(+YQ>=xtCeurmMQ;=O-Ctdw#q zWH{1)nqt2WL^e0y{mI&Wi~}9pL3Gx~%ZhTl(I%5Ug}qNbh>n~0Ja-o-FrEHEwobgQ z3)~QhEu@T?Crc`E4_PV-hCjgo5>5F=e`-kdo`-e_n}O$jgWZF?REUY(@>v9UL$k2&ec%G95lXJI%`_ z63Bdk$+dpv8YC^E96gr6R*L1QYtA@Cd~gDb)e2lk*lO2#UMnZ4yWCVA(W>mb9s#$> zHhb;`Z~IA-FY$Ye7JTI(Sjg~CETly5r^j>uZpI@ZT0JmK>1ux+K7p~4 zRqca$Z4=dnkT7%W-jDG8vb)RUqh2dC#ai#xPFK}E&%K7-4(H2z%DvWw%ea2m?xC@0 zp3PyTNB6TmyXn=xr0Q zl6*9hPRZl4IDNzKShc|Rb=PzPvjLxqrXpp3M8lKCl4w@MI&01a%4Ds>sgPk5bU{an z5O!mUg^UGymA+QbQ{xUvt9>;rS#N8{%E0r^TrI4!@4IV9LHA|fK#5HiR(m*$HKTO= z0|Z+zdHD`2*!Y3`WWsdJ+D#*eJNCN}K8@D>lh<)%e}8mMBVN(Z&d;02d+<4BFPNUS zypIlCp!KRSTDpUC>==GMFF1>*v6$g?yivX~QWHxW7ao^IhMmzwez%*RA)zBSldWpM zn>KW=#)KwKyXdKGh7pd1+0XhUu)8HJ!I`zQ2esVlQ8`@(b4F(TjEeAP(s%|I=blM zcAn@HQk+4WrcmHw24s{4ca4b&Nd}(P)G00C`n%a<`!5j48hbX@)lBEoWYF<~RCClH zl(0UH9MZZOo!l%dMCx;2Ij1NM8)40~^MGI*5+#JYSaY1uyfr{0D1XM=vyqS6>wQu# z_@KmBs^O(Mxpbz#@OVa}77f}=gDipKGo%e!f+F|@f}3*^Rm=^VI&V&ai@S5&xjlGn zVRB-l+wqzV1Ql5$n$o7;UbWl%t5cr92wQ%kwz&HCdV~G}fLsEG5QuAK}`Eu`E7RKC45*UXzdn0IE+go)nlTR+P z4x*u=e?3-~?|uC=ZL&mkY8Ia^^~m;hiQ^9Nh84V6)m>p&if)PDNRKr2p-e!-(Bf}_Hb$k zUxrW{N8Y`NbiCemmV*7nIrrUZzBIQ&deJWTcD?(MB|1nZ0=pUDDr|34zaJw^``Qao z(sEe4#1d7dH4L9n{CE@V-MPn;pNo`-2EX~?$e*F4w{YxDg~p7}{4$NYlxkpqWMKY- zaot!g4J4L$V5=m9LY77uoIm8nsOxd-ijCO|XTLme^>dX!(!eMK9}u!{uMR)m!cTfD zSAYC4&dXKtMiyI?xN^>x(W3|>GXMV6+eJEB2Vxxr9R5RhRrgZ)NREK?0TJl zO_gna55sh!feipbN2bGjkT+2n`CLTnb^5<&9TVkGBb?H*_H5C+^ENo9GgaF5sXoGkR#tj0khIL#LLXxgcK*jNl>i*5f!XW~9e-#y}JSUuGOY# zv2~61Z8-$ne0}_EH}XjswKGwxX65rZtGBOv|7F$ztMvc@^g+`YxO~RVrp(!{xjFZR8{^8@sKA&3(TQj^<66c&w#gLY9X1`I{@9yK7yY8QLe*9QYLfwO9Vi z1Utq!N2^`g!GG~PmB|B^_jOUoc1+(i^?@$PFgGkq&gNDfbT{EFQzrZCDy`aXtd_lY z%P*f*-lhBUM<86jZn?^=>2Ss{Pr(&;LY*XX-g2%jc8Rb<(i*=6RU%R902sef;O44a zU!KkR{J~{uZ>xOWgRHQA!aMFYl7`})OgH!Kaq<|>sh37yDn0;v%H8(>5cuUMbKr1` zgSi`IAv-x)m$ZJ3RduWU+gVj`7IcnYj=5_qbgZ7)F3W}+uHqN=FYodi#?`M7o82Q4 zN^D_J{@AHK0F)Iv^Prxxe9$n4;#$Gma9AMMG3lB?OqPBp&sCdY+GH#vT2BCdI1Q z0KMi`uJ$!^#K>%arnS)Z>5`c}IP6Q;t%FwNqSA81ZuUtZ!0U4hJ&#*Nzhg_mNeDtq zZ~Aj{OdsE7e%VaV%wtj$&Q>J9JKz>aC2M0B?s06c-y-vrtS?qUb<6ULv#C!s0joM2#m#DN3c$X{t?jDJVCC2laJupBWLt~MQ zMgGOZ@S|7$irZ~FEb_4lDt=NPmv0kS?)BzHGcO9!`?ofmcd4JykmZ`iYG!;5d|M{u zj

ui1SO4!mG9RzcYf>4Ggo7Dg=l2?3f}C-8a_xW3`a9GFt5vc-`_dT)`JjnEs&Y zG5D~$*WTb6A{&RKCHt%;Rej+d@1(>$K{Dls!SF-F6Ml8(!FQo^%i6i1-x^vz_ak+- z&Sm9QW!G*XuW@6cP|~W`5a+_TKb;FAnXpeV!LNdLaf8K8@UD<6fxCl}oAJ=9tk$~Q ztgG*^l$UoFFCtFET;SD%-FYwLr%kCteeYNqvXyYoUI&Gg&p%VXWs3bC4dzuCBnLyF z`*rz#aEN+W{Px&z{Yn6C)!K1XF>8`X;mV=%n|ExvQEyZDjNkL_?)1B1fm+heaxV=Q zGN6OsGzQ<-J^F-z>XLK(Dx@@-6=qxxq6`q?3>s1=E3MU1bb)naS0uJ)s%hFc z(#$Ff5NKBx$kNlo(y<5DA-nOuy6iNc9X@erj^Phc3yEfW)UPyAuHQXw4dRjOK#y3R zK=B7suWS=_{KPn@k+~`-!5O|^7n@p1KQz{j3t#R$f(k*pL4v(lF)r8rl$c$@arns z5W9?Y2hV~mFK;*F#mM(%V=gj^IO8&&#**9~k7aVDW_5Ie zG^%q#vd9C`f}|=D_K9Oa3bW{XD?x2%w2ertk@70vTuSV z5okN^2NpLI@{q^|Et3Y2^Az{4^UF_8cAXL6Uwq;v<#StS^V<4`cI$4_`rYJ^&9;3H z?bf5?CB*HU&-~|3k5J^R2Jha2dGMtAU51Vh3x4LipT)LSax2};cy#r%-GVYM#Rd+< zt4Vpo9(hg4`XvFbH(J-OEKCSdKey88<+%;gjcY%@Bbn-`WZiI`_^ zb%1#>_u4xao=nu^*5mwO!BEzN70k`hKzyL*Ah=homfGJ`WmvOv{Df)c|J+t^1&Xu^ z!N@Ja-Z;!SrCm0)(Xbtqy+T_V%v8)(Q0#llxSn)U{aAJ#fw6PDqfT%@%T5 z&3z*Br9Io_FYjz|>-@rFz!dd@k0IG~=p9Hw2^o7zuuUqvlW(=JCwjI{4E-xU;7j#FeP^daD)H>{T`}rF;SX1^H1>b1 z-!16<&Sh1E51abTJ5PR=jv6u}<3n)C*-_hgQm_u05NFMMq6lo*@t`_Ve3#j?Z)5P< zmrRHmqG3hE#`)z*dBVCWKb8m3DCuUehcXOvkJTFGdHIT)cWMj9m8pKEXL#7wL!=EN z!3S;?B#ysPamhZH(1PvaI`xKhrb4W?uixH}-FNQVHtnFZmh~sF6h1UEzWUykRs&b)a(F1h+ba)YYNbECzQ#7a)kOX&vW3PB4=R<@$<;vyWuq8kw3YgKR@&Ms6avy zmOH)KKWd=ZzGRc30TS7&KsUSYMf=$793l-0DvLTJV2`}!z zeda)PfAaD@A~-(}zC$8q?GyBsNE-h_cmIgqd|ijcZEEhQCZ0$3xxyjC%KpKq`^+nt zNcS(Vpiq2)N`CNL#|<39JZS7^-9Ux5rUUmxlNr#vd)L=0eL({J(XRFr^`X^guD+)* z!T&@D{t*TIKO@xkKLL;buLB+sv3ZG3O8n1QrpBdlD!;1@R?pq_=`Nbwi)RtyYEr*i zY(U8+0*>)BF*T!shO6XPhv%?C&0*Lz4 z-ia3ZvjIq`LLH)M25(GoSpUrN%T*BZ2NeiI{}~^)fKIjf4w`XY^6qSMKkcAN(#4{c zPfeh8+Co{g94P9x8pRWfH%??zpJ{qnrbYGoAj*>? zKg~s3(`DAQNdI@diUK0K;F;2-@h`*8Xy3cl@_xo5>NR zO8;2znyzI&RDaw<)ame(MdKW2j0@Dbu%GdGXHM|OQq>{VJl)+)1kgW*=#)5_FLYjj z=Dy0)avWuMKBHZ2|yR({hdOG?Kgx4 zK?D?#aLLo51Bj8&sgWkL@4_@qipXVw>>a(&?XK68l0Z$5_lJr|TPMK^rFX~Cz9=Y~ zJx?b9FeG^voK!?2j~jg-9}ItdrdVF|Jd`JN;d|ADHcU=_@Ct}D4~Pbp={GaJBW44N zNc?Q|05cwKNrj1+!(op=Vt+)nb2g18VBdD|g00ZOFK;<@?b_iAdf8v^l09BYxo6ZY7KIcCqa1Mwr$_6*N^ z?3TzF4iDZxT(&BD6vq-xW&~qmTn1+jq7t+_^^&;8N5=sfvq$>*VZT#?VHIH^q5t-H zu}UpC74_=Yhx4)!bf2Suz60|NZ*F3{wij9<>K~GTg>9K+kTU^#aO09h);JF*Nv-i2 z(Bmr{2TD_#&?}3YEtBt(fJmao;KJO`rRQvF=*pfFUtOM9u-M}}(1uwC>6ku-K~>tr~Ku29Ud!y~4$CM|#s56XsLGVS_RaT7CS^`c8L?akpc8KV(2g=<*hcf3I9jFN3GeIoj3k z>S(#|bkh+LP%<~`+CZFX5#$Ow+ZvV8_bb9}o!VGj=KS3A z?z1zR;Kv0tj+rM)=$)}%jYV`kA)Z&ezJptzq>2_8vvy~q4B;)V zUkUH4@>&kU??|<60V(fIRMNLkY*jB7q%x8W+_n)AE(-St&}DdWXle7xHBJXQB%A+m zlS?Oa7c)N%${O>isw%7#*k5RLeUF}1Y#6L^Qs>drpiRhV*~c&KZQB$1st*>Zhv=GY zn#eHyszJCZafiJhZ;@mNDPC(rZ1;Ks-JQmna;G*>;#y^w^9dBk3aYU!Pld>JK^RhJ z*=neF3EXi-Cwwh)5K(^ceK%Oq=OoT>TF+IUF^lvKE`t!IRBm~C*I{R|X#EXbLQ16!##rgnJF!JMS`Qz5Ffv6O!GEVEYj7 zY9uu)u+Ts*384sEftLdFbiS9=b1#N##7-dL@X+V7aoOPU245JtPSUQ7C)!XOgmlJ5 zC2ZP3x@a}kp#Gse7?d3;yCfxiGiq`qaJ*K>1KVEad%wHpeK~hJwTlZl&vPE5eMdqi zs1GqE$;x@U)ac!A!`HQnDeQg-aZDu@J%sBEIot4LUTiYs0=u~s;4ASL*!?3SAKT6( zU-=$)^;g3#B+$H}9bxY-C_A?nagJEm~>l zL+z~D^3`gzqD>edc~wka@;dvPBX>X!i4?g004v>fx#qsMy1K1~A^V8*ssq2}^Mvpo zL84cBfQ*HL(DhnQ=J26$nmO<=6jlX5ce8*EhpoaHM^Geh3NR9G;&P$3A>sCF3N+z! zU-|{sO{v+4Ft{@st2Eu@wv>_U)-q2^sQ#he_)?I)NmEsPd|)1bwzoQ06>aNPe`Odp z9W5&}t62(eJJK>}iTrk3(KiKWRb|umhqv9hn9IS1tbRx4_!aC814b9f(c3s z=3w;J)L*Q>znG)DZdtetM8y73)0Bg9-9;y){E$}bFeXDslb}|F;}RlAx*c#COWJSA z?RqdT(urm)HeMWBZL^Hm&B)YRxmzxLm~8hUW}P9y_oUwyBA9ql6ErKy>|19-hQe3v z=!`wd`RS^?k{+kub}48voF*e(lb1=gBz;7@hj|EkddJG!a-_LxfdKvZo381cBmnUc4zC*XGp~^Jj>vo|_tn#jblY%^Kf4I25#p zWqvGfWlE=BfETe|7I?NxTynCau*~9op9&Xst2R>d0~D2C?@m@JL^jb&4F7f_ zNaB7uI(y#}Zgp**j*C{3TK#?$S|{SV->oE0NQqb1eLVq}#akCyRF06Q9DYzNgN;8GAbjF#6MR3?1@gmF7^CZTGnUoo)Rwg0?!*8T zQ(aUIc!2LXD~;V--8Kcx=cI_Yz0U+cM-@ur^)-JJ*hp%yl1(4PC0(Lfoa6R+-#iQkONxXNcDq{t`m~zA1*5MejYSvpUfjVs|y{Rzs9{h@U8B$~ZP4V&wy2`uwOcjT9A zZP1T*=ViXAt36RnA=1$=N`;06FLf)Ul0s}}uVgqd#2}`{AjF>F0dB>FBiP_>1z(2d z3w}&E4YuuP_FMc|by|ZLEU^jr0GGJSc}K;L*}I%+eb4>1bnhVeWs#SY^buOi9`Nwu zgs;f$+x4OW(~*%l_(}CAHn;a<8a-CHfI|om$4&7ghop-$4n+&ySWx~tUJee!X9EQV z`PK$@6XeOUHc$AMFiP(0(Ua+FA1{yUT!jeVWj1+UF1RY*_5UQw!X+bJP5b7Q8Y8qV zlLHs`5*dkRo>EcZxU2FOzIUUh@Kzm|9@CIGGUCUCXlzcK&=j>wyGuJMpw6;o=QDJlgs=Eg2r&7DQPkaycg}+aHl@1!c zgwAkXbeDPCacm}$dwu|vNb4qiMIX(_1l~(;e4ieBq4;(k2br?quJhAf^mpjtK!=UF zr3aS=_I@;*9AFj-d09<$o2TsXF-zTiY@`Hr)Isy*V%Y5$_hF2sG}p!1EDinGJhx9~ zkpbBu2vdP_Vo0V?>!o#E?Klye`RN{v+qq_8n6@6>76aUwGD70s6ho&g-{GU2;v>#} zk6+37bn-N;EUNE#%?Bj=M$>>JWqT^=AZoO*`n^XIMW>jVSa%liqQr~jvoI(1Ri@I!_i>9R^p*6)Y~LyOUOBidFI0m6(1l=V18X!@>{l7P+R+}NS6eql|URm0PiJ> zZ}pKH5$9?KX3*3p{sYYe`8?&9JUE=fMC1wfgeGi+yl%sU)_UvuPNc?{uaIfye1_g` z20q@lKK}GlchQZJ6P^n0M=WWpxJ8;?y~g6 zN@`voTSnmkBIk17e@INokJ+$TQPKdI)|ytcwPgfLoZVt%LzE5|qV z9PgbVhv1hiL`*Qd5Zk6J?HxdTh`B9XTYrh?3iKcuq_2`$GFyY^!W*9-Dzm9sf$}K(E)4NQCukn2Y#wFwO+?mu zxB!Vwc9#s0KSNQL)h3svO!v&mJu@b7I`6$jX<+^C6{#XWt-gx{8*cJc1QtMOxJ-R} z^#SztYe;W#jDH_8JS=O1vRRiLC!vLc;Q53JzTgkln`XJn^yLq6+oiXN!bbD8$+40H^7jfPz!LN%}{=sI#wW*S#!pj&ozvmrO zlwEUdOrzF7{(WP(o1A#5!I@m0{2|9mk=dQ#fli*6<%1zXm$C9=9YVHTx=Q)Emq=6# zmK)K%rszD_w&|#X?@`o;Ipzth)d@Zw2LwcztixgB5;=-WN8qz`*0(2L z^Ul_0CH91~%bPArE6vtK!`$p2dP9^~kv zD#>p>32=neHg_A?YuTewwyTkS(M^>d^=kA4-xjAF`k zp7iK+$tK|eLI&_2q5ID!*Rd)IP1~wLZZ*AadziXD;uBbG)Sb`)X0aLaJ$8?ztyd>z zpm=LHRQ7B2#N+go&)J)(!y#Od)1uicwddmP;#OD(Z?%G@EA81T9P+VDjpHn8$gBD| z;svKUI+Nn@wz39WHSLjIf7NVp*Q&dFkR8QcZWxGbw-?ovuimV~3wqkWf0C80DcY*R z${Ew1UWVN-r8Ye3)i0Ox^#*@@V}1=Wzt%e+C$78mn zU^|w^2FuGArHE$F3ZS>cfS#4bE=8di};!db750S$r9NkF54 z*QVsFpTW%i{lYpN*~PDzn~MbEB*{ONSNE9m4<~X}D-Cx(P5D8K#&}10t}AwKBxl*H zxx-n`JBr=ZkHm*dQI>)$SO7^L<5|d#CgHBw9tB7#I_s)e2zkXZCpi_9p@~`|^^z)2 zB0~L>T%f@=nferU-}0l$C^L)C7FOI5=~`PVW4 zYH%bFKM@N+l3CLTJc)ZV!33uNO8;%3i8ltw!D!3cD95HO!X{>vGOEtP(X;BO#P(ojufK0Sgl$rvoe% z1rzZsF#(ffkZ3v0=>ZntjC7fyt2m|N*hl3-8EwUE^QS0c-qY)^FjnhJ+*NYQmk{@N zjLDn!wS{wna*dxrgGOjp^U)wSLlwk%(IODcpbwx%aO)5_?n0;uTbc-Y>D9Nv|9!E(DT+>NFOUrBMacCK=gZesD zv*fk=Rlw~mby3g~Hmu61d*pE>9JVobQN!Cg_b5$mn&k4+ljc(0)Sf+sEg!w}Oxc)gzz5F?hf@`3d=M39dH7ulatVa=2&{?RcdtSfBZcWP~tNBZ$2@U@s7!_a#Bzsqs zYdVkq+f2ykrIzPuF<5lim#&+v_xqv$MjfkW1Z0Bz5zX9NR$H7)5)(%V zhCvOUr$^?8j%e);n;v$+sj?@b;31_>IbUtZ=Cw}Ic^-r4) z&Goe<#EkZUQ)vb*Ak)$c9as5w3wU=&dkY!R9U1|sgULgM1C#gMHqmj%4pPouB=Ph( z06|r)E!ep!c!_vBe<=oh_?mbzDEdNyT>H-Xg_C*m)mPgP#oOdbyJVjo!~5_FllY1> zJp+~=5AeXr9EwNl{f+xefM;d0(kZM;bKFNQ!gV2P@Yl~qSO7T&F`M*Yg9zFCUQ-B9>18Iv#+BV2>+uVd)OJrNo{h|` z2@l*QtV3J%R_*1w^map~ zMr(QH<&q{__d0xrX68e@*~B?GYo7MKEH+@G?t_bb%erJU?awP%6!(|h5Z^A^qD-RX zENeS#5YB0`X8(bLZLFNWl*y#-34xpENgrL3B4zt+G(nD1u;%gov&FhdJvyJ>ZUARXxV*ShXr- zS^_2elksFCeC^-g=&xkqhkq|UKGc!KHWX{HDU;_2@_XRkU)Dg>M<@;wLtjX(Wq z@Zzj;G|~~3@D+@Mu?{4d6Nf&n?Wd3_2KTxoH^z|$Y~=rVs|R6K3Z6LN%4*d> zR#1%OmiPLcR)ux*`IH|+{2+)qxBZa)1hg5KieP}A|oHe zg-Vk}zFk}|)M1gih~o3B9Sb%t4f{{FIlvQ}uUb)-2t;OA>)G>W6~HXI$=11vr7H}t zyIGiiH#5_-*PalVcgYL+w>wITMcD7n*p&mK%4DtTFF>mPed)mJc%b%oK|s@yNmsUH zlx#XmRv-Xl)MRPpt7!nMq>6j3EzZPyiYQX&e4iV11_#QP4lmv*{SQc1956zkK=xVh zMY@xrJ5zlzXNPe1aKs}6GP|Q>(O!QXFxlj6bMumpDb^NcYY#8TwwI^|e0K6@tI)!K zYXVlCJ#TeEPSEm#Ij(@v%6v6!2K< zLjkzjYRALu!c=8$8}mY5pKaz$3(^^+$SgJXL9*YuTqDIdB#>UDg=>yuglD(pXpnv6 zb&DKtV)xF6NOj><;#rCIHFw1Zk{3;JXdZN*?X35vDul5m(m$$=t~{&%ft z(3!p=1sInl+Hex@NH_c*`T#r4r zRac49A%`528%@1J)rv(sQ~w^bPmvxgpt}`;#8#S#x43iE-4m?8+EHb@J{|TOY!Glk z*(Z419nt-defzX#!yO0j6Ev+PPdH~63n>rbv3`XUa+R%MDuouBuo71`sLeh;8!nK! z^ZOjtu}s9g)F(Y5Ftemt^tPa|S~eh_uY1l0k#O}PILLE4#&Yg^jn(NaGL_e@_4V;A z;bD@s#OW>ADe7hKUI^5VmHTlUAbMy1Syqwzu6Z|93KDcv%rVLu_{$SYrG_HW>!y2V zJ^TguhF?6y}?ZsE#i0+u#)CE4>-7v_&R zlbn%lAl_t+;=fSSX;!po&7f+3IpMll2RAW}3*kdz6Vfg#@ogs|g~w?sZW;f_QC<}WHFA4D`ZdDP@fDpzhU zlq>&q8^VoD?!*N9xV4!}bYMjofI|>jCf{~$Ec9r(Benz9d!IAmUejxL`l#Ot{B;%0qk8u#q_Vj_S*d()YeeQ{-py6WCbh+Rjt9`&RrIU#R%uWzA$VaB< zw})sn?Pqt+`lOfP=E#zMJ__p@R0@lf(@IaKj0*Qhp&YuZMP`RvwlZWQa3Y$ot&W2s z1bq&}wJl@P+G3r^*q8OlX-K@xZ%VW4i42pCMITEW`7APBN}>heKMBF_G0|Q3DpqeP zSqgSXQrXw!*}EkDO`%;6$I%~--P$Mka2)lNA7uF^6hzEp@JTarMxlnx0}Lf4_v*6~ z-B}SN{5-bAdd&e`Y}$=~Fpi1*q>1ATG~i)jIJnu{FqS9CYP_}mqpO*K zO_qd^y8DH6=?0S!9%ofy>%0&1G+kHrkhZM0TFU*@H>AJTnuzRsyBvu=@9hwtuu#g6 zEm5*GF-?rQ-64IDCp^)j4KwP#wE+b?N`0uNb9?7OvRfgPlnyG*^Fefe6) zH-s-{bH;??Po8d&RMFwDrN%Y6V4H=3`a14NRS*e6=|h!`Pw1OC2kOIV8u`}K$w-Zw z+1EqyGb_K2k3bxnu^zC{z#$5U8ZH`_htGQ_vVQ9$EFs79Dzm#14(paiAAR+waLMCj z68at2ISOr(=A2-C25FXxsQNK;k(N-zdJhuex9qMbYX(mcyIGH!@{{udrapP|hbZpN zuZ|p(mPG`~Uah*t)4ATD#!_RJ)}`o#W`ECo@k)o8T!lmS|0C*LosrlSevyS zsuh_Vr3gUifS*Ig?xtWJ!wlRin%teVxD@q(@xh@0R{Tm*KP&R6?f_m9O(fcVpqmZ{ z(m=iQ=-=FpiS82*``+%kvEn4oj1j9S!~&aRt{hx0lJ6$BDTX1b{0D)Y8zBq$b2Ag+ z`uKw3YMn_R$FvqEBCWeEVF0Zt0BAp;%~_Iv)&vAW#-s3fI7LU<-}HY80Y5qttp zIAM9XGV0EKE~G~N`r{EQtaHa#qqdCf#&&X$ubprL9@Z7VO7`Kf6hFqWH1QY~d4Gl! zhdeP#c#({N_c*`5COKeBO!bC^jX2SvLmz?K$RPILdXjf?eg zK32F85i7u^p#lO-dL`s`0nkNh1jbY`YWfjxpi=auF9AcSXp6#r&~nmG-v@^oOv8>y zMUj>Fk49*LO9%zR*m=i}e){ieo$0jQ)Us*Q%K|pD!fIp1N<&wLdpS`88X0`=!HqEf zH#d?;p41&dh@0@q>-u#@mGKBF8sE`7(X?&#_Y5!aSiUxUj%ADbB%dcGq}^|f_dNdI z_Tc7n)c!nHpE9Yxx0?Jv^hW>k^!h*zd$9YPb7U|;T(@THtTE4FBM@LVl^%o$WEZo} z>F5$3RofsMry=bSpo)TFcmuProw!p}&KJg7{bNKpVs5Fl|7>zT6xk{%ha#<;^i-{l zor<8v;bXmLVHL6P4=AtHE>y2F3J4-`qe=ciE>N4XsF)8yoXD3crbbBr*FyN8mSdyY za7efi2<@-|iqRP!nb{TU#7^;dZ5-}BFDv z-Rn$0d1Mt#ND36cMp3%!)1jJ_diOLUv_>w8U-wkXNf?cJ2?GB@a%1J<5Fv=O1T ze|xmg2o3@7>JX^}l$rpL22W-71DFIQLTE|k@CEFEh;t*woT^7@H$)1R=3e)=9Xm8e zhm8OL>wlX!Kc&CU!eL>YFRHCvV#)E1E$5VjA@Os?2v!1j0nFH*ao4zaP)OhF1Hhh! zMlGli&2^EcoMnYAIi&pUO4W~jtgs;-Kb*oCYiTZ#SS`61WlzMS#sDW0gEn88u1x`l z^{138R6h`nlmu4wv{Qo!4p*=2=$>%YF#Tippuw&s;s8#Tx&YZ*=RQ6D4RZRWcd6J^ zo;oMbt&wq=Q0zB{WwdU9VUmK=ew9862+mmSHz0^qPqY8IG|a;_eq?z;!p9Bch1P>d zlG&-}y#L&QCAbclafhfGD@xEx4G z#pH;y4Fh~)-%VR64zgvmb)mp(B2ya#!@ zXqpp`|7O4g!?Q+)q$C%zgY#`VDJb+D^|H~;a<1O?{F%IMD;P8Yi~Rc(%Rz8ZXL$kO zLyOky4VmZ2TrK1>zC{u#NPnlFHNxH{!Yj6U-9roIbC4QlAMS6Tchi$OS?nB@JsU)E z6HS3rjOM^j_o8@0$p=$cJZ=eYcB@V(o`fRTJgJG%d!FVb&W7FHiPqXD;! zc>vJH+Uz)Dl~AMd{6n*$vyEZG+g^S4VWnDmyYFc>k_)pLeeMrK z&@I4P>;nl!yHsfK0`NE#?2QCgP5ZSryQOs-bC&k|4@=Jl@mc|)s~YiB7>z%U{@b@_ zqyD^?Gsc-mzrK6DK_TR1V0Qv6x;GTu^Y!38%$;qt1rA+mx1LJnsNmTn<93AZE{P zX-S)j0y(sTOfNUJW*1xeb}muwL+?Mgey+4yfK6Zac}`OJRvQ!YCdcghDP-g#{{YS6$4o6TAJvigyzT z18$Cnti9N`N&YNOZfFq#^cs)D#|F<`rwg-LHdRJP2!C85{AbOUzQ2%7$5GF~UxM<{`sqA?k~^%uZ)Z=$y1ifw$MSYTrtI92%>W^Y{8mz&!M!F#O-R|JgQqZ$ zQtgBd2~X#~-K!diG6*7eqVbS&*Sbk+4-OFm*}I0< z9^>`TmJ=$>DgD62dY0tOX^fZ;N^zVl_S2(T!W{$5ZE5x6wf)@VJI-?p?%T&b(oYjF zH#6MJ^o+O=^ZSkeq%Pi3fyd+Q>jp9q>O1h%rF`$&{?gxBMu`I=U$F{_Y7u^zk!5Hb z95L7q1CM3B*nD7JElGx+ISN9+qp>J24%<~t(1K6eTKKQmVtpoaHH_x;y9M$!iFutY z*t!Y>x|~asaBe~R7G>~aQoUH5W#*pPWyuHoAiUE@YLM7@4kL*q$uMUhTv$`bh>SfS z^)k?0Sfy*{py^Q7=yl~PbMq1O$Ej2mjK}^ zV~>?#6t+UwDsfe)yCl4g!Vnd zQH_mibg<2jkA2)MC0ekvbgM!~Z&G0#&Xs+8A>1QH?#bO6wP2rRwcCjMLTva{wQU5> zGikTX5W#Eg3C@BUeB(5X-rEWoWR0H~??f~kya|&_7;ud^fglOO9~X$Dm5s);_0>R2 z$^+e%$F=D=`0{qKo>Wncav8fJx6Vmy$;)WDZx;CZTp|S@uGYNzGA&UIP`(B?ip#Id zL|!O@d4t6$;n zdXMPg^(pp2>P$+5rO7VBMdNsYsfpp}ZhUW480`gEyv22r4M8{5QgnBWVJU-z=f1+C@xr?kD$oRO1vdyo_yYPPd`?akQ`>$J5$P!FW2=2Ko`#F6%8a>9rqcln3Wn_N{tzELW;exxdb z=LG3GwSYV|N+-#1-AI0y7j-gHGFGz3Bgzmap_(w+gqbNOORsG(@8^c@T4DV<^f1vm zJ;bK>mbKfm1qc=*(WD6=p@r^vmu>@u$OXb8_MExv?oLP%*&Yj2BQD-1!IlnwCfay)cgIaPiyQWKR@Ue}o-H>l zQ`-R~T*g7`OikoT^@2vv?|wWN_<%~P3nB<+%F^I!ww`z;x3}mH5p0K-^E2k1z9B{H zGA=gXl`IAem!>~!&Ehb7`pB7+ZH6<|RJ&35b>u}Miqr?rz|ta-JUfNCT|>29_-s%_ z+jy0$BO-*30%VO#=NZGqHHsD-Bl!XHgOQb$!&v80Ip}*`sg%kLW!_ELhQobOzq)7a z+Q+V+jmBJmCBeEp>i5oYG)R=05&F6`TMM;1GCmt#F?w#dzBE+v{ zb)>f5-1MN!=JuG8houEa?ni)R6Z<0`@^7bCuT1bY-J%bK@%omYgTK4L&%qBwfG zB3SS`{=OHJV!>cd>8|wEQmc(LS*%6ewbWzAJRnOT?N1DyNpNnidNRwA!)6E8!jl)wtws9XD4`3YkqPrKC5j=gEE00-<8{s0!s)}hMK41^?@Thq z=&a{wAlj1|f4SWo9y)0(aGKm{h<>3|K4??iex7AQzw*E!`yenAcqH6BzACZ#GQrrdrY^Tz5s2-pDjw zcGlRoc99`$?VzL7n7>ur?TzJoA}yNjhQ7)xlGW;WUW3ku==e$`y;ZjQImW*V0$kjj zx|w1E2YbD@@S*!S%Mfi*KYZKsYi}SJi1yw7c<82TCy2v*;<{pbEqIN3y$7S}d0%hq zW*5-bUbbGgv|ATEk$s9us$TH;vlPw?Ezamin+0!5$ZSf2`pRsqC1UI>Cu4 z&f4|J+yUt+Ll_a#b2q(lEm5aA+nyuuKbPKyX2EoHK}Ii$TE|D6vuUaUciiaWimp_n zrV1B3@`x6}c0ii&sqZX7_9%+(=K*PFH9qjtEwvK1@#Nhe-@ai(7N!v<^X8{Lr67V1 z*{ZegJwxY6IG%Az2)7kNNWSiG8ksKQ&`5a~9Nmy|jUP|r?-50^ia@}cFxXRC48n#> z-7!p=8_Cm=f}p6-O7*ld^qzt=yU=}Ex~Q|GPO&_~F+FIg`PjfuVjQ`f&*qUrRXib>DGNp_K2X&1hhNNJgrzppHk@Ki` zmhzt!zI>1$lKQGdRQl`jCAY?GWjM;1R_j*nMQK)b;ca`ZDLm@(`1q1$aZy~)s!nCu zB6j;4JAnw*3fT}1iz!Aea{`d5dVj~8OLdZ!p9Q7MaXLcN;|qMocvO$73Ajg_ps zU4B8&v!PipO$D;m)>1>B2ONSIXlEQcFB_Yu>b-K+wRCfq{VU`nYJn_Ce*4?lrJ7t< zdqF_;0!bLJ>l@Sdli7Otkjr2(w7vXPt8ZHs6)YAZY8OnNXP;T{=1U~nMJTWs$Bd3^ zEO<@l#@`;QF=%t6Ch|6k6O@e;eCLkTrZMl@Z1q6nxGnmuj)sM;!ADuCQEG}%Wt(>P zFpg}{t;WCjPADKM^i#_599~EDFwbtBa}R8eu7~|>P%vl=%^64WEh=n${zAyhgCK$` zc$;JOV?Ijtvl8H*bsFHdOCnI>)}MN%4JIT)SfE_0L#P|kc>_lkUzDe5M7ilE#{?&A zHjeH2hHS0Y$#f<7b}4!Nwv2wK&qc~R+!m}3pG7R)ZBX@m>|2I%Mb+v=g8#BRnu%x6 z{db&VfC?>_Y*b1ZCM*z#Ct$ffZR{YROtN_ag)d1U;hR&k3FyEJ5`xc7xn4~c?VsEC zaMPpW8xKi79Lilsy?n{;|?Go`lP7VX*M4W!=0}-$=6* zTLdyMPc% zO!N>Wm}@g75544L1z2jIbMdjy#cj!C%jeJ=ehyHy>@z?^LGKwCP&k0cits`>WytC2 z9kGx=OFZvpH78HkEJ1CjPqR?)I_kKXQwRvWS-P=!e^uzf#R&Sc~# zgCrgdeCPHcz_1`M;%is3p6?LsfVDWuUoB1|Dp*Vvalj!};7Z#y#dPDmcRe0|R3Mv9 z(2K=q4UGl|{TU?RJ}aN_&r-N$n0J?qI!-9khdhR}o=_cv?UD>K-qr+4udSDpS5GK* zObiP|yA!-@ES-VkBlmbo*ISS?(8uyDT&*})Fdt(V`0AYfX7Q6@+~^`NOABu)GODMT zPJ-76Igah|aLYcQtYdR;?@U4^6z_Je-mwB%yb?|=mS6VXl5o=Acb+RMJ%h&T-5e*J z4>SkK=eI7Gg?EPdhf$=bJ?tym1eWIr`Pt*jIfoS)p?-46e56`yl_=2$`erK$dZdwu z=|f0ifmFK{5t`*;d%7z(^}V3>-bhXtp7U4XLVYiomtUwR@-|mIlQx)^8X>XI*#lqb zu;$H^4MZxf%)9!+P>BSu&V#k^h6)!qR?!af35nTOZX&OVrw|R+FnFxlFeAgMot?^F z2kf4#88}6LM>Hc+v1y%F43<{oTbZX-@v*MHMGK8V-htwVslG6%g`vv zPk7H|MiiY9Xu64Sc+$G^*g+X|c+{?^Hb%#8OjZSh_O*eB=zR&3X&Lf^Xf9Mk&Y89} zqtL^R&;!?kNbpY+FU)*!frno{!F7XJ^YB3ok?NVEyK}7Bv4Ks4ayRW!3$pBQ*N3N( zx%7m&`xD?$o$q!qqIPwg8zXA1op9|_@e587hB#xCyzKnPast2T9*tw1(dMaHl%hla zC;zC-sP!?q6$-ru3o912{ytz%*#InerQM)J!9!PD;>CIykc1hbF@*N_ZUiK?Xxp z&d9tbalC$4R$*&4E?a)K=0(acxn*~{SU76Rcrtj&qCQ>2G%L@tZu>o6#yG0DU}b6I zJs9D0YbAB9W4?$PO2H<|1=v$^tHf3LC&9A>rGph?N!?dn933)|&Hk0pL=51|R9{D~ zmdCo&&zUJ;4uhVRJ??=YndmS6*GW8FGZAvg9JxostKBA8g;)2rBwUy?7e=38rkz<% z=#V*bE8BX8Bvxq*#?M9q?4>=FBe#DrIRl7R-z3Eco8}F@2}|r7x%-*!8$$9DX;lMd zIk3MM z^RCl(|Hv}y1hvkWkodslj{1HUkDu57((hPnA(&pVRx=<}TYaVbhg)a-NGdOTU{N6n z)dJ-~o^~Ri_ehCzfHIL7f19VaGC0Vuj{UV$0A#QJ%gj|SY$RY2vEng31tTRsYO1?Xy$GELnON8`UGf*d|35$EjD>W@+OWZ=_fpH(c3h2)w;4PS*O? zlV`_Q1~>(iGKH2POg`6VKTDWg&*whb#g2JSDt^8es+xa07CbM`IPkBnH^F7n9>S0P zJaZ!qlmT{$BdI-?JUfYp2bgKwrCC~X_x8N(_DntE?Npz%s;yRv5DR$E&Qa{M zR~g%k6@5Z0w;OeteXMdoUwU~oQl4=_)f(k?(!yO*z1R_iCf7P7qTj5(U@_>V#m)$G zuh@n*)%D<{YI{7_zZEs$v{#5@C)_&QwW@TD(aR$&# z*@50MM8`=$`tWk#5cqw9Vo!qcg}xE>;Z65>3+qQtEEAopDrfOs{wcF(?Q8Thb6j41 zUJB1vOvR8{tq3`vJ?_5vNR?T^1w=n!%=xs9xFNA<%vwk}EmgmpVe>wiBG1j)VL$n%xfR{om(lDgo_c9i30|z)|5a-dSV@W4kdXX!-34j;)3g1 zw0KNZ+3yN3N%#y~BQ z91aDRXz^>?4A+TJ#hEHObMz6h3i7?|64=@e?CTWe9iy(&vmgH$LESz~_edJio9=vV z>RZ&?7&M~4Lu-A0J+T+hY*&&mha=tII6EL`C>PSyjoV73|1x!s&tHBAC^(aAI zfd!LR@ssMV;rmC+cDgunf&)Fqr9Gh}WE$t%Ue|`a&CLd1OPtsB6&^hsNxeSYGQhqt zU9rsN8!hk$7y;GKN45sK{;4B2Gs&yaW(<@c`Rf|ixwCP zUOi2#kCxwtdUP*<@$cev{=kiUdZ{k=7^lvLVhiKKwELBTeSGeCzgkRnb()hE|7>Ar zY|rS|&&uZLA>S318bdo6Z@92MQ;$PEo-C&*KMwxBKk=U5H{>{<(-moI$(8+zkCW=Qeg@G7dI@8Otu(yI@HddGSIV|&>}{&~9tpW2tqU@K3e3b<@2^JnNrc2@zPk6Pgm zXDW*7Z_IObR$9&OZ7lE7Nmiz4RGbb$-Up&;>+!E4{ljs5%CuMW8r}9z9aU>kmV4PB zDY1p4UCCg+W0MtZn8&BZ)Qh}pUxfQfuktfK2TA?Dh2)^LEUMI*smO&UMf_m|)qva* zFv>!avF?5p{TSt46MWJ;AP4`53xR!(0#9k*_-rL7*@JH)9G8@ffY4ZE<6T$y`*95{ zm$&G;t(6;^9Ef2FJZxYPn3E3ldUEPQRUz^GAyAu|~xhddASs%TE^<}bxGwKeY?m%Eh}ei1?4=?>mY(U3?V z<9^W9=<=wA*aLYm{8$(gGQ21ItF;SyEHE@hk(9I-V4gBI5!{4#UHC@pi}?LfkRSt> zovlSmSXd@gsy@xg5yIDBgcLIJ>hC4GfM5$_iEx`c(OAy4qr?TzH^rIwQbEgxrJr0R zEl;<0>_fM!QMff_Iu^AXBm|2+c7?!jJ57ILoaY7dB)!TA9u>4ecQ7#)!O&hJ>u0!vMjmZFt1}&MSgba6F5(;IH4u9&zHCNnYrq?imchKqUYyzRcIIvK zQFWwK;xCG%dS0_GE>UtgBMv}h#a2sQ=IH4CIJH)*VG7tHKK-Y6!{Q(fy42RHO zYm{ylLp}IiWjA*@i3R=zp#@Rvx#ts+shX+#IpgAf$(gx69vQ|4IAM?6S_;=(D&Dmo zolVG58x92$TB$vd#03a-#UcteM?0r^KU@ zo6fcK%!FP2pK^lFL10ak2n$#y`CZV^myX@B7M<^SWmvG)FOOUyE$b0c?)=vz%U6JkN4kMaT$iO+y>l6ET*xM7*jc_1Wk>mZFqVH;Evutt#uE2fC@rQ@9 zl={8&a1FeLR`if)S_vKX6d=9@8N_E&Y*pbkBKe5<)9du8IlrwnLRN2cUx_f>kmQ!I zTwRf4XLHnbme}viYe(sX_Pki@3XpoK$1#BS{k_I9c44)C(bCa=z%=ns<2?|>)JM4; z!a`n#>_<80DbDRi=vBL&(sWIb$8z6goHf83@M4Z*JZ$PymQQX#Ex?&Om*#-@36ss! z2(j|KuOn>Tek9&^$JkAt8ilGX80DlM+O}C+Js+Ltrfg1deD+ywm0?z|<7tqCmHx>%K%ZZNNWc|> zu^!QuS+?QsUjZN+$`ZX1GSb%4Sh-~d+16iXu)U}=MV$r1QG?kgi~_6L+P1S!WS54S zAi3Fld1duVCaXWlYMUp|xxbF8GIP=jD#T)lugjwT$hX&+v)YU82yZGTjH!_Zzel9& z35fWwk2wS~IwQ0xJYtedek_tQam7lrcd!P>+CnDN_eQMO+?R~UT4g=qvsyNHYEPkx3d+REk%cf*-@kC9XH zo7s2PH5rsm;(!T^uCQ=wHyGP6d>yTTpB0ZX#f1dljVnL;!FInyUOlJlb0R|B8;$V$ ztHS0Zbc$fi6(~Gk&886#iH(xranwuSrPM+a!S!MsR%EKa6HmjwGZ0%=?LpRusT z*mxI^$5naNsuoBOpACv9(nVZ6RGSIKCdj75yK87AUT}^-{Y@2^_V$idL4;5$;{%N*#tr@sw_#Q$(#MkRSrHA!?{lh#(ruzm&$l~T zf-9BdmDH3yy%s!+c9gYm4u9GH9*ApvzJ0uZe7}TK{6c>)Adu!2o|dgRQ>^wB{|}@) zR<`5)ugpguFE=kWFHpaMs)v%VMjd*7jNY`V@DFqrIF!f#`r-2g4v&_sH+rzHoAA-) zXp+r-u4HU8tKX@}M{L~j>2s%&CJYv+(#bl@KDV#TXy)5^M zqzz^;c3B@e78T@ZjBdTo(jECR1%&c&0znb+ozw6C`5Q@u9<6j>qLM=>b*xD26K%q} zU&No**M_nf$9|=`ulZ8XH&uHd^cf=`vn1kw{Zb4#n;wcUqU;!cv}~uHFv2Atx8VRI z>6sQQxW#5W@THGt{`QP+2#>W604=(ivxLFPOC=&K+28_S8 z{=ZsNflSAr7CR;(@?Y2d_oZP!&WN6fCAl5MYxw*}fBk3szrqH;QXn(k{;!+)k9!&c z*DKo8F2e5ppPK#u{;L{^ed1NMXDlnaa6EM{J~^s>bc}aD8xwD8kx1}{_4_Nhl8EiE ziMr~na40@y@4m9>67abM6LMNSNCgn_xfE*Zh5V{=|Kz%^ehHu-gSOp06vB&8VEV=t zTe2-805B!*hD2?*BH4sJZQ-w`aBAvzD`CvTW!?aSnd^-KVQ~^3iNHbTn68aObSQQEt2lr z12@prM6f^rTEPK%L3K8&h>0D36lB6CHEEQ~KdVAFYrH#u=qv5n|n2}s-^i&;P z&Pf)UXYW0rQ5-Fz0RrCuSdN9|6yx!E@adHE2L*4gDuvn>Ht-y@!o91yv6oH(N_z>i!aoouO1Q=&4~FT-%zAJ!@(}{)P^#Uw(*cyWaTVptW z$fd4u{h)t`+{Fd{nBjl>$Boe}o@*4OwxDqfZUNP{4O}fJDe#9`dx#D?NFT~6(gDcP z1;fK?Hr5}pGQ9#}LZRF#cszSxwdC&(Oz)&eGw;v%P6t;hA{fhmJbCbfwqn^eDc99p zf=aDbRshZklOr(HOY8}CmRZn_-Iuc$D^xa4mYYMgp*|*$PM+4vGpg%!(Ei3zA6RzitM^ z^|p|-x@SrDzL4J4)om*)h^}o)BJpwZFNZ zn#Ft%=E24TC)HAYQStD`BdV#sNDB!5@(H4Eh`lr4q)E1UVgSDlJoW>{KlI87r@4- z_aI_l%eD)fBxkyzSznr|A$Jxa!^Ef8uaY#>P%gpXXt)Is)*3LZ{j;U`v8oMB|C<}x zj|C;@9{z6q^hTmc1-a zclzD8U%wh@1(wGF5+J93n3757`E|d7+jd0Oxrhus3z74HdV+^^BD5&?;mS5h-klW^ zT4{Rw=kC-VdqPR=*R>VrZxf32{lNRib&6`JYF{hH-JOeYEa*;Ug>h13|Gbb=v{z50&WX z*7FxV0qjma%!u;f;r1{}TdX5e59a?XJ~AN06AvcZY}8BJy{()mComK9(k}WF;TAyN z1grT8ei?n-$GZbmk;tVrn-ULo@QJg@CuvN>%UCdr%u|&O|(WBAc!1OFcn>;C}B)dfZPiHTBlMe<21rz-=>0NFA!Wd8( zY)_!)l?y^cg&E}g@mc9H$yvuaS)Sla(Ut6YaHYg;-R03NzM0aRcxUH$;~|}SJGaSq zJ=SyHI-IK0<@(+kAeE-5^j;ZrV5+n-2@lr%98#1>a%erXH^@9SJXbA~84Hxs@E8dq z^{SuM3u9dS;DBrk#M@QPVT&OSjt4aU);Ks*mxFa5Y3tEAv90@wSzoOha`OZXM1b0h2(S4?2dc+vmD75dEsz}9{1UYg>^V4DH>v@WLwZERdIwxLmJ&E$!chH&7m z7fZi{x~((Dz^ke9SM09jL~dLNj{c%t!eoC4*xzQ>EqzycmFaQPXJPsJAg5KB<;=Om zRxG4YHH+ojOJ3P@=tuNRVt=0E(uRF12u&@Flp+j%)sM8^K^b+ZkQjaVxe+}wG9UVF z*f}TuO}n7-wHIJxjJio%UyNff6AO8Sifqd0!%v>Pz@7I#9pbvZ$w?$HOfC4rl4qu` zP?NRvcyjUnzmZmW=63S`HM7D|#s!62t4BF?`RLdP zw%vw#dBOawdVMkP{3)n{jcN<^tZy8Zt&%QBreb$LiEOm*uYTeM{lp2(qUF?b5&XY) zf4c@gt9|qWU!L+%zBG+a!VDQ005;gni7x9m*1>7SoTF#=G!^H>aR8beZWoQ)41*fvEDQ`q&K#Wwph}A|vAZ&W9|DY1o%v&riE=%+Nfc8DT?`xDPaOXdKo31EX*&CFg(C zypFRG!G!mT<^bv9uEtPN0f+cCHwpT~_phsScP=~MxUR)E4qxVO_E*QU1Uy3zr@<3^ zuX{jj@JZq^9!q~NCAJEW%*Cz;7wtg7DK=f7-2pfXTpG0}r-H72q0MOVFF`{S$;C?hjxW|;LUV72qxBE6TnlF}ub6>%@) z)}?=qOgJO;>B7ZDlb;2C(4)9cVX@_Zrjo2Fp#k=Fuee?_XTA*4PZVOQM-3OV=vxkO zutQ{)EES}FZmgWbfwKZN$o>mKi4p?Vdxd# z1Jfr5|J)#*89$aXBhDWu-RAO(oz>J@BRD(- zr&y^41!}DPm=fcH+B~RK#(%YIpcGpu zhgH%tLSC!*p?OI#lG@AkNSgF&Q}T-F55vEPVslBYimO@wYT8_4;g1 zhej)9%d8|=>mfMM|J9&cTeUW zD0zSQ0fi>4u_Q#}~de5p_Ngta(N#b#Xq@g8#aF5|iD zPuDNICx104hoiA*Mv84>!&;1V>rY25Hw5ih=UTOH3ikNA&{C1_f|#vX z5#}ajzYMsn~f&&Ju0ku^Mu&5@vU#-ZQ%EtBn3YuYoIUg?r0;nl3T-yl0QUaqF9 z@|U?oSc!6QP=H9zzP)}q!b_Tf{#K7l>pb(&g#WQ zJn+Wj{PI8!5xovcNB(GDt)TI|_(M-CHv_3HvwD#KiAQ6nSI$ve($|(k2 zvo~@)-fnGDgdO)qzduC8539}yP{?QJn)`{)c)D(;QbI~sGO|5*Mrdzc=g z&?w5f5wN6_O;n|{_SEZ8+tG7!Rs#+OZ`5J46#1_~r9_QI^-?^0s0(h2vqT{LE4r*k zZXzNUlQUZ*It4`MvqI+`Wk~|hTEo)+VDGJi;_9}y!Gu6?*8ssKxVt7ebRdM_9y|nx z;1HZ(!QI_05F7#o2<~pd-Q8#Rd*58CUrkMYQ!_PRP2E4bl4`n7pR@PcYp=c5vz~`i zbKT>&{IB;O5^trBdgW?@*hhDKzo5l$28h!j`#Bqr*=-BhRoc7rwBckb-wIISXdDrl z`WB3{PL$~R+4xwgWUIH0eMqIcv)0TBjo^G+l|jfLQ&`9iuTzY{6$&AjfK5RioHw=OBq+$la{WO1Ok6enjV<6`7Ipv9|V4FvVK1$g7OgU1F|+;QKiVCIYBu@Lh~dwIDU<$~Wt|)bBRC(Hk z1A|IPgnn?X)-u)p{?voMEqnB14(hm?pO>V4;=#BF*gj&u=Eo2`hzDJ_R(j}c6j%oy6T|qG zFE$$Cj#X-)*P~u{-YXpjb@0iOzXBhScc$W~%)`~bBR)SPv{SoPL^IfPoEP*Pj9FBk ziI28;A891t!YOo(<^qAh>L<<3y+u7D?kgKkwoF>;Eq)t zV==FJ58I$T6?cHlz?MVi5Etu+^rqv?b7|dSK}8v<@05}uhmRGh-rz1g>Ejwzv|Q7e zC4{;A0?oQtHTbcv)!Ad~ye;`(T^CW@79IJP^F!dJ58 zp!sIiU|&lC z#;P{cG_JqV&%7cMtDeY~2~6eBnm!&TZ}!40#U7jQZc4Sg6a<+0QZA)lDwS`6>xafT zSKci*Wu=kD72a-@fewtv&&d}R)g(w1gGE$|SUE4QBxsB#x zJ4vil$6_khmF<6L-Y@9Emn{E6FraL4PjV1?@lv=ZoH7yFD5%UC6~_qlktmm~ zpEFBB8xD1gyyTH5IWvzC*?tpdr})aSl=ply4N-(O^EDbkvg0Cq%KupmVl&Qco-KjX z2<4c^#6^GUr3tz~iT8z(8OuM5NUoq9^$>*~2*%+Y~7 z4Vm1+j7)s_kIEle_swK0mj~Fxm^?86%+UQDR17V@P{)QdURel$ET-2r?cl2BQc}8m zcs=Cihxjg3OR3kh*kXu^j9MSYw-7oVTXAnyWhT@jm`fYo1ZruAnZt!;>AkqBh6_xa zjphZnj<@c>iK~a3lM}Ku{W&<3;OAxTW$e`_Lt&DuukM5OS_S7j%c+HK1fH9D;@hVu zV;qvM;;F9te7YiRmrIJ?t%y%Bba3lmuUu2K`I2L?#Ju78-E5q>Z<~TABq2(AQ07>c zW_IKMS@H)$lq6;4Vz)0M9A5}w=c+oP2oA*&!$e0AokTLa_TH(GOWLVX31t|t_6Xrp zJwUQS+mIldtmYI;hRR+@MVp`(^eR&-ju)QJa9D93GhMneoFoX9{H;S>Exa6lk5z&x zKDj&76)a0MrQ|cvy}Nc&Qsy=0dms}f(u0Yd7X}kjtt?ktio5Y`}-qCURcsM4U_MkT495*JMN_g>ZO>TM+y9zPo4fR zf#=1B!PAgR2ZFT)Ya)5f--4^iuX0h5m)yZ&)szRi!DE2PMtmaR!mra<7%jN@L&k7> z(_@K1b8GDOOfB(vUJ;NxK5!irqVT25Yp1v-$QIZ9{HpCIjKhmD=>-jG5V+QUhhTQa z_%&{Q$&W;vm^Cl0>x8F3h(WKD{BA#B&=q#Z5FUW{sZ`$sEeOVvbNQV1BG%%F2TJU6 z_bN~A#F_)soFof1+RH$rke%C;9jk}vPK;1T@eyE9{;o6U;RKD8$s&sa8no$)D z`!MYOn`2OLWd|uZbu>&yk5sD{aJsoWGYvCsK{eM<_t@<+NZe0{H_s&Cx4yCVM2c)b zI(bCiTXFSSVrz;|jEw8AncTB)dlz}vlUEV4{HjfmM5{&|Ps5bFE88_9lQqva)S?0Z zu{23ajPx|Wwrz?9s+X7lXBrv|8k-!61aX;;z&5rJ8YBM{FaMO7ng+}tWIqIHo+%n_ z!J{P8_=~bYYi+9*Xs~TR-|%DvU@|UCAZugwBRXPZN}9hC@#Hg^-Iw|e$QgUIP@mZt zjIc)ey#_VsbWAV7wlSxeJ9bzX^vAJ;m^GfV0Y%hyy01~ZbY4O00kgyizA^z)l61Kh zlr9=CYCADXAel?Qk-D-6jMuMx&883bMfE^)@-(qe=3&>oB4KY1`H(P3vs9yN%GGgT zlD#5{FjRjMkxqxO-$0;G&2Mh9K4)u$P!$HG0)==*JV}5=-f?hQR$~Os6VwWnbk~BC5FAmco zjGD{k1IAMsm_cEI5-avyO82GoMRoD2x0weE;@Qum?}xS(sb5bx>D!hvT53>-TGj*B zo<7Ad5}8@VoZbo|cU51dr8xPZkMlQFgFp=dBQ@D!7GoG0G}xC;PuLKt<*S*wK8L~= zHiw+&0x>D0eskEZ8(3bSx<+Liefb}_fY0RNNML9R!mI562bv�}RWUUD+6t;lH69 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 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index bf3a4b7..924ce5b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "textual-webterm" -version = "0.3.13" +version = "0.3.14" description = "Serve terminal sessions over the web" authors = ["Will McGugan "] license = "MIT" diff --git a/src/textual_webterm/svg_exporter.py b/src/textual_webterm/svg_exporter.py index 8549ee0..a56bfd3 100644 --- a/src/textual_webterm/svg_exporter.py +++ b/src/textual_webterm/svg_exporter.py @@ -50,6 +50,25 @@ FONT_SIZE = 14 LINE_HEIGHT = 1.2 CHAR_WIDTH = 8 # Width of monospace character at 14px (typically ~0.57 ratio) +# Box drawing characters that need vertical scaling to fill line height +# These are designed to connect between lines but the font's em-box is smaller +# than our line height, creating gaps +BOX_DRAWING_CHARS = frozenset( + # Light and heavy box drawing (U+2500-U+257F) + "─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋" + # Double box drawing + "═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬" + # Rounded corners + "╭╮╯╰" + # Light and heavy dashed (U+2571-U+257F) + "\u2571\u2572\u2573╴╵╶╷╸╹╺╻╼╽╾╿" +) + + +def _is_box_drawing(char: str) -> bool: + """Check if character is a box-drawing character that needs scaling.""" + return len(char) == 1 and char in BOX_DRAWING_CHARS + class CharData(TypedDict): """Character data from pyte screen buffer.""" @@ -232,7 +251,20 @@ def render_terminal_svg( if classes: attrs.append(f'class="{" ".join(classes)}"') - row_tspans.append(f'{_escape_xml(char_data)}') + # Box-drawing characters need vertical scaling to fill line height + # Render them as separate text elements with transform + if _is_box_drawing(char_data): + # Scale vertically by line_height ratio, anchored at top of cell + # The transform scales around (x, rect_y) to stretch the glyph + fill_attr = f' fill="{fg}"' if fg != foreground else "" + class_attr = f' class="{" ".join(classes)}"' if classes else "" + row_bg_rects.append( + f'{_escape_xml(char_data)}' + ) + else: + row_tspans.append(f'{_escape_xml(char_data)}') col += char_cols diff --git a/tests/test_svg_exporter.py b/tests/test_svg_exporter.py index 2ec9b04..9a6bca2 100644 --- a/tests/test_svg_exporter.py +++ b/tests/test_svg_exporter.py @@ -328,6 +328,22 @@ class TestRenderTerminalSvg: # Text tspan with yellow assert f'fill="{ANSI_COLORS["yellow"]}"' in svg + def test_box_drawing_vertical_scale(self) -> None: + """Box-drawing characters are scaled vertically to fill line height.""" + buffer = [[self._char("│")]] # Vertical line + svg = render_terminal_svg(buffer, width=80, height=24) + # Box drawing chars rendered with transform for vertical scaling + assert 'scale(1,1.2)' in svg + # Should be a separate text element, not a tspan + assert ' None: """Unicode text is preserved.""" buffer = self._make_buffer(["你好世界"])