aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/adm/index.php2
-rw-r--r--phpBB/adm/swatch.php2
-rw-r--r--phpBB/config/cron_tasks.yml16
-rw-r--r--phpBB/config/services.yml10
-rw-r--r--phpBB/includes/acp/info/acp_extensions.php4
-rw-r--r--phpBB/includes/acp/info/acp_language.php2
-rw-r--r--phpBB/includes/bbcode.php2
-rw-r--r--phpBB/includes/db/driver/mssql.php64
-rw-r--r--phpBB/includes/db/driver/mssql_odbc.php40
-rw-r--r--phpBB/includes/db/driver/mssqlnative.php52
-rw-r--r--phpBB/includes/db/driver/mysql.php45
-rw-r--r--phpBB/includes/db/driver/mysqli.php32
-rw-r--r--phpBB/includes/db/driver/oracle.php53
-rw-r--r--phpBB/includes/db/driver/sqlite.php41
-rw-r--r--phpBB/includes/di/service_collection.php2
-rw-r--r--phpBB/includes/functions.php100
-rw-r--r--phpBB/includes/functions_messenger.php4
-rw-r--r--phpBB/includes/style/style.php27
-rw-r--r--phpBB/includes/template/compile.php13
-rw-r--r--phpBB/includes/template/filter.php141
-rw-r--r--phpBB/includes/template/locator.php4
-rw-r--r--phpBB/includes/template/template.php37
-rw-r--r--phpBB/includes/ucp/info/ucp_profile.php2
-rw-r--r--phpBB/includes/ucp/ucp_profile.php5
-rw-r--r--phpBB/install/database_update.php150
-rw-r--r--phpBB/install/index.php2
-rw-r--r--phpBB/install/install_install.php5
-rw-r--r--phpBB/install/install_update.php2
-rw-r--r--phpBB/install/schemas/schema_data.sql3
-rw-r--r--phpBB/language/en/acp/common.php10
-rw-r--r--phpBB/language/en/acp/permissions_phpbb.php1
-rw-r--r--phpBB/language/en/common.php2
-rw-r--r--phpBB/language/en/ucp.php1
-rw-r--r--phpBB/styles/prosilver/template/jumpbox.html3
-rw-r--r--phpBB/styles/subsilver2/template/jumpbox.html4
-rw-r--r--phpBB/styles/subsilver2/template/mcp_jumpbox.html3
-rw-r--r--phpBB/viewtopic.php2
-rw-r--r--tests/dbal/connect_test.php41
-rw-r--r--tests/dbal/write_sequence_test.php4
-rw-r--r--tests/fixtures/empty.xml6
-rw-r--r--tests/functional/auth_test.php12
-rw-r--r--tests/functions/build_hidden_fields_for_query_params_test.php71
-rw-r--r--tests/functions/quoteattr_test.php44
-rw-r--r--tests/mock/filesystem_extension_manager.php32
-rw-r--r--tests/mock/null_cache.php47
-rw-r--r--tests/search/mysql_test.php2
-rw-r--r--tests/search/native_test.php2
-rw-r--r--tests/search/postgres_test.php2
-rw-r--r--tests/template/datasets/event_inheritance/ext/kappa/styles/all/template/test.html1
-rw-r--r--tests/template/datasets/event_inheritance/ext/kappa/styles/silver/template/test.html1
-rw-r--r--tests/template/datasets/event_inheritance/ext/kappa/styles/silver_inherit/template/test.html1
-rw-r--r--tests/template/datasets/event_inheritance/ext/omega/styles/all/template/test.html1
-rw-r--r--tests/template/datasets/event_inheritance/ext/omega/styles/silver/template/test.html1
-rw-r--r--tests/template/datasets/event_inheritance/ext/omega/styles/silver/template/two.html1
-rw-r--r--tests/template/datasets/event_inheritance/ext/zeta/styles/all/template/test.html1
-rw-r--r--tests/template/datasets/event_inheritance/styles/silver/template/event_test.html1
-rw-r--r--tests/template/datasets/event_inheritance/styles/silver/template/event_two.html1
-rw-r--r--tests/template/datasets/event_inheritance/styles/silver_inherit/template/event_test.html1
-rw-r--r--tests/template/datasets/ext_trivial/ext/trivial/styles/all/template/universal.html1
-rw-r--r--tests/template/datasets/ext_trivial/ext/trivial/styles/silver/template/simple.html1
-rw-r--r--tests/template/datasets/ext_trivial/styles/silver/template/event_simple.html1
-rw-r--r--tests/template/datasets/ext_trivial/styles/silver/template/event_universal.html1
-rw-r--r--tests/template/includephp_test.php2
-rw-r--r--tests/template/template_compile_test.php2
-rw-r--r--tests/template/template_events_test.php118
-rw-r--r--tests/template/template_test_case.php2
-rw-r--r--tests/template/template_test_case_with_tree.php2
-rw-r--r--tests/template/templates/events.html4
-rw-r--r--tests/test_framework/phpbb_database_test_connection_manager.php4
-rw-r--r--tests/test_framework/phpbb_functional_test_case.php121
70 files changed, 1253 insertions, 167 deletions
diff --git a/phpBB/adm/index.php b/phpBB/adm/index.php
index e20bbe4bec..0f84af6f9e 100644
--- a/phpBB/adm/index.php
+++ b/phpBB/adm/index.php
@@ -52,7 +52,7 @@ $mode = request_var('mode', '');
// Set custom style for admin area
$phpbb_style->set_ext_dir_prefix('adm/');
-$phpbb_style->set_custom_style('admin', $phpbb_admin_path . 'style', '');
+$phpbb_style->set_custom_style('admin', $phpbb_admin_path . 'style', array(), '');
$template->assign_var('T_ASSETS_PATH', $phpbb_root_path . 'assets');
$template->assign_var('T_TEMPLATE_PATH', $phpbb_admin_path . 'style');
diff --git a/phpBB/adm/swatch.php b/phpBB/adm/swatch.php
index 86498a255f..c01651e0f0 100644
--- a/phpBB/adm/swatch.php
+++ b/phpBB/adm/swatch.php
@@ -24,7 +24,7 @@ $user->setup();
$phpbb_admin_path = (defined('PHPBB_ADMIN_PATH')) ? PHPBB_ADMIN_PATH : './';
// Set custom template for admin area
-$phpbb_style->set_custom_style('admin', $phpbb_admin_path . 'style', '');
+$phpbb_style->set_custom_style('admin', $phpbb_admin_path . 'style', array(), '');
$template->set_filenames(array(
'body' => 'colour_swatch.html')
diff --git a/phpBB/config/cron_tasks.yml b/phpBB/config/cron_tasks.yml
index 74f57e449d..d1954b1877 100644
--- a/phpBB/config/cron_tasks.yml
+++ b/phpBB/config/cron_tasks.yml
@@ -6,6 +6,8 @@ services:
- %core.php_ext%
- @config
- @dbal.conn
+ calls:
+ - [set_name, [cron.task.core.prune_all_forums]]
tags:
- { name: cron.task }
@@ -16,6 +18,8 @@ services:
- %core.php_ext%
- @config
- @dbal.conn
+ calls:
+ - [set_name, [cron.task.core.prune_forum]]
tags:
- { name: cron.task }
@@ -25,6 +29,8 @@ services:
- %core.root_path%
- %core.php_ext%
- @config
+ calls:
+ - [set_name, [cron.task.core.queue]]
tags:
- { name: cron.task }
@@ -33,6 +39,8 @@ services:
arguments:
- @config
- @cache.driver
+ calls:
+ - [set_name, [cron.task.core.tidy_cache]]
tags:
- { name: cron.task }
@@ -42,6 +50,8 @@ services:
- %core.root_path%
- %core.php_ext%
- @config
+ calls:
+ - [set_name, [cron.task.core.tidy_database]]
tags:
- { name: cron.task }
@@ -54,6 +64,8 @@ services:
- @config
- @dbal.conn
- @user
+ calls:
+ - [set_name, [cron.task.core.tidy_search]]
tags:
- { name: cron.task }
@@ -62,6 +74,8 @@ services:
arguments:
- @config
- @user
+ calls:
+ - [set_name, [cron.task.core.tidy_sessions]]
tags:
- { name: cron.task }
@@ -71,5 +85,7 @@ services:
- %core.root_path%
- %core.php_ext%
- @config
+ calls:
+ - [set_name, [cron.task.core.tidy_warnings]]
tags:
- { name: cron.task }
diff --git a/phpBB/config/services.yml b/phpBB/config/services.yml
index 37e6c0b5df..febdc5acb8 100644
--- a/phpBB/config/services.yml
+++ b/phpBB/config/services.yml
@@ -59,15 +59,6 @@ services:
- @service_container
- @ext.finder
- controller.route_collection:
- class: phpbb_controller_route_collection
- arguments:
- - @ext.finder
- - @controller.provider
-
- controller.provider:
- class: phpbb_controller_provider
-
cron.task_collection:
class: phpbb_di_service_collection
arguments:
@@ -189,6 +180,7 @@ services:
- @user
- @style.resource_locator
- @template_context
+ - @ext.manager
template_context:
class: phpbb_template_context
diff --git a/phpBB/includes/acp/info/acp_extensions.php b/phpBB/includes/acp/info/acp_extensions.php
index f5953fb1dd..03d7059165 100644
--- a/phpBB/includes/acp/info/acp_extensions.php
+++ b/phpBB/includes/acp/info/acp_extensions.php
@@ -16,10 +16,10 @@ class acp_extensions_info
{
return array(
'filename' => 'acp_extensions',
- 'title' => 'ACP_EXTENSIONS',
+ 'title' => 'ACP_EXTENSIONS_MANAGEMENT',
'version' => '1.0.0',
'modes' => array(
- 'main' => array('title' => 'ACP_EXTENSIONS', 'auth' => 'acl_a_extensions', 'cat' => array('ACP_GENERAL_TASKS')),
+ 'main' => array('title' => 'ACP_EXTENSIONS', 'auth' => 'acl_a_extensions', 'cat' => array('ACP_EXTENSIONS_MANAGEMENT')),
),
);
}
diff --git a/phpBB/includes/acp/info/acp_language.php b/phpBB/includes/acp/info/acp_language.php
index 85dfb119ea..7f33a22fa6 100644
--- a/phpBB/includes/acp/info/acp_language.php
+++ b/phpBB/includes/acp/info/acp_language.php
@@ -19,7 +19,7 @@ class acp_language_info
'title' => 'ACP_LANGUAGE',
'version' => '1.0.0',
'modes' => array(
- 'lang_packs' => array('title' => 'ACP_LANGUAGE_PACKS', 'auth' => 'acl_a_language', 'cat' => array('ACP_GENERAL_TASKS')),
+ 'lang_packs' => array('title' => 'ACP_LANGUAGE_PACKS', 'auth' => 'acl_a_language', 'cat' => array('ACP_LANGUAGE')),
),
);
}
diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php
index b9ffa8091c..e8681420d4 100644
--- a/phpBB/includes/bbcode.php
+++ b/phpBB/includes/bbcode.php
@@ -134,7 +134,7 @@ class bbcode
$style_resource_locator = new phpbb_style_resource_locator();
$style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider());
- $template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, new phpbb_template_context());
+ $template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, new phpbb_template_context(), $phpbb_extension_manager);
$style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider, $template);
$style->set_style();
$template->set_filenames(array('bbcode.html' => 'bbcode.html'));
diff --git a/phpBB/includes/db/driver/mssql.php b/phpBB/includes/db/driver/mssql.php
index 2e9debf84f..ac957e7698 100644
--- a/phpBB/includes/db/driver/mssql.php
+++ b/phpBB/includes/db/driver/mssql.php
@@ -22,11 +22,19 @@ if (!defined('IN_PHPBB'))
*/
class phpbb_db_driver_mssql extends phpbb_db_driver
{
+ var $connect_error = '';
+
/**
* Connect to server
*/
function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
{
+ if (!function_exists('mssql_connect'))
+ {
+ $this->connect_error = 'mssql_connect function does not exist, is mssql extension installed?';
+ return $this->sql_error('');
+ }
+
$this->persistency = $persistency;
$this->user = $sqluser;
$this->dbname = $database;
@@ -353,34 +361,44 @@ class phpbb_db_driver_mssql extends phpbb_db_driver
*/
function _sql_error()
{
- $error = array(
- 'message' => @mssql_get_last_message(),
- 'code' => ''
- );
-
- // Get error code number
- $result_id = @mssql_query('SELECT @@ERROR as code', $this->db_connect_id);
- if ($result_id)
+ if (function_exists('mssql_get_last_message'))
{
- $row = @mssql_fetch_assoc($result_id);
- $error['code'] = $row['code'];
- @mssql_free_result($result_id);
- }
+ $error = array(
+ 'message' => @mssql_get_last_message(),
+ 'code' => '',
+ );
- // Get full error message if possible
- $sql = 'SELECT CAST(description as varchar(255)) as message
- FROM master.dbo.sysmessages
- WHERE error = ' . $error['code'];
- $result_id = @mssql_query($sql);
+ // Get error code number
+ $result_id = @mssql_query('SELECT @@ERROR as code', $this->db_connect_id);
+ if ($result_id)
+ {
+ $row = @mssql_fetch_assoc($result_id);
+ $error['code'] = $row['code'];
+ @mssql_free_result($result_id);
+ }
- if ($result_id)
- {
- $row = @mssql_fetch_assoc($result_id);
- if (!empty($row['message']))
+ // Get full error message if possible
+ $sql = 'SELECT CAST(description as varchar(255)) as message
+ FROM master.dbo.sysmessages
+ WHERE error = ' . $error['code'];
+ $result_id = @mssql_query($sql);
+
+ if ($result_id)
{
- $error['message'] .= '<br />' . $row['message'];
+ $row = @mssql_fetch_assoc($result_id);
+ if (!empty($row['message']))
+ {
+ $error['message'] .= '<br />' . $row['message'];
+ }
+ @mssql_free_result($result_id);
}
- @mssql_free_result($result_id);
+ }
+ else
+ {
+ $error = array(
+ 'message' => $this->connect_error,
+ 'code' => '',
+ );
}
return $error;
diff --git a/phpBB/includes/db/driver/mssql_odbc.php b/phpBB/includes/db/driver/mssql_odbc.php
index d1f31a6554..13e74e66d4 100644
--- a/phpBB/includes/db/driver/mssql_odbc.php
+++ b/phpBB/includes/db/driver/mssql_odbc.php
@@ -29,6 +29,7 @@ if (!defined('IN_PHPBB'))
class phpbb_db_driver_mssql_odbc extends phpbb_db_driver
{
var $last_query_text = '';
+ var $connect_error = '';
/**
* Connect to server
@@ -65,7 +66,24 @@ class phpbb_db_driver_mssql_odbc extends phpbb_db_driver
@ini_set('odbc.defaultlrl', $max_size);
}
- $this->db_connect_id = ($this->persistency) ? @odbc_pconnect($this->server, $this->user, $sqlpassword) : @odbc_connect($this->server, $this->user, $sqlpassword);
+ if ($this->persistency)
+ {
+ if (!function_exists('odbc_pconnect'))
+ {
+ $this->connect_error = 'odbc_pconnect function does not exist, is odbc extension installed?';
+ return $this->sql_error('');
+ }
+ $this->db_connect_id = @odbc_pconnect($this->server, $this->user, $sqlpassword);
+ }
+ else
+ {
+ if (!function_exists('odbc_connect'))
+ {
+ $this->connect_error = 'odbc_connect function does not exist, is odbc extension installed?';
+ return $this->sql_error('');
+ }
+ $this->db_connect_id = @odbc_connect($this->server, $this->user, $sqlpassword);
+ }
return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error('');
}
@@ -347,10 +365,22 @@ class phpbb_db_driver_mssql_odbc extends phpbb_db_driver
*/
function _sql_error()
{
- return array(
- 'message' => @odbc_errormsg(),
- 'code' => @odbc_error()
- );
+ if (function_exists('odbc_errormsg'))
+ {
+ $error = array(
+ 'message' => @odbc_errormsg(),
+ 'code' => @odbc_error(),
+ );
+ }
+ else
+ {
+ $error = array(
+ 'message' => $this->connect_error,
+ 'code' => '',
+ );
+ }
+
+ return $error;
}
/**
diff --git a/phpBB/includes/db/driver/mssqlnative.php b/phpBB/includes/db/driver/mssqlnative.php
index 67a019f5a5..4b1639aba2 100644
--- a/phpBB/includes/db/driver/mssqlnative.php
+++ b/phpBB/includes/db/driver/mssqlnative.php
@@ -196,16 +196,18 @@ class phpbb_db_driver_mssqlnative extends phpbb_db_driver
var $m_insert_id = NULL;
var $last_query_text = '';
var $query_options = array();
+ var $connect_error = '';
/**
* Connect to server
*/
function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
{
- # Test for driver support, to avoid suppressed fatal error
+ // Test for driver support, to avoid suppressed fatal error
if (!function_exists('sqlsrv_connect'))
{
- trigger_error('Native MS SQL Server driver for PHP is missing or needs to be updated. Version 1.1 or later is required to install phpBB3. You can download the driver from: http://www.microsoft.com/sqlserver/2005/en/us/PHP-Driver.aspx\n', E_USER_ERROR);
+ $this->connect_error = 'Native MS SQL Server driver for PHP is missing or needs to be updated. Version 1.1 or later is required to install phpBB3. You can download the driver from: http://www.microsoft.com/sqlserver/2005/en/us/PHP-Driver.aspx';
+ return $this->sql_error('');
}
//set up connection variables
@@ -519,31 +521,43 @@ class phpbb_db_driver_mssqlnative extends phpbb_db_driver
*/
function _sql_error()
{
- $errors = @sqlsrv_errors(SQLSRV_ERR_ERRORS);
- $error_message = '';
- $code = 0;
-
- if ($errors != null)
+ if (function_exists('sqlsrv_errors'))
{
- foreach ($errors as $error)
+ $errors = @sqlsrv_errors(SQLSRV_ERR_ERRORS);
+ $error_message = '';
+ $code = 0;
+
+ if ($errors != null)
+ {
+ foreach ($errors as $error)
+ {
+ $error_message .= "SQLSTATE: " . $error[ 'SQLSTATE'] . "\n";
+ $error_message .= "code: " . $error[ 'code'] . "\n";
+ $code = $error['code'];
+ $error_message .= "message: " . $error[ 'message'] . "\n";
+ }
+ $this->last_error_result = $error_message;
+ $error = $this->last_error_result;
+ }
+ else
{
- $error_message .= "SQLSTATE: ".$error[ 'SQLSTATE']."\n";
- $error_message .= "code: ".$error[ 'code']."\n";
- $code = $error['code'];
- $error_message .= "message: ".$error[ 'message']."\n";
+ $error = (isset($this->last_error_result) && $this->last_error_result) ? $this->last_error_result : array();
}
- $this->last_error_result = $error_message;
- $error = $this->last_error_result;
+
+ $error = array(
+ 'message' => $error,
+ 'code' => $code,
+ );
}
else
{
- $error = (isset($this->last_error_result) && $this->last_error_result) ? $this->last_error_result : array();
+ $error = array(
+ 'message' => $this->connect_error,
+ 'code' => '',
+ );
}
- return array(
- 'message' => $error,
- 'code' => $code,
- );
+ return $error;
}
/**
diff --git a/phpBB/includes/db/driver/mysql.php b/phpBB/includes/db/driver/mysql.php
index f8c2be2366..6fc6fab483 100644
--- a/phpBB/includes/db/driver/mysql.php
+++ b/phpBB/includes/db/driver/mysql.php
@@ -27,6 +27,7 @@ if (!defined('IN_PHPBB'))
class phpbb_db_driver_mysql extends phpbb_db_driver
{
var $multi_insert = true;
+ var $connect_error = '';
/**
* Connect to server
@@ -41,7 +42,24 @@ class phpbb_db_driver_mysql extends phpbb_db_driver
$this->sql_layer = 'mysql4';
- $this->db_connect_id = ($this->persistency) ? @mysql_pconnect($this->server, $this->user, $sqlpassword) : @mysql_connect($this->server, $this->user, $sqlpassword, $new_link);
+ if ($this->persistency)
+ {
+ if (!function_exists('mysql_pconnect'))
+ {
+ $this->connect_error = 'mysql_pconnect function does not exist, is mysql extension installed?';
+ return $this->sql_error('');
+ }
+ $this->db_connect_id = @mysql_pconnect($this->server, $this->user, $sqlpassword);
+ }
+ else
+ {
+ if (!function_exists('mysql_connect'))
+ {
+ $this->connect_error = 'mysql_connect function does not exist, is mysql extension installed?';
+ return $this->sql_error('');
+ }
+ $this->db_connect_id = @mysql_connect($this->server, $this->user, $sqlpassword, $new_link);
+ }
if ($this->db_connect_id && $this->dbname != '')
{
@@ -424,18 +442,29 @@ class phpbb_db_driver_mysql extends phpbb_db_driver
*/
function _sql_error()
{
- if (!$this->db_connect_id)
+ if ($this->db_connect_id)
+ {
+ $error = array(
+ 'message' => @mysql_error($this->db_connect_id),
+ 'code' => @mysql_errno($this->db_connect_id),
+ );
+ }
+ else if (function_exists('mysql_error'))
{
- return array(
+ $error = array(
'message' => @mysql_error(),
- 'code' => @mysql_errno()
+ 'code' => @mysql_errno(),
+ );
+ }
+ else
+ {
+ $error = array(
+ 'message' => $this->connect_error,
+ 'code' => '',
);
}
- return array(
- 'message' => @mysql_error($this->db_connect_id),
- 'code' => @mysql_errno($this->db_connect_id)
- );
+ return $error;
}
/**
diff --git a/phpBB/includes/db/driver/mysqli.php b/phpBB/includes/db/driver/mysqli.php
index 0cc3eb359a..be28a95715 100644
--- a/phpBB/includes/db/driver/mysqli.php
+++ b/phpBB/includes/db/driver/mysqli.php
@@ -24,12 +24,19 @@ if (!defined('IN_PHPBB'))
class phpbb_db_driver_mysqli extends phpbb_db_driver
{
var $multi_insert = true;
+ var $connect_error = '';
/**
* Connect to server
*/
function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false , $new_link = false)
{
+ if (!function_exists('mysqli_connect'))
+ {
+ $this->connect_error = 'mysqli_connect function does not exist, is mysqli extension installed?';
+ return $this->sql_error('');
+ }
+
// Mysqli extension supports persistent connection since PHP 5.3.0
$this->persistency = (version_compare(PHP_VERSION, '5.3.0', '>=')) ? $persistency : false;
$this->user = $sqluser;
@@ -421,18 +428,29 @@ class phpbb_db_driver_mysqli extends phpbb_db_driver
*/
function _sql_error()
{
- if (!$this->db_connect_id)
+ if ($this->db_connect_id)
+ {
+ $error = array(
+ 'message' => @mysqli_error($this->db_connect_id),
+ 'code' => @mysqli_errno($this->db_connect_id)
+ );
+ }
+ else if (function_exists('mysqli_connect_error'))
{
- return array(
+ $error = array(
'message' => @mysqli_connect_error(),
- 'code' => @mysqli_connect_errno()
+ 'code' => @mysqli_connect_errno(),
+ );
+ }
+ else
+ {
+ $error = array(
+ 'message' => $this->connect_error,
+ 'code' => '',
);
}
- return array(
- 'message' => @mysqli_error($this->db_connect_id),
- 'code' => @mysqli_errno($this->db_connect_id)
- );
+ return $error;
}
/**
diff --git a/phpBB/includes/db/driver/oracle.php b/phpBB/includes/db/driver/oracle.php
index d8474694e3..6263ea8414 100644
--- a/phpBB/includes/db/driver/oracle.php
+++ b/phpBB/includes/db/driver/oracle.php
@@ -22,6 +22,7 @@ if (!defined('IN_PHPBB'))
class phpbb_db_driver_oracle extends phpbb_db_driver
{
var $last_query_text = '';
+ var $connect_error = '';
/**
* Connect to server
@@ -45,7 +46,33 @@ class phpbb_db_driver_oracle extends phpbb_db_driver
$connect = $sqlserver . (($port) ? ':' . $port : '') . '/' . $database;
}
- $this->db_connect_id = ($new_link) ? @ocinlogon($this->user, $sqlpassword, $connect, 'UTF8') : (($this->persistency) ? @ociplogon($this->user, $sqlpassword, $connect, 'UTF8') : @ocilogon($this->user, $sqlpassword, $connect, 'UTF8'));
+ 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('');
}
@@ -644,17 +671,27 @@ class phpbb_db_driver_oracle extends phpbb_db_driver
*/
function _sql_error()
{
- $error = @ocierror();
- $error = (!$error) ? @ocierror($this->query_result) : $error;
- $error = (!$error) ? @ocierror($this->db_connect_id) : $error;
-
- if ($error)
+ if (function_exists('ocierror'))
{
- $this->last_error_result = $error;
+ $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 = (isset($this->last_error_result) && $this->last_error_result) ? $this->last_error_result : array();
+ $error = array(
+ 'message' => $this->connect_error,
+ 'code' => '',
+ );
}
return $error;
diff --git a/phpBB/includes/db/driver/sqlite.php b/phpBB/includes/db/driver/sqlite.php
index 0b09fa758d..6b9cc64d89 100644
--- a/phpBB/includes/db/driver/sqlite.php
+++ b/phpBB/includes/db/driver/sqlite.php
@@ -22,6 +22,8 @@ if (!defined('IN_PHPBB'))
*/
class phpbb_db_driver_sqlite extends phpbb_db_driver
{
+ var $connect_error = '';
+
/**
* Connect to server
*/
@@ -33,7 +35,24 @@ class phpbb_db_driver_sqlite extends phpbb_db_driver
$this->dbname = $database;
$error = '';
- $this->db_connect_id = ($this->persistency) ? @sqlite_popen($this->server, 0666, $error) : @sqlite_open($this->server, 0666, $error);
+ if ($this->persistency)
+ {
+ if (!function_exists('sqlite_popen'))
+ {
+ $this->connect_error = 'sqlite_popen function does not exist, is sqlite extension installed?';
+ return $this->sql_error('');
+ }
+ $this->db_connect_id = @sqlite_popen($this->server, 0666, $error);
+ }
+ else
+ {
+ if (!function_exists('sqlite_open'))
+ {
+ $this->connect_error = 'sqlite_open function does not exist, is sqlite extension installed?';
+ return $this->sql_error('');
+ }
+ $this->db_connect_id = @sqlite_open($this->server, 0666, $error);
+ }
if ($this->db_connect_id)
{
@@ -278,10 +297,22 @@ class phpbb_db_driver_sqlite extends phpbb_db_driver
*/
function _sql_error()
{
- return array(
- 'message' => @sqlite_error_string(@sqlite_last_error($this->db_connect_id)),
- 'code' => @sqlite_last_error($this->db_connect_id)
- );
+ if (function_exists('sqlite_error_string'))
+ {
+ $error = array(
+ 'message' => @sqlite_error_string(@sqlite_last_error($this->db_connect_id)),
+ 'code' => @sqlite_last_error($this->db_connect_id),
+ );
+ }
+ else
+ {
+ $error = array(
+ 'message' => $this->connect_error,
+ 'code' => '',
+ );
+ }
+
+ return $error;
}
/**
diff --git a/phpBB/includes/di/service_collection.php b/phpBB/includes/di/service_collection.php
index 60323c8dba..880cb46d4d 100644
--- a/phpBB/includes/di/service_collection.php
+++ b/phpBB/includes/di/service_collection.php
@@ -43,7 +43,7 @@ class phpbb_di_service_collection extends ArrayObject
public function add($name)
{
$task = $this->container->get($name);
- $task->set_name($name);
+
$this->offsetSet($name, $task);
}
}
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index a804ee40c4..4bf991ca9e 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -4894,12 +4894,107 @@ function phpbb_http_login($param)
}
/**
+* Escapes and quotes a string for use as an HTML/XML attribute value.
+*
+* This is a port of Python xml.sax.saxutils quoteattr.
+*
+* The function will attempt to choose a quote character in such a way as to
+* avoid escaping quotes in the string. If this is not possible the string will
+* be wrapped in double quotes and double quotes will be escaped.
+*
+* @param string $data The string to be escaped
+* @param array $entities Associative array of additional entities to be escaped
+* @return string Escaped and quoted string
+*/
+function phpbb_quoteattr($data, $entities = null)
+{
+ $data = str_replace('&', '&amp;', $data);
+ $data = str_replace('>', '&gt;', $data);
+ $data = str_replace('<', '&lt;', $data);
+
+ $data = str_replace("\n", '&#10;', $data);
+ $data = str_replace("\r", '&#13;', $data);
+ $data = str_replace("\t", '&#9;', $data);
+
+ if (!empty($entities))
+ {
+ $data = str_replace(array_keys($entities), array_values($entities), $data);
+ }
+
+ if (strpos($data, '"') !== false)
+ {
+ if (strpos($data, "'") !== false)
+ {
+ $data = '"' . str_replace('"', '&quot;', $data) . '"';
+ }
+ else
+ {
+ $data = "'" . $data . "'";
+ }
+ }
+ else
+ {
+ $data = '"' . $data . '"';
+ }
+
+ return $data;
+}
+
+/**
+* Converts query string (GET) parameters in request into hidden fields.
+*
+* Useful for forwarding GET parameters when submitting forms with GET method.
+*
+* It is possible to omit some of the GET parameters, which is useful if
+* they are specified in the form being submitted.
+*
+* sid is always omitted.
+*
+* @param phpbb_request $request Request object
+* @param array $exclude A list of variable names that should not be forwarded
+* @return string HTML with hidden fields
+*/
+function phpbb_build_hidden_fields_for_query_params($request, $exclude = null)
+{
+ $names = $request->variable_names(phpbb_request_interface::GET);
+ $hidden = '';
+ foreach ($names as $name)
+ {
+ // Sessions are dealt with elsewhere, omit sid always
+ if ($name == 'sid')
+ {
+ continue;
+ }
+
+ // Omit any additional parameters requested
+ if (!empty($exclude) && in_array($name, $exclude))
+ {
+ continue;
+ }
+
+ $escaped_name = phpbb_quoteattr($name);
+
+ // Note: we might retrieve the variable from POST or cookies
+ // here. To avoid exposing cookies, skip variables that are
+ // overwritten somewhere other than GET entirely.
+ $value = $request->variable($name, '', true);
+ $get_value = $request->variable($name, '', true, phpbb_request_interface::GET);
+ if ($value === $get_value)
+ {
+ $escaped_value = phpbb_quoteattr($value);
+ $hidden .= "<input type='hidden' name=$escaped_name value=$escaped_value />";
+ }
+ }
+ return $hidden;
+}
+
+/**
* Generate page header
*/
function page_header($page_title = '', $display_online_list = true, $item_id = 0, $item = 'forum')
{
global $db, $config, $template, $SID, $_SID, $_EXTRA_URL, $user, $auth, $phpEx, $phpbb_root_path;
- global $phpbb_dispatcher;
+ global $phpbb_dispatcher, $request;
if (defined('HEADER_INC'))
{
@@ -5088,6 +5183,8 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
$timezone_name = $user->lang['timezones'][$timezone_name];
}
+ $hidden_fields_for_jumpbox = phpbb_build_hidden_fields_for_query_params($request, array('f'));
+
// The following assigns all _common_ variables that may be used at any point in a template.
$template->assign_vars(array(
'SITENAME' => $config['sitename'],
@@ -5102,6 +5199,7 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
'RECORD_USERS' => $l_online_record,
'PRIVATE_MESSAGE_INFO' => $l_privmsgs_text,
'PRIVATE_MESSAGE_INFO_UNREAD' => $l_privmsgs_text_unread,
+ 'HIDDEN_FIELDS_FOR_JUMPBOX' => $hidden_fields_for_jumpbox,
'S_USER_NEW_PRIVMSG' => $user->data['user_new_privmsg'],
'S_USER_UNREAD_PRIVMSG' => $user->data['user_unread_privmsg'],
diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php
index a18aeddabd..a33d7f0aa3 100644
--- a/phpBB/includes/functions_messenger.php
+++ b/phpBB/includes/functions_messenger.php
@@ -210,7 +210,7 @@ class messenger
{
$style_resource_locator = new phpbb_style_resource_locator();
$style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider());
- $tpl = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, new phpbb_template_context());
+ $tpl = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, new phpbb_template_context(), $extension_manager);
$style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider, $tpl);
$this->tpl_msg[$template_lang . $template_file] = $tpl;
@@ -231,7 +231,7 @@ class messenger
}
}
- $style->set_custom_style($template_lang . '_email', array($template_path, $fallback_template_path), '');
+ $style->set_custom_style($template_lang . '_email', array($template_path, $fallback_template_path), array(), '');
$tpl->set_filenames(array(
'body' => $template_file . '.txt',
diff --git a/phpBB/includes/style/style.php b/phpBB/includes/style/style.php
index effd496fb9..4703c3a219 100644
--- a/phpBB/includes/style/style.php
+++ b/phpBB/includes/style/style.php
@@ -91,16 +91,22 @@ class phpbb_style
{
$style_path = $this->user->style['style_path'];
$style_dirs = ($this->user->style['style_parent_id']) ? array_reverse(explode('/', $this->user->style['style_parent_tree'])) : array();
- $paths = array($this->get_style_path($style_path));
+
+ $names = array($style_path);
foreach ($style_dirs as $dir)
{
- $paths[] = $this->get_style_path($dir);
+ $names[] = $dir;
}
+ // Add 'all' path, used as last fallback path by events and extensions
+ //$names[] = 'all';
- // Add 'all' path, used as last fallback path by hooks and extensions
- $paths[] = $this->get_style_path('all');
+ $paths = array();
+ foreach ($names as $name)
+ {
+ $paths[] = $this->get_style_path($name);
+ }
- return $this->set_custom_style($style_path, $paths);
+ return $this->set_custom_style($style_path, $paths, $names);
}
/**
@@ -110,18 +116,27 @@ class phpbb_style
*
* @param string $name Name of style, used for cache prefix. Examples: "admin", "prosilver"
* @param array or string $paths Array of style paths, relative to current root directory
+ * @param array $names Array of names of templates in inheritance tree order, used by extensions. If empty, $name will be used.
* @param string $template_path Path to templates, relative to style directory. False if path should be set to default (templates/).
*/
- public function set_custom_style($name, $paths, $template_path = false)
+ public function set_custom_style($name, $paths, $names = array(), $template_path = false)
{
if (is_string($paths))
{
$paths = array($paths);
}
+ if (empty($names))
+ {
+ $names = array($name);
+ }
+ $this->names = $names;
+
$this->provider->set_styles($paths);
$this->locator->set_paths($this->provider);
+ $this->template->set_style_names($names);
+
if ($template_path !== false)
{
$this->locator->set_template_path($template_path);
diff --git a/phpBB/includes/template/compile.php b/phpBB/includes/template/compile.php
index 22da21820e..fcdaf7abda 100644
--- a/phpBB/includes/template/compile.php
+++ b/phpBB/includes/template/compile.php
@@ -35,16 +35,23 @@ class phpbb_template_compile
/**
* Constructor.
*
- * @param bool @allow_php Whether PHP code will be allowed in templates (inline PHP code, PHP tag and INCLUDEPHP tag)
+ * @param bool $allow_php Whether PHP code will be allowed in templates (inline PHP code, PHP tag and INCLUDEPHP tag)
+ * @param array $style_names Name of style to which the template being compiled belongs and parents in style tree order
* @param phpbb_style_resource_locator $locator Resource locator
* @param string $phpbb_root_path Path to phpBB root directory
+ * @param phpbb_extension_manager $extension_manager Extension manager to use for finding template fragments in extensions; if null, template events will not be invoked
+ * @param phpbb_user $user Current user
*/
- public function __construct($allow_php, $locator, $phpbb_root_path)
+ public function __construct($allow_php, $style_names, $locator, $phpbb_root_path, $extension_manager = null, $user = null)
{
$this->filter_params = array(
'allow_php' => $allow_php,
+ 'style_names' => $style_names,
'locator' => $locator,
- 'phpbb_root_path' => $phpbb_root_path
+ 'phpbb_root_path' => $phpbb_root_path,
+ 'extension_manager' => $extension_manager,
+ 'user' => $user,
+ 'template_compile' => $this,
);
}
diff --git a/phpBB/includes/template/filter.php b/phpBB/includes/template/filter.php
index 66d28242a3..f73ad28ba1 100644
--- a/phpBB/includes/template/filter.php
+++ b/phpBB/includes/template/filter.php
@@ -88,6 +88,37 @@ class phpbb_template_filter extends php_user_filter
private $phpbb_root_path;
/**
+ * Name of the style that the template being compiled and/or rendered
+ * belongs to, and its parents, in inheritance tree order.
+ *
+ * Used to invoke style-specific template events.
+ *
+ * @var array
+ */
+ private $style_names;
+
+ /**
+ * Extension manager.
+ *
+ * @var phpbb_extension_manager
+ */
+ private $extension_manager;
+
+ /**
+ * Current user
+ *
+ * @var phpbb_user
+ */
+ private $user;
+
+ /**
+ * Template compiler.
+ *
+ * @var phpbb_template_compile
+ */
+ private $template_compile;
+
+ /**
* Stream filter
*
* Is invoked for evey chunk of the stream, allowing us
@@ -138,8 +169,10 @@ class phpbb_template_filter extends php_user_filter
/**
* Initializer, called on creation.
*
- * Get the allow_php option, root directory and locator from params,
+ * Get the allow_php option, style_names, root directory and locator from params,
* which are passed to stream_filter_append.
+ *
+ * @return boolean Returns true
*/
public function onCreate()
{
@@ -148,6 +181,13 @@ class phpbb_template_filter extends php_user_filter
$this->allow_php = $this->params['allow_php'];
$this->locator = $this->params['locator'];
$this->phpbb_root_path = $this->params['phpbb_root_path'];
+ $this->style_names = $this->params['style_names'];
+ $this->extension_manager = $this->params['extension_manager'];
+ if (isset($this->params['user']))
+ {
+ $this->user = $this->params['user'];
+ }
+ $this->template_compile = $this->params['template_compile'];
return true;
}
@@ -229,7 +269,9 @@ class phpbb_template_filter extends php_user_filter
}
/**
- * Callback for replacing matched tokens with PHP code
+ * Callback for replacing matched tokens with compiled template code.
+ *
+ * Compiled template code is an HTML stream with embedded PHP.
*
* @param array $matches Regular expression matches
* @return string compiled template code
@@ -317,6 +359,10 @@ class phpbb_template_filter extends php_user_filter
return '<!-- ENDPHP -->';
break;
+ case 'EVENT':
+ return '<?php ' . $this->compile_tag_event($matches[2]) . '?>';
+ break;
+
default:
return $matches[0];
break;
@@ -836,6 +882,97 @@ class phpbb_template_filter extends php_user_filter
}
/**
+ * Compile EVENT tag.
+ *
+ * $tag_args should be a single string identifying the event.
+ * The event name can contain letters, numbers and underscores only.
+ * If an invalid event name is specified, an E_USER_ERROR will be
+ * triggered.
+ *
+ * Event tags are only functional when the template engine has
+ * an instance of the extension manager. Extension manager would
+ * be called upon to find all extensions listening for the specified
+ * event, and to obtain additional template fragments. All such
+ * template fragments will be compiled and included in the generated
+ * compiled template code for the current template being compiled.
+ *
+ * The above means that whenever an extension is enabled or disabled,
+ * template cache should be cleared in order to update the compiled
+ * template code for the active set of template event listeners.
+ *
+ * This also means that extensions cannot return different template
+ * fragments at different times. Once templates are compiled, changing
+ * such template fragments would have no effect.
+ *
+ * @param string $tag_args EVENT tag arguments, as a string - for EVENT this is the event name
+ * @return string compiled template code
+ */
+ private function compile_tag_event($tag_args)
+ {
+ if (!preg_match('/^\w+$/', $tag_args))
+ {
+ // The event location is improperly formatted,
+ if ($this->user)
+ {
+ trigger_error($this->user->lang('ERR_TEMPLATE_EVENT_LOCATION', $tag_args), E_USER_ERROR);
+ }
+ else
+ {
+ trigger_error(sprintf('The specified template event location <em>[%s]</em> is improperly formatted.', $tag_args), E_USER_ERROR);
+ }
+ }
+ $location = $tag_args;
+
+ if ($this->extension_manager)
+ {
+ $finder = $this->extension_manager->get_finder();
+
+ $files = $finder
+ ->extension_prefix($location)
+ ->extension_suffix('.html')
+ ->extension_directory("/styles/all/template")
+ ->get_files();
+
+ foreach ($this->style_names as $style_name)
+ {
+ $more_files = $finder
+ ->extension_prefix($location)
+ ->extension_suffix('.html')
+ ->extension_directory("/styles/" . $style_name . "/template")
+ ->get_files();
+ if (!empty($more_files))
+ {
+ $files = array_merge($files, $more_files);
+ break;
+ }
+ }
+
+ $all_compiled = '';
+ foreach ($files as $file)
+ {
+ $compiled = $this->template_compile->compile_file($file);
+
+ if ($compiled === false)
+ {
+ if ($this->user)
+ {
+ trigger_error($this->user->lang('ERR_TEMPLATE_COMPILATION', phpbb_filter_root_path($file)), E_USER_ERROR);
+ }
+ else
+ {
+ trigger_error(sprintf('The file could not be compiled: %s', phpbb_filter_root_path($file)), E_USER_ERROR);
+ }
+ }
+
+ $all_compiled .= $compiled;
+ }
+ // Need spaces inside php tags as php cannot grok
+ // < ?php? > sans the spaces
+ return ' ?' . '>' . $all_compiled . '<?php ';
+ }
+ }
+
+ /**
* parse expression
* This is from Smarty
*/
diff --git a/phpBB/includes/template/locator.php b/phpBB/includes/template/locator.php
index 42db91efb2..f6fd20bcc2 100644
--- a/phpBB/includes/template/locator.php
+++ b/phpBB/includes/template/locator.php
@@ -39,7 +39,7 @@ interface phpbb_template_locator
* Sets the template filenames for handles. $filename_array
* should be a hash of handle => filename pairs.
*
- * @param array $filname_array Should be a hash of handle => filename pairs.
+ * @param array $filename_array Should be a hash of handle => filename pairs.
*/
public function set_filenames(array $filename_array);
@@ -66,7 +66,7 @@ interface phpbb_template_locator
* returns actually exists, it is faster than get_source_file_for_handle.
*
* Use get_source_file_for_handle to obtain the actual path that is
- * guaranteed to exist (which might come from the parent style
+ * guaranteed to exist (which might come from the parent style
* directory if primary style has parent styles).
*
* This function will trigger an error if the handle was never
diff --git a/phpBB/includes/template/template.php b/phpBB/includes/template/template.php
index 5396ddbfad..bbec768613 100644
--- a/phpBB/includes/template/template.php
+++ b/phpBB/includes/template/template.php
@@ -75,14 +75,32 @@ class phpbb_template
private $locator;
/**
+ * Extension manager.
+ *
+ * @var phpbb_extension_manager
+ */
+ private $extension_manager;
+
+ /**
+ * Name of the style that the template being compiled and/or rendered
+ * belongs to, and its parents, in inheritance tree order.
+ *
+ * Used to invoke style-specific template events.
+ *
+ * @var array
+ */
+ private $style_names;
+
+ /**
* Constructor.
*
* @param string $phpbb_root_path phpBB root path
* @param user $user current user
* @param phpbb_template_locator $locator template locator
* @param phpbb_template_context $context template context
+ * @param phpbb_extension_manager $extension_manager extension manager, if null then template events will not be invoked
*/
- public function __construct($phpbb_root_path, $php_ext, $config, $user, phpbb_template_locator $locator, phpbb_template_context $context)
+ public function __construct($phpbb_root_path, $php_ext, $config, $user, phpbb_template_locator $locator, phpbb_template_context $context, phpbb_extension_manager $extension_manager = null)
{
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext;
@@ -90,12 +108,13 @@ class phpbb_template
$this->user = $user;
$this->locator = $locator;
$this->context = $context;
+ $this->extension_manager = $extension_manager;
}
/**
* Sets the template filenames for handles.
*
- * @param array $filname_array Should be a hash of handle => filename pairs.
+ * @param array $filename_array Should be a hash of handle => filename pairs.
*/
public function set_filenames(array $filename_array)
{
@@ -105,6 +124,18 @@ class phpbb_template
}
/**
+ * Sets the style names corresponding to style hierarchy being compiled
+ * and/or rendered.
+ *
+ * @param array $style_names List of style names in inheritance tree order
+ * @return null
+ */
+ public function set_style_names(array $style_names)
+ {
+ $this->style_names = $style_names;
+ }
+
+ /**
* Clears all variables and blocks assigned to this template.
*/
public function destroy()
@@ -282,7 +313,7 @@ class phpbb_template
return new phpbb_template_renderer_include($output_file, $this);
}
- $compile = new phpbb_template_compile($this->config['tpl_allow_php'], $this->locator, $this->phpbb_root_path);
+ $compile = new phpbb_template_compile($this->config['tpl_allow_php'], $this->style_names, $this->locator, $this->phpbb_root_path, $this->extension_manager, $this->user);
if ($compile->compile_file_to_file($source_file, $output_file) !== false)
{
diff --git a/phpBB/includes/ucp/info/ucp_profile.php b/phpBB/includes/ucp/info/ucp_profile.php
index 201216e9fd..3581a7f533 100644
--- a/phpBB/includes/ucp/info/ucp_profile.php
+++ b/phpBB/includes/ucp/info/ucp_profile.php
@@ -19,7 +19,7 @@ class ucp_profile_info
'title' => 'UCP_PROFILE',
'version' => '1.0.0',
'modes' => array(
- 'profile_info' => array('title' => 'UCP_PROFILE_PROFILE_INFO', 'auth' => '', 'cat' => array('UCP_PROFILE')),
+ 'profile_info' => array('title' => 'UCP_PROFILE_PROFILE_INFO', 'auth' => 'acl_u_chgprofileinfo', 'cat' => array('UCP_PROFILE')),
'signature' => array('title' => 'UCP_PROFILE_SIGNATURE', 'auth' => 'acl_u_sig', 'cat' => array('UCP_PROFILE')),
'avatar' => array('title' => 'UCP_PROFILE_AVATAR', 'auth' => 'cfg_allow_avatar && (cfg_allow_avatar_local || cfg_allow_avatar_remote || cfg_allow_avatar_upload || cfg_allow_avatar_remote_upload)', 'cat' => array('UCP_PROFILE')),
'reg_details' => array('title' => 'UCP_PROFILE_REG_DETAILS', 'auth' => '', 'cat' => array('UCP_PROFILE')),
diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php
index 89bf20a30f..e7cea06a45 100644
--- a/phpBB/includes/ucp/ucp_profile.php
+++ b/phpBB/includes/ucp/ucp_profile.php
@@ -251,6 +251,11 @@ class ucp_profile
break;
case 'profile_info':
+ // Do not display profile information panel if not authed to do so
+ if (!$auth->acl_get('u_chgprofileinfo'))
+ {
+ trigger_error('NO_AUTH_PROFILEINFO');
+ }
include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php
index 7bd57a510b..9afb5cc963 100644
--- a/phpBB/install/database_update.php
+++ b/phpBB/install/database_update.php
@@ -817,6 +817,70 @@ function _add_modules($modules_to_install)
$_module->remove_cache_file();
}
+/**
+* Add a new permission, optionally copy permission setting from another
+*
+* @param auth_admin $auth_admin auth_admin object
+* @param dbal $db Database object
+* @param string $permission_name Name of the permission to add
+* @param bool $is_global True is global, false is local
+* @param string $copy_from Optional permission name from which to copy
+* @return bool true on success, false on failure
+*/
+function _add_permission(auth_admin $auth_admin, dbal $db, $permission_name, $is_global = true, $copy_from = '')
+{
+ // Only add a permission that don't already exist
+ if (!empty($auth_admin->acl_options['id'][$permission_name]))
+ {
+ return true;
+ }
+
+ $permission_scope = $is_global ? 'global' : 'local';
+
+ $result = $auth_admin->acl_add_option(array(
+ $permission_scope => array($permission_name),
+ ));
+
+ if (!$result)
+ {
+ return $result;
+ }
+
+ // The permission has been added, now we can copy it if needed
+ if ($copy_from && isset($auth_admin->acl_options['id'][$copy_from]))
+ {
+ $old_id = $auth_admin->acl_options['id'][$copy_from];
+ $new_id = $auth_admin->acl_options['id'][$permission_name];
+
+ $tables = array(ACL_GROUPS_TABLE, ACL_ROLES_DATA_TABLE, ACL_USERS_TABLE);
+
+ foreach ($tables as $table)
+ {
+ $sql = 'SELECT *
+ FROM ' . $table . '
+ WHERE auth_option_id = ' . $old_id;
+ $result = _sql($sql, $errored, $error_ary);
+
+ $sql_ary = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $row['auth_option_id'] = $new_id;
+ $sql_ary[] = $row;
+ }
+ $db->sql_freeresult($result);
+
+ if (sizeof($sql_ary))
+ {
+ $db->sql_multi_insert($table, $sql_ary);
+ }
+ }
+
+ $auth_admin->acl_clear_prefetch();
+ }
+
+ return true;
+}
+
/****************************************************************************
* ADD YOUR DATABASE SCHEMA CHANGES HERE *
*****************************************************************************/
@@ -2458,6 +2522,12 @@ function change_database_data(&$no_updates, $version)
unset($next_legend);
}
+ // Rename styles module to Customise
+ $sql = 'UPDATE ' . MODULES_TABLE . "
+ SET module_langname = 'ACP_CAT_CUSTOMISE'
+ WHERE module_langname = 'ACP_CAT_STYLES'";
+ _sql($sql, $errored, $error_ary);
+
// Install modules
$modules_to_install = array(
'position' => array(
@@ -2495,10 +2565,67 @@ function change_database_data(&$no_updates, $version)
'auth' => '',
'cat' => 'UCP_PROFILE',
),
+ // To add a category, the mode and basename must be empty
+ // The mode is taken from the array key
+ '' => array(
+ 'base' => '',
+ 'class' => 'acp',
+ 'title' => 'ACP_EXTENSION_MANAGEMENT',
+ 'auth' => 'acl_a_extensions',
+ 'cat' => 'ACP_CAT_CUSTOMISE',
+ ),
+ 'extensions' => array(
+ 'base' => 'acp_extensions',
+ 'class' => 'acp',
+ 'title' => 'ACP_EXTENSIONS',
+ 'auth' => 'acl_a_extensions',
+ 'cat' => 'ACP_EXTENSION_MANAGEMENT',
+ ),
);
_add_modules($modules_to_install);
+ // We need a separate array for the new language sub heading
+ // because it requires another empty key
+ $modules_to_install = array(
+ '' => array(
+ 'base' => '',
+ 'class' => 'acp',
+ 'title' => 'ACP_LANGUAGE',
+ 'auth' => 'acl_a_language',
+ 'cat' => 'ACP_CAT_CUSTOMISE',
+ ),
+ );
+
+ _add_modules($modules_to_install);
+
+ // Move language management to new location in the Customise tab
+ // First get language module id
+ $sql = 'SELECT module_id FROM ' . MODULES_TABLE . "
+ WHERE module_basename = 'acp_language'";
+ $result = $db->sql_query($sql);
+ $language_module_id = $db->sql_fetchfield('module_id');
+ $db->sql_freeresult($result);
+ // Next get language management module id of the one just created
+ $sql = 'SELECT module_id FROM ' . MODULES_TABLE . "
+ WHERE module_langname = 'ACP_LANGUAGE'";
+ $result = $db->sql_query($sql);
+ $language_management_module_id = $db->sql_fetchfield('module_id');
+ $db->sql_freeresult($result);
+
+ if (!class_exists('acp_modules'))
+ {
+ include($phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx);
+ }
+ // acp_modules calls adm_back_link, which is undefined at this point
+ if (!function_exists('adm_back_link'))
+ {
+ include($phpbb_root_path . 'includes/functions_acp.' . $phpEx);
+ }
+ $module_manager = new acp_modules();
+ $module_manager->module_class = 'acp';
+ $module_manager->move_module($language_module_id, $language_management_module_id);
+
$sql = 'DELETE FROM ' . MODULES_TABLE . "
WHERE (module_basename = 'styles' OR module_basename = 'acp_styles') AND (module_mode = 'imageset' OR module_mode = 'theme' OR module_mode = 'template')";
_sql($sql, $errored, $error_ary);
@@ -2730,8 +2857,6 @@ function change_database_data(&$no_updates, $version)
$config->set('display_last_subject', '1');
}
- $no_updates = false;
-
if (!isset($config['assets_version']))
{
$config->set('assets_version', '1');
@@ -2770,7 +2895,7 @@ function change_database_data(&$no_updates, $version)
}
// PHPBB3-10601: Make inbox default. Add basename to ucp's pm category
-
+
// Get the category wanted while checking, at the same time, if this has already been applied
$sql = 'SELECT module_id, module_basename
FROM ' . MODULES_TABLE . "
@@ -2787,10 +2912,27 @@ function change_database_data(&$no_updates, $version)
SET module_basename = 'ucp_pm'
WHERE module_id = " . (int) $row['module_id'];
- _sql($sql, $errored, $error_ary);
+ _sql($sql, $errored, $error_ary);
}
$db->sql_freeresult($result);
+ // Add new permissions
+ include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
+ $auth_admin = new auth_admin();
+
+ _add_permission($auth_admin, $db, 'u_chgprofileinfo', true, 'u_sig');
+ _add_permission($auth_admin, $db, 'a_extensions', true, 'a_styles');
+
+ // Update the auth setting for the module
+ $sql = 'UPDATE ' . MODULES_TABLE . "
+ SET module_auth = 'acl_u_chgprofileinfo'
+ WHERE module_class = 'ucp'
+ AND module_basename = 'ucp_profile'
+ AND module_mode = 'profile_info'";
+ _sql($sql, $errored, $error_ary);
+
+ $no_updates = false;
+
break;
}
}
diff --git a/phpBB/install/index.php b/phpBB/install/index.php
index 09560946a6..2be5adaaac 100644
--- a/phpBB/install/index.php
+++ b/phpBB/install/index.php
@@ -215,7 +215,7 @@ $phpbb_style_path_provider = new phpbb_style_path_provider();
$template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, new phpbb_template_context());
$phpbb_style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template);
$phpbb_style->set_ext_dir_prefix('adm/');
-$phpbb_style->set_custom_style('admin', '../adm/style', '');
+$phpbb_style->set_custom_style('admin', '../adm/style', array(), '');
$template->assign_var('T_ASSETS_PATH', '../assets');
$template->assign_var('T_TEMPLATE_PATH', '../adm/style');
diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php
index b440f0ad2c..14f6ca30fb 100644
--- a/phpBB/install/install_install.php
+++ b/phpBB/install/install_install.php
@@ -2089,9 +2089,10 @@ class install_install extends module
'ACP_PERMISSION_ROLES',
'ACP_PERMISSION_MASKS',
),
- 'ACP_CAT_STYLES' => array(
+ 'ACP_CAT_CUSTOMISE' => array(
'ACP_STYLE_MANAGEMENT',
- 'ACP_STYLE_COMPONENTS',
+ 'ACP_EXTENSIONS_MANAGEMENT',
+ 'ACP_LANGUAGE',
),
'ACP_CAT_MAINTENANCE' => array(
'ACP_FORUM_LOGS',
diff --git a/phpBB/install/install_update.php b/phpBB/install/install_update.php
index ea9ead6659..53f9c52556 100644
--- a/phpBB/install/install_update.php
+++ b/phpBB/install/install_update.php
@@ -132,7 +132,7 @@ class install_update extends module
}
// Set custom template again. ;)
- $phpbb_style->set_custom_style('admin', '../adm/style', '');
+ $phpbb_style->set_custom_style('admin', '../adm/style', array(), '');
$template->assign_vars(array(
'S_USER_LANG' => $user->lang['USER_LANG'],
diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql
index dbb5fd7481..7c1a7d40f5 100644
--- a/phpBB/install/schemas/schema_data.sql
+++ b/phpBB/install/schemas/schema_data.sql
@@ -387,6 +387,7 @@ INSERT INTO phpbb_acl_options (auth_option, is_global) VALUES ('u_chgemail', 1);
INSERT INTO phpbb_acl_options (auth_option, is_global) VALUES ('u_chggrp', 1);
INSERT INTO phpbb_acl_options (auth_option, is_global) VALUES ('u_chgname', 1);
INSERT INTO phpbb_acl_options (auth_option, is_global) VALUES ('u_chgpasswd', 1);
+INSERT INTO phpbb_acl_options (auth_option, is_global) VALUES ('u_chgprofileinfo', 1);
INSERT INTO phpbb_acl_options (auth_option, is_global) VALUES ('u_download', 1);
INSERT INTO phpbb_acl_options (auth_option, is_global) VALUES ('u_hideonline', 1);
INSERT INTO phpbb_acl_options (auth_option, is_global) VALUES ('u_ignoreflood', 1);
@@ -548,7 +549,7 @@ INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT
INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 22, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_attach', 'f_bump', 'f_delete', 'f_flash', 'f_icons', 'f_ignoreflood', 'f_sticky', 'f_user_lock', 'f_votechg');
# New Member (u_)
-INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 23, auth_option_id, 0 FROM phpbb_acl_options WHERE auth_option LIKE 'u_%' AND auth_option IN ('u_sendpm', 'u_masspm', 'u_masspm_group');
+INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 23, auth_option_id, 0 FROM phpbb_acl_options WHERE auth_option LIKE 'u_%' AND auth_option IN ('u_sendpm', 'u_masspm', 'u_masspm_group', 'u_chgprofileinfo');
# New Member (f_)
INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 24, auth_option_id, 0 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option IN ('f_noapprove');
diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php
index 5eb10d50b3..427e4f4d98 100644
--- a/phpBB/language/en/acp/common.php
+++ b/phpBB/language/en/acp/common.php
@@ -59,6 +59,7 @@ $lang = array_merge($lang, array(
'ACP_CAPTCHA' => 'CAPTCHA',
+ 'ACP_CAT_CUSTOMISE' => 'Customise',
'ACP_CAT_DATABASE' => 'Database',
'ACP_CAT_DOT_MODS' => '.MODs',
'ACP_CAT_FORUMS' => 'Forums',
@@ -80,8 +81,10 @@ $lang = array_merge($lang, array(
'ACP_DISALLOW_USERNAMES' => 'Disallow usernames',
'ACP_EMAIL_SETTINGS' => 'Email settings',
- 'ACP_EXTENSION_GROUPS' => 'Manage extension groups',
- 'ACP_EXTENSIONS' => 'Manage board extensions',
+ 'ACP_EXTENSION_GROUPS' => 'Manage attachment extension groups',
+ 'ACP_EXTENSION_MANAGEMENT' => 'Extension management',
+ 'ACP_EXTENSIONS' => 'Extensions',
+
'ACP_FORUM_BASED_PERMISSIONS' => 'Forum based permissions',
'ACP_FORUM_LOGS' => 'Forum logs',
@@ -119,7 +122,7 @@ $lang = array_merge($lang, array(
'ACP_MANAGE_ATTACHMENTS' => 'Manage attachments',
'ACP_MANAGE_ATTACHMENTS_EXPLAIN' => 'Here you can list and delete files attached to posts and private messages.',
- 'ACP_MANAGE_EXTENSIONS' => 'Manage extensions',
+ 'ACP_MANAGE_EXTENSIONS' => 'Manage attachment extensions',
'ACP_MANAGE_FORUMS' => 'Manage forums',
'ACP_MANAGE_RANKS' => 'Manage ranks',
'ACP_MANAGE_REASONS' => 'Manage report/denial reasons',
@@ -166,7 +169,6 @@ $lang = array_merge($lang, array(
'ACP_SERVER_SETTINGS' => 'Server settings',
'ACP_SIGNATURE_SETTINGS' => 'Signature settings',
'ACP_SMILIES' => 'Smilies',
- 'ACP_STYLE_COMPONENTS' => 'Style components',
'ACP_STYLE_MANAGEMENT' => 'Style management',
'ACP_STYLES' => 'Styles',
'ACP_STYLES_CACHE' => 'Purge Cache',
diff --git a/phpBB/language/en/acp/permissions_phpbb.php b/phpBB/language/en/acp/permissions_phpbb.php
index b142cfd9aa..27ef714f8b 100644
--- a/phpBB/language/en/acp/permissions_phpbb.php
+++ b/phpBB/language/en/acp/permissions_phpbb.php
@@ -102,6 +102,7 @@ $lang = array_merge($lang, array(
'acl_u_chgemail' => array('lang' => 'Can change email address', 'cat' => 'profile'),
'acl_u_chgavatar' => array('lang' => 'Can change avatar', 'cat' => 'profile'),
'acl_u_chggrp' => array('lang' => 'Can change default usergroup', 'cat' => 'profile'),
+ 'acl_u_chgprofileinfo' => array('lang' => 'Can change profile field information', 'cat' => 'profile'),
'acl_u_attach' => array('lang' => 'Can attach files', 'cat' => 'post'),
'acl_u_download' => array('lang' => 'Can download files', 'cat' => 'post'),
diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php
index fbb7b40d41..6277457af7 100644
--- a/phpBB/language/en/common.php
+++ b/phpBB/language/en/common.php
@@ -186,6 +186,8 @@ $lang = array_merge($lang, array(
'ERR_CONNECTING_SERVER' => 'Error connecting to the server.',
'ERR_JAB_AUTH' => 'Could not authorise on Jabber server.',
'ERR_JAB_CONNECT' => 'Could not connect to Jabber server.',
+ 'ERR_TEMPLATE_EVENT_LOCATION' => 'The specified template event location <em>[%s]</em> is improperly formatted.',
+ 'ERR_TEMPLATE_COMPILATION' => 'The file could not be compiled: %s',
'ERR_UNABLE_TO_LOGIN' => 'The specified username or password is incorrect.',
'ERR_UNWATCHING' => 'An error occured while trying to unsubscribe.',
'ERR_WATCHING' => 'An error occured while trying to subscribe.',
diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php
index b919699ea0..267ae00710 100644
--- a/phpBB/language/en/ucp.php
+++ b/phpBB/language/en/ucp.php
@@ -318,6 +318,7 @@ $lang = array_merge($lang, array(
'NO_AUTH_FORWARD_MESSAGE' => 'You are not authorised to forward private messages.',
'NO_AUTH_GROUP_MESSAGE' => 'You are not authorised to send private messages to groups.',
'NO_AUTH_PASSWORD_REMINDER' => 'You are not authorised to request a new password.',
+ 'NO_AUTH_PROFILEINFO' => 'You are not authorised to change your profile information.',
'NO_AUTH_READ_HOLD_MESSAGE' => 'You are not authorised to read private messages that are on hold.',
'NO_AUTH_READ_MESSAGE' => 'You are not authorised to read private messages.',
'NO_AUTH_READ_REMOVED_MESSAGE' => 'You are not able to read this message because it was removed by the author.',
diff --git a/phpBB/styles/prosilver/template/jumpbox.html b/phpBB/styles/prosilver/template/jumpbox.html
index ff234464dc..dd793fbadc 100644
--- a/phpBB/styles/prosilver/template/jumpbox.html
+++ b/phpBB/styles/prosilver/template/jumpbox.html
@@ -10,13 +10,14 @@
<!-- ENDIF -->
<!-- IF S_DISPLAY_JUMPBOX -->
- <form method="post" id="jumpbox" action="{S_JUMPBOX_ACTION}" onsubmit="if(this.f.value == -1){return false;}">
+ <form method="get" id="jumpbox" action="{S_JUMPBOX_ACTION}" onsubmit="if(this.f.value == -1){return false;}">
<!-- IF $CUSTOM_FIELDSET_CLASS -->
<fieldset class="{$CUSTOM_FIELDSET_CLASS}">
<!-- ELSE -->
<fieldset class="jumpbox">
<!-- ENDIF -->
+ {HIDDEN_FIELDS_FOR_JUMPBOX}
<label for="f" accesskey="j"><!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->{L_COLON}</label>
<select name="f" id="f" onchange="if(this.options[this.selectedIndex].value != -1){ document.forms['jumpbox'].submit() }">
<!-- BEGIN jumpbox_forums -->
diff --git a/phpBB/styles/subsilver2/template/jumpbox.html b/phpBB/styles/subsilver2/template/jumpbox.html
index f4153d7692..e0603c6a6e 100644
--- a/phpBB/styles/subsilver2/template/jumpbox.html
+++ b/phpBB/styles/subsilver2/template/jumpbox.html
@@ -1,10 +1,10 @@
<!-- IF S_DISPLAY_JUMPBOX -->
- <form method="post" name="jumpbox" action="{S_JUMPBOX_ACTION}" onsubmit="if(document.jumpbox.f.value == -1){return false;}">
+ <form method="get" name="jumpbox" action="{S_JUMPBOX_ACTION}" onsubmit="if(document.jumpbox.f.value == -1){return false;}">
<table cellspacing="0" cellpadding="0" border="0">
<tr>
- <td nowrap="nowrap"><span class="gensmall"><!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->{L_COLON}</span>&nbsp;<select name="f" onchange="if(this.options[this.selectedIndex].value != -1){ document.forms['jumpbox'].submit() }">
+ <td nowrap="nowrap">{HIDDEN_FIELDS_FOR_JUMPBOX}<span class="gensmall"><!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->{L_COLON}</span>&nbsp;<select name="f" onchange="if(this.options[this.selectedIndex].value != -1){ document.forms['jumpbox'].submit() }">
<!-- BEGIN jumpbox_forums -->
<!-- IF jumpbox_forums.S_FORUM_COUNT eq 1 --><option value="-1">------------------</option><!-- ENDIF -->
diff --git a/phpBB/styles/subsilver2/template/mcp_jumpbox.html b/phpBB/styles/subsilver2/template/mcp_jumpbox.html
index 734222bc77..e6ef4ecdad 100644
--- a/phpBB/styles/subsilver2/template/mcp_jumpbox.html
+++ b/phpBB/styles/subsilver2/template/mcp_jumpbox.html
@@ -1,7 +1,8 @@
<!-- Note: no longer in use... -->
-<form name="jumpbox" method="post" action="{S_JUMPBOX_ACTION}">
+<form name="jumpbox" method="get" action="{S_JUMPBOX_ACTION}">
+ {HIDDEN_FIELDS_FOR_JUMPBOX}
<span class="gensmall">{L_JUMP_TO}{L_COLON}</span>&nbsp;<select name="f" onChange="if(this.options[this.selectedIndex].value != -1 && this.options[this.selectedIndex].value != document.jumpbox.current_f.value){ document.forms['jumpbox'].submit() }">
<!-- IF S_ENABLE_SELECT_ALL -->
diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php
index 3fde5b5e03..bd2c7bea77 100644
--- a/phpBB/viewtopic.php
+++ b/phpBB/viewtopic.php
@@ -1353,7 +1353,7 @@ if (sizeof($attach_list))
}
$template->assign_vars(array(
- 'S_HAS_ATTACHMENTS' => !empty($attachments),
+ 'S_HAS_ATTACHMENTS' => $topic_data['topic_attachment'],
));
$methods = phpbb_gen_download_links('topic_id', $topic_id, $phpbb_root_path, $phpEx);
diff --git a/tests/dbal/connect_test.php b/tests/dbal/connect_test.php
new file mode 100644
index 0000000000..1e352d6b03
--- /dev/null
+++ b/tests/dbal/connect_test.php
@@ -0,0 +1,41 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
+
+class phpbb_dbal_connect_test extends phpbb_database_test_case
+{
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__) . '/../fixtures/empty.xml');
+ }
+
+ public function test_failing_connect()
+ {
+ global $phpbb_root_path, $phpEx;
+
+ $config = $this->get_database_config();
+
+ $db = new $config['dbms']();
+
+ // Failure to connect results in a trigger_error call in dbal.
+ // phpunit converts triggered errors to exceptions.
+ // In particular there should be no fatals here.
+ try
+ {
+ $db->sql_connect($config['dbhost'], 'phpbbogus', 'phpbbogus', 'phpbbogus', $config['dbport']);
+ $this->assertFalse(true);
+ }
+ catch (Exception $e)
+ {
+ // should have a legitimate message
+ $this->assertNotEmpty($e->getMessage());
+ }
+ }
+}
diff --git a/tests/dbal/write_sequence_test.php b/tests/dbal/write_sequence_test.php
index 8975cfbfb1..f382a971a5 100644
--- a/tests/dbal/write_sequence_test.php
+++ b/tests/dbal/write_sequence_test.php
@@ -33,6 +33,10 @@ class phpbb_dbal_write_sequence_test extends phpbb_database_test_case
{
$db = $this->new_dbal();
+ // dbal uses cache
+ global $cache;
+ $cache = new phpbb_mock_cache();
+
$sql = 'INSERT INTO phpbb_users ' . $db->sql_build_array('INSERT', array(
'username' => $username,
'username_clean' => $username,
diff --git a/tests/fixtures/empty.xml b/tests/fixtures/empty.xml
index 96eb1ab483..195e30e38d 100644
--- a/tests/fixtures/empty.xml
+++ b/tests/fixtures/empty.xml
@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
- <table name="phpbb_posts">
+ <table name="phpbb_sessions">
+ <column>session_id</column>
+ <column>session_user_id</column>
+ <column>session_ip</column>
+ <column>session_browser</column>
</table>
</dataset>
diff --git a/tests/functional/auth_test.php b/tests/functional/auth_test.php
index e955dcb4df..662b1bd38b 100644
--- a/tests/functional/auth_test.php
+++ b/tests/functional/auth_test.php
@@ -18,9 +18,19 @@ class phpbb_functional_auth_test extends phpbb_functional_test_case
// check for logout link
$crawler = $this->request('GET', 'index.php');
+ $this->assert_response_success();
$this->assertContains($this->lang('LOGOUT_USER', 'admin'), $crawler->filter('.navbar')->text());
}
+ public function test_login_other()
+ {
+ $this->create_user('anothertestuser');
+ $this->login('anothertestuser');
+ $crawler = $this->request('GET', 'index.php');
+ $this->assert_response_success();
+ $this->assertContains('anothertestuser', $crawler->filter('.icon-logout')->text());
+ }
+
/**
* @depends test_login
*/
@@ -31,10 +41,12 @@ class phpbb_functional_auth_test extends phpbb_functional_test_case
// logout
$crawler = $this->request('GET', 'ucp.php?sid=' . $this->sid . '&mode=logout');
+ $this->assert_response_success();
$this->assertContains($this->lang('LOGOUT_REDIRECT'), $crawler->filter('#message')->text());
// look for a register link, which should be visible only when logged out
$crawler = $this->request('GET', 'index.php');
+ $this->assert_response_success();
$this->assertContains($this->lang('REGISTER'), $crawler->filter('.navbar')->text());
}
}
diff --git a/tests/functions/build_hidden_fields_for_query_params_test.php b/tests/functions/build_hidden_fields_for_query_params_test.php
new file mode 100644
index 0000000000..ef2f5744d3
--- /dev/null
+++ b/tests/functions/build_hidden_fields_for_query_params_test.php
@@ -0,0 +1,71 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
+
+class phpbb_build_hidden_fields_for_query_params_test extends phpbb_test_case
+{
+ public function build_hidden_fields_for_query_params_test_data()
+ {
+ return array(
+ // get
+ // post
+ // exclude
+ // expected
+ array(
+ array('foo' => 'bar'),
+ array(),
+ array(),
+ "<input type='hidden' name=\"foo\" value=\"bar\" />",
+ ),
+ array(
+ array('foo' => 'bar', 'a' => 'b'),
+ array(),
+ array(),
+ "<input type='hidden' name=\"foo\" value=\"bar\" /><input type='hidden' name=\"a\" value=\"b\" />",
+ ),
+ array(
+ array('a' => 'quote"', 'b' => '<less>'),
+ array(),
+ array(),
+ "<input type='hidden' name=\"a\" value='quote\"' /><input type='hidden' name=\"b\" value=\"&lt;less&gt;\" />",
+ ),
+ array(
+ array('a' => "quotes'\""),
+ array(),
+ array(),
+ "<input type='hidden' name=\"a\" value=\"quotes'&quot;\" />",
+ ),
+ array(
+ array('foo' => 'bar', 'a' => 'b'),
+ array('a' => 'c'),
+ array(),
+ "<input type='hidden' name=\"foo\" value=\"bar\" />",
+ ),
+ // strict equality check
+ array(
+ array('foo' => 'bar', 'a' => '0'),
+ array('a' => ''),
+ array(),
+ "<input type='hidden' name=\"foo\" value=\"bar\" />",
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider build_hidden_fields_for_query_params_test_data
+ */
+ public function test_build_hidden_fields_for_query_params($get, $post, $exclude, $expected)
+ {
+ $request = new phpbb_mock_request($get, $post);
+ $result = phpbb_build_hidden_fields_for_query_params($request, $exclude);
+
+ $this->assertEquals($expected, $result);
+ }
+}
diff --git a/tests/functions/quoteattr_test.php b/tests/functions/quoteattr_test.php
new file mode 100644
index 0000000000..9d2a7d470e
--- /dev/null
+++ b/tests/functions/quoteattr_test.php
@@ -0,0 +1,44 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
+
+class phpbb_quoteattr_test extends phpbb_test_case
+{
+ public function quoteattr_test_data()
+ {
+ return array(
+ array('foo', null, '"foo"'),
+ array('', null, '""'),
+ array(' ', null, '" "'),
+ array('<a>', null, '"&lt;a&gt;"'),
+ array('&amp;', null, '"&amp;amp;"'),
+ array('"hello"', null, "'\"hello\"'"),
+ array("'hello'", null, "\"'hello'\""),
+ array("\"'", null, "\"&quot;'\""),
+ array("a\nb", null, '"a&#10;b"'),
+ array("a\r\nb", null, '"a&#13;&#10;b"'),
+ array("a\tb", null, '"a&#9;b"'),
+ array('a b', null, '"a b"'),
+ array('"a<b"', null, "'\"a&lt;b\"'"),
+ array('foo', array('f' => 'z'), '"zoo"'),
+ array('<a>', array('a' => '&amp;'), '"&lt;&amp;&gt;"'),
+ );
+ }
+
+ /**
+ * @dataProvider quoteattr_test_data
+ */
+ public function test_quoteattr($input, $entities, $expected)
+ {
+ $output = phpbb_quoteattr($input, $entities);
+
+ $this->assertEquals($expected, $output);
+ }
+}
diff --git a/tests/mock/filesystem_extension_manager.php b/tests/mock/filesystem_extension_manager.php
new file mode 100644
index 0000000000..c5a51bbb3f
--- /dev/null
+++ b/tests/mock/filesystem_extension_manager.php
@@ -0,0 +1,32 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+class phpbb_mock_filesystem_extension_manager extends phpbb_mock_extension_manager
+{
+ public function __construct($phpbb_root_path)
+ {
+ $extensions = array();
+ $iterator = new DirectoryIterator($phpbb_root_path . 'ext/');
+ foreach ($iterator as $fileinfo)
+ {
+ if ($fileinfo->isDir() && substr($fileinfo->getFilename(), 0, 1) != '.')
+ {
+ $name = $fileinfo->getFilename();
+ $extension = array(
+ 'ext_name' => $name,
+ 'ext_active' => true,
+ 'ext_path' => 'ext/' . $name . '/',
+ );
+ $extensions[$name] = $extension;
+ }
+ }
+ ksort($extensions);
+ parent::__construct($phpbb_root_path, $extensions);
+ }
+}
diff --git a/tests/mock/null_cache.php b/tests/mock/null_cache.php
new file mode 100644
index 0000000000..7bd33b441b
--- /dev/null
+++ b/tests/mock/null_cache.php
@@ -0,0 +1,47 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+class phpbb_mock_null_cache
+{
+ public function __construct()
+ {
+ }
+
+ public function get($var_name)
+ {
+ return false;
+ }
+
+ public function put($var_name, $var, $ttl = 0)
+ {
+ }
+
+ public function destroy($var_name, $table = '')
+ {
+ }
+
+ public function obtain_bots()
+ {
+ return array();
+ }
+
+ public function obtain_word_list()
+ {
+ return array();
+ }
+
+ public function set_bots($bots)
+ {
+ }
+
+ public function sql_exists($query_id)
+ {
+ return false;
+ }
+}
diff --git a/tests/search/mysql_test.php b/tests/search/mysql_test.php
index 3ba3915714..3ad15bd806 100644
--- a/tests/search/mysql_test.php
+++ b/tests/search/mysql_test.php
@@ -26,7 +26,7 @@ class phpbb_search_mysql_test extends phpbb_search_common_test_case
parent::setUp();
// dbal uses cache
- $cache = new phpbb_cache_service(new phpbb_cache_driver_null);
+ $cache = new phpbb_mock_cache();
// set config values
$config['fulltext_mysql_min_word_len'] = 4;
diff --git a/tests/search/native_test.php b/tests/search/native_test.php
index eeee3a44f3..4a2c210013 100644
--- a/tests/search/native_test.php
+++ b/tests/search/native_test.php
@@ -26,7 +26,7 @@ class phpbb_search_native_test extends phpbb_search_test_case
parent::setUp();
// dbal uses cache
- $cache = new phpbb_cache_service(new phpbb_cache_driver_null);
+ $cache = new phpbb_mock_cache();
$this->db = $this->new_dbal();
$error = null;
diff --git a/tests/search/postgres_test.php b/tests/search/postgres_test.php
index 9c77e0c09e..923af6f854 100644
--- a/tests/search/postgres_test.php
+++ b/tests/search/postgres_test.php
@@ -26,7 +26,7 @@ class phpbb_search_postgres_test extends phpbb_search_common_test_case
parent::setUp();
// dbal uses cache
- $cache = new phpbb_cache_service(new phpbb_cache_driver_null);
+ $cache = new phpbb_mock_cache();
// set config values
$config['fulltext_postgres_min_word_len'] = 4;
diff --git a/tests/template/datasets/event_inheritance/ext/kappa/styles/all/template/test.html b/tests/template/datasets/event_inheritance/ext/kappa/styles/all/template/test.html
new file mode 100644
index 0000000000..3eb906a09e
--- /dev/null
+++ b/tests/template/datasets/event_inheritance/ext/kappa/styles/all/template/test.html
@@ -0,0 +1 @@
+Kappa test event in all
diff --git a/tests/template/datasets/event_inheritance/ext/kappa/styles/silver/template/test.html b/tests/template/datasets/event_inheritance/ext/kappa/styles/silver/template/test.html
new file mode 100644
index 0000000000..3b65d80a6d
--- /dev/null
+++ b/tests/template/datasets/event_inheritance/ext/kappa/styles/silver/template/test.html
@@ -0,0 +1 @@
+Kappa test event in silver
diff --git a/tests/template/datasets/event_inheritance/ext/kappa/styles/silver_inherit/template/test.html b/tests/template/datasets/event_inheritance/ext/kappa/styles/silver_inherit/template/test.html
new file mode 100644
index 0000000000..26826d59e3
--- /dev/null
+++ b/tests/template/datasets/event_inheritance/ext/kappa/styles/silver_inherit/template/test.html
@@ -0,0 +1 @@
+Kappa test event in silver_inherit
diff --git a/tests/template/datasets/event_inheritance/ext/omega/styles/all/template/test.html b/tests/template/datasets/event_inheritance/ext/omega/styles/all/template/test.html
new file mode 100644
index 0000000000..003d193dc3
--- /dev/null
+++ b/tests/template/datasets/event_inheritance/ext/omega/styles/all/template/test.html
@@ -0,0 +1 @@
+Omega test event in all
diff --git a/tests/template/datasets/event_inheritance/ext/omega/styles/silver/template/test.html b/tests/template/datasets/event_inheritance/ext/omega/styles/silver/template/test.html
new file mode 100644
index 0000000000..6bf06f5457
--- /dev/null
+++ b/tests/template/datasets/event_inheritance/ext/omega/styles/silver/template/test.html
@@ -0,0 +1 @@
+Omega test event in silver
diff --git a/tests/template/datasets/event_inheritance/ext/omega/styles/silver/template/two.html b/tests/template/datasets/event_inheritance/ext/omega/styles/silver/template/two.html
new file mode 100644
index 0000000000..7f8058f4e4
--- /dev/null
+++ b/tests/template/datasets/event_inheritance/ext/omega/styles/silver/template/two.html
@@ -0,0 +1 @@
+two in silver in omega
diff --git a/tests/template/datasets/event_inheritance/ext/zeta/styles/all/template/test.html b/tests/template/datasets/event_inheritance/ext/zeta/styles/all/template/test.html
new file mode 100644
index 0000000000..5fc7e5ac12
--- /dev/null
+++ b/tests/template/datasets/event_inheritance/ext/zeta/styles/all/template/test.html
@@ -0,0 +1 @@
+Zeta test event in all
diff --git a/tests/template/datasets/event_inheritance/styles/silver/template/event_test.html b/tests/template/datasets/event_inheritance/styles/silver/template/event_test.html
new file mode 100644
index 0000000000..4d78dddb12
--- /dev/null
+++ b/tests/template/datasets/event_inheritance/styles/silver/template/event_test.html
@@ -0,0 +1 @@
+<!-- EVENT test -->
diff --git a/tests/template/datasets/event_inheritance/styles/silver/template/event_two.html b/tests/template/datasets/event_inheritance/styles/silver/template/event_two.html
new file mode 100644
index 0000000000..fe46be3782
--- /dev/null
+++ b/tests/template/datasets/event_inheritance/styles/silver/template/event_two.html
@@ -0,0 +1 @@
+<!-- EVENT two -->
diff --git a/tests/template/datasets/event_inheritance/styles/silver_inherit/template/event_test.html b/tests/template/datasets/event_inheritance/styles/silver_inherit/template/event_test.html
new file mode 100644
index 0000000000..4d78dddb12
--- /dev/null
+++ b/tests/template/datasets/event_inheritance/styles/silver_inherit/template/event_test.html
@@ -0,0 +1 @@
+<!-- EVENT test -->
diff --git a/tests/template/datasets/ext_trivial/ext/trivial/styles/all/template/universal.html b/tests/template/datasets/ext_trivial/ext/trivial/styles/all/template/universal.html
new file mode 100644
index 0000000000..f2c5762ade
--- /dev/null
+++ b/tests/template/datasets/ext_trivial/ext/trivial/styles/all/template/universal.html
@@ -0,0 +1 @@
+Universal in trivial extension.
diff --git a/tests/template/datasets/ext_trivial/ext/trivial/styles/silver/template/simple.html b/tests/template/datasets/ext_trivial/ext/trivial/styles/silver/template/simple.html
new file mode 100644
index 0000000000..fe32a1ed3f
--- /dev/null
+++ b/tests/template/datasets/ext_trivial/ext/trivial/styles/silver/template/simple.html
@@ -0,0 +1 @@
+Simple in trivial extension.
diff --git a/tests/template/datasets/ext_trivial/styles/silver/template/event_simple.html b/tests/template/datasets/ext_trivial/styles/silver/template/event_simple.html
new file mode 100644
index 0000000000..604c1acdce
--- /dev/null
+++ b/tests/template/datasets/ext_trivial/styles/silver/template/event_simple.html
@@ -0,0 +1 @@
+<!-- EVENT simple -->
diff --git a/tests/template/datasets/ext_trivial/styles/silver/template/event_universal.html b/tests/template/datasets/ext_trivial/styles/silver/template/event_universal.html
new file mode 100644
index 0000000000..15425cacc3
--- /dev/null
+++ b/tests/template/datasets/ext_trivial/styles/silver/template/event_universal.html
@@ -0,0 +1 @@
+<!-- EVENT universal -->
diff --git a/tests/template/includephp_test.php b/tests/template/includephp_test.php
index c93a53e2ad..f1012b6939 100644
--- a/tests/template/includephp_test.php
+++ b/tests/template/includephp_test.php
@@ -48,7 +48,7 @@ class phpbb_template_includephp_test extends phpbb_template_template_test_case
$this->setup_engine(array('tpl_allow_php' => true));
- $this->style->set_custom_style('tests', $cache_dir, '');
+ $this->style->set_custom_style('tests', $cache_dir, array(), '');
$cache_file = $this->template->cachepath . 'includephp_absolute.html.php';
$this->run_template('includephp_absolute.html', array(), array(), array(), "Path is absolute.\ntesting included php", $cache_file);
diff --git a/tests/template/template_compile_test.php b/tests/template/template_compile_test.php
index 0cfcd6ceb5..7393fc1747 100644
--- a/tests/template/template_compile_test.php
+++ b/tests/template/template_compile_test.php
@@ -16,7 +16,7 @@ class phpbb_template_template_compile_test extends phpbb_test_case
protected function setUp()
{
- $this->template_compile = new phpbb_template_compile(false, null, '');
+ $this->template_compile = new phpbb_template_compile(false, null, $this->style_resource_locator, '');
$this->template_path = dirname(__FILE__) . '/templates';
}
diff --git a/tests/template/template_events_test.php b/tests/template/template_events_test.php
new file mode 100644
index 0000000000..6cea9b92e3
--- /dev/null
+++ b/tests/template/template_events_test.php
@@ -0,0 +1,118 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2011 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/template_test_case.php';
+
+class phpbb_template_template_events_test extends phpbb_template_template_test_case
+{
+ public function template_data()
+ {
+ return array(
+ /*
+ array(
+ '', // file
+ '', // dataset
+ array(), // style names
+ array(), // vars
+ array(), // block vars
+ array(), // destroy
+ '', // expected result
+ ),
+ */
+ array(
+ 'Simple template event',
+ 'ext_trivial',
+ array(),
+ 'event_simple.html',
+ array(),
+ array(),
+ array(),
+ "Simple in trivial extension.",
+ ),
+ array(
+ 'Universal template event ("all" style)',
+ 'ext_trivial',
+ array(),
+ 'event_universal.html',
+ array(),
+ array(),
+ array(),
+ "Universal in trivial extension.",
+ ),
+ array(
+ 'Template event with inheritance - parent',
+ 'event_inheritance',
+ array('silver'),
+ 'event_test.html',
+ array(),
+ array(),
+ array(),
+'Kappa test event in all
+Omega test event in all
+Zeta test event in all
+Kappa test event in silver
+Omega test event in silver',
+ ),
+ array(
+ 'Template event with inheritance - child',
+ 'event_inheritance',
+ array('silver_inherit', 'silver'),
+ 'event_test.html',
+ array(),
+ array(),
+ array(),
+'Kappa test event in all
+Omega test event in all
+Zeta test event in all
+Kappa test event in silver_inherit',
+ ),
+ array(
+ 'Definition in parent style',
+ 'event_inheritance',
+ array('silver_inherit', 'silver'),
+ 'event_two.html',
+ array(),
+ array(),
+ array(),
+'two in silver in omega',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider template_data
+ */
+ public function test_event($desc, $dataset, $style_names, $file, array $vars, array $block_vars, array $destroy, $expected)
+ {
+ // Reset the engine state
+ $this->setup_engine_for_events($dataset, $style_names);
+
+ // Run test
+ $cache_file = $this->template->cachepath . str_replace('/', '.', $file) . '.php';
+ $this->run_template($file, $vars, $block_vars, $destroy, $expected, $cache_file);
+ }
+
+ protected function setup_engine_for_events($dataset, $style_names, array $new_config = array())
+ {
+ global $phpbb_root_path, $phpEx, $user;
+
+ $defaults = $this->config_defaults();
+ $config = new phpbb_config(array_merge($defaults, $new_config));
+
+ $this->template_path = dirname(__FILE__) . "/datasets/$dataset/styles/silver/template";
+ $this->style_resource_locator = new phpbb_style_resource_locator();
+ $this->extension_manager = new phpbb_mock_filesystem_extension_manager(
+ dirname(__FILE__) . "/datasets/$dataset/"
+ );
+ $this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, new phpbb_template_context, $this->extension_manager);
+ $this->style_provider = new phpbb_style_path_provider();
+ $this->style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, $this->style_provider, $this->template);
+ $this->style->set_custom_style('silver', array($this->template_path), $style_names, '');
+ }
+}
diff --git a/tests/template/template_test_case.php b/tests/template/template_test_case.php
index 2e6f703eb1..3c997cb00e 100644
--- a/tests/template/template_test_case.php
+++ b/tests/template/template_test_case.php
@@ -69,7 +69,7 @@ class phpbb_template_template_test_case extends phpbb_test_case
$this->style_provider = new phpbb_style_path_provider();
$this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, new phpbb_template_context());
$this->style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, $this->style_provider, $this->template);
- $this->style->set_custom_style('tests', $this->template_path, '');
+ $this->style->set_custom_style('tests', $this->template_path, array(), '');
}
protected function setUp()
diff --git a/tests/template/template_test_case_with_tree.php b/tests/template/template_test_case_with_tree.php
index 6a226f317a..7585be5728 100644
--- a/tests/template/template_test_case_with_tree.php
+++ b/tests/template/template_test_case_with_tree.php
@@ -24,6 +24,6 @@ class phpbb_template_template_test_case_with_tree extends phpbb_template_templat
$this->style_provider = new phpbb_style_path_provider();
$this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, new phpbb_template_context());
$this->style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, $this->style_provider, $this->template);
- $this->style->set_custom_style('tests', array($this->template_path, $this->parent_template_path), '');
+ $this->style->set_custom_style('tests', array($this->template_path, $this->parent_template_path), array(), '');
}
}
diff --git a/tests/template/templates/events.html b/tests/template/templates/events.html
new file mode 100644
index 0000000000..c44a7469e7
--- /dev/null
+++ b/tests/template/templates/events.html
@@ -0,0 +1,4 @@
+<!-- EVENT child_only -->
+<!-- EVENT parent_only -->
+<!-- EVENT parent_and_child -->
+<!-- EVENT random_event -->
diff --git a/tests/test_framework/phpbb_database_test_connection_manager.php b/tests/test_framework/phpbb_database_test_connection_manager.php
index 3fe3ab8d90..4ce5f03a8b 100644
--- a/tests/test_framework/phpbb_database_test_connection_manager.php
+++ b/tests/test_framework/phpbb_database_test_connection_manager.php
@@ -444,7 +444,7 @@ class phpbb_database_test_connection_manager
switch ($this->config['dbms'])
{
- case 'oracle':
+ case 'phpbb_db_driver_oracle':
// Get all of the information about the sequences
$sql = "SELECT t.table_name, tc.column_name, d.referenced_name as sequence_name, s.increment_by, s.min_value
FROM USER_TRIGGERS t
@@ -486,7 +486,7 @@ class phpbb_database_test_connection_manager
}
break;
- case 'postgres':
+ case 'phpbb_db_driver_postgres':
// Get the sequences attached to the tables
$sql = 'SELECT column_name, table_name FROM information_schema.columns
WHERE table_name IN (' . implode(', ', $table_names) . ")
diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php
index 2a24e96a25..3bfbcd8c7b 100644
--- a/tests/test_framework/phpbb_functional_test_case.php
+++ b/tests/test_framework/phpbb_functional_test_case.php
@@ -34,13 +34,36 @@ class phpbb_functional_test_case extends phpbb_test_case
static protected $config = array();
static protected $already_installed = false;
- public function setUp()
+ static public function setUpBeforeClass()
{
+ parent::setUpBeforeClass();
+
+ self::$config = phpbb_test_case_helpers::get_test_config();
+
+ // Important: this is used both for installation and by
+ // test cases for querying the tables.
+ // Therefore table prefix must be set before a board is
+ // installed, and also before each test case is run.
+ self::$config['table_prefix'] = 'phpbb_';
+
if (!isset(self::$config['phpbb_functional_url']))
{
- $this->markTestSkipped('phpbb_functional_url was not set in test_config and wasn\'t set as PHPBB_FUNCTIONAL_URL environment variable either.');
+ self::markTestSkipped('phpbb_functional_url was not set in test_config and wasn\'t set as PHPBB_FUNCTIONAL_URL environment variable either.');
}
+ if (!self::$already_installed)
+ {
+ self::install_board();
+ self::$already_installed = true;
+ }
+ }
+
+ public function setUp()
+ {
+ parent::setUp();
+
+ $this->bootstrap();
+
$this->cookieJar = new CookieJar;
$this->client = new Goutte\Client(array(), null, $this->cookieJar);
// Reset the curl handle because it is 0 at this point and not a valid
@@ -73,13 +96,6 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->backupStaticAttributesBlacklist += array(
'phpbb_functional_test_case' => array('config', 'already_installed'),
);
-
- if (!static::$already_installed)
- {
- $this->install_board();
- $this->bootstrap();
- static::$already_installed = true;
- }
}
protected function get_db()
@@ -133,19 +149,11 @@ class phpbb_functional_test_case extends phpbb_test_case
return $this->extension_manager;
}
- protected function install_board()
+ static protected function install_board()
{
global $phpbb_root_path, $phpEx;
- self::$config = phpbb_test_case_helpers::get_test_config();
-
- if (!isset(self::$config['phpbb_functional_url']))
- {
- return;
- }
-
- self::$config['table_prefix'] = 'phpbb_';
- $this->recreate_database(self::$config);
+ self::recreate_database(self::$config);
if (file_exists($phpbb_root_path . "config.$phpEx"))
{
@@ -190,19 +198,20 @@ class phpbb_functional_test_case extends phpbb_test_case
));
// end data
- $content = $this->do_request('install');
- $this->assertContains('Welcome to Installation', $content);
+ $content = self::do_request('install');
+ self::assertNotSame(false, $content);
+ self::assertContains('Welcome to Installation', $content);
- $this->do_request('create_table', $data);
+ self::do_request('create_table', $data);
- $this->do_request('config_file', $data);
+ self::do_request('config_file', $data);
file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data($data, self::$config['dbms'], true, true));
- $this->do_request('final', $data);
+ self::do_request('final', $data);
copy($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_test.$phpEx");
}
- private function do_request($sub, $post_data = null)
+ static private function do_request($sub, $post_data = null)
{
$context = null;
@@ -221,13 +230,67 @@ class phpbb_functional_test_case extends phpbb_test_case
return file_get_contents(self::$config['phpbb_functional_url'] . 'install/index.php?mode=install&sub=' . $sub, false, $context);
}
- private function recreate_database($config)
+ static private function recreate_database($config)
{
$db_conn_mgr = new phpbb_database_test_connection_manager($config);
$db_conn_mgr->recreate_db();
}
- protected function login()
+ /**
+ * Creates a new user with limited permissions
+ *
+ * @param string $username Also doubles up as the user's password
+ * @return int ID of created user
+ */
+ protected function create_user($username)
+ {
+ // Required by unique_id
+ global $config;
+
+ if (!is_array($config))
+ {
+ $config = array();
+ }
+
+ $config['rand_seed'] = '';
+ $config['rand_seed_last_update'] = time() + 600;
+
+ // Required by user_add
+ global $db, $cache, $config, $phpbb_dispatcher;
+ $db = $this->get_db();
+ if (!function_exists('phpbb_mock_null_cache'))
+ {
+ require_once(__DIR__ . '/../mock/null_cache.php');
+ }
+ $cache = new phpbb_mock_null_cache;
+
+ if (!function_exists('utf_clean_string'))
+ {
+ require_once(__DIR__ . '/../../phpBB/includes/utf/utf_tools.php');
+ }
+ if (!function_exists('user_add'))
+ {
+ require_once(__DIR__ . '/../../phpBB/includes/functions_user.php');
+ }
+ $config = new phpbb_config(array());
+ set_config(null, null, null, $config);
+ set_config_count(null, null, null, $config);
+ $phpbb_dispatcher = new phpbb_mock_event_dispatcher();
+
+ $user_row = array(
+ 'username' => $username,
+ 'group_id' => 2,
+ 'user_email' => 'nobody@example.com',
+ 'user_type' => 0,
+ 'user_lang' => 'en',
+ 'user_timezone' => 0,
+ 'user_dateformat' => '',
+ 'user_password' => phpbb_hash($username),
+ );
+ return user_add($user_row);
+ }
+
+ protected function login($username = 'admin')
{
$this->add_lang('ucp');
@@ -235,7 +298,9 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->assertContains($this->lang('LOGIN_EXPLAIN_UCP'), $crawler->filter('html')->text());
$form = $crawler->selectButton($this->lang('LOGIN'))->form();
- $login = $this->client->submit($form, array('username' => 'admin', 'password' => 'admin'));
+ $crawler = $this->client->submit($form, array('username' => $username, 'password' => $username));
+ $this->assert_response_success();
+ $this->assertContains($this->lang('LOGIN_REDIRECT'), $crawler->filter('html')->text());
$cookies = $this->cookieJar->all();
m U Zdmoʁi# b[w"^Ď(Š#r^^=EVW@c;>" nx0~B 4'xql%*JQr*n;|}21-7vknfĈmU4@tXIm¤i}M֌@,otwnUu7PlfXm<\Xb 4w}c!:Ԛu9ŪPJeb*:\̸r g,}hBr&-ɕkeO!$0!MZ)H3́"yt{$?Lm Riޖ-2L3Y2MR0C;x%tv˵#Hd ovg UrŠʱXI jx*:!SꔣRjZiNH>dqzl2RFntn]샭B=mx:¼g4tZ:@f4EYH6/u6ԓ`:;Ns]>pP5𕒂+v!mS#Qtexp.jEl~ٛ4o:%]:`ҪxO&19_Ay.TdXkSf3f2F1PFóZf6n3k448M`NܩIO #bS+m.GSgia>oc-l&N-마BMe\p&[;XRO+ d0b$X|ܤ,] jF`(鞍d^qOc?'Q] 1r3x"dy#9uJ:UZ:B|Z7Ke V`;M P\s㶖U&)dA|X_t,eC_9sU~mhF"LH ~Z 4bp#,6?s?sz`9h%L 58~p~׽LGft&"O ))hQ0DR%'3fVRC΂y6<66o68>VnT)XHeY_@!LhA \ppY443m$(iem5JVCuV1??4h&PFI tM'.eq vJE,W(]OSe?\cPT!_;wgM>0# _As7*oD_gDg41 52 v=1ss/g05/LM 訟+ЪճԂQJvzp ^.#NS׷mp=LGEWi_dg M{oof+k+\UCоeG?jY jR>4ȃ!M0X^5c.AQ,PYÑeOW+Ǯ܏+AY6Z596X7PTXf.#k/o.9RGu Zh^>A|κKI,pĜf&"yz+#$b.|2%d}ZnO(jnhFmi$A6.;lnŴuQ'RaVLI:kxGٜl9L V -J :,-~nJCc <Za i6ɍwuӷ"`Mm+/2̵ͪ ZZնk)3Xg΋L (i݁6++uE{Wcn'4nUyc*N*ԺCegvB\_N͔qf?+ Vw LSm O6PުS[PTΌ/˓m˽l,请 H;H##En&k%+RolJ.$*`B鳰C #&R~;}~f¡0D)$ٯRcC&o6A2:D]̰[hק]rL'z9'{!ZfTnҢVh띨\q`VPl&W484v t'qHḇn|rL5U>cHBVKt@~=(>VKÅм GQ ~ӑ`d6[iʳzE7Vr#ܙSq.'`ФÐc̺o9ruV9JS;_XM0Ķ0eq3PZ*SDQG7rl= B{A21n"\ Mqt< Y<_ԧvшlM.Pۻoq5GFbR6J۶D3 n|Xi;39A"W)Lyt?;`x][ q'{aBM^gC }Cd!o@(99Ջ<];]}Y<:GHsՆ.Z0JSs1S|}n-% TlܜrPC7lt.ۨnApwؠ~ & Y{' hVx3Y=ĥЩ$MYqw?~N4pк5k^t5[dGMvfĿ3M*7+2G|+:*>P-k'q֘hp[)ޜl=UX)Qo&۹#Lf,wW4>C[E&[P13i}_FCo^:S/`;4 CSݱq<<0ScwOҩp.&BϙB܋qLeTfq+('pbwm:L^16F8 ݽ*bLOȷG_ $L6m!vѭONޢ5Q<R .!:5~O NJDM۩J.J1քh# Zi-OF`#4xn:* c{Wm|6'|`!.e O[9|˥"}Z7~&ȬYy)"Ue6tMT>:`:R6D^;Ncc6CIw7/-;c;> ,=W'ݓ}6T! .@luJ)&Nz}?jJ)i۱ (?NL?hv- ) !,Z a`vS~Fݛfzt>jETj!J.]c@ci:yī[N|lMdEu(LIRV^;~'Eʊ OY(G0>{]CzMKt Lh6Ɋk1rk5[_/`M/FHf/ՆjHPXᯔ/2?jۮRX̼y•lg3"| 7189at ϽM*OuC*08;גr/C̅d=$NBeƪ .V#qf\`o`85qMm]WoT B^NZ( cCǗNl)PH}iԋtwF, M(Uj<6I v *JbN&W8zJxrG x_,Jlx)hkCrC} ?a>3۶\ e6 ̂Cg4jQ:)P^fHjf3X>*M-ՆVÙ -X4ƩeH*$'ss+O$b~{(h~k ](bvƐ:vY2 S䑊SlGfը^HYF!~/vfDوlt(r`bx^"UY-n{1aIU aMƤ,;QuҖ (Dڦ$lcnM3ıi= 8D ?ióP%ў ǕVPXOj Znu^ɤ|.;~6KJ@-v c,՟W4PF*vqV5tqLߟR;jS,70YѼ?;q#F0=yMw6#25L#9G$\ncAM+h, UZNI<7ƆRTf\`ٴXFϗq/_w X̯BE|y:nTG[3C}~ عL'M)>t f#X12-Իpa juqnnȉ\)jϹ#&S]l}DSy+ٵZBaq^uyOfXor *&398cεX^ʑ )~Xw ůNDzȶ0XO?5s{qy.B:a8~PV>Ŝf$-X:Vm[W^K Ng<_y7zKUx^ljhCocUFTԳˋDu3.WaAF#\5$9*tBb4&-Iw3= fjxoh}T.'|\v,Wiy@xQ^01Wh4cBlvnBPx)5W9gFGA+sWDU =]se+iDovLГ`ON/@H_W)x BwA ~D#f0g(OB/ȮVr*E/Ƣɏ:օ=mT-Ƣp9v5!GYivRQm-m_]rGˤ_Z6뚧%qвіRü?]ݠ@aNxQjk@:̩A&⢦E6+hfl6LrfՒ/\swdӻ!-_MzD(Ljo"?g W~|.I 2+ԗ x`d/ǀ&`R8il- }g`8\ ^$S_{JPA%EaɭӝZ %V\tZj>Uc}/D[C)Hm{fn̿@/E񳳑*w-'%l  2ކ}5yY=SK.< Y͕/ n[ T'"K:΋s(uWϗoFP֥7Qev(p-Y^a8 bڸc\bz]SzQ6%|F RSi HpkcKkGqOv j4pY{n.mqG©ȍrqd)(b6_y\ucU/|=:pC6{\ Ky%NC7Ar7R1Lw'0j,*F|K:>X-Avh~<T&\Ry -Xn5.JRC+7?f5fpIItljp kQ{ԓomɈC_ZbݓrSb/X*~Ϲb`dZ4h ")"ډ0ysyE@2L@E5 0157:1Բ3ktG]&~6~'!dJ&]m֟+ kjZ43!!:yHcq3eaBpKFKYSFW"!`_@_/1@- L[<4PjzÜo>Oz%ȃs毢Kd6k|n8)xTImw00QLb^p'M^3 m"1&ҦpQJ>^9TϓK8Ȳi`]:eq{$5"X3钂D>g0N(O|@Z0z>}JKvф@JCU-LJp3l@{跴 L?'{0ʼnS[B/qzX\~\96Ɠbīw@#jgɒ4i,ɋ-_s߇W9qaTנ*FR>"J Sajw'Y=jn8q5`py#N?W6kG2;g2 VO>)H {&+^% :VhksկZkbT>QbUs,$"Vdѯ^1!E@b&Ky+[v]A}0xh~&D _1FDjpc?\.]` ~T -Ic!6!?Ժ/̸zm\7#[k+KȽw_{?.$C P{$xĿM<[@Mզm%5;!H\Z%. 1")OOC1%;E QY|ݫU0!t߀ ^CpE:3 `).v<8$M3l 6%ztqD#P#h[)fNih1: Z;6x3HTL%]SV魕Ɍ? P/u!YbR>\Z$e[}#*N [N_*Qv(L0C%թ=g䆵Vx=E")ƴt~i"CQ !0UU?5fR)ggPR'ZyJ82 l=n9w=<ֵ޼:vu\\@0{r#nbO7-5H 3=Gл: \B`4-# :J{ZY~#.ɯ͎љ];.lq$^adW=on5Uф Z|F&̝ksnUE1K lR$F|x+ yUXɜ.io;זL"SF*ZVYe_>TVOQ1] š,*~wmIkTIދ*<25?9ciL)jύdiʠvwi6ֈ G,Z+;eNKHKtN]`N]NԢ 6;׈\N,$'27ߢRedu6>Ϯ6EL}2]N]qWY*e V",X> 5;I7#xƸAQ4I m. j ɫ:k@u  Nʍ߹C ٍb›RvXRiF/{3_h ILTpc0/-p|myM^0% r?3q%nCCga@7DtA@pƛ~, WI6M*L;~bRhd/;yߨ,#"KZ~e`$"J ЅBdWW;5$*ąfi8nͲL"CSi$I>V՜(}i⪎^9dXpA1XL,UOzkMw5>6u\Ƈ#d΃g<^ 4;jB\gs&-ؘTo|_Ԕz)J.9R(wZMyOK*HxʷHiNd*{Z>р$ 6M"SXk xQgIjB?1vmدkC;J}6CoT1WHYb3Wqӄuu BمW QRhJp}[qx B=ʿI8xWw :E>*{}un'^v!n}uj6TB ,Pl${]gZz wX/Bhč@sQ/aw#ԠM I:$8"3@Z( $ӢYO'=CGeS(&ʂ_ p-1 `+ul>ڢq)E#Sz SGOR4YaՔ{))nѤ@&1xXϳiQ2 4m&8oρ cmP4H :XƯ|/(rF8ؐؐh%ŞբB :y0>fhUV]4Ed&?(.D8W$.1=uk lRΣsI1bݛw1yv \6z_X)Ȋ:w.Y%qN(xAt\Dx/&Cֺ>I(xٙvu%Y`QRځI' ,S?%-7dhp+%>^B7L6yNzz V5uvY\U=(wE"fX@xwuu$:YaMKH^d*|n̦Ê/Zq* .O+EJNx9J(>zxYXq"|OI)Iܲ&pһcWΩ'K|pxvʄ@k,щH0 7}=hgWd R-DlRDY9冷4b!,@&cXy>O+JKsyu -~e3} dDx9\ 񃘍$,1T'od~&A[oLJ8.w)Lf Jt fvgGI5<Ħaly0[-ZBϔd<-kroӋZ&\ A(}~q2|g_<4Lb` 5vs`dۻ79e޽9&;-xe}(v8&t:y""m>|xYLvo :f[cܑ#1)%| Ml9C:<iaFhX5m*<9A91͇+܅k}((M&xehpXB%(vO \G?V:~ xfG '$>G*1GNAޮip(N Eicd+6j?p^n:J婠- ൝~NS1jWM]DaMSQKU_ UqR=B#YA9+@3YFV~c*^#f_P}MX90#@ͪai`ڐ(ew 2)w(wLΔ>qEJK Kxlqѿ@o`ةɡ6`MeOI 0hỜ>WlTLqK,w\6O";im(2c#6+ua:ۋUBVtnpd[ƪR,5~ʥ{;=fBwݬ8"%Z`>KQuKﯜA%'oNgU1ax8-\9>n2fPDWΤtdG},&(l'lW&Su7 V7TXM7(XRێטSNc9~W 'ܤ2|_q+)$q;Qv6Nq*k $s$Mj6Ryba"sy:5ܾm= HUW vx=>PVۋΧPd |@P-n9Y}:A`Sz:;lqj8lpl ůjd JvZ.:Ř9l,ŽjUHav׌W}j VPNyEE<zf4";,wȓ~Duo5q9W*Dq`pS7B``ֵ'&+&`A]F\P@npuvҙK>/lRpwJj 0`ο)7䍋&O8N "p51(ϓf PRcEqyzsqlS }z!-ugF3⍬{ %t?yS*4Ƞ`9VbH: Ym04gG qg~{Kf0.@{^XjhZmSz#^^/ix֋ ڸKũ~*6eq i#z); 5f['K/oMLMo7(vI'dRy D5- jfyUBȹH 79)*k`IWjvz?LAd+iS3%ur{~7]z4||Ⱦ~ȕlUP j hIg4}#!9V+!? iaq';V64QdPn؉ña:jRWUV'ʷmEp-;ib`LlWa!ܢCif{?3 g?&#c#\bM2>kp^S` @- +ܡԁu{Ҿ2GgiA; A35[4s[ y4mxCpcZ۟p`ׄ&0=ڶ:Rܜx3u}%ܠ0Xanf[GbVaR0~~ I̷MNN]?9R3׃B lvzC:sOjٟ,8;/=}Dɜfk(;|^:oZ[h|fPn 5Ýb' A{w4uIew>DCOJ#ʪ=`LZǰ7'PPNmқz: 3s0[>6(WߡH$5x3N9,&hoMuba0/MGe ĒtP!ݷtPw4ۜ7 ѩllUͶ&bsKEzBHdOhWc>r^< ͳ1x N`t,psT/ Di@WV\W"%]nj-etc J X)54Iwnab oGz.~/9HՖӮτT#49yXY]<@ˊh1޷Ѯ\XTX?&9LoXW0&iݕ4E{U X@ě\A+9onH!ScS7C,liFwHe1<:% m-Zr\84P:TQF0, 4I/3*qN (7+DK}.DRkUnYc{GmZe*m q^a97љ;.Vyw{R^g#LGf9F:[p1xle"jQlMM/X^?;.^ T\-r[?>8%eP~pуɤ]06T}K9zp$B۔&Љ }/9Jf ?Kۅ6. vwXͯYt xKpt^jy)"ȈH ( `3+1Zڍ&즻)oВ>+ ØùaKoVÁ]&f:8EAa"Hj`(PZMvknALR :۠~hIJҕUXц]҄shga}:+b/~a."Gqp>ԝr2pEKH|ri&yc7v+#mt[Y~qbH0Ie mw|B]េ-SrӕhܧR癆̿ޝ^3(w=AYZŦ(ط|?4 8tq9CC/{yYi\|_=cUb=^!adtzbX D ^44aڮ. bJ˹@Mq6)j8BV5}#4e•mUF$p!-G?p>9_g8Mp5m&}mA:\?t,L@:O NOhלO (qL[)&Tģl' 8NW4+&x4C5-{-<ٽS$}AM'=?<p>d6۪)lAH5,oS)4)V8we\ t9wLvu Œw/O1dt* Yw/$<mb_Md6{ox7!hMMOHUD3tN>UчQ%$}jn<$C\NxBHlX]XKDDn K[;E һẰ <ݬ@d_Q̹V8J;UOjO] s9kKn59,LVjl}JTLH= L "Oe=F2?c믚 u1Ԥs8SxS}Y3(/‡mVN("xCGk(x@JSԎ-Ez؀.N=90z\;>=qgfy/@NXX.6!Sy`u `cg>P6ߨKËSa^~ ˀG6Ri+|&=nK_t->Hyǯ`I:49/eC:BIpRL gV~Jۡm~>q dq5^`ڨvWspX^Oܮ7At?[77 %gUhF&c{č%]L {Oc')M2ORx**Rɔ"yJ:-ѦnaR0&=(Qd/8YNR4]2{( k$Su[󰲻Fm$;wg-> $ZBQNS66GA\5LvT"xMɨߐ{1H'' ncCwNH .]ZHtʪ|BW&:TP/2ʫ:F7o&ʶ݆?Y8IfOgшΡ=,;;*Ux#sa;o!6jfRcW1:0K B/4Ot ]$@HV}t+^$7{Y˥-@34VD>>9>rCOZي0(Og@άs}3ۈQ*bb,ud!1~G3>f#J N|qP* q>ծ8Oۤ8Fh=oZ)a457'J^_ Rk %IqMJ!lF2%Д_[jNY\˪P^._h,d>jIkSnv1V\c3eU%R;t7%XhsQ~KQ&vF=~/(# yRG\Δv7qBEEU7~cLKl,M\pILnP(튧EMs ֱĂq0kR IYmS6 UW"*$ؙXM[  uAu`5.5Jq Q4v^M<Ҋ6hM+K*@)OIlk^3FA}<O\H!`U`:3}Ȝ-zN A-x3%f7G mAfڞKH4o9nnӜ6*wJ#!' E]ozo{~$j}a.Bg7B6lǐ%|#^hRR$^u6@JozGRVXc]{[O^v[FQTؒr.]a>efi#^B9wj8~t$gQ!ceT37HJGn}~C {SιqV/Cq*o%iE 2דJN[Jk FBF>mӯvHlbc[g ݑzN_^!(/jt7BMŢD'FHUs<ߜ$g8GD :^k t^fdvyM ~5N;?,WIccBD #J -J5t5VBmDa2NxϏHkQ\R0F°s+ԣ;mw.F1D-G1ӭ țg9Az c: ('Y8x ʶ+o𘟤g5} EtDnjs6"i쨳V[+ G`Ig*\Qತ9eL_ee(C , Eb prt^ZɐxQ*6XNрve$R9NǤ/8FTy9lR-.`K5vqLK.K[ȥu{&{bQ כ0K,&p|ZoN$-߉+["iURDЯMx=^**Υ V}RމPvr lQ$0{Ƙ*IF鷞_ZOs p *>te3;Jҩd WS ڢȪq)}a <<|'=J$1Q$ǜ?L[t h +3>$-2B/Q¿"֬@D'Q =:1@)~O. A\F6(Zaɯxm&4r5$^r'M[ UsȠ>I0MxP*vmfzbLA'2ɕVJzV\`!DH4מ,UY1MX>fPG:dγ…,Ղb@O1"BJo QI"$dDu7LI+kkC 32ԫc9i4Xc0d&$Q kZ6LaGQ`CŖWDbSqͅPkݸOLxkvio"]J#7UGRClJwN6ҙM^.Im 8E&U<(C]%5o^oEa5~ kimظVVj/u=5zY0m߄\fxGdtnp>`R:_L'? G /#ʅ{EQ8@V5ȷbܜD_KT٠Tn +Z(C:yyU yWϭ̌(wD\|/ t(`G󎡔GgT+*YXKOJo-QnF邲|R,%]#q)jʦf^/mM >%mIc`4oǕ1o1^v$~m0L,^t2RsORԣq" "JP9BIL Ó%`  9!?-t0x M©:,zE(NB83r￙6w$H{X 5[6_3GO5ɵ#R ,T/^Y>KoizF.﹭ r1J߉@o V=IXOTPd bT)GPomd+~{n]ޞӪ0e8ߋ^v 'EMͬ8!H#ȌU_*ʕImZ-ÂIMz~oi-йE /-]U(tb6΀`+@ 1jIPabWqMX"z[oYO7yKydA?eO96vLGxٸԴdGAN {8$ͣjb{:\- 7bԜ{gFAo& ;mFw'Grg/́S ЛiS룿(4^~)һrRq){Okš^k "@RI)yǨ'{yxpj :6Z'ԡ'2z4cD\1fQ7.y1}}Hɯ=ǵgE)A#.iOVJ?jViaȠ2sxɥ32;&V$F6FJ1ml,-$('pdZ֤1Wfg3F>R a̓dɻ# EN<"#;hs 0Vv^_N089_F^JE@$ ?m P^uC<8w~+m^CytUc1$,k%p&w[&1eV;W#wZTX{&=ȟh҄jȩ_I:^X?P,Pj'3q,LH%Jj^QIl67v$xn<}bTr89ljtHEQiKӨ;ͯ5;`U|4Yjs{|32Yb4ƭpvate`S#|\=j^?NcV 9}<Bʨ3Wg'P*؟_7 ەGtdgHXPe~|!Ѻt [^(vmkmH|Puy -5ԧׯ)7mA2.5lI- =iMvsYwJN1tI%ɑRdmuzo@ [4[cmd#>)SR#AckRpby׆usw4.1bTu+,c\e][L:蹑`,屘>0 vŇ3G;8$b,CRC(I'r]Ӥ`vˉH?Yʉe|CqaxRI9 Z.)r^:dBLK!cMUW wQK_udigd1#T!$ nc[e\nd)C ۷ .V'D< qE9II1WGH2E^.hBhF\iMD۸n~tjϏH!}ʗim\"|2ȧ1 Qi}Rr9;='zvq34$x`pԔïP- j6*4TB j$ 3, [Pct:F}}\+DS3-c\e4-}&)Mҕc2La!Ȇ|0"JpJ^^\!}Ћ76*%w^N"H1xz{)&UBŤ1jܸHpb_B$Tes̒׈Τ߀Q?@ɢ6rwP<0FnV==60]suj1XI 2يA= Ll4.B1g e Ek{AXRmjrWfP9KK`%.&)[u7ʓ Ô32KTH+XP/oIe>i>[usuMlEtXKErxq:+h:5F\ f씷<@`bQI$cxZn5I]T N\}=j 4lxeT+Vh6;7?K01bAz .4Tn!Jk$YDFTTRM_,÷ -|S/; <J| $q  \6$]Yҝ^Qyr.aH };D +S$Aj0#Rў4!egRz)~/z: 1jk3r;` Du*ԤRݽ2 }[F6NYro]D2T7tFگ[\Df2oVzN3kBP>4g#taĺ%g/n$zzd4}clBa R{mEG nMyPX@՛YSրq{-Y8+vb'zG}z̶׉N;UH>奇0AUQ~z-ggaXC ,4vt3ƽfoX,q~_.*TGek&k!f9rn .=NAwVpJF&it8{k3($1xDX]pG{ܘxc&O>9p@j\ EQTxtuW%Nt oeFw!(-;X1g.!o7fyp[Id)| :|e|-`^z6rD\d06܇X5ћ[7H8}_ X|+rs?Ijz̎1IQF>)2ȃvs*>xl:-v{H2k5d3zu<N*d 6[CT&BIOαfV|= @ aؗk'AjCEُQ|.%Ǥ~Ud-C aHsN_ҟo|$yu~l༬(* 22SYBҧUH:AH'FUξ?*ŴDN Ŋ0ǣF =rb:IfVa,hz1oRaʓG_ZԞ@ڻ6):jQ9i|Kq׃oBЀL{cEbaJ~IB:~ &~Y)f Tƺt8&㹃BaDqe򪠼QW/HԼܣ nbu9K7MHH–Y> 6o}Zq+TA*$"F؁0,ϜEl&JJ9M 6Sl?UYJM 9:oVXU1Ps# \oTPS7?ˎ|pӽO>SE:|uE}k[OG8 ylF44% ![PzNs =]/ߧ`x+nJYHDON "RIu;XBZ9_bHaHI1-Ce22 i=DE}zQsBL.r?> ;GJsmMƷ]ٰbɶ<OQ ~PP޵x7DT΢*U#k-)'z[m]]_T0;xl?޸3FCa&Kaڞ/wdgJ_suǶ tDF2y]_'"ͭ0TD[y<6 @2R@Ch8ɨ0i"%MPI*|^ vAn)mPUSgrjMT8ՈZxHFH  e n,7t1zY$H bOd& n0-P{%?Cf癴*gY/G nq1 p|$'0KIP_̷3_t5ȋZ4Cܧ5E pr_ح4t!MiZBfL9qʻmi)ђWaLڟn"l ٧j}BPZi0AqV 0l}ւQIY6} 5ygd.H(@lI[ѽh84?H1L:"9̏ CFy TK^~Pp@n2]|{ԌOTZC2!#l= +R5|#/s{}  ]lDHw,l?2fG0#ǙXF}6YַG"W{2N7d-9wRK2)u(i9zJ7 ϘqԺsl1uCFqd0z}$ʰ爱Ml{*y+t[Գ=EyԩK1誡 p^wRhQ4D; TwEAi/a&pwآ0yuߨ a:jGJRXEt+z^3 S:X Y3+*L_]TN븜'gΰ˕rX߾7v|ߺ R80/}&o$^P_)hDBB=Mq|B6n,g3}nNyG?:=@ai1tMBW 8MEUidq7iG˂F@0u". CtH9UK93Qr~!3b-X I@2d[c ]'4̓2=Dax/Tt^Shc-5TEt>VutU󭂹?}eeOs> 5FОQ/,NkBY[h?x= 6b>NA)&h[ ul[:N%fRwTqPA?K؎5rzSc*aa5EkrI~ i=tfi3Q%Oi.`V͛UW; ~,8b` )N oTJ%N:2|:*/NlψtͲtnwvU##کuayɎ2r<cycE=(F,sK YFr2ntS[9g5$a=ܲX5Bgw6TsPſ)K |ʬֵQFbH15"[xw~zP\~=`e?Wd䁜A`p%VXavkPb5vSO)(VV#RL*|q)V[ȴLtzPH#.?|t +qaת{auXR ͭ>L{PB=# :!+"Vm V0vBa r?K2Q̏D$OaJɛSGC o.V|'2F>x!S3@ aek^TУ}w`6G,fF 0jS*'PƲ]K~7朰7*ڿH?Ӹ.>LUKRg?g@~7Xޘ m,3(/Ɨ\_}v/)pUҗmGMD)qM4k=~p?4aq+yhV=V6?Ęզ2=#T?mʡ<ޔJD7GOm8A}mˡTOQˏB:A1 9 Yvy>kw3rriKQJBfWY˗_0 SPa2ǞɶpPsA= Pڰ%^. 6)XgNO|í^62}Hؒ`Bg#PI(m(PE("B;-f5,L BˁS;܏(%e"wU2xAfy3|hk]Jsӥr *"@=]}N t: hZm0pI:POD9Jm iNqe%Ri@}~Ta]7XRtl aiJ{#怰Ks߽ {luF*+TcDXw$hN2lUrRZ>[Wo:]䊎}HLwxpniF6rt:@Z;AZp=8ȅZ _2{l8,5+$qRPazFPk:U͋jey?>y]PT+cph``$?gqQ}/ ۲]gLUhФ60a.ʹRCBnˌ(1#w^dYgBd>_E+4 ln;~yvxA*dZ}tLѲn(f6mpmXOޞp.58PhyJm̯}kAHvgyiG7A.?SBc0}1[VIh7YVtj+h z D]긦Sc %}zԧvo"J0'$  `@nC[iOyß ?6SRI. _{snڳKWGoO܊J Q{|jߠ"bdӤenR5&7xOBk@£//^f Ro˷JK-dPϘNKt,Awv2]QP.~J0%zW_Vw sQ%&^~2fr_^J|c,~ሯ&۞3 1 ihu$cwOy4Ru)~ htrLmldw2x,0a(*5u|^K /HXcMRfyju20D?,K$1CӱC2їG_ +4WyDcw2p ht*Cӡ7\o$6;{&jf-.]^Qo:.໑i[pk޳ R[Hӿ cpz#:DPW +1_id :jΖ*uM(h[@4Hs&gM R8?](jU5 ["uuڶmnd-DΫ'*3VIJe~s ooQf"g٫m ^WɕI''ߐ8rϡ5d1-wx \>1we,pUƟ=K>!k(IɃX>qxaֲn絛OGVHeT~(pFw65SD=ن_`Ŝ0[ǂd"޵9wV>.  ;??h}3޺/fif }0AeTu+d%^>"#̫,;>9a%gi>䇖H:~?ΒM(G ɘep%>ʋ5-ݮSz)1W&g7*)Am79b堨6R{_% AX<|';0 <8yz:o SϵxsqZ$ Ylé62+SFl-2ͪG^rJ*ѧh:;YIqi.XS`;fM@k_`q2w%| T?Hj7ES0V-*!Ah3qt:S:Э0aJL*pE l!>)~M =j>u~JH@C`h0htәn.&D&]9T俫qD&22~fXA9~[( CN R,X]Ne⌌ Ư|Vz?sQͬKmIV|~໿s2oNuO.=~G;Z 3f )#Zo1bm8(i 1Qcg< 6`Ƈ Q%Ra[͌MdR)vdA)7Gi:숥SPmEh:b ͟_ĐUzfBˊ\tz$Q [uHUT!j%:/4-ϴޭ#& ٞ)H~NdM.9I~OZX>Svl?'yՌc]GrSNJ2}HZ Q̑ UDP {<3j]ÑX^vK84 ywILN~[#B4*cw>dܻ#~/r6L.7)RetB:_ll"5qbHi{c7(r%. õ7hƽT@Et (FLlqfS-PHfs)/Krhͺg,. _h8EGPx?[r}d m\|o4;鳫c"OU41nd1lrYibuf!mi㊏{z5!{8myMr#aq͚S }4 ):H10TԅRU~ HX<#}tK)j}d&F}mgl|p7I%>:Q>Ypf\Ʃq`(G\fĴ79w޵;NzŋLlH|Xh0Db10Fv$I нM}wryJ St/@G1 [ik,*{4s D&be`6dTKf|7fJ m*?`1Lnɾ\TSDX&y9 {lKxE3F\2r-~xf ½!#8}] yhkCbgf(se{;@2*_Sy^ikk[~~ydj2O4_ `lqH\ڑ?) x>Yeh]_1MkQ@OJcوhؘ&39G˓!"?gb5c{* 8#=k607Խ@?u}v*0!~>ps{B݃Ʈ*$ǚ.vkaIK P9O;On*PɊz %m /UձG\JN 5>=8BC<m*/첤tj|*y&3]TvZ NGdGja aNaw~p4X` }~TlG/MT!:2؛Ř\azZigS9#}zA5BbP&W SI:cti3n{?sq gWu')tWEPޓuȵ ilEbЖclatio,ؑqi0$C+Dm(t~%pHd }B"v9B9*?Y̚at:Nɧ7JtU;7dlZJԤ w={e+lEfLSVooUNWP> ǪA\ |+K̦nI#IvГ/}s~8kf?]@|-y'kyzתO =>JdvM mԶ)XK0,oК62YKJEh5,3P62`+P+޳N?T](S"gqnc Ts'i 'SNJxS%7$*5V€5Ll{5W l64'{4ʞgK(+^qJH|.C,oq)MiNIbaJe]GeΎ.0FʇZ\u/p?X!OE74.~VW|PW*H@ڛ,s8OC7Agw%%HEin|pء&ں?<}lTU" :{ ef?31\K,[';2]Y]A\7G@(iRD| ױZځ x=LʟI&NL$<ôk=]\h(b|*"0gíR(_~{\鸜OW -}$~&d0:Kv9Vy:M$߯ۗ$ǥp$;O>,@%/{hH1:yVq",X +ql,anިl5Xyz %~bb1h;a)?7%ɼHYp( lٻɚx? 9rN^jcN<xμg@ ‚ݎ=[LS*SVl,0VcmNlg8?ܙ.i3o}V&+J˩o®3c7mpnҤcZ[l/m{-B.arW"~0UTpA mfDǥ:F5&ͷrB̏.։6,zׂ>~>R.pN.Pմ;)H|pII6P,͢(g_n, ьzk.!"r;EXٻkPo`rzPmfY`۠l4P7qUubۍOA6ǔ =Bԅ./\b *M }`nѾTf/RG,jq .lftEUrE/n1A4ryȡl~a9 m-y(:f: 'Cx^eVQ,lsLnRr,c)a!"-p`ctZIv7b/0A?|74b!CH7uF3[._+tGU;x!H) 70`@wۯ[SsٛI.2W㬍C E>:;mf4mbLbh0ͩΩ&2&wK{ۻB4YfT6P\ _g;ZA{][n`8} }f]v8d|Dfk3KI)Fg076lIB5sۖ gjr/Ơ% < wuqC,mJ/}*VyfJ.՜xFr#ֆwگ!?aXʂLj&eא{\Ngfs4{P _$5WvfLP 8pmP %,Rώz\oBlͥ7=jWVO0SudѯR?U^j!ּrvʯvu|i)coST}w6yNjI3G5tFNvigidK[@)^XU8l[TwH)Kfͽ\1:f,ف륢Xrhj v@q* ,qof P++Ϙ>LjSk X`|Lwq#c?8Ł+J/vLWv֦lɆ͝vcd'jǂAr{<kv0Zy㺡Ñv\mfv'z<>2P"i(%. N8[/)FKEkUw "r]QCG??ѥ.X7r34RȊۓaam:R+\>v&*S~2jGN͇g!}` Ww?հw®X=<׀`-CEI|oщmKif I/dFzQ g1r2@px#rŢ!!a0,-?<5rINy[IcOwֆdXDFmdWw ;t*4-^BAƛӆ,F*ʘO ~X {\=`a.V\=qNS01h_ǡuU}Jb}MIϲ ss4J]Vwd05Y^WTk[m^ݭcQl]+CVhd\48?Ҹ0V&m34ުςK0eL{g%M)nbWQ=Bݏ᪦1TC/2u\X,Eوa9GJq›Qe=Pnc4cm*򝬫ě߸'-'5(fv|]A0"m>pHҎrznKv7+\KB ˯#QS!yNbP9 etVTӺHԺ_ QJ]J 󒽆D:"yN!xzB|}*?Ud9MF_T+C6B:*%,o$*:bm =z&eDtNPЧnھv -d:^;dP>kcFˡ5 k txr/"Nm8ѕw WVG+& Jv"Vf 띧r-fNϓqH%=Xyws0|\YDE^/m푪s!p m ^kWínj>L[i7't fGhC"5fh <IKn:멼94^8cH7OfeMX*srUX(0c*86daͲ, {-wzx$eeE%^K÷̹9 Z/B}06)J MU#$bގ~7S"yH>To ;sń&Цgiu^YۑNFN3*MWvfZt8Ph9'\L&ZaSA9BWK*xǫ yDrKZ$B ܋2oDAdS-_ l@ ~ _Nɀ '8'H[f|Zέ̸#R1XRey.&7 8/kMg' 32QȃKE: )C+@k~tƠ29gp<愷5fƀzu{-,"DufKꍦ&v=M*y, k0ܦ#谟-x.'|"d|y"*Ն7edR0^ͽ/mdqd-r6G׍Ό']fFZYPK8ӷerI6^WD=!hٴc6a;̢QMC/ \Ll"& 9s;"KwG L_8@ph-sYsB=ch)r5 WuF=*kLįз6IG!1]{D +%JNTQA#pZR1(*gƘ ?6ߕ D{h^x@#"(Waeъg^`@3՛/-#ӟ%#,]TZMR tj@CŎLS*6HXtuY[Frj4+=9i-bRT^iw^0oӽ eEâwr%:w2HCOaw΁5-审wηooC-]v;2#1]P(H i–Med %@2np Y$P30\i ,^$ӡ@${Pl[@}ccU_']dtsGuyo[ cj0-%.Qz@mfY9 k{5Y]ZwdoݴQƯ3!W8CV[eYvK%ֆ`C% f+-<-k _81A0wǫLV:wk]>4١H7xw\K7z^'OWGk~cLV-J\XQ$/ w Ѯ8èb]܇o=9&<:A|T6)}o)a^=JBDm_J,Q'>xZy&p؟mkn4WH*4" GA֥V̇SISL-iVZt\yd"8c èPVYC'f#/c kA|5N*hU  K۟~\U 5Xj1pzCpRKKÓ9͚{#̻lrbPN1m T$(Kɤ2]LVfX VzwUo?^ShRR*;+;?8qSN'u1BmyPRDD-p%b4HaĞ| & 1ٻWBx},ZBWwNZ,;N夊xXd\j"`/v/h/><$ME%y}vaXJ΂g̷GZo箵߂2 f>EqZTI'\ݵaQwP\SKn]U3jrO[3-_l fUb="XN,Fe[‚Zäi) NJ֟!%,K1Jp P=+&9mkW)xy; M/UB* j#kzIVn].W~›# Ƌ # wAֺWd\n8бNMF!e񥞼HCj 'HͳiS?j>kZRY?(IzA+9 N(y\H$q^ E 9X+w9I]WK& Q Y NV>n|_ވ? ~ ٌ&p')i]r` }€7sN:`q&0bzj#NKnm^&l+FbF6e+G$Q67.( IжG߆idNJt=k Q|Zޒp\Ʋavb qՊ5ӡ*22Vq"-825nbpwGw3-^ֿcDa3dnA1FZ4/D&B=ӕ eiw1ş3.R`^:%窴cݷy, 2 NƩeîz2k{5l࣠5lzN_,һƍ}gx'L/F /3m9@j~_мv2FH5ꉝ~Zf\ҳ*fvfj'5v0qxl}3'jIkmm͔HSUߤGr,zpAzWw-\xZ`#nQV<(UGnv`kܺqȌŪaʊ_?KM(gr}f5"a!֕C&G^I.:&.A ZrNyz Y]+;Aa 3%l%eBv.2DuĆh]iޑ,7#;)prЇ|)[#1\ j3ھK;'Ĭ J7ĿcϥD>>5"i: ~TG{TʚM5_%wW E) "\PmͧqoѮD^lVH~WM((JkpTP2hǢoGtcEGlA[I{~P'HBT,ǨS7UW% !FReE А.A˥/uM}lBYΔω>X qoH@j=0mTmO@K0Shv#qé9H6 Ҽy)ۑHŽu*,~MΐWx42@ ٍow%ۋX{xg-A LrH:GWu>L{H5a6 :Y<^jB{r$i4gǩ,bf{lŒNw?,7#C¯`z!\{ ::}12G DܳTMqi$F5Tc]"S|&X*6ӑ;7]]ov k2!@PU h69'}ԈOUqy5ƒgRaLghRK2ڥkegZ#:* K]t݋;`=n’`޷\yLn}i(<*i;rW;f %}IJ{k}Dovƶn`ȩ/]YC L?tTd8zcuW?hsWu-! aoST%2ލ1J_UDJ4?⃃*C3` }8 ,j8qGI-*cj[ڜ .k-5ZiY9ZatbJV6&!#S0OeFKN3m_5 ̩\֤O#B棵ףDBܩ1z{A=&UpR1Br|v! 4f90y7>B95J7Q̽ӿ RL)Զ:! [߭Wݹ'JjPV7(|{axqKT$M .VNvCNZB_ $ RHEzB$e[bq5U9¤|͞ <QZQ^VTH-^Ԕ쒨aPB.k~pGNΡf#GK: r^f 0 \+4}}ڻ| #⊂u^V9y-Wp1U{Zt.B|.O@Luz1: C$몼gV3mZ5D };8@/8)=[ryW)JcΊ9b{^+HMq*aH7U01y1DD= ns K|l1qC7 ϓ=<~1qly&rUIZ%r~ݶQiA1 )pcU8?S,5pOw!yy9Gu{TUDlv}u#pyb^=_]}v \hXMnN{onAG2k>VJ /m^m['Y\<~چ _ٝuL=pF: eK>xi$N_?D_;)f1fhXzrH+0O>ZrOj$_Oydh+-nO6,9ŋ|څN];J$dk $5F|@6zAaOU=J;a^;Х[k5y/@kkz%~MasKug>`-kxk0gǶ߱:G˶=c8z0gU{ ^OʧoO/aB\lz{C z\/__}j9,2GO-3#n}$C|㨖˃P$E#AoRaѡWn`q^X3-r^4l^U%w:ib ?*twNSБ}k՛?Ylm'4gP)lp|Gfh4:Ӂ-jU9fq :DCeZK[NXHlKPIRZc͗t/)<Dq.w88u&躄%M15Q!teKYWG@QYʩ^'(n| sRKKy@y>9kٶNpٷdX0beR׽H0 Bp$%K64{m![erGKDZТ ;v7r!ow~qHQبL<+AVІfab'ւAqxՄ;7vc)q~hʹu/7=3|?.һD^ntV.<9H`GJœow}_+p/[]xF׌\K6½̺لݵW2<+TuFP{\Sj)Mq#66I^W]yT7"DT0LQ d&9\9_ٿEH8 o5w}Y(gT<'6r񽴓E-0* -}%T#XdPo׉(;ܶ۾ Z] }]ZMZʴ/oI lյ,VAS;m@mR*ae' c) l}n:͠v0 9YbHAH KGNk~CR/q Z??_w#l\\TJxSuW=-rqa2>;መ;=Oxl4B;J0#cpIkRgLB(7eMUNroAOA}\Kx/hYN"|ɟ9;pz>`}ISINSyϘZ:h|Vk%_' GpN@E?-@M%G&M'EulAiqdO#¥RՈj ?) [S=4}Q:&(RN {UmQRH}=gKtV@?{ g}7'`j>٦eEywN"P=Gt!LX]}]h@XUj 9+nUٟ|62mjGїx0lʙ0Y2o'5l5X nX)79;t~!R+T2E X= p'$f T\uX1d/a`z@](v`; sB 4ۉ:E7UpIԪtC~ij%>]1u@]RrL3ߧ5d^k-u6Iޛ8LSH1EURLz:3w's&TpJn`7kW!E-pr};p`Çv ,)pKr߲7}XI/z۸=I .G\ 4'u\V"VF\Dͮ`2nYj )f#6 B=S(ۈީ%<*j|7͑5^ZePJh?!Ws_Ok|&/Hi;G$6ʑ^T3Nhg9?J%!gL$B8; `p8 m_8 fv=F KI 󧠆 :} !BfsNO~$:U>DQ%%;^Zed"jY\T%>8zނE~ ---\*x#۴-bNb:ep%(M-@GpaApJZ$ lG_ 0EќehVOb&ἇn\tw+>= q`+\|F6b-XuZ.^M|J6#A m.@_CbR} RED)XdfwfE=Fx(»ɍmIN}w>+E%/*1Q8,TOm$r\4'qB4zk8qt2!߶Գ:7tXbԺi 6MY|lQ؍!7N,*,όH;#gIJ<ްa5:OfU'bX13 |tX!4xQQ4=ӟL:WGȧ(H ٠U=׼`V'Q#mEq]%G^F@m#sgzS깜6Y/ne@)Ng_/8i)%. w׷1-96exg4\y~±cm'ns:-|{'EznyYYU6hA虀3V6&m>&W#3qi'q(<7='R(Jb~*4 (bN9mui"}b% Oh>WRȊc̔ztA 4!+|^ u]4c=ȹ9 [}VUCgc8ll18rEwH!&pۺzJXpt[u ӉI2SV;4n\X}Oc,.)hA-9ER}d4AFVayJU8f/U XBF2@YTuL$/yL׸32dɐ*C=GP+uF\9|S)(&0ۅ7sQoE\%H;Kҿ OOegR" [nΔt_6H/z/m>)gE) 2%(UNeo[/(/VB|p2p?@8}՜FCVm&CiUQKKħ !,!n34_2S7B\2,]-MF(n vi6Pm)ِp/ؒS1RɃ,i&5Lݪ;A4!B9ijJc~X:>8+*N7iƴq?ffb-ߏ7[ a3hilV\_kcIS ~!ߦ 2'/d\[ *ia4WtxCR!ýhLAZ L?(kIMLG_0ui?s0n3)qw0%LoU[x_"E*`+mj*DōJ{S sƃlV-cFotkadՑN$0FચxW0tj&J aQ6 gpe Q铀~"Tmj+0F@iM, ր)@@iZ^ż=[\u?Jz6(Dݓhy|KU6!f/(pi"5ǭĎe)Wn4aa/8Y.a%Ʌ,dV \qj$zz @ e)]!"|*BTy l$foun>}!WatRBp)zݎ\~Cԭh2%iẍ~rA8b%qKoF;I$xQpN-6\ޚxGrBk򚐁faRSxK c~h!)ϊ7Ώ(AY2Ni'(M2*ÒDO:=Q;P_ Tg/Wp*{|íq\5_b[ Hي*oBqNK % +hM\IgK2;D"YFZ8\C8vVjCiQi+SfH {^*,tu($]TӋz;7R` {TRy8hhFO0Fk>/eb?;/hC߁_sxۨ}.{Ԓ_p찿Ao'v-tNk$%h3fon&"Kؽ= LIbR%16"gaRBNjf<GVO Цuʼnn!> ;H= T~Lge7Q  PeC37PZz}Dm2&=?3RI Z E,܇$_[0>v 8cmEV3a ֽ Ojr!u^꧿*>KfDPtkgh(TH/8(Ou(::ۘR=,CY* u f(VZ^\(;$y Po1upG^9 Hw e(*7h\݅,D 8^ ڵDQ[zsr,Sry9C -:%-xdHEi'# (Fhj Y/`2?'D~Gy9WhtGFj=j=4gƞvբ Y@S1$>T wz!ȺϺcs 3P dA<ˉL2DؗJ/)UiG< E 6@ QυC;JXdγ͋dʮDeb W>ڨԑ}Pw%_;V8Feњ'T(xS#6#>f)Q! 1%x7^3|ԃT$i{L ex^\!eilmb2^Vm݌55r2j9rMS"*[фUv4 Wc`}:2`z?f0]¡7O&3J#>1(e2CW ӌ9/h՚#]P{`ZL-[ʘs)SC_3S[9¼L-q#~ 1C/_WO֕n$LJ1Uڑ܁Z?Q%sV$ ,fvr"#hPh,/Z%$,֋L+"{B;Sߛ.m~!Ĭ󙶖Y0)>FV(d*fղLJAD ͳ+yw6n Iکxv[3,0XUۊUQS>>ZqGI@X,\(cV们0 h0!o&4tK4XE#Yv/-wT!w[ Bj 2+6j^uGP䬙bk_.Y4{DWh,mݍj,LdG(|o:D\JnYPJP7s%lݢOg̈́oJ}BW؃Z8m=xH'Bc $L(|x%N O"[Q \itI%򆷰c*Gŷ!h>kunxBw2G$Um̖~BsN3ye<- VW}9ˍ}Ce_;iyKC10&2?5h63ڴPTu*U!Cs |@X)@hz/ 6$-L,NT^| >(~a3\Oh7G-?$4o <ޜͩJ-gGe#zQigw6&޷H>t'ͬ 1C -WDH1tކ$yl/=_mH 8J8@"Q4G 7БX*z rٓx569nj>}q1Pi׷Rf Sd&wQ7IlŪUj:ctieS՛zUvFJ#MlG!bH/!]mRה~6bMc9|&]]>OJщӡ+{S;+>z_nmVO+젾#D\&idvd,=-D2TL k*̗(b&YxWbItG<` m\~]L^ ߽,38Ff/j4l; Nh`y@H&/zEgҶq!hӌZR54a Du8eUlyowd8 B51/aku7B?S~AΫKI`jAiqi2$?H+W0!QG566t,Q(mEr/8ե79|~}]ةQw! ii` ,]^dϫUod^X 0$tigܯ^p8'M/{V&xn\FI#;Is>1 eդg^ԧ& >!dqLc4 k?oG~5VZ}u(~sO<|} p1z2Ox4_?rF=(y]H!M%Xo% ϢPf #[P 3BNR  LL /W0T{^9HJ Ua<2d]HQW4^Dձb}.yL( H ۰aJb6c}G.Cq ж*DZjTڼҔi q$$i~d|>jOFoa,Q \a謧#wM;_|-ZrY} T偵h8=ѭ?HʔEt (OrOߦ{Vu %Ò],ƤgB * aݯ(dC<)Y:zbxt:RZO\B"'J+kz;Rj0SLmxf}_j@r1l}hl%l_?7KW(;wpZRLbO<qH.xrr"Bȅ'l~̍:6sn6PzVQOT 6 d|E9-nIŀ|0>ct'𣀠":Ks\1n\3~>Y68kF`壹IIPpsB1 JS 168 L`WSjk%[FsD)eƄ A!;&P3*e%kOBYig|l!B=Ej ĆTbvA"'z?uҰg&CO=}WL)wSN-udDoȈҀLbzuqQt6(NF*Jh*|@CM!S)W>\^i ' 'Lt DEh H>3`j1x>_p3bN%\5hTo Fyhm0ق?2;l.n JX qe_{5 OaaP<9L#FoMp>Hd8,Z],"#16c!ė h [P94!jIO {l)SR;9O{ֺ[h1nApTۄE4~|N?kם ~;Gm?"JBfU Ș}`"&Lr9.prgVuu!aBl'\Yq>A73ҌRJA%רN]yBv֑*e(ynqX R݇]Arl!+ʹ:[0 Pe.n;ź K+j}i'"]P!;Z;ɍ$[^ځxקQ/$6ތٱ8y6 fbr ^{B ^aSe}Qj2R>4%M~vuPGUܸ_u0iJa)zc)<]HΟ=ႋ&EkV}K8qVaCm昢/eK>י ȾIN`pc(B`eӄ )^ i1l >7 嵤@~;LtIUG"8>]AMRBEV,B S2t1}X4.cslJX\^C2;PTą?^ _ c*Gz ؂~ \۟|3Ё;+Z.6|3H=N* O+-OFJ\`L_lQrDӝuCܸf4_ls FA-Ƥ(=A֨t|ΗfTQ4L`% ŽUhVxA.Mއch}Yp}-WU`ak]Y$b)ŽJwΥac?'Tcpёx (rƊC\,ex;Ltr Ug'u.oUѶcn^ڋt}F*[gs_ij@5Uv!a) \+xi4:le˔0n{FJkm6/"4Ia5Geu 8\^q%B*34(ꬮjH SbPJTzq;2׿'s1(l/ .w*ճ]-C Ck6}U|oDdžI ~#Ӕ؈"=r;{N}QFtEIdCE/upGI EI~]Fa ճ8>7brSД_9Sd" >?% qܭ<B&98)}*jT{YNOFpȑ:jr"`=wzQNijlfyo3U#V\ q3 ؄$Ѩvp[L\v vܣo{AT9ó4M \VIt<޷FF0*鰽BpJ ځTk;F\Q^bk-nr$zqt`gDշ1u:վ=vzD6u' lm zbZ^R3OM1D b"xt `1;NgѼ.*/Xd#bsaK-%:Ty<6⧆`X⑃Rmd]:ȆT4GPg٠h ODi*Fy.x8%qMp3KHew#2#E "^yOna*btfxW7aJ s1;Xyh.'GPq]utsN@A'Zb= F@8o f)qe~,(xȂ .2gݮR4Eѵz :.4:"40Kb&Ҷ߸ SGU0vraǕ -D̹[%6eRc-* V/WBX,0QvN`77"˸e8" 9w51D:cFXdmvQvörI>v 9|Gr,TI bŗYgbf{ۈkFүx*yTNDF:5 \59,D;´y,)߫kgpRo+76*MxGCe'Xǃjv}4}:L(}>K0";TՏJHWlШp_m^烯8TJ.OE>~) n$w^Aa!Xs`IU28A+'&k&J%?q6rîv؋Wņ6!Gr%w$ xMxTDo&d .nxҸ}B.En6~? IvlmXqHxt? r{Qzcʏ RA}[V9*^ bͼم5nB?`ذj#X1=k!'Kx;oult{U)PS5@+vGެ? Ay]4ӝ(CbaPD%=ți@7&F^p3֔>hx<p&3lRkҞij9o#Խƞz@J.*i15MI±yfaXe5nj"8NOFs+倃?+X$ gfdrA4lٳzH4(ݘRex83^M%CӋv/L ^ho({fQadwv^ IkDo*jØ"+ \݉dTJ&FYWP9:tUϩ:= 6L%$ "x3uDB|㳓>Sf$q*0NSx0HbI$Enpnޤjls[_lW@ 101_H) $E+5풊Bhp2ٍC2,k5)pUJR(v%UiyS=UnAX*Ω-80]d.bZSt A⧳b*kCG;ڠš`F#>Y.(i '#{B}Y5 SZz"gCώ,2S9άr뎉ѣ5D!6|gXf,: 4Cgqb-UgL8#"xN QΎ[)&6JS |MȇQk]H2jy0G 6Îuɼ[Ɗ'GՎ qǝ pA\ URdCpipaIE~q悦phh/FL3l'b_/ncxx6{ O'\Tt( J@dq[C6o2"0'Ye[ܴ8޾s"6fIP&Ӽc혔2!'z04BWer+R$=,Ir[0}( ٟ܈{ɳ~,͂,6u#fLۤ~:3A.@Sb>Eq|7XTsGT**Owb]o_93t9KΦ@}2N?>\-7 \#Cy^ |iX7gkdP9|T%_U֖YVGQ޸Q\~g_vuTY&-ar;UmAo"]c ԇ))e0*LTDC. Fi^WIq0$ Lbo\]_Q{#VH||=D.]_IK`oUJ\B*S뀒;59HžQ%I≆Jt?ӲҝNGݥx*8NK<'={9+wʧ:L!f+;‚pc ->ΐq;ȱdXP@9e;#Ykg4Om3u$NlQ{Ztp9ؽt" J ✱ lk|Lg:i l,K1,.')/f@ؙQQ3OPHȥ\k~JO gBQ{Λ_XgI3M3+t&}/DH0sF2rTKԦV,ֆ-yҨWT>]ֹ2ߓԑTgfg^8Oq Z~ ɩMM&zU z`~z2x0`@UId = xbؑAҍVp"gؒlߜcgۜY\",Å@vGQ4hdtd:ՖĮ^jeA:hlcJX=@`&n$FG/5D%HAT[c2nyp:,nbW+c^#c{[> 9s#ښ@RGϥ^tݗ]FO;qZ"yQ`T":ϮaQd%As'iKwX/-zn|iX%V&S5z[XѦx(#c/C )14$䀑#d>~S#ahA8Qt"fn'wUUB8RV QMrKP6sG][衆Ḋ0|1 H H =^m;lv븡!;'dJ}S$jȢӿd #~؅ա'G5G~;AO ܠ!Qeb7= EB.ٛ+7%I $*|]^(kPr eyD'҄5Zu ƯWx[ҩ}5%55dޕn׫Kbxcb8{ ^k3^:KC0ay2r7 ,x˧ѕ)`AqrVYpdp}ggÏy6wpJB3UߖA$M%ړHv(?JiUiٟ-?Ѿ)nFffwÆnQ;*z*4i9@eW@@4䇯L/+> .}ؑPKA[}5!4Y ɩաߊ.nq>*3tv\N6,Ow+4<06SfwL%"YS:fŇ1 ~yJ<ۖrpS hS5q;CRU&bvg?fBftU$g/ r)s"^N-]XP(?QECۺ|lZ:+<;??FmS;ڋK}J9@wnFԍ(5oV旺>8o(B-31؎]ޮ("ǔ=Ux(92S/xe] D z 2#!wN%3 r$LM2 [uroĬh"#5WY'AKБb4sM&7gJxaR"%ϟcǛ9>|yY2*`؈@|Rv+#Xb߉J  jhѺ!V w(eJǂC\-R n{:xbYrgĬma)v74v/4SLc }7z߳d;sZuI1MT0NB~Ē0+l':xz32&xz$ޓktdIj70%} ~ގ1.TA3Av :RtūǕ Z}Qπo9 .u- -Vƹh/&z4yu`vj\27WtfHF`H;3 =عڟQm򼜔U0jc'$.=\J0Eo=y44g\yg%۪bB'#{(*p;k# WF*t4,Pn?@iLksņ[Sk Еr$$M97AbŹ󄳖h!:N զPY5!oL^,eEwLIM>wW8w1~HʶZA]}8X> zM v~QR&TD1GX!b,.| ?q*Rfإŧ @9j ,kbBkOёk2ީq (bcL1yyԻx3)$U!qA[YD}'&ob'=Sy@Lc|~{z[RZuEVWu Nv%)щK1}Q'7m!Su_t\;Nz - 0'ڒ7 C$O856upOs9MfN|lIw գYܝGJ\@5`U%LvFשMܒ @.A\Pj_ż |¬%,j&"|]J!/=i:?8X^'<@hzfi6TĪ`=z&&tYwӮ Y!2^,Nu5ĄT8sK;y~(.p-ATX 8gncCXr}O!JNIN2c*M%VXhD3<3B ҪĔ>|/<*4+J1K;~ "+(z>]+'޲N/pnD7e4+tT.mQ>ebNYNB.,ܣܧuPlfA/P{`nG!{7EbD tFR Z((q}# ~quX>[I|-GLpSyyygʄz&ǁ6 Z=ZB7wz#?PWT䀋`&5lp˹徍>B" .#cK<|:V03?heP4P |x6 N}-b%RahkY:_s;{tp# Z!7`]&1C/ SDqO>rݒ}-*8kat`v[cQS"#=M/iNYT5S3ySɎa q5mB qѳ±eA T`יJ/j18d7 d#_.#{J|@z>!OZM̷.mC,zk4* ~DYhV+ k"6Ms ,YIJ N?H Rr;59re-q2KO9sy5f^ }+LGv}@-֎u~tq'.AY!h pm5zFo]"z8'䌦Q]$TsS{Q E?cqOma8ؒq]1-e 9Snc, d% w )G9䡤"vߺN%!9-RbkZܰ`oz*fBK4B;(j7lj@r˚o5M T(v!"iC܈ը.\J[9OT?p:x(4JǬWr{ BgyՍLݔ;5fJDU>^idMYiF ZXko0ZfRmJn5K0fSUPɂKSkN!tr=2a}$G.V"cKuXʷ*ؿVmQBZXO_X3ps x]R[[;xjkMq}/ 8at/BU^u;%xKK5&ó-xzvp4$< l]Q~ ^_\6!Qc^ƃͱtjSE M6V*S)NwRaS}SFEYC[՟RʅҤ%-!5YjpQr_y1>MAu_u%&6ݴj!7UaLT)Ir\jjhb4|K/cxE'7"6^a)m^/ !=lќ.vIPr eHw Bj1"> w׃s&ulEh#$'0j1\O#c^QMBm@xj+$*S], 7|4x,FĂ<%XD"FF_J>"bM v ,7_BoO#=9%s v@0?jd͝W*.ތd%c#L_ZXrc8C%RnMjQߣL\5,sӅYM; xj( VvHf({u&B2#ݭ[q)2cyF5c__%C&yz[۫/`AA,eaOϝGymc(nc!L܎$ZKP-!v3 o%/J|9z*d6N[k6JK*2IRpC?WJCn<X -op+Tl7FΉw08Ҵ^P__p0~䌟e^?\Zm (T4iɭeS8:!}:4 obr/~Y 2լ4>W;Kuģ3uXK֘'lVfO>C΅pb yp̯+Oփ;%5ζiF)ӞmYrQ`!juIӛ-v$鲨Y(*\HѲӖf)+U`Yܙ`m^J4ڷF"oVNu ^b.n4yEvtfuGP4 !]hC\w$mUF4s2(BH `)&"FZWNNFr$P0  ڕ5qa=M@1"H4J8E5L ‘<}t<#ShzXA EE#`yax^\H5Iu6Z͋#bQrvvw? JReN#i:ޅWH+Y L"'22c>r(MWWd2ة~xl.mDŒ t3t!Bc+>,C_-]h2@S@ƾoD`d ć ]lͣ˛)TTyOt l>8LTΧA؋j6&μ51<#H8n ijvԻ_VU>Ns2+n:\"@F !:&B%F"t`򬫠\֮WeMh f߱ōF k~J+9U=B8=\Αh/󊕭l4 % ~+q}nu }4i;RVyټ-dK - ED(vFY eAh$.yۗDK&WJԃg| EX •LTē> vN[EZf8!~E֎P@WRGjsbns$H|.h@ӣa@i#Ɍ?f 6A:-@p 14TsikO+[IU# G1R Jkį= N(cŢp& O^h}5]S𑚙MpMN`2Ք ?wAAE+su&'f{+?dMt-E$Bq5x`Hh)3mb%B7J`#6d#տ6d2_8ɺЕO$n]?g{Dk08p0w;@,^"jos&M5]-@OY4G]c\)((8BY{G, y24>!1bLCGtQ{+$pS Ugn9??yr\ R2{kw11![Z4׭t$v"0**A!Ɗk˕&gg]iFwgJ3XV}*$Cjy`h U)Y&㜫7#4+%ĽyFLTjV&c|Vie1mhOWWӊ:gdlP:L̈ޠlP~ez T(.6bh=eɊ!X]t+c~d52L\\WZN[u59:I3gM>rC`;CȘe3,98$Ļ ~{WT[wTJG7r9Ϟp ;RH5mP7pqsΓ }=ޒY4RdS!b%=Ӟ_N,ѭ9醖ggb)XKV=b$֮.,vо P֯(uI Rx_BH.Wgױo'W;kww7 pBֲCᐌ3bVte^r4T]u ArBlα[ &>;Dm4fȆ1/Xr-d 6Pl9v53:[X?C;Pb\34Q>nLKo;E\@Ol OD9aU<^ tLYƲl<~ɟ"43}i4h/p]v<6?"p7Bf:^4Wba4,ٔGRg'3>WIt*HUҒj&i*w~.侹\*D;M3.]RK%XȼKdcjf^obx \fvc>Fs9XVظțӵ%l5ǐb':>>MTs%0*[ð+W> N0;qT NHeΌP4]%OddP 9H=^n=98KC+&lHl|=H _谪Sv癆Jjol҇ʥ_ FVdmDPB*0F)Is?`>?*1 #^ 0Q x @: !49 9hյ\ʹ( &1%?-Ѫ\ׄnaBv̉g,UȾBh7)>*D`j"f;ESӑ]/u@jxeScT*MQI㊁},Ym".mAwq8ؒ*7ucn0w"ûVܒpym2ٵ lBZѦ4gMB/f.u}vxⅠ\?P3X.F@W~Cg5bop|O9Tgl<`īԧXyۧTnӗQխe'Qt~t#U6,>0ŃU5e?qCVY5^b K+E~lHf[б%b,(vK%EDrB-ͥ˗3kV+wȟ k[w i~ΐT 6*+!XFXYCKQ1U|4\]ud2%QcwqD/%т։}!6olFf8[|'2*VXm #8ZEWj?ٮ޴ ݋cIs!^⭨坦P|P`]D*{89C+d&Рh. "^hVP{1ZNQʀx|Q6Df9Z/Dl lݚЯٷm$&ws*qlqp*lQBeŶ9ʕW(uާ,3Qr fN-<G[{K{¡ׁC? JUR{K8tRR?q0ƼT#vka \ #F߂ j\YK`ǸQ$Swh֏W} }%h;3㶒nJ͎BFy<@]?C諾ҤeR% +2psW7ϯUv ޒ+- Ȁrтr15@+!pIboi0g7TiDm!J Ԣrq4r/SigLMÎ>e+Sd%79]?KT]Z|t!Wia=]:pVNmP1֢^H(Et&>\%2?gVkr Ci<Uz@nJеP0&WOcf_gc^iaGy%MŮK's1AՋA-6 :TFMa ٽMWfl̕Lisf1FG9—$!QsI~ L@}5j{H6 ?MFq׆vc[2(=,^KMly N|a ˫t_sh_'.(uBV >'˴(R9Jh3[yXqO0atawGDڷ-N'sij\”".k0Pli~.+2K`{:m<ڈGlEՋL&;]8sFߦ)ig0Q mc!X0ܮʿmVIPs\`BRL9IIwKG%b{5D0eXSKOaחw Gd4=ӓVh| Y8 [>ln)G?T„ H`}/bF9& sؠ?*t'&}"wFq4#T j a:p(|qƟQPNQ4:8p y?0:/{_R /G>]P_Bq/@^eS?$nm7l9ߗjDd߷K~m7KY{\FP嫲7ˀ4;mϱz6n/БR8b5?؈ŰoYHXxq&r(ʛiΞ7X7\zM@`5 WYĔJb^TDl@vowhhyVVkxU[[_{_~;'68MB+eQ',:kUS1 @x,D"6X%a&t[j0^!!)wgi1dpfL:ce_BQW*MC^h= ~r)]JkveQf>dRlxj|H>NA 1~k@iZ2ܛ5vxR!gaknò5 $&,hj_5RZ8%Ksu52K.bBO9*3y#"<`EOЊߪEIبoF#d&Uf>&=0x=@V>5"֢ Қ8ޅC)@3̼%brUd` Ɩ>p}=S<:ȃ;A?HPV*EÂϩRE6.ќ|RZzr3k3MJzmH]*$AOo"n}b_7I'H>gf;&1FV$prտ} Y>]=iEw9"aB \]IcUG(W҇ ?jysfnP; d{ΩAB6-lIdWY ߯*ך2SV&P?]VAZ%*sʏ@T#1_ДiG6fT'-E4=TKT w vlF1ŨY2]WԕYX]9xxHTC@![!tLF5\˩U5ֳQ-wH#"7;Co#wB oJEd/ YOXeo;sn-P`'mWe$&{Ҟ~`bvd(s~g}uEwr2~Ɂy,N҄f쑶k 7v Y[g?ÊHڱd/4)a +KSoϩ\ݏu͗i"Y?P@i$^팠 2y3~K-^G֒-L.d&o|,`L <܂}AivN2Դhɴ]&C[`SZLCfY04Mg J-eG A (ȉLd6auhзh}xs:A"u4œϸ^v%`=ZD&yki[[4&/I*ҵ(C}mˬT͗'HkHF (X-l8tC5 u! )8yBևcJf hf3 kW)=tg1z K==i|oڸKW w|s[?|Nʩ90l 0I;cWG" *"zu mQZpO|7E))`9Zl`*ˊs.(W 赝HzCfأ女h&*t2TuH*u,L9]s ,n FzP6zȜþ# ^V;dC`_/E89VyLo9< `k!`S|KeFJxkx rX1- ɟ1TMv>Mύ-hA|P+RQQAOfX$n-wȡfVK%%=̒DA>DʳR.Vb%Xnƻ@qG,繽A'? 4 ӌӽ|΄}>މiYm20 8@:rpla O#x YCDQ9eq\[CpsFΏ8=zOk >%~`78'[m Rn[դ-uѭvp<%QП`+:ϰ%oMk&n 4Gd?i_3;LȻưQnOɃҴ+Wb9Lz잨ލ=<56웥ӵ\y <N~y_%naY':ǡ5 E ^C UfgpBa_Q /#ƷU~uɭjY @բ(c?wևr,q%%KrG}#1r^wgs`oŨ5[򪼂9a/d}8OA 0~^UW\u,-K/H9iѻұ^mI⨞o{3WK)3a9$Ý0or-!򷺡@:gm t:jft0`-뇸$T8|BaaC ^w!{ַΧ-(664EM[dž{s|,se DgSF%'t K{  A@IXd'pz/BȖ]7ɓG%3@71_z"&4kV?ިQp~'|v69Ԏb=y@hW)63K92M<f`uώ7s<*nXg(>*;=oWJ}fyRrs Rh+y*A=h_ og..l6 L_D|I74ʉ&Vy ;3^P!YәQl3Q΀ E9c(RrEՂ0{15*\R Arx5+zD+wș\3_աKV4GXT_qEDi!"yI^{vЗݱ /e&^nNpJ=yHl\ %c'ffLnP%Dʩ=E|E(MɎ Į;kaUOQ65w+)MlFbjo.K?-E!e p@Px|B47;$׫JzzҸ-v TٚF8p&-"e~sWLvMßWTG,EsӔG#fjVm ص[%RUttJwi; /$*0 JWZd;R~KGk ZDř5(gti#[fFѴp"qf+ǞzNJޙ(gꅲ_{?;K.Z^߻l&L+N*$v+4Bwᝓ6)4նW|<}.6vfϞuϬ>jd^Yω_ l%"_!:fy{ii9'OJo+$k Gz )dJjj)}~k5f >~J W*1銔4ZXI@U+oj<|4_<})Ol!va'Hb@](Q"A Jѷ EOs} }h;o]W\:$ -p`12LPj[Uߨ2sҟJ3!KDK1[Ls@bolx.TJ}YHº)pJ\H(W'AKevZYF$tD h#:p^LE֊f\" H4$0wܮUm Z\m:6Ktx eL>]=v{uw3t‰K:t Ї./,&!>+)pH[Fk2aU`8/NAo?q70}PA$sHj! aZNWhzMvj;NmOcPрbR+v``~:y '? <>ژB p^9eF$fZl06HfpڛJQDxQ}=GEVƩ8˸R^ ¸F{A􄇠/P8^'w"@.􉃲u﫴&v //eFKl*5QasW ;{az5|n錠io9?!zL' ]yɸ-QhqI%}=$z1W( bijO?$0F򱖼[<¢nl3{8&B$R+mm3Q@湀Hot%4'bqq[er$^_5}{UUi!K{_'!+ǎdM$qdeWSA'b|Nt Ź' b/M{,obа?`PИvfl[,pkR>4s*uy9p<^.8D>QWĥxlGUeqDAtRT=B1>uVK{qSt0 f]=ʅ[,cfU0D58^c6OX*=h .h¸zRg^8ªS){ e#*zm7i+K tiJ\@J~*QU;G!bmw\%\)vwy}CMc]'Dpc(qn-i5v MmR1(Q( ʹtOU|\j X-} e{f`Wr|92f6g=P&m]fK['WWy[=*:B_gO s%7RKcE0ax R)ubR/B xG?(ӥ+7Kx `fWj.ӁJ3LgШdqq-Ϊ" ﳐ|a&fQ.eW]g>["C/&4L@>L@fV3@9XTMk5lO>+^gXQ AYVv'opfHxi9IMZ#6VrZUiYEЭ< {ߌ 6'}9g} cpwuc|$ފŀw2&}!=^w%` ui.M-4 2|X넭y|r6mcg@0A"nDMb [ˮq}耡ptl% '殓uiq!~stLMwN`i4(ݻv- Ga}l)t0 O]"ߋٙyˀ6lCE BJm1 $ 4n )T͝l k@t3b'8- ow=K]C|D>{;5"h?c`sb `,2}o)H#Ҽ3Lw\AF }4k(qaHD\'z <~$K-V'(PyLugdyע'&㷎\N^:B96Wfیp$dL{~<śH#ѿ"n# F_h͙TLBKD&Y7O?DH@Lv `pXk/3o(* F^ʣuYG^*.4:]_z9Ī~Nt?wئIisW r6^~<4[ kq![l&8g2 7!g_*3mU?ZXf: cvp:FOBhk]XD{zЅc7/y |p8K j l:4!ҙq"b^y4'*k9=U{f[cG@MFV#V^PmS ct60\XƭA ǎ#xz֕ %Ξ(nk/J|)RlI$7ZCkÜQnm?? rq-G:UhG#2X$[GY6 :{S&=>^R:1+;-0cA&Lr߮yx]L +^ı/"9 y1A X2J .~pHk~5bƤɀiזHwY0'.נGrKmok/nk4t(X.' ĭԢ녜,j| *֢ Xwu񫗢VW>4D~<ⶂ O^gW,7_;v NZq׊.AUg-=-VsN﵌5;ԍqV;UiFhj eU#|cxfPS-3;jb Tэ̚o?lڣIQ"pA"Le.t4 T,c[db%0A蝋bI(*2.yS'bX1$2T Ioޞp7]HKY܍F#N9\S?j"ƣ}]MǷEkq?>̓֋ KVkDLEe7F iO)2?;SؚWPomgPz6v!EvhVSCJIV8PMvny`'IF2fHuE2e 3;9 o01%]*QkD(Wk)'j1;-?vp~ ]aA"\t]į^IkZU"˗"C{0XM7+V2a>X%A(>R @;f GI&d9oy ͮC8Ҥd7YiH^Vms7m]Ö< n8oyءg{l<^ڙPhۊnKN|I['ۆݠ4Ky>1Շ9 ֮Kˎ mW8`7_em)"o Z'Mr4 <(,VP&#VY3*۪bϵ `~qTgObmnm p= 6Brb,DX =cJYq!>y*bJ JdЩRDϦ7׽ L,o@ oaeJa~I093BuuY'[Z1(g^,p#㉿Z.ZWhF"ITIm;x8>ޠ.jLw )9]&=;`9VRݲdD ̎%{>?U*T6iby,6oHٸ ^I&'H+T@X&5Vb)~'):>vT}lOo9H~n2V ޘVIkczUtdv;Si\oċ?҃ΑV>2H~ӂ/K)whEiZMK޽VzA=^Ri\D|jGi.:SZfi]?":sV.EZΑ}(bSL>BfR7JO2tT@ (7ᆷ{:tΕ= {[ƭ!K%:;Vb 3%d#VWO)ɷ5DwEFfs6IW,oq=z3ac8G)ոAr?Eo`OJLȑfWk3׽|yy_m) j"H.v56S{.YYر^+`},h<~Dl~B k!>c$omuTiXI*$'R%9C*x)W|oN&Cdo7g;&s{#.vcU k@Ȫ#(<4ql7Bx(`f[:!c0!˒&FѥUChlM8\yz$oeLFr ԋ-l& }c0G|l-pOYmebj 2%}q7E=`к\k)qr/<Œō溁`3a#k[37 Ld:?oޮ2OVk;sܺϭIKh3M( \`N8> Au&? m,a#QzG++KB&JC$cJ(K'j!lzBu5;csEkUC/ap.fa@.EÈHD9r[rM1ۭM$zdMu mT$Tn[Ny;upgC1h(χ C.F"~.ƖgңlcKMj|G5sl󳕛WDL]W5%-"j͂Gc 4q: }% L\ 'ES3p i 08W;p F&ow2%πI4c _8VpP?_t:@PrʙD$<+BKNm_9O=R[3i755tЈt~sQu v/gmȥyCU3 0diznbrcKh5Zndi m7#u=a‐>\&54Ԙc_-g*%n /D;)lO$%\Gw.h |#f-G}n@xdNhaեCCdaejOSyyޖgj#ﭕi9|b3w;"hfuLxR;md*iyv9<;ð)gMr)㉨ 2ɘT芓VJ`\EOPd(/;j31]<bOE6dV M1uĶݘ򪙍>>6ȬKtHdBRW9簹v漇y{ `>+V\Q)b r][du^В< gXH Sz]'+!/,z.F)g Jp^\Yٝ\y9g4iO{~Nw!Kխj-99?Ȥ+{C)|-i . {5Dw^GqjZol(εċAOQnHlo^?Tk%p  vӀó{H uf4B/`4&̮6%D|U-u~]^&@PQ-q~Ȕ5r(>[{,͵iGo .ƴ^/fGΫ3X{Pzz.ߡ}9q"[˹M;Q0zѡkzwLaP dbΆd|)#u`!5f \"xU,Aכ#_9|2;债i^&~j7a*#!jOӻ[゙ WW pcHyL])Q w^ݖ6 Y?M)>< 5Хqz!E9-*iM;φƋ"=BP:;̘ Baiղy=xOOw[BIH45Zyz54䧉3g~goYC{\|;ZimA` *EtҷN;}\ƀ{P$ 8ﲔr W(h/nw{@o/鳳i2SE`z,Dō' uG<|!"GfsW;Dq^X}V[qXw2av\I?^HGlG C N, 3Q+#@< G7N6Toܦﮗ'9cM)AQ0?KA0@O1QLV~=g+aY.k=3v[`w~Փ3ml^eg'.Z9"Hk|iN/oZ yKώ `kEusWȝ%7A۱q܏1*l ̜Oty}2m*89ylBtzz)'=?;~as(b1 DW‚F<ť-wۄ`Un'rd5iYS+fNbX8J~%].yv>`#M 8jzo!մC$[<>m8=ϕگ[ 4Fl}Sp-Jf/S{;&[NHrͮQ\ ӟk͎,·I;c!yBWNzx+'3u?o]2Դ^B_WC1^`e8 1YڤI@SU8E.CЇ3҈BuKz鰸U4Gcu=m/#vU1l*D&=7@gGmG&zlBx>*RhZN.5ŮEhg6V}LG^;Xf3a'~oXaHlkࣃl 55+NlkL7KZ[kRZ4zҍ@F;Tk Zqr<~&ΤTu7ێ5I"G^JZdk Shw` ..t߸vPm#Đ 9A ~H nCrܞ\l]v^X)S? kj<Ґs+ dL*3!a6I(>.ѸVw2#{(iuΉ¢eEFG!31LAplAMj{3~"~:&38l!7.~YnQo<ɑ;Ξƒ^]jW웿^䖚RߵPϬ{x^DM2B|:bFgA0TL8D,c^h^f˙%6+ ◕AZWjX5̑-Hzu4HCh,q/B.\BN#3kpW:ciN . FȔu8DzvH4@(?<Ό1+io Udbz_b "~6b k ]S:WW:_i];exN'F>:'s)CUO0者lPS,h=m[e{% "m|РEP`-=mO?()z<ɋSHXwKjcK+}.NQh F6V`9Qa*٫0gn:f>'>t'6F+ztcM-F!o1bL䆰r=ulPC/wC ?0 to{v,2\Gޗ|Q/bZ^oiyЌQIW+H.MiB:cY BmפV9_j$5hoy$㙋ݭ1LnH+ J9X~( AYMJ]OCPam?F cVyn;x&PT6x=Uxsru8x cyw,kMWvk4 Or_| JN^Mxպbp~Y2R+ _q-y1iAx&3jZ]1j6 TPc9r퀑 @] ٚJݖm]Z{cCZ<ϩY4&*%|R 4MW5r>u9X eQ^ч6H(%g6y-{#|{XP)m<p^3oGLaFW9imb)yoY2 0^*;7L[0nk*U`qK-<|50N ?䷴*Guk/T\7CgC~_f74_ uĬzO k}bs|)eXf"gU郐a23kQ8 \&S pNQnԫlVߣCZ-d+Qx) q{]y0Tq 6EU!*HPw:):#JM|лmhREҰdk}n)Z*SQ4Ʉmla5yyfZk=2gg:nCbQ7AŦ/#(fasۍ cA5ד_2:z^Yv K+.ĒT:zZ/$,'K#Sqi(]b :eEp۪!;fXBhT>|$|Bڎ ry%g Dg)5m- ?m䍇7Ҁ0Ӛgp ?J2r?E]&rh`xCv&F Q0њ8)Ʉj-Ka{u!@>8w6ۉ/ea{n3N5|,8ن_t"VBP?%ЍoP.6QA_3A·rC +m9aGi)\V8;yQ9rsfxrX\o˕nѬt}HD%AmMT H!e_ȵ#jcyb-`>3 wN Jy.k' XlVTI sGT8^VDQOfOP6} @ 4zBJ@1!ј@h 2ET>~=>q$:ʜ3~Oa̪)E[h~p&&F*ZmE(CgxŒ~l> _O<*_IWN_DA ;&˫3aMFgV䦗&xHiӱ n#ȕeL+ȥ∶!.S5[F}nj9rϲ^["g hr "E'eCZI)Ew,f"nݣz~]կQJIz"]euj2qO3iTG (Epv.A$D+X9 ~-!7(CH84dFlK=|DMTC}+Yкci\|w&kVcRx~^A-͉i4jQVSfYdWxH|'ީw X:mt .Y_1+B/_bWGT`;nW.߽t@mB6A4L56ڔTB AMiޥOh>;Yѧ ĺ'g%j/6LF;5X7j ߶2M{`Խ!R.޾m0ی'|!yS]^-(я:'Ť%5'R"-a*r = )2o|FbItUJAdHFiF5§(%lQJ=tiA+%ߥ4ZQ,>/?]"5nZ1 `eXhC߄i (wb=*=iƃL ]5d_j oF6 u"_@Sg~BR6At'}q38:_ԑun5=krN~/v-Bu!u((Tg m'<$ff xTP^'r`7r]7N~X!bX#]{b.( $}O #eHHá`0UUM)rC[N8RIw\aܘ~-2bHtM\LOnW!x82B>mTb-9,O8/y -=8Cx5S:\ipdWEP_7L:VYdnZJQ]:RoX}/OieZj cT:`ZER"oU5oqK z.z0ڋQ/K6 PɞL0n@B]eH䜔 g C`D~`vi)2Yq}(1|P("0r E¶},uty4 a_΁[8 ݍsrPdn-h:D9m޿wr /84uf`^Svy~f55Fa h>uiY!MПH,qʶи-<t_BU3[ĠAwb~oúexZ(x5bTPm"é,GgM>sYcbް#sn<{B_ y;PJʆ!odaQ.6pQNš=ߵXp i\<mNU9~s!eıP MI`~. ;1YKcJhdv?~͝2LG3[nյᓶv3AmKBҤgH m&sZ\lȣ]l, 4D}A֏o?H?Sƈ/Nz\"Ox#FΧ=x?V7i}8yT+CA3%~q]fh9u$6?fH[:܎ij!x]9,pR=ݩ#Pǻ\;BevSz(i$XO |^KRTP2"g^#?^c"Np^̀fԻ A,x"W0:NS.1G)Ga#ɷ,gf6J͚4 5%\OMY %Ӏ!5&E{#?7Ygޕ9xܤeE] -e5uvHGz#ˌ7 g%U`l]FJk8%))Tc}+QAJ*9mI$3߁YOEvVv5A殆9zɬM?-{XShRVUb4M'L_Oڠ^V2Y wiRgg\zsu~̀/|DВ 2RM4$spXD 'ƒ>Υ88΀LC9-ajb#TNlV5#b~&W6-yg0Rr/am5_4 1u7}vuМNE {MPsJR;w< sFOowMe##\ h^! @b eF{І@rmվpY2GWW/ԋ yovc,}V)v ۆ瘃őZ_]5.7A}  ^3i.b vѠd&]0>Փ&T@ gyOk˗欺{{$l [𥁥u~1gh tq=5+v;GS5OMpXQ(L ׋ 8=F"LUdT&n/{jginLKS{D+( 0#WL[ 5D7InXwx'!~ܔGdJ*+5VN U:VNfurAC.iWB1[>TE"\$^LoTB _u{:˭sIg,HZFp Mێ_4'1s7d1+J u3b]E7VZN6 09Z(dcjIzR>cG_Ahm XScIa"oW !1MK; C_ٞW GS~-KTp~ۯsa kA8VLVX5+lW @p7/ b`ѸBilK_kyz9Т 'YPaU'e ~8BQHj8~` [V5?dw}54CV-[6 'l x~ *Imt3∇rt>!;}Hq<4 .Aٍ^Ff=>] "^h@F'y{Z}d+&if:sVlOz9|N*ߛ;/ܵj Flgʆo{k–׈!s}Opve03T:ΰs>FB"|[רmʕ$>8Ǎ%_;nzOhTW{|9%Y+hI&)qaN P+BZ_{ "B[>?}W +E/MqA;4؀P*X(24.A$D<a2Y awOtφw+,# WA*tz8"y,( vAFܩP#Źik=ល?`[ΊT[Ny=T(2w$ʏwxbF>#@T5}(gT̶=>{Ns"_TP\H*L],,dݓ4k2WnS̕ظd/ zٌ/]RK~_fne7Rw[GWYBF pjefIr遵9,EN.=d;SM )OP}P_ԍ2띗 j 5\ 1hϑJ)녽QH}^ jȍiM`|>܁+}5_RJ-f6ykYZD?tjmܽpT\륃y^O(a2^G\m}g"`T ,R nI>X(lmm,#ޝ{)`i'RREJ?pZk8v",ĵXD&ZL)d!-F-$r' czlv6M >9Zh $\~2fq-Ny=4:^*:,'r,I:9A`d ɥh%ڒC;, <[ga*`H:{0",ͽ9-[;%hs0ix؝=(-d37+~G:Z I1I~LC'맶q}@rԯ>҇LC10Mp9&(!5j6B&+W>kbp-y+͖A[OC{ BiY#dʣFcε.+7C:Ήr%a0 hX'}nLU7Ij Dcs߶ +PNY%d<; 5>9~JԚ qji<HL^aQξZ3&ynJJn' bHdU5݌ #P~@b}H&'t7=^$!\z'3y p0 }q3)M]̒GIv_)a/Ե}Ed |٬XT mr}ؑ`EKUʝRʉRGAƐx#E ^UG櫚&mUm$ a* %|:?2Ӟ<( )EyGvDIe8(PJ"Ohe)̾sQwMu .չ;uTu}3Y&nZ#[L6?D^+Lu:zkQ^Ӗ o+ #Ϥju%C_\3I/ݓ>[kv3$.@?br!3: ai.eãvQhA÷;8#1t& ){:( ]5?uam!n)?o[Zdta aE||?0/g&V%vUKرjݮˤFzW'D4B 0A f}*ýUl1,*,=GXZ\f5Br;V~.8(iCǪIpήI]s~i(Iz`kᦻ%Z839(?rl"#p4]!6ÎnR s)|Qnx WN/5P.e9?-V ~}6Y)IۛʷmJ˅.?N@XI3eQ*P']=s^tvȏA&#oDr&.aiG$yUG<)uZ|IeJ$(K4ZmyAɁ%|)}5Vor^1j^3?|GMղgn 'YRp<gb7/$HIUvh|*9mU~AHMD ZM'1{: N'" fz(k:{mAͦ`T⬬^O^hVa|DRf#įN.jq7K[ʲե=}(M[+4wF ߻ `&16(F|0ɡaY+ 1Cuv|Q_lrNjinuUX4gDZ.͇FFEl7'8K>$Bbb*A \ې6IP\hćE <ry'1o-7k OgMZ [k[wQЛO<I0 q79LĞAYITNCu=QxNZ`kun2Q A hӻUEeT#.[xC#YhPqv+kN'GeDϯX$Ovx<ޙEx"/ ,2O<bBx MmGq-D֩nUp}?HKkO:SB+^Z|uN†I3IL*;+(Nԑ[*n]j*hTIj_xE3|^}^J;E2YUVͭ/bMA i_/љ5b<A > -g.ɉ!˘4=tF+>aAX vq[.'):D: hT v4c3M|> Jfa:p .R VuO_XΌk {J}2* X4mloaxv|6*L3"lgn@6C{*b?r^ o_EUxK J>67aԄ<񺊏}d@@on˝c{VHBXj`yH36L8".:Q M}?\C@}U(x(.WoTr- >95O6#+[B|d'ofI!V-ç;#ӛ.(k/1/әEʴBf5.(Wԯ"aC>T94[_$}V] QOC5qכj ]+!"AIl[uB9"Ӓ7 3y&=\Ƞ剘$Tܧ;YGS }6b3jH_E13kr=ہ5: ܽr*LO#*zt Е[G`.r|9 \5VX 8el5jEvQXcɱWkT¿~xz f+!v=/b,<ʄyM.Ջ.|;<=g4o>L(z XF,4,w]J|6` r\UEoFi?Xo8(( r;?zvk j)zIo(HEb$C-0siI#U1.)PDn ":ỄfH}b W`gLx2v!ƣʽ[ ^k)%haIL]h, 4P '.uG,f-( Y6QWz([ (ɿҏO;2L[{MB"IJ, |igy kPXlիñNNKxd+]z[vl0#11` 3t> %EЭ*X׸:4ݝ&;4 E_"7  S`cR Wz.zO&{JX-Psn[2ߔHa:H#ްH۳+A7=<wZz,gGivЊQ.g}jn/u<ʤb pԂɉ5*& ټZ3b=h gVjv:PoUwkf#ٰ!;߭,84rũ#cP[PSzz:P z B}@\ %w63(;Eh3ÔbHslꑏFfHCE̜q>W=&u 'Ķ^}ua-jtТm̄}F 'm{<#;/@ۛ!$K)Ubu ?|lꦝߦMDy@J|W54%ZVbGRY_$ǻG$!+*IN TS 4^|c6t*z|)޻[hzbދ">Tf*xeL+7 N \_q:BR$qBDȯF :#Nt" H'Q ~qGz $R7:KfP9,6ar6 3a\u_ ^EmeSTi’V"ES&ʬFv(سi"g3}l{&25鞧7|h{K'tk&!6-J- mA=R&\~"4KtU9tg8@(%Oխh%h@HP$Å;Dn1# X_˴K;N՛QpgoNU`B3ۨuP 7ʴE0&C5'W}h{6ES#q\:{`?f65Gd_GMS[7E6t_qXQߪRMX] ?lcymP@ |&*#|ԅl1p1 # dp%Ӄ? )lToT#f 98o:MKTҸheEF$çou.m[ڟ4GG"=Qn\Ҵ,K5N@X4XdhNm˾>|D:Vru#,KPZ{^/\O5ѣJchf1İg? D dSc_94]i~^hRޅ, ;'Qoz2@@`=֪>KM*fy7G DWIiC=Cz1n`p|hcu̮$#](^Ȝ,\WOb%gڣxyT$Aԇ SV!mNOz占#mzyLlh䎙ʚEx*Xz9I)D6nע1F/+RG&XJ@@;Y~ ,|"`{8c엉A&'.W _?w2rd)b7Hku/@tz:\apS+Wɒkž]d^i0FQ#P7{x˅GwJK$l0aP{a&XA<"↳DT!5dtPiJ|GqnO~0/z^8Thw>C"klu\~z`bLhvE#>qSTWKsy|Ԕ eU*YF2Q @ Y-sk?n^v窃Z[j\MA`M~#0N;!+U,6[݊Kzx@.( kNVOYt\\4>yXfH? A49qJ:V,Vx`i*=c9yWP5Lbuow@M!_Mn0 #ȇLT;?̄R(%MϣWJ\ L0?K2wO]p8؟'؎7 SN 2ߌ"W|oZ?.'P.VEzx,(ƃ`[9nMQU̜Šl[<:V; ]@ #A<`_0k<^ Tswنi]|ܸ/EðfGHoX); )K·}3~S I8U_xc9϶( БU^ajQ9{4p>K1ts9I8aKVyټy4_bjDס-@\8{p}kMxaũK~<#0Za.# #{hxW@dxC}c&,+F pBlyS-5XO6q*k߸ VEegEI@6<=H@`L^X_+ !q 5GVBbsF6(5RR~F`֯Z8J0?.60ԃRYR&T>S9&aΝ1pP5)w.9z:v mâ8tYQ ɍ8 U(Bi7Iiȣg ؎pzC"W  كZVq^̎z~.7x9c}B7 w> J BWh ;06]<ڧ" @Q';̈G<_b;I!2T*s"/~ت%u<=e ww S;7B+K*2ܕWf5}办ujƍْdLeY5c%i6ML!Ag{uaܕ5/ 5c%HkZI*A誈Vb3WH{^W60ZM v(>F AH >f+1 >L(  R*+(7{Z>bAK6IJE@wr%i)V }!|r BWA r>W^<3-.HWh[nǏCy-SǬAqfwWGK)ҕEfG1@-K{Oңk[{26Yi g[7o*0}9Pگ t (1 ›Jtl]Iqo *sd'k!]kǯ`,/Dab;< tɞg;Ւ<ڨ6ZĿ>jbD| K&2Gl&J\ߊ>٦21sbNa'Z;/Xy;{کOMmpQWh/:55OQHjsnQVtC5i=~bZhL6yg(&*q0%@anC?ڜ y;Vrv/ AKYb"iOixu )H:Ѐcc` rմ{MT0GoC$@q+7O ZYZ?uYVN [99?n+z qE*urddECuQ ZLI 7da3lCrM#k7(b 1[nv'k#&ٔ ";&'dyYMh DP¼?FP7M~,2 531De".1|G8fAUm dAMmH[v^۸x!FGvȉq1 4O jot~U@u1Sel'^FAiYO" bH0=Zq)ZHB  NvLM2sjumˋ{WZfo`Sl.%BZ"#Ԭ0kr: 5]*]ބ5 |cJz;+w"[w7蠊&3?R %45ͦc1A/}) d$Jme뀯DRdlSt??%w}9IRWvө gYӽf}XymlyĝՃY_8':M J!W)ķ yit:NF|%H ;CdpSav6&ݷ2$;oWJNt.DJQ`(Iz "{gv7;`M<#d8^Ǘwf{Lt_v=OqCG;0%nPگM#zZç~-ƽ1f5Oi[ߜ2Оlw,} VLkx]K}.R ײٴ! ZCI᢯V{~\&=4@EW&DJfzMȂXj!001|R˒MSk>  my23+@F{'ㅨHe@?J]ln69Kq7;4ڠ\k.D6uڵ͌Z#Zn==hn%Uo8)C#1g%mKj8nao{*}E>4j(eib`I; ^'h /D1UQ5z6U@km}X-5mDܭ($:xeʽh{NY9a8堇#j0!ĶY ҳRJNZ(&W6\6FY*lP!QKOiyu> *w^Run{NlI[mvD:E베HobrMM3CATJH%p/UUhף[6]=c|y L_ 췙42"JD * _&] >F|ߓkm.mZ|R)&h6TX_հvؙ@e uԠ&-j} JK4Q3M#d$vЮ,휩$SK mKg#|YLKwsBmen@Lp[ZC&m[ P|]!\e* M)΅bNޜ0JJJo,6;anO2):xR*;o== 2kh 2&YۊS/|*(9'}*Pǡ6Cs̉: s avv<+\*W!QSv0n6~)DS$NێX?1|; ZTOwvڌ'"lnyKRgXHw/y::\h(Azz6@\m(ϸVg̰xK i>^h1' -6'ƹpXJs6@m殨`3M[ B"LۤN/waF%g~)l3t3}B@{VYycܗ=@JcKX02 ~#ӟQ2q;^+?MDxgEA&Ȭ*͐foo}vs.Qq w H_EnuE_φ,iz\jfX4'NNV%P%+Xx ms7$(9~7sN2\ BQA4ؚL}n:?iVbE֭ysV\oWoV6> g5?rz| re/ⲞE)}Л/qU)Nzwh YgAHʮ;HcM pECMt*׺!˵wkc8ajĊ"1 d͑‰NftzSlyD(:#=.tQ̽bѧZKpٽ^q=.5vk\pg@Lfa"v: ukŰpFnlD1l3iEu݀Bnfrr x59{cR kTQPjˆ2&߷c)xgcf "uጥRm >n˜AwF 2UZ\L{Y) }]@؟v-ЪasRϳ ]J09&ES^j3AZW9:'lط7ledF{K^5g$~9XE2I+xC"2ƥ4]$aF"ȑR v/x2@3.E A ]yo!V_2v@ou9ߧ*C9Eh= 7ݔdEF6}yH҅C\_/>|t(ckL?R~~~ixˠx @4mLU! #s(O7̪oE~o溬a+1E͞[6K*v%PpԑiXR%Fv[J4h2A1Tt M$efsKF v-%ge~fƻSAGugQ]sME*/$?lLd7JL9\EHfD D_Ĝ*m[k4[ 7;bE'J0|/JnY &;݊OQQ5O pw=a#&M]Î|JiZ$wk4.v8oO*Ue?qӞ|n~C_ #IvݼokMzU5Xqx!nXJ{N`P \wX5:('_`LQDd< |rΟ ?*/YE;DZixI'酉0703vfʔύS^P۴9:Wr<;zM$NPT>AA{o8#/!/ U9F,-+Eyb= &ш5LgsU^2ktGS0:w9)cѳ^!]Bt?Bl597="֧ܯSYhKAJ7[5#fC7ۿЅwJBLِCu]TW C,hN;%8$ Rz~uyiN~[c:)K'zAP\ey&7!WdZ7SR+>ZMҚZ{gXh qu?ps/Ssa֤Y߆]=4ЅLڹ=:=0E^@yVJ̉~^Yzn}Cz=x(}IsⰈܘ}"tX^ₛ/89yQn'39뎖 Y2+`u T~<qW0P:>cZ,FE2+͡\9f_s(CGÄRM>_ZR\G9\`OUzƌT<Ͻ  +2^|;@bZ9 rUU}x96AXh|LnH|Aq?’PPvsDJ5%4X{,cM{L%E R]_ԊӰ縆 3&!B9LI0O0Mk 㮁X%3]Avic}c4YNJX/ Q&BD @.Ƙ)`t=~DjVcX>-R',Bo,1E&rX9S%~Dq|tJ} yC+ گ6?3%m9ūSQ& _~lʜb{Qq+R Yύe~kl+;Zm` DYoj|ϕ`缎AϜ(<΍xJ2h/F&B"YzQH\1rLn\O^G=q=[T@|]9p*C)%g|'In9I?d=+n4֊Z:'GL]Lz-˟0r6{M5p<#ZʆvZuMJūxA6)E^s5|E2=\?e5ͽ?n3HqfOvZ L1N#ju%GH$9\ӌRU5Π$HKy TONyTEgB1;;Y4Dˆ2z>VCt0 =?K-WUD n Pwapa("Qw5'I ϝ?M;m+cn5i48_s`/kڥR/Wd eK59\f=)XzwɬJl8G՝BlQq>|]@ɾXk hM-  t]#st~mM˔f*06ݏ9EzBǒ976%K|nGb(@m梊?%ddYzwUXOۅ;} k?nAoU =艄6KqJ!'liyEWm 7m\c^riH)tO]A 'g~˪G[~\,a"D_=Sp %[8*nHWA&t /B'P],:FW i Ų@'$2!*uϭ눅 3.gW,p5{W0V 0O5>M62vBXP3!nV7o"z6'\*G ψG;ͣP]b#Cc(*8p"(I8e cvn\0ѩŸEXP'Zn}ewO*Orbʅ^/<jհY/.1F($lnvsj㶕Q.(8=^食 b؈;>^/m?ց$*l '2T}D3IVVe7`-G9T']N<9?V-U8Dȗɶ)g;"b pQ %* ;kGib;`.~iӐ&!hL =;?tzhHy 1IX \B RUy56:xZ=x/2 pses&q|E OV9@% n·l;&k*E9{\A:흐8 +#P$YETf\:N~܏EuDp׎QD_a_F}-.2[bT% ӝ !y`T3Y-aGxHZЍ| Ӏ \k/Ĕܽ'*4)`*,(!K1-uwD<4v( J(Q7y#N 9f:y8yLn aZ-RK O+3s aR n[߿"=ޡw>B C:f})Z, 1&G0tU.N <5D9GoMtT=%ZVE#Dȁ~:AYվ2 "`{j6Y"qͱtfXoBJ:P;, Jh;aH!9Z8Jb(L3YT%w#S|i/ -UvR2-Kzd[mԻ:&9{T1gq,X|Κ Ez}&0.lky]Ia=Vi2FVޱAohuOR ²$^eL8LhnM|d=05;s#Իo2/$#_JG&GxW/?l@F"?]׏{I?j`T{3qfQ*J;; ;K|GATJީvA'T3Vpa`zfW8`daM fJYJYlK(E)]DSd\tH1({ ٠7SmeXPekx*!ZH|Y!Ppof /tOaʛ;sZ~1bh8]y [7rAAX" cٖ< Ac&=Y#JیoؖW%6ĒI'bKNj_$wA5.rE.GCb\OB^,Ϫ_+8-:ꀮRo Ӱ☢BlYy8*5 eWJsZSN5;` 5/91 yVem6@ Zð7]Ы?מ̎Gc]jSv"g==J z<LS٬ެ:-HF(B;TRM`JT&onE%&1?2b:!q_;3JEJ.&7*gn>i8GݲTEuVWP$ %C* {+sw7ftu[ w/PG1yȹykZFbsvk>1%t;_krװH;~ }VIvX%x9ުQ%It n/\j b`/.<&uV.:_Kk<C\ C'ǟȫ"Z)̞C|tSfr1f: GO<(Уz۟hQx҇<:2[}KD߫m9i'^}zzId##_i$uVfh7lקB)&!h~ LI^Ut: l!`{ 8\c d2 ,DuyBN>q LK "9yϜl\_p1W'(-穆ړM-طe*sM/tے$"npy潂NQxlb}LN IƜT<% lP 2K08\g Lck Zo(0MA؁6HB5 ,Wꙴ|PU0ⱏ5[% U.+O!];\t`5!>] p:3Ym${)g8<^.(z[fis1^3@dֳ"'_+?pb^BJ?v1?2I5~%j\i`Pj{@W9lREpq6D"m5,Pű4%->m6 m'"J(iu'}mYϗN\ٰYA:RbYvҁ8uB/_ IPbTV>un4]NZKEKܹB%Sr`opBHu3Veedq;8mw׮+*X94Ö ȡdG yʛu& dLœB\Im1 `w1̶)rО sE\z6 AyLun=_(@F}}XԢҨY4]N\~yo]1Ћ+[ÔnTkTĬyIDc`e]0OLZ6>fG.Vg!?c\ĵc]gd=US"g8nEMw%G )"_6LǁE2.U1;~;eΗN贀PŬ7 Hy`{UagwwY:?kh7aoSU|I9'(unً]VG1О)U%Gd>q O_˦VG q7/y)>>/ɵhU`cEJf~!AjW(0!*ӯ1M)~eIOl4a.n~ ,g'bء-dLxD28P.+ :w7E53]Sk#6 K-߬~ۓu/Pq=&Va>U l`%X׹j3rI;E_ ؿa*RLC#MU 1p8T,8eUWbt\ѵ }*SXepe-ݥ t!0@MU5|qXRh{H0z'(۳i2t1mъ6 }')eaZ1X)?A~3K6>ݨbNBӃIv8(*03 brj: ZAu%HHGS'fBN=n;&T@Ȉڬ":FQ},+ʿg}<ūm"#jثDۣ Au@ Gg#WA;RLQ$¦GXOlbc;ceOMp@f2/[<33Ke;j0tm䜢NXtUԣ7i۴ X c!9k9ǵ] i* m1!QЂwzO9ZדDP\0UE1q.td9h~hmWX E>0(>d7-5%'2D[?-o_Qh?Luvb6BÇ1ܮQlD z+ҒR8jD..*n}$gm;̿b ? r bc"^]UܺQ# _n,g<ݥ0kc ;*pyLEY=z:֙ԮSRO#!x@vDZʗ+P6앺I!]@ǯ\M(+_;?(pN?VN}&5@ͱ)OO`DO@FA-'-DD&+6䀠ҁ ;X#UXmUm%9<+ ߣIUC/SFn \sP>NDiˉsR9w7NcoDue :v}'+SY>$t'-Eu>d8.#h0` /x&][63ou4:㋠#n O:8n},0Eb8۾yم<zS(:瞄K{a(/EJU~O˔ -v+"[[lE"OZJP-R xWlɒ-hxX.wUo$m|%bV<م1aP/۶K4)@mQC9ž )x4MEՇ=@z息QT"Ȏ"J-}"݋l4^~RI Eac$eGZ, hgZ;tWvkz$i]Ӓ~#8jQ˳g! k , SRXʲbn9>*j5W~" 9eiRh;e"=ҴH6J6.]t˥ZA5Ȕ l0D9aٸ OC1ؖfO?fB[u3j ӇuA!t7fVypQjT:5 OIzmBtN[(lEb=5 u/p dga6$V6vߌ!6GenyV^El}rԜmk%dD t5/#! Y#-oĈtl3Gf˞ځHo"s(,C54d(M{Aı1CHZɬ=!Yz^gܴ h/7';*`ô*(Y CI\-dg s9%,pthTHJWkXO%KEt%0'MʤwjW>V;yZ;qb)O IƩ~+E8G[)^he8xW'BZDDx@ $~XsDKSH0>YJX 8,"B2PbfEy(`ޠ{ulҧq0>!HuAT0:Zkj7N=MZTGPz<ͷQȫ>{~' (K/u!N'df+Y0.i|(i5!>4N {9PҚ auwb&O*Ieϝk2pIEJƢuD:LR)fBJN mB>:Zeme b$ߗ+<2زU{/)robPH%7Tz6楴7 |a4#a-l lFv*Zy+f)Pƚ5ӷ=PHpDWCmP6UU>?+%`vsws6+UJơqQD"m*C-\ٞ7t^>&;ߪ23!޹(/U3M~i??6&g%5:`b\# 6FHӔ`(+M$; 6~Vۤt}.P4L6A""]!%۞NN/x3 G"pX "tp R3f<F7vr4N۟#pGͧW5u4!oİfIOzHP0d VЇ/FHYA\p)؏eP v]ЏxjHRһ,~CX˦m]% ]ćѹ4$%z+k"nFiO*k XfѶ[%؁,`PمNn9ʾR[y{RuQ'#)r/G9.#.r:PvG>HXlJىd0_ESX2Z`J Q<{qa +m&?G a2};Z,wRnKKuL iw=$ +7Ȉ/.j{oVW@4G]Go'5l@]<F\u~#y:u_Tc3@<af;@b8U"%bgSas ׾oF s;?/W]#x Nϭ,6"D&ێ:kE伺 +9MD=Fc!TE0KO $fxH]o%$*ƿr~C|ŵ/#`Hd#i/+a܉|wVj35hgICr3׵~8^c('g2e֥ t:mJ'%RDHKף%01qn=_.} 6, *i`[d>OE7$T[7} -e>L֌)Mw<ɢFoS+1H%L7H⼦X`d7b@cG{DD6BשY7YE2iȓ ;U Z"c?jS"i%؎%T;qA 'q(Y@bF?rfFDžZŘn r\$tl6>?dCs/@LJg(ewUv섆 zX& ()+.#4YP8Ϥ)J<XNWcm5ƿK7S~n!]ތ/H0@"L/Cک|N¤uk(h3xCYpf#\19;GHӊ]gxN'`▴wSW;O2!BG!JRjܽgqTXܖFWu_]iݳkq-e/.5RNm ] zˢW~Yb V)32wq$ ޱmoaXH')uko~?7U>}$fǚ0CS^_g`;92TL-,2ãD]`Cz~{B- -kǀv_p×plB6j_ӕX[&|كáN'R=t(2Lg]a 4ɊW{7h ɪoNI.&{EcD쩥#KKl*ˊn/ay8W\{5DjX&*zʝ>#3q@;K+C`HAm pVE]L>Qo3d+wO hGY;Ƅ(W1'sm">P>]Bvj.wF GN8% ܔLn%4_Bps*"?1ׯQJ2D -h]㕡Ic1yyY´琣!w|<&whIyKRQ/r@u>LPCR˞YP*Y> [(YeuENa6ou x>4~R.y2]/é6r'׷%Y!bG Փ}GVWa4jIfTc5[^~b1[<2>f[G(˗7[43įUn]L{a"o5 Mo :fsL:T4%t`9JM"b ԡՙ*25Ew(T@YZޗO֯ߘTO7gLNʲmN,uL'GbOݏhe_)Df&9Ǣ{~qܱ/Ԛa2se k9FEH"G>:po)WCpύ#?ˈ$,Q(" $ haюv_%0\LbķiFbp.>&5&e-^Nbp1X. hzmJk NdϫqQ2c^Osl!ЏIbxt).6G2g. (?GSD^ijۜZ+#!)/yYԐ:2m^C#JQ};ՆRQ2=3zFawkD?ᐿ`yVeMSB1{!lya[ڕG}_"|+hgT;V7sAQT:7emŽ ZUOǛ4ow9lŠCNll3w/u{b > j:vlHhX^F_GPZ:G*?$5n5K蠲" yjHR;ΔmGudf&"oIW̬wK9^UxvZ@O5[4+B1=aI.&!lSf+."=,y mKHbE n1s x_y(]^4݂Cp1 e:/ Rd ^MMײqzDq8&K:bR;-rzaO t iǐiPaa_HN<yl(@;T#yG8bJՌ={fqvNN!EkQmO'p7p7OF@a*T8:qF[q`-=m:`.;h[.T&bn~ai䎏ļst!#h>7$E ٽk@_Y]6E~|kqXnࣲrsq#G$ѣ9PWP&G &T[ҏTW;./~3A k*<3~ƕ} 8A4%eV*iۭȒjө+0-UzqzʐoVLϿU^䴫JTFei eM,3KǹaE,J$3:pW6w'KgZDv&e'3ځ "a48vgIu6sCbRl32b}g;PM[{'8J+zgnPxO6I& }I֛&]p–d0JT86a@\-,Ujzڰgᮣ{hm?ܧ07 }b7Z%!咈w|?OizkPy m>4pGj' МŁ3~ =!߫B8t6נ Iu5@ng1&Pqlc3TUkaDd*vPSݯ,e;~րxedZlc g:nGgŭĊ)ìY3,!~f &G1U$6_RrU B?+4fǭ$'{,_.wt;3M AZ@R1pd9 %j0" KQ[;:WcI` *lM= Y[|RO{Sq1ܹXM aoЂg(x w &/Vq3g-(>;YJ*CKA |8%>.L%O |ݔp|n}Sʘ~+MƊ l4hזdHRI5T:^$%?L:Ɵ@{B(5̃*@Cgk2Jw|ETḇ}D .s[pE83UPnA@T3KPWH:AO1Sc/¨(ovr }ۜ%N ?aLA]?09p̦eOCj$-A-BZ߳Du'Ovo"GR!Qz4m^u6`  \5A_f)"5-g{n񜲠w|vy.E> A \^֠s r0lngL/ mG ܶ u< }x{wҖސs]nj)wQ)gK&Xu<#1U"ssgDB3&1,y:pp n/+ޠ:l &ִd7FI,RB_1[F81cAѩRD[%Ӥ^bxbl\Ky0;/tgPNRRv Ca#*3/ⵧF'Q)I&>J7KXHiT/I*S̍: !G3#qDz3v&N,WI$ŢrgLzߜ.6 *rvDtddMK[eXNiX!`T9V:4\K.` ̆TJ~OLwTWԄX }n:E=eUCB>[B34B}6E!-eshWV񥿾VPݐRʖ+ ˛ ѿwh:ibaɖM)-y薝b B.Wf_ +3}NpS|ELNe+z7TJ?:WH -Gi؂m14'҃5 y>̵ȴkR8lS%  l˭ krX]`I/u"efk zօL򸷴t&WG@ʩMτԏR> !6(xl;9uZ0LRØ&_bWեW%gA~KscY.%AA$QjR5d4Bɢ0%b08 i~;ݏXhYUz퓃3HNMxwd(z4 f3 z(asˀO\{j#u9;sĚcTÝߑ]0"E5[O1?V }bX@>:m;PϦL!E^)7N\ƴ%7R$&_Y!6i_ىCvN Ex.0hgoqL`j?[(ȗ'#̃ hrz~DrDN풽W(BNðқP,F^]\b4'InEq<3+t6p ~iHN}Kܗ%r:)b߈O8#S*n[ncapbQ ?GZJGPH%L&]](u?2Ckxluw>h foOH/+wىN'Jr>sn cLi=ηOWYCDk7AbG; $t*:`D#+]MwR}0ne~WeN2\X}ds[ĊPwzS%kp9ߑFMD6GQ'YG<L00Tg]⤇vdF<·y^}UcF`,kcU9k3`|2cP=MԽ3yK=!J%,I3 ,XcgQ \,5ݸ<:#pRkLE}>;2[+an Blgpcӌ^TMNmv%*O=h3- z'6ߺ~IܣufyIX:|̥cb\MkPՕ<T-4`r_Pq@=S7gml4D '1Kgѩ6,r6E'r%ДD1wIEVo QrW g2'LH#I67tG5ORkRT+u \\a/ ,aptI=H߃bJ:wOsIE\_Z/|z1-3\Elͺ'2o7tp|1 D;iŖdFGF)X wssFo ?u`w{5D ^/- Z9j!럕PB$GaTV'F)t!_+d)1^9 Ge$Ն9 (l/ң@*W80pj;l?8 9bґHNـ6zǛpA]9+ A6MCMLMgi|㠢f$,3%y [K͗juhgՓ2dxXeޢFR5?܂柅>ǂilp]ۉ)]lVtEnr`^d5v١(D|n?sx!~0b3c~!=,.?J njqp^=޲oM" weZS4)ӀN{0Y¥h!HC}5 dg6,[˅E KnA+Aq'>R.Fm(^Բr*d9xlDpȸLp)f~]Y*.$-Y:>d0bL KȢP*R|xVQ k_FWD7 ͌ik^/@Gs)gXTӞ_~[HA)k#`Eㄲyz] ?Z?5*.׌^29+M} PW)W;-bUƢTa&܏51'̰YM `y6+N'3ޟrx_R;R8ѺЋ挈pL`UȐ]/iD P7&0[妢8jZ5G $]0l\|p<#bTmJ'&%%,pE#}K g%꾶_:k ɗmʫ3ń.%)8}lϵZZߩ-62(lZH|3Rkc 8,{HI]RKDP02Q햚d˕Ւ _lN&(M]}k9Ͷ,Fx-k# RE8{ S#)9-6QETT>sI: l\Lyvtp7&rEP]^KP)Ȧ?Rⷽe_mv[î}&s!8Ʀ W\c٨y+ljipAgom,`~݋@TuwįWP}bxVR Z&^hE6`VEie5Ƣ\ڞޣ`Iw `4J_DKTX.+4HiYmƻnnc_rG>l\z8WLd*G?z8Wle+ߖK%@}TVnE~PRiu+:CBܥweO ((t7iՒϴם&\bz =˃/kjD2r"]A~Y ]WuR U/ F(BT ^:D@jތZ'-н7^W LX"$/5@H޵xYo-fŐ1'8U^żӟcс!6S)a+P391ŏw矒y0:I4L8\9u:iI3O;kTpJ>6`" c0OoO΃rn%tVBe]$Ձ|ͪ`~wh9;!!J Zd 1"Eo'YANc>ƢX0_>08s#KVQ4rZN*(r͚ڰS65`Z+17K yM&+tJ&"jE~&`4O;@5Zn Bis2&:F;?wXٸgZRl{YLhMYiLՏH5׻ޣ<.Y;.=ҭ&Un."aHuf9`K\C.JTtF paMT ߂ Dii~qc]cglb97Ei;l6mmzS[U-?!@ũ(2 uܥb {3jO>⏬21I͠芧=z*,:`秡Tz,7'DҐ{l;+((d3@b`"$H <"+Kx|wnU*3ܳ t`%cMB<(79.}se/k1؇253$(zkgMba\@䴺ݯ\Lp&yՕ8f&#kT0~dh)!^w!WQ#"j +<1c0q~KIFbڅ)~~wq!7EKZcX >Xޟ"CCYïDgOᄰ=.rȶPE 7-LUqZlumo5k],sg=NW5!}8¨Nz1@<)CYFg1Σ@-}:T^*{yS .RJi -TvZnfvqc[?pmq>D1S]e/)qs2}3 ̰XxuL|2섐F)HkRutE7Iu`k &j^s=*T4(WuI⃿}`ATti@&=6`1VJ\3x@hdt̐a^]ڔ) SzjMۯj,Ɉ7* =xm4 XspgƱ\/F4DBkzukyn7ot)hտ+mnBpUKoe.nT&{@BeU؏Bcs6D$`Mb 1'xELqb 3O猇#ZûJ_yO/Z_ ys7tJgzw X']ԝIw (^90r7'g7OOB .4#;'lW.sy?IziH"ٯbC3OK3)j( ѓ)`n& (r;3L]j 8[>m3W3$ Z\PhYQ0Ǘ7ayP\ZMߤ8pU"AskBl A( /'kXTs4E `1,R?Q-":F!k*s*BUu2M8>jغD ՈD0Oz<7 Ĉ5x/UӋ@۝yx0N: pձJ,[Sd?iu5rFm%l2:~I9}k?J7> j#hdpDxCzSPؔg6h#We DUDFoi9FCPb>jj%&aۊ#$xmW,WsVxahGZnnܟ dhatah~Pz &dC<|IFms {NtK6Ae~dz_jN“-kNJWa8nZ4V^uœbz ,Q'K`0KbtU|2٥=D`O_zUh#vEӚ1px|u"uCTZK!g0r+")D+"p΢Ygefl1{Z!G*uC&`ik|>v 8}s.`s1 $E`?x5uo#UހW5ŜO.J9 &yes߼@ AV6WI@w c :*a[gc\ ҫ+Aexu1v嘐V}xߍTܭa^tD @"(.JܝZ_xh3.8ke+~w! GHEq-n1[DmltDg.318Po ˆIGO:Y e,՛JT?pXK68ʦ)9.^7]+HP>8;9ՃaOK){_+8,vþ38ߌm֤qj|^6̻~y>kȴ_z~Ӑ9mٞQYH@Uү(-.Vd)#u"(˔0 ce̳bVRy@˺ .rv^­~}°Cu^,*!9֜lL?6M)6r|؜ V=^w*_bP8: x@_arBՓ76N?|2-%#ef3OaY$O`k{)^Őq(YQgkS'^UOUpnm~rz\Ck2w>o*(c f3#K!$N! hG _S70A7b7yG?(3 E3+v4=!o,R2CZ`6qb`z"ͭuk}c.%oɉ* ,k7᝼87]2}E şjɹW>̝4lAPO!/]1=S9\hMk֬O?WqlMQm f^|ǧ` ;$hO88?GoNBU݋ĿY]i1Ju :xN9ڐH4^/sZѴyN\oQV*q! "-~bq{-=bǑZmFKk` abe)L$U*0U4u;h'Mo /HTI{+C%SL7~uU9X|ցX%q2wU3ōm!r09Moo#my∠[ k1 ͷ0 qIl>뾅 O3?tF)eO,g(LǴƔave"JtPnvl ZznKyG+;4e8EG2PRL};qb4fޢ+^QKAۓٓ!=p4#lnb9Q,J;2XvQtl >Z 2eߤ  aQq7S#}EwS vmB\7=g; @8ͼ_m8D}ϓ\I𕃌҅vejiQUr8S\ Eظϣ0S* pޜ V)k6y \*1ͺ;>&ދف"j~iBA 6㛄înup"{."{xHB4ތ຃br %)ǩI.#t7#yI-rdQ 8ԸuOm@U%vl7KeK{:r_3'EGˢ;^w  R_'pR ~G1)&ƛFiS lO, <>9.)ɡnuHtg> ,7ѐ:2F׶wsXaBn %s9*}0VޑuBW]ϙP^[n @E]Cehe<ش^9ЄԮaRɏ e:G Ծٔz)+CL/p_pOb/Fv> 9\52 Zcb8OCi;9eU+Q0!_CrиF0A僚la嘼^_WmlNTDvGX(!2/ øm`}.rY:VV4+Io!A/5t>l~ g1cpӣ7DiR{=1g2!߀,j}譫&ZVVժD:ˎ=xWP:tEqkI-͡S(u#i\'{_P-rNwm>+|_t zDb(UF%eb'Sp*A>y{ |66W^=ɍF c֣ҭi` o<ɗ[IC{AW"Xi3sJ8uAPFdl}ëP>Q'sFdSY+o㻅P Agm]ri$dt6/PM- ]Xaslvu-*àCrj__ ^WaW ˩W6nH {gKE <ٗf53goMj8B[)[RjЉYUfd˯Q'x=y`.kic;; {ꗟB %5JM;̢O?Ȑflb6mAu|Z_l.L${^o0Efa(qs!ȷM-:ƞ;q& ڲ5(Cg!=P(I%ߥy~7FO'IBD~ jڍf7%xa֘UasoDQʙZO(J-.s=)P8IӅrbj: ME!JwQ 2 6`pG+ YU j~l}3aP{f $ȫ%*Myb]̷A#DgL c6I xK/JמV&&xї.},P/B'Z| #[cqJjv޿~}nAbX1\y3>@!,R9,&0LLܨ!#+~@CQw#o Ȉ,=OY|)>Ip I-pScdpZ@ÌDƿ{C>r5*-^"?(J'_ 0ZvsD沌}.+Sm/r5aʪnrLuChzbjY8}eO{Y\_"e)&eȰP5bmKcrֽɿ O\WW;1fiBJ92NrD'7hCTmLs8y9Y(vOO\ V_xsM0bka?Z{a, gВW7ҁt?O-B'swkFfɒwOh~;hs}x cuns!SW]xҪšZV9*sm9Epr4(}x<CHhdmLd+"|\ѻ4 \xD?xj{*&"3U/ 6]#PD/ԚFhH"׶ݨl,46i|NlΣL wbr Pt*vsVDזXvY]+{ T.tpխYbaN76fX L\DYAj(Z(ȟJj0eTtK-n 3! ֯fIu}2aQu _!/"@>+{zfq79LOmo?]ln^C=X|ju?i=3 ao2L~0YRzP:}" SHr]&nK~blRajQ1iگR68LgE"՚XBi] =|ZSyx7]AEmi@vB.oݨmlH.c'vY)`ާ{vJޮwяUlI9PÈh,/32|9dOT`;E00`i9Ʊn c=yIQPKW*hYM'| #J[ PXIOp=ۭ*=cV6\o|I"c6"?hP,GMQh&%i)^A{r@aD6u!gЮ`'8IsiNto18IY)u.h-!vfJsF !sA2òmy[#j 0W"5̌}uUtN=}P(a轚IPuɎW.zT~5*a>X055M'C$= ;%ENk|5*\օir,II./Z x93VqLY'Gj@fȗwV n`>K'ut.I=|Rme\*M?4w]3Me)6r݄tv kVD2}n Y +U5Ȕ:copL|` C ,{lzLtFhSkVhq*:Ԁ^pB1כIDl/UK!o!]%Q}z7D7axҸ!3ZR J`= kl%HE8L ӣ]{8[֍жJUt;g05P?2ߖN#nP]Q`amٶ&| 5A_D_ygy Jo9x&5-&vm3꧇:s|!pPg?a[f\vĉukZbNn2Pr$ؒ3a< ,A V:p}u l$dF{Q_s4?.3GI#˷z}|m->'C&'OjP- P]- Wك  +84hkOpppΤI>rPE7 p#Wؾp?*E٫[g6>#Y_4 L@=f} -A]@EYuIWM`?(t:ki1-x{a2f6̱N邂޾4#Y]a?I16 *LɊiϸ_׽'GʴiڑDOufԁ`Q|[{2.SY/!V[/.4v!kKMT?_c5N4,<Ah A9h`ȲFQE:>tk w1Ç_˧2$˯*!M{q.~JKɦA="g3|}ء^;x*㷃Ys%czY'ͳ4Cś¢{ '1ni/ZB7 }0X@'RF7 <+VAG$Q풭BxA¸|bFlH>Y<BlecPKtk `X}Z5Hm׫˽_MŲlv5~\ Ȍ8Ƌ+ 5ܼN,b %y}( v}N7p%@yZ7SHmtGF؞m9~ j1<쇲DANzY\Aȣ3u`ONmV4Q<9^}ap7aiۅ(W*Q?no#x-w_{ף7~gw^'!CdCRM:| )MruDQl-Q5Ty2QWY{ME<\1;)(+3b 58W1P.ž`PNyWoO ]X˶TX{ﱬjDXD2l.{*m'٘p&0rvew{:K a| 7dJ1%ӫZà>/edc0V=|:Z DYT 7]>-!DRypbA'.IOBxɧ3c+~f7 q̕޳zwh7A!<^qNyHLOBG-;Ϊ$U(v۬Hȁ|#Y(lja.]EvZ =F\r vkwitؗ<6S$"/f9MyL\XT|BD 5yq|cȺJl??2).?LVUKǹKrqg,vQm>5nwAl ֙ ]so[R*C$H[bOT}x# _q##{|}qqk@7\ T]wtR%?F^|1Ŷ6L/"[,N!'J)H, te袖^(|k:|Sm~,3p;AF (b:kԈV#tmIK%6^gļ~`gB _P Y9S =2CNߓH$k:@Zdh6 spQ{Zk7Ӆg 9;V%Ɣ[.BɄQ]3EjI 6AQm +с^sFjk(92^[!}̜׏@t^*usXmoD}kOd 0;jQG[plgb2TZ4"6<2$ޫ)ȿWvyzz{ˠÁS3tΉ{2FGB_a>,&\yDh_nS A|8} ~2W.#1kA o AI3aׂ3 &I&݊ F§JH+iaJ]2) Xלa`Џ(ʖ|Jya8jJni!{.x5yGҩ~2o+H2T1֨H3ӻ?nod,j]}ߤlKc>G޳Wƙ Pm13r{|庤ŲL>PL}^;' +ד xfT坓`<;D炗qBEoDn<} a.Z,Me f66z1C% BZP Ж?PJ!ś!ucw >Jt[*'CMWD )yt"nlAǼ>X4>9`g)3z`u{-k\`ꨔX#$3-G%s=@i( `A?rH`x)}t/YDQ)R+UOLr/+8rjR,ў}yZF$MlEIlw.(bn!Al;|6Gz*3+iqs`.+ԇ)P1Sp$nl:kvc+b`*Of .R_LB"_SlN _EO,AƜƷCd)^Z V:wZgz(c sAoazFP98A~Cg~,ϩ,m~>1ao}Fj;&E.G8jSoze&std=F=̌R(et=7 6L{sRя#$1/[ᬹ=pȱFCq$m?SDBWLi\~dx]spunR1UNduD_6r(%5S@vV  ~ƦjFL)ppO >]MaH_ _MqJ5 syKx/ 3:ǐ3JU:)gX\H^ y;Cٝ3(@&SxW&M>Ǘ _iI-}yaݍBk*. E.k$ck~@h}\*-=œuOx+IOb&T4k"Tzv!S!|-ոxo?_q|{13C,JeJ9qگԸ,k*q-=5*]Yjȫyjr-AK|P{$g`/ m Ǫa,^98oK=}]df-?qC`5Vyʎ7$bSd݄γ\*XLG?"1Uh'.E7EulcwX,\ܫ?Bx!)tô{kݐ)fDМ^$}LhU|V탯{Κ}9%GҎgs&3r c$%#n~T:^YU~Vޟy#[dŎ+(us`d3nߨ4Z2fAUoޮr*D۸[H#2R9Ԑ˴2'gzXeP֑A]qSYЧXٌhxv:憨tSmճѧw@ \8X!}ݕ ˻mgmYk+&$sX϶6#f{f;q+SO ~`=@hpN!vgWu֥0kJ[B\<=6;wHI j9n] ڕznGoa\֏ h.rd'ӼA}.9#|7wS\=i-˂BY a-IP\(z^<[]g}K[ `Y[؝.a` AEqӄqdsYe{8QbUYg&׵Wv0jNT&tRqg jR,ϋZ5bJab(Iʮ9!+6c:B;- Jz9ϏH #7DzO[̳dҖ~)d He1M4#TWѠ7Q-+/m΄VPѸc.qBۅJ|҄Ym;,Oh Pf Nr _(x# xb/ ?a4'&jHj X0hɓ*$'T"S<!gfJzcDz[g$m8 2]d 9Su0_&$v [ysZR}ZQ`Y8!ՠsvLwRgii<~jߥJ_Kn')u f"ItgYz@1[salh5?`v4{~~ x;7 $^hlïcT<o&8B{l:,>dc+BB4h>Me_'9\27{`A>jԎC)܉KX|*s/b34ZrP+Dn]b&)Si K\ $<oqoR7e x\W#h NE a^/EnLm}4.x|y#SPi>8&!$Ki?|9how^(#od!gbs˹> @[ID ̗Vs/FwZ"*(-Y+oU]bǀC8 d2=Kx+GM]fT =  W;ѨλavxK *o5X >}z!=v?wxQxy~inó]{<`|[^u)b@@W۟U _P]-H\  ݀^ >n\MhPw5y)4\-KC>',gVUaCJ`2YGTᒄvt vLe!Y/GEId <[&Aby0 EߎPnslЀXGHZV ;3'/j.3 RzCܞ@\Dv&R0W&CXL5ʚ_[% (p#c_@JZ ;/ˍTdSUgIRE几-Cl5'(lO,edV&R-9.ΦzaĕB>Ԁۘ:[5gdb1_-mkE,E @۰ݲ(X[q':IКQCwYwz3|\"ؚ#W0ֈ,1q[[\2kNO#՗s:dD'`fqk3` A]8G]5UMEgl;:QMh)<]E\&sѭX`Е4!h: NݯqSG8]ӷh&OXolWam~ #8]f[huFqQ P# j@z<|Q& Jk7vEO 7H^gQ˚ NԵWo RL!<q2#ۣ /S)fdV2|\#DQ&ܛI[Ӽ.^M=vȦK+$OJ@/ t`bTH{t֊j!A,.7g6Z*!@rbH ӓ~H?;a_.6TC1SLi& Z 0C;Z2xP#)¡.q5\S<ܦɟ^/4U:e p-+@993| ΀֖s.y"FR (-5#Y,r o`rlmNjbx~|Yf Eu=D>[EVON`* q P"=KhFWks4*aeަ4fE tJHqB&JPasvX#8s<0Ђ{9J"- e~oʑyqb_ђ ;U]0Wjψ砻`[?ihC}`wQ)e_kdsA9Yjۜ*& 8ȕD,Ez+:Fù^S|k٪fhfn(a-;3PS&[BPk6}o?p&D*ɿ9nN/yVN:j4_Ɖtwbc. Ԩt*m-9?SO+O*!Თ؟a>Nݐ#3SMiSH&9lbiQCvj!aYaW0oͭYZ ڥJ{).QᆥN Ěp j^ȕOF5hK1Bۓ`@'GueR9U?d }U!B6o%ϹLPٛvRLsf)Č%y>yYVF7G|CH # b@ SOlk6,omgEnEDK|6 )`L!LM416xy&ɫ~KJ HL\Qx;92XMa3e-I]-u~,᧭f]Yd)'QW4I(.I5aZyJ !Jך~a*}V*`6j+'P3$3Q*Z?dATWy< ^vmȷRym z$w~|: iqJWzirIҞHFEea`PnnZ:%'jښvoVoGql<2z[4K -ޯf5#'8^gEٯd|c>$b(=B}AZ5loIga'--bV&?˄VYm9]u!?T0Lp~KD2M;n#BFADnUl#UfWh³2ƢEc$͌yRX/xxW~' |t] gRh{ưw~CqnΓ% B\ 89-cn Ǣ߉m˷5e 8y|8^@1kЃqBQkR>G⸦j)N˗JKLv%t_FgPX _I(dتݎ+b9{VfrωݯrpFoN 4X}CrN#_{=+͇mj2+7^" B<nXȊW+cQCbġ9` ƤG<|fx/|[*Fw)a\| MwNR&}OEvt_&hJ deF\ s)I䒡`p>Qbq`yG_^,'rL7&t@ړAsH嬄O-`$xhfC*2{$eVztIfn.L0yEk; F0l}tElhlҾ"FX.݁[U-,+Hjl0ԭֶ͈-;/s_=$H"U2UfUYE@DAypO]m2UT N>b(P<=$IYRQ<ɧD]RFɥO㰵&x2"`!0>4-_^UІ[_*D'xY=NyB@e8oh>+h`jpކ;IV׿rMlT`+ηyUlviHFFE}&j6DGK+N?m!Gn_x )\He#&>Kk (8Ҩ8㕭[[^R랊)Qm؏mEM`}X8Ysk6P*8O.@`]qZ{/\}^%KV4 f<vlʨf*-(҆Y֟jg˼- ggOY(GA Ւ͡m ޹ٍa3)M"{RΥBbUA8s>aQCGȒ3_@M*NcprhHa*5n}w˥Fdvyˀ^1+y9 ] rq)}ַER㟲9Ic#k1}wQmʂo ݑZ_7WO%t!t: [7^|kI1Lae§0X^`O># ٠At, <BJ]#yˆf$ tg D|h~ڿVcrơUljZutQIYa>5j+?h(1pCIp./@B?c ?~+PmvҎlStJW q(< QD<3+~HζɱxiH{-zu3O4(o\p0mR]pZtO5exD>E*S2 w[6,")7Pٿ$̵Q)g- fBXXfvrz2Ll/5Gxٹw-O|j9a-?I, zΌWb)h7lML^Jf?| zokpfS5?daWoiJԭٲtoQQ# BE"XXS"Gի|g?Ӌovlɀ+O%֩Tpț@;3=?(/d yDdm":r^7PoTjx~NFb>!G>zvꎖF%1KICy'D!v9d2_ U"xSmUCRr`=j+,,# /+ލy&tE@F?ƭLV]kbG ^vXdSIe>`G$3*$3̶$íb]Ɖ"V+fF*ʎ ClwtknXf47 @9%; D%sgbq)xRnYuiYd4@7ZSBE8C[ڎ3l6jK.q匕mٿ#wP+TtC §wS_I{%wzu&,VA3%BAW\'C`IatüᨶdmaGq=!p7 gM5pNK4*K:e2[\`X O*ŕ<=,`aTK-'9V6p ^ܠq l0Q <z\VǍ2(iZnjgb3͚WuK{@f|iZ_b8HaaL4p{[a209pkn ,V9FDIstw$z.b)n ;_.;CՓTLe G3 9Lm.-舔B4}8ֺS yi}v/u*A-$pY=.3Xci9/xBѦCtM+(8O4guOr8hi5{ECB&`^ȇڙy0#zvV-~сe{)% j/Q,g28'e@Dr˻۹VG^9mt8ReY|16n2 rzNxhQ o6m`6ݘM繫 RM@e3 qڒ=6ϰR_+Zu|]@t ۢw=p^ Bcw  N%S5ԙV"R,r2*Y252̄6&`ZYA7y}5XjX=`7, 3"R%@E$ -@?sr7Huwndj乄.$<~ ,J3 pLj~^eEsGgzDerdΔʏWT"MS1m_pYfqsXmBk-!tp2vQ }V]̱E >O=ߘr׸'"UKJKx/;DM𺄾hM\)Tm]g+M 5"fi=F, uTaᲭv9g:k1?mVb32:e3Еe?`׀4BUgJƮH(IH8z56 k?F9G[A)6L~_;PimH:Rr]B/ۅBBnLВKt;,+$Iذk$wtG&F1sB߽Ng( tB_^*=[ ~Yc<$l[%`C1z b;d;2E~qf̢D[m[xlW o߷,ƻÜk+ȃӆ$ A %!`%Y뮀x*f;bzrh.ZeSحfcS,_yg"fU=$h<RqIJ~Wf#a0C&$2cƮ;%Aud 6K@^GZis:*4p}m],Wr oZcр:*vAMȎ=}ѧN)'"@YX ư|0O3t-;nT9dz^>t~g`TdiN_;iyL!DZ5Z ׭@: XAK 3k{U'75^Geδ RsD-#O]a{lY-%pŝ"`l8:뤳&m<Fa h8/瓶fvFE5 ̱EoiI7GQ<]4~wqnv6k+Z#7b ~,N!ifѶ\+l!Jl־Օc^+K.d0ẁ[SbpCF˧o;v1Xb}8'Ef42'X^̰qr>SE'yՉn晤6NtBM˩ RҞ9i7C>&#vjľ.$pYNSq㉇  `j*XtNPA1e!Ƒt# vC{AoS|g |)eo7ť_+&Dʐ:4s؀b$.X* 0 PZ)_p_-p&{p@7,ҩaW1j%2[s憢/ M {y&βl%9\38."#3]秆ch@W؊ Od1sOkrc/Rq6niÀi  (pYNCa6>3u[ơ b5Y98ںډhBCNMsKDz9뺐Wt`9j퉈Ĝ3G .v$ >IoH4#Ͻ Ⱦ,EDS h^ f!J trt$XQ{J ~_Q$D HNüFu_,JWtBnV?ݳ5=c' 'tR=lHʢA\2^-.ji3rw!![zdm~4^KaT:ض6hAX*9"$jO 6 rZ<{dIӤZ 45=) ,l011 sIR3wr48g|h ׭W:@;Ia ꛚB ۻh6vݎ?o9G1mEk(>!;Ϳ!=AeG&xi?ĉC.zj XFTIPGJr0䔧hJ?y5<0者n4 ~%[Ip[n>h(Gw͸~ATO)LyP%(O'JK7#'L/- Hl?T0w^ Zԯ+1V[EKҨ}'u\{3.l`?bmx1D:8j^ٺCHBs¢m,_g9a )c^zlXU0TKR4oXհʀYFxaŢĥg2R Ć웫XC3wLﳍZlBD-C5YWpE=#JkU–9$CnA^O#]z6&xp&c?? XsK gW4ਂn =78F)ꤗ1 Mr#vf5$uggtD?#1OMc vJ Ƽ,E7_FD2w] ԣyVJa:lTH '{9a=)^[ԻT>k1Ye=dy!]S8S%,jۣjqfLihyͶ!1Re>1ݥNN6P՜xa?@y!Cyi@k&g+x{G*Tղ*|H@?VRQG9S)VSn$\(/EP3u6j3xKۯmDnMz3ªchk΃blpa,Q:y >-aU8__tdnFEO< Ĺ b qt&GgPJRˢ# ,NF^])o[lr\=q_ 813"Y!QR=R2>6B_S1ܬ? mcLܰy 鳛/Kˡcçc+Zs g!hN- dv <^AE°K\Uv6nt "yd63yaMž԰y86&Sś$ nb<_&w&& 3 e>RM@4@?y="?n3˴*PTl[ﳳ'Mނ^Qe(Lwʾju֗%{ᶁqX7 Gוw![3HI#t*r% f;X>f0Km{upb7#ASʥ:ȋoX.l"9D3g7hD(p[D"cٸ3hF95@E05aW)Io?PqeȯsepwCnrw (e~ 2UE(ZIR˂g_Oqg-Hi(OvF'!ab4R5wUgu3c9k~ZFL[O2XD;fWP_`Yޞ:Ik\yӇcILc r:"Sv2f>-d!f|dYPm-ac gu~d^\:= QA6j}z*JW*ȗcyҺMX8M2Y2%E&/>Yf;R& rEÝ^!PLHfT9IrhVKTҸ dJv2 4(@<La6^[*mz@Ǖy𱼢L^% GԌ #FɣGœ N *,+ues1W4Νk gHٲjo͇ - ոh*%veHuVc$ZM)K_h_<#&gz ekɵ]Z4.hrU'tp{!@}za[>s ~^U$պyFB*~zXB~)SW -VAe[ix=u@DqjimU}1{ކ}KcǽqWl _ ޭ/>қ=]ZN 0xZsѩ)Y'm9/oK2ǥ!Bw:ȝ?i;89]Ci!8R8qWѐ|H i8teaے=;$ v. pj4aMfx'OoaQgFK NŻ#I!> A*_M?C,tSyj$r㕒W \J9\A~ehiHjZ&[dUpY>ɡ {d1c9G#[Fv.YshQɭ 8F})rfw"V1q>\!A[+uҝ Ewi@zPy+Bm/n ȃ5Iuv4DrT|(0 J37|:#L [Ǯw( J>)~v7vߢ%B/BNr옃yI{ŖZPى^0*(iW6֜*- 7vȾɀE:Sׄ1XT' SEC#/ahو|7zMmY mN1?XUU"bfSw X /)3Ik1TT`&@ v 1f]3*dO¸''QU,m,\1 e:2ۣђBO+|}H#!<^J>KT, 6熠PZߓ7'._ HU@ʹ-7.dd UT880n~of'EԙͫPLQYtxR2Uv#7ЙabF^-N!Gx8;óI"`otqugO'nLt0~Y5ޖw8q6Ѯd7%trJg1Joi[7FWgِ#h`GnA"԰(=ɡ/pW[nR;?"&2XX٥>L&5xq<%p(koV~Ltp67Z$vEpBuvfJ=Ԃ2WL͵,0R6tvȿΗE\igm0L({O6Zη`B!5`oIDeUa?cѢkikqҳiRi6[ԌQo3^RkHB9}ɒ* .U4uZPM-T>I xVs=⽗d$kYoUb48p}ze.Ϗ=GЀ.$-b@^,g[.X:Ο|wm@c{e ͰjcŴ&@YZqJ.T$vm''h,s][ChQ,ݕ~0|Q Xcl  <O3)pX&8K֨yv4dA)7\:| )]xp_ZVc6oF%W6vj0$l uy''s.Kw@4WB|zF_q?+ȟk *NG<4x8i4 ^kYTZ?36R !q{j,fNϳ1EȼBdΜv0F~ADSoި8)Zj ށiaPܐ0Kp|f5v:̀b锯7܊e"-0Uߪ _s姊mB洝*d "c s9QEl_}qS4rSy-HՏ鲂Et}0A ;u{Q2vz\Q$=+m-@ OtiasU8hС 9V:wb=WA~>7؉H1M~t@>MCglkIpxfMr-tc~#8Prx?ڽ*(8{П+2#LHx]T3TorhQBF|QTcPp.'GrKҨ:0 4GF~)AQYɪʠ;-ط\Ŋ,@PT!NFN mTF*`REO ㌰J,W4\xN oډ=&Sao}U ]ᡗ]BdqřLV^M mCIn3nݛ5ߍA{F4Mgtԕ\\,]:b~nӥ9!8clYkP7)|=pG6  l2&e#P!KINehV9۶@d!2J1WSIHaWZC6pzoA) {dN#B1nP>Z< Q%I5D'OW`%Q 594jE]m?-M}dz65x`/M'y,Єkr??Pنê PV#>& N'~B1}#;H4=QF{n+V"#vgJ3פ!D٭ l+{GwvvcZu U "&yY-M58pA0~adAikO/+$N*^r/ۘ vLG4|S)T$\;r+hrK&:@Ǹ> {: ^}zlUn̑+]]laCEo8&9טg~wUY!{Z=VnWT:@KxjT:`bW^k(tT`f1ëo:;G-:F V\WtӕpX+fzQlpR#[ywZǬܖ0 7{Z 5;4b@1UN.U9wɁ;[IǃQBO_-u=F~< 2˟g* *-i<3)]~;k.7@t|Vڨ1С뛐/ZWWjaP>LoUkތ?وs6KN&m3z/air=xTikGe6NMEz U.Jdgi~d@5pݱI#|䄍EP|E%^J#Fi%K5Mj7ZGbqk3KJpstUyv B-7!>#dýZyT=j};,vdyk0tPv02O</J=?n {Z6h"o($h2fie$Ifro=KN.Wp_ҞL~;'qDdODE$\RڣnEAp$XO_\ơMɛתX #=o L ^Nr PV2/JnKvGL"Ğt>G_HycY$n㏘ʊ#ÅRC6Hԇjdh#qZ.3T]EYHRAVq ⚘$6Q Aќ}[rsNVBmDt sp%f8YI-/*q]fƨSv a6=Q*Y|LRi cQ(^HAJ+ V,,f_$;OCiRbHF.Nd|4Ҭ_| XV}*6m$dU{ߟK%/UɕDIH&8kf:S#9!A'1z3J4zި774<F_Tڠ$'0g, sr JPUi0<f d=$fo+>O3.G{~E.?}=GCz ur6/@P5甊;xӺJr<FD-ȒRN[,ζ@]n#@!tWoX4h,BaŠbT:*vN/m /EŤ<>:"vcI Gj,q&cOD;`7ƽ(c'v9:w>&j‚aVul#OOP0}KEsTkfBah<0|Q><Oa[W,SxlUky^ژE Wy,K47~qŝ=s%ȓRVJZÏ3 s7##*!3ݷu8PQCqXdƬmqCQ XlSJ= ߯m8lE/Ǻi]hXT9țe ʹhXQr"cځ[ ۚn&%587|GN^iwWw8(͸z_Uqd!%.@^SkL&Y8PBx۫/dиF^suރn&vnl[(t:",ك$ KuIP11M 2AdcӤOzFqTq(Eyos(f]m&2'EmgKF@\<gb rZM1>ܬ0{e`|_d5ψ;ܴ.Xɱ_j aB.B- fJz94~%.E OT?dj%pu8{Z u9mxN+ ?{?_# جp@>?{V2.9/埠7P]qXdh8Η!dѵM~o0gXW6Yygi挾: :\Pډ嗕dګ_Gr>;i01bF_&n_ˋ*9` ^s:[XdT!KzT1)ݼ406b[ WsmzEo04}ri-l{ՙލʼn)6\`LzXF=#ZFF+9$?T-`^fip%j,n'<BX+_*ɏᔞC"]cӟ1#՞¬dӆSoe<5%ߊFa.%ѥȏ݇{F Ƅ LXeMs೬E2Ky }QjK(V ףn,9|'yS%X Zt0Vdғl^[ (^@:辶j Y|;^C+F'2*orH ՘G2C<[?\Ҡ$*s4估$v2iTRgGDBm$rek #WQћ+=jIl YeJ3A̓"'Y⡌1&}7^I+S 'P޺4O\(P ZQ=qH־!]yx.Jlh0Ȳ L.8Vi5v&ׯ!W'4#*^mL$u&g_E;fLՔ(M|AjvnALq 3߿-$=GXPE Q8BnD)% REu`'éc)qf< NYE"]шV_*uj# Ӎh/T*̍֍Ft˹>N&cR7 {. ˄\۔^g\3#/B}p1- 9qCrCX`\8r粳͆y/*:< 7 )8]50$0Y~{6K0Ndծ#\`/oL@Lt w9MAVב+0=N'Yq{([:-_0?ګVټ dUz~DAͥ- FJ0ݩ:H +>cF"/̾dDF% %h5)4ۗ+HF=+-nWXww&Q8+AVB5u{CpvJ{Fy|'~ExeCWa)3s?‹I*u`4606V)+WW;%K#03YeI UVnŠibmvS-iggSZC,o Jۼ{XuOc&RFf<~T+'6̫Nt yTGi &W-H-c]@AK*BeѸ#7 Y@FI.Z'Ru>E1tymV] [< +I,:˛p3o=Nq*X?S[ˮG#%dl*h9ƽVT2k]qD7G.86H{6 cުAb( W~S_el3t (B]%6=AoNM%+ۊ13ѐ=6,۷͂ϷȀ)xnV^2v!@2_^KˀEBeȚ1k4Js?8ڱߘfO#N ύ?EM;R[RUBwޑ#(o LhqvxX<5!ݕ8. p̿Zi7",kc8] CK+FCs<=auVz%~no8IFV)-:W߷;2w?a;K~ۙJߵR1iZr]( 0]А32$qHPDuU9gPv{ZOeN CCI #Y'ܘ ]+FMJ8O ӍIO+=g| q "'[i^mLy5 V ]lF=H]? (9妪V0u1Lʖ>ⅿP2DXvQ^Ċ2WLN15ԎfpT i "m-gs6W1_Ҩ5P,rGCdKJIg96 ҕ(OiZ l]Wc=YuK1⒜O @fNc+,*G"Q%`K#R`M;xqd(fܸ)!ᨁapczIPf2<3kyiDBCgṋYd106۔XtoʼnwW[}SclKz*µ$)Y$9 bd~LO]ԌJ3k2~.PDkUE& !^NCbJw^?@É~"E80ϑ?ΑA^`3m<)Cl{5j\BGFUE7)6TrBv3.9QU@=A$`7 MK[GH,6N^SWI1ݙ͸=ƨX/^c'rP8&fxQJ6+ P݋#7``QF? Aͅlgw(S=z{"'W%5+{SojOJi48e;BꃃjG\%X 5Ay6uJ`n! ( W&|I<hO/6_CЃ3#lYafՀJ8A&,; 'tmI%8m^5K5cH>P+4𑌐hAI=ԓz&=%X#RrMb{ƅ4.ܡ\R0 a)4لnRaq˜wKdRԞl֓aSKY2e!(-TW \pc9!u+3Q> Ft&-\!}LYf-p$y>)UuTxY 禾vѤ,tDy~"݌v܆W>]J\b/ȅV.Ñ{^0)Yn&g[NHE\2HCZEuN6`F[AwqG%y7y\Ԑxv@QJ[bc=YY궫T ä$@Mp qܩH+jr 8aW(%6O4_<a4z[턤,gG('GBއ!OPesE{I\bP$8%F1ȰGt"DJelZK3vڴЭ:X8֫~?vl9O;W}Av  º@ +7dJɌ2*qHVf|]ᅣÌ LU v{:&$Q6tvSFI>7Ţtq$=_$^T,cGF˪P=Z+JY _CW%}yi-$|,"98JPtpB$e}qe%?"Ng=a[ tOԯyo92mf(-6zkA9E'jE'ɔn!2Qfqj+CIi)垀;%{H7 =2]sBfVqq]pCBHnU9p>B]ȐsX#"#9ly؛z3b}F7VAzUw?ȣKkCGII+qB75t-%8ҦOhwju,2P=vhFR\D8YM+UH6: /{zF|RnM-36\i9^4 :1lʵV􂭋VHfLﻝX~2UohCg(8”>Ԯ +eԟZ76~E[fGuvvYA=R%怾撪`ll%)!DUԗ^N3kǭkIt+E9YSp;\^f4͊Z)+Mn՚sfkzj`lP" _ˇoῠx~/i' ~Sk% @Z#+=L \JݟPNvW?kݞt1UMX L;fI1WrVHkz 5C8o υ&U*8Np![Ӽ\Ŭfm1ףqbU% Ԗ^n4*sm!?nᣜ*yo.vV# Wh]merl|#)ʕwxř iK8EHuemj5.+1?T}ƣ DI@;*D𼃺/='!sb`=1p^# "ļ'̪郞|#/ʙk6ɻMص3P$K oPL+Pzqqjx֕E_OZoPKSF+dUo LG.`u9NUqh(WBG;i DUukZV3C;QX -ӬS$;c;zIy޲d&, 4X̞gt I3^>DO!AvQ%R "gSٖ_؇Y|" w-N̪ajk@a_l69&yh6у <>B|c$ uT^ľTy00BϔVD#jj;~0uA_.PJ]S Ѱ w43F D(O9P7EjflN쭒}#h@3gl Xƽ:f%W_C ݗ#Ubsl4 bLPq?``xΏFdS1lOIs #uc4R$ȝTC SI@~Y◁)C [u0&#)r *J\xJMѐd [h.]E<힞*B^:\鳕i8Vpɯ\nvkEBĈDp_~Qٗoh8*R XUMma@wj`im|+$48M[t(l)+l}·ȥk+_WfoUâD7|Ǒ P63] nt &+܂+מoJVoiǎ׳#ݤȒh3V|W0G@/[ͺOy|:4aBI2Yl_HUЬC@/7J?g`%L%?+{#W3}^.S%3"x@(+N x>MkkHR3F9*O9>~2?Mj̨wSOdPLri8O IXS{8ޘjQF.8WS_1ٻ{C/[8(28|ҿR'w5V;ÌLxWUu1@׏+lLՓ0RŁW)Gq;b78VGMVߧWG8Wh_vd՞6-MQLIMYGPI3# ~36v *Tꫵd/ykZfo!nFbU'QR%MSC_/``tͫͻQKb #ڧaS`A7yToEk̢Ȋ^yuI{5 !@ˏ b O]׆@- A Ӽe9wc*-[c3-n8*B\#֌+@ON!qN'ډ8|&]bdlWXIH(*7 2Fd/< x08C~:=Sw TeKe̓r|ҀGni{ls AzB;cu%]wiF7IC w-Zg [ >{pmij P, YV4H)=}ޕX`Inv\#mT@A+dy,/;3 YΎ;"+E/PG 4 \}pD4:psi'o('Pf!ʷ INpAEګ*q^<% SvmrB3h  pN;.! <~o'pꨞ*aI)?Eb:) [3)+B~USN7*?{qxݞYDv)8z[R`O2 qVhʉ1ޘ{IdUfXsM*ϧ5Q9{ΐ8O cn3j7vΏhYcevJd0E:f8 ^i {,ﶭ pgM<6AVr$dX3\qU`b ?/1)ԝxy4XH:s_bBնrz` RuMՎ}*?kr) "wY-T!rhO38cO3P;%ĽT\M y6#g֟p%SAy3(ӳYu|Xިd{ś5Ļ"-t)VuaTx0I SHa, 3E:݈RB gVQFr7hMbWsw0+f֩`-d6SfzB0fC1Qc<ߊ4V5M^< pB@(_ZHc !q~ ݡ%a($;{/!# b7FzFQY$m8v쵮㓯Ȫ{l# h\A4b?$8 >;Тe+*/}i.OfF787!Tc>Ѯ ;X*'Gf_x9`ٌ(ygU;?#ee:?xO!قTEkk_ܫr$~WJEƃ90؄%o/D,=nrsz+?E e#.[Xk6}Ⱥz(#u6wzOԱٛT1NnɟPZOB A yZɄk/x$e،wKPCW2mu љ.c "0;i~Ҧ:͚G/NZ\{Y.@n.A` o/q6(g/ 2 4EeU^ 'e6+dGYrS+K }$tS[j׀X! ^Glly< V1W|P}Q3ڔfi-nB{ Fz8ǖ7&DrL>/C#Dd暈]Mr.J}mw^I7hmF7~8z|%lK+̙U3KaA#̱b I%- u.iev 0ؽ^Qʱ~y!3r0+sjpsbnM"&KޑՆ &{q x뙐lȾ{Lndls's{aw J``kbgK\*H.K,C jytoXjVr/ZeffWS2eTٮrOBc}C#D*z#5Rѩ;°nmJvD!+rM\aEdr7wˎ> -LaG"ȟhQz'Jsz-bl=asPc|OEI҈ dS!S L ! dP'ίKw:Y,- !X]Bo(@0%܎*״S+'\j.s85P-Ï.ݍ Ko?*6r=&KXˍ&e҉ (X75 eF5g>FQޯMC4moIP0∱y+9>"44Yb 2SAH8tKgfZ}kZK+Dݪ1Q ^fO4Ol&!4;V a(T (0n93 a[Ӳ+zUbGd\fwc@5DYahB|YjKs;U7m 4\-|C<{gP{au{0Y͑PM&S [i9sµ>X ңK@,yyM\xU$ɏ e9驏=,F V&s̸TrQf* ՋYuՕ1RHdu"ƼM"^4?=^Ai*iܓl:'^ne %fR1^Zwp δvs4?O0wkjbO>SF6/?&,Myoml8 zРʞmLY]DQ@ژ9OioߝMEj'#,̕ud%n^uLqV FzmhS9DD`'tʍo_,g5}E5|5Ei cg%+=Ho Fi ,I>~maMr(eOV^TJAGZnjt1TPhbO5Ċ^(H9rMG/Js* ͞Q3DGbCM\%H$Ki1jNls(=YJR?YNz1!\ ES'0t 5N6hW}i?w+ {|2nZ1 S%K/uxȶHkikYBft䲌9Δ[yI.I V[sG89K̖B$ Ke][{gnoD9Ѭ K $ eeG.)kuő*,[bx,J:\߀FUi_#P-3 95\h7=Xr 5vYMcbLtj?Θ0oӫ =p1 ?^bFÅ J}_K""cևKoW@bu59N#52[dpb^rHytA&imrs80$/ @sY&H[8Z|(.(0ph<&cSefm˯C"3:`)+OSLFݿB卖 Mo0V-#5fe,r OKAᚻ*.zE|ƃ(r{-2~ a4~:Vn¥* P󙕊ofJ9yA =ox)q ց=v-b|}V|K(/,>Z (sF^f_渴3Q: @ϫ2x0IZG sdp]u ԭϲ4劺P|HY C"p+.PEf?~u*t`08YU&e߁pQV{ 6xJnId\d( ,'&N(~2/Z Ad\T@_c`KxVe2jXay(<'lLwXt;SU슍ZT*c0.2sFVjJ{Ka؃v-O!¼* *cw*(2s&p/΍a;NC0t@W՛R7刕A8V20%DNg1~:45IP\ͫuWgx 7~.<{_wO\|FGZ1 C+oڋj,ii>eGA|O)9Oɢs訴)NRڤ{~z^XPQ A_G\lDy uWg|̇ed伷tf(j . F meVx5şG]Rg^" |ڠX8I&&VOA[rYa8p?]*ppu|᳔a VXfB<2m5%,&=- /nDa{b2B.![NN-8uv$)5{t`W8kuIKJ\zh`tU*]չ Zqˠ jQ[\x.5t ?W `H?zW=l528Y/Bż4Iv0 ECO/4<Ǻ;0u!ܨ=2PFN P$V1Y`XgF9S$Jz{(|I*'Mm'@v "o ˳+BZN}/f^"Fʙ[v=#I *`p>U 81ϤZ$pH:&p1amc L\)F[F+T\-\4D> r< r{wA} ۓ%\e T2' G/LY(=bev֭6xj3Rg,攴dp c8']6^@ڒIJ9}RRf#Z_ I qk #b|{d4?iט|tl2h=I20M~6 ,t#@ >ب瑗d-)t8 4A9 'fCl+_+;vu~gW{D:K{A@%ks+SjmHAj2edic.sm$$K2y vm-q5ʹ@=]?Nb_2nm@J`Bp[u@ -rK%N^ eJUal6o0%أRK>ТyՄ*>!aȤja@ /M7gWO(ӹTCtIT@4t.p Gk. 䭼xaҏx&L_VWuR%sxrbǛGniEZ@wb q EvjHD ({fT2襢t8`0U}qcfQl=xR/Vo9 51Ue}}_+9=(!'\qD Dp  s ~d|I½4|+vĵEP7ί<ڱ|O&|'`[ ǡIJ1^))Q`zyڨJ-uF9jiӉ)g>,D`UmNe2YI H?-钃k!,򎪥;?j̻2@k2v; 'KNJ MydM{~!/[ibh>jw \MT!T; ̼@)x\}ĢD-i9mHz8Aqx@;%O9 FWhL^ ߄x_yvf>&63BrӍ۷Fq, H7R!%W~~OKZ+j" ?)E8;ǚ3S-Kj2m؍YFA%$Zu٦y(.D}shQ!3`cԽӊAbj,u5%4ܺJuAZ8ԳnY@*8dno2]WK-Z6Ux?7U'q^*pRlvx^]c=qydF 2ĊYA7=Ȗ_I?pI1]Ѓ98{kJc_7%P}d L[¡ ЅDi&a*h04uLBDYat}.mPotGk%IE2)AճM 1 ˥0qs8xG^Lܣ9w >NkA. H>您thErg'p}g bc"zOxL C)+"+T2ּ6|4r,F'L5h x_הHu6& 5kNǃA/!h\ 3|Nـ-:T*L|'S(>~k!]bX5 d$IG =8)o]<<?q"D퓪Zz&7:)/oi hW]-|V@6PfW헵dJaTM2/!WLh@草f& 8[wz"88QROP{jK.wmG1\zzjx1C 3Vjޡz YB502Zhqo=tpH]Z?*ucd`hKTKof+?Kw~$!O!k8ʹQOCHT$ވ_GU%]{ی; D^i\T+B(-\ZDxƼu_#=\7o~=6[6t "xykYФ_SdJ 2g y+(^`^<@"4YPpչ!Áv+ .XG~nSLavU--",-Jނyhds>PD}Zkɹ|#yC˻ enbC%SMc8(tL?G9JgY=2Xuؗ|ȡk?@NYm8jυDɭm %`& ;C :a+n?凬33jWid ;ܡT 82Z^+5#^U^I^pĤ ~}7;ϭ6 uXu4Hv?)lH6e@a/(ʍ5̑C1zn,s: @p)|^?״`Arx'epaWA' fB[Y Q >4\>jziJ;KC0ukA~,7JԖVnԸ*>4IPzV.E홡HEǼ1F1m2[V4[C@)W_;nt%VEv3-1rj MIuK(elɤ:ϩ6 `BTϪczW# -Jg8yC5w^6{dִjKc[lzDAZ Qw`6b$5 AtۛG%xQInQ4AO.s42W=?.CzJM0b}dt/("c`MwBnx,P$#KnT X(KM<=x[UA:6arA8#_Rg!{pB];& F_F{'t+ NXK;BkL'E0)G2jyw? yUfC4 K8/M6s{]/꧌PY?7HReg~6F %Ut\SX tw6 GzET":7kIS9Ӆ)E#㻼]4.( ; 6yP4fwpx`i$LP.2p(h$XZζ} 0wu,M Y)oUeKCOt"T%R[S5Qmauߤ'Ocne0B8_%qPh~Aρ:vʀ-oFLb쁩i^2Nit E15qsNWM!q31yOT.}*ϛ"4Us*r$tοZX}#U\!sW\,c5iK.#9eb\zfE NhZj Kf¨g/5\וpl/5iYN$n$j=\F,ChA͋XzτITQ0bm. 嵛Do1[)Vi\YE6).Tѹu󊝸1)kD˭LT)T%rBcȦ3Єؠǒ'FvO\3LJԢo㉊FL(=#pmy!ze?ӬKPj_DW[ː1Vݫ*u(ý 4ᦧC%ک58Ub"=pdz?U(95bćlg\[H*uc~_[;Q`V/޷x M0$%!*h gOvm --⮔j3Wge{2"pDc:uU>KiQтt+4/}SbvI'+ txo [#< CB$R]JKN_de\xl8 6lfuG*֓CJ஁2à=jԀy;o@Z),?z5?vFtvn21"ѭe+-cEvAu&Mc,JK % 36f[ ۪д~_(sw2 "wVz_g՟63]#Ա:!螢?r+Cz䲵\J2ar*}H$Y}<`ޣ7,衇,'y+a8Α HP˖ٌ6罳I =Jb‚zZ݁gꅶ+͙Ȏd{vx߮4@H{gIH{om̯A1lLf}&Xhd-{FuVڟ, yϽVW+EZMZ16*,%ӫ-\.&QkqAM(T #l!L;d{xA(3JEc= Ed5`0޵L̵* <վKS0P,Ԥ,nCW ey0]z M'[ݚA{ENCc]_ğS@B].;߹FEj$ӽp04S$ej8H7:?VP3tv`a_`wh0,Qug5>.L2, ۂcɩIؘ?2v fHIwV LPlvXqI€}qAKvpIA O>)$#-yй-|B궛(FDQ/+HXu9 GXX-S$OSE$]*8N^ʅе,:|E~OE45lUNN" Z%k<3qW/8 O+ m+DJs窠K`F\6>VIޭ}늢r/^164SWaEqsWxCM'W(a WA6?dϖcx<7r ,Wh$!>oԣw#2.Ž;^ լ 6 mc{ߚ|@sIJ<0}4,Fw"oe f9,' opx4(Yjؿr/H37?-BBL)4N\3fJ'K)[q?Wdqǵ]([SIfφbdu )ot,-F7)LZ}rmkh\C|^c ;! > *rof"g|~%re[:(֔]aJdY|F 5S4>Njg ,nt1D9kMQVRbs@;e}ap1 Ћ5[|jF&O Rb>CBDP s E ǭEGv@J#=W4 9m!Гj Ml4٦f1i1"Ʈ|ƝD fM>Jj?w%SlX)s[;+3F{X:5?5-ХуKX[ 9A% m:?:3: 4x?҉E#$5%Od ҝyh.uDH[Qx㲅 pE.Y'9 wNCdafs/8Fpm%-kG]gPF}lFTK\Ư-7m㾛!Z٤C29dfC:L >t*s_fϣL'`ێUvԘ7ԏKQ;|`;SvsNBAd&h[`Y8nbNt^pyYE~Y"gc0QSdo|{Ut*l~+ ,m7ś!`XlJ=Bn *j%wp=Slʩ-ˏׯXϩWl45q4Wh5_FjXB8N΁{Rv-R9%x@1!+[+SWA] !%?-|@ɣv=::(?N*6 cUN̅nWXb2,@\7Y|;)'O";+ a!۞½Clճ#߰nT.FErX9Z߄$fC99xD>uD8pUf=Ԏܜ$v ߜh֍J\|De=G,CԿx+vE|ĬP1 -0i4PRhXԋ[{h҅á\ژܿ4b ey@K逧@]MQфFcxwGٛ}aXz>j҃L"j=Kx85A Ah:7pJ9 8I \+'DR8ܴzPxqN) A.p.a$fW.sJ𹯂HIfnIkUd Q`OwDTNxYL-rcս>/y60"inZԞwf ^rZ:0݅ΨIG1 Q,IxRx3Nc,%W3  塴Xɖ{"՘,72-ґ+KpUC zʭ?-pHov ՃpC1 =R&u%8J1UEC{v8mfZb\%TTӼwM(yh`y*&9djmtS{[ixc)v)lG0x>a `wߎ"W DIp6p7&$d|M~-K1(=fd)?2/ 6|5d!lQt( ;lf0¥P3Xs}+UHض`E:Q$h`6@gtȈ]IFT ˢ;S!e1KHh7X8ݬ%Z}dmkk' W?4yNivk zԙ^t_fz\a6CX L6S )YoUW-:搧dBt-ئXFnsUK3_칚F=Sx`GNV yK sƿ-NW=?;-n+tj`5k,D]:# OHJDOj aYGXKG%.c +cG&M\wtk#Ow6?n'mor *j d0V|U8!{Cq_}P]";aWj<g=E<#X50zHr+ d* Ţk1 ]ZUgϯK "AV~]v^5T6z霵DDÛ۰prʦt|^oNgߵ+*sX:dOV$҈IHFrnΠڼbd2ր+r 3ypu7ƘB3Áy:zbJB\$\Yx"P鑩}[[ U57‡ǵעc_BYTWY/7rPvHa0נ'T1{va :)?}p$6ms520OGOtchn'k$>@_}i5_SԨ?߲`)p-byhʹW4ڴkvyħFyR,*λ?Akuo[[  PZ͒s4H͵iu5 0Aێr8V2vekf+Y*V?О*Z5Y:,qiD3eGݑ]|+s>WQl҈BivhdcOv^)&g2s&Æ1Lˋ-fmzWxIB~*{ptLăCzfa_=K CB U;S?`gADcKNrL:2Yn'^WmGj:4,Oč,GQ)o,(D K9͆.cz!L11hYjB1J^j>`r9P E^Df1sAMda.F;IKDj5W!yjTUb!8ct7*nnbQRE$gQd*oH!>ep]jCed2YP} M/sPzoM$'+d<{AJ1hxq6[@z.B$<-A(x݃Qs|7ﳖp:\e/\HU蟴mY`̮(ު ! lnv-\d$8ұSI=&ao-paKV 6uKv>iPewD._ꑒ [ >q\}~ (zdPCXGx&"WU0Ks9@&L*}s/)Ƶ-2Us=7,?;j7%\BhTvOJC˽oqOzd60b}@; ݐԪ60n#GJrp}vfw-G5{ߢv3q ݻ݅Gۭ/BE]xwYr}F'z V"PsSvev$ r?4 %-X uzfD=1gPk=jt ՆaTf>70.o-O4 |=%/*I,3Tk5lE|^Kˎ#_NPڒiC$U'ĝGGchꆺh|c@QsWx*᫳ށ+OCR`GnœGIGMDD=ls.9y5q\ l!@B(\*s*؈e9|nFvXPL ! ]SR?2̴$a0J*#kOZmL%To,0f,6L./A>9BRA*TgJ^>-VRO38-UÆٺێ!^T`_S6eWW zfg;^1Qഉ?@WJLՇk ~RiLcqIPp{ĠkL>-bǂR r*}?>x5sϑ(ut^qor$ՉI@9'nɌW.|_όmcY4oLdtF[5HhaOe6r[ДS뾮ف3dtYR)C۰wC_[ ,ռqDx~ZP ${) 0Z6D9r`®D,X7Ciw&G!jԍ5Hr5QvkQlF蠝YAu2H$Zw.r.`:i#*y\nL.efi ӳ/C->K$o$Z '2&?Cڳ(뒟X߲]p l4W~_&dZIuOn.+ mA[{f2)WWi] Ӱs4Am"9c%_ zXF9B9z|q

'S]6׀a:*4(ulsK)ִO4Sn'HC;}OTw$ba(?@'gҏv|l2j-Ģ-HTIu!_B/G2 M<4/x[ާH!H. G1KQ`Uk._Ӎ&"Q6M\KrKj0>gdRJl7' qCI֧\VP,aLHYd9ew@ ;]`]lr&7 ۲槵ywf <;EqSOu14d=a(84N H2;'Z 5f/~B4nюDtx8wveal\Md?| ^}04#Ғ?NJ(f[_mZroGBBfv(0}ؤZMJ_W X=ЀHo='WroL׎<ّ~s3TVǺcK[J]&ĜBh쐝2.|lj\ƌkx+xLJ ̱[W䚝2&'ILa/dȞEZ*\qR2͆QZ4h/~sRn l]f._ޯ .:KWjPp N5-LSL%_ Ќ37LʿřU!<\^$q!$Z譒a7ǭC[Q%0p#{O6tJ ̎d47~-c]U[`} IT泾LC{a) |GnG& +3tOvXC˛=}ٝ}1IDL`Ua|SLj4= Xq b.+–72 ln\mehZ{jQR`ũ ѣД$C]K!;QXڿ^ ;wBO\Rb:zw]ӆ_8Q7vK64)Qg\G%98!tt& Ѕ(-z.kCO;WK"U e/ZrNƍ!mU fSsǑe @z$G{K 6L!?@H[(k[SVeaaƆw~RQ.QV^~"5ei`L?E9TyO^o=+q -k4[9Eūs VڤPɀ{ Ěp$:]`8a<&zQv:z<.͐hM\\rYU4"Z}L :Pߩg䢧#9Q dA_[pʷP9<,CʓAZJG#=QqG. DG%΋B& lehQ:(GN<~Rw,Қ"OE6y/W$H;_Ô >>V{ߵdj,?wb\#C$(g_%q-ut]Q0LA^fg舆WY[xTmllRvBf]o^swVv?rG]ȇb8 \35J0kI4PcS9D8ġ VD!# }i 1)>TX،$gӂg\:".{~|6_:]j;]{@Dlf%%'hf*0,Xdhf!J8iAjytā[qxݳj.wf8yv:a8FR3w,A tҘ)"/Ҝl!W(DÄa('?`e贿a382A,}i`#igXS'y~l3jk˽>ֳ>=א٨)߉^Ywedą@*fĎqIꂭ3![$?HPo9:pt^zZb a0`ҷbB|{}Iy}.Jl̶lkpQǃzzOAJlD@ M5󟣹\,p}6kSN~*pRR{6$ۓE``|r9A"?'bVVċ!JeZϻ6S-$"u/OT<U$@fvmVun@o~UB4bi Nf>Il$#PQMmN';SgqTd1$mTHNQPNz&蔯w_ P6ҬX&}2S;1~,OF Bk5ypQ1ww0G*˝ tsK hMp!:,kaAFHOضLgiVъ8`6o`qȯ1.eǝӑC#&Bȟqb?Fiɉ$3, xkԑ^xYۦg.<2z?Жᷴ-j YcV0  _Tz#imչs= \)[ڤ}1`v7_İ%8|D;*a(7*3,1O糵^/cLCd0Q iۄ $B+&eL^"⛆_c812MI8&=kp+GIVXΤ72-q N9p9f| J$0s[`lt0ao1=GPucn.0SYvtȔ`A0I.gy3(ʓex$o12|̀҄?a^[U_p%.gkzu(KAy>fq5MVr/74Iv=)8e.UWF6Q#m(WfOW${>'+O؂L5阻Rh_|$cϚG:z$Wxovg qZ7 {t4;d02H!pCjH2mr^X9U Fj`(sbq͂ p7|<EbEfC?づxWnp_ad4n͛ػLc?^'ҷ|Ö2QiǨs *^OS Yq}|v"}%LrɆiUlGT))@;Z3yw]<^MV׭Gݵ "jҬv5\lrX,QvMK*2l68zxtt&xP]#XSy-q>evGh5_-3JӀ?+V$E1[0ZС50B7p[Q7MP.- dpjs5>?{.⧗bDQG{O+a"gLS豋DlWPFh/="KS@!r1gaG1$ME`?iwp!)<2GwíwjO Gk{%I}VoZI?m2|@ vkPBj¥&/  I,$D@xn:,&T7 CL)?.0\ƜTnWN@F }rQ뱽r`;eԖ&1抪 QB=B]Vht+5H`XնYVxlSgR#:'GpU$=t3#:U-E|t [@zEat{9|lt_;Ewav@LTeggu-+Gl b0b|a.Ju\NZD5aX?tb7_xtc܊/REB.?W 2;c%Y@E/34 LXSg-XO;x*Fv-V"~ܘfZɥZJnOtByh QҘ6wEXtt@hHׯ=sĥ;fOqw#ΤQ~/áW`aN,}z4=[ɲQ*jis/mJz/!=&4mnu.ˣ|+;;:s螵lQ=i8((K [$MkeHew c>=jPHf& rPmd x| QUU $ހ?;-er߻N}sK)\wuFǦBjRD&n[ GBuCA651kLR#x SB(ofoj"c͸O,G8M%n6)(*- Z8^WJ |BH/`>nW+ %))Nj?eeexIc*@5;ua@ApdH!ʪ1y]|4S V*"O02x)oᅂBj!NnD@T|;[59|>F.%ӧswQye4V=?]0#"k/_+[(g!\Yoѣg˵0%ǫƻQFZl0'O2tŦPxw@LT~7\8vCQ*Gu\T.%n(zDRMFX@ps0l5 xs7ɟ>|3EQ2>kpd *s(Ũ(.+Uι k VL[n g4oH]&vˋ} N1cF<!یdXRܲ0Pdudy뵺BtC{ MxPumk<`a("3 #Pefϧ"\Hv,` ՟y(x)(Mr i,K~:O7Fx*J1n}Yo '%qzv9A7Ga4Tqg3[?T(Uqc5䒘7 0ՆKp7t;ۅ|Mk,n+jq!H7h y]Vqn&^%Xl7n3VXA=tïWsKa=O~N¬[L; @Lf#Y .jwt98(3Y~=FnN>cpLo[^]kJ9Tdi?;()H9{; iuxEtsU,ۂǞy3 /=- C]5/ ƅW!8w-&6B ]8b$rڧ'3VA#o`r& /&VcvSj 6.2|j C(Xt%ɂ( wEѦW蔍)+;>sd &9KD$t̽Mn;.aFwɗ,bdq(1<~h3aܦ4y8vHX5Zv RB0wx-D5.y^eBƗ:LnUm2&B:zOϾ߳U (P'N+X]˸64/2Th B'1y ֪Nw6_23lػԩsCi vmxR)wCØ@qk aQEowI@9[Zw%G@O,k 0a`6 5ZfVWvxw΄9"UPۗ {0h~"OEgڗ蒿o @\!lO/%F󮌙}143Qy$˹!k.ihG+ܿ5O:w40~ $alKn6.^ K8Ey.Z_C/Ƣ> IB,˞`ɕ1SAH--%~a4uVo%ԡ,IɭAIyfqCdrSyc??peC-2"(Rs]GF}tooO@[(SOP pKj2/> RcEģ:?9mx1owmJ:зq,X6ZBTTKI02u7[sL<xۂC-*iz"}Ak5F72cC9tQ"{oD|aZdrSlԄlP_IM=uKiʁ#pȵg*b ;H p$~j"b>FJ8Nt?AF}G`,}#eJ7!)I2jJ*# $ xu|;qfb쎚d$AsI'lQ.߉ q>}[ǘȚ H4Ϥ]1 6͞dEUHQ.z=-$}ٶSăڴzC@Rm"gyžB2xb[ +؛+[HqPZКT=.9\ o'dCmh]|fC}#QSרBbt d#TP4AycʮlT 6< ^b~Lu -mbkNK!1-OB"M\Jsgzr.oLmݻo+6ߦo@ HUN[E# 40K48Ry}7`'IQҺ@e.cY48RjG__\rAƅz&/&Km(?_e7*Cu>TҚ')Ją Bգ;߄̸[ZخhJ&U& ]MH ~G:uLϊXvdռf)Gft2A -ϓWv2gN䛘ffOꕇY# z e7X3BUB0U|604#d ~\h`!\pr ̜dopˢNaV]q|U`MCEy5]K)%"wY$ņH!OPz\:͘u,;$`%:s|%R]'n}$t%n7@,V &y ĊCs5@ה-[~0혠0ųoea\wYWB+ 9CRRO`'chB.]Jm,pa;ڂ\|!gW}^2򇯨 *0ZR2&4LͫOoď >֪HZAk}#rWP~=Ld eCj7UnOWAbȳ 7m\SD$zrq'*VI6V1Bɢ2H@kkd4//SE-RiA6(B%~\>k Œڽ6B7R%fW SR^ tU-nkv[ T[{jًxdl$bqãh=YYVpۋa8ּ~߲(XBheDXi7„ogoE Rg%Yo}my>Hz _E:3JMAзs% iH+8HK9 -Aa @J(B%`i%cSf5|xTm߬dSkÉ#f!r9©O\A-f%Ebg|-PIh):p9\?@Zt~F$&\Ԋ-rEw=Bɠu4}oza&jgkv\ivG3յ|K &^U0jեf`(97"-ͼ_6cIld|aA_;aBA ]0nch]o VOSc^uԥ}uh*ϿѴ5˖:vrlim%ENM4S t**!#S|h%h}V$*7ϯ&.;r[Y3qL0BA ._|#T`r ܕqډoQ^Vًd/]Bc"<2UpbWVT"`92\-nE;`K"'O)c&fKjTvk'x`%M> 4&|g G6GfkHO|%&i.c*ĖdP^#ApVH@XsH6 ,w>]C=.0uiځ#A͐NX;M{ƴ[CX^CCFfLG|!pz\vApBȈ>ܛR};?u# z x&Ve>+ 2Ƴ[#*W v-TQ'S8CYw~'I ЏLː_l7 Iu*[q%k^T"ws΁*=,Qņ?6EB~kCAY*5_IJbFe\>1"ս]tX zzFi&$QRfaO0B(*9Il_ 1jS-Qe9Zk?ohFxz7HYIq&*$@q;s'_1Eߖt)| w9MK,lt".W P&TX`gM;I' dVڕ-% .l gy|? KPJV,['ȇWķ"O4~XFS&F|oi]lY2 WF!Ҝ"Н_T-ZkW%AJO"RFDz0]I4rswhzwmR <þPWL8Z-N/Qx GҸ2VbiuyCnFhR3m]{3} Er/qlKm 5/-ov${&R> _2l|¹2 =[1rݲŶ`rOz 1tĆT'9lфHBHG q\i$!G ߅F^<8&y*i*d. |zb!t_=-UѸoVha;`pz(RI|׸ o &3m>W{+ãk쀄7(O9"2'VuOUn7*߿! ?7XKTr1-K63$^$3&A볣N*Ʌ4{o X 3yIal%jwt獸Dy}`۶Ra =IGJoBaT;bGn@<ȉ5@|,d_`KKC 9Y|76Mb Kd"xÓKhdGZN߯oJY{oYY- r5V⻟I_&˿|-rǺCDP_ dUhm`O 3%(&0,[-ӻy3F8whC H}o-$2@sU^!ӌ6!9,.$ߚ&3)8Ô5]\sk8{FGXd@C˳>`و2yo$]x 5gڲ:M`PDN^V,0փҟV:$aV,yYՊ#d\o\Fj 5I[N!rxmAJ2FRBʬ9C-c(r{!Y|oTާRToψϵin4{YDLn<60c`_R !%}Zw{=dBb6%AC YOeW^2<ơX <䪫77= V/[g4V s@vQ]Ƃ.5csho}^v7Tʷwe(h6; S@zQY} 9 M;"?풟ʪD+/ [%A}}8czz쵓(yi8ۧ闪[=1 cz1Q2}a[8$](tݩD&sdf{_1º7'C ԚB;pݢS)On~KDϢj`y/0h`, gkuh$XbjGlo8HaV ?krg p+AT^C4,vԁ!I:(!=ZӲb!D}q}_c;~׋;ߊ͉;vKk`-L#Fcʹki3ը|Ō3U7D+Ze PkmOK2I\y]DBh.w ~^?p!"'pB]xj7_!~S,MlC.:J6 fUױ5TI׸ }M3)`vTDOV\Y}"ob~ %nbcI| `#Dt?EabN`&_Jn_%,~b=YKn+(:.5O,t9J 9];5-4Lc̙ge iI3$n-tz#U^q֯"A's]'\Szf5]t8hއx\ntxOs֔N#6x=Rp1U6]y! ٣NXu?p-EG[& =%XxZfJSmm /MEY@XAeNk*L;d(fB).*g!jXpso?~.X`tkGgknj~N(/Yݪ6ƢQ>[-A# ߚ'u]8 mu0ޚ,?l."+IĎKNm J[{V6t#2 锣[ sbbw~IE{n"{ _~zR<Ƞ$zW-aoPe:O^@i̠;~AYwTmU $7 0$+ZXCE )ԍNHٶvq4ҴSn\+ӷOp%W)"(5<0M LnP4-2yrnjUOy 7b3~kҕDRj˸R?@LGGFƣkbcK>n,-#6C.uԓ1UM + Y'+Z=='%im赯+ߡ[Y;5\LEᧃ۠\u/.G]! s%m1~e8j@ RsXxbbIBEӐ1E\j2lbn%^Qr[BXDhL%L&LNCHMWфI$Us.C. 6Gb RLK:sm"dʧC?Ĕ[܌Pݐv媃 85&94Hv?&_b" [X~EL!ZI)("XpK4  ycY%]OYb\rSgvA U&#عP4,v{y/+s_:KL Y7VÍucs`L;v)IefEP\\)xYiӓa狎&􆺬) E 4: ioh!|M 񺫒$=$-Z؏\Yv\T?w~oZ;K}+ͣ B+M{Ao ˂Ʉ^9o{7CِQh?FX5φ)Zs 6EoA' azcu0* *!8. {%:ƔML)O+s ߰6Qn'HI >a MtMq{VHPɄP(#C̯/U/@ZE[1vNͼuȁR:c|fE`pqO܌G:KWec e*wFݍ2G_HiH#lLQĢu^l *|g,[} sdX;}/{St)^#\s-= +fW0}+%c ^o-z*9}#R#JE{H-Z25(uQCai)-$@l(ݡdbKv(R8tz,z2&kvGnJX#y75\Iϊkq1qU#\adeI[۾/.8#LʢBFG>t_W}jhxDB25@ JB6{}!Ou'4pVj䙗"j (0>mb$8>]2k~__:78:Z/˒AI;ab5(ѫ Q|l6SU#xx\|!#DXΐ= ~藑5ѧP_y*%%Č`lTuyc忍hGk^/ 6q)Q٨=V6 w=)-ƯהU.l:vݘnwбS5ru@i4;g (ъ`Y,1lH α5G[R[I Rd/ѱz/|~LFp=T (NpZx&\*cҀx~=4EŚQgBA6dQR'p^ !`Nr.ܬ8`El:kx[xg+h3$ha5h^mǶŔ<,~ɋv*#WV}`FF:FX6uzhB`A!YMgګzTee42: g]b-u㏩Uz!MArjnsIxwxΝ"2آ)t[U01+$H &DƉcÃFɺ_8,MPegi.-bW%*5a*O.\ӳMQK:@KO~0K|2p4{oln9b{X62t&]'꼠G:SN>\Kda,=U~A0;40T y0#Kf7\$_Cṣ%٠77~eՌǥH"V&eCC7M'8бHYk.XmW`nUV^ЧЖ ?cs" b覷n/V$}eEbN>nҔg1j\q5Q˯Vxu^)I 19#6bXJM BS-_P wFbʐo|]k]QL)gQ%70uVns (@ s6S@-?(XM{vpuF.>PDGMF_ߛUl8v0>s$!-˺T|YpZ*r =7uW e8S 9jJ2=.O?q TH r0[֯M%~GxV wX鿌t",@BKG ɰZOF8aJy6? ZY !&~.`{@2 1vމO] 8l?A2Yd\J9vePFtbl fPR0S[},φYLլ/8Ns@bG|z?~͖Ƭ^aiAUbqr $a'Rʺ 9ǖmH):F۞izI_+<( 6^lM8OŋaFuUM5e9NWߎOTٖkƲ5]qEgRY9s0ܑ w:nR%ƗyӪ4*| 8(ʄ'⮠AV!LAdL)v}zhAUMOhl`ǧN ؟;v7n[wkke#*EhE 0<ب9,NxjBCk>o=Z箝 .u@o>͖MX%y.lnSQGJI+;X0(3Nv 4{9w~InBi?I&f±ee\#;Eӈ|IO0S dX(nc7)cG|^Jgp*sM.ӆ1,bdqox`hKizTx<,r5t1g]{#s8דyBwB堌F&(b̾{3qljQ Mw ^-⼫W?'*ѯPzeR\Dž/!`j4Ue^84;SL,bW[ ..nvLYss%e* "mH@/X&yT PJTO#ddI]ړ43EҲ8Wu<7Uk0ԂS5_i%=%m֭k5 +kk_;Ciie 莵'QFIuv|si[f>]eG{=+QfStt_z͆h}ېB-?ŸU0raWsG 7N8OB|kyf\z| R/D[a\: ZZmF^Fkd@ަf &YԽm!$¬&OFֶD9%ӽY3O`˂Q`ƞ|ܸ*7ڈ"t2m8C㈼7!Nmݞ7fwٟ ? U"!;tuH?'.GqcL /W29JᛥyW)b3̤9B,qL!%WBWn3&K~9A.dxX]„S1HoLx^Og}(sV#qa+?nQ:;vUmj ZYYn=(Q&dj~j\<ίꛩ nQ:B!ek. ƽ= .W'U0 tҿI:$ϙ ؘ)''̃3"g{v8{+̼/2r!``_:z&CT(8O4u%V/K,TnE=:x9_/fD)dw7rt;S'5WJ11NgT)W3iG4*k;mC!GEvDwDN7 0ƒS'J}e^OuTRQJlXEZ$b]@:]6LF'p5B?e(c =sfTTo?wJD^ֵ`|.Jɂ 2; CUUpؠ`]_OJNƁz]KUvO;oʔH(VA;5jh.x9FI=yai֦]1Bxbcx{Z#+E l Xw?E$޶=f봮qG>B<}DG1l|#~:q]uM$rMwr+#(Ur_5m; zm#E|F9Em+f)hwߕH7]hT.oY/A*[SW-kL;$q%[kД8kܑ丠dUv>jX>͈:@+Bn@ М:JOnZ7#FƪcgQ`k8miQ>u02WOUkU]-{g<ȉiW4U9#QNč V=fQzհ;e~.q>`NRJc 7q.tIŻ@EwۥuSmA^2aE7J(c5}ީ&<;u,=P5=G$ζ*kF"xE/ ٯdX9;IゑdG'ԾY*E  q:y1ۂ>j֪EbDꙛd23x2ƭG8U"iSB L|9ji<7'|Pǃ7,6VS'Kճ~\Me=a(vtG} y|h,gL(`I[wLEJ 4I-~D!4M380+q2sw !7O],0n99eyY8ǬϑU2qy/_fQ i-E2|ڐp09!zmWxRz仾;%c(}ЍK04w$d\k0-9zu|O~O6E'썴rR|KPl:"k6k8({h=6;f]x<7a#fX]'+Fo;Mz 5-/9r ֶݍz zЇ\Hj_n.g"o~O:w :^KHPcbWؖ}f ;w&(Z4O:iLu`)9!X-& {س? qPba6 4sðzlRaߑyᨾb lc4X bt[`I-3DG>gS*0[/e~lũaetbut/:ZfLY6@bgss2_46Kt8*eZUR2bnXvU(Wco<ħv ww -\.eI9xμ*_66`!%151AE ^u^mmi!ߝ(hDr:iy3[jHivwe5Ǣ#<6ƀ`#:ڛ]l tb;gZͰ=1꣰b" ANTؿjGp#P*2_: cIw <"A(m?d/]BdLob;)"Ӝ" a(h"m"Ka#AsMS}g=xOX6IIc3("R] d/gx9'Ӻë׀ژUz1^bH'+#b,*ooN,A! "C)Dׂo |B.al'/y}? x~pTb63虊&=\ 1,imZYdѯJ t^ϸ's&rI7P(3st/ zBJq#ׇM(5fiET="k-/KRQGF ڄ*|,;a}ȚͧbIRQ$Zpg'AO qs%<ĩֲ̱yˍJl@U%SM;؋x~63{ՆieXP+n+f o[;*O$Yșh{l퇬 *>8c(LElNN4z7Rux^6`q BS&lyX8/VO EƭHfŊy"{]lOUpDb'^(Ƥ]9iDsf/{qG=I=[<<` @{-W~ƯuH sN537|ȱ\xg4l=&oɤ~Ͷcِ51~-%Atx/.8Kt3I ]Pr{I %V-!<vΘ@ZscuġڠWzTOd=Z y:F߅[.p>O49LO%Wy,!KnKRE&㓒/蕭|fBNs 4G r l_u^㣳Rj!%2|R3X7Qen-S |{'ҹn(|YCQy'>D>054h.57%yzi^#Ɠ  !E:.QB<K0wـ$sWRrLf7J;SL4s\t>B9cAƇp+ 7o,0ր(6+vBdmzi݅^+dT&>9᥌ȢH\MV9cڠiDI[q͌`DsM:ՁJH吷5~8fpCB5V 8ڵ PcE9Y^k,j׫klcZ "@r] 54$&cF_,'·E)s Jf9(_TWT͐jU4,FFlԧmc_'! z1mG±$\#Үw lT-u1f 6.0KmDmL:NƸ_wOUkH5 `\8Ba+|MK/QD4R,N&YೇUjN~({s·|g;Nxr=2\*%ʖe+XǪ2rܒLj}t!C][^.6eQ0~ԅd&uS?8q"qZP٭'"xmGV #j0' xu-0t}~I9U3G9H,0uIpjKnjjoQA0ȿ:Vo?W%4x{u4 eo-0m{5U6#,+FhQ@!Yw5H_*+N1ZqnUZ|t%?L|iF"ب[:7w/氰]PiAFH~ϑ3zB| ^΂d2q8pSz7\ؗN#S@JO?>YlҸQnaI"60r%Ms GPbOٺU ܅hXRJlȆC DcΎH^opNhS"'Y ?wut0Km4xt,ׯVӎyrhr"TS%[>V:]DʇĘu6τVT-;nm rD|JScv`-ݘ-.B0ט7V6ҫfolMfи.4] X2Fd[`I<`IP1vs @T/fM*deix~B/-BE"# 0ۚR"RsۖaLR U/pЉi]U+ DcΌ(!%8ؤڬhH$B47¼Q@zђmf8*H~:  8c:TǯҐub /eKMM>MU} H.(w ?(on6U&ܯȮ){{10ZmGat PY_˘], nX"~X+vjzO 䗗bxPl)5ͅ*ɡ$?1'Vj5G&#)b*zBQLj)#`jqOTae>QKհ]R:%YkOnlVIO?!iUM:&W|>d(n0EG cSJ>Ue}dʗ"ii@=~O# :\ڀ|@ZlY5<|ա<D@bv)ƈ=b7ԅd(<bHa1)|LwlȠ4wC#Ն/lk߃SDaGx/䃏N' D17@5@tp z@\4fVwA![?mA}-(QdP u:rpzr}HBX2E,/%uݚT% \h/bÑ|`+ͻ}E/N)X&oiF™STVU_R-$%d99^4BL}gٛoB/`YrX0i5 i]v2Hyf˔U7"13)匞\.v"$d 2s~֛S%w5I|X|]Nd]53QVBo3?woFd nγ.wv˭R_RCg3Y`- y 3ߥeUƙsUťW^HS+# [uNc4 \3z JYY@*훽i8WJ`s\k$CÛ6Tc9m*N+gנó1B(;ֶCQ_ASs?b9ذ5S~w >HiY˥e]s}=\iIh:=&gE_L< oA6ȩ!~K選qy-i-(U{/<?= ޚe9Bu FΎV1 P)!'dDzNCɗd:n/9Gh LdPdF2^BB 9TNqut"l8J[Qs̫7̎д''WnE_LfYsR *@f%y ˾&Ve 0gD3%?RH!oоL< zH ly7\JϦ#zԮ$PݛiOqQ1Iw@N}Ǭ0('D\paҠM =ž _qps|d&պXGޡ>TיF OG`Ws^.R |Yn7gR3i/oxMǮъЏ_YÆ*ɊXKWg$1& 汿қ&8MjEnCKLFCt]`̖y;]=5Lk.mȗ`x 6pgD~F6b|'4l|2W!t48k@B.\tn2˒#} 뷈PQZ{uApJ8& 9\no1n/( cvB3aNH6m-w&- lؐ::5$KM#O6_`!SJ;!(/]C sej.a/09#n}Vn!SoH%'CY0T2}R$RKkm^Pum6,CH͂Mq{`$+Z1 #n'UZru%n΋Z뚭VPwbյf-]08DMM](d^231z>>ytrNOڹR?l-0-8 lC?0Q Zs ŇNʌÓ Y%tS)K@3ADA 2X_c[HYW !_9%OebЧjDID`JN1Y:(3lKrMJ=C/~׮S䉕rSMP.nW,-I9JqIr Hٚuplơ #L U2qCP딾uYT6D7R#5e.9 6OAKYRaGANϵAS=ot1m4ڤLJڗGG𘈯PW"CqQ +WL%$ɇϽ{յIXAPKz? uR $p=9|?%xb9xc7m֎Bx8GN+JQ;C_G6D"ӞMXG0 w搖0c[+/x'>p 0E wGKh5w_| 1W6ȸyd'C /bǑˊ wx#"k!$*xv] MQ[[UI&'ТdY(Ef|bT sQFǚ?BP0~p> C-_3b:nm`ӇYRBxUA~[NXj*ﲢ)Cy*@ۺ8TR-I+ͦ9Mt0\Xcf9-\(JΪl=d&-u4B~;r\a0g'u?TJBi dxb,6)ߊ0 Ӳnm|?e+LtXfgW[FCx.d ؠEa88׶rm֪6ʁ'HMWtt Q`ശŝT2OF;`e`1Ϛ3UrRG\\>fKh"@1pqO`UObRV5.qN=/H ] Eъ󯮩M|t&2 \"҈`G\ o %Ѣ|[8MiQ|Lʞ1s1ZPı-Ct>^q&_d1XfyX_дH[,rH n?_)ZeADˢFMfíighlaBͱ2f#vXէ\gc `"oYqJo(dv҉|%M 0dYcCX=Q,H<_> ޻ԯw֢@ h"*7clg 3ahNc[mZC7!K-!sW\Xcz;dֱqx͕^(6v.d.I99f`hJض~9J+Y֥Ѿ/&%#(trbYeO j=36FŬV@Q b{&Nt6"P5rs,^잜5Բ˙ *682CT ",v>ȀbȐ%aSk0Ud( lq -&mO`n1]&Z!mkDZ츶+e(ϓ9˴UJ<%\RyzfadGZ< -Ԕ!9dhPAc^e67nۭ'=ĬSA_9$byPscC 6t%ng EyLRسK遪` *Duɕ/T,r5#{#۰Bkvg;;~DiKPWbH5AXE-ph!z:"m֝;xqt@w7|u'F`w ̖u w7b~k ?G Zᖲ*dw2O&D= }P(h{.2ytB`0AKw!9P{twlnl*]PG<^|YXMNw`,Q% Mm_#ɻCy4' rf 6FkNdnve$U9=7\).4M4UINkm_P ;ͥí[=Щ t݊XvFdA5;N_s?~MtL?FL9ΞE߯,ыSZLXR$q=5,i)e}+jYޛ}>KN!Uw@cvA~8K$&{QڇB1{^C!Ʉ}xqaYxG="zBs*:b}xZem5YJ[}3Dg`5ga$m- M 60aB#ǢM̕ꦿN}iȯcJYwNhDw (^UDNdFŅxJRi/"K,]ֹ%/kZ>RxԎa;ʢ끼 ـVñbmjQTȄ=u2.KPim}egV7ȟ KTP|Kߊ2Ia!(nO#ՠ'I?!WxY>P_bQdff*td,T24`ͬoq[[rLA~vHf+͖`<&z*-sZD d?} c#>{B+sV^ټk댍3u3U)N4,l|TT?@tA##aӠ#,nKgǬҹ"ƌ59ҹ%RЙ'xy(,' .P?| l`-]OϻrmDTMˎ]aaڍ.!~㲷iLv-1WwǏx|DLf*V߹(?e,I[8X #1R%"Uf5DҊjr"klBVMQ4/6! ;CݒX?UǶTҀ<'o R)w$XM~ tvDn@OD;XaI<ϬźԴߝ)n"~ER.7fB , IG0N*U@4| ہs.1\fngDJc f-[Ӈ%`55a@gyT.j3GdS2 7nlq 0+]oLnUce ZPk8Q ZHc_g'E:ϖ&Ӿ>._7@vYU4:uim9>Eشz!?Ko7Q143a2VqtG24cP&H )>Xk|A3Z FH$~Ӻ[X!WCj䣔LH{gW/m_#Ei,ypvĶq'ZfDY|knRM6e(+%_UKw4XskᲳ=4d%ZwZi?H`Tԍpuu[|:vyvSm2[?*M`6πc&[wNFB v5_q=pe z7ji#z-i}9ѫpKȗAY$Kǡ']ƕ8=oao3bB#07h =YfH-ēXΫ&tx@*w-E 1/O@@:Yj?q$-V%zt#%JUxi48exZ.-"[|Hw>Y[HTJM o+ҮqJC5'pnS<)pXqO}ÕW!<ܤ'zKc4Oj ,3 %:\.D"?{4VN98BYnAr&%k#4XciV]祻bj K[tp$DSjuNSm(>W7~>ߙn]0% 0_ Ɔ$HfSPw0LGWS?1DoMfv?T=u֫њ0!@+o>(Ps+-~Z۳(8s!508^=v(B8N hz sEE;e@4!6AC!QK.xe;5_)(IfX˕Bea:R `YAk޿w^~ l(e@|3 x4:z1d͔>5 PP GU\Qk#F'<ev`i)e9͠RaeҒKy OT%),Ƥ̲l?AC5&|h0C:#Xd{I5H˝X([$2E'&Ni~>:'쨨,aepQpD8dC$K1u) ~K @`|HI`ZRg廝jeB#hN&|*߶-G~R1Z<|y 0&ՇB{=i0s#JVOW B0d C$w)+^ 3 "4s 1Uدk8m AVd-SIA-.T \w*qB+:zH++[@YiYv>WZ`6j[~mЌUlQ"rG$`l,8J ޽E$ r^J?BE5F/EUXg|ց9޼h&~\M8n໢oZЩm~n"gK&pz%mǃ5鍕/w䛕*"R\_0Jj i툯r.k($2vKRn È_YI@%RW//>qIjLq%m|l 9^ /q!@/(Uxڪƙ:.]l'8(F ՀLcyP&Wf2t#>Xj"s C =&+ .Lq^Fz5 ߜ71Zl4Ոf/J.xYBHZ3 㳻QC9b%A΀}ԷkLsECufYgƛ:m}j әȠDFk$vRȱ漵8htdӼ8/p߰qg蘿B])Cm}C!E2zl]^ *yK^{ >$ L\Az;D?(ꈳVxq9ٿ4 Ekh X/0.!Wv Sl6cyhxcP 4cNu,=X=@n"X#zrb}[Ĩ\ `LfD;aNw AuB=y9[xW+3u>k{)}D2.DE f-^s.>@OoUd9F~)j&ݱVFQ7ĈB5nxx !6vwF떇W%2kkm5xyXƊUu }q"+Xmk9}`T Rkɩ9a;QMAa7uٿպ@0bwDFD3.XY9x8Anv`~O0$8 ~&jxY9JȚe;M# rxR% t2$rUӀ6iv6uy{ :K-Lod2t4B6̺[z^QEuא*\r?kzexo)NL $TD4#Gni(3,hsl+ᰥ- +R˥Vpz3*䖟 H;gz fH;z?9QЋ^~nhh'NyvQ0^e,plj`%i}qV@ ,&Uξ׌J ,`=6Eݟk? (^[-@(XR k}?# <Z SAb9Ntd'y*kDțL ks$au7J$p*ᚯo];t׺#wY+ijM.G_FJ"KQoN^(]UI!&p=J/Bt75O|[|kT5u@v]Cw=`W| ! {<Ї{Q<-,'KW˾} 38u~ \6㭚mjLJ YK*HPМNY;.BUQhZ6:[teӐa{4fX! Q-_n 9_H[ldt<"@8'%1glM;q3??R }=eЯ,oYkT@Jh-~iSP\GM^Mpz.mrxUE%(3"QYsM]#%~GquP 4,|;nSj`/p}&j2B*n6\8pKWCltaLwHgs<|y< ;/>6%c)f,gz,Z@N`bL$J 8˯F+py`bݘs#572;PߖHRqAk{z5huX}4.B/9-҅M]ʹ4NwNt)0fk Q2E]?ɓog8}imo|3P"<^L7Ji8ou#K͵lk}h(LIP&P .ֿrPBCߠǁ QK:nDhŠhImHM})Z(%ڧ?ۛB+ )q?6[BLlt^a3{;`c+ưRO^H:0[yGѐ):_H8w`P,}:Ar2sB Ꝝ'pEzjsf :Xn< sQXqLHsxO^3( X1(4䣚V1VaFȥמ!VPBD6WGJZ7rk:~VTqؑaT ] QkFC7mbsj-#3 Xa˿J̰/1W;rǓ$]7n Foq0X=$7!ȺjS+hN| wEToEY3JuٝfN.+%BdCG81*aBEnV\w0Gw5ĞJgC/O_OjjtDž YRMH~%io] J"SZOxҹf\I}J3F':5L_Pc惷&YaTl|$/g+)Eߖ)JX,?QQOq>U\1Gn7^'&9Zto_Bg=ހ)4c¸0HRk.ߐ"&3\9i"Gr=1}a>gi=y կMޯh[P}t j!U>οA]tn`o/dCd/( F$/Pge(~eMsq]›IrM1d ![}a=>EH9m⌊M掂\(w ?~tvA SaE= NA%qG7\ac.E^#V1e7U2,ߟi]&xY2IZL>cQVG6fPZ}w CtJE7T#m9:f [bB.zz \Eil☘Aԛ6F uhC![q tI?$ˊvR-0 5U|&N` ^I2>8g5ׄSf􌀻 uw"1K"}~D0-oSkTjuLh~WDŞB,.chdՍ7+iDCҰr^ Fus꣯Hy(Vrv fWby6ᒾ ]W'%fyU~hRx!ʐa\@osU6G^/qA>K.,;K3iw\#3i5t/B`Cuyjia:[cd*].DQ(iz4d]Ŷ'EJV;ae7(NOqS7h%"Ex2OD_ȖkjSI˸bF߉$o,l j>NzP͒2a?Kq8I04qI׈VkjpU@ݶGmeRcb(}۔ocMi$qN76ٯBQ 8s74' _ 1bK;].P6{{-j6NB4)гTTJ"*S1ew. P*;eޞ2y6CzᑟhFk/s?8r']=̒Njs8*!ͅR?V #o-eBEh"Uh|;kJkŁֻQ6n[ 4HI>b( Kt+d)lY])3ϑiF5lT H#H`7jEB2&ClB;m.m=GKe/Q]$3 29<ɌQG&ǦIu ~"oZN]' JxiK-2t-{0 KlɏdZ9?ʨ8{VqYRz>{UU\JQ`9/L V d=h,:Eî]%jaB$"lMpb!RU+kƷ a1<iBW% CfzdYݎmj;tE|xyɬ$/bqs!x9½SۮM™=4O7IQPN0,NQ$`,9fg=7eh(Fd:T90H✙SlRd]-AQڍ>ig 7bćbu\пAhAb@BL@Cfz^l1p WID3m_8w=B}~q_[ }x?~+e"|Hmi" &OISXb%@UN!CE,s%>Z"~#%V0(qiNf1T&DGC\ MlzgZ=D8*"BPHos 56#n[S} YCHNbTeJW4yh7 HpFwnw+)W|/:?qpȝq,W1NhB&}O£F(#Xq(@zV1Qߥc'b~I(FAmVxB.|{"Uo\~9nq;6-RM:cwAi YK-iT>9=cK$ފq"|J{ߴwy$.S_vt&dI}x$ʚ]9' s\dɔf kB]~{Zf-r5%rSj"c\Z_n(RkD'f8C8K*Çov{\C6@6\H[hg>A@ҵcĞK>7;Q'MRHӚ[lJl'e'AA*XevR .0JE9cNGե[d{w4Z6@d4 / l>s9 zW-"-4힕E(SnFEU*=G.O&AU @GHmh6<(R:7{ed+A\i[Զ|="횫OХ=޵eܫq$ 0%KXҽ'<~jC֌:`U>5OBFF ڎU&TTJlGҢ[9+w/O"om,˨J+6 ]Fj/xN!2OEF~^|&+N=D$Zn-kC?V8[hj g/`e'n2k],CH6q1%T:/Q u"xűxZ1e8+ڴ"8>=f `?#Hj'ø0Z BXZJۼPr|(5h0_q-%ɣ@njfe.wC(b;@SZ0*G|{LwY/*XY1DO&#8_eY0Bƙgk}:A"nk@FQyt50*RʕV@g&B&,}eSiwS$ERJ1' aG( JE1:D:>=S*,gp'݉Uq|;7$(tT>'hF֋"wQ3+ߋ'@,)lKŔ`OzU xVdr'rL鰛^kҦZT.6"}+~}j}Aus$]l]ihJ(y_1n%gBkr8FCLt1ax@d,5pG;FM<;&0*ҋ2Zᐷ&R^Z #)09ڪ$m4WGMS@*qOgO*KOQo!w9OfMc#r?S\vL .!JcqhY~v0S'Q1G eP<-wR苠|+K \&YbC}cQ23KH\-IilV&eF,+zއ"މ.SF7tQ-C#x;NJ~V$#8JOU.+nZ"0=lsl؅ P o k}ËhAnV,pxRܾrUd3uvK۟3I4-/\raͽ;q{Fbax̢Sҳ+orhv~6 tV׀x9 -u4nQ"VSHpK(fhlDYaޣ=c-GPEm o&:\yUMfZq s]]g-4T+1+-#s.|6Jw* .r"7X]^|l׊gI"_rMcv@5ϯї돗DDՆ̏?T\kc x -,C~Ih w$z (p88CUV.;]X00k X/|׽yǕL11".9f޳]bcI. 0=VBW LĝR\sQaՙZ^Sz z($5w+g#Ơyd9"1rSۉj-o< ݶJdT'=3-g .v9Ԏ\{q D2R{(7[l5Ve%svK@"JMg,T]\b[t \\[KE4)gW)m o tL:ScH/iSdXMtVbW^ȕٰb=u{wjatKS8 Չtx'"jݰݟgԄ7VXi}[* e`jpXUu+""@~J,G,^:vºc?N)o&SEZ{NWd+IBx"GһzB:S.xG b<>u٪"ȧD=9STvkq=4$H @~y[Pgnн]lhĊe]8v&3ED[[M4Ψ^o/9["Dk&d%QuUȬS9=KO`t~(~ Al)o fg(QpǾj\zBQ?E ԦZeb+i`>y.em3 P@.FldDwAwzhS i.ϺM"vT+~8CW "4'8>(wm:< ,\yg~TrNISDBhEׯڎ8Tƽ2RM>uE7;Y?0>f]No! ksy#|5{6o#jEg b[ZAVDDR*ELmqƊW*mbR'M$2}4*3H@ Ѹ3T<}5LJn1yXڕ^ soH[/(Z6_\C*q\r|Iu$_0@Q:qD^FO}DU_uoSiJϜbsmBzZ8dou\aŒ1QʹT8vy~JPC,}Q5YXhAYE;)D( fȾԫ{spjՙVw"hQ{] 0,rN1 %6feadk*:]WeFT"5Q FhPK<}6N8Q{O$ц uy[mصF{-܋Z~$B}/v[w|qC]1VLfįc|Ɠ iO 4:?% ߙV8$\#v} qyJ3 ?Wtq##V-m/OӤ!V=\/5&r+{9 ջS>-bj?ij&T0yA)iwߢ/%nYV#{ϑC.yrү[djh|[|luǒů`ؒ:-ewٖJI"K5*]m,TFF@q-?B5h3-_VXOnC[w,_=ab|6(fbCZgz-@z% 4ϳ)PMwՇ!73F;b!ώFdklLm>{#}4Fh+Co0FK @k kn+а>gC[}dhOu$ji w5.-x (}?eMN4!+/t&=Y !SД .Y{*4 ܣ !{;Pk\IS';t|BwLHR&xXaO\(/JI;F&Ue88]<VFe)#H:++x(^`'5@7 'GIjwAMq=? i",LG/T! +Rɾ ǁ]9;ߴNq Vt)t$ZfYP#AxH؇+WrfQ(3N_IP`ƹ*eKWaGWuɳ e/P|]W:Cx? .˻΀ѳf(07ɽ.L"/{X<M3+ M~zr{RʵgP40EDZ%atM#/PPE&HI?@+(dž@)\*/6ze=]8T>G22S 45ǧ ڊ2̮dHԒN&tW6G{I tWa r$@%ziBX\NJ{r'i*(GwsE:]ڞ ?$dߒtl3}'rIY}.KܴY)h՚,jΝV$k Yj;$ G?A4X ؘ.Y}.u4`# ƨ̍m %7V3ndzCuyORGEW7$ƖO q!<>ỂZP2Μ$V?`Ge2aOPdig:TPAk̵5lq=O]"%\]>$.SSbeo\\uVlNX0B]_gPj1)mt5xU\կqؾZ"`T#fֈ>h²@Nظy#+MxH:_p(J(2?[<u{Cw摚JWwhhkJ J%4BW Kw}hgl}K?S SYqG66UͯGLi8BͲ9`PHva !"LwBk9[h@pX!ڄHgV#_Rl xݦ7 2"Rϗ.Ckjȋ$u5H\EP v`2lp}oHZSʜj*Gy.aAU'Q̧1I~ȡv+8jUEj) F[C $xkSNXLGwv8Z˯o&EPĵ@ 躀6YÆM+Twnv_yM-C@A֊ld&H eJYCAcm'e2M X79 NvX"n1{p*A'\ϛ`Y`E0 !$j?S4")t=* [{ͶC.#q:d;ap]*j Ƹ8QOyѩb(2G8eГu !>\J(Vb*Riȶ4jv X}7LRGCHͨuać`'˱z ++d$muG>;D_KcNA./WYu fRb"C[9|gHh̤k*p=V // Ut-eQ39ߵM= N%X9Zfǖq)Z4&H=R;E)Lvue"Rb,u#5_+Ő3G yLF*ёs GjCw:I:lq!3"X )0F$WP\9}+R ^XzNUh\p>z9F@q$NYEzW{2b3v, \Fyj㤕 b"78rc׽̨%2`ZY܄%dڎm tcQ)l_^i@~;8C^:^f^[˃W9ȝ¾n6(_%6&/ igicAm A;p|.v =lr]RLo?YI<3kX,z%t:F(mUiog/WD0O~keP\wA-}3@$2&Ћy׏ %VAãqYʹGu6"qߌ,?[z2ܙOTMOa$o'ad!i` ,BMa:ZOyA[k4(;4k~IM:ި୨؃Z&r#s*}ɄhXr1 ԝ/ F^cS! *xIJyHi ]=%~2̭c4N0D9 o,ţ,[} Mu%38ϪL ^- 9CcbI|d/PP!L?嫝RԮ%;W?SPmj@JwrPTt@dͣL;$~3^wsYgcM?Mթ&Bx)O}- br~^_GG6uTt-ԡc;?\ir22{E}ػ]rBs|)U(/uB=Bgh};%X+fXe)D6 zrB1y6  H=VʅI̫&-$ 1{Jkw˾X a񑦵0Et@Quk# *$Vf?ӡ%.>rU6hXo/dww$9s-ݒN:rhӕ;XVm(eIH}NFؔa1 V[j4G&'XL#ڕJi aȩ)Et-=""nބX9x^̳*gjByvb0EHI y A-/w•n )NU W!"F}4zbk(0\čpq<u2q l4ۃd}.Z/yʫX'B  |P†Xi&~L*uKR U2?W Y5XX>:2ڭfTa\ j~#?)9Ő%ќrǐN 5cEciI\7 C}8p"x0Hí|#d,x>'L1LuQ. >]ꖲ;I x} "W2|xLт(%4BRVV ^B 7V O=ә zUH%a%vE}HdXxe|[iiN,svi"q7F]{πfe\2l FV-G9>)Xλ4om\&[@E)7C6|8l7jm{{Ti+&)O쭇:%~CI: ϩ#9 ղqi~лCCm9l9;u 8yd3hCji## ivk3WW-qN2E[aF;ʺTpElQZ+ʏ)tXXC¶G\Ѓw2ӑmly@i4T+GQXV$Q5p4nW"Ҭ[DcH>$ X'rų1 `GP=DX%皛Мz5$y%Ix!4uM"SۭVhq{,' qiEʉFp,QzG3cwAv{By0mJ[p5}46~gFi,Vѻ{+X%zM)LGEf:STKqD+~e+շwYk/^^MQWYՓ 9a4pe_4#=z ]J0-anE*Pe51 ߮o_j$lxE(mPہN~V됣苧?TJ2hӂ{2p=$r)J1WjvS$4CIhxg<ْeue4PA, {rN/'Һy//t A8D1( 7|#Hc+}SǝFi5EyX"f2a§8^{ܶtbn0B?4OBC. #@E+9Fӟɒ'y[ J<\Ή}t87'yF׌[ ɂђ޲4a=M KL_ŝZ󗧠i26\`b%]0qbcGdޙ%RͭhRoʟ?oL|fسdLF6n ȎlEk4oZ''Xm5É15r%(]67 0eAOZJ'D\N껉!0~v^ֽ%)0bb)0$Ɠ}m9lF b (Db6kdc7ڑnTَ]/I۲\Ã8&_(qeLR^ \jj&MXTMPmhf̒i[>,$5_i]/ |߆Mx Nydhuû"W`Сj7)|\yG68z9qrYz) - )EͰ`MJ:=4‡ UQ{Ǻ]ƭ3TT$ K.cE#Zbn@ļ0HӰ"_Q-~]H&@HVra8gX;r-a'|VGI.YM砇kIy8Q+9Pz/j!<\Y/^2?avǺXG:]%\ȁADw0P_q%iM7Ȧ1 ?gz%C](ͳب:xſqx,go}uj܉-M|2VvwxmG@{4 G`mtvxA}Juޕ(ژCNAp)ijR0bEf"ul;9BHBnajE'ȯH wNu AfOsAw zWsS^!=f5LkA)ԈO;v5j7\:IKj$y űZ ,8N)R[sUХjQ\p)Vj:պ u:cF)GdRQfDpBe;up˨~s`(WGۺ}[dESܞ0 8K0-c_y׹X ]*+Pc1inU%"ذ6^ĩ2]7hb<+C7Ɯ[9Dz:iϤNhúOd%g6,!n;# C6u1 RB(23%E4`s>2ǶaȜjRQJU"2ůGBUK: P# :3̟+oʂ~!=?lw9LKܧCҌImpb꺩('.Ӫ˛K78! ݎCBXPQhއZ mI`G(=Uў/UåX 1QMo𩃢rvl^.&Ӓ n\|n|9f!K&ܨ:YV =Θ?uWjjop^YGGԌ3S14aI4KB.kg`uM=ӧ~PsE ڴ{/~G" &JR[2/Gjb jvJF سc4P=1@ mlC w4w  P'6S ^)SBZ'02CM#JYR<_ƚN"`VW-7u7[MX'YFƕޒ<[]V1al!hwH29RuLCV]uuoU>UǤBff s `6ҀDEt(!} P )N*Tɩ`NkLr~XgaY%kEu)sm]^6 0nM{@lL"佃g\܍k͇ ~NȀ (w+ԏSql[ABy~#syuI^rn?M~51^TOF:ڪHiӷU.uis>Lt%CMV:b8Z?%[ *#\y2bM;X0#Zr5, AjHT7^/v3EWX?k__{',vc ʸ Fz)!oWOz :7؝Ey@2౞yÎ?%hwsl4̺jV;ǡ VpZ tJѤD8 i .J wˑٳOk7ɚ~K*ʙ$d#Zv?iag[F[tPl00/ohvn)LŞ`gosc naEG+ *n\. cQqXEcV1[394n+(FV|Dv|BbJR ^1M DwnJ@ pX\(.:{SQ{!51>RM4B,ޱ-[BI(H%sgU`7#[0z,Є_)$OP ^8G~qXjjQDnkYA6DPboEm3C|KOȂ^aO+rN X1sN Ɗ/j\Ӕ#3"Gf׆X+L,#wEN|q+n-<.)3 ` _ V߮@Fa7 0~/_v} 89%f.\WWpD\ ix5"D4]n6F)5['_!%zMY fi Gm5!r"΂g,xDwsum_ lGB=L"P1 ?}F7RrMrFʈy<' C[,eGdgaQ~)5oHk73wSҁ}Y{-o݃\<雪'Hn)'x-C+E&4 Y?(I;m'Fsg[C¶2X#}?Q pHit`.g)]#] lk;ONh3-63N^>A{/*!͉$:)X)CKP K9uTu+0BcgdInA@0/~of>A`{`;CqpxW0V!Vf;(nM9GrD x~'G =u4-NgN%ψF#P3P6Nu,E`m^eVkeF_dŸcmCQ+Xv+R=Vm* 88ͨa ZuIl;S*z-Yvnbʷ.\tmk?q_Lc)5@մ £tE-hWm9c89eɱl\K}[ʬrn }S-.JwQ%{mg6LIeqwQi5P cwX;Tp}4jy7>x" 6"gʳEA|Az{ЪУѿdʀ9uYJF]n(.`NseKRj֓"le* 4m` QПN* }#ϩFlu9B=. &ܼJmfdaν:)`oR-Rz犍!ĩ;w[\a2$`=Ry3l-r$C߀.Z\Qy;;tHpߣ.bnp@׻.4z¯-xK!˰X&.uLw,l瀕#p'_W,-1Lv*{d)QCyhDEML0"P5a`rs9]/6nl1 3ҴRܶ~Q5f0_W)*^2 K&VF>0# a$ - qŞ+ru;YE_ד>AP|6u ժt*OQ"bHt*W/1{B4䑄 IWy|j2 ҍ,Ro4lO]'P˟*FێgR+8J7IrYZ1uWjX^0tN9z,KYq[WyiJ}M[zqwk&J`CղUE%!Q _Ͱi8XuvYE@} ö]ah~M\P]SkF)lQi3-B'8h?@Ĥ} ā$2~FgwVNyWUp}`gU7O.Q'ѱsixGtOć}ݔi-lQ_~g** n^g+ 7N`SʛEL ׷2My-ȏ%1we+"6"\NYO2r*fZ2-RA]R+pGHpĹ'|e+z呍I3zZ 0D!5M5@=he f`ˡ89G3Geufx5e9e>O:gg 7j^\U)[AnaߠKu.Q$YcNf|QFg5UQ,ujamOݡܥC0bC`¬+< [ZdV(MTIzt*I9 ֑΀Z_1\2i4K/fj䦣<g# n$ZѶJ[9%IC,9IHGBzݜ{X:& y@ќP02g 9e% &r3ybl|2/È7mtj7`ҸT67J1QVѦWz#T\csKI?qɟJ,#)rcs CW֖(2*6}dJ>M.m{Jx{tc-32f;:S ]1kGA .z*w0vH! BAIC-3(=K7^t5| S4ipt߾lJzi-#o?tpx- pDr C-0 v@f{:4R:Jo/̴7uP9ߪM'Ђ=I3{Z]؜U28mF/nO:B˔uj)NZ쥼90>:TfXb"7MG'k.!/:">֟*>- Ox&a!$~7* qtra>K{u5$P6{8ץS{R{PZxL6"~{ R^ sγ~4Wݮcidw(eЊ<{W 2 ZԔgx™3<sCb"SfIU+ο2r?Qfyʘ}! uXAl)ȧMj2\@~~A;s6Łǩ ]:*eE!v#""Aʑ+=1OO%Σkqp7yy ōzRBaZ:T FNoqn.…$U6s cP n->=b͖t 䡧 ͞2 ņ*y.?zCc JV Q{ǜIe1i`<.֌^  #x Zuw?fHeȾ5Ay1Ob I&:vmWU>}I~֜Z5q' ۅZAY^- !kCFL\ꏞٝףu1u-":\;2R-Tr|qzeV~{J\H2vĈ4LK($ԪŅPO|B(atrZaP+o;`iU12{zNT)@E$"Y VYOCe c={fxIn`K~!0!M3nJbO`j?E\`Ln9m,`*9caU6қA2YjnQU׎<Tn]\lQE_x6/D8aq.o=b؇CFb hIG(-3iHVAז|RsZ6n/Lz(N)=H6E8qҭ$;lcb5[{tALmrzc!+Kdj-T /zcqtO;R'Er I"E.{6݁"ŵyGr5Dz綦)x."2w y W'>>==:O]duC^/wkM{G]}̲C NutXf dL:K?knN?#FYa< H|+1^खd}^} &=]Kdz*q˯GK!>R`M^|CF3?BX OMb uNkBjڀ }qͧjEh]m =MWBEkܬh`dWIoQ=/do A~޸6`J0 }ODHJ26!\t@aFOޖ3|kŭ} sbkQOЃj PPKʙdyVMU3И 2;"|KX\hkjx|Cc؎l?B|P%op2N4Y#ԵF8 p%6Ƌkʣ4afx>ڼ_˴ޔ`e@Yo ^d-b-v5z%VN i4ŒBw0jA<B$/:hBǎ$阘ugh]M]6Na4wF` mILͶ)( b<8^iyX/:AiyBzJ+S q yNc$`qB!5(ԗpC{Ga/a)CȷxmI LQ>L]ֹؚ,>KiCeeU*J^߮tIB11)i N9>8Hvءb\|"OB:3+߅}gNwF`q̕C3t+HD05uJIKgl3ARٰfE6fz ٬v}H`KHfò~ Y*V#m0˖T$/8DܳgOlr5N}W8o{mT\J|ScH$Oٷ))fU3$!h.i1c=0=a`phT7j=71jB*,uPɽӢ޿Bk 7b|Hnr^(A/kAJ~m`#Lt88Bg0=|ZmfrtBz8l0V.Gw@֪ "JP()8mIrRNN:@[ u,BO,9O > Mva&զ @Ʈ "cE BV&@*PECJ(R 5ʌP1-:5}Q_ćel# P,&5hFsPi5gxR¯G'0CLfL7mF1kh]" BН:qaUңϖ@@N-<wAF.ͧPP`Ren7B lղ@?ٸ~džmы*|dJ}IATfL"(1St$Up] II͝\E#L*IĶ=zEpJpP |LQǴVz">N+N@*f" w-ޭ{w4/7v[toh'czkk~p\|#+IyZ]K0HkgL=x.Q߷|C!˳ oR(t(0'a[}sY'F*։Z< 3/o0XO$3xp6#ZE P}R?pKFAZwׂ l2ӑJN$^\GK9,6QNYmyq@}-[J8C{ i!oS#=ӈj4Us]x3RBKNOS]~*8U*ژMAy]ni7G~PAW,"ܝ),j"8r&&!iAR f;VL7uJ;E?~DnS +^@kqbBsY6eqNW8!%xq/'Ah (Q Bޖ)/ڰu#b>31q  aZ$"")b#.a:ʊ;꽊SrrNP,K;Uѹ{l[8,{tW!RjN/3?Y mnHp& -:gh5Vz!؜_r KӈaOS-VҾM7.yg=(jdm2 ruc] X߹S"pqflg /c0ӂuo_yNG -@8Sθfm#tB&Jqȑ~;wZǹ,,% YW ?--wj.NԺ `}6kzg]Y8~F)vVŹ?i {%WaToQ-iLpm! zT1$!SCx+ӺCHv4]MqP7 Dj}"(Xs+N{V vsy0Bqt]zvG?@1|lg9Tk&};4dL !9|jnQ1 t2j;\"wNgʊ]EadkrHzKيxHalhe(X$y]PZ ExľpN,9~rqڙX鑠m%o#IsR~ז.-U\VnBBVgu ?O*B sh()p%]z،G-If&+833'Mϊ BDQP?y:rF*a mQһS4%k,9ǟw*`|IZN>ɚPh`sVNU %0j:[ozЬpyY{Y?Q$%^dxwb'}ZY"7ϳf?+!>o8틅QSAZVűmԐ7LU7"OoU{Q} XSm\?tXte/p~4 3l/ߞS$^ażNPkcTlLܐ= KN^ ;? ݷ:2HKY ueG^gU#džIGLlÎ4" †"/&nw^0c9e[ ~>3Ey!iN%Xצ1w " Sj`$ iٿhL)/"l, ҳw"ʃQV+w;=GVm9(aa\aAX8k 16Yj2ZrfyeR|)Cvz) u^:}QR@TY;d+EnAhoTvEu/Z_kdžPw¶u] Ok`Y);ʾhYV!M˹FZ9 j*;yWb +k 71cnV?5H vCcp8ln#]p`.%i"u58CJKh@4mTd4{ *!BW͒i6v)kF=x5|^'R^e#ޙȆ0%T#ʌ#OZ[ CTyuқv-mdFjz'yyTUAÙt5 2]L;rءE_ sP/8I)+f:ǿ*z?yI%vv}Ȱ:5K0uV_Q^bS, z67NӫMy` q -VǬ%Q.넚?>HD?_aE+D@N3Mj`IJ]Z_=5WQ'j9 6bD%BTu`ע3koLz]f߁`~!,iCX,uyءkʙGG?FF,sG~p;^L /clkE7[m]#3Efo9Wv[ ,S 5Lδ{G:͋=0P7N|c_8`eN) cRۥ\_:2>5:hŶA٬ \?R.U}l$R'R |ĸ¾7X SK=CpP/8Fb;,ZPVj8mބw fJ+-љSA5J]JOZ8`mjm0@2~Di zvǚC8ݭ~ILH)~KyfPxθn)'rƴ@>6=aa>]yǩ:'%8-Gm~=5G syƘ ##,Q=ϙT~V(ԺPOq8@>YOzj:ޣ"$+)*gTgcNsgpf. vW ~@jHV!QKoyeT膏@GW<$ (O۰S&آ 3#@ҏ Xpjy.L'֚ײ>r3[*ۋ7cfScӤ 2"c&\Y!v[I'}5ce oSK2uFBYERD7F/]OaaeyFgұj<~:]AЫyf'תֳ:K+r<'OY|v_y#5WZߗ)_?|#b,V׬uٱ}WY(K@F awh ,A : *6#e$ R"S)I$"Y)LKU(֜퓳= u].C gvH$x,czg SqPⱼKܡZ nmUs2n /Y{#rh.ޮ0Ꭽ%|~ 뙴늆蹻=^.:BQ"I \xp?f1sv)ʼpG} ea55|Q:%&kҩDƞJ=Ok;Kbo.țY `Cw fH%#Hnp:`RrFlF'e_K mp;W3pSSxнF+U6J"ɉPҀmfA1(X0Lk:) APtvyȼ3]tXB1)M~VbMVw&rR@E,+w̞g"juއ^݄Rշk (gQ WdbK8%v $֚WR/bt7IhThyjLTӪ9]Sԋ,fӞIr<YE7zdX O/Ug S0#(oqKq{˖CژfܿUȯ13ݞXOlxF6h?}Mq6-2OFr|OE ;W|4{|6=H P߅\д}Yɾ:or.{{1wMYմ)T> t"F>i;;fI#ݶ̥UQ^E=kCO1E\ؓVTmMToO1~aiߟY*}PPڢRS0 E8â>] "hs Ū݇;zٝ>< |qO Z5y7ïCF%nYMnF^Kä>3&_:z i6~M>NЉ|Z*:zqOj7]|i Kb $g4'<+&Ӣ'߾6e!ˁۡp{~P@{np5Wg(&p _pZMj;, uH+%4(ngJ4k>:fW~ӎBǟNM0/(7Mk_±/֮E5) Q,ȆPB@:=u\@fd'Y*acV ح 0ӵ*z"=ivJ*'Lvv 4vXkW`6pL M/$j[&{ xDPA`SWh=m*@*MdrW`Y'*_?cCJVyS J4/_|b%Z?A,hm>H&WaӎTX`!oz.eﮒ/+f(*G'mv%3X )(s\\O=yN$>7ԽUY.^˺GAs'o`m㫬r5!(S'}cS]aaH?=_D6d^zj+ a\?VE&uxki=S28A̻^/SfW _=憶˅J&%%hoh)XTKq碁3PP4'Gyu"!=c%Y`n95Ht_iolJv2\O^L*X\ʢxYQL)ޫ/abaSxX+柪{S*ԩ%Di/wyI^xF./vț$"?KюGDW19WP,ɚЦI,L!H&( mEM"XFN,}E,5w($r3W!84>P@)BD‹xxE}lz%a&ȱ?f&Zi̘`EBTU)M {7(V_$(HcV^\'>cnQ@JlOT׸|M!C<d:''4 NOFij L$HPa,J<&c0Bk=Kp|{e'Q^5898m 9|nW'ݧC{v [;}r%:>/9n-,?`OĈ^m:@!ט9@ c6Y؜(Gn>"ӈ/ڨ4'܃m#uV?LQ՗Tݥ'~{/^oEG]#(-v ;C[w M7ѬhwŘc Z,ljg_x h{5p|#$>0H, `A az3asҫN'Rr9[[ia&'+K}C젩cotMI%J&lohqb=Xsr)u-d.}hMZCbJ\;@ϴo6&5/Y-|Z-mHHjи"/>6W8|}Qҍy<1,Gv8Z-RG,=xڡ,;N/^wh^k+]}ɏ#J>?K"T0n\&ܢ e+sPie7I.J+$"V3=`(d0 $O0 O7H9&Zi+90HVȺ4Rf{Htola -V^KT?ǹ6g)Htv63B(k釕l ttMPB  2הQrqSr2U&VY+JCˀ(a#k.?SDiEc{$@n Ϛc"c~Fa;pvQ&YAr lHHpp$ dW.~s*]-:g8AhǺ:;L \{U&Д=Dyucڃ1 hy8nXT~m Mo o8}< 45?Gv(Ս*V䟝Myp3L^7]jΗY ¥̠\?g}6Avzͯ. \bI,8Ŕ_-{ XHKZ%転 5SjqCⲘM{9oRBa0Eb(n[_Eۮg=fB(2,1XlafSY [F/l.g G1&HD?=gG;VМOo\W:qeFB/~8v8lޚvM OjU xATtbrٖ>