* @license GNU General Public License, version 2 (GPL-2.0) * * For full copyright and license information, please see * the docs/CREDITS.txt file. * */ namespace phpbb\controller; use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; /** * Controller manager class */ class resolver implements ControllerResolverInterface { /** * User object * @var \phpbb\user */ protected $user; /** * ContainerInterface object * @var ContainerInterface */ protected $container; /** * phpbb\template\template object * @var \phpbb\template\template */ protected $template; /** * Request type cast helper object * @var \phpbb\request\type_cast_helper */ protected $type_cast_helper; /** * phpBB root path * @var string */ protected $phpbb_root_path; /** * Construct method * * @param \phpbb\user $user User Object * @param ContainerInterface $container ContainerInterface object * @param string $phpbb_root_path Relative path to phpBB root * @param \phpbb\template\template $template */ public function __construct(\phpbb\user $user, ContainerInterface $container, $phpbb_root_path, \phpbb\template\template $template = null) { $this->user = $user; $this->container = $container; $this->template = $template; $this->type_cast_helper = new \phpbb\request\type_cast_helper(); $this->phpbb_root_path = $phpbb_root_path; } /** * Load a controller callable * * @param \Symfony\Component\HttpFoundation\Request $request Symfony Request object * @return bool|Callable Callable or false * @throws \phpbb\controller\exception */ public function getController(Request $request) { $controller = $request->attributes->get('_controller'); if (!$controller) { throw new \phpbb\controller\exception($this->user->lang['CONTROLLER_NOT_SPECIFIED']); } // Require a method name along with the service name if (stripos($controller, ':') === false) { throw new \phpbb\controller\exception($this->user->lang['CONTROLLER_METHOD_NOT_SPECIFIED']); } list($service, $method) = explode(':', $controller); if (!$this->container->has($service)) { throw new \phpbb\controller\exception($this->user->lang('CONTROLLER_SERVICE_UNDEFINED', $service)); } $controller_object = $this->container->get($service); /* * If this is an extension controller, we'll try to automatically set * the style paths for the extension (the ext author can change them * if necessary). */ $controller_dir = explode('\\', get_class($controller_object)); // 0 vendor, 1 extension name, ... if (!is_null($this->template) && isset($controller_dir[1])) { $controller_style_dir = 'ext/' . $controller_dir[0] . '/' . $controller_dir[1] . '/styles'; if (is_dir($this->phpbb_root_path . $controller_style_dir)) { $this->template->set_style(array($controller_style_dir, 'styles')); } } return array($controller_object, $method); } /** * Dependencies should be specified in the service definition and can be * then accessed in __construct(). Arguments are sent through the URL path * and should match the parameters of the method you are using as your * controller. * * @param \Symfony\Component\HttpFoundation\Request $request Symfony Request object * @param mixed $controller A callable (controller class, method) * @return array An array of arguments to pass to the controller * @throws \phpbb\controller\exception */ public function getArguments(Request $request, $controller) { // At this point, $controller contains the object and method name list($object, $method) = $controller; $mirror = new \ReflectionMethod($object, $method); $arguments = array(); $parameters = $mirror->getParameters(); $attributes = $request->attributes->all(); foreach ($parameters as $param) { if (array_key_exists($param->name, $attributes)) { if (is_string($attributes[$param->name])) { $value = $attributes[$param->name]; $this->type_cast_helper->set_var($value, $attributes[$param->name], 'string', true, false); $arguments[] = $value; } else { $arguments[] = $attributes[$param->name]; } } else if ($param->getClass() && $param->getClass()->isInstance($request)) { $arguments[] = $request; } else if ($param->isDefaultValueAvailable()) { $arguments[] = $param->getDefaultValue(); } else { throw new \phpbb\controller\exception($this->user->lang('CONTROLLER_ARGUMENT_VALUE_MISSING', $param->getPosition() + 1, get_class($object) . ':' . $method, $param->name)); } } return $arguments; } } 6(%n74Tw*ǩfZ"H;{f~̷qcka]z<>f27o{xJ`ʮ]о0$.t{Jt"{ɘ.~}хj5jXuz56cUM /'K \ۿS)5R`~5AG7c&0痀sJ_%(8h$'Q4b(c|VBƵW~'F3ȨlLW&.QHSwDNR ߋqOhMoI.o IϪwnw>_Q1ߙiǷT|s~~Eҋ=/P/ٝ#bk1̖+n~|ux.]KR^oՄֲ+_WAp/¬4ZV:@ͨf |oK vC z," Ky˩YXhT{ b #>:z `AtՁ!lQʱ> ĸ:5Vx(;6B̰R{wdoVPqRpk!Q$Į❋DtnAFx!0O,e+n0 9ҬO}R k4@XBiyrrK0l2 4Wngi2sRD??x,ŏm&iGo[D&=0Vtrn:ʻEfxƕos1u*??_qb% =}j]Ȋx}FݕjSƋ0Uz pFU !^KxyJQ'**pca{ 4I]UA xj/3 C$wlMR'MfYۢgٴkJpp'\v׽p=Z0 -t2k.*/݂&ZAku>={ [l?S4 iii}!VB8.lmYcy‚"8$9Wx߭_#ȵ{K{7zz3Sޏ EFʄ? kB\󔺏ҔsM(0֋u 'YB=Y3Le6oSKMb(6:<JnSE_f|qYÖ2=@hnXaO~=dOp @%pv*&:U(pXR$!ԴdD'S1ACUIJiRr;0ց[3` *3Z)q!cx%y[Ef o瀦ǘ mH(oUp6wi~3gXwURCb1:]:J?1jʟۯC<6Co^2l g: n1Rq7]8ة!>6ߋ=)f-|+8s:vM̘Fכ`$L,apɌѬfPӸk.^:亴 ES4s/s= gXm?ɥ?r//+t`f)*NsFAբXHY]x%f}_M9֔LeEXk1~%-2u}u1ӄ^"xMNJ?q~H?Ʊ 547-*FX7-UعV"ӠD{4YyҺm*O^B`zn$5[patxWA40!AyaDOP)&!#j0%s-dCѣEO][+#v%iHveBSEzثSQ1X!eHxPW¾ONUaW[PnzCg=3[G&`M{JAkN&>-ʅ\slU-1U&`Lu4N| )^8cJ?j-Tu= J`[os)bqX/K?@@eTC;3yaCx <%6\|&2( ?OB=$:}jҮ d`)Hyf+G3$ox?/k]v^g ZfV} FIF2ɪ}3 ݐfåU"&yM+CZ~Hj=4Gt|Έy]+ )WHߜݗSP'@Ss-qzn;ϚQ58ݕƂʊ$j7zX, X uܧYˁ06K]^CާɊ‚b7l V%^wNA0ĬI]w w꬚Zk`p>X2V'BnISl| !1p=5ӆJ-ҹk '9$1ph?cNGKswsp@ 0 agI~pJ.N'iٴ2dzޘaP¼ec:L iQI致OZBl*abqtяU^HhWMܛq(x+$2m |aWfI癯Iݲt}ƥ޳cI(Aӈ<Ñķq#NL=p{JOK /-V8+Hw8*Ȑd 9^ur! j>뛘{|㽌 =t~zvBС8 ZЁ.?p sP#lӴ;e:dVC5Vd}SыoT# FwJJnj Z?/o34/'hv'.Y1~4h͙uV.̇,_doV.{ᴹ pWFy~H6YD۞Jfݎtsq&b[Y\9Wia ^*cRnw0 Q5fk y3] Uzt9%O/ԛ"+7]1J.Fd߹^- ?a ҮC%)ۺ&O6{ oB}V@%99chƢ(C'F9!ԮVasjBrt46Y7B&)z8n x5~=;ݣT *<^߷ ƍv-5=e,{:h8_gf_ͼ56v. J% D'_Hi_t4&$;t W)&Q6 I yO|;x$%jV8;.7ƼCU{0=bet>V\ Oq:3x& |0?fn1LYD>δyO v6'! 7&S:c LP, X;axJ8Wܵ ՄD"[?vp3ETq)mEpTkKR{|ͳtj&ՂaYzy]ʻd:(&m$:'Bvyo9'I$z@T\Wr:;,C<2Ni2DXQee>T!ޞ9U*𩕮neMcN5б2 `N%1=ڜvp3i56fH4s:\{[ Ðj7(65)f|9@j˫&߀~3bT7 * !m0:陷 P51ɡ} %= 1:7p7.f (vUR;x۸:S3dW4y]\JfNqTW^qϷ:Rdp Xֳܰ?؟>Dt/`%3+]Ċ0lkڿqգȎM䦍Vw{q&GQ{j{{HTm,\W,T.CP 背rPc/ 1٬È̆!z!oE?#Tq.5j_0I |tl=1{sn36L F]5DH{PsSx8W$Hedpb[oZt~7`OW4u5dnp'~r.A,B6U=;^FF6P>= !aP:glڙЩc 7p}"zӐ HtwgZWI1sw߳ t_# 5aZEI[Z=7qw?2׼\w1#G ~tD?<`}6o?)+5|kN(Ӏp%s^4dxk7KWIkumV1*!ˀ/Tf""\Ѧ\on%ȴ~1ϵBÆ96;zMխRb0<[tg4XgkUJ ~_.=4ec1͝f)RdZMP=߲.Q"y ̭ 5 600)uC3u7AR9hkaO-PFW  +nN?!X:A{XSQ [}EDt)& D}g F*.\;.w*L)ǭU.7B`W$s㇬`LKVASPZc'` fbP0ƳY}`:U@* =ӧ3 W߹NNxf>jZ]k}g;KI  EWڳI`4L/@a5j 2bJPsȞj/V@Q%*e[e: <;׹Xa"w:ŵ7fޖD/6u<$m6셳[`PB/+b@H$aWR+sNz&tzμ W,xa{Ƌu9AH*~)= h>Kln: !y*۬U%͗yo^8j4|+>cq`.EDo(1NOVD<ʯ78DT7$}!>5mfxPQ6.]p,**dXl.5ELP-6uWJ87{!X,lbP!hHua0m{qP3d&O@YՃd%_-VƧ]uGhE0mAY]JTuu=zAlG`_M'^ɮu$<G eS4rGuV+m WE Maޛwu+Wd,>7 0ϫgg1uH^nC7_tƇ.uU$c#@v?PE4?J\ncCq̩4ꨔ9S T|ezdߤ9~7f; n*$ g{o4J7asy:fk .ܛZc#Gc1&Y>$O^_'b~}N0 9M#Y_dAzޮ9*A0|JӄVijܱu{?(|b 7}CC9NKZ 5~*L=} aeC?3ru A}-X0F NNr//*r5࿵nrɀ(7MrTܖq9vXp_QGC\sT4n֩;EDZ;ۡ3rM)@%CMJWtfrgc AmGd!lO>3͖*+ɏIQk3$':xJ`e'k³3u_"Zjʀ_⵱ڋss0p5)nhg|y^]7|O%bȥ>8A:,a hz*v]bʨo|;_̼۟'ޮJ#@ԟ'Fԍ$6=:e$b0zēMgOLZƚQ|p|HFYoF0a'N V%)33'W}z6 AjP8WZ/?ip/:#ҍɍ_4-lH/吘@Ɍku˶)LU O >xǛN:t2)ÊU(|݇ڪKCr/9\+u4֛1 f2lAq='"M U(T3n"OYfbWkNjB}DA3낕-v54-*kEiWVMZuP9}-⫬)T^[XHqnwA9ӛp'T}IX |5"1KB-keJ,I4aWeѽB8c욟GF xyJ#XgZFX=M&DN\wV啙)նhg]R[V(0 $@;֪j.lQ8i@`Ux+PQW!ǟ@*8ObdI};/C-#"GPM8C54;I.mKA :L)xxg p#ŻOޥ*R ( ᳰndS&ޭnx}aWղ]Cwo 7N?4MY8XLfO1l$Usqf/ C!}mZ',g8m\鈉=/ٲN\YȦT-4p\9*{ ~V8݌"=$\_&HwؼڏΈT3Э/(d"s.t&Zɹ|ǼkI2􍓷_cwec#cB"Nd0hI$YNk|r CxU!-,]I3֫| 7_Fmu Î S"&SҠ۱D˝7T>eo[C?KHmT?rN;+a`V5ZTK뭬[Ii=I[|yOm,&tGOq[eM$TGK؅pvqs/K%5i!RtvatV mfz[{y)o^Hc+黴W#AQG-S#Rg+*"/N 4]ZZ #+"P++7նPXNh L^Jݤ줈x')6ѐf.dxW+WX \k zIQG T3] {rI/*+/Rft+ *+MA]:hp-'jf[MP \rqǒ]݌I8qz|&mxn`[ ~#ժwHB$m*@SP߬)Cؤ:5v/C%=/}^)&y>ZJ,Ĥjr LʾP@@ ΰt;#*%&| wzt:N5fRZ ܘf" (k/EpI v8}27X7 Dw~i^}$}3R(Ƃ[!UZåz,QWCۏVmW.[PV"Y>̆y@~/Y')LD0=ysن{_ y vJsȕe!y?㞁q=̃۵dȼ'gͷ01’s Awhׁ-F6\晟")j\N sY9DK+4bx%{'CӲ. b2FG\,W4g;(;Opr;ZPÅ_)cOq B5 5=uiU:ƟeYai=01YCgxIТ9{9YUvk`.f䠙 8cwG|^d):TK~͕ލ O(\Ss1wk‡+$^WqQ|;9+Q('v8 elt$Mߖ*lK0٫^Ŏa=ày+@H”ҍ?TFwhޖA+K8!/biݰPǡp)2)Z{gP._f%wZy,-Hvt}c*"k0,p+E\V<"M5E+3To̡!.ӯ[ʃ./7 lMN+Mǁ0@ļ \Ŕw~̾Pu'BHΗQM8!VRq,.1S/ʼ]|d]T#TJ5eRoխN ]^@ŽH e3vU p0EbsG6(5/T$’xfמH߂QP?3qǷ4t]uUjhaiB|)mc?ac≓T"|~ ے 2vYCL{Zm?4L{//:Tr7P7D᎞PCEshd1֒/:nLkYJ15:ꚨ=?L |Ỏ*+y & AoKE.]ɥ3i*"L7g:  0BZVl-[& f$qIYV 񴭯Z`ts:zb_;WV%F13m|{`9ޱst#SO0! G1C{/lDž)r]Դ8 9p[p"He0w,Xxc~ocIc g㿦NYfрT{ ~p (q‚vrۮO)_{I[Bxыn񭽈;ﹸf,FYN0L~HLk^n{â"X@N{)dg8UL09:!!v60X- 4=`7(${lèld<nRPG6%`$gܪ2gDIX NO1$VH/ϰBB?X8_7_7]LjU T)O0brY7\pA,.yDsZzv,3F^~odI)q#0|M*%hy(cmI=סt?:[hvKOOUy.H,7-M5K?}FܔK[/O) .pG~ {0bEظ.Ѣޓ>" 8CՔ'܌44߿uCْdyRQ\F$^]&7C: U"t&?zXw& o7[괨,Ͱ{%vwau\O ԜI %HJҠ^'kq16I8ԫ<~}'qevc"D3BOb涚D*i={ZLQdBy.g$x3>^6ONh_.X47zOm!FFQD(d*Y*](tβG]q7zỌ!@\J(mBvjMUI|Ԋ\8LP!lbVa! <[G~E֤ed؟IFXUaUL2<~kuVH1NOpd&=̈%ʔxŬezE{Ğ~>%ctK)wӚ;ۡ\_ ROf;鴍s[ tZJ{fv,/h UQ+Nx& z0.""zO]Mf'܈۫$ POS\]l:53[!g(gv(_;K.t~ T\<-aj%^LU^v]VEM#3;rue'lH/*fدHo#^](`;=B3tm:UްCQ8O<#pg'vBޏĸNmPfϐkg2XMlWHcƏ̺2T0 5Id՗J\FS]z~fG67WLG|aGV):hCE@0VMOw-k7vj@z"s <9J !$9? &"#^,0qt$1%O_ {|aM'xEiUpݾmǺкƭo[3xq!Xtw0&8F (kѷ-x1i%`x# V#=$:X771HF[fd;/('BxCЄў>\+rf/~_ڹӌtX:d{"X& G4OsA<BCQhyS/ L9 ]wu!,&TJYGny/a޲ജtWPoR5J爼dk\"7GO vf}_G'2V c7.ɀqNW m)tTuu 0Xf#:@*Z+G~RD_o۶4Oa zaZЙnd}$]Ha0;gIؔ$N q]+`#uE^2jh Q6k keE8ZԸ[s[J3)#d O$*hI8Cq: eMyc>+NK.tZl'l8`'19wd3P X~jh9t_O*9Fbz݈NޏR#Z2gB tا3@\n^h__?;4姖~Jgaju;l4z5Xfe)is]a~O+yofq%l o au;R$У#.|C+33rN r ~y{gqT„(@up#,LQ3KrM)ЏTq̐{g2 mT*o .ԫ@ʤ>"0V!j{<XxU /B˄3a.UaaV~9!bFl#!V=sG )!ޘuBeˌ ]H5Y.wk̦+4E*ݞ:>Xqv&Hڒ=NPA[gG)鏞|h "6T.3vL@Rk)|o@DŽ)W<9`e4m07?0F1DJށ(/ |zY~jM-׵yc3ޟYa4< n Uv 5tX؊nVP!)C|4j !QW?TTp+yV.ȵОLqѷys;@gQ+&ٸ H}7fI-%y=DmeG\yHKaHl ʪ=*lNm9 +ЛVi oNuw%X>2#Q |7_L*gj]e~1+1u*V Øos.<ٛOpdx4&Ry;c_/(nīwcifS/ܺzݒ, GЄ?^\)-#%"$)%ͨ:26aAny u-Ś.䷺XJE 7mdmIܽPjFT4zZ08d.f.#'QۍhAʼ7FaX Z?G%DFbͶ0:%|k D ϑb'b ynfqs)?B5?lG ^2;Pe514 Ū$/AJXoa8%MvVosu\=⡊#Lp{S ={ʷ  2ۉHn,q}8%?k& %lݕhhLˀY' Е5X76P-"g2 ~->H[e|F/צc!m&0R V9sқ.NW}~ a[cPF*!U&p]ɚ18O{S'{Ey#pdhi0y $$Qns͕RU}VWw_HHz~gZefARSkn]u6b֡_8Vd0!]EfJ:g/Ggï̖KKYMb16:*}z7!zZXq"B#gh&!SIPKK?σEՓY@uB|z欘+a,hBvpUs&Xq/p~hw뒩am*fbX74uU_WӬi(`{p"͋*rokjw2QAJ^%T+G" kto__lϕD(6?? s?@ިZZ %lwXT!e[QӹIOEۉ93-]hge=ѯ}TC^l "3G|xžBR&mO0 ~)ṅfsh *W6&Ka׻?b~s|KX|4W:3؞bgBʖº2gϩ &@:vh^jb*!@" J{4jn}`n eOIbYpf+F G8 U򣷹M WG$B0V5t*1Һy7zW73`:qd9P+qҨZu[JhX(MJ$] ﺋ0K##=؂+WDc gԲD/31}t@ʄ܁F΃ JהUth}J"ZL ޾l[DoZļ?@]bL$Ȫ."JJ s'B&:o5q|>~A@WsIʙC0L\۬, l+rGj'͍goQXIډD`wXq.NaFYGvbonLk/ees!8'%l)O3TA狡'J7pQ켴܂LODb)%.98iKb9"}8-ݬ@guFUIq{ X7C)ic]En-q̑GTm@QZr5`jW-P%nJ N/jg̐s%'rXFTkUTM^E+5aܪYUqM VmrP=3V!mG|eVLr'wTs1r֊d6 Vb\ `LjtEy̕! {=h-75lp[P;7R\`?*"Ԧ\Ĵ/r q-"ɧ.D)e9X7$9i^ 5 f`L̟ ;A}Xig<2.H#{4gxW:={N<ܾ9|-J6/n1j+ox_ęE?hhwz/inÝon1E~d}M˜,aM,ERFS:aL5Z&2+ebu>5Y0 _z6g>W"!LE Z쫷`du@ 9] ”T !Q DAShp%x/_YxeǪ0E5ajl KfEͮJ ;?NGiB} Z >6-@H7ifae-CVPBPQ=SlKuxۇ$@AeOI) ſγP\=ue* idEAet[lIOF&ւcw{c z;bx؆gfq'{\ U6.wM &XxUe-Orh| jG,BY `xRjCZrNy(ԲJWGY:!N =AEABRNHs9K9 A>ĺr΂wSDu/QoxG)hE>WdQSQ~TH&Gw,@Rr*>o>H_pőr3ceFaVx2 BHe?AP$5ˑKqMH+''+wI L5yyUj{&+jd@p蓉E<&]YnȞ䔇_x`}Z :E;ٽoכ s-к^ o ,wӭ9+u^oFW'@bsٺ U}߆'@'mrk nTgp3V"X.jOU铽Ш]pO]pevwۛXq&*'^-l?ݵ|.JM>oLRduDҫNtg˟(f2U\ľ鞥J V(Gel0n9:ٰcZkO%IeASRI^-&^u@"_2{1;֯KҲuBP`@aIw1i_uM\`BQT&ξE!O+0@݋9}uiGElڏ<M^j1?`eF춹Esb\~ůFLʶ$:ù|&@cm(0nIOS_BtV#Ff sZE\ChHűF'z"l >\LU`ZVÀć%clYQV/G:C6jaW_&hx=p* l2A g>UƦ|&V }6Az9\¦#=*2Bx #LT p4:K\J\jNGNSI:fycjuTR0ux.=1{(1~cF1ʥ8_'!xF2ul)8%z~ FOBRI7h0S ϟF <7=0 9WsZ^ne>Hf|E-r Qޖ1q !p˼7)Ϫqt$jqN 6W!qA&1!> BK? t3)#j6H%?'I)+f_bCZ{/rlgy̿㏨WG]`WVcop_}Pf2ȈXZNKˊ@FT`lC>"dJ"6Vjh Kg 4 Oe9CQ⽌W3p_=WD|7-,%)_bKyƶHx9B\s v&_cF|u# +oFQ`?Tdͭb'b$tѡ' Q^2Z'  >^xL5.NHgM1.Σd o/8q\c;ǁ9*Jl ^tq{fGDneꔚȼj]@)|~T6 4 :>|Rq1 '"4.B|6k;:a;$ V{LS7ĥ^~TIh}@UU:$yMPN֡8GEݬș%K!oփkBApSӷp#$mC׻9KNm \3Pfp>4LBhIs?en W=h}R?biYUS+S"7G_E4e}ߟg-: >C[3: p$R"p[?ȵEs{`:U?LIvX֣M+)5Bx=Y>^g,QUrRrEMŽ9)w4iAԠ%KŧeB?>[POP`Y.hta!-%1 R0_ }쮥5DJ7+:+#ÝV" A7"䖲+i@߿denWf'ddm ՟i&CDj]d!bvGА{c&5MSl>OLT`\EOak}w2?tS}6ُg=o%dQx%CBKfni> Tp!ZP(m"-|mަ_:p6F@>!{-+DW1T#ME`u\\qYR!gIw쬒 eD*әU`ja`DnC6둮KyRzuT) >IHbeEK0R pve**!E9{RqEs'Ϩwˊ#?[!CI-QN= [EGlR)Y0UA3*U_vS4#ŅOeC2pч܏QyBx0"7 }I]{&ᨪn]@֡N,+3_c⯭enfG{l#lEͤcJXeC;" 2ʇ`V{M͏hré=/uez&h-i^Rj_.nNJK?Q-0IF1$ }?78VU 0@"7_HS@T:ߥ vQa/u)Zu{miGq s-"0|suEAZȪ,!=u;pJ+M] ܡd]9?xx449١4npeL#0~[&sX ^Bh\~S mCn'Qch''>墨k밻\>= OV *9Z M5#K}Fhgv v&*<̶5In_x6L%+ESՄD۝Π /y)cTI )b%fn&j7<2nǀg5>*/Vm.QS{CQf"NL .ڤRd΁(\b5m+:0w4oL0?pɰ8j\arqv﭂jneb[TBW3) 28ѐ'zT*gFI)6onc]ק m+s/jpܝ?TD2$?H]t9;tr5$.%Z)B 't c2!D̂!QY4@D+DJvm`Hр~#k(< L!0 }K az`)gxgiF&SIr>s%75_}]@a׉/q"ɢx M93cyk7L>8$DtbdTgfA ,&G og_+# Uli̤d1T%8yЄ$mA]YrZeֶ(S,Vk{H/VR;+$W }|r@,]`l:̲h~6"_ hƏx4x/9n=N㉹ }*g#~( ]XJzV»,r̀1T k m(h쓴wl9<;rhm/ѷp +oDxuז7w:D͇>v.SNJ/E?tCeTCᬮ `Ԇ]~虏#$" "\7]u|qa-IJ= pW.6EFo@ mq3YU&M+ܖ747r@!al8_R X*;P{{ ~gW *ǭ_)wdoE话a%ݳj߸1Kԗ (V.;mܑ* #68++X_~*F1A CS!ASI`x4C t}+`m.勞W[ȷUhŏ5mM]vKi]J5+.^/,*'˷"Ɖ2*/@=v'  =DnENrðFfXQ &X{㻡Trx宴B3ȗ xgf_mX~XHO7߬P'RQdh.͔5z{טsfR"DVd{QB t8H5&EǯE'ԣeq&S_mf8RI[3c"\8H~qXXkXe>/a\Y]K<Zh<"vvPaT ֽR+S3ʏn_ NaM9=AkwCʏk p_(v3I|119tTHOw{3 4pżg-WEn1ͻ0aZd7m_iGJH-ulp_"/7;>nS24G{+f(ȇ7,D ? ܰz03hizmky^4^@z,"qx/T;Wt+Mq,4JghDbb)j8aiLst^Dn ꕤHyr_?ꆊR<7*D|pׇ I3B)d6H $2̣S9qO_e~ez:X[!=L O2@ \n2}USYY.gUhPvE7|YvpޑfXw&bpHk9I|еUvsEK_]?a*Nql睚 y(AXnX/O_BHw{|b3 f!Pnr%#Aiy[ /m6'6G`65.<V$H?(?H?Cd[;`%oIp/% xP Fl&XyJIL*ʕ6dY;^[@"x1zCX׸> bh $!7wc>e=~i/dP}LVp\?H+XcS_F!S7FI+Er-XPg'%{tƩ ,gܴ9w[OoCG\Qh$ |;&]_س# u>v{Cpg^x ̀]kZ<:C2@y=ПgkhEG8h4wZRv<`@5}z>.t$W &C.^a<|YlD9,zI>9MKO K5[sCJ kc$ݳ uov>(By@<$'u\vo2Qzḝ.YW,P[)Rԛxɿ)niXvUNȆ5Ebv+XNNv:A $uxI16d`;ht`Yn7'6Y2fhKDYTߢ@TR oJx1Ѣɉg_(<^ktټ",6B妻Yq\.]~^q("ëj \ ͖"B?R9`Ъv;E#o<7d5aOd1 ݞFi4꬛2[陉'HN*lIkٵveCVkwA2Ac1pv+ets _ڕnޗ P^ =]Z(> B{!a-Z˖aρ@3cSM eA7/Cw(is#YrR*jUQ5w ^<99퉃^PQPgt?-{R=EEu*q&KI}7G/FM4JSFZitAi2>Z9G2 %H _Ld˔7MWp+x>b(a䆚hhWq\#q7x-nTp{[BINWУB A,PUeB:|G'k)aJEBcwY&Kd0} !R1LT"Lv1RRZ#M֐@vO BQ25v ᭏wbT@h7ΓF:W` p'ŋX7"q#{߬Z TuP`$~ 8*/WPF<|حmnGoBQ 28I ]* 3;z6kc|}-QMM0%Y rxb@WMu9S3@%K*mj|U@-ӡpelJ+y3%]߉B*s#v=KºY #_z śo ;ь (e؎ycHQ}o>⩙0>r59{Cَ|tT>KL)IC|&C['U+m^40`=FQ 4y] 1f Gf$EeVj#7 _jk=lHn UvwX&XC͵ۍE/sZwT˕p5Cݩ(ܺ*)7Iu Bm').[Ќ:[AM':W}u[qzZbS#Ar]wC3YnF["G0nAIJ "cQa[ gai`Y;Vs4|>ނ l$bei70n}cmEo{?IoRR7_<rW̥<졡wVI@sz >Aaٳ|߈Z/GYTEp_b$@"Ї|6*"T(|ZTHp"ThmDےM)a8)EBK}ƴ *:.ظI›PD<'r1`[yRJZlY0gҡg>fԥg9PPz棣0߾6? kG5^ŅɎpFAɡarrARz)8ڧDCRɔ17ِRLd5Bɟ?(=*5 [iM#1%9AP$>>}< m&f,WH-OH #e'3{"?7gp ߍ:ɟQ}xѝpSSmnNG'UZo\ LV6O]FWp eCRʜt.yRlÑU,seZC}y7!q˄1oȯaf^(Sݘ6TX7ӈpPpTY%+Dso;"]c"`NQ2]U'Ҿ^w!gГ+Y+;#?Z =aɿ`ңPrصj 4uCr3[`WM˻o59ˬ^E Q'{}9ī ^LV5%Q܊[4];V aqQ1YGrUhJ†!E-KKCi9bEq85\UnTU0_4}Ӎ[