From 44ccc0b8350c6c3a0495e9e1de4044b36bd1b989 Mon Sep 17 00:00:00 2001 From: Bill Date: Fri, 2 Sep 2022 07:01:51 +0800 Subject: [PATCH] regression: nested aggregation support --- Makefile | 2 + README.md | 2 + docs/arch-hybrid.ai | 1582 ++++++++++++++++++++ docs/arch-hybrid.svg | 3102 ++++++++++++++++++++++++++++++++++++++++ engine/types.py | 1 + prompt.py | 24 +- reconstruct/ast.py | 44 +- reconstruct/expr.py | 18 +- reconstruct/storage.py | 20 +- sdk/aquery.h | 79 +- server/libaquery.h | 5 +- server/server.cpp | 1 + tests/modules.a | 7 +- tests/stock.a | 10 +- 14 files changed, 4843 insertions(+), 54 deletions(-) create mode 100644 docs/arch-hybrid.ai create mode 100644 docs/arch-hybrid.svg diff --git a/Makefile b/Makefile index d8af5bd..cbba0a9 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,8 @@ info: $(info $(Threading)) $(info "test") $(info $(CXX)) +libaquery.a: + $(CXX) -c server/server.cpp server/io.cpp server/table.cpp $(OS_SUPPORT) $(Threading) $(OPTFLAGS) $(CXXFLAGS) -o server.bin server.bin: $(CXX) server/server.cpp server/io.cpp server/table.cpp $(OS_SUPPORT) $(Threading) $(OPTFLAGS) $(CXXFLAGS) -o server.bin server.so: diff --git a/README.md b/README.md index 1497a06..504c820 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ AQuery++ Database is a cross-platform, In-Memory Column-Store Database that incorporates compiled query execution. ## Architecture +![Architecture](./docs/arch-hybrid.svg) + ### AQuery Compiler - The query is first processed by the AQuery Compiler which is composed of a frontend that parses the query into AST and a backend that generates target code that delivers the query. - Front end of AQuery++ Compiler is built on top of [mo-sql-parsing](https://github.com/klahnakoski/mo-sql-parsing) with modifications to handle AQuery dialect and extension. diff --git a/docs/arch-hybrid.ai b/docs/arch-hybrid.ai new file mode 100644 index 0000000..1f03d57 --- /dev/null +++ b/docs/arch-hybrid.ai @@ -0,0 +1,1582 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[23 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + arch-hybrid + + + Adobe Illustrator 25.2 (Macintosh) + 2022-08-30T18:45+08:00 + 2022-08-30T18:45+08:00 + 2022-08-30T18:45+08:00 + + + + 256 + 216 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA2AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq8 M1f8yPMFp581vU7F7yfTBFqGiaXZPDcGwN9Y2ouIZUk4/V2lluop4OKtzoBtTFKP1LXr3yxYaNrO iazca1daho2o6hfw3txLdwTfVNPe6juhCXpAv1lUjKw8Fo9OoxVMNX/NzUbXVm02GKEGddIS0uEt rm+McmowXdzMz29q3qzAJaKI0TiatUmnRVRT8yPzFvBObTTLS1n07RRq15p95bXaXE8kd5dWzpCr yQtEsyWgkj9RCw5Cta7KpjH+bbNoA136pLJY6hqsFtopgsb2cPp7XsNnJLLJCkqCVi0rRJsW+ABW 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 VdirsVdirsVdirsVdirsVdir/9k= + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:581a8abc-09e7-4589-a788-697af4fdf435 + uuid:90ce3b0b-fd66-6549-b055-b8d510004a93 + + uuid:71d3b25e-453d-1249-aa45-a002d99380b3 + xmp.did:f1cee0fc-fdf1-44c6-b699-76b3dca1e609 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:581a8abc-09e7-4589-a788-697af4fdf435 + 2022-08-30T18:43:32+08:00 + Adobe Illustrator 25.2 (Macintosh) + / + + + + Web + Document + AIRobin + 1 + False + False + + 900.000000 + 900.000000 + Pixels + + + + + MyriadPro-Regular + Myriad Pro + Regular + Open Type + Version 2.106;PS 2.000;hotconv 1.0.70;makeotf.lib2.5.58329 + False + MyriadPro-Regular.otf + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 0 + 0 + 0 + + + RGB Red + RGB + PROCESS + 255 + 0 + 0 + + + RGB Yellow + RGB + PROCESS + 255 + 255 + 0 + + + RGB Green + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blue + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Grays + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Web Color Group + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + Adobe PDF library 15.00 + 21.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 5 0 obj <>/Resources<>/ExtGState<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 28 0 R/TrimBox[0.0 0.0 900.0 900.0]/Type/Page>> endobj 25 0 obj <>stream +HWrGWn־EJ[C8| 1B<ɬjEf.XoF\p#Q]J1 +tU +*u~uBzo+CkХ#cɷjz\]8%_2VqGLk]6Jp΋u[觺b_~UR4b<ÒjhS+)F5ebZl6o~޺MhWQ}דj*Jxx/"Hr|v6{R|*mj'F , /^=-'w=bnVLV3!vuHgx^14aߧ֍2͖`mĦN{(;ml+qvX?tŝzka$LYʻ6V!hZE"WBӯh1ɶuC=Tl.0Lq*ոC&vNjiqc2-r]l $Fg?{l®dvшʑrخݎ[ΉR|hrTQQ]vDznEYwcJGl2{X(k^m^>.vEwnvA6ue7{P`;v&s(P:lq +^#uS$SjD#IA,HŇIJ4 Z0"&fbV,OZ9 J>ۺ1.K,a||?n^$.|GY֢i bNC"'lzM@9햹., __ĪeV˴ROK! AV}C~`[lӮHz78σ +Aڇ!SjboF t&Q%Md_5QO11`x3PN!o hCNzJ +ɔ1a)?*Wxjdo WAVH+(`Z z "lJ5*/i,pɴI`>B0EbgD3Ka,^c +  @ E`{)C0Uf'!UCO"HjrB;bz=ԑLf$UBVH +._AXUY6da 5D~ck4>ai(k%)l|<%3=MWA4kUqӝ8DYAb4G5޹cԕ3Pp0qHeRCO=;lb7 !ykQM{u`Td@(IcYv?l"&R9)&J1EP#<4F#n8Fdбe=#rpށLzxJ G(8,1Q- 0V@ hԅIa9$ P40d&1TaWI&fvՅO\--rN!{2$4hC/hH/wk;̲eC#8C/,JVQІ7=LjuK rGT,UTr1g]C{Z=} {]Fʀa(P1.&ݲlm.P rV_tY&1a g'e7T[TBE1{uKĻxw_;'ǻ2HS&|[yiH3{ĩe sTrW9lsOe:sIC2DM!WSðlX KVRW1֔]F$)4R~SɕYHAs,Wc≆MR`$[<7A*1j"\|Q{H b N &V%$Ƴ睻M:qO}\ej]@ +7udmjOjl E!Θ}?_}fKx*2ּPɼ?g4Z 2i{3mֽ"#l"Rge !ՍG GO/^ԗ5m2.;,O +Gܛdk_ĪR,1Bl50rH*#@# :L@q]K}sn 5\~gEmBP5C۽w٬+"U&Ds)N ۜTPNec6), Mfvપ?c͛6BtuKq"R̡R.wrB"K~ +DOa3@ZyFWL˛ GzEPއq'L565 3%)3 9G (SSA7x2 Z<[x02F4{C>/㏿vZiS1uC=1;d?J[njFb{tQMucBn8}d]ý-Wm-ߍg=`+EZ͛4M@T 7BMt?wmq`)<3u``ŮC7i~ITm,=F:ҋ)٥b[NyikC˕݋KFj4(<3e"}- * O{!n +~6f'P[i"0Yˍ&m2(q]8S.u7UW#,Ϙ3*J}y= 걙|zG!F endstream endobj 28 0 obj <>stream +8;Z\7=dIhc%-0,Ae,@V0FY^$&<$`\=*@m6On_>/TD.X.`/us%h_GQ+`RfL7 +p-Y&&o4q_1g6oM&_V7;;bUYtcLp[H^d(aD'oBs$XnB:%FjHhR3MH]3ceFa]SUi&YU +"(T=lV0DsK"@Qb:Y/dp=5_Dr5^3s6p+K41h1(Apm=C`e4OaZ#;;_`M.#^jK4`KXd+W:UAP)S8.F" +BI':p`&+lGL?OMikNe8"R($/q4Z0&.rA.J;%#1nu'52Tn>*W(N$UV:1XLt(n[`QV7 +9$Gm=7TNm@Fm**hNiu[N":*3,KV9!:HXQeRN4KCJ!CVhcEdLe@tcFH*NeOUDU_hJZDAh2QCP"03,FTp)0#If/jRnOE=U2iUM!b"RVdsDk-#^0UW[&pq:71*U/rAX)MZpRA8&^, +N-1Sr#fs2Eb#fC*7P(G@eM@dDU/&;^P\W>kqoVm^aCCfa7_UsCmScTUA/2T;GTQN6 +N8P/e_?l1@=qiOV'f:9:-8"<0B/$;TjK'T8=>SOF?I8j6.N=2L\micQ]QC@"%ATZ2 +oIRt1YYKUs&^GfqOk.;,d;>-3jOpQ.'pO_A@g$7H9p`5*Pcj':W5jmDZrn*-&cT+f +A5pn64Lj^7rktDl?Ho)U+E/-U:0Y>$K8D.APEma_A+nZP`2U3&>o/,:+D[ +129B>4"pM\`o\uC4_IT'P]nfR0VPB]d>[7C.mHte#Ou:]:(jr_K7]4uk%.$4<#'_# +NbmdkL%BX.3G"gP4L[NW!.#l2+o~> endstream endobj 29 0 obj [/Indexed/DeviceRGB 255 30 0 R] endobj 30 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 23 0 obj <> endobj 31 0 obj [/View/Design] endobj 32 0 obj <>>> endobj 22 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <>stream +H|TyTgfA]ivQ|<aTDGfdF9g`4 +c1bpAk5"p5( (hĨk6o}o}{WUᘩ ͧ+|Ij@m`Ux|B;d8gmͰ{\-SZ` p/6kVD8Ӓ%eB9Ȝ-Z4!]d*YH.N +Dkq*3"B6B'Ӫt*~L4qjV>^R +*R!AJ4Q2>l]f\ :"J=Q%,:>*NQzMQeJ6 ᘅ)fK`b 19c ?Sl `g\?ƳL05&MLFHPk:4ɴMLXNt"A&)$mfadfa|_&54?cY[x0!@-,!TH=H]yq.Q,+܎[{R;tw, B˥ӫ.7K^مlM+frE]yVVHR@:>ώQ|#Quh#ֳs 6d'$= IٚT&EM[i[ޤ=(ʬ`]x89Y+"U낯$dz+U_uU giafv#=d['# 3B D JWe|"wwAKKutOC459nRzʴ4ޢ#veE[!Ǵ6\G#XT3 vx6*LFIYi"Ɍn c)RX#IuȂxs\~NZ|ԘSV'ga1Qtw"HgL$Ֆ3A\ϯ +?-Awh˫kp_Coy-"y{$ xm߿~ {xaG\26 S{4?M#r ?,.c2)@Zd3 + W`-(f[z.MHWXTs58L0a$nv-MI-ݞ}-ހ\Qr{M +Qg>Β 7)ȥ1ebo{jXT(~o%Z\QOETs6/*nOKRƗλ51w}7@LpAUߡAكC;ذFگۮ{-Pv $~zò㉡e8̟~0 20*Ne+.~hPOrU} %vV$59ga4O~:IQc'`]]sgqhk픉w;|,b8$HVr iI}Poi)QרnjBw8ӗ/DPʝ[78p..n΅ĔE>Dj 0vC8-H:]n2:uڛ'o]|^IㇲQ 'AP^[vVcZY-$Ŀu'[u:M!5j>|-:a/h1(4XrgrO1YǏ+S3g*wK+ [J[=-`H]T2ӵzzh!j}fx%ܟk4LQUK7xqWőSn1q׸Y=ʱQ&RW endstream endobj 27 0 obj <> endobj 26 0 obj [/ICCBased 36 0 R] endobj 36 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 7 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 25.2.0 %%For: (BillSun) () %%Title: (arch-hybrid.ai) %%CreationDate: 8/30/22 6:44 PM %%Canvassize: 16383 %%BoundingBox: 4 -889 1043 -17 %%HiResBoundingBox: 4.50000013697172 -888.7998046875 1042.66151770845 -17.05810546875 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 220 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -900 900 0 %AI3_TemplateBox: 450.5 -450.5 450.5 -450.5 %AI3_TileBox: 144 -846 756 -54 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -315.529764129877 34.4668014889203 0.704648793526002 1428 778 18 0 0 8 31 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:50 -750 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream +%AI24_ZStandard_Data(/X&E ,%Y%jKi)-X9<6 0&$9`pTphHD.]uO1#RDb L !Rs`$q4 ;#] ZQ ŏEcq0/ +@_J{-Bü0ijNMFs~wLTˑUU'f8FUc8d_88yWaa1"} vݚreMwԱ95bH(K"oll25i2#8΁ .0Dҏ9}vm Bz~:`95]3NqyI789 %*@:2ch3XRN"!Kʱ8z,q(X<uP౰($`CteLw>\K::d,Q+;ztd8(``X8Qv'?S:y,`42k5 "1Cx" +R 71t,$#[Hda-|0p"4װ-,qh;:=X`,ďơH]G`,O<ϊf E2 9u_>&(Q K\ LdDBX$Fb!q +R"P( +XP̢ Z/Ecbf H `0 cmPָ ,tn XP,, YLŁ '2*;c>`C>~؂YP,ǔʮq1P Fc1=hΘ _8P,8 łbAXH,|!p p @ ]Xh4h(o l`֠F cP0H281a,,BH,r \ut1ECP, @)LQ*Fh$EBP$'2KXMLb/A/d#D>1dxLD4 +'p}6p[a [XvfVVkW˪%L ei"TTS Ƃ8|"YQ8DѮeJ 0cQIsNp(D:L&] -0hE EO<\zVicai cYbssu + u IAA  R xPpp 4\  .b@HD|C0@AB(<804 AB0C84(0` 4(x@B4DtD 4p0A@ (@ (H4  *@|BD :CD $t4p@"B!0A8@44  $ 0\0 8H@ (@X AC<@A,` H„ +"h ƒ @h`A D@TC *<8X0 L`0 h@4A "(4&A   : >pCD Ph B<@8Px0A  &4ACCD ""D`PQB G%h * ! (AA& A"*G  p +H0`pL1"H "(L A CCĂL)4tB޸~RщeTuwƼF¶MYE4eHoTIQ({[&D+ig{}^JTkH»:ڟEWʣVu\_aʰs1tmwD#ϼK>Z鋆He{Ն_Y)?hy)[ +%I=6:$)Azfv5K=(jݲV6)缨&Y_LDOSc/Ž:[:T;ֹ{D7}.kr"h8ItW +XuɶWr۸vڧJ7 I!وnuSuGCv/2X6gwYډ>T-Umv+ݍan"&> yʞxU}|xGr^˵eE5i=[|9JSDdE̿X4dYզD h4]QNdZ]"L_ޤ1,Vew˙*]'y}]Y.r)_KR42:]X6{_U(*;!MQR#$B:|wgѕShhr距]*YI#G,HSYjEa_,#z=Wb+O.4TZ% +9o*IߠݪQ|<(RelTlڕz)"M wޞdVi6~U]k5)d'{sbDW++ ~YBߩSXrh4rɅ%yoArFL<òMF~TPZk5iilYo-rUy/HHpjs&hwT=9el[թ%px@n +t)"$BruXSĞ\*GEIL3-*NRʪE^/,λtJC#lb)}$ɻ;SR^Z1,Z𰪤Ƭd2"b&}YEGn,J3tcVD+YWU_^B+cD\JÒkNV.2%U׌v,"+F|}dqZJre!:_ꈠY^)I{-'Q/ʕok&BLU?+rE,Jd1IogQA#4tUue) iZgMŌ:Tw)!{W&*r`1=u3bX*HhLӕ$s*Dlq›)'22b."ZDFf,ERIs.tHrIH[ȥDY%/x- G/_*yJ?ה0@|71%a^Ru R08 +1 8 +h@Q1ABDǃGaq Ȕ 9R/?wŢvi5x|5Rf9N YeoЬtcM]Ze*C\}Cl֦JXPia~+ܐiSȒcT#:YQ"ݐkYݓT}Yяݕ!4lY^gg\:N2B4ጽ ]lN*XCߔa6}թX_w[ ѫY'4+I!zNNVM'snj& + 厇.Ivg%N:1}R!aY"5vb\V<֧Tdʲ  ;͏+F-ƬHqA%MAv:4\[YY`\jo&eccI{1éY):sleϯlaYJ^HRuS=BV1YHN]u!’-+^cF[NfT*ω$Qɖ)rI*bT-SYrUlUIjA##"L~9*,RA# ~X1B &+5bߪz%ht2Z/m4I4ZZI2\+IN~K-fb幉xŌإ!9U$@,(x$8PA ș&48\p`"b (` $ƒ늓.̂[l1KәDBylte]_;; uX)<*S/b*? "d\ +[hnMAן2<]:4l`L;|hVEW*б|fQӮ,x*O*rtxP+XX(KNkT)xg2St9e%mRג6/fXή#sRV,u,T6R9řyixuKѫ[غcʕNo%,gfz^!K;=]Wzサ2B1f%ޱŔu{܃u):&L{yb.HD":O-IKkR^%=U2z];^tOZr[4:bE[KzDY_n5SwtᕞTVl4c +Z-Hs3j1*LCȮ$IS^[VXfN+JeV4dn[2ExzieW˪i[DJq-V?S~ؚQ| 6J+M˼zwsٱ:]SOZ:21?,۳ +J=R>>fMu|fVܽ5d*6*-`lwUL3׊YTj+TΑ!gvjVypv,΍rCj9"#S%HE2_2D#,9W{RZi*fNFV4坽}ZjbTNcY:dfYzb&$56_Ė9߇SjKU1Q>G},3є9̿-GF4tzm ΎT\ʳ~UÚ$32K)9um0Xm9gK#Y&h|AÎ.Fcuf{7E)yvHS8W̲+Ty|G;t&?eR"ZhZSf'9oEgY[SzzЧWf3Y?I>&>e!E͚ŻHvsT:ੜ5K3T'If5ݼSk^M *_|y"iC;z#C*ݙ#]c۫^Oգ,Z%|\u!gUsE:7\te,Ktl!13CxJySD7y6zf_4zz;MULu~.~pdGgSsb̖A5E9Z +/Xz)3UIg6aPb\WI0OB#>)}ҘݠUc߿L:B5EgMӋ&""!`)KS6⫓wmkYsʂlӔ~T*lբWɴlU6+sH>YAkm6r^^uF%<9%#^)[uUL׋}tKս+;z?[ 2 1֠9d/σǼф&o.nYnNY,Dʰ&Yy7UlΕXb",K0k\ v& uƈZ]xS%w-"eHVkWay\{Rq٪gWո<5rdX<6%2lWUPy5J,yӱiFE't5t.vv$]\ƶb{O\p~3BtWS]<=êҝmF +*~DL0'Lkh9ʬlcGDI}e!L(@H +$&ЀPPZK 7=ʩ8/-486 ލ"*NR7"rٹ\vRDYs3+; fGL{cQMxWYYnDϲM/1͇+Y$<ʗNJ${,SƊͧjdSW,(_Ө,,[Ib,9*͹WD 3ӑ ^%ٌSyBF&rLZjR>W%PlZ&}LDfcSY,t-먼r謔hUc'{ 8V5v.iVúbEt.sn]1ԑ,fj;D575ʐ]Leu +{+"In"-+%R4VIYKQiQoZZ$-IlgvSJ>W4h-bk3/|J|"WP^Y!"w{;*sCu%bMv ~9c9u!bmp`8{}1b*/E2æ038-i3OM8muWngj&rf]U2Rc:- thґbG3+/,iYI4B%QkiX۴!YY62o$XtLȊXeEy͋2*bv/cYr +e+1.[Z-^+rRU~֕ڸ3a{rR)%er6E.n-^ 6g8CDwV:WɊfJUe)'e"iXUeb֪~WuWBfU#Nsτ: ]a*+!>ɖ-5?xXIJB[sjiR+5sW D90 +-+J\6H +"!̵<>TQqyi7.%5آovx΁cieeuÀB.P[?,RsX:Z: /3"A@JNHvPZ1. 6{5,7kaʧ[DiHo/Fz4xdJ:uPCf@ғ +`j*᳅b*|]Z@NV|2NPz:&`h}_%#k@R2LFr=/-ȭ|e9eYIN<.4X'! 4*v0jiyp@Co撛Ȓ ?-FP6Xbw 8OC~~$[ +0~ocy dV{[>t)0e>|cB\=jf+XF8X'K8' aI_' @J9ca.yīB5˃#LᲳi + Y7jY1yhK}^>$ iL`QW:޴Q4t@F$آw')v;XQ]t Ġ:($d= +75T$2[ti8X@PD(6_L?u5wz(D:Řv<aCvB17Ѣ{DxusGpr|GЕ72fTT${x5Q4F|GgEʈmT2Z;+RƠB&_@VbڥRwO Om9ݪivKW45pNCtR2sxKD=WG#.Bkގ Z{ub)[4/HsKT}L +9W,*hRee6*)]v()gn]ͣQ~*a+7]hc]wPŰzyƭCI%/~U`c* ےԙ!#4f/B!zqM]y DaMGv <We?P~%JRM)T_($h 0m@q HĹ_RG@*8D:eXe\R 'tc6Uaz+g2+ $@=B#0JWOBqҔ1E_B|䉰F]bH;{# -I1Tq֑Vk=,G+6rx->02kJ>gRĕ1x]F8Tp$#SR'[6;.ʁ2MS|H`œ+6Ű3}dU]wIT1 2NbUEYR3o @r`Sýs.BK{B.Ј|5Gr#+:+@0Rzn& -%j4 <* AѿzH O7 #@ !7NdzY& V0rƐ7YA& vӰXq z#񨁖B:0$XxΨn)0'oYNacс[K> utIO};q aQgzJ=:uUc EiP 8vwfgnІ+Yc7 Mlj ̓U?3Rh ?P ur+d xٵQ*v*ƒ24poe46n0KmK:Uo!hF!զ{Z&y]1dPbJ˕N'1vy e! a aƊPHl +v'mwz)^nkE1N$;U\|z0@jּY#Й,: AƅNmOfaP4k$'ԉTO) 5c{ ޤb#/ kyc ( F.=cү}v;K1í~bZcz[Mza/uyD?Cnq?Ss%Tc+͖۬ *QӨ 偰̪s-P( g}s[GyY\⢱vu5:j*6݌0X׆b!)HZ !`\6B +F-hCxؗYɝ]LLq(⩑R._côf4^Ig]2mD$&>;)X5=P 4\|DmI}5dݩ1z4ސ 'Ivh-bY-.ʋvWjcr:HQAͬW` +lϑt鸐N%N$|qFG/l!KBʶ\-!DD_:5lp%0 `RX$?6-2ꆅ@iڟ .lqh]] ^S.Yw})9i3.9O4b1T LF1ǟQ `>^_D\ ^(K%u@^c=rr9" qI xRW+ՇC霼M ;Kcr +#)ld|>VP,# ۰ǩ6.9Q4@R}O!jV 7ݴ"%2@od SsL:hh#hi!8?tT$l3\{${ǙJEc?q=g\F2⇉X4Ro*jAٸLmrVtBH٧Ϧcxɧ lWKt 0wilw722K#с=ЯFx㒃?(Z,rr:f !Ӡ\ØL;CkCP 2Z4s )aǔS +}rAq(:7Yf3lʷxC_ + 7do$7fRLA0=:ӻU}lg@T&{ӎG53E<^@JaJEusi<@k҉,刹5NHgtf4p2֐-9z,._,L4UmP(G=%.OʧT_3igL5s$jچ,fǤᚗ`|s(k{e*$7?Y~(7F-X}Ѕf&OZZ:1?Lj+C"6bߞ*f +)*v5"͎QO@voc#-r!15i dFpRlC'.={sinʇ{UeA۩3rÎ*hѓpw;cV@d+F +DQ=fPoE:,3`A +Y])kn+u:WsK 0YqEVB}@h:&f=.h5H_4O#۳l%sbcvne-53^X2i :u +BtH6s2'Kܯ􀐥kѾ]}, >w$a(BQ]D +y΃wNaIwVLQ#m[O?N7N-x9ZZ6T,\*rnbZ +?L~h +HǶZi w:z_Cb0ޓWD94?EtcߏOPZ*k Ծ L{#`yFhv$?x> x4f@GZZfp#"dno#Ĉ `%d(7Z%Z*cjf6u  U@4ڊT,`= yJT,=8Fq%dN3\-Tn)d˂JeQ؆O}ZahJ!D!ZPQvG,r"1&,~!NrJ~j/j4He +Aڊm[q6StjV0wnOƂ\r] +cHj:聼h1ǿAn tIDzx;5˳h/Z)ʆDNɨaZ +fՃ).,HYbBU!Jr)Biˆ- +j@ܤ4YAiSS^CrZjx~NHAFGcqڂғ5YbkB@Ѷ.&t|Q }-H"JgYڗ1xJrB64\_|^XJ$SHhڜVKЯ,]ㅟ=s ] FG(IKW4vyml[æԸtG'}jX< +cE`R{`mkmͯޭp8Q"$`%se XP+hl@4(-L \k }vA4wtA꣍}xU rXJQ.{5E#F)գ|h91NV'i-OװMϼC"/!Ђʹ{$:ŁD(D@dĉ  ].aum)A6rWo N3ل\#qNy 5?GB>4y]lA $"Ҽ05>ROeGC/nrIde=_ qP{OF.3?-FMӪBK*ZEiFi*fgPOWET"+]\"/F2Ur:JB-ae&eQTͭLb>l;(7?7WDd4oΟm3@,ڙ2)kOW:][]aBhVzʐE8@/D!6(<եr}GL/<^ ED(C +kcUS-|o)AwNj&(bľ4y5r1J_# -F/ K (WP[&1Nuqޛ5Y`Hw/bb!'[@/ J'ų|1(2\`3 +I4가DT^+!YO⋃*;gvy*XN>A }[XoVtTujC//$@Ļ!I ]A-i3 _8Xk ;%):{IXh:&q~*+BD68l2 :DæmovEA0g.!-smAUyɒO| X8NrBS9ONK"ԋ;ˊj o-~rx-cNCiS'N-ZB/;I' N]GiDoXsMπN쪅$&j ~ķ zt/idF{H[ d#44V؛g*R$8_=6WN+I$ONk9`l͛':dfxzv Wd +C@v[? +Ar,Bˌ{>6t6>a=)0s *Aoʃ!S.Ej*5rƁ*-|f࿙D>`e}4seAxUӇ;b+)+le(DFS|*Cs% +)5*̀W$6-D2\ ye'GX;?@^-8@vM(BoOhhwLݺV`$ӬtFEgκkV4HJ "[p,5m l:dтNCT≅z]owmW=x*]G`$+2_Xb(O.jқE6m?v2P L"l,mƑ_@&--j]%ji$L xb_򶝟G~yb8n+D$/i;<pZmv%1+Nd?oV U]]Z9RC^zGC6 7} &TLiscXP6^i1 AWšlbz'>@u6x$!Ȳ#e`؀Bmd zdk>]ǑpUNg‹>Y} &w&Kj6 qq'9fksfU֩1]2y,Dnс]F)NJS{9d m$N̻&' fi5@3VP>!m-VFY$q]& +r! 7ϪNP;{v'=VGPB]{25pRk̐߼4{DKqs6KN +9$V~g&1LPA |bMM'J(rC!*!w.\+!㤳 {4_Pc؇1c+41o9nuMT&CJ5<9  3X Nb,Sʪspdzpމ|.e|ӱv)J PTG~F+nNtmrO1ZBaʹ} 9qe|'e+-('[=\Ek+P91UgfWayg{s^C{p0¡pM@'V) + <<, uA0q3B6AH5̺sWYt,YVRhKEZ#Dj0fk{Qdv xMڸl!-u;x>ͤ +iLDt "ekb) cS%'ˆjb\$5ABi'Q܋!%ӗ^7Xm;,ϯ"Ud,^亟Db76"Gz;L 97qFxҕ0g^HOP>"kp:a.p4ll6Q9B,]$U[TKI5cYN ~\l ("ȉZ +s0xGddU5#@&A"(\@V?.Pb~EˑU?,X$6r2}_Y,.F"-qԂ R EJb6J@.Kt\ 倦+cҎ~)G,{[a5y`\Ma\W,J +1'SvWU~/ĔkwtE I hS +?A6g67x~Рo%A3yL𐿛ʑ=5HИXC`x\96Vf'-MӰ́1,r}Xs-$^cҚE皯P/ d6- e%(1 /ؠ az|h?LAhZ|W<,l|i OZ7L`:T_pz+,H'eT,@Y&ACD3HK|&88L[/5F%c嬹73 +He`'+;bS(R3Tqi% E+c /ь/9sdWP/N؞/,x6Puq`Ni(3zzۺyr4tdw2<\CNrv)%4U0'O.y[~T:9]iPٗ}1[ O'UK<).kG$W3,j밎〕G]%QhyEb>/^|l*]6.b}7ެ} _ܭk_V? / _-\`N%sQ3>^o \y*RkE=Z)*'/yj;.7qʠJ1`)əmjA&Y;P!seil` +$:~bR4˹#¼j"@WJRE&SJD.א * wJBhAZmK?Z+EN~iAQ "ڈ 3spQt'~9'/dVBlN&T8Y:Qy.nBg1<!] ^(fe$M+ ^X6!q.ǃQCe`&^ 5hw+j4.G{gӜC%ʚOWoTc#y)NX4TeH5)8 e\GxJq0(F)\Qxb DɆ^bFO[m#v; wH +6)\f\G CHG{E aC 9` >fM&E$ZdE?%h +-@@ -h uV:"Pg@Zz@\mBf ؟C Ɵv-s?-,Ub +a%d~fI2H4#kWM`jMbD=ۣ532v5IV;OL(/M4xRqf-΋Ez,r-:ؕy1\dʴJB(֪N yvVVv`!DcV9|8a]< ^iO`(.P5gyd=Z{'ӡYa4 zBfa=V|f6[;|zfTE4wJQSs'h9-kjayB+[<+< pą&HA +=Աjk<0-vS97>!b MubB¬B?<GQ@^'1;zӹ)|-i%Lɱc ;FXC*?ǫU#Y읟ScG8*;FqaEyO5СF-;~}=\ytKmb&!q RĶFd2<̪  +bc*(K/P{ sYbX[Xqo&+ Q0@3T=f,u٢ ~V= Un R +<Ժ/KPBam!_2^._$}ũ^1u3p \ܰšyKLlsbOĤ# +UhK]U"H!MZ TLl7Jx:fx4g i~?Oj=ꃧBp׋y){]+bzE?җy*!_g`SSs|QU/+?zI?4(Өt +s6w|N >O: NyLmo&`m%S=gY3dUrGR VeW"Iu8G;ViJ< %r>' P~: Io4Lu|P! 29*RI cf1( "*M1d\oB> nQjJf>M +AYh-ʕ+84*k\A/̤VeB姢GF؍,\}QC&E0epϨ^EfѼ `GUxΈXG4jf5|r(zf+B$ eo`~L8^Ù=#CHAqf^ ŌXb_p  (y,kZM}[cCK1o)"I{F$8;8r[hZ-W0!K7ZofI+nWl +q_Շv]!݃R}VjfZY7rbN.Vf @p ̺t"%g2@I5o +/Ftf&o!c}0'80jrĂ;F㕐CNEIwlp&}P#xqzg:'ʎjRSV[t_+l@Xz{gDU3+/#b +YE^ryX$X%af DeLj &IbE+II +|HxzA߷]o~o ^AlcUanծ"k {g; pA|C.Xh-ei,* tER ADÚI~fKRYu0I.S(8uMjbSĥUR[@ ۢ,|~!M~Xk[k/@/.3s!x9%HMrC?m?"bN4. +Lr +(D׋G5͠}P,_.0ۇjK4j()9KJ[–%d2K=YFaJy4sQR 2V|Aȟ5Vw/ ͈xLU>#IDYh/9׏s\^~X=&E Mo,['z5Y}> p / a-mb~IETvH#Iȃ·*j*F>p2A D\&E( ƨKS?{d2 f:oooāi r*fXt<Ê'+X6V +:TWCq悶Q}j3\aIvHGd>b&da|Z"=Ub"*0umWM\B:+mOm+hhs̕^΢Ԝ;[SrT4SIrH*#LPfk=~ ^/ͫ\4>PQ˜jǴT،vQ$6R謸źb-|mQYЈJW(q eTcF0JPgF;'%VʓvBJ'S 9M&^c6vkM9DF3)Δc9ˠ3Ho]nAr/0rHB)e'ny=. +Q&=J}R`6JipR"D4NuIc%$]#! @PH`ߧ$L%)Y;ݎQD7"r`B(Ct@A&IaVݧ' SƃUCK^?DD:1_VI z|D TQ{)fB_pBI{qyݮKg=>pH=|1GozjQ MF`&N6/JokQnDLV3aw R!,ޗl*go]G(_ǎ{_U 3^8rϦPY +V0)lylgcF zҤ3dk+29+X#i^W +7m%z)8L:lD2 5,N\vLqPB5$p +4/J)LaCxOZIw PkE^ˎfxF3e`Z`L_wR}#}4y,1Rɀ9ߏ׏bAH +Wplvh3ƴrnM"C-Q3ϙLx!( ϳdzgI4Ť x-B50) +"I3Rxxc + +er?ᱬ^7U2 +KВJp΍*T7t Htʬ2߭[g=QI)M;ڕcyw"jJpI` +& T.$;hb)ni1ZFU?'<)J Me&Qv|WS\b;9RAhEFOCcݼ[ j>.bl2 }0_ LMBOKUb/1Gk9DKes!"ߌTlE,霾eM 1t}\fWU6N=UQ|X[2?)Tz*́;aNfKj[|ݭJx>n.@w˔J{8;>9vAۅ}L@\5ڰ#(@p0ýͷRaYz>s#䗗4z,K +J:i譿zUѰ f`zKCO)"}(*塯ȥ*(#DOtSڏ&P.H)@^iCa@J=wRH#7[Ľ_4:U7e}(tp$ƌ:XjЉC&NsTkնs`{S%ψ! <]AG9D2§%GL|pK,]&S$5 "D~U̯nb૘9y/6\C=I?~}1GNJukH:?}wx}색{5mRoMҢOnIM]r#q/Z>]E)LEF}k%?&~^Nw !AZڞ +y1i:2r~/^yK3<M^a㭸l!7H\{onf"̤fx]otz;фk޴VH{ՖJ:Hv2gud/EGf@?RzTیqnI0I'H6`},}(I^dE8 / KiEQ͜i.rkj^!}_. dٱ=Sx[O;biWt;_2RJ_f"5q4x:Ej%\9[̔hݷow7y=zLٹDu![OFyGNP}mh%s8$䑼J@b}^9pzW*% ~4RX[w7S}+TSd:]r8bR`8 fOŚFً(t13!o3,Gr|%,U:q(K}X>p`vr +щNB9/7e,0w>~`Z>hr`NR$<е36?ϯBKL-E'AM3 *eNgs#{/fpE3o-%LYߓxRŒDXBaLy'N{+ }zr hS1NL}*lM\ά@Z#BD!R%"dn9Px ;T洽uF= t"#-FD-d|=TFs7µC){!ad2 "yFAj-?l7% ##$廅t→w_XGKйJ`ܶI# 2gCC> t1M˰|'[((""MXUU)Bp5w(BZ=lLqcla4y+me\Cv8Tƭ;9 + όU) +^+M.ȓG %}49:7mk_3.і.g/1)䱷9`#3@Sj@%/AV7WRo%A C(&%@Ti7LSÓNWf+r6u^Y}OP~PO{1S<Sz/L ^,˺{Y>6NdEO$r iqZ72 ?ɶ4O\HF6:?˯\|CEMzc/b\rpy^P]PT`?~ ֥R]X7hp&Ja:=m +#prV*TzX!%܎ ;=TFǸ{i4Sԍkw@u |hxfbk&^jm;I`Tcgg*CVغݖs@.JYTƒq_vg'aR_e_ZKug0q*A<Kr|V"XF;l}wzGB[LDY]7gFn9uCFN~z:tC;(:?t"={EgƑ "W UP`1SCHXsyB܎keU ֲR|/jTȍ JV>,Bxòl}DKqdXSzŐˈb'mwВ'=BŊ8A  !zZ^:Դ5+fN07 :TEGn 6aXh"Ѣ@u2r:R]jXEgz9_0˛w-7D`/(q (>2+<+9zMd>jCPLs F&MA>-m@2-Ҙ7eQ?=*>7Ey>ʑ:(>n+2Ft!2[6Og[!_"S8{jZzJUPXl\K{h4Fpf/C`@㨮f8czAo|xC94\ =qMik +0&m) RƔ6aXa8<_.Q 7 BH6<PaF GW~d3K' h[Xt7hL@cֶL(X(0b]ӓ~o:R #tpN ǃC~6n&Yg<kmed"N|X?\3NjK +kLz^WL,u&}e8Ω>Sѱ |.A>lklZ$ahQYH ZR sO}+}]KW-]Մf~I׾-NjrNר2=Vi_K圑z~#itvJ#p]{7p7}9ouƾvt[83ܠY$MQڞ6֦79>=nHgefd]m! 餺`?*7(\>uߞ@ރ/I@~LR%HKt^1v.`]oj4\@I@'pyѮq Qlfx^QJ$71R[Z >({,/^7kmj4<OtoS†d:`،*L%GxQS4Wĉ&LCCh7zÔe] @<+(ȑՌ.[C5 @Ev# TU +wTEBS:|1W8RbcenCEH{/H#Q넳7[<`Y8C ZcbZh<.,( +ȳ#)a"w Ypn蹽OHwѵd㉠}_Sl㾔QWc :HMIz0HVRݒƽ_Q^7먩_;='u %^J^w:3#yIՋз``t;k[^QR!NGK+hrE*G_$Q}tpwPG?M[:lV|[ل+á|ܫ$bTM6,o0_'Ǿ?>0cљIE߿nc[bh{Byz~A%B`Qk hx O]S}T˻GI>.FE\B5L-8|-M ޾=}з2mB](U.ϟ݇>[4YxGs E+ӝ6bP(B_+YY#M+73@ץW:׾To" ѣz CiDpeU qa 9 'Kz( DtC *݉"חS9u/s]@{u$ u5,Zw#X ;gP +yWyTݞH%܉?6ѽV,И>Q7)Z3 + j O+~yA< }AA+ +X>:"q Su )͚^B{o@֬"1Z|aqOӯ9֞L25˵+_ނ|_}; ZO HU=ueCNqcjtW ֍jr K5ctS28%j%{M =P}ǹRli%Mbv`a$=L݅J fID]~-\wA؟NU: ΡjT˦ 01j``dp +lr%Ka\XzcI O~O1\_%E'P$;c=2 FY6yss᭡n.E_w\B 3NC`y +Y_^$ hP7upˌ`# ;2/[|V0HX%AeeWؿء Q>2: +jT` `#8RLRKG}^b:08s;B5%tp;gW)Er8Q$\9dvՠ̄Ry3_8|Lr Fo>T"3B'ĉ٠ )b tt4*d/j%8(8L$BYiV,3o^'VH\Fl +ceڬp++(H=H8HyB +(̦!CĄ(I3Dp]P!!Bm `6P "%X9T( Ŷ(%BHg $53UNMnژt:!2D۵zBKa m˶OM`R`Vͧ_ȰH +mWh%6rIXDR3|EIE %E"Æ~(Đ%t4ڔ,*9'= +w3$1T23b +Bk\ S$KD#z@BFc*!O9UR(!92'ΐfBppV]"pt$sCe~&2ID*2-O[F4hѺ*5jP[4\,ʱ'Ն(kQH\r5B+ŮQE\r +4L*uad.+f;Wyo:$ .YzTddɓ}FZ04(8jJ]Mƈh5d 9hHNO5V!4qTvl++ѕiA3%"S2i#ZBE-Zy"rk&8VTÕ:K zp?L7a% q23-#DGH2)ARCLCd.$(4S>Ic}jbQOߥHOP#+%4Ug#5R[3G I$e2Q 8pžЌgәv|B|lGJZ 艊PaJJZ%yh^H))"DRI^Ba; D+ZUXªhWʶjjE`s383:Ae!\%Lf&4D8XhN3EV ᳒LJ - ]%,ÄaMD0M`,R&HI, kZ @RwСYAJ0H1d=4?ZaP'D9lVMϏˊ an8,#5S)DbhAD ҇J=Xhʡ$ tX^dU0MܨKrV́5@\R!ٶ?{*VGQQ_xST[('Fbq-k!#,~f)bj,cuvmV)<N*VUa:]U٨E5H'r΍~=4Gc6k+~PhbzS;UUE螸hP6/6L Qf0D i< T-w 쉫Yr*ش-"!o|X`ZQ /p$@PeJB`fJ@C=Lj4>Zi+EQL4Ɖfbt>V(9FHH*#BVRCLd7CB 2JKbX^X S -X9E &I^&3YS8 #4Z|єb5]KRgf}&W;שs8v0(PSںj>K}"zOi7 +w(zLMWJhofٔ~9> +r(8?Or{oZ{lLFv+ T[#p1G* MU2]9ê)9f}%fD3pldE{pg~ݴ%8B.'#+R1^DW)fP>U(:P:JƤ(@aYP8p$dl$a8$ꐜ(1,,rEDdF"˅4#SBNxĚ33#S68S͠*&몚Q]q3 +;}dZHpUĞRۊVy*+D[T O3Zfkmj!4< 5Fi eeԵ1Jfl^LBvc9uDDF䣲C$3U)qhm^1]$)&xu4+:u:3M}%G,^7ƣH')ya57Úh&{O|QR] jGDէ`L ?fcq'rUm$]OBbUZ*{C4;qξ \7Dv*"Bi΅ݤ:2 *: 1K)]fyj#Tբc»~fz:ъ٢aUMb^ +oUlW3NhylL[ߴ'tRfHΫbyFX3JLk1KJ(6C4$JA]QQ*hN:IJU*H̥jN#TXW?L~V,` +(LpN{TNӣ:E*xb!b8nb-R3lr,-Ah>#$xLTbgn +uV[CKM'eOkW +3(_VMRJ3 }-K + }|Lq Ʉd8(J,T""2iP'Τ !ęPhZ\NǪ6MRέĂICGRX5 ~h քBB& 8/D1d\lo#`eȌw.Fl1׽CE+͟"xCWip gH 6o'xBh2 2ce`̌CJuuYT熧čơU:I WévZiMEbDMuPG1Tl"IYު%pBPPKEt&2HL@"j?=*zd0gh(r*EJK`Iki2 OvH`zp J)Gŏŗ#N@oXR0n„WjmuS(oK|(x(IHkbB (D%l3>܅/<J AAqL2d*Q1 16(nE-;@VUaѨ]e @2|$f<p^It֟DJII"$& PANj #0r@AJLRRσE2`)iPɀSa*0 A&`t_.StSF+l4Ci(FmU8Mx5,.D2%߁DqDЌH9"bfkvd@$)1o#? +/B5Sg@pCI*8iByO <2 Z@j2 v``RSkȴPgL(jB| *^jпbtLD0QC luIv0B +}0+-j>jhrC j E_0p\p4ѢA4Bp@ Czt4BCBA(U* @$+{@ld ,\ć=qϏa!^ CbOd*|=,pp{{Yh%>ƎU꾸%42Y{4;n,i\ʘ}siG"h1rjC-\pUA#Yӵ,݃0 \*LcưU\ot7fҪ|Ny@TT6N]QcF$D$Y:aSuF,4*(8^>[91d\& ԉĦJo {4ψ2M +԰f D]S8e}Rž&QIyV/$!V '" mתkHykSRΥZ@6Jrc5.^Jm6y_98:.WaT6&'OQ',AJLBV +XcF~]mNxKEK[-PFTw;R7C xfwJ(PIYKLg)yAV!u\`ccCv注AVb3R,T' rY71nhAn 2{P!WRś;,Z1nr1J/s UDr J㐹U } [%3~o vp Jd +ވf^5E0BCv s2g\ao']3p'QnbdF+R9Hl̪Z9%@.敀6g!贪ZIk+ >ApUᆪvM?$i\wBu5 ƣʯ; SU'cO={ڒHe'`̓cI?X7oi' +GN4tQ%Md.&R&:ũr(+"I0GW7{ MŐ|0c%~(2Bǔ{2R?Sگ%UAw= "聠g:̐<dž,HLA[ex:IAhĕ竊U:ڢ),a44xiګ-8eKLx 30I;$T:N)i|;љ2l!)(73_E7#K B_=&Zk9F'뀹{| *?)u'aꞝ#I[' A*rFd3ģr~t2~k2UMDѓuS>vS[B_ Qc~g[bS˼/Y9]B|L t0WٍJky;O|!aWڂ[ۨUBX0N/QhK C-?Qr' +[-4,pb02 +BjYD5#5.[D+Lw/T`d|79^UXi ̼:c~.%נ|N 8^aݏdJ^dtTg8^hDا}3\=,  ? >_<0@͌#F t T-=/gj1Vf|.;v B*)/(w}de) 4*fqb>4(_PiTIC-\ ˣ/ +_.՚t76LF|VH;?KvQE2U4Go\Y(f| + N6-8!23:EpHuojE+Q65kJ)/\z~'"nkԚjH7p,= J)flt"r[q pz^ӊ:`}ɾSPV{Ԏ^9kօhұ4e;xpCYb at`VH#U0 wN2kBFW +?pUjY,,#f_)#|pn7H0tV#߼AkjX%d|L!. ^?F]o&jl Z4YBҁ< +Ol"D^ي:~T=h7tlsܦhZ a9ywP?'rt7zyw9[dUd؝,X_K>Kg~s*7x\WYBMz4f|rI7M0O9M?rJY  YV.2H6iኩaUJm4_VR".$cr%6kz=%R'Qu`2J'!ڲ5RK0Iave"-%NQm;얆nj>V5e偨<+ /=M:VFanړ$<(Ԫ#XAtI4a8)c*OWbq{PQP2) xe%pKIr)ozDARnùK(80=e#FsՐ4kAPLLFSMw -4O%̴ٌڋUt) Y /hF5mEΜU^;=`׫@Ɏ +O {pq{Exhׄ|̞ +=g+d#7zM!c]*̝zU0R˴AJXЈp͘@542 Ͻjܤ0Mư``.<76|ܳ%E[dXY\Rǣj w*4n{Y' {Sc R k|Fg%hu)K0q2zfI{7 EXS/>7]IDF7g3\J+is Y4hGL0bN +Vs+BRo?.#=hg୺JW(sY>IqC9h%?JBl)k +4rw2p嘱U+Ab:wUQSGHu5!S]N(h,݃nl%첨 "6A%5tB0r(rDozڟh~^ Oɦt!tARdw2.Dq` J萻KȽ?٫ӃV7IT .\-4lZ`-ۣ aIeOGjg=8ku6`W,S@W`65^V1(^\fo~zi۸7Sd}4BV#8&@n&e&NC]z[;"qΥ]+7ئ"Fp.F>'{_+&XėvX +]< tO%n_Яț𙑰[f&A;u|;)=gIvTp)?p EQҋ{>`JG8wJvuxI_ A$KjGlP}=^S-K`tC; [+@{eIR4ZK.$Hh4o9CI8䌶)Q5v$̪l%nX]2 )d{d\1ؽ%0klL +xTh(UC} >ތܪE=^8ЕI`}hl.[nzqFtS,2AC27g}bm''H19&TiUwh~X:eK`j@֫PP,: pԜB!@f-c&H `G0#gάo]@tD  +^O0ߑEx4/BN-kk%+PN]\Rdb /׆8 af| <3Q='ٹxulƆ6)$:ilv)\*VA :Lj/6 +b,<2qihcS@hIwRE +,d!Dt 8Py *Ih)bÄW0\B@&jb-U4bXV~cJ';#Xқі0 >'ȊH@Q]:sSkMgõ(I>۲~tD+t|C .6`Y^By؅j=ۅr/ٰ5S7fXчgRHxbFә$tn#mn10˰5A Q\!߃G& e]KUfuфC֚ AVq8+6r +omSZC>mh`~ ב$Bٴ7rF"݌ l_XE;G`H~%P`bTAׁ>Th*rkOEf+,wRN g%W&\;CȂD&NoL"4 H'|X\-}&g25'yH]7CPjT^G)gc& SIC~3ů==M(տǂWoѳiC$\Fn𙬯v6>ʶx`Rc(D%/ dВh>(wG?0[z|͘5_%݋ +} :&7oB tȀ+ǩg1 !liKKR~>p.i|C[7:; E(=t BJۀy$Jg*V~!LhL":^疋/@c BJa@.fW>LOhٗhl 2m2vhA|Aoc6~/!qbx;Y\8W-<*@oS>BRqa۵[ D>ӡVhe >b 33a춃4fFC +Jy!J !ѵmDL$,oihʇ)y"L + 2ʃzY"=o2.cvVt31)3!ۡ +.>(r@')Y@H%:#rkbղf_ y2[o'yA?} ?`q1T7 +?cX(’Vp#7 +jz$ _!xaw,DeAqYGxQ ]K(K [ގ0-#p!?e.HV4wa _s4^wDOr)APFގ`TA/+O$ab ґ6C9  T#(H;*+UjsDSW4h#!lP`pn!q(o9u#:#BoCTL>;|F!_3v;A2rN<|`ȃ<#0b=$ζ5{P#"~.b"&ڇ7~л-$wi5}(U [*@"YS-&E|+>xHwDTJD'AqX|vHX"aA\3"1-RHvcBniJlĈ|HfD<[#<ǣc]D>"q"HC8W$D7Āx!cȁCr#SB:U|dMz%Z Y%y%?j!vNB%2 +=Ldz +1&n1KOa IL@`bHc8!#B̉BU{'A<'  AH' +(7ȍ +i$+i [PD%ărQz{8RdOAb$Er|# "XʥAPzy2SDgS< S8TbO/HEZRFSy@ +e$* ϵ +<q|c3)[AXWDzE&QկheB( 3ټ`",lG8",hq`~Z|Ev[/r#-lE0Lxi}Eꃱ\G>t|ĭcrvaq|8 +"WG/_}h/2wECfs`/Gѝ9ףNFrTynF?8$b8&Fcbj/1AuyP8FΣ,h2/Yy'3e\+#&ˈxǁ⁡@fmTnfxwF" Q︬;h$;9IKwvPrid1~Z;PA3;HR,#j^bGdk;V^V_$ׁ FfC6n!m$w:>nHt,UD:x#A^ Б90{οV9phr.n1Di +F" +%r*cKhSrdN)p9<f.j4A^tWVZuׯYA87qp;"4v8jWkM}CfqWUڑ/c8 b.Lv'Ba_U#:4)8u|8VQ:#MZG+7 ʨ#o :nP=.\t ձenFnHCzN nVnJېG!^mH6dJ˳AuM_TicC/akAP'~vɾu y52Fתhf_X5;_ ڑgQjzvF5dE%cM 6#qFavDw4Ph`F +M!nKCҐ?DҐ"ѐ6HS1sO6-ˆlC#v >uc{Fv}3p;ӎX-rPAr,=p`|vdv@vD(0g~2~:-f( yr%pmYFQu_@0eCNFHܑd%[ޡQw%s 2:~hq㣠l/@1;Py#P^Q7RUB }n~G*XYz`HA!=Z!T<'=jGX@edlBZ&1F]lXC@!nCzDkĀ.%oj{H*ae M0, +F#{$[= Xpq"G>2&c|`m| /`A|D_ؠ>^Ծ`}l8/X+ͦ~$o/^#zK/x\7x$y d/ +x.niH,@@B\H3uq OŹ rA'Ar&RO kA$зAx :H݂CHpm-ZgB|8y-BET->1ԢcZ!٣n yZ0h|CvïwpCl(zC \kSTBK8)"@H8qq.0b؀=, + t)jdH_qo+rp)L/ȧWExE3`$r]Jd"e\z+ؤodFՊush%7AV(m"V *ʫ*ڑ#!*vu#GBUNU#P +4;U#K٤i=2;*)**z$@z$1BHHZKk(5 {$l [S.ES,MS +yR|Ǝ%E&,F + Q`Q| C(Z#݊⒳@D]w(~a +-Bu$0 ؑ H:h9PxP#iS"Tk~≲>aɌOм9ߞi'#Us [GҸ넴ua'"GE +W;9^,upBӛpGbWH +mBG_L#9HĖ2q(C5 WEpg$*>$`$'aBd׾D9U2C^"OE.!$Wn 8 %Gl ` AKI­D)Iհ*]YI +xAX3k3K֒%Pշ$M$TA%0 `h0I+pK$cvUď2H01E$(&M `N}. g$L  ^|lrGo x*IyVppp)+'%#ω4Qk:F@Ē; #0Pd"ӓ.J{blYĝ}Պp$#lY@PQd`'HD +%og(2yCђClY6c!\/ +"3J ^!<ʏb2:tBHBJJʓxBJ)'%ipd"u̘#(<9rA).LIRA4/A)?@d)@܊|(Mi'x)8)DdJneol+yLQp@.'@Ҕ\eM""cHMɥrNԱȨ^էxplS3)Jix<ᔈ"$M  +8%ԯ~h +gSr6%{$cCS\QRccuCY@нPі{GSixȔ0ڗX=k)zC/%wd})ƝqU%2CGcCEPPx;-&piڡ1}RZ0i^/XA0AB Y:otY)BhwA^!XLsπ9XR +(ȁ"$O5x$춰I)8JR*ش6&؊CH) ġJiklrwKe LI^N+% )i4)MI)dNQDS~6 Ĝ +NjT$ +/!<+9F@J$dUC҄֨XpylW0VQl{s*ل`UO28dž_jXEh^WUZaŘ& J ̢vt( ;Ѳp(tUUN?JnUQ&{AkAoU2GNY 8|D*)&JUQVEpȵ*!KcDM 87ܫ_UUWa%_bd3M@uTU+g+؆ڐX\)?^\1 ؕƆ?J`tm0_Ik@WXJ` wՐX944e,i% 'unL! ,/B ?AH4g(Y2y]ϒ3 $%k̀ a=-b')/C.%:p+εĸ[B^-@j &a ڒ`ǶԏJv |Pm T0e-\T C.pܸrD.0 *Aa-:b.#@cI}.C{Evmy!/dօzxIE@^Ȁ3/ w¥=:`^ V1,\/WVB7e_~ X/u el zl/ZH$/yLgA\lJ}dR,ksX}0tR‚7a'Lܽ/]K!D +&H+ 1&YqĄWbF2sXAV*Hb^ +r/&Thcg1<'2N^u LDŽ] +1ik@@/dr!2E&Q/ +D$s +]2a +{/(e؟LX?'dLVƿ29 ,)k[F5'<˘d7A˄w1Ө&Є#3-͌͘„VL/aͤs oQ-jxW =LԔxS@39@}&I@l$0 HhzmVLfAIGHNGc.e#h4Wl4&=#4Y1B[M'Bs*i-DjB&ΥF .ӇBzwj|SV!+û$d45kMZ{>] ׼&@`lB61|Y?ha6A/gfA M00bLA m=qd!͟$k |AbZP_j}X@y),|5$4#0~'H^n &М%wn i9203j֌t016'ДDvz쪑~ڃ_̒pNa 1uZK>qř'>,0!&Ts\qR8h"@]N7ʋbDAڡ<]< 3.C$̖!'3$@,_1}(h]/sBG kxGZN;-:}YN1TEY= 2}ѳxLƠI44=DP. &{ S +"L9^<7kd!.|njFSyu Qp'AT֮F6Dh͞GB@`7݂ p4Q8*ݡD'0&{7f\?a Dbj$x<:a2|y*: ;f(][yXqEh8JQM`,oey ݀ZMHt&3)jkKLJ&(S`}4$;!Ϥ4hvJ(hyi< +Wyb%ac-T?n '&2 gYD~AhPs"{g`Tt;8}9߻7}e=iƭV8jͺ-6Cxf $$<XYz!-wBS0.C;>Z7{eV،=Tyh1|gk 3.6Dtܛ=[Phy 9/vzN$ImT` *un@&а 89EYz)߫k% C)>"H0MR^E>~zUTBC H4R!P?H +r2Uf}x]~@k恑7ZBZqgf'$ xDr*a'T|uɨ + ׵u]BLb'V+Q&PGg`fS 򟎁Q) X,;1.*~"U%rݎ@M{\E6֊cO3h:7gjOk] X 'qԷ٘oX'b-DEfAf okkPv-J@ߔ_^hF= {nJi=ެ;)??:c56=.1}^=:?&Eڰ_j`͍~l-rdM4zwo{]+.,k'Vt'B73k4'"I%(O R^wBJuw#)N[MA?4*L%ǀ]`ZC\IlG+b;-ل~&K/pOopm~ЮQ]xͰ'aoj Z?l.=p2d ?& ^Ȉ +8~*n=ղ]/~#,,apYDQeaq{2)a $c`<ҊIJ[3%R%9V46r}]1?ʇ'=e"9A*E]k2XAL%; u~t|nߗI_ ]3YO{P~e<ȽiYNҘW#/3!_ mĎ嫂CO?j= =)9icHKQ4~㳟jӗgߑǂ_yIvOg_ }$͑t?keלP?/O 0NTڤ@-اa"\"Y\ip> z%6I~le'ا8x/՞(<{)Z?< [ +pfN C(Hy*yC>JuE+\o_3n9N^A%r*n?E6Y0Cmqg:?FS|y!?4L{5B(!q ;WR^& ug3~~X`֖+Dת|$p0}E\R{sG]*f9SC DZߒ +oVB.Cf9 b. 4CůadGB(]b+a.޽{HX){#h%ˆ2^Q_my˄a아 BЧ_3KH\#O9\A jF>W\`D9󮇪gOw+W6nTy + i.r&4;l/ /*vOQَ tѺ76~*G%.("6*_OMpKaiP=H]c=.VEu5۶(mA/WÍC⢑7@~E 岷})Z%S0_k,H8ǢV: ~}F2zZ+`*$>_-Ʈ)`vv}zU͡I|K*:ᘙ+zȗ6WP3*/cTz=𛑮FrmzۯX/Tt48㧾{ /#}hXf_?QOAY +p =62F7§g~٤7Pa[3$ܻ W\^1r R;%wSTUZLT޹5E_-p''pnH>hY;\P +}% namibmEY>% KA1!|uJyZrVV=):juoP!Z]}dIEU_4X%.Ey/|~<3<.P@% iRY6 lRh`܌xJb٢ޟ26EP Pf@8 !A=#UЧ)4&k l\vNNDK]s@{5,8tB?L7әAzuGn5?֓HKlSX:N'T07~ eאے^sk[̉2pl pd+FB<踠o6ȭ/1}Um:] + ĔM@Jk[zqC:IǸ=Iρ S6k1aUDD"4?\Uy;`p@֏Asx  ;@$\Z%3\B):N΍}a+E[1] pB"_!slTn׎{j$r:fX6Yz7P~t\v ߂@*G;WO+a7u_ʄw5K9o-Z x +X +I96-~ sMѿIeNaa.CIel `H;p `!Y檹_!izy];Lox?r&͢kC[8Нrթ ܟ2Mא޹_h6=u,L`Jw4QP)tjʥrr7BTf~ro~SHkS!sj^&|[~)I#=v#B O%DZ?#>stream +Q+ס).NȄs̖,.̙Shm".>4'{gO 2HqqWrKGp!%hq'۶+<+Zo+'L_֚OԭָzPkY /x&X{T*P1ʊdդb|M w +I-0ˠ)'| ^@؛ U K\8(}1!%e7<1AV<vws7TX퍧i.ٴe-j2Dq9)YŖbg]ɹD]J{?]C\K/i;0%Vj ^^{jm_awy5U_@ޯy$#ܢ@rOrV-Z +=㘀 ]$+РÃ5H?7%Qn8ޞ/݀ Ya)p'y 媝Q{'=^g_V7^]R=Yr$\*( 56eؙVFپv 6|7I u¶YxB wz?xLbީOڟnm`v{eKp nDݼ̳Дvt!vЁR{lKr罗%yKz &sz:{P>ܻMchS /hTAiz +_688b"CjdNW\`ogWd)n-D :W&8]T@HyxBHBp/leps ]Hi󖄰~ 45dj + t&Ns 7$:n7 P brFUI¼jnk" SX xv6wSQvy+eJ Xf-G!^eZXTz6g݃#_}'HnPG_|.0utdCݦtI59w6Ύe B9h4&Izk!"e̍ =qo˺r&F5xБRP#rw@7*0"q=yM75ZYB}8A b{=޹1? Q--Šfs|µٷOoF hvTCWiy<"UW{Ld܎P7rBrk'xF+l{N_m}pg[֥`alS`mvrLg3Gu +pP؎x1?s0[;>ĭ+ n"jm +4>X$LX۬=5}Om;Q{y.MMKUjx 2 +KCbWک8;3랔\Wh}ﵤec +|.B ^mvl66]I"QƲe8Nw ¥2>B&?LV?Z6}dvP|mf²@y|BEh!pMv7lIi )%D+xpH= kST6RPbPج.n[vˉmq X!l7lERrD=6IN.'-O٩Vb$0H04N{ںƹsZN-v&FkD'R|H:8}_\+3&kɂҋo[}PWHZΛ\<^w!7Y.63k"A/Sî/Y )!M5~XʳsYCߔk_Ό U# QiaWyJh$k'wI?ֱӏ 7uSMίݴ.XnZ!Q}4B 9m$Ɍ95Tn960S/)v,2?W KҞaj{ֺ9FUDQ=dͨDQG[[E`o|U UT%DP^ zi蠖1..:-P@PX򧉫6Z@`OkĊ0-nP(r7Pua9{8 +kd0*Գz~cuiyY x?6 +hz'sКfH;d:^Oٰ,!)^h'.`ֻYY^;8pbs?iFJm*=S?yTK\E -^?WjM.nlҖQ5+ͦҒy`L9#TnoG+JM'C'~U@yhxV̩`lM= eorV|d F^uNG0ݐ6HtEHF#":q ^id66TUs/*:֎oIL)eU"E }xBW'$y. (ɞ7hE$f& z]w pH+o 4RH,p׸QT6eEA Z̸3%;Gq#%6qZ;''Lw>’޹0#u +a1 +`zRPQ -م #wi b,v5~5 wPVoKܷrGrF Y7TгnfRyޓ +ӮT|;oxdfsLy"lFPV+IBK,:Uq tW>5ph,ߌj9m+> +A6 Q#igJŘ ]Ir5Έ!/Sc@#7gdxJʚVY 7HM"aϺ)m2,mڏ/Djtd~}즔_ҞMW`M?㸲yF&guS]Ʈ`yy֎z.!ƃK]DMƆ9ufW5tJ?ht>VY!uVdusxA*`GzS<3k%wCY-\v[r=UԟVC +VNGYc=USA@h f-Rw' BŃ0B`!LVi@y۝ƝC@pM;Oe@#z4̰%*a^UsڌPPEc[\M4M)] 3Čh[Zj7zctR"B9tGx! +vt4eGH3,"X=I*4.%Y=^M\\dlf,?)j{R0WQ1LKJnKlץ9gҗ)Ô*7C[UHfJzޟf,]uxfҮƩ90;W1rm!Irj jy|9UU}}*!_}+__Y!"P~daЧnx;BbG..F 1klֱYv9z>ilafmx-#]eaⱶhZJ21f靚YҀlfM8r?74ٓLH_AkhD. +FϵE^5F;JҪGiii_֦E5Mi1RhJj&r3u[ bcZj$ѵF-6h +[ecK? 0hKNkcl}Vd=anOu a'H*ۋfg;ڝ5B3N኱on! a\.7踛bȕL8SIm]ndfkin38Kӻb8?D(qIs5^Qݔqrz#W~v/y!x)HUZ]wr><4(#^+O;WS~>w3A<P/Y= mE+|ZЪ_ꪾ;n=G}[nTMy=w@~5/]n_Ȫr/t*CL5*Z77/ǐװZ6sϝsqD=su vԨxI>pTRx<|DJc|`Ò>}˓~`Ɂ( +{004 ų>!(P@pZ]g7pHY}Yʼnz+Ap3.QUx1#Eacs6 + L %pI7MS'$)6o=n:ŤK6+ow/J0tp 8]22h#Y<c&J@2 8r֠3͙;һ-A#`4Hu}T-0uB v3@:c~az4.M.gs&/B/J g/RY p#;Ff@=bZ}$W2ԃ("ggdY[̀P%aˀ ={D`Y=rZż`)<ݰG xl"}u̧\D:N=o#B%'䃙Vm28E& j4p ۨ>u +xwiըZ?c)9py e|(zQXJ X)'JφcACjrmܐg|`0A1:3~`Mܷ/Iu0ՠܱr*TH"*q?[[_Sph4I +~5ܩ9lӅC6s.rQaً'b^R.A{#%ijOUV?|E(~[wKVqCBqQ3N9">LS`|gVG:c'x2sN ?Y(2= +O0jʸ>K~ĭe`VpW!ym),OpabW`|Y?['r`π 'x ,r\js&bkXR`0ʱygRc뇸 _%Z?\u>>3҂N, 6b[bw.ja{`a@0Xbp1jWap=l08%D~28qUhYmF)tp589%.jBP^۟ef?7pRO,& '.Ba0v7Ux=QBJҎY^q8lg.2AO 6O?4!$Ib"ŅmqK7ׅDXR5@ W-` C{2F*c%m3JRS7 ~a0 i~aДC}#LaoCe"F^ OS8arb}ܣZ9i" +c3 ]5_ @ƱŚS3{.H` L'Xsf=*߬aٿOЏ,_j0jRk(Ӛcu>55RoPFL`hu}4UT>m-G$T'Keoig1}U fk4E5Z!$ +1/;Ofmgc?*J۝y©(YVݓW@|4hьpiSSxь4l +V.}tTLm:e5z3J!:̫TZݙɭL/|fikƠ@9=lRz`<:}=@7UJ<* 4\hTkiFx}[ 9ߺ͗'jHfܬ9Y7دp~8ņ1Gx:[A9Crl +{8sSW+,Zd^<%fg, FgVā-Q7[\-:3@krAk@R,a赡rYf7EDCp'N,k-#"G7퓙0ȉTK:A ̏6s6KKӂ oK?PtwԢmpln{JaN_C6W-b4c3 VwpD1χ\T?df4`IL ~xllTk..IϨU V!]kw,#ā𠘘h=Ngmd<عoEOIgca۠sҴ؟Ô{'{ bfGƉ hmذFa[w7h.hb {C=6f9Ca"/@9Ѱ#*]V>/Dzv;7r߉ӆZîQ65콮M;鋾Nj* +Ihg^<9+ֲ:c!hiX%}o}0y=gPfBl$L;U ٗi7UVk8T]$\ffi֤_K%GJ6j$-2T\y/C;g|͕m(d,R0%,mmݐ=]%^yBm.Lηꌫ 8 m m y =C>-`=KUlYفv 9mC.jN*sbhnΕ*+񋁶^o/-h=C' ƈv Q$hmq +l31!Pmɜ}D-va8y+v!r +(e8>(61;rl-VEs{}ѽ7,XlvN5j7mz!`W>-#(8U4qo__3a޴[s3#{o;{Iʁ-^nQ&1\7d̢}vfpg Dd-.`Cc:2$܎)h`3?'\8rG ( k[p)+<bK(ͅehOB8}N4RW\BUF/W &*n4Q}I.@~v|~*F?uUroC%Ɖ<0F%f)S͓?6Gyq$ʁ?";eKX,'4M22©9"b gQnZ)k1|n]RVky-7'9*{{I<_s9s}]pd]":3Ž^,/3=:>I'e,0T5q:Ԣi^g u1$b`IfN=-x޴1JҪ JsWz!C^ZCTiTt q]:nɜ1"7Rx޹O (SV$D<54m*=mţgxgqx_#x7ǎOYK!s,uwy"` ~<4 Pm_Ǖ_+?,`^yv҇=p YiM-Sά_'\RmTe4DJKS9 an}vV_cH-;) ^nfmݗJYo~5r+֛~'.*Kv%ۓpuw}#]?(+xޤk %)ޚx=1Y?OdH)b\6^?އk$tI=ҟ׾{2ϧ3a)Y:< ,~`vU`(?I uz#'iU3җ(_rGNo^_9N\Ο`oGmƓ~G"+Fs dUC'~$yvp.0$) :l}@7AJV`hEcU%TX!vI~W^hl[ w?%tTGmGYen/dI"><1װ?GYIgw݅8x!=#"#W2(9Ýoྍ[=C6#wFǸ4zh {@z6$&+By){ȝͼYio!&Ξtk\Nh7D)̘ vOo$Z8z.6*ECl>{փ 옷1Ƭ̕A|Ś(ӯԵecl-Ex4p 8õ|jƺjmdBƬ_, 64|g> R}%s4~jLlVy;8s7/P9\1{ zQe`1IoY 3` hDzƼϣ8e"J ;_*nإ6kohwȑ2vdɞ8dI][HH#9jaд_8;(doHZI +:vu=ZMj K:+,51u.hؾqY/`XU8~q^;SgVbFn(φ5J8/g7qmwo4 p~ܿk5zlNQy=sxgbKFީ|̝u9 cw- + <|qWPޯPs:*)opL푥`pd28LΦ;epG:qn3ڶmg4Z, gckB浜Q˂i{j"N\M$A{ı}t x0 P V:VēRcs3}e'/ph`Hz(0 9FRg^29c%ɔXL\[H2#i~/&k +D:!D7 +@zA~]H2#( +L&PBw[%ͮ Z=yx7qu q;,b!:B8I* =!ߌ[m}l>c6pxf%N}i,ݧn˕Z[/P88r_;v'43c*aؕ4n=+}z㟽oj@(qKֳ:.d90C|۩ϴ N=Chg}Ƽ}}nZԳG<H1*#$K1syƯL6n4 ןFö69{eb:sSSpJ$v(; E4hsjs`Bgz#ĨL$Md`qY?p$< R%=;[M-Z\P +I~M9]8;iS4{i$_IchXE# Zi$R&G-urmSD`F$mvC6PJ[k䳥TW J,~i4ӥA{?|>I`<{> $;AyĹ/sw+mjƫ:݃yAx6v=í=xkz`7 P TmTwp@Rěi[3uhU7\61r[̜vha@yh2'im6tz ZMtP jDR ^qo'(iźfos|P#71oct|FgV3sf4۷kXCVD. h<56](r3~ ɺA +Io;t=+ב,mna\aI'ud_N1@zadSI Fe} &:S)aIJP^9u:3F#y'Tº >e")XLޯõ>{bP_=W(97h )A~|~w)M_{#8Py?!ɼ16 żij?ƻ,mvwB%6{ +Oհo@Q@fgovXYvH2Te@  :tv!OK_qУ=e"+@hMHw-cG6č2sf$~=1qwDZ2ucLVop]H):e7=w3i8sn|jzHoKqݼWy=>SV4yh_[Cgk6:k$x \,~2$Hi@Ţ@C\'@h+mzՍʾeoX34Zu`gz2$ PBg-")lgfnCc`E~&Mksp]0 {8"{Vy늩VCyꇘFp4 o"?ۦϭYYB6g F>Gvm4w=F?ɲk7uKܿS$k9qfo1ryv_+;:NԱJ쳛8[% ЖJ5Bwg9l!^ $}AI׵,X V(U9DN.)jRHl\;]JՍ~3}2q~m&Oo<#5ju^[=&sGi;91v_k[+i.[mj[9b|,mX -5itMMtF }& ]پ6m+uE}Wkܝѻymݝ#^z{u1굕8C}QxBh$:'OCo4l;v%OA;0uɼxW6 H]@8:&Lk6YO?Do:^^CxG6kǐ#e)(Õ +Ǥ ؅ڴsiAfmܡiw +h#W~9?F$Oa/$ut4yjFqSńS6Pj@)#Y +C~Kgt:P7 zIyv7ny8o(mI(Ax<6(l%;@ރxssr]vЮ=$srf/miNa@հ+qrҧ39Sh'(锣PoڶZ? F:e?Õ>yB}/@wNxSmmvK&A{'6_zC(G3R'FB}_]d)Xe +O cUA5u=ߓG )~N +e"ܟ3cƴ1r6F^խ^l, vu0jRCH1#q3{jژ9M/uƼ^D8[kh5GH S($`͓8y: d6kѮV ^6FPpay]qԫ>u +A~d@|1v ƽo$}X;QA HA Jz Ǻ {)y3wi4͝ZrHPZK_{Ģ(gtzż;h l#qJ;^:;+s:a=v? wu~(Iz#˿MiXP?(Ͼჳ} l(RᆸFPQ5zj> L]ʔp h$ Ƽ0@6/cG6F~4DþR&~̛-1[l +b$vͿ΃8 KAZkH&@/wvtz`/ P Gz{ + ߛ8ܷӕ,AzvO)5wot[6F> *,3wi3 m#&?zHq5yBW / >xC2X$mT HlT +R4Яw +O_(U?eB7e`O~~اV,dH +X0)}ʄ#LA/2_ġ7`꽍ā=RgOi4l'avP# {)D~%aAGF>ТݝdٵJ ma2RԳ}ywPbM$g= +FN:[aC|xl"MD,mOD*A[)kEB|2Hq|p#5h'e5yj^fI::spVgj6V(ra}=ɵ>cO)o =DV~*{3|iLޙlj#?:tum{V5xl.]{m|mg6oi̺ -3W6 yllM=$kazclYLuƼojP!E>»sx׃|#_)4{k[]DDۥ;*vC"~ +UrNx%ϯzXGN$ +Lhr;t]AF`7@ā-y"JK@ǐ#GNwBEā?hlDwFЩ8~qqfS%+?v)ٵ47yt h'm +R% +mmRܳmܺ ZRK^;)0>Q|C~_*N>zh5@ 5=`oqC=;r^8p1q,SG&xlùenk~ObKqn>Qjp]Hu<&?x^g昹[js~"^}mi+Z-Ƶ`^1qdZ9ƭLKV.#wF_nU؝4|ju̜m| Vkeh :t]>v'lW#q +FopnH3e꘹@{_Kut|~/Kޯɵss5 \w +?Ouz u +6^[q~Ҧ}U 8vh@ H$~B;I̵Twi:EL_{1 G={xNAz$S dO  F,QQ޻sLZmV:#usǰ<:Nԭ:]o$xKB $o0 )7S&d)h= ƾ?w3eU3m28UCzFύkl!F9g0+anL?2u?f9m7;'0b"윯ۗkv6ݾM[3gka̴`0fٰ[tqoFPx> }mbW77ߵDogaҼ-&m87Z0;kj;3^>o09K61r[-LV^_y Vjo^C2zwFcyxW4Cד@ ڗ#uqwbb6{n07yzo߿鋫qOX/evo  [}ek۝!x#(XWXY<,ڵ}>[*Ў*EL]k y:g0Y V8&"IP)<{.[}"s4wl4 r䳙>we17jQJۢH@[gЮ8?#wFǴ1l[yM+edR컉oE; M9m~MSgx{ ~$6zpOԭ=~8x[͐Z8Ķ}\iϦkoz-w'eD~Pޝt9h;zNA[(_ݶڭu"Iߴ"I}nܝuih^ۼ4j3 6^]jN8=r1Ê`4p/+L񮾺Y꺾m1n[-/Qӂ]Ǽ:^9[K{ +l((&P]4s7pG0|lO`ţ}ɵm< ?=w_lFv&vn,m&MdlCxgx|^[]VYr;fw[jur6M B5kuql.b]cb^2|dpV,{u` Lziqqr ]]vuŶ8Mu~_w?Tuv،&PMK#TiiY6-.Ё{0j`"`ľ`dq]îkt ZVE"6pq UVN88YeU9U9Y9e=pzV;=p )KBU;yu88P;U9%ڱKû+N{` +BZhE¢ډsz` n˩ +, MkGQ KKJVՃ**$\I AJ+BZ"h]E`@ 4  Y dIx ++.KK K * XYYWX@j BX "Dh!UV "daIЂ`X `AȊ UV UW Hp*++WZZj;1pÁ8:ncX>`vY1%k͑e{@dE'xE+蜍H)WXv{{}QBaÒp +0S=4-`Z*+[2)n!Sp2'a:\e8 8<.g Wcx 3\p>k >ܩ)*母KEZZWŧp')|Ä*?Bo|QZkO) Ha;굶n$,"J98eqGbBL)sȸ,qjB* !40DF*Yl,gIJG27Vn@1k/[:e$Űp (>ąx=s1PDN a3H50u $0) +R.`.B.9P$!8c]9 % +3L!A6ń@L?PdDBوQpg`<(#3#U +?<ǜg+Z?N"Ƈ#8]ǐ R29q)%$cđ>(f ~ēҏ+L!z נG!9H6 +8wAq%Ně8 >>FH|RNG%d}PjH5q=B:À7@>`kqI8Th$! +$ĕbq]dlcqՀ=/~HX~WS'sd<(1W0AH4_ &).>\T +!X$̩J +Gv@Oҥ,aE5qPLĄEPɦ&ꕷ+[O#bU_B`@~_M3@;dLW5@%U/boc*b\.QXY{L'̲94KTYLmEe\e=K @ &fRZoG(UH(Znq,g>lũnN,AaZ" 9LDҨYdrF {q "69SE5'}OT.YQ5BZ9D% }OzH=q*WĈ3cVzB +݈G%#Dje[@VX/^fNV>H~~yZ6 !4ɩX161lvC̫ +h13,SS2WSs%C!bU+@%F'C~"v0!+ŀo9exUS%+fW q`2*LbR0 ɦ&p#+So+=rH5 +'II%ߥ,hN`W +Bc Z%-d'B#uTXN<](!I@tE42Yr%ƫփNֲjB9yBB̮Շ}m[cl"a~ +mf#KB#"_$]".*ԐcCүɾ'>${cҏ `a%Q0O`YT-,i@ܗ\A3EmMt +P Yd.7-_RC(I"]TZВF%tUt(W#[ʪ`QWTm.az3+1*&Ō,qX:MGi @"D&K٧Id"GzL%eUɎJA&)^#H+!Z2*1C$el1rSut)Û҄FudbM$Ȥ^1%U㪕-gX:kTa2/4dCX*!Z @ՖiGVo#cqRp P%/]S@om19 +/K)(,ٕ+Kj)GPdR\` 7 E[d)ep)!ō3ʝ%,hRSR'$pgڊ ܙq|3Јi87b;0ŗ԰JJ<X઒9 +-h&Xj6h,5a;6Ί1ɕ2HD'Wl'Q B%pD"2d@$ XE +%'B#pF5t2q2i` a&6cvR(1zvwܑɏOǝ:HB6}'Eȏk[WG!Q m,4K zMKEƖ[w/Pi_pt/:j:,C=+LhFV*c-xH2U Yx/OXa<,BhruN* rՋF%}ޑqv-Bb-.i]H;QCS+ʩ?+n 2!f_ c~@|lݒ(nA|Jؒ@j2CRaY1 L82o+.R)=PߪDs^04Fi[tVz %Ji%sQ;X1JL!AQUb cM_QP}W^ +'DslK^lWH R<\ [%,:!1v0+lIEŷ{cDe76\yc +2H'VU&^LS,A +rB R%:%DN;2b@m̊>0 kARVNV YDiUF%D'Pp8‘NZ1`Eb'X]YNW:i',%TN-.XH><ƸP42ygb1qf S>;fp]DŅ 1?%찬#ܘvP 3-VzD-^dHV<)L5vt\hEEZF7kaoGAͮlZrs6RoȨ H10K +Y4.4/#ZE8e ,CS:aIi폘KT_ON=Ti%wbJg":KrI?Y[p*gB*oa!+0 vBZ! C[[Y%FbYATTt1/*f1L_P!yY!WZKDpTK [5\caUM6 (T %T/mWK8T &[-"4 şEd/~@F"&5(tG$tchHXah$ĺVCZ +.' ѬYRt/prY7~/ޒ唖g((ےwƀ@*6I \EDrdP\|YʊڳZ}l?ik)'|-EZÎUDzԨ;,*O©e4+WYQ'- +',WahYȒJsQ91d@v-#3j|UTe:ZH'malaa +heҒZڹb|YB66 &u%s ɺsp+w'ir? *Z&5FR& PBA +D #E'lwm>(ֶv]+ ;Er:s8U:@]^f1 $_\L !GXM#ѧ3'iEq)'pX0N%p \Sh($E~ SD$ '`-dGG1YOXN EdΐEtpet6`Z8#6ؑ:_n4`s{Bo"d_Bf~'TR-T6k!t=D"-!HL,&d',WSS~crIcќ+~j +V8O5(VNXQBM +Vd؜\TX=2i =48.i su#%y ld H86v(Ȑ"mQfTx[LBi,5 +5Pˇ&d:=>M?IEQ}#@ =*;ՋE{JUC"8H][is(x,)3}J@eDL7x):eՍc?DđerV&oL.`vHKޮid5gPNKcƲ3|iZ31-͞Zxqmm.t97%RîB|Q> +DۨbI*g1s۹lqZK< V=,O@{=iSЖ2hGT0 VΙP9KzDcH?B;p8z"͙ +Fw"&pSUn > +Πcq9[٠U7  +ƞٵ!1 1<z\`HzC> +I.=(‘N(QÎuTZkX2:7mRpU-& ɥK}@4|3u~"`Dz*~zR?pZX !H> G=;iSP(i*QhS`U/m$m#إT??N 1Mjsb9QAbm%;z|]^۾Xvn'7Եekf%A>8: ;G'urpLaE5//JGe!QٝB Ռ:*q**l`T("Tp ߠEg K EcgG(Ju!TȦ6ţo [帜1@|hS%wsd/A|IP _ʎ (ͥ2JGqI+`X( H]ε]"fdmdiD`l9P~DK&~"F@[GV7$Q>uvRBZpҹ#^?z^ih<} +-#̈P$mʼ3o|&z5 F,QHSx{ :UR_Т#Jhwmsl2c!8tq.!F!(S^8!@ؕ6~|W} n@ j<[ZF`ђĸr(z)E6}n=wzH F4Hÿɓ&4\WFk+ RiV + +f(ZK6g/(g$k L:-P%} hqYWŐPv(;~mļ{φ*EY<.k 1. ETE P G@ơWPb-$} %Ҧp=U@$T5T; 4u:ÍsrHh J^1Dt)w)1_KJoDDml+A :cĆD`c1C~7^N`F +R G⿻'gAHJyoV8&=b_O!QkH?z^H2o tE5zx?eL6fwgO@dTW<2e6*=oη.ŽHpN?wQ-$N@aj1>w]QeO!^'s+tR?@OP)oyvTBk( +"˿)b] fIC~Ƚ۟ch<5OVƘ4g5L-m ~,T)"n}_|KF"mr&Mʆe-aǦ,UB A&T0S`bjg~PDo}>yPizA٣L? 6 ~C7zP#`"qhKqYCAٍ&{ +*٠?9& {e1qR ZJ8]Jh-jh.A{ A'd\R|djFi^rQbз6Z9'H!蠤7L!TN +n5TU֐TDv#T5$On!cX>Atts>ŞcZ@R`7`܁ @&pMԛoJLnd + ɿnW]Be`BQ؅$$Mop4e*xn0#v@r^ @VGeTPi*5P➷Cki,LYr;)!,tV VP&@'wZ +b9cBETܓ(`bC@"ėZ+$en}$5 DjAi.2f nmIbYS%%zDcZgXJ_x2*HU2ҰwYno+Z7~kc6}k6 žEg0 U3{h׷-Vn H7|]zfg  + +ܫ>21Q$aUfq׌ݚa!Ԭ/*!b. +fH >x٢F`Ϩ˦\jĀ&qzC2bZTlMt#7 ɋ{, -TETKCRIpSh78ݸGniH5*S& : t0i5Exe2zNy5Q|eȰW6,nQ@7$P*eQAiQ!_bB8?0Рذ`Q)+pH#i5:๺h.jH !{}11S`.y"  +RT颗:MS&e`b|ԡI]j}H"h1W̳^"x + +\ǪҢ tD2|fa0hڮkD k*aET khUGGȢMŶtf2G_BqR9s%*{H U2Urw_ˤTFuUXIPtNv"љh&0dXz63sg~wY(1sga<_]uq] W +7 D ˾<ie1,P"lBQ bm EY*E,VSy  +FFpNS7Oh R(G%—Kt"5\+>c!g2KeR[5T D‚‚b޺bʒ:U1Q{Y)Akh )xDrT +9IK.@bE2J7H3i&T/Cy7_j166DHOlmleo3 . +'fi,24)<2+9lV + ZLʉjS~*ER<[WP|t hLEuϢv-D1ZRtZ!*zi4# ?B0,{%)}mͽ+3G0DSHB ;v-j9֕À@q!JKGàaE 8,𣉗=p1 s !Ulra#DL@A؛T i]LiUd,}i9S 2Є.?|,&Y ǾYiPÞ*f/̝8g8{sfmast4#̵ 8 KCm/M;sayW*bvp"|-#8FC\[nЃCFܚиA :/z:0."0N ߅ܡ(./5*;:z%֥6CbYJ>fzXj#W+}z(yC+TpDХvfU9P 6)sgh'8ٜFtahزErQØ'KP:晼,a^a9s!쒉0 +FqX`TqXTP#HyivR޺:tͦUB}1( + ]PU?2'Iy%}vB jg:ukwnCM^ \Assu-ÐikD +6p6p& ܇ RO 7^0rr+Di `M)Æ>F]YHRpFqE +RDފ zˋF"͠'!J9A>κ)`Hõ&vJ=7dOJj35mF Y}50dX:[WP>z3ך;Pŷ&l]0>2 ZgIpz]KC \.57¾MNW[-6h,'XRSG,i5,@" 'eZ`Pb05AX,0%>>.$F0M mH'!J饩`P Y('<ݪ{&-_2bv`RBn0]Tmm3!Tג&͇Hi:Aah]^Z +]vL (E@0v/ ^Jna Pf$4 +ERwF$ HHuQEE׺`SN\6sO"f0Td0PUV|6$*BLQK`[i<K.%$+9~>e:9  D7`YߋRw;Àa,H(@;*[2SHD!B1( +fDb; I +חѺO)tWn}Cy׊Ը|_ODo UJe.i H?'o"([b`-2pY;(-&uGpn4oa8:mV95D}H4p Z8."@:#6JQ ^[IbN* 4@v0/2v#lF-em!vIA e- E  5Pk_1 bg}EDS{t饏6!m! +LIv!oQET8'Iu#,g2sct_۬ӵifű4&Z93/'!7XǗ8Hc']"_<t}x0jL"U_+:_I2 +@$'r/%h +ODCM\7WĆ@@ˀMm) +SRx0+'#C,XT^dNdx2V6#֧[gSŜd|K_l Fy"/Æq8`i3=+E_(5'"`l ,>Yc r ]|@B(uBCʙM +%n!cm-6MeĽSms%+3d V1#XX#PHOxV5e%N0͵bbςy#>o\8UΕADLܝ)eƲKYINvFMLh5.!Vu`2\tqrnqS)3q!.S`cxvFb!TpWPee"B"dBdQ17%4n^T%oę0)- [N+12g+Y<4U=2Il6\D_Al(G+H F~=(So6xNТ +fd +Eeؒhؓj C p)-\-<\paXE%[0fVlǰVR|kk zzK—Q(C.^cuFfaIkeiϴF,Riٖ؂AI1KJ@ZZ.v`EY#G)?hVYհцp̸Z#99*TPU1q H` 0n!"[I%]O%`B/_h*~סfL*[T5- "G:mqB}1w`E*Ǥa+%IYMnLz.+~J;oBpÈ7Wv+4h&9MciTIPxű!`4v D0TLJ&wN 8Y3i!&0?t66k`̂C +΋ߠ'!3fGF[zcec +2T\x9&6@VMP*jvE mrWJ2Y.+]Re;2Ng gZIݼ\kE'^^n ĖCNSǼDž ҥgȢVyK٢t́U +ݎuad-,`Y\G0RI1>|FX=q;t,Bm i)| -݃cNz)}z1p[kżbƲA{2Њqa!Tj +#Le+__`1D,Pj`iz1`| TO5J]7aK Dƫ"%`b } hP {?iwb&]I:@ Z52`e K`;LMq.lYh>0X*Aad 8։C"O6@2)F( 65x@. +MŅ/CF/[KuRPl +aX1O b DgI})l*\28( s+(UqZ0[+ĠIiH1 Wc$[Sƪx6?n,BH%BTC)^灊{-0("ădndt7& or,b)82j`.=d?dTr}Ш +)bK!0b[c&_lY`#OKWKdVV@0Ը1 C\$-ب0^OGG; ^$ĕdҌ)>;4u!1a!~GD)"Zk)DKY*fOMP*[\ADm7yu66a\eq-q,+bjYqMwjiO BRx$N-q M86A?Ê}p(A)3!L1?)&) +˜H1B)T=b]X^ꘁp HJJ0"caCRF+0eLi)B6_),q0JuSĕBGp.y85?!~E90Uɩc)FdNz!;eG.!>))}#A{ BWW1 •YpΞ3~EA ON'ĿpD! q:C@M7p+o!ēA)]d DY30Q4ɔPn)LrlN\Ub$CfFh*6Y[%a,DE,Z1+ЬbW(q) ABBPtĵ8O3q:G<*'wxϕpÁx ] !Y)ċ&.GdrTѡI#G'!!`N6d(jp1/*\;L8&$$U4,egI+HoV.TQQwsħpufOp +e6V %ˮ&C>lXH!&2iSyiS!2"LG\Ulv R^TFA< q"uijx؁%/(q+"%n q3Ep^m(O .r%bf7Ko^>4=hr0QD#a 84:q"~4R+w;,sP2t8MgPħdxOp }x;H;>obz$h +]]D]ԋK鷈p- TJ y}HDiYhcťMI$q(MGpIhCīp ;v*YAG|cģl~ c. +RUF;qYW)D%kXPHKS0Sb0J=Nťp75`cJZ"дD)^A履;ؚ6{1(8~ C tIN×b9.jW$ +,hb0L1R#F-+ {Zz{(+d5G/:n`@qhē41"Ƨ`<|/CEĭ8=6>3o Uץ!o40?r`Y +J胵 fHLo!;X>K!$Eb'"JZ8jl + MKCtgtx:܇pu8͕5hFowre)7ٷ_#!#4%#aZ.d$hiDȢT)oQ.O\?z3T- $̮D"aK0bіP #MIVD%9c$dG/M:Kf@F%]U@%F%ݢ[@:t?yhXU1$aD(Uo490U1ݎ.isPJYyJ + \,(/gsr\y'Q0&r#I~Ў"U4xW2*6N)L +&;;F?eB;}ܗi3X/:5:iS^p(3|ἒg7ƽsxW}Ow>[_7:e8n@Fe*E7}q7p5haځ)K)O)OH {'yvѥ4֏M٩4idF#xFu~Ag]B$Q)I"H &аi4}jrݭ;PtOʚi|dȥKHKޠH>8sO$F@4 +v5l +%RY5A$љJ/P+)$/~W;(i51h跘xQ'oò>PZh =1yT)$=I@z*;U GU:9s'|)} >`\]VQ+)}2%بT u>aݯk{ |ROP7G'av?c9.2njՍ^%cFcYwt=HRK$}ޟ;1iez\- ?A +Eㅋ@zve׎RE@C\GZ阬i'&l-^b-r +F:80T:^Fàb״ YYOp BxJ0v'Oé4~i5gi%ϯg;a)_МT<7OM +T)9aKꇦt@ò6@0HOh P4( DR C8!9^7 +G4k0';AqM)14g6 Z8%CPi]F`T,o)T⎠ġ꽗8?DV#ez;$ouCWX X8z$̮o V@F"~( ߟ+enf6H]c ?` +[g蛿ZpN5rn0i?@jhE^@rn +%W>0Ikhfy닏i׶Z>x5w"@y_mD~ME:amkj5h;xK&bGNj?PxFYV k9KЁIOX$'>$sԩcm$=w R,z(C[*І*ET("{'xtX84kAj$} Dm5D>ý)Vү'iд4~jZ&SoJ⩭Ps!4nT:8A$nM#*nۉ +њ +ȾF~w%ko$Dsm/UI?1=uR% +~J7PJh+a=yd E.hb'0Ay&0;_9/z::38W,P%~LnLN `_C[WqzNWΨ;$1qdZ~b֊&vM-I@ -8}o󭳋"m.yl+g_XI)g`%E,1`PFYI [ģS20'4` \`=4T)VK)4uk5 D}(C"z)C{ +G?UbAuo2&Ռ.#S(f# qh7 ǘ2 Mĸ,tN&@F$} UG=6N +1yAI,!|!'uWY[ِP#(U-]Ѱ;Ȧ% !ThxZ&nlY0eڬ!mEC70u+C-RA +F@7S(?i|49hO.Gv^[ S6q-/ec?2vhGߧ1Cwv㟿m\5i4ڌD&/&mF&$y +P@^XFxXGߦϭkAR.ph3l_ 61ndtޚSSI-m)h( S%}~K×clV1mct]x3]nD g=zɴۯs~yhN YؔH4i,$Z.+sXjSvdQeYNVn5\FFiZJ.e'8r\[GBiX<.+C*d@~';p G8;=wУ߇"US#f 9pYNܘĘwyNi# Rf;y0c5}57Tpe8(;-%-VRd_ТG8ia_$bcֶ4~t,Llp[vHF}Lvk ϊy0e] &#W62vRߪ& RE\rQ\Li)IeM8۠!j3Zh; My"Ƚ1\ߙR컍$Ho{d)h3eL_hrkֺLܶCCz[-G6m [F@edLQ! η2sgrOb4ʍpC\?ytv},T{+g17~s4У^Rq3L!M +N0~*kV0FK-bB f@2Kojý鵑*5|l}v6~iߛyc Ls?Zg?pZ/D=_l i+!J(`E'ܻ2>y'|'wba,ڬ>w)O`YE&?S!`+@yM{u#[6zR]lHdl58~%,Z"M|wFsm4(gK J!i7rp1J7Sg^{oE=/ hu"-5pkeC3 +nmӌpl@Ε5{k5vВJ{5I(s8}GOkФR',GafLɩ aFسvT)DI2p'w΍ EB{$Ս$̮2nmr!Re PݝueⶵL\Y=wck91bs +j xC"z%̯DL=VD9 =}oܧC8~q;9 ^l:mk#ÊA&v&w(aeҰEUK GI4\C8Lp±krjwq8;kuqwB4)GxZEiRF;(+緢QpuTEO^jl uzhw9,ټ z~]H)7Gs_p_ۼWckfN{&L]&ί7wx.C|]0&So`vk4 ǚh:1 2{h-"8X( J](q芙#RZBւz*K*~/wpȆƠN$& +E>g&Ϯc} +BM2qef'X\JH$H%0=SWV_ۼg1W: f(^P::,L ? ,7&Ay4 n48WFÔb0i]CXPA@r)鴙F^&L{YBڨ25Iݏ Awq?fL;wYV$xYA6gMVСO`4:LL_OeñDP_wJw%ѹFW_n,͟i~lH X8$ήw*w.iѯ<`'w½z7/xY1)94!'Ь*نU/gǼmk=ՖW9< ^HB'a=CwF7z +B4;?JL]ڌÍJ÷Si1}"Bx<(q/]vNݭ،Z ׭YT  +}h{u`1rdXH@z$4L7yy}ܙ86OuˮqY8Bj_0Jߥ@yX7&mϰ=6Vgx":gJ;z &q8p *p`j0?6yNԛsL#4&r Įk5wh#L.]5T+bjZ[x9 MyE.'SC O`X;2 ^ɏ$ٽ6 +I"!%S2zwM|z B,k/~J!%Ս$ +B} /C4 C Q:{B5`ڭ|\P#k>5wg*:꤯s؇|}f K&pjöa29ozmQ|jB~wbߗ3X%V͙ +G@`D Iޛ ^aH#q/X1`F ӕbDz 9< +=8;7|t]'pc2rgg-ŰmkV+3WB{=u}

a +AmQ'-"ZA/&$>UUrgBM#C񼑤 i_mlصmqԣL$@{s \YpEw03{hC8OM}SF:wBIܓ8IqĵJw@ UzU Q}Mʨ%U1QovdV=*5 HOC!;(aKNGF(xġB|>I}:M[q60j4Έr+i;P%BvOcHG1tdX;)4L&Ø09,b]})(<1(B;:&nL;ri볂lu-Ɍ[`I'av_)bPxOAuHb_`kЬ@f{*l*^Kgj F`S\T fDIރhW˼gncڠF\Kk<wn 4}'lW_~ǂ@)sB:(bM66Z )zhcRdx/+$&ΰSpt+31q_ 8~cGpz3wfumB|'6Hqώ0eڰ/Ʒb]<~3|hX.BCTs am2gDюVA{tۘ6r +h\ ެDmCSrTXOc}5l(LᆸvSA3 ?0)XE;UTQv\;^zpq̣iѴ0h6͇7qUco[l>zHAσXWԙ܇}ZW ڼ$Jxu#aвqca=z`mtkj4{eŮqLs:ҩ}* 8G&ǴiuvsL :Jz'ϡmD)h0ZJo!Ppu]jApM~MƮSްTb)KHKyׂq3{kZ#M9za\C87p>yAe̴2rf= 'äbAzTF('$`M`CS6{LB}u] H=~csK&g;?3 `0j:(5'ÂY * 6nX4j-hb Vkk%r2"[+Aak%%wL)C$2sæY[tUNف  iO  6,d&%lVJnXR,.HH*(c2ve3[bJaj{yS5}lxh&ϯwCf3{.~`bp44;pߴ4{nژ92c0ZEN+ܝw6ĵN|K]kqq0/~k +QDAx1S8iC<'@؝@C}^Db21o'+l +  F֫oh>69f {U +A} L݁ :Ry #-4W_,LSa7\yn!?y4P7#uze"@Zү!˿ڈ3fB%@4a]}GQJIdsrBbZ} z̚}T9KN /ZCG||`Ta19iSO BQ$ꕭ` :qZ=pf +`b!dj.Q&WYQ02 +TďQѿ?hI,ջKI9gЬd\j+@F豙]Qjo}%m5$OO0)O89M1rgX \VHDu)+mvR׹ +;dC xMD<[2#Y3YXX +P`H0 Nj s@8 TGfs $ӦC-'s(~݊cQB #t Y3  w_A ~2 [?9/2 _9䨱99$&l LN`,rrXCv2M¦E~NM!=E+(P"3aOujgN2ߴ'9W@ooK]9&LNg>%֓k0 )nZp,pBqIvTć3s{+z$}gESLNYO}_ǼǓ}WYKrQpyQ:̧j}Wxߪ<Ʌze!D_quyUsVМwq8y=|󇋗WZrKw$4Th;IYrVY#p1g=T~VǹRYx1,I\ |u +H28m6~#rޓiF2j1Hk\{D??ĝfAQ,%EĹR+_ɸsC@G~T}pXXI0%?@gAj&z\W0~ـuKM¹1͡v5z)3~|~y~̖ផA^՟uUt/C"{=,f|o@qwVߌϊL/?+Ozm:=/>rTmY0vx\50"1Dy)7裘GA_~?\0f]YtD,[׾vyA?7NHj_y(.l^PuuL%pA_4Y3w4O[X{2T,DZ-$XeF(Bә>%͹_q#.vݘ~ß7CVХq6l=s{{]jZ"jn58Y彖$Fgm4lם:rG!xE҆p?;6μZ,b{Ց9/gE<d_ޱĜҞd{ƧwONݳ(4/r+ś˅aЁ_n|TtJBYt +!ɯ3(2$lvr;VRG ׵}1S r?>BҼ~0K AB.!;Jݴ5EBFaWwջ )nNj&6{n%6ڜ:9' DKV\#da +0$$krp:7 +ɋ **QTzhs83Ebq-ɦLǟ>f_yl̻vP (0/goJaӁ.~gRӈ,QH:wEKZ אc]ԖMj}3[ayK}~~?̚]J8s\T2Y3s1!/k⠛fw~W#2f^)y'~QS9H)7[jtn-G#*î888퓧MjX_Nұ+*%Pko;crQyu= iXEZ1vk2Zjn=hy<w)5(OLiLwOdl$o~g>rʷ_.U4q`Mm]fi;Нyu+-=;Y}az+勣h{80p?,7,CS60".m:&ϐy򫍪M瘇!huʍ?NE]xHI>#4}OsF'}Hjw-ђ)bЕEb=1817$y;تيZ"CcUߗ1kDzOsf%]rͻ3msYJLYCb"8Oh/:؉]!M{ #߸h"LE*|U1J(ƽh~ݝ.ĸb0y[ C_QJ]ƵeSf4t N+ܭqJg9cJÕ|MN q9aiIX .1-UcMYnꨃ5KpVYֱO2P{Xkd7/\um-1 +YXmPR uitqeP0gm~z{^)Y:dy{͂NY^QU-%=@{XAuMAd&+sl4j)f5R+LzCNL\z9WƬouE[#HqŬ`| ]RIݝ2nut>MS\3VuO%v SϜ ͷ4v"aC+zr9V:yzΠf՝?UdIU)D])2 f +0-)-5ob_X}Zjf`L_D&< Pe߯xn{Z*']6!8LF6H"ozI ER+zʅebIJQЅ5AEg :7'،:WAهBV'w<7h^@ln;߿˲X0\q1-{Ȏ( +u=I尓DădY=ᓕ'Wc_C cM)x>da播3, ?c S|rC,^_ D +947a41fb1-e009-4cf4-b4a4-ea0df48d8c30d418b7b8-2f861-82a3-7abeb7d7adba 628.252387d38b4ce-66da-4f53-8c9c-60e4a43907175d631255-5b2c-43a1-9dc3-e25c12f56589134612525 13. aK!"<ƶ a4V3@Go;UsDhS "xm *:7GO +6djy57i30303$+D"1ҍXLbEDD!75TjY1թt^H68cFMg^(l3d_L9 IqkEeh\!L Uy:wۃ ExH +D"B"G"d|1UNI&$;S +cqb64M<lEmhG6惋X|NGm@A"(y12C9Bc!3CtHv,B52^T(r A)Djń('z<57R}9ZP'3 ѝ|jU\GPH6@Bb@"Rе "cAx*USPAЛ:Z3fTA_edM +Zj4|,UC%W#g<\<``AfCzO}"Gy2@@(3_cDL K'`|_49.I&ϤM_V9V´ xԼŶb'lEcԚ'uj$zN#T/.x~ܸLAEcLJLFMSY0N)g!q2*-۵sׄ].IA$Y|J|Ha0QyЄQ}`[袔FxP=h +=Oo_fP}fڗ]ZݖV/gJٵ=lN:x Ao b{ӓ[dw#"@E4~4DNߗ'3 WGliJ&%+E6DI怳=V~ulJ/?Ɨ rm N|[I Ӝg(RWR{ ຀{cဏб"VP'Fσ堏#i +$U"<6tը[E?pl 5/uPQ@my)Vm:N*|>0Q2ъ0c-^Y)`\ 2T~Tf (\E#EJP/5vVanG戚b'} {=H<.Aa(YORsM#]@qj/;߈@* 7! ]4ClD4Pnb4^!?rL  ,Oe愈I% I&Mx`1Vlz:/[W­P>K@ Fwf +<8iGah-L9X&-S}d 7 <8X-Fn::?ߍ2EGIT}FR/HYd6j4K#ir58 5Es12: fmc56!:$D0 Sv yǢMJvFbP|q_-JZh@zGߪFY0"x'6?e(;Xf(_H9i^B/#DYfS=nj`oaEw-t)T AA.*+D]'[J.C1u_;Tveb:P"|叙.y>MێT&x3Q>Moaw%)( !6줺HMꦻ-D zcpKۧt.Cn5fŞ>H W0BlSHfq~&= ɴ'Xv m꟥#L(|PBbFm/>+*Hޡ J!M*\?]L3zRQ7QQF$\r18'.FW +غGEVEn{q6!1BAIDU܎ԭAtP YEˉW)Y.͛sX +VgF sЊ}^Z+ŻTt;V;3ԣ[L1_o& ;:oj[k.X%o)Hͼ\v3u75۾zHz)n4Ph"5b8`3 š z)hR/TPMg\M/[֊sݕ `X̽d\4uO3#XBEV-ˏ]ܸn׷cn F6L#Q6d*ł-s> FwP]Cq.LA`\ [= ݮxFEvp"($3 +Qfcx0Y#w/eŠ]S,u2V}Rg27ĥ 9J.TӬe \VԶM3H +V?*0ڟ(VT&WT)SFD$3dbؙfk7 xXh(!ӕF33q1*u9ąN&.ԡolSwf*{+Jh-~ܗ12!akGCrFUiɟ.};秝/8~ .9e!vL^[q6.qܞ8Rc3 vƂ>fZǑB055^2/Bkgzm#pLʥC%lB.@|_PDAlע#H`$u8'8G0 JLc!)&Z.lcqΜpWHyMy뒔͈(\yٖ0";f$Fh_n78݌xƋz=ѶUE F7x@VeVLOc:j1=ĭk).aQq + +SR^m=Ԧc5*-XRQoXu@H)UawVtjgAQOv:DtcL#]9UztA6D,Wsg\ѣ3N-mE>V^3ד2 meF^9,0R[E *,a\%k>~ƙ̓C1PވZsчWe-Hgq ˻g> JzwlHmV(Wg҂VƥpD''5uC3a7JV{;譈d,uSch9C|ֹ6"5ѕwlyrMI-SW3=_y<`$T> Tfx.Y#5˭ + )cEoo5ueUJ8FEXU{'`&S7i CYM ԂP-ƾ]n}%vFv>5o8%UxrM opuHku3 2_,RBگ;0W%L>S~Pt]$iqDw(&3㲲1bDK#-ac],@ Q}rԚy-Cp6$D>X3 +؜" ?-;]t㑩n 5fTUT7;&mo@p=}Z{elQ6xmbRC##ߜkO{ҫtZCeFtؙ5uG w_{ysN2 AПfU] x+FVFIwJh6$q˸֓_ eY.A'4]@ޕJ@^ۆi`L9g'ST c>倕+V;GcY>8t"N +T}9~B5 HoZxZۦ[E! &UOJ$GA @"((((@Xt -XF:hѪ}EbЪTv4F( ) + wo}wƚkm6_߭;w㋹{9޸j|zvo& +h;24J 5tDK0d1xdZfHeF]uJ@2StB ԩ\eQр(B9|5UOh1**ՆQTh/"3 + T +RW(&42 +vsT{}^o4"gE)R/;K0TЌTJЈY#h] $"B_MbPD.PB#)B%34ME.JRK+V(dH11qK3P' Lw4jiTS ",eO mi "WpDːuV/4ceE+ Q *A2Yp#F8^1RD Vh S% +| eʎf!)sgPy}[]{;͔su{?lj3C*_}9׷:g:g]v;6p}nW5Θ{OȀuQ={-\WQ۱P}9}^}j/\fU}3*2]ogj[1~Ϲ33}˸v8׎)wlwRfGI8ϵkǗdo702GoμK/]14gsշjL/r׶i\ts2=wuM]_zyTuŜ{n;?W{5u_9̣Z+׎ޕgէwzcz666fklz\;\z3Gwz#n5ޕc;ejzy4 Uk_e[o~o5ÕsZ~+Ͼ\?Se_9m\rMyҬ uk_5x[]/G׎dz>WyTmRDe{sj3ǫTswh$ڝ^qw1}q{~63 y3e7s^Ƿq~vQQ|K,#řb/r߷s~WyOnڛ]?sيZQ/hWoW{p6[Q/5\KG;=G=W+o1G9ξ{ v{?{9r.󨧜zoLC}G93~k͝Q5ƶ^f_s[_/ӗ9[1\Ts6H>s}yiL6Ӗ}i3m-󼷟i3mYL*JJsX?;^=]R}}s9ܟQ=6ӏ˼/2/>><|?w3fe|sǶz/׌}gμu{>c͗W5^_]\isqfn.ޖWjW՜ssvWe_Ku[qrӾ-s{sl7MT(@'H3 ĴuǴ6fL֧δY>p<ѳi~RrUM@۫nO'7JnOS5Q!e bMdL-Np6f2mYR2mm`Bwyc}w돱9z7^kg[3v|\or߮k뾙unͽ{~6ߛ|cުyls_Ws_}(rߘ;[|w{gowc{1g^m[kckuw[?spk;G3[kUGs9sw٩R%z5c,3ɘ@(i(T1|2TIBI*T(}˼}9.l\rs66&Ni{9z{^-*ћ%of>s[ﭵG\bl-kl1\gZ9ߛ9ߛ<=_sL5Zsz/\Qykv{WQJT;(89S{QQιyoV[[-c~wթ19 jה_e\qrqw)./8PQ9NqgŘrQ)?\3\?沏\y&!a Y OC":&:G?z}P4K GxPpa=(`kTӗH)T>' 2 ,ǑDz"-1\8`bˬ' =_bԄfi1)ҕJ,Uӄpoks}9{ޭykttkKb{clsuZ:jX篽jq^Z[:~v[םn/ߟ{-͗cl"}-9[kom3>_gWg9cuyQmjiz[sk?c{9olzs/[q{-Z:;{ݼ̹QC{k;k~{=jw֜CƖ}q7_-f^-w;ǜ}kmt?_kc}ZyZ[to}w[~Q-3/qv{wZz;Zl7c?[:4kAܹj|ƾ1y__-_noDZYl>{>۾8ﭿe7ֻkT(]Gid`P (By#J6lwc*D0ءex@w5c_ϙZA(x@ÒTM@ʻo +X(4QxJQhH#ALQYj6]GA_WK1L/|YxjB#.qtN0D}[W-vۮ:&BC d^!,Ԅ@Q3 +B#JW_m"JE,]onc|/Ɨoo3b[};WZ/6q\Yc|6ۻu޷{\3k5XWK Wxc_ lJ߲|V0 DbdAŖ=>1а D$XErUB,BfiZ#q^eUK+9T OV1 ,pF"HTiQ )eSD'Iy +RS($"8->1p2HPQgEE뾼GG*&/c44TS* Dࠦ#9&N +[v7OBCY"E*b"$F| 0@`>J5#&N .P1y@%V%T*phP2[G]bP.ҵPlRlX0A4 Dt JpR+d Pa  (F'Q3jpAKx[dȆ*QOT [A>hArBL5-)|B CD1"@Rh@ +HA!b3 +U(hEN$I >I1&Pzw,"A.!u0bL@"e[|,2*Cfd0gZZr 22x1t@J1L +L8&.[ LA2qX.%BrfA ,(`$, >(V@ +vb ,x<R߄|h4 A`4q +: ,<J 6 Frt? @oa z םaOw%p>sJ]BR/!PtqR߹tÿ#d%6MPfLX;+z,ȁ"t=*+"Hɏw(LN yxaRwOw&XsYV" +nl% 'Yl#tX1hȶ E袲 +AD% +'Uv#+'Fe|ӀVT $e2kBD7bX$*,I8 :7lbx18E +%&( sC ‡)]lY1I d05Vh&'`b"=L"I<%bK"' EH>H@ұ GB3%GL.4d"eAȊwPZ515H5)0HhU"{D ! Ah& g92?B42A|>1yG+FAD"zFCC`Q'HQ܃s0sTÕCt:  xJ 8  74 `t퀹ձj=LiJB&5Rl>"l#C`dN@I&bs!j< db{ڀ< F*- tjEշLDe@e^M34M#`-M(Vhڀ-3M4M1KDѴ eU8m!887(`DTa"48!452-9<&b@ങ p6!*]`\31MaNC qm`ybnM@ťb5\\N4U.+ m4M(e14MI4Mdꣳe i*04Mc@4MA  @;bxh lM4t4ma4m\M iZ)i,X4mhme1MTD4mb ?@"#4` hfJMS _#A5,rTA3uheHTF +];9`z+fסU exm8 eEurX +0/ ffO`\Xv8,QZT+L}R/kgq%5A/2 ^XXv` u%]LsdJ0a`b2C QST44ct_ׇ eb&E# 3F)%O +$%K>stream +ꩶR=W= +(MR4u,d RR5z=`⡒\gN cL0/}:g<+SA+VìR=Cø,}2YȥǝT[: >%0ȧ 'l4 Ŧmن$<\&2l("%@N$fpDC&P4Hnڠ҆QR^*[0pZk||F +X>H69 + 4-!], +Y #5z(u4HAűׂ0!tkhV`U`.k P4OhemY`Q4 E{.m8"g8mCAhLqp] ƄɈ" E&" LlTW1OLJ҄(z*dJSR!*[$вk$$u.HZֆBBBB@\+NKzۀ+<۲ h+\րY[L`wkd6Ѐ[XL`I&gX_;Ȁ.$:ȝ(.fe.[@K}l\}j ɖyʒea8 䜀`> sw"c9W")[j EONc*ux˲eRZul5-;%a#Hl"ҔU9C Z6s:E0!-Ӕ@ 3р"nRnf&Lli": ihBVeӄJg_d$wRe5$fQᱡοhDc]dg$wpeCLHWb+ues- H*rX$1<4l6$/zee`<б\0=Th9 s&"z@"KG4xHGϣ eaQh-KX@Z貌,xC7p27+ar!3JFFFr#'Xi<a\8ő(qY1u&M̡qa4hFaCpP0X<*],e$_:$,^)\^0ie X Ͽ"+DŽfLЧÖȂA^0YAHx&*1NB)t +ÂK.La#/\ +bfEi1,' =Ӊ3p(H&l2&'`?D +~‘@H0dMX9106 s{&@|ex-< sr8N)tFpf#dωh`@kxx o)SHYb86#׀k0`IJܲǑs"VV,ICD d2YV?k̲z N-cmo $ő&W"Bp`:'xf& &ecr-sBR)Y@ + s" %Ό$9a2-` 2dN@ޏḑNQ҃d#e褄)  F6L-KI_hya$6wZ߈78{xgaݑ AH8 X,+ZA2X3"UZa[&LpAI 4e98H"X&2`1NkYB_4$%A`6e\C=x3"i&ʈ)# +̏G2ٲ׃ԎN nxtlAo4v4Y[A86D_ނ0AXe[hp͇ &"DVJ)0ܲVfs9PO^Ǜ[p^Le+/l o]GJ0CCL:2/4AFb4di);verxO0Z2/WJ,.LIv- J+jtYߤb@#t\`ί`PuđM`2K]OHy΂k+d8`7&M$ +u˄CM0 +BE`4d<؜ƽesoj&ē L$TJ&BO@S`Vk"Me Oۯ\pRь opE/@h~Bhb`eV Da簱t*gsP#38øJl82A얕{@tB *7!^JZD OUdd:` +kT`ຸJmtCEPN)T3"$0p$ɤ vhjL0xRB0GáHGbqA +dAbsmf(fj`BR&ʀv4:YIl ʨ}_`3N%J˙|>WY>AAh-6S pHe(E$v@טPyjĕiOY.$%2wKa)Hڈ%vs1+-UȔ?@,c5b_ +@떉*G(qEZrt}4}MPCc :뗜Rtxn1y بlDV!j/V9?O"Ƭa9أ[t n.uT?VD;&TR_#!~za{dQPIڲfy8Ed}\*Az+TSA̸a#j S闉q}HoɹG'FqlN;LwsG҈ysSYk&!5c w#>$ **'l2(ʐw,JWzVUuF e +CtK9˗KQ[QDt"!t$j]ǖGƈ +7kӥ^򨕧(+$ت|B=8-3S0&@HN*1.=T{BGN>qA+ Ono=l٭dq%u@Qjؚ3hZ8 rgGJW`* Aj{Zb`g6̴ɵ4gxg`ʽ+5>x[  ~d5%aܕ8E4\F쁣zّ9nTnEd:{hXbͬf4 +_皊GE\ ,zb&> v`|2k»Źv nwކh +m6u[kЁz:Wmn |(^tr +t7 Mn.Ee, ) +nH-Tx%"xG L?> LY#q̈;,q $HiL `h*ks X*MK֤b|]|XS:,jzWO+LVz݋t5Ɩs O{SqڋyHW|릓yV6m#bUK ONğh<|sW#?|,X;b[e=4ab8UQ$*_( BF/dXBaXf#Fwp9*_gvf ˳Ĕ: dBA([={~eLc +% Fh_D&b]vqnZ)?;`^fCYf;5MY @ꥣznNZS`Z?..,\q*|xeΞǰ=egrX>wWl-IUSQMYV#^j…`) tm|bPڦ&BjJ{$UP }7(:qFBG4|133 >\I ss;+q+2 +C#̙[o#R߭,1pZr=vaeVNos4j`IOEu ! aaظ3 + OZp:sVٴFF!23bŊgٗdu8]!k ^^]I&|˼-Pɟٲ7~ΞVѡoayhsds6YIks~u>)GEJ9CX@KS5५$hn NWͥZ{Hc@2m<ACs쁝C)ǏH|ݎi?  WIL zm;rB+d(N[YFH j_xJy `{MƞL1qZg[Zn/(ȼ[5)ci;:0niu߹9qlڎzgifl,ye_YbFyo`#gls]^+z),ů8.k,T#ůaU4(6Ol|(֮3P.޶-/xRH[@z__sB-M\ϟ!-+y#LHK8csg-y^LKU=2t,ȕ%a YkN`΍!bkA +x>ifs/VG$>=%,rdU|ߋ hζ̠Z;O}UE_uմ &^iJDzpq(^,Ko4(NS)Ub8gWɮ8QUqG& FkFܒ$z^\b㯅QlAkC MŒvՐCn(#5Z7(* +[\yC=1tnu+L2K:nnN܈` :#lo#@l)K;# 4Z/?ʺ86xL]+t` )>{EAO#~"<%D1~펮6U +7 U Ճ> >[z01=% :YF%{[F G%+YدEZ?k@ւgQ?,Uv4 z*~QS@#EU,ɋFW0/DL u|MݚN⣷ C,=ia 7853C,BTJF{<"NJ +Ҋ!#"ă&>9,dI״ȵ[WxA5XJV`E!0[COd cr0DJ ii~yƴ.G0z&\j:Hz!w Ro0vhSչ'zr"[$Y#$OXL/K;CPZ}0rSp *uƄ.7ae0iN:[ghb, ty$-lLoV?16"JiIPi|wJ\+QBn/oyQSAٖ$\G sp6QS L o3DlZF@ h%4GL!,I%C?BR/V8"8ZwRIl^BssK kN R?r6HÎ@3jA|!F^̓ۑ7D XjʖJ N#߿hiddl!JFx[ a'$=IMb'H9֫'[sI* hT2܄JMk-omjCɨ4ؽ OEQF->Ũ9'XzǓTB$D7c瞙8emK0" 1EfB2|.(eˆ:q1 6d o5= +MU3N/BoJV{Я“!2p NʋӈG]  (]|7(AsIdi1F"g Yh%Nwr$훴t+nZ00eq9-PpA;9w1#XJq,8+#g4bPm!$| XIm(P[%BE2RȜX{@σ}8.BhP +u2q8Յ<QF(dv{m- wb*a^Z޶W7w@7(݌Bt +\ %C}r XAR7?Pb| |AۥuZs+oV|&y-bɶͺ,:dr_`eF_L9-f&Ч:.U)zA1Մ۟F2 ;4o +})@|Xm>Z?*CfzϫB\& Sn |p!%%n6sE N.^`# ws(eVށ)B)zHi; +zT06 yZc  +<ܬ: lBbЗgN_U󬝞6YuIpJZԃe*FkR)# +,۫E϶Q2́KSE㘋0GqfM@&%" oQ^\cqXpX IO< jưt Ķ 3)l%c@VQ(`8򧎿敜5u[B3GsSKqH9D(\FƱZ^2TK]3FszpFՑP"29εcT<u[T5N!!A"<1c0F/poGeģU.CڄeGlVtϏJˊzIH0 lnBa /P(ƚi@:۪^$c/"F8ԃF13ZR\i8U|P-AJ%}AnDj,/r,|$Q*J{zpPۑR 4ÿuV'̇dai"# i{y.ㄣZ7rtPP)&ۦ*~,-Karu`\UAϨ{Y>GuVwPNpM V8ޝ!adl$n2w!sU^*ZߺR9\ eڃ,1]9B HYBhIM1lw +Yn

)xx^=\^F~{uq &tӾgSEFRω}C¿bx(C{B uk1}p~P T\>{]A\޲퍐W3ȶ| ™pT@jԹ!);>j1#- pm ^vW ;Z0GtD3T25U+y05!rx1.m$'g>\K7@H"gTA8#ˬ KW{gŕiT_œ +ru ~#~O-ʕ +;ɛy*]f33`D D=N$!z y^ٻ@ \nj))Co@$IW!nY +xw^O6e~yP1U뻨/Pñ5 tT5DS%o0Qa9oUĆLr0fӗ*Y)G-%oÅRF,bElP7W +ug 7}R: "Jd@؊7=Hq )wr<_ {[\B" ̻):D=a1/zYS_)!t%hIQQH?vuE~f3tAxT_QS%U۠,>EnfHIвS1CpgTvv%LJa 5K!uIe5'r,ݣnKpQ_5sr}1O['(സa ,ү"" U&/Ɔ6^3נj !GHGR>jʌi6bJ9Uf퍫*WwZB?HOTq>:T/ +ʔQO8"t-q3=-' S%U@ߖ5/AD^3%Sx ZE +Hh>#lLz)'uSPyZ;%)ϹhI,':+E9B?Fh`B9Πӣd8o5l.Z}{r.zQR?(vRY`vЋ-n7m;HgD 5;\Y=- &K1=e4WN.~(rO|qYn}p3j nL`#h9/(ƴE]: 6TDPGIˤLSRPRވc3A*wKmᢧt1c"'SRG_,׻^3:.PVHH%} +єL.[Z[}:C|}P,Ic1C2Q0?9:>!ފ~WTlښ>볠A;-whQ-AyY>j'e|[PxoxPPfr\DPo@N5n37 [hatZprX CbV +;7nDfq?V8{ *>0*u.utt"Nߟ_GA _2y]P(%JQ@{4vV Zsv-{_Dtޝ`\>{ n87PeY;JrRQcpC.!)V믚E$hX/5KʫyI.k`<R$|F~Iu! >ܮ<9xɑ#&6Zg]Ae996#Xj Ҋ! mV,cvQ5a$z +J[e-*B}YeΉFB`x#%DIE2rYd8-ܲ FATJfv q/v{"diڋ)a7|9.hIp7ݝkdj Qy票+ÉȥR\OhD"4ePوJ6R{q;؏L:-eTs XY=ZXh#Ai:0|= +fۨ\ٌ${C x^jd PZe~0< yW'Pi þDى=)'N, +v}*!lL4Jӝz]%:܏|0_RoVD>( $b'Υ-o]!SFUJ29Z5d,~kxzOb_^p[6qI!ci;+ԼY,߱#7H;Wo}y3oYkS0AT}ڝ(Kc5<$PE0 `8:x(Jy3) 7..@ft6lN+n<.VNbls}Hx3%`By1djv"j T7ObۣȒsPŭ*35l?5&HhJV{pgEiꪞ)G+Y"gIw2޸; AiCULsGc6HXDnf6/zJ= }1Tph綤pQ$5c@^z,I~u?45[:(YN)*$ +mt{]Zr7R񳂸~sgfP4f)g"T}By'ݞ+1Ϥ E j6l7Vio(]ݧmS /vm.}UOE^L8:{X|h!{\IPIkĵd%ʾ@M]XEK]FrluL~6鄵.̬=s_5 c&.2ΛypYa, @Y5|}OZ{=?@Jۢ=@nY)&/挷>TG#$`6]ohMJUa@yڔ_`Kr[k/]Bn<H`**wdx-fMhS=yirQQ(TPr2K.o(NqHR[@OM2sAU#i20!5Jw47ilߚFvj˞Z`*_kDq+N.xTn?2u:X +APi-L T3DJU؋Gn;6-G0 c@ɂIx<z $pʱ#NtM:?v95qahޖ8VWA _pu{x; I(Tl!*TMwg[i R8قA)'F2abL + 2$e[[\RثW7SCDqrl(AH ~ZP^D4T&(Qs3`H\9W7/tk4ºLmk /9@]jԂp!W>bδ WS'CetSds2Hl'éiDktui=&};ĕ3mxـL c}ZP5m4e kЭ)A_4sK(̈́י#/>NtNi@Z;hqC$=ȟr]\e9i *Y8V.Fsb 3 J`dBS)!(R7T_z ڢ] - *iQ?Æ2>Vx+g, t/z .\hiѫh/uw趑<1i +( +4,gLfQn,ֱP,/pBmxb _5?zpܨR"z * CycM|/0YE[.2,s)L25U"׍9+waGT:R w+Rn ԑy)z#%/Ϊ"LWUq\mu[fVNeA˦hָ4ʇtAX~LzB# ܰA+ e81ݝ>sc6YIrJ<ے_q9';"JUKn?⍸PdUOTIUᵦuҾdb,ջtn&0$S3eyfu=s~ ՘1pxM)p~6Ѣ݇v{nhזZ.=8Ks^Xs`C7sju+:p>lW1W4]=#z[/#1j؏,sN +4.l^Vej?|;t:dԫ.2f"5ԉqIﳧQ?͐T!?y޻ 22yfe RpEKhp1FV/(a"򼉿?[Y0 \,D`h&i#.%('"^'LM |٧sX\7 Q0 dZJ5NK15ҊI9jZk|5o̅Ic)Va]FV@sLzzG]ĊAz,Qqʤ+Co -S1031h_fm0KU m6cx2LøV>`Bc Ur̨/)ѺQ$4lZAS]ڷNz!capcXxi9%h ֋QOYyd zt +xaj'iKج' dQ\wB+ڬB >#U_qA>\AH[0#yt44 TwVI@ɀ#!_;dDď$,UǍ8\qѻw ?̽c&3JK֏@%kE!H'ˠ'R~>ިՇs2ǚ +4?)wopy?8֡ew,q$Mmmi~>+ߎĤ[rz}uhtt- +˿@$/,R +iKSCahE|nC N(J x {n]cB/zsAGsϭPN;67CVI?7> l ϙWW"܌Wf ; nֿςDC$1յSkZU +'_0KxXÈ ~;] }+c-Vt8]קj 5E6AeZ*n3gY 1oו>v*1Mp` 䋐TLAeutzMxċz1_%җX۵kqTo;$7 n0js|.¶4h%9d^>Պ(582).FTq@4r +Țt`lJbT{9[X=`Lds2ԩJ_A z{F8$ߥ=͵3k}D%BtG@V 89f]7`[;z %,[3Ocր=|0ED@]L%=AB.+mT5hb H7H^⑋#wI(̣G|xf_l/XtŅu9OؽFns_χ49^X@A<y7U̯" +pu CXBy:eQ=BsVa"gښWYh"BZFc7mskz 4zn`B`{)6`yshfkel`kx8RTILzX7J.{Z1G*{w.i&vLjVu򈐚4bdE/a$w:C4( ΠwE#aHJq`/9؍>FSҒ[Q.:+gU?^7ҁ1VY]p7n~X79]% +u!E?1XWчȖR}ifoE!߀8E4L0>Ȝ 4y"H?mwV$ֿV  7F2m 5|t$X1g޺pz|+QӔ4Z%xʔ>9$>|27%( G's\3F pW7el>ƅW< krb]adfz@t\ҕvo YC"(lc *;ֵ3q(0cJU"^[ R[q|,`FrWh +IGy2TO١.'@@ޒI_vcP6N?76!*gC 'Kh!tQXu-$2e +e8luVB#XZxLPZ해P(OK,Mo_jR!)tI9`Fd(L,(_z"gG.|m߁h:|!d?aaEjqwpB{vIISu}WMJ8άǐPro ( M\uo%]tF7$@J;(AV}ʖ~rD|J9h4$vV S󗉼HXS?Њ)Y,}l8Өq6XrP*Q^s$п@< $ގ#?ٛTQ_T7l? g[BDnCµxB R6{'S- (L+:L S,Ziw(D^(i ADI3m4#%[-4\`k@N"?Q  [c +V}"~3VGH^xYPS qE'c8ї\(o9 rs;l]_Kl1̡ƀ뫪ct3OQ6u>Bn~*Lv`_kz+LXHi@-tu]* +TM` q,҃Z -x;E cMo59Y\BzFo8f™%>C0,p~OH<#-tq4 Mi@}'4EAx✓: 5U\F3d8 fq=`7(= i2 9ZeA%R sGSWSw}NOG9͝\Bf3]p*E/oEQhx13j^Y#fJXm!Ʌ`ȍsK&=k9x;\n0UN˔ϛ#i-fEN~N;Z +̱Po g!9l8EQ|Ncn]9!\K;0!4",lf7Z):8&Tu͒!>s*; 9͖5ʽw4wyKp'>@d4`}0PnX 9{>z~ X! "K4$Dيqaz i S!Ove_8Sbm 6IjKjB}9diݺ>8N#o]4 er-'%»qicɍ$W;D ާ\4NbESIA!m`񀼠J8 H.+(ϐWX'NsNUiDj_j_Y|9;4201zS66GPZ]>>HOhq,.,qsOX%gGafiԜD:JƋT )YhBc,y{sGoixl@qmU9oX,U]V'RHQ^VqQ(0!rrEB"g9_ ܍vqy{g20!&H"'r-96L^% ]H_`/FWpD\RBm]|\ƙV]!('ТLɎI䯷ݗipdh-IohE|U3N:~|L}|̒v'>$$ ]ϐP { SEA'ќ]t"na!܂ flg!2>6t1z35:Ns<֔}Uo`iԡa&P#YTIfU? +"2n )+f+/SYtV.u9#}|})~)*q&;u~֮spUY~[n~0(-o˕Ϲs`no|0ji+ +'g;|e~Նr-k~Qa"d\yKzwa 8̼0"IJL}1ֈo5>$wgtb^^AX\T:vmHF +p.Pi[9^ Cp;=q$]}^^UH1sўdMHHܮXA>O_/|oP0j𒋤5sa9dLAGsNsE.%n BV5tzc/,)&mr'iW׬2[9vIGA%`7ftpeL}lzqgu}VHNӕr4 +R-Gonb +3YĕTmrXr04DYg/z#b +2_6"C竕\35J8^hψOisڼP +R_4p9 6{yܮĽw7Ĥ8!2sn'95 +!YT;{x\@~Q'KG~8*8)$~$5m9A-m2`↳\~%H#(O~ |{y\9J#K!E~ +h;"L̺bcPVA#dc+bdb[j8 3sB&S*0rę@zeOб',62Wze^Sak.a%ƕ`0on}"H=rd +w\@ +c`Np\?1l 0>-.ACBMo"8 .bRVqai +5oFJ# 1 5EKh+m qZ<\Z#҈ 8O!#3,}ܘѲ7J@Ulޒ!%Ў28|`c3nO,xϺ]Cwl<:iBwL0{6(K@~<~{2#d7B0 !&s80Ľ o4<@Ca$~>B "x&Tk/иab5pu7X.lQm&Taím=pQ cu2]VAP(@,#$3˔p@-Mbgע7"6wVKH8W]GHENelUAN38s>V0X';?SƌX^Hit-}"EpqM?ĩ86@FɱzrUd+26b.etN A-Ԅ;(6ALbhé4Ijȗ/9.T &#UX/ +:10` Lˢpb:5V fvJ`0ϣ7gAԛ6>[#:t6b3 +~ {*l إ!"E0Nȶyӝ8wwIm8=0_ [CU%H[%6dq6Ŗadbh*ۃj9.[~vVd@GߍccU;u>$?_"6p߃ZA-ҮL4xPK"/E xpƵqmU@3}_̋._g9@5A "e^W~zp WZ3g>spaxp;Vg9 3ӵQputl|`Y7PʞЦ_e/ѦMU;kR [jIsVGYa0P0(kުJLGBȄ)@Pِ4:s$"AI ].{i=nDR&yayumH[lF٧WSSĽt0kdkk2R2XLt=ISzKi1?S(v-yvlzhp$$Pأl7OƋpS*UBǒ+P< +_Qm2! Eqz4ƄˌLWQ-tqˡFI2 ?+9Yrf1;:6m4 QK';QrXRw=QyN#f@TO%1SHKcǛFW'3YjeH,WO9 1ȅOE*X^A@i  *GV+ޕ"n4yffڨM' +ǃЫxJ[[jKBd.Z񐶧;.t ;> QEqҼh1oE $5Li&n(a:ݽӍ6 p]`i!9 |y0[ HꏠꮛD#z"nx1^ᙈo(Q HG1޻lI\SvD'9m &N.$lxd` Gi[*WdH*t&̯`[p"᣶W֢#h{IDd0D}&un)K0 8_6=1l:Fg+υ,q"O+~t1L%1x|TU.ܒpɗa̼0''⭫o(+| Yw{hib'.L i<Xű'~籪}gKGRd0j] el/奢 $8-X)~8=W:I닎"~P:8;<8&Wa[Ow'ępEj?"66tLcr[ON  W.{`S1҆B5l]YƱc5BsXz|BT+Ra$ \ +[TZ!]~C<&b#FԯheM#͆ s611"ih!+jtH$]7Hs|()V$j'V]7).bm<m_>0s(8bMs=Gf(-[Rt=fŖCi FU~"mFa@_h7ڃoh5UWDv$V  P1l⢨_~)m6FB>E1kMo^MeRƌH$8( g"wIKĨâK9<=Ba  \$5FQuRt5(Tڗ@+ղ )2zÉo,Wwj#,ibq*Ң>бe3`LUz&<{솈fhVQ?nol}Z㳟İ}e'4"(ώrB[ bBA֠]TZჳHsZyK0ޝ}WȭS$'4_Pu-ejai r& +ېc@fV)Եy $0CxNѦP]W!GH]xk|~zbbj8D7> ?\F.* +=s@Ti/A]$ZpNn?&N+~f\G.QV6Z6;r͜BnÑc̊ehWg, tlc€d}zM+5JsT LiY;8H?\hF.u]` +X,QD tka4$c6Q@m)yսZyuS wذ]BಌQ=_}~~X >].~X&\Ш2?،tN_(|J;9<6 |aEO3nSeƣ @ұ=s .?hh[16ܭ5.ҖHsiGi9E"㮈B|L]'^S(r,s+D؊"&+m'!,&rD),؛3YWnթ#Z?at@[8 bB(|J-QPc@&:qJetW&FHzlv3.FxہϪb^6f\fghⰙ~&B73XXQg84uSa1zq4w8!Z5sFWE/C9 ^p#(W^aJ{PVZN @/+,cA PDiHJ/vn.uiPoIHq6p'aKz+ i)m#*q$GwVsz0uQFwo ߂~"3툋a{鱟Yf\yui$g_CY[;s[ b>#8 ËO-ǭlN346 >UD/).G1ElPc#Vt}J[|flsfHuNs17ɵl&_3qL^Uu}ہo~܍KDj`Ó jD\\A)͸Y'BYu`6W7Mlƹ/2#)d͎AbL^ +ޛFw~x9aX44a}#Ap{h S닗,<(iaxvu((' 9񪅮h>/Zd9 ({ (- <%c#:A|<4hV0e !˾~{1P~F Jƃl%,&D8S׉˗ڝG ^G;_n'~ә"m:6R7hL VC%&ZT&jzG&yznj<cfIjv? "sZi7@FHe,@5'P{s{)%52(2=~,lUDGŐ!G/dnc"x%I3t=͊R܎2&J;C-5:o[:f]8s(Av4ͼkMS5ա?#Xÿa ~W(zn [z;@PڥGx9A@i v? ҆]>Σi\$]/ .{[i)iqp; raU1͘lP#@t=J۳5F~ ޡ2 ]3yXvNS93v%Zx]'_q\ftpd_}^q(sZi'EÜv(]77׏6~%{%bjn !~!J[5W:،NWvW+bE\.؉sg"r S{cD9<6 l[ Li4÷@Q^a@.[(-@UA D!!)ob(HŘҴ(^!})| + Di=nj8ⲌbX8Nsh%-EzIP~i.{Xb[6!.f4G!r5l,.!,&}lCA2#iZFjҍ~HL:&޻ >dJRHs 6tv42wN3b? ̊%tzv`#!rmB[;Fw!|懳~S9",w#x"#[".F eq4gXO3O#47+Rvc7z) +/w#|u+^Tr-"|WC|(m-!fX !gU5E c KAo +'8">O(1x:T=+yv5~2;vsN[lLu|vfk1VKx92ǖLB ?ˁX"N|Wh<3Gn &XrE)L8KR'EpF$jSJį _v +j(zBS^:\ uyKsp{ >QhD8- HG@2p7pf*^~xkR!ڬ/?0@-HcH #?݂2](%++!T< QU.QcB{p{"}n qT@Jk-WjieݻPFo cl"z6qa!Jɾ.?ǀ"W* ^G'eam!'Spf8ϓ!byQZU"| +Aw֓[LU;oHeވ !ʆd,㉳^-J^qw^s{9]pq;cQ%RDܘ=6L12Oǝr9X|rodq5/`JuRm{(969Re̫;(yچDi9-%!V2 t_cbMվe%T'(㧬mԄ̒,. \쳓!3(tce7#⭉Z I ̚R9<ƪAf9 ֐E7CвCk,sEhn1#dN“NR38>Tc7/;(:RÒ ץBIh,DcAP\3D3 XlIX輍Sj)reAr|A*[ ehXutq>Ak/x"mIvfL  NgrHbvekzg]"#rNӬ%;B]ɣ }|҂uŮz"8TO:ۊؒ.+1!Q7Qpz8~ +)⊂F[_  F#XyN !Nz~ * O$>;<]_NnO?Y⥭H;򀹝}lVBiؠ㮟BwL WϸןXɖxŪ!B]9]5^t oB ٸZ:vIvn-,#O]9M"m/@YSݷD1+N7_1 +Dp;-B]px F"zo)r4()4 |\V=\>Fךޥ Ϸi=_iOCA}w7SVFw6ŷ߉? Xu'83%PS5'^Љf)Ă|:>ERwݔt}6Pc7|yW9U0T]3p7ګ+nO ;Z; +iNV}/0YAEъ8+<yϊ೟%i>XUE.0ld b4ىZB |eEI[ڜmƥ{d"@i7U(-`?PKqҞ +l+ue3iV2r(TS?"IÜ([y2i rHe?նn,mrDFWލad]e8e~Yp~n:VXs!+/ +gʻ+v^XFN+iN0 $8Xȯ +9 6ԖQB'V]YW9 +R/ire1/%))Q eĘJ[@fj|E 㱌 /{E`v&CBԌŬSjQ=zT, f0Mpa&2%*s%VVdE@r]{1 %$)5Qk +Ʃ% P͏X}K R93g؛4Sj[񡛞f,#>f"5#ecfL2XI#c?<3Cviڷm 6Pk/1#xQv:d -".'>k#(wPZaw wg0`,(vt4/=}lũNQ[NEeo/pl3GFnfIA~9gsKd&!Hj#0$xX`r>i/fp{M2Ǟ]v@)F#.iN9/qf*]O繟FbnTWx"5>aaqN4P6ur9FW4@Ry58GК 'k8ȿ0Pox"LhY xe +E\`VpK~V 9$Ua9Sp/OYp>HZO.J9{u!mÊ~e1&26"\!UxJ"Khr%XشPvb4!N#ܾ8)j d_t$]紖#≗TX%W`Yf6JUåEFz!+iC70H1,69=_dP[W̤U?[S]O}: ~@fZQ#FS]%bPͲcDmcf ᑸ L%ղ6%J{f.P"(Sd!- dq.ly([M\2uB.@`㮋ұՄ~ѡs +[0pBL{yNF4quv(jiILS4(Mnvг'H7?Oy5Qqs2-OnR `$G-%IR]%i9ZnO>7w;};9/S&g'W'e*In}{$RM;1=,?IOd!,E)監fi%D}Nrro77~y%\q) h|KAMDKI伛f*rtOiZ߹&"7?w&Yv9i'%i(y/Q^nT$Ii3=˴s|2LSss.@/iٿiwge?O'Cx?iw|J7OKU=K?M$yr1}~o2a'Gр)O>g˓LEv9i/CneʵYvse~_dw&i"PH" Kh M;|ѨJiGA_IаdIa铥Sr$5)j|ybv>KOKr$[D& +ܧ)(Jw E$ +KP|*r)!2DO$!7B!.*L?Or͔sNd%&Kw?M:rQG^Ȑ4#3%"wQCo(&G;(F$S4S/Q)(9bW x\-` K`@+8mĊ:oCѣ\?c@,]G\3Ϋ-BorZPGa P1Hrov쓋rd +ChAqZ>푍[\qH>J;ImNJKF;QF'4n k@4qĄ&! ڌ lƽ-F .$C+hZA^ ֐؍K~CA`(.4qBQH4@)ʔqOK7+u#0v-6f;ۃX>qMBk'|WN4RMԌ>F"8݉ +BT"*Ba#=08myX5;m<0if4@vZHM`#D `֊(3;Gh6fpڬi*N(@H-fY:A6W~{ŕ  _%ygXDrU"~gkex\?Z)L~[?#:Ytfܭg_۔@*\:ЙI4RQȴ\x)/$C a:"r+c\?EW,*)ibrH@sQBfJB 䟾yӮu7uSB7 ji q)0a&cK$h5J*N !֫ثs H=?H;IlrDV!Iw +Q-6 7豠y ЊxM9h&K+1䝹; +o9f Kj0U-̃zJ$M3?Hm_yHG e5z` H (ErgTDv + , N  fH<t$]GBB6B #0hC!-cD 4l/3mPPjF[~bM%q~qVt +9#¢zcv*f%o!bRcELip!R]JwǨbQ30B96\Vi{l>P:fif[Oi3mrb vĀ֓sV8Q!Nx/qU ;D)zʾ8LӯBdC4c-VE8 50] 9ъ.`ԄjL;+Un7k-mȶ86 +_LҞ<@d"~W x0St)(%2ZV1'2҆ +- C?)'Wd^5ݹuێJkh' QBLQ0#O ڲ'@|g7xBi+aiH%JV +JEXt+ }'A$A-ؖʗ{}o.C2l}Mzi ++ZR86 WpDoSkزA4EQ㢖,JFg_+DbSM P+?y-nt C<$ bk&و Y,tlj~%w /f40BVerg@JC͑Z d mU>Nt7bfDiE??Ov'^6I) hD2ۻn[ +iߑk2G-*mt܍$ x'yL +jT2KŅ@BH;ahx8!Vcb>"zXCmcEq)'9>}@ j쥙$HituGAKs [' +u6f]6| zഒ(Sٌ` IsD kU2zJ!NOVɈ'nImb!#mI\N| Vv}[dFIŬQ8։Q.֪j!  E.elaF%c} +:ş\e; +7zm+*zt)(s@㟷9w1VZOnDƉ:7:|><KPafdĞfP ܺz$G a/r+>t,Q#7V-{ObvqGzd%ngxLOG]+'Et}-x8 dž5R2^ p_isCK>|6$#Fv$s.A1ط*xYv}rd@ +̄\qp޾2yiW +z¯F[_Z*W ]~J@ұY͸]zlڠF:U,P/8ʖU K$D8 d26tH  +a}+kR(PDH(*D8 EQGAAqCIYdJm!K:G NjU&PI4~*HuaW질 wF{$Pnu*&3A?\!R+`Нر#^E:^Wḯw~yhH[ԃhEGylv9I3S7~n:qѠ-m#/rhDCSτWޮ $Mkg͡NQBim@g?))O[,dڨv&mΌx}̹E"A6a;ݣ n^jP 0]jr/ۙ3|dH=J~C=Qk+󔊳]Gaq19OGJ?>TJ0 {إ7+ɎRͲ1 plvu!h띮]b+:t B|7X#s_g^QDFأo="V9`:\M]ƫk~U3mWRTH'Djλ5 @[Zm{pm Vly b|eF`* mdkDatS@`7K-@D]mMߕ̖ 1:la}"햂54<.7wvqOx5Ī`YuomN2i;sK3Q 6Qd+4V9X]p"v:0_vF:0yOGN«X,k:&ɻ׮i[\CQPw.}t[kdu*`uFڌxk.Yt"S,$.ǹh0*n +ٓ θq7G|.8CbhcN*zViD0L^Ӝ\<#.4̪B$kɅUew2ȨN ;t7g'*-d1&߬6RhTSBi0ȟK9ʭ(wͷ{ؾ-LRl4Y8&Qf-7פ+I  >]fSaߵu#w.TE|Ÿl$~sBSlgKj#^T +%ɻX"zF8q6 $%\YU$ĥ1iX)A 25q +Ԙ9.WhiAl%[L]_Kc,ư Zh V(0T,JȔPdi*I.n,ֽ]C#OO&^"c_]]ծ'@4fq^%;6ro*!4I}7ICEUdShhNⅺ<—^JH?tQٱY#m^3W>#WeUx0AXU\{2Z9W_رEI* 38PtbȀ$V~:̱nMHGih MBT1ef jS| R +^ @}jMk1WO6J@leQӒHߔ̗*r~~9LQb`C*fZ:=o,CE*_ i52ֹgL TfR1NYNm~¬{EJ?#m]9i!mQ +ɤ _UfٔRyN ?*JG_\%^PFZeRܕB6DNV^"Ti5L3݁ k-I^\Lx6yMGw2|`Tv5)6 +%3b"**cc+24])RCz\ )i~1<%+UXu6L{z5zۃt[ ]mBw7L87aBM.m6\౷ 2 ?m4O y$\ƣ~PG g!{5P}U6yZu]:[1gnM) V )UƹdizK TO5>> }Ag?ʃj-u[n.iN`!J3]\$?t,Y)`{f'(z 3^=8)8[ʟSgq:D)zdXˤN*s YР(Efm:[F?YA@je-3RW@߀ +LڱMx1,~w#8 CyD>g2a@q(s~B2os$0tKͽ?(!yfqt]J>JtU.5q=+W@#BVV>3t-n%"DvʵDV^+hj^t\n%^YݲJz_.+ob+l[BqD6 +֬~s\Cd9'*Vm3aE_waQ,Cܛk82y"-Ǝ~+``?Вxhe\FSڈS1N6J>w[=1t OD%;(X/G|"0[DBab=\h7[ŘopGHY_wB(dq<CA!DQT:U37ũo<=ل|O(#9goC=E*߾0?8d `P/߄|šbdnk{~< +8!.|6tD] 8Y%ogqG-dA/#%ID̢d) \fLp`1פpe3ŗob6hOeXhK6 +mB>]/ōO:g#obiX6vxwIBsZ1`.|\P"!OeffYlZq(]V7‘"ڹ` |Sxo_4V!zCvq@ =g4RJpJ7+Fײb/]F'PaZQ=71-)aEE3c r^WZJ9r² +dV@SkAyu=PS:LUc]  #Kcr'eYXDcr$PS_A!te Լ`1~!ӌ}قIQF`\ml9CʀI~?"!ը(Mr-s[I<`ozDFRvIa4O0ex,# +NW|ơrk^"W|Ц7Y +E_F +"K7j°ᤑnLKrRW9JBZ !T:- +15Z+! N_3^4}%^:,QntavazOk{rx?y@OQf%7 w sQ<À7,XѶR?=+l;qb#"8aP&Ai%oEYKb_ʳfߕwӐTq%հmrr5t \<)g'RXA#̀@γ*$ )&~ d+nX֗&E$u?Ð=t/˩4ݲ~~R=hY pO\,21Vq,i8?GarSbC@B;鐺qI VZ,% 9E)<L E"jq;!El<;O X +5n=%lVrbs 1㟜m o ~T%Ώ!fQnX&qS Cǩ#su9ouQ fvjwQs2Qvp `ZH{n sJ.)ND-;=vXoBC"5 +E`40n"5t>|}ϧS9ǏI=S MVGC<)yZۮ؀y7'h E3zدPEʶ?WWu5F1mN0B]Yneq'2@%Y_W\/l`[17Uρмj:i:\Vl=w19мY5$YM=w  TC[ʽ+h(ЫбwHnʞA , 4{k Us:('Ia|Η.[ t)E٩1+_8IkdJYzK~ Rփf)0Fry=Z ,l":[*2V@uyF;CT+A!qj1MmkP0:x'=ӟ +C<#65m^.mTWjy)n ;,MWn~^ umY:ˉq^ݐd,j©0RF'Q'^8B' FQkq+D lu0 n]d~Ӎ~ߕUx󼒧K,6YOy'Ʃ֋K7:ey$yفUz*S+s_Ry?u'[DN@tjM] !)Fk_"yr5y/(^ &Twa(&q](~rL = +~fؐ 4a{o}"V{?a5)i*EEчtB-x*׆/Bszn3VrCy{&8 JEK(؛1X^ϛӔI)JrN +< wïR)HXx! '%_:O|+!QhKh8s e 2㓻G$YtXv\,XfAﰝTۑOda 9mi`t>Fm{16]?k}.:sź^?)01y *wg 3 iiN+"* +vϸel^D ?6/ՒRS)gTO L?gDLFXq)Ѿ?`J)[7?F-(QC\67wn̝8H[DMؽ52%xB,e7,7 I +xdoSAKxkpޏ\ϫI~S,gsC=ȾFӎK#kVm6+E@ h Q +{xAIr +)'P$& X3|e )'Oa=U. 1C2=H|qlH418#|>e*|ߠ'e6M}.P$` +,|%0;)(qˎpZ;PET֏)#x(a; rB7yŅ12' PZA {-X-iPϥe0t$m9(;e/PbsRN($A<2lT` ޞH'i!9=KZ7҇ퟌXa#Y`Vxv(#+NZ;5?,ޞ.|@UEWtc5i,ʐ_(#Uq]jH J=5()bJ!{*!^hA1@p żmJ)zU!v,Z[e RH䓑bV@jF[YSҖV$ Nr"g[t)nJ-lg><":#l_ah^s!BI +zk @a3e(U8"K"*`/*>&FK<͟"B^g@}qSR[0=YTɟagH.QWM 0o68ztF[.ڼpjB863UHywbƍj-t%V29$/( aվ~6]Jxʱd4GBpLo$]fP  =GoNp̎T-JqQ29ƴm3ךk&<{-S-҄㱞xL<UO3Y1hmm! Ԑ(ʑ3(yb ƠI +q> Wwclay"yE3\/Ż,SUC#[zUD$*ie]zcctݬ4K87^Ur3kG,D8Qgyq,aƈB. ѻb[ÃlEgfU!v6>acTO@P )K@)]8]Qfoӷ5s(eR?Oe?usoDߡk*#ml?|%FIm5]0:+=@8D#[v3etqO+r>)K(4Pݷ+9NShSJ #r e盋=Vv&]|wUƏ/{ U5DyqB$`k<0xRci 5!>E0^Zcr4* 7ƟF}M}N#pUTaH2tRABO;&fCi@]ķhoFg8 @r5{k!oJ|ŗ˶'W˷=T ߖl{4E]XgUX0[TUx{V]1%ܓxvr~w<'!` &Sm#)R9]:W͞/ mNx8]bNFYtKъr؜hUK*&Mri7ط(ɵ3~x #'ް‰=f̄&4 M4_W縫hqW΂'`i-O$(.F)xn)FM4eh!m^{tYa-2L{&fd>s92"+6g`1j0ġ̤ +Cv껕N 9=~yuJX:{F'@Qi#3ԌX{EtR<#X|aHq~ ڸy ]ֳF;HzU5uR1|^ 9y^rVl3s h֞,cYܝT;;-#*Qr|a^yEh% Y7r=;Ke El#4goO e,"cv7?xYI<0ĶdK>/P<'ˆ@qil4(fxBhQK7MΏ@'ZUc?; V%d1՟_ăuM?tQn :N<?e> K(AC䗵ˬ,h@]>tuEE`Iz( +*q2˄(P6q/.qR_\Y<﷕e_%&Y!~Q3gv 9S۲B 0RV 6-k~2a _$,sۖZB82)ƎkoVJ"qSE-Y .xީȵ>L ~pԏ!ڿ^uі ΓF1")lByezDkYW)+e٩B_9vg%  !ά +{#!xօ+q@uM2BVY ТOoWO/Ao]Y˶vhtw$6NoO/k?ʐc/Y.y{eVР%$έz1U4edeA ]i05^8rdc}k4='RBp&+[E0V4F_r/L1m½a3 +Wu0@i~d-(G`B(85 |y?qDSk0g(s渑cZ9 \j$5/@5 H"q3GF/E*u:`jf%u~<=SRU (ɉOM_g}BQxS/ n&%&8 +OqbDCrĔlPn.ĸ)__v|sQq^;R%$W }[uKji#q 1mlRElԸVDzAg?Ycw|xj3rr\qz'&,4՜$2]tNdOIFy^Đ}4G͡HYJ*x#N Xg-cSx#MM|!H7a߲B؏?p@dVAX5c U) + :wqC"uCJ ߰Dwkw]%W[ᅠ=$;7a"%W7AQDB\}ts|zvꛣnilx.N5BLмtϪicupB]/!>[aB>?&VRh0ZP{EQ+鈂EK՜6{5y-NbKD0`=fh@A!1yضCH#2V.v'a*@8_li##cpf![,1˺ K`9؉5]6l:b⌥r8b iz\pK>*Im#n.Qi@7[\ x}|$o.]qpƄ7+Mh=WaFyWp׆ؿ!' ]on*89l8&xb +l@ dINڐ<<'ÔOzxTUdL#:k~ħt$"6Uq6:f9Rs6mX6(.I͞a?[jEFAb aytf_U?|d3f@:#=8j ۺx%Gi2>#c& 9Wp8:p.:9Dv((.e,k(6biG aGWj3K~gYt{9s <3WPctNtLg䛠0sWN?o6\;0~ZgLS*p!s'km0bm94Q!o.uɑU%pJ 6RuGEfܰhkhm[ZI|_3) 6z5USRgko'k2Ӷ3w )aHJ>i HZ6VpkÎy4~ X]*Pd0eA2K9I4b~x8&MǜqdD}2OLd[Qc\% 2 .jJBd *m ק>,A@Y%Lf `洟EE(:gY?EXWHX0#@`ӺSt +ʏ`F \ I +`KIx@[Pބ? +hƶo[e7"/௼ q?q@v]WY um blM$''(;x<$ =3FOiu%5J~)<1-SD^oL+ &%Z8{ s'}cgldCDS8#9ЯatΈX*6ޥIe5<6YQ^QFnnjg1u8`ueJic)*Ϗ"QkX:ryme3.!m7!1 cBR@j2C{a +5='j~'ٚV}ߵ"@/m=qZFlZg3c$4viX prToP crIߨp1ZM|/$IJ%30I +!@)8&'#}cr"Ht%Rri;A[5 c- WId8Ut}csw[)f^)_ Iq,< ,*!*p$J28h 8Õ-:ǡhA_ưKYn/ē<4FR<5c1")0W0VHS>~Gx",nWL"Sk~OIhs#-P6 r'9Ou,'ڍ=8}(z B<<o&;u6_ "!p0'hW0fkw2$ +e*`LgϘ"d_בV +.kA?^h1D>GFۍdCʖl.6"~v-|(0;k鍢QR5sΘ]Zo auJgxisO #JÝZK6 +,ȉj[F#cXmA?F +LՑc^f#r }P ]&l `3+vl2dA cĂ {l\)2&WZb[v@g{i\ٶjXEhn +CҰjLyk>_+# hAuekrd[/ Ltcd""*SDAdξp4̺l:_FZ %%!E##mz á8IŀҸu 1ԏ'%aq:A +~7TQ?%"kd zT$MɕkbP//kJǘa^EHlø%&vv[º 6X,0{r;&ěO/@ʸ2SQ;> iD{~p͈*($qR .ow&:NȅSgh(=p1)KiRea ˎƵbV+Y//*a#ֿ#lxF+ ~6?Nj O3K@Z:?$6}QߋVF@Cw! کBEYr0IL{ԿTm$o0?9/0PJt1*I7/'Xk 6Cx¿=iwfK̭ի[j;>ayRC+@4&00ܧ'騦Og!C S|աSYOO)!^H`G) bz,Wniҕ.==P@+!HpS&,jƹU kpsȁ((%!Qc^`5Wt[W p˞Vs;Hmm(Xpo.hWclokQPcNPw"HK$T|ǚB5M޳Ѿ(޻h,H7^y$ :5 6d69Ex=U[0k66Cxtѕ#|x<^ ~Y~E-v'4㨶yLܨrvuF2%pfXUkAsTn0{ m1L6˗/y. ,ÊGK-uGKĠCq&!%r(!Nv ^?Iaz +Eqlɧ(∍Q1C)q*G&}voK1RGd7)LYA#zPu;9$yɏm˙bhSa9s3+pɀqCi[.,x{Fse`nCՋyfV )\Yr`pK=ڽe qni&rjzLj"Jhªz[ZS8}MO:ܧek^?sSj^Gŷ]cN/QvgMpO0$m5̵r _/XbѰ +sV|OTWKZ_M1{{ݕWӗCn-^[laT9z<]v;)d{ӚX?LVn%D/hA%݅FvS{0Ηc+޵Xy8=2OEmzӎU}%mf$chqR:a&-?(p?*.h- 98Ly= XE F/P QeV\NjuE][ ZȂ`AD 2Zտ`v͔Yg!=&~;1f p!"0McmvZ +Tč}LɓS˘ V_]gmZ[`Ӧ]}'j'S:"TVyoD{=uiikHƚ\\jM! YݙY#vNֆ k' vJA>']hk&m9R)jUo/̱3nݾKVr(O^L5u2ӣ\8*M*ΙޥUNöz5VK3V]Mt65LJ+q3LxQީB]¤S>Mz^+HWr|/>S%zU.ÑG_ukwG; ]@P=R&MV7w\zC!e#BخӜŭ:LM -NU!ySD6KVp=Y^$p]bM;8 FG?Ti'u^[ZdU? 2*s1۫o0h@@ﶴ0{0:Cw/YmiMU"ꡚ" KΩesu xe:Vs|v ^-zh8l앞N9y/S{!z9C5$iE=T̰et`iPbǮPiim*M5{-kY7Ih[6al%ɮumNմgD[2hg>?i*q=P&}Ҏ3l3h*}Ȏ@AA%u72tM!A0+sĢjx8*mDjղ[ԚojA|1[B FԧU(8$zGWXk:6}q蹺ML8Uh\̲G4O=-դhHs1]9o2 ĢxDZϦ q[M1yi3=Vo&ղXIJ"#!j`IK7:IVLZreЎCCJ!),ڐpYߜģ F7b4 +F#Eo#]\U7:60d>R8G~KjOc},Ҵ.IU?Tz.e>SnGl-˷WY۳=~{wMEZv⽘q~W.礷{![uǛeckTh[;/skjnzH \V5t9u/xM\Yꐽm>B9p*\b + q8~Dj7iLԩTDbQ> ]!w5[H$nUCSbQ>zYаt묦]7pklwKftT:MuXB46ou۪}NRYǗ$ZKHJdC>=,tZ:Y.ib"QZ7.ijLst"PѴOHi9UpT'j hTUuGSOi!*kP`X瘅xQmRWI˃ AC ` pHX 4(C Er|aQdc #RXI<( LUUi&E1- .[!iؒAr$- +*ETKU L +=jBPHr0J\X+I1Aĉ@-J(F.G_[+/2) +ZrV24EaxQ +%.,@0³.H\ z(R 3ÌNȢQF[BėF(Y;s5x1D# +ZT#YKqG#KKnH9@^@N* qhʸe;$=|RVdz +/J(xHdp1$wadd[((Kbg~YH C|z˫wD IQlےjYOplTEfEwXcfvBAL2)G1l65n4DmnRٶ9Mh/ZkeY +*\pQI-H ƾ +EAĸn))(ejb$,(\˙ႻYyh ٢UZŨS'4ʐ GI\ EHTP(QA10!Ԍ9 +j5(1^Ea6{. ^ I(҇(QwxSoWV4.[2ol! 9m&)$)Vu `mP-}Z}p0#̪&]˷skU$v#YoZׇj{sk<&s~6o=K!x(X)YF GAM.Xl[(MiY)20*ю{s=s TvL€!08Vц]M~ ^K. Eڽ:FOzrqz\MnC0"w,WT} +d5TiJ9htɝwdhΡ &6s rJA!,zf^e~q53SJ⃭3$TDGR¥P+[~Gk^DHUˡA*VdJ +,#I;lՖYV '?o5M_/!GYvLcQ,̥œ1- +(o &~w;O0ouGyv^>AٱXF[9NkNa$Ya943U6E՛1ynrhГMgI.=D3nj$5Q yP_v{*I!/ Ț怃>q& b#32`7tۦUQZt ێK@5!Ih;!ݴmX]|(LpCXb`ʩCZ qnl: &! +ˤs]l+,ڧ#v71gGǻ%IuZr= bc/W:;?SW`M~0 Ռؒ9r nY+\~i:Igz%".4OP`5{ғg]/B尊PXR읐Xotxr=`g[$geg1T~¸ u\6G 7Gr&!N;KzB`xxbz;ė ^R'c +lQ9!ta[3xOz0bqdB^)B<C]9>!4$.PBz-ioRݸxw>bKpd#P؄&dI(]X9_+eTAtb[zK@P:5"М"^L9{{7:GWqҸ#H'rt!rׇwh7yaKRLhקZgF\e/"-8ٵ–(5LC(0%P0׵F35b;j1n3 %1׼ا-A(#; /õ= ?SIT.4T̿!2̈dIR ++Tyts$ +Vz]4毤`͆%f8i sP$orZa2vkB͌tY0YGfBD&dLJ+/ܘP<5#ˍ28fpȓfu巍w@!aFL5/g#&bQlk&/͂P> td>eͩAYv!9C0lߦ:SMyζ'P#a&aC`M[n0 +2߽pbߎa_8BTiPH;%L|맶1Yר>8?pZ0|^Ϛ5{'1KY IXMp)&n Y(YY ǐO/)Z]b֦SŻ qOmM'kkB=J8d`V d?]co6-$D;?T q}0D[Ccû%DH΁ݫn%oKQ@S9ǐbaX(P3{ђapr,NYbOIiu#ێvvƁ!쪏ק] ӄCn OM;ۢiO\`P9Mf2]JoaD&&}lj VEvm! YA I4v#w#)$u<\eАZ"hl{DPll;HBm0"ML!8)f.s?koFr$ z?J… tČfS@6f- {ݖzHa "֜rpϨסnq- E_cp!ڳX(? }biETb͜c$ĻqAfTƁƺlTy5e­9|}Lsv̆.z-T@hq4s< h0'd 7n^2ZaWgqLǜqhH_&vWң>GofV;?R.V:FHR cm>ш> endobj xref +0 38 +0000000004 65535 f +0000000016 00000 n +0000000147 00000 n +0000051145 00000 n +0000000000 00000 f +0000051196 00000 n +0000000000 00000 f +0000064522 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000064595 00000 n +0000064791 00000 n +0000065970 00000 n +0000131558 00000 n +0000197146 00000 n +0000000000 00000 f +0000056849 00000 n +0000056662 00000 n +0000257979 00000 n +0000051621 00000 n +0000061839 00000 n +0000061726 00000 n +0000054872 00000 n +0000056101 00000 n +0000056149 00000 n +0000056733 00000 n +0000056764 00000 n +0000057284 00000 n +0000057368 00000 n +0000057784 00000 n +0000061874 00000 n +0000258004 00000 n +trailer <<7931A9B8397C4A528398F0D062259877>]>> startxref 258218 %%EOF \ No newline at end of file diff --git a/docs/arch-hybrid.svg b/docs/arch-hybrid.svg new file mode 100644 index 0000000..8e24b7c --- /dev/null +++ b/docs/arch-hybrid.svg @@ -0,0 +1,3102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/engine/types.py b/engine/types.py index 05197e9..a36053a 100644 --- a/engine/types.py +++ b/engine/types.py @@ -278,6 +278,7 @@ def is_null_call_behavior(op:OperatorBase, c_code : bool, x : str): spnull = OperatorBase('missing', 1, logical, cname = "", sqlname = "", call = is_null_call_behavior) # cstdlib +# If in aggregation functions, using monetdb builtins. If in nested agg, inside udfs, using cstdlib. fnsqrt = OperatorBase('sqrt', 1, lambda *_ : DoubleT, cname = 'sqrt', sqlname = 'SQRT', call = fn_behavior) fnlog = OperatorBase('log', 2, lambda *_ : DoubleT, cname = 'log', sqlname = 'LOG', call = fn_behavior) fnsin = OperatorBase('sin', 1, lambda *_ : DoubleT, cname = 'sin', sqlname = 'SIN', call = fn_behavior) diff --git a/prompt.py b/prompt.py index 70d2714..d0064e8 100644 --- a/prompt.py +++ b/prompt.py @@ -348,7 +348,7 @@ def prompt(running = lambda:True, next = input, state = None): else: print(prompt_help) continue - elif q == 'xexec': # generate build and run (MonetDB Engine) + elif q.startswith('xexec'): # generate build and run (MonetDB Engine) state.cfg.backend_type = Backend_Type.BACKEND_MonetDB.value cxt = xengine.exec(state.stmts, cxt, keep) if state.server_mode == RunType.Threaded: @@ -362,18 +362,23 @@ def prompt(running = lambda:True, next = input, state = None): state.send(sz, payload) except TypeError as e: print(e) - if cxt.udf is not None: + this_udf = cxt.finalize_udf() + + if this_udf: with open('udf.hpp', 'wb') as outfile: - outfile.write(cxt.udf.encode('utf-8')) - + outfile.write(this_udf.encode('utf-8')) + qs = re.split(r'[ \t]', q) + build_this = not(len(qs) > 1 and qs[1].startswith('n')) if cxt.has_dll: with open('out.cpp', 'wb') as outfile: outfile.write((cxt.finalize()).encode('utf-8')) - subprocess.call(['make', 'snippet'], stdout = nullstream) - state.cfg.has_dll = 1 + if build_this: + subprocess.call(['make', 'snippet'], stdout = nullstream) + state.cfg.has_dll = 1 else: state.cfg.has_dll = 0 - state.set_ready() + if build_this: + state.set_ready() continue @@ -465,13 +470,14 @@ def prompt(running = lambda:True, next = input, state = None): except SystemExit: print("\nBye.") raise - except: + except BaseException as e: import code, traceback sh = code.InteractiveConsole({**globals(), **locals()}) sh.interact(banner = traceback.format_exc(), exitmsg = 'debugging session ended.') save('', cxt) rm(state) - raise + raise e + rm(state) ## FUNCTIONS END diff --git a/reconstruct/ast.py b/reconstruct/ast.py index 11aba6f..283f2a1 100644 --- a/reconstruct/ast.py +++ b/reconstruct/ast.py @@ -70,14 +70,14 @@ class projection(ast_node): self.context.postproc_begin(self.postproc_fname) def spawn(self, node): - self.datasource = None # datasource is Join instead of TableInfo + self.datasource = join(self, [], self.context) # datasource is Join instead of TableInfo + self.assumptions = [] if 'from' in node: from_clause = node['from'] self.datasource = join(self, from_clause) if 'assumptions' in from_clause: self.assumptions = enlist(from_clause['assumptions']) - else: - self.assumptions = [] + if self.datasource is not None: self.datasource_changed = True self.prev_datasource = self.context.datasource @@ -157,7 +157,6 @@ class projection(ast_node): def finialize(astnode:ast_node): if(astnode is not None): self.add(astnode.sql) - self.add('FROM') finialize(self.datasource) finialize(self.where) if self.group_node and not self.group_node.use_sp_gb: @@ -469,6 +468,7 @@ class join(ast_node): self.tables : List[TableInfo] = [] self.tables_dir = dict() self.rec = None + self.top_level = self.parent and type(self.parent) is projection # self.tmp_name = 'join_' + base62uuid(4) # self.datasource = TableInfo(self.tmp_name, [], self.context) def append(self, tbls, __alias = ''): @@ -547,9 +547,12 @@ class join(ast_node): @property def all_cols(self): return set([c for t in self.tables for c in t.columns]) - def consume(self, _): + def consume(self, node): self.sql = ', '.join(self.joins) - return super().consume(_) + if node and self.sql and self.top_level: + self.sql = ' FROM ' + self.sql + return super().consume(node) + def __str__(self): return ', '.join(self.joins) def __repr__(self): @@ -644,18 +647,18 @@ class load(ast_node): ret_type = Types.decode(f['ret_type']) nargs = 0 arglist = '' - if 'var' in f: + if 'vars' in f: arglist = [] - for v in enlist(f['var']): + for v in enlist(f['vars']): arglist.append(f'{Types.decode(v["type"]).cname} {v["arg"]}') nargs = len(arglist) arglist = ', '.join(arglist) # create c++ stub - cpp_stub = f'{ret_type.cname} (*{fname})({arglist});' + cpp_stub = f'{ret_type.cname} (*{fname})({arglist}) = nullptr;' self.context.module_stubs += cpp_stub + '\n' self.context.module_map[fname] = cpp_stub #registration for parser - self.functions[fname] = user_module_function(fname, nargs, ret_type) + self.functions[fname] = user_module_function(fname, nargs, ret_type, self.context) def produce_aq(self, node): node = node['load'] @@ -723,6 +726,12 @@ class outfile(ast_node): class udf(ast_node): name = 'udf' first_order = name + @staticmethod + def try_init_udf(context : Context): + if context.udf is None: + context.udf = '/*UDF Start*/\n' + context.headers.add('\"./udf.hpp\"') + @dataclass class builtin_var: enabled : bool = False @@ -754,13 +763,7 @@ class udf(ast_node): } self.var_table = {} self.args = [] - if self.context.udf is None: - self.context.udf = ( - Context.udf_head - + self.context.module_stubs - + self.context.get_init_func() - ) - self.context.headers.add('\"./udf.hpp\"') + udf.try_init_udf(self.context) self.vecs = set() self.code_list = [] self.builtin_used = None @@ -983,10 +986,11 @@ class udf(ast_node): return udf.ReturnPattern.bulk_return class user_module_function(OperatorBase): - def __init__(self, name, nargs, ret_type): - super().__init__(name, nargs, lambda: ret_type, call=fn_behavior) + def __init__(self, name, nargs, ret_type, context : Context): + super().__init__(name, nargs, lambda *_: ret_type, call=fn_behavior) user_module_func[name] = self - builtin_operators[name] = self + # builtin_operators[name] = self + udf.try_init_udf(context) def include(objs): import inspect diff --git a/reconstruct/expr.py b/reconstruct/expr.py index caa5f3a..c7987aa 100644 --- a/reconstruct/expr.py +++ b/reconstruct/expr.py @@ -42,10 +42,12 @@ class expr(ast_node): if(type(parent) is expr): self.inside_agg = parent.inside_agg self.is_udfexpr = parent.is_udfexpr + self.is_agg_func = parent.is_agg_func self.root : expr = parent.root self.c_code = parent.c_code self.builtin_vars = parent.builtin_vars else: + self.is_agg_func = False self.is_udfexpr = type(parent) is udf self.root : expr = self self.c_code = self.is_udfexpr or type(parent) is projection @@ -71,8 +73,8 @@ class expr(ast_node): else: self.datasource = self.context.datasource self.udf_map = parent.context.udf_map - self.func_maps = {**builtin_func, **self.udf_map} - self.operators = {**builtin_operators, **self.udf_map} + self.func_maps = {**builtin_func, **self.udf_map, **user_module_func} + self.operators = {**builtin_operators, **self.udf_map, **user_module_func} def produce(self, node): from engine.utils import enlist @@ -81,6 +83,12 @@ class expr(ast_node): if type(node) is dict: for key, val in node.items(): if key in self.operators: + if key in builtin_func: + if self.is_agg_func: + self.root.is_special = True # Nested Aggregation + else: + self.is_agg_func = True + op = self.operators[key] val = enlist(val) @@ -95,13 +103,15 @@ class expr(ast_node): self.type = AnyT self.sql = op(self.c_code, *str_vals) - special_func = [*self.context.udf_map.keys(), "maxs", "mins", "avgs", "sums"] + special_func = [*self.context.udf_map.keys(), *self.context.module_map.keys(), "maxs", "mins", "avgs", "sums"] if key in special_func and not self.is_special: self.is_special = True if key in self.context.udf_map: self.root.udf_called = self.context.udf_map[key] if self.is_udfexpr and key == self.root.udf.name: self.root.is_recursive_call_inudf = True + elif key in user_module_func.keys(): + udf.try_init_udf(self.context) # TODO: make udf_called a set! p = self.parent while type(p) is expr and not p.udf_called: @@ -201,7 +211,7 @@ class expr(ast_node): if self.c_code and self.datasource is not None: self.sql = f'{{y(\"{self.sql}\")}}' elif type(node) is bool: - self.type = ByteT + self.type = BoolT if self.c_code: self.sql = '1' if node else '0' else: diff --git a/reconstruct/storage.py b/reconstruct/storage.py index fe95607..e73bf40 100644 --- a/reconstruct/storage.py +++ b/reconstruct/storage.py @@ -136,20 +136,24 @@ class Context: '#include \"./server/libaquery.h\"\n' '#include \"./server/aggregations.h\"\n\n' ) + def get_init_func(self): - if self.module_map: + if not self.module_map: return '' - ret = 'void init(Context* cxt){\n' + ret = '__AQEXPORT__(void) __builtin_init_user_module(Context* cxt){\n' for fname in self.module_map.keys(): ret += f'{fname} = (decltype({fname}))(cxt->get_module_function("{fname}"));\n' + self.queries.insert(0, f'P__builtin_init_user_module') return ret + '}\n' def sql_begin(self): self.sql = '' def sql_end(self): - self.queries.append('Q' + self.sql) + if self.sql.strip(): + self.queries.append('Q' + self.sql) self.sql = '' + def postproc_begin(self, proc_name: str): self.ccode = self.function_deco + proc_name + self.function_head @@ -158,6 +162,16 @@ class Context: self.ccode = '' self.queries.append('P' + proc_name) + def finalize_udf(self): + if self.udf is not None: + return (Context.udf_head + + self.module_stubs + + self.get_init_func() + + self.udf + ) + else: + return None + def finalize(self): if not self.finalized: headers = '' diff --git a/sdk/aquery.h b/sdk/aquery.h index 14a91ca..28ef087 100644 --- a/sdk/aquery.h +++ b/sdk/aquery.h @@ -1,16 +1,77 @@ -#include "../server/libaquery.h" - -typedef void (*dealloctor_t) (void*); +#ifndef _AQUERY_H +#define _AQUERY_H +enum Log_level { + LOG_INFO, + LOG_ERROR, + LOG_SILENT +}; -extern void* Aalloc(size_t sz); -extern void Afree(void * mem); -extern size_t register_memory(void* ptr, dealloctor_t deallocator); +enum Backend_Type { + BACKEND_AQuery, + BACKEND_MonetDB, + BACKEND_MariaDB +}; +struct Config{ + int running, new_query, server_mode, + backend_type, has_dll, n_buffers; + int buffer_sizes[]; +}; struct Session{ struct Statistic{ - size_t total_active; - size_t cnt_object; - size_t total_alloc; + unsigned long long total_active; + unsigned long long cnt_object; + unsigned long long total_alloc; }; void* memory_map; }; + +struct Context{ + typedef int (*printf_type) (const char *format, ...); + void* module_function_maps = 0; + Config* cfg; + + int n_buffers, *sz_bufs; + void **buffers; + + void* alt_server; + Log_level log_level = LOG_INFO; + + Session current; + +#ifdef THREADING + void* thread_pool; +#endif + printf_type print = printf; + + template + void log(Types... args) { + if (log_level == LOG_INFO) + print(args...); + } + template + void err(Types... args) { + if (log_level <= LOG_ERROR) + print(args...); + } + void init_session(); + void end_session(); + void* get_module_function(const char*); + char remainder[]; +}; + +#ifdef _WIN32 +#define __DLLEXPORT__ __declspec(dllexport) __stdcall +#else +#define __DLLEXPORT__ +#endif + +#define __AQEXPORT__(_Ty) extern "C" _Ty __DLLEXPORT__ + +typedef void (*dealloctor_t) (void*); + +extern void* Aalloc(size_t sz); +extern void Afree(void * mem); +extern size_t register_memory(void* ptr, dealloctor_t deallocator); + +#endif \ No newline at end of file diff --git a/server/libaquery.h b/server/libaquery.h index e4f6674..b391ab3 100644 --- a/server/libaquery.h +++ b/server/libaquery.h @@ -32,8 +32,7 @@ struct Session{ struct Context{ typedef int (*printf_type) (const char *format, ...); - std::unordered_map tables; - std::unordered_map cols; + void* module_function_maps = 0; Config* cfg; @@ -63,6 +62,8 @@ struct Context{ void init_session(); void end_session(); void* get_module_function(const char*); + std::unordered_map tables; + std::unordered_map cols; }; #ifdef _WIN32 diff --git a/server/server.cpp b/server/server.cpp index 99c539c..b126232 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -248,6 +248,7 @@ int test_main() cxt->alt_server = new Server(cxt); Server* server = reinterpret_cast(cxt->alt_server); const char* qs[]= { + "SELECT MIN(3)-MAX(2);", "CREATE TABLE stocks(timestamp INT, price INT);", "INSERT INTO stocks VALUES(1, 15);;", "INSERT INTO stocks VALUES(2,19); ", diff --git a/tests/modules.a b/tests/modules.a index 7e275f9..3593d97 100644 --- a/tests/modules.a +++ b/tests/modules.a @@ -1,5 +1,8 @@ LOAD MODULE FROM "test.so" FUNCTIONS ( - div(a:int, b:int) -> double, + mydiv(a:int, b:int) -> double, mulvec(a:int, b:vecfloat) -> vecfloat -); \ No newline at end of file +); + +select mydiv(2,3); + diff --git a/tests/stock.a b/tests/stock.a index 27ced26..a2ba8b5 100644 --- a/tests/stock.a +++ b/tests/stock.a @@ -18,15 +18,15 @@ INSERT INTO stocks VALUES(15,2) INSERT INTO stocks VALUES(16,5) /* "q1" */ --- SELECT max(price-min(timestamp)) FROM stocks +SELECT max(price-min(timestamp)) FROM stocks /* "q2" */ --- SELECT max(price-mins(price)) FROM stocks +SELECT max(price-mins(price)) FROM stocks /* "q3"*/ SELECT price, timestamp FROM stocks where price - timestamp > 1 and not (price*timestamp<100) /* "q4"*/ --- SELECT max(price-mins(price)) --- FROM stocks --- ASSUMING DESC timestamp +SELECT max(price-mins(price)) +FROM stocks + ASSUMING DESC timestamp