From 1247278f43341c963356545fa86dc405fd6168c6 Mon Sep 17 00:00:00 2001 From: Steffy-zxf <48793257+Steffy-zxf@users.noreply.github.com> Date: Tue, 19 May 2020 18:24:48 +0800 Subject: [PATCH] Add ocr modules (#611) * add ocr modules (chinese_ocr_db_rcnn & chinese_text_detection_db) --- .../chinese_ocr_db_rcnn/README.md | 125 + .../chinese_ocr_db_rcnn/__init__.py | 0 .../assets/ppocr_keys_v1.txt | 6623 +++++++++++++++++ .../chinese_ocr_db_rcnn/assets/simfang.ttf | Bin 0 -> 10576012 bytes .../chinese_ocr_db_rcnn/character.py | 168 + .../chinese_ocr_db_rcnn/module.py | 416 ++ .../chinese_ocr_db_rcnn/utils.py | 105 + .../chinese_text_detection_db/README.md | 119 + .../chinese_text_detection_db/__init__.py | 0 .../chinese_text_detection_db/module.py | 313 + .../chinese_text_detection_db/processor.py | 237 + .../scripts/configs/chinese_ocr_db_rcnn.yml | 10 + .../configs/chinese_text_detection_db.yml | 10 + .../image_dataset/text_recognition/11.jpg | Bin 0 -> 48680 bytes .../text_recognition/test_image.jpg | Bin 0 -> 967120 bytes .../unittests/test_chinese_ocr_db_rcnn.py | 58 + .../test_chinese_text_detection_db.py | 47 + requirements.txt | 2 +- 18 files changed, 8232 insertions(+), 1 deletion(-) create mode 100644 hub_module/modules/image/text_recognition/chinese_ocr_db_rcnn/README.md create mode 100644 hub_module/modules/image/text_recognition/chinese_ocr_db_rcnn/__init__.py create mode 100644 hub_module/modules/image/text_recognition/chinese_ocr_db_rcnn/assets/ppocr_keys_v1.txt create mode 100644 hub_module/modules/image/text_recognition/chinese_ocr_db_rcnn/assets/simfang.ttf create mode 100644 hub_module/modules/image/text_recognition/chinese_ocr_db_rcnn/character.py create mode 100644 hub_module/modules/image/text_recognition/chinese_ocr_db_rcnn/module.py create mode 100644 hub_module/modules/image/text_recognition/chinese_ocr_db_rcnn/utils.py create mode 100644 hub_module/modules/image/text_recognition/chinese_text_detection_db/README.md create mode 100644 hub_module/modules/image/text_recognition/chinese_text_detection_db/__init__.py create mode 100644 hub_module/modules/image/text_recognition/chinese_text_detection_db/module.py create mode 100644 hub_module/modules/image/text_recognition/chinese_text_detection_db/processor.py create mode 100644 hub_module/scripts/configs/chinese_ocr_db_rcnn.yml create mode 100644 hub_module/scripts/configs/chinese_text_detection_db.yml create mode 100755 hub_module/tests/image_dataset/text_recognition/11.jpg create mode 100644 hub_module/tests/image_dataset/text_recognition/test_image.jpg create mode 100644 hub_module/tests/unittests/test_chinese_ocr_db_rcnn.py create mode 100644 hub_module/tests/unittests/test_chinese_text_detection_db.py diff --git a/hub_module/modules/image/text_recognition/chinese_ocr_db_rcnn/README.md b/hub_module/modules/image/text_recognition/chinese_ocr_db_rcnn/README.md new file mode 100644 index 00000000..2076a10c --- /dev/null +++ b/hub_module/modules/image/text_recognition/chinese_ocr_db_rcnn/README.md @@ -0,0 +1,125 @@ +## 概述 + +chinese_ocr_db_rcnn Module用于识别图片当中的汉字。其基于[chinese_text_detection_db Module](https://www.paddlepaddle.org.cn/hubdetail?name=chinese_text_detection_db&en_category=TextRecognition)检测得到的文本框,继续识别文本框中的中文文字。识别文字算法采用CRNN(Convolutional Recurrent Neural Network)即卷积递归神经网络。其是DCNN和RNN的组合,专门用于识别图像中的序列式对象。与CTC loss配合使用,进行文字识别,可以直接从文本词级或行级的标注中学习,不需要详细的字符级的标注。该Module支持直接预测。 + + +
+
+
+
+
+B2yc`@?jlj{r2ac<=apY_48hI`lgyY(wI0i`Lx>6hirG33PZ;;Qyop1~( zz)_fm!==z<5THw)4urZFpir2IJT>nFLH3~n1JI;@$TG?L&utquf?-#9*%DmyL&N?Z`F&s zIvn4%;P}1^j=g KE?g0I`%8>Km(4S@^KtmgyUy<|3$v*Rg;dt91YStDj&Zo z_E;s3-^KMu3P+Q?|Cx)Uc@mDlmf~os!Esy~e`n%o8-U}Vl{il9!Ew@u<3Arxa&fks zhSQjj)3F? Gd6i=NSKz$54d*o)E6~`rJ8@pu4d+04xV{nR4I^+4R_>64IB)EZ zbLc3XHyy=!b03_;$Kkw1`M1V!j@*K?C==)H>dmMLIPa*(d1nF6F||00`{KN73C_Fw z;~c*m=LBuvD_{31Z_-?xlifHU=!dgpA QN$hVwD? z^zn{3XYIpTuD(7gzNcp6oU;e#Txma}dA(ko^OgIY#-1OFbKx4Ci$>sF49=I9;QU`0 z=aSJlU)KC9ML3sj$EnXz=WB;>zAld|#I5V9&NrKJzBLBtsurB9r{L7}N$0!Eaju(z zbG>@AL3M6a4f;HEeyF+4TXE|A&-rmRPQ3=4)m1pRb;S9ZxN6kT&)gj-M@@hs9k#9%n-*oWCmf zw?R0MNvAOr=O4=XQ}r}&$Jx>Y=kbj=|IWqPwhQNpi8xR8#YGmbb~U&hg}7W6F85ko zW #4cEYOT!Uud8eD_x#(u&ETtnq^=uuoZZN)WgB(9r-g1ii0 zgG<+hTqDYG-8vB0Ncq04E3TrBxNeu VP8od(No%3;xk>=P&T*Vr@OLOB+ z;2Iysbx(g>6UO1XcPXxk^|&U$xDV1>0~foQZ4ETtT@nPQ FE7Nk zRB^AQ1l6)k{I6 )bZy-AK@VJ;_Tu`my&%2KCBjKuA1Qy!EL ke^zso0(KaecKASM6F{ zUyJV>Y3%NV>)T$q>ZalPPO*E| AbS_4&7KT*qeO(y^aQuPawmBd+G1xLS&E9aoQ92MarJ{XIxfZd)m? zf5dkpOOW2b>cPo!T>s_aW+d)*y>S~kxE)!zom#qbal0#Vn_X~w*WmW&3stzS0^ua? zz&zZ+&cZR=p~bkvWw;~LaNCO2F`qj&T3C-e-d {~ zPw9!fJwgTUQy1XQoPqna$+)xR?R23-2i#}q-ieO?k9yo^Zo%D2`e#kV-FX!5vxni% z-hlfY<#$mn=gMo>DY(xQx@r6T{ d&(-@4;{k&u)LHO;eKQ_?&(>$%ar%1d_Jb}ndP`2-;8_KN!;bbaX%@Z zr_}Q~<8VJ+jr$ol?s+3|KdaiF6UTx!+zXYzC 8+XM*-1;ul{qjNF`s{MQ zs{G0=xR>|Ct#d#38{&LZHLTS9s=2sz-PHY#a^4+*du=`L^<}s>DCd36e;|CQxsN*I z{#bQw-H5wdwST7h&$DrVA#GhJbn7~yd#C(;H4}GjmQaWLYt_7~1ot W=%*3f#@Rakq&3cyHXT^7;2+-2bRgC&c$}U)(3> z T{}`}#4}(Dp6hzz8R!&t;kjNpgEV(TH#~z8j^P=yA5WoTZ*0Ib^e~=bs_W)0 zcy1YpXN2^0PUN|*AD$xRj*|aTWq9t$7V7ZasXmR7#u)h;+Z`g&r|d8%-M !ZZ1T_TxO| z&f9|LS^1rxCmh71*N _2R^tNkmyEwj3Z94|w z`LZLPoe0bDe6 qNyR-0otGK$Jc)ruv9`*P8K6rE;-t$9WJp1JL z$6P%7g#*exxERk*8}S@!!gE-fzm(yr-;C$TemuV>@Ek3|^P9GR?}DdMdQCn&e@?*D zd=O8|R6NI<@%&wi=btP*|8~Ih-$6{>^=GmJv)vd>qnn^H$4pFTA50yuny#a|-L3-D zvk23ijp?0(>1)HZ`eOz*VTQ(IMhb;(n0A410yDZ1Gd2Y?-a*)dnNXZQC(TqDW_m7W zhPY0t!aP-X4xZYAnc0e&1?K5Fm>u#k&rnRq6_{r>VxA>Wou#GgBj!0vFwY$>Xs)Y# zcioG5-Ym>+9fhr!=Z_HNKW7@|1z|yP-FpkWFfSZ~*`t%NAM>Kgm_0S#a|`Ch@_w `x z6W@J1Fegd-etDcc0rP>bm?c4B1LlL}m{X+tkm4RXhB 7sF zSB+(JFdrR-IYaS}NlVA-=1lq2`;j?Ib5BgcEHA};av0`p`F$!2bB-Y##eBLIbM8(| zy%(9!I)x_8`MWWnldlC;n9q;KTqxcbghjS+5c9?Tn2V+Vl2D 8;5W 0*GXsn0?hZOVQv_Q`TiixjoODBTQEP^in&RiKUAE)-!wm3in&G0 zkHxiBUUW^@tnQ2Xse1S6A `SFXmJcL;BPAKt6wD_?Qf%)ncq@oNv`)x8|vfvW5JV!S#x z_ujA^@8A`9he)Ha8t;uYcyBWC>K;$;&E>i+T6K)j_N|@pjvR*fwhefT)Q8*m;2qV9 zceMEKR6S!fHg*@@yWDukY3%OFc*j@by=NcZ2@QBBYJc1}3hyLw-Y*VafAyAV?7=*| zQ*!Y>q`9f8;bHBc(j9moIf{3B5O0}{_t74BXAH&rSP|ZtQ}8~%74H)U-g5Qn$%%Mp zE9a?NymOlI&h3ZynQ3_E&BOa_8{X#@;9W2u@AC`sF5Hgy1^HgI8}DK#-j~E%q5k|& zo|aVOU8=EHy5n6o4DYMTuiS?BHF7>E`@TGHT#5Gs@q8$~%`@?Sr20NqZCgj;{X{iaFT?w({#HJd z_Zsnk-h%gwfp~YU!TV(s-mgaEt(C{GH{< 5KZ90Uv zc>vzOrs6#g-qyZ&|DJ@mZ7JRpPQ3cO_nwsR|F+|!6`!#fpQ8?+b1y#kV0@l~_`IF* z`6}>PPJDq}e8DPwq22f*K795Pe6jBM;`8w(G?wa!FI|W)Lp-N6<2!XUzRY9zvNV2r zBfc|w;On?jx8=L>oizbp=Nf$39q^qq9^bhc_`2rfJ5T)GTJYsa_X6>BZ^PH4H@=HD z;Jdg#zFu?i>6qQ8?`C~{YVq|g!gqNozJBtbE6-Od|Ef;-`ftIPukC9V;ww0bZ$L4= z>-ONgJ{#YlS@>?)iEoJ33(N4`D33R3e%O9|!^hyer5@j{lktsgz*jT{-|g~#$4Gpm zx9YzV >hu7kJ zB!+KVHNG $R{?$Uovkk%9O|72f$v(?i%;Cp%;zPTsx&D(}=zUqHY@y~a| zx9}i7U32m+?tt&53VaocSt5;>RpTpF_+EA5t5i+P!}wm`g71yt_^MXpTbYmVE%|!8 z2fo!BUo#)y+DZ7<$=iDq@adS>w{a7`P4fNWZhRkg!M8=8x60!uTI%!0w@tnIOg;Qu zKDRH!w?oS>rTJBVe6{kqOCELo$5&_I`)(q>?`?d0rL#|CKT7jJ2EK!3_ |5o7F zH66dP6~D6|epfwy&piBIt^4-kxAO4^R^tzK#2>D}Zzu3a*W=eQs9%4t{?ttT8OlGU z691`#@Mj*ypEVkPhb;VOY{GwLDgLue{GFHM&o0D&&My4tmf%0n#@|irIYs!pXX3w5 zJQsDr-&6U$mf-K*AOEE-_%Ex%f4O-3$xH4W{CT7B_gC)K;=3jfe?cq$0g4}}m_hP* z!w&pICg8tOaW~1U{vQ3qSK%Mg1OLbr{@b?WzkN3TJLKig?)b;H$A6a-|J~ppzYPBb zX-u4ie^L(q``hq8P>X+x8~;Of_#dvv|HuaX)2HHpR2q-<#jktB{ZDkk|D?EQAHzRq zEB?8Powo)5{5AL&l;B?|-bM59FP@0MVif)*>d8{+FO&buh4`1N$1Bu>s%-o#2jgEg z1OMtu{A*P6I*q@lUcWyO{|966>mDxuN7L|stQtO1t=oFyuTihIYi!4U{9ld4|Fv|! zX~4g`0ROiLW%%oCVH5uE)bBmrg Y$3|7{xnW9rTC^4chGe@Ooid1 h&5Q8=RgAx7JpSYI**Y2j-$Gjn{(sc76E*n%t;2uvFc$r=+O5Shj$%1GVY!O2 z+?%jW8_PQg%eNWJ--;C|#R^tqh4sI>A_Z8sa-t`(;v=vU`>;}-vC=ECPRYV*KN~Bv z4ok--*6G`@I*b
xOkz2dw^vuoLU*Wmx&rzGfy? zf%31NhBZLmuIqy}P+kT~ D%|KCHp2eaHr^Lh0TpPeYY+leUMcXE!gz8eWBU z%S5aZy|8X|VvRI~HmuwBU=>wj-M$oSlr-;{fi+t7+&K_yj69B2Uhy%kyK1q SnBMZmiE#Lya^( z&&S$61M7>mSUVKIQ~Y0LW7U>oeXV})QXjrKf%R=CtU7UjHx6shJgo1lv3`(`eVJH4 z7Gv!%$2w4f^^>*_N$=-nScjEcpNDls+YOaizwW|1+JJSeJ=X7|u^MZz{%FJca}-vy z>ig?3)^XL^s`bB>-`0qALjC)971qf*tpAz_wChN~7)rn~pMY~W0k@v%pbLBfa|r=& zEdgIW0jn#4z!(C-r36BU2t+ao*ux1#=Mso5ClEhOAgQN?q>2focM>>7>+SmzIJJU6 zrslFb6F9w)K!+*<9kqVuBm$kp(>a5{*;5H*uOZOIB5-am0$o=V=w=W&UtBrTyI>cA z3$qC5I4N+^A_6^I3G^C7;1b34K1!fZ4+58MC2+ZN`;8=Ug~qQm3FM6 r{}uud zv?ov^Z&TFEhZYieSlgxJ2|Ob2)3XVbiR00I1RfhqVCHrLvo!z2d;;Yfo1IDEso@0X z$miSv1fEg8?*9tR*ZOl>Ur 6;yrQ~Z?N8t} zAA#jF2)r)dH^vaC66Z?otG9L#czY6oceK8ynZViw1lB44z3~J#XnW&g0-MCU83G?k zN9P5Bt%nFy&m*u+{yx+4^L_-jOJ|38zdTCdt0DrrmLJ$PfWSBUyZBbzb@I2zAfW#P z68J%R`&JRyuki!w(N7Zz9BLqNSiRS=Q{YGmfnUY(o14HfjWs$6{GopSseUzA5NMH) z<4pwqUP9m>ah%vi;N%1X|D7b*ZahJwm7sGjL3dYzo-G8u{R#Tr1g#|mgM$f%G!_|6 z&~76bj}g@OTfvmJ(|ZY?GJ;_HMuM4#2 ZN%9#YO8b$Ex zT!Po=87tR12@Y66aNsh6gXDYgRDy+l2o9Cjurh+fO9_rp&d73tI(83^lAg|KgLl>w z98*MaY^Jc2V6pP=8cJ}Sc<+|S@fyF!O>lxq@ZKzf6E%Kc0l`V)xPLjp$@>WE{>R{h za|lk^OmM0^KHNg^kzzs1X _GpYzawu#`(T7r+OAG1mcKB2ktN`g-w zCis*^aL#Okb4L-JS4eQa^cP5Pfw*;lVsK$E;RL}K)KC4r24B?J;u3-{iKjxmOTq+S zRy|AC6I^B!d{sUwYY6IiEckjW!4+c!Ep-oK@QsrMtJHH{9}m7MzLoO%mU36A$E%d{ zb{WCd9Rz8=BadrF5`0(rYt@5w+UM&U2(Dj5@ICq6Fq+`|c?36hCisDB_&~L9+D-7o zqXa*ar!8HCHi92ZXRB)eMC+es6V%^-aGQM8Nb_@TZ NtwfnbPYtlh9eEggQ?pbhhHMHFnN0LR~a=?g~QsTnL>f{cdXsoxh7v&VEAO z_4MEi6NGw*^P+r0Jr@(Ycsrp>3_`tqg!GyV_0jV_FB4zid4w((`fVn3g=)W2-ty$> zs^NtCOH=19q5NZnuBj( jc7ZJKgV-vO!nkfDI`VpF>KHa~7(BwmeN;LLhF`+57gr>G9^ss6ztsykcO=x i=bPrSL$-#tXFC{d`N$6?C&DB18M&9PBR-J!`o|{T& z!7f4zvkAS>pU|SogkIc3=%p@%be~5^*N#I=wi0?-eqR|*Xqj?fmCx6D5?Vf+(CZq1 zBa=|oTtaVZzr3ZMtP Si&4kt;CbS`+(EFu?HY#?L^go G&L`Y2gYXqqgs+t6yfuXTcOtCUK=_&h!Uf77p!n c!NB=Kbr8yM#7uqakFauNIV~l^Aq)~x|Z-ZE%jLt{(LIoFLDWg=_I^UeXH$4 z`0F~t-;5;uZ4P1mt%moM65cz8@DELdf0UO4s_m!ognt(A;k|_G7Z7gH`mYUye_KKL z_kn~PwcezC);x=FOFzQLcN5mN&+tE*`_~|Ra=D(;R!qdu)7l&>i0FHTh(}L&G#iQd zmJ+ch5D8`x3DpycEF==`M 8eKnCAHWL{leqAey+>}q`W<8hh7B>-{_eMrG5hly<#&u?ihC0or{}$n??hyRo-KZF1Cjey5xIXEkq7n=c~ILADd*u`L>^JS(-#qW zw3NtWgNQsnl*kj=M4s$H oP-9}_>p0Jw8I&rRRCbC{0-dj&(!z3c_=M&i| zt`F3g4;qPV(!7qXBb)aV`DhoBExU<)ypzaQ_3o2nL_YNq**2WWXX qgg%uOCDMbK|YUbyH&A&_b1XO{WjJA z&k`ah3W@xyxRc8J&ldJ!vjn@{a%^J`wxch$jy-H=6SiBwh2h?c?J37Li?F>Tv3+IO z{wdhj0_;FBc2EduF5C}W=byHngB|UN9m~Ux>q(6XjVDK7r}|^37h`8E#Mb+%-F^o4 zsf(~PS7D#F2|H^8_UY@fJ4o-0ZP*>FvClk-eO4iM=atxJFU8jRsC~{M>~piRyUxTu zuNJ%83G5s_m*@h;bzgyf;V$eRZP-2aRLP4guzPL6zT`0Wr3111h~u)O*q0B*?kCPG zj$vQv#LiRfRg> 9Gh#WQ~%_H*KVPCZ^wjQzYkJ+FQ(l!q6TyQn+% zi}Jfz{4a^GVi@-S24OEL#eTUO`;`LhW&5#TEy1poMx}UO)41-Fv0s<3H{94&DeO1Z zqm@DIx4L4lnuz^&1NJ-0T_gW%2Vk!cW9!)7e!myCzJs >bMaQnl~wiT#yo zsMY${J+OCm!Tv@uyXEIw@zjmS{!W^E#QXh9?7eN+`;_~mdbNKO_5tz#q})To&$F-( zH(=Ly#y+B)Usc1=)!4^W$L|%`fAq(0QofE$?3QZmR&lqDz&@ezlhQk>8vk2KlxadU z(RQ xrW6PY^v-W0_lso>om% zuf6E$^44KF(K9v^)jcoKGb@R9(( ;Xj2X-`zwgrZ%<(N*5hlSa3` zM9=R;G$&h-#|!F+UMO!m)`?zJK(wdkFIH|ZEiaitwD%mMmo6sSXDZRl1{3Y8@yojq z?bn^?6&;D@YW+$r^TeU=)uR1#iC(SWOUM_$?um;Q^dWlf2%-bTe_aXDf%19%MxujO z5xt?F=ny?Wb%=c2sGOlWL~kl3I&2cro97bMwWH`QiW{MtM`jVdZ35AvF+^`)NL1I4 zqIc8~9o YJb xsT_i0F$p(Z%xr(tM&7wM3U_pS(Ph z=u*}AN-NP<6<;Y&dW}Y34-;K6g6JD7iB|0=s?WygTLXx$QtsQ^h`u9lYbFqVSG?b${aSOo)WdJo8{MxRt=md;&lIBHZzuXgPon#l6aDcR(F5}MQwGsP zbBO+|+{3Lz>&Fp2qPSm!M30Uk`kUf@??be49?>Qz(LW~ wr_cCH;Ut-=eJzA}qm^Fr2U_G%=HnDIevB+Lx z(c#2mt;7<8h$Z(COV1*fp=EoGpSqRUX;X-0DXzmLVrSG4JF^?HPK$|k?n3Nrah)Ts zF4KseTTARb>2y z5LxUlGqUO6;35KR8JAUN&LeO6C1AO2zk2o zD6!kN5W8J 9{NQ zS1qv?`Dxie?6|m(YuPH@zYRgUZQ?wUAog#N*vWas871r_-Y!?DB5q^}4a6OXi91_} zyXuL1^b0X&4smZGao=d-{#xSJVB!G;ap)W&9u!At3Gr|-@klS?wtmAos=SzD^iMo~ zf_OrF$yVa2I^yY*#82r=yuEl&EhnD2nz-Kk p6y6n=eF?$lZfkjfBXgY{6*FJlIH(cM*L-Q zyfTIOt9is<8%X?h<-D%>6-C6~u!N1otEBy=##d_oE$Oey7WNZ=djoO3FUQx2|J{^O zLwxN}p@sOmImFlZ5Soa;w}SYFS;XHTL42clKj=h!Q-+|q537i8o=N ~&$SP>hlzio*c}l6vIFs*iuo#!cx^86uZ3Om z@s0F$4
G>KR}iNr_} zsZ0{-%_L6ABGF!XnOdGUi$qo ^j<@v&mt0i729tFiClTi+d|?h>Gm%parIOZ`QpB& zibR39b>5x0ZUBja^GRI4n#7=k@q>V)3UJ^IT|Iia8hJ{Jo+>ONW zNhC%L6lzJ_D&Hd$g1q0hkVMf?61OYo4lVE4L1J_%i96d1t4NHI$FcHIoJZm=>5uC{ z;%?>ME$;EnB<>N%g#9G$Rouh|5|d04_v^PWC-*1uz;F^JB_tl4L1M~I5)aAi)J-HF z-bbQTK6E`aF bzX34`7>fe*nnytB~)W4@~5_2m_%*!D0 z>@pJ11xYNJO=9675<2fsyeQ4Z^&~3Pk0m)IUY5=)^7N{>Uh6_)`7RRrJ|a;yn#4-Q zu2Sym77{uKNxV}{VvYKu*HdDxPtf>!>Ag3R#D-Q98%L1P|LsiZGbQoSQW77pCGm+g zKdmECBd!|t>hp3E+b5CuVgiXBT7FqfLf1YMwI+$L^GWR5O=5R8iEpJ}x17WtjekFr z#NLx6_Dv nmb7PvPt?iW@$UHkz}xmWVkoU$TX6+a%1{k!uS}H zN&N~>su#)h5|SCMB-?i)dFo7(nTp90@9E0dv(J(p*OTm&Px7pZBs=dXnLUE!If^-V z0?G4~(@p$2;=AA&$qUz#yl4u^o*L^Vue}xDXBWx7H6;7hk-XAPGVdtKs}z5gIQow# zsq=&6)rU#umy^7vub`ZQ3X<1KZ$K`|>r6qh1E-R_K8NHW{Wim(%_Q~Nk{mpY ;w+N)DQ=P_ z93!dgWXZ|%NIo!wWQl6k_YBD?JxM+!o~dDy4=ev+)mbX7M^wwSX(Xr1TiF7Vk7_wX zwLUhA z)%Lo4lItgtd{6z@u!Q9Ml_WQ=C;5T6H;L=Ry(Bm9B>7Pz$&Y;`w=N|4$zqb#(*JZD z$!(ge$tL-EAClWglhpO!q+YklFK3b5xt8Qtn@QF-ko;O+c4?_|l;rNCB)=8+cR3{Y zl#%>iaeH@@{6QK&x=HR=Uk<2e2TqXGYdCpGx`&!c{;X|1mmsOnw&W3mWJ4#Czh;m; zs+^;WJ0=gm_a)ibo8%v=xv7BUpFK%74 ;wVc#>($qb*shl9G3&xS^K9!VS*Qp+Lq%Jy0 z>SF2i$|H4&_ H;QYhJm0jB)Xl1Ccmb(fq&1?6)X4Uv^m&-l zHS5&vCrRC*{L!lO&T3L)rBl3x)Hq1ptzM2VCUwsWQWL~8u`8+j3Q0{;?qrM90~1J< ztRnTGbfySXeWV`lNvd=hDZM6B)5TFHpO4Pb e{HE}r;?g4Zwoq*dVV;mh4rL#T$y@NH7!<+6*;8-H<;8Ct-q{(yrSBc ztt3^MO-koaspZODq1ZQ8lX|l^sg=t}y|tUvs%BEF<@p`$vo$A3t?fo?-DFbhRqqCI zzCWAP#>1pGDfdIw^N~Sni)#6J4XIB$ld2v->Qixlrtuo}?DHB@Uub;COj0}Dq`p#Z zwW?v4c)wXo>RZ)Vw};do@qMq@A2hzNg4B<7qz;&*4)!PYlYITWoYZ0Ysb56uNIj`v zdyqORAIGHkyZHVXMXE`DntPJ^YX+&~F;cBnq}ps!|4bouVk;?KXG{Hem~^`lq>ZDb zooh+E2a)#7CT-S|_F1I;<4Idhq=O4dhuTO-Mv=DbNyjFTPWVVCSCdW;Bc0Jgy1m9S zyOTa`Bk9wFq&tYCV-e|2`gNr9~uN&zrR*=3@I=ar4?!SX{{u0s!@-#rdZ*<*K($^0r zJ?I4K!HY;24kvwM8|j;-k-izy!)K8mq2;a8xvdB3BGo%;An7~ylD<=QjGapQE{%`d zMtZz_-Lr@Ez2dxY0O?6PNl%u}1B!icH0g)*`-M|?lP=9A{fN9x&mmnVFEhH3eyo}F z Wvc zTdz7kRBazg_hadOl27{6An9%MN!N&Hdm-sB)c-G6kp5~i=~}JtQhj hT}a{Bs8Bztpqi zS)^OnkZx1#3H9k;_4U6pGTP}k4~-@=oJ+`X4 XBqK+> zx^9$lk$yqy;=W{DBK|&|$>>`}#^ut{cgPw2q h=pY%RCX;c8YQM9bjIrIwDBeNFIBDPAOvXK{$+&kK8TYA<`%`30ZY85+ zKN(YmsfsH-@qZMZe|%Q+`^TR$lO#!> -)#`c)!p4eO<5D>$=Xp`<(MW=ib3`e}!xl zmZ^C%;XI(2X_K)$n2)7eG1bcXp}kn9OW(uISZd~Ad87tQ?K~`x%6Eoz&XkT>;?sGI z<#FZwxbWvl_ncNNPfWuyR~nxjie+9m*>)^X&BZc*Dwd}Uuq@~z)7Uf0t*!~nv%+1d z*yju^i!`@rGnVI9VOcD$7o@p Q!B}1{$I_@AUr}vdIe=y9axAZ| z# LEZ_ISvRk$N z!GUE@Uo1anu #Jg7t8N1EQh7{4`H+y zVfj;e98rD$Qtgh4`|oX7j;Rj+tjBU(?Z3+9zg)e|P47cLA%V41AFL-1!J1Qv^`xm- za}Q%Zc^lTw>#&}(1Zx-Bsk^Xt)wUjnw07H$wR>NzXAH&KqY&$vgRu5oiuHdRu=d)4 z^{i!Bb vtPF|cY~%zEx*tbH4>p0@+*`5Nn= z!Fs_|toggK7D&TI Qn0uwJnSYl(CY*4$O2 zu g(JW~>h?muhK#s2S_@Ls)A%VSS_kYwZlIk8a00Q+dvsj`gudtdDC> z=RVdagf({))_Gy9PpLNZ_v#fT((p_b*1C4A3x)YyKdg(Yu|D65^@Sc->lOFn7_3XQ z|6W>!^=0X59EA0i7OcA0VO`c8>ubVWJ_PIQi?OZ{caw5`b1v4mz`9DlZ;Na7Hmqx+ zSl=zf+B^*Fd&>WP@vW=D`hmDwgtcCLA5~&)6-Jwh^^;{-HypvbQ9hq(zkIHJvbh}V z7qhT#*@1OyAyyrGtlRcs-JXY4>j2hog}GDs->EL&E4ST?u UA&m*t%%^)G64y9>CVE1l#G8uyx;utw#~IGnZiNc@SH#d~9dQ zw|6@>i{8d*9g5Ai2%B9o&iU9}hp`!D*gOlddBx?|dw&9T*n%1l55N{_#1`v{%@k(5 z23yjFEv0$=&cl{njxA4qeKdD&E4K4e*!optJAW&-3x;6JUx%%r0NX_s*amFFHZY3q zlDXIlcVg4;>};25?D9%%#T&7ejKFrKwy!G0Hbl5XbFk?-72B{C*h-bdaOF8-FSas2 zw(Co=l{a7;ITqU}>AgvLS4ij09oTN^gRQb2+Zg?)+uJ5%8@n4@mHh8mjqT3P*v4y2 z_xfyii+|!8Z1<=}_lkS+9&A%Icfay@KsA~s?bXWXq50Sz?vAZy2DV3p^=L7+8PY#X zInCDi^ABKKFc@21F1BaKV|z|{>vt8l=MQ0fK^!j{*z`HK zz0{8FW#!hm1KUz G`S;wr#VqZMR_i zW*W8~%4esxcXh}1z1km2u @4!B62Me(MwiuhPdu@k>+pawS zl+Tf4*p8}he;>g1Pbs#4rKMvvb}F%V>Wclu(b#j2V$UtXe)0zFr|7-XUB+SW+7tU} z%dnr`Tdyu!g1tv4>}O8F{y%N^I*z^fRO}Y8TkEmg73 {krHeq}E9!RxUPnU8&_Vy{vETJe-Bml1QYmu0YDzYqHj zld#{YoJKWZ*Y~ph=8f2IDZyUZj(v>g#ty`OyZU#C <$6~)HfnCpz*e7qn zK4lU1seQ3OAnXTKzlUVgJFwTx!d@H1{^&OBGc~8{P5a~8o}>Kc3S*w$4E@wf>`za` z{)`Lzvt6+-Y{9-ryt+SUf1wTgi?gx6RF1u2H}=LU*q08%zN}d9sZ-rwUyJ>XBJ54a zu&>;MeN{d7)vK_t8I8TU3- y?W8b ;L>+=HXn792Wna9C#HuvOr2=>4tE1|05{I6UPzd=qg5QaD0E9Fbfc zdQQS&3Nx__M`|IC%wQaOCXPPh>YIZ@=K+rMg|B VC43kf(xQ8FbQKo*m=0>`3jLOGRQG{c(fum9yZas`c*M1Hi z!yV)L;TSLe37VfcAIGFcI3};fF{K&D)V( M>zZAy;)#KUGIG$_6u~<6l=i*qh9>>e#c}3%|Zo;u#{wpTqXgYx7ty&zb zRF}7fzq%a9JF3aMi*e{VV@I?4?`^=bwh71kD{!n6)(7Kov?$jP3vlTEl;fkZI9gSY zk85zW3F{MS*su}Dr~7bx))mJl6UXNhaco|VLu+`BFI_mcR^s?-299moZ`;S?*wG2c zw*zqOoQGpqPaNM1e|J5OJ-Il36!u xScyun*_p_(Pn3 zW^f!Ci{q~YIQ}lgaZL3&Zo%>IY#bdsaZ-e{Q!kt+&c%6B7-#MxoSn6ON(0VQOK^7G zj MDdGggl?t~R* Y&=ZoWl!8k8; z;4IMGfMYl>QQReqaTd sd8iaGmE}TQ>;~dsc zwjAfR^3$_$&f&rvejMj@IXLy1be8SGS#ILIp%UjvVcsa7n@Vw3G~pcG73VGUaNb&h z^EP3R6<*aEoa2Ojr~JoP `CZ=ExQJ+lMnW70l*HO@K8^@%MwpX`HEYue8F%Wy6j zfb*FRIG +mhdgH8@o+YYTgS0k^{}pL{WfRV&M{zD2hjTfyD%n1quTRFg zVxUYhZ%Aj8{NL;)la7@;alR# N<*O%h_NNsBo&W~+4+Y&fGQC=IQ|I@JSIL?jxaelTI=O$_X zyaeZF<@iMxSv$@z)o#tj`IU5k)rxbQ_RH7e+CCNMHw8F%NbinaIKSP4bEo#xcl9`T zwc-4JFV5XNaQ+~SJ<5HrYX4Ih=e{V;pNHVwKLY13s@nl+`E@YPgX;fQiSv+Z^t;-_ z6*&LMlPSKv1?Q0rPCYN-JgR*D*8Vy+0jHjmb{<#%-&&j<({cV+g^Pi>PN>G!X(X-_ z%W&n?;5w-hS8f}wllS2|#fz&;Z(OHFadoZ0b=m@4-B#l|eLJr1>u{a11((+MTs?De z{jV3UUj1;Lm4~Z$Ij*yXVRhlM72vW@#pO_(b2Bb?5SJlt&k9`L-RRZTxB}C01)Fh& zJK>6q#ucr_6>Gs|3Of QD^HrwsmIkv@p|sfrE>;XzX`a`Z`5lP z58}#~h6_jGDiFs-hjCrp4cEXTT$c!^a1*W~@myAeYmnxO`{KG{3a*mHxULl5Rl*)3 z-mBYjT_f&cmAFb%xQ5TeHR1@aGHqYqi0cLiu90=Pw7%`SX)LY^)narpu3P5ds@#cd zjB0zEa=zV*tEw5-xX!rlEW mJQbnvCmS#oi|!Q)+SP+`{!h8?FcC zTfGt2^Z~dYUV}@=3|H+oTr=k4nia xV}*xcC5v *uMs^jUZPD*xZq{$7sjj|I5?oQ~@+ z;r^}mpZU17F6gENcc+QCb82ztZo++Xp=>wq&MR^2c;N1`2=}RtxVtXKecE!|-FD&b zJ`ndAmAHG%!+mBG?w)IL|8FPmv&wPz)|jOLw{-$;+Y;Q45xAWPaJy&W_SEC{dS$}! z?bT~K#TSr 8}*_t
u}%RfV*lj?mMR99ybN|ox;++SNHhCxbHfKdxGkCx3DH|z i8<9mHKLt&cY2o+0j; zOK{Jci~BKc&(`+i+i}m4&l76rw&H$r4eoiXaX+R0{5`mz-i!O0T$wc19l*U1nRGsP z2>0_{^jcPj>?rORI&jw?$E~$?_e*_nH}u8*@=)B3Dcr9ZxR*w8zp6R?UAbRVf4Lv` z>)mj#aN&NVKklYt+;6HLD}%V-D!{!;dA}{})g`#!5zd-HxZjmua{~8!197jl;C^2` z>*V`EKJJ#mxIZk%y lSY{dPga{NmAw#oPFVYs(X$E|xvZmmnYcS_H9;@YM0@5kfbt@t0rv1c6aA1iU| zn!x?jO5FRJasRvx_kPvtm%X?Ts7}8g!~L6q`;h#9m!8AQ=@0eWrS(r~J2C?IUlVa3 zt;79y74BoBasQ*7k5}XVSJtr#_kY_kID&D)7K~17Fiu>Ek)!scJs7zf?_7j&%4&=* z%^0V)W1MDSbd#NKVsy7*oDsy(I*W1UcnsZ#HU765qt`x+vvy)=t;Mh))3)^xhFx*? z4h&~E3|C(acPWN33&XPr!#fYdrx^bhjDR$SdSiqOF(S1X(M=e!RTyRqM*Jv-p0O}e z!bs;~WQJm7D>3p`Vw}@}(MSB}ZpS#!i_uTmI!+lE6kz06V_Yb#0^wYA07Ji*Fb1YD zF6oa^ScY-wT#TaS7<%5qxV#@m@feINq^o2D#$ai=DuXdZTvtoe&?<~;RFh$QF-n!k z@WmJ-6jv6+xPA~u`B;n_7GR95$GB1Pqm);LYIU=8j-G&VOC3h#af~tYzij} ~|!W3hN%Sb|Z11Y=2mjF%Q-G#tWcRR5LP7_Wk{Y%0cU z8ehH~V?`9>jS`F|alWbjv+^LuDi_AvLoim)!FWeF? +A1S_7b^CY|#wVRHHjKvjv;|{h2gWAhe_o2Azd7TJH5gxdF?7vjeAR&Qbq>b% zu^8Vh$N1KPu~RtTRblK>{P!y{cJIU3V`BWM*uAY7`?_KLtUUHl!}vw~2gG+UjPaYc z52@ydyI}lLj?umg +ziK!qdGL&lw$f&aA}Kvl)+`Y4Ds?jHmZ}JZCG` zIslJt4j%hfJdWddTm~LpuX~KWc)a59&Bf#2i6>ZwCv+4~Bp**yW3k wV9ybMV}z{@5Zsw=cj`)r#kiLwN4Y;2E!)-Bpk0 z?p}B%&cJhzYI$#&UfsPF&lJ_<{z5!cHU7YAJkt*1sV>K(zX^}l13Wd-R;yY+It$MX z@y{B7=P_xY-HvBY9-b#!@H{Epd1LTAC0$Q~wi}*>)A2la7|-*4@GNe` zQ?Fd~te)p32c8D$Y}EKG%kjKA8qc!bc$P=;yk3Xr4dFDYj&Eweyd|tvYFBIf9r3;E z#nU_&&wIjszXH#?6?j^d`-da&te4)_et15fkEd-jo()6re7XhCXDK|J#Q*tmJYOj0 zOKIM!ee#w3zplo!U06Ft;rVtQp6@Jpc1^|e{XRTD48*f%4xYU|@#xt+&(FQ_>>q~b z7uE3BDm(`je<*|J_sMwvP+Yrm`cu4r^}%ygdH$_^@J}J0 B#UY(11@1KPC z0p&1FwXC+_eMn;u55!xeylZ>neRK_8J@4k7CH~pPcpn$<6XKXV9q*Gn@jj(o=S%N` z61-Xq@IEWt=X&E^G#l??>3U%r-WM}?m$c(;n1Q#^f%lcocwe1|_qA%gulK{dVmIC< zajfi*_bussdl}w$rs91!h__k1Yn8`3)v=`;-VdecqXb^vNAkAGN1sveMlasa7U2E7 z9Pby>yk#5St;%(qxV~=1`^_-C-{#=msoL$5@Ar!Rp%U+pHoSXx;oUbL?|yL~=!Eyz zb$EXh&Y^>N56h?Bg7?olynhwqJ$eZ5u@=0?r{V30;{9(Gz7s~^>$D4B&NO_vW%xRS z@02 7!#?Q&%)47PRZ!NxlVSN4l z_%1k%@4_wkE*gvP;sm~doA4Eiqez&8#DDo#d{->TcV#oatAug2v|OX{VZtvRg>U#F zeAms!cfAW=x%7`5i0?+_d6ROuSv $xfkD4 z((`l=d<$mbtE