aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/develop/utf_normalizer_test.php
blob: 45ffaa11e9ba9c5cc6a9581496d573852f67a203 (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
<?php
/** 
*
* @package phpBB3
* @version $Id$
* @copyright (c) 2005 phpBB Group 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License 
*
*/

if (php_sapi_name() != 'cli')
{
	die("This program must be run from the command line.\n");
}

//
// Security message:
//
// This script is potentially dangerous.
// Remove or comment the next line (die(".... ) to enable this script.
// Do NOT FORGET to either remove this script or disable it after you have used it.
//
die("Please read the first lines of this script for instructions on how to enable it");

set_time_limit(0);
error_reporting(E_ALL);

define('IN_PHPBB', true);
$phpbb_root_path = '../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);


/**
* Let's download some files we need
*/
download('http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt');
download('http://www.unicode.org/Public/UNIDATA/UnicodeData.txt');

/**
* Those are the tests we run
*/
$test_suite = array(
	/**
	* NFC
	*   c2 ==  NFC(c1) ==  NFC(c2) ==  NFC(c3)
	*   c4 ==  NFC(c4) ==  NFC(c5)
	*/
	'NFC'	=>	array(
		'c2'	=>	array('c1', 'c2', 'c3'),
		'c4'	=>	array('c4', 'c5')
	),

	/**
	* NFD
	*   c3 ==  NFD(c1) ==  NFD(c2) ==  NFD(c3)
	*   c5 ==  NFD(c4) ==  NFD(c5)
	*/
	'NFD'	=>	array(
		'c3'	=>	array('c1', 'c2', 'c3'),
		'c5'	=>	array('c4', 'c5')
	),

	/**
	* NFKC
	*   c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
	*/
	'NFKC'	=>	array(
		'c4'	=>	array('c1', 'c2', 'c3', 'c4', 'c5')
	),

	/**
	* NFKD
	*   c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
	*/
	'NFKD'	=>	array(
		'c5'	=>	array('c1', 'c2', 'c3', 'c4', 'c5')
	)
);

require_once($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);

$i = $n = 0;
$failed = false;
$tested_chars = array();

$fp = fopen($phpbb_root_path . 'develop/NormalizationTest.txt', 'rb');
while (!feof($fp))
{
	$line = fgets($fp);
	++$n;

	if ($line[0] == '@')
	{
		if ($i)
		{
			echo "done\n";
		}

		$i = 0;
		echo "\n", substr($line, 1), "\n\n";
		continue;
	}

	if (!strpos(' 0123456789ABCDEF', $line[0]))
	{
		continue;
	}

	if (++$i % 100 == 0)
	{
		echo $i, ' ';
	}

	list($c1, $c2, $c3, $c4, $c5) = explode(';', $line);

	if (!strpos($c1, ' '))
	{
		/**
		* We are currently testing a single character, we add it to the list of
		* characters we have processed so that we can exclude it when testing
		* for invariants
		*/
		$tested_chars[$c1] = 1;
	}

	foreach ($test_suite as $form => $serie)
	{
		foreach ($serie as $expected => $tests)
		{
			$hex_expected = ${$expected};
			$utf_expected = hexseq_to_utf($hex_expected);

			foreach ($tests as $test)
			{
				$utf_result = call_user_func(array('utf_normalizer', $form), $utf_expected);

				if (strcmp($utf_expected, $utf_result))
				{
					$failed = true;
					$hex_result = utf_to_hexseq($utf_result);

					echo "\nFAILED $expected == $form($test) ($hex_expected != $hex_result)";
				}
			}
		}

		if ($failed)
		{
			die("\n\nFailed at line $n\n");
		}
	}
}
fclose($fp);

/**
* Test for invariants
*/
echo "\n\nTesting for invariants...\n\n";

$fp = fopen($phpbb_root_path . 'develop/UnicodeData.txt', 'rt');

$n = 0;
while (!feof($fp))
{
	if (++$n % 100 == 0)
	{
		echo $n, ' ';
	}

	$line = fgets($fp, 1024);

	if (!$pos = strpos($line, ';'))
	{
		continue;
	}

	$hex_tested = $hex_expected = substr($line, 0, $pos);

	if (isset($tested_chars[$hex_tested]))
	{
		continue;
	}

	$utf_expected = hex_to_utf($hex_expected);

	if ($utf_expected >= UTF8_SURROGATE_FIRST
	 && $utf_expected <= UTF8_SURROGATE_LAST)
	{
		/**
		* Surrogates are illegal on their own, we expect the normalizer
		* to return a replacement char
		*/
		$utf_expected = UTF8_REPLACEMENT;
		$hex_expected = utf_to_hexseq($utf_expected);
	}

	foreach (array('nfc', 'nfkc', 'nfd', 'nfkd') as $form)
	{
		$utf_result = utf_normalizer::$form($utf_expected);
		$hex_result = utf_to_hexseq($utf_result);
//		echo "$form($utf_expected) == $utf_result\n";

		if (strcmp($utf_expected, $utf_result))
		{
			$failed = 1;

			echo "\nFAILED $hex_expected == $form($hex_tested) ($hex_expected != $hex_result)";
		}
	}

	if ($failed)
	{
		die("\n\nFailed at line $n\n");
	}
}
fclose($fp);

die("\n\nALL TESTS PASSED SUCCESSFULLY\n");

/**
* Download a file to the develop/ dir
*
* @param	string	$url		URL of the file to download
* @return	void
*/
function download($url)
{
	global $phpbb_root_path;

	if (file_exists($phpbb_root_path . 'develop/' . basename($url)))
	{
		return;
	}

	echo 'Downloading from ', $url, ' ';

	if (!$fpr = fopen($url, 'rb'))
	{
		die("Can't download from $url\nPlease download it yourself and put it in the develop/ dir, kthxbai");
	}

	if (!$fpw = fopen($phpbb_root_path . 'develop/' . basename($url), 'wb'))
	{
		die("Can't open develop/" . basename($url) . " for output... please check your permissions or something");
	}

	$i = 0;
	$chunk = 32768;
	$done = '';

	while (!feof($fpr))
	{
		$i += fwrite($fpw, fread($fpr, $chunk));
		echo str_repeat("\x08", strlen($done));

		$done = ($i >> 10) . ' KiB';
		echo $done;
	}
	fclose($fpr);
	fclose($fpw);

	echo "\n";
}

/**
* Convert a UTF string to a sequence of codepoints in hexadecimal
*
* @param	string	$utf	UTF string
* @return	integer			Unicode codepoints in hex
*/
function utf_to_hexseq($str)
{
	$pos = 0;
	$len = strlen($str);
	$ret = array();

	while ($pos < $len)
	{
		$c = $str[$pos];
		switch ($c & "\xF0")
		{
			case "\xC0":
			case "\xD0":
				$utf_char = substr($str, $pos, 2);
				$pos += 2;
				break;

			case "\xE0":
				$utf_char = substr($str, $pos, 3);
				$pos += 3;
				break;

			case "\xF0":
				$utf_char = substr($str, $pos, 4);
				$pos += 4;
				break;

			default:
				$utf_char = $c;
				++$pos;
		}

		$hex = dechex(utf_to_cp($utf_char));

		if (!isset($hex[3]))
		{
			$hex = substr('000' . $hex, -4);
		}

		$ret[] = $hex;
	}

	return strtr(implode(' ', $ret), 'abcdef', 'ABCDEF');
}

/**
* Convert a UTF-8 char to its codepoint
*
* @param	string	$utf_char	UTF-8 char
* @return	integer				Unicode codepoint
*/
function utf_to_cp($utf_char)
{
	switch (strlen($utf_char))
	{
		case 1:
			return ord($utf_char);

		case 2:
			return ((ord($utf_char[0]) & 0x1F) << 6) | (ord($utf_char[1]) & 0x3F);

		case 3:
			return ((ord($utf_char[0]) & 0x0F) << 12) | ((ord($utf_char[1]) & 0x3F) << 6) | (ord($utf_char[2]) & 0x3F);

		case 4:
			return ((ord($utf_char[0]) & 0x07) << 18) | ((ord($utf_char[1]) & 0x3F) << 12) | ((ord($utf_char[2]) & 0x3F) << 6) | (ord($utf_char[3]) & 0x3F);

		default:
			die('UTF-8 chars can only be 1-4 bytes long');
	}
}

/**
* Return a UTF string formed from a sequence of codepoints in hexadecimal
*
* @param	string	$seq		Sequence of codepoints, separated with a space
* @return	string				UTF-8 string
*/
function hexseq_to_utf($seq)
{
	return implode('', array_map('hex_to_utf', explode(' ', $seq)));
}

/**
* Convert a codepoint in hexadecimal to a UTF-8 char
*
* @param	string	$hex		Codepoint, in hexadecimal
* @return	string				UTF-8 char
*/
function hex_to_utf($hex)
{
	return cp_to_utf(hexdec($hex));
}

/**
* Convert a codepoint to a UTF-8 char
*
* @param	integer	$cp			Unicode codepoint
* @return	string				UTF-8 string
*/
function cp_to_utf($cp)
{
	if ($cp > 0xFFFF)
	{
		return chr(0xF0 | ($cp >> 18)) . chr(0x80 | (($cp >> 12) & 0x3F)) . chr(0x80 | (($cp >> 6) & 0x3F)) . chr(0x80 | ($cp & 0x3F));
	}
	else if ($cp > 0x7FF)
	{
		return chr(0xE0 | ($cp >> 12)) . chr(0x80 | (($cp >> 6) & 0x3F)) . chr(0x80 | ($cp & 0x3F));
	}
	else if ($cp > 0x7F)
	{
		return chr(0xC0 | ($cp >> 6)) . chr(0x80 | ($cp & 0x3F));
	}
	else
	{
		return chr($cp);
	}
}
"QwH(/o$qVfG]([;#Jtex ,k* 6VSo[O3],Yɠ &O<f+&΋D<%@.Ɠf?.DDؔt>Y&IED)m0گim8!F9aZNY3 %~1C1^TC%DzI ʼbH+GB垳vа}۲EBPH/u.[<՝ϷNv ^բԥ ]44v]c>E tv%J߁.Yp!d5o72I};@)NN~|'geskY`^MOF(594L[U{u~lݓj -ECxYW4C $ NTyoݫe# d0t|C>Fm7YمN0Ixb?2c'Ä:#wb ۤ:=vR^QT>e^zoKhd/Ӕ`Db>o~:E_*1T(2o읎B39g>HW+Z +5{ΎJnЛ28/71l=sL`4Z͚EhUUx =+SD͖ڼ/a W˘^+VJCW+T;"$0Z\%օx"8 cҀ jZ^\n3ZrkwҋQ1Nqb!Ug0M銆Ӫcv-&E$ WoAY=}TJ|R{=:qRߌY>Ams6f< 6 }Dv_dJ e;B"7:!1,9.e~h|׸t8(ؿ6FZaxsz 7mp`Զkֈr6F(y,s_wBwNTzQveQo-0#8-vr BZhɴd9\CŚ-+JYz ÐN8c*+=j]0Ԩhmw%}OhKمl>f+oS:Vh96PŁ՚:s4sc'EAuF 釹|$A\R4op.;Y n#%/s>!9FrqO\҆ivyhhH17yDN,5=:mF)5hS1\I|Cms Z&rRlP!nD A/ZNS+,䷕1 T]\ &:c8g~( _ ⇞ώ@J*zxm|EXхR3M_vB+zԜn!&JKTeRRKMߓb/L\&IeOz|dDK9B'|ل͟Rvc,E7lnW3(hj:JY\ 3l<ƜiwhZ!؄dGj }LALԿRoA@I!aG r PW熢/zˣۭ :TO{$~7_-{gK}:Ii Q83oC-b Mx<-*iU b)OыOC'Z[uغU2c0VJ/) I7jTa{tww։_Nxpפ( x?gCsc6iҘFɢ~ͣX.lo/57ZnݢPHk K偐Qs|9+5Ԕ2ĕ1y%NΫǮA5H LJkq䎝Le:y U[);%}ݭ=OiN=u#,_Wk*CcJkvtek56|fV @ rrq{vi6Ջl@ Pg?GdɸC~:Îfgkiv?񍫯R ^D66V6b'+鬃zP,x63-~lч$cѠ"x{SC#jFX\׼j.looӬkEsԒF@9HBd&#DӤzl*;^8q s͊2vH3E5#Ұ!HDNZՃi`"Y&bF2xQ3PF:E_dyH/9Ǥʰaut{(/VhYV)M$.Ga4zW`+6fzSqDkln l8)t#NWo IqQߴ=%3ޫy&(?0KOF*ʸ0D10=7E7qNs S 8lvpFjCbG"ReX'F3f) i,B67D/GaVQd`D(11MDV ^Ļy8h0¯jҀu 27ʁKV@f' Q-;6PpJSlzSfPW:C [JtxdȾ/ N)̮Z⚱FF,ڃh<"??QP HEa,UC|e$T$Y~ј'A 6KCTD$֟L<|{c*HB"Wnr [yWF<.b+Za3ҨwGI~fiIBQӾƙ':{%L YBW@)bh`r(qw(LVKB2L9{0[ 0pktj[X@^``6Χ5i3S&C ~GW'l?:\L|a)rl \+F۱RW BK[7x/2"O] CDoM/M]Jq rUߣN3Ĩ?!_х_uOPgJ{=Zn([IدH G[jA%#߿DmOb"=½!$ i/7Fz)I8,>֤ƠJuhjif(_R G-_>Ptfk=]2fX7ȳsD ͶQ#kS0qͱnG`qL:N+ ٥{#g}xyTCM3'S2D%@AE%r u%Ϟw"3`DU3ٱ)bRar&.)_y'MI'(2TN".2f=88/; ~^ Q1떐Ņ!էZ:᭜9:GPըM:T=Iw[ ccMj *>qj1Xv!Ac/ً.2Ъ)M&3+ Hڞ>pUc}^!^@~`'ȐH{ة2Zm#iHGt"V< N*s9)_h/HwBf<9 D:zp;!izR>=Uz/ɇR&ͧ ւ&LCh MQG;i,@ L"6ߜNŶJ_l#5(:O }[TFE?78z+CrYr!%!4.^lI*w"4Z\mɅU`89DsU,7.i+=ǚ 9~efY".8(ɪ;t[0(*E2cUY4T)Oe: 6$x.GBixӕBV[S-*!5(0tg߭h¥Ӗ(8>x[tI̔|sG>6w}2UDq(TaTjfdOtd+Y߀~ls$<7uԹ)JmWe{jDrb!?@X)0` Q'Β^Yzki6 -<"ٺVѭ4QUEM d9\"xl!`pfV$U$64f5_4ajCTB{W@[07Jlۋk+ ސkQ,6ŐڼȜi A"Ȧ Ɣs 2KHw3wd7% 6i_gvA2.Z #ٻ87'$:TZl(RY rO Pu-w$sÛҡ;p=,OG?a5 l(KTt=sLfwD8%5ٹ02zv,JL8&7B#qK/۞1d qXU|N<Bθo7G3ic_W_.L9j(@ ?K-OU<U E-V/h;;7uCkM ZҍHU7 Fo$u #R' M^҇O=56,wmBE[w2V|+XBC2dq.vXﺂWA8`uޘh7ٶPѤey啯9PwX ϊoqb7w2j Oޘկ"kOrm!J4(:KeZ5Pՙ<@ e%;@!Nb!ַȯD165>WR:>^Qߚ߇P Ma٢8S 耡9iS7eY $3ꩦKD'*vC ls;߇TS^|I 12.cy"Btp_U#n8̭_MQƎ`$)Lpf/ ǸbCpxD(![m@w:mD3zO-x 7$r=Wa+)غń_}r u.GJ]UkHMz%(|>ziF?t|]RZŜ[3$BP@ ti⑋\ @4e)/~wLx, f [שT|mL]  "ҕ83ϊ@b-\w3U wy77Nz&#<2NԾp ι|;;85Iz_VJ8gTsM¥q?uNkEk"  *b?.MNqTCv2ޢxiM~D4qBDW(ݥ Vs#`'n>c,FB a]ڪ9pa~ecofI\ϘQ\ez@BC 3oO!}8SYK-xbI'L-6UXyB\/߀od"'Cho1gB|Yd /wLyPZy5^5j(a %:m6m'"1{[Es%z8=POv%]xz-%%KMyu'7baU2WJޗqRrā#B(3RدTCd_;`Ia+P]Ǒ#AB}\Uդ_ڕV{z;I,GPE礞k^; 鑛X` ϟ{^D-'eeJ?SSS6x0(qPɶ>Ȧx^2qoCyȈtRfjs@,]#̛n4j|. .f"8xpH#_$rڮ4fT'oȦ}ǶY\pm]'ɻ;!&l.Y6߃z׻ۻMш%c}zKG1TŸVت%zR;RVè QR읋C-;- '&Nh;#~~%GYg*zoȻ#-q?li`e7:3A{+A_\~7c,>Ҽʍb)G7K1w/ i܅uQRhH1/xX8i͗ Nj6gZP$px󹗣mE#V -=ACJOy@/|mBRz,>w*e(-8<Xx&dwvŸ,80fbWj@$*ul @9N%XF/eANk~6 77:A5E.$"Ų)1~F(I>[VxK:cb)]S0F [2?Wd\KJP__!F'OתsRvg=j:܍tՠݏqhZ7+YCh":Pc}PbQKZcN :$;QK4snƽ%챪՛5^ ᩯ]w.h& 9Џ6h#@CO!( P20.Hp#B2 bk>/+h$!4 lHOxE"$@g$LKmrI[< `B|N2.DǍFLz,70#hgJH^`k+z.zo%Q Un`qVk_-L{3c#YUaIYHtiAG0lJ'#I\o}17<=A=Xj_-ÂU雇HXR!nF,I{)U>92~ƒ>؆gBb0]wy|r"0撦t o -8@ZDDּw>nv#aE\}KSƉ)v)?sb]k˃E *A/O* P+|y?Qzrٞ݃lVmBqQKS?">%`^S%p!FcD b+.eDWZ䆿kB5KT0Wysf፧3a|z7띂JeilrUytq]=׏>\:X giu7ja}ICb_C/TpR)!C4l˼MEYh{j&4@!+MGࣾ53V Lj[κcf O'CiyL6u!@}pgrȣ X&u,$KP-ЂBelA0v/|y]ﱒ+S{a3\LMRMmġ/+,2 h;Wa\\ `˃Y|h ;rg!r.Sk@ dq3Uabg2p[@ͬ[y/nCMmT8. ߱NQ= ,?Xn W*l@k~>5MH{76,A/+d%cT4ɸ@nZf9\F!)ΫSc~)z侎b H%qmIp.op5u;J.sZ+R9SRA=ǾeP8d4r9R$y̐71W$(w"K.'e ճ-ZS^>T_6ތ^w¹7,'1$c ݝk&$ҍeu  J@Ϳ:G 0?^Yrv72Ḙr 2v9d+`_FLfԢU7'^z.'5TeǼ *.v[Y# hjl Դ;O;G:0~~#mn"? j;`+U" @>B$0Bc8?%5ֽ`2t#2e&'Toim }ޭ*& 1CdLÚ<͑Ҵ:N ڧ+hɒ) 1fDѱV#6KlZmŮWVo%٫1p>aԏ\$lISd?BeqRbdZ5#izF1,鑖 EvtY VUCJDnQnc^ NASelVg4tSgNju/_#ekb5SrFoK0lGHv3.8;d'zU6PcW+_ؤ>mK${J?:Ȓ6%D[h# 潡4K/(pF 稟 )2YBH~@T|+WS.\Kw7ދ9^Vjy_&,$a<20K׻Nw8,E~CX{&uU I}Vh <.mxĠZ=,uv{3[FLsSF UWq#;JM;1>CirTz( ǯw:-i$;xa%9uPTjJ?MRz&LiDPg7G^'eG9?yut:f`GƸA"z,ua۔mXL :A?G~et Sk8)"sVYp^@ɋ5rչt&D- ۖ LQ:.3_.9)WD90gLgD-gD LN.c֬8h"g?8Pa74_EZQ7Fa3Cu0H+Ƈ߷z]4ɏW*VN_rǸ~e_C$[vz SQȀkO`hC],ep?o*6[kc/{HhY_i /H:_^0K:(>-cz0~om6o2GiJG'Bix-bCBU%tnkؖAn*#GˬḱiыG[׫ RiBH!߻t٥|%ﰸgǼuh‘qjO횏l+V\$f}&j]r1UnIoZy jۖdpž) jƻb,ThSJbq6V~J= ן?du@AoK@Vfg9 t'@ ^)7.8LPQZBB֛q2󘮳UrfsCSRj;f:^`(hb0W?S v:#q;5[ۄOst U\}`O{fgN~$ y ]HU{ٗ)7 ?to{T).{p+dYJ݆& &@(e`A.VE=UET Bnw_(;3'j1҈"h a_J^`ށ_A щcä qX$L*5cC4j`?l;r犈7#k!`#.))"ܩћڙ<.++ۍmn>OQJӺ (0'<|bJͥ}tl(mvk@p?Tӹ$U0ڕ:|X\K6{Ӂ0A8UWQF7# rNDH %VF11RO#TMtad^h"{\ H9Ef.[/D&}O=u`w V DI0`ֈnlmF^=;!.cRa8; ҴniR( 6Qk;ȤNN2twKi#\z}8l2]sMB8r..g͓$?%q*uיkׁ u {,N`sJ{ 7*X6PАx- J_MgmWԐ3_ c]DP@ aY,Pm4(*stWDQ,X ZtFIC}<[7G(|xް3 ? R#OXOn:(B)8y^r3vfն0VH 7HqfP\|i5sZ/8QISႄBv10A|-G/DM]x4:hA0^H0 vI  Wx5΄31jXZq)M=_3 O{l ei#Mj*ȫqN-2ɵg1*+Q$f4$@2?x(K7*`bolxKana]:_78fE6AFK[x9A);ta=:"&GVv]4SoWׯA'U.ΟEN\ JE,C 'sVT⬛?},j/@")ަ~+K0@%A5>?C83k[=qO{X̐b_n2rֳawۙ #沇 /U]zK[9CDTWSnlap̦&3R{r䈵A)%.m? 0hr ޱ"T~7#}Jp=Kd|'N4^SWڌES1x;\B&hI|,oG//F\ᥤl+1ɋ }m!k307E[|У=Gtr:w% =4Q*Nېl7 Hy7sq-д8"0ؿ,'}Þڑ$lGHAݘ^YnK H/RXȊ NÙĽG|5p, 9!'WC3B(vYwԊ3+&_enpGd Xzͫ ͔3#o1LSDu,soݡ_,@Yp+1lAtLb24 B)h=e:TOY%u,#9,}GwOڅ gzH(M⏩snsJr+]fBHYxu\(n,q=5I ^%U>a:9ܯk&*Ç$dNMSA.tWGjQE"h([&h!voRћdLāE`F #)s 牶D8Ud:)}lgUi`6E͇ UmeWO>2ME^on[[QZ>X,tR.D]RNx&aM 7i% x d'Qj*bUKhP̪W(r:Qw'VAQ"vLyf̵ tcT {EXJDwjwQG 'eȠ$於d5ГCWD(JD"'|ʼn6!C]-)(ygCK%K7m#Gb= ;Fx4UT>C*&WH )Wec0!iqơ-%KycOqttu*]1* Oo[ ?; oO6~Y$RRz@):@d]%1r:HBDޙz[&^/.$C\xX\sm`㩐uiW70B43`K/"@ dzq<9, @JZ,i݂g?B vt@Fm^.F jȭ^m"mƔ"[FّH/x ݵ4{\ x4O>|Jh Ȩ ^>kI͗Nt!S:Dxd_@5 )錚/I\c4o3BK"N +ZJ͋vkRW羘ՠ ͬ >EੳNb|fqR97pPv%.L{ٖ ħ ?Z[1[Ru.zF,@mdlS&WE7es /Z<|hw)82}ދ|Ph!``}"0qYPE$m '!gWF/Yt Q^ CF@!1cEdmQR֔'!R9]k}fJ7Ih/, vUY}'ѐN)T @V}}AǗzXi ;+:OyHxp,&g@Z*+i/HXhcޓe:4Vzacl݀̀ QHRhaVW]i>@k \٫vdubw QANLM4{ :MT«,B5Kp浖Vت;*(-w=d:iĖes{}W1ڃ:}+qR%2uuuM@]a gWC_{^l|+ߒ$Zÿߵ jGu8k: ^+IS s(u1^<KhhL`ص;_bce?vP|ƩeSGޱ|Y+y|ĞxF!60-[L4uţDT]/euIظ"x@a{"/%%1tp> UP/iqӴ1$3A+NTw_`$AXN q7/d`.g e?G&ՌNJi GPwM`pw7avXt0ѬZXb^;sYxWX}!yZP3U(j܉pʏzm900 bta$[C fX@E|RrMpkn1.8oFD9Hp h D H!GTnīAlz{ c3Uzj4JߦH|QѸSA7~)G: Zdi+UC}]il][@<jC8_[iWA E8A^.dߘq č[NQ'^o`)NB㦱 ɫÈ$0ʹk5 M} QJAGP i΍k ) Kb+yq; *FR@{BK_>NZOds3MӝL'm5 \*$ډ91&O)Q`l"mVBz؉T~b#hT54C ~Ѣ-9*n-vf7\ Z`R߅:3޻i[5I:jpG)J8@iqYn+ Q0N];m4F 4 0f| Y[$MM4;ta) o0ǒ=aSq$lFDXFf VkJ߾O؋7e,8c鯨R=Nm!! WBTJmyUmq/Ҳ8=$3%1 e#c*a[Va}9@;ްB˄<ԉP~7L x+z(CA^&BŲsxHciMhp̂VT OxɤSjFuۧWJʈ7j}L8>|+͆b^ɽGS|zo*Ѽ(FVypRY#`alr0ϓ5?p]^]oMʣ/p*McĬއ/oYY2vwKno uROF{UpGe:4h)K>54?W?([Nz@$Zh11Fɼ[0ֳ<#1 rRw侜m d۝67P)UmluG3Bw :6PCK9J׫3}pA!_d0P+76oTB9KUd7b-8aR!"sj2绩>2~_8ckq(޲[d8BmŏRWX<1\bo[pN!MF_%At`H)T_8U!%2rpR_)vl'O=盔z[zɧAE(N6QMUI3.i8=j5 Y?BO~xn9b3:~Xtnf>:wPfzP=SӱHWD;AYEI=]~LOdbPu- Vgi3!HE)S2+5{G |XheZ~QoFU׉peJ+ LP rhsNuNpw UQqҜ h폶4>Vy9i[1K46fBp1ěQEL J9Dj@" NZM[1cHU^Mk*?+o5T@9u󺡆MkINfm[ C4AV`%zv?Ӛ'} EMԳ-a@*g s ,t{(5I`s4hA{#$&wFa ֆȋP˥.$ș >kWЮ^1o׽b<LiA7I }6[!IJ*)˲wK(MXxIl8 d+ocb 0]װsjŬbB@vW+|O!H=IA=7BO y/<)ߪ$녰]Vgi=95QR%1(= %FaZBG@XT Ao,Mrʠ; ﲔ#W">x(RM3:f|9q5J_>9H<;{LNrpڭT~G s|`+"| =`k4˝^Z:wF6?Gxy5WH;1fA%PiF,Ac6OX̘prаnGh sNa&m W Uj(ƭZ9gnۚ<o|n9h//kp͕a㱞JR l&3>#˩ #|9"7 NF=~QK,[XI8tx=)B?෰&;[B;OW@0[NɆ>)R'!4lֵ!JLuS ) יa|V\tG]WyUIF]iE♅SD+3RrC qaHLPot1~\<7 =`6eX/zd{9o۵1k:ax88Zv3kk])qmb&q_`z׺K;ƖAӛaBn2ZT7NU zC)2q |1TCz -;fJQL􂖮X6eѥ@ii,a=}|@hY(}n'nuՈF>I_VLQ4m@5p"/lpͦy~1s1gTrYfF9)xRA mBAl2Й=)Qe5a>,_1l:!ܬus0Dxæl)ɡ0UtҸS gyvdF0IM2m5^jE\?QvPW pfG *X &vV~.ʲ&HvOG[:}ϴLՒd'4U>$fF)<J=10dcX#^kmb4ew!(:W(th]>mcoPnkfBʔ+"O1:#jXUbQz#,̠+?dHx5׭2șZr*P8ƫ=WNpZ^=0t͊4f-q'NWfF>H1$!6gQľ| mmPj Utz#Lp1Q%>Ȳ<%M+a|T=>o$<+ ԕ]Xtd\9VmMYI$3C+N5s*xaϴ0l`sRAn oךnϣ7#w{U ٌk?g-,Kd;-)˸##Yq2 b6eb {cD1=|)Ф<\;¼B*~kHTG'~hi1u<:U90BQm]ŭlU#]J(eyo)1zK*2.“Uy^{e/f< X9"u܈NmkK-EK訮[c;˜[O20<^ /ϝ)Y^d3OхԠ" Nl".`O2hSO7N@.;Q9XtQ/Ü)01Ay$MX׋8*SBAn<u#riP0?+@Ѓ`[u>xD-KoC6'T>Hp39T#vZ-zU Lp MJF¹mV@3{8>Sk΂ &wcݮnI"&Cu!ʚ&b{*hGԀeSޒEXe( 7ƛ=8P^vj_A &h.3`Ú#8F@4c/-+ W~P|ȵջd&#%M;`ߺ%~ЀEX\iнܓCMK"ϯ?毇a/Y}6;`b"Yl ,WbwSYƖz# ιڨm47I4w,4WI\&5)K-g Lr~P+t\^%u"m8Ŗxoߏ{V}F"C3f4vbF0NMGaIVعy%ަ4R<)ew5w Y!Y0)%3df`P#l]q' wY>bYnx%&(rz]FAQ=0WgƦkF*_7kV:S=&gX"Hn :0Gğ;ǧ0r_0U0Fm))~/zKڐ]ݭ0A>܁E qKmr,m mېO,'@Gy$w)&kEok 2944@vNr,]jt.)9WGFiYy! u{BhnaAyu.:Yrb 'P' [=7D$+IƙUa8l3^Yj!hxȂ7®-W{] uVF&z7\CGubtföD%7z]J&V>БS&o Uri}Zg$5ʯb;Ge4c_|7(RӀ%1."y7|n%ݛAg:²~\j>PX<[=@(KhV6GYKWd#6_FzUhd,WЮ6Be|c%렲1fA:)0x߂E)s)l$O _^;-SJ1e,ej-d\cLUrU'@=QH ł@,RK+je ^s]y(`eٰJ3npaX($ Hgm?d8u%#gᲸwbO;7PCZo ]މʕ84M R _;lOAV=`W3E ?9nyM=%_@m #Z3'X՘j pO c7rݶ)N%WwP'qфXGWŝLZ[AdVߎS6K!5ρb pd}_<7uwhTV2" ~yL11ɏ67E Kf_(}UD?ӥ&8yZ6|GE.S /8֣ګ2noDbI⠙MI!u}L5n?qc+WtV2h9}$-[Z'*h-52s$vU8Dw!8hS] TskYxT@F|٠jWRa۹m7T\9Vdm7؟\W9_(FJ@:7DO:<8~ѢUpY=*Vdk|(E|`ȷϱҐ.MJ,Oݺ0q;Z`1}ilYx }rߧUVFA뜣fYl`\\A '"{o4l3Y>UF,ꢶq,V$ED Ac6^#-esY fa<|I|+~UO?9b'VsK\sU˞Ӳ[.˕`P}?JQ_[[`SLar FV6"B[N}X;qvѕI4>KnJڹLwT ŽE32 !Hg]%?y ~bd>곉r*ӽȭS`O bBzPDÀ鞳`8VL^DSKkHgaK+56yD5Q'譛1roKCXp 'Xst]53!d}o{vJby UpC&@~rߎc$׻R7:$U)}x-~&PZ h{lӊqY#$x4Mhf-\腩])/rCh:oqa 5R7˜˼SCMI(90=3/:QdT'b6BH,a >c264 #$r+r[xOּgT_oQoBbl9?;XXW{%l.PN[8$uiy)*AE@&G ^M; z.f0U2vmaɴ?sh21;5m)<Ͻ0g!&3kpƔd>a{M,4u`ͼ[{Aǣ2g2GAdckEV7I5I Zyn|rȒL3l67\j(> .iGc1= z!5G6jD ӼT>~rvX,{Ɓ$}FVñ~47^Ih^p(2G+/TA^jg"J9TQ[&MI.Wb>&,a]n(_v@ToKvkzJ)qs':ޡEP5)-w6sqD^.z޶~J ʪ @+Ro~,_$\#VItF (lff~RrFYi8,k]l5ܩ%%L0N$L=aX!r-**-!$!3`fi!xN Ӗ|axfz 0Hu01VbYVc_e&U|6nf4VL=r"KY$x1Vhự\ .\ j%[ 9\|_rpV=< 9GPROi5"-RU{Aџ':*mqm/FúK C%/u9dB-^"֧_P_6HW| CJZf6(Fm,HdRA]G8U%DÛ>`821tV+= u`0ZDF+v%fV| 33O ]/PHE?]Bx>ýX'}PrS\]oJkbI]J<_`gJOa8%iwwS(p5kg0@fb6Ji7sԁ s!KY@[nPOh{4%6>7(I DȴPηK}lBzfh76wxEp Jݣ:ok@E`H%LOq<Ƃ5?Lhe'b{?~&qz0 k^s.%*ɭ (MB,?kj WDRi1|sj';/mɟC~6d$]!ɩmm"5@~N]d(01»k "aTRį Ipp2kRQp&g.}CFPaApߤw!"|%E揤H[kM3(ϴX(s P<%+ 8u(y%Pf11f)f ) Be }S{ K8NR0܌d;Y`-d6\5BMNZo=#k=u5* | G|Xy׷ "SIcKwAkYڷ45I]5sDT#2Ջu?~m*DfIZ3\x)혳>Hgj$-_С%b(Ȅ\EWڳm+31?EX#988'4Bv{FJiQ~֗Lܕ VU #CJ@5T#L4F@2}g֘|!`uh/[AG".e Ϋq)42>-<@Dž)!#,K%A-[njiluR>j#M~J}yGYFx/m.soӦb)`)'æ|Dx,0Ze4菗jVŴEH'༵`+HI ~^n *{8!egHĐ{5JZ+ר|.~5^cvZue=컡Ԧ ɏ2ZY1[ [hďS5? xh䱳/5Q/%1K€>9̐pcjMD>A)zp(\ $ZЫRQ6HiǝLX^hi\KqV֩t o ***c?3&؏eI?А)D%NR<. bDŽg0_aÉϦճSRp}0ӟ"-*u.vnT>Ͽ-&H aXD :od "iZOWtگI uBӒ_AS4E )k$uֶ:ԍHQF!i0 6o<}uL1D&$6^24 Z,<P7ib-ȭvcX{A^ 9~+0?ŊYp ȑtBy=Xfye |_GKGQ_&'`}x 3 Ț;J DҶk@v< ހ1Hd^,w._fe*3<_^ȼ#͸.mp8eA5eAu]QȰ@y:|"D.p<e+i[rB1\樄J$u)~m5KJGʐJO,Z?Tv^\ajv(N42q (_I#*6ifU־$kMUJfk'ʓ=oFkCsqK^CާمaUȟ8L1G$zao1߂' xyF׋g"埭E_ >xlH}v|ꈐLL=2φ\'~35 o>*4#$ZSd1S(t!nʙAU {h/ ɀ9wEAGlL[%|GѦ5-5e~րݮyz>'Gh+Լ<?&hYZ~-~5^,# ᷸x ɱ3NlRm!UY&6/+lc-qx?TYZuVEm0njK Ϸ6⑧[ PXOa _XKrR I/v *E7c ŨT"bz"ݏWC[~ظl.@Ŷws(?7"rUM%̠ΖMGԬ ^A;$mk:, ح~ơqQNR^f9j$"qLXzƵSa3 Y U8vi_0 c-?j%8 (.]X749i{y9m 8XŬe )y-R]Y @RU`(T/ɼN֩TݮQֹₙ3 (![wMa#]~u=(jud]$ zֽk9R͗gwu?4 E &M>ԨJT!p:UAlE.j*'^\~ jcR)#P^/ Ά< x;M4{/o é?[ft֕{s({H& B/&RϱVcKaFu"Ic1L6 )D˺ ū_1i7z+ΩE8fD-}3Ɲ"Ӳ_o>@n'pk36SPP]\PήIKԛgUMl].Ҽ+{&(7 9lУ+/}W+؅0Bl=[pHGwP/0ƚw:+Q#hqRCIC׆Uʴ^Yb7}d@nM qKӲZ'^RȄ䶫(GZ]:S"a'Dhd4Zl.R)/Y!_64${|f$,RS3T }2#xLenu>AѲC\5p@@pL%yO 8њbZx_R GIf<ÃB[0y&T"܀hKQEW͚E΋S~rDcuHQ݀yD%(;>WE"BZ; Q2/:>&=6^<&)8u?j5 H+tۣg jUȍ|-oQs&-b.NKk4ה#ȫ7IfJX/sxΙ>AvݥH޵nۆBȂ!jQձ(IO ޠK [Cg=[(70,nڼ20ßW5|쯭"QA+Y0-n+QdhZ"м Z I.F~u5 J 8{Z$ {5À6(YJWG@+てe#%@_yg-&"wvHEJzYF{+)*NwS)G R!؋Dkxk&۽5Qe>d3Q {',89Lgj< A/=X; q/,GLyN{AqF#6Jt&yNĮ^v&Ԟ=IIYKyHLUk yVA0 Bݒ#2oT0oX ƥ[Hw$RFYAXǮ]{4?vN^x%27>O:Le=h-! c<6^h6/jP;D>P*cLZ+35kuJ.G縂7\8K%/8ÃwpVRo{eac U9N|AD o\эlIՄ͎FYfd)z8a4*(ŋ$LLbov=  8skH ҫAVTxw%ֽ',qzŻa"ןfYӉWG}wQ;}ͰaB\L8 Qq4 K|R:&mEJɰ r&quYL {Y'-KA|Tb X1#*HuqYb$z:Q[!~];5kf <SQ ]y`;ZfЃ66 {Rvy<EIboCHtʭmݏ):e+\vݕN > _G ˽r!!ɽ=zlbMŤ )Eo Ȣ9OvvJ'R.>ʌ\]z%dɯ_]Y*/^ikGȲ̵N˩3 ves2)ݢS>d N7x@ܰζ\֘)M{+ Nˋd ³\o*jrϛ t PyO> %jcF|vړ̇ -Xiq j,vi:3ZPvt~YKob?H$-hV6DwH{9M}L>CMZ1[- I`BA⤴PtVN(iɿϪ$aa"J^W]Q`қVR&ṯyq?ػm JT]g3x-o0=]`OIm|R7JT`ZK{[斋D4yp)E;|`R+eIu-9zܞs/D`~ Gokk}:U7Y,yhi;/2=Ն۶z8P8ͫH/Y'![W[Ix (a!}Ą]s?UQ@Sw 8ϊST,r oH4W?c@k\9aE-( gPT9ވܜt?{HCM4T']eK8}ni*jW=Tç{qzh&&p[dgH+_DU.w̃` 6(vTE1r$)\a^8+ZlpDM AiL3zWo +k9B~qEru}U e+ϖO!a,.jkuBͥ]'?`sUĞHbc;UM\GSpŏ~m(LX$Z*0Q4ڿ,XEo,I58d|pI^gyyjP|s3se_Y%^D* yk C1DfKkRi,cf7 R|.f֢ iRA EKeu5W>%ЙwH% θ* ulbT0.tExT8!lZ;v,ٝh8'pmɼ=bO)L)+W }+ˈU9g+mea0 kpu_榘(d(rsÄ X7>kԜW?K!6TR|n%ކK fpjW536 @"D\Xp5qaCZGa*[&NT "݃(YZH[ C ^xb(j=0Өi;jBjҖTo ug( Dc( Ēe6FLA|_\[o1$V|XCX9HnM\uşb{!*ӿ#VN[]2lT*$ܔⶀ3tឩߩW/fEx2FE5[jd2{pl2g!}vzkRSG1kbnzhƻ5O w&L[3*~FV :Gћ{xϚg: Ɇ[WcE")__`jxVD8ss%lh6+4jžx>btIr Nkf cp~Ld*99M\H^=i #QsޣQ+6%~; m}fsjK{:Xv?uޙjO1/f"t.npi/ve-Vkj-Lע(JxU "րK}joi8bԻ#|xFzW S͑ᒁלuW @uhxPUyƿu`z>t*l@?}f1QHt )_;P.z,md[lVBEc9&I)]XR"y?LȧYn@FE`*Lإ%Y-)Dt{7 3ڇ/P6'&ԕAWYn5t _^f5RdѬ/ Ϭ6lt}>p*k2<W}wa롽PJ6<8y_%Z j3.M >te&Tψ8S,7LJ +6]@YW1FziQfLH 8~mUCȗ=r+L\[HEWyb"JnMj0]$M( єn[%2v6rm9Q|8͢$6K =ﰩ#gY H-blS6 '>w #0j~jΒi5}d*NKV. mgzG7$v \(qL hP uj Qe*[ `p:eE3~XU^ ľ uFК 0vZLS2[A>s׌fQ ?iZIҖ:ٓQgWE-)xmᠪÈ}/$BΣͼ%rI]L^2L(|';bv# ˸$rR^ZdDnK-n>gc/c08rIk6D *Fx. 7',J&W"O՟$gDR1 H-O=ϯ{a:r.=d`Uܶ&ژ}w>?R(ANd~ smYP d j1K%QTQv"2a;\J0)Id? \/Y4P} E |qR"ҍ[2{`ր ]o]z*_S ğ|d:Kd ]ajhPZ%ҭu ̀* 5F_. [mFчgPy0n'ݤv$(&Mh.9n+~Ȗ5q)HE C,JMŵI:7ϵ$Pnv ޘ.Ѝ%NkV:H& bXT\tU; /[yF9m PCg08S]<Yjłv׫8I7y)ɑ{$nh dL NѵzOS*D'PYU" BVⷝ&!*nfD*7Xމ淋yUA^3Z9Q9œS#VMZgoT|zSbΤdax-#1+|G"T;Y9ew&`$ߥJCdt/$oQ(4KjFdE3Jx9Jp~EL9x*7?HAVAm& #\gDO@]ꬖ1&@ǝdˎ |=-BȈ  *Ir>)vYp++2g."ӄP![%t46P֯ʡIđ*7Uj+RܛV]j&6ι 6U|%5Nvpxf&7KPqA5G]RBa$X" MT;=g.)8ã̈stJt #b޹\Lֵ`S1mU,z, P.j IJm^46*l+^i5<;@iGjr5UW\鿅dȝ? j[S'D.T雓N[cCwa T?XGNjnHmێ&*#qʎ+ÀHBs2li5;x?w0;ʥ*mK".q4I`4yn<; J r[wsv*HtnWn$W1ݤ#%Ij;T"@K}sވ# v"ȵh@xXtk!_G)Ԅd-/"gDcڙwc"E$7MKZ@b3weQbQ$[ M,Ճl skUS+TAhf, Gb|_ӯnqɖOZXjL~0l&1uD?R}bXJO*I@< 4}ArSv>["M|2n/V2vzT >w-<+%/ OCad`.mp][~>) BXkNdH8B*;)_4/87.rtb/v-&8V3LW>ETi UqޤُRDa\bI>:--֛=/(0Dd _da& 5B VEGj}]OJ3>@l̂Ӑ| ض"9on-u"[ z ϦˀGENQc;?Bkr`Ud5_2%c̻Q,sD8J.B"2BZgG|mOP9(Hzr0LT33 >}J37x@"rռ]x 8%:EETI]ܺҎ8 |ޔ)N FVg?JyC[.?bHjȚPkuvES L5:P5?V}YN 2|͸uƷ&V-dHc-w꒖JZ^΂ŨLBSZ-بg?UB/\ b!d}@3 {.b)Q]BzK9t $c L5G!3)4Fi2ҚO,cs%Ŧk|"n -)yMBS;ٗScشh8 `)ҁQRx%`$˫amF5s}?#W Lq2F\cXhdx,ZTu%Q\f:u27VlY7:=:o@r5v<ケ蹰6OZ),ߧ 4AtaidtN/_GjݎG,{^! Ǹ e!:t%xqf`/y,Z@#HCB++8Ӈۅz8x0 Pn |s7(EQx ZK{LL&C,㡿"N2։t?{NF<&l},c&n. qk~O,vkG>'!ĜQMc}Tg:;,<:ߐFՏRT0Kg<6С1D'| CW:})UƌuɃ~nllbM:qAS'a9sQ#z9a>JݗΘO_`Jh4fy/(! D6-l*,968ďh0lLdUY0_N3IEm`l1Q 3g40 '0GYzQfvb<؉怒йZg–U!'ˏ"}@evϵS~etR|s}Z:yO.P?q6s^Y V0`جIlR"UԾȱ͚֣[)jPM]{rW"v)^J vJޏZrG6) mϳ~^+jWgCmOԻk `' b.hZĠ:ɪ珠uk0X;1Q d/YEpԓ0o ( e~\11OH{mX K| ۯd U|'B70ZUGlms-rѦ^GoB#,p*^`ہG. Įݔ)';sS 3-6Ƶ0-YzCX\W)X|} s:h&䛙O-g>.$ƻcwaeo;˰n#;G|捈]˪N\X:/VOT?:F ?N oP &;0k/U]#-%<6 xE )@ۙbϨ L8TC4(CO:r(.:QC?(6B˺{֌+407[u@-ߔ+\%Us) N1(ǚ,6voHuTS))uFD F Tob+ه3oܫ$X [m`~%T ܙ5TLf8^NRK0oY"7*˞5dnF9"l}wJH &bs|!Jj sJv0F12#,{U^%ċAαHվ+w|)&]XaGėf5+ݩ5k#YIՌ" J9+ =+u,Of8R͢{סZxAf)%qoZ2Ee= ߐ>-9j3!4Ap1D@EAϹ'_8~9g\1_j1u뎭2<#Gl,rد*;p[c/G jd@볱3tӌq\k'>ZnZE-F(S7KyN΋OcxXĪyr0)>5 QuECyJH>BȤ'3I@' 9S50Z+eTJT"`en8@/P ӔkOA:,tJ#VřA7q&nנgڷexm4! 06]mHy#=5 ~]e{$p^"0F)6 uً0{u]т)eDnXh99zu=e,,|<duZY$r /71qJ$_dow_>齪J4!ma9uk%/(.x \>ۚ #6$y%vY_|N4OhpGD8L7+-k2" LgKRߌ鷾nd _>SiB|!*` U4y@YƬ#_UfY:2~}*:LWЭxDJO+Qxp s{eo@h#~f)%Z,港;YDuǜ{eZگktQ_ڈ+x Uq>IaYV-QA~R+M ߮+/MO0EmCL~eG1A?# =KSt gdHIvoPmFгsŞ4Sqym%PRS!f}0U=] O6?$!]-" xY2BuH] "_n3f%u7(<(үԫ׋usd\8bG+̂S_2pgPx^m?P[ۿa(V6P4U "YE\xd@!ۣ-=b4 .I-'гtk_NY3HQh;_eXa9SiLvqRqI_#v~vP-lvVӬ;e֣r<_xo8}NΕZp[ښ?( Ӗzw)xI|B3J0/&duRv̬R{5 th_o.Ӈ(N[ 4'w| -#.qO WYi%E>`(Ĥ{bF f+ Y- 5\Bf66zQmxz&$E|r[ܽc`@۫v?PI+vxh6xU~ޤ̣g0rn.oVĞfLwA!ClzĊqi»[klֶ^ ߓ?f& E4z5|/X'+ $R'Umz%m"4]+-o&b(/[懈u-\3PV4~ܙ ~ZGJ2-'.M5}6܃?Af+l| aIB(^xRl|} `",8;z $&uz%*WH|4y=|=g$LY& +F9*WM+> tWwtE(ϚY #x8ֆ~~"! HkgPL: "Uq=R@D, c0 S=ʔƝ$kGd́JeىCO+!!: -55mo0X cZQ7ndbk@49='6qItnȧA3M~ a}ؿ>Hkٓ409!jAYʶ"\9@evƐt&6$[RYk}.+*^tTܶU\z6 z{O!XCG(GB ^2<EW1ڂn!4qp\7$Z^bq}ұu oY9ab쟃s|vuR\P!HVV$Ku2Q]g?ɲ ISj"=-t vɾ#$*'$g˴>ER⟇q_M wk7`|&QBx|c`JѹP|`(r*PU{[ۂw06y+ V G8f2y+S5t߬3N=/ ÕPiQ6k_b;(R5(L IK/R6:w(ܢU)lTKApQ5~.GTECB _=lZT hm @գKxp>%cV5Mre7:h<(J<*%uͲV"3љB%&q[XRA;*ؤ-v 5!UlLf}i;qi.x^zhQr4 V$Ù]fdžVO5H|X3QyWN ƹ,6V N%2*_ ~hR {s7:ؔfohLZ/Kh6&P~=nM#S&qDfٶOBWhX,B#x RI[+r)-.f[ҙSSfQC A0%k#!̔Ҹ?wT{7wfROBnִ4vd-^z}ݢߨzI>Qd5*x3I_)FqTz:"rJSp@Ǭ\$R!d"3sٌ!ϼ5.{0 )2t cMH~{B"w/ub<٭e 98bO]wvd;:L9X4T"CfK"%=b7LNE[OUm7Nx <{WEwm_{4)d3vbեC6!9J$:7 ,qtt(1FCNxK23ED՘66zjq⃵jq}/ V ~`D $)DzuA9X݇d,Hemoўis*D@qz ;n(!"Ǧ[ZǺŽP)]*Fb|]>H2$:{S}C,../"|Ke%$8kWX+ > ui SV"IʌiT0rHHgyԩ`(գ}{;CD)v9|zO)v6 /#{ rNoOd FbEZn2SRХ]rŰ8(TEu$ WDʢUrl<΋(ObOkb.x189zhr’8@`+!D, uUmm~>y0pEU=p($" V0Y.fL c$BuI`O6UUo| ~bE{FKPis78Se*| $cfG=L==xqFeevc{o?c u7TK,p7e SLU];]%㌳irYҊ18?<>ƚ]#tb96pi8) K}nP9i"q[a~NCSy3rލ}qã(hR9S|wjo3!!f>Xp%6㜦y-qJcثIx a )yJ@]˓CB@?/NFq:L =kSwq^a[t[ 2ʄ9qk1u>̫:o'__=e0Ԇź{q+3=g8!Kmk{Kz[-1o2J?hҎ Rٓjd¹Ei[ozd \`׭uY8r gneےm[P.Q!i" ұɗpxɈC39\H4;9n_Y;:Xf 3r:s!גԦڟ|mNet^&3 EJǔ$8˻?[/%hdSmqPMJ[& Wk>.%ӯ :B% &Hg_ 5]y8U&B!ɕr%dUv 7YNnk#'/oZN0tPҢ*VlhQ A?6GĀel ~Tb0k9oyzwjP-f*4J!ξ< ?u5-y4Ut"*.RFL5 3fa}כ Fi&a1}O]]iqUnB,,i86Ԇ֜Q2 %* vX3H4wΟˡIu23/_{Qqh?w!rHWqޜVf ߗX||輯ZLֈ9oJaHVx& K% !x'0keNr'ő;8Gd? G_oCX`+(c28!)z{d(@-ɴm$}8%/lkEU0*MMCH{D*e헻֨a^ F쩪̘l .2ZҎgMIIGXR|Xu<^SKk} K`#[kx쐇Ϥ6$(I)ߏ{ƿ955o2 +Κ2$`î៾/Qs@1&yUWCsk ;فDSKYJv9ۨs{;逄ZJIiEG.b 2GT]=a5`8xܒHĉ@e P/N1 e1lCwY;\Ds(/P?-q16+QOAkE9 6WF 7!>czER}qLjt O˛J\aKzx~TD4|84{:+M)<2mXᮔtm‰#b;s^@*Pu'|q#}Gm\X )-R0!`mO [獉KILoB^2kRx~YO%l &嬀jc7cBo]Pde,Ubnji1P KU3 &):PxjУG_^I~$\%e>Sq-BZ!kHmF\ 2@ 1Fʤ︳,a s"mPV"x+kbvԷesQRP]"S4H|Qip Cta~(_ܟqL0Ą1a|K)Kv?:x~%l b ]>N-YgP3{s{jI 䞷xU,h 3Wgx :TDwĔuG=]R]-b%bp1R+mQ):߼d0Sq֤w֞Rְmj-?TikCT9\`gq9 ^# 8ZFdk[yH$~Nw%Z.^*ROE*θ(j <1P{aG+$:5jH.ֻ@TI!ո`:KѐOqxiJٶkCzX–'f!**W4Lc2|s(@;EyS;uBX( o) <,نtfDϏ-83"4m@ KBfsy#[B?̙kkCO L-gxyq,#9*Hkt K 8Wѩ%a$B]#c`E|<Gs k¯xD=Y~>3*2N}AB󾺻+ƄܱdRCRKd`(-2cQ,]jlɵ1 6jsRR6)@Du?Q8eF uWڪ5#b;C$:H::B2}#8HPkb^JrG ζ7ldBT[9j9/M}bEŒѦhb4pi-5mWK&KX.ߗX?MK [+[V {jT#`^mu*u3J Ӷ(Y*݆W$֡(gVNlU6O= 2̈́=O+iF8U( HhҔokk$S ki/lpHD1wr]G_"KzY㡸s"˹LAÀO*5RQ~'kYuvmW. ʂ ۼ?{(DGsK(<4aw'*ln"~,]h,2:8J":؟U\'"d꨻}⶟xf\to)Mv(rg,?^y:t,-UяjrW%'g i r(muKxVNSuAeіh ݄x@H#y D4SL/^Dl;4ƦYHW^ޡ5 +^Ơx]k]gt%kcS lg̔,]3E̛; =y(kdR٥E* ״ X̮B7kj)डA+ޠ#zUHldtݯə8 pMA"|EO~\xtlŏdZ`,HGIC̈u4ji֯30sDO?2Iv~?nN:iˡ3O "G (9]0[u&Tc$ wSTAGcefV5FyBnY2 [ר[Cp'Iz1H4}ӕ(9`sEx?7]o*0U74%`lz ((2ŸRRʪXЄQ;kIui> qFv6l:Q1A͵obk.VZ %N/@%J [r%~$G:}uQRԼhR|_V%LR1l6`Eڟa.mF{ȎP%D5&AUNt?h8{Wy•H~\yRBqM\HQ9:%cG M'R2U!1 *o~4-ƙz;ό"1zˬfJbjFd֝@MIB/U7XG% .R5;KcxVxU{@MQ7sYV2ďPwGb8-ꥂ#EEk?cTиM`թRH^ yFMUWz2h[[ oԼ6=ÄₕnzSnM`f]l1DZa͝+qt|{-xHЯgU87fP^OLjnGڢ&q4RtG1R=(=uydZS6..{:dG ڏ!PalO(!b.-ޕ$ #%3QwhtZS lKQB[ח[E655\)N|bz\k,9}>8H:;1ՙQ$Tr~,33*zwBy3tRk*+o3 R~@~L@q5s8?2C8g$"&"!%RYWu8sHI ylt :XT5N ٺ=s@h}E;, $;{\|({[-2~1 2UR*k>+Y.#uGsw '.PfWPZ[sv'pɟ4խ :BѱWA IEC.UE߈: lG(>˨QpKџ#~*ޭFC;,ފns󙝾SI} y#1*KEզ\S雏8~F=KσޖjzkqU8[>qCo|A5}1}kbxˑ;>!R&/R`8 \ՙ㬏=iii~g&V5SpGfL$Z,^-QXko9;F5lq*F_E"ԇ|#kx ĚqpOսzX)hjx,|EŹKTӧw!ü’ٹ$q1 g~j nuëі^;"sxĀx6j]K@~kkr?, EbI)#WS, U/ȴhfcMfY8~Ө@$>P/]+X@!!880}rwvphDA뭵Q"_x %I:KXf*Z)Ǹ{-Wi(O)rw{eSCq2 K`[R^b/:($"duV|V+VH a D "Q?DSj|cĻt ^ykc]1';"~!W`UgDÙo ((sZɩYB_Y{բF20*:Kܵ;&J>#4hDE^ժu2'*)F l϶cE"TG{[7;^|E;˘o=|a GJ3/0?.L $3vM`\ M pƼy)|9,VmVԜ~Iy19gy,)d>k`@XQU2?;۠H6GDcCPWY9G%{e 5mYhLT%٣TDil<(62Z8h!@Pj+Ӎ 7g9߫2RI \1=KVIAp `FLy&sWϚW8Te}M,72IJ~G$e=9X#=Kakz-V rGjr%oD6QPCֳ _iT%O3|łQY{B_e䨑{q(I.rJe ˉsrS9'.S0";ejw+@5r9b\D;N߅X{@&"<% z-vY,W@pcj #S")LQc(q5u,NcQb+TGFY~"E G<@bt /C˃ a"??|Z8|X&z7VkmKE4TGx>"I5^j>L%Y}?CQ}2gFSj 4t|_-Pe }k` vE蓮rc+dY\ZAb-`5pT]׵hhq"p1DBwL+Ĥ9\ٵy6]" \]5L]^uQ'zS:g"x QW>_ c $f^lG_YRk/b$7D v8=^ |DhɉCB[ϡ h.=FعK@>[1#T%UG h]_q˜M<4+-!N@k$,0+x_2NUH ͅ"]I`&(g>/;G M/@F89LBqvOwT2-xo7^5V犞?UD~uC&z4铊u:z[PhmNXy*IsKd)6ݥccBJH,=!dgD4sے.rf2lJvǂR X2sxtI*K2yor8;/s:z;]b7@>K?HssnVG4hq1nʨ&$XPڇ*8/9p$AzfZTᒄY:"3etetĽ/ Nj6FS\iWz$Ű(X_vJ{X .ʀT׶멐x݂{gkЄCnZMC.PR8O&i*F("ئCFE)FoCCS:QM`꬙yJ%u_T>cnƎ#6"[$)zc&[uiA ]K̆2N{f&pvϬAɂo47+bˌJw͘/4Tӑ,weRX&dk; N2ڢ'BV@m!.Yܔ-cQGKgA.j/$o@rk&~9Gy۞ grOl/(Si&)OnD57HSc6"I4#8mG˘ 혠73pBKakcJIb,;f9?zVVWV>ˌ{S`Nu@imQ5 rfd.}YʶUo{$WX^{K!v ?xT9.yQ[B"9 ccw(0aؚCnC&Ό*~g5 ,| h? &8$/+$ ۏ0j Ԑongc^oii NNݳns=ӁJ7dhX(]6&j'ezH`(d"<LVüABEuWwjduC.r*mgSyC YSaS޳# B#ek.y \}HŅ,ʀRiyԯh_iŠX<eB.KXfƴD>02-=Q"Hލm¨ΝN}~TC>}":OaAk.d=b5ͧ!w:N)5];`ԧl)RȟP{L,a(Gi77@Vd'n{%en#f`42TvKHF.5gDF]<ܗVcR8iyʳf5 u}BIծ6 .$@:XE1f`Dmρ'1rIc * qQ Bti#]X#ޗ7r;>{_v?` Lۧ֫yNslݴ%S&&˫ӧۻ1ґˬT^>)Dc8+O<ɗ'ݼC0aDnq7l'7SEg[N~ `BL0_ ٓF]c$;J\Q_LlZ⧯a>E)喆/Eh`jB_pG1̈́M%u"Wd( 颠ߴeDg4 _W*߽cYWҁrm&ivu)ω5@R_}M5 eK%QҕBZ?qqN{r"ɵxJa)6%`dù?+owZn+a!3`ѐ6w\-O`|' v׷'.@6B$Fɫ-b:m?@ O,c7 ؕESF@eg=wS/g}4( ݡ?r|W]5鳤'f]o8/ Z<@Wr:o$hHXiݒɦJFX'! 6C$[!01Z&ש5.FM 蓀 y((:˘_vpaa y䋧ލ$ɩԐ|r4|qBk݉ r핅0Iu-BESrާ?Dqv4~PqaS|Ƌ)o m5Z6Lҵ+%a/ߥV0IGwBjbN-2aZWS1aV$7iX %[w7pdPC/>_ *JL6NVvߘ8QK]W'Sbo2u37k+Oi+6FЉ{LnB6I sQI=P Vڻ},%*!FDTAK B2({8xxa!!P䅘~w/.MDMs &n&^ ulo]I=99!;&:1Y)Y0rL<"-[Kf}^iv֪AT]]b RqsGQsvW{#PWuIV$Ϥ9ރL&M=y_j hGд /t]b3K]qƸ\ĂKwP{M 6G Mx>9;W;ohⰏ>oM%sbI۟o6 ͮ @œ\^hݦ^P[6Όh(}"{d -/ w`nw7Rd4+gTJe1}ȝE_=[>} XVJ>%32TE`.^6j}Ba/ ` :m}|Ǖ4PGh:)6| <?T(Ma܅@E{9Wd,?{O 89+c2DhJ~ŠEnItK'en(s4y# DHcjAvBr`7^4G!H#TdOsggHuXkߵ qل2rMXtf 9%IUjdbBB F-U`LڐÈMg0z3imTJlYŦaS"<]de[h (5 >.% 0pSG]cK۞#:8ྡg55i8˾ RDvTȦ J$63wK4I֛8jzBnc@Վ=A<OcMyW#X;V1I  &MLӥ2: Ĵh RYGG3 UHvRwfk <11՟'472`ܙyֲu2Ţ|و7 H Ej#Z^\R=f;_|d",p15pY1عL|ˊ4%&+јW=P*Wxmf %ؽ6f|n`n=MMmxȓ|zB.Yv2c@Lu9'q8F]pd{ r?`=[vMfVdS$2 L8H}Ģ"l6 m\ГOD 5PqLk#P5=Z.^#@G8F|\b$ 252ų4|\1kG08S#(&7CktvZ(6aҷ .r]/W#ǝ0XoN"ld(Y4 ,lvxdG؂V :e~?Thg,:![nnDupڌH5+ b9fUfs'~:cwb\\ql7S{M"$C_^o|s/Cj8'٢n-h,r+lQ+X]`hogiqms=!vqT* Z[]כb$M3aBѴp7:]Xύzn1}i,՜i+u;8fݵb !kfi??挔XêT%2MMu?Ej߼nk3n2i(CSVۛY~/5'ºj"|Rnfc gBTs՛b3Xq5.Y # /ƿJ QBƽ[=${?"\i!'Qc73Buu<4J'd*dS‡P0VºOZvDzj=Yg "Ʀ[7, ̶ Qծv9-}uEEۄ9@]  38lЭ=겋tkK= $PD+B*sxōk7 -nťZcdZd<!=RHaMuE%W)M"Qʨb$YN28 | F-L9ErŻ۴?=(~PR\~HFV| =+  #>n"qYƉ{mݎ_~& L=\ɮ?}kȌ\Ҷ[3m=wLE 3ӔWB&94miA=GN*o=8+$Xch^hf9{_ KV֑`ѳjEp:܍5yN wgjBʟ5'|P?Rb[gђ OPZfXZbn؁ƒ-`-@/o$7<ɠ&ռEFg}$֮lIΩ_H/'P7Ȱ/;?EƖZHp>6sDT%8Z6ݡ0?#lq\Z5gK#6E{2l!yR5M8 $D&"Bʼn m6 +,;9 Z. >c+¾m.uq