* @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\db\driver; /** * Oracle Database Abstraction Layer */ class oracle extends \phpbb\db\driver\driver { var $last_query_text = ''; var $connect_error = ''; /** * {@inheritDoc} */ function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false) { $this->persistency = $persistency; $this->user = $sqluser; $this->server = $sqlserver . (($port) ? ':' . $port : ''); $this->dbname = $database; $connect = $database; // support for "easy connect naming" if ($sqlserver !== '' && $sqlserver !== '/') { if (substr($sqlserver, -1, 1) == '/') { $sqlserver == substr($sqlserver, 0, -1); } $connect = $sqlserver . (($port) ? ':' . $port : '') . '/' . $database; } if ($new_link) { if (!function_exists('ocinlogon')) { $this->connect_error = 'ocinlogon function does not exist, is oci extension installed?'; return $this->sql_error(''); } $this->db_connect_id = @ocinlogon($this->user, $sqlpassword, $connect, 'UTF8'); } else if ($this->persistency) { if (!function_exists('ociplogon')) { $this->connect_error = 'ociplogon function does not exist, is oci extension installed?'; return $this->sql_error(''); } $this->db_connect_id = @ociplogon($this->user, $sqlpassword, $connect, 'UTF8'); } else { if (!function_exists('ocilogon')) { $this->connect_error = 'ocilogon function does not exist, is oci extension installed?'; return $this->sql_error(''); } $this->db_connect_id = @ocilogon($this->user, $sqlpassword, $connect, 'UTF8'); } return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error(''); } /** * {@inheritDoc} */ function sql_server_info($raw = false, $use_cache = true) { /** * force $use_cache false. I didn't research why the caching code below is commented out * but I assume its because the Oracle extension provides a direct method to access it * without a query. */ /* global $cache; if (empty($cache) || ($this->sql_server_version = $cache->get('oracle_version')) === false) { $result = @ociparse($this->db_connect_id, 'SELECT * FROM v$version WHERE banner LIKE \'Oracle%\''); @ociexecute($result, OCI_DEFAULT); @ocicommit($this->db_connect_id); $row = array(); @ocifetchinto($result, $row, OCI_ASSOC + OCI_RETURN_NULLS); @ocifreestatement($result); $this->sql_server_version = trim($row['BANNER']); $cache->put('oracle_version', $this->sql_server_version); } */ $this->sql_server_version = @ociserverversion($this->db_connect_id); return $this->sql_server_version; } /** * SQL Transaction * @access private */ function _sql_transaction($status = 'begin') { switch ($status) { case 'begin': return true; break; case 'commit': return @ocicommit($this->db_connect_id); break; case 'rollback': return @ocirollback($this->db_connect_id); break; } return true; } /** * Oracle specific code to handle the fact that it does not compare columns properly * @access private */ function _rewrite_col_compare($args) { if (count($args) == 4) { if ($args[2] == '=') { return '(' . $args[0] . ' OR (' . $args[1] . ' is NULL AND ' . $args[3] . ' is NULL))'; } else if ($args[2] == '<>') { // really just a fancy way of saying foo <> bar or (foo is NULL XOR bar is NULL) but SQL has no XOR :P return '(' . $args[0] . ' OR ((' . $args[1] . ' is NULL AND ' . $args[3] . ' is NOT NULL) OR (' . $args[1] . ' is NOT NULL AND ' . $args[3] . ' is NULL)))'; } } else { return $this->_rewrite_where($args[0]); } } /** * Oracle specific code to handle it's lack of sanity * @access private */ function _rewrite_where($where_clause) { preg_match_all('/\s*(AND|OR)?\s*([\w_.()]++)\s*(?:(=|<[=>]?|>=?|LIKE)\s*((?>\'(?>[^\']++|\'\')*+\'|[\d-.()]+))|((NOT )?IN\s*\((?>\'(?>[^\']++|\'\')*+\',? ?|[\d-.]+,? ?)*+\)))/', $where_clause, $result, PREG_SET_ORDER); $out = ''; foreach ($result as $val) { if (!isset($val[5])) { if ($val[4] !== "''") { $out .= $val[0]; } else { $out .= ' ' . $val[1] . ' ' . $val[2]; if ($val[3] == '=') { $out .= ' is NULL'; } else if ($val[3] == '<>') { $out .= ' is NOT NULL'; } } } else { $in_clause = array(); $sub_exp = substr($val[5], strpos($val[5], '(') + 1, -1); $extra = false; preg_match_all('/\'(?>[^\']++|\'\')*+\'|[\d-.]++/', $sub_exp, $sub_vals, PREG_PATTERN_ORDER); $i = 0; foreach ($sub_vals[0] as $sub_val) { // two things: // 1) This determines if an empty string was in the IN clausing, making us turn it into a NULL comparison // 2) This fixes the 1000 list limit that Oracle has (ORA-01795) if ($sub_val !== "''") { $in_clause[(int) $i++/1000][] = $sub_val; } else { $extra = true; } } if (!$extra && $i < 1000) { $out .= $val[0]; } else { $out .= ' ' . $val[1] . '('; $in_array = array(); // constuct each IN() clause foreach ($in_clause as $in_values) { $in_array[] = $val[2] . ' ' . (isset($val[6]) ? $val[6] : '') . 'IN(' . implode(', ', $in_values) . ')'; } // Join the IN() clauses against a few ORs (IN is just a nicer OR anyway) $out .= implode(' OR ', $in_array); // handle the empty string case if ($extra) { $out .= ' OR ' . $val[2] . ' is ' . (isset($val[6]) ? $val[6] : '') . 'NULL'; } $out .= ')'; unset($in_array, $in_clause); } } } return $out; } /** * {@inheritDoc} */ function sql_query($query = '', $cache_ttl = 0) { if ($query != '') { global $cache; if ($this->debug_sql_explain) { $this->sql_report('start', $query); } else if ($this->debug_load_time) { $this->curtime = microtime(true); } $this->last_query_text = $query; $this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false; $this->sql_add_num_queries($this->query_result); if ($this->query_result === false) { $in_transaction = false; if (!$this->transaction) { $this->sql_transaction('begin'); } else { $in_transaction = true; } $array = array(); // We overcome Oracle's 4000 char limit by binding vars if (strlen($query) > 4000) { if (preg_match('/^(INSERT INTO[^(]++)\\(([^()]+)\\) VALUES[^(]++\\((.*?)\\)$/sU', $query, $regs)) { if (strlen($regs[3]) > 4000) { $cols = explode(', ', $regs[2]); preg_match_all('/\'(?:[^\']++|\'\')*+\'|[\d-.]+/', $regs[3], $vals, PREG_PATTERN_ORDER); /* The code inside this comment block breaks clob handling, but does allow the database restore script to work. If you want to allow no posts longer than 4KB and/or need the db restore script, uncomment this. if (count($cols) !== count($vals)) { // Try to replace some common data we know is from our restore script or from other sources $regs[3] = str_replace("'||chr(47)||'", '/', $regs[3]); $_vals = explode(', ', $regs[3]); $vals = array(); $is_in_val = false; $i = 0; $string = ''; foreach ($_vals as $value) { if (strpos($value, "'") === false && !$is_in_val) { $vals[$i++] = $value; continue; } if (substr($value, -1) === "'") { $vals[$i] = $string . (($is_in_val) ? ', ' : '') . $value; $string = ''; $is_in_val = false; if ($vals[$i][0] !== "'") { $vals[$i] = "''" . $vals[$i]; } $i++; continue; } else { $string .= (($is_in_val) ? ', ' : '') . $value; $is_in_val = true; } } if ($string) { // New value if cols != value $vals[(count($cols) !== count($vals)) ? $i : $i - 1] .= $string; } $vals = array(0 => $vals); } */ $inserts = $vals[0]; unset($vals); foreach ($inserts as $key => $value) { if (!empty($value) && $value[0] === "'" && strlen($value) > 4002) // check to see if this thing is greater than the max + 'x2 { $inserts[$key] = ':' . strtoupper($cols[$key]); $array[$inserts[$key]] = str_replace("''", "'", substr($value, 1, -1)); } } $query = $regs[1] . '(' . $regs[2] . ') VALUES (' . implode(', ', $inserts) . ')'; } } else if (preg_match_all('/^(UPDATE [\\w_]++\\s+SET )([\\w_]++\\s*=\\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+)(?:,\\s*[\\w_]++\\s*=\\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+))*+)\\s+(WHERE.*)$/s', $query, $data, PREG_SET_ORDER)) { if (strlen($data[0][2]) > 4000) { $update = $data[0][1]; $where = $data[0][3]; preg_match_all('/([\\w_]++)\\s*=\\s*(\'(?:[^\']++|\'\')*+\'|[\d-.]++)/', $data[0][2], $temp, PREG_SET_ORDER); unset($data); $cols = array(); foreach ($temp as $value) { if (!empty($value[2]) && $value[2][0] === "'" && strlen($value[2]) > 4002) // check to see if this thing is greater than the max + 'x2 { $cols[] = $value[1] . '=:' . strtoupper($value[1]); $array[$value[1]] = str_replace("''", "'", substr($value[2], 1, -1)); } else { $cols[] = $value[1] . '=' . $value[2]; } } $query = $update . implode(', ', $cols) . ' ' . $where; unset($cols); } } } switch (substr($query, 0, 6)) { case 'DELETE': if (preg_match('/^(DELETE FROM [\w_]++ WHERE)((?:\s*(?:AND|OR)?\s*[\w_]+\s*(?:(?:=|<>)\s*(?>\'(?>[^\']++|\'\')*+\'|[\d-.]+)|(?:NOT )?IN\s*\((?>\'(?>[^\']++|\'\')*+\',? ?|[\d-.]+,? ?)*+\)))*+)$/', $query, $regs)) { $query = $regs[1] . $this->_rewrite_where($regs[2]); unset($regs); } break; case 'UPDATE': if (preg_match('/^(UPDATE [\\w_]++\\s+SET [\\w_]+\s*=\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]++|:\w++)(?:, [\\w_]+\s*=\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]++|:\w++))*+\\s+WHERE)(.*)$/s', $query, $regs)) { $query = $regs[1] . $this->_rewrite_where($regs[2]); unset($regs); } break; case 'SELECT': $query = preg_replace_callback('/([\w_.]++)\s*(?:(=|<>)\s*(?>\'(?>[^\']++|\'\')*+\'|[\d-.]++|([\w_.]++))|(?:NOT )?IN\s*\((?>\'(?>[^\']++|\'\')*+\',? ?|[\d-.]++,? ?)*+\))/', array($this, '_rewrite_col_compare'), $query); break; } $this->query_result = @ociparse($this->db_connect_id, $query); foreach ($array as $key => $value) { @ocibindbyname($this->query_result, $key, $array[$key], -1); } $success = @ociexecute($this->query_result, OCI_DEFAULT); if (!$success) { $this->sql_error($query); $this->query_result = false; } else { if (!$in_transaction) { $this->sql_transaction('commit'); } } if ($this->debug_sql_explain) { $this->sql_report('stop', $query); } else if ($this->debug_load_time) { $this->sql_time += microtime(true) - $this->curtime; } if (!$this->query_result) { return false; } if ($cache && $cache_ttl) { $this->open_queries[(int) $this->query_result] = $this->query_result; $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl); } else if (strpos($query, 'SELECT') === 0) { $this->open_queries[(int) $this->query_result] = $this->query_result; } } else if ($this->debug_sql_explain) { $this->sql_report('fromcache', $query); } } else { return false; } return $this->query_result; } /** * Build LIMIT query */ function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0) { $this->query_result = false; $query = 'SELECT * FROM (SELECT /*+ FIRST_ROWS */ rownum AS xrownum, a.* FROM (' . $query . ') a WHERE rownum <= ' . ($offset + $total) . ') WHERE xrownum >= ' . $offset; return $this->sql_query($query, $cache_ttl); } /** * {@inheritDoc} */ function sql_affectedrows() { return ($this->query_result) ? @ocirowcount($this->query_result) : false; } /** * {@inheritDoc} */ function sql_fetchrow($query_id = false) { global $cache; if ($query_id === false) { $query_id = $this->query_result; } if ($cache && $cache->sql_exists($query_id)) { return $cache->sql_fetchrow($query_id); } if ($query_id) { $row = array(); $result = ocifetchinto($query_id, $row, OCI_ASSOC + OCI_RETURN_NULLS); if (!$result || !$row) { return false; } $result_row = array(); foreach ($row as $key => $value) { // Oracle treats empty strings as null if (is_null($value)) { $value = ''; } // OCI->CLOB? if (is_object($value)) { $value = $value->load(); } $result_row[strtolower($key)] = $value; } return $result_row; } return false; } /** * {@inheritDoc} */ function sql_rowseek($rownum, &$query_id) { global $cache; if ($query_id === false) { $query_id = $this->query_result; } if ($cache && $cache->sql_exists($query_id)) { return $cache->sql_rowseek($rownum, $query_id); } if (!$query_id) { return false; } // Reset internal pointer @ociexecute($query_id, OCI_DEFAULT); // We do not fetch the row for rownum == 0 because then the next resultset would be the second row for ($i = 0; $i < $rownum; $i++) { if (!$this->sql_fetchrow($query_id)) { return false; } } return true; } /** * {@inheritDoc} */ function sql_nextid() { $query_id = $this->query_result; if ($query_id !== false && $this->last_query_text != '') { if (preg_match('#^INSERT[\t\n ]+INTO[\t\n ]+([a-z0-9\_\-]+)#is', $this->last_query_text, $tablename)) { $query = 'SELECT ' . $tablename[1] . '_seq.currval FROM DUAL'; $stmt = @ociparse($this->db_connect_id, $query); if ($stmt) { $success = @ociexecute($stmt, OCI_DEFAULT); if ($success) { $temp_result = ocifetchinto($stmt, $temp_array, OCI_ASSOC + OCI_RETURN_NULLS); ocifreestatement($stmt); if ($temp_result) { return $temp_array['CURRVAL']; } else { return false; } } } } } return false; } /** * {@inheritDoc} */ function sql_freeresult($query_id = false) { global $cache; if ($query_id === false) { $query_id = $this->query_result; } if ($cache && !is_object($query_id) && $cache->sql_exists($query_id)) { return $cache->sql_freeresult($query_id); } if (isset($this->open_queries[(int) $query_id])) { unset($this->open_queries[(int) $query_id]); return ocifreestatement($query_id); } return false; } /** * {@inheritDoc} */ function sql_escape($msg) { return str_replace(array("'", "\0"), array("''", ''), $msg); } /** * Build LIKE expression * @access private */ function _sql_like_expression($expression) { return $expression . " ESCAPE '\\'"; } /** * Build NOT LIKE expression * @access private */ function _sql_not_like_expression($expression) { return $expression . " ESCAPE '\\'"; } function _sql_custom_build($stage, $data) { return $data; } function _sql_bit_and($column_name, $bit, $compare = '') { return 'BITAND(' . $column_name . ', ' . (1 << $bit) . ')' . (($compare) ? ' ' . $compare : ''); } function _sql_bit_or($column_name, $bit, $compare = '') { return 'BITOR(' . $column_name . ', ' . (1 << $bit) . ')' . (($compare) ? ' ' . $compare : ''); } /** * return sql error array * @access private */ function _sql_error() { if (function_exists('ocierror')) { $error = @ocierror(); $error = (!$error) ? @ocierror($this->query_result) : $error; $error = (!$error) ? @ocierror($this->db_connect_id) : $error; if ($error) { $this->last_error_result = $error; } else { $error = (isset($this->last_error_result) && $this->last_error_result) ? $this->last_error_result : array(); } } else { $error = array( 'message' => $this->connect_error, 'code' => '', ); } return $error; } /** * Close sql connection * @access private */ function _sql_close() { return @ocilogoff($this->db_connect_id); } /** * Build db-specific report * @access private */ function _sql_report($mode, $query = '') { switch ($mode) { case 'start': $html_table = false; // Grab a plan table, any will do $sql = "SELECT table_name FROM USER_TABLES WHERE table_name LIKE '%PLAN_TABLE%'"; $stmt = ociparse($this->db_connect_id, $sql); ociexecute($stmt); $result = array(); if (ocifetchinto($stmt, $result, OCI_ASSOC + OCI_RETURN_NULLS)) { $table = $result['TABLE_NAME']; // This is the statement_id that will allow us to track the plan $statement_id = substr(md5($query), 0, 30); // Remove any stale plans $stmt2 = ociparse($this->db_connect_id, "DELETE FROM $table WHERE statement_id='$statement_id'"); ociexecute($stmt2); ocifreestatement($stmt2); // Explain the plan $sql = "EXPLAIN PLAN SET STATEMENT_ID = '$statement_id' FOR $query"; $stmt2 = ociparse($this->db_connect_id, $sql); ociexecute($stmt2); ocifreestatement($stmt2); // Get the data from the plan $sql = "SELECT operation, options, object_name, object_type, cardinality, cost FROM plan_table START WITH id = 0 AND statement_id = '$statement_id' CONNECT BY PRIOR id = parent_id AND statement_id = '$statement_id'"; $stmt2 = ociparse($this->db_connect_id, $sql); ociexecute($stmt2); $row = array(); while (ocifetchinto($stmt2, $row, OCI_ASSOC + OCI_RETURN_NULLS)) { $html_table = $this->sql_report('add_select_row', $query, $html_table, $row); } ocifreestatement($stmt2); // Remove the plan we just made, we delete them on request anyway $stmt2 = ociparse($this->db_connect_id, "DELETE FROM $table WHERE statement_id='$statement_id'"); ociexecute($stmt2); ocifreestatement($stmt2); } ocifreestatement($stmt); if ($html_table) { $this->html_hold .= ''; } break; case 'fromcache': $endtime = explode(' ', microtime()); $endtime = $endtime[0] + $endtime[1]; $result = @ociparse($this->db_connect_id, $query); if ($result) { $success = @ociexecute($result, OCI_DEFAULT); if ($success) { $row = array(); while (ocifetchinto($result, $row, OCI_ASSOC + OCI_RETURN_NULLS)) { // Take the time spent on parsing rows into account } @ocifreestatement($result); } } $splittime = explode(' ', microtime()); $splittime = $splittime[0] + $splittime[1]; $this->sql_report('record_fromcache', $query, $endtime, $splittime); break; } } } 24;Dk>O,UG:7|O~J/{BXCG+ryCh?2gw.#pp?RԺ"Q)(a[I¤ij[1QPaFCy?m-|""gIŪoI *䰊|\9kuv4n1|=l՛kK"88f-t9ٺ)R\Ӓ]] x^s1=JdvyrԜm,V y0y8GX6PwaE#˭T,'hׯ+j3g-)GCF6 Q&@G2ͼ(}pn: ,aRF6Qbm,; DކbUӒHBIB Z&Cg:oi1YrJ<.>4ss\'T3TlRmKRǸGp˛hF8&.L2\S L3Ĭ \lu< 0iIli =l.sL4L,GMv~XWƒ=qF(իksƱ^MZdEl g"! X 㢎Ypį@^-y^,*~D8tAwn/ۜľ<=Oke[zj6%[Ŀ@BA˕⇧Ce!#J _²':[EN$,=kaTӝ΀نB,HҢ Lu  9~q졣BР Va-[:v攝(Us#dBB'Pދ%Tī}?/0TpT%AKZmm M{L8Vk2Y慓 )x 0*5EU@NCnڹc?R5n'>X^c9 84$"úf^xTQ;qڟӴs ǐEI*gcɲ|qB,o),`3靄xƍfFwrwBӦ |,N( 6:2hTY!b$X{RJd? _  ШH/J8qoO}X[[`+踓"̎k1?ќ~=,%WZZ쾋6k(q ~} >Y= ߏy ]r[)s:Ҡ(E`%(7!7g 72N9 JF@ZWR8ܿ ӝþMx1PP#ǜ5Bp?.qY)v"Jc@l/P Dfr4OSlWbNhvxeNLƊҫNw҅KvA9#D Թ}$'n"[t $:H10]NW2cqg8SPZj%$-td\2zn\: _DYև9f#0sGQWol}e2T멑N*k3t֙\ (ߩn1k@&G!iu̞jgEs3^$J3X{PaBUp:!Wx$#<G$%:*Vca|؝jcΏ'/b'<hg=B݉f}0zv1xHԤwbӣƿ>nƋjWBC5\0J]샨}A,lCjYރɊit}Yd-1B)xa@R1\ 3Ft̅$i}Ol608deNb>'oLݗ;Yۊ{擻I .I}$0 cɡkOTtfOD#h]Dǜ8Ƣͼoiw]j% č [}/[?ǡ6PP6QDZhɣlo8 Ƴ6nW؁/r#HWIo7B#dʙ){B$\),]\i%} ?>7NejLϬ2x|lPKn=F@M *WAwCj6Nco>+P ƚJV?/G?IM7oCv5fh)f;"V$D؊(FE@y;[Wсp46b|޸Ucfrjl9g7 - XD<ƇT 3 p3a;3iI `kVА@6V̷pݾzC$Iq 0Cnb&E? 5cJal'\(=DB i.bYFS1etgZq츑,ٰQR͢WoF"$ l$lCgpeZHVG)jI zlt63\F޿ba9.Յo%S lWΩRLͦ6xL(0]͇"MތL7!u<@L1PwgWy ABfBZ4 s":pc$[wDZ(NX=y_y3Z bKJ K0?nDWy?! "ASlC^Zd|C3'┪?}½v6H> ,G߷hbpmmF{|G|G}F ?G$ֹ%ФQ1^H+>P<k4'*o*8Noiz Ln1d R(Ÿ$9*TXNڧނuIk}= i:!{MACkndd]I0zяJ$ XpLyƜG س>] KuR ):d̓#]^l(D ]'xYZVf=n"Ieu&R U鮊έ a ,B2uzNXqt,Z7o[煙QkFaS`1 ;t%EnoWf"Y~%0Ru2m&D)E{VQVO+pm….=GVO80P̛Q&sa@5ù% qQP-ֳ=q>yaeW Kқ~҇7>XFqUc;46:zX9kI`I[F0hE$A^bЯPaɌ_L_VD=Ql90lJ dMb4U OEgPyU +\\ aXr=0a"Kk,E kGG~\ \f& 咵>[&yi'g\l]& <^|=С<k 'e2qk&QzŽN9f(FW>xut6hڂIQ>zߛ'WCA1P1pJ"ei\q.s};Oщ WƜ#)p1l?*T_GNZ΅Zp8,#sF'mGӇ7KSuf I5?B^'.O L l.Ζ6lNwhqPh1ï3_p)*CMH|TςcoMր%KjJ!ݶVexFJ:PLezTGp,|lFazk%B2\GYVۂZǪ[C L> S!Qzˬ>##q,h uϗ Rk$!=j'J:>*ở+ާA?A* )'QGYv_1MMr=Ri~A p!Bx\DnEt1JbJ+ 6uV9IOyVS%KklVBtB\=)a3gfiJ D7eY9Ѱ0)1WuWX <+ ndVWƳنje6O1"yF;as:@#:ggҢό ݔ6|ekFܺ($sLCt8dC'u6`KCj@F`;e-E=n:%c1]rt⇭;2oZF votf`(oo\dݖ|YoɅbՠ“*T1_0*.yJH=9#\}Qdu=$ٸdvMB`hFJ)ra#v)AXi tkgVjj^^#~,bz;LW6"eLfmRա uWI8'CM :ꈫZ wpKKt8({Gp?Kbi;y`f AwO=9x e``u+> vcbxEt>IQn-UP3:ݦukoeǸѢG֚K~g5s" y].Yc0kOJ9> Mg\<Džp&%c<9q<$-fQË́em- UEҁÐU3WBx=LaMCo^nRDfo2w< ~W6'i L{gj#(,Gg珗+ @0Rc'7]HCAimzLop2H~߷nD}geIWQQ1soY%d K55N2)4*"`V؜A)>eV\" 73̈́^dX)6yfq;GmB,Bೲ.78bp+9~٨'B6U_a +nۡU樍ir2'4b\ Zq0c^ZPgm5p]gί8!!F3E.6jUN֐,K~=?}]r1VK !lv}r[&G7(`m7Z7ݬD,YRÚd/[BlΘ>k!_'RT 4x;kJJ̯FGozh7̘5{*;TqLVA}/KG7m`R-]/59f 7St?h[/Dwz<\b ^bd ‹AݳYA#GGGp!M-lƸ W uLJδCZ䄆758PN\[_<ÎRrI7B(C/ &OR׆ -[4LTrtSxY[qǵV (k)_ R#":EHeoJàS^t*^Fetwf>\Gڹd(R.ys_^ 9X'&J?@Hs&#NE20-uDadEۦSc נ8-a=6{[<ˬ2!iYxZ*{w8h1D3 ^PFŃڗF&fi`ݭrP@L}p[i%vߜHs^KniaQqo8L SH$yǍPG0r2J7B`V87{oQ˝^*w Cx4 Nˢ ukF_}^UJUDUBX{4iVM9~~{l?`:_Lq",rݩ1iZjxLc/GqGGgno j/(f>%lic`eLj=$,ːE+C^>-o~V܌TꊕL;:^-T#Z$grv=2_J_ZE3|l~% xf2R45t6HEX 4s/T?vub5|w[`@ a'm\ z_';B%ۼ\d)k?8jv-̝"G ^⓾U 隣sAd08itlSռft$?c?\/kZF(UWEl@q!$'9L)|!B+~rʧ׉lSy2tȗ_(^nY`_RWs GZEw]|v{$dg\vN;azCu`TK%y'%vF4~oW=܋L$T*o)+qfƿJ;aK׳j=1Q^SlC (2W$Dlaݩ#h*s]8T ۷2%BU(386\TzVt;K cux]M<{ Q#v ,1F_[z!#CF 49&e[NЙ؍ZNUK+&,C܃7@Gܖ4pxJӿY#'+Z۠.R 7'NvsVh'nP>݋yuA/XK DFlQtG*AYl t^Do\>^k^{ R: +D?6 }cݫ"WL%@h_`$A]џtG|uŋȱ 9H2[]Vz_o(2 ,.!(ᅚMY_IϬ%qd\%h 'D*b:N0Bn6+AꤎxUT0^ҊX۝k;z*7yjENl|hoDbT2 +:,ܛ\qx:+!P(썦 tF5>zuP1)vɞƞ_HLgdޱ*t U?5Ԅ;8" GZq!2`3TG)${FЉ ҹS뽣^8{ѝ* [U3*W41v>3 \qRq:&x:(O  W !˖I`j ;iRULPcb0Ȓ3+S i#Sw.G*T+"sN*/_ S./kn>n$vڀygD9@S&5c[&GvUSd2OR7ZKbc}H}T;NYN;7ԋY/jj01nZ$r+ bRH2iHщ @o>C6 MWjgA$GH(Uq iNoQwOX;hD:>ȆA*|z7W^^nu1dܮѲʏ;?ƞ*nَJ9B$5ޱcVcM{99]d ^FGgq0kߘ7ʊGX"|D|?=If9XM?iq9"AB\ j,4pW@!#`3Qsu{ ~5P/WT&7MXQW*6}XY8h|" OM&Jn}/Rԁ$wB'wz,8(zϨ v{ʋS܄|DEb-dpivn?4' 7Q= "; ^XdpWѝƈE44KH$d/WÊ5t%f׵'@StZb8P"OPL^[aeZfyXFe$V# yŖ,rinׇ-t&b\S'Otg?)8 t  Drn}f)"㿱mLk".NMϤٶe-sx\u1^'xY:LKb -t攷عA|>Y\Ϫ>=) K@*w\1Z̕y| (4 ً◕9nT%y)X3_NCZE3:Mrܵ~?ۜdGfoMghqg"1?Z;GzE qutNj'QpYP0α9~U}* $;H`v'5Ngڇ ,|քγXkL{@1A^ Xi5jZ 2`;Ξ~<ԁ]Rw4ax1\MmG~Tyq!0, \ wK|TO>@7"洿W[FMm{):k-:nН32MO ?;8+߂J]|.wCxH+?p*DWLN9IbbR'rCQڸ9I{AӾ"zk R&u2\xBr(`ݽQm4(58aw۟p2X43b C(_\֟L+|lx5;3|y!7}߬mu"S`0DրjN(sLiV $!_%3..'QIN]]?[QqmCx86o#7mQDF˲Qʎ /[J`llO=eT7zhV5sT~ş ؑM3%603ѡWBH}cJ=jyPB$ȄQ <5ZHXtA M)eK£ԥfja1c, 13|OGDM` CMzDC@mrdԧD39ԁfC1y= PcՀl:ngcr=1UEw;V[A7)vWt9}PB[tǵ 'lx/?n8za-f N=r?U(B6KH/i\-}%h9-3 hEFHt2;ϧo'^&J a)WCe( 2BWod<§GG?ޤ]R37auw%4È*}NB41%W/֬>&-4pI;c'u,ۑ%_=#w"PX#וFJ#J? Xd`:K 9JoCn(WRϹs>"\WWsNFtU7i1 "Ƃ>QeXi$+Lga Y՘5wy~aX80̜ ^rjqJ)zV!#NЅA4N\\vvRVY:N%W8k9Y6V瑥mI*۝K \J(q7 4HdU.llwU,G:VlU"B~(ک*»\SƦ?}1P6°3y# :iH8W\eOQ˥Y=o'#%`4Ung}<.!e(.<ѾVp_{wrCXéStm *XBK!Uis>eƚEcӏ4XDY H y~f'N؟Wb3GҤW J}mҜN~5a/0> \D4n|[C5" Y:eH6͹%~P ҵCI2\B"$[:A0ΈߠD y3>>`>w `a;Н|&QLc>ɦ+ ɴ}EcڿCWhEbTNC{$T/ſֈr/^p,bJqV6>?yҩᙶnUp^ AU `_M\; .i!h}gk_L1vY4"6?zp?` XG ,C4( KoYO}RLMckdj 0ާ} PW!qr2E;E&l[pk]@wscV S37<[(@x(A?&q  H sn6 -@?gT6*h+nK~0\P)d6d|xN4D]{"] L ា @vO[ %7CT+K_5;j(`9Tte+4'`{*8@ zB9b+zM2MY[p_zg}9 tY{yܓS-lM!k KDo8Ц>k2Z|>=9:3wM5OVc)a+p~책'Q5;& =td%1+Y%N%c2V6F rJmk}'RJAbsS- 0҉|V4aH#B*L[0&+"ح RD4DN to2)בQ ׶cұI_qODDM5ٻ੢F}jl,t1]U*rbzUJC:T /$4ݤ('ffu6 {+<2iw@xQ Y*zsktii[.n.ӂ ]Sg=שQyOJ}Yi<2":t|`ok2teX>GB"HЛê8"@RJ1tG̩ >^4hB9] QjnU.FFL>;90fAwʷP^.tB\@6x?KHh)h"vʭ{,kYފ!Ƥ~ >I(E;G9CDԟcV^G|@w4yO"D^u0ࢻH5*1>>ibMi{q w^cy?ȕ}.hQk^9YKb'yb>*'$b`3aJ"Lk:rV|Ǣ 3Hk8P9K.č;s1gRh9U(^ xC!p4rȲD%21Ϡ@Nqg*Zf9'lBnK 瓄Ҵ7"B&'5J5('(DHa5 ״'TНBFP&^睥W`/%iMSHxka)ݱFz8dok,c 1l{թqb:mr.B+D=s$9֘A,lW}ÔvUYiNLmwZQ[YPf7үE"`$fsі1>PP3_^Om+1~ ZeMd_G 7B0Ĵ@/)B- +Fr-s3DpsY$;(!4ۇ Qf:`}&}|C^\6tw%d_/?$xA89 գDJ).n"ٟP_f9@Afgz04R[6h]ehg6jP1/xHۮoa6l$iMQ~\|_D6g@>c \]ۓH\41qF5I3~N%KXk! a4f6ViGv*nt$ lߧZ{Q øt+8:91`gcxx;Ki*C#]Ƕu)I,o N8anAɡynL#D8Bъ~]~O3%AEa?$cDq0LH4<~7 ^x5D/Lm_" G2X#}!W[A5AǦ"J0z踠Ԗ@!+;s@ߖ<8vjjIQbZM:6kHѸqgH56"rᬍ'u6-(9x5g-vsa޽tvh}ev}S[\o`콜>hХKL58@ฦ/m *8EMJRt~kRK;8)ҁD9v.ƀƵJၢ-!ϋn3O!DC p] k  B CMK[`V'hwƽ]{N3^KXN5RwO 2zTH:ʹϨl>VO{rg&$g[.܅ .MOr?. 7Zh@gH7(9OP R U\ɑVnA>)"y{{'#?TYFdOzG+}z\n['[~ @hTcnc"إʞƴI+g³\=T&0c 1rG7{c'qa|։ NH#Y]8P1T"%Lq=z8hP"Nw/g rëJLK5Pۡ\9 -%}8Mע F+Ǟ 켴pArYz I).њ$!*Rc\bM!!!t w3B!E7TT=X:JDy}L%-B0vIkXR8yy!݇v%d9l f)ڞO(l6#fB^DLH.y61qp|Z $'0)ŽZWDŽXiZtXJZͺW)2绸8((rؕX"'13^c"uKc+ZO:yZҨf\Z} q d = j>~_+J v\jft$n5.xa=v5橴0DsT+*@dQzpR5Q)#_r{EhW̧э"z)?b<cL.nQ)v4@ݵz)Z jQbǶOWMv?$Dv@4zTeq. +IC2>)@2cJ4*uTNP! ͺOJg Ve _mL (3qBQ @tO!| . & h Ҏ.6XA. ̎xJ \/8]üPp +:h 4;وK alŸi;\YCC_ИHlآ|!QAyu iVq3j;:Ɔ7gf^Q2 !3oGN]/”le+TeAp|7|9tM,F!Jg_s2b%X 3%U)YZ } 0*9`cze_+^N{#Ikn@]b5̌&W@z atkَ|-'nUqyJ;D4ìGrm SYVyo%lO%*Bp;"2?a~ht2YHq azW~ljڹY/$p' ga)-ݒߝ75`)G]I\?@8kBָY\ T}H%ZO_ #֙M_-pG&:ϵO#9|ƴC$m ϴMS{ 햁1_Kibԛl27It.pqAq'Kdpzʽ/ Lb&; T{6iw& ={ZsUuo ;sFh(ActgLIX:s|y3uZ``i*F4Q^]pc\)%_2 re=$鳨oD޾ i^:pnRF|xblzLM0Z\Dkw1T_> J-Rc05"ٽς#⢭NNJdS`k,,03΁;9K>XN2q"Kx9!Z߾+h;O 2]=:p>MtIA~W~I鄹3b pC@/MRu?siZ~;l_U&\rcT 'UV-ġ76K'-ta$'ŬǙE;GW[DsOyф&.āfجh3 ވ;45d`\aBT0BU> HUnEe8v}pdדt{\ojSAbEHS ;!e&R%?hG1{,7]8E  ]䷪җÀ9ws`4NU׼D OU:_Q[ȂLK%|SQ)۝g`bX"5ۛ\exKHX3-ޭ#_W"Hk *" o-P$)BE5ܽENZ]x gſG+Råv]R[ĸgPb}f1ROPAj=l *](QۓMF`8mCS0:'bR(õֈt*oOc:b)gZi-)#0v!?1+.=dW0/V}>Z~`?O˷ݺB7 U_5`n oX7Iw-Pq?8ׂ|Sg>V_}s^ .)?8xrNUm izVEe% 3bv\d25TfHX, OB`Se3Gv gdf薏[6g&鼡mA$boX=<č)GOБ"- 3$w갤/|i|77F iU;;AupUU?aON\'l4+޿Y]LJRy%]ʖm=|Kazs،dIWF| Of΋_`9G*m=Y&LBORgH6tUV|JRpЧ2?;P+pʌhU>|P˚tFޤ:6&UI@σ;CQWNm0 Ԟv&z=: g!3I@Jh[:()fpՄYLM+[qµ Yz؃Fdёc S/.!45 ʢ;S#3M-]*k߻%'Ɋ`rG̜߇P!Я#5& 9~sU2 S 8%4f ],Y(zwUr烊QU=5mƘ/l=,,qٖʔ?qC $O9XiZL Ƞj,bNSU_ϹwR2/W2GY֬;2LHa(>d5-}N7l:@7Z]!șMOlwb~9 l&я[~Ӧ0gY,٬ Q<FBV꺅c㰋=7VNM?_G~=p {5oD6; H4JhE,?YseЕy8!evhw/cTr¤ҏti>+!J <cFjCIwe $b^ǀrj=M >*d9j xchhb:CXJM\ ;}6u|7ż5Y+f w-}6T{J⃄F$?YB24S֒\ʂK6P ,)M'n4(3Ϙp1o%A@$(ْӅ`|ン{LM`RvT>Oȭo#81m33b̝`ŏ%t?g4JsCi6a~o*_vz8LTO|UxNѫBJPM>g1NStnvZQ3)E}enƦbuEȒ7ٸ9~0@ =O 3NHW.~O5w*lH0[>mxOBn Ã}@+N@zds}ip!RE,d\El$c.du0n Vdoy'뗃n WXn>EP :7XlxJYTKOZL ܳj5.&3t JsOt'APyȧb9+}nO헡U@ɼ5=~1%ሰD~o՚ή#9]"J/TQr&۵WjX%2R땥:F)\vyM< ƄH1ƥICC|M. `إ$DS?J+"Z]g۶7q\XmeZ]23YCi#h+8UFlH)]-!{#q/Ņk*oQƩd mrqM77se2J7d.}Ds[LUCrP_%~NEAIF[JQSz8VndTy.Sї0y_4%*brujgIHXnnzJ"'CKh#8q3ZcrtD&DʗCPL5GB ?7Ӽo `x֘img%VV*sx~F1j܃E7$%ed?jsﭢGǷ &);g`NyO $TT#X9[Kݷⱈ"X=:=S >{ )DqP_"Y@w7hmjrxAچsM뭟5r>4p#wN/I}Ί]I/TU<naCʽ_Ph6I |3rN7u[h:OF}PhygLw'x޾@2@Uu_G:) ̓uOd|]D {@5I(wBK*Ôo cvC/ ! !UY̬NN,լR^ [EXwAڼ݉ḣv~M j;WT](CBOC Љͻ F$2f̰MGRI,73_B+fv>SX|Ne2z@ 7 p/ tj%޽+x)}{+E<{$Kx(Cc |ةx$`9!<6K)c.:]vDN3u}*s[wweQimAz\N=3F/>] +ek :EP/X<-ے/ }'J6MW@>Nӄxn5 QȂ `<#K3¥mUWD99!]gz6@fi &M+CN:K 57)>Qd`5 y4dVK MX3Zg% ),X-X#Ƀcļt N8ᱍÁzD[a3,%O&R`.4Rfb# tvܭ 0,Y2m [m-,xAr)mo}H/Y"q@_Y>a %.kޚo&K%IQH >вS0sErv6H,Ŀ#A敶3 }:2|[F=xYLWɘ#gM b;<, Ķ3.GwF  ssu Y@Ir7G -~]Uޗ?Bl_,CӴy E ,Uh(]KFC쩩ଞSާ.GpL=ϯ,jI3eM BRn,cSM{E&9N@ب0m>0V[̙(fd}P(28[w{D:Wm+%J=h󐚹:S.&m9_ifƎL,=2lv^qLᅹ~>F*sMOuP^i芻K9%-Ɩ *ᬵxKcF$蘘|YC`g72ŒʲKWTUE7#r /z}snxuݪlEk]CwF Qqu=d%+ޫ5Glx$ 0w +DE pAJ8q|j €Ե( u.rub|Ss glFNj$9| m2MQt0c)#r*9]yr/,8Z+#ijS#g8z9JEs. jMnÅc!kEF7(+ ^SjY}#rq8&[kΜ׿Ȣ ̝䪄;Br4)-@V~{y,䩇1pYrC홮1<딿Q) g<΍E"2fj@_6UȢgbSH1WIwcF10? c7Cs'^o蹼,-e; ,4AㅋEIݶZqR\ghQAo\.#H'ÊR!%aJN8$\X^J`|7Uɝm?w/9W&hTSqsZ+OQxIQӸ `囶?Y#φDL׶Xq(@7/b%( sܞgSG{;ؐu` /t{l_Qx?]ֻc+QΌj16PyQ VO }7`BKʱ7ܵ-n{CxΡ+MXߏۊnL;[G~:o5h_)OQqUٷlZQ`XW;U5 52$l5WNGI+*\}u&tNIߊ(lw#ks=ꨍLx[;:C i2@q E%f[YjeDT{VBB7DU$rl2;K3X[hphyY'X1=v筐{.̲ dНUmY)jh g~\GM$Ğ*'~P(`c, UMblڽ>_Gѫ!ԭuK5<'sKXV<9j '."MF`m +6#H#N~RLJeXzXl@pe4WEMuވ̛ wo, O11':(1_lbC {l y>ޗƿ1ĽvG>&4`wbЬ8/wo+]_UsSfFXgü~g\z1ܴ[}/U$R@߫6ր=Wa=;Gh 𸴇#q!h/ˣ$NN>4  iD&nZ*H jN8_JTo;H n;qO c8@z`3 ˺nX&͒ P> F{QQXKN>.G4]ݦ3_i#5x r\6H; 3~e 0-Ҝ騩a͟m,l]5PVeȺF5G6m~ Y2 %v&Z}GC;LBqFhxI<>o?e݃֐9C:rI%p.)Qɠ<";)>9|1L\2U\'c+ _r, #u,I2l enH$y„ocּc1ƭ :֑`xW4h;1C!Lߝy OnZU4f*ZED!Ah-/"Z˘MudОvs sB=-fl0V'R!ރonQ<8tQX(RQn,B'Q.?D9-VzMC!D!-7U&ӯm޾!Rmjf塵 .fO"(8+ѕ-#HE:$q}ˠ:*HgR*`םJpܕYևlCQ;qDG}׉G|ƦYq%0"bӏHal\b{Yd\[MC6V,yЇ?U+'}ťҲ?|'[ Am-_s 6P>Ǡ]`Ha^_lS) X|ѸUJW\m+"G 6ޯjK `i>Po.Z~f[;4Mv&84]#`c8mZ'cjd%jIt4Gѡ Qeuf\:vB+Q2VP`Ή!K:9w*ٍuAA5Fsyޗ,T ̅5,}qn/VEw]\x%-]eq}ՙo Jk@d퇓̄̎.U+6dC$HQB"($o/TX+JE*,Z@/L Lt& Vɜdk)‡lzU=ޘ4$4wؗӵgm _(:c6&dmǍ 84nR 3O=ˋqCJ \'@yNKŸ';1(br?͉PE K%6Aٙ-5@a cX=%j{/# Wib;E.iy"71bvF*[3#:ےe}w\12jWUFL9bFXϴ>qvwHs^40knmoLIØYzDX׮/A ezL 5dk遞KRm {έ(3HF_ac" ][쩝P#lN&6^hoALĨT_ CyCou~kg"9/c.'.Y2jrT/=5:P>=]nY1 u14yEecf8L7"bMf!OWC-%Nd5KD& 1b~6PCE{VbY]>=d39!.sg82Qsct0EOP\}ΚϺ1[Z1ade Zs#ƬY-cm]65GY( w/HtC!7K7"S:;&3Jty꿵0U {< =ٛ2ķ̚«e7;]snZR"(jM"FV?`1 {=ڇCJ(flqPڻKƛ]?pImgu N"7;Anc }8Qa9'$H<'ʟ~P,pH}eZ*KGOQ hS5^W 6^krق쓪.I)B_ H۲WIWpC-NV]UG­<{pRnKF$y(R7rovVx:16Kwz~%p*Ł[+>("Bo׫;} #!iH!43(rOhM&sǰ:!k R\+${d1 i[w8 1?-)S7⣬:n1i" dơArhʂ|7-K+5IQ\z~i?[5 6vUX(r`>/7jSа:64"Zl"-nc³W,8wG)}ФZ7zLi^1&~E#_þ=b zJ$r`;~Ob_dfr[BcSRkA*'(ް!'{A<ЩUÖԚAmT農xV$U[jՅr?3jƃ,ѮȚ]U[hqXߐ]yBߦ_14ޅqUԹRl?~c b6sAJ8\%^vY J+^ d~N7=PM˟ {rv==Z;7}qVMC3$Ui%lf_> ,ݒn<_O J&qP?P& ^wW0LGVD롑;bU־^%1lLF25IW;T22Zw>n{z+/l#1;s#yÑ~D9ޔÁ:t.aUjU͓lNO" ;E7LB6T˩f.cC6bo*zW[vDAFL;vNx l0KR$E?xvdWgIumN8N(3g6S7@e/9nVPm\GilKa}c=dް惌!t?~nCX#҅N.1s}8K×I$Y>FȰOųe'R j u\Yx^%/5(Rٍx!68f1@*>yMѢqbV- kL8@vQz`~\scP /=IZrv>RFOB/i]4-Rvt2_U~If^z棟H'T}D3T:zc};X - [VgzP 9Eo̎S-Wj_YAiG>)fj,!P.'ǦWt\]*y*CkAxC4)?!U)}b(7Td1%:$j?R8o' M6T]f/KX7 ]0CK.t]u4Y82T੿:g$`}Rp mzgnO|۶J2 _UTTT4G`G?#uGRWzp!5L$}ވD' ǃMZo3ǹe" # C*Tw%01aXAۤ4hOc^pj+UO4\9K] ,\Vx O 8hK`=^UVuBÁ"5&?<-h?1կa3J q%YR B_:lop%A%킅AOZƿNmuWM?tN;r ;kE ".) ꆤb`FgH=}7n OԋEE>48_=*T͡J8ƹ>*SKXk9R7'98:HeS)qA@ = uMd ⱗIEf((J!LE'$QK6kdMϷqO|;>B TnG]/sSyD 9ַnS%T ,J Ԣm{_qFl˲do32̈́,+bs_lq$ &VN/P qX94yYhV]8QUŪцţ&AX\i=uêJ@ I8SS./".;{?,3KeZS\pS@atf^s>hjg7]+Յ쪕DZ^JV+"oK1: z / Dx5ޏW#uSC#H'5/gF@EJ`_RQ!h7bn}$ג63E qc_P4okFQtk' $ީqU#~BLSs˲t_ސw8(?2eэL@v֢ U/ MOU@ބ=w`U2{6PU&UY}vءoMu¨=-(apjPK =Ií]k0옂JWg3~(u&\y[{şfgc?];c^ w+`-V˚P-ř'C;t4~\+;(0qd~>W# șx'~P]P)~#_w()ƝuWM9w3 %1I=W_?,igS_RB 2-6pl=Z?xyZAhQa-mhp6OBƕwߘ(e {\#'IuuJOsO/=A%gQm)\D}jp%=?4]fvzkTufE6וtJ+&ne1b:} 4xr(bIKiOLK=wUMx q9]⎸MSd{H\ue'g/:Rȑsbk>?Ꮠh}2h'k[Y5E/wP}+;GD%.ν^)/ِ宅Y1=ba:p`QdJrU6]?OZ@NgdN3yDc h\ ME|^E/p ɅiUxmQ#JI}g?P&^uJѥ'g+1 f 9}rjkeKyDYhyOLbV CT;VMtW#UK7IdPٝ`5S scE07>ٗ;j.;oϣB3!%u. H0#D=:xF#?[]ܠzJ\ }yMJesb`vёL{Z7_8"8.EFhRӒ AhBmGy75?tR0fx5Ð̡ٕܩK |{6!yC I(ԋFJͫNyb:oMR*HWWc)_l=+d} '|ѳyӎy4T""E}\#;B,ķwݾyR&GSòqȂˤoW9U^Rs]}wzw$ K=+xt⒪AjNN&miK&>%uEW @&GVJ;%1cSG)6bku rLoPIf/"ifᒺj%SF} l[qVڽd#H 'F:,mQQj?ث(Uʫ(̯^-7C\r֪2ɔ2oS_)xv]FT#$ݸ} ~˜MtH'ƅP~5w@#O4Tx2^wp$HA76H`G7cE$zY#nG6`'8s:؇wqA:__T=f1ExzZAgR^EɶsBX6Q޲!{k.>D}ʤdsG YvlԄZ، ~Tۙ!d Nfb( Ֆt\9]#`0h,u?ME!޷Cl|aލz%O}(GQkTPMkiU)' 1qUHrKASN&Kl}fxtc_+aH,R_%Ԗ )'QQ"N?EtJnzE/vy W-p| 뢝^%ە%Ћ}&_~&I8`wyDޱxh[7>kԷMBկh_srNh$\ɛO }7kϗEh4g[.oJEB߲)?RaܑYKbںmi%aA=NĞmە sa<%{ G/õfpƝ5R}rB;8?{L⛀7JL$"F4d9I|cѯ/vókrZT(jD~.sE7TH3X K ]>#k_(k n,F]s0DF:@K`wNE:Ws߾[ێ#C\iIc @O2uױPhQ4:SrTyz=!O0q^ \#,4"Q} WM\հb{r{ ) ?e<&D8 f] n&N7F9`z2o:j UJMjVVV{S.A/]:L8'@[C.g { GnA_ܪ5d' Ҭ(˜ =<ԍH$>;Ëư^|nYȍfǎ ɽ)<ߨ[!6JiA5*ʸ"f|QN-,]nTAH[L 4 1-#GCvӐ|kkƗ3f\ bhަ$r6QǞ#dfՕ\}׬FЪ}W $j>9?G$60 ;='˽L?Adp0G o&b95hB@Q M圂aGOAWĚ|lWȩcu0sv韂L'Qm&&pv|9ۃtk лd; kPx xᐛ傈R-T v2`tt $傷$bX~GgLO~@T(%*ءߏʻ"$+A0ȯu!xAj{zxF/{`W;'ӡ܂q_ _NUPt ԓ1Xe#<(U9io?ہ;!Vy"a]]@!AM!s ա0:!x޸\mdL 53g#,yrʈO=(W1 pLQ^mةhD`im`dPSFuuc4E8FV@O^VH``t~ڲjbԢ# /ͅnG4ٍR c(_8]'N_GXjzҨ7[uIV#1R+&DZNth&ٮXFi@u( X(;/:ٮ*qCi`c&4VD 3[g܉".y ѽ'P傎c OrO>p2_@۩N7PQBkN=o1.4إ.Zc]+XWEyoZׅ ؟r|xmbow)I۝/~Z"6OwQ@-3gʕ66K$ ^G$QA?1ѱCGu3GeAGT=*F>lSiXj$hW/Y[m}& (V1jXB8\*gW<0C̶=>Rx(C"-Qe۔n wVg]K !VYh`0Q DE)}==t@]uQ,ώm* :Y5 'Vh7_i^c# z1 L$h`nf"eev Д!Y8Im(;V- J!y.owNgahm.ˡh>1b:QGf>ȕmi.!S^f ZL.zU4ԞUVKM핻C|[=ar*+Ck-;kb16bszooY*V(d>] }J&`ccߟ EpN)n>&~f|_9|bk(!0KR{诒bzYFPXq*z.k`R)"hRd0vR $1l0e[űk%5CLk4x{Iz%U+G^8{NWl^惝2/<(cԥmG6 WqXaiFP#.Is!Jf]RQK=m*#$JI׫(y9=βYU`\/p< 鶱OI-yDˌop&'~%^_ },&%+[-T&^pg$O (c̶iA20^LbSgkR,b?}*W4P}/ %t#2gHJsA-zlՉ܆qюf o^t}e2\6XN :W8c;[&+,cQ~ 3,Kg9ҿ6n.RTTަaCt<Ie" V|]o_m~ZU4죟mb6ʤ}!tB9ԝKgrnrYL '܍67^xvڵ`){ܤ<&Qb+$Α0v% mBdd% ^*azBI7xbMӾt8c!FӰ{(H 9&3Zm2;"qG 55/1ͣQ1ξ^Y;tkmom'tyucaznz髹4MEuY+?ٝwzZ8Y2UgiY4Xጫ y85ڻtx?> ok l mSE; 'b)2erE׮r <R'+ z,.mV0O>d\UdaV%{ELM~>ɱ(+T) W^ 31~dNdP-ZM]⿾-5O׈>1 ӳ! n į+ ?tJɚD/)_^Tw}a1˽;)$s/|iZZyŻnlɺ1m\#{|V> 7l}2ig S.DY*'~!ĔP}1f9øb6805v֗Ց6esI +T {S5X^I`J +gmYئwœ!]@uJhժ`n.Kb}?z0Igk"{N=D* zb( J<_֭^oFB;EGo3Gwӊv[ `C@.Q1Ѝ̲Qj^aiK iV'vt0yK9АlFƣc ߪG \\Qb87^Na:$ONml޴ܔZC.pVjbVVFHۺoT wU'KϚ͛' EH|ti2ٸΞG^{gW8atO6` JL}"o#c=/9)>.*h6"DhXW". - vV-59V0`} z8} wR1OZsP|-_ѵ1AndI: ~-k7;(L9X^Xn@p7bwkvm/U2ExSن@WkE,_EVDږyA&Q,fL铒&*O쒻/(,*cEV5 #Y#Kw/ },bjjLn|6SP.Lt#5/"2 jy!+*]O[2ڐWOixJ5(2yta gЧ'¥_۪N*&Ϯs+ ϥ4A~*h `|iP 53+.ڇK VXS,,ɘԏPɕi]>yvN3s-kjbb'uQڕENdŎPse^δ#ݯŒ,,+˲, %i7u r"GGUByIR妇?`dgjZ{@)wm p}ڈe׹9 w٪EerqYvLEq :83D qRM%pE0F抋i Y('`xQ?n48Iaܿh^@є ~@<>:sF#bf!}a֧eSdY b7O3 5;zOX@\) C/X[WaR ?Ki=Wb _c3pJTS$TAUڠnc4\^D n9=-Z421tqSrMjGAFB)pa 9 alo$B1ireMOgf)$`k֧-nQNWTҢG?G VY'\)*?&H9ೕ5^yέۚ}‚m,f%t ceqI\HMvռkm!>Q/l(Am!Ӫׅ"sUɕtjJ4:Z4Xch9'iggy\ ~@Q0ЎmK::AE}&qlWO$G)n\b3NuY 3L=|6vOgmZ3eSu/_;2@Sma_| %X~aO exj#(06/;hN`St0}z9&3yUvbzX@W7d.:Mm۱)kMHA/o݁vfV\J B)(Z$7o/3DFs%2a«8>큈zX̏HQ4OIcP,e_uO_d} LI3u\Ѕ@Hv+rxRr%Ƣo+abG 05> y3ӤP[Дksbr82: )ۨ~k=ݍ_V(BGTS/$&ShlAU޴po'Q6KՑxק/_{!|6!Zw+# 2ouuy0.Շ^'YAsxg.o#ǰ\ ^<)6d=n熗 rYԡ\ZןԆWd)_PND#>V(!d=+,6BVEޣUI59w<.[+SA C2 39cuS\س0.60d / Im9Ώ 琈kD}Wb(`[JVÍrOΊl?)[1ѤQ$ɮ*`f9/ @;b(WjifU<ޠ۲'Hod{[[m]#CadlqZQv"wMꙞζ}!ARO 4o3k3 S|n/0,#:YL R a/mHu[^X"I!!븱ѻq\`B|@E&}khN٨687Ig|+ 9|e8P ʬ! O9F׷$"h} y~ 򞋎O9+&ޯaI ohФ! U>hiTidHI8=LP\Q-W̹ E& Vǿ#U.#e`>OsHxO%@N[0M\r|PrfObU?W>sHC^*T"ncU*(;|y@:۲"o*% 8Idn/x t6k"dN d_aԷKv"ru䷞YeVŕopI78%jie3?Lͨ{J9 .]#p[zop̵PZdWUI3\K|`> ~e ![:{UCh@Yz]^5._; }xh~МpHb=qrE*ID`ƻ;Lw97enӜ56QIwlCw 5fߚ=O8n@Pb-gƾDžtS'㛒 J&\pf̩֌oS U|N/A}uPRR<5 w~` w,~{rlDT_\PUͶ6T5{4;\ɉV .kǤ_{;7P`esT(2t`PMZ&_R$}n^ң۝#KD)tw5yOȵKG+3x2>g֚fKwk4 <1Tй1 T8B|&ZX6y{sZNoݩ kf (,=SpԚXز݅+1{#l-$ђb/)kӡ+Uof*E_TwnS!t!VCslZkE!?6'S_x:/2@ UѓqOG<> 7Bd6dn@m] \WӉ0 2N:B́'?C5Y}-UF i+F_8E]tLdZ~cAL-ԷqDo֮ KH&IɆL>hW(9K7HxZȮ w7|1m#ܤm Zc^rf m'#[Aizx1cba@5ƐwP]tn,&U^wa=N5`B wp.>M?nm-eM^;L ^vj׵jQ8CVt vŘgq35n5ޑ4$fgo BҴP5Q-^< Q{z{O$J0v/O}|bܢJ&[q…2`vه}0\3 W3AJV&^/1 yϛ\Fp X܄i1fuap! ).AΊ# /a0 џ],HT&eN5WݔjCC{MHl+T!,ء[uNE}Cn[2:'6Y,;6S"ɠQM4Ʊ^yNRYͪ9i{sV>q|of6Z= m;$hԽUcx1+=Sڄv  \B(YMk4$9a'9U1JkV^Sx;^Hv_4]eeE3<ޓ^sك)Xa6ѱӎFJmKD!<ԛ\%25\4VYDvKXwk +]Z$VJymn܋|^!5-!ӓ ijJY&,1GN0/ $?YTӿ'y!qmQw-^h;k]QGڀ9rK`"HάKPNClg0 s˳ yFsksTӠqrJֺ۝$jwU\y<$s!*Z<@H%(ϲDa7U*vi)49'/✹Oέh<Khƨ5'Pv"Xy,x9=jlMTm &O&M[&nMfۇPu_AxiPﮆ!7)_֜ |#U-$B/m9Q$opq1_$PkgZ-=kH`m- @( 14B-,+Wkx/AFҸiܖ{R9l]]gqt̯W'( ψ zߢ~/068^s!'l6UKw\IDٓF5~V~cakNB7M: 0q/^lHDE"ΛP10l'e.s!| ~B 1Jbϣa6C櫸WP-:·(3ąOHS(G3%-~` @㐞s-` 'n3Fgd?V|1Vr٨κ{{5$˕MuE6CV9F&Q)0*c1)8H TP"4EECɰcڗ3r!u3KVD $2+Cd{Ҟݸf+I4>wvYQ/볒jbI.C&6zeB{q: @F9'(k5i}@Ё aj0$~P(]xKJ4iGdN*Ϛ'[=1,N,D@*h5iU_s@su/HgKRku 7ѵT}gמ 3Hc'$mv9 (Г1V@|cB"J8IEAppIW68~Ÿdv,I;O;{f5=FRn#;{z}2FFg?qoM醥ѵfj^myO D<ŌvSµ U$(2\At.T2?Ǯ|"F.YNM!~)c2׏P Z͙BaL/kcF lmh~̾ #V7w<5n*qVQz0VPRYXL{:di%eO:WaU(QG3 \pqNWW-/1g]%#9$7G!#((8>K,2ts}㳍#oOTdMEu vA@T/r+]ʢj'EC~&_ΔO_ɹd/Џ+T4pqW&UFbv*y;~v͋Dk.K&Ll9aFLX6tx%>mмS/?DT(+xFb8욑B:Sj1H&rBT^p;KX^@`&tt`ܥGI_~L/ ND<0iG+7ihM$HBu9F5` y??ӉCA;k!tCSsE*ݚzHVfpP}+q TʨCJHsJ ' |Iަg̰Ýw8$9XKPM֥y ;qYDT }$e( A3c8'=9C?\qmE"M9gGQ+'(5N7 Fs ۉHQOFNq=ǿs$p%~jGwC&,fZI?}j6<ۋ4nZ `$hVa_ kG^Sj]8=ih5Q/|ф E #uH8 JbڬHJ)Ig"ͽ$oz%$,M|Yv{|U9ȮK(㝗5Tt[Lcԙ"@9S^OnbѕD<- 'i`O{K ce1lj}YL@Wƙ"V9oZ/ŜÝdPgIxqJ;OySP;O# ]X5zfx +X37[3fTjlZijX" qqPx+̂buyұ|H$ 8bW5MB7ɰcn$/ׂ2VJ"74ƿ,14/vV^LB#a1a )cL!ȎSآA f1I"$"KpR)j2 ($[60GBgh%؏hsy X`0'"g~z/1.l ֔PĶQ孝xƵY8+5v;UCcϺ"|~q#G!CΘdobFڨCj4 *>{cl647t ,ad_򨽹{D.P(Mam "M$Uw7<@V@Z4SKG<~NڷnZw=Rcd:wY:^ɘp7!La?Oz^l\y[Z+ pط_Wb|Ӗ9:"xة;qL4şTr'Emۂ: ,qqgqg+8[7:ēąs΀1޿N{fXzgح wz@>%]:siU\Pߘq&)Bg| m+ծ=T=ٷ?%G oM )@M*\3dN;IʾLŮӥUح?قZE\󎢮ʕ{t*g3ldh~glY;]tF$]Ү˲z)ރmRR(RiZt !jPGg!ciy=j[G$ñ6L HbG[bܞ#?/!?YUJuLqb2y6P<>yWT=Q!ϝ %8r#HӨH(:Ixqcj320A6}NLy#Va[e?F,/:XK~W C Qk-~/|}Xй&W[5+' ]Nq*\:)|_"b/s$6GɍF+^a'.]F|#+F`j%SO̓kdvbQsA瑧6} Qg>Kx''T4R:̞nF+頫9Ď++ fd$i&k֢tYКƇHГ.go gpUrYM)DdEIoߦE5لb)4eؽgB2M:ncgFąSAGk&^?Fh5<\2?sdG@Y8ÉLQj$*I lpq!D)+ Z>eKe9Lxf.MDXLcw:H3 SH_RW]f㧋.yD(~ħ藣Y '3_:M>y9]٩Ei)ldl1<;FE<Y7uVM5<&xsF T* ۪z5atm 6.v%mM^ W{.&!)%W`9c!PD/p#8_9@[vK $Us)x].PݼvGOh_oN:ɉsPeJlr['x_ KܪgA=T%y_X #)~uuQ*!OUTayW H~AKHL#7{>ld=fF|gR%@!A9[~bFgPA4 cc;+aY) [t#y12+'"W*/voFo맇ך5մ,E3UȳX=<'lπEpE+S0;2Gr, M9uG?92Zl1phq˼3vBYC{̊DOrZw-pupȉ|x\]qF=3`ͧipN]=x.!dɇ7sqL<dz3J85,;H"uvR>2'NQjxY*P&+dUx33n]a@s)%G!΁4x`DIalxa^tΥ`z bmw,k2ax|Lޅfe&wI"Nj?Ë41(g1(x~ 0@e^aUBz^ Z ,SГȑ@5-@9=d_!$QUDߣ_XUwE:&{9(AJ[ҟrG^i15P7*#nH+%ʠK+V ]I.۸풻F(^zle a Lq!W *;}h& ŶaVB^`:D!skC2G \a2Nj{ w2SMayXTM#{.,wm+ l:G) V IA̒)h4EBxu zsD~wEe骦$&A~[9j3:7bE{קb)n_sn`(mt`eZ8%|-]<,zz<=Tf戊x"x 3_/E  ف]iqpzV{j+&9܉ؑa}(im7 ] q* baLgE{jإsD.ʃh Q?䳠6vSWAԘl}AW$|>a[^u`}uS E,'^J?KG. K '|1g YNㅫl0h70R(H[ lجzˠN/U?%ʴò,؜WM).$'oo53Q"QmD,Fju"bt9 DYTlY G<#=h..ʋ"*dB  'l=lPکSѰDF]J-u?S a4k ffyO}~T6—K`P"u"Y*e52$n 759 " P56,;NL C4Nчtь(jB=u: 8!BϰL=I)[bbXټϧ;w0=VJk6Z D۔+mg"V!p6l..Gn[.uQKx/YZ%F x?|蒃I<w.@ʡ! cQEЩQnE93?aJ? M/3a/n@ r\~BS}EXq)G2g~<)Z !&0߄[.eS2eVzkO0 .ЮFs"5NJNcoq̄JLKH*mdHg-LGUN=T D[|ו%o9(3W?u((]^6>u. ga"&_[Qi6 }cr6-}i6`TK pjºBShC/tظt`JyLK¡L-lIԶr` >Ts5Wք1#H+\É**͜;Tt͜CGHqzb%"UbPSY8#ځ'>jslp%MHCJȫƭቡ_vUU8OQ7bd 6&]tokRɳaY\s.oYu#V+錆Tz?+&8V*[c~_΀ҋS94OK¤@=/TiF㧨'-Ϸ8Vq [h %h s dhVcэ0l![2i#H ɍ`73}T7<_nR[_!| 4H!F\mʘ_W?6}Ls՞o+Z{ a@nWޙdY>^"m~Ҙ61ʫ ?VdR%KL6FT`4kvw q!w3EEZ{VR]רG >8C/oWv%Ũ[i{)l$L3Sq:@$^cΔҖIɷ W,mr=k\/k k>XqA54ߌnUR;:6+<^&ݱ{xW)fd̛'~ Ye@ .t 3,[Դuf%@% cSc!Ԡ\ʌkbi- oUٝҘ'=RIW~Sؠc9RgKoV~|>bɬ /եؔ1Tt+ ߔ]7Şr$[t/A+H0zHO#iH{-3b\sS2|vӄ({oOo98UI` &C";%321 cXp=!5 -ɏpr~w~1n>=|lwp9$} }+Ga P'D$ָ'U_jـ_6ߝf$]iO_1{L8.vѵp%؇@B^:s8.Jaѡ\ P./tGy|v֕MybQx tX4L(*͈JC21}kc\׼߃xZ6:lCBLU\@#+M: έAh̷ylOqE=N!A)Ŏ"셌ٱЛDxv D[ >emX%;BqòxQ=vi)dWG#?Ygnxl$2J|]oVJ`y:OԇծA)zF-m^e7 NJ!GrlG%7 FlL]G }‰f&>%xiz>uZ_HL8W!ؔl|0cccWLhE'3vq\̊?;91rxˍ|zi*n-V<}ڸ:}JtPY>u1q .&l]\"'7q9ѐKtFϼFNSGpf7 1OMu/ =IguN(#<ӏ eUS/CT~-&Ut?xIC|Pkx_ Z)aD|dK=;.K'&F +b1_I艝[hr3oQb?&7Ф"fXw&mr$wzyE9Y<zk=tiAJvm*.Jz˶%a@rB7n'Y5HLm}ПvFr=I)S~akVY1Uө'djMtQgrjy/Ƅ9Q7|# kL᫇e?Ej\UGOivťsT4vCqiLIM1*țXuryu+xwT1$P. >st)9:_qg;{T+ h%i״```hب]5gZz.B%5#ڗp+;z2V`.4". 5,#0::z CCs5Or`E &ԽZm-]Fuya$'#LjvgR!؝+yCh/e/'[>UQAZ.jdƀ\ X[ڻkE$4!xXSyN]YX%("7Cx8GⓄq//[Fzg ar 1A^#XYT H~lRr=W qx︬0VXn(u` lg̣R>`hמzMya\7_*QfOZiCseءeJ{Q)t^sőٗseD᯶O"WZ1Jy40mX:N.-IWN9XFq;W!UԪ4ؘe+b=,bF.`5xݯ\ɥ&Yr ;C^\n:QJk0"~i܌s98\ѥPBeY HuM\(mrϐ) EYf6,ixirZ'fpSu˨o<Ǝ2&S $mLk|ZۅExNKRmu\D؂4N;FFL2RM9 ,e2)#Z-NG0~1?g3BO]ZdX;d~4>i- zY&|M'vtKd&Lz!qϱ,B@o )g6WglBaȳeƴx ;;a8E/˚33r4ts)\x-ܐB٥+|x P+Ľo4n"i1/Zk 'yY]v'&UckN6ݰE/հ+^kHIʑ30pu:T7_Ü؞=[}2/D9+b! Y ә),ݑH׉= !C1Ǵ"Mnηf1IG%[ˋ)$x1ғ@w3 y-Ҩv6WAVL :p%C`5a^.Φf~UtҎހ:LTOtTv ՜W aY=MCW^>'  MLFlC3]0Y$ 4.`R twEfaVAH oTY&) NC%/PQڲ&Y=~?J" u~zs0_.7I,D28Tr2 N 8çJgIͺfwxb89H ,~ w9i~uB44F+S^ 4ơpPr;~j}IR_N6 ; Eu!vy7,miXdBmZ5>w(ՐDxf՞0CO: n;t yʪeˣQ4 -9٪L2Z؅\Yd#T/"=y*h6/>[q3vA"pdTPKZE0#4 |i0{Nmj X5CrcDyUF]U'iP0i>DakиM>'4!C"9tECM0Y5Bc:`bm<⿰,db<0Tf=v G/AdBdFnLfnt) x3eoIdg&goF9wC`O6{Y#qo2/ndw(TP X"vv&8b2 .;_%ɹ&'d;yH/|wTkCv=pc'Ѓ༈zy$G#ơ#^)/z-[Gv2)!##yA%2K8F!c_Ba8M*Lmi7CN)Ӽ|aBYc2B_#9FҶqU-G'D[ƟƮ;2fD`;e!yy@gDwQ~,.)i[W՛Q-Dyc0*[\/qlK4,nf5>R"=ut%1ܕ=h  ߀6Zſ`)&J 45%UO^ћyc8zySW&93=GZ"lg9 BTQHy11)G?Jؓ3T+H`JlZ~X*})~A_U6\ SDz"dZ׏35樣5ݽ:`jʍ.6!S'XUXzlnZMr7FBѳR/'\#Xxכyb d*)]QDv| Ԣ;"'bBxY)hs dvN-[겪ydm κ_صp]p4 I3h<'L >K+=qs.Z} C>7꘺&֏1NzU`ÂqS"I\ԜUԺ