From 92d745b1d9154b4d660a1b3ad42b8335201018d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=81=E8=A1=8C?= Date: Fri, 15 Dec 2023 20:45:17 +0800 Subject: [PATCH] add ios readme. --- README.md | 2 +- ios/README.md | 25 +++++++++++++++++++++++++ ios/ios_app.jpg | Bin 0 -> 28478 bytes 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 ios/README.md create mode 100644 ios/ios_app.jpg diff --git a/README.md b/README.md index e035b056..e8ee06f5 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ - [cli](./demo/cli_demo.cpp): 使用命令行编译,android编译参考[android_build.sh](./script/android_build.sh) - [web](./demo/web_demo.cpp): 使用命令行编译,运行时需要指定[web资源](./web) - [android](./android/): 使用Android Studio打开编译;APK下载: [![Download][download-qwen-1.8b-apk]][release-qwen-1.8b-apk] -- [ios](./ios/mnn-llm/): 使用Xcode打开编译;🚀🚀🚀**该示例代码100%由ChatGPT生成**🚀🚀🚀 +- [ios](./ios/README.md): 使用Xcode打开编译;🚀🚀🚀**该示例代码100%由ChatGPT生成**🚀🚀🚀 ## 模型支持 diff --git a/ios/README.md b/ios/README.md new file mode 100644 index 00000000..8882da6e --- /dev/null +++ b/ios/README.md @@ -0,0 +1,25 @@ +# mnn-llm ios demo + +🚀 本项目全部代码由`ChatGPT-4`生成。 + +## 速度 + +模型: Qwen-1.8b-int4 +- iPhone 11 : pefill 52.00 tok/s, decode 16.23 tok/s +- iPhone 14 Pro: pefill 102.63 tok/s, decode 33.53 tok/s + +模型: Qwen-1.8b-int8 +- iPhone 11 : pefill 61.90 tok/s, decode 14.75 tok/s +- iPhone 14 Pro: pefill 105.41 tok/s, decode 25.45 tok/s + +## 编译 +1. 首先下载MNN预编译的ios包: [mnn_2.8.0_ios_llm.zip](https://github.com/alibaba/MNN/releases/download/2.8.0/mnn_2.8.0_ios_llm.zip) +2. 解压该文件,得到`MNN.framework`目录; +3. 在xcode项目属性中`Build Phases` > `Link Binary With Libraries` > `+` > `Add Other` > `Add Files`选择上述解压的文件夹; +4. 在xcode中右键项目`mnn-llm` > `Add Files to` > 选择模型文件`qwen-1.8b-int4/8`; +5. 在xcode项目属性中`Signing & Capabilities` > `Team`输入自己的账号;`Bundle Identifier`可以重新命名; +6. 连接iPhone并编译执行,需要在手机端打开开发者模式,并在安装完成后在:`设置` > `通用` > `VPN与设备管理`中选择信任该账号; + +## 测试 +等待模型加载完成后即可发送信息,如下图所示: +![ios-app](./ios_app.jpg) \ No newline at end of file diff --git a/ios/ios_app.jpg b/ios/ios_app.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72a9d54d9bb0fe9f640a713fb521f46605c70370 GIT binary patch literal 28478 zcmeFZ2V7I%moFMXq>J>XM4F&9r79q?AtE9o3J5|}qze%h2@(<%=}k~TL5OszkzRy^ zj)+JH=}AzK5=kiGNDA-#{&U~VZ|2Ut&)j?G-OqcU_YR+ZAcwQhS!=Jg_gd?_*3Rzt zT_R-vr3)4pARHVJ2nYBB*`0!%gK%>Eb^LYa{Oj1m_1Bqu&mOKld%5@S{YT^Bcn#;^ybs%kz(0{)bMxEf5i2u27CFE)GQq zrw9j^2*+**1Pap0{SWd$V*lyj;N;rFy_W|hLjb&?WM?^+N$0WacosydN=52aT zZeD&t;fJE)%Bt#`+PeCN#Kc@x=k*`X{!)^S{fN2*?-bUoznNi!Tn&K(KL%?BP~8zE|{&4bL5aF-4tcyy9n* zvMXBolyt9ACGI{PD7}1O6(u{n;)a10l6o0$uK#Vdz`uuCVM#oXD z1(PG?wJ{LpFIEgpt`ja4B~oe`sN8x#b@6i+ ztuD7ZxFs2x%PXNAa2CQ%s0w6C7}CdH(NkGiyeNCvMFxP9;|1t12efOng)FJoj)aV> z)Q@!)PBYs}57$*j8|>EOXhGh%PhlT<$nLC{Fk-GGj2}bHsfAaW#ugzByXVBwYFfF} zG^Z?@rreFHb#nTN(69Si>Ha|iMYdJZ~0^qn>tr=MlLY;q>;LZ+1H!8CiO*dm)R zjOI%BMDSWF!>Zx2=tFRGL?IA+@t9hgb@!Bq(bvi=`ST6yBe~))pY^A5(9XPp=VN~l#CL%xnsJ5*4hLyNMU8?9B!thE`zLx4AOJyAh zN9P@OKcS95DWR6ozYoLiBmzfp&(Ts-EAj?Fa1eP8g8W1h^H#reyh4exObFilyQx!8jW%z;t~wxO#q4aNcWSa`0+fi zI+0%Ag1O#@Q>N2{884mvMKIb6{N3*Mt<6w6_<-jTm{vQyEP7i0BF-TN~9GbSSeW@!QDS8{ox7Z==uYW1v-@K1OwDm3Rfe2L4q(e z>lW=7FWJ3PE~*I=%;Ubr%R=+9&XQJehDv~BhJR(U&4U~9#a(HVQg+7xv zY8!HA@;mc?Hd_1m%Y5mT``~tG^$ZUU*QT9_rCPybV6rAsMO zeeKUf!;S`Rwjkg*<}|P^ukb~S9b#XyGsm*!SeAe*13lszIZ&x%DWufQwZ!fr8d)KY8O0a@{y z=Yc-7_)kjpdsQD8O5EhQ*1{=#i5U&VGE_0Go)~Y!q&AyxkYR-$hVN}M!;lGkkePmX z9dElO*L&$EHpmZ`RT`d845`H~`Jer&1jlmo|Nf)KwFI9UXYV@;SQ0Vc`{#MO<^a`6 zFSaHvt#u8$Bri=nn3#Zq1xsQD)9MUu_^z94Xd7WGZiTBW5cYiaK+VE|KL5%@@Xd(3X5$$(a&p=kat`S+F2Ntw};j{rpQ zE@Y1v*!OKaLk>OV!o3TLxI`0JW*Y$$Bxl>!bkrj!z4X46tnBhr9dx4QhGIVD)4h2G zpvR7DdyUPvL|yE{@(^xYKbzxaD|=q^LMu{nt-BDxUpw>+^%DJjN^Od-AT{|#k-DNz za$Z;hpE$>#xASv=I)*7_X*Y7e$tHw4OgCq}+nn*@9uIHgW1MDQOBn75q_3i_bySCHMz`mVX~c12MOXx|bJU!G5-az{42SEG9#1In{1Re-n^&hy28NBPMg50bN{g;nGHikEQ!_ z(J?xo$wuE%lNSr-*W)E5_8L^&T}%<^|3avZWJ1?Rru3ye+RMTffO2HA8WMGus4Y($4!3=LEb4djo3dpxN9#VfkO zuo)p^1`3m%AkZ0w%50pk?4`b`k{Kuhh^13#gfOf8@@%qG^CjhQ-!$jp>Wm{ATNdwc zBm_srd_FCFNGB+`^7-i|f4Buo45*OmIJkde#V93utn9~YD{jK?uhbHfmZaj>&!sXt zI;{>#^;GK?mpvfyfvr?05-t+Yi4q)K7;KUvsh{)7x!Fr3?62u;*Y!)MFYQ7qM=S%3 z7c8L9GCzE>5iy@4RMoZmXbXKMi0jYDE>Ah7PA+uy`6YD6v@XPV0j+-yem&m6vtSc` z!Z=(e$nf15S`pIg}$ z^s(_+9us3$)h>ijxDzY*9n*GFvk9%haBoIP(VhC)*?xv6)&<|naS;jk2Y9T_#IJJv z-_dSCDONPY4k$Ow9TqhwgHrYNGAJQIIlXtrGK84-sTTe|ZW^@Gn9|bEj>n|;Uc2zX z+;L6)CF?z20@FqZ_~tRsp;L1caOzv+xoZQvkQ&q8MOGr^Nu|@DS(hIh20#fwhl*e^%xBN>}xx&#xRi>-XwcB=~ycH5L|j5Ah5}9XtW9t@bp0 zG#N^P1LrY6JlOr=og|u5??qJ$2 z0pqqtsfk?(Nq}L`RKkAm7YmxgPe7+k*0kl03#WZrGd&3*Kkf&P2s6d|i5QAM)t0nK zc}BDjTO)#YsV#kL`^A0c{`BaPrX!d_FUt>Q%|FIPg95$3(7O6$56ynNUi@AZIUWkG zk<|pMT@>N=95{s38`?22A^cw9aCtRaNI^Jx7sBr)*;wooxZkRzzpysjSLxfp)ScWL z7oEPT%DWn_nbflvSa}3uI+Qv1&I7ubWWW>$V)ccI^g z=@8a!ok`G@bDPN|Xc^k4IqyPRh4G`HQ3|2Ln4*zv*#8vi%pfJUAxaFk;@$Tq|^<4s=iEaW9}e_tE@JZy+fb zkaD0VWN76ZMp3l1$`4ni-AEu!JLSPWYwDAY?|o8+ua=j7CV0!L z|0GP}$a544njyWJTDL01IL^G9NZQ<%=c%XRK!=Sl*J)X5O!nGLSxQ;v3&W#Sf!Ju~ zYVXk#2`8k(HBOg7c9LU&Cgwd>0p>Pz65fv4Yih#u8aFjS3X=`Pw;27r-u8ItFr~?& zV0q_M^oYvv_lf+Pnje7%(I=zdDg~q-ESAe!&c3OKR)HrWp*d_Y$Z)AU!@?c(n9CL@U(?& z)gS*0{kn=m>%6r`>>jjmmE_>>facfKN_a>>&V7?Bgx_Mksdb%NLNboBTQ8B<8nqE6JoHPe9|jxt!0+ z+Jq~;g(^k4AsoF~25rq!r6$IpL`n)W=3!jGxOL3b^})qt1wBp0c8v-P@rq-}g&6br z@e}u-LwHJUTyz;hOtS$~Nfc*nCtd{zn}-WdV&#zD-3;p%0q+1V&9N#EUvX8+>FysE z%Aa3hq>_hxd)lyiGy+p%o+SLj4TulQWB2Vsq*3O%C`H;SdOS_LBTJszoL6fkH6eQP zaHD&0M-a*3#|D2(<>jQJz-SIDBGh3Jt^}Hk)^li;Ti`D%<|&36(wGR1u33wm+;028 zJmW)-KiY47M7J;GZgg>8B|LW*;@&CIYo@l2+J)%3DJAWlU!0>}U7Nzv-wd%erjUX3 z)3j!M7)d(cfg`XZQyytD!!AOjjsn_|~)~bWNn7CQj#-3M6F1 z>>BL|O`5v!9(6$D3XU#=sU%eQ#v-a$P3<$P7S^{ZGj$77?;gRUAFzk;YOHL`y*UwN zpaU>QU+lzGBciKkw1gwr$_*7}slgO;r{I!bzkPprtvIq$P_p4aC9l7!O0;rFmdxN*-?iYpx?v3I zTE7N;VEU6tkf=A*NBC$}$+zSRl`32IB-)tu2?b((+ya14IZ~+&&R<^o7{Q5TT&Ir6 zCPwRD%xfHeZzX+8|5w6b>d9xx9I{=`7Jq53EQ7YEA9Kz4yWc z%j&eWcDyldJbnxDB1>>^3&)Fc8XzThxEvhWlGC1SJY{EW_o`j2N5d<~Enms&j_;~R zec~GauC$U|2_+ae=|ry@HswZtH5CDDLA;SIIu|=m$)85P>b8DF76{UyFkv5-li*d8 zLdWy77Swq&34x-yw~kG${|F69rY3}>Ed2A;pk-)u$5JCBdwfBO_!fmxVzGo@UsX8CClaE~#bYL!@EjskWeo?psegH)EYKS5BMC%Shf-mV)vy-E> zP@?E^V@>s>=4*Rx_esr;Nx#DT+t-|?Z}$Jx|N83l$HwyYy%%|wg(Uu9K=1krmQ08+ zfst?#7!d;L?wrdn(32z$XIx6`kZr0p3K@Aa7-7!1P^ACbeB1YcwfJ$hhX&%dG3#p) zSn2X=XD530_?9piDyWXe)4nE!#8?hAS(c(ahMDHYz_q1}a}3io4N;$nlk-^nn{G*G zB>SZ@{5BLW#6w{BJaPT-(5&OE_jPXL7-v-0sK7Vl>q zm(x_wCI|aCE$LD0yyj!ne6{Z#i^@9UZqS*>se{8Zt}*3+9ujN{Y6sBq$AO<@8U0vR z<0g!EYexOj&~UpQef;>+j!{PD-C2^h@9)gt`B+zTg{HS>1wX`bZFBF8ni}(Xbs0%psM?o^*lvq>Rc9k-8g9TPfqZun_6~inzs{L5LKE+yf^2= z!$fxS$MgT;5Bo7qno{RFyza+6xe`}y8v2n9FALmS{0rPjDj#R_>_T!Tn{S(+5tXhn>HgE(H z5s)|)Osp-Wg0Zh`^l8f)LcZMA5OD*$ME;;;{@c}h}9Pox!LHJU5E&-dKV&uG6OISX>T-y(8S7b zk|M+RJ0NrC_spt{Ee>pkCt0zW+iBzbyOr-to+IK9yQs zVo0*T5h~-^MMX>@YF1f6UunCzW30E!@zH?OD>8SVnQe`i#g_>Y2Bx(h)Wag)t>mS zf%{3B%nuJ*?0`Ol%iu-P;{+K~HRJ}Hub+pal*_crYP04+MhMxS^NAPzqAp!Fb+#eQ zAzi`O`>;i!sMDVqa4xwg1=8S8ZB9eevHURCen3rlwV@2%ixtsZdoJl>f(W0L2A&DW znH_L@kzMo3R9WLFhcE31ER{f6WWOvJJv+_(8m;t~R z!<#A5Ons6`L$9>kIl|h%H{G_isT{68;j#bL%*>J@hh0!XW6D>X%Os_XgKrxo=vLw! z>%tUEaJ^X{XwqgtrEdnWq2_Fq{`*6=OWs;_R@T%}`1KNTEr_Ye4*6q|Y{{&6 zvN21^2FxN+3hNt857mum2Y9Wi+(;&SW_)d&{M`jtxy%3Mto@R+I7bIiN7`3L6Qd)W zL0p#*z0)z?*!?0QwhSO#x>$-Rzn47MllA+!=xSY3PhiLGJ(}yjElL{#-7tuICDm;^ z63>Iu9Mm=mM$le$e?*G4c@Te>6*=EJCmf}(Rwl=A?7uNg8eCOOpu2f#9ZYlUeZ8*( z)UNW!S9uoFm|_U}Q&ukK9%i!Y4B*SS2Be*h?TpTwTQahb(!|U8G`>S08_E=2KI4n) zEwx0rok*VKbFa<%CIxfr@cw0I)59JkR2#$Ah%WTLLykA$eV73Wb?%aG+!VecWie8rKGv9spo-0S3L5YS=}H$7@p& zQ6^XW+FTb!$9QV-rS@i-5*vN*wHUCy8^9(hixjAB7H8_q<334)>5k+FTIlSb4{W5 zyo*IHz>dtH;8{roj;^&^$FX6lYOZ~0s z|26qik|pf**r0AOnLqb|^5**Sy2xX!FqWbFY^g z$9FdqheP^?u_Vdj%WhmN1Mc+n`%^34f_orDoHvE1k*NICjCI0v__v@a2c z*&>sk>no1pV>_7z8AY|(4?ibRfxz<-7T52>)xW%XJ$d>4F`EUb6bPDfBbA7Y6l)R% z+HUAbh|(iO&+-j|CP;K;OlPLH;UFdLdHzT_;=SGZ5y{~Cd-ZP}C>w(HY8LuCqh=7a z7hq4fq2gL#z)|fMZ2`dP9B?#%0<|9xfQqzI6X_2?3vgwj{YqN9=Qous%k?7+5coR=))BSi6Pbc6hlZL5td9@Rw#Ne^EN2A_(VZqAA?AUX@ZfgBh%E$ z8*Yr_UZBC2Dk*g;{H`38c*Jk^#NyP6uTfD%p)z=}yy+;@mPCN8IBthFNt>9JE$y7@ z>xv}}elYi76+TYVJ?FFdng7hfiR&BE5>``*oVB3F8xG?Svj@^-32ls1=jg5seO%0D z^lww;SxlP;i0e_qoK=!750j(Hnh)qFcPBI*2`pi{0>^hD zyjn&3K4H9k@-S^?dkg8YYK4z$n>TKA*!D+h;BEfo&ecR88i$)fd;l@_g->t*%8vEk zblg~r92@E*I~1IL(w6WoBqoLJ-n{q!!td&$L7%Vc|1lk@e52YW7}FrMB@u&`ntL*O zcNao%Z)9YY_?(E_w$1Z2s`|)T1lsVMq_6XgyHLh*=Jx}O%%hC89sc%R2uc=4vY*2Y z*g+Y@adQwq@QB!j{5sCV+A?RVWPy>``wr;#sMPI8SZc`{;g`BFi~1MJ2@lzYoN>Uc zg*ik2b{mwMibSx(_G9L*J3sq|X~W^c{-v<()?Btk$To``gg@{?k1_vp7Y3w?up@Y8 z7ZPIggy$rP?Bf~i=O1?=b9)nk8{2c65|L~`fAAmF|DX5$okp|&x3MyI)7uf9lfQ~k zdcE({fde5SN1tl7%>RoBKvw@{2tFC9ed3Dy`)Hg0O>V2da#r{0{%v5P|12S&s+`!5 zC;I<+1oi$Vit=wU|IdD-CA4j&Y_54US75sI9(K_=McnzB`Pl&tJposQdtTKe<@oJ4 zqswY}|51LBCmosL+%T?x@^Fyw>o_~{evS}yLDdIbI>v8pYTlBSgjYcwrb^MRqqUT2 zn1s7El0^zRcYN8@)Pky{~(z2+Y?=&xcd%JRgNpT;?<3@iFXo>jTI=lMk0ms-h( zZ%iqSyO>sUlMsd>yK7d2m0RBAN)>JgBj)ojr@eOMD`@go*4AU2f65gu{?;pLJ@{%i z{P}`Fk@UG5CD$J5mudCTdp2+^feS|b2zm}V$eAr%G@JwFG~HxI>3eTX4xheSKhsTMDzj>8E41nHq)2C-KjmN{OpOJGKqsT)HEyyFV9LP5Ua6Vr~n4k0c8)A z1mnC-O@>W4vy^G(5!G-`Z%NGn;i=nI9u>jANVWAg`lF4^S0DduyyJ2q5EB74>o5~% z1Wl{E6AL0E)G2$wl~iWzIHtiq5^Kz>Tt_hM@lwUQ`6ERQlG_5F9KH15Ea4Jlhd+in z4tRj5Mk5ee#vYngq(*kw104Cl;o0^xp8Ce{c&TB{_vucZ&8cH{14`_nx7SWMOr5B8 z_#7A1xA;n`1hhrk7-D`PwuY4!&O9}bi=KsyZNc}W)CacK)Z1Ux;B(zdGS17^#E+I3 zb4nuS%r%0qYs8Cbxe6;h=9$#9Z`}bwv~7AVK%nw5{TT-6FL;T88clTTZ~=V<^lR{2ngQsy1fL8)#+rBwnpA6eMd=n;`OR&5>I zc%g!YeH5aktgUP?@$jwPV!~^Vt!9Z0VQ{|tYEO!_!D`bI*$|{Q-GXM`F(c5PB|!aF z;-&q3OGxxvh-vVjfO~Il)s_`a@=0{Qc5w)ILZoS}8y*gt<6zIu)kwvGu(ng%r1omJ zk4j-EUSY;-9Ia3Dh%VEE?fYeP-9XY_C#3S{y@ssd4=;wR{zxty*fXQyy6|53qZ&?& zl@0S^$q^0msg<9R?#>UjW8k9qnM$q!Zck%U-N{{anqN=rhLV80z4yH7?L$QS4+DF4 z(Afd`Gx?Nv`3Hsf$O~6&Ni0qJE_)lH41XO{i8DB*V`QIVUx2h`n|*@q5Rcy58!m2h z?LV5r|Jmz2N#iXTs-5+7m=s-v_M3%Q-is zZsn+4&#*20&U^QM9>J@@{!4`;W9xN^#GU8+c*||ck*$f5bJBU#O}5F0R_-iw9aI`${!;(%}$R2+2;h^HFPgOQmo5Jql(OS6uu ziMPMbuzNMHsj`_-hPc+)^s&ak(IbJfDpKy2`ujvzFXq^ksHB(jUG&-rT4HGo%w|F- zHb|HR6c6pn#u*?GL&^}|kMytx?rP~b2Rv3gQzs=^(Qo+OSLM?%#qU65+QU6Bk`_{- z=K)o^Ix7VaWgZ@5^ZbJC(X(Lck|R85HxjDEymfpkk3o7vPEA?pufDk$*J)lRtVhMI9SD6I$5pkF7|R=eO>BB z1#J7^E%Or%ahA#n8B(8JRR=L#CiWf-DR4rbKsnJ?$nyE6R>3~7*d|{bbU$F~yq6qu zY5O{!fK(dJOApc#aMUl>3}NnSPn28)f<34okcwfhGt^q*FY|_ zw6PnZ#QE+i9}g7Oi%Jx{qVVvpuq?i>Jph7!j2@Wd-LjroBjTQ$3IIhf9MhidLhfc7 zb;CCtgpaNQ8SOcDyWh+EHqCAKY~sqBB*+L}cupj|T@*QdxoVhc z>y_fL^fj*+SEmQ!ugiR>bXR?=Ets@;^HbQ-|HLo)ohM{26d0hN#^+m)J=8 z)=YMyD7nzMzhyG6{2G5UnbjOpY>80j6wk!Z2tJ|HUxvKpnRHeXT+X>JvFX7S@gb*X zU@&Ciecp4@Wm?szcpRGnXKLEHp_<70s!?A(_1NBtt$>RgqD}Oj`1f}AkH?JZW4IY7x{tGLmp0r z8~Szb(YV8PwPu>Ksr65;UDA;u+|?8&W1pe+!#pt}Oe$D)n#eRlW7XZB;#G$_<9ue7Owi36w27&R|Yp>v)NFoKvTl zJL*ws=8=GcdczA$uZWFRMMSlj0f|TS;QYeE8+j>)8Iy~~lSuFumO|N%5r~FW z)L@cus3|AYaM)CosWphT9;gmaxvw$1Y!P?Y!o~j24|n(8&)vyS=iiHS%)@K_Cu0aHWdEH~3% z<$EVP^%i;6ZVP!lP_6bN*&q8N{vnAEs_yG97kT2YaeBpR?x!9vz&aQwu*j^Ov*}y2 zZd)iWQlniEO}zeDh+i!yk26N?{r^har`w6=X*NtO@}vb7DM=#J){d+t+Bm?ei9YRN zIkRZVKDNZNxb0zFJJ1q@VJhvcu{aPgssy1e5isAH+u@wW5Y;i^Ps7C@ar^|M(!>?Q zCU?^=q{R*l9AG5qIOdl?5QsIF{Y8k)SDrL5bb^7X$$;d>E`-C0srIi4v;SaY{$D^z zi>C|sXpKOM593K)=z)fpccL~qKYhQOz?;gO=A9FM<6vl^jm4+`Fop1MQwsk(KS!*u zk6)=yX46TE5z@VVV3lspvt)}^h{PXNh8w2U(ewnJSDLEd=B7d;8;3g;-$~qYJ-!F6NZ6yk z!__h?*|QNuekACtVl(U?C!RviuxhyZYqsafc+sE4sJC6l+^Zj}50mpUe2oo#MG1(n zn+V`ObaI%TkVrOUOOEeCm`~H#ay)bp&dJRMz~Cbstlis%$d|)g2|`S>`FObwd4(ZV z)GAXqUz1(v|46}%f4F;(KaS^dqH?iBFe%a1IWV5!ik)T)Mw1PI9{J_oqwR3yELv*q$u1 z&JxXV9)7jPw*IXERu;Ch%3!~Kv6V0+UocPC{Q3JXBl)jps$Zj{$M@idKsB5!=F}FW-s61%v9Gx-3V1LRR}9Md+4}b7x)4 zJR=)Z&wOSRyDz)XlnokNI`HFRNQT*;bd3o@CoFCHoG|eS#KG-Ki zIA*O3+1NjCP+0KYCp~Q1!mGq(YNB+EPJv|F_oi?2%Biw$E9)?8NCW|x=fQI%XuDG% zPup0ZJRaqhztZTEt9(S+u4`=gYG`KJE<}^dMJc;`uL<>Zk$z$vUTgp_gM8FV5YXKE zT%)PosoG(mUW?N>U$*v2(EDRl*QJQ4+J%!R4+P*UyC00X+8!@2GMg-&YhqCjXiej) z#RgSqE`5$7rhXA_kqPox-Ld12ng$`7pM30QXUnph86qoKnJsw4tU9&3ogj8;r?z4K zl>8Wb&;F*#fY-xPgpq=M`5mX*edSE~%gIg$MAyP-=>Az4z?e@=c)+}o+JBt^jW#)x zzeJ!$$lM*AIlt~S-F3ND+4Fi{R0hx2-0Z79UrcxyRx?aJFmHbr%<7DFlc7;H7MUg% zBGy$)1`j_bJ5YSTysW&~nUopJ9s9#3&Gi~!JCAG6R7MVW%i^B>eowQH(epLGTvs*F zl;JEtXATo}3jn=MQCIdgKI$%HrFa*z zRJ@KaiCr=>5lJlg@$>$v8-YHAndZk9AwAkkUwc&gv7~$-mps^J{+ulxtWn1ib$4$6 zS4@F_`;2bdE+nkFKProR3=dto7klcFMZ@s#FI(#c(Yg17DX#D^Sha8q=yq0lbWqGm zh>lEoOP^0ComR(yvz%o^tOj@xc&eNBNRIH z-p`vlzHG)`z?$#q{-Na%9ttzX(&&mNV3>CT8Ay$>W@{w^f!eEPyO0a>q&3F2>MleI zUWw_ze1`oJ#mzxCOoiDB1zx)lST+D={sDv;`Uj@H0gRw_457l9xds@}2qR4sDx_F) ziIIf0X)MzjN`tNo@9Zhr?q;_C>(1~XOsfRw?L(!P2@+29e41&JepYzyO=|?{PhlKx zsyzRkSW^&VFwa*p_1DdoJ(T+)ggi_u40d-$_-djpxMsMo3B1j@J;=&w|8^?@y&C?S zt=Rmqt*zg(I@Wr)?Cx`3S3bdG@6VeZ;D$Va91KTA$|6UtO?!^IO`zqkvx8kIPOqfd@Et;0%P-2Nc69q7$z@E?=Sg+PO z%iiAww)A7rYVapRIUtlC(NNM`r0tjY>22lENq5ze(cqF#meN*zl&=rEWUlw9hhMdT z2x70DmR~6UyswTe8NSWp%m#7pJ}9+XoA66QibeN%Su>)co#nZT$bMV4aQqf;zTn-L zkV^)_U%uad5Y#GP-RF99ka?=Wstg%sS6fk4=R7VI_^QW5Ly;E%V0md z3Zm=o^(*mCm#PVML%+Awk>xl;R`R4p%02Au-qmXlzwZ%Cc)L()bC1XN?_I#+<^T2; z{T_i&c8xv~4RK#9B0bN=llTrDKltFHl4;jl*P^AyoJ%|I+1y{+jazk{zLtw#H+J49 zESR_d%n$kMn;hWAkAJ2x_isEsOzxFvvNBmORy^Vnc!Hnjn)RK_mCaQnrR0&vEA{1? zi}ClKBbE0hE650zo;Z|n=76k5=nCQAXRg5;x341amP>6WqIk;U!N<~m&MWz22JSaP z-Ytb8Cvh-+&M)!#5XkZeKZSoW%ujlg>O zBfJ7b1h36BSUTjrR=?b8nR5DyL%7|2L2BNn_)QMbL;DXH9Oa>BWw7$}5ENe1@3(aY z&K=u8y>GRotkfwB&dZztW!(O^@%V4r^A8yp5BWUR(2czr5PakHjKCeaTWYQ+t&f?- zu~=Ax*-t@BeUhi2!2e0x!2AD7&t!w?nbRLIYgM;u%r$?$)4JwUKltqGxr-cf38Tz@ zu93leJWl_CY`G{y5@${&^+k+(mkV|@Lgw=Bx=<5Cs;Y?>kO8uzC!T%U{LJFmZc zX{dE^ss1VWC@_-w7tQ*cntXOzb_|#q?TjyD>hyVjsk_>(<{tj`oZ5qZ*HaF~ZS9dw z|4%FLXqh_Mxu%1B@LF$=-H8pGb)FG>88gY#PbVuIBQNX`d3k2}h>u)Lpw2YlEv7DN z^OnOjl;))WpDOteI*2j`y_93XMk&xu&j3y_1iYX;CTGan!YlG>a1rFP&-shKTNZjV zhPGqX&74P6)ej6gJA0CTaz8gepjNqGRhkilf52)m(WMzW0!xe&D{ujnj`rFnJo@R+ zacsbzuCBhR)~rJjeA>#<((PQgECt<9%b;905RgrS-hVVU`KAIk6Rmwc=TsvDC zh=e7Wc+hSm#X4n`9i<}lDJK;gMpkwG^QOOCo9lDBws7Hl?c1(nxlOD}6Ap%_53C|_ zb%UYi1FiOmL^OGTJDeI1htoJ2H>t0@*O$|5C}V!*3aOL72PMa551LYL1$j_Jbku^M z_-Pr8Gk*!mH#wW{vChROs8vFFu z%vd8yhmz0cKDh6zN07(33n!K^4xuDjiF##Hjw5(o&orGS7e1hyR5JD9J@rba`<$Cm z-_Ktnzmqm=qh&km1R8!IslVcNLW5x4&?y-GIL&a?SDPZtc#0&npjCk3e9y^WR9yHb zPTJc=+UiN$oFk!T*u(M!;>Tl)A&IvMOAdQ)m$sUPJOYaXK31|am?s&UtzfJ$Oivm% zJz`$q{i=tI6J2s#nLEcS@sD1JIko=TmvnWx;;eJb`J#r*SYu=$MU{kz!|ufpUteRl zn5qHV#VhRN_0(>r0-GE2VwQh&%h}MTvO3s76Q`}5Fne(`GFcI)cRFZZ%jUybJI*O$?MS>uCC}~$ha&AQ4_y2s)s{O7~p38k0y6OZ+jPVfN&onjqcus zhzDfeUFq0?g_#^7;e@^H>SPmQNyx{+AueAmqsp}oF?44PipO=#lb46g#p2r2L2u>x zef0M%#pk`Na2)Bmb|?uN+srEuhwbg#M2@U z0`i+*2&D&tNg987K+>;82MBsS_qrlP|0Yy$qg=%E{@Y%(lTF zGqvX>76?>ZUu$}NN;P33k?zAvF$w&Dv?d?yNFzw20;t~(YJvHKk4Zl*@7y1^Pc5#i zvye4YnNDQ9kvp_@x; ze(?72W^Zh+@%Nxac&;Ek3E3bpdu1?A-8dn zE>hGhSjLH^1x@wy05RPS7jeH@$dBz>4v~I!j^>6`UosIgV(^B?Qx>HN*toYmr zdapIXSx;~MR<-EbgVhQnu8%B&K74ZTHvKMGcs1W;f2@Zmdh6HyCRgHAndx??Y+{_> z{na0Ynwn&19RZ9fpJZ*9HpgzNUlwX%(hPbanYZt_rEsRVi) zs|GEO{z7G%1HL)GTZrwJ(iV~^a9W!#RW3ZZ2v-zsgXkn(*She$&Qz!BAT5tSTH!U{_ zgqRuJwxdbDo8aYSh4`D7j+yoY2YqNfWWp+jrrzoT0rbhu59e%XDr2umD~L(U&ZoaK z{mIQ*PCj~#P4$M7+QIo9U6!B8&orr4jrAhYJ=R!L{$5a>4gyY$C*M)pP1OF@ei5Ls z6~bCv`?DI!bgJNJ7NSRk_=Zz z=i&0d2vvk`g1D0d@M8k0ewmg?Pg#sX*;P*66s~E;f2c4>@uk;g9a3H=CKx|D$*Zi` z&}U0G@&O^1S7fQK#Hsr$HmFOqy6F2&&LJO|>OBwFz}J%NSYtZy=>Mps8ss$t>yLrvoZ(xLj1_x9B_ zb-LdtKUX$Yo)bR4YI}I$cCjP=G%KAghuom24x*(|&Y%+TbU+2=ZZ&~hZHCJM569t% zd@@#kR_H9(9rwEZ(}fe8&HKKPh5Gj!tGvkmBLJ>~+sx`HC*=kOOBb(k;vcfo(Q?R7#O~D% z>KZ+amEELEzLN)>BR#1gVYvX^_AIWkfDreCk8X@;{b+7#tg5U|cCcL?OTBtdfm__# zzxmZys}}ia&^cJANp&FPkc=w;sLw+F^Zk;5OZWb=j6~wQ4fH?`L)S;d!P*5f0V{P#wuzO$(;h%GBgVHRHr~JqaO;PkMakoD)6AxxyiK^XeF9_9jt?)$lQP$gl=%$n4*C-T3Qk^;s zCH=o4Z~+$&`PkD=H7DKhs_ym5%j)xR6K!tZ>ii5>)OQ~QaR`P!`#atMNMW4*WeQ;> zG7ZZ-T{MAhlF*|ow5~F8t6PamW+pZqKR~xjcBs777STqs%&51xqw_)ql5|Knb&);_ zm@y2|LzueAXBh8(ULd$LX?g{10DcQh36^VW#n1)%sd`AkM@aPdAH;m zBpqtdY5hOiJI|n|wswyv(p379q7>msk*ai10}&J=s31+G7*LTWLFp(ZSP%pO2_lFH zs1zvyDWUfOiip(EYXBobAVI+ZA>74#XYT0Cz30xE`{BOxzI@0`@?>Z4wbwk^Ywc(K zfB(&FTAmWSoGzNz1)t1?a|CI?*r_V-r??v@BB~}@jz&-HUV`o6Kyp&BE90@~FY%nX z&pDoa2K|JEu;yy#3XBGipEFzyFux!rGm zH>$lbntV6{r)c0<7I2;2{i1x*=ees-&)CU*lj}Ig{S5A&2RL`>%>jJjaLj}~6@fp> zPS-1);22EsuOii}csX=FyT-NBS41P>RIba?J9OV?gibtzmN~X}OA3G4)dx%E2+qPBPI- zuAEKpPsq5wijg(;UxXX=9rt}%_Asye!h72H>Kuj&Ia}A*<&CtX?bnFdue-F8N#Be9HGrT?h5&24^o2wQ%V8Sfqs*?f-y%SA@$13Vy&`vx|9hAG ztMz{pl`Hg&X@NDy7$PVezfSmwI2~tn=2gPO17|)Q%Ap0JdV|u92N$JdluY!ktt~}Gft=)3=B2$;k>&TPa?v18heD&c9mUcNB%ApND zYb>7S8gQOT>O%GdL1HcSA;~CpF7x>1)X6qUH@5YBhb4G|U#bYuv)#cnYJixli{(1f zr7EMI&mE>OTHrp_eFQc8;tsu7tw^OnHC3-%>pdT2#N^qDU{I(SYy`knAG%I)J8G&(A!oo zFWtFhQjjiXy4fbPAm^4^tAA{(e6EcR_9w<;N??wc{g9G!(Hg~2q!1?3+r@?HB!)a( zU4NWBo)(ds zky2#c=oF8cpm5GkV_bB4fWb{#vRhG*R-mg>FK52eeDd^YZI@(;!2~QajwCXZY69`i zdmUik^2E+gKQq9H+-`)DyOiCvQhUWiydr7Z?ft_itx2PMCVB9)#3!Q0QPUrMty9@M zImqjtw&vc#_BI7W*Y>xW3oDI%SmP2N!Ro)E8x|4NZ7)mD?L)07Onwp zJ1}=yEFy^a?GRX5qe3Xp-sFvt+u56a#%^PU_WYrIz{*~oNp^3Brlgm0Pm<{Pqx`w? zKYLIswbGMkQNBEw1CUmW4L_Z+T!QyFPf;IT`C29o+1q4lYpwVK*ZhPmt&dCeJADn^ zDScM6V}##H`$kKwD|5$WZ82~W-gj#A&4FcXIq&M@Y0d^V2U3b(25ZazU<3N!S%b2e zccG_SP1ZLnw;)~Uatx#egf)W zu}%5VZndu~!A`wK&(`HFD=W_=fAM}0p$e_7edraEFu@?$C=B0hd5#l2RdS)^p`*up zw>3xfbQ<@CT6{Za&E&F}6 zl13z)io{WziMB27U6%#AeO2_<9Me(NvCxMBog7-QX&plfJLBxOtFHa|ZMU(P8z;e% z$JGJ!{4D&3jm5}?W6}QSV-5NXenb=!t88r(A9*+&Gt?^*P8^(uNBd6{7vMBrP@P1N ziG1r*_!2fyG+gHZr;+B7C}jMG+}9E}dx0x`rd%C5pIu*8bGFak-Gan2o{l#J!}b5O z)(%DB%_Lkd7BPK4wM$>_C&Ci?bmP8NF79)52GYp6x(A!-rGz}gAET3D4xbXC{M>}( z*Hif6O`)RKU%RZM2ra8=nIpQ|y{uKqGL}fEm8-0_)SN%x6_r;dud{1m0;B7K+V*ow zcZZE44ntC$v)sgJ2$(hyXv!a@vzSl-_|?gc?%LKHK+WkgyJq=KevbfT%NsxOV^=Z2 zyet6b1*y~r!rb3uzc=iNDcJ7UrUH2Emm{XLKedGa7Ww;axC^}QS^MEr;y2mnzR)$M z?zqQyjLlac=&W@m{9pI|&v1VK9&H$@GRT~9$bF;GJPEa+>-f9Yxv;q>?lU|fkz1M% z5G`H0D)G*s{BIZ(JYm;J_$>1f+F<9WUHNMf{$G zw#-z|T(Srgfk2q!Lm{F!D*EfM+eaODZ&90<*Va{CuEi0v5EbzrGTr}(KW$VOme*qQKCGqMjEa&qWd|qrc<#8<1hKP0qpWT4b9gz;^-1U=>0Ja66%P|79@gDKbcei0}L9@fR2>Hbu#R%er)PP&`NNsP&s%E6eB_m z;C|qWSq6s4_DDEU{U%NB<|fa!ojkZ3MR{*Q68Sgbz;^EwFg?YB_HU0vY#VTJ4OJ{a zFB4;F(YB1eFSa13xmVGkK45FN1(|I@oAg~^`_2UH9rMtQ=IF0?w~fDOXK$p@E8hGY zoX3X%X9hRmiSA{Q8REsj(>FPUm5dDTL2RaF(XQFqMy0$vXy?3PNg<`L31hUh<<}83 zsp&MHAQPJU)X_&s1&TT;4A`*HuHw!6=&El;MqLH>jl5TQhDqV5Irl|l(kncY{J-Pc I+*?Ec0pFHU`Tzg` literal 0 HcmV?d00001