From 85ab5b02f0e6292f83c5a336101cff88ba463c19 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 25 Feb 2026 08:31:49 -0600 Subject: [PATCH] add antialias example, move fonts dir into examples. --- .../display_text_antialias_lvfont_example.py | 121 ++++++++++++++++++ .../fonts}/LeagueSpartan-Bold-16.bdf | 0 .../fonts}/LeagueSpartan-Bold-16.bdf.license | 0 .../fonts}/LibreBodoniv2002-Bold-27.bdf | 0 .../LibreBodoniv2002-Bold-27.bdf.license | 0 .../fonts/goudy_bookletter_1911_20px_1bit.bin | Bin 0 -> 2044 bytes ...oudy_bookletter_1911_20px_1bit.bin.license | 3 + .../fonts/goudy_bookletter_1911_20px_2bit.bin | Bin 0 -> 3688 bytes ...oudy_bookletter_1911_20px_2bit.bin.license | 3 + .../fonts/goudy_bookletter_1911_20px_4bit.bin | Bin 0 -> 6744 bytes ...oudy_bookletter_1911_20px_4bit.bin.license | 3 + .../fonts/goudy_bookletter_1911_20px_8bit.bin | Bin 0 -> 12840 bytes ...oudy_bookletter_1911_20px_8bit.bin.license | 3 + 13 files changed, 133 insertions(+) create mode 100644 examples/display_text_antialias_lvfont_example.py rename {fonts => examples/fonts}/LeagueSpartan-Bold-16.bdf (100%) rename {fonts => examples/fonts}/LeagueSpartan-Bold-16.bdf.license (100%) rename {fonts => examples/fonts}/LibreBodoniv2002-Bold-27.bdf (100%) rename {fonts => examples/fonts}/LibreBodoniv2002-Bold-27.bdf.license (100%) create mode 100644 examples/fonts/goudy_bookletter_1911_20px_1bit.bin create mode 100644 examples/fonts/goudy_bookletter_1911_20px_1bit.bin.license create mode 100644 examples/fonts/goudy_bookletter_1911_20px_2bit.bin create mode 100644 examples/fonts/goudy_bookletter_1911_20px_2bit.bin.license create mode 100644 examples/fonts/goudy_bookletter_1911_20px_4bit.bin create mode 100644 examples/fonts/goudy_bookletter_1911_20px_4bit.bin.license create mode 100644 examples/fonts/goudy_bookletter_1911_20px_8bit.bin create mode 100644 examples/fonts/goudy_bookletter_1911_20px_8bit.bin.license diff --git a/examples/display_text_antialias_lvfont_example.py b/examples/display_text_antialias_lvfont_example.py new file mode 100644 index 0000000..3d2e755 --- /dev/null +++ b/examples/display_text_antialias_lvfont_example.py @@ -0,0 +1,121 @@ +# SPDX-FileCopyrightText: 2026 Tim Cocks for Adafruit Industries +# SPDX-License-Identifier: MIT + +""" +Expanded example demonstrating LVGL-format fonts with multiple bpp values. + +This script shows font samples and labels for 8bpp, 4bpp, 2bpp, and 1bpp +fonts. Update the font filenames below to match what is on your CIRCUITPY +drive. +""" + +import supervisor +import terminalio +from adafruit_bitmap_font import bitmap_font +from displayio import Bitmap, Group, Palette, TileGrid + +from adafruit_display_text.bitmap_label import Label + +display = supervisor.runtime.display + +FONT_SAMPLES = [ + { + "label": "8bpp", + "font_file": "fonts/goudy_bookletter_1911_20px_8bit.bin", + "bpp": 8, + }, + { + "label": "4bpp", + "font_file": "fonts/goudy_bookletter_1911_20px_4bit.bin", + "bpp": 4, + }, + { + "label": "2bpp", + "font_file": "fonts/goudy_bookletter_1911_20px_2bit.bin", + "bpp": 2, + }, + { + "label": "1bpp", + "font_file": "fonts/goudy_bookletter_1911_20px_1bit.bin", + "bpp": 1, + }, +] + +SAMPLE_TEXT = "The quick brown fox 123" + + +def make_gradient_palette(start_color: int, end_color: int, count: int) -> Palette: + if count <= 0: + raise ValueError("count must be > 0") + palette = Palette(count) + + sr, sg, sb = (start_color >> 16) & 0xFF, (start_color >> 8) & 0xFF, start_color & 0xFF + er, eg, eb = (end_color >> 16) & 0xFF, (end_color >> 8) & 0xFF, end_color & 0xFF + + for i in range(count): + if count == 1: + r, g, b = sr, sg, sb + else: + t = i / (count - 1) + r = int(sr + (er - sr) * t) + g = int(sg + (eg - sg) * t) + b = int(sb + (eb - sb) * t) + palette[i] = (r << 16) | (g << 8) | b + + return palette + + +def load_font(font_file: str, label: str): + font = bitmap_font.load_font(font_file) + print(f"Loaded {label} font from {font_file}") + return font + + +main_group = Group() + +# white background +bg_group = Group(scale=8) +bg_bmp = Bitmap(display.width // 8, display.height // 8, 1) +bg_palette = Palette(1) +bg_palette[0] = 0xFFFFFF +bg_tg = TileGrid(bg_bmp, pixel_shader=bg_palette) +bg_group.append(bg_tg) +main_group.append(bg_group) + +# font samples and labels +x_label = 10 +x_sample = 70 +y_cursor = 10 +line_spacing = 8 + +for entry in FONT_SAMPLES: + font = load_font(entry["font_file"], entry["label"]) + + label = Label(terminalio.FONT, text=entry["label"], color=0x000000, scale=2) + label.anchor_point = (0, 0) + label.anchored_position = (x_label, y_cursor) + main_group.append(label) + + if entry["bpp"] > 1: + palette = make_gradient_palette(0xFFFFFF, 0x000000, 2 ** entry["bpp"]) + sample = Label(font, text=SAMPLE_TEXT, color_palette=palette) + else: + sample = Label(font, text=SAMPLE_TEXT, background_color=0xFFFFFF, color=0x000000) + + sample.anchor_point = (0, 0) + sample.anchored_position = (x_sample, y_cursor) + main_group.append(sample) + + try: + _, bbox_height, _, _ = font.get_bounding_box() + line_height = bbox_height + except AttributeError: + line_height = 24 + + y_cursor += max(line_height, 20) + line_spacing + + +display.root_group = main_group + +while True: + pass diff --git a/fonts/LeagueSpartan-Bold-16.bdf b/examples/fonts/LeagueSpartan-Bold-16.bdf similarity index 100% rename from fonts/LeagueSpartan-Bold-16.bdf rename to examples/fonts/LeagueSpartan-Bold-16.bdf diff --git a/fonts/LeagueSpartan-Bold-16.bdf.license b/examples/fonts/LeagueSpartan-Bold-16.bdf.license similarity index 100% rename from fonts/LeagueSpartan-Bold-16.bdf.license rename to examples/fonts/LeagueSpartan-Bold-16.bdf.license diff --git a/fonts/LibreBodoniv2002-Bold-27.bdf b/examples/fonts/LibreBodoniv2002-Bold-27.bdf similarity index 100% rename from fonts/LibreBodoniv2002-Bold-27.bdf rename to examples/fonts/LibreBodoniv2002-Bold-27.bdf diff --git a/fonts/LibreBodoniv2002-Bold-27.bdf.license b/examples/fonts/LibreBodoniv2002-Bold-27.bdf.license similarity index 100% rename from fonts/LibreBodoniv2002-Bold-27.bdf.license rename to examples/fonts/LibreBodoniv2002-Bold-27.bdf.license diff --git a/examples/fonts/goudy_bookletter_1911_20px_1bit.bin b/examples/fonts/goudy_bookletter_1911_20px_1bit.bin new file mode 100644 index 0000000000000000000000000000000000000000..dc65f16e51fd97b93ef9e145617419903043fc33 GIT binary patch literal 2044 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 R1-zA@`LuGXCYKOW_#d``+tmO7 literal 0 HcmV?d00001 diff --git a/examples/fonts/goudy_bookletter_1911_20px_2bit.bin.license b/examples/fonts/goudy_bookletter_1911_20px_2bit.bin.license new file mode 100644 index 0000000..20fee83 --- /dev/null +++ b/examples/fonts/goudy_bookletter_1911_20px_2bit.bin.license @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2009, Barry Schwartz, with Reserved Font Name OFL "Goudy Bookletter 1911" + +# SPDX-License-Identifier: OFL-1.1 diff --git a/examples/fonts/goudy_bookletter_1911_20px_4bit.bin b/examples/fonts/goudy_bookletter_1911_20px_4bit.bin new file mode 100644 index 0000000000000000000000000000000000000000..e113034b03f11aeaba790222020b8ae17e5694e0 GIT binary patch literal 6744 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 literal 0 HcmV?d00001 diff --git a/examples/fonts/goudy_bookletter_1911_20px_4bit.bin.license b/examples/fonts/goudy_bookletter_1911_20px_4bit.bin.license new file mode 100644 index 0000000..20fee83 --- /dev/null +++ b/examples/fonts/goudy_bookletter_1911_20px_4bit.bin.license @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2009, Barry Schwartz, with Reserved Font Name OFL "Goudy Bookletter 1911" + +# SPDX-License-Identifier: OFL-1.1 diff --git a/examples/fonts/goudy_bookletter_1911_20px_8bit.bin b/examples/fonts/goudy_bookletter_1911_20px_8bit.bin new file mode 100644 index 0000000000000000000000000000000000000000..473837c9aab720c8242561a6eb2ff0298cd9242f GIT binary patch literal 12840 zcmch72Ygk-*MPGkf;znYCx{eL4}* zh(8Y=W`ed*Aho9^-5396{I`cq{*&EmwL!_4Nc;~SHF&HG$AUi#&$DEvoxm@S89Mmi zpzZkcrUDvG*J+MvzWEi)5=*|@RyT|FbE{@OY&~n8YCB{Lb06)#%e}XKr9Ia}^XTrm z*Ymn(g4d^BC%vBb-r#+~=eKtAeIIHc>bJ>nh=13B$iP{F(LqOoCI>GJnH)MYEI530 zL|){U$k(EVML!xdKDHpv9KS7oREHfM#w2`{uqNR^LTcj1MBk*ZlWrxAORi0RHRW(h zmsFAJo3<#eKCN%Z3mxaC?@bTPcrjypMoQ-Qnf9#rvMyyk+^MY7xlZk~iH5&8?YTgl zODKzYJ*VgQ+Q#c@%@u{E6i{LgkAIQHcA%*DSo?bsLS*Lgt=`cy`cSM#cTT>2h3y?d z<{4j$)GE#c)jhMy5{XjAP+)Oyq9z}aGMJOcZ$w!e1yOqJ1Dq(>ojm=ZDf@nk{D1*; zt)ayI(B?W$nJ)_>ud9OcXH#}_Nl9gqR+-Bw@qc|x#r)%0OclkJ zZde#k;iY1jzGYz?Px+R66(1Q8_ejx$jM{xyzwY8TZq(|)q#|nfsi9cZ978*VeG!u& zB71osE06z`vWBLv?wLOr_z1=vD{=byGGn%1C4sc7sdqp<}p{&T-57 zegc&2`VK}Z&+zy($uPys-WAlT|GiCH#V0G5@8p!YYU3;8DD@PJ9!gJ^ZY9%@2_v_> z+R&4ldJ9_jA(NFT`*G&35u=W0xTHZ7IQQ1KFiMRUpr+gXIoZ^GM4c8&9yO9fW_2<@ z@I41|oAx6pxecFqWj+J2v=fl7(u-aZE)4zlv2BtDPbkj&K$^qL5C1(#P~`N-9=a64 zVDK3^OMEwz<@gH_S4n?~b(q`htB!k|2Cr$enCFqx^V~ZMSlkz$X?{ddR#s^8Vml8Q zS)p}(!H1EDdWgXr`xf=h5i%}V*#&7&*muMJtS=CS=zBQ~9d|SwI`FPEwA0T?6}EiI z%;S3{qWY=@h9*T^-0lVoQxq zbbdjAP}Nx}-P9ApP`^k<)x(%nIloIu@nt=v^3?YWsnf;_24!u+(nblY^x{&7cC|98 z{cS?_=P_om^e>HIbL|&GI^A2|dk9MJT-_%lJbQx03e+R9u~jAL=h`=7_hXp5%5#wb*k14!0T&X9a!he8thI+lurl#nP4 zZQ!IfND2Qn&ew1pM`^lmfw#AJ>d2jtcK$zX$2ef@5ThCeM#XXS24;MH`C= zV>q>!Fig>dxuMN#oQBBH3{K`eH-{%8)}c+SdohwFYzUKzOkH{#nnD&kG_CpzH&D<8 z=CDk7$pHf76qY5!+o3VQGys?3W=Xfjy*OCQpZfmwX5L)#Q{O;@>E;NLe2oE7U{%fX zFNH*2%9gLj87Q!-60sf%>q}HKi;1GpzS1??vP*?KwpSaB|D<+6I= zg96h1I)kKT2^)kwHNCM9Cz}26I-Dpv9h1B-f0@i+F|C;A0CAy|lnjISG8_%SG;!pR_}tZ>ZGXZs zi}l?CUP^Yh;|P`(qm~4TNf5D-J(*>F+9Pv^W1uT=wr9|pen0*x>wZSL_i!0!RrR`s z4Em9SE^Z=KdJU{3upuET2 z{-pNF{%7Jsqi zTm69LrZn5C&D$4C5VoB8z9T`Vao>_DZN8A4g6o)}DeZG%08{D1+yH)MMt5+eWeyMJ ze`Gk2p?5L^g?A$kkbuE3cWA8qb~nr^-_D!AvUEQ4PY(z0bLU??(_Mni&@_x2D z=H2eV4~?jra?%cy`>(fKM(p7XkP4MQ?v+{=_h;8sx$K}1rIbxMc^{J=6wBj(C}R$9 za1gW~m%mVSjUPM(>&aOf>)g$+{RgI`t4;wDqpH^3=EyUb2y`7=vM7VLxw1lSV zLtkMeOU^fM)fhmESSoz|yKWOZ`%`k+gDgtvzsVh|P)lX-xoH=K3@P0X=F|Kzh&dlK z2~#LdN=h(h2!-?$k~xddqk;hz>iebYIPE3Khl&t_=yIH&RJrV{ZkI^d*Y~*Br zcEwgEEdk9>IvnJAeWSpvs&-sGY4jf|$kKR@1KNID+1j5`=NcYe-J9VmO#12ZvhJLc zeMIgxaLW&G@x&~E__uoMr#KeC5=Pl41wi}lIx>~7az8T_zXeYxn~!>2P{-why!5St z+{X&Lg0)i^FHC7I2uOTW(Dd*^)mMsXJp;29@zGD+pEtAR9%kJ?;RRHP_}T!xMx z*-^Zz#tKJ(N26obr)t}|VM+en;RsUBGKp-heH;c$dBp|>*kQ7RW0aL69J_;-oZb$L z<%)94$};47*vnvYYn8B_NT;XXD_8aP71J^f!tSMB;N+2|VVb!s7ZB&J-f%%T?Mn{p zMP~N-cGX;IZCzieRv%%~dV!JKv-%}hEG4S@nWF{rMpkh`t9Dt&qFwUQPYEaNsCZzH zens#dOZA^cOpB_wmJ}|37(rcW0*CVZt!qp3*r)#Tn?T1$6+XR{^*k_M&u3(=og(uJ z%7tpi5;QMn5HdB+vsGW_4uU1&y+}XiB18z3=jtj6`jNX>gnCA}JY>38pW1f4tf`c& z{=%Kkgm`YbsfRFwMrjyr>uCM5-@JMIudYsTmr(&}4J8%J-(|u$kFQ!Zy|toXV#+`c z1JP=IGnxBe)K|XD!8$7flKjeMYzJ^M3e<0J;BAaLX~)DJ7N%aki+QWJ@6;oA?H0Qe z>7!sMTy0XccIZw$Yf~<|2>lEc+?=7!?-qHmMlFjiH0s# zG{dCp7(;V6#k#?4wthdHBa4PC219fpr5m7j$DO%Of5{xwK?yh=GIC`Q@C zLGVJZdN{Y1jdKv(4myf3^(2!X6z^|&qISfArR1sFp*svq@@FP#$n?shqUa~Ib6hf_ z{@P_Wue_^cz{#dy>^f+U`zUjx&HHgPOlFiB&0QHRAcLuVSizO zMKpV{hOw&y2~z=XBP}#&ZbsYY@3o&0LtPy61mmG>`R5!NMV1WR;aAX*qd0khzfrRP zL;bY>6KiaiR znuexZEj;2_FF}dGdc7dpdP6xfi{Ckf>rnrPdOJh&XwPEk^lQk_F*TI;6Q>0I@`;aO z^;(-BEMq8_UihL!*ISktW752koAb3<46|{@fthf3Rv_BX=qI2I(yn5^ga+{`bj~bz z`W8C(@6w~+;zo=S7Owuy#X6TzjP{Fg_(13d{bz?y63Zm*9m6LHd6bsyhwuJw%KaO# zebLH;*?Bph4KPMltAEIx@Qnh)6&O(Z>ep*HGoYvPyP+ZepFp=I+|_Q(B!_3Og2OuId+%@(9Ldm+NA>#k8jPExSYWG>QM zZ1Bkvs_C}{v_%`H;I=G_X>DBHR0(ZWJ=UtbIS@rmo1NPrfyWFUsMiulE9;I@?lb`M zS;r~M$QsdIxX3MliTtL@r>Gg5g{5f_9%BmxY{6Y2lC?_|yOLpg6mrn;dLa*_|6KY8 zXl@Zq6tkW|CMfz+ zlH12!ep8FybGUkkQ=YcHgL*``{22Oeht-R1l)9B~*i_Us$7S$TktCv(^UP^T)%O66 z)J~I-mb3aPF7+urFLHq2@w$>S@=6tBOf`QIK1UW_KBUwVx3kr(Jf1q&3Zk!8FEo;86XL5o;cyUtYkO z`&so1W*D%NmfWr=Rb4~iG$J$9Ij*0}KpyKFUUt=S7(Le)1~JhV0N}AgsaVMFwvfdn zmyNa-*x z2_AxKv&*zkn2T*>QQFT!dZce7(YLLy-^JW3r&@TMk3y9T;ts>^Z6BQGTgtv(uv#0M zets%kk+WkDqP%WR>(5eXAU6+L)BN3|*AbDG^|C!ttrvJzBp=_ByD|#ILoCw38b)@d z^Sy{MgT|_@>5JS27zJb&Yx-B{7m7I`Q~MnYnn{wR?XuKKKz8lO13F^{IvA)P4U+{3;dwcNU~ys^MTL zV=$}zl~WFa9ZU>fyxmQ)5%?cby{)N~PZ;@Wr@6D~dL!Jo@4)9;{JFH!;q->`(%jE~lo;RkKGtxGA2G>79jQ=^+eD`% zZg5<1y>2G%9;yd(8cdV5pRp>OTLozh&>MTcspBEAtz>EEJO9SoC{mlE>K^nm$J4s;a(1TI2DoUq=z@DK58bXN0ujo7@?sJ#{4mZp;yo=%})d zA#tj5H^jygn9y*R2CR|u${|BGqoyAF>8_b-xcG~s4 z`GUGkKh(9xWuq?Yb&eaqsvj55FgeyoV6&ApTUeXTZSqD*lAm^(a%sY+m;w5E?pCQ{ zTd+x3Yqb*`At^K7AOv|;*9wlW$^HU1jGTT{Q2b(M5HilWHJxt?_@sYtv7#h#&DLt4ZffH+lyn~!(ApM(uWnkV~ z>)s8>5$J7CNfL8Aqk^)h`LC zwBb@>IP_OJ1y3|HNyu8*iMy}8-@p)|>cLJy!o{#P9^QsA8PpwjT+~6?ez)&GWhU!a z+CH1vS<^TNUFL42K6+v2Ym6IMia4B%RCRL6*WMn@Bk3i1OEQX;S+cH9Sj) zFihI+lDJL2K2vI0Oj!jsW*~?Jy?q-F)qZiA$+K#iFdPu(+zP9Zo_L&jqT*cV*#ROz zzTuI@Pwlg%Nzo@}kIU|yuV`C_xVkAHzIklKJ@_vE_24f@)lfvz*|nc;5fl;YnI>!g zSDHEfcj<_#Pd(GXeU_f|Oylr}p`CxFg){CSbkfk<$1vu>-+z8`LtrRc7n$&0`glTkj-vFQ0{Dw@I4TrAA@_2f}kk^JVQ=}m_70$W&pdh*$EYhPNU!*FIQp7C}csYs(_7|S15BEh-MpYk1w%eV#AonRoKUbM~ zEI!=^+^8~md+qp!2;~q4;7NoR41?m|;etSVl6 zY9^z^)@M9lIir2eD5hkchHBqvY`h$_r=7hS$5*&QtP{(R^=z zz-1bmI%V0L0%J-&7=2h*GG&pVq?NngoUCr@SG)x`)CD5$8vH0J%N#nfz+`|x?Igqb zFQ66LrNdAC@FrOnHx-Y04S_V!5lNoAImzNV%7_IrA1(RBFhLYVGbb#F5^V@c@7XT5 z*VUGsKn~1A7amhT!kb>Jj4g^FT5nEW5({srd9d+v|8~hQ91uimwRKf6JDnwWsCcBv=&j^ zgP~1qVUA1XC(^1<^*fM0M3~~b72i0-@M6ojQMx~IychgK%38IPoT6`TwhWxhO^t_{ ztmSRof$`2y-N->R6l9yz0Ed+=8;IdPp>6_$)|^^*=pZK#cJeTNGomS`L~T4S0X`mc z`|ryeHC;bCdtH=po2=gUd0*co@E&6ukJC3Y+-`p2LCPM1E!jPcmQQdqT^ow30XM!I z^%M?mDSL9^8~yG@TN$Ng=+#A<-=#aJxyQATr!rv0&hXr0>*q+2a>BB9lsWPut-zArGG#Up47rMEEJ^ zxAt3I)?4;;6T|DI4+OTLavXAycm0i#NXy0;8MdUG7)^Z>M=qO;3#+0ll+wV$TC|q% zP5G*JLj+PsPU&(1bi67c|DpJe4Ww{g+mEe{wg-z|{|VVh+0CSIB2RTMk1A4{p5P%( z=^W$J87-uZ0&)~C%uoKXm%OLSm&|tg5N}hYkjPy@qYxZoucUhg1de9YA^g_#cw>0( zPTpbCE;NO&?!vxM7>y?C%N&inO>zQC%Wzo!Ifz&E#=RUdKGh+DA;xrdFGq#6jLT06 zSusuNQrp7-nY{~^Floua2lAsF!?K)FX2~NIt!fhBSBkDxCxIWT4{ zMQ1vVVMyOOuq9jvjjtCjic3z>73?2q5p0fN!z*d@M2M7Z#Kn|x5mv6;+IkD`^2}eh zY7O^@6dKSyeEH6Ai*7x_sC{uu+RmLd$%1tl6v%v&g%VJRVVYHvZC6!Nndh`FSjsRH`dw0f2v!U zKv+zf(rDbB@zXCBkXv2&SK;x)mV2+n@t`^rw>`~mm8(B`faBKwLW_RI)OQXyhbdvt z96;Ti&qAjkc{!wNSNDIrRW&J)%hCyU(gbz>B{ zp39Kv0=UotV=_`qqa+mB%*f|e;j5oIT{jQ=*`h037!vP*=QJ$n_BYkjf-*13!2CaB zH5n)`5ic@RrA?xYOWcX%ns?aZih2U(FUDoB`u)evr?sZ{vBqy!<%BQmuwAx3M%P#V z#IBZ>Mu~|{Ldb_M>=}*E;5k2Xe8arV$ht~47p1<;BBBAvQaFN7*uo`@DnGH5NkHbV zIufB#f=3&mh^D`&HJ+IFgQnL8ve5$6LAg zIevzG12pqNge2W!EM=&2klAV(sE0nt^A=y8H?zYNU`TNjR)q3)>e>8R2KCa{&Sbdh z9_I$7)G%nTNoEFxrTZLy%}Ljk#(~%>?4f|)O)y{Y=9PO7G}$Uj1~3Wm?(nbyJUV~X z{1UinoVTfVd<`bor+B|qc7~^E4R818tl<@7Ld3x3TFc+aZ;n!@raOYo_bXT@K`{)N*M-DR`V2nyhObCx#Sq z!fA@`w$b5B(2hDyS(lg-MMf70ZE=)I9l7 z4wCQDJqgbq8AvxznDB$){&;J%mLUtQg)>;2jj5_4 z3%D6srPvRiR(E(i!TWWpfTLs%VBv1$Ho0Z@)i!gAC?Jf(IC#VJ;IvNP3GV(VQdMD4 zWOrrLzy6DyNwQCm-;au(g2O5fO%To3yzd$InH)e z4>Gm