aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMeik Sievertsen <acydburn@phpbb.com>2006-02-12 19:21:00 +0000
committerMeik Sievertsen <acydburn@phpbb.com>2006-02-12 19:21:00 +0000
commit81f78690dbcb0bb90304fb5e2b7343866d371615 (patch)
tree13e813246688812d944a406a351ee6c57134b82c
parent3f323153b5f201dd7954c7f4ba6da53c98defcd0 (diff)
downloadforums-81f78690dbcb0bb90304fb5e2b7343866d371615.tar
forums-81f78690dbcb0bb90304fb5e2b7343866d371615.tar.gz
forums-81f78690dbcb0bb90304fb5e2b7343866d371615.tar.bz2
forums-81f78690dbcb0bb90304fb5e2b7343866d371615.tar.xz
forums-81f78690dbcb0bb90304fb5e2b7343866d371615.zip
my turn to break things... harharhar
- checking in permission settings and permission masks - permission presets and documentation not finished yet - added backtrace function to determine file/line for sql errors - fixed marlist for orphan attachments/groups/logs/users - able to change anonymous user settings/permissions now - re-arranged admin permissions a bit (added some and removed some) - setting forum permissions after creating/editing forum now selects every default group (copy permisson/dropdown to be added for adding forums) - finished user permissions in users acp note: the layout for permissions might change devs: please empty the user_permissions in phpbb_users. Also, first change your auth_options table, remove all cache files and then re-set admin permissions. After having set the admin permissions you can update your modules table (else you will not see the permission tabs) - or empty the auth setting within the modules table to be able to see the permission modules (they rely on newly added permission options) git-svn-id: file:///svn/phpbb/trunk@5553 89ea8834-ac86-4346-8a33-228a782c2dd0
-rw-r--r--phpBB/adm/images/arrow_down.gifbin0 -> 113 bytes
-rw-r--r--phpBB/adm/images/bg_hash1.gifbin0 -> 48 bytes
-rw-r--r--phpBB/adm/images/bg_hash2.gifbin0 -> 48 bytes
-rw-r--r--phpBB/adm/images/bg_hash3.gifbin0 -> 48 bytes
-rw-r--r--phpBB/adm/images/bg_hash4.gifbin0 -> 48 bytes
-rw-r--r--phpBB/adm/images/gradient2b.gifbin0 -> 192 bytes
-rw-r--r--phpBB/adm/style/acp_attachments.html22
-rw-r--r--phpBB/adm/style/acp_groups.html2
-rw-r--r--phpBB/adm/style/acp_logs.html2
-rw-r--r--phpBB/adm/style/acp_main.html14
-rw-r--r--phpBB/adm/style/acp_permissions.html318
-rw-r--r--phpBB/adm/style/acp_users.html15
-rw-r--r--phpBB/adm/style/admin.css163
-rw-r--r--phpBB/adm/style/overall_header.html20
-rw-r--r--phpBB/adm/style/permission_mask.html179
-rw-r--r--phpBB/adm/style/simple_header.html34
-rw-r--r--phpBB/includes/acp/acp_bots.php2
-rw-r--r--phpBB/includes/acp/acp_forums.php16
-rw-r--r--phpBB/includes/acp/acp_groups.php1
-rw-r--r--phpBB/includes/acp/acp_jabber.php2
-rw-r--r--phpBB/includes/acp/acp_language.php2
-rw-r--r--phpBB/includes/acp/acp_logs.php6
-rw-r--r--phpBB/includes/acp/acp_main.php28
-rw-r--r--phpBB/includes/acp/acp_permissions.php739
-rw-r--r--phpBB/includes/acp/acp_php_info.php2
-rw-r--r--phpBB/includes/acp/acp_profile.php2
-rw-r--r--phpBB/includes/acp/acp_users.php48
-rw-r--r--phpBB/includes/acp/auth.php978
-rw-r--r--phpBB/includes/auth.php46
-rw-r--r--phpBB/includes/constants.php2
-rw-r--r--phpBB/includes/db/dbal.php10
-rw-r--r--phpBB/includes/functions.php72
-rw-r--r--phpBB/includes/functions_admin.php2
-rw-r--r--phpBB/includes/functions_user.php7
-rw-r--r--phpBB/index.php1
-rw-r--r--phpBB/install/schemas/firebird_schema.sql20
-rw-r--r--phpBB/install/schemas/mssql_schema.sql30
-rw-r--r--phpBB/install/schemas/mysql_schema.sql27
-rw-r--r--phpBB/install/schemas/oracle_schema.sql26
-rw-r--r--phpBB/install/schemas/postgres_schema.sql26
-rw-r--r--phpBB/install/schemas/schema_data.sql206
-rw-r--r--phpBB/install/schemas/sqlite_schema.sql19
-rw-r--r--phpBB/language/en/acp/common.php8
-rw-r--r--phpBB/language/en/acp/permissions.php127
-rw-r--r--phpBB/language/en/acp/permissions_phpbb.php222
-rw-r--r--phpBB/language/en/common.php1
46 files changed, 3237 insertions, 210 deletions
diff --git a/phpBB/adm/images/arrow_down.gif b/phpBB/adm/images/arrow_down.gif
new file mode 100644
index 0000000000..e45c365ecc
--- /dev/null
+++ b/phpBB/adm/images/arrow_down.gif
Binary files differ
diff --git a/phpBB/adm/images/bg_hash1.gif b/phpBB/adm/images/bg_hash1.gif
new file mode 100644
index 0000000000..61163679a8
--- /dev/null
+++ b/phpBB/adm/images/bg_hash1.gif
Binary files differ
diff --git a/phpBB/adm/images/bg_hash2.gif b/phpBB/adm/images/bg_hash2.gif
new file mode 100644
index 0000000000..d31840361c
--- /dev/null
+++ b/phpBB/adm/images/bg_hash2.gif
Binary files differ
diff --git a/phpBB/adm/images/bg_hash3.gif b/phpBB/adm/images/bg_hash3.gif
new file mode 100644
index 0000000000..40bc7e1b5c
--- /dev/null
+++ b/phpBB/adm/images/bg_hash3.gif
Binary files differ
diff --git a/phpBB/adm/images/bg_hash4.gif b/phpBB/adm/images/bg_hash4.gif
new file mode 100644
index 0000000000..54e7f0019f
--- /dev/null
+++ b/phpBB/adm/images/bg_hash4.gif
Binary files differ
diff --git a/phpBB/adm/images/gradient2b.gif b/phpBB/adm/images/gradient2b.gif
new file mode 100644
index 0000000000..a8107659e2
--- /dev/null
+++ b/phpBB/adm/images/gradient2b.gif
Binary files differ
diff --git a/phpBB/adm/style/acp_attachments.html b/phpBB/adm/style/acp_attachments.html
index a08a0f3d85..4d309e9b76 100644
--- a/phpBB/adm/style/acp_attachments.html
+++ b/phpBB/adm/style/acp_attachments.html
@@ -361,24 +361,6 @@
<!-- ELSEIF S_ORPHAN -->
- <script type="text/javascript">
- <!--
- function marklist(match, name, status)
- {
- var object = document.getElementById(match);
-
- var len = object.length;
-
- for (i = 0; i < len; i++)
- {
- result = eval('object.elements[' + i + '].name.search(/' + name + '.+/)');
- if (result != -1)
- object.elements[i].checked = status;
- }
- }
- //-->
- </script>
-
<form id="orphan" method="post" action="{U_ACTION}">
<table cellspacing="1">
@@ -403,8 +385,8 @@
<!-- END orphan -->
<tr>
<td colspan="3">&nbsp;</td>
- <td class="small"><a href="javascript:marklist('attachments', 'add', true);">{L_MARK_ALL}</a> :: <a href="javascript:marklist('attachments', 'add', false);">{L_UNMARK_ALL}</a></td>
- <td class="small"><a href="javascript:marklist('attachments', 'delete', true);">{L_MARK_ALL}</a> :: <a href="javascript:marklist('attachments', 'delete', false);">{L_UNMARK_ALL}</a></td>
+ <td class="small"><a href="javascript:marklist('orphan', 'add', true);">{L_MARK_ALL}</a> :: <a href="javascript:marklist('orphan', 'add', false);">{L_UNMARK_ALL}</a></td>
+ <td class="small"><a href="javascript:marklist('orphan', 'delete', true);">{L_MARK_ALL}</a> :: <a href="javascript:marklist('orphan', 'delete', false);">{L_UNMARK_ALL}</a></td>
</tr>
</tbody>
</table>
diff --git a/phpBB/adm/style/acp_groups.html b/phpBB/adm/style/acp_groups.html
index c083d930a3..125f39d70d 100644
--- a/phpBB/adm/style/acp_groups.html
+++ b/phpBB/adm/style/acp_groups.html
@@ -210,7 +210,7 @@
</div>
<fieldset class="quick">
- <span class="small"><a href="javascript:marklist('list', true);">{L_MARK_ALL}</a> :: <a href="javascript:marklist('list', false);">{L_UNMARK_ALL}</a></span><br />
+ <span class="small"><a href="javascript:marklist('list', 'mark', true);">{L_MARK_ALL}</a> :: <a href="javascript:marklist('list', 'mark', false);">{L_UNMARK_ALL}</a></span><br />
<select name="action"><option class="sep" value="">{L_SELECT_OPTION}</option>{S_ACTION_OPTIONS}</select>
<input class="button2" type="submit" name="update" value="{L_SUBMIT}" />
diff --git a/phpBB/adm/style/acp_logs.html b/phpBB/adm/style/acp_logs.html
index 5d3e49a6a7..4603561d28 100644
--- a/phpBB/adm/style/acp_logs.html
+++ b/phpBB/adm/style/acp_logs.html
@@ -62,7 +62,7 @@
<!-- IF S_CLEARLOGS -->
<fieldset class="quick">
- <b class="small"><a href="#" onclick="marklist('list', true);">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('list', false);">{L_UNMARK_ALL}</a></b><br />
+ <b class="small"><a href="#" onclick="marklist('list', 'mark', true);">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('list', 'mark', false);">{L_UNMARK_ALL}</a></b><br />
<input class="button2" type="submit" name="delmarked" value="{L_DELETE_MARKED}" />&nbsp;
<input class="button2" type="submit" name="delall" value="{L_DELETE_ALL}" />&nbsp;
</fieldset>
diff --git a/phpBB/adm/style/acp_main.html b/phpBB/adm/style/acp_main.html
index 4b754c3c74..1b521e1ec9 100644
--- a/phpBB/adm/style/acp_main.html
+++ b/phpBB/adm/style/acp_main.html
@@ -1,17 +1,5 @@
<!-- INCLUDE overall_header.html -->
-<script type="text/javascript">
-<!--
- function marklist(status)
- {
- for (i = 0; i < document.inactive.length; i++)
- {
- document.inactive.elements[i].checked = status;
- }
- }
-//-->
-</script>
-
<a name="maincontent"></a><h1>{L_WELCOME_PHPBB}</h1>
<p>{L_ADMIN_INTRO}</p>
@@ -140,7 +128,7 @@
<!-- IF .inactive -->
<fieldset class="quick">
- <p><a href="javascript:marklist(true);">Mark all</a> &bull; <a href="javascript:marklist(false);">Unmark all</a></p>
+ <p><a href="javascript:marklist('inactive', 'mark', true);">{L_MARK_ALL}</a> &bull; <a href="javascript:marklist('inactive', 'mark', false);">{L_UNMARK_ALL}</a></p>
<select name="action">{S_INACTIVE_OPTIONS}</select>
<input class="button2" type="submit" name="submit" value="{L_SUBMIT}" />
diff --git a/phpBB/adm/style/acp_permissions.html b/phpBB/adm/style/acp_permissions.html
new file mode 100644
index 0000000000..a3fe26426f
--- /dev/null
+++ b/phpBB/adm/style/acp_permissions.html
@@ -0,0 +1,318 @@
+<!-- INCLUDE overall_header.html -->
+
+<a name="maincontent"></a>
+
+<!-- IF S_SELECT_VICTIM -->
+
+ <h1>{L_TITLE}</h1>
+
+ <p>{L_EXPLAIN}</p>
+
+ <!-- IF S_FORUM_NAMES -->
+ <p><b>{L_FORUMS}:</b> {FORUM_NAMES}</p>
+ <!-- ENDIF -->
+
+ <!-- IF S_SELECT_FORUM -->
+
+ <form id="select_victim" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_LOOK_UP_FORUM}</legend>
+ <!-- IF S_FORUM_MULTIPLE --><p>{L_LOOK_UP_FORUMS_EXPLAIN}</p><!-- ENDIF -->
+ <dl>
+ <dt><label for="forum">{L_LOOK_UP_FORUM}:</label></dt>
+ <dd><select id="forum" name="forum_id[]"<!-- IF S_FORUM_MULTIPLE --> multiple="multiple"<!-- ENDIF --> size="10">{S_FORUM_OPTIONS}</select></dd>
+ <!-- IF S_FORUM_ALL --><dd><input type="checkbox" name="all_forums" value="1" />&nbsp; {L_ALL_FORUMS}</dd><!-- ENDIF -->
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input type="submit" name="submit" value="{L_SUBMIT}" class="button1" />
+ </fieldset>
+
+ </form>
+
+ <!-- ELSEIF S_SELECT_USER and S_CAN_SELECT_USER -->
+
+ <form id="select_victim" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_LOOK_UP_USER}</legend>
+ <dl>
+ <dt><label for="username">{L_FIND_USERNAME}:</label></dt>
+ <dd><input class="medium" type="text" id="username" name="username[]" /></dd>
+ <dd>[ <a href="#" onclick="window.open('{U_FIND_USERNAME}', '_phpbbsearch', 'height=500, resizable=yes, scrollbars=yes, width=740'); return false;">{L_FIND_USERNAME}</a> ]</dd>
+ <dd class="full" style="text-align: left;"><input type="checkbox" id="anonymous" name="user_id[]" value="{ANONYMOUS_USER_ID}" /> &nbsp;{L_SELECT_ANONYMOUS}</dd>
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input type="submit" name="submit" value="{L_SUBMIT}" class="button1" />
+ </fieldset>
+
+ </form>
+
+ <!-- ELSEIF S_SELECT_GROUP and S_CAN_SELECT_GROUP -->
+
+ <form id="select_victim" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_LOOK_UP_GROUP}</legend>
+ <dl>
+ <dt><label for="group">{L_LOOK_UP_GROUP}:</label></dt>
+ <dd><select name="group_id[]" id="group">{S_GROUP_OPTIONS}</select></dd>
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input type="submit" name="submit" value="{L_SUBMIT}" class="button1" />
+ </fieldset>
+
+ </form>
+
+ <!-- ELSEIF S_SELECT_USERGROUP -->
+
+ <div style="float: left; width: 48%;">
+
+ <!-- IF S_CAN_SELECT_USER -->
+
+ <h1>{L_USERS}</h1>
+
+ <form id="users" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_MANAGE_USERS}</legend>
+ <dl>
+ <dd class="full"><select style="width: 100%;" name="user_id[]" multiple="multiple" size="5">{S_DEFINED_USER_OPTIONS}</select></dd>
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input class="button2" type="submit" name="action[delete]" value="{L_DELETE}" /> &nbsp;
+ <input class="button1" type="submit" name="submit_edit_options" value="{L_SET_PERMISSIONS}" />
+ </fieldset>
+
+ </form>
+
+ <form id="add_user" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_ADD_USERS}</legend>
+ <p>{L_USERNAMES_EXPLAIN}</p>
+ <dl>
+ <dd class="full"><textarea id="username" name="usernames" rows="5" cols="5" style="width: 100%; height: 60px;"></textarea></dd>
+ <dd class="full" style="text-align: left;"><input type="checkbox" id="anonymous" name="user_id[]" value="{ANONYMOUS_USER_ID}" /> &nbsp;{L_SELECT_ANONYMOUS}</dd>
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input class="button2" type="submit" name="find_username" value="{L_FIND_USERNAME}" onclick="window.open('{U_FIND_USERNAME}', '_phpbbsearch', 'height=500, resizable=yes, scrollbars=yes, width=740'); return false;" /> &nbsp;
+ <input class="button1" type="submit" name="submit_add_options" value="{L_SET_PERMISSIONS}" />
+ </fieldset>
+
+ </form>
+
+ <!-- ENDIF -->
+
+ </div>
+
+ <div style="float: right; width: 48%">
+
+ <!-- IF S_CAN_SELECT_GROUP -->
+
+ <h1>{L_USERGROUPS}</h1>
+
+ <form id="groups" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_MANAGE_GROUPS}</legend>
+ <dl>
+ <dd class="full"><select style="width: 100%;" name="group_id[]" multiple="multiple" size="5">{S_DEFINED_GROUP_OPTIONS}</select></dd>
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input class="button2" type="submit" name="action[delete]" value="{L_DELETE}" />&nbsp;
+ <input class="button1" type="submit" name="submit_edit_options" value="{L_SET_PERMISSIONS}" />
+ </fieldset>
+
+ </form>
+
+ <form id="add_groups" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_ADD_GROUPS}</legend>
+ <dl>
+ <dd class="full"><select name="group_id[]" style="width: 100%; height: 107px;" multiple="multiple">{S_ADD_GROUP_OPTIONS}</select></dd>
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input type="submit" class="button1" name="submit_add_options" value="{L_SET_PERMISSIONS}" />
+ </fieldset>
+
+ </form>
+
+ <!-- ENDIF -->
+
+ </div>
+
+ <!-- ELSEIF S_SELECT_USERGROUP_VIEW -->
+
+ <div style="float: left; width: 48%;">
+
+ <h1>{L_USERS}</h1>
+
+ <form id="users" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_MANAGE_USERS}</legend>
+ <dl>
+ <dd class="full"><select style="width: 100%;" name="user_id[]" multiple="multiple" size="5">{S_DEFINED_USER_OPTIONS}</select></dd>
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input class="button1" type="submit" name="submit" value="{L_VIEW_PERMISSIONS}" />
+ </fieldset>
+
+ </form>
+
+ <form id="add_user" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_LOOK_UP_USER}</legend>
+ <dl>
+ <dt><label for="username">{L_FIND_USERNAME}:</label></dt>
+ <dd><input type="text" id="username" name="username[]" /></dd>
+ <dd>[ <a href="#" onclick="window.open('{U_FIND_USERNAME}', '_phpbbsearch', 'height=500, resizable=yes, scrollbars=yes, width=740'); return false;">{L_FIND_USERNAME}</a> ]</dd>
+ <dd class="full" style="text-align: left;"><input type="checkbox" id="anonymous" name="user_id[]" value="{ANONYMOUS_USER_ID}" /> &nbsp;{L_SELECT_ANONYMOUS}</dd>
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input type="submit" name="submit" value="{L_VIEW_PERMISSIONS}" class="button1" />
+ </fieldset>
+
+ </form>
+
+ </div>
+
+ <div style="float: right; width: 48%">
+
+ <h1>{L_USERGROUPS}</h1>
+
+ <form id="groups" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_MANAGE_GROUPS}</legend>
+ <dl>
+ <dd class="full"><select style="width: 100%;" name="group_id[]" multiple="multiple" size="5">{S_DEFINED_GROUP_OPTIONS}</select></dd>
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input class="button1" type="submit" name="submit" value="{L_VIEW_PERMISSIONS}" />
+ </fieldset>
+
+ </form>
+
+ <form id="group" method="post" action="{U_ACTION}">
+
+ <fieldset>
+ <legend>{L_LOOK_UP_GROUP}</legend>
+ <dl>
+ <dt><label for="group">{L_LOOK_UP_GROUP}:</label></dt>
+ <dd><select name="group_id[]" id="group">{S_ADD_GROUP_OPTIONS}</select></dd>
+ <dd>&nbsp;</dd>
+ </dl>
+ </fieldset>
+
+ <fieldset class="quick">
+ {S_HIDDEN_FIELDS}
+ <input type="submit" name="submit" value="{L_VIEW_PERMISSIONS}" class="button1" />
+ </fieldset>
+
+ </form>
+
+ </div>
+
+ <!-- ENDIF -->
+
+<!-- ENDIF -->
+
+<!-- IF S_VIEWING_PERMISSIONS -->
+
+ <h1>{L_ACL_VIEW}</h1>
+
+ <p>{L_ACL_VIEW_EXPLAIN}</p>
+
+ <fieldset class="quick">
+ <b>&raquo; {L_PERMISSION_TYPE}</b>
+ </fieldset>
+
+ <!-- INCLUDE permission_mask.html -->
+
+<!-- ENDIF -->
+
+<!-- IF S_SETTING_PERMISSIONS -->
+
+ <h1>{L_ACL_SET}</h1>
+
+ <p>{L_ACL_SET_EXPLAIN}</p>
+
+ <br />
+
+ <fieldset class="quick" style="float: right;">
+ <b>&raquo; {L_PERMISSION_TYPE}</b>
+ </fieldset>
+
+ <!-- IF S_PERMISSION_DROPDOWN -->
+ <form id="pselect" method="post" action="{U_ACTION}">
+
+ <fieldset class="quick" style="float: left;">
+ {S_HIDDEN_FIELDS}
+ {L_SELECT_TYPE}: <select name="type">{S_PERMISSION_DROPDOWN}</select>
+
+ <input class="button2" type="submit" name="submit" value="{L_GO}" />
+ </fieldset>
+
+ </form>
+ <!-- ENDIF -->
+
+ <br /><br />
+
+ <form id="set_permissions" method="post" action="{U_ACTION}">
+
+ {S_HIDDEN_FIELDS}
+
+ <!-- INCLUDE permission_mask.html -->
+
+ <br /><br />
+
+ <fieldset class="quick" style="float: left;">
+ {L_PERM_PRESET_APPLIED_TO_ALL}<br />
+ <a href="javascript:marklist('set_permissions', 'inherit', true);">{L_MARK_ALL}</a> &bull; <a href="javascript:marklist('set_permissions', 'inherit', false);">{L_UNMARK_ALL}</a>
+ </fieldset>
+
+ <fieldset class="quick" style="float: right;">
+ <input class="button1" type="submit" name="action[apply_all_permissions]" value="{L_APPLY_ALL_PERMISSIONS}" />
+ </fieldset>
+
+ <br /><br />
+
+ </form>
+
+<!-- ENDIF -->
+
+<!-- INCLUDE overall_footer.html --> \ No newline at end of file
diff --git a/phpBB/adm/style/acp_users.html b/phpBB/adm/style/acp_users.html
index 0ecfc49417..35ceefe171 100644
--- a/phpBB/adm/style/acp_users.html
+++ b/phpBB/adm/style/acp_users.html
@@ -16,7 +16,7 @@
<dt><label for="username">{L_FIND_USERNAME}:</label></dt>
<dd><input class="medium" type="text" id="username" name="username" /></dd>
<dd>[ <a href="#" onclick="window.open('{U_FIND_USERNAME}', '_phpbbsearch', 'height=500, resizable=yes, scrollbars=yes, width=740'); return false;">{L_FIND_USERNAME}</a> ]</dd>
- <dd class="full" style="text-align: left;"><input type="checkbox" id="anonymous" name="u" value="{ANONYMOUS_USER_ID}" /> &nbsp;Select Anonymous User</dd>
+ <dd class="full" style="text-align: left;"><input type="checkbox" id="anonymous" name="u" value="{ANONYMOUS_USER_ID}" /> &nbsp;{L_SELECT_ANONYMOUS}</dd>
</dl>
</fieldset>
@@ -203,7 +203,7 @@
<!-- IF S_CLEARLOGS -->
<fieldset class="quick">
- <b class="small"><a href="#" onclick="marklist('list', true);">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('list', false);">{L_UNMARK_ALL}</a></b><br />
+ <b class="small"><a href="#" onclick="marklist('list', 'mark', true);">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('list', 'mark', false);">{L_UNMARK_ALL}</a></b><br />
<input class="button2" type="submit" name="delmarked" value="{L_DELETE_MARKED}" />&nbsp;
<input class="button2" type="submit" name="delall" value="{L_DELETE_ALL}" />&nbsp;
</fieldset>
@@ -696,12 +696,21 @@
<!-- ENDIF -->
<fieldset class="quick">
- <b class="small"><a href="#" onclick="marklist('user_attachments', true);">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('user_attachments', false);">{L_UNMARK_ALL}</a></b><br />
+ <b class="small"><a href="#" onclick="marklist('user_attachments', 'mark', true);">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('user_attachments', 'mark', false);">{L_UNMARK_ALL}</a></b><br />
<input class="button2" type="submit" name="delmarked" value="{L_DELETE_MARKED}" />
</fieldset>
</form>
+<!-- ELSEIF S_PERMISSIONS -->
+
+ <fieldset class="quick">
+ <a href="{U_USER_PERMISSIONS}">&raquo; {L_SET_USERS_PERMISSIONS}</a><br />
+ <a href="{U_USER_FORUM_PERMISSIONS}">&raquo; {L_SET_USERS_FORUM_PERMISSIONS}</a>
+ </fieldset>
+
+ <!-- INCLUDE permission_mask.html -->
+
<!-- ENDIF -->
<!-- INCLUDE overall_footer.html --> \ No newline at end of file
diff --git a/phpBB/adm/style/admin.css b/phpBB/adm/style/admin.css
index aa0cb68871..dd71698c93 100644
--- a/phpBB/adm/style/admin.css
+++ b/phpBB/adm/style/admin.css
@@ -281,6 +281,7 @@ td {
.row1 { background-color: #EFEFEF; }
.row2 { background-color: #DEE3E7; }
.row3 { background-color: #D1D7DC; }
+.row4 { background-color: #E4E8EB; }
.col1 { background-color: #DEE3E7; }
.col2 { background-color: #EFEFEF; }
@@ -648,6 +649,168 @@ a.button2, a.button2:link, a.button2:visited, a.button2:active {
padding: 4px 8px;
}
+/* Permission related
+---------------------------------------- */
+
+.permissions {
+ margin: 15px 0 0 0;
+ padding: 0;
+ border: none;
+ background-color: transparent;
+}
+
+.permissions table {
+ width: 100%;
+ /*empty-cells: hide;*/
+ border: 1px solid #CCCFD3;
+ background-color: #FFFFFF;
+ padding: 1px;
+}
+
+.permissions th {
+ padding: 3px 4px;
+ color: #FFFFFF;
+ background: #DDE1E4 url("../images/gradient2b.gif") bottom left repeat-x;
+ border-top: 1px solid #6DACD2;
+ border-bottom: 1px solid #327AA5;
+ text-align: left;
+ font-size: .85em;
+ text-transform: uppercase;
+}
+
+.permissions td {
+ text-align: left;
+ font-size: 1.1em;
+ padding: 4px;
+ line-height: 120%;
+}
+
+table.pmask {
+ border: none;
+ background: none;
+ padding: 0;
+}
+
+table.pmask th {
+ background: none;
+ border-top: none;
+ text-align: center;
+ vertical-align: bottom;
+ color: #115098;
+ padding: 2px 0;
+}
+
+table.pmask td {
+ padding: 0px;
+}
+
+table.pmask td.name {
+ padding: 2px;
+ vertical-align: middle;
+}
+
+.permissions th.name {
+ text-align: left;
+ width: auto;
+ padding-left: 4px;
+}
+
+.permissions .entry {
+ text-align: left;
+ font-weight: normal;
+}
+
+.permissions td.name {
+ text-align: left;
+ font-weight: bold;
+}
+
+.permissions table.type3 {
+ float: right;
+ width: 350px; /* Setting the length of the permission view box */
+ border: none;
+ background-color: transparent;
+ padding: 0;
+}
+
+.permissions table.type3 thead th {
+ background-color: transparent;
+ border-top: none;
+ text-align: center;
+ color: #115098;
+ padding: 0 3px;
+ font-size: .9em;
+ font-weight: normal;
+ text-transform: none;
+}
+
+.permissions table.type3 tbody th {
+ border-top: none;
+ text-align: left;
+ text-transform: none;
+ padding: 0;
+ border: none;
+ font-size: 1em;
+ font-weight: normal;
+ width: 100%;
+ vertical-align: middle;
+}
+
+.permissions table.type3 td {
+ text-align: center;
+ padding: 1px;
+}
+
+.permissions td.yes {
+ width: 20px;
+ background-color: #40C53D;
+}
+
+.permissions td.no {
+ width: 20px;
+ background-color: #EC7181;
+}
+
+.permissions td.unset {
+ width: 20px;
+ background-color: transparent;
+}
+
+/* Preset Styles
+---------------------------------------- */
+.preset_yes, .preset_custom, .preset_no, .preset_unset {
+ width: 60px;
+}
+
+.preset_yes a span, .preset_custom a span, .preset_no a span, .preset_unset a span {
+ float: left;
+ display: block;
+ width: 100%;
+ height: 20px;
+ cursor: pointer;
+ background: none;
+}
+
+.preset_yes a:hover span, .preset_custom a:hover span, .preset_no a:hover span, .preset_unset a:hover span {
+ background: url("../images/arrow_down.gif") no-repeat 50% 50%;
+ text-decoration: none;
+}
+
+.preset_yes {
+ background: #D3F3D2 url("../images/bg_hash1.gif") repeat;
+}
+
+.preset_custom {
+ background: #DAE4EC url("../images/bg_hash2.gif") repeat;
+}
+
+.preset_no {
+ background: #ECD7DA url("../images/bg_hash3.gif") repeat;
+}
+
+.preset_unset {
+ background: #ECD7DA url("../images/bg_hash4.gif") repeat;
+}
/* Action Highlighting
---------------------------------------- */
diff --git a/phpBB/adm/style/overall_header.html b/phpBB/adm/style/overall_header.html
index 0cfc50bbdd..9345ae0682 100644
--- a/phpBB/adm/style/overall_header.html
+++ b/phpBB/adm/style/overall_header.html
@@ -45,12 +45,24 @@ function dE(n, s, type)
e.style.display = (s == 1) ? type : 'none';
}
-function marklist(match, status)
+// Mark/unmark checkboxes
+// id = ID of parent container, name = name prefix, state = state [true/false]
+function marklist(id, name, state)
{
- doc = document.getElementById(match);
- for (i = 0; i < doc.length; i++)
+ var parent = document.getElementById(id);
+ if (!parent)
{
- doc.elements[i].checked = status;
+ return;
+ }
+
+ var rb = parent.getElementsByTagName('input');
+
+ for (var r = 0; r < rb.length; r++)
+ {
+ if (rb[r].name.substr(0, name.length) == name)
+ {
+ rb[r].checked = state;
+ }
}
}
diff --git a/phpBB/adm/style/permission_mask.html b/phpBB/adm/style/permission_mask.html
new file mode 100644
index 0000000000..263ff3fffa
--- /dev/null
+++ b/phpBB/adm/style/permission_mask.html
@@ -0,0 +1,179 @@
+
+<script type="text/javascript">
+<!--
+ var active_pmask = '0';
+ var active_fmask = '0';
+ var active_cat = '0';
+
+ // Show/hide option panels
+ // value = suffix for ID to show
+ function swap_options(pmask, fmask, cat)
+ {
+ id = pmask + fmask + cat;
+ active_option = active_pmask + active_fmask + active_cat;
+
+ if (id == active_option)
+ {
+ return;
+ }
+
+ // Hide active options
+ dE('options' + active_option, -1);
+ dE('head' + active_pmask + active_fmask, 1, 'inline');
+ dE('apply' + active_pmask + active_fmask, -1);
+
+ // Display container
+ dE('options' + id, 1);
+ dE('head' + pmask + fmask, -1, 'inline');
+ dE('apply' + pmask + fmask, 1);
+
+ active_pmask = pmask;
+ active_fmask = fmask;
+ active_cat = cat;
+ }
+
+ // Mark all radio buttons in one panel
+ // id = table ID container, s = status [1/-1/0]
+ function mark_options(id, s)
+ {
+ var t = document.getElementById(id);
+
+ if (!t)
+ {
+ return;
+ }
+
+ var rb = t.getElementsByTagName('input');
+
+ for (var r = 0; r < rb.length; r++ )
+ {
+ if (rb[r].id.substr(rb[r].id.length-1) == s)
+ {
+ rb[r].checked = true;
+ }
+ }
+ }
+
+//-->
+</script>
+
+<!-- BEGIN p_mask -->
+
+<fieldset class="permissions">
+ <!-- IF p_mask.USER_GROUPS_DEFAULT or p_mask.USER_GROUPS_CUSTOM -->
+ <br />
+ <p>
+ <!-- IF p_mask.USER_GROUPS_DEFAULT --><b>{p_mask.NAME}</b> {L_USER_IS_MEMBER_OF_DEFAULT}: <b>{p_mask.USER_GROUPS_DEFAULT}</b><br /><!-- ENDIF -->
+ <!-- IF p_mask.USER_GROUPS_CUSTOM --><b>{p_mask.NAME}</b> {L_USER_IS_MEMBER_OF_CUSTOM}: <b>{p_mask.USER_GROUPS_CUSTOM}</b><!-- ENDIF -->
+ </p>
+ <!-- ENDIF -->
+
+ <table cellspacing="1" class="pmask">
+ <thead>
+ <tr>
+ <th style="text-align: left; width: 70%">{p_mask.NAME}<!-- IF p_mask.S_LOCAL --><span class="small" style="text-transform: none;"> [{p_mask.L_ACL_TYPE}]</span><!-- ENDIF --></th>
+ <th>{p_mask.CATEGORIES}</th>
+ </tr>
+ </thead>
+ <tbody>
+
+ <!-- BEGIN f_mask -->
+ <!-- IF p_mask.f_mask.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->
+ <td class="name">
+ <table cellspacing="0" cellpadding="0" class="type2" style="background-color: transparent; border: 0;">
+ <tbody>
+ <tr>
+ <td width="16">
+ <span id="head{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}"<!-- IF p_mask.S_FIRST_ROW and p_mask.f_mask.S_FIRST_ROW --> style="display: none;"<!-- ENDIF -->>
+ <!-- IF not p_mask.S_VIEW --><input type="checkbox" name="inherit[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]" value="1" /><!-- ELSE -->&nbsp;<!-- ENDIF -->
+ </span>
+ </td>
+ <td>{p_mask.f_mask.PADDING}<a href="javascript:swap_options('{p_mask.S_ROW_COUNT}', '{p_mask.f_mask.S_ROW_COUNT}', '0');">{p_mask.f_mask.NAME}</a></span></td>
+ <td style="text-align: right;">
+ <!-- IF p_mask.S_VIEW -->
+ &nbsp;
+ <!-- ELSE -->
+ <!-- <b>{L_PRESET}:</b>&nbsp; &nbsp;<select name="preset[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]">
+ <option value="">Select preset...</option>
+ <option value="2">Valued Members</option>
+ <option value="3">Restricted Access</option>
+ </select> -->
+ <!-- ENDIF -->
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ <!-- BEGIN category -->
+ <!-- IF p_mask.f_mask.category.S_YES -->
+ <td class="preset_yes">
+ <!-- ELSEIF p_mask.f_mask.category.S_NO -->
+ <td class="preset_no">
+ <!-- ELSEIF p_mask.f_mask.category.S_UNSET -->
+ <td class="preset_unset">
+ <!-- ELSE -->
+ <td class="preset_custom">
+ <!-- ENDIF -->
+ <a href="javascript:swap_options('{p_mask.S_ROW_COUNT}', '{p_mask.f_mask.S_ROW_COUNT}', '{p_mask.f_mask.category.S_ROW_COUNT}');"><span>&nbsp;</span></a></td>
+ <!-- END category -->
+ </tr>
+ <tr class="row3">
+ <td style="vertical-align: top;">
+ <div id="apply{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" style="text-align: left; width: 98%; margin: 5px;<!-- IF p_mask.S_FIRST_ROW and p_mask.f_mask.S_FIRST_ROW --><!-- ELSE --> display: none;<!-- ENDIF -->">
+ <!-- IF not p_mask.S_VIEW -->
+ <div style="float: left; width: 60%;">
+ <p class="small">{L_APPLY_PERMISSIONS_EXPLAIN}</p>
+ <input class="button1" type="submit" name="psubmit[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]" value="{L_APPLY_PERMISSIONS}" />
+ </div>
+ <div style="float: right; text-align: right; width: 35%;">
+ <p class="small"><a href="javascript: mark_options('a_options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}', 'y')">{L_ALL_YES}</a> &bull; <a href="javascript: mark_options('a_options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}', 'n')">{L_ALL_NO}</a> &bull; <a href="javascript: mark_options('a_options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}', 'u')">{L_ALL_UNSET}</a></p>
+ </div>
+ <!-- ELSE -->
+ &nbsp;
+ <!-- ENDIF -->
+ </div>
+ </td>
+ <td colspan="{p_mask.S_NUM_CATS}" id="a_options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" style="vertical-align: top; text-align: left;">
+ <div style="width: 350px; height: 0; line-height: 0;">&nbsp;</div>
+ <!-- BEGIN category -->
+ <table cellspacing="1" id="options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}" class="type3"<!-- IF p_mask.S_FIRST_ROW and p_mask.f_mask.S_FIRST_ROW and p_mask.f_mask.category.S_FIRST_ROW --><!-- ELSE --> style="display: none;"<!-- ENDIF -->>
+ <thead>
+ <tr>
+ <th scope="col" style="text-align: left; padding-left: 0;"><strong>{L_ACL_SETTING} [{p_mask.f_mask.category.CAT_NAME}]</strong></th>
+ <!-- IF p_mask.S_VIEW -->
+ <th scope="col">{L_ACL_YES}</th>
+ <th scope="col">{L_ACL_NO}</th>
+ <!-- ELSE -->
+ <th scope="col"><a href="javascript: mark_options('options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}', 'y')">{L_ACL_YES}</a></th>
+ <th scope="col"><a href="javascript: mark_options('options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}', 'u')">{L_ACL_UNSET}</a></th>
+ <th scope="col"><a href="javascript: mark_options('options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}', 'n')">{L_ACL_NO}</a></th>
+ <!-- ENDIF -->
+ </tr>
+ </thead>
+ <tbody>
+ <!-- BEGIN mask -->
+ <!-- IF p_mask.f_mask.category.mask.S_ROW_COUNT is even --><tr class="row4"><!-- ELSE --><tr class="row3"><!-- ENDIF -->
+ <th>{p_mask.f_mask.category.mask.PERMISSION}</th>
+ <!-- IF p_mask.S_VIEW -->
+ <td<!-- IF p_mask.f_mask.category.mask.S_YES --> class="yes"<!-- ELSE --> class="unset"<!-- ENDIF -->>&nbsp;</td>
+ <td<!-- IF p_mask.f_mask.category.mask.S_NO --> class="no"<!-- ELSE --> class="unset"<!-- ENDIF -->>&nbsp;</td>
+ <!-- ELSE -->
+ <td class="unset"><input id="{p_mask.f_mask.category.mask.S_FIELD_NAME}_y" name="{p_mask.f_mask.category.mask.S_FIELD_NAME}" type="radio"<!-- IF p_mask.f_mask.category.mask.S_YES --> checked="checked"<!-- ENDIF --> value="1" /></td>
+ <td class="unset"><input id="{p_mask.f_mask.category.mask.S_FIELD_NAME}_u" name="{p_mask.f_mask.category.mask.S_FIELD_NAME}" type="radio"<!-- IF p_mask.f_mask.category.mask.S_UNSET --> checked="checked"<!-- ENDIF --> value="-1" /></td>
+ <td class="unset"><input id="{p_mask.f_mask.category.mask.S_FIELD_NAME}_n" name="{p_mask.f_mask.category.mask.S_FIELD_NAME}" type="radio"<!-- IF p_mask.f_mask.category.mask.S_NO --> checked="checked"<!-- ENDIF --> value="0" /></td>
+ <!-- ENDIF -->
+ </tr>
+ <!-- END mask -->
+ </tbody>
+ </table>
+ <!-- END category -->
+ </td>
+ </tr>
+ <!-- END f_mask -->
+
+ </tbody>
+ </table>
+
+</fieldset>
+
+<!-- END p_mask -->
diff --git a/phpBB/adm/style/simple_header.html b/phpBB/adm/style/simple_header.html
index 4aab5fe973..3a21c3bdab 100644
--- a/phpBB/adm/style/simple_header.html
+++ b/phpBB/adm/style/simple_header.html
@@ -30,19 +30,39 @@ function jumpto()
// Set display of page element
// s[-1,0,1] = hide,toggle display,show
-function dE(n,s)
+function dE(n, s, type)
{
+ if (!type)
+ {
+ type = 'block';
+ }
+
var e = document.getElementById(n);
- if(!s) s = (e.style.display=='') ? -1:1;
- e.style.display = (s==1) ? 'block':'none';
+ if (!s)
+ {
+ s = (e.style.display == '') ? -1 : 1;
+ }
+ e.style.display = (s == 1) ? type : 'none';
}
-function marklist(match, status)
+// Mark/unmark checkboxes
+// id = ID of parent container, name = name prefix, state = state [true/false]
+function marklist(id, name, state)
{
- doc = document.getElementById(match);
- for (i = 0; i < doc.length; i++)
+ var parent = document.getElementById(id);
+ if (!parent)
+ {
+ return;
+ }
+
+ var rb = parent.getElementsByTagName('input');
+
+ for (var r = 0; r < rb.length; r++)
{
- doc.elements[i].checked = status;
+ if (rb[r].name.substr(0, name.length) == name)
+ {
+ rb[r].checked = state;
+ }
}
}
diff --git a/phpBB/includes/acp/acp_bots.php b/phpBB/includes/acp/acp_bots.php
index 2fea1d866d..8ddc5016b2 100644
--- a/phpBB/includes/acp/acp_bots.php
+++ b/phpBB/includes/acp/acp_bots.php
@@ -337,7 +337,7 @@ class acp_bots_info
'title' => 'ACP_BOTS',
'version' => '1.0.0',
'modes' => array(
- 'bots' => array('title' => 'ACP_BOTS', 'auth' => 'acl_a_server'),
+ 'bots' => array('title' => 'ACP_BOTS', 'auth' => 'acl_a_bots'),
),
);
}
diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php
index fc0aefa4a6..1a28cd905c 100644
--- a/phpBB/includes/acp/acp_forums.php
+++ b/phpBB/includes/acp/acp_forums.php
@@ -149,9 +149,23 @@ class acp_forums
$auth->acl_clear_prefetch();
recalc_btree('forum_id', FORUMS_TABLE);
+ $acl_url = '&amp;mode=setting_forum_local&amp;forum_id[]=' . $forum_data['forum_id'];
+
+ // Add default groups to selection
+ $sql = 'SELECT group_id
+ FROM ' . GROUPS_TABLE . '
+ WHERE group_type = ' . GROUP_SPECIAL;
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $acl_url .= '&amp;group_id[]=' . $row['group_id'];
+ }
+ $db->sql_freeresult($result);
+
// Redirect to permissions
$message = ($action == 'add') ? $user->lang['FORUM_CREATED'] : $user->lang['FORUM_UPDATED'];
- $message .= '<br /><br />' . sprintf($user->lang['REDIRECT_ACL'], '<a href="' . $phpbb_admin_path . "index.$phpEx$SID&amp;i=permissions&amp;mode=forum&amp;submit_usergroups=true&amp;ug_type=forum&amp;action=usergroups&amp;f[forum][]={$forum_data['forum_id']}" . '">', '</a>');
+ $message .= '<br /><br />' . sprintf($user->lang['REDIRECT_ACL'], '<a href="' . $phpbb_admin_path . "index.$phpEx$SID&amp;i=permissions" . $acl_url . '">', '</a>');
trigger_error($message . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
}
diff --git a/phpBB/includes/acp/acp_groups.php b/phpBB/includes/acp/acp_groups.php
index e11543ba78..cfd1cb6c9b 100644
--- a/phpBB/includes/acp/acp_groups.php
+++ b/phpBB/includes/acp/acp_groups.php
@@ -10,6 +10,7 @@
/**
* @package acp
+* @todo make sure permissions are met for adding groups and removing groups (a_groupadd, a_groupdel)
*/
class acp_groups
{
diff --git a/phpBB/includes/acp/acp_jabber.php b/phpBB/includes/acp/acp_jabber.php
index 56d460f176..58e88f5020 100644
--- a/phpBB/includes/acp/acp_jabber.php
+++ b/phpBB/includes/acp/acp_jabber.php
@@ -176,7 +176,7 @@ class acp_jabber_info
'title' => 'ACP_JABBER_SETTINGS',
'version' => '1.0.0',
'modes' => array(
- 'settings' => array('title' => 'ACP_JABBER_SETTINGS', 'auth' => 'acl_a_server'),
+ 'settings' => array('title' => 'ACP_JABBER_SETTINGS', 'auth' => 'acl_a_jabber'),
),
);
}
diff --git a/phpBB/includes/acp/acp_language.php b/phpBB/includes/acp/acp_language.php
index 7bf8563440..414c313b21 100644
--- a/phpBB/includes/acp/acp_language.php
+++ b/phpBB/includes/acp/acp_language.php
@@ -1080,7 +1080,7 @@ class acp_language_info
'title' => 'ACP_LANGUAGE',
'version' => '1.0.0',
'modes' => array(
- 'lang_packs' => array('title' => 'ACP_LANGUAGE_PACKS', 'auth' => 'acl_a_server'),
+ 'lang_packs' => array('title' => 'ACP_LANGUAGE_PACKS', 'auth' => 'acl_a_language'),
),
);
}
diff --git a/phpBB/includes/acp/acp_logs.php b/phpBB/includes/acp/acp_logs.php
index 8ac93203da..0bf02970d0 100644
--- a/phpBB/includes/acp/acp_logs.php
+++ b/phpBB/includes/acp/acp_logs.php
@@ -151,9 +151,9 @@ class acp_logs_info
'title' => 'ACP_LOGGING',
'version' => '1.0.0',
'modes' => array(
- 'admin' => array('title' => 'ACP_ADMIN_LOGS', 'auth' => 'acl_a_'),
- 'mod' => array('title' => 'ACP_MOD_LOGS', 'auth' => 'acl_a_'),
- 'critical' => array('title' => 'ACP_CRITICAL_LOGS', 'auth' => 'acl_a_'),
+ 'admin' => array('title' => 'ACP_ADMIN_LOGS', 'auth' => 'acl_a_viewlogs'),
+ 'mod' => array('title' => 'ACP_MOD_LOGS', 'auth' => 'acl_a_viewlogs'),
+ 'critical' => array('title' => 'ACP_CRITICAL_LOGS', 'auth' => 'acl_a_viewlogs'),
),
);
}
diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php
index 924ae6713b..3631272e75 100644
--- a/phpBB/includes/acp/acp_main.php
+++ b/phpBB/includes/acp/acp_main.php
@@ -57,6 +57,11 @@ class acp_main
}
else if ($action == 'delete')
{
+ if (!$auth->acl_get('a_userdel'))
+ {
+ trigger_error($user->lang['NO_ADMIN']);
+ }
+
$sql = 'DELETE FROM ' . USER_GROUP_TABLE . " WHERE user_id IN ($mark)";
$db->sql_query($sql);
$sql = 'DELETE FROM ' . USERS_TABLE . " WHERE user_id IN ($mark)";
@@ -335,18 +340,23 @@ class acp_main
)
);
- view_log('admin', $log_data, $log_count, 5);
+ $log_data = array();
- foreach ($log_data as $row)
+ if ($auth->acl_get('a_viewlogs'))
{
- $template->assign_block_vars('log', array(
- 'USERNAME' => $row['username'],
- 'IP' => $row['ip'],
- 'DATE' => $user->format_date($row['time']),
- 'ACTION' => $row['action'])
- );
+ view_log('admin', $log_data, $log_count, 5);
+
+ foreach ($log_data as $row)
+ {
+ $template->assign_block_vars('log', array(
+ 'USERNAME' => $row['username'],
+ 'IP' => $row['ip'],
+ 'DATE' => $user->format_date($row['time']),
+ 'ACTION' => $row['action'])
+ );
+ }
}
-
+
if ($auth->acl_get('a_user'))
{
$sql = 'SELECT user_id, username, user_regdate
diff --git a/phpBB/includes/acp/acp_permissions.php b/phpBB/includes/acp/acp_permissions.php
new file mode 100644
index 0000000000..103c226611
--- /dev/null
+++ b/phpBB/includes/acp/acp_permissions.php
@@ -0,0 +1,739 @@
+<?php
+/**
+*
+* @package acp
+* @version $Id$
+* @copyright (c) 2005 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+/**
+* @package acp
+*/
+class acp_permissions
+{
+ var $u_action;
+ var $permission_dropdown;
+
+ function main($id, $mode)
+ {
+ global $db, $user, $auth, $template, $cache;
+ global $config, $SID, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+
+ include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+ include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
+
+ $auth_admin = new auth_admin();
+
+ $user->add_lang('acp/permissions');
+ $user->add_lang('acp/permissions_phpbb');
+
+ $this->tpl_name = 'acp_permissions';
+ $this->u_action = "{$phpbb_admin_path}index.$phpEx$SID&amp;i=$id&amp;mode=$mode";
+
+ // Set some vars
+ $action = request_var('action', array('' => 0));
+ list($action, ) = each($action);
+
+ $action = (isset($_POST['psubmit'])) ? 'apply_permissions' : $action;
+
+ $all_forums = request_var('all_forums', 0);
+ $user_id = request_var('user_id', array(0));
+ $group_id = request_var('group_id', array(0));
+ $forum_id = request_var('forum_id', array(0));
+ $username = request_var('username', array(''));
+ $usernames = request_var('usernames', '');
+
+ // Map usernames to ids and vice versa
+ if ($usernames)
+ {
+ $username = explode("\n", $usernames);
+ }
+ unset($usernames);
+
+ if (sizeof($username) && !sizeof($user_id))
+ {
+ user_get_id_name($user_id, $username);
+
+ if (!sizeof($user_id))
+ {
+ trigger_error($user->lang['SELECTED_USER_NOT_EXIST'] . adm_back_link($this->u_action));
+ }
+ }
+ unset($username);
+
+ // Define some common variables for every mode
+ $error = array();
+
+ $permission_scope = (strpos($mode, '_global') !== false) ? 'global' : 'local';
+
+ switch ($mode)
+ {
+ case 'setting_user_global':
+ case 'setting_group_global':
+ $this->permission_dropdown = array('u_', 'm_', 'a_');
+ $permission_victim = ($mode == 'setting_user_global') ? array('user') : array('group');
+ $this->page_title = ($mode == 'setting_user_global') ? 'ACP_USERS_PERMISSIONS' : 'ACP_GROUPS_PERMISSIONS';
+ break;
+
+ case 'setting_user_local':
+ case 'setting_group_local':
+ $this->permission_dropdown = array('f_', 'm_');
+ $permission_victim = ($mode == 'setting_user_local') ? array('user', 'forums') : array('group', 'forums');
+ $this->page_title = ($mode == 'setting_user_local') ? 'ACP_USERS_FORUM_PERMISSIONS' : 'ACP_GROUPS_FORUM_PERMISSIONS';
+ break;
+
+ case 'setting_admin_global':
+ case 'setting_mod_global':
+ $this->permission_dropdown = (strpos($mode, '_admin_') !== false) ? array('a_') : array('m_');
+ $permission_victim = array('usergroup');
+ $this->page_title = ($mode == 'setting_admin_global') ? 'ACP_ADMINISTRATORS' : 'ACP_GLOBAL_MODERATORS';
+ break;
+
+ case 'setting_mod_local':
+ case 'setting_forum_local':
+ $this->permission_dropdown = ($mode == 'setting_mod_local') ? array('m_') : array('f_');
+ $permission_victim = array('forums', 'usergroup');
+ $this->page_title = ($mode == 'setting_mod_local') ? 'ACP_FORUM_MODERATORS' : 'ACP_FORUM_PERMISSIONS';
+ break;
+
+ case 'view_admin_global':
+ case 'view_user_global':
+ case 'view_mod_global':
+ $this->permission_dropdown = ($mode == 'view_admin_global') ? array('a_') : (($mode == 'view_user_global') ? array('u_') : array('m_'));
+ $permission_victim = array('usergroup_view');
+ $this->page_title = ($mode == 'view_admin_global') ? 'ACP_VIEW_ADMIN_PERMISSIONS' : (($mode == 'view_user_global') ? 'ACP_VIEW_USER_PERMISSIONS' : 'ACP_VIEW_GLOBAL_MOD_PERMISSIONS');
+ break;
+
+ case 'view_mod_local':
+ case 'view_forum_local':
+ $this->permission_dropdown = ($mode == 'view_mod_local') ? array('m_') : array('f_');
+ $permission_victim = array('forums', 'usergroup_view');
+ $this->page_title = ($mode == 'view_mod_local') ? 'ACP_VIEW_FORUM_MOD_PERMISSIONS' : 'ACP_VIEW_FORUM_PERMISSIONS';
+ break;
+
+ default:
+ trigger_error('INVALID_MODE');
+ }
+
+ $template->assign_vars(array(
+ 'L_TITLE' => $user->lang[$this->page_title],
+ 'L_EXPLAIN' => $user->lang[$this->page_title . '_EXPLAIN'])
+ );
+
+ // Get permission type
+ $permission_type = request_var('type', $this->permission_dropdown[0]);
+
+ if (!in_array($permission_type, $this->permission_dropdown))
+ {
+ trigger_error($user->lang['WRONG_PERMISSION_TYPE'] . adm_back_link($this->u_action));
+ }
+
+
+ // Handle actions
+ if (strpos($mode, 'setting_') === 0 && $action)
+ {
+ switch ($action)
+ {
+ case 'delete':
+ $this->remove_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id, $forum_id);
+ break;
+
+ case 'apply_permissions':
+ if (!isset($_POST['setting']))
+ {
+ trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action));
+ }
+
+ $this->set_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id);
+ break;
+
+ case 'apply_all_permissions':
+ if (!isset($_POST['setting']))
+ {
+ trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action));
+ }
+
+ $this->set_all_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id);
+ break;
+ }
+ }
+
+
+ // Setting permissions screen
+ $s_hidden_fields = build_hidden_fields(array(
+ 'user_id' => $user_id,
+ 'group_id' => $group_id,
+ 'forum_id' => $forum_id,
+ 'type' => $permission_type)
+ );
+
+ if ($all_forums)
+ {
+ $s_hidden_fields .= build_hidden_fields(array('all_forums' => $all_forums));
+ }
+
+ // Go through the screens/options needed and present them in correct order
+ foreach ($permission_victim as $victim)
+ {
+ switch ($victim)
+ {
+ case 'forum_dropdown':
+
+ if (sizeof($forum_id))
+ {
+ $this->check_existence('forum', $forum_id);
+ continue 2;
+ }
+
+ $template->assign_vars(array(
+ 'S_SELECT_FORUM' => true,
+ 'S_FORUM_OPTIONS' => make_forum_select(false, false, false))
+ );
+
+ break;
+
+ case 'forums':
+
+ if (sizeof($forum_id) || $all_forums)
+ {
+ if (sizeof($forum_id))
+ {
+ $this->check_existence('forum', $forum_id);
+ }
+
+ continue 2;
+ }
+
+ $template->assign_vars(array(
+ 'S_SELECT_FORUM' => true,
+ 'S_FORUM_OPTIONS' => make_forum_select(false, false, false),
+ 'S_FORUM_ALL' => true,
+ 'S_FORUM_MULTIPLE' => true)
+ );
+
+ break;
+
+ case 'user':
+
+ if (sizeof($user_id))
+ {
+ $this->check_existence('user', $user_id);
+ continue 2;
+ }
+
+ $template->assign_vars(array(
+ 'S_SELECT_USER' => true,
+ 'U_FIND_USERNAME' => $phpbb_root_path . "memberlist.$phpEx$SID&amp;mode=searchuser&amp;form=select_victim&amp;field=username")
+ );
+
+ break;
+
+ case 'group':
+
+ if (sizeof($group_id))
+ {
+ $this->check_existence('group', $group_id);
+ continue 2;
+ }
+
+ $template->assign_vars(array(
+ 'S_SELECT_GROUP' => true,
+ 'S_GROUP_OPTIONS' => group_select_options(false))
+ );
+
+ break;
+
+ case 'usergroup':
+ case 'usergroup_view':
+
+ if (sizeof($user_id) || sizeof($group_id))
+ {
+ if (sizeof($user_id))
+ {
+ $this->check_existence('user', $user_id);
+ }
+
+ if (sizeof($group_id))
+ {
+ $this->check_existence('group', $group_id);
+ }
+
+ continue 2;
+ }
+
+ $sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND a.forum_id IN (' . implode(', ', $forum_id) . ')' : 'AND a.forum_id <> 0');
+ $sql_permission_option = "o.auth_option LIKE '" . $db->sql_escape($permission_type) . "%'";
+
+ $sql = 'SELECT DISTINCT u.user_id, u.username
+ FROM ' . USERS_TABLE . ' u, ' . ACL_USERS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o
+ WHERE $sql_permission_option
+ $sql_forum_id
+ AND a.auth_option_id = o.auth_option_id
+ AND u.user_id = a.user_id
+ ORDER BY u.username, u.user_regdate ASC";
+ $result = $db->sql_query($sql);
+
+ $s_defined_user_options = '';
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $s_defined_user_options .= '<option value="' . $row['user_id'] . '">' . $row['username'] . '</option>';
+ }
+ $db->sql_freeresult($result);
+
+ $sql = 'SELECT DISTINCT g.group_id, g.group_name, g.group_type
+ FROM ' . GROUPS_TABLE . ' g, ' . ACL_GROUPS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o
+ WHERE $sql_permission_option
+ $sql_forum_id
+ AND a.auth_option_id = o.auth_option_id
+ AND g.group_id = a.group_id
+ ORDER BY g.group_type DESC, g.group_name ASC";
+ $result = $db->sql_query($sql);
+
+ $s_defined_group_options = '';
+ $defined_group_ids = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $s_defined_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
+ $defined_group_ids[] = $row['group_id'];
+ }
+ $db->sql_freeresult($result);
+
+ $template->assign_vars(array(
+ 'S_SELECT_USERGROUP' => ($victim == 'usergroup') ? true : false,
+ 'S_SELECT_USERGROUP_VIEW' => ($victim == 'usergroup_view') ? true : false,
+ 'S_DEFINED_USER_OPTIONS' => $s_defined_user_options,
+ 'S_DEFINED_GROUP_OPTIONS' => $s_defined_group_options,
+ 'S_ADD_GROUP_OPTIONS' => group_select_options(false, $defined_group_ids),
+ 'U_FIND_USERNAME' => $phpbb_root_path . "memberlist.$phpEx$SID&amp;mode=searchuser&amp;form=add_user&amp;field=username")
+ );
+
+ break;
+ }
+
+ $template->assign_vars(array(
+ 'U_ACTION' => $this->u_action,
+ 'ANONYMOUS_USER_ID' => ANONYMOUS,
+
+ 'S_SELECT_VICTIM' => true,
+ 'S_CAN_SELECT_USER' => ($auth->acl_get('a_authusers')) ? true : false,
+ 'S_CAN_SELECT_GROUP' => ($auth->acl_get('a_authgroups')) ? true : false,
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields)
+ );
+
+ // Let the forum names being displayed
+ if (sizeof($forum_id))
+ {
+ $sql = 'SELECT forum_name
+ FROM ' . FORUMS_TABLE . '
+ WHERE forum_id IN (' . implode(', ', $forum_id) . ')
+ ORDER BY forum_name ASC';
+ $result = $db->sql_query($sql);
+
+ $forum_names = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $forum_names[] = $row['forum_name'];
+ }
+ $db->sql_freeresult($result);
+
+ $template->assign_vars(array(
+ 'S_FORUM_NAMES' => (sizeof($forum_names)) ? true : false,
+ 'FORUM_NAMES' => implode(', ', $forum_names))
+ );
+ }
+
+ return;
+ }
+
+ // Set to all forums if selected
+ if ($permission_scope == 'local' && $all_forums)
+ {
+ $forum_id = array();
+ }
+
+ // Do not allow forum_ids being set and no other setting defined (will bog down the server too much)
+ if (sizeof($forum_id) && !sizeof($user_id) && !sizeof($group_id))
+ {
+ trigger_error($user->lang['ONLY_FORUM_DEFINED'] . adm_back_link($this->u_action));
+ }
+
+ $template->assign_vars(array(
+ 'S_PERMISSION_DROPDOWN' => (sizeof($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type) : false,
+ 'L_PERMISSION_TYPE' => $user->lang['ACL_TYPE_' . strtoupper($permission_type)],
+
+ 'U_ACTION' => $this->u_action,
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields)
+ );
+
+ if (strpos($mode, 'setting_') === 0)
+ {
+ $template->assign_vars(array(
+ 'S_SETTING_PERMISSIONS' => true)
+ );
+
+ $hold_ary = $auth_admin->get_mask('set', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_UNSET);
+ $auth_admin->display_mask('set', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
+ }
+ else
+ {
+ $template->assign_vars(array(
+ 'S_VIEWING_PERMISSIONS' => true)
+ );
+
+ $hold_ary = $auth_admin->get_mask('view', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NO);
+ $auth_admin->display_mask('view', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
+ }
+ }
+
+ /**
+ * Build dropdown field for changing permission types
+ */
+ function build_permission_dropdown($options, $default_option)
+ {
+ global $user, $auth;
+
+ $s_dropdown_options = '';
+ foreach ($options as $setting)
+ {
+ if (!$auth->acl_get('a_' . str_replace('_', '', $setting) . 'auth'))
+ {
+ continue;
+ }
+ $selected = ($setting == $default_option) ? ' selected="selected"' : '';
+ $s_dropdown_options .= '<option value="' . $setting . '"' . $selected . '>' . $user->lang['permission_type'][$setting] . '</option>';
+ }
+
+ return $s_dropdown_options;
+ }
+
+ /**
+ * Check if selected items exist. Remove not found ids and if empty return error.
+ */
+ function check_existence($mode, &$ids)
+ {
+ global $db, $user;
+
+ switch ($mode)
+ {
+ case 'user':
+ $table = USERS_TABLE;
+ $sql_id = 'user_id';
+ break;
+
+ case 'group':
+ $table = GROUPS_TABLE;
+ $sql_id = 'group_id';
+ break;
+
+ case 'forum':
+ $table = FORUMS_TABLE;
+ $sql_id = 'forum_id';
+ break;
+ }
+
+ $sql = "SELECT $sql_id
+ FROM $table
+ WHERE $sql_id IN (" . implode(', ', $ids) . ')';
+ $result = $db->sql_query($sql);
+
+ $ids = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $ids[] = $row[$sql_id];
+ }
+ $db->sql_freeresult($result);
+
+ if (!sizeof($ids))
+ {
+ trigger_error($user->lang['SELECTED_' . strtoupper($mode) . '_NOT_EXIST'] . adm_back_link($this->u_action));
+ }
+ }
+
+ /**
+ * Apply permissions
+ */
+ function set_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
+ {
+ global $user, $auth;
+
+ $psubmit = request_var('psubmit', array(0));
+
+ // User or group to be set?
+ $ug_type = (sizeof($user_id)) ? 'user' : 'group';
+
+ // Check the permission setting again
+ if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
+ {
+ trigger_error($user->lang['NO_ADMIN'] . adm_back_link($this->u_action));
+ }
+
+ $ug_id = $forum_id = 0;
+
+ // We loop through the auth settings defined in our submit
+ list($ug_id, ) = each($psubmit);
+ list($forum_id, ) = each($psubmit[$ug_id]);
+
+ $auth_settings = array_map('intval', $_POST['setting'][$ug_id][$forum_id]);
+
+ // Do the admin want to set these permissions to other forums too?
+ $inherit = request_var('inherit', array(0));
+
+ $ug_id = array($ug_id);
+ $forum_id = array($forum_id);
+
+ if (sizeof($inherit))
+ {
+ foreach ($inherit as $_ug_id => $forum_id_ary)
+ {
+ // Inherit users/groups?
+ if (!in_array($_ug_id, $ug_id))
+ {
+ $ug_id[] = $_ug_id;
+ }
+
+ // Inherit forums?
+ $forum_id = array_merge($forum_id, array_keys($forum_id_ary));
+ }
+ }
+
+ $forum_id = array_unique($forum_id);
+
+ // Update the permission set...
+ $auth_admin->acl_set($ug_type, $forum_id, $ug_id, $auth_settings);
+
+ // Do we need to recache the moderator lists?
+ if ($permission_type == 'm_')
+ {
+ cache_moderators();
+ }
+
+ // Remove users who are now moderators or admins from everyones foes list
+ if ($permission_type == 'm_' || $permission_type == 'a_')
+ {
+ $this->update_foes();
+ }
+
+ $this->log_action($mode, 'add', $permission_type, $ug_type, $ug_id, $forum_id);
+
+ trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
+ }
+
+ /**
+ * Apply all permissions
+ */
+ function set_all_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
+ {
+ global $user, $auth;
+
+ // User or group to be set?
+ $ug_type = (sizeof($user_id)) ? 'user' : 'group';
+
+ // Check the permission setting again
+ if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
+ {
+ trigger_error($user->lang['NO_ADMIN'] . adm_back_link($this->u_action));
+ }
+
+ $auth_settings = $_POST['setting'];
+ $ug_ids = $forum_ids = array();
+
+ // We need to go through the auth settings
+ foreach ($auth_settings as $ug_id => $forum_auth_row)
+ {
+ $ug_id = (int) $ug_id;
+ $ug_ids[] = $ug_id;
+
+ foreach ($forum_auth_row as $forum_id => $auth_options)
+ {
+ $forum_id = (int) $forum_id;
+ $forum_ids[] = $forum_id;
+
+ // Update the permission set...
+ $auth_admin->acl_set($ug_type, $forum_id, $ug_id, $auth_options);
+ }
+ }
+
+ // Do we need to recache the moderator lists?
+ if ($permission_type == 'm_')
+ {
+ cache_moderators();
+ }
+
+ // Remove users who are now moderators or admins from everyones foes list
+ if ($permission_type == 'm_' || $permission_type == 'a_')
+ {
+ $this->update_foes();
+ }
+
+ $this->log_action($mode, 'add', $permission_type, $ug_type, $ug_ids, $forum_ids);
+
+ trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
+ }
+
+ /**
+ * Remove permissions
+ */
+ function remove_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id, &$forum_id)
+ {
+ global $user, $db;
+
+ // User or group to be set?
+ $ug_type = (sizeof($user_id)) ? 'user' : 'group';
+
+ // Check the permission setting again
+ if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
+ {
+ trigger_error($user->lang['NO_ADMIN'] . adm_back_link($this->u_action));
+ }
+
+ // Remove permission type
+ $sql = 'SELECT auth_option_id
+ FROM ' . ACL_OPTIONS_TABLE . "
+ WHERE auth_option LIKE '{$permission_type}%'";
+ $result = $db->sql_query($sql);
+
+ $option_id_ary = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $option_id_ary[] = $row['auth_option_id'];
+ }
+ $db->sql_freeresult($result);
+
+ if (sizeof($option_id_ary))
+ {
+ $auth_admin->acl_delete($ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : false), $option_id_ary);
+ }
+
+ // Do we need to recache the moderator lists?
+ if ($permission_type == 'm_')
+ {
+ cache_moderators();
+ }
+
+ $this->log_action($mode, 'del', $permission_type, $ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : array(0 => 0)));
+
+ trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
+ }
+
+ /**
+ * Log permission changes
+ */
+ function log_action($mode, $action, $permission_type, $ug_type, $ug_id, $forum_id)
+ {
+ global $db, $user;
+
+ if (!is_array($ug_id))
+ {
+ $ug_id = array($ug_id);
+ }
+
+ if (!is_array($forum_id))
+ {
+ $forum_id = array($forum_id);
+ }
+
+ // Logging ... first grab user or groupnames ...
+ $sql = ($ug_type == 'group') ? 'SELECT group_name as name, group_type FROM ' . GROUPS_TABLE . ' WHERE group_id' : 'SELECT username as name FROM ' . USERS_TABLE . ' WHERE user_id';
+ $sql .= ' IN (' . implode(', ', array_map('intval', $ug_id)) . ')';
+ $result = $db->sql_query($sql);
+
+ $l_ug_list = '';
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $l_ug_list .= (($l_ug_list != '') ? ', ' : '') . ((isset($row['group_type']) && $row['group_type'] == GROUP_SPECIAL) ? '<span class="blue">' . $user->lang['G_' . $row['name']] . '</span>' : $row['name']);
+ }
+ $db->sql_freeresult($result);
+
+ $mode = str_replace('setting_', '', $mode);
+
+ if ($forum_id[0] == 0)
+ {
+ add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_ug_list);
+ }
+ else
+ {
+ // Grab the forum details if non-zero forum_id
+ $sql = 'SELECT forum_name
+ FROM ' . FORUMS_TABLE . '
+ WHERE forum_id IN (' . implode(', ', $forum_id) . ')';
+ $result = $db->sql_query($sql);
+
+ $l_forum_list = '';
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $l_forum_list .= (($l_forum_list != '') ? ', ' : '') . $row['forum_name'];
+ }
+ $db->sql_freeresult($result);
+
+ add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_forum_list, $l_ug_list);
+ }
+ }
+
+ /**
+ * Update foes
+ */
+ function update_foes()
+ {
+ global $db, $auth;
+
+ $perms = array();
+ foreach ($auth->acl_get_list(false, array('a_', 'm_'), false) as $forum_id => $forum_ary)
+ {
+ foreach ($forum_ary as $auth_option => $user_ary)
+ {
+ $perms += $user_ary;
+ }
+ }
+
+ if (sizeof($perms))
+ {
+ $sql = 'DELETE FROM ' . ZEBRA_TABLE . '
+ WHERE zebra_id IN (' . implode(', ', $perms) . ')';
+ $db->sql_query($sql);
+ }
+ unset($perms);
+ }
+}
+
+/**
+* @package module_install
+*/
+class acp_permissions_info
+{
+ function module()
+ {
+ return array(
+ 'filename' => 'acp_permissions',
+ 'title' => 'ACP_PERMISSIONS',
+ 'version' => '1.0.0',
+ 'modes' => array(
+ 'setting_user_global' => array('title' => 'ACP_USERS_PERMISSIONS', 'auth' => 'acl_a_authusers && (acl_a_aauth || acl_a_mauth || acl_a_uauth)'),
+ 'setting_user_local' => array('title' => 'ACP_USERS_FORUM_PERMISSIONS', 'auth' => 'acl_a_authusers && (acl_a_mauth || acl_a_fauth)'),
+ 'setting_group_global' => array('title' => 'ACP_GROUPS_PERMISSIONS', 'auth' => 'acl_a_authgroups && (acl_a_aauth || acl_a_mauth || acl_a_uauth)'),
+ 'setting_group_local' => array('title' => 'ACP_GROUPS_FORUM_PERMISSIONS', 'auth' => 'acl_a_authgroups && (acl_a_mauth || acl_a_fauth)'),
+ 'setting_admin_global' => array('title' => 'ACP_ADMINISTRATORS', 'auth' => 'acl_a_aauth && (acl_a_authusers || acl_a_authgroups)'),
+ 'setting_mod_global' => array('title' => 'ACP_GLOBAL_MODERATORS', 'auth' => 'acl_a_mauth && (acl_a_authusers || acl_a_authgroups)'),
+ 'setting_mod_local' => array('title' => 'ACP_FORUM_MODERATORS', 'auth' => 'acl_a_mauth && (acl_a_authusers || acl_a_authgroups)'),
+ 'setting_forum_local' => array('title' => 'ACP_FORUM_PERMISSIONS', 'auth' => 'acl_a_fauth && (acl_a_authusers || acl_a_authgroups)'),
+
+ 'view_admin_global' => array('title' => 'ACP_VIEW_ADMIN_PERMISSIONS', 'auth' => 'acl_a_viewauth'),
+ 'view_user_global' => array('title' => 'ACP_VIEW_USER_PERMISSIONS', 'auth' => 'acl_a_viewauth'),
+ 'view_mod_global' => array('title' => 'ACP_VIEW_GLOBAL_MOD_PERMISSIONS', 'auth' => 'acl_a_viewauth'),
+ 'view_mod_local' => array('title' => 'ACP_VIEW_FORUM_MOD_PERMISSIONS', 'auth' => 'acl_a_viewauth'),
+ 'view_forum_local' => array('title' => 'ACP_VIEW_FORUM_PERMISSIONS', 'auth' => 'acl_a_viewauth'),
+ ),
+ );
+ }
+
+ function install()
+ {
+ }
+
+ function uninstall()
+ {
+ }
+}
+
+?> \ No newline at end of file
diff --git a/phpBB/includes/acp/acp_php_info.php b/phpBB/includes/acp/acp_php_info.php
index 35c5b223e6..87d74b8f3a 100644
--- a/phpBB/includes/acp/acp_php_info.php
+++ b/phpBB/includes/acp/acp_php_info.php
@@ -89,7 +89,7 @@ class acp_php_info_info
'title' => 'ACP_PHP_INFO',
'version' => '1.0.0',
'modes' => array(
- 'info' => array('title' => 'ACP_PHP_INFO', 'auth' => 'acl_a_server'),
+ 'info' => array('title' => 'ACP_PHP_INFO', 'auth' => 'acl_a_phpinfo'),
),
);
}
diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php
index f7c3817c99..495f958481 100644
--- a/phpBB/includes/acp/acp_profile.php
+++ b/phpBB/includes/acp/acp_profile.php
@@ -1251,7 +1251,7 @@ class acp_profile_info
'title' => 'ACP_CUSTOM_PROFILE_FIELDS',
'version' => '1.0.0',
'modes' => array(
- 'profile' => array('title' => 'ACP_CUSTOM_PROFILE_FIELDS', 'auth' => 'acl_a_user'),
+ 'profile' => array('title' => 'ACP_CUSTOM_PROFILE_FIELDS', 'auth' => 'acl_a_profile'),
),
);
}
diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php
index 2073f00e3c..fdb02fc42e 100644
--- a/phpBB/includes/acp/acp_users.php
+++ b/phpBB/includes/acp/acp_users.php
@@ -1743,6 +1743,52 @@ class acp_users
break;
+ case 'perm':
+
+ include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
+
+ $auth_admin = new auth_admin();
+
+ $user->add_lang('acp/permissions');
+ $user->add_lang('acp/permissions_phpbb');
+
+ // Select auth options
+ $sql = 'SELECT auth_option, is_local, is_global
+ FROM ' . ACL_OPTIONS_TABLE . "
+ WHERE auth_option LIKE '%\_'
+ AND is_global = 1
+ ORDER BY auth_option";
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $hold_ary = $auth_admin->get_mask('view', $user_id, false, false, $row['auth_option'], 'global', ACL_NO);
+ $auth_admin->display_mask('view', $row['auth_option'], $hold_ary, 'user', false, false);
+ }
+ $db->sql_freeresult($result);
+
+ $sql = 'SELECT auth_option, is_local, is_global
+ FROM ' . ACL_OPTIONS_TABLE . "
+ WHERE auth_option LIKE '%\_'
+ AND is_local = 1
+ ORDER BY is_global DESC, auth_option";
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $hold_ary = $auth_admin->get_mask('view', $user_id, false, false, $row['auth_option'], 'local', ACL_NO);
+ $auth_admin->display_mask('view', $row['auth_option'], $hold_ary, 'user', true, false);
+ }
+ $db->sql_freeresult($result);
+
+ $template->assign_vars(array(
+ 'S_PERMISSIONS' => true,
+ 'U_USER_PERMISSIONS' => $phpbb_admin_path . 'index.' . $phpEx . $SID . '&amp;i=permissions&amp;mode=setting_user_global&amp;user_id[]=' . $user_id,
+ 'U_USER_FORUM_PERMISSIONS' => $phpbb_admin_path . 'index.' . $phpEx . $SID . '&amp;i=permissions&amp;mode=setting_user_local&amp;user_id[]=' . $user_id)
+ );
+
+ break;
+
}
// Assign general variables
@@ -1837,7 +1883,7 @@ class acp_users_info
'rank' => array('title' => 'ACP_USER_RANK', 'auth' => 'acl_a_user', 'display' => false),
'sig' => array('title' => 'ACP_USER_SIG', 'auth' => 'acl_a_user', 'display' => false),
'groups' => array('title' => 'ACP_USER_GROUPS', 'auth' => 'acl_a_user && acl_a_group', 'display' => false),
- 'perm' => array('title' => 'ACP_USER_PERM', 'auth' => 'acl_a_user', 'display' => false),
+ 'perm' => array('title' => 'ACP_USER_PERM', 'auth' => 'acl_a_user && acl_a_viewauth', 'display' => false),
'attach' => array('title' => 'ACP_USER_ATTACH', 'auth' => 'acl_a_user', 'display' => false),
),
);
diff --git a/phpBB/includes/acp/auth.php b/phpBB/includes/acp/auth.php
new file mode 100644
index 0000000000..59a6b03d54
--- /dev/null
+++ b/phpBB/includes/acp/auth.php
@@ -0,0 +1,978 @@
+<?php
+/**
+*
+* @package phpBB3
+* @version $Id$
+* @copyright (c) 2005 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+/**
+* @package phpBB3
+* ACP Permission/Auth class
+*/
+class auth_admin extends auth
+{
+ var $option_ids = array();
+
+ /**
+ * Init auth settings
+ */
+ function auth_admin()
+ {
+ global $db, $cache;
+
+ if (($this->acl_options = $cache->get('acl_options')) === false)
+ {
+ $sql = 'SELECT auth_option, is_global, is_local
+ FROM ' . ACL_OPTIONS_TABLE . '
+ ORDER BY auth_option_id';
+ $result = $db->sql_query($sql);
+
+ $global = $local = 0;
+ while ($row = $db->sql_fetchrow($result))
+ {
+ if ($row['is_global'])
+ {
+ $this->acl_options['global'][$row['auth_option']] = $global++;
+ }
+
+ if ($row['is_local'])
+ {
+ $this->acl_options['local'][$row['auth_option']] = $local++;
+ }
+ }
+ $db->sql_freeresult($result);
+
+ $cache->put('acl_options', $this->acl_options);
+ }
+ }
+
+ /**
+ * Get permission mask
+ * This function only supports getting permissions of one type (for example a_)
+ *
+ * @param set|view $mode defines the permissions we get, view gets effective permissions (checking user AND group permissions), set only gets the user or group permission set alone
+ * @param mixed $user_id user ids to search for (a user_id or a group_id has to be specified at least)
+ * @param mixed $group_id group ids to search for, return group related settings (a user_id or a group_id has to be specified at least)
+ * @param mixed $forum_id forum_ids to search for. Defining a forum id also means getting local settings
+ * @param string $auth_option the auth_option defines the permission setting to look for (a_ for example)
+ * @param local|global $scope the scope defines the permission scope. If local, a forum_id is additionally required
+ * @param ACL_NO|ACL_UNSET|ACL_YES $acl_fill defines the mode those permissions not set are getting filled with
+ */
+ function get_mask($mode, $user_id = false, $group_id = false, $forum_id = false, $auth_option = false, $scope = false, $acl_fill = ACL_NO)
+ {
+ global $db;
+
+ $hold_ary = array();
+
+ if ($auth_option === false || $scope === false)
+ {
+ return array();
+ }
+
+ $acl_user_function = ($mode == 'set') ? 'acl_user_raw_data' : 'acl_raw_data';
+
+ if ($forum_id !== false)
+ {
+ $hold_ary = ($group_id !== false) ? $this->acl_group_raw_data($group_id, $auth_option . '%', $forum_id) : $this->$acl_user_function($user_id, $auth_option . '%', $forum_id);
+ }
+ else
+ {
+ $hold_ary = ($group_id !== false) ? $this->acl_group_raw_data($group_id, $auth_option . '%', ($scope == 'global') ? 0 : false) : $this->$acl_user_function($user_id, $auth_option . '%', ($scope == 'global') ? 0 : false);
+ }
+
+ // Make sure hold_ary is filled with every setting (prevents missing forums/users/groups)
+ $ug_id = ($group_id !== false) ? ((!is_array($group_id)) ? array($group_id) : $group_id) : ((!is_array($user_id)) ? array($user_id) : $user_id);
+ $forum_ids = ($forum_id !== false) ? ((!is_array($forum_id)) ? array($forum_id) : $forum_id) : (($scope == 'global') ? array(0) : array());
+
+ // If forum_ids is false and the scope is local we actually want to have all forums within the array
+ if ($scope == 'local' && !sizeof($forum_ids))
+ {
+ $sql = 'SELECT forum_id
+ FROM ' . FORUMS_TABLE;
+ $result = $db->sql_query($sql, 120);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $forum_ids[] = $row['forum_id'];
+ }
+ $db->sql_freeresult($result);
+ }
+
+ foreach ($ug_id as $_id)
+ {
+ if (!isset($hold_ary[$_id]))
+ {
+ $hold_ary[$_id] = array();
+ }
+
+ foreach ($forum_ids as $f_id)
+ {
+ if (!isset($hold_ary[$_id][$f_id]))
+ {
+ $hold_ary[$_id][$f_id] = array();
+ }
+ }
+ }
+
+ // Now, we need to fill the gaps with $acl_fill. ;)
+
+ // Only those options we need
+ $compare_options = array_diff(preg_replace('/^((?!' . $auth_option . ').+)|(' . $auth_option . ')$/', '', array_keys($this->acl_options[$scope])), array(''));
+
+ // Now switch back to keys
+ if (sizeof($compare_options))
+ {
+ $compare_options = array_combine($compare_options, array_fill(1, sizeof($compare_options), $acl_fill));
+ }
+
+ // Defining the user-function here to save some memory
+ $return_acl_fill = create_function('$value', 'return ' . $acl_fill . ';');
+
+ // Actually fill the gaps
+ if (sizeof($hold_ary))
+ {
+ foreach ($hold_ary as $ug_id => $row)
+ {
+ foreach ($row as $id => $options)
+ {
+ // Do not include the global auth_option
+ unset($options[$auth_option]);
+
+ // Not a "fine" solution, but at all it's a 1-dimensional
+ // array_diff_key function filling the resulting array values with zeros
+ // The differences get merged into $hold_ary (all permissions having $acl_fill set)
+ $hold_ary[$ug_id][$id] = array_merge($options,
+
+ array_map($return_acl_fill,
+ array_flip(
+ array_diff(
+ array_keys($compare_options), array_keys($options)
+ )
+ )
+ )
+ );
+ }
+ }
+ }
+ else
+ {
+ $hold_ary[($group_id !== false) ? $group_id : $user_id][(int) $forum_id] = $compare_options;
+ }
+
+ return $hold_ary;
+ }
+
+ /**
+ * Get permission mask for presets
+ * This function only supports getting masks for one preset
+ */
+ function get_preset_mask($preset_id)
+ {
+ global $db;
+
+ $hold_ary = array();
+
+ // Get users having this preset set...
+ $sql = 'SELECT user_id, forum_id
+ FROM ' . ACL_USERS_TABLE . '
+ WHERE auth_preset_id = ' . $preset_id . '
+ ORDER BY forum_id';
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $hold_ary[$row['forum_id']]['users'][] = $row['user_id'];
+ }
+ $db->sql_freeresult($result);
+
+ // Now grab groups...
+ $sql = 'SELECT group_id, forum_id
+ FROM ' . ACL_GROUPS_TABLE . '
+ WHERE auth_preset_id = ' . $preset_id . '
+ ORDER BY forum_id';
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $hold_ary[$row['forum_id']]['groups'][] = $row['group_id'];
+ }
+ $db->sql_freeresult($result);
+
+ return $hold_ary;
+ }
+
+ /**
+ * Display permission mask for presets
+ */
+ function display_preset_mask(&$hold_ary)
+ {
+ global $db, $template, $user, $phpbb_root_path, $phpbb_admin_path, $phpEx, $SID;
+
+ if (!sizeof($hold_ary))
+ {
+ return;
+ }
+
+ // Get forum names
+ $sql = 'SELECT forum_id, forum_name
+ FROM ' . FORUMS_TABLE . '
+ WHERE forum_id IN (' . implode(', ', array_keys($hold_ary)) . ')';
+ $result = $db->sql_query($sql);
+
+ $forum_names = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $forum_names[$row['forum_id']] = $row['forum_name'];
+ }
+ $db->sql_freeresult($result);
+
+ foreach ($hold_ary as $forum_id => $auth_ary)
+ {
+ $template->assign_block_vars('preset_mask', array(
+ 'NAME' => ($forum_id == 0) ? $user->lang['GLOBAL_MASK'] : $forum_names[$forum_id],
+ 'FORUM_ID' => $forum_id)
+ );
+
+ if (isset($auth_ary['users']) && sizeof($auth_ary['users']))
+ {
+ $sql = 'SELECT user_id, username
+ FROM ' . USERS_TABLE . '
+ WHERE user_id IN (' . implode(', ', $auth_ary['users']) . ')
+ ORDER BY username';
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $template->assign_block_vars('preset_mask.users', array(
+ 'USER_ID' => $row['user_id'],
+ 'USERNAME' => $row['username'],
+ 'U_PROFILE' => "{$phpbb_root_path}memberlist.$phpEx$SID&amp;mode=viewprofile&amp;u={$row['user_id']}")
+ );
+ }
+ $db->sql_freeresult($result);
+ }
+
+ if (isset($auth_ary['groups']) && sizeof($auth_ary['groups']))
+ {
+ $sql = 'SELECT group_id, group_name, group_type
+ FROM ' . GROUPS_TABLE . '
+ WHERE group_id IN (' . implode(', ', $auth_ary['groups']) . ')
+ ORDER BY group_type ASC, group_name';
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $template->assign_block_vars('preset_mask.groups', array(
+ 'GROUP_ID' => $row['group_id'],
+ 'GROUP_NAME' => ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'],
+ 'U_PROFILE' => $phpbb_root_path . "memberlist.$phpEx$SID&amp;mode=group&amp;g={$row['group_id']}")
+ );
+ }
+ $db->sql_freeresult($result);
+ }
+ }
+ }
+
+ /**
+ * NOTE: this function is not in use atm
+ * Add a new option to the list ... $options is a hash of form ->
+ * $options = array(
+ * 'local' => array('option1', 'option2', ...),
+ * 'global' => array('optionA', 'optionB', ...)
+ * );
+ */
+ function acl_add_option($options)
+ {
+ global $db, $cache;
+
+ if (!is_array($options))
+ {
+ return false;
+ }
+
+ $cur_options = array();
+
+ $sql = 'SELECT auth_option, is_global, is_local
+ FROM ' . ACL_OPTIONS_TABLE . '
+ ORDER BY auth_option_id';
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ if ($row['is_global'])
+ {
+ $cur_options['global'][] = $row['auth_option'];
+ }
+
+ if ($row['is_local'])
+ {
+ $cur_options['local'][] = $row['auth_option'];
+ }
+ }
+ $db->sql_freeresult($result);
+
+ // Here we need to insert new options ... this requires discovering whether
+ // an options is global, local or both and whether we need to add an permission
+ // set flag (x_)
+ $new_options = array('local' => array(), 'global' => array());
+
+ foreach ($options as $type => $option_ary)
+ {
+ $option_ary = array_unique($option_ary);
+
+ foreach ($option_ary as $option_value)
+ {
+ if (!in_array($option_value, $cur_options[$type]))
+ {
+ $new_options[$type][] = $option_value;
+ }
+
+ $flag = substr($option_value, 0, strpos($option_value, '_') + 1);
+
+ if (!in_array($flag, $cur_options[$type]) && !in_array($flag, $new_options[$type]))
+ {
+ $new_options[$type][] = $flag;
+ }
+ }
+ }
+ unset($options);
+
+ $options = array();
+ $options['local'] = array_diff($new_options['local'], $new_options['global']);
+ $options['global'] = array_diff($new_options['global'], $new_options['local']);
+ $options['local_global'] = array_intersect($new_options['local'], $new_options['global']);
+
+ $sql_ary = array();
+
+ foreach ($options as $type => $option_ary)
+ {
+ foreach ($option_ary as $option)
+ {
+ $sql_ary[] = array(
+ 'auth_option' => $option,
+ 'is_global' => ($type == 'global' || $type == 'local_global') ? 1 : 0,
+ 'is_local' => ($type == 'local' || $type == 'local_global') ? 1 : 0
+ );
+ }
+ }
+
+ if (sizeof($sql_ary))
+ {
+ switch (SQL_LAYER)
+ {
+ case 'mysql':
+ case 'mysql4':
+ case 'mysqli':
+ $db->sql_query('INSERT INTO ' . ACL_OPTIONS_TABLE . ' ' . $db->sql_build_array('MULTI_INSERT', $sql_ary));
+ break;
+
+ default:
+ foreach ($sql_ary as $ary)
+ {
+ $db->sql_query('INSERT INTO ' . ACL_OPTIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $ary));
+ }
+ break;
+ }
+ }
+
+ $cache->destroy('acl_options');
+
+ return true;
+ }
+
+ /**
+ * Set a preset ACL record
+ */
+ function acl_set_preset($preset_id, &$auth)
+ {
+ global $db;
+
+ if (!sizeof($this->option_ids))
+ {
+ $sql = 'SELECT auth_option_id, auth_option
+ FROM ' . ACL_OPTIONS_TABLE;
+ $result = $db->sql_query($sql);
+
+ $this->option_ids = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $this->option_ids[$row['auth_option']] = $row['auth_option_id'];
+ }
+ $db->sql_freeresult($result);
+ }
+
+ // Set any flags as required
+ foreach ($auth as $auth_option => $setting)
+ {
+ $flag = substr($auth_option, 0, strpos($auth_option, '_') + 1);
+
+ if (!isset($auth[$flag]) || !$auth[$flag])
+ {
+ $auth[$flag] = $setting;
+ }
+ }
+
+ $sql = 'SELECT auth_option_id, auth_setting
+ FROM ' . ACL_PRESETS_DATA_TABLE . '
+ WHERE preset_id = ' . $preset_id;
+ $result = $db->sql_query($sql);
+
+ $cur_auth = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $cur_auth[$row['auth_option_id']] = $row['auth_setting'];
+ }
+ $db->sql_freeresult($result);
+
+ $sql_ary = array();
+
+ foreach ($auth as $auth_option => $setting)
+ {
+ $auth_option_id = (int) $this->option_ids[$auth_option];
+
+ switch ($setting)
+ {
+ case ACL_UNSET:
+ if (isset($cur_auth[$auth_option_id]))
+ {
+ $sql_ary['delete'][] = 'DELETE FROM ' . ACL_PRESETS_DATA_TABLE . '
+ WHERE auth_option_id = ' . $auth_option_id . '
+ AND preset_id = ' . $preset_id;
+ }
+ break;
+
+ default:
+ if (!isset($cur_auth[$auth_option_id]))
+ {
+ $sql_ary['insert'][] = array(
+ 'preset_id' => (int) $preset_id,
+ 'auth_option_id' => (int) $auth_option_id,
+ 'auth_setting' => (int) $setting
+ );
+ }
+ else if ($cur_auth[$auth_option_id] != $setting)
+ {
+ $sql_ary['update'][] = 'UPDATE ' . ACL_PRESETS_DATA_TABLE . '
+ SET auth_setting = ' . (int) $setting . '
+ WHERE preset_id = ' . $preset_id . '
+ AND auth_option_id = ' . $auth_option_id;
+ }
+ break;
+ }
+ }
+ unset($cur_auth);
+
+ foreach ($sql_ary as $sql_type => $sql_subary)
+ {
+ switch ($sql_type)
+ {
+ case 'insert':
+ switch (SQL_LAYER)
+ {
+ case 'mysql':
+ case 'mysql4':
+ case 'mysqli':
+ $db->sql_query('INSERT INTO ' . ACL_PRESETS_DATA_TABLE . ' ' . $db->sql_build_array('MULTI_INSERT', $sql_subary));
+ break;
+
+ default:
+ foreach ($sql_subary as $ary)
+ {
+ $db->sql_query('INSERT INTO ' . ACL_PRESETS_DATA_TABLE . ' ' . $db->sql_build_array('INSERT', $ary));
+ }
+ break;
+ }
+ break;
+
+ case 'update':
+ case 'delete':
+ foreach ($sql_subary as $sql)
+ {
+ $db->sql_query($sql);
+ }
+ break;
+ }
+ }
+
+ $this->acl_clear_prefetch();
+ }
+
+ /**
+ * Set a user or group ACL record
+ */
+ function acl_set($ug_type, &$forum_id, &$ug_id, &$auth)
+ {
+ global $db;
+
+ // One or more forums
+ if (!is_array($forum_id))
+ {
+ $forum_id = array($forum_id);
+ }
+
+ // One or more users
+ if (!is_array($ug_id))
+ {
+ $ug_id = array($ug_id);
+ }
+
+ if (!sizeof($this->option_ids))
+ {
+ $sql = 'SELECT auth_option_id, auth_option
+ FROM ' . ACL_OPTIONS_TABLE;
+ $result = $db->sql_query($sql);
+
+ $this->option_ids = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $this->option_ids[$row['auth_option']] = $row['auth_option_id'];
+ }
+ $db->sql_freeresult($result);
+ }
+
+ $ug_id_sql = 'IN (' . implode(', ', array_map('intval', $ug_id)) . ')';
+ $forum_sql = 'IN (' . implode(', ', array_map('intval', $forum_id)) . ') ';
+
+ // Set any flags as required
+ foreach ($auth as $auth_option => $setting)
+ {
+ $flag = substr($auth_option, 0, strpos($auth_option, '_') + 1);
+
+ if (!isset($auth[$flag]) || !$auth[$flag])
+ {
+ $auth[$flag] = $setting;
+ }
+ }
+
+ if ($ug_type == 'user')
+ {
+ $sql = 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting
+ FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o
+ WHERE a.auth_option_id = o.auth_option_id
+ AND a.forum_id $forum_sql
+ AND a.user_id $ug_id_sql";
+ }
+ else
+ {
+ $sql = 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting
+ FROM ' . ACL_GROUPS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o
+ WHERE a.auth_option_id = o.auth_option_id
+ AND a.forum_id $forum_sql
+ AND a.group_id $ug_id_sql";
+ }
+ $result = $db->sql_query($sql);
+
+ $cur_auth = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $cur_auth[$row['forum_id']][$row['auth_option_id']] = $row['auth_setting'];
+ }
+ $db->sql_freeresult($result);
+
+ $table = ($ug_type == 'user') ? ACL_USERS_TABLE : ACL_GROUPS_TABLE;
+ $id_field = $ug_type . '_id';
+
+ $sql_ary = array();
+ foreach ($forum_id as $forum)
+ {
+ $forum = (int) $forum;
+
+ foreach ($auth as $auth_option => $setting)
+ {
+ $auth_option_id = (int) $this->option_ids[$auth_option];
+
+ switch ($setting)
+ {
+ case ACL_UNSET:
+ if (isset($cur_auth[$forum][$auth_option_id]))
+ {
+ $sql_ary['delete'][] = "DELETE FROM $table
+ WHERE forum_id = $forum
+ AND auth_option_id = $auth_option_id
+ AND $id_field $ug_id_sql";
+ }
+ break;
+
+ default:
+ if (!isset($cur_auth[$forum][$auth_option_id]))
+ {
+ foreach ($ug_id as $id)
+ {
+ $sql_ary['insert'][] = array(
+ $id_field => (int) $id,
+ 'forum_id' => (int) $forum,
+ 'auth_option_id' => (int) $auth_option_id,
+ 'auth_setting' => (int) $setting
+ );
+ }
+ }
+ else if ($cur_auth[$forum][$auth_option_id] != $setting)
+ {
+ $sql_ary['update'][] = "UPDATE $table
+ SET auth_setting = " . (int) $setting . "
+ WHERE $id_field $ug_id_sql
+ AND forum_id = $forum
+ AND auth_option_id = $auth_option_id";
+ }
+ break;
+ }
+ }
+ }
+ unset($cur_auth);
+
+ foreach ($sql_ary as $sql_type => $sql_subary)
+ {
+ switch ($sql_type)
+ {
+ case 'insert':
+ switch (SQL_LAYER)
+ {
+ case 'mysql':
+ case 'mysql4':
+ case 'mysqli':
+ $db->sql_query("INSERT INTO $table " . $db->sql_build_array('MULTI_INSERT', $sql_subary));
+ break;
+
+ default:
+ foreach ($sql_subary as $ary)
+ {
+ $db->sql_query("INSERT INTO $table " . $db->sql_build_array('INSERT', $ary));
+ }
+ break;
+ }
+ break;
+
+ case 'update':
+ case 'delete':
+ foreach ($sql_subary as $sql)
+ {
+ $db->sql_query($sql);
+ }
+ break;
+ }
+ }
+
+ $this->acl_clear_prefetch();
+ }
+
+ /**
+ * Remove local permission
+ */
+ function acl_delete($mode, $ug_id = false, $forum_id = false, $auth_id = false)
+ {
+ global $db;
+
+ if ($ug_id === false && $forum_id === false && $auth_ids === false)
+ {
+ return;
+ }
+
+ $table = ($mode == 'user') ? ACL_USERS_TABLE : ACL_GROUPS_TABLE;
+ $id_field = $mode . '_id';
+
+ $sql = array();
+
+ if ($auth_id !== false)
+ {
+ $sql[] = (!is_array($auth_id)) ? 'auth_option_id = ' . (int) $auth_id : 'auth_option_id IN (' . implode(', ', array_map('intval', $auth_id)) . ')';
+ }
+
+ if ($forum_id !== false)
+ {
+ $sql[] = (!is_array($forum_id)) ? 'forum_id = ' . (int) $forum_id : 'forum_id IN (' . implode(', ', array_map('intval', $forum_id)) . ')';
+ }
+
+ if ($ug_id !== false)
+ {
+ $sql[] = (!is_array($ug_id)) ? $id_field . ' = ' . (int) $ug_id : $id_field . ' IN (' . implode(', ', array_map('intval', $ug_id)) . ')';
+ }
+
+ $sql = "DELETE FROM $table
+ WHERE " . implode(' AND ', $sql);
+ $db->sql_query($sql);
+
+ $this->acl_clear_prefetch();
+ }
+
+ /**
+ * Display permission mask (assign to template)
+ */
+ function display_mask($mode, $permission_type, &$hold_ary, $user_mode = 'user', $local = false, $group_display = true)
+ {
+ global $template, $user, $db, $phpbb_root_path, $phpEx, $SID;
+
+ // Define names for template loops, might be able to be set
+ $tpl_pmask = 'p_mask';
+ $tpl_fmask = 'f_mask';
+ $tpl_category = 'category';
+ $tpl_mask = 'mask';
+
+ $l_acl_type = (isset($user->lang['ACL_TYPE_' . (($local) ? 'LOCAL' : 'GLOBAL') . '_' . strtoupper($permission_type)])) ? $user->lang['ACL_TYPE_' . (($local) ? 'LOCAL' : 'GLOBAL') . '_' . strtoupper($permission_type)] : 'ACL_TYPE_' . (($local) ? 'LOCAL' : 'GLOBAL') . '_' . strtoupper($permission_type);
+
+ // Get names
+ if ($user_mode == 'user')
+ {
+ $sql = 'SELECT user_id as ug_id, username as ug_name
+ FROM ' . USERS_TABLE . '
+ WHERE user_id IN (' . implode(', ', array_keys($hold_ary)) . ')
+ ORDER BY username ASC';
+ }
+ else
+ {
+ $sql = 'SELECT group_id as ug_id, group_name as ug_name, group_type
+ FROM ' . GROUPS_TABLE . '
+ WHERE group_id IN (' . implode(', ', array_keys($hold_ary)) . ')
+ ORDER BY group_type DESC, group_name ASC';
+ }
+ $result = $db->sql_query($sql);
+
+ $ug_names_ary = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $ug_names_ary[$row['ug_id']] = ($user_mode == 'user') ? $row['ug_name'] : (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['ug_name']] : $row['ug_name']);
+ }
+ $db->sql_freeresult($result);
+
+ // Get used forums
+ $forum_ids = array();
+ foreach ($hold_ary as $ug_id => $row)
+ {
+ $forum_ids = array_merge($forum_ids, array_keys($row));
+ }
+ $forum_ids = array_unique($forum_ids);
+
+ $forum_names_ary = array();
+ if ($local)
+ {
+ $forum_names_ary = make_forum_select(false, false, true, false, false, true);
+ }
+ else
+ {
+ $forum_names_ary[0] = $l_acl_type;
+ }
+
+ // Now obtain memberships
+ $user_groups_default = $user_groups_custom = array();
+ if ($user_mode == 'user' && $group_display)
+ {
+ $sql = 'SELECT group_id, group_name, group_type
+ FROM ' . GROUPS_TABLE . '
+ ORDER BY group_type DESC, group_name ASC';
+ $result = $db->sql_query($sql);
+
+ $groups = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $groups[$row['group_id']] = $row;
+ }
+ $db->sql_freeresult($result);
+
+ $memberships = group_memberships(false, array_keys($hold_ary), false);
+
+ foreach ($memberships as $row)
+ {
+ if ($groups[$row['group_id']]['group_type'] == GROUP_SPECIAL)
+ {
+ $user_groups_default[$row['user_id']][] = $user->lang['G_' . $groups[$row['group_id']]['group_name']];
+ }
+ else
+ {
+ $user_groups_custom[$row['user_id']][] = $groups[$row['group_id']]['group_name'];
+ }
+ }
+ unset($memberships, $groups);
+ }
+
+ // If we only have one forum id to display, we switch the complete interface to group by user/usergroup instead of grouping by forum
+ // To achive this, we need to switch the array a bit
+ if (sizeof($forum_ids) == 1)
+ {
+ $hold_ary_temp = $hold_ary;
+ $hold_ary = array();
+ foreach ($hold_ary_temp as $ug_id => $row)
+ {
+ foreach ($row as $forum_id => $auth_row)
+ {
+ $hold_ary[$forum_id][$ug_id] = $auth_row;
+ }
+ }
+ unset($hold_ary_temp);
+
+ foreach ($hold_ary as $forum_id => $forum_array)
+ {
+ $content_array = $categories = array();
+ $this->build_permission_array($hold_ary[$forum_id], $content_array, $categories, array_keys($ug_names_ary));
+
+ $template->assign_block_vars($tpl_pmask, array(
+ 'NAME' => ($forum_id == 0) ? $forum_names_ary[0] : $forum_names_ary[$forum_id]['forum_name'],
+ 'CATEGORIES' => implode('</th><th>', $categories),
+
+ 'L_ACL_TYPE' => $l_acl_type,
+
+ 'S_LOCAL' => ($local) ? true : false,
+ 'S_GLOBAL' => (!$local) ? true : false,
+ 'S_NUM_CATS' => sizeof($categories),
+ 'S_VIEW' => ($mode == 'view') ? true : false,
+ 'S_NUM_OBJECTS' => sizeof($content_array),
+ 'S_USER_MODE' => ($user_mode == 'user') ? true : false,
+ 'S_GROUP_MODE' => ($user_mode == 'group') ? true : false)
+ );
+
+ foreach ($content_array as $ug_id => $ug_array)
+ {
+ $template->assign_block_vars($tpl_pmask . '.' . $tpl_fmask, array(
+ 'NAME' => $ug_names_ary[$ug_id],
+ 'UG_ID' => $ug_id,
+ 'FORUM_ID' => $forum_id)
+ );
+
+ $this->assign_cat_array($ug_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id);
+ }
+ }
+ }
+ else
+ {
+ foreach ($ug_names_ary as $ug_id => $ug_name)
+ {
+ if (!isset($hold_ary[$ug_id]))
+ {
+ continue;
+ }
+
+ $content_array = $categories = array();
+ $this->build_permission_array($hold_ary[$ug_id], $content_array, $categories, array_keys($forum_names_ary));
+
+ $template->assign_block_vars($tpl_pmask, array(
+ 'NAME' => $ug_name,
+ 'CATEGORIES' => implode('</th><th>', $categories),
+
+ 'USER_GROUPS_DEFAULT' => ($user_mode == 'user' && isset($user_groups_default[$ug_id]) && sizeof($user_groups_default[$ug_id])) ? implode(', ', $user_groups_default[$ug_id]) : '',
+ 'USER_GROUPS_CUSTOM' => ($user_mode == 'user' && isset($user_groups_custom[$ug_id]) && sizeof($user_groups_custom[$ug_id])) ? implode(', ', $user_groups_custom[$ug_id]) : '',
+ 'L_ACL_TYPE' => $l_acl_type,
+
+ 'S_LOCAL' => ($local) ? true : false,
+ 'S_GLOBAL' => (!$local) ? true : false,
+ 'S_NUM_CATS' => sizeof($categories),
+ 'S_VIEW' => ($mode == 'view') ? true : false,
+ 'S_NUM_OBJECTS' => sizeof($content_array),
+ 'S_USER_MODE' => ($user_mode == 'user') ? true : false,
+ 'S_GROUP_MODE' => ($user_mode == 'group') ? true : false)
+ );
+
+ foreach ($content_array as $forum_id => $forum_array)
+ {
+ $template->assign_block_vars($tpl_pmask . '.' . $tpl_fmask, array(
+ 'NAME' => ($forum_id == 0) ? $forum_names_ary[0] : $forum_names_ary[$forum_id]['forum_name'],
+ 'PADDING' => ($forum_id == 0) ? '' : $forum_names_ary[$forum_id]['padding'],
+ 'UG_ID' => $ug_id,
+ 'FORUM_ID' => $forum_id)
+ );
+
+ $this->assign_cat_array($forum_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id);
+ }
+ }
+ }
+ }
+
+ /**
+ * Assign category to template
+ * used by display_mask()
+ */
+ function assign_cat_array(&$category_array, $tpl_cat, $tpl_mask, $ug_id, $forum_id)
+ {
+ global $template, $user;
+
+ foreach ($category_array as $cat => $cat_array)
+ {
+ $template->assign_block_vars($tpl_cat, array(
+ 'S_YES' => ($cat_array['S_YES'] && !$cat_array['S_NO'] && !$cat_array['S_UNSET']) ? true : false,
+ 'S_NO' => ($cat_array['S_NO'] && !$cat_array['S_YES'] && !$cat_array['S_UNSET']) ? true : false,
+ 'S_UNSET' => ($cat_array['S_UNSET'] && !$cat_array['S_NO'] && !$cat_array['S_YES']) ? true : false,
+
+ 'CAT_NAME' => $user->lang['permission_cat'][$cat])
+ );
+
+ foreach ($cat_array['permissions'] as $permission => $allowed)
+ {
+ $template->assign_block_vars($tpl_cat . '.' . $tpl_mask, array(
+ 'S_YES' => ($allowed == 1) ? true : false,
+ 'S_NO' => ($allowed == 0) ? true : false,
+ 'S_UNSET' => ($allowed == -1) ? true : false,
+
+ 'UG_ID' => $ug_id,
+ 'FORUM_ID' => $forum_id,
+ 'FIELD_NAME' => $permission,
+ 'S_FIELD_NAME' => 'setting[' . $ug_id . '][' . $forum_id . '][' . $permission . ']',
+
+ 'PERMISSION' => $user->lang['acl_' . $permission]['lang'])
+ );
+ }
+ }
+ }
+
+ /**
+ * Building content array from permission rows with explicit key ordering
+ * used by display_mask()
+ */
+ function build_permission_array(&$permission_row, &$content_array, &$categories, $key_sort_array)
+ {
+ global $user;
+
+ foreach ($key_sort_array as $forum_id)
+ {
+ if (!isset($permission_row[$forum_id]))
+ {
+ continue;
+ }
+
+ $permissions = $permission_row[$forum_id];
+ ksort($permissions);
+
+ foreach ($permissions as $permission => $auth_setting)
+ {
+ if (!isset($user->lang['acl_' . $permission]))
+ {
+ $user->lang['acl_' . $permission] = array(
+ 'cat' => 'misc',
+ 'lang' => '{ acl_' . $permission . ' }'
+ );
+ }
+
+ $cat = $user->lang['acl_' . $permission]['cat'];
+
+ // Build our categories array
+ if (!isset($categories[$cat]))
+ {
+ $categories[$cat] = $user->lang['permission_cat'][$cat];
+ }
+
+ // Build our content array
+ if (!isset($content_array[$forum_id]))
+ {
+ $content_array[$forum_id] = array();
+ }
+
+ if (!isset($content_array[$forum_id][$cat]))
+ {
+ $content_array[$forum_id][$cat] = array(
+ 'S_YES' => false,
+ 'S_NO' => false,
+ 'S_UNSET' => false,
+ 'permissions' => array(),
+ );
+ }
+
+ $content_array[$forum_id][$cat]['S_YES'] |= ($auth_setting == ACL_YES) ? true : false;
+ $content_array[$forum_id][$cat]['S_NO'] |= ($auth_setting == ACL_NO) ? true : false;
+ $content_array[$forum_id][$cat]['S_UNSET'] |= ($auth_setting == ACL_UNSET) ? true : false;
+
+ $content_array[$forum_id][$cat]['permissions'][$permission] = $auth_setting;
+ }
+ }
+ }
+}
+
+?> \ No newline at end of file
diff --git a/phpBB/includes/auth.php b/phpBB/includes/auth.php
index 9608909088..ad6de1d6a8 100644
--- a/phpBB/includes/auth.php
+++ b/phpBB/includes/auth.php
@@ -494,6 +494,52 @@ class auth
}
/**
+ * Get raw user based permission settings
+ */
+ function acl_user_raw_data($user_id = false, $opts = false, $forum_id = false)
+ {
+ global $db;
+
+ $sql_user = ($user_id !== false) ? ((!is_array($user_id)) ? "user_id = $user_id" : 'user_id IN (' . implode(', ', $user_id) . ')') : '';
+ $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? "AND a.forum_id = $forum_id" : 'AND a.forum_id IN (' . implode(', ', $forum_id) . ')') : '';
+
+ $sql_opts = '';
+
+ if ($opts !== false)
+ {
+ if (!is_array($opts))
+ {
+ $sql_opts = (strpos($opts, '%') !== false) ? "AND ao.auth_option LIKE '" . $db->sql_escape($opts) . "'" : "AND ao.auth_option = '" . $db->sql_escape($opts) . "'";
+ }
+ else
+ {
+ $sql_opts = 'AND ao.auth_option IN (' . implode(', ', preg_replace('#^\s*(.*)\s*$#e', "\"'\" . \$db->sql_escape('\\1') . \"'\"", $opts)) . ')';
+ }
+ }
+
+ $hold_ary = array();
+
+ // Grab user settings ... each user has only one setting for each
+ // option ... so we shouldn't need any ACL_NO checks ... he says ...
+ $sql = 'SELECT ao.auth_option, a.user_id, a.forum_id, a.auth_setting
+ FROM ' . ACL_OPTIONS_TABLE . ' ao, ' . ACL_USERS_TABLE . ' a
+ WHERE ao.auth_option_id = a.auth_option_id
+ ' . (($sql_user) ? 'AND a.' . $sql_user : '') . "
+ $sql_forum
+ $sql_opts
+ ORDER BY a.forum_id, ao.auth_option_id";
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting'];
+ }
+ $db->sql_freeresult($result);
+
+ return $hold_ary;
+ }
+
+ /**
* Get raw group based permission settings
*/
function acl_group_raw_data($group_id = false, $opts = false, $forum_id = false)
diff --git a/phpBB/includes/constants.php b/phpBB/includes/constants.php
index 0f1ccafe38..3a25de7942 100644
--- a/phpBB/includes/constants.php
+++ b/phpBB/includes/constants.php
@@ -117,8 +117,8 @@ define('FIELD_DATE', 6);
// Table names
define('ACL_GROUPS_TABLE', $table_prefix.'auth_groups');
define('ACL_OPTIONS_TABLE', $table_prefix.'auth_options');
-define('ACL_DEPS_TABLE', $table_prefix.'auth_deps');
define('ACL_PRESETS_TABLE', $table_prefix.'auth_presets');
+define('ACL_PRESETS_DATA_TABLE', $table_prefix.'auth_preset_data');
define('ACL_USERS_TABLE', $table_prefix.'auth_users');
define('ATTACHMENTS_TABLE', $table_prefix.'attachments');
define('BANLIST_TABLE', $table_prefix.'banlist');
diff --git a/phpBB/includes/db/dbal.php b/phpBB/includes/db/dbal.php
index 68f2f97ade..bce4398cb3 100644
--- a/phpBB/includes/db/dbal.php
+++ b/phpBB/includes/db/dbal.php
@@ -205,11 +205,13 @@ class dbal
// Show complete SQL error and path to administrators only
if ($auth->acl_get('a_'))
- {
- $this_page = (isset($_SERVER['PHP_SELF']) && !empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : $_ENV['PHP_SELF'];
- $this_page .= '&' . ((isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : (isset($_ENV['QUERY_STRING']) ? $_ENV['QUERY_STRING'] : ''));
+ {
+ // Print out a nice backtrace...
+ $backtrace = get_backtrace();
- $message .= '<br /><br /><u>CALLING PAGE</u><br /><br />' . htmlspecialchars($this_page) . (($sql != '') ? '<br /><br /><u>SQL</u><br /><br />' . $sql : '') . '<br />';
+ $message .= ($sql) ? '<br /><br /><u>SQL</u><br /><br />' . $sql : '';
+ $message .= ($backtrace) ? '<br /><br /><u>BACKTRACE</u><br />' . $backtrace : '';
+ $message .= '<br />';
}
else
{
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index a5c96f5031..c139eb5a11 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -2165,4 +2165,76 @@ function page_footer()
exit;
}
+/**
+* Return a nicely formatted backtrace (parts from the php manual by diz at ysagoon dot com)
+*/
+function get_backtrace()
+{
+ global $phpbb_root_path;
+
+ $output = '<div style="font-family: monospace;">';
+ $backtrace = debug_backtrace();
+ $path = realpath($phpbb_root_path);
+
+ foreach ($backtrace as $number => $trace)
+ {
+ // We skip the first one, because it only shows this file/function
+ if ($number == 0)
+ {
+ continue;
+ }
+
+ // Strip the current directory from path
+ $trace['file'] = str_replace(array($path, '\\'), array('', '/'), $trace['file']);
+ $trace['file'] = substr($trace['file'], 1);
+
+ $args = array();
+ foreach ($trace['args'] as $argument)
+ {
+ switch (gettype($argument))
+ {
+ case 'integer':
+ case 'double':
+ $args[] = $argument;
+ break;
+
+ case 'string':
+ $argument = htmlspecialchars(substr($argument, 0, 64)) . ((strlen($argument) > 64) ? '...' : '');
+ $args[] = '"' . $argument . '"';
+ break;
+
+ case 'array':
+ $args[] = 'Array(' . sizeof($argument) . ')';
+ break;
+
+ case 'object':
+ $args[] = 'Object(' . get_class($argument) . ')';
+ break;
+
+ case 'resource':
+ $args[] = 'Resource(' . strstr($a, '#') . ')';
+ break;
+
+ case 'boolean':
+ $args[] = ($argument) ? 'true' : 'false';
+ break;
+
+ case 'NULL':
+ $args[] = 'NULL';
+ break;
+
+ default:
+ $args[] = 'Unknown';
+ }
+ }
+
+ $output .= '<br />';
+ $output .= '<b>FILE:</b> ' . htmlspecialchars($trace['file']) . '<br />';
+ $output .= '<b>LINE:</b> ' . $trace['line'] . '<br />';
+ $output .= '<b>CALL:</b> ' . htmlspecialchars($trace['class'] . $trace['type'] . $trace['function']) . '(' . ((sizeof($args)) ? implode(', ', $args) : '') . ')<br />';
+ }
+ $output .= '</div>';
+ return $output;
+}
+
?> \ No newline at end of file
diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php
index 32cb2b383d..1aa18b467f 100644
--- a/phpBB/includes/functions_admin.php
+++ b/phpBB/includes/functions_admin.php
@@ -1,7 +1,7 @@
<?php
/**
*
-* @package phpBB3
+* @package acp
* @version $Id$
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php
index a0708e88bb..5668fee1d0 100644
--- a/phpBB/includes/functions_user.php
+++ b/phpBB/includes/functions_user.php
@@ -923,15 +923,16 @@ function validate_email($email)
return 'EMAIL_INVALID';
}
- $banned = false;
-
- // TODO: This is a duplication of code from session->check_ban()
+ /**
+ * @todo This is a duplication of code from session->check_ban()
+ */
$sql = 'SELECT ban_ip, ban_userid, ban_email, ban_exclude, ban_give_reason, ban_end
FROM ' . BANLIST_TABLE . '
WHERE ban_end >= ' . time() . '
OR ban_end = 0';
$result = $db->sql_query($sql);
+ $banned = false;
if ($row = $db->sql_fetchrow($result))
{
do
diff --git a/phpBB/index.php b/phpBB/index.php
index 97bf667475..81ce34574f 100644
--- a/phpBB/index.php
+++ b/phpBB/index.php
@@ -48,7 +48,6 @@ while ($row = $db->sql_fetchrow($result))
}
$db->sql_freeresult($result);
-
// Generate birthday list if required ...
$birthday_list = '';
if ($config['load_birthdays'])
diff --git a/phpBB/install/schemas/firebird_schema.sql b/phpBB/install/schemas/firebird_schema.sql
index 813f490b1f..62dbf6a1a0 100644
--- a/phpBB/install/schemas/firebird_schema.sql
+++ b/phpBB/install/schemas/firebird_schema.sql
@@ -27,6 +27,7 @@ CREATE TABLE phpbb_auth_groups (
group_id INTEGER DEFAULT 0 NOT NULL,
forum_id INTEGER DEFAULT 0 NOT NULL,
auth_option_id INTEGER DEFAULT 0 NOT NULL,
+ auth_preset_id INTEGER DEFAULT 0 NOT NULL,
auth_setting INTEGER DEFAULT 0 NOT NULL
);;
@@ -43,16 +44,23 @@ CREATE TABLE phpbb_auth_options (
CREATE TABLE phpbb_auth_presets (
preset_id INTEGER NOT NULL,
preset_name VARCHAR(50) NOT NULL,
- preset_user_id INTEGER DEFAULT 0 NOT NULL,
- preset_type VARCHAR(2) NOT NULL,
- preset_data BLOB SUB_TYPE TEXT NOT NULL
+ preset_type VARCHAR(10) NOT NULL,
+ preset_group_id INTEGER DEFAULT 0 NOT NULL
);;
+# phpbb_auth_preset_data
+CREATE TABLE phpbb_auth_preset_data (
+ preset_id INTEGER DEFAULT 0 NOT NULL,
+ auth_option_id INTEGER DEFAULT 0 NOT NULL,
+ auth_setting INTEGER DEFAULT 0 NOT NULL
+);
+
# phpbb_auth_users
CREATE TABLE phpbb_auth_users (
user_id INTEGER DEFAULT 0 NOT NULL,
forum_id INTEGER DEFAULT 0 NOT NULL,
auth_option_id INTEGER DEFAULT 0 NOT NULL,
+ auth_preset_id INTEGER DEFAULT 0 NOT NULL,
auth_setting INTEGER DEFAULT 0 NOT NULL
);;
@@ -880,6 +888,12 @@ ON phpbb_auth_presets(
preset_type
);;
+ALTER TABLE phpbb_auth_preset_data
+ADD PRIMARY KEY (
+ preset_id,
+ auth_option_id
+);;
+
CREATE INDEX auth_option_id11
ON phpbb_auth_users(
auth_option_id
diff --git a/phpBB/install/schemas/mssql_schema.sql b/phpBB/install/schemas/mssql_schema.sql
index 8afbf3cede..492a54fba4 100644
--- a/phpBB/install/schemas/mssql_schema.sql
+++ b/phpBB/install/schemas/mssql_schema.sql
@@ -32,6 +32,7 @@ CREATE TABLE [phpbb_auth_groups] (
[group_id] [int] NOT NULL ,
[forum_id] [int] NOT NULL ,
[auth_option_id] [int] NOT NULL ,
+ [auth_preset_id] [int] NOT NULL ,
[auth_setting] [int] NOT NULL
) ON [PRIMARY]
GO
@@ -48,16 +49,23 @@ GO
CREATE TABLE [phpbb_auth_presets] (
[preset_id] [int] IDENTITY (1, 1) NOT NULL ,
[preset_name] [varchar] (50) NOT NULL ,
- [preset_user_id] [int] NOT NULL ,
- [preset_type] [varchar] (2) NOT NULL ,
- [preset_data] [text] NOT NULL
+ [preset_type] [varchar] (10) NOT NULL ,
+ [preset_group_id] [int] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
+CREATE TABLE [phpbb_auth_preset_data] (
+ [preset_id] [int] NOT NULL ,
+ [auth_option_id] [int] NOT NULL ,
+ [auth_setting] [int] NOT NULL
+) ON [PRIMARY]
+GO
+
CREATE TABLE [phpbb_auth_users] (
[user_id] [int] NOT NULL ,
[forum_id] [int] NOT NULL ,
[auth_option_id] [int] NOT NULL ,
+ [auth_preset_id] [int] NOT NULL ,
[auth_setting] [int] NOT NULL
) ON [PRIMARY]
GO
@@ -845,6 +853,14 @@ ALTER TABLE [phpbb_auth_presets] WITH NOCHECK ADD
) ON [PRIMARY]
GO
+ALTER TABLE [phpbb_auth_preset_data] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_auth_preset_data] PRIMARY KEY CLUSTERED
+ (
+ [preset_id],
+ [auth_option_id]
+ ) ON [PRIMARY]
+GO
+
ALTER TABLE [phpbb_banlist] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_banlist] PRIMARY KEY CLUSTERED
(
@@ -1188,7 +1204,13 @@ ALTER TABLE [phpbb_auth_options] WITH NOCHECK ADD
GO
ALTER TABLE [phpbb_auth_presets] WITH NOCHECK ADD
- CONSTRAINT [DF_auth_p_preset_user_id] DEFAULT (0) FOR [preset_user_id]
+ CONSTRAINT [DF_auth_p_preset_group_id] DEFAULT (0) FOR [preset_group_id]
+GO
+
+ALTER TABLE [phpbb_auth_preset_data] WITH NOCHECK ADD
+ CONSTRAINT [DF_auth_d_preset_id] DEFAULT (0) FOR [preset_id],
+ CONSTRAINT [DF_auth_d_auth_option_id] DEFAULT (0) FOR [auth_option_id],
+ CONSTRAINT [DF_auth_d_auth_setting] DEFAULT (0) FOR [auth_setting]
GO
ALTER TABLE [phpbb_auth_users] WITH NOCHECK ADD
diff --git a/phpBB/install/schemas/mysql_schema.sql b/phpBB/install/schemas/mysql_schema.sql
index 2440791e4b..51169b2bad 100644
--- a/phpBB/install/schemas/mysql_schema.sql
+++ b/phpBB/install/schemas/mysql_schema.sql
@@ -33,15 +33,16 @@ CREATE TABLE phpbb_attachments (
CREATE TABLE phpbb_auth_groups (
group_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
- auth_option_id smallint(5) UNSIGNED DEFAULT '0' NOT NULL,
- auth_setting tinyint(4) DEFAULT '0' NOT NULL,
+ auth_option_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
+ auth_preset_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
+ auth_setting tinyint(2) DEFAULT '0' NOT NULL,
KEY group_id (group_id),
KEY auth_option_id (auth_option_id)
);
# Table: phpbb_auth_options
CREATE TABLE phpbb_auth_options (
- auth_option_id smallint(5) UNSIGNED NOT NULL auto_increment,
+ auth_option_id mediumint(8) UNSIGNED NOT NULL auto_increment,
auth_option char(20) NOT NULL,
is_global tinyint(1) DEFAULT '0' NOT NULL,
is_local tinyint(1) DEFAULT '0' NOT NULL,
@@ -52,21 +53,29 @@ CREATE TABLE phpbb_auth_options (
# Table: phpbb_auth_presets
CREATE TABLE phpbb_auth_presets (
- preset_id tinyint(4) NOT NULL auto_increment,
+ preset_id mediumint(8) UNSIGNED NOT NULL auto_increment,
preset_name varchar(50) DEFAULT '' NOT NULL,
- preset_user_id mediumint(5) UNSIGNED DEFAULT '0' NOT NULL,
- preset_type varchar(2) DEFAULT '' NOT NULL,
- preset_data text DEFAULT '' NOT NULL,
+ preset_type varchar(10) DEFAULT '' NOT NULL,
+ preset_group_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (preset_id),
KEY preset_type (preset_type)
);
+# Table: phpbb_auth_preset_data
+CREATE TABLE phpbb_auth_preset_data (
+ preset_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
+ auth_option_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
+ auth_setting tinyint(2) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (preset_id, auth_option_id)
+);
+
# Table: phpbb_auth_users
CREATE TABLE phpbb_auth_users (
user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
- auth_option_id smallint(5) UNSIGNED DEFAULT '0' NOT NULL,
- auth_setting tinyint(4) DEFAULT '0' NOT NULL,
+ auth_option_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
+ auth_preset_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
+ auth_setting tinyint(2) DEFAULT '0' NOT NULL,
KEY user_id (user_id),
KEY auth_option_id (auth_option_id)
);
diff --git a/phpBB/install/schemas/oracle_schema.sql b/phpBB/install/schemas/oracle_schema.sql
index 30d818fd0d..5760ffabbc 100644
--- a/phpBB/install/schemas/oracle_schema.sql
+++ b/phpBB/install/schemas/oracle_schema.sql
@@ -95,7 +95,8 @@ CREATE INDEX filesize on phpbb_attachments (filesize)
CREATE TABLE phpbb_auth_groups (
group_id number(8) DEFAULT '0' NOT NULL,
forum_id number(8) DEFAULT '0' NOT NULL,
- auth_option_id number(5) DEFAULT '0' NOT NULL,
+ auth_option_id number(8) DEFAULT '0' NOT NULL,
+ auth_preset_id number(8) DEFAULT '0' NOT NULL,
auth_setting number(4) DEFAULT '0' NOT NULL
)
/
@@ -109,7 +110,7 @@ CREATE INDEX auth_option_id on phpbb_auth_groups (auth_option_id)
Table: phpbb_auth_options
*/
CREATE TABLE phpbb_auth_options (
- auth_option_id number(5) NOT NULL,
+ auth_option_id number(8) NOT NULL,
auth_option varchar2(20),
is_global number(1) DEFAULT '0' NOT NULL,
is_local number(1) DEFAULT '0' NOT NULL,
@@ -140,11 +141,10 @@ CREATE INDEX auth_option on phpbb_auth_options (auth_option)
Table: phpbb_auth_presets
*/
CREATE TABLE phpbb_auth_presets (
- preset_id number(4) NOT NULL,
+ preset_id number(8) NOT NULL,
preset_name varchar2(50) DEFAULT '',
- preset_user_id number(5) DEFAULT '0' NOT NULL,
- preset_type varchar2(2) DEFAULT '',
- preset_data clob DEFAULT '',
+ preset_type varchar2(10) DEFAULT '',
+ preset_group_id number(8) DEFAULT '0' NOT NULL,
CONSTRAINT pk_phpbb_auth_presets PRIMARY KEY (preset_id)
)
/
@@ -168,12 +168,24 @@ CREATE INDEX preset_type on phpbb_auth_presets (preset_type)
/
/*
+ Table: phpbb_auth_preset_data
+*/
+CREATE TABLE phpbb_auth_preset_data (
+ preset_id number(8) DEFAULT '0' NOT NULL,
+ auth_option_id number(8) DEFAULT '0' NOT NULL,
+ auth_setting number(4) DEFAULT '0' NOT NULL,
+ CONSTRAINT pk_phpbb_confirm PRIMARY KEY (preset_id, auth_option_id)
+)
+/
+
+/*
Table: phpbb_auth_users
*/
CREATE TABLE phpbb_auth_users (
user_id number(8) DEFAULT '0' NOT NULL,
forum_id number(8) DEFAULT '0' NOT NULL,
- auth_option_id number(5) DEFAULT '0' NOT NULL,
+ auth_option_id number(8) DEFAULT '0' NOT NULL,
+ auth_preset_id number(8) DEFAULT '0' NOT NULL,
auth_setting number(4) DEFAULT '0' NOT NULL
)
/
diff --git a/phpBB/install/schemas/postgres_schema.sql b/phpBB/install/schemas/postgres_schema.sql
index e34319427a..68f44dd35f 100644
--- a/phpBB/install/schemas/postgres_schema.sql
+++ b/phpBB/install/schemas/postgres_schema.sql
@@ -48,7 +48,8 @@ SELECT SETVAL('phpbb_attachments_attach_id_',(select case when max(attach_id)>0
CREATE TABLE phpbb_auth_groups (
group_id INT4 DEFAULT '0' NOT NULL,
forum_id INT4 DEFAULT '0' NOT NULL,
- auth_option_id INT2 DEFAULT '0' NOT NULL,
+ auth_option_id INT4 DEFAULT '0' NOT NULL,
+ auth_preset_id INT4 DEFAULT '0' NOT NULL,
auth_setting INT2 DEFAULT '0' NOT NULL
);
@@ -59,7 +60,7 @@ CREATE INDEX auth_option_id_phpbb_auth_groups_index ON phpbb_auth_groups (auth_o
CREATE SEQUENCE phpbb_auth_options_auth_opti;
CREATE TABLE phpbb_auth_options (
- auth_option_id INT2 DEFAULT nextval('phpbb_auth_options_auth_opti'),
+ auth_option_id INT4 DEFAULT nextval('phpbb_auth_options_auth_opti'),
auth_option varchar(20) NOT NULL,
is_global INT2 DEFAULT '0' NOT NULL,
is_local INT2 DEFAULT '0' NOT NULL,
@@ -75,24 +76,31 @@ SELECT SETVAL('phpbb_auth_options_auth_opti',(select case when max(auth_option_i
CREATE SEQUENCE phpbb_auth_presets_preset_id;
CREATE TABLE phpbb_auth_presets (
- preset_id INT2 DEFAULT nextval('phpbb_auth_presets_preset_id'),
+ preset_id INT4 DEFAULT nextval('phpbb_auth_presets_preset_id'),
preset_name varchar(50) DEFAULT '' NOT NULL,
- preset_user_id INT4 DEFAULT '0' NOT NULL,
- preset_type varchar(2) DEFAULT '' NOT NULL,
- preset_data text DEFAULT '' NOT NULL,
- PRIMARY KEY (preset_id),
- CHECK (preset_user_id>=0)
+ preset_type varchar(10) DEFAULT '' NOT NULL,
+ preset_group_id INT4 DEFAULT '0' NOT NULL,
+ PRIMARY KEY (preset_id)
);
CREATE INDEX preset_type_phpbb_auth_presets_index ON phpbb_auth_presets (preset_type);
SELECT SETVAL('phpbb_auth_presets_preset_id',(select case when max(preset_id)>0 then max(preset_id)+1 else 1 end from phpbb_auth_presets));
+/* Table: phpbb_auth_preset_data */
+CREATE TABLE phpbb_auth_preset_data (
+ preset_id INT4 DEFAULT '0' NOT NULL,
+ auth_option_id INT4 DEFAULT '0' NOT NULL,
+ auth_setting INT2 DEFAULT '0' NOT NULL,
+ PRIMARY KEY (preset_id, auth_option_id)
+);
+
/* Table: phpbb_auth_users */
CREATE TABLE phpbb_auth_users (
user_id INT4 DEFAULT '0' NOT NULL,
forum_id INT4 DEFAULT '0' NOT NULL,
- auth_option_id INT2 DEFAULT '0' NOT NULL,
+ auth_option_id INT4 DEFAULT '0' NOT NULL,
+ auth_preset_id INT4 DEFAULT '0' NOT NULL,
auth_setting INT2 DEFAULT '0' NOT NULL
);
diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql
index 0a6dddfe8b..fefbbd4b01 100644
--- a/phpBB/install/schemas/schema_data.sql
+++ b/phpBB/install/schemas/schema_data.sql
@@ -253,18 +253,21 @@ INSERT INTO phpbb_auth_options (auth_option, is_local, is_global) VALUES ('m_inf
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_server', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_jabber', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_defaults', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_board', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_cookies', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_phpinfo', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_clearlogs', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_viewlogs', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_words', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_icons', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_bbcode', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_attach', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_email', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_styles', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_bots', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_user', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_useradd', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_userdel', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_ranks', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_ban', 1);
@@ -276,17 +279,16 @@ INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_forum', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_forumadd', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_forumdel', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_prune', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_auth', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_authmods', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_authadmins', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_authusers', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_profile', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_modules', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_language', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_viewauth', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_fauth', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_mauth', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_aauth', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_uauth', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_authgroups', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_authdeps', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_backup', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_restore', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_search', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_events', 1);
-INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_cron', 1);
+INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('a_authusers', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('u_', 1);
INSERT INTO phpbb_auth_options (auth_option, is_global) VALUES ('u_sendemail', 1);
@@ -469,90 +471,104 @@ INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class,
INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (90, 1, 'pm', 'ucp', 0, 27, 98, 99, 'UCP_PM_POPUP_TITLE', 'popup', 'cfg_allow_privmsg');
# ACP
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (2, 1, '', 'acp', 1, 0, 169, 204, 'ACP_CAT_GENERAL', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (7, 1, 'modules', 'acp', 1, 67, 327, 328, 'ACP', 'acp', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (11, 1, '', 'acp', 1, 0, 239, 282, 'ACP_CAT_USERGROUP', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (41, 1, 'main', 'acp', 1, 2, 170, 171, 'ACP_MAIN', 'main', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (42, 1, '', 'acp', 1, 2, 172, 183, 'ACP_GENERAL_CONFIGURATION', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (43, 1, '', 'acp', 1, 2, 184, 191, 'ACP_CLIENT_COMMUNICATION', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (44, 1, '', 'acp', 1, 2, 192, 203, 'ACP_SERVER_CONFIGURATION', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (46, 1, '', 'acp', 1, 0, 205, 214, 'ACP_CAT_FORUMS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (47, 1, '', 'acp', 1, 0, 215, 238, 'ACP_CAT_POSTING', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (48, 1, '', 'acp', 1, 0, 283, 288, 'ACP_CAT_PERMISSIONS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (49, 1, '', 'acp', 1, 0, 289, 302, 'ACP_CAT_STYLES', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (50, 1, '', 'acp', 1, 0, 303, 314, 'ACP_CAT_MAINTANENCE', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (51, 1, '', 'acp', 1, 0, 315, 334, 'ACP_CAT_SYSTEM', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (52, 1, '', 'acp', 1, 0, 335, 336, 'ACP_CAT_DOT_MODS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (53, 1, '', 'acp', 1, 46, 206, 211, 'ACP_CAT_FORUMS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (54, 1, '', 'acp', 1, 46, 212, 213, 'ACP_CAT_PERMISSIONS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (56, 1, '', 'acp', 1, 47, 228, 237, 'ACP_ATTACHMENTS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (57, 1, '', 'acp', 1, 11, 240, 265, 'ACP_CAT_USERS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (58, 1, '', 'acp', 1, 11, 266, 269, 'ACP_GROUPS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (59, 1, '', 'acp', 1, 11, 270, 281, 'ACP_USER_SECURITY', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (60, 1, '', 'acp', 1, 48, 284, 285, 'ACP_CAT_GENERAL', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (61, 1, '', 'acp', 1, 48, 286, 287, 'ACP_PERMISSION_SETTINGS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (62, 1, '', 'acp', 1, 49, 290, 293, 'ACP_STYLE_MANAGEMENT', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (63, 1, '', 'acp', 1, 50, 304, 311, 'ACP_FORUM_LOGS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (64, 1, '', 'acp', 1, 50, 312, 313, 'ACP_CAT_DATABASE', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (65, 1, '', 'acp', 1, 51, 316, 317, 'ACP_AUTOMATION', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (66, 1, '', 'acp', 1, 51, 318, 325, 'ACP_GENERAL_TASKS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (67, 1, '', 'acp', 1, 51, 326, 333, 'ACP_MODULE_MANAGEMENT', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (69, 1, 'modules', 'acp', 1, 67, 329, 330, 'UCP', 'ucp', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (71, 1, 'board', 'acp', 1, 42, 173, 174, 'ACP_BOARD_SETTINGS', 'settings', 'acl_a_board');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (72, 1, 'board', 'acp', 1, 42, 175, 176, 'ACP_BOARD_DEFAULTS', 'default', 'acl_a_defaults');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (73, 1, 'board', 'acp', 1, 42, 177, 178, 'ACP_AVATAR_SETTINGS', 'avatar', 'acl_a_board');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (74, 1, 'attachments', 'acp', 1, 42, 179, 180, 'ACP_ATTACHMENT_SETTINGS', 'attach', 'acl_a_attach');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (75, 1, '', 'acp', 1, 47, 216, 227, 'ACP_MESSAGES', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (76, 1, 'attachments', 'acp', 1, 56, 229, 230, 'ACP_ATTACHMENT_SETTINGS', 'attach', 'acl_a_attach');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (77, 1, 'attachments', 'acp', 1, 56, 231, 232, 'ACP_EXTENSION_GROUPS', 'ext_groups', 'acl_a_attach');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (78, 1, 'attachments', 'acp', 1, 56, 233, 234, 'ACP_MANAGE_EXTENSIONS', 'extensions', 'acl_a_attach');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (80, 1, 'attachments', 'acp', 1, 56, 235, 236, 'ACP_ORPHAN_ATTACHMENTS', 'orphan', 'acl_a_attach');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (81, 1, 'board', 'acp', 1, 42, 181, 182, 'ACP_MESSAGE_SETTINGS', 'message', 'acl_a_defaults');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (82, 1, 'board', 'acp', 1, 43, 185, 186, 'ACP_AUTH_SETTINGS', 'auth', 'acl_a_server');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (83, 1, 'board', 'acp', 1, 43, 187, 188, 'ACP_EMAIL_SETTINGS', 'email', 'acl_a_server');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (84, 1, 'jabber', 'acp', 1, 43, 189, 190, 'ACP_JABBER_SETTINGS', 'settings', 'acl_a_server');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (85, 1, 'board', 'acp', 1, 44, 193, 194, 'ACP_COOKIE_SETTINGS', 'cookie', 'acl_a_cookies');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (86, 1, 'board', 'acp', 1, 44, 195, 196, 'ACP_SERVER_SETTINGS', 'server', 'acl_a_server');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (87, 1, 'board', 'acp', 1, 44, 197, 198, 'ACP_LOAD_SETTINGS', 'load', 'acl_a_server');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (89, 1, 'php_info', 'acp', 1, 44, 199, 200, 'ACP_PHP_INFO', 'info', 'acl_a_server');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (91, 1, 'bots', 'acp', 1, 44, 201, 202, 'ACP_BOTS', 'bots', 'acl_a_server');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (92, 1, 'modules', 'acp', 1, 67, 331, 332, 'MCP', 'mcp', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (93, 1, 'board', 'acp', 1, 75, 217, 218, 'ACP_MESSAGE_SETTINGS', 'message', 'acl_a_defaults');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (94, 1, 'bbcodes', 'acp', 1, 75, 219, 220, 'ACP_BBCODES', 'bbcodes', 'acl_a_bbcode');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (95, 1, 'icons', 'acp', 1, 75, 221, 222, 'ACP_ICONS', 'icons', 'acl_a_icons');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (96, 1, 'icons', 'acp', 1, 75, 223, 224, 'ACP_SMILIES', 'smilies', 'acl_a_icons');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (97, 1, 'words', 'acp', 1, 75, 225, 226, 'ACP_WORDS', 'words', 'acl_a_words');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (98, 1, 'logs', 'acp', 1, 63, 305, 306, 'ACP_ADMIN_LOGS', 'admin', 'acl_a_');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (99, 1, 'logs', 'acp', 1, 63, 307, 308, 'ACP_MOD_LOGS', 'mod', 'acl_a_');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (100, 1, 'logs', 'acp', 1, 63, 309, 310, 'ACP_CRITICAL_LOGS', 'critical', 'acl_a_');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (101, 1, 'language', 'acp', 1, 66, 319, 320, 'ACP_LANGUAGE_PACKS', 'lang_packs', 'acl_a_server');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (102, 1, 'bots', 'acp', 1, 66, 321, 322, 'ACP_BOTS', 'bots', 'acl_a_server');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (103, 1, 'groups', 'acp', 1, 58, 267, 268, 'ACP_GROUPS_MANAGE', 'manage', 'acl_a_group');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (105, 1, 'email', 'acp', 1, 66, 323, 324, 'ACP_MASS_EMAIL', 'email', 'acl_a_email');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (106, 1, 'ranks', 'acp', 1, 57, 245, 246, 'ACP_MANAGE_RANKS', 'ranks', 'acl_a_ranks');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (107, 1, 'ban', 'acp', 1, 59, 275, 276, 'ACP_BAN_EMAILS', 'email', 'acl_a_ban');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (108, 1, 'ban', 'acp', 1, 59, 277, 278, 'ACP_BAN_IPS', 'ip', 'acl_a_ban');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (109, 1, 'ban', 'acp', 1, 59, 279, 280, 'ACP_BAN_USERNAMES', 'user', 'acl_a_ban');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (110, 1, 'disallow', 'acp', 1, 59, 273, 274, 'ACP_DISALLOW_USERNAMES', 'usernames', 'acl_a_names');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (111, 1, 'prune', 'acp', 1, 59, 271, 272, 'ACP_PRUNE_USERS', 'users', 'acl_a_userdel');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (112, 1, 'prune', 'acp', 1, 53, 209, 210, 'ACP_PRUNE_FORUMS', 'forums', 'acl_a_prune');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (113, 1, 'profile', 'acp', 1, 57, 243, 244, 'ACP_CUSTOM_PROFILE_FIELDS', 'profile', 'acl_a_user');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (114, 1, 'forums', 'acp', 1, 53, 207, 208, 'ACP_MANAGE_FORUMS', 'manage', 'acl_a_forum');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (115, 1, 'users', 'acp', 1, 57, 241, 242, 'ACP_MANAGE_USERS', 'overview', 'acl_a_user');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (116, 1, 'users', 'acp', 0, 57, 247, 248, 'ACP_USER_FEEDBACK', 'feedback', 'acl_a_user');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (117, 1, 'users', 'acp', 0, 57, 249, 250, 'ACP_USER_PROFILE', 'profile', 'acl_a_user');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (118, 1, 'users', 'acp', 0, 57, 251, 252, 'ACP_USER_PREFS', 'prefs', 'acl_a_user');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (119, 1, 'users', 'acp', 0, 57, 253, 254, 'ACP_USER_AVATAR', 'avatar', 'acl_a_user');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (120, 1, 'users', 'acp', 0, 57, 257, 258, 'ACP_USER_SIG', 'sig', 'acl_a_user');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (121, 1, 'users', 'acp', 0, 57, 259, 260, 'ACP_USER_GROUPS', 'groups', 'acl_a_user');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (122, 1, 'users', 'acp', 0, 57, 261, 262, 'ACP_USER_PERM', 'perm', 'acl_a_user');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (123, 1, 'users', 'acp', 0, 57, 263, 264, 'ACP_USER_ATTACH', 'attach', 'acl_a_user');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (141, 1, '', 'acp', 1, 49, 294, 301, 'ACP_STYLE_COMPONENTS', '', '');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (142, 1, 'styles', 'acp', 1, 62, 291, 292, 'ACP_STYLES', 'style', 'acl_a_styles');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (143, 1, 'styles', 'acp', 1, 141, 295, 296, 'ACP_TEMPLATES', 'template', 'acl_a_styles');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (144, 1, 'styles', 'acp', 1, 141, 297, 298, 'ACP_THEMES', 'theme', 'acl_a_styles');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (145, 1, 'styles', 'acp', 1, 141, 299, 300, 'ACP_IMAGESETS', 'imageset', 'acl_a_styles');
-INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (147, 1, 'users', 'acp', 0, 57, 255, 256, 'ACP_USER_RANK', 'rank', 'acl_a_user');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (2, 1, '', 'acp', 1, 0, 197, 232, 'ACP_CAT_GENERAL', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (7, 1, 'modules', 'acp', 1, 67, 383, 384, 'ACP', 'acp', 'acl_a_modules');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (11, 1, '', 'acp', 1, 0, 267, 310, 'ACP_CAT_USERGROUP', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (41, 1, 'main', 'acp', 1, 2, 198, 199, 'ACP_MAIN', 'main', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (42, 1, '', 'acp', 1, 2, 200, 211, 'ACP_GENERAL_CONFIGURATION', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (43, 1, '', 'acp', 1, 2, 212, 219, 'ACP_CLIENT_COMMUNICATION', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (44, 1, '', 'acp', 1, 2, 220, 231, 'ACP_SERVER_CONFIGURATION', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (46, 1, '', 'acp', 1, 0, 233, 242, 'ACP_CAT_FORUMS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (47, 1, '', 'acp', 1, 0, 243, 266, 'ACP_CAT_POSTING', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (48, 1, '', 'acp', 1, 0, 311, 344, 'ACP_CAT_PERMISSIONS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (49, 1, '', 'acp', 1, 0, 345, 358, 'ACP_CAT_STYLES', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (50, 1, '', 'acp', 1, 0, 359, 370, 'ACP_CAT_MAINTANENCE', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (51, 1, '', 'acp', 1, 0, 371, 390, 'ACP_CAT_SYSTEM', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (52, 1, '', 'acp', 1, 0, 391, 392, 'ACP_CAT_DOT_MODS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (53, 1, '', 'acp', 1, 46, 234, 239, 'ACP_CAT_FORUMS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (54, 1, '', 'acp', 1, 46, 240, 241, 'ACP_CAT_PERMISSIONS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (56, 1, '', 'acp', 1, 47, 256, 265, 'ACP_ATTACHMENTS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (57, 1, '', 'acp', 1, 11, 268, 293, 'ACP_CAT_USERS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (58, 1, '', 'acp', 1, 11, 294, 297, 'ACP_GROUPS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (59, 1, '', 'acp', 1, 11, 298, 309, 'ACP_USER_SECURITY', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (61, 1, '', 'acp', 1, 48, 312, 329, 'ACP_PERMISSION_SETTINGS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (62, 1, '', 'acp', 1, 49, 346, 349, 'ACP_STYLE_MANAGEMENT', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (63, 1, '', 'acp', 1, 50, 360, 367, 'ACP_FORUM_LOGS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (64, 1, '', 'acp', 1, 50, 368, 369, 'ACP_CAT_DATABASE', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (65, 1, '', 'acp', 1, 51, 372, 373, 'ACP_AUTOMATION', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (66, 1, '', 'acp', 1, 51, 374, 381, 'ACP_GENERAL_TASKS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (67, 1, '', 'acp', 1, 51, 382, 389, 'ACP_MODULE_MANAGEMENT', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (69, 1, 'modules', 'acp', 1, 67, 385, 386, 'UCP', 'ucp', 'acl_a_modules');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (71, 1, 'board', 'acp', 1, 42, 201, 202, 'ACP_BOARD_SETTINGS', 'settings', 'acl_a_board');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (72, 1, 'board', 'acp', 1, 42, 203, 204, 'ACP_BOARD_DEFAULTS', 'default', 'acl_a_defaults');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (73, 1, 'board', 'acp', 1, 42, 205, 206, 'ACP_AVATAR_SETTINGS', 'avatar', 'acl_a_board');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (74, 1, 'attachments', 'acp', 1, 42, 207, 208, 'ACP_ATTACHMENT_SETTINGS', 'attach', 'acl_a_attach');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (75, 1, '', 'acp', 1, 47, 244, 255, 'ACP_MESSAGES', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (76, 1, 'attachments', 'acp', 1, 56, 257, 258, 'ACP_ATTACHMENT_SETTINGS', 'attach', 'acl_a_attach');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (77, 1, 'attachments', 'acp', 1, 56, 259, 260, 'ACP_EXTENSION_GROUPS', 'ext_groups', 'acl_a_attach');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (78, 1, 'attachments', 'acp', 1, 56, 261, 262, 'ACP_MANAGE_EXTENSIONS', 'extensions', 'acl_a_attach');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (80, 1, 'attachments', 'acp', 1, 56, 263, 264, 'ACP_ORPHAN_ATTACHMENTS', 'orphan', 'acl_a_attach');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (81, 1, 'board', 'acp', 1, 42, 209, 210, 'ACP_MESSAGE_SETTINGS', 'message', 'acl_a_defaults');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (82, 1, 'board', 'acp', 1, 43, 213, 214, 'ACP_AUTH_SETTINGS', 'auth', 'acl_a_server');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (83, 1, 'board', 'acp', 1, 43, 215, 216, 'ACP_EMAIL_SETTINGS', 'email', 'acl_a_server');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (84, 1, 'jabber', 'acp', 1, 43, 217, 218, 'ACP_JABBER_SETTINGS', 'settings', 'acl_a_jabber');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (85, 1, 'board', 'acp', 1, 44, 221, 222, 'ACP_COOKIE_SETTINGS', 'cookie', 'acl_a_cookies');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (86, 1, 'board', 'acp', 1, 44, 223, 224, 'ACP_SERVER_SETTINGS', 'server', 'acl_a_server');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (87, 1, 'board', 'acp', 1, 44, 225, 226, 'ACP_LOAD_SETTINGS', 'load', 'acl_a_server');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (89, 1, 'php_info', 'acp', 1, 44, 227, 228, 'ACP_PHP_INFO', 'info', 'acl_a_phpinfo');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (91, 1, 'bots', 'acp', 1, 44, 229, 230, 'ACP_BOTS', 'bots', 'acl_a_bots');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (92, 1, 'modules', 'acp', 1, 67, 387, 388, 'MCP', 'mcp', 'acl_a_modules');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (93, 1, 'board', 'acp', 1, 75, 245, 246, 'ACP_MESSAGE_SETTINGS', 'message', 'acl_a_defaults');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (94, 1, 'bbcodes', 'acp', 1, 75, 247, 248, 'ACP_BBCODES', 'bbcodes', 'acl_a_bbcode');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (95, 1, 'icons', 'acp', 1, 75, 249, 250, 'ACP_ICONS', 'icons', 'acl_a_icons');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (96, 1, 'icons', 'acp', 1, 75, 251, 252, 'ACP_SMILIES', 'smilies', 'acl_a_icons');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (97, 1, 'words', 'acp', 1, 75, 253, 254, 'ACP_WORDS', 'words', 'acl_a_words');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (98, 1, 'logs', 'acp', 1, 63, 361, 362, 'ACP_ADMIN_LOGS', 'admin', 'acl_a_viewlogs');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (99, 1, 'logs', 'acp', 1, 63, 363, 364, 'ACP_MOD_LOGS', 'mod', 'acl_a_viewlogs');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (100, 1, 'logs', 'acp', 1, 63, 365, 366, 'ACP_CRITICAL_LOGS', 'critical', 'acl_a_viewlogs');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (101, 1, 'language', 'acp', 1, 66, 375, 376, 'ACP_LANGUAGE_PACKS', 'lang_packs', 'acl_a_language');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (102, 1, 'bots', 'acp', 1, 66, 377, 378, 'ACP_BOTS', 'bots', 'acl_a_bots');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (103, 1, 'groups', 'acp', 1, 58, 295, 296, 'ACP_GROUPS_MANAGE', 'manage', 'acl_a_group');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (105, 1, 'email', 'acp', 1, 66, 379, 380, 'ACP_MASS_EMAIL', 'email', 'acl_a_email');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (106, 1, 'ranks', 'acp', 1, 57, 273, 274, 'ACP_MANAGE_RANKS', 'ranks', 'acl_a_ranks');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (107, 1, 'ban', 'acp', 1, 59, 303, 304, 'ACP_BAN_EMAILS', 'email', 'acl_a_ban');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (108, 1, 'ban', 'acp', 1, 59, 305, 306, 'ACP_BAN_IPS', 'ip', 'acl_a_ban');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (109, 1, 'ban', 'acp', 1, 59, 307, 308, 'ACP_BAN_USERNAMES', 'user', 'acl_a_ban');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (110, 1, 'disallow', 'acp', 1, 59, 301, 302, 'ACP_DISALLOW_USERNAMES', 'usernames', 'acl_a_names');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (111, 1, 'prune', 'acp', 1, 59, 299, 300, 'ACP_PRUNE_USERS', 'users', 'acl_a_userdel');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (112, 1, 'prune', 'acp', 1, 53, 237, 238, 'ACP_PRUNE_FORUMS', 'forums', 'acl_a_prune');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (113, 1, 'profile', 'acp', 1, 57, 271, 272, 'ACP_CUSTOM_PROFILE_FIELDS', 'profile', 'acl_a_profile');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (114, 1, 'forums', 'acp', 1, 53, 235, 236, 'ACP_MANAGE_FORUMS', 'manage', 'acl_a_forum');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (115, 1, 'users', 'acp', 1, 57, 269, 270, 'ACP_MANAGE_USERS', 'overview', 'acl_a_user');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (116, 1, 'users', 'acp', 0, 57, 275, 276, 'ACP_USER_FEEDBACK', 'feedback', 'acl_a_user');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (117, 1, 'users', 'acp', 0, 57, 277, 278, 'ACP_USER_PROFILE', 'profile', 'acl_a_user');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (118, 1, 'users', 'acp', 0, 57, 279, 280, 'ACP_USER_PREFS', 'prefs', 'acl_a_user');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (119, 1, 'users', 'acp', 0, 57, 281, 282, 'ACP_USER_AVATAR', 'avatar', 'acl_a_user');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (120, 1, 'users', 'acp', 0, 57, 285, 286, 'ACP_USER_SIG', 'sig', 'acl_a_user');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (121, 1, 'users', 'acp', 0, 57, 287, 288, 'ACP_USER_GROUPS', 'groups', 'acl_a_user && acl_a_group');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (122, 1, 'users', 'acp', 0, 57, 289, 290, 'ACP_USER_PERM', 'perm', 'acl_a_user && acl_a_viewauth');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (123, 1, 'users', 'acp', 0, 57, 291, 292, 'ACP_USER_ATTACH', 'attach', 'acl_a_user');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (141, 1, '', 'acp', 1, 49, 350, 357, 'ACP_STYLE_COMPONENTS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (142, 1, 'styles', 'acp', 1, 62, 347, 348, 'ACP_STYLES', 'style', 'acl_a_styles');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (143, 1, 'styles', 'acp', 1, 141, 351, 352, 'ACP_TEMPLATES', 'template', 'acl_a_styles');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (144, 1, 'styles', 'acp', 1, 141, 353, 354, 'ACP_THEMES', 'theme', 'acl_a_styles');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (145, 1, 'styles', 'acp', 1, 141, 355, 356, 'ACP_IMAGESETS', 'imageset', 'acl_a_styles');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (147, 1, 'users', 'acp', 0, 57, 283, 284, 'ACP_USER_RANK', 'rank', 'acl_a_user');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (148, 1, 'permissions', 'acp', 1, 61, 313, 314, 'ACP_USERS_PERMISSIONS', 'setting_user_global', 'acl_a_authusers && (acl_a_aauth || acl_a_mauth || acl_a_uauth)');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (149, 1, 'permissions', 'acp', 1, 61, 315, 316, 'ACP_USERS_FORUM_PERMISSIONS', 'setting_user_local', 'acl_a_authusers && (acl_a_mauth || acl_a_fauth)');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (150, 1, 'permissions', 'acp', 1, 61, 317, 318, 'ACP_GROUPS_PERMISSIONS', 'setting_group_global', 'acl_a_authgroups && (acl_a_aauth || acl_a_mauth || acl_a_uauth)');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (151, 1, 'permissions', 'acp', 1, 61, 319, 320, 'ACP_GROUPS_FORUM_PERMISSIONS', 'setting_group_local', 'acl_a_authgroups && (acl_a_mauth || acl_a_fauth)');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (152, 1, 'permissions', 'acp', 1, 61, 321, 322, 'ACP_ADMINISTRATORS', 'setting_admin_global', 'acl_a_aauth && (acl_a_authusers || acl_a_authgroups)');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (155, 1, 'permissions', 'acp', 1, 61, 323, 324, 'ACP_GLOBAL_MODERATORS', 'setting_mod_global', 'acl_a_mauth && (acl_a_authusers || acl_a_authgroups)');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (156, 1, 'permissions', 'acp', 1, 61, 325, 326, 'ACP_FORUM_MODERATORS', 'setting_mod_local', 'acl_a_mauth && (acl_a_authusers || acl_a_authgroups)');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (157, 1, 'permissions', 'acp', 1, 61, 327, 328, 'ACP_FORUM_PERMISSIONS', 'setting_forum_local', 'acl_a_fauth && (acl_a_authusers || acl_a_authgroups)');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (158, 1, '', 'acp', 1, 48, 330, 341, 'ACP_PERMISSION_MASKS', '', '');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (159, 1, 'permissions', 'acp', 1, 158, 331, 332, 'ACP_VIEW_ADMIN_PERMISSIONS', 'view_admin_global', 'acl_a_viewauth');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (160, 1, 'permissions', 'acp', 1, 158, 333, 334, 'ACP_VIEW_USER_PERMISSIONS', 'view_user_global', 'acl_a_viewauth');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (161, 1, 'permissions', 'acp', 1, 158, 335, 336, 'ACP_VIEW_GLOBAL_MOD_PERMISSIONS', 'view_mod_global', 'acl_a_viewauth');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (162, 1, 'permissions', 'acp', 1, 158, 337, 338, 'ACP_VIEW_FORUM_MOD_PERMISSIONS', 'view_mod_local', 'acl_a_viewauth');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (163, 1, 'permissions', 'acp', 1, 158, 339, 340, 'ACP_VIEW_FORUM_PERMISSIONS', 'view_forum_local', 'acl_a_viewauth');
+INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (165, 1, '', 'acp', 1, 48, 342, 343, 'Permission Presets', '', '');
# MCP
INSERT INTO phpbb_modules (module_id, module_enabled, module_name, module_class, module_display, parent_id, left_id, right_id, module_langname, module_mode, module_auth) VALUES (124, 1, '', 'mcp', 1, 0, 35, 44, 'MCP_MAIN', '', '');
diff --git a/phpBB/install/schemas/sqlite_schema.sql b/phpBB/install/schemas/sqlite_schema.sql
index ee61fa6be0..e4339d8a64 100644
--- a/phpBB/install/schemas/sqlite_schema.sql
+++ b/phpBB/install/schemas/sqlite_schema.sql
@@ -35,7 +35,8 @@ CREATE INDEX filesize_phpbb_attachments on phpbb_attachments (filesize);
CREATE TABLE phpbb_auth_groups (
group_id mediumint(8) NOT NULL DEFAULT '0',
forum_id mediumint(8) NOT NULL DEFAULT '0',
- auth_option_id smallint(5) NOT NULL DEFAULT '0',
+ auth_option_id mediumint(8) NOT NULL DEFAULT '0',
+ auth_preset_id mediumint(8) NOT NULL DEFAULT '0',
auth_setting tinyint(4) NOT NULL DEFAULT '0'
);
@@ -57,18 +58,26 @@ CREATE INDEX auth_option_phpbb_auth_options on phpbb_auth_options (auth_option);
CREATE TABLE phpbb_auth_presets (
preset_id INTEGER PRIMARY KEY NOT NULL,
preset_name varchar(50) NOT NULL DEFAULT '',
- preset_user_id mediumint(5) NOT NULL DEFAULT '0',
- preset_type varchar(2) NOT NULL DEFAULT '',
- preset_data text(65535) NOT NULL DEFAULT ''
+ preset_type varchar(10) NOT NULL DEFAULT '',
+ preset_group_id mediumint(8) NOT NULL DEFAULT '0'
);
CREATE INDEX preset_type_phpbb_auth_presets on phpbb_auth_presets (preset_type);
+# Table: phpbb_auth_preset_data
+CREATE TABLE phpbb_auth_preset_data (
+ preset_id mediumint(8) NOT NULL DEFAULT '0',
+ auth_option_id mediumint(8) NOT NULL DEFAULT '0',
+ auth_setting tinyint(2) NOT NULL DEFAULT '0',
+ PRIMARY KEY (preset_id, auth_option_id)
+);
+
# Table: phpbb_auth_users
CREATE TABLE phpbb_auth_users (
user_id mediumint(8) NOT NULL DEFAULT '0',
forum_id mediumint(8) NOT NULL DEFAULT '0',
- auth_option_id smallint(5) NOT NULL DEFAULT '0',
+ auth_option_id mediumint(8) NOT NULL DEFAULT '0',
+ auth_preset_id mediumint(8) NOT NULL DEFAULT '0',
auth_setting tinyint(4) NOT NULL DEFAULT '0'
);
diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php
index a9ba62d0f3..e22559e8cb 100644
--- a/phpBB/language/en/acp/common.php
+++ b/phpBB/language/en/acp/common.php
@@ -112,6 +112,10 @@ $lang = array_merge($lang, array(
'ACP_PERMISSION_MASKS' => 'Permission Masks',
'ACP_PERMISSION_SETTINGS' => 'Permission Settings',
'ACP_PHP_INFO' => 'PHP Information',
+ 'ACP_PRESET_ADMIN' => 'Admin Permission Presets',
+ 'ACP_PRESET_FORUM' => 'Forum Permission Presets',
+ 'ACP_PRESET_MOD' => 'Mod Permission Presets',
+ 'ACP_PRESET_USER' => 'User Permission Presets',
'ACP_PRUNE_FORUMS' => 'Prune Forums',
'ACP_PRUNE_USERS' => 'Prune Users',
'ACP_PRUNING' => 'Pruning',
@@ -212,6 +216,7 @@ $lang = array_merge($lang, array(
'REORDER' => 'Reorder',
'RETURN_TO' => 'Return to ...',
+ 'SELECT_ANONYMOUS' => 'Select Anonymous User',
'SELECT_OPTION' => 'Select option',
'UCP' => 'User Control Panel',
@@ -421,6 +426,9 @@ $lang = array_merge($lang, array(
'LOG_MODULE_ADD' => '<b>Module added</b><br />&#187; %s',
'LOG_MODULE_EDIT' => '<b>Module edited</b><br />&#187; %s',
+ 'LOG_PRESET_ADD' => '<b>Preset added</b><br />&#187; %s',
+ 'LOG_PRESET_EDIT' => '<b>Preset edited</b><br />&#187; %s',
+
'LOG_PROFILE_FIELD_ACTIVATE' => '<b>Profile field activated</b><br />&#187; %s',
'LOG_PROFILE_FIELD_CREATE' => '<b>Profile field added</b><br />&#187; %s',
'LOG_PROFILE_FIELD_DEACTIVATE' => '<b>Profile field deactivated</b><br />&#187; %s',
diff --git a/phpBB/language/en/acp/permissions.php b/phpBB/language/en/acp/permissions.php
new file mode 100644
index 0000000000..9e1cbed806
--- /dev/null
+++ b/phpBB/language/en/acp/permissions.php
@@ -0,0 +1,127 @@
+<?php
+/**
+*
+* acp_permissions [English]
+*
+* @package language
+* @version $Id$
+* @copyright (c) 2005 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+/**
+* DO NOT CHANGE
+*/
+if (empty($lang) || !is_array($lang))
+{
+ $lang = array();
+}
+
+// DEVELOPERS PLEASE NOTE
+//
+// Placeholders can now contain order information, e.g. instead of
+// 'Page %s of %s' you can (and should) write 'Page %1$s of %2$s', this allows
+// translators to re-order the output of data while ensuring it remains correct
+//
+// You do not need this where single placeholders are used, e.g. 'Message %d' is fine
+// equally where a string contains only two placeholders which are used to wrap text
+// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
+
+$lang = array_merge($lang, array(
+ 'ACL_NO' => 'No',
+ 'ACL_SET' => 'Setting Permissions',
+ 'ACL_SET_EXPLAIN' => 'Permissions are based on a simple YES/NO system. Setting an option to NO for a user or usergroup overrides any other value assigned to it. If you do not wish to assign a value for an option for this user or group select UNSET. If values are assigned for this option elsewhere they will be used in preference, else NO is assumed. All objects marked (with the checkbox in front of them) will inherit the permission set you defined.',
+ 'ACL_SETTING' => 'Setting',
+
+ 'ACL_TYPE_A_' => 'Administrative Permissions',
+ 'ACL_TYPE_F_' => 'Forum Permissions',
+ 'ACL_TYPE_M_' => 'Moderative Permissions',
+ 'ACL_TYPE_U_' => 'User Permissions',
+
+ 'ACL_TYPE_GLOBAL_A_' => 'Administrative Permissions',
+ 'ACL_TYPE_GLOBAL_U_' => 'User Permissions',
+ 'ACL_TYPE_GLOBAL_M_' => 'Global Moderator Permissions',
+ 'ACL_TYPE_LOCAL_M_' => 'Forum Moderator Permissions',
+ 'ACL_TYPE_LOCAL_F_' => 'Forum Permissions',
+
+ 'ACL_UNSET' => 'Unset',
+ 'ACL_VIEW' => 'Viewing Permissions',
+ 'ACL_VIEW_EXPLAIN' => 'Here you can see the effective permissions the user/group is having. A red square indicates that the user/group does not have the permission, a green square indicates that the user/group does have the permission.',
+ 'ACL_YES' => 'Yes',
+
+ 'ACP_ADMINISTRATORS_EXPLAIN' => 'Here you can assign administrator rights to users or groups. All users with admin permissions can view the administration panel.',
+ 'ACP_FORUM_MODERATORS_EXPLAIN' => 'Here you can assign users and groups as forum moderators. To assign users access to forums, to define global moderative rights or administrators please use the appropriate page.',
+ 'ACP_FORUM_PERMISSIONS_EXPLAIN' => 'Here you can alter which users and groups can access which forums. To assign moderators or define administrators please use the appropriate page.',
+ 'ACP_GLOBAL_MODERATORS_EXPLAIN' => 'Here you can assign global moderator rights to users or groups. These moderators are like ordinary moderators except they have access to every forum on your board.',
+ 'ACP_GROUPS_FORUM_PERMISSIONS_EXPLAIN' => 'Here you can assign forum permissions to groups.',
+ 'ACP_GROUPS_PERMISSIONS_EXPLAIN' => 'Here you can assign global permissions to groups - user permissions, global moderator permissions and admin permissions. User permissions include capabilities such as the use of avatars, sending private messages, etc. Global moderator permissions are blabla, administrative permissions blabla. Individual users permissions should only be changed in rare occassions, the preferred method is putting users in groups and assigning the groups permissions.',
+ 'ACP_PRESET_ADMIN_EXPLAIN' => 'Here you are able to manage the presets for administrative permissions. Presets are effective permissions, if you change a preset the items having this preset assigned will change it\'s permissions too.',
+ 'ACP_PRESET_FORUM_EXPLAIN' => 'Here you are able to manage the presets for forum permissions. Presets are effective permissions, if you change a preset the items having this preset assigned will change it\'s permissions too.',
+ 'ACP_PRESET_MOD_EXPLAIN' => 'Here you are able to manage the presets for moderative permissions. Presets are effective permissions, if you change a preset the items having this preset assigned will change it\'s permissions too.',
+ 'ACP_PRESET_USER_EXPLAIN' => 'Here you are able to manage the presets for user permissions. Presets are effective permissions, if you change a preset the items having this preset assigned will change it\'s permissions too.',
+ 'ACP_USERS_FORUM_PERMISSIONS_EXPLAIN' => 'Here you can assign forum permissions to users.',
+ 'ACP_USERS_PERMISSIONS_EXPLAIN' => 'Here you can assign global permissions to users - user permissions, global moderator permissions and admin permissions. User permissions include capabilities such as the use of avatars, sending private messages, etc. Global moderator permissions are blabla, administrative permissions blabla. To alter these settings for large numbers of users the Group permissions system is the prefered method. Users permissions should only be changed in rare occassions, the preferred method is putting users in groups and assigning the groups permissions.',
+ 'ACP_VIEW_ADMIN_PERMISSIONS_EXPLAIN' => 'Here you can view the effective administrative permissions assigned to the selected users/groups',
+ 'ACP_VIEW_GLOBAL_MOD_PERMISSIONS_EXPLAIN' => 'Here you can view the global moderative permissions assigned to the selected users/groups',
+ 'ACP_VIEW_FORUM_PERMISSIONS_EXPLAIN' => 'Here you can view the forum permissions assigned to the selected users/groups and forums',
+ 'ACP_VIEW_FORUM_MOD_PERMISSIONS_EXPLAIN' => 'Here you can view the forum moderator permissions assigned to the selected users/groups and forums',
+ 'ACP_VIEW_USER_PERMISSIONS_EXPLAIN' => 'Here you can view the effective user permissions assigned to the selected users/groups',
+
+ 'ADD_GROUPS' => 'Add Groups',
+ 'ADD_USERS' => 'Add Users',
+ 'ALL_NO' => 'All No',
+ 'ALL_UNSET' => 'All Unset',
+ 'ALL_YES' => 'All Yes',
+ 'APPLY_ALL_PERMISSIONS' => 'Apply all Permissions',
+ 'APPLY_PERMISSIONS' => 'Apply Permissions',
+ 'APPLY_PERMISSIONS_EXPLAIN' => 'The Permissions and Preset defined for this item will only be applied to this item and all checked items.',
+ 'AUTH_UPDATED' => 'Permissions have been updated',
+
+ 'CREATE_PRESET' => 'Create Preset',
+ 'CREATE_PRESET_FROM' => 'Use settings from...',
+
+ 'EDIT_PRESET' => 'Edit Preset',
+ 'EVERY_USER_GROUP' => 'Every user/group',
+
+ 'GROUP_BINDING' => 'Group Binding',
+ 'GROUP_BINDING_EXPLAIN' => 'If a group is selected here the preset only shows up for the selected group. This is helpful if you set options only meant for administrators for example.',
+
+ 'LOOK_UP_FORUMS_EXPLAIN' => 'You are able to select more than one forum',
+ 'LOOK_UP_GROUP' => 'Look up Usergroup',
+ 'LOOK_UP_USER' => 'Look up User',
+
+ 'MANAGE_GROUPS' => 'Manage Groups',
+ 'MANAGE_USERS' => 'Manage Users',
+
+ 'NO_AUTH_SETTING_FOUND' => 'Permission settings not defined.',
+ 'NO_PRESET_NAME_SPECIFIED' => 'Please give the preset a name.',
+ 'NO_PRESET_SELECTED' => 'Preset could not be found.',
+
+ 'ONLY_FORUM_DEFINED' => 'You only defined forums in your selection. Please also select at least one user or one group.',
+
+ 'PERM_PRESET_APPLIED_TO_ALL' => 'Permissions and Preset will also be applied to all checked objects',
+ 'PRESET' => 'Preset',
+ 'PRESET_ADD_SUCCESS' => 'Preset successfully added.',
+ 'PRESET_DETAILS' => 'Preset Details',
+ 'PRESET_EDIT_SUCCESS' => 'Preset successfully edited.',
+ 'PRESET_NAME' => 'Preset Name',
+ 'PRESET_NAME_ALREADY_EXIST' => 'A preset named <strong>%s</strong> already exist for the specified settings.',
+
+ 'SELECTED_FORUM_NOT_EXIST' => 'The selected forum(s) do not exist',
+ 'SELECTED_GROUP_NOT_EXIST' => 'The selected group(s) do not exist',
+ 'SELECTED_USER_NOT_EXIST' => 'The selected user(s) do not exist',
+ 'SELECT_TYPE' => 'Select type',
+ 'SET_PERMISSIONS' => 'Set permissions',
+ 'SET_USERS_PERMISSIONS' => 'Set users permissions',
+ 'SET_USERS_FORUM_PERMISSIONS' => 'Set users forum permissions',
+
+ 'USER_IS_MEMBER_OF_DEFAULT' => 'is a member of the following default groups',
+ 'USER_IS_MEMBER_OF_CUSTOM' => 'is a member of the following custom groups',
+
+ 'VIEW_PERMISSIONS' => 'View permissions',
+
+ 'WRONG_PERMISSION_TYPE' => 'Wrong permission type selected',
+));
+
+?> \ No newline at end of file
diff --git a/phpBB/language/en/acp/permissions_phpbb.php b/phpBB/language/en/acp/permissions_phpbb.php
new file mode 100644
index 0000000000..1083dfe71f
--- /dev/null
+++ b/phpBB/language/en/acp/permissions_phpbb.php
@@ -0,0 +1,222 @@
+<?php
+/**
+*
+* acp_permissions (phpBB Permission Set) [English]
+*
+* @package language
+* @version $Id$
+* @copyright (c) 2005 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+/**
+* DO NOT CHANGE
+*/
+if (empty($lang) || !is_array($lang))
+{
+ $lang = array();
+}
+
+// DEVELOPERS PLEASE NOTE
+//
+// Placeholders can now contain order information, e.g. instead of
+// 'Page %s of %s' you can (and should) write 'Page %1$s of %2$s', this allows
+// translators to re-order the output of data while ensuring it remains correct
+//
+// You do not need this where single placeholders are used, e.g. 'Message %d' is fine
+// equally where a string contains only two placeholders which are used to wrap text
+// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
+
+/*
+ MODDERS PLEASE NOTE
+
+ Please add your permission settings this way:
+
+ // Adding new category
+ $lang['permission_cats']['bugs'] = 'Bugs';
+
+ // Adding new permission set
+ $lang['permission_sets']['bug_'] = 'Bug Permissions';
+
+ // Adding the permissions
+ $lang = array_merge($lang, array(
+ 'acl_bug_view' => array('lang' => 'Can view bug reports', 'cat' => 'bugs'),
+ 'acl_bug_post' => array('lang' => 'Can post bugs', 'cat' => 'post'), // Using a phpBB category here
+ ));
+
+ TODO:
+ You are able to put your permission sets into a seperate file too by
+ prefixing it with permissions_ and putting it into the acp language folder.
+*/
+
+// Define categories and permission types
+$lang = array_merge($lang, array(
+ 'permission_cat' => array(
+ 'actions' => 'Actions',
+ 'forums' => 'Forums',
+ 'post' => 'Post',
+ 'posting' => 'Posting',
+ 'polls' => 'Polls',
+ 'content' => 'Content',
+ 'pm' => 'Private Messages',
+ 'misc' => 'Misc',
+ 'profile' => 'Profile',
+ 'permissions' => 'Permissions',
+ 'settings' => 'Settings',
+ 'user_group' => 'Users &amp; Groups',
+ ),
+
+ 'permission_type' => array(
+ 'u_' => 'User Permissions',
+ 'a_' => 'Admin Permissions',
+ 'm_' => 'Moderator Permissions',
+ 'f_' => 'Forum Permissions',
+ ),
+));
+
+// User Permissions
+$lang = array_merge($lang, array(
+ 'acl_u_viewprofile' => array('lang' => 'Can view profiles', 'cat' => 'profile'),
+ 'acl_u_chgname' => array('lang' => 'Can change username', 'cat' => 'profile'),
+ 'acl_u_chgpasswd' => array('lang' => 'Can change password', 'cat' => 'profile'),
+ '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_attach' => array('lang' => 'Can attach files', 'cat' => 'post'),
+ 'acl_u_download' => array('lang' => 'Can download files', 'cat' => 'post'),
+ 'acl_u_savedrafts' => array('lang' => 'Can save drafts', 'cat' => 'post'),
+ 'acl_u_chgcensors' => array('lang' => 'Can disable word censors', 'cat' => 'post'),
+ 'acl_u_sig' => array('lang' => 'Can use signature', 'cat' => 'post'),
+
+ 'acl_u_sendpm' => array('lang' => 'Can send private messages', 'cat' => 'pm'),
+ 'acl_u_readpm' => array('lang' => 'Can read private messages', 'cat' => 'pm'),
+ 'acl_u_pm_edit' => array('lang' => 'Can edit own private messages', 'cat' => 'pm'),
+ 'acl_u_pm_delete' => array('lang' => 'Can remove private messages from own folder', 'cat' => 'pm'),
+ 'acl_u_pm_report' => array('lang' => 'Can report private messages', 'cat' => 'pm'),
+ 'acl_u_pm_forward' => array('lang' => 'Can forward private messages', 'cat' => 'pm'),
+ 'acl_u_pm_emailpm' => array('lang' => 'Can email private messages', 'cat' => 'pm'),
+ 'acl_u_pm_printpm' => array('lang' => 'Can print private messages', 'cat' => 'pm'),
+ 'acl_u_pm_attach' => array('lang' => 'Can attach files in private messages', 'cat' => 'pm'),
+ 'acl_u_pm_download' => array('lang' => 'Can download files in private messages', 'cat' => 'pm'),
+ 'acl_u_pm_bbcode' => array('lang' => 'Can post BBCode in private messages', 'cat' => 'pm'),
+ 'acl_u_pm_html' => array('lang' => 'Can post HTML in private messages', 'cat' => 'pm'),
+ 'acl_u_pm_smilies' => array('lang' => 'Can post smilies in private messages', 'cat' => 'pm'),
+ 'acl_u_pm_img' => array('lang' => 'Can post images in private messages', 'cat' => 'pm'),
+ 'acl_u_pm_flash' => array('lang' => 'Can post Flash in private messages', 'cat' => 'pm'),
+
+ 'acl_u_sendemail' => array('lang' => 'Can send emails', 'cat' => 'misc'),
+ 'acl_u_sendim' => array('lang' => 'Can send instant messages', 'cat' => 'misc'),
+ 'acl_u_ignoreflood' => array('lang' => 'Can ignore flood limit', 'cat' => 'misc'),
+ 'acl_u_hideonline' => array('lang' => 'Can hide online status', 'cat' => 'misc'),
+ 'acl_u_viewonline' => array('lang' => 'Can view all online', 'cat' => 'misc'),
+ 'acl_u_search' => array('lang' => 'Can search board', 'cat' => 'misc'),
+));
+
+// Forum Permissions
+$lang = array_merge($lang, array(
+ 'acl_f_list' => array('lang' => 'Can see forum', 'cat' => 'post'),
+ 'acl_f_read' => array('lang' => 'Can read forum', 'cat' => 'post'),
+ 'acl_f_post' => array('lang' => 'Can post in forum', 'cat' => 'post'),
+ 'acl_f_announce' => array('lang' => 'Can post announcements', 'cat' => 'post'),
+ 'acl_f_sticky' => array('lang' => 'Can post stickies', 'cat' => 'post'),
+ 'acl_f_reply' => array('lang' => 'Can reply to posts', 'cat' => 'post'),
+ 'acl_f_quote' => array('lang' => 'Can quote posts', 'cat' => 'post'),
+ 'acl_f_icons' => array('lang' => 'Can use post icons', 'cat' => 'post'),
+
+ 'acl_f_poll' => array('lang' => 'Can create polls', 'cat' => 'polls'),
+ 'acl_f_vote' => array('lang' => 'Can vote in polls', 'cat' => 'polls'),
+ 'acl_f_votechg' => array('lang' => 'Can change existing vote', 'cat' => 'polls'),
+
+ 'acl_f_attach' => array('lang' => 'Can attach files', 'cat' => 'content'),
+ 'acl_f_download' => array('lang' => 'Can download files', 'cat' => 'content'),
+ 'acl_f_sigs' => array('lang' => 'Can use signatures', 'cat' => 'content'),
+ 'acl_f_html' => array('lang' => 'Can post HTML', 'cat' => 'content'),
+ 'acl_f_bbcode' => array('lang' => 'Can post BBCode', 'cat' => 'content'),
+ 'acl_f_smilies' => array('lang' => 'Can post smilies', 'cat' => 'content'),
+ 'acl_f_img' => array('lang' => 'Can post images', 'cat' => 'content'),
+ 'acl_f_flash' => array('lang' => 'Can post Flash', 'cat' => 'content'),
+
+ 'acl_f_edit' => array('lang' => 'Can edit own posts', 'cat' => 'actions'),
+ 'acl_f_delete' => array('lang' => 'Can delete own posts', 'cat' => 'actions'),
+ 'acl_f_user_lock' => array('lang' => 'Can lock own topics', 'cat' => 'actions'),
+ 'acl_f_bump' => array('lang' => 'Can bump topics', 'cat' => 'actions'),
+ 'acl_f_rate' => array('lang' => 'Can rate posts', 'cat' => 'actions'),
+ 'acl_f_report' => array('lang' => 'Can report posts', 'cat' => 'actions'),
+ 'acl_f_subscribe' => array('lang' => 'Can subscribe forum', 'cat' => 'actions'),
+ 'acl_f_print' => array('lang' => 'Can print topics', 'cat' => 'actions'),
+ 'acl_f_email' => array('lang' => 'Can email topics', 'cat' => 'actions'),
+
+ 'acl_f_search' => array('lang' => 'Can search the forum', 'cat' => 'misc'),
+ 'acl_f_ignoreflood' => array('lang' => 'Can ignore flood limit', 'cat' => 'misc'),
+ 'acl_f_postcount' => array('lang' => 'Increment post counter', 'cat' => 'misc'),
+ 'acl_f_moderate' => array('lang' => 'Posts are moderated', 'cat' => 'misc'),
+));
+
+// Moderator Permissions
+$lang = array_merge($lang, array(
+ 'acl_m_edit' => array('lang' => 'Can edit posts', 'cat' => 'actions'),
+ 'acl_m_delete' => array('lang' => 'Can delete posts', 'cat' => 'actions'),
+ 'acl_m_move' => array('lang' => 'Can move topics', 'cat' => 'actions'),
+ 'acl_m_lock' => array('lang' => 'Can lock topics', 'cat' => 'actions'),
+ 'acl_m_split' => array('lang' => 'Can split topics', 'cat' => 'actions'),
+ 'acl_m_merge' => array('lang' => 'Can merge topics', 'cat' => 'actions'),
+ 'acl_m_approve' => array('lang' => 'Can approve posts', 'cat' => 'actions'),
+ 'acl_m_unrate' => array('lang' => 'Can un-rate posts', 'cat' => 'actions'),
+
+ 'acl_m_auth' => array('lang' => 'Can set permissions', 'cat' => 'misc'),
+ 'acl_m_ip' => array('lang' => 'Can view IP\'s', 'cat' => 'misc'),
+ 'acl_m_info' => array('lang' => 'Can alter forum info', 'cat' => 'misc'),
+));
+
+// Admin Permissions
+$lang = array_merge($lang, array(
+ 'acl_a_defaults' => array('lang' => 'Can alter board defaults', 'cat' => 'settings'),
+ 'acl_a_board' => array('lang' => 'Can alter board settings', 'cat' => 'settings'),
+ 'acl_a_cookies' => array('lang' => 'Can alter cookie settings', 'cat' => 'settings'),
+ 'acl_a_server' => array('lang' => 'Can alter server/email/load/auth settings', 'cat' => 'settings'),
+ 'acl_a_jabber' => array('lang' => 'Can alter jabber settings', 'cat' => 'settings'),
+ 'acl_a_phpinfo' => array('lang' => 'Can view php settings', 'cat' => 'settings'),
+
+ 'acl_a_forum' => array('lang' => 'Can manage forums', 'cat' => 'forums'),
+ 'acl_a_forumadd' => array('lang' => 'Can add new forums', 'cat' => 'forums'),
+ 'acl_a_forumdel' => array('lang' => 'Can delete forums', 'cat' => 'forums'),
+ 'acl_a_prune' => array('lang' => 'Can prune forums', 'cat' => 'forums'),
+
+ 'acl_a_icons' => array('lang' => 'Can alter topic icons and smilies', 'cat' => 'posting'),
+ 'acl_a_words' => array('lang' => 'Can alter word censors', 'cat' => 'posting'),
+ 'acl_a_bbcode' => array('lang' => 'Can define BBCode tags', 'cat' => 'posting'),
+ 'acl_a_attach' => array('lang' => 'Can alter attachment related settings', 'cat' => 'posting'),
+
+ 'acl_a_user' => array('lang' => 'Can manage users', 'cat' => 'user_group'),
+ 'acl_a_userdel' => array('lang' => 'Can delete/prune users', 'cat' => 'user_group'),
+ 'acl_a_group' => array('lang' => 'Can manage groups', 'cat' => 'user_group'),
+ 'acl_a_groupadd' => array('lang' => 'Can add new groups', 'cat' => 'user_group'),
+ 'acl_a_groupdel' => array('lang' => 'Can delete groups', 'cat' => 'user_group'),
+ 'acl_a_ranks' => array('lang' => 'Can manage ranks', 'cat' => 'user_group'),
+ 'acl_a_profile' => array('lang' => 'Can manage custom profile fields', 'cat' => 'user_group'),
+ 'acl_a_names' => array('lang' => 'Can manage disallowed names', 'cat' => 'user_group'),
+ 'acl_a_ban' => array('lang' => 'Can manage bans', 'cat' => 'user_group'),
+
+ 'acl_a_viewauth' => array('lang' => 'Can view permission masks', 'cat' => 'permissions'),
+ 'acl_a_fauth' => array('lang' => 'Can alter forum permissions', 'cat' => 'permissions'),
+ 'acl_a_mauth' => array('lang' => 'Can alter moderator permissions', 'cat' => 'permissions'),
+ 'acl_a_aauth' => array('lang' => 'Can alter admin permissions', 'cat' => 'permissions'),
+ 'acl_a_uauth' => array('lang' => 'Can alter user permissions', 'cat' => 'permissions'),
+ 'acl_a_authgroups' => array('lang' => 'Can alter permissions for groups', 'cat' => 'permissions'),
+ 'acl_a_authusers' => array('lang' => 'Can alter permissions for users', 'cat' => 'permissions'),
+
+ 'acl_a_styles' => array('lang' => 'Can manage styles', 'cat' => 'misc'),
+ 'acl_a_viewlogs' => array('lang' => 'Can view logs', 'cat' => 'misc'),
+ 'acl_a_clearlogs' => array('lang' => 'Can clear logs', 'cat' => 'misc'),
+ 'acl_a_modules' => array('lang' => 'Can manage modules', 'cat' => 'misc'),
+ 'acl_a_language' => array('lang' => 'Can manage language packs', 'cat' => 'misc'),
+ 'acl_a_email' => array('lang' => 'Can send mass email', 'cat' => 'misc'),
+ 'acl_a_bots' => array('lang' => 'Can manage bots', 'cat' => 'misc'),
+# 'acl_a_backup' => array('lang' => 'Can backup database', 'cat' => 'misc'),
+# 'acl_a_restore' => array('lang' => 'Can restore database', 'cat' => 'misc'),
+# 'acl_a_search' => array('lang' => 'Can re-index search tables', 'cat' => 'misc'),
+));
+
+?> \ No newline at end of file
diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php
index 96db678f8a..fa6032b8dc 100644
--- a/phpBB/language/en/common.php
+++ b/phpBB/language/en/common.php
@@ -144,6 +144,7 @@ $lang = array_merge($lang, array(
'GO' => 'Go',
'GOTO_PAGE' => 'Goto page',
'GROUP' => 'Group',
+ 'GROUPS' => 'Groups',
'GROUP_ERR_DESC_LONG' => 'Group description too long.',
'GROUP_ERR_TYPE' => 'Inappropriate group type specified.',
'GROUP_ERR_USERNAME' => 'No group name specified.',
eTT6\.'zxnԎ8fɩP 9FxS9Q}<ZD"B*9w1 u\ckt` CZLJsEPBK'8%ƕ*eiQB%EsW[pR+6$w!1'Uy܉u$> kpG[x%==hZl;@SsO ]^ cҨEH7Em<. HB%+D-&Lۭi TNmwy0`ڠQP"  H` a_Vz!> )-xuԔ׏!DzT>zúCa? 4XGB?ㆦL@N8Mtq\Q\\z c0E^K0): `g y*LaqȞ~>>'7C8fS}z8(12w:xUG2Ѷ)&8PwRES@:i.s< VTtĔ[d @Gǟ}H{\M zKȨEU%# /E}}:4{3[8PW%]dru[0G!pY+W' $I55bIX;k$gGr_s@t \Vl*%ja*ap=4?݇csu=Rze6ȹZkѺ>Gά}{0laHɻN:Y+d[9yhٙ, \@:@! P8•\16jJP+3s Zh\HiJT4&<,9BD/0$A%CGł{PB9x;!R8C(}~ apa66A"q.]LS"fL Kൎ5y1KI&AvA4t"6h @L#E_/U É5WXO6gq ^ȟI}370\3:L8TY8ç:忟whslsHEpMw*Tw5I]{f; ۚu7:[8%{v@ d#B%*0Rd8 $NAJ+^*zȢL:ȢTU$q"&bI^'] !Nb&^&~[/qo@7BYRI*H).@4 u H$iӈBth 4*CCC"r9"%4ZԺ u)@i@X:iy Ai@ܴ:ԥ(rwjT9[h*Zt J<2F*'->菱'KJe}_ ?jwoO?_~_iJJ)Z֢9uk7tnӣwwt^ffff˻<ʬ̌ڔ'A!DSWYXցgb6%:&OsxP2B db`}C\?Xo>y)", + #5[3 J9Z5 s65n(h+Z1Vϼ2\rܙuR" `RQ-REi D|IUNZ!BQx#Vםs;fϛ\?BN(;G{%}~s. "ZwYޒ oś;:u>2k%'OF x xu ?"y@pQ4=C@ҕ=w*&Ⱦp~݁5r<̡{Dy؟tA ]n㧏i > ˮPf[arkB,+ BQo Q˅ŜP)avhE tTȬ^8=4H+~LX48DB`KpBA@ xbRp 5RNRd؅66H{0Xzk3c"- z]ۼ<$ę! 1e"()*h(;u8m--DJP5ĔTADFi ʮDg~pDRC"{45"`q ߂ x⽌  }%LΔ44PV@{6_8K!ΞY&1mxCH~O?8:,+,,nۙm>$sOHL`s'/2fBێI')D DDC@?|a-53nyDE5Odd"F* :U_O$- D4E!HP"=B ‚8 @h)O`onVqQb?mCpP{!Dd_ nEN)(qyU뜸&qγdYI[CB) ;=xma09*!%@hcSQ>ϖTHp'm}#+G]X~\l2XCF1G](Wi!sq%Ί4)Z뷢pY-3r<ۉބ)'\7Lz6L̲ SHDmlkPs͜tI5I5$$ihE29+9HWU/;Ȧ9:ļT;OY{9)i?t! q+-)ܻP٨TF*w=%GdY$$'BJHQKnY 91 *s%: 6mݥa_Xo[5`"ȗIJ<:83# TdF|;J%D!Sg:i8YCŅ՝;b0ݗmpt%"?D=43aDi8̋ "G:E;PLr&q!d$r뛿&gFKIÛ2 nBDWrg7tWl`sfMˊa9Nw֜CȂ '._"'wVTE+bL \kW ӹahd0$DmS5lPvjV B UqdlfeWUP\:"XN;L|\Sؑ:KrIG,fI $DQQM64QrE- )I$zr~?Giw\~&2]ș쁼)hOt:`ȉ&[T&"-@FG=)h j]&dY3#̔rRBJj@\)& +&DAҝB!shv]wW}u'E`މ `hiA Z 5BݙB1+ &X-i ͭslW0RD&bڠ+s ʈ6sBBDsd)!9/][Y(LEDMHWB AA!jAir69D-g9p Y6ҝIqk.69ztu[ z!0bwyY!n @*F #7ap0:f(#VҗIs !oSѭfv:$k08:m}ק!8!$R^sb4(c2PĔt%RQJI2BRN;PiaPA RlaD3̚&m=630<{$A! RFkm28CUJ P5HYd Aj $QJ RZD() !*ytIBzH}ҦωtT(GSˋ,TEvfQi8sSiP@ hQE4@=fQ|X6FDhO B T)ErVh8 G:AtՈ@+"#h)4 "'ِi@4"5JU* iҴH B4)Z6!eWH'!Ih&Ah(!H*iD@b4 Y EGn h6cc$l;qZ iB⡤$w@k;PR=TΈZTLtmcXI"Eb K.WS72W:=wɑlV+~AChCz۷!s Vi&qd⫹ z]ܜ2+uB@r:C%BiCQ7'Zrq4BAH[:_2uZD>rcGŊC >CaPM__u=Ʃ.?xo"d U!JPb~ IAJ WA@h4e )gyReO,ry JC` 2 F Tb_ |@_rW!g,9뎲dfm 8~lsq!(:sw#@q.[ YqjS||dtGRJ! C74-Ysj1ZwHЗrH B C@R<H&zHvn;F.dYl(\9F&54#@+5!ld.30nB&U 3]XZl 6fmҳ"hكL.#&Eai)pmӪ!gD\4d0Of}fN UD_؜ܼ wc4Ǣ[*J) RX@BXQYtC=83EJ:FoIpu0Bg}yOx|`4 P-u 4#eJQ20b$‚n'%cr<"<ŵQ muEAwac}ߨ_SB觻!$ Íe?b0>>aH)u5H%XE:w0ǐG|;E'v葾nAPy 8U!$PURq3P^4әւ|C}>9I3$ġٯOVYōTwLK3/G,@(0Q`"lEhU̘&@9i LO-CHWZ$nEf#%As ":,S' *ޅؓR&ް(j[_׋ҥwO8g]g8Y6a:7|xoh]2i\d@襉:.~LҎLAK\*9L|\TwW=|<;?g>5p{9 ̇Y:&@d (u>r_3'(Za9k XG&]xG6ߣDhyBϔCfw۔-t61=j/Lo3˺,hpa$$&dV+J !ÀȈP.{d(hŠ B*@7 (FpEܹ! Gu4%W~0`I2Ot=eUF~Nx-ȈДGҋAJҨuͩ>M5r|<+ 0;wU F=⢁*So˿V3\"4I0"v23e'A 祃ѹ2RD怈QujFE>FD5P;H+.~ˍf 1],<_4* i$h j e(kQS= *P!2)Ez lE'DD_0JqۼO?D4d~z\5wT'I4YI%t]UHO!rAWG_Ry9GOˏjؖ},A@_\7%1 jA%\by]o0q(j.Hʯ? Ȟq#ԔrR_/j2' 8{1$wV"nә'|@nDIMPR_ra @'m&/!)RyICuDBtx|xhnH():Brq#NE-R>tlmxѹDy!JCB4}Ite7),X bs(*=u:}yMEq|JP'4Rh2 [R)5V˛T09H$<잖sF <9Q !H*+gI9LwnP,$J]1;5L-@|J 3/ kH":^ ء\ɲc4qJ/9+q33Mu!\ 1hCd̪ 5;j;iHmEJwJh}`߈3Q@~M*>3 7?l?r~$h@Rҍ+U!J _l'I( Jǝ"R x!Te_-"/#7z|1xc " [ ?6Dr"۳!t'ןx۝Rg+Obh֍{)K?\O'Jz)JNXCʢ.P İ}qo\<9RTATUJē!A@~1RZ(/' 5>r@`@![0mE6RbfqfFbEhƚH5 ki7V5 2aKLGIO?Ӧ'H$/}$94鋮n:E͆4N!\7aP9&R"M K@蘚9@.z `?(p+M-u a1TDp<:̭i'Hh5ݚ3\1"=;RLbP!M,{ニRJ=! 9#ԚBD.41 xnB83N@2Hܚwu",.I~R$qA1TO/CyӢ5lr "\d ዟJ]Ђ"yMnd^tsGu1bI(&7y.ICLbƐvPKS>  () 2N;APR (B?[]Dd D$x?wJTgaG݌v_׺(Bd/&@عs5Ul!ĩ8@DO(}=`լDl@[&h6'Ͼ{ppWh|*CL=>GfUkrݘ2Vj(#.٭?=8hz+Ng6N)hwP3 l(]P9CABuZ?\m<_2ѡtvx`.hJ€F[-!A0RQWy C̘"7(q řX  JI!)*b%N($m#jFg8x r:3BѹLXd9wYkI8#i3$ȟw'3#@NgR$p^XSpOApýd#"* th0DƱQ[ThҘf _D<K% rlYTX6&89iGp;Tj HpC(4Phw|6D;{xlRs`qwe /G?D\یt1w3+»c88R9]$$i%Hēq9Wg>S#|O N3Cڡ Bi(BDt!VR"3RdJ9|%۠: 1 |ϟU[$IM%Q<79X b"-srEU*e\ ԃXeIm"Ddչ.F-"3$s6J&7 qc "b6fPAHdMO94!&j]d9z;O'_pAVIEjŤ?fc9k\y%7G3V ]8h?I$`1 /8w`^ߥѽKWq"bN 2'0-fܔ,l8zsz3KΩ_OJz9VN 8WЕL1RgT% $ ĭ8u5u6UHt:=;x 0r#Oݕbw(PK;wD΢)FZ%9W#[]В_!zN3r,`#"D "%ֆי]$bU]QDSd<s΂\).tnX|GBވf (* u3_:ؽ+ʂf__ڷz&3n4OF:ƓH]hCՅ"-~.5:̐A3QPLC A4I0C40EL@C32Ljn7B PЙ(Tp1ld>^4uKy l{)ִ@@\'z@Y|{A#{Nۥe |W!jI}3_>@T $p[ZRz(RAu&I~O#?_ChgC XA3߼ϧ뢻:Sw5`}N2}P,KL8,_]C v# qyjXC(%p,3#:~F*B=)CCwA ~]P߇磼¹AcGA;cgh%%rGAӠ!i(Yie3:t-HBLB@R%#Jԣ2 I45E5K1>LG1:"1n6J|@>- |m9@ls POp`8iĂwMOy+W&M4& ( & hhJ`QDUO@N)B%) Y((BdY&EbUd ` Fd)f!f!j$ "aJH d(%("fE " fR` a&R& i "E تAo52@60b>?^W'wـI=R!Ʊqԣ L.b&f.Lؒ CA 'Is+uֺs{fs)DĄr/h>/Btu=Ow#;7{cQ۬k_a;Rm@ԝ!z6H ̣#Ïǔ%4,@+J5Ap?&wN0Sgg;(i)*$OwȘ?H_~Aef1EY a鋯cFnzz@vP8\%T JT@DrJ(p+;|p<I@c0~4(d?xvQ0E LQ&l#Nj2,8HN!BMw$'\^gdbALw?[㗒gn% ]`sGy'\0);BّAw^ NhSk/l/yv찳0%ln'8ăCP΄(JTG<,=9;yHsm&fqB"y4EMDPSUT2CQMKs%jbB""V(m.MQCD1Q%=`55SDu":ۮbTLú<ΠU`.s J((C[̀(%QfA! #UEQ6< ACI5`94ي^lΞ Ӊdb1dLTCGPjp\tutT"$ L൛u6' p*0TT rw(p "k^t 3- JB n9ZB&)j JhEIMx2%0p͸&7WIjJdNGN$8HڝAćء RU 5)l*ʾzk(IJtMp0.?4kIC(ȏ$yNɢoO?AdZQ >2&>LAҼ{%3]^mcDР9^dpΩj_b;.ϗ mBE͖̚CpUy#I5AF(^!ERJ8@hAJWh_V^H*_|2tv ДtAH.dr j98r<?$rp&&]69 Dq5P!:ʽ!$ ZOL; "'2pCdC-%@ǽDk,! (z$J 4P!M"C =0@QN'\0[c:;u*zȆH!VoOp*a< T>O҂")Y5P&8u7|4aiO_'yc/'QtHkP-(ҡ@?ŃxN!&0|H׀ r3jbSLv?o9Ҡ)9))r^7\J7YҝBkuj.@h :41$Ng0[`yuԱMPbNt6D EJCNC Q btb &0A)UMf cYcbY:ԺB U3efSC#%3[&1 ),/ Q164*R3h&"$t̤ r\| /+0$(,[(#l P ^k81YXDEFڲ̴(֔2 Hl%2c $Va !jIN_Ca4ۄFmhX1 *T$! ÉB?eB]M ܶaWy}A҄ =Y`]J}tX[?+RQwOGI)|fڷ{o=yar?or#ċL {-'.>0$ jh!4}ܨ׺uAB|n#z)C>;q vV Wc"ěȃwgsVvϲUQbRKcɃ5h~oLMSd =@hRHz=|ylUw/dL5]?ЀjW\g.͂:uER <wuMF./~<9x?0d(h?D`OYdR %b.B6*pEBb!HPڿThYe`K[,tf],#3Ss#Gʌo4o Ⱦ(-4R q :6f8%‘"+E iFIc(*&\82ҷK{J.Jr s;fm| pD,HPWG}ficK<->(TIPJe@ 4heP&NF@-&4,2/6 n#]@Xӆwz`p!OjOw+_s]Cm ,$rPspD)i1"toZшWjPj\0:I0'P[.HpKR*L[C uP]ȯPɳL;w&\ݮ4II @ wA,@-閐*f[[)PLrL2U*xMΚtzV8  4Fn8\9{K[Z.I+e*Y 2CR{)'PP emRu㤌O.2x,vF0 Cs0$C,m$@̈!b}%\ 5K&lrrs発ȓв+{Q Scms!۔h7cb 9bғ,oVyh@Db*-d'MڶZ]i9i^qb@h34l{$C癞Gҿ\ *n&h}ڣpCL\C=&wrE抣\) 9]u-\bVVSJ~ᥐ]3XdBl;= 9 W)S6 ?X3f <8׬sSSiYt˫Z紲u(I"=Q``FjUgab!UDAP:QU, f[_)!֜v

7q m.;ٛԵǂtwGzfmPt'v`I-[5:lFXoQ7I[y#6HYZ^7x3RtLR(I7ȄH>F w4$Ւ]+w޹p;qb ^&!<-~9 >09:"C'`mD7lӎh 5۩W VI[W|]z8z;vt\ q;g+z9m2h$N2 P=zn P>pO׏&3 rA O(dnN#"!Uծ?ufa 2B03S;>!2rQpR0 P;0౫@R3uٞCp,uBĒ QuLR-k, )IJi4 qۑrv=#2lcQ3 5-@ײIC](()J&iI ~_@~yqb_pri+ ˊe0м:D&Hxv@v9GYbdѵYX\.'cvtkda`C.|зo{(.okxg`rV?40Rtok5)@V"*99d܊;7νA\+\CS1_ԩ& Q%l&B& D*D;rXJnvǩpb" c0U3v,2aw4 3[ יM6IBq: tbonie|nmL+Q\͚aEپ:oqnMO(>^3EQ4F=]];Az?| ?L/l\+W5 \?W22MN\27: h7CeE JyGvWixq`OլԽ:`Y;L`װ`qo'1T!S.DK1Pr "'@Nh#LsNQ5V.ޛ4M=%jX%D # UcÓ1jgVMV.bEu~O)]#!OO[ kjÇ_RCLW&?ޮa=wG !PJB"<`YdjkErL HH#LspicK;Q52dB,40}^7z=vPsn#CLlinU?+S1N faLd Jyu.y Ӆ8kO ps|`x| h%.;z@AB S6Q)gb7z2! {: ޘLAr A$0vTC}Fm ADW W:&( S3M@H93KA S֏iPE~7DGI _A7aWjh=^7,'zm%9ek52pn&HFY9;&'PsӤ(9,n`8i4x:r,\: jqaqr:;X޹#8q3o][Kg9e7&rb멱;췣2˝GA:NLJe=^\q8BNR4n@2T(J?S}f]߱Y.Ih>3A>DC4RQ2tɋ|fȓe҈('CC{:H8vĒT""Bjeb"!Z Be&ED(VV*fF`B%jZH$h)*`JV& () 'y<zB" b G|oO\TOm!&2:t;`MΕV 1 = iB!WCg`2r6:($I$Tb L cU9<3۟k}4✶*U%)Bh5\ń$;mE-QAXv7Hǎ ` B} :X#CY/(ҏA:w=Ңj1L CY ePϾ /<<*l2@{=%1|G?TH";[ᖐ6LyR `OmD;zBTD]ߐ2?ֿ QE2$7-'D|ޯz!ʺp5}9=H\£e5~렏:TҠ_5^b[*]2z;y~05t&0WϞ *D5gP2ޙ5~3sR!.Ll(YBG-f16Tln)dT^rWV;TX8FG&v^D9m#;Cuc2luc9:jb.Km7G*D(ʠ"mRD 'zi=jȄWO;r8%#$U% BYx;ޓIG#gW]w j9%c枇Kם) "5`dxs0g2XT [gݨt<2';IOþOJ7ㄵ *s3[= I J%K3 :*›ižph{ LvG,=Q),(a(Ha-]NlsasJ6qO[a?+)xĜSdT BbuhT`@=B yp0<)aPTJ#TxؘJ$QLL]KD '-ZqOCLU+JƐ7L!86М=;;%ܤ)Tr"ƯApIn&jb2|rX$HAi.E\uz$ZQ ;N xQC`F&CZK炝O"W&GdeRD>wBמ:94s30X돹F!y@s̘~1ioI/<"\<pp]HM xE ̰u+;%XR[dɋ/O XF` ۟[=';=rD]r9]p:qn6sm2t=@VI<" *ahr'b}#ݵ -I,םDҿJ+@(dCbc w q}ZFIH 2yY-aTݎrFú$-ԂM7p&ek\2G"|"`Ě}VusT*Sojzɶ{Az}G]ҸM{ӫN*e[%P&eC\'>+\%,"z6qI`~P@!oιם{K+HfX即x0)D]$zwIֻ~s: 6ޥ8o3JkgOR@U #O&A\{HɴjB~r۹s QɡL:W,XwV\ެ }G8 :@\$#}=x u }*z7?Wl}x}OW?עw:T؎5(@` sty=j8sGą8 [)Dڻ{sq޶AAK L^/s*}36iD>99Ϩ8O=JPH0܃/2u:fR4|1~)WhTtDDE*E8Z%p&6g>t3_\|Il}aS[Ț^[H"׭wEw޼X,#D&s$*w m )D5yt9 5$>܍72F%-ަzxUqI;Zi`zs >t!0F؁&ȏiZC<&;HXakڌU7]~}_Ƌ|>!N%6$@T6hǢ՜h·JN>& 1 (Shw(F%{ o9:F.@4*yM#!#ÜuX,#βiɜ:Iags'"9\褰:`I|oOCs l)=;`8ئ(CG؊S/ h!3s\IM' q6ѯڇ5c<'cP,@S^?EpNo[/B~^O1DV3EP^e;{C@?yFfp3as({#lpD08A/!.y?R4Z))8$R5E Hreî4DxکC@sß8Y< v%T%ppb*ypp.X^bwC 6Qs(y//I(NDDY(H1z;p ]ʈ;uQ'7Ir>)ɩ,rwSc (r@K.IJTܐ:CfЙ0 #O}Sw&EṆ{LV*zfd 綀V$SMEMMS1\͍ epE9vUKBu*Tt.(EΤDMv 1$v¦.4ً6Y;tMKEdIyKH&+XYs6;mr"C3XHu&5IK#6*kNFfb*(c^ s߾Î&L BKޤH)8h֭Ql]:I]cmc+eeimFF X_ u&Ļ 35,HJU1l*Di&C7ꙇׯpo"8O!bǔ1>DcSXO$ /bWD 6rxOr B`򖑉hu)ܜLQ}Hg;kZ6RᧆcO> c@l*'d.PĝB 6{zvfZJ )Fh;AM"QB/%BR< nZIIhFGATrD8!ҍ( oخц#tGw^<c(y|8O9sqQF; yUfb>_? 410&٧:ا0$ U 4\a`qrOW#!D- Bbg~bՌx,\+fW$kjN'"I.R6$+ o9NANT|H |2H!5M2䩆 z=C\>㟲}S@JG1G6u"1H")P:Oٿ.(] "(=E214-4DU#ul%q7SY}r -Ss% ڔ! 3 Zya[g iϴ›M}uϾ;N2urф=nTovOT.Xv'r@FgH!jDZL7A,NI&$)&cE4#axަP8 T rϱ<Nf%RI ("ZDB5JFFF1:q05Kc{;J!mz2\;4Lx 3XPʼM`fyHU;`|A@ GE>`QRB/_`Ql* Og'7 6Ϋk<~/G#?f5߀2w(߃Ek}-N4YɿGxc|MҫtDߴ¨e p1#'RARTvP:U,pi B/zs; 3'm0?T+58q1T6h(Ggop 7*"_="3%[^BOI~ NwKl=a^v]`A$>F_8PKTAD2~L\C[pLHI2>H%)CD4zH%Lxx|}c?N ?()+ӯ /2(q *LE8J? ʉ&J(hZc ?m0 r)"' d|Oȁ:X$_d}FQW>Ex99~{}o$A<%һn99!5rP~شġ<\zo 녍r#K@m%,`*#T;X9ȶIʟ5g<$UK+_2"w(|ʓ7jy2vp/ɠD9ޞ uy ܪr(4wR-V%'9s1u y;X9rWMԦs%`OtDh)S(N8EE Iw|/5wCGdRъ"&S2ɒw (GN(:j3 QC_y+rZS w&PYN@쩦9rI&X"8Abt2zTfF8٢vhrj -*L\I HDF4J֎TJ.`=q`f&&A} Ldaw?k]Z:ovǸC`:yi"崋 H >S o7 3>x1%4!@E~m<{(2I20_׼"򱵕l9PјJHMseDC:DEg {,!(i"vCm@\wd(!A080Fͧ#xcO.FPNd9%r7$ĺ92[ 0aP.{h~{Rk 8aMH$VaA:^. IHdH)wrξa{DQQUPL@KC0DIT*DҔ4- 4H+(t8GT]oZ9N>סst QAQDo͑Ə+(fd`)Cܘy4c(m?Z#>b;W=ʮe }}\餦:(/A@h"d1eu"JiSME$?0M0%$AA4AQQCPQ tEUTQAQCQD\WOώhiO!8E TR,&(I&KrO πSd74?3pq&2 W;|lgc7Oݻ}J%s9P[N"Sp ͜NaxAK$!HbJ)R |%V$Nfd*fz~7$9F( @@}$<~=Hh.>9:|!׫¿m ȐIB|pu]D(d]ب~GzE8<@sv+!D_(K`r޷8~p z}~Bk @^7 {0F NpFqɀ.HЂ%H9x pd9{$ʸɤq92^~6`4m!n>|ts guNe Zj|_:kOp@'jQ$2ցA9g7m>:>Ixp2 S4DT5()PQ-} 1ٍ4Sp{WrPz7Uݮc㉁[?"w> @JDϖݯ#0="?_W#3?99fpt$_ߡ7ohABGCȣ*]>Pv*|Mߙ<#_eeAb "fKN9x5.* #&y aÙd&GNoWhuz h:C›s<&(\E(Ӆ*_7(uk#9cۅpi{G63{#'KU!.!T" rP Fp6ǭ49$g"8*;RP\i Tj&aSb < 5Д9=Fd))ȘA W70GH[W8M)@R42jYvwω}פ4hF8/`/BN$+,V\zmL,JI#hT]URf=w^a&ca*N"I0t*@ᴏRs{{ej" 2v26sPB;D5껔=B'z#(o֑֡8 ]UXW:ܬDfNkO 4Ju've(),||uN$Ğw_'+KRޜgA*`HbׅqXCGؚNt9?D"re/24>'˾)!,*2tJP/P|v2=<@͟rDgG5J<<̕)t;89郆X<ƶwN' 5π:,.+ON\ʎ5BCg:y6xQfBZϞ.bMꑙ…&0$P(Y"tQ4D\2Hs>?Q"9@zH3=_SZaQT@B ?Ѽ8@CN`&ev5>ϲ)蠘v?;H3BKI^w(N >T>?E'Lb4iM.kC#2hVHRG{PA {>s~4{݀G'ݶ@Gj,`IV WB!`Dd8R "4Kid eKK%i "pCAVw.qDZCRjS?n;٢L}z.\A_`st_zxy'{(')Z侧{=/[E rKYF[)\0(EHE R{i7EJa%ICU?PC T>(xT?‡bL^!~F ׂ8`p<0w`w€P( @˻P<= P* (@(wNv{2TP@o| j(4ʡ׎م{}0(AA`Pꆊ9*}2 ݍ@P(uӧA}H4@`UJ(>֎Ep2Iރop>ں-RjBcv6Xvf]olJRJ( P5uJ+ĤA|W>؂^nπ/Oz:x0K{` &Q7E3 ޯ7w8-Gp{pqp1CsT@G^!=ݶOA=<{o}́l%6ٍk}UV|h=a{-}z}⹦-po|3x.wfי¡uղ;=YǞfy||y;(afsSm}em;p.]p䳑;ƇSm5J F|Oѻ]ݧTT({g&{|ST>AR5(BRiJD)) T I}}޾j|:۾xd*^z} =sy3="E|;HKiQRQ{.L_kҞxPm%y#LfmۻRcD1IͱjqV}_mwl{śފ: UJ}`5.wq^ŦW۷%'qkwy%m,PFin+e.wv));$sKi˳6ۍO>5orM6ԫ.n&GC!A@zʎͳq)Uc2COk.5-w-_]tIM)Sv8jlvՀmހ>۾P!!f[47OMM^@Wkھ9YۢQN`0 ҏ}vօ=JJ]"*R`>u^ҲzʻFu752nۨΐLkπƞ>ǹ}q=9o[{w|i޷vnvv \̥׽[Zs۶hiq|}ٷ)xMuˮ̶KU)\r[;] x8i@ @ h4M&jb&b6M IhDڦz Jz"B4@h"h@hBFJbd? z=F4@))h#0bhT4" O)6B@MLT4ЉM)))ट?hq?= [">PA>QU"@" 2x+YoĎ9qܣ.~ޒWn_õA߬;EvD@2Lk7?w Ǧ2O.TzdZy'G%ͦ`,h_{D3UD;CNWr?tg[p޿WB܂&6QkeܺEM` w @ڙ.4~fmo Yόe>󧖃5Q-d^ܬ֩Z½>ƱAkr iy<\6isVs 1g2jiJ3f E:F*uKf)Es[2N)q}@sRW #=lĥ6j*e )7I:Ċ&z%Zt{q9Sk^Y[B_Ϟ3)caD9{S| K٤,vmY>ps.8FڟVc2>p/Goş,ߧn<#ߖ}%QLxş ߕ]_ǿo'3;5Ras#7c.۫W/,@֭a ʪBWlyI{1N6$lUwp'hX -a[U?Iη4A`!/~iǕ`-= '>/]ΆJ 'GݳAyPLLyR mZSfy~N].Qt\i}/𖮲a L5"2o'滋WAM%+T++P叜 |>;~lc.1ωAQ_Tېψ޼w6^o`zzsTdn)5on:lT׫#\K`n䷗ozq?naDhe}v#K<;5luTQӨئ+K^r=V{[dH>xaUtp::+Z4~puދӪ*JLUPHUٞtEm;F7쏣㟕7m<8I1$}ySCd|"RS5:5r{t8++z|/K.x.- '}(iE$BhZTiNy6ert]vٷE_u4Œhq)E ¹>Xl_\V12ԛ  b_-@ kZUo򮣁Nk/ VѤwByJ[ʓ:AMZDI8Q߹V$8FD@'x*Np( N~t%(7!M/^3æ5z[YVjĊ|xjN6^ֽ~6uQ(6nR_Gg}8ׄJˏ.k*%%Ё/!xkDn8,$ͽnlO~/n7)3K: Oel{[.ڜg^ HeZG}YK4ZMw_&0=U(caΓ ϲU]sj-W_Z sdgpVۿ9蹷 ;,;'jv>թ// ٣p=B6PK6(۪4iˍ1V7a$I?&dP\kzmB-A=yU[5m{"H5M͑:r W/Q 䁬9ۃo->OqE"f` }h mֈmY&ipeʔ#$@~/pA@%.*fNry%>FY׳~C4A7ny/?Ϩ>K&;y,wi 3j?/#.=]g9>N!k 2熥( hPsiA1m9"%QxrDp0] &l/yI,*h4e4OEރם@Jen%Gt]{1Ѷ]=q@kb>tjkU寕5 0PeE}y&@6]߅9gtDb -\4GaݽƙfPCF] JyD55D@9 ,6ǶQaaMpV/z,˥}tMO!)ʾ<3gymLE3?3 `x-2$Z6`*ܜY)ujhsJ_r/Y" =ǻ׭LG~zR.>7jy/:/~3!ՅQ4!rh͑j@o1K0wF,(K~RJ-E.^*a"&SGw]&l`hkYNx%o5N4y͈wp:WoR6ۺsE 2W 0y}98F|B 'xVyQuu}/\6땶69eZdYQtϳ6fxJew)>f֤xQY铻b+H4ս|#G  r ,, M^,/xQ4W+M&AaHIE\2{iFy @>ϻ王?|3Yߙ PS2d: i+UE[PŶ5 *fR i)RQAJ3_ STSE<Ƥ mh ::[ed F(54b 4D1MRb@APABL r h4,@;@EJ)iIHE ABbU*!],D: 6l #[cP62jڶاV6i-`5&LBU ՘HEdV$gP "44r1V&ih;dPL[b`I˙m0N6V-NRK%DDPPL )QD@K0R.JLHkJL2ȓզb(E^B:9%(!$D9 P)Fb)i&"(Q:$ P.J+BPBGJPD)FrLq@:i EhIQSEshb*&(C"*yD7Fѡ6m_~?,cOMun) ~bdy(Tʥ.P CE9mx`|rU!KAVǫN,R?56מAd̄&^tV$!ߗ5x^=%y(c 0s0/%;-J!/G5*&OD9QaW"̙r"̜k0˺A$f<FPFjBK2D;Y\7V18}>7%;s:WV ~\"1 ^=Xo= Z!oZ,=d%R0DF^'1)f9\{&РZe~<8Q\ uϕ6~J^\GάZ('B!$-q s(&\&ҽ E˟zF-V ~N-kaVC&Ygf_+q/]lz~!̷G fj)kgM}|4@JCgl#6@}2!aGsv2dwt{K跨5f7n^->Wa/P9tz)Jbv.A_ {ynk7zǞtb%fx("bROE[XӣXN{ YoI(0fYqQNo,X\wAi,v;YS3˙e~^q,Skb5eU"]7,Ե<$;w,iуazN{y|[Ǚ4QeuI{{9}u5lm3 yڹ0Uh4z{V;IaDf=e 츮=\9׶2L{!.`RJ=OHԜ.NscfhTLd?6ԿZ8RL5)'J]bd;rhk6ؼG=kL?|i2.o43gVy*;~˖J\li~)\Eܧ>)dobNgVPa-8&. f3].qOt/\w|@S0L^R0æ3xe(Ö4=/v$'sn&Cri?˚y.8>~)LIAOg|C)(sGF,N 4j#=h#Nα}4|O`jS DԂNuɦCBkw%5/%{A%eE%m 4 E]~j2*8眖J03+??Nϵ"wwIcO9 q?תt| B~#\QE{IeϏƭf(.JT;*1O ڜI=tzȟUɧk:=طU,b^4tgc.3?ߜJ{s`2ňzlZ]&"J.%X~9+)޼Fst3&m]OLUK$-Ayʞ` xK?UDOƘx0Şػ9kߖV~TZ+BpbJ:֫pwBTug5O#_|+f\^o`IOv|m#x苳5{1gIJ(xU15-IL!><2;VH=Sea$-~xA/lP,݇]?JDdʹ$hx" ?ePGg'*` 1WA!Oi)>3kҕ50AEM5Zze~}9skcU"[^|a S Զ)㤌ִֺo-1,;|1䱕nC̅R:S=,κjjr6)Ȟte^7L7m{]+h-(7’fQevX88)hI _䫧ӝ%֋G @JW]*^-(JD)-da#H*|ɟLaHnjČ1$S >NۑK6pXU;wQ58_)g+1PW6לK˛L} yt}? @_TN/C|9;~B_=YV2u]C:q? )(S44&41mftߏ:\SKAEDj)=$=gw3T^J~>S?rMT>U?rD^6&*&ȅb]i*[WsQX0^n; xy#y]sz"ƻ[˝;J//f7mx\\޺DDNfTT57"aIWYXtzat3Uf^ T23F X_Xꕆ $֗U{-GW ˥ )95\>O;7#}K#^U'4S"6rcrjM[bȈT R];Q2EtDֳcU1A%QAjHF]!1GvmیXHMT7700lOVYYknBMQN٣Z5aM"ȷy1TY78&80DJ0aƭ1N\xVL+wsDqŒG\W]Wz:Wundv26z5aU)vMFZ3RUj;<:fӰ]B h&rYXIbQp\"h- s[DPovf v[5MAG%PxUE^cr520*\3%#Q*,7Ri+0`cFuf 1vuy]R7FpjlU9w"9t)= cM悶9b^H۝֠ؗcL¡S8 uVTP/0m͘s̀fe`Wgʖb*B7 !$]w|WQv^nfk"9WSƼX!KmfΝ39*H9 n9{s9WkNM9t,mEjksmBU)%@vQ&EIq`qr/9Z»g["%5JAkڼ؜&]*˖ҵ< u=(އ}NLM>uZSCF՝19Ms e0-V.5}BFy\pe.Zm;fzXs2t]x*_5"oNE1,EJy[q!lhx+ERF"(e*H4e6#k,8dBBQuua+% *p;/5e"!aSܻʑ9* ;GӮC3]gK.-/m%c95MJlKͯ>/OP`5f Pe_NRMt~ޫ[wo6 ~}W9ӏ^o˦۹[[~y8寗o>عCp'Ԥ\ژcVj*SX?+E揎L9wK锰=_^KB'{WO7j#[οkeNTwɏ޶?Ɯ8週LW&fO?EP!wd{[!Q2~6zYCmo&yy}egմus~e}y"%|M~ݭlƅ=圏bMB!Ws\zqSwCׯ[<78[c:It&xb3>q,e>s62f3YfpwoX_i7?v1e&Gs3)Pyk6%`[Bsy#+5dPnQc44Sfa«w5 {vqڒ:c!er ՑlHb2TQQ꣑N_k[KP5(Kʪ ‹b&nGeIճ{3jȉ[рPnquRw2 Gl 9+%>ǭBGuftW$Ȧ%d9H&5?A:#j)$P@0՟un H:A)X frQ+"( 0RP6FȤh>2K[BNAISV[t)|h9 Vꋞvek f,UJQKbU,P~ : _0 [Z35,AQY? H1I=7!HFKj7m($ɱlv3E>*Fq*_iT3X8FM1P!-y+tAh JNW_,(̹@,sQ׉;ofd*;HICϦnSdZ!6#!ȥIf w?g޺dDy^fe)8t*vrUA6iM$ X{;Uٸ1-7ZD^Q@ .&ld i7DFMifJQ(.<dTuמ}t3feFpsX tuufRZJG)¹zUF,g˧UJḯAy Fb7w-MT҅j x*кQ1i\<FSv&drob֩ÒERtawuEא[SzĬDDZf8g0A91uC YQ (9eEJ'q\LKjhwT[*sMS'cHMaBb+& U(1\ܸ˙gDFLM*b+*Qil\rf?^s {sK,RwxZɍQS{`×*,6f *vPUJG/ATf[5b ړSo5le.0x6beM tk͐nJwNnԱzƗVgjH:,2Q3(`۷{1Qj֫UaO@N%M%JO}6;>U 1u z^D=I1YbNŇ.P*Q$٘ngm[؜Iq/#zЄqo,@r5Y2heWgi6\(=yCvZy,i+At֏n!ɡO0@=V$I Bp3SQ%tЀ P[8Ɂe?Owda05шWk`T_sA"Poqˢe/{U3$"@~ݱo㕙M^?{Ϸ{XlWd'U:#@:@OE)3F^|rmچQ {»tLU'((Euɇi>UEug\r @S+oR礩]OFKJ#tȷ%Q%N6uɩH Cz[X{Ϟ)os@zq-fiFnBҬT(]UB@8%ުf$V I[om(7Z޽f,cuD}ߛH82S9@e k#d!IY~ivyt;p:Ps]f" JRەqo|p@,uJ@Bmo׆~΢K<=~^Ce9d3҇@ [(t)%D XqLՃ',͜LJh3_BƘJ׎9 WAvé0# e~ڊ=' M8g)'P7$?'uR$@ @45|;h÷M^Xڳe*@3v6_7Fy uہG8@`d^ P㔧M"@ʈ5{N(y\$T@ [~C:֬Pt,frb  *U 3͍[X*PiX><{ڍAXa*Hps{щBORPR%@1yA2Aq0SI" xoP"=U :b% ˖,qV˵zRA}Nw=w51cģ~6/ݛo1 #1 " ePBɀ'E&-s5,w(k(IJl9x21%mN}f?`p{4ebGyM>UOeU?SDu?bv-e f^?'"V}Ͱ9J;ȃ nj8[MØݛX>p-VEuvb'0ɺ] b%B)\T;c{ᠪ5 wq፿0|?hxX{[7]m bGG~N_҈`}$b=ZC^D؉9M+[2%VV"=ǞӨBE b g9jCdɣ1I[H#odԝٿY~h,BKeq,ˍZo.I@aP}1 ~/ELL\R7PP~R`)S  #Lt"@ G|ΔMy7I7G}\a;= ądu ZWgYsi'B퇗NY2m dVQ5j4m Qc;lE|ބ~SzleG>*P)ݐ/ךd8}4inQ-1yR=b@^BPC59 |sG}׫ ak`(H\ ?tk`PWcuڒ&ҜY;9l62ʣ?r$)9ȣz|B[!HNTj6ΜH99;!aGjl0DS y]L`>jM.)[rLO:kjwu.URS)BBU] ?f1'U@Ov|`mIiPzE:%;OD{g?O,m]v'^;;#321QR+Ώ.S>;_$@07 CÑAZ {9{~5;C~/ƒɹU*,<'˔rrvZDKyװ* oPj5O3lşYOz{kB:8SĬ~8ݻ8zC7|8ܘi;xSI[yG靳"sv/SEŠ,qMNNd-K)Kz ~+{;r=Tz=cSe}mzKO3]svEmsz0wd*FG;<֖wJ,ߟnimGɜYZ=zNdB%<6eAl) xaŭmnv . #@5\Qa.s˙ea[.8I)JΗ4,%,Fc1acapi9Jdz":lҜ*)j( *\̟Notx@A肖#D#7"sYQ }QK (tii4!(Bθ 5=`PTT1 tB$ bc*KNZ(e )C1 !Q10U\[:%"hj{:.D|@>_U;`7YB 66 ,@J)BФژ3"޾{ R 38*GOFʈ PA 4 WEqmNI:fϵmG*P콼=aߧ绡]RQ})QM IWj\-ryxV9˷a\0ױJҧU7?S}>.s!`T#C紋6|jl}Q irR+wUe.2o6&<+S?աk #sX Ȫc0I.L{m%EƶF ??EΙnvf-Iw7MF^RXn8p(doZ{;]'s*+]xX;g$f8m2~loVeJG˹Q<`5nצoP{D( ( R=eF1tj9w곖pF6g WiIe*g˫Yx(ShqZG<;lhPsCuTl>SILT?_K]/=tdMVvmr'åiB2۠^W t_"k/NUsq[[0?oxmM6lXIw;(+4kgbpEo!jkO ,ѢS4qǭRQq7.5|>sv+ȏRÕ0/&Ӵ=V\L> _ݰi#(U\BPi: 6 48"TR54*L-Y!?M6 na(@B!W/9R4sZtJ͌E䱝S%7-9_ Mj3T\[uPm]X?ο+?Y-ҝnڪ}Wo '8\[0SW,\HB=jo;Ttr1ݪUdHU=mS7HX+#eT?mXWv8/ԁ5U8 ܶ{g:V𛶊m8>" dUxj"'6(>}<<, .m.c&i}yRn$횇;k'RK7Y*6\P+=HPJEsYWUrj6yUy.. bT=5'61&0zյ+Iv7Nezޟχ+zl]<5>Sٌdh52钑+_H,noݨ \ 2d ?sg[k`I3b$%|qК:|aUsG[^GP)m毚 TҸ8^^: ^&/Ùl~R՚.TrXEys29*uJC7J&@I';f!WI,>4jޒcbrEJsB!}+5(Mjg78IVƮ2?ƲE3( \sRgfs@/EmĩZy٭>4cnҀaG[~l%"Sn$Rlf3YPA9S"xb'寻Hѧd1lHx#9$Z  Bd(18ձ0}ֽ=Ymw38m!-x漤(@ 0lJ`gy'0;wdym#^9wz}ѵf<`o: @n }|69קl64e[?S7\ v$ JJ dJ {NuTxHCq˅8 eq2H:R]AG{G5E-5iH‰W5oR)@NyEC8yOSvS>MrtBMWns: ˞ee\3*ŮEqbBy,8h d|墈5\1>-pioI GIMXM{OT8*D{ z- b{R&QIA_ GuVww 34_MLsDkMzzb4ũ(|OA!onLX)ks;;R6ϦMoTVaI@E2$(vS6zgj%E`dWʐT1xҹTr>Oqӛe[[sVmvIQVFJxTfY54sz}:]~~{ Eb)j#-cGQ֘`Vz0$dcN(pU~w'iNK"D_}9J[.yb>յD^\c.aE7J`li#$YqDR/8?rU$1 ؇6%{a(2|\+[Q_ϨEG>c&DsA") ALe18(Rt^;ngNN>7U}?4wW*~sm|闏U._?O%}ѷdNVuz}_M6.Scx vzӶDޞHoC!:.sdZ} *D>&dD'=9U2!ܤUQJ/P &C6hdv `So} M= *|m bETڼcSv-Y.%B6BOAiwsRӽ,#,K6pN٬ m)RRanLZnj <!MzeKXS*%0fIpJ4w i*VT٪d9fy}"/4t44y,dMίk KYbBaEθӭsS1drP(,FZ.ʰn~wf)!0V )1jBN>r@u}dj_P6(@+* ;t1л_Fsegk}gA8i.܄߇tƟW N\ɍm;afܕ.F"/]^or[>lF6`O5ݭ;¸=jp+.JŪ2&jlbJ)g4 uPǾ*%4b}#F$2YLgN(qy #@VPSRx204ڊ0'xuQMim+떔Qmw.Ǝ|uuvIQ6Ȳt#b$%0 . ~!EK-.˴#}ZY:ž3֐ ` \yV~?tɅGw./Qx6.׾ZO7K;:m1.Wɗg;si=ojam6 Hd[V S& L>NC’r ]WIM^tdӓhhl;yIq\_m4-ojӸӤ2E jc[MGakMF&A {(¢fɱqY]TIB6gaO۷B|3HB#Q:pW^}Zk9(lAR}~|d1DUj:Ir镗ۧ@ՑAFOE4`«Gq'k' cgKy$ vs1rAYȜMKʰ8j3 IUF*P9>moʗ̇ԩs3DU3ӑ>LZ;C54wt92B% @ : Dy}\t6Zl.F l(V`AE>HsxzmAVɿxoe@$EwsSr*$@c`Rs湣g݋j=]U uG==9r_ sƵiՒz2c8~DQ 2#6yGۧ -^ȧHxiν^)X:z`EL!nM9#b RBw[6b1ƽ/mF.Gr ?7Gh׈|yګ!WϺNF[Wps(ܫ]|3L8ggڂSH hZbּw:{O&kyhJnw(j;O Z t͠Ud2ӕZGN4.֯~r-7"zGl-ƱZq&̴>61]LkZ.xr |eͭ']8t_ _z4yqǜDU{_c0m-ZC0]*aI FgK9[ ׇ63hQTUo%|<?m2XYӤVYӉVJ8%~@0rY sĈU*nq\k xD!Il $q?^4=^b"E[GOyH`pn^dft-$Y鉫 5.Y:\w-W{Ok%K{g" ;)Ă&h_!\Q'T f%^l~6qM;zu@ F>o4ZZw>muŝQ`jtTB(c2ZO6ƣksӒ؍iwpWbr2j @ $'1Lhq+}/I@Qkkanŵ6^Crѻ,CG^e]`ⓨO}eB @O(v:OCӖ2UDe۾LL ee~1q.(JH(R?^IJL^= cq"(Q9rJ h٣EgXF}1x-Xnrλ҉oȳO 9Au5oR`4˕%R=avg}MXۮ#glii>Ӄ+iH['gS[@yj͚[n/l/G:>CibH,e})ne$rnϓSSp3vݦ6~M).GQXֲ$XZ2du/׳t $t)DkQ{w߷\᧻If\Dq <<9ЂK1}g O&אn7\ztw Sy_{>ff*)VqӡT\qO#O|qtM5|Fs C DzߞT^)w2=lNGql 8A Eo^b6CJ: (2ez dnd`\*MB{vŠU׋ Jqu5T_/bAT(( {sm*` Hm/s{j8Yٜuvn](*6fv!Y%<@Q|ڐs]5\oVdYY(_Ox1kݮױ]C6BP]KX.Pl.H(Rȿ5_8猜=s}o.-)< QK ^\|zg\ ]SJ(eeJw6 %W9*Jmtz@r?0⹍ihy:]kڒg[}6=C]ni!?ċ>Oע⠿J\i5x|'@pXxYQ݁O9_\ڳdN|cX𴧭*;o+˖BjW[-i(V"w>tG74~E}iQ~L-tIóGԵ&d4IHf 9 sq;_J$x/CuySVw\i|kVP6 aE9+ŒڒUɚgۍvk _mŭL╜?r^>4ӫycF7\%"HҚΰU!2TD (H UQy6.#툛tŽɯtIkZ~|Yqbeiϔ4R@~-) pV)ʴ^иNqcۘ- +[/mFD_s9ǵ]}PY:~s˖qS8ԏnedO3|)n˻?^_5fK0&A-G njV)9Fr4vg];Uke沈%&ЋB™)fqu㬞8+tkxkR睽:cuP6otxR\o͛gpǝTQ7K{Z4jǟ2:O!K}SS_\gQt?hs{LV9ap#ړx1皌rZFRGȾr6l5em);rn1{]qcsoSЖ}TY/tqgi36Y%)bE2 !Uv2*G3fyw.cJAA u,Zmy 5r!3Gj\+@b)ȱѸ/}_XU& .>E?Ub?8cO0jGÛbZ]Oɉ31xO*YHY+tkX Lx#\_{ޱѬ\eJDD+D]/ lUQx5puy+ԩ.!0TIۦw׷ zmT^eaPz7sMkeMD%!!%\@2Ua3-gO'H ZȖMW|%NC` L },k-Up{W)F6|Jc<Σ}e|QC yXNDFlޝ/ǧCE3 IR28\>ZqYN>,˥Uex|$eU nj9X𽶖QQ%iA5XIN(㖵rn$IBВ;T""(H ߎ1]%:> UEsU-biNYn$<0陟/cUph)`tATz>Y}"  n9d׫~;˭=kqVeNVzҏM56 nh ;HEIe7 o{dJbӿ𹉾MֿWtBYWv19yagvU(YmR a"D{|*E9{:Ma#"` @uIokյfI2+F4MwV_Mm9ms;=g'ʡ4~4O&;m4` 'r_uP`~lfm` $r|桌^ͯDD$#w" TDufkcH6X~k$^/ۗw\K۫1j̽?IJ rHB5a(K+to"< &dT[fqFR}jP H..lc~_AR@3 m$[QZ)"ɗ;ΜIVEiԸ@ J ّxnIw"<~+1)rQMeurm`|o ?-]Ztۧ³v9;:EH0̎uSި{k:@Zuܔb-G-,+Y -;K1!)*&TG3'_^իtT6> fkQ k`pݦliOk(hlC4{n'ӝȖz؋rTzfCbR#Ujhk(+rWTԔul4 J%;Q$[>b@%JK\]D}MouxvٿUIgZ YH>_5X "+}{?ӆܼv6G AڹҮ[RV eg7V}rU,;ܲ㛆 L!_\Si8ȿ>D!JP@z㍣\B`Jo ._!PY{}l6"G[Bh6in->@A"@հWu8p EdRٽZ%)k'(xwwFlJ=L:$^  rS.>{o7Bm 'kUR޹Ѿ s^:vJ !d#)"BRi 4zHNf' %(aFe>冕eH:韆qb|hUzޜrZ櫵U`nE=Op*ZNZG&Xe"H}PIVeH}GȃׯU̹xwz8oQd&x̼j  Tq5R@ɟwaS/sE-fKU,A7#>1΁A#|yU$g:M 9h m$:sXi*B΁{˭'LʽUO:JmcV4J!(O?@$&OhrpC$"~ $K"[F|皅ٕʹ6և>SV':Mv۫ d=؈l-\c끓Bvͺѫ0P˸~ Fܢ~Ӑ.P2 i+WWĤaVSdaBӪd5dSQ$nD/YAݢ ˬ yj`%54~Ӝ)ݞh^Lhn3!B8Bhucd?=CM\Occߥv!'Hnˆ_ʂC ᶴ\K)VPazS9UW<1 JDe*HoMvI4ănXN{<;}SԴ`0sӤAaLԈX0whWYhi\kH.s %o"ftˉF^yu{{d)Jdz9r\co>2_ÊoXKNnQeyJpⲗ$DN UL@ DҡJ)thQր "1Ll¦@(TBPz!A3:"*"!w:rҠe@h ru*B_{en8QR7eAذTfW.@ω̳ͣp[WZftW4 *rBfOKMֿEОJ9ЅjLU; (B1uT loX3)1M ()"&K'JHTҁIέ]04U j "Q5:Qz}>8˧!KxW3@~ѮMux8b2zq tU v_e\ ,SpV ^)mvQɾQKy|m< KOz7tI,LXC3$Hjd% vbW"מL>kL"vejlwfb>M'IfvӔK1aǯj8nǟ@~4(o2rt7䠟H1MsdC2eGܵO_.vkZt=cRcrwWxǧ@ۺ6f wA8Nv}= rACݳe#>h0huL]fM"E90!ZE$ \|%5EμYggmxtըI7^y]"\(HFX8Dƫl 6R$ј+;9 C@XQNu*7*oBDg:ѿfA H `:([ yNPتVU}b9Ow/?6N\<)6۔!<-!vc .R 3} uQ{%؆U\q˂K#/7*"2:<,QVymWضsK8\bKκ˕+WB ZJFz($OJnXv:t4Z8ZM)3$MHIKbG&9ef( H (fB IC0ĕ$hf )fI )" )hbd")*h%h&Ii& !*}}0 gz q3zt*[w9ShoŶ5۔K/_Ӣ^ H#1sSrmLWc/yGhD qqOفbRD wL'/#ցjBi̤G)Uf i _UD a"=ZSz@~~2im_*狯~݄J#M0L HfRRFwR => 1_}>"Ki}]|Y4`p:9\ }l xo?Odn .ثۓʰF٭ꡥhzJZie TYJЪ7i @%9P9Mdc-PFO*X孙Bz /2-+<뗡/:)?}*橛-YimNgfydDB!( HH$Gן ϧMkۏ㣮4-7`1rqoMKC皻{}g9m7N+F6j0mI 1@Q,Q, JX=BsJ#fY%Ʀ (]=ĉ¶a^b1ɀ:#K2u+>dzO{/?퉻{vfMBϫ58 ]95)VcH z-G%|ڰrY1]uQ;r% W d$4Ww//#!Qtb 0?$GE!N뵜n|m/2duۓKZci {diCeғͺ߻\P,tO {JI]wR&M=fsft /Ŵ4bUHYxVSU ZI*(}6qܛZ ^?CIJyke ~}P.;M~??pʟ*9C>;G!!(atʔK< !Ԁ˗MFSۢjf|(G藍1:P|dI-UE"}rs%#嚩s,58oݝ{_v >ZTڄzt,\v|v`^)'oȿGT,HE, }[z\ƅ57YˎOy˗긩ذzfO '1{[`݂Z8zqSf} zNBJiNz?(TSʏ[+6RBzQ)F70kg 1 ȩ"8@B%\}PA5<%P*뙳ƜUTjYbmYAW`T"KJ SdШxLKm _0빾QWVTm0 GE >ɹhF=҄d e27 =n¥\gn\ZI# oYݛ,ؚ'9PR w̎MQM^z+/k9YClsvu|ZcU-WQF\<_?G&fcUO/|]^-Rߒ 7?]β2BzVsBYehs/ɤ2KL*s?=}|fVzjz},;FTjφ,tf5ǾP,[.[^V VdɝZxs7]׿i_r,TaZլ$mQN'/\^svoɿC?jZV*$63zai[ hVVнm(e8Z"dv-% ;mZLk;ڬ碴iHӆDTOsow=w&ov ;}/[S R1>x ~B;Ok8=vj2.Xjk7k3Ll&Jqj|TO4ƮqU#c'hS B1x(ozNG%mhhΣUb6tP{9W &GW9IcZiM{1&DŽ38b o5S%4%^7}o#:vrP̣g(iZr e{%wbD1GMi̹,ʯ'gP;jw!k+N]7c/*F5; lH o h{L5WȊ1*Ą+]ً94"XfoO;3e/O|;OGh>{4?ߋ#3v\0rѝ޷ڃzZI~2>uy{ŢUե_ǯ-$f} rGGCb"UlZ?)4BD` Rf<߸Q5xq +z;LLR>w啍q}pFQ?~'rgzyVKSﰮv,Ӯ<إBDb1LE=IWy=Uߣ HZwMþ3ѬNl0V}V;^9vߍM`sƸ琎Yiˌ/ V[.B} ʕn|uOU v^nIUbGFnÊr0Q=X;HdyɖMC_&~ks2XuP u$@Ucuq^e6~yJ1hDEjbK&t{JzZGY+pBWZK{ӕ3y); I2gsMoXP'-y,G7 !D_3^u׹'KKJ_0# 5U}Hŵ>cy}^x^+}ٌ i_8/JjW Z{H[d<ؿZF\APA# "RM,{qS=DTB~rs_7$CgT*P 8}9IXEGH!H,i"&\AWL|K; $Fd1̎ͳ)(4uC9v 7Q *o|<5^Jϱ/yvdFNo",FUee9|.՘XNPT. '+BK"Vcfwimf2\kz][,[d cj dNʚfUS29J gU]cN @ҪN32|$0Q_=L>tFk?H岣R_Nȉ1R ^]FF$umhTFLL |툿 ( 5P*B\we]4m-N*]d5$L9#qzhۤǑ "t.hf3TbEHZQ髩Uu;{8PݛI.ғN :Ωf&\ rmAz;B,QMF_,}_d y(PPGKrR$B]sM[ fS Kg_Ǭc$ bA(7)P!( \:Z =eȝ~Sڄ[Ѥd <:}:ɿdϦbV[PN԰_MjKJZ7pMsr[0$R:'I^+X='' deuxy"1`C: w洓]A).ެE^yY$g9NE˘_֎ڣb F #@d{v^Hrx-ypR=>B[, DY\@\E^`EB?dSKLN,W+g(L{(/zys\وV Kpz`fbIʂ)#.]'OGND:?5m=CAdPmSmmv?H5Rt2 DY=->HzIR{Sdw)sȹOY\΍ܷ@A?_? <З(-m{Au(zȜܦ\G"Q*(D?^x{*t{ Ơ*ɾ pdx SPVTk q/F Cפszs8ĵ<1zd23ݨkݯ.t+ė>g9[&a(U230U׾6.蔽c'H.v^ʫ<[?᥌qnS%\\*+w.?4Pkh)0g֖&6v#;y{/7uӾ[G acε?g'Hέ.Va1luy5:ouZ5]|=k&G̬<7t֬\\Ubc[j/-@ǔRn=2cܢZݦ ALczxo ŠVDZUiFa]~nk4|G;E8iNܣC}19JR}x;dף-ϓnsy 箎)OK= ̪x5xOeA<WTKLkL[7C)6d9;vh).g9+!uNv+lm/I2>b}1gp̔W'lD1~**(^T,Bf8IV(8/O)i-D'H!⾤TʚQ?a@ wl=k.2;M {ڂ ! DjR Cӟ!*JA%   B*dGv|DxX>'gYz?jc9w풱@V˒'RCŐvzvh^i#/Ycrz{mm|lCA|/OWS|OgCseYI(ߺE[~>%#7vqBO`{\esSFn;^/@~O |_ ;~!¿I_aos\*ZokpZߖ>Ņc–2ە>esK-O?oߺ9૿u_qO/.ZS{&1X:ʼO'7OOvAZe|5?VjՔy9zʒogyKJS'|m讵1翻zbgo[_}>PD'1i?M8j_w~Ftk'AwT7 *"M ԃ~:NB:hD?lC7' Cqj!"J O4-C@~|oӊtQ0H$? ?Ȕ8&w<FNdL 3?񇍼QAܣl٬k6Rhݷ x#|iߦ:QԿϰ[˶7~~[e1cBTO zz0L~pW~ @I)G^ΰkM۸IIg3<)NȽWv N=nQdg1l0(ByqT JOGj74ǀ駥Dshhj mN%Hn0!h^2C֍j^)e=`zx@sGP/eз3FO՜폯oĪߜwxt'?/> ݽuN{nTis?->j~Gj}:>>]}2rŬ&3y?Nԗsi܍yJj?zZq1Jr}:IqgjErQCg 坌Y˷wNB\p=^g.>U>(^_M~UL?&=ZgFq&x׺G_oyϳw\szi2zx^yW?âNzvjnO_yngÞ;/wO i+Ϻ;/CY'U?y}Q6}sx{c}g>c }[x77gv᭹ NwxF~S秉ϗO~ZVrzGwq?n~|yt+^OO۷ww[ziG?~ϚȞ%ϏzWŬ8ǩI`ٺ[,5%GG/߻jۖY0Oo]\Zk2;/&}+"DZWfde;돥m5/">z)31$\)yJP T fPQ/8O{@ފt쩣' ?*֫9~k ?҅~z4\oUe䉾d<Ⳳ2`W%Zė~M_ќ(]_ׯ#~Ӯ'!uUA'WȾ_osT;yl:;ON R?5QZ{UO~W25gl]A("$:}z霗h5иXUR$) b/Gv'}q?K߿si1$RzT< ~95LC1#^8+ RȈ:*d@J6n7}FvvM j(ź`yJ? @g, eDE " @=cGm4{u|SF<ޠDA)c8sn 0Y\J2 R~@|evЀ3 ?->ǻ|< (6@3(@ ջϻ@NM(t!ЛO<-X@ ԿqmEUEZK߫A'IUoJ6~߷U77lRbo9U27%ȫbH/n}8߇/Ñ1郧TAT t޺<鞝YLumǁP!I5A+Gs!HQ% YIC <,EMu3O^$WN^txg^ '~&k)|vy Ǣ/e6=N`&@((z!?,7>>v 4]yO!UQahTH\t!C֥<y]s_~@gEQ*QM$DՌ>DHzAxx"@[ziN ykvǶn8_w~hƫH.d1҂r=Hxa<|> % R#GU~/n3k팯|~RU%Q$N}2 s?Pdv9ٜ sQw'`x{HҘL׊Obir(E$AEr#$-z'8μ S&!9Jq=KL3li68W=yReoSqD0|!mds$R"kwwæ9>WSצnY/l>uoO$Aoa\S|i5:.NG $ӝ}qj)PSC,@E]́ ;p=EO!Sk(*~paUAQTW+opSj:p;rr=J5sb#QoG:;xjԞR6\?ŧ$;O ¾><Jtߏ $~ _ST$XDSNoYK_5!Y7@e0盤~j,$$lQq ab}&(pwg=ZPM#, /Cߓ OjQ. -!959{vڞ m2+뷐 X8IR$iHzTtld|Ⰼګ_OX_Rup74&3jk1 IE28g|ௗH_vq1흥31"#g@=6QG9"T");]QCg_C?L(Wlsnt&y޸IW>uj7K}q zfc8X !- &D1+.ͳq- 0(TX0ȑ ކ;fa ^=I7_9"F`4ݏçIq=Ep2+5roG *R֠;"/0GT * an0X$FBiH"K] ֠:5D-b&Q8 5Ew*(DiNta(܆a{rla|og=5 >[G4R/>ZlwkRW=;v-lY%PƧ|?۷sdQ]v"!)<M6}"k{l~'xp>G?t%I>aZnt#RVE(AOf 7ݛ^+@Ssydї5I9<wI=ɢhWOpx< }[S=2?g}BS:"V jSwK%#?))'0[`ɳct@ &ðq?=(d:&}ʍNj jy}^|j&>>!{W^ϻ}r@rm Y:Bgp 8(OꫥMmQ̠dLLc"' bZন{yr _NhqYBXPddReO+3" kl5uu<1?{Ds$vۦ\~5 >{?^L>h~ X/62T_WW=zP>{X %t`$}%C`o @ t"-ǕF46CV: oѣ>sst'[8%IH ?h(ى0GD V^1vI{F.ozC|6*ib~L|sF ͠=F[kQ׭&dͭ~|ia" a%Mxp+}?ןkCg 12&!cum/^L{4ڂL KYV.yf4_,Vy0}&5%pkKIt}>c5:H|͚0%e?@_B>c{ǼuMBڞ?ox݋ڒ/uiY[`}eI,rT_JDZc({Ke*<{ژ#\+UCֹCa*R1*߲>}>b9;{6)Q("BA&~RICkU? G_T0@ ~(Aqm3oZS|۵|[ qbki\~aN`1,,YamwZp@9Jk3vn<ϯȧ[kܧ@RJs:Ah_}l9hLDDAl}+t>b`_b{,)A1[ġ?=nM!zA|80L,ťDPRDW{ \f9"ġ$ruR*QdꨧO0|SK^1xǽYŊ*A)3rfNߥc:rT91F5©VKtxeBS:+%_Wv𺾱a{[-'xhT2T.[MDP) WYQ"?t >%oMK:5$佀|6IʋH8+>o1;7fG93 Ml~ٝybi ?zI2 Y|2E:$Ѷ *F5qd͋ qJ H?Q1qq GeJ_=0ݫx]|Mv3}y]K牤%__&*A eO@dH+C!Hdm=Aq+]7uLX2@芋.i`?UV3@ɈB2D\!gc`IQUFPŽ!yJ0%p#R#0 %d4()ZUA3۔RD4l$':p .GCPF{rdh(#lA~Iֻ3k;R(z=xc"DĔsU u<&܆j l&~HU2,;nPRvkLmuaK"x ҒkJCqheKZ=zP~160C/{ϫRfLyc_fU,$ ~&_V=wqN>Li?T2Ww #[R$w GhW~r^wl/pyD!mrfΐ @;Rd+,|.TY+eû"HG99Ewz_z,PSfV5GN͸tj 'ee>_jQZ_و=쨌U>(ޟy}d'Uqϳ#'ms|_V|wOqe"g닷"R{C,`ΥS裗Y0|DPuDtL><܃Y[j:*}ˑs)smt҂̪/PZ),o6`7,ɠu'{ 3\y;te#\+Z;#jͺLi~qzh8'b}ݳܹ&[ t1GC&Kb@ٚJ,nȆ&yu P:#]A;L="(A(?ҬGԯq e>,)BڎDAiLH"xA{{׀=zf7q}ܨxBl- B}umy헾ױՁfa" O5 V`$^ny=;^Pu>P԰BHurx%42 (Er|2q oeqg"] G" @A ͵HJD1`"$ b!*NC5kUWqjR,uѼ^,dI:2à$bL܍&czdk GT7P$GOLL^G/Rж$ö܈9LQ|P,pTFNYUJ"K)9%<*Qӊ8ɥ\P2UbP W=_r&UTKR]&@ |0ZD!z%{6]7ϐm7 @qlMֿg/es%p<ɲ82e߿YJx= ?ٚy|N kD#hn|9™ga9ia~?}*W9"iB@>"24(J1@) " G?_̛ |UZȨG2&'%bǼN_>=ۿl}qU} ޫwRu#Q59]~fSf"_[Jž*?ӑp=?eoo"'@CrzO3ҽŸh~T9jOw;K 2%1RN'c/R\8]0x➈tP|S?⇃.U9!Kw'c]H`m :Ny2rHe =yk3.߅uFBr_H=jl~m֔DN[~)`ѯ%]@Qc-&&aB)*!-r㉨bu6PG1pP:)ۯRWN]χLQ7)94)]1u:b'P3|}]=8\H=z%*XS^ivMQܐ? AWi7z8 HcJA x qg9h]6|ϒs/w!=ۋ9NBvz}'/)]yXQִ]8l>v{`,K-yo|xWcA8I` 5ZZ1V# p hN'CDs<] )J9: }y7@EFb`.ߴB Op <_HPbng=/H~|ymnpThTa1)-w< u{nտN[f  H".Q臙xaph<}; E 44R;҇~e>CX-J<^|{K:g[3uzTp:Hzvvv{Ȉv#[ӰL=dpt /TØ;]w^ &Њ DDON-'kz`Ҵ@~8emh)z9:/G@ʂ'tӰ x&WԖ`)ێvDAB@$ PRG={Cr Ӯʄ #  H ,)rd)Nm'zJ+a".ܺAңQ\3ŎKc) H⒦2"de,Yd,#l1ȤXe$̐1*ZQF YipB0QqHd V( EbTZJK9fA$6ED [ׇV7i_sI9e<%˻.uٿsߏq-`& FiSf5VDU1HF؋mK5k$j1L`0'1IZC RRkll*b ѵkFZ6sUcE1hNƶfŭ1lZ E5hTFgjTQ#f4 FHG#ΟxJ#U2_8oykgOR|G?-PJn C)wbWcMR WGúiin.3۬ wBNܛ^^-;Cl튮usvs:{Gfwv&zGt#WgtzY nsobHģx#.Iznҩw2oIw;z[]36ae(ގWt7qYغ|ĀAPBE("Zmm[Ub"ֵTmV hZ-0U+X؍(hME8"A6lhʼnlh6+XjъZVαldֱ60A!UU*S*w{۹Z qP]ЎND)Ffuά =E}Hs'?x bAI0inB8 *J]NϺ-=x yg?J c hbh))*F("(&((`(H"&hJ$``tP@Ӫ"ClADEQBTH ]2M)B %4 (U)D hZVaB UB D388!.}DagǏQh" Zh* "R)NXF.aݘp} L /Wng{s,PMP3['68( )Ǿ3E-ut3^9Oli2@\,RĆ?O{iZ6UZMDLXΉ(5#N @c:LӬAQ6ƣghƳhFgFS[6,KIDm,b 5Z*("&54UQ6ѲhmhZ36mcQQ;PXm"'wpO[1@o*;;2s2kV$5ƞ3Qnj=K&˻IAc5F6o!՛wSN&:Bnk7To WKVopoM޻zǡZu2z;2KY{ه[g$ŐZΚ:7eӴzYe:MK]nJIavsė^X-Sf!ZX]tt2t{dŒ;dkV;wUv~/*3 H$-m@Vh-X(#f(4Ŷqc6jU2D[4Ō魍4Zf٘j-cbuTΌ"ѱFgkN&6"jhmLl6kk`fhhŵ0SlZkkу_F3| -j_a v~JX JYN3."y H}e:⁺ &~pt@)SYֈ}?,S*5֓"شH=Ҕy@`PT Y;Dß_zwz=LtѐU:ΠZ()*lŬb34c(#gQ51l[Nh4Ӥ ( JUkU1RQSZh"j3TDCQ-FJ4fJ&H(" mDQQ I( GG[&m]:md=gPƄ z*K|f v=l޶=fNvǤfD;S^ٰd9!g7{ۻwz%קIqx/]W驵fSxG{$QlY{llani6v^/asnݜm:vwHtٛSMl/Xwom6vKNͤNGWJtrjw{N9Ө&%g]z`o J Dc\!U*6)Z1lkgVU'1lEljgfأ+DAIDQh)Zhӣ6`kQgkTmiS mM6`ՒRӭjh*`lG9I,gqfX혇NY߷,[|WAy#^ψt翗yߠ")DZݏ o-7T<ǎ)N;H@%4P(PJ4 PHD"6vWT&LZf#mKmRoY-=R(vV훽'rzeN&.wnnNe.ٶɭ^u6Z]#8e;G=e)ekۻ^ZQSfs޴6R{//StRN]dۍ'Gxۻu{Nl7:2n]4ԯ1$<$$j #hƂ*hFh"ƬDhl1:FضbE-ڢhkV5֨VִmQljj61cZٌZZqkmbkƃlb,樋lmm S[eDFACZjض :J|KOEŗ05%}<44Ɖ$-H&jk8Pz١#eF sDVuɾeйM0"p̥b~(P/,7^7⼫lVCnt}N+X"""VRs瞛$I"J߷w/k=Ape$0'i7wtͦvNwHvt({^wz׶,MS{KzPnĕ@ĶSsn{f2!ut7zܺKv;:0Ûo7I ʧvuZMvixٲiv- !ݦ<]wve~;븶dYm-mh4jvؘͭӣFڶثf֠VѤћckLjDI HDX0B0HŌh qF lͭ6Q[`3ZI gb[PQHZl  e[IBfΣ?D֋.R]Ls{}1.>;=dDBZ)@hA ޾[yغ~<~ab 2%^K$[5֋Sk.nwxS"))B) J=r^8T}Uw9, Bs~ y'ײh7vG+@W#=۞ ®gH.yk%U’J7o u 8)3q &_+JNIAq>;h3'7 IRI ST~=DfsfNBjD V8Xx (C5Jtoiz<uV)[,B"TD@ -(ܰ6&gLӄ2$#a)|v2LcΔ'ה' ZH4zke@p~v ѐ:(2 <%~Jr}Xg!C2dns5-g?Di88!QlP y#,6$W:\?][b򿇈|: 7`Hbj:Em YIPQU'& 㑕 HKuFnʍoUXAG[ri jYt3fm|̨{", "surHJ*uw|.ln wL}DRsoA˗e$P2R ن|"u5(>}M=:kkN|s^eDKZY2`P3"r& J@.X pQ9,u1y؜cR|Ǘ\FP3T2 8Wr; fYȇ@uzHy M6r̮߯~>H0ߛ 7y*8"9Xi2$S6\rWF}4pwٜ(FjbQ)Lb XRpS:Ԁ6Tky UL'u zS0΄G͏^O;[ds1Ä(k`xm׆i3K@|N}sDq߯[ϑLɲBwʁ9DQÃ܇dpiZΏ~\yq] G@Gy4 " #.~2y'%iI^!4PbVv~ ~p3=9v@7\íAQ!!®Pq29-g#26M E"(钇^O=}Q˷ٿ]0G^\Nu$BɘQUsd@zc;0{"EnZ얒"$\u_ J}ozTpZp(.9C𿱬K@3DQr_:*>ϧzj,@ @hQy 7**t"D1{YhpJ(OE6ČUB 3ۿ}&x{SQ=LB[a`E@\`鳎G}jqe{UEA%* ~}w?*,{^FRD~\-Jvgt}:6!Oњ˟wɎ]N-~/k( [wmvy dt6qSTPy{$j~gEj`!D߽H5J`RralDH iYbt"voG\%ьKBܤ35E hq3"` VkcFVU"1w*L^xiB9Qn,Qq b8N$%bS˜ooa%ƈ6 验 L FDk!e\Lb oe^0蹛/Me!,w2NaӗEn3&pЄux2qŊyAÏ*h]3sJlhUYH٧b9O1M[$ tdZ13NFhyXBͷsNE ɸY$챊 qVllӹw\Ř*Q7[hєw0ԱU6QTukBnm{q%3wA%qzD"jwg?FatAa'wsX=) M1S%(nl݄rT,zX8 8rԏ %U] VeKx#-hcܙwrKjsP¢RHS¤ZMd"n؈yb."I zdin+4lbo)w{GN\8B&1Tf..vjAYʜWkFSRnZ؝IE#k1F; PUI܇6[iLҖwpHN5mܜ\I)`((6!&BFS2lܺfA,+y*^囉قV`3&ؑ 2FUڻ0*bܚsV)Yi96Lr a""e\J U-sPғi˙MMKGTʑ9:܊7yr2ɨ."ȅ4حjn Xݚpd2N Djrl=7tc4͙ZbpvbV4F ImS55/4m6I%+n UوB%Ju1mfNӚ4Wi`ŚwJu ɚ1s2Sjj\lͽ<7y XU*lUMW3sֈubUNĎ N GG`9hRdb=q(q*[\$jU 3O' K8ˍrc,g9.4&K%jL# D;o'|moتt^yDL% 3*>L?5O;п9wR$Ȋr(pwA?ıOwy8 P DDwo y|La*ù4&FߟXj{߭>a¦r;dz{:(R@H "DAk@PI#'wm󲢛dR;2>F^>^8$@bplWo*0|ĄE{=VG?A7EAJW^?" R#C#?.pf mCb]3.e k"N_Hm!]f7A1LDG?֐ ~QÑ?1?L5q_>}Aۣ33a @fGhYGj~*3 @R 6'b Q-?__'9JI瑆a@~c|eJyJ/Pzg c[/P2c~22S{ᷨ= H]{?s3JtTwٱOh!А~|SO&x?7<,Ǵ`~߮({#˸"ǣ QD[X~$z+-m1a>Q4! )r?W/ȏ 8awCkO~/~꾞~6t? e?Sj_5} f=_ aQ=&}0NAZ͸ b+tB~FDA fGL#t wFPHfT|: @B蒏L/?`!쓌‚:rt~G*o?>pBDD7{:7ǁG(V]@M]7oQozpHq#'3Ö\d׉U'-ӎ|tlJ~;!əc3YRI]~_A`9Q?U9!3(a ]<9gVՙW5XV?c)erbpÚI:2|x` Q(1p4>P5Da=5qHIJjpLS>}zHn$;۞;O00Rz{ Gm߳V9?ÃW\rK+!~chW_n\ی 0`suLjxzl1>I`A U5e!XQ2K'K)T ZC~䉉2Zjs=aUDilWH '3~ ^~TvfFoPTA@?|q)`5'ݷS̃S $F.¬6m0JBb))*(DH}H~)@t/mp}wqC :Θ*AOQ >єdDF@>i <+m `8;_0(2mHKxY$hرAdXRhIuRw5{1ۖC~уBz]A@>R :7A ا=AOj~ke!s>]"r(@ԛc!ι_YeU@ԣчw$~Y!?yE>5ӹF'$.qN2d/6^Oq=Lrlb_!_ڗpO~{Gx0:v9ǫr91)|1.,?Oz>T=OTD?BDCXqS'|pN:!!#;t>ݼmRazq8ԟA 6}i:gVOBis ߍھ[nL;KΧзY\?TsN?rg?$!-J@2LTBO >1LjS#XJ\vP=_ā{D>j9dm?xX/ӕO F_6?~bPY'5_%v(}9;/}@舃k^8N_Z %{gPw:58F}yy~ >߿ix7DO??FN>QGO=gFwy+ݒ}Q:D^A4I. DGU3& )R! @f YQYȫ \IJpr$ `R+@8GdH+ `3 We@.E3lPq#j.<:>ZN~#:*~pLD~y m:Tl9å9<թ gLX# Q jL${s8m7  VjĜ?z`(2<ߐ5Ki^{ AXq%ĦNEsڱˬDu1-fSFId16VATY6ﮔw'OsxJRSaMS iҲ6aagH!0r,o>W kG(Ϟ_P\;tGmM87 hQJf' {βA# ĻyJBpO1n)|6|D4Uvv!u䑸0N&ἆJqdQI.Q. 9aZ3LӮiea.`U{z9t9m۝(M8Tkf.3Nud.,@@ }$7- 0I ta )ʵ(|d3hR02Ӣ@J2Nɔ:iT(LbD9kDJ4rXV+ l+"0 &aJOyt;N{(eV4=ޡw:4 Rr~#Z?kBHt Y aV+ @"waWA&B:.I;Nv)`*eԃ{=*rRNj r93AAH$Dd:RM]0qw^S{Be5Ò=%n?S,wǯFl5o54ݳRyz"s:]qϿ|nIG_@s@\3\9$ kyflŨV#0cmt 9B@f5|^hzJRД{Υ@Е9Tϸg..N$5RW?=a9uRHsVψ)!x͵dǔ2SدOSb)*2 /r5([nsysy^5luflQ25'뽰4I oL3V#Ɠ'D>)MoXIgZbq{i  Fhh8o?tq-Pz,=LiNRհIi :haI/j(Ya6I!&A!L'U@u! 1u_m Pu};Z'3.owme1NQ$bv $Ó5*V.SC"@"%#{/#OxO})7NJ89}_{ng?" B](Dry᫥Tп)Q ]` w( ?/xGk dDTA7s)H.o[XjڇXm6Nz_l=Zaa~xi>~އX@l9" 䡝PB1Q2~d@>Ok2S9TuvBlJEɗo;}M=sfY5Xfb |]5I n¾;vȪ fnm}Wy߉b BQ&H5bϚM2M[Xhɕ Mo6ZN)tSyC݆Dߟy9sBcA|gX^]Sy|sh6H1>զd#patW2RbV*&@W)n-%mi|I9= "BOQ Iƒ&6<.&J#6b9s`p71umG`wtO:M g'["2 F& ch4E@ʠ'#(=yD{Yg(\VX3eD8YQk.$W\șmS|Q1v4Y[LȑaB 3n" 8 Ñ+lhIE'zaxrc;}9lEhiu䟤l2d=7$7'ٿa\q2-Qg;T.) $YY&oSa0P\" ~?.kem! zt/l?q%z#&o7t냉H͆-6]&Hd14eL'`c~wgJq2N<%(hihę$AFIUZJPO2Tw< TEU-3TDULCAC!ᢒ&A2MN:JCSsUEoq"{}^ٔ5O7Y&U牶ɶM4+,cه0R >!=UYJ?t<5*x4~CuG)>>]. `Uzu`L>d$h(fmcY G]|bwD!ȡHi$)i .g;m>o{CF.Dyw4 ` %|wJ;{Χ-"4hb~dzs"J!p#r?if!c $ Yְ_KQ|陓η2}qD*HQj&&$ZJ ޒs[C\6w@U!0!`\4n}r(k熃 O:^l Mr4'5%)-(V3Ĺ XJTQP `>ϟlw`4 S܂O^!'%8˄ 7{]`y}I13DS!і)6E$KM-{ά Bc֡+O=| !`Sͅ|܏ x_z~LÀ4!(Q $QT'y{_E+Pj'b=R^ZCC0As.>.r] |5;ވ<`6i Ç;MP@~D<2,RÒ(-^_bɮ~$eA2m=jEwsMBR&gsn5yQ5ø8"^.[h\8rJLS ߧ4&(*"Nss-M9f"4~S8+QSEXd:?-ex&>C@fW4@ş,$ AB2=8 SK|?%K}+0fEIUBEʫohx7ʖGkz^* Xr W<%a]8P-\)}wsx1 5173NF>| :웇l ߨTQ8@Rx{fԹ 9}vv_ m ydH9_Q?߰`!Zygԇ#U!5Swob'ӿn|UK<0s8t" l^Mʃ@3@PP 4cy0}\ !/ A?EtEjc +Ed<=@т&u (P;gj_.oDud mUUI5'R")t>z}I 0)dQ{?X8$N,ɣ/ 3sW_˙hCyl'aӚ*d9S5 w)'[c+ȩPGށ҄b^_ے@ˬlcҭY}`(&( .4rx\@RR<(ԩRYHw>>9 wJ $hiߤntnAP;ڌ  Z@GWGͱ:O>4-qp ? ̎k=zzԎ"d꘸ G{#S T  :΋\sW00q!T}nCf26M?bWqӬPy@W (T")|C((6YԲa3 P%f4&2z;9ت"Eebmnqsv|Gx5}5o8 qTrbcH> xXM!܅YR18"dŭE?("%Эyĥ"UqqvxG`<3251@~O^i[l;TFƅ:'S08d'Sb߳/q)s̚zS&HSTHPRsOH!Ps=\ϷKd:smlV |H`yҲELL|܏*f҉XM?`Wǁ2^!P;4uHtOCY~$OvMRQPPҬ(q#$q9`zYS {ܠ8M,"㶓ߔ xG'R?Rg]l;m呒>GM̷;Hl)r8ߨw.K !o&R̩1&U\4@"DbKcsPA͙#;t.. LcrÃO !`Hup$A4XsHlQNqMԡ$\ܥV$$ɒHLySm\ AR,\(ģ/|sS/hy$H4&PSe7䢐{I]ya v&ܧq/y.y.]ti 5~l1AC`/dx6m~nw6@)'N C!S|;`tu^>#nCj`A_>_1BCĀ"y<((J Rh,(#F% r {`p:PQCȤ RR qF\>0^cXP=ZON)>SXm}?Fp5hqGy<_l7EmgiU1h6؏.2wbx2ۣ0CGa%<ήdaQ`<Aq^s$2i=A9?^ 9/}j/IiF8~SGP/QiIuPC!Bzð[r >/zyvGxE$׀N?5hPKA6Fy/&Ys*ࠄiSJjãITXBDձɢn# Zrb mEZzT7Z 4xG6.2Ur Bu;ZhsEx|_[]a4`X}yHĿCΎ@ˠ5t֞^= ?BGۯ0/j== ?G_#5^Mˏ ]s%(+3ӁU1qW__0<:|_|NIkh]IIۥ~'qD\ȓ0vj_4 QɮȈdB09L)Sh8Hc, !xG_]&"x6 0C6]g mӒHE+dmGۭO`:C!یd[jI*Z Ng5ODU;vPS6+trM=TE^6@:rɏm8 3P,BAu&1*}%si"*R=mLFČ~% `Rd"EPA\QNHeXv׋:L$IhsnYƸ"YSp, /S9+mONNN@9a#5;lU:61#Db ((Q)QiY(DTAC( &|7% {7wa&75Ԯfr>MJ)2)!Q45Qkor*7'=\={*LvXE[!AE-"%IS*MөLvn5ɊC6" 5}SonnH忧$mt>;Z(cꆇ1UqR2&>7ɖeWlCzsDOVdLTy:$-C KQdwtM`Bzxʾv,x.]O$axvyfYoÅUE38ɚ~9ha:y9 耵?$$ r($sSUyU?3&o"1p]`*hf-A$1M4Dl:5c[7鯘LJ@t2O<8M0`#0x"H' 0 Vϐ$LKӒ&k}^~lNOSh&vEz{ӊ'ҞSxco&v\4 ϯ:?c x|`Qd"5W _%6٦ a@PJv៳e՞c[9iZtg[<[ $Y C,DT,O%4(P|y;'nvsy!P8^S_|@ȍS@R1 )@QHD*RE*Dđ"kΊ-F b`KC4b4:TQTS FM?UA SVJH`1QX > shj bhJE7jRriHow2it Iɥ/ j]N9nsu[L@P_\JCM8/=:b  ;BHʾ:wE{d񳶒6DkIMW.㬩)*n&XCN4=I{Fqc^U#tG" gm*8k 7=AOŹ }n<2%`p2Z {4Ƹ!݋;ܰDO8$7P9 uFpk Ӟ;bY+0)+kaP}I?V ǎck,sd;A վ5!By{sXYk6acWL,(H+G7f4Cj9ʇ=H ;@B!4>07]#74$4R)RwbOw{$sɦc;}@DMQ(Q RB0 8Cp p̆fG׿~ӛpB5%dj:6Oqs-﹚>vSu AD̖\!C -j-(6A?b&xx__޵zm=ޜ:@~C%d&E|0ϽSyϝYFEb~o, %&d I(( * 4 ?N9.í`i6M;.cAH2(?4]zDkz)>iۅΩ>"C{2}z>ؤ@U 0DHǤ 2uh{MKfeFk[O v;nuhUGKD֗ǰ~^4+`) 7xF $2A$J%+HӚII&==1rXfnP m?j_"+UÂ|JB,@<8ulN:,V`I:T٭5#dzGï6٦aa{3htH̲ )͖eH&_8 `)Fj e=ؚ(ji(`۽!)OWDF (@"D8oc߬Ia޼v' Y1~5xG7"$L"@cR];Q?MTr=5t'ўgLY|wʁ~@yoq; --5E MTPhԂ:ut gZ9AOj(Jf(!`) d\(0Dp~V܁؇Y,=c#ְC_ZAd,ъ^ /X TZz9!Q"nWl B_gŶF.f|f͖!|] &TޡGNge=a޹6\2a9rc'!&i=Yei}b]UKIXb7ʻW=)1j5c]yޮ]f>DKGڰۢ:) *.Gj;HW/O |7.㝟s#C=w]P5jB" C_'w"3{nj.s*Pe5F*XƲxqheGs!:/7pg1[1fsgaIY gxQAn"PhLScj-KdӵULB+V~|c}{$`'&}l$E \bUĒ`QEq~7JFfZ3IXQPe-J~ +$L1P}dX~s3:==iQ7ldb"L @($(U$`P)K%T<`%.6Zʐr$K:gYޘ6xub( u''A~L;`S;g3*LVE`KB9:w <+'juQkb? cg4)}dl5^)fd b&GTEY^*OgɇQ}cu;I6Lפ/dxGG~#j4GF뢇'oPQRR, t|xHb#Nwq|.وEMm1]/24ei)5\6c7(7Æ<;Z(沍ڎ3Gg19b>  :`Ysj ΒUPEm %+׳ϪKuAzPۥsy`?xk2k"t( S7Y-I#3J+6{r0/ULg7f'DF0LDD@uxxkD}Jٖ[D}9+dLruR.WWzƸp>~Oh[)#OCCB!Þ2G_J/,m,7f@! $u Ƌzg yp TIǃ2gG#?Mur^h_Cپ^{RQABBy$.3ry  `(w;#=W?/oʾ淘 C-W}=?G}7tG>dz(9_.1 Pm?Mֲ,-g&gE/cX~A)gd>z 34{hEȓ212 9Ti8 (jfqmt/dDH͝Ê ;8%C}WNi2~Af}ufu>\AĆWNIFzl:S/>xmX!}<^ybΑ? g }J4|.]MPy={(tsͣkPY2PkBo;3* ?i(p#Mq7ikmB%L'2AbwZ *Fjd ʇ͡C}\ %T9~2+Ġ^1&?D>|AO;]xD=z3<)]CUK ǡXuO6JfWЀl \VZ@#o$Q,tUBU0{׷ݘWFl|1Z)CߨG@:}@|~Fox/x~|F DY)ie[UKޥQ}%1ZehE3Úi\3aDX\5oh./{ P NNGеKQJYZ0PS"u +[KXCE@+*@6Xl3TUR z] + CΆfdG't;;v,&P􀔀;ϣ/du v=^ vʞ#Gs# U:5L^j 3V!R kݿ /a5X5q֞d ,g73nH\aLEr]V)p}d ED PȗYEcmVGONT1H`]`|IS,l,DPi6AI 9i&(h+gjݙh+f_7XtkyUM%a)j]^w!5نI1}+2k*)V${%2,0/{{,w\A C9P34L=%ZI:sCL:Sܯɤ O,+`9,^TVC'2O}o.-W_%>ېQuKW0D|؄ߕ rB|O~9'X#H<4@rcO;\ !vd(-% #EQw IDL\A'U%d@6nc=ϐx(jp$PJd#9I> e(\ &;p aI,s VCp) `⩚A{WhC|n~_&JYGTY"G@ae&bːx*֘+A "0O=|5  Iz 7{7̳-#O*t0sS"B9D|,cdbj( CwG76.aJd[o|9H&j\*j)12kd¦(W a$"oHmdrHA"ަo'HE*gX cbLP݆zS=BNKK󞺛^N~4]cB ңf%Ta`$ D}&!VAp@ Tv ܆ٝG=pP;f1JJBQx@9{S).@*'Hi-0YwȞG!ڎ.ew!4zE]cت=8p̀ܝ5Kx@g;t9G`(qߧm_W~y>wyyiy6pv}}c$9՜uFvP':JAB v)T*A'/~("{3Д}Ð> PID:EgQ}jݷ"O^1Ei عٴU E̾}PV^x.=}&ЀMO䀑 $Rd!F% ELLUTT P4B MUDA2ĤzhoABqAG~mfa,G庣I)2Yf#_ ÕpO znN8_$ssf&̌&yJ$L $PLRP=(, %]D\Es3mZA gR8MR&1HZMerLfڭr7"s&޳ygC>~%hHH.Z>J ~@w |MV~-i ,_(2؛re,u {LX:s*'# cZ$;6EdM BϓR 䐋אʳ~úƕ.=qJ'~y\U22d,铟ku]W!b%:@8kCxv8J'fcHu>+-ĻW9`_$ɣB }@_kZ"Ԕ[O م5o#J,^ŕ i,cJFƬcf[sqzl"j#@Udlw #]+q~̱Dy n<܆cE!z17$.Xª1Qe -+>4'h3<dܶzaL ~>b?rԉذ4C0vQD/i$ "Cc9Ss~??ly0cXAEEb /| \a2ERs1b(@8y`? F;i(d:hh["VR~&A"eSjLRd؝<6Lld6@SH :@=ßQ3z ^W'h͑<ľf #`=ӯp;n`={txOPmc_xwT0C^6SyޙsJi$x> Ʀs%R= YIJF !|pw}`Rel U:o[?)҄Oz:/\O nXJ;SEuǡ. SĎ *9S'm$.8CCYvASQi1[/}'nHx￞NG8 >Kw-@!\PON! vy*"OU=ۇIZR&9`Z`8ҟ_ez_<}uӇd-l3\cS˶8{7z;=_k"Q!d$|bO> m_Ps;n}sO!éE.'#P(_N;ߢ6k ѝC bTYRt+&~>M|: ~Ns̜}J~ ż fӘ RI o;P;bکun4 ҿzF]{.y*}ݘ!p?+HfYM$Sǒ֌ed"?e C'7utW~,Pgn#h/:Q2~z<(?*ĎVy?+R}=zk_xIs\C X(E3aY 71ᘁGVlyeKSAs➌P8D"peWcd)33ߺ<-jֹ֘0-C`u,d*Е+ա@1S#iξP]gqUH>:2KMHV'Ltr: 0n{rwZc?!lgJ9!pvN<4'wAd=Te1 u$zCk2rTL/}/; }/&1B JlsuB&FcVOm @RhuJB"]PI)7հ,V2(m(,BKlZVg" *)9nK%9С8rZɂLB޺=py/=@|Z\{O.B ` Q|>>&XP=`i)WƧ J)K-%(I EE[Y|)hHjh$SKݯt;8Ф] u4_X$(^^;pHq/E"+JoF?r|#2`:!(oC_BLm ITDIwzi}/?`24.ҧG|b~8v{W~q+?fKO^{μ6mdۨr_ TׯwEtmԙ*P2"te s9a;SPt6Y 1DBbZկ&2"h>qdF"JEihǧ% B,~t^R4CCIL^l8lJ/~&*[*_>y>l?[!Kl Ǟb|rקR3!C/ @'K[eX >c/:кbGWߗZ' ..TՄ:~q͈_{ᅅmYC'Y ?o]ks8rN]@eB9ĝ]c& FX(t+l['ϓжvu iYJ +$D/NJ+x}jXvYabeL!qf̶7JAtxZuTTV"7sڤ b w `RkqJ-%UdU\z?:?}!0VekYP[*x(I]J# " *dAV~1*yE<+fQ_1vθ6!W=D.Юm$@^0M$FSQlh X{ɪ bL= a P/'*L`+3=^zHV lDwP44h2ӋP^嘙)c H^zUagr ! `KcR>d D*)]U8ϔI$#@$H%$D@DQffY TLU[C@jbB6ۿ{+|Κ\o^%HULÈ׻^Gb(2#nK2As# :9[A hX90 U: ;!y^@`BOl/(d?G5Q z=4o% 9,r+HTFBTdNG03 *k&8MsfF?9LQ;Oh[4mM(8fZ-S$ϳ穯~.ir57zl{1+]6C=-@ҟԽ2dsEuw yY%mO ˊ'~Š"1PFM2 (zZ~۳rGd? jH 9v{)>A! DUةN%AFق3$ !HOB{''שUzBqz(| #Mm"qN?;=vPw='HH'T^x{'L U8x/dh㜤XTϭo}eI 9:`H(r~p!IRJqw{/ Fsz.x{Er~GO{iF"Bw06^.2dx=;eϞڊ0 OB^D( 7 vw|7`}< b;DLnCvM!CҐ#a:*CgX8^r(u%XcäD: ^tm2?Li{H}GIO@P?vjEb', '"_SBLQ^IoG 6J< Qk FygL2ypۃࣂ"J$cŖTjO=Iny1L+_s+A+PdĿTEB=TMI;c/gmt?R\@f_ g1sp7i܆5;#Z) oNcQnl~P"49fL6CgBH!&$/c}tl@} ! 1 ǰw*B7JX?B7z>JOc{8 , Ð/z)qOD(Q$;HPԎAI\b)"|adu R J; [䦐h,_>ϘKBz;:3q7O9~8h)<`.܇Pbq̇$ 7`HZ4iU@ΕDt d@R!J"A R"02 6!H&^d\H=~C^WDYbQ.^4!$ I,Ex~>̇. ʜM@V'iR?q6u#9gD)* A(EtWIRh)bT1 v"j?oo~"-*tIu xwq1 mMH:, O/Rí/TџY;O*@Hom)T1d?BOQ"u{(]M.8HO5`:*@ֽɯonޞj4Ja'Mfաt$Qa;DwDU0rWbN֭`r׈h^IC@ns"POic|Ho*P]D] =mἄǘw|4!.$/CPp 8|;$Aw4J)|-N7\t&o(juWsfjT50$5 c~Gyo~:]*Sq/h5ԙ=nw&f8.T׏p4Q\=@|*;0ECEfkr[r ,G#-Ҙ(*vC W ωbȐ<{2*rg 3W]Q`G"P@=tg\r3熸 1tā屭PEUG#2"x:CwQz"x (w.f\f+SC l :[Me܅"N<XsIA'ߗ lՃ!!9 $f`T>{}oW7gU>xncJ*q Mmn F܁BJ0"ġZ@)W[ 8ȅ4iޯ; m#6x E!@)4kF`ޡ gM43(y¯tK32{ DR'0bq,nWQMvL`K*em[1qԯGCxG0'O6PcNvѸ)muٷg@!w~4%U4pGJM{v<}kM4b Aƈ$8NMZC`…H*2DR'Z(X@IZţ@Klip*!0Y&D B*Hitǎd9riΙ xz <͹ư sa06 DMQKEUAhh"b"b)y6>#OS#:+8X~.u|}F&6xk)Aw.fY1=zxMC?LjAOLq&TBHRJn{ą d qȴ6yrtC>Nva.93H{&v}-B;R?~=*u;j뉐hl =aS昒% G FWǠɊ1LTI)De\r%bjCgBx?~/&l0fOQA6P&s0>:p5KITU!%ĜIN+"]AvƑ* `*BDr+i$$Lk%4&9RkISTEAS!\\-ňs(2k( qRIrNF !]%&rIFMYn`>!|+R\*?xa 'PE@~Z\@|ࣞdDJ?;`ʋĔeQZ*tA1 gՌa pkAԤȿX~JEb#B5UJRE"FB!u*Cq/&ɖhj)(( Z@sJGHQQJ)/05AЙr(J&AhTZ(,*AP7ND4I]_:*=?LfJܜ$)ȥG*p;2)܋M)C?]s(hD=B:D)WJJ!]+p|,-mhcbc0WeZ@Dji(W'Jqu\OdOs5'2*|I=1-A%K4QRd2: hpux5sg2ER+P%BR@TK@4*PJg?h1\gdd) 7#s9kV.i۠@ J R'87çwx| P?w<| PoSZ"u͋;EE-UeT%6kǫu!I@hB;;>'<%آ{z0? _N3-!J64\;6qG^6=1}G*zABEZ8檯ɗx7'v~B^FuH}rCMpʝf|P⿿5h;>Fj lʃL0OM`u0Dds@f&)fQfCg"",A4s[κRԹFx@ NjT#zI}_CizZ!&Ẽ*+YR]P9VL衃|($RA}1g9ɒReZ^ddU(JBWW1w{>Z}Hevg!s?k|V(1#􈇺{W8>"P͉Ic8"5`'d]!< R m4'snnv-\CfljMLPSF]6%f '"*dDE4"xqbWw8ww<y^@:2w'wzk=x}Hf9N btH17٠(*(Z)C(qπ§oX e%RߑR/`GbBc6 &AHR*3<@ B ̠:|2x` H3m!Z#9EY,P& {pw_wj N;6e,,Z8Nj2 $$ D@>vF},=}yEzbywPy4"A4i !|xEUvsR Z L22PTNޝp+j[ZѤo>/ܜB]s0M$TQDT%>`>i': Oi5;Cϯ5mbhv1|>y}'(5|wTÜ ًoEߺDQOa )DJwxS۩56Jb&?ʵ&5ø(*m#r ,ʐA^wT~x:6KAJ D &"AW:IB<'XwN4(q*dԽM @]@>(: ~wal*! W1թ% PY4) cĐ(ò|Q|긗ۅA^Qѡ JP;<_.C˟.=|z'A@RǸ|[YC j GC+==.ù' t1$rrI>xxbp@ԉAJ%ih'/Olwa\7>&?pc֖d4PsaĬC$D CYe3{B94e4H tRfR h(tHἇ3>$> tH'tB z~ۯ9O) u~<}}zLٞ理zbeܿo 3QQQTATQX5_ ݉v9=l#=i=r3v$iFJeǃ{F~o`@0 Ƽw@MsMŠ||`=(I p`puU֧~^UVEe^XA96Ĥ{|8#F4 "+8rܠ;*Oٞ҇Q;{l5@SR?dAOɺ=;=md+ EcrrFVIB3e(_O+@tz$}w[ Yr] ~ϔp1J{(|>Ag]D]U|Ac0p\yʒ$()W*Iμ3k>/!;8$EBڕQCȾ2}Ţ+^#I0r7 FJ{Eo7XJ܌"*٤(^+Hc;ciGSGWYY(I/wɲ+`XnJRf6,@Lr4qa5S`SKAŅ %U"s}7m<|!d R-\NyQ\67~NG2f^Eרj}(lQ -9{崬ZȊdo%)4;9ƔM}"~z&WRW["}=]ҬG+}cCqF5 x6jRzߡc>z`5M =I ~fǸOJ/~uF4L ׹xgG0bN1>SgL8fzj8ݫl,z.ܞj\:@3)>h,0X2(_ YY%X̲+"9fZ5`:9 /c|ѿz&ohMgt1Oh~)0Hq"ne4>ċ2AT>Z~nk^ 9g :N}0u$4UUUUQTEDS1D*""**"""""$DQ}_z?.W,*|PH{ZԎSwb71:ȆMx0 +BKA(@R,r(UR4(23=JbP*ZJ@FiVi * T ҩ̀PPtyL`acM?f+nr\Vd7=ånaj8~0[b ,N"ؗQ$̓6հkE-3D%3EI&Z) " b"#eհhM4DHJBB&Vo8GuDg7KHKdȸ浆] 'l{>>_ފy7u~Oh<޴8j( @(XhZYP j(  " P)JB-RUKdDEJ4B%4RP5HڌLi*()G T CyC`]hQ׆O7= @Kר#?Gv {";JxJ^d3:~̔]. ~H~P/%#x͗P=?x *>4M9 050EyAAЇhO/VeJCJn,MTRҠHB("e!Ji)o?9s$Td}Pnaql]so^| dOBR|Aqcf}f4dc\so@qeV994u0gmtR`69Knq ݽ R 3k3Cvᬝqi飐b@3L_Gh2wjl~̱uHD\l&X,2D1=sAu[oWLO'́2D)3̣jIP1RGo|k gZ 2tL=8^7'b"pΑXE׍s/ gLa];BPs8wGܣ&].{Cӌf>g{jgddzMr15A]?>v'|;͈ Usn8MG_b% : 9a}QxD=& 420X 'Bz~s?vyt2v/)5+?,gKjgkr̋Gā{'̺8Ϋj2,IiUGڡh}:2L͜W# KC J KBb?t`BB$ʅ\!oӸt{3F+̃lxۇg{k傭x]8h5'C#'\O:zS%L]P/1|B[ԸxG9Z{T5j3 2!L4>4;!AҞQĞ^(s9>R^KS)TR5RR HE D4<ےQ"9kZ@䦚" CO#0G5ȷT)ΏW*i $AD- PT EE+|r=젲4\>q (sK d[E,PywN~I "4)F5U+v3[Rdd!tf\q#k:d?xsn)q3cV*z9˾ `*w'NW?/7#2#%s;g3&s pݣFeYe̡qˆx䆑|5):>gv  !aN:ETs_K#K<=LHp&݂#ap )W+>׺5:G}kB+ne$W#r ZH=2{n#JInvoXx@- i _ 8g>_O'&>S"\d a#}T0ХTϚ4R}BMiDr̘F&b݆#|K'1Q|5 {L՘UCR>S#C} $ #tQV"^=>lɈA99^ŧY\T j{tOL֊**#WV9ƚs:[Kgm?=ÕFvwc [f9F$ư>t#\1e-BB`YqX |6m(36h5i)yi P}MJ< ʠ41:}0<$[-7i yig5@(E<3dl؄+^͊ 5Bɀ-.7~I$4u!zdtkxDH2%>|9yI.{so䈕@!DA\,H:hLJ|„rWB MxiEۻ31[Wk=73Ͽ(Q'/=\D/(X! .C#mhdCRLJ5; ` 2*=Yǹޒ{TQ y7MjBr4'SJP1D@\=wwҤX]Z "{BpCR"~? e!4N(}ΰչY7LO>X76P5zaAٸ/4S_"ΰu1 ,(|\p}autm:<iĪr2AkXG M8*b9RGqɘ/XUsޛ D s|^}|pmjDiE$w4΃[!~cgYq yN|Z2FL5?e_]`ѩ1YGˑ3*iwށO8}Q$DT:?;EwDTDu/z_K͝:t|zg/ǡ}}U=z]n7#BNOSH4ShoπO~qB~xv Yu }^vGMnDZϿi8D xr-8Oo?RADH*+ F%#ȣ;eSu/1o EƱy~# X[.D'ҳ)H<(|dC򴼃@vZӭh4|ts:@4!̑ [؏9@tMp0xP?oiA>OrZHE=yoh/NiN(>L:,]%)ݿ~:7h09qZ( X:<{7.}_wik/ Rgs"@Ƹht;A3%b&;%HB芈d?he晀 ($U<^M0iOS{ ohNI1껹NQvC(YX;t $_܊=nZ,! B8}SW? )\gxߑ{̢iɉ ܵ>O YIGLNLc K>L0aĉ >\ӻssԤ P]+ .H%Sz德+㫊!%n\ls2+\1@$0 $)gn{3'3')6îq6*) (i2 u1T8D =p2 Hh h)TD B=3WBFD3Srtս)lDsR!S#RE_%"?k&ve}>4'^{ڋk?w8",BA<;1щfj~?=p*8G'Iwoq xCݷ@G9b)2w`}*D#-b+[b!=ov (@FDs?DRU\z3jf筪V̺v©uU30]136=Ybz:s<s.VȎ-~ )?"H3?Z1The9D9"̎*UNhhqvc>:ifPr$5$4E'T5ee%UO{,#MlsCBN]٤ lw!awCӞXa gGw$ B׃3$ p#v52OwYQ_ O $<'py$2$ lMX>E gddTx\d;Bg3}ˑYCQWCf-yh@w:D(];|B?+ ;@JPy_ ृ-#9TjiJ~2;ƚh$&!-,X&i6\4V? '@_Wӌ-B*}4r:O$@#ww(* (!C ER#GFUEvh+_{p>Ĕ * <HzҐq8{qcE }I, @D2 K0EEm(f** F!Tݱ.*BӤ"K@f$< h' yikooY6s!u־Hw)NYg28UQa^Y1W7 >7dn)ujhZJ Âu8u{+?]<((Nepgw]: ‡vU H zTpLDu!wdcolQA^"P!}zD$7\nZ[Ybf1(G?ŵE/H30bB ’2Cd7lA1N]^C^aZEuƂ- ,c6rA\  rW Ll"dON\e:ɺ/M YCI,ѤYmehvDCjiXILPhii =5ڒ2HO}bkh엜±nM]ۈI9φy|\{h_`́6lOS z*R" c1,IVM"qv`:3Jty6쑅cA! ns:=.=U\2A,dH,qRɑa╘ c7èoknXz$ILmUEc(ŝ%ͤieR"Y#6r-p5[#Z?ӁkDWls)>a%7 ;]i$LMskaSd"B.rL\^`;YrL\԰5.Prx>UvHbA)"`I3ޭ.\GӢR8-A,,0yMv#A 3",JF]Aq%0B8BSI6_3u spaɮrq] OwtwSh!TvesQKNFT7%8JBX2EK m lRMAQZ$dQB6YDQlƏ:&[`4pq+11pp7 čvT-[ll #;("?oSK.ź~1O]JJ.@w*inM#eBƶ)d. lTRXP\W1L7+3y+:%K#E,D7 )I2*}tCҚ_IT[[H feDR `ǾtYuAUDIh5T)H(TD#Y$phL@RS Mls,DYO>v}GIf_n}I-c5Ti5+R8[55UCP>_2yMģ% ȪBM F '̽!䁵w]W"NT`Ž`DX`ݙsD\+V2((Y뉳 ~\UQs^Is:DK<6$l})筳{6WMnZ' >㫢LXu!yLy3FR!J䫚Q5IgYz'9BեᎡH= H-wj+K.3-ɫުP F?w&)xtMsk>9V4 Ƣ H|ܙ)x 3M4R5AJLT%-)aMc(7ƒס,)PCs s{Rl<7`a\SNdI1 E U^f*U\'o /wDv$S {WQE(U=TDG "j*U:{C@?|0xbRx\_| 2RRR4O^0a^ (J؛$%!@GJ&R($ZF!IRhh@fDIƤ@xCD K6 ym㯎Ei`hH *#qnz,!"4ȧ]Fu1?l>]&5{Pԍdܭ!J&MەԠ RSlMΥ p9 8Iw ՀVrZJ@B] ]G"QJ*PR 0w z!ЍL4%)H1-T"bQ$4!%DHH&@lSP\;I4pVEX̹UfQِo뙯87鰙q&u!$7~ν&7sm'n 0TpD+XQ-lG"5H툛5 ITe1,zRC2 hn=CAy!dm$x@4bf>[$#A̯u4 4H8p&)S2v)s=)/A\kb'8)R@3_;*S&#MDQ50SA6ɚ"ܹPr[r9FHEY"+϶@KڻxH}`O}l45WV !GAHb= G]'M ߾r0<3 29N|//G' }On"J+Fvi 0^6U4br w1vt.8DT|sݏC˧v~Guxm.wRq0 8E~Gɚ qz "fP(nA:Lp;2e* gZ'oO񷸀*6UNp=hU=!P%DiUPoB"m*(kT9 8@nZ5bIH@R>BV bߟ&4+FkNRJFm!^'Z(A>d + DwҠwBBn(Tu$~Y| I]÷QALaA;S&be T?%4UQEQEQE@W;IWh< >r~3Q6 A:ɴk0L=/=Na"T2isH3D@PO͏[afFLWD5{j(a4UDPITR_mR%$01A!PSS!I=A""jZ 1)RLBFNA`N!6.z?\D@>`~sAAA$|Ј{B ӓ?wo;< nz})}oʆH (>㕱$Px"`$~ױ7}?bw>'碉bO0 BOwpcGC *Nq(+Mx1 `g9(QyG=%Vɠ+q= !(@Gr'^L*% YT#%"-@"rScJhh*"??wrSߨ4E;zN]ORhC@rWbvY &:G{S,B'wm )-* sJw %ECZD+ n]#LI&d(} Bд s44bכS1LP XG7aD?N=S3c'1xp=`%~;m"~D[!|B*$##D"g2+Xs`BEE&5 DH!\Žu.0er(\K>AGdHfafjgAEQ0LwMC]\@صq89r9e\׍Z凧Ma~$ ?}Z4ҚM#AJ Tf4:ti*sdqӃZd LazJI ̒08'}MBBD w?f''?.(r$Ǟ*G-`"!lԉ$7Bf~!lぽI+8C}S _ql̐Fެ}\M4$Hд5 j|{mNWU~)BhJVQh( JB$J;?0ၘcK?E>E;Ji@o)|:ݞ~?N=:,M%/#0(!hҔ4ŢlEƂp]rr6BK[gA\6";j9+ye4f%C/#Ér]oϠNd $>,]|y"h{"!$@y!/˼Dʧ$!=Vƺ\fX`co^>˛ׄrD3%!T@R)E$B%#}Sw'SJTQ(KD#??m7q1ֶ6ۚFN:vK-^<~Alr' 83V Q=W"' w xj 4$4B^NU'}3LM L EEP='=7Ȋ@\a:,o8n:]wark qe?-`|^djS ē/bm=HQH^7* 'ϵi0WCy:K=OXVo8_?Nq7K)*$;F BZJGζq9PWai7Sላ;q ]>"}a!~VK*tSa2)1=Ћ<)ÃEQu.b߻먱w%=;"Ur4%%Wi ϙ!ħp9!#2/E1 " ҼD:?|\~9湜bE_]@se$?_ MI%"4n1UX+^MO,uޝO(ç}J!D%.PmMBrթOXxCZs45Ye2K̀pN&h~sr7kfh{- (bS^&ܙh{/漄@#dPTٍVlhw"vj-D-!TMP~v ;T!TSIFh[]TLTo.KEJ:*:EE%JLCQy7ΰyfh9<7s;!1r bOX4IJ &=;^'>Dȟ2 |cN)V қ6N_àWq? }x}v r8U AC0> ܠr #Zy4 'P",#9}dT~p%c5 /1rxɅʃizg#O ~Ϡ'xCA\ Έ"`;lNE/QNPWq6=V-SZ_gpi|~9:1PA >PI Cb4%KS D"MS(hDM|)ȩ !IKU6zBJT͠lr@o) @eqmrg"]+6H;P(p  ;*>>#̢ =pƉ( A"̨D20J!* PhQ JiBTvKA*d_iZLE0Q14#HKL`UHJ"MBRHRДRR!@% B(J4 !JJHP+J(IH+BPJХP4H%!B4hQאnVd͟}C6k9}.l; PLܸc#Ԕ5lg"T-3aa اz߳iblɋ2JuowԶ ep&عI{O?L>A }XkT`m>߫R]}ְ!}iѸATwDL9:8IHPSPJ>sܯ_ n$`Xm_tOʯyT)|s&*d z_7ud Gn MLT 0"@L!RRT%QEc}  P4l *Jj& ""Ŕ7T'PN %.QT4G"]#0Fg}y*FOώ>R=Or-H+ہmNcw@ &Ǽ!P@(*\ԡF`o^!1H14zÂ/w緁x%r(A::kiW^*>G\`Hs/eL)Z~ abHhmJ*yߗ<|.ݹ!LgeY5Au#=B0͢7ah#"byD0|IĀ{|ǹ ~糈^|2Ӕ5|7'(~OpC@oZZ㜬W 0,22(D <8Qʝd7F -ASg-4H>v:U9]\GQsb$&""sb%DEUE$W'IAK0rM)wn96t]h Pbh<#:i"(&cl∊bp"b𛧺CQl,CERִhOx1=Ff*-%D K 4Ri 11DLRmcufZJi&("$ !(a#涚.f؈VAl4sabd"d &֪bI*EunN*֮l8")cIDE d fef 5]fb4AQKD)Nlꐦ G WݐQ tTH34C<ˈ uQΊ)`;ڊiLK 4)m&Z ]%HU]) ق42P NhEDG0_Ɋk^N5*":w¸)aVو94|AT 8G{R"$@BB4  F~9T=]ЪCX۠Z؀`pEa6xN5"Z@ y&4"DIŬzR&0,&f*(RmT0Ƚݗ=&Ej5[?   ^مԸca .(+)LJu?񏯧7k\Qиke.#-'c+DraGw>#mPQsA,HI((h}Sr cj[7A6X]fQ w^qMZ'w''5f6"[ur FH?7F=Q2{Ǚx)N9*Aِ9:gMP~6QjYxo[*{>߉co`C[GϬ$H1p;{{)'Al 1Xx\Cq wy?ps2#>kN o({AO|u>m&73393i yy!ErRAMFS@s?QA{a3 %3u@!0pX= ;GJl%iHb&?R"&$tKiF#%8D--+xq0"}O } ҃'@: G_1w< rL z׿Xטӏ.~zR;Q9pSwr1wXk3>n<"Ms LvS#V&"Pi( R!yCDP~}:@/7oq@2=CjW"/(!OB bB.$IDLdtDS*olpIb8Ȉ 8`Ј|ܡRJ =G᨝M_nP6nGA uED@Ih澺8*tb"bИ| &Igu7|ʄ""x:zH  JnUTM\a(2BFO,J 9 N'CyovN'`~Y W >8OמἯWz'SV $T>z}l~GG;pgvɐ) ~=;'n:<|^%ȃL= JQ/=A,}cp" \])28y;THOS\*j3ɬF؍M@WRr $FeɶMDMŶӺ5/K7 -R:X%.C`#5y' Ѐe/mqF6ch)uX0m*&JVp8lCFڔB1Xb!E""cmSƜ"؜@rsb 0D"]L)k"-q\*ZE,+Q#7300M]ah#RAksb͘-rR$5U%rX .aYVcn $͸.\tcKϒ\dFN"\ vw2Gs ]#7~}n=E bڡWWU7FB yNa[Np(g ͳ6RnMbi{+UcWv]d0p5]o?R-^#}"s$x_[0dmo)Y&,O._xląTlV)ٳ滰eE:hEg{ڗ`dU+W`*EPp\ne_u=:ỿ| 4 TH34,E"wӜn@Q6B4yi7KE'F@D>;}>4Oy0jg6lnBP\UI~[ԃB9F \ K|lu>1'^9OG<W Q'_+VbCU%CؐHOvQO?'\?6'>'MBHM x*T:KR(̷ɏނ7RH$E։,nyC227A9 ]6,ʤjKhĖ@:[S#CTid0U(aIw $:ZiH2sF|Gh%ٷ)XZ7VmQ[ `b&5e W:^եȌ5E)=N|Î(JGbϼU^O]b!"̭ )v)I< 1eYTNL3D%BĢGG1Px~_ ; ?v'?Zi%~oBXaMD o8&fE'u뉆 wR _vJ Ms;j8 wZT D*E1f ew^1YuW9r2ZR]*)P4B@d&MBegwW T-F\1TφiN)6 dÍS];C>u:203RB vdTF1 *JbԈڮKZ2vЅ2֏nR̉2E/w\w'~%>~.}Wil&Y%.Jɟa3s^zv'2OsF3ɑO?r5uu2~*1B`ȻzJOĢ좑_$O.¾|PԆ 9 Kp@eDCf;gl9$a:j›r!IĀb$fc;9-WT G)_A*liy묷DB6O }B?A9 =$ecH \Ht$Yպo|ڿfSh Y@WE(a\˛mCUjzu2{rLkFG=.!BX*]8`_&礔 rM#? KϯS{.@~r+;x|5(+2HlfϯW4:kwe1\3lsgK[jTγ̡ΈkBٞLT,i]y pYw 5(@r&Tp+d5n2,SP!_LKyDIE4TO2z]Z6f#@=ǑihC#-B8|Ev916xHᒯ*5.2~*({rfi W뷹d-U.lD6Y(au sG qhpXɐ/,0@P|TaXtwHkmjϕ!?I=swDM9)AnI֍3RE1H)V)cbhYQYdDg{ywe )Kj#r2:T\9WU'+mAQj$^7W &Q5nj2~JdE RF@G,æl4HJ* :CAwܹ"O]יGOZ=Y,Ea:AREM$I;ݗxp@C$S܁2lNӷ]n龋S\%tɘqrg,*-(=zoNb)=z 7&4Ԋ0#c+ے8Uq["lI'K6{u{ۃ=%z F; o-ql@`.%]4_9<:`w2?]G49Q>=4T==K=83CSh埾Jl)p&UV3=! I\0`B5zu\MCP5 /{rSƵ"k` (7Q$m <g{a=-TTҔ{onE&OPH8kvV jy@91C aE,+XuzZx#sA1yNP A9 ߷w^3>h< }d$tc~w -B97aj)y}zhuNAxr|3w6 "Ԇ*9#Ō6 t6:ڸs0C8p31O@SM']=yy?_Q3GdqSIRFZŎlxd ڗl4ܹFc54) /X\9LUEΎikH:4T!(Ҵ D0ST4 (@E42(S!HBHB$#R!*HCA ,$ 44 ,P!HHB@HR00"$,A(J$@K-%RHLA1PHBtnz* h81qt jFBs./b'{BQ Dl(ׇ<`~0COǩtLJ#>/Q\?)AVͳt&ՄȈ]=qO ]x6 ;%B (A:UF@USԛY(QK@ Pe1qћ!܆]q<@QsDi;@4H(H7-Aތ.6sih\hG؆HxNX(3hzv2Hy`z)uތ*`@A i 5jOT9vI0bB ߊcdABxf>ޕ\n'ʶU)i+50JX}U]<Tc'6f(ޫg}()ϛ9U~h .TeM#x==Ez(2V2<ݐپL\|D(Ϟ!=O}T>uhTG:,Bzp+/ _KTrIdp I"#|,H9+Di4>;)"V.NI @*:Q IetA@ܩLM$ǰBsQxy(Yl'o\hvlY )@]5,OdXl(=u5Dv Ƨ&4/vѐ1(3;ȥ8nBORc܊ݺ4=zEy{@Hp@hǘè` ݊5xЍ=-P@ CH0 qN ;LN|z$ˈ&0Г܁"Fj#sRx(1$Q ""]i@DrT:\v"AK<VcMvuRLda)8@[*%RIUC!Є0FU(`:Ȣ`Tr-"RNnXBœep(I ,@߃7u.KLqD)6{QRUxX'!3ЮgD^.[5m"";ׂ.=%Hl' ͹M ;fI@E0fuwP?Q]lDТJ(b@4 NRIPC1^=W9D:L0g/u*]$1#O}nl:UDly*9~Pd~u|6ojNGCE'AѮB\\׮xXBDHί'WgH>*|ES8Ԡd.[TGӌ,i PU3.pӣꇍXH yvmj *f$ .:Y{CppEl#y|'Hӂ ɞ dt`.jLH .5ӍTzs2.u /n+2e4ѷ ˇuna6D+"˦?$NHd_T.caXJۮوJ!HuwrI=l$-ׅ!ኂZƬPVb 9U9O-{zQKJmT5k[ћjJC73pЩ@Q,:]rW|ה[@$ib'FIEUBJNDtMP՜Q TϾ¯ "O`l`KE@Ѫ܂ pm URKBfbړ*GKݽ}]僐R+1_dvus9-<D;HɷI0y8CAz@@ Uuq/Cq@m #ؠǝstsBNO4HDomr @gc~oW WHQ@sgOۛbX= d=)yN9dg8D t2Ü;^\'"@AH!d!At > ÎTgW^ v_-> 1B,J%{{f"mC lT(2ۯg<^'|# t;%'hSnm[ (pz@ 򶍛v)0E}A'E!,ĶF{9lI̡G% "E /MpyN뉰ǡ"LTP|AG)1x٧̗a Wحwn֜sd)c5/Xd8d HG(60i+[xj"{s>*o>il@}%ApU7q:ռ0K/SlrA-ڴzu9|BA &}B'^'J0цO! +!s1qŧ$ P I]wh;ᱛUV/WXI}/B)NE۷JZ9oU%(҂hD? y *RAHD "鍎!Pdw=5wۤɚm''sؐrR;"_`Bxi<ё6}]㗲X?0#CKABP҄M IK'onr@u!Bϐt;;֎mm_"|4JY?(}3QWC(a=XN9_I4#}/5EjJD?luU`7ݩu:]e5cTUdgw3husiY)$|f?8n$E 'xJJ'X=ʼn0 kwʺup!SE4-) Cͯl@48ir/LsA-ZnTO'CDs$CT#P9 ]g|^; eQY('1\AdTS]7!5-tJ{\BOEK$9`W91bBk:;0F$aWl)Q$Ha F$^i,ͶnuC !hZrH;@Mk=tw! "IH^gDPt/n[*#>b}`F@oA}pTN8~x^>??u)S^~`26ƶr0@CăY;yDșC-,NxO 9)Z$ت5a jBM|sΨ.čKa7Z>a=* L>6ɗ{alpG{@?G7!LA!PWeND"6\oo߁s# -egH>0./t.4ӅpvN1fĊx$A6 4QtAWCH@_Q@l`LD;_ko+ WJTː"% PH,|}D:O2Nz|X%OȎ`xhJP7 vP 䀃89y`5oI$:<>;}?e~x`/њ)BiHO+!̍A羚'~䩐"rGL Y˯ |5A&}E ݂}d n>wW3OXlzd/_ ӬxǷ=CI? p ƗA!cחq0mZYI*f2*LAmh;Mr?淶Cl?c#)ɯۅ?YnkMGtQAh@ЧL6HD<Xu &uthmR")C*}v|.rax.w@?"[y)_G k3: .O'ca'˜=K2viTnuytxw|iΥdyH FoC?}ʇnE_ybHKILO76ѷtNфɶ4mQ}"Pc|)c2PBA+w[4Y 2I\nj@qW7nt&w+̔I? QEQEQEQE<Km .$w>rnv!v܃ҤZ) d!S~?٠?lȦ-/0 l !˰Ѭ@bݘ=ݘR$$UAA=xht_[lŽ RЛNiw945W!D@:pP9ޏίG0df$t >NsrO T=ʭ>z||^u:.^9=gN2)ؾ֯]*[N1.Er4ˬ4 1Eڕ&^sƱIn7 5Spܭ6#ա'Mdx`Muͭ+DICC3U$J!lkLPE5" EHP-*P ! R( I&%3Ji| EFtaWbRDZL>OѷI`Uܐu Ifa2Bg,K@E OzUₑ:bq͚b25DnC9bSiۄ:M|<7P.烬dDhkCMN%KJQ5%J4SI@DPDQQ@L4CUQHĔELL4JRs sp0d߯|ˮ>PZ|ʢ4yuZ  o`@$ zx<'fr:&W2JzY#߿LPXwoy񦉪& +桑5,b`? 5T%Eh 4LE0MQA^1Hq'%S$KELAQICC1CCTPDI$TUujB}ihwT 7:ԣf?_;bdo9l946F31;٨``RIEg<@ l>9Gr#(=1t-TL~Rd HU Qf!!2"CPePT_r))?NrJVϔЩex&'_Y_83APQ)'!פ&@k$w )( "}08J"Ù*;W;J>8'}LAQ95)F@i)ZsJJUDQ''@!^LH aC߂kZ64m$4*"P0w6fnD '?~ x+&l$ytHvZJLHS! ÞQρҙ&Nc9A7맺SsQ]s -\+|;߲Mu2#:f :sVzKl䖒,/^_S9y̽IA@~h3=j,NP=%s壖j MS$r^nI_rCDY^56u{.ZEJ-E2 ^iꘀقԲ@$;@ß~w*owqHsE )Zh%h|2Θ QtӇaۡo{8Eyϙ@9g'5=>AL@A42xJx=ppPp]n*@w=5_A7=z3͟iQ|;zQ0B^=gG*ORYxM^R;;dC # L54279o"AE޿G' cxjɳJte!r~K6GYjGܾh$dN})S ΁:tE;>;3ڼq>ElخWEzl%doi AX߇S{UPw/b]4"9gVdNZyΏ(H@~:.!Ĩ(lH1J.hTr*I&FO9!&du#%.+g_(f)"жugB9XhcgՕID eYæ72wYEW\"?5vҹ4 ""{.RʹߝT$d!Nf*>dl!wݎ=-vaG$G+^`#;m.~,P$lY ~#>=< gEB`,R!g(,CYZN)A.-dd5`Etr9Ph8( ) (r~ODX>D5LVWFrh*yPP(9̹JeŚB "OP$;JLZyOW{ۙV=4QΚ|-xgpgnq!.Ǐym>ɣyON}o#rA ;dCĕ2FOM"% >2<- 2:?_wJ0(R0}{:BfijO7z)plûN/;_PG//y?~EKZơr3_sf JO pS8Z0L{^>_G4Oo+_?M1%85fy~y-"iyɴE?*55e+o(BTV36>U4}&97܀( ?? 'b/ xdMg@gqВ  KyNz>:Mz'Q_gP:(T(Hb7>@tP$=q @ 4<(|r(Mt=zWz1Sn% (hz NWc(@@xاwt} =\s@ B;U@Ҏe`;۪RM·=zUkwu^8` wln] ,;vI<آ(*aD({J֔A@Pz׏|of뎪VN {}+Q}xcHޙۻZݝ{–z; sǰ>s.nn=],` {{sx`1;^h!5u%}wL5˱qw ޏvy^se>ullk3N5mjغM+tsٖ}bѣ-S]%:Lgwob=R{Mn. Ei@ *|=)n ݸқglܨEP(!#4@(!AAٕ!yx{w{k6q*nãZj}*4w}_xxow0|sy Rmoz_^|k\9[+V6-Sjm׵P'hsl72+:Gj\]ݵw-{o}u[w{ؽ%L^|Gw@ 飈n}}k_LgY xU(ﵞ^Z6t8#ꪽs>9nyj{^1^B;V\Ea5}p*[r빜k@]*kymժMCy;}ާ̴,F+66(fU6MLݰ"wl֩nN;%wwoeU(i=gSh&9jͶٺ)AlVi-v޵{s-mmTRtΑKYY[ż[%R*HY*(Ъ_>QJPuWlsw`z];p4 ̷ UH(ѭi_|myW݃21ݧ۝ܠ^@ qU ;cWmA-ǽ=総YE`,g%nmklֶ7)oBZ]>nz'   I=a3PSD"DT4AA2)A2 (!'1' ` b &!DѦ)S=~2M'@L@&#Qm& e4OS4RyQ7zF@0D &Se2ʧQSO$M2i4=`iC &`ո2?(ٌrK-DRG`}8"{T1U. %#J(Њ4"R1GD]?P(+H aUߕ;zn8_m"tO |<0;3Dm⢯_5{HyU?Ubp j\= џG}yHxJJ[݄v;1"srP(bi&آ'Oq\cSFuϞ5O/8~ \cp}[Ke~e?A?mP QGxE:?:BGQ߂]/u|f<}z?G}.}=ן9y7*RoZ?Ҁk^U(@̄  Q 2&Ig/bW3QXi{>A.ޓ"'zgTũ^'gK^h;]%<Kl)ڷR%$Œ #^?KVohle6ѻ߹ȟwzr>ǞïjTl&l, & ϊZqq%f,e7bb{k;@!dչlDT>Euo=wińbK 2e#T $H5Ybr̀?׆Վ"JRͤ|gl}?W/.}A$w|xN٨MÇvr'i {> q`T:鍞PyS&x\1TedL@hHNNKlzNut׵ΐԮOjWjϟIT`pa<u)zwvW_jzOg>%Ȭ~1ӋQp<1IvO )[I [TpK16,/m_t>E)ғi*Ƶ~;D zg:h#ȊdiN80+O^d@%'9O_ a6 T[o}4し*ց,ʸ!V*%qe&9J@#pļAY 䋗FڷgO9Wh~u9Zmp86]{)ȓ5 w@%H;2%q2+ 0 S`i&e(qՂj~^Ol$>RDS[R:N* Q"A=pW@d;[1Vt/4Y )GXw!F\*hƕ֖f\ [),UdBJ'^+CT_u};5MXyKFQR.pa=ȈU`>v|g-lQ_{})zy yV#wyS.~斛y}4< QA_*SYx.:!)!)y.ʊAj +om잦ͬѿdvT(岀eXne#jHj3]^ruq/2w^d uG1J"L;bBޞۆ)Նmqׯҧ#W~H%)<=f 8Z*q߫M}>+2+=* K mGނHII SJæcig7ALfP ``Uy6\k'Jcgnk*pPJ/YQ 3ap,u2]xett GT%%c ahs圧\Vditzx][,5?s˛ T% ߇n<g/Pف_]clԒZp_eeʒPX,:boB"q7۸"|G=ߴkjxU:#:1Hd`Xܡ+U~_cs^rkAo2V9Ԩs.ud0޹֑MuǦMzp !A4{цKc, Һ{Mkɉ $([6[P[VFy4Y`)'uݜyEAȵ!;6ϝUy@?_p^ 'wxUNGj,d =d3veezOȃȼEw˿E\Cm\Be`;[׶QSֿ4|{$3].9攌.pCf}Cej:M*}kf,׫Jg>lFV헳Y~+ '7`ZNLsNisƬ;%4?M=0F/DԎV*= yt}&%ȻUiH-Il\kKҺ=3D}.Zihr^sa+§i5Vnİx7j/Seg(VpyUu˧g7Qyd(8ފ%.a ؜X^Vwb􅘧UFXzeaWоܫ:t8_f )<%ć)e"4 Yq9U|ڲjɘSɄ۷+Uef>aKro{Lb!^$\eGj$G)ĀO8OJ2xҐ_6Z%.e 6251FW `<_ؾ̆b<5bY&3OtdD{!.=a%5vQ.Ɇ%d&fdOLPkʂ1x++m;'0/2}o.ZK-73ͱANtĉV @̳;%le8;Ưua6KZѲ=bŽūi+: qy6])u9uʇkck8ofJ}-f[eՕ]R $4 ]~=-^EJ\`h-*Q? ϰ3ȣNǖU_M3 7lвgQ_^{52F9U6msQoMY1?Ss:EaH2W>|[YF rcWcPLWlbqwV>Z/ J=sgA'ƍqBKn:NΝ8h+&fhxsbT,Zľ;b,۰/;u>~{nAdJOuXg+ė0 DB?ҪY`޽Xu/mpL>hhR6ޏ;Nܨ⥠R!qYy\R–saR q.ſ'K"@d9< JY2zK@RUŃc&*DNn$BՆwf$$I6ًQڳaEhYFNm#hĵ/KηrMv^;RyE@P'"f|J?7کv3J; cb>/|iNOnC|\~(""Gwč5JOqwkrt|infVU{G-Zݴ? >Wa(/r<>/ #5`2 !!̏ՒqAT`o^7L²Y߀=SeFĝe۳+XYd5YY==RIΙYc%Y8~ Ј^$Dgu[qM7jgIVr 8(8eu='4 $u%{7;e{i7ܭG0۳n&&v7p[Z5GiYzh=uh)AQ'QﰘdS5eiv˝Ae}; T*ӗQ__ *+¯? W˾яHp7^V]*EZH9g})o׏,\әٴ?6enNJ8|K ~l#M=Zی>,8c!YB'@%@iЦyN\)B%ܘ9B(!VBB/e%JҔ̥P)I'?% )JJJEQp 9s"*|/$G,Op<ӬҸjl긙u4:3"Th1B7jhs&^ F$rX̋ 2\TUVܱwnf2QUU4kZyMeM(`I"nI<(UurcXRI3"g*rEl7J\V*U8UUMF-SZdLͳ4#cb٘o*aMa{†d\Tuq.YǬ^fG TahjU#70'ukpf`F^3ǭrQ9sTiaTEI*;lK \lLyNDA@˹{e\B-6f9u.)VwKu],*iNpM<43`d\u1d]a(&RR$lՑBq )yxld%(ֵ9l+!EڐZ35`gTFEL'9:Wtۜwu[r&.6h:"vg9J bvڃ{ &Wa< C0Tػ*k UsQcSx[D؜{pݔ.,q@jo U.Vو E[0Dimy(vAfJW#Jr+(MZfehͽc-ln(A#uC qu291t䜹M ӬV˨V\YNHxMF#dӍ%ZYzD2B'0TuWJUUݭ"ByuEź.Ern#e80mʌCoVʙ'&1pCwv+"h5 z̭sBɱ &^\QOhXi,m\+wfaDe "Kqٮ8>px|[wgʼWJj.m΀@&:EQ&$ʜW.\5ZW%e,~}9r閶񮠝 v"jb(\~J'|>4" IB:<$ChQ(UJ@C@J(RPU*( A+@ Z4|||7U7lJ4&@PA@g8)RD>LSJ9"%ROS!}z_e#ggxnl9QM7XueSR^&Lʅ`7T(3KjXl],"TQ\.#=G88 @Ow!* @"(-9*:8𳿎YoUC+BtJ.BP ]H"RO{|uq+}`FXزgF[OڜnBE} fTOVͺua^RYDNw6 24+ą# :˙-Q]p++jǽyb$}uy "ۉg0w b3lO{k7KFrvYXEP։Ow|k0Y 2_R8t](b9k(}+3L9`)4DFaZc)> Dy r:>B-~cWԄqu.K;Nn aa>G:ڍE;~tӿ(?]oEC]~/ن3I6 At^^7쳔R*x[&${NܖnY@em8ʤ7dl[|$8;Kʫ~eQQ)Ǥˋ5_7N3spNK|+/RX(j.~Bأ`Wwiֽ1)V|]nZ+_GϾWbSϲ*} ߌҧ8[K^ >fSWk*TTM;?e~$ L?űPUHD t.|m>vC\gld>EW)җ2״_S(m@J I 0BOҴTu 鈲CqVmD(UBwq!Pi?Gw٪|` wB.$$%6tP3yHߓ(b.nN=`2u (m7im=,kX|W7z BK^3s0:(>]\%ke.E e(  k듡@,sE-|CLʫ(!c@k͓/~22k~}_\S˻D•uád=<8^hcDeϔ@ s.2W\!9/#ntMD(']k.~6^ޮ"Em ?.ޑሊo2}\rh`Wqo~!{k%{e<%1+agBTYȠ]r*pDJLיIsǵ\0, ؜-ie3̢ 9{Tw@Ѕ+ +GGF 4aȝLNh[j=c#j"i^,1RMxoSbcFF, VYȚ!u~_6X#R*J8ȹ@UBH:/i nGϒ{2_)~JGKN}J&6s׮=^\Q>tsgQ5!"zmGR22_pO>yJ3'-k\;;$darR$լ8QݒL0GD`6kB =vJ A ɮOK)w>~k9QUhP*ar(t 'u^u )RcΊ?CJs}Qbxd4/' _IMWt5ʩ-mFz;DnEBINO :s!oGq0oH/ƾ+KI%EWsDGf]'%ҳ|&́7!$0ۉVf^5G^k[mm$)KtMg 5{8(H!M6= msfʷ* H0FXb.!~d@dw(a%BJ5qx/-u?*7mlkP)ȩ>MFHv _T=Wmd Cfb$u:{NJg[頎dHW_%TK3yo?T(GԞ.eD#T)D苶v0MOB JB*UjDa2NS{PfvQ&0)p:oZ7$2>W#^4Hu"kp\M"U2xH"J pyWQF BELncp:R8A!,5Xü(YcHvq̡k/sLFX0BC?15o[̞MvchvnaA%;3 25٪!)їk-#$'fZwT L@%t`(PDV*ۥ5ZA|ؙרd=͓"N8;w$ojeE;EmfMDȋMeAUȲnb&\i2IYFV$ qֲP7,JCB%x&@hQJAܭ %?~o~|8w4vbſqe/#3緟ǧnz]mF:7׍2TQ]WoeIC|͗.ϔ,t 9oβ@i?g_埳}AƬ;<-^!w˝ƬiyK^=٨v+!ow:\#ﯜoxEl)`ÙiGw^pWʣٓk=Ώ;g8#c[=o-9=?t{ A;7AS^ ;sP EO۰D>*/~WVF+ Ҍ{e~+Ӈu2Dwϝ=\oVoO.L¨z]=żVYo1i Ja20)C*'%"@P^W*@vtb5;ػHtL8,-Y)*34? R~ʉs!N5cg(˼,~Z|*fV?_3o *tȾvӤUب$}W*Q jB̈{4ukFkO94И-֯&cG׶RiW!C/ݚH+rʺ~ס'h{,Yn% |G7W7#pj l23Gte%z.ͮ h9h?'6Rb)RǾ{r> Q3c,[ֈ+hW>f"b!#K>U&##_`]9hh'Ҏ9>ySJ`'?έ/=ocmܦ Bh5>mGӎl5U睕tEE8pHjo\((g[yLioW3/POp 1n4}YOzR?O{Pܫ<` V RBxgY)5 SG^9p`'"3Β׆O(YK_)` ʢBaB[lg-{uw.*=uFJNxhhop*JaNm.{Z{G r X` 9̡}唴:oK[F}zފ[>cO,!Ev^#S=DM<2:JRw{D큥}8') 2 .NDLL2wwBm;,IJ<^=1^YQoXodAOdbv aXbX"[J^ꟛ,bgno_)XC'v) ( 0n"N Gר"mOM+ CGh$CD!uV ^Y#X֮H\2p&BA$YBq0r\;dp lCY>8ΚϝeyOg!yMg&DNoB6#a@zWFvp`%Oɩ)| DAR"C'[{-ERO,Ed"5~v(ԋ-|ǯӟ]-buidڄe^~U4~5]Hu[9b]ISܹv|J% dzTP& | w4Kxm5ރʬ7;+g;kX</ncji}b@DJևz>L;дSc~[vu!yf&٭LtW|j9ѰCF맍B+kUR@3ṲQOsvwݩ /U Y;2 ELdr'ۏsj4,y㰎7uM2'Ӟv랄sh{R +G0IJ_|6<W  Y/& `x{(<}UM'?r'mb7S ض߆s6ێ8tun?%hAN{X:(|ؓ1-+-(h)gSvVzخT,ڹ^zKk+<^ƟOkOiN%6)UI??;סQ;w-yl;:dp2DbۖqM-Vb]ᬃNHڮ̏{F~UF^\f2 (j˜G UQytU 7Zlc,J'@t쁼;e,Ο_dN_w`OZjŇ?EȒ쁑&M >lCyKg & “"K[,ӚOVE_Y>u?e4_tWyS|iwO/}m颋v^{esY`U^W~kG?u&|+:SrٺՇ5X!EC9b|0 󏌩~*:@h{bGCHev`s ԲD.WI&g2?[-̉G܂Ԉzݵ7W;{x|{ȩ 05J]Zq)# * 4#;9-'(9)BCANҝm ANC)'K T:3EdPH;!44S!S0`!G<@/$i5TR:PWR4SCBi4 r(sMA%B@"Tmҧ )^b{*iTaAF0:9AQqICaTh)ÀiQ+9Q̕'"jF  ܮ('yrX)0Uu $`GÛAsQk]r&S Hl-4HbSL0 C6@B UGy.&mQv VĹӗ7*!G~(Ek WǠ`YWpksϺ%X^xo?3?g+W:~\R-JV•awT'a޵T$DghyQsh c!kr$Ab*O?8|2vuDWِG֡,[Vg{rZiJҳL2eױ л0EhR M ug %%}4#(W+Pq},d^FAEdB\1> A.Gi!IN ?8E:z,r&pn%Ȗ^L߰Qu/FeN8Hh=V$.j6r^ -?żcVqoU_1>d7Ѥ _vN>Y"%VmEiK?ڈ>EWcTuuy]rwDH ʲd%&h rT,Z6(3? N:4K3%Z<,V D(Q%I(Jƞ֏r^jF8etV n0l9;\}  S/v݂ L4yQL`v %|LI !UU-%(]|cޯUE,# $p(#[K,z3P L+ ?M9(ڠ2'r5/Jq2+chP/p [^6J#)w56 aH )X.M8}jlt]Z5 Lt:T9J}bӗƓ-ᑥ!x~v2Z|;}׳Q{~@~r?ի?=gYn.xʮ'0}o㧏UDWLr7UIx#J #U <3Fo8gOV̬ȁgՀrYW/+bnpKD;>N"ҷl‡2W`T^LgFBTRn|}UAI{.: _݅`STq7L eƛo^1jD#b 8e 1R%%="")뮳 [@#]5NyCaPfV?RO|f^C e(گ^itkEDŤ[rX Î7s>=YO_7\:z̜Xͯ;ӻ_YكZR+~й9bd"{3<UTvM{Jr*LUJk^m`*?o/l^"T܅v5_ljVn/Ԡ޼TǾtazϣ̣_Z BYuJW,mx&*E=R_'AN;#_}y~E._%f7}|U]ţc"  ح* AC<+NW 5v/vݲ2!Y(eU]C=Rq}ڑW[Qe%Mg~}3LǾDdToakҞuMzp/- drheBH{Fy;&${q0/͝m5>KԿ4;`U S:_yQ?_^~gSap i k\_lӚ&]]u_kɔ||b+,\O)o rQD˽QG7o"\FD*㧔gC6LכKlRZӌ׀Z1gi4%" S/x{[{dxPP,nĐ+uq kJ.5I43&OoM6sz2!8*FB'*rJhě3W14ү'xܳ(Zӷۏw$'O,CrӛR5ɰVgtUXrG2n30ѻ];j,FNK QX6ov*i$ &/D[G)ӵ:oE吶i\'^ `-‡ B9\=γ#P֘Rʽ?ZIcoHY.tp@9%?Q_PҀM 6XO˲d$ݚOta>y6Kr {PH˅’ I !Ab-?A^Ou1u3 k::-h:!N[LZC3ľ_j..T$Aa  Džg.9w?7` %.QE~s))j*OӉXkܜbrFQh%M#0Zs͈MV{9j;'vpWΞd5aik%@v׉>^ko+lWLM\PRY4\0##)oه6z_M//Z,O5wzs&3-Q]2]l 1uT`βz|WΟ(>7mr͟aLTXĒ}bf_,xDczb%z%ςėXb_;^m.[[B}mֳ9O#ޕj~qyS#\p OF۾/袧SϖR^GG]}7;+XI\d7kEK館Bm"?rӭRCf~$o&hvy~y8xaW//||%#@F\Msk:yLSϘxW]e8YKϵ"fnݝJ59ޭr#q*+Шer(߶ޯdG<<˖ T~r^XoVr Wޚ5aMJqӍcNjdj#i8<]0}t{ |ߕ~÷^ld;ڀhW~,;\Nrڽ\hi) k'8pǦOKl.1]?ʼytz}Et^YNo֞n}wQzĄu;׺e&F/:?eiU\qTUc%oǷ.`f}GD}IF 3ntO?jRD9/xO\/!TTk:pevKniX"D*V/ uӘI?]8]asRP[ƿO5}q5^;Hlau:kdz~q}{~=)K Cep/6 Eυ5jt@.>1Rsk#h? ҲJ\ >f&\>zΧ[)8>o2I&d0eUhM) K\h7F*>;->yN̯^ . E.涝8UQJ\*~OigUXmp #e"mŻ2y*;av$" υo*mI PURpYL;歫..˭N#L ׽i}Ɓq')ZX- 14''R|d䌩7mV(Nv@y|- M۸wMǜ+UiRT )fWsGןPgDEXnaȶ >Š8W{7nਜ਼O{i?c=>xffoR=;bÊۖqkͭI©LoyI(Ř6%yK&Ψ~n[H^G6Y /lU<_s ]?PQJ%.]_bwo'  Az'-9pہyq@u㒲DRJK) FE4(EW Y;)5Uf{Q\_)%_ܹi[I/MRQAC#Kj"p7q $JqeSqK&Tvgɟٿh-ˆleH*KOaYQJS5P [#43J3d´";o>" ͯIïE5L+- 9M.W,5nqg0TXXdv!u.]ݐP]5UkS H ,@jDxcz[ `pJMx*D4 U8h$%{[*(zK$س kRڜxԬLHQX|:3뫘V"/^qT$9^Ɍ$Nzߘ_7㰫$B@$q >~ȝLxVdbk,dn+[O E%P;JHʁXw&+IS !ׯaQQLA$ʃVsVAI; .Ga:.u;0M6S*DpBI$Zeޜ㘫K|5Bt`%ћ\vݐip˘=9k>M[{~<+EvmMOldv"Օ)V6i/dί~-P˲elmoS Dx wP7f*ͽ\ޮ3y-"&WU V_)<c1q,=eBhţxehU}/odFչނᆗtiK=glmoWuѸMWc,iU!5ВՆ}|>>l,/O!:l[ɿܑi)?O'k.~FoT9)A"_iҸoJ cNㆽ0'^km9{U~Uw즘1ݗ)[ד޶mREݚ'߷e|+n\]evykVQ9-HֺLL08PIlOIY9z>=]z+MZ_.gy2ef[RKN,E婝yΛ\c21,X$Y<;~ mUƗjoQ¢*=ռюTck~ RJ RT7pyM, $H*&* )hCLĹ,b;޾;alFgEcl:h _$$ᤧl"4b-MD"b5#qňO[o?O~$u&\}cK:Jg9™p΄ڕFҞ]gݼ^*#un^|7I\)m׭/w`/:|gۖr]YUATI}|IU@DY..\M`H !2A#GBJ]lʪ3ֺ?˶kjDw;Q|Tg0iEz%*ɖkU\%iFxx9D(SC#=o[7D/+,zkxx)"}&em&}[."5l[^T>Gs4*.K>^}],}7߻kUlSI#C9J):wj{{i=6YF1߯wnZ%^޿"SO^2r/9zxpؙ[Lf9Dz?:WG{-,yp.=Nk_0i֐i9g)DڑVsuSl:-u^$<|ݹ[/;WXrX]6aqNf4f+yiNFb" Dkĥ"?Tj50Mփ }k;Ċe`<]39V//_6ӫo~29 xUZ1$8%L{bjtm80yvQ,?aݓfE [F>î%4$*}몶lXL6|QG[4Mxϧ. W׍aCrD5.ʊHE!kϺ-(,bZ)Mq{E$@4s4տMJˊz芅t+!z . r\([{AniEw8T۔]83ֻ3D9T.C?W$g˰zM?CA@ >TOp-Um+@5͎l%)SU|GA+Tcn3^Zy Sq;P3gi^$lCc#vRooEF:_VטOD8$rӫr,gEdpEJ, pkT#EOn-i&]\qa($Dr޿en2leӽ+M9Sfj5]Ý UllTwF ]uL[\Q;v`_'#40{x3K.SZW3ڒ"d]~ǒOC"[ >T$Ïky#Ɋir#WL- PI(IitD5 Joh7SZ+0ٳ𽷌z]3(re4Dv3_G.ŷdǿ(.k93?,ymFćEi;(F [fK~̡<YWc18rʥ3$+sôIBBirT!J9C!K{??G\%Onng ""%#XyFײ"ٙJ jj,GwAi&"i2t'N *Qڋ|>`^`g=Gjr0y͘c4~ܮo:SH71R ZPEh_ˇ4ʀZ>;<)FlYT*NnDv{>g+ \O}\龵o퇾t)'2!`]6*?],JX9QGu@VɇW7: 9*1ibcNp*E#6{g>3aGG:jou4[h;KcrnˣNӗk}xl,sǯ8W Ir1ckQf<ޝbk~@u bS˟OdmqW]L&`cpUM<5xnSl2@PV]s΋< ώ^k 6޽0ɳ*sz!\00rYy[#n Q%ŒMCD]4Km^ LSIѶ(ճ 4™hĭ%ޔx\ q£_nCEY>|r,A$ѵٜyw= O2+p0'TE;ʹ~/+ˏ箬ث-Q=\=**p~CnR\ӭm̎MatD]><6n % E%Z(}a梄=@al[~cnYge骎%tvߨ䀂r H(HDXp{Q룹cE/=;)CF+]8ώ! pҢfgk -[Mץ"  DuUR%|?/tL$|舶zP&@P&ǖ pdRUa4?cJ^9׎Zlfkd %A̰Z, R֊rۿ9sKgcLfi!P(K<2?oa_:57B 6I?WIy,s.khhh +Th$4G"8 7;bZ2@Q(IX :aK_ KԾ\P1s=,tg3jIZ8lE2chrbi $@#SU!y:A 5u}Dӯ+Nޣ02"Jj+ՌܢS3Ay2V;h:1^b(B9DMAp~}X[a^J?=vzH&/H@.-Qr.KE156Jnᗒ3)Ѝ&3fh& {y:‘X+Q W{0ݔZ2ڼ$(yQm;8/3HZ0&k-tZ)M xFx-ͺԕ* P5_X PnlSШd?YV2fXC qRyw;{ΩEj0qx@RZ#Ȉ]-E}{1cJjo~ѰPB 6O6$ߵncNyٴ pS8w S#WVR3)jɵ0 >.4bD9"lڽ˧+z@bs;G_2AHRS%eŜ!bpP#,~H?:vt VEX* oHZ2AEC>&rFURk?-%/<\#QDJ"l{4 .?1lOZB0ߨ#DE \/r?ɮE@=?T;<s1\>HΦq[+ &b1/DBٓBM&:aTz J]y`!.~;(GH 1 6 "m0KJ.gNNr8s1k(fiOWׇ#붒8v ?|bJ8jB1%Dτk-H|]DÆܔkjn$֜IgNgʉQJ۞u{2iYulqqYY~ vi6 0i?2~k,V|q+[~y-zKn}|䝷r ^Ϡik;ۿ!Ƕ(ÃΏDDAKY @ !G^o ?݌}78%`Z9g^ǰz[^ı!I* mPC+aR|Qٜ;0ѫƭׂNq%V*`Y6[}փxW0NǿG R]΍b6.fABJm0+Z끩#V8 j2*"[r*`{;rEDj>6"8C4>wַ)[l&ۑFgP!)n}ibisNt 1^9P7~Iߨg9\#FRjDP\8*gLʸz5Wǩ Gp‡ѶaWɴ#?טv U<}a8 "aYWn-bWm>U/j*|AnBwfRHEZ)1lI?DxZDĐׅ5՞75B2L9ee=~LC-'3(v u]N]*z2Z\L , 4CuZ 4(P IU}g?^s AqixjN=)ZѵO̘r&RuUs[aAe؊PolQD׍j+-XLZq5^UsP^L.fyq#Y*q%ĆRdXa:|Y-j)mc6;665hGdwwDdfI]$ѕSR|q _ E B #0MrErS{-EP<k: r@)8\9sa{)ZH[93A&y3Zr)WEd&^NU* @P*\r+g^r|wEgkswc#r>GclJ >J*c2 (S()* hI! !&ii"dH  jIJ@$I  C%P29>G[(A>zj g<^PH %OI*==ڿ7)M<(pY|_YOH`%]!.Gdl5-X/kiahVOxŁ.(@1&&|1fhg3M<_!YG{v5D\\oGՏk{cVe\,ޓ*6@ B|YsЀt h("((P$gHgS L\F*v9ЊQ@ݽ7^w ) `[S;8AfZl=kӌRy0I#nNKMh3n¤_9tm&xԛ9+.lOe˟uA @a/nX87lH[3?F;Kc}ҥ\,@h)("hNf Q kAg\5vB!&k`pЩ$2|5pJdkK?mr]*8R I8×@D T 16;+yskoVATLEAH(I@I  (e YuUV#xFYzS JwSueWyDE&P(L=ڙ7mDez׶rE:NNe9|܀DK9ipywe;YʭFWޖ-<<*Js?gvne)ÝQ]E 6f.of2jpI L! qOnIc կ]PpC|x߯.1Ad 4(U´Y2裛D:rȕ(*A"bo̱ EBfT Jd Zҹh`jwz_bxZF Ɵh7msh]dtZsY_Jg:o;NX.q7򿢁ޘ qr+XQ7|p#~ 8$|p3qeTZ+lB(5%g".C,F6i2Gh˔<~h5o:^QsKc~f}}܍!T,晬X,>V`Iԇ>P֘kEDA;4^*9C.OM3㉾!nĖ."96|v%a1]c9[^#xf 1g28[36wVq%\cd t~al<ŤW,E1dNQ2  7lY/PXieYӭc?wNeZ(nτK/r]SiW{8%xodXJÍ̶`0P$4jL =}\ӈB9[A.`e}_-d$ ٣ʆ6`YZ%?de?/3eU`/ߓ6n7Kr3_^FYgofR&ɮݥ $CU"8oE[Mani&< uzۑ=9IfW[Ȇ p\-Ym|VYBʣr߂D%>櫑5MHÍ-_t*SdGL/yiȱug~KRE!f)wKfmǹ44{ JQHB gE&Nav\?-1΄HKL5!i*r)6H֭ґ (8PVyXg赾|ݤfU?[Z2ROnrRc2W0ޣZ/p&-.{!IQtV$RP)uRy$Q^ԆRg|c]oOWeWm-_3V%f"Z^L+hG%ˣ1>VtI 49GD>A@>yկO2TM,FBܸ;:GФ\fvMv筲ƒ]GI/ʁ6& SHpg{i-8)ִ4TȊFoxKdedr0GvvZ @˔TA"2z8E[-GuV͹SY=,YF TLX9!qK-%uq,RBWnK.8Ir!@9 O"ráK1tVܪ*P (4]JJ1z nQ#QI(r)}'mF{z\ݏ$EN iRY{ǦP<|qNdFR)ZMI@dдRd-4Rm9GICQr;[WOvVdQF?j̹=͖2+.ov]zW l 1NYan|g[OLidkI7e}trnBXJ^yFf^뾊&X8|8f0z0k ]cE ؉$mNQ 3ϓmzp_GR 0S0;;ݘ=j'A`Ҕ6 JNsN 5CE 52~uںQ=s-EH$pu\sjEv4DDJ" F| fω0 ńN0Q,CB%BO|: =oSj;3lt4eywX\ OUj~~z];6!19K(~?W׭j] :CB%HyHkCJh< ,J_$jMULl&'d4 e\ SL4l97:jYGb*rYP~w]gG3F z9+x9nlZ(5Z +WMlWc 3N ^gg?iǗz[iKWӵokDkh? Cgݓ׻b|ⳖYKWv-iS,Lbg"Bf;ptڌvFy[.A%+ydNyơٚVWN/iW>WNmWg -۫\7Y7׵8 wk)xu\ kOlJ=jz8\Z\Ӷ-oe%O*cW$Y7j*\bʶVZ&Y#nN 6/{5F!R=yE0;x >2aO$* -N8Q5 zH$PTVF/9ws5_>_CXф*`3J=,c.ABY;7}\I_[6gK5]ybd9]ӭ-,mzpp܈e`*&~Od"0yEvz׏ A fN*3gK9P$7\QwrnunXl?ոpW E:-Y\!$_ Q5YގH{Sՠ|[+9a2Ҫ7W4/]k]\JRIx_Gr?LP2EMfoVui~sqqb$o LQP@EA@IH @~97Nm43v"5ʡ.ʺ\lӢ*N -_'uu2=n_{wv.gUP {] fS?6_e+sY{wէ*}q0i_ϗqkvn鶱lEx뤳?׳:Ík6tiZOgZ:_[?4Xxڍsot8}Og _/ɥZc\[sNp-ٟݒ> :?) xN-D_l?V\p?5I!(C y=MyVe%,4 -S_?F*@!>j @/Oo|G+ ܼGpN,-95<3g=5Btͬ.׉JgV6#UG‚P+g7AzgO  u<|ϨebERWCfQ86Qp5>qȿ9Jb:;3iWvv9ahm(SEza;|(0 ?(J@?̄ J v@|C߿Oמ-Dp#Ny/b_!pt-OׄW7̸QJi\qWE?¹|n'C!h8?~coVKۯo/g忳Mk/[c쏇^'\F]Bpf}W^dz8N^V!m!__g}9Mns0-\w?|ߧ߻?kᕶ2~̈́{]d><b:hM[8t;%|*yhJrYzx|;ze$7?U{羭ɹ݆l:ն%~َj'nWOmnt?kA6re*YtT/y/Zsץk-Y ʳjj?|GlՒں1iO>XYy~C'#VJV-EGuFl1CZR &C-+i|ye3_VaS_2SCS_* TNHWۉ&j#y<1UU]dZw^fq%%vVe˖{ޣKgrT+%7:43poI?yҊ/1C٢'Z"WEO> ijl"W;6~IOX;FOi!KyZn3K5ZGrip8o5S"כD֛cz\WwVv%n2 `Old 7",ƕgΊ ͏߁Ig6T#ZZ5Dy͉vUum[ZJRY ,| RŦz#?~\~vCH8\tQy{1/:֑6<>&֋ 8Sk/ofo[ܾ4u D@_Oa$V3u2fIhQBiUZTYW~_ǟN`NcHsVÅ;YLQI"`3ߘcf'Y8?ֱ]U 'ԩ0Hqfd@16^^Q9@m~ ZiqeE?1of5hA᏿_XNf5wPJ)H1jP`IXv|uh`9(P2z>3f睄>~ ]p;b-.Dգͧc83<#9R ""tuEd IIKU( Z3>fDyAh:%#pv-_t(9 X(Ki/(q 3y٠v|ybqn`UjS>=w"`S9!+\P9-bx[5Cȵ2.du^ւMxoMHfh?YzE{uP%lT .|Qf!pDAz=m١O} 뭎n|PQQQQTۜ8DQ~_巏+E2TP}j3D@|CmU缷rbNEŠKq#rSz TMΐo NaP"i@N d@u ջm78MC獾M H%|@9q r_xOfy  ɽoH"Y6?~kǞݞʡaСMG ePؚfdp2z_ᄒe#D%F9qwD tJp |4-8_o}*Zl }o !fK3Xt{i@7d(!M?.}8@@tp@@$t^Ysf Q/.35S4k|ES+D T-ke4D@*0p0G#<@ "1?szB&Z[ N0H2C25Wؕh=Kݍ-v5Y$~hz;(iDkߏE{7 R >ZR|0de%|ϕ 7 =Ͽ>ǷvC[UvH^8K !DxE<֬SGX@zD5mYRĜzr^d߻5au>~mM. bDB;|$:n|ߞA<6H9zxJ"wS=A;=;Qt7\5jSSukϯ;eQ~֜hV!Eq:}Z(>{Yuu " i! 2d Ze@wV𒣪r q>4R*M%!cV`HJbbwɯr ->gFM izΓ^g4Pn9}X{'&Gp n>|\.?_ .?wI+~D6utjT!gYxgWiãW Q>(ni`AL~+My}aO_:.px0u T79AAD{gTij%c̾\Nb\0ѝO}g 6cvoc~ΦjwU9(("i("N[p|#jnw(&Q8AG"7P7tզc_hqLUO6?f.A,0nJ:ӐDY=x̦5Ȕ{#Im^8ּ,p.0&)?$ zwar0P; 5WmS.U}ZQZD &"Y͇MųC|e~ٲ={M?١hl|xPtJѠңHBAUB.”:ןYVd!xqyǤ-?? j@Cc^~0v{_iitgJQ{18V>⪪nT"Nѝrf3MQE"@ICMQRC4PK05(4 30EDDRLR!!5BTTQ#R4U) >F{H́HGRѕX(@Rm63!]HAQ4Q2IQC 4TTPQTQRS@EMPCL!DEUC 5!4ȱ D 3-UP4U!$D@RAE3DTB$0E$%KC@Q1R-3ԑLD DQ3qopQ;9w&x eyI&H; mE W[e<wxq'/ b,T1LTLR%4+TPDL4QAM4P$S@RE %!0D%%Q4LAMDD1PDTEKL !MQEH@ H\VT$=Lc .A:!y<;I2O)!Dlq(Os{NYm{8]>$ѳIa=^wUL3 )"%bh FZf& R C˦cq)S3nٚ,TO#;؝fvi6y4R[*\m_ xkɷߞ&kglJ<,^Yg J)wA8mFZqI}Țksq/}%Nq178؝|;H:a: E2yA)ŧ2`rӁE$L 6vʌ׷ǻ .ЅC3 Pĥ5EmvivPone7\^ös||K="u}܋k<ɐTgPUƆwa-T1Q@L)QE4(!5 +44+TPH@RDQSD4HT4BMPD03H$RM !A1%t@#ٛTBjn""O"".rТ$YiPˎ*y$+C̄_DzU*)1?c#jm{jHeJ"!)) (fa`)H)i(h""f YJ%bBad "Y*$d F*Be ; rGa9PW+ !du*\,)LÛjXdb,9L#UV x ÂLҐrljfB M`+d5K|#Oq}! $Zs#Tnt-:$Ai HBX$D n@XśhwFnoF|?D6fqo_P9fi(U 94Mq_I0slS‘`Ohq5XYK e1302hG4 g.A e Ekeb9&f`$09v\$Bt$rd?v?;rYqャf02v) h4-,!`;Y(X>&YI-zm56 AןdYk?}e3lv/O{t,fĚTP'^&QOY(GSnvںuu^ϩ2ܥU(RkTZFZzvCu[q_&+yXTfq_M+?1CN'ղq*5pM(6.UUW ?J'Wq)oŝse:i?-:Je(nӹe-0牿<Yq|419 )*-%ϮV̡kӼi)b!Z◓d󈬤]C>v+Y2|y@l\].#oiղ3_՜ǦgK?~"%:kJ[+LDO ^s;3S':f4pV&1ەZn:Qـ^6sP3ڡ[zZ@+d>E% `؍]l"E)~?AG~R8H>rR3 Οˢzs\1ts۔d4pގ*z2$(BR !R!0|Ghq6 C76'C0?E1w$z]xJďT@8@->aS@h>?r۴ֻY$oq JH_`y*b1!da]cBm 緿*d3{G`<ѫq pYhn m+x?YRS [C0 $@pC BrP" b)|^g2FP(Lp jt܍4)RROHY᪘qig͟keC0O갡Ԣ+K\Vج63 m54sWpkLrjǢ慓CS<}T(Vw∪ dt.Y>H00Z1:.9l8@)EVB @hhBiUQfYa( ()@PQ4aڂȶUi$WRuhsM~)Aa43gxjyw @z A1?Z0;h||̻W}PwD$}j*8 &.QEEE<nmaUr-x'9X@! 2 °:B|n#m+F]Xj EH7v ޹,IV,Pup0z4& rTAkTs6+ 蛀5tTYBh-^w"*8qI@t;ITjTr-6iw<dRY|ҎZy4=ٗfe%eboeB{TIK:xjOx#ЈDb{W>GfcL8kJ 3 @*[~#*?aS]ܛ∊L?wlǞ<9qh*J|L= ) KsIcrC -0(ɁdT܍LrRTPࣩZpxӟ+R=:%yUeBaшתкq3R)8,-g7>|OP{FJ H}IyA"Z:zb~?l؞|&D2/1p +4qrN $FhNֱ7j{c]>xΙ<_ (,GFM ->~9=Wg?_<?.xQ Y]DE)蘗#Ewniϖ$mݴf}e!rnyΠ (f*fR(PI,4GQ3{*erpDScD"96VL_<ɕĘO>C7~`CDב.Pq~ }UWs!y1DE )*KNUB?u;\P-xv&JRU. Sv`Y!"2E2L'Ԙ^Sa&"HЂExP^?]'JM"|2-P뼙N<?rlBν,w2>ۑ@PA"O!C-ْ< Iå^PDx4hhwٟI'i˩_Dĕ j>I@gS63`< 8>6$(3/ ee29}Ͽ%ىh!Z)hn^h1i_K1s%"P$҈Pl%>Weݨ#a&e4RD1(@Z w='tʦhN 1W0ő=F+F$p-4Qdaȫkjna^OmD)yh>Svsqמ%iAEW(vVۭ߾8Ϸ@t%/^T#D؞4Y[{Ɉx _`I;(>=2LxGܮ/>M95I%4A c7&~-H}@x0Msb>%_np@jO6{諞Zi q0ӠJNfL5F (+\z짫`d>QQ#G+ FSaڤfJذd~}5>r]}%hEC& XemPTҙ3͋3LI]+ROB2j&bZ3W#z6 _ 0!%gw*HXM$Bu2lݢuJ($ BW9I11KOC(IrM]AJ6ɱvJh7aʕYj@UV7&@ :1bJhDtBWa0n0f,ˆ+Q]°R"(( sjzpd 2{p8 vtv \+10B(*&A@ZEQEPI 9pTGÆa0 뒾[H~u{KAN5ȊDz,ͽJk-i52Nz3䣽;~}*TMT!B`KE|cs)'$|!莅0?P~guyaʹuyF㹞/ך^|x˟lwA2?.Ÿxbr|C<r||=(@F,$wTA:B(I@<~HBH咠j 5P4]T)yC| P}U`lO) S񷞷w;6(50aCt( Un| T#hM zom܁@$ 4.B@qWUu <\\q x㠈s+s :zqXhMqTKzӛ''8&\9ɉX9wN||h=^=uD2ঠ @~h䂅*EQ!Q l&Į쀍x9~EyU|WGLQ&!DM؍Pk w`3&rO( $] [5i[D G7ۿSS{'NKcTTr,h#1H%S! ۓ;NNg?qM7qos?.C4kM_/hoAS*ǣ~cD? mW'?+ο:W>sq9^=[W;:B2&Ӱil#>}C&w>q7M8d9(N\Hic{?A{04t!f+6cb(E H $Eo1KK\9OH #d26Ӑwx+F/|`^X MA'+0x'A)BDÁFRҁ1 dur)6x(㐙4J]r() kfN7Ju>1\Е&!3ԎE=zp~~ !?X } Ay#D^Ƽt4v6!,_nrepgTBbNgAt7$S3S1== z8μMݏY@8ʸ(8Y*@g QDDpK|pG59z=MP /Ka瀿}OnĚ!@HZH F7|0Ap_05Q4u;9 dPIS l5:}6ۧ(sSvXNF#;Tt@5/w7r l>&`s瘊s$m{A x󿨎jT8@:(Xt .' #cNFC^e<}5;TU@`!$* (** UĮ!r#Gs<J.GP;uP;} Gh^9s4q Ce˙c@@=ylv|ׄ{n2xS;TL!ȝrL&0t-$k<}bm.tC~ug}xSǙ"]@!䜥 jj) ih($b#]J@hg 6=nw뼟BtI0(`Ӑu'ʁGp EӗW#a]o43'aWC4'r Ñ`h`!DW@xp#1a~dvJ`9BsӴC&ջd4  0@HL(O7O$۞>WA?;vndO/x`QٺCh_{ "]¦)hQ?wPk|NN=Nt\z?LẪ!x:54'O4]v?xvr;s0ОO*G۪x84l`p{}ƒ?/n>gRsF LR"  Oh Jؑn~7D !#?V?^F%ǜ!TV1 wwwK;ouHq$Xukn5-{urK;w%W^݅evJAtcnekwKy9fm5hxX/i]mݣ^ם!QuK֮Μen9q8{znάnw^Y4;oD6Fmڳ#vùunm5$KGd{Ky.we-ֲo9hXvt=/x$&c ;k, Kl5TQbmhTb 5AFcmQU!1m YvcmdδbFIX#$mV5dƶ"ѵ`3f66cէQA1$$(@_wᏴގ2o25{5Ǜ/]Dq/޴$*u#[Fo(lJhA"?Y:!5sc|cWVʏ2z 2B u'GZL+F|b |ru8u`ETSϯÒւkeU!VD FVEU AE YAN@*! !(2, )*)  ) SذxOOEL'8䀧@ G }*ϦD=c˪ #A$j"((1j(ZUv5ŋMQECgNƠŬU)uh"5XjRDQFę% Qbӈ*6ZkAXu-6c[UiѧNcNv!Djbf"I$D w唚O4U$dT`{],"H,fJ!ш|An[-kwvUwweĕfCvzXoc[;wMe/ ݇]w/l-X5{z%YIƝ;q+ k e;F[kawn]o:g; ;wxl%nwvl:mXs4^׶w-mۻguwkti]:{-P06yC]pulJ@ bW)\VYT&"-E2alc X@m6[FEc\lQ ĖdQ1DEł\Xi# pI&Je)r*ԑZW I#1#˒+S#%U.\lEc f7c,9r-,--RiXE0H9X(IX[IIf9s(J-HqX֢ۖ l-)wѧo ,dS6owkC*j0w,ZPI2Ƞ!M*Ҕ P K "C&4.bh""ZTVb$Ba$ZYHXZ(h"&fbEbp`t倸[*-`HH=A91\$P)D p@zd=) Y4xhyg#} ?:X`CTwЃv;fdn?orE7EGF>:AA׀~Xot&ܣ/ض4FHiNUjzJvpZ(@b\~_skfB 2Q eхb( LHI$24TMM%CQKTDR)JB0E EUHPU% TECT44HPRSEJD,Q5AQD4RR0T4 TITAURTI0RЍ"D;^G:!t\dyk%|p" ?n O<ݍcj;lm?.q\?_~h@ZuzGJB<Gݸۊ|gA^Az׺’=! OBt=BPd &zo?lVN|} ll 7,?߃9ƿt69/.5 "JKe84vؖmw*Gv{bFnYgMtUx۰vE]xX;ݩ'umk۝: {rysr*(luZnv=w(Y;{tNIyi4XEoBޘI(q{xd)iFhbqoFz-ZYfi"۝'[y/&~||=bї';fvqE5 N"KZ(6 ٵHP(,M[Ah 8ZuQTQhljmljLmgbEëh`U*3ubڴsϺ8"JwYo2N98 ϼx  i) Ph FU6gَ^?Gs.Hzq]-kKgGFl6)6ٲt,8c:[Z:ؑe;kn]^ݲ6qYi#jd&h^-۬6]ݚr$;zui'6Bz{ѓ ;bv"wos[ڐI;5ogi/udnV3vnmwz/t۲뻓:m;G;euzesO|G&@QEUV)EN,,6aհX5MEX6Z-Ӷlf֚Z lk:F+jcAb#ZkgALf61kb -h+b[1v,k`tvAVV4c +XN* MbgX&JdLPL1*G ߼A Ӎ;lTgyX8vDՃݔ>FޤSM,XIv3pŜI28:~ (BJJi(T() PZUj(RJZOjx>_.f73n]wKwݺ$زwok:ӥt:vݜ{t n%=]a*SV;Mlt֝oKQ:nzQYgH%dؕiM=Hٷw!KfI^jLy{ܤ:&c[oi"t#9MKhݜkt)]wc%x^w]WKfMa2q{K\۷DlHETfmUk945;13EbFɶgAl`v[QP#,5DED4kM EDSj:"uD[jJX58h&LA5bh5clUٱhQA$ME A)U;  ~!vB4-_N)@RHLR+E BP4@ҴPP HA(#G݁Wi*ls+1[ hʝPS{Ƣm'OɦY2ĚuVAv_ʩY Ew1q"_곾=$~WH*P|ȋD\TI\c(OUn?*^j .6u! "z#PChET&;;*%p&byN,ɮk/M9gR9A"PT/^Ef}Oq\G90_~Zau?^3鬟A,\F(wpf 誙J$@5I4U#atT\@~R]7zf?J>=ƣDX ǻ Ĉxbx0Q¯N]bE%CPD Y PՀ&ʁu!\]UwuI8%N]_wꥸz+ +zDA@˵l`9A Ҟ,lW(I*崇; .}}r)AM$u_戣2'۽]?VfγI'ryG\2jz\?9Wn?mL{.T/*LM3ƿN.Ri>[kMp=;X~R1X#|nX H.3#dw=.ӏ!$jq9)Bz3~ohZ`Qkm4s%~}B>8/B+Edtr.SNKs8O`N=6osXt놭]*kPrGzxn$@ȀB'z"t>!qä)1!?ZE\|~޶k.Wx<=Վr_X}+H~79~aٜ>x9}CHhϩ=^Dx]Pz+qÄoXxf8w >@Lz`b dͨg0!nfVX\"iJEqnq %|B$"TȖS,k S#d&FbKY5er7힅\H ǫKE6|H;2 A"K4a'yƆ*ђZp{̲PvVT('"32qPP.Tk)Y摙ͻ&Ց""a:oҁCK S#gd|JV&JA(xb{9Z=v뱺3߬@Ԃĥ"~;w!ZnL0z?q?ip'L|_sq[_~n!J\hCP Mipf ǬTN]/9UrHF2:R揾!&t%C%z$UX$@J6AAb 0C(%bŬ]v7! Az~_&夿,:TA4t40A ݸnrŗ+vTA"m*Çpo&2b7Ka2ˈzp74,arNiɪ)9͝#܎יB;X#aWQ1.cbbPM\LlFnװe ͛j^-T6hIL-ll,oo&oC8p4OnJ-][0%#$Rm1W7vULTudž $ӥBѬ:aA -lM2 m({"NeHܴ3óM )fO6 [pN f9j!L42iݐ6nLNL\O6F !ԕ6q1 05fgph+SQ*&eʛˍvvRv:&SFFpD3["ԑPj0n5 ̍0mNwUn) v# 7a<3?Ȉ,"1Y+:XǶ:8рU4B&/dCw"!EfBz\OT&r'^V4RBwl[ziy`uh8V*uoMAN)P]d3nnb3{i[3PxJܚbV:S%rJexH ffwd3gE3`+{"0.k/r%kֶ9\7:d`ow^TIQZظ̸C6"]Zy711<; Ցt&ij֩N{WAY-x[ML'p RS%Bb2-vr"FE2'ieq".s !&jrAv͛i0+Bw\lEAWpc֘u!n1uDk5).-BFZofaײٴnh gw IC%KIR [b%f" qN[Nڱd9Lہbw& ʍxn.kge!W'#@"4*!D[Zhxj4!d nwNEN,PTV)EwJj( .eiFw5$eLDiͨza[*Dᩊv[Tv4{s.\q3f- faTu֡f^qK ̕͞fDR7E!Um;r]UQt̔j B݌Ʀ96ۢ!f0IݣDT2eNTInͥx+vTzceYW!%غG`LBc"l2,[ !ܭYI9Q&Bf1]3*):r&o""AT$Lfꢜwcj(+&5^\F\BQ͚ݍ#b7FA32˦ 0FVҤsZ"ĨN'4"igUˌ!%rgS 4pY Ӽ9Nb)ASdTmB+YBEVeY8r..'P.* uF !')&dsbnoNF0iy9"bȻX1)r5<64+ԝ\0"$^XDj)cgN 4hLTJȸ 99Q1xIKBDø5@܇s2꫕C|8os^ܑ#o7 kv $lSS8N.iYJm1byƠhEڐ9 ܉.:7F )MSjt̜73U` ^̪1 E`Y2gDT0^l̵c &ֲ]H׸gSEcVefUd2Bшq۱wwh$F%&R4ᓮĴaFN2`̭8l@3 2#̀tѭ [0`iX4D9j.rR/l AlVi bfeTZJ8($IaC4OF ,2Ms~s1qFX 0p.3`PZKfȣo\VXNG!v)|zu\"\GV`Т '9u)~DFah#6`lFk1>T>Gx^.`(`QxU~DO9QW_?Xe*Fͷd$;(w%4̝ oI_$ʞBk-䂈' "0*/xT"K1 rJ*a93?`Q\xsێIf g}J}ux%i~&%k?\@H ErDv0^W?QO?߁,;?n9I_ˡOҩFcsc܇P&^#*5W@?2*&L.@A[ 2 D!O0=]f ;*?9rs`DXE6YGP y@~B?tv`"RoF(??Ek5O>Oqݾ^S{O_]xDT|ꏷ3 Ј] "D:=/?+lbbPz j1PZa?{G8nZϊ?Gt'i][ڏM;@"v=7=cK/B/A㛩= ؟g~1~"|xWz;yj)$WҒ5c[.ܗl?֘Z?AœnW0~׬:B>Oō o03&r=P\1┈`>\=g?B7tb5ᣨxoV ^6xTN8]j@CPo^?vᏺNwã( _n>T| <d+Hw`!AotDAr2=hB8K0=} Mǖvʡgt(颰 Z$N $n  L&zj*_FdSHMv HMT!Z$+"X54q쀰؈T# ` IR3(ͬ@ oTD)FA gNtt`S/}>~'_?"'8!A:[zcYAB\ = M;(U2 46shs`7@'dYzC]jO;>9 &"r=b?W'oѨut4e=)צ~Y=s9GFo- }?2&OxMU-jR3nM(>>(? i,'֒f̉A1P:K'|A[F~4G//nq}o|q V PZ삱OÐG%ﳦ;w(lG1/W3JƏ~?aN\ttO=aG=kKoc|''BZ1׻ DӰ~h3e~>~[ L4FؠJ(ҹs3?a>iy@ADĄSBuQs#4r"b|`.$ v/P ?2= Qf*?0 WI Gx|6$:H<c9ppObu<paz۫s^C1g/ol0~G O'!?GJ-HǧBxg4Sg?0}j"l !?t\+|%O=g˟IC?G_l * ZIb0ĊJ"(%d(b" Bf(*pi`řr0x}p?q!{;L:09=X~̄?2@Sa>R:dc>y&M$h' j ƦSs F3p吏/=ٜb}57ҌA;~+O޾qޮ9 ` v 'dgc5$7vѿ'υQ2Ld@qDpHP J!$4n0f!=(PGXj?C?n\gnM|V!. ٚOrD=^ ~`}jO3x{߇# t>Y("7Ly'9?5MI 4vO~Nyfa90V.#ѝy'%>!3c?x܎x(۾P P7Hq޵aaE(G?4r@ـIKA `ꁅe~w\OsdsRD/k& z=zp0cI̙61#"/IyrMPX_Na8rv Wc c`Z'?lIDz?X 9d_WRHNS\2.9|O7((HMI&3H Gt~ǡ@IY^+M4 jgtMQ B S7Y Ak7 lIBh>5>-|~ n_/}؁Gd;:v{oZ?;O G[6T׃A5zw%|dz> 6updOt3y0~r Y"#SpT)^!৲CX?8ۢ7/4վGqP) h?G̿Oci숟/OR'ց`8N"~?>V !vx#p@m$K@*"k$ђ`T5M5-Hthrc DIMB#l] KT!.xvGÌ*S~ٞIJ 5$z TB(IP@D*wF͞dϢd5A܆ET<ےh m<κ2!N;quX[AN`pB0x(K^s@`@ ؒ5pEM@vк^ |R@r@Q2/҂ ~0_Kӻk÷M#H0Pr>%*A2 JOoYL9A}y#XCff}My>YL %C 9ls.sPl1/]1ߺ=}2p,B7"b&B K!+ nEriܕ*1yBy ؓ'HC0K:31&щ2=Lzw 1 ʉNⱬz0QXb8Ef vt@`98>&àtA: QgtD8\I2q: ;GwLDXgpG>}xSi#a7 9j!N&D?(cQkfr3نeE/%s8MکBԿޝX}JB =GXR"+7!~;^s!zCbg]3c` @1LQ6ShNU∫P3 sFtWmZ^=Br:!%!O]$WDMg:Jňmci.icFCF!R)~qDoR%;܃ʍx؈(3GBJ FRFGmE1;mXU28BI 3>14hGx~A3_d%b;ɛ:]K09岈iJPuIZ",JK[V(oNp!v],} ݁xJ*%9*PT08K;C$?b͟Ph~U4J0:T4 ~BG$%x}s3((%<굠9QPP%~[v5Z mjŸUW5cDF@hqC\ݔ <8_t!MG`LM'WE]g1'MڝYc6\KR">qzЇEEmH6TW7Ʉ+:8B$E$2u S"M %Nz7̮`;>;v0MϒtꏰDT4]n&y5.E=1Q^MMʌPwn 9̨` +"Dì8* S?֘I yx%=jʳ1l .IuK1Kؠp~>7r#&L,)כ;Kp|Cl霐>2.Cg 3b@SCZ@~65F"Bi3,k,ń1qLRFPFۀITAA (SBʡP!8+:8AE}Lܳng'^Hn`PRd6 I "HDEEB("㎀DNXfaGmQDELДqt ACHx_[adIM3QcWmO#Jk Jse9$& h) *C_oq}/2ld^г].>~0HYH ,qR0ߘaی'Qz%(oy\2{|ȎD9ύ<"Uv_}N@!v m""n~lf . 4EAB%QT% \E e\Ś9@zo{;tv^=aoCN{DQI~h@% <.QxJajx S;ӽh=1Rz"+'IDmB62ջ IgˁƠKtM:C~*M=#8ԏ)zޠi*@ɷ/NC&i" ƶ'e9&t- hkS\(b_'a4y:h:eCDm lth.}=~޽}p ĐH'X@@DB;Ȋӷ<^{x让M #!CC@Rұ2GɐL;nn&O2vB*"" (l͡G@QH; Ooiq3p1pd}|{SS|B r7 2ARW T"!bb"5KF iI%H h*db&gMR bZH (Ĉ`I'c>7o,h( Z!O $Z; mєhΡj&ߚy'lAJrocqp?Nk6N`e0xǷ9ȩ@ 柿0}YJ]IM\rr_wHPO8 Xsۈk/)*vk3m\4VAR@\ n0w:$4.6p3+AY&30iI$$$ؿټ~{v+BE' D- HSH:L3\v 9am1vPaHD/cAAEn(bmXtA\S 7w[c7ׯI&MUwS}n{yum4}`gL3ظ`|??xSM(ܹZ@~K1QQT柗gvT嚨D_cz{/@*CoxN sG.z;!:(bOb@!H o0<``Q3s ʒ48fC9<7o;y܄[3jzr}C|g2WjI9,ǴIpY\u%y9C}bbTVi*!)@ H@Ge| <|?^7uÕ=]6t!9!u÷.J@?3 *Z"3Ϗ/o>Q9r=0Ky躍:D}*= 00 nf+?GH  ?"! #ؼCu0Ǒn9E݀RD !d他d4Q/6b(b}@{f9k<L[Q l|~:>~o,/&ߗ~1/]8nV mv9N]r;GH8q, ]y&{lMc!D< ) |9s >2IC|xqO'&Ei|˴P;?G#B S¡2'Ta;Flkăxp GޡeE<"vĊGmP Ow7>ޠ8#Cap-ܿ8?mǷN[AMw RDQ1RPLXQ'Ɠ@rPt=sAh<, ]ݢ3yurf"|r͟v54[-fNB=db< 8ڧ)KIK-!@TRdhhryG.u;fC4xް+clM9oE%z?!$@{b:\aP\{yxnQI5-:T&Xe|7Ds.X1!>RX_4n'!x 9/PP_0QGGh>>l?떐'e%* Xh>F!{+,WAآ  x2 fA>9u™}UTPQs|P#E_X)"h TFnN" N@X)% UUƍ0m'ER@C.5jF 3= JJ 0fP1AAeAGPB5Y P۔ kdi]FG/1^u,TV#;s4p݇OfہɁ(Rww @9wD  \>"&pmF,sߓva6"=`nD{a.'C5!ߨFyr{xa 0  Dр!&\YQCIEPmzxZYDKQfTL-Awۇ ( g؃o6#䜤TibLM4Y2_yQސz]6 c(QINFDLY8TPP0  rr0؏D^X&9yurԃS!vXrC~!1ZS/^:ASf !f@ y 剼M&hX]!_I4s\О=z`#.**l_Yz v U$UM4!%ug>()';4B2;E{:'4v\efh+Gmʋͱj3$kEAeIafXG Nڃkek/B"!$a1H IRd@Ik\ ͡rfJEɛ I1+MU͒2 Ʒe  L K b1(r skB\3!<YmL@r& %uL|çQSD:3\lAsU o*+%4*)0qUWd08w5!}12 b/]Wу!8dbʡ&Q|=rni}BZHf9wx^HI9`㇓78 *txN)ۨT] fnW0ݜf}zu99d'p[>t J'nf$FdFzs]hLJ<>2݇c /~~L;! 7|1kbanO_,:V>95NKD\5IZwHP-qRXJo~w} a C6jCilkq 2@1sO6O*D$ B(Yh{iD?GPzrLmX)O&bmՐuC |M|3N5f5ya~ʢL\p ",O<| ]s;cJt:pIHD҆1祝>S@yfE2 6;5%Q DywC,֞8P.nmCftT$L1IG?q~`8A#: v||`<|K].qyҏ|9?Ġiq4sJxq}g}N>?@ A~yFHB#[B }!4e1*^>_sgFv LCxo>y oiHhM$K7^:apPB@!CT:M DDP.M"8@R@FN JVIY=5&h"npkI1$CUFtj"JNyM!I{U1d)W "*ү"@N&@fT w|6'A{ۗW+-y;{Dm})ga .>VGc^:Υ_oa藃MV6qx~!S7WT!L"L|Mea⪨k[+SKAWo===O.(ً|C\{sČY֜ (ղ c¦;䝗͚ Mwޙ:&xMѯ64+LT D>&PR"8|f! f ilu5$,QM<'xc ßt>r$;dv ^2eC}zӨWʞk3q6"wE S'ryi&"DNKrt7=|fOM|J1FJۈ0ͮ\CՑ!!̉&'ʺ uγxzAHwfoHSͲ;\Γnrgre~}\sO2{=9lR@Da,#{:J$-3TuK@3͇Cq7JeE QHsN\HmMxr8H rA^*LW|g@S_Wt{v>>J?:Lʹl_m9!dnTEʄvRʔS5&c"EfR&n#Yd*_6i! B>[(zf(*om1qQU1c塳˝V&Rz{\84;h}UF7swNCId 癇XDQpRg\΄,"Y\!yO.Uly`IH y]1rMF {9LS<)g;7 5$|FfvdeٙG2<" yFd5eߩL#|pN.K=16OUV=|@ &q'tb>\$ C[M2A")d$o&pLx+C_%(~+vm<jܿ1Ps9a0"X,k1|L Rfkm>nF!es3 ~Ọb"DFz KVy-偑թ a =*;k}NCrj=vKOkpVTsĜ*X@ӲjD3#Ed"ڒ :DZA.g>^Ͼ{,9 ߡ2\=e1ZLGQILWPD aPiAa p3@ @\ݶ 4hb"){vykZN̵gOYA46k)gy <ϲDtDB8\B,mD,,)XkF$ 4T AUh.:t;ݷClwǿgfۄugz {Np`z 쇗 W1.LOu NQ Jwv䇫\}c_Sy?' 習i @҈){*—R=#TSHM'""D{*BXv-] jwv<#mWaO P)Z@bV*)Zi!BPRhBu0 cO.Q!i4SF*K2i$\C P 1R@ )) hb-JhRʨ=rݎ ,+nnw(JB낸UMz>: $TBIF3SihOLJrAB9N;G,Grwy)k&Ÿ\rb)f(g2zvѧ)W' ǒ)J4r)%=4 w<םSxC較r!pEzk5n@Not_XDmG~1b5!4T5Q< ǒ?Js7x!% y]8Ҟ/``=V="Z k/ƐryZ@[^zb#xɒh2tcE  !u3.3'SA`=|hC1)ٙmNRJRu+c% UK 33;a{`5єQ2"߭V]b]b68R"x%MJ4P8 Su\O4bHoCe2-x1B9g)P K;ȕ=B]R~a3Jύgۗ]h>&`2]B0n!-J ""@H,-p)aJTyE)̓٣6`!W?YοٛnjQ 0dH- +|Wqbb2HT/o_pLpyx0h("ZA70X(@M:00ו*Q2=H?C`J3˨@ xo ($#mDN[ylx#|C3p -^ye݌#8D{$B6d},t?r8Еy,ȝGfՐ@o 'g #}ߗ xHd &dCrR~o0e徨RDT!qrG@/ouƠJ"XjACD.7 !8]nâ(s3/zhA|]ZKr+4O|"n9% MJ;t~׈M25 TDB)EJM%c&`fxp˜ZP0p`@ykB[z̟ Ql*\D( ]#K!=ɢ&jW5(|*~&8>tdˆQz9pNK>fkLa ؚ ]upCD(EW:( r%Ib8\aL ^ Eԇ L;ELjayZg29lU筚&JC8$e?I^C:=v" ޏ~6U矄^c='mG0|Sȗ_;R{*z~kh18lZkҊF9gl++on7?> A%g'ꠏj ,׊]ȃ0MD-umL>p{{2"}M̿);۲Wc༞]޶DG5pJf ;9R-iI]Kd3A&Kiv5|fHtl㩐bg+xBC~# ۑq$aF{xCn .9>U=84A:Ǯ8wѨo(z5yhqd8%3M,8>WpH$QRZwuUlߐp\ŹF:-,S]>u&2+Ƽ2fN _Yl5i0e!x/ gM"!W.>(I(*HON%R9F @D"z=8ck#JCC QIwk@24ƴ6$D|NU/Ht}X0\b-(ͨ_h-N zڱ<=4`2"*lmre梬UT%Pj9jՎ(֙^,5eYRGE "{<+zIb((*pߝW,\Y겳ISBs8<9'ΝqFh=H F"A~ovK)L3FFe95(.扐c=\$F/1V]ĥ30*Џ Y]u&2}>|QJpƙWu3ؙjz7Yt|xé^ȂDOH:W话;ۿ?n!lIDfHJ@^_F;Iq }m2x,PP&"+} /$z^W"q&vB;#Z٠ĴB}5rꝓ>곷)% 8|xKM]iZ,APnGj vF~f{]~2=|U gM]ueJZ)8WW Pޗu~z4PA}{04dvBrǯPdp$;*UBvyRd} e>m&(wD[|_Q`̵ $3](iGh?z{#h P!PRˬ\i >WEG4*0elٰr3(U*MY4eͧw~Ocޯ;VPZTR@97TĞ,+[}@vP%j.#Pv=-MegU=n]uax[@lRGn~/fr0gIGd) Qm,ys|(1?c8ǐ'5]U! c:zENFC"qH{@\p>L]^$ 3+r"E ͦ{Wm#jm]9Fՙ!o ]29~(0A;B lȮY$@.4ǒ;t?*?<`הQ$)2e),:"41?T!Y߮̊1S`PsCWFs Qܮ/*a>TLu:furC$d[Hү-Y`6GL͊督EoV0rmBzo/SۉJ^.rOP'c?O]+7}zvHt:)N3Z:}] uSt>_מ 믓 'ux[Sɲ16@Iȏf*wcox{b쾫RȾ,:!lP5֪A3:h¸lIoy_-luʼye->WTf'G~s'% X!GK lz|cGBemcn%Skw<}v~f(q>ѹp(Qܖ -k]E4@3@}8$hx"_#S~\ַ}E1d"&bjy 3^@/Ⱥ*ڒ\\PabtL89 =tfEସ}{~:XףּqkH >$Ɛl0Q!G[I -Mzxir g.15ƕR(g%x'о]OPDc=OqGS>0EowQ*zD_2䘞ʭ<D65n甅ᎏ/K" #'[aԙTG[yF86 a$u5\+-%Kd0"z$\Ia 2fh kR(p(3$ 84^Dܱ=  Sǝ_%G]$8J&hk<労`+]h%,Q/7gG@+>?GӖfXg;jxNre&p΃kXg*FmL'g R "o̥o A:gh_zR`Ѣ5[핖MNwO޹B~FuCs J ;E;Qλh0ڀ\ÎЎڽx{BCP>xJ @$A]{:LYQ,b3$ <F 1짩P=4'\$Y]$߈\(.s Yu0r\5.r9qģPGĨ `$8=x: @e+UY`#%\kg:VHXY8EdD)AYT!E@3U O*;-4@%`#|toeų¼MW1:+4 Pzu˴j.\vs[`5sy ?$!䨱_9"tߓ֊O4jF!u6&iL:ABsyy]i f &2M%)R:1rZpMU–fWvRl"H(13eTs\Lq-8Fl5®Y0l1vukԊfaZₙ҇g4c@<@>!*J) ]iLi?@8/hxo~;&S*2a!%tfz@ 5Gј N7͇ϭ]ζr|h9nkT6^I`s a4 Cy՞G\ c?@rC۸#:7yɮ4P 1M`)n\w;Atハ'ĔK5ib" )bh&B׌{ ٹ@נ05S!}!GјB`ݿ 򶲛cq?d@^O_&Tl+Rl-'lܒZ^An8ffoD ÇPʫ$;&eXÐh1&ZA 70'$9)mr-Lۂl"hߋnVr &F$s$ǒI4`͐j5i%K<1QBc/WK)IXkXbfZ B9&8 vX_VvxE@坨|%Jv+c#uo^{*p KYHa"{jbNu.ơͫ1WJQsL|et$|B<:(O ]ܐ B@ ڡֆ(XF޵>W&z|" F'FTu5߁s$]tx|]j⌍?d1Y Tk4Ťջ?:꺾4yGGFNGLT !߻;0vUl3X[€A/vkcq#!]j Bd2a{R\>+쥧f}9&Ҩ25S1m|vj&E1$oM#Te\$('LxKJUF?_=A3ҐY2d3GCǠ#DW*ttA( EnRWq8TP!rbǜmpFuV9$8`lm(ݷ% {!eoL!gPf Q H !zH~U{p׮{ߜ^IN=w(?Ԃ I37LF P ܁YA{i'o9թ0r6B=%'Nc 5E=&8(WB5YW 6m.VSm&<37#)MM0&&f <\j__7T-P|/|@Æ0SFϏ?1EbD))f~^|g$C }0Yi#^$GM!SuicCDD,Q}}@\㏿;dOE) ҧ Tҹ??K"ELI}>]0"1a~y{P'L(#A>*&a#f@h:)C hC Uy3OHGn=K9_oP$YK쯒4;6o v| ly6l`状C& Q1,95ӣ> 8-$qL˞v6a5Oʀs l=7;C2w y9=p302*P&$J}d<1!EPP2JM /-"*9ZGr?PH78r`h_PR?Ymw7,l4STvH G" G^BR' ĕY $F>$cm d"'R7CenF??.jyP Y:DA@ӈ(آSDtn x b)ξՏ+ؤ^D"fY8M#fa]پ=QSgLк|} ̯'xߵYF#, xM92P_'Rgg-J@DÔ%y-5\ǩT8waV6LXgB\0śP0%\AEQUĻMA Le\C4=m<7Q=sDI#UEʰl"}Z\M$;i I <_R~'wCDxeox[?V#K#i~l2~pA33Xdoio|u~hAyV0&_';> ǜӍ \xc$s9iX-DrlS}~6x#HMdR@Z!I p*LR)-&rb/9&r;x Oۤ};5b=z/?*ۓ𜑈HO)2QmF< hrvZ,b,V?~&'+꧘P {".S$Dh11<01@!]1ȥ ~@w! S  qOGii~F`#,z&/#QPxm߃ΠB!(2'CŻs-aMsftkR آHWUDp}!/?ʅ͞rrȨd:~@D{gثR2`pXuWQl fLs{^YYrXIɈ}ř0Dvdr\ fSJwp>eG :NL`1bd(S}1]Y#'Z@&=zVk 71` lb0z|<VJR@lP!JS>8}I#cJ0h{CyQ3f15c8|qrR싊6Dc^C8zD$Oww )RmI=گe-~J}AUd cUg5tص#&}_l~[9=)a$dd ~)C(@"”"QGChKCIuB hP]TJS!zarGCυJ )] (ipmJִk13pM}|  7%a'B'2@ar TNQUÑqyJBjl39A>~x]O*bc` cSQXc ґSB3K}x9۞o mD ;/r% _k0GEߨ]_+H*lMB:u& =b BL`4?W>eg9|D/=i\J!?XDQ/@;%H#D5=7ah`qw QS׮2 uēg b{<סn#gÓخ6;/\Dܕ~!Ҕ l糼"h a`n/ۇxF`L@ -*RSBAs~64ӼJth9MEIai+4ȩASސe8[#?+񩽦p\CQ'6%BPGNt`!c#_vcĠxPm6?g\"6T& /|>_Uod\lBSkdϕ(<3",/Y(1/*6ސPk,4sޜ:$bHbA *Zbje"Hi (( (b*j$j!Z(q=Y3)wW{A0~}atE@U}sXCN!NApSQJng9ӆ4IJ4`+N}g&`k:57aI=hOT<U9!{*\]0dS,&䣪TT Č]4#B0.NaL\z/~sA%ۿ)K6`a<9)0#fˋ1~p[EH+!GI(>׹YYˋ <*UrHVUϾ(n,#5>$.?4=U0 |E `'9 jI~2߿{ڏׄ+9]Ng5=K.fMr5Y^=%R{4t0<8?:q;ly?sauǯyN>0қõCA-/0GG^^iГtO>I㋜CU"dVȾϳ\bP| M$&" gdEGꘫtX[<`S"d{ץ41DLrJG@WI lxH8PQK tLAOW2rN>,r M}ˇB\t\W8 P_|ho{T4y  h)e0]M>09I%LQ FTTb(.AOY4x5DRAIMP^I5Fs$RM8j&9&H^Z\`2Ls&f~m5R-0 "#߭qzi/%Mh*;FsfHwf:c8G>q.Y8Z5y &hOQ*hRJ)N/);1 pwj\wiӟH}N>nP'v7, 3ZQ8 Q)0P?9C /h@Z&!tj9C)F=POkƮ f6TyIzQ@? FuRrEr*SefOJBrNO*C*7]4}U{ /NJBp| =tHkdMd3)EA1PjN#x?4Ɵd8W򼒨XLkEEWpbQo-e 7nZ4tHh,0Fy)7 D RJSC9ƤpC=m p#&@!HRNbPKػ'o|}}XTs@ʹ"AT*+؇qY+Xo t/ޫIyq9_ %v6-iBqjF>9l f)M2[A23SdB$zriJ>s\]Jh\|oqȫC1RGDO}#7?GjJhNjSyj)ԛJIB>PeN/>P-J -6(.zOfbI.=qsWlY6q,)\oLR ɟd <.n=z{s@h9& iCz0zw}jM~4D82͓SӞҧ9x Ê:*}x^nZ|? _*)pI1'xhQ1v)_.wcBhДI]ւ A~(y*n}8>\HG5!C]3Jr+}h!EKOw4T!2&jr9Ooe䨲PR3.î~>@fqG6<!J"_M5 q"w !@k^INIǞe_YU% zay#tɭtCH' 3ר9('ר8A?zȟXCvdqpLFk)HbRj&[o'<@Hļ)bC(2RNGM\0f0TZW8G 0#;5޽r8t ې0gX^pcϘj4vNOb'Yv솃w}BtLpPz #N?Qou5nTR(s9KF XhJ@&ns$" K`J(H hB @jT˼5I+!Rʊb0O{C>SI˛!uC#G ~;^ƿyf>ЏL MADА4Г#ym) PF%) s;3 hN":E2H@},k"tR6@y ⧖*SMmW͐W %1&gJw%h :s:cHo)s.WܒGAAA`0xB1\ yc*O+kFVHÆW}v K1=?T)/!8FN#"P| 4m*cH%&N2wuy'DS& )钓zEhY^w1NX#>N8}ٴQAO-e=`>0̧ĩu/1_$sZ4Fv`)!(=tr A-̼nښ~""G?|&9]J,:F@hCH A)R)@v}_rh p`G_!AFB=Mu/U_D;Guw?|pӛNq3gSD-*#Zd3s ~w+ulC_4Ѣ qy$>= F4A~8*qQAZC4rMF6hJj&bIHmQ)B$cqJUHLY̘ѱʍ"5rZ9b -f9y5Zggn\6L6lUjuFQ3E[`'VmbͶpvˡN%X i_]zivMB CJiv1"Os:=0Ӿ_>-UTX(72<2@;^_T ^MlO9*Pr^:T?Ae((RXZQ"ׄ X'Gi'. bI" )0dҍx*0/4zw~zht>km1:?(iJJF)(JT)0Hp0## whBb7ۮE"zv俴!IB?qvCkû]]S1/ ҆_(@ dC@" @J@b@QCsos,uY1 P(t"Zo(ه C_yta{ª(@:̹~IX; 4S%2@L(rEB>fCHc Y0&b0D$&H= {cC.AS<<l}6x mLu o:x/0(MReKQDU@7L:fWA2"C5-7sמH1Ȭ孈 ()J:<{ctQT{\^>)C&hO>xT/5=/J{lQa>=!w'#oP~?):Fc,lb$x@!$)а2z'o`M<|yН89pXʪ; Q:aERN"Gj2 OvD@jF JQ86++ 0$NC DM G{W5Lx.y Y9y<<\ъPq9n 'R%ӧ.e:H;$d\ a4aQk:mOO<`>x7yh؈XKdNp!Ǵ{kC`{5y6 .T3n︋_8L"Qa*\LQ*Бx(bH]9 2ɐԤQU 4m&yt%Y͑پ1qD:~Pv h bd|Rs:Bn/!"PБ> `2ꔚ9M~X~>~<av0Ų~~p]\O?8Fn%Gnw#+olv=`JZ B">},#;t02Y!: y(,nh<TD1@t.HRQjhb vı-)Md}9G2hp#ĊlF 2א8~"" I{b8'XgUM5c?8{:sģX`КT t 4&3{< BfNpfFrzܕ6xO#C9& A">t/!Ȩm*P֞/+f֥ΞOB;kiAZgk]AVXTM`}~f!n8;Mǜbf@P3a9{2:eD٬99mt揨w"zV)$PNm@4IHR"gJG;ۇLjFJ(O8oA&2hM< > sCp85 W>Sj'8J∕qLO`4 ?93+(t0-P: @9t$ 1ռ @.M73 ,D{@w- W@2 `:_GSvNWQە8>N]Ej|UN8\+"%=d>3; =#* 'd<69Ih}R1L{aЭQL39.to¡0د k05:DÙOzI𖲣V݃!@A &#{i&m#0Qf5RqwzL:ٯi -83 H;Y+a!q":Fnws[<}㷅'8'ۺ5P|+3r >Wp<~GX{۷3}e)(^g#jbDSTQ}*2W:bL7yWGB6}v y$I-2F8ŇSs JHy R/S˲XҕI@3C"h"ұH1kPzjq-ŗlF/'7l>qEdC::;PqPĘ9KW^7XVAXɧ(}l3(e]dLAqY2 W1~AL^ryi;;n7G,=d=]Toτzuw.v]#C]%Q)<Ï9bt#Ƨ~tkNt^G|x#165qLr dϵq'柦L =!zs7pbHBdb΂*h)4%4Д5J% IRB4RP% 2RQE%%%$M@R@RR%PE@"M-)UTJĴ@Q0_ו @}e& Nk*)i(@iD\)j*jj'ceeASа5 : "tQ;=|u۳kjmdq]n|n=:ܜ`~`!~pdWqpW{Ev'psЊjq .&$1)I$ J4PIZ@ (]:PQ"8$,,>dQOI `ƻ~ְӺ4gIMuI>_~ sɆ{&W=35z|!ϒf8~wOȓ"R4¥=ҏ 8U2?Y5J$OH rLV._,Uܟ9INT/Hu6D9m69fXAݮhhz.ۤʡ38 pzx/vNr6yAd7hgp9D(V#V͵Q<"2_z2Xlimj䛐^{숄ZTиyO 0#A<K|cz#I۩*rjXD-!6#N hb 1DӦ芠b#_0Y/8yW9:3:I21LeyZA!Hae>0s=) oh/b^Zi.;%߹zE *PЀPzB9-*РP!r $e)hB졠JA"J"Jt&AP r!"= @+@!.(+'.>78v6kFƲħi][.vc#0Sd9753wO}:/}rDLSys /DB?0G~K&_o˓y_f<2`6+7 5|" n&SP2CPpd.d$n@DYƩ#H3n3WyNBO<;FMm*_Xvp3pfS9SYwxNy%V؎(J#b&ii٢LI&o,fmNQ́ g*")۬zomE1T=eKQ:g뺆'f(WN~As"H\nA4%ؙĮ̛<Y$&AI33 .\ N^{g8Q7<`~SlpYdt ,@A,ӵ 4Ou23vw} 4"<2G^LCKIBE$Rv] BU EHPCI(UR9!Uj@8ژ|aj:|{4u #[N$Kxp񆀡hB |Bv ON, szw%{Lb ʲPC)-0j֑4mEhޢOE}n>ew9αN#YAɆTH[H XIe=A,%#|"C8D'[ZhDp|:zyzp*U:33J'z`dQ @:2QM$ ~r\UKOܚmMہ]l+a1_owCs,o3(o!H t^ǞM_v_~&XA&'JhWdw׬u,O/K&"Xmd;7}Msk$"dYHBIDK @S6T; /~鞾EkLL YD҂v)_~|vRjf"Bi@a !F$R$ EHFeh"AJ&@M>Zb`~oJ ~X&f K.|آ $QI[x}nm\T$L+K>X{`y".-qeB#_P*մRTbI3ơª8|eMJ8.:l$HlmU>_?@ΓOi͞MvHgs v-xiOrym =LS\pO'6ΜUMzGt" 21WHyv|uAkp2_k/5?41XیcD g1*fs|t8q74 CN=H`5B9ބoߎD39UETUQQ;hA^T t0!As0&ds邢PI@L_]eU Et$SnQ(CQⲜ-0%GHE0/H m"%I;ON*ƌB^c"X 3Z4ձZŌ\wۘ`&Icp ` $c**Da}{1 gлvD?ӡ^9l`" lh{mK\1C9R/mU?/)EPR\='`09QDN;D/LX1htg *W^["qp˰T5r7Q㔦A꣺[}p'鿡 :?g[$#I-\Ts \)).5 Yqd\~;yC;Xܻ\G(-4TTDytw<)@"+O*:5e4H>H1fJȱMJZDL(KD:Idz!@лii%]}&.`Ӧ dr8(iqbUdJnfO@°x(Y-oC(PѼ< Es@:O_`"׈S /a& RPR'p՘194Z͐v)-L.!rBFQ{) 3?7W ;LL1egOJ\%#`p~B +$S*4䦖y.ai+;f*("u+,oذ.8(Mɬ,Vnڨ<`*y3WTF 8Ha\P~E! _]!'6 gL}UuLUC`ݱfin2Ί=75ӏZGr]vY7I"Ir|{`J 6Ҕy}W:aT_ yЏ.LShy">dw~CӠld4Gw>zeVA%bC!ڗ̚G糗"t|St?kf}s!#S/||Hca;?,C#/~6~YSZ8GˮdCs#A9G*{Fyk <݌UJzyj ְŹHL #0QZ:R#?|Lg%4s*%.W?L$r>?vqG#4#yQI 1U} k|gr 稁D >tC&zsSX5;yQEI MEpTxTN'y6r^T񓐝6!([$1UA #"7;h l+sw/a!(xp!v %4E%bfB"5 F2={XLcAZDAT>Q.Nڨy+C<(t!Z WOoADv장UWWU!aH@;q=ψѤ"#:W>s;)I3JxΨZdH=wO='Ul@7ZfD=.1tDI`qPEَp\Ȟ/D/;:906|$φR2QQY=OM-Ct'b`wul˖U{,Q\G[o,?73]YZG%@nٹ Y#7u2Z4{[6n, kɗ+Zc m+\EQRJi iD9O )L) BHœ1آi];+I)@P(xyH>K3g>5AsNQJIGX 3DloIСWnxf[}<'!DJy{:& Gݜj<CёBkNkJ4z=/W=^VF3JS#kOssa3)cRU9@A#d.p֪(SŲ=0PSe8!!"2]T$!phpG,4BV"> VtYǦh&B T`P>Cb(\Q\RVUeȐB&;4pI ҁmG \lȞHFMיX_PFLMIG:B*O$oPLȅWi:d`RjL7rSO9߶iՆiM0BTX')3"@D_zǿ~ύzs|wcJcI˩aZ"Iua\S`4T2m3jWDw32Dh )B("(bV( )R A)RdJ(F "!)hE  RH"B @PPJi=SP("#ld6˞әC5308| я3ΥӡLDNEck Rzerva]~?\n3xTR< =SRUD!j"q@~膿Pk̂ф!~X_WၥVU9q #fއ6eٔQDAD\5#jF-TefK$%#]6TId.Kk)J{b=s%.S<=gD]'"Yjk9lÀ+6dYN9 s-6r|.\ UcUxE+I5[6QCHg%]|9F&i3W\Ǭի-|}`2ձw @u;^Ͽ){n9˽I{J"nF^Ftot>Кdm8v0_Gq/bW̃%5L) G~UD^݃øl) g#yOHz1}ymxfF9>ۖ QPI6!AzȻ#C?ϙTz`WPb4u)X(3 ry2BC }|{UHvSB)"Q@4SAI0QT4%!ABSw P\OӆlNB0RdYvrd, T#7BY[H1cm%q]nY0r,i?䒏Hny2ݘtYg'v1bsQ2!rs ykˢtf|4E'KA[;')$}<2ZWJ&Iዀm[,[X6«B5R%Tm!?[OY,&.aD[hHBEG$Ⱦq(ӻI4CCs$۔Zd dl eIB$3RLĮ4u22 .{ >܎bD(B,,;t*\OCaJ Q*XQ40M>6b8({=8U[J Zfe\>e#P|M(&OGm:@ BUHۖyn~:iT6/ύ\$v6s'A >qP4!@mB8 |Y"s>8(*Yl_zK,&5c|Tf 44T>wJ 0U,ĊS 9lQs$ZTLnnfG)1BX@%لRP@=9g3;:$T,Nw0fBl&8+!+ f,HYvn \ȟg}ztkNf.r1:*#TT(1F ٌ!2dqS;m0bH2{BOi+1mQpSn7F 5^`/gTy7E nwt\vZf蹳Z3\}Zie)iЀs5+郈$sv;~i _g|Q[ݓ=&J(l1tnHU:49"7rS3CUFDV0b Z6@i4DvSԒW}0}G>MRN""}]4K3U0Z vpO$&qnj,;Kc!mdtS@yrjP*L3iSgA4M촜)IH9ǐ/휅AAA=st;sa5´qDhh1{whssxԠRh1̎ Ja\Wa9&ZDN0G䇑̒spa-yv;8xUO(~t~<@dMQTKQ(ŒeJ* () FTxN& hZ#1݂(jy3( iJe*آH?tQ`yP=p)5ZݶͷZ&u*˜Q>05Ev{/JiɝìԇLPM "U)KHӜ;ʶݟyʒf`((J@D*;9_D9ȧԬW6UURUT~4g}Fd~W2y0!Dx|kSՋ$B0#/~=LO U ˰#lD"T66gb|?^}yTiLF  H# ;zp@PuE d/AHra}@$ߥ=vA28=N;ap.i@/UpPKah.Uƒnm&~_J}w| hi*h)|k~!"=bkgm1ss!S?)J}5n9rhWשظYAc!>o=q X{}CI D r GJ<-% B IGH~pNs!-":4?wn >tkT1:Fi" $MnǨk%)w:J9> }[`&M =uE7ۣqGm|tP$BS"R()DR()(I*( ZA(䨺ɀ/( d|r-2n+-3 +ל:28lJ3#Hkq%(E+*l -\R9Gm $;'Lr2%fqEabIYD+ѣ,MV֡&q;E (ECa\$\٘u.8JM#ףJ.F!RDIc&3h$u 1PJRR̀4İ@v0 !*q`=NJrfG2 qs"ݠXE:a)h(hJEIN564&+s[THX\t+1dclȽ#WD.P@r' 4 W 7bh܉ZD!QEdØd2g#?"SIw=zd` ?L`m&bJ] 8ǥϜ4=Ϝ1 S*A>Ɂkf7rED|x=qŶfp"FpKt#4ĸWsY BYp*uf h Iym2Ȓ 78) Tg.[>qLV^"6fl 9YcPAkyM( AT@(@a:B8<嶰q{1ǤS:l`1ueߖ;k8N17(ygCMC(Dqx4bZi$=EPwI =:"R#JЩHvc̆!2 w41;&Q1A#߲dz5᝹Q(P P@i03N`XWxѯr(P=߁{Epzdhn  z84pNa/?ΉO1$|\(Í䈜5iϰ)" fh* &&F5&j"`_`?9" n@$rFhi@ÜyH_j@xU2l<zAGȋʘiJUDXaٜMg@)GBB~NP(w̺\̡͠8((jJR4`I+R. x.]Ow~4*"*/4rzh;{DO<|7fTvf%Br墄=p†>Gt=:pI*Ze<4 ۯ!thFjkp_UfvԢ ObZ@y"o}uHK{ JD9C9C"$DDdV AdQMHDĔH(r`P֋4]@dNqr  Z$c.z]@VjiY"#4"PE-@1 P MHPH Q2F8}#k0Nd\q1D'4 COCfDPtBz?qGÎ4頨f#>O=-Ǚz$ЏeɈsr`]}H|JiT@m󻵏I< zڇ[&$~2"v8C!"P&Oڝ0wn9% w%FT7#h G@6;i!Os>,fVf.0(RqY3]p A7:ظjLZď 3,AiΝhZPUAQ Duw_>=GtSnh0(Bw?3xCP~aEM[mHj9)t%E!" h%bV9l$Ai(O GGe s4K.GBzE"XeG/߅ LBF &" G|5v|gj(Կ0$ΆрL8Tyj>g\ FB-ͅ| ~_|G,³=ܠ8rszTQh )O@% -&Fyzs(i+ԧ ju&9 xA9P'޾/3Aq'ӗ=hYH>AM>o#댯F"{3ZAM ̞`^:t@:j|hRۄT@l9Gˀ?خ 'Im0M5nX5Ȓ-FLWFmPhb;1"$̉ɞ<$Acj9 I8",9;> zvOB;Г+C[qx AJSP`Oy3GαrF)&\/D>1H HДЁH'o5Tc1>Oڊ]t–(-鰯$hO  Cc ֩(>rCEC\X0[b"p&Hԑy T gieofC@Y:dKθ&O{t!w~}X6:/ >1/{ ꊚjHᏺ `c K77'3>BN~ÿe?k%(8z Ue=tSAd9C_ӧORd# $cPER})Z4F4%B"J8@5Oޞd`ND'mY9p >C$8CI\߯&C%cMt2iyZIToy]7 7"q;{_73MVFzKks@ӆ1\ʝ̡?0DU(A9(KBR RP4D T1@{p5@ƍ {0@˞RmmIA"(H+W%5tnqA.AIfxXy -QTAP$PqR˃QcQ" ,#ձ-+sw׉6 lE- Z$);zRdW`ٵrAK!DnOFTw ҿt(fP%B#z%'8ڽ&O&z2oQ!Yh;cOP\ߏc0OG&)A1+s L4A!]6 SF6 #86{4S h"'C7PAã|&'t*]I:ZbNh4ozc88'9xa]F r p eOf?WkBfy6E Wg8>YC"_@y{Pӭ<r>2 !~4Bxٔ`6A;'˱zƝ@_@CQhJVh@b(UJX h B ( @H ii)ib()*~n+tpõ*mPj#2 v&Ƒ@lJp{a<'6$*(y}'C󟎂$˹ }&n~X 8"aAH@O/vrK('C.9x! e~<>D0/ ?F2KlR c}(!5/@=[p'Hh\Aˡv\ 4buai|a@!G_<hX?ʛ;ʥQA5E5CIR2hME GBx* B(bi /(} ]E@SICDH>[^}uF' qmb$쯿R1#HcOpè +Fqcu1>q/ 3r1[?0&LQ!2LUH- Dfi`f1 ȥ4H BPBs"J(҈;94EXց A @T TPi ІiD UPt*sLDTƊ5(TD4lSBX[Ӆ4R 5~ʃU0Uʝ~nǯOEE$ ~n~x=})(əS 5=c c.˂O)T3G^a0qlF({BxzAϱ ?aiDʬo,auY]Oݶ "Ǘ<}ۯ M/akN3FaeXQH=9fCpZ־9P"{`1Lp B- AB OB `ΊaZG:q9P@sFIG ͔clq |\=;SwCݬ /H }% ""*J!* &"H%0b'GPδcp?Z*O8}#QΤb$O GICuzQ=$ RT3;d瀛,gt o l?ʟg+&GUr05Ñ1 TrP"9qw =OP/_F#$&8t+6X*Ų9)h s S^wQ /c>' y{{O*ZJV1382&/sHV}1Aq>d&}lpQ !6 ~^m)=Ywqݽb(B* H$ъh K &dQ!MACDUPDS0p#AQ+QV%IL*'&a=c_!7/V02+ D\S͙\Ld ԧxAT,Q*UST4PhB iaX=X8ٍUi *{`M=*%(`=lDPTV#.". Ȟ;U&lSREb"eczp&~`DIҌV(myQ1L((fE$H],RlDUQ5^)ri H9h>,L|lQ(QL RU5>lM ByrS@8j93+er Dc0gtE@MDQVIAb(w"***aq2bI\qbDTT0DRRItDjE !ЗKLD_VQqT F'RNdD wIhhkƎR%t7Mh=H( )J]F\]*-E $@^ 30s|Ǐ㮯~rNj((FH&d&*if* "b**Hi"&(" (IfKv$HW!TD[^xt(}h6NA*Aqi~hhH&RQAt}=|%EAADC. l9=y\1<5d2Nm$NJsk` "t#ݨthjŶv(J)I])d/]ʒ1ro% AE4TByGW" hFU{u]klsȣDYJ\k uPvҌF R1,+䰉P_p%Zv͋hDB8K %smlp4j&Ym+ey/Į·ԹKLNH*a,K2&5q'dR6eACD ZN$Z0"19ںr'o^3(V8r8KY" Y`.IR9"5(6Gl 1S#9|tB= r_ӑ:<Kܙ JmƂh133&S[fA"WWY+Ye.Ks"yP{$T!%P}*|eG  D*C6W=;zVu|fW|:ĺVf_t~ӵGX_pO]2XbAB ~. !|P.d y0Dg|5Zc7pr_]`;dk(Ǭe~X)q5M4軒֭c|)TouUژm6IœOQDAǒxopeZ*Vѣb t{|o1&F?!_t!C"ܰp ?+lX "AoDZp ua9뮒 DDԸkiP¦ C%^a6A/HS澆r\ rlĻ0f C0웼> ~x4v|'pv[9ap+Q j("RP T4(-U R{t@ryD B>h&LpHwh BvT쀼C%Z@hE fJ$IQtd)hJEAIed d"*k$d0 0;-)C }}0'Go8~E՘H @Ժ_N}k` ct:.^JOo'e8rԞηSJ#D%. }")b)@_ڦ(4=6]@N:/,nֱ"JM/ŗ3ǟ0byNOdAU=HNonEʲa5eqT9BV  wGFvyaZ)>am%'nAEv>/6?ڇ]47]) iJBZQR(HOZffGbK! <|T &G!qu Hޮ=,"!Q>j֚Zh4d("4{/g =JQcj({@if-#"a#$מNlTNb6NNTUmXӡlb,40`clGgEh4&VydF+Hnp#4plMF -8"^!撂iΕIQlS"W _|!#F >`26|۸𨿜|&< A7Hlkh:m6uDB5fH$WQ*%+DG/W1uW#RrL4RK;޺o1WYRcHJ< B9]y GNgĸ"Y8"2>d^wiK ?>O2#?l͙l5DE="@I,B֌]2>;ЋgjvS?> S9@?Cz~̙+šLjޥBȁ ($]Q"'}<&o{[yIIGv_ a02VKR8{A`I,f8W.c<%ԀΟkK:F.O#]En6WQ >/b&MJKyID0ʘM .6p8OV= ?>п'eRr.%À6%$ZJH, 4ɂ8O4 ^⊋׌_=v6|* tZs;tnI56{h2Z<2-t}GMI3:|x$zz [A~/hfTN.0Q|_V6LDZGc5iTrg%uT [_]2V,(-6O콧N"$\D [sV&è"@+Gt|A_?'ai$CDICdJIL`Ϗ0#>+[M5\r!aèEOCk[1v Ů3ޔ5^ ˺rҴJt^j$BZiCdd6@h[ﯨ cj%̅QfF,hQ>$"@2u> 8luϹYf`3ZuDFsIGݭhӋ$:bǮc*}J!阿u[~rɉ!N*#q ̻2ZAv[ vtJ=lD 󽿞yokRjZ=MfUXg\fsf)YYSJ{IM%FWʮ}8=sH_?wOADqSō|k^''qʳK" Hũm!ġ|i;BiIQKF %^Dž K*SwCUɥ)eOV*FNwuev.ER\k1]}֐1~u-Y1K}$q\f7d.\'evؼ`jHNSLIndUW1&,uP垡߻rCƧl ͈FCf|b"LsPd|#إ䬆($PS|oگ~":Ca+Gg(@!P{{%b+ 2as+m|dN7L2ZT.a@%#%JQRTTE"R/C9Yɘ?P" #( K"K|G_sWkx|V!ء4:rItk Rl$hr*.,)z\]]A;yO>N?eoXP$a HA=@@fDtn l{-!6 Nh;Y2DKh@ܠߋn:F^C_#K]u͡-,8"[[BBMqQ%Ɂ4Y2RN°9be24 `u!J k(/) x K'<|kL_Wﻨ ۯϫEn\ l oF)E6Ⴖ]%Ub#+?(ygy(rbwݸak5 /.0E0d O=j?l( XND Bf'Ir^z~ox$ u+@Hvb7nǷ* aDtH$M)YB''aS@–Eti_ XfY93 Mٶ:eEQPd</Qa5[pG&c tz%Eg8aq`I@7@ ])) * [+K[RGƊ%{u搜۵ z!OZ2|6X g  a]r$?E~ݾ5hDYi :׌{a7܎r$c*pPA)RR/I VSPb5fU @ i]J%b;H*#AOPQb)ldszE{pTl!or4>U׽|${I\&8☴J"$d훙v" N*SM{>YlX($* jIĢqpJzmßT8ɒ[7q1;߅LدJ͘.aO]r8O%+4M\l6#Ң .C6X!0(*SI2;(rYog(=p6x *AѝDP6fASz $I%Elh5U$vf)ڡ8Kb~żzzW˚n>7nG]#$븮|8Mf2U(f *DQ-dU &{wYpO>w1XMSVc8xnmÁ}}#UAQ8Ý.6s d}2A94ί>8Fi|{a罇z )0pk(G#083 DF0?'A]%]:3@CTG/R ;`"^Չ2ȼXĥTT9*O3o2@UF*XueH_L8&@:95.PE=nY^ )cxlxuR9bM!6XmZxx;8qAj*j g~(tnHkzk7D݂vms }w:y<: u>Br*)hy(ssG`54u`.ra{xH'`ۀ1d =ؿ_yr!C ^)X5i>9ڦXBJHULya6sjHET,+4}nHPʠІ>XrB6^JP_ v{O#s.{`(B&s9!Bi^Sz{F9>QO&QŇ|"Y \ِq)k z7Ϗ.<{ymzc{^.VPOtuG;Qڠg~5* /hxTQ5DTM5Pҕ'hע>/qyuWlk27pCkK?^V8Bs=?2M(*p<nR"Eg#{ט4ihMwD6Ϟ9BDl=Lvˉn=U`t4/)A[zux'|Y'-g &&J 㷾h~yDq:S~t8s=sIO q|zӽ %BH)bi"**(&i( XXHJeFH`% a`%! Yh bBFh%!Id bX%YDaidjFh!dYI!"D( $(X|$.pcݤ0wJ]YAX{ yu{ГJۜH894ryr?B*n#XHɔ̙ ̈P0iJ|c=L(Z6ݬ9vl4tylu^PH$7˷~p eS}Iǻ[,\VP{gs'h{?-تWLu&G)}0n.gRdաw\?Ltj4耘k=(j@J" Ii0I40"Rg|s^b's$F `pQH>@޾=>5A};o'oē;(y#㋑=g1CӍ'>_O{b2&e'90{uF N~C?4ѱEjQ5M$T;@'$7> LF [̘^(;D0HJň@'g c]w'ei(/4<Qa뉇H @[Ⱦ>=auy([y-̪9cZD LSu.lo,=&+C%P#>} {tW̏笹^SAV}t#bW䱽/Nl#44CL%+2#P0.*Mf6!+3RΚ30>m-3e/D=.\t7ѣh*RApsP#s^xDD}zۄm;hDe5}ē 5:,fm#DEEϺS i0Uri` >x'{0fLd-,ϣ04dNz^@4#m"|$Bp JA0Z&>]}wk kp#|luӺvb`S4EFWy'$4.}zww"Zū(0Qlou^AUܽ˺Ivs=53 6FJMt3$8T=*/dS4ӜNuS֪7NtyLڼTI2IR(C,, AE4r1#QZBl|T ZgD,! S*%sx|e6l'g@PM;b3Q`Q0ć0jPBB~xzDWoCypE Z⭋8 kQ'MryDA]XTQbIQ s69=WYR ,Lǃ~K:D1屃9Y\AL<2b =%#TmDdP#85|@,0R9p>jU.X,QcJ RCG{֛!*CYsQbAl* E(pw!}XHJDK=/sjE_Q6A8y@5u7Xnyw-,}yP>1BΕڢOK2nhPY*­YK`M Q}V#;E"S`EW%Y"[EؼWPN..!q[g>WМ^uݒ8zU,IP]dIӃ<ΚG;{U:o})iۀo+2i2xYA&x8~un6=SWM)K1fV=E5qUsVGq`(6Ƀ<ԇ"8GOn`eUK(҈PtR$\f7;]+fx;]Sr̖>Ěp{D8pnP4=bQ%%u] WRH , HOgߵ\Y_Y AI@"7"Opf`w@PŎG&(XI>֒EeU:tz;9}4M <>:kp_%Gw zbzJ$ )7Ō[)ԂFd +GߎXX }%˽9a07V Jyk8?⡱@ (%̈TЖfbQs1;Pd$tnsms%TcZC(pUܶD)"jȰDԎ17B\"GsvOӜ0G>oҲ0a!5sƇޛGx"cy[{rG1|`G-Q"xrL慐U¢Cc,\zDsԔ$*!9S5YI`Ab ѽ"tI  ;qc5[B tn)+82ztn}s2t˰p'6NLOdžώ3FNy~O:;_M }悌|1p&wwA-5 M]ďn(c [8e ߟq)(:|h03֌GA:1Hj¿d"L@y" #ӌ8%@"% P]_{.N'{Na]AJX^;09O(Y*mѱ߾;!Of;JrnۍA(8je"4hf":^o"헹V %rݴ#IOSG :\Ϗs={pACy=t- +tQk5'דwJY@&bK2sө&`urr칿 b{#n"("/95=rt-}up JEs WJl7:m \8xA|EiT,&zinͧSAL-5WfOO[Ws3 m!ܐ``xD߿T2V9wrܦmC=Uiu Tj #<ǥ֚0@N?TLH3t& 2 Q@2D0|\Í`d3ၫ92E\Ml̼Zo2uvW|{HspT_2.&9&++_>"z~kقjDZ35xhi6ϻ/uh߼354G(>1?ǜTLA&#}Wt̏&,YP99aP~ݰw:e$#=:xޝ>_v0/뉆fɘx@S?L3u!lCw͂&=h䦇R"ƾB njΝ1Lnl:T`}BX=5bn[>3lMozy1O|c1T):&nj~A>k0 }T_TQbHN@Z"y:b$ wyuWPv7 *d"QSj[n2:u17s 0ܙR"sM{'Bz|[O;[/=VhZ s{8"L1&)m#M48w7*g\$##Yݵ828="A1 1R)5wl,;ae;+5&䤋fNڷad28dƤY#Tl[B<7tu4ѲV\ ]u4]ij\z.Y$T#L&w]ΰU-N6Sq^HGaV.9k$biߩ#oXq]"T.B9E ӒH"2D vqD{Cu-!M@oݐ+KW [8/$4NBRIKO!1 ^FT{ ĊRR"R(dC@e9!2ݍp5: t0 ly˯Ϫ"GsM'~SR>r5uǶs@B?1`x!*{%>q8#'4$T0g{J p-6pߨOPIO@kQ2JQ; 'oˑgcdd<%FzgN R$ hKŠ6ȵWAgh[;j$IM([NHGc<JPZ?׳ ϜBx#>.qAĘG.lV 5RA3J n$`Ul*n}Wܩ8!@MPS|MQ>?_@-K[ecVb8G=]w?n*:A[=HWo`|cP}qi h" Xp+`X!pE 0nu#kD=Ѣ*S:'ի4ouf!"U^0;_dپ±C91H,#_BQ#Ծ;4uCI!& XvLJari=ԂcjK?Gݵ6;˂.:-%O}4vdSE/`ToTDD4;4 j/WC%J}L3Tf LaW>n':t⧳K~Pz8G^㿠x 3ZG?TB(zr0Oh<&:†y"x_q^`먇t;hwJi3;.PA xhs߸_Iq@J?N)k}=Cq)t *s_.PH-ۯ;dB(WD0C Bis$1A!CcWmPu zi={8"qv`@wMǪM%~S#COA;'"9h uFS._ ph3?y{`&!v>/=v:mDFG- wg)_k7sI`BPS:d@W<&8}@vdPiy!~s aD5$3CJ)Iva"^MaNR=*p+^N~<3Yff20 Џasৄ<6/!>o#Iiבw9JCZ h @\YʉF[  3="c`;_{}ȉQԇ.X  In?DA>HTUs%R(]3ϓAH_5yc>[UU\r_PdQĬeGB)i n2)~Cx6pzM_~jȉ? Z b9\ysm,Hs.; j #3T!0rBc4G.|`"ݨv(kDg̘|_FId Ioݣ:DŽ}AT$LsIնn`53L~6ľڬ&9בR@O|k1Q NAdU0aZ\xs?/N(kZ>6~5T~NG,+HZiho^w|}B鎿>LiB'hӬ>%M%b!V?X&&lfh5Uk1[`̚]A0`9