From 29ec7931f3c32b61d961c678821e0b523ce4a3d1 Mon Sep 17 00:00:00 2001 From: kerozcak Date: Sun, 21 Aug 2011 02:54:22 +0200 Subject: [PATCH] Changed: #1315 --- .../www/webtt/{README => CakePHP_README} | 0 .../server/www/webtt/app/config/database.php | 2 +- .../webtt/app/controllers/app_controller.php | 10 +- .../app/controllers/comments_controller.php | 25 +- .../controllers/components/path_resolver.php | 139 ++------- .../file_identifiers_controller.php | 75 ++--- .../identifier_columns_controller.php | 68 ++--- .../controllers/identifiers_controller.php | 80 ++---- .../imported_translation_files_controller.php | 155 ++--------- .../app/controllers/languages_controller.php | 68 ++--- .../app/controllers/pages_controller.php | 2 - .../app/controllers/raw_files_controller.php | 235 +++++----------- .../translation_files_controller.php | 68 ++--- .../controllers/translations_controller.php | 154 ++++++---- .../app/controllers/users_controller.php | 101 ++++--- .../app/controllers/votes_controller.php | 42 ++- .../server/www/webtt/app/models/app_model.php | 4 +- .../www/webtt/app/models/behaviors/null.php | 39 +++ .../server/www/webtt/app/models/comment.php | 20 +- .../models/datasources/raw_files_source.php | 47 ++-- .../www/webtt/app/models/file_identifier.php | 20 +- .../www/webtt/app/models/identifier.php | 49 ++-- .../webtt/app/models/identifier_column.php | 22 +- .../app/models/imported_translation_file.php | 28 +- .../server/www/webtt/app/models/language.php | 47 ++-- .../server/www/webtt/app/models/raw_file.php | 39 ++- .../www/webtt/app/models/translation.php | 54 +++- .../www/webtt/app/models/translation_file.php | 21 +- .../server/www/webtt/app/models/user.php | 45 ++- .../server/www/webtt/app/models/vote.php | 20 +- .../www/webtt/app/vendors/PhraseParser.php | 19 ++ .../www/webtt/app/vendors/SheetParser.php | 32 ++- .../www/webtt/app/vendors/StringParser.php | 24 +- .../shells/templates/webtt/views/form.ctp | 21 +- .../shells/templates/webtt/views/index.ctp | 14 +- .../shells/templates/webtt/views/view.ctp | 58 ++-- .../www/webtt/app/views/comments/add.ctp | 3 +- .../app/views/elements/admin_left_menu.ctp | 28 -- .../webtt/app/views/elements/main_menu.ctp | 22 -- .../webtt/app/views/elements/neighbours.ctp | 19 ++ .../www/webtt/app/views/identifiers/add.ctp | 2 + .../www/webtt/app/views/identifiers/edit.ctp | 3 +- .../www/webtt/app/views/identifiers/index.ctp | 5 +- .../www/webtt/app/views/identifiers/view.ctp | 66 ++++- .../admin_index.ctp | 4 +- .../imported_translation_files/admin_view.ctp | 5 +- .../imported_translation_files/index.ctp | 2 +- .../www/webtt/app/views/languages.bak/add.ctp | 22 -- .../app/views/languages.bak/admin_add.ctp | 22 -- .../app/views/languages.bak/admin_edit.ctp | 24 -- .../app/views/languages.bak/admin_index.ctp | 57 ---- .../app/views/languages.bak/admin_view.ctp | 133 --------- .../webtt/app/views/languages.bak/edit.ctp | 24 -- .../webtt/app/views/languages.bak/index.ctp | 53 ---- .../webtt/app/views/languages.bak/view.ctp | 114 -------- .../www/webtt/app/views/languages/add.ctp | 18 +- .../webtt/app/views/languages/admin_add.ctp | 16 +- .../webtt/app/views/languages/admin_edit.ctp | 17 +- .../webtt/app/views/languages/admin_index.ctp | 10 +- .../webtt/app/views/languages/admin_view.ctp | 179 +++--------- .../www/webtt/app/views/languages/edit.ctp | 19 +- .../www/webtt/app/views/languages/index.ctp | 9 +- .../www/webtt/app/views/languages/view.ctp | 132 ++++----- .../webtt/app/views/layouts/default.ctp.bak | 59 ---- .../webtt/app/views/layouts/email/html/empty | 0 .../webtt/app/views/layouts/email/text/empty | 0 .../www/webtt/app/views/layouts/new.ctp | 78 ++++-- .../server/www/webtt/app/views/pages/empty | 0 .../server/www/webtt/app/views/pages/home.ctp | 2 +- .../views/translation_files/admin_view.ctp | 2 - .../app/views/translation_files/index.ctp | 5 +- .../app/views/translation_files/view.ctp | 56 +--- .../www/webtt/app/views/translations/add.ctp | 40 ++- .../app/views/translations/admin_edit.ctp | 79 +++++- .../www/webtt/app/views/translations/edit.ctp | 39 ++- .../webtt/app/views/translations/index.ctp | 8 +- .../www/webtt/app/views/translations/view.ctp | 48 +++- .../www/webtt/app/views/users/admin_add.ctp | 25 +- .../www/webtt/app/views/users/admin_edit.ctp | 26 +- .../www/webtt/app/views/users/admin_index.ctp | 24 +- .../www/webtt/app/views/users/admin_view.ctp | 263 +++++++++++++----- .../www/webtt/app/views/users/index.ctp | 22 +- .../www/webtt/app/views/users/login.ctp | 3 + .../www/webtt/app/views/users/register.ctp | 2 + .../server/www/webtt/app/views/users/view.ctp | 223 ++++++++++----- .../www/webtt/app/views/votes/index.ctp | 5 +- .../www/webtt/app/webroot/css/labelWidth.css | 3 + .../www/webtt/app/webroot/css/layout.css | 17 +- .../webtt/app/webroot/js/jquery-fluid16.js | 2 +- .../ryzom/tools/server/www/webtt/docs/INSTALL | 31 +++ .../www/webtt/docs/db/CakePHP_Associations | 69 +++++ .../tools/server/www/webtt/docs/db/erd.png | Bin 0 -> 91823 bytes .../tools/server/www/webtt/docs/db/webtt2.db | 239 ++++++++++++++++ 93 files changed, 2148 insertions(+), 2077 deletions(-) rename code/ryzom/tools/server/www/webtt/{README => CakePHP_README} (100%) create mode 100644 code/ryzom/tools/server/www/webtt/app/models/behaviors/null.php delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/elements/admin_left_menu.ctp delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/elements/main_menu.ctp create mode 100644 code/ryzom/tools/server/www/webtt/app/views/elements/neighbours.ctp delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/languages.bak/add.ctp delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_add.ctp delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_edit.ctp delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_index.ctp delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_view.ctp delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/languages.bak/edit.ctp delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/languages.bak/index.ctp delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/languages.bak/view.ctp delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/layouts/default.ctp.bak delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/layouts/email/html/empty delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/layouts/email/text/empty delete mode 100644 code/ryzom/tools/server/www/webtt/app/views/pages/empty create mode 100644 code/ryzom/tools/server/www/webtt/docs/INSTALL create mode 100644 code/ryzom/tools/server/www/webtt/docs/db/CakePHP_Associations create mode 100644 code/ryzom/tools/server/www/webtt/docs/db/erd.png create mode 100644 code/ryzom/tools/server/www/webtt/docs/db/webtt2.db diff --git a/code/ryzom/tools/server/www/webtt/README b/code/ryzom/tools/server/www/webtt/CakePHP_README similarity index 100% rename from code/ryzom/tools/server/www/webtt/README rename to code/ryzom/tools/server/www/webtt/CakePHP_README diff --git a/code/ryzom/tools/server/www/webtt/app/config/database.php b/code/ryzom/tools/server/www/webtt/app/config/database.php index a4183b950..3119752d2 100644 --- a/code/ryzom/tools/server/www/webtt/app/config/database.php +++ b/code/ryzom/tools/server/www/webtt/app/config/database.php @@ -12,7 +12,7 @@ class DATABASE_CONFIG { ); var $raw_files = array( 'datasource' => 'RawFilesSource', - 'path' => '/home/kaczorek/projects/webtt/distfiles/translation', + 'path' => '/path/to/translation', 'extension' => '(uxt|txt)', 'readonly' => true, 'recursive' => true, diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/app_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/app_controller.php index a60584a71..03bfdf4cb 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/app_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/app_controller.php @@ -33,11 +33,16 @@ * @link http://book.cakephp.org/view/957/The-App-Controller */ class AppController extends Controller { - var $components = array('DebugKit.Toolbar', 'Session', 'PathResolver', 'Auth' => array("authorize"=>"controller")); + var $components = array('DebugKit.Toolbar' => array( +// 'panels' => array('variables'=>false) + ), 'Session', 'PathResolver', 'Auth'); var $layout = "new"; function beforeFilter() { parent::beforeFilter(); + $this->Auth->autoRedirect = false; + $this->Auth->authorize = 'controller'; + $this->Auth->userScope = array('User.activated' => true, 'User.confirm_hash' => null); $this->Auth->loginAction = array('admin' => false, 'controller' => 'users', 'action' => 'login'); if ($this->Auth->user('role') == "admin") @@ -66,8 +71,5 @@ class AppController extends Controller { ); // $this->log($isAllowed); return $isAllowed; -// } - - } diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/comments_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/comments_controller.php index e6ddb365e..a746622e4 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/comments_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/comments_controller.php @@ -1,4 +1,23 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +Session->setFlash(__('The comment could not be saved. Please, try again.', true)); } } + $this->set('comment', $comment_data = $this->Comment->read(null, $id)); if (empty($this->data)) { - $this->data = $this->Comment->read(null, $id); + $this->data = $comment_data; } $translations = $this->Comment->Translation->find('list'); $identifiers = $this->Comment->Identifier->find('list'); @@ -119,8 +139,9 @@ class CommentsController extends AppController { $this->Session->setFlash(__('The comment could not be saved. Please, try again.', true)); } } + $this->set('comment', $comment_data = $this->Comment->read(null, $id)); if (empty($this->data)) { - $this->data = $this->Comment->read(null, $id); + $this->data = $comment_data; } $translations = $this->Comment->Translation->find('list'); $identifiers = $this->Comment->Identifier->find('list'); diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/components/path_resolver.php b/code/ryzom/tools/server/www/webtt/app/controllers/components/path_resolver.php index 2fffe0f3f..8dcd96c99 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/components/path_resolver.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/components/path_resolver.php @@ -1,98 +1,42 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +belongsTo as $childModel => $junk) { - $names[] = $this->getAssociationsTree($model->{$childModel}); + if ($model->alias != $model->{$childModel}->alias) + $names[] = $this->getAssociationsTree($model->{$childModel}); } return array($model->alias => $names); } - function node_path ($node_name, $tree) { - foreach ($tree as $name => $val) { - if ($name == $node_name) return $name; - foreach ($val as $subtree) { - $ret = $this->node_path($node_name, $subtree); - if ($ret != '') return "$name => $ret"; - } - } - } - - function findModelPath_old2($name, $assocTree, $path = null) - { -// debug($name, $assocTree, $path); -// debug($name); -// debug($assocTree); -// debug($path); - foreach ($assocTree as $model => $childs) - { - if (!isset($path)) - $path = array($model => ""); - if ($model == $name) - { -// $newPath[$childModel] = $path; -// debug($childModel); - return array($model => $model); -// return $model; - } - foreach ($childs as $childModelArray => $subTree) - { -// debug(array($childModel => $newAssocTree)); -// debug_print_backtrace(); -// if ($ret = $this->findModelPath($name, $subTree, $newPath)) - if ($ret = $this->findModelPath($name, $subTree)) - { - echo "## model: "; var_dump($model); - echo "## key subTree: "; var_dump(key($subTree)); - echo "## ret:\n"; var_dump($ret); -// var_dump(array(key($subTree) => $ret)); -// return array(key($subTree) => $ret); -// return array($model => key($subTree)); -// return array($model => $ret); - return array($model => $ret); - } - } - } -// return $path; - - } - function t($i) { return str_repeat("\t",$i); } - function getAssociationsGraph($name, $assocTree) - { - static $graph = array(); - foreach ($assocTree as $model => $childs) - { - if ($model == $name) - return true; - foreach ($childs as $childModelArray) - { - foreach ($childModelArray as $childModel => $newAssocTree) - { - if ($ret = $this->getAssociationsGraph($name, array($childModel => $newAssocTree))) - { - $graph[$childModel][] = $model; -// var_dump($graph); - } - } - } - } -// var_dump($graph); - return $graph; - } - function findModelPath($name, $assocTree, $path = null) { -// debug($name, $assocTree, $path); -// debug($name); -// debug($assocTree); -// debug($path); foreach ($assocTree as $model => $childs) { if (!isset($path)) @@ -101,12 +45,9 @@ class PathResolverComponent extends Object { { foreach ($childModelArray as $childModel => $newAssocTree) { -// debug(array($childModel => $newAssocTree)); -// debug_print_backtrace(); $newPath[$childModel] = $path; if ($name == $childModel) { -// debug($childModel); return $newPath; } else @@ -117,36 +58,9 @@ class PathResolverComponent extends Object { } } } -// return $path; } - - function printPath($model) - { - if (!isset($model->belongsTo)) - return null; - $assocTree = $this->getAssociationsTree($model); - $path = $this->findModelPath('Language', $assocTree); -// $path = $this->findModelPath('User', $assocTree); -// var_dump($path); -// return 0; - $text = null; - while ($path) - { - $model = key($path); -/* foreach ($path as $model => $childs) - { - $controller = Inflector::pluralize(Inflector::underscore($model)); - } - $path = $childs;*/ - $controller = Inflector::pluralize(Inflector::underscore($model)); - $path = $path[$model]; - $new_path[$controller] = $new_path; - var_dump($new_path); - $text .= " => " . $controller; - } - return $text; - } + function beforeRender($controller) { if (!isset($controller->{$controller->modelClass})) @@ -155,11 +69,10 @@ class PathResolverComponent extends Object { if (!isset($model->belongsTo)) return 0; $assocTree = $this->getAssociationsTree($model); -// var_dump($assocTree); - $path = $this->findModelPath('Language', $assocTree); - if (!$path) - $path = array('Language' => array()); -// var_dump($path); + $rootModel = 'Language'; + $path = $this->findModelPath($rootModel, $assocTree); + if (!$path && $model->alias == $rootModel) + $path = array($rootModel => array()); $controller->set('assocPath', $path); } diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/file_identifiers_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/file_identifiers_controller.php index eabc80e77..fd87e4928 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/file_identifiers_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/file_identifiers_controller.php @@ -1,4 +1,23 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +set('fileIdentifier', $this->FileIdentifier->read(null, $id)); } - function add() { - if (!empty($this->data)) { - $this->FileIdentifier->create(); - if ($this->FileIdentifier->save($this->data)) { - $this->Session->setFlash(__('The file identifier has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The file identifier could not be saved. Please, try again.', true)); - } - } - $importedTranslationFiles = $this->FileIdentifier->ImportedTranslationFile->find('list'); - $identifiers = $this->FileIdentifier->Identifier->find('list'); - $this->set(compact('importedTranslationFiles', 'identifiers')); - } - - function edit($id = null) { - if (!$id && empty($this->data)) { - $this->Session->setFlash(__('Invalid file identifier', true)); - $this->redirect(array('action' => 'index')); - } - if (!empty($this->data)) { - if ($this->FileIdentifier->save($this->data)) { - $this->Session->setFlash(__('The file identifier has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The file identifier could not be saved. Please, try again.', true)); - } - } - if (empty($this->data)) { - $this->data = $this->FileIdentifier->read(null, $id); - } - $importedTranslationFiles = $this->FileIdentifier->ImportedTranslationFile->find('list'); - $identifiers = $this->FileIdentifier->Identifier->find('list'); - $this->set(compact('importedTranslationFiles', 'identifiers')); - } - - function delete($id = null) { - if (!$id) { - $this->Session->setFlash(__('Invalid id for file identifier', true)); - $this->redirect(array('action'=>'index')); - } - if ($this->FileIdentifier->delete($id)) { - $this->Session->setFlash(__('File identifier deleted', true)); - $this->redirect(array('action'=>'index')); - } - $this->Session->setFlash(__('File identifier was not deleted', true)); - $this->redirect(array('action' => 'index')); - } - function admin_index() { - $this->FileIdentifier->recursive = 0; - $this->set('fileIdentifiers', $this->paginate()); - } - function admin_view($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid file identifier', true)); @@ -105,8 +71,9 @@ class FileIdentifiersController extends AppController { $this->Session->setFlash(__('The file identifier could not be saved. Please, try again.', true)); } } + $this->set('fileIdentifier', $fileIdentifier_data = $this->FileIdentifier->read(null, $id)); if (empty($this->data)) { - $this->data = $this->FileIdentifier->read(null, $id); + $this->data = $fileIdentifier_data; } $importedTranslationFiles = $this->FileIdentifier->ImportedTranslationFile->find('list'); $identifiers = $this->FileIdentifier->Identifier->find('list'); diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/identifier_columns_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/identifier_columns_controller.php index 19695fa20..0c29ebe22 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/identifier_columns_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/identifier_columns_controller.php @@ -1,4 +1,23 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +set('identifierColumn', $this->IdentifierColumn->read(null, $id)); } - function add() { - if (!empty($this->data)) { - $this->IdentifierColumn->create(); - if ($this->IdentifierColumn->save($this->data)) { - $this->Session->setFlash(__('The identifier column has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The identifier column could not be saved. Please, try again.', true)); - } - } - $identifiers = $this->IdentifierColumn->Identifier->find('list'); - $this->set(compact('identifiers')); - } - - function edit($id = null) { - if (!$id && empty($this->data)) { - $this->Session->setFlash(__('Invalid identifier column', true)); - $this->redirect(array('action' => 'index')); - } - if (!empty($this->data)) { - if ($this->IdentifierColumn->save($this->data)) { - $this->Session->setFlash(__('The identifier column has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The identifier column could not be saved. Please, try again.', true)); - } - } - if (empty($this->data)) { - $this->data = $this->IdentifierColumn->read(null, $id); - } - $identifiers = $this->IdentifierColumn->Identifier->find('list'); - $this->set(compact('identifiers')); - } - - function delete($id = null) { - if (!$id) { - $this->Session->setFlash(__('Invalid id for identifier column', true)); - $this->redirect(array('action'=>'index')); - } - if ($this->IdentifierColumn->delete($id)) { - $this->Session->setFlash(__('Identifier column deleted', true)); - $this->redirect(array('action'=>'index')); - } - $this->Session->setFlash(__('Identifier column was not deleted', true)); - $this->redirect(array('action' => 'index')); - } function admin_index() { $this->IdentifierColumn->recursive = 0; $this->set('identifierColumns', $this->paginate()); @@ -102,8 +75,9 @@ class IdentifierColumnsController extends AppController { $this->Session->setFlash(__('The identifier column could not be saved. Please, try again.', true)); } } + $this->set('identifierColumn', $identifierColumn_data = $this->IdentifierColumn->read(null, $id)); if (empty($this->data)) { - $this->data = $this->IdentifierColumn->read(null, $id); + $this->data = $identifierColumn_data; } $identifiers = $this->IdentifierColumn->Identifier->find('list'); $this->set(compact('identifiers')); diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/identifiers_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/identifiers_controller.php index 01c5911e7..57bb7e812 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/identifiers_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/identifiers_controller.php @@ -1,12 +1,27 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +Identifier->recursive = 0; -// Router::connectNamed(array('language')); - $conditions = null; if (isset($this->passedArgs['language']) && $lang = $this->passedArgs['language']) $conditions = array('Identifier.language_id' => $lang); @@ -45,55 +60,11 @@ class IdentifiersController extends AppController { $this->Session->setFlash(__('Invalid identifier', true)); $this->redirect(array('action' => 'index')); } - $this->set('identifier', $this->Identifier->read(null, $id)); + $this->set('identifier', $identifier = $this->Identifier->read(null, $id)); + if ($identifier) + $this->set('identifierNeighbours', $this->Identifier->getNeighbours($id)); } - function add() { - if (!empty($this->data)) { - $this->Identifier->create(); - if ($this->Identifier->save($this->data)) { - $this->Session->setFlash(__('The identifier has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The identifier could not be saved. Please, try again.', true)); - } - } - $languages = $this->Identifier->Language->find('list'); - $this->set(compact('languages')); - } - - function edit($id = null) { - if (!$id && empty($this->data)) { - $this->Session->setFlash(__('Invalid identifier', true)); - $this->redirect(array('action' => 'index')); - } - if (!empty($this->data)) { - if ($this->Identifier->save($this->data)) { - $this->Session->setFlash(__('The identifier has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The identifier could not be saved. Please, try again.', true)); - } - } - if (empty($this->data)) { - $this->data = $this->Identifier->read(null, $id); - } - $languages = $this->Identifier->Language->find('list'); - $this->set(compact('languages')); - } - - function delete($id = null) { - if (!$id) { - $this->Session->setFlash(__('Invalid id for identifier', true)); - $this->redirect(array('action'=>'index')); - } - if ($this->Identifier->delete($id)) { - $this->Session->setFlash(__('Identifier deleted', true)); - $this->redirect(array('action'=>'index')); - } - $this->Session->setFlash(__('Identifier was not deleted', true)); - $this->redirect(array('action' => 'index')); - } function admin_index() { $this->Identifier->recursive = 0; $this->set('identifiers', $this->paginate()); @@ -104,7 +75,9 @@ class IdentifiersController extends AppController { $this->Session->setFlash(__('Invalid identifier', true)); $this->redirect(array('action' => 'index')); } - $this->set('identifier', $this->Identifier->read(null, $id)); + $this->set('identifier', $identifier = $this->Identifier->read(null, $id)); + if ($identifier) + $this->set('identifierNeighbours', $this->Identifier->getNeighbours($id)); } function admin_add() { @@ -134,8 +107,9 @@ class IdentifiersController extends AppController { $this->Session->setFlash(__('The identifier could not be saved. Please, try again.', true)); } } + $this->set('identifier', $identifier_data = $this->Identifier->read(null, $id)); if (empty($this->data)) { - $this->data = $this->Identifier->read(null, $id); + $this->data = $identifier_data; } $languages = $this->Identifier->Language->find('list'); $this->set(compact('languages')); diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/imported_translation_files_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/imported_translation_files_controller.php index 58296aed4..2a64123bb 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/imported_translation_files_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/imported_translation_files_controller.php @@ -1,8 +1,26 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +ImportedTranslationFile->recursive = 0; $this->set('importedTranslationFiles', $this->paginate()); @@ -14,142 +32,10 @@ class ImportedTranslationFilesController extends AppController { $this->redirect(array('action' => 'index')); } $this->set('importedTranslationFile', $this->ImportedTranslationFile->read(null, $id)); -// var_dump($this->ImportedTranslationFile->RawFile); } - function admin_import($filename = null) { -// $this->view = "index"; - App::import("Vendor","UxtParser", array("file" => 'UxtParser.php')); -/* if (!$filename) { - $this->Session->setFlash(__('Invalid file', true)); - $this->redirect(array('action' => 'index')); - return 0; - }*/ - $filename="diff/pl_diff_4DEC868A.uxt"; - $translationFile = $this->ImportedTranslationFile->find('first', array('conditions' => array('ImportedTranslationFile.filename' => $filename))); - if ($translationFile) - { - $this->Session->setFlash(__('Translation file already imported', true)); - $this->redirect(array('action' => 'index')); - return 0; - } -// var_dump($file); - $parser = new UxtParser(); - $parsedFile = $parser->parseFile($filename); -// var_dump($parsedFile); - $arr = explode("_", basename($filename, ".uxt")); -// var_dump($arr); - $language_id = 1; - - $this->ImportedTranslationFile->create(); - $data['ImportedTranslationFile']['language_id'] = $language_id; - $data['ImportedTranslationFile']['filename'] = $filename; - //$this->ImportedTranslationFile->save($data); - foreach ($parsedFile as $ent) - { - $fi_data = array(); - if ($ent['type'] != "string") - continue; - - - $i_data['language_id'] = $language_id; - $i_data['translation_index'] = $ent['index']; - $i_data['reference_string'] = $ent['string']; - unset($this->ImportedTranslationFile->Language->Identifier->id); - $identifier = $this->ImportedTranslationFile->Language->Identifier->find('first',array('conditions' => array('Identifier.identifier' => $ent['identifier'], 'Identifier.language_id' => $language_id))); - if ($identifier) - { -// var_dump($identifier); - $i_data['id']=$identifier['Identifier']['id']; - } - else - { - $i_data['identifier'] = $ent['identifier']; - $i_data['translated'] = false; - } - var_dump($i_data); - $this->ImportedTranslationFile->Language->Identifier->save(array('Identifier' => $i_data)); - $identifier_id = $this->ImportedTranslationFile->Language->Identifier->id; - var_dump($identifier_id); - - unset($this->ImportedTranslationFile->FileIdentifier->id); - //TODO - set FileIdentifier['id'] if we import already imported file (imported imported file temporarly disabled) -// $identifier = $this->ImportedTranslationFile->FileIdentifier->find('first',array('conditions' => array('FileIdentifier.identifier' => $ent['identifier'], 'FileIdentifier.translation_file_id' => $))); -// $data['FileIdentifier']['translation_file_id'] = $this->ImportedTranslationFile->id; - if ($ent['diff']) - $fi_data['command'] = "DIFF " . mb_strtoupper($ent['diff']); - $fi_data['translation_index'] = $ent['index']; -// $data['FileIdentifier']['identifier_id'] = ; - $fi_data['reference_string'] = $ent['string']; - $fi_data['identifier_id'] = $identifier_id; - -// $this->ImportedTranslationFile->FileIdentifier->create(); -// $this->ImportedTranslationFile->FileIdentifier->save($data); - $data['FileIdentifier'][] = $fi_data; -// $l_data['Language']['id'] = $language_id; -// $l_data['Identifier'][] = $i_data; -// $data['Identifier'][] = $i_data; - } -// var_dump($data); -// $this->ImportedTranslationFile->Language->saveAll($l_data); - $this->ImportedTranslationFile->saveAll($data); - $this->Session->setFlash(__('Translation file imported', true)); - $this->redirect(array('action' => 'view', $this->ImportedTranslationFile->id)); - $this->ImportedTranslationFile->recursive = 0; - $this->set('importedTranslationFiles', $this->paginate()); -// $this->render('index'); - } - - - function add() { - if (!empty($this->data)) { - $this->ImportedTranslationFile->create(); - if ($this->ImportedTranslationFile->save($this->data)) { - $this->Session->setFlash(__('The translation file has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The translation file could not be saved. Please, try again.', true)); - } - } - $languages = $this->ImportedTranslationFile->Language->find('list'); - $this->set(compact('languages')); - } - - function edit($id = null) { - if (!$id && empty($this->data)) { - $this->Session->setFlash(__('Invalid translation file', true)); - $this->redirect(array('action' => 'index')); - } - if (!empty($this->data)) { - if ($this->ImportedTranslationFile->save($this->data)) { - $this->Session->setFlash(__('The translation file has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The translation file could not be saved. Please, try again.', true)); - } - } - if (empty($this->data)) { - $this->data = $this->ImportedTranslationFile->read(null, $id); - } - $languages = $this->ImportedTranslationFile->Language->find('list'); - $this->set(compact('languages')); - } - - function delete($id = null) { - if (!$id) { - $this->Session->setFlash(__('Invalid id for translation file', true)); - $this->redirect(array('action'=>'index')); - } - if ($this->ImportedTranslationFile->delete($id)) { - $this->Session->setFlash(__('Translation file deleted', true)); - $this->redirect(array('action'=>'index')); - } - $this->Session->setFlash(__('Translation file was not deleted', true)); - $this->redirect(array('action' => 'index')); - } function admin_index() { $this->ImportedTranslationFile->recursive = 0; -// FireCake::dump("??",$_SERVER); $this->set('importedTranslationFiles', $this->paginate()); } @@ -188,8 +74,9 @@ class ImportedTranslationFilesController extends AppController { $this->Session->setFlash(__('The translation file could not be saved. Please, try again.', true)); } } + $this->set('importedTranslationFile', $importedTranslationFile_data = $this->ImportedTranslationFile->read(null, $id)); if (empty($this->data)) { - $this->data = $this->ImportedTranslationFile->read(null, $id); + $this->data = $importedTranslationFile_data; } $languages = $this->ImportedTranslationFile->Language->find('list'); $this->set(compact('languages')); diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/languages_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/languages_controller.php index 53e8405d1..7b0626316 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/languages_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/languages_controller.php @@ -1,14 +1,29 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +Language->recursive = 0; $this->set('languages', $this->paginate()); @@ -22,48 +37,6 @@ class LanguagesController extends AppController { $this->set('language', $this->Language->read(null, $id)); } - function add() { - if (!empty($this->data)) { - $this->Language->create(); - if ($this->Language->save($this->data)) { - $this->Session->setFlash(__('The language has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); - } - } - } - - function edit($id = null) { - if (!$id && empty($this->data)) { - $this->Session->setFlash(__('Invalid language', true)); - $this->redirect(array('action' => 'index')); - } - if (!empty($this->data)) { - if ($this->Language->save($this->data)) { - $this->Session->setFlash(__('The language has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); - } - } - if (empty($this->data)) { - $this->data = $this->Language->read(null, $id); - } - } - - function delete($id = null) { - if (!$id) { - $this->Session->setFlash(__('Invalid id for language', true)); - $this->redirect(array('action'=>'index')); - } - if ($this->Language->delete($id)) { - $this->Session->setFlash(__('Language deleted', true)); - $this->redirect(array('action'=>'index')); - } - $this->Session->setFlash(__('Language was not deleted', true)); - $this->redirect(array('action' => 'index')); - } function admin_index() { $this->Language->recursive = 0; $this->set('languages', $this->paginate()); @@ -102,8 +75,9 @@ class LanguagesController extends AppController { $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); } } + $this->set('language', $language_data = $this->Language->read(null, $id)); if (empty($this->data)) { - $this->data = $this->Language->read(null, $id); + $this->data = $language_data; } } diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/pages_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/pages_controller.php index e669a9113..a6d2362b6 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/pages_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/pages_controller.php @@ -89,12 +89,10 @@ class PagesController extends AppController { /* if (isset($this->params['admin'])) array_shift($path);*/ -//var_dump($path); if (!isset($path[0]) || $path[0] != 'admin') { //This adds admin to the beginning of the path so the pages controller will look in the 'admin' folder in pages directory $path = array_merge((array)'admin', $path); } -// var_dump($path); $count = count($path); if (!$count) { $this->redirect('/'); diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/raw_files_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/raw_files_controller.php index 618110db2..0620a1312 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/raw_files_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/raw_files_controller.php @@ -1,4 +1,23 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +RawFile->recursive = 1; -// var_dump($this->RawFile->find('count')); -// $db =& ConnectionManager::getDataSource($this->RawFile->useDbConfig); -// var_dump($db->calculate($this->RawFile, 'count')); $conditions['RawFile.dir'] = array("diff","translated"); $this->set('rawFiles', $this->paginate($conditions)); -// $this->log(Router::parse($this->referer())); -// var_dump($this->paginate()); } function admin_listdir($extension = null) { $this->RawFile->recursive = 0; $this->set('rawFiles', $this->paginate(array("RawFile.extension" => $extension))); $this->rendeR("admin_index"); -// var_dump($this->paginate()); } function admin_view($dir = null, $filename = null) { @@ -34,8 +47,6 @@ class RawFilesController extends AppController { $this->redirect(array('action' => 'index')); return 0; } -// $id = $dir . DS . $filename; -// $this->set('rawFile', $this->RawFile->read(null, $id)); $this->set('rawFile', $rawFile = $this->RawFile->find('first', array( "conditions" => array( "RawFile.dir" => $dir, @@ -46,13 +57,7 @@ class RawFilesController extends AppController { $this->set('fileContent', $this->RawFile->_currentFile->read()); } -/* function import($dir = null, $filename = null) { - $this->admin_import($dir, $filename); - }*/ - function admin_import($dir = null, $filename = null) { -// $this->view = "index"; -// App::import("Vendor","UxtParser", array("file" => 'UxtParser.php')); if (!$filename) { $this->Session->setFlash(__('Invalid file', true)); $this->redirect(array('action' => 'index')); @@ -67,28 +72,19 @@ class RawFilesController extends AppController { $importedTranslationFileModel = $this->RawFile->ImportedTranslationFile; $translationFileModel = $importedTranslationFileModel->TranslationFile; $languageModel = $translationFileModel->Language; -// $identifierModel = $languageModel->Identifier; $identifierModel = $translationFileModel->Identifier; $identifierColumnModel = $identifierModel->IdentifierColumn; $translationModel = $identifierModel->Translation; $fileIdentifierModel = $importedTranslationFileModel->FileIdentifier; -// $filename="diff/pl_diff_4DEC868A.uxt"; $importedTranslationFile = $importedTranslationFileModel->find('first', array('conditions' => array('ImportedTranslationFile.filename' => $dir . DS . $filename), "recursive" => -1)); -/* var_dump($translationFile); - return 0;*/ if ($importedTranslationFile) { $this->Session->setFlash(__('Translation file already imported', true)); $this->redirect(array('action' => 'index')); return 0; } -// var_dump($file); -// $parser = new UxtParser(); -// $arr = explode("_", basename($filename, ".uxt")); -// var_dump($arr); -// $language_id = 1; $languageCode = $this->RawFile->getLanguageCode($filename); if (!$languageCode) { @@ -104,10 +100,6 @@ class RawFilesController extends AppController { $this->redirect(array('action' => 'index')); return 0; } - else - { -// var_dump($language_id); - } $filename_template = preg_replace('/_diff/', '', $filename); $filename_template = preg_replace('/_[A-F0-9]{8}/', '', $filename_template); @@ -137,18 +129,12 @@ class RawFilesController extends AppController { $translation_file_id = $translationFileModel->id; $parsedFile = $this->RawFile->parseFile(); -/* var_dump($parsedFile); - $this->render('index'); - return 0;*/ -// $this->log($parsedFile); if (!$parsedFile) { $this->Session->setFlash(__('Error importing file', true)); $this->redirect(array('action' => 'index')); return 0; } -// $this->log($parsedFile); -// return 0; ini_set('max_execution_time',0); @@ -160,11 +146,9 @@ class RawFilesController extends AppController { $data['ImportedTranslationFile']['filename'] = $dir . DS . $filename; $data['ImportedTranslationFile']['file_last_modified_date'] = $this->RawFile->_currentFileLastChange; -// $data['TranslationFile'] = $tf_data; $importedTranslationFileModel->saveAll($data); $importedTranslationFile_id = $importedTranslationFileModel->id; - //$this->ImportedTranslationFile->save($data); foreach ($parsedFile as $ent) { if (!isset($ent['type'])) @@ -188,23 +172,25 @@ class RawFilesController extends AppController { if (isset($ent['arguments'])) $i_data['arguments'] = $ent['arguments']; - if (isset($ent['diff']) && isset($ent['string'])) + if (isset($ent['columns']) && is_array($ent['columns']) && !isset($ent['string'])) + { + foreach ($ent['columns'] as $column_no => $value) + { + $ent['string'] .= $value . "\t"; + } + $ent['string'] = substr($ent['string'], 0, -1); + } + + if (isset($ent['diff'])) { $i_data['reference_string'] = $ent['string']; } unset($identifierModel->id); $identifier = $identifierModel->find('first',array('conditions' => array('Identifier.identifier' => $ent['identifier'], 'Identifier.translation_file_id' => $translation_file_id), 'contain' => 'IdentifierColumn')); - //App::import('Vendor', 'DebugKit.FireCake'); -// FireCake::log($ent['identifier'], "Identifier"); -// FireCake::dump("identifier",$identifier); -/* $this->log($ent['identifier']); - $this->log($identifier);*/ if ($identifier) { -// var_dump($identifier); $i_data['id']=$identifier['Identifier']['id']; -// $this->log("found"); } else { @@ -213,28 +199,51 @@ class RawFilesController extends AppController { if (isset($ent['diff'])) $i_data['translated'] = false; $newIdentifier = true; -// $this->log("not found"); -// $this->log("id: # " . $identifierModel->id . " #"); -// $this->log($i_data); - } -// var_dump($i_data); $res = $identifierModel->saveAll($tarr = array('Identifier' => $i_data)); $identifier_id = $identifierModel->id; -/* $this->log('identifier saveAll res'); - $this->log($res); - $this->log(var_export($res,true)); - $this->log($identifierModel->validationErrors); - $this->log($identifierModel); - $this->log('#identifier id'); - $this->log($identifier_id); - $this->log("tarr"); - $this->log($tarr);*/ + + if (!isset($ent['diff'])) // it is translated file and we add translation + { + unset($translationModel->id); + unset($t_data); + $translationHash = $translationModel->makeHash($ent); + + if ($newIdentifier) // ovbiously there's no translation for identifier we just created + $translation = array(); + else + { + $this->log('new translation check'); + $this->log($translationHash); + $translation = $translationModel->find('first',array('conditions' => array('Translation.identifier_id' => $identifier_id, 'Translation.translation_text' => $ent["string"], 'Translation.translation_hash' => NULL), "recursive" => -1)); + $this->log($translation); + if (!$translation) + { + $translation = $translationModel->find('first',array('conditions' => array('Translation.identifier_id' => $identifier_id, 'Translation.translation_hash' => $translationHash), "recursive" => -1)); + $this->log($translation); + } + $this->log('new translation check end'); + } + + if (!$translation) + { + $this->log('new translation'); + $t_data['identifier_id'] = $identifier_id; + $t_data['translation_text'] = $ent['string']; + $t_data['user_id'] = $this->Auth->user('id'); + $t_data['translation_hash'] = $translationHash; + $translationModel->save(array('Translation' => $t_data)); + } +/* else + $t_data['id'] = $translation['Translation']['id'];*/ + if ($translation) + $parentTranslation_id = $translation['Translation']['id']; + else + $parentTranslation_id = $translationModel->id; + } if (isset($ent['columns']) && is_array($ent['columns'])) { -/* $this->log($_columns); - $this->log($ent['columns']);*/ $ic_data = array(); foreach ($ent['columns'] as $column_no => $value) { @@ -242,8 +251,6 @@ class RawFilesController extends AppController { $ic_arr = array(); $ic_arr['identifier_id'] = $identifier_id; $column_name = $_columns[$column_no]; -/* $this->log($identifier); - $this->log($column_name);*/ if (!$newIdentifier) { foreach ($identifier['IdentifierColumn'] as $identifierColumn_no => $identifierColumn) @@ -259,61 +266,29 @@ class RawFilesController extends AppController { if (isset($ent['diff'])) $ic_arr['reference_string'] = $value; $ic_data[] = $ic_arr; -// $this->log($ic_arr); $res = $identifierColumnModel->save($ic_arr); -// $this->log($res); $identifierColumn_id = $identifierColumnModel->id; -/* $this->log($identifierColumnModel->validationErrors); - $this->log(var_export($res,true));*/ if (!isset($ent['diff'])) // it is translated file and we add translation { unset($translationModel->id); + unset($t_data); if ($newIdentifier) // ovbiously there's no translation for identifier we just created $translation = array(); else - $translation = $translationModel->find('first',array('conditions' => array('Translation.identifier_column_id' => $identifierColumn_id, 'Translation.translation_text' => $value), "recursive" => -1)); + $translation = $translationModel->find('first',array('conditions' => array('Translation.identifier_column_id' => $identifierColumn_id, 'Translation.translation_text' => $value, 'Translation.parent_id' => $parentTranslation_id), "recursive" => -1)); if (!$translation) { $t_data['identifier_column_id'] = $identifierColumn_id; $t_data['translation_text'] = $value; - // TODO: change user_id for authorized user - $t_data['user_id'] = 1; + $t_data['user_id'] = $this->Auth->user('id'); + $t_data['parent_id'] = $parentTranslation_id; + $translationModel->save(array('Translation' => $t_data)); } - else - $t_data['id'] = $translation['Translation']['id']; -// var_dump($i_data); - $translationModel->save(array('Translation' => $t_data)); +/* else + $t_data['id'] = $translation['Translation']['id'];*/ } - - } -/* $res = $identifierColumnModel->saveAll($tarr = array('IdentifierColumn' => $ic_data)); - $this->log($tarr); - $this->log(var_export($res,true)); - $this->log($identifierColumnModel->validationErrors);*/ - } - else - { - if (!isset($ent['diff'])) // it is translated file and we add translation - { - unset($translationModel->id); - if ($newIdentifier) // ovbiously there's no translation for identifier we just created - $translation = array(); - else - $translation = $translationModel->find('first',array('conditions' => array('Translation.identifier_id' => $identifier_id, 'Translation.translation_text' => $ent["string"]), "recursive" => -1)); - if (!$translation) - { - $t_data['identifier_id'] = $identifier_id; - if (isset($ent['string'])) // sheets doesn't have string (they have columns) - $t_data['translation_text'] = $ent['string']; - // TODO: change user_id for authorized user - $t_data['user_id'] = 1; - } - else - $t_data['id'] = $translation['Translation']['id']; -// var_dump($i_data); - $translationModel->save(array('Translation' => $t_data)); } } @@ -341,35 +316,19 @@ class RawFilesController extends AppController { if (isset($ent['index'])) $fi_data['translation_index'] = $ent['index']; -// $data['FileIdentifier']['identifier_id'] = ; $fi_data['identifier_id'] = $identifier_id; $res = $fileIdentifierModel->saveAll($tarr = array('FileIdentifier' => $fi_data)); -// $this->log($res); -/* $this->log("#fi_data"); - $this->log($fi_data);*/ $fileIdentifier_id = $fileIdentifierModel->id; } -// $this->ImportedTranslationFile->FileIdentifier->create(); -// $this->ImportedTranslationFile->FileIdentifier->save($data); -// $data['FileIdentifier'][] = $fi_data; -// $l_data['Language']['id'] = $language_id; -// $l_data['Identifier'][] = $i_data; -// $data['Identifier'][] = $i_data; - $processedEntities++; } -/* $this->render('admin_index'); - return 0;*/ -// var_dump($data); -// $this->ImportedTranslationFile->Language->saveAll($l_data); if ($processedEntities == 0) { $importedTranslationFileModel->delete($importedTranslationFile_id); $this->Session->setFlash(__('File was not imported because it seems empty', true)); -// $this->redirect(array('action' => 'index')); $this->redirect($this->referer()); return 0; } @@ -377,26 +336,20 @@ class RawFilesController extends AppController { { $this->Session->setFlash(__('Translation file imported into database successfully. Processed entities: ' . $processedEntities, true)); $this->redirect(array('controller' => 'imported_translation_files', 'action' => 'view', $importedTranslationFileModel->id)); -// $this->render('admin_index'); return 0; } -// $this->ImportedTranslationFile->recursive = 0; -// $this->set('importedTranslationFiles', $this->paginate()); -// $this->render('index'); } function admin_export($dir = null, $filename = null, $importedTranslationFileId = null) { if (!$filename) { $this->Session->setFlash(__('Invalid file', true)); $this->redirect($this->referer()); -// $this->redirect(array('action' => 'index')); return 0; } if (!$this->RawFile->open($dir, $filename, $writable = true)) { $this->Session->setFlash(__('Can\'t open file for writing', true)); $this->redirect($this->referer()); -// $this->redirect(array('action' => 'index')); return 0; } @@ -414,24 +367,19 @@ class RawFilesController extends AppController { 'conditions' => array( 'ImportedTranslationFile.filename' => $dir . DS . $filename ), -// 'recursive' => 3 -// 'order' => 'FileIdentifier.translation_index', ) ); -/* var_dump($translationFile); - return 0;*/ if (!$importedTranslationFile) { $this->Session->setFlash(__('No imported translation file found for chosen file', true)); $this->redirect($this->referer()); -// $this->redirect(array('controller' => 'imported_translation_files', 'action' => 'index')); return 0; } $translationFileModel = $importedTranslationFileModel->TranslationFile; $identifierModel = $translationFileModel->Identifier; - // TODO: check if all identifiers have "best" translation + // check if all identifiers have "best" translation $identifier_ids = $identifierModel->withoutBestTranslation(array('ImportedTranslationFile.id' => $importedTranslationFile['ImportedTranslationFile']['id'])); if ($identifier_ids === false) { @@ -476,16 +424,11 @@ class RawFilesController extends AppController { 'index' => ((isset($fileIdentifier['translation_index']) && !empty($fileIdentifier['translation_index'])) ? $fileIdentifier['translation_index'] : null), 'internal_index' => $i++, 'type' => ((count($fileIdentifier['Identifier']['IdentifierColumn']) > 0) ? 'sheet' : 'string'), -// 'type' => ((isset($fileIdentifier['command']) && !empty($fileIdentifier['command'])) ? $fileIdentifier['command'] : null), 'identifier' => $fileIdentifier['Identifier']['identifier'], 'arguments' => ((isset($fileIdentifier['arguments']) && !empty($fileIdentifier['arguments'])) ? $fileIdentifier['arguments'] : null), -// 'string' => '', ); -// $this->log($fileIdentifier['Identifier']['Translation']); -// if (Set::numeric(array_keys($fileIdentifier['Identifier']['Translation']))) if (isset($fileIdentifier['Identifier']['Translation'][0])) { -// $this->log('numeric'); $ent['string'] = $fileIdentifier['Identifier']['Translation'][0]['translation_text']; } else if (isset($fileIdentifier['Identifier']['Translation']['translation_text'])) @@ -501,9 +444,6 @@ class RawFilesController extends AppController { foreach ($fileIdentifier['Identifier']['IdentifierColumn'] as $column_no => $identifierColumn) { -/* if (isset($identifierColumn['Translation']['translation_text'])) - $ent['columns'][$column_no] = $identifierColumn['Translation']['translation_text'];*/ - if (isset($identifierColumn['Translation'][0])) $ent['columns'][$column_no] = $identifierColumn['Translation'][0]['translation_text']; else if (isset($identifierColumn['Translation']['translation_text'])) @@ -522,33 +462,10 @@ class RawFilesController extends AppController { $entities[] = $ent; } -/* $sources = ConnectionManager::sourceList(); - $sqlLogs = array(); - foreach ($sources as $source) - { - $db =& ConnectionManager::getDataSource($source); - if (!$db->isInterfaceSupported('getLog')) - continue; - $sqlLogs[$source] = $db->getLog(); - } - $this->log($sqlLogs);*/ - -// $this->log($importedTranslationFile); -/* $this->log($sortResult); - $this->log($entities);*/ ini_set('max_execution_time',0); $result = $this->RawFile->buildFile($entities); -// $this->log($result); -// $this->render('admin_index'); -// $this->redirect(array('controller' => 'imported_translation_files', 'action' => 'index')); -// return 0; - -/* var_dump($parsedFile); - $this->render('index'); - return 0;*/ -// $this->log($parsedFile); if (!$result) { $this->Session->setFlash(__('Error exporting file', true)); diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/translation_files_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/translation_files_controller.php index 4af5324c1..dc386711b 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/translation_files_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/translation_files_controller.php @@ -1,4 +1,23 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +set('translationFile', $this->TranslationFile->read(null, $id)); } - function add() { - if (!empty($this->data)) { - $this->TranslationFile->create(); - if ($this->TranslationFile->save($this->data)) { - $this->Session->setFlash(__('The translation file has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The translation file could not be saved. Please, try again.', true)); - } - } - $languages = $this->TranslationFile->Language->find('list'); - $this->set(compact('languages')); - } - - function edit($id = null) { - if (!$id && empty($this->data)) { - $this->Session->setFlash(__('Invalid translation file', true)); - $this->redirect(array('action' => 'index')); - } - if (!empty($this->data)) { - if ($this->TranslationFile->save($this->data)) { - $this->Session->setFlash(__('The translation file has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The translation file could not be saved. Please, try again.', true)); - } - } - if (empty($this->data)) { - $this->data = $this->TranslationFile->read(null, $id); - } - $languages = $this->TranslationFile->Language->find('list'); - $this->set(compact('languages')); - } - - function delete($id = null) { - if (!$id) { - $this->Session->setFlash(__('Invalid id for translation file', true)); - $this->redirect(array('action'=>'index')); - } - if ($this->TranslationFile->delete($id)) { - $this->Session->setFlash(__('Translation file deleted', true)); - $this->redirect(array('action'=>'index')); - } - $this->Session->setFlash(__('Translation file was not deleted', true)); - $this->redirect(array('action' => 'index')); - } function admin_index() { $this->TranslationFile->recursive = 0; $this->set('translationFiles', $this->paginate()); @@ -106,8 +79,9 @@ class TranslationFilesController extends AppController { $this->Session->setFlash(__('The translation file could not be saved. Please, try again.', true)); } } + $this->set('translationFile', $translationFile_data = $this->TranslationFile->read(null, $id)); if (empty($this->data)) { - $this->data = $this->TranslationFile->read(null, $id); + $this->data = $translationFile_data; } $languages = $this->TranslationFile->Language->find('list'); $this->set(compact('languages')); diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/translations_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/translations_controller.php index f50e265d5..875799e10 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/translations_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/translations_controller.php @@ -1,4 +1,23 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +Session->setFlash(__('Invalid translation', true)); $this->redirect(array('action' => 'index')); } -// $this->recursive=2; $this->set('translation', $translation = $this->Translation->read(null, $id)); - $this->set('identifier', $identifier = $this->Translation->Identifier->read(null, $translation['Translation']['identifier_id'])); -// var_dump($translation); -// var_dump($identifier); + if (isset($translation['Translation']['identifier_id'])) + { + $this->set('identifier', $identifier = $this->Translation->Identifier->read(null, $translation['Translation']['identifier_id'])); + $this->set('columnTranslations', $columnTranslations = $this->Translation->find('all', array('conditions' => array('Translation.parent_id' => $translation['Translation']['id']), 'order' => 'Translation.id'))); + } + if ($identifier_id = $translation['Translation']['identifier_id']) + $this->set('identifierNeighbours', $this->Translation->Identifier->getNeighbours($identifier_id)); } function add() { if (!empty($this->data)) { $this->Translation->create(); - if ($res = $this->Translation->save($this->data)) { + if ($this->data['ChildTranslation']) + { + unset($translationText); + foreach ($this->data['ChildTranslation'] as $num => $childTranslation) + { + $ent['columns'][] = $childTranslation['translation_text']; + $translationText .= $childTranslation['translation_text'] . "\t"; + } + $this->data['Translation']['translation_text'] = substr($translationText, 0, -1); + } + else + $ent['string'] = $this->data['Translation']['translation_text']; + sort($ent['columns']); + $this->data['Translation']['translation_hash'] = $this->Translation->makeHash($ent); + $this->data['Identifier']['id'] = $this->data['Translation']['identifier_id']; + $this->data['Identifier']['translated'] = 1; + $res = $this->Translation->saveAll($this->data); + $this->log($this->data); + if ($res) { $this->Session->setFlash(__('The translation has been saved', true)); - $this->redirect(array('action' => 'index', 'identifier_id' => $res['Translation']['identifier_id'])); + if ($this->params['form']['Next']) + { + $identifier_id = $this->data['Translation']['identifier_id']; + $identifier = $this->Translation->Identifier->read(null, $identifier_id); + $identifierNeighbors = $this->Translation->Identifier->find('neighbors', array('field' => 'id', 'value' => $identifier_id, 'conditions' => array('translation_file_id' => $identifier['Identifier']['translation_file_id']))); + if ($nextIdentifier = $identifierNeighbors['next']) + $this->redirect(array('action' => 'add', 'identifier_id' => $nextIdentifier['Identifier']['id'])); + else + $this->redirect(array('controller' => 'identifiers', 'action' => 'index', 'translation_file_id' => $identifier['Identifier']['translation_file_id'])); + } + else + $this->redirect(array('controller' => 'identifiers', 'action' => 'view', $this->data['Translation']['identifier_id'])); } else { $this->Session->setFlash(__('The translation could not be saved. Please, try again.', true)); } @@ -36,15 +87,17 @@ class TranslationsController extends AppController { if (empty($this->passedArgs['identifier_id'])) { $this->Session->setFlash(__('You need to choose identifier for translation', true)); - $this->redirect(array('controller' => 'identifiers', 'action' => 'index')); + $this->redirect($this->referer()); } else { $identifier_id = $this->passedArgs['identifier_id']; $this->set('identifier', $identifier = $this->Translation->Identifier->read(null, $identifier_id)); -// $this->data['Translation.identifier_id'] = $identifier_id; + $this->set('identifierNeighbours', $this->Translation->Identifier->getNeighbours($identifier_id)); + $this->set('identifierColumns', $identifierColumns = $this->Translation->IdentifierColumn->find('list', array('conditions' => array('identifier_id' => $identifier_id), 'order' => 'IdentifierColumn.id'))); + if ($identifierColumns) + $this->set('identifierColumnsDetails', Set::combine($this->Translation->IdentifierColumn->find('all', array('conditions' => array('identifier_id' => $identifier_id), 'order' => 'IdentifierColumn.id')), '{n}.IdentifierColumn.id', '{n}.IdentifierColumn')); } -// $identifiers = $this->Translation->Identifier->find('list', array('recursive' => -1)); $users = $this->Translation->User->find('list'); $this->set(compact('identifiers', 'users')); } @@ -55,19 +108,51 @@ class TranslationsController extends AppController { $this->redirect(array('action' => 'index')); } if (!empty($this->data)) { - if ($this->Translation->save($this->data)) { + if ($this->data['ChildTranslation']) + { + unset($translationText); + foreach ($this->data['ChildTranslation'] as $num => $childTranslation) + { + $ent['columns'][] = $childTranslation['translation_text']; + $translationText .= $childTranslation['translation_text'] . "\t"; + } + $this->data['Translation']['translation_text'] = substr($translationText, 0, -1); + } + else + $ent['string'] = $this->data['Translation']['translation_text']; + $this->data['Translation']['translation_hash'] = $this->Translation->makeHash($ent); + $this->data['Identifier']['id'] = $this->data['Translation']['identifier_id']; + $this->data['Identifier']['translated'] = 1; + if ($this->Translation->saveAll($this->data)) { $this->Session->setFlash(__('The translation has been saved', true)); - $this->redirect(array('action' => 'index')); + $this->redirect(array('controller' => 'identifiers', 'action' => 'view', $this->data['Translation']['identifier_id'])); } else { $this->Session->setFlash(__('The translation could not be saved. Please, try again.', true)); } } + $this->set('translation', $translation_data = $this->Translation->read(null, $id)); if (empty($this->data)) { - $this->data = $this->Translation->read(null, $id); + $this->data = $translation_data; + } + $identifier_id= $translation_data['Translation']['identifier_id']; + $this->set('identifierNeighbours', $this->Translation->Identifier->getNeighbours($identifier_id)); + $this->set('identifierColumns', $identifierColumns = $this->Translation->IdentifierColumn->find('list', array('conditions' => array('identifier_id' => $identifier_id), 'order' => 'IdentifierColumn.id'))); + if ($identifierColumns) + { + $contain = array('Translation' => array( + 'conditions' => array('Translation.parent_id' => $translation_data['Translation']['id']), + )); + $identifierColumnsAll = $this->Translation->IdentifierColumn->find('all', array('conditions' => array('identifier_id' => $identifier_id), 'order' => 'IdentifierColumn.id', 'contain' => $contain)); + foreach ($translation_data['ChildTranslation'] as $childTranslationKey => $childTranslation) + { + $mapChildTranslationsColumns[$childTranslation['identifier_column_id']] = $childTranslationKey; + + } + $this->set(compact('mapChildTranslationsColumns')); + $this->set('identifierColumnsDetails', Set::combine($identifierColumnsAll, '{n}.IdentifierColumn.id', '{n}.IdentifierColumn')); + $this->set('identifierColumnTranslations', Set::combine($translation_data['ChildTranslation'], '{n}.identifier_column_id'));//, '{n}.identifier_column_id')); } -// var_dump($this->data); $identifier = $this->Translation->Identifier->read(null, $this->data['Translation']['identifier_id']); - $identifiers = $this->Translation->Identifier->find('list'); $users = $this->Translation->User->find('list'); $this->set(compact('identifiers', 'users', 'identifier')); } @@ -79,7 +164,6 @@ class TranslationsController extends AppController { } if ($this->Translation->delete($id)) { $this->Session->setFlash(__('Translation deleted', true)); -// $this->redirect(array('action'=>'index')); $this->redirect($this->referer()); } $this->Session->setFlash(__('Translation was not deleted', true)); @@ -99,52 +183,18 @@ class TranslationsController extends AppController { else $this->Session->setFlash(__('Set error', true)); $this->redirect($this->referer()); -// $this->index(); -// $this->render('index'); } function admin_view($id = null) { - if (!$id) { - $this->Session->setFlash(__('Invalid translation', true)); - $this->redirect(array('action' => 'index')); - } - $this->set('translation', $this->Translation->read(null, $id)); + return $this->view($id); } function admin_add() { - if (!empty($this->data)) { - $this->Translation->create(); - if ($this->Translation->save($this->data)) { - $this->Session->setFlash(__('The translation has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The translation could not be saved. Please, try again.', true)); - } - } - $identifiers = $this->Translation->Identifier->find('list'); - $users = $this->Translation->User->find('list'); - $this->set(compact('identifiers', 'users')); + return $this->add(); } function admin_edit($id = null) { - if (!$id && empty($this->data)) { - $this->Session->setFlash(__('Invalid translation', true)); - $this->redirect(array('action' => 'index')); - } - if (!empty($this->data)) { - if ($this->Translation->save($this->data)) { - $this->Session->setFlash(__('The translation has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The translation could not be saved. Please, try again.', true)); - } - } - if (empty($this->data)) { - $this->data = $this->Translation->read(null, $id); - } - $identifiers = $this->Translation->Identifier->find('list'); - $users = $this->Translation->User->find('list'); - $this->set(compact('identifiers', 'users')); + return $this->edit($id); } function admin_delete($id = null) { diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/users_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/users_controller.php index 5c8cbcb70..adc42655b 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/users_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/users_controller.php @@ -1,4 +1,23 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +set('user', $this->User->read(null, $id)); } - function add() { - if (!empty($this->data)) { - $this->User->create(); - if ($this->User->save($this->data)) { - $this->Session->setFlash(__('The user has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); - } - } - } - - function edit($id = null) { - if (!$id && empty($this->data)) { - $this->Session->setFlash(__('Invalid user', true)); - $this->redirect(array('action' => 'index')); - } - if (!empty($this->data)) { - if ($this->User->save($this->data)) { - $this->Session->setFlash(__('The user has been saved', true)); - $this->redirect(array('action' => 'index')); - } else { - $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); - } - } - if (empty($this->data)) { - $this->data = $this->User->read(null, $id); - } - } - - function delete($id = null) { - if (!$id) { - $this->Session->setFlash(__('Invalid id for user', true)); - $this->redirect(array('action'=>'index')); - } - if ($this->User->delete($id)) { - $this->Session->setFlash(__('User deleted', true)); - $this->redirect(array('action'=>'index')); - } - $this->Session->setFlash(__('User was not deleted', true)); - $this->redirect(array('action' => 'index')); - } function admin_index() { $this->User->recursive = 0; $this->set('users', $this->paginate()); @@ -98,8 +75,9 @@ class UsersController extends AppController { $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); } } + $this->set('user', $user_data = $this->User->read(null, $id)); if (empty($this->data)) { - $this->data = $this->User->read(null, $id); + $this->data = $user_data; } } @@ -117,6 +95,32 @@ class UsersController extends AppController { } function login() { + if (!empty($this->data)) + { + $user = $this->User->find('first', array('conditions' => array('User.username' => $this->data['User']['username']))); + $this->log($user); + if ($user['User']['confirm_hash']) + { + $this->Session->delete('Message.auth'); + $this->Session->setFlash('This account is not yet confirmed. Please use confirmation link from email to finalize registration.'); + $this->redirect($this->referer()); + } + if (!$user['User']['activated']) + { + $this->Session->delete('Message.auth'); + $this->Session->setFlash('This account is not yet activated. Please wait until administrator activates your account.'); + $this->redirect($this->referer()); + } + + } + if (!(empty($this->data)) && $this->Auth->user()) + { + $this->log('a'); + $this->User->id = $this->Auth->user('id'); + $this->User->saveField('last_login', date('Y-m-d H:i:s')); + $this->redirect($this->Auth->redirect()); + } + $this->log('b'); } function logout() { @@ -131,16 +135,10 @@ class UsersController extends AppController { function register() { if(!empty($this->data)) { $this->User->create(); -/* $assigned_password = 'newpass'; - $this->data['User']['password'] = $this->Auth->password($assigned_password);*/ $this->data['User']['password'] = $this->Auth->password($this->data['User']['passwd']); $this->data['User']['confirm_hash'] = $this->Auth->password($this->data['User']['name'] . time()); if($user = $this->User->save($this->data)) { // send signup email containing password to the user -// $this->Session->setFlash('your password is ' . $assigned_password); -// $this->Session->setFlash('your password is ' . var_export($this->data['User']['password'], true)); -// $this->Auth->login($this->data); -// $this->Email->delivery = 'debug'; $this->Email->from = 'webtt-noreply@openlink.pl'; $this->Email->to = $user['User']['email']; $this->Email->subject = 'WebTT registration'; @@ -149,10 +147,9 @@ class UsersController extends AppController { $this->set('user', $this->data); $this->set('serverName', $_SERVER['SERVER_NAME']); $this->params['url']['ext'] = 'no_debug'; -// var_dump($this->helpers); unset($this->helpers['DebugKit.Toolbar']); $this->Email->send(); - $this->Session->setFlash('Thank you for registreation. Please use confirm link from email to finalize registration.'); + $this->Session->setFlash('Thank you for registrating. Please use confirmation link from email to finalize registration.'); $this->redirect('/'); } } @@ -168,7 +165,7 @@ class UsersController extends AppController { } $this->User->id = $user['User']['id']; $this->User->save(array('confirm_hash' => null)); - $this->Session->setFlash('Thank you for registreation. You can now log in.'); + $this->Session->setFlash('Thank you for registrating. You will be able to log in after your account is activated by administrator.'); $this->redirect('/'); } } diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/votes_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/votes_controller.php index 7be099b29..7a0e0bb9e 100644 --- a/code/ryzom/tools/server/www/webtt/app/controllers/votes_controller.php +++ b/code/ryzom/tools/server/www/webtt/app/controllers/votes_controller.php @@ -1,18 +1,33 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +Vote->recursive = 0; -// var_dump($this->Vote->belongsTo); -// var_dump($this->Vote->getAssociated()); -// $model = $this->{$this->modelClass}; -// $this->log($tree=$this->PathResolver->getAssociationsTree($model)); -// $this->log($this->PathResolver->getAssociationsGraph('User',$tree)); -// $this->log($this->PathResolver->printPath($model), 'info'); -// $this->log($this->PathResolver->node_path('Language', $tree)); - $this->set('votes', $this->paginate()); + $conditions = null; + if (isset($this->passedArgs['translation_id']) && $translation_id = $this->passedArgs['translation_id']) + $conditions = array('Vote.translation_id' => $translation_id); + $this->set('votes', $this->paginate($conditions)); } function view($id = null) { @@ -39,14 +54,14 @@ class VotesController extends AppController { } function vote() { - if (empty($this->passedArgs['translation'])) + if (empty($this->passedArgs['translation_id'])) { $this->Session->setFlash(__('You need to choose translation for your vote', true)); $this->redirect(array('controller' => 'translations', 'action' => 'index')); } else { - $translation_id = $this->passedArgs['translation']; + $translation_id = $this->passedArgs['translation_id']; $translation = $this->Vote->Translation->read(null, $translation_id); if (!$translation) { @@ -55,16 +70,13 @@ class VotesController extends AppController { } $vote = array("Vote" => array( 'translation_id' => $translation_id, - // TODO: authorized user - 'user_id' => 1, + 'user_id' => $this->Auth->user('id'), ), ); $this->Vote->create(); $this->Vote->save($vote); $this->Session->setFlash(__('Vote added', true)); - $this->redirect($this->referer(array('controller' => 'translations', 'action' => 'index'))); -// $this->redirect(array('controller' => 'translations', 'action' => 'index')); -// $this->data['Translation.identifier_id'] = $identifier_id; + $this->redirect($this->referer()); } } diff --git a/code/ryzom/tools/server/www/webtt/app/models/app_model.php b/code/ryzom/tools/server/www/webtt/app/models/app_model.php index 9def128fd..82b358feb 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/app_model.php +++ b/code/ryzom/tools/server/www/webtt/app/models/app_model.php @@ -32,7 +32,9 @@ * @subpackage cake.cake.libs.model */ class AppModel extends Model { -// var $useDbConfig = 'raw_files'; +// var $recursive = 0; + var $scaffoldForbiddenActions = null; var $scaffoldActions = null; + var $scaffoldForbiddenFields = null; } diff --git a/code/ryzom/tools/server/www/webtt/app/models/behaviors/null.php b/code/ryzom/tools/server/www/webtt/app/models/behaviors/null.php new file mode 100644 index 000000000..6e8b406c9 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/models/behaviors/null.php @@ -0,0 +1,39 @@ +settings[$model->name] = $config; + } + + /** + * Enter description here... + * + * @param AppModel $model + */ + function beforeSave(&$model) + { + foreach ($this->settings[$model->name] as $field) + { + if( + true === array_key_exists($field,$model->data[$model->name]) && + true === empty($model->data[$model->name][$field]) && + 0 === strlen($model->data[$model->name][$field]) ) + { + $model->data[$model->name][$field] = null; + } + } + return true; + } +} +?> diff --git a/code/ryzom/tools/server/www/webtt/app/models/comment.php b/code/ryzom/tools/server/www/webtt/app/models/comment.php index f7419d50d..94e51f1df 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/comment.php +++ b/code/ryzom/tools/server/www/webtt/app/models/comment.php @@ -1,10 +1,28 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + "fk"); - //The Associations below have been created with all possible keys, those that are not needed can be removed var $belongsTo = array( /* 'Translation' => array( diff --git a/code/ryzom/tools/server/www/webtt/app/models/datasources/raw_files_source.php b/code/ryzom/tools/server/www/webtt/app/models/datasources/raw_files_source.php index cc8ed26e4..b775a09bc 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/datasources/raw_files_source.php +++ b/code/ryzom/tools/server/www/webtt/app/models/datasources/raw_files_source.php @@ -1,34 +1,23 @@ 'Datasources.CsvSource', - * 'path' => '/path/to/file', // Path - * 'extension' => 'csv', // File extension - * 'readonly' => true, // Mark for read only access - * 'recursive' => false // Only false is supported at the moment - * ); - */ +/* + Ryzom Core Web-Based Translation Tool + Copyright (C) 2011 Piotr Kaczmarek + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + array( diff --git a/code/ryzom/tools/server/www/webtt/app/models/identifier.php b/code/ryzom/tools/server/www/webtt/app/models/identifier.php index 5f4d2da69..14796c74f 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/identifier.php +++ b/code/ryzom/tools/server/www/webtt/app/models/identifier.php @@ -1,20 +1,29 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + array( - 'numeric' => array( - 'rule' => array('numeric'), - 'message' => 'Your custom message here', - 'allowEmpty' => false, - //'required' => true, - //'last' => false, // Stop validation after this rule - //'on' => 'create', // Limit validation to 'create' or 'update' operations - ), - ),*/ 'identifier' => array( 'A_Za_z0_9' => array( 'rule' => '/[A-Za-z0-9_@]+/', @@ -29,16 +38,7 @@ class Identifier extends AppModel { var $scaffoldForbiddenActions = array("add", "admin_add", "edit", "admin_edit", "delete", "admin_delete"); - //The Associations below have been created with all possible keys, those that are not needed can be removed - var $belongsTo = array( -/* 'Language' => array( - 'className' => 'Language', - 'foreignKey' => 'language_id', - 'conditions' => '', - 'fields' => '', - 'order' => '' - ),*/ 'TranslationFile' => array( 'className' => 'TranslationFile', 'foreignKey' => 'translation_file_id', @@ -130,4 +130,15 @@ class Identifier extends AppModel { else return false; } + + function getNeighbours($id) + { + $identifierNeighbours['current'][] = $this->read(null, $id); + if ($identifierNeighbours['current']) + { + $identifierNeighbours['prev'] = $this->find('all', array('order' => 'Identifier.id DESC', 'limit' => 5, 'conditions' => array('Identifier.translation_file_id' => $identifierNeighbours['current'][0]['Identifier']['translation_file_id'], 'Identifier.id <' => $identifierNeighbours['current'][0]['Identifier']['id']))); + $identifierNeighbours['next'] = $this->find('all', array('order' => 'Identifier.id ASC', 'limit' => 5, 'conditions' => array('Identifier.translation_file_id' => $identifierNeighbours['current'][0]['Identifier']['translation_file_id'], 'Identifier.id >' => $identifierNeighbours['current'][0]['Identifier']['id']))); + } + return $identifierNeighbours; + } } diff --git a/code/ryzom/tools/server/www/webtt/app/models/identifier_column.php b/code/ryzom/tools/server/www/webtt/app/models/identifier_column.php index c6770212b..abb038407 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/identifier_column.php +++ b/code/ryzom/tools/server/www/webtt/app/models/identifier_column.php @@ -1,12 +1,30 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + array( 'className' => 'Identifier', diff --git a/code/ryzom/tools/server/www/webtt/app/models/imported_translation_file.php b/code/ryzom/tools/server/www/webtt/app/models/imported_translation_file.php index 4a816da63..9c4021977 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/imported_translation_file.php +++ b/code/ryzom/tools/server/www/webtt/app/models/imported_translation_file.php @@ -1,22 +1,32 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + array( - 'className' => 'Language', - 'foreignKey' => 'language_id', - 'conditions' => '', - 'fields' => '', - 'order' => '' - ), 'TranslationFile' => array( 'className' => 'TranslationFile', 'foreignKey' => 'translation_file_id', diff --git a/code/ryzom/tools/server/www/webtt/app/models/language.php b/code/ryzom/tools/server/www/webtt/app/models/language.php index bd82c0fcb..bc8bdadcd 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/language.php +++ b/code/ryzom/tools/server/www/webtt/app/models/language.php @@ -1,10 +1,28 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + array( @@ -20,32 +38,5 @@ class Language extends AppModel { 'finderQuery' => '', 'counterQuery' => '' ), - 'ImportedTranslationFile' => array( - 'className' => 'ImportedTranslationFile', - 'foreignKey' => 'language_id', - 'dependent' => false, - 'conditions' => '', - 'fields' => '', - 'order' => '', - 'limit' => '', - 'offset' => '', - 'exclusive' => '', - 'finderQuery' => '', - 'counterQuery' => '' - ), - 'Identifier' => array( - 'className' => 'Identifier', - 'foreignKey' => 'language_id', - 'dependent' => false, - 'conditions' => '', - 'fields' => '', - 'order' => '', - 'limit' => '', - 'offset' => '', - 'exclusive' => '', - 'finderQuery' => '', - 'counterQuery' => '' - ), ); - } diff --git a/code/ryzom/tools/server/www/webtt/app/models/raw_file.php b/code/ryzom/tools/server/www/webtt/app/models/raw_file.php index 8911bab90..b1a72e26c 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/raw_file.php +++ b/code/ryzom/tools/server/www/webtt/app/models/raw_file.php @@ -1,4 +1,23 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + array( @@ -18,21 +36,6 @@ class RawFile extends AppModel { 'order' => '' ), ); -/* var $hasOne = array( - 'FileIdentifier' => array( - 'className' => 'FileIdentifier', - 'foreignKey' => 'translation_file_id', - 'dependent' => true, - 'conditions' => '', - 'fields' => '', - 'order' => '', - 'limit' => '', - 'offset' => '', - 'exclusive' => '', - 'finderQuery' => '', - 'counterQuery' => '' - ) - );*/ public function open($dir, $filename, $write = false) { @@ -47,7 +50,6 @@ class RawFile extends AppModel { return false; if ($write && !$file->writable()) return false; -// var_dump($filename); $this->_currentFile = $file; $this->_currentFileLastChange = $file->lastChange(); return $file; @@ -55,7 +57,6 @@ class RawFile extends AppModel { public function parseFile() { -// var_dump($this->_currentFile); if (!$this->_currentFile) return false; @@ -93,7 +94,6 @@ class RawFile extends AppModel { public function buildFile($entities) { -// var_dump($this->_currentFile); if (!$this->_currentFile) return false; @@ -133,7 +133,6 @@ class RawFile extends AppModel { public function getLanguageCode($filename) { -// var_dump($filename); if (preg_match('|^([a-z]{2})_diff_[A-F0-9]{8}\.uxt$|', $filename, $matches)) return $matches[1]; else if (preg_match('|^([a-z]{2})\.uxt$|', $filename, $matches)) diff --git a/code/ryzom/tools/server/www/webtt/app/models/translation.php b/code/ryzom/tools/server/www/webtt/app/models/translation.php index 6c8ecafdc..fd481f1e9 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/translation.php +++ b/code/ryzom/tools/server/www/webtt/app/models/translation.php @@ -1,11 +1,29 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + "fk", "index" => "fk"); - //The Associations below have been created with all possible keys, those that are not needed can be removed var $belongsTo = array( 'Identifier' => array( @@ -28,7 +46,14 @@ class Translation extends AppModel { 'conditions' => '', 'fields' => '', 'order' => '' - ) + ), + 'ParentTranslation' => array( + 'className' => 'Translation', + 'foreignKey' => 'parent_id', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ), ); var $hasMany = array( @@ -58,6 +83,19 @@ class Translation extends AppModel { 'finderQuery' => '', 'counterQuery' => '' ),*/ + 'ChildTranslation' => array( + 'className' => 'Translation', + 'foreignKey' => 'parent_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), ); function setBest() @@ -80,8 +118,18 @@ class Translation extends AppModel { ), )); $this->log($ret); - // TODO: test! return $this->id; } + + function makeHash($ent) + { + if (isset($ent['columns']) && is_array($ent['columns'])) + { + sort($ent['columns']); + return md5(serialize($ent['columns'])); + } + else if (isset($ent['string'])) + return md5($ent['string']); + } } diff --git a/code/ryzom/tools/server/www/webtt/app/models/translation_file.php b/code/ryzom/tools/server/www/webtt/app/models/translation_file.php index d972e88ac..ef4ed9421 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/translation_file.php +++ b/code/ryzom/tools/server/www/webtt/app/models/translation_file.php @@ -1,12 +1,29 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + array( 'className' => 'Language', diff --git a/code/ryzom/tools/server/www/webtt/app/models/user.php b/code/ryzom/tools/server/www/webtt/app/models/user.php index 0daa4b852..75dde4d62 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/user.php +++ b/code/ryzom/tools/server/www/webtt/app/models/user.php @@ -1,15 +1,38 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + array('confirm_hash')); + + var $recursive = 0; + var $validate = array( 'username' => array( 'alphaNumeric', -/* 'uniqueCheck' => array( + 'uniqueCheck' => array( 'rule' => 'isUnique', 'message' => 'That username has already been taken.', - ),*/ + ), ), 'email' => array('rule' => 'email', 'message' => 'Wrong format'), 'name' => array('rule' => 'notEmpty'), @@ -18,8 +41,7 @@ class User extends AppModel { ); var $scaffoldForbiddenActions = array("add", "edit", "delete"); - - //The Associations below have been created with all possible keys, those that are not needed can be removed + var $scaffoldForbiddenFields = array("" => array("activated","password","confirm_hash","created","modified"),/* "admin_" => array("password")*/); var $hasMany = array( 'Translation' => array( @@ -47,7 +69,20 @@ class User extends AppModel { 'exclusive' => '', 'finderQuery' => '', 'counterQuery' => '' - ) + ), + 'Comment' => array( + 'className' => 'Comment', + 'foreignKey' => 'user_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), ); } diff --git a/code/ryzom/tools/server/www/webtt/app/models/vote.php b/code/ryzom/tools/server/www/webtt/app/models/vote.php index f03d6b910..18737144d 100644 --- a/code/ryzom/tools/server/www/webtt/app/models/vote.php +++ b/code/ryzom/tools/server/www/webtt/app/models/vote.php @@ -1,10 +1,28 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + array( diff --git a/code/ryzom/tools/server/www/webtt/app/vendors/PhraseParser.php b/code/ryzom/tools/server/www/webtt/app/vendors/PhraseParser.php index 4e63870dd..91da72a72 100644 --- a/code/ryzom/tools/server/www/webtt/app/vendors/PhraseParser.php +++ b/code/ryzom/tools/server/www/webtt/app/vendors/PhraseParser.php @@ -1,4 +1,23 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> + + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +\n\n"; } $line_no=1; + +/* var_dump(setlocale(LC_ALL,NULL)); + var_dump(setlocale(LC_ALL,'pl_PL.UTF-8'));*/ + // Need to set UTF-8 locale to get str_getcsv to work with UTF-8 cyryllic + setlocale(LC_ALL,'pl_PL.UTF-8'); + foreach ($lines as $line) { if ($this->debug) @@ -36,11 +61,6 @@ class SheetParser // var_dump($line); $line = rtrim($line,"\r\n"); -/* var_dump(setlocale(LC_ALL,NULL)); - var_dump(setlocale(LC_ALL,'pl_PL.UTF-8'));*/ - // Need to set UTF-8 locale to get str_getcsv to work with UTF-8 cyryllic - setlocale(LC_ALL,'pl_PL.UTF-8') - $parsedLine = $this->parseLine($line); if (!$line || mb_strpos($line, "DIFF NOT") === 0 || mb_strpos($line, "REMOVE THE") === 0) diff --git a/code/ryzom/tools/server/www/webtt/app/vendors/StringParser.php b/code/ryzom/tools/server/www/webtt/app/vendors/StringParser.php index e559c0ba6..f2b4bc184 100644 --- a/code/ryzom/tools/server/www/webtt/app/vendors/StringParser.php +++ b/code/ryzom/tools/server/www/webtt/app/vendors/StringParser.php @@ -1,4 +1,23 @@ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +?> +debug) echo "DODANIE \n"; $parsedEnt += $parsedLine; - $parsedEnt['string'] .= "\n"; +// $parsedEnt['string'] .= "\n"; } if ($this->debug) diff --git a/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/webtt/views/form.ctp b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/webtt/views/form.ctp index 58b63a389..1845005c0 100644 --- a/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/webtt/views/form.ctp +++ b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/webtt/views/form.ctp @@ -23,7 +23,6 @@ ?>
+ + element('neighbours'); ?>
diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/edit.ctp index 291860a41..6d4155106 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/identifiers/edit.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/edit.ctp @@ -27,7 +27,8 @@
- + + element('neighbours'); ?>

diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/index.ctp index 5687d8579..51338e607 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/identifiers/index.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/index.ctp @@ -7,11 +7,11 @@
@@ -19,6 +19,7 @@
+

Choose an identifier you want to translate and click "View details and comments" to see details and its translations or use shortcut actions, ie. "Add Translation", "List Translations", "Add Comment".

tableHeaders(array($paginator->sort('id'),$paginator->sort('translation_file_id'),$paginator->sort('identifier'),$paginator->sort('arguments'),$paginator->sort('reference_string'),$paginator->sort('translated'),__('Actions', true),)); echo ''.$tableHeaders.''; ?> diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/view.ctp index b6790e74d..84a9d13f4 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/identifiers/view.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/view.ctp @@ -1,37 +1,40 @@
-
- +

You can see translations for this identifier in "Related Translations" section. Click "View" on the list to see translation details. Click "New related Translation" below the list to add one.

@@ -103,6 +106,46 @@
+ + + + + + + + + + + + > + + + + + + + + +
+ + +
+
    +
+
+
@@ -195,7 +240,8 @@
    -
  • Html->link(sprintf(__('New %s', true), __('Comment', true)), array('controller' => 'comments', 'action' => 'add', 'identifier_id' => $identifier['Identifier']['id']));?>
  • +
  • Html->link(sprintf(__('List related %s', true), __('Comments', true)), array('controller' => 'comments', 'action' => 'index', 'identifier_id' => $identifier['Identifier']['id']));?>
  • +
  • Html->link(sprintf(__('New related %s', true), __('Comment', true)), array('controller' => 'comments', 'action' => 'add', 'identifier_id' => $identifier['Identifier']['id']));?>
diff --git a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_index.ctp index e0278b9cf..c120af9c5 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_index.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_index.ctp @@ -25,7 +25,7 @@

- tableHeaders(array($paginator->sort('id'),$paginator->sort('language_id'),$paginator->sort('filename'),$paginator->sort('merged'),$paginator->sort('file_last_modified_date'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); +
tableHeaders(array($paginator->sort('id'),$paginator->sort('translation_file_id'),$paginator->sort('filename'),$paginator->sort('merged'),$paginator->sort('file_last_modified_date'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); echo ''.$tableHeaders.''; ?> > diff --git a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_view.ctp index ce984a1f1..5c176d6a4 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_view.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_view.ctp @@ -44,9 +44,9 @@
-
+
- Html->link($importedTranslationFile['Language']['name'], array('controller' => 'languages', 'action' => 'view', $importedTranslationFile['Language']['id'])); ?> + Html->link($importedTranslationFile['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $importedTranslationFile['TranslationFile']['id'])); ?>
@@ -137,7 +137,6 @@
    -
diff --git a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/index.ctp index 57f041dfc..f3fb264e5 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/index.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/index.ctp @@ -38,7 +38,7 @@ > diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/add.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/add.ctp deleted file mode 100644 index 23eed9eb2..000000000 --- a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/add.ctp +++ /dev/null @@ -1,22 +0,0 @@ -
-Form->create('Language');?> -
- - Form->input('name'); - echo $this->Form->input('code'); - ?> -
-Form->end(__('Submit', true));?> -
-
-

-
    - -
  • Html->link(__('List Languages', true), array('action' => 'index'));?>
  • -
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • -
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • -
-
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_add.ctp deleted file mode 100644 index d4e5e1034..000000000 --- a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_add.ctp +++ /dev/null @@ -1,22 +0,0 @@ -
-Form->create('Language');?> -
- - Form->input('name'); - echo $this->Form->input('code'); - ?> -
-Form->end(__('Submit', true));?> -
-
-

-
    - -
  • Html->link(__('List Languages', true), array('action' => 'index'));?>
  • -
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • -
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • -
-
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_edit.ctp deleted file mode 100644 index f68d48baa..000000000 --- a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_edit.ctp +++ /dev/null @@ -1,24 +0,0 @@ -
-Form->create('Language');?> -
- - Form->input('id'); - echo $this->Form->input('name'); - echo $this->Form->input('code'); - ?> -
-Form->end(__('Submit', true));?> -
-
-

-
    - -
  • Html->link(__('Delete', true), array('action' => 'delete', $this->Form->value('Language.id')), null, sprintf(__('Are you sure you want to delete # %s?', true), $this->Form->value('Language.id'))); ?>
  • -
  • Html->link(__('List Languages', true), array('action' => 'index'));?>
  • -
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • -
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • -
-
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_index.ctp deleted file mode 100644 index e18bb771c..000000000 --- a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_index.ctp +++ /dev/null @@ -1,57 +0,0 @@ -
-

-
- Html->link($importedTranslationFile['Language']['name'], array('controller' => 'languages', 'action' => 'view', $importedTranslationFile['Language']['id'])); ?> + Html->link($importedTranslationFile['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $importedTranslationFile['TranslationFile']['id'])); ?> - Html->link($importedTranslationFile['Language']['name'], array('controller' => 'languages', 'action' => 'view', $importedTranslationFile['Language']['id'])); ?> + Html->link($importedTranslationFile['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $importedTranslationFile['TranslationFile']['id'])); ?>
- - - - - - - - - - > - - - - - - - - -
Paginator->sort('id');?>Paginator->sort('name');?>Paginator->sort('code');?>Paginator->sort('created');?>Paginator->sort('modified');?>
      - Html->link(__('View', true), array('action' => 'view', $language['Language']['id'])); ?> - Html->link(__('Edit', true), array('action' => 'edit', $language['Language']['id'])); ?> - Html->link(__('Delete', true), array('action' => 'delete', $language['Language']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $language['Language']['id'])); ?> -
-

- Paginator->counter(array( - 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) - )); - ?>

- -
- Paginator->prev('<< ' . __('previous', true), array(), null, array('class'=>'disabled'));?> - | Paginator->numbers();?> - | - Paginator->next(__('next', true) . ' >>', array(), null, array('class' => 'disabled'));?> -
-
-
-

-
    -
  • Html->link(__('New Language', true), array('action' => 'add')); ?>
  • -
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • -
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • -
-
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_view.ctp deleted file mode 100644 index aa7f2c923..000000000 --- a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_view.ctp +++ /dev/null @@ -1,133 +0,0 @@ -
-

-
- > - > - -   - - > - > - -   - - > - > - -   - - > - > - -   - - > - > - -   - -
-
-
-

-
    -
  • Html->link(__('Edit Language', true), array('action' => 'edit', $language['Language']['id'])); ?>
  • -
  • Html->link(__('Delete Language', true), array('action' => 'delete', $language['Language']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $language['Language']['id'])); ?>
  • -
  • Html->link(__('List Languages', true), array('action' => 'index')); ?>
  • -
  • Html->link(__('New Language', true), array('action' => 'add')); ?>
  • -
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • -
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • -
-
- - diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/edit.ctp deleted file mode 100644 index 5eab47bb4..000000000 --- a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/edit.ctp +++ /dev/null @@ -1,24 +0,0 @@ -
-Form->create('Language');?> -
- - Form->input('id'); - echo $this->Form->input('name'); - echo $this->Form->input('code'); - ?> -
-Form->end(__('Submit', true));?> -
-
-

-
    - -
  • Html->link(__('Delete', true), array('action' => 'delete', $this->Form->value('Language.id')), null, sprintf(__('Are you sure you want to delete # %s?', true), $this->Form->value('Language.id'))); ?>
  • -
  • Html->link(__('List Languages', true), array('action' => 'index'));?>
  • -
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • -
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • -
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • -
-
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/index.ctp deleted file mode 100644 index 64cdf3bb4..000000000 --- a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/index.ctp +++ /dev/null @@ -1,53 +0,0 @@ -
-

- - - - - - - - - - - > - - - - - - - - -
Paginator->sort('id');?>Paginator->sort('name');?>Paginator->sort('code');?>Paginator->sort('created');?>Paginator->sort('modified');?>
      - Html->link(__('View', true), array('action' => 'view', $language['Language']['id'])); ?> -
-

- Paginator->counter(array( - 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) - )); - ?>

- -
- Paginator->prev('<< ' . __('previous', true), array(), null, array('class'=>'disabled'));?> - | Paginator->numbers();?> - | - Paginator->next(__('next', true) . ' >>', array(), null, array('class' => 'disabled'));?> -
-
-
-

-
    -
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • -

  • -
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • -
-
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/view.ctp deleted file mode 100644 index 8560bc864..000000000 --- a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/view.ctp +++ /dev/null @@ -1,114 +0,0 @@ -
-

-
- > - > - -   - - > - > - -   - - > - > - -   - - > - > - -   - - > - > - -   - -
-
-
-

-
    -
  • Html->link(__('List Languages', true), array('action' => 'index')); ?>
  • -

  • -
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • -

  • -
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • -
-
- - diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages/add.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages/add.ctp index 34124ee82..3315b4f4a 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/languages/add.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/languages/add.ctp @@ -1,22 +1,17 @@
+
+Form->end(__('Submit', true));?> +
diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages/admin_add.ctp index ab56f03bb..64cc85c80 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/languages/admin_add.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/languages/admin_add.ctp @@ -1,27 +1,17 @@
+ +
diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/default.ctp.bak b/code/ryzom/tools/server/www/webtt/app/views/layouts/default.ctp.bak deleted file mode 100644 index ee4c977be..000000000 --- a/code/ryzom/tools/server/www/webtt/app/views/layouts/default.ctp.bak +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Html->charset(); ?> - - <?php __('Ryzom Core: Web Translation Tool :: '); ?> - <?php echo $title_for_layout; ?> - - Html->meta('icon'); - - echo $this->Html->css('cake.generic'); - - echo $scripts_for_layout; - ?> - - -
- -
- - Session->flash(); ?> - - - -
- -
- element('sql_dump'); ?> - - \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/email/html/empty b/code/ryzom/tools/server/www/webtt/app/views/layouts/email/html/empty deleted file mode 100644 index e69de29bb..000000000 diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/email/text/empty b/code/ryzom/tools/server/www/webtt/app/views/layouts/email/text/empty deleted file mode 100644 index e69de29bb..000000000 diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/new.ctp b/code/ryzom/tools/server/www/webtt/app/views/layouts/new.ctp index 761e4d8c8..c47f19055 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/layouts/new.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/layouts/new.ctp @@ -15,6 +15,17 @@ echo $this->Html->script(array('jquery-1.3.2.min.js', 'jquery-ui.js', 'jquery-fluid16.js')); echo $scripts_for_layout; ?> + @@ -46,35 +57,44 @@ - -
-
-
-
/ - Html->link(__(Inflector::pluralize($model), true), array('controller' => $controller, 'action' => 'index')); - if ($path) - echo " / "; - } - ?> -
-
-
-
-
-
+
+
+ if (isset($assocPath)) { + ?> +
+
/ + Html->link(__(Inflector::pluralize($model), true), array('controller' => $controller, 'action' => 'index')); + if ($path) + echo " / "; + } + ?> +
+
+ +
+ Session->read('Auth.User.id')) + echo $this->Html->link(__('Logout', true), array('admin' => false, 'controller' => 'users', 'action' => 'logout')); + else if ($this->params['controller'] == 'users') + echo $this->Html->link(__('Register', true), array('admin' => false, 'controller' => 'users', 'action' => 'register')); + ?> +
+
+
+
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/pages/empty b/code/ryzom/tools/server/www/webtt/app/views/pages/empty deleted file mode 100644 index e69de29bb..000000000 diff --git a/code/ryzom/tools/server/www/webtt/app/views/pages/home.ctp b/code/ryzom/tools/server/www/webtt/app/views/pages/home.ctp index fb895390b..4746aa692 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/pages/home.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/pages/home.ctp @@ -18,7 +18,7 @@ */ ?>
-

+

Click the link below to list the languages in the project.

Html->link(__('List Languages', true), array('controller' => 'languages', 'action' => 'index')); ?>

diff --git a/code/ryzom/tools/server/www/webtt/app/views/translation_files/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/translation_files/admin_view.ctp index 26d64c899..883355dc9 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/translation_files/admin_view.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/translation_files/admin_view.ctp @@ -143,7 +143,6 @@ - @@ -165,7 +164,6 @@ - diff --git a/code/ryzom/tools/server/www/webtt/app/views/translation_files/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/translation_files/index.ctp index 20dfa8676..411739e17 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/translation_files/index.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/translation_files/index.ctp @@ -9,11 +9,11 @@
@@ -21,6 +21,7 @@
+

Choose a file and click "List Identifiers" to see identifiers you can translate.

tableHeaders(array($paginator->sort('id'),$paginator->sort('language_id'),$paginator->sort('filename_template'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); echo ''.$tableHeaders.''; ?> diff --git a/code/ryzom/tools/server/www/webtt/app/views/translation_files/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/translation_files/view.ctp index 65cec5104..a77a28b04 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/translation_files/view.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/translation_files/view.ctp @@ -11,12 +11,13 @@
Languages
Identifiers
@@ -70,67 +71,20 @@ -
+ -
- - - - - - - - - - - - - - - - - > - - - - - - - - - - - - - -
- Html->link(__('View', true), array('controller' => 'identifiers', 'action' => 'view', $identifier['id'])); ?> -
- -
-
- +-->
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/add.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/add.ctp index d42bdec3c..d23e0f5c6 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/translations/add.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/add.ctp @@ -27,9 +27,12 @@ + + element('neighbours'); ?> - + +data['IdentifierColumn']); ?>
@@ -39,17 +42,36 @@
Form->create('Translation');?>
- + Form->hidden('identifier_id', array('default' => $identifier['Identifier']['id'])); - echo $this->Form->input('translation_text'); - // TODO: change user_id for authorized user - echo $this->Form->hidden('user_id', array('default' => 1)); + echo $form->hidden('Translation.identifier_id', array('default' => $identifier['Identifier']['id'])); + echo $form->hidden('Translation.user_id', array('value' => $this->Session->read('Auth.User.id'))); + if (!empty($identifier['IdentifierColumn'])) + { + $i=0; + foreach($identifierColumns as $key => $column) { + echo $form->hidden('ChildTranslation.'.$i.'.identifier_column_id', array('default' => $key)); + echo $form->input('ChildTranslation.'.$i.'.identifier_column_id', array('type' => 'text', 'name'=>'buzu', 'value'=>$column, 'readonly' => 'readonly')); + echo $form->input('ChildTranslation.'.$i.'.translation_text', array('default' => $identifierColumnsDetails[$key]['reference_string'], 'rows' => 1, 'cols' => 80)); +// echo $form->input('ChildTranslation.'.$i.'.id'); + echo $form->hidden('ChildTranslation.'.$i.'.user_id', array('value' => $this->Session->read('Auth.User.id'))); + $i++; + } +// echo $this->Form->input('translation_text', array("rows" => 1, "cols" => 60)); + } + else + { + echo $this->Form->hidden('identifier_id', array('default' => $identifier['Identifier']['id'])); + echo $this->Form->input('translation_text', array('default' => $identifier['Identifier']['reference_string'], 'rows' => 8, 'cols' => 80)); + echo $this->Form->hidden('user_id', array('value' => $this->Session->read('Auth.User.id'))); + } + ?>
- Form->end(__('Submit', true));?> + Form->end(array('label' => __('Save and go to next identifier', true), 'name' => 'Next'));?> + Form->end(__('Save', true));?>
@@ -65,9 +87,9 @@
-
+
- Html->link($identifier['Language']['name'], array('controller' => 'languages', 'action' => 'view', $identifier['Language']['id'])); ?> + Html->link($identifier['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $identifier['TranslationFile']['id'])); ?>
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/admin_edit.ctp index baf23f0a6..c4ef20b1b 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/translations/admin_edit.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/admin_edit.ctp @@ -17,7 +17,6 @@
Users
Votes
@@ -30,8 +29,9 @@
+
-

+

Form->create('Translation');?> @@ -39,13 +39,82 @@ Form->value('Translation.id')); ?> Form->input('id'); - echo $this->Form->input('identifier_id'); + echo $this->Form->input('identifier_id', array('type' => 'text', 'name'=>'buzu', 'value'=>$this->Form->value('Identifier.identifier'), 'readonly' => 'readonly')); + echo $this->Form->hidden('identifier_id', array('default' => $this->Form->value('Translation.identifier_id'))); echo $this->Form->input('translation_text'); - echo $this->Form->input('user_id'); + echo $this->Form->hidden('user_id', array('value' => $this->Session->read('Auth.User.id'))); ?> - Form->end(__('Submit', true));?> +
+ Form->end(__('Submit', true));?> +
+
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($identifier['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $identifier['TranslationFile']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/edit.ctp index 0484d295e..fc9233056 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/translations/edit.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/edit.ctp @@ -27,6 +27,8 @@ + + element('neighbours'); ?> @@ -39,15 +41,38 @@ Form->value('Translation.id')); ?> Form->input('id'); - echo $this->Form->input('identifier_id', array('type' => 'text', 'name'=>'buzu', 'value'=>$identifiers[$this->Form->value('Translation.identifier_id')], 'readonly' => 'readonly')); echo $this->Form->hidden('identifier_id', array('default' => $this->Form->value('Translation.identifier_id'))); - echo $this->Form->input('translation_text'); - // TODO: change user_id for authorized user - echo $this->Form->hidden('user_id', array('default' => 1)); + echo $this->Form->hidden('user_id', array('value' => $this->Session->read('Auth.User.id'))); + if (!empty($identifier['IdentifierColumn'])) + { +// var_dump($this->data); +// var_dump($translation); +// var_dump($identifierColumnTranslations); +// var_dump($identifierColumnsDetails2); +// var_dump($mapChildTranslationsColumns); + $i=$j=0; + foreach($identifierColumns as $key => $column) { + if (isset($mapChildTranslationsColumns[$key])) + $i = $mapChildTranslationsColumns[$key]; + else + $i = 'n'.$j++; + echo $form->hidden('ChildTranslation.'.$i.'.identifier_column_id', array('default' => $key)); + echo $form->input('ChildTranslation.'.$i.'.identifier_column_id', array('type' => 'text', 'name'=>'buzu', 'value'=>$column, 'readonly' => 'readonly')); + echo $form->input('ChildTranslation.'.$i.'.translation_text', array('rows' => 1, 'cols' => 80)); + echo $form->input('ChildTranslation.'.$i.'.id'); + echo $form->hidden('ChildTranslation.'.$i.'.user_id', array('value' => $this->Session->read('Auth.User.id'))); + } + } + else + { + echo $this->Form->input('identifier_id', array('type' => 'text', 'name'=>'buzu', 'value'=>$this->Form->value('Identifier.identifier'), 'readonly' => 'readonly')); + echo $this->Form->input('translation_text', array('rows' => 8, 'cols' => 80)); + } + ?>
- Form->end(__('Submit', true));?> + Form->end(__('Save', true));?>
@@ -64,9 +89,9 @@
-
+
- Html->link($identifier['Language']['name'], array('controller' => 'languages', 'action' => 'view', $identifier['Language']['id'])); ?> + Html->link($identifier['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $identifier['TranslationFile']['id'])); ?>
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/index.ctp index 7e44b94d2..d33f04bb7 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/translations/index.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/index.ctp @@ -9,15 +9,15 @@
@@ -52,7 +52,7 @@ Html->link(__('View', true), array('action' => 'view', $translation['Translation']['id'])); ?> Html->link(__('Edit', true), array('action' => 'edit', $translation['Translation']['id'])); ?> Html->link(__('Delete', true), array('action' => 'delete', $translation['Translation']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $translation['Translation']['id'])); ?> - | Html->link(__('Vote', true), array('controller' => 'votes', 'action' => 'vote', 'translation' => $translation['Translation']['id'])); ?> + | Html->link(__('Vote', true), array('controller' => 'votes', 'action' => 'vote', 'translation_id' => $translation['Translation']['id'])); ?> diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/view.ctp index a1b87c329..cc943d0f0 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/translations/view.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/view.ctp @@ -8,28 +8,28 @@
Identifiers
Users
Votes
+ + element('neighbours'); ?>
@@ -81,6 +81,34 @@
+ + + + + + + + + + + + > + + + + + +
+ + + @@ -97,9 +125,9 @@
-
+
- Html->link($identifier['Language']['name'], array('controller' => 'languages', 'action' => 'view', $identifier['Language']['id'])); ?> + Html->link($identifier['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $identifier['TranslationFile']['id'])); ?>
@@ -150,7 +178,6 @@ -

@@ -195,7 +222,8 @@
    -
  • Html->link(sprintf(__('New %s', true), __('Vote', true)), array('controller' => 'votes', 'action' => 'add'));?>
  • +
  • Html->link(sprintf(__('List related %s', true), __('Votes', true)), array('controller' => 'votes', 'action' => 'index', 'translation_id' => $translation['Translation']['id']));?>
  • +
  • Html->link(sprintf(__('New related %s', true), __('Vote', true)), array('controller' => 'votes', 'action' => 'vote', 'translation_id' => $translation['Translation']['id']));?>

diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/admin_add.ctp index 8a3121e33..3052a1c61 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/users/admin_add.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/users/admin_add.ctp @@ -1,25 +1,31 @@
@@ -34,10 +40,17 @@ Form->input('name'); + echo $this->Form->input('email'); + echo $this->Form->input('activated'); + echo $this->Form->input('username'); + echo $this->Form->input('password'); + echo $this->Form->input('role'); + echo $this->Form->input('confirm_hash'); ?> - Form->end(__('Submit', true));?> -
+
+Form->end(__('Submit', true));?> +
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/admin_edit.ctp index ec9671ca6..66b84f137 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/users/admin_edit.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/users/admin_edit.ctp @@ -11,15 +11,27 @@
Translations
Votes
+ +
Comments
+ @@ -35,10 +47,16 @@ Form->input('id'); echo $this->Form->input('name'); + echo $this->Form->input('email'); + echo $this->Form->input('activated'); + echo $this->Form->input('username'); + echo $this->Form->input('role'); + echo $this->Form->input('confirm_hash'); ?> - Form->end(__('Submit', true));?> - +
+Form->end(__('Submit', true));?> +
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/admin_index.ctp index 43d7d4739..4f300270b 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/users/admin_index.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/users/admin_index.ctp @@ -4,18 +4,25 @@
-
+
+
+
+
@@ -23,7 +30,7 @@

- tableHeaders(array($paginator->sort('id'),$paginator->sort('name'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); +
tableHeaders(array($paginator->sort('id'),$paginator->sort('name'),$paginator->sort('email'),$paginator->sort('activated'),$paginator->sort('username'),$paginator->sort('role'),$paginator->sort('confirm_hash'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); echo ''.$tableHeaders.''; ?> > + + + + +
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/admin_view.ctp index dd554f14a..780494378 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/users/admin_view.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/users/admin_view.ctp @@ -1,5 +1,6 @@
- @@ -35,35 +48,77 @@

- -
">
-
"> - + +
">
+
"> + +
+ +
-
- -
-
">
-
"> - +
">
+
"> + +
+ +
-
- -
-
">
-
"> - +
">
+
"> + +
+ +
-
- -
-
">
-
"> - +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
-
- -
@@ -74,22 +129,26 @@ diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/index.ctp index d8cc5607e..376183c78 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/users/index.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/users/index.ctp @@ -4,17 +4,24 @@
-
+
+
+
+
@@ -22,7 +29,7 @@

- tableHeaders(array($paginator->sort('id'),$paginator->sort('name'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); +
tableHeaders(array($paginator->sort('id'),$paginator->sort('name'),$paginator->sort('email'),$paginator->sort('username'),$paginator->sort('role'),__('Actions', true),)); echo ''.$tableHeaders.''; ?> > - - + + + diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/login.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/login.ctp index bf04d682d..d5b4bdbc3 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/users/login.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/users/login.ctp @@ -1,3 +1,5 @@ +
+

Please login or Html->link(__('Register', true), array('admin' => false, 'controller' => 'users', 'action' => 'register')); ?>.

Session->flash('auth'); echo $this->Form->create('User', array('action' => 'login')); @@ -8,3 +10,4 @@ echo $this->Form->inputs(array( )); echo $this->Form->end('Login'); ?> +
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/register.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/register.ctp index cda035bce..01477d189 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/users/register.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/users/register.ctp @@ -1,3 +1,4 @@ +
Session->flash('email'); @@ -12,3 +13,4 @@ echo $this->Form->inputs(array( )); echo $this->Form->end('Register'); ?> +
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/view.ctp index 827058785..1014a2d71 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/users/view.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/users/view.ctp @@ -11,15 +11,27 @@
Translations
Votes
+ +
Comments
+ @@ -32,35 +44,42 @@

- -
">
-
"> - + +
">
+
"> + +
+ +
-
- -
-
">
-
"> - +
">
+
"> + +
+ +
-
- -
-
">
-
"> - +
">
+
"> + +
+ +
-
- -
-
">
-
"> - +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
-
- -
@@ -71,22 +90,26 @@
Html->link(__('View', true), array('action' => 'view', $user['User']['id'])); ?>
- - - - - - + + + + + + + + - - > - - - - - - - - - + > + + + + + + + + + + +
- Html->link(__('View', true), array('controller' => 'translations', 'action' => 'view', $translation['id'])); ?> - Html->link(__('Edit', true), array('controller' => 'translations', 'action' => 'edit', $translation['id'])); ?> - Html->link(__('Delete', true), array('controller' => 'translations', 'action' => 'delete', $translation['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $translation['id'])); ?> -
+ Html->link(__('View', true), array('controller' => 'translations', 'action' => 'view', $translation['id'])); ?> + Html->link(__('Edit', true), array('controller' => 'translations', 'action' => 'edit', $translation['id'])); ?> + Html->link(__('Delete', true), array('controller' => 'translations', 'action' => 'delete', $translation['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $translation['id'])); ?> +
- +
    -
  • Html->link(sprintf(__('New %s', true), __('Translation', true)), array('controller' => 'translations', 'action' => 'add'));?>
  • +
  • Html->link(sprintf(__('List related %s', true), __('Translations', true)), array('controller' => 'translations', 'action' => 'index', 'user_id' => $user['User']['id']));?>
  • +
  • Html->link(sprintf(__('New related %s', true), __('Translation', true)), array('controller' => 'translations', 'action' => 'add', 'user_id' => $user['User']['id']));?>
- diff --git a/code/ryzom/tools/server/www/webtt/app/views/votes/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/votes/index.ctp index 1a76ec74b..4acc4185c 100644 --- a/code/ryzom/tools/server/www/webtt/app/views/votes/index.ctp +++ b/code/ryzom/tools/server/www/webtt/app/views/votes/index.ctp @@ -5,14 +5,13 @@
diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/labelWidth.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/labelWidth.css index d7b3569a6..fb63b4d53 100644 --- a/code/ryzom/tools/server/www/webtt/app/webroot/css/labelWidth.css +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/labelWidth.css @@ -7,3 +7,6 @@ .fileIdentifiers div.dt, .fileIdentifiers label { width: 17em; } +.translationFiles div.dt, .translationFiles label { + width: 15em; +} diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/layout.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/layout.css index 259166d09..342fe53c8 100755 --- a/code/ryzom/tools/server/www/webtt/app/webroot/css/layout.css +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/layout.css @@ -194,7 +194,12 @@ blockquote cite { ul, ol { padding-top:0; } - + +p.help { + padding: 5px; + background: rgba(255,255,255, 0.2); + font-weight: bold; +} /* menus ----------------------------------------------- */ @@ -217,7 +222,6 @@ ul.menu li a:active { background:#ccc; } - /* submenus ----------------------------------------------- */ ul.menu ul { @@ -228,6 +232,15 @@ ul.menu ul li a { padding-left:30px; } +/* menu lists +----------------------------------------------- */ + ul.list { + margin-bottom: 0px; + border-top: 0px none; +} +ul.list li.current { + padding: 4px 14px; +} /* section menus ----------------------------------------------- */ diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-fluid16.js b/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-fluid16.js index 08ab73d70..4da1f0d01 100755 --- a/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-fluid16.js +++ b/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-fluid16.js @@ -27,7 +27,7 @@ Ajax : function(){ Toggle : function(){ var default_hide = {"grid": true, "filter": true }; $.each( - ["admin-left-menu", "admin-actions", "help", "filter", "related-records", "grid", "paragraphs", "blockquote", "list-items", "section-menu", "tables", "forms", "login-forms", "search", "articles", "accordion"], + ["neighbour-actions", "admin-left-menu", "admin-actions", "help", "filter", "related-records", "grid", "paragraphs", "blockquote", "list-items", "section-menu", "tables", "forms", "login-forms", "search", "articles", "accordion"], function() { var el = $("#" + (this == 'accordon' ? 'accordion-block' : this) ); if (default_hide[this]) { diff --git a/code/ryzom/tools/server/www/webtt/docs/INSTALL b/code/ryzom/tools/server/www/webtt/docs/INSTALL new file mode 100644 index 000000000..3137f86e9 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/docs/INSTALL @@ -0,0 +1,31 @@ +1. Web-Based Translation Tool use ryzom translation pipeline, so you need to setup it first. + +2. Change path/to/translation to your translation pipeline path in app/config/database.php + +3. Add following VirtualHost config to your apache configuration. + + + DocumentRoot /path/to/webtt + + php_admin_value open_basedir none + php_flag short_open_tag on + php_value memory_limit 256M + php_flag output_buffering on + + ServerName webtt.your.domain + + +4. Change permissions to tmp directory. + +# chmod -R o+w webtt/app/tmp + +5. Create MySQL database with default user and WebTT tables. + +# mysql -uroot +CREATE DATABASE webtt2; +GRANT ALL ON webtt2.* TO webtt@localhost IDENTIFIED BY 'webtt77'; +# cat db/webtt2.db | mysql -uwebtt -pwebtt77 webtt2 + +6. Go to http://webtt.your.domain and register new user for user access. + +7. For administrator access, go to http://webtt.your.domain/admin and log in as admin/newpass diff --git a/code/ryzom/tools/server/www/webtt/docs/db/CakePHP_Associations b/code/ryzom/tools/server/www/webtt/docs/db/CakePHP_Associations new file mode 100644 index 000000000..addae59e6 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/docs/db/CakePHP_Associations @@ -0,0 +1,69 @@ +Name: Language +DB Table: `languages` +Associations: + Language hasMany TranslationFile + +Name: TranslationFile +DB Table: `translation_files` +Associations: + TranslationFile belongsTo Language + TranslationFile hasMany ImportedTranslationFile + TranslationFile hasMany Identifier + +Name: ImportedTranslationFile +DB Table: `imported_translation_files` +Associations: + TranslationFile belongsTo TranslationFile + TranslationFile hasMany FileIdentifier + +Name: Identifier +DB Table: `identifiers` +Associations: + Identifier belongsTo TranslationFile + Identifier hasMany Translation + Identifier hasMany Comment + Identifier hasMany FileIdentifier + Identifier hasMany IdentifierColumn + Identifier hasOne BestTranslation + +Name: IdentifierColumn +DB Table: `identifier_columns` +Associations: + IdentifierColumn belongsTo Identifier + IdentifierColumn hasMany Translation + +Name: FileIdentifier +DB Table: `file_identifiers` +Associations: + FileIdentifier belongsTo ImportedTranslationFile + FileIdentifier belongsTo Identifier + +Name: Translation +DB Table: `translations` +Associations: + Translation belongsTo Identifier + Translation belongsTo IdentifierColumn + Translation belongsTo User + Translation belongsTo ParentTranslation + Translation hasMany Vote + Translation hasMany ChildTranslation + +Name: User +DB Table: `users` +Associations: + User hasMany Translation + User hasMany Vote + User hasMany Comment + +Name: Vote +DB Table: `votes` +Associations: + Vote belongsTo Translation + Vote belongsTo User + +Name: Comment +DB Table: `comments` +Associations: + Comment belongsTo Identifier + Comment belongsTo User + diff --git a/code/ryzom/tools/server/www/webtt/docs/db/erd.png b/code/ryzom/tools/server/www/webtt/docs/db/erd.png new file mode 100644 index 0000000000000000000000000000000000000000..d49b4e49c1209e87d0ec6a2482d10b1b2ec5887e GIT binary patch literal 91823 zcmb5VWmFx()-Ae`;0_7y5+D#9g1fuB1$VdLE`ead-Q6v?26uONcbD7beCOTw#<=&# zgFON}yXmf4Rkdo)xn_mR$%rDt;lP1FAVhI7Aq5Z!ViE)bzl8w@{)eQQ9Uu4s^<7d_ z2=w;;o!MFt3jz^=#D(~kTvLzJ+#S*9>fY|u>MJ7%u?+kSo&+kl$wb5<+%95aU<1hF zq;MN@k!S}P&D7D@vZ5EKX&Z^#0|;dV%TrXEep2)&q^#>Cqp;Mw~75{EWo`=2Yw@PDuT_b(m)e_hO|`0p`{vyILt zi)(MMkw0G`Ai8u zk?_8q&oo|jC%Mh#DlTI$=#W5wmPi@xDPebpE)k`jbq8_UxVD;(PTQW!m6`*H2FRfn zB5){)Gfh!oMShTBU=@g_thnFmU^{B}m)V*~Nz~Ex{}DdKrEYTOpfj0_dBQAM#Do+l z`EJB!o(buj&5wa~5M2m7`2!LGm+PVBS^K5&)44Da*?^(kYD~#z<2TKPvWC@Ub6pfN z^^ikxm$QW>hgX5MZFNlh!635O)&NKrmlhNq0Yj&3X;)$#+W~a^j5w^9|xVSiT zmtI^#Psa}Kq7K1xnd7(Twfz{=LxcmrVA)Snv`N4HulA#`&JD%57XqP?@YE{x_=`RH zqjFJ%opYchs3~#$I>jP;AbStCFDl?MD|VD&&`PXRVxqwy`9Yv@MGRO_*u$ErJjMq% zMKaO1D(}%Wc!@#dU-eUV_U32F&@`fZGgeD&e`r455W0HZEV}3&#E*>8ND1G7&Npl@ z%NC(Q9qh10=Z6}`oeynvqGcSA*hbm?*3*0gP{RH`%s;OUnACp3_K6^ePl=QG`>coR zIF%H5*KnYNJTP26uit*pK@-4n>73se>Lb^Bds!{f$s$ti!VaddRXsmQLyPWJJGN-l znSEZasj~RHVz6lJQTO>-ibF@cZfq?$b*;*S#fs}A|3Df8Y=R|UFN3_H%O=aXkOBk= z|3nA*Ml=D1US+CY1pJm`Oq3xomLy_il!uorW0-s8jjg|hV&uQEm+WmuEeU?a+`ZPq za%`khSNEMefiiaEQ3B$_a}oNh!15oPG~vU%yL3X~!vUf*OKAU!DRs~b7< zGqC-Y6eF8YkG_z^SV%)a41nSL_h>IE28m9_m(Fk8#wh7(gu-rASoTj^-K)b=;`Pi9 z<2w#+gyQttiAZo`aHZp#ztLk!8%g+Sh?Ue3EhiuJG_s?cn6YH z+4uDB~< z4*s&j#vT)jUfI%wAVbCqK!1O)cdmp_CmgsRZnW>;_OR7+S-JPsZbGM2{M zj;2_U)tuYvT^ouSI+m7ZxP{)tzF1u zB_UZ4mY}>NKpvNlG3huBWGuUVHKSUxOK!7FlB zUM739)(4hppdOB6j2#zqb|x(n*hg_rvunZf{&XbrVkA?aTWeaM_T`10tY~-Q4}#P+ z7ohm`UFSDKk#8Y!!`Wh#$@q>_V-bG>FfI1%pURs&=AeQ}Bb;s7rzUF)&FkKDr+z8= z_OOh-IV1AogOIq|lViPavUl8($CETifxa#_=bOL39}B3$o9s#=lGS;M8a;B2i=E1# zMAKkSWxvi^UuzsgmiUY*#N8bN%9uO40mDBCUP;%d+p$+H*Qc07ZVnFCO1F(}0~P>_ zBpB#)VZN@h)#9pG6bvNOGAjg43sP$`a&Vv9y`{YaIodp8JBWiivpP^ zFZ{c{evjJ!3q0e;Cg)^e3jS0%Nx51Mx-B0$X+GS=tL3WqI6D|u4i>r?E^lH7(N|b& zs;aFFLk-=QBUwfqZ>piT&?@MJdkbWUM=qs-VLo0h`z=V z3G{6&&382x8Z5KDawNDjs4j-_9QQXnHD@|l>f@bC|;8xko#OvdJdgZ{y#y0`H0=b1}P+FcKAG?~cV-I^{Y81sPxb=r%0U*)B zhw?K`LvY`FVKfn)PK1Vf@X)DX=&A@b#(qz7MO62P*MuaW>>K5t5sD2p*6t$bhE(r7 zlTFxADEb^Xt|O8DZdEQuw#TZcw)?7nyFn@e{Cx{S1Lm@ht$QoR2LfaS_s*>wM0XE@ zim|P{Wt~Azg#~=StAaF;9J{1z7UO}#F2f)vmtR8h*jc6e`uf6D!TKqr*0bYML5jk) zS7vEjR%<%#%*t!RRb-#hXP8lS4%9JyA=3N5j-9?8)sMDDSNW>JL5?;u{xzazMb##=-ZOEE^SHb<(l{}@7{j>!74^J zc!;~$JfAvjYUh#fr?z=rp0$E>gN4K@NdV0iLDaol4!uVlTRr}*>q11VNOD3|pgt6=PeLUE{ zlHq3&<9SZgD4yK3sJdVt+$(f%O#DkcC_*tq(jA90az@6G@bJsVJBnpNNOAa0>=T)3 zQ&Fjgo4Ju>=xk960gYdl`ebYu8yzW6LY)!U=?H$muB{{8ZRHq&2ImMr7Gg%;>$zD! z-2OFs)jz|vrUYXwF0!plpmD!UmoB-TkX4#@ZREQZZ`s-*&eC4FYo|qC)z$?EnP?=} zuVn_!K|;s$Q=>~fEW1Ph_%%hSZ~_kwTEB4RCO9JtO^CVo0Y$ohW9o)S8{8ro9X>}@ z$JQZ~TZJ4vbz!B=&Ty^#GDW8~(e~j}S$4)u<(DM2`@a(LtqOCmK1NdzC2U~t8zr}i z`!TsUs!yI~W~tW>&eB!Nevez611OuyrcIhaN>Ed?E|T?QpnrT{F;?&%SHnh9;IU>n z>Ty63_w)iK1Xky8?fCB*HcNksPId&Is1T_^I_l`LJYKRzUPy7|&FB@~Evzqvjz72pmzS!*b6V^KeA{_at8z(lRH0&0~zM z;Ifw5K}AT>c-W4#c&6-cM0MB-n+|2slBvFDH5k&cYfugvO?Oh5ntO0ZK+h2?oNDF;O-GGO5-L0B!j5_KsTXwKwk(HsIR3{NTQ;DFU>N$w?GF*f^7ns)iH&?;%afP{U zf7%4IITiiYcV{HpTqu^27R$-;HG*2dZvxe@mMT$$ac}g4ybICj=m2dZ2i(gSKO!*> z)H$-)Y12%(sX37)@E9C`BK2eGE69BPr4O*T9#O7pTox3@LA_j26i9y8D2lk28h^%u zMP$fOUsppmb0RY1N^hZFa94bi{`-!6QsxoRqSBKuQ5EW#GrL$=<$)5#2IGX8ue4}C z;;oXquax6ChftIq@E!#xc*0yMe-RxrG|p9|IeH?Pxo8`TlQIIa=$1^yl0#sslvyL< zle7uIAt=7O;`fR!#EmJQfcwG7r%(+d@FmksT#@w8gB!X0AewTKW1&#SDK|zHeG7>u z5dVf%u(cj5%j32Yh^cV$fpJ5v-HZDxQAoII_7K1a`c3_!2|^*lrvUcZKmR%GSOk%o zBh!=*=phOu_S*WFIN$>@1TF3b+namyiam{O>0j7lvDEr!ez6oE`S&d+m=+x&qw{St zNnse%0dAWMjdg%(NMl=f#8WhvPW~|MB;-|8v9xtz>m9LrDi#}-Ik5ozyJVbbjN9KS zutzL?0~Hv@Sn^W;=O^caW2rhwE`_S3OD=K*l|QOVI2DNbIHh2+Qoyoa1Mc?bFRxVJ zXafFTa6w%blZ0hR_JshY=(ISOJWXDD`i=;2eEc8khUko*!Bd4wIBAYK3g#a_@ux%| za8ib4Q&Qjx%PR%zKR`$iqu zA$pOWgopx!4af7@Hzb>KbfN&2bf1u6k`xwV>$;x^Ajxawp^#*%$Uc2cu1=Zl?Q45i zRoLJ!yh}et)xWeh>8A-OrBv0iemOFKme$Tc%S=749;u%-wkpE`@u?^lI66lAMFR0P z@J|HTF_GbKfD{rL1c*-&wlBI5?lnnhH+s13Ulw@YK=KC+nobQM!j-h+Mp`Oa)%#H# z3UXBsb(;O$h*qXLPLtUXB^yCOY6;w1Fv*avtARm-VE8w_l>X5Ks1Use@+3Co#7WGq zJAOHLr`U6AT54*E(Wn@r{a=G)@QFizHFfTrN_EAGyRkrlAo+VS{{6N1_m;4r2wXOb z_3`(`FwaLF2M(swf1L38G@QhAb#>Jp;G-6Gpm|6mZ54VRd2CNvvU6=>QlKsWk=qbZ zIl@2LwJL<-z=$IedS1)-JBDA2fiomY$?`mGUu^X$o``7(u(cwXSDH%bczJml8yAic z8Y;sz=S4t*h?ZzjGn^kK_vd_xCmrN}4d_kRE$*tMv~zevY}ZSYwPp%AjB(%n(JEJZ z`bqRX^nIKpXmQ!BwVE6cQf%55=H?R2bq;qQi(<;f7Imq!lxoZ3 zK-`0fU<9n?)RG!T8&A-%8@O(!6-~y{rRy+ZNaEkKK&By)4)gWh9q;YD0c%QGb@in$ zG{OB%g*SIRXIh=bTo`X{g02_49~BS_fkYn9#~?)9rsn3ewx`p@#YJdB58J!bl_F3jl6#hOiPl9awnLm){_!92+XV9oo5kiVYT%R%IY`T6hr1OFC%y^y8~y!gA&WhSyc(TAz)!C?5flXI!~bjIy^z79NA z7}i>@5Lvzv$eR)FPnf#^~VDgcF zlQbXxOmppV7U);Z9)cfPJWTgY^m+VCckBuq>F3WMa`36yvuZ@vn1TpSY?D8CnTo2Y ze0q8~oGB@g&3JvBYv*yh+%_7D_k3DfOXqa4hVz8*0fz4N*n}51E4u67SHL|wDWfNJ z9%ih()u$ShFN{#cFq^n*_q}Xw7l^EZ*@eEoz8Ko}Fn%E)M4O|pNk+vf0s{kUOvb*_ z(&8H}jBxE?*2v~8O3BN+oMH!KU|>AYdB4mJ#D3P)&{(#1(bir;WLrKTW*VD6aX!5~ zgz*#V*sxVnQQ^57X43U~Faov$6fzph_glX&WNCj+$ zna3iN@V{5kVUnaMVn5`sST6sms;#|tUwc|T^SWy;QLUh;(19!9A~hTOO{Ms{#rwL| z6N-)#VZ1XK2mgu2_3h>EB1R;N0sMbjVz*FjG*o5KcM2>FTFrVb@0S~3JR9n*mg1vc ze=-;CkE}Yeb^^MhWOYrA6UPd0>GhA7x9739bq;?RMv=nu@^mH>nc`MHl&Z|*^l_;S z9_^Bu*M~809;d@;;NH&1^9&BV!@&eUOpj*EE^x`EZ{j&V3(NnmX^JM=zQ!z=$l~9K z$Yntb-R4|-7Op_x&QvIM6LK^Su-}jr%@tVX_I1N0obR%eue>5 zNS|ul&@OaYu8XUTx96X9ZGY}o-P>>LDkgqr3sDnIRVe<;gb_0`VH$H(pJDu>a4}RE zj>`JLL>|TTa%C9-{j;L=b`c1ASXkKZSjO85Fv!5IOp4PazP3U@;Fir+eAWJ^stQAX zU&MccgUhOkruf(}LjMI2-8Bjn!9r@EwSYJ{74JakxL`AC??oHv1@7AS_M>J8~3f_&@Hp^?(ex7QSUkXzK@qe-2QLa z$6#banL5tUf`axpe_gCDMX9r6fy=xIx2Br;ul_8E>|t z&D$nwbgD|hAnLzN9}kUH_2Ne<+2%>{O`W-N3s>6prJE>nGK8* z(T2-+h*oYnBIvXOE}Zbo3Rh1BS^+^;`urPtTVrS>BO+kLQa%K|w(( zM=Ijfle4#%jc!>QtwabA=mAZ<+aKBb^_YqA_vP&xqrz`xebZW>m2q`R?-^FMWURWjOZ&#d}n7 z1jT%*M%Rn)?|DYPho(8_moubA8VZR>-c->(!f>STDs5@<#=f;lft=GE%QW>dUefTV zVukw}tTbQIOLK=@Y-ADya38ss^Ca6tKujAntiCy#8%t!^y67Xcv9iL)!^`z%#EG!8 z31&Z69-H8O)qlM^3{BMn^$!o}UUz5UxjQ(F*`bkoV$e@UVzXK;GF!}+0xNOPj25Z> zbnUHBBCcCJi8`8#(dAS#82Rq*4&I@LyD=a8*tvO6(WA&7>gqi$+>8BZ(h z*q*N@sI?}-HtS~v2B6L%iijGZrOQI;aEPKooF@9`qE-!9%je(=l#!w^u!2C%IZc7t zrHjVW+_jMQA}UO!j+J$+4zoRaL2Wa2izti>vx}vr@xhwH-7@VDpRqzQ^rJ>UEAdLr z(cwL(VjX^_qdV*4eYF!6?JLOe;_!ZbmQG=fi;th3nen`9UVE8{^!lBaCLOX4pxTd# z+~>D8r-hyYv&+ot!hajQ92N@N-Qh_+5rCvbrP*M;((F<(b?|#=hxcJXRwjcd%{+2* z1Dbj!zSW)1p&pK7ac-{3W^J>D>y{wJm$@kM!&CRN6$d9N&jYGeaF8bs`(=XIpZ;rF zr}+GOp+u5qyw{FS_3t0W5rA!$nS^zL*1T3Q)5(YK`~JM_kg{7{%uC01c%kt>V2T^1 zjbu!O?ZdPY@FiBAdqwRew_v_nn*h_=WaRdM1QAYu4KMtgzdLwg#!*H4Yf(Y^VynB0 zi%Ww>8IR+B)O|GoT`_W(>%Q;2TG{+4*D_Xo{KfuSf7Plr^F91pzC(;R9@x~pu144n zc5Roe8n`cd(1FDQAVt=&tIIaetq8iaMW@cA4?a1bo|?C(+NrUMT3V?Y8Fa%Zgs}jc zCSKIumq!G7XAn~Ut;#JspaHrymvk1CHa_1V@q)4g=`AVqhF;3uX7y}mUErDO% zH~tw}JG%>Dmyy@irEBY7th4w)6Y01vc z&dl^lV5tnFlwT`?nK>yLQSnB)70;1c`|fD^CojPHP{U8sck%cd6aJ!>!7)#uLM&Fo zx^fB8expgryha)KAotw;<76%g7H7by$QVven$eu>Uwi~KWB`h!Ws+QO{-m>SZ(2DW zlTG_EYkYL&N*QMVe54EY(+H3}f|2l>Y&XEuM6q3;#@`udsxTH13tL4$UO5%oy^$Ui zwYrX>b!KXI-7<~!x&B25oVbpm!aDn!4<0BM^yd~GBx9r{@dJHzl!Z*oZUiP6pFZg{ zIf@(Zt}AZXH_8wkJx`6L^DJG=;g7v0wyi!sK5`Ktr}=UhSb8X#*Ga6m!5s0PEyE19 z(kv)Qti2t8Cf&iv4w~OnD?N88e@lQ@)qUlk5)nYP zaClu9^SZqpqWe664Jl3o8OL&VJfQ`_$v$dTp~Yk z!mq)5`Qa~rwA!@4)DP`Q)RBU9rM#o@Ng8%gb zOdJ^MzWB+fovYOixEOPxSU9ZyvD=dMew-p>_a_P^H(rn?H>f4G694^(4V_I4PMWZS zA@YM5>%cAC|C1wde`o^N%G1>dDCh2Z!LGAYcZ=!NHNCiQ_rC!^~j zmNyv_6N8HLF5RStD_md`!2Xvy*FE3`pq|nh^9--Y0|3Po zEYd+@A93BU`xiNb@%NzZeT}PyDlROfq^3@;OvVKz&Y=D+HOOLR;zS^U@e9xg`T~US zRurgJZ*&EwST`LEe9qwVdUh>N696>^d{J0Q|6#4a2zg&SAdq2H_XSaU#sGe_>Up;U=vqYCdRyKbT9uoD#pfx0a zRBh*pv&~}dK`*Y&JJthYDir_S8E$p~WZ6{MJP6#(cWH;n4Dvr0Z;W!DJp)9<`zmGa z89>ZU8$q~UuU8qmEv^h2#F~nG9AVj|nZzNz<^Z;zZW_&>u*Kw$iBzH<860f-absSL z&mXl9ke8TIASv_E(?^-pp%^}ADp9Wih@ad2cKm7hZTmAXyXT`L5U{Am5r!O^$tb@W$#DXXGN zV3t>QLpYF8;W5AF0wWSCBVpvy1P4Dc2^J`@xsQ)EZ(8T&bf6F-M(A=c1(id=`MsZ% zvLhM~RcaG|(ONk<~Dq?D^rG!JAOfL5L^ zCxr)cLjQ2bJ3IN~BK*>~wEE3`^B#cRT_q@iQfmxdFMa)Ap(%?Et5VQnb@R_`apEL$ zV&ldn%DTE*JxXvn{-fr((;2=idBmBG;;~^w%pAyv?R0e71Lp zYRVS#sfVhW)I76?Sb>A@UMxfDpkvl|3q?F1z{x9u!7AL>+m^%Razt-S?z2e-G|ZZL-mwHpr1j*gzD6Pzl4 zX7vyON>&8B8x^Cy>Q1z|ohbTWGhvk|6cUpVY*OFG)rm0f2T8ww1p5}zw?Jjd;e=QR z$GN9bAgM(4O+9?HBQ0-n*nORrYu6UajrHLNiJrVp8OA3#DgH?0Jw|fTr{-5 zSQ#1ZRCwK#0192?_-=%(p#UP?6*--Tokdwvudawp>sN`-LNEkgEqI0y&F*LS_<51d%XIe(vdM4i zd4*RoOMrGMU8KlFNNJaR)HwnM)Tl0X^!wg#J^di84+icVi1t=NQ|K*AX1lAQQ}8f~ zaymUdG31gwz~(SJI|~7g1jt3J-fu4frsb`XlHgCJX7DY`*q+^wpJdW5BJRh4I z1kSW8wuj^NINhX~0IBKr^KHGPN}i7~Vpa|8qq%iw6gLoxbIsV9X{r=WtL0*YrZNM> z>V^w@f9|dieMK5%he6v?0kNuI@U>wZl0}w*ylLOa^`7+|84U(KXDb>TaZF#zwK+iQ zW<^TWA3(7Z5GrBce~_g7qNglX3dRB8Sb2@Sab_?y$22HcTp79aw>(7J_u`FV^e8~t zE|UQzmDQ=sTikw*wfa@G;*xr#n z6%PqRjnkXg$y|H-|E59ENc#>Bk`fXmA1Rvg#+Rj-p%nz63?_3oxrpk& zM9?yV3RS2}EcTK05zR?ov;_^zp+sDR7zwao%Vz`(5^9nS!nU%ilbIx`vw06S%JOH7 z<6YQm`K6)xR7z%;>)DUMX$8z2tEI;(;@oVR=p)$riHhbR0_w5BQ)H}*9Gv?>`>HR) zjwJkd;GIST_*teIK4k$lL@a5;{E@atT&+FU_q zIm&P!!a^m0et4Q+YCGo-015VlZ1W^1DVunefla_Q&fIW%mN~ zXYBW)ME*cNTZyk_&3xU_^!P_vL4yq}jObW1Dy};c%*hG}0Rs~e50XR#Saj5x>&{2f z_&;!Xp^?BM^l&`#`jxEpJ^tgN`KeXNtR zjFmD)bX+(xQZz-Z{YEGI8ww7Z^XFoF??-5-vRQt~V4p;rntR=%31m8mrfqb0A%wqfZfk89y$LQSP3t${9TRPBwC;CbM+Zm62C zcKUMLcKP<>nDF(6&BnOol#Y(B0syO&lzNN<*GIJ@IDT?0PEZnq*GCw`2zie(!u#rk z)zo^`{j^TBKiuy996#FougIuov2sQrA##%o=|_Bx&q1Td`o5b(R1kL|>#B9l-LgW2 zd?8V=XgL$aMwMD73~bB>VdD$?4;y~|h-|b7s6(gR?(UfC!z&Swj_z!+3(hC>x^wej~ye=tn>TVAH@@SQG)SmZ0dfav44 zWU!uW-F1tA4qb@A#@gG<8iYK%2%u1!j3izF*3gQzItyK!Gu)FCNqdLDXdas9b8LGu z&2S)TW+TTDf7*{#uhm}Z?^_L_)so@%TL9EfK=)B;U(`mbk_&< zv=GrnI0vQ#w~BXy5HgRloJ}9jUJDh^hAd%UL7y9=EokiKZ|QD2mSV)6+*XJa7A#8_S+G^lD)Uy6-XR%#CR|MLFUp#4^?nHW5A zJUz1>yvvF|p)usl@V+(B`f>s9)U3*Cn4!?b0Ui&^smaNYV6xz|$ir!JH8NAAm7`nC z)ai9+9CgyN$Qw3)tEz&A&lM*>)B23p9r+{uGYzrq-}7_&g{iCCXwsh)vgxc=8g6cl zM3V*FT_ry}NQxPRh?Z+HEcpkBm(}qJ2u{z=2yt)*hlajTQi=t~_umfFY!>{C$hGtU z3;G0Jn=a^cG3^mV5>Hk5$VwoX*!f)s6uD+p3=TZfEQkMZGFs7zHe;ZKEh5 zl5WO>`^%T(9gLdepwLWT60{UY7&?qUnWlQ;C1M$WT)7wwT`YeH@Cmv3(o$lts|za# z;9;%;I|HDC+XK?R+R9M!T)fxSB49l_-wP$;xrK%M zfJB5L%%Gvpj137Xdr+>){gN`11X|DOILdh|XyG}RTfgw@6Ge2-e7Uk%@^Uj5W1ySQ z-F0$gO0jFEbX%pO6w0_tAAFot{EAjS~!Xd0+$rkq_0|=sF$-Cqni@X~%$XY{Xogw(nHGFx( zE*0pvZySSJlagXA&2}?~0PC)s^_p^m&HPRq*SGy$t5N)p|7{sQ>zJfX!94!H8xJGW zJXXuheTzoALxN20U{YW!DO@j7Fzj|s;A*n=UqAB*SG&POei{h$G^=uA@RM$(8cHS5 zSyPVci27*8PrGEU3-IQin}4)oe?-m0ogDbE$HTi%&_W_MHaPI5C>i%R_uy50B3tmg zV+Qb(DE4r-a$>#PTYZMs%*X5ik$}(fypoE*#!*n;*3!EO zcRl?BJXmI~77}RXbI#D|72!e?81-DKLP!IvsHY@0XqYAq0yOGif_7T`!|2_ji#R1q z0O@mj+nx&TQ~elZ$2={q2-s4sC!CglFJ~WxnT)|E@PdCEcn=zX)OCmx6aU?E2&7dZ40!h9sH3cIyVz zqyP5@hd55%L!QUUtDidHZvpWEO;Psm_EM)4x8N5Yp0l?5dPd>@983}WQR8?pnZ$%n zdgGxJxdd+w*m`xsz$2l9TGuZggSdGj=k_iXtm$^}tB&*M&``&mYIec!xZEExmhm^~ z17}BT!^d02di|+NY)mVl-x#S@PP~1MZeShtXrkC!vn!=$y@Mcqx){}09XFa{Njk+T zfE6vaS$P2bfDtf(Ad;qz3ze!9H2?wX$e7siyd$LVX9f=7Xv^KZk`<76`KQ&I5CO?O zNV}YP?tFcGymE+z>lgn6Uq#Cy69+rL&M)=t!&n$ z?=|*J7d^e4na7ztNo$wumu@uVVra+<^eTo$N5HxzE-#al!yqgjG^f$13wWDy^Z+?R zZ-dR|Ee(PnB|ze@#Zy=tR)>voBun<&U{|HcqD(rhTxjuJoA&7K| z=}95K5NB*5xU)45Vv`hbTkcN6ZW}H|s6eK)d9KC<9IN%*s&3bLdzi{)I!bjM+nZ!r z5@lLU$cYLSX=&(Ukpmh7)vAZPz#@QFp)1yCy-f>o`-{tK>NcFAKk9(nyRvMZEdC%& ze%T1TVlTJU=!1y?X97^OwK-jDS16)M=VI@gy&CwQeViLXe|>%T_IkddjLco@c6WNV z>^Oy(m#0v~tUtTeocd2je`+^#ONo!6h+76-i|jsofIykk=2?wN85BZhj?UAy4?oSz zMh`_AJ4cIx7QpL19J=jpt)vm~_n_u6#AqYQO%Hmo0m0>PNvu@|3Me0D zmIqp+{*zoP>3P8l8iBo5OI0{&M(RjejVjFAj1@o2ZaT2+rv+0uKS(ncEL?^KyYWL2F-;S<_JDy`cvjEyH`~Isyo-nknqS|^=-^-?1FemzX-uD}TT%EyY&ADQ zMKB4)4w?=j3by+1G0gny;lC+OpK8`l-#wc^<&fsu8|2eb8om!n6QC=@8BiCPiqR(7 zRe_+tjI>3~2H~@rR6a5$#QWQ>1L5x*c2*!@;B$X`TH|&!oe@N~Vz*ttU#RKUSE&e( zy$|~6){WpN>b8uE7$+&y{H?f2_5KH`jT zwbmcEYsRPp&P0qF91wt}IK9M@aquPbIuO0t0jXCWH%G?0Qm}@?@C|dHK$#*%{9SOe zOu+daIM97P`pT2A*5H76X&y5(%`k$TnkJ`;F1PYe&$&Xc5Q_75f~g(>7ct>mE5;2U zJpW8qI^qKif6KR1?-{E%QY8K$rLMHlks86xGP+ zZ{x@wKz{)onC6*k3|I(E#={{M$Nx9U#Z6UvJ*jlGC&(cUQ2=r`)1(Ek9K0I{TX5+= zJ|!3_1VGGs7(OD6lHQ0-cnT@aJ^l?S8^|n#=LHWY66cdLV6IuoSIktg;&9vJ$hRn~ zF-350&Z>zAVqR^Y@?zDu#;^E4C1m*(0eKaxntTEcSN1@t2M2n9ECQqvWLY*6M*Zus zJi5rDj#wif&@j|#3mg_+$kmRa*g507j^MhM3=zSBvZ0C-^vAq*dN%6RW@vplcOkKF zJWt0pKp~X8=l8pP^{Jk>t+i_8GGlg)Wx<*G<>0RUejT}edFHWXb2sy zS@#Q7N>W;EN)%4kyMf-qA;cR%UF7*thT$kFfU&a&jAh)k(&_D0RJj;WW>6_~JG#+f zjl<(ldwYfqLlLu{kzZXSln?Blu~T8k@XsS@R!~w~;3qg0VWxAYCCBUTT@)OW5I&`F ztQGY?zFOCUsEuA}UE_wN(h*1of+HbP#A2l(X5sq8&3MO@-&TCTL?B-Op>vr}IN4?y z(Q8;TYoxAFsV3~g#xPX?2!G=YlwpFPrsQ1LpqBNJ;gXDjlb(IN?pNq_qTN~3Wxj=l+RG6xb>5$7|AkfgdA5&siisLEq8u`os> zROZa_wd+}bl4LfWNbQxHL3s}uLhq{2d@Vua6(X%&Sj6tqgRyKHFXnPxg#G+?0hY2$ykO?@Yfz zx^LTHuK}_Ek^_s31{Sa?#c+L(T`Ba1%!ESopD=wsEUDQ1l9H6fZqXaw2UJ7=(eLSp z`F>L#S_3Fo|qS@5wu$SifjE(&IEG1w9xdG|+zs`XIRqlr> zTB3f(W{f(oxpL9nQLB{(x^O7Cy3y!T3H>=3?@cqJw`)_t=ArUsn5INw9`_(H!!=2; zLrOFn%&girUaJO>pgIQSL-_$;FPbS5tgjMv84c|WSj)>@`gm@=?f8g{;B>-?!sA554XI zh6G_3rDj0-wB>C<%19SNYHBnBRCo~tJEy>N?j9s*d6igDH+%P8nvKv%`5We-y_|wA z#VA~W*f)R+1Fn$Z;9&H|78*aY(z=`#RXg$nuuHf4!)C5S>y>X5kq^;taN6=pR56ef*5`;spT5*XNZ)U z1aO>I-vbAxL&0$kj)kz3A_EqsHkg#{#;>Hl$E>`&h2ZI0qPP;GVEX~hA>pew>AY zm!ckP%zr4l3PR>gq?hO7SRwS^`D@1f!ioyIuU};V>n_^+bbddIoy!e)lXIow6WPyI zWm&bj+ZK-+MM9G{0RuYhQocW6^cv+^+Ne6Pb%=6={O{@Q?wRtZTpjoLZN)j%hrBlH z$iD6umZmPG|R)=di<)?uLcg379CYe)#P<_(t+|OKqxMT z`v|?4S66uiNQFd@cACkeeYOw5&RwA@kO1eh!(0bqxO0ucEOCQ3oZL#K46y|Ml19o) zN)o7S1cDQGQ6nYkB;(!6Xsl{8DoQ5(uiQIRqB@q$@&yq7fk1900bw+Jx;-IfW;A=; zQgxSo&{8e>l0b*7{aRa*ett&O6}*s02OQG`pEmwtnk_RANbz_x_yp>4U8@HeUP6~Ktu>^m+%QB z-eDY!Kbt+K(Uc3caT2~DI>TGZH_zSSq=$zGeW(@#{(PIF8s@r)WloI?)uDs2QJLm! zI2U?pQs697p|2do-yR$9r=_U^**@)-|Fd}yw)xQTvEzxsFaZKX+1&G*%~)X5n<>a1 z2OsBE87Nfpm3)xI#XgnBk+J)_Y-wDx&VoG!{fsI<<6XhTP@?f3Gm>OGZ|SSV z0*q^wOgk<#ya`G;a}D`)s=J)u_lr#Ur_h*{+Wyf@sGs@UJ9~R3#zBi}a)1P{xhMt# z0sDuYbwhiA7d{rr2>4zif{1pBm37@i$(5v4Ik@Pg-@lU#(|lFcZdbdppJjVhZ!Nvw z&X5VczHfBlfk6EUVmJgIwpS(@(WxcBA_8A=iAFP0aD_flT}#sYa&iMT5&)S3CVM{= zV`GDoL>E&4rF}kgBUv!^Z3B6bFOK|g+w1bj zp`@~0X@8TCqYjQ`R3>pVJY8-;A_N3OlbGXQho9b&BFhb*w<&^_Fx+aGB&v>|e9D2` zAy9@CVOIp)g${knCPi$~n`>Dct$PCRq(`LpOy0k83f~n0S$O-=2~IFJf|-RQ9Fc{T zF_7qc2*)u=`P*IOml7$8G+ua@VU7Dj`gkN>8e)}Lz5Jz^{9faerg2gdSapAJ+rOa` z#PT^S3v*?7Ez=I6i3zc>q|suK?NCABGsa=~L0d>g4`+~6gQf8o!ALX45>c^ipZc14 z;S;m=oB6ywk4ZnSwi3h;^iVX*LkNRd)8oU*O}k<3EO>|1yNx;Q5I9Bqs#S zn%RCtIA6n%J`6u0{^3f=o>$#*Ux<0cw7S|LnA2g=@r__oR~FbL0AkAN+UP?g3&+6; zPqR=0J(DNWuTTPa9eUlM@-*lT#|9`VF_bXLR0AY;CbGY@s43pHAP!kXh%~Um!(f1# zzhY{_-3eeQahofL*P#R9og6JyyPR#Nrv9f2l&dZtrsKa@^GtDiV!-J=@M7$6;9OM)|LSg(q#Yi3iHNLd8 z6mYx$T2|86-vACS08SxMb!R4n|Har>hgJEtT^^8@mPT3uY3UR=(jXm5OLupth=72A zh;(;IccXN7Bi&L`0<#bP-ud2{dB2%Cmw#{x*E!F5_I~bIYu#(l8)QVxhJT_a3%$Q6 zbc?j0nEywqgq>XmN)gkPsc370hH7=PFw{PG6ify1AH_07o^F)67N0tpI?3xZmoQeF)t8t)egtu+9 z+gucP``(@$j_1IwJU!)Pzyr!-j*PeQ%a}>Bb`9@aIwCiuDkq-&WW)#09t1pml@~{m zzJfceV_+@`XK@q*Bhw$UczeBMnIoV47l3!e$oe!^sAo|eO9JViRENqFfzGv<2xE;E zGmVp9;57OJknFWD56L{oGU(=hNTgLuA~iNGv2)f|h4|r`@e#VpFbRr?ypv|~MD*iG z3yVf@d$*6=Bn(6u;(BFdQwImg{srSN>)L`bG04>d-m-U^u*x6dQZR;LVgt|WD5)q@ z`SY#gv9&|**c64Zj-0&@xwGV#q!l@;?r!~eI`kHxsEzDTo~yUjL+@Z|BXfIrr{QZV ze@EgNLLoQJq6tDrBIzSdG~N-h?_3WY+S96(O}M~PF;2cJD-p&Q1j8FJ-4-=ee65R6 z4?W?)p>8l);2iv{U2E62dL+gjAodjK04c`D$M@#zRE#!`ycwdN_{YCuM{!rzVVN3< zp_^*DyG;@D1d|-|V8&?~TYmz&9BRZ5?f>J6ev4iHl z8@c;hG!U@BG+j~#X(2ic3=Du=!p*4jub{SXUrdpMd;529Ar3;1xXGHQ0>agPKHitW zJ}T0#Q})_`X}W<(Qu+juICb9VdLQ=HqwowYceEvyED}FbqGSW?jJ<5z36iecB^ou3 z19L|qAyecmbMqd*^h$_tC54JH;r6OH5QkL33YTy4c=mxLW_ZBLqf1is^U!+S^3#y_ zPXXwyll%M)W&z z-NEhlSPo3CCaN3?I#XCL0%z5bnn!Tt5ik>$32v{02n6?p%JI%Xx@rqDz#v zL=O2o7;%&oLVrI9$#x*#F!aD!mKWT(wWg`h#)rNXpzgM|%j5>qq={!X$JVaD~2=rG%sX>N# zN{WX8UtV5ra-$`FRK?0pZ+kl5-ANmGEZ_87e7z_kR8!#r(Ds?Em3yYuY;FxsUNWki zyh`**JqSs)U7B^wNGxpR3vBKme#TKGbHRhX5m|tQTZfu;k4&9vjH)UeipbgZULtGG z1RUF4XB~$j_dD!l6(cfW@Dg-)5K9pdpce#$JBcM_5*UCvNf)!pp!t`4S&RYb0R9YA>4nbD-<2` z5R%}28Rl~lV`yu0z$cIPy%7%b@5O+=>8oL3rPES=(rG7$Kq#BG1&`C@D5FX5Df8)a zq1p)g?p82ovh!z;M?KHFmHgqSf2vBpOzIP`+rN7k2Ho+a=>9f3PYepJn z3mW9Tlh_}XwwEwDQ*emkSdYNv4|2@sn?V}6_?&NT9>5T$k2{!=uv{XKw`qtjrdLDC zrT9r?1lzwWj4)0CqK}%Tu9?dEV91#kgsGXRGMC)dQ;|Tc{_uVu2(j9sl`pH zKnIF#R8;1?JNbxC9>w(V-3m;Uk0<<}MEQj+Eqbqsna5y-LEthSL~+WZZNwNTa}q8e z0`Z8kV<844b}t-B*eE`b4D~bV-fww2VtRT48y^?d*JJ3XtxVU9`^7~va04WO5>QO! zW5q=x#1oMaq&~>Umj3lkvYU97Pl>1VMWioSGui@_vS_p3U~uHKuu#YWSK7_bwZWPsvi$)%acSbAW2Ss(reJ?xY3m9&cCd=3mh z&v#TNW8XM_7z|55W!qb7`biTR4{70yM_GgtnzQ96#?|8?Dlk}QLB!X^Wfs5c8$Xjv z0{6H`D7<)}n}eexA&d4GSW~w$BEa@*n8OhtM5g)n;`-d0;y0Z%k@&k?0N zF1LPyFXfJE>8!+8)qYO(;)yp4^gIwoC8?N#W)--Bfj@6bir%4Cy?Ckdpp@VD!>rsJ zXR)SyTI*mQ(N0SF$r2q#sRY5Q+VTyp{T7e)W-j4g28IKHjf+0p#cuTlz57`MipZBR znOd@n&IAyt%$%BVMSOvk;1DbO(f$hq+O zk>8EDIzggxV);lY*u5o@AqZqryI(Q=j($=~Q5s6T)Pv-q6igP|O)_FcsKzEo$5@6)$Q3u1P*L{x`wP z`!+0~?j(XhfK=g>9a1rt_i5}LL6b2XsXQ!R4**~O3 zj6{_R)y zsSrwQu=iTNtm8q~P+KI#elZZ>Nbg;tKmMte`c@E(Hp`m!9gN;8vczkss)C7(kJ%I7 zr@ggae`->ZpAR3N7HYNmn3)3Dlcb;p&;zkU;wN1 z=4#53_nFGmPXJ={-fe~Rwy}|xmd-X+?{{4G`CJ1;wJ0gNx#=kQZb*-d{D)tjgKRb0~tOM z{q)>F@KL3AfKd|ub5(9YbY&;V;2s9 z*~hA49G4X$M6oN11Z+v300yJ0&-}6~T3#hVKW5A|R9_hlL{RoTxJSoulYcfg+Ag`R z_BFWZ{PKWXHq%=I(^!O?YwtDJL;^y{I0c@FF&bHP(EV*33)X3%)oNE^uf!lh$~)}_rdqJ1K%$FDc|${wN4!A z>F-bCGW@>Ev(yOCUGJtQ+sYc&o&o%(?!ehSPJT}695a~Y42cia!(ePE&Gi&QD{7N( zInuW!j{lYG+rTM0FC`CskqH+V{4=&NVE8cL`@Adg7=ePUEF{z3tm>@-ju2OuP1M65 z*AphU*Quf`;}(4Ni2xt`j%jLZr;9dY($;2!AWeXPfBpv#0p|w=7|;Zz^v=%C)*BoI zVvZucmfK)LUF;{ASXePaLbeoqKAcg$c4fF^UNIR-M)H`Xt1dbJA1}%xk5J#$h-ax=I8eQ&#!SH`%ySscI=0jt%|bix zWj&A6Pi79nNb#26X5*F~yE8ppTum$}@A5Alt4wG17D<=NCX1p~lcC2Fw}2Oq(om*% zb}Hc5D#oIH`q1`3V@6k4x$MCZ zbDgca!?){BRKTau=UOZt!+=8tmwb(r&rkobQevMY{f_VKDVibyTTO9n{bp(0i3qEs z&QKAj%ofg1_@}2=p-L|?|M@rw1bkl0&JKBBFUinKcRbUKH9Hp&1rTD8AfgIT|B`6BOYI9BVdxvMNmv@>SZjjsVUw zUeidXW!0NB`pE#%x4qeVqYM0{;t6p&6yd$HkBH<cuK-X zgnp2qvp_U;tdPVw5xebg#aU1A362Pn&grX_$&<1EAJL$f_2~qOtH-p<` zN%bc*;^+ADe@@@F%tx5>pw+?rI3|nUSV{V0lMpd2S#xv#wi9_dx=KAV_yDGUOiHkv0X-uoZZmo_c z^sujyvjvgnw&OG*ihR;}(B{%>JWW`>HpZu-=dk?RF2I}zijuA${M)9YIeT1}^x4Ip z#`k%Lwg!qD@0!AKZtUm}rv*#dk;L)#*4`TeLO#4i9^bn<|NNfR(wnb2{L}#l!6+^k zzv{$9lWJkzudT}-((2|I;c6SrcJanhYO^fabGkj>?l2)gwf&(P zzk2GklU-$GFi0XSflXoI1Jt(Kgy^Nql*zvOx!F-&GHXVLTb+m;W%ZH;)&C;em*$3M+n{W!c zyB11ea3b_^Bnw=1Sq0PdcvnFyFiFd#DP!^mcI;Yl#TA>J42M$%T?UWRT7}r zd`_WTe`_5$+zO`Z%*@R61<-;N4+Zc3ob<K=k`*`C;}(li_T8@2sjpA){X^+FN%tgg^fr#l$!D z+rmJP)pN#RX!hWZ44v~$*2X~&v}x_+d&AMx&eoP0uX90J#!sMn0#+b8mX?JJHZ5%s8ip((2P zq;ZHdH(${(xV2g0<6}=%O=wex6r`m?BO^EMc&(7RPJeA3A_n-%WOwEg>ra5C=$qa@4zm?U@H1uz5$}d;6{H3r zg33>i_he}0=tTFf2x}}&al@g934x;O=2WGz$gO>GG9L=1>h63;gL`d$>!QddF~&(< zP);ZbDxTRgaBkVv&3AT+Rc8|IxE*WCkQ?cJ`DTu!gavaCg8l^)e>ZRMA_C;a znzmfWQh4X3&+EQ@!TvNXifHMn=fhM%5(IJ$I8c-`CUD!1>piPE3_C*Pea@}fzVzz| zAb$%9Ow|3Zfr7T)*s8^Xj*`+?T|pbdk0`# z&x0s1fTC8J>q|a(cOubrPtjeF>`g#6-a0_qgDJzaLH$Ef5QQTa!pif|QSo)8uBeZa0sK z^7l>Bj}^GE%Fz zV~jgIvKo%-A+D{Rws(N4{gNPOfqw19&FL5r5PsgL2VXaxoKuVGuAtD9iP2IpghsF2 zsHSIpe7?WGQSI_HFa{-Bjutmxm3?Z*Y7>`@N_kuDKqaM13t~d?oxgHQ3)9^ApJ% z&eP z?8B%uS64sD!}_qEz2>~BR$L*-kTWW{iE_vgNK^PB$xI#Yyz?!@OTblrOWx~@y*WP$ zv*SKiP^u?xSD7fsl@4$qYx5BnI#Z(lDU{(RX{tClI2uJjno7l5wfoXqNlF!@SO&eg zY0&sx6fYevldMc{mpAgkMw;c;P zaN!^jnF2dBgNPaR@!(B`X^W1A>9^N^(Dj>zh3@L^GkA*1AE&7R7S>k~5>%?O2k*fY zw86tEkrvqoqs$Q@Qg9FRo{e#^?k5OCQU}9P1z6!oLQQWH<(=J+m9v$gzpC7`h13h* zKaBlOUUBzgITx#9-R6F?A!h$LT)GZ^^8tJ((J0yjOZ$R`j97NY2;9T|#G=svRkT@# z(WdS#E&pDk!Op!L_3QC!86jfid%yba*;^IKg2VVkukNMc?Fq4vNh)73NthS z4qosPPt>TJxrh3-g%4zka_B$wG8_7kqgyOvteojOdowI&qXv)-#>8)!%N8I}z@RPihgrf{v6 zbmi+DtyP(niu0DsJak8_gAc5>fM^VlI-dBYDC%WkudQRu_iw!;A$)W)r)BGHztk*? zi45VatUeI5)3;Y02Y8i%p`pO_WwEDSykeA^=AEsS@>7*)hyj*-f<(NA?gwjI#5#}Ec&%;`yd=eoh&l-V}+qAaXTQB6$n z$HMyJLKB3&^G0#0g*1FS8!tP?;>o3AZxR2#X3}g`{rJlwZchuXIIk(Y)b=q*N0U2# z$R{<;?!Jvs$83Lg$kc*W6FvG$-$TR?xI*BjGdwK6=E65na&xWQF4xFJ?aQ#t3^MZzw0E-9>Mopnb&_f%u0d6K3Qrjtyp zM-t6|liCcX@ZZT6O-eVk%U)YhNdg({nP7QCDW%qP7(JfI`))w!*(eOrz^FO3Gk^Em$VJ9t1eB#&GClA~+1-rr2&gHuz`fr#1T?%1`|qFPX@0!!WHx;LrxU9wFF4 zVY^6mQ+~l2ZddNgkFIooViS(@y*;b|=!}hx1x{3$!AYd^=a%dk?T2sNj%U+^xxyv_ zk0rNQ|32_tXE)cC=Bea-pOT}ZKrwl$ssHy=L@``TeXn zHI!Cs&zCaPc^w4|n4IuUEQNm_3~gdJY?3oj-HC-#t=h{sC71np5hU=9PL0~cMXo@M zIzdkCB26Hwz$;i}^F~{`DV&(E?V^!VU4`GDn&Q!+$o&RelN1x{j9tnKZ}6cFcPJx! zNOIdwFWG*^k*`8qaSO>|ButE0r(n^JxjReI*;Gg=(`$*hS%NXSVny!Ue3V%`pm;gNsnn9S*b@l z<>Ine71JaA=-^G``vt!eZ8Mv^KN=ep$Dw&<5R}MJozt~sgx&!&Ma7eb;^N{>;sk{)Dz%J1%ZA%N z%I>bD1_2OPpf>nr_X^=JshC~k7u0`zlAV5k`30N+5lHNs}MhIsM&>?we>=|v8=m0pSThqA0N!Mj)3VkHaR&a#Pjza zs!vKr2K7cCfB`~dauwYzG5@R{67!vV*VPCrJ1ICgILOGz0HWz!@tdZG#4l7tKSc)o zQD&3u_XlLV-{d$Sqh?O$#iNEK`w%%P36zYpH4W{ zd}bN^+gzHiEC^xzLJd}x%%7-d5BR83khuj<2nrr-yq^ZHH7Fn26AfVjnln$Q#b-g~ zZeeorH}GOyTU+b@@;p=6kpLgxda-dPcf_KKJC!nmqM6irYGL(9q=LNs$H+)iZ>^W= zQ4Basszh7z@)RD#N=Y{4Q9=YEOf9wySWN7qur`ZwVt&48#0=1gF`quM=r&66NQjFA z^>BVFpQ~%Fw#}&OV)7{6rI(M4OfO|$osdG_k$d?osb6c^GMQO~3i+`_aoIHdn+G@q z329LR01*aeYQP%_gjew9u$SVSH*eI{B|fcvz-K%@Ie}Rqvc!?6gYLEIH#4zVr^N^5 zrP@AFO~wj#HydzGDx88Q56=Ni>LzpUO$H$M3jy`O;d$Hhl z2uwT1mFAko1Yy-9Qtx138o(0!6@+h8 z!JW|6y#3rztQS(X6r1t|VwZ}VjGH3^Py7_ke>WmP{5T&e z6)|Aj7m}w7|_8eSAzDjP2=RsWr!-hedrUk7NcjmF78QlZ3mRjnavS8ng5cVu)&=ay<7zx5I8*wgbtt!G#yOhLl7+^8;K~pUKZW{ zfUgw(83A+icBW$Kh1Y9xvg9vcP#_`&VqU@iFPP=%;6(DAnDIeaO)szfVQlzTmm3Q* z8r<$Q1y>sq2-4B~O_qt&VNz1+LE?{-QG~Q8?6k~rgR1&Xic;C=P)kg<-+}}f*f500 zb!#{sFq9w*p-`>q$;$SX=rnxsRciS?Yx(0N+4c3(9S~~OL`Ef%LdXe2UC4Ru;*_9c z!?T*|Diyr6ImN{hHaPbX_hiKY?Mq=AY=(i@kosH%-M_u=35)7BMw1*oKfrb(&*c{> z|2{J`(KA*)U;zo4UPpm_1l%npB_%!OG4c~pko#-Dd|6ub*bTe>t>eH8NlUMC-t>PE zmYD%ePzXs$cX!q_3z5oYb`y=l9J7(E;}qaQH|l$_eHa)|%T~Li?jbTHU0}q3D^irx zFO&Z5+j%HQJ_Ay+CKHPy)NV@r=5GMtR2~+e8v+8n)9o=rW=$u6d;uS4;B;kHrOAYd zj)j%VZvV4mEC+voPQ&r&XUWda(~*&$o}OpVp4r>mJEcPX3!(f=PqvhsnALaZbGM;* zDUGV;u}*U>eRdTMu6_+qK);zU0maT>fSh*)6bzb7x;z3i3*TKAq@^WiYR(+S1rWrQ ztbX{ttDDmG+y@D{wE2o*&Yv=9_&u=e`TX@Ozt5iw0CmsL&*P|x{M7i{T6mKbt255b z|B?5;$r#D}5lN8>?7%4~mUbJY&e$`UYBu?CIQK5RRos{FQNQ6|rzb z6a*U|{|xN9Cr_V#Bb!S5{$6e!~PG{LHRmr!55ng{IHU^_f zMIFF%!K=C1XL~doW(hWC18GeXAObXfm8~>u=mZ{qX9~4hC*W*As318`lHb(O^Hx(= zS65Q9zdT-7D^wQ(ddDyVW)dz7JP;X!wEsTL@2Z&>nscox41xE`Re&Ptfs z{qsf!np#>dcekF=QerKQK&S)GiQ{$NQFY0Lq9B5`M5_Z&k0BQoKy8;oAJM^_85kHo zk_&x}kKdGTpp#GPw$TUV2}mhW77mV>eQXee^D^kcbW$?|a33iu`g6IN3QQWR-gdkL z@q-Rje*44N(5ArqJi#f2Pe1^iQ%HfX7_9y!%;N+2IKK;CaXi2#Dfs&ZkitOt2GM5d zz!@ZzNWo*2$f?ywC^*oU5FaxMs`Gsihp)DC?~&C&n5VZI!vwG^$dyk9_M0-^;$>hlIDkLWIl6 zNOq86y&EioR?~(gSEQ_0y+Mg@u=FYCsS^*&MRu{0bQUpAnw|+x|Vz zG(9eWVRan9?E34OX-5o0w3IlK4XO)udx#Y6iOnN`dww^?XbO+ozQNqH@2o-UAGGe~wKC6OttpiP4E{-Ea-ovPC*~8fQ-{rAj`Vz!m=@HS?fWp_ZAY7 zwR_BxkH%Sc!c@WErBe*8xzO#yI%LUW(0lt&$265KRJh<%+O3^CRFz3@>Ds@?$hXdqS|O*wfgzx9ET=`&bAR47HMMvYpV zlQwSP`_c>6+WL{FKl;+&`Zo{F6yXJY_cljbV%#zII(Ms3ChAX(XUsLt*#=b#2%w7)0c$M$1}yT}lGiw0X41=c2dP5W z`yCik8hknsbMSPVQsK;PvNR>+{REJr)ERrvNpxAUpSrxK z@JK*#;`eVq^bq_TNOl6jER8Lw1wr@%jrI{I%nQx;W>;@)bo4bk`q|9?CGTw3kySqe zZI5E?#VgwfNjpbHg$gd@Y*z>zL8?8fPyAlLN{E9R(j@;Tk=yVK+G#;48D#l?gGGQdxZj|^1HR%jj+=uwzvpa$#eR$9rhIiEK>Gy+y?Q%Cu@n;3 zD{b`#y22U?3gg8j0eqL6l?B4H^EL|%nhag?#D-l4Qv@CB{vOR3^7Ej0q!LZb=ECZ) zbgZ!!PrSfU4QM}e0aOovj_@H(y*Z(3AqdouM>?*`qiw6-*L|@2ZGT{+1sneO=ndTV zVaD39+@q+ch*t%c0BCnX6w1rX1K9`Up#FY2%#aQjvphYZapksM+#3UFvS(w%b!V3_ zf?NnBDp1B;TwFw-EorjS^g1B7eP4a~X^AHec~LnOY6B>9;NoondwzFl0w{GsHx7cf zFNldX3ofK{D`~?&9qJmhvT`#r=jP@N4Gh2>29oh$aXb!gghp74z~gJ)OjtT1!~I)6 zB!g;61Eco*WdFJ*a6_10x=CxaDk&) zVdo40zx&Qc_mgQ%G%C&_Sb7*V0%8j;kO@BQi(o^$!v;*Qff+x@Cg4@84GVW5ZUggu zF8VMuZ0JjJ7>fk+M^#e`2D!ql>=OL-!-o$Y9UYzdbv!)y=T<0#-tpaoCJ`vYw-<)M z%5X~0x5;vfrQWy)IP-mGddtHQG~DeEOEu{$d(+3~T1LGxotGDQJqp+JI9s#Gl~49pQ$)7r(zZBsM^$kMrq?qk}_1K|zi} z>YxiR3KfFi{YRt&`&UQMbj8rV>h0-C*K#>rBqRTL*9uZiJX`gH`)3iB;6arNwq`P) z;|A<(5|e(Sp=bSdO1|2S4#tJ@t}DmJi38u;*FpK7Mg69h4GnxprS7iIPVEMl2pDJ8 z;lE&0T2i7;kEfC=4{PhRw6uW19_VE+HWF=3jE%pMk&$5j2YL_L;WrRCWXXs*ecEnF zava!Rh=fgk^%&{Q)}Jaxho`d(dH2_b>q=l#<8Q-s4qIHXkGAK19MaJSNXm4oL$FFf zPzT&tli1!u-QC?)RK^%f8y!Grw;J)uEbTwie1feBu1hF!CZO*B03&@QWaQM%MHvvS z@lhdy?!|?X!wW6dlueFIk18UQkYWEL&Wr>}SG8brF`oD@y@CfKEGqyRCFmN3VeI?6 z6p(cbCoG1hj6tHLjoJRS(g7^2_ri%erXw&ggg5UKCHX)v5WM-l#>~~9DJNU=Q z1dQm!n{3=rRfYsl<66h(wYxt#7N7-xJEJNT=3}Fp5`yM-Y)YAw#>t{RxzNJOD2*sa zwqf`4R_UPu$MxeY++a#pTM;^nIuLfKTwxC3$K5or5`=_3Tw)cRE#f&)#3OIh?X%t%e)whT_pPd3d@)QmQNa)@su z0ConVpes{Kzl%Wf>!2w92p>M#lZ@Xk?H-jwvNK+o5wtJiR9v)H{N<@f)E-ZWhWFG% zSik3MQ7vXMk3FW7suR4I?jrH zv>E6OG>Fxr|DAE$B4DO}*ctvDdM;Z&f&v)8y07wKLJy~b;)YZpX1pZ1MvBP^EGHr&>1pri$dyaF_*H2xe*JqwyRo*g-b32S>0ij$;{`e_aD#mV z-Ob@&#;de9T9HGNDLhFqXdR~p0aWN-tzjyB%07k0`6io7Y5|`$mPJ2Vdg<3%Rnv`> zAN;-g3T);U&vP4CgZQm9J>8#WHs!gY1OR?=g`Pb#AI*{mn+7|gZ#{?hX;03p>(hJ2 z32-prb#dV~WWxvJUVk=cmw(_>E#h`fp%!EKL;h?KvT1A7S-V1BP*-fDHO-Ly-<`aQuvA zX;Zc9p)QPq`38=~0S2<__plMzNFaHE7butw;7|>8{xdxjBA}YF?0lY+v9ja=$`PnI zOFVEEngipix&Yb=q40T+_{2ZK0q17}gJOl=a*K%q3{q}TkCu_* zgJKZr^&9}N@>=9*#{i}AS0vM;^X~)fL!Yibykug!x#=ny>Z3-3&DNy*4%Tg{Za*D zIuzS^@pUOK#9QB@7O*5=V#9hF&J4a}`5}8p#}jbASma~AW6(;y0NN{X9aJa*UDMe0 zNB=2}SXq?ry~?GQ{B`2=0vMo70<`NiaIWdvJ!SJCw@#KPp?^U#C-<6z zB{RN`0{u_`A7m7``_IMY;^uBX9hC(E+;{KW55WkKN)&|7#@Bjc-k_sX5pew{xrm^C z0@%)408RVxml~3gE&aE&@?TnlPjscuXE^oO4J8}I_j-b8bS;9#(!l7R7g-Db*|8K>2c;Ndj8MHtL? zFj7=R4}rX2w?q5PJO^;gCp0GnbyNNeVXfh@HICa;3mfJujOeY}`vA^DdtmkiFhW7L zrbA!94cWB-;Z((F4DN$u=S}=IH1yd5IBj?Np@9b;Q14J^R6LIzMG4yvd1J_F>kHmT_T!J z;UKIrA~vh#0h&d9_6A)LLI05l9NPp2EcLZxH#aJ#(T~Iw7-W`HHt4BD7}feyg6Gi@ z46p*7kBf=PM$W55o4R#^>JCw}C=cx?v+n6LV-^3>0xY+t60&|=x7+$h!U=fu>S}Hc zx_`sg7Ua1}f_s(!%60PS#|X1LH9aJNWF(VHP)|sD;K`|h+omA6FvfMbUk=%yeljQ@ zwCudh<2KsC0^y*86w*BtmZ=1~yYSZFtD zY8J14HhafE#)O!eSueORxBkq_vtRw*_5J(1KgYV_qdU55b4Hm;Uj}or3M-MOjw{3- zJkT z0e17EW0OP%Q$v{%;62_{rzg*hCVw9S+)+K6@n^CmGZ=ZwD!N#^5ckrhY;Nd z795fvz0Shc(L_buh-{3wYp0X(#M`DXY6T9HNXf_sTzF}eJUy?$!EJvlZg4a~4uFiB zK*9&`iNL{Ch~g4Z_>E^hA#N3r{Afh?B%DI{1t5)HyhvGP5!g<7ZLR*{;`A^@RWcM# zq?nQBA_yKxN|6`_f0G>)%%gD5r!7B1bJgfo1A_+U{z~!GE>j6kO`4l_zw~IKFk}_Z zPvMKx#;J(^IWN8eCH)5j0VK|TKr#GEFiinf-S&PfH~~ZNBEO4-+%Z|;I|0EqWjll| zfk==Zb3NRyI?&r?H(tM>?e(A+XzfJ zxZJg1G1ZwqpHspxef8=UNFo>*7!5A_8Cp+p!Lfj_j^Z5!(0_dS((Qt0M$|rQ!%0LY z7x?`{B~cN`oXs}PR0s+t-KUQp*X zHUco2it6pz&IGuouL7*Sxhy9UmhOhrJF1oJUD_F)J#TEQ$&qR0 z)&}*w8Ca<7Rq+-Vf53YZO_3A(Ui@0QJlO2rTQyRqa@@-RfMVb)lQSm#ZWH$Kv&rX}giBU0tx|BzIEPr+PEacH1-ZYuM ztFpR)>YbhU5M%BfqGLew`1XU{cni{vwS9Njqbz^4yRaI9;$k=m(X@F8lGZf+{Kj)B z04SYJXn;--ynu6!W|ak?N{*Adl1S4@Tct&VDmvQQv{5j^fhdDx8Oi@b{be8~UAP@~ za|0I+p7UA#O~1mFHRgv7)G!LNkw3Bx1M(4JkrvJ4lW#NKVtzj6ZdgLqdg1k}ZeQ~4 z`XHHtDTY+gcWd*x^Y(z^2+NI2d7Js_YNY!s{GN`S>Pi1fz>d&Z_Bu|zua34Q_a|Mp z#PNLbw{$33fbhgB$fofK)o{N>*L*YF zL;#ypPHc_|Xa^9sKtqaF2Rmd02&kJF4iD;uYhp4U<5kWjk*Q0%@zQ-FU7TFmD^q#S zy;({oZyB<0p_MpbaVDVg)BEtCwzPEQywme|OgI?@k^ zlVN~6X5za2kV-f9D4@}+Lj7>P~O zrvzd%6%ANNnGDWX1Lby;T!S|s8DqDaT zGFQjB^_9&@Yp+trs%vfYo|jr)Q?>~aP73wLR}UU8H+@Bd_>G@kqa7s9AFl+?ox?-M zt>kvS;D>vY1yTmtZL|ukA%5r8tR9gw2fjWEswd~gb11uodVa7K2{;s~4z{PZ8T{gV z_3OureIC<(tkva@Plb5xe~N+A9P6ETscC57D4#z+0w*W}jKf%fB?ucL@>kc=I>W)7 zX>0Ft`58ZbIaujq(5`8Ye8S_46`6}FTC}?9>1lxc{dU9+>5wLL6iCu{t>3BJ$1LM( zJuv?!;E~cDcl)BOx!zv#thsR;0Y+AdxY9cphw`Y|b*dBr^17_bUebB>V=k|st*2nV6CZB|ysmOC~x zB%S2a(1D5x9!@*nXQbjY;DCZnNRrE4)q)&z$muIc{_YeSQN+@prO&i}h$j^g%I67K zkXO0$=0{FP;nEN`K68G^7hithu@G_SA}su#BHw0S>83qMMG`J8|Ehuj@+DS}jrVi? z!uvHoR}MY8p*qrCX)h-yC)hD`0BsTjY6Tyk=8lzNGfp7*m@?yhL@TE+z#pVoL%^yV z%lX!;y-EeudXsv8iZ^zl=`8^iPVsRsxp@nB$^PE7C0$Gm?RPcAXFej^h=Dn*<;&M<8(MS>Vrrey83w7 z?rPbjQ;0CR*{SR-GQYymO3|uBoJVASKn7jvl9LKe?W{-w`^g8F)g<5$Gm=Kz+&mwe zj*WruKN<=-JZ+3@3k^zto(Vb69o zE4-Y;SS%mJ?sjh*;{62y>$hNw{ahgOptH+6EgMvaV^R~P#pN z84T>jee{R|oZsmqj~gGw>wWOYr7fv-fjTo|6_@QLw8;hF`k=oCT{gf@!I_00x(w>Q zj|~2}dhiN(oNi52e@r#Z;XjhkUFjnsm|?#nxHvNcr?f`SG0@;C!JXTxk@rG!Dh3*HpK@!j3s0P?-NOuehyEop!kHbe)&L*jn_%t^e#^G)*G zB!pb9E1vP5M`Jm!!rr(3*rlEXxV8c++R7GT4F=zBO~0?e|HxUdfM( z7Z=a0C%=@jQKG=N-ef`H{TyyufNL$9!FM~7W`5WWO=}4d@YcUkw(dx36gp%{;Z$7l zJ(|p@;(|aP2v}od3fI`IdX_nCeiW@+QHD%)tZHid8VR6rW&oBNDi4I&BChUBfK^C|ck&Bm>_N!Rgp$_G|G_(Fr|X2|oVye2wSb?G32YuYdw-baYg`RJV9)cWi8I1`P=V zv03`d|4&6GoS<;lRX6%6r1~N!s9&OL%LH^q`O19LrU0mNO#w7@x1T*o$s7+ zzQ2BZIG!Os4)?zAeXq6VHLp46)ifpIJX?rX-11A&Su-Guw}Cgn zF+1Mwli)IVzT(5ucH-f~y#{-6UhOwOd(4D$u$7DpK2$%}MJzpmTG4{cZw zgO2GQ;;9I}TEXRHog+?x74T&1?U#n#q(80~Q)R^cVR^fi(YpQBLIdBfwAy6+4}r!Y z09#Tu=mKuby5+tx<#?v*+@<=@$I3Sv@K!Ky&a{3qqmg^igqve3vCuE%v3Ef z@Sd-UFQlz(;r6F;YzEoe^x@(Is2%QUO!Bd$%x|-^ zSUX~XhdK_NrX1&q4IKTTlSZy*JW7MFy|KafS2L8iVf$b!hu!Xftp)j(G=%7vuX<4J z*67wl2}w%hB!&zLA!I_?@t5{}d@zJmp!MHx^K8~SF2RNWx()$hI+nFtaQ769jeM98 zgOhLxaLD^O76zFmIBPekLF~X$I>sAP$1HTx{eQzK4BeWW`l8A2y&m@iQc*4D3%|EJ zdP2rfzW_MF?j!L2Xg9v6aek(0Dsfw084L{rO>W zvv1rqw{ttWrpA97CCp15BEb;$XE#zuLXS*!XQv`YA5N}XdH;CT&O7=e0&pPwD`5*a zuS6$qx<*mx&L~>OTXD)S<`^&ppi0(Hqf=27r|{PJ1r{s1}HRCc5V%Kq^uup5t66xgmCx z@3O*ss^&p$W-MyJ*_#aNfG1uHY_*^kj-k8;gE)Z*62mr59IkJ>e4Yq=rNb-bbLlR8 znxGctDRC))u2l2UrUp2`N4rcGH*byJ$Pj&ypg4Q1-9o=Ib{6CG9n|80?n;LLhUZ`Cu=N`fD(J|5|3>)6LQP5v@o3%KhfDSrLBV9z z8snvm9YQoF+f2$j7%gvD>OM0);QqN_x!-bFHv64<{-jy9TGn}gUg?u7oVfX2IV6}0aifl?~v2CEbs_3u6!!k4!*VH`O`+6S% zm;J3HU49Hh_=|+{$RH6~`_wOky1ILhZkvj(-d@iHUJ3H|bm{IOJV4(tOXusrL4iCA zExb>N-eN-_6xBOfGRe$^=A7T1DZT`2!*fK&aS8%y-s8`%jfQ87au2>)2T%-jb^#p( zWMn&_%?m@u$hcQhw`j!2%t=1GkJbcb3th|NQ6y`(sR|6@^%I-3o<3rw!NlCOgWdSc zyB{cX9rbfYsLp%PF{~CcB$JLd2KknzUydkCl0ygsG1wS^I8rWNMm6u`{n?kBLC}(Z zQ{;N;nS9w9SyFEE-E;3ufrHFa;apL(dRidWlO}eAKKkd!-L2nN1>9=(kKy+YYPauF zc6G|PQ}zB1E3SVx>ZLw0n?$@vfz2KRG&d^DcWQnswwAYV1IbH2v`qV)yIDT$tKLuV z10&g2VX3K57-=Pk1=J_0ci&lD3TYu8u>5bnJWCS+3dcZp4#?=P-4_Re6&57WAUp*k zEl9gf-OTUbV|>=w@D(2CJ7CNzucH^Kl>fWJIqTZs;PQ|)<3ICKbLnvbFH%|QCv042 z>5SAkSL|RhaYcC39}q`94W-VJGc=%kh3We5_D@|^ald~&S>2Ba<5RkBKAREj-_2p| zAHCBfhCPbRBx%ZTv{$%<-aUrL-nkmwF(z)x zbY8~=Ic!m!XT(%%u#SS77z9{ zo0C4mNKz$(Jut%MYlL+_{Xc)vMsyB1(q#WXE0_=nlK&ML)x5L&^wI}BEEtsx)NcoW zYQh9P_y4?MP8{5D5W}StZC%B}Di}>)V*Z=mPRCCFmf5iVl1v2j4Zt@w*64M80^D;- zU`-UdQ1Z?~VO#D0%X7d!T5nskj!m7;3-t_EQzbGO&@Ia4IJ{V>=%>L^ zAagvRgi&U7Ys30{U!#`8~}C;HTNlW z`x7kOb&`)lf|;b)*c@4g&z`t#)z?#N88n-X>Xu?+ zV&2~O;5tE$pt`<3I>ZSVWN|(|MDiWr`vs4)iaq@ctn={)(56e>p%QK~a!xn-#*1G- zHZT_n8=?DT>L@HJ*>8KiZM)o?JDoL-LdbM+?Pc3$@HE-&Dl8<_b$-&QNqC9o@A95b z4}x~Dxq8%WT9bwqmyWo&__82S?U?a4H#9V~wzig*j#$)q5P+1Rh=c@OT{NjIpaVkn zi`(Y`svLAc&mpw{Q6zA}dHJ+6-T32@KD~sa1s29gKbl-wD zFfiTQ^Af?dgC_v{&Kv2I8;B|fJbo8Bxb{L5Q&Z4xdm_EJy;OE?Zag*}t^ll&j*(YT zNM|$d0VG3)&y6{dYpEB4W_BR=(+xvy$F?3jni?NJ{$p82hZ9QZ1uY$1IWwgL9fXXu z+b0qSNTGl(1!TJe%~0gv%9AXwY;dgxQ}l1(CtF+6!aoNOS=@5{qoZIL$>V{!6Auw! zudYDh@USNIU<{OFaMC{YpvIORn8 z&IDY44x1_w6&Pi)nc?q0ivlByPhlp?S6Lwsm&Ha^Ss;wbC(AJt@o za*^INuO`c>JTmY%=K*ae+p*-Q;HOgvOpqt{Lcu2B0*Wsn6a)U4I_vpbpomLINB~Nv zQOAo(B_U!kZ3NsbJ6^By<^BM7^+^4FJkIElIuSL>j+f$+UAmSr`V9_Wuj{m|qm(*V z|9@j1qSu^m;BkC53nsHm$LLm>MifvnGnYP&4v7331q~+K^+`!Y430gZbO3iMF(H9H z@fVGJQaKph1Q-I49b1l1v%^Hr80w(6Y3FykYgj%%@6%#bp_!&wP$0HtQD-)sQpO6O z!rqeg4nxi5C(9(#X(d!f;NKAij{hy902Ea4pqlh+0sAWfc-DBBW< zrM2u`xdw}xFU^VOn=N>;4U^aVRFMt_WR`gjiTwLyCKQwvN z-0vJu-`N}>&w!>ha0GrLc2lX)MvNixRqdCgpx8Yi0qRTEWN&ov?r`AU$&%&spCI4E z)mnDa-D*68j&mb&BFns0?YkkNcK`nJ3KXZLMo{pA`KiY^p7k8z3q$a=!ALZFDX^w3WNeaNm6OSk=WZYA0Fqp~<9~$98pia&>Jj z`L?y`8?amykmQKsxg|Pvg6F@Vbct|+j#b?!9Tmowi7ZR* zS4SbITS3Apow3HRXpOY%?OwMKJv=={d@fc%yZp3_&L)+%hgB~2=eM@q&v)MAt`WVi zwSn%`r4Mev!u)dtbGo0b1G*k&7Ac;FWq2|{?c9|B@^($>-(dmMr?9-DpT>aH5j6>j z?zYcwNaZ!vIoFxa4KZTc({g8=Jk-EV?|To14iNo>Ym ze{LHDPXCW%=P%XSf63x*2AiQ_zi_~64Xt_d>ue{gC{%=^G?GtRW?&_^DSNzHQj@-9 z+qz~}@$6uK_ZyBmkq}@j_Xe3pDfrbwtY7-MJ?p&MSw`hWy`TBF#W?x zu#CjBpV+9JKhAkx{^c6rIDSl?1-6bvT`TEO1=?51J;6A?m~&MK$q1P#Tlz3+e`&pET zM!&!X=~&_9?jdRXlTD1|MBmBAH4&PW$Ch{Ir80kt``M6V1*ShyXZI1_vxmecDzYyL zGE8>xBBqG5d01?L9UUEJ8Sd0XXoSq}GudJz^ER=8C5#O8jo&Mdw|@meKZ3-HHApUz#5U1=QyUVaH4Viv$mcHm7{w-v7l-A5NOqj@a}I`xo0+`{*%un@@9jPwDb!sD>?@ovK_W2Ue2pe3lk*K>vH zZ>_c^KLhj|kelszNdw2B&+SVMtNFUal~h|jbu}lePoKc05DpF`u;_!qIoWB%Q7vO= z^|>kO7Z)VcCCyq0znaTZ_Ky)evg3?vv;%xL=qneos(S@g>0a+Li5O0Px%*AwltvI1fqLkashtP=PFL4!F7&0V{lc{O?ZGFjJwZ1+;2Z>@ zX&~O}{|IF36ru6!D)I<~ z<~f|T*vxF&SJxnJF0N1z;y|&w3xp=O`G8BgI~kk-(~7!TeC+o@s_RVY{lb=@29g3M zyvQbtxQjxwzK8qc_4sksN9R~%+`P<)^>A|wtL?8*gK~J*cd4jfrzK<b zz%g2L1kImWbk+x71g;CAgo~e!7W4zK2!dI=pKMA?^smY6gW7*W-*9a-@C* zoSiPfh=QjrVyszd(hro2g_9a3kGc|@C|6QaFXXru59)xFZ*u(jQOD;RCooV64;xu_ zgz!JgE-{7KkJ~^8JA^IAi6MzxpF=OU~JT-QM!-m+$kD#jt4G*?D+;G&A1%B!o-fUwcaiKh#?0=~0! zrfwBb6s18abU{?SIhk?Q?fDG467!F6EcU9y$6Mb?vq%;l!<&;CMK$JPEw#7bRpHFo z#}V>B$xN;M3TnICV8PSI`&^Le0~Y1f%m;4LfDufS1AFiU>jMMBo#i-jE3lJf-mTLB z8{XsGs821B&^&yKbiO%(pY8!GpE|Z;?%sFwVMEkC-KhLwhYA@NX}HDDl@kM!cJxRW zxyD1Qui~^fET-{ro@mLe72mXYnt;e#vD-N@?R5d!MOi> z_O%~hL#;Z?;<)p3TeyN`!^ZnOI5VkU8s3wbfmstZ)n$3=Gx7Ua&t-=BTka2;y&rl; zP$Rq?bWh(+Q5DP4C(20~i7StXS2TgG|LK^))kZd{We0K($4Z=UjG7fjAa8&n_rR_~ zbKv*yIG%mb{m}=12o`o(^T|LmDe+T2zEEZHdAZfo{Ho5xJ}L7G-{Se8J<{^!i`-?yJs;law3Dsk3AwN1)~#1kL@& zKQpcBpCrD`4Gf{6NmfdJVEk$ZOnIJ{2OHmi$;7M=<{pjHfg+OC$m~Z=ha`rJ-7_9E z@SH+43rcL?%FSzMF(d{jxV@q*h-?&}%#M;zm@^(PNO;HgT+9=L@@0=2MKb6wsh^L;jpgprVCEIXZ|M+M%BIor zktW7m$;-En=QOqy?cp4|ZRX8qDI%QS>uAKbwp$Uy=Cv8pjO+7sr2`lUPkl1!-NOOR z&Y=b)r$2%OvQV8mg~W-YWm|LBr_CGKr+eN<5e0m_J2*z>gg{Fg24es&1mjDDX@PuE8^4<@)NC03m;|ku#UULcPWAsA zhcQYV(P4s;vntJ*-*RkDl7#*A zQX5;jiseIWJKhV>M}S-nTs#mX-uNCFtS^&j-Y>U;A6)NF^dqbTTJKI61{3rciRpAa zj!y>5IGwO5+`-1KmGIJ%fbuhX{W`1x4LBH(dhK;}>Wx#>!~x7OWKS+_*h~R+DzJX8 z<|XRA1uE%O+g3V~`=ejzPt(Gu-fMURkKzNEy>j=&)qs6@vTVJfS3WI@UX}2tI8&qE5BeCnV_RSMV^yHKEh*-Ta zQeB|zl|Ts4@q$rR-k&`f%YKCMD_fXSfrFI$OvW-Dy>%oqI9K4FhCqHc?&MoS7H`&e z?boh~xpg4St$PI0L(#DgqJQT|Nf56F5@+Cq6-r(~A~S>KT4Ne_uppW>C$f;>va#^}A{37yus)b^A%6DB z0wRB_vB6K_+Gq?{RpyD};W*>-CDSx?s3q13XVYwxP;+Na8Agu@=%7UNbeEwS2LeQx zi}z=?kNPo|2nJL53-%Dj9s~Agu@$o>PV@v{L-56oRk6p5K3UNdtWg{5GKS2hP@N0=ddmB^s9iBW&;9t+3>M)slIL@0R&qqK%cgsuwGmFXU^q9bs=2&z*}B>)+?x z0I%D_n3?fCes~T2pjSLa7~)nk4F;!Yd12ajS*j1Nv`qLH;$Ti&c&mtB!x|{ve=xfh zb13HHHEE&3kEGQnN6PukX6ow1&c%!H9eX_F__*RYWW1sR{3ayicznDfr2qJ@i4%KI zcML*u?%GfGuxR{l!H+5cU}D0f3}mH`7N(*!GUcO%6Jtg-3BbuQk#(@<7M-phF@zFtk}8TTq+RT@p}Ia z$(2VX9gs0)rVk@iYzMam?P=2rIXD8eFhH|UjQ(PiYuVD_49n9v!O-YkE~xk4M4_mR zM>V2X9xP{nGVlhh2qmSYCgs9?v(FmS&imMMszbPPn+8`7|FVhV%#&7fAt?z_tYqbp zSSFK6vxlF!C^75S8%Q``hwcpQkuAmVk2SW6tWsqey2fMGT_zu#ypjqD9wc-$wo&=>;J&lFq! zgLQadktC$ z*MMgm@!<7`v;%71-Sr9(_8dEb#WoaeZgVG73i?7vq)|!_ACVw|i^we}VFkEzT#Wjy zfbtaOivL*$e=ooYfy}R=zo5AB`I?W`ImSX$Bj|zK05WUOV97Cyo=@%V?U}Cf^(a^u zAw-e|6Bw(kJ{-=C3m=WLwPro8uWf9?F*W=eLGer zUmGJ|eBD#U*ZLa8)~(Vv;D~)69#C#(aUv7|i4afkSiV z7cQB6Z|tl_ZKtgpbqMSl9*=zknm#bF&|Du79x#_>vb-Oh;Hsio=&|?mee24y1-5`5 ziR#;ujx4)id(3?&h7IbkW1)I4{OlXZ+YxnP=|0SM)O*L3OW;)_nT2A=&&k2a%?~jL zS|T8M#GS-v2A)VXzgB)fXHMJYq|&ajn3o!JQ;V$=pc0H5$1TJ*zo$(&NjO{Dk+UVsSWNvM#TKI0AwD$w~nrEv(ePY zG~>yK-bd@F^;#pq5;yyhUt3!Xl$Dj0Dy?xR2#wDAR}$fq>oLAsX{a6i|D-R|$o(nX>7X zT|Pa6EUj0oXR1_3=#I}tH4GDgQ#3KI&&QL}I0^fmKu=m4=6N%^&uNHGau>h;w0v}wzN346)iokjip z`E*(4hsuf~!03V72B?Ta>A%AZ^SikDDy>&hw>%-FyIDks3eBpeVWbK}%Kg#IO7yxV zN?6^rMVte@$}#4Z5&tHTde?N-Jc?>f-tx0rTZdwps2hdPeQ5Z(InefSlC+WXds0?* zkUnu+R$ttd3>5G}w{xQpAfIg0IdLD1T9~Vpc-x7n>$B17%gBtEae4xiD96Q>_q^W3 zJaz6c*sdja;vu1Zi5DMlX)V$ffets{nTGJ|8(XGDz!3eK9$#Y>e%gzAcE`m#MdYer z*fG1v9Lge$*^|}v6cc#c__(;#0S~05MfYcc!_Q4@5dON!0W=+C-a07kJX$bo)gZM%s}eFF&I(+byr<|X>I<^SZo~5NWpx?sLzxixY zfsCeXcvi->?BJ*3K%&`43=?L9@VST~cd*euo(esxT4V1To^B2g@JTp;hdy6(1W|XI zk89ueZt0nSo9{WE&G+WkD>o`3F-p~vQc^YNMT z>#?_&hrYmjP+(a0#M@uY8i#fO2lVI5xv{cLru&JA9X~lrSFpg)>OQ_J3kO>X>dw}D zim#x8hlj_*Zrg(;7)p~&7fROee$cQ*KuD+o#B*kq4~{RBIhIL@=@|d+OHOd`^3IKq zN2eFh(_Z-v?xrohNgW2w$EvPPT%92dkF?pIlHq57&qAH!_^V=$?%s41&CU+yoLJ6) zBs7grOrT({?x)T>0iT>*7u|%~5lBpd*Y%=tx0K;0fmi!SL+8G4INb;*ja+;&FOA0h zPd;9yp*&6Y*yIDe%0D767zM*QU=rX&OxE?>ubITw^B-b(nkQe$K2#z3^f!_5P5jBE z4Z-wd;GvmEEtSoc~{Hr2EFW~UhRfoQ97|M_;v zsz{874n}WmIlKLl!xmo&S&)#tC5e#ClbY0-Wwge&cvFv`P%Ben+##$q^e)cXU>i3| z;*VIEJr!exM?0;@AT3G>sL87}cz9vF1aoPyiZCI0U<=7Rp_kMSO>iag=j+NXG zFH39@!+ZS7At=QI{)1H?N)MzeRrB3|0xI51k#V!2*964(dkdh~`NUgvUmXYqV!v^2rod1f`?}e3yHx41mOwD z$pE|vd^8&?`^iEy#U<2Z7o@5$3AsBM8Rd)-Y`m)MhdD;8v5F$as#7!Yyjyni&-Jxl z*zcAg@~H}2Io$CN2wUS}hCs~^7G5ONe}<4b7D{yDiZmL?786_iH4-z$e3k?aV{Y87 z>Oe2(5n3Ao@gB1UhbUlBWA>Y9Q0a7D(ijrad_F;F&$zh8nkS9Xg!Th+y2DQV8cRlk zhv+GQ<^Z&oL>a*P%}KQNS|fa`qh`SlK5%MltLJoC88f{D$mV1q5)@=5t82zCh1O3M z9W}%HEp!jInVP2#Z&b?o({;aLw5}Sj9{7q(|2dRbR?04v$)xHf3_ey9AC|f{G;-Qh z?wyfqSlABJG2Nmx`9SPR-nL_^T0YsgNA3ik-&k0~sOn=5h1p@K$qM*!Dq23=%GICF z?&ijp&lv>k@_+oW=zxtksTDGLxh66pR^uVI@9rjTV$*(@LsDzIbl}po^}*m0<@s=$ z`WyC;Y);Nk?6_gWf$HD;tX4tPOB+xwROxs+n5rl{ea_q#=HaVb6tYL>aI>5Sd!cS=8a8_CdcE-7wcP|0 zej@Jz^-cT+41NxG==MSN@4=D->KF?bi&?0=Ye7xN5ZK;hUSho;HaZI4TXAtnZWi{5 z$rn=qT@NM}f~RE?#b#R9ZvqQz^p4-i!vOHrKu9J-w3sa1*hKUYNkVaEd@FW*$RXaD zqVZgO0GQ+O1KpQDBfcmJ4p)OooHQt))>Y@ViW3r;T&F@7WF?mAXSH_k2P_y13kx?m zVDQ^Z#e!PRt7HUF2SY;v+wav_W@}>dh4eU}%boI=Dp~=}(ya07#bN>{w`Mn9h?srF zgvf@&6w$Gc?IHYPdYlz=%Q%`key&1PrBV>2FEg{cXU6WY$nE z>TLXwTs5Sr44QwDjLG!*52zfM#^aflsir;J1kim8u1nq^sfDhZ{JE)YJJq&gCV5)h zMiEuPfSk>zspvSAq{Q$c4(9IBYzXpy2n3t1*dDfRMOPJHW#vwnSH(-$&_58AypwMC5fbXC^?Rl>JiX8`pA-4d%lEAjn8y=+K)ftvJ6E3m3gQE*!`( z>t;gg%p2HsW&0-LN1bX_`F2aQD2=i&AkVsJRp4xcYA`ki<}@Z+YXpcfK(AzfZ}`Xl?xZn&sa>15AbL2w4anyp`kB)BE@b}V?k~4wGP~9+G89zNY}n}x=p@S zu&?{1EkN4XKju~|JaN?PIHKw3qMpBow!oBQGY3At%#i*H-xE*%Tav1(ilYz*UqgK% zGS8YlRcHU57#<;eDr?UkbHmla_{wL))s%?|73Xr(&K9Zbt1_LkQJT|hD)Qf6ah=4{ z*F4?wb1ZtvTTHJdub4=ele3Sa-3vC{ySOh+5-&MrUg(H7t6RcBq*cFQXBY^;q>vBv@1z+!^H6Vu9hvdV z)m;(Okq+$i%T1@oq2P0d452kPH9a*7_NH<1@bqhqx<6P>TS4m%mzS4S5z(v|8Hz!S zFRB=(sMB+;w))pG%2oJ?DXJXg{C$~w#&SZOzJo|^F3Kittu;M%M zBd2Js|P zJ-^rN2X%E-)$h7w!wVavxm`;LC5y}wc9dGSFj47#kge}tf(F|z=c1Ny$Z_;-1wuH9 zl7OAcu*t6x(eTUHR`RJ7H!wneLi)kzX7GMEBW_hwgxd04k!T))KfQEOf|wPR}1&o#fnBEyJ!Rc^$^U2pbdKcmYZ^X38g0^* z;`UR_A?oggdasj)aJtIDiLs-m43TQDBu$9wn722Z!1rUs_KTP5UXL|8gTTbnQbkio zCDI8r&VHibj;~hCMW#Q{@4vQ{yiP=7|A7B$K4Qp)nuaFNJJJ-%1C|*ED>{ySqDQc@ zI?NP?mK5(;TkJkM4mnRJ7j1V4)_J7Dg@-zGqp&VRdZ&5a>ACVXY6=i#Hg6>8I3xy; z^%$`ygR~qV_D=wY;Vgngqc6FAUZ=0NT?>zVph6m-RYnlIdise?8`FTEuMysHBT03<;LC2U8OIPU*%JncU5Y+Nkk0e<{b9HmU#k}uSG<`pwP1*gz* zR~I~(PC7LHotsJTC#GG92{I_bS87q3Wo0bfLzbyv>Byo4Z$5!w7hsn=m+x_OCh_-m z$}P{TBgC8qU3if3glywTV{8hqYdXM)G&aN-h!sE`ojjZ)5!Tb&`wtWh<_dhzE@Juy zn4N&%C(1m9xthFa8IBpbL_)IgWY>(``~^{8me(sm61nc(vNl0ML7!i!-1yX($(I1z zuB-He3!*Fo?+60{-U&Ql&};_D3jmu8QRumE#4p_+xB?*j1hw;@pSe%~-lW#r^K4w| zpEs9Q{0TI$R#rd9v_UEIDZrE)_NkQ))Cp}DHDxcgK_B^BT0Q82BA37d?5$$@{@Zi8 z`Fx?*!+i=`Pq6uevF>EDXPx)$1(+ad(&4Y=%ntq`@N0-3rK`;&UdHa6>XCzNEFVrQsZ)^3z+$LLP(`vIUo=BAZMAcEV9mv~BM;ncd&)iVGdBJ-&Tryav?X$z=U=U%j(pzI-A^6#=JzPQ-X^v`nR6{xxgvS4*G1368uCISXsQE6a|C^$Ucw^!-kz24Yx2`l6>R zU};E!(nv{W9PZwZ+??MHSLGBIo+s$IG~Y5aR5U|BbZV5=)xh{?*i|hf1^ZI)K2<)q zYe77UCs6BSP1w#jJIdA~D?`Lzu6JNQL3Hqpg*61QU>|YSsqcC%u4QBx6Y+axvbd@yQ_wFh;CJ{VT(u*>?5-}c;YBsNXK3>3QPnNnIQr`(`BiFQuhM4L& zaKBgat?&vRBBZinYE0mCjl0ROa*$PR_3NG#R@ly}kbkApczKs#Cs;ndf_rj}jU*gzBFsH?5NuYnvr?O&PV9i~NST^FQPe zU(>7Y>6|+g>4e?S7UzKzv&UM7HhslSx3NlsPYtkB>ejLK3}sd+BTi?U6ASj1xfUc9 z;WM{r$_$F0k7#wrXj#F(mPD(Bui@)#+Mkd3?Y-OiYEgzEH~*ziEON~&ZW;?gmL(m$x4*Mop8gY3u_-|+ENX6FXGw&lKdALz zV##dg!8X*%3DE8(C0B(cenVmp>5cq$o**wy*4Ip-QRV6Ge!Z`uTLA*nt19pz0J#1E zV!6PH36Ql8auO*w&Go2PmGP{i^!a>J{wHzd{{-rSEo*y8abOFa#in)qA4s_JY(ifi za2@4_!X^f*iM`=-58^Ku@EQM|puHT(!NYSk#4%bA^+@%{OZyFz$eTA2Dh)?^jjure z>z(vd{VBvTzlJEIiwXW)pvq6bSV4}~rgaj|y|S_jJC;5mRf18-q?*u&99_OV9Fsg@ zU#CmHqaqknx3@TN(}Y^gNYSGLq*K6qus3bGClQ0d&Aj76tnwe*c;?ZLdOo!wCp93odjJYXHCr=~!9@rzh#*VL*> zMU2`=J0rluRv|?dYIovV7rgm@@mB6LepKJ=WqCJ{kvwUgjm=Y&(UVklXJ`RPS23wl zHFB-0j=)&QU=EBz*Z9Ox(;g9&zx@;i4`d4NF}92V3B+!8%EFPlOsQW;cqE*!SC&F|le{YWe)p8su!&S@H4n>ryx8Z{_{u&>zt??y z$fc+E!0c|FrJID2{vAhWFE4(t)h;oV(_7Vohii?tKfqT3B+|LAoO9f=H|J_zs4s(X z^t*ASYAAW&v_0v@uQq#v(g-@I_+$m7Qgmq5>6qp9u3x_2z2U}gN5)an1iUzJBq4AU zc;B3X7Nrx&Xw@=uEN+>+Ze^vc`px-X?uYz=Mg-~oUn!7Is}U)B60{2UU^kk<@q=UM zvOw{E7nud5a;5mDp6SK>wo+i{oeNfpB>T$xAFb}Ar zTsX??JR4#{DKyvO)Ak57!0g)e{_9`B3_p!huTRjoRdc!;8XE84zo9t%H1XT4WPK0B zYP~+~lZO{^GE4#tF>Z#(P7#auwj2m5{h0l7T<#f6;*PGS09!PFQ2^QbAWT*Y6G@Yl zp)*aI6pUGUm1-~_%|8`jOi%8ncrMSHYyw^$7VVoED)#sUez|!ZuDbf5B-t#IejOK< zUVC^Ed}iF_QBF?IyZxmH>qt@40K9&;x@d870w_`pOF7lm9S};nI5}P2KZr8Kz=-}~ z?zILrSY%HR(1X62a6zC2{Sj7d5=il+`Gyp^UaFSSf>sNG=eGkc8bfY4;mT&s2BKo_ ziFjS(A9K&isv0}yC1j#pT<8(zo1^vWnz&)HKBmK<-ONv&Ou_E&3t$GxYNc{dY@*bH zE{to=i4yB4YW`#N@%i5vp@&;2b~uov_Y}=Ai-FE=(OT{QB2+c-o@mr>lqLl6{`SfU zG>Jk_TD+%lF1Yx9M0`7QvSg|gix~bU4ea}^EjV=kqshz%PQE-0O4lP7F7ytew@uL& zffsRrAGR@>2F)>C?JzCG?SqZV!%!f$9TEPBLD@zmDbGY5zMDZxIYt+ti>Qz06Hc^ z^VHvO|HUg}zPNhM2wkn9{UOQ9T(tRR{Sx*cF;Q4YAUC*SJgsY=#~>>?8rqqlp}lG} zlqF$`0pw0J37V3oWC2?v*68qxsOZJEW|NoVQ@j2e|3Mc6iE=Nx)PI?{qsmx$(9!PQ=p^h&W#gewg{Rrnux zgujKeweJaX^VnG_T{bGXvixlQD>>u(c(zyi89h>t<$XwT_*LE;PybNNPDzgHVaZ8$ zTh^n4HG?r@Y9s)%A&~IFz2~9@>7a@+`0b#%G9lR%1D_p?Cs-pWWB$pyDz`2&`9QJw zyNuCz?13ILz}ski*PCBWVt*0rn7w2<{RQk1P#aeOv>$4P!Bg>^5zKnQ!#fApV|#OR zpw-seSlHKMzgB8@b=B_Ik>KhQ%v4Oi`0ay(FE?7+X4q8OCe01}L*6YyND+D>~Hf2C!D^IJU$O>MnB@)TNPI}$8z zRAc)`km9=n1SzR@&+V@EGYrPCZ8mu#*I-8!R~VEUo1VTaEYMj%g|xf2Mn<^}Tktk( zXk*0ZNCj(W#=UEW%&PWURo%aCm`W!CI&BoGIF|F65%=h2(#K=cSO1W!>@iVflkHDF z1TYiysV76rz|ds3BI;tP6dBIHG;^7LzUz)BA)&0i%T%}LcKJcw)IIF8|Cg|YTUVS# z(&STK%rAYO(UgjxQa?d=9N?l47K6DBu`aJV#{XD7KXIwE=j7yr*U8vE(j-C?`%2Mw zM+IQ-5l7oq@g|>JYO2}F#D?YL0pa1@&USP(=A2rsP%cup>8+T3L5*EDCQTCI#C%8p z`Vp7apK{w8!R;(+HtzLNs5c01yFF;K1rgWRm{DYNr=a&h!t0O=is9h@Fu|nA z%>VWtvRn%nlgyV0>9@vMly9WV#AeeXq5w({-!W3Z_&1=_IQ86?vn&{u~fibkli zAQg6tH;-DOFJFBqk1>N?P_l_KS~)zdd@hFa5Xgr>i*yrY@%G#7w{Xpm+}{dCbazDq z{uAUU+t9M$*_!!$j+A)62&6#t1 zGFrz_X@!bnh?4jT&&HpN73Pm?k6ajc_r+~j?jifOV4lP7&JM^Q+HeHyb*KJofT}m8W z{kSHen|sx%0v!gGtnV6#T1JHbC3n~iIKo+3h+|onXI9yEFfb>4-S=7-g_Lx}R~^vZ z6S7Qp;;Gf{iUatvTv|gP`APLtHW|W^DiV%4eat6RD!+UnulS5#NvCi*I=})f1walu zJjUcB#dXeRhK`Mm4LaXXPpL47zEER24D1PLXlR1Y%k4dt?A`lA(Layk@-JyJ zb}3Hx;D2GBucIsohszxaR|!01agZE$BB=Bvn}9=fcxloYJ~`85oqL1F21MuXbQ~Wa zV;_>tPd?oL4{&XRajgB?{`GH>_M&vt45DG74qee>7@=1rJ||NeEYgyJIpab2o3kO< zAXsOh8-|7luGyCE!4-+8dnU$2w}R1+we#^6tRjX!lA~KlX#eqR`xIJLhiC9{qUiO_<^2L5Q&=?GaEOyoOBl+W)YGP@&P6qQ_0|QO11j(ChY)UHi7FeeQ70`9s6AvX&NLS!2ya+1P$H zKqhKv)B!6{vWa8BY>~34UV!nFD&n2M0Cy0%^Xbw>hN?M>%DS}y}lwq1~}3h(MzBmjKEFnJ5e+~n=Q{f-vcF~&8O##9Ye0NQRJ zgcdAY3~MmW#Fh`zJYan(K_qKU1}(4$<-lq*X2b91iCTTR>or3o`atpy+U4QDl4fn- z`x&TX&Cdtonf=Tb-M*X8RRRtfL}mQ=L4SN*_Lg1+x0aT~6j)OPo5ad;Wnd~Ml zUIt(n@%Fy_sjvS*ZGExcUW3QW%b=ZgFxBZY^h3zpKN{_RY02OcM+yLUY}~8BN%^*8 z=~oP(We*pxybQUuwxB!{=7RcVN7GWkDYcDKgIxC(9GqGu778beFa#o-umF&{JE0f8 zcGfMB{{IO33aBdAcH4!7AV_z2Hwe-t-QC^Yp)>;0-3UmRba#ogf(VFomox|{!hIK> z{h$B8Vwm=r86Uu2cm-(J=i%T@X`UESy8CrM2ry~&C#sl20 z?Gh|cBwc1;Rc9ytasw1svR0K^V^XxU%02=jXG8 zF)asWTl|TN@bVrYJgSTuY6TZ*eR4?daI+Mf3{Z8Qk;19^iJFJd;-C%olKPI~3D-;b z@Qfu#T;<0D07g37t1A_tTL>pt&Q}cyy?cSUvHCm?S*IT(cI>I>14xuDd-G%|9Zaa< z1zp58&)+3{*jI|%FJ;zw5UD>(Y@9!C;tl(`9$KDq<_%_$M|Fe zaHpijilFP3vlL@NEd*8l-qMceny?d(*t`@+b@qfUYVIgbq<94@QD$Xby7Z&2ab(Au z>c5ER_C?qy!>^D%&On>yvvfHdFC^ioTk;J}q+O~|Bo~T1Yj&_y5!QmGJy3j!T`>zf}}+h^9+4emh1QsNy2BAkg>iITjcT&_XA@p+rm~ z0o*q@1UY&#Fv{TGVgqmK-!_5>BvB{c7x)x%ZkexTp4*fUu@dyZ#)|wHcL(PoJDlD+qa;igBMOiMYuvY(*oCe_N4yRUg`vUe5VipC}~^eo>g? zS4!~$#cClp-ui&4MKzd^B#xD8(6FZ4jm#F7hwxZ43@lI*Y znL>TEtmN@ue(w1-lPly4F zd@pyKX7(EOx-eK*V~$xDFN*u-Pnoe|&!h^T-`N-_7`*q3BmYF8B7^+AxHw&dNEU7E z!VQ61KV(-W0!Wm2r(ge4W*<@s>`fjRxZeTT#syI5I|Wk{!J^k6fbibcHDqT0l7AyG z{X?E&K*4bBE2@5^1P{~ovJ2(h1b{feRS*Wri%9y>JNesjQO<9+5z3Wpm7Z6^R!Efh z*vuE)-`>XGU&jXr!xUagZwr8iGEi>5vZ58x2I=R(UGfhYJjfC9)#^;7aDUAg2rFsz z94s-!L$UGkWPfpxKXC8({p(i|&((V>E&)BOVr4A%yNdklpga^b5rUSsmw(Y%#)q@! z(ed?b`8GZxRkA1_b(R!ToV&@W1_^sM_#_+{>%~@W#Pt30MUGVsWp!tYXC0a%tm^|6 zgJC=!7}R8&PF_^*__u{rVNi7)ZE~bR+gZNn!MIh!k+d5>hQL>aX>;Z;OT~5~2?o!6 zhZn-)cg~}$8x1*nw74YjlE~z`R0K!om{bG@6zkF>D1&ug$#Bu>w3%zQSy6|!@ixg8fB?4S8;wiY1nuR?-VHK` ziajqe!ai$=0Tl8r!GGJ(GDJkjq{Rn{K!wMrXQ(<## zvPekl5+z|9|HM6u*hFc3sv)%4P)JdjcWZ<4X>(ctF8yk94AB=q2hs|lXgW4sYP)SW z2e9Ts4g0{6w{*(u)#;5N>Kk()It|l;%T(9U(#jR^t_CpVa2!fu0KMh(J4{aZRzQsc zs))1Z0Rtgwc0G4G==S&K=J6sE%&4!x1J8t`Rmkd!Zdc+5SfrW!>J(&4>6bFz+GcTF zy)-NG2C8VJTx*eJbTGY3+tfd-Ad_;J8i8*`dBN;Y?W^e;#8)5oAX+tZ>!$*gT?J>I z*PNyQXaQKQKBho^PsInkP{qz#il{?}>vMgZn_0(jqySGqbt3%Sn0~$BS>8IANKwLW zmtZ8+N(qeojwSO%kZ#}RiJrs$53|4FCFtV__;^!Gg60m}MY|#*AdJxSWVH_%sc?fS z-}5LSH(mizWk7@^D{#)s*6CB->Ga;_l-nk398S(GPc!%ae6Htb3-qM*;Nva;G)a?Z z+ks%_hu|V!K=O!dd0Q$Wq~Ybcl@JdvM1xIVkLM-p$}e)RH}xZl(G}@H#A#vl8f`8? z7dEe1--bm^0&su412mL~V7~ug)^KIuw)$J6V0*8IjbTD(gNt2(&-!A!=TB%a+#XEb zL%Y(_ApF;7zSwh&&95;i8Vp2_Tj9FYS>g%n`OjAn++<*9N&_SaeJ2T&5C#q$yKnt~ zo>V(6_3PWf74Bzg+EodU%(4h;`0fKFbw|LI3vv}Q=L!_+0YoO?)3pqBwaDu+9Z+Oq zt1$Aq`%pinELX4--AXTNm5Pu+fTaCFQodj(JwBlG;`VV96Wg!sr@T0NG;kcO&Avd9 znMcO&(K6HSce)Oy_6cclp~UCeC>Z7S24k7f8Fz`m8y^@LN#qD|`%rvQhp6oJ)-Cz; z+Zp3OiXhZ6e?|-)QaFAToS3-t``1y&OTA?F#leX+`VSfJ6`0Kvx6I{T&Ri31QSp?8-hSc(B$w1s+Yx+?{ z$-71Xi;L16-jthn2dx(K+&MC@71pKrb)82vP&jK$ZS|`S8Gv>J+>zOvc3wc;`2Ui= zQE@9oe$|Te;o@nU?rr^nj;JHZVk0ww`0wfsZczg%+Ox*_X$BrlG|NH-N>Zj%6=}rP zB#|vsgCrSNAkT8x4@3AP4;}!pKT5m+sW;@q<8;~$9j&d`^*BsN02hGO?=hH`;de3l z$3Y=Sr?3|$7nOrN`yb`quEQr`J3UH9oIV$7rc-fRnwfogk`D5hR-m?MqmqW+&^d3= zdIHZjQ9jL2JOybKJd|>uiDRGfb4JQS=pl3cSFYT?b#;F-BA$of((HM%nqyml?*GwJi!sHS#$YJW&77+sq&L3{#N%vP6TBPZcI6-SoE6wu52XvAC`6J-Om@>uZVal(x2Yw^M43CmLun z*d>ye1}MiPY1CNu^grBa7ME>>t$0j0IXEllffgH#ZvMRiL&g%ovD$#l_4quHk^{}| z^8M++O*o;!T##oG7{d2@9X5bd@OHDZ#wZ~MMY0f$V;rWpIE`zfK6stlG6pAxhQO4*QxP{Ue-(Li`sc-| z+ES>Yho1uc7qo(iv7~XJ&3>now{I*Oes|tbR0I^I8aoybx6mQ}Eb+1h=M1oCnweoS zY}dGOr;<6^El(??a^!v4UPZ~99xt~}=7zp~5#~U>K!YO#R1?!mt@x19ox*RVnf+>) zm{f7J0mh&)l^@WQEHoWo9;rpkp`guq`t2J&F8T|w#BHO2x)U*p?m}a11SgYBJHl^t z~(O>ZbpJbo{QHH`pg6v12QsSJRQfHwXYc%YutIEtC12^p|b+dK-q5&YOFRp4& z54qw0U7R+#Ihj{F=HVTc>s*eCU`039XJKZcbq>O~NkjrV|7xF93~b=hsh^5B5yve6 z3{Dao3;5BB$}OOHZz$LGt%C}K4(Af&+ZW!3=Inwq+!c8P(Q+3&@+ z5mX2%6XiAansM*`U|~6lw1w<}1*}0#Jo&3`Bjm_^#zX1u;;6+cYUe8Rjo7;(Z(%+u z%HeqN!w_zEP~T^i%l@D&+m34;50EaxyM9iTJwNEeM1cdIB4NPHCgC1 za6_&HEWiiqz&u_kjm{BWX#7Sbc>D3&j0}^<2)V#!qhv4|NH&2Uv3SO9oA6=DFMM*T z$oA{Aa>(%Yuh-+CF6L^^Zos1xazS(}Yatm7zd34CN+s|3N-PiZLOM30)W}@^Hs9Fp$M1c&< zmY^50JFIkfO)`QXkPlygW~-3T(c(|h)vqTfptq&U$rW^bs2vphuv`Htn-Hk)flTT% z37^|aRm+i}-}Rqlx-G*FcUpmD{wZF4L&nTvM?%F8th)Bd=0({=Z)|UlTl*0nabMSB zpIg@;=*J*(l7SWwDL%oCqVbB*!JIZ8P8&$0!a*e?!)O0?_6b!M>qmm28Ri535M0xw z(C!7ehBk%p7|NCc+b}C_Gr$M+Aoiwup_OI;Yw{nSUNuM3-Wf4G|AKb=7BOS9$|#Cn?KU^3tNyF+nOB0#(VWeP9N@p5wZ$4~MI zz^yyhXG4H6i))1=+ck5*F@$P<4cH-to@YXx1|APw{Q!b23|5mpxEl+gtWg znP_&uzf(5naNYbisdCl#nrL(kM5o_ii1_FiJ0871ZE*-heBk)Zkl5m*hGRtp{5R8H8X8Af%sm`l<7sTD~4T3|w9d1rW0aZvDSaSp-m+kByBv z_pC=b{{ER0I|y0*HaQ8}9K0!MAlVsellSM9?qWl{*~7dWwW|pet#uJSbi6hL=G#BD z{>k53--XAV*AcqtiJ`v`ueS33pXv2_KstiWV{}w5AP!cLBxcqOEIS$`_0SD^Ss3^6 z>$QkioVsk`)?>8xy{&L)++b9de*=TffZXz}tXIO(vO*vxK()k7s-Gss)0iFAwa#JC zD-W^7se*Kvn@wPTJ_XQ3Y#Re%@h1r9+fQWzg6tpu4;o{@cw%>TEEz5*2<58HQyI$L zP)14s2Mby6Y{`gFCnSA1XI?OZ>Gd7ScX%&F5n&V$-HMJ@UKUQXh4*Ae>Km!<2lsIon9s(NLWo5fb3p^ybi z^^H>HygT4{@+nt{C{~IKCwiA|KF{RSyBio~R5X#B{YvYCDYDxm@8bt84yyoj`C$eY z!{+Whow1MlU|O}X@-SfFVd}fW)K&tVX=8?+9M>GxA^TeWHN&H9FKB#cEI4Z z&t7plVH-yXv|!KXbzW|E)c?EB_SU}X{P%Ief;=KI6beU2AKg@0*)Ta>Avq~#BU$vM z3}j6V`I~paVa!d?UT@hzEttYA%dygJ@0y-3NsOrMl7j_OOVU<&Ka><^`w#%mip$5K zYfi`}QcTqgEB;q@14ESxZa|=)^d$A{Rm$PrH3gKtTaa|uD-$QEJ)xn6Iny3i!y3hd zba1LfdbH>Yvakfmlgm~FZ8PFH1j?9s+9%LgMM76H8R3WGaku;_n}nX0nqEBTUuoj$ zcrcU;6H;Kv`_Mb#O(D-0;;jD+aaD#w*In~t2GNuCqw4qX{lM@`iN8MdhGxLG@uK1) z5o%g%k~NH13p#Tp9(o3p;mY7pI0^nvoy&?$1!+E^1QX{0zs5$`bn7j^sN{4v3+I(C zbk6SD=kKY602M|_VGB>ERavN&kQ~Fm=>J)jKS_R~2uuMs*#EOfPKzW51LlC?m~oS2vh zyfh!=&*(H@53_pw@61O58CDWulCw_neDN1xo_?oel2cpbX;cja@1N$e04js&Ci%?uZGM~+TqX<*2^-3-)L9L^| zk~`e4*i!V23~EAfWbI3bPh|Z_qjK)aCo6Np2&&;lQ;>iP>UF4E{59}m9;D6%Vw!|Z ziE68sYSfUCgo}CbHN>pBQdRQ~e=K-#Rfj%?y5i*ox9*Y35LhRH(u22f1s0K01SEop zL+g6zjt^YTpu=hp>nkC?%E$*WY;M%{1$2Lxd6#YUn%{##4sTwtu$-RxH&2kt_ezUd zfh#ix1_1w)W2I)Lk$fA;O|H*HDPa5iXk3zF*r2qz*$d>c{8Nmh4P*@{D=5T(*FQZ{ zGv4G|4w38u*xuDPcM%bfU8hRVoAp8X2xSvnePj<)<^cZf+ndO77vSr=mz$fr)B*Zu z4{#Nbdmm6kWQ<149Oj%4#JVnmEo3uBC=X<{Frm(aR_s=P`ZRc^(Xt6HT6QZB-55TI( zmBTz{7wP}P;-}L66)8s+mR9Ab$*3|cZHBy1hA>DtM}ZYR69bF};8^|(Mhs@MLJ2!y z3!RLniJk+UK@QV0)dM}5g!ASFZaq#C;UBC_mF49ykndJ+AVWyDz@2desm1jz+J{^@ zY>{Pg-ph8`e~cYG*qz9>j?RARzpDh5!LC!9V)ZdQs4c70G0i&E#efJII5H%)w0Fo< zEI)9JvYnsB;xkVWYpRwbgz1_9#-iZQCf8?GPoPF7`1Z29Gja<%6WXaE@_)ho5{&;P={m%3QAA77IJQW(9|l&BxB^ zjS7X|o<%-5WKI!?tj0hR{3ZxYt-x56Nl^t|1A6@^&4E~LJIwI5hL?BRPmY-%jSCa2 zC@$2KZ6H~dZy3z99Jg-7{qxykwCcpnZwWuYVT>TfRf<)%)bh2OO}3Y(l~kqy1k;~5 z8Nmep%gq?<*ejD!dvF1mgfi{|e;x_9$L=fP-+NQ*2SgetJ^zGUM?{_^OWao@i(I58 zlg#{7#;U_9-zhiDOz*i`y=XCOJX&ol+UD1kT49f3Az~i42JCYPvYo9Vp}e8EnH;4M z5K^EBO*l@Ys9ipPcy&rd1P%^`zm0EpZ+SqbLZ1Ikfd5| zMC#ex0Wa(c|Es0+LnHD~l}E`+9qG(Q8ie>ck=5@!QV;~?)0sbcu~}*I$6MHi>^`PD zUC%3rgG7}e+^Nd?=Tj*qCF z(N;42-IU6^=pxblo3r60QQ;-a#L$+9xA*-};O%3hyjaeoAM*`?H)F;pc7~xUs9B@3 z%TW7joZ`WmbY;1aNFTY%ICweBMv4WoSbuLtC>qEjsWJDN=f|on`7B z7iO22(aQR!@A}W``bUFWGm1YzG^_-8k1;q*k#&zldS%2`-6k}dxvvI3jb!`_{b@qUjZc7+YR(=$Xa6`1#Z5 z+HBZZg-1(^2py*(1@TxZkuD+w4*9jwtbp5U&g-#smJZ<8{KYn0IZ^`AGI)CL7RX#v z9&Vr6PWO|^-pRo=cx_{5-8~$(UV;8CoT%atMyDZb>#2BS)ui}@0XwVt9$6r9&u+2M(8D`w?2`5=G4a@f@Uc6}zse z%s0WPsy6=)DH&vAB-L}7*m7L~p7?a{!Iv0CgC+fZ97p22+Pv`d@@KAK;PUa6HM57t zPluTb5`<{6e00H8p+C;Y9PUx@=g+x4ttOi2)3tmQGLdiOdu9Xo$3w?LT3d*=f??u! z(ER;H<~!TqM1gLz$L}}DQ_`x@p-7bBL^rHxnD4K#O^4l#Wz2D`=i`+&by@IGgS?BC zBPeb{$0B=k#Pb@sEIa9yHeirwmlE)|{ep-hXCV)2*q5XIks(^ZCX6kdkf{W}^Znbl z3jMlo$fRHcxWZjVdEoS?jQ&2pLWp9-uTass&bzl>$7+iPUMGJB_M!%7Bx$bc;}`oQ zs1;l-ot=+?^j1w{phlN|F6YW80H_o-YFWHM-&7Y8mA_V_HrF@flyYFi@Aks|_aRM4 z(xBO?;lW(b>_R0IOI39>0;E=8e<`%JDW!eBx66jBxy(bY*3R-(Ti7=ZQKD4Ns?>}i zwl&-&cn#W?zA2QPoXJHLP6(t@Yukb51-yZ!`Rl4`A=`7CFZ^v?V^7K95iOT;)HHLX zmSzHma3V8dsI+>bPNH(m!qCnOsT(7NnW`u zG`rPhF!6B+E_z#JIgAj9twgf;ilt-ujy$bY z2l3>Tm}h9AY$l^X!MTH z#>3+RsM?pB?6sQ(LR8euFb37uGsL4311@vu?-ww|&VRn%LouD7y@ z7BMk>gCwV-e%4=}GX30k7wW88ZD44iO2cf*Q0G(7NyMA^&OlpJ>*t??YTxbN;Am!K z2wnJ_D-!<3s-hy`0R+uGL91bJMf%Jg>6h)rhkeO;WZ5$BG&e>cRq&N0VcwtiogD|g z==AfZiCx4AJ}N3IU<@gB^w4C?G=<3dI zXEsj&vpFlB8kw>C`p0gY`SIZG&3Z#&5`5i4=$E#8Di9_(hl7o6020#UXRDX|S9{m` z`tW>TIkB)*0m&1X3onbfpOj9X9Xb5v#RN(JZAYm2g+Czh*^;ADJD)&x+dJxhPrYxQxr|ml={}K+GG>}Fd@xnvTY9t@47eizhBa^s=`S=;rIOzH| zCZ0k#aFXoA*B@m};pnbS!uiN2K;(VEZtpVb+_HAA&Qr(^|HARh_WL-0UtfbB9~;;o zf$#oIaOHn5HL?l(@f31R**)V&gNbM4DG?%1UDIxwEMtIgEbQ8A>y4C8K$j>37N&f| zj-Q8U!Ztdct-z%TynwkCbDWSYp0uSK5wYFTBbm0rqDLy3%x+FwZSxG;MN5Kys+ObM z`81AE1>g6V)(kShqP6N3TJf>yrFYTGq>j5OsbU4^mIF(yWlg_+6~qZuU_=a5z0mbD z`D4A96BjQL94-F$&l9!iCc$g+_+DxpkCn;bgYI&@-#|<(-N&f1Noquv&|Jn!CLk(? zRIovJ(`$`H8dsOCKY!ku*&0-$+-1Ei-T&@c9G!+FFNeoc+3vOUwP0=8DTNF~YkLev z<)x*)>RJZ2<-pj$^pj)59t5uC5%w~c3Sqmkap>ra2w5F;&3RmHPSx|GXNBfZzPt1J zc)aAFC_E^0khP;lPL-dnG426&v<_E~C_>#N6HLFEP{;>8eI%I(p-`Y-+cp+W$Xr}@ zx{0IHIu2~V|1d4G@{1b+E)InE4{^ZzBX;AxujLd@LRVS#70HcuZSI;<0YkShW*ok) z^Is#}yHA9(s0ZZIgWJnlhB|4|UtZ;Iq1DyAxg!W&oR4~#69)GYGn`Hux(WVCLvO8^ z2$sb+@_{6X{5RQ>rP}(o;!*WWFUzd{v@j$_U`E=_2Kw^5x-=0%VGR8kez+xmv&=ZAD>}W&qq|2K z$Y%X;x9|nzn)GI`MZa12cJMj}+6=7itoQ^R5J8BvYG4s9m!&7JzJ}%Q)*eL~3)T~u zxQ{VS1}NLWB0+jdeyQ=3u?+FY9C$VH-n5*C)Ex;B? z$H}Pu1j2j3x9t9NXv;!Gj(rS#_W(Ed0FR){A268`(e^S_$p5C@=r~Z%v=LCl+Y5&z z|00;29c2tXiUykqPENz8-*tag|GxRO`FKWd&Z>CloM7YXk!WzybIF|4bP;(W*mXPJ zQ9g$RlvH`$Cn9feq!lvuzJk4y8RDi{8Nfy`pmz zP8*s)jxHV&>Z^!B4q+GG9`oYesricJ-7Z!__9%b+2_`+tFCC76=jY0%lXxG_t?3s? z{V%2*ykYWX%|ikkE{O^Fy=gt0_ERgP@!r8^rjmN7g0BQ&nqx#K0O)TgAPq z+iu|s1&acHax|mTIMJ1JORXbJD+%p-uClg+W}W5Q-TjS3TW@2DoR6CC+C&m?PF00GYaJF@CC)q~6kSI{*L7NvH!W@b#v^o+ zI2i1PlE(MH=GcsGpRnfL+KE*ervyjiPsSv{`A1j#8Fjzg1dLI}6zt{y4ODGL0%X)rK9Q^=wrZ2nv&D*R8}Ug<$Bn-E1#uFkP9A zR788+02d1Z!Ztg`@IoQOY};+-dR{VJdFH*&FYkrsPrIkfd_FcNyXz+*m27G6FQV{j zQ}Er7_@c}h>a;seT79+#>nk6Jhp&KlsU7CM+GnVl69AhKVm`wF04yC&-8aC!wyx*y zvSz?I2S=6sBMCfT_|qhE3e9NTfb;A?-uWB|$ln9G9hlk^q(ZMQzO){X)!V;r)nU)O zmK>Bot`24@jUy8gp59SI&jQ+tz_dfwcg)bU-w2vm6WOOXI_~HL?0cn4!J@0@4LfXU z=AVSf;2BO`_U4AmlR*QGg_(KW%Nu<(2zWN^g5;lZFE*9!!{sg_vh>&JqkObv^Wl>dl3CUuE`5i5)M*EJTJ;YpTj(5r_7?t$uvq7OOw}sFXbuq71=~?sSs6YFi6J146n-M+ zk9WAW!-u3tfxy+oR_ex*gh!4VJQAgfbQ8UawuNdX>G~0}&%`7v)6@h|j>d^SN&91y zpof90>aa+%$RN%d%R#3UPb#u^bK#th&~p~x_kG&iZL?o;WvEmtZi?zoG~p@xh#7xw z6p)*ZJxShVJu7KF1Ee~~G5QYK2pmbNdBm5YjM1f@Z7BJS5!S5F&rcaKkwGg5^5 zO@2BMmCOjqYUkWCE_x(|4h(VKla>2FD7Q5p8V$ewnL!izjFY9!?}yCLH)b+=+AMv0zZw$^Voz17v9E$aDsW+U7pgLU&FtVUT7-Z*2N*ZC z)YrQK3w!lAbPHV`9dwfr;cz&l4QrZi$SFKNnS|e+3Hj>PuP7bbQ_J+fNC?uqHnfj= zUhMs2p<}Q2)6inPW?PsaBTyqd?lb zn=s7Ogw+Tg6qj;5e5>10`i)bddOQ34N0Tu&{||MeD#P?bn_3vf%i&*XS_w`1o><33 zd;2QfZ3D7h8rD=#r7XGbb4#Y+AmolVY8i&yWkvnzHc8OkF$ErF02^E3z+Pkwp>1N( z0X@USMuc}jJP1CV&GcKSW96~mpL_ub#A$xx`@+Wej-59U$OFEMRf!e&d3fl0csTEk zEP8()Ps)$y^s>Ke9WK$h z{&?=;Rq^K2OU=1zCc{Pr9kq5F-I=C?5&|#a|Bi!mda#AKRb5al($48ayW1hoYTUlr zb#dzAp47Dj1-31rcvb3;H8Yvf_41X10isuYie)_s%BQ8hIR8l6$J0)LR8aWo%6A%q zGJp_F(~A)NH0fU;O18a40At2qsJct2C!xl{35kWs`R@J*5>yClJ)k*T4&rn{ZT21( za)q~Ja&n;x**$*gjR>K9I-nLRXR+&VFVeeTrC$L9(K77ugzcS*kDFBI^9Xon$K!x; zXV73ec5#&~2rMIgglI-ZEU#483r@%INM7@@_1HOr@Dds9^r9)&Hz6x%oE)0beN#NJ zziTZopS(eC@m7X`u11~M7MT!aC>kR&2|MVPLV)}!#jIge^x5rHX>M$Gv$V;t zdVpm=awsuC0gZ{I(kmV;U2hLu-2lyvwK8rYu4ZVR+}0(4^{3DfRkAC__t5M6mS^jr z#S;+5gt$dR+lvsweq?5!ux*SYg^;IGujld5a{%7SpVS&Qq0& zp;#E;HN2fhif7E#_*1Y+#Wnm>JB-QYvwChcp*`5m@T|*~k{6V6)D^lSksWPR+(Rz1 z%@HwddOE<|G}nhHw^7N7*LxZQ@o1UPmC`A%#<}=~{S2OBqnz*=iQ(+YT7P*nJFIjv zNT(F1XX8K_V|Pf*V8MPoNSTIojr_tPKZ6}6FqmFP;g)jKoV_M-vh=cGpzB zDX^RW1^yJANfIDI{iac$K2T;K(mfL+rJahV9RwV99UzNH*rlg8ZGd;$VU&$3l@H~sSGZ_i`ErLZ&^KEXDIBQxW zkTBCC(r|IO02Zt$O97ZQ@`)^a#`~9-IiGnh{f2IDy}g9Vey8~jVO3s<_+Qtx57e4o ze$c)mdA6c%y=_$OyN(y{5WWnH6)qQWG2wmn<8>93{kq<3XxvydAtrzLHyC$-N8 z;q}@_BIozjarX$JDo2b)UMrS6Y|>>GF1x-T%DCkRhCkWbdx11Zq z4tR#n%!Jdh_*4;*LX12V4(Te3QWRq1H*Ouc6BgUzU!&E|bKV1+1#FxHy@p6^55Kmp zg%cS8Z&BdH6j0Iu_I{|%1Hck7Y*#*lK*9}<6KJ_HBQ0=!LzTcod=akSi~$(E3%7%s@53etCImJ8S&%rh(uP zEelq>1+OG_+u;h1A`}zAXo{2r0JI9fdW%b*_W_6R=}u=rvTo5rH$5oXIvFzn-UKbk zwot*XNMGg2s92>JrAD}?a78Zxea0<=SB~@U3gc_uI<>jE(T&9g2(QBc5c{zFK z^Y1@*^Uo_9^O44v77-=Av-8Wv2m_*_6z4z>GUUnYZ1BZhc{45bn0VtV`ozVVCsXa7 zQN{*AASRA;uk&fRd%sB0NR|uqv%LR4dAf-3M$cYR=g|XrC~eddo_<&a$&SO~*7u*O zs42*94u)B#|Mmn_L;o}9Y(+Z7DN;xgfA+#V75qhmU+*V}CphNoG^{taVXFx#Lce)@ z8Bs!N6NDL8R9gxUe9!OoL#O$7@FX>gk6_^L!S9jn3Hc9ZOI0o1n;t*WP!PGCi@(^! z7;WP)qtM54w-~*fVT89w>UVcb{LW#I8Pd6M7&FnHtw*@!C6+bLTao;x5`Qrf2Qii5 zjNgb51}whcXYwO1Bq|y(cmuUn?6u#NsN(Fm^sg0QrM&1F=g0sz)fpNMBSjxZ9sURH zSHY$qYhqprg5jWHZIzFCLvL3Z7%y3>&Km1CMih|}#;_pb^muRoMcuY>1#OwRj{Q9J z6}bt;wOaP-YDm;qoAqcU*ca)Kn>9gqP#VE29~k1!r3i{;A4V*fHTHhMa52wxNt6g|N*1$nDYqwGTa;c;)y7 z&8hP?A{2Yxl-lgYSEJ-2{i;qFOJ{w_<}bLYpsG<2^&jZqU9QW(PwbM=w>gkAr5`1E z)JCAc$h+)AwU8r8Z^%Z%cP3G+)_UMnr{g#G>$2wZ@}*#|N+P9SoT3&P;pp`zg}@Ohh1zoFDYwjYv~fkP8Sp*n z@qF?8q=bN7-Qu#X?K>zg#p#iO3v@0J5-KyjnDc324(nLRDB>jmsCkcPDAmw&ayi(7Z{6JFDJ109PAVqVHuXnc0hb zRScpYj0$GWA!UTmP}7?hnBzy=5A)yZEWxaCXCklj(6@dt)Ju06kXgSg!E#ZvNvERS z!%J(;LBd;aKz#s7pw(eMk@ajkk~~o+=n?J{!6d^5@ah^KT> zY-nq!{O4pj;nu4rVcLV)7u6{-%ea&?^UUu`8nuo_Q-_NaOlD{Wj5DlyU96L7&+}7n zR9?Ky;TA&@EqE&^{jeCz8ziw%Zbajzfw5scZ0c9r)h4&OK33~`yLw`Ic6is+rEo#S zxsWqd*?6hK`FhLfK9gauKnyu~F|odxvGjYJ!|zLvQHe>3{pw10X1{y^{y0EQ1}gIp zjz#TSFKymPHK+?u*|m&r@;v`K)nXC#sz();LqGv;2dT}GqJL{wMbOgwwIaUG)7VI5 z))JCQ8R=v3wdOCw7mIRjv!jj(n>=H~EVMYHAxXP1&xeZmqQJ(`EC}L0Ps29w0tVhL z{NOWiYM7Ujk}_M~Iu;UVCUknQZo?fFDu60xjg&yXSxcC;_cPqS(;(w{ zS0e00vdI*hTYTz9P)Gxs6mZ!fzTHj=x&>0-vj6t$#wt~A>Asxpd;J(pC4t#tg7C~g z-CH4hs97B5*UVWi8FG!nV6Eo@Vo-l*sja9ukwS&d2F!%d)2Y6K8B)wT9pdxqi4x>4 zwM;|~8XLBm`G~lCSxcMJ>K%e`d~B>A)yiQKMcG{ z4;=9_Mwg3zL77;sb2|M+t!7RiVu;jFV5u3FiZK*6rhPNq-K(`@Xc}1M+1k|O z{kzY8`t<3U{j37rAp*o}>y5(c$yrj;p2&%t8Z8IS=1(~G79p^m0sBN?uphuP@tBK( z+nyRz7R)O(`z9i<<8pr~r{s==H5$12ZG7hvwH;n+E5acL6uU`6EPen{McSoB}VL2V95gp;Pxy1!^4N@Re9ZCa}{)Bxb%k)D}jyT{4*!UAPiC#+EE22{|cE9sH%V@0AWotoCmeZj# zcr8LILN1kFrtpDsj(6t>Jp#Jw8Bcu0PF2uT*B;%zy+9X&fpOGeY|`svrhaQnnXD43 zNo4!hxY)r00EGf>eV|<-v;VP~+NfdOuvdgMN|e>RIPnzMqlF-g@LCT1#Z7o; z7}f`{B3y}mLj%VJ4+ z!dc3dg;Xj2{f<|=zMUrU&%H9A?|lg(KlTzZZ#XJRlWH?epmk^2-wa_y@U{>VwT#ju zib&)((NKVZeVcMIUgm{vSBS6jblH#v1~`x#>6siu`1<6FCnHHBThnBRtiTn>N^TEsA3 z3VgQ8VTQ(82E#u7_4{`N_$~$iz1RO|n>NH$k;%RJ%zj`I&#R-bI~hH?L}CeLF}itD z6f|WKdlcTfB_x9OloBsQr-Ogfb4u6ywZ=?Yq+)WFAxYFL0_{Ooo4$qv%Uh(5VfGBc zckHx~L$?=bKK-+izjDf`?+xA~rp6qB-W#RvM#q`ai~NRy#PR2RsUwf}zxp;~DT^a*jlAbVW@KapX%rhk zvpmLvI|g`o>mGT;;*&3lR3aLT@^CcKgXTu3h6;KKjw)%#4b`Rh#T!|8IPP2jd|iq1bOnU`6(NHkKEd^~6ZGZ3h&)t>jCj z>!h*$ZQh=MMjG%DQAuRap($^6hd64Cjw>E<_uPYq?0>=oFZXmV504hHzQFwSS(-)m zq*iHg)K;e)ShaRoR$Gl@7|9pN@{6BBkx$zo4?qE|2!L+~SHeCjYAx4>R4!0%jJdqJ zVPtVRCsO4lCpf}bB9N8JV+8~&#g!HBfBc>^yc!RN#nZ)w0Q7P!;9;XLD+}thmoNFW zrJeG|;fdBfAGa?Et{HM^#=3RsktKWDQ)-l$5D>i$M+o1%VzrW=l2RVi2C0hMQZl$0SlIX5zI2~tPwnCI+gk3B&$>_gTwU_cK5dz`yqNYF);&>TL23 z#M$DU1KDRHm`}#t2o4hX1;#D+~IXA(Kj7Wl5VIpWIq>_xw4$`|~@VM1V(7aGV`QTa0}=6jzsdtz061iXI!GWi^~4^aWe+P$!em1bn0( zL40*D8LdZ3hMix!S)9|9Xu-f>7v6$;tmJj}>6on3Ys#~Mw;1;v8TFtsCGvU-J?nia znMmGe@AZql*_LH~pA!>f<2)D9Z0!<(fI-yE2D|=X_`hTt*C8#IqG}z3vvBqWb;^vc z^>$Gn{rzW<-k5iPyMv7b4GjUJ6);3>SzwH)s8^5H@OkGqU`T}TZ_lIg*gk!Jn~jdC zr=Ov>?Kt&;EoQs~=?%jJ6DyAy`J&xyP?^^$WyAuc-Ga`oS)Gqo9J3#@KEJhJseHu& z_w%pGK61t1O*6h~-n++5@A-i_Y;}#Y%1SVoF$PsN=^kK;?f?;_q z>)BjxWLC&o+&-s)NgK-*;#$k6J}Dz<59UJkJ?C=1#*4@Lj7@9^2HX0nqf z{x~iMJ{o(<7 z2@{H<8HPgoD7#AM%;ML|f!l~8xttR_lAnA63(Sg_supvTIn6*x0rFfjG?Ia?8_*RK zDuL*7)BmQs%J47`kdX~^$Q-4|{?3U1`|Yw!-K-o@YQJi@K$IpCLqV+E(HkT^+a{!V zcu}J4OE>w8WacWpBcaqtoy}j{#3Y;0M}C5|{F4+S1?^0K*!_XAwAAng>4vYZ%?XM5 z@8Q+3YX-Y^0v29C9LQ=_eK)Pe$9^I)hE1yX_R|Fq78m+e78-J!FrDSt?(XiivIxLT z?_N6o4|DGZk# zI+DS_$kh<%^0UAYHDRv2gg>vC3**x`3P_3W>u+)|Yr{Du&P}eDES%~D7HX{NOyEkN ze+?Qsf79Ka=dj%Qf_WAsx5z75-}eT&=wLB(o*S3nIDbt6r#Ac2tHVf2Rj!Js(GHyt z-fBio&)xxDEV*oJ-^H){MM;bDFT4t8+ti^L&I;VuK=3vFu^Cm-etnHytP<`$*tJU# z#30~wgH!PCUB2v^%hvk$M-SN61i$3nJCo4~>Boy3+79bu|mA&1>F{MIdVC!PX&mZuOCuxESis;Fa2s?J_N_plLKC{wIQ zlJvRbUCLyp;z|IVz;xN8h^z=VZ>7-);NW@$;u6k#LzIVu|`7N#C|N$lt(ubp^=EX|B(cz42r-hLZG71+z2 zZV}O7r^FT$Y57}#9&2majW;tpmRqNZvuhFau0kYiMb5H5h~JJoWnXXW*S1x|qM6*Q zQTA?4;_q7#r019kP?&SI$uG$CcN3aIhNZi^c!N|pd-RVMAol*7LTbt*Q8C?{**EuB zr9JZkE=h3$EJPyiI)zqvP0LPm0z_>uWu~V-(j2TIjXSE)@54YuE#1y(5On>BoizEe z8E;}Z=QEilxKtucC`ae{7^sx;gqP;$`R29IL~dQQwddv=tgQ?FS4a~Yb?y9PAJwJR zrhNeg%fUzeS@@ZgeL9uKGg?IBR4=~%u_q}&KO?ZzIL6WR)UzMeWo%)J2BL`NAy7S| zF}&~YZVLnM-ARXq25U6Pha+{Rb&!)BZ@c{4m@Tm3l$CX78=JMFeXYYg;C5k-QXQKv zU^^ny5E4{FUYYkHO6iuF1|_v%hT6J*d|dR@%~NT#0NAkHgTS-^z>EOg%zeCAqj4nQ zv5Pr&Mg!Da9jIi>T3S57A~==aa+~&wdM;O!1wlF;=e=PZRGH?efJ5Es$q<=8>O$)O|e6)MLtOye=Ou;(6QiCy-gwX`{4E zBeY@ct5WXAp^>l5IBZm0=x_c?!#t}$$r7mQ=sZs)5`zey4O6j!)MjAHmU+rbks_|C zJAYNvag+)Bn6;i6@)nNlBnKKRY{9DL&CX4#JGDhm72{YP z=?_3WsxxI(@dh%QHYeOe(*!_u1D9sivVJK6HBmeWKoi-ckHu3bT$u zQ~R2)(EU$`)k;$c{@vHpqcJvIh89Uh)wkD~Q~_SHw3oCo7aK)K%KWh<&tOk?GJ}tJ z&da?%LB9Y%nE;K2g@YJrkbxC&0uAmXIK~ub`2Rzm#?iJ)#WJf>1DM{!F!wU}xnh8Q zvQVE%GA!iySpX4WA*}cuo1ABz*fp(G<_Jlo6hkbx_YOwpNdyBBV#Rb&(^~1j9krOU zXicq9#S+?|lA^(h8i2=)^WqB!HL;WLe?gs{IhfQ!-{$H158r-92of%kRhLk~R0 z8so{;FY>iI{rsuWC+1qMH(4P9p@`pY3zl(aF+N7VWFozH@(T?06kp>`%do*!tPhat z!CPR9m2{CgDs{oRd*cUij?6X)s)u$UzQ&19UnJ4UgBqZ8mN?(ze_&5SVF{x+`p|I& z=s)EGXcC3ai8U_>nE6paqC?VnzN#dV+hs5@7&7M=01{f2o3s?qJ31Uk{JIZ!2npA_EDvxq-kImlzAEN<~3`Ip@YwU}b=-W6rgtXb|8jzvF8PqUr z1mM5b6UCm)LcIHevI9v)x43;8lABz_#xJVq{(5Vf$yDFI$A0OtJ__hYhz0pm4KZdo zXooU1h4e^B_4*dXc(tekB2par%k7t0XmdGAJc!tz1a(csm(aGk$P&nSm_L~24=NB0 zh^EWuV)a-vm1s;O8jn7`8#1!>3*WTxLDiFY;SJ=Vp@o0Jp5Sn)3ur6Pnweb(?o8sR z$(XRbiE~6er;U~sJ6k(^F1NLFd;Lx!LqI0*z@FnwCJrj6et2gc{HJV^3zW0qE;)y* zVqeBd6GTqq7zRJCmiO=ofsY}h@GjFtY1W<0NuPX`3Rj0r)Ng5%RfTYCWVNXr0~&-V4PPC;qyX;4Q31%cJbl$5=CQs0!&b+ zkxatEuTqU68n5_WSrwEk^a#QD=XnCZK49Nm|Q(P*G*^aSNuUT$u;lh}X;`~1Om za^W6jJO=~X7sra(%dp`I0mkQqV-d|tT0qX?sT!;)huo0QieI*{He6yJDYAdAsTTe=DezWrZW;fPzZlHcdEnTb$^Sw;U4;6bii&Fi9=WpS1)6`G!nW zMc>POo67Z=XciPGyt~CCBIGP;FkhNE!=hKM7P;CtE^J`6$r0GVY?H!fuH(z_k;l)6 zHzKuy8UG_eE=@iPW3D6O9sw9Af{kCghb+2sJTyF8&HVTQi?&E5Gm)yT3^NWzoCLRS#zThU+Do28uJk6*q| zF5)oyDe+7e7sK0$>zoN>Dxd&#Q2cOiFDv?+sg*rXVzajh*P0dj7NbsXV-n`{FUzb`WzVXYq@BLGWEh7+8R z(VV1M@U?6<9a;n(_Ln`ihTF1w{*aFF%AitdWFj*O^A+p>(`eFK`d6LDV02rIjTqsb znlka_TE7>HiZkR)Ddwt!E>~rrL68mO@!Gu}LHUPf@W8kQq{$D1Udjm}Y@^(jBMHvm zeue6K3~fON3*#HXHhTNlA2q!TCm68+^mRvA2K#u$7GJ8W@7_QC#;$i;E7t6@Z7b8? zn?;m3+|T+#ysp%?F-2+!nbeE)S5e-u5~S-li_@2TR;X4^$qq1q%{Ya0CAi(d9;^l8 zI~680ASq#bO(Q^F!r5XNHM~KHkKg6QFhJU6MH?K5Gv$Z+=n=!#f4s)lc$CDK&p$Sv8Z*7P1`kO|2l9%b zOcei>A&J$e=7o>kRUTm~Qa&<@z7H~a9rMx=>QP%V@{z7W?dL7`ZQH7f z#XB1GV=4Urc*8-mE80Lep3OpGeKbP!b6*<3Ltp61FABhx?9ICELHQ2An?#(Ud&YS1 z&jk!;s?WJ@%{P7W@bGAcL6YiP7LCnfvZ$sY%%Ea^DER>@b;pzC|*HZyHJ+ubZ6=e3}H2{ zpafDBV)y+8l|;F~j}OoyXZm`?-+n`V@P&rfs(Pax=xhTB3_c2z0N|CFpxg>ggK zSI#?=#YI~!NV?t|8#bB^PhJkGmxKzyrA?CR#m;LfznKt({Ci}X2ARpOC% ztg{gs6FfF-U7quDBhQm)26ZPeKgqC0(uBTIk_K>6$qqBX&(1K$*_kLfK&_f{{ ze;f^uB7=05TJQAM82f(6-+1gSoZ)*P-_uHh;m|V?0K8z6j?F2G2bfMQxm2HAZ2mAM zWkTTcdKm``Lt(t(_y*UyZ&DoqgZZIc@lHoJO!qUI~>n?hf$(vYg1bi?Qh`cax|){ zD^n!iHOuQUtdKJ(VFRkAGD%yl=xf ze*96zy{X9dF8$!ZdrqJxp@$&sF_yNw)A4lCncl7Y!Gv7r$H2~9R%eEV&al=iQN%1rUBQ5~+5^!160D1o-~Ru*{fMl7 z`*1+Wk*8v;ZV~|ksS}v1`iI48udcex%6PpWc&v2Rdx`q@oig{X z4w#7g50JKuuA`IKLo4@l2+%c1Tt<=Ng%{~~kxl=J*HNru(b?GB5hFmV(We6#&qWcG z3}wq@qI|a3U$f3Xj&;P0o?R>*sJb`=bP3bhc^vg1pFUjWm4u%KG$Nqc~_Z3v#6QnDQ z`xEI-KNxXl?naE|$SB)u919kpg@9`H1k%!LCJsdGm#pUsrzm8+XfqQGAN zfj#Ds9|fbcy*})WrC$cD={aCF5b=@j3YzCBz(SgqGEz0c1Wc_25;nTthXO@}5hj@M z)<-|fx0(jfyQ;wV3EXuH*vgjc@2x%w<(E;=!6 z6e;;^VUi6l7dtBcqeLQ5{mBTI*05eh?(gM;6?y;csiS{VR3&plXUc{N!b^d&4{b)0 zW2jQ?Kv@WFI&pj3diBZpHE>Kl|M>{~eU1Ly2cCTT8Uf5SJ9AR8R?LUJ*YNhaPupYa zv~aK&;JeOE_OHwV6K26&HO&0F*j^GEyF=}*gFxfUc=m^{9D@)cmoiB(-c7?|FECMc z43BzlSMh{^mx|=N%BUr3Vorwn?=y~`+DJgMUMs~)qCM6w5Ymn%C6^#2IwHLbN?@lU zg()4&GFl+6+S^b(t^vtFPWS(ibcmSVtGNDC&hZbd&l;2?+kl0PlkkJ=a-|2FLPr=^ zey>TZJa1RZl@Li$S1zQ_&*HS%j9@%sXW!ZZ64aCkwS1eW0dZM**W2ihvrI;tfiIV3 z68unJ%S~1)Br%n!C|;X{at`K>Ov^orN2;nY_}CSm#;m%0X_Pwp+rr9BoT)9jlZt_1 zuFBpRxG>7OQU4c-ay;3NU!;0{5%Rpx$&x)VazXMGG#i-90~vFJ(I#yUe-i*Txik{Y zFK6B&e26sf%@OZ}K{K_wntBy;M4nPXMAXZmI?1KCJbMS%^@V#K@f^{hOkMSEy4d4t zR)#;>H@0F%Zmu&Q(VTlk&3u`M10*u_Gx)PQO<0^WOac;sUdtr#-evD*o1QG5ffQ)17~PKpyt3w9DF(b z;_GD?UnUrnXrXV8lpSY0a^lzVvG*mNenO|3HW86Ijk3TgS5-3f8JfsoEbQC#1}_VX zueqsPh%Xl>)ixh1yg3#gH9~F>`K&|DX;$!*nAOSeq3JrR)h9tY6v#KTQ}osl@*oGL zwXv@6`PZ?-Mx;m}t>IY{Cy4Kr+Wob7+)6v#3{Mx4maB&NLnS_*+g6n)+<`k`!r~b& z?ys)FSO@`Jb7j)OmAh7w*YwuOmAhwywfpoI%6SX~LkB+IARN9ShHwA!LrW;uE>&_b zr3z)`g0o2r{Mp*Ysu|?n#PkqU-M{FRwjBB&LhQR8us8p0ZiGRz$ReSX3QI`8U{+rJ zkdR(YjnW^PExpX{O9zv{M`)@r2qYE+>YGHGAQwV*Nr(W1YO)6&h$13@xrH>7KYz~w zqm-KQ2?0}$9TwGsa{-jkb?D5X<#QEKJ}2Q7>oC3m8HFyZZqL_mqy6i49QO#E^ua#U z*L~(LNv*YZZRdHn9xhW*%zO50NrQ7_P>twsFLk5@vehBpz z9@|LL1NBi;a)v>;bd)c~yZ377i6J7fP(%o(Qk?-+UU%0Z-XEVJcHk#Hv~J)KBq^7D z8{^&Z3X_fsv*`8n&NFS>tGCE|UZ19PA3#Q(Z--xAi=s8Hh8wDgv46DBo%FwBaK0gL z1R;8D_8~BQ@E|8VtQUMnO{1;&Qe7MTQLHyP4e|Ud1N(R<^`8mu#LA$ldo^D(qLLwr z&$sr1fr+vh;@8S3(iLUhatz_@tX$Q3R++W7ahY|BLHPdNla^6phBFJp-kZoj<7>Vr z7yYu7-S7T2RP93`iXMpci|tEDEI+7Dh+q1WgFMXl{O!Fq$~YodB}BX0A*;cQ7x$4j zLwoz})W&gwK!eqSU?|l}jA)09;(^{;PAP$r;E3P0>`+pb#sqNC7_KsmCiz48#5vF@ z0*68C`;8FGUn=$D6-k;XIvNIQYOU%tcT**ojgMjJ;4S*>v{v-6MP-3$ehk!I#tC=l z{(5ym0+D)s{-WfK$nlDNpG}@5OSLCA{a(gvW7P>~13AE5Of>tp_$V>6#ce7iZVx^> zuRBDN#-)2@PL2LfSs7XLfAx6tma|uUQpHxi%K!pW(B43e6zK;uP_``CsHS?Qy`CI+ zWN8U49lRlk`;m*VX{Z59Sp69ca+_isjIDewfJ{Ul_usR`5s91<)mKvR^qOBap290z z7Q5a4*DP_{CV&CvO+>gcHb4Cn5Qecaal8P(D?}-CTh-vz5{Tt5aO1GNJyEEl^isQ? z*DSD@X9iOA1)B*&iFYz<$BJ=7kz%nxg}r9_Bmkcs9vQ9RIj9hf?kFdSw@G2<)7YfD zNg5aAeuR54J$f2NpEL1WXPEq|Zm3aHJX?Oyk6m?IZlDw-h)}Wtk zzZhr&PpP>-JyoUa#UU|T@m1popo!Vzc0d15lF9v@mK|5T^d}HVknegLB;PKOR?dX= zDdgMO>&n39`SR>(wX%6J&^q7)Q5<)=#tgE3o%&MJMNti-3OjNyrCRDL?=WuJ#e?ynrxD{83aU*m?mMUUAU zp8*a16fu43F+KuQES+Y={5ax`l^l68Vyz>r^TNFnpM@keE2r45n{B+-V^gs|U9!HZ z=|nOLB+_)6)um}BK}r3n?M4<6NW3&jI4gt-5w>b}dbu2?!cv5KSPh(^ys_?#r<;75K7=;Ih@It zt{XY%>-EV|zqv>XXu$+V1w=+DQB1L^+0a@#ZymuGEYrn zC&uPAX&ES{Xxv+eir#6|*({WYq5J6q1t*yA!oNJNoIihn1o@@|#(I|MFybP@B0M#+ zwt7iJov#%;&rV83EKU}-xp_X-34#2!sP=mATWjBz=3hXyNgcca6a268Y0u5(!PvzOHTaw4=#5OM@){BUvKS>w!5*PufTJL^g z?R7O};r!@D#21@;`DX-E2;b>%Fpuz{h4|Knf}Z^yFk5`>5Qgi;zpqUsf0fG}1wZv^ z(=#41Nx^OO)%Vr&lgaca@^ZY|$#&00vphkhaD38`-@5g5T;RARMABr(K*P#^*_uLM4&?6(3z+?9J<* zWf;<>#2?a??ca(1oOk-aBsXVQ#``+*Go{1Pmr<=%2s)R{Dw_7aY%I1YuU|+g3VtNj zWBOcp{GjElHXd-$H|cyU{P9&L)4BSr$M;4{ zP7Q}1$%tP)!KQz*C$F3BDn%fld=3#8eys=utIcsBl#tk>!g)Mr0F*L2c>sq;W5 zf`uOl)WjqenU|Ptt#2_I&8F>nR-$ZlJW4_nyO*BbCrm7VpL2XqPbo$MMUH~1)`BLV zIc5AHHJSrz8PAuLGt-Y5Jzkgm_*c8cce23>Gs8<+Ba90N@?>V!S9}YxUXv@R?iS(D z&LYyz+me{H2~01UU%~h1!>6_)+Y8>ODqVjWPG);6vcmnBoZ_42gTIF;l%-u_k_X|z zAW#IwcY0fcdFcj|16E=d{$^tlt z8F=5uVzBXkkUW$#V8Vrd=L1;pYN4BIZ^=}@Y1dFaeqPdLA+Q> z)Qhl=<%bjmXFlEgObLm!f4+6zqra7jl39`FhYR_~4XIW6Vok1iBeMzU+UQ^SxO9@) z<1`*WhN(ShC%C&TyyLb%ApdVpOT6C`B%_Y(u~RiHg94K)aK>u$PVJP|a6^Q{=S^aa zsNw{1m_(Y%wLA+yDbmbF92`^upcORl3}sb`Aw9ZqP_K)h)9AR9Sw2t~(~Ekcr&k^R z=q>Qq#Kv=ntHfaZb>8;>j`Pnn^tBhw!P?zuIyRhj13jd*JTF#&+`-Oo(f&W2m|C*m z))$6{xNm&~W-Jp;yf7i&isMf&6?w8By;$-+ciRI}NIuOxbDolYp_D_sjY~@Bp zsqFmf{EiZ*6+qMgx30ShCOv(po4cJEYm4dC1j>D4mP3s+2|M$NFXzu^R#AgL!iA^! zeX8+(R9m4%N-fs-dgn3550T{Cl^>7e@Cc>75#T<1pnfZLwFLsoMw5KKL3)ZA(fA|8 z4<{2<>c;PFWHGU=cuhqp;xB!%j9-lFJL^l9_qe^b^INvL6=%V>J-(?8<3u6m5Bo*j z;Qnhc!kzm#nao|mWp0$O)d~U^0|@RyAY~-LVVIqrBuUxY+FGO6=I7$%1X>DaW<9pz ztr{$52d)=e!h(|nWCfKH;c{g+&TFMfns5h(b3CrcCcMw04Xbk1nPMmr4-uxZUnGRY z$(fX6I`R>xce|6N=VX6A(?k;FW?-L8yTW^*xr&!dOpzRe@-DWdV9>of?%-omTy;u% zoN|+LcXVQR&S_7Xy$fISTUIPdE`^GB9`R{cv8e2-zZAaO)+RA6zW;7mq$QQR!4fX# z!R;{4r@5*bTT{4|2m|?9k-%l&USgoHp9*vch16XF9*3P?9$Wbcpr3e+lck5p4VWWr z^r?$aMjDe#dg!a!$Dga8zB`L>iQ8X)LL-h;*|FNTnz78=ZLQ6$s9k^0;I-rTouQ_k ze3d9Zt*h#7c;zO?mDr9IDrR*7F~9ro>v2yWxjhb>J=f)sy_->}gc1y4+p)p0G_@9U z*jar&nw?-nz!r4ml_k_e5S+6}ZO*UW_a(9+wgP)aWHGJQJek6_o;;khk0-GUQtMGI zy14$cTIl^Ob&I%~&6d_M-=iV|$SL=nV0lrI?afli+MLVUP`V`Wd-NSC%x|}x7b7(V z&G_lM@0e>}9fWw*wn%T@!0t|09f1fk3(BAXBKyaigj3j#3>C!VY_&D&Y-nw>U*=|% zr7%E`pVq`j4e_p{B}6U}3#n&kJqERgg@uK|!9iK7k>vVFpCtif3^X)KHh0DLRJ?*H0H$3;EJt>)|W= z&wzh~)QGFn^%D4nX5zNcy)^|tJxXuW3V8~tMh5o*ynbw<)_@~Bg)?%LH8Q^adg#Zb z9mt3X{&Vk%t0K|{bHi1ClY?Dqbx*v^32Q3Z{x1{<6mW{i$M6Y-r8jW$-0Tg!Yw6R_DewsbP4OOY1j&dN5$&=GahQfAjCH_m=r$yX&k6&l6R zV&)wXj4=wPLi3UvwmWt1myoldGPy z`ZGQyCCT)mzM5(`^ZauZuR9g(q??_&+wD~WuhOcjsw4i2Pg2-Ub{hj-n-;}C#0e=) zR}UHk2J_Y+I^mC7!1rOMT$Lz?tw7eR`XrS82oa)-?%OK+p3dyBq4Ac0gUyeRp#-#A$s zc|0uB+bgEd4T)Gm#7Qa_;)|!ljcZlX#xQZU00G zNnwePs?S49>Ifwlo|CI%`+%QKs^@UpGD zqaB96Vtm&lbi zpZ*9zK~2}H%QOG9Id8Ql3L1+Vr|F`-N{SEjF(_dJKAVtX#<^{zCwcCF*yWYXZp$V= zYL&`XRiz|HqwZCq;4(6tiKqE(_R7>;`PW%%KgC*V_QZq*>t3btghM{Q)Kc@V|HJi& zey>~LQM|l5y;0FyxjY8cZDNx#c|yUx>bQT@Mb)7cwAT2iv5N+Nnb`+ zeDW~hfzG9JF=xz1WR2o?XO%67pvazvI!RzAK;Cd_C>w0c{#OqR^;rt@}dhTmT2(;~Y zaIjj?@8#N<04BtS_47h%3p;+Z-izL-lw14n+hnRzBopWI%<^6$_86fNIdSo*Lve~< zV~2emiA!>1-mK+YzVFEBuH}N+kaC0q%}Jgian(E(5%bF)1H~ld3VU7Ash158cYqFM zK>gvvhcW^uBOHiJ+ihP833y?&ljN^yV&puq}RKBIUa z1sxjsng~U^0cYplY-%U(0ftD7yjHwj?enxFJ)`8l&lMHeXz(n07B4a>dl!Ds$ohx} zxRAbFugb$u=rB0D#X|NExxF%8j}Mr;xta609XVcT@dx7@0m#CA>PutkQ>vR*M_Y}Z zLBvqfDcI!9XU;WM%29$rx-p)4WlnO(UQb%Ep=@(XnugRgGgOA9E3NjKj;6CzmWMlO zhx!Y3SgGdQ;{1`)W%;s?0WK|a1Ff|$zRjKvBlEO@;PzEjh)Zsn(@tsR4gFN<6J1d< zJ6>Iqm+-;SdI(%EcTFsATWiy>!a6^Sj@n5Ru6b>|o1!!%yo2u=1fj##Kems7C0N_B z?94K9Zj7M}2I9I1tY2jaz&BR_Tu0YDdm7aara%q+2b|Xklv@px1?LR2S-A|}EWb@U znn5~^bZz($6ci*QaB~b=T7zNH$iL)dd3a`aG*!bnbKIz0{FR*<6DHx$?4_pS@s-rH z9lNXnbS{~JpuSnKi2+UC%94`-CPhR+2?-A7Ha@?EHSe<}*GO7=C7ebU^G9c;ztJ}C|>=4c%!j= zow>i;m9j=Z#%HKDIZP);+6q_4`8hb;$oPWdV8Cq+Us|6~)MkOY^Im;yzn9%wUyDCV zO-;J;DaefQ6a)tiXD@I@4HIR^wxeljkQ`jtu^c_${s_w|$RnefK@a`LemFR?%|EHi zZ8P$u(Bb$6^x@ADHPy$FW?ZE>9f|E>!|ney4WAVkgsU=?Z$Q8@J94^ksY~QBwlxr$ zPFNRDJza#&uyw^KxihU+b-iUiUVnAiy;h)gv%cC3Ui4O9rLf~XMLFZ?Owc>TCN+$8L+=dP3IZ@@u z%{L-uMHu69dsW3w*o4kJNAJ(7ZVzjo+^(DnQO$81>sqN$QLgt`Y+aD0a@icYkl$!2V_Pd~?)mgvMaSjc zE|ARE1f(fh?;~t%j@NIVnmWD_-lbF8k)zEX6d$W1V{TLO^r`QXpRq5|xb5xgs*wJU zOGc6sDr>Tv9_@MA^rZUgolTJyUkna6Il%I1tlCxYn2pm%6;0b2zruQXkfRm3Wm7C& z`Zy%&Nf9%H4LEp2lb8ojNiy!NyU|>2n1=VHNs}6VGiMMNqa~o@81PfSj%(Ij65JXe- z%!I1eMKxQw7kc?pV7*D9g|d86-1{_ss-2q=$*L@ zVie1?qHw>VQU`wUf(Xr;{`iQ|4Sz3kujnkDVd8AGF>iJs6UUs4YEEun!`W;uufX~{ zJ1R`qmET3$1$hzOhIfv?JE;tN#Km7EU>}c?0IVudaN)K_gW@`pT!P`6jeYt$tkA*~$!ch-TUa9O*-m!QzLGqWi$Q(-@>6f3ww)7==oE(}P z4Ndzrmb_CrMDm}keDRn{^1jupm0ERSa0%ugvA*Myd->LMm3p$TD{(<-ZK)g248(@7FWWL8fsl<_M=>$tv=W+{j&?l zf{M+xYr(FYB`+>X&*#{8WLOE#dBwd2t`I21GEz7F^!c+xY>2^<+EV-yTUFX97Ei0O zx~EW%WDMGuTnTyt$8@VJmzZ~c+rvLxQijO-zW>mpoT`4Yy<=asyz{g3Ic-pc4`t?= zWYlK)za_W4dR^&r(L?De4HDjfI%zAGiYaqW`5jrEzDiNGrD6IqZ#q67+^o%$(gKS7 zmyC@=>Yom+8xNq#RgeoT~u; zYTKr8$x=UBZjL5pjIV&<;^CrxU#?{R#u1KXP?2s$d`9miA#8Vp@}A@pr&^82%eD3; zBOjcn(;7CWNOk2QvoogNT6>002lZDWp-x$!L+?GgI2BG)>!|n z$Jxlh!1?)kYisNJde(%II89vtx1OjJLbRfAgPCx~Jq9?_UaP_O85bx?H}h_WdjpKH zBW5_=7PyB`qiifWAm2QJqNfX+Bh?s_*|^dCGY!T4Qnlf?eV0Gf_Jqp=KRJ@-E;w3S zrkfqoz4;R1!}f6I=e)zCcshr@zPHgx$F5+9+bJ6I)BRre{s5#0QH2`WQUt9Oe?X8N zSzHeNS7sGp9JMu$^iW7E%0X)KEMMpL+=Pf&~4@@73j|lV|Ou z1C{+`|tQeFU!F17$Mvc>q6Hi@hEk`TrPwJSR1BDjwT)=W6d1!^)9K8J>5v z_MFL@Om%1_Pa?;RVVNxdTbhP)P~VwQ)a2s@n{zO}2}8KS_3mZ^IBkgedHMN0!Kh(b zDli}>{4wc<8o4E|>Dn3F%cs7VQ~Kd!xgRUyU5TFd&H9wS;EZ$OAnOrF2o)iZ#lCJ= zDiJqi5(&c|*k2iwmtt|*d?*HjIeMt(WtwY<>!>14ii2lt5sJ`a8oOUX2BCjpsKFK{ zA>Rf|)MoYAzQ<&YimfnOM#OlAnU+;%E?+a?siykAb1Br==<6?Cb`bYB9QA==BA^5? zHaU z*RZ{0D7P&Y49akWGpd1k{;hd|(d~HMTu2BCET27lMnsg~v%jM&(R={^T)1?c(un(m z6ur2+kN9%@9JVt0TR_}w)ZcnIXmJwq+bzGr;kIJToFOkOIdX(EZCO9naZ=ATS0fm0 z9~_Ch^P_(a62~8#YLn}UGyP0%P4#{9ko+wZDf86H?f&KwjQ?+>^yqhfjq_a3nn0EP z8oz{6JiUaJBeILUPe$JkFpfi>UeN36};bq;mni=1X*RIwB8>a?}Jb2pp5Cm za^rjrPdCGrDN1QVWZ$q%=>&#Iehu}l{i2_I-_rnVgX>3ur5~IC5<78B>iFT#>vQ=M zB;yK(9x0`9N4s+I;#LZTv9Qut;90=N$-B`2!Jcpp&#!J)%P+2+*bE=w#YZSZq5|ni zzZ2tE4y~1y>m3(cpQE7#`3TyBiOa(%`~#XDAH%W?C{$MgUG=*v1K-drHM~j~(1ba0 zft4hf+7okm1f;gUwry2MzPt@6l7vQ1{C<$|7cNsEq#i5d_+8O~!QW#>j8 zQB1or?R{ehh$BS@mt?A5slBY+8UMJ|fi*TH=zaie+Cn{G`p{|d?^18~yIT)?@u)Pe zrXplxuiQdxYK&Z;m-b@$t%dLW0&_=aGRlkU)t0CEDw?^GKjRa__qp`4XRv_{5#vi* z%2BXV`NXJ|kd*!A-ajuJd%hHghl!o{dK5UVmloTm)YXL@Kyos@(oOl~Nk@A-=x7yJ zxL0kSg#BleN;qFJogRC2GD^aM^6MU_srZyT&EJW$ammT2yh0ozyLse68?HK$}XpGEP&?(1rBA6<@Zr2yCM z?frUk|Ea~KH_=o7mVQFMxc9qNUhen74h+x+FXa0ivIn-4JR7%!7_N^?1#3v{gxoLM zk)4aUYzpAh&f{0lQNUKl)Eb!+I6z{;E}Tf}SvLV#=&D zUXXgD9qF$4?0uLORdIuu#iu6+Fxmk!8oX8Ith-Hdghx-ouLAN{{Zs4 z1x$s!y4)%pr=Ob!j9>SE4s)-yb1De7iO-RaH8O7>WtraOY&>KBX)XiwG2+XY_h+yIV&*Iz}2fBy#D&;OF6@eHTZAC(brWRc~`)L0xBeLGQk0)Zkt z`ZOeOz~zpQ7kHelME7gfT@LofgBQ`(WSIbMz&p7vNy4>r@3XP1Y)?VA9ow|-+KZ;0 zU8l%?`!iLIVY<+tQ)HMWb^0t4&9^%5tySE1ZA7HD+@PQYK%AQhcAdY^Wy*qy5G;yi z-xRNoUz&xcgn!f*S0^OK)%sc$@|Z80TrSN*+Bp1iuG9)fbAJAXCw66tD!1m(dMO0q z)&M=*rpZo6m*ihA0?0GPb;KF!vcsoB_e(J6ILQkFc{~r*0?fajT+aky<$ug3mfp?p zVCswEc1XWNqCYL}3VS0#Zmg_;9vT7IP*7P|0$v{8#8Ho;&W{vIPV&qlpP-?vca=LP zKEr6yz$xoKRakS~#U3g3kRJxsn&&#-*f$ZhCcQ0r{)V-rkIok{vo(X}4ixN?t2hXw z9z1asOA3Ov^h~S)_LdTF;>F*Db4mxk%Z*;m@4@Wv>vByUodJZL+EAYLu}0M5f5frg ze~Dw7-f_y>4Wq2kyNa6@1p6_PU5B#1

m5>nqBXRPBJR=b|ezyrl(rjViEh4@{$| zK*m+i7`>G%a)tL06buZbusXt40oO@11L_M(l4|O?DpyP)4^!I3KH6)QjG9X6iuSaU zWUtrO+&EQla*ve4Ugl-ov)a!sSuxZ8eK4!8cNu?q>p&m|DEQ?JlGW&{JTu?ScYfSF zk`m3|TSGaAcZ((vvP_Xql>QM?Oz2*Lh^(ihGry6Uc-d~>p8$YfSH8M{+u4kQkPzr^ zih+Rv8iYzI8&Rg3ft`T)Ow?9Xhmuz2$$FK=j2MEMvNN5jp(D9m?|uAoxzg$4_)b0p z%dTp&1-C;qQrdo*{m+X)`wlJw6WKqB%as*?-MjPKt6_g+skhJ4ZcLbXwDf}(3MlniDo;MY9KG6;A?9`fjcq|(9vg-w*2N_uVX}r3 zjsUzCfUscY)0(zuC43Gq6)YayG^1%w+s^QFB!=$yYIYexzXhdbD9kIAHD_jH)}(V{ z**}xKr7o0W!+$?q@I2;U5trk$$G(DLzpllwmoJ;ICvEl|1Sc7X`W_dw`^J&?Di=-- z&1C9(9A()sSQ|Pz6C}%K8rBt@LPl668^&2d%B>Xw1NjjOdWO{BUT&3jb8v8UuM}HP zdfzHobNm+ACs?nNzJUipOzAIvOc6lfU!kOR&mKcw8UM&Q;p3e`f(Eq##~5gogY#bM z2+^*zNghxAJr1TK%x=AS^%E?vMlJtR7@t<5(v#ok(P&OzngVJ#1lvpF|@1s$+N?`w;&nm-H>Jb7l#yE`C|{7Py|GCzVE`gv{%vFxsVPuJ6t zDH7+o-PaL>Q1(t;F|Wo4S`M`d`A0$vz#-*n4W9x$@XtfyXkUjsVeftz!r{jE?Pk4k zsrN%~4VbX1C*~^j=g{D(`@Qvz{j{nNdRUwJ#^F0Fz3mbL8C>0`TKTG}P`ncF>ApqJ23OE$W}hd$<ApwE&>yDnQyDB`pJFW`orA*vDd8ZTYLu~E7pl$ut-D=-j z`qr_qqu5`g?(&wh!pia)?!|UvlYcU0MGPw1@Yd@SJW>M-qTjCjRsPPf&u(3==bm{i z_~LNaBaM{a4k*V8g8jVl)#PttC(?sQGXR~OPR-pq-N>v^;y&g3kox1O{24(AlKwVA zk{9?jKR>_fQmm2E#z~|5-+cah@;8bT64m-rwo}Z|Dtp&6&F=8_YE_ UUtJJCLzj=Zh_rBlpw7qt1EaB5g#Z8m literal 0 HcmV?d00001 diff --git a/code/ryzom/tools/server/www/webtt/docs/db/webtt2.db b/code/ryzom/tools/server/www/webtt/docs/db/webtt2.db new file mode 100644 index 000000000..41089a9d0 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/docs/db/webtt2.db @@ -0,0 +1,239 @@ +-- MySQL dump 10.13 Distrib 5.1.51, for pc-linux-gnu (x86_64) +-- +-- Host: localhost Database: webtt2 +-- ------------------------------------------------------ +-- Server version 5.1.51 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `comments` +-- + +DROP TABLE IF EXISTS `comments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `comments` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `translation_id` int(10) unsigned DEFAULT NULL, + `identifier_id` int(10) unsigned DEFAULT NULL, + `user_id` int(10) unsigned DEFAULT NULL, + `comment` text, + `created` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `identifier_id` (`identifier_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `file_identifiers` +-- + +DROP TABLE IF EXISTS `file_identifiers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `file_identifiers` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `imported_translation_file_id` int(10) unsigned DEFAULT NULL, + `command` varchar(50) DEFAULT NULL, + `translation_index` int(10) unsigned DEFAULT NULL, + `identifier_id` int(10) unsigned DEFAULT NULL, + `arguments` text, + `reference_string` text, + `created` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `imported_translation_file_id` (`imported_translation_file_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `identifier_columns` +-- + +DROP TABLE IF EXISTS `identifier_columns`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `identifier_columns` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `identifier_id` int(10) unsigned DEFAULT NULL, + `column_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `reference_string` text, + `created` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `identifier_id` (`identifier_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `identifiers` +-- + +DROP TABLE IF EXISTS `identifiers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `identifiers` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `language_id` int(10) unsigned DEFAULT NULL, + `translation_file_id` int(10) unsigned DEFAULT NULL, + `translation_index` int(10) unsigned DEFAULT NULL, + `identifier` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `arguments` text, + `reference_string` text, + `context_description` text, + `translated` tinyint(1) DEFAULT '0', + `created` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `translation_file_id` (`translation_file_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `imported_translation_files` +-- + +DROP TABLE IF EXISTS `imported_translation_files`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `imported_translation_files` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `language_id` int(10) unsigned DEFAULT NULL, + `translation_file_id` int(10) unsigned DEFAULT NULL, + `filename` varchar(255) DEFAULT NULL, + `merged` tinyint(1) DEFAULT '0', + `file_last_modified_date` int(11) DEFAULT NULL, + `created` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `translation_file_id` (`translation_file_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `languages` +-- + +DROP TABLE IF EXISTS `languages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `languages` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) DEFAULT NULL, + `code` varchar(10) DEFAULT NULL, + `created` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `translation_files` +-- + +DROP TABLE IF EXISTS `translation_files`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `translation_files` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `language_id` int(10) unsigned DEFAULT NULL, + `filename_template` varchar(255) DEFAULT NULL, + `created` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `language_id` (`language_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `translations` +-- + +DROP TABLE IF EXISTS `translations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `translations` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `parent_id` int(10) unsigned DEFAULT NULL, + `identifier_id` int(10) unsigned DEFAULT NULL, + `identifier_column_id` int(10) unsigned DEFAULT NULL, + `translation_text` text, + `user_id` int(10) unsigned DEFAULT NULL, + `best` tinyint(1) DEFAULT NULL, + `translation_hash` varchar(32) DEFAULT NULL, + `created` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `best` (`best`), + KEY `identifier_column_id` (`identifier_column_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `users` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) DEFAULT NULL, + `email` varchar(200) DEFAULT NULL, + `activated` tinyint(1) DEFAULT NULL, + `username` varchar(40) DEFAULT NULL, + `password` varchar(100) DEFAULT NULL, + `role` varchar(20) DEFAULT NULL, + `confirm_hash` varchar(40) DEFAULT NULL, + `last_login` datetime DEFAULT NULL, + `created` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `users` WRITE; +/*!40000 ALTER TABLE `users` DISABLE KEYS */; + +INSERT INTO `users` VALUES (1,'Admin','',1,'admin','9ff60bfc5939c7863518e202cba4dff81da316be','admin',NULL,NULL,NULL,NULL); + +/*!40000 ALTER TABLE `users` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `votes` +-- + +DROP TABLE IF EXISTS `votes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `votes` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `translation_id` int(10) unsigned DEFAULT NULL, + `user_id` int(10) unsigned DEFAULT NULL, + `created` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;