From 45abcf6b2bc247c8c0cba79eb1b0bc36a5d1df43 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 2 Mar 2021 15:45:01 +0100 Subject: [PATCH] =?UTF-8?q?Remove=20dependencies=20on=20itoa=20and=20ryu?= =?UTF-8?q?=20=E2=AC=87=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 2 -- src/geom/angle.rs | 5 ++--- src/geom/length.rs | 11 +++++------ src/geom/relative.rs | 2 +- src/pretty.rs | 26 ++++++++++---------------- tests/ref/repr.png | Bin 9072 -> 9367 bytes 6 files changed, 18 insertions(+), 28 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1b6989cc3..89bfe4de5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,10 +15,8 @@ fs = ["fontdock/fs"] [dependencies] fontdock = { path = "../fontdock", default-features = false } image = { version = "0.23", default-features = false, features = ["jpeg", "png"] } -itoa = "0.4" miniz_oxide = "0.3" pdf-writer = { path = "../pdf-writer" } -ryu = "1.0" ttf-parser = "0.8.2" unicode-xid = "0.2" anyhow = { version = "1", optional = true } diff --git a/src/geom/angle.rs b/src/geom/angle.rs index 07471a026..2392efa58 100644 --- a/src/geom/angle.rs +++ b/src/geom/angle.rs @@ -58,14 +58,13 @@ impl Display for Angle { fn fmt(&self, f: &mut Formatter) -> fmt::Result { // Format with the unit that yields the shortest output, preferring // degrees when tied. - let mut buf = ryu::Buffer::new(); let unit = [AngularUnit::Deg, AngularUnit::Rad] .iter() .copied() - .min_by_key(|&unit| buf.format(self.to_unit(unit)).len()) + .min_by_key(|&unit| self.to_unit(unit).to_string().len()) .unwrap(); - write!(f, "{}{}", buf.format(self.to_unit(unit)), unit) + write!(f, "{}{}", self.to_unit(unit), unit) } } diff --git a/src/geom/length.rs b/src/geom/length.rs index b0ca24dfa..bc8368105 100644 --- a/src/geom/length.rs +++ b/src/geom/length.rs @@ -108,14 +108,13 @@ impl Display for Length { // Format with the unit that yields the shortest output, preferring // larger / metric units when tied. - let mut buf = ryu::Buffer::new(); let unit = [Cm, Mm, In, Pt] .iter() .copied() - .min_by_key(|&unit| buf.format(self.to_unit(unit)).len()) + .min_by_key(|&unit| self.to_unit(unit).to_string().len()) .unwrap(); - write!(f, "{}{}", buf.format(self.to_unit(unit)), unit) + write!(f, "{}{}", self.to_unit(unit), unit) } } @@ -239,9 +238,9 @@ mod tests { #[test] fn test_length_formatting() { - assert_eq!(Length::pt(23.0).to_string(), "23.0pt"); - assert_eq!(Length::pt(-28.3465).to_string(), "-1.0cm"); + assert_eq!(Length::pt(23.0).to_string(), "23pt"); + assert_eq!(Length::pt(-28.3465).to_string(), "-1cm"); assert_eq!(Length::cm(12.728).to_string(), "12.728cm"); - assert_eq!(Length::cm(4.5).to_string(), "4.5cm"); + assert_eq!(Length::cm(4.5).to_string(), "45mm"); } } diff --git a/src/geom/relative.rs b/src/geom/relative.rs index 0eca911e3..9d7b3d3e1 100644 --- a/src/geom/relative.rs +++ b/src/geom/relative.rs @@ -42,7 +42,7 @@ impl Relative { impl Display for Relative { fn fmt(&self, f: &mut Formatter) -> fmt::Result { - write!(f, "{}%", ryu::Buffer::new().format(100.0 * self.0)) + write!(f, "{}%", 100.0 * self.0) } } diff --git a/src/pretty.rs b/src/pretty.rs index 0899824ac..86919ac8a 100644 --- a/src/pretty.rs +++ b/src/pretty.rs @@ -240,15 +240,9 @@ impl Pretty for LitKind { Self::Bool(v) => v.pretty(p), Self::Int(v) => v.pretty(p), Self::Float(v) => v.pretty(p), - Self::Length(v, u) => { - write!(p, "{}{}", ryu::Buffer::new().format(*v), u).unwrap(); - } - Self::Angle(v, u) => { - write!(p, "{}{}", ryu::Buffer::new().format(*v), u).unwrap(); - } - Self::Percent(v) => { - write!(p, "{}%", ryu::Buffer::new().format(*v)).unwrap(); - } + Self::Length(v, u) => write!(p, "{}{}", v, u).unwrap(), + Self::Angle(v, u) => write!(p, "{}{}", v, u).unwrap(), + Self::Percent(v) => write!(p, "{}%", v).unwrap(), Self::Color(v) => v.pretty(p), Self::Str(v) => v.pretty(p), } @@ -561,13 +555,13 @@ impl Pretty for ValueArg { impl Pretty for i64 { fn pretty(&self, p: &mut Printer) { - p.push_str(itoa::Buffer::new().format(*self)); + write!(p, "{}", self).unwrap(); } } impl Pretty for f64 { fn pretty(&self, p: &mut Printer) { - p.push_str(ryu::Buffer::new().format(*self)); + write!(p, "{}", self).unwrap(); } } @@ -681,9 +675,9 @@ mod tests { roundtrip("{true}"); roundtrip("{10}"); roundtrip("{3.14}"); - roundtrip("{10.0pt}"); + roundtrip("{10pt}"); roundtrip("{14.1deg}"); - roundtrip("{20.0%}"); + roundtrip("{20%}"); roundtrip("{#abcdef}"); roundtrip(r#"{"hi"}"#); test_parse(r#"{"let's \" go"}"#, r#"{"let's \" go"}"#); @@ -749,9 +743,9 @@ mod tests { test_value(12i64, "12"); test_value(3.14, "3.14"); test_value(Length::pt(5.5), "5.5pt"); - test_value(Angle::deg(90.0), "90.0deg"); - test_value(Relative::ONE / 2.0, "50.0%"); - test_value(Relative::new(0.3) + Length::cm(2.0), "30.0% + 2.0cm"); + test_value(Angle::deg(90.0), "90deg"); + test_value(Relative::ONE / 2.0, "50%"); + test_value(Relative::new(0.3) + Length::cm(2.0), "30% + 2cm"); test_value(Color::Rgba(RgbaColor::new(1, 1, 1, 0xff)), "#010101"); test_value("hello", r#""hello""#); test_value("\n", r#""\n""#); diff --git a/tests/ref/repr.png b/tests/ref/repr.png index 951506c4b05c1516c47f39f63dc84555a2d2ee1a..874000308360bc3a1c7285ace04dbf00b9b6526d 100644 GIT binary patch literal 9367 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�`~sc&gKxk@W}vm#^_D?s0?1LU8K7yqIR{t^~q`NN}7o%Sd9w|=K1+a#$3XZ zHMaQ`%V}1u;FA6Xt7Ej!m?w*Ul%hTRCXmynyk) z#oVCGe{v2J-EwKx2bAd-XIxkzWQaVipb3)Coq4W>sI(McuRa^j+*#|Hy5QD zCeW*Pe5?OfzSQ}Z0iT>34U>mYdG4`t*qm^7QY~q<29DTINgN4d(l#p}(Kovsdc_GO zn(PsP6tjQI;lCfuH?#dwp!?IdB1dTF^Zosv|EX?w%+jd>w>#j+Y~Kc;O0uZhp0vxS zi98C5>0Q`mu~Z*$hqZr3b%a1bQfX?7Bzs_tK~-qLa}4k8GNp|npA0Sq zMRUZbm59sUgKlgYrJE(Cz9L5cD+hqby z*gWF+aLvZ1?P>U%t@I zdEG3TFvzJp3Gwdm^Yo@hY}#zP>Gpl{#8}yc%M>Jv&$?Z~+P-AR`ZRj6qb5u|$zm>u zrorO-4P(-ZIh&a?npj`UaB<*mHC)B#K#pwf+^Ha9gr4C<{u85Z1DfX%JR2;SCHk9O@^8+x~_&_Mvja2(;6lDqqHP5vxXMVAZDr8 zabkV9Uy>T^;~!q!leK4>gWT`1NMDPdH|{t#qr1Isee2%|^>;;edKJ@_@c-r7cFyWR zctlUufM3EZ@N$HV0?J(B-gO8irvTxaX7R~hCexq%6?Jb*>8 z=%vuJQ3>2Fj^USYeyy~K)xrslmgqo)a|W&oVKVuH{4pF8<2OiViKiLlmU(!Cs5aqJ zVjdq=O2RZss6x7g|9k57gz~!Rl8{D^1vWIrTr3I2Pq`L!)e2FooAs~WqL-9g9J zC+2}AZk^{ev@LKBS2R?!dQY1E5oIJ7a`r=vcWV*1~)bA;tZqS1(mf#4j2YqfsL^XEf zSq8KtaU@)C;pQ>-N3Q?2TnpWaEV z+Mu(b%0``{H1+aeGac-R%6|U_t<1=BvilGo`U&ubWxRcZUPL!`=Y)-LE*`}cTml@Z zm58jGl6Dk)KP4?*r2Sh0Jrz8Csna+nRFXtb(8oj`dxvm_DH zH9E1(fPyW#UyM=uEF`69Bo)R{5bG)s)TmF(+D46HA~lONTBoIU^h!7#uCLa#-kdq8 zJK`FOIzAf}pc|f4N^>`0W&1;XZtPTae?#JzZIzzZS)oYg)DG@jVYJ?u9PDR%Mub2Xm?kdPfOCg)sDj4pE29M^{H;{! zbL+i-_^jt`qkw%1ORA3`=7nBLIOVD3#JzmEgp*i+85!jtB!{75FE$T1R6NYN7;*#c zNB9~oh7ooNsj{3LTFM1m0koyiYOfg z0!SC6i!|v?37waF@9%!^j_jzJ&c+%)gk|ZgPio2?V`S{|5v(1Q*x8`PohZ_E2Ww-i}qX1>bF7eBN?+Kn~| z|N43@vrS}Da~jLsN04U>f?>Wf%?7dJD-gVQX!4RH|l4{=-n}9fKp2pNpYrk}}*RTdnvAIF8uui0eMkOb}mS+XY3Ft_o zms@z%`HCtu4WsxSqIlRgsKW0AUjd}uY)1@@(X9+F-2S4NSMmKSy(Lh?6~d^8;F!av zZIxisgW)uO98QbR+O2rltJUvZ?zToa2{G_CW+A4uICx}Y?V)rOF4qknClqWQH_3#{ z^BWRY@+nG4AQ33ttBZMjq2 z5JdZ1^XfSX{D%$mcz6B-uwTpdtNsbd*>;l=14y@ZDTb}<7kcPb%mOae+J*8kJk~Hoh;jwl0&sz$s2YoxW08OhUo*~AGPC24geg@y4EA05IF>E5 zSX8%uPFE&7M0pspn<8>!1{u6IH7nY4r{v`v?*o2-SXnP$5*?TTw01ZW zuOULYGSE?V`57_EI!J6fPK>7)wD9a9*gDIfnB);}Bcv-h?;_TFz>hXa()hU#f=0l) z2+6-ZSGS`;_h;e)f#0~>IDWsUPl!TVx%bsm>_I8!`Ow)fA0vlF>xCDFt3L^b99v$j%UJv2)LO7h@>6kHV^*>k*P~_$9J!XLr&Zt@# z975!b)WS2Ftpt|kxcwJzxy`-Sd)cvn4_+7ZDKkLBbmuKM!!Ky8Ls2(&;EE!--6 z71-Kiw+^K+17qdE-Kqmz2VhV!kcX>*G;_R-!Ks0Br;>74XJq_wKP63LVCY+miXx zy`-6k1lJou3;<~}Or_L4LQF@=$@K)T&-lpw8OZaJp|3lxjLA3EHSXZ8w^1-lqpYkw z2OmD)nR~0B8)xNJgAT0fp`C%Enyn9}?cGZ%V4uz%$I5wuI-=LU@Y0vKyPGS+mS=QP zNUI_@DYfx_#_H68R#WbU@`rB6A?)K?kv5jg6BJ>kz+i(-kHX z0lr@PbuMViGg5_F&J>iG-QB$wQf2%`ra*NI|ot>Bf=Ba~d>* zarcof=xZP_CU8wZxF!c_u6&I+VEdlHzMKg8L-omf47)o&O3xjk^Ms8MOBxal{w?Y$ z?&HEkX5JOqEs4MCLxNMC z;Dpi}&4h-ZiBb{|q`7S}R)T!k2eM|LwMV77OxA8}6cpw*#kABY2D!IG!w_k#@}!Iq z`EC*4Yt1p0-@!IR4hixFK4tFRSHgCi#6x<9AIvHveNg-1;QdpaE^l|<$eXk+_)A`* zHz7h;tgDxW$e5^+LYweR9_l_-o7QoWQbcQVQpr>4yvk(~mBT6IK2uw#vlo@tWlb>> zvrdLCx|dprG%A3u)tz;V#Jh*rKx}+R+kVGEKe;S+{0RM?aWKcRY zsh%wRF9^@yNzplT>(wo(kr{0scL(?Wx1WPAwB9DIgARxP@~x{p18Fi>zs#wF1{XcW zisR1Azs}u{fnOtI=AY4~&4ZsR*!bb^7nBm!JEvU5(Gb#ADaVdp4JFYE`%&H_m}CKx zi#B%gu@$F5S$gD69@i6M`?Z_QsQ65zLAJM8Tjl*FM;6r&fyGATmj*WpjLa{yG&LnG zVGc$F2yc39P|i-v9riYgMC+D&*~eK8xlgR2c1{Rd`n4r-h_jXx53f3byO*b{9ij^D zZoSKiMje$*@*a?wm<}U537jhmkcG;btN#8jr0x3A6Q-$X8tNxhGx z|7czxV`5aT?#g(9Kp$BGMGQh_?)G-Nc=-$CFd~0h{%6~{pbBn_0ursqX>tEMu=*_d z)X%Q1Hub~tyk%aj0{(p#p%TeIE#B1Zlg}G6$(kWO+-A3_v2aFLBEQXAq#9vE&(Ncz?{L zqh))RKLTqsyYfH3(2uH+j=f)?w+}kDONe!^r?O9QFN|xmgLF+DRNTZ*4N-?DAUHHn zf4ZQ_=V+)jOu$YO(O&E0H!fWzEhgS5B|+LR0wKsy{Z-9VNqMNdkV7Q&ba78%5{LXa z1gCp)Ud&siuHp#iL)5Dh zo7by@;P-~d5K0FZV=ycI0vw+3)Lp!mweBwfBOKR#cbvR@c zEDH7mb!~*GBAo60YNf+I)vV3FGv$8jgt>P4rPSl*pxyfr_5o$W-1Rm}jOhEq(B&NE z_w>r|TYfETl{DhiuEmUB@a}B5yFLhh^a?a@v7z89=oRI)oaL2>SdQ@VmEz9-w|_r3 zz-{DGmw9~jbDCTTPNL5g1}?I0GFV<6%w7Sum}I6JUjh7F1Pf5TB)0Fpq6qa0HZ%x= z6Bp~;YMY)~EJ_osX_gIQ8Y$~rL}!?ghu^d+OU<2Auqwml^i*8L%@*AR#Mmq}-~irs zbav0{d*iA672>+Y5|c2WV-9WsuIkhU)V`&D;l`AX&--swsREOT-S16Z0G4sxl~Xr- zGy8W{197Qlmu*uZ!DdqN$lm$|2B@}PJiRjf74a4yk$>tEQ33y+FLO%lX)PQ+x=)$> z>rwJVrG&! zgyRgce;^bIwU*{sM!xb5VTNnOa!o{#jVGTWW#C#!V8)U$=tfqr{7JE;^;f(JU3h;I zq#mA}-TELuR36GmdMbZQ7{TO!JS!YT)3iC}D1}!=Dd2n5uY0kDL38g7`bFK$*=PPL&H@!rlkcmsxP#N zIrEw9E22~_=+>Bg)EnvMF)<{aem!vmOZXk#dh)2}Am8;Jb*NFs+nrMuQRc5Nyrlr& zJZYm?2aUtdq4P?9AWU-dq-y%Pao_nvfVswI;3#< zUnByVp#DuI%&!Do%lF>Y3=#FESjl($Fn>JvBp)b9kNRUSrd$cKVd17bDb zg+r66+8buIE|Wjr@R$S*6Jb43Db#Zk&#kgw&m;(K$i(`^3Sj%>9-`xNrXTDkfh4|T z2{YCC_i?$fn+Ibn`I649y4kTCXTL=C#X*!t{R;yNgBcX>NHepm>6P7M?OwCGRvdS4 z&|D0EoM@Vdt4p?U?a}Qwk4v%QN#Mf7=tzaeMZ?d!jG3-ViPOfrVt{FQmu&bbF~SH zeaA$g!da6GZe-)k3)1LKzaJFAp*7lgb9t&ME@?gB&~Nd3P-49v&biWU(YQ+mvTQM3 zr5JV9C*AsoXC!jg*2fTWO^7336sbK-(7-!A(WM!e)XPwcNjPdQ{)FNNQ-?Wscb;E8 z-f51JAL{y=(W+}XNnSo|#!`y)`pmiA-u$3ObZnt)61Rn!YRBH0Bj#2X^I^DRlaf~S z3SxLxd^pk^UHNgY);j~^%U;(h&fveEz|U} zMqiw4Np`uLPdz({j-kxBvqTG_v0?NpQg&<`1QNil9S6yNxPUBtJd_r;TulH{8W>hJ zEv{`EJRL*s-9neG|FDbUS9RnPlutKrT)7lLW+IB&rw2dxvlpVo-9iI(f&3ABlA0_T z4o5}PxM@sbAQE_PZg)|&nkkqco46|9vDb5^akH!Bg`I*0Z<1JXzj0(wd=aY{BE7Fa z^d3>t#Boq_cs$vE{$6f+K~nKaE_|T-7bn|@#FuJAfc`}Ig3(LpAH-75b##1PmW5s? z%U@OKTp{GSS%QRqOAVEK^6jD;nxj&O{NcfusF3Z1S*$d^0w%d@7LWY7M8PahyCGXQ z7C!j7oO7ANG~g0&tI^p@Z9{|L1Vv;0RSKkz75Qjz3E{uRXL#F!Q*IMWa?50!GuBmp z2!CZz)yh88MSuJ3aO+jt7g681fog<^?X(~z=grc7Q#;jUKUb9kHq5y3V0C)P44`dfX6%=nYmTK$mcL_Ki zx`V+%tm72NuL#{=v&QuE!h|2Z5K=D}a#%ZE=9Zlo{;F{2{2BeL&AdNz4!jUeK6uU&2xCqlmY#9yNyO zA@WamP4Vg*o;p9{Wtp$~Cx1dt>XB2Y@W7m=mMD}pGdcTu0DGQpZcd?gPWAEtgF@hDFoVC9LcG0 zoxvO4-x-9wXaBYzF!HX#1^Ceb$2Em8OGr`qp?;-x^H8JfeDAl>_3%?oigeE+Zo=bc za|svYg}LlWTms|shR~gD*((4cqMrodUM;qP9ZL$^pA+!)Hb6V{BTg*g7 zsetBMf4P&`fSuCD8qGX&Wqjgdke4L@8!W)YyHnTo{CQF~KDI0R$3!6Jea1H=v_pQY z+mSk#^y|V1ZBjsV@35L?@JFs(XP_0Q#Zgn5x8WA#LCogVmCVUc zmwyK6Ogkkc=B2quFdGa^Mwke;*}viL@n>G7LZoNaM5gdW^3zAuh*JBq9HN`Yk$3*N z2mkPDaI-3~&a-i_wQ}jD89!KD1>8LuLQ1%kSy%$AuY^J@6Yt@a0_8Mm>RZZZOfMJ* zB5)Rre3vW_>^*9oX)|UcjRO$4k*_xMlNg~98>Kkwl*u-C$)!uwWL1mU;Vu*vXs$1m zTtlTLtn0O4&V39#{` zaVT7a#|@XX9?j8e>P!IrRL$O*6lt4%3U9~=M{}ys5uN$9xt@|T5nLHozAnVhH}EcL zrmew%^D_;+&|;~{!Kf@>k~?0~Jsd2mb!tDgKBd_!|F~w-WCG{ix5kLz<-(|*D2-~u z{jaBmX4mt+5ZtZLF_i9~!5;FrUG$o%O;hQ!H5%VnD*tI#XLUGg{HvluU_srw$UR_k zMvI?d;{Nz_MXBhVHEa$5sL5;p0Z(!#%LtU%b4I`_a%q->22f-QCpMipoyxfYC)vh< zsp@{`N}f3c>xP5pCznv8JbqiJb9Hr5XQN%r#A|l(oo-u^hay0UMbnz0@H+yOG~UCK zFEVF0MNT*6*8(c_T-+=(%rKdMD^&j;b1L9+yN5v%z>rd&lwiuaovEV3hMP9oeRXl++I&Ys+<<{UYrxeI*+@4no1;N(9Xztk zBV(ppcydjW>_|-CZi_{U8BL0r3ibSEgr&y=+`B<60Ld_G=Yi3>fWuQ^N}|0mwWa?H zGaIO${>%Um0mB6kqRaHf3q1Y6JKmnu9=CMqj6AF98M&*190I!c3MFyLMy#jRBKEEq zQa9xhG-Te2F1mqj%N{_6eyW-i5wFV(e73#oeSTF|**>AwvNd(9u0Ii`%tfusMD&o1 z{@5RGRgVQSso(M@n@w_D52dVWZG$U72&UbF$LGwV3KKw2r3oJTs*2}y@sq|n)3zUe z_ru*i`cN|Rw)bW`v->y-$Mpy*1|<<$($+{34p&x=)e~!c!spAX zZz!?oJc%GKNoRf{d)LrqrSgJjaPdEQZUYHYW>_~o+Z!kg2OFWeQDUVK(gm@nzplL- znt`B^v{}?IqKK$cumyf#tSPfq4*5WgZ)1a~Ipc07C^8OlcQhDzahsx=B$-6ri7%qQ zGrIB+b=I=HSeIrXO~zPJn^&ZodwOJZiY|Nn{L!zYStUb{SZmoCTelT+hHBBvfRX0L zFN?kq?AB@Aeu{UO>HjM${+=hn%>QByvx=PS{hImr{Q37MbG~3#AEA?GG;DYruvE9_ zed2_>nV7XOxeST)_lcj%Goj=AEv@Oc`+N#dY@NKiTsr7X-D&`*I+% zKzEN+$%fgdOgINUjKfpZE1`e|kacl@1MtB+2^7N@#Mh4yM?BoM{&I{|TcE%4-1hmW zEVI5FYT?3My9tSiz}|(dcPfLHSh9?&i~25%>KPLg_sK*0yphez`bJDi5JjM11P!0g zp!KRfO8p{mjKw);xk@Ce{1C8_foWOetI8H^rP zj%FnCr5mg*je@%d^=oSMT-XRRsF+q%-FlM-e?)|F=fx_F+3shefLgEM`5n^&5rO+o z4|nO*V2d_=^!z8U(%^rg154Ru^WDyB(cja5ul zkwc^S+7SPGIbCiw^^i2y7&&E>DL?da^q7NiV~?3f4XtsZI*~aCc?D}w{7LX*7c7fc zW`a4S*gEZti=%H0L+-o!W^V?CCR6{1;7_55hnYS6$%KawZQ53aft&Ea;7teVLTM1#d)xF5#Tu+0a`{9HCrN8k%<@EeU_@B)Y zR*?|V|F%1FE<;JYd1!}uPfuBOR(il#7mLgddITh#iBpQ7akt&5qpdjId6F=S4Q8-h zw+P!A?0Z(hV}aF>`k}+ih4sXRI0B>Lh5y(3e1PS@sw#1WNXTKBd;1r&^6#$Y$z5<; zt=tILf&rvUk^`^=VG|^GMPk_-%+K^P%8lPJMk6p~+Hvw~(z$jjpk=6^Cyr%e{O-bo zII>5vryN`-pxh-Gm(5L)7(4C7TZSxz&L_#lmexcR23Cva&d3Y?!y9dDM!&pEy3o>S zq8`E-W*y)V`pA9%Ap~2_Fu|ATO?prq%o!$|Yv%le>^_k_CX)h(XNWqH^ZK%j82ac| zenRcpeDf7ohs7~F2)6B3=jTP|xAJFRmII4im96|kCmyASEg}rxf~j9k-EB)7d@}7? z>5Q*xd$zb+n09vh&QQ-cfZqhBYt6Tk!a>%Cw}cmnwR9Zo%9}rp-FTZ~EL_f#nio&3 z=<4J1;ueeu(dvf=sNr*wHhb0E&lJ`gw^#{#XhsD>RFX-cl~&k}{QyZ01+9O?Uv<^% z@(#vZ?9llZ2bOa6w!*eheSkQ2!GVXU+uUf#k^E(={%tvjGqsb5!`l`kW>oPBFtDg{ z!F#>$tNlhJ%%p)U?AitEjI>YG5AF*yr@xLJCb0Uzs44Vda>7I^%JdTR@!*p>GWYi` z&Z0SFX{{c*UW>y6l{$1X8t)Ewo-|Ql8m_7DZE!oC{#n_)6VF^G^CDrC%h{_Hvry>(v`>2v_qDs zVnEN&Kc>(#f@nz>x|c%SOLVyBSDrqp28Af$v&UY*>Gisn(M@5G6Tkz_E^eABT^yYo zzj=WKsy;HA+PMQ^ergQ>yr_$21DQC&Nc041@EtU)XRGB<6e4?au~!5is5$g7IjL2h z4SD84GMwe#I-NM{@O;^<4C5x`SgnR~n%)Z9gD>+0Z6DS`GMbjZkph8uO9^%=w&z=B zKZ8&QygxK~{kG&HNFQHHFaq$mX?uJbx>yU->WW+4O!&?py-YD#|7m-8)O5R7t6+RI zh1>0Pb-PIUKNhS@a~Q}!?@N$7nulJ4uJ8WE)&JAp|F^-36HubD;m&Q!@s0W8q-tNz zz4LdVyfhilfiD+P8@E(D9Co#%D{E<@Y30os$@E(ES)e{HUzb8cOKw10MHmHOfDPhhGYLc)s|S`nonvs7a`_I3P0i#-}d8NOZBv-Zzle z>K8y(oy(d9Hij#;pQ6xZ@`LeOQZPd+YI$lIoadO_8INF+nGippe7e&N4plP~h_q8= zC-({$eTL?IU$39C;1rvnCNN=CuEnq20NODUy1-anjKm9~14MX-$(Qs|>9Li>^QFD@^KQmtd@FYc-_DPB ptqk*z)jg()|G#@Z`_wJxfc1}UEaPm=i+{UHqpGZ>RF1X?|33|Mx9R`@