aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/event/kernel_exception_subscriber.php
blob: 373e59b0c80bca05bd9fb1b5b4be1d317fac6807 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @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\event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;

class kernel_exception_subscriber implements EventSubscriberInterface
{
	/**
	 * Set to true to show full exception messages
	 *
	 * @var bool
	 */
	protected $debug;

	/**
	* Template object
	*
	* @var \phpbb\template\template
	*/
	protected $template;

	/**
	* Language object
	*
	* @var \phpbb\language\language
	*/
	protected $language;

	/** @var \phpbb\request\type_cast_helper */
	protected $type_caster;

	/**
	* Construct method
	*
	* @param \phpbb\template\template	$template	Template object
	* @param \phpbb\language\language	$language	Language object
	* @param bool						$debug		Set to true to show full exception messages
	*/
	public function __construct(\phpbb\template\template $template, \phpbb\language\language $language, $debug = false)
	{
		$this->debug = $debug || defined('DEBUG');
		$this->template = $template;
		$this->language = $language;
		$this->type_caster = new \phpbb\request\type_cast_helper();
	}

	/**
	* This listener is run when the KernelEvents::EXCEPTION event is triggered
	*
	* @param GetResponseForExceptionEvent $event
	* @return null
	*/
	public function on_kernel_exception(GetResponseForExceptionEvent $event)
	{
		$exception = $event->getException();

		$message = $exception->getMessage();
		$this->type_caster->set_var($message, $message, 'string', true, false);

		if ($exception instanceof \phpbb\exception\exception_interface)
		{
			$message = $this->language->lang_array($message, $exception->get_parameters());
		}
		else if (!$this->debug && $exception instanceof NotFoundHttpException)
		{
			$message = $this->language->lang('PAGE_NOT_FOUND');
		}

		// Show <strong> text in bold
		$message = preg_replace('#&lt;(/?strong)&gt;#i', '<$1>', $message);

		if (!$event->getRequest()->isXmlHttpRequest())
		{
			page_header($this->language->lang('INFORMATION'));

			$this->template->assign_vars(array(
				'MESSAGE_TITLE' => $this->language->lang('INFORMATION'),
				'MESSAGE_TEXT'  => $message,
			));

			$this->template->set_filenames(array(
				'body' => 'message_body.html',
			));

			page_footer(true, false, false);

			$response = new Response($this->template->assign_display('body'), 500);
		}
		else
		{
			$data = array();

			if (!empty($message))
			{
				$data['message'] = $message;
			}

			if ($this->debug)
			{
				$data['trace'] = $exception->getTrace();
			}

			$response = new JsonResponse($data, 500);
		}

		if ($exception instanceof HttpExceptionInterface)
		{
			$response->setStatusCode($exception->getStatusCode());
			$response->headers->add($exception->getHeaders());
		}

		$event->setResponse($response);
	}

	static public function getSubscribedEvents()
	{
		return array(
			KernelEvents::EXCEPTION		=> 'on_kernel_exception',
		);
	}
}
43, H4 F}VVU@OI#*ntXa# f˅~V3lnmW4.Me-&61DnMPo!Ա g`iQoe0]}#[RMd՛)P1{O[ud1+aW'ɫi:)Ku52kRڗ]͓ns'7cd(:8bT? sXJh늅}BFi ?35a  ԑI60N5/Xsq@$ZYqԀ Oz1F^4ž>佡s־E3I+•g\@* B:hgȈȴIlY$k?jR]ђ{DeK KAe.@^>MBo .E]Wƻ0cE\kPC:sem~aR^r=Ԭ}|#Aq@zyߊG>'1a`G>kR>Dm.M7c&Ash\ʌfIJ;$ >wVyoH&9;+MDf~}-cV 'D\|+  \at[]yV:V?pB1I~A/MuK"FK7W 29W4$lYv˄h{X2·,@` fUt 0(G_sת)襤Rŵ̛%Y)O=B1dL`Qjw;[KdMx,yN:2%c٭4zWOPE,Kѕυub1[1p='!$g 4tμFDEG^ҟvu[7O˅q:ѝF>@8$l^$Kq \JJۖš1Il($}Φ=ыf q,,r =y9O[+7$:!W=3nT`RnˌpbPէ=sƞ(=͜׻?Q 쪎~q pZu>X 5dBRrmCN0tsz:niY41&/`jPwc" {Aӝg] K~^pјq(c6>rNsxf:>}Aӯ>.ʏs_ cL}KvYTSi*1UIpofK?ֵWg͠S4VP5 Cu[ڳ@;Tڊ mEH] B8.:0 ^̵B p4%JԸm /)Jb0OiҮ09,zbv| /pU9FX,'4]\g.S)}#TR0-ZIhyo%$)F.[y˾lP(BT|XLhJp73~k%&iGf#n~ȭl`J)Ɲ)XA>Ҟ#Ě LP9uv'}1a硗,L"ۋdW;] nKz[~O WSj(^zE*wRHf_/ e_"MB5ӢmTڧܺĎ0 6#v- 1E0yGuu]$X8(vl#*Q^{ X0%LgX,>e˧X?weEaD͌ oץ;-"T"8$7w{mAdg&"/&|Ϝ&~HJixAzXTeR!hׂ( ygYcod6Y<姰m*^@ *KQI^,[*dgG}WA 3֔{}Ԙ=oc23 E㷈%~6 &a}޼TT~b$-.o%,oD\+!HpJ{$`/s?8MkI[¾bw}I=ơ+DBauuN/ ɇ+0:\UfY}(&= +%S:ܠk*mh՗6( .CͳGÂُn}ܯ4byǡ\U/N0.6ijT[VFTl+R*b230\,|Fl]}^4>UC*⚟7k)1 -\;@`!m|u5ono=*Q7\ҋ|vr/ԱUsznG]R!vr>jG_~LWF1^3#s:'0V)" Aǖ]b"qD#H^(uLmҟ{0lg9 W! ,h3]៕J,^!5pD_&J ox'%8_S* +T`(WeY{#I 6hSXF/@Ċ\h5U䁐? ևJ Em4qZ{GvM4Jul8{9l[SOX0, n~4M^X|)9a`c}_6W?%d;nZ9 ]e\ЌEъvH E_J/}wPexԧiԀ60puܗv'it\NzYhGotl[@ ]knuju<1O<*g h۞dRǫC ZaG0D二( ?pqF*ۓiڟ͍TE0 Fgm)DX9EgQ=(OgJ]j0MfUQs⻢'Zj뭁![' D!vQ{iG_FiEqh~ghR4dp*lx2ѦHre189ca@m"94֜Pݜ94y:Qvj}\]z+[TǢ<5[iRoM!6*DقkDa̒3g!$8JUM"{f*IڶWM*7Q&$9DR0UCVr {/o=4z- zs:x!T¤b9{lԂ}hYB\0<- ܞa2o2;Pw1u6QM9!/汞!G7=0G)z5RwmUz} T G_//gP(qpԘhʔT*(!ZѷǼFT J2ꎂ`Cq&a[IŔOo5^Ë&afO=O7#MoԎ-9b_~_?zzy,ːؕA"w"ze C#6ʴ>{ nPR)o9\uʎME~/gll]a]ReĽSG.`ؼe5 ^08 c9QK1Zt:~S8l3P萾O,n]릌R;'?̎EF>qq/Mn% Q.]lV#iy1dvyl*27 YT 5X$aZt):P >hCcP|8? ĵT(C6ZI,osքL1(`U9KKhf\}ʿD$X6M_ 52 ;Wt2pM#x=p^j$2|k RDw(މ6$ؑ=;ڸC8dvW@k2D>B{ %m*iU]o7 Ȋ""Ĥi;I-Rh{TJ4yÊD@3hYեja :ABç>[1t4%ϐ=ŇTK4B}Tə7A4 3y@}T8Thx *;\S'^K!h_{ޟOWJr\ReӍ '].HU"AעlZqeQ qqYbtoe_SWO*܉Nq>mì)9m09M~}`r?uZy.qt=UHT(P\ xвqQ5~V_(lk}N*!~Ne+:U>&+\-q̳C ]rFP`)@k=JջӞioڋ]#pJЄ*2|=wx];JP!HD9ldΉllN ec'#cWYBiMRs='v,r4>xxTW>RX`K?e_?c)1rڨ/VgTn5|Ofill j_+5qzǤ) =V _\ 0N}Uc3J\#w' "ad[/ م?rWÑP}xxHWx?ne @g,?HT|zC [ec֋-j"z +SܣEuC e3.~(&(eXI;r/ڢաPD֦@U>\hV%G\Q6N>3p~QD%xI[ٌR(޻p͂<񒝢kX{o^,.r@xH5J.KQȭrQѺZnkX#en+MGP3WN[ʰ,Jo겪Äݙ.^ (]f 3dQc T_~^1g77+bh$t+;n"s3A@AOV9#'kM3_,٫!mڝ=J 8ʌ AUؤ)Y#*(/ƣw<QF@N 㥢W18a@':yJ#pad|h͊{pk ]\ C;dU ?Q/g1$"$H|gyȽ^p:.b1Fh1-u4nJekt\ym"LVV}F%u0eI%RTq*Ԕ}ThRz&]Ǚ>?ELA.@c& Spmtf }G-k}rI#kpƨEIN̆ KxS:_Q4b^GwmԬ|65b}-tס43%9Ɲ|Sh5V5^x<ռ|bO6p8/ V qxq}938]eQpǖJܻXb1mxmT5HV?J!T&usd mppg0ց0|\~A<"Z>_45fl) ;MoL&AH')ݗR>+Os .奅/ >;0R.\Zu/Y]<ݍb$Nf S"l/`,IGLXk4]C|a[yMSxዉ 2>%#O}k=*A|U)䫇wXtI$km;1jA<ڍt'0$kl,{KY>JUgv+8kudd[ftr.b9cvڿnqY#jhs~˽HΎj.ME'}&P$O|u8~#%{햃- bh1D cX/4"e >Bܒ(1!fXR,JlG7qp68ѳdomnaV3;B@YMdz3OAX,ƒPi7biKE;Јe B{@JVSk1.j|l=r8k 5߉MT)Kਸ਼%L`S࿁'I|)4&iYΗU ]oLzף^vLF"?~qEdzeZ!Z_Q,wΧ[jV\K(DszaxpdE$nߝ!D_ z+u(l`@ߔ]GBk3͓~}^8yőJ2 B !K͎nGnޅw亾oc]wRblN1&eCA,z2 C-zlNOwx;[ тV\y& IfІ0Wc>k1syWmBu٪ɾc=)l.iءW;piCCxǼ*ӌK-@ѵQAi94$T7=2̭&J˦-]x"'Zx|*nI݆ѷ[b?}pv.1T5j\0҄g}9#+[ڝL͟n)n%,K$3`^;`#LvtQIS{I>%>n \:X[6:3I_0A=[,T+FDݚ:>W 6D [U!#<;WڴӸw,ws)\bZC@=mWk0!iW\-J`dڥ&$*q,QYqm1 4DXDssG d5 LY_v~d>5}%{hЮ6b8ꐇo ><ƭ"J.q.IJN~T{F`X ?ԦZ?'u)=YsokV 5+ Rgәˉ08Sd)WS+ ض!n1~O%NAM(#7Qm!"΄#/j 1̼er) gp?h^X pFFxȔyB&{I/\n R 8gO +툏$U׻%<7TFOC#2̍~.}7ojn# lD͚o3$C$ql{KfDz&V%6`VHP앬zOA4EyȤ$!V/F b&KY`kƤ\F&4 (^7NJeezb7W`FtyafUqXxYfU'LF(z/\ˬi3a'M"M-Kv$N"7M7G^ŌG@::&e.^y<8p f j$Mddn ن̗IS%ƪӰ0W~j(Դ(Jm5n>n|hq!ns*=,C*29UBڌ,WccaaOu442Ft8\rBkyqX6i1]εN4F李% *.T^Gp&|O8`?Yʴz]P$z3ڒzEʗRZ} 7m@R= n+`Hx23H>R@}]iW޽E;uQ.SR693<ڒEps4\>IǯL^ Zs =#eU/ v~˟ =`um6D~`>ڐ_#V S>0h(a PJmO03(_;ix_h ;Ko&:lJmKmGoFDpg%nPhz2[n\XD.,T { A>T_"Zr:dіr:6zZr[ h*Eʀ_8ѽ.-i}X5  2kna);`z08s0{(хab}NGat۴YH]Z';eTV1Opt@0ٹJ{{qm9 jcsni ~DןCzZC~$ r0ҧ7ޖsޅɒ6*CV}1 Pw^ǔr)z{ՏoG ؞,&)+h>tzE\!~%gt$"g;<^Y~Ps6L[*̬Whw9hm䁐lpIeJ N-0R95$pY$S=KF8XX~Ur|Y%RjuBM*0~6'nM,U}=w+z'YruV͵@eWIAtaDP{$_r_ 8/l2+Ցg~`o^M $.GgA5@L]mw#k |8>;_\AI`CeL$~&:+ 2װ#MCkaDh{ qo$R5G|+'pqg~i $%~X,XA<0}<:mĞAs^.ܠKZkfx k"J%  d"Mu ZNtH_/_^*,2&yYĘ' ÓRv2OKw_:%bg4O#ƅƲ>Y-[4KO[CҺR3qtF#p6#% @huB$@ !| { aF VG+yP2(&|?;?(TyZOv5_-0"BR;XT ؃ yY1c\~p}hhTԡsyk+XG㐖ʬdH90K5jɨ[j7Z)k#` \icLHc,[=t{ =q SMt&RKxMBIc,qDCѰEhtx*U-Zl4SwW2몛X|ݱwfQ<~ ;4IomZ+T/T-!㴳 5 }1p2@ L}X&L${+ۼ;DY U8_>&s|ɭֹFVj8rd1 eK:ɱ}6{Ӽ~+abbJ3'Ǽ7r϶z:V薕~sG,-1+y B6NXR*f'-z/ r "v+ړE4kF8Xαd]V@00j_fDf{]:-f=1{x8# N[~_tExx$@%ƶ;U2;pWMMxe #$Qd8GuLUC'&&*ʫyqxW=?vM43KW' U4\c.Pý2.\̚'_:` (Kg \+#dJm qwD /s8Ln+XU cgbK('zGӘPB1*Ӱ:Z5S|r$ߌwr,y)2l&Xn`6o앖kpWvn*,2%n܆%?t˵3"KjQuyl5#˻i ! idG y" CeM'KcD I;ڼ_&a?R>"4%]ݟ]I I#20nuݻsѷ%dɢpP8<*S7>VxԯC6^NGV ,,l!3.yHV&11[?#G`|UMo{L_>}]D;ls.jupfPΏ*9ozL|+6&cRl;ɸi׃҇ b;$vbƹY\`J lu毁KtbCiB:4qzH /d -u ^4*cpl?ؙ_ۏLG (CN4+Xb8mV'\4/tB{:"ϋkCŝZ${m`ƥF~drR8˞nN,WNrtoOG}r8&W^a®lKpݱ:J 7VTTA@:=DF>Sq)#cbSWWg?׾3T^f:F և5WRX* SQ}zh?^,ެv%fUt$T=Ss6m~@/κ1) $1j+4O"xr??"UkJ-OF0nha?\؇{[!kbGZae)8Or0X 8W$[ !^r 5 +A O/D~m  ?[hibNM\ ]gT8zR>U3z8Y)=VEC(T5BU&$܎Q"$HY¯q;+49VV[UA]\ 5A]_Pf@M_a/$7鉢ש}Ix|?/l0;85bIlQٝO񮋓2!O]<#ȱ!q$%@~9wf]6 A/S:*(Yqg]/^PJ' &>!6k \ nOR0p.kr{ e[7e[?vo',i;z(/?D?0{'Us^ ¤wl7"q5p"3>y$>8D:V'/yCPβ@jϫy(ArJ +1n'IVIB^*).';_5? e)mFN2>E*cՙK_UgahrYkuɂ1C`/ohZ %k\4/ޱ9je)gaopa8~>\/O)t&x.hB^4 qILi|)<_v6=;- kOM3'%Sx;GY{rSẊsʑ /eÈbwInN7S-#_$iSFW bpuٷN M]ڵմFu#mJarQ7Kh,)d*c}shZ*T9{HnVMhYkLdl?X~1H}'dڱ iQbno ^ ,Ϛphn<<qFK uZw2Hן ڣqnȝ<Ƨ,3mL>;u+56GĔKH Fb.'kĆ> %@ '3A`Cf`0ȖT W*=)])#0:S[ TgQl'sLe W9De@֔{cI )q‡GNއ 鋢e)JHvw$h"h`>c:\'8T"(e)P4^O {#S8й';R{ڈѹZ]ۏjh[OV!jd^!(f=bGg)JFVguei6{%u,9|pE$&'li`^yW!-Gs'S'c\D:>D1Apһd ~weC$AP_|eAu8dN2HZݟ`(7fXW_&s3M N2yPޞZ(;QZ8,d~rn1:Ĕs b OE/﬽ |9j1+췼ۡ(] by-$RLz+IJE[hit'$_wu0-tӑ8 l5KL8=^/eB$]`,)-xآ*F,zczvwiDYx¬`(?bT~JWDR{p+bVz8*=+[^./I ,M6\/J)fږ?lgPVt9]ZN޾,l[ 'ژc Ҁ_r:>2@-s087>czZ a ܗ@^:(ӘjES-1x[L'a ~thX.pa-u^tĭAĦUR4xfޢ|0.%anL,2?@Zq7#ImÅg)՗O k{ jF0[]⟋[QIkTٰp-#"i;6Hc2t=f?u@"HM/"TK^Y٦6|A.&߳kQTqaoE{Z9AE`q@VŚ?/s'e>UrA؞]HRHtPpXdM^6AzZ<⦧pJ^aUk:\JE3|}[|'3jnd뵟(q>Z43X+ԋvU c>Q@0HzqZGFD(yb_cVKW3Bk/{3yBA*C AżكZ/h;-[vCbJB&Yyk8.FSCPVj Mc Mȇ qlO6&A5yNOrkey.Kxi,3u$CES3ߌ)X/)7 Fmʖ.~7nYJSXMg0#񄭂 "BJ78)"w2?ejmpD * :*Igd CE7pA!):Fa/.l!bBs.0d4yD+4z ʸF rn;،F [jۻ;J?t&`+$Xȍa&5e*w}-x- f,Xذa@?Q_K { GzS4cn\UYa$t𝯔R5SGK_5iX6I-0 +c^T{lD!fS+>IsHL>4ۮe(Jwܨ̭ZPPs/p.Pؖ;ˎZG(g5E ^{BS$Ed7џL䓒/Χ,=,0OB\ҠCBq$jFf ty}CqRF.vxeiH[·e2 +z^ÐnU8!88,C)@6rƎZK\' #X PS1}4~)_[g0,6P!u+C# i*@ ?74<_4f|ȮR/UdbL_mT}."oDd촏2AH BcLdzDTE'dU^g|"ioM'i4ٯ[jt=^tls/مo.#ҡN=Ħy; C|mj׏>6T>nKӐM ,D ]JvbL;hWvh ;-/$ Q|v߾ayנf1'` pRR=L~UL'4!vae?R%DD860f{:-D0ƛpI䭫ړay>ޙ>8_rܠzÚ3Jiuݹ3A*t5ۂ@q( kL!} pxRq^گCS0e7Ֆ5ri/+~Ȁ806}8 |$f;ajay|%!38+m7J}"5j9̩fESj*b;^F9,*sOǭstZ%ȑt md 2:Xe)aT0GKKyŷ1^7ndB?ܿ0d$} 8$cE~[#zmHTϞ\Dhդ|&і};מg#4#<*ZJb: `XnizzƛGk$A# Cd(˷!{!3MdL>,2 >-![Çxnbv X!P0[L3&Ds WG㠡Y7p{ GK]{4KV4ZڜFǜwXu_{RcT\:hj3\y$vj6l[ؑmp(uLZ@VLjR};u6]ZCs :@l~Ğ)4xY+[UĤb엎ؿx&CMYBk46y^bQ9(\"V Hohag5 1 8hXRcE_q?{.?6|zZ*#3ol v~V{ ĤXU}`痿7]!ÀSGQB#u%Qa_eqCF1k1_MDFNw!kUhy ^6E׳rI^} Sө /u/9G3;jh:vsin+qS F gBHZ^kR#3|Au?t~҉]!l.Y6`uP[Ũ"+NJQ[֢Z1 +%t%jo+c&/Q.攴ˌ,z5"!z1nBWd;1,QdŧynjcX~kôk)z^<'h6 b,}OeE <{p*,(2*v"PhLUCN6؆  p&7!Ş: k𗳠}ؖ@i{}P^]}ಬBhx7EsU&۴a%Y*~zpeXF WX?k(cp>Jb,P.C9b|#7nÙfi>H9_FV?͡TfD ^oB;.e]sٯd[;0Ӂ}Wn@W#y\!ixrD|ٖD pQ]A0O"z!9SDR⇞xnH^щ“"wf)y(!((5]!Bt WjIG2b;3RR5/2p}ᚼNM*OscXhOE7@tmᲱ- [kZC`HnAr ȻJ7 a"n6= v. vZ6v4INqi᤹ f:5:l} {F"s7ٖ-ȕUxk$`hθ>)r{zK^Qh0\6`/QyVU'@1R $WˋTwWq9 rlzLsdWP )EӞxK=寸zNaq::Qk`ԅ_W?)cKI{BL{Ij&5)B.rh HA_0eU ߋXʶ:8DD~2o]WǤ _ͦeH7BEr)h\3:F i!=vHN)$s+ R27iDTöAEx6kOIXl!H$8VߛQ2` {)s;v/)g=e)m;ySȢsBl&TBU*8\ߏ;ĺt`{Ӻ䕻ҶSsvFW1lxc}D|8=0PqSGzw ӵAhF5AA 8ΘtYof;  ؖڵRC|t"4ڼ`~9IM, qU""BFW s.b̎Et:#)G>*֕ m8Y[NKUU4|-O70rVmPѫ z >Cb2uh^HTliLvlPMa!Shݍ Lwju-x;nQYv{j:үo 8`^ P'X%$CWc^䰩Cohz2KDKVpCw]+a̓j[ ,a]YC&ICy` ^kn k]V{0QkUg& N7$buCr &mLOg]iOm~iǦp eS/2fAh;O[ 7bl9Ƈ$F&Nk*(z16T =̒J48۴, FI[aVh!g8G`<;y<C8*/Z%ֳAE|QwV.>6Q`8F-a%iȨF#" QnFJم~y + H+5 cݿ^~$o nnHc=S /zU3Q,f5Y%}-M' ejr 15#m{| _`1dnVEҟy}LBXU֦~;Գsbk1_-=$5<@n=)4dzJRGBlp$=S2X5,f49k4륁_*{N'8t?Ĵ")C㝳^#W#'مMz~Zeb 1jx>^΁K*Aiۅ?tO:ď"IG%U<8VP[T 2U@='YV /*Q"l`l]㍝,f^[m$°}d:$ׄܫgUEp~Q !DO[Ίg5/etH)|~UP]?̨4WA9)2a{_(8fr蹗}JlnUA+W`М٠"*j GB[HoN8Ba$NCt l 94@JmhWȆc@ W=w ;p|K1r˝`T>s_ Mw(_Lh$`07uOAVIP~u gb vQ9Č42N="B|9{t'eЖZxo]=WteFuC#5L& `h<7dEeznZWő {~-?j Qy|Zv?͑eױC_DЏUi PR>KRӟ ܿo$:PŎFpw~k RU0ϐECtc< ؄tFRq$z5I'_TTmکh޷( oАwgGb-lƭQv\VQxT= !dwdg0BS5{|zW{<}h׃Hӹjwn\ ;mbk&On hOcJeU9$noS|0;Qɑ,5[ 3 $dӓa^ȜÚga* ]M=+un5A&c!B;o]&h$ϬCz2\dMcd92Uւ '4S5-&iUu/]a,wH Ʈꓘ# & OW z.Wv=0OXBU'veq"IV(v/enK PBC=[DZ%e6ϘVZIU'ƴUwpf@2zՃ^)'P>fQ RIl\ꜼVK| tē{^Eslt ZaW混xwr\S#cH6F.H59 wL-ݮl>.)qHx(lRZʤ!R9ۜ.-Ѳ+T ;V&.#gp\^%ᑱp2K=5eQr~aL-qJj PN3 y f,˗^0qְi07rXׂ7:AWs[~jp3nSmg%ݴ6@h?n1d֦ k֦ % cx7j:|Li;2E'^7ȅnc9Up=(he|$6F~yπ,[{+JDgLF1MaHPe˱20 Wb*UV˄uÖey&; 4 +!;3if@ &qgok_UG!H>JzKظYS91:??D a{ߊF",3ɉ H'wvIiiC/) r?}qҡoCuj}CSe*ݥl7>YwvE:HU.ðά$EDjChZ{kksBS" ׏ԩD D׺lnP  b 4YE}b B)nQR}ۤTG1R].^٘TO4ڥZ RN[ "Z{DcgW 똜g0y9/kB2?rN쉂y"zi#6šyAqwzKу;5نq 3ce?V"2Ίkې7wEyѫ<]9['7Ff puSs+SfT֖4iXoo3@8⪀~n笲w2IwY˧HDy~%<׿^×Pn9$82 - xZ 9cA;Xg"Q%xl;IHc\*3ss>SW8NN$4ZC%;y:[ WG5GKG 69R]f ]/Oz(~Am8ܱQ)\ApȚHnq ߧ}W:hUZ%/GF=9j(}'J3twHvi'9BtDhGR `x^u NDZ^I, I!d%W2RJ#5]Wt}+u.{*&/MedRߑԩ4TiR8h }d[<29Կ,haparJaGX3+JC$_3yWڣ,r #\[Bݕn%~F1RrG@u?;ҘpXo8b,^BUat1õ󞺸1U1cL _haW}$*|-A_5E# 04֚;4Tk\Zsڿ$Ř!;4 F7}}_>B*6 I /ҁX?SWc $ +~|+̔{JX'~Dz=zXQb-Z}}gҹh}(OndY 83 6CIiuC } K[C=ߢHy882hE++_V uLW,;RY):DoGbL%CW~u (1eS3($OIy/6 z7^S{.2[.Zئ򛥻9@>0*2Ǡy!T7nDzdTZX'l<.Ǡ+#oBF%Y2-%``w2%i rh7VU5?^vʐ2szzV=nvkݴ1[,0PRQmZx~2yc#`34)U.#ȝ8gc""GQ=zA]5]m6JCx2-]&amoe4DRDŽ$: +P.~-f1:WR.)]= h Q}!o}cбp;Eª2DYg @/d.*crn5EQn!bz۔dz֬C=xcA~( eLKzg\*H4OՑ<y]tc# [{3ou|駯&`@ ,,j~/}85g6o:Cujeߗ U@RBs`o_ו.buĄ97.c9U_"G)2%Wg z!d{$RqX ݝЧ}3>$BgW&У2BGACZ_mIax4'8nTښ.\||Ŷsq\3{ 5Rqyq3gpCYpRZ% K>dXP; u yCmSzߍqdqJs`ꙋuPMs[菙ҩP>^5Hu"M!UQ]Yߴ$KFKz/3JlYEqMkρG6pm<hD^@v) R9f3HTdF#r dN<9e".phkO 3S3V1)ނ=ƙx6'5sZ:&أU>7yEKh: wXehȋc]&4Jd;?VꇮFOg"w[ ml`۱<8}!pײ5"ɼ_#Nvd-}b0e%kF,B Kӿc\Quxד!qK7=ILENJQ[S1԰%X-/R@|)nz˰w ,adtS0Xj>&5Kmx "g蘿8̴i!ݮ䈿%1HR.ID+h{R%O +o:90/R憶% otN73l1۲YDC+k¤j1%`;J!SsZ;= ;[/>!$,˼0dwg|k>]@8Bfv;Y!<,.l)M*#]jxXKCf\ B j9 cjVǼ4xBfcXN!@ɖgaRl. ,׌ 1FhSpog fp]<(, ;ȞR1(3Pɠ\d5`PS 5>P*iF%˥Whܙ~v N~_34Dֱ.Ľ[QCN@{7C_{^$x#VmlX?jÏZ_&,tIc }9K0[  %GwrMG>9ET"~6_M}(e W=`:hrB adacReBMi+I˵Y7>Ɲjf=Uڴ] $uW'V[-Rڦ˩hFJY$/\(,c]|/=x zlL3<( /7ijI}V#@a߈%CgHN@΁VƉWB幐 UMtm1M3lffoP`0B&ww8婺ubUdG >`+3J 6zl˱[j2guB3K0WcN<0E'4@SՈ̡?Xڷ3r^!@ߌ!4 OܓA&! "FUŮG(Wwt_J k`PV}\뒭:SZXP@|w" lj18q4h NHd'mhǸ/W9kϡ? ثj+EDkuϱLcup,qKELKQ"z_5C7sC.:w+0Գi]A*/aqzUy{y1BZS+Zcksg8؜ᘜ\)W$"|ȦkquÊCOυ7!(hJ? `@~,3 > WE52q|Nl!`6f2d7F]??whSێQL%wiSzR%I}ω  $o͵_!W%X)El-j>E^ɦ[_Hưh\9T2el@gjukŊc( c̠/!w,2Zk=m>Ӣ6н#x[[\%˔ K< A\7ptdt\IPWAeKj8TKA:Y*Oh}(W.Zn܉94ay!,F yBl^Ч Q'8d$2d:aX*[l@_v3XHC;cw]N4PG@sRݕ0ᬻ(KlPDKGח!`{zKQ47hCnQ>^(HOU#X65^D]԰.=Ƅ\]%37 a-qˍf{Ϫ3z*CxQk\ 0'3]ͳ Tޠ_n"@pBlafFmc%l.,njV/i ~oxp)iI5jQ`*oR@';O@givdniwP )uqd'R .96?}P=cf)$ol9O3gl uɺfɢHo[7~8CREAA}:n[qrؙib%TLy* 郠&įD2XR0qFDYlfiv$J '{8*W*V[xEslshUX ETtԤoӆslih ݡL(vK`}.0@rLOíaݭQ\z?]if}mDET|p+җ3Fg?]T^vU:E z*bdwLD{jAQEH.S)Vɗy_Kʴ~|kj>Eӻ ΀l-T%7CBWced*HڛTciSQތalO;cC`{l0X#U"!Z>XkV>/>!eVYuJg(갱kqjQ=u^QHSp]5IP!JRqh۾Ls[Ϝ%vNpuYqi:'sd۳ `NӾ1-4k iNDbXu|a?mTB-G੾)jM {;݀ e:8d$D-okWh*j"b;1WQt<3Y׬^8px(Bz;^G"US/a0Y7d?|5'HMDضXlsv_Q:=o2Df\-i ^O6j2/w N8A°_~xPh\Dy`h# W0KB`Z{-*ōӆd.cXŸ_f{luALvH03FV"Gq8tVG$2ja6ND$UQjrCPϺJf1FUP8>Abi茙pFN~ys7oO8iCq.+\?V8}-~z"\y &Jhg(ҋSOkJF:J 6ryˎ[ne Cw,b[oʊk`oIQb-kE{نrqW5Za]YS>"|7`21Lg.BrzxQ{2:8ͮ $T