From ec1fb0423dbc0ee64f06e419657e62e4475fe2e9 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 13 Feb 2015 22:46:18 +0100 Subject: [ticket/10748] Split postgres DB tools into it's own class PHPBB3-10748 --- phpBB/phpbb/db/tools/factory.php | 4 + phpBB/phpbb/db/tools/mssql.php | 40 +-- phpBB/phpbb/db/tools/postgres.php | 613 ++++++++++++++++++++++++++++++++++++++ phpBB/phpbb/db/tools/tools.php | 257 ---------------- 4 files changed, 637 insertions(+), 277 deletions(-) create mode 100644 phpBB/phpbb/db/tools/postgres.php diff --git a/phpBB/phpbb/db/tools/factory.php b/phpBB/phpbb/db/tools/factory.php index 24e2a4d875..d204451a63 100644 --- a/phpBB/phpbb/db/tools/factory.php +++ b/phpBB/phpbb/db/tools/factory.php @@ -29,6 +29,10 @@ class factory { return new \phpbb\db\tools\mssql($db_driver, $return_statements); } + else if ($db_driver instanceof \phpbb\db\driver\postgres) + { + return new \phpbb\db\tools\postgres($db_driver, $return_statements); + } else if ($db_driver instanceof \phpbb\db\driver\driver_interface) { return new \phpbb\db\tools\tools($db_driver, $return_statements); diff --git a/phpBB/phpbb/db/tools/mssql.php b/phpBB/phpbb/db/tools/mssql.php index 3a7ac6185d..6e58171040 100644 --- a/phpBB/phpbb/db/tools/mssql.php +++ b/phpBB/phpbb/db/tools/mssql.php @@ -1,35 +1,35 @@ -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited + * @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\tools; /** -* Database Tools for handling cross-db actions such as altering columns, etc. -* Currently not supported is returning SQL for creating tables. -*/ + * Database Tools for handling cross-db actions such as altering columns, etc. + * Currently not supported is returning SQL for creating tables. + */ class mssql extends tools { /** - * Is the used MS SQL Server a SQL Server 2000? - * @var bool - */ + * Is the used MS SQL Server a SQL Server 2000? + * @var bool + */ protected $is_sql_server_2000; /** - * Get the column types for every database we support - * - * @return array - */ + * Get the column types for mssql based databases + * + * @return array + */ public static function get_dbms_type_map() { return array( diff --git a/phpBB/phpbb/db/tools/postgres.php b/phpBB/phpbb/db/tools/postgres.php new file mode 100644 index 0000000000..8b61625c3c --- /dev/null +++ b/phpBB/phpbb/db/tools/postgres.php @@ -0,0 +1,613 @@ + + * @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\tools; + +/** + * Database Tools for handling cross-db actions such as altering columns, etc. + * Currently not supported is returning SQL for creating tables. + */ +class postgres extends tools +{ + /** + * Get the column types for postgres only + * + * @return array + */ + public static function get_dbms_type_map() + { + return array( + 'postgres' => array( + 'INT:' => 'INT4', + 'BINT' => 'INT8', + 'UINT' => 'INT4', // unsigned + 'UINT:' => 'INT4', // unsigned + 'USINT' => 'INT2', // unsigned + 'BOOL' => 'INT2', // unsigned + 'TINT:' => 'INT2', + 'VCHAR' => 'varchar(255)', + 'VCHAR:' => 'varchar(%d)', + 'CHAR:' => 'char(%d)', + 'XSTEXT' => 'varchar(1000)', + 'STEXT' => 'varchar(3000)', + 'TEXT' => 'varchar(8000)', + 'MTEXT' => 'TEXT', + 'XSTEXT_UNI'=> 'varchar(100)', + 'STEXT_UNI' => 'varchar(255)', + 'TEXT_UNI' => 'varchar(4000)', + 'MTEXT_UNI' => 'TEXT', + 'TIMESTAMP' => 'INT4', // unsigned + 'DECIMAL' => 'decimal(5,2)', + 'DECIMAL:' => 'decimal(%d,2)', + 'PDECIMAL' => 'decimal(6,3)', + 'PDECIMAL:' => 'decimal(%d,3)', + 'VCHAR_UNI' => 'varchar(255)', + 'VCHAR_UNI:'=> 'varchar(%d)', + 'VCHAR_CI' => 'varchar_ci', + 'VARBINARY' => 'bytea', + ), + ); + } + + /** + * Constructor. Set DB Object and set {@link $return_statements return_statements}. + * + * @param \phpbb\db\driver\driver_interface $db Database connection + * @param bool $return_statements True if only statements should be returned and no SQL being executed + */ + public function __construct(\phpbb\db\driver\driver_interface $db, $return_statements = false) + { + parent::__construct($db, $return_statements); + + // Determine mapping database type + $this->sql_layer = 'postgres'; + + $this->dbms_type_map = self::get_dbms_type_map(); + } + + /** + * {@inheritDoc} + */ + function sql_list_tables() + { + $sql = 'SELECT relname + FROM pg_stat_user_tables'; + $result = $this->db->sql_query($sql); + + $tables = array(); + while ($row = $this->db->sql_fetchrow($result)) + { + $name = current($row); + $tables[$name] = $name; + } + $this->db->sql_freeresult($result); + + return $tables; + } + + /** + * {@inheritDoc} + */ + function sql_create_table($table_name, $table_data) + { + // holds the DDL for a column + $columns = $statements = array(); + + if ($this->sql_table_exists($table_name)) + { + return $this->_sql_run_sql($statements); + } + + // Begin transaction + $statements[] = 'begin'; + + // Determine if we have created a PRIMARY KEY in the earliest + $primary_key_gen = false; + + // Determine if the table requires a sequence + $create_sequence = false; + + // Begin table sql statement + $table_sql = 'CREATE TABLE ' . $table_name . ' (' . "\n"; + + // Iterate through the columns to create a table + foreach ($table_data['COLUMNS'] as $column_name => $column_data) + { + // here lies an array, filled with information compiled on the column's data + $prepared_column = $this->sql_prepare_column_data($table_name, $column_name, $column_data); + + if (isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'] && strlen($column_name) > 26) // "${column_name}_gen" + { + trigger_error("Index name '${column_name}_gen' on table '$table_name' is too long. The maximum auto increment column length is 26 characters.", E_USER_ERROR); + } + + // here we add the definition of the new column to the list of columns + $columns[] = "\t {$column_name} " . $prepared_column['column_type_sql']; + + // see if we have found a primary key set due to a column definition if we have found it, we can stop looking + if (!$primary_key_gen) + { + $primary_key_gen = isset($prepared_column['primary_key_set']) && $prepared_column['primary_key_set']; + } + + // create sequence DDL based off of the existance of auto incrementing columns + if (!$create_sequence && isset($prepared_column['auto_increment']) && $prepared_column['auto_increment']) + { + $create_sequence = $column_name; + } + } + + // this makes up all the columns in the create table statement + $table_sql .= implode(",\n", $columns); + + // we have yet to create a primary key for this table, + // this means that we can add the one we really wanted instead + if (!$primary_key_gen) + { + // Write primary key + if (isset($table_data['PRIMARY_KEY'])) + { + if (!is_array($table_data['PRIMARY_KEY'])) + { + $table_data['PRIMARY_KEY'] = array($table_data['PRIMARY_KEY']); + } + + $table_sql .= ",\n\t PRIMARY KEY (" . implode(', ', $table_data['PRIMARY_KEY']) . ')'; + } + } + + // do we need to add a sequence for auto incrementing columns? + if ($create_sequence) + { + $statements[] = "CREATE SEQUENCE {$table_name}_seq;"; + } + + // close the table + $table_sql .= "\n);"; + $statements[] = $table_sql; + + // Write Keys + if (isset($table_data['KEYS'])) + { + foreach ($table_data['KEYS'] as $key_name => $key_data) + { + if (!is_array($key_data[1])) + { + $key_data[1] = array($key_data[1]); + } + + $old_return_statements = $this->return_statements; + $this->return_statements = true; + + $key_stmts = ($key_data[0] == 'UNIQUE') ? $this->sql_create_unique_index($table_name, $key_name, $key_data[1]) : $this->sql_create_index($table_name, $key_name, $key_data[1]); + + foreach ($key_stmts as $key_stmt) + { + $statements[] = $key_stmt; + } + + $this->return_statements = $old_return_statements; + } + } + + // Commit Transaction + $statements[] = 'commit'; + + return $this->_sql_run_sql($statements); + } + + /** + * {@inheritDoc} + */ + function sql_list_columns($table_name) + { + $columns = array(); + + $sql = "SELECT a.attname + FROM pg_class c, pg_attribute a + WHERE c.relname = '{$table_name}' + AND a.attnum > 0 + AND a.attrelid = c.oid"; + $result = $this->db->sql_query($sql); + + while ($row = $this->db->sql_fetchrow($result)) + { + $column = strtolower(current($row)); + $columns[$column] = $column; + } + $this->db->sql_freeresult($result); + + return $columns; + } + + /** + * {@inheritDoc} + */ + function sql_index_exists($table_name, $index_name) + { + $sql = "SELECT ic.relname as index_name + FROM pg_class bc, pg_class ic, pg_index i + WHERE (bc.oid = i.indrelid) + AND (ic.oid = i.indexrelid) + AND (bc.relname = '" . $table_name . "') + AND (i.indisunique != 't') + AND (i.indisprimary != 't')"; + $result = $this->db->sql_query($sql); + + while ($row = $this->db->sql_fetchrow($result)) + { + // This DBMS prefixes index names with the table name + $row['index_name'] = $this->strip_table_name_from_index_name($table_name, $row['index_name']); + + if (strtolower($row['index_name']) == strtolower($index_name)) + { + $this->db->sql_freeresult($result); + return true; + } + } + $this->db->sql_freeresult($result); + + return false; + } + + /** + * {@inheritDoc} + */ + function sql_unique_index_exists($table_name, $index_name) + { + $sql = "SELECT ic.relname as index_name, i.indisunique + FROM pg_class bc, pg_class ic, pg_index i + WHERE (bc.oid = i.indrelid) + AND (ic.oid = i.indexrelid) + AND (bc.relname = '" . $table_name . "') + AND (i.indisprimary != 't')"; + $result = $this->db->sql_query($sql); + + while ($row = $this->db->sql_fetchrow($result)) + { + if ($row['indisunique'] != 't') + { + continue; + } + + // This DBMS prefixes index names with the table name + $row['index_name'] = $this->strip_table_name_from_index_name($table_name, $row['index_name']); + + if (strtolower($row['index_name']) == strtolower($index_name)) + { + $this->db->sql_freeresult($result); + return true; + } + } + $this->db->sql_freeresult($result); + + return false; + } + + /** + * Function to prepare some column information for better usage + * @access private + */ + function sql_prepare_column_data($table_name, $column_name, $column_data) + { + if (strlen($column_name) > 30) + { + trigger_error("Column name '$column_name' on table '$table_name' is too long. The maximum is 30 characters.", E_USER_ERROR); + } + + // Get type + list($column_type, $orig_column_type) = $this->get_column_type($column_data[0]); + + // Adjust default value if db-dependent specified + if (is_array($column_data[1])) + { + $column_data[1] = (isset($column_data[1][$this->sql_layer])) ? $column_data[1][$this->sql_layer] : $column_data[1]['default']; + } + + $sql = " {$column_type} "; + + $return_array = array( + 'column_type' => $column_type, + 'auto_increment' => false, + ); + + if (isset($column_data[2]) && $column_data[2] == 'auto_increment') + { + $default_val = "nextval('{$table_name}_seq')"; + $return_array['auto_increment'] = true; + } + else if (!is_null($column_data[1])) + { + $default_val = "'" . $column_data[1] . "'"; + $return_array['null'] = 'NOT NULL'; + $sql .= 'NOT NULL '; + } + else + { + // Integers need to have 0 instead of empty string as default + if (strpos($column_type, 'INT') === 0) + { + $default_val = '0'; + } + else + { + $default_val = "'" . $column_data[1] . "'"; + } + $return_array['null'] = 'NULL'; + $sql .= 'NULL '; + } + + $return_array['default'] = $default_val; + + $sql .= "DEFAULT {$default_val}"; + + // Unsigned? Then add a CHECK contraint + if (in_array($orig_column_type, $this->unsigned_types)) + { + $return_array['constraint'] = "CHECK ({$column_name} >= 0)"; + $sql .= " CHECK ({$column_name} >= 0)"; + } + + $return_array['column_type_sql'] = $sql; + + return $return_array; + } + + /** + * {@inheritDoc} + */ + function sql_column_add($table_name, $column_name, $column_data, $inline = false) + { + $column_data = $this->sql_prepare_column_data($table_name, $column_name, $column_data); + $statements = array(); + + // Does not support AFTER, only through temporary table + if (version_compare($this->db->sql_server_info(true), '8.0', '>=')) + { + $statements[] = 'ALTER TABLE ' . $table_name . ' ADD COLUMN "' . $column_name . '" ' . $column_data['column_type_sql']; + } + else + { + // old versions cannot add columns with default and null information + $statements[] = 'ALTER TABLE ' . $table_name . ' ADD COLUMN "' . $column_name . '" ' . $column_data['column_type'] . ' ' . $column_data['constraint']; + + if (isset($column_data['null'])) + { + if ($column_data['null'] == 'NOT NULL') + { + $statements[] = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN ' . $column_name . ' SET NOT NULL'; + } + } + + if (isset($column_data['default'])) + { + $statements[] = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN ' . $column_name . ' SET DEFAULT ' . $column_data['default']; + } + } + + return $this->_sql_run_sql($statements); + } + + /** + * {@inheritDoc} + */ + function sql_column_remove($table_name, $column_name, $inline = false) + { + $statements = array(); + + $statements[] = 'ALTER TABLE ' . $table_name . ' DROP COLUMN "' . $column_name . '"'; + + return $this->_sql_run_sql($statements); + } + + /** + * {@inheritDoc} + */ + function sql_index_drop($table_name, $index_name) + { + $statements = array(); + + $statements[] = 'DROP INDEX ' . $table_name . '_' . $index_name; + + return $this->_sql_run_sql($statements); + } + + /** + * {@inheritDoc} + */ + function sql_table_drop($table_name) + { + $statements = array(); + + if (!$this->sql_table_exists($table_name)) + { + return $this->_sql_run_sql($statements); + } + + // the most basic operation, get rid of the table + $statements[] = 'DROP TABLE ' . $table_name; + + // PGSQL does not "tightly" bind sequences and tables, we must guess... + $sql = "SELECT relname + FROM pg_class + WHERE relkind = 'S' + AND relname = '{$table_name}_seq'"; + $result = $this->db->sql_query($sql); + + // We don't even care about storing the results. We already know the answer if we get rows back. + if ($this->db->sql_fetchrow($result)) + { + $statements[] = "DROP SEQUENCE {$table_name}_seq;\n"; + } + $this->db->sql_freeresult($result); + + return $this->_sql_run_sql($statements); + } + + /** + * {@inheritDoc} + */ + function sql_create_primary_key($table_name, $column, $inline = false) + { + $statements = array(); + + $statements[] = 'ALTER TABLE ' . $table_name . ' ADD PRIMARY KEY (' . implode(', ', $column) . ')'; + + return $this->_sql_run_sql($statements); + } + + /** + * {@inheritDoc} + */ + function sql_create_unique_index($table_name, $index_name, $column) + { + $statements = array(); + + $this->check_index_name_length($table_name, $index_name); + + $statements[] = 'CREATE UNIQUE INDEX ' . $table_name . '_' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')'; + + return $this->_sql_run_sql($statements); + } + + /** + * {@inheritDoc} + */ + function sql_create_index($table_name, $index_name, $column) + { + $statements = array(); + + $this->check_index_name_length($table_name, $index_name); + + // remove index length + $column = preg_replace('#:.*$#', '', $column); + + $statements[] = 'CREATE INDEX ' . $table_name . '_' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')'; + + return $this->_sql_run_sql($statements); + } + + + /** + * {@inheritDoc} + */ + function sql_list_index($table_name) + { + $index_array = array(); + + $sql = "SELECT ic.relname as index_name + FROM pg_class bc, pg_class ic, pg_index i + WHERE (bc.oid = i.indrelid) + AND (ic.oid = i.indexrelid) + AND (bc.relname = '" . $table_name . "') + AND (i.indisunique != 't') + AND (i.indisprimary != 't')"; + $result = $this->db->sql_query($sql); + + while ($row = $this->db->sql_fetchrow($result)) + { + $row['index_name'] = $this->strip_table_name_from_index_name($table_name, $row['index_name']); + + $index_array[] = $row['index_name']; + } + $this->db->sql_freeresult($result); + + return array_map('strtolower', $index_array); + } + + /** + * {@inheritDoc} + */ + function sql_column_change($table_name, $column_name, $column_data, $inline = false) + { + $column_data = $this->sql_prepare_column_data($table_name, $column_name, $column_data); + $statements = array(); + + $sql = 'ALTER TABLE ' . $table_name . ' '; + + $sql_array = array(); + $sql_array[] = 'ALTER COLUMN ' . $column_name . ' TYPE ' . $column_data['column_type']; + + if (isset($column_data['null'])) + { + if ($column_data['null'] == 'NOT NULL') + { + $sql_array[] = 'ALTER COLUMN ' . $column_name . ' SET NOT NULL'; + } + else if ($column_data['null'] == 'NULL') + { + $sql_array[] = 'ALTER COLUMN ' . $column_name . ' DROP NOT NULL'; + } + } + + if (isset($column_data['default'])) + { + $sql_array[] = 'ALTER COLUMN ' . $column_name . ' SET DEFAULT ' . $column_data['default']; + } + + // we don't want to double up on constraints if we change different number data types + if (isset($column_data['constraint'])) + { + $constraint_sql = "SELECT consrc as constraint_data + FROM pg_constraint, pg_class bc + WHERE conrelid = bc.oid + AND bc.relname = '{$table_name}' + AND NOT EXISTS ( + SELECT * + FROM pg_constraint as c, pg_inherits as i + WHERE i.inhrelid = pg_constraint.conrelid + AND c.conname = pg_constraint.conname + AND c.consrc = pg_constraint.consrc + AND c.conrelid = i.inhparent + )"; + + $constraint_exists = false; + + $result = $this->db->sql_query($constraint_sql); + while ($row = $this->db->sql_fetchrow($result)) + { + if (trim($row['constraint_data']) == trim($column_data['constraint'])) + { + $constraint_exists = true; + break; + } + } + $this->db->sql_freeresult($result); + + if (!$constraint_exists) + { + $sql_array[] = 'ADD ' . $column_data['constraint']; + } + } + + $sql .= implode(', ', $sql_array); + + $statements[] = $sql; + + return $this->_sql_run_sql($statements); + } + + /** + * Get a list with existing indexes for the column + * + * @param string $table_name + * @param string $column_name + * @param bool $unique Should we get unique indexes or normal ones + * @return array Array with Index name => columns + */ + public function get_existing_indexes($table_name, $column_name, $unique = false) + { + // Not supported + throw new \Exception('DBMS is not supported'); + } +} diff --git a/phpBB/phpbb/db/tools/tools.php b/phpBB/phpbb/db/tools/tools.php index d2bad21a3a..0d1eb63c47 100644 --- a/phpBB/phpbb/db/tools/tools.php +++ b/phpBB/phpbb/db/tools/tools.php @@ -192,36 +192,6 @@ class tools implements tools_interface 'VCHAR_CI' => 'VARCHAR(255)', 'VARBINARY' => 'BLOB', ), - - 'postgres' => array( - 'INT:' => 'INT4', - 'BINT' => 'INT8', - 'UINT' => 'INT4', // unsigned - 'UINT:' => 'INT4', // unsigned - 'USINT' => 'INT2', // unsigned - 'BOOL' => 'INT2', // unsigned - 'TINT:' => 'INT2', - 'VCHAR' => 'varchar(255)', - 'VCHAR:' => 'varchar(%d)', - 'CHAR:' => 'char(%d)', - 'XSTEXT' => 'varchar(1000)', - 'STEXT' => 'varchar(3000)', - 'TEXT' => 'varchar(8000)', - 'MTEXT' => 'TEXT', - 'XSTEXT_UNI'=> 'varchar(100)', - 'STEXT_UNI' => 'varchar(255)', - 'TEXT_UNI' => 'varchar(4000)', - 'MTEXT_UNI' => 'TEXT', - 'TIMESTAMP' => 'INT4', // unsigned - 'DECIMAL' => 'decimal(5,2)', - 'DECIMAL:' => 'decimal(%d,2)', - 'PDECIMAL' => 'decimal(6,3)', - 'PDECIMAL:' => 'decimal(%d,3)', - 'VCHAR_UNI' => 'varchar(255)', - 'VCHAR_UNI:'=> 'varchar(%d)', - 'VCHAR_CI' => 'varchar_ci', - 'VARBINARY' => 'bytea', - ), ); } @@ -315,11 +285,6 @@ class tools implements tools_interface AND name <> "sqlite_sequence"'; break; - case 'postgres': - $sql = 'SELECT relname - FROM pg_stat_user_tables'; - break; - case 'oracle': $sql = 'SELECT table_name FROM USER_TABLES'; @@ -428,7 +393,6 @@ class tools implements tools_interface { case 'mysql_40': case 'mysql_41': - case 'postgres': case 'sqlite': case 'sqlite3': $table_sql .= ",\n\t PRIMARY KEY (" . implode(', ', $table_data['PRIMARY_KEY']) . ')'; @@ -457,17 +421,6 @@ class tools implements tools_interface $statements[] = $table_sql; break; - case 'postgres': - // do we need to add a sequence for auto incrementing columns? - if ($create_sequence) - { - $statements[] = "CREATE SEQUENCE {$table_name}_seq;"; - } - - $table_sql .= "\n);"; - $statements[] = $table_sql; - break; - case 'oracle': $table_sql .= "\n)"; $statements[] = $table_sql; @@ -920,16 +873,6 @@ class tools implements tools_interface $sql = "SHOW COLUMNS FROM $table_name"; break; - // PostgreSQL has a way of doing this in a much simpler way but would - // not allow us to support all versions of PostgreSQL - case 'postgres': - $sql = "SELECT a.attname - FROM pg_class c, pg_attribute a - WHERE c.relname = '{$table_name}' - AND a.attnum > 0 - AND a.attrelid = c.oid"; - break; - case 'oracle': $sql = "SELECT column_name FROM user_tab_columns @@ -1003,17 +946,6 @@ class tools implements tools_interface { switch ($this->sql_layer) { - case 'postgres': - $sql = "SELECT ic.relname as index_name - FROM pg_class bc, pg_class ic, pg_index i - WHERE (bc.oid = i.indrelid) - AND (ic.oid = i.indexrelid) - AND (bc.relname = '" . $table_name . "') - AND (i.indisunique != 't') - AND (i.indisprimary != 't')"; - $col = 'index_name'; - break; - case 'mysql_40': case 'mysql_41': $sql = 'SHOW KEYS @@ -1049,7 +981,6 @@ class tools implements tools_interface switch ($this->sql_layer) { case 'oracle': - case 'postgres': case 'sqlite': case 'sqlite3': $row[$col] = substr($row[$col], strlen($table_name) + 1); @@ -1074,16 +1005,6 @@ class tools implements tools_interface { switch ($this->sql_layer) { - case 'postgres': - $sql = "SELECT ic.relname as index_name, i.indisunique - FROM pg_class bc, pg_class ic, pg_index i - WHERE (bc.oid = i.indrelid) - AND (ic.oid = i.indexrelid) - AND (bc.relname = '" . $table_name . "') - AND (i.indisprimary != 't')"; - $col = 'index_name'; - break; - case 'mysql_40': case 'mysql_41': $sql = 'SHOW KEYS @@ -1120,11 +1041,6 @@ class tools implements tools_interface continue; } - if ($this->sql_layer == 'postgres' && $row['indisunique'] != 't') - { - continue; - } - // These DBMS prefix index name with the table name switch ($this->sql_layer) { @@ -1140,7 +1056,6 @@ class tools implements tools_interface } break; - case 'postgres': case 'sqlite': case 'sqlite3': $row[$col] = substr($row[$col], strlen($table_name) + 1); @@ -1268,51 +1183,6 @@ class tools implements tools_interface break; - case 'postgres': - $return_array['column_type'] = $column_type; - - $sql .= " {$column_type} "; - - $return_array['auto_increment'] = false; - if (isset($column_data[2]) && $column_data[2] == 'auto_increment') - { - $default_val = "nextval('{$table_name}_seq')"; - $return_array['auto_increment'] = true; - } - else if (!is_null($column_data[1])) - { - $default_val = "'" . $column_data[1] . "'"; - $return_array['null'] = 'NOT NULL'; - $sql .= 'NOT NULL '; - } - else - { - // Integers need to have 0 instead of empty string as default - if (strpos($column_type, 'INT') === 0) - { - $default_val = '0'; - } - else - { - $default_val = "'" . $column_data[1] . "'"; - } - $return_array['null'] = 'NULL'; - $sql .= 'NULL '; - } - - $return_array['default'] = $default_val; - - $sql .= "DEFAULT {$default_val}"; - - // Unsigned? Then add a CHECK contraint - if (in_array($orig_column_type, $this->unsigned_types)) - { - $return_array['constraint'] = "CHECK ({$column_name} >= 0)"; - $sql .= " CHECK ({$column_name} >= 0)"; - } - - break; - case 'sqlite': case 'sqlite3': $return_array['primary_key_set'] = false; @@ -1426,33 +1296,6 @@ class tools implements tools_interface $statements[] = 'ALTER TABLE ' . $table_name . ' ADD ' . $column_name . ' ' . $column_data['column_type_sql']; break; - case 'postgres': - // Does not support AFTER, only through temporary table - if (version_compare($this->db->sql_server_info(true), '8.0', '>=')) - { - $statements[] = 'ALTER TABLE ' . $table_name . ' ADD COLUMN "' . $column_name . '" ' . $column_data['column_type_sql']; - } - else - { - // old versions cannot add columns with default and null information - $statements[] = 'ALTER TABLE ' . $table_name . ' ADD COLUMN "' . $column_name . '" ' . $column_data['column_type'] . ' ' . $column_data['constraint']; - - if (isset($column_data['null'])) - { - if ($column_data['null'] == 'NOT NULL') - { - $statements[] = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN ' . $column_name . ' SET NOT NULL'; - } - } - - if (isset($column_data['default'])) - { - $statements[] = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN ' . $column_name . ' SET DEFAULT ' . $column_data['default']; - } - } - - break; - case 'sqlite': if ($inline && $this->return_statements) { @@ -1535,10 +1378,6 @@ class tools implements tools_interface $statements[] = 'ALTER TABLE ' . $table_name . ' DROP COLUMN ' . $column_name; break; - case 'postgres': - $statements[] = 'ALTER TABLE ' . $table_name . ' DROP COLUMN "' . $column_name . '"'; - break; - case 'sqlite': case 'sqlite3': @@ -1616,7 +1455,6 @@ class tools implements tools_interface break; case 'oracle': - case 'postgres': case 'sqlite': case 'sqlite3': $statements[] = 'DROP INDEX ' . $table_name . '_' . $index_name; @@ -1658,22 +1496,6 @@ class tools implements tools_interface } $this->db->sql_freeresult($result); break; - - case 'postgres': - // PGSQL does not "tightly" bind sequences and tables, we must guess... - $sql = "SELECT relname - FROM pg_class - WHERE relkind = 'S' - AND relname = '{$table_name}_seq'"; - $result = $this->db->sql_query($sql); - - // We don't even care about storing the results. We already know the answer if we get rows back. - if ($this->db->sql_fetchrow($result)) - { - $statements[] = "DROP SEQUENCE {$table_name}_seq;\n"; - } - $this->db->sql_freeresult($result); - break; } return $this->_sql_run_sql($statements); @@ -1688,7 +1510,6 @@ class tools implements tools_interface switch ($this->sql_layer) { - case 'postgres': case 'mysql_40': case 'mysql_41': $statements[] = 'ALTER TABLE ' . $table_name . ' ADD PRIMARY KEY (' . implode(', ', $column) . ')'; @@ -1764,7 +1585,6 @@ class tools implements tools_interface switch ($this->sql_layer) { - case 'postgres': case 'oracle': case 'sqlite': case 'sqlite3': @@ -1797,7 +1617,6 @@ class tools implements tools_interface switch ($this->sql_layer) { - case 'postgres': case 'oracle': case 'sqlite': case 'sqlite3': @@ -1848,17 +1667,6 @@ class tools implements tools_interface switch ($this->sql_layer) { - case 'postgres': - $sql = "SELECT ic.relname as index_name - FROM pg_class bc, pg_class ic, pg_index i - WHERE (bc.oid = i.indrelid) - AND (ic.oid = i.indexrelid) - AND (bc.relname = '" . $table_name . "') - AND (i.indisunique != 't') - AND (i.indisprimary != 't')"; - $col = 'index_name'; - break; - case 'mysql_40': case 'mysql_41': $sql = 'SHOW KEYS @@ -1893,7 +1701,6 @@ class tools implements tools_interface switch ($this->sql_layer) { case 'oracle': - case 'postgres': case 'sqlite': case 'sqlite3': $row[$col] = substr($row[$col], strlen($table_name) + 1); @@ -2001,69 +1808,6 @@ class tools implements tools_interface $this->return_statements = $old_return_statements; break; - case 'postgres': - $sql = 'ALTER TABLE ' . $table_name . ' '; - - $sql_array = array(); - $sql_array[] = 'ALTER COLUMN ' . $column_name . ' TYPE ' . $column_data['column_type']; - - if (isset($column_data['null'])) - { - if ($column_data['null'] == 'NOT NULL') - { - $sql_array[] = 'ALTER COLUMN ' . $column_name . ' SET NOT NULL'; - } - else if ($column_data['null'] == 'NULL') - { - $sql_array[] = 'ALTER COLUMN ' . $column_name . ' DROP NOT NULL'; - } - } - - if (isset($column_data['default'])) - { - $sql_array[] = 'ALTER COLUMN ' . $column_name . ' SET DEFAULT ' . $column_data['default']; - } - - // we don't want to double up on constraints if we change different number data types - if (isset($column_data['constraint'])) - { - $constraint_sql = "SELECT consrc as constraint_data - FROM pg_constraint, pg_class bc - WHERE conrelid = bc.oid - AND bc.relname = '{$table_name}' - AND NOT EXISTS ( - SELECT * - FROM pg_constraint as c, pg_inherits as i - WHERE i.inhrelid = pg_constraint.conrelid - AND c.conname = pg_constraint.conname - AND c.consrc = pg_constraint.consrc - AND c.conrelid = i.inhparent - )"; - - $constraint_exists = false; - - $result = $this->db->sql_query($constraint_sql); - while ($row = $this->db->sql_fetchrow($result)) - { - if (trim($row['constraint_data']) == trim($column_data['constraint'])) - { - $constraint_exists = true; - break; - } - } - $this->db->sql_freeresult($result); - - if (!$constraint_exists) - { - $sql_array[] = 'ADD ' . $column_data['constraint']; - } - } - - $sql .= implode(', ', $sql_array); - - $statements[] = $sql; - break; - case 'sqlite': case 'sqlite3': @@ -2145,7 +1889,6 @@ class tools implements tools_interface { case 'mysql_40': case 'mysql_41': - case 'postgres': case 'sqlite': case 'sqlite3': // Not supported -- cgit v1.2.1 `:ԉa#JJe=nP>Up7t}R P{nGtMon*椮G]WS<{Vo&X4aHGТ& g)Sz!s "P~njSMb? RR+@ .%&BP8peLgk9f3dcA ~^uQ>a"#ʸgcnAK$#"eVMVIyҙEBs]mjrw'/.gMs~g6_F껔Hk&3j]7/"nٚ>&sGUcwChxFbH v'2[gC]J`,( oӝF$pspչnbA]"vQ=#YDPBcуYx[ 4ܕ@?iz{t>6KIOzz2oø2y4F@)װ8g h}~Wʋi̐í6cen`ylai)(3Ib=t݉pqXil9Bq8%P|V ;l-{iM mȇxi)Axo%1 Gnڜjب>sm$㢎(ҟ=HMO0X:h{R%z@Pz?.wU͒ O т8x_ 9}_1ˁES#0TJSNA t:$/x7a q&I`GҖZk߰'ߨ }|[@.ObDuJWW_ cmӮR+dET<{`9`pmRy5bPwfQgil 8Pt 6e<-n/ \ng½o mֽACEiFgbBPFZ*/|K_\ YJ9-uf.uRF("Q,BO*2u]gLwVM?ʂ,$ ^V(`XKFsmx|% K =M3U3%DҔ}~'5s1%oeeRgT9s2F&􍋖c?n,^6{n!mCpRF Qz18pPW?N. YiNty{h#қ,(EUjr>'"mqr}Mm3{0DwL'E8^8KDF.} Aqz}ex]yLT49'uP' OBbkdntFv4+}3z,l['R &%D߭˒A Phn~kFO$|wAd Cp)Kngx}f V=D X3Y l$κ隲Vl|ιI`Xk(M,0:7 s(L\zu|mC"l̒cit_Ȟq\mA&i "-\''¢7- ;nbn943$-|cmf Ve7SK10㷵Z_OSc(.(,I Hm zPZ0v$JT U#nϙ!FN,;wcߞ)TT0[ u3lFYPʁ6σVOb<>I",=e7/vbJ'7 !H]Xg}X0['ʅo%4d}e?LUYJT ·6:X.52j.$Za&fFOVȲ)r'\twVPa8!1K"F+ f AKg+Nᎍq"w-GġN}1FIȯr}[dڃ;MgA:Aʳk()JGh>2yRKT))xZ9:3ώ6jppyQuGX4 IdDܲ Jb\ҺbtOY@uܸp}xgS%v1Nc9M͈X'ULV>e [P*;-1;*1<=;]q),ɳ vy)qtEV-}͑)V MT>DEQ$hIɪZ rF6Ύ?vd* .X x3ZA$JO80O1mLxҀ cvZ/^iPʀ\luP fЫAx_8?;BU*Ι w%%yl30thJ˯hs1'BccStR!ꐺީU=m iq֕^;D<7̐ /d@.B" +E.VD~p~:OҶJ~X`hCݠo szhyN Ȃ1merIvh"} mS?y 6a=`neyFd.Med5(V/w r?FůU}4ѱ1(=n*t776Nu1glC8.x jH~ ֺ8ڼ#QP #.u)>6yAPj22oSvi@̡VrxWIj%ma2DB‘0'G~k8U3yoszpgV(|E٪q%:%q/. ЇE4K!1GsңX +Z"ȁR!D}51o~2$mR` l"NCy}Ur|K_*ˉ_Cj(K‘Kr _=LfjDn-Xv]iͤd1^Qax?gEskN¬yrAWe}ق˪KP񨉄w4*6l=!Q.QSr oQ g>I;G*Kg(hTMsfLGVr-M;i`',^ML竟VI O^.d\,hn4eq!ba<_ם(m}3ؖI~[a]g^^[BABh@caM+mz6uq5C~ZִۼEھY(T~"M*_ xπ`pVr3#oWuv,B5E@ {SN%ֱ,xP_#G;fuΗؘ Q:Ƶ3ܻ x%#z=(MC/O_\Io%Z^SB8WCJ9I>Y;婌H+:/v!K:B[7_[O<Ѿ3u !H qxZśCZYϑytL_dHFa' B_T:' ǣ#K)o*Ю<+]pׇ9cjOWj}9"_RlI6N : st"]y\9ſ)YF+x|JWdWNљ/ѩXi=+Dv5դ R.ߡF*|r2TL(I zqhPTz/"9A_| 1HNѳTIN}ge'<Ovk0_>QH~]Q\{$&a/v # Z  ÕlDHsY}>*=GϽ1nhıgYߓ)-@(nݛ?V[/1?iO<@ qdM~96U *NrchylxhuܠߣڐuN+<1HثO/;{UVyjVWz;3[sPr5.mr|߱ޏQXn1ihi'R{'h3/C(XPZ  p"x]ԁEyI0BӻagkQ ^ƴBQ]2ORvHzbk=sfT(C8f!&Ja eWI .$oVF2L!e/' + {jPs'$1cKp@n:IH' A8Ҝ w/-Mdĩ];W}T^ Sgp=dҀ^Z[(%6JKn:>1y7sD/WƺߥuOP]4n P_- H.~gSW D %G`JFB;FB<d3i e? uՙ0od% "6di> 4Xrh2dR,޷x32 W~ ɓρF,W'vYf BvV43 9MvQe]dJuI7I+Vcre ^0=d(`R&8wJx\ 1zAkP{2gUCCo2Tm=쩇q8DbZl@OUsRpk{}ϊR{ zT ˬA{4\8բM憢4VD)ck>W=ý"AI|0Qﴰa2}/HDBTӫAJ؀.oJq nC_ J^E?3kq[j4yZrqA|43x.V|X6F*3d T*ꈽ$L>'9u]2Gݳt@/Ivf.2!XAcPk*6<@a34t І~Ѫnb^V IݸUQ! s^])l&.Ѳ%3߳fyAУi5껲/V/t:;|Df)eּ/V劅sݍwn:]e)rG_`oHC㠐q@7QtS->ߚ*NLGz6 BG!iϘˀ10˺8X%sp6fP<-cʁ?0 -:;=-7tX 诊Ꮒ(.* ?DcrFm~sT7Q1d3%w)]2:DʷP ؼ7^i=C_Z= ¬^SMq "fm*Up h!쿺kG@)ja>}I출 +RNߓ Z{o{#-1R+Y5;d6Izm]d|~2)-KdLEKEv66#(#yH7xR@M 2HC9u>oN WbPxtS%Q56~ #poeKv )ĺ!zQꘅ<K$)h^=9?N\8yr[Cq%%FS) 1<JcZĐ.O |hCQr[+??6k?P`_/ƩqfsOKRn'b Ej@p*BepA^"|VXɟ^ Z*b P(J lI[Z{ڴ :`tGVVTf~ˊx*VGܚ60˻Lߺ?C`h:[|<>HSUq_C`T卉AJ) ; ?>,Kތ륹=ͩ@NkFTemZhp /ۺRaBQ8SUE4#KmԦn0uao!'UD֗!\Ւq'i!zkqr ]Պ02' KC+Mhj2W>0K]P~$7xSJnk S=Ks󖷿~[\qxtd |I08B kHo~Jl@[=頂+KI ޠ*@AHP(WRbL℮`6M^s 8js/ fYb>Ir."us&ZjWW6@ϑcgA@ms8A`t#Z)9 fRi!gMS Tu(|7V'$FTGHB=61Hci8seo❈?Ea K맡 oJr>!nz=>* nlP9=,t_͗r=IZAн[}lXJQu7/J0xČUZyv 3!b#%s.G5\ K?Dbb1QEͣzg7΅.`dsL$ QRvEx2e6!-: _~(?Cmh`ɚ#tl+ūF7?M#d-\}:T4?<1 teМWo@խ`o5"]0!+k2C}H?gqU2{ڇ/9|Zg~]R%ن̣[|I$Vt4:i{u=熮MRHj 2UA\p'$SͭQ̿7W52pW`̰{emWHk|/$XLL.=]cz·NYDޒPeXUރ.N=gP333b8L=,GT9Ͻ4LBIʈ|)mrmXOm\wj|m5xnW*NLٓ"4~lk/a`mFH}dJBXb4uoGW](rv\zf ^R,E\Hz 9s^њ[8t ;:~Pj&<%CoUEzsI/ ?:]9UXuve_9,#f̉O,޷zX!ҙ~!1KV(Äi}aIt^HJ_gwcΎXh=W ' V@PcofگmY&@Yb 7PH=c睭 ,(@5m<"Ň=|ިa /u.JPC GUGH5ú<T4TN+)ȟqAg%m"VOWk{ skC2X%P3wg _@+e [VEau,I _9yYͧO=7"}Wu.~L*Bێ*R:[{A*as$D$o;BPڝhd$_K`0šgĖ]< 3PwMGeТ+lcԟqC6쭾ۤ B {7P;k]n5_31?>t%^G "I=K:-^9]}5\ abGkKf_LFd?~kd>gsD]INÍæ`騊{wƄӨb~sj?̸J*؎ϔ#&1c 9ĚP{kcc܏`P"~l]O|)g(+'E7rh_zj3ؚ˚+OfsBc6^5+@RyE{2OW7c0W3f cD{wk8+[qZ:3q=yµ5|-'<;qRTٻ:}(lmmW Rd4ԟKL'EgI4gFݺO+dE~ e@be-&ab# ,.Ͷ[`hC(s'.>U$s:5.@ni]V{&ۘ}f16Gr{!9s=@z\G+Qey˯Vpq#{ijz 4q3[\eǙ,9%\m(y~A!XԖZ̗J}yJ.y +IƘl;L+*[xG]Y)FqH]^ƴ-KDtzmW5T2dY4hqOp!c0 6.|'f퐔[>}GTYؓq?%V>%'s) #lnܟa6ۚ[9R_)L>LpϖJKCg8͒'SdvRX/1DiH{bu<^L醯r=v0݂p99hu&JsO2҇~FSبJC:4ϒx8vfiR[pDDz]7i1I㏆LOH@+?O'4 @0x9]$@PpPD:K]s Dm3-׺B#M}'sXdzCw3}V` !A%™Ih"ǥPCѻ>UEԌ'Ro,p,#1Н=@h3]|kP8CE> ^)Rzs%BlM_-kF@wMQlF8$iqU}F)O-͝~8 =1?oAVx뀴yҖ!q lh;6i#pŶv4RҤ׮ΈOE`倖XM-qxhvj zj}t| ̉M;`Fͽ:G0jީ7R(Lu:&[ kF2yIWCTMB h0p(D(d Ɍd6^pKb="uB(9}q@ܞM@v>>z~B8\ƢsUg~;/b@,vZv%خm앂nIld@s=Vs7d#ǞЍgR&wg4MH~Z6'qG"cvKD}/t\h).S?$nVQIMkg:&L`v_,8S}x^ [im$N4;>ܼ] e"λQ@tO;! <RQ䘯v>5E 8C:!evFpw.G9茅CwVlj05|+|{? čr9?/4'7Ż?pp Ab,c2?I11Ǘz|'7jhP\ U?[.%" iZzZe?;pzNj+h;9Дc?I+U v%}w[^T]]7?͝ ^,1a|lzp{WP_ sLf?a;XlҘ@9!pXcPI;q1Z$V Fs$wB"p=REi``U$M_ ysT۲{ +?/ػsWjP8`]Թ(ʹ>ŕ Rr/Ԗybt-â].=- R(p'SAY@*۶WWUHu)xy)RvͿ,ЊbjQ*(Y^!Hɡ1Kvs}gfHaA1.`&eقTy#GZM{3^LqCUhZ-=~>-[b):,lC1Sy5 X;lA 8GƿRbRk F_H3\B,qh^Yl̇|ʝ3%0k/g:H/BnshN)1I aXM0NZ  㮛ɓ( qyOHfW=%99w 8;ENͯJeҟ[D )ȪLWkZdPBx-`vk[j>O3ꣲSO|/Xy#^űǥ*>Ic$&} Ĝ6?bXn5Kp}Yw"ِݮKɿCZ*#aQns)w~Oа;*?84+eie~ Ib_(WWdOr͏7޳>/Ks^ 0H/wDa\%w ` 5gz!> o?g<&CpnFw9pQ!<[9!q[ JW1':&SH-$m$z wMmTz&?CѰAŲE)ȟ^+KoTʿ7 }Vm%i$ojC &,âՀ:lV;zvt`R"NPn܁Y4؛7yUY49" vH7E>_Z1K=%ևt8u\͕ }sW:7%dm6)=X3I{‚.P2x/,(|}ʶ X}-S\wNTmk.P6aAMw;:Hڣm ਃb.Auo_\ v>|n1@ j T8NQ_Oord|1ɹǩ`nk| @2czݺ uFU΀ Q~~ ͦ)T^y@]Yaାv|Y=!D|sb;WVu࡟T/+\[[g57]/K˷FaMZ-f#P9: gE#x7LacQ\Y&eDZdkŶĭ߷^wj!\ .~\D] -q *%MxhN r(myMTZl Fsˑ)3{ĒZPk|7]k/_%>M݊]yN{FQvY-Blko $ y1-ϣoN vEY{,'4US eĝk Ik2j p[$~C>YP D›sE!ęRt0nҠ`XN2dQR9tr|rLn q?0xkX3æ:w%7ʆW>M/{A/7j;/a7PgM7[ƿjpo9:e!?Ws{8 ,¥QV^s! >YnD%bj;[XlM.=o& JJe#Dc83%ϊQjYpP:?2 A_(LɏX-#$2hNxmy5(=+9͡y  & BEæh깮{#t ,np< 6==ݗB7;j֠BFG:\tdn/}uz]b(AUѿ&M靤" V^gF/ny,rtwtLU 7DX桯fkH$(_6rdg@P~/ fd\C`y?"C 4GIỲn8]*[JdmecA+$~2e[ ]sx923ц߹0&[6ZJPNu%V~Mx`\BZߊIK4A,AoHXFY I.9z{dpAhOE $%dzE#<7QRLVz2ܙ`?:y_J{JǘaTDf 6~O9qT4HG_&tH]bp(_;v"Иg”hSHS0'u&*ƹ!)izS]~(fb`IE~^ތ4sLI$d[ym}}{cb-M*\=PU\HBTh|P==>v2ڐeyZER _[ʍ>"J<I j<O /::K.EN?YP&ApaDVlNC `RPf? ;%7x1s5e'{ o*z(#VPXI@2gU_$&r_MDGGhmhfBبIL$"ʛ ֳm{d`=!1pձf[a ޶8+bAv\M sjEmkI ,'qrprNgi!O i&JKqeo[)^}PI_F(#v9)9։ȱhz(0zUSpZLSX1VO'7Ҟ9ϑjlC2a&Q *i8‚~8g{ /&GJ U OeԆ9.iǀҙaw#V˩`/HbA48Dz᳟e:9`ɴ>q9EUS4s1qZMX:>`7үޖiEͳzjEHbni-$q2vd^:̵fQnD"WS{TwvM#q*?9[PTd(mlH` In|KIHYa8*s̺|];wڛ'@ .vS9y%68\hzF]jIyxd f JZ>#?Q^,rIKOn.~[e*um:xd!G.7=3~d_0 %,W+h?w:&VzqwLkㅊ:&o )&s-qVAҐ] qOmuS6o0~}GoVl4-iyIܞd!%ˊjꪤa@qF[7gu5 H ߼ȱ]8/B#:sͼ`|zXY}6-yg&Ƞ8 FNQ JM}d=~]?OWc(1xMe)1 u#s׷ˬorHJLXIQ-9sP45L0jU,JcȋB8'E|4VS9ȜJs0 4IEq*)!:øE?Pl뻺z3k(pkل~Au,yI6}8%li ýSFiQ?2)H,yrb9UH9p]`w4aRaz\@ܬh|Ve}hJȔtߏh!ȩ臨W)g}QRq>,\+)iy'!-b )4 #l|nry^H@~ CޘPbdݥ$PI sh;PeEBƜ ڰkv6VxЧx!ֶ||TnUOl5^@pRT)y XO,ŨIж] ʽ\q1@ԭ=?EE 4# S4oO5`'!D4YY57: =- ĥib.4ۦ9,Lk])jىS:ݐ?b11yb*]?# 08\I]htih7&Ý>v骃:ʭPB^<,[ 6/ /N'\19xѷzp4(9U_[Ր~`vQl7iu vtŻmb#R$^Ԡ-\GGj ]=oWA="32m)I DTv@r5aZIli0!Q B]ըpeD/kԺf6T@*ܸOBqq&Suc\NܮM7PE5_j娊VMV<3BTT," l2hltͯwh{I߆?49(h1[BDо{׌L;Q^CؔxDdR6i\ < BXݍZt/ouȲ8 ؝k*5;v8(3 =*c$N54.5s94W`Y'H`u71Zn=ilQL}:Y<++%l' ruƀ,R1}_}RV%DLmYkū&RL~ɖfi\^ l@d?N\E|A5kG쨡̰c})!uꑖs+kLo<65ѡN-kk/5]rnR~h>K_hGB_k(^A0nnZԷUwGt ͼ[B@pwoQ5 fM%|{XKSd~D5jXHSoKC;Z \Xoi-Y/ d9^-W|O-%<ps5$8Ǒw ֢eO6! K&HTI#j͂IuuwC+r ,_.ye2}An Pwϊ;t[(t8_ϋ+B2;%vI5Ck[Bܒ4 [-E|O"/xTrщ4 /XGd^= ?%+C0 !El QPE6 s]vgGӃ,|gh}~jIX9Hw0ؘ T{?ƵsJomQv@JOаԙ)wu<+DI/O!CQIA=^xtN 3+~Æe%ױV"lQ9eD%sBw Bg*b`(~Kie^ǓbإӉC2yFj{ؘFjjIɜ(ۘpdJߜ-)`}X{rrT-v+ 0 }z2b9JuAƙY"`:}*Àeù֓%q3Q|֊iЛ0 9b fpG[TX|ȏ91>73+IMAu7inRSQvJZ.XonJcA fWXKRlUVؒs񏘘uSx/p;.lOv]|#PnTExc$'s}'Ma%!~֌[/y!:,lP&<%*h&'VM S͎Ĉ2ʝ2Y\-ZI`͔t $In*9ӂm+x 'ez|]\ٸpPtb-;9g6,bm ܸ"# [02F,0:Ejй(/D=հJZwhuA 9 yeNiȭMEghb w>:MzZ1<X5(n3R3S~W}'-BSыpkn,ISB4l_Bd61Xk5y@U[/p֌Ed)YDvA3D맪\g?In=:ts*PMpsCpDH:b#ޏIyv 5uX|ԁ-`0;=E/}Js}xZuaVN}6:-uUa{$L!NNC-{t>]WՏH0diX)7QF}d˼yn.bA4 zsk}w;\hg4\GvC I….|†GD *&9qXD|'H^|S/=zeQ,g&y[O8sتڋqfl\V!ۤz bߩeN% h7 ׸zg~݅tH`fQ`c?ϊZ6=*ԪʒJAPRϿ.`*S 6UPzl)o"GJ!G{t$v*$Gx$h}OYBӉ11g".xxioM(٤Vv$RXl 4W7*[V(nWF/ۈ$`ò>B g3bPCi\Tdu [_p9-q2AUۄ=SV֫cJu(Z-?oŖR(ߺ8CܢĮHbLAFC<ܠeDUz 7 N2IICy`^($+90"ARH7&aby|}bSɟr@iܸY7p~a@8 [jf]l{N-|Է>iku89k" f gHK#3&N6j?4SQo -O/߯[N7%3** " W[%ߚvc6Sb- ?uPByXmZ!sap=AY]L_Ep3Q`&z?]a>l7"h>HJ99b/`fKR<;,=u9uwv@Ke'/ٱH:oq a ^AC!w :>f>W]W"jqcb72$]^@3ƙFO4b;CΆ*O 7P)f*ֈ7^ 0O/NΏXUcw8a7q }̽y*@ۋ*T1ֆ.k íGq3*҈ul8Q?NdD+Ri@O.=H(;Thy@l>x˗`m%ʸdዦ4Ɗm^uh[XFhc& $ B8ey}ž9C-iak7|>]5U"o:#}g fEɝYuu⮡9#^c'xg?~xvi",)u|D5}~ͺIѿUﰽ)[JkI}Ghq;_$ToJ 0gb)jO ab%&v[2ZZ'8hw)j8l}OD[-r*kS-Emuqk7l_YlOR P'"BHJ5 U/BxTB%~ ~^L"ܶ umz;Ѩ8'ب]-w@*d͓VU Z()8p [XP΢rs=rR.JSA}h*iOeF-al,*&c@p% 53w_5 9b/`yJHU{~^&S s\y_+!5HQ wLe?-a|zG"Ǔ\:ƜD=:YIC1(*uss~ތNAS _0VՆjG/)8m9dy|๩odF}]&YΆɆ\1ȃ`{ij}1ַ,~  r2 ..ɃÛk6Mb-jBehZ:}2¢.Z:]iBO5C⁡HVk^=z\&FEcSP G!Z^1 !ןCmp}mZjz71/؋X6b%Ÿ6CcL*H#&퀴hRO̺? >_/ܳm9@õk/;$R,5!Wؚkm@ΕuEO΢C0'm-Z d䉡1,@8,GD8LvݑGR4Ǽ`'U$53-.u ضN^# 9cˢ]57+ƅ4l2|} )*rt=͝Cq,EL_B;Jy~7~{-y3dΈbrX#ԭ|t tJw:#' ϨP+3UNOa:LcPzȇ_TZj&A숛:c#ǎY[f7Q[}~OY$iglȮ0d穰@j&xsSu 2ciUA$ڭKlI Yl^3ѫ+mib $ õ'(oUVh9*[v>]x\1?nVLr8 'u1Gi$(K(0Ǚx"y&IhL8ndO# P)5W`H^-ae"mnf'f~fI̳z1ZhLO.{U*m}(6^Yu>XED ˟?_vE{2Xs}Gͫ:H#WU$C(z!'m0΁׀ڄ۲&iCeeN8B,XgۉG BnNbYBƒR.iZbH}l7G%& >zX5ҪԶC;G$uΒxR\Two>ӳҙQ ړ,na =bTy$/oPe(Jdh.Duz{?͏2'\e^ÿL,Uft>~&zc-6)>)VǑ1 Q//0ŧ)JWKl&0po@S]RYi// [ a g0Yme릉*N(b,Hj@OC|[z=qgkEнq.zǽȉ^҇R$Ș@!4.QG'?5:@4'3=G+`b* *HZ>ڗ}jАo&-/%VF_# dSqhu~?jUgiQ8>Jhj)﫻pfkr<Ĩ<`(jR$(o+BL 8طPvªk_5gCTJ+N`(l|0T.(K*YLz{ 6B&^ Z2SygLth k] N;o%mOu-?'Q9Hdq# @S|UzCD-vo*12Q%j#؟0[}1ҏaP(]˹̈->O|p iMH5+X{m|r-򨲅9#ZjƊkwim _0 uPVB0 _|3h]Kf= .)̍FʨoxM-5gq\H~aqo4gբQZ/q4iL+2lձ?Kr[>̜nnqWx5=+/ JK!hj}&) ɳYY:1c"=g`5L~v2uϤ xtчbQ`"2D W Iy9r!ʔBOW'jnڮt7>/'ۨZ;ۉ_=x@)3z+ #50 WnaRܬE5Sv’rt0? :xv6sBܲ,ҦHDrYfTyI`6WJDQ̃Chd|b+j]>Y:4( upts"k kGUp&oXHl\ *ZToaiS+#+ޭt+>}4UU0'퀬j3gwk U[`v>;>0/%IՀˉ,4/&o]뽎_P*1=FRH^!i+13!jw `i艻!ՋIo]0Ȱ\'y[ǎ⭞6˻,_* zܾ;z`> k_bY}"ΞnŬ{R.l8teU`/!+k[≀΀kw˯%-+0}`͝^OK)x:X%8vnj۾d`A][:,3Li" !_>n9 ^\ 'gڼYE Z}$D{A7E7{ =9K8,oJft! er-Qf W cGI/1T\ǜOVΰ:٢}Iq8?VʕO/DR%F9ΖehygkgGۿ paTe)]evytPTMYn<_(NSM?sXp_s+F5+jBlJ(`nW)bOy>͝y5Y 8gnoc<اcK rApz=[J qڦ5E v ))9`(KA hw<:p'6P~2A)I[!KxC6}dy/.z.FunnZZsUV=/I, !wDӎzKZD xyc\k^+׭7',۞~Hn.(8_Mք yƤM91gM }A Ew5lGhh2%}۪@7DoCF{]ÿ↷#ҍg$[.+k3B_aI /ɒH>>wf㹔x,G)xAVwь^!Fsv38EU`a/|GPq(6p$aɇmzmIaSe-ʴ~S']+ɰA܀ 2nƉ32U1fpo#z$c%:t5wh픨HKT&p~9b;Jv'û=&;0toȱ'5(#aҡ풶&W^)i4`ĵɎ?wpo /7NTNBIń&K+c~LShGr3v!C&D]Tsb!V$NR #*jM<K͡ ff:(րBk3yᔕm6.}3uJӜl{ȁBɦ8kkr ֓mk.Iׄ)v\;{ܒr$/F*Z[\, W-j1)͞?HF*!j23<["z8ң}hknqtcj*ύqe'dasd{VC'rT sQlj|=#R^̵vx MG@b2Y]%;Q_sKV&R :|&fەSxf+E~e\U\`nsSdȰ Lq*OHǂYln#Mhε#2Fy 9r[nr;N]K 7`&aV +0Jn==i<)?;YshnӍ#ua+v/HSqJFhd@]y1zQ)K0hYhD#OʻHiw&fęU*q8ɚzh@xHF%JeN6< 6nY T߄5n*A6 pW=OoXp_d^Way} ׮Q\f B#oW>Z,q*dF*sbTcRo`wYt|UQvr*` 6xmq$8uحn@S܎MPtU"=s11Ւfa5@- (mT. F;ITډȖҧc).4JyrMLų!Ip #487)(ϻ;r3@o3*ޅd"aPlڬ|͛48aa)ѢDh I4kj$Ú׏2G*yuWL) .Ƽw|8!uL%V GO'sW{{M#PCM0- wpl`tt.q/u&e_Ym?z7Zl`V&4?֑NcU ?b.KDU᩶1=1RF>rgw Z̮q.as QXʑ|#爋B,`PJd' aHdq>B!-~5۱YXX앀7Ex$c»"!4o ME49-hSҘ$Q!ʘ [GP-\7 7z`0 #HsfD%Dݵ$J E܀ܒFf6'FX]菱XύA&5q.)^,ީ7a\YHwtEɪ)b+eODu2gV3Qp3SrgcY*[kʉXFgךV@;~"FO2`Zb@gGf) d{X;sSv[BAn7^M;3;qaT ψW$xSoq'-|V/~dx5ᥐLWfldl "{hK(|SCz|aڬ(9Tt>}FQ;rBct  SdV?îKe1瀦>j]WV9^5U$[4-"*mue_H- 1Ҵ4*K'‡ƷϢt5cʛ{ I9kƨLC)8ƠQ?qB4"mFW3kD:{z2$jKSR8e4VX'qʑmNF% 5u&;|adBjߜ;\el5/.bevv$&:v랏CW+7NH O[-qeDKNCR/*n.[T O0[/M~Iq`N)eݔZJRGG|]X3Hn,Ә7 fOYG"/n$ {w^1yYb]pA5O]o"^Dn{wZL=*f~*QK-4טZp`6~d>ŕ}rf3ܽAIs/h6;mMs1Wxe jX]j-]fs) D*SzGմDĕYo[-v?aR/F&o=.t3J|V>@&c=Ey3׎"T@W)ųJ7S^N۫nu:Ÿɿ +݋*P[5t\On`&җYX%m ")!Ehy!$:W`8gR:(v%IxJcX2(bN阇(p_ '͈u%j*3vV[l`V.K`X՗@W ̱*'G g y !^TJbN^U4:**6~Ӈ!zGZuȺ.Xᇿ+ 7Fw jG6y9rJͥ)4Q҇\-+@_=yԙIL3R2;x [>yp`VKcyRGjoDf 77{~;B`)NQeť9HNheV >;bEªanÅʙe{g * Vy FR 8Xfft۲s~>ct9}G{TSA JtBnM܁!x D]4LJq]~n|懁hbH1HvY>Q^7Po*`I.mM`#'-읆 ^V}=pw;NF$2I lv"5r{jIɡjJ]5e$Mq$hlM? YDQ8e6iS;.%q4Dsڻk|ގ^֬Tk\Jbm{ eAs{Re@4jJ^/3l.&4KL?G_4MsO_6]1@G<-*Q>3J|{z#C $rxfc=*6q;dIx] 9i@~A7>=(q5La¢߻' dFD9-_IɠK- lm{_[g0TqFEsh aa,-}#Nէ&8%4aޙ?tƣLSdrauUe#c"G3*pRc7)SKֳVgTJ0VEjC%(%+$\ԓ/5wu40`Vh82ڒI,/N񥹲`i1b,VmmH{XшDvEH/ra!.J%^ZO}qs0׉%z5zo]ܡᛦ.)\ .QK0 |aIl*9F=VP:C<Es\>֯n̘'YF5ܓ *Jȿ) yّ! Vkߚ!˥ia=sbZ3nCyeg$\ lYJ cg8.*u yUEFhv56[׺d0jriqQQC$A8.WID.5Bγ%=0څ$ [UE2MY'Rz;i>HFF:˻-nAN/~?ShK28IE|m.bMw9V;aYrT8Hdpm faajqq l>0&5ɚhی"53QO9o!~ROSvK@5ؠv*a-{ܛN=׮2xT*|ʁFA(RINBDOֱ2\ ᩚd^:AA%FA6+%)=w,s17н%ns\^nyYb3 ħlfd8GSR$V9ikuINזzkw?|Tsބy\d\ @!痱R~hP[Ry>cOV/{ӑ,oyB%>|%iʴO$37L1;ba6n.5:ȼptc4q <>3^ڥb)d3zw * }]'?F1i}L=_rvPV0EOZB~HsۺX2Z&Wc׺,дM [RXՕA%bj#ᇀ6قo>]{ɩ{: rgNzbkG'Nc7z V[r?_Z".f$` GiםRϢG_ŷ(t@fV ᅞ#'l0d_h) ôb\R~a2^cO8w 4GQюz@)H5s^ۀUiDiE$'Nifo7$1 r92o|.: xQ }տDam=[!;qC3M0!;={q˪kew*\ h FWz\ '-]Zeo'"㔲|sìxMN}8Nr4 ڔwi-\CKL+d#vBr?orBb.32TT6xKNrY(Bi['.[mptGP(iyv)񫋴=0ڃ&‚s)X q)J 81w @޻9`0ꓺptnUP6OWrd岯fTޛ\И㗊m|۴%^%QŐTȞzyI'3"d0b-lzmsKqa+kWF57RT.߇hER]ʍ:='X*F 6e+3095fVP-?7NkFoQnXPH!fGE%JH/ZS[uT:ԑHS4 ]2zbleU@k08vBy} zY7|fmZ'+nHQ+gD辨aށc{! cdZI_jEqL# ' ɕW|ahNvcc(j97HOovn^\eW+)ֈR}Lo׵ 9ګ#l <4ReA+l&M2]L_,9AD/C0i 1 6U (fm{<1oNq 9K)?ރ; >(IC){XD//gO? 母pou)wNYd OD5= 3D֒൮iNKdۓ۠$~K5n}L^H]~.'ӎqxF`qRaB-TN Lp!5S-X*yyyᖼFh[OTMh(?<$|/6u"~ f\it.ԅzZ?x_uCDoV!\hY-3wЪg_ʳX=nOyFR~( loJ$C5II91 = JV48%cg r>:֦Wp=4zzi#w'!҃U~oQws?!W 'X,%N2mkgxe f7͝$@?(5:6Ⱥ \@bܥ2gv4˅>EAUDx2ҹѳ(@pg.z!*=wTM 0jwrYfj>4MpA FT-I! Q͒Qn/\O :g?4Wډ_'pV F^!ΉπNJ7_)fM=۳217%-$듔)LTb1vcWF 7o1._N dqtm{t q;7XJ͢}mgƘwm@ؤ ?Xl7Zz+F, sc|ѴyңCG♹>>#WTϭc>{ eZRlI ?4-M X%P⧶*=$U3-[٢_NcSpb[è(w+ad7rmq\mUl"䆊"p0{β5LxL1LKH DQcobQPgK@~8qFx82[F'¿2@C\+-^a꧄S{ӹMo(!2Yf<`v%=河AjAJi9ӎ(c G/s8N#;0X0n5l*Uy|M%_ 7HD[P3́sLt*YՆcўfBc+QL!<*ןGFĻx5CКiQ5iem.~ؙН5N֬AfzZPw.$‰qXiFV}-K)b]72pSƅiJ. o^æjz9QuMl4Ik?FjXRj+f\7f~#@?b@̞4,6vQ34P1Iwd1-Κ쌴@1Gq+j|D퇂{MB!O0Ƚ !F% cd%+FN;Beg)ZeMi~'cSF;<6a #} 7"jtT=Q?yZ0iS {&Cf&7! FȂg 3 `.Dt#LP_(ͮ,3I Wm :{.Y0\"$I)w4a4ҮQ 1R cp#Ēd|oA?I;o =P>_6[xfrJdi*k0.'Kl'Zۛ>}MӭJrcK].S` MF=ƳB[|{xw ُ3"syvd86;0彼ԇ 6x(ganp ADya+$%Sa@yȓk.Ae3VG!o3Nl tfw쨼6ND5*]Ѳ~<Ԁݔ`uH?*[$Ҷu&ﺹO̸"}b0v }%H{5/+R@yuZ. fÅi;!-%;rl3p8TWJx.TC ]̜Čcy d )2G[VZ -ABld?˲iqdey*K6x+ns!rԊlH)ωU8*;Q [0L4/4 ڬm9, oz1d=%E:A㒕&&a0"w$ l( uߟk܃NkJɺ:èD094jfOdNf=gB+Z[urO䕇{c mcS:P_/ՄaGΎ`H(t[cp$lׁ4:J)& yrj}AQSŧvRQCL,3Ѥmـ́OZjU `ᓝ"Py+LHB;|r!-8DNFw &{z<{5 w׷T+Ϭ#T}7 Y7pR(Oγv-`< 9gMz*iăbdf튐RR`A֣$,{ GxN{='G vo6"f4\]? Ʀԥ_e]d/9o:PڃYB mݞ㐏9* .T5+$ P!<;Tb@)"!b ySUl \W7{^|X7*&aEN[C0qf}rz`'[yDI=?k MT|ܥ+-d sPYl1ڬNL]#6)#/HN)޻NmGeOAZ1Ԁ~KvC$4d03=RVJC؄s,uǘomW@Y[B⿒^庴A$ S)5bGȣV޿-H7&(r:!%\S+I~wfV#2x .(! ^“uT/3t }: G Xʗ},s844K<т`\sT9zAê }IŪT{ؔ&pm1h)&%, saY@]zn-T1/6 =?֭u DhY1N"[=抯JVu_r,~`^xh1a0Ve䆂Bo(W#Zo&4RB:GAm&xw##D^fSi6Z6)=+T"w74AP&f>ۛLOQ0 s1⻟G}~F"Bcz_f 2V ;;r$4?]QC+1K\_@n.s .=]1M@k˲:t+֛2/9"7Jܲ-m~q0 {VFHuF>#0ty>"הL6֠{*P`r:iVJu2>E=u7N5ylRF·~7a>La:AO-\LG~=6+[)s ~PõJXX0ntv.XG#h>RE~a0o([,U4G$.*2M0Lû}Ab6z:n xeMypO0boԟ铜chVr暏7 ްbw{ #M;_琹/Fv_+_xdwkC=6<²lc7EQ/^E>gdI4 o̩vp&;uf =;ewvR_HYLNDz|RU'grÛ)嬃 2ћjWn!犭s;}`CO&Ax I 䂪ÑB9/l SZ6nW C,Cl]{C~UHb~JR;vd<m g;.$y[|VA z;g7 o"B[rIT<}$K3$A_69' K8¡/:4kٶ [ztMh/7/2h1;L>g xQ*;? L%yBD3ɾ3-~.9 Ғ"]R h5!#ofT=*"s(W 44͗ca 6K57yֱ"x*df$ew̝%w8ϸhz,zfM|X0yp$b n;b+ :i[ \~:?PU WJǝ+{Zh*9?M6}`3ŧLlӀ6h\b܉<=ٮ&c2Ĕ7a@՚P#W㞚BFN[‚;F,90$)*J?F1uuL;tB>DX?2p)\m񹫬Y72';I5OQb?D777d Ur̳Plr/c~H0Ὰ3B'|:X0"tq¥$[9o9zV0zo_4bH$QGzj@@| Ct}M =x7+pd:(F.L PUiѼ\B95YESt]fVmM|*rSSՌK߲-P6dݜCL~H59?YCLVq,):+L38Ol}>>Rkm9>QPl pIhŏY`N-h~-,J9MJn{_IaG.\:K_N[.!>-S|et/Fm8F_DXAwR~gJuy ? M8#a2m gY}-e R'Z1 Tze_. M|E麗:賿JvP[=F0'?lo6%矏C1Q1Kf ),џ%ZO񖞫^6`VI@7uG.vZ\ҵp3X8ªn[n1U0Il*}L}xJw?״XELх-|IIIxtot 9n#%I׀Y81m>a;6qgځl+a6'>CA΁!&PCUCq 6ZoOp,t}:I3W[\]DDGkMkdXv n2e:P$ˇ,N6?@'3QZ2ls&a%>Ec^=i~o~Bʏ[ܻ(I@D>hF3%;7}f[8D 0M3j3bOĂG}@Frjc%D}"ϑ1wCEM.~hb.J39;U':۽tBI͑ޕ}A! gA#B@cgwKmW}8 [W@6,XAi#)PՉ+b4,(ʓO.[ڐ5f%.mpdr]ۓE`5܀ha@H]] 3N.fM \bʂG:"/"QfJzlֵ BTHTqVc +d.`JdnH  EΒ}BzZ!g>S ck[D\GͱG 5uQ%=1{jߦBl`xe1/%]t@mf]-fsb(UJ';k֢ҹuwv2K|x$dWN [e>_[ϧDuɋ1n_.z,0_ΌX)?OHXgB(LU "*}wr UGj2+WMȜ#Ѻ4G_^+fTxsSñ/^I H/;kxa/B>0.7 a < :|Z9A83 1Z bF_`sSJ9Sz`r{2Ɛpș< !<:n/SAΎBe* D6KzNn@p;s Saw+TLྫྷp%GbM&:bKczF(=r--$9l-o/W*>mbp0_{`]>kty/Y}6? Yʰ9KhC$$L3R~KQ+Kl}plY2Y> ]C֔M@kjZGDһP<{m3焠Uag8T 6fY#P4hkE/1 c ٖ gg}p R>d1 j6HVcjn<S*EG0C&!R:--rs,UsrN~NQ:E/l2cd= ( fg^5/DM٭2w@A{XEY M{p5)L2N 5b'^ EhޤX0'^=K9ܶlW)d4zBݒuMI Fq8 9̪v=d,Rh<!~5Lw? m^[ . -Sw瑈K ՑbE[Dv_,Ζ&Cn9%4Y˼uEv7^SMC~Bm#H`PJ<~9x׍^H}ܾ#|[ue&[w/Z-h^H _ {3J%o@?s&(%w$'7h2*h @_x*pzstul(/d+k.dvxNwDsȹH|@]t FpW6wRĄ"Wh\1QLrqM|Qn ~ƫ!p )7-0D"(u)_v0s^8Y7Ja æٍ3 NŻm ǹtY I_;'uPT5C^qgΜF0V&'b#gd| ^Lc9._tOOasj"Ԡ~x cQb%X-0_0 ͌LvxUnlLjk;5w`*fNp<Ͽ* 7D`%|1X0ajE_)ś.#0v\0I%s2ȇAOPb:QJ1ؑ k.@`C䐩7`_.ߜU_{Vs'6jߍz;9U|!}|d`FJ@ 8H/1I<`q)u[]Ma۞Pd3>*4 7_ȆUU  Qi)S8Mj!⠪$97IMRS'uɇsb?4ܻOlpN[vF1fs>agqk0~56@@ՂD O촓ު->0R8ѸX cY CT10MuІULV[D䑤g$}{יd c 5ڎ @c".8AUb8gVr . EO?rA[^9 K)܏B :hk)r"yV;¼0TI뗽>y"\fq^ VDewz^) ,؃T@d%W;6cJB,qiXR-7(r%Opo;V9vGՊcstHKPcU./;T- ais2]JR@J3Gp[6Pq:Ɉ0GK*侗 ^w 2; \50@iԣcq-; "C|{A7 Er"Pku'i_E8kk#EkS,Y'(xJ7"S`fJVr0#̬?gc1r&8'aP)͚9`N3݊HoH+[!9n޵'QG׭D:;ڸg-~J2̹,[7@.oDZAޖ7ԿWy1ոS\}Z}B$М<9}PF>N]A4]&:CĺGF[URZ}3mcBAܚ 'K36"sl]90zF5dZN`M#о+#@^HYW#C0koDGE\} z1fy;$E]B-C٠VLDet*kW?ⵧqO܏yXNN:8Fsm@5c[&*Jg;M{i}hTor%SCI&$ikn>,6,Oo*yQg,>ݚ kp:FTޕ2Z ކme/v>FK) ntLoyW;OU]fUBL!;)7|,.i 1[NX[:[}88*Ӗ N{1v 0? k)'7 eVqVF|z5e/!A?NM_qX,`Ibܨt&IYg7`"(D}DdDLb[Uȹ xR.qtÇ6we'wC>^DV￀I0Vqy1 75c\bLrU38J3nMÆ4$@ԨJکn<]cxQ 29c<ɟQ',mԆ35.B.:}q; fQW4`M] M|(HI֠%Q^zG`"dVoZ2^b[:SXcm!-MIhP A svLB6Qo@[p>#8ni,C[6/HzH`ɋAb):ctpe$@zӿXx*r($fRKjĵR,6Vn CM;'̞H_tgIיY[%^$nJT}0pO(Oڹt=żĪylITmQ>kC{ZaVq("W<(ߓY鮝.<é|@g0t&L~@`Y? clu #x[:YJR9Xl319S}؎-$Ri߈ f;WG|.DǞBIC̪2o :Y)7 -`g[M CG (4a6IK_+7 $~.L}h,T{k>RܗOؑ'h}k&ǟNhn +GؼPtlVtu,WOw6UI@l&`eߣ8Vݚۜ:N[~X`LMLA]7:oP>Y2ʚB?8.(* 6N~ѥO}Qzz~H&ؘ-K`& m4M+܁TȰ,v`R %Ua{0+a31CeENq\d G mZrAoZ='E)OHUy##MAJG"E\}"@;8,0Q/1%hytYa/7>M7®' ֌Z:4;;(.JU 9&Ǚ($oWEp]d2j͞1G6/IUQ&6A?8Nux"DD(vμg SOwH *jyC,1xW̚ ` ɉJ boBNCQY&g38pH{xb.7qY+'Z@+օenx_KKő36}5eL~g B92BjԜOg=NsRq6"pߜ?O6Btےl IIfc~2mWMF1^6,7 cظ_!jtٓ#Bl;탰r+{Q-8qE7'<;7;2 ETt9JziyfsVMXW폨s#p=-尉}IQ=- #gH%N_,!ȚOѢPJ *-6mḵ@cH]pA DB 4'Ȝ&D-kUodo "6_T&- ]\wbLf5V ΓKBȄ7IWl-!5G ~YO&0KCp㌶%>`yU ~a\]p~;8W).\CRȃn"K(X°"0d -iVudAvw%h{R/rf߁ѣ#1LJ.ˬYY.V)PX*Ka7YT~ )uda(bn)/tR1=E$mW@ߤN:րq:'WΧw`9TT{N:Q:X M,0nZl E-QaKL =;Xߏ8ɤ6M}J :[c$ uj$#Y~PY2$}<-2#MmN#R͎pm%St$L ' "`naj@eKJ?M0&π,RSbdF(FY{!=م[[Ʈ8 $ r\H.Po~xacd;ȾWhy דW>/?vbO}H֏sC4~ %^ЂffVYlt&&8Nv͝ :VGC>T|ip|%sBiV!c>B,* :nuCH@Lpˊȑx|BV 4ӎU4*G{n[6};A%ުG;<>8F Pip dG ﺦe< &߾dUךMl²m`\ۢ|w4L:ȆwM\0ﺌ/Gh)e^vyAc9 I@m9f|r R]o{XV ƥ<:ס[yHPRHx @ߐ.=[wKJ v/0IM'v8X8m%K&()G["ÕuY1uR/y`>fU~Gh˪%82v]!m|F+`ۆx}Z3Oҋ_9d>DC+"5uޝ"]I}_sR*&q >"x,01O˂{XމɮbPn..EA1)5@oS^p,ot8Ĵpz;y*[c]DUw{ou`Zv fX'^rH19nV:UG'})壀DSݪfym9OP[Yj%O1et?Ƙo57Hq7q򨔻~ qC?"yIM#ErGg$83/s "%F }Cjy![Ox*C>JN~JViww[ 2LI]5OӚtb>3 ŧ{IDYLxzdN$M\w gptO0/aN +o)ea|,BzNa?E@o)Wi9֩!"$ Z/!Ygq^Ke} A!sY7f?Ɨ&]-/t$2w͇sfDSXY;Z.=R/Trq8z L]nKNvU kTpŜhOAU[5vDuIso9،|mHah^l)yjIebJ"M'fI'( e,Iq}{1 W9ߍw߫&f2'=Y=L2C)VL*:YcUТ Zh rv6K^)ҞLr콪#ӵwX vm†(q´R"Fi3I13VBz^챏7j_髝>gMcHhw_L$x4Xxu'Lj=᛬cfCiku`HAZuT&3!kUq&G*1OR@,'?,2e74[p,PO#VŠLCx~԰ywDcE~Ds*sأdT\x%vv[i#v]nbUS(toe3A4D; 0̢{OA>N)wE٫zG<#?l)MBW&yakD<vk2#|%:qO4hpTrh\Es9-d㧸kEhzRgbY չa*4((/.~s}^{>t3".m[6Z o̢"bS:TS DQX Vݝ,+p&e, ;-uF >{+@㏢fTPK[_ pӝTllf|"i4!lՓ;Dڲ\4_瑗PҬBU6Uo}`D#dm"%: e%M8_[_i2՝Y[\6X]eL'9Ti͸zm }xbݣmCsbqC'3N٥W[.iQ/ٮ欴}3,Ϣ}@J*# 5O$c67AQIy#3Ƴ ,}`ug~螥-sշLWtwwd䷽Uaįi>k]8 jLEp$V7e ٰ?䝭{?vHpL [kyNz;SA-Tu4[Lq(]yE~]5%J,$/M'^@z0];M*]PwI0E[ 'wn-"rCY|\vPBCfwNed@&*>)ߖX ӍT^4C D5z5 Q_Y!N<) M7h$~R((AI*-yǷ+i#P_:i Q yݠ*M[K?"e FUC:WUN.k /af3Jmxs&fl-`#7 S觗`4ƸROFYG_Plc1% opZĆH]Sm;<q+fL4a l;wu!_joo2w,7%WO%r&hl{XQ ?܊FP]T@:Z;:BvWRoful7js23颵ĺ#mL665W_ ո/k }}hY^6>:*l9ɁO96I S5gs7X +G~hKuR4]ؖnޏnLVZ|{MCtYẃ&R9{W~I4tbx-#\/IGyQ*bPFLA }i2qVvD|-4kOOw{n"D#R%δ /SfSi JaBfeWgIJ|AU珖hV@fĊ cb䌒~O'irRƺ3gVZ8c'}szϺO?A<,JeR\\#=!6tB^g;y{@-n׋ ]\ؐ;kz!=aOb_~>A*c]aBg-4iH^|,ZO'!|Ԡsh@ՀaL.-Eae8˝:tRKL%v$ 2$'(CP܂q={We@a(uw{fM+38Ŕk=s7!2K=Otj y[~/jWYbv8c^<.w4m»}_Wpuͩ^'Ӵ vZD"kH$Y={as>y4Jءǀ`<* ѺI |AsY2eފĜ'7 ʹt2fw3{Q6_ލ/ t%pF4AT|unWor^x$:1-bﭽ5wh5~D,ŀ`y.?c:)lvRȢ 4.~>.va`\pE %yd;^J8FK7)&v9B6jm0EeU\6VLFxy7/2к`; F)4RjȘhGKޗ`ה \K .Os3S;H'p{$'n~ʑyH <!MǺ#/Sbџ W\.wC]W'[yIe$?G VZteHB--i:"Z%E(p5:_E!u ^Hgiaj k:R!K IGtfk?8AT@ F.RaL8(9F@^KZ>6V6ؼG Vw>R"U`_A7?؄l% ~?$+`õ[bp˽=E1R" IqqUnͭ3ͰEqT<^>QX+)["O/RS1KH_6GIFSmc( *rdP `-?1#ǣ&G{r6cw0QStoS| #4Bw ۸w<;M< iM۷g)_[@H0IWaSǎZyEe2Jow0 b7E(#|xM"ZNflgm5h `!|!&H2R5Y}>&0%()wVރ1.3Rb7z_TVlL9qVd-p}9 )P]}/_$^1jG31){kKhqMq|.2d CK>45d;]9FH$Ug$OA!j.e8a-Ͳ~K,-1>zQAQp sN ] эCNGl5$ץ?Ӷ#oy)즗^ǶQ(8 1T3N]Dsl4#}yg˕D`O>mX:g&*Ūk)M@d-33Jw凭cL+yԀopDEIN]*jbOW{wjC0W'<݋ {J OJ3HC<`~,&rhcjk_- {mcc,ӈݭ[ o~ˀUZ  !`'tJlA r}k'$({*puy[RF޿0W|oŌ\p'Dcܐ[)2h1fbrKh̸͵%" COX;ksK3pP+t(fM<_~9o')4updL8Sي,MmEɕBZꉢ )Yo >\eZ;zb4[䡸WI &E>/ @G⎒V2t(~:ZȍRq>歀0絚YwaY8tg&nvM}bJX YՀz>[㌘|n+ӗOˎ|^_L\^{rvf4ِ ^j"Ac 7 OX=H!0ҌGuʋp~lbJ>S26n:5c`xkN$QEvg|E!n, '/'&GH^[#UWQb( 0x)?팹i9goyr fY+h -] AZcޢV Lv!Fp˴CħT8Gh er!̰LtJ]c¯/3I{d,5&rM oG[۱DJ6W]z~%B.e%A@ k)_"^ږ47}M.LժA6ܟb-PRAņ?KT@SCNI-m.ae22=\‚ZyVH!kpuU̚#axKL3`N@pVM}?BŹ}*xg7af Of٪Pz`mQWnFilU)jALCy:#ڃsԹ,)قT|1VcFo 7V0”v1]M}!$Ab[f1h-< 9 D\D=S[j C/@;^ap' m*r|:RPR_YptcHl$:y6B{ӆ"Ԍ- D{L_:n GYΧ~^#Ysb@Tyޒ,ʋ9M^C6P 8K:h}UK8$4۹y]wl+!cU3˿y_ WYJXLu[4vyA`$Œ5p@BsNbxno3İQW#-2D[ 1jiLR:i;B5#SXR4aВC1Ja?[wߖ߇E>Y ~XL)},IeK>2rf)Fsnqyfx$G''&=mfyCz׸ɜ%e'[W9sDSz^êG LCwkӌ_LlR:n Dx*o 99-U%N|tnXA x[Y(WT"TiELk |D`" ~2FeTFB?2g ,kVO{PxTI{4ovy)[\7jv{5H(ݢK{pVZ WeQQo7H*oP0OuYp@xΈ-&fƶű3m߷!w.I$~II^<z#b,&{|*nڭX[dP/<3a92+ȠO=B,Y69Kr.]s,H=5D`[m]&$T-]|/U)`'dC`"]ux_*m#u`q'fPp׉{9k7]sH/)$iP#b.\q \t>J|Js۱sznEq;vS[h%& TV,hHwfp:^)@m3@""8#y<="TTHfZlC:C-~SUE2?2Y@;iW b0?m{BPs2֮V\v2? CbsGiK1JX 7DgZ&JZK5sbڬ2m(۲ӦG%YS!YZ1VP9j/NaPY1v ׹2-^& nÓT~vІU8zcŐ,vT:6bUO bme/लs66.HRiZwߏa 򶺇oB:% `#+eљ.1)6bt[L_lXIWҽHtMd 1sm$kߏ.;Cs ݩ9Xҝ¿D 3|:T>EPzF}߬-7يuO4B}J5$EڼLѮɨXXC9j.!/C\/9{I(ˌϖIq[نdBXmGc$ka!ʐsQw綏ֺM`!Nh32+/-!!R${]Yגc+3ܨ0̑~&l?ʵ$Y”߷VYU噔|_T &a[3Ѝ,N I9!;7זt;$ٮ;87 o~S5,-ݠ*DDdrK9Tih[5QN  4ȎF)I+uX"8Ea:ye TD,dU$zaSI.tCbv>B6*Ce\e2ޑc0=.AOCjL'U==qĜe cPoV&*:bdm K˹CnnCޔ8p}QgShEBH HϩdOE-_')Q9K)Y T`G:z{ɤǸHN ׳<*,V{y сb @QfOUuL-.e݉8{c:^LZ%k) G,PQĚҭS>ƪ0wd7*b_-zBHp_3D;2sjB9QͶs[XE=.Pۮ;;[I]vQhf}3ڳGbr4?K=X4Mȧ\ g[B-\2 (V̢2ۈ?CTT+{hzn6/${$ƽ@RI2:I7u4%?)TYt~F6m~ݱju|jYZ7٢.(?fk\.jx"OF EvnCly%x"cKT*DX~_Mi@'Tx 0|4P.a(hb\kS}j.nRvH%R9̙mj}p/MAb'qkt6MgGԘ0˯! /F'?L?;MX8'gB`mDү"d4ٛ~ȗMpK֟b ˳ކu)yYC*z84c[M?,GؚbC$ #`D%F9q`u{y>8!,*`*)wWI_7΂#=MY d2 R7GAXeȳ)wv2$Mg{/%K.J ' 0!y׸vy PF: rB$7c441k 7b".Ivu}{Yi4SI"cmj)v0r,=fk0VR@餋i6͚E2f">W,(qP !<luX/e8\3Xt,ą#&ͭ!e^7@ڿ #l^s<ݣ' >ng<-֢2!.TG:#p# 歄陷=E$^=b:Pb^nhZGL-_[e/$kOHfy[T4dҞj]ү|21+]=GNJ:s(Bˆ莪@j+C_gP9%q5ʙ/?U6 #DbH֛ T@}fTmGKj( faP$^\ԛ͹34P-MQdKT}""> C̈Gz*$Lh>Ku=FӅMKx('ɮ8a>pLi.:֖k(Z_E% -h{iL&#*Gq[̃2 Mn^A({g&yFA> SD>u3Ԯ7*c!k rH)A>%D,eq~.kXn?Nŵ{:ME8MՁх%ͱ]|q񻧄ur0V125 5C不4 ^I*nj2' :FG}hpr?ңU̩WP1.ձqZ\?Bz>RhUplNwA~倊9w_#O|g{yojf3KН7EM1u ZĚ:傠̈́dt& d4OezCR+QR|2I>]>xƀ>."0e`{L928~h+iZz#ݹ18kr^;:s#n~}Nqߢ9>}UAwl٥l8Fdr<7vHY&\iQse:+ < sѪ{S/6 pp,n\$~G3!AJ4{ D= K5ίخ S TZƗ]'2L?ٜ '8F?FY=g*{O/*WٟNIO8o!~:9ZVRv`kˎ ,28hJh!Z:fՃT[݁ҁ:&ypNw}o@v=Q)9lIڟ %_Ǜi_k^^e)DV ep׫;ڝhUO*T[})tYEPz6g>ib5/ŦրJa)9=7 {fmJYasblT ΅0j  i0.2*2:GI3jx' S }}&VI-*#ZX7B S2%'~^4΅?-1yGNm΀,Ϣg^d n nh&']ec0L`W$D,O6UOWYp~?vBGޡ\ǧ  1GڷH &SJk?zEBZKXVT `YEU{o/H hR⬫y/C<1a4%}9iʗVȜpݰC*\)bs) 4lA_0lĭq -sޔ>cIUȣ~OgdNjq9qVgL꓉Q|o IN6=>N{;[Wws rD?7)*,u_zk8YЏ0.[K_ I㛘"ʬb <~/*n*/M| BD\/n&DE].|+ga /6>W"]y^Dlr9fy2'n uFrMDg0E J?WE#j Y窽}5sy1h$sewbn𱒿ma\4g pfYd$dU'8Xʡ鞁v :sƂKadP};Li&w7xJ 2M;c eFf<7s.NoulZW"XˑD&uYlUd<*3/@ivgH7\p(1~NF :K!I"܋3xjΨkU*ʵ\+{!QD^[_N4'3MxX\TvU,5G jԵ+&J:Etov.aU}" prlZe=d6;WB]0i.Vd;=J.eiXPhEw.?#AN_,JzuQ=A==֊YPA!+6c5\c@;*{qχX?lϺhrLp-cHP We: +`c7G3 ﷰ߿"eβaQ43ͯ-ǣu|&S;}dxS()Ծ'AO/`:tMϜ|zmnSkV8W*R጗n ꡄC+k̈́էaRpA WT.B`({6 k12咇gVV LpHWK ;(X=h$]=P[Y0!@|_*4'?BWDS1]ߺ&f=\*?׊QC3z|rOTȈ־] y{+Z;XQVT |SCYTOJ }Hʇ{ YqFLq]C MҞnWm&4`R DE!`kp=@|%4LTM*~8ʘwnw %X0I {]zΰS&N/[Bv"Zn9@Q}c}c=} 6s".y7B*P\eĕɸ98'ƩkCkREL.2hGriGaq7U^]mUz FQl<);-OVǵL}[k;!_ ѽykC*Ͷ- W}4 p37iP Y]' fv\IM$Ѓ*HM.*4NFtg-s%SW/Sx86_ Q؂JJ\XK~f]2 #R5Zir?swmڲOL4ݟ]Y ;QwzCMAXmvID)MpRg*3LR>}&@J7"ՔdߓJ2S[A,5\7.' >9l.^k^:ėpW)-"{y,È!^Q" $,`2$~fZ zQT:cʘ(NPj?g?>ͤŶ_Q1DÀ "{ YvΘ^숞RGt,ߥo'+)>—i$J֯RFI^=3*xtY!,3 %ཀ2H XqΠ2y,\4V8$]ZӕEMEypٶOx1i^;;iGQ!N:Ha"ؓ#iT ^8&Fifk)tUn n {{v*A#>-hz Y>ųwweuG`eubI 4^xwc!Lԉdp]_&2IֿzU>a\Fpn ?Xdχ}'PZP@$A>)K*ьo@]mA)3,̕n 8,ʬ>-:Ɲ]:YB|^٩İk[nZ{~ 1 %,Ki Cc& `,WBsaDѐW7&6Kݪ[$hBK( )sM z[e?]BPX!{ T "|͐ÆWh!Fh9=tJ7K4v 1{bu,pgo/JC:ʉ|Y\ƮgCmP/pD2miu2=dQ0)F Å!_˾Ci&$-EݢCfj  zO)\H篃!?մ!pn܊OWJ'.pj;Ze xՅ`OP>d&ziz?tH9JHZZj}WG8D/f9Wѫ#lQq*ppJ\Pbe9rpoșu0JK>@㄁#l4#u;6oě|*/碖R4A]J6 d$v(=wȮ>gi#\<1Dᵛ+aIJ1⳼+|/IV9-ϸGP^LD$yd ?NTr ד8_Wm;Eٻ,v+ vU: ;/'TCxV 1ȞqZ Z1fXoW0lpcD1h)4w!PpḋCT7o5oS~ߟ)3DMװ;b+Ѣ̐VF6mXł" mX"cޅ/YjAh{U%!}>MVB*ͤ'o#.e\Kϸ(׺};.b]8#,"r"fSm\Td~#H͌M\S|֧h?DC(cӁjGJ= E ڥo pNeMx뚭DJ=')3<0RҖr/p1{@Ns&0%IU: Cw~: -@&oW_͕`ų'I(qzw%NU ͳ77yՁZ^\U2!7agP(K(!m tTBecڞ>]2Cp^ BGHFd@"JvWȸy'zP-:b%˚S݉In>(`  u^ 7ڻA!MTb{ԜE6EߡQwRl ɤUD#V:dI/!25&St R? }gUMĞҋG kB caKpǕfQB+/ƽѯ`>o@ % ?T{}> >j}1#HnCYIrvMZLs00n[fn:YrhRy*/!p1/ؘ f22ؿ75UOl1)ysͿpUpaԃp=zϾ1bt\V^$NmlJjDnñHZmb|Ew'yQ@t}M(s [+c[.z@n72s1XjM_tN`e S [6su&u;1TRTX}@wd3q~r/F<B>iC=`(W)!_\$HUD h,BٔƄ{ :HE[۸XKD8,$?/fojYǒݗ Qhoa9rlh %{Nn뉭JP(\zTRlhu5фF>iFiamM=0Ai;hËnL`8jDiYEh_K_.M8 {ӝ>w2 wn[V{Mx3 o)-" 亟;@@:aW$% 軡!5FsWbw D li4sm> ~WX`8@>Cߩrj#N_H(-.Z N2~mop<3ޅk `QY|mO4=uIMG@tZ9ӫ>`#-g v].BY MR[[ N!kLsgI \.Nʖͱk{%y~0 U6ڹ;f.gD[T3NF"S(SlE kn→2v-(JH/?7(b/b1:kT⇚OgO91Q{ƈ/O'kR~ٷg[)|&p$t?nI2KATڀ<%_]7o `r$J0g,-YCc` ЂϏ^ e;VG)׿4ʱ6V* Cw;qO<jf6 џ\qzu&sl '߉]Gr9AKc}SF5{DG梯~Y2,ZamA 1}3%!*H5()f<3ǘ9eWdނ\%P+ el`F\ ^cje}[FxHhAe{om< |%񅻏E!Gع9W:FRe)<0&2@}| aLmB?: I$@+ܦ9"~>:[w:oyyTxs: |"Id[='i9$-~>cHf "t$2Ӣb6zۿOc|\Y+I6Mp"v`Jh7N`10duU>> n{H|~'XISiܼLl z]=X:ZR J#&ܟKÖqU׊<X%%\Y]=0Գ!rdϻJvCҏL:WgϮjËXXj0썉 H7bE 2 ÆB>0qχگղg}^DTTَށ8u{p4|]Qavğ?<$„oû58Σw0XV3;n0X;.,._}=YZP%݆KMu-QUom˨ g!rjբ%s'݅JCTS͈G<hWZ.0?tu_z#kD/̥Yw0'w^ok ;;H0wd|{ %*|j,HmBňK\680oLIb!0$ ,5|uD|J_> < 0B]V[LVؚ>8_P/Fܟ}G{݅HNhY(H==__M_?!vl&#Xke0&e8xv#s+eg;º[B}=KJASJ.R6Z##U]J X~frmK\w=K6<ɧ:5vWN^nuƳh{i\9v0A ٽ  Et6is:ljJ5Hh''$Z?:D Ke0^^\;#p6YGZ_U?mx*iU.yTf} T cA?5C+`6!7D!mr*XLe@Ps j{gKbצq&Zy5+n3ʼnhq@%dGyFqZQ;,K9TMRa5 v.2Sqq5Kz0 *`FU-I:͞wEQO6PՖtUS]` ]TEFt4qnQt=ls`FZjr3ȺE)bYiS AQED/4iӞ\@A۞tm- B zHW$SIwRj4FgO%S0 g.oה! uwB/Oph%/5eu~`Z PeՒbF;;9H~䚪A 9$iQ ; D5F3};]2In&a<סNY+ "Ld>7/7鄲IДٵ^y|:ZE)0n0q9-ޛU|kG`+a-B|8 Q2JX1vp|ҞvJ+n5deZ\=aTbt#O(x_Ė3W".CA~; W_ttM^7TGPUFbѓLBIF'Gpm`QEa,j;_P3\*LT sY@t002Sq@=p GR]bha =i$EʚY_6ÉN.t|sC{:CTh9߆5 c_C#N F}dٶB-b&n)*%zJL+vx6j(IV~r1AdŽbbCdviey\Ir wIC ,hb .ԃvyj)y3۴`SV ʲv@ ?{Y,J<#M,)Y٬6mu~`ZCa(',*Iqg?=/1ܺVB^NkfFF[?`V N[!BtXMBmD͹k43ʳ6hBA< DHYݭ -qOЈg^:Z G ]3X6qYg ޖ\He=HyYr;reieלV,;ICT?h!:Zdl#!_ Vl wDzǙp՝>3XB|˒Pb/:Yv ݜ](I^v60f(]ut18oЧ1` י*I2H Z],%&(*+R^'>piqF{Qcsg/^ynLfiM-$LyDHO[G^Mq ]J20£Ǘ\]鲀Džs5œ}LtD Do,Z{WO D|2ˤt{gCA 2M㶣Riw] @LRap𧍝ߋ37Q凷{IrQK'4/\Up,d7;$TOHm6| t)I^tƑv|[3 1ӎŵtڏ$ &}2tdU #PFuZbw kݵϱ۔nxigRb'p4~UJ8gQհ6i;ê^7y_9SxQOBa0\Ɠ?eRjPc \bmTڧ5RIS:)Un^ Mkf<qgr]7E VLKFӧA0!)@0.5HC/.^Uii>:Nhi!#U[zjck^\).N`"~ K.kJCLZhd"d-N{oHC2-lbR4=vSwбlpTh,I/$D#URAdȋY\^=,cшHHؤl>#Wr3L\:aokS3db.vX3$} ;/h.%]X-G#WWY'PT?*}tJW|m,PVw{`7 w[bhZ̆rCfg[E_Ϸ1·3#R36[7 AW-c& B}PN#-3p:N(+K_a&zJE[k8:"?#4N$ O#fBT7t޼\ ϰm:z&IOo$7ؿpozڒG2G+<ݥpS "B9QC$A"~ꤢ8)楬u"c;jTܤ ߘ/8RK~ Caw ^?EEvJ$tA5%{]7XڀJ#+Ob4SQ:p<6tIE9E"j}" *"֥:, gҟ-݄,6q$N0$ xll,,bTZC,^qpLdN`2ȱp {P\ =$[W:=HvMcS*_`s, 2Q2^#](,yT[')$vFCs{TK[IRoT^H[!S6_8|^d"&Ƃ#/}!/CXݧETNxfL\ LT [Č ^s3T.8XwNNdWt& q}%lrmGJ[YgKуdóq)hQ(X}xg[##_dN7 mlܸẹ!.rj+6Gq8伭.n^ eM:S͆$G(;iUYU!d|>x$DW|?Da]ڧl &|&_ ܙT«9 dx.(WɂOhD{'O޽*邫Qgf|7^-1b5Vd @;-2PtB$;d1P|WU9ƝTFy'jUj (T^PIŃ/Аו!7vĠY$_x?=Fsp,ala93`K :ʚ"dcYXK"@oՎ3PcnJl.n؀ŽU`^wD j^LUo$sr_/ k73IG^#6 HCf٩/4ZEywz#`ņv`l:PW/e =pl)Q**x*'KBxXYC2jdz3b@{Gin"ΑHQPXO:yxbg:_Jx%w&_+lE$II=K:eծ s6Q/h{sk`Uj虜v~E -I V:ոB)]/٣ԑJxQ^Y"ny=_~|z=Ei/?ePk{G~E3sf?ڠeﳾ_PټHڥ=|k7#FxIk, ҈ Sz$ |/+'x[CCT-*L6{ cݦ_W+_VG&JF~,D1˂-1?'9K)ui$)]5^CBcu@s5j L(Ø9fzɳ_`z\/OW_ O@&OM)p&ٷaI[Līqwöx𹥡Hm418щ%hj[9ܮ|-Bji4LD gf$RT`Z+TwcFkNw Q{^,SqKǏ1bLG vVl$X|T>M(!.QSiDfu ʳp:N" clwU؉ΠF6,?A{@\z"4̡j^ͽ};;Ɖ,z R˓I,.?bj4i:tnb&+i6`[dK%w 9^1G gF@V& $Imt*b=-1 71 B qA/)(F`H[|aʼm&_VjCYi|q-w7(Up~z G]eL tasфTUMq.H%K :fOqȱ^;7³X: LW?A&Ά(PV](.3]ؑDeBPiVr+Mu2|+ct|p_/B/c,;Wtл:E o(Kd$>scx_mQ晇( kb^PA U: n{:1x x3:m m# Ӊ) ]u奘ڇy ^28 X}h"!T50AnMu$2I㱞^!᤟ t#ȋ7ѝȜ$ ơ0p38V@o& !bve$"x sq;Zni~!95e[HAD̩d{'<x7{DS$ %ЇwMCPEV>k_[h'vv&XX0ϚG.Y+eMeGnj@%Fmi{F;آ=e[n|"6%$nP 1@%v| { `M/S&,7"3?'ɾ$oY1vB}dpy݅>Vf7T6hCx"dbs7-CN ]L=O:>+TmON\FN ^r0!)0Ny`$~{4]YߙK;RKz>۴#+=mFAz ^G=F6 K >F{ g,)CM->wRғ|/3lF*o rmF г K KfA<4s(Q% pQ"dZbx.~C5ffrK b~*# wК`t*ze­"ESA1EϓרxN v B@ĦȤDwl@_Uץb.Gŋδ#BZzzr l2%[ފF,tF{mn `s@^𾢙r>{zcV\R]Y`u)쉈(FihK=$U{mF_1OlC\Kenz%BiµQn1@o y^'RaEASWzmYʚao9Kv)V GQ|M= n9 g_x u?9,vJ'Y^iwNxh)*siQGq]O9u>B_Ys,"Te KUuW0c 9WĶCZBrqDS^[-x4/ y7K 2A!搘d)Ņ|^u*l-U+qM3k"Z3OؠcЈMW& $u10QhNcVܹJ{53ܴ 7A~j9H-'srqGѽdYvC%g]DdLh~h~/ *ˈqX9&0 HRE \;u4g FE8"&Twi29C3dv]uca!& s>ROI/Th{# h۔7G\QLCBT3HW'_innd˷G%L a,*욮Pf_lH3 NiE. M铌fw꜇kl}zo2wRj؋ljhA1HlaYA{6n~"!eƨ8d=Pk$#3)4EI#OV wP(&^WmRv 8ڢb[}ѧNH12"(j|n4əJY_^)ɜPƀ_UeEv/TmڎЎ@[dNP^["Hg-?1Ӧ~M] ṣ}7=UP0 PI59 }' "rPpر3seyIg0]ɻiB(qKSdseqdDxqOפڎ%-,9D!MgNP!do+Lxꤝl |KFF<&֓.GY' [Yxl+ с`A~06GM_^;:8=[c*O\ "d\;LD9ƥ<3е=Y\su΍ ^P>Sd"inM\e\ث3\_sö>%,*,ȺS#k(cXh_opc7kn-Y`| 56J Urw:D8dv*Sutlq%F \_xKW9MFuZ\_~E@;(0O #):$ԍfN%r@aCXNn͘6<6Ŋ:WUĨj0f纔^901wQ|\^Dcze[iĞn]w!آvȩ>[C҄Pbt 0|3MlUچu=3ؑzPsMy{<6c&ƚ)Aٽrd0#gTJ**0YHzs臜Peqh5x"]Ku֎Eq^̍)zJ)?H987z1{= 9U"ŀzojJI\ErY9ܸ qLx.(m02<5Rzք"5ݼ1r8rS B;OՀgh ~CsS"b];,lL4#7AK]3B\ARқ[M}ߠciϕxNx;tUڰ~>hS󐄉L'aʓEs.™hS' @O}-k##p˷S*Z6Jt< 1 id'hUz=ʹ\?F5"7C@ DBYˠ]nRsOO| A`PB󂲕4b}4$[ɨe%T~B#J:jwc!yI11WmPuQ+B`7J{;2yaqͳg[L7J x1 8rrpHvemҌ7?sZeyM0 tJYQKIlBݼm?,haoܺe1BKbM͆gy0)K#\N I%p/E!)"2CV&pIЇE,b=b@-,?I3F ($,.gõY`ϠQ&bXn Qw30IO4o>fB F)*]FUݬ ;\KTD`Y: "cmRtz9р?-ާ0>qgrC:ȯ흤vHFQ$= $lc#PHu+ >|pF)nRj郎Q|G:>8Q3V}QC \B ߍe\<ذԹ;P~mU|Í1ؖ )2{;_$."Y&,wjl˛rAÙY?2 9"꽅 xƲ( ;ʪG)o>/~@d=!yCg٪r)i~8WAZgEvr@ÑLNN}9/ø^8+x5ݍGuB+Ť$Bu y&ΆI3/6ߋӪ%J4 !2@a,`"_犔/0\>v,D8Q iZ=/HPA6 goؿ{,T%ShHd~Ʀ|%C#S8{wĜyq |_NL-!8 d-1(?:{(S,c xfEY;`b_-N=BTXf^Fv`l O[|4[m? +r=fj ˋP"=0w+50Ym #;gD2#dUuᐼt*z]tn:8",1uق&,Ҝ5 @ MYD<67廵}"I$ܬW۞ ]u *_ջ QѲ8)? 9Ӆյ[ J9.ށM sX;玘SUl;g`>6#ښ7INX{"KRjV_y\ήS9SyXA|x~(5’ӗK]G$wa\r@HAfNB τr㧾7Ը/;pc;tw J:qUdkk~' (^&]5: xҙx?GjZf5PX =c$_6/xK|0NȃQ_-R6C?#! XA Fok85!E] e{`Str ) 1 lMߓ  1ac !q&Y0y7d`z̈́o5Ŕ$bo SDC<`zТ> K mQ.ΕF](R'f#JHD`% XVr㳐,Adm_Sf1=crh 5nU I<Wjh BD\Gky޷R#NiL8!`'죚Fi :Vҳe_ cR$2ŸɫA)>KTlk5*D5awf(fduh7g꯫f:Iɑǵ"`2bj|-C[l˺(G*p[k6pgbS}sNJ]TQ+G\!5q,L 'H5T`2߿L QJ ݀,ckD-`( >.FӍ!`ƓryǜeXd!IUpQTg{n ~OCsɳF,Z2i vɍ^PSoBs\ifi^ѻ᎟>!NMjzXLvRԐV¨6Nh5;ihSƵiq\\ѝMtUD^I0zӵ&SP^le ΋<:@뫡p#$ ̌$2iP + ]i$XK=B 9TZrKR4>SB!n"s/y=%oL^7(?>XE w{LFŸ鴖Ⳣu8"$9C*CAxVRv|afaD6# #y [:vA?= ߧ1M4 .FvLJЅᆹ#Mޚ<;]>֏ MN>L;n+:uzjTwƨ.cED5$tVnӣ")Ygfx^\5~n>5D=2W$iLo?"?T%lpҒN!5u% ?VRͩ'ʀ[ FgqBJ*~**ܹOd0LV`Χ`<DŽP¬!NTejy;WrxoF!nPg(|)nV@i8tácuQđ_Zӡ6txQ=+LǢS7 :#usEύw(m>PDaf/5Q*)Hwc7ժ:JsJGq`vFjR%uqggF8HI'174 &|>+wjѱwSl"o'wM]K].ݓu*xHnt ӭY峉wʘKR8LSPCUScF.=l6{2 ܭpt'oFiSzWz(|bUOx7^}sO!9Y(~d.Ŭ0%lmbdrgz&XoY=sxrHtfV,|J.vv{ .AjJѩh:68!oũ3}4~*z ^ tзɛjVKPD߃冓@"R+i 1"~pBvD^ eW?Qw78 8(&@H':'H=eDfxmDkb_kOX gD*IC7cmB+ vv/:"TU3gc ޭG%1 ";g en*)$lsI /[h>"xpѸbCAAz'T$ƨEUg'51%vu@VT 1aSgOHKpm)vvKVHsS1Nw ̷R{?!bn 롙ۿQt5P_%:^S;է5 %r}tqZ *R 3XZD̒<?;y,hd 9ׂ# ցŌܮ׃#(e{MSy{x4idne NQT?,8BaݢCMBzc~W,\i@.)%Z>DiZ1I(M4I\a/.'t dLzsEYh33l i%ϰ@\jGW=AMޮN_BC 1Jwy^<cԩ`Z5_(-;\A#ȵ`7`'$JL|4 g0?ZVP7q0](vlI^&v{]_˒軋iUys%e͙6gQI2 צ'81YuT%u.Y >V1,I!PXڂUώv_4rV/ڣ_|snFglܑ'XQAQF7{ SVR]DXN.$/sF^)Sp>!7/\L4Tҧ;XV51-& U^丣M2%Ų4E%iM`޴oc]Iт*m^8ަ<ә&rǩg69%J*ʙV}삤 < ߛ3@GzAF++u5LU$;Oɛ$BU1U\{ Y@4 <4Al@N+Hoi#hL6wwƣ;ڿɗApvjU;?L.) (qjXKH Ȧd]4%XE:O* 6 srlt#We >?lFX>10M2NA n;uD8(Vʁ9 -IVZ]fpq=Ymݷ4kq00bbpfc,J'MQ TAvU׶](^E!ݮ 7 zE)hNv_5%¢f Qp:E."r3LR7 5[;)ʘ/П[x>X6\[`*Mb=׏q4ф^챯ک#+W2p}@nt?.7NDKp")I@jg9婔N6T;O\yrZ4JJD* ۃd-nM0x6z@a aui Bk#`-tPISC̺Z..CߡJ#$QѽjlgFEM1) g{ ]wCt/qyLH[x!hQv9K Z̮ÆV-I#]Kx{xTKzK31}L"~nףgwEC!fR7ΫCka]Z³q r_zVK1 HDu-HSH9= lyz+V"AH#siD9q_Q'7fM2,VT/{r"ޮsVL dqSG.`K]Gԩu ]::ȸ^[73&wE#=كL/z(U{8O[Q;1UɕJ_(T;4_7ArHޢ]3!:_:D񅵠y)yTE;3BOr ?R>[P&Ҩ[^`X2Xo cpz*+)i$jDXe1ɶo!BpM{v}0iXR3Mo&Vqܺ轐`vWeu9h`$\>n9zr!7;g_m{8YkH 1aa>`I Btsh!0MۆBKϬCru#6VyP<#P |貝^T/F(C%=@f}Z"0X4TYj HoZyRr JX)@@_b*($[ * vb/]l[yu lhA`-llϦBt%:A3/BDĘ k^#Ӡd {{i5F!ͥ:x"B`̸yx7H;ğWk𳵥HҞ [嬖6;{_^^`|ۑY$U_")'sCRF2 J)Sـ  Co`0l9?2_NHM[ e'CWڽ7,xBp*#`ԺyxX({k!lǥ!t>i&qr383͵K Eq ]h`?NɆͩP#&Jw&Oy17mYő;L sH9l g8EyX~1MX0^)KS KkJe0 ~7GnN2\IP0HrF?BE/|c}mFdmBQ6y5owo>uFBMh\eF9mkӂЁydL>&qe:9G#Nط}LX-:# ls=hݲ2C]ûCdb`꼖 ^ænFI 4a2g|+%B(kPXdNSqM'1~8RxP3XT2q>Q}txu,Ct+5g92eCk84^7͑[,llv2h)xnәʷ3s=~?ӧ+3H_^~mč%,Y,D6e˽^tR6ώ/?<&!LCjNnH]l~9};4tE:|Xt\c'T#/xF=L~TС._Fج9o 0휌f{ˡj&"PJGpÃ$Cа;)~I| ڶP,Ot5$sj,3iڤ{WZ/0e~Ob5r0oAPQpd՟V|ˊOޝu_hwͣX(S.5}XzKFKќw,ې-R414V&^\@DˍWvոhh :>͔;3>xN-Q$ SG#ud6` T۪L¿gmQiCb>4nq7. YLp'M  dxvfPk|A抓? OEɧdRz2gȤk@1r˼xSn`ڴ@2'rlVoS^(C/ajp]m[^ңr($huFI Oh/!Jȅ cRd>󇋦ʜ Q`5 u# 31SHRCv=ĔBpe\k .nиj{>v GFJB(6#X^NeѶy#Vݨĉ 7T%Ū,0)tfzz.w6s~,0j'cx!PPj2Y홚TMOd@gWx{aJlٓBpB0$ Zw";)٪k@k@DZ b'ہlM2@7n n.)#YRy:ER:>ysͣT;w/(NYg?a9B4<*GN26nV46'0*H So]CzBx<BjX \!AZ`[coB'zgjKJ\[`;Σ۲` Ӈ@[е)8u'4&y&ؓ芽_g֯VpQ Ȁx'/Uߢ_#N;[<>ګ&La'F1`S3#vvY, BpƓ )#5̃[EDwƎX5Yqt!OoΚUDW{xɸgA_jGko2N>c}tMn,*Nv]=FfS ^3LGG\12ڳ[?+ٸP|iiIxZ&&D8lk7<+8oΚ4\_~6Z9da ]rB@64C+g%Ѥ6+(GUNns3E=?m B^ͮu #B}pQg*Tvs+L a⸵?˘mB~wWYb,*}iBθ코bn#CN Bhf]|&O OdB+~nTmC1ZM 񩗎gWYz}bF\£M Egge:<4)/Z_UCjҡMٱ-ȧÅ,48` Gy yM3qg k w,/Q f 7Qs{"v_=REO\8/|Ofʙ$kXg(B @468d:(XO7Y e K 9,>*NP+?Zߨqd;R3_mJnq.6+ !gtꨂYReXzEBqh|~ɰmbGDPn'LzTH+=e*UcXo'w/DcCǗ(:tƃծAj^?B7mMX]ǯIHePizn5=ns7U__i6o~,0:@Yˎ1;5xKתlH&T#- kEH4fUaOw D wQ ^hiʬkc gqchaƃ wV>(,$ *6)}, pՀsT[܈qKz\ .}RԉnD"ŒYE׻ 'F 5lլp7+q mr,L?#Sڙb4h֊nΞh's2lx.A\piT%f|n6&>&Ag"߯0bryU<(~hdYL{x390 2pg9nOL,[])mI4jvdBYNRM3` Ww:u?'A}!ÄEw8_lZ) 3ZUei7DA I6pk窨p:6҅ӈcvVPܱp4oc :9JƧTMzlj#@m793,r-U*Jo5 氕`mѵٓpu/xO{%(UogxX\ >Ldz(w!_?wVi*6 EDGl|,d{8s yMm?Cx]$ר,!Hi3MCJOJ8%-QzMĕG/KWWTQmo ӗTyV!M N(*碉 \bp&s-Ui/7[ݪ,.!FUHIbIwhܰG@zvp.YЙ\ Z%πy$nڵ4_*~s.#+rJzK/| R6; ?nx 5G̫(~jXS>r5^Zn>@f8XXmd `?(xGd&# J،þMABp;JW!MA74ZƨZ 6b(2T⯸B?,J`W. w ],8aW4%,.+Oď%.1t(kJ},C5|7wm10is]z3aBQéD! ڟ f3=K n^,ΞƂ-=\v}~~$GPaƑ17iݎP]+`[`#^fRH=2ljGDE NhmO=F>:|3 )ơpB ,+3Rrj7K~Ba;+myw)3g;ƭY7jt2!r֭2nl] ݽ<[EdHGwިNEWjZm,Y7=?@WhZz:Ou)T3r^$miD6(j@ʙH ϐ/9) h^m{,@q["J-`6% Etgjbz#$g x$, ]pt&" *P=W@.uXY_LwV_]og5eT߫Qm/OSB M`zs d?)y34jyʶ7i,D܌$[Sң&(Ò AN ;tL!HYn5OMi%bgRS5°E\NMZf́%4=oE2Z$$6i̽wƶdF M,#muI?odu.PΊUs4KܥSƆY_f El!Mv@*a1:sxH 3hYƢ@!Y"&ꢽw̸C|iw>p[O`,H.I7OTs\/tdwDj}q^P41!8ݰzɶD@!xkRKr> l& cY7.P7p^sϱrEBLlG~7uzF(`CYrHY-:oRTuwz 6}!L 斞y!>Ñ>obhvte yOf^k(СySPoJs&gfPúXuóYT-աɮ׺?#lzSݿחHE2ۥ%[6¿!7@U. Q9xr- axSaĒYB;*AE>lQѻ3MX~˽/>0q*GӦ_,_ZUr~5''|]rz"/Ո۽>V+G϶*AXQS nDZY d~@MM?r: N.tJs0HZALNu!UVl~qn֫E5hvC$ɺJ+3䕺y4Z8tgyZ 5eI6PH&FJ"`n'F-8bw f)tH<)Cf4$06˙;L.wyVؕHFG쫱 $izFkz6wt AXRg; ?-.2iqmi:`??<'Ju[M&" Xy/f@ɷYPZ^N]SeKդYJyFM\*Pks !&e^]FIkE |$1haAZ(M@:Ej?77=z&Rz0E|);ARsB [;R>#.T_L^j9@zbΉfIV( D\#А+# uM#{6]Kʸ-A* xG{B^V(\i5M. .SR ߃6DgQ=*":wJ^Oo0TVhP%@v"xs=fa9hV>*6c< vbsCO"x_zB7t4vL3N|Fs) RBM FPϪYꡜ]YY>(A;01 \1-YNPќOX;lnXl joÄS5!35N $G+uרlufN1GWP_OYqPBu{)1 rg?9ښ&BpYɸPZEFL2^\sKB$,-K n]4nro+eW _~XMrP(Dgaޞ.+f eFo(U5۽fLP! ?Ֆ̌{>r:"{3UO[XEoC' ܴUO),[ND_ C8SR6XcȤo5V ])c[ߖFO42'/G xd޳SÕk\qB[K{لV7PV)j<0{nɷ/"" 3 zf։9Gnd5DQ;I,iDL$ex]uBT* ]wb PUQ$>LޘMZJz֡@ QH+r/?>$ vtjw+iSТhY{>l-lps̏/"ژ&x´ka \Sb|o\Kg$BnC~iSJBИD7s|׷=I1LVi@ ihcrl1 馢=$wyQnXi*|0a>ɗ "'ayj4s+8ЧҷQeYk /(!^R0M;c0 jDfQJ!L)LN \pJsfPHqCL 3c `4dzV{ jk(/N]fv˗v6Y)^IrbyH̢ 7)d]) c-G|EQsy'{١KxEgU:U \O{o7s+&B62e`fνwG'5m/ 'Y5j?wZ4+Xh Ƴ0f9L~CEV:f$UK:[&!ҋR tnEh%jQP{\cA<%'**ymc5vR _ǁ k2q31p#C3;n{f#CE*{eL Iae,.d ,+ oP?A`_UU'^uJlQ^sy8_:M ! 30cӹ9@p揊~$ryOKQ!k/᧋!1yѣ(E+[zYOArѣ1*^w=-sœ1|c*EN]C#h4Pk zd)€Ү|lO5P[O,/K, 685K[l=xn+udbmFC=aL P+ylSh mЊ-ׯ98oٽz$w1ĵڡe)^nxW 3y$jN=*8pP]}0ЇWI\>V`SH? :+K <++qQ'0.݉0,/b7Y4s4Yٓ( uYKlN-K9,)Շ# 'kV\ymspZpI.`?2;45*:j6yͼq3/w)}:³ű2rTAn$:F}p%ɶ$VQjE?O{rq,se$(WXݩD,TgH^Jde|Ghqx,ŝyUNGءJ!2 _}ij2q ;?7RM|$Znx )g7w*_AعƋ$ۙ~I hWJ&Egg=%Η;Phtecț岃n`Izs5Wc#JU *9$IShCysǞ]=A+Β½}a(zjw b6LN|y`qrJ dA{V6B=h o>&H\) P`Tdrqp^8.9NgIH(4]Mkekyp P1HOj *-4%i~ʌZ$I=`عPTZ?F)+PhJlÚ|T"9I/[9IT1ONu@ zp;$R `%>tFy*b|G]{X*2t[ɳia^ c7r{h˱_+:&tOgc8"ȍ /Н:?=%DձEℼ DF^6Ik; {S/=Q1x4҈-ғuP2\rdgWkt{AY3yr&QPM @'9Ea$F\pNP(Y"Teh8 _p[#};0 . bu blY|7JL1e7VD3 tf2Y Ei_#& # Ei0] 2sZ' @IW?5Q.|I`EĨ8Z5\ m r"j74#ɾ?p"^ƭ(oܾ A]4 Fk 3Ko-❚|2'7+Ł숽p0(]̯׏$ ŗѽi5ꑽ2 ^$AFXդ*^00m zSO8k; v3,F˽T0^#:|I4?n>qYL\3(٫Ud,ꔪY&t7z\s#yTQy^=WZg~> ϲV#COVJiyꏐH|KG=\\ N/F雨-GѾ7_Џ p]?ђx"̖LL(9|;J3b)606]V<ӀXR 1jlQgU+t0(l &eFʭ@-S|1B2+|,rDgt1#"Dmv5*Fmnx J.=Uf]+x|Yg}R0x܃A)_o[z_i:-j/\ZmS}"]^8m`|,ss"쩎2Y G:!@ <Λ/}gȈθ5&ܒ(Ďn,qE2urVuİ,[ %.lTPq4 6ߋ1fߊIXI !'Q%[np}CZiB?:*?u]ɟ|".1~Yws/>n75P[;M}X/yϼGƌܑUJGqHɯ  V[b5781yw-/6FP?j&t+#k/E cnJŰ(VWxFIqA(vhW ]*qc}(nBvLc9 h#YZRԈ&:Na!t#冄X[}+Pdw u5yA<ѹ2(#=6H{Ǣ4۵A[h#r-ttI H/ A}gѰRʧ{qx4Jr=jUµ'n4gth*jM.oYt} 8N╀9RQP8OtYbaT8[FMYvWo6Rii|=/W' V*QOMbcY7P3 ֍lF !Fa>2Eky31@_0'g%4'o0aB3T<tws:%;/#~{9Gٿ+ 󌵶(0C{]۴UKϳ~Ą}(c@{M=?Gx ׊L*R>9ܷ I4JH 6=[bńppH? +n`alKEإxrYp4cSy Nf9x}>tC8W S+:KW9뻛v#+x6E"qƅY턞0YE 8)h1ez녢i),X.djTE Vg4FƝSܠL?aPLKOP\6$7ھ4X] nHpH3|mYMK`-rFC-M9SAL`NJu%x1f,YJPvQ{Mה G=e+0>7O j9&aq W -Ic5?`zAH[V;Nj?ۇ[t>5)~Q1L %:r_ *^3ы8jB5n,|Zn2~ӭ6 ɖx3qƝ1`ϛttu]AyDmNK>y%wqA3F-k痡SCIiHB\tR)c:MJ^$כD'X+% աD<@" DhXZ$>S}F n^9 A 'ZbŀLT/ kPbڨX,-43{,ɜ;-H>WWI$aYBN u7ܡR$^B@J{GBZ|Z4۔pq~N?N_aQ)]Ui {ڸ@9a] OkZ9[3]C ]٠=ٖIyj´VϣvDfWe?稤<8ؗ3۸<؀X |yHGҳ&@8uQ߇\5Ne[NE{2REdd{ >-[^|5wuA0w"˟oRkjbA(4H 4Dv맃lZu[ԝsB r W?6bNLG `MJx~8ǍZj1,Bt!Q-  ?}(U:wu)Pn/INe;߀y }|>4ID9:ZO̅K)QQV(둙,M[3(dNAy̤+Ȫ>:c)= ZcL3#uP昴 S|h@9`#M oW횙"CXX)䅭fCydG#7]ƿƍ.aAԗ#`Z}3 3JőYެgD\x1}6f|-(pCuڮ-Y8#~``= `~5$BRfۙ<,+<n/2@&Oڒ]SBkXeJLت2p/ QjC\BϢǴYe"Nd;.l!joOyң+/n9 }r*tF?<CeHXt[C$Tto1HD!W^ls,g&^>N Uڊ@)ޞnC42bt&MEx>Ќ3sR @Q_!5+vXT1/L0ͦPˆ SlTxAv!Ɨ# H<<1YKn h }R7Q@sNn[dt"BդJ~X2W9'HL;T;[Qj 犾7jew~,?Wb`:G%Abuܺߣhq`waRjdreN;B;<Ȓ9:P&lۥxy筧!f dޓ#'š9%rĈ$KՋ>#@!Rx*Ev>ᖵSjx&ސKL-U"[JhA4䀰jr.ƋKC(m*Mv)A.t|'87~sƒ>.uЬ/lʌ$Z} R L[*pQr(e̊pPІfJ٭Tw!uڊo)dj@W? TnfNϤnM{AM>WBT0[i3%~߁9KfH7*[vL@]إ堹Drܨ(2%UR4p|DOLzp./&9dDT>5y/2,sLEiA#S ˆ^MCw<Ju|3PNn(qeTP؎qYK'p2@3L9+ _>c:((SG/-l/WUHw?CL64,H<퐢 'ɏEE9S &uה̼uv9| 0um؋ޚ"@}ǩ Dd>(I.z<(BTҜ?R.qJup8"{𕛽+> D)<UP=WX}k+xmhCyl\haɡ<3v-U8{ wY=Z2U5wMM:[C6:\.$pl,>vQ5Ǩ X+wfԑS|4`g?x ߔ(@ N7%&K\jL"pΣN$͉ ET1djCfe/58 du"(<'~R&M̟R.|G`t񈜻QS4b^Iʺ?)Hb v=wdkF-epN /\ ƁI[PÙjzHzOjc/hcqH_2dr"Ί="lՔ ;6 {R[)<%,+ojʏ`176ZɾA~$( ⧄v>i/;L+C k(@S:h?F%coF_=o F,k,>aK~͵*\%zQğr1U ŲObm%"=dJ½hwMōtJY_iXY?QB$Pz@ A"w<@tqrQ6޹`ݙD2h 1X?&~4 K`s#p֞o< i-OX/~iܫhti,Ư~GrdLQv~,3[IWGbL3&e` !P_"'J- %%h@;xK ov`-kQoZx0gp>ߘ7AҧC[X~BT\C8>}bH8#PI-sKhRDnDPZ&8 v 'CI%E˦SzBՀ" _# i77wʩ=wI_ڒ Z4wDh0=3=?az_(:+Tyfr[l./V-^|͏QƆkz9T.ӏW 7=1S 9Jo^Ŕ`iP\r3@UKC3ۈ~^͏xwz3+D=Ā@YTڪSwV$t#w玓(}' q [|_;Өxǩobkj;圓t/[ցBɋD@sf۠l"J7fhmIleIHaygkWHct1LT5jmH{001}*[vvZX=Sw첽˞KW՗冤NXWl̓=2!U4o nI)r;yg_B32K=- j3xݪR^*[;eoIi,ͨv[wf%e`!mݓ%1UA+BȄ,$s>Fl +2Sq^@: 䅮 ^v BF6&jzhD%njF1jMdEN_}ԕm(X"#[0 T$Wo7қhqr詖E:# ݽ`|=+LX;H89O1,+T$j=/1?7lq& %v! Y_`ؐ9WC3t {OD! Ll^],÷q8 tNj$Aड鐌"/<4 Ϋh$+G+IDZao)BaJU|$>ٯuTz-Z'&֫KފJjUXIŠF>B,-'uq]C*^Ç {;|ޫ̌bw#r&ڜN66ZwEMU;I.bJzsXxGLZ&bZׅxި60iSPÜߊ{A鈽rJYm8\yyc] ^A5dRc޷m\ UǷ fUۯu[j͝zRi*?u| v-bb~DTd#teK-@ -M0p&2adL9&,E^ru%\R:7%h<{O{sb*dUJ~ʸ9U+^zƢ0 ~6vf( KLl$Fq"@fݖمfJ#$X3 '1.}ţHγ s)^Q=2P=|)JqaY;l׼/r<9<8P&w q{ m ƭ.c H@w<%0eV^7dG33c V)U#[K&VRXF+D'5㠻[&p玥{#;PHmG'̥>Сd23tV"!Y+4*Tʲu}l\̙San ߧ+fZHY~Ϡ|xWpY^KĊ:M$&(#WZHc蓰j+0ܝZ2 Ҷ.,3 ݝ*W@i 8X_~?+Bb6"NTi +2ERǶ_>qn%I*9ONqoC^MM댈=^m0} öF5F/SY Z Amfa39Cy]Zf#"ԷX"mMh%z|A[Mv9;N<` xP,7>,y0) {qw`f|zM7&XBɏ[wGSO@ 2lR }HdU07/vEkbOnU?8,VXX]ɧw8JSHL+7P4 |ROM $A rnCO.|IccUƊ"xns 檊}>JLYY7oaN  ed^YМ %tqKP  "K@zH[ҠvsJW'͊vc|?I7h_==N Ɖ8"Q"iR;LuM&C#gk(W` AߞdjU[NEu5Cw&dF`iFMv}qo\\mRb<8wtFCԕT3=\mPmeT.Au eCy ]o R۟_Rw{`7͇W FFj~XEEiAywwg.[*UqW\"X#v{ .wW|$k3{>pg׍-I <-E*SF`"|HQAJuyU *,v'?`yil#RvL^)\ʔCH9:Qx>UwEu !! ƃ. \Fj6+I"9|_~e`VxܗR5$ّ=Fq?*aC(#SbqaGu2[f9yj0  ո8<0wleNEGeQH}no%mO4tpX*YX`B?^ٝ*Ȓb Ga;ܫ~g3ڥ'x$t T~tg8PÔfW1>ِW}30VrSםx E>lyΖ&D^3 4l)t O[om@.^qEC`^ZvXL_aSA=7q|*=UlKHrvƅˈ-&M). YS4ª1j#@EW; }J^j --lqmEH\Y~>HK@ՔtB*hY𱔸3{x>e(x,팃 )Qi"v>/~f˭LI)fr N6,~-.\[XR㞥4v1E"jz{\ ®20^(. !pF MP'f]g)WnNiNIx0ȫ z7wܢ,h;9e#<D0rUI.V0iʔ~*Z p\P^w~g|Mrю<37= 3dR6WsM.P 7`0׾ޫþ+{j1.]V=ΉzOqZ5ҹW Acf!:b̟_=1ϐc@>HaD9H rW!BX &s7 5(]z'AH-`?ni$;†o1ScjDaZݹE sjّ %?HiJv,⽾&̄r( 1l2ZH=mꃕ-? !$!O7Sѽ]nAσ3%r=29xܔ.Ik,x=N7`ݓ<~"` PŐ 4BZ⿑0. vsFTkA)7ڎkA ⋞Kʴ<'uKGBH51$ʡoEȀrXA3<( ^Qw ֆ8`g5VY}^^u.@jB[Ti\bhEKwy =D/1»sD? coҷOtNYG/j5̦|~B3HBbc6zv !HAJq-*f Bhfl,l^K–sծD%ig2m5:}n>(&S;ҳY:1o8Ҏ>:g]XuxDeh_*Suew&h]1o\{4`/'x>fB{IF +GߞE jjv=5":* WOa4]IX!K?. :>s鯲IX14*_S^z?mR?p>3>F)?"'[c/Xx NNvQe}{솛^sr01@C1Ɉ;]m.@(GW_!mILa+~=QNØMГcD 5ݣh;7 ]p2_Pz1=&/*=y vweXENhrNҵkn/r%#2ѨiZ]!8weuV~dԱ;Fw|@ G %1^fD*sMSKQBenjBBzլp)qE}iޟ=8t1 ZFΔ{ˌu4>Pܞ  7>oAB0^8vIBYթ x%UT"]/ ۔X:TZە+} }Cj]EcI%.G*T4૎ߦ-C3Rq`âw9~g@U^ҁgv|)Y^Wvc@k43:c>jOdC҈\1B+:ۙ{=;#T vn2iL-66cޕ P8cdqMۨp0G?f[hĈ[t`Yίtq],ki)ZxRO#E)g1Y$ fVq$ۂt'􀳬}7ƖgI!"o"QJxR 9RF5h+٘صM^/:\>F|afr߃El9m\,_:A9 POW$ H]m~ ġQD mHcEgdڝ̶n|p'Qŧ&UJ%>.l{TFk eoWw_H;+[&J̙!/lRkm HTFduÇ* cEx\Sֱ|1@JxDEttt Q̮ӆK+a%X+JҺL/8kdOe_haMJɴZ'JK^^EZ9 mqY{X g1k>#g?8-NA*e|Fg5w`>) >}Ʌ+H&,7D X ~MiSFjrθj<< 9p'Ֆ~!ݟE􉶿[ē_swZme8K͡z2snTWT \ ֣zqwϠ0Hz~ף0ݽ[r6 #1UՓd0F&<81ǃAr}㫢or/'&>!H4ф1D#UuWfW P?Ҷ/>* la1Lmej{t* ܊Af栩I5. HӬxӋQlVIՐ(Zl} xvI(\/26ɿ'xi 49-bJ#cddhxBat&]쟮r+l굥nD 3u Y{u7>N[!ֳaVZo~syD!m訌]fnTz;%.>rHaJ .}?ᆳgmxOyHiCi%\6jj0a$iMn]F!}ι]/**) )`R* :|BNB*ȼ#L]YcsizaՀl( $q2dXONba53 Tl4qƺW]읯Ղ5tE-ۍ{{ Ke3Ma8oQEgDӡ샄ml\8S:pX,Iт'䠾(*-D7cSnh!WU4ԍcqfU;9B[M3AB$}W,~XT(qr%Anwe^tBR< tL3H%\=bGGY7&MG5U>GA-D(K@FV / '~ȸϰ9@Xg>#s痲0̷J 6Ks}HX;\(mBeԏPȊz/ U\LV:L PZm!%J( J_K[3Sjyﴎ T)73@{l&3 K%B\Bu:}*Ja/mspI;i\ :Onߠ&F{VSFp pB)HMn F{O~q3E5a?ӱ:d}rU )1 əl2kưZ}l\:'aS/^vʖ7(吋$%KwIDX:y65^s9ٟ`ۅ^c hB*]O(gxk#'ɧgkV&](|J#p\1r)gO5hhC:uL\^xj5p5 ivhK}Bj9xD=Cz]צ fW)ow\ }uE3GObK 2ҍG<J,3XG .'}X0^;>A5.(6ab2oƳIRR}%uނqW$AB:(W9ϓ\rC$ڇtUKNGM%#Es&圫}mT\_&;i2YA<642ΧN96UN?j;RYӸ?$x|y^qQKW$7MH[:k~~=G ̡CcҙjK >$lÿ /Nsw=!Ea$f[4RN>miR`7' 5KmɶS/%rzc)h+&-l”1szԛ"<,< KMЫk݇AɈXD"%)R@}3Kd6L7DHE_?+*ہeGcp]t 4O9:B,ĝ])RG:)6߫Qb|R2!˭At}v:K;Z}zڏfNX`t2N x)tAr5=^}*a=!{ځLf~L !lv6P&sdK^n$Ք1F}`bᙫ2Wz+h6^CP{"7J-X(C@IX)+/\C[)~"+/Zɛ+1 nPC6мM5Ϲi°"!\z]H7f9{p  z=AyWTlZN'h=wR 7{jF=I#fIu:Dru:޳0P Ԑ́.2x"P3ǟEvi>y~GLÕ#f>@#R{GW3Oظ TG7=*j FEm<))b8g\UTgڅ #`VcHw.oC`N[A &Inu%P@g!KL\u"3iGKeN3BUE 9ؑk~p@kvWږH+ā]"Zx [AbˆQVhnC0, `\ycJ/ڊA9h}R,5]bZ+g:ޱs2kn*qKڪu]δ6K8geFan6IC5˫CXlo( rM{ 7i"$G/p"E#e;d.uC@{lv- L1OީY=M_8$01fl)aG;uCɲxnK`GkEpܑ#X6P `ƙfG-sgu9f,,{A+x) L k5(GOlr|eIXCjt}>WyE5Q 5X,TjZkC-im2 SoEtxz*'Iе V#!tLާwT M^D)8Hq;CҒ t:ϚNĉʱ\$_Q헝oJ|6+CR D9)Iv{(=|pNZ;cTsnZ419SSZ_puQZhCM- X'jaɻ C9l7$ חd\ɿE+p #VBF(ʮ8w|7_K @Wq.Kk5bӺvoLŁC\GXAiyQX y[QLFac4[_w] Ãd.[_$tUBKb N>e[Ri?J/?cY1F=C ._:k#,},!rDc`(=Y==D[uBZDrz%AT":}j"&HfËlEVm)ã҉q>J'Wia!RzUVsYеc-IBjiĝ͇\LY^gLDW96dL(^[Cv8}?YvQ8U׹(9s\#X>Sfh$B=F]ɋ))Y?T{iߧ3~o,-uJu6NI|+נSy_̦ H%cOeGC@A$KjW ɒc+t/I~{ B~_J7+/?kܰ.*O@F/I2v4ר-6ZPtmZU"Ooh1G~U *((ad\fl 4H %Qv@l2B6+ k6 H<\lШCEW~!$gW)hg?lI;SyD5VM(|n@r|FLA:4'`s)!ʅPha0r tgK&Yk(7m>:2NE3QGۈ?@UD9f3 9}5~X N*H?ɋ}LyXK/;DJDT2^/|>ub<#mAUzX[R]FٟKI'L5#+oNϖ{-)UCʒCEX q~:OE'ZQ$Ȭ[)j,H7&j}"|ZdoŃo݁MFӏzUL!Ovڪ8IF%Ȟe\eXf񚡩 C3VJoW#KHqœjE(zPH&QC]Tg"G 2+x> WFy=Jv0EEGW4>hkڊ۽O>ϕ+ aސukG0yllM)H[G soѕe#t¼ Z_]gU\,s<^g1ʳ)٢ʈ)XFosBG[S .^Qg~/e(A.X'U0?@ǽ)lH{]w#N|m[Rt & TP"l,BLUq}el>+rjEaG)9b^55җng9X[mMgK>D_̙^@_.'cZV3<逋{r`yڤOyoE~{EZ0,!msEDM2&U+V*dtmtRz?t s8784n0.2 "<'Yme~T&1ӡA_b䃴tE l:~O෽F('zŲhX>^hrkym~ R, z ws@ f{cK@-8z;:ymE;ԁ.ܙWpdDBz0+,/Mjh9 I6eUbmhIb\e",;EpGBfvG:g(j ZH?B2O=WUR&w}z\,湀 w"g3&N,-p9g`ۇH~v>C$]g='6hM vaW"cK' aMr`#H@%ez3s[>8p ~l{kh>b 15];NdA{KhzB[N N{f.>wS7`[:}wRBj&9AYRRrDBx-lje&6+1aXX8h0 #҅#1@eAyDy"Á_C$!&E&@S&yU&`m Mjt1ҫ:NnP?m(+AEU+h b/Hq5?3y(bO1q5Dp nJ&&Ýk9*jB('Ki:{(F)W/Q$ |Y^ K1Ұ I0,g>L6C:SOUt !E9LlGbzRp`-H !p8e*'yppI}FMZLQFK$,2}e2%F^Q;͕E%̝R>racW}ozSl᲼w SpnTA( mݏ&sZ4ǹ"_QqI<D5 kMI˶\WYO)*h:C 938MJ݇np#P30z_db]窙oSB.7Ld%"+V.%=uuxⲺo\_?džhu&[iQK;xxrnDr^+LӀM\ъ^<ǀѭ '/vA=&npmͱI-wn@mg/ 0`:}ENL(QI|H^:|^yfBmbfɔwOP } ֺ˷my0Ϫ6kʴpD3;tj%V:[>p1}o%pUPϓaR)-tsxLxj$%V`^Dgg4#OUUS5"Fb&`АkNg=˺֔=Bv 6=]Z ʫp.(ᜅv_xz:t3϶ I`!5xbY֛u SjOY'nRPugm;M8j7$! ߰2'6֭:oT֓.*0ɷ(L Yf蝫jKzJŵ? n yVC̨S\g)8d%l_Be)}#lY?kf<[X繲@[!a%m7ܰ{ m K 230dmюM0CF.$r `N[_a(hΐP6jdn44rŽu!˝6 yO#2A /n]W2 8 IK!K`tooiG |3<``)'US GYzHq46OLw4 mGR*VAIoȡO(5KDC_=Ēk$ |ؓ(i[r3_Aխ@\ͧ`ͨP Cf7kf@Zu.W箇=݁;')~@SYկڤw"e0AH5/nX[L\{=^pnvV z;Mb%BL$uw$x Z~ƷlcZ-Bgz~F}rcH 9$M`J+dEGQ܂⩄9ծ6a86Sыl mؤ#%S×<#C.F.+5^ݪ4?h35PEQ&d\ +@&X\H[.ŞC +ap.}TVo#tiU>&̃{3Ǖ:G81Bʿ% 6 3j'bH{JsirPvs 5#uսYlk=KaHOSm1q,Y5So~9INRVf7FKĎ:eδ.J@#E\usx:i4@L-$=JY63$`ߖY$&t˱M .]߭_Pߖ;}Jp3&D^37޽mrI^O}8U^'cۊALm\[4E#B{G\bE*W^/b,6e=MMש-&H')?"8\\5Zhv uAZGZBw]bpb% P54VeBR-c=d9:UV ZZVF$Q@hȫJnHV"u[ 㯯JnS2G$Sݩ㦸P?0Ƿ|xL1,|uZZPBwT>R:fz>PE~$}Umzyh1T W|ߌD>z*'.&YBȱ%^ŶW6YmAMoR'hAZhژQɎrG 3]Յ;MLԸz`uD84tDnBOqL԰*oI1Dx] L}^Nqeoy%\o((\ |h6r;(}J .u[Ƚ+#j+@` &H[曦Jv7 VkAn3e4*O,w #Q,9^dlzm+J7wFB|XvIE3YVӉx 2:Ye-/yX~޸E=xgJ™C ;87}jY^/N} 7IG>F 0oh@5E)S1aiAlV";M |`Q'A$~3esa:  rGDx4:g5K'98aSy?Ԩ?L+R Pdx=ӓ1#8]:AS~ɟɵr"AZm! [(ÁqV*K,7dzYl'F0T؏b@ 4\֢8r!0ٛz0Q=2LC.p7DC$a@TI'> hH?EcbB#aYfJUѓZQx* d#Mw/4a\?ߑ9d+A#9jepiެl2<9%ܬ=s\vU֙'*zx? Gm!cg|HǢMX{3sTQ} l⊶./wB.JJNowtY;SXb!t`iGw zpGjDEyr]|$;jr_< S>l6k̤:45WMTpFEYACxy|apBN~ΖF @W/tiiG#)mڳRR2;>eո{'"(h?-l'}'O\.kʷEOBF W4Tj)ly/SLCn`g) ާ^j7&ROWxu%r4!Y$fTΙ" 4iUfwW ,9{)^;~)ANP3edTk> dPIF^z:CΨA%j혮CT}{9R^j^n!{Fo- bT?epc,aN?V1oUTwNͱ7:׵P)lSܧ9!:(I*q*`2$.dok0z//5n<=|9f|OҤ|$M3NAx6b6s~ITr-V_2yj FW/3<)u{||0YFjrqg`yt#4$1U&X<ӚI.9bt"M Mgstok=̥G@BڞJư'vI1?L+R1s;<,=؜еX]zNU[3hgC[ ,zvSnZ 2~DE L,. T|> _Auܯ."+Y%R|Bxjm+M#RhwcTټ Y .3!fmzOjf% \7hdބZ1霼OA[:.JQk -*#6KRیd$$tQRu!S`U<4b&#wg5&cLmk A9Ѯ9[6,*P9c_|3F9OyE &GM U,saz)j3(Z[fcAS;[#zx_GyG !MA)I+ϒhkjϧ:&-q;Bۚ >NP5/2H$x"y)NKiO҈(\V *'_u h׿9| zaMxBK\b)\9U|.'52$u}_X 8dxdBp.W(d`c Ή[,P5c&?0+_jctRIHy1= WȽL|`.kˏP=,+=R FR D_q^ ^ cSc!AMXI،Xcb򲈁^v|ZHvI `4[T*{5e;ٱD^ Ď{d҆S(,ij JAv:2RFm.P`UsuBOLz3h5&҂'}Zpr/eAuT3T~5?m gcwR6΃ }ďS7+#B`鈌8zvDldTi0p fS^kW4\"dWX &`h fJZ#-rR踌N)-5_J1Z'25o\UYs7ׁV քc>.2N3/z4??@]Y`PuHԫʴUehlk:5v ťhᢾ8d\.̟cZ)$='a.=L)E,whۏvaa0dlMl=ǐ \˜.5I9X~*2FRCR 9kDFYv,~%mLqD0aqUB@r K &yټ"XxP@?TJSdKq[x |mZ=%0iTݨ}R :\3j'MFkx-p*n8ZqJֆAt|?4J24@`ͣ,@)38P4r$uzƹk .@tz <$>O4x70WSl\د)>y5abZ3@|Y a I1U7ZW> P)W/ :vk_9ZQ+=8P`*휓Hh)$a)$VƳT^ %WWJm[?I x6qta>2mZ/!) R6s]xh%XCQvxg+!jkCW-G\<B%ᾇqLj;9G[*tcR$5kg_i:Dyk\.;^sU2WUbSkk!qq+1 [p\'kN86~hmfif-"ql8&hDrVk+.vX9Ed$ӶZoeC`ᯪچހ[o꽕tY,C Pbv m50|Imx(Ħ?k+ybIZdƅARݫ P|]9sPDGekq|Eg>KI|iC Znb&?XǼ`L4,ehп"bkژ~^jBR܏# ߛ#tu*Rʎgc,䰏(q, ы4: