commit 261c7948dab7d47a1d66d6400ba6ba3a5228a852 Author: Roman Pyrih Date: Mon Nov 10 15:42:50 2025 +0100 first commit diff --git a/.vscode/ftp-kr.json b/.vscode/ftp-kr.json new file mode 100644 index 0000000..78b1bc5 --- /dev/null +++ b/.vscode/ftp-kr.json @@ -0,0 +1,17 @@ +{ + "host": "kikiriki.sklep.pl", + "username": "biuro@kikiriki.sklep.pl", + "password": "0J-%@-gAzl*6#NY)", + "remotePath": "/domains/kikiriki.sklep.pl/public_html", + "protocol": "ftp", + "port": 0, + "fileNameEncoding": "utf8", + "autoUpload": true, + "autoDelete": false, + "autoDownload": false, + "ignoreRemoteModification": true, + "ignore": [ + ".git", + "/.vscode" + ] +} \ No newline at end of file diff --git a/config/.htaccess b/config/.htaccess new file mode 100644 index 0000000..3de9e40 --- /dev/null +++ b/config/.htaccess @@ -0,0 +1,10 @@ +# Apache 2.2 + + Order deny,allow + Deny from all + + +# Apache 2.4 + + Require all denied + diff --git a/config/alias.php b/config/alias.php new file mode 100644 index 0000000..e64b84a --- /dev/null +++ b/config/alias.php @@ -0,0 +1,64 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +use Symfony\Component\VarDumper\VarDumper; + +if (!function_exists('dump')) { + function dump($var) + { + foreach (func_get_args() as $var) { + VarDumper::dump($var); + } + } +} + +/** + * Sanitize data which will be injected into SQL query + * + * @param string $string SQL data which will be injected into SQL query + * @param bool $htmlOK Does data contain HTML code ? (optional) + * @return string Sanitized data + */ +function pSQL($string, $htmlOK = false) +{ + return Db::getInstance()->escape($string, $htmlOK); +} + +function bqSQL($string) +{ + return str_replace('`', '\`', pSQL($string)); +} + +function displayFatalError() +{ + $error = null; + if (function_exists('error_get_last')) { + $error = error_get_last(); + } + if ($error !== null && in_array($error['type'], array(E_ERROR, E_PARSE, E_COMPILE_ERROR))) { + echo '[PrestaShop] Fatal error in module file: '.$error['file'].':'.$error['line'].'
'.$error['message']; + } +} diff --git a/config/autoload.php b/config/autoload.php new file mode 100644 index 0000000..96d5dce --- /dev/null +++ b/config/autoload.php @@ -0,0 +1,32 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ +require_once __DIR__.'/../vendor/autoload.php'; + +define('_PS_VERSION_', AppKernel::VERSION); + +require_once _PS_CONFIG_DIR_.'alias.php'; +require_once _PS_CLASS_DIR_.'PrestaShopAutoload.php'; +spl_autoload_register(array(PrestaShopAutoload::getInstance(), 'load')); diff --git a/config/bootstrap.php b/config/bootstrap.php new file mode 100644 index 0000000..86f2665 --- /dev/null +++ b/config/bootstrap.php @@ -0,0 +1,150 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +use PrestaShop\PrestaShop\Adapter\ServiceLocator; +use PrestaShop\PrestaShop\Core\ContainerBuilder; +use Symfony\Component\Filesystem\Exception\IOException; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate; +use Symfony\Component\Yaml\Yaml; + +$container_builder = new ContainerBuilder(); +$legacyContainer = $container_builder->build(); +ServiceLocator::setServiceContainerInstance($legacyContainer); + +if (!file_exists(_PS_CACHE_DIR_)) { + @mkdir(_PS_CACHE_DIR_); + $warmer = new CacheWarmerAggregate([ + new PrestaShopBundle\Cache\LocalizationWarmer(_PS_VERSION_, 'en'), //@replace hard-coded Lang + ]); + $warmer->warmUp(_PS_CACHE_DIR_); +} + +$configDirectory = __DIR__. '/../app/config'; +$phpParametersFilepath = $configDirectory . '/parameters.php'; +$yamlParametersFilepath = $configDirectory . '/parameters.yml'; + +$filesystem = new Filesystem(); + +$exportPhpConfigFile = function ($config, $destination) use ($filesystem) { + try { + $filesystem->dumpFile($destination, 'dumpFile($yamlParametersFilepath, 'parameters:' . "\n"); + } +} + +$lastParametersModificationTime = (int)@filemtime($phpParametersFilepath); + +if ($lastParametersModificationTime) { + $cachedParameters = _PS_CACHE_DIR_. 'appParameters.php'; + + $lastParametersCacheModificationTime = (int)@filemtime($cachedParameters); + if (!$lastParametersCacheModificationTime || $lastParametersCacheModificationTime < $lastParametersModificationTime) { + // When parameters file is available, update its cache if it is stale. + if (file_exists($phpParametersFilepath)) { + $config = require $phpParametersFilepath; + $exportPhpConfigFile($config, $cachedParameters); + } elseif (file_exists($yamlParametersFilepath)) { + $config = Yaml::parseFile($yamlParametersFilepath); + $exportPhpConfigFile($config, $cachedParameters); + } + } + + $config = require_once _PS_CACHE_DIR_ . 'appParameters.php'; + array_walk($config['parameters'], function (&$param) { + $param = str_replace('%%', '%', $param); + }); + + $database_host = $config['parameters']['database_host']; + + if (!empty($config['parameters']['database_port'])) { + $database_host .= ':'. $config['parameters']['database_port']; + } + + define('_DB_SERVER_', $database_host); + if (defined('_PS_IN_TEST_')) { + define('_DB_NAME_', 'test_'.$config['parameters']['database_name']); + } else { + define('_DB_NAME_', $config['parameters']['database_name']); + } + + define('_DB_USER_', $config['parameters']['database_user']); + define('_DB_PASSWD_', $config['parameters']['database_password']); + define('_DB_PREFIX_', $config['parameters']['database_prefix']); + define('_MYSQL_ENGINE_', $config['parameters']['database_engine']); + define('_PS_CACHING_SYSTEM_', $config['parameters']['ps_caching']); + + if (!defined('PS_IN_UPGRADE') && !defined('_PS_IN_TEST_')) { + define('_PS_CACHE_ENABLED_', $config['parameters']['ps_cache_enable']); + } else { + define('_PS_CACHE_ENABLED_', 0); + $config['parameters']['ps_cache_enable'] = 0; + } + + // Legacy cookie + if (array_key_exists('cookie_key', $config['parameters'])) { + define('_COOKIE_KEY_', $config['parameters']['cookie_key']); + } else { + // Define cookie key if missing to prevent failure in composer post-install script + define('_COOKIE_KEY_', Tools::passwdGen(56)); + } + + if (array_key_exists('cookie_iv', $config['parameters'])) { + define('_COOKIE_IV_', $config['parameters']['cookie_iv']); + } else { + // Define cookie IV if missing to prevent failure in composer post-install script + define('_COOKIE_IV_', Tools::passwdGen(32)); + } + + // New cookie + if (array_key_exists('new_cookie_key', $config['parameters'])) { + define('_NEW_COOKIE_KEY_', $config['parameters']['new_cookie_key']); + } else { + // Define cookie key if missing to prevent failure in composer post-install script + $key = PhpEncryption::createNewRandomKey(); + define('_NEW_COOKIE_KEY_', $key); + } + + define('_PS_CREATION_DATE_', $config['parameters']['ps_creation_date']); + + if (isset($config['parameters']['_rijndael_key'], $config['parameters']['_rijndael_iv'])) { + define('_RIJNDAEL_KEY_', $config['parameters']['_rijndael_key']); + define('_RIJNDAEL_IV_', $config['parameters']['_rijndael_iv']); + } +} elseif (file_exists(_PS_ROOT_DIR_.'/config/settings.inc.php')) { + require_once _PS_ROOT_DIR_.'/config/settings.inc.php'; +} diff --git a/config/config.inc.php b/config/config.inc.php new file mode 100644 index 0000000..745d8da --- /dev/null +++ b/config/config.inc.php @@ -0,0 +1,315 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +use PrestaShop\PrestaShop\Core\Session\SessionHandler; + +$currentDir = dirname(__FILE__); + +/* Custom defines made by users */ +if (is_file($currentDir . '/defines_custom.inc.php')) { + include_once $currentDir . '/defines_custom.inc.php'; +} + +require_once $currentDir . '/defines.inc.php'; + +require_once _PS_CONFIG_DIR_ . 'autoload.php'; + +$start_time = microtime(true); + +/* SSL configuration */ +define('_PS_SSL_PORT_', 443); + +/* Improve PHP configuration to prevent issues */ +ini_set('default_charset', 'utf-8'); + +/* in dev mode - check if composer was executed */ +if (is_dir(_PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'admin-dev') && (!is_dir(_PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'vendor') || + !file_exists(_PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'))) { + die('Error : please install composer. Then run "php composer.phar install"'); +} + +/* No settings file? goto installer... */ +if (!file_exists(_PS_ROOT_DIR_ . '/app/config/parameters.yml') && !file_exists(_PS_ROOT_DIR_ . '/app/config/parameters.php')) { + Tools::redirectToInstall(); +} + +require_once $currentDir . DIRECTORY_SEPARATOR . 'bootstrap.php'; + +/* + * Improve PHP configuration on Windows + * + * @deprecated since 1.7.8.0 + */ +if ('WIN' === strtoupper(substr(PHP_OS, 0, 3))) { + Windows::improveFilesytemPerformances(); +} + +if (defined('_PS_CREATION_DATE_')) { + $creationDate = _PS_CREATION_DATE_; + if (empty($creationDate)) { + Tools::redirectToInstall(); + } +} else { + Tools::redirectToInstall(); +} + +/* Custom config made by users */ +if (is_file(_PS_CUSTOM_CONFIG_FILE_)) { + include_once _PS_CUSTOM_CONFIG_FILE_; +} + +if (_PS_DEBUG_PROFILING_) { + include_once _PS_TOOL_DIR_ . 'profiling/Profiler.php'; + include_once _PS_TOOL_DIR_ . 'profiling/Controller.php'; + include_once _PS_TOOL_DIR_ . 'profiling/ObjectModel.php'; + include_once _PS_TOOL_DIR_ . 'profiling/Db.php'; + include_once _PS_TOOL_DIR_ . 'profiling/Hook.php'; + include_once _PS_TOOL_DIR_ . 'profiling/Module.php'; + include_once _PS_TOOL_DIR_ . 'profiling/Tools.php'; +} + +if (Tools::convertBytes(ini_get('upload_max_filesize')) < Tools::convertBytes('100M')) { + ini_set('upload_max_filesize', '100M'); +} + +if (Tools::isPHPCLI() && isset($argc, $argv)) { + Tools::argvToGET($argc, $argv); +} + +/* Redefine REQUEST_URI if empty (on some webservers...) */ +if (!isset($_SERVER['REQUEST_URI']) || empty($_SERVER['REQUEST_URI'])) { + if (!isset($_SERVER['SCRIPT_NAME']) && isset($_SERVER['SCRIPT_FILENAME'])) { + $_SERVER['SCRIPT_NAME'] = $_SERVER['SCRIPT_FILENAME']; + } + if (isset($_SERVER['SCRIPT_NAME'])) { + if (basename($_SERVER['SCRIPT_NAME']) == 'index.php' && empty($_SERVER['QUERY_STRING'])) { + $_SERVER['REQUEST_URI'] = dirname($_SERVER['SCRIPT_NAME']) . '/'; + } else { + $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME']; + if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) { + $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; + } + } + } +} + +/* Trying to redefine HTTP_HOST if empty (on some webservers...) */ +if (!isset($_SERVER['HTTP_HOST']) || empty($_SERVER['HTTP_HOST'])) { + $_SERVER['HTTP_HOST'] = @getenv('HTTP_HOST'); +} + +$context = Context::getContext(); + +/* Initialize the current Shop */ +try { + $context->shop = Shop::initialize(); +} catch (PrestaShopException $e) { + $e->displayMessage(); +} +define('_THEME_NAME_', $context->shop->theme->getName()); +define('_PARENT_THEME_NAME_', $context->shop->theme->get('parent') ?: ''); + +define('__PS_BASE_URI__', $context->shop->getBaseURI()); + +/* Include all defines related to base uri and theme name */ +require_once $currentDir . '/defines_uri.inc.php'; + +global $_MODULES; +$_MODULES = array(); + +/** + * @deprecated since 1.7.7 + */ +define('_PS_PRICE_DISPLAY_PRECISION_', 2); + +/** + * @deprecated since 1.7.7 + */ +define('_PS_PRICE_COMPUTE_PRECISION_', 2); + +/* Load all languages */ +Language::loadLanguages(); + +/* Loading default country */ +$default_country = new Country(Configuration::get('PS_COUNTRY_DEFAULT'), Configuration::get('PS_LANG_DEFAULT')); +$context->country = $default_country; + +/* It is not safe to rely on the system's timezone settings, and this would generate a PHP Strict Standards notice. */ +@date_default_timezone_set(Configuration::get('PS_TIMEZONE')); + +/* Set locales */ +$locale = strtolower(Configuration::get('PS_LOCALE_LANGUAGE')) . '_' . strtoupper(Configuration::get('PS_LOCALE_COUNTRY')); +/* Please do not use LC_ALL here http://www.php.net/manual/fr/function.setlocale.php#25041 */ +setlocale(LC_COLLATE, $locale . '.UTF-8', $locale . '.utf8'); +setlocale(LC_CTYPE, $locale . '.UTF-8', $locale . '.utf8'); +setlocale(LC_TIME, $locale . '.UTF-8', $locale . '.utf8'); +setlocale(LC_NUMERIC, 'en_US.UTF-8', 'en_US.utf8'); + +/* Instantiate cookie */ +$cookie_lifetime = defined('_PS_ADMIN_DIR_') ? (int) Configuration::get('PS_COOKIE_LIFETIME_BO') : (int) Configuration::get('PS_COOKIE_LIFETIME_FO'); +if ($cookie_lifetime > 0) { + $cookie_lifetime = time() + (max($cookie_lifetime, 1) * 3600); +} + +$force_ssl = Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE'); +if (defined('_PS_ADMIN_DIR_')) { + $cookie = new Cookie('psAdmin', '', $cookie_lifetime, null, false, $force_ssl); +} else { + $domains = null; + if ($context->shop->getGroup()->share_order) { + $cookie = new Cookie('ps-sg' . $context->shop->getGroup()->id, '', $cookie_lifetime, $context->shop->getUrlsSharedCart(), false, $force_ssl); + } else { + if ($context->shop->domain != $context->shop->domain_ssl) { + $domains = array($context->shop->domain_ssl, $context->shop->domain); + } + + $cookie = new Cookie('ps-s' . $context->shop->id, '', $cookie_lifetime, $domains, false, $force_ssl); + } +} + +if (PHP_SAPI !== 'cli') { + $sessionHandler = new SessionHandler( + $cookie_lifetime, + $force_ssl, + Configuration::get('PS_COOKIE_SAMESITE'), + Context::getContext()->shop->physical_uri + ); + $sessionHandler->init(); + + $context->session = $sessionHandler->getSession(); +} + +$context->cookie = $cookie; + +/* Create employee if in BO, customer else */ +if (defined('_PS_ADMIN_DIR_')) { + $employee = new Employee($cookie->id_employee); + $context->employee = $employee; + + /* Auth on shops are recached after employee assignation */ + if ($employee->id_profile != _PS_ADMIN_PROFILE_) { + Shop::cacheShops(true); + } + + $cookie->id_lang = (int) $employee->id_lang; +} + +/* if the language stored in the cookie is not available language, use default language */ +if (isset($cookie->id_lang) && $cookie->id_lang) { + $language = new Language($cookie->id_lang); +} + +$isNotValidLanguage = !isset($language) || !Validate::isLoadedObject($language); +// `true` if language is defined from multishop or backoffice (`$employee` variable defined) session +$isLanguageDefinedFromSession = (isset($language) && $language->isAssociatedToShop()) || defined('_PS_ADMIN_DIR_'); + +$useDefaultLanguage = $isNotValidLanguage || !$isLanguageDefinedFromSession; +if ($useDefaultLanguage) { + + // Default value for most cases + $language = new Language(Configuration::get('PS_LANG_DEFAULT')); + + // if `PS_LANG_DEFAULT` not a valid language for current shop then + // use first valid language of the shop as default language. + if($language->isMultishop() && !$language->isAssociatedToShop()) { + $shopLanguages = $language->getLanguages(true, Context::getContext()->shop->id, false); + + if(isset($shopLanguages[0]['id_lang'])) { + $shopDefaultLanguage = new Language($shopLanguages[0]['id_lang']); + + if(Validate::isLoadedObject($language)) { + $language = $shopDefaultLanguage; + } + } + } +} + +$context->language = $language; + +/* Get smarty */ +require_once $currentDir . '/smarty.config.inc.php'; +$context->smarty = $smarty; + +if (!defined('_PS_ADMIN_DIR_')) { + if (isset($cookie->id_customer) && (int) $cookie->id_customer) { + $customer = new Customer($cookie->id_customer); + if (!Validate::isLoadedObject($customer)) { + $context->cookie->logout(); + } else { + $customer->logged = true; + if ($customer->id_lang != $context->language->id) { + $customer->id_lang = $context->language->id; + $customer->update(); + } + } + } + + if (!isset($customer) || !Validate::isLoadedObject($customer)) { + $customer = new Customer(); + + /* Change the default group */ + if (Group::isFeatureActive()) { + $customer->id_default_group = (int) Configuration::get('PS_UNIDENTIFIED_GROUP'); + } + } + $customer->id_guest = $cookie->id_guest; + $context->customer = $customer; +} + +/* Link should also be initialized in the context here for retrocompatibility */ +$https_link = (Tools::usingSecureMode() && Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://'; +$context->link = new Link($https_link, $https_link); + +/* + * @deprecated + * USE : Configuration::get() method in order to getting the id of order status + */ + +define('_PS_OS_CHEQUE_', Configuration::get('PS_OS_CHEQUE')); +define('_PS_OS_PAYMENT_', Configuration::get('PS_OS_PAYMENT')); +define('_PS_OS_PREPARATION_', Configuration::get('PS_OS_PREPARATION')); +define('_PS_OS_SHIPPING_', Configuration::get('PS_OS_SHIPPING')); +define('_PS_OS_DELIVERED_', Configuration::get('PS_OS_DELIVERED')); +define('_PS_OS_CANCELED_', Configuration::get('PS_OS_CANCELED')); +define('_PS_OS_REFUND_', Configuration::get('PS_OS_REFUND')); +define('_PS_OS_ERROR_', Configuration::get('PS_OS_ERROR')); +define('_PS_OS_OUTOFSTOCK_', Configuration::get('PS_OS_OUTOFSTOCK')); +define('_PS_OS_OUTOFSTOCK_PAID_', Configuration::get('PS_OS_OUTOFSTOCK_PAID')); +define('_PS_OS_OUTOFSTOCK_UNPAID_', Configuration::get('PS_OS_OUTOFSTOCK_UNPAID')); +define('_PS_OS_BANKWIRE_', Configuration::get('PS_OS_BANKWIRE')); +define('_PS_OS_PAYPAL_', Configuration::get('PS_OS_PAYPAL')); +define('_PS_OS_WS_PAYMENT_', Configuration::get('PS_OS_WS_PAYMENT')); +define('_PS_OS_COD_VALIDATION_', Configuration::get('PS_OS_COD_VALIDATION')); + +if (!defined('_MEDIA_SERVER_1_')) { + define('_MEDIA_SERVER_1_', Configuration::get('PS_MEDIA_SERVER_1')); +} +if (!defined('_MEDIA_SERVER_2_')) { + define('_MEDIA_SERVER_2_', Configuration::get('PS_MEDIA_SERVER_2')); +} +if (!defined('_MEDIA_SERVER_3_')) { + define('_MEDIA_SERVER_3_', Configuration::get('PS_MEDIA_SERVER_3')); +} diff --git a/config/db_slave_server.inc.php b/config/db_slave_server.inc.php new file mode 100644 index 0000000..6b35077 --- /dev/null +++ b/config/db_slave_server.inc.php @@ -0,0 +1,34 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/* +return array( + array('server' => '192.168.0.15', 'user' => 'rep', 'password' => '123456', 'database' => 'rep'), + array('server' => '192.168.0.3', 'user' => 'myuser', 'password' => 'mypassword', 'database' => 'mydatabase'), + ); +*/ + +return array(); diff --git a/config/defines.inc.php b/config/defines.inc.php new file mode 100644 index 0000000..0344ee6 --- /dev/null +++ b/config/defines.inc.php @@ -0,0 +1,238 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/* Debug only */ +if (!defined('_PS_MODE_DEV_')) { +define('_PS_MODE_DEV_', false); +} +/* Compatibility warning */ +define('_PS_DISPLAY_COMPATIBILITY_WARNING_', false); +if (_PS_MODE_DEV_ === true) { + $errorReportingLevel = E_ALL | E_STRICT; + if (_PS_DISPLAY_COMPATIBILITY_WARNING_ === false) { + $errorReportingLevel = $errorReportingLevel & ~E_DEPRECATED & ~E_USER_DEPRECATED; + } + @ini_set('display_errors', 'on'); + @error_reporting($errorReportingLevel); + define('_PS_DEBUG_SQL_', true); +} else { + @ini_set('display_errors', 'off'); + define('_PS_DEBUG_SQL_', false); +} + +if (!defined('_PS_DEBUG_PROFILING_')) { + define('_PS_DEBUG_PROFILING_', false); +} +if (!defined('_PS_MODE_DEMO_')) { + define('_PS_MODE_DEMO_', false); +} +if (!defined('_PS_SMARTY_CACHING_TYPE_')) { + define('_PS_SMARTY_CACHING_TYPE_', 'filesystem'); +} +if (!defined('_PS_ALLOW_MULTI_STATEMENTS_QUERIES_')) { + define('_PS_ALLOW_MULTI_STATEMENTS_QUERIES_', false); +} + +$currentDir = dirname(__FILE__); + +if (!defined('_PS_HOST_MODE_') && (getenv('_PS_HOST_MODE_') || getenv('REDIRECT__PS_HOST_MODE_'))) { + define('_PS_HOST_MODE_', getenv('_PS_HOST_MODE_') ? getenv('_PS_HOST_MODE_') : getenv('REDIRECT__PS_HOST_MODE_')); +} + +if (!defined('_PS_ROOT_DIR_') && (getenv('_PS_ROOT_DIR_') || getenv('REDIRECT__PS_ROOT_DIR_'))) { + define('_PS_ROOT_DIR_', getenv('_PS_ROOT_DIR_') ? getenv('_PS_ROOT_DIR_') : getenv('REDIRECT__PS_ROOT_DIR_')); +} + +/* Directories */ +if (!defined('_PS_ROOT_DIR_')) { + define('_PS_ROOT_DIR_', realpath($currentDir.'/..')); +} + +if (!defined('_PS_CORE_DIR_')) { + define('_PS_CORE_DIR_', realpath($currentDir.'/..')); +} + +define('_PS_ALL_THEMES_DIR_', _PS_ROOT_DIR_.'/themes/'); +/* BO THEMES */ +if (defined('_PS_ADMIN_DIR_')) { + define('_PS_BO_ALL_THEMES_DIR_', _PS_ADMIN_DIR_.'/themes/'); +} + +// Find if we are running under a Symfony command +$cliEnvValue = null; +if (isset($argv) && is_array($argv)) { + if (in_array('--env', $argv)) { + $cliEnvValue = $argv[array_search('--env', $argv) + 1]; + } elseif (in_array('-e', $argv)) { + $cliEnvValue = $argv[array_search('-e', $argv) + 1]; + } +} + +if ((defined('_PS_IN_TEST_') && _PS_IN_TEST_) + || $cliEnvValue === 'test' +) { + define('_PS_ENV_', 'test'); +} else { + define('_PS_ENV_', _PS_MODE_DEV_ ? 'dev': 'prod'); +} + +if (!defined('_PS_CACHE_DIR_')) { + define('_PS_CACHE_DIR_', _PS_ROOT_DIR_.'/var/cache/' . _PS_ENV_ . DIRECTORY_SEPARATOR); +} + +define('_PS_CONFIG_DIR_', _PS_CORE_DIR_.'/config/'); +define('_PS_CUSTOM_CONFIG_FILE_', _PS_CONFIG_DIR_.'settings_custom.inc.php'); +define('_PS_CLASS_DIR_', _PS_CORE_DIR_.'/classes/'); +if (!defined('_PS_DOWNLOAD_DIR_')) { + $dir = (defined('_PS_IN_TEST_') && _PS_IN_TEST_) ? '/tests/Resources/download/' : '/download/'; + define('_PS_DOWNLOAD_DIR_', _PS_ROOT_DIR_.$dir); +} +define('_PS_MAIL_DIR_', _PS_CORE_DIR_.'/mails/'); +if (!defined('_PS_MODULE_DIR_')) { + define('_PS_MODULE_DIR_', _PS_ROOT_DIR_.'/modules/'); +} +if (!defined('_PS_OVERRIDE_DIR_')) { + define('_PS_OVERRIDE_DIR_', _PS_ROOT_DIR_.'/override/'); +} +define('_PS_PDF_DIR_', _PS_CORE_DIR_.'/pdf/'); +define('_PS_TRANSLATIONS_DIR_', _PS_ROOT_DIR_.'/translations/'); +if (!defined('_PS_UPLOAD_DIR_')) { + define('_PS_UPLOAD_DIR_', _PS_ROOT_DIR_.'/upload/'); +} +define('_PS_CONTROLLER_DIR_', _PS_CORE_DIR_.'/controllers/'); +define('_PS_ADMIN_CONTROLLER_DIR_', _PS_CORE_DIR_.'/controllers/admin/'); +define('_PS_FRONT_CONTROLLER_DIR_', _PS_CORE_DIR_.'/controllers/front/'); + +define('_PS_TOOL_DIR_', _PS_CORE_DIR_.'/tools/'); +if (!defined('_PS_GEOIP_DIR_')) { + define('_PS_GEOIP_DIR_', _PS_CORE_DIR_.'/app/Resources/geoip/'); +} +if (!defined('_PS_GEOIP_CITY_FILE_')) { + define('_PS_GEOIP_CITY_FILE_', 'GeoLite2-City.mmdb'); +} + +define('_PS_VENDOR_DIR_', _PS_CORE_DIR_.'/vendor/'); +define('_PS_PEAR_XML_PARSER_PATH_', _PS_TOOL_DIR_.'pear_xml_parser/'); +define('_PS_SWIFT_DIR_', _PS_TOOL_DIR_.'swift/'); +define('_PS_TAASC_PATH_', _PS_TOOL_DIR_.'taasc/'); +define('_PS_TCPDF_PATH_', _PS_TOOL_DIR_.'tcpdf/'); + +define('_PS_IMG_SOURCE_DIR_', _PS_ROOT_DIR_.'/img/'); +if (!defined('_PS_IMG_DIR_')) { + $dir = (defined('_PS_IN_TEST_') && _PS_IN_TEST_) ? '/tests/Resources/img/' : '/img/'; + define('_PS_IMG_DIR_', _PS_ROOT_DIR_.$dir); +} + +if (!defined('_PS_HOST_MODE_')) { + define('_PS_CORE_IMG_DIR_', _PS_CORE_DIR_.'/img/'); +} else { + define('_PS_CORE_IMG_DIR_', _PS_ROOT_DIR_.'/img/'); +} + +define('_PS_CAT_IMG_DIR_', _PS_IMG_DIR_.'c/'); +define('_PS_COL_IMG_DIR_', _PS_IMG_DIR_.'co/'); +define('_PS_EMPLOYEE_IMG_DIR_', _PS_IMG_DIR_.'e/'); +define('_PS_GENDERS_DIR_', _PS_IMG_DIR_.'genders/'); +define('_PS_LANG_IMG_DIR_', _PS_IMG_DIR_.'l/'); +define('_PS_MANU_IMG_DIR_', _PS_IMG_DIR_.'m/'); +define('_PS_ORDER_STATE_IMG_DIR_', _PS_IMG_DIR_.'os/'); +define('_PS_PROD_IMG_DIR_', _PS_IMG_DIR_.'p/'); +define('_PS_PROFILE_IMG_DIR_', _PS_IMG_DIR_.'pr/'); +define('_PS_SHIP_IMG_DIR_', _PS_IMG_DIR_.'s/'); +define('_PS_STORE_IMG_DIR_', _PS_IMG_DIR_.'st/'); +define('_PS_SUPP_IMG_DIR_', _PS_IMG_DIR_.'su/'); +define('_PS_TMP_IMG_DIR_', _PS_IMG_DIR_.'tmp/'); + +/* settings php */ +define('_PS_TRANS_PATTERN_', '(.*[^\\\\])'); +define('_PS_MIN_TIME_GENERATE_PASSWD_', '360'); + +if (!defined('_PS_MAGIC_QUOTES_GPC_')) { + define('_PS_MAGIC_QUOTES_GPC_', false); +} + +define('_CAN_LOAD_FILES_', 1); + +/* Order statuses +Order statuses have been moved into config.inc.php file for backward compatibility reasons */ + +/* Tax behavior */ +define('PS_PRODUCT_TAX', 0); +define('PS_STATE_TAX', 1); +define('PS_BOTH_TAX', 2); + +define('PS_TAX_EXC', 1); +define('PS_TAX_INC', 0); + +define('PS_ROUND_UP', 0); +define('PS_ROUND_DOWN', 1); +define('PS_ROUND_HALF_UP', 2); +define('PS_ROUND_HALF_DOWN', 3); +define('PS_ROUND_HALF_EVEN', 4); +define('PS_ROUND_HALF_ODD', 5); + +/* Backward compatibility */ +define('PS_ROUND_HALF', PS_ROUND_HALF_UP); + +/* Carrier::getCarriers() filter */ +// these defines are DEPRECATED since 1.4.5 version +define('PS_CARRIERS_ONLY', 1); +define('CARRIERS_MODULE', 2); +define('CARRIERS_MODULE_NEED_RANGE', 3); +define('PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE', 4); +define('ALL_CARRIERS', 5); + +/* SQL Replication management */ +define('_PS_USE_SQL_SLAVE_', 0); + +/* PS Technical configuration */ +define('_PS_ADMIN_PROFILE_', 1); + +/* Stock Movement */ +define('_STOCK_MOVEMENT_ORDER_REASON_', 3); +define('_STOCK_MOVEMENT_MISSING_REASON_', 4); + +define('_PS_CACHEFS_DIRECTORY_', _PS_ROOT_DIR_.'/cache/cachefs/'); + +/* Geolocation */ +define('_PS_GEOLOCATION_NO_CATALOG_', 0); +define('_PS_GEOLOCATION_NO_ORDER_', 1); + +define('MIN_PASSWD_LENGTH', 8); + +define('_PS_SMARTY_NO_COMPILE_', 0); +define('_PS_SMARTY_CHECK_COMPILE_', 1); +define('_PS_SMARTY_FORCE_COMPILE_', 2); + +define('_PS_SMARTY_CONSOLE_CLOSE_', 0); +define('_PS_SMARTY_CONSOLE_OPEN_BY_URL_', 1); +define('_PS_SMARTY_CONSOLE_OPEN_', 2); + +if (!defined('_PS_JQUERY_VERSION_')) { + define('_PS_JQUERY_VERSION_', '3.4.1'); +} + +define('_PS_CACHE_CA_CERT_FILE_', _PS_CACHE_DIR_.'cacert.pem'); diff --git a/config/defines_uri.inc.php b/config/defines_uri.inc.php new file mode 100644 index 0000000..49f4b17 --- /dev/null +++ b/config/defines_uri.inc.php @@ -0,0 +1,76 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/* Theme URLs */ +define('_PS_DEFAULT_THEME_NAME_', 'classic'); +define('_PS_THEME_DIR_', _PS_ROOT_DIR_.'/themes/'._THEME_NAME_.'/'); +define('_PS_THEME_URI_', __PS_BASE_URI__.'themes/'._THEME_NAME_.'/'); + +if (defined('_PARENT_THEME_NAME_') && _PARENT_THEME_NAME_) { + define('_PS_PARENT_THEME_DIR_', _PS_ROOT_DIR_.'/themes/'._PARENT_THEME_NAME_.'/'); + define('_PS_PARENT_THEME_URI_', __PS_BASE_URI__.'themes/'._PARENT_THEME_NAME_.'/'); +} else { + define('_PS_PARENT_THEME_DIR_', ''); + define('_PS_PARENT_THEME_URI_', ''); +} +define('_THEMES_DIR_', __PS_BASE_URI__.'themes/'); +define('_THEME_DIR_', _THEMES_DIR_._THEME_NAME_.'/'); +define('_THEME_IMG_DIR_', _THEME_DIR_.'assets/img/'); +define('_THEME_CSS_DIR_', _THEME_DIR_.'assets/css/'); +define('_THEME_JS_DIR_', _THEME_DIR_.'assets/js/'); + +/* Image URLs */ +define('_PS_IMG_', __PS_BASE_URI__.'img/'); +define('_PS_ADMIN_IMG_', _PS_IMG_.'admin/'); +define('_PS_TMP_IMG_', _PS_IMG_.'tmp/'); +define('_THEME_CAT_DIR_', _PS_IMG_.'c/'); +define('_THEME_EMPLOYEE_DIR_', _PS_IMG_.'e/'); +define('_THEME_PROD_DIR_', _PS_IMG_.'p/'); +define('_THEME_PROFILE_DIR_', _PS_IMG_.'pr/'); +define('_THEME_MANU_DIR_', _PS_IMG_.'m/'); +define('_THEME_SUP_DIR_', _PS_IMG_.'su/'); +define('_THEME_SHIP_DIR_', _PS_IMG_.'s/'); +define('_THEME_STORE_DIR_', _PS_IMG_.'st/'); +define('_THEME_LANG_DIR_', _PS_IMG_.'l/'); +define('_THEME_COL_DIR_', _PS_IMG_.'co/'); +define('_THEME_GENDERS_DIR_', _PS_IMG_.'genders/'); +define('_PS_PROD_IMG_', _PS_IMG_.'p/'); + +/* Other URLs */ +define('_PS_JS_DIR_', __PS_BASE_URI__.'js/'); +define('_PS_CSS_DIR_', __PS_BASE_URI__.'css/'); +define('_THEME_PROD_PIC_DIR_', __PS_BASE_URI__.'upload/'); +define('_MAIL_DIR_', __PS_BASE_URI__.'mails/'); +define('_MODULE_DIR_', __PS_BASE_URI__.'modules/'); + +/* Define API URLs if not defined before */ +Tools::safeDefine('_PS_API_DOMAIN_', 'api.prestashop.com'); +Tools::safeDefine('_PS_API_URL_', 'http://'._PS_API_DOMAIN_); +/** @deprecated Since 1.7.7 */ +Tools::safeDefine('_PS_TAB_MODULE_LIST_URL_', ''); +/** @deprecated Since 1.7.7 */ +Tools::safeDefine('_PS_API_MODULES_LIST_16_', ''); +Tools::safeDefine('_PS_CURRENCY_FEED_URL_', _PS_API_URL_.'/xml/currencies.xml'); diff --git a/config/index.php b/config/index.php new file mode 100644 index 0000000..76cd9dd --- /dev/null +++ b/config/index.php @@ -0,0 +1,35 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/config/services/admin/services_dev.yml b/config/services/admin/services_dev.yml new file mode 100644 index 0000000..8a28a7d --- /dev/null +++ b/config/services/admin/services_dev.yml @@ -0,0 +1,2 @@ +imports: + - { resource: services_prod.yml } diff --git a/config/services/admin/services_prod.yml b/config/services/admin/services_prod.yml new file mode 100644 index 0000000..3e5e052 --- /dev/null +++ b/config/services/admin/services_prod.yml @@ -0,0 +1,31 @@ +imports: + - { resource: ../common.yml } + - { resource: ../../../src/PrestaShopBundle/Resources/config/services/adapter/news.yml } + +services: + filesystem: + class: Symfony\Component\Filesystem\Filesystem + + finder: + class: Symfony\Component\Finder\Finder + + hook_provider: + class: PrestaShop\PrestaShop\Adapter\Hook\HookInformationProvider + + hook_repository: + class: PrestaShop\PrestaShop\Core\Module\HookRepository + arguments: ["@hook_provider", "@shop", "@db"] + + hook_configurator: + class: PrestaShop\PrestaShop\Core\Module\HookConfigurator + arguments: ["@hook_repository"] + + theme_validator: + class: PrestaShop\PrestaShop\Core\Addon\Theme\ThemeValidator + + theme_manager: + class: PrestaShop\PrestaShop\Core\Addon\Theme\ThemeManager + arguments: ["@shop", "@configuration", "@theme_validator", "@employee", "@filesystem", "@finder", "@hook_configurator"] + + context.static: + class: Context diff --git a/config/services/admin/services_test.yml b/config/services/admin/services_test.yml new file mode 100644 index 0000000..8ad75e7 --- /dev/null +++ b/config/services/admin/services_test.yml @@ -0,0 +1,2 @@ +imports: + - { resource: services_dev.yml } diff --git a/config/services/common.yml b/config/services/common.yml new file mode 100644 index 0000000..d79fd35 --- /dev/null +++ b/config/services/common.yml @@ -0,0 +1,24 @@ +parameters: + mail_themes_uri: "/mails/themes" + +imports: + - { resource: ../../src/PrestaShopBundle/Resources/config/services/core/cldr.yml } + - { resource: ../../src/PrestaShopBundle/Resources/config/services/core/string.yml } + - { resource: ../../src/PrestaShopBundle/Resources/config/services/adapter/data_provider_common.yml } + - { resource: ../../src/PrestaShopBundle/Resources/config/services/adapter/common.yml } + - { resource: ../../src/PrestaShopBundle/Resources/config/services/core/common.yml } + +services: + hashing: + class: PrestaShop\PrestaShop\Core\Crypto\Hashing + + prestashop.database.naming_strategy: + class: PrestaShopBundle\Service\Database\DoctrineNamingStrategy + arguments: ['%database_prefix%'] + + annotation_reader: + class: Doctrine\Common\Annotations\AnnotationReader + + PrestaShopBundle\DependencyInjection\RuntimeConstEnvVarProcessor: + public: false + tags: ['container.env_var_processor'] diff --git a/config/services/front/services_dev.yml b/config/services/front/services_dev.yml new file mode 100644 index 0000000..8a28a7d --- /dev/null +++ b/config/services/front/services_dev.yml @@ -0,0 +1,2 @@ +imports: + - { resource: services_prod.yml } diff --git a/config/services/front/services_prod.yml b/config/services/front/services_prod.yml new file mode 100644 index 0000000..f446122 --- /dev/null +++ b/config/services/front/services_prod.yml @@ -0,0 +1,53 @@ +imports: + - { resource: ../common.yml } + +services: + prestashop.core.filter.front_end_object.main: + class: PrestaShop\PrestaShop\Core\Filter\FrontEndObject\MainFilter + arguments: + - cart: '@prestashop.core.filter.front_end_object.cart' + customer: '@prestashop.core.filter.front_end_object.customer' + shop: '@prestashop.core.filter.front_end_object.shop' + configuration: '@prestashop.core.filter.front_end_object.configuration' + + prestashop.core.filter.front_end_object.product: + class: PrestaShop\PrestaShop\Core\Filter\FrontEndObject\ProductFilter + + prestashop.core.filter.front_end_object.cart: + class: PrestaShop\PrestaShop\Core\Filter\FrontEndObject\CartFilter + arguments: + - '@prestashop.core.filter.front_end_object.product_collection' + + prestashop.core.filter.front_end_object.search_result_product: + class: PrestaShop\PrestaShop\Core\Filter\FrontEndObject\SearchResultProductFilter + + prestashop.core.filter.front_end_object.customer: + class: PrestaShop\PrestaShop\Core\Filter\FrontEndObject\CustomerFilter + + prestashop.core.filter.front_end_object.shop: + class: PrestaShop\PrestaShop\Core\Filter\FrontEndObject\ShopFilter + + prestashop.core.filter.front_end_object.configuration: + class: PrestaShop\PrestaShop\Core\Filter\FrontEndObject\ConfigurationFilter + + prestashop.core.filter.front_end_object.product_collection: + class: PrestaShop\PrestaShop\Core\Filter\CollectionFilter + calls: + - method: queue + arguments: + - ['@prestashop.core.filter.front_end_object.product'] + + prestashop.core.filter.front_end_object.search_result_product_collection: + class: PrestaShop\PrestaShop\Core\Filter\CollectionFilter + calls: + - method: queue + arguments: + - ['@prestashop.core.filter.front_end_object.search_result_product'] + + prestashop.adapter.module.repository.module_repository: + class: 'PrestaShop\PrestaShop\Adapter\Module\Repository\ModuleRepository' + + prestashop.translation.translator_language_loader: + class: PrestaShopBundle\Translation\TranslatorLanguageLoader + arguments: + - '@prestashop.adapter.module.repository.module_repository' diff --git a/config/services/front/services_test.yml b/config/services/front/services_test.yml new file mode 100644 index 0000000..8ad75e7 --- /dev/null +++ b/config/services/front/services_test.yml @@ -0,0 +1,2 @@ +imports: + - { resource: services_dev.yml } diff --git a/config/services/webservice/services_dev.yml b/config/services/webservice/services_dev.yml new file mode 100644 index 0000000..8a28a7d --- /dev/null +++ b/config/services/webservice/services_dev.yml @@ -0,0 +1,2 @@ +imports: + - { resource: services_prod.yml } diff --git a/config/services/webservice/services_prod.yml b/config/services/webservice/services_prod.yml new file mode 100644 index 0000000..2eed898 --- /dev/null +++ b/config/services/webservice/services_prod.yml @@ -0,0 +1,2 @@ +imports: + - { resource: ../common.yml } diff --git a/config/services/webservice/services_test.yml b/config/services/webservice/services_test.yml new file mode 100644 index 0000000..8ad75e7 --- /dev/null +++ b/config/services/webservice/services_test.yml @@ -0,0 +1,2 @@ +imports: + - { resource: services_dev.yml } diff --git a/config/settings.inc.php b/config/settings.inc.php new file mode 100644 index 0000000..95068b5 --- /dev/null +++ b/config/settings.inc.php @@ -0,0 +1,13 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ +define('_PS_SMARTY_DIR_', _PS_VENDOR_DIR_.'prestashop/smarty/'); + +global $smarty; +if (Configuration::get('PS_SMARTY_LOCAL')) { + $smarty = new SmartyCustom(); +} elseif (_PS_MODE_DEV_ && !defined('_PS_ADMIN_DIR_')) { + $smarty = new SmartyDev(); +} else { + $smarty = new Smarty(); +} + +$smarty->setCompileDir(_PS_CACHE_DIR_.'smarty/compile'); +$smarty->setCacheDir(_PS_CACHE_DIR_.'smarty/cache'); +$smarty->use_sub_dirs = true; +$smarty->setConfigDir(_PS_SMARTY_DIR_.'configs'); +$smarty->caching = false; + +if (_PS_SMARTY_CACHING_TYPE_ == 'mysql') { + include _PS_CLASS_DIR_.'Smarty/SmartyCacheResourceMysql.php'; + $smarty->caching_type = 'mysql'; +} +$smarty->force_compile = (Configuration::get('PS_SMARTY_FORCE_COMPILE') == _PS_SMARTY_FORCE_COMPILE_) ? true : false; +$smarty->compile_check = (Configuration::get('PS_SMARTY_FORCE_COMPILE') >= _PS_SMARTY_CHECK_COMPILE_) ? true : false; +$smarty->debug_tpl = _PS_ALL_THEMES_DIR_.'debug.tpl'; + +/* Use this constant if you want to load smarty without all PrestaShop functions */ +if (defined('_PS_SMARTY_FAST_LOAD_') && _PS_SMARTY_FAST_LOAD_) { + return; +} + +if (defined('_PS_ADMIN_DIR_')) { + require_once dirname(__FILE__).'/smartyadmin.config.inc.php'; +} else { + require_once dirname(__FILE__).'/smartyfront.config.inc.php'; +} + +require_once SMARTY_PLUGINS_DIR.'modifier.truncate.php'; + +// This escape modifier is required for invoice PDF generation +function smartyEscape($string, $esc_type = 'html', $char_set = null, $double_encode = true) +{ + $escapeModifierFile = implode( + DIRECTORY_SEPARATOR, + array( + SMARTY_PLUGINS_DIR, + 'modifier.escape.php', + ) + ); + require_once $escapeModifierFile; + + global $smarty; + if (($esc_type === 'html' || $esc_type === 'htmlall') && $smarty->escape_html) { + return $string; + } else { + return smarty_modifier_escape($string, $esc_type, $char_set, $double_encode); + } +} + +smartyRegisterFunction($smarty, 'modifier', 'escape', 'smartyEscape'); +smartyRegisterFunction($smarty, 'modifier', 'truncate', 'smarty_modifier_truncate'); +smartyRegisterFunction($smarty, 'function', 'l', 'smartyTranslate', false); +smartyRegisterFunction($smarty, 'function', 'hook', 'smartyHook'); +smartyRegisterFunction($smarty, 'modifier', 'json_encode', array('Tools', 'jsonEncode')); +smartyRegisterFunction($smarty, 'modifier', 'json_decode', array('Tools', 'jsonDecode')); +smartyRegisterFunction($smarty, 'function', 'dateFormat', array('Tools', 'dateFormat')); +smartyRegisterFunction($smarty, 'modifier', 'boolval', array('Tools', 'boolval')); +smartyRegisterFunction($smarty, 'modifier', 'cleanHtml', 'smartyCleanHtml'); +smartyRegisterFunction($smarty, 'modifier', 'classname', 'smartyClassname'); +smartyRegisterFunction($smarty, 'modifier', 'classnames', 'smartyClassnames'); +smartyRegisterFunction($smarty, 'function', 'url', array('Link', 'getUrlSmarty')); + +function smarty_modifier_htmlentitiesUTF8($string) +{ + return Tools::htmlentitiesUTF8($string); +} + +function smartyRegisterFunction($smarty, $type, $function, $params, $lazy = true, $initial_lazy_register = null) +{ + if (!in_array($type, array('function', 'modifier', 'block'))) { + return false; + } + + // lazy is better if the function is not called on every page + if ($lazy) { + if (null !== $initial_lazy_register && $initial_lazy_register->isRegistered($params)) { + return; + } + + $lazy_register = SmartyLazyRegister::getInstance($smarty); + if ($lazy_register->isRegistered($params)) { + return; + } + $lazy_register->register($params); + + if (is_array($params)) { + $params = $params[1]; + } + + // SmartyLazyRegister allows to only load external class when they are needed + $smarty->registerPlugin($type, $function, array($lazy_register, $params)); + } else { + $smarty->registerPlugin($type, $function, $params); + } +} + +function smartyHook($params, &$smarty) +{ + $id_module = null; + $hook_params = $params; + $hook_params['smarty'] = $smarty; + if (!empty($params['mod'])) { + $module = Module::getInstanceByName($params['mod']); + unset($hook_params['mod']); + if ($module && $module->id) { + $id_module = $module->id; + } else { + unset($hook_params['h']); + + return ''; + } + } + if (!empty($params['excl'])) { + $result = ''; + $modules = Hook::getHookModuleExecList($hook_params['h']); + + $moduleexcl = explode(',', $params['excl']); + foreach ($modules as $module) { + if (!in_array($module['module'], $moduleexcl)) { + $result .= Hook::exec($params['h'], $hook_params, $module['id_module']); + } + } + + unset( + $hook_params['h'], + $hook_params['excl'] + ); + + return $result; + } + unset($hook_params['h']); + + return Hook::exec($params['h'], $hook_params, $id_module); +} + +function smartyCleanHtml($data) +{ + // Prevent xss injection. + if (Validate::isCleanHtml($data)) { + return $data; + } +} + +function smartyClassname($classname) +{ + $classname = Tools::replaceAccentedChars(strtolower($classname)); + $classname = preg_replace('/[^A-Za-z0-9]/', '-', $classname); + $classname = preg_replace('/[-]+/', '-', $classname); + + return $classname; +} + +function smartyClassnames(array $classnames) +{ + $enabled_classes = array(); + foreach ($classnames as $classname => $enabled) { + if ($enabled) { + $enabled_classes[] = smartyClassname($classname); + } + } + + return implode(' ', $enabled_classes); +} diff --git a/config/smartyadmin.config.inc.php b/config/smartyadmin.config.inc.php new file mode 100644 index 0000000..7e0ae26 --- /dev/null +++ b/config/smartyadmin.config.inc.php @@ -0,0 +1,151 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ +global $smarty; +$smarty->debugging = false; +$smarty->debugging_ctrl = 'NONE'; + +// Let user choose to force compilation +$smarty->force_compile = (Configuration::get('PS_SMARTY_FORCE_COMPILE') == _PS_SMARTY_FORCE_COMPILE_) ? true : false; +// But force compile_check since the performance impact is small and it is better for debugging +$smarty->compile_check = true; + +smartyRegisterFunction($smarty, 'function', 'toolsConvertPrice', 'toolsConvertPrice'); +smartyRegisterFunction($smarty, 'function', 'convertPrice', array('Product', 'convertPrice')); +smartyRegisterFunction($smarty, 'function', 'convertPriceWithCurrency', array('Product', 'convertPriceWithCurrency')); +smartyRegisterFunction($smarty, 'function', 'displayWtPrice', array('Product', 'displayWtPrice')); +smartyRegisterFunction($smarty, 'function', 'displayWtPriceWithCurrency', array('Product', 'displayWtPriceWithCurrency')); +smartyRegisterFunction($smarty, 'function', 'displayPrice', array('Tools', 'displayPriceSmarty')); +smartyRegisterFunction($smarty, 'modifier', 'convertAndFormatPrice', array('Product', 'convertAndFormatPrice')); // used twice +smartyRegisterFunction($smarty, 'function', 'getAdminToken', array('Tools', 'getAdminTokenLiteSmarty')); +smartyRegisterFunction($smarty, 'function', 'displayAddressDetail', array('AddressFormat', 'generateAddressSmarty')); +smartyRegisterFunction($smarty, 'function', 'getWidthSize', array('Image', 'getWidth')); +smartyRegisterFunction($smarty, 'function', 'getHeightSize', array('Image', 'getHeight')); +smartyRegisterFunction($smarty, 'function', 'addJsDef', array('Media', 'addJsDef')); +smartyRegisterFunction($smarty, 'block', 'addJsDefL', array('Media', 'addJsDefL')); +smartyRegisterFunction($smarty, 'modifier', 'secureReferrer', array('Tools', 'secureReferrer')); + +$module_resources['modules'] = _PS_MODULE_DIR_; +$smarty->registerResource('module', new SmartyResourceModule($module_resources, $isAdmin = true)); + +function toolsConvertPrice($params, &$smarty) +{ + return Tools::convertPrice($params['price'], Context::getContext()->currency); +} + +function smartyTranslate($params, $smarty) +{ + $translator = Context::getContext()->getTranslator(); + + $htmlEntities = !isset($params['html']) && !isset($params['js']); + $addSlashes = (isset($params['slashes']) || isset($params['js'])); + $isInPDF = isset($params['pdf']); + $isInModule = !empty($params['mod']); + $sprintf = array(); + + if (isset($params['sprintf']) && !is_array($params['sprintf'])) { + $sprintf = array($params['sprintf']); + } elseif (isset($params['sprintf'])) { + $sprintf = $params['sprintf']; + } + + if (($htmlEntities || $addSlashes)) { + $sprintf['legacy'] = $htmlEntities ? 'htmlspecialchars': 'addslashes'; + } + + if (!empty($params['d'])) { + if (isset($params['tags'])) { + $backTrace = debug_backtrace(); + + $errorMessage = sprintf( + 'Unable to translate "%s" in %s. tags() is not supported anymore, please use sprintf().', + $params['s'], + $backTrace[0]['args'][1]->template_resource + ); + + if (_PS_MODE_DEV_) { + throw new Exception($errorMessage); + } else { + PrestaShopLogger::addLog($errorMessage); + } + } + + if (!is_array($sprintf)) { + $backTrace = debug_backtrace(); + + $errorMessage = sprintf( + 'Unable to translate "%s" in %s. sprintf() parameter should be an array.', + $params['s'], + $backTrace[0]['args'][1]->template_resource + ); + + if (_PS_MODE_DEV_) { + throw new Exception($errorMessage); + } else { + PrestaShopLogger::addLog($errorMessage); + + return $params['s']; + } + } + + return $translator->trans($params['s'], $sprintf, $params['d']); + } + + if ($isInPDF) { + return Translate::smartyPostProcessTranslation( + Translate::getPdfTranslation( + $params['s'], + $sprintf + ), + $params + ); + } + + // If the template is part of a module + if ($isInModule) { + return Translate::smartyPostProcessTranslation( + Translate::getModuleTranslation( + $params['mod'], + $params['s'], + basename($smarty->source->name, '.tpl'), + $sprintf, + isset($params['js']) + ), + $params + ); + } + + $translatedValue = $translator->trans($params['s'], $sprintf, null); + + if ($htmlEntities) { + $translatedValue = htmlspecialchars($translatedValue, ENT_COMPAT, 'UTF-8'); + } + + if ($addSlashes) { + $translatedValue = addslashes($translatedValue); + } + + return $translatedValue; +} diff --git a/config/smartyfront.config.inc.php b/config/smartyfront.config.inc.php new file mode 100644 index 0000000..70374bb --- /dev/null +++ b/config/smartyfront.config.inc.php @@ -0,0 +1,273 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ +global $smarty; + +use PrestaShop\TranslationToolsBundle\Translation\Helper\DomainHelper; + +$template_dirs = array(_PS_THEME_DIR_.'templates'); +$plugin_dirs = array(_PS_THEME_DIR_.'plugins'); +if (_PS_PARENT_THEME_DIR_) { + $template_dirs[] = _PS_PARENT_THEME_DIR_.'templates'; + $plugin_dirs[] = _PS_PARENT_THEME_DIR_.'plugins'; +} + +$smarty->setTemplateDir($template_dirs); +$smarty->addPluginsDir($plugin_dirs); + +$module_resources = array('theme' => _PS_THEME_DIR_.'modules/'); +if (_PS_PARENT_THEME_DIR_) { + $module_resources['parent'] = _PS_PARENT_THEME_DIR_.'modules/'; +} +$module_resources['modules'] = _PS_MODULE_DIR_; +$smarty->registerResource('module', new SmartyResourceModule($module_resources)); + +$parent_resources = array(); +if (_PS_PARENT_THEME_DIR_) { + $parent_resources['parent'] = _PS_PARENT_THEME_DIR_.'templates/'; +} +$smarty->registerResource('parent', new SmartyResourceParent($parent_resources)); + +$smarty->escape_html = true; + +smartyRegisterFunction($smarty, 'function', 'widget', 'smartyWidget'); +smartyRegisterFunction($smarty, 'function', 'render', 'smartyRender'); +smartyRegisterFunction($smarty, 'function', 'form_field', 'smartyFormField'); +smartyRegisterFunction($smarty, 'block', 'widget_block', 'smartyWidgetBlock'); + +function withWidget($params, callable $cb) +{ + if (!isset($params['name'])) { + throw new Exception('Smarty helper `render_widget` expects at least the `name` parameter.'); + } + + $moduleName = $params['name']; + unset($params['name']); + + $moduleInstance = Module::getInstanceByName($moduleName); + + if (!$moduleInstance instanceof PrestaShop\PrestaShop\Core\Module\WidgetInterface) { + throw new Exception(sprintf( + 'Module `%1$s` is not a WidgetInterface.', + $moduleName + )); + } + + return $cb($moduleInstance, $params); +} + +function smartyWidget($params, &$smarty) +{ + return withWidget($params, function ($widget, $params) { + return Hook::coreRenderWidget( + $widget, + isset($params['hook']) ? $params['hook'] : null, + $params + ); + }); +} + +function smartyRender($params, &$smarty) +{ + $ui = $params['ui']; + + if (array_key_exists('file', $params)) { + $ui->setTemplate($params['file']); + } + + return $ui->render($params); +} + +function smartyFormField($params, $smarty) +{ + $scope = $smarty->createData( + $smarty + ); + + $scope->assign($params); + + $file = '_partials/form-fields.tpl'; + + if (isset($params['file'])) { + $file = $params['file']; + } + + $tpl = $smarty->createTemplate($file, $scope); + + return $tpl->fetch(); +} + +function smartyWidgetBlock($params, $content, $smarty) +{ + static $backedUpVariablesStack = array(); + + if (null === $content) { + // Function is called twice: at the opening of the block + // and when it is closed. + // This is the first call. + withWidget($params, function ($widget, $params) use (&$smarty, &$backedUpVariablesStack) { + // Assign widget variables and backup all the variables they override + $currentVariables = $smarty->getTemplateVars(); + $scopedVariables = $widget->getWidgetVariables(isset($params['hook']) ? $params['hook'] : null, $params); + $backedUpVariables = array(); + foreach ($scopedVariables as $key => $value) { + if (array_key_exists($key, $currentVariables)) { + $backedUpVariables[$key] = $currentVariables[$key]; + } + $smarty->assign($key, $value); + } + $backedUpVariablesStack[] = $backedUpVariables; + }); + // We don't display anything since the template is not rendered yet. + return ''; + } else { + // Function gets called for the closing tag of the block. + // We restore the backed up variables in order not to override + // template variables. + if (!empty($backedUpVariablesStack)) { + $backedUpVariables = array_pop($backedUpVariablesStack); + foreach ($backedUpVariables as $key => $value) { + $smarty->assign($key, $value); + } + } + // This time content is filled with rendered template, so return it. + return $content; + } +} + +function smartyTranslate($params, $smarty) +{ + global $_LANG; + + if (!isset($params['js'])) { + $params['js'] = false; + } + if (!isset($params['pdf'])) { + $params['pdf'] = false; + } + if (!isset($params['mod'])) { + $params['mod'] = false; + } + if (!isset($params['sprintf'])) { + $params['sprintf'] = array(); + } + + // fix inheritance template filename in case of includes from different cross sources between theme, modules, ... + $filename = $smarty->template_resource; + if (!isset($smarty->inheritance->sourceStack[0]) || $filename === $smarty->inheritance->sourceStack[0]->resource) { + $filename = $smarty->source->name; + } + $basename = basename($filename, '.tpl'); + + if (!isset($params['d'])) { + $params['d'] = null; + } + + if (!empty($params['d'])) { + if (isset($params['tags'])) { + $backTrace = debug_backtrace(); + + $errorMessage = sprintf( + 'Unable to translate "%s" in %s. tags() is not supported anymore, please use sprintf().', + $params['s'], + $backTrace[0]['args'][1]->template_resource + ); + + if (_PS_MODE_DEV_) { + throw new Exception($errorMessage); + } else { + PrestaShopLogger::addLog($errorMessage); + } + } + + if (!is_array($params['sprintf'])) { + $backTrace = debug_backtrace(); + + $errorMessage = sprintf( + 'Unable to translate "%s" in %s. sprintf() parameter should be an array.', + $params['s'], + $backTrace[0]['args'][1]->template_resource + ); + + if (_PS_MODE_DEV_) { + throw new Exception($errorMessage); + } else { + PrestaShopLogger::addLog($errorMessage); + + return $params['s']; + } + } + + return Context::getContext()->getTranslator()->trans($params['s'], $params['sprintf'], $params['d']); + } + + $string = str_replace('\'', '\\\'', $params['s']); + $key = $basename.'_'.md5($string); + + if (isset($smarty->source) && (strpos($smarty->source->filepath, DIRECTORY_SEPARATOR.'override'.DIRECTORY_SEPARATOR) !== false)) { + $key = 'override_'.$key; + } + + if ($params['mod']) { + return Translate::smartyPostProcessTranslation( + Translate::getModuleTranslation( + $params['mod'], + $params['s'], + $basename, + $params['sprintf'], + $params['js'] + ), + $params + ); + } elseif ($params['pdf']) { + return Translate::smartyPostProcessTranslation( + Translate::getPdfTranslation( + $params['s'], + $params['sprintf'] + ), + $params + ); + } + + if ($_LANG != null && isset($_LANG[$key])) { + $msg = $_LANG[$key]; + } elseif ($_LANG != null && isset($_LANG[Tools::strtolower($key)])) { + $msg = $_LANG[Tools::strtolower($key)]; + } else { + $msg = $params['s']; + } + + if ($msg != $params['s'] && !$params['js']) { + $msg = stripslashes($msg); + } elseif ($params['js']) { + $msg = addslashes($msg); + } + + if ($params['sprintf'] !== null) { + $msg = Translate::checkAndReplaceArgs($msg, $params['sprintf']); + } + + return Translate::smartyPostProcessTranslation($params['js'] ? $msg : Tools::safeOutput($msg), $params); +} diff --git a/config/themes/classic/shop1.json b/config/themes/classic/shop1.json new file mode 100644 index 0000000..0a9077d --- /dev/null +++ b/config/themes/classic/shop1.json @@ -0,0 +1 @@ +{"name":"classic","display_name":"Classic","version":"1.0.0","author":{"name":"PrestaShop Team","email":"pub@prestashop.com","url":"http:\/\/www.prestashop.com"},"meta":{"compatibility":{"from":"1.7.0.0","to":null},"available_layouts":{"layout-full-width":{"name":"Full Width","description":"No side columns, ideal for distraction-free pages such as product pages."},"layout-both-columns":{"name":"Three Columns","description":"One large central column and 2 side columns."},"layout-left-column":{"name":"Two Columns, small left column","description":"Two columns with a small left column"},"layout-right-column":{"name":"Two Columns, small right column","description":"Two columns with a small right column"}}},"assets":null,"global_settings":{"configuration":{"PS_IMAGE_QUALITY":"png"},"modules":{"to_enable":["ps_linklist"]},"hooks":{"modules_to_hook":{"displayNav1":["ps_contactinfo"],"displayNav2":["ps_languageselector","ps_currencyselector","ps_customersignin","ps_shoppingcart"],"displayTop":["ps_mainmenu","ps_searchbar"],"displayHome":["ps_imageslider","ps_featuredproducts","ps_banner","ps_customtext"],"displayFooterBefore":["ps_emailsubscription","ps_socialfollow"],"displayFooter":["ps_linklist","ps_customeraccountlinks","ps_contactinfo"],"displayLeftColumn":["ps_categorytree","ps_facetedsearch"],"displaySearch":["ps_searchbar"],"displayProductAdditionalInfo":["ps_sharebuttons"],"displayReassurance":["blockreassurance"],"displayOrderConfirmation2":["ps_featuredproducts"],"displayCrossSellingShoppingCart":["ps_featuredproducts"]}},"image_types":{"cart_default":{"width":125,"height":125,"scope":["products"]},"small_default":{"width":98,"height":98,"scope":["products","categories","manufacturers","suppliers"]},"medium_default":{"width":452,"height":452,"scope":["products","manufacturers","suppliers"]},"home_default":{"width":250,"height":250,"scope":["products"]},"large_default":{"width":800,"height":800,"scope":["products","manufacturers","suppliers"]},"category_default":{"width":141,"height":180,"scope":["categories"]},"stores_default":{"width":170,"height":115,"scope":["stores"]}}},"theme_settings":{"default_layout":"layout-full-width","layouts":{"pagenotfound":"layout-full-width","best-sales":"layout-left-column","contact":"layout-left-column","index":"layout-full-width","manufacturer":"layout-full-width","new-products":"layout-left-column","password":"layout-full-width","prices-drop":"layout-left-column","sitemap":"layout-full-width","supplier":"layout-full-width","address":"layout-full-width","addresses":"layout-full-width","authentication":"layout-full-width","cart":"layout-full-width","discount":"layout-full-width","history":"layout-full-width","identity":"layout-full-width","my-account":"layout-full-width","order-follow":"layout-full-width","order-slip":"layout-full-width","order":"layout-full-width","search":"layout-full-width","stores":"layout-full-width","guest-tracking":"layout-full-width","order-confirmation":"layout-full-width","product":"layout-full-width","category":"layout-left-column","cms":"layout-full-width","module-cheque-payment":"layout-full-width","module-cheque-validation":"layout-full-width","module-bankwire-validation":"layout-full-width","module-bankwire-payment":"layout-full-width","module-cashondelivery-validation":"layout-full-width","module-ps_checkpayment-payment":"layout-full-width","module-ps_checkpayment-validation":"layout-full-width","module-ps_emailsubscription-verification":"layout-full-width","module-ps_emailsubscription-subscription":"layout-full-width","module-ps_wirepayment-payment":"layout-full-width","module-ps_wirepayment-validation":"layout-full-width","module-ps_feeder-rss":"layout-full-width","module-ps_shoppingcart-ajax":"layout-full-width","module-ps_emailalerts-account":"layout-full-width","module-paynow-payment":"layout-full-width","module-paynow-return":"layout-full-width"}},"directory":"\/home\/mpalys2\/domains\/kikiriki.sklep.pl\/public_html\/themes\/classic\/","preview":"themes\/classic\/preview.png"} \ No newline at end of file diff --git a/config/xml/.htaccess b/config/xml/.htaccess new file mode 100644 index 0000000..3de9e40 --- /dev/null +++ b/config/xml/.htaccess @@ -0,0 +1,10 @@ +# Apache 2.2 + + Order deny,allow + Deny from all + + +# Apache 2.4 + + Require all denied + diff --git a/config/xml/1.7.8.11.xml b/config/xml/1.7.8.11.xml new file mode 100644 index 0000000..296d728 --- /dev/null +++ b/config/xml/1.7.8.11.xml @@ -0,0 +1,33475 @@ + + + + a232034110d661ebf424d64f57d26c45 + + 21f7157623ab1e590e67c1a49f935a16 + + c3642b0932cc790dde34423b1640e246 + + 5119565d69cd68fae2e2a709363f8754 + + + + 5119565d69cd68fae2e2a709363f8754 + 3b98e7b96261843cd752c96a0dc5105d + + + 5119565d69cd68fae2e2a709363f8754 + 3b98e7b96261843cd752c96a0dc5105d + + + + fe1953208ac87fd38b65749959a85d67 + f1605942bcc1daec61aed5e41e7826cd + + + 323f5dbc2c30537175dad260d75cf7ad + 33cf94fdba19996229a309edd8ebade5 + fe1953208ac87fd38b65749959a85d67 + 0dd8e49226e48a2f52dc2f26c79c2947 + 65152f89bc7a5d49458f104dcbbcbe07 + 705622cfe64490649abd426964557317 + 2086562830595fe13ad430d706397073 + b8288614f07ac426d8ed52c3392c6600 + 9b5e0248edf37d28ea90857c59e6b912 + f8516add6b36f43a540b653e1a59fe97 + + + 6fb0b29b89e87fedd690730ce910371f + + 0434607bd1c41f1deab9f27c81b95446 + f3237c1cb039c57c83394aa0cfccbb85 + f3237c1cb039c57c83394aa0cfccbb85 + 08a48a81b4b9b98d37688f70b3322829 + 54be9f9523ce68ef247dd1c83bc8a5c4 + 747dd67e748aeb459858109ba99b0d98 + 052c473adaabb82fc229653c7cc8331b + 7e35ab3a36c9802038e29b8f1d221552 + fe1953208ac87fd38b65749959a85d67 + 0434607bd1c41f1deab9f27c81b95446 + 567515cb520790e84f4a10f427330570 + d02dd2abafb4916256abb0850cece153 + ccb7942181ca885875fd5fcda280c182 + 43284e6cfb5f5a8d41b966308306c2e2 + a89c71c9c176e8ba2b435e3b5aeabb51 + 77dbbdb1034ce8ade6017f49a9a97d73 + cdb194aa9219652cd25dd63c12aa747d + 7e35ab3a36c9802038e29b8f1d221552 + 629f935323ba704e2a47daa9d2a0a600 + fb4a1a42260c0724403875599e29872b + 42c539740d408d1abf86bad1f3be9080 + 8695361e754253054da8ba51d453b5b0 + 77dbbdb1034ce8ade6017f49a9a97d73 + 567515cb520790e84f4a10f427330570 + d02dd2abafb4916256abb0850cece153 + 7173aa50561628febe98aa7cf87da8b8 + 567515cb520790e84f4a10f427330570 + cb6b2c156dfde96f40f1611c7769d48c + 08a48a81b4b9b98d37688f70b3322829 + ccaaed47544a06a61bbe42ac21b0809b + 05018751474fdd1cb9a20f926d6c74f8 + d777c92a0082ceea4d039efc384f8f13 + d02dd2abafb4916256abb0850cece153 + 870d16a98ac370f53d0c0346579b5120 + 49ad2924fab763d26b9552b58be77134 + 7e35ab3a36c9802038e29b8f1d221552 + b2ba17e85d376c424c9ac9409ed6e551 + 0b60b86acdce3daa75985d99d9abf5c3 + 08a48a81b4b9b98d37688f70b3322829 + 8704804bcfb969049a9c2f18bfff58b3 + daa01c3043d9dcfa5257cbed5fb1fe9f + ceb8da71854f69b0df574ee54c060377 + 77dbbdb1034ce8ade6017f49a9a97d73 + 7173aa50561628febe98aa7cf87da8b8 + bc1790bbb2648f76e00029c47847a977 + ae9054c041db8140f4da4c9f49d5cd81 + 2be626c12fa15f797a1f5165516395ee + a4b1c11d919e87aa7e2432d7d69e016e + 76ecd0bdf722a3736d822c95eae01fa5 + 77dbbdb1034ce8ade6017f49a9a97d73 + b1051183da3346abfb580fcc680ecbd7 + d8778a68caeb92b42b1b7160b9c96ae9 + 66e1b1cf2324d46953627ecdcf975abe + 052c473adaabb82fc229653c7cc8331b + 82b4063952d10d8d6450c02832d7dae9 + 01c9b81d970a6a393561f212035fb623 + c955a311b72b2a6ce7c44fd1ae96253e + 08a48a81b4b9b98d37688f70b3322829 + 77dbbdb1034ce8ade6017f49a9a97d73 + d2941e60e403c74073e28f9c62a1a6bc + 08a48a81b4b9b98d37688f70b3322829 + f3ef1b6c325a30fa38903f9fc0ca818a + f45e49986d1c1c25684b37d3c6b501ea + 9a84ad26292dc9c0f49b98c31aa4a0be + 77dbbdb1034ce8ade6017f49a9a97d73 + 84224114c000438a7d936359e3f6f231 + 73fc8ad719684f245254ae49db5c03cd + 84224114c000438a7d936359e3f6f231 + + + 0b66004f495ca5f69c632020cf8e7305 + b6e285b24bd222da69f49fe64f20140e + b6e285b24bd222da69f49fe64f20140e + 2fa36d68e3ed25548962a3484b3e4e02 + cdccac10217d0da0b2e64c87fa033df3 + 747dd67e748aeb459858109ba99b0d98 + 9d9837048588b4e8a4e108d818bdf9d7 + 741a1b6ced555b4d92676ee4acc351e8 + fe1953208ac87fd38b65749959a85d67 + 0b66004f495ca5f69c632020cf8e7305 + 3595b4ee6c8fd453c0d438efb0af4d81 + baea9ddf2b359435e2e210889fe95814 + 1b98ddda3cc1c800da8a2ed1a424a0c5 + 952e8f9c5b82170f3e91d946ec3378ce + ce6b8a6b84a69431011147507ef6d27b + 23d16155e62272ab317db25c1ff7100b + e366c07563cb8cf9cca986d9c20bd0fc + b960cbf5b32aea22f92807e1900f18c8 + 04e72b042a492fdcfd6b89e444bb56eb + abbc50814d3073f875e4ee9076454f26 + 11ff375da02d2040be93b2503ccf3e2e + 7f6dbf9fa3527b3e406f73f38f6305e7 + 23d16155e62272ab317db25c1ff7100b + fd0c2426f6f5172ab49365d212c0931b + 7041204f4ef1fb7cfbddf99495a35487 + 35f58faf4fb45145a738e46e3f58ce80 + 3595b4ee6c8fd453c0d438efb0af4d81 + fe35d5633776c282c919a07f3ab88da9 + 2fa36d68e3ed25548962a3484b3e4e02 + d7d798139bdc6df9cd6afbad9f37aabe + d31c86414391656b67e515acf550e308 + d777c92a0082ceea4d039efc384f8f13 + baea9ddf2b359435e2e210889fe95814 + e769fbdf708f05353d4c343ac4fc19d0 + 4f9759ffcef954b72b06a9cbf873d793 + 741a1b6ced555b4d92676ee4acc351e8 + 31e351db581b815bad2e15805f8013fb + 6e23c2918d163ab708dffa3910883c36 + 2fa36d68e3ed25548962a3484b3e4e02 + 43e381f496f3972e7a5eb9e5e2115391 + 83df7190f196ab476a3a7ed95af9f0cf + b2f6b37d4d3086265a35491dbdbbe8a2 + 23d16155e62272ab317db25c1ff7100b + 35f58faf4fb45145a738e46e3f58ce80 + 49e73a7d19ca0b66db64a8fcb3a7ff0b + 69b6dbba5421f7ba8aaf880681de5751 + d4946d41832fc3fdb44135c85854e6f8 + a24fe713d3989ff381c9439f9e863b41 + 18b06dcbf9d7d09a67ce72a7f56cbd77 + 23d16155e62272ab317db25c1ff7100b + 7dfd9443f7aa4ccc56d1776b07d3c480 + a9a0080a9524becd447fb3c9816c0257 + 39beb88fe434632f2c22bbbf4a5d3ca6 + 9d9837048588b4e8a4e108d818bdf9d7 + b76b2a5ff9adab8d142d0169cc72d6e7 + df87b5092e76f96e887f69f7d775cd87 + d97bb79e244808fcfc036b5e28abad5a + 2fa36d68e3ed25548962a3484b3e4e02 + 23d16155e62272ab317db25c1ff7100b + 7cdb51646a80e3d48631992270dda798 + 2fa36d68e3ed25548962a3484b3e4e02 + 0175b4163b090f91f9c3c0a4a5357bbc + 1207548e073c107fb4d4370ebc8f6832 + a897759e51f23423e3977783aaa37a94 + 23d16155e62272ab317db25c1ff7100b + b0160a19558b06da722649122e91f4de + cd45209425400f7b91455b8eb4bc92ce + b0160a19558b06da722649122e91f4de + + 8e3167632f7c3ccc21cccf6c1b3729e4 + 61ac61b907afe6ae24c33117c849944e + 623265b26b713c383c1c94f79b37360f + c2bdd4fb29410b58e36b1efdb7e21802 + 3831cb0f3d711072d66919ee07e1d59b + fe1953208ac87fd38b65749959a85d67 + f661c28be2fab85dc8b5ad8b53a54f75 + f0ece8ab3ef701779205969fb19c0806 + b4e07ed70c08d2fc62501d149338bd0f + 202614691f1b263a790ec12cfa39f566 + 378f0fb685ae86b317b2204c5b5b9f35 + a984c66a16f5a63e6394d76cb435e393 + 91d17704130b9d6d929a69d730566517 + b151b7ca0faf8ca5b96807bb661a3450 + ca3d1b054998331c1d51aa6a07d5e2f6 + 33530bbbb7763b8a3bce214bda39e4f6 + 489d23608ad493f8d33606d9151a1ce3 + 000a3ee5f5b852f49bb3214158aafeff + af836ba072fde0ab69fb43674a1a76e8 + 34ec9b00f75b9cc3757a9a0c35478ea1 + ca7d733ebfaea21c7e4e630b59ea8260 + 1b839a62318cc4cbb673331dc7783592 + 0cfc43a53348a585eacc52e5ed13bddf + ce9e1c92b88dfec4e66fd23fe9351c72 + e3bea712dd1c622662143b8e8004433e + ce97e902c3715dee2aa2f879da3e3cbf + 3e1c9ab07c8dc70c0132819df608bfb7 + f27d3e0bca1753943855f0ab081d3717 + 170c583133891fcdccebe39968653466 + 2082ad24afd97005427be667c0281a49 + 55a36cdba7ef43835c9bddd4dbfe787a + b562e897a839249ae5a450d954a62c48 + + + fe1953208ac87fd38b65749959a85d67 + 10dddbe23920ca02fa2a4db062f7ac58 + 6a064b2849bfa124245bbbca226f4347 + + + + fe1953208ac87fd38b65749959a85d67 + + fe1953208ac87fd38b65749959a85d67 + 0b7045550738842561216c8c2df954e4 + 787014c2f33b830ddd8991b2e903569b + 383ef978b0b005e6c6dbf7941d3b61f8 + cc1c4b35e947d67a043563282f3ee9bb + 421953c955e81d1eb21e8c0a2d9c03da + + + ec1786912c5c3688391cb2ad0e1b030a + + fe1953208ac87fd38b65749959a85d67 + f05ac1d7bf95ba34b8bcb05d4455d2e6 + be222b1570abaf4458ea94cb18b870de + + + fe1953208ac87fd38b65749959a85d67 + dfe13343f7ef59eab6d82c9d4aa2b877 + + fe1953208ac87fd38b65749959a85d67 + + + 1e22b43fb20e05357eb657e83f27bc0a + d94c380667632be4b5df4d106e39d681 + fe4b8d5fea3d9ededeab5a560238e91d + fe1953208ac87fd38b65749959a85d67 + 3c82827d7fab523a4f9675292f72a0d4 + c7e6f0e7d5f66389d314cd0b353b6d53 + 0cc92c6123cee62e2db015fb06c5fd3c + d58898faa1af1d3312a1cee4fe995983 + 7b20f774533b5c65eaeebbad41262d93 + 7c5b0d0617ce9d4c6bf9f4bb88a5d7ed + 2916bdd0ab40bc45f6cb6d5b99e34368 + b5c6609e167b88da2cadafdf877b40a4 + 9d8cb7de22bcd6b8ef20f937fb0100bd + 4a4a7e1114792102511be096a2978d7d + 5c352f5de6b1681f4c4645d8983fd4cf + 98ce2917ce982f21ce36c6082c6f43e2 + 67d58732b0f96677542204f2befeefa4 + 397754ba49e9e0cf4e7c190da78dda05 + + + 78e7076a22552ccbb0a97e49d1c4c9df + fe1953208ac87fd38b65749959a85d67 + 1defe972659841183b7d82fe94e17df1 + d346014e2e3f2e8cde8d28e86f9b8ae1 + 828460841381470cb2ff1e6bbc6c47b6 + b5964b2667cc56baa39110e8011b653a + 5e986daa0cdc190b94a679c80dd794b8 + db9c86a680ddb1884428d7b8393c326a + 57e3e4ea4c4e266ff226d449ca0abccc + 945d5f851cacc70ebfa84bf0b6361d14 + 347b1f1b6f3084e8edd831762b57e550 + 62628e154908f629fecb76295f12355b + 31bf0153984220aa888c9c1193fd3944 + 403711265ea050145ebe11af26e6ae59 + da4ed21ae22c446da4928ecf14dd3a96 + 8adb5783efcbc834bf8d40a44de4b223 + 38c391c44874c53814e6a5bb3c23d072 + d12de15452d47a714d73706ff7f47a29 + 96018957afeb0847d6f5d961f93bbf44 + b6b639d3042000bca09df1ebded0c513 + 1ba7b77a2905f2be4e5bff040899789f + 83eb937bdf8b71657aceda2d3fa8714b + 7e63e255010982355a19892c0f3d7617 + 510b390674b9ab230e1f79c7e3395dc2 + + + fe1953208ac87fd38b65749959a85d67 + b9a80bc14940e865d108dd7bb7ebc82a + 47ec65eba76e01ae48b2c173173f9c65 + + fe1953208ac87fd38b65749959a85d67 + 8bc70a91b244810d1d97fee8e4889ce3 + 53f878773f388b753faf408e5b1a5948 + 0370d07f3c7fe1703fda28a775b1ec43 + 9e6fa0468c00fb855b578b5c73d4ed2c + 0167b3233dd32bf6305599425cc87dab + b2f8f15e0b73dbaaca52f181b020ffc3 + 53ff67dcbf0e5a2d81ef083d3b65c8a1 + 6df740c8934880a2c00b92e175f312f2 + + + 5119565d69cd68fae2e2a709363f8754 + 3b98e7b96261843cd752c96a0dc5105d + + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + + fea03107508f9355e18d211e14b60cad + + f6950e121792deca7ef48620e884c2de + d6244c164d5582d86f605685cbd29a63 + + + 19b11702a528b9caefd5fff1c05c2d34 + + 242214fc6ce92d6fc575ea8470be1061 + 9bfecfd335dcdf11b9a9892bb45eeea9 + + 2ad6c6a1e97b0964029da96f481288d8 + 5976e34eaf8b53e7d9e0eb4b65646963 + + 5119565d69cd68fae2e2a709363f8754 + ca38bff30d72c7f193be6d1f6d889170 + + + 2980083682e94d33a66eef2e7d612519 + 0b462f5cc07779cab3bef252c0271f2b + 5119565d69cd68fae2e2a709363f8754 + 97493d3f11c0a3bd5cbd959f5d19b699 + 706450d7bba6374ca02fe167d86685cb + d9ee23d59d0e0e727b51368b458a0bff + f7c2b4b747b1a225eb8dee034134a1b0 + + + a282a2adada37bcc8a97c8113733e56c + + 9a7f4d18df0e56262162c5fd542b7baf + fb283cfddd3eb48577eaf8b21b512728 + f2ae59ab404114183a27c0deb37f5b9f + 37948741bc9d4c06f3652eb1e1237ccd + + + 5119565d69cd68fae2e2a709363f8754 + 159e945d92b16845d92b2f8082a0d871 + 22bc8dd093c8ec174a440d1c977a768d + + be980dc7cc6a167f83309a7dae5376d0 + a50251df6c7ba1adff5baa0de77e623f + 5bdbb733b869e94f0e02b19e25a8d7c9 + 372d71bc19b25630def0ac01a5dee781 + d9cbe9cd05a61aeb2fadbe231ca77ac5 + 837204f6de7974dcdad524c4ace051f8 + 3054e703d08a70ca7abbdb2585fd47d1 + a7c02cdf794b838964a8cde667d264dd + 83a0144a86e3e834fe4ab02fda54ec20 + e83870ecea25669a96e5279a31c1f02c + cc1b0a184852e3c17974d19259de7685 + ac45ab7753935dd501dfff470eb0869a + c8150eb4c5eab50339e93422a83007de + 5119565d69cd68fae2e2a709363f8754 + 495b3b9a715253c0ebf2f1b51d608507 + 1b672bf43680761256c778438926d2cb + 49b219bf7f9b92a64b0569466d01e900 + 1b672bf43680761256c778438926d2cb + ff60fa51ea81400f5f5f577ef774f2be + f6988e5da6c3dc27673fc6eb9a3671c9 + 63c3aa0f0a79be61741204f95e94ed69 + af4b94487ce13725a0233a770466a6c0 + e17f96ce6deb99f15d8766416c34b9ea + 08a6b8c14531bdcefc48a4de90d58d62 + fabb0801a35dfb37b94447b53e588e80 + 65b811f9fb6070c0ababc39022d60e03 + fbc2a379fdad6d5a1b10c881644bc5dd + cceff9607d1e52901dae8c6bf3eb7423 + 026e50414101534387230d77a318e6cb + f877cd756629e6927cfcf6dc179aae1a + a037d941bc56c44a9dd9176f6bfe2778 + beda03f937e4f836c37839ae485d31d3 + fe3b0b607938e02605e1df5712ad6d92 + 6f5ed68087cff9df34c15508746cc0ff + 803c271b75b833559de14625373abe12 + 8d2e7f4d0af20d13249a4a9b0e7d33e9 + 89bfeccb9e1f49d8a10f94990a18c0a5 + 13165532b85d74be0ad6a7e982c2eb1d + cd94e25905d9ac90bab221600bf19312 + b98ceb4403a23dff1d2bd22d418317f5 + c4ee4ba0327c02c676655a9817f6a7c9 + 82c1e1501eb8729c5e793728788a16d2 + fe15d7464fbe53f2656b36888105e9d1 + cf53422de6f5f26b111cd0f8ffb3e57d + 59b0f4c15b9b43ef643eefa44b5096f3 + 2410916c2e72b688b0abc4f02660427b + 37948741bc9d4c06f3652eb1e1237ccd + c83e99b6bbe70ef0b7af221cd20e5aec + 36bee00c1eb1d55ab87749cb73114b82 + b6620b6fec0de08af012b92fd2c0d7c0 + f73c751383d433ca5431810f0bc407bf + a24716fe3ee1acd63eefa5905a40165c + ec5a8fe3290e845d5ae7314391b78f47 + 9f61a65b497990498a29fc77aa9e2374 + 8ac7b4472836ad792e57ab727f405f96 + 0d8eb6c2e08e9f781f371ef24fcefee2 + 163ba50982ec7ff9257425d4213720da + 5c4b4755c41ecc36614d7d980a00c29a + eb21e2c999afbf7388071c3a861eede1 + 1f96496da723df7e288cf817079f6d89 + 99925626d9a016a6764e2d2f75f46002 + 4fd48b16780d4850b43e6c89c7b16c54 + af7c6953641cfd4e519f88ff21c58508 + da88a24c8889a688c7382433c3bb82b3 + a9f702e59586995ecc0807d359ef6309 + 5672c7b57bd9817640a376293f83aebf + 4a958f2ed5812e52b4247c1510cb232d + f10ceaa2c3d46b22831322a20ab9813a + 8cc64a8a46d212d714519daa36b0b2da + 9ae1701f36608f88ed5b9fc834a6f539 + c3016405d989acb6dbefb4709c5b548c + b3c69799f78547f8d98e16cc05e42835 + 2e759d753e0bf54e054d5f18da5e932d + 4542bcab2cf49941782484f28b447070 + df45f8e33e66410686cd0479b84e5259 + 54b941e9ef242e8fc28dcde618717c35 + aeea321ecca046bc0cf65c1fc1c350e8 + 389ca666f6d8279a80bf54a644c16f20 + a829a27a44b26ce4115da5050f3a5a7f + e7a5cff3be45f510d4a884f273dfff6c + c0e2196587381c6a484394da90346461 + df45f8e33e66410686cd0479b84e5259 + e1e0734b6af09e824ca075c606ec2e92 + db1dd65f77b70a8ae3afe40923e70a17 + 8098a7ebc7bcaf7494b062faa7b9f005 + + + 5119565d69cd68fae2e2a709363f8754 + + de663784d5a5df82e7eaa13089ef5cf2 + + e6ae889344fcef6cc555ec44f65cb1e6 + 62ba46b8a18410d91ea1dd68435ebb5c + + + 72ea7998992f55a1caa55d28b881b76f + + + 0dc70070234fa39ce69b35454dd1af8e + a9e21031e0bc98828e141adbfdc831ee + 1817799ea02cee7c7ba014fba4d0dfcf + + + 284bad2f8006bffa305083655a2c3bb5 + + + 21d265519646bb65b76f15327f054892 + a3e0752d31d1c1dc868688d5054a4c69 + 010813c4d83667b3e11cd1021c7d1b6f + b25b7156457e6e83b8c8d54ebc84f4fa + fb2632f90d56ee5496271c592e8e1f0e + 4b348c7f822ad499dc800905028c84b4 + fde7437a8f1cee27e6d1fd37eddf683c + + + c491ad4d0c5a157bfbb841130bdbe858 + + 7031fddda596a985d392ee808f81deaf + b0be09bc8faf0371fa9ff12cb1f2d8b6 + bd3c49d5aaf9821604be341bd07b058e + 2781ba2bd86a36f9168fb558812697d3 + + + 44a6f8f207dd6d6e30c01f1eb80639ca + + 9bf890aed54314c60f6e2f136d0c55a8 + fe1953208ac87fd38b65749959a85d67 + 191151f57f03777acb92a7639227ee4f + 86047de20b327af606bc29b1174c4b14 + 66daa809e573b677db0aa328395ea8f6 + a5539d103b818eec724808c16705345a + 083b5dbfb04d9caf23073603382f48ff + bb3ea9ca5921d3dc94bcaf7546807467 + dceed149c2c574c0464cb70ed5da27e3 + d1e1c55e8356c0edf7f795cb40fd4eef + 82166ae63d0b0cb481d001bf9830eefb + 7ee3b648055e97f2f76d8068859aa5e9 + eecba5044faeb63bc25f4709eb3b217a + 3e890b8996aed73a7bcde209a99367fc + + 03554c9c0d266101dd2e4b0aa8425230 + 7116033ecf2072d9f5f263e09ec7d3e9 + 13435ec95cb0c8b62f2551c78b06946e + fe1953208ac87fd38b65749959a85d67 + e971fb22a057c8ec58013edb8ca338a5 + d223ef84ecb16144225340b5e227d67a + 172feca563842b248d779e43138422d7 + 7ba068d09f42de3686e97824366e6c13 + 6f47448212550bd3157c4265e3ebf085 + 89f369588d629240d6a8d4f8788490c8 + ba847811448ef90d98d272aeccef2a95 + 589c7040b025050f0ee83f670ea17899 + a6ffd58f0025b72459fe144ef039831a + 9b1deedcabc1f604f8b5ab3d700b9d04 + 86047de20b327af606bc29b1174c4b14 + 7116033ecf2072d9f5f263e09ec7d3e9 + + 4ae8b7ce594749f21dc384821dc9369b + a8f689e833f36550f5146cec2484497d + 50f285bb23a9574c8caafd6da6cad3ff + c04e8513c20559d3fcdffe6b4abd65a0 + 717e9769504103bcc3f68dc30adf4657 + bbd25ab38b1e7d9f2e96fcf34eea1376 + 16bf69e4b7862bfd31896cbeb9b69cc9 + 61a8b8166e827870530fc6dc3f4ccd87 + 1eeef4ebf9f9806587c52ffc8e6d1339 + 677d4d1515ca73a397fe83ce7925493c + c99e1bca03276f8285846db9f15cba2b + 9514f2e8ee540289b524afff6a708be9 + 319b5951dcb883c18ca48f97e5c400bf + + + b46ff9f5c8bcba1ea3b4b320e22be5c7 + 59b0f4c15b9b43ef643eefa44b5096f3 + 5be71612af754cc566ec30ef200d8a65 + b073f5972d9c4cc1b8ae8e071e441376 + 33f225b8f5f7d6b34a0926f58f96c1e9 + 706450d7bba6374ca02fe167d86685cb + b5f9036bc74f0f4354ea08a98b4d82ff + 7be88e73fea7b64568a450d7c01346b0 + 08952b029e4decbc8ef9fb553cae8cea + 9f2144213fad53d4e0fdb26ecf93865f + a282a2adada37bcc8a97c8113733e56c + 5d1f09efac42da107b9b8544e9b87b05 + 24aab533f87e7b434be5fa5b1684975c + c36b5ac7c2dddf6f525c8d161412ef41 + 97493d3f11c0a3bd5cbd959f5d19b699 + 69e53dd897f44a930525515b99709374 + 55835483c304eaa8477fea2c36abba17 + 39bfea5e86f5f41c9d2896dbbed6791b + d9ee23d59d0e0e727b51368b458a0bff + 892667349c5cff6fcf7e40439596b97c + ae8b1248595e70a828b880b9c56963da + 2980083682e94d33a66eef2e7d612519 + eb24af6668c633feab6bf8f989296e73 + 5aaceea2d60ddb477c6aafc825eece3d + 1c0b4eb93fcf561eec03297a24922d6c + fabb0801a35dfb37b94447b53e588e80 + a33a878f3861ca67e9bc423c58b2a357 + 9b30f13428e1b4a659aeeab4ac1fff35 + cd7296352d159532b66c07d98efb1126 + f7c2b4b747b1a225eb8dee034134a1b0 + bf4dde0147bb02556500d922e2efc90b + cd94e25905d9ac90bab221600bf19312 + fedf49d31f55f4beaf2c891f3875554f + 3326e4d74d3924ee1c882c29f5b571c0 + ec55f263e2b86bc0f28fff46b873d6df + 3343e54368719e3786f78a1b22839455 + 383eba0e55ed778006d76428812d343c + b9968c1adf542baec8d2b298d3ff437c + fbc2a379fdad6d5a1b10c881644bc5dd + 2a9a30e14574c9ec24add2901a80b81c + 5a100916f94b0babde0c92aaa8fb80d6 + ac327c4db6284ef64ebe872b6308f5da + 525074686dfb8aa36b1b92e29de467ac + 389ca666f6d8279a80bf54a644c16f20 + + + 5119565d69cd68fae2e2a709363f8754 + + 0ae335a3cbb3f1bf1c4213c12fc3d8e2 + 10b208b5a2f56b6444156d0d3eabb3e4 + 029b868c33958cf82d285bdf7c06b0e2 + 5119565d69cd68fae2e2a709363f8754 + 3724f9f5377dda29918183b0edfdf9c8 + b8e8c30966a8d8e40ccdf109ea17e663 + 5ef452efe961f7a4a736047efcefb6dc + b4a6d72b647b8b4505d00c80dcf6074e + 7dab5418f9594bfa03cd32b70338de14 + 82ac9e1324ae89e9ec8bbd0e35ee647a + 7c5571c27137abe54b39f7def7b7c415 + + + 3d085d9e79a5aa6e8344a974ca44dfc3 + + f6b4f11113335065935b9fc54c6789a6 + 025270eb0adc3bd0c5ead9fc45ce55ec + f8c799562e6edbb0d0e4485f1781f9f8 + 5119565d69cd68fae2e2a709363f8754 + 03b20899a606db6bde0f5e71aa4d4455 + 521723fb9ebabd1aa21b89842531b04e + 67c402eb068c67be3ddbc3b3dc69c489 + 51a8cc33f42236b576521a2c57fd0ada + 4305a3f2dfd4086035e608958c4be640 + cdfd6e6211de098743d104e4020fc9d6 + 3ea2569b49423955e019ab3801817575 + d7d49f79acb4cee78f3a876411ed9cb8 + aeb75a089d7aa6a12f762c5594ca84a5 + 33b15280c8852bcc6ea1e3d37018a59b + dd7560cb8ac8131c7742e0c9b538fcf0 + d0ea52420f269a5cf65574c6cdff589c + 00025526ec682674d512ea4ffd384669 + + 5fabb1df49289d30917f163cd2856fef + 5119565d69cd68fae2e2a709363f8754 + 0855410e2c412ed9e1990b903de811cd + + + de97cb80a436783b106cd6c583c7d8e5 + a8a653355aef9afb8f682cd30ad1e875 + 5119565d69cd68fae2e2a709363f8754 + a53dc060f8aa9a3a800dfef252dd7d34 + 7f934cef09a2a34b73d2aa7439df1931 + 08b876d75fa8d5fb8af75c2bbcf21e2f + 83b6c66ebb84db5cbd5bb2075e2ff4c4 + c3beb11830a3aae2676bdb9ab00dab15 + 194a50921284f352b17a09dcedd71f5b + 3be13eebdcfbf8dda868714213895069 + d8abe0105f808944b873873cdceaa680 + 54de6227d44381ee56973520e3391e85 + b49303b4610a259c72ec9006b299b5d0 + b6f109f89b74fcd5cf78deecec9533c8 + 1a9f151837568d849ba9bca3de2d5653 + 400f9b789ab69b96725d1cc13b76b736 + 068263dff5746cd5c261274e94e0f26e + 77a602108a9abeeb1b0973b228d83c6f + 0986c48928fa73d66ca490e338d84b19 + e7a109d242603a4f6d13c664c6577eb9 + 703e8fa29ae3add94234e24fe46a8362 + ecdb5c9695737695d6d322dfbc5dee75 + 59faca5c04c0bd33be3c8e9b5f2edea0 + 69d4f41f99b331f43f0bb1d5f86e8814 + ae0e1734dfdb13270a42c24e113629f1 + e54e58423977632c692628e540ea89d8 + + + 19b11702a528b9caefd5fff1c05c2d34 + + df122a81e40e78b1feaa509b559dcd84 + fe1953208ac87fd38b65749959a85d67 + 407628dcdc149d1cba9c7376c27afbc8 + 7b96f445b6efd0c5188779b58ca990c7 + 70109233fc8f60de2ae6475482aee02e + aa3b376db0fd8d5b7db960dbad02bcd4 + + + fe1953208ac87fd38b65749959a85d67 + a91fe2f1c95b5f7e6d3aaa23feaa9c5a + bfe0c857bf575b485017342fd450f028 + 155566c9d8df72497eb15d6fc4b4c909 + c6485c5cdfe7209257037bb1fe0beeec + 2fa8a93e7565659f7740e693ded04b7e + 6a7fc884090d732e216c762e28c362f4 + aa98f4f58dc99614023b9a94ada0e077 + ed7b6f48c0875019df21985484ac3319 + d6d61247c46f5abb99d55af433825ab0 + + + e89cf8c048818977fecc5876db7d9324 + + 5cbd9ed72043e13491d9584c6bed5b1c + d2eb7cc1c9a267efed34fedabec65a9f + fe1953208ac87fd38b65749959a85d67 + 1c7ab3b18895dad2de80f0dd11d13577 + 0bb73f191da9ea556ddab98d304cbaed + bba5f6a9596f281fb10d6a9ebd3ef713 + 3174a3a2e7c8cea49e4b840a337ed63a + 332c465a7629b3cc83acc4a8c0f274ea + 1ae5e672aaea920528aab0739d2ed229 + 275c4e307297ba9778d6ba2d89f5a3a7 + acd682b8ba059b517ff303544b0fbd74 + 511ef144d13c90079543ea9bfc8438c6 + 0e28c7a54d05c5ea46b81dc97e8bd269 + 2dab79127e3b0e124855d44007df87da + 1202cd3d2b9febd0a06415654440692a + 31a1e89d24ab0cef74c63cd3f1293ce4 + f71273a12f13be603032bf9aa4aa9c1a + bcd1ad55545461b6c925dc295394ee33 + d9d1e810eff80b30acc3a03bf346820f + ba904f1e34996e18e5a7a13f2e985e20 + 45ee1b1cbc84df11fbf2436677e469f2 + 6fc90025fc80e49fd10100ee8c689c1d + 66f433c4f488d5c45b4e545ed4cfd941 + c69006872765382deaeb6489ad928efb + 88e9a7b563aa11357d7bfc114708b139 + 6de6854a356f52a6fa7f939c87f137d0 + f284d54e569eba55aba017e4807b0820 + 058b36cec876e55731f05b7cf0e43a3e + 2e5691a641664c540d3e7c84584b5989 + 89b5b2da895a9958b511c6cdedce7f4a + + 6c2ccf729239525240cafc01517920ed + c1490d39a757b96ef6975d6321762922 + 6590fbd55bf1f2dca61286298cfd844a + 3e78b2474393cf35e6a455f16d1424cc + e2ec2548867e331c64b7239268f50ab5 + 4a28cd921652cb9fbd90630321b9b382 + fe1953208ac87fd38b65749959a85d67 + 0b539e1eed96d5f736633f687fa0888a + 19f6867cb5370f5c4eecea8bfdcd3025 + 06300ec57ca2ded277884e081404799e + 339deed7cdfe94651f37fd7ed604c29c + 0942822b0a9563b39b793d9ad3dce92b + 0772388431f540b03877cf5519d7a3d6 + 5c04eab75633fdf4e67d83d5078458ec + 533295f7bb62e9f31c7f72481359eb05 + 01095eee2e1ebf9e056ab5aed5ca9098 + b28f0932f3e1506171d160909d613940 + 3896b6cf92b9bb38fc885317f61891fc + 647cb7e681e41ef6b8bbf7292bb2274b + d271557254066a0f8349180f468e6625 + 6d4ebb6cd5e92fd296d1949d8400c5a1 + f4cdbc3c7ead8d0c311a4fcafe47e631 + 552e6c117e2d19f0a23a7d8df5be30f7 + 24c93808be39b840a66e95bf3fe89ed2 + a939a4e57a72349c56fd848ce0176e64 + 56910d1f4d74b59b7eaa10c1068e1f40 + 5858acc69e250e796b6cb6fedca7b443 + 04710f870af2f45cb0c554cacd945418 + 1486667c9ae4d2c01024b547f8040c28 + ee2d8a1f5e2ef751208d18969e6d5603 + 212bc776118600857c586a88fdd80659 + 530923b1f1fb19b969ab9d70531102d8 + 3577874a42c6fe920129f07eabca106a + 4468fd55fd6b4a6a77454bdd89f5a0dc + 48c4cc4bdf27c622ee44fed95e5e3992 + aaeafcb6053963a5b8310b2588c3547b + deb7f54cb92b0d574fff75951bf20b9f + f79416f84bc465e663e833fe2a4ea772 + 0dbf8d88d778d606b2bbc10db80576b3 + f9df75b0ef43a1abe7aadd9dfea9c8ec + + + 5594237226aedfbca2fa1c7f4604c214 + 98f52139f66bcc2166f89967096ec5c4 + d2e25b243ec5c049cf838d3bfdb3afd0 + fe1953208ac87fd38b65749959a85d67 + 9f5d4bc6fadea89328d2aac26574a9d8 + ab5a9e8388563e097b5ce835601f01d2 + 053aed1a3705922cea94741681034652 + 7107e80b053928271d5fcf422dc29490 + e95931566f6fc6ad5685c4fa9802e206 + 6feef4f78467ba753b8d44b14b99cb68 + 0a2608d157008ac6e08f52bbfab362f1 + cb30923e6315eea41a6fe44a469714b4 + 39ff4f359a7b81d6585075715f41e5dc + df48a24cad040db1312f0852c164e2d1 + 9277ab6964a434d499873687b00be906 + e4f85472a1f6ed0e23a473b8e00ef071 + + fee5e0aa564c6c7c7fd61c68a27134dd + + 70810911738f2b8b5c4d7ac825b13b91 + 91ca0d024c9bb37223b1f645ef131bad + + + 53e948eea283359edde30db69ec9a6fe + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + a9e2a0406d1c87a56aabc2b430f34041 + + d9be4ea93190edf10cfa12179a2afb1a + + + + 2716c23368068ddaa60d0eb19cdb1db9 + 4332b440877351f5d72aa1a5885be0fa + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + c1315c5516e42d8a25733d01a3dda90a + + d9be4ea93190edf10cfa12179a2afb1a + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + 48347b8026e08a94dcd9af9ac9d2e034 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + 6be5ac68ff0dcd8f56ffa8e217fe35fe + + + 2fac8011511d2126d3c1aecd21103d6b + + + + + 5119565d69cd68fae2e2a709363f8754 + + + 2fac8011511d2126d3c1aecd21103d6b + fc862ac272fe391e9597c5ebce8c43c8 + 9116781e34cff42ca71f93f11643348e + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + e589d1afd6240948533eb69c9f45709e + + + 70a381bd48e07b23178b331946efbe57 + 9d27fd0a24c93e08fad8c4a03dd28b2f + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + 766d38000664a0905e1e69c4816272d7 + + d9be4ea93190edf10cfa12179a2afb1a + + 9c26fef6dfaaeffb395339b3408e4e8a + 5119565d69cd68fae2e2a709363f8754 + c07462543a34f0b38072c399498e3561 + 482d3d1fe860c437afafcb13d447f244 + + + + + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + da85a70229707f330d0ecd97233be951 + + + e8d87e98b017a38e1045f3045495e073 + 2716c23368068ddaa60d0eb19cdb1db9 + ef8d95f1f44a24a494422b3737f587be + 2e09b11994f1ae2d973d9e94c3e1decf + 793c2f4092882f03c1c343f73332f8f3 + f97fc490deb99c99e15864b8935c2f1b + 49afb4b3f421270909fe1ef34a7acf95 + 01400c3fd2914061eb83ae92a22a3b94 + e7c8f0b780e7c218a777d1f329d94bf7 + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + b0aa2a2cd5e7e39111524a292d850728 + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + 67ac1a3405e0a144774951db5be299b4 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + 6e2135410d15082ec7185f87c4b19437 + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + 876d5e1b3841d4e96a72189e756761dc + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + 52636ed67e01e520a0b43e4f2d1d7b5e + + + 2fac8011511d2126d3c1aecd21103d6b + 3b28dcf81ab19e8a8d407c83c0b8a219 + 92b4671f2a159439d8fcae6f65101dce + 145aae420ae61e5130f53b7f5f67831d + 72749be82a8faf8e3712f93c4d2432b2 + + + 311b11c29a68fd17f613b6eabc9bd418 + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + 499998131303d0d69c01dd3e9682334c + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + 70154221fbe370dbc311ef135a8300bc + + d9be4ea93190edf10cfa12179a2afb1a + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + 0526aa076b2aadec4d0003b3c81409a9 + + d9be4ea93190edf10cfa12179a2afb1a + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + 41fb2995f22e1dd0a6bb49b91ffe9791 + + + 2fac8011511d2126d3c1aecd21103d6b + e69f1cb346c37b54a552410ba2f2c3a2 + 4e6fabf00d3cf1b650820f6c8f9a0458 + 7a912dabc7c96729a6993e440bb6ee20 + + + 2fac8011511d2126d3c1aecd21103d6b + 9cb3d84dbb4b0d83449b147dbe70fa1f + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + 68028528f95220668d53f15f03542056 + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + ef2e771d520c790cd480838cdde680fe + + + d8e8ac3fac3947776bec2e8b84a71bb1 + + + 2716c23368068ddaa60d0eb19cdb1db9 + f0693380dded87cfb62a689b96408cb3 + b8eb4d2aede1fe7af17894ff76deb435 + 0dfbaf9222a9455b040721a804868b5f + + + 2fac8011511d2126d3c1aecd21103d6b + + 2fac8011511d2126d3c1aecd21103d6b + + 2fac8011511d2126d3c1aecd21103d6b + fc34e5fd15ec2515d49c01311201e8e9 + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + 2fac8011511d2126d3c1aecd21103d6b + + + + c8fa77087db27df0d813c3c8b11d5038 + 99c14dc6365db819d75568a824e1f5ca + 068cc3c5e5da1c58761685acd0a99b24 + 53b46d7ba3072928132fcd91e68d46a5 + b33d623d87fd429d9479c06266533ac7 + 96c62295d652f0b94fe4e65fa2e2cd9e + 5a499b6b2620e8db573a98f6d4a90506 + 2716c23368068ddaa60d0eb19cdb1db9 + 33e0dc6dd2fa126567b693ec267e01c0 + c058d799cbe5bfa1789483614a44f2d2 + 4091337dda2f871e12fdd98d80c01744 + 4b2567f6ef94bc13b8b09247f2dfaf3c + b8a71757bb803da41f8fc59dff1d374a + 433892260f0be2e21169d09b9724024a + f6d1b61f9648bcede7a6ba17b95417c0 + 82803d2691aaa35db2769c3fee1be9c5 + 6ded92f2e3e175522962bd0ff3689b7e + 1b8b9b643bd3158c4a6233d98d7beeec + ae93fc446ee388d8a5f6f46199a6e922 + 12b81cbfb6c11f8cf530a30fb58a728a + e0586837945fd02a86b6443bb4866e5b + 4233bf07a593f8604fe138bad6452c54 + + + 2716c23368068ddaa60d0eb19cdb1db9 + 6676cab4e915760b8257f4b2fbc12b91 + dc7e95ab1f783b038ee22558bc36cab6 + + + 2716c23368068ddaa60d0eb19cdb1db9 + 8f78498bc0eb25505ad3f7b0bc489aaa + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + 9799d94a6d3d6df267c3e9a6914520c4 + + + + + d2343b8033e137ee7fbc5b983fe9489c + + + 2fac8011511d2126d3c1aecd21103d6b + 8cf1e9ddc171be4760c926cad634f0b1 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + 674c3d61283b1290ecffc8029932fe68 + + + 2fac8011511d2126d3c1aecd21103d6b + cd40884f44043740a6252741934d78f0 + + + 2716c23368068ddaa60d0eb19cdb1db9 + 9a755080cadc6013fa019077b818aaa8 + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + be26648238b5aa60260af073212cc2df + + d9be4ea93190edf10cfa12179a2afb1a + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + f65d66781e1cfa77afa334ecb6e354d8 + + + 2fac8011511d2126d3c1aecd21103d6b + 90b8aca0a5aff40f1edb7c65bc3916ed + 55c4392da88484467a5dbe02008d593b + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + 0a1e23a1eab62d142dd6b982491d4161 + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + b7a57661fa8d4d51f4b4ab72e4912e35 + + + d423862b6bdf31687d44facc12deb5e2 + 2fac8011511d2126d3c1aecd21103d6b + 2b08b32439c5cbc2aa0540a678469070 + aed118d5e36c45c130f89b9ccc4aec80 + + + 5119565d69cd68fae2e2a709363f8754 + 4e6bdc7870c40180a946e8189a28f29f + 9eec9ef479a1ca3cb95483968254f0e7 + b73cfa9326ccc238992dfcc36c8adbcd + + + 6ead1465c304671ff7c0fd5f7c500249 + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + 1fe55f0a8e6b363adb08958fa0c4e982 + + d9be4ea93190edf10cfa12179a2afb1a + + 82c39ed391903e8ecd67201471dae068 + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + fcbc1416ef68faf249027470895803b6 + + d9be4ea93190edf10cfa12179a2afb1a + + a06f41b9e08eb69b6d53cf77e7b2584c + 2fac8011511d2126d3c1aecd21103d6b + + + 82c39ed391903e8ecd67201471dae068 + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + c80b5a98c33e45b7a89dcb4d20bba044 + + d9be4ea93190edf10cfa12179a2afb1a + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + 8b337790f09fce7efd55708cb0a7a335 + + + 47d4c7129cf20356fdeec459288ce65e + 5a09cc4ab91b27c2d2c3933fc49c4836 + 5743f9a577a562f9c55921bc5d940a63 + d95085bda08f284e3fcadbe4d74dafaf + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + d63775580452d508979fb66a26a2fd8c + + d9be4ea93190edf10cfa12179a2afb1a + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + eacaa13b06b66ed68c7e2b648092af14 + + + 2fac8011511d2126d3c1aecd21103d6b + 2a0a836ba41a777dd34d7127e4b769e1 + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + cb4835ed9448c1d909dcb49b36fa5858 + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + af145e05adcae2834fc4705ac07d9b94 + d9be4ea93190edf10cfa12179a2afb1a + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + 5c6e1679811f0edef0f8db06a7604d3f + + d9be4ea93190edf10cfa12179a2afb1a + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + + + 2fac8011511d2126d3c1aecd21103d6b + d644f7dfb48d3868bf0ae5df30db3096 + + d9be4ea93190edf10cfa12179a2afb1a + + 765aef2a95de6d5015ba1d097f8642b7 + a3a919ff57a12dda775581d9350f144c + 2fac8011511d2126d3c1aecd21103d6b + 04279c6964679a26293aea97e1b60a8e + 1a93c9f75daa36049e5c8cf63ea54872 + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + d9be4ea93190edf10cfa12179a2afb1a + + 2fac8011511d2126d3c1aecd21103d6b + 18bff4ff7456a518941ea896f5f3b583 + 24473ab4c88f4c56396233d1df46339a + 47d643c2623237edc38f10050111f1c7 + 035a8b3b9fd0bf3ebfc73aacccc67dd3 + + + + + 31d2324f8172c69bbf791bf0b357413d + 35f5912f1dce81dee85a5d7f1777e19f + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + eb496868156d6e2cc9525a6e224f0d97 + + + 2716c23368068ddaa60d0eb19cdb1db9 + 7355149442f705b8664cd804a17185e9 + + + a3384afa342e79459c1c0e8a4189cb49 + 7447ec15a86d904e3457dbd160796cce + 2716c23368068ddaa60d0eb19cdb1db9 + d2b7129d148e83bc8d3ef5eb428c0e3b + 7279c8b7fc0e6f453749d015da47e13f + + + 49bffcb70b17f4242561484411a40a37 + 6d9c82ea3e507097f4de2e8da8cc576e + 2716c23368068ddaa60d0eb19cdb1db9 + f6488a318256bf777ae789df8e06f1e8 + 3f3f294ae8b701e5dc0be60c3fb16d95 + 90988a366a31361850ee930fef10cb25 + ff35096988a9946acf37206b11699b4f + d718dc2c7531fba62d8d428fedcd586f + b09e1e0b8f8e14f19d17c0b4933bb5c7 + d8d35850bff96b42edc58743904d5f36 + 973469d87b2d8a2915a8505f67228885 + 6154f9f7980fcd003b4caf0d116edd31 + 25d57d91df5a12bfa4971cdbcb54faa5 + de01838799ba12cadffb6c116e6bedfa + 94c9f099ce970163db6b80ddebd75392 + 4606db4c49c1ad5fae8e8e57277607c8 + 8bbd159982c4294802af9ef56e3f786a + 54c953c53ef2e30749b6b0ffdcafe265 + f6488a318256bf777ae789df8e06f1e8 + 47d3260bf3452d0b8da88dac6e08d74a + + + 2716c23368068ddaa60d0eb19cdb1db9 + 2684ea1f19a22a7c2dcd8cdcfa30e444 + c0c12c8292dcbe1fac273ab63aaa45c8 + + + 2716c23368068ddaa60d0eb19cdb1db9 + bacd1d78c313a8bf693176cc1ad7a5fc + + + 2716c23368068ddaa60d0eb19cdb1db9 + 9b60513dde139244ba8d1c4f754f1132 + + + 99f434c0346542a4828d96d604f2ba79 + d98c58f442f560455018550a05e7f33a + 2716c23368068ddaa60d0eb19cdb1db9 + afb2840ddd332c21421fda9fc5f008f1 + e9112fdfd2d7b2838215a9e6c643bd9f + 687b83e6452942f9824705e74cdf7f1d + 0bd05d85f24e8ed1f5826a60143016d8 + fb9a6a9971896f43ed3ded6ac1abaed7 + cfd248c0c869b753b8a135f4124639ac + 7fb1807e730475e4c39b54f95b3f32d5 + ad797d0ae6b47ba1727e9e87af9d4ae4 + 527ad95bcbfd34475b7a44b9c5715e3a + a16a8a03b47d0359008d813c7733b8c4 + ecffc2ec26081b6b30b72e38a28b4bfb + ab554f106733390bbd39a113e8fdc194 + 45bba654d2903d4fe68b3d33d5954207 + 6689ca4605a00ec44da61bfadc311837 + bb357208997fef411d3afb77b885bea9 + 15f17ef857ae1f105d4c033124cfd3f2 + + + 750d83377f5afb49adbf86e723b771f9 + 2716c23368068ddaa60d0eb19cdb1db9 + ee1114d7a99899cbbf12550da1254c96 + + 35610cbc8d7420766374e0ae9d3493a2 + + 2716c23368068ddaa60d0eb19cdb1db9 + af191f3b347845a1088cb32145b7104d + dcd6644aae0f349634e8ec82b01540dd + + + 2716c23368068ddaa60d0eb19cdb1db9 + 9d3e97b288d7b4957cfb4a90eafccd16 + + 31d2324f8172c69bbf791bf0b357413d + + b6676cf5ca981f43ae08fbd48c009ace + cbfac1e4db88f71be0a9473dc702a52b + 703fa24d68f0b6bc2d509c62de637154 + 5119565d69cd68fae2e2a709363f8754 + 35931763a7b358c607dba1682fd2ad4a + 759e5a490753934c5023e579feca783c + 79fc154d46b9df286b41b1a10431396d + 318829573cd3bb0c5cf03c7329902efb + ef14faf3da5a27a1fcb1aaba5f8a39c9 + 7093eaa81e07ff09925e5e2cc507419c + ce3ba711786a91462c617bba866e3b1c + 10879ac83238eeb4b2a13413a2db9ada + d5c69560eb5e621b21a0d0001f45890d + 942b821db27ae053bf7111ff01e3dbff + 7c3ab715bd87f9db2280085ae4e73409 + 732636c688453a4c1a3b9696d811c427 + 4b3d58932cd4edc23a9a1dbe4ef11a7b + + 693a0b6a420b42336f5e7c9d861282ee + 17ab98eeab1489e6a588fbe398377168 + a5c78af6d889c8646d8facad2c13fbea + a1adffe1e677d55b70e802f70adf3a27 + + + dffb55938a68cb2fe5bfda06cb50aa3b + + + 71be49fc99acedc5adf2b1f54fe9a90d + + + + + cbef378fbca39959d40e71f89bcaf4a1 + af0a4baf49687ff353d024c179ee8570 + 1fe5385a16986562effd6ba18ffb3267 + 018a0fcdbd0935e9ae224d74863578c6 + 1fe5385a16986562effd6ba18ffb3267 + 8872a16be7f28f295561dec6ede0a74d + 8d88770233e0f2bd9fbe9dd02efc03a9 + + 3a26d84f86351722e5ce2fb22e12f712 + + 5ee1c4f1ee62752988f5550cd97e557b + + + + + + bdc940591853abf1a3971a5ab0424b2b + + a2592f794295042fd2107971d9b75940 + e191bb93c3108af2b84562ea9fb22fe1 + + 4f29875d10f7e82dedab472668941b91 + 734311a6a433c92fb6f5470ffd3dff69 + f6a4d62369c7df824d5ade899392d343 + 6df279611334bbeb05178becc0d685e5 + 767605d6d9f611255133f21452e8bb6f + 14222fd23869f01aeab48a0b3caa4419 + aadf93ecce72f960dec426399f03ad1a + 84f724cfc5b6714c530f0c3e72ae9af3 + d0f453d18577c060a9ef269739962176 + cfe13575581620d7b6c0c393dd63ec01 + 919c318566509ee5f1a3c19d5b007f55 + + + + c468024a8552bc0c7a770cf89726b39c + ffd16285a6f65f6068561ac7e842ed61 + + aa6ef7f39052d0f60b8ea6620f3798be + + 919316e03e6b232e9fc4a5c8ba68dd08 + + 1768280ecf93c5647b0f1e1f44a7e695 + dae74628685222dc8327e5c430e3ae24 + + + + b9ad40b120e4fc04c6576c7b06263c54 + + + 5f1a6922a3098f07069e1fe8809a0875 + + + + eff680a2881772f7c7485010e7069ec2 + b13a1f50590a75942d40c9f8343aede3 + + 3967aa72e8a06fdaed553bf671c65335 + + c568555fbbb868e1f4c6702d2bc8e322 + + + 092cf99ec76fe3cc62c2f31c12bf44a7 + 5d1e4e9fdf87148b6f4cd7018c4664dd + + 8793126177d3c6cd245bd31e4ca4f71d + 15a7b02ae7ba87c8b68dbc08fbb3494a + 7c18f282fccf9a680592b1838fdee3b3 + d5d328846e8540d9475e88e0f02c0d26 + 3e115066a7496c22000fbd6d41938ab1 + + + e29c55300eed83f11bb2aca168af9db6 + bed262e84d550bb58e255942fc74f24d + + + 252dfdffe795b313163b652eaf8cd4e9 + 76d86b76eac102682bf224a001e53d20 + 2daf4266559baacb70cf24d210ac2771 + d43dc47660d30def6b8b2ffecaedc265 + cd20a20604e84dd269d70ea30fcdf829 + d4cb325cf8907945b3c5eb8a84deca42 + + + + 7269f25a7f5c06dace654f5e9a12babe + + + ca2e47fadbe1528e1603b18011c7d1f0 + d32bff482a930b0ff712324f8eeea8df + 39835268f0a7f3b039f86855c4baccec + d11adf50848e1405b750c8958f52a34b + + + + + 7026d7ae8b51b1ee6a30ca52186e17c1 + + 120076a9a42030704a8e988ca2c3905a + + 8f449e2a1f297a2ef1aca36da752c116 + + f339b941dac2235802521786a7a488be + + + 82c99d1e37ef5140581e2910be9e2854 + c498f3e4de6104e1f2aab032ae22f054 + + + ce5ef03f9759b04469e06194623b7458 + + + + 72c8a000ed069464726b3bea47f4effe + + + 3208798c80d97bab229b1a017a93a116 + 0e529df159d5d3dfeb61aa9bcb17077e + 6939e415e4567ea3154fedcee89353c7 + b5654551bc45164e7ea53f112dbd06ee + + + + + 77299933865f4ebc390fde5207dc9731 + + + 545e7233fcb1c50da3f077acf1ebf67e + + 7ee7798884028cef35b0c5465726ae97 + 4e428046d490a6caa960fd36dce4f1da + + + dd61346b1b7e2af2ebcf53e10bf212da + 8f46154d827d5367cb36275ce468bbe2 + + feaec7617852e0b1cb4f72fef0dbcb6f + 34f6eee8a49ee647613df49ebbec2876 + da30ccdd2e99e7fd6d81b035b5e8ad6a + 2d321882157e5c29ac67f9e064702e72 + 4586c5b7b6e3b1645e1fcb35503c4260 + f35513f06a3c7293a89f8ca2ebcebaf3 + dea30dd2b4c6937ccfe186d15eba2453 + 7ce25e1f7fe2de6cb161840ae9754383 + 806bc0d73b67e3ec851b11ab64a10e10 + b826ef6cd4cacbedcec16b9d7be4058e + 372347db9397351d2795ea91bed50952 + 6e4d9db5c6510c3a17636ad023207b75 + + + 40a770b82d7bf01926ac600d58ef14fc + + 5b4eb9264b73839e7dc18a18b570e74a + + 2472e0d2fe9f791350eaa92dba463f94 + + + 2a5265a60cf804c10f4b4bb49cb7ba9e + c3833da64ecceaed6df456721b3fee6a + f15d9315fd7c5dad3397ada1d820eea1 + cd54b45189bde5c68f878c43018f4ca1 + 4c95dc8b6a7a31bb6862723139ba4639 + 9ecaaf3e7982dd36e237f0d4dec729c7 + decba73c6f0d2a2e898f0973bb9ad3cf + 8db39fc4eb34cc55d425afbb4e712a1e + 91461a72e14cc8cef094b2c724a313ea + ccea7dbec04e030c7515e538e82f46c1 + 13a5561a3897ac2fc87de2c1465308f3 + + + + 03b2c761534c78a954fca61a01a89cc9 + + + + 614c7e4b463814774d209c5809bf32ef + + + c954b502d1e091b12a01b5b72962b859 + + + + + 23d198bd783557e117456ef9b74d0d51 + + 01efe64a97583c8a233ecb381f794ff3 + + 70ffd5d3d2202afbb9b423729702f83a + + + + + + 3e78fc48addd9355ff66722b57e6f703 + + + 0e95c0f14aea68d3869331d784665439 + + + 97f36493dafed70deeb41115006e3d8d + 48b605774e5b689afebb2ce54fcddbba + 7797516367122e1b2dcbf5758e365881 + 0191c1b97648cf7bf0e701b87bea70da + 017cc71852d792d1ac2703e3f56b0ff0 + ec2934e3df132aa58692bb2223843155 + a5336242614a2b6417043d4fef1aa355 + 1c68cb8c2f9fbb2f0834b27e96c7b77a + 0ece5c91ab578bc41ec5357e7015ab1e + eb428c2d52bcf84a2277089e503ce28b + 66d78bfd174a8d94acd3fcfe6861c358 + 403ea79b7c57b1032e9e914bc5546670 + 7d46516a207686f044b63c0dd1555800 + 34fa4bdd5ed7588c8dc3f046b4ae1c5d + + 1a82ecab4bd9e13768a0ae255e2615d9 + + + 3fc19a87b2e2eb8ef28030fb4b830c3b + 7d8b140e2936ea7a48d92ac6ee0627ed + + + 75136fb10f08747213fa50c09144de37 + + + + 3a0966a23a23dcf50da9c9f6435ce48e + + c4fc6fcfd37a19cc669197eaf9be82f0 + + f772336f5d7335bd3d7e9a05561ccad4 + d33b2ad7a790ea4fa13baf7e3887cc6d + 9cbbe291ed11a7b7c48c277326802188 + b5770461f3ae6378443d5ef8cf5b81ea + 3f12ddbf0eda1a7e608a2dd00acf3ab9 + 350cdb17539e75eed87be55a34d5ada2 + 9c5b3bcfce93f1c96d214bc0d6a51423 + 0379bc109b78405eb68dcc8f9a8eb3dd + 03706e3651b53a9ae8fb1f6602fa884b + 697259dd32c3eec4fe21e98a46fb8823 + 12d702207ad394c0a4623c509989564d + 9fba774c4a461037db537e1f357a9d1e + 6445f1ff41587efb234f387e436a6aa6 + efc1c55b52fd4554480a69f52e43645b + c848f36250b745f256f69491025cd860 + fa09b9320badc9d365a09ef06fa890be + 6416d1170d3083f6b3939c412c5a074d + 220af7222b47919238749d960c660691 + f35c68bc30e4d85b73070c93cb878746 + 9b7b3e6ae3874315b98193f8fa743552 + 25959b19505529cc01de5aa7c79ab5b4 + 28e67c91edb0b981604350dfee9c2dc6 + 3ea2acdfaa8f4e1515306741a3da0d98 + 5823ae4b09ce346be57fbcf6e98e2684 + 43e25221a56a2718a2896996e65f1e0a + 989e5b7d15a4f1a28deaa0da24e891a3 + + + 8fea5ba9c4ea790b973f820b27b5df41 + d1af58aab765178a491f649b46d0cd8e + + + + bf9c7e9ee1bcc1d68cad30d5f1ce1c3b + ce2f42f8795b99744a960acf6ec96e74 + 2bb826b9e6d8fde5c7a6eecbafdb973d + + + 618ae1cb962bce97f1288e1f38dc80c3 + + + b6512c8809768ef553cd2b6670bbac17 + + + 2cea11a4746097ebaba08ab931dddebc + + + 186c3060d76e0a674b540baba3b2e466 + + + f12a76bd25479644bc89b4a27f16a864 + + + afe192fa56bbd56c22dc6974ed387aeb + + + + c4062243c4ae5777473867aaaaacbff5 + af2ef97f8765967ee5f14e5ef996403d + + + + + 70cc32636d26340f68b0c2f1cef7a9fe + c5fc48544f540932e6dce6e8a33f54f4 + 7404950ba35bf3aecf89539cb78ee33b + 045d4e9c37f5b30dad87fb89226c55f6 + + 563107c1259d43ed5be360d08385133f + + + b3f0e7c58c1665acd350184061b4d866 + + + + 41fafdc475afc2fca936d261881b209e + + 7b80dc1715a76108ffa1bb5b5ccf994f + + + 6faf98c9048b1139430a91b28f241f7e + ccd4b21998fa18fca53566d97bc0cb66 + + + 12d7047e1c48970a733dcb20cab94985 + + + + f038e1638d420d89a0287b3a351b0212 + + 18d196b228a9b6b89f49c3d73c65e25f + deb9ce2b16f73d20830c569a709c4d1d + e922fc3ea1429863ba63a69611c6fa38 + 9d781028c9c4a782b70120a3a738581a + + c5bcb86ac86e3bd672819ab28931844a + 4895ec3ca4030ca9c5c9c428ac7a662a + + 25a5ad02efdb0082438da1ad65499ce3 + 83f1a06ea2fa63597911f724583c6493 + + + 40d8305131f76ec29b63e5b06ffa15d0 + + + 2de04dafc48aa50bbed54502c8c98a71 + b726daebdc3af1d671bd9369de4a8268 + + + de505532fd9a0b1c0c578962c425d925 + 35bb217414570a56525803f64e4f7c96 + 88a67c311b118a142ccf8ef5ff475808 + + + a2955c099008f2f4665d740ca04c8c9c + d33257d8def7a34f5b6779dcc94a8224 + c8d3b81bef52d984bac6cebf4108cfc1 + f00c008f70c531b504b96ad147ec95e3 + + + 4b5f3371de6754f63fc0b7bf9bea7530 + + + 2d94912d8a1b657da319401edc606943 + + + da338a2200d5b2298e038748d5c465b8 + + + 1c54f0e831a97200703a199343262478 + + + f4067872ceecd11bd42ec5bc548f6d71 + 6a190dfe74a104c9ae523588c5d35471 + b3154183ab7c18289f5bee1249bf0569 + + + 66ef28255b68334be023eef477abf9f8 + e8e371ded9e1e1975360f64447d2a14e + 1bf8203a4b0642d26012bdf941bc5ae2 + 5ef1c118d709716ae7141bd4034e2867 + 11beffb07b8900d159b5275c799863e7 + bed4fb49115daa0815d2f583605f9dad + 16417155f97f3c7cba2149c3fa267d64 + 8146602310a1a6aaa0b60c0ec33579ec + 3e01578d5506bdce1c1d98d94757f39f + + + + 74b89e4795a99537585272f5a1f82024 + 8d800d8a307b372b7c12b1fa4a881fdc + 13e94119431145ff4bbc37ca1452e5f5 + + + + 223172956260724ac90f1f3f984d345a + + + da2dd5f6361f67a4250e6b6c6c569f0f + + + 21e0f824c7e5e4e972d0a6d91f1d92b3 + 7cf4e48da0ffe7f380e49bf97d38a70c + + + 18fbe16617a2897d4ccb7c88ca0c02af + + + 3d457b57ab349972c1e6832f217b5527 + + + 2d3f02d8a95fb9a3b53b9dc781b46824 + 0c29f16c6ba0e6d859a6a0cafbb86852 + 0866d12547df1d6bc12b368ef9d2e577 + + + ceb314086c0a28c004fdd7700ec10d02 + + + 5e6fb9f0e92a7e1f5c9ea47db5f9f5c7 + 1ff9b5ae94664f4abf1fb2de24c91a5d + + + 6da956220123bbd2a9f5eb779393f4e6 + 1f162533279b813d0517f59f7b2ecb25 + 97fe7bdff2e4227df64ec8f9b4cbcc63 + + + 97309ef908826e9320b264f63cf8a2e1 + + + + 1dac4826b1a6178e01dc813fbdfc8d51 + + 253d231d47bb3f3dcc882069531efa79 + + 8e8ccbfeee84bfae41ab173befdb0102 + 673d1299fce52b564bce6dfed7b40c38 + 8da5ebe90737b53b0a6c4105f98d8788 + 9b3a056813b897bbabc9fb9ba9addc3c + 045373d89b30e2a99718b06a221b8780 + 96c2e24b514fd104fe1edecffc7c80c2 + c05efd46c9217ff37e096384ea6f1032 + 87b894cb017dd403fe777e57841cc194 + 1da443202d6d920f8bd32b28178cd1de + 36a2515e52e5cf769993ccfe25b9ee5c + 2579deb4de58d5be6e35fbeb4eb070cf + d5349771e7e47702d3463bc1a50c2bef + ee62fc818cafaca86e9805476c21f1b7 + e1bef8b16ce917175d7c2241b63753e9 + 12dd18588882ae84b835134114ff5b0b + 2b5ee6283a38b58a4189846f17778df2 + + + 6c7d9921447b34700ef10dd976207d29 + + + 657e50811ecf3a4707fed865ac78ad85 + 9c19c0ab6ceccd297be39f74836acba3 + cc452a6439bc215040748705665f86ed + b0c9f7e0af98c10229f0ff0c6fa20c0d + 59e7866c5b3b94e945e113a40addd7ee + 900ef471457e55b7bb83b26aa4597766 + ba595025d839ee49735cf718e63ab63c + 84354a53397f8ae531ba88bcc892e03d + 552fe6b6a748c123eac328f6a76fc36d + 2cb69aab71818f2fa109546ac44d7140 + 02352fb239d7d72feeef831e8759e74a + b3fb59a45e9be5e0a1ed0ec6e7f6b243 + 9fd552e691b704bae5d0f9d54a37cabf + 0680ef718990604605cc9e160dc0efda + 650a454bab0ac8e455661ef0e795d274 + + a61f040dfcd0a6ab8e929aed859e0078 + 36037a2db4bc774f84352a0e11fe22db + 0b273de0a0dade5af69be83cd761fa6d + 9aa179fa60be897584330d9ad598debf + b3998db48948fea899902729ed2fdf58 + 8abbad35606ae2360b00c1452847f191 + + + 9997b5d0ea0ab6a6ea56083cc4c27247 + 39c167c18ccbdb67e9a684b1f09e071a + + + 3593d823bf839faa651dfb297527b888 + + + 7f2c4384ce21540e96c9cb5f775c678c + c79a4ba99ac022284ef18ededd24a7d2 + 8268532c8f1c6051d0b1b67d88265c44 + + + 78773bc7147ceec62785ee78795bb456 + 42fcdd57d9a7abc11196c7c156548753 + + + 7c086b2a98e268922a28ef711e3d50d6 + + + 7aab9bcf964461a4e239b1118d668240 + + + + 11d16be9a5c137a3e734188bef59757d + f3f8eddf7ba70e5a1fa2dcc8f6cd8f67 + + + + 1ec08c4c5a38a0843fdba3fd2441c1e5 + 2ef76f59e1b28874fcceed02f4171c67 + b08a0977691e983397ccb6c285e861db + + + eea879220f637c1d6fc86d0d0a601a58 + 87b156d4672ddc9c302627e3cb6ebb42 + 83fe3a454181f255c8d2ae7b0a86efe4 + + + 115d424b4488061945b56a6827a4f0e6 + 213888cf077f62c39687b44b5dc98b26 + 178a55a790e684625ce54085f7fe43f5 + + 6a236335b11f607620a8227d985a9e4e + + 43c101d6530c937f2176b88b65ed1348 + + + 4a149c1568d7423cceae23ba7cd60dee + e4f0541ca12fe8471b8870667067b758 + 47e343f63651db28a8965b2543f48d76 + 2d7b315f3df1aba9db9d97fee8482def + + + + cc460a0359a1624b95fe556a2c77ade6 + + b8798215c875131e53b201cf1d551fb4 + + caa292838cd58707d988cca1dbf26d3e + a33d4c4cc251fc65bf9538e7fd2c2f75 + 0feef3d5f8a4440a514d1e11fe1e7ae0 + 4e5f45c2991e01edbdb7808f32f47d14 + a2d26865c311a5959121cbce5e93034f + ea5086ba460ef96ecd287549176971e1 + fcba7c5aa08e8995c3b37f5b8adeacee + 4f5a93a4ba875592d44f3477f0e79ea7 + 291308400813fdb98740a25532b543ae + 610dfc2c6108fccc5a6f3d6358337b7f + bd9e66b7026b5fedb72798644ff803ef + 4938dd87ea65c60b23eb3abf6e39a9a1 + 261e57a9e3f5fe1a1d377e0af468b6c7 + d5878fd5f75a6babbeb4384f154e9c65 + 00f3f9fee7caad67b87a1fd9cbfe304c + + + f6ecdb0d73d02d473ca0d3ee08876682 + cf53e49f4809cc2497574852ec55e405 + 077f15733c3bb3430f1327db3edceb94 + 82fa0ed5531524e9aa35c0541e63ada7 + + 5d86fd621358303adb5f727eea41f27b + 395e95ae66ad6ef9ee11b3c649c3754c + + + cb70a8aa1673a11cc1c580132d23b3d8 + 3b4cf13043fcdaf56b806316ff56c541 + b253d842fa70476f5ea77bedbc4f81a6 + e46a8d5d02e14b4efb56089d4f6792c0 + + + 53aa21a72e0bfcd91e3f17c8cf175577 + 3dee884531482e3ebdaf5e334674bae5 + + + 036b05bbca947110c353cf8cdd43cf9d + + + 4921a7bee19d674922140700e7bd52af + 7d5d5ba702edbbb309ecce373dc70ce5 + a3c7c6e8aa5d752dcb069eb2f9c50ddf + + + bbf5559081d78e23f996e306961a7de0 + ebb87673d95cac02d852cdae7d8dfa88 + + + 38cf8050cf59315b7dda69f3df1dff64 + + + fd1ed13754eb856f36588fe8d3fe32ba + 9fc112923ac3a7041642ea22c01710fd + 68aadd1d28743c7020aa556a3f70060f + 37dd5fdf01f0f549bb738e027e147da1 + + + 2c51130df7a4165cdfadba06bcd81f81 + 1026104d1502b18c899050c56f515a79 + 109f2bc1ae52e9469dc64fab24788689 + ed931a9f6ee024b0c41748cd76565bd1 + 76be5cbf7de7b99430092004cd7000fc + + + f1eed6c44f7bb7e73645287ec569d457 + 40b3c0b0ee36662c2760e071b3b7a117 + + + be7ed0d4c37793356263775c1a55de02 + + + + 72a9fb74e12730676163a65ef650a201 + 51d5860342c2628e3249abe1f5ddcd80 + c7276786a6fa597f476b24a16fcecef0 + 87098156be078d296c1799bf9d82dc06 + f103a73d1cc003b34b028e595f5972ab + e5fdf2c8d3dbd05d7e62ff8a4237c324 + 8940e81ff182de650c5ae70955a1fd3c + e6a37f4070acb460da33d9a16f1281cc + + + 67f600aaf6a0dabd3bf53776eada54ad + bdc0c316be1c8d260115382aa0edd640 + 91d21457544bd8e1a22f5fddcc342631 + 0ee6752ee37bc119eb9bf4270fdd4c65 + 4687d371feaffca751b276dd7272edb5 + abe9f7bfd49e044d0296f79d188d65cd + 4641a33c1376ad998d278080f82a43d5 + + + + 7380e492140977d06052961650c96e33 + 4f1b2cff8a7ef664982662489ad85664 + + + 407910237ae940588fd8a2ed2e3a3ff4 + + + + a5860318e884dc1cfd9b1221386730e3 + + + + 462a15fb1d4a335d02dd1dcbd001616b + 0c35d8bd569489db7c7201592d7ded85 + a82d1004e29e95afdf9d6e5ec09cdfe1 + 15f15a328cb54364db0cede923217cc9 + fdb8d80494a99d9748c4d1a389a71176 + + + b46ff9f5c8bcba1ea3b4b320e22be5c7 + + 240a98f35001a573c07c95abeb8ee8cd + b3a9ea94dc60d8c9b767901fc9e70fd2 + 135fd57546ec23023497445da5c3bda1 + cf4af492d317505c005687679d10ac4e + 24d2f33d5037c0b03c5f29d6e9dd8cc6 + 48a0dd0ecaccdeb25ded0f4c01d5bfa3 + b0d4fc560ed086b79291a15b3edb2517 + + + + c0e7bb0679501c8e6bcafea48f5e37ed + 2504cde7a49992ecc359d2f05d1c389b + + + 51cf1d641ae503ece727e7d84b182524 + 758dc213f8cb97440c5401090ed7db8a + 4c886557fd5f161495803472dbde8515 + 47192366d3f090c4182fc69bc4a9f7c4 + a53459a6074ed30199cf730c69da095f + 00dd0ec0a16a1085e714c7906ff8fb06 + 32e728410847e14c167b5200ef06ed22 + 2ccb4554ce6d65f6bf798336b414c863 + e3f88dfa944404ec578582c83130f192 + 93c74904d1169a68c36b4edc333a692b + b90364a30a2a511ce834d0200647e689 + 33f225b8f5f7d6b34a0926f58f96c1e9 + ddd4f357a27f3c350b71cff6ef02f1ff + 7be88e73fea7b64568a450d7c01346b0 + e7cc7120e670a8073073dbc3e4ff0184 + 08952b029e4decbc8ef9fb553cae8cea + 15c5cdc89d241d373ce228df459821b2 + 9f2144213fad53d4e0fdb26ecf93865f + 60e68c91d143409539204c80408547bf + b257fa9c5ac8c515ac4d77a667ce2943 + 23c906d4759f27cdcaa699062c13b0eb + 2a61b00fcc9b1afbf99be145777b1b72 + 376145480086600149714bf88f9b3663 + b8794c10e1d6e130124656ecee667326 + 0232b2038aba4cb05909c6445d1257cb + 7b3d3df20f7f3b6c0088f218adc8cd0c + 2d64160c1692d0b5ac64a37fc37d2185 + f107314649fe69ebcac81279e290a22b + 17999792fad582a0867875b3f0218020 + 6e59dff37a4f3c1c19b767388f593c30 + abcd1aaf06675549f65e6cc4450c782f + ac3f827e437c268459303f66a1aa0756 + f447e079e7e41d884331200758b40a75 + 24aab533f87e7b434be5fa5b1684975c + c36b5ac7c2dddf6f525c8d161412ef41 + e34aafbb485a96eaf2a789b2bf3af6fe + 703cf8f274fbb265d49c6262825780e1 + 2e7709c0c09e7c8b63b8a7305100e99b + 1a788a82aa0921b21f291d5df5e29b25 + 4f44077586ec12a35ce6778e879d43da + 693015cfe3fcf90e190a4062559e2c84 + 093a819138276b446611d1d2a45b98a2 + 1db25a5b7a0fb037994cf8f800a92ffd + 87718253bd0b1bcde1c08b1350841e59 + 2486510d63ff3a069060ad75b45a19b7 + ea4ebe072be75fbbea002631916836de + d001ed7ea2b8c4ea85b2fffa7a8cd0bd + e3f799c6dec9af194c86decdf7392405 + f900724667817c580539fd9972f5ca0a + 4844260f1c295a1eb37bfd532f645150 + 65ff04ea4ae968c774d3f61750e31333 + bc511bacf828ac9e833e6208292066b8 + 19b56cfcb97fbcc245242fb28232939e + aab631b4e2635b7c3efd566a24a08cdf + c04a67f37bbd3e7dd756269358cd85cb + 1493f9d2a2418bdc58ef0703b09c0a54 + 55835483c304eaa8477fea2c36abba17 + 852b62da00ed239928efb3b3fb01e06a + d95887f4f05276ee3e68861ad3e838c3 + 12e2ed7a180e601bff44253d4c7062ad + 2951bb49a430f45b91ccc319e6e0fed4 + be602467fd59f8a99177b2c87fde197c + 1bf69d2a23d6b4c24ac42e0a047e2429 + 0fe870684dab2b81438e9bc8108e3926 + c3e7c271b8dfe4fff8d37528cb37d327 + 892667349c5cff6fcf7e40439596b97c + 4e6f1e88254a1865c135db3feff6b399 + 5358c366f5e344d88fb55d3ca0005a73 + 5c7041c0b060b51529618b06b629ec58 + 073df5ba0dd8e0936b475401e742c776 + 21b8ab9e9957ba550b6de99c3da66bba + 2a72735af04941de7269870763094341 + bc97337e375ed2995b047f6e0d51aeca + 4595d7f8ce0e7b381abb0254f04f0ec2 + b22164d568f72650d592271d22dd5cda + c6712ce15eaa79b200b4b8620a2d5add + 4e7e3e142f3939883cd0a7e00cabdaef + 3af0d96b7f82462b598a85dd3359474c + aadcab0f78d28db5ce1255ff0daba006 + b3708cf445220f4ceec8bbb3ed45adad + fa964866c8fd13eea6d4fe29ff75648a + 9c133b44fa0ea9c4826bfa7f8fd9c9c7 + 5aaceea2d60ddb477c6aafc825eece3d + 8666743e1be8d62a8cba958edc5a325c + 1c0b4eb93fcf561eec03297a24922d6c + a33a878f3861ca67e9bc423c58b2a357 + cd97a6e2c8ac9a3e5bd5331165607232 + 108f1f23ad45de8aeea5849592c8b685 + 5f095a12159fe7af0c1c97cfb8435948 + d10bc07005bb2d604f4905183690ac04 + 9b30f13428e1b4a659aeeab4ac1fff35 + f108c981ed9611d5cc44f688b9ce80a4 + cd7296352d159532b66c07d98efb1126 + 39d27e13dce3dfe4cdc70a281ccdf113 + bf4dde0147bb02556500d922e2efc90b + fedf49d31f55f4beaf2c891f3875554f + a84e8591bb7eb3998ad492c27c4c3d52 + 1a0cdf9401c423dea250d84790edaa28 + 4e70a5394be4bf4f3ef4d232faee18ed + cdc8a9f118ddbf85ef5d8c06cfe042fc + 97534dd409492b05b11ab96b3dd4a557 + bda102f85c9daf4df3fa87a6aa4cfa88 + a0be22d8d956de19b8fe7da072f53c18 + 3326e4d74d3924ee1c882c29f5b571c0 + b6cf1db5e3827919cd2148bdae913131 + 5a7905b37366817cfa83266db81928a3 + 6e9e88a651797333f972a7daa5a0d295 + 5211065d7cf88c28086d8f99f8705b71 + 963eb32907744d9a0d6b98127162808f + ecb4572a5e478b107dfcb60c16a7eefa + 1712d6ef7188c8c2816ec7927104b9df + f13a42c6a06af3ffcb6986dbcf5022f5 + 18a853fc825553c7bf711eb74c13cd7d + c5e4b537415c2b9fa6515f2e4214cf53 + a1a6d16fdbf8140cd2472968a2ec06f0 + ea395de9cad9056977b95e619b1baab6 + a04526b4d51b8135e01f5df798c1b8eb + 12e033458f7a6d0a8c1f89a715eeadec + 339952b36f0ffdbebd7979afeb0e2842 + 40bf25799e4fec8079c7775083de09df + ae098778410c08b874b6dcdd7709fcda + dd97a4ac4ec80a6fd1dc39d5ef2b03e8 + 9ebd20f142e59376bcd117e93a813826 + ec55f263e2b86bc0f28fff46b873d6df + 21297f5598e307f9171a5704655be9f8 + 336bcb7b78f6c5e55120951f0045a8d8 + 3343e54368719e3786f78a1b22839455 + b7ea9a15a05a2608bf971183517c877d + 2d018a324824ee234e72e12f532fbeac + b4637c317b2f97ece10726ea6e3eb314 + 383eba0e55ed778006d76428812d343c + 03027a236b6d629a61956ec729617615 + 1b7dd07f0547be3631fb6e5a6ce650e2 + b4637c317b2f97ece10726ea6e3eb314 + 2b5cb36ed50460769e80bf82759c0965 + 5f7a4b4b2d12c177e4656f08cb8ed8ac + 26f1e68dfbd8b8621e5d07f75571a1f9 + f760c34e299a6df93a14429e74ffde3d + 14dbdb0c55239dd564643341478bbce7 + f05257ec5fd3f75a885e32a92bc6ef9f + fbc2a379fdad6d5a1b10c881644bc5dd + df2a321f01fad21758777e44fa839ccf + 30553bf1dacc7f9589d0c8f2488220e7 + 2a9a30e14574c9ec24add2901a80b81c + 19a8c4554b0264bb3d527646c0ca4df3 + 37244b744d9e8a93b835c8ec7d2ff5ae + 5a100916f94b0babde0c92aaa8fb80d6 + ac327c4db6284ef64ebe872b6308f5da + 525074686dfb8aa36b1b92e29de467ac + 8f056313dc7833f88bc435fdbb09e3a1 + 84a37de85c17f186652a179b1145392f + + + + 240a98f35001a573c07c95abeb8ee8cd + b3a9ea94dc60d8c9b767901fc9e70fd2 + 135fd57546ec23023497445da5c3bda1 + cf4af492d317505c005687679d10ac4e + 24d2f33d5037c0b03c5f29d6e9dd8cc6 + 48a0dd0ecaccdeb25ded0f4c01d5bfa3 + b0d4fc560ed086b79291a15b3edb2517 + + + + c0e7bb0679501c8e6bcafea48f5e37ed + 2504cde7a49992ecc359d2f05d1c389b + + + + + 443a15ffbbd4ae28a49dea5eae5b77c9 + + + 1c7fc001a12125dff942b2dff9d2939f + 81d4b7656f5173dd566f27930f1e48fc + 0422b6bdf978421394c6d14c7e2f6c4d + 6c0a46a88e5ce95416087cf9df2fe24e + 97b0a1f08547184ba56503c80c52eb03 + 0bc5aee0b2faae44bb39722258488a12 + 8288c557aef3c0b9b7acbbead4df336f + ece0a1b770020e59d5c42ee7a6ff18ef + 054f5362f7e01a7fd3014e3e1070f51d + 66ee75688b8d02bf7c2070d9e82bd373 + f27ce73a210325df95954f58533ec9c0 + + + + + 97b17ad729106963b522e89da3c2a196 + + + ed430cfd9e2a5dc16df15792fbe833ee + + + + + d87bf3a3b91437132eb3f45fcf97437c + e0474be40006ebfc869d7b788dfe285a + + + 6ecdf5dd55444f750d00ed6fa1e2e2a1 + + + 9d0198457b61bfacf97ff0924e265443 + cd2e0d4a6edbd6844c4f3bb1b4b514f4 + 3a4428a08894e30595bc0ee194c3331b + 92ef1757af1c1f3c3b64dce222577116 + e4d8e6a813d7e2c1cad505046a8fc6d9 + 4b3d58932cd4edc23a9a1dbe4ef11a7b + + e331239423631153c22933fef0a6d64b + 9dfd5baa346aefe23e3b9f0380423a2c + e4feff1c20c726c4bff3c13a3d1896e7 + 59d0397d747d1778894470205167d015 + bff6be51bb6939845ce41b2f07e7e446 + + + 474c16e92c2957cd35885765555b4e42 + a9ea95c178008dd85406756688d98a53 + ba3eddeaf57eae13cf041628a392bd0c + 69e29a65d78ad02700603413cb199847 + 30741a1c177910ccba36ccc28f44814f + 6001c3896746be5028a7c189b6731c3d + 696258f150d197ae412d79e58f976f93 + 90d8f576409ed84944348e9d0281f82a + 4bf89e51396543e0d23b5c55e64b4a2e + 7f98c2556928c068892e0456e56b281c + 4549995e6e95f2ccd497d9f1c9681eb2 + 969b41110c189253eb599f66cfee4bb6 + ee409d64d6c531de800e6241ef6ada38 + 8fb767bb146f6a9010c1c4d9655bf37f + 0d8f385edd5cd965c3d17b524e5d8e65 + c002c19f649b88c12ee333552ca1e637 + 936dc48d110a8971ce9b6d552bd4e434 + 680757c6a9fb0dcae35638423236cbf8 + 98055f8fc888be32e74900e2230211cb + + + a04845405789c16d83832e9cba9b790c + + + 3b98e7b96261843cd752c96a0dc5105d + + 130f0f3931bb0590cc725892c6635063 + + + + 984753b26b378919b0c6964fb58600f6 + + + + + 5119565d69cd68fae2e2a709363f8754 + + + + 1b8d0d6cb903295efac31f55058eed40 + 32d6de14ce7b5981daf1accc9903bea8 + 19527531f3ef3829b1decd879ec88dd9 + b826aec4fcdeb705ddf471c3072c86b8 + 847024eed8c20b593b1b3d5d6b980254 + 066a9ab6ba42de5e1f9a044b88ea5ce7 + 522056270a558c62df2bc8d1ba7cbdb0 + b171d69fa5716599d924be3c63084b91 + 55a4f97064b63e23585aa27f809c9b69 + 05154acd63cadc772476cdd824ebaa16 + 452675d1d641d3e9256b2cda811d86eb + 669fcb2d3443cf091f627be09489a83b + 6420cda983f42c30439c61be32e3b1bf + 2f0fdc38174be34742c36ef046c4f1de + 360d7d88f522c50f40c0f71a5677520b + 64ee7b53aff0cacb95ab56fc99dcfded + 596db8352a70ceb0936f410a04228710 + f094690c0fff0e968f84f97872549d7a + b7e3c374cff3c776ada0edccd51839bd + 90e1c7313bb4a6cd4cd4920e3e003720 + 0f352adddc23f387aa0d27e1cac97965 + 144b4ab686ac6ad2f5148a8b6b7e59be + 24eadc2cfd3803cd7d12fe2648f6b037 + a44678ecbca843e14cd6368444aa221d + 5c7a26f8e977ee57284f2d36e073d120 + 6f7d793037840720503b07abb350c6be + 41fa269a6a3157d738002c11191c9dd3 + 5eaa590bb32b660e2de7d96d4600e9b2 + 59229037fdeddf1bb6ca4a012d2e5ca2 + 11e83d911232cdf9bb9c8bc732a3e68f + e2ce8ed79550182cfec8c703187195f0 + f5d87da6391d2f3bea096cb992b4e0e4 + 3311613ef74c5e2b1665a22edc66b08c + 3e0d92c412a8fe02b50b1d1ea11847f1 + cfe5282ea77967c8e8c9867ab82c42dc + 67a89ff36db3a9dfca002581c6584243 + 7e230d8b064ec85dfc56c5ee36a17eb2 + 6e269fb917c6a4e473d729f1eb9ab498 + a8b148dd499ce7e17bfc3416da90a27f + e5e1698c3ea6a29104b48f44d49feb1c + 35207436a981f850d17c8636006d54fd + 9ae22850b3aba596d4aceb6cae3e282a + f38334b1dca19c29ec03ad2d1ad255b1 + 3e73b14574d36e6f6ead3e1af50c069c + cfae5b66c647b92d093633b5c6c50a41 + 8a694b169c632c666f814f899d595301 + 592645c021ba347973ec441b9602c02b + 364d3ffc199e9a954b672552fabf98d2 + 2212b6a9dd97f21f98fa0a3dac194b6d + b8d1db497f39413f67df6bdeff3a5cc9 + 83c226de7742e083e3df1801d9ea2609 + 5833de0e6f0b5d0f38703e335e394663 + acb027d8aca0c5a03467898da2b4a5b4 + 89cf92c901c4794fd0c9fa7efb8ffb49 + da405270496f0e730f0d3b1a632bd35b + a5ba41e2a71870b8b80bdd4c6fb8eccd + 9cab0d2b2f09055c3a449bf265366223 + 207c86546075784e59ae566eea903bce + 02fdb67f9fc55223f0eea994f3a3fd2e + 4b8e92bee3a1139753ea2e09f45c6f5c + 2b1267793517f4f9f1a6bc1ca15957dd + 364b44f51e2ef19f0102ece906a8f9ee + 03c4843343038e64b0b311e3b4d12896 + 00d0654951e334c05c1a81161629b247 + 111cdc7b03a572c19e11f6a5a51d8b79 + 89c0c19bdaa2d4889fba4e9cf9308cf8 + 8dc98ff21831ef0cd7f18ce3db2193e1 + a4acc42119807511d49a5a110fb9ec23 + b233696ebd63aa426d4bf64f07cfc790 + c5b02623d1cdf08a498d18124431b548 + f01a4403eca58956831e86b796d06f37 + 1be2e03cf4daa88c3e81a6357c58a2e1 + 82cb6aeed13c2f16d2a5d6ced0c5ae37 + 5fcda37fd385694f7415e64addbef626 + 151a29afc6fc8145a00ff60cfcf47dde + 3fec6e6f6ff42f3ea90ff768013957ce + e844dbda57b303066ad0f07df15632e8 + 191a1008eaac89dc126a3fcebcbd98e8 + 6412362bdbab73540c8034a8f9a575f7 + 041e3e564dd145c966f434182e9346ad + 054100813c68f182f63f054ba2a3a8f9 + cf1fe0e2445ea0f8dc0ee36676c29eda + 9f0740c61e64ad36124d8d8bb8afe140 + 6fd9241c17b81b3f794873169d6ce2ae + a504ab5fc8eb727e9a6e400e64026f16 + 3143ad77f44538244b2b7ea6aafe3f6a + daa838100bf15afbf8012ab7580ba28d + fcc44655d38db99011b98f439a59eda1 + b4006e9477668da203b8ce681f8341ab + 8d264cd43110576f732164fbfbbe82ba + 5c08280302742c1b787e5f77c32113ca + 521651384152aca793159ff037a62c68 + 15c556293f17e1484c4317daf1da7e96 + 32eef75f698867719ea9f5961978839d + 531d741043a2d6a09394eb5022898f78 + 7a6ac5c2982eb9e8196e6239b34066c4 + 869608bd46edc53fd477028bc648664d + 76aff0feb713e584235816736df2d018 + d414ea0a824755e95eebafd29bff9c93 + a029a7c0fb588860f4b013a02fd56d75 + f36198530282c3ec2bbcea5ac2b8bace + 702e3eca444e4c88544955cf61805ed6 + a3a0d0cd0848d445fda172e37591359f + 6534642ea3f48c6b8eb14f2480432d1c + bcdc19a35496c5ef976dbb0ceeab9979 + 155ef4baf040c083d642134b2f58b9be + 1c4ab7c0f437bebe124b8d44859d6c6c + afd7a5e5da380c3d7151e9c0ce2eecb5 + 3f39f7ff3e447f28f23999ed98778ac6 + 15c48071738c94c9620c731a54d67e08 + 1eb4ee2c7126c6db7f973a75aec9393e + 04e2cd8f46e95eab3789c2fdd7352c93 + a097ad0aebf253203800d9538efd45c9 + 10316e93838ca12f7dcb268ad09fa19c + cfc89a3fc3e7b3d37fbdd410111b7525 + b359392625e0b06964bb7d34b55b9776 + 542bc13dfabb4b30fcf6fc8eb2e850ff + f2185d1faa2bc6a501e59f209f00d95c + e1513b0de5ec7850a687a4a59d71f3ac + 6b97968ffd91ec8e1d6a2881f2c1b0b9 + bbae2480919bde6be3ec60e1931deafd + 61f7b489eba32d071099e59377c41fb4 + d6e53c99bb2f08cc7ad53f789b70ea7c + 3d0518e391c013da2ea9e6d6d2dedc64 + 79f167c0d71263dd2a84152205ab4af5 + 7cff8812c8f4214a47b6ce8d7b348290 + 0db13c0760c21a8e92102e07904c28d5 + 9062a0f5856b5a76b412b31dcaaa5c99 + 7cd61fa3e9d79d21b78d54726df91602 + 5771e7454264b8e30776d8176402364a + 73937632c4c1ed8c2618de3d739d7a0f + b0be1f2157abb2c49da4dad81012d0a4 + bf2d055c284502a8096a2decf7da196b + 0682762c001c49373b50654401706407 + 4b24c6c7ed8fd1941a795e640a2dd513 + 0cb9c893812c733cc95a30f6a252d628 + 4bcd8bd1f8e1f8169e916fa647025a91 + 78cc0b61916ccd4c6d667f9a7eb64e12 + f8d5a3050d846d1d04f38e443f70ab4c + c1af7ac76f40bbdbd70959cab72faa24 + 41fb837565953d5bc2b6e3648f77085f + 48c73df2982f7b0123b1de32ce015577 + fe05587aad72d1ab693b075b047375a8 + 427ba9070d8297088eb154a5e71a971f + bd9b6b74687fbdcc92fc42bb6104bb78 + 34d418088fa45601e81bdec1287d5852 + 1827b76de169333b7d3a73297b6990f2 + cfccafc33c2e0b4e3afe861a1058d536 + 8723b2c9db335079999a6de7db3d519b + a860dfba17d6aed9fd2b41e839f1559e + 39b7306a348f76cdcadf7272a7e3da59 + 23da079bd3ccf7ce159a63288a7f7714 + 6d5b4db4a99a7c35a3f321d8f12b781d + 2ff0462bd0ad5890850c10fc1110f11e + 4f99a6644cef7df64aecdf1017149ecc + c669011271edc2d0329e619b0ced14b4 + d288bb78ab2b6a21e75a45ad11f5bf0c + ddfcc1f346d9d3b6d6a35dde5a00ffe6 + 020860d1d564bbdf05f5c8685819fcd9 + f97c1a95b3761776f3f6da23d43ecf6c + efd1c16944ec19531c14dfe5a82a023d + c80414caf2a15d506c9c2e3d2fc75d37 + b188ec7816defeb6fd8cefc4aa0d7851 + 5a0d8b1b4eda150da3499443ad047a4f + 190d1687fad552c658238a912bb07fdc + 80663819c744cc2f86459b46fd336fc4 + 6794ce76d7c57596eea8aa48b877bd92 + 8e66644d573cd58bc4145185e067b8cd + 2c332d30e3f97d36612970d09e98d783 + 3d2575ed0b57e81f2127d50360aaf626 + 056566f623ff629b70fcc6c184cae3d0 + cddfcc929a8160a2ede15676a9673fda + 5152a052cdb01eceb8e13eeecf6dadb4 + a9035008d49147a23dff4a5f10172afc + 496d5eea61f4ddc9fe6f9a1bf04ae1cb + 23c17fca61495a5e5115a2961db56964 + 9a41cf28f119dd7694198931d04eaf4f + 25ae8d779f8f3e963c370809b11aac7c + b8df27f6a4393de2257433d96a53ce5e + 59db18bd9f00dd60cbb3a36d1d9a27d4 + bbca82e044dc3a4ea76eb493c4ef0c4e + d36b63fa14851203ceba3737a7cff33d + 3c771d54c0250dfb792923f9212bb4eb + + + + eabc46143ca236412b333449d3bb6f57 + + 24814e5862b8b8186e701642580a50f8 + + + e01f183997c7b38fd7dca87aa2466a46 + + 0f24742025dbea63dad5a3931b4ea249 + + 6fb19cb328dc27bfe53e93d9155760f3 + 3484a5ba160a27e2b9e63b61e37b07b3 + 6722496c5e1ad06031e4ce38fbd22e52 + e6d97d58b7f44f4803bbcbf2d35ce03e + dcc06504ff320bd2a33d69a2fc826829 + 342efe99fd64cdf7b882aa25d28d7ed9 + 15546baf954ed52c0e3271b0f0dc2818 + 2da7a58ef0d929006ed0ed58465c0ccf + 747f17bc7c9008732c7385b4e8817653 + 342efe99fd64cdf7b882aa25d28d7ed9 + 4b324a2fa7cd1910bb3dd34b54d738de + 68ab79151c20c8ade5f5ca567464c3fc + effa61c8d928a5cdaeebe27ec62d0efc + c7ab203c640a7d672d8b40e5e0e03f3f + + + + + + 702502c6bf00593fbdd00daf5be3c0a1 + 3b98e7b96261843cd752c96a0dc5105d + + + 6913463aaa82b1143e265e0c3b32604d + 5c0bce9a2712e182010d80bccaaecdb5 + 3b98e7b96261843cd752c96a0dc5105d + + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + bc9c6eb05c606eef0ad5a5b749dd7ba4 + 3b98e7b96261843cd752c96a0dc5105d + + + c404135e7f94afc19152c47fe9642bba + + 857c74c55e1336785c0f684fe14a5bd6 + c13624cc10bf503f8b755181775772e7 + b7439e4ac6285ac3b8e912056d489b6e + f107aca9a35a9d3091820679cd1565b8 + cacb004b1194e5a16733f17840930f08 + ffcbfa6dd87d353dc9e7e5be652cb7bd + 7e5e88630f1dfa45c0d94748076931ce + a1f1dc6442cf2276df31db1f34d27457 + c49e49ce932ca181f9014788aaf82c60 + + + 83191402ff498a99999ec9f7f3b0c299 + 504b83e4a2fe4961f6cb23e9c1c323ed + 0c911761d6ed3b9ba5439746a4a5ff62 + 2a5747049bc3ae1a7a65d8280911ca14 + f9293c95b3b1f6e593c8e14de86733eb + f5e2d0ce995bec54875bd27d12226829 + ac9a6d07208edff19aa75d388c9fa558 + + + 467409ba59f43325a47bd09185651c96 + 70d3a08fc2f0b421cb18c477e513f329 + 58c86e1ab27abae7a13add8096e0d1c1 + 4f9dd02bd42826644646115aadf9ddcb + 243252910b8298d6677d19cf59db2a98 + 853a0cb8f599809ecfb6bd293828c1ca + + + b52404f5fbf38b9df661c04523f66797 + 78bb0e5aca4f836f52332e6a9fc0d377 + 64ba3b8b095bef2c33cfaf9cbba2789f + 641df3ab76af246a229a0b35b5b074d0 + 08ef6437a1ecd1761ce9e901ead39873 + 65d282ec833729a8c550f8fa3d366a31 + f28e11a245b248e960157b76e8e1dd23 + d7c37394245acc7504982d607d3210cb + c4012e286bc325c1777ce69035b103cd + 08f2e9a6f884586b15e4f3504a476299 + 3c8efc55a988001333d4d1c22572ba9d + 51723c2565992937433629f5b1a894d6 + 5bea788c3fca40f6a4b46539caca4bdf + + + d048d2313bfb2350636c50763d171f10 + + + b2db33e44b8de898794b18fd9887ae10 + 5d9d331856a32fdbeb51521faae4e503 + cba5567b00e1605bcf2977d61239e465 + 467409ba59f43325a47bd09185651c96 + 5bdd245daabbf16e7a3e2147fb6f9b03 + b00651d8826f7222b3b336b24ffe986a + fff0dddc67d42f52cff4b0c54d5bd17d + 86d7f246ab2cb13f626453e6148abf36 + + + 467409ba59f43325a47bd09185651c96 + 69d3f003fdd952502e9b22eda327747a + 5313f6f82fd1234c6b1fcf2372b6ce04 + 12122e4bd6102f360a5d8ec10e7555c3 + 9bd7a77ca28fe3461cd67ffd87b306a6 + + + db8ce9c0d0ab913706e1a2e2857bd10b + 7bd4bc296e3f2f00a167054fa3780ffa + 78b8cc2e0f0955b9d0bd40b0c6289e0f + ce503f9768805ee4fec101d3914f6f1b + b7cd220d4186f9fcbb35214fea8fd60d + 5f61653ee029e4b6868f23a412b5a233 + + + 750ef400065aacd61f5bd5e463bb6146 + e9fdab4d43aa34aa575128a214bc4d15 + 90e08afafc330021feec50def33f8e27 + 73d39cd772d74b4c165967a95b6708cc + 67e07793cfc2416caab08908927cdbbc + 0abf4af45463d4fef88805aabe208ba0 + c5d774572302bdb29fbc560ceffa67db + 33ff19acbb6c23167b50a525f5351828 + 24ad41d7941f925c01f44b6f70e40af5 + 7255b4181be41c196ea4091822e7d988 + 245b6a3443548010cec7171d4be7e972 + f4bc811190743b50fe4010c4292c10df + + + 495f37eb49e5a8a55e259a8558070cd1 + 64966c4137d52a4d4cc1363885760154 + afe50a48b0755255b5b872572e8af040 + a88be5a3d4643b31c52d2240ce0324d0 + 467409ba59f43325a47bd09185651c96 + 55d37f9dedd15f0274a81cc2b201c270 + 15ac5bd6e48261eb86a7644e4e3c2e6e + d12b6d222c287d0374b35b76c87432fa + 11fce0dd2e1c465ae52ccb5ca071224c + 31b472d17a4a4576b121076b4e8260bd + c89cd16c3175d1589403527ddf57828c + 4477085a8ae9003dd15a0cc9452df505 + a1901f5c20d8077c44f4198ddb39ab58 + 1f427a1805df0fb27ff3a2c25806e41a + + + + b938dcdae617f2f77e8b64dc10bc1186 + e8a448fd7e06ab407e61cf3027718e20 + e49d2ec35ccb96deb926773b806dd947 + 27d3b5e246cb7bf8fcf8ddecf97c8c20 + 32a7e6307c324231b8dbdc15daa77694 + 9977edb6e762f8dcf5c64a82968a04ab + cdd1843fcccadcbd306f2e5a95be5469 + 3197e31ece9a77fff385889658c92c93 + 1277db382583822bceded446e9b95953 + c9c9b027f6ca523f4e8060c83f4a3c75 + efaf206490a4e25170009bf2268855fa + b66eddbd7a6ae840c8340fcaf3235f5d + 105ae41422caa5000cf56b45c9873e29 + 854644d88ad19e968a5eecfd5c0ebda4 + c4142d2152ca9d3bf8775da662a59568 + 418700c2de15f3ffa267f27b7b35ea68 + 51dfbae04260b96f84846880d0f45f55 + f5e1d489009e46223cf9fc50fee104bd + d76568584dca67869cef42110c328fe7 + 82fe79a778a95cadafde7c6ae12c8cf1 + bd088e4353a324aa93b0bedbea5b075b + b7c59ef5060c13fc5f71dadb5e560925 + b7ff77277760f45d6272ef4a0b6444da + + 402d1e93c6b57013bf0ce56b7d68b9bf + d694b799623ea32b6cf4571872eb94b1 + 25602aec07e8e76ef307d185767c4ff2 + 57be8d6eb77bebe1ddd3b6070ed95226 + bcccb8c4f31ab710f0375c66779069d2 + 4945216d4473c31bd7a35f47c7f466a3 + 103c51355d16f39a23221dd5f4648284 + 6e970fb8e11deab4d8ed8eaa2a6dd9e1 + 7955fae0ef193006aa83cb42289536b9 + 89930fcd6007524e73641c2ad2c75ee2 + 323c88633e5a029e6ada66a40d0151a1 + 545f9607812feca251abb37367edf236 + 4b264966af51177501010b906752c032 + c893266c61a6a02b47191c68140db96a + 71c0febd1002960abd2f62d6f97397c4 + cfa3e4bf7c2f9199dafe3956825dcf89 + 7f5130b52f0b8345be6b5e2ef6c32a7a + e06ec57ae2f0b140933a0a338544ab1c + d857e22ef52c90223be384b9f731fb5d + ad522b3397da5fd624d0785829ab9b22 + 3e147acb8146ce87f03723a12aac63cc + ad4b3410036536ce5d1f3023a6274bd5 + 5be8d16995b52bddfb011c5a787f6ccc + + + ab837e90d015f4ff49d3429a2011dc45 + 467409ba59f43325a47bd09185651c96 + 176be144da49b06670e4d75a5b5058b7 + + + 467409ba59f43325a47bd09185651c96 + 7c315301ec9f578ee5a6f2d90ea6a84d + 51b91905f75eaf7f3f5444d1c812ec83 + 8aa3f960378cff78d7873fbbfc087427 + eca1e8a2599b3c47e62425eb9aae8f06 + dee953f49b6242e54cc3fec1438e1326 + 2b82d1888e4a488389138f7a836fe829 + + + cdfdfbb6f77c9c2164218a18b66ad288 + d21ced2c9f937d50e2796fd211851c5e + 0c0d76d90acc40e5c2194ed1e4ef99c4 + 467409ba59f43325a47bd09185651c96 + 3c3252740b4790b6ab0e8669479f0254 + 465a6c04c9871392940bc4f31a48e07f + b72bec4e22f87bd117354d6268b2129a + 26df4b5dc77b7818f3243b3379ae9333 + 76c5370e483b640414247c952deef822 + 7bb3086d53cb5a47f5f1628db7ba6a2c + 6eb4f2f9bc923fb75913163271f7c575 + 32b423101deb77bb97d0ebddba60d6f4 + e4f207612e13864ef796f53ae9bd5075 + 71e53754ec6918916e7e4a99e104a957 + + + 467409ba59f43325a47bd09185651c96 + 6ab09dcf743b8802664ebeb576fee2b0 + bf036b68308cd4ff2973119ba8f7d8f6 + eb3ccb943039ad53dd2a30e6d63fa7e0 + 3144ed2d73f6c6c0edaa315d2e597d84 + f4500b45d0e10d425fe97e2797b0cbae + 352a2f6ee5f0be8cb6aa7aec4c49a3cb + 0b0d191b840a2e7282ad5a4ed4ce31ed + bad398ee1dd1c54e43b5534a9ac34327 + + + b78485cb1c1ed2e879775850f664eb5c + + + 83549a13bb91c59d27f6a1df4226523d + + + 7bbf42fdd21f31da6d2ab5957d550fdf + 467409ba59f43325a47bd09185651c96 + 7ab954117a131161b197acfec3e2cb80 + + + 467409ba59f43325a47bd09185651c96 + b39a4432a2f75c3432440a48a7c7cbcc + 33b15a15e1bdb997a7c7aeef9ca24e65 + a4b10dc4c0c9fbfbfc521e0768f74129 + + + 664ed0f0aae7e25ea71a59353a5de4da + 1b8052636674d83671e7476c57b9c823 + 07405e59d925b3f9295d2785ec85b24b + 467409ba59f43325a47bd09185651c96 + ceb410b4863be27c576b7bef7f296f0b + b685ce5cca66a9283a58fb0d4b13a108 + 68a539f6f19f1165b9e452c0f48022f8 + a42107c03eea2c6bf9444f257a5c47cc + f986c54b20f416484f0471d79645a9af + d338a20589617d2a568c63169718669d + f01d989570e829ce492761ccfa909323 + 5451c60e398c01a00686b72589e9e63b + 0f2b73a9abb33e874e9edc61694b6858 + ecd0c097728d55c2e06ec13fef8dc420 + 6b4a7fcd1dcd5dce9310fdb583f8425a + 59118f37e1edf6a11fafaab568911b81 + 2187e1ff8d7f29c637816c76543ec241 + + + 7c71e1ab9cb9d4efa5a96865b28dcea9 + 8c9650ce72dff29fd0145079b4890f0c + 6ba1f114b8179ca322c979ab18411f43 + 467409ba59f43325a47bd09185651c96 + 9a9c95308bcca0d22bc8961a21de186f + 92e26862ea2476220d528f866322f325 + 2da126f0ac50cc9346a8cf1201f9aaf8 + 389b0070414cfa6cb72a96bd3b064b13 + a457632ea8c680eda353a65b01d45aba + a61a379ec91e0ac5e4635c68ff3da403 + 2dc08bab08ed26cd3a2c7bf1e4c4c596 + + + 467409ba59f43325a47bd09185651c96 + 3d927a2d019a34232b0e9d56b9844621 + 80c9ffcf67f6a9fe54eae7f7de5e941f + 9653542a2f9077727cf4eebf4caebcec + 69b139e04914ac02f6baa52dc475dddc + f12b94f7d23ec0e6e5de62dd3563b3f9 + 18b83d7b33d72aebd3a3579b20d41040 + 6362b6bf95264f790147a0c476df9b80 + 1123b9568a38566bd4fc29734cab2c8f + + + 8a9587c7e3fbee84d90e35c188aab774 + 1c1508d4b6649f916184ca578a65bc11 + 467409ba59f43325a47bd09185651c96 + 32471808a26083f7fbbad167b43a5936 + 4a6550749fb2e4cee35a03500ca11dcc + 55fc562cf26970a62887986f83ea26c4 + 44f4d23c214bf5f901c7973008d80209 + 6d4956ced4ce21b78322280f62146347 + b55bc006a01a3fa323e86adbf7bcdf5a + a2373de8887c5146df41aba0a578fe01 + 8be76227b2603cb4e8aa55e01b6a8a37 + ac891bbc50eb47c82964bfbf255c6ba4 + aef2c8a08c555de4fa617ab68e5f9998 + + 857c71917422d53bcc4ec3ace8327833 + 4b61e6926ea2e84a5d1aeff44b4848fb + 895f521483685e65086f7a69ee5ac870 + dbb9bac05d2ce37555a05641ee5e6771 + b4badc6ef4e217802dc7839538a9f354 + 12edac66bf7b45abe117e4efbc8c9341 + 433f232a4a542eb74c5c925d8397d805 + 5247849ed5354174b0592ceaa38aec11 + c8db658b61cf957093f61ca2f0e94fba + 81ea734637f15d0f508190024d38d308 + 70d5209305c217b28c4c9969ddc186f0 + 8de3822a1745618cc0c1802ad7c1449b + 78b8cc2e0f0955b9d0bd40b0c6289e0f + 1c2ff2bc88c9cdc2ea6a75b3eb57e8f6 + 9d5dbe537576ad72409c941e66fca763 + 93306dd4bcbc4cbb4b82670f976fc999 + 54ad5c77650ff0ec0d4d70144d4c96f5 + 08e884560f6ce9bda1a1fe5877f03a7c + dcafa91a318853de42c8dc96d5ee0331 + d23c0f83c9d1022173a1c18248625be9 + 2b3af76762615aa08af594d412b2edda + e6e8644296c463f18e92dd9ecbd24bb9 + 1563a2dd513f35348feabc0b9c109090 + 02f7c7b2c2fcf1ebdc6537ee8a50ae40 + 88d6b001945287e279f861ec314b9963 + 08d6a31e40e5cdc658ee0d5599133ad3 + f702201cdb776ccce1852afd056b22c3 + 48ccc1ca0c3f5ad4af36b2ea442e5e4e + b64479c8ec44ce5b49d3d229f1485a33 + 2efa18ae2c9564861398b12950459282 + 95ab2248673a518ddf612e696b0388d4 + d1a21686a8fe961b5ec576dd793242ec + 02017716cd66efce44337592cef795f1 + 4bf2487e587195f4c47df31de65c36c6 + 87d238207c2cb6b72c8dcbff695b9261 + 2fe2d68eba1ee6a897b7f97184859c78 + 272606dae95937feab7eb6ffddf6bcc3 + b18c648aefc30a6bc54e77d8d6bbd6ae + 60fbc3d61de97c4e79a8a45f469a28db + 4ec871c568ce271f07bf9446390b99c2 + 8c575c2d92b128df1f49262b48a8455a + 0695cfcd69c48ffdd7be5f7ae98ce066 + 92ab49b4cb520f3279d1077befce3d22 + cfb43b80185786d6254bbc5344fd09e8 + dd82b9f5bb34d12a4f5afd80933aacf6 + 5a49f08a764ad654a3c8d0e661a9e68a + f38e56538a36283bd9eae3e181133786 + dbeb575be05d6a0a26f640f19db8293e + a5c5157fa2ddffdab7f0c8f70ef4555f + 7241df364cbaac93189525ba21d9e249 + 877be46f5972b2f8b1e7633572924c8d + ca1a052ba4b20f41f441aef23054dcfd + 090bc7048d9dcd297131b0976f2a9b27 + 2ce7e89dea4081b3295b6d10b894d88d + 5b3b8d242500867912327e15335b295e + 23e2d6299f26b72dee5e104e25611262 + 23393417fcc70c5b090c0839353aa3ca + 37cb6dd366d53db56ede121bca320ac8 + d1d81972cf786603ed8872c9feff3bce + d2e9ca0c8313d5186c0f2de1215d7ffa + c32d187911eea8f3924a1ee3da5eb7d7 + c1e0f22697fbb18f38d113584e5eddf9 + aa005866899598585ae1cffb14dc66a3 + 682393047737c00fb2728a1527b4617d + 3f5cf6b2fa76766f4647f8c9a3627ba4 + 50cac014f45b681edbc0d005d2395d1f + 0a9feae0124d312f49ef4f2a83e985ca + e83be0eba1ff9156e40b71d2328d94b2 + d1f8cda41218c1fa1cc46785debb951b + 0cdb37e4c03080876cb4de7a4a428c22 + be14d7a4ff91d6f0fb10dccc6d0ad001 + a633b00baa7b17195b90c56bbaf30795 + a4731a07e88651129efc14af8133b1a5 + acdf5da16d5533c22c3dd4e0e98415d8 + 2a4804f1172436f9ce61c3e06220be64 + ac63d1c21ef3ce23ddbab997eb8c6745 + a0bb1208f731c50a2352b2870f0eac13 + 856af66d89616fc66040783bed14adbf + 75ab157cfc53e9546c516ba276159701 + 52ac33d3b0349f1a866c184b05784859 + 36a419939ac074331e76b7b05cc50e47 + 6777d3540547a2e7bcb929409d21c14b + 84cef9e9778beecd8b165e1475cd3dd7 + 424cbe16529f644a9589ffe213ce0902 + a96e999e93bcc9f16fe999d8626ced62 + f4a7ffa82f5fdc72625f9ed5b28ac38e + 08a5f68de0f11bfc04d3bcf4e7573282 + 5fbf3722c1254830c5a864557f8b4e50 + 34f25a69d7e2ab57c5f600c147fa588e + 16deaf8b6087c62b31b51bf01469bd00 + 78311433172179fe40d4be747e1d7f6b + 5084d82b619ab55101dd677047d6dede + 4e5c0d90505a594df78c1835edb90716 + d9ae3e16f62313a00c399793508f79ca + 02c14c32ec45aaf63c659b3957d31c32 + 33cd0955f00ce751c70ced5145422758 + 2bb6de75161dc18e57d1574725348cc3 + 89af1924b2b6caf6168f2e7acb7f2b3f + c7cea3a7747a132b9dfd37133b47e2e7 + 159c375dc83de4a70a0c85e11c2bc094 + 1c66dd5e2fafc5e4ad32b972e9fd6ede + 84eb18c815bb25fa82007a7e189062f0 + 3de3da3180dcc8188e578f774b160ec4 + a309d17e612d653fde6fad8377ec3807 + ce89df06420777686a9327d8525f44d8 + e36144b321e755a40885003855e39e06 + 077b35870e90e9b70f53776247781018 + 3b98e7b96261843cd752c96a0dc5105d + 1f85c568bb7e8acf512d4f7a90af70d9 + + + + 85b6858d7ee93d7a27c83271925b4146 + + 9a8c5340d43d7ba66d9cbccc4c9231ce + f04b0e0af22ae5ace7dbd201797f8f54 + d5ad16ccf1854643a35b57cc2f5a2bfe + + + 9a8c5340d43d7ba66d9cbccc4c9231ce + b462dc5c1cc721b83e4e3331d99ab5c0 + d5ad16ccf1854643a35b57cc2f5a2bfe + + + 9a8c5340d43d7ba66d9cbccc4c9231ce + b11bcbf6d9f56763b2d8935421dfed01 + d5ad16ccf1854643a35b57cc2f5a2bfe + + + + + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + 76747fc76ffe18e9a0eaea74f97f2eb0 + + 3b98e7b96261843cd752c96a0dc5105d + + b36be1260eebf61ab92547cc747914fe + 35f2da7e4875ad3484b7b31f44a5cc65 + 5119565d69cd68fae2e2a709363f8754 + bf95dc9b3f2f621fb0332be1fee607c0 + 88be629adece9d0268317975e39b2bff + 4370dd0a7414f9379f65692cedc6bea9 + f05554dfa3280dc9c496d8183ab7125f + 77719039b6db2a00d0ef1ea4ee1483b3 + b20ddd734418c11d6c7b8802b50be84e + 0162d2b8cfa677c7c8dc0bfb42266ad5 + 0da8d366eb56abccb931683b64c736d4 + 3b98e7b96261843cd752c96a0dc5105d + + + 78b8cc2e0f0955b9d0bd40b0c6289e0f + + 949743408e6f4fba8f722af225b0b713 + 96cc4b03e7078313175d821948218481 + 4c0c57f043982d580e5963b1a29e04b8 + 467409ba59f43325a47bd09185651c96 + 32457c2170df870844ada69e35a46e24 + aa88fafbd2b41adadc5b68b6356f57bc + 6356d1a2be3cd47f0766a4568da381c5 + 70a3ffd1236dd7463789d6b761dddd70 + 305ec28f3fcecc5ea863c968ed82ced7 + 80fb88a0ea7884900f7d8f5a50f0e331 + 0cb530304fe2cfcc47623dbda549593d + 664e37d1f5b5ca66de09074e5e7b6495 + fc6ab516b264bf73343b062636114c65 + 829dfd1e0825358f38fb1faf10566206 + 1b353cb5f779ccec0dc5bea70fb9f41b + eecbf4b11e24bd88cd8fe45048f99d92 + e2e5f332660e6395fe9c487626fc4d07 + de46e0f0187ac1a007a7bf972a3a3daa + d3877bad519a788b0bee126b3e5997d8 + d3b3f842035509fabe4e34f473914cee + d9319ea481ed13499f53073e61825303 + fddf8dfe145b555378f86c2520873e4f + 1fc2a51619855acb23205c1ee67b0ba0 + 36103b9b3f53973c369909b13eed417c + f44a7c710208848ad599074c5fa27d07 + d0f7b53ea3fe05e82f5a73dba0d8419e + 106a9edf7a1a573b3d1510d783a09de8 + 4adc5009d959cfd7df5ec16a0e7217ff + 0b5d7a0975d9e8bdbd354021674c8e27 + 143bdd90328c52c934c5ea5ed24033f5 + 5f6f3fc8c612b3f47b0e31a5594113fe + 9b89ae99aa129c9b82077ddec708f587 + 4faea552c8d355deab5202d9b970b804 + 7878b2d4268a23c07d65b99a0384eef1 + 027dc48d6421c774c46eb7535ddc4e4b + c661694ebb15f015a0e55340e5476991 + 98eef8daa0cb71d00c7ca545e195830a + 2c40c359e2fda0a495d2c6fdc1193aa3 + 64754b4ba9a9a429af2a4488715134a5 + 226ec061bb8b238ac22ff810d4370eac + e6988f8954cf1fdb0db0743fbb75b951 + eacb1145782b0a8917c0a4500841f1ff + f3d0bb89cad063fe4c791ac5f22e834f + 31129391c1961c690930e0e79fccbffd + 7375e8ff55d9124c1ca8f4f2e4a9be40 + 3fc0b24b3ea360905ef94bbec592fcc7 + a40ea7383cfbb598bf6ed2d4d492998f + + + 20144c75cbfffa10ac0a638efbabfc2e + + 149e6e7440064cedfe6517111eeed0b3 + 78b8cc2e0f0955b9d0bd40b0c6289e0f + e34728d05f14c35d5be1741e6b4e8aec + 7a75e6e3ddd14b3c70c133d2626003d5 + fd3f4fb376640c60075b9bb233ecef03 + e322d1d79a78a3606a4dcc873d2937db + 49bd71475553972eb8a158b658b3dae7 + cb2dc55819576da70885322497ff6083 + + 22126bd1a1c7ffc14b2c0c234bb8bffd + 973a9ad99894ad4d90a10aabcd3ca89a + 50525418dedb7e9dc5f328a0d2129708 + b9c0f216b618327933fe1335b84c47de + 78b8cc2e0f0955b9d0bd40b0c6289e0f + dc38bb31bfa16858ebbba5403735a2ae + e039b45b2e5702e61b49b5a1d93b2880 + 29682ebb2fd553be78fcf55a73ed2ae8 + 0e91b867f328cf9a1419c0c74180f46c + b13547adc3f66221d2b5e541bcde4c99 + 5bba94f140ed481af806a93c2e21edf4 + 4bbda2b49d771b4cee09bf552a37a485 + a8e23c035dc6036f001d54054a834daa + 36e41e7017045216c64e3942c5904171 + dd3c10b8bdda9266c67b1699ce0be6a1 + 03560b7739023484e18fe54416aa0578 + a8aa11859030d168591d09eff8c9a6f8 + bef833794563af72df329776975819b8 + 48a7b5cd2144272ec8a6facc88b250e0 + f76ce4d4104fe854aa501809333a0b18 + d32261c2131ee2dc1b609c0c92fbb126 + a3738beeb8b981aac22f9b176027c304 + 93432c5f8409d74336a05c631bbbcfaa + b697d47de49cb565dbd589a871e02fe3 + ba9512921959e9900b3191c0384b2769 + fc1494a4bc5237adc934661a7f98304e + 4400fe08225cd915393a69c012ae97e7 + 4d5bbd84d3fc7d9eb10d9f35e413ed28 + 512612a77a9e614364e417f796a4de85 + 55b54254cc60d00aadf0fa083e3b1bde + f03cc3b05c1b7cf576d20416c08e5a5b + + 3b98e7b96261843cd752c96a0dc5105d + + + 5119565d69cd68fae2e2a709363f8754 + + 0fda484a471016896fc3cc6afc13fa4c + be3d7df8d4d52a25505f6616ac9562c5 + a07ebb0ac6e2923081671f8435296ae4 + 5119565d69cd68fae2e2a709363f8754 + 7433c6bdda0732644f2eb167e229a202 + 7e6889897e1f3704430d4d33012f8918 + 8706a1a66033453c90a7af7ca3d44d92 + 6ccd105b2848a3be7dadd6a01eb804fb + 0bfcf3da1cb1724f5bb87a78c298614a + c9ca9f16d415aee08caec3ed8ced3891 + f950845637ccc95daea012795fe17951 + 140d47e2d4aeb0bfb5c826ec48db59c7 + 69de9c4b7817f41eef692cbb085dc8cd + + + + 325a1a9029112a2405e743c7f816427b + 3b83ef96387f14655fc854ddc3c6bd57 + + 5119565d69cd68fae2e2a709363f8754 + 09868595b242f7a11c8fee6a67c7b4f9 + 6b6fa75b1a24b2c298960d3e6c127bcc + 866ea33e4968d7fdac4af22550e2fc5a + 406be4ca5cef1ea56b597f038895e3a0 + 5e4c5a02e3bb0d747653fd787a69478b + + b96b4e59458ceb501c54e686c3bc2789 + 3b98e7b96261843cd752c96a0dc5105d + + + 5119565d69cd68fae2e2a709363f8754 + 3b98e7b96261843cd752c96a0dc5105d + + + + 6e879a09284e2d712a360a5a1d8275d7 + ed0e803afebf673b3c7e2bd2f873297e + 2295aaa397ca36f2c70dec116bdccdf4 + f58cf9cb938c636ee9d4d0c3b87c1882 + 11830979f523a51e3690aee0cf514f95 + 6c566e0e8bd3ea07b76eac6205b8202d + f5647fd06a260c113c893474712161f2 + 85e8b12d5d52aea894458eb2f66e53cd + 2ddb0fdbb8329f335c481a1481add6dc + f1936bbe832b8e9f06fa6bd4c0b57dd7 + 23f5c2f5967ed7abd965cf0f57e4b81d + 5119565d69cd68fae2e2a709363f8754 + c807c483ee0ff9f6e1c73a7979aaf783 + c2f15e3d5fab33e87b01c0a2a9920025 + c73404a55d97bdf805eb50a372e81719 + d028863777075fac6330324a1321f483 + 4b234c07a5085a9b91bdc4d4055234c1 + adaa993b7194c84bd71142a2ad11ee78 + a2c1131a5690e70dfad93488c9d0e882 + 79990edc4670d8388ac2876cca299d53 + 5f212636afeb6aa4c0d4a60496812d86 + 4d4cbd86fc6da77e46412390d9126a5c + 91c95c77db67e1cc76e51baffd542500 + 5fb4195659ccd2b8c7d2a0ad95ecb56c + 9bf9c8b79e7709e26975f76768181339 + 5663a55d13d60a0f600a54aa8c806541 + 38740734c7c4a19301f3c36ecdc76710 + 0db2c4f24c0f0c3f7958a05181af897a + 66cdf85828ee687bf5e022a3d594d76f + 30e56cb4e66e82f60d92c21d133eedcc + 777285376d051a7113541ea44bce9b4b + 6aaa29be82c473d64779f14bfa562120 + 2971e126f7e242465a4d42c7aac93e99 + 38e4cbb6b8a8891c23d5a27ad9cf37e8 + 21d3fe4e6e4a9fd0c1e237666f29ca61 + 7805f32b375b7e2f144603afc8d709ff + e0f6cdfa6f1821fd53c7b4f73a24629c + b69c49929175326fc4e89b4f4ade76b3 + fa225b3e816787f128dd22d1318372fa + fee142166eb68f489c96c4b0be718c2c + 8d66491b2f669e2fc8de285aad80654a + 18d899f63e5670152bf6d978bf72c09d + 8028b10e7bca47847c21d44ecb907761 + f0d459c69e2dd61516e52777e39b25a1 + 2b562dc7a8b18c46b2e11747e181fe24 + e627444742d92bdb525a2f7d6b270172 + aa42182ea3a88bfadfa6f44f923be920 + d1f736a80729161ba66bd3dbef72998d + b1b0d37bece4b0ee3798efe783434292 + 9a1f0f19a11b76ddb144edc4f9fe577e + ff9f914b79a05bc2ea5d1e75636a0e09 + 915550e2c09af15bc9787eb3b3dd07c8 + 85402902b4afc480a885346266f82c77 + c7d18c398a79a225bef96b1edbbf6345 + df4b51ce6018918e38e4731a03580c00 + dba1414f58ee6b88f136880b9a7184c9 + + + 5119565d69cd68fae2e2a709363f8754 + + + 2672bcc580821ff24014185600c14f77 + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + ade682e0fb6ddb74c003059a70747539 + c76193d2bd6a1f0ebd55424710487500 + e6efd06f4a07203adf48168a06661409 + d6c0a4b0b555cfe2629124ec99231498 + f3f114df83a0c19b51c7a8f03df2651f + 461c93c75e577db7b04714a92a68d907 + c597a73752e1e60b6c11560599684b82 + 58e26fdb5ee164400f9834477808e189 + efb611b60bdf0f161383ee4d0fb667fb + 6cc976410b2b3dcc91f7a2613f1a2c8e + 8177091c71f94e2543ad8af43d985435 + 2679b814f79668930047ba278419a817 + e6ed1900342e310efc4f2ff4e9147eee + 86a2fda5a0c7f005ee240c11e57a3546 + ae1058dfbddd0cffa225d211ef98615f + 16cce5373baefb67d37df73b7d2d3117 + d811f79034eafe099c84c35466e401df + 1d88aa104fc451393c131e82f25b1096 + 3b05ca949ad0c2a6c3aca847319ef878 + baa1d69d8500e77b47061321474f5101 + 42bd4555a2f4d30eb0393cfb80f300bb + 04062145174aece46eea84890e8e6f71 + 52c908724effd53e13629435b3d56059 + 95606a1560129d142210e5801d7cfe68 + f306169ae68128b4c6f599ddbf506d42 + 08445577d653e548ceafd8af40b572eb + 247f90c1c8477d49ac90ee142d605d96 + ef2166c8b0edc50e892bdee089cfd455 + b71d1bce44b93b359cf743e72b3f534b + a088a7451f8221290312e8fec222459d + 505fd6143208956e659b1f55c283c97b + 97084d7f8cb15bba7c00ead47cabc2bb + 2411b4c7e28a674c3cd9875e04b422a6 + 88d99acde127d2e0258c86ebd5f45f63 + 8293945d7631cc29b3a7ceb9e268ab65 + 73710d092cf1c2cebe8116d7691bd140 + 249c9e95c731242e4e81907594fb40aa + 244e8cfe477c2318ef1d58a6072b62d3 + 409e954b13c241c4717ed5c19d258c4b + 44f749707f5259c127ffb26a08296d0e + deab6223b8ab86cf3162b32ccb447d99 + f85803308b6014610b903c0f439ac765 + 155ef2c2f89a2a950ca4843cd8443aba + 0741965551f93139a9edac5f6cea49e1 + c0855561b9f589acfbf4dace7bdb725b + 14da3f5df581bc2af50a2be4db5b396d + 70ff80646509ad968d776ac8f7165ed0 + e370c82c1b813adacc74c62cf7274730 + 766e6c0e65cd6cded471b854cdcca285 + eb46707c0e71e3779bdc06453d59a24a + e43a80d29aa66f3d02f7d9410a689061 + bc4aa2ad9a9cae22e3516e7a3907e01e + be6a9adc371bc4bacfc37a55a671b659 + ae24c8203ef95235cb720fc0973d73bd + a338cfc46391433bea9303c8819d0ea0 + 85841bbcd2806a5f338f23be8cf41478 + 53e244c8d8c560f96043673fce4e6463 + 59cb4ed5528e305a945a6aff866eab0a + 18603b7a963822d83dd8cee4a5fd14c9 + ce1f30c1565d3cb8971c9d35c04163e5 + 778bfdf4d1bca4da588ed06795d5bd5c + 368c67b85be8193c4d7afb4e36bb99bb + a0d1dc2b198e8d01e6e8e4cb7a8e0d6a + c4ddd8f0cfe212cf12844a7c4db81979 + b8a48b84a1d2243658520aee81b7af54 + adc7d09d275f2e6365c5641c2c3dc346 + 5b71656700fc4411a681f7777a56d742 + 77c6305395a6e1005ecee9ba197a4e97 + a1c6a626db30ac2d424ad2dee72edd0d + e6c43c47d9f99dc38553b6b66d9bcfc6 + de1178af46213eae3dcc641059c07046 + c4bc210fb7caa1887390e813926c8135 + ab77f288b95135259ac8925f41accf08 + 90a88a8e4baebff226b35d63c72d5d77 + ec2de5b33d88f819341b82ced57a35ca + bf50d5f66ce7add0f5efad1fc200ac13 + 01f8abbd7a8dce0ad59d789e801378db + bbd92d57836c094afc7ed5200174d6d5 + 0acf34fd6fecb425199ff70d99bbdb65 + baa0cde6660eb3345d3afb29892ae38f + 1e36b6212bde1999fd211611d8d8e5d9 + 30260d5ee9d4a3df02a03b4db7815755 + 358054ae81d6e6a8661fd1542c2e9cda + 1d7f3f24187182ec8dca91a1da34f023 + 2e51d87aece72f8e7f8a18aa8015f706 + 32b39d3bae232155c1fb798607125c41 + 8a8319b73b6887fbf71e56484132c39d + baa0cde6660eb3345d3afb29892ae38f + f0eabfa8add9a516eb9e3772c17e181a + f18f15a63dd76e6fdde8d7e209e0f8f8 + 516547b5c5418ba9db781511328188cd + aff95727d8d2014cb0c2b92571612b5f + d6ce0068f5f9c04727667f03f38f7761 + 867e474fac26b9308dab976f40c21fed + af17e0ab2954e20c726089230af18807 + a4d842bb8b00033e54efa7d64f5507c5 + 02dc9bd1bef77198ae98a38d15e2d319 + 8fd5e81ff8a0958d0e7888a97e9619d5 + 028970c583be4e75238ab66a3b11cf4c + 96c810a3617c42976a844f2de81efc12 + 0eaa7beacb234542dd254ff7cf441ae0 + a38e9830be5e71015f62c3f2baa0faab + c72dfaa5571626aa584fed483eb639fe + 62d8fa13108498e32494ff785d1f5b99 + 03a464afd9f41dddd89a3b6164a2b2cd + 7db7b75d3761334a76095f038a4505e2 + de1178af46213eae3dcc641059c07046 + 8cd737009c91276bb3cf810486d32210 + 3836d9d3526140ba06d4f3e4ea089de9 + 2cc25961cb49a24b003a25c15920c2e3 + 410d75787573def04a67bd4981d59bab + 65b04095fd81668e96b8db1749fe9510 + bdfe88861451ed38d55cb6e7c1f1af28 + a7be0c287cf688bc647113ee9a7e4391 + af2759cf78bbbcc4ad3fa1a24f1f20f9 + 0edbe3b372d15062d5eff0c5ac0e7b06 + 39930a18a7822243fdf9fd9eac183be2 + 6d593174977961bf445c32d94cb84958 + 1417c4a7de14e4e36faaa350bdce9dd2 + 99c3912483d0cdb1285a43fe941766aa + 4ee6c98a0090af4e505b5bca28be9304 + baa0cde6660eb3345d3afb29892ae38f + 30a0c3e48203a973df44dda32f5325f4 + 7b88a42a7428612c1a5e7ba0171c88c0 + 9f7ac0db6a2d9017a25206747e21fe20 + 851f842045b0712044c238dc773aaec7 + fe6b5943ae05236e69a352d62a35e5d1 + 0e623376e3b74446fb9f78ed01f11a35 + 2927ef7f6bb2ce52e9de040f3e8f23fd + e83125af0432c7818ea98fa6ab07e551 + 797478fee0531b49f159076aba8fcf45 + 5a81c1f761edca8acfba4520b8ca5e7d + a3c1fda2c4c0c874eca22cf11fb3b5a3 + 84ae19bff5d5e05b545222900545ab4b + cc54706e6042d64b97ebdfd46e8ce1c7 + 50c9c36e83609abb78b214aae3e29bbb + eff23f135cfd1972528b7e79d23153fa + 415945356238d7becc6cbde9e40c459e + b63da53187a01739a646a27a6acb26bd + dc99f77de1ad6bcd9d5021468c0efd48 + 49740e9688e7ff76e506e0f1c55394a6 + f5db237f9bf4d0452e20663f47b724cd + 845579975e5d80fc9d4c8357670ce41d + c01bb75c567bebd1b46f10af6f2ffb90 + 0741965551f93139a9edac5f6cea49e1 + 5eb02256bb845d5a0fc499da3cebbc9a + 50220b4436a91e112a5e767f3e156d59 + b697f4d29e076fdad2095d0d04c9682d + be772afeddf80ec25dde9461f663f469 + aa234b98b6f81de94178c6d30f63d090 + c874f865db7f18781db298ab02d92e4b + c542d7cd0551c380cf6c54d3e9654058 + 3716f7a462223329b3c5a46bb523a162 + d784f53455003bd037c198f8cba41407 + 08d271a65d6429bc848b3d1f1a823736 + 257f81a5697798e126c539ab09750aef + 22fa80b07e7b93e93fdda0b7e4658a1f + 311ba1adbf2e69e927e5a0db9360db90 + 1856acc5492ebde1811bc61cbd38ac0f + 0446fe5fe2eca4dedb9cd2c3c7d54643 + ec2c5747468350d8326cd6df3af9c983 + 45920b0187dd7cbeccf36af88409c8cb + 1ed59e545e3f80d92de5c9125a1a36f7 + 49f26998e579f4b740623c526a0b709f + 136b6e2e2e037f7bf58c9c0439c96296 + ca5ed7ffe5ddf1ae586e3ec7b4d271b1 + 99cd7c4eff9eeaf0d29e4e8b0a6d7c16 + e605cea840c1187cfd2361e1025b5703 + 6ed59cadb93a326a49e006b716f6ee08 + b104b3de09cab1a15a510c099f0a73a6 + 293c408e860e59acc4bb2ca1d5f0e700 + a8f998af75b4d1eb7977ec206349d26a + ae649ae280cb3c4e689e2f6dd4bb2491 + 11e7fbf020da6aca76557ea868cdb914 + 43b1ef4d4b94bd4bc320a9d4287211d3 + ae979ebf30816294b9d4a15638cb7919 + 66e6ac60f0ae1e84f3e3b7505712042e + fa6daaced53cb03c00199abced2fd32f + b20fa1302c7a28c8df4396dd42d0c353 + 87e8eebbfc051d783d76b33293ad2421 + b60e58a9840f7d4a4a350cf95b3d8421 + c2f213cdbfac4822021a96e90cec2f0b + 69a00bb527e4b11c19a967804357f416 + 9b75875e87b070a7493e4c640c5ac2db + 0c14e5b12a282e3a9e9c1a76a94fa8e5 + c5d80c450790282460b965c79ef9913b + 4707f4e504b1cbd38813f83119c339d2 + 41e67b246797ee6579d3553183b618d6 + 4d17c742d52b91c4cf3a878338fabe7c + b91fa01fe950c06d208c16540ba17174 + 0839fbf0c5ed3eed0822e578fce0c35f + 226ae0829fbb380e869cde88f311b026 + 5382b187df57a7f2c7b4e78843b32a05 + 76b1974c18b303e0802a04f70e243e95 + 236dc182e9587b98a8516381d93aaa15 + 40ad066866d8be1e4cfe40c1c47981c2 + 2a5108bf17030952263d227b838b3bf4 + a35df53c54517585aa98a6f87541e820 + 4873a96f88fd1bdd218df2445d82a307 + 9965c18388ece6c52d3d09de98c31524 + cbb286336caf943de1d1fa9ee2603307 + f7b21536cf2adc4dbbe125d02a4b95dd + a9d6fd0a9b43cfb84036e4e93cdc164b + 653239c865dbf79d249332ae95abaf7c + da0a7f2b64efdc39e62eef08045617b2 + 7ce8eb03fa8720e2ad7e4faaba593e2d + 6aa4940c581d1744706dd90d6af8f73b + bbd3c6320118bd47294ed7e9ae20bca6 + 40c5f74b4b09ddd86e0cf1ae45f41624 + 0741965551f93139a9edac5f6cea49e1 + 9bf2418d14ed80ab10da161740257e9c + f490852e3b30ddf18bc1d83d58c37836 + 99cfd40e63d5796b20c96ca02f2756ce + ca2744774b67195cdbfe738555bacde2 + 70b61100c310d357c36bea72e4e45521 + 39aee1a1787edd8a089ab735125a09ef + f5944dfe974637edd9e0674d8699e735 + 9139311ec70d0be9f3d58b92421271d2 + dc9e678d46296b1726a82ef90ef5e0ef + a74dc3f0f53080d6554a95113978d6fc + 2c2fa6a984187dbd0a5f60a6df9abe5a + 195e0831790549d52829261e660f2886 + a98a891e420bf3b5a797718a0951ff91 + fe02e03109c4c13a0e13a1b76ec13452 + c8e6af06542c3532dd1c11c17f3a9fc3 + ac0133d7c2c9dbed0a5794b063e0b1d1 + 2c785c77962f11e3b24d7ee494c7ae46 + aa6be29752461d7dc46b1cf88f6e9bd1 + d910b8f3134faa0e0675989905f1e77d + ba7c3accdbca7e4a837634fabbc68f65 + 9bc2a8c26549b086200b48ec0e0ea0b2 + 24945ed0e2664352747f56463aac5328 + a57a5c10fd40dc0aaf539aea5cfa407e + c2d3530c16cf751b439975e52a141c54 + cfa96a46daa075708edac67daf62e37e + ce652aade8d0048a3086589a7c3d1782 + f6bbca5dde7475216f27b34123383564 + 0aa65bcc82bdaa00078dbf01773ab196 + f0122fcd332706bf488033f22ef5db4f + d6d41e21f547657a9407cef712be8cb7 + 21183e0cf8d0350ef932609cd1a3bc58 + a775cc575b310f931fdd8cbc6337ccf9 + e24722a665efff84ba142a0ffc566236 + f181ca51d701189dd0993aa47dbdbbb9 + e6a217f58c95712da93f2f21d07e4a3e + 0b628b169212d51862b0831f14569ccd + 6dfe5ec120869bb123845218733a3ec4 + + + 5119565d69cd68fae2e2a709363f8754 + 33c2011ba286c19026b8b71716c90321 + + + f8d16ec36dbc90a02b61b73126fea74e + b394a4549911f93e1d29c945d5814f68 + 02848b9245f031223c9b2d8230c3d436 + 5119565d69cd68fae2e2a709363f8754 + bbb6d523b9463f3ecabdcd6e140bd679 + 86f4bec65c1a9f1bc4085dc28bf8e23c + 04743b9c7fb47f495c4dbd19ad6395e0 + 8d846ad5e87908e44b090f35b064bcae + cb8fb3f66bc0fcfd1ecb0e15aacf566e + 94f6123524c81d68a857a61de5cf73bd + 366c5507a992baa872ada5d80efc7bfb + 03c72086baa037779b9b99921f447296 + bf5c072f8a2d3617fb9d594bd1b01e54 + 65881f016b26d3c75ea8e4a04b9c3858 + 05c35f982c6ddb31efe598fd0f60e152 + + + 5119565d69cd68fae2e2a709363f8754 + 2c8c6b8ed662a6d34b65f01f22bb31eb + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + 22160b0ae87b0e3c12254f1115fb7bfd + + + 5119565d69cd68fae2e2a709363f8754 + 81945ff26e6ea41247d627754b1c93c9 + + a9ea95c178008dd85406756688d98a53 + + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 1848abe4b232126ef1a94b7087416267 + 5119565d69cd68fae2e2a709363f8754 + 217ddbb361456873ce1e5e444666b4b2 + cabbfdda588dbd70cacb3b628184d610 + + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + ea9e7e183a01c1bf3ec8aff0b02f687c + b6ac4047fb7fc957907921429cc4b04c + 59b0f4c15b9b43ef643eefa44b5096f3 + 66a5ba49b8353bfb24bc428c08b265b7 + 3575a28597d1faa13eb098e0f17f6b6c + cceff9607d1e52901dae8c6bf3eb7423 + e6444bbf2a7f95ac531711424df97f10 + 118322ad80564a7995f2faf68b7cfae4 + f853e3bbe62631ee961691daacaa4182 + 99acc5e6ae86a1fdb57fbcc4dd84d800 + 659acdefee4adc447e8a941031e4d7c9 + 5980502f646562277511a9e26419c967 + e5bac194a084bc23fec8b13acb788a85 + b5d085309e2d3af036b6ca3b0f0e1f41 + 35be73b897d7b60a5d2e13b245ba79fc + a0fedc49e3892686a595e1386920b4a1 + ecd3f9df25dd48cb7b5be0503b050ca6 + + + f0d49ca6a24304139506766f047465ad + + c3642b0932cc790dde34423b1640e246 + ab21e76cfed498d46c69486548ab5d8d + d5d704be28b1059abd32d49e1a1ead78 + 64ab1fce837c49df5a0813ba7fe03d54 + dfb6dae8305c0f8063b977458a7dbb25 + d3b50216d055f9cada512b0d1f15ded7 + 1db6de3edc77336172d944feb37d38fa + 207a055df96e15317f69d9635cf5f3f0 + 5195639b3b2a49a3a2645484949a2f31 + + + c3642b0932cc790dde34423b1640e246 + + d037ed0758c669be05be288753e99af6 + d56ef3377589de3864467debf2957bac + + + 9a60bf16b383d66b6f3af3e535faf0cd + d037ed0758c669be05be288753e99af6 + 8e37efb6e01f49e6be91a2b9a2a2e453 + 4a25826d6f515a71eb1787a421b335d7 + ca5714885d59766bb761da3f02be42b3 + 4df8ee9f62d4165b525df2266df1e88a + abaf84f7098cb3ddbed8e5baf8fd6720 + 2109d15611032248cc4fb17f3071382d + + + + 84b11097334716eda2bfd7a9c0b98ce9 + + d037ed0758c669be05be288753e99af6 + + a375b84cf462bfc22cd947c174d79130 + ea7722405703074f20738c4c49d31888 + 595c45b478b375ac928ed5f0468e3b3b + 33c2011ba286c19026b8b71716c90321 + + + cf0fcda657dc394fc43250562c28c902 + 0befa64e722f0e6ad458fd12c1e6a268 + bccd4b4e1c1999738f5531c9a304be4d + a19e93248e75340abf5b9494202894ce + befd5320058efee73744cb53f1ac58a6 + 07637492cfa61e1eedac0b0644df4706 + f57550601eb90e9caa30cc9c062dfded + 5beb0e97461766dc692134998b8c7797 + 49cc298cafd16f7883c21bcf8ce6a18b + bccd4b4e1c1999738f5531c9a304be4d + 595c45b478b375ac928ed5f0468e3b3b + 0befa64e722f0e6ad458fd12c1e6a268 + 5beb0e97461766dc692134998b8c7797 + b8a50ccd233b23c5733809e0fa606649 + cf0fcda657dc394fc43250562c28c902 + a19e93248e75340abf5b9494202894ce + befd5320058efee73744cb53f1ac58a6 + e753aefd3c048bf72c79d3128c6e36b2 + a5174d6e76730b8e316b6a6c961a0501 + 49cc298cafd16f7883c21bcf8ce6a18b + 07637492cfa61e1eedac0b0644df4706 + b8a50ccd233b23c5733809e0fa606649 + a5174d6e76730b8e316b6a6c961a0501 + a19e93248e75340abf5b9494202894ce + e753aefd3c048bf72c79d3128c6e36b2 + f57550601eb90e9caa30cc9c062dfded + b8a50ccd233b23c5733809e0fa606649 + + + + 23d923897ddc36cabf69cb540bee4dfc + bdb2c2ab2da4ead12c03ec0fbe02d10c + 035a5beac9cc0d17ec1c8483d033de58 + 2c3c19ea1572f419779c34710dddb9ed + 62f21be78b5446cc27b100ad5acba828 + d037ed0758c669be05be288753e99af6 + 7e6c245e681c416a286b8c59145c2760 + 49b7eaad9aa34314dba13bb42863886b + 78b5c9b93654e3663d2e224dd5237fdc + 6656ba36cc6ebb6c91c5cc3e0c0e6223 + b88f7b01cb7f92ec81c64c7215edfb2f + d072886de1a10f6fdda7e5a393c69df0 + 741f800c29620406c710ec7fdc0aa5b1 + 4150e725210e4d998c51501d4aafecc3 + 6cfd0586808116ba3ff0052b2a4ae627 + 77e8d47293df0cb8283d0a0c20501077 + 58b99694e3b91a73c5fcf69665a9c17b + 1e31a40c4a0f8c6a9eebabb91ca6300f + 866e41079e26898a848bb4bba98c8e66 + 2ddcf825f0a2fe07a96d130a61b3418e + 2f0c955c0ec10db5d809fa803629c9c0 + a19e3e56d722f6dc87943668668e7be1 + e473399d35eb714bccf2c3480eafb883 + 2f12d0b959fb266a8340473e6de8a148 + 6d9429c2adb0b5f872e527a60996d1b0 + 6b11d2968c574d0f98f6be38a0f632cd + 18f0190e7f8c5f9fa968ef740029c1e6 + df1ba2d1aaaa6e9372d73bad385577ff + bfb6402757e623744177b342613a98e1 + bc15229df3ff06eaee68179ad9cc3742 + a0bbfc02b4d855e085a832123642fb59 + 3dc5218c6aa15882458e85a69a8c127f + 076844064a9c6a8b02a354330d771332 + 12683c67208fb66d7bf99208493c5382 + 0a4a8ed51a185a6e2ea7c7f982a12ef7 + 1130c9daaad7778a425bd3602aec357f + + c3642b0932cc790dde34423b1640e246 + d326403287715609c3d7033fa94c29a5 + 47c92ba99225ff19a6c434d6061a1f21 + + + c3642b0932cc790dde34423b1640e246 + + 7321fedcf5be7a32a1a030d5713e4c57 + + 4ca8272bfb5002c773ceb31bb043fdc8 + 6c83e9d3602e14541b9046b2086539e5 + e7ebe81692ef7de441484b08e13c1f9d + 204acc9a1ce2c266fd80a6d8145477ce + 595c45b478b375ac928ed5f0468e3b3b + a5bb3f798881353e9072996465224db9 + 7372d59864e0b051de27b9c46484d740 + cf78730f9753d9cd06e3ba3d2a43270d + 8e06b04f25371cdf398594e5bb930da1 + 2044e8e2951e536d3c5537b49c6b695a + aa004932d9fb8f30bf124e0c77245b8b + b6cf3d68af42516e30925b9271856af0 + 912a0d18d7fb29b69d873d34774718d0 + 3aebf4b9b1b8cd210218940f3a5477b4 + 13a27b4efa25fcf6b5da97f8ef8c6d2f + 0092fc8943017db9d12c395d08688dc1 + 7f4bfd92bd345871e77146dab109e503 + 55d2293547ad473206734a613dac7a9a + 0ff02b9b53a80c1842859bc1e345fc15 + 34984e484912a9ccec268194c6555722 + ec0abbf2b2f1b3a31506a34c30d715c1 + f8ace7d59b4d57bed558717022e25e62 + 1089b597e298dee4a113131d19a60999 + a94a5d2eee62d2fbfe53e6ad4e74fd00 + f832d042921ce4a4ef2de3015765aaa1 + ddbd9b914a9f59c1c8b772a0530bb170 + 96059bf991de1e0b8b1766c57b140a08 + 692ad73c158ac2e9204739c09986fb35 + 77f9313b8c24aa0f5bc7e5fab83e96a4 + 10a95989c3b27d44788f81d5a25b72b4 + 1b4afc043ce33ac3f62153ee347902c7 + 923ab4cc04dbe1c26c343e040a99b8e7 + ccfc0688d8ee8f44824806e1bee474b6 + a235f14a3e53df14b96bd795f051c39c + f5bf9bc4dcd66f51173c17d7511d174b + c20fd074ff84dcf9032d9734a0606e81 + 8150e2261c1824ac3bec30767286e74e + 5d897cfbaa2e708e6b4dd81d517bb117 + bf33cf1e4f19952e32b3822485e7c18d + 34cfd60df105f5551ee32f669e011fa9 + 932edb2df425c1a9c808db4be2fd3355 + 88a98c6a1baded6e7c1e55694ae35beb + 433b7f5078913fa3e94fbaff11a3faf5 + 22e47427cb9e070ea451a73d8f52ff1f + + + + + 2716c23368068ddaa60d0eb19cdb1db9 + + 31d2324f8172c69bbf791bf0b357413d + + 595c45b478b375ac928ed5f0468e3b3b + + 3bccd22f8223bccf157a69f8586dea12 + e8243a241ef079a5a282526aff0ee798 + b5c91ea37428f24ba64a11a0566aa58d + 9545771e9233607a2f25fdb1b61b3706 + 31d2324f8172c69bbf791bf0b357413d + b5c91ea37428f24ba64a11a0566aa58d + b5c91ea37428f24ba64a11a0566aa58d + b5c91ea37428f24ba64a11a0566aa58d + eb956fe312fae8b6bacd9334fb60f1d6 + b4b4fabadd60cd78e751f2edafc8e851 + 3bccd22f8223bccf157a69f8586dea12 + b4b4fabadd60cd78e751f2edafc8e851 + 8e67d96cd5129daab10c724aa4022e0f + b5c91ea37428f24ba64a11a0566aa58d + f6b4030164330f5c8e104b6eaf4f12f0 + 5e5ea628ad58aa15555fa3a2a37ee79e + e842877095a894e4b4c78a57c5840a45 + b5c91ea37428f24ba64a11a0566aa58d + f6b4030164330f5c8e104b6eaf4f12f0 + eb956fe312fae8b6bacd9334fb60f1d6 + eb956fe312fae8b6bacd9334fb60f1d6 + e8243a241ef079a5a282526aff0ee798 + a1a45258818880d306502db4976b8dc5 + + + 28fb2b9737f87bfd2d0ae4226c8915d6 + 31d2324f8172c69bbf791bf0b357413d + 4a7493838090e7f59988d8ec461402a9 + b8e26f09d0ee06e7d2bf8dcd1dd58f09 + 1af889ae9bfd37bc6c89fc793f5fbda0 + 71656ee0b95d0b27e7bd77303bba8760 + 423312ac10b68bc9eea1c5c8990cee9e + eca41df1130c878fa6e55e9f950b0044 + f68f4c694d15cc6c7a734e2892ef8c33 + + + 288e2ee9727d10820fc5179e78f437b4 + 6f972930b70955a4fbc857d4cb0b3b3e + 5db09f51f262c3037794a535a50303c5 + 3fbde2ae2f45b0857ed534eb653cfeec + a108ed2f51173b8f6461492d9f500f40 + 9142329920a8a7e42b2caf4bc625e2cb + d345bf3872aed01ba228d8086f90954e + 8ea188a0b54e98fb5efa96ec18c08bd2 + 5389b702f5ecfcd708de61dd85c62e04 + 3332940823fa3abf1d66f490b4cab95e + a857e0c5f53de66604d71a332e2f07ea + fac0f0bcd8ef18c528e901bd8a568dc8 + 4fdf9a117a062c1fed90be67799d6b9e + 970da53e6d431a6d449dc489aff92f65 + f93207a82ec51b3dc918a8d03a6a8f3c + 13b10aae393a472506e29b0a4473d3b0 + b3c667d7afb41f645b7e2e90777fa46a + 6414468b368772686d46eb662ab195aa + 6ea5a06db4a519f12fe576ace7be368f + 2981f6e5635c88435501c622f664cf94 + 3cdab6c9f7dbd5e5c9ae8a0b4869ae1e + 9d634ef580e8ff3bdb688562b0e04c10 + b2048175992314608100103548e8e341 + 58be3ccda3393e534d0f1ef2673a45c8 + b0666babc79daa0a346f38f205fceead + 523b749e88f3d044495397366add7660 + 31d2324f8172c69bbf791bf0b357413d + 245def5e5fe2ea4d5142f5463122cfbf + 0d3e2272bb01d4f3a61c96ffd7c1b6dc + 6899bc06bb1281677a584cba48a01470 + 8be7be94329288d6298cd8907f98046c + 19d16771b2c5f53315779a8c693f64ae + 674a5b3faa63741d216f2d8aa73f7254 + 4e644ab13be4d5f5cfbceaf74eb10a94 + e3303fdf5e42c2bca13c2bebc6467c81 + a1871a78c94db9059b59f2f860d6e77d + 07088411014bff3326991fb9ca75815b + a4cb67b2fa84ab05a35d6e6a71eaf769 + 1a3a37ed7bdc4a73ac03c4fc27893687 + 21b9088727b37e2e02f67f6332b6cd1d + ddd257bec54ca925a7939edb32888478 + 22860b44d75aec97399d6096b67d92d7 + aae502ca4186cd39b6b883adacdcca5c + 890fbb28d8b6697b27d3e929ea69435b + d466716d92158a89d600a81de1964601 + 3e1aae6dad337887b6a91ec7e28bca0a + bc5ddcf998ea9fe7c114d2b6cefa00f5 + d3c68be0d7e4d07cd4fa0d73fdbc12fc + dbace6dfbebff016fd45f8bac46229ae + 68d0ac2b1ef978822540611233f01185 + fac2007586d6da4703ec32e3e2b26495 + da032e2b7490dcf5b5f71e9ea71045f5 + 0be83dff4ef012f1177cf1a60db193ca + 1fc243b799ccac45f79335c9d10aa6b2 + c6e5e63e0c77229ac0ed1b0a39eb36c7 + 76401956d996f4ad5caa7b157d7c18fe + c7e777c4b9f7e28f0427ad738fc0a84d + 644a90d25613af15fc67226152e97601 + 05590e0dc2d207a0d4b924508e2cbc96 + 651b2a847db3a1d1d355b19443a1e964 + 615ef575b501a787a5842a6139331b3a + edcea1e185213ae9ac23d6c10e542ed8 + 152e464c23b5d650f9f0befd3910083e + 350c14546a642556992b60ef57f31ebe + 6236d69e15da012c67bc708c933620fc + 98518dde8d443ed8b4d5f56de0d0b0b9 + 3e9adaf2b005e83c2e4fa1634ef63afb + c44a4a624073338241d9f672fabe4f0d + 7209a1a0e380b8a396742068c3a0bdef + 0666683386ccf4e1d9ac4f21f3b3c3a4 + f642067c4dea9b0dbfc0ffddb793ffcd + 823b3f6fbbf22fd5711a126682fc2c75 + f3b27bd7a41e33edc2c6f3a027e4fdd1 + ec502e15b995e5e4278d52f66cabdd30 + a06b680ef8a337faeff88bc8cf07bf9a + 14f607ce830217748aa2898a092c650f + 96744e1b0b01f4b0de8814585fe5bc0f + 9f52049f11e77d5e6c2ad552d16ad599 + 8474437fa92a32c1e9584ecaffbd0d2d + 5ab773a616ea0d2cb94e6268ab6fd49b + 49f3a88df72c1f551b1115d2cc0fe724 + f84c56e4be2366dc1794a37e14abf773 + 8194073aabc96e8dc4a58622c9f59054 + 2e95f1118200b4d625f622101c87a139 + 9728b1baaab9a79b67b6c37818f8e5f1 + 28977c1c643875a5c1a312b203f4b72f + 59939a7a512e5035643101c92929bf72 + 61ae51d009514a8107f65f89d81716d7 + d29d2ad9902e54c1800bb6976f79727c + 9385778027b36c730c486056a62cc64a + 0c2e0eadb5ef4cb2a93d0fa16334058f + 874609e50f35d18ca5b71e39f6b6772b + fb3daa210c8922b489a5e55b338692a6 + a4e1832017fb08496ae0f312cadc13a9 + a3f0d3e1091115f241e254ea5891e76c + 207f5806eedc8c45fa3cf25850354500 + 756ecc45f1910199b9da3057e697132c + 1a889040179de19ff3b60961bb06d467 + 60404665635cf28068789bc4c462a529 + bec9bd3ad1e12bc348bbf86be99ea620 + d6be44327a1535d68e0eceabf82c7689 + e3685749e4a25843e0dc6adf602b21af + bb9fc9ca93c12ce728514378a2e171de + 113d428e194f4d72efe334630ef0af7f + fd3974746b3a0a89781199162f7fed84 + 0b3dc77538411eb9db790113097d39fa + 9705f2ef7a17328add1f295b07d575f8 + fed84eb6e146c0ed9b0e574243728c86 + 1798b526faf550f47735c30ddd0b9e86 + fb1bca0e3b9b3ad90539887c9bbebcf5 + 649833040499882d4f8d422faaa24b73 + 6da67d1f115785baae8f038b502fe18a + c42908629f28afc5cda77689f1c4ea09 + d72b72e5494b488f26e656a658b81a8f + 1ac9bc12fb5feac0683a93dcc968662f + d11b9baec14a7b8e48bc09fe42c65c70 + 16609eabafd4681dab87e84021808146 + b302d596d736fe462d66bee11c7d73e0 + 016dde02885a9290970358a7a2fba969 + 2e21a3258ca670b6b2fb3beaa5c846eb + 729fc24ba4f3b0366c71a01f57600d01 + 7219b561bda46d47d1e8535b2b1abf6e + 85ec4af1a8138fd10c630362e46cac03 + 509ff2e6970bf371f162e3c2fad88fed + a89fe1c460c9e6e288e91077eeb50d30 + a0f46b04d369acd45c02ee8eab900cdb + f28d170e2cbe89c243b33455d5332f38 + 48bcaf25ece8f8b2167385892bff2928 + 24b5c9775d76fd6e516ba4538fe5ed4d + 3a4946f000ca3fbdc541b69f57cc74e6 + f7588cc5f898014df32f0ac690ec1dce + 529aec63aeabb999920de587ebbf7a68 + 5e34e188d5bbe42b5763ee38b6dfe8a8 + 84315ea453118f8881d7b5199c53a8b5 + a96dae2222045b75b3fa44f48160fa58 + 39c4f80756169028f1215f20afd10fac + 68ef394ecb5ee8473535c6c89b843b89 + 3c1fa2a23281914587c27bdc0df1f116 + d70aa95b4d6743d7853a3c13d812e866 + 1e88c76847fb10d92d3b6ab98c00f32d + de90e485283d2a02da0f41ee995288a0 + ab5c54ab82f95073f91474ca040810e1 + 4f1d9388a7403dae1cb8ed7ddb515aa9 + 4dd83fcd715831899950a65c83e49e52 + 709438276333187f30d1fe6381243306 + ea3ad6c4358719199972db1e72c6b5e7 + 93930217561c2540727d5b75c3a04f4d + be87bbfecd6052108f6319251fc654b2 + 7612b0e5c0dcae2cbfe90f747888cd90 + 79d72204f7635540f1d06991bf122f1a + ecf3192a3d49ce63edf8b5cc7679f923 + 0b27100a1c85deedac8e36fabb4a0b2f + 34d5d944110aba712be44b9f8bce1ae0 + 1ea21ac4545e844e3729e750e7d09f55 + 625eb14377b880d8adb346f2cc05642a + 33400bc5168f5d17de2d81066e841ef1 + bc9137736e98977f2ec6b5922209bfc9 + 58a7b918483936aca1b3bf15fde2db42 + 0de6f2cd8cbacae17809d4245ee0f5fd + dab6877272652a3fb160e9015fca2a2b + fc2155888d46ea053b8df79cac553aae + 368ec1fa60eec952ef5620b6f001c4ec + ba3dbc1a2fa6a8e5615865a2186e4236 + + + 31d2324f8172c69bbf791bf0b357413d + b839517b3405250c06cdc288f86cb3ce + 973ee0d22542731e72c4ca8d1d40508f + 045bd57a3ab9d33d4ddf643dd838cb10 + 22edb097bf9f9391408f7308035bafca + 39095c190886894a518f4bc31e93ad22 + b3af012929ca1c2b0ecc945b52b7371d + e6d1c57227b484c23d16c414602cb98f + 352421e6ddbad861913cdac2522353e1 + a2de4fa6e9d2ed1b13070ffa84fec926 + 9130df83ff43c2d5c6bf680be05470e5 + + + 31d2324f8172c69bbf791bf0b357413d + + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 289fceda217195c9a27ed10b638f7ff5 + 2716c23368068ddaa60d0eb19cdb1db9 + 8e3eda99b7b4610b62be6535b2f525ae + 48100c4fe7e32c1aeaf174515c417404 + d928969758309455a47836f7958073c8 + fcc043dd61744ba8bced06ac8ac70285 + ad6ce91f799e5e60a2c1d5b4ef97e40e + 03d7b41bcd9dd7178310d1ae2964a275 + ac2c917efe89ba5d4f2cc9509b18ac1c + 43bc3c1af19226377738d79c86466845 + f59a5a5704db3edd8734450a4799be63 + 13dded5c662ef0bdfc615a0d79cbb996 + b31131fb5bd4d1cad19606f44739d7a2 + 77585bd3f0cdcc59ec72c25688f59c77 + 9ad34b1d5e1d1e8bd9306d10ce8518ce + 834237400801bf94a78ff0f7310a9136 + 35e5268e0c362472d844f711543b32fd + 133084bce4a1ff88cef6eeb1f308ca16 + 8beb7ce04faa377ecf3b9d2e092779a5 + eca3deb0c257531a305951e2c43197ba + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 70ba6f480f1d8042d64da565e5253173 + 2716c23368068ddaa60d0eb19cdb1db9 + 1350d0f4abdecc1a7d4697bf11f5e500 + 1a77d101449ab8772bf16cb986aa95ae + d928969758309455a47836f7958073c8 + 00ea4ec207c8e90ac29ebd3b4828e809 + d0abe4c415de7dc3e3d961f86b6c0db9 + 03d7b41bcd9dd7178310d1ae2964a275 + 4d359ea0873580e0e6f4ca8e48b38698 + da972e40821b88f7b1ad314131c1f113 + 7377fdddf04797543edecee39ac43547 + 13dded5c662ef0bdfc615a0d79cbb996 + b1cc38c0c0e031dc661bc6a76040009d + 9b8dbda2e203149d8de9ac96026ef38b + 0ccbf91fccb8f4cdd7fa9f4bc99e2c63 + 7fe10492fc7e5609cb705ab98cc56c94 + 64de570270a3e9571791d6094a124e4a + 133084bce4a1ff88cef6eeb1f308ca16 + d709b1e682f4f39a2cdf9b6c88045629 + 2fd54c83f7374934333beff90214349a + + + + 31d2324f8172c69bbf791bf0b357413d + + 4d58055b6eb9bad1dca951fb3d5e51ef + 2716c23368068ddaa60d0eb19cdb1db9 + 8e3eda99b7b4610b62be6535b2f525ae + 1a10b92fe2f6a36570e1b3468f756f91 + f6cead52deb85a4517b669d89b7dbc76 + e9fa2cc48d59420a0432982ff6a4acaa + 03d7b41bcd9dd7178310d1ae2964a275 + 56b335243fcb837a5a11b639a1d60ce6 + 15823e255826345511bd5eb4e975beb3 + f59a5a5704db3edd8734450a4799be63 + 13dded5c662ef0bdfc615a0d79cbb996 + 1dbe2fe37830ae1d1c7866099d1d5c59 + c33309d6b6ec6b1ade97b5a90ce765c2 + a735fedcc82cf6ec35905fda9b001a23 + 3a67bdd3f47dcbcd6b2b3886fc2cdcce + c52280a56e908545f5387821c1662312 + 133084bce4a1ff88cef6eeb1f308ca16 + a8499c2bdaba4dbf6e20a7d642bdf6e3 + 3fcc309b71e31ab38aeb66aaa3d4b468 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + 595c45b478b375ac928ed5f0468e3b3b + + 31d2324f8172c69bbf791bf0b357413d + + 2716c23368068ddaa60d0eb19cdb1db9 + fcc043dd61744ba8bced06ac8ac70285 + + + + d037ed0758c669be05be288753e99af6 + + + + + f67ba3bf642354d099831f7f7b0bb3fd + + 595c45b478b375ac928ed5f0468e3b3b + fe9fe03b5bef93a0e1063fd6dbcd5180 + + + 0eefb158d7484a6c2386e8edc8f57902 + 8ef413f277bf144aac43823c13f4b595 + e14f53e8aab21614b0e1297c165582fe + 595c45b478b375ac928ed5f0468e3b3b + d80591ae5aabe5e02cc1165510f28f16 + df3f271d866ab3835b869d4104d0d25c + 574d44b7d837ad122c94efae6b05e53f + 77d6b8b3067df8964bab5a68d2ff99d1 + e445ced70a8ddcd82b9d04729a4b46a8 + afe05a99619ce4e39949da0c0cf6f59f + + d037ed0758c669be05be288753e99af6 + fc545f48294fb13f3774f4c47306e479 + + + 61d04e40eef69ff6524787296c11a9f8 + + 595c45b478b375ac928ed5f0468e3b3b + fe9fe03b5bef93a0e1063fd6dbcd5180 + + + e14f53e8aab21614b0e1297c165582fe + df3f271d866ab3835b869d4104d0d25c + 595c45b478b375ac928ed5f0468e3b3b + 77d6b8b3067df8964bab5a68d2ff99d1 + e445ced70a8ddcd82b9d04729a4b46a8 + afe05a99619ce4e39949da0c0cf6f59f + 574d44b7d837ad122c94efae6b05e53f + 0eefb158d7484a6c2386e8edc8f57902 + d80591ae5aabe5e02cc1165510f28f16 + 8ef413f277bf144aac43823c13f4b595 + + d037ed0758c669be05be288753e99af6 + 042a35163c185ce43a20bb9305f7d470 + + + 7cc675ce2d1146938d85b35aaad56fbd + + 595c45b478b375ac928ed5f0468e3b3b + b05e2601d32ec7b1a0ed03dac7d1351c + + + d80591ae5aabe5e02cc1165510f28f16 + 0eefb158d7484a6c2386e8edc8f57902 + 595c45b478b375ac928ed5f0468e3b3b + 8ef413f277bf144aac43823c13f4b595 + e14f53e8aab21614b0e1297c165582fe + afe05a99619ce4e39949da0c0cf6f59f + e445ced70a8ddcd82b9d04729a4b46a8 + df3f271d866ab3835b869d4104d0d25c + 574d44b7d837ad122c94efae6b05e53f + 77d6b8b3067df8964bab5a68d2ff99d1 + + d037ed0758c669be05be288753e99af6 + ec435679d4d1c292b9c83274312e135a + + + 851bccb2cee9e764ce3a384d58166cea + + 595c45b478b375ac928ed5f0468e3b3b + a76b0feeafb97163377927c3895192e9 + + + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + 595c45b478b375ac928ed5f0468e3b3b + e14f53e8aab21614b0e1297c165582fe + d80591ae5aabe5e02cc1165510f28f16 + 574d44b7d837ad122c94efae6b05e53f + 0eefb158d7484a6c2386e8edc8f57902 + afe05a99619ce4e39949da0c0cf6f59f + 8ef413f277bf144aac43823c13f4b595 + e445ced70a8ddcd82b9d04729a4b46a8 + + d037ed0758c669be05be288753e99af6 + 77c6d23306efe664b56a36fb268a3bfa + + + 707ab7acaa57a3c39f975a2213996696 + + 595c45b478b375ac928ed5f0468e3b3b + fe9fe03b5bef93a0e1063fd6dbcd5180 + + + 3b54837bb6ce59a6332b8318f72b2c36 + 595c45b478b375ac928ed5f0468e3b3b + 574d44b7d837ad122c94efae6b05e53f + df3f271d866ab3835b869d4104d0d25c + ab2f75e00a47fdcd0d0312ce347aa490 + e445ced70a8ddcd82b9d04729a4b46a8 + 0707e9a1d34560a59fe7477d21126770 + 52e69637c0ca6192d00332a8d2e6d6b8 + 443f3da873ab1bb832db7bec2bed1906 + 85c8782f1233a876dc2c539793d165a0 + + d037ed0758c669be05be288753e99af6 + ca11c8ee0d944b8933662d5516e51b1a + + + f53792e988ff8b2407b8e34a7de3fc41 + d037ed0758c669be05be288753e99af6 + df30eeec97775bd26cc49402cc164159 + + + ea7db37ebe2ce164ecf47af23fac6068 + + 595c45b478b375ac928ed5f0468e3b3b + 5bbcef8c4a6857a0ffe7470d11e922c8 + + + afe05a99619ce4e39949da0c0cf6f59f + e14f53e8aab21614b0e1297c165582fe + e445ced70a8ddcd82b9d04729a4b46a8 + 595c45b478b375ac928ed5f0468e3b3b + 574d44b7d837ad122c94efae6b05e53f + d80591ae5aabe5e02cc1165510f28f16 + 0eefb158d7484a6c2386e8edc8f57902 + df3f271d866ab3835b869d4104d0d25c + 8ef413f277bf144aac43823c13f4b595 + 77d6b8b3067df8964bab5a68d2ff99d1 + + d037ed0758c669be05be288753e99af6 + 156870cc5f039af43c935d557a8c68c8 + + + 23dcbbe74e9597f643a7978ee6eda74f + + 595c45b478b375ac928ed5f0468e3b3b + bd1786ef20e6fe10d83f38febfd20f64 + + + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + 595c45b478b375ac928ed5f0468e3b3b + 574d44b7d837ad122c94efae6b05e53f + 0eefb158d7484a6c2386e8edc8f57902 + e445ced70a8ddcd82b9d04729a4b46a8 + afe05a99619ce4e39949da0c0cf6f59f + d80591ae5aabe5e02cc1165510f28f16 + 8ef413f277bf144aac43823c13f4b595 + e14f53e8aab21614b0e1297c165582fe + + d037ed0758c669be05be288753e99af6 + f0f49b64a2d82b58d65c954d7154e6f7 + + + 3ecda59bbb4fac590b35acfd5903e995 + + 595c45b478b375ac928ed5f0468e3b3b + 51d6d11f1a51535e875823a4d4c1e3df + + + cc7fd157dd7c780ed09e2e2744df8319 + bc15e6ee776368d6c749566225930d60 + 236d0063658ad4d170f42f08ab33f3c0 + 595c45b478b375ac928ed5f0468e3b3b + 52cc2d4e855da0f859609786a8fec02d + 86abfc8e45549b5214011e500e0edeac + b4540b9193852aa5c8fee4b1081c0c8a + 41bdf8d4b3166cba12f6636e98e1dc2d + 86abfc8e45549b5214011e500e0edeac + 82a37508bfdfc9946a733486d999cf6d + + d037ed0758c669be05be288753e99af6 + c9064c0a0adea0cee1add9d4b5c44581 + + + 1dc5c0f67da42db3ec031e1be11c26da + + 595c45b478b375ac928ed5f0468e3b3b + 28311055aab50e6931b10088583985c7 + + + 595c45b478b375ac928ed5f0468e3b3b + 574d44b7d837ad122c94efae6b05e53f + e14f53e8aab21614b0e1297c165582fe + afe05a99619ce4e39949da0c0cf6f59f + 8ef413f277bf144aac43823c13f4b595 + d80591ae5aabe5e02cc1165510f28f16 + 0eefb158d7484a6c2386e8edc8f57902 + e445ced70a8ddcd82b9d04729a4b46a8 + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + + 595c45b478b375ac928ed5f0468e3b3b + 9378d7bfa02ad5fbb87b45595148c4b8 + + + aacaada77159eaf3607fc75d9bbe6c92 + + 93d5495f87b63174d1c69e526efcefd4 + fc24e21ba68c387194d04423b632cef9 + 728e8737d343c5f8ff14ff4f1c2c6d7c + 595c45b478b375ac928ed5f0468e3b3b + dcbf4b2607b972b2ff9ee7fd66b88d74 + 953e8afbdfeef5c6e7a5686df04aa5e0 + 1ae6131e6bee91cf31ef21027b5ee540 + 29ee60c6f66d123357049820edf8c6e6 + 79dd4edd1ad695f122bca0d0af783ace + a239839e862187d02920f24a58220687 + 8d4b470dfd949936621f77716853cb9f + 548fa5957ddc16529afc1008d557b6b7 + 8d539a8ee50ca2942e544d101926fca2 + b9ac84baa4534488cbd9268ec4a08518 + 76391a13317ae06efdaf2ceb4853e0c8 + 9f1e3e1641330fe9533856d0bbe020db + e7ddee249e2a9c9dc9ad249c2484fa91 + 23d5d0937ba2ac4fcc8f5f18d95db1c0 + c972ae7612f73e2490fc022ca5277cb0 + + + afe05a99619ce4e39949da0c0cf6f59f + 595c45b478b375ac928ed5f0468e3b3b + e445ced70a8ddcd82b9d04729a4b46a8 + 8ef413f277bf144aac43823c13f4b595 + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + 0eefb158d7484a6c2386e8edc8f57902 + e14f53e8aab21614b0e1297c165582fe + 574d44b7d837ad122c94efae6b05e53f + d80591ae5aabe5e02cc1165510f28f16 + + d037ed0758c669be05be288753e99af6 + e9a8d4e57a4c51b316cbb0348644fa20 + + + 02669397efde49144311dd654a056924 + + 595c45b478b375ac928ed5f0468e3b3b + 308c8e87e0ddd1e513fabf75ed6a332e + + + 77d6b8b3067df8964bab5a68d2ff99d1 + 2bb741bc711cdc199137eb72256945e2 + df3f271d866ab3835b869d4104d0d25c + 595c45b478b375ac928ed5f0468e3b3b + 1d95a6ca66aac008ce3b09d88126bd8c + a2223fb30f891dca63a70f7303a9c401 + fbbfbeb9c8e5cae2b37861df696ea1c3 + 5f6c8820841fec9e6ad57ee7dd3804b7 + cded9c7c3857895d1351ebba28ea549e + 3a6a6d91f16daae3b6dd4009a9bf0b53 + + d037ed0758c669be05be288753e99af6 + 6b80847339fe80b5fb3c3a2b6d1fefd4 + + + a9daf582c4f367b1e044c872745612f4 + + 595c45b478b375ac928ed5f0468e3b3b + 78a08cb2ba592d0b73c8e9864f43304c + + + e445ced70a8ddcd82b9d04729a4b46a8 + 595c45b478b375ac928ed5f0468e3b3b + afe05a99619ce4e39949da0c0cf6f59f + df3f271d866ab3835b869d4104d0d25c + 77d6b8b3067df8964bab5a68d2ff99d1 + d80591ae5aabe5e02cc1165510f28f16 + 0eefb158d7484a6c2386e8edc8f57902 + 8ef413f277bf144aac43823c13f4b595 + e14f53e8aab21614b0e1297c165582fe + 574d44b7d837ad122c94efae6b05e53f + + d037ed0758c669be05be288753e99af6 + e1dbdd8d588abea533fb28f2ea9e3b1e + + + 56f5d18c76838eb6a3332fed3dc12b24 + + 595c45b478b375ac928ed5f0468e3b3b + 4a28aad2e4384732026860ab738eb5e1 + + + ebddb83fffdded0034ba476e51b0b8b0 + 595c45b478b375ac928ed5f0468e3b3b + 7fd596b650746b1bdc14406350a7fac0 + 7fd837ee931700a1b89fc4e553182a65 + 0e92b7b8d9a515fa911eca1fa93e856e + f6c5a3331a5ae4f7e9bf235a9e6f1bac + e0e4e87bb29d39930db66e8ffcff2a2b + 2d866913a046397de712ed3c333f301c + fc0dd47755fc0cb80b9bb4e875688653 + 557de62a035abe08c60ca84c23eb4b2d + + d037ed0758c669be05be288753e99af6 + 270fe9fd0488be1b1bbffbcf2b2911ee + 1828e7fbac5383f9d04bb33cf04b1a81 + + + 338ce413956a8540dac2be554f234242 + + 595c45b478b375ac928ed5f0468e3b3b + 36e21b247224093a8a89a3235bf25749 + + + 595c45b478b375ac928ed5f0468e3b3b + e14f53e8aab21614b0e1297c165582fe + e445ced70a8ddcd82b9d04729a4b46a8 + afe05a99619ce4e39949da0c0cf6f59f + 574d44b7d837ad122c94efae6b05e53f + 77d6b8b3067df8964bab5a68d2ff99d1 + 8ef413f277bf144aac43823c13f4b595 + df3f271d866ab3835b869d4104d0d25c + 0eefb158d7484a6c2386e8edc8f57902 + d80591ae5aabe5e02cc1165510f28f16 + + d037ed0758c669be05be288753e99af6 + 1fe52dad1b85d35f7dfc053e18b807dd + + + 7a27ba911d223ab60b23be66b86fa48d + + 595c45b478b375ac928ed5f0468e3b3b + cbda5da4c4471bbc270835d3fd8a4cf5 + + + 2b858b6d04bea08bbce305579951e87d + d021247b8c16b73753a4eaf6ebdc320f + 595c45b478b375ac928ed5f0468e3b3b + 819bbcaf25607bfa9e890d792f20582e + b49b07697aecd8dc65d9a6c5f8c5596d + a6e4f44cdcbaa51f3bb90112cb311eb5 + 40e24d1f84d3eaa75493fcd78f2a5f88 + 80e918a5e71ddae8fddbfd3c68d4590b + 22238db082230d1d72383518bd07028a + 6510476dd1677e1fb069500101ac6bc7 + + d037ed0758c669be05be288753e99af6 + d18fb6de97f14cb0806a944a2b0c254d + + + 7cc56c23b2c4fbe82c1216070fb4a144 + + 595c45b478b375ac928ed5f0468e3b3b + 76391a13317ae06efdaf2ceb4853e0c8 + + + a2223fb30f891dca63a70f7303a9c401 + 595c45b478b375ac928ed5f0468e3b3b + cded9c7c3857895d1351ebba28ea549e + 2bb741bc711cdc199137eb72256945e2 + df3f271d866ab3835b869d4104d0d25c + 1d95a6ca66aac008ce3b09d88126bd8c + 77d6b8b3067df8964bab5a68d2ff99d1 + 3a6a6d91f16daae3b6dd4009a9bf0b53 + 5f6c8820841fec9e6ad57ee7dd3804b7 + fbbfbeb9c8e5cae2b37861df696ea1c3 + + d037ed0758c669be05be288753e99af6 + 618d5afb3ba8a275f1919ae12edfa47d + + + bbf40d0cb0ba0fd3f8cff6035bf46ce6 + + 595c45b478b375ac928ed5f0468e3b3b + d0d304a71c67039c4d17266dd63159ad + + + c2ef67bd45e3cb1388dfa83dbf687193 + 595c45b478b375ac928ed5f0468e3b3b + bfeeac6a2e216061c8de53f0c829b839 + a5377dbee090f5e6502925d8c8dd4aed + cb61bca9b6cf3cc8f29d27dc9f6ab14a + 040aaab5ace98f19ae6cb3d406dba697 + d5742040275fa432beb87bf11149cc2a + 81a4ada1dc63663182dcc20fb8e9c765 + 81a4ada1dc63663182dcc20fb8e9c765 + 508fa35f593aa06ff22262fbc747bbff + + d037ed0758c669be05be288753e99af6 + caa36bbe11f842d1397b984b8d9c351a + + + 3d04c341c8802f36878a8fd73c039045 + + 595c45b478b375ac928ed5f0468e3b3b + 76391a13317ae06efdaf2ceb4853e0c8 + + + 574d44b7d837ad122c94efae6b05e53f + 595c45b478b375ac928ed5f0468e3b3b + ab2f75e00a47fdcd0d0312ce347aa490 + 443f3da873ab1bb832db7bec2bed1906 + df3f271d866ab3835b869d4104d0d25c + 85c8782f1233a876dc2c539793d165a0 + e445ced70a8ddcd82b9d04729a4b46a8 + 0707e9a1d34560a59fe7477d21126770 + 52e69637c0ca6192d00332a8d2e6d6b8 + 3b54837bb6ce59a6332b8318f72b2c36 + + d037ed0758c669be05be288753e99af6 + ed69efa49cd56147a489a7a5d88ba5d6 + + + 463b2e20ef6e64ccf81840a69bc3f32c + + 595c45b478b375ac928ed5f0468e3b3b + 76391a13317ae06efdaf2ceb4853e0c8 + + + 595c45b478b375ac928ed5f0468e3b3b + afe05a99619ce4e39949da0c0cf6f59f + e445ced70a8ddcd82b9d04729a4b46a8 + 0eefb158d7484a6c2386e8edc8f57902 + 8ef413f277bf144aac43823c13f4b595 + d80591ae5aabe5e02cc1165510f28f16 + 77d6b8b3067df8964bab5a68d2ff99d1 + e14f53e8aab21614b0e1297c165582fe + df3f271d866ab3835b869d4104d0d25c + 574d44b7d837ad122c94efae6b05e53f + + d037ed0758c669be05be288753e99af6 + b263dcb7e74885d73a7cc72d2e51b581 + + + 2d3aa55d37abc1a65e851c169339e198 + + 595c45b478b375ac928ed5f0468e3b3b + c7c2d7d88945f0a9d56cebb6ff0ca36d + + + afe05a99619ce4e39949da0c0cf6f59f + d80591ae5aabe5e02cc1165510f28f16 + e445ced70a8ddcd82b9d04729a4b46a8 + 0eefb158d7484a6c2386e8edc8f57902 + 595c45b478b375ac928ed5f0468e3b3b + e14f53e8aab21614b0e1297c165582fe + 574d44b7d837ad122c94efae6b05e53f + df3f271d866ab3835b869d4104d0d25c + 8ef413f277bf144aac43823c13f4b595 + 77d6b8b3067df8964bab5a68d2ff99d1 + + d037ed0758c669be05be288753e99af6 + 12347349a9edcfa7d40bad921a06fbab + + + 89ebafb37ae968eca42a16432cceb18f + + 595c45b478b375ac928ed5f0468e3b3b + 337ef6b1f67bed287094a647d4bdca18 + + + 574d44b7d837ad122c94efae6b05e53f + 595c45b478b375ac928ed5f0468e3b3b + e445ced70a8ddcd82b9d04729a4b46a8 + e14f53e8aab21614b0e1297c165582fe + afe05a99619ce4e39949da0c0cf6f59f + 8ef413f277bf144aac43823c13f4b595 + 0eefb158d7484a6c2386e8edc8f57902 + d80591ae5aabe5e02cc1165510f28f16 + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + + d037ed0758c669be05be288753e99af6 + fab66a54e54d441a83a6eb8eb436f14a + + + 7f435f75ead8ddd635cf89f0ba60b569 + + 595c45b478b375ac928ed5f0468e3b3b + 094ecc2e19bbb5760d2c7557f827ca42 + + + 595c45b478b375ac928ed5f0468e3b3b + 29ab502f6168a555436eb13fa8c84684 + f34589d58299f437e88dd907638d5073 + a24070921bd0eb886301b2e2a47a918b + 9e087aa9f49320d1586ac066966c1063 + 713301ae1d62537d38c05188dbe614fb + d98984c7f9bce8ad363623ec96d891a2 + ce402ec66a5d1a4a6e15df0a0dcb7709 + 7ee7c64db1d7ab3415cd19bd643f91c2 + 1f1e43c9b75fe619add8700385303ac7 + + d037ed0758c669be05be288753e99af6 + b8b56fd1a4468488472317035fee28a2 + + + 53d6c56b20940e91bb75557bfbe3833c + + 595c45b478b375ac928ed5f0468e3b3b + b180fe6bd428c8747a6e34db34e0b822 + + + d80591ae5aabe5e02cc1165510f28f16 + 595c45b478b375ac928ed5f0468e3b3b + 0eefb158d7484a6c2386e8edc8f57902 + 574d44b7d837ad122c94efae6b05e53f + 8ef413f277bf144aac43823c13f4b595 + afe05a99619ce4e39949da0c0cf6f59f + e445ced70a8ddcd82b9d04729a4b46a8 + e14f53e8aab21614b0e1297c165582fe + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + + d037ed0758c669be05be288753e99af6 + 03a6dda3825b55b8105f6fb1facb77f7 + + + daddc023b74c3d1366e4fcb3a519e928 + + 595c45b478b375ac928ed5f0468e3b3b + + + df3f271d866ab3835b869d4104d0d25c + afe05a99619ce4e39949da0c0cf6f59f + 77d6b8b3067df8964bab5a68d2ff99d1 + e445ced70a8ddcd82b9d04729a4b46a8 + 595c45b478b375ac928ed5f0468e3b3b + e14f53e8aab21614b0e1297c165582fe + 574d44b7d837ad122c94efae6b05e53f + 8ef413f277bf144aac43823c13f4b595 + d80591ae5aabe5e02cc1165510f28f16 + 0eefb158d7484a6c2386e8edc8f57902 + + d037ed0758c669be05be288753e99af6 + 402c159df539d5e6bba843158a4b2e8e + + + 9320c450efdefa78f4419cfaccac1768 + + 595c45b478b375ac928ed5f0468e3b3b + 76391a13317ae06efdaf2ceb4853e0c8 + + + d80591ae5aabe5e02cc1165510f28f16 + 8ef413f277bf144aac43823c13f4b595 + 0eefb158d7484a6c2386e8edc8f57902 + 595c45b478b375ac928ed5f0468e3b3b + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + e14f53e8aab21614b0e1297c165582fe + afe05a99619ce4e39949da0c0cf6f59f + e445ced70a8ddcd82b9d04729a4b46a8 + 574d44b7d837ad122c94efae6b05e53f + + d037ed0758c669be05be288753e99af6 + e8912654566ce70b1c6b71f29b4d6f3f + + + f38d625a5de49ac63d1d80e79b809ade + + 595c45b478b375ac928ed5f0468e3b3b + 76391a13317ae06efdaf2ceb4853e0c8 + + + 8ef413f277bf144aac43823c13f4b595 + 595c45b478b375ac928ed5f0468e3b3b + 574d44b7d837ad122c94efae6b05e53f + 0eefb158d7484a6c2386e8edc8f57902 + d80591ae5aabe5e02cc1165510f28f16 + e14f53e8aab21614b0e1297c165582fe + afe05a99619ce4e39949da0c0cf6f59f + 77d6b8b3067df8964bab5a68d2ff99d1 + e445ced70a8ddcd82b9d04729a4b46a8 + df3f271d866ab3835b869d4104d0d25c + + d037ed0758c669be05be288753e99af6 + e0dec2535acd7fd51dce4ab5abf789d6 + + + f8ce4f13266a67ec847146be419e015d + + 595c45b478b375ac928ed5f0468e3b3b + c7c2d7d88945f0a9d56cebb6ff0ca36d + + + 595c45b478b375ac928ed5f0468e3b3b + afe05a99619ce4e39949da0c0cf6f59f + e445ced70a8ddcd82b9d04729a4b46a8 + e14f53e8aab21614b0e1297c165582fe + 0eefb158d7484a6c2386e8edc8f57902 + 77d6b8b3067df8964bab5a68d2ff99d1 + d80591ae5aabe5e02cc1165510f28f16 + 8ef413f277bf144aac43823c13f4b595 + df3f271d866ab3835b869d4104d0d25c + 574d44b7d837ad122c94efae6b05e53f + + d037ed0758c669be05be288753e99af6 + b44a67f11016173372cc7e464127ed5c + + + 6d4e0965acd08ae2f98ed509ce402c15 + + 595c45b478b375ac928ed5f0468e3b3b + 8e82f3596c33b7dcc79ecd5962f49625 + + + df3f271d866ab3835b869d4104d0d25c + 595c45b478b375ac928ed5f0468e3b3b + ab2f75e00a47fdcd0d0312ce347aa490 + 458ffc34d8c8671a28f9236db9060644 + cded9c7c3857895d1351ebba28ea549e + 90667be59e14334d8f40a64df8e8b03b + e1a18b0960a19c3a69d16bbd4b27f480 + 4afc9fce6812e1ea9e6f65d117587ff2 + fbbfbeb9c8e5cae2b37861df696ea1c3 + 4fa85e2adcb6d417cde324395a032c00 + + d037ed0758c669be05be288753e99af6 + db3dbd80d60c9b72047d02f31386415a + + + 53b131b8740c2e2143a4bba09128f369 + + 595c45b478b375ac928ed5f0468e3b3b + 162c4a5556f54b9dcc1c841225b17d7f + + + 57fa89ad2f2cfa066c217eefd02f51de + 31f86cebf12981641f1d4384ed5871d3 + 9bb145c3fdf012ce176d06a2198d481e + 595c45b478b375ac928ed5f0468e3b3b + b3e55445fae86ffb0396e3201e988b86 + b3e55445fae86ffb0396e3201e988b86 + 095fa85b37ac09e4d51bd943ac5cbf13 + 22ade877af103e0adc5cd8ab108d3800 + 62fe5f27ae4a30affaca1b774ef04b96 + 0bc031d3c8676c4aab190526d8c9b9ba + + d037ed0758c669be05be288753e99af6 + bf4010c4e83613d1160b9fcc5e553794 + + + 61a8e825b391b3fb39eed5ac22a595c4 + + 595c45b478b375ac928ed5f0468e3b3b + c7c2d7d88945f0a9d56cebb6ff0ca36d + + + d80591ae5aabe5e02cc1165510f28f16 + 8ef413f277bf144aac43823c13f4b595 + e14f53e8aab21614b0e1297c165582fe + 595c45b478b375ac928ed5f0468e3b3b + 0eefb158d7484a6c2386e8edc8f57902 + 574d44b7d837ad122c94efae6b05e53f + afe05a99619ce4e39949da0c0cf6f59f + df3f271d866ab3835b869d4104d0d25c + e445ced70a8ddcd82b9d04729a4b46a8 + 77d6b8b3067df8964bab5a68d2ff99d1 + + d037ed0758c669be05be288753e99af6 + 5b0e7fe5db5124360f7fa0f1983c251d + + + 54da3f3946716c88f095a3cd79fb862d + + 595c45b478b375ac928ed5f0468e3b3b + f7b7a2b0afb6c63c7cdcda74624e4391 + + + d80591ae5aabe5e02cc1165510f28f16 + 54da3f3946716c88f095a3cd79fb862d + 574d44b7d837ad122c94efae6b05e53f + 595c45b478b375ac928ed5f0468e3b3b + 0eefb158d7484a6c2386e8edc8f57902 + 8ef413f277bf144aac43823c13f4b595 + afe05a99619ce4e39949da0c0cf6f59f + e445ced70a8ddcd82b9d04729a4b46a8 + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + e14f53e8aab21614b0e1297c165582fe + + d037ed0758c669be05be288753e99af6 + 719475538ff167e6a37617d4aede3dce + + + 61dc8b724e2ba76d28887553cd5d3432 + + 595c45b478b375ac928ed5f0468e3b3b + f33fbbe96fbb8efaff83bada5800b6fc + + + bb50a803cde916fb9b1e862870a94cac + cdb45fea5a4da99c9dfa26ddfb5c7c80 + 3869e916b00cea9041d4619e304833d2 + 595c45b478b375ac928ed5f0468e3b3b + 686c283511e1e2e18831e7674f3b0dce + 1068a7a3347d3e0ae4aeacebe910331d + 8861109d9de93631df0845ae22c84c13 + 8aa41aafe7428181a3917fee0f0de293 + 686c283511e1e2e18831e7674f3b0dce + fb023287afaeb57e2213aaca4ec340df + + d037ed0758c669be05be288753e99af6 + 02bb871371be6e735b47db9f77b4ad5a + + + ebb138704aeb0d11173584a57d4e4a6a + + 595c45b478b375ac928ed5f0468e3b3b + cbda5da4c4471bbc270835d3fd8a4cf5 + + + 595c45b478b375ac928ed5f0468e3b3b + 22238db082230d1d72383518bd07028a + 2b858b6d04bea08bbce305579951e87d + d021247b8c16b73753a4eaf6ebdc320f + 40e24d1f84d3eaa75493fcd78f2a5f88 + 6510476dd1677e1fb069500101ac6bc7 + 80e918a5e71ddae8fddbfd3c68d4590b + 819bbcaf25607bfa9e890d792f20582e + b49b07697aecd8dc65d9a6c5f8c5596d + a6e4f44cdcbaa51f3bb90112cb311eb5 + + d037ed0758c669be05be288753e99af6 + 99ded3c12530a67e6e3b23fcbb4c473f + + + a9694923147489b8b30909ec9113a1c9 + + 595c45b478b375ac928ed5f0468e3b3b + 1edf7f8a3010b94a7228de5f1dec4f1f + + + af601fc0c30b9707a62c1b4eaf0186f1 + 2a43051b7e52f3e895300ca1320f5c8e + 595c45b478b375ac928ed5f0468e3b3b + 3f0ca1eed25f141d1aca9f0cb8f81820 + bf3186c6dd75cccd044c27277ac4dfed + bf379a19897b6e065dec5a90b27188dd + 69fa13ace7e5155fd428a6b9a2021edf + ad1b0ddb58dde0f1ef6925583ca24831 + 9ba9af7f226bd58837f338e191f0ff41 + 74d6420430e38f862c973613520861d1 + + d037ed0758c669be05be288753e99af6 + ef919ce21c4f2c56a7c460ed23380e42 + + + 1429e29761852e76b263dbb43b313933 + + 595c45b478b375ac928ed5f0468e3b3b + 30a721d30185cc4f3382ca2288e557cd + + + cc45a05c18858bcda749eae4a25444cf + 1429e29761852e76b263dbb43b313933 + 4c27a6c3960346297ee26210c1628dec + 1d398ae802740ca2d65efaaa95233c5c + 595c45b478b375ac928ed5f0468e3b3b + 590759c6f486b60d707742e7c7615db9 + 4c27a6c3960346297ee26210c1628dec + b3edfd3f6b8c03084f57f07cd4c83d3b + 9c2e5a371abd78eb24c968b11fce284e + 5ac39c9324f4cb34bd9cc77401269558 + 9c2e5a371abd78eb24c968b11fce284e + + d037ed0758c669be05be288753e99af6 + ba015126e52ff6bbee240aa48cfc2828 + + + 6462d6d42a770d72b9f06f5ef1c072bd + + 595c45b478b375ac928ed5f0468e3b3b + 76391a13317ae06efdaf2ceb4853e0c8 + + + 595c45b478b375ac928ed5f0468e3b3b + 574d44b7d837ad122c94efae6b05e53f + 8ef413f277bf144aac43823c13f4b595 + e445ced70a8ddcd82b9d04729a4b46a8 + 0eefb158d7484a6c2386e8edc8f57902 + afe05a99619ce4e39949da0c0cf6f59f + d80591ae5aabe5e02cc1165510f28f16 + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + e14f53e8aab21614b0e1297c165582fe + + d037ed0758c669be05be288753e99af6 + dcf7e8eead4d5d92675ddbc45fd1bf27 + + + 5fb5049900fa7ea1499633805bb50950 + + 595c45b478b375ac928ed5f0468e3b3b + a97cf8151cec395e1c6ecfb63159560a + + + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + d80591ae5aabe5e02cc1165510f28f16 + 0eefb158d7484a6c2386e8edc8f57902 + 595c45b478b375ac928ed5f0468e3b3b + e14f53e8aab21614b0e1297c165582fe + 574d44b7d837ad122c94efae6b05e53f + 8ef413f277bf144aac43823c13f4b595 + e445ced70a8ddcd82b9d04729a4b46a8 + afe05a99619ce4e39949da0c0cf6f59f + + d037ed0758c669be05be288753e99af6 + 727c24cbce0911e6de71bdcd32f83931 + + + 489cb6e9e1eead24e64c07cd0778497e + + 595c45b478b375ac928ed5f0468e3b3b + + + e14f53e8aab21614b0e1297c165582fe + df3f271d866ab3835b869d4104d0d25c + 595c45b478b375ac928ed5f0468e3b3b + 77d6b8b3067df8964bab5a68d2ff99d1 + 0eefb158d7484a6c2386e8edc8f57902 + 8ef413f277bf144aac43823c13f4b595 + d80591ae5aabe5e02cc1165510f28f16 + 574d44b7d837ad122c94efae6b05e53f + afe05a99619ce4e39949da0c0cf6f59f + e445ced70a8ddcd82b9d04729a4b46a8 + + d037ed0758c669be05be288753e99af6 + a17a0f33fad325726edd50d4886fe65b + + + a108515c3466269dda5c8e863945a809 + + 595c45b478b375ac928ed5f0468e3b3b + c7c2d7d88945f0a9d56cebb6ff0ca36d + + + 595c45b478b375ac928ed5f0468e3b3b + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + 8ef413f277bf144aac43823c13f4b595 + d80591ae5aabe5e02cc1165510f28f16 + e445ced70a8ddcd82b9d04729a4b46a8 + 574d44b7d837ad122c94efae6b05e53f + afe05a99619ce4e39949da0c0cf6f59f + 0eefb158d7484a6c2386e8edc8f57902 + e14f53e8aab21614b0e1297c165582fe + + d037ed0758c669be05be288753e99af6 + c6b0f02e5b2ee05ca0ef8b207622b8df + + + 32ce30f1f14fbfbd1afbb9f70eef1ff4 + + 595c45b478b375ac928ed5f0468e3b3b + bbbb33e0ab4e9d6c64e4dfe3eca06de5 + + + e445ced70a8ddcd82b9d04729a4b46a8 + afe05a99619ce4e39949da0c0cf6f59f + 8ef413f277bf144aac43823c13f4b595 + 595c45b478b375ac928ed5f0468e3b3b + 0eefb158d7484a6c2386e8edc8f57902 + d80591ae5aabe5e02cc1165510f28f16 + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + 574d44b7d837ad122c94efae6b05e53f + e14f53e8aab21614b0e1297c165582fe + + d037ed0758c669be05be288753e99af6 + 567e1a3b79447873fd3b54f1255e7a50 + + + f73a4a2988ef8dc9b330c1a6f09e5e94 + + 595c45b478b375ac928ed5f0468e3b3b + 5baef3bc4d122506c60412ac6f0e1ed9 + + + e14f53e8aab21614b0e1297c165582fe + 595c45b478b375ac928ed5f0468e3b3b + 0eefb158d7484a6c2386e8edc8f57902 + d80591ae5aabe5e02cc1165510f28f16 + afe05a99619ce4e39949da0c0cf6f59f + 574d44b7d837ad122c94efae6b05e53f + e445ced70a8ddcd82b9d04729a4b46a8 + 8ef413f277bf144aac43823c13f4b595 + df3f271d866ab3835b869d4104d0d25c + 77d6b8b3067df8964bab5a68d2ff99d1 + + d037ed0758c669be05be288753e99af6 + ba3be37bd8913121dbcb6a0576ebc4c5 + + + 77aef27201661219795b16b8cfa614fc + + 595c45b478b375ac928ed5f0468e3b3b + c7c2d7d88945f0a9d56cebb6ff0ca36d + + + e445ced70a8ddcd82b9d04729a4b46a8 + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + 595c45b478b375ac928ed5f0468e3b3b + afe05a99619ce4e39949da0c0cf6f59f + 8ef413f277bf144aac43823c13f4b595 + e14f53e8aab21614b0e1297c165582fe + 0eefb158d7484a6c2386e8edc8f57902 + d80591ae5aabe5e02cc1165510f28f16 + 574d44b7d837ad122c94efae6b05e53f + + d037ed0758c669be05be288753e99af6 + 293c9d0be2759f9af15b756e0ea90d85 + + c3642b0932cc790dde34423b1640e246 + + 5c5d784b6dbf3a0e63e3bb71159a4532 + + 595c45b478b375ac928ed5f0468e3b3b + 76391a13317ae06efdaf2ceb4853e0c8 + + + 574d44b7d837ad122c94efae6b05e53f + 595c45b478b375ac928ed5f0468e3b3b + 8ef413f277bf144aac43823c13f4b595 + 77d6b8b3067df8964bab5a68d2ff99d1 + df3f271d866ab3835b869d4104d0d25c + afe05a99619ce4e39949da0c0cf6f59f + e445ced70a8ddcd82b9d04729a4b46a8 + d80591ae5aabe5e02cc1165510f28f16 + 0eefb158d7484a6c2386e8edc8f57902 + e14f53e8aab21614b0e1297c165582fe + + d037ed0758c669be05be288753e99af6 + a6d02a4463900bf63f8a3bbfb9eab059 + + + 61d3272c1308b42694d50a26facde84c + + e445ced70a8ddcd82b9d04729a4b46a8 + 8ef413f277bf144aac43823c13f4b595 + 595c45b478b375ac928ed5f0468e3b3b + afe05a99619ce4e39949da0c0cf6f59f + 0eefb158d7484a6c2386e8edc8f57902 + d80591ae5aabe5e02cc1165510f28f16 + e14f53e8aab21614b0e1297c165582fe + 574d44b7d837ad122c94efae6b05e53f + df3f271d866ab3835b869d4104d0d25c + 77d6b8b3067df8964bab5a68d2ff99d1 + + d037ed0758c669be05be288753e99af6 + 9dad52410db1b7a50bf32bdac63f5fa7 + + + affe625163426aaeac1d87b64641e0a0 + + 595c45b478b375ac928ed5f0468e3b3b + 4badace7ec14502bc0a4533b33dcc3fd + + + 8ef413f277bf144aac43823c13f4b595 + e14f53e8aab21614b0e1297c165582fe + 595c45b478b375ac928ed5f0468e3b3b + e445ced70a8ddcd82b9d04729a4b46a8 + afe05a99619ce4e39949da0c0cf6f59f + d80591ae5aabe5e02cc1165510f28f16 + 0eefb158d7484a6c2386e8edc8f57902 + df3f271d866ab3835b869d4104d0d25c + 574d44b7d837ad122c94efae6b05e53f + 77d6b8b3067df8964bab5a68d2ff99d1 + + d037ed0758c669be05be288753e99af6 + 1f71ec7f755dbaa57e525399f509ed51 + + + + 5119565d69cd68fae2e2a709363f8754 + 356bfca3cd7d57cc2aeea7b9a61ae10c + 927ed13877d80cd12fc5bdd9a9f4bcca + + + c3642b0932cc790dde34423b1640e246 + + bdee71d54664848d80f57013bbf6919e + 5a27b55b5523779de8a8b8a93ad7e301 + 7eedf33a05805f0267e1822c980c335e + b7a51a858500efc55a266d180689d87d + da135d1ca883c430ab2e99845670db9a + 372d71bc19b25630def0ac01a5dee781 + f618e8397858d15ba11dc0efb19527e9 + a9ea95c178008dd85406756688d98a53 + c8150eb4c5eab50339e93422a83007de + 5119565d69cd68fae2e2a709363f8754 + 4cfa17f1401ac35991632495e94d4246 + 1d76a3219c6142037917d5fdef77b6ac + e2b91ab7a8fdd90e99be6d8584b5cb55 + 95a0ac03d403381d4ea57c4fac7ed52e + 05befe0678650e6c46fddeff3d469ba1 + 2c8c6b8ed662a6d34b65f01f22bb31eb + 4e7b14245f71165d9234a2144a1bc258 + 3b145aecace195d5386a5d3034f4f544 + 02924873102657d1fd894945cb7a5200 + 88969405c08b3ac06d4966ad3c2283aa + 05befe0678650e6c46fddeff3d469ba1 + cceff9607d1e52901dae8c6bf3eb7423 + 595f94ddd9089b64d5909a696e3bb71d + e4bd445226556df09a97d7eb4f130bf7 + 9e6da02e700e6ed24150ddddd459a993 + 7b93ac7f3d818fa9d281713a8ac539ba + 6af6f3ee15ec51cf1b1feade7963835c + 970a4ab885dfe24734450a234a9d1180 + 7f61dc4e1561591dfcb655adfceffff7 + fe8dedf91daa445c50dd8719891a16bb + d006134f1251f04f793bc7db077a6138 + 839028d8f75fe8ff85e237ca97dba6f7 + fc8605764f34be3fd5bccdf088e58279 + 629bbf4c3598ac99af333aa14cd0538d + 6bba0e9a834d9cefaf82f2bd1b992830 + fccc9504170f8b69a628adc0b7dee092 + f1af43bd7090d639d965f9272d49d525 + e03338f4ac791d1c8d217c4cb34607a5 + 784e0e8efd27d3a3c71e0586d7b3441f + 949d89098f35a4b65cc53a75b16e7d67 + 0aa06923fa1cd8ce50f7305d54fb4785 + 383beece851188893203c3cb88a28966 + b663f133f04637483c7206f633f8ba98 + 8b94a4d67754e20a34db6c21f6758e0d + b09c21a0b6b8c94a4aa6f4608923ebe0 + 06a390719cd5d82358889b0de533a2e0 + 54a7524f03c4ded5d27a3e606d946de4 + cb6d46089111f2f3d296d13e4ccfba13 + 3f6136a5b950d53fc70d976b11f69722 + 66cdf85828ee687bf5e022a3d594d76f + 03411e63f03100cab3c29f73350474f5 + 855baaec79d84d2af975b708d0c5a087 + a6492ee72fa3fa8babf8a6b76124756c + e2fdb78ae7ae8c33697554a7ad70a12f + 0dfc288ba05dacd453009e69b125a11f + 8ff5147da11d09a4b05034b0454f7b4f + ee8958039efb809bedb6cbb2ad0cae8e + fb12a8c0fee5e5e8bdbb951e146fd23b + d339f7b34a3f1f4bfeb63fa7122fc228 + b37658dc8de5d0f146c778d9c9363363 + 702ca418a5b2536dade6e484b83ded67 + 308f9449943013517d032843e7c32440 + cfda4bdb662a6916063d7711ded1687d + b517ca2e3a27c283f7d9c6211c33c6be + e8e3ce4a5ab779ea4832b0be5209e8aa + 3304d894efeaf60290a2f717456c2082 + 75bb66ac922b064fc03abf3cbc5c0d85 + d21ca8fca2a129558df6bef33f56e9f0 + 783ce5a2da97800e19815656843e167b + d1a113cfa7f78cc7cfa8b3173da9646f + + + b18e93fab216ded92feba24d5c5722a8 + d037ed0758c669be05be288753e99af6 + 27f5c9916cd9d58fea0382d4aa6dbebe + 2109b01ef5cedeefc0ee2f1ab63b227f + 9d974c193917427dc609440a10fce1a7 + cf1a9ca8d677c6009ccb152f8a74f4b6 + 529293e01e285acefcb866c16d5913d5 + + + d037ed0758c669be05be288753e99af6 + d4e0e2b42dd7b3d8c1efc621183a7360 + d4a69efd9990b28dc11cd1386c5c56d4 + a6035b99613052f3e7e0889ef028b62a + c6f2fc44c452d4f0e5848d667d2ea8aa + 3085dac2d265ff7c6918ae1faed46fab + 484e0c0f2848a4d9549dfa9cb380c79c + c28dd101a0e6df1fa4fb997b49e8d3dd + 85490c6db70d14d5481f6148aff09cab + fe899ef5c3c3dbd166de0e6ca46de7f3 + + 24242c9ce55c7c5198078ba64ea7c4ee + a4b9861d824eb4070e7295c41d03237e + + + 5119565d69cd68fae2e2a709363f8754 + + d037ed0758c669be05be288753e99af6 + eb11d55afb5b1abf5caf4a0e7879cb24 + + + 9cc0ac4b6d86f833dc14d18c280a771f + 7fdeafc2786fdc0e05aa30546e69a90c + 1a485f7c0e8db505334424d1a8c49f12 + a0a79e91733ae58024ab34c0eeb3f485 + e12907afb902d8a29d6e20e6d2e1883c + 049bf0ad46e0acaf9469101b1cd66c0b + 9067fb8f63de20fb57220ddb19b943b0 + 50e9b514229a2a1daf5c9e3a3fa2f918 + fd9695729247757cc763d03553287ead + 5a2202876c52ca8927fe7ed7c4e94b5d + 7359d835cd52725a82ced280a75263ad + 3585bc0f96694466bb0c4aa5159e6f4d + eba115dc2ea17caf2f40bd91a45b5e54 + 066f087f90a530964a8615b4a18c57a4 + 546cc9ab97672b299c7b953a6ea05878 + 838a79f1f009cb5adfba215e94c38685 + f6cec32e2bff81b4888fb3488c6febee + 4ad2535cef9afe8105aa423d1755b5b6 + f1feb1acb3b557b98213d5f8649de7cb + 0393dbc41e8208cd07c4e9c8e599a7ab + 825e7d5db92d505ab0c3ca2fdfb124f7 + 5c77cdaff0e3dfc8ebd2412ca471b2a0 + d5b140e0c32e935d5b48c71401b3e3cb + 537cc0411baf4285aa86c250219aa8ae + 0e5196e5eef66dd27cd0bb0cad003dad + 474ca8e2a52726afc5dda8706c5b2ff5 + 52cf2cbd0fbdaa973c78f0a8b2308258 + 7c07259ec803058f40c57503785b3557 + 5119565d69cd68fae2e2a709363f8754 + 1c2de6c40e90b4e46949c0920131f882 + 1fb4211d4bb6622e6b0932ad8a2bb8a3 + cc132f70fb456b42368fdf78b5ff42e4 + ce22a354cb26c7ffb498264730042824 + 4ffcabea055a317ac5ab4ac783094044 + efcd4dbc700edc981b9547c5d16387b0 + 1a0facc034271a49abe45af56545facb + fd88777ee2f82f38d1d03f2b5640c882 + 64422b63fd16c8ddc763343cb8977b85 + e4c6a04ea2d8923a8ef5c84322480a12 + 92a2a28dfd6607a89bf6876107841d67 + d5ca37202e74e0f2e3b60bbac18f80f7 + d18e588e00762e89d3ceb58c09074995 + 7a08e1c8e6a393728b1a3d2c89e5e4e2 + bcd849159e494ebaf0ad71a5d586353b + 3482753ebccd0d6c99ed0573220a6759 + 5498c5677eed7f1830de95caa29883a6 + e382d466581d487cc9da141e145257cc + 66f093dab2f64a08f71f40c30cb83663 + 26888830d1ebd05dd613d13608925d74 + 78d236fbc51a034703bcbe75982c7489 + fcaf727b07a889b5704e1bccb0bd3ca7 + 6be7a076511859b08198bc960158b460 + 68a39ca29e8e609ad6906df050fde1cf + 10026b97416adb294eb5e66b122f95ae + 814f16cb65489e1ce58595bc25f6a4ec + 33e39501966741a26f3608ebbe7f6e24 + 30ed71c141da9b43540deecc12977839 + 63c6b9c4dd46b9bf6bfdc7fb54c2c19e + 86b594118b452c5e139b755d1323fee7 + 3eaa5a367c12341da67d757f873c5d8c + 896e4d170dd35b91967a90fc29d62cf3 + 7096bfdedd2463b5300ee91fff0da1ec + 0f3c00502ff4893910a33b91d6ad06f1 + db1855f8daf7a21577d679b2e901c618 + d0af2d7f350fa25e40aaf306da32efb3 + 0ea9a4ba47668d0f555699ad44c06c47 + 47620cd499286ec18d002e679845f714 + 4000151841d7836c4b05addee9b55c8c + 2cd0373e0c1f02ed7ed75d4a7136ab13 + 8232bcdbd56c500f3daf5e89dba5fb31 + 4e51870c69837d0979bbb37fc0649311 + e992ca03891ccb849e0a6acfb63c03ed + 777575253ed3ed4cc82f027cae1e0e09 + 3b8dfed9d222380229cb28301181f7a3 + 48d3b9a445bd6a343f0bb82c08fef06a + 34caea02a06096869e00d7fb3dbbfcbe + a9263b91c7b5aa70732788ca627ab7c6 + 4891b568ff9db6f3f25d727cbc9cca61 + 59d4196f21e681f4294ab31bb545551e + 2139772f630ca0a0208f4e7e50187525 + 635f35c42488226e1461ed07a935dd91 + 4a01834e2456c2c9e5040a993ed102f2 + d9b67d90182983c4e7c0f5fa39e43d58 + 755e702ba03dfbb1ef11c5f9e97d134e + 1cbc03e4e45ecda7a34e00e3afb20807 + 02c69a2f9672169c80bd47fbe918310e + 0fa56e158f608e925ca67aee32549b78 + 991a4ee35a6933875b1f7e71c49f080d + c798a1749a6b1e7faf46431d45fb5333 + 108b35f94cc300401d1bb7b3881c2d02 + 3fdd9c9fd579783e73c92565f8627766 + 037dfac26a113fa79f8f8d9895e8466a + aad1bfa290b8cc8e4474b8be36f9cb46 + 0867622886b3b7c822048671269aea84 + eb8ade98da2187f10ec6ee02c238bf85 + d6833e579318ba07c0bbf502376a9e64 + 138619531ce3ae5385ac61f16ce56423 + bbd0b39601014444e44014ea6edffcdd + 089c68b6e8383b743ed12be6eb447125 + 1e672c900c173410ea58d94fab081d4d + c7fd9609e2f2e22029dfd1db467b92d5 + 17c71c66429330d691bcc4948bf91592 + eb6cf15d63608996e998e31772ab2154 + 52177bb0816e565ba1467f60af8f5965 + c9d83781f396d071c48e488fb8cc62cf + 036acd8fbf1a5b3e1aa36336ea533101 + 3baaeb740665638cb79d34503bd6ef8a + 0a922daa9abdd60bcee97e67ba65559e + 8ee62c24a4c164f15873b22af84ad414 + 6fc25057595be45d4eafb8c61d80905c + bf75afecc1cd027fdd24ef5a7e9c8569 + 01006bf76fbf2264e6a0a07c609931a1 + 2fd5e9f3d9f1211a84e721a07fa60207 + 8bc8190be5c985760f335f22be52d82b + 1532b84b251ffca718484bd63121f20e + aee5daf8d45050cb8c47ffd51a3af59d + 3a6d21fd16cdf088b95ad0b123796be9 + 0734711f03ba6b06a9056375dc7f7d36 + e68e77aeafcbcb146bdd42bef5722ca9 + 430eebb2656c62a183a21bc73b06e5b9 + 838859eae8b1004956115d55caf2dde3 + 48190c297bcdf37ee78c55cdd8fcff3b + 3ed3c66916aae2ffdbeeed1ed573afe4 + 57de33ad413ed7a21caf020a6cfbff80 + 0b2ddc1758b330e6755a53d351c0ed19 + 8634e6e88445c269bb3d8d3bee87dfef + 9ffbd0be32c0b37586a054571c4ba284 + 4e5f6dc19b49d98ace1e2a03cf51631a + 3f7bb53a4cc87b225065e9d4987774ec + 2067ed57754cf15bec02f5e6348ede64 + a383ae62da5347d518d0974bf28d71f5 + 7b03ad01c4506cb56ee7ca00a7b012fe + 801a8e2fc20d3216c68a87da59a7a4c0 + 7efb50b1e503b1e7d361150153a55aec + d6dfb3f72c6dbe7abe22519972f70eaf + 7437bb4c373f3a4318198be6f4ecbdc6 + eb6da55806196e341c02ea34a1501254 + 61fa31d7f35a21d8f7f1c64f1ca24730 + cd34fab884c0d8514fe14c3e94e8d45d + d35a81e5aa3134aaac6a187f56abd19d + cd2d4117d758cf6c2212463ba252c8d9 + e67ab255656e2efbe46345e8711a3bc2 + 1e95cc348658a12ab01a83de0a3557ba + 5c90eeee1d9e26b96d701b4392721966 + 471251afd2423ed40f3dce9250109f91 + e35cc40fb9f4f2479db0cb8565416c08 + e9eb4539395880fcc638809652d1e6cd + 9f1495d1a2df35078fad507912c6d7ff + a16cd4a6471b774ae30d25269cddefab + 844238dccc73995caef58feee71c64e9 + 9dfebaf4d6e57e23c8529364ca926cd6 + 95ee4accc1726387f2133cb0bd59c960 + 46703359b844f21424eca16d10d0c849 + 66bcde57824332859991fb547db9de35 + 17dec38303abf8d3e7af3df0deabfe37 + 2cf08ad45a2643d934cd80d941aaa90e + 59649b97502b75c86671bf643d071009 + 7688bf9fa8a4d563cd2e9d9f06a83034 + 4d39dd628d00e7e4c97539fcb6b7c910 + 1f668f488c8839cf14c1fe0bdf9bf0b2 + 9c1dc2cbebb817dc4466b49922214139 + + + ff3b40081ddd0bd31150163e333ae39b + b301d1b3806857380687b7b954752300 + 4ff573d4620d9f0a2d9d37816591c55c + 78422e4b60b1cfd8ae704b4e86d7a9bc + 466eb5e9b3f85014b5bbb169cb65ddb3 + 8d5c18f43ae1dbb8e9d6f9284492d550 + c8e2955426891ca5e8aead3d7ac7209d + 76e401f4bd7ae342eaee1d6935d6f7d2 + efc8aa2e781c724ad3984a31343c73e2 + 428ae2adb709850a3b9d8480821aa4c0 + cc8de7765282577845038dccc110ed9b + 935635b769caec1f9745f396af0fd437 + d7f88940b6ea33a52e03c428185993d1 + 1dc908b1aacf07630020ffb573a7d81f + 86a6a3aec6335f91e80fd7c69cfcadfd + fe408ac915081ffdd394af7def915d98 + 3e9763f49e4f579c2ec2bfdc6f22ce9b + e94a8303a49b0da199e552181334294b + 21ccacf320baca597bf4fc7d332e2a03 + a6684eeddaf1abd771e4d049f375668e + d93a049bc12973f37ba9dbb7460b987f + c2587fa50a79726bf6b7271a444d5ea5 + 733b162a9c7ad6c7f0a7c4211350cca3 + 16db39c9c3e039f0ce8c5d97362a29f3 + 97dd3057fcf96a09210eda804e9ffd25 + c73d508b6e32d6a746bb94a4696b1a31 + 37805081432678cff65efdd300444405 + da3fb268504d481422e4d74cc75f06e0 + 5bce8e2c72e2ac97987f51cd32612f76 + 53a20b30ab7c964b94bf9145cf19c405 + 1ea51942d278dbaa3a708bbf3a86ca6c + d14c118341afd81d2f7fe3bc2a7acdfe + 80b28207973715cec51a0f7d2df30dee + 1b0c7d75d71dc1cafc352f290f52a4ec + b8bff9932a0184fae11fe2d3096863f1 + b0fc642f73163b0cd1ad6e0de7f6a06a + 5119565d69cd68fae2e2a709363f8754 + 73ba622bad5df5808bdafb99039f7280 + e51e177b6818205294a759e2b5d7f2b9 + 13c3e268abd2be1ddee6385864c150e5 + f94038cf8f0c03eace89c3cbf0c49d43 + d6136820dc855627b47c66ad5053f187 + 80610a31d04618446ef166eb96fa5558 + b6ddbb525468fe21044f4b7d4dfb6791 + 5a6ae60d66e255fe5398b4a77f323d26 + ffac155b18cfb27360cc818f28e9f0ca + 64aa2ed7eb3eba0324c3322b57f48011 + 98b2dc517dd4d396e1fd8a5d81422d07 + bad57a9f569d2178066619bc88a6ce2e + 708fd2fc4e70224b958b5842e044ddab + 3cb11a21104d456291c9e4a0c817a0fc + d14c118341afd81d2f7fe3bc2a7acdfe + 0b2d96ee2dd35134b421abedc45f5a0b + f6516fcb70c9b301656c25c60842b45b + fb7d8c18133c40ccc3686dbf18773de1 + 22dc0f21ca5fbd3d6aeb4faa949edd03 + 28a7a3da96e9142f71ee530ede0f9907 + 62a1fdd7015f277b8e2f90ae9e66a37b + 17029cd6ad89b08a9c060fa454b4d6c6 + 9a083ddccd3da8462d2f4f7090e72c28 + f3bf41eca06596010104e0fe35f357b2 + bba087b85b31874f31a219bd3d2169db + 1851df5d4a109effb9b51aceccfafdb7 + 03f316279bc93799b6743b36cd047c4f + d7f88940b6ea33a52e03c428185993d1 + f3128dbdedd3d808c950bab0d2925f69 + 6694ed963007a9ca35eabf79fd385381 + 1104480a447dd3d1856e377a4eceb2c0 + d57fdbf4fafd80d2075e6576a7266879 + 157fda835c72ce693a39986d54e79cf8 + db7fbc63d6f6dd393762b800c782e098 + be95aa80f3a31ad407253dbda30f6a32 + 74ca81754617d042a8a1470723503fd3 + 6d450d87d849381dd36e890f82835c5e + 7e762ab447a76e85b3defe0886351396 + d7f88940b6ea33a52e03c428185993d1 + a874aa17334e9b4e020e2c76c8e44c88 + eed658778ce3703fa7fbbf15272805a7 + 3580590bc9f2c99d2aa17ceb521855cb + 6bc26ecbc32cf23e957a3164da640d26 + 523145a91857d5094c45b2d581cfb757 + 0a3bbb4ebdb9b7e2427e528db2e7b5dc + d14c118341afd81d2f7fe3bc2a7acdfe + 2b98b8530fcde6d591b4e49dfafe8cfa + 1bcb367208e3d1162c82b761135db562 + 46ab7dce3b57b4dc5fe92793d696884b + 0386d8dbceb404c75492a9506881a06b + f2482bcec32a5184fea4408e6a2e14c3 + 1760425e4e615ec4b661de10f6946157 + d14c118341afd81d2f7fe3bc2a7acdfe + 476caeb5dc39e58daee62ed977045c87 + 65e3d9a85819f3bec7893551b7113cf5 + d14c118341afd81d2f7fe3bc2a7acdfe + 6fed6183a63177e5379c649807adc46c + 9bc2fdf98282a2504ffb94064ca81b6e + fa701b5fc657164fe9e1b688dae92c68 + 17a292f392d049509c2154449f8f8a16 + 75911453e09f2ae0e098c51d2eb82e9e + 562cf81a0ef46432fa665d31038cbf8c + 8d401e1823ccc85688fb07ca4f576363 + e0dbda392b11f8b6f6e9a484d6d867d6 + d14c118341afd81d2f7fe3bc2a7acdfe + 90cc40393bd316339d5d3cc83a56b137 + f1a4d427b9256b5be056773f388aa8cb + 77613ce9ca5803ecdc36d0373c03a7f5 + 9f2985b132085d43c07e111da57e7b7a + 3c18028fc226c6cfb853826ae9a4e0d2 + d24d81c0acf30f1e61f46f447caa66b1 + d14c118341afd81d2f7fe3bc2a7acdfe + 8836043c720bd597c7b77e8d5e0d5d6d + fe408ac915081ffdd394af7def915d98 + 2e714558a1b2517076854ab22ea31122 + 5225e16b5c6da563435181c19543993f + 236e9ad8f53cf60e0a8d12cc6c132d4c + c3a788b12560c76911acc030acfde7ba + 82ee15fbeb26ab14b9b1d924d9772eb8 + c324d33bf5068631e88c9d2166eb96a3 + 8d75d063e33fe4d52f57d60d3216e846 + 5306220ca3b07e2b5bb28c3c1b86048c + 434926161066235fcff328d2a173bda0 + fe408ac915081ffdd394af7def915d98 + ed2919dc2837cd50580a806c9cbd4a35 + bbed937861fcdd5155cb53bc96163930 + e564a2784a145f7bf431e1307dca4ddb + 9c2d28afa640319ee8005122bf9ee8d2 + 6169b645dc3208407289b715a9fda5b6 + 1734a586a01ea3fbeb00d87ad05e55f6 + fa701b5fc657164fe9e1b688dae92c68 + de5f9c92042bd27bf24903b922d079b6 + 9e3db1e000696d34672c12ffb7d15cd2 + 859d07b22c618dec7c95579c5d201983 + db0c52752c5ff375b72c34be1342c907 + bdae773b9545d219ec12e41074482638 + 78763a440a90f6d8e40fedfbd07df027 + d14c118341afd81d2f7fe3bc2a7acdfe + d14c118341afd81d2f7fe3bc2a7acdfe + 4e852ccb26ca45b131b10e56d66696f7 + 1b5a28651ae97be0febc6322f88bb19f + b8d1da7a6c69c324e2aba44ab22bae35 + 50fd7ea1d0e31594959b9bad7140d8bd + 2c7edf393542441469a1e222433e26db + fcc851c8ad187352530fe50151447d05 + 169ec206cc35f14b3ff3e08f363cb1b5 + 9fede09b3428df06c868a9c967c4c22a + 16a206b3894e346ee3b5f8169fd0cdf3 + ae0835da55bf54883658ab63d400d0bc + d7a74f64f5738122d828646bb5f2ca11 + 6e064fe692af48c561b4f5b3ad089e37 + c6e0dff26d349a9fc3e143ebfc2722d5 + fe408ac915081ffdd394af7def915d98 + d14c118341afd81d2f7fe3bc2a7acdfe + b1661ea5ee54504a9add6320f2a06a7a + 335ba096e564838ba7a5c9e0734e3c71 + f3000005a37f596d185be51f9445b198 + c35b4a667d256390723a539036e9cdec + 140e0e4781521f6c274afb3b7ec430aa + e88feb4e2f326e8ed2798cd4aaa5a4da + e05f583d8a745cf796fbfcd73048dc26 + 150063575eb3a4384fecf37a653dd752 + 5cb9c0549507a1c5753dcda12b1079a9 + 6bf640d9362c6b16fb2a914c76de429c + beee92bdcbca88f39f8b144f51eb3642 + + 90724b26c3ceffb9c3e2acaa5976bef4 + + 63b0304c08a4b12aa12d99bfe1f1cec7 + 5c551623f4fd6bc235b50f67f0a84e98 + 6d6db9511625782657df7df507ac185a + f40d23c87f4f1d43a0a50b6c4c4a9b69 + 1ec0acb0c885c3772991ad9aa184a122 + + + + + + 3baa56709def1d5445c1f70711ba6f0e + f5ad6fee2595e1f9b4ef32884f834403 + d9fefd9b952137f5c071abaeff31c3fa + + + 3baa56709def1d5445c1f70711ba6f0e + + 91c17d661f58f589d025dc412e2ea8f1 + 3baa56709def1d5445c1f70711ba6f0e + 3b2e1d52569a78328df926c25e72e710 + 515c43e83f3c3a0c5ddddffaf6311726 + d224e1576d982b3060e4bf98d26740cf + + 587de0ff2c4d2b48d457e0679ad41b71 + 1b8b34ae37e7090c3569d1faf9cfd863 + + + 3baa56709def1d5445c1f70711ba6f0e + 9c96d1764b7c0515cbabd115b44bf824 + dd1f6811f99a58802f526a77e5c305f5 + + + 3baa56709def1d5445c1f70711ba6f0e + + c345b508daa2cb436425c85cb990b972 + c1886eba2cfe3c6d1956c2640d7294c1 + + 4cddbc28514be3683e4a9a3fda3d5eb6 + dce89db6989a4035940dbeb99d326de1 + + + 3baa56709def1d5445c1f70711ba6f0e + fe8dedf91daa445c50dd8719891a16bb + 2248d6a79b8496daf994354ecbd1054c + 4693df4708228f66208a6d742a23eaa4 + + + 3baa56709def1d5445c1f70711ba6f0e + 273b3592fff8ccd5c2c0122ebe499253 + fb0be7a1ee87aa3ede2566b0ae36a851 + + + 3baa56709def1d5445c1f70711ba6f0e + ec1354838da747072f09bcc1caf59cd6 + 152cfcc0d09b88dd52bdc30274153c10 + + + 3baa56709def1d5445c1f70711ba6f0e + d74052a80ddcbe8a11a95e4df7159c47 + + + 4027ae647c54253827c720a8f45d1950 + 3baa56709def1d5445c1f70711ba6f0e + 5def1e2c052497aae745c16ec525d589 + fa67ddf00b9d88f5027e5e279315d5d2 + ac372fbe98891e5dbcb4501a9c7f3726 + 5aa6c7a2074e5f900236022be47592f4 + 141c573d7fa8c495988b912a4f263ba1 + f99dd834f6cfadad294c490be81246cd + 8b9b6d3caaa128a669d28043b090eabc + + 3394c0a4d043fd067eb8b416422da9cc + + 3baa56709def1d5445c1f70711ba6f0e + 6ca82a1b768b47dfc065690961adefdc + 6c55951ce1e3115711f63f99b7501f3a + 9284f441ef4a04901a1f750731fa3c05 + cc9e759f24ba773aeef8a131889d3728 + cf9748b5f6029e4c71d572b383fc08c2 + c885e046fb355e79c6647b8732a82721 + 50a7bd785575ac5293df8bf02c9499ed + 97fc7750edc539b2d6a17a087d043a60 + + + 3baa56709def1d5445c1f70711ba6f0e + b0f4f781a037839ba4df646e438ffc2d + 438ee258d8e1e6dab070eca70dd406e7 + + + 6fe6b47289f683abf231c75d7206b5a6 + 3baa56709def1d5445c1f70711ba6f0e + f181fdafd72cd7a83070f04502e4ec23 + + + dc6ac7c07614c6123c83b2db5e42c172 + 3baa56709def1d5445c1f70711ba6f0e + fabb0801a35dfb37b94447b53e588e80 + 7a20cf7b19b2ecec431cb0d68f16c364 + + + 3baa56709def1d5445c1f70711ba6f0e + + + 3baa56709def1d5445c1f70711ba6f0e + 8c304279c4e1d2ff621937a27c636f68 + 972faf8c700639be6acd867274f6a9bb + fabb0801a35dfb37b94447b53e588e80 + 359a65c1b522c3ae6feab1beaba019cd + 675c11ef498d7556e8d1dd7b1b0d7eba + + 3baa56709def1d5445c1f70711ba6f0e + + 3baa56709def1d5445c1f70711ba6f0e + 8c304279c4e1d2ff621937a27c636f68 + 463e24c28c4cc0a55f88926b95e582d2 + 5a529a18800bfbdc6c1691b4ab4c76f7 + fabb0801a35dfb37b94447b53e588e80 + d990ff8714e91bb6423db88d4841bad9 + + + 3baa56709def1d5445c1f70711ba6f0e + e355d80dfd9523c9cedab77bd4ee2d16 + 87b4800814fcac4876f7d4e898a954bc + fabb0801a35dfb37b94447b53e588e80 + 894e871d734152bc1d23e5dbf7a94248 + + + 3baa56709def1d5445c1f70711ba6f0e + 21d400940646291e5366650ecdb2c528 + d26c0f2c59237a6bdc1e9ca9a604075b + fabb0801a35dfb37b94447b53e588e80 + 30eebbe34f6e6005cf6a1badeba115e8 + 4fbf2e3ef115c3060f1b6db07b923f58 + + + 83c79ad9f72c91c4a78b4437a21254b1 + + + 4e7df914c9c6ab9c98f332767d83983e + d51a0f25cc0f111868d2ee056f0adafe + 9a2299d68a9bcb300584fafec0137bd8 + 043d9aa4145012b14eeaa18f06ecc28c + a0c74c5d297b75a81d1e066e7d9879d9 + 4b197a1eb8270bd64dddc6f90ad282a3 + 1e7c59fce24a739836be293c1e23c282 + 528fcf1a857f81e28a1fefc11258a589 + 5f3e9b01766fe6367bab96b3d712b9af + f38f35e4f047cf1dccb295a93e27f921 + 171d21bde59a409517ad05f3443bcc32 + eebcc28ddea60c91c1733142db64a404 + 305e592ba43934182384bd1b0be88f10 + 5e5dab5d2bb911bf782a78896046d656 + 3baa56709def1d5445c1f70711ba6f0e + f322a22952921df5f09f19b828c5768d + bab1f28ee86122e54ec39bd692c7e06d + 4071fa9c8f2aa71b0a0faf18c1211b9b + 1129dcf51520ed224a2d2fdc1d48fa71 + c81a30e111440c9e5d66d9fc44027201 + e2a2a959417a161ee3b59f1202b44d78 + 32c3371b4e516e7c99ca674c93508499 + a386d6b2eb4d5c73e16a23230f6b70b0 + 6e786afff5d2feed730f60875ef9e905 + 7316ec44bb8678f3f4feac9dbcc73bb1 + 56150eea68e0f96d57e8c41aeae68d93 + de7537145ca20d12511ee3e841e4e55c + 05082d4cda6cfcb91efe099293dbb734 + 6fa9e15e99fcb185a9af8ce61ca2f6ae + 75d2015ea476829f451e747ec18c510e + 2a5ad91c6bdff85e383763485c2d9e76 + a17d0690e0e5043af5cffa14749b881f + 20b47ba79d08f06e078d22d70402647d + 5da1c4c5b7cc73b626d8985e1d163d3d + 681af71bdf8421d8060af7c51476e98b + b14ba7ba304696b1c9bd43ef125fa373 + 3baab03f655375d412a23bb828e8b9f3 + 4c7e3d4eca07d3f2b722f516cc2cf868 + 86d973784122740e5e55042a139bd4b6 + c2c28dea090e7619a86120f464c86481 + 1efd23c030d372bc357c946bfedbe375 + 109b7ad45b42506bcb62c93e38d41ed0 + 06bad01dcdc98830980e7d85ba012228 + 510fbaa49f8510b148bf85ca18b26466 + 56c72f288b61e831095853e2b5ed0d57 + 5a34b9d4edfb93f4ea8e98e4f96effda + f5e7012579ba93507001b2eb1503d92a + + + 3baa56709def1d5445c1f70711ba6f0e + ff8c7d268db240ebbd27bf6925972f6c + ec6a554e4505becbff25f95c2ce3b9e9 + + + 3baa56709def1d5445c1f70711ba6f0e + 05354bffa2cd092ce2faf9852d4eb560 + 1993b65e16bad643a87d507d74c908da + + + 3baa56709def1d5445c1f70711ba6f0e + af0fc587c66fd563a02f13f105541a89 + 234a6cbcc82476045396f360f1a6d213 + + + 3baa56709def1d5445c1f70711ba6f0e + c459a97e5f142ff05bb1b3837f144140 + 256383ca57a25a5fd6f54d07bf36a3f7 + + + 3baa56709def1d5445c1f70711ba6f0e + + a95c8eb7eed46f7a79cdf5d0c28912a6 + 6de7d40d13510088443b821c88bfe522 + a9a183ad6ec1eda7647001abdbf7f4bc + 2b8150f7dcb67742376fe276cd6b9309 + 3baa56709def1d5445c1f70711ba6f0e + 78d94315acae86e7d72301e98f113444 + 42ea7725a40aa742e0c366e7a9c96dfe + 7d4c4f54d4778a32246c53f2d29727c5 + 956455a68c22d7d8b23c336e147f14e4 + bb9020639bbad78b4bd6ad3892796179 + 7fb15d1779a680c655398be90d714121 + 38a5b22335b32a6b750027b1e30c986b + 5276c24bbc1fcc2a002ade55474dda02 + 25fa71f4d3e79672de5eb2b6c7e05f43 + 000c4e6b5fc79ba7c760cec3630827b6 + bb7b437fbefe8b7bccd0edbe882c016a + 0c76b6e51cb9421960ffacdea323087f + + beb57619c3b564f38102497bfd2453eb + 806e33a98e410ed4219bc93ec64e8a75 + d84713ba16e373151a1131b64adb91df + 5ca48a33c0013005f05c8b7191bc6006 + 15fe0f3b43ea7a4ab07aa03a42d76d6a + + + 3baa56709def1d5445c1f70711ba6f0e + + 2a1c970e0311b916160e1706eee550db + c2d7f4d88721058aeb95a0314dc10348 + e0f0a7c8447ac8043c33f75a3d829d42 + 35770b8cc04dff1e561bd3f19ea162e2 + f0e3c49d7755dd3e57fba1a4a6f3b5cf + ea373f704be6c596d0046518cb3cc941 + d0610ffc105caee3f32812c8d4ecefe6 + 5fd66b6cec3a53acc00af3d66404d557 + 80a095aa4a00cb1d687ce5865e39f537 + 484f3890a97d1e0e8948c99930ce7c72 + 392011146f42e938917db86c8a3a1be9 + f591e2fc5f5707b5d945ee5c09970a5c + 02ebc1429cbd389801d78c36ffb46fb8 + c24214134b3fe64096d56a1d3acda521 + 3baa56709def1d5445c1f70711ba6f0e + ded5942cd1f541547aa8b0d8c0ae22ab + 3acb1d5365f1d57c1e010308e5b0626c + 025a1d8104a36e0c6b0820165c645b0a + 678ac2840a0fe4481d4b15e4e517e06e + 43a3cf5d5f14976727a47b22b5109c16 + bc509d8604e0d02de4c8c203aec2daae + 1f970f19b1d6d764805e7cad626119e9 + 92cf9002e808ddd7075532567d799815 + 4a63b7a877a3420ac704c8d849f2e8d4 + fb4dab658589ce2f5f24338ea8a2e0fc + 3a8233ab6bb9286b5f60c541b79806ac + 7fad386dc939aadfcd1783e0b2394d02 + 98276423c8f4699ff03827a27ce4ce61 + 4dd9d9bd50cc5bfba3ce277835a1b44d + ca8c4f9ac6da0f58f4c48b82d342b48e + 349f465849bb5cd157533310a9442702 + 994764c423e0199110b509e2784b4f0c + 67f6ac0234f2f355ee26f9f20c089176 + 8f6a9a0092da59f004148256812ecdc5 + 2f78de1bf92ba7e65b060071121fdaa2 + 3edf0e0ba872bf7b9d295900cb516975 + 3643b4d2c7e20f5def2d0babf210a02c + d753ccb42c697fcb949bb02e6c4ce012 + 36bd898a8484d850f327b244db417cbf + 23e28fc886feaa858fd6bab7850a43bd + b2c6b58491aada4176fe9b2fcf411a52 + a9e4cc82e56c72ac78676caed28356ff + b65a0af35bb10f9a0948797fd96dd899 + 723d343f8bd576145c1ab42e35402c8f + a45b8c8c11fdea49d9ca2ef4c0300d96 + 7ad2dacc18b925df591412919c534696 + + + 2793f4de80312283641beeafd24ee680 + 7c3a3e1fcd5f2db8e75087a2057a55f6 + 3baa56709def1d5445c1f70711ba6f0e + b02bef6a62053b45babfbda795b6eac0 + 015bbbd01da16828e415247b665a3cb7 + b722fc6169b2cfe91fcc039dcbf8f9a5 + 15d67ada60f2b7a862e0fdcd1baddf72 + ed590edc3de4d83d8b391f46afc5c193 + 82491fd5e1e93fe0cc2dec78958d7589 + 9f95b60cf1a0428601e552566dd610d4 + 7f6fdda974f269f8200b655367ae552d + 38dfac0307ea6167b951fad36204767e + d58fea835d9825c614aa670aa89b6422 + bab4f0540f61659d90707ad97dd77b2f + 6d0f23b890e936610a90be373cd0128f + c0fa6c4f5109bd77995fd159883765c8 + 273af02642d0feb6703b40ff2efe7812 + 3682670784157eca627a91ae04f925b8 + 7978809a2a8e5073b6873b3055a15540 + 667dbe0197ae28806702fb36fa4b7c49 + ba9f9a3243185cf2c202c255dc7ca990 + 34003e951b630e8441935f7dded0ba71 + 26b9f6efb6881f5114789ff85f3bc929 + 3cbb65c61e23cf9284ad88ab025271b7 + b0253b6c7cf857d5654ba03939933ffa + bba92072bac451c3b76266b695330458 + e6024b1df1d4f47f753ac2f3a940555b + + + 783b0ad56b1a8a97b76079a1d41c6f88 + + 162b7b6e9e935c89b62260f13bb98429 + 17fe3b0548bf5a2c9f4e0b081efaeb04 + 7083f39fcb737210e0a13c6196f3feb4 + dee235f99823541ec88be57dec431230 + e0b56bc48d64fa8ffef2b8c39f1db725 + 1e2602a3c232f31242c47a9cadccf9dd + 792d81b0e28e033f86f11a5602a450cc + 8c765466b1bb2709f8c9db056029ec89 + 54791b35c9819515ce0cad20b7537277 + f5c6ed9f64ff97adfd29cb149176021f + eeccd3d7df38ab2c37ae290e46b3cd93 + 4a38655904f6c55da227cea464b55a2b + 88fbc9581e8abeac0fe083d572428c45 + 6d11aae285bdd88294e66353feb284da + 24a226a281a11799c495abc21f696c23 + da166bae7a0b6dfd7d9e2f6bab4576dc + f9c86467366d98200c97ac9c8b843fbb + 57d829b03853586849e33244ec12cdac + 3e888ad522a6581f99b47ad987292c20 + 3baa56709def1d5445c1f70711ba6f0e + e1f5d8ed4599ca392aeb284fe637df33 + f868a410d5438feee15a20e24e4caf5b + 377b3c5fa2285a8fa665206957c95ceb + 7e651d93d0219066bf596faa06db4a81 + d744e1f2ca7874155d7d5130c285cda1 + 9924612cef93d8722863287157768180 + 85444da9fc4c900eba95f8ff4704688f + 60b63d90f6eb6ea3334ec75d6a0831ec + 693af0abc258aaf903c4d4b23a882676 + 7b1c87006e19cac0f3590845efd008fb + 2d3c1dc7191cf5081b4f982c8cf78c98 + 411a70a31fe6420be6e5990ea5122e18 + da7607dd5df15b0bcd4da344c33447a3 + a857021fa5601842d94a41f20a5cab9d + 642aa75625a4ab2c324fb5df74063509 + bf12bcbfcb995b003e6cb3c257904be6 + d22ef0569a6faa19341db151c01106ed + 4a38655904f6c55da227cea464b55a2b + 656d173c027d5a08186e39c156ba5597 + 46cc885a69ff490c660e99173dc05ea3 + be240ed398a7380cb094c84b49fde0e7 + fb40b70ba78ef9f4251a86355c5f65f7 + 8b170b46edcc43d05082cc464244020f + 2f3828a4c02a475b1b8966609721b9c3 + ab64f179cc7f62ba45d7708e1dee8cae + fd0b08bdc63b1d969fa2df907083062a + d965b3639b678aaf5819db10189d3472 + b2ad344bf1df226aa1a760f1d3653da7 + a5db310345d66c395b592fd2f6136bf0 + bf1cf98e79f2d6792c7c7a193b4c7497 + fb0ad98a3ad212b1986fcac5015b0435 + f9f7fb74b273da0307a8bd4ec7acb6b5 + 3f6dc7167ebfdab2e4c06ca1f7ecbf55 + 1a7c15ddc89179a0e309d9e7d2b97ad4 + 5fb849693b65beed7146624ba498b517 + 690553270244b0de96ade29a9e04b02a + 447892a5c1601bb524d7e2cf5ff6cb33 + 7b87e98ac2241fffb8f3e5bb6415ec07 + c3150764daf20b6fa2142581180be1ad + 57a792b4c55dc23b2095cc190180c440 + 7d54cb0edfbc31232d4ac12f94cec562 + 37874227817498b9976e5c66e4da0eb9 + 2d7dd09c586d4275b402d627778123ca + 0f4dee4528f5f8fb8eb20a14496b7e37 + 860cea01ca64bbc3c7978d127e99b758 + 3d23308dfb3943acdf90bdd46b25f9e2 + af985e8d034123f14696aa116027760d + 47ea965b616f6afeab8d860d75787847 + 24751dd4dcabb58b82ee0817fea84fd3 + cdfdd4b3a2e181c9ed297fa55c739d5e + 813acc83f4f77a0d874426207da0208a + 5f531f078d367d5f10c287479533b0c8 + 51efc50e21ae012a17f4f3cd0f2ac93d + 0601228208954434efea2ccf265f5b94 + 7582ea79c7fd35b2b7758ff103b11b4b + 0f1be4ae65e24fc7d6a37dce828a9cee + f435818611baafdd00cac4f264e29eae + + + 3baa56709def1d5445c1f70711ba6f0e + + be3ff74589a1fede91194c0f8bbf34ed + + ad333aeb1910a0fb52d6888948dd4cf3 + 8cccf62eba6c6aa199bd63b2a4548413 + 64fc9fd33c84499a9d73bd7c2e61ffe5 + 7fcca553dcb03e98ee16d338645ea90d + 3baa56709def1d5445c1f70711ba6f0e + 4b8f7bfa5e2b51e33888b2da159df350 + 9ecd2b9aa97a7b69bb02ea49ead90193 + a7a62c010137222794e04f29acd9df9b + 4dcf649ca8cca48cea7513724f51c1fc + b4fa231a6a8f540d5c8a0b10bb6c3693 + 0465a99410b999f8a1e1fccc55e03165 + 83a05b4d72d0ce6f8b7158d8a47157ea + b673745c2e52309a3f3a805e7fa231fe + 2734b15e92a59548df60728b2789695a + 3e93cbf7a1d9cfbab127d605934c5274 + + + 9f1b3d6cba4b813484852d1ccc822e71 + + ad333aeb1910a0fb52d6888948dd4cf3 + 8cccf62eba6c6aa199bd63b2a4548413 + 64fc9fd33c84499a9d73bd7c2e61ffe5 + 7fcca553dcb03e98ee16d338645ea90d + 3baa56709def1d5445c1f70711ba6f0e + 4b8f7bfa5e2b51e33888b2da159df350 + 9ecd2b9aa97a7b69bb02ea49ead90193 + a7a62c010137222794e04f29acd9df9b + 4dcf649ca8cca48cea7513724f51c1fc + b4fa231a6a8f540d5c8a0b10bb6c3693 + 0465a99410b999f8a1e1fccc55e03165 + 83a05b4d72d0ce6f8b7158d8a47157ea + b673745c2e52309a3f3a805e7fa231fe + 2734b15e92a59548df60728b2789695a + 3e93cbf7a1d9cfbab127d605934c5274 + + 035364209602512219185d979e05c79e + 3baa56709def1d5445c1f70711ba6f0e + 26f87b20baf6cef1084f66013c8f0d93 + 3b4c831d114aa10f6cf78570febefd83 + 601d9bcdfc2e860a6eda0b102bda1829 + c502cf4b74c8c70005746cf0363065e0 + bd77b150d93d63867017ce41c8e1c6d7 + b10adfe2e29407f94c059f70f64c65df + ce9eb3414af0f2278dc6407af4ad7878 + 4d2156e6cd736d5221d525599c3faf6d + a52b9689d223ed730753ccc8adac1f93 + 7b8e02ec04becd9a62f8171fe5598eb0 + dce1014377c8436dc54765db7edb8fa0 + d9d8a0d582c7638857018dda158b1b04 + b6496db1b83783bd85d59237950a0108 + d214287acc06ae9466ef025403cc0272 + + 75db4e0758fc6c2a1c55d519a46f95e8 + 8e26a3ae1825b7b74fe3587e5bb11f49 + 3baa56709def1d5445c1f70711ba6f0e + 4e38d58f6f4d9833aae52cb876957579 + 187fc9fe3177cd2d9093ab759581943f + 156e8bb01c0072e473ffb100e7deb311 + 2a82468eb92c93a142096d6171d7b983 + 7794040d4d03ac4a1e09c3983ffc36db + 4e4369214cde8600814f8a784af09cf9 + 6636c36dde8c111dbe27a382e1acccb8 + c677733deff67c23fa7cfe19c0577838 + 133e9d6344d8f45faecabf460fb90ddd + 55b81132ab74d10d2c1d6dcbde7e6b5f + e52f90a4d1492b9148ac71687cb1e9bf + 74dc316b0056155feeb3090bf2253792 + 4f56abc501c5ede112b6f05c9bf2531e + 4f12f77935d98dfb627788c14d2d040e + ee438e5986244c14397da2b3bf826dfb + + + be3ff74589a1fede91194c0f8bbf34ed + + 3409f035e9ff13611a407a71bb9aed0f + 6441d29459c6656f840e708148ce541d + 64fc9fd33c84499a9d73bd7c2e61ffe5 + 87e8350e3e9e21b9c848eaba9acb6b94 + 3baa56709def1d5445c1f70711ba6f0e + 013beacbb2f1a7a8c623a77f2e6cfb70 + 3709870d591ac2d30fdebaee93a6f723 + b96545322d176d18b621b6bf86df8952 + 6fa91c76332938e97b85e52309dea760 + a8781f0fa0f11c3a04ddcce2455333a1 + 94f6123524c81d68a857a61de5cf73bd + ca1fc154843b839f07849cc352954421 + ef5e1ada8e00a4ddd463934ca18a8ea7 + c283b04c07a782f61164d714739257f0 + b3ca1c0c1fbdd21163c0a16c46581070 + 6f29bb79a8485f4d865d495ea8571a7e + + + 9f1b3d6cba4b813484852d1ccc822e71 + + 3409f035e9ff13611a407a71bb9aed0f + 6441d29459c6656f840e708148ce541d + 64fc9fd33c84499a9d73bd7c2e61ffe5 + 87e8350e3e9e21b9c848eaba9acb6b94 + 3baa56709def1d5445c1f70711ba6f0e + 013beacbb2f1a7a8c623a77f2e6cfb70 + 3709870d591ac2d30fdebaee93a6f723 + b96545322d176d18b621b6bf86df8952 + 6fa91c76332938e97b85e52309dea760 + a8781f0fa0f11c3a04ddcce2455333a1 + 94f6123524c81d68a857a61de5cf73bd + ca1fc154843b839f07849cc352954421 + ef5e1ada8e00a4ddd463934ca18a8ea7 + c283b04c07a782f61164d714739257f0 + b3ca1c0c1fbdd21163c0a16c46581070 + 6f29bb79a8485f4d865d495ea8571a7e + + df6db3c88bc4662e0d79a2c90fb160dd + 3baa56709def1d5445c1f70711ba6f0e + 26f87b20baf6cef1084f66013c8f0d93 + 3b4c831d114aa10f6cf78570febefd83 + 601d9bcdfc2e860a6eda0b102bda1829 + c502cf4b74c8c70005746cf0363065e0 + bd77b150d93d63867017ce41c8e1c6d7 + b10adfe2e29407f94c059f70f64c65df + ce9eb3414af0f2278dc6407af4ad7878 + 4d2156e6cd736d5221d525599c3faf6d + a0bef5b90f4cdd284d1e09dc54585937 + 7b8e02ec04becd9a62f8171fe5598eb0 + dce1014377c8436dc54765db7edb8fa0 + d9d8a0d582c7638857018dda158b1b04 + b6496db1b83783bd85d59237950a0108 + d214287acc06ae9466ef025403cc0272 + + 75db4e0758fc6c2a1c55d519a46f95e8 + 8e26a3ae1825b7b74fe3587e5bb11f49 + 3baa56709def1d5445c1f70711ba6f0e + 4e38d58f6f4d9833aae52cb876957579 + 4bee8286fbf296403e2b00c66e3aa69f + 156e8bb01c0072e473ffb100e7deb311 + 2a82468eb92c93a142096d6171d7b983 + 7794040d4d03ac4a1e09c3983ffc36db + 2843b795ccfd4b0b3adadd000fdcf6d3 + 6636c36dde8c111dbe27a382e1acccb8 + c677733deff67c23fa7cfe19c0577838 + 133e9d6344d8f45faecabf460fb90ddd + 55b81132ab74d10d2c1d6dcbde7e6b5f + e52f90a4d1492b9148ac71687cb1e9bf + 3ce894effc03c489506c7d0dab5246d5 + 74dc316b0056155feeb3090bf2253792 + 4f56abc501c5ede112b6f05c9bf2531e + 4f12f77935d98dfb627788c14d2d040e + ee438e5986244c14397da2b3bf826dfb + + + 35086553121b0423a8f2eaaedca79152 + 4fbdb31340b01c249a0fe5112e0eeec9 + f8cda9cadd854d552cc429d799274962 + 560554c3e186ad5ec2ce909a858257b6 + 945300af618d04041dc49a0a5d36a917 + 5ca1cf8714fdf4fb510bd9ec2add59b1 + 1cc433c88d349c513c801378c4493f19 + 1e2a8b2eed5b1b2f24e12adc436c2b44 + 3baa56709def1d5445c1f70711ba6f0e + 3d639b4c14c1f6b080f746b7250554c3 + 4eac58ed8deb3189c8d05bab9187f1ce + d8ba624f5336b14a49f56ca304982cb7 + 15b8d390675cf17bc3a73c3619557fb4 + 3c127931b63007c90efff1e507947ff6 + 1d045fd3777c8376972022e868891b86 + 35ba32293d3a1074e2b5d17407a1cb66 + 3d531a65189ab04b164e9ac6ff708c06 + ab6ea5b371afc02315dfaa7dfd4a1063 + 79debe8459f8ceca8443086bf29e16a0 + 79ea08a1eb866ba2039cc617ada702de + e0b94d0041ca790b68af39edf821d238 + 1da489eb8b596be7a49f1be959249988 + e91b94a47085eac01afbf48c8cd515f0 + eb63c3d2dace62e102af74004ccd0ff1 + ea7d13d6d2212ba59159c40b2a57bd3b + bba378cc8a154be8b3af270b42d7143b + 3248497acc4c9a3eae7d094860937708 + 81ee7ab27ed9b0f3556a406ff6aad80b + 625c5e7376d305ce4a11fd1277de5734 + cccbd3de04d2ff8cd30164925353c394 + 513bb6d79ab29c58ab1b32646216a3a0 + f1b234712eabc4fea71eaadcf2e73ffa + 782fbb6948781cffd80ddf4030196952 + 34b4be2a83a8eebb16ac5297a7dcfde9 + 6908d69d10dae3d04c23ca83a884ba6f + 709c80dab78bcb4ea4b2344b0174c4cf + e50bdec823723dac7508d2343559c598 + 71a13d33f3fc7de23f13adcc4593a5a2 + 873b92422573849fad6cccb726c2e6bc + a1f7d2ad92d7a574ba40a6ae3efa8e10 + c6c4d43ac586574589a0ec4542a890a8 + fc421b7d814dddec5b97de420b2674c1 + 3ae92de7419e58815544147641a87930 + 739cf68f21c10e04cde3ad13fcff9063 + 1cca9d1d61a8a9bef77cfea0f39e793d + 2425a542e6dde093dd85ac0b5adc0141 + ec9758d9508e2fd22ddbdc6d5a28f214 + 59cdbee6307a4fce031bbd89009a82e8 + 67b603ea0e4abe708f871111fcf45738 + d5112dfa4dd8e8f8067081cbd8be3ae3 + + 8255b4d59a52350833494c9849ac2152 + eb05d8d73b5b13d8d84308a4751ece96 + bc1fd36b5cf0fc427530713363fe1cbf + 3baa56709def1d5445c1f70711ba6f0e + 320d45566a0cc56e3cd8c740d42ba859 + 9929873df0833fc027580212a2c92742 + f832e36068ab203a3f89b1795480d0d7 + dc5e7f18c8d36ac1d3d4753a87c98d0a + 9ad1c636d9fb5028d48c133f428eebdd + 162086f27f53cf1084b17450780a6527 + 8fc25e27d42774aeae6edbc0a18b72aa + 41d44ff15489d66244d408950302a9a1 + + 874f691a2d0341e4fa5738f4132e3e4f + + b0f5a6a94fcf0ea5f834074a038c5a0c + 8ac991cf79a0736bcf4d88a44c3448ad + 5119565d69cd68fae2e2a709363f8754 + 7c3d132b767c7ca94f76bc16a933884c + e5a10bf730a47b7085fa840950e90445 + 34e79492e949c254dceb6f79c00ad81c + 4ff0bb5164ce2491b9cf74eead7f8d4a + 35108ef8a9b19a11c595ee29e6dc7032 + c255d49107ffa6f1b0bb7313195551d4 + cf176a509a1e2000c88173e016a66165 + 3147c04c9a4ebe77de89a480251ccb4d + 6ce1ab63432be797abfd97043690ef71 + 4bc77b7d4d540c11efcd77292b4bbee2 + b2a9f0f9106bff306882b7e969e975ad + deacdee2fe87ec834263f37be059c2d6 + 533dc858da180507adbff9518ae14685 + + + 2a8ba7d2631729bb53b42530d522ff08 + 3baa56709def1d5445c1f70711ba6f0e + 39b5b1d64b18c5947e72c745e3c6759b + 56cf5c516081f77c0c70d76495ba62f2 + 12cf54579be4237ae3f92a116ca37e6f + b270e6669f4b005c692dce3d0089429e + 12cf54579be4237ae3f92a116ca37e6f + 986ee7dc13e8ad88071f8bf382e78ae2 + ba6e48c926618bb08b6a5853efeb2463 + 7285b10de460c983d1dced75ba3a13cd + cc7fd883d8fbd9ee7686ac932d4e9668 + 6b737ecca99b73e70149195653627e4a + 39d5e556f07b5663cef8f2521b9cf8c9 + + + 3baa56709def1d5445c1f70711ba6f0e + + fdc05684fd9186c71cf47260cb0fb99b + 7bcab8a35072dc586f1f005a82463776 + d346ffc2877deb77c12e5be719a13982 + 17d7023f0e42bb7935a7c3505bf077b4 + 6364f3eec47ddf12b12b61c2f4faee49 + 1835d2f168d226fefbe3c9a1a3e61139 + c7b080186f4d24186d5c0df50cd8f83c + 93fc68e69f8de0138c806f50ed30d93a + 62eb334faf2aeb853f1c9911d450df9f + df881fa05839c5e5e935d6c67c964c47 + 218bdcf154666d1461eb83bcc450567f + f1ee41ff4a12e34dea4cfd7081cd9da8 + 6e071e4a69fce9bf19a0feef6f956db5 + 24474d3e518d3d32f537d78cfe4abd62 + c79edfbb813954a195b50804e56f973b + f5c79a118f75f78ee03e9a7cf5f84786 + 3baa56709def1d5445c1f70711ba6f0e + 4abdcf0fa2a10356cb803dc11e195114 + 51a6d408e73cf4e54f951971edd40c80 + 7d08b3ffb7b78d97d9f84ceefdd010fa + 69a4ec02c1b4b3b60d1cc4c621a4cddc + 7c19d0ac8732a6971e1863201d53f32d + 873121b810d4f75d9a2bc4e9e00b25a8 + 92c185ba9f4037d3eb381fecc7418ed3 + 48d71b88c5e5b078907c79a652d5a953 + 165c06f986307b02c1c29671b824f73f + b6015dd86608a0b3ef86157c1fc6f728 + 600c6e87369d162ad223cd0c96f5a8e0 + 07796c28b0dcec9e732032d7918a7fb1 + 7718ba716e876d322ef4701e6339c65a + 23bf284233077de1b99e8717037b6458 + c5cc0aa2fd5140140e3e385e4c9d8498 + a2984282c919107fe953a84adc68dfe7 + 042edd99922454f882e1d84e56e1b396 + e73a695be64456637eab4c9a7652f0f2 + 3a85aa3f82f646408d202ce78a65bd79 + c3273d70efe484acff89001eb29fe09a + 5833431dca0a58260734e190a8b32f95 + 8a95fedf497fe3be4e70dbab88a58cb5 + 229837730ee08b20cd1477c0e93d7b07 + b8ccf48087f656df396cb1dcae2b83bd + b06dc864a3f5f3054c86a3663dd17cd7 + 276b5cf3228d120d7eb168a03aef3359 + c591fa913a5930cd4768b9b94999e592 + b02990a5ce70f3510bcce39b9ae2864d + f704f7903b6567413715eaaca8c91dd0 + 1cbb9e4ab8b2dd849ca3274d1c342c12 + 01129afab5e375202f103f0e1fb5a8bd + ff2e59a1568e7ab9a82e9a82ebe7ddc1 + b2a7e20a3c243cea4e81cbe926acbe98 + 386a1b97cf793312f3a980a114131dd1 + d990c95bec1521d2c4ffd8863c5f5f08 + 5d17579aac4b22892edf3cd5c44d0023 + 4963af1b1babbf30188bd3420c01af0b + 98f44bad52ffb003069f0d9161d02aac + c895c94c3762f5ba8beddd225c583936 + 652e3d7db714db2d9ae3ae39492245e0 + 7b2f043be28c47be469e4d5f992045e1 + 12047fcb7663271805b6fd932f3be815 + 166d6a131bdc4d66e8b59b1f015f0a98 + c8b741c8e5983327108133a4ebf699f8 + 0fd223eee775b8f306d760d18cf45f45 + b916499b112ec4ec945e67fee70d3d8a + f1e49eb2fe089e6c5eafc528c9e81e4f + c7771d6d7833cb8a2fd896e2db65ae40 + df3dc0853af859d3f5b32182dc942dec + 841f54370ae53c68e3103b4dd7f34a6c + f0dffdfb350ea955de7c97ff7a64b177 + 02dd83d779d1dd823056c9773eef1476 + ea0b926cd81b0e3bb96a5305d6469f3f + e5d61789b60b621ef772ff4a514d80f5 + 4db709563e0de08c876df31e779c9bf9 + be1ba085c0615f8a288548dfe608ca12 + ad9a3ef9e033346edefcdb3abd831ce6 + + + + 39c63d55f2952d50539fa820cd924858 + 07f871a08c4e74b122700f08d62cd2d5 + + + 3baa56709def1d5445c1f70711ba6f0e + 6780f4abdbef95399af1b119fa5aea29 + + + 3baa56709def1d5445c1f70711ba6f0e + a1fb7849ead53b3133513fbad848b4ba + + + 3baa56709def1d5445c1f70711ba6f0e + de5a8663785b3935c25de905c0935648 + + + 3baa56709def1d5445c1f70711ba6f0e + 43c8fe737cdb1fc2decde51b404c35b6 + + + 3baa56709def1d5445c1f70711ba6f0e + d6d8734e1767ebcff57e6064de731a40 + + + 3baa56709def1d5445c1f70711ba6f0e + 1a723bb66a9eda747c89533a75b49c7a + + + 3baa56709def1d5445c1f70711ba6f0e + 137e300b67a653989e78a3584c59b9f1 + + + 3baa56709def1d5445c1f70711ba6f0e + 7ee0c9abb650905bf373c93f9de4cd13 + + + f4a877c33da8eb8eee62f867a0b574d4 + e50a74640e3ecb56a131ac75c4dd3115 + 3baa56709def1d5445c1f70711ba6f0e + 498d1ef16a2d62459294d1eabc98581c + c6a2b19627a9ca7b1304f9c63119ba45 + 8b2fc7327c291474352d3c14254c6925 + 945c6b53bd4e97e6a1447dd174cca0fb + + + 3baa56709def1d5445c1f70711ba6f0e + 920a235626ac29139d180e839b5f09e0 + + + 3baa56709def1d5445c1f70711ba6f0e + ba16eb61e7a0cd292a9813d8b9d0475e + + + 3baa56709def1d5445c1f70711ba6f0e + + ec4fcc458e07e8cbc736ab065f1e8f0f + f33e46573b90f9925c2e1589fe83072e + 4067df358982986969e300f6d7a388a5 + 5dcdf109f0d019b870bdcca50a0a115f + 9d319af6a2e57340bf62d475a34c4b4f + 4a727ba522776b668ce467bb014aa75c + 713a0b1b58fda25b227d0c4c9a6e5ebe + 78fa9baccbf75e9cb5a01bd95db0188f + 3baa56709def1d5445c1f70711ba6f0e + f2513fcfabf0c8d72be080f075a6ecdc + 9eee34d542a4debe66119da1af492fa3 + 4c42e825541018e63ef4e6ec2e7f07e0 + 724e4bd31d49949a0cf7fb0ddef9b23d + 4456da0ccee05f6b7887e78f19354c06 + 59930208822fe755f651a67ef4b70530 + 93b3c0db0f8ad65c4b5eee999f7bf588 + 7c21ac3e9cb1790c4d3b9fd31dd04bfe + + 0d1c55f3e2271d84866c7c9cbc65648d + + + 3baa56709def1d5445c1f70711ba6f0e + ba669082d7272d4a9e69fb2fdb82c293 + + + 3baa56709def1d5445c1f70711ba6f0e + 8751593f8a00cc41f908aa4dc5f8c938 + + + 3baa56709def1d5445c1f70711ba6f0e + 558fbb9b62f31c55d2bf0bfe4a30c46f + + + 3baa56709def1d5445c1f70711ba6f0e + ecfba7b663d82c1fbecfbcc86db4a649 + + + 3baa56709def1d5445c1f70711ba6f0e + 831204a97da9fa6b6784885a930a2743 + + + 3baa56709def1d5445c1f70711ba6f0e + 8502d39ca5dfe1b9932577525e8d0f15 + + + 3baa56709def1d5445c1f70711ba6f0e + 01f3ca426c215100a9de6a4390075198 + + + 3baa56709def1d5445c1f70711ba6f0e + dc9149f7d041ba6fc099a5e4b0ea55b6 + + + 3baa56709def1d5445c1f70711ba6f0e + 3d200a9c053d7ea9d3cf3e8e0b95ea87 + + + 3baa56709def1d5445c1f70711ba6f0e + a16dd4d8b3528a77d92556e47c63d41a + + + 3baa56709def1d5445c1f70711ba6f0e + 7f1d73ceffa566d1c043943998f65b8f + + + 3baa56709def1d5445c1f70711ba6f0e + 32b438beb73a7396a577bc39e74a8fa3 + + + 3baa56709def1d5445c1f70711ba6f0e + 9909e52285bebacd4e452f70a7a34769 + 4e59d34efb2da0b9a033596a85e4b1ef + + + 3baa56709def1d5445c1f70711ba6f0e + 390bfa9670584794c6719778aa3f606d + + + 3baa56709def1d5445c1f70711ba6f0e + 9021e7f4b2acaa7e6dc415c4305ce44f + + + 3baa56709def1d5445c1f70711ba6f0e + 22963d036d55c13e70e07cda1000e2f5 + + + 3baa56709def1d5445c1f70711ba6f0e + f59a9dfcacb8e18571e21443c777f5cd + + + 3baa56709def1d5445c1f70711ba6f0e + 7adb17c4a802f0ab385f4f22923c5c09 + + + 3baa56709def1d5445c1f70711ba6f0e + 77ab0f79bf00f4e22efed0a1a6a0a4a7 + + + 3baa56709def1d5445c1f70711ba6f0e + 9c97812ec09ab857e0762c4950a9c3b1 + + + 3baa56709def1d5445c1f70711ba6f0e + c3727408aca235634c35e1db084517c9 + + + 3baa56709def1d5445c1f70711ba6f0e + ee5f5ccfd4888467dd6416394b03f9d0 + + 3baa56709def1d5445c1f70711ba6f0e + + 3baa56709def1d5445c1f70711ba6f0e + 85218c4db4d3f2a05cb09ed83af1ca3f + + + 3baa56709def1d5445c1f70711ba6f0e + 1e2cb205ddbce29924cb7bd5f6e9a453 + + + 3baa56709def1d5445c1f70711ba6f0e + 0cc893a90ae00c13d874bed12b9620e6 + + + 3baa56709def1d5445c1f70711ba6f0e + 25e9266955b8fafe7258356021c0d905 + + + 3baa56709def1d5445c1f70711ba6f0e + + 3baa56709def1d5445c1f70711ba6f0e + 375a02f296a02a8c1bc1026345c18dd2 + + 60a1e89ca7095bee9f8a5ab193f303db + + + 3baa56709def1d5445c1f70711ba6f0e + 9a4f9116823a5030deddeb9a298a49a0 + + + 3baa56709def1d5445c1f70711ba6f0e + db8e7c05761c628167d85a58b482e1c1 + + + + 3baa56709def1d5445c1f70711ba6f0e + + b7a6f110d8850de4aee094cff66bcc28 + + baecf466c40e709e7ffdbc935fc0813a + + + f3726450d7457d750a2f4d9441c7ee20 + 12bf9e19374920de3146a64775f46a5e + abd3613571800fdcc891181d5f34f840 + 394bafc3cc4dfb3a0ee48c1f54669539 + + 0684a64086ad1114949a1e51f06aa750 + + + 3baa56709def1d5445c1f70711ba6f0e + + db33e7676b65cdbfddbe8cdce17ca068 + a2a1f732cc34764c684ed521c6f3327c + 50c955d592e8a54a0e4cb4936d386076 + baecf466c40e709e7ffdbc935fc0813a + 06189313e1c7504e1edaa12766c2cfd9 + 7e0c88f02dcaf2f78c90b4dc7827b709 + 28806940c647cf671bebf4ae0630e570 + d031f47facf4331979b6f9fbac3187ef + 12d26c285b71d790f4b0c94423ef1f99 + + c6e09b903c61bf2f2c67d381746ea608 + 3afd3d1ec5c64dbcb7f45a765e9fd976 + 1cc47e1011b5b4a21195e327f1889c6c + + + + 3baa56709def1d5445c1f70711ba6f0e + + df7d020d20c5aacc08c2601c88b92f1a + e7f90d878bf84cd6d820702a3ccab17d + + + 3baa56709def1d5445c1f70711ba6f0e + 558edbf6c845c9c87cd268285a0666b3 + + + 586ce1e095c0f8b0cca1439fcefe6b6e + 045d04e17422d99e338da75b9c749b7c + 49b5cf1051ae4d8265839fb2ffabb9ca + + + 5c27fbfe9a1b8838c58a4056235ac9da + 0ba11c881061bdfc72affff8a3785c05 + 3baa56709def1d5445c1f70711ba6f0e + cdac1c2a63343ac2c32244f38e027de3 + 51fb67de096c6c20e4e25e63ebce9556 + a31dbcb3b065a68e1c947657978430e9 + 3eee3117fb671a66ccd1c7c62e68152f + + 7b094f7791431f36b42b7830ff0feb31 + f03cc32f6d186d3852537de64c28df52 + 5119565d69cd68fae2e2a709363f8754 + aca2dfd21c67c73189eee663123a5243 + 09d17b14edced2adf1c078b41e97037b + 41da9bc01a0a2f75ebeb840e0ac9f66c + 9d0e71c0f5aef824ad0cdd4ee39ea661 + 892428f3b3c39aa369ac5afffeb9785b + d1bc89ccb17f94bfd8cb84539c69f3dd + e20d1752c9738b5b74efcee9f24b18fd + 54d2130fe95b94d668160447fe0226e6 + b37f8e4b638975749e042abe244cda15 + b6245d78a1dd11e77f682eab7073b241 + + + 5ec76315d96a7897f6702916649cd622 + + + b3c8794cb2ea656dc79b63f0768ca625 + + + bf0b56ea68e7427b94acc3312b96df60 + b7193f910391d7836f1419c2dbe9ef68 + 922163d67ec2389d56d4610f7479796b + 9798bec305d3f2012672ef6318dff469 + a30b0e860aebd16354e899082c73ba36 + b59f041269c08f08fbbd83f0731d1344 + 5487c8e17a46740b10622e5a432ae9f7 + 755470583b48e320abb2d255f3848175 + 190823f8e995d759e258cb9df0a0c950 + 2db76f6722ca4d3ffd1a6dde0a26f5b0 + 0368b02bf14ef724812e46918baa1c83 + cf8ed15f39afae1c1410fb922b34f761 + 2ed2f98c48ef2220a863f4e98c44404d + e435010f0a58e9bdf66b2413fabcf110 + 16c3ffed950277e69284e4fc883e6745 + df21e972a0ad5af80ee19d0b229fde99 + e8d491d2c6ce8fe1dc99ad442e5a25cb + ce417a6cff1cabc4ab9cc6c71c80c999 + ee1a500f7858c6216aaecfa795775a0f + 7e6e2dfd4fc0c35a47e1233e13b1cee9 + 46d671c5c21d92ef8d53608c27c3bf0f + 9629cbcbb29cee8001f7a97ca9738cfb + fdfecef315be91902b33271357adfe6f + 9f4de0910f443c3174b3eb4c0a8200f4 + 9280144a9e9beb1ff35a23f86df9c6e6 + 2d2863cd899c3c3a6fe2731eb49dc50c + 63ff13a1e0697c47cd56882145fd1a4b + b3f38167825b4ec26198f12a1dcf95f5 + 88dea320302cfd57f34f3e8a93c0d063 + 8543c93fd74c3ee95d470c1b6aa5bdae + 42126210db0fe68378c435ab31e594be + 1e0a76bd7db587da78a33d2dc7c02c9e + 5b19d797d552424336ca03e4141d0f82 + 9c97d9cf2b75226b654ca33801d1e635 + 8c205991e45b06bdb7ade7d10096e963 + e82f2fe7ed83a7acf8090a95e25fdf53 + e1323f4618ce102a460aa47899d87a48 + 37c3160e8659feebf6bcda906a0645a0 + b765347443781d4094ba36ef0a9d459d + 7a52fc295a2594a643a994327b2325d8 + 539c779c3fffc76470433cd2433513cb + c54022aada3368419a4aed0673ff8e5b + 543b852253ad298e18f46c6a6439df44 + b984a5824e3b10d28c4f60418f4b9640 + 0dd1da2001af45ead1fc837f4f79d11d + 04dfa271f3468c477ec448d91ce9d624 + 193dc0001a70fe2313f05c3df2334d5b + 9fa56c7b53844ff369e85d5b72a84a83 + 24eec3b79be9735af8db6cfec3764c7b + 721ec14e4465d70868147889cba54b9f + 5408be69579424d92b2c644424644066 + 05dfdd934c6c69117454759380826821 + 087b5a9caec16394e96bca97a74a61c6 + eab75619d19b3dd53b87aca6c1550808 + f5404fd2f1bcaaf02b9ae7e6e0f659b4 + d6b0641b3060df4a57ddccd75b526a38 + 50d87750c415f48cf57da46da18b9003 + 5d10009f30f222e67d8dba23f9e6cf68 + 889ed51fb518141f149b602e62fe9981 + 0127bce6178502c2ac45d1886e8ff164 + 21abf1eb7b265567baf812617eebebba + c2046f6044a576e4e63e55e8d0895f6a + a3ea88ed9146ce30bbae31cc4e138e85 + facb75f838ce75ac80143bfa875fb3bf + 0d3271633c82676a3dba7fd75df86ba5 + b549f9fbe8f527a3ca0fee034da773e7 + 67eed2bd0229b50bb45a2135f356db51 + eb264993c3d15265b6da5df522176e24 + 69054ec6fb23b916bee9591f3d3f6abc + 85b88aa5e91f25b3d5e35fc4a6f58abe + 8b7d663580ff29da84002c51684addf3 + 09d646489cb402b4798121f8a8b06f70 + 8b3870d8d401daafe612764ef99601ca + b979ebf076adb0459b809a6406fdba47 + 28e108dd112db35d4884a763e6826b89 + 22a82241246026e439981b77af3cb5a9 + 789d67d00ec0c1f40e2a67ca8204d7be + ffea7579e104aa5edc7cb4e8f0b188ea + b70beedd1c596c131ea2b82537a01efb + 9730202d7d7e4eb96c8316c59d1032bf + 62b6f3f8398cb96f102ac89f8fde77f0 + 0fb43f97fc2ed671adfd1ed1657f83fb + 3bc9bfd531d58842f92374ac24dfc017 + 3105fdb859b88b0700a4f93c23c5bf44 + fa763b535b5894cbca98d441c8dfff6b + 0d13e811615f4366c37ee8a8f368646f + 32c0ac322179b6d3f0332f9f33897dce + 4d36126781d3f179bb8a187f3b7402ae + 31aae34111c5fb522db670e879f50503 + 648d97118604357f8be8357a218ffabf + aad348bebbe990d161ee227cab536785 + c403b3777212feb986122ade86eb46b1 + 363656c616c6a8bb9fbe02924584342c + 1a3103276d4118128a79235c35432483 + d152cd7c3c4aa61771b592f3ee2ed2b2 + c3428a371c280131762e28b1187244bb + 80fbd707a436bdaf19d1512d56123448 + c68ba65f25e086b481dc04ea353dab53 + e772d29abfd058fd5f47e25ef2cf416a + c2df11ee37aa72beb0f50313fb3ca9a9 + 580e209badd9840c26da505d2bca2e78 + 43883811dd5b1b2c032fd5a33b051fb0 + 4f287049617a06d7b0ad791d3c1fe14f + 69c122e7083e54e6da4ab53e1e972ebd + eccbf69616c758504302ef97b7b07d00 + ea50e05a098bdb0314e33d48dd63e1b3 + a8c0522895d0b72f9943137a5912ddbd + 51131ad83e4a882af10a60ff743a8ea0 + f3cb6056cc9ab7dec34b7929ff01595b + 2af6b1d1ea9266a7f314f12cfec76485 + 03573446d843c33b7b903cfff4ac5f2a + 778fdafa8aeb591a716d3a3b80304f12 + ad3bb951b41143590236b0a2f40c4ea9 + 6d5e800923020f3123e32c350b40ed42 + 6d71b68e0863555f22cfab656b054b39 + ba68f5441d2bbcbfea5b2fd6f25971ff + ea1c146866c7ac242e91c760733e1173 + c3754a5ca8065372d97b76b1d60a0e6c + 2c774fe8b5832b6512a0bdba5c043be7 + 58ae44a235894539c014bf754c14e3b8 + 4a1e9d06614fe3f6febd27d505b4d6c9 + 747c6acb6176892f8e114ab56cfab104 + ea7606b658e447c00b5a8b85c95f779d + f56230f8e42f37f14b6e185cdf9ec8b4 + 04ddc9b1d33e71f72eea6ad4e893aba2 + e49cc2ca505e84f6458e93d475a3481e + 2aebce3e649dfbdfd4cab266d9fe4188 + 132a991a3331487aee5f57a80fbe0f4e + d079dfa936646ed43785e7b7fd2a8c83 + b0eb255676ab4599bca0d117111a949e + 57f3b9ed62af6c5688ea6927addbd72c + 893ba48def5cd72691c397ca59eea00c + a861b012e8ba42cb285ade06d1500e69 + d30b9e79c11bf97bb5f2e9489c87691d + f15fcd84ee9c4c6d9e7fc24aa9c7889f + 7fc324ba8782939285c871654a8bd07d + f283223e133842fe8e25ce401893ad01 + dab3ea70232d554da8536c3bedaa2f92 + 9c3535cff69447535ceb47f99d6a835f + 8b1af84a85b438c7cf7051d5fbf8e8d0 + 21a56e1637e2e41803cafdaac951e43c + 0e56a75a205278896be7798d12efbd4f + bb5e5205d803b96fba9e054eb578fb3b + b5b9b6f37bd0a6c356755345f3c94a1e + 2ced20987c466660beed72001bbbbb03 + cc5cc8d00b7719414dedf329fa95245e + 0de811520493d678f96473aeb5dce240 + 28c5014946046aa6e39217ab928a1848 + 3e377cdf78eb381c33bfd1340a115fbc + 66ad74aa157de3bf98f94e75c6f47e48 + 408820e01f733f4efd36d6e92b2b2c53 + f82bb6fa57022083db99c90f09627cbe + a1827e95059cca7d362d59ca8d16554f + c5be1702adbbe5ad422b2c6385c189c8 + f9796bff0673297632c3b99b2de8122a + 074db5fb9e8b75d3cac73493a586b61e + 4005c39e149617aeefbc40a12a52066c + 58a0a5b53373a60c9919b38dbed65912 + fd37b9b65d33a8f17a261842af5085fc + 10e7c9b51d745f6f7b7549e93a03a1f2 + 9e2150a43f0adc6beee79338d5a51d2f + db0e62cb85bb71cb560265716afbdc2d + b0f9860e3cb592dd7fe775bfc4b31e7e + ba1d79d562041217e318b0cc6c3b6d89 + cbbe7924cfd0b600795c1196705a3b42 + ab96f99947599e2f77e87ebf29aec338 + 6bc0687886bbf903f234e6e9166587ba + 44d221ea7bc500ca4f3a355296bf37b6 + 958ebb289f19ed99bf4b83c635dcb7a7 + 186488b77d7a4fe410a782c73a06cd64 + 7ef1917d3cd3362172af4e2e1e579bec + 48665eaebae93813a4535737ae8b64b0 + 6d6d13457f39127e8ad2b362e5afb1ff + 78510e88d75d6837bf0fc0897e64bebf + 1e27e0d09c97ca7489411cd732f328b8 + a56634415cc1042be096d842c24fbfe5 + 233e5b3114620092a4a3ccefe63681e0 + 370d1c55c93e71bd8f97f2c2e56050a9 + 4dde7bd9a95c5744c08d109673e21e6c + 6d1400fe68e8b46b899eebaf83a0584e + 922a6e3c881a837303c7fb351eb32484 + 1411f173f495e35dcf3b1a7598bc1922 + 5679a5cfa100bcbadc770fb00b1ca30e + 8ff8d24bac5d664589f038aa9cd147f0 + de69bdbc240bdba979a69c4c09653768 + 51ac770ffc3fa62608273eee041d5126 + 8552fcc5bcf3c5f3024965963da5fc54 + 6da0cda2b58fc024b97ac5a23a2d6305 + 248b92890e2883e6bfe15a3097070403 + 3af5418a62424993ca03aa7e46925c26 + ba9bf1b8c53535d8168f0372517ed544 + b585bd6e401ce34a3d1bd1e068ec102d + 8e0b8050b89934ef212b93635a9f1078 + 662d701cbc60c2c7680224acf6abeff1 + 42ce7b7611f57e8efd7285250b43a344 + b70764cd2d0eeb3272db24077256eaa7 + 0a36fa4bf3576d79855cba77e23f97e0 + fd5765beaf9016cd9929cc71ff13ebc0 + d789c2854e2748c108c889d17bd436f4 + f16eb33a7ae458c921e764d954b10b6c + 29e29adc24a1dce8f781fba7b55d96cb + 8c30cf20d199a689279bd61732c7ee3d + f90e014b2b874696ae5dbcf46aefa552 + 1d6b12489762d5bd30abc21957916547 + ea40c79ccad97834bfc7b09d7d5b0c01 + d935c8c2bfbc1cc7b46836e750d517c9 + 15dbe8c7faab590ab4f7fda91598d3a8 + ee3feef784089e29e891b8bbd14963da + 61ea0813b91aa1e431287bf035391e27 + ea75b2e546b97e62d7602150cae53820 + 6fd2937468cb7d8baecc669e5eff4092 + e4ea4faad3ff02859fd2532216b1b394 + 26dbb72319b1af1523a44260501ecd4f + fc122b1e9c673b8afb54c8b40f905780 + f612e31fb49e31fed0daccf800c3d8e9 + abc0217275a9a81bdf9cb2c458061720 + b81932f5070bd47fa0dd99fa418c98c5 + 3373e11f923373e76d7ead2788e4c5e0 + 9423a5fd19bd1e7298145ec7212a7b39 + d1baaf76208742da53b59e55fde2d157 + b39c677fd9cca21361961c25cbd45fb4 + af5ac34d2f3f47e7b62ddaa20deaad73 + d97bca5ae2dde1049eb44e1f79d28606 + 3af0745b3cda12c3a9929d6aa90e4701 + 6a7d90ee793a48ae2ea66299e40c60c4 + e566b4960beb31bb6ac014807ff56f59 + 110c0c05540037e8aa96091c768a68c6 + d1226f83e01521fbbf3ff3e427636126 + 00e80de0a9a45586dccf35968f42cbcc + 10abbc9a7c78f11b3e9f239e793979a8 + 56f5ea10b06f00c52bcb2bfbe430f8a1 + 724e9fa3363d3d5251feb9867ce46a8b + ebe72c02f56f441a334a8527144e7b7c + a83afa745117947d7f2b83543d64a0ff + 8ec4bf25af8767f01438de8ff08ffbf8 + bae19e3999497a70bea59650187923eb + c9d13a8343d82101f5529eca9325f5c7 + 4ecd7bb94e4820e6eb3b8402c2a7074d + efef935f0d8eace3375bf07c607da09d + 7027c8dcca81a8cc20d52ef567229b12 + 1747581726346dfd48ec7735ba7039e4 + 6054fcd7143bf657adfdfea825e1ae1e + f1b4bf84dc64e686c40d6a468d8497ee + b481f805789b32e7f3935a14afd3d79c + 109c4f51abe70d66172af95f3cef0355 + 4c5ce324688df8910f0612b520c88712 + f7d78366e8e26b237283f12634a52e7b + fa8814d45a473a771107d215b8ed3300 + 66db01fe9138b3464d46791aa138f652 + e8b3bb6a3f31d60d40b2ed04e4409253 + 58210ef0d2fbcb3087a1fcb6af8ef2e0 + 85700239f3319c3e6f6d40204c58cd1c + b3e81323feff4bd8bfa4e3baf1f17c76 + d3254297058bf0dac4b31a49ecd1c610 + 50e44099229526c53b53446a3f99b3e9 + 5f6f5c4ce7073cfffaaf3c7923ab4058 + 622e22d27455cffb8180c98fba442260 + 17fdbca9a076c400063f0eac1ade3c78 + 46244c6ab257bf55dcc7ec89c94c9c70 + 0f7ce822216f07928bc5f0d59787209f + 6475bc019f07262fb0d7f3604b91a6f9 + 4dbf3300f4c46823108431b04a4b8547 + 61c729a641c26df5fc834d24896e5d2d + ee74e971be36daea16ee77b9beeb5e06 + bd8781b4e8045754609c4657d1af1b20 + f9e1b6d96c985c6cbf48a89ede97c7d4 + a73eece18e5a52feadf5103ff9c70c6f + 8ef94ce1ca596cee75cfe92c05243831 + 13ea7f3df93c267d714d2edb75100e43 + 8f0420a68f53a3ece760da926e6a0e65 + 424f867635067bcd38e2e532415ba168 + c2d93e879bddabfda732a3e81c6ac076 + 38ffaf947ce3fe53fbc251363aa5df43 + 747db71bc424ec41d58c52622c502b4a + 0930aec03820a3472dbce282faefce9e + 670b9c2d3a4d441360b23e63e946948e + e841df0eaa7a790738f1cd0d7329fe4a + de2514326d140e47b4be6d1b428683c7 + 91e4afce1045e4d75e036089fd996b30 + 409c3c14f6521a2cdf5878cc08256d32 + 10326f28769409da47e2efdcf58a7719 + bb5ea011e83bba53433f724732becfb8 + 0a9d6392f5f950a836099aa4ad00d2e0 + 442ee4a6762a5c8b6121ef07d7ee0da7 + 9ee9c6ad49d0dca3a650db9e03d60551 + eb5ccb7296ae224b85f76a355eb8c9c9 + 77d94b7263e1e277d45ff0d661c67346 + 0155a4247b6a5a1c6d46dce08dd5e50e + 0c921a5c3d161ac084b5037b73a02807 + 3c8749779e75b4b1da9e647f0bf36b05 + 918fe5c867f34ca2f0a4e99da9d9b4f6 + 1471fe5c9aac4fd4ce3975164c9bd73b + 7674eb1392b9cef5b2e13097fa75d232 + 72e7bf37d242a7a51198ea53a02f0dc6 + bfec55456af21dea0dd92e001ef1985b + 27515131814b5ec3c73934487f8341dc + cd7f3132cc9f959c1ae3d979afc1c44b + 8fc21397f755cf961952a0ffaf67e064 + c0dfd9c7a4405721e2a69ff86db909af + 9eb4bbc9e32221b9bc38e35aa808d74c + 5b5cdeb3446d897b009abd8a00e814ba + 97b5d73448600c7bc500e1270af9ede0 + 559c33d34f797bb03fc995cf43c0c2fd + 19b632d9fd16a5ff69c7ee2233b5ad15 + 9ea6678c25ebf6bf6a569b52ab97954c + f7fc728605bdf3ec6830c30fd4f585b2 + 36a952ec879d4aa09bc4065d6a666b32 + 4b4d8a7a504838c1f4dc5c127a06c5dc + 0b42170766f3d661f3ccc9a6d7f048f0 + 6b891135b61189b012ea2925915f302f + b2843f549f0a0fd98fcdcb2e78355d3c + a79f14f7fdff0247ae74a546ce8e3133 + bf431945985736ad9f9f2c2dbefb4d39 + 4c82fdadd67650715d757dfba333da8f + f999340ed34044d76e183edec6fa632e + bcd0d57c2fb34753819fe4ee3b9788cd + e34386a692de8b7a6e630eb82d8dc742 + 6e7c2d54f04ed0465661d207406d9d8d + 693a8a31d59ca75c7f4c41714d952ae3 + 21e25507e03abdac28b788e74e3fc5bd + 73d6e1fd2eb89511627db04eeba478eb + 6e5787997c732f9a10377f8e2c718d78 + af925c23f7dcd1db0406af8529dc3aa4 + bc95996f509b4a51063bd37f96ce056a + 34578e3fd270b2fe4013e012baa54c68 + 8de2036d080437580de14113d1fecea3 + 95e063d2b61d8e28ebf7076c506ffd8a + 6918427f943f7cfaee5e51a224fbee9f + aaf95525cc440d2efca788e0fd8af819 + 1a49942ae0910f4ac36f013be67c6f21 + 67a22fcb3b80c0edfd6ec8a9a2752bcf + c2238228e5d15139c88ccdad5e1b7c92 + 7125b6e7136a6143d1a3ba027cc8865d + 3ce7d58f7072ac02a1a359f2d980a971 + 8b19723f228977e23d9c511d87bb3a23 + b6d0d85664d8c4d7145147941b15eb08 + 6e8ac7f6c9bf71917db9c0164bc9cd2d + e3d1c170dc352b1e4a4b9543398ce14e + 297409b52d6c59c43dec81ba28fdbab3 + d9690d91e16f9cbd227cae046440c3e6 + 3d4519e0b326e9f49fb7276f61507cf9 + 1a1a0cd681991a4f6482e302ec6be1eb + 5e7ceba93491ea6697e37bacd3a292dd + 70539e0d2179a2fc034e7bcad37ca497 + 217b9439cc9821ce82bc49a56ee9f08e + 3b8e7952bce728515572e18a3ef3ca50 + 647e53b5569b43cdd21a71d7b263ce9e + 86bf5692e3425e2fd2db29d8bd69d28a + 88f24428217e945de4897fb42209e0c0 + 215d8bb83bdbc02468a4ccc527febf74 + 7fceef68b007aa42728b144885b8f240 + 4ddbeaa3be16fe90af927615a096ffe3 + e7431e75a6b6f258a0f757d1bf4c32e3 + 97644492ef2191b9395e0a27d03628dd + 3afc259bd59e852acf6fa6acf328898f + 353d6df8e4ff3d84d3095a464e9ac025 + 223735262e839299b944bc97100554df + d50f74e8e57ac7b96f53575049a7805e + 74f7d806c62f5966644d61a1c528fd26 + 9d39005883fc22fc0fcf778969fa46ea + 1ed12f7c4c9c0bbd6387d551677664b0 + 65615f60570005045d83e8ffe209b951 + a9ecdc03a2e0aacd60b3cc345dd4ac45 + cfc689189b7a9c7cc77ede04df141cc7 + 75b7576a64ccef98e09284abef12b3aa + 687030566c1e2a8f1c70822e5819c53b + d1d9a8d1114326a5b796fd1969e5a656 + 78cef55b05fec83e97512822035d3933 + 921d39958c7854c07e7702b56ef92a5e + 87769bf6c75fb7b615221d774863a126 + 70c9fb5b14dde1db379220574dac2773 + 7b5094cdb4487f0a8d5bc876fefcd3a0 + 9c21d9ffc5bc254fbd650437f942587b + 3eda0fa595fe0aefc203b8d2a6385452 + 09c494a631adffe6ba080672d0eac48d + 1834064935c33d98512647364de2ba28 + c6dadc1826f19ef64270c88a91b1e977 + e0177fb0c4f030db173fea3e290a1a9f + 2330049bd84b926130b47a6cf6a90242 + 53b517bdf8f59b20039aeea7df3d269f + 3e8413b4cc8a274c03083ced62e08263 + 679ff496569b272f33886436167c7cbc + 0b5785a206cbec0e6648a311201d6cc5 + ec458a89b3b28efa33f60652cf1af5ae + 59769a21272c5b9dab7ba23ace1239f3 + 2ce29dccac5b7212793d6da1519f8567 + ef1cc1be7ba7487f4b6b327e7cf2081a + ee62f59b5dda6258b2dc681a7fb4fa45 + 731194f143fa0db91290ae91aa602666 + 8f88d5c25cf4781f9d73d84a8ff10b75 + 977a1c6447e0f17cfb460c5209465293 + d928cbaa04609ccdc8560c778a95dbad + 8310e8d30254a67b8ee3296089319ac8 + 9434da481b4de0924d528d35965e2540 + cecb6702161ad2fc8e702506ca8f13a6 + b2ac7dcc432b96561c965a06cb9e1e19 + e078f77d146de0c6cad1e3400c0dc63b + 427ec827916deee8c83886774a231c6b + d4dd9d3a7bcb9fa33ebee5eaa16bf906 + 48d987ce98952ea91ca46f22177fc109 + 4be459e5009dfa718b0b9d465467b496 + 150793c7bd5dad86e9930b51362f3e7b + 0c015b2cd4be0a2c864db88f28a00f77 + 6abef9f8cbe31caece1f258182a24575 + f0491295f3fef3a1f2c7a0f894a78073 + 1c356cc500872efbc470e5e9bcaca0ec + abce89e4c44d100ecfe9b7a3b8e663b6 + 2803be88b91a336057741950b05df199 + 7bb62961cd1d155a4f6d142a61fa4a11 + 3ccd75adbdc04f591f5dcb10fa033a0b + d1dbd24fa71864ca020f359af64e2c8c + 952c8474d34317335c327137a08d3bd4 + ede98bbe9003f0f7085bd157299ce14a + f02a8b941fe05fe6a03ad7cfdadaa350 + 4770a34e7de1f8bac5589ef8fdf61496 + 38202d25d1ede100ce7fd6e473587037 + 88441bc0f14b92c96f3b87ae159ef0ab + 294e8939e3ea08db198c2e1cdd9e6c55 + cc9d44a90d6c7f2ced4f52864a2a61b8 + c9bb9912386de4c28dcc103531199064 + 739f1e355cb0478d3a4a178eff32ec0f + 594d41d04cded901c33397881fd53651 + 96b23de6a146333e69da9902da35d58b + 30350bbd276a362cc405c555dcc85eaa + 40c20b6d8cba64bea0c26d5ee6ed6516 + 917d5b2deb3f7dceb1b837194c78a409 + cff037ae4fab06f5680e3288bdf4636f + fb986e2572bda43020d0f2352e6a6726 + 19c0d6e685ea54564813b7bc20224935 + 1e661f536847994fda6b186db6727852 + 03ceeeb3cb32b721deaef6878c560515 + a938985f09e57f2346559c4536dba82a + cc57d623a8321107963b69fcad34fc9a + f447654e05d788d8986277632a723ee8 + 996e6961e8c1231eb3249d922fd09f71 + 43ca1d85c5ebd5d7bfcd453c47d5514d + 128f1f07b6dadf5dc594c0c87832075c + cc93296fc874a7ccf2636599b1276c19 + 5426ff25a191df1ede78016e00a99b03 + 5bd14bcce3fd99316284467d2a7b9178 + 73e8285a2ccb416c1536b277b0d2136c + f8a79e8c2eefd43157f3336d16853cc2 + 765bb979b49cc8d7a309d8be2e8eb783 + 94f499bd6553487a1d6433506fc06522 + 53e151d089b5b59d2ed08c7f69a79b1d + 1b99374cf46c584ecd09bfa0f8a0ef87 + cfdf60a6e8a90a03313e3c28a335be66 + 01f3f86b8e36112fc7145742980fd065 + 3ac074b640b996987786defb526b63a5 + 09e6640aa73f824394687a6eb76b8164 + 346e671edc406d2abf689845641e39ae + 2876c6e48d5a18cf367e79939f493369 + 99facd58051123d2c5ce65e752d1a435 + a11c0b3aabd841c7b1ea5c7a8abc7b81 + c3db9d17a76c23c44214dfb8e26c4097 + c65f0a7fb5251024fa669228fba06ec9 + fb94c15cb128bd7c54005a8bbf2d9b94 + 6c0b4f541d7b4c6a0a920487cf523085 + 722483b4836eef0505f48a445c501ffd + f5a094f601100c131fa92ebb57299bea + a1def1eba30871b4e357ab439b802772 + 13fe3cd1333879fb06c7998fc0ab8d08 + a4b8ad4d24e63a72fe94a833e6ff2390 + b4841aa839440353c0a79fd26d962742 + b10504d636345d86b7f9a52d1e4cd78f + 7deb7b2fdc03e26898d8f40297127fcc + 42bc1c15f7e2c68d5965f0a534da084b + 2418d3c2239fe880cd78ded176a75d70 + da24c5f546c8ee530659b9248e41f281 + 0630d658d8e2c9c65a674937db7d206e + 46fb6196bc32ca8ad6a59f22fb9b0dfc + 9701076cc0408255c62c5a5e032006d6 + 5c9ae13a85224d77e1f23d1e749002a2 + 28b19c26e1269b8a40cc9fc2911f3e52 + cc92d05033bea84f1459a55efe10454a + 6e6a76c4abf6adda711636b4c4d6aa4d + 69e18ad511dd946a462ef00c001379c6 + 56db0a83e7b86a3b9ebcaa1df98ec41a + dd421c16bd7dd12eef570c940b4e13a8 + 1e390572c41bd23d1e7fa77682feedbd + 5a536b993fb1a6cc19fe6b2c4a29b91c + 01e7760173dce55e05bd31e9cc65a617 + 8eb2044d733f80dbc0ce7cb2cbc040e7 + af45c2d06522890602137d90195f5ead + ae35d22229d4ddef290dbd7e33210020 + fcfee3ea11294c99f4513a74fba2d3da + 27f3f5008ec11ca5a77b6da72ceff05f + dd032415b25b299bcea1a5a3ced3a6d5 + 16f96904d6bf65e63f547bd2d71118a3 + ef1d18d1d2ebfac099f8e034c60e2333 + 4a3977ef82f1b4403cde6811b86d18b0 + 99190cfddea9297ee5b589d6bfd766f0 + 10cc8d8493951a8a203bb890edd9eab7 + cb8f3c3f656a5a5cd57af92129d711bc + 30758cd6b522b7f7191fec33767a718d + 04497d105eac9e1237cd1599e3fa5f33 + 607b481d401ec0b2a50572b31bdc67e2 + f95cf25f0ba8dedbcb3c638ab45a3e01 + 8c517694786f9aabf64468b0b25bddec + 578e7141cccda7072c83ea437517cdac + a6c74b69da7c29ae157af7168987b276 + c958feb175265e01949165d1f3013c3c + 815cdf11f237ba49ed0ef6c56e6719f9 + feb8d803d22bbe6dd53e790c7947b393 + c263ba476a78673f8d349f4eee9e389f + dacf41335ad4733151a6bff17e932d45 + 9e26bc0f377a39e2d72ba7b4340c09ba + 5ab81128d7d3cd06c472d0ba5ec98664 + 1fda67b09959964f041e707712282570 + 3d6013f44002bc42861e3e4f47b7b294 + 65e6ba07636c129c3386cbdd97b8a5fb + 8480dfe1dfa3484f3f5556247b1c80fa + 4df0848db2f42aa4110294d7df97f6d6 + 20305729a14906ab1871b0069f3a6a47 + 1bd0cfe8113a970cc5df0ce56b674a57 + 68933caa295bdc92686dabe3028868fd + 7700553df5ab2bf7c5bec5a93b926219 + 800cf483953728ea0f5c0f42b93efeec + 2997c358367da6c44db2bad591740f86 + 2af96995e2209c3a858c78f84c8827ac + 7ecff64384cb651f62d21689cb0494b2 + 356061ee710b98c24b4239034e37d05b + fdd92c2e2c268d579ab70823042960f9 + 7273817a22b9bf10184e869c601c5093 + 5d8af62cb9d297b43f4d7e75d9a48ca2 + cf67fb5d87e43c8de3d188f1edbe6311 + 226267105529bf8296abf22bfd556c8b + 91a066ff63da1d589f4123be0f169bea + 976fa6157aec840094af213b2dc28358 + dd0bff14b388db585f2e7e25750bb365 + 1d7431980650a931705598a597f6343e + 527727052e8546b4aa92af103a44ce3c + 4633ae313caf8c295b922682139d2575 + d4d9cb98676ee76b4a81f056088ae3b6 + 3e6b6342e776d6da150da0330bda6222 + 861347a3dbca925a94d000f11c3d4f56 + 8d9ad1c1efc78e33ed74055bdb86cf5d + 824e90f2fb2c891d5c79a7c423ab676e + 5e894c68b6a6a06dfb9bf153b2669e1a + cc22349318d4fc9e042619384226aedc + 69ff9c0a89d6e0fe04467a168a27fb04 + d025df8661b5b9b71a89949db9acf0d4 + 7b91701df1a3e323427c742ac5f1bc14 + a0de1489ad8c76d284c2b49c27eedceb + 3af82c75af9c71aa54c5bf0ac2e5f873 + d4d63181831d4c2bd00d15b86218ab98 + ccc0330940f143a9939b379374415ecf + 9f6335bd0a130ceda07b1287f83dcf29 + e755118d6b4b33fc2743699006fc4b85 + e73bede1b2cbe7ae3d44f3b4f50c68c2 + e98afb49370eb708d809b75ba64d1113 + 0ffe604fe1ee7db2d40e00a00f3141e9 + 4449dc1a38bbdcac0f296e9471e32585 + f17b6c932bcdcfa16b0fa2c02792e059 + 675e5e9733bb537e650f93ad64c97063 + 9de297abbbab1089e6a7a44f5078964a + 96c8bb96af9f79f253e53aee3542289b + 0da20d0918624805cb8195874f1ce4c9 + 365f628ba07a6be85b5d5606d95f2bf1 + 179176d637d530982ff4bae58d98eb80 + 0b6318d3cc1d0dd36fdb7617c42cc58e + 16722ce8d20e87bd82281b024a7a155e + 59838fec149e89e35183fd3fabbdb8bc + 31fdc36265d24f794c3de3229207b755 + d02b4be5e9e11ed0895e21013fa9141e + 00712cbde3f5bf8c64041ffa3e7f1421 + b4224b85bc831f9b84861b82a94ec5ed + 66ad911f4f4cf67b365b43598d3a604f + 16bf48419aa861eaa7f6406898620144 + 5f5160122c7c1dc2c3f1259bfada977c + 5b198f47bd7d0461cb527b7f84ee7c3e + 877237fe7b59cbceac70e4294c0d1849 + 7d8b26fe4114ddd13f2af93401d2d576 + 7c38a670e5bcd33a0804279e691f4bdb + ec1e55e0406988abfba830857c84509a + 2375975b28dab3291557107ccdb585eb + 01453aefbb8739a203097b754cc8b9c5 + df243301f79bccaa3b96d5b29bf6e32d + 08e400566810b633f35bcf9d29153d07 + f02834fc751afed5bde61027ad7529b3 + 35a055280b9a7631543df72e8a9e7a14 + 7f9928c1b0fe0c468f4f823e2bd4c31c + d6dead58dc92ef3040bb4cd421c94c09 + 141ba52bda84bdc494c83d12f203a24e + 53c399fb66cd05cc6c3453dca01bf744 + af7ccabcfe15e89308c4d5c5925a855c + b17637df220dc12c90f4994e047809d3 + 4f8dc07025fe0b0ecbc60e4525bbff78 + 90c286db26b5f3c4d319965c797cf7fb + 44970e6f3834538fc33a3f7ba621014a + 9b49233ea789c0786d323c8ff675ada0 + 081c99e418e122544b48cc63b83f6d2b + f1a7dc33e9c60e20f5a4455f599a8c43 + f8b08caeeb7413ae89509eba1af0a072 + ceac6ceb6aec14f8a05903ce8c61e88a + 1b17914b6ad475c178cc984c3c588070 + 6b2f6c35239b65b2f62c49d5b5671986 + 06c7cb93a5188ce6e52e094f428f9498 + 01a2cbb12ebc3442f3beb388079c1e6e + 3d5b35f975d18bc890e1fadffba0933d + 93ef64ec61180b318a3388ea1d5698cd + 5092cc640908341d45572f88b61a54dc + 370310efe2f528a1d46f80c32bd79a8f + 1a6650ce3adebb229b66b40f7e5c6a2a + aa6bdc6e8e596c8514c62615b680abd9 + d0544550bacd393abea1c9b1516d432e + 9f6ad839730b33866c636d82fcc3b01e + f8bd087e57a50f0aee3bf18cf1e28b8e + 1fae665c821c564bf536c36bf0a55084 + 93991770bf7cd9a184d7cd5685c7d196 + fde5ca61756d4db8e5bec49d2360fcf0 + fca6a41c3f6591f499b0ad0c7c3b2e6e + 35fdf64559928c1d3c50b3a6f1a7e2fa + b7988b61d946490b8f9b536b804da408 + 61e994ee211a869701f819b89e3d8b74 + bccc8eaa3c42cdb175ea7c61a87e1cf0 + 8787b00e4c7fcb03ec6f9858e4dff2a8 + e1b07de1f5866abbc572efb96b503ea6 + 354da1dfa57a3788c157f77c5525c534 + c1106dfb7d15da715c0f1dd0f141570a + c1c827d913cc5046d525dc63fda4a73a + e6d4cf44a544f9f8642a30acd3fad26c + e642ddedac786d06e782be677dd5fb29 + 8583fffb9f2fb68f6f22a8718b19e3d5 + 87c1251f30ccb3b55484903bbb07d8fc + ed7612ad97bcc30af0a0d83f902cff52 + c3ce2c38d82e8625ded24263d99e44e9 + d172094d17bb06d80bdbbc43c879536f + c8f7e838c3ad4b6c745370f7fde9a80d + 95ceb6474830d9f21cebc78438eab621 + 4277775b28e2aeb559b10e1dec15faaa + 2d310407a79c089b70a09ccdeb5ae898 + 95243a0c7cff8a6e91c4818e926b8046 + 71c7b861e41b2fff74f8da9404beba3f + c7910c137f7ad04f09f2ca9d4c5f2e1c + 44a1714f4c31c290f7fe0e31a20bbe32 + f5ebc7c1f8fc606de01b883a4d44fadf + fe5f0cc85ef8edae7f649214bc7d7713 + 3d28f56160501b5d891f06749109b9d2 + ac5cc05e4816b27643175767024c4c1c + 0b27d637d0ec75255ce5652e4d198238 + 0d074b4cf73760db729b51101a0d9ecc + 646371b06ed8744e19ab9275cab0b577 + e6ce290c23c86970ace06f1177e0570c + fb8f045ce3a54db0890b313a6508762f + 3a768ebd47b78b38e2b253b4ae177518 + 6192769d60d61fd385283b98ae59d5ef + 5d885251d8555e60639026cf9d7ca7d2 + c37d56f689b33dc75f9d86755c219807 + ad7a558833d553a93f537e1d924668ce + ed0446adb1bcebcba479b2cae2a49be9 + e872651fea185fbc4716662395960714 + e6c9ec9afc4f164558126c27597c24cb + c1ab41a2eea8b93ccddf5d27224c8d05 + 18014e4d442b6dd48639385e50d45cad + 1e2c1110514c7720a1f59d73b97308bc + 9e391ca63bdfae41d2a2f6f9cb6d54b8 + a5023b392384c0e85519a3d1f28360ae + d252ca1d6eb02aba7dc6eff9d4b7c078 + c13a1d98e6711abd09f8914818cc43b7 + 83de5ccab337c2510102d2a16cefe3d7 + 180b4581088936f293cca01fda6209e0 + 29f21b95b89c4b9fc46c1ef4c334ebbc + 2dbe9cf00744c0139b68fa6bcb7472f7 + dd70caf183777476cc15417b33050706 + 40d5ceea67e35b9a1e730ad1bbc8250e + 0258360913748f034e4af7abf3874e31 + e44ec50ae19d5a9672bafcec9129bab9 + ab55ab412e5c07e495158ef23d2c6858 + 2b84220782a2a72caf9a84326f17eedd + 13d85de10911f7c01ed31ef0e5616349 + 24cfbc7596158a956ee06eaf83c38579 + 1034947062dd764a4f2d1160aa21c3f3 + d7697ca9a20ad34a255ec0f643801550 + be2df1769dcd8ac7d8036f3d72ab7fae + 22394a47d254e898a1d408c9da0b9a44 + 31a44a6077d89c00d62e52b3f414d456 + 28c889cbaae23c3623b7c0e0a1f24f66 + ade01f1d29d250ee7a27aafe29594b9a + 7c9f15e23dd0fa14c732e47dbf82abf0 + 1858b90433d2aeb8dd80ed5bd64bf476 + 1704621ca94945889631595cf49cf500 + b8a3ff02d0fd9df56a410ce4cd7024e3 + beae0d418703cba5dc0a15748329f90f + ccef55b69d3991539813cf601f5f0954 + fd419b580001d9695528a840bdf2a8d2 + f7055851ad531dd925f2fbd5d5021ef3 + 317aab01b35cde2338baecaaa1d0e497 + 6795f88df7359fc820a360593138b6dd + 14c92dfcc16ae30b7384ee71c04680c8 + 4d52ca68e9e242552fb732b10b9d7695 + 32d6b7a7946430cf53f72225e9c99ead + 0c4de20a736e24e9bf7dc429b435ee3b + 48dd2b9b370dd99c0a2db8eb544d1c57 + 5e028b19fafc611fbb20151221ab9c1f + 677649c2a16fd50271fcde0374ffb47a + 8ca00119f250bb282a43ef0d2010eb1e + 78efcf41b8216b29ed25b4cbd9e54501 + f8d6cadc06e539ef72de0d10ce1e39cf + 7be3447a376c19916c1c4204c311a44e + 841b3633bebc73cb515c1ee42a91a824 + 531d5278a308eac3159f8d41826298c3 + 73b296d1740d68ebc3e5b5d7ce8e8a65 + addd7270c8e3105a1b9feaf28de79694 + b4a08c012e7d1cb21b02420b0dff98bd + 094d0226c4bb2b6e854106094bdb941d + ea1f3ea44b1665d38bf7d5bd7a6a113c + 11dbbd36cc7961dfa306d583c127c266 + 15ba93b0f6a7d5081777199e6ab466c6 + 629a7f92da49aba5bac2854fd77cc9ff + ffdcc6d27ae10ea5e4ca97ebc33e43da + 497ce8966f962331f802bc23e2ed7f2b + bb58d7962e250eb73dcd1006a54f6b74 + 891262a823ed5de31066bf7e92da84ce + c89dfcfdab4a5ecc1adc9be69d07a2d9 + bbff5b2be87d95dd29e851ced78a1e9f + 1aef7583beebae1ffcbfd474d5cee3a6 + 4e2084660542df417744dfdef028ae84 + 55702395fd950748a2f70e062ff0d4de + 239b74b03f3903c365982de455b23854 + faf8deb13625b9c762d9365f7093d61e + 0f4cb22b0d223c0a35f77784921bf0dc + e4ec7468a1ce29852841310bdf4ab407 + f8952018344751f38d2d780fe8ac9731 + 853938172825649e08fde9e06e6e342c + 1954eb3ce48cd94ef3b65b5cf943b0f8 + fc7ba81004fc2ad37787dc4478e8cabc + fa3657af4cd843c107e2eb9794c2465d + 877d28305d4bd649bc78b10184a93dd1 + 2da5b148a83d4b4a944452c9c20dfa83 + 0163e92dc702ce678e1a1902a4fcdf87 + 4f5070cc0639fe7768db61e48df0e18f + b65f4fafab04ddb5c56cd76d4f99a222 + c09a5168c7f9096ead8b519a3c667355 + 6a66fdc653ea8d3056e131ea4d7ad25d + 2530ecc1a6f5b449d02ae60a50315434 + 499eb262022ad480beec0a4d28b02b0b + 454fcde9473cfbdfe5a4b2c03c0c6434 + 99b559df5d674fb110ce4f746b9c1c7b + 20c59af8bfa316cc7ad563b926206a08 + 6433830bda7b33af9a53c2e16f967005 + cf081111f9c80bf3a67d84e24fd20725 + ea25e6150d620090aa180a0d99b97a66 + 95b90422d7cc658ced4f81b7d3ea26ba + d9ac0d4cf01f888654bb11d38a3051f9 + bc69924562e9183fc603c8a054bc34dd + e415d1e2c8e981bf3d9b09950cf24b3e + 6ea7bb5f663391f13c025f00aff4d6be + 0b37f670f373f529225ffc70e3a0e533 + e4daa3697d7e6a19c73d6faaf488135a + 73918524e2542ee157b009d0c07f0945 + 85960a7259b9c77def6fe2cbc21481af + 51da26d961fb8f5bb514cbc2684b5cb5 + ff3d3780537501c519d375a908b47560 + 8f79852e4a973704212c4dc6b84fab34 + cd16f7b4efc5a4a9d96e95923a3917fe + b783e8f6158290568b7c028f4b75540b + 20e5a07c89771e0fa574f2902ed604c2 + a5fd4e25ed872cc770d6c6b0aa16f686 + c1d2663bbb7ffe2e2a9e0fbc54f915a7 + 783bdc13088e22ddf2ab4f3e64a60a71 + 99662260a23318e480cd04c56d5d84f7 + 38f357d77cfa241237c43c59490a06f5 + f268853b0b1314f441e6246573c50e65 + 14e16d79fe716cf1745f3207461f2875 + 9cb1a99fe7cca75db79f7a3f4c284470 + 270c8403f82791441f7f74c03aad18a1 + 53a36cd82a4cdbed7aa55c780742444a + 1fa80dd3acd8717e9d82d1bf65708d68 + 44ad45843a9aefe22e6d4de18413e114 + b7b79858f3810f96701d8b8e6dbaf45e + ff7b830ce4f8030d13feb231a43b2b43 + a2a4514c12741d909700df892487757f + 4448fac07d78cc43832f11bc27f80629 + eaf416ea33cd206b1580530aff400b00 + 411dfe47fc178b37449a2fce65a65cdb + 49469d49fcb9f80f851e69e0757b70a2 + 30918c2573e524a932b3172d95d04954 + 0aaabacd930e78eb6142a2a7ec491f7c + 4f45e5c406cd851dda842aec3d462481 + 926a4fc805ec01c2307d84957983dd7f + be79823f57e0a825e385b25cf05b529c + 5a85dbd190da043155eee02ed67a2c22 + a71c3578bd233d5a256a3c5bdde3dc41 + 5cabfe0fec4270821ac3be815a7e50ea + e2b9f4ac25d16e08f07b4a9f27886b9f + 1d3b713f9a153ee57801a54a314859ff + 187b9d55ecd25328659e0cadf229ed85 + + + 6522bb7b51a57dd9df1b937c8c848928 + 7e0847c521285435b595415c63bf511f + b5e1db46ec17f6388a78fbdb3d02ccd1 + 79a723f7513d27de558e266c3ab7218b + b0522b22de4b08d5f8dec44daeeae44a + 0e81a23ed5c932e9efbea008b26044ac + ac119697176d0c65be29687ff971e383 + 76550d22b20ac83d7b9b16ee84a7290b + 12389ea877158c256e8756721ea714f2 + ca848d886f735572b9049e4343416d31 + b531fe15d5a9fb2a381c8f917f9466c0 + 35cd4d984ae36624f8820f1a57b776da + a36aec48d8af005c7e101936897d70d5 + b4904a7e21aa2bbb0752061977eef6da + dbe983a124df5b2d0b8ca548f9fa160c + 8021d60c72babb7d89c2a1b45705cd92 + 6f854b50981dfe56b02702b978072d8e + 3c1cb2e89d5ab7f82c7d8a322757b646 + d3ff262bba0fe2951090bbc80a968a07 + 41ed3eb8fca6e0578e00ca05b98cc75d + + + 471b4784d44a5e6ce12bb1b68d4f9efe + 3b83ef96387f14655fc854ddc3c6bd57 + 08a382deda13e6fc40ad1ab453f14fdb + + + 9f19857f5af8a1cd7cef4935443df1b6 + 47c0199e238f8fa4673f5e3ad5377d6d + 50b5939aebcdef0c808a40fc42cd1c0b + b98d8bf36a2b1c9b972e0bd40929fef0 + ce9eed008266249a92dd85e53ffa111a + b02eb1f435037f2788635a071e171072 + cdb66558b2481baf4f49225229daec0f + eacdc3237b244bc34a19559d80d7be08 + 16496de631cd1649f749dfff4c982c5f + 39001d3a4b379acde4d215de187a4d61 + 9d5dc320eda8e10a7d77b9858de91a1f + d5321890954ceacccd6ef8f0cf5d28de + 26ea39faff95f439728bedb17eb0d779 + 37b3e19fec9b9c6220e4d6847754e2ce + d582ec7b0d250d2d6beaac98489e1b58 + 5c14862d5f4a7222b82f1e7c39068aed + ffbd6b89996fabb27c7df1a234d8123f + 3476a6d899e677db4e82f85539a3f6ad + cac3475a54c04ebb702fad17667c9757 + a080124d04a1f7cf5b69847048eb3d01 + 5119565d69cd68fae2e2a709363f8754 + 87b4a149d7a267b55e462206988e8183 + 0b5c66cefb34a2977ad50da990c39a3a + 5238cfd4753671195a832ad1566f260f + 2b5767ce1baabc142cf18c8a4f13c98f + 63e6740f59c5ebcf8871ed1738352dbb + 74aed87ceea11c9e816db28010ea7e58 + f85d03a66fccf751a9c4f38f7069257e + fe26012fe149e9aaf735d57b7d42117e + 872227e53f710448a27c0c9dc0e65058 + 57cbdacc97b87406349d463d2559c088 + b6f51b07440c8c1cea0dd49df7318a02 + 0711698583b850e44225382dc8afbfc5 + 9ad80fbc6671ff1f07fa141b5c6c52fe + 7509cbb3a6b4bbc762d8afc40d7ec295 + 7fd99cb94d0a4216ff808c78cd585459 + 0304dd50fcae5bf13bc36eb0c998a719 + 91d3918e0707f14cc8b0fd6baea898d6 + a4c1253cfd55b65e977942d50a4e6f4b + f88fcc5b0c3ebe930431075e1ff09dbd + 83b0b523abb75f6cf76aa098f0e6dc60 + ebdfcf72be0c34ca66ec8af09e9c9bdd + 2ae1c3b0223625804181ece6a352b513 + 54280c875f20d8ed68b89a4e7df2e642 + d15fb548883003670a499d91a0eb0e27 + 41c9002ab622ac49e0c437233e8f9794 + 6cf9a9f79e9e7da9199bfb1e3dd97c9c + f991f4924ce26117ad78262719a8b378 + aabb3ff342d9e59d6a9bb9d4eb83d1fa + dce4fee36394919516d1f81b14495d9a + 06a9d9c706aebea8cdba385e1927ebb0 + 95590725f99a1cc3f41bbe9ae940a341 + a707c0cb347aaa75fb75ffcd41cb824f + 8790a823466a72e2c2b8c5854f7671f6 + dea9c2fa9337cfab269d8bb7b09cac6b + 1564e61f5c17661b5b3456a3e8fb7bd8 + d87e0f68bb2b659c239d2aca8ab6b36d + 65ed04de50d9386d9d2fa3bf8ab43489 + 2bcfd547fb684ea3bb28022a3dca5fea + b8a967a35669a4936c7a4c259950b229 + 0685072fd8be441876123a04d9c0ae61 + c37eaadb2dfdceee09ee620f190bd5dd + e24f607a5f71461fef3eed412e2c966f + 43b7eec5cb2b6d72b93c95be7e017bc6 + a3a67f55d5a22cf4d142a6b3779de99f + 1d6bcefda50c96685bdc52f5f452cfb7 + a6c9379931e0aee07218de3b7fdd67e5 + 010e535573c7db98b6ffc90adde74b2a + 1a46b2c38dc4f44d901db122f0fb63c7 + 9625eb0cf1d0596d09c808d5d447c944 + 02af3635b39e4cd5ea7b3332492a4f03 + b65c8f5d2f49fde15c44ee9c437d3ee7 + 94d6c8105aaf10d7b322408b5e207104 + 6b8f53d50fefc783778b349f592737a5 + 775c445866c5276240c00dc8f56ed231 + b00f237dea77aa77458740278eb1ce58 + 5d3f64ce28019e71ba14ebbb2735dde6 + ff6613571842cebf868d8acefeba2c82 + 38f9ef74bf5e3964cc4b1103756a71be + e2a91ee578bbddc029ad5f00039c9de5 + 1ee2c3fe054dff95148bf67e2869ebf0 + ec0c8b9dee7cbeb88c27b1bc6298ef01 + 1bea8f3d6d7e46d8fc8c5dbf4cc62b2b + 1c51c54475dd51b9504c77185eba0db8 + 6dab50ff8bd63e53d73a4fd3bbf39561 + faff587ca6205e3cee66e19fa4cf2c00 + b6f8ee688afbca20a089b793913cf2dd + d6e8541794e9cc10c4cd6c30f56f11af + 0b0b8f49582c37c5bc4530a208f16118 + b38fc40c5247a8cdc6a141e442b05e04 + dd82d0c33ad2f7d58285b683479b9193 + 39b57354ff403a04f99e348802b47cfd + a8809c8c9749533924abb9a544f7f98b + 3b98e7b96261843cd752c96a0dc5105d + 50840e8cdbf7a11c26f9649f05275be4 + 6cfa86e6030298286ae9232997c54944 + + + 5119565d69cd68fae2e2a709363f8754 + + c84d2c7d294f71eadfb4cc734bcaa7ed + 2e6c7bf7e1a10708a77343d968cdb209 + 875a7081c53cbc0e8adb77513a5ae8a1 + 94659c79d9bf8275afb64b62332fb70d + 3166e718ecfe5b9d7cf63257ca5fc03e + 18ef2854865ae52bf5c410a0978ba3c6 + + + 5119565d69cd68fae2e2a709363f8754 + + + db03be1110356deff94abaa42f9fe760 + ad49804b015e37374e9edeb19c19c9a2 + 2b63fedc94e53b7320d1b2e426fc71a3 + 9fd599b291909bb2ae8e918d74887889 + 946d6033c01c0ab01e64ac272021aa70 + 585379a714d4034f260ac49e9543e84d + b428a6f259d2510d99b5429e7af62e4f + 68be12f68a25352b9adc2db3aa295038 + bd94b28557e70fe79d6c4eeb002aacd3 + d544268714d5283aa98493aa8ff95517 + 0e13d51f0feb575cfb07128b28fbc799 + c4ef9f1999aaa5e820246dde35231b6b + 3afb59145234598f36baf517d3466450 + b307c5c562f06b9be647e3572796130f + ab31c5a9f248de246415bb52449d63f5 + 8570d3063daa65dbf3b5cfc21a4205ab + 1983cbf6307604e98cb48526ef4024c0 + 118cda167109f78c11ab19b550e8c415 + bca657faef2d740c02215c0711f1094c + 1ce5d8f3ed815e408bc46b03694e9d5e + b332277c69e43e4d180858752bfe5cfd + 5aa06139cfef79f3d6347e55837e066f + c7092f6cf4f3b9efb48f6913bd312560 + 38aec75b738ac1eed6e0cfb299a5b117 + d60619274f89eb47896cf976febc555f + b2be5742a5189bf33bf11d0ce3c0cd66 + 47a003f29c413edf0530db2c8c1f9f6e + 7c8c76c94c6de3ea8b79a4123bdb8d97 + 39884887b44508af3e1923ecf1ad3ff1 + e5dad6451bb5274f159ece25f81db377 + bdc3d70d6b8ab1b0824bc93d2ccd7509 + c2459203bb2de5d7edae6a82450f78ed + 0cf68cf0f71d933deac3a302653466e6 + acd966c3ac9955db477ccbdd2e2e4e20 + + + 8d6cd8236b441d23d2b386715fc5de84 + 3ecfd7a942b08f5b146aec3c276495a5 + + + b5f0ceca7e2b1e571da9895e534f917d + a7b1a02983f0ff3cf4fc49e755eccc00 + 28baff0eb33809b9ff72b7e68184c4dd + 27b97e73482b47876c1910761f11a873 + + + + 2e7017e7509f45f7e7e15233e669d0d6 + 10a48e0b8be5c77078f999451c7a4db9 + 06524ac7cfbc7c30124819262e0c3a9c + 89c7d5a4c69e1a22c2d6c0c6f42af33f + e5dad6451bb5274f159ece25f81db377 + e02e49808044abc71db81d22803a519d + + + 481a436deb1bb9242628dffd010ff023 + 3b1d36db9c1f4147eff24d8a61c7583f + 5c9212b85d986f24fbab5230486c42fc + + + fdc07feb74abec694a5542de11b32720 + d6c6692bcfb6113213f7ccc118bf7b5d + 35207c7b79b4af038ddfe6bba46be76d + 887af8311926a7887b75b3ea45de0e8c + + + f00730d1dc37bd8c72503c7b4c792814 + 8edb9100e677e6c8d72ac0bf4baff089 + 794e6c57843b53e5f0f5367a74f78244 + + + + + + 7e429830059755d1d4809b07a305d02f + 20c7fa158fd900547e04b56e0fa71060 + 171b3d0524b1b7e6a2d403a360077c48 + 90e35eafb7a298c61adcd50957dc4ee6 + 0e9648c0eeebebf936ce85348e45e6ac + 988ec2d46e33d598e78f4e91027872ef + 2be85c39d0199612eeeed7f75f66a4a5 + 7937bb92ca916bab36936a0d22c27f05 + c9e071626740801bb944a30cd0ca2fcd + 95dd169c64bb5a81b23ce35c031a655a + 5543cdc3a757a1eff4098ae637932c2a + 817d413e097ee17cece0bef4af8514ea + 21b09859a3cf89bc5104518f543f080c + 4d24825142e64bfbe8d2ee195ad9869e + 475570e089f187298c66d520fed33e71 + 6328bc10b12f56ad839e97e2818ec1dd + 027e1d0721aed11b2ca0451055e298a6 + 4af5ff9b3e06ab36f444a92b43948a43 + 0befb6e8d4d2c3d4b22bc7ab5ad2ef39 + 5260c92032c58b8b6be0596d58d13264 + c94c08edecd15dbe59a0f052391d1aa2 + 2ab7621f59a64404dcbda55e2102a28d + 4cbeb988fe786a369540b98e9e5fc0bb + dd6584c6034493e16ced900aa4f41938 + d662fe24f097ee60537dcdc4d4918af5 + a239ffa08c9b479e2010edd2c623e9bf + a29ccebf5a8f8cbd270bb1bb7f8d5054 + 0d0cd78e7a35eeaa2cca484e6802ce98 + d7035be7dd194f46a7c5aa27098152dc + 2e60ba0fbca861002621209a3f053a8a + 85324dc530e6601f5e981ef39a9406d0 + 25b3b6c69993749d4d469e50824382e0 + 889191a807572f11492d4a94bc20d47d + 428382a7c081381c26cda8d8ff313d91 + + + 2e0d724c251b79db29ef8af8bc357ec1 + 0298208e968170c09d74bf6d732ff806 + d52074395d69c16da2b79538d402be7d + + + af07d873c0fc0efa153e139887e23481 + a8c87db6c7664a1fb76a805b2df48b51 + 705984d9536e2b3db46052959f72d43e + 231a49c295206fe1bfb9bfcc1ac92211 + + + + 592009f27d1f3967b8dea305245f51fa + 24d71d367f727c73968a25b990a1bb07 + 6d2bdeac23c7af299b1ea80bd3959e18 + d929b167d163f49995067c82763befa0 + + + 2afe4e4e82fe48e140779c408ebce23b + d1d7b11b1cae794b7826cf2737fffa1e + b9f336ccf12eed875574d1033fd7638a + 9f976430a601e89bef0e07d2b0205867 + 4af224eda04b04023f30c016fde94bed + fe45cca5a199c561eacc3784cff793c0 + + + 249eb340582bdeb3fb1f3d7d63164946 + 84a9cf70a1036971abf41ce70f23ac34 + 97d1c0234fb75f1c7469c6e3d58b38ff + + + 4d1460ecb3270f0e856de501cc82a3bb + cf68048b516d08a1f976c05365c107cf + 7bfa87e5acea093aef72fcd3a9fe922d + 057fe1bbc79e02f22a25ddf662404c73 + + + 9cdf7e1b5127ea50ecc286ba9fb6a793 + f2e1f7c255c2716cbe1b6b706abef285 + 07c5c84100b690d3dba9856024b88186 + + + + 9bfe6a0b4dfd0be3d061541f455ad0ea + + 3b98e7b96261843cd752c96a0dc5105d + + + + 7d337236d98c1c1dafee5d2ce24bcf87 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 712f7bfab52c089d2a05a4ce6d27686a + 4215c1ddb6c11834fe414b70ecc76eb3 + 3f9ea9ee9d9745ec9f620057c95950f6 + 02ec2dc56fe2dfb57779a0214e014d49 + 84375e35740b8dd4c65c85d8555d39d4 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + 0c21b6a35cc64d9d3fbb4c771e2ac75b + be3d69f950647224845e4c54f6a91b67 + + + + 4215c1ddb6c11834fe414b70ecc76eb3 + ad9015f812fbf836d997a97c26982549 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + 5b02264131f287d8739b46118e2e9c5a + + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + ea6b650419635d4c4935c0e4e84b85f2 + eea3eabe7cd6c6d7265a27ec3a525d7f + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + efea2a14e0dec0bd8449368be97ab3cf + bceaef8a6b4b064ba7135ed0984fc439 + eb83a2211badd3775ba91844d48cffa9 + 6b6ede8ff81adf5b38e3a466fd06ad39 + 2020b558cc09d52866870ed7042ad380 + 5a9baae0e6f3a24bc353380849d0a840 + + + d192308a843f6105cd178360730abe5e + + 4215c1ddb6c11834fe414b70ecc76eb3 + acef0a34612394d60a82f225f9dada5b + 274a1076a070fabd165b56d0c913622c + e8de275f8f7c15b554e3f4dcb3ac9ef6 + 38f3875e4774fe6da2e0ee346092084f + 516db20ea1b1e76fefb6a97b47d0a35e + + + 90b7b6ce1cd70e7800e65c1402e5bc33 + 6f3257f951ac8c0615cc3bd94227c64b + 4215c1ddb6c11834fe414b70ecc76eb3 + 11e36abb8c92c2e2ceed1d8e3ba8d9ae + c9ca8b5c3bbb958b5676522d61c36138 + a13f2fc2922183d7ab5aa6bdc1eca15e + 22303deb28db6747c13ec827ef9dbfbe + 5a6823a9a87f6d67cd9601b3e64057f7 + a6f0eab52648ce23c55fc6db5edd8f66 + f45c9fcb35248f239c32fe2be216efda + 9a0cc45bdd8a4d5fd8e6e38efe04ebd8 + 060161c61b7fc463d36d23110e58c838 + 3847818b7ff7cc689d815a4169bcf2ed + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + + + 878e43d2c40a6cc46049fb4e60a381d8 + b956234481d87a3990578e543fa3f197 + 89dd12a1dbe631346b45cfafe1c5e59b + 4215c1ddb6c11834fe414b70ecc76eb3 + 101dd5fd105abc9a126d46700acfdc10 + 29c1cedd1e40f854683ba92f6df48134 + c6970250fb470be5623f29a97ffaeff6 + 83a65d8e16dd0741c6036c9694f4f524 + 23adeef5f62fecad50e3bc67569b5f2a + f131a23f8800bd27a6e3febb09d1466f + da422717925755b3e5f25fe5c80c595c + ae71e2b37435fd303915366cec729224 + 707ad450cb26c8718b4e24b7ca19e085 + f336b463ff89e355cd6eed8be0af1e77 + + + e5da7c33b59021d8baa20a026cd0982f + 4215c1ddb6c11834fe414b70ecc76eb3 + afeeaa22a47a62a887a2481dc6777dee + 4c831d4d4d8696fafe40066846f18744 + e1b194361d3580cf14fb6dfb94a413f6 + 9fa68073346886e8db61c0aea29d034e + 482342b22f9a2531f7b13a8fdbaa4c87 + 938c6a3cbf3b2838cade9288563d263d + 9c20249762092267cfe5b23b227b076c + ebd40d34c6ff1a70205fdd3573e50513 + 70a90745714af7c28a4564e41adafa24 + 6c61957ed63cc347ca7c394667cf6b89 + e2054710350486e8156c6fe2d5769faf + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 10e42ec96c61cf17d9bfc07b717a968c + 4215c1ddb6c11834fe414b70ecc76eb3 + f93412fccb63bc31d743cbabd9a66b7d + e740738b599d8d1cb502be380b93edc2 + d3bfe0575ef5b60d77131370fb18afa2 + 59d134074064fb3ad276a340e8b68d98 + f96430032867625d05899a52fd051ced + 9f9d95915002c036285cd14c45f57bd2 + df957a068012341416ecaf1d44edce0b + a773e602ac10bcd90e3894ac8a5afb02 + 32ab8bf9142bb3c5c66c365c1d6108c7 + b201f557c720dccc01b50eff776a70a0 + be0c24472038ae00092f676d3c97f7a9 + + + d48350939b84e49b47ed7fb0d6f62d85 + 450c65041cdef8897dbd453b07f33723 + 4215c1ddb6c11834fe414b70ecc76eb3 + 07cdd014c3113b855f4b61351a917929 + fdb5c8637b8ea510165ee8b6c6c754ef + 91e824756a10fb7b5cc7f1dd492204a4 + de1ae1995961b8713b0ddb6263415b6f + 8bd9a5d01eb1cd46f3e52886bdb52b0a + 3e1cfa2098493b6940091d47fb89f85a + ae33903a9dfb7dbea740e18a05c28426 + 30125e41da50d21b902cecfc48a7ed99 + e668666e7f47c83c0528f1cbf79dbd66 + 9588a01205e42d4ddfbc4cfde7c2034b + + + 8c0d71e03bf2078f2ab0800121eecabb + 6261ba7f2f5c120d97a3bac3f1288e68 + 4215c1ddb6c11834fe414b70ecc76eb3 + e0bd63a5ffbee68a2e1a0d9a876537f9 + 890811676c2eb46d24536ef7a416ba42 + c0c1dad08cd7e0f6addf764d39c564e0 + 4c84fa7f200ddb8fce3024588b9d9aa9 + fc6889ecfbf75bb8ea0d2cd1a0c1ad05 + fd1b12ba0b7ec12b06027d373951b5b8 + 5f6db38019eb2e2d553ddf0d1f8081d2 + dbc99dcca0da6d317be7566ad637fc8f + 212ab97ebce1ecf7f2d0b4e4190f0bc4 + 91b84915ec768248cf58ee643398ce12 + + + c7ccffa11bca23bcac6f4c16012ea42d + 9fd8e35e3e0d74d8101e69c70628297e + df56361441058537eacec7c5e5a21fd0 + 410730ff17d2f30af199ef8e7d9bd307 + 4215c1ddb6c11834fe414b70ecc76eb3 + e79985a27fcf414358f33f36765f0584 + a57c1bd6a0ccca57f09c130313f7b7b8 + 2262a2b9532e1044216e20f5cdb9cd7a + 20ea9dd2eddf736687c873385adc663a + a95145588348c230969006e0c1a86950 + fc65c7dd16d2dfd6ed17cf5ac5e62794 + 99702346e9fd267e9f392e34902d6833 + 22dcfc894e11d72602888c2909c5a3e1 + + ecd3d26659f3b8939b3706db19bfdfdd + de1ae1995961b8713b0ddb6263415b6f + e740738b599d8d1cb502be380b93edc2 + f93412fccb63bc31d743cbabd9a66b7d + + 94f0e97428cd3539a979eeb90eacbba1 + 93eae6aaee9d3f19744894d10f087923 + 4215c1ddb6c11834fe414b70ecc76eb3 + 04f26d24594f5befdfacafa204a0a833 + 5a70dea9a19eef9d38884c6ff3dc4bce + 396a2e63f47db6d59ebd1c4c784eb00d + 481c2bf9358dbe35895d9ea8f26c5c7e + 8f94a008f95fd8a0235b0cf37b1b6592 + cf17c21eec7cc8c727502a87cd6f2e56 + b28abcba15c1894c7f2d63a67259b5a0 + f3ecf2a0ccd02563e1e4d11eab1fd072 + 4ab417cd122991b38e9168306d76a288 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + c9079e070cb9278cc7cfe750caddac44 + 0e69eab6dd8e9535d56342e69f2ed0a1 + 4215c1ddb6c11834fe414b70ecc76eb3 + f3543e8970d65b44905504ff3c88f87f + be8980933edab6dbd561f251528dfdc5 + 3fe2e080ecd9186e70f729147ebf682f + 904967a0927686fff7e17d371cf71179 + a1d76138db2b989ecb35231d45e45a36 + 29672730871b8ed87828ab6aca925aed + + 9f0f9352dc243cfcf03dc263e73b2f85 + b36510280a1e2e014db815fe1969c962 + + + cd31e6961210680c3f3a0ce95bc90be3 + c873581606d6b29f7e9dc31483a99b4d + 4215c1ddb6c11834fe414b70ecc76eb3 + 5c7b2802dcc0f47e6e2d27e9d57b5e28 + + bd38d615a3d39fba1f1d6f3d7e37db81 + 3ba0bf91d0bc30482f0d2bff8f5cc292 + 8ce84f8b3c5b8857d1c534d822f27bd9 + + 4215c1ddb6c11834fe414b70ecc76eb3 + 72d1701cc3d742f242f5113817db1ae6 + 96a0b1aa430eb30b302737f62a722178 + + + b0f8e26eff593ad6f2ddc75570c3d523 + c16f54f8f8897b7efe0a6140464d2614 + 4215c1ddb6c11834fe414b70ecc76eb3 + cb927cf49b9c17b8ef3c004908c1568c + e89dc5b63669def65e082690782b29ff + + + + 32d98e290469ef1e5cb0be38c78624d0 + 6182369722cd4b8faac27ba4a6f73468 + 4215c1ddb6c11834fe414b70ecc76eb3 + 693d65632bccdc9af7e7e043146e63ca + 15f0d5375e5c369ba0959b08c27b54bb + 32e3cbbeba61a9a099b4e3f2cecab6b6 + 77dbaecb547258f9c47bd24e7a5f1f01 + + + + + + 3c9aaad1cf950d06a27188a934437921 + 8aae25b7735f861e282f9401a9afd498 + + + 366ca4056037b20a869b664779bb203d + f9c913abc30f995959726d50ff782a1f + + + + + + + 69ab40800fadd871dc7ff362357dd207 + 6e3ec6a1351c0b58fb5c6ba524e6f1a0 + + + 9a6c55273211cb55ab6d685159957439 + 3e42410930ae636bc64a684a526d7124 + + + 5145332c0abc179bcdf9fb0926bfb2e3 + + + 3279af726d5d062ba36d2bebf80dfc58 + c2555ea4fc1eff0b7fb0813bde23239f + + + 9c2f0a95cf9d382877854fcd4893b946 + + + 0cd42e0beb2b68a880d6761a347f4466 + 14569f04048330efd1f4ee02b8b10365 + + c527201bd3c2d0b3f518db9cfccc1585 + + 1988a934b1fe2999058637096b2aad58 + 6507788c925d11d03a2ca4c9dc4718fb + + + 2eeb6628fc55aca456881d10498a53c7 + + + baaefb6184d990673853fcf08e7b6b0e + 3db97d493561dc2fa66091e1411d0ca3 + + + 467423e72dadcb52502930f8b3cf8a5f + + + d4058bf0f173f36bb5c32fc530dcc333 + a0e3955a17b5212e321dae26ab388720 + + + 3839be28edc3ac1e7a850a4964744df5 + 460f392a4c53a8c16cf07379999902bb + + + e46b9721505006683f2f21cea75187de + e43cda6d87059339841b7a9e114dd452 + + + + dd2df2be35f7db65012e3bf6d36c3dfb + + + + ddeff42d47b8ec788d6bb819eaac1847 + 5f86de246211f999e137ff102cd42251 + + + 133ed08db7e96da3039c12ccb003432b + d1ad13738935db24c71aa59bc4850d96 + + + + c7ddcdfad1845e2270fb5329a8c776c8 + + e788b27a481a080692c788c0800df05a + 2172f39e5e54f60e8c7055109ac3b9af + 426cff7aa86b69dc8db25fa12fd47027 + ef828805446d7bd9464ad3d0840f41e6 + 3b657b042ca371c1a401ce53bfa99f8b + 73648418a47c7f724ebb9013411af543 + + + eee89bded49368d877eda43ab3b56911 + 45a60f634f4fed58b79382cd9b2ac3f5 + + bf1589e9e66ebfc7216582ba3a9b9664 + fb4105147be6115ddb1bd531bd8d86bd + 1bdf6945ce3e2b479ed10680e1403028 + + + + 8077ed241d4709280dd5e7776680e42e + + + + + 4d95165c9f3690a62b5e1cb401c2d994 + d2d0186514d9208e2aef6908a99ddc13 + f5d051f257dbd3067710aac03f10fb9f + 81dce68d2d56e628192284a80e7b17c1 + 7c1c87b8395d35b39bac1004b2451e16 + bf7021a1f34486351b34db3026037d7f + + + + + ce93bced41beacadffa65bb8c8143c10 + d3808052e9570ef0da4627b38f3f647a + 5eb57b43a3d52d620207f26756cc937f + + + c62bd3f6f16ec5e75ad88109d94acf46 + 47919845445a852336ec61fcb0e66988 + + + d3808052e9570ef0da4627b38f3f647a + + a08e964caf8d0d52a26d5e5a720a1e6d + 1ec2fe63322d355b93d5527beaceabe4 + fe0b67e68d6acde03d81dd5bea68b97d + + + + 1ee4988c2e89b06c5c621eaeef712c30 + 0ff01cb0190770a712954aff2cf730f7 + 54cbab81754a821eb4304c94a46b624d + 0b5eb048d53a8a2180695d9ab4f251e9 + 3a9cdbf91a7c4b8070fefbdb7f5f39e5 + c1c4f7b1d1abf40d97919694e48e1f2d + c1e7a2762c641a44d74d0d2337d5bf15 + 60523263d5de490057bb9a0e240d09a7 + 5acd6ea023a3cc94174eb8444cc668cf + 159fe00f9cd6b95dc8208a64d2562bb4 + 0ff01cb0190770a712954aff2cf730f7 + eb801f46ed97bcfbdf23174a8566cbfb + 1974f454a3237f761d6aa0cb890e1242 + ade0c9e3d5c18db3b908489c4958fd38 + + + + ffcb1a7565f27b6f18b05667658e669b + + + 4a28557b017bba80d84b864da17b2d20 + d3808052e9570ef0da4627b38f3f647a + 7e4d1d1df1239a9b438d5597e6643eab + + + 17308240bdc13c97f85ba8a5d2444ff9 + + d3808052e9570ef0da4627b38f3f647a + + bb644067382292747643d1fd4ba48da5 + + + 7cd99692e3208e15eb1fabc4b76759e0 + + + + a6f2b609b2e848608512ffea06926a52 + 6eb52fb1c02593067c2ce57cba9dc995 + 5a6f7b3e773914e0496d4917254bed6d + 0ab95caf844e9b1ba75e1a4c81abd557 + 9bdacdb542d7cfb28a37fcda1fe1d6f3 + + + dcd089085723444e4b06dcd74d496274 + af696668bdf32ea390d0e1902f3d2ea2 + 2e80549de15078344ca1e295bf649e68 + 7fb90c6b6853895ef22bb89cd81d24c1 + 5ccf94c975433b9a3d5f0d6bd2938cc2 + + + + 1145807063f8949894b7f01c713b717d + + + 00708bbdc2d46a0e1594218a2d94a724 + + + + d3808052e9570ef0da4627b38f3f647a + 835dd655b06f019476e0692236d11bd0 + 09a0c6faed0ec06e1ba453ebebe0c840 + f906931468029ee28ab973728bd2db3f + 66bc0a680b7ef2203fb96b621908dea7 + bcd3d99fbff75ce1c1495d4dd2398794 + 5aa278b5d95db2103083660f9052cf0c + 657800b61ef086f801d11fc1fe5b64d1 + + + d3808052e9570ef0da4627b38f3f647a + + d3808052e9570ef0da4627b38f3f647a + + d3808052e9570ef0da4627b38f3f647a + 390865bb7ffa686bc106a6b9e16914c0 + 39812ad75ce7fc420621604a82afe460 + + + 02fcab6999dfa11e70b89e2be7abb0f9 + + 5c3ad4cb81c6016a700df307ace2fe8a + d2c87f50ba6d9641299efcb5f14e08ab + 01fae09220fd39704e3121f2b512016b + 6a61b019fc456fe613160bd5745bd6f9 + 36783bceb13332b2bb5f396c6e754a52 + 6c2f62a71ca58dde569416a186cfbf17 + + 2ac5d86e0a133c0c7346f927161d95aa + + + 6f0394d91a0a0dcca3b8d30fc088a30e + + + 2d6815ea68e51b296a2c6fecc5ed2a67 + + f53abf02e89212c1044cba6837eb07e3 + + + d2c7235b65ba28005bfcb086ecf32ddf + + d3808052e9570ef0da4627b38f3f647a + 97e2b0995547722d4bbb36dc8eca157f + 43cd4918dea5524ba56ec19d4dcdd485 + + + 4e15a83f28cca8e16ba07c04ce8d53af + 596113f791dcff5603854eca0856b80b + + + + ccc0f7f6af1f61edeac606f128c6e70c + d3808052e9570ef0da4627b38f3f647a + 5838d1b2c700f3875c1223b1ad862a22 + 83722cc05c1155924dd880675620ccd1 + acb2b7134017574f6b00c4303dd5c617 + 900c0772ab8c6f032f0cbcc22bcfe7ae + e04e8fe3beb24da268c4d74de3a0615b + 3cd5f357c988e0fdf60808e50724b831 + 4a5c0ee0c1808a1703bb25bf187e0f9f + a3f4b93d5805c5a43401ca718b51c03a + 44ed476480d73a4ad05305ab7643da97 + + + + ce1d9cb6066af8463e056071ed2ec180 + c3a8580b6a1947f33c27a1ff74d660bb + 3cf56c19d5f10a0c2cac70e8c14a4b9c + + + c3a8580b6a1947f33c27a1ff74d660bb + + c3a8580b6a1947f33c27a1ff74d660bb + + c3a8580b6a1947f33c27a1ff74d660bb + 2d0b073ead92a7421c220b7dff882cba + + + + 521737e3a9d8e9a16bb8af6b01eb1399 + c3a8580b6a1947f33c27a1ff74d660bb + 2fc573254bd9edcf4a74e45027b32074 + 7818094cded78c11dfcb42cac7e1d657 + 368e60760a4126e5033811e13f7a1902 + + + d35cb4ea648c2369f783e81a0012bf4b + + 4ae160151c6d01c60216fc103116728e + + + 79fb01cf644900ebaef691b19e2743a6 + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + 31f6af15cbd2815f8e4b25bd957cdb40 + + + 4ae160151c6d01c60216fc103116728e + + da71a443cabff43df993d72c66675f4d + 4ae160151c6d01c60216fc103116728e + + + + 0191497a625f49f5ee6b816d323de326 + 7931474b99a0b387ccc22c8c61a8d5f1 + 4ae160151c6d01c60216fc103116728e + 4aae2e897b05696ce7470d14c217c75a + 2bda018b9c63338ee187ca311c20a79f + + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + 72f6a6e37627327fa0d9115f50d8e189 + + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + f17e85f72a491bbea291ab59cfb53c8b + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + a16211f6c203e763de8d6b59c97a2ef1 + 8801e8e82f11eebd8e1375b793e78c87 + + + + c2d4bbf0c5c17194df2ce9bea68e3170 + 4ae160151c6d01c60216fc103116728e + 2d71cec69c4d1fb1cb5842952a56ac7a + 18e2408e088321216d9199f9716b43b9 + eb21af5a498b258d82d0e05cb411273b + + + + 4ae160151c6d01c60216fc103116728e + + + addf8c358985fe8cf7a2dcdadbd4ed27 + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + 7f0b5cab1b9ba9697916392d8afd9974 + + + + 89c865a37e937e14a64dd5e030bb05d7 + 4ae160151c6d01c60216fc103116728e + c2a6e7dc933aa5a05f813221ed6042c4 + aad48cd948dbdbf7f4bf6e403817287b + d27c9dcf1bbf13647ecb6734c70f1295 + 6bd180dc1c98836d959c0da027716668 + + + + 4ae160151c6d01c60216fc103116728e + + + 8eec7814ef7cb2422ff05720dccd0e94 + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + 059514f0f9e2d5401bf539e0a3d2ce2c + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + c7bb16ada4885d2c88305cddb27f4c10 + + + + 86525a02872b7a55aeca2a0656dd6563 + 4ae160151c6d01c60216fc103116728e + 688b8f506b373ad9c43c106a9b11d396 + 952f9767d3dc6472cdee1b5fa9586f5c + cf5cc179134a89bbcc5dd78bfbd3fdef + + + c6051be9ac33f0d038ac20e4532a38f5 + 36a239048ddf3c843441fc4ec8a4b040 + 4ae160151c6d01c60216fc103116728e + 20c37565db3acc2e54b68ee05cd34e81 + 6016b969484b871637c031bb02c4f1b1 + bd2a59e7dbc47b51248840d2e0a9f48a + fb7d7346468ef45971fae611e6cbe365 + + + + 4ae160151c6d01c60216fc103116728e + + 1fdfd7a73b7a5080b6d91e3d3a013819 + 4ae160151c6d01c60216fc103116728e + 21209e8f672478ea0cf6665fc075cec8 + d6644de2ba0a894321d9aac8f85e60a9 + af11098adf8fdbe37ef2c31e6ae7fdaf + e75bcb7c4d22c4b0e7e1ea4ef13f0762 + + + 329033c89fc7cf42549b7c6e43460f35 + + 4ae160151c6d01c60216fc103116728e + + + 6dd908990a3ce5eadfc23d0cf8ce15fb + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + f1966b4b47b97ba43278413959328243 + + + + 5376ae13e5085af2998cfbe59fb9e960 + 4ae160151c6d01c60216fc103116728e + ff11b5edb419923b7de85129acbc1fb9 + 3dcfa46fdea64390c8cadf3aeaf05bc7 + fc91243c6570a38e82d1d7068ff374ed + + + + 5c5138b7972bc95d9a26c76395287f5b + + + e65af7aa556e5fff3f366d6f5a8fe7c1 + fb1abb3568af79299178437bad15ed8a + + + + 80d141f50740bc623603de727b9a4a99 + + + a7731b2cd41574b3ab381140c4862140 + 29911f0b5db409ec8af0b65c6482f444 + a22ab82fb3a33ece38c3ab5e0844154d + 5c5138b7972bc95d9a26c76395287f5b + c1cadf84785868b7a340440691e15237 + c4e1dbab7bb05952fc4cb27421453844 + 63701059ac59c53600d8db6a096b59a3 + + + + d6faf2818aee266c61ab481e1bd806d1 + + 4ae160151c6d01c60216fc103116728e + ad1e5a64a0078f2568982628decb3b50 + + + 4ae160151c6d01c60216fc103116728e + ad1e5a64a0078f2568982628decb3b50 + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + abfd1b3c43225d6c94a884945833933c + 021130f40218346bc9f3d0be69ede2cc + 45427ff2fd437cdeb9a6056158446e05 + 4e3ccca65bd430069f5850055e0f40f0 + 3714c19b626ed933f2fbc135a423b2d1 + + + + 77491f6a50ed2e0945153809e2334713 + f6b07f43d874ff6eceb0ac7d8177b639 + 4ae160151c6d01c60216fc103116728e + eef3ea90d90c023b38a80859466bb88a + 43e1045b71da619b1d7e53fb3217be93 + 04c263002f67375ce9a556d9adfd634a + a22ab82fb3a33ece38c3ab5e0844154d + 2a0753acca496e17a7d89cd3f5f1c8c8 + 471d7c94efe34c797c693fb0d5fde66a + 68461ca5187cd2c6af08786467085f2b + 8bfed48756f192ed7afe6eaa4799aae4 + + + 4ae160151c6d01c60216fc103116728e + 9c2b618976fb0d9b0fd77bcf87b6b263 + + + + 4ae160151c6d01c60216fc103116728e + eda39ccedc96483df2fa95f877c03ddb + 3a51875a0abe79c81b5169e8db92ebe3 + + 4ae160151c6d01c60216fc103116728e + + 745fb6de5f9445b952875844572aded8 + 4ae160151c6d01c60216fc103116728e + 9e0b7659272f5e75156ab9e4ad123b83 + 8f2cf472cb647ad651210dee5fc51e61 + 9797b1635303e07a89a760358ad3b96f + 930884f15bcaab49a30117c0a84be21d + + + + 4ae160151c6d01c60216fc103116728e + + + fa6ad8b494ff65269966b73bc55ab093 + 4ae160151c6d01c60216fc103116728e + a2430207b1bb5b9edf71660221ab31a1 + 49ca0818ed309e66500750eec01de002 + a8a228bd12540ba5e86b6dea86f80e70 + fc2677e01ec019b3f5db6c7f50982cb5 + + + c3a8580b6a1947f33c27a1ff74d660bb + + 4ae160151c6d01c60216fc103116728e + f21cd56eae2494a6ab5820838516db9a + + + 86ef1f265736be8dad835e4a6f9f7d64 + 4ae160151c6d01c60216fc103116728e + 449a3518d856124cd9668826512fd385 + 84375e35740b8dd4c65c85d8555d39d4 + + + b6b9debf52af85036af06c9e47db2a35 + 9daa929124078e4d8b3637d3a3c632ef + 0896d773ce7570a845ee41bc29c33f22 + 4ae160151c6d01c60216fc103116728e + c560ce9077eb4c0d1da083a0f7731133 + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + be0ca088374dff9131c3a12ddd06584c + + 4ae160151c6d01c60216fc103116728e + + + 423b78ea540a951ffc3e2eb8c8f9061f + 6df9b69a29126165355c3db0b5e34345 + + + 7cdb1ac9ca57a187e87339ae736c7fb3 + 4ae160151c6d01c60216fc103116728e + fff71c555bc5892125e51ba79881ff06 + 79d337536535dc88d94913d9d7105aa8 + f33bc0288985a733ecd4dd48c76c3022 + 67b2cf9eb7047504e6e76e1c585a0694 + cf4b0de02afa9d0f15e5671f22a52bc7 + e7c44a42e72192b4b46036093556a1ff + e14dc93cb33037519311eb81443115c3 + e250603c83397805b6b210aadd1f74ba + d946c975564c44d407fb3b15fdb61760 + + + + a7731b2cd41574b3ab381140c4862140 + 6df6ed1bdacb873f2160307ad61f1f79 + 7a3888add689347072c75b706e40fa2f + 4ae160151c6d01c60216fc103116728e + 17746ff5ffef13596ca8f8f84ad64094 + 092fa164b28b8c02cafae9e9aaaed62f + 5af35ef3ca253115bb2ddebc54d52e23 + 7b5eaebb4cd0a9b3f3b52a0c30a7a6b2 + dcdc04029a2844c6a4d1b138549d3fb1 + + + + ed63d12d0269a3437498d75f3a236f83 + + + 4ae160151c6d01c60216fc103116728e + + + + + + + + 110417a2da4c17ab2b7af42b91ff1608 + + + + + + + 5f7579226af7764d33f22098acf25cf3 + 4ae160151c6d01c60216fc103116728e + ce8232f323e74ee7953fdec39c31d469 + 5f649927573e37cb02f68b5b883b92ae + 243753b198d6cab66a9a388a01ee099b + e1e7a7581ec377ecdd0b075de6d5583c + + + + 1057fee17905446c7bbfd296e103602d + + 21fc500e84a4aaa2ce4b9b26bf01d2ff + 67be5cbadff29e6e8a2c256b8532b50c + + 86f52fee574536950abdaa803a0bdd34 + + + 4ae160151c6d01c60216fc103116728e + + + + + 964b17eb3c1abc0d8bcb18bf20fa7dd7 + + + + 426c854a94374a2e0ff00808e5176b56 + 4ae160151c6d01c60216fc103116728e + e805ff5617309795edf5b40f6a140e3f + 70a6728f65dccbea6c95b8e1af67d46a + 7bb424c314d9ac3487cafb9d1ea00096 + 6fb204bf6135d5847d81ee52e55fb29e + 04ca49594e29b36d8d860d6de199429c + a5935d8481df7b203c24e1dece6a0632 + + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + 18a69efe88d97a7eb4dd542edc8bee44 + f0f004d9282cc2dee123f659f39f844e + + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + 13394dcd32a689a9313d4f65bdd1c87d + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + + c932855cb75316db0a046f0ab372a3aa + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + df1bfed0a9d7875ba8dee080e5c85ed6 + 7c502f2fac68a4b8018ca23390168a4c + 68b927277039ecf4169e9a335c9bf8de + + + + d7d3a0c857032429d869aad5c27d838a + 4ae160151c6d01c60216fc103116728e + 281d5da323367eb23aad6e86e1cd29e5 + 72313a556b3b8630361c8853bf91fa6f + 297cbb5fe5b9fed6d3863e1b0759b7e9 + + + d5d4f6a6efd9b16aed91736b1d7a9bab + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + e0502e1ef684c97b4fd1a27a65b0946f + 03714bcc32bff9624877501580173b62 + + fdccf52594577b4140cab17ebbdd97ad + d6588f34ab824eaf65ff562f683d63f6 + c3a8580b6a1947f33c27a1ff74d660bb + e6eddd455a6027d7a8bbe7116ca23fec + 250f28824e190c183211d46a9c460bcf + ecf127c86c1123068970b508f78f020b + 387409e30cc98bdca10665751f82ee13 + + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + d14db0a8ddbed57c6dd49d6258736ee9 + + + + d74d72ff0dd344e1838781aa93ea6383 + 4ae160151c6d01c60216fc103116728e + 64343eb859c44b5005e3f2b6970af2ee + 00fd4a6a767898cb8f4e102c76fbbdad + eadda88947476a5650a4801c259104f4 + + + + 4bfebcde9fc625b9ee5452d8ef44c4a4 + + 9afcca7990122741f8043077b240a48a + 4bfebcde9fc625b9ee5452d8ef44c4a4 + b58f5c269cde7289da0c8edd7c8c44d7 + 523ae2d5def5aee9beb1d605346ba319 + 05c99cca92f978c31846f7c15bdc2ca1 + 2df2f5bb609e5c822c2b1fe1eb9e8945 + + + + 4ae160151c6d01c60216fc103116728e + + 353b7129ddc3d659b52ad163af9fd849 + 4ae160151c6d01c60216fc103116728e + bc215e8b57c4351487e066146c3df1af + c6f307e872b5974a025bf5845aafb5f7 + 58d66664d5d76ee79a1cd486a66fad1b + 2335ac318fc41f8bb0f57d1689437ec5 + + + + 4ae160151c6d01c60216fc103116728e + + f5807592eaca7407a1b336d70419a7d9 + 4ae160151c6d01c60216fc103116728e + 5f35018362dc98f404b3ad27d900b070 + 1efdeb7a06711916ad5482cbc0fb53f0 + 1930bc777aa9dacec27b4da78546217d + + + + 4ae160151c6d01c60216fc103116728e + + 3d4116207c824c7e9f95b4f3b9726793 + 4ae160151c6d01c60216fc103116728e + 13c1fc84bc0b92f8211a378ae47ca978 + 4a84fe1f2a32e4eb09a8135a40a5f4ed + e58a71aea68b0a7c7f69c45ae3044a07 + 6c7392f36a5a8059d16e1943b4317fac + + + 02a6c2310ba0ee62f69b37c439722a32 + + 896b42bee67b4710d6f006a0bbcbab8c + 9fd1f6879d23980cffabc53efb73549c + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + 02bfb94db77f6c7a4322c298e227ffe9 + + 62e768ac179e1bb41768efdfe62f2cb9 + 852ecfc70ee7041977e7bc4c6ce128a6 + c3a8580b6a1947f33c27a1ff74d660bb + 63955729fc4771d0cb32668a9b2f1707 + d92ce62a6cabdd56a28161675534fc34 + + + + c40f7eda2781983deac27a1228c75f0e + 7f114a03dee776480d8670afa5e2ad81 + + 05c6a0c5a2d811e6d705c88092097c7a + 4ae160151c6d01c60216fc103116728e + 8278a96a5dd06d237855e474ce4b4564 + 0780a37a5b208f7d7ec74bc207e51e2e + 9e7dd456f5d3db1adb0d28e9cf75588c + + + + c40f7eda2781983deac27a1228c75f0e + + 0442824b2949c8e87a9a0d480bf961f9 + 856ddd18912c6ef626399b1e1c9d4ab9 + c40f7eda2781983deac27a1228c75f0e + + + + c40f7eda2781983deac27a1228c75f0e + + cdddbcd1368584d46e60eb5e39017c82 + c40f7eda2781983deac27a1228c75f0e + 0bb33ac13e7555fdc2e23c0d3d820f4d + f43a0570abc1f23a328e2d4ffe6e8a2f + 002e7bb46e780982c7121c4d346e8942 + bab9faeb8a93cbb2642e52dabdb1e698 + 202a0a217f1c34eddf53e343875d6b21 + + + + c40f7eda2781983deac27a1228c75f0e + + + 2f2e9b91b0d0e41ae2f9a61ed472991a + 14955a787838a8c0239e69e9c345b553 + c40f7eda2781983deac27a1228c75f0e + a13a7efc3f149f3d7b70487f72268bae + a752944eff234d2f247e33f30466dae3 + d069dea3db975b91d98eab3cefb57d9d + + + c40f7eda2781983deac27a1228c75f0e + + 49663a39af0f8becb646b9e2fa695212 + c40f7eda2781983deac27a1228c75f0e + + + c40f7eda2781983deac27a1228c75f0e + + c40f7eda2781983deac27a1228c75f0e + 41a1fbf68db25f0de483d3c1b3d04161 + 914eaedaa60c5429bb2b54f2502690f3 + e42c3244fec78e3e77a3c7221503db9b + ed724cb19680dc66281cf581bdfffc0a + + + c40f7eda2781983deac27a1228c75f0e + d32317609ddec3118db80325e1641859 + d436ee9d94b9b50b3d842948ca99203c + + + c40f7eda2781983deac27a1228c75f0e + 7be62cfe3691069a71c1f6540b3a1052 + 86af1827d0deac55e0415db8bd83b594 + + + + e4c5972e1072163838843fa686560b99 + c4d2e9d6822bbb88dec7ee8e338b520c + c40f7eda2781983deac27a1228c75f0e + 43c57486f86dc3a02817409c83b546a8 + 6c4d85c956ca473f63f5e3552956c4ff + c9071e9ff56d02b2fe5cf0631e4711de + + + + 0c47ef533d41ff8a9d002385bbd20979 + + e0afe38b45e238951f17f91f45ef10d3 + 20bbc30cf0269a2fc7b7030c0384e026 + + + + 3c2d08b1cb81a815cc86e750b2c86208 + 6ede40fb4578815db27311872a8902dd + + e26a4dd7ffbd317d21f92a45a9ce2b83 + + 882a990038493efd8ce8d268c68f96a1 + + 71cb786db3e890143272dc4bf6989785 + 158bcb4205867271f610b153f06bb4c3 + + + cc2def895cdff9ad22de2e620399559e + 0775ff8a3869a831cb41ccb475967f18 + 2af69219217cde4a17100f5d1a9ee7b8 + c7b66cda431197224adf9a36d500707d + f023e524e2ea5e9ba15c2275b78fbabd + 4f625cfd77ebd157cae988ade479c284 + 6b69a3b17b2aba3cdd29b89039cc597e + 1328ed0fa7693798ff9df1beb2925199 + + + + 482723250363f253b794371ba7cc42c8 + 4266e97c1b0da3b23c7cb224e9db1dfe + + + 482723250363f253b794371ba7cc42c8 + + 87ded0edc7115de55ebc6486431a53fd + 482723250363f253b794371ba7cc42c8 + c8cc3df485b2173c1b38bba54c457d11 + + d3d2d8e027404a6fc5310356d269071b + d0ae3817653558109a8e86bc0019105b + 3d9285ef09af423d9cee2c4f4bd69b3b + + + + 7f8795ac43a9060caa7101364067bd8d + 4a968fe366b313668ddde02ac67cb741 + dbf73b9f54113eb46cf96dfdbc7a299b + de770e2f70c2bb751e1129dcfeff2f01 + be1ee3e898105584745ae16cc05517a5 + + + + d7d3336cf8f6ea6a01c4b6634e550fee + 9ae71780a572c32689d1861fdb578545 + + + f3981b9fc241c2dfd13660562a77abc5 + f1eb4dd22aff9068c89f819268d1b629 + + + 9fd5ffcacbba76ff6565b271dc198bb1 + + b381aafbb950c6b5c99eedf83c62e181 + 49aff94d58611b229b68950a770498aa + 7c6b54e5e9fe39774e27bd098bdc7197 + + + fac296282181a1b375e5bd37fe7c0dae + f7926460bac90077618dd1521c95c78c + + + 5084defb2f3c7b2fbf4d0b5340bb44c7 + + + 26adc8d2aa6b0e0a7106a7a742a08ece + 0b58ec57107398521f80d42150be96ab + 36e5f5b3b33d80ccbe845d7c6aeeae7f + 5bc84f06621fb67a7ddac01a2cad7703 + bf524f1c75484c4d944c5c2615792cbb + f750817b00a8b902b089d50f7b3077bd + acc146ad4659578ba46fe460e03272c6 + c0d5552c324f9435b3bf97b4e5376e90 + 48c49c4262e4f4b3060f74b5d7311b55 + e13317109fcb5abe7eab03a035a1d567 + 8548c107ded0d02ee3efe520d8c20ae3 + + + 3e68981e193908fb7cb8a58e217d7010 + bd8c9d135a6880a6eb1b0d0a7285e876 + 7e307abd1a80c532e5cf1a53547db0a8 + cbaf071cb0bcc721e9ff71540b824a89 + + 3400457b6e449705fe9b195cb69cffbf + + + 9a3737f95d0376b152636e7824b8db87 + c85caa720945b15703379e7c2a946ad6 + add6a53c02b398c681b6ce9fca086ab3 + fd70a7f80575ba4c7fba5cbc370ddd58 + 19bf9c1cce02051545bfe8edbba7c7d3 + 661d734ccf57342d6e556bb76c8adf67 + 146e44549252f39426ac36e344c86519 + 74e5b3a9501afa2c10ed2da57bf5a8a5 + d1367d65422ab4eb8d8a9493e84f2671 + 798e1db0a5d26bb37c0ce44d3b22dfd2 + 18aba570022bc51d68673a8a3a549946 + d41e61b32c3bd5a57d94f9572a3ab294 + + + 0c47ef533d41ff8a9d002385bbd20979 + + 280753d22d262d4c1bb54d859bfafac0 + 8ea7d87d5d97f7db0f705e17c4f34580 + e857abd323c2afc9adb4a55c95ceab29 + af5d1d2064de97e76f7b6744121b25d1 + 99542f1cc280c1d240f3b5c894013dad + 5f00a67b1329634b40e3784ac8f0c441 + + + ba4683d036b349be5b345cb33eeb0463 + + f213360ea12acfd14594bb5049d275f8 + + 6d069aad44c18e4eb62b87bbde33ad41 + + + 2f7f34ed2c914c3e9f2c06354c728551 + 695a82001149b479bbfed379d87c5908 + 44b55bc84e590febc24356cc47b88693 + c71c8e48c906f1248242acd6303dda66 + 8c9ff2c8805990b362016e272cf27458 + ff37c5cef4b329a1ef215391b1208de0 + + e207b59b33236164fdaad22b0cdb20ff + 3d73b57e2d921eaa88bd797a7fdc5566 + f651ce6701528c6320b444ac79f0247f + + + e207b59b33236164fdaad22b0cdb20ff + + 763539d691b4ba00a6d12cc363894c86 + 3a839c7151d639d541057da43e425f91 + + + + e207b59b33236164fdaad22b0cdb20ff + 0eb33d32c086dcc64bae55ef82567ab8 + 3874cb04df22070de2557f294fa957dc + 8c0037c0da4126eab110e7bdd8256168 + 58a6dae8d3f94da69984c204765933c0 + + + + dedcc0a32d7a2cd61ad0a0d31c5eca0b + c5a119a92b6bd69ba2ce3fea907d1623 + 482723250363f253b794371ba7cc42c8 + ddc1029900f7c17545e079977df6dc8f + 72a48e65bf515b6ce7f1f540a16216a0 + ac65989e50fa30d563c0d448e7a67923 + b23339ba433ae4c457634e88966de42a + 38ea45686b19b6e100886d29cb4916e8 + 2277114ec858c5813dca77302db892a4 + 2e3c786fafd81385afde21cf52a749f1 + 3eaa3537271fed8f730bbcd2fe6ae717 + 3b977bcc1d166be82e308cf282bc38ca + cfa4640160bfd33a4a9c5b7837764622 + + + + d3808052e9570ef0da4627b38f3f647a + + d3808052e9570ef0da4627b38f3f647a + c87c74b06ee0aa34549c464bec3d2a64 + + + + d3808052e9570ef0da4627b38f3f647a + + + d3808052e9570ef0da4627b38f3f647a + 62d6d898c029738f0b6a90e56650a083 + + + d3808052e9570ef0da4627b38f3f647a + + 29c69e88bd690e7da83ce327fe2ee724 + d3808052e9570ef0da4627b38f3f647a + 38ad1dfb86bd5fb25a9f6f592b02d8f4 + + + d3808052e9570ef0da4627b38f3f647a + + d3808052e9570ef0da4627b38f3f647a + + d3808052e9570ef0da4627b38f3f647a + + + d3808052e9570ef0da4627b38f3f647a + 5b299e165315e3d2d2e70bd3089d412a + + d3808052e9570ef0da4627b38f3f647a + + + + + d3808052e9570ef0da4627b38f3f647a + 26ae70e0ad45baf32587d1c61e20738c + + + + 81f5e6a1a257f6ba2596ef97694a2412 + d3808052e9570ef0da4627b38f3f647a + 31de65adc62c6c42f9739cd4f0673e80 + d9f1a70fcc28125f3b8ff5af16ae4fff + e0f998f9550756e4c1a65967ac0c5ffd + 478d29c00add03a8f537d5a5922ef4ce + + + + 508b774a18da7117fb7c344692c55b10 + + + 7320fd94a5fdf45f98559082676749a7 + 60afdd65bce95c3330a79ad28b7c2aff + + + 508b774a18da7117fb7c344692c55b10 + + 508b774a18da7117fb7c344692c55b10 + + f99e0d58cba0e5df295b9e6d14c0daf5 + 508b774a18da7117fb7c344692c55b10 + + + + 98ab22f5177d97048787eb147543a170 + 508b774a18da7117fb7c344692c55b10 + 2f080fba76d8be96fb833741ad780d1d + 0e60117157bdd3c0547ac7bf202b4c08 + 5b3e5bb0fc1fd4ae12421b6e86ac62d4 + + + da8b85f66abe0efd48f9433efdf183d2 + + 4215c1ddb6c11834fe414b70ecc76eb3 + 09819cea8231faf4ef1240c2824eeda2 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + b7b26f4b6ded2a2299dfd3fed6a9bd59 + 6428a70285648e4c0c6bb938fcc06027 + 1ea4dd6e2a1c393fb0e43510485c70cd + c32a9d53c04bb023d2dad9a24a45b198 + 8b118b469ad0fc57edfa33207acd7334 + ee112ad24fd22ed2d07443b885cd784c + + + 4215c1ddb6c11834fe414b70ecc76eb3 + 3aa9d98f578405c7d0dc9e9175597b04 + 04f1b2ac39e762cd516cb359755c8cc6 + 86054525f6e5e25670767077c7288288 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + 976b3b445510af41968b35f4cd771502 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + 1b94e39dd95d87103984ed39759ec345 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + + + + 0307429f20701de8567274d89c3a3eb2 + 4215c1ddb6c11834fe414b70ecc76eb3 + 1c6db81a4df0d45a4c35095355e71451 + + + + a7731b2cd41574b3ab381140c4862140 + 25e2c49d95dd3308dca54c8a6521d9c1 + 4215c1ddb6c11834fe414b70ecc76eb3 + b155587866ad7da39979ae596a411d20 + 5df06ca5740b8ae0dfc1d1f448a586e2 + 2bb24d71476a886a80cb713d33f7543d + da705de6db1c2080383a1ad43f4160b6 + e84c85302ead27000aa43468484cda9b + + + + 508b774a18da7117fb7c344692c55b10 + + 59062f98a6c94a32448a0634f3d5e458 + 508b774a18da7117fb7c344692c55b10 + f4f8291965f925b8812e39ea51322783 + c79fb7ccf0e2b8a54a0698c881600f4d + 9ad294b763dc6ed2d68c4642db8591d5 + a7d8d12c00e47f824fcf136e2a78f005 + + + + 4215c1ddb6c11834fe414b70ecc76eb3 + 3a90d12412304c91503e69660efe6437 + 8ee8e5b21bde08285ed202378b1d1c7b + + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + 867af92154d26a4cf7782cc8c8e66437 + + + + 4215c1ddb6c11834fe414b70ecc76eb3 + f74d711c5d35a8c7e81a5f389072234c + + 40cc36d952b42de65ade4ad3b51210ca + + + + 4215c1ddb6c11834fe414b70ecc76eb3 + 14cc15262a3f2921945a7533398141e2 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + d4b80a99e4ec8edfddbfd7818e5bd5e0 + 1b47381fa0b1c1311cf5c39167e522e3 + d7e9d8475cfbe0d91cf609c27f34ad22 + 815ceb0d3386944e33185a52327ce6bf + 69965783bb299d28c663fc340455b3d7 + 73e1625816380e4ee5bdf559002e3a7c + + + 06f7843bf2ceefa940ee0b47d655fc43 + 4215c1ddb6c11834fe414b70ecc76eb3 + 64e3bac7ac55756a12d006622098ce0b + a5657685b11a3c8d073b8862d3274557 + + 060220c7950c87c5e5dc4bb205586bf9 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + 930f57998f1203cf4e0b2ad6dcfb85ad + + 4215c1ddb6c11834fe414b70ecc76eb3 + + a32e04d8ab7ab56d491989279cadeba7 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + 049f41e50a1a1a73303a992add25f238 + 427f44d09777e0fb426374d493345f38 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + + f67454ff0268497dc833a550bd9ff48b + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + + + + 4215c1ddb6c11834fe414b70ecc76eb3 + 075014ab54c7ee67cb629a1078c37b30 + 7b65235fbbe7223a08bf22e923649924 + bfd3028affb2e9b120a8475c5ec7ab1e + + + 4215c1ddb6c11834fe414b70ecc76eb3 + c8fbedff5ec491a3f6cae7b927d04873 + 152bf2c316bdb76d7e3f2aa8263f5c4b + + + 4215c1ddb6c11834fe414b70ecc76eb3 + bafb99c5d4b11b4e02b7ce3773963f4f + + a1aaf91f76a88118d27a736a05f6b9cc + 8ea0024707517c396408fe37377a6740 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + 3c1038734cffb1f5363f31e0641070f8 + 2722a22810e97662ae485da71a790ac7 + 25f58adfb40d190315374e3d3407cf8a + 87e4833fddb08a365417dcad072ac28b + f048f3b8fd6e41801b89fd4e762fe72a + 62dd6b9ed253c29a891e97b1e9581bf8 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + 4b2ec43022f90b5f49ef01189ad23663 + + + + + + + 4215c1ddb6c11834fe414b70ecc76eb3 + cc44efeb0557d77df4fa8979bcbebf77 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + c6b382c37fa89495ea8124a457cfe2fb + + + + 4215c1ddb6c11834fe414b70ecc76eb3 + b8942b99e2d5c2e3669bf9871c0f6216 + dc8e1dd2f9fbdafdb69c46e3fc960d96 + e331239423631153c22933fef0a6d64b + 040476b3bdca1f19faf19299c0050c24 + + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + + 4215c1ddb6c11834fe414b70ecc76eb3 + 807d1923f59fda58a87270870aa90d22 + bfba1de6d2f16022a8a76d6864ee8d98 + + c3abe7a3de9dda8f2e7d540039c4c62c + + + be18b9e3ba5bc063e6db1534e44761c4 + 4215c1ddb6c11834fe414b70ecc76eb3 + be18b9e3ba5bc063e6db1534e44761c4 + + + e5afcfe10839b6e46e7b9cd53524e275 + a3ecafb565915f6af3c4450053614035 + + 37f13d0cd6482a472ea0cbbd34fcaf90 + 4215c1ddb6c11834fe414b70ecc76eb3 + 5d4e4cfdc0aa6d0d1a5d98f3e9bdad6a + 1724a9fe5410cde004f663ba55c6ec56 + 8d3f65328bbdf1e2609968bc3ccd58b8 + + + + 508b774a18da7117fb7c344692c55b10 + + + d500b717d28d62f3ed13923c90ac8ce4 + 0b6945f977da697415c7978e79c27b68 + + + 508b774a18da7117fb7c344692c55b10 + + 508b774a18da7117fb7c344692c55b10 + + 508b774a18da7117fb7c344692c55b10 + + 508b774a18da7117fb7c344692c55b10 + + + 508b774a18da7117fb7c344692c55b10 + 0ce61bc79f92d98febe237177ea18105 + + 508b774a18da7117fb7c344692c55b10 + + 9fadfe1dd4beb18d36f2df3f356a496d + 508b774a18da7117fb7c344692c55b10 + + + + + + + eb91b595b6b4b7a2e54b2c10b89f707a + 508b774a18da7117fb7c344692c55b10 + 9c690da7c110a062841d268e473a01d4 + 012078f50aa4aac1701214152d9d399a + 55cc4317caee92407ad3d1b1ef942539 + b9b5b64c30abb3388b99ac92c5a0b238 + a78c9423ec67781c6454e981cab7632e + + + + 508b774a18da7117fb7c344692c55b10 + + + 26077ac77508ecc558dc77f568b52aef + + f382ca8f894388504b8f9b7aa2221395 + 508b774a18da7117fb7c344692c55b10 + 2cc02bf188fe0e2216fdf2569b71f7cd + 81cff5f5ac9af35acbfab04055f4606e + 450392698bc53397853d0a7120e8c176 + 76a92eda983e74f2b49f2882811a20fb + 5d1749e47b9c4a761ee810e6335cfca4 + bf6fa8f6775b2c79efdcfcc7cbbea978 + + + + 4ae160151c6d01c60216fc103116728e + 06f0527905a7b373fd18b796dfbd05fe + + + d9fb223807b85e1e9bb1bbb9b4681244 + + d9fb223807b85e1e9bb1bbb9b4681244 + + d9fb223807b85e1e9bb1bbb9b4681244 + aada180b991cc16c78a5738604aacca4 + + + + 84de4d35f20538865e096ef651f6f528 + d9fb223807b85e1e9bb1bbb9b4681244 + 1821ad875aadd5b4079ed7a8d464e690 + 8ab81510040e59aad35b5f3310d1ce52 + d4f9b81a473ee73b767dc4b69ab28dcb + + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + 35fe8434934826226e383275cf8a1195 + + + + d3808052e9570ef0da4627b38f3f647a + + d3808052e9570ef0da4627b38f3f647a + ddc1029900f7c17545e079977df6dc8f + 9f4f8327dc27c770b6f0e5b7de7fd060 + 9f4f8327dc27c770b6f0e5b7de7fd060 + b645a00a9391bced0ecfc136eef3abba + 43668ae5f5b38180a83be8b2088cd032 + + + + d3808052e9570ef0da4627b38f3f647a + + + 0f9f76288c23d07fff66754d58ef8bab + + 72539505bb03f0753036d34c1b457d63 + d3808052e9570ef0da4627b38f3f647a + cdd7ca6c64837d7059c8152db1215e73 + 33f32438cd2b1800e38020ca934a28fc + 0fa42483bf9e1fd67a23ca23823e36c0 + 2d5866389ed23c748a71d77e129c726c + a062b8247dc82c1a08e0521b1d3e2d96 + 35c9a0f0b8d92604ba764b0e65e5446a + dfed8ee359a0e6715f72370fc71f8279 + + + + + 145dc557845548a36a82337912ca3ac5 + + + + 482723250363f253b794371ba7cc42c8 + + + 3e79013c22f3726eefd6089128761b23 + + + + dc4287676bf60601f6245d124c763b98 + + + 7b0b72dc25efe35f3da195f9ec2e50f8 + 0c47ef533d41ff8a9d002385bbd20979 + 0e238c2aa34eb8308a503085b4a2754c + 478f050956f9f0247e1435b534d5043f + 55c118b0e5d4068d045adb077297efbc + effd4047703c148cb10b052646c7e85e + + + + 0c12a1724112e01909cbcd8f9c3b08ad + 2967a4d072601261ef25d1c1e05a7196 + + + 350067643e44838e9060e6365dc86159 + + 350067643e44838e9060e6365dc86159 + cbac7c5b3676967cf87a57ed8446eabe + 5fc97f0eb638114a0d7b81a7a29a78a5 + + + + 0c12a1724112e01909cbcd8f9c3b08ad + + + f13da3764d2dfa41405a7503aac736ca + 0c12a1724112e01909cbcd8f9c3b08ad + + + 0c12a1724112e01909cbcd8f9c3b08ad + 4ec7155ab806b37a108e1cfaf1d49724 + 8b5969cafeb290e77202ae5197501d61 + 35a5b19a94527eac49d30dc306dc1cc9 + + + 0c12a1724112e01909cbcd8f9c3b08ad + b732d7c9580f4accea0ef875c5cf0046 + + + 0c12a1724112e01909cbcd8f9c3b08ad + + 0c12a1724112e01909cbcd8f9c3b08ad + + + 0c12a1724112e01909cbcd8f9c3b08ad + d27b4d43b5775fdb68b331f55be407ed + + + 0c12a1724112e01909cbcd8f9c3b08ad + 8fab08c8de9ffa7f14178fc6abb37408 + + 0c12a1724112e01909cbcd8f9c3b08ad + + 447798508d53a6189139f31b455b93c8 + + + b526f0637e912fae979bcfe9f0c9bd74 + 3f3a623e88cb5c62eaa2367195e98b67 + fa2772327f55d8198301fdb8bcfc8158 + f4769f9bdb7466be65088239c12046d1 + a45a4a5dcbd325bcddf893d62fa97efe + 448c34a56d699c29117adc64c43affeb + e18bbf611f2a2e43afc071aa2f4e1512 + 3293616ec0c605c7c2db25829a0a509e + dcb26c7239d850266941e80370e207c1 + 3293616ec0c605c7c2db25829a0a509e + 89889688147bd7575d6327160d64e760 + 8b27bc96115c2d24350f0d09e6a9433f + + + 0c12a1724112e01909cbcd8f9c3b08ad + + + 3dab6c7ded0d18f5754a731aff4af9a6 + 0c12a1724112e01909cbcd8f9c3b08ad + ac60997b4c5691e5c6e7862cecf81548 + 63141cf129939d1a710811458790a1b3 + + + 85b4a58789205a1a33dcf73388238302 + + 0c12a1724112e01909cbcd8f9c3b08ad + + a7acf52d243c149e363cccbf5e86616c + 12b0ac4f04641c1d9464dd6a37e7ccf8 + 3cc11f921f42f416912bf80c271c5927 + 19e7ddb0d0a1d26c2344d5d43bbd4e8a + ed176de9ce5b568d3fda8659263e75b3 + 9a8ebe007c7e0c25d8f868ed3070be85 + 9bfd71d6cdbd2e43f6d3dffb9ba1886b + e210b1bf621e92b937f6069cce77c3ed + c4a260865b8a60a4d90887211d1a3afa + 249e4ae80a00710d08b79ba05b618b8c + + + 42d63af5a20c718d636bdad89647d6ea + 3ddeb1e1e3570f0d462564dedcdc423f + 238b7c38e80ca2dac97d29d16a9dd8ae + 4e1c295da58bb40caebb8459a5daad11 + bf1fc0c1ee1a6fe6a838a3a12370fddc + 550edb0851a90f469565435c1978d7c5 + f29638fdf48a27d35468511de46fd0a6 + 53b177406ad3974bb5245bf003cbf8ba + 0762d4287fd7cb9cd02d3da2cbd82f3d + ece337f6fc774f9a0d19e2943c774776 + 85ce8acd840e011fe8c1acbfb37eb726 + 590c27d5421ad57e2d5d06c0e20d11c6 + 9c84140cee637b9725ee0958e737f05d + b671c9f6aa4151d428a09b439740f60d + + + 42d63af5a20c718d636bdad89647d6ea + 3ddeb1e1e3570f0d462564dedcdc423f + b671c9f6aa4151d428a09b439740f60d + 0762d4287fd7cb9cd02d3da2cbd82f3d + 5e1c31a3252dec9316dfaf1c0071c274 + 9a3f20bbe51e7a41b37f748b275159f8 + 82eba473e31e00e4c8211875534c74e7 + 0c12a1724112e01909cbcd8f9c3b08ad + 1bd98a8a8886ee4ff1014c3e170a6596 + bf1fc0c1ee1a6fe6a838a3a12370fddc + 59c0f00912e852f7f35254464f9dddd1 + 2d444de4e0ca2f8db6c81c19bfc3b356 + 050f98af8f8210ef3727982d15a4dfab + 1738b09b55c8b98f3196aa1faf7604a6 + 919d1dcd0e1fdd40934f0b06e6450f49 + 697ae8cbc234c74fa9347387fb05b30b + + + d6f2a133dcb7f8d3fcd1b3d740ff8c1b + 308e14bc44a4527aabfe9ef8eb105e72 + 417e098c48b30d178d045a729d47ac42 + d2dd42d19471a0c07c6e57d7394a6539 + c689aa12ae6328c59d2791be76b782a0 + b3866d37ef70e8e67062d381cc2d9267 + bc55fcd45783aa5a78ea5a51c19a3e12 + ab320104d3345510ae7184a9c72c0a20 + ea863fa1730ab9179854d6133a73cd93 + + + 0c12a1724112e01909cbcd8f9c3b08ad + efedb473f3a799e47c5d1c8930652d4d + 8d348a1faeb501fa5a0f0bb1dac2c272 + e435f7defa654998d06c7540eed3ec9e + 11cf701cb7c4a7e0ca3a689718ab5182 + 89d56912799b04cddc228bd8d65c8221 + cf92144875b5e6a10d7d1df42fc266d8 + 2651fc700a79ef6fa1fb8a28aaee5cb5 + bd5d8b323403c90e0f4d719efebe00b4 + 4343d3ebae2d778ae1b5fb451752f94d + + 0c12a1724112e01909cbcd8f9c3b08ad + + + + 0c12a1724112e01909cbcd8f9c3b08ad + + + 0c12a1724112e01909cbcd8f9c3b08ad + 19ddab0869a1af8058a2b262b4389948 + ce1e7d904004f773f72b8175b63b3c3f + 5c352f5de6b1681f4c4645d8983fd4cf + + + 0c12a1724112e01909cbcd8f9c3b08ad + edcd7094d7f4dd215b441714becb4159 + + 0c12a1724112e01909cbcd8f9c3b08ad + + b3f3de5f41b9b66fcfc02caddddda1c1 + + + 0c12a1724112e01909cbcd8f9c3b08ad + + 0c12a1724112e01909cbcd8f9c3b08ad + + + + 0c12a1724112e01909cbcd8f9c3b08ad + f3a5d0dc0dc49277322c322052557689 + + 82b6f7c9183dba3273b8e89374a1a675 + 0c12a1724112e01909cbcd8f9c3b08ad + + + + 2c4cd43bcbb18bc950f6258ee331ff81 + 0c12a1724112e01909cbcd8f9c3b08ad + 930fa2278ba9cfff9b2fcb503586c6fe + 437e5657623826cd6ada109b6e811ec1 + 141ec0c0c62b7860081fbf4a7ffee916 + 56ebfd060c86dbe058738e22c3aae93e + 2692ad7a7d6908753a55a9212e4a933c + + fc670e8d9e7b08791bb6e03efc108d5a + 7b24b59ebb51df1335f79fe6afcbb94a + 0c12a1724112e01909cbcd8f9c3b08ad + + 0c12a1724112e01909cbcd8f9c3b08ad + + 94706caa5207dfd6e1ed382ffeea2380 + + + + 4ef954de955cbc4b1046808b174ccfc9 + 0c12a1724112e01909cbcd8f9c3b08ad + 4880b017f43cb9380e04b3bf432fb9c0 + 3d9bb54673e7babda20651e6b9aa50c4 + 0e031bf35793de4353c29ac3be634fd6 + 44c4490c42e1855015364b7a58d0f70a + + + + cecd52fdd822b3b04d7ed872b5d29d34 + + a47e2599a4ed214fb6c62d352ee7ca48 + 3d7231c09abcaa8654ccb4e518670110 + 636e1e6f34f7bea2d3d08db7fcdf6d37 + + + + d3808052e9570ef0da4627b38f3f647a + + + d3808052e9570ef0da4627b38f3f647a + 45ee4c9e87b33227b0e99e410ab960da + + + cecd52fdd822b3b04d7ed872b5d29d34 + + a47e2599a4ed214fb6c62d352ee7ca48 + + b94db2c180f5b977d4fa9af5af038a88 + + 95f710715aeff051a23b1d676a5f48c1 + + df2245deea689f2ccd8d9774f20b9e75 + 823711347583e4559313a808ec356fb0 + 99dd0322d7c07cac3ac967a40c3a2fb5 + b3a344a5cf4f2152c23b0cebd2f7a9d2 + + + + afa56f90e90ee2b38b680a75069f4ec4 + d3808052e9570ef0da4627b38f3f647a + 62c10322d783eaa8f70bc208312147c7 + 06add51e6191b6e6c33f839e7f2267fd + 4ba2c160234718cadd1537144edef9fc + ebc9699f6c8cbd625fd328e04b51c6fc + 18402c8a03b1c940c3e7c658a50ae1d2 + + + + b0f6427a56e93cf9793df0ae1b8bbc7e + + + ee7653b7c02ebeb1ba15644651603b80 + c2fb822ab2ae027c5ef018c27193d24d + + cff077193badd689b4be81ade082501b + ee7653b7c02ebeb1ba15644651603b80 + 6ba7959e6e222b6920a9e4c4f12c3075 + 879255db877c1a12ca0b7e74bd7fec48 + 1d6c323122cb0280188f247d7df5dcac + da1b0be9cf25f407cd3f6a683c14a35f + + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + 92f7e7ad17f08fd04b2c804cd0d468c9 + + ea2e0d006a63bcda34b0de3781e1910b + 41434cd0b30a141fc7cd00bf881af7a8 + 4ae160151c6d01c60216fc103116728e + ad2476204a4e7224f0c4e5402bf4640d + 36bf04c8a7960a0f2b5a58f1f2c6cc79 + 5d4b9a1700354fd3f65d020de0e16eab + 2a09690ced6ec0c9af5562655226aeb0 + + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + c2fb822ab2ae027c5ef018c27193d24d + + ff0f81239007caab84e3ce15b0763071 + 4ae160151c6d01c60216fc103116728e + 5031daea364d99a69099bba8869d6332 + b883e21d0f72e8c5bad7fe2dc84387b1 + 78ca25c28407ae78779a2bd02af4c732 + + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + c2fb822ab2ae027c5ef018c27193d24d + + d665eff0efe9663eaffffd9dbc374185 + 4ae160151c6d01c60216fc103116728e + b9f04d143e44e57a0d9742edffa82675 + 35c42f6c9fc70cd8b6803c345723d5ae + d01210e6d888a14f9ae79e4257dbf034 + 488903295c2965e4aede95807ca055c3 + + + + b0f6427a56e93cf9793df0ae1b8bbc7e + + + ee7653b7c02ebeb1ba15644651603b80 + c2fb822ab2ae027c5ef018c27193d24d + + cff077193badd689b4be81ade082501b + ee7653b7c02ebeb1ba15644651603b80 + 2d219d83da85d8ac9e1c6b9448cf1846 + e2b2fe8eb1fc5d5c0926651da8ecaf11 + 1d97d86a346bb35043e95a7336443520 + 3632e85a521cd6991aaf94d2eaf2683b + + + + b0f6427a56e93cf9793df0ae1b8bbc7e + + + ee7653b7c02ebeb1ba15644651603b80 + c2fb822ab2ae027c5ef018c27193d24d + + 03da7e11397e71ab2de684c99897ca3a + ee7653b7c02ebeb1ba15644651603b80 + 6ed8f279b479a3a38078fa812f2ed965 + 21c4a3073d3cdb9dcc3f1a4692f25f5b + e56a6e9cdbdb13bda5e5463491f0eef2 + 0d118195927aab08f30127ec2a607b0f + + d106b2a1a58b55ba948cb98bbf56012c + + + b0f6427a56e93cf9793df0ae1b8bbc7e + + + ee7653b7c02ebeb1ba15644651603b80 + c2fb822ab2ae027c5ef018c27193d24d + + cff077193badd689b4be81ade082501b + ee7653b7c02ebeb1ba15644651603b80 + e0adde989cc3f927524fcbb835c28de9 + 8caecf1cb7fa241c0028fcc0fbcf07a1 + f5b379dedde35154b8a3ca9145b380f4 + + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + e65af7aa556e5fff3f366d6f5a8fe7c1 + + 2eaa791c64cb4c7767456880e2ba99bc + 4ae160151c6d01c60216fc103116728e + e4bed2e43c2232a7e2343b208d2c7b1d + 02410e0a0322b4c994e797556f530ba5 + 9c25ae86fbdd4b12e04f38ab90862cc1 + + + + 4ae160151c6d01c60216fc103116728e + bd78a61afaaffa8ee3d3cea6651ab0a4 + 099942f17352a29f993a39ba354ea120 + 425ee765e6def570e8204aa144fc00a9 + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + e65af7aa556e5fff3f366d6f5a8fe7c1 + + e6038010ea1be6f1d123876169bd64a9 + 0edf2f374ab1620fc35fc1a48dfb4842 + 4ae160151c6d01c60216fc103116728e + 68d4d1fd5532775b4714de07c70603a4 + 3b3389c5911454191c2a100689cd51f6 + + + + abf7357e411386257d6d47fbe9f15161 + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + c61a6b0139f3adc9e2954b8b6f57cec4 + + 769ebd90cd178c5534c2383306f7a69e + 684adb58412fca3160a286d89b436657 + 4ae160151c6d01c60216fc103116728e + 00432ae881feffc726a4f8c9f1cb7ba5 + 8a284ab3b2a832cfc6c3761e4684c070 + 5e9651946310624b15268c602357453e + + + + b0f6427a56e93cf9793df0ae1b8bbc7e + + + ee7653b7c02ebeb1ba15644651603b80 + 92f7e7ad17f08fd04b2c804cd0d468c9 + + 6e52400f89be31eb611eb7abb081f3b7 + e17aaa4af3ac4d768f8979799ac7c297 + ee7653b7c02ebeb1ba15644651603b80 + 8d7d2d9e9522b39511a289f7d9b35ded + fb5fbd8f8c529b4eb562ef4b57593d38 + 6d7a384082b8d2d2235ef2942d4dee3d + 87474d57928ef4e42c2096471cdf568f + + + + b0f6427a56e93cf9793df0ae1b8bbc7e + + + ee7653b7c02ebeb1ba15644651603b80 + 92e48c231282f51691ee0e200d102b02 + + 6d7ab209bfcf8dc536e6a786f185a25a + 386c6354d6af49c848b8150b65379cbc + b0f6427a56e93cf9793df0ae1b8bbc7e + 27b7e3ebf1ac4d16dd0fb675b125344e + 2dd82840e5a2d87e6541c6972883e0c7 + + + + b0f6427a56e93cf9793df0ae1b8bbc7e + + + ee7653b7c02ebeb1ba15644651603b80 + 92f7e7ad17f08fd04b2c804cd0d468c9 + + 27cf54d9de2b31454cada52efa862617 + ee7653b7c02ebeb1ba15644651603b80 + adf91dd39d8e14e57497209834aaed15 + 346bd2f3a522846c5c3855b993c026f7 + d9ddf03f9f0e67fa748435488782252f + + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + cc8078d0096ebb3c3aa1c2d30c4f0d03 + + 9a0cd9239016b81235ac707173470c38 + 4ae160151c6d01c60216fc103116728e + 809aa043d0dfe1c70339a4289d192930 + a1dd3dbdc6a0ea436af0b2d415c99f45 + 6af8e3b649e8a4bb6e0102d4446d3324 + 223b7a94e1bab1cd3fc92c4fcd168591 + + + + b0f6427a56e93cf9793df0ae1b8bbc7e + + + ee7653b7c02ebeb1ba15644651603b80 + c2fb822ab2ae027c5ef018c27193d24d + + cf1f5b7550078070625d8204ec0bcef7 + ee7653b7c02ebeb1ba15644651603b80 + 65d6042401f0f29c2749295e6c8ceaee + 390b0301827e561f7f0b0feb2cbb2254 + 4da676c2c926c9e5e34ff598439d31db + c46e0125eff9a103040ad0db937fad91 + + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + ea908f7dfe5c8adba66f6be0a4dc65dd + + 06e1643c5bb4b3ca459cc87cc5505278 + add0447089e7ba68b33250af00bc978d + 4ae160151c6d01c60216fc103116728e + 4029dca2cae6e1c18a577d93bea0dac1 + ce86fcc31a4454b0643f59d0add87871 + 7dbb978141b0b74438aab5ff05ce58b8 + + + + 34869384b3e86fc68c1dc3c1511940b4 + + + ee7653b7c02ebeb1ba15644651603b80 + e65af7aa556e5fff3f366d6f5a8fe7c1 + + 4e71a8f5e999f851db9b6983d426f4e0 + bd61b02a285f83543f8d916bf3fd0e0f + cd8fc0b098127760d927dc212a8597d2 + 7e1761d4b5c9c1a93c1e2a1ab016b11b + 53871a982ae9f8b65f77a383d0fed5c4 + + + + 4ae160151c6d01c60216fc103116728e + + + 4ae160151c6d01c60216fc103116728e + c2fb822ab2ae027c5ef018c27193d24d + + ae770db395458ca9d64d5dedce2335c4 + 4ae160151c6d01c60216fc103116728e + 01cde6c321e93d479592a2ae42e5c624 + 579f8ff53e1f7e07a7e54164acc86155 + c4318c75e98d38a93b668585d4194465 + + + + 4ae160151c6d01c60216fc103116728e + 71e2f7d67e2865d6a0bfb86f42154fb4 + 8f565a90c7772304a5cd661f5c893c15 + + + 4ae160151c6d01c60216fc103116728e + + 4ae160151c6d01c60216fc103116728e + 04a92215ead4cab8361b9b310cb1d7c2 + + + + ec967aeab4fe4dbcbffd8097dda2d17c + 5452c6f6a92bc810c6e73210adfece55 + eab7a4b5ee7f355e82c35a25542bb73d + 4ae160151c6d01c60216fc103116728e + 06c1138575ab8c84da3d0ca1225a3994 + a216149cc722f1e24b5d3d266d623a09 + bc6b8d0cfbf337b153ae599072112b00 + ca7169ae9939f95bd5341772f43a7eb2 + ca2f8d1c0c7a6830ef94b57264bc3b72 + c02d68433654ed03d38fdc6c2ae90112 + 5e07cbde941cc1e24cbabe1c9a6c995a + + + 4ae160151c6d01c60216fc103116728e + + 06986c4a2ec6a7f3891f86bd42d64d85 + 4ae160151c6d01c60216fc103116728e + + 55cd0641cddf48523ff4443f2a03485b + + + eab7a4b5ee7f355e82c35a25542bb73d + c02d68433654ed03d38fdc6c2ae90112 + bc6b8d0cfbf337b153ae599072112b00 + ec967aeab4fe4dbcbffd8097dda2d17c + ca2f8d1c0c7a6830ef94b57264bc3b72 + ca2f8d1c0c7a6830ef94b57264bc3b72 + a216149cc722f1e24b5d3d266d623a09 + ca7169ae9939f95bd5341772f43a7eb2 + 06c1138575ab8c84da3d0ca1225a3994 + c02d68433654ed03d38fdc6c2ae90112 + 5452c6f6a92bc810c6e73210adfece55 + db15042374ff70f3c24036ba7356c25a + a216149cc722f1e24b5d3d266d623a09 + 5e07cbde941cc1e24cbabe1c9a6c995a + ec967aeab4fe4dbcbffd8097dda2d17c + 5e07cbde941cc1e24cbabe1c9a6c995a + 5952af3b17305368a35612819901d6c3 + bc6b8d0cfbf337b153ae599072112b00 + 5452c6f6a92bc810c6e73210adfece55 + eab7a4b5ee7f355e82c35a25542bb73d + + + fdff1d567571724f46df3b690c6889fd + 4ae160151c6d01c60216fc103116728e + bef29bd807b97049002be7c6ceab1485 + 700bc73e6d5a4793663eb43f6d504b3a + f69b1b49c4b1bb782a89b6ec7f8c077e + e9a68fbed9e5eb5d50fdac3a8332ee41 + 07592b71d106df842b8eac648fb0e914 + + + dd696af265ee44ae894d583b7c980e19 + + 4ae160151c6d01c60216fc103116728e + ac09a703f18fabe328bfa30a49370ca4 + ecbaed29d61e6b933adc7d8d11afb2d5 + + + 4ae160151c6d01c60216fc103116728e + 08fa9c9c7ad9ffeb338ab15064bfc036 + 4900d670f8a3b7ef06c67d9f0bb8b4a8 + 77495e025b18f39392c7ffe57864d3d5 + + 4ae160151c6d01c60216fc103116728e + 9e71b075d7904e88353b0c1580a0b15e + + fefabedc7e6c6db8cdd2ff66cb3eb755 + 98c837e893861d956ccf419cc73abe11 + 5a0b0d6f8ae3c972bb9763c9ea6525cd + 955b39e8d17b964f807d75a17cac2332 + 43dc7f42fa4d25333e4bd2e4fcddd746 + 69c31938fcc776ead019174f21c59d43 + + 4514969422dfc0a51fe0e460c4e8ef4c + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + 5119565d69cd68fae2e2a709363f8754 + + + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + + 5119565d69cd68fae2e2a709363f8754 + + + + 5119565d69cd68fae2e2a709363f8754 + + + + 5119565d69cd68fae2e2a709363f8754 + + 3b98e7b96261843cd752c96a0dc5105d + + + 19b2638a9e169644156d5e2d7aee534e + adf6c13b8a589583a54e7e0686a41f46 + 0e620e5269667057a3c28ed6a37bc0a7 + 41eecb14813421837143c0df3ccd1d67 + c2521e097d4b81800c1931073d2ddc2a + d71d89f5866714d592c4af798186dd73 + 31493b4ba7fe5bbd65a85a434a404a45 + 3822b5c81d049461c572d66041bf37f4 + 5119565d69cd68fae2e2a709363f8754 + 73a1e7ab2d0a71bafa95c5db2c57beaf + 2cf5a431faa91ef6be4d3d4988c6243b + c3bba375ce413245f9e185eccc9ad7e9 + 3c5a8f32a5a01af2211227e441de64b0 + 4d39799b3b3347ec187a0d221495908f + 47ddf5fc4b48a2167bbc5e5e53e5a81e + ccc6557e560db36b1ee714a4be56311f + 5d477d53a72ab4b2ce5313c0c97f15e1 + 52bab44ac4eb5f1ca0b400367e32cf36 + d87ac8263c0b56ffe00e753620d212a1 + 0e3e828daa49ac97206721ceb32d8f6a + e798dd03ccaaa2e34f43f171ac74b20e + f3d01946b7fbb1dcd2f925da0607b5b1 + 3172e65b0a3f17cfaf9142c419046289 + 83225590a6440c660bbb0ef71ba77c03 + 7999b187a1f578f751a1908eb8848db3 + 5d829e9d0586a46d6ef6f4c94001f1fa + a94cbd75f30e198f497d6907d8368749 + fc8f3c5dd35fe98c01108e629f44f7c9 + f5c86c5198538cdd39e0f156c070dbc6 + ba8720a9a2fcd79d7bbac76b6758eec2 + ad36dc1a8b6448c9e1a074d1224964cb + 4bd96f28343cc8fffcfe77a8d13a44d7 + d4cbdd81f5449eb2db37d10cf6c8d896 + 04ef72b08c697bb47611d870dc073374 + 6e27c9332134cf1045c346eda58ffded + 6291550eb3762589ba0fc52bfa308ee4 + d694dae1e88de6514a3d2e3c9227553c + de01eb4a67d3983a7ba3cef02a057ed1 + 4514969422dfc0a51fe0e460c4e8ef4c + + + + + 6ac45b8c98b24b1efe36a9473e6b3cce + + + 94446842772a79ca655eb8df0f8b6123 + + 945987ddd2d1be1b58938d2cffaba70a + df217990c4ca2c9571be7364d4e3749f + 224524ddb35542f9b340162f46628ba9 + 42d87aff5f124c1c4976440114d54eec + 9fe5abb41de3724c9f0a9d60c18434c5 + 6aa74a5ae111338e01c23b641357cdeb + dab09a4a812a0f99672768860a12146d + 0d3550bdcc889de0daec7687e842167a + af88c11ae4fb79a16c55c620633d3887 + + + 4bf3c1f5acb1b9fbf126c80663906a0e + f083d3b50dfa6315edc8cf553c12d9b4 + 6a4bce39b2490fe125d1e16f5b2cc72a + + 8bbe8f336ad1c82c8750c50117e57c89 + 0dfd7b5adb1f58b53289d650d2c3cb9d + c82120359a2017c844db41d08d09bf9f + + + f076852c48dce83fcd6ff38d1c648e4b + f365b915d34a2f63e4e3bbd6915a4ba9 + d314222ddfb466cd430b9dee9db5372b + 45ce1477e96086d1974476976377181a + 4e0066ca948b7b3514c74cdb1e6729f6 + + + 06c64bae4469062105f284798237a1d1 + + + + e5fdb1f668875e27640566ca4e6e3ba3 + 354c5e508d83828d3a7b887e1905cd31 + 67841ee3f77c1fc79c75e08366ea3e5c + fb7a55d0221e860d23047b5fc70dbc1a + + d854d34c834f7aac0e585187b1ffd396 + + 8db276d6adb2daae15ccc2b25c350568 + 2c159982825b0ae7f50d4806a3be488b + cb3e61ded8a900b041471f2e0e851077 + + e00256b5f403b65d99d5ea0c4cbb0100 + + + 5098707cd2f2c21246f842d9918b7203 + + 984d7d4570b4a72a1851ac04c119927a + 6b6071d954306d1b5eed18e204611783 + + + 049dd1db438a32e2211a02a6d7d97203 + + 1a40e5ea8f180c27918290dc86e1dcf2 + 459c011247cbbc6b393b9ccb03ed793a + + + dd644704c308c9752972358233c78340 + f050ac40bad932ea09b64eb0b7bba98b + f6b4fb4ae14e92be550317d8f2b13ef2 + b5df26a1e806fcec3dce22ba5dee666f + + + af1ce81b77cca49acb4868c0a672cde6 + + + + + af8b51347ccc0c687434a5e36c069264 + 248c9ad0f221a4fbb38030c2852b81e3 + 113102563e8f2dff3ddef03a257143c6 + 532580ccb6c250ef80d1ad1f5d23ca0e + fdb086c016a7b5234882345fa7b22337 + 08853339cdc4158199a133b72952df26 + 8c556ae4e8ba09070dcb3a2840fc8180 + f9aedd74ca6883963e0ea6f51e4a27f9 + + + 9a572bfdb5b547e98ca0401984bb866d + 36977523fed4d1ff2caeb82768c0d6a8 + + + + 84bb39db9335594fb3e401ca90648559 + + 89f47e154ecdee4cf8116122aea0d604 + c904274baac59d212b886bad364eb72b + 14a46f78a3ebf2373e5b40c034c9a1d8 + cda1d0b1262834b44900e729251d2d39 + 481ada5850927de1ec26ed2dd1dbd1eb + 3cc756a38c0e2e7f3343e186d814a092 + 94c26fefa74f94578d6eb36ec81b6b4a + c52ee9c8de45d3fa97d337451885b42e + + + 1cdfba5e1dfe8c77881836ec9d585c4a + 41c146f56b91a37f4757705963d2861b + 2d845926818aaad1e0aa8415bfbede91 + 32c87e0e971a910436bdcde0ec5ccb36 + + + 2c8af4d61b6d86db8cc59daed30a8550 + + + 01cc7ca96c0660e2e49cc81dd2a7caa4 + + 8111e97a60daa200f981d453b508534f + a6514bf32704b507fa41944b42b064b3 + c4a62e52d1629e45b29161defd82e581 + 5421d81ba8e12107b22cf93a44aaa9a3 + 814a8b05732138d5ba75ef9948f24caa + + cf83fe892a5617cd9cd033f7882c4fc5 + 85a80629804a826be269885fef8a3cbe + 37cafa5810f171b059a563cbee5af68e + 62772f3b78120b7d557d23b7fa4e0bb4 + + + + b257ef08149d872afbf4c673eadd2e0a + b8e61946420c3beefe48175f53c9f285 + 8ae11b51024f2e384c9c47ae483da014 + d486ebb889bd6d66898cd36292f88c8d + 5f56786a1458c7e807bec31877c6d1f6 + + c1005d7a67c0c9b31008cea86f709648 + d0cbac0adcc1422f45b5e35023a83f43 + 6ce5e5a5572bd7741eba4cdb4f741575 + bca5358e74ece530c2e0be779fd713c8 + ab742fb6d2369073c435143ab23ee1a4 + 54ba9f556ef9e436d08bbce8664bf38a + + + 3f6e4c868ba14e37f70ad3a2332c2054 + + 9bde6e6b2d614ed80b056a87409d7e27 + 607d864ab61b9a9a1883dd674e88993a + a2fe2788670f2dd864de6fd535b2082c + ece424457b8c684f089dd9b018fe779c + a0066f013e19e3e3a84c8863a96b2d94 + aef646a860faad1534c5ae0ed5b8873d + d39e22a05b763e5d581c83e0ab85a0b3 + ecee579c590b1c2f5925e589be4ad32f + b465486e047af9ae0033d0dc29173e20 + 5f31bafe188468170c4c10673c9f63c6 + d33e4403174c77b4c283ebe75738ee72 + 00bef70061861f581ec9191024f17c73 + 1bff7a9e0c2bfc93cf37dce579178535 + 5201e77984c0052fdf31e38973f7dfa5 + + + 2f7ecd77b0b72b0f6cc620b1722e2332 + b4b09673c1b1b0868d49eeba2d751241 + + + 7383c4f8ab8ec2a89256172323bb6615 + 0070d6a3d7dc46ea0c5b671903c1eb5d + 1e2c4f095ef40735d7022766916aba6e + + dac034ad628344db492080dcb9ebc588 + + + e8fc8c0c53734329a917a1222b5eac76 + + 402f4dcf7c356e3b5ae6a2e274c27e11 + 659b4e194869ce60486d943e0adb0275 + 71dd2fe0e64a8b57d66d9733a4f52086 + 06432784eac47af3ad46f9cb8d189603 + cdb7eafd4eb6a66a71e9042897155ce1 + + + 29888b45409e5fa7d0c01817a38712c0 + d633111d9f8d4f0b7f30f8842c2b5886 + + ddb1d1336251a9b38fc475af0f023089 + + + + b521c2b39eaddfd9026cd4f87105ebea + 1ea86aacb6f8aa4c6cb1c78711ad1219 + 2457c334def5f63e97e0053f8513b109 + ccfddca3a345098ce99b05cf263e4c64 + + 0cbd49bda7b567826c6da3cd5ee93e78 + + c5aa7415ab3d4b66f07768b234a689d6 + + + + + f763512d3d9b4bc6bba71e0d8b533e13 + 8a22f197dd435ce11a4b8d55c0488d6c + 56acbe0d624f8a1ba761c61a5c2f11a8 + 6cc3fa66080d749c534348fbb64e1aa0 + 5d9629447c297b9410d5347954d363a2 + be9d11179eafc4902f8571661d4a7267 + 4678f431d139fce44e238329375d9d08 + 89a20659a92f6a38b44c7e975a05d3e0 + 73def68e98a06fb96d10dceb015d44b1 + c15efdcc7d076bb0773501fa81229725 + 6801a3d4432b53553d8f23567a61459a + f39276368fc271009859ea09589115e3 + + + 7dd692b179691cb0f6606215ea9ea63c + + 4d16eb8af58048f5bb83919fd9c820d9 + + 4fe209e432389205ca07ad8d33fdfb54 + fd5c4484f8fae67b646f379b2110c8e5 + 4b8f90587a9494c2704c147d807b57d2 + + 89abb43c6725f3baafd98e1e83b262e7 + 6809ca8e29bb4c79949e4862f9f33fb9 + + + + 0521f6186dab90953ba946918e795694 + + 53a8b5b5ddfe1f93b6905d28608add98 + f088ba64b7d6e476a480339e2c577ec5 + 85c40a5093b6eac05d4fb9e0dc45cda8 + + + + 184450385bd6cd0a2554aaffa32b7cc8 + 1deb979238d1485dea70d255831da8eb + + + 07431bf53638cea63b0dc3fb4b39ba38 + + + + 66eeadd7668b753f88d641a9b17fe502 + 8bdd8a6de618c4e90af63391e87dcd16 + d185917b403fb503e1d41ffffc2b4124 + ba5b80f8967eed0a5240abd0d47292b3 + 7c64c056f7f0490c7bf490dc6701ff7a + 80ba8056487a69e885a4973c3e103e07 + + + 124f79ee83cd08b7a3eb4f77889a25a1 + + + 0c77fb6476cfb45c1df574f86d72ad0a + + b0314db41a45eb56a80e84f1ba887841 + + 40ac9ac74dbc192145c8ee77349b8c90 + 7e28a72cbe97298d70c35adc3e14dbd6 + + + c9ae0a655c8eb91a8be76b3f15179ba7 + + 2a58423e145aab10bc6f6aa514e55217 + + + + 9675f2b11fcdecee03dcfbccf2bbc170 + + cf482e615ea2bcdcf062c6f9b4dfe728 + 0688072630f72c327cd42c49f7b5bd5c + 6cc07f6277eb5d072fd861629e0f7ee2 + 27f454e9d0673b739870d649010ae880 + d3935ac7dcd57624a49770b1b32708ab + 9c17966569c9ad4ba7f7a043ca2db45d + c6e3bf23c139c72659ef8af6f55e7965 + 7c62beb1f996641e694d5afaf867555c + 7bb742f360b8d3320ab529647f165cb3 + 4c2f9be40614a501a7afe46ae3ae1b4b + 5120eee18638dd711fb1ca2b04c8db89 + 4538b868c389bdc9e49a75768aab8563 + + + 435a7383936b76c58f24bdc286b4e8ff + 651dfa59e038eaaab1141194dbcb747a + d05c6ee29f04c50b9307dd4f3766cb02 + + + 4846313ef8aa29715da73d7049a00dc2 + + acea2dc4b206f28b655728fc8ba1595f + + + 466cafbb04e9bcaf2086e5f8fdb59415 + + 8abe584961769ae72d54b0d3cc64d60e + 1864327a1ded5ac16e993b856f0ef86d + 6e49dcbb7c96ee7e38519f703e5def4f + efca5127b8c9f2b9e5bb0fcfd9b64352 + 52e4b9b6304e111de4f744213e7ebbd8 + 3f8bdc0f51f9388758a6a2f207a47ac7 + ac2c5f6b3a3dc717844c2c3d3d6f0178 + 2c03e44ec2ee3406cb698f5d9d9fdb29 + 843bec52174dfbacc43b1ad03381ad28 + f9c3c3d566d0c759a5dac7ebf21b0853 + + + 1e6b50c5f9b7fe114f729fbb438000dc + 85f19cb51e65cdabf5097e7099394f26 + 8f7dab3362fc0590142fe7e1e3a62af6 + e2994f592ab488c089121d4c2d5cc119 + a217047fbb069efa62bfdc74b5d07bea + 036bd2ac782a5e0501e3df79d3720879 + fe02d49c23815090336764f7652a2a78 + + 1f9bb90ff208d3ba90e1614a39f748af + 6ee544245e43502348fab1e2d0627ac7 + + + + d9f57d24c1e063218f2f6ea0e95d16b7 + 241b345cb0a7ab2a1c0e31d0d5664747 + 9efd1a3415b3696e083adaba317ba610 + + + 3c182f5bfeb634e928e6a2b0a54c4061 + + + + 24fcc718fbb967f0f4368e32027b8f3a + 5c5ab103247ff917d4c288a4fafac2b5 + + + 4a27345fb0ecb44d7adcca85f09da1a5 + + + c8c287093ae9012ad47495ef8d4eb0f9 + ab4c08b697855ac657f0ed7dc5698dd9 + + + 0218386971100e6376eeaeacbb781966 + 6ba87679a9bbe7adc4d5d8bc83550349 + 020202f6f7746e91526ef1d760821d68 + 41c47c1377ac5068fa6c8637594cb079 + c12c8b3404d11530cd11736e8e5759e0 + 43647ee7bc5a16e54f7dabd9e93cd1ac + + + a02667981cd99d648833cfbc634fc46b + + 3d97d9f52ccf4afc14fae2b259ad813f + + 362455dcc065f426155ddc22882794a7 + 4cf5aeec6afc0c328c3f764c8e02f71f + f68f08e455f94ed17821b4dd2dd92ec4 + + + + ebf927a7763745866cefbe208e6f98eb + 0496987b7eaadba5e461083e8341ff1a + + + c6d64aaa12b7d8213dff4d40a06ce62f + + ee0b511cafc9779570ac5ef7e395462f + + 5c89ee378a80018191073b5d8678f8ae + 9d769c13c89dfc97ce3e49927240239f + 870de12f74a3e7cb53a87281115a61c9 + 081664b9097d8dab503a980f25156155 + + + bcef4ae457cea941faa459c60a21fc63 + c48890f202c7f32603c862fcfa41f721 + + 19712aaf1b05265797922327de3ef866 + 95bfc345410ffdb70b6de784724670e2 + 8f395a695e685014f278abdfb9ea864c + 2a1ef84dbd0b77fc88cdf48f427909a6 + + + d7c96550d1bb43217bf85080250912d4 + + 4ae220aa9d1befffa031f3064de89ce9 + ee0ec504fbc1d3c14c6762594c3df931 + + + ba3d38ded9e33027da5d9146b441fe3b + + 0ef1c7ad38dea609e792991c39097099 + + + + 3a1a9ab4b177db1af0caa7857e890a98 + e45108b315e3527fc4e99343656a6694 + c0ce4009e2df82302b5a3782a80ce701 + d2f3d9741a0c4e75efbc0d837421cbdc + d2aa01e1738327a5229cb907f3b01abe + e2c7237dc37cf103d279d165b6452309 + 61a29b8560c4a2b737eb5816e8bdd45e + ffc4587d786e7a00a81ef47260433d36 + c4cc2228b8a6b0504a4a9243f1e69a75 + 41e9ce724e80cabf644f1a39c6f8dd38 + d56ec65324a1c826347261c0098ad06a + 4f73bad82a9061792a3b36f9eeec0e9d + 2f79d8b32955aff4e1c9bcf5a5a56b45 + 9cb27d42bbc3d9b4fb3bb8a05cc962fa + c2c3fd9cbb1aa242876a5ece9c79efc7 + 5995861329596a1cdcee789eb366e114 + e550b6f4c6d71a7d927b0690e71b7441 + fa51fabfebe58c643bba8f722884094e + 6898d6b63643c272f7be90ed697d0909 + 12f5372d4995cc93371694cc6a61858c + + + + f0c8c08d12c549b64c2ceb36c3c26211 + 09f7ab10bbf0c97bb550c090a287f1a2 + 990859ec762c84cd17a1f1e0a19c4c1c + + + + + + 25dadf9a8250407dbda91e65ab359b81 + + + + + + 1a01f38b226cb824a1f9dca4ccf2464a + + + + + 4e0fcf69cc882b8dba4633e62d5bf181 + + 4aacf9c6b2ba60b9b9b5401c96b6470d + + + + + 91bff517c1d122c983ee87104960ff4b + + 8329185e1d4bc6815eeeba77c3176662 + + 47c64e51f23620e34a7450344549a37b + + c3c7c32158f2be478dd01ce977886665 + + + eb298bd344084ed6482a662aebd10093 + + + + d1b491bf01323271280afffb28137f2c + 73cddc3db7dc3a85675fe7b7ccaef07d + d26927a388a1acace3511cb7a12534b3 + 7865cc32acfeed4d442a9aa19985b63c + 18aa1f4eed65a49c9f805e1f79042cf4 + 74bf89177c0be87912bdf1128fe07e41 + 91fc0cb3e10075863c19cc57c1a14ac9 + f34bbf5ab7e6f9ebc5f7fba2779a3e8c + + 50da48b908f437b801b4250e449887c9 + db7386a1917086e38767e38cd7b12aa5 + 1221ef9c3c908cdaa043bdaf5b186dd4 + + + + d15031b4691660b9f5fd5114f435471c + dc8b07ab168255fab035d15c991d234c + 4584b65c9aefda00ef6ecb060d981b5e + b897a797103d4d1370ca187559dc192a + + 83de114ca4b2d991f49ccc7aea97b3fe + a798a82ca3f2bd35891b2c9c7a815800 + cf414ec63f93c3324fdd67788eef7442 + be445d51c60eb2d2c31c68e52709034c + cd39090812971e7b5cb92f2eb72cb917 + + + f3617dc9703123798cfa4d1fad9050a7 + 3b2cbb478036e9292bc5e213fbe90311 + 8de64b96b2dcdb978ea35629b7db7cdd + + + d8a3c04bef50e2852ab33caf0681669e + a3767775d66b5342f197ba634d24d1f8 + b0725da254b475654f1a4bf5e30e7bbc + 65f50686e309bed1b5f588e4a00240a6 + c0cccc5b7ada1c0083d97e5372dc4a36 + bfd5efcb5dab1eca9f812ec52553294a + a7e83bd15cac557a3fe7b5a71cc44453 + e03aa157469acf7ea42f3661a75768ce + c81afcf00ef9f4d7547b5bf258464a8c + bdc7b688ae0b7f42ed5e5ebf140a8e87 + f0f74826789254d06e6265547050de2e + b7dca3b1110dfb9152981b4f34381835 + 1e8057718317733e705bf3d5a3719ea4 + 4ac22b7fbcb732c0c65bdbf6dba0d4e4 + 4a7f0abad216ddd09bd284fd76f0c5b5 + d7b2ccd5c7e1153422acd7e1d8180d1a + + + e8532b28260e3ed8b2363b7380094fa8 + + 7e15cd8bff923fe23a2453d99be4b38f + 3d3776a248511b02ee68182d15b7300b + 037f2bee2cc51858ee25e6d852c4646a + 83e92c8d2cc71853855f78875816c1ff + a2a935e7b7449f27a41d039f722ee9d9 + ebceecc7b7574360667a8609e378fa55 + 927dbabbf9ec2c2cd6d0b8d4f2d5ed30 + + + b8372f70eb718465dbff4031543fc020 + + + 2afcf085f47ee9f3c9baa709ab4f1ece + + + fef4ed8c8470d61b0c29769ed730c631 + + ee2b1fb2d083c2fc0bdcc12647e9b37e + bd8496df70f11290cfd30969e9cf3b28 + ccf95a58c63a248445245d63fabba985 + 2e26247e4bb9ffdacc5fe238fd05a980 + 6f83252312f391ed71234d430e57fd1f + e33e4d57c6b2e2a50a99dfa5000bc915 + + + e3e46299ac95dc01bf7f668390eb8962 + 7aae64e8900260795b1ec7a236d461dc + df2f86455c2c5dac8b7f0b3da0b663bc + 186155aaacffb6010ed5e78f8c01d8dc + + + 0e06b78e29a7ae8cea85f5fe0af7f459 + + + 948d92587e862ad326fe063f3483cb08 + 2edae3d68888148dcd0228f5bd7cdbf5 + 61e943901b554e2249ac7c8f4b999ccf + + + + 91b42430faf3c14449af6eb7459f180f + a3685e6f0ba7dae748868694aeb91658 + 1c5b8f48ca8dbe181c71185d8791114c + edbf86b4d29315151879925d17877d67 + a68f44005d0e1948f1ae3c78240e2b0a + 0a193df335cd1956dd2813b9432e2713 + d386a7fd7a73fcb4a2d7785f7ffd49d6 + + + f4a1e87841f35a07f4b652d6a6f710ce + f00fadd708cbecc73afb38a5d2c6cd8c + + + fae865ecd5dcb8a02743fdd505f94f3c + + 49efe195fe0bef12df5f0919bbeb121a + f8c98f9b1a7e023b7bb15fae6cc4d2b6 + afdcd7fa0750eb0b6e44730c8e1cfb04 + 269643c5f9e6df62e78494016c590afb + + + 7416b4e1b00ca1b250ddf6bd5a5fc543 + + + + 6b64d1f15cdfc5a7ff63020b8f88f95e + 8972227f98f61191e69f0ce56b123486 + + ddbe190ad044a300de1a352c445454fb + + fa256ed24abd8a646ea1d4c2b44c4433 + c1a50bf844cc6d5cd884e99a61f241c8 + + f53dfea5a43225f00c0ca50eeb25401f + f2e1618bb463b52393336959777684f9 + a9974f7f3cf4daca687e4edb603050b9 + 5056a280575da3f78d6e95805b44908f + 932afed5368794223ed6d6dec8e02529 + + + + 9cedcce97cf01ac0c9fe9d6bb50c7825 + 922dcfd4095236df04e21643a2c38160 + + + e28c308fd1288a53e8039d59fb61861a + + 217dfd682745fe8124c95adedd9943de + + 91926379e205ae519cd58df56e64e1db + + + b3b15dba050f75d32f58d3437c03686d + 3d3e86c29e392e5a39ab2573c6f090ef + + + 56bc7739075fb8a29158de6bb2d6afef + d72b09e7144d1ef8e175b3fcf433dec1 + 3504bec4629a93937d72a39b40e9d9cd + + 40be343fafc3f31712c5234bde79e69c + bb25a496e19f3d74da2724e761ebcf51 + 7209a7d3dbeb39d6c22fccdcc38c25a9 + f7386af675754e8b05167a86b14b2922 + 49de51aa8e8a1086d91428db6c7c8dd0 + eb29c3e784adeea4d961a24ea736d048 + 00afab9949c4db123e47d86a9843ae9f + 6c3e26d4e896c8ba5fad9bd09049a5e1 + + + 8611e2abab2b0ec0f3a8e4f752df07d9 + + + c3482496d31672ad5491d5a47223ca73 + + + + b9ec5b473815270ef2ce3e1a60de4381 + + + 7d5ebe9c661bc89d0d02b129d168e36e + + + + 2bee6a5d3fb133cfeec5aac18f46b8de + + + 35c12ca0d99d221f12161f236a7af4a2 + + + 486707b1e25af68eeb0ebc2a6d476706 + + 70093c940edc7660ba7eff504bade294 + 7694729336393db5d4c916f311cf7a1d + 964ef09e2b6baf7d45c194a506e8dbf1 + b79792a97e681bde6abd18fd23ec55f0 + 03ae69df1124a120d93dcf562fbcc895 + 852af0d94f9781cde4b6a9237edb1276 + 5bea4891acf86b8423e8c63a183d8771 + 253527f5d7dab07c8b823623f29dca06 + 43da5fa66e7f1ac5c92b70c9600feada + 7a86a2a399c332c34861625b9655f4df + 6ec048cc93a80b67dc17ff6a3456b8fb + f22e7018eef46c0d1e1e1f0d1e0df7b6 + 9dcc774658463b956003ce8f14c595bd + f720271dba7703df206297b10a4b5b98 + 2f6c4d9339ac8b43cd49c2c1beef2e58 + 3c7fc86b3b6fdc84cd7738d7971be2c3 + afc6f53615ac4549b1a717a2f755009e + 40fc04777510b63b88f999c87a6d69f6 + eebb0ce8995e76a6007ca62c7ef99e40 + e1c75bb8324289c246a516ab814e8652 + 64f9a611e0ddc6ded3ec2965ebca63ec + 7179d5b179c7db28045aad56159e167a + 9b4fe6b445a55736488af59abca10cf5 + 03b21206c71b07834f6c4fddfbf78604 + + + 73c4a9e5d0d51000291f94ec6575164e + d6b4b5667edf8974936472c7923a8f07 + + + 67422d4df01c7c7340050851ee9c71d8 + 586ea00c06edda2707d9c42db4d912fc + e86ee852c9ebfb681c4ffa9f5d280aa2 + + + 23cb5eba3cefae1e37144a860149ed4a + df349ffcb84d711e55ad65f04f86f190 + e18efefae9d207d3d8cc4b7a0910be66 + 6e25cdaaff3c3b12808035f87420923b + 8800873399a1f8f070f028e60af394b7 + 766a63b65092f9d68bd198005f805924 + + 3c0c7fc25c1f435c1e53c46ba49f85f7 + f79b4e4b1fafaa09c7074f1e31df1323 + 93c15bcc86ab4228c2fe7fded8eb5707 + d3e8a2daafc2f91ac9e0d09e11360b08 + bafabc225eb2456fed6e9e68d285399b + ef0ffc9c8f5ba6d87b0848b1d64ba925 + 59a373fc5e50a389b177fd8629a8f531 + 42d44b2720ef2540717222d51c17e4ff + 4a3ea6e89c31befc76649a35395cc761 + + + + 05d126b952d4ed4b05594384c4a1e193 + 1c5bcc8d514f25617aa572b0a5309fca + 586fa9c49f9a7982b429bfc1b4509ec9 + 12c4dfed698f8940a4566d04ab3426d9 + + 1e72e65bba005dd1ef4b2afb72c3e3e5 + + 22d9ffbb59e13550130eb7e6afa535ef + + 3c13d51050431000bb56728d9fdabc39 + + + + 3b997ce2250da07c0bcb9817e7d8bd42 + 11a71c8728ac4d0ce453d2544c3f19de + 0d28662ece73ff6f355c075b948103bd + + f670823c165564cc4e89c578e14c0ca8 + + ebb9d8064cb0bf33a839c208b0f744e2 + + + + + a409288866e5655a448429d66d9c5946 + 67816d5ee393af9e107b3e33f59b698e + e43edfd65b401f69de5d94f3e1ccfc6e + + 129fc51ecef039cd3ece03479b012cc5 + + 8da8da682abdd82e3673358662e034cb + + + + ff96fff98e08cdae303ff1d6669f54c7 + 03e7776d5f4d46dbc9dc6ca62f8c92cc + 1218464126123b30f2e3eb6c8adec69f + 505545c9925f89f9d8c38c2952ea9315 + 62ef476af4037776bdc690a1f54a9ff6 + + + 8e4124f2832c9664541d38153e3758ce + + + a2a1f8476d42fca7829f043a10295d3e + + + + 8b6879a702e839ff01c9a2b90b97e077 + 9e91d8a6316f4795f1cb393586efc060 + 468e88679e6ca83e9e4818b21b18d345 + 1ed7f18d559f8c096d5f368374436d7b + 713e94ab899b6dc89cf9579e7cf907c7 + f1ce17f58c1d4659a754f056f10d2efd + + fbe3fc160dc65c99e6f618c835072f44 + + fdf5755a6416f6b8cd95c626af356598 + + + ad20d75553cd5c3f1d5bc68735f39e5b + 1a035ca2218fa65fefe7c3670fc28480 + + + 837a6f03bb63b038bf8ce2a1ffba74f6 + + + 46c8771f0b952d7f52689d4c8e8e5357 + f33caacf8d0d5ccac6578eb187829ab7 + 191623d2487349a97c8ebfc554e2e0fc + 79a5663b595c6e0398e260af4bcec99c + + a645855e0936043ddd6b0d1ef7cda0a4 + + + 8bc7139689a989116af9332d39204d94 + + + bf1d96f54af04ab908f61ce481302f7d + + + e3a4a4c6de49fb492af4daf58a439631 + ae7a6974c88491afb0f7ea7fec0c4ff7 + + 0ba4fc72f7fb6f78ddc5cf9af9462898 + + 20f5d5ee4d3e22513838657ab39b7b8e + be34d764aafb07101b6391ace77a49d9 + 232085ebebe785046c9b4216abd43e40 + + 7be5ed3e5d3dbf8f205e684ba70dff1a + + + + 1b3449b9cf33412b4368678f9c9329c6 + 7710827a39a5b3119d94df11a49b41c7 + 41b7b46349116cddd4810cc0e985421f + e38aac11cca012bf3fbef5a2a14d9711 + a470d94cb685e23ae0b86eb70dfe471d + 95a77ee06129373d8939fd530a1ed9f1 + 97e2eb95bbec5f8b740f4a79a968a6c2 + 0850718a05e3b39aa6593bd1b6341dc3 + 11a6035ff27d302d0e0fc22fed444281 + add1ff3ebd0eb3c77b39247050acf1a3 + 5b741dbb4bb9c37b05a369d66cacbc6b + + + 0ac9b810f1d9cdc20912073dc1e5ce0b + + + e2d0cb16607b93f5cd58220f697054c5 + 5e681259925c872bbea7667ee72a4823 + 2d9b09d4a3cbbd5914b985ca5a4d782f + + + 17ed07423f2137f1ab0d8414b6ecb367 + + + 48468f1bdec49e606c3fc5480678facb + 3c7ad7a2360b7b354302e76a7429df13 + 26fd08587e101ef1616e9c11a3dbec52 + 7eba69ae17e32401a6c40b212a0542de + f2db7145e2459735fd961c5e105a8cf2 + + + b7434b028d051c7d4daafa9d0620e132 + + + + 1255350d45e7eaa966671b6bbb5b3b4b + f8a8fcea5051f27a6d0d748ad24312ba + 762437540810824443d42bcd520dbbc3 + 128ad5b9320ec4b6ec77bb18e4122a56 + 021dca074e67bfac649407d385895a42 + c467dab7fdd882177b46a01a3e9dd7f6 + d8ce8dbb1256a6e6ed752367c1d802e3 + dede926b3974315ee3244bc052c41978 + 26222e9dc6815351b0d0c8db9284247f + f3575ab559b382e99386439d4354ab20 + f6e62f2ff2a845b0e9e77320f5ce442b + d0b3ad0779d750f1ea3623a45de659f6 + 3cae29b77d34f282d25af26165ba490d + 973c3dd1cb114eb7c76b906c5bee652f + 293d77707f1c1787ecbd207da2e258ad + 27be25fcf3aaf28cafd6f9526506d227 + 05034c9e76242d6cbe7d36eef2eb77f4 + b4b004d4ec8d566e695eb42db1f8b02f + 55649bf65e578f390bad4ad0d8df6113 + bf3e206dee89b970be1590e72fce77f6 + 11a22bdd96df6ddc252b1ea1f7f3d9b6 + 889c72b9f843cb5679dd0523ef2a78e2 + + + + 813ce4eba6adc3f7ac55ff0463a975df + 5e0e3a53b484feb34e4ff52c43fb1631 + + + 0a82f5f1a41cfa19823f29f72b6a7395 + + + 58e4c6d3b6991a17de41a995bea4eba9 + + + ac390253df4cab853dfdab7a79f416d3 + aa47907f79642be37da06239bb5f573d + + + 86e944f4276d7e2def613e5ea379d0c3 + + + + + cf3c1a2476600d2b8ba45c5004850791 + 6462ac02e09f85f1cd02b277b301cbc3 + + + 378d52a9bea1a258d2e78bc944684c2f + + + 923c41971300e8071cb4060428f9ebf1 + + + + + 54e3bf9ab6b0439c61cde09eec6d67b1 + 9400441d90606ef9ed48969e1fb26dba + f30a1f3ca73f788a7cb8e894babbcdc0 + + + a0212ebb0ba44a11e458187db28d4d53 + + + 0899d0f96dba714d8dcc175814e234c8 + + + b3e1c56ccf4366739dd2f14d7a3dd5d1 + + + 882087d012df0c7ccb799eb7c30bf2e0 + + 1b1513ed6d3662745f198c3c0192a6b7 + + 1cf158a95365d1900c3e964a853d4f7e + b44e6325a63d0d1eb7cd5e76a26587cb + + + + + 32371366a171f157c69dcd6350cd1257 + 4ac362a4ad4a9679da8c21494c5caaeb + + + d025c5011e21cba2fd87d6a5cdb9c3cb + + + e5c776a243b6837690bb36690790c3a8 + + + a06504ac8e88e030fe94ff736242752e + + + + 40ee5fa6198cd17a8c1f0e74301d626f + 71113ba992df7fd239789ec8dfdfc003 + 8a78dcee64a816f1949670bebb4a1b59 + 8759325bdbcd82a9091444a652eeb817 + f8c10cdc42a803e5ee379e6532b26115 + + + 32972e4f5145c08b0b1f6694491af589 + ac1efba2ce7c7a5d817bd5d5ec4e276c + 940b2e379156bf5c02ad98fe06a019c0 + + + + ba9c2140c4eb4d658d7a57e7cf35b7b6 + 269748bf0fd95d24078a9d0757194198 + 3f427a67d23834dc5c7496a8e888e53b + + + c987cb28cf499133b5cc7b2fcf97b3d0 + 8af6073734112e050b95ae10a79e8eb6 + + + c2acc71266aef7b1e60d09e99085340d + + + 64f7060495a4a9600755aae3b5ffe163 + + + b01ae49f80906d1d27c7fa86eebd0221 + + + + + 8412141048f103f0ef48b49b7f38669e + + + 131f9d20805c6a17bd193e9fdc7ece24 + + + e0135855f5796383b2b33986966b02a8 + + + 40fb8f6168606ed8f3b6ade1a74053b3 + + + + + 41075edde44a6b4894e0263cfb158be0 + 9c8f06f22ba8a913026dc35f5bae3bd5 + 1a10c54f4062a91dec832dcb5cae76f5 + + + + d4307b6de4cea38ac71d87525cfee758 + b7a074f67de47e58ceb4dbc457ddd163 + 5fff406bbdb44e044c0bc2c39fc82f4c + d80da72df409fcc12fe4077ce18297af + 3d099be52e520d756779c6820d9f619d + bc4a8bd50d06f6f7120e8bc9fe34d13e + d53c01b3334ba5b16ee54490c5196b73 + aa78a4b8cb9adc537e2e290ca21ef169 + 52a834e488e820778981ddca8c60b5ce + 334bd727996f1e668cf66c1dcfce0aee + + + 1aab30daade3a65b07acad4da6c68f2d + 4e4a9a4965caaaef12d164057f4aba90 + + + + de68c42ca73066f72aaf99afcbba4f60 + 7c85dfc4539e09e1deeab574d75012f5 + e5c851f427875637e843907e2f1e553f + + + 5aa4c663bc725975cddc895dd470ca13 + + + 48eb933212b540523624016f698dd92c + + + a58b3c12c4de4082633579766a21cecd + + + 7d045541fcff10b5766904d2092b5e50 + c1bcda2aaba5fd66df69f895869211c9 + 9a43fbe57b3285aa50dbea943e37cf2f + fe49267c348c7c3c89fc8e698d7cc140 + a70074f1f6c8f60eb99029a7c16cfb33 + 3fa5097948c43619b10315ff537fe006 + caa3edec87bc4c6d1e56676b3107e3e8 + 6f85d8422c12440907bdfc65beea5ba8 + 221c171666399dbb6a9b0036af5088fd + 0128c591b87552f41b02e81548a434b9 + 874c3bfd413b1bf3cbd15e82c9b3560f + 96d1da819b62f6dccb5fd9d00168f859 + 411b6192ab97a7035796dfbb26262bc5 + fe2b41210a42818db6b775f4038ea0d7 + 64381c629843fa284ec925bf0a8866a1 + 10e43f1c337d53421d33b76b43e336fb + + + + b0972dcb1201d1c6c6795db786c6319c + 728e5c56a8360da656760e13af758126 + 9062e946abd806ffb6c762ddfe175301 + 0ab5b9d6abb575c85073383862ea2b1e + 925f2dc48a3307545584f0d5cea2bd2e + + 11871d8450a782cda3be09969e9decce + + + d9fdea8c2124ba7e20ddda261f3bb6e6 + e6cbc117d7a0b669ec92c92bcf6eb6b4 + ae645b3cb3f56e814daad95a1a65fe1f + 76ebdad4232f15cfd12da93f123f6b45 + ff5ed18dc18b7205ac795429a6e5988a + 199a711317c5bc268a9f5802b6fa0b67 + 7debb012fe0bcc3f53b6435b54d21ac8 + + deba76c0c804d128043a4756c8ff87fa + + f327747552c5b5841c03c7d10ae761c5 + 23132e43cb1e4080ac2acb7842b74653 + + + + a3574e65aeaaf03e0a4564bfc483c5b0 + + + + fdf9063bae0ed219a8efb295f66708a8 + 7fb46b36634ffb2bf10ad53f1d30cfeb + + + aad0c58c944252e31b3445906fe1c37f + f20b0aa535b1db12ea0b3825dcdcb8fc + + + f27b23ccee55f7b3a2e102d85ce61511 + 5c7365129962c9bb0c3e755b4cff1db9 + + + 56ccf7e9106949d3f0dae56d3899c6af + + + 7388f8ec18fe7bff9ae791395d7ae1d7 + c733e171d48a906623e661efff308253 + + + + 905225086124dcd036441a9789243ab9 + + + 97bbcb1e196404babfcc34433165a4b6 + 3a13eff100c8f4000982a021ce921fe4 + + + 00e2be5ea463962ae255ecb251517d9f + 050656a425c14b73ba1ba107f68e5944 + 390411d06d5dff8fa9918e58872c44fb + 4b9e84e7528c2949611c2fa1fbf13364 + e23abfd822e5f0653ed5075adee97c0f + + 730155c5a24e6854794b5bb1a0db6314 + c84988dab4ff9e86f7441593dd39d190 + 5e0b8ce815bc8a55bac6993c4045bde7 + f3f703567d03ee66de7322ac955ec07c + + + e3bff06aa58de015d853adc07d8f1a71 + + + + 8f36f65248896027cdeee088bc95014e + c34247e5ef1b59dd4ebbfc29fb9642ec + + 96098e8f4be666e227bddf0108f9759f + + + 823d93769852bbe24b70e91ac17e5072 + + 226889a38f3e2696b8e52ed0c80074c0 + 6f3de08ed34067a75ac156de835dcc52 + ad684d54ea9961e6dc1d9d44886e753e + 1f0fe206750c7e94d402d550af1c3dfa + 115422286954362cd48d1b36d2cb1705 + + + 5f160415ac8d8bbf172624bbdb218fcf + df965d6285e29183136b80af73bcf2ff + 726c8e402683d4c97ed54dfb29c738e7 + c9d188be6bd74f66c97ea86ddb822bf5 + + db74848c9888ec06f2a929898536e13e + + + + 69a75bca3c18c3bc28291bb5e319d9a9 + + 4932a550057afaa3f90163a55d366f40 + + 345f70389b49f7ade519dc99391e5438 + 65e36958df8f5a759ba96627594b3854 + 1e48d84f092bcb2a8a3b140b06bdf38c + 65310e4e1652d5369ef2fdeee71f938d + 76ea24a4a7022da8980d1e553345ca80 + 7b2f6518105b09fda7240cb138bc335e + 173fa05f5d44cb96f292ed1ee5563c1b + 8a90ea05e757269ee3fe42af7de4dd24 + + + c53b7a45a7e134f1a25f3faa3f6dbf82 + 00e997569c5c28afc84bb6a2dfa15070 + + 926822ce50447c84769e51f5c6c88eff + ae45a088022bb0d40496374ee65a74c3 + 2c7974b07afaba5d78f6de0198352e02 + 92dfe6299c7dcdf841af9f06f9922ce6 + 677bdf60b81cf2f056e0ed5a36f10086 + + + 9407d5acafd26134af55c73446c37ba8 + 9ec0332e21905db5d06f9616de8ff506 + + + 655b5b5bb8a9aeccdd5d7964dd7481db + + + + d0cacd521dfb0483c52b9557a99bed89 + + b3e5552931dd17c6d1ccb6b316b346a6 + + + + 29f4c7c31c6a971cab22c95ca50f069b + c4617ea935d6ccdbb40078a663b951ce + e9d737863cab633ec55b133371b40a43 + 125e338bd44797f453f23ad0fe6f9497 + bcf0f658051b0d2f6102b7eec599c2ef + c41d51341a56741efd97b2ad1ca04e60 + + 2c2bf4eddce00b1e5b367fc5b4a80c32 + + f2304afe33eab36701c93ed74073ae87 + + + cf7e14e38513a67abad99da1860281d9 + + 222cc2b5e62c98bc7564806adefefd19 + 3267b2f4fe37eec5033df56dc31ba8ff + + + 94c2090a60e999749dd454f26b5f076a + + 5ad74582ac6c1f429ca91be1376a64c0 + 824ef31a64cdf0ab4593fd91e54eb6ef + f97714bdd8d673392856fb2135786216 + c3e53cd12c44e9ba62481eacbd703adc + + + 816e08030b2fcc7ecd2489bf5b2fef07 + + + a34a6de73138db9d1191770efb49c9de + + + + 968d8010e87314b5d57d746975046a6b + + + 93ca65efefbe425288e1b9b77f771b9b + + + 44c59748a9af550ab122fa75eebdbb04 + + + c3376a5be7cd1ac26c3c98b1b18a2c2c + + + 3f63aeee0af8da2b6cab13249af750f8 + + + + ebe46319d2dab28c9533c6eb9b1e4eb4 + 98be3ff0a418bdb5fe3304ca12cd964a + c2c5b70c8ac2bb75cbe82f2188f95af8 + + 25f17aad0ca819c048ef2f778725ec84 + + f890d5c8cd2f6394fbcccde59c37105c + + a45937d235cc8cb5aa109fe53313180e + c05011d372de948b386d8ca87033586f + + + + 60352b8017eb7408b6d3550cdbdf59a2 + e3bb020846edf02e28da5085225229fa + c8c5de5acec7951ce1f13009d83abb41 + 5f697182e68283af05ab696e0c8390f2 + ffefc6986bf6bedb059ab2c3c134bc8b + b56506504c1d7eeb448b647cb55921b4 + + + c71fa9211ed08589db57df3b2bff43ef + + + 3285124d57127c6782f1bd2a895b3a5a + 8b99666f20f549fd9dc05cdcf78a69cd + 29664c1af750980710c5877c50624f4a + 9535925a2c7ff6048582aa311ade1791 + 460b6fff0d76b4861c38b40f3f4a838d + ae1bae8a5815c599d11ce4bdeeeb2586 + 673d57a79f9749a0fe9cc47353d2767c + f0327068430f3b05f645817bd0a198fc + d3cda0a20e2ba5b116e44ec5542c9748 + 8fdf733f726c75f62f4a2c752995d22b + dade04e1c9b744a545f42998e55108b6 + 74d4d208b4a9d3613941191e32e0cf64 + c6ead382c896413cc99318c14027eb0f + 2e780be02a83eda2c8ae3e334e237571 + b0f1ff5cf22625396641a6b29f9df1bd + aa81e58f4796ea2f25478d359c5388db + bc5177b8a97f5600274f2bb4ead2bc5c + 0126a75a2ccecfd28954c48500861bb8 + 2b4ece1d01f0e2b2b2967511bf17c4b4 + 32f8cbc364b393b9ee7ce07be3841009 + ec76696f4b5b36be296a27eb7e2c7ae3 + 011473edfc82fc47c509ed8cbc3802b9 + 6e3a80ffee1e01b94973976073655cab + d15d727679758b759fffddfa87710a42 + 99b65ac40494f44200967490b76f6880 + 40c546ca088c8d9cc6335c175214e263 + 2a8b9b7b7b92ce70e8160312b930a84b + b63615d5891d1830eedc03ab03c66111 + 87c735f250b4bd975b00bfea1a12f027 + + + fdc6e96c228effa5771d5810734f57cf + + 371a2db925d463ad259cb07c67e11a5b + + + f833378259679bc5f33811cef86ff949 + + + + 08b2e47fd9985a43f106d23c273d956b + + c517bbfe7c2a5152717edfeab706c17d + + 90b496dc5824ac35eb59a803a9fbc3bc + 0048cf3c1fe7dc162a66f011b343c11e + 831848f3a022d319ce8415b6230ddf42 + e3bb12b75d12bb9317f19b868c3cd4c2 + 1b802eca04296e636f231089f3e753ac + + + 149f014a80b1a3a68e883557bc6ea193 + + ce30ca9103b837b5168a6b50568e8729 + 185b6e03441ba49fb5600f36fa5a01ba + + 63b8f1dfd4e3e3964da089a0f60a0848 + abfc2635173d4acfe0a88954b16b6ce9 + 5ce344ee64114e5f41e7b13d810bfc71 + 8c55c8d28edc6c3eb9a70d62f42ef248 + 1be85e742814e661664b0cdc1e6653d0 + 5d62466161faed83ad50df2c26ce3234 + 1536cbac9c322c3c15861c814d75e0f3 + 20f0b640419e6d02ce952c7dad379649 + 096e83cf3ba503679c86eccf6e46a297 + a0b58be36dc65721c936228fede783b6 + 32526b6aee91c43180a8b7345be94f5f + bf04485651fa446444050b7343aac732 + + b0e387963ffb0e21def9b96c0c48c448 + 8531e62b094619207af7d5040bb36fed + 3b2249ee4b3ed163dd2479d41c60cd81 + 2a1203e900697eed30c2aca9f2e46778 + 91e0fc5dc826478c58a4c56e871830c1 + b6d722ebc96774d9ce6117d294b9e6a6 + c872590a44d6d9ef6433c5987eb04ec8 + ba312d14cc94b65c4bb6a11702a5ee44 + + + 3815af9a16a92aa925feb01136e709ca + + + 0267aa871040ae3091ac51b9fbf1c950 + + + 61f6fb9ea354b2a9422fac81df295459 + + + + a46e4928df958b6a2db0703b3fe41f25 + ffe6a4d97a7148bc7c6f34c84a434cc3 + + + 0e3f93d04f03684bac2fbb87fc96efdb + + + d785a4f7b33c262fd77b9bc05d88924b + af31b754eabe0a11eb45bbbfa58fc17c + + + 91dfe464a8687ee871c2e955beca713c + + + 2233309cc4298b7a87644fb705cf894e + + 674e9b294ae737a97f7dded620ebf9e0 + + 896cd30726f829609229ecdcd3bad157 + a68c22af2f9135b9867909cee3875788 + + f770d8bdb2a86495c282f1e29a02d7aa + 5a96b868ed0d7c355a94e496e73f7f2b + + + 66d36c227ec125172315560dfddfe261 + 4312ce07c066fcd4716846f208f65a64 + 3b5840b4df88ae6897d58f9ce9a05336 + cf075a668b0017656b44bc214bfdd635 + + + + 7a05a9bffcb7a21ec47fb86303c7f67b + f05ebef05f04e132b24db37d489722bb + + + + aaa2dfcfc7f99f19614402f57c9137d8 + 78b05cbc97b03cb53c43eff2050f6468 + e52973ab8ce9ce6b6d917f7b27334fcf + e28079b4868ca938037180b5b2a2a360 + 6e2f4a04c03716d7bf93e81bde5a0bf1 + fa57e70fb5c6e6ccb7f23ef0f16e7782 + 188edeb5f1a56c86b190883a9b581654 + 9f4b95c2b60cb9acdf0e350930201b2c + + + 936da6ce1e3cfb17290dd56ea9782152 + + + + 070e20f37cb08b41cfc6252116ebc4ac + + 1deb3d4ed841128904bda71785d51caa + + 16c769d3a68edbc674c15af3bee9d5c2 + b0d47c36a0d8d94eab68263969d41c16 + 313acb2a24bf4e8384a409d4f3da64f3 + + 4ae8002d630811986cb567a4badb0186 + a093d1ccca4d07a433786a0a0e8cde3a + + + c00cb1eeb3b7381ea67d71bf6130c84f + e89fd75183c5cc52e359fb8f41d60c05 + 1300e41ce56ca0fa061b847c93099c76 + 73b29f166c11769d213dc44ae9291481 + f565916fa2c398d4006df72fd5c82312 + fceb178dbe7bf30ad58a1a06034cd6f3 + 3a9f462a6b6fe4f95becdd702ad98675 + + + 817ee0b0911fc398ed7e279fb29603d7 + + 37d08eeffbeec6bf789eb716593349d2 + c12b7cf0a4d002f16a18a34ba48ac12c + 53e343438d7b0178a1d38c9411298201 + 22f17efb9b233a69d4d8a4bb76890e34 + 6a44db3f3d67e37974ace814de5f7b49 + cd1a837907c4882a2c79dd9398875780 + 1d1a1828c2c7500e96bdc651790931f2 + f8836a5e45721d4579704dac8583a02d + 9da94cd537be2af8ccacfc7690477a1e + fede7c505c781daf5ca8fbeb82eadc9c + f4132f9c873d921b054820fd8f89cb00 + 92e79ca964cf9ed66fddd5b2b358379f + e3756ea0d812c3728663bcd8a4257ad6 + b09fbaa06b8b269a159d1fea4f567a23 + + + 8d5001babf35fc61a94453e0ba940d05 + + 1b59fd291a22a5e46d959d7cfba3d419 + 4afb2fe3c79e32b0adab2a2f72efdc1e + be51864937b1c7022f83fff09ce7abe4 + 42c20d8f35bb5f94e1b82577e0504d08 + abc63ad00d8a62592f649fa7e6443fd2 + b6c9a5500553f375709525426b844544 + 3af0d583a220feb347037dd3fe94fb20 + 48c447d98235e738bbc9675ea7fdb8d9 + f7d4bff8f9b735d910c7714853ad755f + a6792a7d61295151e122a8f10781154b + 9c3acac4ee7200bb7ebb5716766b26a7 + 02242db830091d95061f538b8617a13a + 5075cde4416d8b607632be2dcf179619 + + + f3130457debda3b934e1a04fd3fd4cff + a64cd71ac2ceaad2924733f1f17d7824 + 26855caa78e1128a992b9a0fa66a47f2 + + + 5e32b1dcddc23cf2377e0d589ed81655 + + + a7d5cf8cf09b58aa15eeb7e626571b5f + + + fb0805338d0ad99b079ee057e311d0b1 + + 32e5431c92f534b779b3dd9e98902815 + + 1b8215633ce029023efe498726589938 + d6e2b14319b68b0a2069838534e71508 + + + dbd9322a3c9f28be0615292dc5dbbf96 + + + 08805ac69cac7d87128ad3fc12f5c599 + + 4900a0277f557e46f2b3147164c1f222 + 045e2f7e07ca8dc6cd61431a3366fcdd + + + + + + 2e9b27677575e4b545cc39da4b0a35cb + 07d0b404343cfe429a3a4cbfda6c27ec + 616ca684fbab8ae0315b41bcc7e9e62b + 9d62744edf98d72c3d6dde3bec487c7d + 0a0d06ff0549a407fb1cc59555d87fbe + 0d05958cd6adb50019adf83935a108d8 + d1a2f65d589ba669dca6f4fd3fbdef8d + 296f73ee285b387747710063177f2d85 + e8169ebe470d7d5b1f4e897b173344ee + + + 0c5e394823c61b94e34a43cd090399e6 + + + 17496373c3789aa7cd54009334534801 + 0307e1248d5e83c4bcdd6c29bd48258a + + + b583a4996958cf84f434bb8ed43b25b1 + 339a81a605e5012d928fee5cce56c2b5 + + 568e6193eb68a3c91904e457d232ef0e + + 404678b825c990a1e4dd4c304d58be9c + 36647ba0e431a741419ac47d398077c5 + 2bc43f03ebaf6f739878c3d59126e5e9 + a64b9e7a816100fbeacb9075d7dbbf98 + 969606f2b79af7a2fd850306af851545 + e00e9504320dcb7b4d4d6d40c312fd35 + b6dcfa7292f3dfdaa347b0c5687f64df + fbb69b8e9c4c99dee47d538f37db7663 + 3935454c9f1f400a15c33d4ac12ee74b + 18f7891b7ef89e7d82fb88c4ab4e1b04 + + + 487c318ba0298223428f058ca1471c5c + c879065edd2d6421de4d2db3cf1166b8 + 2611a19ccbc00ffd01733fd556bb2f91 + 96b54e7d579427afbd83ed5532f03e54 + 10b4ac4a900ccd21033a383fefdf0d93 + 0b7f948ebd0716f155c09c0ca8e08d3d + 7b106f735620f371c3b6a77b231eb860 + 2fa01642d95100eb64bc414ebfed442a + d4c160d45980fcca977aae8aec3afd2b + 18e86bc5d903f9482da5c841915c5285 + b8bf0b19c1ac88c437650f98c05bcc39 + 7428cb24a3523cb308bec891f8e61aa4 + + + 63d2a74100688a022a772f79dd29a150 + 8251a20edd396ac13f72e47bd1d1623d + 279a2180876a90cdb7a8ee3a780aa509 + + + bb320fe0fb90d192858accdddbecd179 + b25328a5cb2bd84fd37ef6ea8162096f + 1c8f32e3c62e5ede54f14a49cba35425 + + + + + 7d41111661872826f22766cf0f72bf84 + eb84b708dc589831d3200754fb697cfd + cab0b94689fe315ed7291de9b0b8ef55 + e2478c2c971361201176d1ebd9cc0e31 + + + f267d264f22b95945aeb4e0936be0e4f + 84428a297be7c4a994794637f9f6be97 + 93e0288e511618b033e7adec28ec8bb9 + c262e64ed4e8a788972108672bda71f4 + + + 5bcf990d5ced44376b9ba76fa142e646 + + + f5d81d0b95dfc6a89dc5a7e89e534c66 + 76deb87d6c17d0e8da6b534b39954d3d + 362d9894d58982e69ade0c7180b43b74 + 75487e251af31cc95a39d22e183c5166 + f59611aab04974c90fceebd909fa61cb + 90ecbaca75984cd7b22d97032aa3e285 + 7c6955260bc942db03f963b0ab933f0f + 0b3078a635486bdd56c5c12f83f9b886 + d96759a322c479cd81bedb5442063f7c + e1ca00189ae21cb77e50ecd7441ca20b + + + 161230b052a8aada06255babe8a1c6c8 + f7aca7390352a9da21816a8da538fb7d + 7e55726f094806ecd26285e537e9de8e + + + abde1e3bfa74314856bb2d4c81f09ff4 + + 5e0b77a051ce14b2408ae402035199ac + + ed70f29bc500b2eb686dc053cc0b9d20 + d507ddd4bf994e9c2c4ffe3c27b57ead + 063942380afef7e66175ee0ae4ac4a94 + + + e468112ad01c843b4d9178863f762d6f + 4dceedaee9c038ac106cde94c48d6533 + ca5e7ab6f8a1618f142afb9efc08d029 + + + + + d1556233796cd5c37b994d3b607dc3f7 + efb49828e053508c525c971ebefbed41 + 7259b44298915232b657c9ea721e84d0 + 13c09d49a147a7231c8383343d024f3c + 7f77e9cd66783fde125aeb0bea09bc5c + + + c7c765b8b1735c717b22b6ddcbdd0595 + 8fe6178d14e1312d1ee902ab120cd0da + 0702581d6c3b82365943b208c48c9d2d + c0b396632bde7bd2b46d151698097214 + bea3a50d5ffb6d7bab8ab6eace6434ec + + + 9cfbf52778d80f47e0bb447346d539db + 5c44f569d4fb9c8d4870ffbead708944 + aade0c0747a69607283c293fe2e14e1d + d978a22ac0419bbc9bdd1a30faddccf6 + 6163546082cd93005fa4e8af0af03577 + 528562146a2664bbdf314cc7222e0814 + + + c437cfa9bcb1152082435b2d52d0b5a0 + + + + + 500f37d672c172ffd14ba6012cdf02c5 + 02970899f27c51ce07c2431516bc6e40 + bda4b623b8d444944b9b87d413f6c932 + 04d1a50d7e9f53c27afb82c51a711fe5 + 48362ade1c85c857a1e8dfddc26e1ffd + 6f9825620a97e7bba5e256dd352ec59b + 5f4828c0b4aeeb5bbbb6a5143d2099d2 + 140ec31a13bfd2fee733fecd8b7850c3 + ff40fedf186eca8b980bebe073c44616 + fd0a2dada50f24adcd0cbdb821dc81f8 + 3e51e880dadbeebf659c0eddb7676253 + 9bf4d053dc551a13e1ef559dcc236f8a + fb68b0f8a6a97d5acf7dacd4d63f9681 + 0fe2c4dd4edc2b132415bacc52edd4e2 + + + 59a3d80f2e4dc8abdccbc66cbe4b53e8 + + fc176a6ca733a74633b56fe97fb96609 + + cea6d27ba23c3056977330ed45a740f0 + dc217858a1ca52b18928cf6bfd408e5b + 0927aec0460739010247cf5d4ff7aab0 + 4af061de77cfeb82c52d6554558018a7 + ff1d71b34ee59ae48069432994a2408c + d2f912e9d86f5dc31130e5d2b7ca1876 + 1029a2d46d19534b49fb8383312c10da + 3892008b4dec38458c1f421cb4f5f226 + 77cfc21fe1cabf2b24f2faf856f3b758 + 49cad17d7eca77e1e9630cb592f3b938 + 3ea2996e8fa5b496e5ad2f918a84ca6a + 470ae0ca3cae06377455f808c18de142 + ad044b47396afd3cb4621454950e5d60 + ed094b11339c22a4f359d8f9f24f0c47 + + + 792008864112ae26e6dd7e516318d958 + 668e91b87d5753f0a84cf042f9df14d0 + 8435310bed5c68e62605512d3641aeab + affefc9fdc6d3a91de3ce31e746f6c82 + 901f8093bcb6731bec05076aa1cf09f5 + ee4f23156e9d039511f5c4e8d7e4e346 + 86b760c82e30d0b83b2c56f3de57df86 + + + 46d094ab26856b77aa438797b6e9786e + d5ee690dadf7b93cc741ce81639414b1 + 5d8ce2ae8f06efdeb1acc1e254b96b5f + + + e01f614f1f44423e2662bd408496cd96 + 321e8a08a7eed9eaa05f839cf24594ec + 9f7776b1ac08e2c91f47d4962466db74 + + + ba676d7360ef98b5fa9edba41936a73f + + 70bd9a67441ddc59febac2b413a28e25 + d53f831adab43d5929e00c6a0d5c6b66 + 4f718e887012b916e56c9ae2042366ce + 2412732e968e932987ef688cfa76780f + 90a7a5ad61aabac2b32a8838bedba624 + 99c202fad64a525a359b830a701ca437 + de5ab5ef5eb7d01dfbc5eaa72b63f668 + e819a0ee4e5818e13a70a199e427d350 + + ce4a61a00c127af48f0a40c248edce58 + + + + + 3f2254818ee4011e97420618d93df3ed + 98b4573aac5c7dd21f9bdd22b57a1662 + a2ff933c420075665f764061a3dac28f + e303984b714f50af004677d2786e3196 + 22005d45c3a572b107b85fd364daca26 + + + 6e0a1c5dabe0d457866ead909d618bb3 + a210ba717fb5e55b2f0f27f6bb981c98 + 3797c2439b690d856da35203863e9727 + e30738e783803e38369f4a8dd60be94d + 9d406981b6dde217db549dbf18bc9a8e + + + 3fb755ec3f3a516b915f1571cbd9d816 + 7fc1073ccd71698e9db746335e5502c6 + 41e366c42887b3619543946f4a4ec695 + d3ea52bf3f6c7e8f06c6e86cdeccb02f + 60144c03c21dac644ef263bb5923f05a + 4616e2d32312a1cc44913fffd31674d9 + c8952e43f4503e50248acdf26d6eda8f + 7e9204652945bd9265e50e862532e067 + acab1ddf3302f4bcc7c35c69f5674f67 + 9f7377769f46ba4ec4f96623415d1c29 + + + f82ea8cb18a067a1251e83b667bbbea4 + 3cdb4f0f04a41569f97ee0974889933c + + + 9ad5cb7358778c927bb61a5e53044a9f + 93b9c46d975afc9181aa52e914919352 + + + 448fc4d7dc56802ebec66faa94bbbcc1 + 96cf20d85e8daacb5ed55a1558ffcb0c + d247d0a22d7a3c7cd092a33497cfba3d + 98a1095c3e10ddc4248a581087eb0faa + b1519a0d546e1ab3d78a2024e1a7eaa3 + 9a2df85822f6b36747d4f74101b7c26f + 7d77b281e656429319d90e4e5d3c5723 + 95835aa1fc6a06085296da40d2b065e1 + + + 09ab86ca2f8fa00f613a1778b85cdeff + + e846fd22f3ba7dd76244a25d55f6872b + 0655efd3be91a8d4e7c7eb394007c37c + e82e6803fdd08a2877545d74fe827aa3 + 02656e4949a4bde018af1aa53199218b + edb2ab5f48f5a5325e63f087c64fbb05 + 0b2cb656d0de5ea92935c9a224b50a13 + 325f97f4bbc2855f9901e1bf9050c5a1 + + 4a1072b5d7a78750bd04c7a3e996eab8 + 118e4195ae0b9bcfabdff8a5a57d73d4 + 819f193818a97074eca110dc322ba503 + 650c1209ab21aa6de92805f29ec6222b + + + + + 5aa6a239d084dafdff2e17cee2c4c670 + f7fd8402594f4ac6201c7a635a33114c + 15753a8e5814fceaebe03d57939e38e9 + bf9710b22adabe2827183b43579bc1a7 + + + 4073d92cbf062032c2c41ce2c8a7da2a + 51994faa694c469ef534df23d4f5dc52 + 81c53465c85d6c8811f4844933e461eb + 435e97a53f6ab22b971c0cbbcd6385b4 + + + 5e63d62d8a2d92deb8cd0508c108afdd + add6569d060b443b3f6feb8036f6b25d + 1890b54b7f5e8c5cc78fb6dc9a6ab101 + 35a542fa7aa7d5799d7f2735b464c5b7 + f1388829ebd171f9ec76f19d6ca3fc16 + + + 1ad9432b3c6ba633155b47847912c173 + + + 69155943d5259d9c1a7cfe04993a5c1a + + + ffa301f7912cf0623dc35ed30482ec35 + + + 8f8920b7a6940e979fd882a8bbea098a + + + + + dbc9261f476a676dedd4184f227d39b3 + 1770fc15d378ec0f9657d7d101ce81e4 + c54aeae40e9ebdb625aa296a48d5199f + bd4e9538e1974d0553f5fe267f747565 + c36c0126d9de26c2ca8c03759e7aafc5 + 77dd39b9bd5c2260469b1aebb2cf75aa + 811b0f2c91fdc904ebf3504a44c25148 + 924132d517090bf2b5970da7559445bc + bf11d3ac11a502e208ff63866ae7db2c + 78d94e66a16259e055c4b0af15f7aaf2 + e294250a8706705333cf847fd87614f0 + c2e2f4408646cfe9be2c83bf6162d199 + 54e554982a13aa942a94cf89fa9bf9f0 + + + 1306b0791006b692b1c361d71c15a85b + 01e7248cba3ccde57adb1cb29ab7021e + d69d143a63c30ed2b958a1429ec6ad65 + 4487cc4b67edfeef1a07ffe1da431d3f + f42ee21087b228f8b2be17df9f84d17e + 15c685e135cfca694489ee49bfba7969 + 8f6795edf8bf9083320761c0887611ef + e7e437410468d7d68e142e61ef5248b6 + 83fb11416ddee3910dba256ffca25a1b + ca31e18e5af41169c6ed15b91fc59bb2 + bd9c7f7a96fb02c1c61559b2bebe3b7d + + + 093a063a10d9e0ebb4540869d1f5e8b3 + 8590f8ccc39c7d9997feffb08f701c88 + e38924d3d3efbe5e8cee0c944fea8c32 + 29bfef14be2eebf707b836e010bf582f + 1c8799f81e50d856d265e4f96b0ffb07 + 05298444480e35fa44c1a777750b0182 + 1efb5389ec509a86951cf16daf4dc386 + c74e299f577d35b73f786d5de76a203d + e39a2b09aeb50f3f78f311eb1df993bd + 6afd4f059cadf523f68be70d4df3918b + 9ac0eb3b7bbd3cac590574f8ddd210e6 + + + 8e6e2d690a04076e16634a9c767ff46c + b27ad6b393c070cdac89d1e71a4f5480 + 0e1c6f66f517041eeb6bc4d0c6649f3d + + + bb53ac3bc53c782388f1d4310670c359 + 739aaa66b16b3fa6072be446eae3e911 + f065041dede9533625c30a55e3d4b275 + + + 4a14c15d50336db9bba7f2aaa15fc5a0 + bc9e01d36a44c876e385b18d411944e2 + + + 13d800112e71995452848dba458f26a6 + 2fdfc7e50654d1747d9d53ec4d666ea7 + 1f5ecc1ea179b301d3274d78f6d5c958 + + dc1b78930367cbed3f334562308c4046 + + + + 8199a6816b43f8ec41618cb453595f23 + 94718b84dce951105b36db3a78a3c061 + b50179746988fa2c5236a3a6ff9fb6cd + 0e2d1f21b2ae7f359eacf58f37965ab9 + f8d0200c6033f638e40a5a11ede81802 + 300dead34f616e80b126d4fdc7e3c2a0 + 3548e2db622e6c3e7265b9aaf8b074a2 + + + 515a6a3d847b55980b555d9fbffca59b + 4e9db2423d5a30d05a320053f093aa87 + b03c8fff43fce5abd9a7a77f2c6fcb7b + 8c84866e7e618957b5b7d94ab2729bf0 + 2a4c57fc241ec7e5058046ff0fea6c5e + 55d552ad48332957faa1bc452ad1dd62 + d327761db32de67019101e04dc9df900 + + + 2b120b58c44d77df79d0594bd74f9145 + 3a6bd37f8e140f6bf652fdebb997f8f8 + 5db112bc99ba55a3b84929c994a92919 + 5c15c11690634833f2fb11aac19b9a95 + a98046beb96fbedda182b66d95190655 + bda002339faa142186cf3363e489fc94 + 0b1a47f565b7b90ca00572bcd5b2eff8 + 821a046f8ff7f17139a342d56185a4d2 + + + 23606987ea5d4999102c03474c953a97 + f27b6b14f81561d1a85fb1f078d13492 + + + 4c7215c4f485d0f5d1053213ce4a0822 + c2a43e7ef7e563a2b666489505b3cb38 + + + 640db0025052ccab3a38c19c429e2b8b + + + 50314b4dc2c7146031944ca156124a5a + + + + + a7e1a3b52948866970f76e3eb2b3c3ba + aa47d6ad9e8b8802f78b859d84e076c5 + ceae8c97fbd93b0e3895e07bbb10caf0 + 0c0afa0c32d05fadd8ff09456d7057f4 + 079cc521c291803ad9569186a4e97bc7 + bb147032b87c64305041db35e5810742 + e7614cc8cb203a6cc18e4c662d78e39b + 79954aa97428a63ad1c3b46ed329e196 + de66a90ccc1ee93ab459e82e824223a6 + + + ca15c2b9d3a7bb585a7143997a4c8369 + 551112595083d1c48b5a3d36d6d34046 + 20135bed4c534137f7f0e1856159941b + 85fb57f59e30a5ecd7344357e1c57729 + 053daa42a26e0320248ace73add72f23 + 0e58a4387626011a4905bc4a6ba9d222 + 9792a85652ddec12ccf40cfe2ac0d376 + + + 4faca81d63c0025377bfbe8374670b7a + a08e0d870e11f034ccd4e510cbe77631 + 5e0af19a777806d829bc911cfca161a8 + c413a37a648b3b5e47d2bd47a91e42de + 196c0583350ef87d449f73a94ac17af3 + 362e632159674beb3eea947c71691589 + 9e123f4513170a8ab346bd2ad55749ac + 7e424cc1d6222aa5e27c3ce0e213750d + a6e898ce27f937ea6de368c9e10b3824 + + + d15a9e5872b6164fa0d1916c4d980398 + e40af35fddbb29247a2c32697ef4ca4f + c3385e458e9bf04134bba8569f8c9309 + b1bd7f510ffd81cdaf019b63043228f7 + + + 5d5d8bf4473c72722e5c474fdb1bf792 + aa8658eb896a1e05f19d318ddc4ac1db + 415af03714e602767ec30ecca0598a44 + 02d5e01e483e8b82826741c4629aacd5 + + + 5844f9cc35db2789669022b04a5d6ab6 + 6560529d62e0f2a06b8fce1f241f8e66 + 942cebc8944eaf3a70c2307d78040280 + + + ce8752581aecc0409fa480b5c5d28db0 + + + + 00cf1d14186817bd6ff630cc0c295831 + + 6586f4f8a9111ca48812d77250ab6245 + + + c685d85266759108480c7f45f2c9032a + + + + + a16ec2a0e6345bd0653a3e7333a63be9 + 7fecf0c21249817b934bdab5d30d41cb + 97ac285d2ac4204cd19c3629a5ac2e2b + + + 1731601be381292101da0f5c1e8ad15c + 4c3e42126751d72098000d86af5b210e + + + e01ddd65d7b15ff273cc919b52f01c12 + 7fcad18be0a60d914423c4c7387b5e0e + b71f36b3c56b6d75d3fafa2cb42ccd02 + 378f6d9b83b7a5fbd9a9ab36301aaed1 + 753d60ebaa5a2688c3954f2746c5af22 + + + 777689d5e6083ef4d33030d1c6292485 + + + a7fab26c2971d929f6446004b1a59137 + + + 15b841ac77326059d7011f15f320d71f + + + 5fe3b32b605ea5bd406f7103768063d7 + + + + + f68c5c57b264b6963c47f007c1314f08 + + 4526e691387bdd85a9d57feef5e5d750 + + 8541aeab54fe63ef4135860724dba7f4 + 9e204654490713809ec079e27853c70f + 1aab59d13c3953f6508b10eeb43287cf + + + 46356235986bf651793a90a2ec6c9df3 + + + 32a9e4d32d7eeaa74ed8937289fc9c48 + + + 7b4aa76587e766d17287eec703769a88 + + cd0eb8a99e264d4ee83cea35a524f350 + + + + d617514c55d0947b16add1554fe6de7f + 0ecf3004042a5fde4b823d2aa2ada682 + dc0319de00744df836b0faf97e08fc62 + + + a77ae5279bf129b64215b6b177d61a51 + + + fea85c53cc3344eb836e2a577290aa4a + + + 6cca58db89e07ae4350833c809c47a04 + + + + + 5e5096642a639b2c2cc5b4a3e79054ea + 4114c74db5eca00922329939f4a6ef51 + 71abd4ed86a3103dbc3677652bdea0cd + 443687ffb508b7e6f5fd705c12369cd7 + 5a9253696fa757d78f7d31da82875960 + c6296f67ffd27f51a0ddff84713a8de4 + d8009229829a8f307ca01c394fb87fe4 + 99d547871bc56fea4cef2abcef6740bc + f226076e5334e727a4ca3a2f0823f509 + 1c18ffd47b2ec4a8bc616ef26f2621ed + + + e0a5f3a5a9b2f030f84e035516bcc00b + 605293a05bd46dc2036172958c461afc + 96ff66c05a9fb58e04fe807a2e63269a + 4c53396572f0477d62c242236d1ea5dd + dfccb6ca00655408544944258c687c90 + 256ff6a37bbc733e10c561fb6f080bc6 + 0a4b1babccb27310bfbe0b725cb47362 + 6055cb47013876090d42973afe9abef4 + e7eb599782952b11a35a87d31fe6a451 + 8b1282031f24ee485659b0731dbdc3e4 + + + 13d90e9b46df6efa38f2adf5b5411dac + 8f5e0fd9fd98d1cdc30d85b3a136be3a + 3db839ceea2d850f1d0e42f9f23f7da5 + 6728a860b3f5ad1373b05072ba024277 + c2a33d9d38e243e5846c4c003fa40e9c + fcca15a6a617201cad3320ee3d11471c + 3deb8213d12a1a5cd07b051376305666 + 208f29d81a7dbfd7f5cd30edb432e9b5 + 1b88a9c447a6f87c3899a7ad16b07415 + 2be43d8b9e94b0851b79b8a0a58cfc5c + ca76f264f546824fe71fbc0930f1de92 + e0f015ade9394ad5432ad1a427a6fe36 + a545f80506e458061208a19f34c3c742 + 7dcfca0608795bee44086f06b7ee0f39 + df2b7e9d0f5d41f5f8b24800aa3d844e + 051e816af1b16b79633c7361bb479f65 + + + 3d7ded8ec035c3db71b73826807d1662 + 5abd360c28229fa01e1bf04535fafe91 + 39f3863989c43a8913c6edb2ffa5f4d1 + + + 9b12f35eacebc29ee0a723cf6471ba5d + d6cda21f7e7f087ca4ad52ea08868ac8 + 4d12b7fdf832914f494b530b81bb74f9 + + + aed85701d6c0995bcd0cb1b7b36b85a6 + 6cdb1514be07408981bf52e12c096434 + 07a57f08ec35619d8a0de97eb9a547b8 + + + 462ee433401851ba65d16d1796a703b8 + cc630d2bd028167525f8188f94cd3283 + 3c17e186c3e8cfd4ff5d6854d828d422 + bb041dfdec6fdd44a599ce2b1e33bea8 + 9f42485416fb9b22d490b285d6719996 + + + + + 43d25598f6bdd19f5745b521070827cf + 43302bdd90296464ebb2998889c48c27 + f01797e4fe81f6ae2ff20c9168d391ad + 09d507a86c13b1e3ba40a99eb3b5f42c + 04ccdd0e41f574cdc11f512b9e2dfa67 + 6292ed40dea7f6ede70790ec48c561cf + 592fea732d872d66e5ee9aca8d433b8e + 899c7ebb632b4ab3e6a85ba41f020ee6 + 7a293d885af1ba29fbae2777b9bb7fb1 + + + ce1649c89268d11770c7b22c42c59ef0 + 1b8a2ac4a39bf1bc28d32f3d12f1f092 + 4d85e6729f5d5876875496d3c2a36359 + 2d13e75e91d56d03d15f04308c8159ce + a54afb77f2f49e706f8fb812ae6e28d8 + 7bd875f7dade55c4b53b771092f06fe7 + 95310015782e5030fe1d8a63d7e416df + 5163338025b07c78e52c07938ba66b6a + d025ec3f1442db3d87e7368d359c665a + + + 26cfd7343a1cb4840505535603c8d7c4 + a0ee4f191af445cdd10ccce6710d3fa4 + 15ac761c9b2b738d5520b0bf7c3ba9ac + 2b443f8946494fb9f0eba842bf371c79 + a6a0ae26a4cfa88550962baa1f51c4d5 + 706d8d56855e27cf6e9e78b5ae29923c + bc9af0daebe58220a3ddcf74ff77e038 + 06701aad94573abcee18bab3836cf95b + 48a7024d6f253a5c3b59d2586360d477 + 5f117d3cede9f2296bdc9de2acb400d0 + 61ab3ca426f318c45f86369b0386dc26 + + + 415852df230452ae6afca7b3395a7fed + 330cf807d0b044dd388cc943c2d6843b + f787bda75a7383290187f021f2716c29 + c24fa1dc8910d862bad96954927676e0 + 0cecede6c0d6a46fb4170ebf4bfeb052 + 83ca3c376a492267173a35d4792703d2 + ce0b878082dee6b6933de9b7cf51a4d2 + + + 67ceec45a6279a8bd7547423189e4b65 + 5bdab75b40412fdb24bd7f6391e1bf0b + 8133fedc3904f714af61b99dde2aa570 + 357ee8c5770e9aae9d9a56bc57115f9d + ad735acb2587e2005fb1bcd0bad35706 + 303778d37db62fcf01cacadcb7c23980 + 8e41f676a3b41f0b2b3e5c06fccf1db9 + + + b6906ed9a93b0b3299f4415871114f4c + d7a540a499138521eef60a29d716eb58 + ae6ebc4df3f8a6e6b7ac61c5ed363b43 + 38284f32a175fd75fad6a66b2d0f6f9d + d604779eb7b6c25d2d5d2d02e9f68799 + b8d1df33a5b50026679fbf7d10f996ce + 99bd6e07e392d7ecc679cd57eb1d2ae9 + 35db00e5672be7f0ce4ddbb35db1f514 + ae51200cd31e9a09b7492be3f4ad861a + ac1a6226edf1b7a10f1ba95133fec675 + 519593318faa07c3e8b8e88417efc792 + 9c00412773018c8592762d5aee372f92 + 1bcd96387b5695670887db8fdedbd9bc + 0853121357cd538e85ae7fbe510f7d8c + a228bd0e87e65323d194434ae424eeb0 + 64061a801e2e3a8aa17b5505e0605aaa + 4498fe9bb121db4ca26d9ad4da4213be + e569c3719158956de0d5cde40aa892f3 + 400adb7ef0c506e29b27e3b5d481e81f + 4cc9e81e7e6fb6c9247e5356c2343283 + f9cee1a1093e32958ee36e2d0f447141 + + + 1f5fc3e987bb5d69e83077403f26dad2 + 8f693c51214146a0da1686fbd481cef1 + d96fd71854391db54ec1498b1d501742 + 3d37fa70fd4c95965bd6fb419dcd04fd + c40cf23ab3decbb6e073ebb20b5184ad + cd5419c4251588a482ca25e95539ac14 + 3514831a255dd9fe7cf4f7504ff7c736 + 462760f7246cf8b13762eab7e83c17ce + 380fa4b24b6179cee7faa08a05925a50 + + + + + dd4dd6b27d876975db4b11efcb3f826c + + + dd64058d7f141fa339944908823d8bad + + + 01ebc0769ab6a264eaf53b665d003f56 + f11c9055c05329abc17a6ddd25a858c0 + 6dbce28313201556a3dc84b5643d0caa + + + + + 8689799f0a0f205e762f9f78576bac53 + 03cfb57caad073bcc8146475844b8113 + 196135d19bcc6d3be3346ad7d22c0288 + + + c51cdcde9c8f4eb3eb40596e4fc41f68 + 699c698e32c6411a3232fb93b7613e7c + 646451e634a6aa205021d6fa14e89bfc + e0efd281827788c35fd3aa231fc353a8 + + + 391a382375143775956e15f25e174c4a + 04a47450c282ce2bbfe968d834424678 + + + c5f33348be013d6e2da3eff9a2b7e151 + 2b598c8f4b0cd6cbed46d3e2478fe4a5 + + + aa594328096460a164f66f3a41b8ba80 + 9744a0f4b7da8546992ac1ad54d66421 + bbde99fdb9daf6ba8ce39c0503d8aef8 + + + 9ac664e78656cb31bfe6160333f22d6b + 1738033ca51d962b6063bd78aaae977c + 47afe2d4f6ae04a7ae27b184b7f5180e + 7be1f5982d729b8e81c7e30e122394d6 + e592895c54d84fe2b83ee4ba522ac400 + + + a1379b7931b17355fdbb7160c3a02fc1 + 6d0c3ba0903a4cf9b7bd21e75f70893c + b1fbca8a66a34925642ec1a6d5c5b348 + + + + + 6d4e42f8a478d4fc66e83b0906fc967c + 58143171695cfc2c213c379a8483de12 + f5073a4259f228155ab4f3dd4b0a5ff7 + 482331fe9da2593ffb0c3f5906a4d2c9 + bc02c3cf3a10b60b7539ea6ac2d8089c + ed062daca19a1ce7f4cf2a7000dcb18a + + + 4a0879fe1b162ab7c13b325f6ba257e6 + 3c2def266d4f367e06d8c50130d18dca + 4e869b866c00f26d886af5f73b109286 + 3bda4688b16f0eb2b2cd2ccb88f6e96d + 6ee51badc07780e511e89cf1e4e24c7a + fc588fa2b009145a22cb9dc8a7ea95e9 + + + ac7c4258256b91d2bba59fd463797fd5 + 1844f3e7eeeed3a9a8bdfe2f647e84c7 + 7b27621828afb611d6a080801dbd9d11 + 561de824e232d12abbe74c52503d409b + e89eb5f2cfdc75936aea21e330e89964 + 2d16d8ae9f82b4e13044c04b3d88eb04 + d7f25b1a96fec1863fbe0db989d22c1b + 277719ef706119967c8d33e2a50f0a4a + 9fe801f91605a81851763932229b309a + f40395da730e86eb463ae923bb1863e5 + 5b0037c6aa26304ff8aa758d16398995 + af818ebfb2699c2aa042dfd4f84abf65 + + + 6ab2bab51d5c94649aaa64ef9000ffec + 5290489cebaa7302e7a31e9ecf50399b + + + ec74e18d3bbea5def6c5b16d4edec644 + 010581824853eaecc712a8cce2458185 + + + 8b6b0dce656085dbceb4283165ddab65 + + + bb4d410a78840c4e588d693000916c4c + 7df9603ee7175d44855eb97d2c8000ab + daabbfe7c4cf2d07a050d3d180024f77 + 700aeaf5fc3eed828adbb3646ca41789 + + + + 138c6516f3bdd27296cd74900c835f59 + cfa9df48d1ca70a25ceb11c5249ebd9a + a0bc82e3f713ed9298cd772328de92ca + 1c77a4d0effbcfba31ab7bc20083f35e + + + + 819791b92d6353cb34b3869c111810a6 + 9ec0e839095ffce990ddd94e6562bced + 70a0f20c1a67b3d7531bb232c2cdeb9a + 165dc4714fa9971e26413bb1768c0b06 + + + fd9d9ff32211412ecfc639d2ec69843e + 95a30a255f3a40f276d1cd605a1a850b + ccb306cb79da6626f6fb4d5f7406e767 + 3be30a4307c02bae3fa174b5cb8fa0a8 + + + d75d9aa8d237826847721f9545c5bb7d + cefa1bccfc71568e9bc7450f93195048 + 21535aa527e823870bcf3fc8f4850117 + 753e47be345ea58ba648bffadda6ea2d + 140beda8f092f2ac12c5148dd5b6101e + 62f5d5b4fd271f35b9c8a6c46b3b5400 + b2a8662e11763c0e5198442c43bd0735 + 2390151b2048d3af5d4955aa1cfaa89d + 29cac40d4b8c9f9365be6176cd850949 + aeb7e0890791205cb592083ba9648772 + 78115c2226e1b7c6f7b326b005f240c2 + 356b6b9796c7b87214406586f6dfdfe0 + + + 9626d0bc39fb8cdc6185d6a226b21df5 + e0e8be15c3e6c9620a248bb0ff4bd3f6 + + + f77ff038b925d860ee33b65e2bba5920 + ae204b8e381396fa5d2760ce5d7d5b87 + + + 2061894992f10d44a3517cb9e59c2aa3 + 95fc30fbbbfe23c584bfb581d0f7a085 + + + 7f2323c403525a7efaf8043d322d013e + 6437eb083a8daca3d39287aff9d12365 + + + + + 0f1f39a3754575d9e07bfb8a2b1b4680 + + + 392ddb58dc60455cc6b4498455ab0177 + + + 2513155dc15c59880cf06cca1b1291ab + 29f43602b85ebd20083b28d974f82cef + fca7083bbf0cd59c7ccef9a1d8b21196 + 6a558863fba52859ee20becf80234cbf + 99c669e23aa55c36487a2dfa947925cd + + + fa127334ef8133e21e8a321a6d7030e9 + + + 7496fc5a32235185f5f51505e646f343 + + + ee28288f6bf9da107355184f30721048 + + + + + cf709439beb5e983ae824e8806474c78 + 6b02636affa2542f3bf7c4d5920181bf + 101caba05f9bafd7baa8e85f530d106b + 14354404556fb16674810d6678b6e816 + 7b73ef75bb9a91afc1b71cb8249d8c37 + 768837210a465f154454c87b792e803c + c4f41756bed2c1ba2e677e9d067d7b49 + + + 44d56575405fb9b45eaa5f4b2ab7fee2 + 954dbc4cd544e6a46d353156719000d1 + 8a4e7f6874e94436d9033a9601efac75 + 3f92f391558066478c398e970c0dbf8d + cf148cd94a2a3c6043c06764ab7c5ce2 + 31c1fd55b4064ee1ca09aa0b803c8857 + + + b70e936b1f7cf709ab427bd06010c808 + 2b3440fef215e336fef73df4e4d5bab1 + b046fcd22999baab487764c9811e81cc + 32fd2824e8479a0d9187ebfc6cc63571 + e3582bc5a4ce61e17afd687476d1d0b1 + b28386a29ad3356ac8857f204b70ea2b + 637631105283af1e91055f7459949c43 + + + f79fd3f0e4d3cdc722f4c43525d8e783 + + + 980acd52214a0987cbc54e94e344cd7e + + + 04d811104466703351acfb0e33fc2df8 + + + 98da02fa196c1ccd06785f1db6c77897 + 5fc0342cfc94e1cfb186c45269ec21fc + 26695ff4c3ae2818a42be9af839c6672 + + + + + 024946e260f6fb6589e56a3c2bd7dc0e + + + 9bd656e52b65f8269ab4bea7fa86ce9c + caa2cb143dfc1954009b2a851373cd82 + + + + + 70b658e6858c2f30deef5d11ecccaa9a + 0aac6608d5c4fa942dfbfeb797598fae + 93c8ba7a1c72d1b2b2950711e5166b86 + 979fed8ffd214e7a2666548832be1ae0 + 5db1d51d9459dc53b22e862f23f6f8c6 + 2129210e0f9aaf2f0a2ec060f12ec69c + + + f69bbb2d696e64c7f5151fa7c4d61c0a + aedfde3026d41f629162554f5341a1de + 3c69e1d92fce3e998cbcf5525cc2f951 + 37156fee1f70f2fbc8c27e23462da0fe + 20f72f70c8406f5f4c8a79595e14d648 + 953a175b68e74ec7e7c01198c7ef77f3 + + + 047679750c6469f87d2604910659c96f + aa52b57dbe6288b0a071913e09af41f8 + a6d358c6a27d8fa3813636749df2a88f + 7482599f7220d93f9d4c73c1440e3505 + 824d43b0b5416016cc6e892bd751f13f + 5fc136414fe63ce54bcec3f18c2f99b8 + + + 3f312c3ed7d8ebac2f9319afc95fd2e9 + ecd2695412e052b492dae2efe9cf9330 + + + f1dcd2662718e10e1b0060bd1943e616 + 6a75db10a75125e12de44648583a0a6e + + + a2c680652dbcabd333f14aac3c2aa65d + 892b6121687ff145711fb3df06000c10 + + + 36b94deb88c4223e07ff8f7ed376cde2 + 02c835887e958c0f2839e9b0c2424270 + a40d5893719e3c8f9585ebb1aeaa0a6b + + + + + 6cf07e08398318a9c2ebae8aa9259619 + 9a7b3e9cf12749e7f3487dd8a551516d + eb469c865cb45b7edca03626002e66d4 + + + 8d704edc90fb8fb4ea2492d4c427a612 + b4865e5c2fe7cd4209aaec69c841a930 + + + 1b7e8a6518c4dc7e35c3346a721228e8 + 3f4b88fb42ded11afbdcac08e78ac235 + f02a3d2d5876c49e407c2546b938c246 + 1db9b6e17ba7995971711b575927838d + 364363893df038d14c6fb239926e3dde + + + f3316aa044f08b87d1eb34c45b79825d + 560c6a51eb488865051e93854c7c5da1 + + + 83f44c4a150580c366009eadcfc26d30 + 82638b30727aee8e0ccaf541f8304caf + + + d7c80d9db231181b49dbf77efdc9d0ef + 98781695742716c608ca223cee42bb21 + + + 672ef6c1bb90ebbe27353865b48dff08 + 4a0997d33a6f13070a951e975dc7df98 + + + + + c258eb1080e344ad4339fa2d984159e1 + 592633b174c457f28d5cf08438eb802d + + + 1022d99caa555738deef649c2bb3ffad + + + + + ec1bac117af4226f125bdec64f222650 + + + 6006e6615d40c2b3aeb8bd0030a44dc8 + + + 1e7f1b71d3b0bc89ecd675e7a246c47e + + + a03a5909a354c7c5db21cba535bd6422 + + + 89c06c651273ab5f4ca4d52aaef031be + + + db675755c03e9d895a53767f1ac56ba1 + 4627e82fe16bc978ce2989cbc508e4cd + f2a0e414f3fb4bb71534f035a848d3f8 + + + 9716ad1b900423ccd0087cc0b677d540 + + + + + 1d749a201698f0ccbe922f16335e0f73 + c7959c5c7e1fc58b36ad2f55b5fe7083 + c9d9462769177440a6283c533ff27a2e + 1c53ac9bb30cfed22f9bf15596d47a42 + 9c5d2440871311c6fd33b420d182effc + 194b37bf3dfbb63054d22274922c9d55 + 2d47f8665b62b274c0aae77f2d1dbb03 + d36d5e177814b5ed711e98c8d745c78e + 93019aa2d5f5df824a94bb4c5927e2f8 + b0b20ebedc0debe06ec7d8990a7c8ad2 + c483f504c588b973b0bed3b00ad09cef + 1bb9421b322f1a4ed9b62b2718c4e7bd + 7f587fc795577fa7b59639ae8ca9a3a2 + 1b161f0f0e2f7c6dfe341a43a399d179 + 5d39a6ac3c8bbe013a10b303a02bf8c8 + 26a33976264ad19ba920e95320224e2c + b6fdc7237662afb1838c68894ea71ccb + 0c1f7339b7007aa70b442a46169b2ffe + + 82a6c0ca0a23023e311df5ceecd27a0a + + e426915c69648da27f7951364cfe8820 + bab572be7cd260bd2468989f85df1daf + 68ba1da83a990871ea0152fd593e42f3 + 6c2fb4dc7f5e7b3797766a49adb3c6a9 + 1acfbe8e7735c255c76345f0a9e8b5fa + b5cb880d14f2e6cae158a747a72f0058 + 90a39f0a418c55e2ec7beede81e51697 + 6c30db29419ec5dbb046a73f8d464c65 + 651731311211ab2702a13b8f532c5cd1 + 2177cec146a9d91371dc7368599affce + 8578e3b3fc00761fcf6448ce8aced243 + f6cb8a71d91c6f0b51ab0b97b1dcc3ef + 5e935d77b9c9e2f011db827ebe99e698 + 0eb0c2534f3a384d346067f655e53937 + 048ca2b7a6a27f5cf41097b1554a22c2 + 59c2bbf681379f6fad7235bf24c72ef9 + eeb3128743527519aec6552648f653a2 + + + 716f987da083252a10d141fe980ccac6 + a49c36fa7e467b86804c082bc3e93858 + 557152d003af2d514b7fd84ada983ec0 + f14fdcbf1f41476f5e3f22243f0a1dcc + 06b0493837dbb210cf9713b8666e9bad + 9487aea3f986f54a3c01c99e820d73b5 + eb29002f2f9b03cf61cd70762e0f9a69 + eb53b50131cba9d7b783bcba3e9b3e85 + 24a3e11bd1923f6f8fb064dfdd199959 + 1abcfc3a60767b0b099a841e08f54be4 + a7da936f3bc1dbb98573229b2d794c4c + d8db2171f23957bf15adb4a7b8dc95c9 + 12c82dbdcbb78c74a8803d3230d54396 + 9490ecd04419545de9fc520fed7b700c + 104617531493bdc68cd74e24c3390e2f + bbc0e7655fdc16caf7ec254559f24a96 + c91319ec1d449de5f4e003fbb1ec2e60 + 06db1b43f74216c9e0b9ed28a6384ced + 12d7c5e03d37f20efa10fc05e71c5fb6 + c4aa1393c31b4a30317be3cfab410800 + 473b84c7b48e880f0493469a13969c1a + b18760f83b6f629c2bd06196d82aed87 + efb9a4b60dbafa7556ad5552f00d549c + + + + 69657b1c8e9b94d0f8380c8e7a995ee2 + e2e40c1f8e7d55a0f2b16fdecaed9a76 + + + 1f58777a6c4ce868c7af05b4a3d8286d + e61da0e07c1855a964bbcb018091bccb + + + 677c6781eb116b3c835de7ac070b42d8 + 78fd9ed7c0e57a6a8d6befecd1e4ccc5 + + + 7fa2ab7a8574805cdf1b72dfcac0130c + + + + + b59b672cea42b7294e3f76c8ae3b5c0a + + + 19e2d18b52e3dfe89161451d3db9a1fa + + + 1a9b9939b52b16bc284fa92514c3150c + + + 7f6281d6f9bf95bde76469e3cbeeb92d + + + + + ed852ff2c1afb16e50f33f7a2980c089 + d562ae361b383b333402a9ee4e8f81b8 + d317c7613b3d378e3f36164b9ee02bff + + + 06811cace5e57893c45fd52c1cacfaef + 420f614a32c95cd92ae98f0837625cb2 + e66525f21bbb21cd6e22c896cfae5563 + + + f451b9dd80363b3d791e2be465b04bb0 + + + + 50e00556f2e1171b79d040a6f34301a4 + 9d84f0180117c2068b342963e1e57eab + f7d07e3f754f21f7530d9deab29aeafa + + + a2e9244312b592704a72b754cfb54ad9 + 815f3a8b9d9611c596b7fbbac2ef14e1 + ebf256396a9da615dabc197a3e89f601 + + + 3d492ddd2fcdd07f3c2b3257e56bfb46 + 4c4ede5f31a45819c2baa5694fb71207 + c76012cb7d139572049f2e145b47d6e3 + 6cd0df20deb90f4dd0a0f9f5abf054ba + 9b4353f5df2b2eef5b0d6c55118443db + 0c2ebeb3aa5ac8e62185d7a3ed01e3de + 1f7a65ac8b3b1ed0b2d1c65fcb4d232e + 6c642e3e35154ac22359747d448de5bc + 85fe583be5e133a56d713943f47e96de + 0bded243d973ec42421659a822ad866d + 3d8f6d26bb6fa7320b36a08d60019fad + a4403c690b10db445806b2bc7fcc0b12 + 131abf7ac63ea88768dbf3ee1ac22c0c + 0d048676707a4c3e6bc2deff264daa26 + 4e0d2a1532317e05ed4ef42756ec3a91 + 639a29854b227b46f74f3470acebcbf7 + afc83b62b3a29462ea3e17c82cb8e8f9 + 5fa17e091b2fe94b3e13f18692532a42 + 715144d82f71ab05d9ff768956a530c9 + 865e32bc018abddf626f6e3b1b2ea653 + f46302a196d48f58217b67f833cc8039 + b03917da9e131759dee5a739fa14b212 + 2751b4a8c800b2aa60a1bfc2ea32da29 + 263cac4d8a09cc97f5cf9fc4973d54bd + c41b74741fdd3ba288c40f93bd4206b6 + 9a8e01da1436e8aae58b16b4d07158e9 + d2eb6cfd356e58b7a6c40ca3fa0e313f + 25be1e45e9f662d3ea3b8d5ff8c14e22 + dcc91b946f65a0c3e025e153129ef797 + b670d458e7d2d58558d8d181c0067a62 + 3223be539f699892d5396e0d43752b74 + 00e2d066ffd1e3366e83b7a0b87b6b62 + + + 0dc9b0be5a1984802aa1d803bb616bb9 + + + e1dab5162ad414b08d708a55f9dee036 + c1b15a3b2ad191ac9b5ccbc1ff3328d9 + + 91e4d2ca436407bbe38405a3a8721416 + 108e46774033b3e32cc84dcfd61b95ee + f4a304251df116f0d5a5b52b950cd394 + 7e7502e8b7e1bf278ba65929a3f3ca9c + 8f54989a5c17a1fd93c2a426795a00f6 + + + + 0cbe379492f3792bb36624f058cf841e + ed9e06f17bd612ee5e412bd6188d2410 + 66b03f9dc812464f07e466e4ccc44406 + 40cd5fe646a6b150ea8b3f9ba3ff6415 + + + 82e12ea566c110470b853fa9d2bc5a29 + + + 7271c0647c9856d466e1493c007b33b6 + + 443df39978370bf60c8b8700e8a96b1c + + 7cf16787cc97217c9e23da66291fe4ea + 7f675804e5da398a9dafc8c1ee4c6008 + 61aa75691ec7aa24be37d15f567d9845 + 2fdcce2d9d6f24f6187b1005ecfdfc16 + + + ab122c78e2cf1ef7d95a71631e141bd3 + 047142076edcf6f600837660bd2025ab + 0ca26157e888c5f2478b5f863fcc3080 + 7edbb4d28ba82c7464f0ff05a2e569fc + + + 4c89483d4e479d332afb11416db4894c + + + a2c4e466eedebc997d79e6d767ae5b00 + + + + + 20b8bba74aead306962150e08deb04c1 + d4e738274139c35b6ce7d2f0ab573af2 + + + 7c0aa487fcf0d6fd641eaf11e553ec93 + 013457184cea6d2108ad3a77535c3f85 + + + d7f5fa74f686339c8092d203a69f2964 + 086d96bcb948868959c19fb6df0b1837 + 2c866cea0684f800447c41f2f232a836 + 75a19528405fc29925f37b657501c56e + 0bd101b3f5f29ccef56673e9dc5ac7fa + 4f10b482e4aad862612ecbfb8fc68e88 + 000f9a42229be06512edd0ab81e4d925 + + + 32a99171f72a35f9f09c0ec7d43009bb + + + 0d396ed5247bd3dee12e4765cd376d91 + + + 1906053d6bcdeca47d158caae3692536 + + + f89cee1e9354595e6a9eb02077a3f131 + 775866c5f5ffda7ba3b29971f6ca773a + + + + + 04961e2acdb0f323e51ca63b7dc0e86d + 0f3e44d05460fcc86f9c01945cb2c838 + + + 2ee1f258a330406fb0b29d4368193fb7 + 4b1236c6dc47a693ed14a0a38940d41a + + + 65392984d10a688ad4c8a4bfb316dd92 + 9e734de71deed8b3aa26b395a86ce0b6 + 936d0978f90ac59a3bd1ed94dcf55a8c + 89f66bfab0762a4278c2c8287e5c5b21 + 494ebe4802f929475dea223f9d43c9ac + 5728fe1130a9a687d066f716528f64b4 + 6acfa3da7c08010d581764c482fdd307 + + + 1388bfb399a35585ea43e66e01465ef8 + + + f5a38d56c56351b0ebde3635193748b9 + + + 80dd0d973077adb14f5747d684b0cafc + + + fb8566b8aaff2351d5e0e21a7e9b9d1c + 42c114a8343ee2de29f3dea61eb66194 + + + + + + + ea4b98911d43205882a70b7a2d18d082 + bb3545bf8e7558323ed3d393b4e90a67 + + + b8051804d0d3594394f2b74b779ceda6 + bdc9c9fe0b00ad9fb48f3f19f92b3596 + + + 6a6dae36d832df9244c052d952217499 + cc2d278513406aa0254241febb2671fe + d8e9281add1bf4952f61da9cd78b9614 + f2c5ba965833f026417d864a777833ed + + + 8f5f85f9d74874b7c669e1602a540da8 + + + 2c007e58b193b3001fd79c6665675b69 + + + + c1c866344da95722f54d83a3bf8f8ab0 + ec578815cd14201b580a60fc0d6e8626 + + + 019ba2cc657fd5341243b758b3ff3206 + c5e4c07533958d7494c6ddbc5f92b14c + + + e5118a666ed8796ae1de787aa13ea3ee + bf3f4727dcec6545c839b39e1f3a1c5d + 3203b65192d1c89aeea1647961271e6c + 11adb3e09b59230266fa9c2b1b396ade + + + c083d37f9c1beb8577bc699e069fa421 + 7da83b113376cdf83a4bbd6ec97ad9a8 + + + 59b07b1fff78fa54c9818e48c3e56e64 + 45c835f741838f62e88aa780a680e036 + + + e67a2616c380d72e8e98567b7c365a81 + + + 65748cb352fcec91c0c8493629e44d94 + + + + + 21205d2bc7868fe3cfe93b64bed15ba7 + 28d574653501f65692f04b28c65a63cd + fed9adaa28cf69f44257a19c2c1c5531 + 2e01ef21275377aa1ce4347f55122238 + f46d5cb9b74f4d010f54ea423de6209c + f9f73fed127558310a5e34377a0344ae + e245e48febab892a1f49f235f0540e8d + cc455e66d86fdefb6166bfd64c491571 + 1d7a26a41717221a1d7fea1893929065 + 785f9d09d2b1b42c5b0eedfcf2986158 + dbe3168e4a28bc955a046a503c204e6c + + + 4b8cc94867ddfffa482e0f43178a35bc + 5e226de611ec993867c20ae3b8d52d13 + 60ae893bc8b71c0845fd1f571865f4c0 + 6f0cfd6913975c80bf196c288b8a48a9 + cb444bf33d35b51c9ff74a5b4c7383bf + 9a64bd57e0c316bd2a2ae461ddc2c091 + 62a088ec912833f8b217617acdd992ae + 37c18b1199a48a0c0b50e373f5c07bfc + d03ca0f3a35893369061bba60989b3ac + bf62e00126a78c71b484483c71253a63 + 893a51b0d1eb23de1c5da4d542b10715 + + + 299b63e562f986d74aeaeecf9157caca + 70ded0d275735b5d445abe5856abe3b3 + 7405cb31faa7e1f6fe661f399778e368 + 8a712508d0f506ff6d007d32e8c90803 + b21dd0cdb889f8b9b7574ebdb50283b3 + 688ccb9f7b7b389c7b18f7c2796010e5 + 85afdf5f0d7c13f58b56e3d6c19ed60d + + + c666d613e817f95f7315999457aa12d4 + 74e8d2ac6c8938bb0273d4a696a3ee88 + 5e94105232d014dd58156542146bb2ee + + + 302659cf6cfa5ff2232711183f450421 + 41acad3a73314efc0c73b5c47e099b9a + 56edefb828e47ee778f6228a83746fe8 + + + 269b4f5732ab458a3834668f0a661f1b + 116c4ab38b053a72a69fd270b1a56639 + 1fc021eef3e8eb8c84ef49200c3c1ee7 + 372881b6e4ce49b07ba9a9116c525f8c + 8b98480e50ab784eed60cbc1c1a4f523 + 9af53ba12ef601950d533e2c9f70ac86 + 4abe9d7626c35b4631c46414cde63738 + + + 2eb14c00cdc8bc661a25bd32d40c9fdd + 6fd0a506421403fae6b15fc0c723783c + + + + fea127e84c9af78a80a573c9a707990c + e5883a7bb73d6dadfcca8ed320a5fb92 + dbeec6d2bb45c6bad95fe9e38323bafe + 82de7400923218b6dab341070ab87617 + 81338fcbfff39325c2fcecd2ee0ba620 + 776a153befab4313acef45ad05f535d2 + 173be852d816fc6d2ea79febfb182f31 + 02a8cd6819b4e154407a8a7a252b63fd + a4ae45135dff3f00a9d921bfa5bc515b + ffecdccfb9a7230b8409c89d938d9d62 + bb257a6790857c86c5052e97a6e24384 + 2cac985247cb354142d958f0634cae7c + ea4d2a72d5a8a145769fda09c72477e2 + ffd95a766ba36b817f09d524efaebeb7 + 79a5b4843c0ba88248ea9d323850631e + a8e45a957a301a3ba0bb50cf4719376f + 766160239bb683310b994682cc38be7a + eb353fde1f75ef0e81da9e4bbc859cdc + 4dcbe42ab08fcc07d02b7e0f8ef2b705 + fb8bd6810045c7f7b7b26e723b68bcec + 16c560c57b7feb0dc84a3708c4cbc801 + 9fdba82a06a8e9819b888d2d99efb6ee + + + fcba747a6d6bd6ebc7ab5740d9ae2c99 + dbb492eeb22ed6c645abb99865b25b66 + 8dd399305321e57cefbb25752d379ed0 + a76e4c83e6de691446d29ba599af3e4f + eb1aef35c11ad48e63d1ec070d7200af + ec6a127e4d83b863007c239edf1cec77 + bd1fd2bf3a42d07c2f865337b80de8a1 + e9c2f0a46c75e1c71d528f19f76c22f7 + 8bb846c020ae448ac2f9e8fd5d8c719f + 88eeb05f50fb4d0011b139928bbdccb8 + 71d2ae318b78c2d21b8506b02b853c05 + 1c555f3ed6c2afc271d7ad78b2e19778 + 992797dc59c58cc119d1e6d142feb89b + a683774fc99e7409ddc65c40aa12ded5 + 3960003b6164967dfd1bb168b62e470c + 8a75077fe73033316cfc363f2c49406e + bfa49de6f7d78183500ba8fe517a45ce + d03596a13537a4de973d119c71c21c3c + 0a7474b761655c2b16162b97767f36f0 + 934e3aa6b2286fa1e23b19d3b0d3c982 + f4ddba4680fda047f9e0e7802b6978ba + 599ce07c28d4d633056beb93475e3913 + + + + 3fd18c154123aa902c8f4cbb58662933 + 3457221b5cb2986933f972306174dca5 + + + 9769f6397f00f495b7706796bb20ff5c + + + 8f43cc72a75b17b3c1f73f1c74de6f5e + 61e4ec5e350cc1eea423e76a04514115 + bb32a1d2f079e475bb6a063d05ffe97a + + f58145c8eb8ecf8ee6ddbebfa79fb3ec + + 521b6326432431d47acea38f4872248e + 83899c46b881028e059922fe61980c36 + + + 84ec1a822c3d936eb813fdcfb9a8acbb + f6d8d514eadfdf49f028e9791fcb16f3 + 59fa6feb4e07a736c2ef6766125d2029 + c6196de8804ba3469c08483acca9e05c + 1176f9c4c8504366652c3a00d4cc6427 + e732a2e663a54a9ac161c5077d55d1c0 + bc8445ef9b130a72f6fb9a7a6e2daaa8 + e433b46a83579855eab9713a437f67a8 + 9d898d85a929541ae1e1394c9be181a1 + + + 9422dd9a4822e68d527370336aef3c4e + + + c92ee22e6dbc1a787854494b69e0b649 + + 075f4180096c9ff41aa4de0571be165d + d0e192fa2ca6d95a18a3a0e77abc62cf + + + 8d00860f964248103afe82153f95a9e6 + 20385f268fb0a2b1386860c1054ea919 + 4ace196863916719e6ab2c028426c903 + 6ec83cfd1f42914b0d60df248e0bcbda + f316c4d54b57db261372cc4638c56f9b + 32ac598c86615d1c8b38eb6bcb5eace0 + c017e979c83cf327514eb60b7661c936 + 33f59ba4808f337a4147f8dd49e3de4b + 599e4d37e7354342f60eae7023d26d0b + 19b700797757c61e33f6501d04e044c9 + f5c8dfb0352e854cc9927ab85ee59c73 + b017e46a19662c7127e7567a882d37c8 + 842e85fb5a12fb73449fc59dc4696fed + 64adcc99f4c66767f5085a6852752ace + + + + 1e4908a899f0db32c9fe8ca68f119c9a + 23f60a7f42820b00638d3a41eb3042c8 + + + 0888b38aaa4e17f5313f13c9b573cae0 + 7d05f987350a7a90e44598c0bb651e99 + + + 5675931a173365127db5d74a73d6e8af + 29c456f0714616a17759cdc8ffa31d6a + a778d58e6d9a6c4a62b0920028dac913 + ab80c8966b2d97b59668dc10d0e10442 + + + 683a409b6e1d98d4fcc09f726970600a + + + 7a7ea7fcb75e74515257b0b5fb7685ad + + + fa166cd0e0eb0ca2d6c2dddd82ef9eea + + + 90cba872df80a396b6ad620fa4220b53 + + + + + 96e57bdb8446011b37aade1dfa84a38a + 8a05f497e961c71b6bb166f82162a78c + 84da8c8267c23866c67fe171ffbb975d + + + 70e7612ce037b8f62b59af85b0c59fa6 + 13ca211b74f55e877167a5b725e1d30c + 35eed3064d83c1f48b66972b6b6423ac + + + d024c023baf550cf759c3ac2ce96bc86 + b95ae3c45d064659c34114f88e4f1e16 + 8782c392ce01950f1e2c1a7a9bed17d8 + 3f4252a7a8e1e3f5f6f0dbd2cd15fbb8 + 26dbb95dbe3a215228c037f6ec164ef7 + ac40bf6aab73f13941f15263c31b1946 + + + 5da0558ecb1f3c403f9deb61a2cd1d20 + b42c3f86bc6fd3bd90af44d7ead36f0b + + + 7f172cae88fca536c496d6a5dfbd2411 + f35017a04d0038a427d0a012ae16f9d4 + + + b38f216467c79b6b05986660a02d9ac7 + + + 402548350d747f7c7d02f697da93554a + + + + + 8243c3409ef64da79f598a11357d5a57 + 95df550b9b1c19907c1ba94067f0660c + + + 9c28836889b710ac93f89aec841e492d + 4454de8822443a59ed0c28d6bc27c478 + + + fbf5c1004b2f060d39786438daa61442 + fe3ec71f3b443734c28234c701e53327 + + + 5c4be6db8bd7aa0ea81ec41668b248ca + + + 1d13117dce83b61b6d780916bffa19ff + + + c91312eb6b871e60dcad9d99f2e03e28 + + + 6841d38ebc172832570622c7bdfbfb04 + 6c1ab13e4546edcf9ee67278f6633e3f + + + + 3f33dd05116c0a04b046b684a88dee14 + ac706e1deaab3131b6997f7a8d99da4f + 9b18cf1b3fada20fe177971ce69142ba + f8f0214ad5b54d0569f6c9cf605ff877 + + + 9531a8d5e427a42f18703075a4dfd97b + f47b45a6b9bfdfe9a5fcde4eebe02fde + 4b329c738f5666164bd0df73bfb313bc + 34955581d42bc276c22357510fb1d289 + + + ff5add4d74080ea179a4893b14d5caab + 195f3f048211af639a55ab376aaa73e2 + d3cfac65218eef7eb8553f7ce6e5baf6 + 1a23489be14d74a134115b29ba3bfa76 + a361497cb953ff2287d2c86f80251da7 + 9ac7dbfa60c77e484c85771ebbd9343e + c83dc38e4aafc1e29fa6f5bda391e58a + 8ac825014e80fec010fec9c255195490 + 03e7e72ac685c9e1e729b2c5777be96d + 1aa60482e38ef8a5edb8a0d7a1d9d64c + 91dd754a55c17104cfb9cffef0bb208e + b7073052051659d49f7a3f2021a8a544 + 87751dda462ef281a11e2808e673b937 + da93be1a748ee09a1509fdd6f5c70eec + a885695f10ebcdd8bc4ad9f112a9a10f + + + + 260dca0c55956650ff8af0b90eb0cbaa + 582d1d74fde9d371595ee9025ee17537 + 56dff3ade612c9126d5a0b69a96f8247 + + + 0292b03d460c6ead0e9db5b386866e17 + c39e0f11d1167aa46d66af3f573ea6b7 + 21a3427199bc5efea2d54a4c0733c5d0 + + + f80d47da520eda61cc0dc58a5cb80fa5 + 70ecbbbe4e2c227f99ebe99b0fe6c005 + + + 4f8b27cdf88c859fbba7f69550bf3f63 + 0207695d650d3c5075455764934e9074 + + + 52086212e6a1c2effe08c2b608dba546 + 447ed27227c9ce243d00839fbbda6851 + + + 5029fb26c764ad0347e4e8aad2ae474f + + + + + 8506e36b418ebec39d020e7e1c0a0e36 + + + eb1df4412253ac24088f8f162292837a + + + f06d8149ac1f9f17d2eb378fbfc81d63 + 4ed63920e74c3e0a031417cf6432e9cb + b36b60b717304efeb96b7faef17c7b9b + 002a19f153c8d76f2e7bfbb35129aadb + 5fa71c7156e905cb86cbee4b717e0e6e + + + 628c91d07730228e9e1ae895047af6f2 + + + + + 0238f35fdf6e3a482ec6015ba3c64e1b + 77070d265f7c3e9fa24f10643af355d1 + 497d7e3067d787a81da3866f07330983 + + + 8aad1721694a39886a88df6fb967ad72 + 861d91648a7c0bc6637f976aac44cc53 + 1ee23d69dd91a864e3556e6ea420b295 + + + e5eac3ae2508c2502237585f0eede5ca + + d5ab26e63564ee05132d2874153b3810 + + a09876ab46f93bbf03808a497a2bc30f + da235dcbb0288fc362bb0c0a8830d886 + 597583af726a6131364e035e04a203ee + + + fffb2df6261a6352e110218a332ef6a2 + 797f9187723a7ea1bc313a74539965e1 + 9f0f8a4837fda603f426034702ba04a7 + f9ccfbf041961ee1a899aed2cdc9efd1 + ff4fc1577f3e743fe23e3fd1b2fd24cc + 58c581b400d188d3ebdbf268f5a175c4 + e90a642469f65725b9ff831a4cebdcdc + 0942a848d3dd4ca7eff2d98140843f45 + + + 397caf8e67c8499518d60b819f2cbdc5 + + + ad5689e4ad7d1b590d52db0fb4d7be07 + + + + 76644000f1815c8f75487a34d5bcb5dd + 79f3a8da921002aa90a6fedb2414ffae + 74958f75946c030eb84225977d8cc9a1 + 587c9d37a11ca2bf42a23013c9eaacd3 + df9b605ca6ac9e15a79c5455acc7cc89 + 8423b25fb638dd20d9b38b32e4b21ad3 + 89ac9781fa1770daac697173f905904d + 93b234fbecb76134adafb1786221a54e + e0dca3eeefc11324601d55dd91355803 + 5437b84a2519d43a70ba7ffe1903ca80 + 6feaac1d1b096d6fd88385bf967175bc + 066c902af0f8cf447abb3fb4ec88e627 + d65bbe73aad3f20e007be0cdf454863a + + + + 0b41f889992fd8ff52c8a0f8b771b20f + 9afc095beb6ff3097b5349e6b284d3c4 + d60a7534a2d2c3aaf71a15b4fecd1477 + + + 1ff23a3b59cbeca631c72ded46be448d + + + fef65b43253106553b34c1aaeb9f7533 + + dda9fdd653c95f2effb2e200e4179661 + + 382e72e09a329a846d6c5977cca81e07 + f2a876d39086f10ae4ebd3c796fb9b14 + ce7771a8524845811e37976c7f886693 + + + 3266b1acb77bfbc7e0b148437f62d92a + aa0ecb118fb16261c6f3907aa167ac00 + 02596027fd1b78f30844d195b2f5ed97 + 9a07156719c9ec7edcbe83f197b9fd56 + c09c8c0774949128ea0c69ca5a297a6e + c17d326c66790d435c93ef5640b6d83d + + + 9b537bc731717b0d380630529539af03 + aa513e2d4c03ac81cb06cee5845b0fd2 + 5115b9ac0d2b864b590be953d8769df3 + 0be1ec34d7c5aa3691462896c6f0982b + + + + 9e9e2096a3e03bc0e97e7a25cc657634 + 01a553d9065f7256a8be47087eea094a + a23cf432a8db2a8bff57226183b08f8c + f47c6fecdf7bbe0e398d590a0fc9f571 + + + 31ed362bf45777f52fa6dcb64fb93099 + + + 2a5c84ff28eea4aac3470c8261509ea5 + + 37e04657eae0f19548ce994cba713b95 + + 076ef4609b1f40f5abb5bcc8fc87c8ad + e161ad3cd4b3c2fab9b0e22045b23f98 + 899362de0255ac8a7d048a3acd5b4e97 + 021773b317fddb046d589d0884c5c642 + 6d2538422d9f08b20d4ea06a86210702 + + + 23c43292b11f969cf6d408a1dae987b5 + 6afa5a0e153be3431f0b20eec9af8fcc + e4e5ca71aa5196010bad948e1ac6dd2a + a2608ab387aa81784fdbf42b08f79207 + 5a530b264b1aaa07748c5da641db3fd7 + + + d2ef1e39e5febc328051ecec8a7eb8dc + + + 60036a654171d0fbd4591b6b14fb8bb2 + + + + + d5efc4c5023b3a1dc84eecaed9249641 + + + 6f1067f433a9b16e0c61fa6df6639c4c + + + db49ce28fa491bdfcd0c4a17ffacbb5e + + + d3e10fc24400f7b5d0c1d53a7a55aa8e + 77d9b66bd9860384a537dcfe5cb96918 + e96885a3c7524917f0621c74847063b0 + 5eb7894017ac35e808e838cabcdba39c + + + 5cdf8542278d03c9bb3c59e0abef45af + 1664a9b362356633b1c5e7538dc1d927 + + + 5742194f28f5c1ccc760188afda9174d + 37305c33be6398a1bb4e428029552282 + + + 1aa5ec64ea8252bba59d512e6417edf3 + b76bb53b1084c879e178f069ca1106cd + 5ad1c62f732f477132f6defa3eb745c8 + + + ab12c338117b56a5a9b8d3bd62940620 + e161cd8ab92f334c47c5d7b9e9d02e56 + c5ca3f3189b48af13588fc214689c921 + + + + + be8534e682b63349c39f9a4b60a8b353 + 1ecd7f04fc96cfe682a7be9077978d44 + + + af848129e7ba418750d2f631bc393f75 + + b5f180e337fbee94b9480ffe17c27d3c + + 873870bc2853c0fa14e818042b9dc74f + + + 089d4ffd37b973fa2fd065567a187092 + 9bb81613630c6e086b8796859d3d5d2a + + + cae07d570c08b49dae8002f2eae4b7b5 + + + ec68bd2e5ea8e051b65e90c2130c332b + a1040a93e32fc4811112b53c4f8b906c + + + + + 57c2f1148079ce0433b3c28e377a327c + 48be6a2a2fc73f3f91c2b044f335463f + + + 9bf0808734d6af03f057fc29713f7c53 + 94fd9ebc00479db530a9c51f280404e4 + + + 906d0af76af3007ee7f699a2baf588dd + 5c1d898117c65450a6e453e1ec4c25d5 + 9a807131b3f9481618e833a5ea43fd6c + 2285d11517d65c9cf676e9942a03f3a8 + 30d4b293698acc8117215973b6e12741 + + + 86036727d116153bdd2b7265cef3f883 + + + + + 37a178fd654b7ec3730336ab259fbbad + f9b5fd0b5afee26bc25c78486ab5e7fb + + 9dd4c2eafc35e00b651ae927f132578e + + 0acb3194655679ab07f57cfe40100d2a + aa8d7f414535cdcb861d6619190f3462 + fadfb2007d414b1ff203084085e8f88f + f8f288593bbf227ec75e68f54fd863ba + 2fb5cb74a45ae4c770a1637b81c6823d + + + d7d73b2198a9c9100d45af4feeb3768f + a52e08f78354baab87509e3d1dddd0fa + c442baae17c0c627cd2efe521a71f53e + 12780e8da17aa87fd11237e41b109704 + 3e6a11355890450b3cf935c7c599d0d4 + 468fde16b17553e5b983370b9c749196 + + + d875c4889949d34d2bace914277f7ded + 4f8d14167e9373b0c9acd54fda6aa757 + 347651c1b6a681aa8c5bdea9294145bc + 49a74354365083d660c52d3ff74b88cd + f9d99a2cc0b1e81360289459fcdcba32 + e94462b9298c2697f44c5b1b86abd2c7 + 4d5dd0f646813d501261d8ff352b6259 + 793ce9d7f9e979302170dd07ea52a82f + 5503813bea54f9a1e53d6e5672fe8fa7 + + + c455bed902b6624c31644635c7889df4 + dd4a7037f3e0d74078d05e2abe61dfca + b53e13077f47d3cd4659111b1ac9727b + b2550eccb0bf0493293f4a88c9c998a8 + 4d13123165d9b49f73171c7ae6666471 + + + ac3a52de141bff7da9c22f1c4ed24766 + 6a1693741a81a6d5f43bc7adbe8f156a + 510875eba44b5b9a03f8eef59bb491bf + b882faac0b390abf4bc9b82ca55ce8ed + f10fec9b5dc2d9fc0691a61f561d7bb4 + 6ecb138a5f2466d93f60cd78edcc1a7b + + f107ef2cca979bc1277f2063f7b3d050 + 55f77df0ae255ffb7f21bea5aafde1da + b3104f7a92739339472c7dd578d48610 + 614f67dd3e683aebb829495c2370d688 + + + + 789fdb0b80a20f1d7c6dfdf07584cb61 + 8a6b2e2e7f367819e43e4421a5ea8cfe + + + e03dee96c22f313063d3b1be40e777a0 + + + + + 48259a57be33042502d263046be23c9f + 9d3b6bd53d56b180829f9f2f4cbf3d02 + 26d852e58e8531ab0c06dccfad910d63 + d001d22967f427de4d085add52307910 + 3d6e32472dea9e300f90b70f22716583 + 579a1e02d078c4ad27a8a8bfc013ff82 + b3900facb316fca0539e09a5d0e66280 + + + 03a3a71ef25d9005db3678a39a245b78 + e31c9e959369ac29ed6a8a830a49a2a8 + + + 3e9114ef17be8a9f82dd14576783ab1f + + 79f605f3db4afb228e21119a2aea8d02 + + ad993cfd8afe21f3cf0c5dd66ab62563 + 9ccd759a39d9c314dadbbd34b18af351 + 24f6b2f56cc49c17370291865fcb7275 + bcc264759abf5e95a60e8b7b176a4df8 + 24b2ba35871bb113e5e291e1e78a4296 + 5c2002267ff30d59120c7d56518b624d + 8573d64af82f185e0b040accf910c8fc + 9e4a12a59f01514b042696b9cae8f60e + + + dc470b61b769fc90dbf276849143d47b + be5c11b3fd62ab0ad6aafda7314ba52b + 064e225df6d59016eaf0ca83018069da + 6e7064beb68f302f2369c943d81e85d7 + 9ed012384ec948dcd7232c5b97143122 + 1c85e7729e9dae4e2d6a12ab651dc037 + 8200e3c88300c53aeed2de15e4bffba5 + 108ae6800afe88f323d3467f088b52ab + + + fefd779396d621b34bfc4c3b60bd6793 + 2510da27b50b10e20a36c5674b60b163 + + + 1eb4f5f4da96e21a12519a2a7540fc4f + e77a15a70c4121e95024564228295656 + + + + + 8c2dc333284a96df3a2d3af06d643ed8 + + + 3a07542c7f2fe9f41751a0fc86c20fca + + + + + 0eeaeea6455013dd7ff7d6be57463198 + ca37811e7a906ae1b3f5bee85b54c98b + c6184096458b4eaa36afce606c3960a5 + ee0b16f3b4b22f0eafd73036644fce03 + 1854fd970e33919590c55ae5366f479b + ffb0402f8f22194f89cf287d2774e8d2 + + + daf48fc0be2a6dd5b068ad22ad1da244 + 69d873c2d7e9d32247e1f835941e2ce7 + 5c322bde383826f94aaa3299de5464e9 + 6e05b00004d878bd1b5859459b7b868d + b4c2c94f64efe8415f4525ba14a77d2d + 566d4655e4ca5ad0528c3734887dd563 + + + dc11c3efd54f36f706f2bd0dc27af967 + cac167af77a5758caecc454a1800b352 + 57bc14cb99b45134621878800e398f18 + e98378e76951fac6ea0e688790053aad + 483fef3356edd6a6e68e0020682ae59a + + + e8b39ef07543fd7c48529e04f7765e69 + + + d9cc780cd690b2d09b52f74b2a2b6c45 + + + 4c65b34a9c866da75d6da05a24862f7a + + + 3c04399b4b87be87de5c93225a97b4f3 + + + + + ef4b17e17e21ef7e05127fdff2c0a564 + 5480da538787ef792c3c1db616360965 + c1d76636d3fcb430a80efa532eeacb0d + 7ee90aa8c2449a0487c07fc79a466d25 + + + 8f835c331c2112da7aa5d7688054ef55 + 2d9d3c9a0f0f4cf66f1d89b32bbb6b82 + 7cc8fc26852d7c4d16439e5d157faa4d + 504eb4ab8bc6f903d2a5e5676d4600d6 + + + e7b084dff5123ca2fa336b4666ab59a4 + 0a7f8dc1fbca7b043fc9ad6cd098fa4c + e88dabe27156e4662182cb530e9912a3 + 0c486ceb7e1236e6a3ae4d372ce9e0eb + 8ba6499b7751d3580c112c633efcf3b2 + f2c00c965c82f721226819f678371149 + a5a3225932f44ff19a0003fe4a39e79a + + + 972db3d55b9a02e3e3ccc4da42acf4ca + + + 86e9ee19826bed4b278beb8af95d7015 + + + c7b9eae664f2e36bd8a73b2c9c48cd4c + + + 86974f585dec945ba191c331fb1bcf1a + + + + + 361b5162bd3f904e97d8c34d1100a32e + b36fe58c07a04ccd0f559aefd4ff3ee5 + ad3639b44ae70dde9d91a47024516725 + ece4093999f91169b928bf58c391a529 + 5cc221c09ff3b765d48b39cbe3ca4466 + + + 76118c111cd0999449cdbb78dd1a895c + 3e5a01783496ae692cc969f157eccfec + 652a2da21f5f46eca36176c734af9fc3 + a6405406eec33503824b261610a2a25e + ce92d4c90d6d0a973795d9eae41d9b7f + fa32312c02557ca321219e6c67bf2d94 + fc34d95c9f6cd749740f2bbe01339578 + b3a63edb0e3c1ad48ffcf9b466256861 + 28a50f115da4aa76b8b631af07a4bf3d + 05c3a10006078c81f95e72b80a5e14f1 + + + adec6333db7065d78f4bc1cbbb8c1c61 + ae43936f3d6691cd80cdb73b16582867 + 72c5090c2692aecebacfb72d2842b9ac + 69ef3f136c8572d048f5d2175682d883 + e2ee18809e37460d8d4d94aa5546cabf + 8d0b01c912c2895d79b534b43e562fc6 + 8e999d1d6f561fb9ed2e5712ac5875b0 + 666db11548d4d0bcaeef32e23c76c78d + 8d3f6d6efdc106f0ff207aad4824d16c + 511bff117c60467fea374071884d3994 + + + 8f7a31cad2ae8210ad941d2469bed29f + 7399574ae382555c791c09e9b43551bc + + + + e47aafb03a3a84bff8056a8ea6734cde + 7be55e040ba5cabd1987ddf356abf55a + 3a6328d1ca6cd1907f606ed240e3b620 + 1fe185199f1064113f035e09b339a185 + + + + e8c40d100132ba3a28cf1a927d2ac7b4 + 37f6b5f93b37649baea186df72b1b409 + + + 67c47dab7a5ee7aade2af832390a3051 + 11a8d5d2c8cf285d95c25ce46dd8321a + + + befc9516104092127647583a88407632 + 68adf747498da58fd0290be4b1ad3739 + 0374e04cca779f712c21b4a795bf39e2 + 533f9403da4d21f83c388c6d47a5eb68 + + + fb6d7950601449ba8e910ba10f597f54 + + + 0a981edd434be0e65b4bf2e5932ab902 + + + 5baa45e546409ebaf316506db1e4d747 + + + 76a8e60412a61f49b858ac31ec10aff5 + 5523bca589f42bc5f8318a459b57ff80 + 0614910501c518145d8f2010c5966828 + + + + + a55207d323e81354ecf18991c21c105c + e138f99d59ddc7d4e9400192301712d3 + d0dd45a820fc34913fb15a76153f8a2b + a30aa5750db3ce3ac9fea49ebb0cf01f + 7419b8511d097e023ac374f73cdadd43 + c081462e53d5dbaf8478ce9618b970cf + + + 1f0cb1b4f598f0fb44823d24468cfe55 + b4006b6f9cf2f49b32308e1fa4196d6e + 77450e4bda1f733ec8672254e4f56022 + 1eba20b950c1568df2c426d445059cc5 + 7390dfacd6d29903d32ff1d5f658dfbd + 8582c926244c880e1fa6796391a1fe1d + + + c2e207bb702c93bba40d0396ef53c48a + 387fe79101541e96ef579d01332eae5a + 0feb324f55a95277399e7a42b4d4818e + 609b63b020db7f6eead477535d8bd059 + 980878ff3925673d6ee772a7c371c1ab + b5fd66bb8ab3ae9ade148eb093693b0c + + + 67a4f3095446f12a4fd4c4eb1c0a0776 + + + e2524cf0241b43c68d3dd2763cca080c + + + e411733687d9208696a4acd106c33ca9 + + + b6e18af8fa92833623c2ce238b4f9431 + + + + + 3818eff65476e3dfbc13c17f34792969 + 6dc0c16d759af179ae16e4eec9a6b08c + ac29ac91bb8fb6e2e7535d61cfdbc2b6 + 026c02df01d45d4ded64f7301e7a8472 + 956ebb34643a0506ae5f29b71d64bbf4 + 674d6a6a7ae122758de8d6cc05665055 + 048265e88817081dcf997bb55a973827 + + + bb36904472cd00e3eedc44065ba0f008 + + 24a9f0997aa832d85d242c3f0fa0c072 + dff663254b6e7b608d939a2507f9eb02 + 3fdf9e6dba9754ef2838f538a77f67f7 + + a26009f8bf9d4b808bfc4e70d78301d5 + 0acf5f26eadb7b3c7f05e2e360c3c8cd + 0bb07f73dab8989d995c7d3722bd63ff + 41c0ecac6deda67c0ea5b6f2a92d619d + + + c8ccfc704cefb61c706ed8c0a9cd4589 + + + aa0cc93694c62cd7cc8f04bcb2606551 + 2f5d1d77ed5a62e15e7f9a8acab30525 + 07b594fe414de8632b8633605520701e + 9676d34a211b2ce75dc1d869e725e401 + e1aa07f49400a4706e6525795472e773 + 5f427a23594fb853c5c0143cdb94eb28 + 3a804e453781d451bac6aae101663705 + 025dd15b7b563ee09037b566bb94cfc3 + 5185a21a42b0f8f851632b74156999ed + c94d08e441655d0f9d319e7cdf92e759 + e18180c4aad05100a0ee097a90cf0a74 + + + + b47669682eb43e9f93fa74337c8d31b4 + 77d2c88a3782408fa60a6be69ee8254d + + 2768b60e5ac04c3284c48b443399b935 + + f237f2a3e1f29f02b4681e5d0610f63f + 082779678275a17fef4a3da0769f7538 + + + 2892cbb10b4dad2965d6c48d517c26be + 2a3ad7dd7d5b03191c2a01b83f5739b1 + + + + 29463ffb34a021d20f0d5bd34507f12d + 19c31929d2457dfebb80ba93bde6b3b5 + + + 6cdaf078ee61b438857ff932c8e0e644 + b22bae548df4542d38b221540e2200b2 + + + + 5ccaf54969882b309c906d590e666a96 + + 2026e2d9b653027e1fabf980a6540859 + + 0499b0821cc93f092884aafe150938f0 + 444119789f12e235e3bb4b573136af67 + ada6f5b09c2516e8b3daed8d64c8651b + fde8415789ff5b06c1422a4b7d70d646 + 240383d1892495a58f04f68ac46a93f9 + a5ec918db4b75c8738695a08448ba1f9 + + 11a10a64c0433600a8edc09d7013d709 + 5cf13fbe44e2c835405a7c3c489a3ca5 + 131a34bd0a05002428f8697e321ad1ae + + + becff9230d2ae1d6670929b82c819151 + + 266d0b37bcecfa7f20af01a055a67ca0 + cb13a466e78162b16a803bbeec1d12c5 + e74880d1298b5735faf3d75de45b3959 + 5a9f929016dcd92c36434a6455a61458 + e25df7706a1d9945ed509c963437a04e + e85fa38949a20fcd8afa53f11bcbd6db + f0e666727ef234286905425a04d06c58 + 0444ef9ad2019fd125dcb913c7798f37 + + fdc9627291bdbea455e24d9328eb9f71 + 95100c9a833578c1dd0db421adb42529 + 83984f2e12fd6f70bf1a158f9a191e77 + + + + 2559e0331bb76867278b8131631f6d91 + 4c794f51a6e432368aaf89a07b0e7094 + + b9cfbed7386718cb79dc4a1ede707362 + + 9c47d09c55ae73be5b9372357afeae7e + 95bb086bcc1f8f249ae951433cabc16c + 91c70c37e92b7328a867131b29053d95 + 5c6c8cfa36d204a9dba1ecfc8cb4ddae + 5d9447e447283710777ec61e62c3bb46 + 972156a1010ad0ad2b4fc31b4a7243bf + 71fa2ea771aff568accdbf33f151b4d2 + b121c27166d6a1fc9a9c7f861349fcc1 + 6af1bab26f9fb88a27e3e1610151d04e + bb7e1a63b9f759850cf91da54d462f50 + ef4d3cc62f65256c0f1e5a144d890c36 + d37f813ecc39dbbb8884909f6407bcad + f8400dcd13e14d624c0cc0da08b965d6 + 02b00227aa3665afd6fd357879460621 + 22f4f70c6fac2ea1c5381036bb1565db + 725c803c2f9d4bf4d67932a3d43d0190 + 78625373a54156cb90720ee259712940 + 3a2299539bc863157bd3bf5e8c86ab5e + 28017311f5c430b0242a1fc28151a46c + 9963816765402c065b66c327e36a9d1a + 858ed83a3df06759a6767dfe9f26e27e + 4e0ba0e985a36100e6cb7a4842fa3325 + fbf463d267d37fa48fe71de7dd8122f5 + 4a7147f6f13e54739404e510f9972ffc + b032023f5dd022c62844bb89b6df4bb0 + 4d5db7da90a637e965bcbbb978f6f846 + c26f2089623be6bdd281da23ee9708d9 + 6cdaa12b6483a075ef6f03e6e393a913 + 3464e53f97f9b6db939a30176336bfe7 + 3ef766686207c6e4e5a9ff37d9151917 + bdf06e74b65e37652b91264df2396a14 + 6a04d7de797f71d4e7bcad62b4ad25a6 + 8df1826a7d7ad89eaa498a79f4015c3c + fa06ec31c451a6abaae17083cf5299f3 + 0175082cd76e05726cca136102d3420d + 413c2039a4e98331aa10e7e1570d2ef4 + 2cd709fffd138e50f7b0aa0f82e0cf46 + 7eff84da7ef748ffb77f038812845b63 + 5b6f33ae4d86ed047b773f728dd8a765 + 456f25e9e6c2c145e4b2c9f2cf80d3fc + 00dc2cb50bafa4d062e7452f66509ea5 + d9cd7802c9def3a40aea3a0f6636bf5f + be5085aeef4c7abeda4a65c060f2a658 + 62c28652754e773b9aeb10b76723dfc4 + 3956878058ce87223d2040d8c9b4bf13 + 9e32096e1265a47f3a115e42053236ef + 73cffce16f26a29e0abdbb443fb5345b + 313f6c28c59911bcdba01c14a0090a63 + 363c2ca4c43b65ee47f4909842fb2d12 + 83365429d992c033d034ad7b6ed4bca3 + 1e83ef427100404003ee752cd09c19f0 + c84a6fc54c2426d94185224425dd42f2 + + + + cff2891c3e6b9b9cc71d5566264ef464 + 7f0b08a3e1e49b86bb00c470330637fe + 859380cfa11e528588ed4ce04083b00e + 8dd9125dd475ed71f111846062f83d76 + + + + 4bd75fcc440452a8a33114f60b34704d + + 630608328a4bd237bb3cf641b117598c + 84f0f0a8aaa5446b65d4933c0d8a6fbb + 754fa8b7abb268b5495fe6ef8c33b679 + f8ecf5616c7ffe4ea17c3c10efd7e1b8 + 842e6d8a78c902f8e0555e2ff3c88d3e + 51a28c71ef2ed65d288b8f0a36702cb1 + fde9357cf4274714be8687ff08511199 + + 4d7f5b1691206cbf76e086c3cb730bf6 + 4bd2e00ff02f1a2abc706ee0eb5a598c + 0a309b8502d5237dcea884a61a5ddc17 + 365b5aa8257fdf0803035816fcd07c29 + da41dd0f8a66cabb17779591c7569b86 + 595f4a6b2887bbcd35bc713d8e05a032 + 9906ddb2fe7ad13e1c98c2857fea1682 + f36d25951b4031dc60695c0d59dbb081 + 00edddc769b385ec36722a9e89d16b83 + c70eca67dddee4a008f6e1dba2a7e50f + 66ca1a0c691179c35bc2678329b9e0b5 + 8831fb7cc3385d676fae37c1d2631835 + a8aa2aaf874189396d7ae57bb33bbe6d + + + + a6def4abca9d34e966f604ce1674c377 + 62f4ab78ec87ecfde553f29b7041785c + eec998ea85f115fb9d3d1980b5caaa3d + 33d5e1c5ad7f611064d11aaeb341422c + 22bb9d7afcf8dd0393d343cb8357bd6c + 235d410179771791231bd218c73da76d + 070200301562e863a42317fa28bb11c0 + dfc5f1b2396f363f9d8bb96a38f456ef + e50ede851ff8ce9e6cfcf0b423040beb + dc10d11bd06927a8454fe620358cee38 + aac6e8bfc89876b4c7bea165333f2ed7 + 275e8f5da5319e9ebdd9a647bc53abce + 3133fb022192cd3a46847ec770fd3241 + 3e324b533703b481ac73f6691be08fb1 + a89bc8679e8190ca05b71f0319b965ec + d115af8a409c6bfcd7a73aedc7dc34f0 + 9acb146e8f9349529a3ab685c19e6a44 + cf9c1e005e5ad3124ff8c0f3aa97b034 + 7d83da6d3d8bae1fd62eb8eb78ed2da5 + 034d1fa1f859016b148cb1468169dd46 + 5cd57da57e8d2bf92978a4eb7abf4c78 + 7141008b30347257f40218c9367ffbc0 + 9b8271c651ca85ab082f3630b83c8cd6 + cafa77db83b5ff50de1969c1f2d5692e + b5b880e5cb680e12ca5367c3809c14d2 + e8303c8b4fa2a8a621df3a9f48253f90 + ef47c2d148b4b694b0f8d6824c857f31 + 1f1b04d4b32efc0df48dcd6bcbdc7c7b + b248eb0b28a4a8902499baece7ec0c53 + 6bb02616262f2e597189fdf958719622 + d494cd4506f5ffb4ef3ce28680755bf1 + 92dbad583a837e2b0ecf420a39b22da1 + e9c181a977de01bb5923e4c0e8b56386 + a448f68ed0e964b9b095303d65a5750f + d9985c38e08517170bb4816abb6baac9 + 80da2fc7340be1de7094885c62326920 + + + be1c0ec18e835e0eb16e9e0ae5800e24 + 527d4cd1b9ad6b5398b2afe800e3b8f3 + 3381774ae42fd66ba58bac5bebfc2b5b + e40a6e210103583b1d3248d66e7a6b42 + 393e647d9ef8d542d023949ace56faff + 4bbaaa86f81978deb20d77f65abdedc9 + 1ba56694c73a7f0b354704831330c26c + f930c21b0528bd2e8e716028b2bb98de + e0d9a387ec433c5375158fedac448127 + 40659e3d6c3cdb4979657bd6b391d9d8 + dbfd6cbf1c551d94893ea5fbc23c61e1 + b2052c30e0997acb3539b9c252a01f63 + c45c7dd24bb4cb071a68c8da58b0612c + 7f4c424a47e887f43001c37ebc7f4ebb + 32b745e582f5ca0cb6d48760b94466bd + 79345c59fb5facae45b1b13e7b9306b4 + be20b4ca22d7c20e3daff5d92d010cf6 + d3fb372edfd07fb4614c65971177b490 + b6f5816fa5323c92d1747509a806a2b2 + 963328203780d28573cdd0570ea6545d + ed959a4bfc68416b1ad101817fb4af52 + 71ca4a48ea684339a08aca8494816e86 + e5214de046361254f12e821a10e4e820 + 6579cf261752dbfbff58b456dd2c335e + eb78f7e53c8ece97be2a1dcf6df48762 + 5c3429275f3e495d18e02bd8c51b8be0 + 28ac6287b220dfc2307b3e4a086ba193 + 12ef0308f70a75312468ac4ed2be5b54 + 0383af2d5448e98ba463c79bc846f644 + b9824a1a7316a39fb09067dde4fa70b1 + + + 539c62707e548631bd9008f37fe5a3d3 + 2d67119203d3a50f0d6ec505375a5ce8 + 8a4e4f9a8cc05f21c47f0e75fb973dba + 2a1b4aaf53d34d021dc0003bfaeb7aef + 609b5af8459a6887fd8ca696d04946e5 + 9abd8b3273b291f1545879133f016927 + + + db8008344bcacf1fe4a8d52c8df90c97 + e5faecaa5d0c6358f370d98ea117a242 + + + d1911fa4d9a18157243f756337138a4b + 15728a890fb3d77ae490f47659a8e5f8 + 2539c2d9cdcac71f2c047aa21fef03b3 + 74bc41f213a0d2c4c67e16fd295c0006 + 330d1a1e6a2c7e8789c8ee26e04885ce + eb5ace329148b2eae9c732cadec112ec + 028b4bded9d625cddd0eb93004221e94 + + + + 47e96f5b5c34c8382849ac42d610edb9 + + 23a3c75b8a2b0ff54b73a57e72162987 + + c1513b19f20a49bd7150058019786488 + 2ae0f5b782600b522abc70446909f8a8 + 2fd9f57da5809ce2348f33954ec1c285 + 4f2bbb895f31f9e91c162298d659461c + d1f69f903cf30aa683f8a1f2dd003dd7 + 6043eb05d845ef8b9dca227aef0c5ba3 + 0aa7aa0e67071d1289dd4ee5b772a57d + + + f3705d156c74d593835700e6b82a7ea8 + f6762004e99513e3e84dcc6cb9d2f1f1 + + + dd28e34d5b32d5d7a06b491e44b4a892 + 3473d35b54f5d20275540231622adba8 + 2a3574240612b5ebcdf53070bff4561c + + 42c05aa9fd51eb5874833f4b8525e1fd + + 56d9eb7a57f51f650a35ffd03fc3a291 + + + 0611d3790ba685aad8504fbf8ffd4bbd + cc1af8755f86c258fbe1034acefed6c4 + + + + + 329e3ae6fb244698e8574ff7cc904cc5 + 58d39fc777b591c1538106ef75abb701 + + + + + aba23b5d16a3d571fad3c25b2f7d1eee + + eb55eaacacab37e388686a324cafd350 + + 817f0a05b4e9901ba1bc1a81786079a9 + + + 42099f19491a349210c80678ab670271 + + + + 94e0b80062f338debbb91903aa2ff80b + + 8d0b3157fcf1fc790f15df7f4f4b7eac + 495a2f7b2000525e5b36732f85d5a5e1 + + 5caee98c755b8a595267cd35ae16d9fb + fb9663229517c47168a797a05ffb256a + 146eda45464c59b343e1b70b4d463b6c + + + + 6be57ff80297f9ffdb949c4bf5f4e8c4 + 8a8d2744352e61289ba1ff5215d59103 + ddbe7cf386a2896390a04d741b6533ed + a642a184ec1618a62a47ba3053063cc6 + + e8c262a25637e3365f045a7529d6b7b1 + + + a7d72693b6e1f45708c5104cda5e740b + + 6104d16d3d762ca037a743506473e56b + + 9a054208cb9277dec075225f31382247 + 0b6e8cf2dbd0401101005fab2ec8e808 + 12440fe109928729817241d73b8ad059 + + 9e412d5b1991e6f4f0c64a0d83b20d27 + + 9f45b66cc07e1f61ecde1fa726c51d3e + d102e34e4771706333a954e1e7c34da4 + 41acfe40bdc7130f21249bef36e7bb08 + + + ecc761194573dc4e9e812f16d34cce76 + 3f995a6c9840b4ab86e82eff908b7520 + ddc60d6dd084ed303b13d4c4d599254c + + 4d6ffb6a28df8615ceef70134dc2c6ac + c3bc75fb163c2a32955af6f3bd294d5c + 237c3f125f5f6b038fd760ff6dbf69ea + 09d43bcbc090143014a8bd9a1aa54c17 + a0b430904d2edf0ac0cab89d80a2cf5a + 9dab351da4be103bece6c8de6d587c53 + + + 07846d6286113806ad0560ac548c1bc8 + + + 63aaf188255e4c9f5e77d3a3be31e2e6 + + 43894753033fe5e9af2002b84ae45bda + + ddb070897a92c8f51a0195af7859e352 + + + b7f6d1dd0316918c35c353976ed37114 + + + 611b5a5afe70c525e9f49485090269d3 + 47bd7b1b64bf079173112aacb9333c18 + cfaee47dda3f936d211842298b28f5e7 + cfca67b8be0f77963f94cc7ebcafaa42 + ce4948febb452d563e8dd9f9fb13fd19 + 980be966cc5c29307a1172a208447f11 + 7920031361c3fdcd55ef4391d9ae5382 + 0ce5b2267620ef293e52377763181f95 + 8bd831e12676f0be3b4e40b05d501970 + e02841b8955616d0189c5efc8f11e146 + ab823e912d42fd24650e791570571348 + 77efc9b00bba592b574abe8469ae7969 + + + 98115e15246a2f4c7231bc1ee3033006 + + + 782cac06b893e7eab680749d552e7018 + + + 679bb3298f8f54cc03f3d5d3a6d87de9 + + fe38aca7907f83b3703f27943a0e50d0 + 1116a0de550934f9b4ebfb63a056eb1a + 82f7e41286bc9bda59418f3e4b21d54f + 4a66d2694731b94e713b49fc8c79ab9f + b6b93d891cc8ce4d1b437e2f7f411292 + 109a053bed9d09bd9f59fbcfb0f9d2a4 + + 6c91e38cbb2c906f7611a5932e038139 + 185a6a01969b727c628f1832507a1d1d + 51cf2ae2b95dad6ab214767efcde3e50 + + + 341242867918ce9f146c11699e874106 + + 8898df25ca79342cfb9a5c943e065647 + 57881cfee77fc8511e8cd2c4db1fb7e2 + 405d451145c0b6cd3bd6b63292e36e80 + ca6d78a76c340242af68768f2085614e + f55bf372df5a9c555ec1bebbe916a6f0 + f942dfd361ab82423cc250092ad1f688 + 2d7eb257fa7d47b748a8ffa60ff43bf9 + ceb1f175219bd182876adc0f03461317 + 6d6182f1dee9b24606fb9d252b0872d4 + f6824a5507956cabfda0e8c930b29509 + 3db425c6e11fadce0f5d927c1727175c + c3194cbae8c846a300ae149f9092b065 + d9eb6d74ce749b4aeb42599fe334c9c6 + 71d0b5b0b14f5bd3f5f8a12c7f717123 + dd39f9c9fc07cbb0e1231bbb5c387a50 + 0d277aca4571861fecd4a5810bdf7689 + cd17170ca9b0866ab4fd9986ff157c3f + d349be7082da38e9767333178865c179 + d76edfe9deacc683ac84915d9c7b18ec + dac91c830c7ead7a9ff1c954e5e893b2 + 11df19e8c1c685818829179798337d6e + + 94f4a05ca6dba8f5cf05cd3efd363d92 + + + 5a53a39f77e6b18551c44138030e8372 + + 6c7c6301f3cf3341caec02bc6830892a + + 80981d53cdb1e375ff05d5c390733860 + db7fabf68eaa73f692bf4a8e2c7bc380 + 99357da836693b03c1f66f0011cff5fa + 22680ad76161f3379c86e9661e042986 + 93e82447651035c6dac3ae2425b7e5b6 + 668cdba1305ccb26a3daede13779fb4d + 6aabefb54d1a6bc7ae8f67ec7c36b00d + ca0b3c0e86b8644a91bf26ad1d1be7dc + + e63c41c166e126161a3e08ddd32eb2bf + 513216c5bb06af027fe918f83fa2c194 + b285b3af6bfa23175cdd51583d7295ad + 6aee00803ae4a92816badbc866e3fd79 + 99baa759e597a256989037a167f9ba62 + 51b0ca19ea4edba7f005a57f5053f046 + d630147f06191d96fd7c22d48db2386e + c48ec9dcd9484616e4c9ba351ce7867a + 180a8ead9d1241dadd2d52cb4caa8888 + 117caefa489fc1271704748ba7463db6 + 4e14b794f272d8452e8bead7a2b74091 + b70a0392c3805d26e2cac2873a926101 + 6d59e7da345a2af2778bc1134fb51539 + c63f54052fafd5ee2f27220ac32f31bb + 437cf70e155edc34debde40b2fd3cb9b + bab5ee65f5d467e304d2a7edfd47ecb2 + 15618271e6ee6d04bddfa3eeb114de9d + dce7b3338eeafd4010ea51e3cf27d64d + 6eefaf2b85306eee07542e6dea940080 + 373cb5af406d8e9a19fd0cb27fbd436b + 0eefc3a188506d6d0dadcc175c41356c + 538d60722aac49b8bf44733db315c4d6 + 0bea07e925af1c176869091fb7d04a20 + fe0c9830caf971130e73a5f14d6f586a + febb823fe53615224ce988d71450c571 + 9b7ffd80dc702853bca13e05e1ece19d + af5568f78dea06fe4556040bb993f2f1 + b1f87220b40ad5d1df54748ecbb3bb55 + 024780ff553c385b367031759f897247 + 8709cd24680fde69173bc5433375afe4 + 0b8c6808497155bff1bd8b1dc3c13761 + 6cadf752cdb0ffd318300b68423a62c1 + eef98d75c3cc0d5437bf09c00dd2889c + 40cf2c24d6f31694c826421cb2b5b76e + 3d928e47a17fead3d8113e89cf055911 + 9811cc5f335b3cb9f8a955873c70114d + 417575edcfeada48be98e6c847a63d10 + 6e53faf160ff53dd2101a81fee942503 + 9f51dde70a538895ba93683c5286586f + e9a37ffbb83456cef81f3798a3f1539f + 9bd6724446b5517863ce0c6d6a7a6d09 + 34806338122c4c2ee913199f512cb271 + + c6984395816f44e8d93367d23b46826d + + + b713d741fe09362a086567a4441dd5ca + 38272e0897bee71016d11f0e25f63a54 + 02eb191b52297fafcf72a27be79837c4 + 78764b307b7c066d56eb430768bb64e1 + 7e1c94bee5d3ff6a76b21af368dbac1f + bfd1b67c2f62bdf5c968e25ab124bdfd + 6ad2d476909c6e76c74c355f0824a512 + + + 1bca84799d9fd273ae698beec08ff957 + + + c9e864550193d5f6fda73b13ea3c7b1c + ee22ae1ba69fb7c3bbaa4427a6cba343 + b51b9ee62cdc766fcf4eb60624eb60e2 + 67374213652ba24def7d5a3abf681bb1 + 93435dc472c3fbd7fa2c1243e9bcec01 + 178d3c89dd09e29b25d6fd0d51fd866e + b4417ef549124e0017c6d46ed62b41c7 + 9911e30c20f71f249dcdf95eece393ea + 410e2d8d82b4080d6a95456ac94a76a3 + + + + e2add75f0ae0bb2b17e4b8f63235bdc3 + d3e8c5130b089dfc71b27ff0c1681d5c + 5ed08cebc7c39b56a3fc127643ce5e5e + + + 93a97af30d81b86887cb197267e63052 + f1001004c7282877d5aa125916a7c23c + + ed033940902ec7bc94d5b08e9a6784ba + decd27cc8caad2293292d3ea08222e45 + 34272ee6bf624476e08b70f6879f1f2e + 2f0e8296d15a139d00988b63351a091a + 2d471234137a4aebd70251b0f431eead + 7d5bad8711cc13c35dcf3667f97d85df + 914aca6e23422b0dba1e29221e008e6d + 43f8156d7b6a6bad78bee01a71d4299d + 7625aa2fc163a35f72380ebd5733e4d1 + e5034d71268313dcf69e6d094d0e69dd + 1abdfd8ec82221475f03405c6aa51ae3 + 3596783063bdd1fe6fd20b8c45908dde + + + 8d8eb7bc39019f91514b0c55d01ad997 + d19cd8b9ed7542a7589c9980f3f4b089 + + + 5c7848afe161feb6eee9d8b4dfb886eb + + 583bdc22f3be3ee4d494694f029733a2 + a5fd5817c5df75f4f882a333c8b4ef94 + 5b79b53d648e610eafad2603ca26b387 + + + f07894ba645e0663421dbbefb40149de + 7e9b009077dbe21a2144412a0523c144 + 333e388ff060957a30645110dc02b0da + 0fcb38d8dff8f13fb7fca2df42dfb6cf + 46c5839c647fc227549b5eb6cd96c3d3 + 1e73f806dc9a9ab3b47d7137a4468a23 + 48c448a7e45176cc1234c615f778e3a8 + 7e4e87e47acf2930ac1c69f741444655 + + ed736973bf99b6487e9cc6b426bcc993 + f173ff118bed42e5c1544759b0b602b3 + 0b7b0501f7f926fb1d4f285bda8eae86 + 6686bf21e8301ec5669a1c7bd0048ed5 + 1f12646449fbdcfff9ba67478d8a3a69 + 4415625915cde981a4bba4343b27eeb6 + 7493b695da4d7df0b87660411b67bb2b + 6cf5880cc1a2d67486b9dfd2e3be5777 + 580af91d0f6adf5a69e22b5eccfb514c + 2dd90f5772e6ab41befd99e9e62cef60 + fd8f131bad3aa0d2e08ecaa2fe844ec6 + 977d038957d09be5cb9519e1fc55e943 + 6cf08c1f2f22fa1add800476c88e4c92 + f5850a3f376ef4c84a7fcb23d312dfb3 + c097da03df4f9e9ea2ae5020e1a6e1a2 + 744a368870acdfdb926d4746aec972b1 + 984460e2dd6cb44144aca5489ef025ed + 7b419b8feddc3e71ac43909c211a0612 + c6156a740e375b608202d52d35d5380d + c655e341585773f77af717ec395f2767 + a89d31080c566ccd850732221b7e130b + 0a1b7d3311b0c27d860a423f78cb8aa1 + a4eb903e718f8b9839ad9be587ba51ac + 44e4af01a1c74dbd62f24aab4a980cac + e7ba5a9e6f5d4f35adb635387ed85a56 + 7bafea0f93fcfb1aa30983c639082363 + 146570bf057b2d1805849f56dbe97b1f + 9daeec4fe1430417378aa262ac495e92 + f539f96020b80cf558730dd270bb0228 + a44032af7109947e73b1aa938e8c6183 + ad5c57104de9344b21236b45d2bb3b74 + c68459a469ae47692628e62a8a38e464 + b241810f53c6cff0936eb06ccf66509e + 5cc33ad77fb542da59f18b6fb390b763 + 7320de782491a44338f1685632ddfe40 + bf0bad39aab416e1420a62170a28e98c + c281cbf463c654c60a5e18646a231376 + ad7f14625debb743a254055ef0bfa624 + f0d593af8512d92db87258570282ced4 + 2375a4e52a226b76f2cd6488b6438f9f + 2b703278ccd4877627f931a66f13b06c + + + 149582a8236855516a15eed08081772c + 197da573dacea6aca63dbe0a3f8a69ed + + 46b1b0d377c8e0debc9e80b9638811b8 + + d64af0f95e4985cb27d63438ee05aca9 + + 1c7e9efb26a93307cb320299b7cadc98 + + a469d750ba94c0e4aeb64a65f9bfefb3 + + 164099de4ad54b856568cdb9d41f7a38 + 151b72ab81ff84e337265500cef5e69b + d93867e138c7a6c32841a848395d78f5 + + + + e588c5787873ded965539a7347c15bae + e2b3c111fc2f5c43f9e5507c10c0313f + 7d34faebd551bf8d95a8b64917118958 + + + + 5e35a5734d738c10f23eecd709f6846d + + 61afc1d5a134736cd54f6f0569f06929 + 8ed0573c0aa85080f5ddf9fedb14852f + + + 7d552d705b8992ca09abf4acec9505a8 + 091e3756a48f1f7254c98fa365c9e3ef + 095221f51da1fc829316c7d436d91834 + aba666df582287ee15691dd42e1ae0aa + + 61492b09825a071b62db6b2f8f1e5491 + ab0bbc8b0f1939d9c1a7f589248c59bf + 72b9fae204ccbdef1565e8f8bfc46440 + 8e7087c3b315c29fd537b32b4ac9cd77 + ca52f65fb4872619984d7334b2b1bddc + cdfad43b3a218fcc42f544f7066c2472 + 64d9dc3fd243196ed6e07c65c2fbf67a + + + 4406ea34ae7251e04f49bf3e25abe066 + + 456bfe4275dd99bd07a84966ea41de80 + d6d689b2e2a26cb0695d66574bd76cb9 + + + ba4be3276f60e7aefd262f1c08aec337 + 6ab0591411f2d65922c89ffcdd88eea3 + 21ec74f01f2bcf0ec5b41d20d92c456f + + + be9e770236ef1f2fd2ec405d08439308 + 98856b8235b08176386fd4a3b300fb8e + + + 1e8f20dfd867841d15c843f273ab63b7 + + 502e96f4ac3871d0bb54165e086b358f + de1b6cf23039f113f6baa84d03fbcd42 + 69e33024952d7839b2d7d665e9393938 + 4cac118cdeae2d8bf2c0d25f86e28f5d + + + 26b18e7d238fbca7a8243f5f561091e7 + + + + 83542372539474a234ca1709420e42f5 + d3ab9a54eb4d2d5bc21055e61f0415db + + 2d9f5ed52e34c673386276ee9f67c330 + + 7e5760b66d193de11edb4b65b0fa9b51 + 462833cd0138b88180f55238aa5fa8e7 + + + 74b106a749cd12f4d859a871b8cce7db + 29ab8344685e8ec0c08731939b79770c + 664269e37e0c6cccdcbaebf7b21359ea + bef37786b02bf185924532696362a5d4 + 891c639a647e0cad5a65b2483f7f92cc + ede7d9050b653e09693950d5880a6432 + a387f619167c95ede1321fa847ba41b0 + e7f71b5ad219e996dc004f4bf5cc90b6 + + + 70a935560b4bc73b004fea85ece3e6a7 + + + cb2f97b7a417b0dcaced57c54dcbe51c + + 225ba7a1fdfa5efdcb2117e80bbe0e2e + 44dc3a7a4591be21d98a404fe5ab0ca3 + d0e1a33c4c616d97d34ce2bdc81a3ff2 + e1e12431146f49a280ea1b07c584daf8 + 0ed4b93e2c10c4bfdb7b64e7aaaeee8d + 0014aa8c9d96cb1f54330143bf362b27 + 48f398d9a0e13505e5abe925d9c2b57c + 3c405ca06fdcd762ea5a1bd9b433dba5 + 477ea7a842bf2def1ab2988300408b99 + 55271553985cdc6b295e1bf4ee397b9e + 92dfcaa11e6ac6179fffd2d19f128782 + + 4298aca2b1205808500a5167cfb30f7f + e06127d06cf44d60fe4304085db87508 + c1c08b1898408da559a6a9a07ce5efde + + + 145c59a4470c09c83d60fac69a6ad90f + 3a98c0aa5284d9cfc2db523e40c48ca2 + ac571f24f4156498d17c986539ab3b80 + 69b479504753253bb1de0503409b9909 + 864b29f4e0221155b67a9ebc4dc41dee + 6feb7396be233943bed7e28cf448774b + 9306ffa6324b0838ff88494db324682b + 0dcbc4417de327096abe4a47e43abf6f + + + + + c1d576dcfdac943a558374f310156416 + c69d8095750806ff22a9b5eb9c91486a + + 1e6f7478db3d3155fc7dadfadd05fb34 + 90c4f6881ee2b76a830533070c5d7c5d + d27ac115446ea5dbeaeba3cf30fd1cd9 + caa5a840081789a8fe1553777482a5e8 + e1a1d8025cb372804e8676e63f14886d + cba8efffed36d7fb7765a120d87150ca + 014d2799853c81c1a81d2376797471b8 + 173f1ccbd8b6ca99663ecb19ebebdedc + + 3f0b31e7afb3b3b48352d225a3779f81 + + 743d7419b3832e7847c248ddabd3c9e0 + 4256cc698a30fce8b5ef075eb3c1f1de + 937862bb2c4d933b4cc92c8e9a684059 + + 5fbfdf85c8fec7ee8755fe5a6aefc847 + 1579320b486273a9636cd923c09132af + ac800280ec789b4e1929e5105d587d15 + 9182d1b93c7aea910521e787c2779411 + d82d3aca74495f0f97f39d12b311e718 + + + c8a2fceda004a8c7fdf78a3d7438bf41 + fe1e79170572a065a110fa42b5e17fd6 + + + b434b9b813ea98b5e6d83018a7dba32a + 7037cc96d48eeaa4760542aa5305793b + + e5e46836806bf836ec9c04e3aad7123d + 45ccf075a1c093a679df0ad1af30ed67 + 91559939bc55f0b1e41571349d526867 + 1ab0c9c0bae45b66a62859117dbcf826 + d46a7e3f7252e6a82bbe8d3d7223f93d + 32ee63f09efefa3a19854dfd4f31212d + + + 8cd7cdb8ca3001c7a1745c34f5c60efe + + e533288ee6de7195f4af37f7effffba7 + + + 6485fe7cf892c2949972859221992d48 + 9604e715226d00e863e22af258bfcb7a + f0e8192ddc16fda371bd3e8ee7395d06 + 160a67f4ee0a7121851005482b0cc8ac + 58629f2a6c297f45e750fb15ed7b222f + 1eacb4738be3d6e592900b99829d35b6 + 2dd819b34134f52029c3f7f6d63b27d6 + + 4ad7d2082b931da3fd4066bf911998b8 + + + + 9610a3f2f8d47061f6128bb553bd599e + b4d8c92f65828eede7800b83ecb4a24b + 648ac7bd39080a1a9ff2c97b2bf4adf9 + + cbae5bc07036d19ff9e0f94c70376dee + + 2f9b2530e47b0a695dda5141cc1924a3 + + 8115d4fb01c2925a8e0fe86680f3bc29 + + + 554036e15f5c4f6f3c84cfb35ffe53e8 + 36faa8a86d0a11de15a5d7e61e889de0 + + + + 6d43837313bd086ae4ba8858e230e14f + + 7b58f00b2d83d4636ec23202526fc854 + 8613500bd5f4a117461b669193d2bbd1 + 0fc58165483d50e6214f7f8fce9d1f64 + f3523959475b6cb811ce57780043aa51 + + + 211914d2b74ff0327e43f617e283b839 + + fa80150ddc9d8d311a9e407fcf05b54b + + b9c27594d451ac0c1a114237cbdb5c1f + f8f12d5d90f248699bfd2a6fa255500b + 8def8a76b486f2aee769e9abb5b369b3 + + c3af0bdef1332ac278b03612b9ed8b2c + f25666933a49d47257cf22aaec07a78f + 099a2083be1c9c8ef521e2ee386a6f87 + 1833e9aa5d9145d19604bdba67ec0b8c + 7761509a93275b6154d35764cbbbf3b0 + d461f81fff6ab54a41e4d422e2f12d0a + 60a43b8d0217a9df82a4f365be57facb + 199efae50820aa4a90aaedd36b487b1d + 4b5bd4da495308bf99ce6b4047c2bc06 + 377d2b26039def711b86a64495809a25 + b2b6ba1d038694bb9605581e606e0f73 + 627a61c51690064a767ad6c2bd9aa15c + 66e078a3641be4ffe0e0bb51646c6062 + 40657cedda25e902b2e4d983a09dfc34 + + + + 4b47331669bd9d9f27e8f1e97fb20e7e + e64195ecb69170a74acebe7115515f59 + c8719dc60b09fa8d050e642e11171f55 + de6183156b22382c9eb27cb13db4be1b + + 1fce02bc2e57013c133dab24e108cb36 + 4ac505a1e52cca800c18e68de908cd44 + 743028fcf75a2f1f6d8a128857147fdf + 1f20ad0ec7584c7f34271ab4911ab02e + c536db2db7928708df651f24384ce2d9 + a8d4b266758baa87432ccec278a5e508 + d5d2520570c42d9f8277cef46ccfaa4b + 91cd7cd6d3ce3fd03186c61256562186 + c94be4263ee2f253e53fc170deff8da0 + + + 70b410ea5b02322ef7bbdbb8e26b590e + 1587befabad1fcec4b0e74c5dd9627cb + + + 5384c4da337df52bc10e86e3b7a7c138 + 7802d7b162cdf7e0127505852e1d7fd1 + + + 63cb5acffab7afba6e2eba11c5f36ea8 + + + + 1dad8262c1b03dadc093a6bf225ee1f3 + 4504b83d073ae275a68f7783ec07d6f1 + + + e8e7daf5638d27e14f6df5b03f7cf83b + b7f5c30083bf0e39e955ee7fa1798027 + f2a6a2804198569f365a5f2efec277e1 + 2b1ee7c7d06985ea04a99778a5551319 + + + 6b0c710761a77c666630651d92f437e5 + 4201fe8190e14fc3782d6ac71c2ff496 + 15fe61fc191d4c5f2dd69d01b1480794 + d0f37f5ce0f917b6cc3ce3a80d67880b + + + + 21fbc51d4aa1454838bc2967da5deca6 + + 50d0982e4d1b7259f8ff6e5aceec2a9a + + 64e84797051405fab73eecfc879659ad + 46a6a1f5152dd16a19907e84d1fc5b7d + 774ed13f422d6774faa1ff560d5825fd + + + 78573be826c2c555066172d0cdbbea96 + 620f2f4e66b9740a4a7606b64aacdc96 + d5ed0f01ffa0133ea2d78c05dfd32224 + ce59e04e226ff7a99b1a7093973dff79 + 89d3b58d47d4bce246319d429df70f55 + b69a9a03b78a2bae104b081ad018abd2 + 74d4a0de42b045214c2ed555a1657ef5 + + be1e7c3cd2824c2689596800bebf617f + 72e4a19ba6c1fff011a6b76b8cf025bf + c99442ab5face8c5d9fcac68beb64fb5 + + + 085a0597cea9762b46b573237fc6f031 + + f8e9d328d122cd98fb9a7a3f4e5f0590 + 7da1e938534b436f97e00db327485abe + d054f64665867f6b46fcf4ba84be0f36 + b02a11f7b3f476277567f62757494aeb + d371490df2891772b976a6f1907a611a + 34220f181bb718020ec8f562cbe462fd + + + 1caa80ccb6d8a7a2fb461ca1eb83f7cd + 3ac48d32a29905302daa976bab9cae19 + 5e7c28901fe3cbeefb75a711af428ec8 + f873cf835ba0efcce8b34e27f50873c5 + 1468b5bcfe67393ca173bd27e3cc5a71 + 93a27a724cb49942e7af4dffa7fc54d1 + af5358e0b940e505dd0f64190d452289 + + da53901949cdf61e1561a1937b743432 + af093be3fd6356deb5b87663c14a7d55 + 7715843bbf381c59c5a6426104fd29f2 + a2020f7ebab500b93c624fedc81f005d + 8fae65baf48465734ab2412cda344365 + 92e0bc9fcc366fed2b591a336ed1d99e + a07155b0f98d3f800d6d4e36b8955b73 + b9e99f7c1c32d4bc9fcab4605d467784 + 2c4a8fdff7c4564bd4c1977470fda1c9 + c540a722e41ab90c8dac6c4a29322236 + + + + 0ce58f3ed27f2a23950bb0ded8526799 + + + + bf478f8cbd4a43e3fed384b79b885715 + + + + cab8418ded54760c1faeaa15cbcc962a + 9a37450b06c781bb67f65036a7fa6f2e + + 349988bb0bb5d2b08ba64b59a0b5d8e5 + + 79ed23b21b106421bc474e6adb833d3a + 7b6535d11c397de75abc57acc354d130 + + + 19fd2d8bf0dd29379c647f562589e324 + 0d57c7b2d9eb5de79a5ba9ec6e0318bd + + f81fdc8255a875f237e645718855948b + 063f25e5fb09d200081c68d858d1afff + f8bf232ff2715e31ef679574e95da8a9 + + + c49141dc653571018df5901f430a4076 + 7f046db22a7728e2abe753f702240d0e + + + 0b4604603722161f6507ba7d48edc32a + 6579e0b48486f714a6ddf35a2107de2b + f1e969580ef19118fda8989c0e555ab9 + f777ebd365e7db425d113b5e1e866126 + 9b074ce4cd26f02791435f6050c62b09 + + + edbb8d8f2ffbb2f352f0238aa897c965 + + d7d68d6fa2a3f03ceafbb5dac9381999 + d35e329c639967f769d4863ea8ef73ee + + 3d217017355cea299a0b9457af6516f9 + + + f7a371a2ff0221bb3e1e7ac826543014 + 81a38ecf5db5a5bcd04db9df098f58d1 + 891d5ec4f174c33a8efc9b7a131d96f1 + + + + + a89c37880130784dcc08447df0ad5d96 + fc0fcaaf85de44b40ec60afcb17df60a + + + 83d837ee70466882ea33e87dbe3a1378 + + + e925ff045baeac8ff804f7d112663fb1 + + bf092e7dfcacf7aeb4126c0810a42853 + 0738505953901b9a707334a9b90a303c + 379e8d9edf0b42a97b90af257c8e131a + 941309ce9c5cce0349e6035a30fb0f93 + 9f1fc23893baa7bec071fc772903ee44 + 9761940a253d4862d4b54102b18893f4 + 8fb3ccc611fa73d076ca8de0aad3863c + d8b98a32bcf7770a2d7c42b114d8a295 + 2af7124027ce9f1e659e8c5b95181bc0 + 09a7a68db1472f2a3a23f24fa5217bca + 8c295345f07af708dbcdd333639d342a + a3609ae76aae47c48b31abadf6eb1694 + f4841d89eddb44500250b04e1b903d04 + + bf86f74a603d49fca93c9b2aa996a6cc + 1f4ecc7f91365e4a7f184cea88ccdc6b + 42ea30181fefafcda147df997ae58079 + 4abaca157252cef7f0fdc1528075b95d + 9a0a254f23ee10d2d108d8a59a104bd9 + bab5bddf0244f775328c9eb089459a6f + 6003b5e6df8411579c2090dfe4c3780a + 212fc7db2c8fa05905203e55bf854d75 + + + 6b57124ae9b611f057cc7395a8d6df22 + + + cbc37297d9ee71a79473032ff0410c5c + + + f2a4b0e88f048053a0f13fdac52e3520 + + 39f0b46977a75d9010fd6660285f5df5 + + 5552591fc1e2cc328c1d47c3d7eec70b + + + + d91199fa22c056e1d3f5977ea9e70042 + + 051a4642eca46aacca011d3b10e8a660 + d67dbe1463baed0d33441d5c2fcdc422 + 89e97d7273787cb2c89ad0c630ef8340 + 7feeacd053839109f8228c3abbf978ce + f0072fc1b0c670af60d3d614e3117bc7 + af84939a3850d1309d86afd25f31fd08 + a8e567fea4338a1a0aa10ccafe1ddb36 + + e673693c93ba0d8d11f2997ab607ce32 + fb0aed82a6b4755ff7a97ea98d5f4c44 + 29d3a30e9327634e1d47a3a38d9dd8f9 + 8b34c552a7db8eccb3e82ca79c8fbd04 + 6607118e5156c48cc36db00e4a609277 + 7212d165793bf11ca46d6d4634c5f28d + a94189c11105c4a06ea87b2b02acc572 + 441bcbdfcc9a4c3e29623e4d25662f77 + d5daee27b8c6b92ebb1715f79ecf65da + a01cd3d34825d99c975bc1f4a68b5226 + 9612b629503f6fdb0f42ffe7dbbd4845 + fba9380f31dffcf412db2754d7f561e4 + 8e9f2e9fd6e18d301c9593a12aff3030 + 9ad5f23b5417ebf4b12f49aa1d4cfda1 + 47a00256c5b6a316d254a7904b8fbed3 + 030edf72b3b3866170585ec106e168c1 + 30d614db5423fecf8a63ee4369635b79 + e2c5f5fa6bd7cca66e7536871e05b5ea + 27ec018b981622f7490de090319f212c + ca2263f57d61d91a0d4353e3d27f090c + 6760a6930ce2093126f24249d71cde37 + 1d3726a93808abac8098e78135086a53 + 76fa65af37a1d528dfa113eb810c19ee + 3ac992361cc9c96da94db825a903158e + 5a8a963be04a963f40097417637a18d4 + 71d35a21e83684e0452630b5c34c2e40 + 5fb02c41fa6d8786a185145ffa01efc5 + 6b3706747fd18e0e798176345943b69c + f480d04fa26a02d64e8b169f22e44e9f + a374e266b89a3df7a04a1838328e97a1 + 11e9a28f10011910f3efd06071ed1682 + bdc6c4f765280674ae550769b8c4ab6b + 879ca43f9399b12a2e7d19f6a05d7c82 + 40c9c1573f355e3a14473b8dbdfda624 + 6f876d76940290652b6878a1a18ba0cf + 667666a7d03c6e153cb3c8b88b1c2dab + 5e1d5b2ccdea284682fcc9d4d2e365de + + a95a403e4b199d651d749357ceed4645 + + de3fd5d5b6982b0b6fd7b3046147acf8 + + e5adb97fed39adc69d342b82263f65e5 + c2fe9a0d4ca7f53d7937da8f38bab14d + + f37f3315e1319b77e7fdff5f304fea80 + 844604cfaa71ab3bd053a1182ad41690 + 136bb9a94109630ba58185c89e37980b + a605b4dc3504805f83563dda44b9c029 + 5c92b605e4ffc365b4b9554d235360d4 + 402385702883df7ed17b1e315327398c + 852c1c1aaaef78120bea7eaf978652ef + ba4d65daaf534bb9a97b175d9208be34 + 78db69cd0042c701dc6c40f718bc0145 + be8d5bd59286a4a0050b0a657022f6f1 + + 070b8adeacc5a1967f1aebfaae3c9d2c + 3a32c240d146d55a969d53cd7aef62d5 + 6a95618896f07e3836d5a99a95c43f36 + + + 86dc2ade626114b395dc3002970f4857 + f958432dc59c56b259ade4dc7968064f + + + 9d3fb3e081d4c9de615750af09f450ee + 33a1c51bb0405ab6a055c7534df62420 + 238b9b93aaac23d80b62d0a464d3559c + + + a75b1cff7eeb50e155d09d4d18bda985 + + b03be3dc35bcbfbd69e67287926122cb + + a6c239a326e6216c2dc4dba64ba47b34 + + + + 7f3c23af9eba721e49ad298da0a6d6ca + + + 957fa2b4b53b3ef0eb22d09d244554fb + 31f385e8faa1d8158fba5571ed596c2f + + + + 9f60997379af4aca35a6a78999b43f0f + + + 89a954cfe2e1607cf5edccb4be6cc7a8 + + + 37158a0f3e4b86647a9b298adb56ecb3 + + + + 0b664548f199ec735b314a6728b00c81 + + 7b29beb4e22d12ea868b3e165439a931 + + + + + 08b63bc59f0074b28eba3d61b9c04bac + c67ec2a915eb0eb1c5c2ba75c67e381a + a020b140fabb1816a258afeb19c4e3dc + + + + + + 6de983df9269bce5c894e99f9720b79b + + + + 14a896b895bd1ac283bb8409bf10d756 + 95358755dd411761377b806951807383 + 34697ab137cff9061cabdb9643f9f3ee + + + e3b42cf998dd5fdde597c0db99324e44 + + + 678319d4285fcec23bda9856d652b093 + b4eb9c895f0aed846052f827899eb253 + 356caa4809c14b5202e90ec1d751190d + 0c7edb73301b2ef9a2778a31c2c10a7c + + + 6330409073f733db90df4e1c3320ab1e + + + 583a9ad8d30b73bfd3e99c37d36ffef5 + + 196991bc0611b15ede857e0350042f2b + a0af328e16bb912a57742c1511c79ac6 + 1dddf8def5f1b7068a9d921c43a1b153 + eb327a526b645a7a7cd1f01c9160709e + 492ce19ae292e59c80973bf61c4f124d + a8e642af4cfe4f4285ef75ba54868bcd + 543699682a090b6cfdde6ac90f511102 + 8b72e5136f3a63a64b79ba4e5e2390ab + 399ecba1b4f3bdf4d82cb1e033c45e46 + f3e47b5f93270b953d77fde0cea2b767 + a01177e2b2950ce423b9236262df8c6c + b75a3737d90e6877452da30e5a71d0e1 + + + d3108749a6319637362c1aac497b0245 + 3114d2f1891d7e1c76ac44172116d28a + b6ac9c0ebb9d807a6b018a8469100491 + 378f69c9ffde0d837cce54fc6e5935c6 + + 458d0ffa7c4db9fdcc5dde713b9ba9e0 + faa83b8114070aaceebadcbb7cc38eb4 + f3341981cf538b217eacae5cfaa885c0 + 3f27c1098bd636dc5a480cf8d251f989 + 7a91d29e3575aacb481bbb44c3357a65 + + + 521902b1092e1078f4f6a9f74cc751be + + 1d5417f1662a2109d8392ee664a03917 + + 21b826582d509631bc01cea48697d21e + 1b97d13f6715ace0656290fa39525321 + 0c2a27469df5e8c83e8785326326ca0f + + d7ba6da444e93cae8a91f79d166c85e7 + + + 381bc4b885284fbd6fee7c10da79ae6d + f042f06b91647b2464ebc33509fbe54f + e76d692160957b64f78a47fc56776f3b + 3f5bb2e3db0b977062965ef87cac07ed + f3758bc4adb8fed3cdccb2c15b5b2468 + + + 548a345857c38c2170f4587cbc3c1ebe + + 89c04e08e387333a67b5367c61058220 + b250cbe2a087d83b6eea9ced29772ecc + + + ff22d94f329a6d75bbed83c39de01e5c + + b524703fb5fccc65031a4f323814ecfd + 23afd8f2a170a89e378f67f498ebe834 + 2970a40f8101103fb8b9116f1ea74f74 + + + 0fc41502ba4571a6c78c952beeea1aa8 + 90dbbdaed6944c25922db4a948087a36 + + + 09c89eb11da577b8a35f001805cc5d03 + 8d9094fe4e7987e3279ba0e708940d42 + 05815089dd3dcf37d9d1353dd3012839 + + + e575d3c469a180bf5064cbc049cc92fc + bc3fbae25f5c7303edf453489fd5f5fe + + + f0185251f39b47c371675b7cef1678e9 + e16dbbd995809565be79ac060b12e144 + 1c07885c0d346838f2cc830560055f6e + 23cdb9f409d6c6f23ce80681272b2ac4 + + + 2617b592f8355908ea576c3bdb45086d + 13688d82d3474ee72752e43263075cb6 + 5b6b418772cd6b30d1198075a7676a47 + + 610d544a5064d964d4c18a3a0d60c8ab + a27ac6744b07ecb94b546db73511c456 + dfddb74c7cddc5060297566230ca5d30 + + + d0cdbdcdaaefd2d0f7ee0dbb115bf8bb + 8ce34df79e2e441b5464c2575519eadc + + + c7caf20f5e8f70796b1d1d708ae0d106 + 002f24b64699baa610836dca54753aea + + 180f503470623e51f9e15033cce4c6dc + 7283a3cd90a9b13fb31c50a64912a416 + + + + d2fea33fafd4be898c38f99660c59c23 + + 0ddf4b7d7bfb6bf530f07f7856979ec9 + d19c0be58d87485512ed01078354da19 + + d5d202c0135a5cdeac9ded8db072d2c6 + 9e070b8b9a6f9f26d50e2df2d3e86dc0 + b1a8e03b369d56843cf4ce8a833abfad + + + b735db1a29c6ce9c7a4ac1569e407e48 + + 93b2835ca4431661398119c62690dad0 + + 02fdf629876365bfc59abe89d46b16dc + e18bf378f4c0aa5d3b87884aeabf9f26 + + + 3430712b4b36438e9b73ea30f7ae31b0 + 11aefc5bbb4b40ef6546c4f53e6dc2ce + cfa0c1f73e06255e742d0f177816e43a + 2985ba98ab0fdea88775c858634ff6f3 + dc8c78bd2f8e895f346d1b4c30e5a7db + 213bb7658c8e985c8d500fbdf9388038 + bbf0654891f7c8c7a68393ed28adcb76 + f125959c5e2e6ac49d122ba8b9941755 + 393f875a3ddbf45fa94edf35a4a58e10 + 829539b8a7f11d5b63f2fda60ac3e483 + b2b78c9d086b7269191d13768ac59929 + 9e56f32cb7685d9e71a016a51dccf338 + 7a989984df3174962698bc38a518b7fc + cded216df491b475f320084b4b62ba11 + + + 7ba24c36b9521bd7c9da0748d0c81e1c + + + + + + 909f5e35bd88a1b95d23d5a0605e9f12 + db3a10a0dbdd56f0ed35df0193ff0f74 + 9d06bcd1c0c7d903c895a40a4525a2b3 + 1a1330b3a8427803730fe81742db7d0d + ae3aa4fc1c96638eb0871d264f658f1e + c769eff334e0ba12953bff83484dde64 + bf5e50a4136f8954128a279516b835b8 + d1cd88a07ee258556f9af5331493f14d + 6d32c1a025ff1f4b732797adfdd44662 + 03687c60edc614cbd1cb8d799e0a9bce + f9cc592cb4d9ec21bf03f32bef09b04a + e930bf40b6de9b680e7118a222ddfcd0 + 336d41021257cf6e3e0e0d5c4e880cf9 + 91ff4468e3c1f556f690d87ee1524b8c + b0e74373a827c99772aa86960bae4e8b + + + 3a7c1665340c37d003da02b2ee3b9dd1 + 1e0894e1bbc2c7013cb16ce53d31d084 + cba279dcf85412dbf2ce2113c14711b8 + 7b7be60082d7c5757365adad719f18cd + dabd0cb4b0e5a1af9988cdeb842ed265 + 592642738598f1b0cd27ba6907bf1c18 + 7a89dc2acaaf4475b7c2e86e2be7d314 + 44ae7cea20a556cdbf622433efb5f606 + + be2f961ac5e015d43023045dadac368d + + + bb519c93430147bb7fb55bd1f0d7b36b + + dd1a383f11a2411b1a8ce5e3ff33c0b5 + 406592b509ca91998e34172d011c764d + 342683816e4da8d2b03ddc54945b63eb + eb3a0248721f18e2b3686e885e1d7ed0 + 51543dece2cbbd2838a28fee6595f63f + + + 19b519e4756b1b6e2a83024440336a43 + d70f7e053a4728ecc734f9d8318037f5 + 21dd30f2b490cc73265d8d9e3480ec0c + 7916c33ee1d002b2a158d970cd7330c9 + 5f6d655d111c53f063cd7ecac319593f + 603a1f9b32280c883f172893600eb9b4 + abba1cdb8df0209d9e4590478b186014 + 7d11f0df87c075558f5e10d3aaa09af6 + + + ed2b2e2ff61f75f50abac7e2df131922 + 9e85f934eb73d599fb38c955d44a6a80 + afbc52539d5cc54be39e14d79d626376 + d56d332aa4135a254343df700b1419f9 + + + 556d632a94d662bf540a02998ebbef43 + b20004ee24af46ca28c17cbee12cc2e7 + + + f9571807c378acfb7751a37b81849be2 + d25f46ea263e4c625c272768b7bb6ea2 + + + + + 9047c6c852c923fc78a3bd69913e254b + + + 8157df1a6c4a483a21fa4df3d96a430e + + 3174ff0eb35997515da8f286dd42d663 + ad399a2f7122f216b50ce8936791420c + 34764bd397070d9c59484917d5af604e + + 6253d35422b78fb8bef4639d1e3a1c5c + a2e7b617bf4fb21b7bf1f41e62ebc349 + 034a81ec8b37a8931ef984234ef63656 + d1e947381ff1ca746433f446c4fd6674 + 8f6ae35bcbbdd4dc3841d56a9035e294 + c978f7d0cb73b79041c84e6bd4f84372 + 870b30466c1d617933bd59f496607d22 + 4653fa870c35c8375553435cf6507a24 + b940fd48afb2e9fd2aa691a558537fd8 + + + 1c8fac7a261a0af971b611503aff12a3 + 6b9c24c9cb663c579542780efc1ec1d8 + + + b6403fc78bb94626d2c3d33d4eed49b4 + 753d48373d372f3aa641beb4ce12670a + c6a0d61f5ee5e131ec02ed8c4219c9f0 + + + 6554e5994e64f3d5decc2abec83ab844 + e4b84f5afdca21ca5c5c705115fe5688 + 032af9bfbfa0dc59a6ada956682e7bf6 + d7865737c685763eb612641f52c9792d + 2abd1f100e4d06a0b2328603acafa1c2 + e54cd3ea77f7343b4c219425ca7672e8 + b3a5750f546c9319e2da68b94a42c9b9 + 966d4e84ba472a8fd92f845a287f0c87 + + + b0bd3c8248387ed0811e1f201102ee19 + c139f608b4aed5b54f12bd141e7f2faa + 9b75f0fd7b003101f1d8fd77a85bea2e + b7e9af1527113e7d6b2d7a342e018709 + ee080cafe4aef45cef176c798607687c + caf61a8e7a7964179a7d06bcdd7b404e + 27a20e619a7e373f340fcb96c7448aaa + b0e2c67a4fb417562f69c1caf845fe38 + af9c7655fec9e0df27750eb723d96328 + 1c77e2bf38d9bbe9fa0b50582c80f5bf + 721bb7b2e956382e96ed0f2482f811a2 + 69efaad727dba61b3e2b51c0837269c0 + 31f394f277aa51b578a3b1524745c5ad + f9ee5d053015cdc890f25389fd07aeb4 + 78cd6800ca6bb2606ad013c073bbe0e2 + 10d582d1809b3e856ab780ae2373e8e1 + 29c89647537592ac61ef6ae10113ec60 + 84e2d056fdb8693ed0ca86e3b646e26a + ace47512ae7f04630015aef1aa44348b + + + + + 92993f044625a782719ca45347c997ea + + + f88a603c642b9665c553141a4e951e95 + c3fc1f68318464d1f6215f7ee15f290a + f1fc22ee09606fd804fc3e30edf129a3 + 9a18dbc8f1251428fb8b2be8c276b977 + b278338af1f01f7eba47b99ed6a08af1 + 841ca4fdc3f8bb5fca8ab2ab9730b863 + 95b6bec541822d94804cbe0b28d3afac + 8faad6c4a963d66625e2518724eff2d3 + 9aaf1b6c216363427d271feb3ae774cf + 0144e8bf4fe30d9a9b174ad29fd088e8 + + + 5dc15e978071ee1d3ae3e68ce650539f + 5f212c99e408265bf3b21092bb0ec678 + + + 69f24a0455e3c1fc3b63be3166317572 + + + + 2d0657081891f811f55eb8772473d357 + 26f8b41721173312e0c0b8beae480497 + 2fb223da541cf9d606636cb898b6a58c + + + + 8b2d5a0189b24a29deaead351cae4490 + + f6f27351d1260fd7fc70bf07dba6538a + + 81e6f3b0082e86fd505089aec4790d60 + 9aa693960239184a97f618000ae87f95 + fabe295173111eb11848cb877a0ac4e9 + fa513d3fb613e646f983acf6c98fa606 + 540f818276c56c191ce1d265c3a4886d + 12043f0267e4ceaaba498ce583802542 + e2883be7742983837a4a5b8407eac0f5 + 1cf49116808134297557408ce55d88c9 + 7581f719b396eed41e085df011583b90 + 4f22096a7b1155688b236cfe3b7b056c + 3b93d4749deb3faea4d9597a10e21b9c + 6abaf1eaf1d30b3c9364a77e1e2d4883 + 2d20423523e55f21221d4ec81647a324 + + 635b6ae6284c4984770333a3a5eb50b9 + 4c017e096eefd56285e8a30df68a6bdb + + + dea14daa75d7f758be7bea2f6347f8bb + + 822b4e3078273812b8d18c8613273d8c + a5cb8439a0cbb4a97700c358d9b3296a + 070e644c71822bc16d94bb9407d9c2a8 + 535b80ced91cccd68ae6390f8892e40a + 4aa82b04ac41f766d60f7f196484b124 + fee9b10046955bd35a6177698c589dbf + 4484e2a5c3ed88f8defe990568c3271b + 516641e8fe1c7b01bcae6e0a043c5fa5 + a6d41f37732e13e4cf08b5cf5f7cd4ba + f247581f9c2d0fabd821064b5c14a928 + ea9365435bb8c668600888fb10b6daa0 + 61cf233a15c6b44794fe38f8d16a18da + 6d2b157d1fb21b83413c5d2aea80982a + bfdb157121e1d76228b5f5deb32c3a27 + 68a1981b4a81b698bdea8350f6da95a2 + 57baa2f97bad87b8c28c873f35c211c0 + a99d27e182dccfb5db93aa32ccd079c3 + 4cdb927ed23f182dcf2e5e465c0040ff + 8e9fb9b183d47bde2b0ffa1b00bf84cb + 4845fb030ca12f7a8aecc41acc17ce45 + dd5f06bc0f5b9abcda5f763d7d242ae9 + 5307f5b4db085f316aabe83a290260d4 + 39daa7703f0da7393e061508ca692b2d + cf38c5ec49924ed705d806e7d348f505 + ff6d12c49e47e4debb8e0b98c3debca6 + + d45af4f0ac9dcdea5b84736176b65d5c + d9aae5ce52c334cd5bfd202c2bfba3b5 + 5881fe59156ed036aec550ce35552233 + 4cdf1e4f02525840a63ed0cb3f9381d8 + 28f9cb1348b18e2aa6461fe75d745427 + 053e9ea61ec70f2f77a9ced7d0f74ba2 + 943707d2f264e080f13ecef0e6c6cb1b + f22423a964eab28f72780ec3399e9a1a + 8237f6639c0733a119276c77cb7777c5 + 3a964be37c1b92462544069da6002a5e + d4326290560409c3be94ddaaf8c0c31d + 622dd57365138afc694575c3239efd49 + c7bc3a180a602c2caf0499c7373ade55 + 560b1e7e97bfc1bb9fcd4fbeb7df9f08 + ad29d89ca6468f2b0310e979bf1cffd0 + c1ce85f6f69c9d718a57d52a850c4460 + + + a29122e4835a7684e6c90d5cdb52abb9 + + a13481b15ba757b838e183f68aede341 + + 75489f871d69990de7b5d8eb31e8279d + e4e909464847c7dc1dc19913bbb210a5 + + + 7e5e03e28ec8e23df442827d99fbf094 + 834cc3305dd51a5f544918f5c3af28df + 88fb897ea13a852a241bcbd9c483e4fa + 821a309b616715fbbb75eb6112bbf060 + d14fe86c479490bd505874456a99e125 + a73953f741598652b00c8fcf597a4b90 + 982fb0af6079a30ff759be76a0491a9c + da8a4f8530d62fda045198075fcd9378 + 45779ae3282ebed3a66dfeb992c7592c + dbf55d9cc0cde5aabfa44e2962201bff + 36fb5a7ff750ca494e1e242cf34c2df6 + 2c4e404103e4e754714e95946db0b9c8 + d5bb470e6b9a588f15031a5eda275e96 + + + adf3451edeb6cdaef0aa5dd32c68a75f + 121df2b1bb23aebbba09059f9f919b66 + 7e8a02ceca7bf5d56f8b0f7faba854ad + 730e4204ee05dc25e4b78240e8abed50 + 66bd16e61810431fd6df94b3161228ad + 570743dd0ce0833ff467a7d7c9cb501d + ca098ea170a6a2ac16afcf2ac2f5c420 + 4d86667e0bf13cd4cb2d9abf373e1f41 + 0875520414ea3e5006869cbeca4ff841 + 84c6e9f871b9b03772e36f732b00abe0 + + + + + + 640ebbff7ae0898ad1c2991e6e12a6e0 + 95fde5e817dbf093076b017fadc4633b + 0f859d124f164324f43268b8dc5b2550 + 37b6adeea023caa5733b541adc7c2c5c + 00cf6d8abb18991693b5fbe4d8237d0f + ba9fdbdf97153f87df1038ac7bc6c3db + 22a891a9187a63a206b569472f174bbc + e9eb4102549e447a2a1806add056daa2 + 53a6e062357618a7b2068223f63db4df + + + + + 229c6e42c9a17537191b6d4eefcfc3c4 + ccf1269e19814540cda409ee967d31df + 0ca373339439aed5243e325623bd4722 + + + + 5246d4a5001a5f851f1056b935b92caa + + + + + ee19f9859cb2b2af6e917928621e67b4 + adc59883e011f68578760d1cb821ee91 + 797133e43274c7fb700881543ee78375 + d0f07a80f11e32a0b4db63c085947661 + cef88b5ae24e764021cc7535c9fb0757 + af4c422ad6080be40c38fa18d550cac5 + + + a15a070d86a73c64d5c4a2d4ff19a026 + 4faef07924ba47d50b5104dfa6507439 + + + 50a813fcffff774124673968c2588765 + 10594f8f36b65d90d688ff1c6d4dc447 + 92fb7f6884af0a4bfcd8e3aac63f43b7 + 3e2450e9728253790177109074ed60e0 + + + 8c420b26b0c5260e1ea116b16246ece9 + edb0f819998c1032ba1037d14459a9b2 + 3178048c7cd9239e5cf5745f5e7849c2 + + + f3dfc4fcd5039904c9cc16f4f2823350 + b5c0c78aae660e0c5ac77d26792772ae + + + f5ab2e916d1bad25027b896f1c5adba1 + 083528629394fd7d6e4dc6a6f7017635 + 3ee85b7db499a0320f3ad1a0b00b56d0 + 1ba5dc77ddc36380a9118d69a3d3f0af + 9f826bfdb01594e558e32445eee076ae + c14c3854776b07b87ec3352d9e3caf9e + a6909f78276713592b6d0c00bbe9f230 + + + 823af2fc3e00f6e305b8e32c4e45334b + ca8877d3c6360f1eb9835538674b89c1 + + + bc93de92e18bd39e623c04c8cbae8978 + + + 8fb1d1c98e6b484cdec7ec981c475d98 + b872d0902bde01aca33a07b5f2c73251 + 1e2158ef460471c58c3cd2179efe57cb + 73be031e448311e2c4b21005b14e2554 + 8bf333201bdab6b26a22280cd679cc80 + + + e563522d70cfe54c8758e872559db275 + ce3999f2a7f04c38541d2bbd0130d2b6 + b0f35f673a7b47778ff343dae9d5d383 + + + + + 4f2e004c28642ad2a5e503cfa77138dd + + + 291cd05cf0cd4fa0ec6c3b130b5a0f5e + 51a107ddcf023c329cf66d77a60950a5 + 83f0bf24c06bfc403ae40bbcc7a1ac0e + + + d47756ec4c60ca0887f2af103f3105c5 + 892303505366a2e31c35e5171edafc8b + f55b6f01ff61bd1b18d9e61e2912b018 + 9078e82c37caa0aec482a73f802d94c2 + 54cdae84c28fce99b4f299e87a683f8d + + + 4e4e0f072f3d3e14d79013ab492b48f0 + d7cb07ea52d3834c4a9aab18e4ba5d13 + 078f34dfd1f4a85a1eae83d98a907f53 + d87e9a256f07ecc90dda164ddf9194d4 + ab18182272beae1b5842389eb33927f2 + + + af1776c1a8d21ed13f2bbe59e8f8899a + + + 7bd725048607ea17f51c63ed8cfcad3c + + + ab8e55a390577ef5b986034432a959fb + 91e9f4866ed3f8da69da8282ff6aabef + c2a0862b305c3650346d4318732423a5 + ff610dce8b535bb76c0c7dad4eef7445 + f1c1de1569433129da54145066933d50 + bf6ab62bd2ceb7ff34707ebde3f8aadd + b5f47728ebcfe006ae06c60a8107d8d7 + 0f6caa2ca6b58b008deac9164bd606a4 + 394a56f741f1b7f9747f9623034930a3 + b5b354806e4cba2c2f618ac82b0891f4 + + + + 354540ad099fe9517a987291e3232e84 + ff708767aa46791857c226fb298af9ca + 08260ced89393f7b253000f01533d236 + 953e14ab217cd42ca3fb18590c1db0b0 + 5a8e690662e25fba8346bd1dbcc0c445 + 2a5fb4d01f788466d39690611a8f3b21 + 37cf9226dd6e0d77c9aec90c31736d8a + b7f8a830758458b344a32e7c4811baa1 + 5e2925f0eed9ac882ed969dc07fa7079 + 1ff395c0781eed8b42e776df320b2e6f + + + + + + + 824c009837f7b70d4741fb1702988f6b + + + + 547fd0c27af2fb16c88f59db037c70f4 + 8fc42b80cf41368b3037552699680918 + 641f7116a86d4e1e3f4000c568f3a326 + b0d04e79246f5e7346190710f77595d5 + d229bd1755c23263241d5f5b48dcb23b + f766e80faf490901387c4afbe3f7ea79 + 36965776d89210c5a947048bbc274ffb + 9e0fef6866d165301fca88a7b107d0a0 + ea1077acce30e8d568556d71573f25e7 + 0d619c83905b95ce8520932091ae9be8 + 4a9d83989d3450bbbd2dab9a1699b22d + 16ae8677d56d979ba4568449d81f9548 + + + ac8776160d5c9ab69d699c9ffb730459 + + + + + 3554d433e16dba658bb76b3619d24bfe + fdf152341ba741577dc6cfbafc3209e7 + b94720c08b3668129e6a9bff5c87bb41 + f95baea65824cf4685c8f4f48a54baae + + + 6fd3ec495088bf4edeba0581824dae8d + d0e20764a2d964e31831746b7d499fc4 + + + 4328a82815b28cc161a6660833997ae5 + ac07416f8d9a91e4f52a528ed873f8f2 + 9eb715220530bf6456a0d2b1b6935616 + 8e9489c2d3bef2ff08b00ac5a501cee5 + 6d590f0497ca01c6c2543f91248300cd + 504d112a56f8dd4f5da105fd9a7d14a9 + 84701bd9802d861e20b9684d490fddb0 + + + + + c516c006b67b742f4a1998d441d7f1ff + 4eb43d51643cd279f2a3d0e4098e01bd + 86530ca04c26f2983573478175f426b9 + + + 33994b540fb92fa2119de7ed28564746 + 8f2917ffbd348a710c50e6cff992bbb6 + 9fb195fa4000eeaa6cc09c789a263876 + 79c93553679cb96b84f034e786a90624 + 02f556490fb1c21c1b1191a8a67579f6 + 1bae4810753454646a4fd45612678a6d + c64d3d4cfd8641739bf10594edaee502 + + + b05f8602c90dfcd8009c3ef3429a6f47 + + + 2a94d090b99642d5512745c656cfea82 + 4772e2c53b828e9efa0795cb2c4c8e4d + 6030c2719f7e02b087d2db73ee3ef0e4 + 28870fc6181b814c9e2180c3e883c4bc + 37a9e804741924af6887dac882a318b4 + + + b65fc26577e27c8cd230a85f7248fa2e + + + a3a60f5dac548f4c26b49d13d5c29d1f + 4d0e85d5515452b430ddd4ed39e8ffdb + f8e79d5124ede89fb22c2b4086ba5469 + + + 9ebc5a97a910fe69c176a57d7b3ceab6 + 233d91d27edec1e1dfc6c9a48e9e857c + 4ccdcab275fe997e38e018fbd75f05da + 46f03dfcb762e267010e776a041e9d8d + 1daeaa6373bd7dac524eb90865787198 + 52405e9a00bfdf9576341f737563e021 + + + + + fd6f9fe9883c08f33b1765dbcf2a50f9 + 7e1a23d2d59ea43100c0948fc766012e + + + + + 960b142121951d97ee4d518b05ab7164 + e54bef00227c988140e82378ae62ee52 + 102e19d09c4b3d1d53f36c6fc6340fea + 4d1d0e6608a01f904a1155abbeeff3fd + 542dfe71629446eb26beec2e9ec00da4 + + + + + e1b84ea56662cd3ef161d2c9e1c583aa + 48f8609973c47786effa314645ca07b6 + c55218b10149221b556ed45b6315d93f + b8be68cc3e84e9f3e9725ff96c46816e + 67c1c487956d5a21ccb3840d5ce2a84d + cfcb48d9d1ece9c28445d159ff252728 + f1c47d293dd57eecccd75f3f8caa5702 + 52f3e2c104ef3c64e01a76d2b20baa40 + bb43ef1f6f9e185223eaf1d9d8a14810 + 366d8176ebae581ac199cd8917a79401 + ad12ef081d3c58b92f1340e8e1f3ded4 + d535dc115f714287a5d4f142dce687b7 + 900902082221a7fc963af432fba9f394 + 6c6b986d1e1d0234d2d0baa426169ae8 + 57b9775ad0c859a73d6048dabb7d7873 + + + + 793e43d3d339c7af150ae0e7ea0dc705 + b468ed983479f8ce5bd8e1f64451888f + 37fe7c70d5b40e15d35ac2da265504fd + + + 22f71f8a3fe5c39dd8fd5bbdc0284729 + + + 9771941ca66ff5d9506fbdb0933b25a5 + + + e6e23a9886b5292b501fc7bdbcbe03da + + + a6d91ae4cc0af865f5267f7c31644070 + + + 99477d819145519433d31c91b85c3b2b + ec3199b593baa8d3e0aaaaa35ab9f426 + b65c7f468938e961af066d29f9d03a61 + 4ce7d7fef4d9baa3500cf525cfae71da + a402322c2d3acef2f21d74e77047ece9 + + + bddddb9c4bf4f4c745e7136972e87cad + + b3ca7291183be793b86b8a496e3e5db2 + 1d5721444a975858b76925230679cf44 + + 3d77dae3c24fd09235d38425a4338569 + + + b6bbe5c29585cffe98bb56c47aa34727 + + + bce4f7a2fa3b6a95b30c03bf31a187ba + + af6f64ad1e17eb983053960e75974e31 + 9519a174cdf8fa55c03c89369a81c46f + 2a3129f337b687d7eb69910ba20f3cf4 + + + 573288ea5ae3a932f8f1cb49b94d9bb0 + d86c4ffcf908e5745438c5c8da519458 + a98f8bf05f826a2117417dac6b6dc376 + c83c40603ab5b71f32ce112fb0919f55 + + + 2c245360398917338b4c5d341814ec8b + f2fb094e0376316bef2f53a241dc61b8 + 15b0625995dbf3692ee7ca7e41ea4be2 + b0d9e95fe12aa9caa8eaf974dd51be0e + ccc2eceb9c8bab0deee92c791e357300 + cdfb9e1924a982f7e4517cd2d2998a5e + 0e7512841584f7438eba42d6e7ac1440 + 6c5b91919cf66807dfcdbb7a881209e2 + + 96af3fe43bd3064cb2e47ca86cd8a0bf + 5b24573fe6de9e060a2322709c17caa0 + e4fd011305567ba8488f35f48b9d3ee2 + f122646d549985e3d79fc61006d3ed40 + 06830cadd5b032b4bd167cd4de4276fd + 5e7c3f8f6889d484c47fd9aa0f2b43b6 + f6f5d29bae23e5e5c06768832db8da2f + 7163568c18aaabbc8720af8c8306acdb + 4d91fb302c7e01c694ea70b516ff6b87 + 2250a74542381a3fd135efe0d183ce5e + a1f5dd6923eeb18cec496be506c3789b + ab435c04992aed987bf68901586875da + + + + e88643a08e6600c015c60bb97133058b + 4efbbceba575c9855c45759553d88d4e + cb14483fb65542188b821a0f63b79862 + 1db864c7701680b534a73caf89dc5d5d + + 14e06d986cca391d2531811f77f93040 + + 61c7cc0151d196339d32868f09b7e227 + 5d0d6d19a47fd8dcc7776f2a7f405af7 + 0f636a5cef979fba599e5ac3cae01fa9 + + + 85d2d8894e8c39cd5a4bd71a5cfe83a7 + b7a04fc21f90e1efbd9e1b855adf4c63 + 7ad1c6c65b2d21ed181a407b5815c807 + c7be3e554b5f122e07a94370ab42cb20 + 93963fd90541e6797463b35969bf0fed + + + e803cea34ddbc832659c1bff655a563e + + + 244d00514eac629788e0ee26124e6f50 + 8564cace9f026c91db8d59a82129c048 + + + 2499d45d17cfd57a170a107aa55d332c + 60f9a13d87dcbcf977c8ec64bb7f92c4 + + + f341da4beff05eb97169d967deb86a47 + 827b365514c64480f7a6e5db993ffe2a + 18f1c3a1d0867384ddfb575b7a2310bb + f8c399ffb599755a5997513b0b3b1d10 + 912bbef42e68e803869d103b2423df50 + f734b921613690cec35b6a8884425558 + 3c82765204db59857514ff297c4bf78a + + + 4a2d00e238dfc12ed3581689e1b52991 + 382fa6bb536865f7f4345de2fd823c28 + a843b573a2fde5b5c485d75af08a8423 + + + 0710a35de024358d72decbe6eaa0a243 + 7ddca20a626bd02a70b7495ed339f980 + 30a6fa669113100f44f7422d31a0fab7 + + + c32165fdaccb8e520165f4ef74238ade + 9d6fb582cdeb89dda36b51c88371fc0a + 96ed09e852f65be8347e0bc832f36038 + + + 23af0440d7e1e6c0116926bb33c90722 + 42b2020ebc1344f38a67d90da9b13786 + b5d23592170ff6f4bf7d523d6a15bf78 + + + 9574dea3f61a925bd5edea89279ca2de + f7c1ab95a6ab8e904cfbedf259c3c7a2 + 0a7ee0c8a366888e3ddae306c4022f75 + b58df8477558e00c6955384250ff1616 + df85ec7216bf14ee50e2c1d68f93d5b7 + + 2dc82d3785e57bf0979846467d0c5d4a + 137a3659a94f1a37d409104b1f5ecc79 + + + 150a5fde170c25fc1c6ebc419d679600 + + + + 5008bf28d062b453062682c0d8874e8a + + + d8653b3cb0df881fe90f5eb700a08906 + + + + 36f2f9bd10d2e45b018ca7d7bd0eab62 + 958315e168109fc3abea4b8bf4538185 + 4cb802b6403412b4ded5b61c0cb70e47 + + 683fb1e8cdfb03183960492c5aedd172 + 8056ff9745399c6eb0767e6a7ba5a749 + e5aabb61d1e711272ca4c4b906e73fd8 + 1e8d3a39e302d9f70e67becd1efcd2f7 + e4968b8aad959473ec68e9bfd2580063 + cc53a3c64ee89d6a44964ed1a8f3cffb + 23c0a5bc7c900713f9eec0fd6879e514 + 60adae6442191a20d948ff4b19302056 + a3d5bc4cf6725ce6ec0f906ec48270c5 + c385f42340dbc4b3fbfced6a86e102cf + 4dbfb3e72ebf4770fd2721df6bbd0353 + d076df585590e82eb729a41cc22273d5 + 5777aefd4cbc4c7be00e675abe75899a + 92f0f5b012446bd67601380c6d0f2357 + 01ab966c4c93b12489b59cb59755f65a + baeefd0d0ba371c45a261e82a7e160bf + cb6b2264c9ad3bd4ff95ba8c3e8ce1f7 + f8289f4e495c4e590d77744e9eff3df4 + 624a5e73c4e80a17713c9ffa41a8a082 + c4706c29036f5819c2ba735bed5c38fc + 929364a3ef07d7fa173a17d485efbd15 + bcddc42d6269e9b8ae3028be46e34dec + cfbfa57af30d369688a7f8b5c7f48694 + 7ec88004f5c67b9f899169346515f800 + 94f3c1ee7db7f25145f7e4027d77a90e + 66e5fa7e87bd7be262dfe633858422f9 + 49617128de0ea1d2c115dbc344d0a58a + e2a3255433e39d840687a864ef87732a + 7962d8e55f97810912268b54562d3578 + e505f5c8aa9e9a74d62483f691944e50 + 77fd1dbb704f784755eabc767b8c5294 + 8e7462147d7d4a4e6bf869a225c78946 + a8bbde30f43fdf5c4f1c002862ba0222 + ce7c7efc006c774da3e1693e9e53fc09 + 468a650403dd9d2203b613d5f8a6cae1 + 410bca92886309cdf70f404b9a19700d + 32f71e6c706359d204e108d1400f0edd + a716e74c977070697094d19dadfeeaed + 1c365621d8c81978a228c9614a65a68b + 9ae2bbb4d7979fe6364b8517d601f170 + b48cba1daec6a7c8c913a616c3991762 + 55a9df388f2233fb33000d90ffb8f52a + bc3a5b9d274603bc8fa6caefd647b485 + + + + 1dd65d1b8bcd47c4b064fd01f94fa710 + + + + 1ac583a54ed0c4c3f00f84fd5f2fdad4 + 86f5dfb30a8a749a7c9bba5f7531a348 + + + 484da7f06519a0ba29f0d9de12ab2399 + + 37beab0a85c3cc3801b547560a3f35a8 + 665abd97996a37750b0f799b056d4742 + 56335877be6e3c3b61988149b7ff65d2 + 2039fb42ef770e2a3c603563b6f4d266 + 653b48d8860fb756a05ffd26afd0a81b + + + efdd51640f3cf7339190db2357fc2cbb + ec3a7f21b0b941c3fc4b98b41883a9f1 + 02c1183119e9f0c53a507f2c0abfbde3 + + 375c58b9953d52c5cee08c0a577c222b + + + a2cefc96c5f401a7a09e8e7649fd5415 + + 7c72dd6c4b797a9636dd850c937d3101 + + 58ed4b609af9c8b5699775284ff01df4 + 501738cefe58963edbd33cd2417c296a + 2effe28eaf1369e5436fc9fec5dabba2 + 47c8b4bf35b164eb8babed136e3dc2d4 + 5e94a5e950c992e0894d5a5a61c95251 + 53195a180cc0b6bab6dad15c89fc2353 + 955918de24470714065c64b6c972d8cb + 51400720447c0556510cf8347ab37411 + f726614164a61979c4ebb948fbf6e19d + aaaccf816e3635e3ce9ed6d4f2668192 + + + 38cc06de73b02f64011e81f9f36c6363 + 7e638f3e755b6150c000d8df62b812a0 + + + + 15ea2b4ed9efda0e174a11b4b22ac61d + + 6de9a0796f7be6b21f071298bab3e457 + + + + + f7a46366f8d507b9575e6374775df7a0 + 9bf6de2f3433c93257da43fae5b863a1 + 6aa70945812b043f94a7494ae6bdb920 + 9342b6858003ada45ff14a4724e71578 + + b6a2e184232c7a98df3d3d5a2d32a1a0 + 4f7d5aaab7e7e9afecabc2de294f5d88 + 55119c9f82dc1b0d7953791eaa72bcc1 + 69006ce18f65b07d92b09cc9ea5897f1 + 576bf7456adbdf276091e639fa57f071 + 721a8fe686a94accfb132e9bd2fa0447 + db59fb939de18058dbf982f01af5a45c + 7616c83f3fdf1fd7ef6b9eafcfd5c0b2 + 113f0680bc597388ddd6300f5d009a42 + + + dfdcc7d9b094682496a4ccf059456145 + + a1f26720ecaf9a135d79adcb91acafd0 + 475815ef1cb004646c3e83c7dafed3a1 + + 9b5046a1505356f234ae0f878cc8dc5b + d15dc7939af91724b7c5d488c5c1908c + 4de4b0066bd43da29555727e02e36a66 + b79bfcc91f1174da17b62b45dec942b4 + + 7a21bec0d8e0150ccc8d5a957d566e4d + + + + 821f01daba0c116070f8238bacdba837 + + + 8aeb8d7398605e8fc635fdc2281901fd + + + 65e2230395c230707f210ed6023fb9d1 + + 62e8eee0c5e2ded77d9eceb286a195f3 + 1566d8e5084509e8264e0e49cdc5999d + 03ad1dd204fd7085bb084557034c3e65 + dfe9818c3657f5e6500ad61662f597a6 + 0f261ec8f4557966cce85fe81b64afdf + + + 001c464bed42cc17d054a422e2e2d03f + + bc9ed07de7d43b5e6d132d5c770645c1 + + + f228554e7d36de948c8b2694fb1c6cef + 45ec3e5f18806468a8ddebcedae099c7 + + + eba36d15c5bb1293f9837e3a793b4d85 + + + 5389bab6eecb916b692062900ffddfc7 + + + e191992589964afb4870398382183559 + 72dcf0652c6f82d70e11b591207790dc + + 2e1100aacb1c26c348f9350d6b2cd42b + + + 228aea95b2834257a276e4c6c47d9942 + + + + f156900529671c7e39fcc3f469cdb070 + 621accce43ccec789afbbfbd60409f06 + + + 6c2c061e8f53378673e3a79bb3f915b2 + 2c5a7cd43115685426cfbce9b9d87a5a + be0e624072e268aa8e3608b467eadf33 + ced25ae63c190d54562d3a9ed3d38e69 + 0131320d73a04ab446ecd2df16ff1109 + + + cd496edf23c456f9a6363cfa70bf723e + + + 4d4b8c0fa54777ffa300f9b781125f41 + + e839c9a64dc85152646d1f23eb04bf13 + + + 2aa71a1c5d7de90dc10066b67e6adfbe + + 49c965711d394435d7fa4f5f011d840d + b354d00f15a845524796083f92ac2b1c + 6d128d21e4170b734101e6a3d1d5a6e3 + + + 1789f28bf9951f38705e9604676ddd30 + 1b205278b8c6dcb25f1119889535bff3 + + + 56bb677bf66be44bd3ba9f78e59c4950 + 22475217925866afce3942bcffcfd868 + 054b148dc03970e1fef0d0d66607f611 + 013a9a5fd26a7354047197bdb4e1989b + + + 3358f5223b7f091f85e377acc035789b + + + 7d0747eb6ec79c26f795ce323d0071fa + ad9c0647c354abc935eff6f76246ffa8 + 0fbe2ba6052b7c5619265bce9fe046ec + + + 1e515c99f0f1b0f2b421d491fbd1618b + d1a232c30eaa85c5a9b291d9d1dd27c9 + 26bfb34b72554b6c7c5883dcd0bde464 + b04feecb53a03ce32739e82977232a60 + + + 237c9e4ee7f15da7e1f2c09ab84b1a95 + 09ec9d7c2ad8e33711a4648289189ce8 + 66e09b9b583cc7da8b2098902cf16ef1 + f416bd8d887f024693e7cf4643866597 + 7e62978a4d8a3a4c8778b9dfacbe193e + + + 994549edbdfda31a29d959ea5e8c6cec + fec9fb3354d1a9d059a6021301018b6b + 8a3e4717f09e4bac31938f79714834f2 + 89dea0a7fb8519255a8ddf195d276745 + f38e165c527ec231b64bc4541f2b480f + 8c7f3c07f34fa08629ab76f0bbf39a2b + 91fb10d07d5f2ecc4bebb72081a32dbb + 276cae43d17a2e2834b6ff85bc5bcaed + 25d2866513981b07f52c6a96944f6463 + 50818efe2b75ee3a34c54b01add7ffc6 + ac94b5e92e99fa1c91ff363f7aa62830 + ffa7e788c4b4fc336e4d47d2bf432165 + a4afe18a9088ee20c8c764f33c3dd575 + ae55f1c16170404b38debbf901d12ee3 + e582cff4b5715ed07518bca033c28e82 + 4b2d8aed8bf1a7b7a39700ed0de2cc23 + f82cc8ef09ed7741742a109a47736510 + e257aec47da68e989a6e30ea1328c926 + 3599ccedd2eb31ce58dd7baa0f586e0b + + + b3bb91571eb6715b45710c96889d7f95 + + c1d8017650522352029bfb937a306977 + 184c342923811a6d54c1bf2caaf0e669 + 1635a023b36ed646dde73eff076233ba + 0714d9344316b3b4845691cc2573aa16 + fb0ee9e64b8cd64adac1aec7132d7869 + 197816bfbaac8aebb1039a545b2e196f + 270cd387a0759d5c8b758b3792d8d1cf + 3ff241a1032230c913cb211168dd77d6 + + + de089283018b93cb115ca4501ae472c5 + + 0783c9f9bf6fd68427671812f6951371 + 5905ef7c5e60d6b7e812f5eac03fa4b2 + 8e483e66a5ab7047a7a672c8f5e97afd + 5871610d1e200bff8411be1851181a84 + 0873a5a0392cd9402e7b2d9ab2149135 + 72da1d7a691fff7e19610572ac0404bd + 7ee4176f463b70f14c0af2862c197345 + ea22370e2305ed16539ce1972a18a34c + 641bfa8b70627667b502e5e40e901bc0 + + + f04d7d7cd7efa468ae8851fcb07a5239 + aa328232990bf2b4af36809a974366b2 + + a0644dc8772c0fdc18253df697bd4801 + cbfe7f09b86fd991b4b69212ced46855 + bf8934382b92dae064ca1ba51d60466d + 278e838ef15a0509b2a4894545fc2ddd + 4fed339fe7d712d539a0d1aec2086e90 + + + 2225731860bf0d32ab2bdea49de43b7a + 98a91a634b73f0c5199a1973fa71e598 + f2ed009352728e876320c923010f6a44 + + 51b73a41c27a6453607f065a5e77ba3d + + + b6a0369eb0c275f3587e047e1499861f + + + + 7b623ace0f082c8e5ab193a7ceaf3118 + + + + e36e8f3469ea5ebc49eb2f2530ef93ca + e511ba71e6c7e81a949cd29210b8c4bb + 0014ccdb152a192de1165c0e5a998cd9 + 327ce6e777071c5924dbfe45f1879b01 + + 63e55cbbd7b5b2575479a55dfe30989e + + 5bb6638855fa69649da6b61b5abdfdfe + + 5f0e1ad69a0a6387eac0b05cb8bf4d52 + 6947c4111f990c28deedcf9935ad6233 + 09fe8a727600f1469e3094765fc590b5 + + + 283c9dff517f4a014a0f55f6c38aa739 + cf80105a48b2a41c755df5f95c1f76f3 + 6769922df1fd088f0acb27ecb15bee75 + 99d3bfffd18ebf8f8dddcfaf3f8cd9bf + 46a6f20e645d3b1f437cb270d78fe06b + 0a8a94ea2939f74e85050ff538f86de5 + b0f6a2a852e2d0a12aab25f47b7b33aa + 31d013da5ff4038a8b74cc6a6d2e4c1f + e45777ab470783ef23dab9d1ff54841f + + 4e48bdddbdbff58ff3385f27bf1b3cba + 16e15002183c35d287a468bd2ac05852 + 43a563d17abd49967774515fa1c23cd6 + 6077603c7fa56cd087b38382913147a7 + 46278dd474ace04ba934c0b8bc768a25 + 0904501636e2cedc1977cddf765e60cb + 016090c04b865e8fd45493483b350ab2 + ea9457e22788fe37335fa698fb11d411 + a067b769bce18da9057130c1ecfd5877 + 6a3745aedea4a3dabeef53d30cf26f46 + + + 8bb699579c28a4d559308f1fb1166d81 + 9d6e12e15d17d96fad76c2bb0e81c4a0 + c1937699cdfe0b2b193778462ae0b60f + 2bf8749bf86f675890b3dd8eb16e7087 + + + b85813bd7b5d2fb82b953be77f4e3b1b + 6ee67f305807cfba2b54907ae8f117b1 + 87f3c60717b69462ffad24f90c56f6fa + 1534083db779df32c0c2e4b9312c8f1d + 44467b07422d7add2f00db52a2345263 + f1a46aef24c9aee9189f678e1937a252 + + ecc59f851ff3d3329cec690b46e2c4e4 + + c81f6ff136176fc90035d17886b6587b + + 78252d2d6f70595eb11aec0248aebde8 + + 9f49a7be0fba1c6dbe2a453c66aa74de + a9bdcc0914e05d4bcfa545c627a03242 + 4cd1e28ee4a8a63aa78f63a596074485 + e7f50b26307d7fbe9f67d6449f2d09f5 + 5859b6071fad89604191152e7d7b3102 + c893ab7058828dce04cc60316dd85978 + bb75a7fff97180f291b0a0a7f967c656 + 33d4a62159a1fe74534423a8338bd10e + 62e5610f309a4546c397580dc2c5f741 + bcb2a9f6c0263a9b7055b278898d2ab7 + 8502d99d4d2dca31d02338df389779db + 2f56565f3c26c91f2e6927c42a738430 + fd0d6561f8b14dbc9a72efa6a0644ea6 + ce20ce9b2c61fb9514f6064eb1febd5e + + + 7f6992ac25e4b7adb9512567a0344817 + 0b0f17c6223f8c539f8fed5540d2c8f6 + 4568324d5aead7003d48a202f9b1a399 + f4d5e9eb33e9027e67450f9709338584 + 90c34727d5531693383e6959f5759831 + 7f382493a35ab13fef4657f043d47a28 + 86fa4f951ae1ed08fb96e022708ecef5 + 1b00da9ca85b742dd7bc10f62f9f827b + 6b0b46884d67d00440729d39559133e5 + 6604c0cbc95c991f9bfeb2dcc6713039 + + + + + c47e446cd0900688a92cfd53ddddfbbb + b25c5eedca1967aaa32a9f8f34c089ba + caac8004345446ba32d8d31c5dc9fc31 + c278b78c72d12ec3f2dcc1d539943890 + 06fdd24fcbfbff607ee577c13a045588 + 6af55a2eeeb2bf6643588a54a197b1b0 + 22c571e5a88e8dfb32d081327476413b + + + 86c40c2158442fdf2947999acbd84535 + de8dbe386b6641fa57ba5f956cca56c6 + + + 6e4a1bb7b375a800bbb934bd033f55d4 + f1acd5a09d503caecf19cea906b93b08 + 193d5a15b78436c93b3dd6569775739c + + a56e73cdcc25637835b87cbfee484414 + + cdb7fc4c91dc88d662be6b33ea7cc34f + 05e7b44bd322f3171876bd077a0e3fa6 + 84177e38ea7a18dbb8a14e46fdcae085 + 351ba5679f07ca1deea3e93f30b53a0d + ee1d0b528e006f28085cab4cf2a3be96 + 468690e3011a4458db67a210925bba72 + 64972fb20c8c75cce5ce90086537892e + ccb719071f6ba194b45cd0171d2458ce + 56d20fec73cdd4bda84c1440b22c3a79 + 719b290ac25272add585d6ace45cc8a8 + + + 665117b53dc6ffcf8498dbb2d4809f40 + 238e16bf29c2ebc29b4817df2f0c21b2 + + + 78a268ac80b6897e1bacf1a461394577 + a37e70b1fdb2bef2c47cfc7b0ec86efc + + + + + 9e0c3e47aaad791c85bb053e181ad060 + + + 1b95144eb36495a72ade879d4a3bf267 + ba8758f165e2b8631726c040e4cd5e2a + 4ef8df8ce6e016236140fca0cdae70ba + a719a6b6993479d048cfe117ba4425c0 + 8a505016108247104c2c6a31d11d815b + c9319005e33469192e74d94a44c003ce + dfbb4e6482324b09c67fcd3d00f713b0 + c761b547b90c09a3bb6b2a5080dd4322 + 6cd24750f2095a9e0016f5cdbfcc04d7 + + c1298bbb2aeaf0e66de5cf67eabf27d1 + + + 667c3ae796059bfcf5f070ba3bd43658 + + b29e35f6ae049d63022256f18d4df8f4 + + ec4e565b3c979024cda76a5e3b1f4090 + 273e91ba81d5941589b3b6d24d8954af + + + 80e283f990bdda24ea9fecea079e9925 + b35f5ad820c1855d4b69277bd4de0ef1 + 11fc9dad645e3954893e447b189d3819 + ccdacd458423b5f1c2c6106c76224ef6 + 57c092836c9184385977fd5449a38199 + fa98268ecde41d63b429ad4d5986b172 + f1d09ed170751abff904867333e6c9fb + 5fd1ff5270cacc83b16b243a300d6434 + + e293bea4da7921275bca2f908267a959 + 3b79bbbaf882e08f0163818d5fb1cd56 + 6aef97f569256f0deb686979e359af24 + 7e28595616a2e1da2e8384d4bfdb4629 + fa11758559d70b20c1f228e3a1dc7177 + 5e63d549934d350d9bb169b9509c5f29 + 9741155d412df3310a90283d70604bd2 + 19b94add32696271cb0b8fcb2db118fd + ad0499912e0aa8466b2de3a37a1cc595 + ee00b0b2d2846de8ecf3dc0fe7cdedb1 + 4b8087bb6cab5b17c85e2ac2eb8345e7 + a902dc6d266ee0530c212e822c05e323 + 718c2d74752a1fa76658869556c77b66 + 77a49dbefb8d600bd4e711517a88445c + c88e72798edd6de69a8bf9a66403b9a9 + 166584ebda55aaf59bfe395a5e612232 + 179f9ff039a4a2486f431b0467c41411 + a342fb4bc12747e6194a6ba5a0c4443a + 28a2756e660f1611934fe1dd8d29154a + e47e900a54f7d4e942553e909403e929 + 3f60dd9102e80254d3a1f19fad4f9ab9 + 0a141bcec2fa183cf4a18b0eb7d83a43 + fc5201ad418decd289dfb3cfee7dd9f9 + 6c8e4f890eda6f4b64d955e30d3ea07f + 7e6983e62224540af76f64a3ea875d84 + 9fdc00dbe1c8d4b0ccdaa2a98630409b + dd271bc469b75c203524c5bee53d9f4b + ac873d0f3d60ebd2c4baeb7955501789 + 5811b2e2287d4a6c12ebd4c3472a0c65 + 4b5975e4a6876c459dc7eb0431fd5f4d + f9a65221bee51b19e903d9455c403f41 + 7659b707c6df200f23118c63f0df8534 + 286b86c75d492f7f100797c1f495ed53 + 98b73e4855db85a3db4aa4e018779922 + 5bbe9889f8a18ae666f8a4fd461f2cb2 + e2d19fa39358adc2bd42e76aeea04a16 + 959e8d5fbab17205f7d3e5e0cdc6be33 + 0360e8bb392e4125bf7360838266042c + e37c0fd32b92b3458f3f437c75ca4631 + cee17c9415fd5cd06e3f6fb30c9d7a9d + fa9f59ab6714435158926192444e6946 + 897e717e0f0b236a4e374a47db3a4052 + aec274c1cc600b7298a1cf4b2ba3a31c + b6d9b64041d80625c1e104a189602ff9 + 8152705d628a96611b864664a82f96d0 + 9607ed48fab26b74729bd7141f4ada66 + 7a1023796d47834c21b502bab997da27 + 3dfeddc7e2cbb15a8e6bc72e8e44e5cc + e15ac66ce0c5a69837974fe1047cd9d5 + 1f17efdf7df7846decb91ca78e001569 + f53d258902c704a9a51fc93ac4647f9b + f3846c217ea52c46487f601be7c3f840 + 0ab0bdc42ab85eec4964fe2d1d4e58be + 517d39a4bf54bfd3644e51829d38a190 + 4cabd2063bdc423ab3288acefcab0dfb + 7333529d911a219a261ce3ec82ffea30 + 3968f8992e32141f13242ace14b46177 + fb5f33512171365103cf309866f4130c + 4659bea606c82420f61f531c4284e539 + 5e43f21ae6772657ccf838cfe0902d92 + d54c6356bceec34a878b84078123e3f2 + ba0fe24c06aa9bf398667d72990b9d8d + 52a8883a5e286863cd998a910d9873a6 + 95a6e12c31d0dc54cbba43e7b0af2c13 + f9831a2a587a16eac01c575dd42a7255 + + + 388f1d6bb29f3bca3aaa2342f83b831f + + + d74c0a6271fe074aab01e43d8c5b3786 + + 5ec07286b8a1a8c9ffed7bc0cb85c820 + 9ecf84536a338e26996cbe9beae5361e + 3872947d9356adcf8007f0242f14050e + 295ddcabea1f6b819d3c88fe72e2a6d9 + 715c121e8f48a5f4978507980d98b2ca + d5d71d3788bb7f52134327adfaf9e50a + 554ccf8ac50948771699aa38e7321a4e + 7bd7fcf4bb66003e1596b08d73e23984 + be880ac395d9254d58b38a31fe62eb1a + + 56224a13ac79eaa6010e612184333b09 + 4be1895da6f030588c8a0bbcfb10e7b5 + 338457fb46cf95153a31e9aefcdf89a9 + a3f6f33dcf4152ff40f614f62079e158 + b0947bc590af545286b42451f7febd73 + 17f1ee3bd1bd85b18a115ff794d40a4a + b454e809e5bd520518710eba0e9e7679 + 8e0149fbbeaf3c4b1a4d21bd848b67fb + f710f322c57c30eaebd5d1942a53cbf1 + d76eb9b57d756aa3a51cc85a93223b58 + b5f75877d7b7e4db090a31397a09a435 + 85fd92ff3d0bd8c3ef776dbea9313b57 + 857918e128c67e2ffb330fc969214f7b + + + 36a566a8dc661a4f7209f45c73047dcd + + 4c0b897e25ab9567699c9eaa6a551980 + 530a2c2ddacd54eda637a8f1340236f4 + 92e58aaa27879dda34ee37aa849a9c87 + 6b1eee2d7039da501cc8431d1a6943a2 + cd335b864b1f125d99267eae89fd9045 + dd30191961a92df092c4dc5ce9844dcc + + + 856845518d057e87d38c23b81ec88f79 + ec431cd9ce5906b8d65e7cc02bcbf3e4 + 12f4a5d51eb062ad82f16356b6060d0c + 92d7318a4d38a0eeca0f032f843189e0 + ffec1c7065a4ec743dbefcbcdacf513b + 9778c12670a59275de3c315dc8c04b6f + 2a44f61f4b4e4aa436c0f934d5f3a4f1 + + + e4c4f627711b42f2aa1b32abd3e58e26 + 2c012ee8333f0c45348aee9f428066cc + 14c97501b0b68aadd9ed359fd58bbd32 + 6d71dc21e0bf11de9435ca54f85bbd64 + f1dd7756d5f3f06eeb78e107a87182d9 + d3444b4d77a6e6250e6f496442770209 + c6fa6404cf01b5956980a38cb882a255 + + + 77018094d81151349d9e2181800d3869 + a05649f44f6bee7e8f2d14a33ea6153c + e4efb4dded32e77c6c4ef514b34c0cb8 + 6718c7110faf2de5a1185c6e91b5cfe8 + + 08b49076dfc0300696a8c07aac24e54b + 0a84ea60f3212b48215a4dc0f84ac38c + bbaf3f5961513230d3196bda3da4cc54 + 7496ba43eb20682a00069973ffa6340c + fd366a4e236af8fc941b49a690c8bfd8 + 77fbefaacbd2a9bdc600bf1877ed7d99 + 25e494436d0281a08b9edc960768889f + 4e01c756f76a2675e67bcab673dd96d5 + 28a1e52807b16e7aaaece837d061a0e4 + ef37f29bdc1d951351240e1996badb62 + 58c56f053a2f909a5002e53c61b17758 + 1d11f9b271e13c8f3555ad92120dd01a + 90131a724fef7faaad0694263734a0a4 + caadf0076ccaada900fbd199eef61355 + 107db4f9543a587758a8bc06ba18e0ba + 648b713cb6b1b0557e4574176b7d7ee6 + a0b78486fb105f233250db4e4335a9c5 + 1ba3acd4602c9b82f38fe985f6dfcf11 + 5fc479ae084d7659407195741fb66d37 + cd319cb2e2d12e52f2d38134a080f617 + 95a4534639d3846f0962d753848c2477 + 5b202acf53f59015a65473a7c111e05a + 7e4b6c6448db36b69dfdb4a94771a17e + dd06687f74eb2d37457b4986ec87a93f + 164ff754f7faec1c3901262a86f209cd + 6bb99bdd7460cead561af31be502bb01 + 4180a37646b85c321a696a77222f764c + 3aab837a7033b942ee76d4321c1ff0f5 + 7c47c1f76d072cf3dfb6d09b2a207d5e + a7ba5bd7a40956d52eac2c931a8c5f43 + be158932c47b4e0052092f45d2a81f4d + 4b9b8b494c38eb7e98edb4ac2785ebc1 + b2d6a00a261cb533773c656f6dacdaea + 1090e9c910f39570ee260719d34acbae + 4b7323fca8ce5b918f64762532fb331b + 7afcddeba47bb670407589368105bbf2 + 87425f667e54d17d3312a9c11df5be24 + 94450db9f106bda8f43df3265d43a46e + + 09ebd1a9e2daedaac979c8e238ab1c0f + + 526b455b78ba1db611c7713668c499c5 + + + + + 31d71a7a4b95a8fa21138b3b9ab1fd8b + + + + + 3f3f0f9e5010ca8e75c9dd8a1ec208e7 + + c85dc4167b763cf6e2979a7d24886182 + d318e1c5fad274b52cc1eb422e96d988 + df99752ccbf8ead024526828cb77b991 + 11255e4c07f09b723163364107c586a0 + 9e9efd1affcca8ef0b15df7c65fcae73 + + + ef8a29b0842d8a4753de4bd85766abe8 + a3ef557d45ad0cb8e5b3ad74cbc25784 + af16b14581f05ec7c9cc486aea12e6f3 + + 14e066a423a14eb10e9995b2bd23e2f7 + c3401982cebdd8fe7628dd7f3cb0ed5d + 5b1216e53c3f448a725a14777180ceae + 1fbae2c7dcc70279d3626a49af17c0fe + + 29dcc6a1a7e7e59c587dbd0333bd415c + + + 07d66c6ba479b2cec849e4c3708e7b60 + 406b53a416d51c3a7cf018e900439b7b + c4f0d5a9713d3b95cecb50dec1272ebe + 66379aef01893c34e8224b3b717d28ac + 7827396417d258d0906372a42c532d71 + + + 0f1fbe23c4a5f8f7a1c08865a2160f15 + 1e18394675651501194ed8baaeab0477 + 147c75af9de0cabb3c693cac736cbbc3 + + + 5b57fb27f9d515be10bf5a2c9993661b + a40a020322e80f7e54467eee8303a0a8 + 5155c98f7c7eb67ef20d45e70fa63e29 + d1b7128d92d0afb8e4c38a2a0e7a3b71 + db90e89cdcf4a05525dff4c382a1526f + 0f52f24c4d1165a1387dbeca07e006b2 + + + + + 4e94895dc558d7d3f9be0ffac52de03d + 09e290de10837baa811f60d7bd4e88c7 + d009357eca1eb5685fc9f96e011c25a4 + 9706f2d050775a0f08e980137f272b6d + a77c8f97673454070ed1549cc4ee3e2a + d0c57f0e4bf9f828ca91d8ec3a7704c3 + d1da5affac10ae883faa7eb0fb2f57aa + 54fdffd6e665b63da47e6237826ad29e + 71cc42ff2babaabc18072de80a4ccffd + ef9d7d8bb100253abcdee1169f847a46 + 8c20b5a2d114c0b0603d1639607e9167 + 68bd7c616c653d7a29e095c5fe264291 + 452f9df2d2d78bd5ff0b41684b5e752d + 7b331d4318ba3332f4aa741cfc601209 + 3bd7f52ca2466ae174de61d9a3a4ad3f + eb377a6c0fd4243192d5647b5f693bde + 532d27acbdfb544c503b34b9ad0c667e + 39cefbf4e396fffe4eb70270428c7c2d + 79cd3f0a4526140d094ad82410f569e1 + 8ee1f8b36e023f4820e5c0c190fa810d + 6798d191810b4067ee74c7f70263f9a3 + 8edaf813d9f1f8e319fc36424c2577c9 + 97595ef59111a00a21afb8de06967b91 + db55ab8d7b29182284f5fb9c9230e99b + dcd4dec2094a6f17a08f21138c2ba7bc + + + + 03936911854f87fbe1cfe288bab6d9e4 + 9d5784e1f5ac5e1810c90161dae59d53 + a328ab2ee17f2353e351b7b89be9ac49 + + + + 268cc70d5c69a4245edc1c0874c247b9 + + 20f02f3cd9ec14e36ef2b90064cc8bda + + ba78d1e3b6021fc051588abd1fe5e2f0 + + + 88f3864734d5bfba8d216112c318e649 + + + ab0fd039cebf7577927a35a331fd4e0b + b8fdaf68504819688059325c37dfc56c + + 5be425aaf17470c73526d9cf2c0bc3da + 9973c652dfd49cedab4dfdda8d298d99 + 5fd2322f6d2521223e1c3bba0230457e + fe11175f08167beae48abe1d3ffdc4e4 + + + + + e4f67d5d52073f08d0eba10d5d87b76e + e4956044222cd8794d83b06ddeafffc0 + 84b5458f193ec519f007d3754e2fc770 + ef3302613d9946bc199937d692a75e3a + + + + 4d44a8667bea6473498551e44e224f95 + + 29f7f3688037ea8670bc33a2242bc692 + + 5269f400bfb1f8740d55f524d2c51a0a + + + 890483a812a44b83aec550f0b864c206 + d9c9f8016e6f5c126454f9ad424dbdd9 + 1aeba4cd8fe1512b09b522c9de5a3f57 + 796afa478cd2d8e914c382a0c978172d + 69d692aaee40a215a13317e1995e2509 + + e3ed8f1be1dea67d14fb28d4a88d0528 + b17576171bc95d76a83bfc491fe8109f + + + + d0d4231702906e65e98be4b9ad82b942 + f75b6e70eac6a1d00cf52c9c9b77d0fa + 171bbf06944413a2345603ceb857e4bc + + a474512f2b8aabe05ca984660164f90d + + + + 9534b39995bf839b3e5e80c9fe4eea72 + 5ba41df009758b7c8f38169fd28b5288 + ac1868af98b9370516d0a78ef11d0350 + + 3e4bcc4405e31dc979c01c04792b4c3d + 4d30907e17bf717426fe98a7ae8c45b4 + dd9e488f553efd7d4f43f01e425f21e7 + + + 81c8cb6bd1993413b65a642b4b3b92ce + + + + 5f346b8c7938d38048749aa2ecdee1d9 + 4b3dd2ae4e6654d314007559a1e0fe62 + + 633702a13d35ceadb7e11146e2528626 + + + 6a31dc7e387353522b7a12aac7479a1a + + + + cf1c31bd0503e63f6410e593c61f7d70 + + 9748cf585168aed045ffcd5d7e311c16 + e0d1342136467759b3de4d3d46977eea + 08380ef01a2120af332ed74a419aae26 + + + + 211c1bd7b1e4fb8a11d4d4f57e9d2a26 + 3e683dd4738a1f22e583978ba54a93bd + 72a304f068f1fb23f8e02df2c703a231 + + e7252c0a6ce4c8f1a9917a06dafd027b + bfd23be77e578a7e12a207e3f8207e8e + 06ab42004656108aea1ded919fba73d5 + bca50da127246f712668510d2b936667 + + + + 2afa92cf4964aeb3914411f0027d1dee + + b6080ae45f63ef742c06f80d0445b18e + 88ccaa1b520e548df237af2fc98f35c6 + 5d0c86b21a5d303573c3cdee40276192 + b6080ae45f63ef742c06f80d0445b18e + + 2d2845664c8d2ee74cba71f9a2d43a38 + f60224810c553c3cf2a66b825b62ec78 + 50097640c1fb724ca0e50d269fbf231b + + + + 273b436cf2751c8c92dc1a6a293712cf + dbab2f381a8c06e211c253abe1f3f967 + ce6f725fe4361e4ac363151037e5c4a1 + bcf838478bd330f3b00c677ff84641fa + cc3d31af063bfd2d77bf9439b198f3e2 + + + + + 4f0004ff5310f14b7ec6eee725a72179 + + a156d57feaefd7807fadd58affa88b71 + 3cb4c8fca4ce09c812b869842f9dab0d + a156d57feaefd7807fadd58affa88b71 + + + + + + 3872a5ef99ea4f8e79411e8b272d2aa3 + 7d51035fb8e13c4bd26c7fe42e882888 + e27c0d60fe2cacd839f4da4cd770688b + 7beb89131a6d92695be51a6d94f3f859 + a0e92d599a3ef66fdce158a5c6b4a123 + 100b55d02dd57dd564ad05f43e871492 + 9f2e732b8f325e59b5fec22fb04646a0 + 133fdd29d1f3c2a1119a2bfced7521f3 + bbba8bbff0fa67102a7ad4c26665c1d4 + + d7ee8e9d646c45020019a56f69d735ee + 7624c76fbc4017b49f33246260f16ac1 + ebb68401cbf8c98193c3d406ebf0e892 + + + b00975714c54729438850296aac05625 + + + a8a96c727109f7685f4cf1722fcdbd70 + 9973c46d960058616f3d893f5fc29de5 + + 5e78c730f5ff8fdc53c1398e7670c640 + + + + 950b924fb07b31032813fb7755e0e6f0 + + ab3bc80e0e59b2a88bc660ee8a7ade2a + 97c0e9fab32c414cbea4b73caf635271 + + + + 9d0cb8c9b0a3107a20c76f9a903b314e + + 9e0bebd394773de40813c49ceda1fa48 + e4b9bc3944a3caa2ac2d24397a765341 + ef461171aa2cdac3e60f502678930a18 + + 8f27d10fc16c906b2cc085a5c84f407d + 0aa072511ec1cc861ec1a4e61bc4e2f5 + 9e79deecb5e9156a866455e842a1ab59 + + + + 86ff1392fa2d871c14b76bcc01f7ff90 + fd8fce12b658b15358ceb60797582bb9 + + + 82e6e08d5edde573e15a4b993c3e9693 + 9e6ed22ce5e52b54ad915bdf81e9a087 + 054388fefc32c37b053a6647b31e8cec + c188023dc42661a4f867a9d7d5a92528 + + + + 7bbd4911843c3348928a1ae7d3cf543f + + + 53936e9563d9841363ac0824a5b80c0c + 10a9b36bf5fdca2ea1d40121461c16aa + 98fc55d8619e2071a1987a5ec713406c + 759883ff10a8f3bccdaa285ea9bf5484 + cef8635e07f38a3477b5c45a4c316b4f + 2a4b71469abadff850af465cbc901dca + + 6c61c1284b70e852f6f7a27f85dc1b48 + cf8edccbf201314d320cf0a2d5b8cb6a + c5038a357ef25f1e7004883a34c4aaa4 + a125acae3037d9e15c2b1c120d8a0364 + e426418ada722ce2301213e0099ab61a + + + + c4fd804797b82765e7bcedf0d9ed7c02 + 63f5e74a75c5a571de27f5b6d0c1500f + 2d4541847467f8945f92ddabe9d5d895 + ffa1291d663b82a78c1873cc2c434293 + e22d64348e558ebf9b5df8c89a1b7668 + + 5221703f35822d78c428e4fed08b38ae + eb0724a385a04d5f15681e0a388cc8c8 + + + + + b237f51dca881361f9f3b8d24588ef19 + 796055ab3ae0f7dc9d085ba8fceb0e11 + f1a70d619d7ae783d85d5897a5139371 + 465ce5f324da11ee2bd3c541593f19bf + + 833b3db0b1b9e0042d98a4e81ee2ede4 + eafc9844b80b18aa65092f5026058067 + 38087877c18c508dc04571ba1eb29c25 + ec759c6616c22605be655a5cd0744659 + 29476ae4e1bf63f2e15aea3fe166190d + 05080ceaa3a1944844490b87b1de84a3 + + e23b3045948e5f99d701d58ffd8bc502 + 36fb831560ebfa3188a424245ea1710d + f242f7a2c19b2b885e73942290b3bfda + + + 4a2e73de7cfa4447c075bc4ff4c81dfb + + + + + + e2a77adc10f7a0ec2b1d7e57f55826ac + c5b890259f9fc0159b57ffa164e4638b + + 82cc9b3c6a0ac09f952a5e755187edeb + 53f8733630069252d56e9a7225c13a03 + 524cf456ae0f24a16e1c21239cd26cdd + + + + c943410d43f56da398a87439b3b74e57 + 50f908d286d51d4f9f565fc0e73a1d6c + 606d8244e0c901a30cc047db60ac8efd + + d03cb691e6f65b5a155db72c042d6d84 + + + + 69d02b35bdc554d0e556df5afbeb0de0 + + 66a9eece97e441281ba2c3b011f6f308 + 5fbfd842968ed784bfcd2ba37a4e9697 + 65f5974782002619eab00f48526c4f3c + + + + 8d6d58e2a428af80ca86d9f59fb0a8c3 + 8662a3006d36017b26aae26db6579e21 + 0a6f749369f1395c76d777875bc0e8ce + a4d73acda0d1902b632c95abdb75bee5 + + 4b20ec9428e62b2efe4f8022a5ba0baa + + + + dee7344c6e0c54e508340493d144b6f7 + 8bd60d41e17bca1a6cf3d4094be2c892 + + c1b6a88ded9444918f9555bf048daa2c + 2856362716b4df7b020b61920765c0d8 + 2ca38c7acdcf61836e34a724a67c5fcd + + + 1d30c0cd122133d75362b23c1d0a359e + + + + 14b45de9d8a8ff756c648608eff86041 + d965374cf76aaed92783a551561ec637 + 586de8031b828d9d0de704e21951154e + 0c2b6bf99bc66206c3a2d5d63e6da1b9 + + 771f96cd7147f4017340d0a905a00dcc + + + + d0cd961e49c27c93db3e9fcfac9414dc + + be72aa73b5833ef82af0fe0b0ee88b24 + 6087c936b848103601d4ff4e4b6d9461 + 0b4b5f9af49dbf44ec7983c05aa853ca + + + + 4a2e73de7cfa4447c075bc4ff4c81dfb + + + + + 4c979544fce8772c80a7cf6235d09cb6 + + f3155f000df5ddf5c73af4bd9337d6f3 + + + + 2a155f1aca0f4ae484396befc239810e + + 56cbe6de8830bd37ee24296e8e2b26f1 + + + + + + 191050642734512df8cada9745c87f20 + c0d14f603464f03457275475895d11c1 + + 567f12040a07d168b8f7ac9b2729048b + + + + ade5fbf1e2f641ec685efd13920856fb + c6d6b52e0f2c04184afb21c81b1521d8 + + 28104176e0dba6af027b854f6d21fd5e + + + + + 86362dce012cf3880b0fd8ecd064e926 + + 2eb300a27f334ac6c1d79f21970c79d4 + c0a295297c41d56745c3e59137095a58 + 35a73b2bc0039621155f6e401098e289 + 73670ec1f5fad8917fddcb71aff55a1f + de7620a3b06e6d5de54940f4b6e4333c + 678bd6772391a740862a777e22c58277 + 223f8dddd15275e220a73abebcac1044 + f3b5c766257bac2da3427d003d7135de + 916e5e700cab697431e6cfd9e8c9c355 + 578870e7e10a8b440a0da15e13a32884 + 79913b41d4eca3a6931397e0fe8dc100 + 5112934bfe8d2fb949ef5f891deea76f + 002b33d8b3b8e9147bf5b5f823f5ca78 + 36a75fc8cada70d21c67a723f2ffa266 + 80afa7c04d464411e387cef421370a39 + 26d6a2e10a58d118c64e6a6dcb79f689 + fd23fd73bc4d846cc3bc60f79fee70c1 + 9a1c0cfcb0c44ad73be64879a54988fb + d3b8c70704f86fd13ac148106d9fa014 + adde1437e8225ee5978fe72427e4cc0c + 0afdb90af39577150ca9a8d3b5bbf553 + f83b9703355b059aed4e84c626fa5436 + 6b64ed2ff5d0172bf7f4a5d00c4e6680 + 6a5c3e3c165b71cc65796e33ffc9d86a + 73797eca76ffa448d6fb6ed731fc01b1 + 3bc28b236127bbd00688c0b77aac7f59 + 433ab906f2770e2b6b3ae651b807f12e + c6b1c5ba039d9de4058587cbb40e488e + 0b0b303a8d69e7fe26d52d56a7a8833d + 594b6e25d91ecad0d58e9f3790e259e6 + 9c99c9a05d8ce136f2f7ccc093822f78 + c4e6bc75830ba861f5026af3a7ce07ec + cf24804798d26d6c4584039157a6603b + + f3901024683317335f764219d078b5a8 + da782a418a92f26d6304232e44072b8f + 67fa71d82f0ecb77b3f11106094fb8e4 + cdc3a1630d5843858d8242f08e5df9f5 + dcbf4b721a14047f22aa701bfa83d199 + b39acbf5fc72ed1b1aaf270962ba0bc2 + + + f6328e5633260c3f69f5f562c86a8079 + 6fbfe673cb3d07facdd3481cb4023b3f + + + + + fc41ea182ab6d1b652dda733cc79189f + ed0eefa372a9b7cbdcb915d35e1aeab1 + + + 4b0f02723e1f9136a19d429946824d0f + c423061e2b75b5b5ea1fa2eaf82509c0 + + + d262923ca9e2ead7bfbdedaff3961b98 + c45cfcc7743e046628bfe44312a3bb4a + 31ab57d17fe2aa5016ff037b880b9149 + + c9b5baf0e0677105903bccd33b629095 + b4ca1b9df61c733caeb40db3995f802b + + + + c735750274931227bcd82d78f4d68ae4 + 54cd49598095a3d5325aa18a33034da0 + e80cf34e7ad5e7fed3c497ec47d033f5 + + + 02ccbac1519b58272467a698a66dd3c4 + abe6c7c892fab5342f4af22ffa8239c5 + a1cca17c38bcd01a78c8755e981397ef + 0891ac86f43eb0fad7da33650067a6c2 + f9f907d933ef140f9509fb17a28df5df + 4436283a2b39ebb818e1d557e8d09d4d + d6dd2d87e20ea25ed489866dca39d039 + dd47381b0e8d76f6e48a2f9a60116aa5 + 683b01ff53616f2baa3b6a43e3c79fc2 + 5a83fa88403e5623af5a443397ef3063 + d2f62777f46522d9421217920fdaab16 + 31cec7fc2a1f7edabc8922656e465f30 + 8ef208271867e9dddf8802abec5e6794 + 1271d93478b3c7758208be818e3fcf86 + 322d2f5854a0013cb7f82b3f59d0f8aa + e597a62e9ee54a639c1379aa80fbd45f + + + d39db493c983dd8efff68fac4fbe886a + 3f9acd9946e2ce4f28d16161fabaf2ac + e610402df87bd4fb77add471144ec24b + c1733b5d66c90c6815c11ac681e8e090 + bc2987e7f55577c716dba8125c7c2baf + + 9fd892926ba198b36ce0be029b29c0f8 + 3e322d508e0d5a50f164b1470fa84e14 + + + 6f3a8f9643c5de531f4dd5a6e2344a4e + + + + b7bac5d60e3bd11658b47a3d09d84899 + + + 2e36a896da5683a0b7434f859f420f2d + + + + + 490d34459d9e5e329bf0ee94f06b10e0 + 0b6a2b771fb61db642504bffb42e0ea3 + + 1d48ea057023d57ef9d39cfee87bd9b4 + 1414a10a53ed9e6f7ed059296ef67162 + 3730b82b9c3d347edbba79e3d8bd3dff + 1d48ea057023d57ef9d39cfee87bd9b4 + + + + + fb9d9524eb3a9bc324b2cd718df8f614 + + c2fc60f67cef5c78c27f3be6ed54cc2a + df4151cb85bf361464b8993f745684a9 + 223ed76b3ed4cab570e5a0b26e3948a3 + + + b09079d2c9bdf10f4c003e159dc6905e + + + + 466f346a3a925f8e8dc18330192bbcaa + + f513a4d4bcd26c99dfdd4efaa44597b6 + + + 6acc84b23a32e180107309fa9ebe4a33 + + + + c9c389b491d9d23b470e17ce6f9780b3 + + 28269daa1396478dce1f0de6e96fe549 + 90484acef4e7e9624878a9cd0342d418 + b5b5b40ff4c141f3f08f0110e0077c45 + + + + 47c88944d96dd813dfb1c94aff8a1217 + 71e6095bd3220f2e06cb6659a5a0b128 + 17377a944525dd37dc6472446e615025 + 9fa9dd513bbd842d3c0b2b0a247ef963 + a40ffb040d0bf194de5e43bdd2ebe5f1 + 31daffa0a650881d26599089c39640d4 + 91b6d8277d7afaf4703f66a53bf54af7 + 18c1e82a96ccca1bc490e07167d5df93 + f7ba80551ab08ae7689c7a92abf829c6 + 120bd88f4f5befbcf494d7ff85cfe053 + + 8b323ee7169fa0550f680d8e0f5e1b4e + 05996167e9b79657a7642f2c4b36aeab + a9bdd3501c15dc7367212c17f3a5e812 + 3d22908004834ee36c1fd2a51b2614f5 + c77a77c1a2e4d432b7255de4db836a19 + + + + f1bbaf1957c2b8999974c104178ccdbd + 731c7a51378896600c454239e6021e5c + e04e539b44932d71a8d8e8b1d2057a9b + + 544e7cb8e8d47304244342571b66c388 + a0c54f13b50cd93ded3990abdb2da8bb + + + + baff37de05d8f4c64bfd1bd877b00e18 + + eba60f6ebeee59caefc94bf5c867575b + be14b45bc491c4f075a3830363591f19 + + + f03020391973b9bd890480086295403a + + + c7a48104f9f8a15d25d2dbfe214f396a + + 4d6d88c3edee02198eb00c46d3b27617 + 4d6d88c3edee02198eb00c46d3b27617 + + 815ed309478e266b20dfdd36adbf9616 + 072f2ebe154ffcb5776f96c9763cf1a1 + 4a734d8b019e61d46d745e56d73a94b1 + 7b2f30aacb51831548d7b55f8bd3569c + + + + 385c055bbba613a4934ea7c057290c2e + + ea69e2860f4204e1045a0e2fcb112bb9 + + + + 21f44a11e9d85e461d9828d338464942 + f1b3496c9fe27d5e4226d92d663b3679 + 0ecb7ed86d4f21afc709ccf7bff1ca53 + 36d0ade98f0d10b5702cdfd248ee1c40 + 5536a16e65964f6f92f8dbf2aa2deb9e + 5d8c786101edb7f40ef8f70c3b10e5a9 + 165317170af8a59d42f70c44b755cce5 + + + 5f6f8469589509f2f0889d7a445888a1 + be6887540ca0fe30475d0bfae0080038 + 252212387f49183f57e6485f8e8c83a6 + b4439b1cd53f4680b43601a6149399b0 + 51f9944fa53fcea1ee0d4247ad00b18a + d4b935b8ae4abeab09b0b269de034377 + 7974a5d743e8543587a7c366e1f9407e + b206c14fb0e357ff4fd71913a6d6017e + ff911fc821a3cb1dd7225eac5f4ba6ba + + + ce035c441fd269691f4c2bcfe89a65ed + 79e1b7d5f79d0a6d9e2f1c29c4d02850 + b4d9655ade7f6b862998671617a82836 + 3161c09adc25e61a081f0cfe1117c140 + 25ea624ae08a9e840a086619f4d1c194 + 1d61d5f9a66c26be6efa1666277a0dd1 + 8086d40c0b30a03a123ebb6f7137eeeb + 0d282c63e337fc9acd3f422e50b9122b + + 09051aa8b76c4d172ea31b471d2c1738 + + f07a99c725051f25c38852889ec2f33b + 8d767a2765576ce534975ff202e06762 + 8972dbeba8361b4be1ab506853cf6516 + e26907d00103c1d2162194efc7616f3e + 1dc42c9f95e1b21571eceb2edcbefe20 + + 305d7aa918350b0c04461e2b76c07064 + + + + 86454928eb42789e2f7ee6d3de5a5e92 + + 9006a2ecae82f6fb92331e3abfe1dcc4 + + + d0fd112f37db1aed209bef9fb2686f98 + e9f1972dccd51128e876a66a512c9f51 + 85df46291929690623741dc2655ba668 + 4a734d8b019e61d46d745e56d73a94b1 + 769c4143445921d9fc5fb01d9002ceb3 + + + + + 99f016d2f72a66f72cbd1c1d18215fe3 + + e6ae64b12354b56c8e6e977c0067981d + + + 733a3ed39e1b2c169262bb66da9a54db + d57914b165e930f2a13a71e81a98f866 + bf6c8f7e853ba87f14b868ae6e7cbebc + bd2342b0f0247492ae5d8fa5163f1f60 + f2336c3ba11ce3ada66994ec3d6fece8 + 9b754c439a7c226a9eed9bd2ebd2bc84 + 7690b41a24c92c3bbd9b1d71384706fd + f02d64bca7936545db027f28628a6c03 + d21a5d6b50ef1cc5a77c6afbc0cc0baf + 67be363e08539ec249e49453851b43a2 + de262db9b09a9c7820abb2280d41fd64 + b9d501e8a3eac860b1c5c12d8893d2e5 + + b8dc89a0738163c0fa1a584d73dd697d + fd0e85d44351eedd1198660b6634ce26 + e5a7b2eef98ebfd82ddf2fba26ba6063 + + 0210c411d55476c5b31d2af32fc8badc + 1f33fb5194c158e1d75e7ecb32b14d35 + f9b147bcdd81e51b1370107e110bb7dd + 634ce6406ff997e2d9c7abb0e24a2c6c + 31a80f0d5855c6cc7e4917c3e0f9bd19 + + + + c704b1d6cbe9bbc05aaf95abfb43ec21 + + ed81c023ef752e5619003ee2ec2e8e65 + 7f35a8b22b27e86499c06273d0e23a1b + c6f423f0df590a63492b20a38057b421 + 6dd7fcdeecd76244131e6ea3c6937b19 + f7a6370adf4d9ae295c2845529557787 + 761a2221d46abd367b94ef62c3f56352 + + + + + 26f04644419f7129dbb3488f5474af2b + + 06425a243e767459cf8ebb3a4a9f4d14 + + + + 8397ced28326104a115def9b7eae3ae9 + + 36de96c7882ccfdb07c62e4209582d58 + 2400eb50b2a0b6c200e48feb45807e6f + 072f8e9e41e9347e9fd7e8d0b6ed51f0 + + + + + + + ff7e2fae9edea84710d8839e807aabbd + 335feb8c17304da771f848f1aac6cc4d + 7c28116169e119b5533cb74473a62ce8 + + + efa42ee1783933e3bb661e05ed9109e2 + + + + 3dcc96e2f98ff85c009ae03a482e3321 + fe22b90ef74a74ff40ae519ff8f9961c + + 2abe66eadae39daba717ef5c85be5285 + + + 6a05d296924334a6581a4a23df300ced + + + + 8e22511320a9d2b95478477ae87d0120 + 3ca11fdc9ad1765188b644a6b5178ecf + e694e8d55ff9e04144c89ff4f1f20483 + + 8bf4e4bde109db61568704e46d839719 + + + + + bee4e0451df2cf5efe095d6b3e338694 + + 9be5f0e240d5eaff9f2dadf77182d1d4 + b3c884745e3401178ef88deae98437bd + eaeb1f8894b2f29aad09dbb85b21a956 + 62448b45ec75aa9b79f146aa8b5ef727 + 03936911854f87fbe1cfe288bab6d9e4 + 22f25f17431d92299802c6f2b2198f3b + f94887d264a2ddb463b9b5dba631af2e + + 5333d247252086d39d35d5390d213ae7 + 65a3e290f941e060bfa4df19fd457809 + 44118050698530c4d661e3f01973c09d + 7c12760e4e4c521129c73d015f0d0aff + 3a0d921a7d31d822058f03694237744c + 8a45b52f85e6535d4e2cc6704fe4c350 + 4bda18a93731f7989b68635eb2a66381 + 825e1965c43af87ec05f4d0874b4fe1b + 34fbc819a1976dc7414cfe484248925e + 4ca5e1760d32a56e0b13ee78c9ad5cfd + 5aeefa36340a4f5777e4a982ba37f281 + c53d930e0401098cf9a905a1d71df46c + 006ec49eda064d0a8192b44fbcc37c40 + 72aa62d90a3d6f4e58f20f3d48b80390 + c14f0b9cb2e15ef4a226c1f69238abd8 + 20905445cf4c4e98cc386f4d51356e73 + 534b140233726bd432bb574b865db928 + 38e2923426e2333de83874d00cfc590e + 99d7654971535738c1ae1c71a6c36986 + a3e4a4457ba233abe5ce6d2e917f2541 + b20604dab09ae382f9140d48e3eb32ba + 686c8208df74bdff226da4bd94db828e + 0b537861e83af69c1baefb819bf083c2 + 9899130019702e7508faf2d64b38fb5d + 00b6ec5d0d08418c938c5576b8c4f87a + + fe868bd5be8667f7a0e0595072291feb + + 707d2aaaa2eb58d5af3255a0b6e24d21 + 10a0583b85aad0cb5e96d22193378f99 + d8d9e2898aaaf8998a69c5fedc6d76d0 + b76f65c680c953cace714ff8b13b5951 + f62371be77c6d4e213fd82ed2a77f391 + 60e7b5fad68b5050ef5bf3b62e1a5a33 + + + b56872374b95a1b9c02c8a53e9849f5f + 44b13661d14db76a35d6f5db39885f8d + e9590f69fa68dd4021ad14dffbd2acb3 + 3247b002022059ab85cae3d79ace9ffc + + + + aee860db75631b2c5053e09cae51e7cc + + + + 1d5667ef8102c5b361c0c7acc26a4875 + + + 01fef419a7d1af5a645027f446bab105 + + + efc797961031e2b5dad51c7340fc8307 + c49e46325b415b9847edfb139d3e25fe + 43dea0613ea343cd84a7ea39ead9b410 + a5010bcb2e845909e3c4bd28d6221379 + c41ff4a3734bebdb1b23eb0889347b5a + f69dc2dd2f9f7cfd4a3972573e63a817 + 62999085a1424452729eb88fc6964290 + 7c75bbbf8d0fa7b07e7c35ec3c0b96a2 + c1c0b3479a21019344fd4a078a51f630 + 623a59d36db25bee1d1ed7344237afcd + + d4a3f35d94636f99813c7379b786b814 + + ae0320125a0819d4dd3724911d0941a3 + 7d877ff942dac6814f71b6b8f2575cd9 + 23697dc92cded2b54c36aec8f1e53374 + + e18ec31bb122561b2b41765e1ccb0979 + + + + + + ce9aaad01384ba28120b9d187480b515 + c54b95d826f3a25f7ce58587aac7b257 + e9f5adfa6e57d647e30f58d0a66701de + + + f412c059d8299463b5cbcac91f5f1cfb + 8da969bc4b49b8776d01c039659d2a01 + ac06c29f73b1126b85c191ab3ba5fab9 + + + b02b848ea0d80d9364048bc18159e835 + + + a486aaf0cc844108f9abfd3930dcc06c + + + + 3b98e7b96261843cd752c96a0dc5105d + + + 8f8f0db143eb16f9fe695220c0d6266d + + + + c495654869785bc3df60216616814ad1 + 269550530cc127b6aa5a35925a7de6ce + + + 8ef356884e8bc0128e25921e21fab64f + 0d2717cd5d853e5c765ca032dfd41a4d + af7ae505a9eed503f8b8e6982036873e + b06871f281fee6b241d60582ae9369b9 + fee66e712a8a08eef5805a46892932ad + 674f50d287a8c48dc19ba404d20fe713 + + + + + 730dada6db28fb9a91ff45fb8c613471 + + + ae7c5af0c35d94dbcd1c599fc7b400b7 + b1db819132e64a3e01911a1413c33acf + 3cea6e29c4001d672667a93775cb061e + 441244cf44090a0ff88abc33fbbca97d + 6c9f93a2edff065d81710586bf74fbe3 + e97615303f2e16a723db308fc8cda5f3 + 0266b05265f317a7409560b751cd61e8 + cb519ea75f9f92a1ed78efdf2f4fdfef + 37c00b97e26ac9fe903a6ccc9ea48644 + 484b6c5b3a6f889b62b1985d44467096 + afb2ed6d67613a724a420a39b4fe5b0d + 3a2aeeba930cc29e4d31ebfa1b7cdaa2 + f255af0bbbe837e79f7821827f9c6f10 + 16a2e274512a3e5f752ee83b66ed0d9d + 31973fa52e481ba490f242d2ab896fd2 + 99db8adec61e4fcf5586e1afa549b432 + c1a65805f759901a39d10eb854c1dcf2 + b0a4a6ccf7d97d473f4590541a20f950 + ffddcb3736980b23405b31142a324b62 + da4ea5cdfca6b3baab285741f5ccb59f + c246dc6aecd6b7007b935466d04e3082 + 082a71677e756fb75817e8f262a07cb4 + 860d372f9b96d1b53a5b82a6cec33878 + a00289fe0098f0dc10fcc3ece8073bb6 + cf2f3c1d5c7cb02c29f61964313148e1 + 96c476804d7a788cc1c05351b287ee41 + ab2fd20ee1acaabb676ee6fd2432437b + a6fa3bd125ff6df3f77ce6c4203e4282 + 5f25f98ad449e14f35dbe987e0d090e8 + 0509ab09c1b0d2200a4135803c91d6ce + a67175d1ea11389d9107bd8c08f9d7d7 + 22c0528acb6d9cd5bf4c8f96381bc05c + c135a20aa76cea4876a24bf50c7c821d + 36bff72dcba3098b4b70b482b22c29ab + 29b882f018fa6fe75fd338aaae6235b8 + 7e9c61d7c7406ac922f6478e9c30b200 + 6b7897c9d28b17fce51b4b20052bf93f + 7af88092dbd37f08241da9f416dee798 + 3935e107ea61866e60d7946dc6a962f1 + 3c100c613625f06a5e00ddbba18b7f61 + 85b96796bdaef0c326c1bbb18f0222ea + 8b05d51ede908907d65695558974d86f + e049aeb07a2ae1627933e8e58d3886d2 + 8325e7ea6f0adcae48d1dbc6e45d1951 + + + f43449ae0cf74435d6f3dfeb26409c58 + d41d8cd98f00b204e9800998ecf8427e + + + + 499b4fa9c7571798b23d7eab978ea821 + 3b98e7b96261843cd752c96a0dc5105d + + + + + + + 36413fdc38dcda0492625f4fd4567d10 + + + + + + + + + 903272a2488d57f01ca7c7362800f702 + + + + + + d106b2a1a58b55ba948cb98bbf56012c + aefbdfed4fca96580a62fdeda3a8d139 + + + 6ed40b5c2f4fbec7b6f2875b499be736 + + + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + + f1bb55b39fd08a48b39a72c29ab2f9a5 + ee7653b7c02ebeb1ba15644651603b80 + + + + + + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + 586f164ca5d5e33f47aa64f7cf6cd8a3 + eb18bd04abb3346c0ccab55bbb8bea67 + + + ee7653b7c02ebeb1ba15644651603b80 + 8471a3ed677ef88ded2627237a1a11f3 + + + + + + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + 7c632ef10482306f1bebcf610ae61a09 + + + + + + + + + db89f0e42d2212ac85459590ef19bd4f + + + + + + e64aa3d37e0b051eacb3e4175f9e93a7 + e0ec9105cdf11a0735aded36a9e72e4c + 05ca76d58777641fb5676520ffd0c82a + + + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + 3689588740848292d78ee9588b914678 + + + + + + cb026ecf19cdb144bf71c2660998456f + + + fc510e8e883ee1c3b03471dcd75e8191 + + + 48d4fe4e3dd8c4298efed54468740e8c + + + + ee7653b7c02ebeb1ba15644651603b80 + + 39c161551df4266a4800c92428e862a5 + + 39c161551df4266a4800c92428e862a5 + c7afb2e236f9cb7ff1a9a0eb5630e5ec + c0a1dd1571ca1f5e14e25284a0e86666 + + + + + + + + + 74701f130330c8a401e3e21277ffe721 + 2c090f5d4d353b86bd02d5ce8020c36e + + + + + + dfab71913168e81f82800536f08a3f90 + + + + + + 4d46d7b8b36276dcb8de916f401e4906 + + + + + + + + + 2da3c665b79f7fa019fcb9681404d56a + + + + + + 02efc59ad6fcfd37caba5d1cff12c020 + + + + + + a278d00a85685345cac4aae7b4668095 + + + + + + + + + 477729ee3aee65982c173579eae38156 + 5528446974b0a13d5695241df6d08b5c + + + + + + 318ac8c88b8de25320accbd494799b09 + + + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + + cc4bab16d3b1433201c984d73de87f62 + ee7653b7c02ebeb1ba15644651603b80 + + + + + + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + 7a58b4c40f69485debb0f7694149452e + + + + + + + d106b2a1a58b55ba948cb98bbf56012c + + d106b2a1a58b55ba948cb98bbf56012c + + d106b2a1a58b55ba948cb98bbf56012c + 6284f557d16f3f6384d9a1527f4fb59b + + + + + + + + + 8bfa9e7157b5d58dc93ebd2985366443 + + + + + + a592e36419e4d6ce9cac28b4a85f1026 + 0871a7161d4c86765048a6468a3c3090 + 2fefc97a19a08e03464ba7e0157176c4 + + + 6155cc2b6774e16437bf76f8290b438b + + + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + bdeb8d92ce06991ccd0ce009487e05ff + + + + + + + d106b2a1a58b55ba948cb98bbf56012c + + d106b2a1a58b55ba948cb98bbf56012c + + b2ba370d585490eba3648aeef23da8e5 + d106b2a1a58b55ba948cb98bbf56012c + ddd348abb85f478168d5dd027eddbe2a + + + d106b2a1a58b55ba948cb98bbf56012c + 3ca0214ba4e4a93f3e89d9111be44544 + + + + + + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + + ee7653b7c02ebeb1ba15644651603b80 + d56f94e30104e7aa7381920522005f30 + + + + + + + + + 72df5121ef2175acc7dede731b13af4a + + + 0c7780cd64fc195e511b19dcc3311907 + 4d78677d958f6e13a3c9b3a01ebef0e5 + eff80ae828f01f344e55b8598524b12c + + 44c4f00bcc7409d3a7bf24102e4c8d75 + 6c575a18159a967275684cf1af98c677 + 63d5220b1691749ec0bbb8b0648a720c + 715d2bc2fb204e2fecb3fdd1c113f7dc + e29f2a54a812cb8e6b7bc90b2faed4fb + 994f7136b926dd56279ffd9328ceec24 + f10035c0f5062a73a0b5291b23a56ea8 + debaa22b04660d012bf48596f544e02c + afe565a88433fe041072bb5d1cb98941 + 647ae48863e797f27ecd18213ad234c5 + 871e4335ba25237a3d3e0cae5c4391ab + 6b77171cf586172fa71f1b413577a576 + + + 336ab46ef6438fcb389cf4154143120e + + 358171a250ad81940c130d811b1146ad + + 113d58ae8b3370f9ca46825126a5fcff + 7477c7154b7f2c0649c1a45517f6c6e3 + 5de9f8ce0485dc970125b07d64115cc5 + 6499902c464b367b0d3524ffcb03178e + + e3961468f02240e824ea83b8e459913d + 7333f9b142309e92c69ca204ea5d7cd4 + 073bf7886f77f8cef2a96f854a539983 + 6310c9ad222f21686ec6e2f96abd21ab + 2650ab1110076e2e69f9f3070d0e45f3 + e6b81b6e28120c8a78dc46767728977b + 1834bbf945784882d19b8f215304346b + b57c4c00a211e47cba89e89eb3cc34b9 + d8542b05eb5d61309efe1fb5dd1c0161 + d8c523cf3056d8ac0ea8489d6d461281 + cacb859a5e49b759c04c2debf612337a + 7f7f6a43d4bb670b745649a2734d57d7 + 9cd7fa79b2f8f0a049162ef96ef47950 + 857ec0bbb725058d54c1580d29f34aa9 + 5767922b6ba1ca8a538a82f28f669fe4 + 09e9d4b8c8e882546b839b99b3991a90 + 48ef4d9066775e714f18319661582903 + 3e2443600eda9905717d41c87cf16035 + 7939483a0d644953d19ff4b1d4d4deec + 21176ba68edc6b9dd6ed4f0654327a49 + e1c73da7523338c24283e0b38139a454 + + + cfa8eef70402be4d2f7a36f5940e607c + 18d987add0a4adfa2ad657f879cfce1c + 76a5ad9032b7855b2daf48b49b354dde + cce6e711bc2b4fa0858e0abd64e87255 + 9d449434a1decc7bc9e1f74f48438523 + 10fed84de1041ca91de2903ac92a5b76 + ade9990fab580789425364c31e335ab4 + 24a8d9d733da280147ec467776fd2f1c + + 1a35fb592190ab00d09360584ba876b5 + ca7432d1cf7c9e5119fb5579f0657ea2 + 8b2ff6bc867b0b9aa6509e3b25abaabe + + + 165313d3f698525410c9d33ce72081ea + + 6a33a9542185bb3a55a8b8ea52677900 + + 838606bf9e0c0d331b65661135a7a4e4 + 71e2d1fa25e51dbc64456be0768c3b5d + 7a9281d37e2ccd98c47969d5cda9151b + f975bf0c835775d9217122ee377c6600 + fcb3a9a77144206b6752a4f93359a873 + f55a9d6f9c3f101c5dec4f67686d7b40 + + 55ed07b298e4c59aaf50abf7f00391b0 + 3b625d9a20c4d6cce2cdbf17a75138c8 + d999ff3356d30d1665c7336de4d9498c + a2d2dac3ab067c235f748091afc86169 + 02b78a4b39372ce289a882f0f1f71c2d + 628fa5221b0839daf9bed4b705913b4b + c7250d62e0f5213c0dda73392744a59a + d8e16325d0e5d5e8adc8399947982128 + 58f6da1b5e7dc29e8fb63d8f3a419363 + 1d9e710cc52ba80f3417f27d609744fa + b035580c48644c8e2f12fb4fe53e5be8 + e020e662db24c641d17effc51b4f5fae + a7f7d2f1edad8f9df22ed9ba8d8168a9 + bb3c762cfebc31cffd0db0187cc61216 + 081754fee03e775f1f4dcdf331fb2886 + f3cc3c459ba454c0ff2514a778c2b8ff + 102036d8c6ad0c7db029ed7c6704c0dd + b325a405fbd3b8ef8271636bc0e6a9fc + 9481e14873f103a6bbee6f09e470ff41 + 8c9e95ac71d5f6f5ec17df9ba3c8f3be + + c8c3b7244aed876973c4f176ae1e5c76 + 7ecbebceddc3459af256e567cce7dfab + b0ad3365cd4eeba5113d146610d42edb + b0f67cac45daf94fe01ea9787a4cbe44 + + + 00dbd42fa3f23714d5e95a1a0f4f531f + + e24265abec9db9d9e972f4ea4bbc185b + + 273f77aa76a1c0e9dce7340b67ff7edc + 7f85bf52f651b899f88c9a633cf32357 + 1084d1463d17c8441366b3330828f563 + + + 45ed1e241d629b3c2f8cea3b86e095ee + + 812e9a84d0c0f8d2837fa3e5ed9fc3bd + b92f5b0ffdbb6aefde14fb79f51bdeef + 76045517e06606a92d202ad19656ec0d + 0af5ec353340e49ad910db17cbbf62b1 + fc3e1460a7ce1162a37989ea11070e15 + c0182bd5be2619062ec3c83246342d9c + 200834e548ef701f85d3c16786da184f + 3fe6db8f9499104c62891e2657a009f0 + + 8477c64ab0dff32d696df337e662d30e + 04867a043f7495ede1b8f1e8ac97f9f1 + c82e005d7b4cb08b7fd9d63890075d2d + 0566f981376f1d055ac8468b0372c3ab + 6f1989cda673c0ee84c44574dfdf78aa + f25c30dc724f8b9225062893b022dded + 4ac59256c174ba9d371ad0dd1188ad2f + db7ca1578d4ec0fd8fe553d4e685ae07 + 783007c224cf24fba05437dd1c91fe46 + 299a9f5d5dbb5a2752ee5952473da71b + 51f00ae7ec90da7a813d8dcc3aab3b81 + 62d7c662ccc3c65d84b99c93c34d6f48 + a2d1d44bd76a93bbc513c73f457aee02 + 0770b1c9f341d8d320dcd0310e01c04d + 70e973d45bd7a1f981589909c6713f88 + b6c65962c1a3a55da3d2ba4a55bac373 + dcc7cc760fb4450ae27b4113f1ca026f + + + 711348bff927c5b8635e7edda72bb10b + + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + 98cacfa8dd4ef4ffdbd1ecbfc2767e88 + c73babc93dbc3ca816cbd0dfbc071f23 + 4b006a4741b19e79aae5f4a2164161b0 + 5fbf1ea44e61bacc832b074d910ae92f + + + 31cf7bdcbfb87583f547cd1d5eede32a + b972783ca59afd27072cdc7975c4df70 + 45546795258710653be7a2043771c12b + 8aec842dc056da63de409841c4b29622 + 6ab72ca2ca0111ed4484f17d0ce84a54 + 0a0775eeefee05d2ddb5597e2ebb8eba + + 3363f61cfa49d386cfd0dcd753f69d19 + f57d6a2c44b65ea7e90960b0d67a876b + + + 5119565d69cd68fae2e2a709363f8754 + bcc8ec79c74ccf89b2d4c0bc04985f8c + e960903edb5dd1ca0131ed5a24debbc1 + 4de0d9c715851b47807c6ba22f664d0d + 97c832b31286e4393e55de1f119a5bac + 4514969422dfc0a51fe0e460c4e8ef4c + + + 5119565d69cd68fae2e2a709363f8754 + + + 978791d51c592e72b66cb982259984a2 + + 0fc99ca23b5c9c647892cf12e80c5e80 + 26daabab5bae94b7492c7be38d40fadd + eef4394de6e7f3510b1388473b52f700 + f1ba50520217c57c8c8c3836bb882c49 + 8e046be6ccf614bf7ad893ea158cb0d2 + 5a92175c123b08bb91e2339d9726efec + af227272495a884e2c839dfbb3d7b478 + 33d3623ef785d5a98b5ad5740486793e + fc12af0c817b55c0bc2139eb7dcf1e58 + 3acd5036f9d7e7826ab028a676fe380c + ed4be30cc9f96aeaed56ce66606c9753 + f796f9c62b7c40f14592a6c4e708d78a + + 8fcab4e26065003da464bd108420e727 + 10dfb35be1816d6d0f9b8226770e1ca9 + 27f1da112ca3fdcf617553b0f179e04e + ee326fc23699608ac0f63c0458d48dd2 + f058c261ccba37337189235ba6130bc2 + 4156f0b73093f712b7707a7a5289fe02 + fad9d5c0b2ac02b9569569749d171262 + 8c94f549e8ffc32a74aa4af5ed0273a7 + b52688055d3a03ae533d41109d766db1 + 5d1665a87b57f41ae9dbe9099c6c09b4 + 87aeff9c86498453d5d8eafc5e27fe3f + 8100634f23b0f8cf5a179000fdf9896c + 38aed414d843a5911aa347d1a0c44696 + 293154a782264f9cc5440ad9dfa65b66 + + 2486fb9a299cd746a6eae880fad56d4f + 78b8cc2e0f0955b9d0bd40b0c6289e0f + 060583e4202802ca7c098fc6403cb7d8 + 7a3bc8f06c7aff8ce2ea192abebddc37 + b5902d3400e3a9bd387d025ddeecb924 + 8a3cef3d9e83f8ccc8ed6d83edb61910 + 8fd30c75df8662c9a1bf5d3eda241728 + 837a3cfc21a6cec66029e4a2c06d27f2 + 3b98e7b96261843cd752c96a0dc5105d + + da47ca4cef803523ca03a714bcdd1e21 + + + 5119565d69cd68fae2e2a709363f8754 + + 185594e22cfd4bb68febb14e1fc406e3 + + + 5119565d69cd68fae2e2a709363f8754 + + + + 5119565d69cd68fae2e2a709363f8754 + 7b75ccb6611d7ed99f105006e8e3b2a8 + + + + + 986fa82fe018b0d7a6865e6c2d4b2e29 + + + + + 3b98e7b96261843cd752c96a0dc5105d + + + d9077190a930e24a162c2ab88246aee2 + + + f600a6351d80d9358ca3928097ce2b6a + + 9ea78d1c4091967fcc8492787d5a2133 + 5ad320316d83157da6c624c1824306f7 + 9564d5d309b907f83bd2d8d7e7794fc5 + e9e0adbc83e4bcc989bb66dda989d8c9 + + + + + 5eb6cdce5d1be3418e0a1aa2029c409c + dc112f385d987e89882f7aaf957d0b8e + aeec85f3de432973541eafce90668a70 + 1e24b8c03844f72961b13fbe32a1f780 + 55389b66c04c60fe8092fda3b91fadf3 + 162627a3477f625acaaa8f0b29a95ed2 + 09d24a806d7178e92577ae8e06091cfb + 7e0b4671c853f625aa905e5746f6d8fd + cbd869c0c4d66b405cf9bee1f220d878 + cf7b7dd723c51ec4a6285d027ec21aed + 126fd298d2926702c152bf31504e11c3 + 3c5decd33c2a35a3c463c0de2549c92f + 9cbbe58acfe7390ab9c8a1682b440026 + a898242abca3e3d4a22febbae083d8de + 2423a7c295cc8543103aa7476c3dd49f + 1a0dc84e932b056655e38d5e27faef2a + b331da6d9b5036b0140e4f8fab2832a8 + 417e3fa1e64e5f2d8f8015e4dde4b44f + + 563b72cac1d6a8345ee61d916561151a + + c5714ab7f24ac7b1954dec92ed5c150b + b83182c58033d4a8be3d2779f84a6aeb + 4c753a4b34d31e477b43dd68ab6276ab + c4d035a8a6b7e1ba880226179a2be993 + a1c751921b47cb6de4f0a0b8f8c09908 + 4bbaf01c84340315830f7bdcd00508d5 + d44883b51ccd517e19d86bd9a793bdc7 + 966ff953530980f16ccce30b5f7d1915 + b6c195c72532dec368bf483932cd5305 + 0792171426855da5f386e9b7596ae4fa + 871b7595c78ca2a0fd24a90b011c944f + 746b56b3098c6017aae57f9466a7775f + a2148e9c759b68da777fefcee09e5e08 + f54305d6639e3835395fc6181ac7f57a + c450b4146adaf6ce1861a381dcd92df9 + c21019b0bc86689f1ec71c67bb37c99a + cd4fc8b1c0700875f5340ebad6693c70 + 7bc0b248d7aa8986f7e79f5f188a49c6 + 8c7f94d4582a64928c0b94b57c4b2f76 + 6ca575475e070678dcaa1542d7708bcc + bf249e034ac0e0b1b2733fb2120fd892 + ba1c7c44d2b354001749e1c4f1599852 + 7e6b0d06cc1acc32d251afcf43fd168a + 85f67807a757cf55e42e61fb96a71ac6 + 33beab1da3dd8a0f1866ef5caa158d50 + d75a5cd3e588e965c4e0b0045e8ec6f8 + 53a5925ed038fe24f1fc6340d09cb00b + 1b767537c7f68752e8da337809b19f70 + ef743bda18762310e4b0a80136cdd1d5 + 96e8da21d9c313fdbf8ad1cc34e3813c + 1f88e8f5dca0b7e1b1751cc43b098d92 + 14af92f6e710c9d6c1d02bdb19b9781f + 7abef7c05691bdb510efb5c805735d5c + eb89a5d21d3fdb303c2cc8db2890f3b7 + 996649f5cb37ad249b5000852377c8d8 + 4cd324c1508738b95b394d57becbdac3 + d635134f80da804f2aa6598ad9a069c9 + 72b9233cc9340936fd2dd332276183b1 + 2b51e8066b97519c3900b0f791324684 + f4e8b001ca8c9d4d017514c4876e970b + 4076c2eb5a2c8921f1db932ac99f98c4 + f4f3bdf1564ddb30d2c7dab94c92b49b + 1938a1fddb8ce8352f63e28ec0c74d92 + 0de35c1d20f731b1aa29a28d19988685 + 3aa7adfcdd0ce151f38c3901bcf3a1eb + 46d0fb01d68e846193153dc90a8c217e + 129651576d06e33ec76814dad5db39f5 + 9ba041fcc353a7375f39394b4481b7a7 + d5c84af033ceef1776a9d2a993ab01bf + ed933de6e9e3cee86439f18fd72371ac + 99fad36949ae7152a611ce2d927cfa27 + 869af3fedfbacb347bb15f66a1fbb74b + b6219d18aef5a6bc0cc508ec51857e73 + 2c4224796658f90d21868755ebaf742d + 8444cbf8d939b6f06ac660bc791ed868 + 6370849d207e3c4a5a8466f02e200cbd + a8ad3c741a9b4f0812c904bdbd872025 + 20634fa71b7162f72c26633ae5ebc64c + 989a6cad7d10024bc822ef168cd0053c + 1bfea28df2f5f60ca179d29d86ea4562 + 76f19cbc05ddb05aba3d47011293b65d + 433f239fa7d252a9703159f8e280ca2e + d49020ed78fe2bb8fab4dcd1f4ef39f5 + d94c7fbf08f43ed55bc4aff8fa5bdd8a + 46542f000a38b4bf76e9459430521a4d + 332e22781c0a4842129d0078735c81ad + 8f3413f1a5b6c5dc058d18d6014d6c26 + 72c0a3b97cfed2e42991364beaee1521 + 1653442b5d9de2c6a1751388b3611fe1 + bf97238305d312360779a4b3546b27e5 + 5e6bdf4d9ce7155d1006e3d195b6e6a3 + 00e273b4bbf086bdb595f91430e116b1 + 6565c93187d7537cc27df7c1e37c3e2c + a9270a87d9ff8cb06bed8f829b0584a1 + 2ed3ea0fc205a851eb112c3fced23f4f + cc9a1b920d56deb2d8454ee940f3754f + 89a428f17585e9ca4d6cd554a8f15c59 + d6b85fcc38f051fdb06e306dc45bba06 + 7b566dd6a4db3a6765716ff717214142 + 9ba3e9f8cc851962c862993097b653cd + 5c2a17d3eb597df0fc170dc8df43cd50 + b93700668f974e7541be255b4560f985 + a8c6ea7581dc365058dadbf2db1251ba + 4fb9040ce59b3c1dc0a77fcd36e9556d + e934e94d7c06ec70dbfc65230062c530 + a01190794490e23b8905b083997436d8 + e7ed8eba5baaf006f81e61f2118a5849 + 45de6c101e70906ecf250a31e291cfd8 + ef5f9b98240d7afcd3d0d41dfbfade9c + 0999c1fcad2e50d7a6f61fe376179639 + d034799e18438f3ec2d9254609e9aba5 + 7057260b9e5a16022616563f1ca0d9c8 + b3c2201e29dfb822c33b2e26d5c06d14 + a9ddf720557b2b80107a36fab7b3d51b + 99273cb41310a64f2ec3ef629a09383d + f2555830f377a6c81d72f88ad1b57328 + 85aef388157ed67330a1a42ec799dac0 + 4763d7f36ee72769634f3b579ac2ca35 + 788f78de733182e0dcf3f45e21e70478 + 69b165ab3f177f2838f8ea9698f0ece8 + 856b35b715c67bb06725c8e8a3b54410 + 9221bfe7bf42401fb782327b933b5cb9 + 8cf9a9ab42d2df088939d99647dc0c2e + 19a76b6b14fc972073160037c7371bd9 + 4518f111d4414794d686d605a8499d60 + 479f302e28ace89a4f88021cffcf7b55 + ac34e6d23778b202c494585b856cbe5f + 0be74f422f4baaebf2d758645b152f9f + c7f57aecf9deefac5083b75b675d6ca8 + 3291e2bd5e4e6ab5e228889a6729fdf5 + 303556eef696d87487ee3d70ab590631 + 61b0982f5e53b8490f8d7712fa5bf7a5 + 74e36637c7a0263538ddfd994480438a + + + d03f98efb6c11270f070f0fcd9479601 + c2786ee70b5ab7009c980f63f75a99f2 + ae66830e18d8312d33902b90384126c3 + 4fbc4c5b794cf60a146a3e83b7fb574e + b31408392209792a5cf139c5138eda9c + 7bb149f51e704a89f83b39d535cfccbe + de1afa01541160959f60ca9ae953587b + d04e0a33e1dbd4c16b5dcb09691431c2 + 09e4efebd821fdd135a0a15b5b585bc1 + 6dc52ae714736aad9a78766ac4beb0cf + ace9ea843fdf3f94458887611d480446 + e596cb98275af061583f5439133bd058 + 0b4f3b17c845db68c283fd034a8de2f8 + + + abcfe48ef81ecf608732a0d62a3c3b45 + 100ccd0c89dd566352c96a9abab5c8b9 + 567fcdf1064a7048b1246c0b420b8cc0 + d9b6a3da57173fb6d4724c921d95ea63 + e4b612b13626c0cf702e059fd5b40e93 + 2fe6c49127d4121b59c55792424c54b0 + e6c2a8d9a14e105f3f3506cc77dd4541 + 6929aaa33f58e545e2935fc15215453c + 55cc774553cf01bbe8bd79f31f7d00da + e41a7fbb97cff04b3154961578a7eda1 + 37e46a4667f8dc2a88cd999a3a64164e + 5310f53c67847a98267f4ffc65f32a69 + 6027f8a9b288fa61519ec95aa1bc04d3 + 98bb0d4083c7495e9f1f4b807aad0362 + f888d4224c9626c00ab1bc43f75ab0fd + 9352f59ba7efd22234ec708bb6635869 + a21e69dc16349059247ce70b2e1b3ebd + b77210f65404877fc5c2e5ed5a8a5ab6 + 52ecc1db41286bb29fa1e896f8d186df + 17d2880052769401a0024a8ab550a2d5 + 8054601ab2b75015380b048d998856af + dc55655333643a483af17856a3979e4c + + ff9e5ae2995880e30ab86403bdb5f42d + + + 65393bdcc7ba216e053a2aaa47be48f0 + d68ad29c1ebe63a68fc5ab0bbc728de7 + ec35aa5eea482ea18a3436dc2626bed7 + 3e9d9824aa94288adf946fb0ba883a04 + 39930a6d3f48eb552f21b24c86d6b7e5 + 6561e1a0da3a04745560fab62bdc58ff + d167df264c7f5702d0392da45a22f08a + ad3afd234daaa9b3a9ef24ad56316d33 + ed664b8863fed92b2b294050ea5d3167 + 78a7638955eb3726b83dd1fe453a0e9b + + + + + + bfe67d8a7b6bd3f471526898742cd8dd + e33d84d6cafc660445b2831e5c2777bf + be0ae26ac4522a17b5e8285e8d77d768 + c59e91be41e121ac4a376898f5aa0b09 + 486a203bf113d58b04266060bce1880f + 348f026861fc489b515adf2d4274b29f + + + 5330ca974eebc3d39f88db0de36dee48 + + + 1363ae92d22e83c42a7f82ab6c5b0711 + + 783e50a8f248e56536e25b4746d035af + + 2782fe69c562ebd4be95ecad195075e7 + + + + 043117d4dcbc27195a9479a30b7befcf + + + + 3ee2de91aebb9755ec405e4c9f145d04 + 6f47a3e1fb1ffcbed14519a0fccb0d16 + 37b4eff9e56004a6657c3515d53188e4 + 91f6d8a5f86783a019eee7e95d621ee2 + b1c4e988ccc36553752db5d1d598fa7d + 2cf74aaaa490b4c31344a71bc5a9e688 + 134fc39d59f5112c875c9fae2d1af12a + 52237458eec98374c07d143703464937 + 502dee105e9830f31f33f4d7cd99c335 + e505ad4b4b9779f112deab701e72c45d + 7d89963de625fcbf900593375cd13856 + b795d4f5fb8c62c0a30acbdb3416b1dc + b638f52fbf2a3ca48a5a6db0b0588c52 + 7afa5102c681321ccfa6da44e3c71304 + 83ba6db0c48ee5a6810d22b34278ca7e + 9cafe4284a0c9bcf5f3f2b3468879cb2 + ae84a3a73d60888777d532899036ee64 + 848e9350cc8186a9bfa89178a5c7908b + 24ad639a368110333ebfa96edb0f4d22 + 555229b8b37df1672918769aa4cb5773 + 84d8e36cb6b1f563632a7e6a3d702a75 + 7a8905bf9a729c1c3e553c7a3178d665 + 42ccdfd512d0bc86f09dc0157ad6b55f + 522209f40dc27b3982eb13712b455e5b + 482e2806bbafb01efd4e1937d7eb0d11 + 38f449ff30b86d6a403018dd25f855f8 + 8b9abdefa505abe6dfcd6a4238a3bae4 + a6f3b3efba366710ab4f357c11f0ef20 + 4f064565f45ac35987c0fb0545ccf926 + 0fecb6d167871f263bb8dcdab61e448d + fb8d4807178bdb3daa75cd5d5239d9d9 + f75053eaf535a77f677a674915e62db2 + 45f0574d6936ea3d3c152a407d6da2f0 + 5a208a2249eef3cb2f84fa04851303ae + 576e684aa434af2fa98e753400766f62 + 6f0147b4593eed79e72a135e59f290fa + d0fec11c66a92889f6ac2e203e234e14 + 4c10c49cc2d24c05a6c8907234f2720b + 211c7bd668c8a1521932cbaaed80a836 + 953c54820395f1108c573c6c1830d3b5 + 4c919df8f2a98d15510039a76d9a4d98 + ec73030740f534091a97e0baf04477ab + 903736ebb5270d86029f103c237a3dd2 + 91552d308d37dcc0ec020a7d6d955c5e + ceffae210c127ec627c14e9156440793 + b06a5ffb7dd69fdfff1d6f0b17dc48af + 91465b7c2ed331d7d078eb092658664e + 9e44fa9c4d12b5527b698aae01500e63 + d0dcf0798c6ed9f2784fde2e7eb04f16 + 81d57b03fc92468b89e7b9c11f05ca73 + 740987efcfcb6d21acd47e415ef35391 + 40bd4bcc0ea2bd1b7b7e74621c59621d + df065efb9d71f77bfb335cdd67138005 + 0e848bfd35a0e42336b8afef6c109e08 + f0cef78021c404c84819ffa5689c9f90 + bddd94c90beac23949010137b47cabf9 + 525c1ffb4cebbab527f0f70f81e37f51 + 92cdf62c9c6f1246dd44163a4e88be34 + f38d8575cc8e13a213af23213f083597 + b207628b5518fe79eacd85abdfe60038 + ede00143638c3d572acef2b18b440c67 + 053bf74ac9033be160c692206e48bf10 + fcf110d7133ad838a1b2d9b7c449f8a2 + 29a790b5e0ecea8afdbaeb5e52212dc2 + 6886e00721d31366c5aa6525d251eceb + 9dd2e9b01e14d74cb088cffd8a974a4d + 48d9ef5737e650412cbaff1f4978277f + c22a335dde193ccdf5dd5d90c8278e96 + 0ed581de55f2ab33e1d2bec950a8036d + 5813552b345de90a916a8ba53260af20 + 3b3c814abbbed4452624f3f49464a763 + c5bafbbd0ec73e8770d2b85d549aa63a + d32a489c520341d1269a9214683fc09e + adcc1c4035b4e024c4756ffa61209dd6 + c7200ebe06f9d08c147e19fe855eb446 + 02a43052e0eff624107c7e9a0afc9376 + 31df637344896825e98c5b7021983422 + d613a4d9a26a15fa8ffa40b19b0a4ead + 48bb27154879fd900cb2f8e072e7b60a + 749726ef8172403b85ece66603e0808d + 9fb29f8c006648706701214ea14fdd27 + 6f098f607219360bfabf5cff5b8b357d + 58afe15f63e1d727d8784d39feb8e0b4 + 7d14d7ec2cbc533d96d0cdd854b338a8 + fe04b064ee33cdae252e590487998480 + 09ceb4d1b533f86cee5dd80da5fc45ef + 5b977d18fbd35ff0db958116b5a4588c + 6009da3ddb7ba57fb36046981a144737 + bb096d5f6426d4baf4979d0f821f3077 + 75222ee74ff9849c0995c122ec4f2d42 + 9c67e300f0f770c40966e62f886c3a8f + 41c37645858922b9c2994d5cd9f14dc3 + 900115aee230a1dd0e76bf2daaad5438 + dfd22bf8722260076cd2aefad5de7676 + 608e4bb8cec76cbfd8c50b7057baea19 + 50ea66390cdef14fdecc36db7b6cabb6 + d7d0f6e7d59de2561f6f3580ecda905c + 7f4bab0f38114912ba6470986f0f3f45 + d7e3827b9484d6585463a2cd3c9f9e86 + a4b0e1c45936fd076f0b7adec02f9b43 + 3a40e147789faad10b73a3561d12e93d + 235b939331039f453de8273fe7cfc2bd + + + de7fa899c69d0a072500e508ef137f91 + + 9f14ee72f9cea4bfe3760763e2d0321c + + + 8fb66ffcbb88a23e5937d5b2a16b4467 + + + aafad65e7fa945e3d10e13e08ee9be1b + 2aa38d138bce6e336ffb75391ec24a43 + 9767dafd969741d13f2879a475df3ede + + + 9d6000766cabbf327d5ef7b4bd70a2a1 + + 121fa89eeede13ba7207fb0a0a9f4566 + 955d5fe58c231244f6b49000f383b5e2 + 5d45ecd9753b384fd1d36531ccf01f8e + 6fd927dc2f35282c472a6eae690de214 + adaa3625b8ce79c1ed594558cf9ec100 + d7b43c32f011cceb5e7c47550ee16350 + edf0b24f86b9ff87315b88bc42882103 + f5e730f0fa2520ad78f8184dad4c7530 + a3c6ae2746e524a00aea73963ff36d1c + e981b813eeeec49b9514e5ae9177a8e3 + 182d5924ff0b528f008a83d1f5809d02 + 54f9d6197b18f3a32a0cd83f76ceae3e + + + + + + 20a8f01ba5ad206dc9d9f475a5b55c08 + + c0599cc21db6550f4bdea696ab3ed913 + d4cc5a55473f78369b6715882c569ed4 + ca4996061310861c6281c8d0640efdf5 + + + + 77a2756c9210a20851d5205d2d259016 + + dd9fe033b5f6dc1d6bd3f0f88134e062 + 5adc3f5f23d492b8d3d0d44eb531cfa8 + 7cf135ae5f68317d0c88e9229a8ac3ee + 1564081b45f6c30911b4c56403c4213f + 655c0255ace808eb050e33fe4a3780af + a0682314f63750f67c1a267ee00f886b + + e4d5104f07a7c01daa463dfbfed21d60 + + + 8c128cde538c528b2c08f7011966dc94 + + + 92348f6b025db7b20e2e6b452069592a + + + 5e42d237e32eccdcde278b89f522b23f + + c8f0b2b87b8fec8415fc70ad1032aadd + 7c2348b990c097fdb2d5d7914901c539 + + + a30fe54f57962c7a69ad0719edfea89e + + 288583a67d1de4ee81ae048ed6ea484c + + + + baab92b8c6581863a77e7ba091a25fe3 + + + 746d950e3a531cec70a976856e5654f7 + + + + 8f5ab12ff5a3d374cd3c4e084df5006f + 253a4fd19749b97b9a544194f9ff3cbb + + + + 8697ee0b8035e9078b3afa40c10cb4ca + 25c9b42550424f95da9fb81f3c90f715 + + + 294db937d42dcf9a3c7f979c8a6f9346 + 6c80481a6cfc7757ffafb105b5031c12 + 544fa8f5116edc1f524fad1f6605f955 + + + + 7f89a1c540fa17d4452e7853cc347fef + + + + ee7db6ee5a6809f4fe46f8e19452a696 + ce4bdff6c91a7f78474b19a1970df434 + ceeb81b374388b8af5da0b417cbaeab3 + 4a95c6eb2fb36c9b421154f72eba480c + 370f44bba3180f31c13b0a84faee1e60 + + + + + dc348866a40ee04c7a2d5329babf75e9 + + + + ce22d3f5b004548472ba5bff9363fb8e + 24c9e2a87cb8269f1cf15c4cbfe5a504 + + + 27d24fd3fd178f66f0a6ceaa0d9b8081 + cb87949f9a5376b9c4adddf7defd05e0 + + + + + 1088991a92472ed83dbf5a47addb0fa7 + 80c364f51cdd54615c79ed6fcd563d45 + + + cc6cc0da0ca49066e34f2194c5ad6e43 + + + 6ab2cc53b8779b159eefa90d483f8825 + + + + + + 4abf7b0b7f973c1b756fb17e0d028c79 + + + + d5dcafc696e337d69f273a2719fb7d85 + + + 4866c3891f760313cd31d98cde1bb21c + + 62ef4cde60ff74455a08c5c403c7c96e + + + b8f6852fb62258b841aa8ecdff3622e5 + + + a0539da7f3635ed10ccd882c3796fa64 + bd749ca5154563154d707de0cd11832a + + + + f061bcce49e33425d23ae87774fe7cad + + + b81ae45e8be1e3da07ec5ef12115bc68 + + + + 68e044d06f8cfde83666889812dad193 + + + ac15a9e6c580b601a095fd8cc7d183e0 + + + d54c39c2eeba942ff382382af2187f8b + + + + 99f7fc277a7b25ff12cc3d35bd6190b5 + 58563d27c99cf3f47263dee8b94e1ff2 + + + + + 3b83ef96387f14655fc854ddc3c6bd57 + + cb967116f34dbd040a8eb71efcfec996 + + cf03dc4836101886254b22e8d2c82fdf + + + + + af47731e5d5881406db7b90505279ae7 + + 0b458b1fd885dc3d7b1d11ece4396dee + + + + 8f6d63b1320f27db8122ceb09ef0d7ca + + + 6ff4f5913e44914e0b8c20a0572b04df + 480fdeffde58cf892b5c9869675f3bd6 + + + + + cf00db31bb22c3e153bdc6c3ed9c589e + + 33e007ddb2a970a7b55bd040011119e3 + 7752e42a4413fe361b55569a48461a1d + b8c064abbed0fbc0b903b6e66f03ee08 + + + + + + + + 846d75aafe0e5e39a68e46b073130df1 + 8e43d5c57cd46c8891af882bbde12818 + 36b46675d077a220740c5fa9a1f99a4f + 9e1cb9f446530975bd5880c76c5df3db + e425086662517c4b507fab656a9c5f20 + + d3d18ef0371334db0179219e3da804ac + 3fa00244b86a8dc20e0b341c6e47f0ed + 0a2716cd36d6e73468779ca3812697d5 + 9ff0f3d486b0200b02681531d57df17f + d4fc4acf6b4c708f09c90c4105b8bfe8 + d17eefdd12c570bdbe597057e1594f88 + 3c35306bf391b6ba6b8cfcb79b383319 + 19744204e00c14f2e1eea5a6e574b73f + 87f5f2f8e69b73d02c68af48ae18466d + + df8dfcd903caf2d3af2c570983527816 + + + + + 2e75234cfca1e55b1cdce86615dccac9 + + + + + + + + + 58ba05ef6057aeb06438fbdb6573bc9d + + edd562efcb29c0beb7c65c4e8f448179 + 55cc34f7c6ca30abc61fbee2984ec8b6 + fde42457869627c9f58560b1fb1a83dd + bf0d555badf29e7ed720c6cd63685e7b + e929b3a96b5e82e8812e346f30eff31c + b18abb4cc9458ba6720f17a8840e3a8b + 4b734712c5048a4bad33ba09f1c7675d + + 460dc8134fda838e2e5678fdf7083695 + 6798b6c7ae6082c7f5953efe8aacfb62 + 083d6bf1b59657e64c415538ca5b4563 + 131e2f942fbdf5cfa8ad406ecc30a633 + 5905a0a48bae9726a5a36ccb523a583e + b0614c5ed751c385fd985c68ccba9bb2 + e629372f04e69e45143c24d6d946e469 + 00cdebc137ba711ceea6bb59e0a0f85f + d06616323b981611bb940955f0ed102f + aca8631b505f946082976d33c6fbff1b + 02eb6be01454af5e4cbfa7e59a555dac + 86616784aaa43840270c963902c613cf + 92945270c30d66b4cca3f222eb328541 + 0e67319c10a7870fb03a0d5e80255295 + cc2c18f83ff8b77c7e5c18a6695998ea + + + + + d1c89e59daa49f492293d0aaf74e29cc + + + 6eb5e32a565f247832c2a00cf90ded7c + + + + + a8fe35b0b41f0958bc8d4d76b1e97bf9 + + 6ad48b937eade0781a79f61924e2bc77 + 3ac62c50878d2fbb955d66c3f0d67a35 + 75f43e6bbbce0eaf62faffb53c8eb157 + 4e279163094b1d004834de50ff73a6a3 + 7e7dad32c2b4e6f661681f82577bdfa0 + + a35ff4030726b796fe3bd529297cc4ce + faa9e29186f2a43c8fb2f97fdd08ff5e + 1f70d01521d9255a1701ddcfd0ca7738 + 274161e2b23e968ce2c233c5a5e6ad56 + 3b12e80c57b19e51070bc99bdac8ec2c + 98f3f773762ebc38ce061247c4efed42 + 0f64b4439430153933765736a9ece6f8 + 89d85d25e879cc9773b6fb132b62ab14 + 330b53c3706006d6aeb28a24fb2f9e76 + 26a83979740e604e740f1d7cb0571fa0 + 341479759dece8fba9929445832c9878 + b8744704c603482bc368e7ea963a0b30 + aacef8dbb785118fcf26e2074a824375 + e65a113ebe74816dd7bcd330adad6576 + 4cdf2c7c4b8d6536de47546ef7825096 + 859b03f82fbf974b85c65acddef815ef + dea6912c9e1f4c4c692c8a7f398bfb11 + ea8b3df2330018c012eb5fd2e73304e1 + ce314506cbcae0d36384dcb604871c33 + f5110487d09ca52923281ac2d28bf490 + 849d3244ee3b3a7edb7631b29105d145 + 637955dc4b685258e329c8fe931096b8 + 0e03351feb7117838fbef85d190073a1 + b43c1884ab32d84f1746ed228ab6154e + 9d62291c86b91e00a2e6edfbabf48a10 + 06f0246a8266b6847961c099886b8db7 + 284bfe08d5f47cd78612fd2fa2837217 + 287e2a2c8044e2bd85bc38651b9501c7 + c4694eed5a73521ca47f4a1ba2772f19 + 7c41241f76d6f57431d69a3e80352171 + + + + + + + 2e75234cfca1e55b1cdce86615dccac9 + + + + + + + + + 8086a232727308644a3ce8ef2287faf3 + + 8a5669b51ba5ec80c9c9f886762453c9 + 8861165117236cc68812613a182e2412 + e164adbe1c920e26b1b4a8fb01c0d09b + 77cea51e461b0edd0a6c44f7a6f47716 + 042c6c33aeb47d82a738c3d79b923bb2 + c285b99862c54c1137a8e882d1c22f90 + + ea0952a882af3bd052e0bee799b500e7 + 6532056030ae588516ac9fa045f2964d + 8ca4a0c9b2a774a1df3331be08b1c884 + 8c26c3a18e44c3d216a29f05a4c275b5 + 7ecd789f0cdcded6a16c1a112e5bc9cd + 88aeb1891a3b3ec0c71bddb8081a9b16 + + + + + 1d40edee35478359dd9fa12896d7de0f + + + 293a9d64214f3085a003b5e3493a25f5 + + + + + + + + + + + c803c5a510e79fc65046320f9a6bd8d0 + + f5651ff97ea8af82857d11445e13befe + 1b25f8eb5b4cd18886606c8b1bc712d1 + 7ac389d68fa2d07724a7401ab9d126b1 + 4a58dc83bcc13a8d53ef6efdadebcfd1 + + 3295fcffa3fb4daa71c8263136c78496 + e57f86a74a79df34eba2a32618575d90 + f18f81517b61b2b8fb2bc6fa74975d74 + 3d8f30ed4476450c2403fa1add75898a + + + 8fb765fa4b2857b7e227f9843a26cebe + 7faee52f1abd1949fad3f842a2fd3894 + e5db3e5e94028dbe0d1ed8ef90273288 + + d1e59afd23382097fe963e5172aca119 + 2cfa9e77dedea8c98448500b83a88979 + 835203b793628365b220a3176793c6fc + 3c69d3a5b056130e8655ecdd85515082 + 0726e9f07a0d853f5ad3fa911ee2f615 + + + + 6eb5e32a565f247832c2a00cf90ded7c + 5c4b014465c6b5f063ea69f91dd91731 + 5c636199fe9ec9b5a67912893251a83f + 9f841063278922dcce1a2138ee8169ae + 6cd09f38f5bdeb0fe5bfa0c0ef606784 + + + 45ef7a7a549a9210d9e4743609cdfab6 + + 8a02ad42681da97d8093b1da2dde9fca + fbf22e7f1fa9534cf5d43788be56a7b6 + + + + + 2680a010dd5288068d8536f6c5e95f0e + + 14dee2b78b2eb2c13279a2e9eb2d818b + 6fe8dd000fd0815c5ca4692674140b61 + 6450a1857c677008812ed470d6993f07 + 8a43b58eb7a38e39e2e0945583aa4657 + + + 9c9f2013c3ff38fd23de256b7a4adddd + + + 5cf154aab2c79e98b1288821c6f414d2 + + 00ebfeba55bd738f58ecf445fd3bdce7 + + + 1de5be0348bfbe33a0b1369d02bfdd4a + 82877dcbd4aa77a6c413814c692816c6 + + + 76e72c03b7eb95ac761a8fb1dff3561c + 3a9a206d1e70ecdb04b2e8c35b416b5b + e3547b1436fbed42b63597619e7786e2 + b5c23379171924d73237244b59c49c76 + + + 275795bd11a16c4e25758e564941265a + 4362442964bfb068aa1e345595ea96f1 + 6dc002b3082344755b841eb538ab1a62 + 9dd08817e986012fdd0bf978ffcfccf4 + + + fd4be23cd6d63c1777ffe6b96ed903d8 + d2e4de3b0855a23e9a2cd5aa6b5c750e + ec578c495d8a1ab9ff107ece293c27f6 + 54aff69ebfde629c3c4e2418affa416c + + + 0e651d2b442e7400bc937d18196941c4 + + + 90e0dc05454c9284480609510904a6eb + + + e43d6bcbd00cdeee922bff9659e04e57 + + + 669c8b137bcdc6ab7aead43b93b70cb7 + + + 6c7d44d9a42388eb5eb48a4289bea489 + + + 1323e61aac23ac9024d598781eec7db1 + 0ae8ce85579f11995425ed92ed6cc38f + 8aef115455cc1320daac1cf66c2cc1f1 + + + 8b62c4ba6c5d6e0cc200f17e7754e3d0 + d3225f95fd63e984916d8a2a2c0e208b + 0fe5443522104a8509a9003ee053c01b + 1109dc4f8a48bb4bc7c5fee77aa29ee3 + + + 246ba5bac5e798e9179668d320a796ba + f620af75df280a7d61e365f8a3e4227f + 4453d1b38eb7294dbc55477853f9408a + df1bffa34cc93852b914b5819e473a27 + a79f4527b42c6cc7615bc877f15a73ed + + 3361ba76b8f2ef0af4b186fe286ee9ea + 8c276b2af5239b354826d3ef1bdb753c + 536dd535618358cbbf182b98a2981501 + bc1fdbc2877a61cbb92c8c545d80262a + d82f316df09623c1b1507f761b456bba + 7255c271f158f7a442b0ff09037bd918 + 6649dfda40bdcc67fecb9db284ea1648 + 660a9b93ae2fcde21585ae9270235fd1 + 0d09b0b04e714f44cafe23290d46a046 + 81178af11c8097b7b690b592541fb7b8 + a576d88039bb748eb245bb42856f8b11 + 7a5589058e9794f84d3a1cc2bdce0d42 + 9545667469276eb82bde8e1ebf944d09 + 78e3a834bac88b7d7aff99923e52d66f + c2bc06e769846a5751e476d45284109a + 027c9e5516a689bab88eed4f83213a4b + 1cf0941ae6f7a8f05dff159b52335ccb + 6c477fcbe00a6671f2c462bb31fbf7d5 + + + 94c38f1456a8657add63aed7b3f51bca + + ee50485d25e8f65baf1f10eccc8fc489 + 12565d6625f05db7b6ad5775ae6b46ab + deb247957211b6ddafc9a3feee4c9e1c + + 7678c193dcab88c68cbb47c44249cf9c + a4ca4600d228ce9efdff7c3f5b14fd45 + 476030cf878f0a3aba0f80ccc5d20440 + cc1d80ac76f50758bbcead869a1ec993 + 483824aed381e1c102c4fd72f8a32b18 + 292819dad4eeeb91fd1e70e3cccd5ec6 + 401f8e1f52cd84d1a246a2900385f14c + 1c31d9ad0a527514df7d6ce6461466a8 + 296c3ac5fc729f03c35b7de8a7343c51 + 8a6daae661c6a20439a08789d5f6121e + c0cbc13172326db4210eeef18e474195 + + + 7acc1ef47eb0376779f8649fb518f641 + 60470c4bd88a897c0b7ef8b5d551fbfc + 851c488adb81d4bff44ea685ac39edd6 + 6b872ec795788f2de4a29a95928c06cc + 9924607a5d08696dd65ac13ca2ea19b2 + 5a708b89a3c11e09fa593c7a4ef7ca0b + 48de64ca6cbe676e1b8e49174f6b2364 + 4d9513dac77b01eaa7309920197652b4 + 5b80b3c7081d8a4ed0f9f34e182072fb + 08e13551ec74fbc6c921a1c981d330b8 + 448a0878f9e13e8b1a050099e802af4f + efe6f101d5283bd1d99a1d7aa5a37125 + 66ad7808c70613e788de11a5b9e0b0fb + 07f885633e27201315aff2fc2525156f + 801d28dde1fc05259f379081b987f27d + 5c9c1297e758f8d93b5b0ba17a911f02 + 8d3d5f870388fffdcf717fa2f8fccb63 + 278e29a2ecadff4b86909526b6626e8c + 5bc7001ce9067954c6a6d62349a52247 + + + 30c2d269196388102253f465c12d0171 + 85194215e07731dc37039dc07818d2c4 + + + 15324eb28d375fe40618990afdd3d152 + a20ab8453f4a74c176149989d743a686 + 42f9c40861949ab085e8749d24d6c655 + 05a029a3475155b37a80b9a0de24157a + + + 71e9462083a9e8145641b7fc605280a1 + + 822a8ef98abb7fcd8a032833d389c436 + ce6d0c2a021e34696b702d634ffa0efd + 045a0f06a96301ab4b38da26ed3b951f + 28ca47fcd27935ceaf97a59594118361 + e0623ed9e25f7838d6789f4888f81d44 + af476cce6353ef3c057ed827f9255f0c + 63b8382f10480523e4e5408567f74d22 + e90cc9134e082b3e5046a505510cf8db + 33d17a4bd86d6743f3fbdb74926b0c06 + 65e4605dfb1077dede8e4cb7374a9a4a + 5207ea74615aad358ad04a07ba811490 + edc3de2846fbd9929ec6efe77bb362dd + 98632ededb4086223aa5e152d9411b3e + 200319b675800c1339ab7e60d605957e + 4dd757857e1760f46f2d847903f0168e + 5217be69ee9dd68a10984a276b2ad14e + a82c27256a20918590db79f298bd6c2c + ca96280f41c59373eaeb424abb43ed19 + 53f96b188c4339f1ccc5e25c9256c30c + 144eb00623f699339b67014e6dc19136 + 5a4387c7b86c0225dff7afb85902017f + 6aa0a92a7d7735def47d1c0185cecd27 + c6f05b38c00033a2e630c216a6fef105 + 42b3ec9c1fe1d71d6fa0ce5913a3d877 + + e8fa390a291a41eafab5b6ba61adb096 + 2a7f2703857006985895fc45d430327a + a14b745e654c9c6c67351e8db076d7b3 + f0e30ef4a46e213b8c21a00ef250b955 + 97282aa7443230aa8e28b7fe21699758 + 6f9fc1382808ee7b82d5ff661877147e + e9cdccad228b9ddb14b1af46ef502d09 + f3faafcb6dd5c0b2cda43b77f351f2a6 + b5e99f9ffe84112839f2b594b78bbe4f + 0ee0e43fd0b93cf565002f7bb2d20d62 + 9583ccad24274f33383b62794955da81 + e680c01cee1d59dec6500bae3a4c2dd1 + fed18a532743147b7f8c047b2c6e5198 + 2baa57158a11a38ba24aa3e6f3889603 + 3c12094754df4cd271fe05b49dc5e2f6 + 49120936b2eab819f6ebd592394e2087 + f56beddc2217f8217bf92527f10117b0 + eebdf605debdc36d7a2c8b382c354a3e + 75aad7a6fec0c93c1ec238d64c09c074 + f9d40d82a6c77d43616a657d7d9706ba + 42ed7e1336446f556d522969fb2b150b + 476b7b24ebef060950e5b7c0e5fe4f17 + 9d4f11e40c7754fd52e2637a03e50c90 + a5fecba1b1b98cf12b9c6d1db4d665a9 + + + 564839293b2951ae26914d25393981c8 + 6b1ac9e528b8bc649489c13d1735fe12 + + + 921e6de1f054ef1ef09cb24cd24a5423 + + 93a45cf584db3f606f0f6e42e2359d06 + 77cf6445519aa9743e1a62614a50de1a + + 2f792142a7c81e31c331a7e62d5485d2 + + + 08c6e021704cb75f661af7fcd5e4d8ce + + 61134a3b49a355b8716ae938889e2268 + 32f7cba5131dc70e6de3a2f59c1ed0a4 + 0b88b8adb77f9f950d44bb3ec554b673 + + + 331d237394fb21e2c9a723933379bff2 + ce9e4e8883bcf0cd06bc3141258c502d + 45fcf017e436fc38333b97f7110dfd8d + 661b43d4b77fb2e2e4da08c467d86c8c + 57d6bab77ae44d2c231525a4804f6611 + 1bd57177268a1f4566ef0d8ef1c2b34f + 47e8a30907a50ba5391ebcc39f4c9a5a + 793d40291aff2ce161535aaa7e0fef31 + + c128e1eb77b1e4c91274426b4c4968a8 + 312ae70c30d144ff7eb0d04eb4a6f599 + 0ba4cceff2a368ced776678f5f8ec20e + 986a21482dc50a8963af2b515f06d001 + 1cb8480569aec38c0910b7ec23f9b0d7 + 9f457bc6519d948e646fcb1540941f89 + 9d73cb5ac45bc5932988617af7635e6b + b647dc78007f6fd9c2a901ed75d8b35e + 9cbf88e5a078db14dd6d9512964ceb40 + cb8a2ad15f54e69d4baa429b245763b7 + eff10308c67c783ab645eb5eb23a0356 + 752efdff4e23425cc2da5c328b303393 + 894be6b5898dba06a4941acb23f6bcca + fb564aec864995892e76d64503003464 + 2cd4ae1c39ad347062a611c837aa3df8 + a7b48d329dc5f5897336d174e8f64d5a + 934e6424daefc3b87c064703039e1223 + c5fb437af20bd256d2c1364cd9c3ccab + ee10d17459ed75c4feaf666aae26d7df + f5cad4b82dd2b9e7134e66f038dc62db + 769aacc6f8382d6dd6f4b213cfab4067 + 957773ecc92570bd8aa836323368f14c + 9e617f8add22bad0f085abf1047a7885 + b252d7b2106946c05dcc803e836bbe92 + + + + + 1e2ea7df64f9a0d1c6b4cf83eed1b8f1 + + fbcb9f2c1c7cf31366e618d01e28dcdc + 6a45e66f38c2b8ca16d713874c24a331 + + + a980ea75e2014ceb5afbd89a2d49b1e7 + ad1d61f4d2e23b178a224547c0ec8427 + + 42dcbc5ba3cbca5d3c7d860c7be370cd + a89aeaa976dbfe7488d137c6e0d85046 + d12ae10374a2d4afa2161adc50d27947 + f8ce5c2b2b359eb925df00d0f45a4d7c + + + d10763b03b67c0ca63bcb25b424f6368 + + 71557003a10ac76aa6d021e66b2fc57c + + eec9e209eb0e67175efe82810e9fd937 + 8ea2471920c2960a6af5ab554df6e017 + 44a1b49053bb6429fc1ca73bc8d2b360 + + + df849c27f5a8e86f9a2ad8d6bf6a4be0 + + + + + 8f5292c2f6fb3e201274d4aa429365fd + 2fb47b6be535ba82356dc6c0c5385811 + c3a95965dba6673b4844194848b194b2 + 958ade2653c9ca0ca6bb78cd3d2f4195 + fcae65e4d5dfd07204d7a0b77945452a + f6114b1ecd13de5f14aacf3e9885d46f + 7db8d48cb37d7d196fdf4f0ff65c6deb + a23b553d9e6a82797ab57f500045803b + ffc51fbbcd57ba6e921cb755b70cc15b + c39368ea683db2048b515eb437467235 + 9862a581ac6fc0ead10ed18422dedcef + 681c30f1a63397cdd97f45148778a4ae + 789284c1dbac221e548f6fcd43e98030 + 18d852459c4e81119aaf3b31fc5ce584 + 58592e2537c17c34d578e2d12e830691 + 0af5dd4d108e93933a4a081e9c65d5ac + a41c4bbc7d3c5be6db78f91913452c04 + 8007acde00f0b61a6e12c537bda7b7e5 + e0de69ad12f1c6fb9f4ae496320c36c7 + 7d312d041bba5f361d07391a176409b9 + 5293a481fc52b41acd447fdcfc24c94f + 44795c0b4c9e5ac0b80f9ebdf0d774ae + eadbf1ce935f05ba4549f4f4ebdc23eb + cce958f96424475a698bd5eb45fc941f + fae84c976931c0789a6ea9f183ed4709 + 310fa9d8e75e5da091e97e45e7db52f5 + e99876ff158058c5310050b9ba77faaa + 171ea94c812509df090cc68e52830f67 + e42bea0c2af1b5a53dda2e8d349815c1 + c765b871ff0c5e399874ea8c4f2bebbf + 890590b207795fef0351efae32e137df + + a67e2ad41a9d8cad7921ca8fa52459d7 + a868862021d8b82702d568e892fb5459 + 8696cb03894e644b9f8d2f66837ae6e7 + 2b6baa1cdb8a5c40f9bb2bc2502c97b8 + cbe70b1bf5af82e905833cf41357c98d + f4f5e9e696b65494cca799e8a54fc895 + a6181da95ccdc5d570d4bcec2efab1e1 + c12101659121f4c649a2eeeb32709d5d + 44ca9022976271854af406b5432a5c9e + 7a72b4129a81709f1d55553b291842d9 + 50eea47ed255a4c4dec4279b1d8a7f56 + 9aae853b186fab96620a6e8f1d8fc7d8 + d507db1a6e7476f8a8c3f41e6a0d5e8c + 326382716381747d72a188e4b49a033e + a440d6a8a1f0e252b3349167fea79a85 + 107b0218e9f34bee02a8f334883f24b4 + + + + f6415970a7f12e623715d64930284cfe + + + 4af57d02681ce09ece79266f46c3614f + + + + + cca73f8de527ed27017303a7ed752d2a + + 8eececef0ae9b7a75a09f24c88faa268 + + + + e3ec953f07302813aebdc7cc59cb6627 + + + + fe3ced0b0277a96e3d89da79f0927e45 + + 8ea19c76ec2c01697e149bf117e98576 + a7028470b28f6abe9272bb12518dc346 + 2ab0d0cb47fd4869c43d64ac2080e5cc + c9edc0fb62b207fa209e7495bc0c0281 + abf48d7925ff1395f9996fff5591e83f + 9d0d47312c94d368717d73fe37dfbcad + d0728b646fd20c0fa1dc47d091508627 + e68f0c3660253fe148c46bfa6b952551 + 6a125eaa8437f05195b715af10c78127 + 05bc545dc58a8354ca5f93b37378c7d9 + 0d8c8dcc8aeb515a26f012fd10b6d9ea + 5ac16b53e44a9eef7e77f2d81761a9e6 + ac9fabbb6d1ae9eff2767cd8f9986946 + 170b05216a96d564d24fe5cfa401b707 + a82b816ece3da1ae989f05b891b395e6 + cbf06c3349b5ab4f98db73e283d07efc + d63492ede611440982a6d504a67b79cc + 9ae79406334ca8bdb2f3740d2ad8551d + + 86ac4d3032b90d83a8dc0fe7a5699568 + aac1aa6936d9fcabdada6b26ed36d42a + f7e8a5836853114eef843e3ac5c22111 + 1e6421741eb5ff339544da534385b8e7 + + + e1dfb22c3d843e4e43e17a1f0d3c0ea4 + + + f1b06af7ae28a18628370011baab50cf + + + 6e55822a35f82cff0b8fffc0ea8d2f03 + + 3519d78779904a8ca741c1ebe7259f7b + + dc332ff4811e05939f3155dc1a732d58 + 38f99f8b52adb03228c544a7cddfd717 + + + 290baaebd5fa31c509d640eed6ba24f0 + + 7c63110f2a73d7ec2d91efeef1fab208 + 6b9c835fb24fb3b6edd96fab42e19296 + 13a02fecb23f5b5dca8edc4095dfba2f + f2290fec929018d6de7cfd6dfeab4d2a + 2f82d8d18f397aa9ae5b9d5cf7861dfa + + ad888fc29f2293bea83a1622d93fdab6 + + + d28926d3fe93abcab8e268ff6c0b218e + 0b44bba80838082200d8a0605c21888e + a961668b88f7fec45ce8d0031e6ccfa5 + 204734fedd03dc7e88194f5ec5b1e77c + fb5296ab7b43c2c15384200c0d1cf34d + + + bb628ada2279cefc90f571513182488f + a3396370658977fa27530effb4a459ea + 729ee5c01b9ecc4b617920b7f2faf3e8 + + + + b0aadab7deef87e606c26f4f4342fa38 + + e86ba6584c77d3c6d756a86b7c2d6f5d + + 9eba046f3b5f69366900383a09db1077 + 010eb56482e1a2a09dc84b7df9dee0b9 + + + + b15c85730a8f92b77d46f48291e4bbb9 + 63c5d1f245f4b15e10acc5359b94057b + d97900b0d41dcb44f8e0c3aba3c75abc + + + + + 154a68d80b0e5020e23b1277e97cf8cd + + eaa3cb6c43744d44d8f9601ba1dcb3fe + 8e678e41570d395a902a34b01b1c74d5 + fc6485d4570e4069720f305ab87a14bd + affed41b62195054881e251b6d43d215 + 41105ac56887485b919bd8e9360706ff + dfb50bca7e5ae02d8daf1251dc8b9797 + 0acf72dbb1a8d4da6b975051548beaa1 + + + 3dbedee5b1ac636849ea1238301082b6 + + + 3908eccba950c8d023082615747d0daa + + + + f90da5b401a43820365a91fc0e859cdb + 01b263047b23016853f93dc4f49ba968 + 5d4d0747e9e0a2d2bc0337e35b867c8a + 07d3f305f39726765d9b538f3aafb724 + 2c54f5fc1b0da99ad64b82137f0f012c + + + 22debad65fa3ef90e8a2b9c798aa2a1a + + 60fea575f08dd7f3fcd13cc3584ae467 + 150f33e02ccdb0259be3d87a3e389c16 + 14487c6d981bb0b2e1c60287f9d90488 + 09eb7b4c62f523197e5ce1f9af87196c + 6171a7d0fb3162806c89df9dbc1485c6 + 7d1d2fbf778bfb0848a15defa4b94b38 + bc0a0a0baae6652a29c1295250d68bd2 + da09a2e80ee0e3109937ed596f6cd252 + d8f7b1d314ca8153fc1f30afe496c099 + b9a56f05fdd023ba28b61093eaa77f9b + 5effda9f6c4655526d2ae9721363b710 + d798be8e519bccfbd81ab3ff5e7652bb + + 749865932f375a70e325c1cd5a679e07 + 157d07d20f74637aebf47e421a12ae24 + 2c2e1d0677708216b7becbe57d9d21ac + + + + 2b72381a23c1b63d2d5b6796897cc144 + + f9f370b2fe20668fb6f96d32b249d20f + + + + + + 27d55c200939b9741188230e189df206 + 5f62d96b1b326e5054835b35162b5a1b + + + + 2d31c1a8136b305fe26e66e68a126bb4 + f9e6b2d71ee753a86e8de79fe8c32b15 + 9742a31a3e24bd5b3f3d9971342e7cec + + 6eb5e32a565f247832c2a00cf90ded7c + bc613a87b2f6eb2cf60ecc5742546b3a + 242e68562f534dae4eb0f1403015dddd + + + 6eb5e32a565f247832c2a00cf90ded7c + + + + + + + + + c348ff0ed0ab043d368264f252570755 + + + + 70872564d93a655582a1f409c4c36ee4 + + 4676afbe7c8372b18652a9133cd88ec7 + + 99c5830b86a2e4891a6998b19d14d643 + a35c7915dfe9c4031b35943c74b83eaa + 51d31cb3d0e376d3cb3150f69530e8b0 + 0d4573ef10b88f4d2177fd6c5dbb792e + + + c6000291312744e85b5dfd14a39bb217 + 3c2d553208828b194a75bfeafb583742 + 092d440d86a4e376f0e8059cbadc4300 + 1b7322ccc825595395d14a6059a74dca + + + e899a20229258cf44f940b388c6dfa83 + dea66071f08488eba0d39b53cbacae4d + 2320309bbc8978ce7a0e0a1cba093048 + e98a89471960b2916c2712a195a97e4e + + + 5cbd2a5fcef36433415553b4daf7b536 + 64b2aa5cdb9c42b3558eed9c2ac39b8c + 525e96193522c5623d76b6fc1ee83353 + 654b8b43062589df79432d28ed71f4aa + + + ae861282324580cc071bb6a26d10f13c + 0b238bf746eb55591042337af6ebd081 + 0bbb37235491ac6fad2e71409d0a9a9a + 2f4165216730ad663892fca2756c3a03 + + + ac76fa5d4a908a80609946fcbc31b9d0 + c9cb018b7cd51effcc92768b690f084f + fbef8f86cb647ef30f660ae23c4b1a27 + b9c00a29d615f9a51d6f3dbbc78ddeda + + c67acceeaa60c3bedabaa4e5f43a854f + adc311cfa26e1e810211374be40c22e7 + 134bc2c71e40985da23d060b425aa143 + 7794b6dba4b4cd4f84a0538ea9070f3f + 3c9c1c61a31fe30e9441e7f69b241a8e + 42f1b5ddc6547e3ac6b7e3de9ea0d040 + ec0df69223793bdb953f443ff6f0ca00 + + 81761d357ed2dfbda2cb031c74c3b487 + 4b33549359b9859e34501903390388d8 + d4814bc320584de4e3c4ea2173a07eb0 + a524f5f4db00324654f5130ef94d66e7 + 12d34b06d188631f5cd600dc29c4e6d6 + c565aca1fe34843c15109ab5f7528450 + 3b055c2c14309e59cc5d0b9054485f8a + e1a5957e24dfa9ba3bdd750bdced9b22 + + + + c793a75ffde68fd7e9f2f4c720531187 + + + 5129d172ff39ba8552667462c1ae9eee + + + + + + + + 1c60e7cdc5a8ff6c85a7b2fd4d0692f0 + + 2981a22bb9eae534f81619ee6bf26626 + 581e0fe1fe6ee934a7441eda37fd616f + 07983208e009e72ffb31a296d32fce1d + + c3fd7ec7ad945af9e6f4e4d3c71738f2 + + + + 01383398a0f9c6dcca698cbcd3ce46b2 + 41ff71f9a89f20131890032eecfb3db7 + + + 45ef7a7a549a9210d9e4743609cdfab6 + + + + + 91617a958bd19c82e57b2c138a9e749a + + + + + 44aa3c4f10334cf416d6f53022e3e4f7 + + + 6eb5e32a565f247832c2a00cf90ded7c + + 82efce1eb1bee8f2e0a9bff541c5f229 + 90cb720ab018a38f80858b80a083963d + 2b638b8ad42b596e9e93b419450fcd30 + b3a5b2e3c89e7ca35322fde7c2471311 + + + + + + + + c320e2b5fddbf6d969932d99ae586532 + f9ff26278d088d9284591d308e390427 + + + + 5da50d1463b5dc795df916bfe6d3a72b + + + + + + + + + + 5c969879ecae40751ec649bab84b4e64 + d35f680a6a04004f6ec323d8a8438a37 + 0279abbde39a7818e7a489f9543e45cf + + + + + + 8e92272afc916d3db42502489de593be + + bfe741c34789090169585fce351dd951 + + a4cc5a5e546832c505f2cf1830e61a9e + 36b4f1e24b55a7410bc5f72334d24afc + 3af938e8e09505f74f5f731fd66753b0 + + + + 38b40aff4de1235326a1ad12b73bb801 + 690ba6c4d34985e2c27393549712cef1 + 26e54f2c9f61fd4d4c78e5abe4703081 + 27b34fbc29c9b0d39d3e9b8a7cdcbde7 + 1e0dc8c94a8150bc0a9a2376b9624e31 + + c855b7e57122042ccf1744651fc15787 + + 13858118a01a13a215f446e9508aff4b + 2cc3ae1caa9f461d9029f3f48aded819 + 3ae54736a9ce612fd63280659c9829e9 + e05b848d731282484c791b6adee3c0a5 + f2d266fe979ca743c242add0df2b6145 + + + + c9ba61294eab386736ca9af500dbba08 + da4a6171fe28878e0c74b652523b78bb + 041590b2a520fbeb2935a87116fa3eee + c64d7017d90b11cfcf70696faa4b5dc2 + + 18cc1f85ad6fb281d2aba789e8738e62 + 0dc8b4a29bcddfb0cf8f6cddb43fec45 + ab0f0d5aa241a5b5e982c2a597dbcfb1 + 83ff84f3bff0c095f9de48f082104bff + 8ee2b09b7a3ec031a44e373e8ef122ec + e3d3c0305e40dbe253dcce197ceb89bc + 036b38494c91d7440ef5fb43569355f5 + 53e8dc87a6a89637bd28c71a733faeb2 + 20d5aad1ade347d9ead86f7be70197b4 + 09719d637b2909c98762349783079a02 + bb8ebbbf7b5bf04de193d0ec9d171c68 + f2862b5a0798f7d82165a32c7daeb1c7 + f1d5173761be59fb3593eebf4412c73f + 2af9d243ee6eb1d8ac12bc18135f3da5 + 724dd00b6f11c15a17a4da35ea1323d9 + 31064d715669d364b39343ddc11411c4 + c1c2bd96515f2c2c3965927a02eda258 + e0ab819102516be080b6f7a520af0a18 + 574d54fad73aeb3862daa846ce24d666 + 6d883c82180dab9fa86fb2b80d2ceeff + 1a7a7ec819b496e0f40c913a600c82a1 + 3a096a524851f88179eee09dc0dff418 + c6c3f5effad70dd08f56b77e8ea2852c + a252ee5e1e702ffc17b911ecdcc4e1cf + cff15233e32721f7587c02b2c3e1b867 + cf1656332f0f47cb1ebf0e63362ca80d + 30b890756dd5628b684654218d611d48 + 95892800ba48730af8510254a4aed6a1 + 5c09d4466eda599f0e4dc0a7ba72041e + df300ff1b26027b01bfac6402a340f8c + + + 3ef231adfd9e2ecc1cc46c219d179d5c + + + 0db98d0bd2eb042b6a75189869f308bf + b1a0e72bc782ff84276c62d9ab583565 + b49ae03b5241c80d2eac5b19481ca086 + 55d80fd4e7d986f6115f0bddcf6831b2 + c55378765869a600cc87407e819ba31a + 43aabef73e12fda3e42cb573d52ae8d6 + 4c76e9b056adfd65f42efeb78484b3f4 + b67866c2e940aaeb3f56c52ab7a0c846 + 7ce0ac8a0135644ab5a11a40e1999811 + + + 0441fcda2f2142635db78c3776c223c2 + 2a278dd1036ab6ba3afc3b5cd685c675 + 0befc2d99e194bd83dc873b9e2ca8cff + 65db492f9f41804edf07482fa3507240 + cbbd8f036385b512231316b9b11eed73 + 05f33771e7e6f42966f7e429bfe23f34 + acf7313cfc17e92bc9a21877ba6f1b40 + + + + 1a5a17177d9a3bff69345f6116497e21 + ec9500a5585b9b3c00077f127e6938eb + 16d5f71c7d51e00c3811c545874e0203 + a91ce2d06d161fc5c29138d20f4b7ec8 + caebaff54d57a802cbbf040da7e3884d + e50317e64499de1d11a868b75e9bc3d8 + 8d85a3d3eb3f9d6ccc70361e6c2a5dc4 + ad576c66e7d46751d9d0da832f49fa16 + + 0939555e8d4d4675c39e72dae6bda039 + 4f756c12414c60cf5a3eac3de866f75d + + + 353fa7b0e6d81d38b12664063f0d1290 + + c12ce7eeecf7e77ec6e8646606999a82 + e211a20c5d3fa61ccdb38654b57880eb + a7dcb7329d731b55e1a3d1af7a639329 + 078cbd7b2f806ca69bf6447ed803c411 + eb0c6b2d04728b13a0163c629092da4f + 9da678881d3412d731bad966db69c81d + 78d1a7ed5f0eec4cd7776062c4f22912 + + + 670d4bdcf80531131c59c03631b2c7f6 + 6e3104dcb55bddcfefdef07d41437cf5 + 2d5580138572a2b6b265c17e0002cc75 + d571747464e45e2206859ac842c2ba94 + 7ffd7e90345a5efd3560280edbf02cde + a480325da44ab8f6bf55f62d05b43286 + 5d527526ca25de9a36416815e3f1f356 + 7e74e9e1d4adafc43672779b7b836fc4 + 2e4dc11883019990cf09faa61a747b92 + 6d16144338ce6090c66352e324c324c6 + + + 86d4cb8d38e38649c439d5933d1d36c2 + + 6c9f00a86e0c44f3f908051cae7e1134 + 5e937c6f391d086e127ab00a67655911 + 209ebf1914e2d47bd6b39486e7c0f1df + c069e51e450cfe55626e0e244a33146b + 6c4bf5a6940b49f3315cdf486d9a1f24 + d61a79b339d7ccc823defef9bd1a6ac2 + 6ffb27a9bda857afcfaf4e6a84985fab + 54712657dd46a4e76817da442021e5bd + a85897b72cd822e48ad077f4cea34c32 + 10df307aecb1af8e3936c08e34677cd5 + f77377fa1e0add7596f1534786b187f5 + 784f9773deaa67aeb67a7310b719bd18 + bba166c5e089d7f9387ebc293ed76689 + 76f995c5169198f548362ba4009e7bef + 5bb7ba2829ef7a42066e3691a1e3c815 + a510e9a1b05d7f17b208b8fbe4eb8da0 + dacd8674b62bb2a1f2bf3d140895a318 + 832495ffe5f361c84032271118c755a2 + b7a4768023282ae8bd70b1d989273d1c + 7955e70b004bcfa7e6aafb1d1699dbbe + 800184735c2f694b57d7e64e9d1b36e4 + f4945271cef7cfb1c1257690d396c0e6 + 511352f76b86bae090b4ed0faed6be2f + 8cc8e3bffab8099bc243db82db7322b6 + 1fcb3b2e57b2dc5a994a9c9653d99b14 + 15e8224c9b853a035c53ecc5503f2453 + a1e72e0ffa8982fced2dfc7fe09338ec + c6238e10b498160ebe064ef58673aa33 + d03250ff9fa33b77fb48f631a5910cbb + a1986e38eda80dbb7a4f8a1359f2f4c1 + 67e6425596cb704e6a1a9d3981de6980 + 99d375bc2d52272114578c5426abc3ef + 6bb9b7caddb79eba6395d684ae3bde52 + 879d467451ff99f7fb7cb87c16aeedb0 + d77fd2cb4d220aa99898d705b1a8af38 + d2a3b741095d1c83bb1d25fdb1649dd5 + 0b80d40854a0594f7aa57b4c3077f0f9 + a336eed511da31b0b774b8c5543a4eae + 8503d517ffedd84bb1fa55e0682cf519 + 5c233dad5302d4751f64a8e076484354 + bc7ce7d2204e87d1a68ac226698a0800 + 4c0faa356bc5ac6571979b1e69413f34 + f7be0fbcc1e088ae0e7ec9b2af30225a + 8b74d84ddfafeccd96f5f65f2858b89d + 5a11821379421a595541fc81f9f26ac8 + 79e5ee96c3734d0e17ca82b2c4e73a81 + 965e8da2999e5f33ebe1ed9f5be75491 + bdac46dac180fe377dfc87d177a9ac75 + 82f95faa126e304eb016be25068838d8 + afa212e822cb8d8bf9c8f8a16bba7173 + e1a95614860ef5ea9db51bd1cd839c6d + 28b8f409f1f54d951c963402b732553b + a74e94e68b12eeb953ff85764f04f9f3 + 3b2a76227ba34420610676dfc5a3446a + a6c7ba38217f06ef1c223811035adf6f + 7b93b75136107d4d054e35e345058678 + d4348cabe42aab9a086fe44e97ca7ca7 + 1f50983bc0f5474144bbf95afa78368a + 2893fb397b3fd278302fd7ab0f6da01b + 2ea84072ec8472911b0d6ade131391eb + b6ff4fa85a1b4fa6e556e50d3355c080 + 660ab8a11c3edd0db224f8823321c2a5 + + + bb179dcda1859439d57ee678054bddb5 + + 535e4003ab939b2edb533cf0642bce7d + 57c45cea7313e9c9a27a8242ea1f2360 + 6cb45313c15cd11794ad8a89d9b5a6f7 + 4af7af30f950ff6bc5078909a6446e6b + + + 965aec091556aa49e8d57f0473a8af9a + 81057f90a7766fef6fe216cef64ae633 + 394a7c7e51e3927d8f71e015d7fb109f + 499eeb6512540b47ed829b8d487ef451 + 2339afad60d25370bda72800ad75c5b6 + 24dbf6b5926df8b9f6db6955bc7c6841 + + c6b9b6ac460a237547915946228e0d4f + 4b1fac1f463f296f058a651ef7acc916 + + + 92edfc3fb48253344cb9f5086ca663af + 6ac9111c8d18e1cc2902c1f0abffc318 + d608d34ee0f43ca7422547c8fbb83f11 + + + + 2c61ea3c3ba81ef319514fae033e7ed6 + + 3016a4eb20b6d90a297088ad2ed2b534 + 593b5eb2d2d629f08d9babd8747be378 + b5f9eb7065f964898e9333959e972186 + c5c82593916e3d4dc3c2db9f0ccfeffe + f98bef380a0090167fad0b4e059053f1 + 2ebfa99f45f37b6e59fab3365eae005a + b66b81865b33304ed72cfc4d61b20fd5 + 11f56d170f513441b37132483067f3d2 + f6b260ff8d06d81a25869a0573088df0 + 13942ed1ba56d7259947074c75574aa8 + 21f9f11827594e46a999ad6956d27b18 + c2ad0cd25dc5f914750664dc975c287f + 549059c15c0c21bb545b828f87c98475 + f12c1f9c49730656fec31d30b890248f + f915e43b0d04ab6935605cd0d9effcd8 + 5697ff7c47a093087c3dafcf5fbdedcc + 3ddc48d2fd513ef66d360a9146764733 + 23fb95b79fe27c69b0a6d85ab71cacf6 + e245f0ae90c4b6cf671b6923c1486d12 + 46a4dfcc3d7887acb3fd8c11c6ec3147 + 98aaff30f5eab6e17d738fc178187dd4 + 11c87449e08446c4c71444701de535a9 + 9ef707ec524885ac3ea0e193adbfd2d5 + ef698c8479588c2d9b18c7d4eda21955 + 47874abee43c3e89ff6bd404789dcb23 + a462750c8e2d88f5a3e9a381b9e6c439 + + 7be8ef2c012ab8254f5d4019fc2d6208 + 7d2592f20d6f315866b408ccf1b82954 + 78d64ad00d2899777de5f815ca638408 + 3e28e7a4fd62ebe72f8d7e86154f940b + 4e8732529bad9779a08ad5b5060be383 + 6182aeac5040e14892b26518c5a0cc8b + 34ba66124a53f240c192cf2ec369ab0d + ebcc5452c466d47f198c3c112f9da990 + 32d03f7f1877077223df1a5867b62232 + bb21035ff2b18be99c0ffe6de8d21270 + 65c3faccf3bf86b0962e43e548f4b7e5 + 9b10599eaf35ff93bbeb010c9ab3db9d + 0533493507bfef1b4cdd1be5a19ac432 + 43d30688e83c0cd4273fb805fffea52c + 8acfd15f5c535ac643ef404813eb8553 + 491187c5fd710343105fb11046cef179 + 762a5c75848d5daeb61f89550478d629 + f5d637ee3c7c033e7ef5ddd7865dcb07 + 3da715c3a95aab0c93a635754184e4f6 + 0963953e0a8bcaaef721adcf34ab4a70 + c543736881b8d5390e76684759c830fe + 5afcf0ffff6c4ee91bdbcfe623246b5d + a71ae0dce63f35be1e8d2a78aeae90fe + b3a926032b3f91d99ceb1a5358ef44be + f76832f2278e62cfcd694aab58071367 + e9231ac65a015e3cd8776546f0c7f3cd + 46aadf04afc9c2df0949295b44c3e488 + e9dbda14607976e9d2a26fc0d35ae75e + 67c3c4eeadad8d513f4864107b0a02fd + f37c84801a8720101db1833fc91de89b + 2f9f88a8f6e17f1810d2791e859108fa + 7546c0e137b0921201970da43c936ef0 + 8425aea8187de19c9219ae3994ef8266 + 64e28382ddfdee5441c775637057678b + 651907a3af4727df970310f726f488f2 + 9f6ab0f0b8e36b224df589b4b80d2887 + 779f4ad8ccbdf234828c95333db4db61 + 3ee0944498335c4970baf694458b834e + 4d08064c45a5451f3f19dcd4e2d5e57e + f387d493733ad9ea022d50d3e2bbf718 + b41e68747de1a7a325834fce72a6f781 + 7751f205900437b436a6a515a7d21202 + 91ce0dc13c6ba1ae64dd568f2506dd2c + 67228f1f12b1d3fe44313b7824eb062f + 7ca3201afce1c017310eb69380bc5688 + adc6d3284d997fe426c86806d9e723e7 + 92e8aa4c4693e070996c35910e0b442a + 00c004b870c1cfd08f271bf03f902c80 + 3db7dfc6a295b7c5ef6ded8fb4277d1f + f951e1f07e9b1b1672b525b8aa4ccb3f + abe3a5b8e713c7a3f6c4c9d1d0de4124 + 0a8b7a20c81e5e5c9e823fcbfb578675 + 615cddb605a8cb6185bcef20ca6f1f43 + 6c0141a5e8f0160b29fb315efb064e90 + 81d614b22982153d10328f947d0a5f60 + 11b0b028e5c7fe8d8e0006fb36ed2640 + 2b9f9d05e05c304e67b97a06d01ea257 + 00e738353bbeed60f598b04b2e5baaa1 + 694abb736c70611af1d3562c36bc05a3 + + 975ccb1c5c9d167bec0af0066f465ee5 + + 107177b956da6228f1178e97b92b45f8 + 132d75065b23b925da519bd9e6517b9d + bb94c4a6cfb8fa7298e9564808acc7fd + 0086fdc1da07de081542daf61ee81d31 + 320ff8dc913981efd0c8552e436a1c1e + + + ec64f47744575ffe5e0c4cdfa3ba4d2c + 905b3acbd662c4c468e77d8cc0d5fcb9 + d0f299d466984593ec22befd39dad9be + 76758b74be88892072c472a24dae258a + a79f6f4ee48cc596ca23076352fd88f2 + 2f0dbd1d0db3e301f3c49183e9fc057f + 1d2b55ffdea4dac5c8281f0b534b4e8a + 8bb008b353bd0bdb219fa6cb7ea473f5 + c46a941cf0c84e160dec07fdc00c3e25 + dba6ffc51f9e7b839148e7951403f111 + b0e9cddbabb5b5d4ea36e601d78f42e8 + ad4f336fc79f3dd503b696ffc03c2255 + 441dc0197e825b9709c1da24eab91c47 + + + 2cb2b8f1b03b5c51a82966f83f0a70e1 + + adf3358f4740115b8324831cdda5ba99 + 114431f8d309233a32913c5200c3d0a4 + df72f1cba27f9b72fdd5d6c6da26c738 + a20150b9661c2b7ee1a5a5f5c601a3ee + c8ad595449e94f559abf75b3d2e6179e + 6afd4fcd2c22d9b76eb488202993331e + c0272682a8964b5782e1521a24ba0a52 + bdfd36bbc23b958d8da98ea92b3b1516 + d7fa86475ec68f7ac17b6326f4648f3b + 5f01217fe7b5f118a8a0b505f2e2b075 + af6f9cb2c2762de52f60e9ef5c006a8f + 0561f0c8a5e8a7ad14904b5dc499626c + bee137fa31aadf3bbbcb72d07fee864c + 9de99528d3753894d0895d656bd565e8 + 73de8dd3bbfb90e0ec1f8c9824ff21a7 + b61df35294db248a98ea98b39d8f99c6 + + + 1abc86d78bc1a513ff4747ef51c00342 + 5902763c1d03929aa53b7c08e29fbe68 + + + + 6d9eaefbffbdf8829d4a66bd649eaa0c + + + cfaeb4fd0eb70ebe58b70dc1ee5eca48 + eb44bad463ff94a1bb2bbc44dd8a5c5b + bdc418f60cdeb34a2a205bec25abfcd4 + a077cb66a34e369c72c76947eed06fb1 + + 7dc999e177c537d884a9969acc0bd784 + + 852d048cc4ff876ec9d2867f172a82d8 + aa4c810f0bb65683f8ed667204950c36 + a7cbea79423ef34b6013a51ee36577d8 + 7362bb3c88d243bc6470af3bd8ef3ca3 + b577b29da83635319e308a337375fc2e + 1a2794ddf3f91f05ffd40a64003fb276 + + 0ba166fd1562e6c1e1617531b58efd82 + b36c90311019c0b8d4420233d47665c3 + bbf59dac7a6cabc530c8fa554de31250 + 4cebb030da8df0bf5335d7c3903eacfa + 34b0733e291f55c34df28a3ea07a18e4 + 53422b6e656025338d56b1e7839c1f34 + c3bcd3d8b584b8d97eb60164121080c9 + 19b7c99086135f6883295356bfb726fe + c295daebd191189438e75db7a20f5902 + + + 9ccaa052ff6f4eb5ccd599ce5e085774 + + 80067dae044947d03ac629f71b1d9e1c + + + fd05ab2d38dec01363f8f1b1f768f096 + 21ecb66825256b7f7b830e33d29c061e + + + c1639a5c9b38aeca9bf29bf624984a66 + d7b0200379a0ca398684e3c8b3da03bc + 1a8385c5f2f64fc133dd26c9b9448a57 + 92f0087bd0fa2c8290181801842746f3 + 19f3f919678f37b47e657a2a3ec14d69 + e2f5b3794329b90691cf9d3dcadff29d + a1c94f3e4083c5a7e2a8e587eee339ad + + 82aece7cf58e8cdf7e3b97ecf72c6a2b + + 7cccd4aae1c2c2b6380aa87a75a8cf50 + + ee36b0becaa771ed5529bb8507b0fc6b + 29fa551da1d33274a1f20f8402ef4a59 + 247481343bc62e0758832126596aef58 + a799641521998a0435a403641708e1a6 + fddf469818d205f3e1c0560e20ebcd87 + + b597133c935f71106d4b5fddaf174446 + + 7d08af6847ea8bf97b9173463fdf286d + 87423cdda873d537f5147122882b1205 + 174fc0cfcf2a8348e509c616352e18cb + b5776b1261afe23c8ccef093ea0df85f + cb8c2f801cb80d1b9c99bbb5fb0621de + dcbb1d780d13078e4870aa8b2dc8475d + e9cbe82323c3e0d455408cbf94627f83 + 81a616f52e08e2455ed871d4049e2cba + 8ec9b189ecd5711dae80487d7f72ed04 + 0a608b8c640872a266f13d10a9cfd873 + c0152d73446ed526a8237452e8950251 + + + f1f68f811ac0ecf3946cbd83dd788c54 + d755fcc383e673223886817b7869c6db + 9297c23fe859c1ad57fbaf2d5f015784 + + 3adfe7ffa0508dd2b1dc86917b7acea0 + c2e0d1e4bb604388b271c5923880a34c + 6217e2b833fbae2a6384e89d86a5a1bc + cb5ccecf06ab3452f6c35aadddc9a100 + d39b8aa67baba87b6b3c799c0cfe48f6 + fdab89ccc524e70ebee498ab187158f7 + ecfde9ae4dff2e9816435eabff23dcf4 + 67081b5598350f798722428a28f9504f + c297b2e8603118a4a6981d495aca9afe + 42c808df769434a8914c293ed9a2bea9 + bb99a35606c70deb92f45c960479c640 + ad616a8337a78a614626eb3f949d2a5b + ae35391371519c5407c29614e2d586ea + c641848e926fba22e36368e2d9c1d703 + 4757ba26b637976e4e402c877b7f064e + f5a5850eabfe0b1958c2b77e8d0dcfec + dbf2e8e5cbe7456f307f3e015086a475 + 7317162cf791f4b6361fd55fe7ab3148 + b78b0267c0c6aa361563282e08d6bfb8 + 7f676cd7a017d0e23aa213e72604b679 + b3ca47d34fb824338c0e24bb04f14065 + 2056e5c3e9d2f990f18c1754bc028eca + + + + 55d3846cef6b44352b85b3a81dd10a5d + 265b5dc34722460ff5a61e942b7511dd + + + + + + 4c17f4ffdb6fb263f2cca4bebb142dbf + + + 88716c37ffec113539e33ea1f19946b5 + + e0e7b4e0e8663dd5506fcda6b341def1 + ee75edf9bb3db64638e84b578e158b91 + eca8bdcafb7e6fa03b5ba3f4e7ff1b44 + debc574b6d3bdc7ce0f49ca13ea9ebad + 01da8baab915079a39adb54832f3d6a1 + c869de0c1767c70c2d7001ff91997424 + 7bafd6389f7df9ac2de3e5f3e5dc227b + 475e29737faac332534a27be0ad9470e + 79cc5b2e8c2b6989f15b9b11dc481a47 + + 3a5b6bad56a9d44ad29ef758885599e9 + e8b30286352c95b871e6d89cf163244c + 901e8af9cf82c1a0c1e6ad6d1ac1dc8b + 15cae0b3a6be85b1823f8488fa8eb1fc + 41586603414ce5a99c50210d24b84439 + 8cb9dbea714c5c353299c4c84ad4423c + + af4559fd0eb07e02cd6508c7df59b06c + + 149c326566d02da15cb3a56165fbd266 + 355a6d98f00a0eb99e95942606542b97 + 94cb619332c8b2bc5970727dc113a6ad + e6a2c61e461d04f1ff0e30c5c2acd04a + ae9f799cf423d30796c20520f6b2ddf4 + + 3373f4caf8534ebc7fe10d32c15c9ce6 + 016114db1d17e15d7ee199b1d5c22ec8 + 18f50ae9e0f907a34172ff147166574e + 5411fafae4f1bcf4abe49bc22ee6c787 + f4aa8db327126e49b0b710f50719274e + 97f6bb87fc71c1470629a0151bba51e3 + ba503ddd51fa4ea298ea0cd1464cbc1d + 4495ad2e22249b7190368aa00dec1ac6 + + 7326a41de4bef7b92b5a221d65f87a87 + + + + 6be0f07fbeddd52a060b71f8afc0b15a + + dfc1420500f80d9654726f8493119d89 + e98d2ebf0622e3040ac5d27ad10fccd8 + c7571d52d1e28b536b41040d9f70eb0a + 05086560e5c0650e76d77e4493cce99c + ed8b0277103885a6f796134173d9409e + d099f0d05258aa885c9b6f17138a6331 + 1b1f274f2561271ed20b5c78d7340960 + 143d82f5fa1fca51d5e23f3181de441d + 554aa40391db4d7d52997bccf7d8bef3 + + 41a7c981ffa8c3580b0ac507164008f4 + 6ecdee451bbe2f33c78db81a91ba24c7 + bebf4a8488ab44689741174ea9690f1b + f0fd7865d4cb0ffa7544ace28054ec1f + f2c6bd4618746a2413e092523321cca6 + a1bcc2e3c9a36636e2f3e5af332ecf12 + + 604075050b0fefef0f98a721bcc74226 + + a0552635c4c09b33cb2e16dfda65a92e + 3dee77fbe27201eb94c27a83680675ac + c8e65c2318bc00ebf1b5794714628f28 + 92b0456a815d9d578f8a18e645b59e2b + 06979b2d0a879960e8556434f442f62a + + fe42a6b1022bf884d32e1e7a436f5160 + 32591971be1583b950574c2375f2ee07 + 23c8595540646df2aa54a89c9ccc8645 + f7f62b9637074b01adb06ca3d34e4bfb + 0eaff0cfc1b1e1198f51276aa3bb271f + f4a4f4f360f8c22a2119afaf44366927 + a833d6ee0aef52aa345a22b024b4230b + fa8a9891111411c1e664643b3399b5e9 + bfbc0996ad9da63f359a1b64be110b37 + + + + 6eb5e32a565f247832c2a00cf90ded7c + ba93d8bc91d9ee610d027f75d684b9be + b72a962d0a6bde438e4daeee183f5fa5 + + + 6eb5e32a565f247832c2a00cf90ded7c + + + + + + 9a4c018c6e98b044c5ee9f0f6b0864e6 + + af4b3c6463e2597491dde2ce72d0415b + 2bed726115ef4277afcbec52422351c4 + + + 2c8e1b127426ea94369d7d500560fa40 + c95c45eaf4adefd32820697cdfccd916 + + ef57dc9d6b27d8d06748282e70b1306d + + 8b870878a00c8bf1b6e54a3bfd875ada + 4e887680b44acedf3c52df00deda7bd0 + c8ec2b7236ebae78c3ad3776818f8eaa + a8dcd88ddcf1b0fcc73f115451e64357 + c725ee29d19e3c0bbf2c391b7ce7f401 + 0129278bc0c834c77bb8bb8a6df99aa8 + 27c0f4124c41a581fd99beebf235c25c + a3af3de8d8c75646a7796e91eaeccc84 + df153f41d3b0b96e7b8ae6e4f289df54 + + + + + 86b7d641e4defa163b3ccd5d53132acf + 2aca7a0bceded6eb837e9682f65b9fa0 + + + + + 21772a0f8720c16179c7e24cb26a6221 + + d4a512fc0d267f1bedc47de85bb63d6a + + 7bcd3490dd4e07a9c06571e96215171c + 7b4fde364a468bd3136823359ca362a8 + 1e513352de3c9143a452e2da336b2693 + 746ccf5ad61fd7c35daef2bafbe05323 + 6c2c4f3fa1fd977cbee075faedded819 + 8495ed5bbde5b455ceb4a43ca367e184 + be5a6d6c5b1554555af05fdab35fe30c + 3beac740caeacf2e5cd95eb994393ff9 + eb339dc600a79ba7c5eb7d89d89f2124 + fce014ca3eae288cc2f45bb93171e505 + c38044e9a05e624e86bd40699abc393d + b033d8222e78aaa92f6e4cc4b2ffab54 + 52ae66c265ac30e5a59cc939ae01bae2 + 19d83a5f10412cfaad9ba606a1cbf5aa + 3123e17a08a18492c98cc879099fe119 + ca4d3cc6b7268b45472d01aae5aea118 + 49401de100522b4e7212f3b03825c1da + 0f19eb08d718aba29ef5998932e1ee03 + 417194b22c128c17c864cc270cf91041 + 5789b903ca2fff88a17008df71921f17 + 157f00d8e4fd606f26103c803fb4e175 + f6da841074479f48a742654f13e66abb + 67d9500315adda216368de673e588ba6 + 6e1cd03b90b6a5f63ef56dcf9dca3916 + 26b5ef709d4df0d70e12b46ba2bb3fb5 + ed6c2c4844fe9ba89bed67b889618b76 + + + eedceec1c8928ef0db376eac865e8b20 + 6a8141ce6e307d1bbd005793bdc759cb + 1aaa634671477ccf3a1286c3f5ff5bfa + + + 59810356c27959cb036f98133971b91c + + 198e258381467f401166da4219f8f413 + ce3c78d6e37b10422fd28386158f8f25 + + + e14cb31cc301d9914d62a5223832062c + + 466fd1e9ad7347426e4736ad46dfeb81 + 082a54064496dce1b6389310d27ad405 + edea423387b43a09187b2e042fd7a545 + 062ec07706b9de6fe637efa0eefc1377 + 5e51c0072d9cc3e46ffa580d0b5ba0c3 + 45032d48c9071523b9a4fd9c7f19e872 + + + c57e9a056e070077128fcc9f52fd22ff + 3c0245dd10a19ed53236f790db93aa60 + ced052632efdbdef04ba105d14e4db8c + 738ebc705c62db8bb5c91a084b478000 + 6e0e9b18908f692d24a616953a7c4bd2 + 0daa14e0de9a59a596a3a4cff67d34a9 + c0f61862abb591aaf8d5b68535394a92 + 546d15f8581cad985261d34cc0668c8f + c0be3a9d47cc2f75e3073fafd5ce082f + 94e4f3a610e0305d3d8e8b59476b8649 + ab391c595d5521968710129f6af0fe46 + 050dc84bcd52d00a303d3ea86471406e + c851669823c3561530a52cc79d2e8504 + 608a48ccbf0fdf74144248f2010fbf93 + 0bd72d3818b1b1a4227e1046680cff22 + 3376834611dd2192bcca8e84f464fc39 + 6165506a61cebcac138a4df911aa52d0 + 361079cc4f137029278f00f3ec43f644 + 3cc692aea6da3600d764f505c9f1c39c + ce2fb57158fa64acc17fb468165ee85d + 360a82af2b0dc47268e7d123cb3a722d + 052f673211714b3212ba304121d5d757 + 975add264ff243b4c5c2a29cb31af976 + + 3936a107da7acc07ca2f940c6b8028aa + ea7f028deb30be95ee88ca3663be826c + + + + + + a1b3d3e45e8422eed104489842a6f546 + + 0f6dba2689f471c382240c8d2d7892ba + + + 2e6384ec55c011122ae49c2ab31c5188 + + bfcec5667278ee0bd42ec80ceb94b924 + be44c68a9c95bb88eda0781d9b5f5915 + bfb7f57fa6543314c8b8dd0373aaba9d + 5c9c72c263a87ea11590b0bb8105632b + ca1cf80faf9ec7a8906cb5bef9331ed2 + 184f255d1cfe8ab3bf620757a6700b84 + d1456a381affaa3287a559770dd825c1 + 99310e8ff458aaf39b0de712ae1d1173 + cadcd652415401722a2e6690371adf1f + f9a630c6a53df02ba6d1a0ed3f473568 + bf5bf3a9c03a0c91243f94956d778591 + ad92a0c4cc0023ab72636ad29e3c69ca + 0735ba1e0d72921d32b2be57d29f6fdd + 761cc62ff769403e649a0bd5a251fbbb + 44146b8f2ff0749459a2391cc55a96d4 + d706c8324549fc4f11abfb9ab3679da1 + 7d50c6c2cbbe3b334c7461b2d01b380d + e16e88b78b17ef5933a6753db8483459 + bf5eae4ee7059716053ad9263d278ea6 + + + 243998e52bc33a51cfa5e9ecab98f9ef + b971ee322c6a7ef19a7875a3f02bfae6 + 48bdb5a0f603ff235e2185e0675497ac + 2b6c6b9a58e008f9ad30bd47feaeadc5 + f941844a693f780d4218888cfac0daec + 94924c97ef1cf7c208d7545b8a4508c4 + 749a2c0adcdaddcdb0c71d8785c8adbf + 4266ca99292f6337fe36a966465ea67c + 44af0c9a75c6ca7132ff21d128af19a6 + 8eef9594ae888e38e1c5921f304fd1ed + 9d3ab250baf69e023a80c1b6cadd3ed6 + + + 5c820cfbec5d6688e9058ff13b81f199 + + d14b7b4a69e553b4224b55ba8fb8e6ed + + 233fb37b03b358a0d95dd3f429316ce3 + fd4d4badaef26f98ab1f6b7906bf5791 + cedd9dae9fc3b958e1fba48cdf5b6546 + + c44232150f0fd31ceded65ab8cda5450 + 7b67f9ef906d94c8bf3310dee3c03a2f + ff9e3f723f9b72f07f99c110659681b7 + 03ebc8ba70d33a7641bcd07e927fb608 + 5f77a12b61132f281dcfacecc7ec05b0 + e1f56ced29c114077edeb2ba0de15a39 + b7ed41ef61e377d1525c7e958240d44a + + + 0f612b56eabe83577f34df1ad604c569 + 68dcda39a6cdcb5a867f875c7bc25b5c + 232bf5e8e469e54dba5694d7272dd416 + 13840e28ff28f7cb85e9e6340e78fd25 + febab4dc70bf88169881a137c7f9e867 + 97d6aaf38105ac871076dce2b949e8ff + 007d1408c26ad50484913e7a3fe0450b + a6854574291715be20198669b1101fe4 + ed9489fc9798170ed382f1314d9f77ef + 6298b85d7cb368d69c652616f75b226d + 19379b90689b57ce6fd45aee692b18dc + dd77502d96b11c4672481a043e8d99ce + 1f2604d43ec78fb4a7eff242c1313a5d + 604634247e0089d81b89b9147e5e95db + 9363916e32a3dc99fe2189a3f7235c48 + 053448d247e6d3f35fdd6481c80a5c0d + 25c61427a2cd5428b0d58009b87218f1 + cc75bba7a9ee518fc9bf790d6f65a0e7 + 269695146b28a9c3b854d8b16e23e809 + bef00d099144cef6472738a6be5e92aa + f9865fdd6316c0cf4f63342fc3593f92 + e5d6998b98cbb2edeb34d41ed9381d7b + + + 0f61929a4c24e2c196bdd58cfe566a02 + 33457531d46c2cf60b9d74bc4a0f9818 + 82a65464f458e7d60720843d6a2198d2 + cf8565bb023ac73323b8f3c58881a707 + a9ea53d99254631009e54ce72b5767d7 + e2dad2b9c9f093b2cef920fe51c86321 + c102312411eb9f14be660287bef45afb + a7e3965fa190dd22f00fa3abde324acd + + 455dfdb0bc9f208568046f819a4a7828 + + + 47fa3def33b8f0a3399ce77e5d669d53 + 11ee05ac784e9134af3da0d24642543c + + 8ba43fefc6c8231c7cb6143e2aa0af5d + + b0ec14add96cfbb3dc2ea0b5f1cb6a80 + 53461690dc58307295eeb5e2f30606e3 + + + 1ddad36b577ef5da5bb974b8a3bb3a65 + afffc795383c3d375ce1f8d538353004 + a50ef0ec6717ad5f1b2bc815aad69296 + b1994238ead13791bfae55ac6ead56e2 + 35d99a66652595c744ebe8b0ffe48165 + 21d35d02463b602185695b77851618b4 + 7d76686be9f82a742690c6bc5ac2172b + 28380c89a107c47d614155a10a2cbfdf + 962dc2f6f680a67c76e90ca58defa8ba + 5f3ddeed8119e52e8a83d9a2a292302b + 12dd6d349d980eee22f922e963c001b4 + 21aea6427b2a3c2dfb298d02e96ec669 + b9cbb5c7ab498ec670bedc716b4e44cd + 0f39567afbe1f3b9764b1350e494dd4a + 9ab77dbbe37163d27ea704ddcdf27451 + c5e332cb80c6c6e8899781ade19f72b6 + 1797469f7d736a99d4e2aa67f5de7acd + 8de0dbae06c51bf354472389adbdcd90 + 1c27523a1bf4fb4bc1b5efeb31374bf1 + 323dfc88d5b835f16d9eb927804da79e + 6ec326585143d337e8aa91a8449076aa + 98c27e81560886a8243301ecf1356a4e + e9867d9bf1a9e50f832f0d95ed04106c + a5ba607851e233e29b6b6c8ec93164a9 + b08ddfb891716ac35c74b281827371b8 + 417ac415d2e698fa41b3272c3357eae2 + aef75207f4a7ef148d46fd4b0b800ec0 + cb760ff8398fa8bfebe7b3b6ed2842d2 + abfa880ace0da126afa0404db057ccf3 + e53542febfba19782c49cba0a61cc8c2 + 6ae2a6306a4742c4406a3a7978c8cb8d + e7572119a13e8d41d980954283020b1b + a5d0f2c37dc21f4ca4c0aea1143bc906 + 10b09a0750da4d12c0780bcd83bf40cb + 379b2f38f7a446c97d0cecf80b57eb12 + 01beb40ab5790b0f9a914501028af9b8 + 97ddc74ca5ad0affb327e1f593ede768 + c7e804eef84fd4e84555da46f5e67d78 + 6271b4a4b8b7af81af43f19969c2bde3 + 63a87a1f19518c7dc68ff3cd05896656 + bea8bbdbbd31448a02d92663214e984c + 3335a2def92d70d9874c2add986bc365 + 4236b3a52572b275840ea600ffe4c91e + c79d40b21101ebe0f842c84b7f308e97 + 5eb818112d212f5524acc72c63d7f564 + 1812d786966978cef85926fb306081f1 + 6c673a7c23196cdc6b4b430d8d77e4d0 + e9f14e5050c5920c7e9006b9f28bd76f + 59faf50fd27dee28241fd55b16a77929 + a610159b4dc4b4f090faab367df05913 + 973b359f1e0c27649c661665b6cce6b5 + 703a4fcb08a72ac358bf54d1a8363347 + 9df7447f59f04e26a711c9cd289c0d02 + 4cdc8843d64b8954826fe63ab800c4a4 + 636354d2cc7b1e142ed4b4bac719afe7 + 5f8330c522350a363e079a8e1d1eb1e9 + 9c4eee3c6f95f18967d89f4f822e92ea + f7d9ac0023cccb32f6792cbfc82be402 + b9d565109204328be64b3423c9b6bd8a + 74625ff69c0bb72ac2ea00be938fd4a2 + d96aa90796e69c12456daf563af1179a + a2a1e573097a562d5bf0e15e87033db8 + 6e099862fb32d89340d934cdc392ba82 + 2334b1488c1920659d7b6ee5f8bf9e8c + 5d57e91c9d381c65a457da4a66177a87 + 6d9eb286dd0ad35fc9a42e888e437a11 + 0ff4e89d3acd329b093eb0f483af0378 + 1b26b5763bb96c96c98abc3236ee6b19 + 8abd158052b5fe867664cb53dc7016ff + c312f1b6545ddb0e492228d9649ceb0e + eb240130a1906d9c6402db7da045e069 + 41ddfd49fafdfa843b26864ee200d983 + aaa953fcd68ebc340e9cb465e49951b6 + aa6c2d7c88cddca01c23046b530362cb + 9b6c0443c22b5727996017cae9b75a78 + 67b18acf336738ad6b73bdb24e3c3935 + d5f5ebc07893f09271b5910e9515827e + 13afdd560db0a85ef06de64e96bf13f9 + 44bc257b528121bd62f852331ebf7583 + 5d8694e7bcda490de8c69984db7877aa + 2627f4dfc25ae253e56241c1208b1861 + dea9fe25a9d89d5190b302feb5331856 + e38175b69d677589a8898b99aaa5b8ad + ab8bbc7c368a70b8997cee521f0f8266 + 3d2523b07cbea92b6928a2c32a3bbbc0 + f9cfd8c36d7048944f4d43ecff297678 + ec8e59c56d5c044651291bc2fd3ec2df + 376c4ef45a5ca3cb19d77774856ddfdf + 51d2bfaa3bade6e02ef07b76d71955c9 + db04b24ca81b77213fb8dc6b4a34e688 + 21e3186f9b039163ead6c54b6c5d25ba + 91a4d5beceb354651773fc9dee5eae99 + f6e08c75224c0681a0933aaa70122db1 + 8bfa42cf1474478dc3069884a58e9441 + 70cbd0bf5cee2280647c7ea415d9ff10 + f6e444774cbbd417fdafcbd3233e1c60 + 20606c0bb24a9ed5e51908cd49b5aa0d + f7765fb5cc3c042a09d34f1de3cd2442 + 279c77355ce49faf3ba87f372b4e339d + cf02eb79ccac04001536539185d9112b + 19c20a0f38079e050aaca40a1d80153a + 438f7ac032cb0dd31e053c5791975eb3 + 580fe57f57c2633dcbf5ea61f03a2c17 + 239a45c10f6eff0a180e0da5f89cf05a + 0f3e26408858326c3ea07d07cd6f32ba + bdd5c7ed524c8b4e529e5b0d0b512b0b + b59e10aecfd047b3a16a321d10d0f3ef + 5766c211d61ee8e63d84221cdfc0c382 + 8a960c0e1d3326a077ac6f3777fd53a4 + 602bcdee9b9128369fece8dda6ca68d0 + bf719ef499e5092b1745fdc0145544a8 + 27a1c037eda91bea2eee5229e4f1a058 + cb826ccfdf11b69430052c12f1db33fd + f8d19a8c404092f2f789ddb18cbe2c93 + 782d42061de75233348a3c756e7540b9 + e39e05351052579f6db967f06eb34124 + d0bb87419dd6922763aaa8c4331d53fd + d88546ab0eaf014b57e260d070c65ebe + ae58e31190d9e05e3fb9d2f4b60501a3 + 1ffee9b517937b9917e5126aeeb1bae7 + 35af9b45b2e0e12d68b23ce62a78fe0b + 4fb1bc72cae3899e9c27cdd3b355ef63 + 59ca112eeafa80effa9329dd347cf39c + f9a2ba865c9358f9acdcb1af76c75248 + 1c3c1d44844d5a053480f31b93102434 + b8616fbb020064b57fc5f7d81bde9421 + bdacaee370b43ee3f42057e1ce9acc5d + 827049a0989ef1af9d513b7cf0ebd088 + + f80e804b0e796c13c834753912f10ebe + 63f95d906cb28637989b03a165b660f4 + 446e60f704190c269da69b72ece7d70f + 31bf3afba867409fdf11f75eaa3725fd + 214e8cdce1fa501148b20ef3d99a6cf4 + + + b13f7bee3554a608efeac2ef71f2ab79 + + 1eee5a1f75620519e3ef7c52c8da1998 + fa7950ffaa1b063d71e2425eba759250 + 1633327cc2bef18ca3a67d9b762f6ba9 + + + 1e9429a2030745d25d245d9f06f7f065 + + ba4e60686ca80e591742fa55cdb5e614 + 8a61d0e045987bb88b7eb306738d1bef + + + 0effa122c2636c1b1d5ed4b900e51e68 + + + 55e74bac11f0cfab63e7c8967d194eff + edb6d659e0de9a80ff7e9246cc946b63 + + + 22a229b0bff44dc453215c6328798365 + + cff6f5dd2698cec69a91455ebbc4fc39 + 46a190f7fa4347838efb683cd7301255 + 1050a097e9cfc20642cf940a569e89e0 + 6d524caec79bafacb717f5318a6cb32d + a9f3dadfe8fd9dc75ce21a4eac223500 + 2aef81d0d05e79f998524d5c82767b65 + + 397e9fefcffb753d0f91899019e7f73a + eb4ff6ed303ca33d9e799d48e3f24175 + e91e4cd294f7eef140353cc583aeba2c + f5422691867dc827a7e0d68dc36358bf + f8c066212ac7bef32dec610995a4c39b + 16ef6ba9e3ca2295f3bb1e162f1a18d8 + a94574dbadf4579c9674fdc669376dc7 + 61fbff33f92205546366b8af93f5a538 + fe1b57bb06f52f26d1848477660465f4 + 6b12f1aa5cbb06aa637e1edc49f6bb31 + f35337051c6f67617c4b8a856282c60f + 6dcb6f47a697f0b377fe2531fe7bf2ac + 7622d438b9690cc2d9518ebfd86398c3 + 43ec7f2f057779f03b482cd4136dccb5 + 00c8cdb3fd77913667e59bccbb77df0b + 99de2cc1ce10ca83162a51e42c6b287b + 18257775aaf517a6fb695d488734c0fa + b56f15e308be71bca4fa6a379df941d7 + ac849713bcf2f3456f98db88284f2119 + a84b66f7da2f95b3c4f758bc87df09c2 + 782f5a3c041a5c263ce4176dfa9c53c2 + e099d606a1f80f2e48d5e05973a71cd0 + 40c7200ff7fcb89e4b106c3c063f826f + 4868658aa54548ce08ba6a7a7e7ef6fd + e746812dffd577ef46bb19d45d7d051b + ab2e4d49239d9069f8090c1330432789 + 2144c25da36774215186ffc40e4473ba + 734d792760db90c8fed149e7ce736f0a + + + e72c547a0cf1b49417d35b62acaee9aa + e2e54cff61c3848d76a901f0ff50d9a4 + c167c0deab060eaaade778962c2f48ce + b18bc8a722259a390e0a1c4e55780175 + 218483120b35cc74672a773ca8b1840a + f7c7d617a8dfbb4bab090930b5a65c55 + eded371279a485d9be65478f63293162 + + + + 5836f2bf2c494d4de7ae70d602063f50 + + + + fa0d37eff65b124b3849a64a62caf104 + a9830e286aa0f1544b56649ca754de7b + 6400bab93249f12133b6b8ce359f5a35 + + + 9f2e1a2bbd129e3b714a51f3d97e7731 + 08202322ec607e2f334e578b3db6890c + bfdda227bb41be3cb7829786aaebc93e + + + ee5990d6bb62017463a7a8d72c8288b5 + 9cbdedf404d96d4f86325b73e1251523 + 8d583c9342af32a00dd00a0464a55f03 + bf1ca46f471374cfa796c1aa2dd7a636 + c02f2fa8100745b88a85ed30e883fbc2 + + + 6b9aefb0d8434c064b83858eccb28dc5 + 348eb60600953f669d071e850321cbc0 + be08811b7d0ac7d2ae55541952e3cdf7 + 29cf6bb54660fa1bc1ac203adee9c7d8 + 090c3a974f5ba784ae2f848a5ab9db00 + 2b0982b7dce8032094bfae36e6bc7e4f + + + 8fa6034a8e6e1953eb09a76246bba8cd + 5997138854240b61895e61c3fa4e68d7 + + + c13013371746cf36b46fe3dc6fac3d9d + 4cb801b75b88f656604b400814dedbf4 + 5029c29d5745b33b87dde8b304fb2119 + ebfa8a6a68850ec5418a63872fdb7cc2 + def5a8c3c146742a8473213deb05091a + 3289ffc2b1f7b04a342bd941a5519c44 + + + 6c8e3a53165bb2a81077d195843368ac + fa00252008e75d64a09ad2483812c31b + 123e95fbfad9b045adfc518ab670a3c6 + 8bbba579967f805f662169e4480de774 + 3fd8ee4af334352657e75d52573326f4 + 8440a24e9f0f789dbbb83bb5a9a06c6c + 8936e61cab6355bb4df10379460b989a + + + cbe3a1005253bc23584b286e246db7d7 + 796d76615ff000c246e029a0a98a3dba + 2318fecdc41632ec5ffe981d28dffd32 + 63ab0c48b2d4d7bad88f3fa59f81f805 + 7799e8f35b8dcff5a7ece8587b0e5592 + b1c0862120423c41579476540becfa69 + 1925abd37b900c97e05383adca2c070f + 3afe350fb73999d1cc9f28a14a838d34 + 640130d7af5a37e36188ee60db965836 + + + 19873ef7ac91b6c47083af60b0347811 + 1a41cd949a3575b822e19ad46f1b89ef + + d00dc8088a5f90eebfe9b0a3b535d687 + 8193609328daa3fdfe60639c499048da + 30034501c1e8827394f600dad177c3da + 06bc76f4e7f49005106800ea51e73e4d + 105d64e33243424438de3fcb083016d7 + 0a5a98e8d8e9005d53a930b0e1908644 + 2adf12c2ec39710ab69740b09dd1b371 + d63d4511587ce9dc88c570ccf099d7b8 + 32e810a86372bee32652de3a388e5528 + 3f7ffa4bbeb751b4bf3ec504987eb46e + 65d08b1974f0f5c21d4669d392a414f0 + 0b87fe2090bd8f5dbae706a90d454c21 + d22ebff6adeb2d8bb732dc8361fb2610 + 5a8ed264cbeb5f187c3380c60971c9d7 + 7e1c1940096df942fbcd171302f8927c + 883eb3dd5ce302eb43f4ccc650dcc760 + a4bf2f1435e3086c16e412968d39a7cc + 8601d714205cdecf3ded4d9341044dc4 + 5ca0697f15aa136a9177c0d55c8f9ea0 + d9c6de06940a4811dcee6008657f2d4e + 25393b273916ec4ba7bfdc9ebab9e3df + 3498910b433189d6a125edab68d04857 + 8616c80fe13c72fccac5ec4efda23ef0 + 68e5a7818be2ec6296b58ff64dd89ba4 + 9ad5c8f6fbe1412195f178df14792b99 + c3ac8d7e46f252218597224376434bb0 + e5c429d70c7185e862c0a4d800a31b26 + e469fd5dc851aa49d6bd03757abe1859 + 3b05f0480562c73c6d6cfd5eaffe1047 + 62c46293e7e4f2284f0934fd4c1abca5 + 9eae2b01aca584994516c509499ae088 + e5b36670cea455e510bc29f1fb14ac06 + 0d81935f87c04349c799b7de308eb992 + 933f1e52fcbdc7cda001fbe4f03b5c82 + 4d8a1104b0fb1de05cf4ea8961edc100 + 32927f3e0ca204e0d74720eb2358e8f4 + 6f18adcaf3a47b6542b23953d72b2a6e + 566c63e4c73c0108fde21d1a9d286dd0 + 7ca4682cf570f9581b3f5262ded72d54 + 04a52b294003ea863f7d41d424925213 + 414a1d97c1b5c14952a255cee7243112 + c29c356dac478eca80747cc4ad1f096e + 2aacbdb64a56cefe68afb50dd010efcf + 8b1819c0ed397d313e5c76b062e6264d + c243827d4279b24f43fc7fea65d6dc4f + 1b496ad4f058d6f74464ac9e68d6597f + b011bc09cbe8ccbd27be270f272f4d97 + ba6ffbeaf6c053c17746ea17da37a9ae + df1daca93084bc8afabb11b96664a1e2 + a8c44da0f46602532a4405d48beff00d + 6549f2e00060fd671149191f1e94eaf3 + 3da82671d0f260e198b6ef6acf1d8005 + 32e2635460cf0df0e14505869b0f463b + b6fc83102e8e6dbf564cd44b0e44b626 + f922e5e5c1ebbafaf04de31b9d9660a4 + af500dca7d516bd0e0f7ea468419658a + 308f29c7d17c7998b8c3f949c0004679 + + 16b19daee70a8141362f27eeaf2bca53 + bb9990744be49bb4fd555413bb9244b2 + 8f9b8b66e4b09efbb50b3825110b2a59 + 10bc9c35759059db9b79a5fce375a786 + 5a6eedd494dd20c8579e2a9d39809d5b + e87240c03a5e029f61242c45d092395e + 2d5596d522f0898869fd70ad4af792b9 + 2ad82b7a50a5c15aa9858bdbb9ff6521 + 863d2cfbb3903516f0410710baca6686 + + f2880da79c8d1c255c1afdba28a9001e + a5f9ddecea015543001404c0a9bfd181 + + + + + + 6ca75818576420124652d418edeb2461 + 7001a4d2d1edb5e907afa6f3b055ee79 + 861e3979b2314bc559111422eff7e671 + 1aff1340ce5784f53461bd3e94f9831e + e62d7bc1502784fa4fb3405c26ff037f + 623c57896a74b2e22768f0e233dd1cd2 + 86312a9d2ff0332c84514bc9b2c1edda + 53eeb7bfc64c8f3ccf93c1855f7edca7 + + + + + + cb78276b46cc8ec2688d767bd4bc7b75 + + adb650fa05505f6fba69f23ab3700a3d + ceaa293ebe33bee402cb61f8b157efc6 + + + 98e0def04592437d026f0b7b60de0264 + + + d2c456bac7bc93f9b3d60422f1bb8802 + 916c501c52fa208846eba8c005361e85 + + + adcf322a10dccb542e4d5ebe9b20dcf5 + 866892edc60ca434865e0360ac01a702 + + + + + 59c0e51c53d456685b926b75be9d9be4 + + 76b10683f5ff094b678ed9d74db494bd + + dac4711facb972daa68e40d433fe47e7 + 68e505017c028c9d06e680e573391189 + + 2f4d755646690e8125d04c79dea33dd1 + 7ca9898d14e4915fd6b8b2b549c61948 + + + 5eb9b8fc90ff18d76b2c159e94092e11 + a48dfe316fe37ca76a23b507ce76018f + 95b848f5dd0590ca8ae439eea0940b91 + 7eab786ffe8bb43e9e09ab998139651b + c8f803c4802f9dca933ea561d701fb40 + + + 9f1502689e32b56c22a829513d29fe69 + + + + a79cc9b843909029289e8935f597d0b1 + e182cc15962d7e34f5e9ddfd3b5d0c44 + + + + + + 639848e07ee119e849e4d20fa90c6f1b + + 37e60090bca85fdece9c31d6897db747 + + + ee874654930bedb32429f0449111c677 + + + + a17230480aca5e87eef3cf30729316af + + + c2e4544042d556b6f66f7ff29d8278b2 + 54bbc299ac7ac058774657df62ca0fd7 + + + + 1b93e407c2d67b41e31cc7b8f9fd18ee + + + + + + 3b83ef96387f14655fc854ddc3c6bd57 + + + + + b328c8968d8f6fd793da9ec8266b7ead + + + b6d9742f21044694e9b8ba54d4910348 + + + 8dcd1be751d401e66a8d220b0f15dca1 + fbeb9ae86063258f363f6d2ed3e18057 + 34fac18339d7cdff0492376a2d6ddaaf + 75526b5928bde78331e1cbaaf8551c30 + 34ef56e9aa17d1b408bcb5f48652e921 + 05f32089542682ec031911c66f457799 + 1f0131cf93a2a64af5f7b1ae4c7f3a87 + 3c241f7efdde4dd769611f725384cc20 + 202313369fa7d759d0c2f842a707cc42 + + + 63832bd023c1c91a63c55477f14bb671 + 05ec67b54e6be3287cc3f2e439e1eaf5 + 626d0e71d01876f400787be9e51ab628 + 54a21bf0b8984bea0091ee4e4eea9a5d + b70cdd26fd9a8b72e4e116c3cfef686a + 05a43644700119689bf9940ab480b967 + 9def588dc86e3302178992be480c5592 + 746e0df11901479b60cb5dabf938cced + 95008667190f6465669dbe6314d1e1e8 + 7552ff9d0f2a415bfee76f0141ffe9e2 + d821f2fb8a4ebd3c75f78ad82bd7a32c + + + 200cf736b6cac950f7d9f4f3e851a4e2 + + ada7808f8ef411d055c74f8e1e607930 + + c8129a00315622f4b2ce282096d41562 + 35f4fa482a66d2e424b0f0ca9d19d390 + a664ef571be82c82fa584545e66ff1fb + b14e09b853d258d93f7a0fd50e07b1d3 + 79b7b13a3057e02ad573f01795bad4d3 + f7b42f2f1952b78482e1cc6ae3e9c92e + + + + + + + b87f8fd2c68275ec13f9546ba7137633 + + f86e7cc9c1d63fde95987d1274979e7c + 5669c9ccacd33c9d9569bfd49ac81ecc + 835968fef445cbfa4ebadf20ab249a60 + abf8feed4987663d6298ade2aac0753c + + + 8b040ade4e9e881cacd943c141a8b449 + 9cfd06786313b389fee4adf4c288ce49 + + + + + e61f22ddc6140a8918a2ad4f12536827 + + + 7968dfef8a6bec7a3cc90b9c4295e448 + + + 0e450607a1cd031f8b3b4e275e8e6d19 + 3071e583465efe9f1cea6ab5a901c376 + + + 95fc337c3f2862e5180d9b96d6e3d63b + + + 08fe2b78dfea34ab6f852f59097b8bb0 + + + + 57e19cb3e0a1eeb438204884a43e798b + + + + + 3a43df3efbdf1915b85e3ded8572b654 + + 5c2dbe1e74626b4a4d09ed2f8da03adf + 8a5ced397c9d6fe114202e3d4990f713 + 772ddb8a49587148acc7a20e6e8a2887 + 94678644a932f1a81e64ad6839c16a41 + bf7d40d28c2f6f6fa370d82216b51c80 + fce3f9ffb513059407b5c07b2e2bf6ed + 07a9085accae0ad96ac8bec8b8443793 + 6bac4f0bc78eb3e3d36f888ab75c7be3 + 2d91d442608ab24e01be7c6b8a8c43af + 04dc4e22d3842c77abc58f7bc64f7018 + 39a78eeee5dd71175d0c442f606774c3 + dac1bb2fde659722a926b4fc74afdd33 + 943efd6b9f040c2ee3d9eb60f0c7b403 + a4a15ae18106c96ec9ea96a84c23a637 + eb4ef6902b7998ab648d16fb97c9f008 + afaecb847ce704706a4ccfdfb70d0e9f + 31f7ada426cbb064422bf8e426865a03 + bd51447085d2bd6a5da3d3233b3c1d4c + 92dd136a31139df59edcb2e422070b5c + 13b3a8aa920964646e7fe05c603570ca + 7be1db3da2abcde7298b352423c921c2 + 1cc28a5e7d53a8731223f43f15dd8bb5 + 3881e1a91f904fddc41507a1ffdcba9e + 30f9409b8792dbd2d7e1963fe15ac970 + f34ef6176ff4d5e1960b699e11c5fefd + b420889f535dcc51ec3bd690a86fc911 + c65a6cfa05b0d81ce4a178a2268609f1 + d98004ed69e4852d12d8a157981549a4 + bc309e67d64d2f2c6868b9d722f86b5d + 2b447c6db37423a0bb5a2a90187e5aec + f24ee4fe1c5450722ee24fb3f2bac4b3 + 9ec17a243acd47e2fd18e963f18ae95e + cf93a41b7a4ed5e35eeeaa2757aebe75 + 01875f552b6953de63086540492938eb + 5c3f4162805bb15bbf55595bb86b4ba0 + d066a6906d0adb71a525bf7b9328cd1a + 5ea2a3e6d61eb243abe06b5ff95f47bc + 93e2e404af0934e31e279578f43b0134 + 260daa8a4d9e9d83779450443de6e3ea + a56f633942c9c026876e95066ae0da10 + c2f7600de285e2cf63b2765364a30d41 + 95250478bb332ea7bf10f50c73771095 + a8fc2fb2c943d5950e74082049f268a3 + ad9e2b4f924300eeff6d7dd1df39b842 + bf8ea53e691dc9eac61fef8aa9cbe55f + fd829ab67e7a48c13f999325a8630578 + 1ebbbd5a8042256a18757f5c8d01584d + a3578930b225b5a2eaf8af4c866e6ff0 + b71e9af8be10ceef6b44b98d98c84e3d + 5e602bff00cd5c5b1d08d9d976994b19 + 30e64a460967a078abfe3ee4e309d9fe + a1d8ccb628d0fbab502057e139f690cf + f4aa1eda982a5bbff39bcec4a44639ad + 99206ab9a920a195cb641bbef3cf5af6 + f0b599f23d0e44485aec49a118316dc9 + 63cb320a664320ee4aa674755b87dda0 + 893fce27a18909eb5b98467a9bcbe9d7 + 2943804e0fa92d768a9e0f709044e59f + d6704fa25f287393460ad02410c9a361 + e3aad0005e5182a4e6a6b1fb61912917 + e51dfa305fa156772d5b58490a9151bd + a62f102a957327701fb8eea58a5ad260 + 730d701bce6af39fd9e9e9511840f611 + 28fea81b31e6047ad3653b5e3945abaa + 59cbae83d983a3f3a2a67ae17001988c + b070a4374b45bd797b4b37f2417cc0fc + e153c7c99cd6ec035b306693e2e5ebcf + 71d1a94d54e9ab0c8eccad97b4cdb097 + 9d9bbdf937c82361ef1249167b29db38 + ca5cef2b9447f85e57ba363fe7943eae + d18c4c14417be82843abba7275adccce + 213bdbaeb6e3af0d4c5db292e2c2eb07 + 08cffbf0b608ff51791e1991be2a5995 + 8d02ab1e940e50d6c83913c82cb954b5 + cc42a3e550525dc4c627c3c8d1327f12 + fe74b164af1850c3ee383b2838ced5c8 + c3b56ab13ab5a596f25cfe3ba7dd70a7 + f6f84bf2b7eebd596dfbeff0cd094208 + 45f74345c503abb4dfeb4116ba6476b8 + 98ab60b116b7c681a2e98c8438b4b800 + 0580e154a7d27dd85f989e804f0e6c70 + 6722c34dce3af385d080c75d77fe4553 + 711a2b007453afd44fa460602799081c + ae37fb4babd13190d36cba5d7aaa1aa5 + 36bcdf25a0a318c18bcc4ac4a759aacd + cf9caf468d509f55f0c524e72c6e3c50 + ec5d7c1ca3806cf62b89f06f1e6236ea + 47e92e9acba450fbb0068148389a6d39 + 68a2e00f3e816803b05b124345e1fea1 + 9f8a6a9c579d8ba3b66ed5255c870871 + 999e1437cc9ba90b4d1d90ee7f8791f9 + c6336dc93543d4dc06f464e3ad2974fa + 7b3d5d26b2e6ca961091f6a346085174 + 71cb8d9333f6c1b4a95051f2199ba880 + 242478c69e3dea8220d40a2d6a154035 + 3216625d0d5fbdc41d7df65b146dcf97 + d6d8d15652ddefb0353beec969f0e630 + 70d7c3b65d472746fd108ebc5e5d8f34 + 492799fd70d73d107e653e7a940d9ff1 + 098d38bef873edba2cb64d0828e78147 + 381c5466404af72414bda1c9e5aca95d + 39d031d60fe392ba7f5c3bc7a213c2aa + 32dbe4a366d9ae81ca285b60ce4c92cf + 0af2be60cb6a582ff2628748ce57ed41 + 7ca3f3001b09846c6f689b1acba361b2 + ad8d5ab03b46c330dbf9106711c29c99 + 0bd5c84a858b773c2114310a106ed024 + f7d7ce4f5ff94fd9fff569fafd12b760 + 45d5f2d112e9f4290aa135353ead5b21 + 60517a23c9a73686b5727758a0bcd311 + cc9cbe83117d365e4c1dbda633e82675 + 6aec318bafb21a38a4d0313134653822 + 34872917f4e8d10d328bc61a6a98602e + 8da526c7a4bd429286fa2bd48e272760 + + + efdc7dead4e2464768414001820a84e6 + 464f6528f9ea4e7b9a7b351f737c1a93 + 25b4d3f9b1e976e059e57aa925252d5b + ba9efaa9c02c8d730bc10115c0dc0f65 + + + 62b2e0f4d81386d084101025d152b4aa + b0c21c04782a7be2ff8c5e336df493bc + + + bc722b51eb85ba9ff26162bfcc0d022c + + + e92ba6a78f45951918599efec46bda83 + 6693e91aa9b04e20cf8a1a193470e654 + 8b09c5acba48a06e367ec45b66885ef1 + ba352f09883566a21719a0fc3aac3167 + 1f60149d90728687672dd5377d8d3f79 + 4e3a736de5a295b0c30765855eb9b4e6 + 50689526fbac534cbe59703e3eda70a9 + 4f2ac3dd101cdd75c96c494fe37800f3 + eeb4bea1921f98f6dcc572f7c5c367dc + 3d787b64026d10df01d5b054f4d56620 + b9e341d7c90c24fe6237f8f626e5e36d + ad06fe07b39fada1d9e26e6109f8b20a + 4eb95d5d084c146632e5fca7e901e378 + 7b3fe8319b86e47c08ffd37d875c2b9e + 68bc3d3d4014b91bce98f4d2a7c539e1 + 4b94539c156d8b9c291d4b2549c5fee6 + c3656f911439bdce01f0bc9f30e0bf1c + 9e1225e746f3e7225b75908cafb35b60 + a135a16c7fe3c6486714afbd66688481 + 768f57a6f7db0be9de420c30513d7450 + 33c85b7385de8017c03a1b4e74b46b17 + 34a04cd119952d8d85d1bf112d4e8c4d + 3b344567533e16681e4bd26889c3dd2c + d41840c5333db90f24f7d2c2c5808311 + 0d294e22768ac33bd7bb4fa4c21f2d8b + 74421200859e68ddb582a39d716d9427 + 64bd91d8a07af22841d2d7db9c4b4ef5 + dd7d14e11b55f7edf7424fe706893858 + 51106e56be4ee9c6a435235e4b5500e8 + 2570f52972bed115955933eb26d62bf4 + 323c1ba29cf7035ea8e7fdd2c0d49882 + b129b7a8fb133fb1364fe7597c62cb2b + 053ce8f74063612b2b209f79489da7a2 + 50a25466f218d54bc1193dfb9ce452a8 + 5437647531c6aa2965b023b72b1d1220 + 84202fdbc1cbc2fb9a8cf8e62a5fca01 + 87dcb5d30099815a71a4de0cdb10c338 + 5dbcc83e0970568344947d151ff4f017 + f47da0fd701adc54d02858645867345c + 94d8719e3fdd49cb23f1d7cf166922e9 + dff0de62951dadd9a8a206eb7328ab8a + 3e22b32ec66217baec25b136a6a380b0 + 51664ade13dcd9246e713ed512a5d314 + 6e4b173772a3a0ee326b56eeafe80720 + + + e419372bd9d1f5c3a7e37fe95a8af0c5 + 4ba376309b33386e17e8ea85ef43c29e + 90ffd11b630e34fc29dd59ba4ee4db57 + + 16614d197f6788ec937ca3e0d068e8bf + dcdd58a3a533fa2f7e031c0bf1e274a3 + + + + + 632230b761b7f1e897d31cb278ee3722 + 8646d729d2e17347570fb6ad220253e3 + 2a81682fa8841183d27ec7a15d1165f2 + 6976f887bb61fdbc8b2ae99bec2eca52 + + + + + f9ddfabead2127b089fa60b1cf462ad7 + + 9d772c00e90be60a19ba6291ad4ae148 + 1e945ac35beb1f46ffdcfae185b534e8 + 100a97d8e8cc30325d8599d9b6d608fb + 671c134a527e07bfd6c23a09f5374900 + 8768d3740712a7242d97124301716ca4 + 4e15c14a2d469b70508926227fee516e + + ba833f87e8d7b448884a313db0132ac3 + + + e3263ef900341e9a81daaba91bbfd23a + + + + + + 4b09f99ae5c89731dd0ded5c7e270fce + + b6c5adee6743072b733a8f3dba43761b + 51fd9da76a30957b484296f452c1da42 + 40cf8291fe01a0440a904a84de1f471f + f48c6dba6b4781dd595c4f82c64fe8f0 + 2981ed1414b29b66426eece64865c3ab + + + 92e78daf64260f604add6dc7ae6b1c4c + aca299bf20f91968a149cb89e117ddc9 + ce6fb61cd25791ac865d4e84cd9759fd + 2cf7086b80fad54dd9fb1bd66bd3af95 + b18f06f7d9c95a0cc3ef99fdbf4dc203 + 50d4ccf2a59c4d70b6134873f6934c6e + a2b9b8e1e58f198601c22a7f2708b2c1 + 89813f179d9cd109a17bebc28494d773 + 399edbac1d85763544dc54c597194345 + 21dcaf3d461607486b356042032ac74d + 1f076fa17483b2dd92098023e78069b6 + f2cd9a9ac1070b718540129f5909402e + 9d0eaa82626bccaffac0a5f978c13fd8 + 2d170945ffa71a89f384ec58078e0c19 + fceb27761c90d7704cfc2e7ab31651b0 + d86764de09816c66ddbb1543bccb766f + e71a23d493f4af08228d061dab2ee118 + + + 42ffaf70cff001e7b0cfc42ce2e8f8dd + 36ecb7a8e416e9633b10e677fa5a639e + d1c7f54a71cb105131c0c22b20619bcb + 5d502016856c146aa47d0bbed5106ee1 + 9952c5877077fad22bed15fbe04a1ca7 + 9ff38d10d12832a15172c72c086143a4 + 4cc7b783e1a68628a7a85f2ad163e775 + 7ed449728b670500dcbde0fad3d2c0c8 + 77d95d8fa4fb670b348f9c0318a6e107 + d73abf147478558ed008bbffe9985780 + 583ee428fc5aed66ee3b68d05acd967d + + + 8e21471c8384c82f9953a5f35a8c1aad + f272567b867f4ac209dd6c92eaf19056 + 5695896f070fae71dcea49553b112414 + a5fafa750b85c8bfc94c8ecf22d33fef + 375992a94f5e9926801bff04d9a97c33 + 69893f14e5f063861b7a9229cde5d741 + 4816a8fe7b070c4bedd5dbf6d5e218e5 + 72c981182dc3381da7e1d764745fb50f + a73a7ad08d219ccbd98679a31328d249 + 650349ea50ba9118c92e34fa95ff7e27 + 396bfc61fe4cebb62fa47524c772b513 + + + 125d790f2656efe2005a46d98bbf9ccd + bb0f2cf36086a5ab8c83907468472d7f + 855721b2dd955fab148b96f609d66349 + 6b2f4ea74647a3b5c122366b50fd4931 + f33a49bd4efe5ea4685365600bd383d7 + + + 9da9bde856192c9588ba7288508fe57c + ea2f4fad216b1050c6bc69c6c9de28a6 + 0b69411a23222125a63b1168e872e7d1 + 7e03e626b83424724aae8e3a6aaaac4a + 5937a24086742fe1d71f70632cf74626 + 54881525a1132d20b9c94d2263c74c3c + + d1eb1c8d5d8e952ec5ebc5ec229ebd8b + 98c49c56940197e757af27bb7e13a89b + fb294d4af626e5dd9cf4dec0a146ba0b + e756aae39877cf8137a7d61731a96c5b + 53643f146ac4a8af437f985b56537cf3 + d6f685d05271786954881729ea03acdf + 324bd717b59e8aab19b6047b5715e04f + 5aedbcee0366876653ff7740928d0b7b + 9601ffcd97c39a60ccb6d14bb008bbb3 + ccaa707d2338e69c1fffa432b2514eee + 431f847865c9621f926b35f91a85dd2c + d1422a71357908fbce973116a3f71dc0 + 87ec30bde4145bb5086b0f905a37acc7 + 374c3f7f8a27318d5666d1c8aa635538 + f5a096b469ac183996a00ccbe59d2ff1 + + + + f9ddfabead2127b089fa60b1cf462ad7 + + 9d9e9d52c4b1a82df5f82a2386af75b4 + c5b9539c49d77dcab9ff952547bbe780 + 39b79bee16d09324cac27f5ffc686929 + + + + f9ddfabead2127b089fa60b1cf462ad7 + + baa676171a96a28c1393d91384b1b7ef + 777df5c7fafb2d6bfcb3c802e84adc3a + 9f2affce54bd7d8c9a9007b59fc763e0 + + + + dcd06f1e235db74d021166806358f3c5 + dfd9d6751fdf82e079009ebdb27c3c61 + 8c0633de4f45bbdd0a168968b66bd15c + 85e6686ed0f84679fc7e4f851c268b63 + d9b3b00bd2e611076fb26f6706c6210c + f7d46f8fe620052a8d45b454c42cedc0 + 10b4e00d41ae53ab744c3df441813175 + + + de603e26f57a49cd5e4eab10e1686f15 + b520e10d3139675532606f2a0334cca7 + fa44e44ab519317596c0790a65d7bf38 + 965eeeb09364f0e0da13d094eefb4be3 + + + 7f9b892d14899e73e491389c48301d4a + be5e06025b123a0d8a9acb8198c2f936 + eb26d9d532221a1425a8fac2aad96a9e + 718e41c2d5cef401149c20ca371ad424 + 4871442a53bd711d89ac9823ee0d8df9 + 3c6ebdc379ed9af49fc185dd3d37c210 + 2ac2ca1892020c4608f2435fd0ebccd5 + 94f71a67eebbeaf6f85f778b73ae931d + + f658655aef2402084df1ae4f1fe426aa + + a17b9a1407c7959a90868c31f61e71f4 + + + f9ddfabead2127b089fa60b1cf462ad7 + + 802f0231c068d9f085f3c8653bb926d1 + + 68575bcb6ba2622232ffe7e65450b165 + ab4352ccfc2468697a1a86945bbdd1c8 + + d4bf7cd1da1124cf8c5a561cecdc5059 + a0b4395fc529242d414dd578c4c6f980 + 4ed5919e395f7e4c568e600c800f378d + 6fe89b215a313c235b9239e52378180b + bb422e1161cc1ccf89951fea853f135a + a35f7ea68c23cab4d246f7a2a0edcbe9 + 788a139a27c18d6bd886159e8ef8c10e + 048a82bcb138568e0bbbceaf5f886716 + f6efbdb369652e6351c8e837febe1795 + 357a76d042d9f3e7aec1062f6e3a80d2 + 44a9450100c8a5f85f3b95563417ccf5 + 2424456087e77c0cdf3ba02de4f15e9c + 87ddb692697c7708e20e1145e7a63911 + 775c6b0b12cec849cd1be3bab364006a + 5ee03fd3c0c37082efab7dc213c9f455 + 6058885102fd00fb17b3ba541631bd07 + e2a9332833d878494ed30fb3d9f2b8a3 + + 648bf3b1ee188fe82ff842fbf8703ce6 + + + + + 99627c74f1f1baf2f0ecc1a626c1a74a + 15bc57c1eda65156080aac8594c9d9d4 + 7941e9eda91cb240ed49beaf007af4ff + + + + + + 13f49c3f661f84efe75b675c857c1872 + + a381337681165a99c47ab9fbc60f7030 + + + 269870be37d93de5b0f7717231ac4fa0 + + + + 17df39bec8bb9e0197464345fc690510 + df2d1cb3c0a454041397ea910ba2390f + fd4c760e4ffcf2a3c778a524e9919e0c + + 9d47d9ba318a1137f5ecc7f00f9f414c + + ab959ccbc8b8db5f86d0acf46ec9e01a + 6d069380a40b5feadd2ea01766da7899 + 838fd76cf9575622ec28214435adcdeb + 489167f389158c864ff33a23294846d8 + e208a8a4caab921142523e31f8e8a78c + e880aa51fdca75685d8b40c4d76f9d6f + 5474fc6dc540aaab62260cc559c65f1c + d1965b3a71b49f3db7f74235fb590eb8 + 2a0ea3c56a832fe86b4a2f7d13666e38 + 569c7942516d70e87fc5060ecf427e34 + + 357b17374111b5ce6ff04bd79967fe89 + 47afc07054883774afbdca034c21d456 + 58bf3242d9d897146eb6e6d879d71179 + 732d8df3835b7295ab1ffd3687bc9197 + e1b607faeb3a7d18cc835e54e60e7c9c + dfffb582d5234ac1605a86a041196e62 + + + 85de159d7ed35f030350ec736779e761 + 08bc76c59abbb850e4fe9f9e82312eee + + + f67a28c5f54e3a06bcf4fceae9d27f0c + + + 46c75b51e0358e23764a3e83260f73ea + + 222f787f0974766d5b46366ea8af493d + 41f4207aaacaa61fb45ef873ab54cdb8 + 510a1e66b8af2499644a295213b49e37 + + 67635a10dececacf3311e238266357d4 + bddcc097e607dfbd096a63ab635775ed + 204bf2e6f42fa889ea1cca4187ddc563 + 1d95608feb5c19e6705896110df12a0d + d6b19de3a052d944c83f5151f35b315b + 63302c1afb61f915c8005c5b642b997a + + + 85de159d7ed35f030350ec736779e761 + + + + + 9d988ad91d07ad4c2053f912c793da52 + + 2c94ea2a55dfb537d7c5da56d45cd237 + + + + + + a6e931a2cfe6b664f6e943ee8fdbb342 + + a177dd5d0161c1e6d3461ab76ea0e4cc + 101a760f9310414972bd02aa0cc44d4c + + + 679860fbd8cff0716ab1e86e62c96684 + + f711d1e4d45c93ce1417d6659dbe2e72 + + + + + + + + c75c9e9aabe6905d9b60732b9d59e0a1 + 93f99aa7b1b2e7a9c7548579c83c287e + 52f2b19eb09ce4d6fd8adb844ac987cf + + + d37ab764da0cdea17ffc0aa8113f578d + ffa298a598e28ce7636b56020ab5e557 + 95f88efb28e20a64facb82836e40d2d5 + d1c74bda19e767843998f0ca66018bda + e3817728ff39cb1d5ab23376a8834268 + c416dc59e30407e059d281965edee7a1 + + bcfeb5dc15837e7a98c444fe5e8df379 + + 76d4a7e5757c9488bdaf8bb0a81c698c + 3e65b448aaead6f27b5981f446bf0a45 + + + + bebd141a40072ac9804f5b0a1571d83b + + 98eb0654da32dfee93ed7434775139dd + 11afcccc92c6451caa2dac9dff419ea5 + + + + 225ac2807a8cbe213c74600902f09d96 + + 90c81324bfe681c941324b9557cdba2a + + 15d194e077de14fc2e80579a5a9ec542 + 28492556f03a126270f0a9c8ed17e0e3 + bfe0885e16f5834b4268307211143adb + eb8e7dd8150091a97f9becd85a406d11 + b4978907c56a7af2b6c237ff472e190e + b852fe3d2dd42eba3aa63cdb7c0dd179 + + 0c2fc198d4676bba5b0ab083d4fb695b + + + + + + 6fc8497d351a000020e4ae5b325f857b + + + b17691fcdec5228f642c991c8dc5a909 + + + 412d78d43a62a10365cf872be47e4857 + a667792e865546100f86751e03d85e4f + 9172ed074e7cae70e3317c468b10c7f3 + + + + + a3325c97b6b72cd3266f5e5bfb937682 + + + + + + 9daf1e5689a25c2b983837e8cf597af1 + + + 5d36f76eb31f13aa7ce44bdc994cf4c6 + + 487dac665f4ca702d3484083dd237bc0 + + 75793f98cf0d14e1af585e07f8f6f44d + + 1973275d4e8f3cb802e3ecfbfbf188b5 + f065341c14771e7c5bc143c04d083cf3 + 31161b54d8af726e8f719118ec45b696 + + 905435397a9bcd82b33746b7063d912b + 7cf393aa2d88bcabec2c30f7ab01ad6d + 8d1e5fee603c3c9ca2b528af22b0a7f6 + + + ac249efb998365de71bfd8e0b3544468 + cc08706b0de32e9b961bf99cc428c5af + 17f15b4684f28f6b78bf2731dac2525f + 5cc0fe158a706fcd9d1222a6b5cc0605 + 03428989e66bd55b002aabef0c764b8e + c4e8903e6796cd36a2c5350d17801c13 + + f6cfcd117e6d1fdb1b4cd05559d02512 + b2263df15abb64f4072f3a129ccbbaf6 + 8a40cef05509a094310109e0b161ce0a + + + + + 262469ab4ff5bf9d95c42e33b4fbb64f + + 5aedfc30cf8de3bd043ce5e872fd3206 + + + fd5cc2026582e98788cd74173c1526b0 + + + + + a65fbc8e821dca0d2eec71155d677cea + + de1add2f6f778f948cdd39d0dc9ea193 + 1862ee77a70d5b484d3350d48af2c45c + 1a33a74ec4dbd4db4b901646563e7585 + + + 6865f6adb131a4391af4576141ef59ab + 6becc474bdca41a7476fe1f48cbd0aa6 + + + + + + + + dbeabf2ea59668743afbec4b903b1018 + + fcebe23f756d974d42783955f3bd1486 + + cdccd3099d259695e9f8c8f4f8b8076a + 572c972e3ddf12f1ec960914dd22e38a + c2645d17eb8fc41c59fbc9d39702b82b + dbddcea92b650e111d932a4cdb516d39 + ff2939fdbf04c0b8524ebcac1360defa + cbcf0e844de2f43e2814b5c62fc653a4 + 2ed7643347443b0f6dafbe602b2a7579 + f1a9a2d4921a48aec8abe7aadd412120 + bab96f423ae5dc7f2feeefd1fff4ca1e + a141a595db05f55b91e5d4ac370b590d + 5263ee9825e010e8000681ebde025bea + 4200b297f7c9a6dde236e3d0b2ddbc0b + df25845b9c259c54ee25a2bca86e6645 + 05e09699a1cf35386244cb0e4de76677 + 774020e862b4b0aba0a547022c67d3b8 + c6da7d1826593d73f1d807b10434216a + 42e3fcdad63015bb57d986e7e9cca97f + cad55fb18137639dab0ee03a2925fdfc + d25d4ef2fd61901326933336730e57fc + 674c5329fa6ffa3ad7f85c86647d4afd + 67e5496b2e4fd61cef2a71be9caa192e + ead11222025edb61ceb375d012ec99fc + 76c9479390461592df87ebb2a908aced + 179b4ef48766896c49624aa7c9d1a483 + 1a9ab246109a40958b9b16a3f126301b + bcfd46f4d1dae5a5462ba66a76d6efba + 3c3402cc3291d863ce40a4fc1116ab78 + e73ca954bdfebdcfb19d74c545d989d9 + 40a3ad1fc49dd46138db44db65a69e09 + f2e2ea403c3f80f61b625457a6515dab + 5e51ee0758b2b3a694d2e4d17816fab4 + 8db5bbb4f8b231782d373ee820eb4a77 + 9159cb546505541769be19129761f998 + 1f6a226738c1205ddfdbf8b91b0491d1 + 24d1f4bdf42b1017687a7aa2a07f493b + 8440c87e3a3e82f00a9277a27e6107e0 + c3bf6c318570aef1a3ea7929e88e67a2 + + + 6e89a05b26fb831565b480fa5b1b2889 + f94f60a78de087807b6b24780f0c2f52 + 36e157d51ff504b352f38ed3e6870164 + 92b678d06eee2e37813c189a8ad3c137 + 1af14af0ca091e4b23bbc81dfe1b76d1 + + 8c7e71ab0e0c1e6fa77dba5198a89ed5 + + 0638fa4654d17730e448183da924c82b + + + 9597ed082531af4ff3a71eb67657ffc0 + 5adbe2f48097d49cf9a83d195333ee1b + defbe470fd13c1c404c30d50dde3efa8 + + + + + + 1db70083eec357ba1332e2d2392f4671 + + a2becf0173a438bc06fa7088f2693cdc + 592ed412ce11234f538e748c17064ca6 + 04f44b3f083cacf8a93a4e25c963d697 + + + 1f78d99884650435fda97f21ef4d0faf + 6be3de496008e521e25881744409a009 + 35f976d251deb2172fac15edab12ce4d + 74ba5d38e228c3e9e83bbd0eaff8bb9f + 96894c2554f8643c0fe8b2e1828af7d4 + fc39249de46fec6c62ceaa99a338712d + 269c5d1dc2b3bd3941904d45c3097ac6 + e3a3bf00b88a2772c59fb04371ce561e + 3ebfadf361ff4af0be1321086a561ea0 + ac3688933546b363a3cc570d60284fcf + + + 38a6e4f27687e5a095a410ce874c8e3b + 03f55a4614ab2b40af0a14e16ce1de1e + 5075b91cfc5e76bcf30cab25365c1183 + d8608d274e9b281c2f61f83f5d353212 + 9e56d43c74bce30248a4a7b39d5b734f + de08745efab643a596dd6f364f3c7995 + + + 21970c2ef6e8e9099cd94ab45ef3ce0c + b1efcaaa6a66e4633ad76e99745b101f + e1398970b79c83830d8d9ade9665a6ac + 44726b8e5634ebcf23d8750bc078290e + e7281761f45285894dbab615b035cb2a + e6556b51706c6e0eb7745459321a384a + + 141649f60805a7cf3d86eddf6ea40cb0 + bb597df84ffddfe3ecbade5ac90a41d4 + 44c732d31f263fef34d5319e7a8d194c + + + + 140c22177d68326bebe8eb46e5976998 + + b4ddda4a5970efef39b18b409f0d171f + 7317f04ae4d4bdda006bbde6dcc2a316 + 9827b7d207d22a2ddcea140c077b3e65 + + + + + + 1a4bfd586ed0bd11e0c876ecedd4fdcf + + + + + + 84e306e3bc06843ea897d61f83ce5833 + + bc5d0a5c3a4d7a52e90a8dc7090c0516 + 2f7bd4b8c47bdfeef36ffbe0d343a8ab + + + + 7a2ddc5abfc1bea44f7acb1aee81c248 + 124a606440748b19f0fc2a10c7567b96 + 66d2a4b75d8d423f9680321066c82f11 + 7a2ba5584b99665262113d522fe6af23 + 3ba83a38f77efb17be1045921e449165 + 01c367eee2fb4ca2468a96eb35c2bef8 + + + + ba0b92c7b019dc13f94f6490a1093ede + + 574eca78fdaf20995138d86514363177 + 4b4e011523b002db5fd33e4ca3ce31ae + 8aa2b4d27772353fe1b29f32077d0b20 + + bd92ba6f85ed32afaa569d66ac7d8b26 + 2764899240c61a7060256606bf9ddd62 + 1f82adf2362faeec0925d8b8477a33b5 + + ab93875f6a8e568e46b16d622daf25c7 + + + 27f4859c8e9648bb716968bbde383840 + + 1153d6da2e337cadd4460fd7862b8290 + eb2d766d0e23c9a58b00bcee87e95dc6 + 79928f9e2064f720bf3654e752ef1bf6 + + + + + + 3b83ef96387f14655fc854ddc3c6bd57 + + 0125d461a1e83380bc9ad1d119707c34 + + + + 9434316c23197db770e6c7c6037a6b31 + 72dc20089eb4a5cfaccafe6e2b17a36e + 14886d684f1be0b4b28a66f4b22e490f + f832cea2f10902ae2ffa4521e13c73d1 + 4b236c4a50a88b6530759f67a5db9481 + 16313ab0d82195477e1ba071e7696313 + 0c16475216cb97056385eda43f7174e7 + 6882e0d113e22478202f99caf306bde9 + + + + 863964476ce2df1e215f8f48f4811c29 + 4867e603f34551fc1a3196964c69ed3d + a6d1ac0812a26083e673f27a1558b589 + + 4136ffbdb5e737afa3dcf08022160ec4 + + + + + + + 56ab7e16d09c4901d4f758502faea924 + + c44fc8d5bfcdab2ca76601dc8f091712 + 994abe6d34f578434b40a46cbfb469ec + 90f49c6806678067c9793b1cd3fb26d3 + + + + + + fe5826702b4e083c14934c7ac1222b8c + 211566acea80287f962741551b0305e7 + 6ed0ecb3c9aefaf0969454c67d7fac0f + 67c42bf8daa9c064deddac400cadf3fd + + 796b8b4861ff18921e2a9a5597b84e8f + + + + 3b83ef96387f14655fc854ddc3c6bd57 + + + + + + + 746976663e7feb11fad965add5012aba + + + 9cc13aa75ed3d935f92472d528b20950 + + + + 4199140b66662904e33c7777ee4c6dca + + bad28fc1ba21e004b692d000cfe18eb2 + 31f4b69c089111ed77e8b1169f246a40 + 8ac3a84152de91e42031905745fbf791 + + + + + b9ec4658695d81c2087bb974eabc8adf + + + + bde2755e32117927d6a6dfd854eb8aa0 + + 03a2418311682d52f8ac22ff5652cd4a + + + 87e09424f9437e095915c57aad7f05e0 + f31a9ad59022efe0de63808d275a0031 + b0d0c657952bc1d8a8337a6516abd097 + + + 16a21df0ebd793082562bc48936fc14c + + + 3585d916f9c3280d9d2c61abc6aa8c0a + + bc2e754b87f863375f09b67c0ed4c80a + a26e20b3fef0cb0ab7f15bc5a501d523 + 76a96570463de4d20951fd93fff8f891 + 3dbe1c24001b4d05510c8305a9dea34c + 9d646bcb6917a16377a01187ea2666ee + ac625636dc450133b90c5821d98e2a7a + 99bfe1a418679c198c97a3270eb46cb3 + eb70e3385bd953b09c070bb69bd02b2d + a1f1650992d82ebb8fd99fb8a1ad011a + 42ee296ca05933532d282d334d7792ba + 8b14afbfb4ec910b55be774e612d79f0 + 919365433c29e463cfb6ad2af391d25f + 9547f47e82d9b72428a954517fe16465 + 852668d8e8374f7954025a30620cb6fd + 8d7341530847c8f734d64d1a48e3c21c + 807422b20660ffffc7fb99c106ceb4dc + 4e56c068b5ed94429c886677fa258d99 + 99ec7108652f07752a6e4585f781ee92 + 3e697fe71a14d7052558ef2637a463a8 + 92e05b313f47c91dbda959c6dff17f5e + 1ab60f71568950413833c00033b96e81 + b7fe869f9384f89ac3f3329dda45d787 + d1932f6ebc2214ebd5c428b7cfe793d4 + 106a17ca9db78f47d811a64ae838b714 + 119019e45d2c65cbe85a3aadc28771fe + 44ade8a7a6002a6210b36c26c89cbacb + 02db89b5a3d90411e71220c8834a7ba0 + b2f190da94bcdab38e27098e5a9ebc9e + 0ddaa91d9e0af21c47a3eed9ea1548a5 + 8ea3ee653c7caf0423f567f1e4c0f1ab + 60ed22e1b4289a5210f9d8358b3d8f24 + c5b8e8b997dad122fb26d420d7eed287 + 112f1ead45ef6f90324676d7d0f1ec6b + f75162b17f8d30cb70b50b6ab9f6762e + abc48686f395a089e55a2ec1a4fe4b78 + ae3aaad87726b4b408c71c109bf01417 + d26f4fcb39a0cca5b7e2e0e171391d1e + e4702d256f19f3a3b6ee8f61c84d3a2b + 1335de4a81e383a160e9583cd6b03446 + beee53f1c85666d49978d0d8c0324a2c + ee60eb96e9e1c7edeeb5cc237bb43638 + eec89ddddf6f4923116fb8fa9635bf71 + b4af2d74d3ee8e7cad9834144c79b415 + e8c8672646919427bb614bf2e7fe8710 + 3f28b68e8859819ea5914201ac006fb0 + 5fe8f6deec8c1981f45d543524d790d9 + a14d882a9afb7d9e3a5e2daa912cb3f5 + a8f11293566e4320424d2c3fe3577376 + 55b8234eb203bba98fde2af665052b91 + 0c3e3f8711aa3641227a7cfd11dfa100 + 252c1e7aa89297f3b65138c5aa12f222 + 89ef97bd70a1876bbf0a151914a4ce26 + bdb20b09d0f8b04cd58167a98e39fa89 + 837be8c4a76bc37c36ef1f37d83de8b8 + dabb90eb921328aeb4d8a0c8df2b4e2b + 0454792b70ab007a2766cd6600e27cfa + 74ef64e866c54bba7a072e48c020ea24 + + 51c98eecc7aca86bc68499512436a206 + + 8be3318942ea2a823a0508c2f3df9795 + a071e78b50a9379a9f5214ca7d7c3f83 + a3c5ef0846fddc2536acf0f56d8501b7 + ba10a9093d8c9fe1a2b2acbbc52803fd + 6393c1db9899b0f9e3fc4ad3d6a898dd + 73bd07ce780cf8deb8c4216c8b0f7829 + f5a72f125c3028e31dcc502c74ddc8e6 + 9934bbe7fbf1a7536cbabf0bb31fac8b + 87be9c126db9eec3de467a965685dc9d + 85f1ca2b1e239ba8d8c0e55c1d6e28e9 + c169f8897b8b133fa2f467a455964fe6 + 83aaf607fb20ee8ea58ccba235dc2886 + 0834b1ae7cf8f9db2d3ccf40c9e8238b + b6066192fe6a9a2dd13b591d902cb650 + 6560c8bcd6565754e17f68a88a801ba3 + + + 5e18893cee598d64dc9c7883731c3bd8 + 467d042f1868e4d4e08b11c544729f1d + b753a93665221b4ec3bb9b7e673a94a6 + 62476ed0523a188b116ecccebac90a2a + aec839697dce14f2b35662ec83f8098d + 9ae9918278d274d04294edcf850fc715 + 64fb34de1be8c4cff5d9097965ca187b + da2d9c474d01225142b3278e0e6c88e3 + 07c3c7e0d7e876400abfde105de7ac81 + 3d6404d4111a427bb6c7801be5cc7d58 + 5dd810e614913d06486955e380fee8d2 + 6497ea95b20d9ae90826819cbc6d0676 + + d84f57e474a31a4285ad62a37ed8fa94 + 9d15d64a9f3654e872927409135b1435 + 4062ee2e393d78c3e73ea6f608131084 + 955041a486d501a35cd7bc834cb9715a + c53a304b8c891ad44ab7b52bfe4eda4a + + + 218c847e4c9ece8a2e4edea120fd747a + + + + + fa1189cbade1d26465ebe94758d70949 + + + + + + + + 7132cf3a5973ef757229c2b41ca6496e + + 6f1d5d8c3f7ac47cabaca9d6ee923206 + e4585a36ce3750ecaf05e7b310ce7e84 + + + f83c096f1ea3eb712bf020371b7d3755 + a572e300270f5cdb535de67eb1d9ce3b + 037003b972c8f648880b43b2c912afb7 + 5550b7ad5d3cc20710a0835fdf20e3ec + a3239040e672955a8a520eef6e251d68 + a20755bc554cfef6733ac64574c4f90e + + + 0e4bce53a0b66c79aa6d15e52cf8ec50 + a0bc419aa48d256e19a64596dee53991 + 0910bc4af5280098b8411a8a23aa3e91 + 0e6180cfa379b6e90d6fd8e1b5dd5d57 + c54a4b19474f9d0e9beb8ccb4e3678b3 + bf35ccd3d384c40033b978a402eaf917 + + + af89e2e30f70dd935dd86d31649159e6 + + + 2aade3c6585a84aebbc6d5654522b374 + + + cb15a586f2dcc4fead535bc982e3f91e + 12d5b4e38488c68bc84cc0efba6eb338 + + 075c561afa4825021fa44c3cac68ab94 + 526499d43d682432dac9483da4509179 + db16488ac0d8f1ee09134185e5ff8d61 + 3ada081677d0cf118bba1f4b533b97cf + 99800ab664e1fb0ff46a7133ab13bb1b + 0d04a74dae339bd8d2d0465503590819 + 25e6f213205f060853db918c2d67ef06 + d48eabaae177099a264b5a97379b0abf + d1bee7f6ab4dcf7be5d36dbcd1b81354 + f7055f963f00e5ae9f5b0005d5e4a5ec + c585f82e0a6f8af12da2d3337aa7e901 + 7e0549e63f49b99aac0f6688bfcf99ef + f9fbae74aea3125d25f375942846d9c0 + + ddc3c6a84c6dfa6ea2be2e9ac17d5017 + + d697f04651d6363d1dd5dd8c2ce94cbd + 84d5f4e0b97e37228310a31a4bdc1240 + + + ccce996e0124affcb0c49b4d08d7d2b4 + + ce47e5043444c8753fbe36c64f59dc57 + + + 7358e6f8312f29e36cf8cd3149228f32 + a361f087aac4862ba9a5cf9f6b0ec08d + 98c64d0ebcf2b7127e131d3f7fac2c07 + 63b60dcf41eccdc71b693f10a1a27e77 + 2692d6c40139ecafc1049e4de5067a21 + + 4720510bbb81837e49ea7c972e80ccdd + + a188b3e760d2396c9bfd642a4bd486c0 + b68a33de081c45cc3a784bdc38caaed4 + 852b2365fd87fe606522b068aaf4bb78 + a711bffb1bf3f29558fc79373413f3cb + 3e4bfb8cb5216073d19373af289c258d + 91fb74e60c099805dcd04c89eb05e442 + da71c0933571fa16160a8ef1301e0c0a + c4ca4238a0b923820dcc509a6f75849b + 70982fcb956a7c0c9dbfa535edc298e0 + + 76cdc6776c66eea4cdb9ea11465578b2 + d702083b4b7ae1e69c2cfa973ad3a874 + ebebdea94e6d16aba73b1a7ea543cc43 + 9fc801ccc1ab3d12083e1274a694fd5b + 13c5b72cb5d1717a8043b072029cba0d + c5fee8f51cb2c803248ba35a9c27e06e + 13aa1d06f22068bb68164e42aa4c6f48 + af4a4ff2d058b35d04315699d24c2d6f + + 7daf7f7034f98c2b73b30c3fdd138f68 + 96163330b0a1ab6de507b9520db3e84b + 911d374696c0a5e9e6e848e7f20d0ee1 + + + + + + 804f26b39501c5671b66b2031c5981b2 + e822b19a50d1a7f6e1409e66e735f265 + 8bdb62f02c239a38ec1f4fa4182141bb + 4d8217802fca2d6a122250a8c5d164aa + d57e5cbece5f61158e479d3f1414a7fb + eb3b5c7c5df7cedb4088e84ee1cb1054 + 9a5ce243dec2f9c7fad04aa7a1524aa2 + + 4f554884e576953758707a444b057404 + + fb058d1892bee4fb16d67509e9cde65a + + + + 7d5c70276a4068f7c392a92535931c9e + + a8de6fcd29bcdbbeabf201fc2a08305d + 9f8431262b0538a02d52aa5d8802de71 + df23761184e8cb16906363e9f6ffd8d4 + 948b30b31a66982e781354e5a70eda6b + d855ceb254bf652fe9e419518bfd2e3d + cdfd447b695c9a1787e06bb7f8c1cc40 + de5e5ab75bd38956a383278ade0fee4f + 8cff1814761e23c255fe5a4b0b73c6c7 + 036fe67f2cb9c476f4dbf19a962780c2 + 9ab31b69414bf86c46361e2cc8f7950a + 5b426dbe669df39ce584de93a027be63 + 57ef36a1867647b9b83c2877023cf116 + c385109bb789e66ead556de3080c64e1 + ed104d7bc8987b55fb856835ed8e02aa + 8b9485b2622caca1a2fa5921b8443e29 + 294527e12f9c986e14f93edccf2a89b5 + + + 52e9e071e2a8e4dd30ef5d3b0dcb4089 + + + 4f2408d821f9ad47b7dcd205c4a477e8 + 0a16435b531745890e3e645fc366361d + + + ee88e1e31f60235fda32750074645f41 + 3be6b9e14990818d518dda90db2a219b + e6f70b473590708130f65a08061f7a4d + adacd1316d9714e42b4ba45bbdfd5a09 + + + 5aa93849ba69dca7885bdcd3d5dbcb1f + + a4f09c996510fcb39ab8cf2632267d8c + 0584e20e999db4f4db79ac390d3692f7 + 454ee84faee72462d7ab0b12a005e81d + fd25a9812ee451e60f438f187be0dd7f + 88050f2a0e3d1768c675815ea8accb82 + 32b1b9d0164f3474b4e10e20944572dd + 6d646089592e5898469e7260c9b4c356 + 3c4900a825b84c718ae229dbcb4fffbc + b3714164d3578e82e2c25c7ce6c09f0f + f26530f853973a90bfb45b1fbdfe2ed2 + 7e385d88e7d70c5fd358123a45fb4f95 + 6f7684623fa3ea03cc9217888565ef7d + 9fc5f516ed592aa5e0b105a2ad5ed5cc + + + + + 88190e9b0b213a6c88125146787c95a7 + + 2032da5e2af08c925ff68f26242d42b8 + 9b121e2fa40e4e6b2720fa0f81d84bf9 + 699e75e423cb2ac9a8c014e9ec1bab73 + 917280517cdc2dc901f6b50bb4d410b0 + 2c2e2c08a2a3a8a3d6ce44e6430062bd + 634320512f86836a8defc5cf0624fb23 + e52812fd8d046b169c6b8de39bc23b9f + 22990f94a5b502ff7c6eae191e3a5292 + f13319a0b622d7b7caee45f3bb4a9deb + 14fbaa66e0245696a74d295ce940ce21 + c63aa0198538f3f0332f97270927043a + 7aeb794a5439079e4946d0126ed0e103 + 9865afe23fb98ed6d84a2c214f826ffb + + + 359b4aaaa9c9d50248f76df107d86fac + 4d603236dd1bd32d6ac0025ad4154e42 + c087620f13038bf060b0cda4bd1e05a4 + a58e4ad060748ce344c4435f67082c9a + 15b75d6b4ea34e0c5f25ec4673c689f9 + edd261d9e9da80ceaaa7a8c41bba764d + 268d32d0e3058f5044032860395ebe9e + 75d645c94593a47ff68c99296edd579b + 00c0687e1052a12e39ce778eb0db0625 + 3e8362458415845809bccb05ffe50239 + 3f2e3bddfa80b6245a0d526595bed24f + e33831389d1ab1e048f288f9203deed5 + 991351a1754d96c283e8142f770d8d82 + 96a350404f4c391a568544022331a9af + 2f6ebf43192e4fed285cc0f30d63ed4b + d8b07b00a0439c02fdaf993e0fc269c8 + 1b942c52f3be9315c3e0863d392945d8 + 167a87fe5bba0fa86e6f3d69d3ddc187 + 63f0c6567ee6a95b601c3b39dd5a265d + b3543d023cf3daae572881e1a85beddf + a04cff7c11a0213875eca7363914f494 + 2966319981104b29bff0e6b43774413c + 791c654bc3aeece2da6228dbee2781c6 + 3c61d537dd5ae2e6c4d22c2ad7444915 + a5dff243768a7862ff519c2365cc62a6 + 9f4967aee57bee55df4b9d34b97fb433 + 7311cd9d2c4c413c38e43d31c03429e2 + + + faf42aa7a3312172704e68aa1e20cc07 + c61054a530d67f374090ac90df29f702 + 1337e1d379f61ff278954413b0aebd73 + f7d2ad9e56d6e93cdd40719494abd2d4 + 0c7ef91478bbeaa272295254c0bb751b + f66618647ddbdf3a304a0e6209a041a6 + e3e8a8acecfb2e39acb8b03f1a502a26 + + 0a35ec85e9eb3100f16e76d08120c992 + d1464de6ac219d2e18aa4f4614c9908e + 9b8ecc32387f476a23a1bb6c96cdebd6 + 32d28ecbe0a48217cf282eb8b385faaf + 85ff8875c45f2e2e18f0665824e8bd16 + eebdb9d7459913f3489f791814c5c14a + 540be4203ba780ff262877b7fb555e51 + 81229448e14a00c46f145d19544455e5 + f5ea22b2162e0aee3fa35b9765a2d22f + 009e4bd70cfa52141c8e455f6dc2924a + ce6a97996697eb06e88d0958feb1dac1 + 1d3b259e4fb76ad79e319990e75d04f3 + 1eba585746a0d05af0157e4f19dc50cf + f5f790812adf8d544f3ea9a8fa92dda7 + 5abba5926edfde9dafe25610b5a0ba3e + 4385849f5e1ceec732edd92710a9af09 + a498796f570d143c1075c40ac03c8913 + 883555bea76563d839b0bf6f53df3f3b + 1b97793edd7e7f5241f9d4f80cfa112d + af2191e1fdfee252978a41f21089ff69 + a4057e1094075890290fbb39eaf924b3 + 26298f943a8e7af22ab474a6225ea07a + a9ed9090ca9de7f6fcab08a0baa5dd61 + 2e5a2221536eef6c777c0ad0687faba3 + f412c429c0295ebf6d51b0bc4ba0d5de + 837e0b5040874e13a829cdf78d18baa2 + 8b000b8be8c5f6dedd1c1c0b96778bba + d51de8526cca2c2d0919700af51e153c + cf76543bb65b03a306adfca9f22379c6 + d50a451fa6f7983f2097517536931090 + 48f39f15e92bd961c3ba5db99b5ae0c0 + 8f58c1f3069d36413c9a6eff85b14813 + c2b1c972b30bcac57f41fdc0cd3e9063 + a98166135ff44237bdb2d071f5ab0394 + fdb3deb3d89e2c57e80e8c7de0040ca9 + 7480263f8bc941683f2f605ca793bc88 + 8f3164c0ea0b8f86b96895aaa43d6a64 + b9f0e393e89f49b4a26f55fd12acfe07 + c2db68f442117002ab78e79d73fdbe67 + 591d84aeddcd88490703c115c73d8d49 + 9809d365e84381364fef570b66503ae9 + fe2bfa5ffdf90a6279ab2fe160b6c79b + 8b0675494a38392d8284597dccafe71d + a108a80b1498eab7f5bbb0abf4fe04f2 + d6722dae8a15039f303334f255672c2e + 87583fcee3ac5526533f4813929f235c + d737dc640658554dc1f3d71a69fd58cb + + + 305f697452687765c81a030d696e322d + c1dc65cdb7d4ccfad4a5aac867a15045 + + + + 3bb802673fcd09803a6ef0d1547b1d73 + 55e0c1b3150e322e31266fe8945789a1 + + 0acb216cead40b38b7f8cd2015aa1983 + 5060719fbfffc62a8ee8344e309179d2 + 2acb3ca652cb60249f1afdebc40c4b43 + eb5a922751fbd0bc9a9380cd2ae91b79 + 04fed2516e361106b748ced0707d1008 + b9bedb7c2f7cf87d3f79fe3e17451288 + b504d7d45cdc526e8195a01d128f8f55 + ba72a92bed58b8e89cfcaf95bd187497 + 0c838c69313b9a6dedae59cb5fa1c13d + 72da27fad4e0e41139d97095c94247cb + 3ce2abca53ba62f947f4f9ded9ce326d + aecdca5b2634dd76a7ebb804e18ae34b + e67758f2ba9ebf6fbac5cdef477c01c0 + 54a02f2c7bbaa31ef729715c2993412d + 17e454cfdaa1d1e1b545287161a59ba1 + a17e4219ece247f007d1c3c9bb32a4b8 + 0f8497e222289f9f9238b8524b1d82c7 + e2cd6585cc48c5db6bceb2148aa064a0 + 34d09b12e0257a533701ac5312386961 + 30a3c9fc883139dd4511862ce5426bf7 + 3d18a19cd0ccf716adcc33476279bc2e + 5837c382f9e25811c513a66bcf23b39d + b713880855aa03042f3a6831e9309d26 + cbeb3ffb253ef30f41e7fa65e071dec3 + 058dd82f1947efc5d899ca2dae3b57f5 + 8b4fe4a16f7df0eaae1d0ed87a63d44b + 04184a7832aa292a4ec4106083560609 + 7e2467701ca2e9e03a1bd2b98e1bb41c + 113d5925bb21621294403c15262b99a9 + 4daf1a278ccbf5099812725b18fab447 + 7cca38ee8dc590264f34ced4f1f9737d + be2d329109c48ba7b25bfc81056f9933 + 57bafdb8951051bc1219393517521d8a + d6e4cf8935b8d051003574a217051701 + 15cf8e8d50ab083f99ff2cc94ef607a1 + 8540e87ee07f4c53677a164d55b1d448 + 94a3f2cbe0feb8daffd0b1b425602bab + 4eb5ec4d04c072b175b6d549d5759957 + 67cb8d5ee6b05eb48c5a2c115fbbadb7 + 0976370297c8fc380df71f07b3c661d9 + 443a42d63656ca424ab5c5fdbab48368 + d0f6423b2b7ed14b35f262404fc26757 + 1e66fc139d494508afdbc3ba59683a4f + c82d732d1d9579c1ec5493c94394336b + d71212726de8152ae26e4d2423c9a44b + af076c8395ff22fe8c8dfe549779eb90 + b4094be3094f4f272d6ee748c16454a5 + + 2df311fb10aecc1660df4ce25146c123 + + ba54546cc7265dc4d49d08cbb4fb9cad + + 78e8c6400a2dc7a8f83d372d3c7c982f + bcfd6bad01191acd9a37f868ffbda022 + 4b8beae8bd32175e8f273815e5ec4cc5 + 47bec854e348fd493116a64f2ce07eaa + 1405def671137a0bb4cda9616e23d205 + ce07d22bd16fcaed05f450522bad32f6 + 887b212949dd2cd755f8b717ba4bfdeb + dba240a21585957a75c5489472ceceb7 + + 91094d16aec3e412d156b8ca43fabbca + 2bea5a4bcb5b6dc6e9598cc6fd1df70f + 65aabea371d62154ff95111677267a91 + d72e04a23e21ec997d2597fb66a3e1bb + a111a70f0eb4c089981473245c656753 + + eebe86c33f6d74a8ffc03ecd9a67821d + baa52e989cf3a4b0345cbec8891e6359 + 098f7a7e1020fd4b8e758a239141ad8b + ffd5933f45a966f9377785ee1323c116 + da1421ac38aa4ccd0cd88913a9b69765 + 007b28ade41328b01d7adab82348c2d5 + e80b33304dc880c468be257b3e7d23a3 + bcf860d7c8b77ede2554ba38f248bc92 + 3b51736415c74bc765902de359c345bb + e0e4bab7b106fb09f5ebadbf6087aab0 + e537098ed654f038aa83863e1bbc7776 + a4a9f958e77e3fa556f357426616f4c5 + f9aa1da8083ee7f21c3c0b3d557cf78c + 86fa5ff4fc33656510ee65501a85baf8 + 496edf20aba47b97284a496eb085b8f8 + 90cff962ffac3600999667e24d1c18e9 + 444db46a0cdfcb2a75db8c985b9f86ec + + + 201ee1a612a35205241870da4811e101 + d2352965938d4a9a589cbb8d54172150 + c1cbdcba83adc9fa1c279dd63565488e + e47b5a0d53a831cf57d6e90371fc6689 + 820711680a0b2c1cd92860c0fadc6df7 + ac41dc7e1cbe4b186d44e5991b5a963e + + + 713d7a6932e5808c7ae931a745e688d9 + bfb9196960b496ad65f273bbbbe6fb94 + 66b9169f01468a29895a9d928b2b267a + a86333b632d0bb515b1b37c40f32b658 + + + 51e3cc1eab43543e7e79f834e672ba76 + + 699207513bef364d75dfa4cf0a5955d3 + b8e283ce9f68066d95fe7af5adf20071 + 48d2499cc27261d2aec366811231ee69 + 826766d85aa52a07344a2fad0efc04de + 158fbb7de92d813bf856dcc06a7798d3 + 67cda1e3f88f424f1d6457f2840c2672 + 3ed4eb92fc1c7e71a766ad83b9d31ff5 + 52c813019b08e912b43caf8c7019678e + ac2eb88a1abaf13d6cede212aec7399b + 2d49ec5d407194976719066a1a20a138 + 6f74f03b003b8e63f478c4a8f675c409 + 2f63d33775fe7e5f05d1ec00c55a6d23 + e356f2096ece6016562fb3f5b8aa74f0 + fcd96517ff81005583a07875d94806bf + a5dae9cb0533cc8e5233243a9d766325 + 7702561481cf7d3c34a9391545eed823 + 649c667132cae6e8efcad6856413e82d + dca4cb7f08b2119011f6711fe1696f41 + 125ae49628cfda320bf9da5dfb84cc35 + d7d050190d4239b83131b57453b0cbaa + c9bcba6aae5288ffed383ebb712ec7c8 + b9121c06f3d7e82a81bc0de25b53078f + + + + + + + 5c1048c9d62123819aa63e62e1578be6 + + 36dae3cf3fd10ae5093aaec29b7b5125 + 3ec788adbb0519a92243e569789cfcb9 + + + 78479b3f06ef4d06788a96afba6c7ccc + 46d5eb6fac0c2981b70f879a82649ae3 + 1f3482decf6b49549fa5dfc03dd6802f + 73d9b996e37833b33843da6698358d63 + c6ea1aff1de4231c937abaa7a64be6ae + 5c0c588eecb830253ddd884121881dbb + 062d36d41c22af3f24625bc58144835f + 79297a8a910b48162ff884043efc1612 + 39a119c9afaebb018caa5e3f0dea3eb4 + a5862c390f82e0eef09f9ad9c147b811 + + + + + + b8da2130b2b0f925d71f192f8d1d7fbb + + 95f04c226245ad192b52c9164c1287ad + + + 2fb90f0be7089a45c09a0d1182792419 + + + 58e1e54d0bde1da8df7bc8714ca2405d + + 2e73b4b33f4347a4a65829cf5f568380 + + + ecc3a78fa3a689a22f34a11c5fbba675 + + 63da5909aa85a0eb76e0ad0b5e00811a + + e77d6c98c037e9c1fc72e53c99b2f532 + + + + + ccdc58508cfdc322e29105e19a7089ba + 4139228d6b0e8de4bce672ffb0e48b2d + + 79cae6788bdc0933d398f9b95334d97c + + d43b00551c096c3b1a90d6fc23306b36 + + f97624f580735fe4bc1940ca83b01a06 + + + + + b77c5d53cc214f463143992aacb45103 + + 45b44486d8090de17b2a8b4211fab247 + + + + + a0229285055073b870663eff69cfde61 + + + 23cf13c10acbd0017cc24eda61f05c50 + + 3000fe96423c235bae94d545f0792bd2 + 660fd5be96552a2181ce8c0bb4e70c6d + c3422bd40eb5caa45eebec6e6fb229ef + cb940666753545c10a8c8eaf1123c150 + + ceabff3021822e1e3d4642cd84073d03 + + 22dcf7ebcb99d957458643ed805c58e1 + + + + + + 73a5e55a4bbfdc00fc2117a22fbfd19c + + 826300638b343cc6b2f5c5856eabfcb9 + ed15ffb2e28dbe05dbd3d234cbadf19e + 5a7fd868292dca75155c9fcca6bec6c5 + + + + + + 3791d72318130384ff56e1cab25e4d47 + + + 9a14e36928a3b37a7a3df3c872e007b1 + + + + 4dceb16ba4ad8dd66be832a1cf532823 + 6473260b04958f694d63d4346764e243 + c91ef9f9d4001e41e72073bdd01c98f3 + f71fd3cc2f80de8b6d99a951ddeeedea + 7a3ab581a67fc7773d3d78ac7c593447 + 5f37976e0c71a8fab4a6d4d4b37c1323 + 872a1b0a05e9fae3e10fa5632294c175 + cc970d7925c77b82071a0be36404cd05 + d872a00813ebefb068f8c6558adc02ca + 45e9f5e1388448ffe84f751d2bda2eac + f7c4ca4c307b2a91482ec7c58018611a + 3357d9fcdda7a790a3f8d31cf0c66dee + 94f3948b0282504968242200532f329a + 04722444644d5841224a6603030a05fd + c57da3bee29304de5aba9cdf9b4f1aa1 + 9e3935d776311efab659813f83335dfe + a21557ac1b3f82d921842a0f58a1a903 + 1105f1724238ab614b5cc1835b775017 + 960761eae8bd6528046782036b783f92 + 3982f353069018b5e331afae424e8eb9 + d8e1ec4788980d09a200d59ad76bc71c + 11a80411fdf7dda67acde2a6c92f04b4 + 84fc9ef32e68a4ab53c1899c07e8033b + 6ac548e0087328773eaae5db84f2ee33 + e6f9bc6fdb165f0778a0071c01172c00 + ed639c5191a689da85bfa3e182b468f3 + + + + + + 3f81a4ca3a39286d5c40f0afa5fbc4b2 + 544069b6543ad639b704faa2299b197b + 3e28a552eb276e4128d07a4e3d37d0d8 + 894759fa6b1715c5279af35c03d95595 + + + 7fa820ec9b036cbb9c837c96991067b7 + + 6fbd93294464d824f324a93155306fb6 + ff33552e9db3834adec9c04503841c81 + 62ce03fc53dc0fa86ace01a7c9c3ca39 + 6babd152dee2a2d317fa556dc943d315 + b260e899287c1d51d4981aa94b7b8409 + 7b70dcbb20508c76ce608c840fb4f9b4 + + 9eabd17960f9a9dc9a7f45f6de5025af + 3cc33ccd0e83a58bdb9526000b678ebe + 4407b70cba4aa48fe19ff891e7b8f08a + 08be334c0903885cf4971d6a82f7af01 + 9ca364181180ec6bdbfcf53537525707 + fba34d463e4b1746ed3064ce7b6a9c53 + 6a21ddc95d108fc3366ea8d4ea9d8be3 + f4680df72cd8c7995c1038b343c5bc05 + eac05a1ca9a081884ff1b583646864be + 42f8af1fce85f778bec185ceb5ee077f + a12d03d1a27dd22b58cb5582225a80a1 + 6ec4b7d5dcc20da75c9614a8d6075db7 + 91a448a39d1573440eda578acdd489c0 + d21fba902ea65bbe48eda315372d873b + 7c1f689aa0f54292a9105ab805e9c2f5 + 55143c0e1bae87bb438d855263b84405 + c2f2a1ccae1e2add81ad932467efb112 + d9eaa12cc8bcc74989afd41c38b6a978 + 2750f60f094863b2fb0af5d3b1eacae0 + 6925c8707774b587ec0684353353d507 + + + + ec3bb52a00e176a7181d454dffaea219 + c6ecbd5cb5fbcbc3c86031e21c967d54 + bb53ad7bffecc0014d64553e96501dce + + + d7c639084f684d66a1bc66855d193ed8 + 5dc41d8fe329a22fa1ee9225571c843e + e6cf7c6ec7c2d6f670ae9d762604cb0b + 1dc35d25e61d819a9c357074014867ab + c8ddf1e5e5bf3682bc7bebf30f394148 + 25a32416abee198dd821b0b17a198a8f + + + 05e51b1db558320f1939f9789ccf5c8f + 5869c96cc8f19086aee625d670d741f9 + + + 8a05415289a9fa7f16126805d6b60bb7 + + 38260fb73d0d11658af50359d205aeec + + + 581b0661f8c75fc1f43144d82ce82e38 + 75bfd6f8473c91ad767ed70f0d8b5843 + ccc7352d5d9d1a893adf8bc5c39c3c0e + 5855ecb89bf30d559aba4ac0905f200b + 0f4689525152e442a1ad64cda0a6b3b9 + d665eab69bd00858bfc0b0e235641a38 + + + 6c495ad166f51cf8a59fe21626f1c13b + 6cdf1352518c0274310a625394aee4de + a4b03b65841bf2df405af8b121e26154 + d062b515ae10a90d060fef416b4a4344 + 25438761be37fb3e8449c54dcb438117 + ad4590022f43109a2cb5414c67be2075 + ae1095cea024901037feceaf713144f6 + af8093a45a950bab909348ed8016b2c4 + 1990ebef86b3679050a5c64f838ede1a + 81cb62557a7b326bd756052ecd889f4a + ad8f28c45c1b966315dccd9711a38252 + 64e046ff957aa17cb51bdefe47280b17 + fc712df41ff93cb1b39aa10a40701ea5 + 6750777729bef68c2dffcf48fc71bd43 + d89ee97ff0055e1be36af87343fc574e + 86f6fb6c8d0b7329113e3026fe09aaea + b17449864e21a001dbadac7f570a3bad + e2b4a04d2b8a04daafa78a46e6ad1767 + 2d8059139d46589de4b2690367fe2d92 + bf051036a277885af4f3925320d71818 + d0ed8ee45c3e7ce428262a7eec23b13b + bbbf9a0085132ec4bb9e1365c4c6d030 + 2c706d0eccf3a47e2b32c2f947bb649a + ecebb192e383bc5f54b435b3a4cc39b9 + c1c0b2414c304bea7d6cc86dc31b7077 + 9a28cffa744ff2ee606583dac1881039 + c07f9ec4ff4028eddcec15654dc1cae3 + 44eb148e89a51c625be7e5736faf5587 + f960814ba1e2acea546fedf853186193 + c35ddccc7a3c334a4f2d4621ca765ab0 + 9ff9ed973c990b30fc6596ef2f4f4805 + f9c8b5524bcadac530ffa374c8bb896c + 4bfff7417d1c24f0a39c49c275c340c3 + f4a3a733ce7c8d1d639d416e79f1c2ce + eae824fe22f8bd82f45cf0354bad1d76 + 587038c85826df3c06945ac1df98810c + c46268c930a0d8ae9ade8365938a3b70 + f6516e07ba3f3a04109cb3637fd58116 + 05492c8aea8d06f80e2082638ee59c53 + 51dec6a008f74476906f1e7cdefdf83a + 08117d4936bdcabb8fbca1fd55b34224 + 6a4f012ce95fa43d33025b3e7210bca9 + c3470ae5418542b5f262e1fd9883e5ce + e8ec0e81ead3b4b5f31ac3e05e01d0e0 + 61efc9a13f51dde1ca5eaeff4708b76a + 03b79f9c0148bdb6f370849ccb53ef61 + 0ea7180c7cc7eb35edf6307c5e99fdae + 0039c2a29a7e3bc2315ef60d20ec81db + af1944658f343afc473e1991a3f3612c + + + + 5a9e76076b50aba4f2c6be0e3544472b + c78c5ea2eb09eef91aa6efe9dd6a2974 + 55f2163c00df9221ded52926b707e5ea + 4274f6661291cbaf25fc2b578ecc78a8 + d325937362a3a7ddd3bba8bad7b82204 + 4148323b72aff51c4ba6934a95524133 + 6f5a327d910f75f4fe75e36d0ad6275c + b419c80c0fc2f27095b86ce567fe3b63 + 6f289a634b519246ccd27a38f0d65e66 + e46ba9b171ae5201b579c694f116e556 + + + 81d38d0ed58f01c3e45751338abe4606 + e7eca0ff3fdce85b43d226d1c4fa39f5 + efbfcb2da3a18db95c14930171e79303 + 39ba0e62979d5852a836b0b43794e1e6 + + + + ccb1a1f2dbe0f9f531faacc15ac746b8 + 3e446d6e49568d1356aae7fad63c6686 + 5b978a1084415d9a73132f44786bf117 + e45fee736256db40eb15caebba6e9a00 + dd2d482de2c6772b1b3cab4402520757 + e2d0784625785631993cd6a8684f2de7 + f18bf66e86d29fef637f61a1be1ec8f4 + 5da68412b55fb7ec9cb3aa0bb2d841c3 + 52afe50937f5d6419f1a62eda5d20322 + 8a37847f8f6f60c336504db30bab693a + 9bebcacab96b36a82fdc65f33a41aba4 + 2bf98680e1d42bf0b4d9d73db9a458a3 + 5eae249bbf6c07c05a5119b6306befad + 7789dc01cc6ffb020e7e0a9d0d33a43a + 3839614d5d26c21a3fd626683653ef61 + 084f692a51790eb5803640e097808533 + 455e2754f292724660d0c5f20643d82a + 6b8229203acbc11b2b419cbf247fddfe + + + c29a47aeaf63f79f61e343555fec4a5b + 1f2ffb241a52ddd616bcfbbd3b26a839 + efd959ae550f678e62ea76a6ea6a7c68 + + + + de71e188a751ba448198b804a2d2b1fd + 0ed58e7f543d5076d631f933d39926b1 + 5ae0e65fc7f14ecae3d17532d960e78c + + 35c643e547248adafb0cc5624f1aa78e + 57e89cac5506e0a3669b5144de4c7181 + 720b3a325ebe0c3fe1d09f073b925bd5 + 56b38be99577b0c34345b4f692b01773 + + + b9ad58bde3f409d0c6039a357405b84e + 561b6f59e301c30a40dceb0376f4c29d + c164f82dbfd4532650b438dfaffb77e9 + 1ca6955a491dfa9b6b75dda16b6b0660 + + + d14b861d3e47f896c0c93d0293196f08 + 463ef5b98c20a0b911a1db89b251820d + 5bbf8fa54660c1fc0a20678841f6f449 + ebcd65ac212c31324a35c14a4d6d8b0c + 93707916ac99e03e2510dd2635db0ea8 + 23fb1a4be9b54ff16226058ab64f1f4a + f417a1a0495648004f3a4da2e05000a1 + e218f272eb3ed135f7efdfb8086b657e + 37b5630473593608a0df8c84b3a85224 + d7976e07b38066a17befc2d9850d4520 + 1889736c3232f6609b48d2dfc684ab9f + 7eadd92785ac84a430f631e4a6d20f55 + 40a435aa49c06e324a7004dbf56dfeb0 + d8cf18eaa990b064635f82294ae919b5 + b64b22924273b7fcb4bfead7328a926c + 2fb7e979a8d6b1385053b3c19bcb2a58 + 9b73bafb727e987b23145469958f7fd7 + dcdf29069901bff101bbe9beed718770 + c88635f30985d278025fa62a4e4119df + 5f2043c25378f95668ee5b15d93a0bce + 0e355ca9495196da3e30d946c6a4b5c6 + 53786c958e0961c6a7b8f2ecac494524 + 3cad4761c43a751434143a87f83aec30 + 1b551610d8dc1f876698f5d3322589d4 + d1f17631e70326871a89ac99612cf556 + eed8adbe8b5357c081fbd71c8d395ba4 + f6133e9708c68bfe321d916b7f686d10 + 80b380c1886ff1c60ade41c1abd4a585 + 99bbb26f70db769f02f28ade8e5b7139 + ad4eb8d9f9aa60502afc9c9c180c6bb4 + 624588cbf37c385b470685b299f419d3 + e077ddfc84feb14d6703ab98daf51409 + e9611702995954a6f868fcf6fa6afd84 + 05ecd855f54fe71c12df8fe9109f6c11 + 75ae1448ed36c3b53918295924cf3c1b + 3c91c8907d79f6fae12e761f70131093 + e8a3ff9d3099afbb338d6dc9e52a4b66 + 5fa7f0017a6ade216b2cab6d7db7ed45 + 6cfe54babed3e90b62e3de56bf7c5d8e + 1a8925a96eace9337d7b03a4545c9159 + cf9b51ea6b4c3fac4f51b4023169bbc1 + 2b74ab89819a881265ac61c7f9e9a7d1 + 3e1e87607f2a5043cf0011bb590a9620 + b770b7f8c547d557d6dffa56aa632ac2 + 5b64a2269a0abfa0895eb64fd9c342c1 + ba947a433bebfcd29ff0f5bbd6bb41f7 + 24062490e3ff32e672910fb2fe7e8cfe + 99fadcf2232712f212f954b485cec8dd + 7ad3ae09b0090b7296194d52273cc8d8 + 67bdeb7b898136999214a6f6a1cb428d + 551fa2c91af21dbf230bb930f9e377d5 + 693b9fb64233b057ab9044394d8ed937 + f1cd14235543e030ec0e88328f3d15f9 + d4243bfc2efdc5c451023ed4eb8e8e38 + a75beee1e163c5f509b720e68b6e3d46 + 32e640e4c51a3cdbc41ae6efae098d6c + 62f7dc707aec0850c4566ba468e7310f + ba7d2ae01f98b10040f264eecff5e6fe + e92e6e9a5aba9163409d665bcbe2a890 + ec472eadf94d5b87b5cf4c19eec14193 + 4db130626f405109f77560654cc3c8b3 + a32e92d30da10d5af865c2bea0fe8452 + 95bff1acc0ba24ee10cf420652f3592f + 10a6c289ce600005d27acb25d8eb4cc0 + 5b8989af22833e2b569538c3c1fce2e2 + f42b766277b2aef9ea9f0efd059b2563 + 8fb87a2e9f0c523bfe71610c6d5800e5 + dde1864de11ef1e94b88d7ca13ceed77 + fb4be5af8e10a34a1a1c2caf763008a2 + 956e54615a452258868a43aab7843cd1 + 7fe88ad61325a471a7616f8841f77bc0 + 00b6c54625f78b88e39d9555109fe7b6 + addbb68f918344c3a043c2703f6a2a44 + 394457b55783bd3082015efa2a050254 + 81f4c424f5bb601ed545b61317d90814 + 729dc7664ddcd2ebf9bee2a7992ebe61 + ff8423aa0050c4a5e8c29449860c8a66 + 689fd2a6fc370d7cc264e55035dffdc3 + beb1f090c4c32a8557646d65dddd581b + d3c9c12e91ef74501ab81ab5bd649357 + a75beee1e163c5f509b720e68b6e3d46 + d28aeadcd8310ea4913e8d31bdbf3351 + ae8d0e984670f9c65fe3f138b2bfc565 + b7f25996654021dc29a34fb49ace004f + 264a32aed84b676fc0db01433fb7280d + 1cf40d1983debd924a16d5eafdbb7006 + 59218963957cf83e90e2bfd33a6c7823 + 9d053783fe0be4115f24810511470b91 + 132385dd38bd304a92e785db33279cb2 + c52b357dcf5b2467663f9c8377a8b031 + 1651d9e99b2a7c95fa1fbb5c1ccab098 + + 6621f3b888cdd6eb3d1be27b1dac44a2 + + + + + 89e8b9a18f17753de7ad42fc7f3ef229 + + d4d7e66cf6e18868c39d7de212b59636 + e4335c266d09ed767e6c1f9cf9fc7957 + + + 46575e48a64c31ae333161e1d3739656 + + + + f6a6be1b3a7ffa3a3cbdbb8295c8da48 + 58c5af2b62ca683755fb7f76ceaa46f5 + + + 64a1b6c9799a6a22adb7ff73ee49a089 + 08e88f15af4c6a249c1a3318f926dbf4 + + + fdf408a14a757c4360682dedb717911a + 4d436bf929857bef25664e14b65ef6f6 + + + 0e8d74bc1ac7d2d2107fd957892bbeb5 + 861238e9d8cb1ae52bc538abf995b106 + + + + 8261bf57b415e1a88380db91abecfe5f + + + + 90752be1105452033f9eb03d303fe82b + e86ff8f8b723d365e0b8b7557d1a6571 + + + ce1959174e09075c8735371642a87c89 + 5427d8cb256c8cd90af4480f41fea8e0 + + + 5d9f2bb37b1163be8a4821da099dfd7d + 11f24172cd324b1a6fff587b47b86c01 + + + 0500094bf1238c64e627507dc516a33f + 7a2814b038bb1cb7855794d5b150e6f0 + + + 76154bcd75a0fd27ea8a9d1e4a08e222 + bf245ab7f904ee9cc2be8b388fbc55a8 + + + 70b8f939b1fd2f394f09943cc4c696d9 + f6a85ccb557f4be247f23af0efe93d1b + + + fe55c29576c7d7ca09568aab65e23531 + 058bfcb2ea092ed16dd2562cd86e0314 + + + 60db3795c3a39d037c02496321bf05be + 928fc5770d08ebb9fbc20001625f7a86 + + + e7a34a72ca097962875d2e23198d1222 + + 52916dbf04463bd70ad3e37fab86cf6e + 62fa8144ba3ae5bcbbd1fff3dad80cac + + 278ecac23c47be18f8434919dc18e060 + + + 341a8bf0eb565d1714fad3f5abc35316 + b5a920872c369aba9afbd8220b9a9f11 + + + d0acf5f513571688477d58d180009dba + af244b769c8c1faa7d71e37f61c0ad35 + + + ea078dc05b41b4c284bd52b4260a53e2 + 1194d2b6535540c9fa2d8475b8cb13c8 + + + 7ab8929e918c3c9b34646d2204727da1 + e6aca6c9ae83cf0fa7e3dda7efc0ecae + a85d115522c061cdeaa14ff7aa534206 + fc9c1c9399bfdb3bbb1c6e783c45414a + b2ea74e2f0bd9f9d10f392e5e6dbaad2 + 25731105a0902e55a7a76b65629b9c16 + cca9343ccc15e11d57b387e30ebc8642 + 7fb22879f61630ee3b95739f19e652ea + f28a5c52acf749fc94ceafbf478cb7ca + 9d30b48a501b230656b4504ddc315089 + 73387d175737ca2cff45cc5473c97254 + 3a49df9c8a9fb0845a3329ab4f63063b + d09fcbccd13b3cfc396280649e49a722 + 728cf49dcfb874bb9b6203fc4b31413d + 07987b6c3a26a0e1206b96cd8bbcfb10 + 5471f1f97f8805385b152d62800f4acc + + + f5f9937a50cae776e802cac280969ca2 + f5206775de05b3e62713d6aa4760ac43 + 42be60fec9eb98869289178d752a57d3 + 756ac3f47e09bc6f1e6f75d6139d8d2f + 22707cc0499ebbb708829186a4f1d700 + ca7447cd40708eae51c10d606041c0dc + c8b626267c497a7a39662053b0287289 + 62bc154bb61b99fd45fb3bcf5f5adcb4 + beb94a4fbff703d22946ad30869c31d2 + 69ab7acf4a6d2de87559e53a7618b6a0 + + + + bf47105e92ab0a1c63360f8670586cc3 + 01cb434f5a727d7dda4a54be9c79adb1 + 22a84f51a8caf492c4022dbc0e71227b + de0f3cffb53d385a73c259fbdb9aee85 + + 546bd851ab16ef845326c6e89e0186dc + 023bb2744d8974d7d57c4302ca214e04 + 4493a4a3f08cf15170e65da377a053d0 + f77b6f7c0656125e875fc4e65a59fa59 + 9c297f92804539c876a75d2ce8eb4b65 + 426e74af87c8d97c6b52b22db20c2dd8 + ae38f1dec01befd1ebfe90221746fcd3 + 93a391c9d0a14c81d0600b9502e09b9a + 01882bfdece5d457ec586aa0f8ee3df2 + 527006e612464683e1d8719d1732f5bb + 17ff8e9e40447068fbdd0d661bc881da + + + 8635b0e989368851718a384f0d31858c + 96005450ffbbfe04b487e70df9454d57 + 26dbd4169d7d94f2f46f996a8d097c77 + + + 4fa968a9421452e44ccd1e21471518ae + 5be69f1215167c283bbf5d4d314b7c16 + + + 153961af7191f71dc872aa72ca7fb9b2 + 66ecbd01f1f6a25e938a06323340e2a8 + 3256a3172594edc019e79130039fdc85 + + + + 41db2c60e84b309eb37cc072750015c8 + + + + f02463733b2375d377e8335283e1267b + dcc1989f2f5780763a8a943e7e4df29d + 6b144047eefdd94ec7f9cc638c112c9d + + + 6474f0d87ee5192720300a23c5433273 + 151177bdcabe2ea7bb32240bbc7c08c3 + + cccf9e8c0313ed76b53f62d76f9f847d + 613db595e6f548a2d42c175592b41da7 + b323b510c484b834e99c4168e765e3be + 1496c2f793f36696620a45e68ba7ebf2 + 826b778c32a3078de5debd98f4e84b27 + + 9378bb70094ab7e1a02544e1748158bd + + 46498d998175cbae4c9183988de3b188 + + + 318de26d87f573572d7b250431d9124c + a055b32073e42f42292e6fb552ae7757 + b45265c0e85fec2722349f5bf6f96ab0 + 428968c473c13fd637eb43433fb12dc5 + 2a3718a28182df67ad118a269d9abb04 + a5d094dd9a6ef937faafd1856dc6e89d + 729ef25d0e3c5c968ab9a3434000f471 + 90c55975ca751982845e315ef64c8b9b + 42489de60938a48fb7d194a9d2aaf84f + 15ff0ce28d5278e1d9bcbe5011a40a85 + d4370d9059eed36652418cfd3e2444c5 + de34ca7a06a5cb897553a905404a7722 + d9dda59f3b6496891ea99aaa2071a4b7 + + 240362aa8af5667bbc42197ce663a1f2 + 32488eae5368d351e65c0c67bad5914b + 19062a5bcb2733f5c0e20d318b061457 + f7eca487488c3c7dcce5fd97e0317b83 + 658e085ca2ac200faf6df71742c1dc51 + dfd468e3029d2519af03eca74730cd95 + 275d64b0b61d9e26f7192981d6a08f6f + e5d6fea15a1ea0e2ddce2878073e7631 + 817fe5eaa39009096f2b25adbb54aec6 + f7777b684b63890b809f119280190e40 + 686504190742b27499b0e61ee9bca828 + 55d0eac00fe6d57e827583d189d2d85d + + + f1d8e8fcdcdfe5fd1c40eed4b464676e + 47a9032bf62a9d7aea972f356ac8046b + 72cc2ed47946517b857d49f385b47d73 + 8cea67313aa77505db908666ebb1d6d1 + + + a681c27484c7fc3b9182772aa2c5b985 + + 175148b3ad050f9114453fb9c90fbf96 + + + ec7e2e2e8f8d68d13d8db6ebf32070ce + + b73fc6ca852114c7dbb3a5b88568c006 + + + db12e4de3126391e29fdaee1b23d1417 + + + 7df4fddebcd12fd014aaf28a2768d5f7 + + af355d38eae21d65c5f3e12c982d9642 + + + 51b0fffbee8271ba79f588725b74e006 + + + a5d6489038115a467b4ba7fc70aa6f5b + + 60751ca30a979b2788ec756dcf925b65 + + 0f524f973ee9ddaaaf4d94c0f4563ed9 + 88a12fb897701336f952635d83363f99 + 8b89cf77860d6b5c1f487d461f26844c + bb25fb4dcf5c745c711643f1578944df + f2baae6a8e44b2bcb440b0c693bef89a + cfd438886594d14d87bf62ba114e45d3 + + + + 32ebd0e676930cff1990f4648964b740 + a1d16a882122eef1c625e41817fcf056 + + 7d5d191e6ced3d9f96a59dcba25f3aa2 + e25bf470ff867a220e958e74e404fd5f + + + 26689324228d88ba905f761c21d84ede + 477c7e7d9b4a6e13af68234ad95b9304 + 59cde6f2e97a2e898d72b7a476fa7ac7 + 60d1115cd273b71a1fde3578cbbc7f6a + f5f6976f1757807f4bb35fecebdb69fa + ac12dade7cfb9169f4a52177d45996b9 + 77bd6a95a4687b03428f2987ab26faf7 + + 1fe5846fa2fd501623c69dc90854370c + ce48ecb8f33e85a109b2c84423eec94c + 56ef913edfa6b70f567687bf2d8e9b67 + 7b3ed16dbd94a35bda2cf71d28a78ce8 + 19893b9f1937e1b5ad9f365250fe7178 + ce3315aa5dfef8e6fe20e7eb6c15ee29 + a2d33e7627674c8c98832e302fcb5aba + 3598cc25975cad5d2de86e993ab73ddc + 3c086a8a94c8a988f35586376fbbd157 + c7c3978e421f91483f87331d72fac9d4 + 21eab3c0bf2b54254a2a6034391e7ff7 + 85e89b80b1874371914f76c6a375037a + + + 540cf951919ad406ac29e103f2951fd9 + 418b6523a878b5052fe540f733a3a278 + 71aa05bbd101267cbef0ec1a3a9a52b2 + b13f4299907e5f42c948e0d59ba4246c + 2600e5988e2c7898134da507f5ef7b30 + 006de16635321f0ad9c24074447d4cb8 + b86549f70619ea0851726145202b2ff4 + bfe6d498c6f35fb9fe1cacea43e0600a + cc7a0f232a9fe6a829bf75cd280d6fa9 + 962e3f22a84c072f68e492432ffd01bb + 96f399e20ce5aca0fcf18a371c43bb0e + + + 36235a2c568c950fe6af6bd2c3b34f10 + + + 02bd1b9cb74aa069a8a9a4d09e7e1550 + + b0d9f0ceaf27cf4efe6d7a0e08be8807 + + + 5caaf390504d0c03a8f82ee8fba57b0f + + 82581321a1988d995d22413a2a9b3cf5 + 490ab6457c44f07016ca8c7256c5a275 + 6fad18cbabf331765b64fb7f13923b1e + 354bb6baaf1e523f89a70a5cd70d663f + 89801d398822ec971b240bd937723e14 + c4708f5d3a5c98548753b2d6814bd328 + e8ddeba2a3408995a0c433e15a8a8af2 + 9120a461d9e83fd6b119c341f6afac40 + fa57e9ce04af7b413e16ad612a8916d4 + ec5998326f7a2a508c7c76ed5586d81a + e4a20bcf7d4f4b9b6dcd005d1746e8eb + 6289d5494a51169c0093ed82075f72b6 + eaf47d42794624b41dbbcf7e157fcd30 + 54693ee40ba6c22f4a832a99fbefbf19 + 7bc7ec86adc2d18e96ef036178493d2c + 9b083d888f4bbb5c7452941ae9a3f715 + 51bf5aac095e9211c0b8674badfb7aa2 + cd5a895322b03c7f4f5c209f0c6111ba + 91ffe5fb96ef8f0b9ef517ad38eb96e7 + 0295ec1a3a3cd38e4eff48ba14287b59 + 3241e5a97424f4f5cedb0446edc7e841 + + + + + 4d1ad3a4fc015f62a71cf3f949127ccd + + 8c085dba23ed6a25f724309ea9fdf8cb + b0b368b074652c76f58e870f0bb29849 + 975d5bec1df042db165716f5ee6a1753 + 801e16979dd7a9a1edaa66d20a2e6465 + 5ee81f48636e8ad9c59b01fc44c622b7 + 84acca7a1da2c96e1717c581d9a37168 + 60cf5dc3c0ce8cac3f9aad6ba1059397 + 1952dcca43c421a89d53cd59afeb9f70 + + + 5381f44caf175babac59e201a8f79ac2 + 43cf625cd03060dc676f76e174834df3 + 2c280634f4139e142344b10bce6ad263 + ad1dbe680cd13a4debb4c943766471a3 + 2edbdea420c15723ef1ae40f34942a1c + d1e016c2b1db3900d840690cee83faee + e7733149313b3e3990f0ec8880390bd6 + + 5de60513f2f26d4fb3c8d35632601a71 + + cd7830f77277964f3eb6b49db10a5597 + cba579f69fdac63889f544f04c942ad3 + 1557562ec5ec35ac8751cb27ee46d793 + + + b85c732989eca70569e9df35f983c908 + d7185318566f1ff30dee729719bfa809 + 6e9efeca01f76d02894d8e124ea9dae1 + 5f5c551251bc09351246e6c377b0ba3f + fa295d95f80a8d057590e4911e116a8c + 46479d959eeb0e03643fc500c66d7892 + d030878dd7dea4d3b17d63c013e2325b + 93036589cd1124c8bcd0f84f1fa23e69 + 35bbb3de3ff88c9b517c46314a533163 + 8caaf428ce436e5b6693575fd6825ab9 + 6abcebaefb09880000f7d2378780e268 + b4c297b67c0ae790a008ffb3f39e6c6d + eafc9a9adc5945f0f5761f0b02d08952 + f7791a541dbd4dbdd68c8039abb0294d + + 479397ac8a3800341418bf5def8179f0 + 2c8885a9c19d24514903905df56a175b + acd6280b195cd2b785299b6f476b7608 + 3e370c8a91c0f81e00ed538ad2af12fa + 6aa5c4105b94a1fb4bf7f3397f5f8b27 + 8aec4e1ced7bde9304dad1f6949dfe11 + ae120656408a03bbb2858a2396e053e9 + ac0503c58ac2a0b595ee7566752466ec + + db340f3d08263e743f98469fb51e3f51 + 5be0f7e23e559a4791b288e2c4509fe4 + 41dc3f6e7aefd0f075a6e1ddadb788e6 + ddce5a1470e27e63ac999603cc80f4e2 + 99ad4ac123f12b33cd3b40cf10042910 + 0b8867911d2ade4c4ae4f9778eeb382a + 02162c0377c85878cab2ff51b629c87b + 5b9135a9163f26e87ad836e1a1ea7978 + 03f1a33e2f9eeb3d1cd56bb174862633 + ee1303656dc045a79a57d4e0e62f0902 + + 347e46d4e6411a38bbf19eb8236cf0d5 + + a5a8c0f3925192dc7afd8f68bfc4ef89 + c3a73b731f0fa54a60c74b563a541828 + + + + + 583bfa214f62ea80f73be2aaa3881dd5 + + + af752239b5d35cbe6a6b89c485ab4ade + 5f89c13db8d46b3791b631ccb1d04d4e + 6e1c2bf87e0bdaeece5eaf86d1b05fb9 + f4cc95d4e82750dcbba736223de3041d + + + d10f5a418e44c2faa629752b2a725ecd + + 303e63aec90810ae6ae94bd8ce188178 + + 357279f6a231473dcbc2cf9455ecb8d5 + + + b519d44d434e908d5d4e9b8cf5eff763 + f8c00ec31dfb714eb234f48818fb53ee + 9eeca06aa9c0a47f26a839606f3b3209 + cff83e474cd86fe1d6d0adcfdfba26c0 + 41f053e013fb7b5e24dc27dcba9ecae2 + 18326c561892720ac01c17aa5d94a720 + 83eb23a0b6198e15e4e9bd9912e7563c + 145db76f9dbb645a4d0675885d704680 + 5b7fb8e9528b216e73784d4c02747a4c + + + 2ff703c50ca4f823dc7b8c3a288fe13c + + + ec1c76c795a81b4333b127cd991ce3e4 + b3595cb8c976b58bfc1af9a6658b7141 + 3be1f6e59c8fbbb88c51f4e58192d27f + cad843c687e090d5c0044ae83e794505 + 605c5137ac0452769c137b600879a16a + 2fec515c2fb82a2cd2222143a995aa7d + + + aceb63ac1055f3fe37111ef99d461f70 + 888f0698454c11ef816557b6e8915028 + 254e502e9b5d45ecb3d4c62d1440563e + + + f43fbe4afb635fd53de79a81eb852ac9 + + + 4ef259da708f264649b280e22663d07f + 490542f61c2257f407866f2e75dfe92b + + + 97a2ca961871d46a4e2d19926f607584 + 79f9feff8b655ff6e3c50b1c49231d1a + + 9f4d98a2fd175790e6eafad826ba31a3 + a6b46e69fc8e0e2e0ed2610a882a9341 + 3070495308a70b3e3584529c6d4361fd + effbf91fca4c6dcaa8e08b2a0d0f0b17 + bcf2da88ae248ba7a49429c66d6ca309 + d1f921d866462226b7a6f130a351a1ba + cee6d8b4f321c90802c72bce46b104c1 + a5bb7e65dc2decefc7c1a2e58b15269c + + 7c5dc79a4bbddc1333235b1b3dcbe514 + b03b0d5685f26086524dd6971d1bc024 + + + + + 65fb50f764f02024e4f3f53fd3b63cdc + feb9de3f42ea614ce20d48224bf16eee + 8f8ab2e6c3fbdc95e377cf73cf52e34d + 094ee783347202ea4b66945a9c1b50d9 + eea16c9af1db77c9f7aa56b3d76a5377 + bef6f286bbb75ccf844d284fb610777d + d7781c5c5aaad35cc94564cfebca0be8 + + 3f34515cac07deaf278953ff1572db16 + + f7b594cffc0e3b4786c98e29749dd278 + + 7d1ade97df08a16056989a544ac4d69d + 4b4fbb6f975a38f4f6c0f6e721662d8b + + + + + + d637094ef94c0573d4e33b6f0897196a + + + + + 0c90aae88332d62fecd4c231d84a6abb + + 60bea938aab56e987a4be646753cbaeb + 78dc0b9645a95c9f23fbbc9c972f4de1 + + + + + 10e3d0ceac73de28897b55696661ba94 + 7808b6505644d8627e4f962ae3859f9e + e1af8dfc73e59a414afa27fa356c6813 + + 3912734a4a1d7b855ffc749b8e2404cd + 3520431784034997a13d9b3d6d06628f + adf1ae145bcaae775d8f2af028e40ae1 + 5943903fb98344959554e63c09031a1d + + 299cec980206f946beb63a20d5c467ac + + c67e5fca6524402e2df3141ed59f1732 + 4233c955231ed179d72d8a3962ef28dd + b03f66829406a00887e3a5b0bf3e513b + a808a186f52a4677c9c5c77a7909a0e4 + 6fd9011c4066acd45c558f6b01478438 + + + 77b57a0db7b08ef4942fea20b6995425 + 4791e79a5db9b8573774c4165b9bd4c0 + + + 00ee1107f3cb116bfa9c5c305bc8de8a + + b1de04c9abe1390026ed0b47aa9fa06b + + 7815def7f995a1b5a222fcea9a6b69d1 + 8e8979e4c80cf075e817c64b21ae6c39 + + + + bd41ef10c62f1f7463305b83232cd513 + + + + 29313147806e3843c25c47845990f577 + 02e137ba6218a07dd2dafeda3879fe57 + + + fe9cea10d039f926d1de82edfed15e10 + + + 1f4a1a5f0fb1a60a60fa6fce4a564dfc + + 02f66f9e479281f86eb669707a48abcd + 030dbe8dbd6ed02c2327eeae2cb454a2 + + 89a3fbd5a33a8e2b810aa1d97092493d + + + ae8cfa9f84f30879c6332d3430ab9c71 + + 7b2992bd410264ced73c4d15f24b62b5 + + 97daca00722b8ad60c2714d53e26fd80 + f6ebbe2e8bb49827d28373e932398499 + + 2e7de71ed06e07a4522c95a469721625 + + + + a978882afe73e1c90335a0cc8809c819 + + + 3f3346b8e31e1b57ef196b3dea768765 + + d48081f527f6d2aaddc190b58ac204ad + + 8aeea88aa2392ad410212a26e1000faa + f0cb2738a801e32255ffea0fc6ba9812 + + + + + + 9e16dab28c6052b0a234ad5c0d929daa + f002ace379a7ab5c034751bcf1ba1e31 + a91bb63c56eb83de54f58917ac62970e + 1a60b5b8a855d81fdf394ca1923668cf + + 16185f0e38f573358ff5fd48be944f1a + + + 7320ae3aa92f4b6525f59c24ab170cf6 + + 8fc6d3d2099bf1fd8d03a3273157c8d3 + d459395043420a1cfde26c94500f5b66 + d7a4fda88b943f658e13f7f5aa3e85f1 + + + + + f197eadeb08eefbd24782c8a09359e49 + 4c15e1052af7d1f6e765bae922a14999 + 2985a0f4b95ca11dab293de966ad7205 + 16c4a53f19a6c9a84f98f9d014f989bb + + + + 1a74629072fd794937be394ab689327e + + + cfac6d4dc3ebf2c7f0e49f74d1bcd44a + + a653a140fb81bf4c37da14a60c2ad1d7 + 885f63b13ecb1ab70b3da51573770ef4 + 52cb71ea2645f556b4e1e519d1c78a76 + + cc226142fd5d390d030b39c61cf97843 + 38c6f36342995b7aa96b30aedb9eca1e + 7d2f0bd1583524d739fff12f0507de65 + 0cfdfa8d81e5b22c24c96ae7014213c0 + 460689f292a11ebce586ef066313dd5d + 80438cede9b432c45cd59838fc3080af + ae4ceaec6a65c2a29bdb08ebce30d111 + + + + + + 446f1f5de9d09ab7dc45219a69f16aca + f070de2116d9d1ca836e68a404414d10 + 20d1a7697e755d3b9f66a61d49641db8 + + + + + + a743ec250079f6d32adf64469eb7a5db + + + 8a62fa0ba1f093f23e661d663aa0f852 + + 504b55f8d1fda647435faae146eab7f3 + 5c2c6e67b97e57eabe62aa04e614963a + 0f20b870f6b90cb6e08a022ab069561e + fa44b756645b54c282749ccbb9886c96 + bec7bf1794959423b0c2872304497b55 + 161732e30631a5454e4f433608b04d09 + 3afdde2c8795c93b0659c1d2cc08c866 + 201f27e7c74cf02f29a279a814881363 + 786556ea8d04564468d5e8bf84e4c1d8 + 72ee391c808aeaeb95491f2bb1a162c7 + af6917152cc8a667b055f9a68df44457 + 18d91d70105f8fa5668aac9a238468d1 + f53a54376ed2f3d96c4de81c0cb66396 + + + + + + 48f33f616c69b4ec7b2e5d43a4a7ae73 + + b0a3975c1fac3f38bb6ca74497f8e1bd + + + 09c8b09a0af9ad1bc93b17be9182aee7 + + + + ae3d728756d953b47ed3689bcf92c8fd + ffc7a6085549bf0502b42e0ce423dfdb + 145866ac73438d4ab3492540700c5e28 + + + 9a5f1eedf6ebb6c53f4853b1e06935bf + + + + 4f9e85afe6af285f5a31d66b7ad2eb54 + dbae8213a121f8e6cffc01df18af2fe4 + + + + + + edfb0e067e7535d44353904eff3d4b41 + + + + dba8ad2ec54da5829d0ea62cb7004a6a + 43e8228b8b119a293828e48d60bda2a4 + 755ada33a95037284391e264e7097ca5 + 82be8d6ecd6fe6376ee0375c9f4e544d + 62dec35ff6bb7d38cbed4db6d1e5c4f9 + 2d2c7d11543ec1f7773436c1a47d7639 + 33dad11d69ae7d9a8368c11577d52de1 + b6c254c3556ca0c86a546a4dd36b92d1 + 07bac20119687348e94f1c75fdb52b05 + c04ba744760b423ffba651bc755a7589 + + edfb0e067e7535d44353904eff3d4b41 + + cd5a510d025f78c3ece7277c5c4be88b + + d595cda8fcf792ce5aff3a2cd87dd886 + 64095d82b248bde63244adaa0ce984c7 + 9d46f6259452cd0ca718dc84206732eb + + 32d5d7bc6d3d25ed93b0cf5dd6f4f555 + + + c5724d8a86c0a6296c1781ceb527aed9 + ac7ce9d8838d19ba8110db31e2583e95 + 2362f2af45d6b3618de3611b5324c44f + 4fea20f236cf158f06171becaa222eac + 9ef63d8cba43aba13627ec7f6d29b188 + f740bbcf06e4bc1284f03a9ebefde9f4 + d34f42609899cbb14e436fb7d3c1acf0 + + + 8a49bf84f52d74e38b0fd776890e0da7 + + 64dd0c220febb5898867e6c4a8566232 + + + 7f1b46e3dd5c018f1df0cfc47cf4c068 + 4ca3142feaaf82627409df931e597f46 + 4197424f04341d14831e3a493cf17766 + ba5b1eb342736aef4e52136eeffa0344 + + + + + 41f87a0cfe2878c48f0ac4a3b3532867 + 459dee2eb68c8a97fe435c5e4f347aa0 + 691b9d57f6bd6b36ce3e431f9920fcea + fbd0afb7eb84a3455156e7b3fb390c8a + 1d7b1b757ea620ba1bc51133a41b8453 + 2e306b6f23d14a912786bbb9c5b1fa20 + bcfb3cbe90cb96ef6fc019c981383d1e + + + + + + + + 07b4bcdf1736fa916dd7b8515b73eed1 + + + 2c9bf0ad7c18c25d8dd0dc6f36fcb3ba + + + 6a5de9774630cdf1706e354903d87101 + + 029e7ece6c8533eb7978ddd85cc59bdb + + + + + d29c85845faf6363c8060233f0ee5660 + + + bf8b93e3eafab88dd5e05c8474e7fd44 + + 3f5ee85f4c9a402bca9bdd50f830e227 + + + 73a27c9f57224ac290399b50e27133d4 + 53b1305dd7c3f316a81e0ec7232f7024 + 6c9adf19560c48408c5c68297d74a600 + + d24a801043dcdf10189e82a992802eae + 686cf29f064f824c092304691015ef36 + + + 1620008d7acf532e34ccc5f5ad13b5fe + f5a21a9861a5ab4d8326a6a256293fc1 + + + + + 24a8ce36287247afa48c04bb66895b4a + 6033fff67137545261616e04513d999e + + + + + + 4f13072fdb86ffb909674cd4c47a828f + + 2f99e2310b1dd4a254c594c49549d9d2 + + + c37e39e34cc69cadad3667a78de70798 + 00b32bbe5cfde244aa1ffa50ce021227 + bbdf61ed69a351088a0281a7e81fde74 + 45490091583c02639634052faac5269a + 5d52e5754384d806b3fdec0b0db004ad + 4c7ed8637f21ecdf91abaab3570bef76 + 342cdd62d5ea1e493a49e3c7c816d58e + d5c1a715496069c719feed3f79de6d83 + + + 45f110a89cdc0259a8c931d1006f2249 + c1fc795345486008cd84355ff82fc63e + 60b514ba27976da66bb12d87194eefdf + + + 69fbea8da5d91bb740bd5118026e23ee + + b2057a90adb6910fcf022df15a648f4f + baea7558eeeb5807d0bf04b6699f2ec4 + c5e8b84821172fb6ac504c09b75baa8d + 712ea6ba4b4b25bf294e4e40367b2f5a + + + + b8ebf6a7e2580f1e082278b0dea89a82 + 54a7fd1e802f0d0fab9cea69919c136e + 892fc2687973811c74c4711a8df5f27d + 1c3ed818b928c87f195e7f40fad620ac + 908d32decf8856f99615c4d8aba07489 + 6fc80c09b47dd5359a0bb605f68f11eb + 3f3ebb39b0900e95ac8962dff8d6708a + 4834f8567f9086d28296f4f555538bfa + d3ba33c7cef3a1640573bd134f923422 + aa68ec8df10a5cd38592d136a68c5162 + 348de3b4f24eb3525af6ee77201f8f7b + 236d490fa3190b9123e9ea51509dc08e + ff86273f128025a77521f9ffb474cda3 + ac929dc4b5ecb102fc834c560bde921c + 53f7048aa7fa7ca3ec838144bbb9bf79 + df500813e990fd3abf7257cc0a9dd3fc + c0eef2058b72a6a37f33ea0926610f31 + 6da1a1a499fa336327c31f66a2a38cd9 + 3618b070c19713c38c047f8e3e6d4338 + 2c34ff8a3cc1ab28589d6b3cf9a5c65b + e9f7c4a130f525e53218ad2934f227be + ded0c954ae959ad89b8878a05362b8b1 + bb2a9013f7ed92ffad82b48cd9004674 + 5e9496f8f329c802c1efe50181c4fc39 + 5a331fb50e9fd4a57bea3ed126cd4363 + 8a79d8c8b8e0ecacbe3f861dd238a73d + 2b2261774405bd2771957e04be00056f + 8a0f9434b633a5b130dd3719262fc61d + a6773d4ac6529cd02229caccd8eb201e + 14e171730b05e42873d263b1857a2d98 + a48329f0e710776033c8919df515e0cc + b290136d2443205f5df2675eefd79591 + 623a82749ea392afb1e7a7fe8e3f6c2f + 5ab620b99d5c743a7f2addae5a6fd7c7 + 413f405c15b4daf5402fbdd637261964 + 42b5de3eebb29177759482da74ad0b90 + 66934bdfccdb174a9610622b3a6b6003 + 08a743fecc96f94643d8a9da1d04cf9a + 0eb2d41f7ecdcf5b1e1ca5d8dab0f6c2 + b5a04508992fbd75b4d6538847d9149f + f720523d39d39a86911cde91516d6fad + 04d7617e271d0554864e57763b023bae + 696d0ff1b031413049ac44eb6a52e867 + bb86cb92ca9b729d66de54dfa22613a7 + e27e548da04a425a5a2fe8c099e78c13 + c50ff5bde57e5fb5f406cacc92a9067a + 0ce26ab8773c2b140e20472d389b8c95 + + + f1f9cb2ac3e519a4e793dca7805821b4 + 5c422c96cefb35978fce1217b9a99f41 + be2307a3038329b04bab4f85e28487ae + 911146b5b4c52455afb2ecc7e05190c4 + 26d993fc2ada8df5e1f4da6b33211675 + 1d3e9958f21680ba83a93067ee5ed4dd + 15c55cda336fc8d48cd231b4a26148bf + 79d33592f7a2960bf440600456b6f823 + c6ce77a243bc7ad742cd035e38dac0c8 + b2b89948dbc01c83f25acb9aa05ba587 + 42168a3b9d988f659c4762e0d24c3874 + fb26a9597c072f6bf28161eb4a4d0894 + badbbe86fdc221d1a70d4d85679fc454 + 64fb26093c78ea8378895f6b7411e662 + 6e295bdf684eab79a9585382758e940d + aefba91c5df0c00fd40566395a5ea426 + 233fdcc64b45a7737ed6567b812276fe + 46cf7f001c88e9b490df92b972263c78 + 860b154370fc6305242e1638ff3046b4 + accfbe4193ce234a28c507bb631f41ce + 9b8c93271ad0fc54f1aaf84d2c9c4ef6 + 6cdba745119f5a6a1705a3b97696a6f9 + 05f6863de2d2423b13227dc18229fc3d + a28e3e3dcf8b7747cce37de4911565af + 1450e2d14e6619760881a15eb4b5d1d7 + 5490b0b39fa631c4ef4a3645dce13a39 + 2693981713aeb88b927fd6a2adf355a5 + 0ebefbc17c96f7fa90be9c9efb287136 + 3afe19b235e39dc55ce3db85da87dbbe + 43ad03eacb0357deb54126de490001f1 + 254d9ce6ba431917c2330b4a36b6c717 + 4d7ae3aa4e4c0ffcdabed44189c855f4 + 77daebf60c058ecbad8910b8fdae6ade + 528d8c145e1568b60d83e8db36dc8ce4 + 83da089b7191689ac1b34ab992303c26 + b1d4ffe057518a04f9be09f06086539f + b8ff4f82df3879f53af779ceb42dcb70 + 94b9023aa792c4c8eaa87882b50a9c38 + 7a5e53e101f5a64148cfafc482d72884 + 6440b8a59bfb44f7353ef1e2c937f6f3 + 3d325fc9e0364aa914fc4a0f9d6f335e + db15d5ad6c951de739bb7460bce6b74e + d8cd9ac8d1acc4404c881db777e2169a + a5c0b40b7fdcf3106c74fb78884eb318 + 4b109e86f8d5362d085ef3b2d120e898 + 4fa7610a20f18be6c53ec2a1bc3b45db + 640c93c4a697158eb074c1ec67b1cdbc + 55d2f457a050a2088ce30cc577d552ff + 4b2d4a712764a5a7b5324a706b812b8f + 711e23414b918fc9c095adb0e9ba684f + 014ec5a83423371db4d4be7afe2889be + 0da8d3d71c515cedb714517be435577a + 4b0b96bc7adee7474d76c439c30d11a4 + f0d2607505c19b8aac3450563c9631fe + 7900899abd321124db7f62761dafdc7c + ed05e983e8c829b6cf277613d34f6c27 + ec1622bde2ea61079ffb2decdda7c02a + 55b655ab0d48eddd83279169e6f47e6c + 4173d3ad761be6673a66e3b1bfa1134e + 4eac990ae33ce2e58c678ffe6741e97e + 3f21b5468fc76b99b1096628b082e27b + c156b59b73d7a8fb7f3407b2fe9647eb + d37e70119dda26e59b38ce4b054a761a + aabf7b9c5a52851ba9ebdc91e88db82f + 9e7dcad7ccb9818018618e4d8350c6e5 + 659379c3e5714c284e3d932dff439674 + ae6e7d3bc35396bbae5c6e489547b2b7 + f256ffcc94435f044201c4009a2c0770 + 2e55357ba37d4883693226e39695f83a + f0afed7f21bf6806722346aa73e5efe4 + 5e4e0af80c24da43b971c80d09c281d3 + e6b5636175deefe47ddcd729197418a0 + f566ddee9d0b32e1fbd811688f124faf + 06f95c534ac7cdfa5261ba3b28060c8e + 7569a3cc6049af60a28244f9faab9eb5 + 3f94b3327ee71537c3c819d8ca572a35 + 9d8a4f2ead9bb7ff7afae36d35486320 + c8867ddf90eba0a3e2e0fa69c39540f2 + eb5e6695e6162d4ee7604e592257415c + cbd6615b9ea609696c19c91466999b40 + 854f6da1df4fa1253437e4adb19e0dc9 + e3d709b3d6cc79eb971e6e0a9ef5c533 + 6b3d6f5658f3c48bd1719ceeb455bac4 + bbea2fb51417da1e645e92bccafc13c6 + 34e75153234f20e4e9c24cd17a19aa1a + 4668c87423184de7a0f678b0d8eb2c8a + ff60c0112d5eb7ed10be294a9beb9c48 + 46b2d178378b2eb69a1307e3f223f980 + 57ac6b02f2cca5d8b59428e1d4a33202 + 826deb94c09938ddda7d94d7dbfd4ddc + a1501583632b577b0d5555e62595c2b3 + e86600037433fe753420c5f78b57b0c1 + 19b8803e0c149fc56b40b7684e5f23f7 + e6e57170021ccd494a6c38f008844075 + e3a3b5381cedd32c391216cd86831af2 + 14eff98659dd6dda1d7422e0979fd241 + 2ecda6a8f484c94812277eea264296c1 + 4070e87dbec07cd5d0fa6a1754dfd3b4 + 5d1a073cc04bc04532f3c68795084337 + 9815f6a543b25f16cbfb5c7df4d73642 + 0de47da7c49b7986f78b1d6bf40105c6 + f14871656f1aabd141e02abbb21d2fd5 + 58a225e591e80386664facfb87d4e9e7 + f3dc84c2ca14062d8f9140cad49800f3 + 5980b5e45dae9780a5423cf751827803 + 2fbcf482ae380f0f21eab5cb02bd88bf + 022c090f0b8af8ef34e41ff8dac5a9ec + 83a1000ea395b34846a6a4b6e8cdfa37 + 9b839c48fd046803a517e782e2f31a66 + 67e05eabf5a3a978bbf0d4e5b0c2d93f + 938f15614b7f2b09d1d83e91610824fc + 4493acfedc17bfdd5b124e0e7aac152f + 07e1a9fe19c77d2d55a0cee9cdea1802 + efead0f851a98c9136e441c67c242d11 + 4ffa98a723b6a303ddc4619ac22388ce + c8cddc159f92f4406d01593b206c5aec + b8cc0fb21531c692ff85a6d5105702c3 + 47d10d892c4410d54f220f35d2658b44 + e05614e25ef9adb8f4cdccccb55cdcf8 + 329889f49a91885ff41d181098e8e7b0 + 5d3a4d2bf2c9434bbe9a51c38210e12e + 9b4d855e446ca829c831eabad2208f08 + 560fa5beccb0079bec3cf6ed8afea367 + 0ec78986d238989959774ac6bf30e8cd + 729465389622f827c4180dc9f275ef82 + c07dcbed9d353a86a6752b22b4f8243c + 20f66ecadc521bfcfd95515416e8e367 + 50125ced9af906fa444a72a86cb11f79 + b9aba0d10192cf1d7ba0dd01d66614cb + 96a68b5fa5979e88639b22ac1a1431b7 + 39b53caf2761349fdc7add6bf9bb6aaa + 74be1ea86f3d6ffb54a8496a020e8a5f + 348fa273067b27669b6e6e19e23e0349 + d84afbc51858f8bf0aad9a7375a07301 + d7caf48b21c1ee57d7ede12c3bfedca0 + 728807136ae86abdab8d164394668294 + 28b5a407e1d0a511af596291e8a5ef00 + 7ed3e482eff2c5ab82efddcb6f4738d0 + 32329b23a8fda8c6e29a8e34c0b82cf9 + c328ad816c98f96f7ea2c10a3e7b53fb + de4f1c6e961d8a311a4d663179beffdf + d905543c3be641b18306f6706efa827e + b83442ab181982e9d0305419fa340d98 + fa7ad4eb968f5384f319879426f64e22 + 94faa6ef4e880a20e03a2dcbfb4f68de + 3ba8b84c1942dc2585db2cc1316b5d20 + 514dab028385f478e8f9e19ad8f7e900 + 1da208377b2ec395f7e11e88d623fb86 + ba585a8c762d25c1ad85a85b0737a8cd + bc2f38379dc491da4fbe51c0f8ed537e + 3730f532390d1b04d0c15155c0d1ed26 + 720325e3a4cc25ab7057dc5a36e4932e + 5da78c1081314d5106fbbc96dcdfdfbb + + a0bbc753e461ac0f53a8ada606b3f679 + 7633b7daba08cae57f229d57e94cb04b + fc182a9e92126bba052321caa99dea07 + 53c0e8669ba4b8e0fdf672f15d2d06e6 + 2adf22d6d91a650ec7002270d9492102 + + b842c6c624e8e57228469b4a5b428471 + 2c0f216b2120ffc367e20f2b56df51b3 + d4768366ff4865822026febf7c5da9f4 + 9961aa65491879931621fde3aba13ec1 + 573dfb4e6cc273e3c7502603ff302cf9 + 9ca3ab3d0628a43ad7bb7dc5595f8740 + 7b38b429285d7e6f55684ce4ad6c93c4 + 210b85fc8a178b290e9add5a61662a73 + f9a6c988e04c365dcb0770f60956e400 + + + + + + a1110a84d199854a5f3eb87b0379ce60 + 92fb73d6b2b5a62309bbd2024c23d84b + + 1f5addd65a21c530372014e5c2cfdcf7 + 4ee2a8f5d03e3ba97578fa0e0ee6b247 + daf62fa0b6dc6f8958a92800252e302f + + + + + 3705925c3dfc933f76d39a5fb234dcf3 + + + + + + bcc40d5b58a964f158d023b4e342fe0a + + 18ad9fe2a659492e0d2513c54f89368d + 1bc4eee92b3bc8e2e23c46d1177ce2d0 + + + ad467ed3ca4fb8d6ed876de0f2cc7080 + 028e0604d2845019948124c2075cc235 + c7e2f111124e1aba4f0d7cd0db933af5 + e4232a8a720350bd8fec5084f70f2747 + + + 3daec5f52249690e4c115acd3c8ee832 + 12404716e38e5a520d2d9039e2eed55a + f79aa479f5f195757ab4e3825e8fbd44 + + + bb42c7326d994e917373d62c2cc00ee7 + + + 453d0ca86777489cae1f4ebe88f71d9b + a7718104a16483d580716fc30921bc6b + + + d43badb2ec84e9dcfb29b9f5ef04bbdb + 2bd3e99a37d3dc2cd7f597f4e36020eb + fd239630ce63acf6495953002ad38239 + + + 73edbc067eed1fbcab726f70842fa102 + 2a8bbcfd09b15ab215108d5d766cbac7 + 02238cdbf0719776b7e751f5acb5c592 + 5396077c9eaf85963231324f619d8ffa + 9687ea221f212cb180dd37f359681a67 + 1b26f723b2a8fa9873ca2f89c1409e9e + fdf35c8954c9b9e9312908c2d955af8e + b656d6617c4f5c5292dad64160bc5a0e + 84c00e1ce3080417a1be8fa4f8e2c3b3 + ce89ecba4963c4d05696a8d6553addc2 + baf069c9f85c8a7baf0ac03e3fcc4e66 + f9808f8f1c5f0985ee4dfb36d1f7de90 + 86220d40fcd581692526d94d696a8fe1 + e28d038b8dde77a313756a41c01def0b + 8bd1b33d91718118e6999791464af93a + + + 794859630fd8e629ec675559eddd9854 + 3ac1cd4870e3d64c6c6496705e401ce0 + 9baac42e57de3ee07f0d774d505c555c + d1ce842b3833ddf287b7ef8c2e180609 + fc20ea5922dece6e33e5c824c38b3086 + + + e3853e02f45de9c7ebd255e9ef423831 + 8549d8de174d4666a806dc68334104f3 + + + 1e4079efb27fd21e6583fc6309da71e7 + + 5f0ea7a562bd27d284ba70b2a579f72a + 3c8d0145a82eb0cfcb28598957f583e1 + 8000bf5479b3cc78d6622cd90916e3d9 + 43a7035c1347b6a31409940660035858 + 791efc722f778c164346950ba6360f66 + 1382c9f8818f5ff6d7c3bfbd32a63e8b + 308d81df80143f712b5aaa8b7b13a5d7 + + + d9316ac49c2dd0599247f6521cd18f0c + 9626d64b7ec8c476a5e008610c3c2c33 + + + 5ec278778d655ea53ee2fd2ff63be44f + e292e6470b7c0b1f331a4263d3dc9620 + ebc6fde81ab84580594a391f8baffe50 + 42af8e567a2010727c4045eff24b9f54 + 2d9e505e616b3352ae3a3b56356de0ee + 493396123054d15f020ec103deebd6e6 + ab117e649fe56f3af2e8da36aa87116f + 7f35a5e7d2675dd190c3deff5cb17ce0 + + 83fe03e137b5ea5a2bcd517ddca322a9 + 257941a39cbe057057d692739844459a + 6b266d4bfab17314608ae27bdc4a359e + 903a3faf9cff3f7750022a949dd5817c + 492b75815e29671cf4c68f902d0a9def + 4121e3fe5911defd4ab9fe98eda156fc + 3b28fb462d61a48bd0327018a20a0f6b + 3720f1a2c6915242860aec9f16ea35c9 + b1220a4fe72ef992d6d550a8cad5e7f1 + 4dee4307c5f16f39d5643aeb1e705ec2 + a06f74328093894982e7e0635c8314ee + 9ff66f5a8be754fd2983768a4c396011 + + + ae0efeac0bd9d584020e8c25b0f0ff1f + + a73435e2d51b471b778075eab838226c + + + 0e0005f77f359f795d6c9f4515c94101 + 419ccf3ae235b90cb291e723401164fa + + + c512638e819c2b506b4d3561fadd89ab + f648bb2fc37892fffa67e52c26010bfa + + + 74a1a777e4e601c00a3c8a321325483d + a416a134aebe733952f1e56b8d3da086 + + aa7fd94ba52d9f17da688101074fc91e + 262dc2a3be5650561f310daa2a019b90 + 04377f8d8bd57debd70854cc352183cd + 5a88db7c8f68295d20b82c2b694b9b9f + 2f39541cbb4f00a6a1438ec66d7fda6a + 72d290ba134d972686a7935f3539aab1 + 54056390652d83b6339dde930cb6b57f + 436c31065aede8845eaed76bf664ee08 + e106c4fee2d9fa218e43a026a6acec89 + a004935a83802e5f3efb976b09cdd8e3 + bc4d5437f3fcc338f4092829e85e4462 + 0456a4cc87d712efffdb7b865cd689d1 + 7ceb21c3301cf305a4349eadd42fdc3d + + + 21bc9959064d5b2cb555417d5e095254 + 36e93e169ffbd81dcd0c7d24226aaef1 + 1013c364518a56688dafcd17f1fe1d7c + 11b9c8003c33d3b3fc62ff4d089dc228 + 456e8f4c5fb9bb76b61f670437a329ab + 81a3c31ca6aaf166998f21a84b70fdce + + + c483bca2540e28af619b8deaf78ef64e + 87e9f396751e86af9cab7c2340761d77 + 707dc1d8e89cf9b34a466f26cb5921af + + + + 3849aef5425f76dce78873c314126522 + + c165b1f1fe675e1c3ccb4894b299bc8b + eadf7dbfde0c06db371db20fc1eb48ee + 5026541e411478e6321a6eb195047d8d + 7fe95ba4a63a5dc3f2b328fbb4510cf2 + 02508975971a4fd9c61cd7f11b272be7 + + e1156bbe554709cf1de67c6f488d1eb9 + b121dc81e30e5d16c96ea8053ee08e88 + bb15720322c166c1ec6767d5b8ef02e5 + + 93f0a064b606ed61968835dd9e666830 + 5196f25ed3b3ce4ab0736e1c198d6803 + f6bb4f245533d7ceb5f0dc72a7140b65 + 41f5f10cc22acb7253f9a3ad3dee0bd1 + 045b8a8049f90263e6352c44fd4bea5e + b161ed2303c0ac9a4e63d3f8116d6167 + 6631f13f8d1ddfb3f01d7ba2d4bf8185 + 137aa41e68079e95d0e84aca791ac32e + 6624722a2ed092a844caface177743c5 + dcd7f08708337997e834aa20042dcb22 + cd1f8741562876aa4130ac78e0c78bb0 + + 69d4e42a655e7c6a260a3cf414c4bad9 + 8f4f1138e759d74da727daf3b77582d6 + e530e42adb019b172eb6eb54f1b8cfde + d7977e8adb4b93dfee26974f363e8dee + e7bb7d9bc8a7495a418190da4f6c096b + fab73b790e062a607b1e86da8e476312 + a411a808078408a4788962cd0547dd16 + d9c9780f9b3e76c2f0bb5865aa3c197e + 3f8f06b37a9afdb97f521ad88b99589f + 07614c7272c6100dab855b7956d85676 + 7c1b6984a8043db2f04606244c3cb2a7 + 757cc3e4eda52038b2ac4ea1b1bbcc6b + 5ff9ecbd08b31afbd22ce245e72b1ab1 + ef9eb34c36408de91d43194c213f28c0 + 509cd8b6a856ab95860b7d88aabe6022 + ec82af3898257e4d2a307823fa8fc279 + 92fc88832c202cd27ae083b597c4f576 + d6596afec41f0a3a4ed79355c812c68e + 9e885a83a35cedfa3b96bf8b7f3c710f + b1b4278b8ad2a4468a74b39dff624833 + 4cb16d6cb3ba92cc1494c40991b9cef0 + 710ed6c5029c83747a3156c1be670f83 + 7840537a1446124cf54a903348b0bfd3 + f9f290de5aca3dd7e4e99453aecc8c6b + 4c40fda4f1bca15185656dec5ff8c779 + 73a72a5ce087dd3fe96afdf5d665290d + 14f291923feb5033f0525e364069949b + f9a7fefaeae5d865ad432181cb2162b0 + 789e6c59985f0bdcdb5d571f3bc693e0 + e43fb5800e0e716b7675253618f9ec4a + 9e61ae6ec7ca3068bd9a8a8fe6466de1 + 627a16c2b69708be400ce3eb17eec511 + 319d39bca492e31265b4a0320c0e74cf + 2af26bf3f8ba742631fbfdb8ebd8dc39 + 2967867bf0cce3052d08453aadf11660 + b660e35dfef15d00d0f2c64be6398319 + 4e370a24216dcfbf6db40afd03e06571 + eb40e0d2cd3d3cb7bb39257fdc64d05b + + 2817d3287bfb38c3d271cb4730ace584 + + cad9d7267c0fc764b49715f3dbfc4813 + + a5786ebd77d0bdf7179dcb2d1bd67ea3 + d5ea5503c55ef933e689a1a4b816c077 + 9980af9d60588222c2574673fb5ec9c5 + 3a202ad3aa9d7b207b4e40e50a3f6061 + + 0cf2c6155a701851a2e6d3fb958ab26d + 8bd29ec9b32366d051a24a68f10133fb + 3e95843ea6d8389bd8af781ed5f0076a + + 66db59a592c4e005f73104724b296e65 + + + + + + 7d7ebb4500b3674bf77bbc6a90ef9d90 + 0bbbbaaa417c5449bebbc2faffdd732d + 2f3b7c2bbb901a165ba0c72d6d7d78fc + 3c216990a53f561e92db96266601c4ff + 8a669ff2dfa14c63f1c19a4c874468d8 + + + f82210d556e13bea94742d983fc6d652 + + + dd4f471a845629e04426a4afc6d955d0 + + + 20c7e60540c7a85f1ba8fd4fdcf2e3cb + 4233d3e98ac563d1a19288f102aabaa9 + 7d94aaf399669e96e4bb1abe261ab66a + 1dee8b8744c6c20a1368a2e312afd536 + 28b01c77b6e71b55cdbc5fb8f7aa9cdc + 4ee2939a702c98bf5ba58040ebcac7a6 + 6cbe74731d39cb321662ab74e7fae89d + + + d3b8eca82bf46614c7c72e8a89c90662 + 13c315115d1df4f6207717bbbfd76531 + baa97e53d2d1544bc016e35990825910 + 01d9adff7a98840ae5c35571d2a4bded + 348f7af6f1fa67dbcc3da602ec150ba2 + b6d45d976e531eb18edabb62add7a0ff + 169c1c8b75d1ccaea497f764f0ca1033 + + ce684b2dc5b0a9e731fd9b13127a164a + + 408063a74e3ae2fd9ce14f31ee4d8c5f + f5c3ff3213acd6c0507e83e8fa233a6b + 6cb1960cb2128aa30475583e71355988 + 24fff82abe9c0d32e8a1e37f3d9261bc + 913a972204328b45801e1189d08846eb + 116c66c23e15144d768927502cfd88cd + 3b8224fd031ccde3fbf20f26b15701a4 + + 715e95ec95f7f50ef6c4981752149f57 + d1c125af54343aa27959bd7e57713102 + 26c67a530bdf9bb99b0d11d94a6433aa + 41edfce8752f375084d9f3ac58835384 + 044873e12d953baaa517342196a73de1 + 6b54b37292d2d58b056abb69b622e0ff + 296276bef2315d1425f8efd0a2a22839 + 6d3ecedd4c851a1272d4c55858c19471 + 7c48462a00885f5f0bc156b417573d3d + 4840afac5c65756fb50b8b6c7751ed25 + 6554e70551ce4892239ea3dc8d3dd38b + + + + 89c383a525bed8a9c8215a8a0cc93c8a + 424fbe4091cdb6377872ae9e52631b54 + c74b389fa6761acb084480202819cbf1 + 409ba4fa7c658f66c80781420367836c + 7b76190a2e3bea548d955cfaa4091948 + 83bdd596da05c0ffa2f9cf42e300a719 + f77367253cf904676b0fe7c1237b6687 + + a6c985ee09a65dd6fd16705cd9e1448b + 5933cfce1bad5ddc3360041f3a027c84 + 6f0c8b99371900b8e14f3b7df25436ac + 4df36872270a47332fa12ee0a03f6bb2 + fd50d62ccd9f11d2de0ab8bf44066e1f + + + 73a13e23e50f390bbe1c3426c2f2a6dc + + 3c22ace8ec1fcb71bda0020e804634ad + f1ec0d92bbeb977f4007e60de8046576 + a42bcc166420adfa574a1d05543465ac + + + 3a15b51332149d60e549d87ac31c2120 + + + 721ef21d9b8a4ada0dd7046036bebadf + 7fd92275c838427f793e23beef5077a3 + 362f95bf9e75d242899dc7704bab3bf7 + 460c256ea5a4c925b03e13858fe03086 + fff5d90918f982919313469c3d0ea2d9 + 845363ec20bbe7c07bd66b58f7d68f38 + b8c7c78aacd33a1529e7332e5828628d + 08695d52fbdc48d73772541193c780af + 61bddf056d20a4c7c676272a2d417ee2 + 4e997b16991fe3b809c967476aeb748e + b8dc1e0c69fe99f8ec08b7d55d71a56f + b26063c96ad77a8c7f9691c3574a6219 + 73b32359e1399eae6c823bf70d3d772d + + + 04793a5b7620ecefa33199b59aa6414a + 757fba8ee417df9fdb0122e94dd4f8be + 3cfe4c1a8a28549020244d99686a1cd3 + a90aa8f9fbe4d8edb7a44f1ba3808c59 + 4acbc8c09a805db0e4025de6c9ef8195 + dc1e1883307786aa2587bd569c8acea1 + + + 86f88da4d26d5a72a546d9b00f07b85e + 0bf7c85ab1001bac7b54a6736255670d + cb15153d277340bc9f31d48e4a8d2d25 + 5a8e0da03e52abca33056109935c4f8f + d39a0e64fc8be122d365cf1658ca3d50 + ce01fcf66efa17a1e97363d8e3f47389 + 147c2df19656466c7a095a51f86f2d01 + a36650715918e37c8c2911e1d6628f63 + abc418bd00f116b752104c95cb2db669 + 68a83a4ff79d7203a19fbcbe16488746 + + + + cf51ad73762aad4382bd3769088327a6 + 374d0d07d7df1912eccaea7308293933 + 3997156ffe5f5a18208640510426002f + aafd05959ce6f480f6b5dd30879e3966 + 3c98ca1f6c47880a54eb0b71451c1477 + + 200f05f89a39cf7d9d093b17a758d6b1 + 980fe7d5e85872ff5dff08991151425c + efab77e15577c5f400015e87960f9a91 + 0a85f346655ab4a0148cf14256342111 + 3603617a86d59e1490445c745b60f56b + d93940c0e304520bd9ef2f042312ed4e + + + + dd1acb54b4d58e8827d0768924e3aca3 + + + f45b2172d0b66af9832fd2edd755b0f4 + cbaca49237032fd0bb77a296508a8d03 + e6491f8878459bcb8650675cf342759a + 86c757e1914bc7c880fcadabbe97da9f + aeb9107148d0bd8d30e4056f284cb597 + fb0902b9fd63ef318048d697350f8dfc + 236245106441cb5a44c71a253eec1a6c + ce627f5bafcb2e68af52878a2d21c5aa + 44d32b305652c3e3bc4611dfba536c80 + ab5d0f5010032bb32cd1a97abbb194c3 + f66a099d3e051d329dab864ffd922c6a + a686a4aa69a3bfbedd8f2531c49b10a8 + + + + 08506652a754c72af66fd8d8813f22cb + + 30d1b7515f8a2b0d47d9227d8c5b2c0b + 2c383189dae639fd0856780b46fdc0e1 + b7df0d5f1cd6f4d1e49ec9e22872f0dc + 349f4d0143b144dd13594861ce8b946b + f1da6eda039cb7de2c9c389f74988ede + + 0290572ac8233631d4f4b01b5fd6001b + + e0fbf93ee3e79762c694682e010f721d + + + ad3f759b7e31382d5dc1db27d35dbcf3 + + 75f4b00bf2e58d8e6cd59ad6de77e395 + + + + + fad34ea6f9bb9d2b795261ebaadebda3 + + 3af7eb0a967aad23172e6c860e449b02 + + + ac0f9a7abdbe793db588612bdaa21a0d + d05e73887eedc78611070af6a52dd160 + 62d7e28c26714255651beb1a1fa6e474 + 9555899358015be1fdb55c480c76c214 + + + b5c813b0f59f6174d6dcc1c3d7ee0e4b + f082cc77e5ce76aa7e7fad8aa1d0cbeb + 9e6f14148433686c882c9aa7626f23cd + 9cdef65a6ec99639e4aefdde6f0c8f84 + + + daf0b2da6621f94996c061793cff1e5e + + + 0721b3b43d6c22c2cbf265f4b1a86a2a + 31e843d5490e3a9c272d10c14778a228 + 879a00f336d5dd13559a4a8727cc3619 + 4bd354dd46df78f5c07bc3846626ff10 + f6b68ec7828a002b592f6c3c238b614a + 7dc1b7730c8736ddc45fba6bdd8ef883 + e2fa6930a79e9b0a7281a7f873c32edf + 63ddeebeae85dd1396ff16dd605d0b0e + bdfec0a4eddb7167afc5d7ae3cfb8b00 + e27ed27ca1228f14a837f84d4d58417f + ed386b1da70db46592da6ab60be93229 + 612bc22747b52a5bb294918ed999dae7 + e9f369e60b2ad8c9219b97d457a271dc + 3df72ebf44d51c476797648258d5141e + db6cf84bd9e44c2abc4e65de64e351eb + 0b1988834d680aab54c0addb43e53186 + dc28095fffa996438ee136c0f07a05fc + cc6465abcb4dcafa27f15b34f2573595 + 9014bf3fff7113b18caae1121b9e9597 + 0a11f56fbca6b9849ac30b06a5e78220 + 9ca0808ed8aa21765dc6a571c94fd55e + f65d25189fd01dcfba66b304e789e5ab + 4aa6c04acf02c0a4de64852d0b2ffcdc + 1e4d2020a03312e13911b918d986e5dd + 2491f2731633a57c4f2a263a17bfc9e7 + 059aa36952eeeb1ab23bd6830e5753b0 + 8ad51fa8796e4556bf93e7db097fa6e8 + 87ae735cfe13fbf8c5c65325d804eb71 + 23eb7947fc2328060d7719ea989c6ffd + 671fe6122f37edc8a590d7f1a7e53c55 + f7ccbde5b68b2baaf6225eab7fc56dfb + fdff8bf3761ad23868b8e9ad28d49d2c + 1655841ddfc92970e7d4f31a50f3a61c + f28bae861849cd867198f7103d9a315c + 384467b2eb190d2a1c3ef7d19afecb5b + 98f905d95c7282bc064952afe8a2d7a8 + 7fc88c993401d9b09376289a05be4b9e + 4d94e7026239eb14c82b4e35cdfa3444 + 201c086a0872f15a8b04ad35d29d905d + 5a74f35661c601f37c2564b84d7804aa + d0e24140f2d3b24cf736a30ae2c27a33 + 11d9eebfe1e1ea404a64749aa200cbf2 + 0aa521c7a5cc43ec8db2b48fccf7ac2a + 6ceccfa34bce91f84054e6bf35132195 + 1fb806c7ecce714dd94db37816c4523f + 1e4bcdfcc30ca0f3cd22a46ce3699452 + f3da79a8b4044e8365e3f63850113e68 + a9faad7b7d4efc3cc58b88a92fa2016e + 11b3e83d8ce51152702a2ec8f326674e + b58b594e86adc0bea16c8757c562956b + dc132cda81d02f698ddc2a1d709742c7 + 929669447ea54743f08fe5f7e28ac8b6 + 4b0aef9ebff06b832d0852146dc2f683 + 782df7e5287ee0f5cd992bf7f4cc1760 + 6db7d364a4490c4ce237283d5412c5c3 + 3101822ec0dd9260bc48b3ba0336954a + + + d05e73887eedc78611070af6a52dd160 + 1dbe0fb2407d8224c855aabc45d8de6f + 32bdaa9ad7f09f0116fb5de0f1fc291e + + + + 8df4be0b601abb6fcb34caecaf20a1c2 + 0912e917638c1e39101e1505318b0bef + 9defd5ed977d0a89e72d39339c540581 + bda76719d2346ae0642af70125d7423d + e3674227ffb21be9809ba54709b7ec60 + 87395d31a3d919e6263adf5748bd9f24 + 2e10fc735462cb863f615d0acc7a2656 + 42de721211bcea5917194e5403611778 + 52dca139f5dbd96ab9fcd5740cec0bef + e82b53144055b131f39bc92d34f4c356 + 8852c560da0bee875daffc69386656da + cc57b1610392a2475cfed14dc7ddc556 + d7b22195589f7dff3623ac936affc8ed + 8fcedddd0dc92070411a1ebfb4c39b32 + 169b82bc59ab24b2775a1a45c0cdb94d + 0957b2f824e2522b2abff0e8b572dd35 + ad9e00aaf0fddb76c980727893675387 + + 7955e564e935e121a7fa8ae724ea1575 + + b892e5d861d9c91b54e004a31355e663 + a088c09e5817a2948a240be5d33e32c1 + 971a3259a50eb8655635c1609f744d72 + b5da7131617bd7487d5c4eb3103fdb8f + 3f6dbd8e98b3efe9d07095488aa0d92a + 7715aaed7ac8e1fdf559b072078f4410 + + + + 13738628a2e1d0a177000e383f6cc1be + a325639b4c2b714a39287be565b47213 + 7843305e3683f0c5b26634ec646b8987 + 1900e9ae14e06e48c5f197ab13681ad7 + + ee1c970b4ddc1e4d9fb4ad9ad5e745da + + 6cb211868f9f0a9b57a685a4ea06f69e + f94d5ee81eabcdb23d6e3d0c597a79bf + f5b9c93feaad8776c87d32f32d27a88c + bca6835d736fe52f2e97bbb918b94ecf + 14688fa06dd06a971a18a6e4df9ba91d + 6f46366c5aa9af607099d0f13b0d8ff6 + 3147f1d0f24c92db21dfb29b5f7ae20f + c4344e0222142ec21b0dd6ea46bf15a2 + + + 3d4427dcf757a6158a6a2a3caf33f843 + + + a4e02f7d44f01d7f050dfcb9a16d2860 + 993b7afe17ba863308008f19d7f1a986 + cb601afa24944251d4a13b1f7e121043 + 6aa0539ca2d85e4de6122212c7f1eacb + 184f89105e74e2bd898da70a69549a62 + 831be8c79cb27dc2aaee893f284c6e8e + 0ecde91671b99dca93d3a7f6fd0b638d + 33b6ecf382da39a7a208e9686e0bb357 + 45cd86f06bdf40f4fd3e10528deabfb7 + + + eb467e3c760d841e33c948882859011a + 5b88c39965ab323a70e5f83c4bf3c492 + d29a37db910e393b82884eaa27e0249b + 3afba89087d4111338ccc8c287147595 + + + 0ec1b381f7278c676330e2104a76f5ee + + + c9116409c08d6783e2b342abb86b42e9 + + + 997a75b1c4dd9aa34b625e08d61d4377 + 7ab34951ee88347f8e22dadcc3d931d0 + 67c4f994a005e6d5b48f33b4d83dad02 + 55fe2932daa439c5df97966a14567217 + + + d05e73887eedc78611070af6a52dd160 + 53fab6b96b87d97eea876791882169cc + 636cc3653f8532fa8e8afb3e5968ddf1 + + + 218d134804157358cc57881ce723ed62 + + + 57fcc71db7032223c94559a4aed87b4d + a161350864050f78bf9161f7f3c94172 + 3c66ab6278311ca4982af4ec018d76db + + + d05e73887eedc78611070af6a52dd160 + 78fd31115409c701d786f48c27c0bec1 + b1a44a28ef00df55e7aa9adb7681d163 + + + d05e73887eedc78611070af6a52dd160 + 4ecdd90e4dbb27ffb579c49e85b0c71a + e7bdf814430d08c43c41e4fe5561c3ed + + + f082cc77e5ce76aa7e7fad8aa1d0cbeb + + + 86636719cbd3f1e1acbd1aab5eb07b61 + + + 2eda748928dfbabf5ac751a72d14d07b + 6d47d71f12497626b43c4ee7fb13c01b + + + e38d660aa88a75857158f7377e12f764 + 5933cfce1bad5ddc3360041f3a027c84 + b105805d3817743c1049a1239aa7ebe2 + 29b886ced321fe9b7c7499f6cc77e048 + 5286e324ce216328865824d933109a65 + f78f3d143636ff8d7138f923887f286d + + + + 751aaf9ab9efcfd6f836350f9817e6bf + aeb1dd6e84a80400c0b98d2b01ddc264 + 6901cccaa78d2a15d9da0153e45c936f + 875a1632b121116314db9c1b31dcb399 + + + 601ed3fa6bc168a5a2439066ea3c98f2 + + 4518cc0eeb9d98baac6d55f4224bf6cb + + 563e1cea8fe34d5fbeb70024667807d6 + + 710ca21f23bbd02609b81c526ee3045a + 981ae70bd9a0fc427988490e649cd84b + + d0a50eb2f6254e2ba8f9fdd331787f62 + 42cfe230a30e4e467b65cc36b3dab3a7 + 94e1ef8c4552965f8012da82c2597786 + + + eb0a7fda997b0527c984537f926bc717 + + + + e89ae088e40ef7fb1ca2c1595f82ff99 + + f012c319f087f714e8f03916a9208dbe + + 47c7cde39a95a578bf11b1ceaee65489 + + + + + 36ed70d207f5176d1b9f7a780385b789 + + + + 24a4f43fa78472acb70cd72128c08839 + 37308343e87c64bf5d83f73ad37e5c96 + + + + 93f7d649fb726a9ac326bc6abd229230 + + + + + + + + 660bc63170b54d583d6d46a68dcc5ac7 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 097b1690cf2ccf9b38e1030cf357405c + + + dbf68dc7711834dff71e713298b35303 + + + 56eb186e5d890cce6e997f6cd67b4999 + + 8a66ed7666a7457832056be97c4dcd2d + 7f7c6d68bdb263903af86fda2934dde6 + 5dc7f318b9b061b1cdcc67592c35c7dd + + + + 1981b7638bfd996c1d31ea1488bccb91 + + + + + cf24521844f5872c4494db00f0af8ae8 + + + 5e707272eacf7f3fafcc234d9648f218 + + c61f4861c4a6b11ff1527d4de1afa283 + e34809152bf3e52ae8d528e593497e7e + cd991f85697958b80726cf4915a628ca + 463d1dae9407bdc774f9259838f2fbda + + + 00e4657f7d3fab5fc0bc81bc77252089 + + + ae46e578adefbbd840d169a95a8c3474 + + + 0bf39a49ff6829f0e9da1b1f53da5974 + 00aece462c0b843960dd9a11a61679b2 + + 189e8b591a50694c504cb9c1950171af + + + 1d682c46f5bff0d9192d573fb7eab50d + 03487379c91b8347781422dae114daa9 + + + 117cb0c5dbedc896bb05933d3400bb91 + + + 38b5206317f8e0fd4c28ba1382710369 + + + + ba9138408f269b4ffc292cb16f4c62ca + + + c266055b7d9bdb9e7fc9b603b41432a9 + 0b58e768f6c4ed90197bb8d5168e51d8 + + + + f5c5b201d37f94c71bb8748f2d97edfa + e9f1f5f006151a7fde2e87a2e1d32bf2 + + + + b5b8a0f77edecee47d092db8a30749ea + + + 82c510c120bea81ca1f335832b8f40b2 + + + + 736593944e2d1d1660163ba75c18f4c1 + f7f866daadd805740e5bd1e6faa96807 + + + b9804019ea66bb4a057596e1b2e8eb64 + + + bc7d0fd58eb4990f6a6392fef5b534ad + 2a215143cfb769708be011d07a1baa8d + + 40bd7bfcb9ffb6175d0ea824cf1ba6eb + + 8be12e9c0d9a164bf2471f8205dbfbab + + + e376f1da727af899490b9e73075d9541 + + 0dbfde362d344557c48660cd04444246 + + + + d1e15fa4a41a5efe5936aeb98feef529 + 9ace95c4d805f27306f1a491053eb26a + + dbb0b605571345b68ccdb87af1d3902b + + + 48f1e0d3eaab11630a9bd8f3171a5bac + + bc765fcd248edc0606a2b45e5fa1db61 + + + 9b0680142eed9a36a46697236850a522 + 97ff8916ad62d706627aca4aa728f853 + + dd8e3e95b16b92e7adfc4ac93455f7e1 + f36c4e35af4140f72a8dc69cfbab6ef6 + 86de66fa96d596143882ecff7bd1be16 + 7e618236fb8b1e51c1adec1bd94b2e88 + 300b677c4c026ee194df719ea8cd68d0 + 6875ae29bb46e8e0354070c311fff319 + 1166b3bb5d855e918a0a7a3c6a6fd76a + 752bee2dead11a01b3e9b3215181ff37 + ae44be0d8d22c67076c20aad85c224b9 + 8bfe2125aad5539b95407e162e71bd96 + c65bd82ab2a659120682a164059875a6 + 28737a8fa21f56c6f10b2e2be0fc2d72 + f35f5256a27c60360c4c5c35fc057c43 + cc08fc7a9e1dc6be56fdf01c49ef8ea3 + 106e05ee8b625de68ed4896f829e71c9 + 280df99509b2e0733aea739f13cbf75e + 67b2986122d8129f18bed2ae022b24e3 + 62bb308231889b38b108b8e51de737d7 + ff32100935be4ef6d4df7a5fe9c6fd4e + b7ad3a1b30540d81c6a525d8cc6fb800 + + + a7fbe7a19a24f7ede1382a93de4c8a95 + + + e719b22be83b6947ab56a299d538ddb1 + + + 873e2d6ab827dd3eaba54f1a618f532c + + 9e643fc9d595b73a140333ba77970805 + aa68f99cb6d73be258dc990e1ff76820 + 5f22a8ae7253fb9b54d82dc043dcac09 + 8e0f70dc49f8fe7650b36907d02c1712 + 4c2491b1db562506e4e7741879bcd074 + a5f2a57f31c5701501f4e20acf15510f + b71f1521352b2026897cd0cab20230c6 + + + + + 80fa22276f02c3ae7ea7f7798d43e51a + + + 3e90836a044926a0bc7d30c9ff54d425 + + + + + b743b681a0d50b7e64ca5563444a7d1b + + + 7465b069cacd835388e02e304adafe2e + + + + 67f7d4f83fba4c2528871e47397a1796 + 74d6753151bacb55006289f30376a044 + + a8c1ce8cdd82cf46114737a73e7c0975 + + b1c472cbeffe553bb56901f6fba02edb + d338cc5cf3d5d1433979e212748e6eea + 93022baaeb2ec04e3752423d7096a8fc + + + + cc5132d8561dc196726b50b853155dd1 + e1e94a01d10cea68ee844858826f0e36 + + + ebc80e8b1dcd8928f157f910cd020e9f + + b7eb64ac740c8601eb871878f51316d3 + + 8a3bbbc3d1bba32f61fcd21f5be976f4 + 7427f95a430e46c45a5265aee7660f59 + d1143a7d44ffb726b4150b23f634f874 + da380ce0a7802997254a7609f99a9601 + 07f5280059dd7fe79b3b65fdff2898f0 + + a6d828ae7c6373df192a5c0d26d3f77e + + a28c65e529f41c31343c32d4d25b1a65 + 361ae85f62df84c13dc5a46480666810 + ccaeff5d9ab60b8c72d1e1effa2bea59 + + + + 505697b3a48735f1990d91c6fa9224ba + + + + ce8de7f00c9943d67b5287a7a162d2c3 + + ae1e833fe9b1c46fcfe4940e6b00cb7b + + + 758d176aadc700d576b5d98679c6caf4 + f24d10e8cdc2d0e01e6b3256e77d6ccc + 076e2c11063d7d8ec342d60149f59078 + + 426836ddcc5b64c15fbaaa57806e5243 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + + + 3a065ce529a8caf822dbaddf2041add3 + + 9246ca305ad64c584f8fe8c147720511 + + 9496020e716e87ae652f59992c5aa818 + 89812b0f126199b10fe88a9730a23c63 + dd37dd4d5750c3669ddad781dae81306 + b0ec76ada137ec72cc6ea4e8373fc2f2 + 7ed016f91191e3782a90ca9c5e5e3c85 + 74221086bb160dff6bf50d46ddc226c6 + 3840a2bf31843dfe0d795e056611893e + 8c78943fd2d84dbb9bdbe4dc16cdc079 + 7817f03d03c7983dfdff96228a7c544f + f91564dde1cbf698b309a385e87b694c + + + beb4d5d4a5a4b4e19cedbb566b28d503 + + 72a900cb4f6e569799b8de2536b1f58b + + 8ef31988fae30c267a0fb39e9d1f8e7d + + + 8b5b4c83f3d79e267237a86fb3ecf614 + + + b73f94c26193357fc35bf4696d628e33 + + + + f4bdef9360874c78eeb28ccf490ddb78 + b6a6887e2e676261331e93f5bf0e3fe0 + + + e73fc4542c999fed94e456cc3c1e7e39 + 19e6184ec22acdf71527adce390eddaf + d604a91bbe96d02a1dfd19264150cbe0 + a0c0c8489c149441f1ff0e374a0fc5a2 + f9d83b6a21822b11cf59c2b84317aed2 + 6ba02254be9a7eef9f72eaf6f2193a77 + 75ab4c9fa4c1df5f65499f9b6cb1e81c + 987616d86ad6090abda5eddd0054c45c + 9e246d803c589ec792f888a72054da90 + a496b595c5ed8a6f4cb4f6322673fd41 + + + + + fb28459e041a63b9c0568e00df593a03 + 763f249db29030e98aaff77f8ac75f0c + + + + b71ad32538a1599bdc2cad221c32d6fc + edf61c80721bd5268eabda7aa94bed86 + 1fe4bba11339ecf35730994ac1c527c9 + 2abb9af11587e76ee3e76d013d8dc649 + 0cccd7694cd785f6e18602675672ac38 + + + + 50a871452f1eedc019d176e0c5155d05 + 7be296a93b13cfe248883a981c8b135e + d220c72d3390655d585eda7a5792aad8 + 648ef3736d7c005c81186b59a53ac6e3 + 24e0721f811cd8172431a4f690f36a50 + 3fa4eb70df429218b4343b4eda0030ad + + + f94d5ee81eabcdb23d6e3d0c597a79bf + + + 2bc74624922e91982011469e3e910ed1 + 88734db26dc08bfb12eae9ffa1aec1ff + 1a0859967f56f5de6ca75592c6bae020 + + + 92959665fa23e8cc9c184db5f3807e1a + d313edbfecba44e80054ae3963057789 + + + + + c037ed1eee19dc94181444c165f98a76 + + 4fadd98939d6731752dece7473661d3d + + + + cb2db6ea242e6c706702d4a9f8f8dd35 + + + c32776b05a03146ec2009bc76a6b1ac2 + + + + eb7a757bda4aa31b608efabd64d78702 + + + 42c32adfe71d1ee916125ed0fe9518f7 + + + + + + + b12ce14139f6ca4b6c7c46f27ce2e701 + 2dd940a4f6952cc5467e907a817c5c77 + + + 72767ab09d6e5248f6164b9ffb9cd560 + + + 6279260a065ff3a7cf16199a0775f1ae + 1bbeebad1bdb97671f8004add301dbc6 + d8dc8d83e415451576592630946ac125 + 68fa7c690831cceec1bd8e94004e65cc + 40caf39bd1efbe67484ef65606430e2d + 47536c6640b435c9d731bb0803b0ac99 + 3661cea46cdcd7143aa0157f997b5ffb + fc8b09d42d0a05414b9fb4511b767895 + e466555a0d78af9712227038ab520d52 + ecaf15a46e7df127e5e55f5ad9d16ab0 + 51f7ed5d7ff3d10707d6f220bffcafac + 48340a42afd3c3e7252cf5b2b698dceb + 951cb82f53093c182e14c79678eeee44 + b9033d0f5c7ed3b33226d5fd1378319e + 4b7e4126d1ceb294df42ccdaaa25edbf + 12a427d2e345caa5d3e26722e125f5bd + 63260e0ae7087b447babde5c5ced6d8e + 5df805aaca12bf2056609ff8108fe2f5 + + + 548f67a744fb7c8909073007c7c0c74a + d48080cfb9ee9e514982426098fec7b0 + d7a15b891e73fc20b33d512d1ed8ce98 + a2a00770ad811781cb300c629b3f0613 + + + ef23cf029ccd6a34b2963572646483fc + d5a56c5c6693401a65d3edfe297aee77 + 9fcb4821a6e84322fefdd79969a0c0f2 + 63bc9267b587e3c54c862e708463160c + 9197f96397a47377710c8b1a42693c03 + e99821d528a76f4e63cf532564aa73fb + 1c4f08253c1edb5d2a099db5c799b136 + + + 0aa971bb7a8e91ac475e9274dc4d14cf + f4c89b3e47aa16f390c2dfad8eb4dcd1 + d281fee54ec45761ddd76feea85d3e05 + + + + + f3f1a2064b7764658235e1569ab66ed2 + 1b678d21b3cfafc394fea553bb436c4a + 2503f7e1aba0c93c1a6043f1790b441a + 0cf6f9cc1df9d8174f2e8a006abc7e4e + efb3cd219133581eefd82c6f5d9609f5 + cf686ab84a9dc81f88f5d70d76bbda60 + 6d8d99f91c2219d8a4e54f38beb28afa + 1cd06534b9c8c593d37c39785c240163 + + + + + + 10de8ba17d8ed91b81c54443d2aeaa4d + + 16838d2de6c91f36beb6335230d846fa + + + 771dd149d4196c62dd58c6bd2e74cec0 + 6753e22fa543cb3368c9e0000e2f270c + 62b01d26c529435b127df0b68da87a8e + 63b272ab527bb0c2730532f6c14e2577 + cf0ee5f46d7472cc21dc80d4b66a8e59 + 6861f5bb94faf3b42691192cf3017750 + 2bf2bc3eef6c24e3893b345174182668 + + + 80a617ad6eeda20f59918bf5dc259f10 + + 88bd496f892c542dfaf8afa782a22ca9 + a25291f3a3618f7f0a3c6782c2db7a6d + c86dc3634b18c68ffc5d208be8b9a7db + 95ac6643aec766371cf6427288d64f2e + 02634d7af7612684d68fc6b978fb41e9 + e463972e9d55df86e37d321d4f6748d0 + deee2de47ebd1e3741a02270679b02ee + df970f8bf1fc1d5dd3dc19cfbbd217c3 + 2574ef83a37116b9c06931c807403486 + c4080a87dcf81c501272437c939fca74 + 5f4391f483178f745d34104be875cf9e + d001b9d43e8b7463768ff6dd44372995 + e8874dc009800d026b2af90c7a4db8bd + 5327f83cf931cf54a656c852b9001019 + 60ad03dafb9046692bd1766c8afabce4 + 8c33498fecc6492fa8821c492bc8d77e + 3be5df11c0f8b49d60af0bd3dcce828b + 11ec9e533428b0670efc405310e10076 + 7bf0ea77cad5db8013c77df7fbade59f + 6515f1a0d0198869358db14d2669d6c5 + de570a030480a3ee64ea437b83159e4a + + + c76caa0af4de578f29713a69d77cd31d + d3188be09ef4c614c7ec8b442979880f + 3031b58c7f92a0fe826e902c1e420b5d + 159dac7e0faffecfe877311ced16ecf8 + + + 5b787af85ea413cfc046b162adbef156 + + afd72755eb111e4de2ae7623ee03fffd + + feb46009ee5cab3ceaa3feed6dcbdd4d + cf07dc51b6bdc3866c1e840f1891914e + + + + 681f88e65d612e67fbab4e37c6d97247 + 6a0cf84e60d84fe963da371273b51f97 + + + + 6d4acf729b4ecb3faaa1b6a1ccb3df2b + 98f98e5e1cc015bf9242db3d779ebebb + 6d61f8b0eb9afd537693489d2954aa55 + 278b20a229ff8cc2dcd4a391158d26d9 + + + 64aaf295838a933dd38743f28a406707 + + fe31d36cf43401e974b74b93357d84ae + + + 421ae2b166e947c593f0c2a829e9e7af + 4ac610e6a43333e6b41492d8f835cfc2 + 75fb3a33893c0b921944597d880927f3 + faba79cfbf6ce232305caad6857d1669 + a034a65db067ecbe8d80c8ca37ccab24 + 969c838d11940abe6901fc4a453d21e3 + + + 4f67007a3775f12dfe64bc21f60644d1 + + f94d5ee81eabcdb23d6e3d0c597a79bf + 528c6d9d2c3fdb430ef291103850e703 + f4e35c7fce6c1086932d60a8f32e7293 + 883a5a815385481f6a1c1b5313d78e06 + + + + + + ebb0c26861c097c9c34b59859a597a28 + + 4370be1d17c65d1829bfee80bd22843b + + 92ff34eb0970c859077215921a864b0a + + 9246ca305ad64c584f8fe8c147720511 + + + d0562df2eba320e5ba05e2ba2533194e + + e2f69ac5f3cc604b516250bc88eebf41 + + + + + a88d874c0848088f5173536e1d111810 + 0dd50c1463acfe0060cc497f5cbca321 + + + + + + 46ade48948f182b7830d864cc71b88ea + + e5a82b22c0703517caca327b98ea134f + + + + c6f7a24ae3710cc112ff84c0e2fb7a39 + + 6f7682bf7a6cea6e4576b79709ee7365 + + + 77a4ceae3a417d4f5f8f47619c917c49 + e3a4ce8be052e308b47b9d0e0b23a56f + 8a7709d23f758b4c15c477db802bcaf5 + 88d3a13936b791b1e331177a3685baff + b4263ecd7bf768efcc0cb8b6dca1d458 + ee73a81ec8ab673f98a10328043de139 + 4a9edbeacdd2027506bdc4cb36e29ad9 + af64e2d30442e3c66f7e9eb381bf3214 + fba2d860583bc44f0fecf4720ac5bc13 + 4ae3240152510e128fd2d0c4576289d6 + + + cbfedd3aaf46d238f90cf8726c16b360 + 08fd835b576cb572e2f04911e03a37aa + e4249b9884c0d7a4d7c07a94fe2421a4 + 3cc096fd8ea61966811e6fd1b897dc40 + e63174adcd91f7c73274ed81c38f02f4 + 42cb3122630926c5031c0dbbe4e52ad3 + babe574dc775893a485c6fd061b3a4a5 + 82f8ec3c802bfb4864e2aaac42286064 + dda529f28cf08f4f0f41acd2df2b88d1 + ef7db8034cce073389038020530babac + cc88e26c47789056a682021da7be20ca + 6b634d5f446d9213123e44901bbbff67 + 348bf7a4476a2aa90de90c8228904392 + 3c9f8fe829f1850e0b63138dfd165895 + bc616ea3e06700d71747f92926f13580 + 526b1f4470a4a4e67d3631c2672fbb5c + dd9aff621af8e5961ab1b46df82a4a10 + 2e4991f6cf9ac62b54241c39e571449d + 4fb9a123344b82b70f8b79237dfd80d7 + ccb8541d900ec377e858d7f2651aad10 + + + 95021512c585e687b11eb198e559e657 + + f23eb377d729fcb052341f8187fb1ca6 + 2f1c0b2d0d2a5d9f0e3db2862bacbae9 + b4c462460d9f00aeca49f30d00671a11 + 1cb413c1e6692e33b08c1cfb8747a338 + ca35a4b7cff4bf6151f26acff63aba77 + + + f5c8163f71f5591ece7ad26c3c941119 + + + + 6afdf4adda7652c4998582ec6c940427 + 2916d2a14c2d9ad4627874409c89eed0 + 5ddca4ef3ea4ada4849601ee7e91ae39 + 797bb240b1469b1aec672e90ce5103d9 + d23e3c04e2164f1da0893d4f348ae621 + 66e6b2b167e3a4d3a4955876543e7ab0 + 4a8765254e17d727b324d43c1b7ba38a + + + 7c4660a4ff095dc9fbf3631f5c5ec4f1 + a01e2e19b219cfdf78d2339eb173e302 + + + 52870b0c4f68b68483e6a86261dc4cff + + 6ecd92ebbb646f36a08aa300225fd76a + 2ff67fb79a4d1cd077fc2421dd4f6ec9 + 84154e2c50741687d6cae864ce707178 + 1709bf2b9aef853774a7c713992639b2 + a7843be126d9d36149b9eaa3d79e22c5 + e82b37ea36004733c019b314deb9995e + 0aec764e5cc3a4f1eb0b7ca764b2165e + 09283abdb284ec7d41cd6e2dbcf239e4 + 5cfe3bda86f5d6d4b342d3347c449fea + 9254bfd8298d48ec71d6e3590a968777 + 72a9a5fbe317147837a57985ccb3de91 + 88e63db85310855a0447c37d8c9c6596 + 895e7b87965d1a37b71bf20918c82f48 + 34e4ee8a782e19ee102ef4d008ead7e5 + dc54e045ef6fad31672a0ca88a655d9c + 6b4ff26716b5584c33da88c7aafad36a + 3607b82ecbab545e258ed6a87389a48f + 2549e4910ed99df75a2079e662d1289e + 79228898e2a914eb02cecff83d4e1329 + 3d81ca03fd443d7efad1cc371e7dd416 + e190eb459c3b91087b14fc6f7e30e62d + 3c797e0de5c173d701498b68b24af5cd + 735be4a43b23f77a717034a5032ac2fe + 4db78ce2dcaaf084006ab27f971ecbbe + 31a52cbe0730b180a34a70e15233c6bb + c8d82f603c270c954615f3b5fe7ac54e + 5bf2654e9d4bd11277eafa7bbdc16574 + 2cee67ddff99777d7464f67198df6e9c + 74fed249628bf99d23c703d5ea576ba0 + 18e58505305703b423b72712fa69e11b + f47fb6dac1ca0d7b6e3c1997f107c000 + + cb3ddca3d402c00a67bcfbce4f127ead + + + 185513b1359e56e635b1447aac7721ea + 4e16c063c5273b18e4caf86a37ac0443 + 1125ce02848858ea6738f4697f88620d + + + 9f2b466cfa6b8184d7b6067b732786a5 + + + 63bb5520432e778cdb2d2adf62b3d908 + + + + 3c9eca158e04de745575d363c0e68052 + + + f2c27a58cbddefb4400df6958c4916e9 + + f5a329b18f39bd734e9fc275d0993cf6 + + 902a4a2bc1c2fe1777024ef0e7f49dbe + e71efc0bae246dc03ab7f4834bb927a3 + 3674738451c49076b669a8ae3cc2c2fd + f1887099e73743455e2e28b763f21f06 + ff8b3fab9f7ea27de30a8c0fe7546009 + 0dcd007d4fe7ed3840fc18b7b16694d0 + 651119329dff53ee7913b84065523828 + 6c80c4418f92aa7caeee2df76d5c56e9 + 6b5ba5e17164deaa61b6c5fdc08e1f8f + 6a9abc77e13d4f0642e415866678f6bb + 57ee5e5179cf13f03f2207928bae3d5e + b2d7e7310ac99b9ece1a4ff79ff545e5 + 625cf825272e2009c798f1794e297090 + 55e994228ff3853ed45adc199747b726 + 39e1614347b649b609e198b784255e01 + 35fa0615683d29b75ad4ef944c121b0b + 1f94f2e2c6af816c3044f3ef3b5a74f8 + 16eb0fb2ecfdb6f2b34de25ae8009878 + ad04c817e18894add716c63b9eabd99f + 94014eff36312149d69de4e326cd1266 + b5e491781dfcde11657d0cf82c586c86 + 00349b94cab856273c3b9e66090eab30 + 89144cbee99f9074384b09855192f461 + 737ee5387102e56587dce3021a1d8fac + 7e0bf4e1aa0c4392e776f57508496a38 + 311a8b8c0eb70147f1a8aaed9cac17dc + 0c220250b8b1bdb82129f257933427f6 + 3bc4434a8c306d1ef949ba9d55f62e7d + 3e997999e962e6a820c3e4bd058e8a88 + 1a20c58a70ccbaac04cfb2f72c7016e9 + dd53548913807d224ab36c601111cb2e + 833fddab1f42635679d1b91a6bd2c061 + 895a9c0d21eff6d6b8c99d6935e52413 + 0dac2d8517a97202e3f4846ac9fcc9d2 + 83ae1712fbc7b719dd9b62463b87688a + f355ea6863749eb7c885c8886609854c + + + + d9591ae84f64a11f0ef4e4cfa16184b8 + a02dfb458cfbe6b9098d7092b188f07e + 7eae079d9f4775e3998baf448a2d3fcd + 6d935a23a78589b355083601c072e79c + c31f558886ec346751159fe0a291c7d8 + 78a34da89c91eac097c3358148ca2a6e + e733fdfc1048751dbe865b8063c7d5e3 + ef59ac0a415d7ebfc79f49cf68def9dc + f62d5a38fffe33916b4feec1cd4d070a + 8d07a21c5634265eb7825de24a76c3f6 + e74366bba84bf9cdf853ac47dde7e4a7 + 8b67c358d4f3a3b9f49f472299b46439 + 3b3b3433664e9cfabe2e97b251703382 + a4f01db1b00972b40720911027e6ed90 + 01deecf36cfeb27c4b4ed47ce7cc0171 + bfa6f7f9d5186ded3db4594f6c62dd96 + bec26a994f1044b9ab238a82d958e79f + 56b2b3757ca55783d65b4f0aacfef17d + 254cafcbd71a8950e85e614c12c3c68b + fbf79164c001a6b8277fad83fa7411f4 + 973194d3343d0efe0ef2dd477620c69c + ea72e3f9b5f8590a4ebf35d6556d084d + f97a9a21f7009f750517d0fb5b9c8fe7 + be2f2b7032c38f13a4ed9e1e4547ca67 + 7786b474e88981f1358a3a56203a4e55 + 0f0d627b67d77468952452e0be51799d + bcbf27c7162ce2ab8af05363e2af89d4 + 28ea3587dbe1e212409a101dd9a1b5db + 968d41d256ec6c44a729a904e5f48e7b + e5cbdf0aed7ce536886e39fdf51b5295 + 0c39d4de4f9436ea8210e39b227c89c2 + a804552648e622559b9249437983543a + 23392788c8d2f793065c4a086e3aa16e + 80e1202e4f78a35a3cdb2ffbebe9b938 + 5cebb9f800bc80da8886c23bc47e79c6 + 7c4e36fc1548ba33efa081854b2f7344 + 7a3df5391abd0693dc027574503ab1b1 + afafa7503aba59465a3186953e4acf7f + a11fe2c7ef080240351414c50d4bbf86 + 1ac06715b058fdc0cb87133cd98ad8aa + 0830525cb8532cdc7c28968e5da21e08 + 131b58bddae04158e3be9835deb280b8 + dfb9562a76abcb52e4d4ae0765416d10 + 880799d3e8a7daba8d69b2e2457cae5e + 1bab9b3fbce949d86a93d3c64e5fc2ee + 9d5b854fe8740b815820e59e6825a32e + 80d85e384ff783921f696da94d161d8b + 12fbcb4d6d9aeffea87fd02d4ea090d8 + d41d8cd98f00b204e9800998ecf8427e + + + 62633afabc70b70d4003860689de2766 + c57630ffa73499bc69c33708cdc39c8a + 1bdca2f9b120ffb269982cf8a82afd01 + 1268dece1a57a6e0adecd42fde665a43 + + + + + + cb14e547076c38a0e839a06407600d7f + e7228f54fa12772a026694ad93ca1d3a + + 59bf808a94288ed0b18947408fd66771 + + 9de3c4a6bffdba68328b7252a26e0277 + 0df1850eb080f98590fc5ae523c5f9ac + 2efc3b18dd411868875a6d0fcb240b31 + e676f3d6471af2aab8a79f122565ec8d + f1e036bd48da88c94ba01fe601c4ca6a + f9e2d0fe9ecacb08879f9e9e1f7deb76 + 97f28e58159264584dd303be2ea1a6f9 + 3b362b7c967fdd35fc70ed50f3de1c3f + e47d3a532067c926bd56f738aa7ed9d7 + + 90f4b3daa89d4e8e94b89fdb93604969 + dea4878b059e68fb72ae0888a364f124 + 20b7a178708d3da56e552e1cb46d0d58 + 6a9795724057ff5abba273fa365f593f + 13126b8fb5a67802af600d2946059d00 + 386c0646c1e9024cd755397a99d1579e + f0dfce4bc224a19da443ccb846039b29 + + + + a7a65b1d726a9f8804733ff7f982a311 + d35bf31479f2e1668766d738392f007c + fa9c5588f82a092c43f6a3bf35cae699 + 68e17ba8b5e4f46eccc79303dedf3965 + f524a03b7aaae8b2523b9abe7d07c212 + c93356e1d93ec95af73a1579bbb82404 + + + 14ace57f96e03df17e9361625fec1fe3 + + + 955d708e2b3ad0377e7625b1a186cd20 + a51fc52d1e6b1d137715bdccc8b05338 + + 389e82cc1c6ce96c2bfdce2311285fb1 + + 249d0928d4f4bae90405d84883b56d97 + 46a0f55b4067fd086cda85c4d830e71a + 0a8d6bdc02dca2c7c8ea28c2a926414b + 3428b2cf19693b4488fedcc673f3fb11 + 35361010a7611bb0aba4b6e1a25cb94b + + + b3f0fc6519f41fe32f8a7e180a4229d6 + a99c2577bd7728fe196e8697c4e69ee8 + 233c7a944cafd7da4483255fc6281233 + 5a881cebed4a8108b9c33a6eb15b89a5 + a8c506dec00f2e35c02ed3d18bdbb05b + 3652767e634b38fd2d6d85038a69616c + 9735f2a9c9b592150a2045c3d0f71f1d + + + + + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + + + 4ab8740f57ffb79fe877d0fd4ba8fe9c + + a07f48f2e90f8a8748743c38cb1908ed + + a13a6ef729fbe8444f5d555f6c06be54 + 40825abd2670849c5cff187b187e6b83 + 1c279f456be8efba90559b7428cfb80b + 56b89cdfaedd80a9cae83fe63b68247e + 7b0f5b5f07fd740f1c4a124b3d5ff8da + 98434379c4ad984e5fdaa8d0f1c1a53d + 716855b73c453bf2a259d1ed221aa344 + e17971436cc684fb0bc84f9fd6c60e6e + 4c0381f54fc8ec712bcd73b3fd962010 + 8e80c9b02f743d065bc392cfcd2c5eea + 32f683a48f565d99e8af8e1a056e95a7 + 60620f393b770b10f2750e48ff7d6153 + 704d2e089d882dee701ee446f1ac168c + 697b199caac2d0cf5c14df3892094d9c + 31dc4b167c1dee7a42812e2825c7e5b6 + 0ee24350cef525d649a9026f4262a1ba + 184dae164dde2d98685c97437a64c079 + 909827f7d853d3bc3f3e6fe2855e26cc + 60620f393b770b10f2750e48ff7d6153 + 2d6cda2c9225a644e5c857d5e50526df + 08e8b55d93a91d96e5efad3e80b2c56e + 66c556c7adce5550bfb106c9c06e1606 + 5949d2cfa268e7de8c2e9dd2e63f48e6 + 49a46e244a1d51fa9a0ff1c118ad52f0 + e7b8d4bf09da465e324896f0f608827a + 62c5f505a6fe7afb3cdb2303753eb24a + f1e0d592676d114a000ca0d8ce50bc06 + 55d146adf28d8b2fa1e62c558ac22982 + d029afc2fe53c9af284929e0a7214211 + bed50ba39bdf09a9e6830435c20f005b + 24d866433c7e571d1e9b6490baf939bf + 6463c833068ed7c7fe4cf9a1a5a08669 + bd2bcc84fdd1dbe4a5a10ebea9e74ffb + f468138648b67f42ea5bd0c4f7e46961 + f42e716e97e4bd0d25fb1f5d78a9290b + e11a249cb2f37473f9cd57f08e956e47 + 1f9e4348b1b3c4fc54eff39b164e05ed + 62c5f505a6fe7afb3cdb2303753eb24a + 3e2b30707dca378fcb7f5927a5c7b7fc + 82ea65aa9d62882e51997338f5984f55 + 1639c5f1390a67bff7366bed44ec3e12 + 238003f409264d7b10daa051c481a2ee + 7c87bf8fd9efa073c19e76e1f6e155df + 40d07c87663bcb542781a9559aa28583 + eebac3fb863187609b71df36cd82b8db + 7592dc481bbfdb210671fa4f7dd70b28 + 629ee5694c756e19eb6a6c74aeb0dbd6 + 3e5556f96a6763241e3aaf77df4c06df + 39f884361288f6be0abc2be02d1789ce + 89edef55afee29d842a71a005fa17aa1 + a874877837808217acbf7c0a8a9d3eb5 + 1639c5f1390a67bff7366bed44ec3e12 + c04ab1a7fb9336dc9b6eca35cdedf576 + cc961adedcf095780ac703bdc96e4cd0 + 73924c3e3895d498bf7c90f19b9383e1 + 056deb01d66acadc6481e508329d50c1 + 83ab38d0a6bf1b48027b8c6920e38530 + b219a7cd5d61429303a0cd6c11ab221b + 80f45bdbb2a452f71ed4af98c4a68917 + f42d97ebfd5fc7f027b1c602d451bbbe + 31dc4b167c1dee7a42812e2825c7e5b6 + e4ba9d82012805494d5c9857f0716ca5 + 4e63cce0105852a7fbfe84d014ee8a16 + 89061f5ed31c502e3fd16bbbeff768e2 + d7eb489a87371707f4b4787aa8046bd0 + 60a1ce5fcf7239492249369d297671a1 + 11ddefb0f698ad195b376101b6b1402a + d61457cdeb6e4985db2bc0728c3e4ddb + f8bb4a508a3a77d764eff6ccf9ff974c + b8b55cb07d4356c85e665b0623833f2a + 548b36896107a42b0bc55eccd936f583 + 64be0001f0322f197f488accc3ec22bd + 0a22edac884e5f1467d83188bd6c5390 + 7592dc481bbfdb210671fa4f7dd70b28 + 355e1feead89041794a6efeb354c4d3a + 3e6bbeb0ee3924fc249fc1bf5b31c018 + d61457cdeb6e4985db2bc0728c3e4ddb + 62ec68c9f494a1742ee3c462b7c37e2c + deaba57923938e1a4adda4144e768c98 + 8ac7fd95f0f0b435e518b19df99acac5 + aeb3f7e32bccd903355503c42ceb3d0d + 056deb01d66acadc6481e508329d50c1 + fa66586d7e6295b33830fb4cdad7915c + 1a382a68bb02333ca48fc71c55768a97 + c5e71ab104857a5cb61a8a88c69d35fc + 62526ed41e15714e0a95e0df898ade19 + 086b10c92c6a114feecf36599e8a743e + + + + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + + + + + ceeb9d3c569a6b5782aec5ffaa9611f9 + + + 2abcecb9dcc6bc646183851937fbc846 + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + + + + d0347ebad87636fd2b3c2fe62caac7f2 + f0382029c8ee740496784e76fd510b75 + 55a68f759bd41438996770dbdd6c38af + + c27c43397f07893e4c1f39ba0aa2d0c3 + 38330d21c899fc2fd6fa6b46822dff59 + + + 2089f68c7b9aa5934aacaa9a60e74d44 + bc118c21f17766af36c1d3eed8097361 + + + + + + fd7722d22961584a7b124d89ae879244 + + daa44dfaa1c5f06c4efadb25e0e57288 + + + + 6260694c14fc682c02bf289afbaf73f6 + + 7e21ace74e864e9300f7ac94ba32364c + + 9b8035a3095edff52395cd8149c1dd72 + + + e786263cef9e7da22783e5f210882eaf + + + + + + + + e0b8e07944f5878c50ce6ef670586e81 + + aadad48134c385ce9dac0fbf67eeb62b + + + + + bbcb97be7f3191300f65ebce5976c78b + + 878eb03927de94c50ed526dfa369a664 + + + + + d76e96ee407969cd2b087baf57d5e2df + + d58b161476816c7745923ec0cee239ea + 5397bfaa9919f46edbe52d1661d2a58d + 951c62f1ea71c36643e89c235c4c474d + b9e3adf37115bd7eaa02369a65b7d989 + + 2b93498adeccbdf5089b41519690fc95 + 88012d5bca83a58f6f9d128e06f5e3be + b745b967de2e9c1923db405b2f779f22 + 6c4be6369a7d979f7875e475218fd4b9 + + cf12ed2dde48a112fa76ac6fadffa049 + fcc45a4b48836ec366dc7df1722cb975 + + + 06b7dc65ce0188b6f558a5c444812b16 + 7117cbf5dbac705ca33b7267ad41c85f + 878e64bb23904404c0b4d9c7efb5be56 + + + + + ba8257c63d827d222dd1a362f2c9c006 + bc5e86fec38ac765ab057be7ad44e22d + + c877b80d462d1597cabb6852bfd7ea5c + + + 92fd10328611890e630876dee972cad2 + + + b5bcad5eb0c166e201d27fda2de8bc24 + 866de168270c077ba4377e7b71edbf0c + cbaef719bd3eced9bfd18e27053ab7ff + + + dd64d256ee68ada4bef6f2813e764539 + 992dce568f947762c71813f356dfdad4 + + + 487da7c47ee926a8e22628942b38a736 + 29184e89ee5e69ee15c1d4b3e8e3c624 + c77d73aa82d3425bc74a98d87f10f2e4 + 39e220fd11a0b88e6e9dde849747f125 + d31c9e105edc16efaf371a995e158ef5 + + 89e0a8204c418c91b282e7d62b4046e3 + + 26e1cc9616a324abc4c20dce57f795b1 + + f92c07be3f026c6243bd61393de3f49c + 3b955fece7d128e3900c64293c1c81d5 + 5433d4bca8696a87a1a5220c8de5e1eb + 17d1d3aa7e5c62fbf6f23a3642e6e27e + 8cb95cdec3ff9f6ad787a207aeb42f7b + 5491a9f898d4beeba7b0596da0c11584 + 54eec5beef92285bb87110a134d24223 + + + 5ba87d5a771501797f9b50a38ef3bdb3 + 958b02fef7395d9e46e87dd780b3ba26 + + + 03c06b853c6fe44522962a00c9556bf8 + + 321b59d8a8f83f85c70850388e535a49 + + 23a0ee8c1536ea4f898a0ce67822e52a + + 32269e2db0b305563ddbbf7635d6e4be + c01702c6b8d043e50661dc1760cf6e44 + f92fcc2e61db44cbdecc102c59e5316d + c2e720e2dcb0cb90138936fb887d83a6 + 3a6733e5b65bc48c0eb56ebbb6426d91 + a68da5a896f13fc850fb2495ab5f0afe + + + + + 593d2ad33b9116b78bda8aac00decc54 + 77773810d5a616582c8b54e483a1b088 + 7e7002117eb6be59db6886eb5576cf88 + e30a073d472871377759fbfba9454469 + a4e6809d24554c2acc01a83eb3f616f8 + bd3ff92ca006978cf8f6892384a70dc9 + da87fec550420750282561f40c883321 + 5345c1496068df3861e81dba27c8084a + 97da802f4e05077e937bbe4b0baf05ab + 3fb467e2b2bf9fd9d1ae09eecceaea2a + 1fdf64543da97bef5d1f277373a93294 + b1a6b292862f11dbd4e394f13e45b5a6 + bc7df0748eb7e602049b65e1f6ccc418 + 3737a1a03845b49fff17a2ee22d9b19d + cf55ade5dcc08eaaea28f7e7ad2e651e + 6dc4b54611fcf95aacc9077a72622308 + 36c4d8037dbbb8154ea20a75c52c146d + 2aa5b8975f4b36e928e5de27be1e15a3 + 0ac96f6f47b1c55a1f7117cd65bfec2b + 8a56f184c9fe35598e145991cdcaeb79 + dc1f5ff0aa7e430cfa3d159ba08e5c6e + + fcf889032b466c88e389ef047111f165 + + + + + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + + + c7bb2597bae8c8e0fe35c509051bea90 + + + + 69c487c70fa69cf85eaafd8cab3adb32 + + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + + + + 4cdb3f21173ed8922a0b3c714e578113 + a14ead56bcbd87a4cb4ceaa48c608a3a + 168ddfd890bd93b4fc2726cc39feca73 + f711ec4e09a18bc2e059eb63dc54a381 + 1eaeb17453c8b0468c2ded84b351f816 + eaa8ca82d7b8c7169a0901d5f8d8c381 + 7934c8d6e1b3b31df831873dc7940677 + cce3a013578b526a93178c5dc3f5b74b + 192d232ba3fe973e87d996921f881328 + 26c08bef1cf34ab87362730c6f5cd8d2 + 9eeb649083b1074e9dfeec227eb1e966 + fcf804b351a40a1e006f9392bad65195 + 5b9a3577d8e12200e85d947394b99cfc + 8f4621668d7c0eee6c31f1a4c987c01e + 1e7e74521f2fd846620358dae66b4e3a + 862358720a6f6b780e9337ac46fdf897 + b4ab05df42fb62d307bf321175383ade + 65b7e6b302779f4e5eec1d2420684561 + c810f50f14cd5601f24ac476654c1874 + 404cd13423d96c1823fdef5ac0a0f77b + c4821e02a6ac31f15c850a39ee542309 + d311c193c2787f44938915d5ea7b388e + 4605889cceb92db40ff1fa2b7a6275e4 + d1b14fc9bacab9e71c1c290c20b455ca + 8e65581546909fd71f924c246c09c035 + b7a57f1ca4634fd5cf45d3266d4cb754 + 6b44d19be837875ffa8f4cb972c12888 + a70c9cfd6c5693af47ad9404b4c25891 + a80fcfc0b0b02c91cdfb05e94e05c234 + 1bcc03e9db5824a6593c3d89a6bb92dd + 2d45e25e9d37d6c7453cc48b14c17722 + d748fa60e54191e74b99c30264c6f6f0 + cba95f0438ac9e328b27c9edcd7ae205 + de2d166cb4471ce22044eee3217e45f0 + b5e18b12f9420e5803fd10e108a7c211 + c080cd026c2e83632cc56e0e5f3f9b0e + 3fdae07fdf017b5e9402b857b497e635 + 00ff0b0fdf7c7b8afe3eb235d77d6682 + 0f2a6c3cd7adcf7457798c808dfbae6a + 7e72c1dc95a48c80ed2d33d2fa9dae6d + 87d3cf81263581d5bbe3928cff019089 + 4087688aed79cd1b9146d92f1dfc4f12 + 5ff5a232b842528d8ff04b2451d9c169 + 6f6692b0e5e5795fc3a4bdbb4b4a7201 + e16db9884fdae05a86fc1bce2ff9027e + 03404f13e5bd040aa9ef76d181f2d372 + 3747cf950fb4e97b46041dd720c4d990 + 2bc55357928fe33e973e220a18a37a67 + + + 01145907432728dedbde34afdf9d000e + + + 71145a500af7da2e3da5c12646218902 + fc6fe382c9e14b599bafb0144f5533ff + 8d37a2d8bbb48d7c02b1747794438d6a + 802605b4ed4ed42f4284d81cfe478831 + e683ff89799ac24fe2fd3c59951df94e + e6709c3c195ffc666ed92d77457b62c9 + 56de153d85bb124f74d086beac9fba56 + 52bd4220499cca02891d30a7927bfa7f + 431ba213fee42296eeb27d6398366ed5 + 133524dc6e83e41931b241f62daf8237 + 73d1adfbd47db92b5e5e9d4f7d348495 + 1ce02f39ca7672de6619ad657c55932e + b9f7af08ad06d815f651ff405fd2caa1 + 501f7e96f74739d0bfb804c3f0211a63 + 0cd80bb1d1f5cfa09e9da985d2003142 + c9206eae5612e05f3ad5c682968be301 + f93be6a0f60e8f34d1ab42a808f2557c + f3aae34cc198fa43c14dc4f9abd9f101 + c2e67a5966531f2f7f7dd597de9e1573 + 10b9f99280df3e5e50a2028116d6565b + 9d3d91219d433d84dc1a1ca65543e487 + b8ecf38bf1a4414e810be45ab43c960d + abc579df88998171cf224c20faf2cf5f + 02519d30e904863ef158030204e18cd9 + 02e51151242b4efda5e9ec744148bafe + 7a3187569e9fdcbbf0684147fc533fd2 + 71d62633e4033fece948e02a9dada3d8 + 9c4d3eb49bf5b3d73b1d8048aaa953b9 + 7d7957a0daf986b05371828294ca0448 + 5e281b556c8ebb79082c5969fed54047 + 93b8eb009cd3ca0dd902cec1200b6484 + 0719b679915f1f4fc11702e5736525dc + 9ca70ffe1dc1eef1a3ff7c6cf4841dff + 6b57d227c0e7dc6d24a785c580958f21 + af5f3304783ed9070c229f35ac52a4c8 + 5a289c4106c8f0bf9499df1d099ea512 + 2436509b36c40cf927b9647d661a1c38 + 6913ccd56c17657a275b1483533aa8ec + a062fc069ae644e8a915cf878ef597d7 + 605627ae6560c84e65fa4c9b4f64e2d9 + dc8a9ff1e0d159d5c9f6ccba132d2cd0 + 4ea8a6948c47d70561a2f2954442c02a + 685f153965e0749057a6f71002e077dc + 0f83642101003c524a75f60e8deca63c + 64495f376fd3dbb3cac669fb381d8a4d + f9240d54ff6eff094c2eb656937581b2 + 208371ed25079da04ffa8ae071ccd654 + 8f182dcf115c3da0f35c48178e8b4fe6 + e420e606b76d762c4e0cdac1e0df47f5 + 56b9671bc27ac9276c0b99285b806717 + e0ed8f525fe30c3c6f5f5891c9f7995c + 26c949e34df31ace9d846582417de5fc + + + 62429ad0ea4430ed586905796297d44d + dc5c0f4e1391a6bd82f2fdf877a6a52c + 28f132fdf5ce120f40dc165568240db8 + 0e8d50b0f31477cae83bf1d3faf0e905 + b8281d63078d27fa1b8cf26059f96f0a + 44f13fa39a9f42c82e61d3354c6c386d + 610b14189d6a60b020c64d27be9510bf + 6bceb7b497646a6aa04e6e841efba973 + c5bfd10da3d9f7080ad8659aaa522f54 + eb339be0f5c734a313b478f11dc944c3 + 34c34688b4ec0253829ac9fd527f02ce + bde9ffe5024f6d62bf642785dc9daf4e + 1f616acbb4937c87f9d31567108731eb + 48a54c2e164502aad03a71a45faaa317 + b4f6ae6d22a4cf9eae223457d2a2f799 + 1810f9de26962ea09618a16df9cc7015 + 9e50cf3e31ea0c3ab16dfe23f51b7f99 + 72af5b1b81a59fc6ff605bfc0499fe4e + cf79a246e0feca613b7d11a3fc7e215d + 942e5018c33ac59fc38dc7ab8632a9b8 + 5a72ac903742bf81f0ba94a936d58f46 + 3061b65bcabf247bde05b93b1575e411 + 34d3fc833296b1a5d952dbc98c336996 + ab3158e09a2b745fd2f32c2b57bd2a48 + 52dda2d1c9e13f46396c6bc06f64f2d4 + 472d4b9ff4a1af246bcad6f776c11e90 + 16f582a56f5205e4731a095df07718b0 + 647f594e04bda9b827dd0199f4945e82 + f9e27276a1c68e30d46e201bd6c010a2 + b6cc50de8005c1d775131afea3918f57 + 810b82763e2cdaa5789360d54a01ef5a + 019b4a42a5468f2441edab57af1f2d37 + 7f0f50e9bae0878628ed24738a13a570 + d565edac64dbf96ef7399867dc03600d + 3d4cede079c3cb7e2e725aa8bebea4a8 + 9769a9aeb2e01b70caee27ff8e839b34 + d87d9908f97c9f12d57419d3dc32f85b + 08cd763f0bd9ceec8d6354e35ebb9bf9 + 05551a855d5cbc4bc332990babdc28ca + 5a11155bd035a99f18b86bcfe0962c5d + 356d5ae84212e0e377e69ee994318dbb + f6d68d6ecf9b7b3a342fb102bb3e9d78 + 8f13fdae58897ebbad4c6789406f4bd7 + 687503f29a7151398af6eecbf0381594 + 3c5e51a6d1c62eb8c3aa245dae53ba46 + 96803417a48d820f9e8816ca26ba8b2b + d0db211fa513a718db0e5631a6c2bd28 + 7f028e770801c84a2639f303279bad88 + c2873fca5aabf0a13254521a5567156c + c0fd6b2d4225409e494c16cff83fbcc5 + + + + + d41d8cd98f00b204e9800998ecf8427e + + + d41d8cd98f00b204e9800998ecf8427e + + + + d41d8cd98f00b204e9800998ecf8427e + + a8a3a640df6abf3c85c577b4331f03a4 + 3389487dd651a3e13b7ffd5a87683b15 + 69841c5c95ec12706eeff33f4b7d29ee + 01dfb867c12b99011d8d1a3591250a14 + + + 13ddd01a7898974ad6fbfb60075245e0 + + + 3b190e31593f32f2adf02c14c36f7283 + + + + 2df1a3012413cb20ff49e7d073fabdb7 + + f0906537345c3c9f0ef601948c59c9f2 + + 5d8bf94b40bfe9936b22c39564f6e712 + b9d6470c46d69daa08b74f9cf7c4b060 + e1a5f70467a793b40ba2cf2492184808 + 75f08e0e9d8533cfe489126e9ab31fe3 + ce552903edfe29121f01d051db9b6bb7 + 5b13a3f1426509db670988e33cc020e7 + a5308feaeb501e6ec3b36b2616137f94 + + + bf05cbbc99b90c52f449ee4b30256645 + + 17e6fada1c4e10dd574fd7504174a151 + + 1b4c504888257f3ecad55891e17c8fbd + c205bfd9caf11bfd45bcb82fbd2c4aff + + + + b6691a27d0cd64ef2b16274c87188875 + + + + + + + 6cc2dc6abd6d3f18f2091df875e55a17 + 7bedc9b4adf52e47da196e13a5368389 + 48df422f5525b24a005febb09ed827e3 + + + 7bedc9b4adf52e47da196e13a5368389 + 1b8bfc8a4ec8303b4e4911a02be1f76f + + + a1d0d5795317e4142830e02b7c6b057f + 5e3c29df1a90503100389aa546cb284e + 7bedc9b4adf52e47da196e13a5368389 + c4bdeae35c270720440db4eb5436283b + + + 7bedc9b4adf52e47da196e13a5368389 + 3eb0f1599684c8b789c273a1188f01ee + + + 7bedc9b4adf52e47da196e13a5368389 + 48c25f56de461fbd0b33a6411bf1c718 + + + 7bedc9b4adf52e47da196e13a5368389 + 46b11d1a46f2af472621035bbf8ba8bf + + + a1a7bcdc38632cdebf149ae22c7fe951 + 7bedc9b4adf52e47da196e13a5368389 + 36264ef3a79b3795c88e9091cec6f297 + + + 98f64eb3ff459c9c744a31c054afe040 + 7bedc9b4adf52e47da196e13a5368389 + 3ce0e7b2757ae72174f410e6c49dccee + + + 4d140a273e6847e0d109cd028ec86b72 + 7bedc9b4adf52e47da196e13a5368389 + 84382b78161d9027dd45d88a58d25580 + + + + 8f22649c182d3ab9105f6a80ec0c66f6 + + + + 53b05c57a7cf6ebad63bee17f838f4d3 + 4c57f0f9cc94d1065ff21290ffbdd79f + + + ec5ec25f10da41049543c415b3a59f1e + 1aa125400a39fe03cc81b90ff769ab4e + + 1ad88ae610883c1da65f3def6c567cf7 + + 555d4bd9c809388c00635eb2a0084c3f + 7bedc9b4adf52e47da196e13a5368389 + 1dd439c99e6dad525e030caa6e77d094 + + + 4d140a273e6847e0d109cd028ec86b72 + 7bedc9b4adf52e47da196e13a5368389 + 29ce26c2800ecc78e413115f706d80d5 + + + 5e6347f2ea25feee7a9d063e095f3b8f + c8c0dab4e6b440bf96773cd0f2c719dd + de96b33f070b5bba25aae5f189ea55ea + 9c06afb990a8a5796a1fedb9f85b179d + 361d6727711b97c4d2cbba29d5825c3c + 763f36cd53fb5e87264d7bbe2c459c77 + 196fbb77c10e0a6d094d48c2b6f1461b + fea60b86ae10f45c1236e2d4cb98b5d4 + 9e9b6a1d3783a6dc22aace3af33d41c6 + d166697104436dbec46b29ecfd14fa8a + d55b0b22f06a60415d9b1242473b075b + 5254f89ac748197fa3c3f168439e8d96 + 782c5394e93b5690802b7b0c5f4d1061 + a8d3b42a1a82b4915bc38a3194832c76 + 5ba17f0042e26a940e22b44cb9936b12 + + + 172b1f74daa2d176ff349143803ee994 + ff96237de03edbaea446c9bdcdb4efd9 + + 5fe1389fba82b48b35e48f8a5da2a014 + + + e6c2cb92f785e297946a6ca5fb7e64f1 + 5f9df598d38d7f96ab7fd7421daf6d80 + 75027e8c2c36ef9e0a159b43671608bd + b4f20114a8a3ccf350b9e9330d81f3b2 + + + 88781ff4d30886009fed44d0eb3a8c8c + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 3d0fcbc1f97aa824dc13ec27608e89ec + 4a0e212b00283f453b566fa739494276 + aae5253ffb31c0e6c2693858076e17bc + c9b06f3f36617c7f71ee6d139d2ee52c + + + 3377a2772a540c3cc78757fe4c688ccd + 74e39d437fb69e16144681e4e4082052 + 3f571f1d6ec53843c5680266f15f741b + + 7571acefd78791edb89549d6b47f29e7 + bcca124e85739b7ff1b30e5ab273eb9d + + + + 79fb9a3ce370a269852177b0664abee1 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + f8f6ae430a23f49af3f799f4265dd59b + 862980e9d87eb902846497d929e46cff + 3bd86e40b928bcc4e821c6ef78220895 + + + 00dd2d36ec434c30b48a865662bd1f83 + 21a397b2b836a2dc3ed4c596d92bb1b1 + + + 002a44dc323d1e72d96aac22872038b9 + + cb8bbccc4e25dc1b81cd95ba94d9d97e + 23c917ad7ba52e5e5f70ac5237ad6db0 + 7de4830633c19714ce98d016ad01401d + + + + c35ee51112f365adb989ac3f7cd1d157 + 433b592317050c8935b4377a747187ea + 89aa7afa1ef0563399a69414d9f4d057 + 624ce205da7cc5912cd5dad5ab7d46a4 + cc0f17ba58f4528cf4998e85079caaff + f379a23f20942956eb5895447c05d40a + 67cc70ad4ff798d9162efa4a6cad3305 + 64091cf0a28896b72c8cb2d2d86a2571 + 6e813eb1251d43185fc346f6d6c97ee7 + 105d9ba50c82e6f07b4878e5595d0c40 + 045c722d5491af58775345fb7780edbf + 4625ca750942ffbf042af5dc9a0cda8d + 06154e0ea66b109cde360bbc57e1d1cb + 748a4e70ad6d652b70841a71073279c5 + + + 2c516ef18311e62e12a1ec0361e1865e + 8503906e9715f46b7b8882dd98eed83a + d30fdca5c78e3a00f37d74010e3bf0c5 + + + cf918de12a7c2a5b92adcfdc52b457fd + + + dcf71840622b4176c8c0f8719f1d273c + 848a5a5e7ee7f44a2acafda1ce18eeb5 + + + + 9b1a5b726c1ba9b9c83b0a91c520eb18 + ed6fb009fba8643b939870ea748db462 + 3848e643d7edd0b74770142b70a8c897 + f71f986ae07721c2bc64745f94c06a7b + f4f66e8f44121ecc458c97a6822c632f + feff3dcf7febfeed74c07f481c580303 + d7c9ff4b0ddc4b6899179b72768f4c80 + 05bdd60db2956e8690d26a4e75fc205c + b232782c45e677744847769771e93064 + 5fd7e1da0ba30cac7b514db2a485ec45 + 90f1cee5c8f705bf64d79b0ff1735d80 + + + + 6cb880bce9077e350f686d95d4aa74c1 + 1c0cd255949b52b6cb8f61965846c232 + + + + + 3a5fb4f38c8a5153e2d5846ea7b7c4b8 + d1d1299e53b085083f3505a4a3b30b31 + 1511af6f1c4b5bcb2412f68fb5d59cdc + + + + edd56c6ec2d94ba5ed8d926e88aabcf3 + ae05ced5ca13d39e101cf9a573e6c5cc + + + + + 67688ca1def94dba4f74ee5ed375d2fd + + + 3a78a3e103300eb0f7a4b3c9c9ba7057 + 929b0293796307d867efdc60317ce770 + e23415d95ffb9e448943748006a117bb + + 687e10fd5d9efbcd698345298f0476fb + + f9ec796feaf9bd084539a12b8f2a1611 + + + + 33b81b65d9ce3e303a24c44e5c8c900b + 125d4be84541bddb4b5191e0df020f7a + + ea13ea3ec7711077fa49cf3e002da3f8 + + + 68f32df3ad1f572780644a6434f542df + + + f3b72da6139166da9cbdd9988e2cd529 + ae0aba76956840ff3985ef6ef30e509f + 60884d381f5dd69e53082b3aec31b600 + 2c9b4292ce1a2655cab8133100a56871 + e4e6f32fd2608f2eb61944f1388d91b5 + 6790f0ee9bfa47dafd1541b6d5b51a32 + cd7d2dbfec7175e662d048f05edffe64 + 7f91267917f6bb3084880c8ad03a57dd + 2ebc351c10d13edd8ada31f25c46eb75 + 58c1cdf84b7a8d17506a1d87dd7a8f5c + 76a8e8f3585d386532fb0cf9947e4673 + 0ad6c3575fe688c50f89bfa0d9cfd412 + 280b5c4fd9103bc00b943156649d6db0 + 15d4651c1ab41d95fb05a345706db80a + 36ecfe4e16d8d8807b35a98b2aaf29d4 + b3b2882611ce5d5456df99dbe941463a + 6c9b827e7338b1cdd50ec0038c684ec6 + + + 560514c67127c83a9eb2156b7bdb15ee + 0008daf979e9ee3708e4472b2ad89f47 + 7817e2ea9503b99243c576503cfc6d34 + 3312f10edb6761a725b5d770fd1f7495 + 61e53f05f1bd13cb3809eb7ecf872085 + bc1a38a39297d4a4d905e384e3928216 + 046218725b88b1cc14c6ee1ea4ca8781 + f63ab0139abfd3201cebc3a8d59df65a + 2de27f7fcbf92611cd094244898068f6 + 7b41ebbb531329302b1321a6fa91d355 + 5a569f62700afd06d0f3785e8c11f84a + a7b5497dea381dd8e2f8832332ed1778 + 6e3bcd43a2ae301e9727c7d1f463d982 + 435b1692c8bb7d189bed3227b859a9ee + e1a366cb27e5a131e440bf7eb72d5104 + 43242b787f7b97e08b3685bf414ee839 + bea1b911f7f4c560148309d11fa6bf7e + + + 1e0326f5733b4f2ad2c6542a429a78d4 + ef4af40318c18df6a17db609e579b3b6 + 1c0a01d6e8522a741e6a4c4bdd340f02 + 3226e9e4a9ca440646ed107619f13813 + 88185f20f2bd003fd2f201ab16d6dc88 + d66b201f34bb9cb01ed3b4a8d0f1029c + 2613a60b149e659ddcc2fb04db46244a + cc438456615b937c8b2c0d309908aa43 + e1da72924e6f176607fb93787216674b + 64a677c0472c2d423befb27d6c51f8d2 + 6c7e72b06074716c0e4d24979e267e3d + 43f12a4517c1a26d3839d1b562dd709a + 138d7af905bdfcbd05778a0e6cbb9e55 + b55c3fa23e4f5d448b358a07050a5fbe + 287051aaaac75264e26475cb1ceb1374 + ef9e5697edc792c6b9833b471f0e595b + 03cde49b340c3ecdb15dde723648f23c + + + + + 846437bcaeb75a4efcb0e7e68ba2eef3 + 17265e7978378a0fc56fe475ee3cb9f4 + + + 03fe42d9236533812c8370f2026a7ec4 + 45a753536e564c1c613f1a2e9a499726 + e8da404cbf7341b78369d572bd065497 + 61d3a469017ccd9f4e2e34e5ec6473b2 + f2c52c809eaeabe69f502a32b587d962 + + + 23089adec0e1a871e4d4a690e7f95961 + + + + 68c076439a5c6b028aaf3b1525d4f6ba + + 0480afbc8ef4ba91edb4388b7cb7ac8f + + + 89e25543c84de74a67f2a40e67a5b0e9 + f0f0a3d842b9b4abd164260199dceb37 + + + + 8cf8df68c9efadab7b05f46c9cc3b3cb + + 56da88d2002ca7cee9a695a50336177b + + 382db83cc69a7efd25ca2e494ce84ff8 + + + + 4b63d24e3bf71237ebe293c6e62d909f + + + + c6d6e8a8c595e6836a519ffe32898223 + 6491b32f2a97ec51b86af5f856e0007b + + + + + + 389fe1261fc57ed782e50965921458c8 + + 0316b26a7f4ae927ba4ba2ca32d0cbc0 + + + + 60c798a2769ff4dde056f9bb421ad890 + + + + 7887fca5213864c27b4521bef9081f6f + + + + 204259b30898d12a5882981dfaae9098 + + 9e1236f7c2730b1666aa40e578e73d84 + dcfafe72bde11ea147c5fd92a113458d + + + 43714697f6f386ffb99bfe71b390eeef + + + + bf8858518545d32db9075c91f2821fa9 + fdc41e424ffc0c823449d42dc22bf16a + + + + fc9ca2c7f1420487d3158e1e6bdb7b8d + + + f00cd3f8eaedce8d9e04297da5608070 + d8dd0c94af0d03a4855dfb1165bcdfad + + + + + 120fcf72dee5c9976f33d6529a932701 + + + + + + f186d1c9dbf71931d9db1b3bd2a63fc5 + 8444195989f9c9053c04a5de48aad16c + + + fa5c2dfb6fe409767c058638e59ebbe0 + + 4eb355a592916e89413a185ac64b482e + + + + + + db13e2dffa9c34a278bd36364df064c9 + 3d6d9a44dc570986d403fa4d778a4cd6 + + + b0eecd977e5d1e03002835ab1c699a46 + 001d6e472912fc30a580f7ae1a0885e9 + 5489b577b1a0deddf6e97d1ac82d350d + + + ff4b9c390bd59a3eab494bb04a95cb56 + 6a90a06293becbb80e7f633d7afa44f8 + 8552caafd034dfc8ef21d7b34200c586 + 493792da2b786e47f9b19d54643bb561 + + + b65e55f4c6a77fb4588211a17418044d + 8b4a26c284542473814f048c24203049 + 85df4fdaa01cd0571a88d5e444a7da18 + 9152eb6f4395c9ef747199465bf655d4 + + + 767eed517a500d1a380a006735a5ad41 + e692d72feff9e54e80d48759bdb8cf7b + 4c33d213ad55fe188c02ea8b096075cf + 9fbd8cc16b1f6e314f4b45cc3138f3aa + 0552f63f685fbcf6e7a7f308ac7f8ec0 + + + 60ff3b398b6a5d667f77391da9752d73 + 001d6e472912fc30a580f7ae1a0885e9 + ac4432441f89cbaf2ee915ae9fe969a0 + + + 60ff3b398b6a5d667f77391da9752d73 + 001d6e472912fc30a580f7ae1a0885e9 + 863c09b54aca260ae89f3db8c76bd559 + + + 774983a0ca1ffc3fdb7f18b147fb9f34 + 9166bdc7b82ca243caf7b5697215e82e + 2132d1f47fcce0fdbfa2b24f312022a2 + 8ab0f56b0d7454a534a388fd4378ed6c + + + 60ff3b398b6a5d667f77391da9752d73 + 001d6e472912fc30a580f7ae1a0885e9 + 3881e535c7cb81de2a8e1a66ca075a7a + + + + 03a516a6b01b4849667701ae6c58b52a + + + + 00de6ff8d54176346be65e5df9baebf4 + faf1d3556e8f82a50e10fe1afa2f691a + + + 5849d89f4ee5b747e02821ba3c0e5860 + 3258ab24d7b68956764831568302b671 + 8e33e8c81510a6d0abff11718f277fce + + 17080cfcc850bb767c276bab4862f87f + + 62852719592019ebba1b886b91ffb73b + 3bb84d055d2aeb1ec0d99f01b0739dc9 + 235c21a82f9c1f44c7b3acb6bafaa921 + + + f4d59a7444f7adda1a702bd9b8611e2f + 9b84611be817aa053c6a848277f5bc67 + cf9c03cc176b84a57c44d9c939e214d9 + aaa7bbf1adc8eb6c95ef7dd50d9e63bd + 6f2acec6438f73d573361ce80660ef3d + ec690fd046b1b74efd80be6d80023221 + 52623a465563bc7991068c034f0b5dc6 + 493792da2b786e47f9b19d54643bb561 + + + 9eff0f8310f33879e1ee53906600a45b + 681348d990ca31bb0872ada526befa5e + 7bddda3e426410544c4ed638750ca209 + 062dc7b65ce30f03f1c2cca864dacfec + 5d4471fc73e65459aede0647a0534cc1 + a6cebfdd33a0d5331a5e7d64e730727d + b9f5e9a8803c0710c032e2f582e8adb2 + e992bc03c8351b8d026deb3890f0fe51 + e3f85857d1945825a24cb719b2536d95 + 1002e262a615f0d0679e97e531a75a09 + a0f7f88de59996a9d6206b89016fb117 + ebb27cbb8fe76674915732c733ff8f8b + d4ad6b5de62bdb86bb7d0711560bde17 + 6544992dfbf71b0b3127e958f0fa2268 + + + ff745af5e910ce4a54591c948f98a8d2 + 6ab4af37625e66e25d7ccd771b18a104 + + + 5966db4152a62de6148ed875da55f665 + + c727ed85429901e0bce974ab754a489f + 4b5e63e7220da4821eee4199c16c90ac + + + 29b1cec7c41d021d2e7c634d1167f01a + c836ea534d5f9c69af8872ec066ecb09 + + + f7d3eb78c0e03b911b98064b37dfb4c8 + 163d7d6187ba3997cc645e08507d1ed7 + + + 863b7869ef5f18c80e48d162b624d59e + + 5482ddf7b0781a3463874773551a7233 + 2b08dc2bb59b1e48967a94fcc8c82608 + 3d4d83571374f2a6a8db3c5c6f388801 + f69a892e5a1e3aec71577230eb7d897a + cd1940244de1d9d760c60247c5e960ff + + + 2722ef8cfd6c2b0a458df56e8da0f3b5 + + 0618a6780cc1f7fbd8323a73d0a102c6 + + + a41951897c0baec648f3d3d9ed01042e + + + + 56b4a3a2e4cd94a65778c421ef2963dd + + 075f0b57ddebcae2a23a118b4c5fa679 + + + ee1003221f0f3b92866b35e3a7b01f3a + + 320c596e59221565e95b7ae531c7f2f3 + f0b947a9f004dd6cf0aefb62ce9f13ff + 885d00ee54e5416b541951cceb1f123f + + + f457bb5d6225bf581f781b2ef7bdaabe + + 744008184ded2af65aeb87f49fa6fbf3 + 2d125366ea44473be0b377f7b33d61af + e9ae1c559b700ca88542ce68cb771cfd + 6796ef7de79b70cfef586580f19751a5 + 7dfdd126f5fcf21de3e46d99de5b465d + 66421b44684006215d6a46faf5bdeb2d + a851cef8688de09ed8b4493a341e4610 + fe761f0f320fa047f815a414ae4dad94 + 24dda04a1b7bdb6ad84567c1b53cd40f + 680dcfb12c138ae42ce77b65ff664d23 + c34ca7605f36ec727c0195a08b4058dc + e9ae1c559b700ca88542ce68cb771cfd + b9f2dd26d1cd39b3042e676136338144 + adf7034c644bcb3a9cf83a0c86580fd8 + a851cef8688de09ed8b4493a341e4610 + 24dda04a1b7bdb6ad84567c1b53cd40f + 48bd2f29ab2a33a49a312d837a124174 + e310a9b60a97ccb2abd4a2fed0197d8b + c34ca7605f36ec727c0195a08b4058dc + 179516d2464ba9983d7a217db49533bc + db9398e67e31234a7884f63590e4627c + da1bab847c67d75b3e8f2655af454030 + cefcd3b49f5d410ae7d5047a68ffc449 + 0ed13fac66fdc10c575bdcf84caaba76 + + + 09f4703a2808409b78bf849af1b6bc62 + 262ec07a9d9755c8134970d4b98954c3 + 53ce796584c8cca92e897879eaa202fa + e30a92a6a19f0034e9d6d6b02fb17869 + a93f1e68deb640b4e0522ba16a2b3501 + 6a70411c9e623f5d1d0325fd802f4151 + e4065b8ab1ec240a112d36c20e7a1b6a + 538c81d60f2f47d17b9c8b9fcd185142 + 1cbdfc31ed9adb7ac0a5c1b6faec10a8 + 92d79b9863fec1d26852622b1c30308c + + 4ccdf1145e3254894f3034df47cd6f18 + a9e6a36013cd3e079b466187cad616ce + + + + ec76708b8d6a095a4ffe54628b6100bc + + 8e846f2e6bb617593309140cc0ac1b95 + 4ab4efe5a13e4cf9ed043ce9dd7dda5a + + + 3d8247d249dfb2e0327accae1595e9ec + + ebbb5f2704a768c911ce6aca24eabcbe + 4884fe68314235828e85df0eb424f8ed + 61ee07d3821fb47e055a4560e8bead41 + + + + + + + 19af7fe11513bae50502d3cb7003f3af + + + + + + + 19af7fe11513bae50502d3cb7003f3af + + + + + + + 19af7fe11513bae50502d3cb7003f3af + + + + + + + 19af7fe11513bae50502d3cb7003f3af + + + + + + + + 19af7fe11513bae50502d3cb7003f3af + + + + 19af7fe11513bae50502d3cb7003f3af + + + + aded17cf261824dd4ecf7454134d70a1 + 3b815b7dd9cb4b2f621a0a3ba59a967f + bede072ba3c3d4fa9e9b3517e0752c6e + 457a8b7c28195a836c89a583e888552e + 84ee8b08e86c9c6604f48b6406d81770 + + + 19af7fe11513bae50502d3cb7003f3af + + + 19af7fe11513bae50502d3cb7003f3af + + + 19af7fe11513bae50502d3cb7003f3af + + + + + 2402b9ef0684fec17fd379a1c39126ed + b245c2281f49110f782e15d92d733de5 + 1e58987f94b67fd748fd20d7d58ef845 + 29203cbe98848ad230a9a07b655e317f + cbee1a801beca9512381c39b075a478b + + + 6ef078eaa7e0d9ae3a40461b58cf2195 + 7875f8fea80c5778d2b3b9d285317cff + c14ac1347b43e81a302a8f89c44c5093 + 2925ba67bb6d4c7f4a557b5f12843ece + d23453194488f7e6536d29c8d8c62fac + + + c291e1f46f28c4439235d4ac50011d19 + + + + + + + d0bb838125cee3b8c81d930f0aa24ba8 + + + + + d0bb838125cee3b8c81d930f0aa24ba8 + + + + + d41d8cd98f00b204e9800998ecf8427e + + + + d0bb838125cee3b8c81d930f0aa24ba8 + + d0bb838125cee3b8c81d930f0aa24ba8 + + + + + + + 44d3a9e6e1e9f073d3e4bc289662d8d3 + + + d41d8cd98f00b204e9800998ecf8427e + + + f30971cde0f14d999f0fb3cb5f2fb580 + + + 789e91c2ff7176354cb604c43cfe3a27 + aa96eea6e0458f9ed9038a7315d3bc37 + + + 50b4cf7bf189e3cbb6917da581b506ae + + 7776737fa6b15d02a9fc7da98cdb3ea4 + 86d621436e20a34fea348c7398ba8f0b + + f94d5ee81eabcdb23d6e3d0c597a79bf + 6744891992150bc682809ca4fd854d90 + 4f88b96bbcacb95c7c4569da2f48e0e3 + 88f52d699185cb409e931db8f4566a4d + + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 9b698cd3c62ab2cc0035f9e16b16202c + cfe4abb312fa7dc9ed6a8660c1bee344 + 94121cca18dd64843d5a6ade589cf3bb + + + bcdc9bf688e8d50a9986324fc204b0a5 + 9967f5ed97b1cb59311101bf0e056dfb + + + bd915955b9d79736da5d9236ad5ea317 + 22246520e4c23cf9bfc0268781f989ec + + + a20b039d13179365ebe236edf20067c5 + + + 6f07e1af1de997e5d34ce2457c04c906 + + + + 3eb770320b6a5c3bb117b34d9e8a5fbd + + d8ae73aed8c85be975d6239d717c5d7f + 66f0855de1e05cc26ef4e824c462d3f4 + + + 83be8f43a84e85ecc9e2c1905fd355d0 + + d34d404f0206f10ef71a4813ef70609d + + 55c3eff3b655050d27248db10a297657 + + + 0975cd84c2af2daed0d7702c22fe7830 + 9d18a0e7e58bbcb702e66ac79a2faf10 + 661f6009852db9f9b938e49dac90fb35 + 9ef444fa4b7e22f3a80e5093a8de87bc + 2e670ebf61faca98c80ed589c8557f4c + 5f1dcd581f11e396228abc717aa591d3 + 4c5a2631f7d6380e44899be4505f038f + cb29609f6562a0afe992485ac2e1e440 + 57b75f3117e22fda6d5a63f4b017bdb6 + 2ed9e0d82a6fbde26d473a2f122aff87 + 5389e43a3d55c4bb73744a414f455f2d + 0a974dc4eecd8d6776ed134be30e541b + d0f2f86c5cc4c6fbf5db229c9f0c3c9d + b42237a68f0021fee256679056e5c757 + 22609d461ff55da9dd7fda4086ed58b7 + + + e235df37a9812176bcd5a6da050bb174 + 4f716f54aa1fd4dd7804a1b5d5be1b92 + afcaf165570a69a2714e8d4fd64bc23b + 7dc7ec1d8bc2b67ff5f833eee5ab71f7 + fc34f37439ecb641f1544ae10edc0993 + 011b5cd3cb302e277bb32b64a2946986 + 8ad002418b478fb294635256cd9648e9 + 6bb3df45292667d1af28bd958979fa7d + e9a55b6c621b296f08c14b226fe3b205 + 886048d0558e9c6bd41520e765ad5842 + 636c98ec540f944997c0f5d54fb10f8e + f582fe0256709ebb49c84fcaabf3ed10 + 09bd47fced4096cc8c2956271148475f + e096a29291e6be10d8861a5eeecdbbd5 + 0bc61114711dee20a4b30b453c19776e + 5dd5278b0f03e853ae691310f31fa8a1 + 1cfcdccabb532157cf474fa09e0e24ee + 6d02e68d3192f4817c902f41d7e39c31 + ccfb17e88dbcf1e2b7833e34c25c5426 + fb61bd7670e1d6b874a6bd52c72ec25d + a219b133f279740dcf5b64908c8d0eaa + 19f104fd974c7c16c194a1229354dd73 + + + 9d3d71a1b37a5b1dc68a8e9b2e4fbaa9 + 299eeb62ccb0436c2729c0650b001dd8 + 8585343caa9314a70313eccc3aa5c474 + 31eb53e8071efc209773d83734b3755d + aed26517630a256b382543365d7010bb + e6961b52a1564777761ce6d409cfa18c + 5788afd825f3cc2e1dea569645fd7fa0 + 21496eef5067df4342c1eefcf0430ae0 + 340db8a9638e774deafbb8b17a190d0e + c8fab50b012f3cc1e06d563d343f2898 + 522ab6a62f2feff0f03ac26e1453a1d7 + e9d3bc6efe79b41ae2532316b6d0f1f9 + 366b8e097dc80358661094e015441cb5 + 9557ccaf6f2dbff57dd6095198614f25 + bdd9cbaf1bc2d057dfe476d3d577372c + 092aebb46c2dd8fa9bf5247b2f67537d + c462461df6c3faa91e0928e6bd873dd3 + 023e1cb67fed919729ec92f57160175b + + + 71c35e02443c03b019480c76f23fc1e9 + + + + + + dd940d0d55a4ada4f98efed89d0f2813 + + + c5f8acd0940668fddece7878aaea11a2 + + + 2ac256980843eab5c50fb1379a5a3b2e + + + 1bae1ce1c2657cbfc1a359f9542eef75 + + + ac356314aea01e14e593b1cfba898e01 + + 33df5332f928f065224a130dc676785b + + a6cc2e59548481f042f116c9aaf2cdea + d4cf49c0675ea764c87db73b606dc53a + + + 5b91995409746f74e3bb50909a646302 + + + 0987c92b5c06c558f04c9065f0ce065b + + + + 74f14f25041b673785b26ad693d6ef97 + + c432981b374579d84f77a5584dd4e8d6 + + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 96cdad712b6e868e5032bc6c815e7bc0 + fdea000b09a1c1bb605cb79972459734 + c68c72b41356bb014efb15f49ae17854 + c0e62d167b69b398cc358796e82cc193 + ff37513da4bc29b6ce3b62f901a2e2a7 + e2b42aff8cfdc5a04088f412a0b092f1 + + + 2b99956a19dda0192f536a9a31e71998 + + + + 2264c408c65eb511c7ab66a642241eb3 + + e02bbecf3f1e64783bcd586a84e67fb0 + + + + 033b1eb48018af28ea0b3f5e371771d3 + + + b51949a61b13edb665937ca2662cba2a + 083e2aa6b5a200557741d9157852ae5d + e68d10b52597f0cbdf2d86756340b6b6 + + + + + + c9e66329762c070db2b46307d60ccff5 + f56affabdede369bf62bbf2f34b52885 + 3b036ceafe4edb2bb71f285185fa3006 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 93fe4ea6e7a43a3dce6045642eb5a067 + ec011124ab0d168a04fe380a57a2a518 + 19b855628af4a37c3712310ec6fc7749 + + + 5dde53a0733a631840eb38e65f2eef41 + + 78f07bc76d50aaed37298649cf34d4e3 + d12a2b441ceabc9f800a549eab8cbe56 + + + 648560db23e0085f6d9d05dc872b5ae9 + fc21243584ec30227b321f976d70d0ff + 6c4e641baf9462c6e8a65a11f99f89ba + + + 8e360a426b39628dffd46cdb6d2b0d7c + 6b1ff1f1cf1821f5ad764c1dcd517a89 + + ab7c87ab501065d04dac5f8455119a7f + d683d198bf8b8d7acc578214978c8210 + ad4578a5bab2d342ddd1df68f8951276 + + + 7fdcfb03e6685f5d73128771c38df3ef + 512b05007a8b08a0dc0364cc19e39559 + 7239119766d282ebd2755ee5e1203b3e + f0211d42644e1579e3adcc674e49d3df + + 27e708ad63569be4e13c8fc5a17972c1 + 42846045e0acd1e3215b119ca6bec3ea + 9ae2ca71488217874b0e2990dd24c975 + 1faf110c23319bf8ac73b0cae9ce9cf8 + 674161380f4d60d0b3d66a40f9e56e52 + + + f94d5ee81eabcdb23d6e3d0c597a79bf + + b841cf0d948d6790f41e9a7dfbb299e1 + 7419b9c86a07d759bb0fc3bebcbb912f + eb753548f9d4e4fca024c9af37212633 + 69f474feec8e4acdc5c6f11f1a176b70 + 3cba2a756553ea4acb2fd830d547b4b1 + 91b853af8d18d062f7b36e72a8a5997d + + 4d7ce4cbbb759c13fb26172045d3bfc3 + c232b21be2ea7df026228b155d2afe26 + 2e08d4dc5cc4b49cef225c262260307a + 585eec296ad4336f3e6c91a8cda77a69 + 2c2b2f3ec46d3ac0f21072845b88bebb + f3eb7b9e550d08f44d0c218ce4ab7d76 + + + + 3909abf6eb95bd2541cf0f5f226785ee + + ea719dc76f79ee86914c234578bcdc12 + + f4aec959e4eb02f4270fd8b44142f763 + 536ebc8b9a02f79d45aecc56cf4de489 + 65e9e460a88cf26b3cb5987ce3080049 + d924900ab936fe28b5665307d6343859 + 40cf14191ed67f0270aab0933f51ec06 + a452423ab211521f89c532578fa50028 + 94e5eef75e3497e1d53c368bb011315f + 394b20066f8c8f4cbf959854c947eb89 + 4c7754f2d9e063050ecdc7576d4a3ea1 + 26f65a1125f88d83fdf613c01d21a277 + 29f78564389d45ecf80295f8e1f3691b + a61681f994010c01817ac637f860ba71 + 2b268d244311473b159a1954e1be4438 + f7508f83d58874db5c486ff8d98a0bb6 + 0c0f25e12f3c7a784dc1035117b3be2a + 0b23f37296731bb8d7209e72ea48fe48 + ce9f8c28fc946de6ccca286f24d6633f + e0cc1c674cb3012ca30023c57fd0fa1e + f9bbcbf11b8306e24b2ae0ef14812db4 + + + c078ec9a1eb3549e27e7a26e54b9ebd6 + 76813cbf901c614902695977be0d27f5 + + + ac1ff7ba301e6a3ef5a32e683e273d54 + d09a183964ec1cff23655879ebc2fccf + 2a0fa29c0695ed19e2b860a1f8419d04 + 806362fcd430a19245cfe92914bb39b3 + 04a231304fc32267a139b2ae00328ab6 + 486ccf2dbd62227db463ce59550e1e53 + 4addb63397e43013eb8232496785bb73 + fc758627413cd6685190e902a00dac11 + 11b255b3f8a37680b09e24372edd1a67 + 76097492512c29e15ac3991a3a501e77 + 89ea98292fb633657d0ba6575f4ab40b + 33797639f7e6d1f2d77bbb4fc27efaee + 7616d98e0a468be21db9caf8be4f1214 + 7cb303411d79128221071e30cb9c2fac + + + + 838b8e137b2ab38dfd676a54d200b84e + c217623c79e96fda26a6b47ab90b7b36 + cd2c9cf1b81747605135f60b50f4e757 + afd0198c92aa71d1e28f5a9b2c48e521 + a17dea97e11b52e0768b7d3ea3ee5c27 + 535d3d79774df43b1d06a36cbfd5a881 + 9411232cd0995e04e8de37ffeaf08c5f + 37fa687e321af4e5946167486f7285b2 + 1894892993f09a58298213c1985c7899 + 51b80b0014ca43546dac90ada1cff23b + d78fdc59ed03451d07370f2c3f6c82d8 + 02b8e6e44d4258cceff2edcf2de835c9 + 2a0b99d2e57be2b466adb98ffae97417 + 453d8d074b21137af0e67ef2e18a0cf7 + 4fcde3fc06772a4228dd7ccff9b5fa87 + 19c33763a064d6dd821af3ce192db67b + dc8d7a3cfa594192d5cda7528d713396 + 360c2e3194d27b7d7412a0d9c1e6dee1 + 3727a3a4f497f8df7d0777efad0e6823 + bdbc123d770ef7f715cc6f7fd664c0f5 + 227179841f01846a93f8b60406d0d9a0 + afc54b3314863e2027b86fc6e1943f33 + 42fb316ee880a3a413a0550914dc2c93 + 96b68d746b491ed6f643396abd634472 + 797cc3bd97cdd999cb7322508dbf8cc4 + 112593d4e9bc9864fcba3f644570055a + fdd5c61b28fa82b867250a6613e7ee9d + a5282ad54d23756363345d91c9ac32d5 + + + 6fd14f47b58fb6f9816ea95be0253dae + 41d8b90efcb3bea24945fb54acefc7f9 + 35e03f264ac0c3e1ffa290ac6b6c8b50 + e3960b52dc6d636f8d231e7ff5a0bd7d + be3c9df6e54ff18d798d0d856016f271 + 1ef901dfa588a5b6d85b9a1ed7109bac + 4c7e4fa47788ca66ff94c31cba383ae4 + cf341fd4ed4091c9baeda9af01e7561f + 7ebd63ddcadb9ca383282a4d81279568 + f8647397c09d8b5fea73e5b72a5637e7 + d3b43ae0affffe73d5efef2531e4467b + 026f369849825ad15d82041c75350473 + 5de52f8dcaa4cc90b133c52a77c09e1a + 98468519097519e0d4fa51db6a9933f7 + 94beb44359634ea110c64039356bd5c0 + 7b9e9d1d8cfe666b6057aed5e04b83f5 + 82af12fdbcbd03dea8fc15dec10fb2a2 + aad03c047c56c4cfd79a94b0d0f1741c + a356a8469f9e590b5b84a80f95ca8c14 + 33ed143f792772cdab9b46dcfae984b0 + + + 7a30b60f372d3579463c37a626263688 + + da67ab15fe044c4e689a99ba1797fb22 + + 4027174da12af17a3fd5f73755738361 + 28cf55f7637001f3c19166bb9eac0d66 + + b0bde9404917f3d25117c4879401042d + + + 7f25e9529bcb406a01e3856a6753bf4c + cd166e225bf024700e46914607040f42 + 1ea53ee37701c487d4920f883e48cc01 + 48fdc9f84d9f324750bbca93eb9d24a9 + 239a62103da0498d6cb1e89cc4d7bc9f + 6ab0f78725f3ad372eb5eceeb1f0ed05 + 29370503d10e669e1e6d6920a12f9534 + 769d8d4137875010578cad86b3dc72ac + 94db4f8ba6c54fc299915dcb9d15f48f + 65791c45fb9f93eb4f558c4439d96967 + f7f9ccfa54b56f9d27caa87347f2dbc1 + 443f5022cdfd27d77c537cb3598ebf1a + af4f677acd4e9c6793606c4ba46d55ca + + 7492a1524c319588349955d20d0ae2c2 + c5ced196b2bc195e9b9ef4cf38019d44 + 6431b7578271edd477b6cbce54d1b0a0 + ed40e8c563be12ce7fdbf5113adea63e + + + 3b7f8ad9d546db9b8add64794c4413e4 + + 9babcc5f0367abddc9a081ae3a92918a + + + + 272f5b10737a621697301cef1fd00c34 + 03276dc89dca3856b642091121781aa7 + b52382287fd5a64b85c707f0841c797d + 450ce1f75995d3855e2890174cad81c9 + + + 03ca66795cd12fdb9d39b41825906973 + f2002a4177d860d4b3763db043f9776f + 5d889368e4bd7b30ea2179f77d82816f + + + + + + 565482b47ad54f50794890243d517198 + 9affd828e7b937fa5dab9348a1c106c3 + + + + + 199f5fc8858ff6ba24e9a1927a436a1f + 3f41e3c6878caa34053b0df735fd06d4 + + + + + + + + + + 0a6020428498f5d43bdd1871bdfe5fff + 88f045e809ca7fb0c18dfdbb7bbedbfc + + + + + + + b4809859bdbb243d35edfa3da736c859 + 133c40a5d435bb2607fcaba19a177e92 + + + + + + + + + 83f27620b7ba2c11696bdf11716d223d + + + + 03276dc89dca3856b642091121781aa7 + + + + + ea775929d42f58af393b4f224c59b1c9 + c718b10e49ff27e12c0674e674e85a6b + 6ea7e288f1a6c11ad35be1011275cf49 + 8ef7cffef91e8e201e25b522b2ef97e9 + 06eaa5b48155c2841e089c42b795a742 + f6d6d69da53085f34b2363d23081783f + f925be736833be1a46dcb4878537cfe3 + d1a43cd2eb1d650a46793b4324717801 + 676dc682573657553221b8997da6fe5f + 42720b7cadf6ae2ca27d77c8a00662e7 + 11d7248a045bb31ed03409f379b450e6 + + + 669a66483c0b6c6d301928afdc9c4e4f + aeee9ce597b5897fa7b334ef5bad4803 + 6753f059d70506adde2aac3e2ff1c0c5 + a138b5404fa1daff56ce34865f8863d8 + cbc12dc5d4a88962c52599be631f7491 + 004debf153631e65aa55a6a595f5e859 + 0bd20d6bd956d80ab403aab7ec1692d3 + 2a256ea248af6a96d121da2e6fb6fe10 + + + f7037244d76da1670a0b6ab35980d735 + 7017318cc8fb7cb1b43f1f7caf023e5b + 0e1341c26bd5098d0666416a99328602 + + + 7ec330e5918e68855ea1928650677c2e + 8d6f9450b4d45d80d880d449c0f8ec73 + 2ccc8e12aac56ba8a19cc5749f4ddef6 + 092caf7c7dda0fd29b6a4eb94e16e8c7 + + + 14a87e5a8699b57391eff2c94f576c18 + ed2a4f5ef1c5a5b94181d4caff23caff + 43c84f5dcf75beec1d21efa12d74d135 + + + + + e85a0c52a4381199ded8fca8e42c1875 + 7839cd8c5550658fbc5dd8f50db33db4 + + + 9c0b9aefd4284a57d7f649b8cde024c5 + 80ffae60899e48b99924c3a907d38255 + + + + + 89c3f524e25d5abff91ddae0a9aa39f8 + 44d59b6bdb3555587a3be549beb19451 + + + 3a0c0cab70920049cf7c910659bbdddb + 59093638625c5324d12879437e82ac23 + + + + + + + + c3ff0020d627887437102f59aaa6d5a0 + 1234b8d86aed91dae669333ff5ae887f + + + + + cbe4fddcef55d82678ce042506df312e + 16acd0ac1810324ade58e7f527b11721 + + + + + + + 64b36c967661286fb774e010be84b5fc + 7171280695f683129338bbc9127e8a5b + + + + + 8c8934c39f7727374b802bea9c0892eb + d01e56d7432f31c185ea81acd0c3e43e + + + + + + 9ae20fdc4637fd252d0b9c2bea7610a9 + 5de0e8face7a7b8fa9dfcc239c7d5cdd + 5c3def04fd695112854679459eec55c3 + b9a32d61a75dcc45e129bd31f97c6dd8 + cffcea854aab49e182f4216dd0322791 + 439f18e59d963c281150e47387e575e9 + + + ca49b45cf39a415ea45d8dce59362f2f + + + + 4bc49eb260c97d801f0c924b3cbb9e83 + + + 7f38452cd551fb2149367bc6b11329e2 + + + f8188170d810646eafce22ad6458c37c + + + fe464b289785a184fb96897588e17915 + + + + 22c1ff3bd402ac54f7663e249ee27265 + + + 97b2502dff93822fa21a08bf4b9ee36e + + + bcdc2c03a6a44c540dd7cafd09521a2c + + + + + + fa61c550491c29a398629a1e0cd6cd8a + 52dd4163a317554e8c50e1f801fef3ae + + + + 06b910b256436adb1d0ad52b1567232d + 7282390a271e964c04de7aba143e0b2f + + 7ece1f71748bb99d7db5cf6daa2b048a + c565a17d2d8ef32563eff746bda5b0a4 + f6a1fbd007ba9768c11ee479173997de + 9ff9131becb672c43044ea002f055ab6 + + c69663a53a53bf82ec9294388fea0a96 + 137e76211ba4a7f8bc863d4981f650e5 + a0c4892befe1a770fbfae0e9c22f87e9 + 631261766e9ae1fcd0c3a928cc183857 + + c98a7b285993e64bb76e0948a0c41468 + f94d5ee81eabcdb23d6e3d0c597a79bf + 4e61d8e42bd8981f8e7eb89f89b2fe15 + 6ee62cdb5ee57adbd2719b8f2434edf7 + 23a6d2988ec9a92db1e802ec41e4044b + b6f043a132ed9cf1b687514ca154671d + 96ec3946a5b0e1e83d5398a73b58f129 + cb4ecc04b851afad87248d34c1f90a13 + + + + 3d215c9c749c6e95b85967ea61fe52e9 + 59c5c886c2d0230703a6a8ebc47541af + 4547a135f9082eb3776d4efae904acfb + + b5628897a0376a8d05996ab5c8a95a20 + + da433933d92a92a3ca94658eb70ef928 + + b45f215d9ed2454278f31b1ea563c84b + 28005efcd30fbfea83651cb46095d82c + 52ac35d754e31a9655e0468bd82b4691 + 7e3ce95c9f4ce4f193d7d6972dd89b1a + 294bef9b9c06bc9506529b58ffbd90c3 + 4ad0a7ab57b446d20289110f271f4f74 + 74ed3c28e5fc98b8be1700e7bdaa8952 + c14aa955e8e91ec9878e3aa049fd6be2 + 54af16129a73bd00362e29d4ddb7fe9c + 0de24b6c3b0846189e0e7140340e4c20 + 8857cb48e2ba81f9ac87d906cdff6828 + 699cc7ca8359ddcafa7f356fc11b10c4 + d18c36d2801adf82ecd8531ee6462bc8 + ac0c2fa723bcff1d75ea9d9fc799581a + 60cdafbd23a7cfe8082e9a05131ed580 + ea6a82bed9a7bfe2f7c7e4bded4ba25e + ca6ba217b9a3b3978ae68d44dafd4dce + + + b1691ae7517bdd9a85fe555a7a64aa6b + 5c95c8eb1975d9a036aa6939fc44a0b5 + + + ede2ab4177afff995069bc54c4517f9e + aeb2ca3c7e035486a4ccebeac363125c + 4dc25832f90b656b88da8ac50789784a + 55c97aa4e81643f04c3abd943cc29a24 + ca9a5001026ebe62aeb4a1c526a2c804 + e2a12d6760feb9f7c96d61e502f68b2c + 663baaeb8e61e07fa5a9ad4274686d53 + + dd831154f5680268d220b06775f6cef5 + 8e5971796f859b29f2c55a34618ab69a + 89e821d08b7f28e13db17745002c470f + ef44def01e8a4abfa4eaabdab44a3e1e + 5764466468602e28e6d7984f2d98fc47 + 04438248294f8cf792c24dfa53ac6d4b + 3688b3a1cfac72dd7fdc8f4914ebe49c + eeb81098cc85243315c4fa6a0ef1a1b9 + bc57cf9942821b13079bac6dca600c84 + bb8020e2716ab0c7b92e9b55653a0668 + 80e3812e108f0f457e26513c6d78819b + 2715dbdacacd877e377fbdbd4ad1ec90 + 6571c46601680adffbed9908cbe51c66 + + + fabd34daa27b79c16779aa0a07cdd90f + + + 3625210cf4cbeed3124707c8b73598cd + dde80538d4dd27a8f0f4fb88c01526d9 + 17388bdea5b2b9a63acee19a51280c8f + b5b88cd457cd2722513763f34d91181f + 3da2f81ff06720fa7f827371bd36d5f9 + c0fdece3f10f461bd4ccebe29c4f56b4 + e495cebddaac463a5a08192417961cdc + + + 182c6d071405c824a0d20bd891771ccd + bab7f891635448000f1fbeada661d515 + 992a96bb2cfdca2d12e68b5060d8e93f + ea8274f82f3b50b5ef2b599dedebdd02 + d4dea591f80cf17908a7a9405ff0fdf8 + 1269051a0e1ad5008dd3f842dc136c6b + 1933e5a232fdb0e37e43b7b217f9a0c7 + bccbe98efa27aac7c1cb46d35997f9b9 + 553637fb67a78ceb5b66f25260e45447 + 054e7df913aa38537e01c9e822f5276c + + + f025beb5d1976045c233aecc7eb45c95 + + + 4e2872c5b12a08af98191115237f0dde + 0eeb8c999b2edfecc0a7e3b033433a8f + 6f7d86cd9f7f9947bc6dafc5892e2124 + 9fb9595d0095fb3131b91cac9d72249f + 05130f64c2b57fe661eaf5c8c3b63105 + e9156eecf5847c0b8e6e20853fb4f4c8 + ef8a4799d3251ada6d6a095030b6780a + + df0da9ed8dbeab83ed2f8d6598fcc72c + + 722a98eb59fc79db411e1c3659522bc1 + c1d4f37837ecda10913e71681d58af41 + + abe76171f24494a5c0bd03def8516291 + 76dcbcf4d5837ff3605e58de1e7e9250 + e3318e91888effd6f62f5312cca645f0 + e9fa380368e5f46eebf97626f04974a0 + 510599114df7c031b9869bf8ae59bb62 + 0785b4c34bca9e9fe5f98e08b015f291 + 23a570866bfb6861eb65e9c5ab4f2f41 + 49190d2833232dde561d76ed47f6a4ac + 16ddbab631ec4589301f97e35858e78e + + + 64341d5561cd1abcbc1f0a988fd281fb + + + e2a0ed289a997901650ea54360da45fa + + + + d41d8cd98f00b204e9800998ecf8427e + + + 4767dc642f98612d52d918fdd1905317 + 9cc5c13567e6ec59defb3fab764a0b0d + edbc0b6816b29ff28b2d262726d84be7 + + + 8dc1ff017e89329cc5dbd3e1746ff499 + + + d41d8cd98f00b204e9800998ecf8427e + 5527ef0a29820ff2870e0749cd38c297 + 1ffa211272544831555c45f701a9e523 + 9faea03761cbb774e569e0ddc15118a2 + 0b3c991715906416d884a53869b71210 + 57e37ff0b94a2574fe00e18efbc92a4c + + 483aab4260cc1ddad1b83e29d66c0a55 + + 36295657ec79c72b6401c6469bc15840 + d41d8cd98f00b204e9800998ecf8427e + + ac9ee03c32e8bdc30d8b56ca50a33f7d + 4303785f2d24504a2e1554e1f4508f01 + 9f741e325196efe97eb6eb3e5e95e6e8 + d41d8cd98f00b204e9800998ecf8427e + + + c724b84bf75ff772e5a9bc062f6826af + 107839efaa6f4147b58119cfabeb03a5 + 5e23a9b61a2f4714077c1b7480ca869c + acc1f53a6d1870b2e7e19c143fb0645f + + + 203ba49bce2ed68a2fc413806df6d39e + adf1fff45ac8efa3f50c1081b551f6c0 + 1bd341fbc9ccc8804e0e056fc4b8a9db + c6bedabbd7467c87c17c13d469d64f06 + 14b589a88e2a8c6ed27ebe10421260a1 + 776208b90554e407cccaefaf812cb9b0 + afcc58a1afede7c75b229de93a57c33e + 5364d3fc48fbd474b458c2815e17aafa + + + 10850986f6b8d40deeb9cda7fca3c1a0 + + a5788c7d8d8cd9a92e33881ba4575244 + 3b081211a4c1cd67509d8d4106c6edc5 + e55613cf319a4a2f00911c127a50c0c0 + + + 4057e97e83f4fb5652e57ab1a8357d23 + + 5e59ba4a6928f916a7a117c4b85273c9 + af7c61a92680bb77b68d5cdc41467af6 + + + f94d5ee81eabcdb23d6e3d0c597a79bf + 844fe872deb7a120f6a594f6bc8a387e + 8cb4598efe8562559c283caff55c736a + f2b05814714496cd73ed6625e0eb216d + 95072edca2bbab4a5bb8b93df468dffa + 3252cdee36a5a579db19bf011e1e9c55 + 3a0fec860ef55db2c11e03d77fa9b8e4 + 7368b2643ba3f660bdd3768daec52eb4 + 4577633e1776d1af48e2d91259ac9389 + + + 7883f142480d1ed02f173ca0d48b6ebb + + 0fa67c1895a409c0bd95204ace296a05 + e1b32ba456550df0cfa3a34efd3bada9 + 134cc4ce4138c16bf2add0b5dfabbf8c + e681c66e069b48c903fa3ffb33f9fb79 + + + eaa55378bd4df45056582adbf80e1288 + 02b86bdb7cc08bd8f1b19df86648355d + d625337c20f955c33d49ca3f78e61931 + + + b7ccdaa2c0f1f29ef30cc3a67504b14e + + + a647bd25ae92b86bf707916c0b546ded + 30458619f76070efa61fc171cfc7d03e + 41b60c8fc9cf1f01108ba611cf021791 + 26c13169c27fbae253728a54c5cebda6 + 4bdc63450157be47d0f2dda5de5de675 + 59656dda5e02a2d28012cb39194752ff + 97dc8bb98f1e3b099d9310cf0abd02e2 + + + 44e02b0b4064120d43fcf762a80d7331 + f3ce6eeddf06c19c0d20205e999325bf + f8494261e2ef1ad50289b84057e70683 + f5a2681c657d42447c8743d4870767c8 + 6fa46cdc5bcba6b009dde8f1972acb63 + + + c77589f51df8248b65ab5cdc574b78f4 + + + 122a1cd5029afd67898c732fc2610bd0 + cf67e27e3f919260b361fb8a4bc58856 + 3f4d7fcc0aa020908f33c9d24cfa9d2d + 9868691cee0e1dcfbf310d173beb6de0 + 8f18c545f205cf290a71d3c0ef204590 + b40182e1f39fe54967b0d5cfa41215e9 + + + 4490d4fe71eb5b26960020053e98e600 + 9dd75cf3eff5cb6f0a617c4c00b76c12 + baa0fbcb3e20fbd4eec7de239cff57a6 + 07d715dcd065cba35af73367a670de34 + 2a1b26853c8420c301efed96101d635f + + + cb536ed1af007ddd5d330678eb831a19 + a2afd82e7968702b7f2f5991d337a69a + 04c7a29ff996632cbe230ed5983c519b + 4719e69ce582f00fe9b7a7a2e3190dcc + fed006372c21d48ff501d912ae80e21e + 901566539276c8ad859f9cd26cb6362c + 544f4ad6bd6dbbe9060ff4c574f4d02f + 6c3b34e00148ee2b7aa7ec391d1fd378 + fe5985d975d93ac5e2c8fb2891db79b3 + b56e86799489901b8c9baa7b30ec812a + 19cb06d1bab526deb4bfe5337e249c25 + a31e7639fbd956c95725ec4056c94604 + 6e6b4c7471db9591d5cfefa1ed9c6579 + 3f980aa18fdc4b4969710e332c4171bc + 0690b5b1bd8aef6bce84ad74989cb090 + a1fee8359b02e5a770673c16c1814d6b + + + 3ac506264804637412d022becbac10bd + f3f721c743e628826da1d219c742d8b4 + 2346d7973ba8eefe993d0632b43bf958 + 9f8bebecf165f7cc695475902ebd0558 + ed6ea984252bbdc7bd4f1a3d427d06ba + 9658d958f6fb84f2317dfff250f3bf51 + 6c71b060158d32751459e2a1c6dcd012 + 48eb6030998ecc4ba1a833254ccbee13 + 4c08f60b7339b76791a0c8dd8be57152 + f3efb00fdb4933e77bb967ba34792ced + + + ca036c1f7f8182af8fbf6e534b7264d6 + + + 8071da84ab20b3a7906071e623998c1f + 4d0821f5a9e2aa32648964a15c85038f + 868eb3c5ffa11b709dd63277b795b620 + 951b8fcf4145a3158b6e5f108ffa59b8 + 97155e6f796a73852969a80cbcc0b982 + b734d738a0f4b47c29c29f49323937b7 + a2e01822aba030020f22ee6899f1bf2a + + + 6f63007daefd44122a547e814ca4fd26 + 02393483f43936ca18a55be032893179 + 0f8c0fc868c40f307d5120faf4776185 + + + + 3613d8d83b78ce3561680a447eb6a24a + + + + 31262087d6fe114467a9ce3535253758 + d26a9557e06a4758d15a0949100fcecf + 28eb0c86efb79af64f83584876645cfe + + + 4932f6c6420f19b49164c19f8627c6ed + f67b2721aa9eb28d5b985f847bde5f38 + + + + 4f413b7f7493d4f42cff56b0f5956fb8 + ef87b8c463a055cfc838de615e849339 + + 17f829eb63f6d8d62376ca6d35f69fcf + + 9d072a5e322885dbb2044f641e7564ff + 796b0ee97759385503ab493731cbdae3 + 809273427f4087ed32687ec75ad8f58c + 14589c90bef056b1dfa8e84b557e647d + + + 6c4a17db2052bd325662eafc2f428e2f + + + 4d4740849e1851e84fa3b9e833335f82 + aa6b0e47cc2693587024ee3d9b2efc6c + 8ff2309558481974e28593abd4cbd60a + bf12e08de3a55bb8e1555ed46f8642e5 + aa16ff0d41da3bd6dfc3fd78b3c7f98c + 6ef756ab585c66afba1e68d12d20a5b4 + c593b44590a03a6c25555530ab743e2b + + + d08e179ac619fa26a0791c7d9c2de6fd + + + 8c91b697596ccf87b48c58ecbae02aa6 + + + + 73356cd80d1658f8b4120ab6dc64c17f + 676d00d07c7feeb94ab8e7f178e5bc9e + f7d030e07fde8dabd404bb7c8ebbc115 + d7045f1215cd897d17d97d65e4179715 + 40b0feb0536aeff5bd0b525cf334c808 + a2bae310fe52725ae301917ad5ee6ed7 + b51aad612049b687de3e8732f609138c + 939e5b81ce1d7a840793827726be95d1 + 72bded045a5334d18f4308f1a42dfef5 + 1cb02c04119f7a86ed86ae1f5452f927 + 5473f14c2d1481edf849807df0b312c8 + 1363056122b733ac91fd414d8204cb00 + bc398f0669a27c5f3b1b2402fb6d7a3f + 5957411d6ed117d2d4fe4d9d6a9edda2 + 038d3996694ede1785e1bf1cc1813eef + 143c83e2b3116555e8e1ffb9467277d4 + df46b5afe83cda04bfb5a81d53c3c551 + a01fba035b04a4270d375bafe5986f7d + b39d3895c60b53c6a5e14295c88d689b + + + 7ad00591397bc57e93816b897c39a574 + 562c40743bbc79c756c5665fcc0659e8 + b2312b734a4906c87a2e57ae9b76500e + 43d2958c71252d8216d1629db86a59e7 + 421162dd985fd8b92ccc80162151059c + 6ab7b6f6eeeb2f9dce941f85ee868738 + 544d3da4e6d1930e66252c5753a98002 + d7db01818d72dc596905b2137ee230dd + d2e393326dddbe1622d406a88ceac136 + 79fe9e84a604e18c1b0680301bb050aa + 6804547751318438fed18f6af9939f28 + eff530e57a078f3a7bc1c82498e9e639 + 0ded7ce745f8dbf0d837311b64356ad1 + 5b651633113498344277dacfede48f96 + 073a0b3621db700741fcf3288c205f76 + 2e0324d78ec8e574240400499e5be1eb + 93c30dff986d9a01f53faa46d62dd64e + 4a0261f58b7c27fa8fca5fdd143bd523 + 4e7c3700c2108836e10132b12b0c99be + + + + 7ac1814f8fa8049f9be6eb143ab2b0b7 + 47268ff88a538a7d9de67f24ee06b795 + a856c4c0e7a21895a75fccd1f7ad9652 + cf9890033c9b3296c3f0a84ad7a40f26 + 9007094384ff823297fd160e60b8dd51 + b667e491754a58d18e2ad2dacf5e64db + 59f93252d5a4a61c98c80517d69020f0 + ab33a181019dd14b892e920906a83e41 + ad9f550cbdd67e7bda7bfb78ebbc4d57 + 4cef70f2aefb1003fa4de7d170a01d67 + d1ccbc21759a3a9fbf5c8540d9083f47 + ff88d7f3d100867ba7004ddc222d1e1f + 2441944e792817317e54ca3e6bf3478a + 395c992f62cbc0e68ab13f521991a20f + fa84d103905891e8759bdb446ce7a0c9 + 8455d9b680b22545548e354a5da280aa + 1179f420080bda166cbe6fc7994cf41f + 732625b8bef91e2b6e5e42b135714673 + d39ef02611242867b06f048eeb7e0552 + 95e729693c5e33843eff7dc3d2b0c8f7 + 960e79c93c46361c3bd250b5fe73d25b + af234ab246fb5566b1c513ed9c79e1ba + 1c11c3a7ee176a9949708e7fbd0cd1ce + 03c26e03d37111c54ce5498fb9d6da28 + c82640f43403f0fbb6f133e3ffcde2ca + 81b2b167dbbee9eb6ea2705fca70eaeb + 9b6e82b9b61a55fb21399b48016a98fc + 0518dd3746286bcb3c208d264a7f6af8 + 191eebd708146f79aaaf9d2f5d74f69e + 6c33fa9677081837f42b0bea6fd97376 + 46f571507519842991ae002aac860541 + ef40d1310b6e9136f0937797e32a26a4 + 5f1aae35cfa7081672d605b8fd0a5006 + d41d8cd98f00b204e9800998ecf8427e + f9609d716f084c27fa115042416739d9 + 9e289cb0a40e69be03409c52a7773884 + 8df6520864473a8867d7761b2c4d8ba7 + 5f9f3d0ceead8eeac61c0d97df3e45e2 + ddcc177c9c7857fb1a3120164276b306 + ee4b87ca024958430993f88aec508793 + 5bb7afd8d7266c4b53acdd0ba4bc87ce + 175123c2bfa0575853b0716bd054f6e6 + e918d7c086b71f06425bf0afe117a7fc + d41d8cd98f00b204e9800998ecf8427e + 7423e9c462bbdb775d5cb6d974b889bc + e4893313a1339cc8e4eaa776ff0f4993 + fe8e004e9920457fa367c25124138d37 + 29eff56a5bc00e52e6795ede51ad0c53 + 848b96064dd7a9cf4d6b636160a289c0 + 274608235d00d5a515f433a7bafffffe + 4b7a70a244cb4e29ea5dab2495235626 + 7ed3d573b99cf3a83400bf256b0b1edd + 5c648f8bd84f4b9f7e9b87f9b94ed5f9 + 97065e4ad26ac90de630f7a2c74bf07e + 89d04803f4af95003dc4bb27997f45bc + 25fe80eab8e4756f9d3edbcf90fdd47b + fe08b7926f1fdf9bec85f002d3449613 + 9b579330d0d49deab93f529dd9f13e44 + cb827ac9aecc15b6592f8c153317b31d + a676da66587da342a4f42b495b7af288 + ef89a6acf9c4e4f8724920aab9e29f90 + 8cc5fb2423de05174de9b6c12981f62d + a65efcdc0c49a91c47570716ead66b0b + 0f9b0e235ebf8e89be582118069ba3f4 + 5f03b0b4eebc4be9c2344c1228d42404 + c9ebbc013a3c1a6478db03fcf9c82c77 + 46cc3964cde18f636cc7893081852787 + 4804e395060456a3b5fa70c6fd3a7f03 + 074956493fdc475f7d4a3c1981d40aa3 + f1246fe616b6ef7ea2426e0e733e9270 + 920eb86f94d037b6c65d3191d29e1ba0 + 228e6191d23b3c65e23d6345391ef1e0 + 9892f59ea6ec95097fcb167bfc406f9e + ee0404c586e82c63badf2c7a04899282 + cffd28b5b32ce643b016bda776dd8e95 + 38be053ea0317f8a2fb076ab4a86885f + c79e50a89282e2ea544e1742f9c64778 + 0c308f004edf7c0b6aaec03f028e8747 + a747ae989c89cbff1df48d301d69ff9a + 74e30367ff6679a5756d29fb343d431e + 777f447ff1d2c50da3f0b085c721d358 + 8d70bcbc782721f26e0eb4c8ac979e76 + 57a965ef131103e13d8befdb1a0e8465 + 4b5eacb65951dd1047832992de231669 + 6f3438f57a4e0d55c3d782bd9436962b + 333fc941a35a3f759c2bfae847f134fc + e303a8be4784e0320995f745f2693b48 + 0c82f365ed35d747d04b679c31d6432c + 1b8a0ec92c4d16b799f59c202f4281e7 + e705734816ca2356857d0739206f6343 + ef920e37e8e99b59e7a7fa438e938b7c + 33460317af083ca96c82eae7b206cb19 + c409f073d1a760445d7c692bf6668848 + c7759de3fcd0263d72d1fad2390dc914 + 7b6dfef72f61d2ef20b045fe8136c72e + 537fcd0791fbc6d4068152921dba8a76 + 98df0e02f0da3623148df1adbcc6ed21 + 5690ad236c556773b1d354bd35b6403f + cb791b9d0ffb3395f18c7fb4564cde63 + 3decd69ce91cd4cf604cb18be174a13a + 9b790a2918f9a82e0b94d73ed7f2f448 + 0697b8ebf61beeb394137f0e9e8f99e0 + 521fa6aadef14833b45d066efbd46af6 + dedde9d9d370dfd1645ccf3d604b7f88 + e0debe8991beeef16d94dde873120354 + aa65b5d7a311cb02883e0c4b666043fa + b38cfb4eaeb6da61d21d0921469abaff + e61044075da1be518b3ed38b469a6713 + f8fe2f6831e75f5abaf7ee696364be94 + 2972de98b47235d375e0d7e9904ef3b6 + 5f987447ce6d6ed013cfca71b7096421 + d31a4d16c99e2e2f7a2052f0a3b51000 + 92b561598e1ef68df81dab5abcb82114 + e61044075da1be518b3ed38b469a6713 + 6e62d9ba3d0de778c76090c9a127554f + a9e0e59a6edd8d29944a48d25f8167bb + + + 082cefab800aa80a25cce80fa34db5c5 + a47a6653096b412273c9ed05f0285333 + 5ebf06cb0ce4babe0d92e3805a10414e + + + a87f219d6485476fa33036557713cbd0 + c78a3901b01e217626b8ca298a2781ea + 846fdced099be1bd0e30dddc96343e78 + b2465fe3baef148ed7bb543563ff43ba + ae8b19bd05f188f085a3288993c3f367 + 925f9f61dec19a1392d2ef00c156a8b8 + 4c691a66773e367a235151275867ece2 + c88a529b24b811c383918e2db743e00a + c35bc97176a2aca26fcf1cb6c8338054 + 16e4d173bac6e51447be588aeebe2df5 + c1a238ebbf2b22a8b714d72ca680ba54 + + + 9944b9c678822b31d97ff3b2c339a9ad + 84a5da1a8d13d230e0a81622310260a3 + 534be0026952bc0849ca9bc8d1a4accb + 5e5160e24f76df3bcf1b5bac17467de5 + 4a3a5006e1f6f7047527e3eb0f628271 + 896ec7c92a62f3e4cc5089cbdb754f6a + 637128147d39a84f44d7a24ba11d88d7 + + + 6fc984691233f658945a2cdfd2828bc7 + + + 68ea12c8b008bb4cbe1305d3275c0996 + 95c8d418f295547880b48825dd69ddd8 + 4a98128af1e904a036a1906cb2be4b10 + d6da3dcc154e54dd663aed8393d6a60a + + + d703f89a34766fe0d8500bde34aa67de + 23977e3fe049c657de05e2cd67844dec + + + 4b77b7479be1dadd9bb8929aaac02531 + + + a7d792c560d54b79fcbf60d2ecaa20b8 + fb62f45402c67a387c6401881119b815 + + c1343a6297760e559b8219207d95e60e + + 0611bd96a974135592ac97834bc05a86 + f94d5ee81eabcdb23d6e3d0c597a79bf + c7662f97e529ccf29c592bd58337b382 + + + + 95e9e75d8e4aecddca912aace0181b1f + bbfbbcb2dff282b15639f4fa70b708c9 + a105d0e6f8143ceea53f33f7ee4139b2 + a0cdbb492979f7d673113567613ed398 + 0eb3ca932f39f2c9264630e156882222 + + + c5af2be173d8d1d4536cf1cbec10e243 + b361217b7a35c6d15e3c322518b9003a + 23f355505629720fa14500f92a891ac9 + 2f3148de11213bc1c24cd6ae77196f14 + 1b47bdf6554786380847b6d8f9f5f5b8 + 71e99ff033c119f27bad555de7034dc3 + 18cdd05047af539695944d5b6218fc1c + f5b684dcc187259c964ee1727f4af4ff + 3b28db0c0446ab02c35159b19c785059 + f6001d1712751acd43f7f8482472b2fb + b640d58c9e419cded6475bcccf6b7eab + db72acb66c3abb8775df1a2da491fe18 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + + 1c29f48462f2cea2818840424979dc47 + 20835c6317cc11c478b0e534500af489 + d5e1ba0e906ca80899f14210226672da + ac286af2b2a0b4e2b45a47c9cd568e45 + 09a069d0434bb2ba58bbe1e9e0d1dd97 + 0e31c9839f05e35bf2632ba813ca1324 + bbee71747dc69c283f0329cb30b19200 + + + bcc444828552287552ce8c793cb62ba4 + 82f084967c07eab03a4b549d58d168b9 + faf16054644a3dd9f708e129b0e52e81 + 863ce63d3763ce6dcf0cd4a40aca3835 + + 04ae68f6aa7303d60a8b21c2c7fdc976 + + 54b360cdeb3110d44aeb1fe56cb7e365 + 7b2f3ccd137f782e9b18c7e96bf45663 + f71c5cd2a21758330d8582210b4851ee + + d214f0ca27390878755bd57c8b47408c + e4c21a85c01ea3ee86c05e7534dbfe72 + 9cc555731226ac1ed9f6b35d57d731ff + b482ded7063f08b762a7bf8132b5bc03 + + + ac4974500bb92f2d3ada04877dd7542f + + b588786fed784ffd37b529bac42aec90 + dc3a210a9ab3cad951553d2013adf96f + 93cbafe70e1d8e92f9195459c07af18f + 3320937073abaa754651d972292215f4 + 210d682d47bd7f4b2cf0e61d296ebcad + 83efd6d2da8c0467bf11427ca1a8f7fa + 61ab6583a57fa59cc8f4447fee9976e0 + bd366d73d03f590ae19b534da6c3f5cb + b9eca6f7dfad72f6074daf7a3557a364 + c9caa7ea4adc651ea3f8fe1e2147643e + 136bffb0bc93ab5b5b5a2e5f31d2848e + + + + 4ddcfe7ec90c776f861f200aac02750f + 6502dbd18f06395934cb853e7beade0d + 96def7317b549215676fca335b03b1d6 + efbd2b74e42f87a3fdf5b1545ffd88a7 + eafe3597b3a27131e496e4043c75e89c + e1519079a6ef3255b741768b0de5c882 + 618ded2bf18c5a8ee1b02fdb69e053a8 + + + 2d265bb35ac5b513c1ef01b6a84ad659 + 3583c0d4e50bc4c46867956c5bddebe7 + 64bdddd4ed8d1e8bd74a2cb9511db427 + 97d26e1b0058b20ec6b9e805f89b2fc6 + + 84e8c32e6486926651097b86cdc2e1df + 430aca295c1bf5de5aa20bfe168d95d3 + 47a62412e0b0de0b985006aea5b94eea + + + 42526e791b191ecca7c2fe6444537397 + + 717695cc05565465bc3acf15d9a427f2 + 58178acfc40a4729a0c8b11ac242ece5 + ab650cab7dd7fef95d85b7941012a70a + + + + + 7a8ac27f0c9a5fffa08dbc15fe00651e + + 11e3e7f21440057c77d2151e3c535a29 + 0cf67cc790b1f6a403fc6ac4cdf91e0d + 0ac4aee282a17df4743e558b65966099 + b7364ef26a6f3ee434df9f52b325b595 + 05f87ee348aca5c6f20e9169f00452c4 + a2f1c10b314e1b5b6d7fe819a2300419 + 6804348787c87362f7e6d88367c1e845 + 22f6dfbc7b5d243ebc452f9ddc68ba93 + + 08e51a4f652395a707e06122bf2435be + 405a31665c78b56c6f3fa53c410b782a + + 481bc9755707f3f9295a79205187b9f4 + + + + 2badbe2dba8b421cf4f89a340b3da692 + 4313b0aca7604ae9662028ddf4fb738b + 761fb94aaf97c88c02556f984badab92 + 4a2786f4238c42a4aecb6180f05d9503 + d37a8827001fbb2aa7587167dca0fdef + 1481bbb1d472895710e15b462bd54607 + feb20771aaa9ca8bcd21f7c4b6c38f2f + e3edc78119b2145be20af9d8f36656a4 + 3f243676390784c732e305efee383d52 + + + 9c56f1345f73545c3cd3d111e8b359b0 + 129494cd2b2ad50cc3d6514da02dcce6 + a21d5b345c17f43032780146c48462bf + 3382adc912c57f91897fab1bf083d284 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + + 6f6a05fe8d0c4d68ad20277676882d5c + 5713f74d4f4b2ac74521a9fed289809c + 2f36d0e51121313a69833ff5f1216618 + 211be167c6028dc4aa39e2c57b4e7f58 + + + + + 9ee13ad6d25017d43918ebc37e10c8d5 + + 94aeda208b9b563b36db017c41620da5 + + 4ff15ee4ad61269daff473adedf0f138 + 2f62452e16d65803be43a675636bb491 + 92d991a6a3f8891b1f39ec46a520f943 + + + + fa8833668cb3530e1487ee02c1100100 + + 227b1fd587c95fff98d5aa755fde2a5f + 9f9d22a17b4ad5dd8147cee3aec32866 + b2fed8f74106cd2c3f8396db5b1d7b0b + bb7ced3f42929f11874ed184d79408c8 + e34c6e2cfc3f38db086bdc8b1c78bc16 + a8e75810cbe411b76041dd243cb3fe75 + defd312159db05e8164fb7ce64bffac7 + 042beade341e091e3a55a546cee51363 + 3bba562a749256b2b8dcd462eba0f1cb + e6138df9f76313dfe5ddb5d27f2e514d + 367fc0b7924e5f0661a42bc1e1ef63d0 + 5cbe9065c5b8acf65be379b0714cef64 + 88a25301e028d892d359ba4bd9c31ae5 + bd96aaec5c5022c0c8e8295ba6fa4a4f + 40de13acccdef3b941649256fd240e37 + efd15954e4e7eb2bae5ea6298d5e059f + c8836480c84d057b5f9744f3b8dc28b5 + 46337ee88be68d547fd2d096422178ce + 878af71f46a3503546eac2c629210d69 + 226faefc284d560936bf76375fda2fa8 + 2edaa67e453c36fb56287b897bd09513 + cee8a79673268324812cdcaf920002f5 + fd440a61603f337fdabd9d4bb54cc960 + + + b79e68222639f55e1bf9e651c62716c1 + + + 1d8e574de23c5512ff8f03ef9e37ff6f + 3c1e31edf9e377df9cc34dc86842969e + 69bff5c3aac2d78117a3807545b9d4dd + 48859cba28ea0a1683447d722c4ed2d8 + + 7e127fdb2706fbdd52961cf0e7ee1565 + 32e75fb51a5e6305200851821dac8c1e + 335bf2fb1f3f657014d6972caa48776d + + 1804fc56a742e04209018a6aead73092 + 385314cabf154bbe6934dcba56752ecc + feddc57e66e772273862201864f71923 + b2d48aa7b7d7f07a7b2241254e4f9110 + 8a8bc56435c887292eeae233c7674175 + + + 97f0589774380abe41c653202b82f392 + + 8986992cd329fb8960a1557f8bedc489 + df6d264ba8923cfb76ff58a32da0eab7 + 698bcaef7cccff56c6a283a0f01b1d13 + 1c75fd9b7ca5fec285a9ff1316b08537 + b91556f5485f2701d819640ce362fc6d + 8ba4d2e2c92f0dbc43b1075b610655b3 + + + 9bc9653dbd2038470dbf3e48a91536a5 + aff6e65397b250656c613200e92445c6 + 3746d040290c84a363717797f1b881bd + 2f8b5c64babe1a2c12b0a7b21f9eac5f + 0a651fc3bc974b61f2fd5b7e4c077762 + 36b4560c10bb2a14c4d24f3954bf0ac9 + d213c49312798e608dc9305a983e25ce + bb724a29a2d64ca77dc8ce202cf28075 + 03336398aac95fdf742b22626a19ae22 + 124f74031152adb10d80072fcc6f55e3 + 55cace635f93d82750dbade944f3dbe5 + bd13951e86319ab0a10d6e6df4d1d798 + 4fb6a36d8c7d1ca29de591684a4bd79e + cd58e3d1838fd496ac4b28283c943d35 + e29f48f10aba647563abe93c2ba3e8cd + 9e58c748979d0c096de3892c6f7f9355 + 38d09dbb8da6ae2bbae00340a4727f66 + c9c9b13cb8c1778a041180f9db3e2f4a + d17c87536dc5729053d0415f9a9dec94 + 12a689bc3f02d2ab14f8e04d257a38ca + 3e3ea7b39042bb3100058e3811794242 + a7fbd6749c9efdd3124221d946144a18 + d559a7a1a3e4bb97c3feed801d58d0c4 + a9b9686dc54ede46b95ba5f50b7ff74a + 67a102d25077a9ee6da306d361f37106 + 185ce4cfc631ba52b88c419fbebfcdda + cc8ad0fcdf98547f80dfbc6275075095 + 09de2ba796f1270d0096944b661403f9 + 66beae79951c1e74695207c33430a184 + 2b76deb987d67c106426c9d178afd8ff + 8daf195a0a951150d5d47a04c2a541fd + 6e2b48d37703c5b4e9e3c69676326514 + 32b57fda6b62dbeed8346bf055dec919 + 2f485b9330c31017bbd5def39c50113f + 7d7765b8e4c1fee4c7091cd0755d4697 + 5e57c71bcb299aa3bf015804715786d8 + 59c72a94e90be9f0fbba34ea729d8b11 + fe2cdd94f575218824b3c692f9b1a954 + afa9c12a9b58a5402a29ec09c9b794fd + 8f628f630b53e2114dd2bdcb74c4c784 + 75315b7a003490343a3d44b377db8c8f + 01f10f0e830529ea57d6692e2b34fb2b + d1b2696772a69325dacddb07962606b3 + f821e4ffee94f044a8cb14a98bfd971c + 4508ac61e1299510d25900341048b2d7 + ad96d28429daad9a3492c2ff71077338 + 1acb58e2ff5af9c225add07b065d1fd5 + 0686c83cf506f0908d6587a3549d12a3 + 4c6d90654b195bfe21ced7c0ab0fdd78 + + + b02cffcc277a68349e35faf86315b872 + acc031e8ff5efa2acb5b8f274493203b + 1c090c7064dd1ed683350c73a9fd4a1d + + + e13a4d5d003fc390296021cf7805a252 + 8f8f227e99f0dba33ba2088f557ab6c3 + 0d74c65331a369f31dbc419991b90681 + 5c28dcd044454e78d40e1448a46f1c91 + f4bb93625bd1e462ca9246eefeae5b55 + d362e9eb763453239e9ea37f532e1756 + + + 7b059f59730003361cceadd8965ad7c5 + 5b78b4f59982df23deaf0242aec3d4a9 + 1c4faee5c901a384ecd29f797cab5141 + a0f51feffd270f0fe1beec091185e52e + 31b4e0a396c663f45320f7e7b85b47da + 792b235a45e9f4c0c7a7280580b1a2a3 + 8ac40af4863b3c6cd9311cc1a29cf802 + f6754fc23ea65b7b188cff00d84d3c80 + 4e4d9c135fec917ae3fa78f25fbd7f85 + f1b09121e6850f5271d8bd3a6837efd3 + 7881aa76d06f7b9e4bd45dc85ae0d52e + bef402b9e585669a5f35c438204361b2 + b398bceb5b615d8b19eec57ebf1de4b7 + + + 3c6a17b503d21e70c09a9de114f8d159 + 6a21d383f791494c007cce697c0a4557 + f4102bc2aa5b2d31954f11fe266420b4 + 0616630df193b02f65713ee4f14f556c + + + dc962d21cceb29fec6464773309694a8 + + c92cf6c9e37b5f799fda9a66b259f3b6 + 9247e138e6df85872234609eaea72613 + + + 5385942591d4853731e16600e17c83b5 + ee23b628b592ce80ae3f09be400fa1ee + + + + + 1ff7f457a3282cc26bba60c0946e01e6 + + 4aeaf15cd324cbad217f36ce30cbe31f + 0d8b01de07d43a1c4c7a25739c7819da + e6750b8dab01af1844aba2f88dbd2bb9 + 8a787bd9674e5a4f786c660d8b5c89ba + a71474654544d321396498327b7f0798 + 396adfd3893482eee0a95610a02c908c + 565281904655debe44d459436ca04d83 + 93dfae235943ae6144e5202d44ec6d80 + 344f28285593d739a2c214024776c146 + d9eeea414e9e5dec75a3e1488194ef3f + 56cf5e4c892d6919efb1c34ab4b760f3 + 09d92b6c3078f71587698a04272adeea + af8ae600a2ece3a229bbe3766b780713 + e99035352ef3f9d826cc27c40e126034 + f84127e298b254984a9e46df968256f0 + 94392b068aab93e290195f092693be65 + 39ecbcb960d305640fe6160d85ffb972 + 5b897e8f635351d72a73bb2e9856c41c + 0fee00f54dfbf0e10509fed2f50ba344 + + 607865940bffc50879cce2be41c35bde + 9ca73a53779b0270ab7083755d58c4e0 + b8e56ec917738e17a3a45daa51f1f47b + 661c5abc0bc4b1fbe42df0d4f1a44494 + 06877362c309c60bab580b19abb8fffb + 6c8f91d31c879dc6cc3da784f1728bf8 + aee7453a42e55dbe5058c4bdee0bf534 + 1a339aa1e9faa3fc0cad957404a9891d + 2229cdf4a09f0aadd890d7200fb845b5 + b57242be41c9e6e8cf864e9307479875 + 85b1f0c6658afe7aba29c75c9c9873ef + + bb396606d94aa16986caa6ca81c62013 + + + + dced8791bad18bf130130e785d2d8d4c + + + + a61ee00df9b32ee590f2178c00111a5f + 4b41f7455f41b68bbac5b44fe4c538f5 + 5640bb99947e4718a8a554a1b9bc52fc + de76d1adb0660f1ceef3fcae04c4f6ad + ccdcbd039b4ba7b17c4ac79818029ae4 + d96944e10de57ecef198afb4dd40d024 + 2f4ed7f7f0e3734f383ec71ac17d1994 + + + ff2ca177160b4b3622af3877853ea4a6 + 3432d3f4a555bfc1fd7a85c35ef6eb0a + f619d8451cd1ca5b1d14f5a98ed1b731 + 3a8e53683452c4a338feaeb541c58ed9 + + + 04023b245efe6f92e480a726950a3c78 + + c9ecd5bc4418d5764f7e8d7c27f81065 + + + b95bc810d762a9fb20757a07a94c636f + ff00bd7954e8f0cda518bc410f2ca094 + 6977f015afb432fbfaa435f91820b243 + f385e14d312d01c70f99fe34c2b3f494 + d91b78b863e3cd329a0dacdc289584b3 + 9910d8a28b45165d902d31f9b268a03a + 984fc7602d98ae8c8268acf0e0499330 + 802e26e453708d23ed61051c6e5ac4df + d97e0ad61a676c4669a3cf5aef07612e + 02fe525be47e515c757699e18387c55c + deba227b2196424bbae0faa61c825bd8 + 32e97f60068e06e603500be7123129ac + 3bf3ce4c958015bcfda5cf88ba0a60c9 + b36321d65aacfc646d0e48352ac93bf5 + fa272ebf8c3e66867435059b214d4362 + 34f9756e6883f50c4e40b7a1c7db5517 + 97d2666d199a404f0909122c4f6c6946 + 578c5ff889a1c37f3d44ff2c7d627cb5 + 1fed566f840b001569a41e5e261b9622 + 9775448f9fb605ce28d3fc960e79ff1c + 7a2118706f105cb24074785d47d80ac4 + 466cc3f501ecd4dbe9db862e2c1c2840 + c8117d16e0848dce84b765f2331dd6e8 + 1a05eaf86c657eb1ebdbd6db5f00d784 + 2647969e9f7ee03294eaa9c0a10471c5 + 7e34170784c1ef5420c4e0596047c7c4 + 40db206e98a6e31ec598ee92f1615eeb + 206eb72538c50a2e72e120b18fedaab8 + 8e428e961e55b4b03c3aa44c50891690 + bf8c68ce2b95357d56d237a6862c7dbf + e39ff1d74bca2bf34a6ce0720aa237b5 + acd6561f55dc5a12e66d5d1c53e7daa6 + 8ee2761aa34bdafb358f4861b4bf1425 + edb3b283cccd258546eeb85cfd7bcbe3 + 428359acb0df9f6936e7a4fdf7736f23 + ec0f98b45f104bc9577bef384c286657 + 054a78187bf624a51e32e6c0a4f85cbc + 27c24c8289e278794d695bee0cb3323e + + + 735a6486fe5a65852fee05be8d797804 + 2d5a27a162eb8e4a1a879c555009ac72 + d46db1669f982b48b1975b871fde4466 + + + 115549557e8bb14745eceef846b764b1 + b0e27250c5e737b74d6c847c9102324f + 5353b6dc3c1f70c4b320c25cf1b1f48d + 09f5b869bb003eb50d57ed8464e19f13 + + + 68de47063cdf01eb527cb16258491277 + + + d2021a7826dbbfc6ed7657bdd074f75e + + 2e82627f955fd50e466d8e64f2df7c1e + c2d0aaa8ccc1c109d837b144f5aab6e5 + 32bd705c613d381fb2c4b9d7c34798a9 + 41a84c1233356fc016df2385e5bf6e45 + + + 6b6deec3a2fa00fe7ccd69fdfcf74df5 + + b6fbbade4e76394eaf291f458e4650ab + + + + + c2eaea899c0f27aad23d273a5bf5a1fa + + + 53a46da8e631976d9b2be7a209f54bda + + + 18db6cad6364145870eaab3f539273ff + + 5ef45f838e0cfe36a71aed3fb36c2c6e + + + + cac9f40e307ee2931a6f4a7f393207c1 + + + 738b0bf3e126a9cb934cb3b3e567239b + + + + + ee0669d0598ad19d4ac33d3245f8d9fc + 66b769763f6d7ce519bf06ee7db25c86 + + 6f9bfb5a2e11dac658527b9f41abc688 + + + a72d0aea9600dac3352ac399a16b1652 + 1a6cfc874db297ad639301cac516e81d + fae409b7bbe7a70a414bf3b95ad58f3e + f9ea2590c2f0d4d0940269f6033e37ae + 7106b052a23a6a02d15390fc937e715f + 00c44a3a1dcb71d2a96940059d786556 + e266f878c4cd5cc8fd8ea96bba46653a + c06a6749be0bd1e25e297fbc5c922359 + a161bcb3beb55467b0ed2b4d794fb7af + e4239378776bff8741cbd198d91ab726 + 3edf34b5ebedf2dcc8da4fc3b95c270f + 578a852cc6efc63084b23e194b77792a + 68bf53d85b6fc521faabda6ccb451cae + 1d9a49afd45c7c62a0ae3d44edb1831c + 35c734c9ffa9ff494e971febb8135758 + + + 41892fae35b64832a808ac140bb9c1b6 + 3a5812e32eb2bf8a2d8140915b982094 + d7443c3f01a6096e368f69fd0804680b + ef330db7174cca940f28f8f86e8271cf + 03e942da3c55e7e606224c589fc41b2c + ee46aeac21586d52a4d0cc5099ac09f4 + 55a83c461149823bb6b694f776a3fa2b + ee3e722310f7d8aa0539f165352a9853 + 3061975dd4708ae821b6456c67eb5d51 + dd149519755d12fefecfb590dc511279 + cd5ac678f6c4d71e6ec8516c8ac328d8 + ff160acbce8a74127fdd11e58823f7ac + 6ab771b4e865f7f6c7f471e713854a70 + d36bef9e4dca5297d862cec66fe8280f + 94155562cafb2776c80068861118fcaf + 8c736305ffb14cc6b3fec15f061f32ab + 69ce35c0e32d2873db17fd4e709d1df4 + 31fa10b0913ac0978ef607cec6654519 + 45d083c2baceb31d0140771932f1cfc6 + 30e1f37ca13ff78ec7615b56fa53b398 + + + 5fc3a9e8604508b71e257f08a0184179 + + 5798825e0044b1c71ef6bb81226845f7 + + + 391521bf05a86a4854a99a2260b243ad + b7b2d9e8ba9bf1ee26a20c7b8a5ab115 + + + + 534b0c79d8e808c1d2960c0f177356c8 + 62dec14faa5775009b4b2d1301249372 + 7d5b603095e16a9d5f6c824aaaa0939f + 5e5305cd0f12453bea3d7b7f4be02001 + 5e5305cd0f12453bea3d7b7f4be02001 + 278d43aa5c9a9240cb1d7729e8fe1a09 + 0900b23ab793d5ef92f79a0db93004f5 + e77acfeed104607e84a3a814a7e4ef88 + e26b40282272c080fcedbace6b3d2edc + + + acbbf78deeb081a5f4e6b33f1d1a7bf6 + + 133d84f7e005e4a41471b699acb64f91 + 4a73c46802dcdfc2fd54da0dde2d7ec9 + 1d7ef9102ea9a7fd279f9345d1616009 + b48da3c3139d0f75e57a367f3b31a0a4 + 3efd471f41ec3152a018026ba67e0fc2 + 4291dfd881d14d2265b33e9b25c7a204 + + + cd16e7c41fc369846a5eb4a42d1e5b93 + + 9214b60348afbf4bac05c51e6796e7ea + 0f0eb8cd1758b425c72551774cadabc2 + c0c474c2c3007971127ffd38f8125b2e + 2533e30245d301e424eb76b539244446 + fba43861b8f70d5d57e480b958be7182 + 33bc8d82c73daecb209913a97fad4086 + fe8b1b16a576482c5f0ff35faa13234e + 9f16ab97b310eec57f4e2353115a418e + e4d17358ff0048001040d08141a7ae51 + + + 3c5cc9f277a2a14013fdd60897f221de + c25df1b4ae08e634d15974b275ce0a3c + 4a8f0aad32fe89d804cb85703f0e2965 + 547a11b176c7c7905611acd1582252d6 + c8ed800845f0be310c46632c64fad9b0 + cc1e7671d8c8e219998593b0069ac474 + e2432dcd44bad3082cff4aabce9d2f33 + + + 791d143f32d6b6970ddb9996bfd7a202 + 69907ad94f4772741a01eea121c895ac + 3301e554e2084d464739e683a51b3ffd + 74092c3956abef423b981c712d18f97e + 2ea20082bc8a244a81f1d23911ea874b + 49ffdce9f33465e347d93961b94f111a + 40a8041b85e5329bdad8f8846afc15fc + a7511fce428e31eca21ab8399b459c69 + 94989880a6fee78596193e703cfe2122 + 4d32a2db7f11d3d78705979c0ac4ed97 + e2eb2526ab9c92b620034985b8c78f8a + d48593f0b57eb92038a34bc34b4b7449 + d58a75652ba7d2aba869ff7d0f98bb49 + 174fbd8ef213d74162deac49129cf84a + d0361b5e5ecbecf0c89fd6e624ae19da + 78235cc55975e02967770766f07c3365 + 2e7068f796d76f542da9c1b6b89e4c71 + 4c5b23b9f9313ed2e5cdf612d32a2d41 + ed75e9f1311c594e480c98daf476001e + 0a223fc28b123a00eeae0ce7825953eb + a76bda08afbb4dc6c3a7647e5c5e2317 + a65df518b570e719923d1dbb6de0e62a + 0be2cd6da7d4e7e290aa04c094cd6230 + a4d7d4be000fb08be0c5e69088b3c182 + 41c48584dd9b357079ed7159d19b44ec + 1f31463678d6e3f2b935b2e32c57c460 + 9846b997992b386f42743c75867ccc39 + b347f5803d407d9b9966f36040363247 + 1ee85d04eb4e2c6f53c1d3f26101de28 + 83499cded48364acaf9caeaae1894d28 + e0bd18d4372f52556639537fdd3113d7 + 806b3c0826ad20e4d2dd177efb7d4ce0 + 940b2fa9c2619803565bdf521b49268a + f44a12d7e0ceb699528b3377e7d27f10 + 891935ea717b47f8d3e9e263fb957658 + f68b58cedd3e78adb6a295e58d8754e3 + 07276cccd5684dd5be98995981f60f40 + 8d1b4ce3326c2e4fe0f231609a8e50fd + 766729d1647fb24e6e48a62f60dc0cf9 + + + c216c8ffce65dce3b00dd43284ff4436 + + 56f700ca95c1ed78e54deed1d6156849 + + + 3061e33562b5d3badbc1eab5d3a6ac8a + + + 340f21074d0ff685079b5fc0b80dacdf + 872a2403e9090a43c413ce940535d4f2 + 004be471b0d8a7dfbbc485c1d32c8724 + 458c6203ae9e0d531443470d61c0aa19 + 1b55d6555da3b96db4dff72d695190ca + a03d2265edfab4de90c34544413f5876 + d144314f085c31ccb0a41f802f306649 + + 65dc314f2a8591634f7811254e2390aa + 1ff4935fdd14bf273999e1e81a048228 + bb32d448b019597dc0c8c18d528c09f4 + d29de52df3c08ee9407ffcd4b48379f5 + c0af65a8c9a8cb9b550d0ac41dd0c3d4 + d8323bd13ee0e5ad2becfc8614ff6bef + 561c119c08673fd8436e11424a20d808 + 59ba63f3125ba39feaad6da9f88454cf + bbabf32f944d59805255864fec47503c + 5be5883ab1b4cf5ce4b896360d200a5c + 59afc1e139913ec31b3112ed18ec35a3 + 11ad7a76092d20e1b8d26f712ae36d87 + d81c67018d162f09923972a16bb47a17 + ca482ff20272016fe8296addbbec75b7 + bac842b97686fe14e5a9265e92b09233 + 569beb20e8cf32731a678426d104671a + e28a5541d209005b7fd876503fd6b6f2 + 3b8718e38b994e3c8789154432283ddf + 6792102f161a16acb190f61906521334 + d3f5e1f00cad7cac2fa306576413643d + 2c9e141d57a4cca0dc747756e4b85895 + 96add3f9fdb9d2c68f9a537de43a8ce1 + f9dda315bb47062d680565e030a73edf + 5af6c4132d5c3df44860bb0de1c19e56 + 93939c23b228557abf40d296686b76aa + 49bbe3b079f4923aeeeeb6e4f15f00b8 + e1fb95406c0ff63742800fdc95eb99f6 + 61ff0662c0a892bfdc2133b9691827cc + 681e4b601dc77f03388f490cb227681e + 7880105bce87b04379a30a9a83ad36de + 598adb5f107130806c982d7f617680f5 + b5db5620eb3d26429e6870efd498c238 + 512ce586ab249c295a085d59585ee6ef + 0df8f223c614bc39b06faab138e2ad0a + f16a69fd8a440e230aace28549fe18d1 + 69a46b3de7ee6d46359e87ed5dfcf2b1 + 45f70a31d2eccae8188dd73b6116af4f + 9f30972903985b9d2bea534aa970d15e + 1a57c731e4677192cef54a68ab518bd1 + 0fda9675957aa3f1d155b94b7c6a6fbc + 0e86f5d2b694946aca15904bad063363 + 041bd75ea9409c09e1a362e665a4d3cc + 9bd86b7dbf8d9e8942ef6160b8036aef + + + 3efccf35dc66be61c1c91b64113f35f2 + + 4ec51bb6d7699f8863bf40d7b6370843 + + + 8776f5e03957bcd0cf44139a0936b945 + + + + ee19e571c809181199bf267dc653029a + 338f6372a102e190161160cbb93d736f + 919d62e1e038f710dea4b7c50ba57fd8 + + + fee111235053ea699ac81ecf4ad6223a + cf8464f1beae56df8b13d87f3f5ed3e6 + afc8fad57d413ed4c7b463d4e7aca81a + + + fee111235053ea699ac81ecf4ad6223a + f9423f245723866af9520c9933eb48e8 + afc8fad57d413ed4c7b463d4e7aca81a + + + a47d8150a6085106623dfc447344e86a + 4fa549f08027e82c2074b3ffc166a4ba + + + e740e522262f55ef268e83c08cfbd64f + 08fe1f6557526b3928f2c9d0f03b58ff + + + acf5121fda11e4c3e1c57746e65691f2 + d426613daebe52606c776215a5b01646 + + + 76f11be940c0350d8dbafbf9528e9ec0 + 823fcd80fe15af98ae3189102348bc78 + 7bdc920234bb24a3c93fe444bae905e1 + + + 76f11be940c0350d8dbafbf9528e9ec0 + d29234fc2d601596ced9ca0ca7f1b224 + db9a3366168eae9b694f8f9ee7603f57 + + + 0fae58f1f7310720a106ff8041757277 + 23dff6c359441ea56d6a77c1cef67a74 + 99b4261ce2b8f3cedb71d0be87b237d3 + d0e41a20caf519e67b5c55a252a20f20 + dfc77d0121bb53ef46b5903a6a38f2de + c72beb2670e317338ff3fa4146bfe05f + 7245e9374c8fc5971f93de79e2637ea2 + e2a494339df8bec0857e50982a2295c2 + 4f360945b64b2ecf8395aab5296ab39b + c3fda83433260869d5196d2e226ab230 + 949a606c8305337627ffdce16363263f + 1661e0243ba0a5aa9a8167f70dbf2cca + e8ef76e48d91c5163f933debdedbb9d5 + b549581f14d3e2f4de9f2f0fd7e805c4 + 9610910a24f24e9b12189dbb09d6f0da + c5800f98cfe7434764eaeb8fe8d723ce + b6ffbf826000160d96ed69610aec6be3 + 3e18d73e32fd6734b39f297ab2a2748a + 71c1f363bdd64cfd351a02e2405d30b4 + 89bcbc9c2685cd21312c8568c8709760 + fa82b8ec9a5fe002a9335336ec22dde3 + 60a526df407b9b1a7f8ca038712ae1d0 + 72d0f691b4ab0c5c940ca1affe26fb88 + c8c9a4fc77d3a35e958d7df2b16db7ca + 318ca87bef4789dc553b4bc682d9c8f0 + 833521c51134007a166d9546e4935e55 + d42f2da1df5ecdf29be4ac27edda0c12 + 037bf52fe0bfa7b643b837d08dfdf92d + ad57f4232996ceecd47aa900ffe38bf7 + e85d7fdd4b49fa6fb86f946e70c64ee6 + 2ccef7ccef8fb7bbe40369549d7b526f + d48d8cc80f4f5baa73cecf2eceb20676 + ef971bd2b4047816b99cd2329138d155 + 9c6b6d708ead5ef403c9d13af7f323f3 + 24620c369655cb3b725f2b54e278ffe6 + 414df1fe2473573478aefe53af0424ef + 746b81c8a2a67ba296281d2bcd4907c8 + d1b518eb8021cccac6ac53ffc1157781 + 117e343be2546883a754eb6d5167cafd + 1029a08292f5ae8f62f205000cba45be + ed2bd30c9ad7f3f48664bf5756a22adb + 42dccd23c0bcf76a2b57737063a74cfd + 8bf738d06b9658da15d7b050dc9c957f + e9a9c14dd5368d30ac171dad9bf98271 + f46bb36b3b3ef1d83b7a80c16567dfff + 4340755ab8294ac3b5db64dc61d4e78b + ba8d0f469a6ec30272e679bf871dc7f4 + 8fc6f5242a9a9a0092dcc9387e2f826c + 8b67ba68bb2c5551ac4bc3f7a865839d + 2651cca5fcafb2d3328d2d18cc825f2f + addc4d31a2da78c025e20a7349bfbf9e + 86d010e547bf85f5ab4b1b3411b3943e + 607d453c9d27842744b9fd2f1161c7dc + 94fb67b6909433471747448bac277fd1 + 6de30e3ec6f5769fffa3a84921d5ea58 + 2b4b910651d1e7de3a74cc6872184be8 + 1d1e7bc3ad3f791f29a5982561b8ec01 + 9ed1d963ba546e9772a3808f08a91376 + 09e0e19efe3421b5f95b199bfa6ecc73 + ef13781241e4b3997cc3f092378ee9d6 + 5126cfa0085cda6939d9bd8a5af85a8f + 11e2e762c409b8e343346a89e4e10c48 + 2011daeb4d44240efd2caddf60d84038 + 50a548180c030412b8717ec2b761ceee + a9b001665b7a1bebcf63789dbfd7a2b9 + bb1c90faa30d9356bed963bdee26db20 + 88b1dd8ea4aed7f6de6b36bb35e99828 + + ff370e498dd63ad0ba199f9b67108672 + 918709b7ffb5e37760bf2fb614dd57e7 + 0eb59878cc2342937b7876d65a265cdc + 324bc4a43401864a27cc4628fb29e3b8 + e748a100731adbee4fae07bbf41742ed + 17cae47222a12feaa890a61d6b633f94 + fbeda78ae743e333897b7ce67f26ef77 + 73eebbff1d9658ad4fa09b3493f4b416 + 0e71f26ae3ea176748b5c042a54e958e + 2059694871f7a70b26e6980ddad3e542 + 452aceb85a8f196b7c50511846e29433 + d6b9f80404c857c041d5a6aca61e2210 + 4b14b7aeb0f062ed23ce41df45e9fa86 + bdd23bcf757d87ce62a07f3e6e3a0452 + c957492a73ee65ae471d69f1aded3cb1 + 1b1b1de386132747b2a62deb46aef720 + + + + 8381f52874e65058c83a7dfbb0c30fff + + + 779cdc8d70e707e75ad680954d2049d1 + + + + 76c812e02cd8acaf4c62781754327866 + f27f880e4bcc4188816066f3f57d6638 + 51a215dd8f0118843251aa280a806684 + cf3c01e9f8838000b3d1713d35018e05 + bd70b7128d1f166a34c477edda7da59d + b61d6c56c87dfff01155cfc5a9c8179d + ee2c8fc75f0838da25dbe12fa86c361b + 1f10c23b464ee17cfd19473ca9987b2e + 4ef683ab21b03c9cce474f78388cfc9c + + + 69eba41c66474c93a63f35809dcf9b71 + 69603ad3c0e1a5de805a6308587495f2 + 660866619655f8375bd28428fe27e4b5 + + 37712bfddad7354ea684b4b6e05076be + ae1f9c9d62fdc1753764bf8364404673 + a0329c52f5c6b8108f59ed7a3e47f370 + ea7b2d5d3dc74bff540c461222615617 + 832d2526c5c7d7806d456f2108ca72ea + 07d2c598aadb831ffd37c8b2a74450ae + 9c12d607e58bc230631472daab70d915 + 7d632c4a4204b837717361183570fa5f + 6784492a93ba407097eb5f22e7ff36e5 + + 57988e953380b35e8330469372b3f13c + a055bffea78ee0986b06d1485db724fb + 37e3f99cdd9dd165516618ae4400fbba + 011a5de200ef5b3f6b4932e5770056d7 + 74ae4816deed773c3bd2263176c2fbca + f94d5ee81eabcdb23d6e3d0c597a79bf + f2b4e49db9f682edce0126752c25f1d3 + f3569a7ea218d8753108a146c01f1e5e + d9c145f270830b67a406c04608784bc7 + 3138ce06f0f49714733f053731a98710 + b615e60b5a6a6258d20684f5b41018ca + d28b6d3b383a12b357e41a984fdbb690 + c698d14bf6e7c1e0aadd133b164ba9bf + 0f85331dee2afa9347ca5f5a1c583fb8 + 74e84b557bc900de297a67377cf32172 + fcb36975b92432bc425a9343134c23ff + 94eeb13cf24fbfa7a61fe4006817f92e + 72e6c59357ec7a9d470d7650847c0f19 + 482e637967517e7ff329a40a5283a5ba + 9feade653744943127a6ca3c57078880 + 69343ba13c4bb5a125cd0b8ea84c8ab3 + + + 8629e173b1792603c4b197803d20dc50 + + 836dd37d953f17a88a94574cc792d0c8 + a9cbc7f32016e7250201cc74f63b438b + 853564eac6ecd9bf2a759a422501df3c + ed49e11a6348b6dd1ed88317cb57f497 + d156ad9dcc719065788f27460982ba04 + + + c0c97a97e2b17b94c0f1d02b05c7d371 + + d6167fb952381d516759095f481d917a + 591b3837ec7a6f98f93fd188acb6a237 + aa803b740cdb339fc1932a00fe155e78 + f542c4393d7a47b6afd76a43a28f6d56 + c892ece3b949cf8982a067ee699299fb + 1f800749a74d5e02c0923e95d182919f + + + 974fdff2161430f0a84d086ed023b85c + 2205e48de5f93c784733ffcca841d2b5 + + 0eea20e1d943b4fea8bef054af78d674 + 71df22fee2edfada343103c13770826e + 53d75d3acf7f3875f140fbf4cf48665d + + f94d5ee81eabcdb23d6e3d0c597a79bf + 87d45cbcc0c964423acdf1212006bf89 + 51c0595dd61be023794e134483e0796a + c794a2acbe306a11f3f7c6020ef168c1 + 096e2375cdae60ca04cadd72a45ec674 + 95607d8233ce163e20ba1f1c654580a8 + + + 11670461c66609506112ab1a68527441 + + 45af07c66d8058ad9e276516fdaa8d40 + d945ab5fbbe2c5d75743050cdfe5c318 + 50ab2a5ac335105a41dcd17fab8f2b5b + 2e58d8e23a3fff98511c9c2b252e5777 + + + a2484cd7289364b01dea1cf0e59e659d + + 7492a1524c319588349955d20d0ae2c2 + + + 6ea46985f5f410cfa3d79a5a964488e6 + + 913654027de6510a66e99d7a73544382 + d7331b8fd7505f96188b49ca37ee9b5c + 87774f164c869a26b97c00c72e26c099 + + + 658c699a488e5bec27c46db4a9218a6d + + + 1535f81a48ee3fe0d3ae8f5960481eda + + fc6f97e9a64bc4269298fc0d880927f0 + 3e9d6edddb3a4e2f325253d291ea3d46 + + + b8191b37a55840583fbed6acac4f958e + + c53a83e91bee7f1bbb15c7c47a17d435 + d95a7e51af4468f6201c755b7869d1b6 + 0fd89edc36e3b7e7e24d225cdcc525cd + 007aefacf6d7a99348fd03a9dfc1d044 + 0b24f5688c95e890eff04da3d47aaac0 + + adfd1b4c06b640655b23451167296f45 + 7eac569f660444f759f4fae18ef65e7d + f94d5ee81eabcdb23d6e3d0c597a79bf + 101a308610e245322f75e08ad3930fe3 + e208dab439d203e8074a66a1ef7c2e91 + df72f94abae6b2dbc6b75ce3e24c3568 + 65224a20fc679b19ec9100fc22c7f9a5 + + + e54562cf7b212817bf3f7fa3db8321d0 + + e07e51a0f8573aaeed8d44151821fcc3 + a37a2d666ffbd0eb2c39a285ec6ecf9c + bae8a80134b79c1abb46b9115145a9b5 + 1358fa120c3d23d8e244f1c092fe4a64 + a7ef4d2532867a35e15b1ede85c52bdd + 52deaa5d479ac18890fb2b0a386b5622 + 046a13965ca91ade1ab4a06e0096c148 + 41cbf2ad4e9410d3a4d7364ed3eb6ace + 7fa59ed68a9f8209c394bd60abb3280b + 467b6f5ef431e30e617e8b2ba705a3fa + + + da3a33178d99fe7c4f825d29d7976496 + 277d40af8f8d2a1ddceaeeac65b27f01 + 0e26c276b39dd423e02323a1adcc4fc1 + + + + 9461a1432ba7488bc87a4a3e4132d40b + + + + + 2181e6383209d4543b8fb1d1127749c2 + + 900921e11fe5c547910f1c54c90631d2 + + bcebdb57cbcb636a7be9a31762c1dcb2 + + + 5b4170afc42f19b02fc15487bd67a540 + 5e52006c2c0faef87824c09451cad925 + 7789f356d532303a048d3cf2dee1d36e + b90c22bc704a2f787386408f0c250a28 + 5c1ddde66e92ee9eaf95c4051fb947be + e6874bb3bb8f1caac3a6e2c3ba105187 + cad9fd7b9975632bd111f3246f5d78ac + 85380d8c40253d5f180729e51976c4a5 + 4fd330d820f582dc3fcd2cc9c3f15f25 + fc4cc91f70c320ab108d06c32d361bc4 + bec5fd69c716200faa867f371714a8a9 + + 7d2842dccf4a17cc91bc9204c9319698 + e45ace54f5e14a3dfab69c2921c0ca1e + 7a9ac020eed826f0d5a7928a359c0fbe + afbd4ecf568d853fd6db0351f4f8783d + 9fb63888f8906fea4f33c2318061edc0 + + f2ce81f411ab3344c8b27f229340415b + ec6b505e1b0f305aebd20b62f3aaebd4 + f94d5ee81eabcdb23d6e3d0c597a79bf + 22a8ad1d8591ffe6fd8ebbf25389fd21 + da683653a2c23c3fd062de9d49f5f11a + f9a38a9199afecff889f878359a65463 + 9a91a2208c65c06e6bad9de701f5cb6f + 28bc19ad4f7667fb813ad5990897d745 + c82d8bc29423b57fa3603f02624d69e6 + 81e146792d65a0bd3e0b84ddac246a50 + 8493bd991cbdfe8c8c029a0b6739a23f + 7f296e86e4b6adaea46181d7520dedbc + + + + b0c33767d71094ea350851390caa359f + 34db82450fb4585dc0062b887e162936 + 1bf882a413ec45ec59da4cf55c8afcd0 + 5b777960995ad86b080c4bcd4fb2bca2 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 08c0fad26c6c24c8fbb7592798f619ba + + + 767da97c5efea1c576f27f8b933c524e + + + f648728c51f38b32b123d89c72d48e61 + b1c4cfc590e89da86cb186237b4af839 + 9eabd7db0d4cdb23e42bac34a76f9845 + + aa1ed77ea9fa0c0894e209c6dc242a08 + ecb7510dc15c90c4a020bd80b0df16d7 + + + d83f64c3db034f4dfa7c66ecaabc22fe + + f9677dcbbe168e464377ca4c68937b3a + e2e424e73f8a7eadb8699f821eb066da + 599fbe57f42dac6ee9f2790a03a7ac99 + + + 6ec2bf13ee80fa36603a8b1cbaeb3057 + 33e9e85d6096cebde3c70e6e24546eb9 + + + c7ac69cafbfa6d8d7a2f666b31171328 + 1972c215f8cb73a0f75eb00dfdc57bff + 939f3675611ffbd84c098e764a21f674 + 80b06fadc52136ca0a93567f33b0ebf7 + 3b5d48035d783d2d028ef2c1dd481129 + 6f8406896f4eb22227a1e9fa00e6175b + 527e940b50907416e033ebbd793f7a81 + 8c64d6418d9106a5252e2646e2728eeb + 3ef0c7c423396515a4e3b1529458eb92 + 37cfec902e1d941ea812f3030b5646fe + 15d42a85eaa43bd5b1f5ecdb0d0be1ae + 2fc1564db57e31ae4a008a3079a67f20 + d520e2ec5015d785323e1d2e5e30dc34 + + + + 402ce6a0291d9251ddb5d71bd562f4ec + cfe6acbb30af5846f3fca4e029e2737b + 9bd299ab17d311392223e153e09eb555 + + 6973eece42d88ac65385b6d904ef2cc1 + + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + + + d41d8cd98f00b204e9800998ecf8427e + + 6624837e7357e95e2183d9aa82a4a90f + + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + + + d41d8cd98f00b204e9800998ecf8427e + + + + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + + + d41d8cd98f00b204e9800998ecf8427e + + + + 4a0232ed909f3574ffdb1f0d3bdb5660 + + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + + + + d41d8cd98f00b204e9800998ecf8427e + + + 843affd355b258df359cb9b62a64289d + bd58bbe99a4801c138ec8017d65cc7a4 + + + 5df6e0aa2adbe197067b6cbd916316fd + 954392a3f5e20b1e97dcb2c9edc9f43b + 42dc414ec1c87c2143ef424e2aac2b10 + 2f400ad5463edd82c7e08479a76656e9 + 0f7ec03319af88fad8b2eca1eddfa813 + deaeb6119512fbe80b0726ceb914f689 + 301f1fd777b5c86109e124117c925edb + c7c8ac9f9d8a4f55d88e58a72697eed7 + 14e0aadd2f398e50043ce5925f87c025 + dc6ba4ca1736dccbdb7ab23c3ab154b8 + 3c2e611db53dde7ae9826f8c5a074968 + 06f5143c7a76a7338b33deac3aeb20b0 + f2eb26fddfb49e8cd6bc1ac6673d9d9b + 5d1ea004e03bf287a41766b5b1a5d354 + e8da7cbb92c6055a8678c71171a1f90a + b62e1e35c58517e644a197652aaf27da + da54f7b6737094d6e1bc9ecdecb8adc1 + 4e8901fea66a072eefff25f5c306df9c + + 7ab7c7f4b615903b1c1913435747aec4 + + ec5cd3733306bc47bb00857a8cd8aa06 + f94d5ee81eabcdb23d6e3d0c597a79bf + 57f84b33543456d094481b38298e3879 + + + be6190190eee76461d6671334cf4eec6 + + a77344b03f9c93e56a5de49462f30066 + + 93a732f7015374fe65e5224914275806 + d447f8d4fdc72b7ef0501da4980b42e9 + 4cee1e29e88744e21e5519df62d677b7 + 5783bace1b9c50274dcace9ecfba127c + + + 399fdd9f58031aca0ce8c505b632fe9c + 01867b87f46874474e30e844a15c2197 + + + dad44b28f3a26d47f9f9db4d5afd3620 + 358d55cfa6614c884a535b87195d893e + d95dd1fac0cf359cfa29f304be1b0486 + + 5a00dced7cd66a6dbfa14d20bc64c84f + 003c0245f2bf7738959fcdf286f344cd + + + b281c4e180a4069bec959c12437871e3 + + + + 2e715dda149ea1b4219098b3749c2036 + 29cf44c62fea4c6a443eca182bb17928 + b5925e658a282aefebd78ba846289b6a + + + 0c92f62e0e46e04719215b7ed3ec97b0 + + + + de074b16859aa1ade0a1d2eeebc45239 + + + 05fafa90307ac0049080845bfc134e90 + 5146822e9678f5015858fbf6aa8db72d + 7acb2af6fec7e8015fdf9473ed22e568 + 1f4d4c025c5f49fd0e787f2095dcac58 + 04e43782ab8e754a86f812f93d3e80f0 + 6439c29ccaba5ed08f068b56d1cb900a + 035137b05f9d396eebf788cd0475bfd2 + a93c3e0ef8f9f1833b1ec31f26baaa92 + a7e624979068a6ac1975cef01a181a64 + 16b9f308c2cd41c6feea464a4c2a4078 + 2234f655cd9317a5a46fc79b5aad351c + b43e60289f802c13894f4427988c2915 + + + + + c4f73a226f03711873d68082ba014e43 + aaf92f1448db2acc3dd1fce708a2d5ce + dc3575f7bce882eb10842a1b6d9b7fa2 + + + db02e5908e4d23d41844b79b6b1ccfb1 + f0d3e3e2bdcb5a1c2c326dda44d4d802 + 084127e6dae4de5c02a052b21c53ff87 + 88baa6db27ba9b9040f4ad54ed169a89 + 0f56c909b6a922f4ae59097be4eb4c13 + 697f5eaf88137c02fd341c0a30bbf2d9 + 035574b50018d9318ec602f1800f0278 + 89f695296a099ccb00ac1c571a9911d3 + 360bd038fb6e5f6c85639c4324a4f321 + 864514cfdc62e0a66ca1d45da1c68571 + 7dd9c4f9c36e60a3c3141f3efab3f444 + 775b8335ae9bb4d6897b6d8ae07fe0b7 + 70de64643f358a87d0ff85b6f1c653c5 + 41b5cbd3c6914bdd635965961050cf71 + 529fdbd4dfcd0f80257c2154391b7118 + 8760e577a851a125d3c8bc2f3a555978 + f3ec959d1e00000ca42572a7b175e80b + 1ea953639b145def60465fba58ed8864 + e14e709c1d4414a922f4f99aba54d2da + 716a7c9b2a8829bf371452b6e61e9557 + + + b1bbaf635571bb06c1aba808ce9bad62 + fbd82032af05ee691daf36d8549cce77 + 15073e75c1a0ab5e0b8b0fc1008d24c6 + e1cbab92a5981c8c2735945256e67d79 + 43e06dc0ed2b7d7d55195d1862ad8f14 + 333731192f6c202f59ac8bca2569a0f7 + 69a1086357cf9e96ed1bfec92688eaac + a636f995f4fdb0663a7ddcce5c0cd461 + 8dfe84b16c6ece96df587cfaa43ed89c + ccf2e35bf9463ae107fef51e5058d9df + f803f8b60d3347ff69ad819aee6c655a + 272ab350d600623f17605790090e81ea + 6303d1896531240b2557933a1ebe06ae + ee972f9e6a9d4ef124010ad8ae3b99a2 + 32553c6d16ee3a77726972ed186c00f0 + 615e183452157f78ac3ddd863959822f + 811d1b62cafa9c854ec4dbebb08574ca + 1f6a8354565f55a573e42203fd2f116e + 98f7b0903cedd72f558dd51099faa565 + 5b23cdca94f150fed69a8b5e18915c97 + 4e7d6c3831c5d376e3a7a15c3d314744 + bc064da91bb7816733c050985e26584c + d6b93f7387c0bf62dd4195fcb703f2bf + 18d7f70107ebe5384a94c42905c148b1 + 349058f383c3c14bf14e30131f59b817 + 00b8e8018b78a318ce943f3ee2a90b0d + 1edb80d84f619d11af0dd629a7196707 + b0b362ab161b25009bd4b14d868ad38b + 265893a7925769079d6fed49a70fbbcb + 72ebfeb7fef6a8f96c0279ce122aca77 + 1af0a4d62b6412d1ff9418ff61fc93fc + a7a74096200c5e161df4030535a0febc + 4aa837697a57e90b490a8dc3ce0de62e + 13ef8fc28047e5b74c6901682196a3ea + de612014729efdb60837c373a50a5153 + 60a7e047a2f7c3091b41f716e8ee6280 + + 201793e9445cc7ddab549fab40ae9792 + + 8367bcc4072dd53085e84744d992bf26 + 4a73a84f2d22ee48f4f312a178446833 + d5f6e0c4ddaf341c4ebb82d48e8135fb + 94b0da2621af5d665d52890e49ea8c9b + 3ae8a6d33ab502b5e1883d022ae58c60 + + + + + f9a52596040c909d482419d0d2b5aada + + 36e07984742a6dac80b0afc1816a442f + + 22a443d4d419a9e7e41f72d0d0030991 + + + + + 3eb8ed267b4be5852d497d4ab588ce2e + + + bc06b02e529684a9a868c44799822368 + 5a97c42a0b900914d4aec23d4ad6145a + + 0c4e3033921fe347d318a507c2b2efe4 + + f6346a0fe5dd027dfca331dea5748e8e + + cff8999c3bd20b6302615e4970d92201 + 4ebcfa0d1788192601cd5c935f421726 + f4d4c0f2bee2ea53c247fa6f01c58a58 + 68cc933d1e1670b1307057927e8ad7d0 + + + 47b3be11d9b451229722f49f74494ff8 + + + + ee0c309ad69098c394ef234cbf677b3e + + 96a1447952752b88200c28785b1264ea + e88468e544d951ab5a5210d13eab87e0 + + + 000b7e80d493976bea1075db2e4d8a99 + 44499783fee9563db3800f7408301a6a + + + + 7fa24cc51ccb153cf8909636a53f81ed + b6e709f424c819978eaf3619ab9eae46 + + + 743244bf5d9b351decd9b0b5320b46e3 + + + c66988f503a7a69b3332463374596ba3 + 561faea420aa9325cefbb51ccb25af8a + a82f14c8673255d4516f4978861b9be9 + 9618389e6b7cf160cfc1c34b5fd1e88e + 3fb16e51b101e7da02fe14e5ce27fe78 + 59c4ed2defe4bd4e69dbe9b13dedcef3 + + b318e8507ef3ed7f730cebd02df495f8 + + 0f47352f7e6f6d495b8c44278aeaafff + + + 283a8fa20c39fa0d72e28b40868ed845 + c2a537f9e3fef6f9749b328c40ec3315 + c3552cc838b42e7b8a000f6922486069 + a31ad6a8a47d89b86f10f77082331e93 + 60a58184a40de384135632f93b5b17b6 + + 1e8aa7b3f59734e8dfc963472981f5ad + + + + c962e2880383dd43138e42438674bde3 + 7d89a8f74e9938cbb15307d88af301ea + c7c4ec001fc50c72b3a1e4648a83c2e4 + + + + 6564ef4adf3e3407f1b2fb22e8f3c056 + + + 3b1b88cfda2c3f4abbe19c4802c603bd + b3806332e7e0ac5de201597ec5db1670 + 2c61a401836ce3ae2316b492804072fb + 9cb4215f087bca0b2767f7a137288bdb + 2c93c3c506a59ca9e1e82f24f30a0374 + e583a6595fe9a0d3517d42760b396403 + f6cc74865eab11539ec1026dc798545c + bb901c8ddee1efe70808f381b5b80db4 + 0dad884df898e5a08d02be89a4641b1a + c7ad1d90ad05603286ab378d72608d01 + 7c792c1e2e3ca2ab80d6ee1635fa3c70 + d2e6bd911ddff3c7b526755179cf6ed9 + f2eaf2e4ba82e742cb6dff54c69f1271 + d413e08810ddb111bb03d2fee5e0674f + d7b9df192a1919feb0a0d8a46e7aecc2 + 5347199a9fbd0b5e6b1ed3abfcdcde1a + 215088068d08d44d89d7dd00ab13222b + 65f1f251c0eb1c2f7d95e68599f640fc + b21174a0425a56615ac95065c4cd4f8f + 168d93388d6c7aa2721e0401135aa574 + db27be891edcf50f6c1262a4658e493a + cc42fc67ec1729fe317cd3b1c3b96dd6 + 9c8714ccb8c6813548af94dbe2b96138 + f81867f4f9fd2362db42befa9628c103 + bfda187791c843558b3bcc5327064e43 + 2a520b8546fff4c0c35e98bb7db487f1 + 3b87096c3cc16d9580d15fe9a9ca4d70 + 3a67fa20ddf7a4b1ff490f24d55d83f1 + 5a873da1b70f428da61151cd91295836 + 3a9ad955770e23afc52db7fc853bb38a + 48da9b8836646e5d0dc30be37353085c + a7470225a9c04a5c2b5f179d8060c38b + bea3ab5a80c951c37a72302d8c85e548 + 4f881b0e281bd152fe073fa829f6145d + f5b8402b6113bf8ffe47cc7421554fa7 + b2ba532a798af7bfb15bc1710e42c9d8 + d6d239ed4605fd94fe49e80547a84ee0 + c491b00588a91cdd205a62b0908473b0 + 2c94fa704c8e00ff5034197990686e29 + 5dced285fbaff40cb555fe82909ee3e0 + 9e69dd58573afec2929f498f6697d98f + 5e87214c5bef6dfc3d620dfbd7263b2d + c315f6914a9271a390d4d7625a82479a + cec619da1c588e97c89d8dc8fe3fa554 + f25583830baaccc529f6b4f0a845bd61 + 569059c6d19e056eb4907192037c0d61 + 3d048e62019119c8a3dfcc19ea3aaed7 + d9559a95c771a542847f1dbec9c1abf1 + 3a4e99c42100ef3ce4e8eb883218d453 + b3806332e7e0ac5de201597ec5db1670 + + + + f23b3dc38399ac5fb2df73db4781adda + + 91231dddf456e41b5b2703f27d3e2c66 + + 9eb198d3801d5806dd69afcdb8719c20 + 2a824d1345fbe54a97686f9331769d86 + 0e4b916eef2c740c59b1c2f500bcd426 + 56eb2780fa4d08e678fb8b35e13cce38 + c72f6aa4b2dff011f96dd17cde766738 + + + e4ced90b34064fd7afc0dd40db87e6a5 + + b74dd3a762c777277dbb04577cb56a70 + + 53fb363eb7d6c878ba2b7b625f3d9cdf + aa546df0bdf3ccf597a5652eb4085b77 + cf9b3f9a7c12291131ea034a63446653 + + + 235d0ed2a021f618eae289cb884094c1 + + 2f5a950b7bec4afb521f29cb23424ab1 + 28eca41ea39020c1c724d28508f07222 + + + d0d74d26d078026db8c1a0041e4e67e6 + + + + c32374181a9dcac92ca43e793fdbdc4a + 96cd94afc99b2a4b50cd1e9584f134d3 + 18ac34edfc5d11304f98b3a46844c1bb + + + + 8e31988740e1f966d709896f4f30dec4 + + + + + 39bb0c8c7378af410664c47088547036 + + 74eb3e44faf835a0ca16fac754326aef + + e0807adbf9810033ad9f1e1a436b5026 + + 57bc797abd0a83430b773c4d8030a97d + + 09dbd940322746d3d63abd050bc28d08 + 89365e57012605c3a5cff625fa397f71 + 75aa8b083b954948d78553265d4e9b24 + f9f31faffae04dfe51ee0c92eafcd73a + 119127a4ea5792178cc418fafcf5d474 + 52e1aef24c0a4ac65b29f3e66f9793df + 5eb85112d761c84729bc68321b74d06e + f1ebc34456ce5420b70f5c08e2751262 + 4171ee27cac54a876fd3ce032cc83b85 + 30c745819f880d903ef43a16fd45fbac + 0d36f8ac64acd540db3e1e899d1e3925 + ff3d5e25110b973ea7c0af220db6e4a6 + eb4ddf5cbed16cc42df9266d9a2e721c + a8bb7bdb654ed8390648c4085e553bfc + 602aba172d1e5f90fa4e3460134679cc + ad036e901911839d5bdf276bb7d039cd + 6797eea74c8145bdd7488cbad83f1d4b + 3c1abf88f56291017af82e832e9c0946 + ea1613a5ef1618bbd133764cdee77151 + 38f65119582dbdeb97ba3b14f8be61f3 + + + + 87aec5a94c94ec7a5dd1c0839eb0182b + + 242ecccc34db957fb33381cd3f279fcb + 6dc4fb4199a7010e237a11bc685644d2 + d5e12297503a6dadd95be08a72680941 + 646b218cbd08f190b27ed3d60c01e71e + 0cda281860f46e293fa94ac08b939db0 + e3e3ba0e4c20fbf3f2d43466e83498f4 + 4ca3cd6ec4c9a41f06988ae520fe6571 + + + 298ca785d40552d60fefb4e3760692de + 93fe3fe6493dbdc566e836bc4cc61604 + c47bd5ca5ae76256fbfed2f4527ca129 + a6b1b8951c1327b242eadb67aae5555a + b3730f21b2578f1aa1e2ce2853ee3487 + bf64e9f4869c24eebd0a9c1bc090f510 + f3fd40b8c52f8e82e41a9bcfcb147bb8 + e2689005a73cb851ed1d06afe4f9d1df + b81fe71830cbc82c9dcecc7c4743afa2 + ea04abd02dbf712cc7aba4e8fe5f294b + 606723b7e4de3e004663a31c58fb017e + 95469b7e7a765e8b02b279cdfcfa8dd8 + 570c892b233d3f7f0f37c5a4b0a0de31 + 7f07eba424c191bc894a24987c3216e4 + 62b5ece3b2e5e93937c6efe9c181a734 + 968dfc8716ed6e8634265d2cf3b68bbd + e716d1747ca488cf781e20254df86420 + 0d73edd19ce9e933328d6b93e8b3839a + 46e5f603e3a0fd555d17642cd406a226 + 604632f65ee57dd5be26236705d8a707 + dcc366040de6529ad4bb374f3aaede9e + e3f4cb06bf3921e28d1712f0c2a66c40 + f998be1cb8a122a2976d7bd43740af83 + bac818d4b2785fd7a2eea1317216d41e + f2a049f21b6267663bcf014666479ba5 + 2319541f907995f33ff01fe666ce67f9 + afb8bcc002d27c9c6a8969b7e165fd28 + + + + + f3bf566e3c5ae56d489f90ad8dc2802c + + + 1469a2b8251fb4115c4c092c999c5797 + + + + c36e91fe5c5d456720005e8484189ac3 + + bb99a7a5bee42bcd7ea7624732908f11 + + a25c57a6a3c09887f8a025b5c57994b1 + 4a2a79d3cd2db1b44dbc7d9f0aabb5d9 + + + 93146cac8a4530bca60aae62b30d08d5 + + + 096bfed2fcc3e508a1abb9b12b3b93c0 + + + + 8c803d769c0cb364a90e240111e65d79 + b81080faa824704b673943485a83dc95 + 00ac90fe48b5c80eec46e17c0523f88c + + + 42b05ede5a394acaf813c68f210874b2 + + + 1cd439daf0753c8ae70dcfd71383ff0d + + fbab7a8e7aecece456d4d351881abe2e + + 7a64945057a6cc8c2deac82a277f59f2 + + d35dbb06c145f14f7e098d8cb5e9d65a + + 81a5665b6fba9da675bfff490fe069a3 + + + 29e6a87ab89643c4328101f27d093fd4 + 11f9f313a24634f51db914ba1d7afc7c + 079ef11f6c09f27af7e36bc0f04827f1 + c3ad7522100071b4d89d37a477199065 + + 561b05c469f5d776dd15b092e62e4f25 + + + + 4d44c2261a5a84a8369900780eba3200 + + + 2f30e09c4db7331e4847080be602c5b0 + + + f48d23e24697dbc343824b03640f7442 + + + + f5ea64dd9646dd11a6c961fb4ab19f23 + e1b5dc280779f5eb250f4dcaf86ab8f1 + ba480178a06e7dfb4a52718e8e3811e7 + 039ba4903c2acfc8883102ebba898db5 + 5b339b0117a4069953b7d0d514ad6e10 + 19792408c5fcb15fe582fc48901d56a7 + 72f8c9ff1ec6f044c9879e0b6c573873 + 82a720f500b643e65f4e0cf59e65f3aa + e58a884ff8be3d5ceb9f5e0a233252ff + 2593434cf84baec9678487e11e3e04c6 + bf64073402882147ae25a3be94c93757 + e6ef16d321af6b6db81e7ce6323edb77 + + 43195ca921a0b121346df705180ecf93 + 0020e8c482c00dcde53e51b2d7f4a68d + f6fec8a918f2894f91f582eebf6d011f + e4c1903b7587ba7d2534af92722caede + c9e2f11810c8f350b3c02d9efe74c429 + 85fb238294354ee1958fe77bb5899470 + d8f5313e895653966a1d6b7dd4dedfcd + 03300747cd75818eb9553645a427e24a + 88e63c83f3f8365b43314ca0079da7fe + c833dde1616e0726689b59d2a11222c0 + 79e07c030eeeec6b24933df9a1803460 + be6dc5169edb8a80da7462be200c543c + c79350b7539634d8c1f1e3fbefa5250e + 342c459133be924575b8dbdb1b870b65 + f423612af83a7fd5ca88efac0fc97770 + db36577976b38a4a9282e1b4b6885792 + be47812ca5d7a51d20835a8d0cf0fef2 + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + 2cb0cf82e37dba445c1b622cd69637ce + d41d8cd98f00b204e9800998ecf8427e + 6cc0a92a870189debefd7e5cc8f9e4fa + cafb89f62746c3420f0c0d2f832a582c + 98a87ee9241800a152eaf3a1858edf50 + 4ebbd4236401118aa95278eb8eb20a0b + b3e516b12a5c2762d863802b36a83989 + 7f86d3ff991a0d9eb0ef1d3c4f09111a + 2408716f3838afc5a72d2f367bff94f1 + 4ff045216637965be1817840fbbdb66f + + + 761997b06f7a873a0f075b2c4d36fbae + + + 7910d560347943154bb0e9cd74d6bf87 + + + 473cda5c65676bc90e62477d296bcc57 + bf1271e247888695eea225d5dff58cf8 + + b074b17c1a7d36ccfda6a72cc2634eb7 + fa594361f9d07009c4014686658c6854 + de043006ab5f2ad16eb1d599bef002d4 + 4b8ac192bf744a3211c04efb487b68b6 + 0450b753109193e954e6a2272da7c07f + fe52e1c1d77e825675f13ef79f87cd46 + cab924782752280e5ff32abb4f1073c0 + 1e418953caadebe213907be3660d0cf7 + 956b59388336dfc27098c5ab2936dccd + 70213cbc8fe1ca8433431f396bcb8ac6 + 831ab56ff5d35571df6a44dc97913abf + 24311d1b328e8d35eeadcd6ad6e15e1f + f1249620c6b1e0e1560308337d9b93b7 + 5a67f1189418c5ab655a6420566a2dfd + f86fb657becf17f6730dd3a9b5e24386 + 73e088e77eca25c217b2ef74decc8210 + 74f5b39563aed511a0eb4f278fe8f2bc + 578dd97c7ccd44febb31139a6d487e59 + ad4cc6624ecba65bffc830d2c6ebc5d7 + 932229697deb9f15685c75bb09072d3f + ecb3de334101132f75e322b4175d84b9 + + + a4ae6560c0ae90a8a9e0efc2068a5ca9 + 55666200d01604c965886db2ad0db5ae + d8ac9504f5a0a4c469bebfc778b5c635 + 3b511e8c6cecc307c349e8cbaa42fd11 + efbabdc4afec06f871090add3fd404c7 + 0a117a367497cc7f67d3790b9962df14 + fd58e1473196ac4ad03164d0c08b6e35 + + e9c1dee706bcd361edb0514692e56935 + 3f0fc7b8b643756c29a18c47232277dd + 39cdd063f3185e8c2077ad328269ea95 + 690d78b901481528085c114e1d21d0b7 + 1f766dd98e6983250dba416c8246143b + 2b9067ff341a18790204ea50c84102bd + 80cb5221f47db03c6ef54704df63bc0f + d514397ce7184a0d5bdc703bda5c6f46 + 89f76b9eeb80981938ccb9b0bb37356d + f94d5ee81eabcdb23d6e3d0c597a79bf + 02d2b03a3e2ad6d62a2bcd7f6953ba35 + 146d0f703686446c4da7f6de77f18493 + fb2465f4fe941dda1c452310f6d3c9ee + b80fccfcaad356d24ce42438baf57291 + d7dc7166f64105192b40effa4d2c6c1f + e411c51b829cda29eb85d9912530f0ac + 103915817df2c055b970e074471b3922 + 8d30e7fda14654aa8e7f8f400851ac74 + a6b504551df546be9935eaf79a906dcf + d32ab454f83306f6a80aecadf4cb1dc4 + fd5855509e15a969145aee587dc31eb6 + d34cadd4feb822ac36c0246839da3539 + 42b7a4881df7c63eb84bb67a642c2e2e + 162b8822db83adf14730c300da9a1f42 + 1b7329f9d65b104af6d8398b080a0f6d + 14b6d49c7d4fff707a91538e1b62f963 + c2c5e0ffaf181e19e531a45f550a3031 + 57dd4ec471bfd428a56f12b32ef32fc3 + 172d9807e26efdbd6cee8291bfb4f741 + 62aec1e77d5a1f038b34419f4a0b5e35 + b3c1d31efc9d000f3584863f1142e45e + 998fec03082b1ce1ac76974d0fcfb294 + 65323508c9cf5bc55c6bab6da67c2c2b + 5d25fc04121ed5f6e428165f5936c10f + 6efba39407a1b3c34ba847f846fa818a + 09ee4f0e6ffe3b36ab57c806045f69d3 + c4ab4e7256ee68cd1fd681f22d6d2aeb + 23c5a5080bbcc7d6f13e5f16a5cfeaa4 + 92ab4ba3f6a0929cd6541d34a764aebb + 0867a000aa0f37c4997b2a6fe17289ec + 721a1bd36d3a0cd93e5c57956435f861 + e51d91030c5273656600e306a371048b + 7b42fd2c57b392070be27f6134f42065 + a87bd4fdc1538f251a3415afcf5f23b4 + c2bac315d429d5201a058581b4a1db9f + 283782bdd52b48b87b8690011738aaa6 + 53e48d171d089d064a6068de4f413398 + 8a47682c2c8f729f4c99592d8ff26ef6 + 6b7ae4c5c6b5372807a25d2ce07b777b + + + d3ce2334eb64ad1134707820af27e4d0 + + 6fd129d1efd277bdca290007f6d7d535 + 1cd2c5e2f3c52c95294561b3e83392cb + 7b93847625a345f60f20aae0ba500ca9 + + + eb9804284cc9986cc4df007933107365 + + ad2d0c2372ecaf2e30508323bc04b940 + 33ff8592de1c97382cbf3264f5f3dfc9 + cac23f7007e150884750f7ebe5142326 + b44c2234d5553bd69f9247b5d3b7d4e4 + 73e604469da0c9addb7830a6030fcbc8 + + + 220e6e6ef231841ac1ee6378475b20f9 + c208635d56f56e30b93ec000ad4616e2 + 1e8b7890001c621f7abbebdeef0ab830 + 601d317fd0d676d809c77169720a7994 + ba38d755139b250aafe8997029228e49 + 1d7849887c92a515aa3289be7e3bbb7c + d13af3aa29aad438c57e559346b4685c + + 6e8f49ea52cb33c7d017d9170c9400f5 + a7bccedadd57ef187f22fb758e442a54 + + + + bb5d0a3c10afbf4a0eca346589214dea + 9ce797fa29bd61e2b810f5635aa246ec + b8d987bf5d404a100b3e853c4fd458d2 + + 30813fcc0b9896acf7983713d57e89bb + + 4bb6d03e0e3a83d060420e9d7b1341e0 + 1c188aa8f78be07da910c5519a0218a0 + c2855dccc4314344a71fff46b0eac43e + + + + fbdd70284a6daab65c9dc41972315b01 + 6f36828847500405371045545cb02bdf + 86cd27898f53e9a681e79363fb908538 + ab28224bdcc749f3b02edece8364f1d0 + 6b545f4151d97657ff3f026383d433f7 + 3e8dc1deed40fdf371059ad3a06f6036 + b9c97783f8cc65e45360364b11f26e8c + 2976c6b991273fab99c47c966bad9867 + 58f5f937a0871f0e1ca935934d498a3e + 745b80d3a9d5ed2adfabd5d429956d98 + + af15322df72c95292d138bd418ed1a35 + + 3b3565c992a6d96ca9187de45e8c35f8 + 08199ff1a6bf09aa7c2a99315736d5ba + c0561c9e2e60e4a237d893d1ceda3d6b + + e2b08506836d71ade1475ef63c2b423f + 3f36fcb3a945b041bb092dbe0583c7e4 + 8fe66174e2e173b2ba6895abd7cc68bc + b7bb88ebe51478488e26cf40f9cb8763 + b7e030d856c6019cbad2cc7a43713fe5 + + 78f12116cae7bb73379404aa77040ef5 + a35920ea09b7c4192faef033c0b36c50 + 58d5110c6836f0d26569aa750ffbf85c + 03e34b46b50d113e9753e2193531f89c + + + 23c8e65278c93531e01a0715038c338e + + 27fd51eb99def794c4e13fd0e825d037 + + 87aec5a94c94ec7a5dd1c0839eb0182b + + d41d8cd98f00b204e9800998ecf8427e + + 8fa14cdd754f91cc6554c9e71929cce7 + f2dc04afe0e9feb58d71c6504df09d9a + 87aec5a94c94ec7a5dd1c0839eb0182b + 87aec5a94c94ec7a5dd1c0839eb0182b + d41d8cd98f00b204e9800998ecf8427e + 5746e23a9bafabb49ff10a55337d9ace + + + 31e7fe388b061bdc3f025f3c50df39f3 + + 23de94f34caad1afbedc238d17f3bf5b + 3f8ea3c4db4cdf23769984d6c7f33fca + + + + 7782ec32ef9eb819729b9a44df0c63b3 + e23017a63a6042b2cf679016493f50d1 + fec7444e4638d7d21a970d41de8f68f8 + 8e4420ed862ffac33e71defdf61bfac1 + c4a6ebe92003ca42051a0f947ccfa11a + dce9abc719800a09e32adadc71c3db8f + f9e3178f4705d1ea13b60fa4fe9aa8af + fa5f82fa645563139ce471e760b174a0 + 2095800df5b787586eb3cabdb2f7ff9c + 1c99761ce2d931637ac1d7c0cef6f8a1 + a2fb6badc704f2b9970615e628a74e61 + b787fab1521df8d22da81ef67c99fb65 + 69d1b253666e41df11378ebb8167a680 + + + + + 6aa52ef44ee608f28164c6b0ef216a37 + cc2a6a368f52c44202497709ec6fa126 + + + 9c95919bbc6a0a1c3b0185e2cccac054 + 6cb21455b3bc90819525c491bc6ba44f + + + + + c5ba7a5a26752c83c707efe96c99bb49 + 15bc187c566e187f4bb47ed45e960b1c + b28a293cfbb632f28519fc9ce8093e15 + 44c83d5f8dd44b5e5ba5ff0fb8c6f666 + 4916ee334255172422a5f3806a5694a2 + 5852e596fcd1cb6b2ce07883bff520bb + 0ee313b268124549c1367a06b96e66ed + 7cf598875bdf2b498177c3089bc7c76c + 7319841875a8a3e16e943824ea820c4d + 5bb08e21728eab49b43fe1fd112805e0 + d8e834cea5bb29fbb871b7f4ef164b65 + cad4d22c6609130759be5f032f9b1eb1 + e3ec31fa4bd013ade31589f92ab0f884 + b666e0f60f27017e84d1713254615e9a + a6b2c02f6d8fae2016df673eb5cc951a + 266a33666fb55e20064618472a3ef9ec + d523b71874f970bafbe841d5872cc463 + + 2cce81082a40c13a3ca07e5fb9f4d47f + a5096934d1658acb21838f7b5b0fbb5d + 23aa1fa8767d7265ab140894528fa572 + 24544334a597faf148f77e3b106b74ff + b1488b42d7694ca2343d6acac2d7ed59 + f80c5a84b92dd95405813e86e9c40e0d + 9f115611393b71e4ee4544748aa10ee0 + 50f805afb8554e15f21ea5f61c396493 + 7de9dea11e6979f757683518b1edc47b + c20df6dfa2c52bd0f941f47fce26b11c + + + 105f3cf01ce18e8097f03cf08c26ff8e + 5bd80025842bf461ab3853577142c662 + 5e810b9fdccc0c93ee2ea383c83eadb0 + + 0366c4820d1bc624c9af1039ae7ec943 + 99f728f6c81dde19fd668378b4e9f08a + f1a6d9a371c4f9ed2c026172837aee8c + 9bbb528c02e910eeb0d9f04731c38b2e + dd68594d44f857445763c82911d14a53 + + 8dbc72fec39a6cb2e6c6b9986e79199a + + + a6f54e90ddedf630396ba88d3748f058 + 22708543fe14396b43325b5d607a1616 + + e647a78526ab0dfcab1fb6ab7b27210e + 86c77100f25a430c0c254607a0f70147 + 4d3bd7026985e0dda5d57869e43d2fdd + cdbfab39d8992a985a160accaccc73bc + df5d994da2cac28f0f577a0f89b4dedb + ab0ba2e33118d0a98f2e72ebc88c8b66 + b7e8d74ba3e3ad73f9c15fc4c3bd6075 + ba50fde1dcc0533b7d998f8c1893a4d2 + 7c05623df4849093f788e3a67b0ad892 + 01bf9e6538c6bba35911de46c0697dba + a2df1a96f26fa4bad86e236ad2bda0ca + 348779babdb5a51e3ca97fddf41bad0b + c74670dfd024ca2e53c069dcf3ff4f52 + 3d57b187e948e416b4a9a477e33f1f99 + 1e034dfaa6548c80e98b6e1084527ed7 + e148167a73c93384326137ef81926bf9 + c0ef0c9dbc4b899992d60d39812a0b79 + 253f016ff3a22a85484cbc1af29957de + cd8c6aba3db90e11b0d608719e65453e + 237b0c0e829172ebfe91ca3662d383b2 + + b2611774dae30cb84e768f46046ac8f5 + cf845a4c5831fec345224e8767de7443 + f94d5ee81eabcdb23d6e3d0c597a79bf + 99e2148efef625a40b50e661b606b133 + 5d619ea82a9e82e43dd7855be05ffc01 + 7daf9c2e3f5ecce07d1a0ef8032b30b5 + 22d8dfb2946c703c21d7ee5646dbec59 + bdd2aad41073bb0e315c2303f3f2bbef + 88bfbece962955262d89297774c0104b + 41abf51f562b8a2cc22e0394b9aad567 + 35c4d945c58f14aa97d433d0712b8474 + d1304202889f7d05c2a7338e861d6daf + 9c5fd1f58862be2fc00ed990f4ea0c74 + 000a667663c0d642c17e43c937e8a067 + 8fdcf9938ee1c849f2513cdde6df7669 + ee924b22eb93d2a1a9aa77ef5e2f7541 + 025fe1cf7590fafb2c5f4820512426f8 + 4bb2b94958ef2537155eb5c9d5a9261e + 959ef26de4ee686d83831d4d29dc6db8 + 6e89f823cbd651c170d38ecfae133995 + + + + 6300024ea4e3aec0efe8495d3aa8991f + e6a3e74caece3e010ee31ebb3ad52940 + + + b4739f6f38b2e7551b72b4f5ff29b7ed + 5223efac2513fbf0e0f38bd991206ded + 00bee444776a622d7e8b64f37262d282 + + + 2ea641ee680796cbe3cdc59d8abd8b55 + 49b82524ce15adb45798e8d59dbba600 + d0ccc4f26ea62bd6a3d1c528664b49b5 + c128c3b99e2fa824c07c04c25f88d4e4 + + + 0a95f528a61e2af01036d07987a291f1 + 19ae580b11f25fe7f81137c6736dcfe4 + + + 1335278eca505365b7208d74592a1287 + 8c9d1959bde34fa096b1abdb08d69798 + db0cbb6c32aa954b8b01bbe96aeac480 + + + 8b937814ae6b7b342d72ca69df641f63 + + 515120f84d380f00c97906be938eb954 + + dcce26692fb7dc89f442bc8ffc3ab051 + 3cbcfac5aa0d0d92b5ffe9bfbdb4379d + 54d738e6d47cce96f109762983873cb7 + 5e3f8cba1a293dd81d9342933abffa0c + a0d7ce78ba08a65e2a871086da3458fb + 0c9841f66ed5b55644a0badbeabaa2df + adf120d796c1691260a34c3967c8a846 + c4b11223a8af255259d9c6fc229ec56d + acc3ee1ddbe12e04d190cbd43475c3ff + 31033f8519dafe7c434e800f1ed0630d + b2587a666a64204f364eb9f824ae9f48 + 9c8ef61a14b910d65f497c462a699d39 + + + 319fec1e2819a09ed306cf8f6e2242a3 + 7aea234511a35c13d63bda91d0a73486 + + + 2b518c654724581e8ad6d004fb375a16 + c74baa54470f7f3b194dea4c556b260e + b220e3d343b021def9554ee43aa7ce4c + 9aebc78ce39ee659580ecf0e980bb89b + e2f73014aa8cd20b9980422765808e67 + ee71d49ae815ffac082b5026cf709bb0 + 78fa8506566750d70c05357e37066258 + 5e0d68ee5b76fec5a18b8a05fdf2a669 + ae39887e61095df772f31065b5915c75 + 7535ad3f0c905f2badc552c1b20abb30 + b486377aaef50502c12ec37afc1d1eae + 110700f70bda5867040e50a98e6ae782 + eea77a915bf25a3b1c967e32336b6bc4 + + + 0fc3d43e6087b1e0829546e70a1aeb52 + 51038765bc05f25733a9047ad013a8e9 + bc6bc1be24d2ed1debb38ccc02684b8e + aae774c8c1c640f429459d3800a02806 + 5aed2612165c132881b16ca84a26fb89 + a2aed9669dc34f1650360dc9c93e360e + 69d90bfce91e52c9fe8b935e96d330fe + c1d29c46904230bb02838180c1143279 + 5b19d07063f7398f20fa7293d35281a4 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 092420186a21eba805bb54d2a56c8ecf + + 111656c5fd30134fea0fdeeb66fd7f2c + 7574c2c7aa6d19686d8ac84cf42306ee + a721eaaf9bb3f07db5c68c52c67b621c + 9d7e4ee7649d5f575f1d160f4023b1a4 + c81db1c403b41b65ef6ffc5d513af67a + 989ce4130a7826e8f4a51d5a2c48d774 + + ecd25418278a68404592b02801c35082 + 4d155e27f1db7178f7695a1f9f0571f4 + 827b6444ed93a98ac9654bdb455d113c + c3254055e5707b25e390b3aa6b2f6d7f + a43b015cfcf52ad4e0fea2963088e8c6 + edc2ca6da7c583451140efc6e3819a84 + 1cf7b7f9c44544c547dfcb13a2496fd8 + 9c6c5f8c52f6f50bd876ced4d2e3af45 + + + 0ffadf27ac326facd5c62a19d6a7d84f + 99c9b5242bb164895230d0298c178d2e + 61fa52f896a1d7da6109f0383766aa16 + cb74df0a457060f63b494671fc7a9bc0 + 67ffb779729c4c1ac0adf20cb644bcc3 + 8b7b038745598f87d3c81332a975fe3d + 8cd3615004685579b2a77fd24cef7713 + b59010b236551dc480955450638c18e2 + 638d0a861e31eee1722572350b3ab20c + 2678b6ca5382d4e744784cc50b9be2a1 + 91c71bd11b0d0465d701d4b638840cbd + aff0d45ced6de48c385cc89c60a1fe36 + dd9316433cd92feb704e0e69204a924e + 239eee4684f027b8ec776a8f071624d3 + 84a5f73ae2ab027e0b5e9f978ebb3f25 + 4e6e4cd522dcb11c56d5331486dd387e + d70b33fc863f7f1dfcc06aa5152c5bbc + 7f4060950a947102e9fae7157b50eedc + + + 0cab08417ead5b6142f335d9f119dc40 + 21d703b79e7b261f697f5a91b5dff7a6 + a34fc727021a685069636dbb51da5f95 + 97f15acfba50bd14cbfee2a81943a4e1 + c843af5fce1d4fa643bba1071a9e813a + 081521c18f8c42d8a85c3b352e9a17fb + 7f0c1e8d297b31ac3bce0be4ca34f31e + 0043cd465f7361673c295c37e70eee56 + 27ced9278166657571e8c18ca75deb36 + a4b7a431d121a94bd622e77fca271b1e + 69cdccd7a9953e3751614a3a6277f5c1 + a065d59da7a193003d83a90a36441cb3 + aabd8730ab5d2f826b3b61047b3af0c4 + 077d35a1a77d24e82034cf601537234c + 1eb6cc94611a871950091a5440036072 + 97ed678116d39147d246007d35335932 + 7b3643ac0d67b491db2ae3d55922ea7c + + + f5221a10391cae5dfd118ce36ff44e92 + 71383b6093ca7f08bf119f8c86026c06 + 01c3e466d92c47dea207a8ab0ae703a4 + a76567fd563d0536aed0fbd7d6206dce + 7358b48c1106ba54d9d1213d1de9e8e9 + 9f71b5541e433c86028343d1027ac36c + 8322cdd8a78396d420af53be78247428 + e884c969c23ef4bc24ccb47001a8f18f + + + 4b74192b5da7902db06b0fd0dca217ba + d95acb4dded48e0bfffc623612f56620 + 5e5bb71a370e9d92c045663cfa214416 + 68a4a4387a7dd303a63e40ced8878582 + 2cc6efdb50b4c00056d656a1a8400b17 + d1639fa3f77a5d5a2f1d27cf008c2405 + b372fd0fedd771195f99238d2a911ad0 + e4948ad32a1db1be01c62966f3422f33 + 492476a5f3d148dabd9bf5e436e15b65 + ce987249e6d5f38750f1fd89a182e900 + + + bf044bcd516c628229a811c3e40891fe + d3d6a5b934984448a3389c8c580a326c + + + 8c4ccc532dc6d46fb9c9355c5ea50c5f + 0f545442b17d3bb362ca6f3874ff68cf + 095db9ef93714139e07caf19515df7cb + fc9f808ddc0a5283063a30dc2df974f4 + + + 781ccf815160dd0581d3093fdebd6736 + + + + 40662beef29cad221f1be9bac9494fc6 + + + e5b364a65c9be51441601bfdd37e8144 + 454d8e37d0351ee0407a217b92fcd38a + + + eaa860c566485027a93f33943066193d + 6085909277442664408f7ddc7a7d0290 + + + 69a575606d8b50a1df2af8562f80b68c + 502ba94c2581db8b227f15a177a47895 + + + fe6b3ed8e03d041b396b33fa69a9e488 + + f5de134a7a4030775562741bd03b7421 + + 6b860ba25ac28f12b911ffaa13ccaccd + a7c64ebd69f05121675667f4de12be2d + + + a0ed66d93aac302df2f2a882bf0ec10c + 29c20f1c80838a631cb76fe342138484 + + + 34b292a4d11b13e2fd6f1400ddb5aade + + a2de39b456dcd5a14316f932e3b5b7d0 + + 2a5fdbb0722226dd9f34d4228917288d + d2a323a6fe29a0a3fe0e989347802066 + 6cb89fad00c520983095eda56db2d133 + 81269f9f002ba231c3f5cd76396bea75 + ca479e31e8020343fcfa1ea2e68ffd94 + b258c46b9554c943f738f74cbfe25d86 + cc124b510ead31cdc75911ee3619f249 + 1ac0d1a22ee8ddbb53da1aa6f6da71b8 + + + 0409cfc749926803b0239f01516157d7 + a4116103cc7b8fc1de55e8bfd95d2511 + + + 1e642e88d78fb5e2f762371f72d458f3 + ae4a1296396c1d6e7496dce7b1754adc + a4d1119bd53e33c3fd72aa42aea82bd2 + 01ca35c6be1241768c518c43a894b949 + 090989521a85732f93168ca29d41994f + c43c0dfb304ad9591c586ba5ea7aeffc + dd985b912cc72f2972839be8d94bf70a + 27b0fbeee5349cb6a980162cebefe359 + 61951a8a360abb75f422e0362e3139a3 + f79d68fc9e1ec2418af38af1bb91183c + + + a339193e71526660e4681a39c08c8719 + e75d2fc488026310fb1f6a888e0367fe + + + b3282492ad7f561caf3c246f7f080e01 + e772aef78a1778a85d6edbd9865fcf88 + 35a734675c8a0eef9bf0bc0b6b6ba524 + bddac36d90c5b49cdb79df187aabff93 + abb500b525ca32818158243f11365e3c + 37bb2530a7128268ed54627385e8cada + 27fb6905ab6cb65d9a24e66c266738df + 1650314bd532e6f43227d821556238c4 + eaa7c41df1b4bc6c57b66cf4deef82cb + 5e7287cb49a7263f6f68dc79471b524a + c934cd20eea717815ccabf0c3207244e + 2df28f729f8278134dcdcd6ebfb22efe + 97df075fe9dedc9ac22235595a08cacd + af733da0224fe28e0e9debaa095d13df + f4dddccad860bc96e83df9d9fa1d630a + + 9b3668f569ee1d20d5cae860f643fa9f + + 8eed43671a225789cafa3209b68faf4f + 40dcc31c40e014dacd075c9d1ae7efbe + b7cdf04582872ad42b9ea799031174e6 + 0bef6f5a1007dcfbc5e3264dff31b2d2 + b36b9a8325c8e894ed7b80351721026a + 0b38606f9011a85b55dccc9657762775 + 80e7417e7503ea7a3f4781110a80b09d + 997502816eb73f6d502ed552a22fb79f + 2e8d5865d3ae62d0fc8a5832d9350719 + 08417993d977234dc4c427aa3d63b17b + 9f0e9e5087fc1b718ce1e6fb834f8224 + 4f762139a0728a86b3a755515d222b6d + 10ced3c9cad552ed4b7e9063da6c3791 + 4f73c4c6427d9d55724f28e36ee8fec7 + ead423beda3f8c3a1bd3cee8fed5cf8f + 4d0acdda8cc2fd55a536a09e1986c460 + + + + d3d109e2ff09883fe8187752a35b7b22 + + + + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + + + + d41d8cd98f00b204e9800998ecf8427e + + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + + d41d8cd98f00b204e9800998ecf8427e + + + + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + + 5924c143c198f9cf0fb616084898d7f1 + + 576edd5b8b4d6c618467513ebff982dd + e4bb7f686e162a86c0b4e659dcf56ea5 + 6bf7d606a012876fd6ee7c39a54d5412 + d2f7f7659b44d196d8fb4ce4511044b7 + 1360f8e132a248731cef1c97b04a917b + 5962427e8b3c7cd43e40d0701d97947a + + + a6e7ed6bb898031e09caa1bf0b2f9367 + + + 087e3dc7776e8d94ff7ae2852dc912bd + + + 25e7a193432f617605885303449c01d3 + + ff9ff2a92f765d44e9f66f5c18d2d3d6 + + + + e2b6b77bad66ea379f550eeaa0c99476 + + f29c9fd1fd09a8d1aae9debdd21463de + + + e8bdce9ec8eef2021ca4b1b13bef9976 + + + + + d41d8cd98f00b204e9800998ecf8427e + + + d41d8cd98f00b204e9800998ecf8427e + + + d41d8cd98f00b204e9800998ecf8427e + + + d41d8cd98f00b204e9800998ecf8427e + + + adf0bb8ae1fb07d43214ac599dc50380 + e5fff6a005595f99d67314cefb2cb79c + caac83e9f7141808a279c9415b3d631d + 6f2dc7f0e9be6edf96dc41aa113daaa4 + c959ae8adefc016302b21a628a711003 + + + 8dc9e24b99b9fe6cbae5fa70fe5b3e46 + bfb77187af126102d7ada5928cb01925 + a23d2e602995d0b3a569331464470b99 + 8fa2a021eee8cb8a54cb71085d257711 + ba38ef9dcaf649fff9e06601a8e08672 + 5cf9b5aa7e1d97b3aa588ba7c7f58fa1 + + + 645bf57408d7405f5e8fb4a3240c5d86 + 2dc82fd1133a737bed84e0db9787732a + 86b67635fdb33bb5d314fbf49601c069 + a8c1ede938473996908c69be8e20771a + f8a816bab51a7bd0334d7538a004ab07 + bd4b7a66a67ce4eb70091a5a6f9c0d49 + edb7d86fc0f5a0d6cb2ab7a8007a3d21 + f53a254d962c298e80626fdd1c284bfa + faebf142ced9488a973e1267695b0b8e + + + 25140b36af7d2802bff55909e894042d + + + 2cab400babf8105f0461ed73ce2a3202 + b902cb987b39183bfa88c4e37ac476a0 + + 64fb5bbd413528cf9a17b4cd1a0d1587 + cda542e78899af9d0e58f472f4ff9469 + 63453ccebd11704e8e84f02d64f2e4b7 + 29a2da70845468deb3211ed1e45653f8 + 7c7aa0ab4a433732c0aee8968d02f858 + + 35de47a9f6d99eda668fe76665f48475 + 8232dabfc02d6446649314e7d69b370e + f8183e64a8fa25a977564cc78164d19e + c3421b5df0586cfa7247e67205a7101c + d3729c54fdcead74ee2ebae1dadffd78 + 56a4797e18925cf2d774b653aa4fbba6 + 921d5be53cc33a1c34b59633894e7c27 + bd0fb0e19294555f6c4e8ff768d72bd6 + 41b9c2217d18c8ae382b847a3af80bdc + + + 55f131de86a9cd125034e7e34c087439 + + 58f9e734c4cd5d0585d585be6e6ea020 + + 597bc7da3feb66d5e0ffb4e9519e0814 + + + + + + 7852d1a03c12b68846cb24088412b781 + 655515e5d4dd686e5d2c84082126141a + + + 9b6cf33784b75d9a8bb53f067a523a79 + 7352c934ffa2a158d6ac6d622e0364df + 59cb4a60f11f3ad44d2a70d8b12768ec + f7269ca3efc53d50697ef2b2ae456dbe + 89d46d0f0214de210532b3b0938a3544 + 92d894ebbe19197c97681259ed37a2ea + f1134cd39474530a6966456e3d9d4711 + + + a2632a9ed6ca8413336260e5481b9af0 + 9d437770d9f395ae2874bacd85a6b993 + 0cfb0597fb0be8546aebdcdd92f465c7 + 1a1dfa5ea8df8764f438973fe7512df9 + + + + 2762ab6e186a8ee9b154f70f33aca26a + be0be356bd957495474bbcd8889a5153 + 055c84ec73b826c75f75a0d6af220464 + 1f716feecdccbc0883b526a91b39042b + 46343aae710b0cc36b4e52754a53ba7c + 76e1a546ff158dd338c6efea424964c7 + 14957f843524e1db3cb62352b1910d28 + 565558736e3236a4d4bbeac9b7022be8 + + + e1bef31c4dd5ccc3ba52df1ba88cbf2e + 8537a861caabc80d8ee859fac234a821 + 5d4e6ea9c82e1f6bf166cd50777ac579 + ad471b9530453e2816eee5a4cf037dd2 + 62623f79bf7d8b5a6d140fdad019e919 + + + 9b9c0ddb00708bf00d8d8feee156657f + d29f63a9c698c9ec6eb5e347acdba8b4 + 8a06c703b57397f17400001a68608fdf + 427677053dc44cbb53d935d3133a81ea + + + + + 02d783229f384a3b1b391de7458296bb + bba6140341303159c1d007d9de1d9235 + c6e6ae6eb0277efc0c22d1cc354a1f0f + b36579683fea8b1f9820259cda1b844c + 8aeb522fdff376a5907d388aed318f35 + d1c1f5945afa4eda54b9217ee1676672 + f27ea500a206450c1f7371ebbc71beb5 + 31fa6ca467e2e0d841e9aea9de367938 + 56928d52d0b766c8bddc8a535a3510ed + cb24dc00fc2746f3ed78b0239604699b + eb49c8d7215fd4f1f4e27128cc0ac671 + 07b1fa9cb20924c83b3e424db799a47f + 401446e194a22be313e1271e4cb27492 + 412e2a100f9bd2f9e622336de9e24a4f + 06f1524973104b0b64cc3bfc4c61083d + 18154498cc5d890e80461f524de37836 + e6b9df6df90a4bcea14bd950894c348e + + 96ecf0362cbb0dcc6d561e10f3e61b8e + + + 84d60b5c0f18826c33a776fb2e7a69f0 + 8c19ab023d7565370f7018e93f69f816 + 73b9a0830940280ed96aed8ad525df18 + 76ca1ea2f24608fb1c50a34afb80dace + 9ec923ed2d7d2a02cfc8960e449016ed + 4820d9ac4a7792b35c57755e0205698c + 29468a6928f14e19bd5102fad076e6f6 + 5ac2089ec53e2d7fccbffc0ab65f9979 + 0138dccbe2ac1a0f9bd63786986b86a7 + cf1c6849cb891b6b0d0c102d78ad3b7a + f8657a191930703f766547a7dd484f59 + 4fb55e3a5564623b5450cad2e0bb4545 + + + 5a6499bbb284dddf64f6f6bc00da1d33 + + + 021674d83760448bab08cc5341fcfef7 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + d9f1fe900c0a45d78e11fed6b1497f30 + + + 490baf5b4118f38341fd612d83005d67 + + + d82465fe74d467005a1c622040652a7d + 86d9cb00cdb7c8885d19d4b9b1a54cbe + 3c6765dceba0a487f476d3d026ebec72 + 7bdb07c244d476adca425969401e582f + 4825dca973f51438dc2f3e2fa4b60723 + e89805e3e969e7233b58eb6c60fc7c31 + 240bacb2b304431711c5fe70e0d7fccf + 93abd2cb2a3b117b403c5ced9bf1caad + 213ee3ef28a2cb334255f26c4abe1684 + + + + fa63ff5c34b69e9d42fc02ff4aa75d30 + 8ffa3e0a02ed1b5bdee3be68c6762526 + 3dedf09d5150e127fb004d11b2e04b7b + 9fd7880bacc5cb582672536277d85bbb + + + + a314075267e0e1a1d02d9b9b7597a918 + 2b6aacfac5233c1cf51ec76cfbc6986b + 9364b4823b7b80990657464b6cad9aa4 + 0d4237850d0935b91bb98137016bf089 + 61d04193d4d65bc8d62e71ed1f53ee00 + 8f2210f5e8c501f4ba3d2173f959072e + 762aa76763bdccb8c01fa6d565327406 + 0e9ad59a6fdbe70a16546a84ef089ae0 + 6fbf4580408031d6d1dadcf63cd4356c + 24f4ff2122b2da84d78a2e5d0a289ea9 + 92f45961c57e6b4559f61bce650f47ad + 0e9ad59a6fdbe70a16546a84ef089ae0 + 90d659d9ebd5233df2870e612e55ab0b + d5698b34a0262a38cab479ad7fc8ca76 + b70bf7d3e82c24c43dde9a22ae88305b + d96a5cde4c888c1a24b127b4586e433a + e941aeb79eb6ff5fd3cedba3b56621bc + 1fa96d52275291376129e8dca090abf2 + d25eee28081eb3cc7b44791fb3f7d0c4 + aabcc687fb8d7dd984f4d17238bfd86e + 14a97fb5df65e64a7ee7acfb982588d9 + a0c4c32cfdbc17b6c975634087423700 + 14ff377e71b41ef6a16b1f9c4d084b48 + f42ffeee4a02ef3e02f63602e3b0f570 + 8f67fe114fd8873780a7bbe8ea3df4b8 + 014d10f5b361bde0809c1b54d3d82ec6 + 0f294ca836e0a9e075a6dc2ede8c9497 + ddc9a362203563df457b03cc44f4857e + 5f70a2de05b118bfc3aa57dad7309dc6 + bbb84e32d086bb17f0496b16fb3c1c9c + 751861a04af39f6dbef3d49c789f737c + 1a65dce1c397b1303b13568a2e6ca7d3 + e88feb23812d617a644538eea8434995 + 0a0edbd6336c5059e7e032ff27750644 + 15bf65a8078eea003cbbf87338aa5cb1 + c5b4373d96a357df58b6e43ca6b6469c + ca680e1d5fe9b0b50170cf650119dcda + e5fd69ef4cd92e402b57db90f1968e33 + ae9a325c1002ffffce3e288030a57ae0 + fbfe447ca3ed1f50f240ebce2b96f872 + 9f586f7f7996ee1cb76ac0ee46f2307f + 2b6aacfac5233c1cf51ec76cfbc6986b + abde9be7e9145f90479f30ee63dddcc0 + 40a694de4c66665502280cbd341418a6 + b4725b28c77061f0b59b755e7566f6ad + 8a1b2b7867029b31a6ae01da967e6a05 + 8051366f3cae950243da69d929d0eae8 + d202978df9bffd2b7d26f85d66405803 + 3bc30a01917ddceb10bf54ab04e527d6 + de8962407d92d30b43c8d28c45779c7b + 866a2dae4e512019274fb62b0fe8c512 + f6de7b0ee6f2dfab9b459107ea8d5d23 + 76ad3c545f708cc9a8f7404ad6be5593 + 83f272630499a80f4fdca30d1763230c + cd1f0af8d927cd8b8267b61f0c2d4451 + 2c342149033ae05c393df63704bc7453 + cca8bd334dc71d3f67544da1a4e7020e + 27f7d81a14432e588487d83e381a889e + 096ee7c22a8a3dbd3e93a8e222165c12 + 5489242d7eedaece843d96322b448893 + 7f5262379aebb30b80fb11d4664f72bd + 286c95ecadd78f78c7377185474b1d1c + 0e9ad59a6fdbe70a16546a84ef089ae0 + 0bb2b3cb14a2c1856a2db8919616961d + b2afb3a9ad7f770d0eb96073ac95b943 + c5b4373d96a357df58b6e43ca6b6469c + 61d04193d4d65bc8d62e71ed1f53ee00 + d2ef653674898074f1b51a188b6f6329 + 4fc16057f5b369c2e3c6986ecf8331be + 36140b930b84bfe5ddc2860ca529fbdc + 19fb6e6ffb7dfa0720baef98332580d7 + 2afbf612a6d3cbf25f7c1040fc1f9979 + ebc6470a18ab25a363771a33f5086f07 + b0a297893cdd1eaae7450296b8e996f1 + d25eee28081eb3cc7b44791fb3f7d0c4 + 61d04193d4d65bc8d62e71ed1f53ee00 + 2e4e51baa24eb713950f8ef63eafea99 + 681c533bcf744885a2c1f95305376c02 + a29e933cbee25b84d38967fad7877694 + 313bfa34cc8db5c28909e3a7aebce4ae + e4567aedb8abbc8bbbe1b8ca6669e71a + b10feff3a979ec5ca36c17cc5d1cf17a + ccdede157c486eac131cfea9e241fa9b + c840fd4059fb3bbb83deb3ab531e3ad3 + e3cb487247808095b54bc590ae9f815e + e04c77d21f71e7725ab9bc58873fceea + 985ae232decad1347e6c1c20280eae90 + 41815852e0cf5e830f2127d7045b02b0 + e8454485176816af068cfa8666c4f17c + 9cae855d5a465a65b9f670a6d83c1e91 + cd1f0af8d927cd8b8267b61f0c2d4451 + e7a450bd76f7f2425453be5ab0893d27 + 341df8ee312c66b20cdecb31feb072aa + b986d8438495f81d6ebac971cb7bac86 + 89b79816d0b3470a9bdafae20dfb39fc + 49e4c8edf3f048c3e4b25c70d9b4375c + dab8643ef8bc0aef1315a56b874a52c1 + 32f1a93cddab3e28b9aa8bc11f4b72c7 + d60a969581d52bbe635d21bde49590fc + 6f8a2bc7e31f61522ca2bdca26f29980 + 28c8c2b468330088335671782ddf52b7 + 4970799ee0b803e5ec133461f217420a + aee4007b53f8a345ded7bfd09768816e + 98b11993cb0ffc539c9b56cae56ba20a + ff947b2204a1136546872b279282bf26 + 86626b2dfdc4f7a962be0e716ee456b4 + bad5bac38377649b0d0db928fe1355b6 + b02d27600ae18738a4936d45cf617ca6 + 1978524ed5a69992fd7ad9076be8977e + 0616ad16869b5fe57e2910857710a8a9 + 379c3ca8b43868c7569d5743e7fba49e + 24f4ff2122b2da84d78a2e5d0a289ea9 + a0730d8befe8ed0f9cf7397f321a0abf + 0e9ad59a6fdbe70a16546a84ef089ae0 + ae2e663a1bb8be750d9ba355d3661362 + acb60bb9e444c35bd55a85d2351cd32f + 1006fe8447e2b891f3f0526c80759bd4 + e8b53411ee810fc1a70184a04ee1b3fe + 757bebf27a84a136187cbc72ddc2dcc5 + 2bffb28370f6f8a411d34aef27a6be72 + 70a34fd9f0ef72f70d64abaa5abfe73b + 044db31de9c72e8292cc78a4a9ab4b18 + f39049145a6431da36a4c1a7642863bc + 2387e885aee9c77a7ecff897a61d51b7 + fafb4aa519d61303d1d9c2e576e95adb + 2bb00a344ccaea164aca5e0c53c14635 + f5a3715859793eed0d96b3a8e77823b1 + f42d2d097141c9b7d2c74eae291f1a62 + a76358dbadccc72dddf1baf95d3b207e + 63ce9a40a873cf465a19d456f8e309c4 + 7696b682ad135f54a731616220285441 + 265107e67e1be295c35de657558cd79c + fc82dfb90563c4da32fdabcbf1181002 + 61d04193d4d65bc8d62e71ed1f53ee00 + d47e5d3dcb68aaee97d8498d3602cd02 + 536f77f4f451db5bb29281bba2c568c0 + 435ed24d62611651868ad78399a72628 + ca26bfc32d83e8d24b2cea8acafb21c0 + 26affedcdbe4f53a898644fb1a6a4bd1 + 8a5cdc393845f32f0d3ef60fd9ff1b7c + 6ee1e432a8843a05e82eadd78fb14783 + 9f938b11b4852f85c281323ef185327f + 3f632003a994d7c0c20116fe63c7fa44 + 91eca8081539695d8947387c1cb6f1f2 + 8ffccb6ab91fab327d6ee68e9d20ca46 + fe4ba8ad8965d10f2382dd0589aa8299 + 5d49bfc1437b7d3badf50d2361717486 + a997888c86fa0a644f87820083caa8f0 + 6c55f52f74117a7912b6c5698f6d1050 + 8d7c9a97d33dc59fae98aaa1a0303933 + d25eee28081eb3cc7b44791fb3f7d0c4 + e29b488e50fd3aa3c4012362afd4da87 + 61d04193d4d65bc8d62e71ed1f53ee00 + d40607f01a0054de1208fa9a145965ae + 7651926ab25b22d692ed6a245f0c4a7e + afe4dd29379a463870f69049d0f22a57 + cc65dcb7e8c99f0e9e2a51afa8573c0b + 24f4ff2122b2da84d78a2e5d0a289ea9 + fb22a85b1e86f476200b6c56dc305b9d + d7069d34e5539408a7ef171ce01e9e32 + e9f4e845fa68be0ea071d97235174c75 + 40bd0f36c1ee8688107a566aabf2e6eb + 5591f00c0dcd07223a02d5dfd6376679 + 08fe2bb1c9bb5e69b07c8f039f53485a + 5b9eecb68fa5f3df3bb1ef6cf27ec9cc + 75d67a1d2cbe4a1d8a40b85501d3d3a9 + d14c8a07b0d6197ed5d38c1441ca96db + 08a582593abebe3c4e9ed3f375c50415 + 36d3a355ef3dc6684a37680382104c93 + 3f632003a994d7c0c20116fe63c7fa44 + 79129429879a9870c850c86931a7a0a2 + 95b012f6337367c6808c78a36a63da25 + 137dd1d6e937a71a0530f66b8dae8041 + a52622ffe96151632bb04c12438e2e90 + f2bf5371d6416e6e213b5b2e034e7b9c + 0e69b94ceed79a5a4e8a4db5b52b6957 + 32936454d20b479ddd133c956099a456 + f66d1796a7a7fbba60dc1fe5a92c04d3 + 24f4ff2122b2da84d78a2e5d0a289ea9 + 69052deccd86d1e7f41fe539bbbea594 + c36044a4b4e5ee26ef4d771b42d5369b + 866a2dae4e512019274fb62b0fe8c512 + cd1f0af8d927cd8b8267b61f0c2d4451 + 76a14a6f8542572534f2bbdf44e922aa + 67be5eb10c188c3ae7ca4980027a73c4 + 24f4ff2122b2da84d78a2e5d0a289ea9 + d897e5e3a8cbc58e132b678c8e85699e + 9a2a69708f9319b2e6c1c0084a1763f1 + c2b96fb1d4a717074458dd74384fb1c3 + 2b3773a7a3ac66c582ed8a95252f5971 + 9d5ce4d739dbbefc7b27cac37e724cf6 + 305957295ee01d0fd3756f9a51812ba3 + af9fd7db429b64c9dbd251b10c6c6a17 + e00181d41e2244c9e5b56d2cf92056eb + f84e5c7c965b7a9a0a2dfd204e87f2a1 + 4e951544b16e39a2cf827b2b0fb8d860 + 5e2fdc75156e94c49a6fd0a647cf62bb + f0d2701db581783fa61b310cf5baaacf + b47c5ee0abd47162a46e797582bc0cc4 + 2bdc66453286ccf015798fd2ce180dfc + 93258ebc84c05ba10d2502a14979ca9f + e45174fba34614ccb83741675f752e53 + a0730d8befe8ed0f9cf7397f321a0abf + 9568b3672653f16b97924faf17272470 + bcb0752e23845994941878ba032eadcc + ea6d4468e7c073c34b7deeb13662d435 + 8adfbcf7cf5c9c3f443e202d9932d91e + 6f7fa9cb9a749c19d448618ae5cb6e51 + a24e642c5a7a35ff4d749773cb94dbeb + e8b53411ee810fc1a70184a04ee1b3fe + a44608fd8b5fcb35900987f761973517 + 340a7c2bbe04ab670b15122d9025ec11 + 114c004c39c9ef71994fdf7b30826519 + 0e123a55a7cb85ad9e14bf2fc7cf44da + 5f03c2041681fa8b203629e139163ab2 + 257a496a2086d62bf9e712ca4dc2f4eb + 24e0ce35a502484acf94d3de89489f32 + d77593a06d13e6cc25fb34271585c569 + 6fbf4580408031d6d1dadcf63cd4356c + b0eaf19081b027c3b47bf485c0f9427e + 93bce3552fef2af33a263b98964c94cb + acf1b8923613d62763933f7f480fa755 + 6dec8ca3d1c30dda234df170e1e01af9 + 60a4bb1c1bfeb02d3feb5b8b109ece6b + b7aaaff2276e27899a3cc731b591d05e + b037209e95d6a62eee264063e024f8ca + 8543fd33b803b5fa9f2d80619488df7d + f84e5c7c965b7a9a0a2dfd204e87f2a1 + 82d02e8f822364912f5edb8f2c270e58 + ff97461a188064bd87c722b90c30b0e9 + a817cfae6ab3c61fc3e0e745d6bd7ee0 + 83b9e44a30aaa4f25a64aaa01c051902 + 42675041938f766438b1cd665a0483cc + 169f8d11c68faf1a65090b21ecf5a26b + 36da79113b5f69385d0cf3eaac11353a + 94aca8575daa00d415735bb673899b7a + 82b3be391e21fbe96fefd8047848ced3 + 2bde7efb370cdd94b43c2c258bb5a703 + 9da8fb55ee497f8a201a0c7ea4d0943f + 95e51aa0eac6ef690021ee29f9ef6111 + b352866b4c1acf753aa7169ffba86844 + a72f00dc6ff059e64e9515a8aeb32ef8 + e00181d41e2244c9e5b56d2cf92056eb + 7618c7a9e530be20dbccb091ef205fd4 + 4c67690cdf62cba4db0d70eab10bc7f0 + 8ce1ef17b1cf44b19dc55e13a7943212 + fa7139bfd297a98eff23dfada720d5e6 + b2d7d65ab4a27469d2e49d31e1991610 + f68ab8b0c3d1ac87cedaa10f6f74e8b9 + 24f4ff2122b2da84d78a2e5d0a289ea9 + 5c2b3faf542377642127644d926a3620 + 0d121d9e7962647c90c29d11da4f49f2 + 76a14a6f8542572534f2bbdf44e922aa + 454d36a9bb30977d18b3aca23edba92c + e09fdd945e23e2cdc1e417c22437b4b8 + 37a33b13d1af4a3e0c991f494cad8b57 + b163ba834a200aa24a3733faa4445995 + 9d4647a54451175dd83565f2454461c9 + 2d6e482fb5b90d3ab73f0f82143a420d + 169f8d11c68faf1a65090b21ecf5a26b + b7984bec0ce9bad6ace44349f1f5f210 + 86b0785e693d41b4726acb06959611af + c90f5c88f59dc9dfb24839725a5b5c4e + 00de0d6ef5454c62b0a15f8144b55f8e + 0b75351743ce53f519b03546dda456ea + 8125466e06c74f9f7c4f0ced46037d27 + 846104dc799619a2aa597b0ca9a3006c + 9a5bdb7445cce3723c445592a1a04146 + ddd9265ce97205fc7abcda628bb8bf12 + 2287762c5da211da1a82ff9c4f1891f2 + e83381581425d2d144fa499bcd920de0 + 337b30ae8582983c9bd6e73015d8fe6e + 068f4a9e5fb071eb22cb9adfce465c1b + 52953e70b4ac93dbab520c1cedd41c56 + dff7c407ec1ff8429f655e94d48d2221 + 072a5724a6a888f79017d45a3934b020 + e899d4cfba038d3d2d00050c43829b72 + 9a5273a3998e2e952264d56480c2fad8 + 9f5da0f3f24468fcfceb5ddffc5f5c6f + 9e148c8557c37b1f600399662d3923b5 + 58b44948d5bdf4429e31e516da8a37b1 + 61d04193d4d65bc8d62e71ed1f53ee00 + 2754d735efac743dc39c3cbbf8f796a9 + 56f9c4f8ec92c04c2654a0bb970466a0 + 7fdbf36947166f2db66a6a922cc6cbc1 + 93258ebc84c05ba10d2502a14979ca9f + d25eee28081eb3cc7b44791fb3f7d0c4 + 0c70ac2b20f5ba7d66d04cf48c4d737c + 151fd65b97aec279a12d3b67551866ed + 61d04193d4d65bc8d62e71ed1f53ee00 + 983092e07732523e0e274df0d8f016d4 + c18a51b4c3451c92d14145b8be1ce431 + 8209ce5988bdce6d1ef0619c88a88afd + 09075f1608b83d6208d0b1da3057062e + 06b29c87c80f8201d4185188c7e73b51 + ffc544d7e933e354ad7344e86d4bcf6c + d79bcb20c1f6fa6d4de2df6481c0b6dc + c47152eb5979a37a6a770bbb33180d02 + 61d04193d4d65bc8d62e71ed1f53ee00 + abda55d7a4fb557604e316c977a38351 + 4fc1586a16200072724d92a734ca1bf7 + faa5696e215b47d8150cfb78e3bc2a49 + d755dc27b3e8544f9a6c1914046b32a2 + 1b7594f91a62f138d7696c6f6c5aebce + ce9c706da3ac8ada4f3d02068e35efd2 + 995006ac092fc74007f8688f5360ffa3 + 584e85700baae1b196382f347d6a2fa1 + ca5589d8ca25dc509433fe35a0a9410b + abda55d7a4fb557604e316c977a38351 + bef01c355ad0a8adf9c2dd6b5af0d14b + 2c530c788d85027a51a0763cd707a2f2 + 455f9f34163a5fc9c5a9a8dccaf0c286 + 875b746939e60cf09809ae3ba13082e9 + 463c7c2a5493b686030b80ce61a1faf9 + 2894de02b49467c6f298658b9b04dad6 + 41cc44985fe0e3b9f1065c3e670e66ff + d3764e0e41b0fcbd68b95343ea8218da + e613995815c973b9e9c420edf16b01c1 + f9a37ebb3e26c664932607015532129c + 76e8275accc83ed25cafcba295c24a91 + ee99cf31b21e8f3331a9d7df635af4f4 + be3e6b702d743e7a8df54015b136c234 + 941df4f17de46251ae1ab41fb84a3d2f + b17b56f9a7430ed138bcc82624bfa7ea + c22dbee401e50a7cf6eba0361941498c + 2723540f0b8535fae4a6b98b28d0795b + 39e3c3510d7a6df09a266a9bf84bb337 + ab6ae7b2a7253d03797c77a733e7ba8f + 1cdade82ae19eeeea8cf0afbb046deff + d25eee28081eb3cc7b44791fb3f7d0c4 + 86facf20654e95818dbe1e01a7973605 + a8018e7c694b63f0a0fb1ce4b94dd9d5 + 8209ce5988bdce6d1ef0619c88a88afd + 4a1461617b15fa5fe2c493996b540d8b + 866a2dae4e512019274fb62b0fe8c512 + ae2ec4ae3d5805c5b9382edea8bec15f + d39ed91ee94ff3e40e74bc1948a1b0f7 + 9ea50fffd6eb6405964010d1db003109 + 0e9ad59a6fdbe70a16546a84ef089ae0 + 3763e008b47e5ce27a71f7c2cfb63e66 + 16713d9a3c8802c91e873dd93942fe1c + 02dc0c392ecf7f8258e6965fd9871dea + 8ba4aa6d5747917a96e188941941ac67 + c499de795bd1de1ffa5b2b9b081da384 + d3e23d77faf51bea5928a0fe6ee4409f + 3fc212ee8dc1d5302bd5fe1e24798075 + 0db0e41131acb2b65695e4dd156c895b + + + 46de9b71e12ee6db75f6caf5e44228d1 + d2f564c963141a0a31011eb92f460e37 + e20006e39b3e0002cbb03f8b68a560c8 + 90e0987cf4942fbbb449b74899f674f9 + 08b0de731bd2352fc7f7dca3713ab7b7 + bcdd5da025e647913505b4bce94d06cb + 6a388c827fe153b370d67fd4f125b953 + e9678b7f120b1ff1cda69e3461245af6 + bdf2b600750961bfbaf2f932818de8d2 + 8a60c61d6e6faf8dfba6334371cca740 + 55f32db335aad75bd3e7ccc9cc3aea52 + 295e511b78d57cb31414fe902b9bb549 + e5156572a2ce361ad46e72909054def7 + 7451f1e312dc15bac9256860968719bf + c8af8f97ca40b33caf93b6c3646b5412 + 598a74fbaefb2f31dc905edea0d36312 + 08b0de731bd2352fc7f7dca3713ab7b7 + 6745b2e9d34581fb0f089af1445d44d6 + 2deaf13af60acf7c4ea0be60f5a026a6 + 1e891b8b93cd901dc3d4c4bbe967263b + f519bef369a9815332fb6e525977e582 + cd42eeb45263041712b3ac7a9cd4398a + b6a9ac6d62a63bc38d5a7b9c15633921 + 5f59087ac1a70c8f83bcc50bbc840893 + eb165eb30d735613773b762b5e097a15 + d6d058361fbe6959bf9d8dcb7d219766 + 6d98d81616ce735afdbe0275f01053ad + 2dc1e8122ed493a66b558a1fd34fa3bb + 625b675d35700c637a87e6c8e436f48c + 1d35970028035609c56773dc3fd7d50e + db207cd14f1eba532353ed3ce221968f + 5303e157418c593a0394ad1f3fc5768b + 0a64f0dbb534b07be733c1ab93a69043 + 8b9e6cc5754d47d5cec3028a30582861 + 8491816c8bb6949075e0314200a47910 + 0a5fdda153e697dd10f5e5b87cf52e69 + 078acfe8f6ec0d060bb185940f38696f + 81f4f3a2fa0d09fb43ccb947007e98e6 + 5d9057721fe783260607486acf57ec23 + 31eab50595a50c931e993c93acb8e9f1 + 50f9f04707df19eb58e7e026fd7fc8c8 + 1b66b3b44f5eabb73be45779b4a165cc + 9fdcdeb52a82e2124834ca2ca50e0d90 + b6a9ac6d62a63bc38d5a7b9c15633921 + 08b0de731bd2352fc7f7dca3713ab7b7 + b8e8e755609c9f4bd5e2075dd46eabfc + 931770ad560bdab7be63ecc8b394c562 + 08b0de731bd2352fc7f7dca3713ab7b7 + 08b0de731bd2352fc7f7dca3713ab7b7 + 436415365722801771f32ee3c8f7c09d + 16350196812ae01af964a7a79c169ac2 + a8fe065967baf7a88a1490f3a2621bd2 + eaec81750a2617a8fef45b7c91559296 + 7d6d303d483d6bbc1a21b665a3c51efd + 80d8e3ad0ad2103ffe6c56bf79f07c9c + 08b0de731bd2352fc7f7dca3713ab7b7 + 7cee996e0d491030125e51e2ee7191e3 + 775122c24369c038d6b2cec001352a46 + 576197d811e4c2b36d2b8958b76acd90 + 1eb45be13c3bf11d3c7e16ccb1be630e + 35373058f4301912f784bc769b021119 + 28c03561e936491ece3c40c1073cb544 + 5d6059786b95f8017dfb38fc91c4d2f6 + 08b0de731bd2352fc7f7dca3713ab7b7 + 792cf7a428748c253eee60806607ae1d + bad0b328b96a96220e2d077c36d46111 + 23fb06f0260d59c8a1eac37cfe3aee65 + 1aa42098fda791be0362d9948ac629df + 34e98ffe9aa22bc6f1010bfeb54a1a99 + 367321973c40811ec249d848c8016ca6 + 04a329bf737b1b19be7d45e6312099d2 + 08b0de731bd2352fc7f7dca3713ab7b7 + d579727fdbd982b863dba3c342817f35 + c434d5a1ce0f62c49f136d054bcda814 + 10683895ea4860703305751f756c7864 + 749c267630947309c9f30805c430578a + fbe1766f7d43a30290379e0167d9c286 + 97d5b6611b9f9c0eb8c8544685cb1b29 + 7cd365075ef3dd65647161da36b9549b + 6b8f626136b463681d1197ab00a8f848 + cd872e76d315e4e9f15cccde6f1c6aca + 651a06685290a99b6f4b776d4068cf1b + 655478a648728580830016dd7384be64 + dbf0726dd439e332689e3871f3c8ba71 + fed3529d91133b56196a88c4be54512d + 0203f614d4afa8da6edab74f2e3cd8f0 + 06d672e0e28440ac4a4b106fcc977c5b + 7b1033a4753ba7e9af15ce0e4f4db2fa + 19498c76b9dcabc8a293a7951ac3fae2 + 3458c38b38ee1c70f6f39d2eae3ef030 + c9704793df7d6207a4d6cd66819ce157 + a22b9b9a5879fd7928870048555ec838 + 69e48b179ad05825fa4d2b90f147cd11 + 348ceabc8405cb4fa25cc7baf3c433dd + 04ba4a7ce40270c7d449208a083657cd + 882fb2ebff10eeae4b0de3e32e8d5d7b + 791daa94231ebd130795c81363ecddbe + f8552fb209166f64bfffc2dc147ebfa6 + 43e86fa71a1f7bcbe732ab188ac15436 + 87538d1efda3b6789efd364d4f54ab9c + 06e4450286fece0d8631710a0ff9d8d9 + c050ffcd9864f3edf6f580af45309f21 + 08b0de731bd2352fc7f7dca3713ab7b7 + 7eea51f4a1edae03c6a564194dd6a05d + c5b5f527effb3674ef97d573ea0841b6 + 146c6a6a403f68897338ccd34a2982f7 + 08b0de731bd2352fc7f7dca3713ab7b7 + af93927a9b94f7bbe60693f47e7976b5 + 28c7a0f8f4f4aa4c057d752af8341ef6 + efb65c673882afc94f5c84db605c9f20 + 7aa3bdd92f006423964b6ffc332f0b4a + 5384c6d0d3090cad81cee511b5175222 + b0bbc0909ca70a4554d6ee194d4ac885 + d6d6c2e1dcef1b0c85ce0e382c2e5b22 + b1c3c6e0f9701266fee96d0156c054d8 + be54f263ea319849c729739e84a92ed3 + af93927a9b94f7bbe60693f47e7976b5 + a961a85c882579d087838629b6696fc3 + eb246600920b02d7cd38fd59c5396984 + 341523b803f740a148327c6e8c9f1076 + 9a43946fa0b4dfaf6b7bfbdbbed81091 + 46319f307abf1f275645758f93f9786b + 6e80107113520f9befd6f52498708c1f + 575b0892b2a4ea5b45500ddc6662840d + 2dfc31e711c6ec1ceb194964ecd053b8 + b893b97e04edd1860d2e4d8d3676b0f8 + 43e86fa71a1f7bcbe732ab188ac15436 + b2d080173d2f99bcfe5b5e69ef0ebe81 + 2539f31344e62dc682163b91ce1c309e + aeb19372aed32390fc1b2e4079c32389 + 3b1a07df0e3c6842db891de6596df257 + 28bcb5de48bef6a9d8ce99c25b4b7a32 + 5abf472308e0ed366a9b5b0f043ab476 + 2843d9dd3b0a96b2b5ac31a4614126bb + 71bba273c6ea07812dba9572582b327a + 6797c3e4f7ad603c83802c5cb1daf22a + 035cb740aee658a6821493adb1ce8bab + 47156ebceba2ae99a6c0b148e824ca6f + b1c3c6e0f9701266fee96d0156c054d8 + 557ebcab8764261ace69aeda3b385166 + 08b0de731bd2352fc7f7dca3713ab7b7 + 6d504d55a4ce9c1f2c4bcc008485c51e + 3759b24e025274c1150949a581d30fd4 + f27ed0b4e07828f811cf676c6e7e34e2 + d27b491676dd4814808dcc051c3de2b9 + bd56541394ab7bafac8bfbfb516868a1 + 08b0de731bd2352fc7f7dca3713ab7b7 + d6d6c2e1dcef1b0c85ce0e382c2e5b22 + 3f416131168ca1291c0b6bdf851c7831 + 409ceba1dc5a3474c636bb268fd9b111 + 7e2a429623ee70f68780fab1ea9bbd6c + 6a4d64d2d8a5777c25813a63944639f2 + f13aa6a065f5b915ef09f5a4d967fba3 + 9b0c44c4ca77d0fdf1a783da282a0906 + c5b5f527effb3674ef97d573ea0841b6 + 8191f036c9c9742a65db77e464d4b011 + d6a2603024ceaf78696e8178fe4da77a + 08b0de731bd2352fc7f7dca3713ab7b7 + 175fbddb0adb4ad50ab062acabe64fcf + 68a7464017d1f76915045ee3d659f8d3 + bcda5295ff37f00a490339a68dec8d4f + ceace0449888874a6f0fd6445a3ea871 + 37df0d607dc31fcef96b81aa7c5a53aa + 8f6a6ea833aea6327e619a8e6c269f02 + 3edda1ad6754a91d085e6954ed14d5f8 + 96fc0bb12a9ed7cd17dc0bbc06da49bc + 31eab50595a50c931e993c93acb8e9f1 + da5356386a1e29d91f0fbede90113c7f + 61a9cb3052700597aeff1ecb67a8b949 + e28a80f4db7d44c06f6fbb91c45959c3 + 04fdb3e6ecae105e7e7215a92bd16ec9 + 341523b803f740a148327c6e8c9f1076 + 6f4ef09ed4e812a651c118c2fbd2aec4 + 56bafba333c855c3869feb3c0054d3c7 + f78df2346482d5b1263ec3b17d10157e + 5ed24276da0af3ef22099bb376fd8ec8 + 7a641fcade56bb525a433a3d223d25f7 + 6e6fb8ce8e365badd0487696845009a5 + 78ace14263dfad520580371e819d4e55 + e77b7e5e9f9da2df670b63846f80a485 + c373ebc47094ba6debdb374afd0eeca8 + a64d82dde789926e6f902ee7b58a3983 + 70f8af1df3b70babeed0e9fc8313826b + 9b0c44c4ca77d0fdf1a783da282a0906 + e008ee3316b55e0d23cea90f7b02025a + 8e80e5c4eba83179a45dcc4350ba3db4 + 090b29961268119c7aebc2c934d67d87 + 08b0de731bd2352fc7f7dca3713ab7b7 + 95f02a86f8018063ab37148735a06f15 + 8f8c7dd9f8fd17a7f0fcc525980b202c + 6f33d1eaacdc5ab77dcf54b327689b82 + 39f9e7d5cf1635ae5c6e832ca73d7289 + ac807c33246dcf154203ea813ed57b61 + 7bfd91fe9af26351a19d1d3ccaaec9c6 + f78df2346482d5b1263ec3b17d10157e + 5303e157418c593a0394ad1f3fc5768b + de0f47cbe35663ce4bce97c86c52954b + 62079d4714a2e936b6f48ab01da68a4d + d914b87916145e9c2cc37e236e445056 + 053d34b0f34f58f730743ef478484216 + 2625019c65e79b35fc1a92b84adf3c95 + 39bd6b3993877b80029bc4f8fe682716 + 8728c23ab749a1071f43df83dc36b293 + + + 68b43b35ceb60aa44b2549eb7393ed29 + 9530689bba627bdb3b8c580a88698975 + b13ad503b8034a98df5db0dbac76838b + 72976cf0dce2617595b30c096a301c29 + aa0c9a2c499abdd3cd640df4beeba11c + 45b8362ab7b53d87da367251465f807e + 65071052276316e6aed0397a0735eb88 + e142c33e5503ee82cab112e133e6abd1 + ed8abd4d1bf16f84403bfb142bcbcf69 + 1f5c67bf200b4194139c29ba68c89eb5 + 14cf7b57ef5ca55ca17d28a27635f3dd + 43c50759fe706b63affd875a3f58a243 + 6103f5d35e8d54aabfa3b6744ff9393f + d9a4900287825ed6e52aac9c01627823 + 8398526d9fec3024c0b74ee7c1a1239d + 29a90320acbfbf60b5026a83ecc5582e + aa0c9a2c499abdd3cd640df4beeba11c + 97f67a99a1460f5cccd53bc46ebe0274 + 59de2620bf9ad99dbdabbcdc593b8427 + 90f64d8f449cdb7af8e32aecc45756ea + 27f496d250a4aa4381e4baeb48af1721 + 8f9971e0e5760adbd9c12bf931351015 + fd0aaf7a23ad46b05334078f2a2fccfa + 329b0a54b98bc72013d29a020d9c3d70 + 9ac754349a66a016daa464da3f9bc2fb + eb44e46e9befc4e5e62a6f24a7f3f046 + 4dde1ad4420f5ed0987b87af161631c4 + a878bdf7c571f301f583f85581b6ea9a + 34c2a241c9885bee7a24cd8a3e2c2b0f + e8a5f281fe715faae08c033111d4047a + aa0c9a2c499abdd3cd640df4beeba11c + 1ed9fd79cb31647ccbeef48eaae3e32b + 65a1f4f0d012ea5af80a6803af906685 + 9c9a6c93260423215af82c745cc1d6ee + 1804e6c68b057da4e3272ab99c301181 + 1f2bdab7a520f1dfd1d787eb6aac4213 + c9bed6105be7a21428c81b49da8adfb1 + 44f1fb30ea8561d1e1a2b70409800ca8 + e4730a9df4168b33a37cf9f7a7e63d78 + 46cc93a2c916cce4e6f605cf0bd61de9 + 071514568de91a7d5d7e096a989e91a8 + b545f597c8cb48c61d3eac0827cb6eb9 + aa0c9a2c499abdd3cd640df4beeba11c + 8625b75b68fe5182947d5e702453d91f + c29382dfb279abd8aa4676405d637a77 + aa0c9a2c499abdd3cd640df4beeba11c + aa0c9a2c499abdd3cd640df4beeba11c + f8d57d38f7c1fd101baa198956ce0d6f + 3493b35e554396bcfd87af6c6a82412f + 1531e9941edb178e8c8a5c354d9aa0a9 + ae86516f28ad245885feb1622680281e + ff3b545a53c3b1e56e718c52c25e4ed8 + 32a5ff7941cae3cfbf772d11fc7c96bb + a0e05e177e3c1834bfc552b81cc864fc + 02170c770b7e1a3ba4a782076974e48a + 7be2a70d01fddabab01fba63524fc384 + a6eab460211f4c7032f5fdac4ae4708f + 0269b4914ebb69f54ba0815bff4c0618 + cb4bd02313b4adfb68c4caca82fa506d + 39b9e520d43870fd104e04d5b2169f22 + 484b0b3c0be4aa65e03aec27ae9c43a1 + aa0c9a2c499abdd3cd640df4beeba11c + 1abf9ee35cb1b95de9b2caca96752205 + eafa5ecf28a687175060182f35bcc50e + 521a0a9ff8ed5808fed56b77f1529548 + a95b641d8c5de0cdab7fc80e133865e8 + 6abbeddfd2ded29adfa2cc0fc4e71196 + 0299ef63be4d3f94201183d297627221 + cfe537b4acb668a33c49b6884fd1a182 + aa0c9a2c499abdd3cd640df4beeba11c + 39c9ed8a0a6682fdb6d3c0d0c296699c + 87ea68f059219940f0f96bab537a8361 + 65ea99682040b26edb3d27434d2d4717 + a65692099696bd672a1b18494f96f592 + 284b47cabc752db72cc1cda08f793556 + 18791e70f021a4a90817eab873dbd1b0 + cbea0d37c8b8c4b0a69b3179d1941b36 + eafa5ecf28a687175060182f35bcc50e + f240c0a3dd4d21aa797d5db7a5b4b178 + 498e15d27df28351a2ae393cea693115 + 916a5fb4b5967243e66d4632d5661ef0 + ec63e6067a047c0722991687d282b432 + f47c669bba145098e449fb3b11c758ba + 1b89c8604ec8a07d86faf6eb05b5811e + 4216a648250b54c7ebc6f273ccac141e + de08ba9d17e30b897e622e18b77803c1 + c330162d73d8142d96290a9edeeea0e0 + 08e16f1234db2a38da2c1d875177624c + 8b7fafb7700cf01113aba389a10879cb + eafa5ecf28a687175060182f35bcc50e + 385a9fd0c48df309bc1dc0e886ec73be + 5943317380d5944f339c36eaaaa66028 + 76d354ceac6a6a85c4e78d9d13df4367 + 13c3ec8162063bc71221bc06a284d6df + 7940d338f0ea5d396590888312c6130a + c368e49ef6f4816d5d6719eddb1ea6fc + 7cbe0cc605a06f0129ae0e35072e52f8 + 0735ff53c208656012df0488063b3c62 + aa0c9a2c499abdd3cd640df4beeba11c + 89dda109187c58d4ee87384afa206734 + aa0c9a2c499abdd3cd640df4beeba11c + 9c749532c82428ab19230691de42e190 + 69dec1723d43077829c2fb714aeb4de9 + 213b1f1554a7fe7f1146e973b14ec740 + cd7323683515d39254d9989265962abc + df4a5070fd944cdf4e7b080c95074b64 + b9907c16def0be153d78493fd9686766 + aecc780b548951ca23fcac210907965a + ede745f29c5a6f455c52582e1c31b49f + bb49e1d74b984ee2cc0f027ba06856d6 + 7132d93ac4cc9819fc3ef5e820c0d7fc + 8f6dc2575991a26569b15964c9d909f0 + a24ee343519d2eb06aa1f2a82ef2ced7 + a670d9f869d70474d408c6210ed23a95 + d5a049875bcf792e911bb3fb90a09ba1 + a672158e16565a5ff47a6b5333b29b18 + 23a3fa2055639fad813ae7f268fecfd6 + fb14461da470ff80fa3222bb365e8038 + 167941134bc830ce2e69562c0e04cab8 + 5488136aa94e18becc20c2b88e30192c + 65acfc6793ad7f00922f2aef94057f73 + 2522e84e0ce7ae04d5c5eec455d93383 + 829bbbab7afe6eae60d64741d4dc4fda + 5f00aa195547a2f2177d48b6292d8108 + 7ef8176cf4e2bd7339bf10842bc0a64d + e438bc7a386e962108c8bd49edb6f14d + 76f4c5e691fde87b3d7dafc21fad44f8 + 989bcbfcaf07ea214df645e33c963564 + 680b349f33de014b522c25b95aeb8b43 + 3090a53d8f02a1653cc45cb829cc7691 + aa0c9a2c499abdd3cd640df4beeba11c + dbdac5db8b716622370a0aca78639c42 + d3484582429e51ad6ad39dba5cfe817d + 9ce22e656b720a95efe4296572177f0d + 2b4ee8f6cd0877d25f1c67d2dc31f7c2 + 431e5c4f7b58330d794b08972f3f1dea + aa0c9a2c499abdd3cd640df4beeba11c + 022bdc128fd10369a6d0aa0967c0ec44 + 106492f389151ac34d4efcf0b77d511c + e71c0d713e9b21a3afaf7256282147e8 + 40f752a4cc4ade1680c98f95b131fd2c + 947565905d1107d3d1e50226fb5d11d2 + 75024212715a4a0f6086aee3be1ccae2 + 49901490fcb8c0dd8f416c1b3e1ef478 + cca6a71491c5475195f8465c7c963006 + e6daeda526b89940ef222667d6b41ed4 + aa0c9a2c499abdd3cd640df4beeba11c + 32ab7314ea9f0b36712ecaa34b140c46 + 70e4f0681de5e448f801001b5cd0874a + 3d1aff998e3560af8cb97849c37ff23e + 67c0c934dc61d20d81137038e69f4b08 + 5457ea8d9a538ba53d405c089ddb7239 + 9d800a68d1b1664377a71053e0620fe9 + 57e5ff1e9a3b14a50a3e45e780410245 + 03ba1fe82da10ae88d320687d9b6b9a4 + c8e26b038308420497b5c6a50f5339f4 + 8a188dfec825332a25553a1336babd81 + 0bc2c73b07420c03427ffe479d835815 + 600f3476480c5228606becf5e3463f83 + efdec2924585ee9fce2cdcc33486278d + 803584f4f21d385f0214b300f6fd1cc1 + 5289e76b11b9d7eca6b8a4b9b5a4b6ea + e31fe3535d22484f18458a46d7d480eb + dcca022a978ff6de2d5c5334e20865df + 6d917300a3bdbfc829b107fc179f2fc7 + 4988218bc54b13b108c23de47c65d472 + dfa1d935479d9a21ba04f3958fddd4ee + 8be2222e03b812c93f2f6811c0a0ee92 + 9ab77c150ecf562d6dcc09632f84fcbb + bfa9d81c639d033b5fa7a4a5a627c966 + 145762d08c84c4bcd534ed47d0d66f61 + 6b79c40cb0a0878e0bcabe097c02b874 + e1a584d92bf9a25f6c1112010ae31054 + 17ba1cef4ad425ebd2e15b876edf868f + 8f4e9ccb5e1af9acdcbc4f47185a49ce + aa0c9a2c499abdd3cd640df4beeba11c + 4af56b1a2b227afce2470032b10a7e59 + 5864622c11aa4ae29d013e302b1100a4 + e5a7f0a06900e8969ff0709ef7828832 + 81697480bb9a41a17c2e7166d0722341 + 592a0c688dbaeea1dad22c81b19e9b9b + 599d03df8a5ff92ce9a8cf1edc6c63fe + 5b0e88deb0b1fa452224b869d49d2983 + 0c08a8ce9a37248a5561d5f842b761e4 + 6d53975987e97935dac85bb1fb260419 + aa0c9a2c499abdd3cd640df4beeba11c + 9e9027b8dcddd819cf409fa980991a83 + 24b276ac6b4b15470aab398b500134d6 + 996eafb420a4b165d371efeabab45f47 + 1a7075dba9a92f552ac1a27dcffe1982 + e2c2b7f1931dcfa753f5f729646c9d4f + 0f63902c681b4c2bdb2c110c0a1207a0 + 2e5ba33183669b8ff76c6ae015c7a789 + + + d548eb8fca62e559c84e86c9c150e93d + 3b190c6449e2c2267fbc91eec42986ae + d4662889e91c88c1ceb84fe80cbb8cb6 + cbe53c23db8e08bca612b01421b1bab0 + 598986ec2077c9a6a87f3852c579c57f + 33acbdce61474f0605c6261dbe786544 + 6a66bd8a3fba75eb8ef3b3812b71a535 + c5af1ee95d8b6be57a547dd26cbb6a67 + af060e87a96c2b1e32816e3b328e20f2 + 0602ae1a5e3a32b28f21214a372adde6 + 2521022676c5e9f9a064efc5801b692f + 255bf41743b5848c74e06146f4513beb + ac4692d4ae41a0f0411a4c2063fd8c4a + 6cc55cadbb9c132d00d962ac8e220382 + 7298e671ee1551d06a01b04d7faa7646 + 3955f55e092cf1d9c6a69d5847efd4c2 + 598986ec2077c9a6a87f3852c579c57f + 2cb2cfadecc06e954073a4bf09e8016a + c8b0eef31c909d283f3829815dd526cc + bc6637065b1384702807f9087a0776bd + 079dbbb25707613aa0eb9464512f8583 + 3431c98c80a770a69a7c7d6792667081 + 4bbcd6706ccca0982b077e891370a3c9 + 5536f34e88b3439d2fdaa41c371b2a83 + 151bd88dc999c4524248dea4543443b2 + ed321088d4f048c36b53ba6a50ad8585 + 3937ab2ca9177f6ce938af4214a14b15 + acad626bd78eeba8f0553e8bf15b109e + c10ea1b67010b917e284d091d1280e96 + 669f601cb8794b66ed8359be582056e4 + 93efabe882852c682a6e83526470d2ae + 629d516000f309a21468d9a08d20cffb + 2e8004bbbd5ae662f5d449cf42d56cd5 + 093fd10c9b1955234625b9ec51779254 + 962646d0be5b73e94645afbe5ea386d4 + 067675fb3a959372dcc33f2fe5ac134a + 34706bf2e2804248fb2116f4e2d0f91b + 8c59107eee2c997f647538f864fb7005 + 7b4cd7838807dc7f95cb22606bdfea5c + f219a14d432fc586a2925eb0f1647f23 + d15b5de95d24c8ba445034ba552e8b9b + 07d64bb42eb86663c950663864379b16 + 9039ca558399f6b60901cc225fadddea + cfdd9e431eefdda9d2d0587dee2da6a9 + 4bbcd6706ccca0982b077e891370a3c9 + 598986ec2077c9a6a87f3852c579c57f + 0d91bc661556165f648e0221b764c763 + ccbb02184eb99f28d94d7c2e25aa4672 + 598986ec2077c9a6a87f3852c579c57f + 598986ec2077c9a6a87f3852c579c57f + a272057313c2062a508c4320248a9018 + db7bfd248d9117a80477e140cfc1d4da + 3ef3b85b9f7f7fe50fce4795353600b5 + c62ea790db44890bb3cdd23a2b3eca67 + 91b78f251cbc1306bed4427caa04c3bc + f71b376a4c3ccad5e05529b211a83612 + 55635ff9e1a9d4a47ade05ec8be5608a + 8d2e0fdeeabfe175586c6600fc6039f3 + a0b29d2cbc11de0560f3331fa2cb0e0c + c8718508faa03bd0c1c9c4a117dedbb2 + 723623285557d69b585c58fcca7c80c1 + fd975c7a86fbeadf5969c0782b655a34 + 447487c19c92ce2f2da04cc099504d7d + 598986ec2077c9a6a87f3852c579c57f + 3e854576fa94244ef3617016c8e7630e + ac47d517b1e559161c0b453b7f8d6ad5 + 26488c48ec59d9d8406c03831d7849b7 + 027f52a42162600b4ee8599ae7c4cc5c + cc21e0546a8be7c1d15a3ba4a09167d1 + 5a6ca913c3761f69bc5c23ec0c9640d3 + 598986ec2077c9a6a87f3852c579c57f + aad05c56805364bfd6b2d56799514c37 + aa18d902888496f1e0b07ef54ec60e12 + 08fdaf81b1ca9b6f1b64221aa6bba3b3 + e24b7044a646fa69a751e386a5efdc10 + 1d52494f770cd768050c0048e60fce16 + a6b96f64e152aaafd414f99c1085e5dd + 0de016cb89b1525f449cfe2aee06a65a + 00c7e5d480dba78a44583ba63acdf4fe + 24e2fef0f2639345cca459b3800bcd76 + 8e6a8913813965ad5e446dc083789992 + 8c11a19d1d87c15b80a9f780822df8ca + fb332446427ab31122b6c5f4e97e8eca + 260f27f0d9acf8c4b0150107214eef04 + 89d057139820dae220d1aae888893cda + 51c178328a802c8612850d6a5a08c81d + 5753725e55abe55f0f39d9e2d028afa7 + 78e98beb675b1dc5eca32034dfb38259 + 0f33eabd096083979c61fcb9b0aed3cf + 1b30dea737d2b6830fc097f79f8b58dc + d7f4e5ea94bbd31a2ac00b91cc66eabe + 8546ef98d1cca555efa18383c85bd29f + 20eda6a99b0ba0eac630a025d52d8843 + 688e275b7577352a70f5c18d77cc4087 + fd52ee536787b0e890168d7fdb069327 + e9527067fa67da8c74b6b2648ee2a8c8 + 4e15a3b7a1c27efca003bac0c32f8e77 + 7d24f80996e9e65acbe477f577821f65 + 66fe129501c253c5c72953bd8d2d55e3 + 598986ec2077c9a6a87f3852c579c57f + c7cedcb97a633aebc9292a58439b6f13 + 067af7cc381ebe38ce1baf57790cdf32 + 598986ec2077c9a6a87f3852c579c57f + 49534e8aa9d02550c5b904a946535b23 + 29de723d4ed2187318d6b128ccbf4535 + f367bf7ae0f1c6133ee3c8d9e388fe02 + 831c904e239c8f0ef759c75588a43836 + f20b228e17d84605ad50d02ff43ed661 + 5dd105744a485c234ef33e7d1bf4a6c1 + c4deb2eaa653ec04948dc072ec781926 + 3f45c0c856b0138d0c6ffc6cc4aa8399 + 8772109b85f3e60e9eba911ad7f44a81 + 49534e8aa9d02550c5b904a946535b23 + 863011d5f948b2e55deeb9433b416ab3 + c084b22bbafa6ef641962d213885037a + 12b782d543e31ba8fe7bfdbc86c1fc81 + 2fec8f7a1132cb12b09b1e74b11385f9 + 828e02ae164fa1ec3b5c675e5715c607 + 0cede8e0e96f1b63f0c3e6ca7cc32931 + de446d3ca5cf7149e5e246b0c3645b6d + 754708d2f7cd831460a50e412c45340b + 926593a9453c8ca211e4733b56ebd1e8 + e9527067fa67da8c74b6b2648ee2a8c8 + 747db279f07ca8429b2a1cbb50578b9c + 9c33b3d5136e3bfb1857cbec90390023 + 50bec663fb9ea0791f6baf7483d2f2e4 + 74f203f79befb80ae5d3062251645258 + 33f35990408eb4fa1d5efa64ab0cfb18 + ec4a354fdbaad6436dde56eab10bbc42 + b3d680dd49b004666c64a5f7a25bf2b2 + 6747ea470e979e33f2a32230eae82caf + f3b6e78f8cf05b450e7f19836a997b67 + f40aae7a9dfd9913534636219e2d5893 + e67a0df49d24ffcfafb45de5d5d0177f + 3f45c0c856b0138d0c6ffc6cc4aa8399 + 870cbaa23682d4f56bc96f90d169a06a + 598986ec2077c9a6a87f3852c579c57f + 8e0b23a8c6716271881d5147c169b795 + 7818e71fd9d16c0b46a70d1698430423 + 91af76f56de9a0afa2a5384f32e97e92 + 51b31517ad543a4ffdfbb694f4b0dc8e + 333eabd7d13e9b30c13e00c8662a38cc + 598986ec2077c9a6a87f3852c579c57f + c4deb2eaa653ec04948dc072ec781926 + 8941427fbd15099a539822b4355d6bea + b2bfba133ce1aec823013548d1c4f119 + 92b1596bb5e8feb0d4cb7699bff1e95a + 0c7120bb9d2cc964d627b5312068d519 + c7cedcb97a633aebc9292a58439b6f13 + 95354a0ee82b1931afdde10b36b5d0df + cd154f0aaa30b4052965ac04d5090270 + 598986ec2077c9a6a87f3852c579c57f + 78eed14b89724c84e810e2a54603c5fd + d2d3cf089aa403df02f30cabe9bbfb7a + e766f0d462ee7f701dd07cb9812faf0e + afc890f0e65ad0a002e80309687ad133 + 8756ff5b45552b919f75f104aaba5927 + 4aea12580142a0e6a5645ccafc2214f8 + 6233af545635d539d81b05aa55bccb95 + feaa9d8757548ac5f177ce0e380cde9d + d15b5de95d24c8ba445034ba552e8b9b + de9435fa958a8e0484b0f9690197584d + 11b5401848a8627cc3e52667e1fdee91 + cfd594c9b6778b5dbb4138bf5fef2c6e + 665a034aa17da612117e72f003466377 + 12b782d543e31ba8fe7bfdbc86c1fc81 + 442730af35a8071b0cd078823d403355 + 7f7678acc2158ab30b6d3469ca4d4ecb + 3420e5debe3455ab355b06843a702bbf + 23f8f8806e8797579291d400fe6e44dc + 03bb8c99b56d791ab65edafa44bd4b77 + 2800e697620c3b13bcae64477be07c2f + 529321703c3e62447126503ae6ead241 + f13dc3d06889c04313975fa5801a7261 + 68ba59e0a0fb02ae8699e6bc900f80e7 + bb3d8184c6610dd97f782a60cc84b8d4 + b93eddabcb6b7d954aa201e893aea778 + 0c7120bb9d2cc964d627b5312068d519 + 2f0f687d1618e8c5a2220437aab57b05 + 017f2af157e98cdae7075edf27fb5a5e + 8f5d9e7e1102afba7cc0ada709fdb751 + 598986ec2077c9a6a87f3852c579c57f + 32a02fa8d0e4bcfbf59ed465aa0a0362 + c0991a840a78d393d94a57b3b6ccd6c7 + d6b83ac98a5a4204444f82110b3b1fc3 + d8c64e93d9e34448b94fe051dd102a26 + a519c8fdacc9b1c161567e63b0f0caa4 + e2f9cdf8146b9ac6624386b44b43f428 + 7f8f826b166d3f524d57f4f21a02cdef + 3420e5debe3455ab355b06843a702bbf + e7477e7d78d8eda2f7f9c938be8131e1 + 629d516000f309a21468d9a08d20cffb + 39dd4edfd7ac90b64e5d9a1098143615 + c4514716450064e6b8ba073b254ba828 + 82b6f9d90e05f32c8c5f56375169bf28 + e7dba32336c98cc50548de3652b78790 + 12a1148e6a50248a24df41830791580a + dc969fa35f54a21353847875bff19aff + + + 42c8cfd74cb0f3d32e91ee8d4f46207f + 98e4b60f60fa09a5642b191a97de3b46 + dcdc060363c2ef09ba3d37c9fa16db00 + 8a3494bdb7ba747468b37f32d6e3c912 + 38bee76dfb031c6d17243d54f4466ced + 6bb6f56d0ffe5a9d2df4c30c30254550 + 2ed3af23d4d4fd812b508b261b2db666 + 1881645443dc0439d860389ea0fb80f4 + 91f5c4ae264d7430179599f00cc4a2f7 + 162593263c63ea9281102a828c246b57 + 871a4844bae047b8263d2cdf17365405 + 4625e3cc521118fffea366e571f49dc9 + 05e6742b196f02b83e72e6ee12e29657 + 451660b53c5a2e1575f18f9994be63d4 + bc1d5621358673edafb2d8363c1cceeb + 23739a04f8728ca8c82a6ddb85f33868 + ebc4c333ced3b7ae9183f1e72f17a53e + 680f142b02ddc2d147edcb0e55eddafd + 231aa147243e1f7e7111345523ec8b64 + 4222266c5e091bd200c667c142d61b35 + 55945be7a24a36bcaf43b750e64fb90e + 71b26f936790b7bd30a9ebcdcf9b77ae + 6ec3863d1abc6960d7481f42fd786667 + c489b1ad34085db318b7b473003c9afe + 6eeb988d4fc34df649e47bedc6ec00f1 + 528499e8665e8194f3f9e2145e626b15 + ed7b1dfeab6b0e7934e354e513f7872a + 3c6ff697a69b3a11873cbd77e42f27f7 + 6238169b2407ea9494c80d5743e967a5 + 680f142b02ddc2d147edcb0e55eddafd + c31715ed54ebea2b2b2dd40fca268e57 + 89230c8f613e5e002f3190728d9d0d3b + 54328195266f48d12612654cb9c15092 + 97401ac3b8b55e6e6c69f2011b1a3bf7 + afeb249e5bead47fdd2af11f095be93e + 47f7637f2dafbfbad2d263fb56ec07bb + 888b93cb55e0f380cec25a1eed673bc9 + 83eeaa13f1468fb27fc6b8e8cca360f3 + a77c5bff0a5bbbc4c0378699ac964a8e + e3963046685ef73ef5913a28cda5dfda + ac9b60be1e9a4efff00cdee378924da3 + ce6217d82db3438c4ef6f76ea2f640d2 + 7b21daa44c55a10814cb8911042ff338 + c33057733f8f979da9dd7293b7d7f1f0 + 033bc7268caa6d8c867ad97c7b07a517 + 16697baf1d24e0de88cdb43b0067b931 + af8234ab2c8103264d0feb9817d7da4c + 5ed1384df408d78d2764e943fe9b2d45 + 83fa2f4168f1ee3b698bc319c0cf33f4 + f7bba542d83b638a15d8bab7c7495c41 + 2449bbf2af16e4efa6d5a1078eb66e84 + 5e0be1da2e7cad3fb849f2a168973c5c + 3eb76490e081309bae0c53b9d2471150 + 063cc1a3f7ee72e2b684b47618994961 + a41226709a4e7b420f80eae88ebbcf39 + 5f556cce0a29e7476cbb7ebf8e4933c0 + 803df41772ba1b6e14fee8d926b1b016 + 0215a87af9d9734318eac40f017f419b + 48c4279df746974cba1fde2dfc962a46 + 77103fedd953f1271eb40bb1c3bb0efd + 33605deafd3863e3c658689c46def5b2 + f7b9630d7f886999e638aabcfb3b44a9 + 36571cb93e1264ea58a4210deb293fd8 + 0333301ed38ef8dae41672ef43a6385d + 1b37bb59b0c128d9a9fd7033dc77f10c + c04300a561732883a81e058cae8005c5 + 0c6045639261c8be2e61d1a6241d9db9 + 8656d68ca8d38db2b747d60978e3068d + e560d8bc594a2c9031726dd457db5253 + 6c68bcc10919e32070c033a2437fed45 + 5aa8bcd5ca38b4554f6de531617c56d2 + 942f651867299dda28113409ffeb6b3e + 2f6e91ade1e45f6ad1769e001eb6aafe + bc6671b965c2445ab419b0673f9dd53e + 8d3496e3d8c2dbfded9a2a1a048bc587 + 250db3e13f932882980e53ce84da6dce + 6f16dbc679a77845b30d6d055618c929 + 7352c12deb1d3dcc0bd9e39ce36c4359 + b18ff49b38fd23168073164f5cf270c4 + 5915c1e08bb230f7f16a7807b38d1e00 + 49b72cee930bf26223377007ac948b35 + 6da4a655a98d1624fa41c1d9e1661e02 + 6e4d84187bacbf847051e73868969f2c + dc44e99579b8d3cc352cb056801a52c3 + f9efa981306549cd951aab704ef32e18 + 476236cf35435a938087ae624d46bf83 + 74425a1a9d124c0c759b94bb586b1139 + 8a12fa0a1aa530f632d1caee19b4dcb2 + 713ec68f5e059f59581826eed83bfee8 + 3cbb540c6237e5541efaed33ea773909 + 6c499239e6c0db35bf4d4b95984e1c89 + e38af9a11ed3e4e35f2a700a9f97b63c + f7c3d03aba23acd5d3589d06576a038e + 8dc260f464d1446e6869b961a883dda5 + 5915c1e08bb230f7f16a7807b38d1e00 + 3c0afd7868a7f00ad96197fe113ba5e5 + 8691dfcba594ac91905616412cf2bdf5 + 3236fd000f2acd1fbd992943f5b86a45 + e0f70b4e712e05fdddcc7fee15bee796 + 1e426f0c2473a0eba8cabb3026b0bc05 + b18ff49b38fd23168073164f5cf270c4 + b7b867ac98de402ac467afb5c18be258 + cdb9c685e004a0694ccd3a5ccc06861b + 68424d8c51919c166d75d3272494d155 + bc6671b965c2445ab419b0673f9dd53e + d38434656d95fb036503a0f73df84932 + 14a4555e7d4a87f28fcdd9dc1ef48b81 + b23a653c7fc271f37630dfd25c90d50b + 79eeea0a47fe30fdebc456e22dbc72e7 + 9adebe3a5669e175aa11c5868afb7438 + 9f752b15ceaa2abde568c7a761c5bec3 + e539b0885b9fdfe5c7403628629a6173 + ea134faa5ba42df4cc33bf0704dab53e + 277b06ed32f7eff4c8a4e33fa8ef3e88 + 7a144ece928c054d7fa00ab3043e9386 + 41f3c7bb6b840b1c448aa6b896206e80 + e0eb26fadbd579e21ea242309a0a246a + 6e4d84187bacbf847051e73868969f2c + e0906c5704cdb00d146dee8603512084 + 959ba852db77646baa19bca9f6360b6f + 1ed0bba148ab5eb671c11e1a7f245364 + 6c407f46b84cfa429ba3954ddba84a4b + 1fd83068e54659bc006176724c7d194f + d45109ee22ad95d6fa7c1c57aff55343 + 92c0e9d751eacb39cd7f5d0e4caca11d + cc85b1f2a54f0fed673e2ac736c71444 + ab9321038e2875e8c2b1c4abcd86371f + 51536108ae2c29053733317121e13bd7 + c22f9b93bc57d10ff5a7f918db9ff3d7 + cabfd9377310f54a51f68c45ad0c7376 + 1c1990ade8706171c3a13652d0662f18 + 91f7143bcfdab96ad30c2593a5f29604 + 879924e408fc10a74b42418ae9bb12d3 + 1d300b9eab39ee030015d6c4f67abdfc + 1ed0bba148ab5eb671c11e1a7f245364 + ec332fb422afae6223edfbe9e734db5a + 772aa7d784e78921e27bbc9e4edb5a84 + e2240187ffaaa8b1f7d539ac1296c82e + 1a2bcf8ec8ab0e4f83cab6c3a43de193 + 259082d0a935f8512c9fe95cbd7390a9 + + ab9e025508031c952e8e2df54db52233 + 3da6795d5ee91fd310e489929a70f4d0 + + + 5a2b78a077c06dbcbe4bc69900145df8 + 0a5a125e31e9ad04aea13e67bebbf09d + 0c0c36c4766dada4755c59a05e3814fe + 3cd0cab86f18d0068d53863920456560 + + + + + 147ba56b16a7a9fe8e13272a99611f5e + + 9e55e4b418215ee3f96ee3c4135481b4 + + 01dfc241601fd5b711f5d7b6af8e7b96 + + + + + 16da3d9dbcf21e47cd8b552d741bd282 + + + + + + + f8d1e67d9e72d13d5f1ca0f92767686d + 033f8e3a82a5b894bd68f06b4d7d19a2 + + + f8d1e67d9e72d13d5f1ca0f92767686d + + + 5c4b97d876d088f198e19b06ec0fb25d + e052617218bbaa24daa31dfd1259ad71 + 6d9defad942d61891a15765a4e2cf300 + 446a3139b2628b0370b88deded4d5382 + 02b2941cac1222f0a8a6692e46f0e00f + + 5f12fed92907aa51a2fa06d00eb837f8 + + 7a53127a33d0a7c2123939a1ab532372 + 033f8e3a82a5b894bd68f06b4d7d19a2 + + + 3f49460cbc73562ded8cb38d3641f40a + b87e5ad9b13a23c8928619e756ecdf75 + ef6347b5ab6fccce9b1f57878e0cda8b + 562953d472d8ef930920589460e51770 + 46f61f607de2a4820c3f97dacf7b4b71 + + 02b2941cac1222f0a8a6692e46f0e00f + f8d1e67d9e72d13d5f1ca0f92767686d + 7bd733221e37c36900cea231cd081df8 + + 7eb5f0ceda7951e74ccd19fff9be1101 + b697db0cfce131458a48c31c328dad70 + ad2ef4281f52d438ea3fcb6965dea9d1 + + + 8bd61fcc11378111eaeabbc00bfa1095 + + 2e1a0c7fb2ad7f8ae69686e806755fcc + 6e31588eb3e6fa418a3ab787c7f280a9 + aad34d97946e308808d50ceb54683bfe + 857d0ea1433c6fc1cbe4518abb99b9b8 + 99ef1bfd4d2be71a9cf8e58043521c30 + 2551fa3cce0a8b9ee068f131b28a8aba + 062dee15dbaefa5abf11aaea6c0e6f46 + c88d07f132bc147fefc067767234bae3 + 9123c5b79ecc69a6af5caa11d7d3bc54 + ecb82734f50435f432c7cfbdb707345e + + 8db9f2fac053cc65f71c25219b0b0495 + 1d320378e39d271ec750920144e0d46f + + + + bff34440a5d726224e7495cca43decbe + + 8f086fb967ae87bda87b9e4862e14ee3 + 63d30f0d852a337d309f4ef56ca2638d + a1ea18191dce08dd5688a863cb93cfcb + 6fa98dbc7a0caeb8d6280d1a8d65f82f + 8b57c5ace6657d4ce47c05f8db29a9a1 + + b3e1bb7ee8a8e515ef177221135a2c80 + 5c8c3b0bb8bded7cb7637e845580486c + e3ee36adeb11d9f52bc3f7ede66d1bdb + b4a0d9f338c947fa0fd86200fffc6134 + 9cfdde46453429fc272f8187dc628323 + + + 040028b4a5f625fc2b9dd7ea3e6578b1 + 9863bfbdab6bfc52473f2d9b44fa5453 + + + + 23a4ca96a33c5d72b9d7fac51703007d + + bfe0f4900eba96cb765dd7cc83c168b8 + + bcd1f91df49eca0d431ff619a144588c + + + 9efba7e794236789a5e94901494412ea + + 22af8fb19aac4b349f16a26ac8db4ef7 + + e823150edf5689fb637b8052473ac117 + + + 506b78e1dedb496d88d56da7b0497355 + + ae327ec023685b20f761199962b187b9 + + a74dd0815f225ce32ee8197656c3f325 + + + b06d9493b4653871c19a7bb0276a37df + + b870bb084d90096700ca53abcaf723fe + + 05d90766221f441a3b85fa341269f037 + + + 608913672755efdb551474c4d1da8b2f + 83d4c1ed87016c935ce2fe7b5bc464bf + 85d2509fa86e91c22a58af37dbddf469 + + 28895817165aece98cb3507478daef3c + d1784805ecf74d3fabd1122e6e667361 + + + 3735fe18f806fbac5ed081a8d78dcf3f + 5a98e4cafd08f024cf211e413921dbe1 + a1e7ada680ffc8f781956494ef248a56 + b9fac48b635650efa9923f42ffd718b3 + + a12c8b607207c279041e36b7f6a809aa + d7d91128d8ddc886020be359502a316d + + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 60d65779fb6fd6873895f5a5371dd766 + + 3cb391b66c19a4d321e94da54dc5b287 + c82caf8e9b5bf51b681d785a0023c147 + 09508aadb2183f3b2038cec074e72d0e + 53edc555721187296d35e50021e02329 + 9c31e358783da7f020653079d4dfeaed + 67d7d4ff70de5c9dac60aeaf3d089993 + + b3ee6863d8069464566f314491a18f47 + 4d5a23955c8667b2d22da22c84332068 + 4e8929ea7e4b85e3de428e6e8e5f7d89 + 2230211e7513cec72c1c5e532b9b5f6c + af9a47763edfee53ebfc8eb484c14a25 + 21b94c0e65a55c7a794f3d07f97b955a + d816b7f5ea42205f4379659f1684c937 + + + 5dec05e5815f6884bf21b3f6cc793ae8 + 8d9c2f9aff90cc266e98fc09edfa9699 + 3bd430f102e1f0b10a75f82b6b940712 + 89072d042ca561ead8112d096061e8b8 + 1c42771b75d9417ead1e0dccc9868110 + + + f2aa382d97761c05636df2299b779748 + + + eb61eb7dc9cd56cfff0a187e78c969d9 + 25a523b05a6aa3b59fd3ae72b5f0aaad + 4078cb3460fadfdbb18e46113a33fe6f + + + + + d29812fed646de569f9a1f73b2d8a4ed + + + cb37f082ff4e897af18314dee71ff887 + a8d2f7354aa5484e83a23a9f76426fa6 + + + 7a080b0fe2fe7666feb5ec6e0d9436ec + 3283bb157d72f69fd792628869b8326f + + 9bb901060a5b0872e0ee7287a2ccb92b + c4a47237f81af6b7d2bf01867f128723 + f0491aee8f37f8bf07be81e09a334c12 + 97629573ee988b326dead0b5fa0c577f + 1695e80f4a1e14401db14268b7b55dd8 + + + + 948f6fb376325f2061c9f961beec5c23 + d780e546fe5133259c20cb610724affd + e76b5a82d22e2b0b68e3389abb7d288f + 3678994dbe9bf79522e21c6e380d3c8f + 2072481b5f6b5dd35b770f46e90e9d36 + 2afcf2c0cf8946b9dc01c34e9751c913 + 4ce36f281ff76758c11ec820a8e6df33 + 162b9922df404e328d1ab8ef9372bc42 + + e9cad8437e7f82a2c1c45e0f90895bc4 + + a5a97dd0f533c3d5ad509c9102b492da + cf243210b1c65188dc1e4d9b8fbd94b8 + b1eb133166afc98fd9ed31a70e0aa9c6 + 2c49331aeed5837668eb40ec740b4714 + ecfb69f46c055fd10cf33160e8cfffa4 + bc325437431467f05f3e7fa3d7ea9b4b + 3a7208efec006af2924b399f2b8e050a + e5a6e54b57ee9d2f84bee0e9ef0e79d7 + + + 6b1e5d9a2a50b8b5f2aa75a6e6554502 + d424a54a5cc2f1bfc021cf58e3f7e0d0 + 76ca648a562d60184d6d9a8b2ec415e7 + + + 2c2fb0b6477fa5614eb46986ab35601a + + c36b7882bffc5c91825715d612801768 + 6ee4054c2ba134ed576b48d44b133f0c + 73eeccda37cc698fdf7999df5d4d12db + a789d5627caed537b28229b07122ae05 + cbfa3c496f0f716b0dc529decf2698bc + ddb946111c6ba10e81c72904244467d2 + e88eb1f64c1d11e90db3a257229ee46a + 10c2337d1f49eb4606abade7a3aefd14 + 100d0f547353503c539812299adb8891 + 6399a7da47c96172a64021b718fed8a0 + b04d8213f743b70d53912e37178aef1b + d2fd122b736ca2467299178c9c5339c6 + 0998e79db882ca0c8521f4f59383b37b + + + dddf1387fced4e4a338172c43ecbe6c7 + aedbe955062d207716d4d57b6c1ed12c + + 7d0c54dafaf02f34f9773c27070c8d9f + + 7492a1524c319588349955d20d0ae2c2 + 6eb5a1dae95d2fcc16f918b9e0475091 + 10ebd026d1c156f89cbab10cfbcdca33 + d1d79e9a729a461dee6f80b60c676a02 + 37df14c011fd8ff047f4d249d8ec3cc8 + + + + 15c46f86a8e2a2122fe34824c543a333 + 2c313560b1766a2cd7ce22706c9ab215 + e6c49ebff575696e2ed501e209a42516 + 7039ae13eab317f5d4e7b4ca275e10db + bda7a21abc01b1bbd0304e921c9cc40c + cc0836911ce8fb34295b00c6a3f8e9b8 + 3ea78762da36e7dc624b82b49abe19c7 + abb389de8d243baa731813b053e7aa3d + c16026d45db4350b5b2dede60aefa89b + + f94d5ee81eabcdb23d6e3d0c597a79bf + + d620e5717970d1b7bc8163acf2011b34 + + + 4e7dbbd461fd48a1b829102688d600c9 + + 82c89c0df592a2f37065d1c690b654d2 + + + 4de85c0fff011dcb13d7c269cd0439b2 + e71535ddc6d0e2607e8a12842476e3e3 + + + + 85e9957e14d50f3b84cd52fc0618bfac + 629f87c90718a23897f173354905ab84 + a3c15ec106f85fbe964b49dc31ef2b2c + 7cd7e2e866c93db5d68f77a51626a43b + + de81b548d75057e3bd2ca227748aff86 + + 72ef3efed027815b107a71f4e987754d + 723a4615b94a21c979c9cfe85d81e50a + 90c118a801c9f293c2f341fffa30a14a + 5173fb5053527af7b83077085b192d67 + 00f760a2731cbd7e7a145e02b30316f6 + b3c8598f88e6ac643dda6cb6f29fb3ba + + + 7e001110ebf59dfe7f4c349b6b9170b4 + 906d8963c4d92ce071ed20357b0caceb + 242b8addf5fad5fe6827fc2298dc7251 + 56312ea401d90135d050ed51ec15e3fe + 411d41c7c1529851e6dc99d51b55e4cd + a42b73259fd641660ce801aec43568ce + 5138adb25e3ea6ac046f047925104cf7 + e283f95b91c9ce6edf6ccfafca9fa2b6 + 9d0448ee3741af759f002fb61ef0ae65 + 51a18f39ffc1fcf481861d542e6c8ee3 + eae399d43ba7cacf270df430c7217d5f + + f94d5ee81eabcdb23d6e3d0c597a79bf + 52cbc9cdc6e20f33aad9aa5f9f6614ab + 777e34b707cb5e80d245557b25638f30 + 83253a834f5976c5a18d185156bdae93 + b6ea0570c15341449e6414b3be512faa + 998bf97542f99a7735316ca0bd8df9c8 + 62e9eea6857334b0bb533fda57b0ac27 + + + b11dc9f541ba97c957709da271e29d6f + + 5e5bdafc1d57f0db603358de9e402d90 + 3bed579af975f4203422e3f31824b1d2 + b17725b2489191ca4f6e9f99b2e37ad5 + 186eef332446c8d837e456d931679b9f + ee38da68da6bb6f5dc30e634339815f0 + d9142adf9badcc80449dec75a3344542 + 437bdf0ff777aa0565cfaf6813d81412 + 9d836173241624e899b57a2467954867 + 435a118df8b6d557a8da46a7a1974b0b + + + + 53ac15248b3453772c3e1bbd62794415 + 8c059c85319cc05a994ae1c41afef794 + 3d3d2d9d3c5d42963936c05218723fa7 + df4ffa21ae3083f3c70f04bf8d186a65 + 8337289913a1b6ff95ac5459601f0551 + 02114831d60bdaaa00665706c1471a27 + a02389116cd3c7688c6cff6ec98c36af + 7bb0f60ff9c1084826e6c7c509e05e0c + 63e45e962751d2e31de11a2c83e5d40d + f95cdeabcfef9a7137b9e2a0499ed6f5 + 30ed849cdd18b8b7d6d32d979dd09b42 + 3ac2d2477d3dd3dea18c981122f51d5d + aa927110d41a6a62addcdfda51d69ee7 + ff88c4054eafa473563367942110a972 + + 727a6000b7cc8d7164053619b8a4d676 + 7067cf9440dc657707ebcefa5b78bf67 + cfa2605e1af63b9e8e255913011b618e + 4d338060207e70b212f0a5ae726fbb83 + 39eed12fa67ee67d714b44e20226604e + 4d8bc33c2ea6ea3d42539b49ff911698 + fc9e3816097dfae0661f3cff9a609d88 + 2efa0691787ee9123472f5eafd427edf + a850c85e137cb7bfe3d566077198f5ed + 3dbf0cc296cf6f4fc360f728b2b38633 + 423b013332362ef88d5d0b5b296daead + 273feea222cdafd375c3e06eaa3ee83a + 7f21c041527d2ff48668529140aebe8b + + 6bef4f7a7517b0d07243a5e998e998bc + c066d2ffb1fb029569deb79aca06303a + f94d5ee81eabcdb23d6e3d0c597a79bf + 90a5c991607f9c02cd47c36f94aa2b5e + c9f673b11b098d4a61d53a020a58b420 + 8047a3aa61ced4b8299c4d9f15c9e9ea + 15c20c9f9c04555f6d26a4a91900936f + 18edae177ccf15981356ac4d587a0333 + c77c7fc8df1eb0f0f8a246798a09f59a + ba22614ee1753204a12699ad92f69b02 + + + 2027456cce7808849f9fd8270902d339 + + 7c68d431ccd2a7895df46e16f3df90a9 + + + 8206b5a956d318d115f238e94a4c61b7 + 25111232d0656fc45f88b57682c9473f + 5cecdb6e0ac167347607d2c41b60fca7 + + + + 21c91222bb1a36554d6650fc61d04ed9 + + 4fe1fa5b9cc620c7c73e31fda62d85b6 + + 281f60aa9e3311f8abc3d102d3fa1c49 + 11bda41fb3bfcc60b1a2dc2b2fa99869 + 53fc94e7f1ebc7e89b4fc6dec66e5e51 + + + 137cfd04750f64f648eeca2190b325b9 + 22151fb28139a9e437f7dee1f69d1c5a + ffd08adb422cbef64a47e3532661488a + 5357e95e7de6b597de704175e6a03930 + 3bb8dfd319f822e1d4a0d2fa54cc913e + 99820622d1c769378bdc4410055801b4 + 2544c28a8ea3a548155124b6859ee0c8 + 2ea86a2dfbedf6c90dcd551991d592e7 + a33594f7683135ebc1081e889e5b74ab + 4cc4b8c3799e0dde3ec47699dd2a9a7d + + 38ef72c4665dd7b6f8911edff0f9c6bf + 476968a3c9220411eb74a8671872acf0 + 348d0f11ec7252cd71094ece5d83031b + + + bcd64a2546b1c58a0b4df5472781e3b1 + + decd9bbfd7f37594e440982037d5d54e + fafd3bc83b53eab0b777858d23f8f16d + b06242100061968769a92117792c3973 + a88736710f071195f9a670004d7a2631 + 7d0bafe5765cea505e15f6a1ba06a824 + b0bf18e294636e57d3c5d3b8dc30ce0c + c5862a6aac264383f012fc5773eb7786 + 91ba58b680dceb7a2f8a721db0cea6b5 + + + + 3d486a393dbd89bfd5d682af2b4803c0 + + 9c183e662b37757c2ed5871cc31d2007 + + d3fa0f5b1effb141ba1cd1874b4fab88 + + + 6e38bae318bcfa7ff4497159954f89ad + 67604d51ec4d3c6208bc504bcbf0e7b8 + d92e06b5c14abf77b1375bebda48c09e + 86e52c1baf6a8c85eedbbfb186186d25 + 273860173646b434f310ab63f91b3c3d + 8e17e79bfb00eeab2f0db44737641b35 + 4322b29cc134f882e28a366f2afa1091 + + + 64f6984d57edcf1bbacb56e2d5ce4617 + + 2ceef7fd2ce1e8241664e07279a8dcb6 + c13a8985a753fc118faa4d3721d8d9d5 + c0f2feed23ead10f6ab1164c2679d79b + + f4da06d634e2a09ebc1895dcaeb41c00 + 0a838d0356ec5d6bcec503a2500cd9f7 + + + + + 034753c480678ad3e4da89a5234c5376 + 47a60e3572d4e996c95aafa953c2db87 + + da39cc3e75ee6a7cf6bdbd681a2710f9 + 91aa12c261e7b035e27c6c6e8d645e03 + bc8e567fad54d23d54903903afd6c49b + 2f8e708da56d5a18b2ba6ebf4fed5fa4 + + 334f5ff1ce3478b04045734fb17b4731 + + 3c6b56183fc1259ffb3139c808132201 + + + + 1fcf9b750123cdbad375add6dcccd8f8 + + + e48f8534c6419559bfa2114a3da5bd59 + 3455de7e2667c4843bd66b2016ab36e6 + 9dfe20932ac2ab790c223a0b0f6c83bc + 8a8be96b371d4a50f5c9be4ce646bedb + 15a9d01c3946614605fd7f7a59ea02e6 + f767721ae8e1c07dbc840bd004d3c488 + 523c4ee694b7acdf07477670bfb28178 + e4fe410ab66cd8a310e8187d0fbfbd6d + e327130e722893c2276bac4c3fee6bb0 + + + 5ff08bcf0ff012c96ad67838441405a3 + + d61771ae70e38f1f735ecbe3ef85c5f5 + fe48aafe16d71136259385ef9c4b3e14 + ab56b092d5569869f82523f9f1878bb0 + 9ce94f8f4592f07c94b747ec6cfb7c28 + e6756794f34cbd8cbffccdc278756621 + 469fcfd28380c51d38c4930bd87429c3 + + 0f3de4c4c46895e04469faf667c1dd71 + b34f54f30660dd319ecf6ae25b67f600 + 90cb8cb31d79b6d19d97eac24aaa7574 + d04fb020149d2ae01d3762a87241233e + 95f04adcb587f057456b40c693a8df50 + + + 83fbebce5e738690b9ba01e69f5eb97e + + b8b7e3ef4fe1a1835eeade45bda880ac + + + ac15fa26b5ad08da6dac2588df193d35 + + + + 999293471d32dddcdbd74765be2885ea + 333b4d48bb3b4858cd149d6ebfc1b58f + 1ec3b14820cead74554134842fa3498b + e4837be5340028abc3bf86c911e29cae + be20633112a29f2ada4e2989a31b7dc9 + 6b2ef602ce9cdfe15ff3137691f0ca9e + + + bbdee820faa0d6603e01d8f3df4abcc3 + d5eb9e2b81e9ed9fa82795863dc895ca + 36dd85bfd466e1aad000c9393a91db77 + + + ed5f7b9aeaf9cc6f2adb0d56f5647b51 + + + 62894fa4a8fc2405b976b61cfa2df22c + 2b209cbcf3607abd044579d54dd27b94 + fb7aa436b44d3f918ed223751f4cf11b + beca06f44a786692baccf87a9478de5f + 54efdaacd4a8bfb36de080969bcfa665 + fa1fd2bfd8d1ac84eb5403774d8866fc + 272ab46ee7cfefda09233e68a331f083 + 9c2937b571236d53b122a45ef8752d8b + + 67aa0ddd0fbf9644e1975c8344d3a71f + + 4e061dc70c95c7bd8d8759c0e4aa6bc4 + cb7fc9cd91103d14b640518b8a06cb92 + 2263c4360483c89e2204331ae56f261c + 612ce4298883d784b55095401a45bd45 + aa9e2a93a0724664044faf42079a2cee + 0eae7c8db5a2215fe55b48afaf72d6c1 + bbc7ec36d624ab76801138733c958cc2 + 3b955b33a46fa6f2e2afed295901a16e + 060ff5c90050c0c7e252c0ce9d4eaaca + 64d90de7ab08cd79f02e56bebc0c06b0 + + + 90f9fd2a00befa9ad7447da4ab35f1bb + + 7a9250e14016805d182c08245cd7b27e + 46ee3470f6683de535208a42ad05e09e + + + + a02c259d5c4cbff82b3156591fbd0b7a + 403d72436b95c7ac13b37626165a5470 + 5c26bdd39c4acb1afdb3585bee50e9ba + 9e06582777f3e0fca399075e2e3593ce + f9220d5d5cd9ed2135d61200e17895c4 + 54cedb0b55f696737641dee22e2c2299 + de89f116e31d7c624a40a8b8d661492a + 9b136aaa5cf31acffef0d0f3c3273186 + 8282e7860bff7e30e8a1d823b4eb6dc1 + 021606ec74956c1c0f3162f4381e5019 + 26126948e93b202855977bcadad96f37 + + + e12b5ccccd009d3542122b07ddde00e9 + + 006578821ab146c7e399af4d1b9f0bf2 + 561c119c08673fd8436e11424a20d808 + dd4948b7ef1025a93417c5cd72ab34e2 + da3fa8e3de0e7c06f04ada55ee97a2b6 + d41d8cd98f00b204e9800998ecf8427e + 71a8a5d82718dc7ac5bec8ca5cbdc407 + 8018429bdc8e300ac75c368660613c86 + 55ada43e144278e471a7ba1cdd7cc295 + d3b07384d113edec49eaa6238ad5ff00 + 0612cba8c11d5b3cb54e50b2c749c21c + a16a110131844fc69a7aa58b00122872 + 6168e0aaac4d3a5658aac5e9feb10f7b + 9d2fd13b3a33dc1674f7b9a8fb7a57ac + cbf03fdc2188e58444e1b2f7eb74cf50 + 9155f84dc8612a9f7be14eb39bce447a + b600c09957707bb2edb043da91f205df + d41d8cd98f00b204e9800998ecf8427e + 4730f8ba1d437a07731dc7944b74a9de + d41d8cd98f00b204e9800998ecf8427e + dfa401f9cecdbcf9b2da1e7329172820 + 17a5ce4101121f0aefcb62bf24934d18 + bd318f4a1f9b958a5c6559b41bd62cef + c603e233c57d66dd1852f6d8bcb19b1e + e5f3dd0a58ff41e0ac5d1622731674e6 + bf3dd20043754c68c898fdfa423fe222 + d41d8cd98f00b204e9800998ecf8427e + 05691d0fe248f1a804b1b84d1ab733e2 + 70579c6820523185fc90f5373c3821fd + e2fd3dead2fc9206e2d3fe8a33bfdedb + 9d7cb82c6152369f4bdff759eea625ed + 7586d7599fd0f4df8c339cb951e96497 + d41d8cd98f00b204e9800998ecf8427e + 0173f5f4a784e01a07cf03922251be23 + 5579233274e0567ebbdad4da3d7da864 + e2c99e9dcd6947c52fe2b9261238a4f7 + d41d8cd98f00b204e9800998ecf8427e + 94035dc63bff6ad127ba2c03d97dcd7c + fab8f8f40abff886a5ca893a72b40a44 + 681629ce47abe668b785acea845e6e98 + 3767b055eaff111b5503409bbd1f0c31 + a1d2a49a1423a9ae6beb0f4dc6ba547f + 092488c6069a008433d74731ff1b1765 + 2310b520ff8594576d6fbc92138d54dd + + + e373d65aa9cbf3f71c55a63872060536 + + 185c93f2944d807072c2518ff66f5b70 + + + + 4f82e8673da063449796e8a3a6756f77 + a72467ca3933ad290c50dfb09626583e + 374538889bd991dd7a66ad9ce41737f8 + 73ec9756a52e93ec6cbc637addc66fad + be885cdc435f56e33e781ebbeab2b000 + 211983ee6b868981d514901f5b1bae4e + 5cc45303c8104022f3a1e55faad11036 + 8c0b0f14158ba6de4ed30af71f8164c1 + f97f2be9f1297ddb78f8e4e90dc4b9ec + 24ce41354990f78d03927c2c2433b273 + 047309a54aa94e42df208ec54f34a53a + + + 4789161281c753e43407a5c11acc3cda + + 66a7296d6446442192f0e0490d27dd01 + 51d83c680e81fe3d9cbf732266c39357 + c108f89f69bdf943d22b4e42c33ff24e + + e85b0520d1f4588f39703b6056f94b94 + c9e8da458eca79769126bd73b6f9e852 + 80dee68e9e865deafa27948a82019ad0 + 0897b102a6d58e8f18846caa6f359d6a + + 2243cb119369ca862476ccd5175b56a2 + 7371c3ee7de6849205e7cd6ac2304eef + 80c6189584e6c94c8d680d2f260d10e6 + c47e79922aff283c166346bfbe00c5a2 + 12ca246f61ccce5cbfa53a231e71d189 + 0d898565cb12d39389b87fc11f4b6283 + + f94d5ee81eabcdb23d6e3d0c597a79bf + 2fb7b1753f2769116c70677a449ebe42 + 3a63860dd7f943a80cd8a7a9beca4e3b + 11c895c681aaa3fa0754b208fa45ca7c + 1d99b284452c45c1b376b13d65795407 + 5ac4436051dd4fc120d3e888f7b96dfa + ae5d13fe258f8c5fc68ed3f1f7afd4f5 + 30eeb72ffb9cbac6ab132c518e7d7f3f + aa33b68c0421cb2573546f34c878a2d7 + d674da234a84e5abc729e11d36a2ec3e + + + + + + 6c09b533a91740e0e5c3eeaaaf588503 + + 900d0755a044309184726533b14efacf + 9dfca20430638774e43be26dcca38342 + + 4221d68feb06612c3321e8197b141201 + a44b8a7e9ec56cab8e70b946ac26dc76 + 7eb8d752975ca9ad063f627a866fe629 + 2dbea9699a0f5b79efabf6b06fdf4209 + 4d78329778b496fb608b31ac6a6b6e4b + + cfc5b482e19a6559b87fa3cc80665720 + + 9bc1ae99b389de662edb720b39efd655 + 39ff463a3b57333c59769baedb69507f + 00164d2168de59d0d2e17100f27e9d55 + f4e2c34fd3931ec03d256517b44adc36 + 408db57b1bfe46b0f4781e8bb13d75d2 + 3892597f073eb22828b96f9e2f2d20ed + 2b607a2c316bf22a54b836d385d06834 + 4152a458d6e230a6dc3c42bc57a6405e + + + 7255b051704136fed76ed62fc610e556 + 910e52fde60749701c826ca60d85e986 + ac08a0283dc7483957f4bff880384573 + 5a10efebba929dd8dba6e85266f518fd + + df890b6a9c5b2a3dfe79c6f2da4b2b4d + 88c7e281a67e34466197e0d9543b7f58 + 226274ec9cd6f2c5c9c05bdacb1c2012 + c78d485138ebdc2fa2be48a396cb9ad2 + + + 80d3627612fd5b86cf4fd390b3d8c69d + + 077018aa786240acef5b722a331e6021 + 5e4e1d82e2223ee269ad846f3bc5a6d3 + 089ca490f923e6a32cf080b0e2a27e2f + 37a1e8761c49f6ce6e578ef85608c5f7 + 0e9ed2fddc2679c182e9e432b71f7d25 + 6373e9c3d6ac965d3625afae6ca979fd + + f2e680688091d61f4afbb44ebdfa19ba + af08ba67889825483195675c16a9e226 + 3107abdb6e086cc4b8e9cb501b2421a1 + f4421e719587d806a47ef6e582b652ce + 9d2ff6835594b68dcc66f261a78d755d + 19b05edbb45c1f83609370b2e6970913 + da63c1cca1e13c3a2ce91d3b240ebb5b + + + c3da11ea9a0e2c8f834a26321b1d32c3 + dc467c624b0d0f3ffa6aa489776d1e12 + 7e9bb714f4fdc03bf4158d3ebafd9181 + 1745b4dc223de5bccb90cf8374615487 + bc2fac16c75f82adad2abaf7448d174b + 13fca1be9c3957516e99beb9811cbea5 + c3c1bc92a541ed3e4968899dfad80eaf + 3ed1ce950a26f36606cce120f48d9156 + eedf3a5276fc76bb3c7854d3ae9410ea + 7bca0edf0d6b67c5d15556809fb6a70c + e157bc7ad823d822764b6a90f5f31953 + ac128a2c2c708af846d2261c126b1bf1 + dad0e19414d314138cb293a7926de3c1 + 5851c6d868699f1dc1e6eccb96793449 + 20542fe00d6a616c0383f34caa39568e + 7323b25d1887b9f2f704d930d8b00331 + 508afdacf70d91be915a108073558515 + e29f0bcce2f7b79a48cd953009ddbcca + 9cdaf1c9f3de192eb83443069728ae77 + 6a7031722e579b577881dd26548a2582 + 978a0d3051ff3417f77e6ca5d4cafda6 + 5f032ce567b0477ee15f4fe7a5c30b18 + 720910fba35c75bce0b3a5c3f831fa44 + a3ce630d96fcc9a0417ee0bf29d6d2ca + 2bfd3bc88578940e1f1109874af3c5f1 + f88f0ff113a50331dec9758fcf0a6b5d + + + 402f30d06fe9984885ab94bf52b2f47d + d889142ace2ec7672d19d3d2b98de1a9 + 675f61146da7cd1caec751a2d261b0e6 + fc4183c92b015227adc532ebb52e8737 + eb48f440ef9240bbb275c8a1874aa05e + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 1330018384392f42e4b5caa6cb012f95 + fe1e840ba8c0f658c8ecbc1a1e633fbb + ec840c41fb4ebf315db6566dc2f43c44 + 09b6ff7883d862b644023c5f2252ac0c + 66b0eb2f93605711252e258dc1d638d2 + 757b5dfd360b088f463518d9c9f8e29b + 6a8193a870c87a6c42be82bd04eb874e + 5886053a5addc16443894c11303e7ee9 + 09c4bfef4b10e3de1a2f84ce9a838a2a + d30f594ae147326a884b4b6a6a071988 + 4ee6815bce76ff9417d8a9cca9a34aca + c1947fbc008834ca2e455fc338496963 + e5caec1d4f00b03ff0da01425ed9ae3e + + + 73dbc2b630fb44196f4c38c3857a00de + 3ad2f4ca7773ffc75c280ed8f4af9ead + + + + 07fba057ff866812409d635020fefcac + f40ee172e55e27570135688e2a3fa766 + f6a4e01530a9c8985919f3bb3dc56182 + 9ab6dab0a0167331d0e3b967ed67398a + 12a18bffe0649e9938136f25792a8250 + 350b8ff63de53384ea45178a2f5b80d8 + 9708d6af964cf0827d7f27a5d29d32d4 + c2883d0b5e1e7eeed7ec66ea9853f5cc + 823f2ed1191ec9723d46f2516d700973 + cd40af5a55f65a8427ac2ea88576d1b4 + deaedf00c064d7e5dd98a83991b7ef3e + a0add591e5400f7ace5a103885f4d52e + c1cb0e4289858d151e5f14c83f74f8da + 6b34b8cccb15fb0ab80db53ebf58c503 + 0258e8f9f0d6164f6145b31fe153fdc2 + 74fa816d7fca704d853fe7a6407bea8f + 8ea0ec8560f484857be93f54f3659a8c + 26904c998de107be879360cf10e29889 + defce0bf7d3e026fbdaebb0cfe7abbd6 + 209d469451cab1965db1c29bb94ecda3 + 5c1611771ae8d9bedabe5e9e50dac4de + 02216802051a8a2a82f952a39d17b117 + 31cbf1bd957d4f4c3401c20d9a1b10bc + 50e9c130e0384f18d27fe41ff3671cc0 + 730a97d39adaf3c0859cc60818d007fe + a2462cd8471b00ad4eb89a4b868aab93 + a95969c966594fa2afcf4c0f58dcf034 + 6e4b09fb19426474fb0061e940266c11 + 0624f64dd505589951b6e9248747c775 + 9e78470752acc48d30b084a682ce20a5 + da9b866b4dafb5360a0d219ba74c7a73 + c1cb0e4289858d151e5f14c83f74f8da + a6c568a98f5655a6fa4ac67d638b7e2c + 5f195836c871b4a5f22599ea10298908 + 7b655ad4b14011f5d55fb7df0528aa2c + 7b03fcbcf3c6586ee539377f3f5a3bdc + d6ea93ee755177b3ff55297511c91811 + 0a5e641bcbd17d9502a2f2f3e1d51999 + 4f93d9f1160c6f442c4d857351400820 + d24525aa71ea6294f1b0dad40d7a5b70 + 0874c46f7c8bfc00626f570cae61efe7 + b8704be78d7be163b715e166f07257e3 + 32e90c6abb0180131397f586476c0719 + 5bd6e282f6c0d55315d93df9c1ccbab5 + 823e1b06daaffea94bde244e75028817 + f938f7d662b8b226234101be6532354e + f07b53a0e13bb3f1267b212e07b49a14 + + + + + + 2ad03db4112dc702184de9f6603bad59 + 73a6b8b00b5fb3fb21201f6dae5bcd23 + 92ad340f323538d08b79349196963442 + 7e4d1577d97a7e6ab7d6551bee0fecd8 + a0288ba1c8e2991f968d7df0fd294e17 + + 839e54bb2f90b5831716b8891295c686 + + 90618fe0901d8a976139e87b2b633566 + + 45c3d23e929835592a36f37d3e815a66 + 57173e7875185d0a5057c67a37aa0345 + 575ea8a60a37c6e1a850b18c3d4874c4 + + + bf5175ae9331381bebbfc290ddf7ef1a + 36416c157ec847738ae99b40df59e610 + dbb574a0567f52da119665c5fe855d9c + + + + 2ff23a884b294de20325b8c889e4a3cd + + + e048a68c44fdc796f0841a394ed7de30 + + + 2c53ef5cef9883ada01c0b45380f80dc + fb8be94f06b7aec191a4132140043884 + e4a1dd50dc28334c706d622bc0595004 + 861279800ceed78594a84ab185a9b09c + a787ffd2000825ce64066b37e34bd3dc + fe357c6db089348f055c3f0c51add003 + eca4ea76b17fe612f0709d6c4516e9a3 + + + 1cb663ccde5662f278efaf3e069b56f9 + 8e5091318b4355b8dd2fc730dfa9e516 + + + + 62240c160642c6af2a602d4a4ed2bef2 + + fdac94ca3747a2f9d8d946ba2a2a4e4a + a158bbc3db99a244c8f8e3e1369759c4 + 581a8729d53bc1496b0d03603aa25220 + baa9e5080a6b335a91e98cc835b8c11e + ed2771554f76e4769326d8cc0e1030a3 + + e5cfde243c08382ffc85bab30a35ca5a + 9f38bc9f73909786428aa931d37c5d0d + + + 00e3c1f6a5f9ad4ff54d227084a218fd + 033b6c361570dcf689d83d773a72d8be + ee964a4fcdd3ed4b4cb50060b3fb0075 + df1f35e7ecd9777dd206714cf741cfa8 + b343530e233ff674fb99542f7967126e + 663b28e7d172c96346f8a0439b67fc49 + c7bbfcbe049c3ed14b927f6c00d2902c + ec9cce192d6adee468fbdbfc5d899717 + + + d8ee19c968456d9689f1de8287cd5837 + ecd64f5da6724b12011e41ab7568b448 + + + ac32a80e9a338f7a05bd74b7163a611e + + + 6a0cd4ce25e4ef180eda9f3b1beadf89 + d1aeccf9d4ecfcc7d3915d8849cd6d6c + b668eb9754741c44abb06d01bea40e7a + e4baa2d14cc535e17c2f7e41322c57a2 + 2fb23ad074d219e02da477f22ee8b4c8 + + + + 8659fd82b64c42c00372e350dca7b873 + 384a7c9e5c9e25e5f20e4787b9b16b82 + 55e2d4fcb57a6f3d598fc27f908b912a + bba57bacbaf42b0e4f41a13df286f907 + 59bb68700f5e85e35d4d4a4baf43eba9 + 50e06c0bcb6915abe91f7c8f408a0b55 + 1827d9d21b9be1010f190e2c1557c236 + 74abec522b4cbdd896a0360898b68a9e + f252936f5de574cffbfac6f69ab53bac + b298870f15ec4c57cf4eeebfd50712bf + + + + 9e042946970472392a27351d3b288e51 + 6ca0aabe7841f5ee6d6372dfde9b6bf5 + + + e7a7fb83aa06740b5f167df15f355b5f + c292c550fddfd200cf531d60f92385c7 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + + 355df85ca66fba931b036b381419d812 + bd0ca4334866234aab52c09363adc617 + 28a39396e1afaf161bcaba0f18a11adc + 904f3f052dac16c69733add50aedb446 + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 283b3574fff8ff0c093c8c2c74024fb0 + + + + 6a010a9dc54fe3a8f05889372679abcd + b225342d3c9376a4d9022aa1effc5393 + + ab9df84eaa8a7501e8814a0387bec460 + + 631e81aa89be99a3d475822e6ee5605c + + + + fcc6271923f8d35cf48647504b3e373b + 784feae6ada41e2cf869b08184bdb07d + + 4b745bcd09b6cb2eb9987ceb8f8bd3e1 + 8c9ebb864127a7475973946869a29fdd + db3956de03efd77bca0d76eebc86a89a + + + + 331953c90058ddad06e9ec48fd9d47a9 + dca05253c0370b824d51bc4b64168fae + 9c7b1f761db897b9370643d7dbf7401f + + 26f55b9ce37a784ee7a2217759884132 + + cb74b3c6fef3784fc7871f2d97141f76 + + + ec3b22142369e358ba18d7ffe5709fb5 + + + 265df434d244a1392013028dab3954e9 + + + 99b492d6531cd0e8c3fb5746263c850d + + 029f35c8990cdb8cf2bca14d4de413a0 + + + 7d4d61ee4f0a2b5db080b19a866f1194 + + + ebbb7bf64e3dd175f768f860483f7757 + + + f94d5ee81eabcdb23d6e3d0c597a79bf + f0481784e96d253dc521e3a935fa4330 + 0c13cdee24495ac56aaa53e7032c679e + 4d696d949fe3346f1f3b37a0dcf85ea5 + + + f94d5ee81eabcdb23d6e3d0c597a79bf + + 91c47a6c00c9c80c482e14e70e07a6ad + b687691bfc4aa0735f7e217ef6365204 + aae6d207167e6b71354c1fa37b4e408c + 2d654d50030da2700495007e4c3e75bd + 1a008ce99e5ce37559e20466e20d3ff6 + 868f71d3df46df77259fea77019a864a + 8c0120aee06697ca983340d3ae4c347f + 39bf74aca18e3cdf188a60f9221f8a97 + 040e39e2f70d2b59326346ae40776ab4 + 2f37608a0909577a6f695c3b0485652f + + + c4742508090b144f8e4a1a4cc1be4e1e + + + 45f2bf3e836be25a1fe8e66beee4c23c + 60ce5d11d084e8e4484f01b4abdc408b + 8640a27e209d5e5a740669c4b29670c7 + 1f999614eea0587af9231856c8944f9a + 8204ea6162a1fd0eaa2a9d758115a198 + + + ba107b60e48e97cbd7f63f358ec558ff + d408ca7dbb759bcdb6e265a4f6065d45 + + + a885e7efb88ee7c06e544fc261c1d5c7 + 0d31c5f549780ec25333923dc3ba0b30 + 9f2818f2c90c14338d668c8f109e96ab + a05dafa1dc15fe958d9077ef69b2d75c + 98eb8dbff71696d8d7502c14a312f418 + 8990bfdfec55550ffea8f48103813c39 + cc505b6fe8bdbc4eec1c9f089e9d5fb3 + 1e6f2d5ac31be289bc91e6af67f0cccf + 289cadec7d76f0eac46536f69c5c262e + 644e3f175c93f827d9b378b2a9775248 + cc123e3f45b3068d5a7e8fbf4ff8c80a + 1550b7ae73127968f411549d5ed68c1a + 5e35c259702f4ee29b01c849f8e96160 + 22d22c7fe11c7d8472250b23d5cc50fc + da530d243042b42bafa2e43c5af3bd96 + 0f4114a0d8e79156a6556f2233ecb035 + 204e2297323e1313aea7636e5da3807a + e2eae617188efc730b413a6b787e3dd9 + 8af19ee55d5a03494cc183af8bbfef67 + + + 9733e9487778e6db14912ccfbb3d80af + fcabd8e0dd730ee83ebfc6071c42ab5d + 3256de80602008898282f7b31a6d5e9f + dcbb042c1a60b9541e265bb5a7abed53 + f53b9e427d8d80ebf83bc19d8cc99078 + 84fb02c95f0f94932afb2e68dfa1182f + e83fa5c25a94a524c2f7a9f7b91578bb + + + b8c035459867ab7c676d0fa3c0397425 + ddeb1e74d0aaabd250529f831c5ab133 + ce7cb91419232160d8412bfba5e51824 + 1836692efc51475dea3f200067929a8b + fb5b391b791a04be4af706f2f0866fa6 + + + 35ea1af9f9876ab8418f5a4ad5c0697c + 8f7fe103f3e6e2a61742438d59d8e48a + + + + e6c5894c0a097ff067d888d8f3fd2b07 + 9ec2a41673dc4a70d3e55c71d45ba61a + 52c25cd4b2f17964da915dee559b1391 + + f43e7efc81198edaab906a43bbd42fd8 + + cecfb33d3e52a386910f5a042e48b714 + 9174fe41199e371a4ac52999134db470 + f285f2d91e906b80207d234270bcf310 + facf45cbda81f9319328d365f9e67f42 + + + abed80237826524cfd220d9a1b6b5ea7 + 0e93512998e18bf895844ec606e4157d + aaebe8515428d6198b9ea04e6432b122 + 09cf9f54ebd140d318af02ab43114141 + afcbf38eee6e0c65337ab882a43e6843 + 800a58410f8701041b179ef87dfaa714 + dad3472a12bb893fddf43a33d8a4620f + 8b7525b01b66f5325839c20ae481cfe1 + d1200415e6abdf730d8628c15868fc69 + d6943a996f2376fbce49e5f7fc1dcc1f + 05a516a0a035221ba180dd7e057077e9 + d04bb6096bbb459167aeb7674f5aa93b + 96dcde4d71879226fb7dfc05f8a28998 + 7f649ecba46f90e89b01cb94355cdd6f + e5aad073dbd1b93f30a8da7abb87647d + 4918ffc5a04932489b2f7625da51125e + 61fe35d5f10f52424903eb966453145e + + + ee15146842bd8fb0a5f0ff5742672dc5 + a8d583c8c33dc9bcb56b869e545e019c + b05bf1097eca64a1b3a5e6efcaf63d02 + f297c1bb70f2bb7d4f640a57475d7959 + 49fa7e35e4c6112ad425eac1b8c001ce + + + 1f6ab9cdf17a8e31f66ec8292ecf8cdc + 08b3509fb6981bc7f513ccacd72db362 + 0e7eaa462cc501b8a25f622144ad3516 + 92dfc11fed95b14e747591f7a6b8a451 + + + 500b5abf23324e267406901928a9ae56 + + + 07dd6c5d85fec923d4c16e86cbc8bbf2 + + 3323712708526454934914d53d9a25e0 + 63709dab6039758a8fad14fce662c655 + d15af6c8f7a1877c376a853baeb88c94 + + + 8740136c4f7ccef40751e2947fa42150 + + 9feea361c6d361ea3b394a46639e18eb + 08a74244aea9e11bffd2d30de44479b2 + b155f870f957ae8c5b5adc5e7282b736 + a452b64282bd6da7731a4eeac8d4ed5a + 8b30049a50989e04b8b8e3946ef36499 + ec726c11cab13e2d6ef17385635bca41 + 3fc4c7c91d1d6ad3eeef2e9a191fd222 + 1bf1288277dbe975a33a2d913be61a3a + + + + 2fab37229f07732978890af04327f891 + + 74cd05deed175a6e1b04bdcc7eff455b + 07742f0240c27a9c514d02cfebe1681f + + + 15e67e1630bdbcc6f1fc34f9dfc03a4d + + + 30a327a2455f0988ebe29d2037423523 + 357e0e980140f5099972ec40c5d012e3 + f880ea4fbe1c4c421c63ae8067ccc2d5 + ccaf3ac0cab77c07df909eb00e7aff75 + 2c752300cdd585bc8741cd54f20bf58a + 5838ba0d7ac88fc49be19255a1d2e217 + 571ee0a6b89ac7b6605dd4780554be4e + bb5cc7a97785153673c1c5d8e3c20d1b + 0f56c8105829f0edc56581d81b96759c + 5c94c1c6dd8e3208fa7c440fc832b768 + b757d164f93741a637f55d1479065cc1 + 543b74b5da35be17b4cc518215ff4592 + 707b3fa8c3d0093b61d3bec0ba110661 + f823e2439cbd799c34a995cdc178ce60 + + + 8755542755363d164e89e085ecff1208 + 10dcd8c5f326ba939408b9c3d7926961 + c00cf409a81658e86011540b8617ee2a + 9de86280851ae5c567050f45914dd312 + 262e7d461e19eb04958fac1408f829a7 + 3a5516509d32c8ab2432c9939c355689 + a2100425193d548e658479d6770272bd + 0448d4d617a6a217ac66f4dbafb9b409 + c3675af1f94bd670c978d56dbcef8ad6 + 3c7a3cc565a61ce7981428529622a6c3 + 2090d9f664ebc875a6cabea2476ec0cb + 61c4dd6c065251e9d60c430136aa1f8a + + + bf8f5b3f0370ee05ae4323d22cd852dd + + 33f81e997fc839df9d08879547238648 + b907840c463b5d7ebaa0e272ddf08be2 + e505121b386ed8e3cebdaf44e1491c5e + fac50ae2717a5de84269be09c971d1af + + + 02b7af45ba41b422ffe7ea310a1e01da + + + + f89d6ea33fad3c14b68ab40a5bfd5cc5 + + + + 060c37103dcc8964c28952279f6bdd1e + 2ff043ec6034ae3989eef2d5cff285d7 + 7286543e95848bba717b2a167848b973 + 0553c8ff4e964337bdb97564c9428616 + 9c7217add94846446349e81da563a6fb + + 44adc7a89d83ad55b3724ae5924aabe4 + dfe830db355ee64bdb745e59a656b26f + 1a0925850c00759fc24628a12e64bbf9 + + + a10bc5d2df7ebf3dc763db4dff070765 + 05cbc11fe950606aefee8687efcb462e + + + eabbdb6e881b5e0dceedcad25bedceed + 1f7ba7a90250f9dfac70ea012010a773 + a6ee0d99a610059bf7e56fc9ac5c683b + 17c85c5e6ecb6101e7f6c7bca612056c + 3022830d8bffed7192361d074216876b + 6fddfccb59e6f80b4724331efcbf36d5 + d9457b6b4febb6bf3f4184bd56415d41 + b65878c4cd94644758f9430de541938e + 35c7cec0a710059b7ab5ef90e7b931b3 + f56b9c6234c793b90528fd57d59ca6a6 + 94f9d32ec337ce84e830127da1b1d895 + fe32158e8d148b446b98e522a9365c74 + 29e5d6d00c38fb43eebfd029ff2658d0 + 25eea94435c4108a009ab971804a1211 + ccdf3ce334711c67dac6187e03042c3b + 1670652d118aaf84a7138d2eb3f478d5 + 84132c930acbd633510d59cf09118507 + cd397c9c97bb616840de4f084b4bdd43 + 8a70e58b0e513631c2c8b2736b954422 + 2c95042e2244c15ba47995dc8bbe1269 + e46d15799553777cd216c5f8ef66a434 + 3edda26bc808d1b3594526b4caec1c44 + 154f847e4b4882eee943e599c2056a2b + + + 1220e401a9bfffc2e5b29f38f2bdba3c + + f449271fd137259d38283beb25224dd3 + e1d78eb100c96506a30d8fbd53a4f2ce + + + 641edb52d8c1c2b6bbb06ae8b855f477 + + + a429505b8247d2096d5bdba6de6d1a15 + 589ea2d08ac278fba668d7df93782fea + 023b87ed96dbf7eeb05df701f29f75d2 + e00767ed01b28677d648795da9b4b0a6 + 1c2a4ed3c6d34ad608a9f1cc9f6f9628 + 07e27876d9b2516028d6996d52d28972 + 94470158c75a5065d46157c10689736c + cf10129903c01cab8c1f8338d734f85f + + + 4055df78b77cdc9b79160a281930e4ff + 87aec5a94c94ec7a5dd1c0839eb0182b + 2bc05484c4dc57099e93f908405a8fa1 + b83f0f32ac2625f7f521089835b0b1ce + e9c7fdbe75cc46cfca76ea1f8488cf38 + cf2fa716565f3fb2782e9c7da019cbf8 + 6f9764a3524c7deefff3b1a68e6c547d + d0b6eac72b5bbb378f857972add2afd1 + 26ef327f882e994bde2d6536df1c50e1 + 0544b9cf1e9c8483c8028082326b337d + d41d8cd98f00b204e9800998ecf8427e + ee403d4c67e9ed1775157be1d117076b + 1fd6e153823ec25e5190c8bd344c388e + 3a528d674d9166256e44d3ed3098b6bb + c62c6f0228e7cea2b6ed2f5f9bcb98cb + fcaea5bc55e187344399f44b04f215f0 + 2658581fabe88048d5d78c60182bfb7b + edb218b76bcf63873f19db269a1d4265 + 2009c7a9bd8b841968b8499deb89b5db + 9f2e34b0e6f8c27b2da35a7af2ec0b32 + acbd18db4cc2f85cedef654fccc4a4d8 + 1a2342bec032c378a865ab3af0dfc0b8 + 8baf3b33f0339f4a7ac4b2ccec1dfec4 + f28d9c8cd9cc8bcca8a62d6907e1c47a + e9024243cf883974fcd60cd0924633d2 + d09fd9c23681cee83015d259becf1adb + 92610d4fdc14034a55c22b0d1a442913 + 20850a9dec2a7f8d494e8ff39e4d1a33 + 546c6a060f47cb543a7caf0b4e361e40 + b74e117f5b0fd8901f86419f91d3671d + + + 3f82abf66a7d191f3efac0fe9c7098e6 + + 34716cafd0c2d4f8958866a60950856d + fb72ec5347448ed6f1fbfe632df0a51e + + + 6da1c16dc63d705d8348660d8595ddce + 6cf5946fe61f8e67f25f100ba04395f9 + 463b066847257a77031bca264cff4e43 + + 4341df5d48003e30489a294a85aab17b + d144ddd26e728310630a38c2273375bc + + + e2c388a9fba9a1878eeb797a0a480450 + + + 72bd3901abed01e9779c8142d9658aaa + ac1d4d5ea00b710fc2038496ac69363b + 0b4140d6fcd855c629d17fb8d0ad8d57 + b288652aa53295a8249d836084e456db + 13205001497f45bd89845fdec656c7cc + 419b75a2ea6c9589bb3029fbcacc1c17 + adc9eb3e340d38ed6214bb223b58d479 + f233f5c77b462547ed9eead069d80c89 + e0d258b70551d8e169f1a671788451ef + fe77c8bf8d6c8961fe2c769521240287 + 0d00feb17a9484b97a9d1779f89c27c5 + c09cb26b72d19b21dda388ab626262a6 + 369670d5358367183b03347f09b4e235 + 0eee5145596eb022fad54609b39fe255 + + f416ca8ad170fe6d5b2168e20f8c76bb + + 6c3f2440bee320dcb17d3627351ebb16 + f94d5ee81eabcdb23d6e3d0c597a79bf + 66c4dcb94334cf4b6f056936f2612a0f + 4acb9b104ce0514ee967f7e56bf07e5c + + + 50ed9646e783388149686780ddcd8335 + + cac97e90b3102370b61780c4bd69d9f0 + 59069d390526f1edc01673fce42521b9 + ee8bf34887ef116688991192d51167ee + + f94d5ee81eabcdb23d6e3d0c597a79bf + 070713856c1543e42cf85f83101c4aaa + d3d2bb31f1e62d2aab77f18f8ac89fdb + 5a50f7fe7503dc8842c01b6df64b007a + + + + 56f1a81e5c57a3c7539c21ec834d4c70 + 12f8ebf8056f5df70c00fc2b69b10a70 + 5350daa5999cf1a446d82c3c6d52cf9d + + b2cac5862239585d89052ef30faa13ca + + 15221dc6092f2638427b8e3d7838f1ed + 4c204ea641e58cca2bb816bb169b04f4 + b52ee8a0305257fce70e433a8e9352c4 + 473e75bb255808e55d2ada8b6c129d57 + 964f51cc7c0bbe46238bd29a38982b2d + + + c3c6474ef780f5cfe2ead3f61e98eb37 + beca33407bd9e538db25bc283d1a5494 + 514d2b71ee5f24af159b7120d1858e19 + + + a9261047e54f1ad84cee265ee8204abb + + + fda093af55ec1dc89ec8745c85eda0d5 + + a8ac9b5e185e2ecf3418e612a788bd6c + + + 497ec83e90a71e2a5938c5720c978a9b + 98bd42e0d3800150af9a2bd85c37170a + + + aa0d5524b3f5d670163ab0373d5b1c6a + 9367d503a39d81ec32525ea2903fffac + 70a3cca78d1933a1da64f732ff44a9ef + d42b32ab9dae224bcc2c7fb43e3e9e50 + + + 59710d77c5b4b58dcfb7330b142369fe + aa27f6d32522a576944798557a0a8b04 + 20b833b6019466c1d1883fe703b812f1 + + 8be96a7716b75c1c1527d134d63fab75 + 1307619fbefc8e5ec7d651da3f2cac70 + + f94d5ee81eabcdb23d6e3d0c597a79bf + 2b03be4a264af9990a46058453ad054f + 21bba8c1948ead3563e82907a8de03b9 + bad1bb8ffc03576760fe124327e5c5af + d6c0443297a9643d4ee0884ae2a6ce36 + da449148307d3fab6a5f7a438c759946 + 214aeaf923c72bf3e704c6dbf61ba4f7 + a2ca4ca814c93cd0abb5a3393c436839 + + + + 71cc1d454cce376f33e6d27aca175d3b + 1199b084e0ae4f14c3234f7a50e6c352 + 7e69e361e2d094ec4d8c1db32849b5a7 + 9a2d567ca31773e1a019ec76e71e7036 + + + 77f807259be5237ef849451ca907e7d0 + + + be97271ea424e8c1527bc655708404e0 + + + 0406e111e2897c5e69f53313eadd47a6 + f0dd6af86d9b0012668b4e023cd2adbf + 291a1f4a3a19e5ce41c64cd36f6766f1 + + + 52f19bdac1e53258be6918d67c5574f8 + 419e8851514392a340707145362525cb + c46598d1fb9614e3888d58d2ab171f05 + 74ee9d7f28d077c2e55024c829c9cca6 + 99c96496d748ad8138d2a284035ac83b + 5164a438f770e0f08f76582aaf7327ad + 29eb07f3d0b581bf82bd46b3cb30d594 + 4c878265a7467d53aaa321dae163d3cd + bcff4670d2cac87c0c32682ebd411532 + d41ecda79da71e4be82f87378d1fdc95 + 48d4a0454e51bcc60dea78c92672bf1e + 10ed8026145e6f0063dfe3f94535d001 + + + 178abc46cb8060f081ef43fd5ff00da5 + b7a4dd1b8db962feaebcf304ac6b4eac + 6d19725e88fa202953264f14f9e1bcf8 + 11a1d1549dbcc85b074810bc7e589967 + 2ce0453cb021d474b8b68031d4639a25 + 8c7bff66a9500b10fb4d13e1d07e76c0 + + + 996f766ede662537ed2771667ed4675e + b65b570d376f3a8080527c94e19e2e24 + 87b9a818e3443fb25a5f3625702b8cb2 + 6ac6f1ce576ac19dce389049fc56ebfe + 4369c57cb17fcdadf0272532ee1b4472 + + + 292c1d4783d9211d0f4db7782638db34 + 5380417cb1a7fd4e847ada1ba01f6752 + 58384ec9d2bb1c270aa371f7c2e2a1c6 + + + + + + afaefe3417450787b59d5a1d4ad1b387 + fd528a896f7c6792b370930f64e58a2a + ff48d862939acfe7dc34e2f8df8b14f8 + + + + f718b0e229b9ecad2a4fbb7f4e959f7e + cbf6c6b3794a80bb5d10774bad4770a0 + 05f7bacede0d329cdcc9c6ad57fdc807 + 13a4dbcb44238c50f0b3fb4b7b329702 + 50f4e992caa06c9ed471fbc4d7265c9f + 2b547625f528a20bd422ee0429b2c096 + c30758fad195eace8eab1ee3c39c6b79 + 97f0a44f233646b51f69c339adcdbe91 + e69749409028e8290ebd2eaae9aae9a5 + a5645267c80a90023916bf506f56a245 + fbded93c3e6686831fa3a59517959500 + ccc84bcc50919e638e3c8866736ce853 + b2bd0e29d5ec67d68dea16e24a5ee6e2 + 4064c215f97c841b9abaeb5579ed0ced + + + a09951058a1c2e6cd1fc3556bbb0fc85 + e76cfa6210221bcfb587f68968af1744 + + + + 0d5f2c7fac6620bbfef89198a44e971a + + + 6a8272bc6ffabd4fabb08af7fb03930c + + + ba4a99528afbf00d106cf58a2c93aced + + + 92e44780bb860eae7858a1be15a5956a + 6dbbf5c12f8a65cb47009a4d547d3a51 + dc20a4b728e7b22730bf2be577c436f6 + + + a0535aa9b4ba74f7d7c222dbd327c795 + + 3d370e094da9a81c9f730e3638ba4fa7 + + 9ffb55941a0a2b983aea7944b8d3c015 + be88b166d9023a21e3f8b930cb952e37 + f76a205137c50a2740d9aed1cbbece2e + + + f69f86a46184fd4ae4b3728aed1ef289 + 419eda759d6d18c1a5cd02c890c96f85 + 485bd0b80e361a32b9d92ba6a2c996fc + 73c39c81fd43936c53dc910833b9994c + e2b9063a74ccc19777c2983ecaf84b68 + 737d37a574bda99d84c6c9d50e27907b + 798659731eb763c36c7c5c4a0ddd8390 + 447e235c26a4465e78a6fb9ee2f7c1ce + d1874d6e61ceeb8996911ba9a4d572ff + 3830580637504292f3e335d73b9312e3 + aabab9d8a6d4f6fa79b52d8b7efbf963 + + + 61c7312e6cfbd2a6b1f4cbf44c7ad83a + + + 67b56dc84acd0cf8d0ba1eec44a3eac9 + + + 167218f37cd2c1718c349b189d1e83be + 02ede3aa787b6e898ed96b9237768104 + d4a1bd940916362f6516fc5c8f59fe87 + 7878ded2e4d234681d7fcc8fdfd51d00 + 32e10d38fa321a7c29e0e9e379e2e7ca + 52706421fe5a1dfeb3ea6414d2a406a7 + 40442780c2acc44dd7c1007a9741ffc6 + 68fbbcd1ac25dd1ba691ee0ea1b8fabc + 0b57b727b0c9d0a061abbd7765e4ca30 + 1db76fc61c31ec016ccd99f229ee43a5 + 09688737429af950c0ebf380f23cddc7 + 7e8fb861a93b2ef04cacbec9c8626c91 + + + 20d6821490aa42b99e3ed9d3f220a740 + + + a68ce898be7470edc180a21b646543d2 + + + 7099d5e8f4e895f500a5dccc399da995 + + f1e08fd7dd735faf3738ceb487ca6598 + d41d8cd98f00b204e9800998ecf8427e + d41d8cd98f00b204e9800998ecf8427e + + + + bc9189406be84ec297464a514221406d + + + a784644791b85cf23524cb50532459a9 + bd4fd753b32b205184d61fe901f3cc99 + 2733cca721edae093bab7183a66fca5c + 18b4f30e392a3ea5e2871c3c0406cd83 + d3d7cb5315b72e8a10083800232f975c + 5db6756e72842744a2f79e7976a27b27 + + + 936c6496f075090509a4124930e62c25 + + + d41d8cd98f00b204e9800998ecf8427e + f22180b9a31a19606112508410f0806f + 65a300d4b0ba0aaeceda8dec0f43631c + dad7f0264e184c8e9df30d733b1cace7 + 52ee5b52cecd5abc907a4e492e24039b + 9cb8cb8a83c46a998452ca08be87763d + e40bba44be4e72bbf0f6ff958f82030c + 63df732b99f0bfcc7841588bf59b7a2b + d3b07384d113edec49eaa6238ad5ff00 + d41d8cd98f00b204e9800998ecf8427e + a4cdcf1fa4ccc926ec5f624c53fda83d + 01ebead5e039c0d1301339fef7b7fd18 + 5a1eb1635651d6a849a2fe9c80141ed2 + f1aa8816ea96fd1f18eca0d8e858e3d2 + 77742c9b28ea9fc1da63e90a5465b8a5 + a1c5d4a3d4363448836f7df17bd3dac9 + 83b0266c3878d81316527d9f22930a05 + 3a566717bf4a4cdca4fa6d9f26b9887d + d41d8cd98f00b204e9800998ecf8427e + 387d704689993dcf25cb1791a5af17db + 349115d44a4b2b57ec0e12d5de001c1f + 721aad13918f292d25bc9dc7d61b0e9c + b1a95afebdd5bf7aea9b2e18853e026d + c4739e97d2e782ab9142b7cad4e36383 + d41d8cd98f00b204e9800998ecf8427e + 35641dad0a0e32afc365268d7cb35f5c + 338bee6e134993372c561235d85caf5b + d41d8cd98f00b204e9800998ecf8427e + 3ffb644f0ff01a7b1269402bffe03f42 + 9bbb4b898a5bf5df996cd16e81cf28b8 + 963a0860c3a392bbaa404bd6a9162072 + 746e1101a4da5a4f372ccbbeed4e01d1 + d41d8cd98f00b204e9800998ecf8427e + e5269ae0ff8b573e8e88b98a013a97de + 4fa3c7b10ae5d6c1b42616ab94776591 + 3046798068871c144081a6dad3f88e3d + 99a065bde70a5c4a40ce6c77e4a949b3 + 879a3efbd681cb64f35474db1c6a3bbf + d41d8cd98f00b204e9800998ecf8427e + a6dcdf5a62d961fe330b61698929efa6 + 1cc4eec6ddc9b8a1713743aa159f7281 + 69026dcf9b20ba875d6024fa2d8dcd37 + 8d30c72d1e2d32a4dd21c365249ad591 + + 56e0fd06b8b111e9ef4766de0ad40b2e + b6cadbca1066c7210b48420dd3a0964b + b24b02df9137acaa668f165c5db38012 + 4dd5cb03330ee8dd6f8563d337330413 + 2e5b4f4964e1d89ec1bd5b9e568b1a1e + 62286194c82ba98bd14aea9d1518b0f8 + 956d963298d2cc559a0a528fd7fc645f + 9f4ec50543c6c74fb9512de3003dbadf + + + e68c952348223047f91abd5d0e7ef8f1 + + + 627412902d0420e2b42a3567ce341d22 + f594945637d0f6f1de5016d0d201efb1 + + 052d7d0a9dd420a833edc16105d651c6 + ab40aa8d64e71ef6a43af56208d564b4 + 7b79ea931147edcbbba325b6db55ba46 + f94d5ee81eabcdb23d6e3d0c597a79bf + 379dc547f78cd1fd9b9d32b98948c299 + 1644a8f2e078cf3713890122f4e4d2f2 + f3fc11e228af7573b5f5c2e309e9cf82 + 60ed6633c78ac97b65869b304b84af04 + e0405ba0221563f077889ce0ab34aed0 + 0f9388ff67d28d56ff84e88d8b0c1a75 + 75be292476e691020cd9b30c7d66983e + 921b8379825fdf77d0edd59bbebd96f2 + + + + 0b005489d69c3a9198ea8b2107cf3e11 + e9716420e7c49f8ea6a917637e8fe7f7 + d801327c069c151f0a532ea41e9ab36f + 3b6511081f2f506edaa52423b442b62a + cfbf4cd294511441909fe73c4a7e92e8 + d9f1c8541c6f25e4c3d548a643ee8c5b + a0bf8fd6fca30e8cdc7af90670c9e9e0 + 1fd62d7afa0ddb1b139870fb9c4e4b22 + aac8806bd7ce497f2a00d6ed4b5a6700 + 442843964f0cbbabc738f6a1f8b2bf63 + 69d986f00b0e96dd51b203082abe0139 + 27693fe0ec3459b5f176854587204e37 + b6a79ac37ec28b225aab4cf8aec57e78 + 514eeb7d875ea038dc618cb09d060dda + 2db1425786d39e47545cdf7dd317e1f9 + 6a436cab060ed939977147655311ac82 + f1f79f10074e22958587b7c4259c7560 + 76d09c43f4817afcf2972573267954fa + 6cc0e8c8eab1dedf543878ce0465e4d7 + f808e012f647c8e4f3904f6db840d774 + c265fabab9e3bdecf0bc9c5eb206d6e1 + 63d7c05b26c3e9572ba433f66e5f79c7 + f0c30c82587802ce698eabc61c55b208 + 1cb25f8fbeb32c719633fa724d339f7f + 56819825e4866279846bfbda815b3e4a + 2ff4e1f8ad296d928d9e443236207ee6 + 41841791df8814f8ff84270e11e47f9e + 521c0ce7351b9a6567267d02fdd5a172 + a2b15f20fb5ba8ba0468c2358b5511b0 + c87afbfee855bec6bdfbf6dbc47e8e58 + 9c55c5faa1c1f8bd202004c62715c99c + d10557b475b32418b0476a0adb9b2568 + cf16c268b759587423acb8f59560de70 + e8c48f45d578d5391c4c91f0976b0088 + 98a2f0b04fa2618061fe55843d8b579a + 5a8369668578b4af003eba595f61779a + 4f12b5ef916e25bde1839d60434ea5ae + 3c092f40af9b220dfcf7bc2321017304 + 6c5f9c9f984cb99468eb594c54f511c7 + e0155fc1d387530681bd9c1ced00a95f + 8abfffba73a415522634381fbf1f6cbb + 75ca8ed5399a9093432bdfa6493c9c01 + e204579d377587cc4cd9bb7805df66da + 9afc118c70299ba8544db5a4986991e2 + ce7608a77926d1cd4b63709e8feff40f + e425e4ba24bef7e9d1e1ef175a881725 + 58a9119f9a17d6185ed7f833e4564187 + a61348ff66fb6e7b6bd540d5ec9d2b38 + ecbda08b3c8eac0f7e91a97c20330fdd + b74652d1414fcea1254c917557e70db4 + 87f1e94833827d14cf2fe09ae9c3ae74 + 591b649dad7e8cb0148c13195ccb8d9f + 8c5a13714ee16c3b66f6583e61924375 + 038fcffa03e301f792db568feeaf9371 + 56842da6cf69fd70eab9670219b2fac2 + 558e78993ce4e39e19e32c7d8d7e7273 + 89e9bae8feb853a1b9b3571d78295e28 + ba28cf96f2c2b490635ac94fc879e7ed + 588832e5c14c2b667c9d3ffcad4191c8 + d375596f5a8375be9f887e6b0f2a382f + fc09f13bca42b3dd45134a514723f1c4 + 5e7db9dfb85df85b4e4858f802f0d540 + 272ab48077c409cb0c3537855e4ebca1 + bcf25c67103ac1dd9c4240717a82fed2 + c3a6327f4816c85d2225d21b3cfd270d + 621e5a89194270b93d0e7d32fb8e136e + 99bed0512d89b38434d426cb998d3231 + 3e603926d310c1e28ffc461439b020ee + 8330d867fc2d368f63d94dfd66672adf + fa7c1a17b1c3c48f5367a441f6174b2b + c75b2626d66423b2e47b239f8f966e2b + 3d2b7eca3384e0d69dfbdc60aab5b74a + e7bd6765d53caab1d355f976b0a65ea0 + 935ab4b977e212167f08ab8794532159 + 0d34943e68d15d233c758a0def911630 + c19870dbb4e7af1dc18f807d13771322 + 8eebf94fc14f73bd921fb23823e071c5 + 18c3504a5676f33f744f58d99748efcb + 1e8275b2ad99e22767c5e7046c75e68d + f7362735b1b4d7fbb039ecbac89074ef + 2cdf64a3de943372e71f0f0bddb532c6 + c08e7048ed0b65b857db9f85d0b484d6 + 6bd0056ca46938aa5a4cbeabbc044b46 + 6955b496116de5018674e0360f63d6ca + c27bb1ad6d44ea775353b49ccdc8deb4 + a3c355e18707a9a4db146b8a925f74e3 + ac9341cf60ba635a28a0bd3854778988 + 0d4f6010fae6ae0b76a0d962a05986b8 + 3fb2278f7abfd90d83d7822c5d01564d + 1bac16454005bf838309948c453d0e72 + d8d69db682adf6a4a0bbfe5d8614de73 + 503dcf180f17b26e2ebfad71f6ceb32b + 90f1f4e9a2c24e33fb7e0dfe195c6694 + a7e781a754cb7015c1e71ee4716e4881 + 07c471ed7932e9608f0e70d5a61c16fe + 4c43bd4dfadc894bd52a3672a106af98 + 9a7a1add1f4403dc7594cbfd9c324c56 + + + 609a4aa19479273046de52d88069ff82 + 602859b649d754edd460dc3f9b7504b5 + 0480067521465079f5bfb2efebb60414 + 4357f5643404a146d7a45048a0351a59 + + + cc542deb772e67cd17d0f582e6d73e55 + + + 7fc96022e4f556d6d3b04d1c0e0f798a + cda73955bc2aad65032c200eb8acff8a + + + 5fcc0f865c77f52e9847378da9f0489c + 7dcead75d21f8d0a56980c4a07d7aca4 + b53533773e89efd08b4e8fee6b186579 + ed9aa39f207cff711cb5c8fc86114395 + 87a66c1f3cee24d3432302434b86dba9 + 0b0c94ce85588dd563f8767426eafdcc + 17001cab58f05ce2c4ca8f191db0aeba + 99d749d07f412b89d5af760e96666226 + bd79de35ad0e084b8400e08793205a69 + c4299bac0ad2d516f56f0bdbf70ef580 + e9bea930f7bceee8d7dde50dd85e9ba7 + e1602d2dcf95a9052da9a432db6c1875 + 9f68ce5c519e7ae740485b54d04e1d51 + bd9a2a4284b0fe7825cc1ae3af288ba4 + + + 405f2baa429a426106d4d6d518d2e343 + 9553e289701773fb58f456bfda0106a2 + + + 8f2588b03c8659979023754af594f574 + + + 4daa638a4ddbc48d59d813748132a724 + e327e2cafddee03f406909e0e82ae3be + 025f15b53e53111e5abcb408991dca9c + 0177ea6dd06afe6797d9d71f258a97ad + cb767bc3340216a834a50ce83424f155 + c1b663b76772ca0032d66f5f0d19756a + + 145ab9135d9f565ffbd71741614efa49 + + 3ea72ef444b2954fca6da408987e3bf9 + + 178eefab2d8a45bc351cdd5a904f872a + d70085ae1db3419c30afe9c991930ecd + dfdbc5bdabb8a993c9ce4b9b7d0028c7 + + + 50b89ba12e60be01c00e1785fde1fd8b + 35c8173dd85a84d7aed5cc6a1a0e538f + 329ef2fe4e84ddf93a86ad791b238bfd + + + + + + 2f1f4e105fe3d987790a62d0a36ace39 + + + + d35edd18d342479adacd96152a3bcc70 + 722b90906995b9737c28b8ef5a8f1412 + ada1cf821c722ee307cd5839a8b60603 + 1b773eeb20643f84ef08f82c41f6be61 + 32fa9b65f6622577ff6574de42774e00 + 86da392923b248aba0944a1eb0a95ad3 + 2c4a7c518eb7f706da6eedb22970e689 + e97d8eac338853b2336e863c15b69d62 + 9be3ea374b9bc6d7328478544409bd47 + 57147ea81a17dd9331384edc050e40cb + cc0a445dd6e8a9294afc2ed9b047fa1e + + 3e9d5d12aebf37862751cd828136c4fe + df8e2202f3fd5337f00871be9a60b74d + 662c648625e33c34b7d8e4cf7bf680b8 + f6beebf7872f4ee6a1b754834aa5a279 + 6bdfe0ace676b8c32f345e5f1479d3fd + 5f14a9f8c43cef25e31b911f1d8e80fa + e445bb8bab9c07a87d8aa3a704630039 + e2b863e069399eb5b370c4fccdfc60bf + 386e82e62c2192a6d20b92da84a57f73 + + + + 635b49a444f9910e7c2fee2fb148877c + 956bdba1e31165b598c5ed0ec2268221 + 80c34357be5a77148787930579f0b1f2 + 1182a60afa00309017f02d95e61fdcbd + 2e3719634d360efd9fe1d5b4ef0a6205 + a14d4eb3591f56fcebdb40dbc5846e8a + 9df5be1b94586fa6e7aced94854b8a7d + 79b47bb40c9789d6115378d844b4733b + 319b84b913b817ef5ef068881a275f35 + de41872d05371785c1a28db5cd713787 + 0972f20269a9a3701c61d2538685973d + 9edd2dc37cc286c95c6653909d0daa80 + f0576bd598234df2bb7a2222e15bf4e9 + 4a57aa629adb46e1ee106d3f347e2288 + 759131bea03371144481d4ba5974c31b + 1f09d280b12ad6ff5a3d92e7f18e717e + c890683e3af5e8f02f6739c941503318 + 2dd23c3988ba8e4560be976fb49bcef1 + 0dfd245ba725ab8b5984bdfddce86734 + 70996ee7fa80fc644b6181d498a6731c + 0e3086221da765815ac46988ab3511ee + 67944f081d93cabc84bee2baa149d6f5 + 4cfaeb205fb2546ffd83997f9c715614 + 757b9a247320ce1f145fa8294d2d67ec + e3f4d3829d96a8f29718724cb0e66c60 + 1e765071165d60b7fcb9a059d3e6ec9a + 051c3675a90738ba74072ddf8fcca5df + 4a5f79d9e5cc1ea3450e1f28df9f39f1 + 02278b3f844e378838f63f5b4900b1d8 + daabbecb84985cf238f8074c4e1f58c2 + 4bf9cbde10fa27898749d93db8dcba1c + 45568df35d989e9ccaf9a516166eeb47 + 73c32d2692e101717fe2d9d5472c9740 + 4131521b057a1c784d9bf69ee0f5cb7e + 637350aad3b8c7513fc395c632aa4b29 + b71a4f47b9fe1f5c230f015dbe9db450 + 0226fd09e2530b4f77910283cdc968d4 + 1fa1f23ae16880431c4f090cf15f1533 + c313cfc58c7e503eadaa3aefb10407c7 + 0239b16e2fae80fa055ca71ff9cb168a + 8d523b1f3e43d114c51acd51bbb3c06a + 0457ef1de57e1efef6cbf1b0e89240e0 + c731e10c56691210f90b7b0bbf256359 + 0e8b8ad25a9d6218c9c28e90e9c37cf0 + bae1cd73c100f3781fca958ff9fb5a90 + be061cec5cb1d6d35a8bfaf77f3bced5 + cfc70f5f06efa08b8870d6dc5a7f9a7f + 3588b832db465fabc85910ea53401875 + 477cac3d1ac01cfe05ec0e4ff5176dce + 3b601270ca2d188f80e457a77e0bd2ef + 02e28409501761dc4332879e50d1e29c + 0a0092e671ecfcf4fd874f1a5b6cc378 + 956bdba1e31165b598c5ed0ec2268221 + + + + + 33bf6581cd7bc9b5f22d3ae2596ab6f7 + + + f3de14c6b6616c88d8d9796cdfa74319 + + d5d2a45b27dad4234ee3fd7e3baaf65e + d7d97f6246bf44b8b15fa5fd3e744b3a + a89aedb3b5b1bfd55865ded295c0ecd6 + + + 048f3f78c39e85e2627eec21e975551a + 99e311aba622a8c4ca9d97a6b7341f96 + + + c8bc9108a85f2a05fd9c6fc0939a940a + 1641d579421b30bf35949c79cd9833df + 9893ab1118838fbbeefb3f09040707a5 + d41d8cd98f00b204e9800998ecf8427e + 10df17f4c18608265740d5d5de6a3aeb + 0002f2a6a22ea6e08f995f86bf30796d + 4cceb74bc365488af70562bcbfe1b303 + d3b07384d113edec49eaa6238ad5ff00 + 1630aa087fc22cf1e66674bb3fbb2ea0 + e55f983fbdcc31d229fd8454a284f1b8 + b7dd9fc3958b1d9cd74facba0efd5a35 + bbe218c1bb00f03e84b03d2e6fdda349 + 6a13a2c8b36b0dde0e4ff828578af021 + 902f5d8f5aad8edfa3d3cb2cacca9610 + 4aa236d62f30da09013409bc418242ad + + 6b14c8d6dc41589eee244fb0cd834b72 + 8181f72f3435fa7224e419d81aeb6466 + 27761a81d25113da8d7c30a592030c92 + + f9f7b601aa2a38a98c6470f18ebec3c1 + + 6fc62f294a126a24ffbb03db08ffd2bc + + 583932c265a6b3fc7b64e3ce5781d982 + 0aeea019389321d9f37b03634b480bc3 + fdcf796bda19a6af822251135ba90fc1 + 940ecd0d57f97ef1903e0aaf693802f9 + d41d8cd98f00b204e9800998ecf8427e + 283896809064d4605b6b92018696b973 + f96db49c2c3534105af54db103163791 + c1dadcec624959db83d4ad457adbdf69 + + 7f556ae7dbcbfb23c878f32e974ceeac + f2199d44c28ef0b56970394343c60c50 + 17a12eb6b568e9d0b640428225cdaba6 + a29cf79d1025365334ed5e4675e642c9 + 92cf47b2cd41aa048ca215a73600fff9 + 7c43678b535581441ffc81f8c8ec7548 + 4e2a7b25435d735bedf6d127b3129940 + f6b0da2ef2afaa96186f83d9203a0dfb + ca0c5350348ba7d1da39709657e37113 + bb3539a4c88aeff434c7245847b0718d + 5420f3fefc452c603bd05ba6806c8313 + fff475494f82c7193da468005a7939e3 + 8fa8bf98494d1b75a369b88855e80e66 + 3b5faf2bf8ae7d428e4a2b519d8dac8a + fec8e94aab040b797b7dc6a47de4ee29 + 6e5b545f900aefad2392be45b596fcba + b9e0a993ef4cff1a52699d3d5f17845c + 588da7f82f7823720ed93d813e911840 + ec0c91dc7fd826ea688264935b4c6bdc + 72bc55205fda5a6c7207ddef211c9364 + 1cfb70e31da1becb53ccb02fda90a8d9 + debce34c2ea50d03c0375d15e6fc662e + 73f303fd916be96cafeb74a33f46127b + 9d1b8f45220b023728fd54a0548f40e8 + d5d5b7494896991247c84000d6fd9c14 + 48460a33a236fadb3fcd7ef21df6fc0d + b5bf8d878d790406b03e186888ca47f7 + 81d32b2fca331759e84cdf20ec4764ef + 0b20dac6c8b275500c652f1e9726f68e + 93d19c4a993f833f920846dcf6fffb3c + b1cc6ade03748e96b16fe62df5bc8020 + f229c4bccc48208c601dcb3a40c48fc8 + f6fb9b2aabd56d8ed724f9908706434e + f860057334309da67249317f86faf070 + b8308c97acd2f2bc971c54b53f416f2d + 89a984927585c53fe1032b9f636133ff + 81cfd6f9c23a49e571849bbf93242d45 + 78c44e17266278311d7505cba53da2e1 + b48ce8fc8be6d14c979a0f3fe5f7f408 + 1d2676a247c988addafbc6eb7d0bc6a3 + 68a91d7ed9295828fb383aadf7e85a83 + e0c706139adb2c1f498a79f30541b238 + 4f4cae24c362a3104cd01fc305f5017e + fc17003f75e4062d907ddffda7d7d689 + bc1ccb9de6c9ea67477359860b7d1bb2 + 29eb88614320f0ee01888dac369f7e14 + 05a9621b21f97516337d4484edbc15e7 + 3d9d72f3f955b7a4f88b991a28d73d26 + c6d1603be5e1ed3d431b515b30153efb + 5e19dfd86de089b0e7734b2fc4e2244b + 73a327b691ca25ee14bd67e7e06dd61b + 8b9c147d22c8ac23f84c9d7c9795c903 + d5bdb772501780c07ad4f06f40733dd3 + fc161037949b9a2e3b12362c814e4c74 + f450d7aec01572721e62df4f252776a9 + 79cf553227cb009f8b43340a286e8ca6 + 355013702f403c28567f315b038b86bb + 32722932f30086f6949796c4556bd230 + 5c67fd6b0a9fd8edd094669026e6c48c + + + 76722f9a6adc364c9ac62aa64bc662b5 + 5977671111cb29ded1c819225acaa573 + + + ddb0895d24c9c089229b3b932538aabd + 8dc6f92bf862402f40443f98009f60bf + ab1bc184401864d1a807cb5acbe89a3b + f64027a8431b4b1099afe2d3c2d8eed1 + fbc643d2960104a96a86a281f0d099bb + 2ceee1a7a1a9f7f495c3f5704b0c7c16 + 5c441692dfabd52e4039a8d63cea1b6d + 068d76147f7a260921574acc8228359a + 57777809401577631405bbb5a2631328 + 8b61c355f5f91b667c880a793691f581 + 1a0872bd2b6853230f02b8e048f5ff81 + d2352bb78a3f8ca95089dd74642cad2f + 2dce3891884c4b348e06cb7e1b333d0f + 230242da32fb62d79a60c76f337f4b83 + 664ae757c1a4f9e9d21382a4c862b67c + 3d3e78ec4bbbeac322ae4da5c483fb40 + 11b0d5088c777fe1a219bfa9d6f870d0 + 2295a417b6c3c96ca3c3b5705180870c + b0ff93f482f486f300e87db09d22c9ab + b53ad946f44532b6beb1a315e5270d00 + 866d9496a39ec45a272037ec50230eec + dc59ee7e0a8c8ac0b23138648089e7d3 + 1926ebcfc320c111ef0a3a00bb8c072e + 4f3e569bda024737abc5ef5b0c066126 + c8d9b138be26ee08672ff4c73ce4bf3c + a0a3d2b9083fb83833a4976a03ece374 + 89fbeb08fefa82676faf910d60bc34b3 + 95d3fd758e6da91ad44823fe30454145 + e0cd80cf0b2547cccba37e5ca0637abd + 2ce3e43d62dc225654afccb6614717be + a9f04b427f0d57c231a6027aa7d0852f + ea56406d31c02cd75b7f50978144920e + 1628408a9b129a536ea10dce419a708a + ca3abc41c629aa2c41e3e6a4bf1c69d3 + d4885ee6b1aae1ea18accf5dc1501031 + 8127881588fdb8d99780a40a88839d08 + + + 60798739fc741b7571676607811f795a + + + 202f760f1c4c62607e5524a6ab7f469e + + + 556407b4ebf8fff4e0349e9ced4abb4d + cb19be8f9653dc2efe96050f5fca0826 + 1e6b7cd00189fdcc340f5aab4e987787 + 4851788de72a5010acee4a2e1ef05239 + + + 603c66390eb3259448aa6a32f18e17cb + + 2352f4d06b294dfe5ef6f53c90a420d9 + 42dd4d6504c491829584879d69b887c4 + 289099413fa87e2e13bf8103ac042fc3 + ed039cd6328e85449c232f3f59334642 + d723689eee24cc6a218fe25b0b941e46 + + + ea5194e32099713eace8c504b534608c + 4ce389f291f84623159469a3d68ca433 + + efd930731717542ef25dd684a58839f9 + f94d5ee81eabcdb23d6e3d0c597a79bf + 805963d8964b4d0434c283610df5055f + 181f55e9a1e3b902848bf1b8a18c7526 + 4e8a3a2d29b995337df1f84a190bd158 + 2e1c33b0aca6a0b1d1f6de479ee10026 + 9e09330b12eedc9cfc8711d5264b80ce + 176857fca4caf2e5d82a63b0c6929720 + e9d4b3305949fb5318ec595afb60fecd + 6784e9929c7183f600b2320c497c2b11 + afddfc882635ce7046e17a22b7b30345 + 74c0ddf2bdb3e5b4e84d287d35f1dbae + 86a830699e3a85867c5cd87a92b1e8f7 + 59c04567fe842e693b674ea64fef05c3 + 93c7422993e673b95d8abb69a2c7e240 + + + + 5f263d03b97c590ee8036afcd747028a + c9b511becf10c1efa5390dfabaca0d79 + 4797091f5412d60e5585857d29e10b47 + 872bf97a13d24d1f64d8fca726daf06c + 9fba30285b58e01cf9c7608d20dbbd3c + 1193e9dac373f4bae6205575ae7adfa0 + d98dfc137baaa002ffc69e65a4fe1b56 + + 9246ca305ad64c584f8fe8c147720511 + + 1fde420c311e941258a08d001998bbd7 + 0fe6e7783a3a3eb7ec978b8728441e18 + 436236cc6a73a0e9d4eb4a7896997bdf + da4205b1e8f5975600e45070f40caa93 + 9b8a133d89ad5c994e14c16583faae6f + 80aa98f13984886560f566e2c28e6c88 + b1e51bb66e8b5814869f8359b17631fc + f8b8837917c49f7298f65c38f7469d85 + 4b7ea90b5a1719a92c50eb5307c17ef8 + 9a85f382d7ef3dcf97c40312454d04ce + 086c74b1787f217c89e6b05d153f415f + 74408cd9e8ed1707e118cb1b0e0a94d6 + 2dd70c8356c61f94724d0f97d4515805 + e63fe90d2c147bdfe5b49d232e5802c2 + b911eeef629e8ee17b2dc4c45a96eb73 + 225e4db4430967a61b7d056aa09533e9 + aa26ef2e09d220090299d963290955b1 + 8fdf4f1801e7b9769f7c42711ad6ac60 + e0b78ec5221639975f78e4558fe610a6 + 3bfcb7fcdfd10dac433869a32eb1064e + 1c38591c474e4b32518d2e5ae322197a + b7e14932834a8bd615da9990d5689b21 + 7b81934f66cb2c20ca331027a5caab42 + 76644d4274cc4b30ea20cc746ade21e0 + 2ba41faeba1086c6f30b935867bf0946 + 929d16807be5db5c57b27da4970f3509 + + + f1d68cb72334fda80249dfedf34daf12 + b4d058fa9b02fe1aeebfe49f7f8f9c9f + 5b50b6681919a3d959e6d5f2b664da9d + a29d18f3b1cb6a061da09575d262522d + + + f998bff2b6fad1a9e50f55282a0b422f + + + + eb474f62be4ade4b85e4fc761e54942e + + + + 7443f9343524df917bc521262d5eaea6 + + + + 0937129f7275db60b0fe7947425258f5 + d104e6f18b9aa0dc37880dbd2523a5b3 + ee39a9ef64f7e44648eec7bb82f56989 + 77902e0480b470e90ea6aa49e425af7e + e56011883c89f4acab7e3ca04dd8abfe + 43fac69aa468c8b2ab26126c3d3ea176 + cb5146d408c70a51536de4a396fd4107 + a50466fb37f30aef3014cdefd537a8eb + b6b756bd8a77b3caef4d5a41b26a93b7 + + + 6d9d398b17bc1c88247e329c9fe851bf + 74adb2263da155c8b7d953139aa33a57 + + + d6b4f8c602f2aebd8b122a3b9c392bbb + 03c77de428d745190c5b95397ea915f7 + dcecc5021037bd1ea3dd77d89ab701fa + + + 6c5a7ac98bbad79c2c3809e4e2fee59a + e415003ccdf7e516965fc220a61d3f29 + b1e62d7ddc5b7a07d62e9ba089b2fbe0 + f187449244e32b41d7dfdc10fcb5585a + b93b075a435f8126e172d7062c9f2fe7 + d7b454680ee014df009b932277250ef5 + 7637124095eb10935f5b4e96647bae8e + d96034ef8ef5fe05566b1ce06e40a730 + + + 30d53ce1a291f4c84be2951708eb8cf9 + + + 4e9141bb1132a4478c375360068289e2 + + + + 2a0002d114b496d40d8246f0e66c7f82 + + 8f2d377a6382eed9cf08446076ffa733 + + 3b39e2df52209e88208283ffe9d727bf + + 7bbac601a789a864576ae8808bd75979 + + + f94d5ee81eabcdb23d6e3d0c597a79bf + + + + 6ea0d2d3d3cd88be9702e94639f2bfb2 + ac4ea4960ae64e2d8f8b46e2df9ec344 + 2809b11c5cec9534a828423c7598a326 + c4cf318d93e5114ca09a2f65c58baeb6 + + 9246ca305ad64c584f8fe8c147720511 + + db026cec88ee101987ccefa2bc9ed24f + + + 196d7acf84c26c79bcea7c5dd92da485 + ede5d090c8a8163e190327a8f0ab05b1 + c23b10f5255117b221972d1896804690 + + + 050974acdcb65b422c71be45bde4525f + b09c2a2ce828f92a34292dbcf0c07df7 + + + dad015e0189736b240f982f3442dd4d2 + fccaf419a98972f6659a9e061bbcd63d + 4938d6ed716aef602d7c837ee4f0a4d9 + a767642d5cc2d95b7291d9a176320c91 + 5f4045ef840486670ce393a931135ba0 + 5fdc968879ed845f119d734a733dde21 + + + 98a50a8f1afc11a816122435ff4701d9 + 4f6cdf36ad82c70a0cfea490be3e33f5 + fcf7e12435c6eb0538c888dcfd31c0cc + + + 3bf3260b6c4a67e8b3e1bb7a234a96c3 + a4f998430935a6ef3340fff8ab42252e + + + + 08c643fcc3732288e24e3727077488cb + + + 06b3f8c48046c417bb3cc439b2f8422f + 5fdd158319fc8391ce9a0e9c2a5e8e19 + + + 500ef9ab0d8f2732205ed40505dc0ae4 + 2f3291db2104784a0491bd34e881fef5 + + 6cf0b3f158c0cc6c51e1124c962f82be + + c6675065c7c5f0fb3867702491f344ad + a8c010c7e9940d57bf707ecc058c969c + + + 4aa026159e65c44621c6da4d9484a1ac + b9bbec98b4f0af35b47a6e620f857642 + + + 75edd9a54f048e11f24b74703f5a152c + + 3be80ae9e6c12b29c95d21769eddbd42 + ff13db76627d9f9e9f2da79d2c98b794 + 52363642a21bd816c3d0da5ff802dbb4 + 954f49edcc2a77d86b7de30c9568a0b7 + 22a10b915679ffd0e7908f01e2557ff8 + bb5fe091f7cf5ad7e3a6a54f1c3f4f15 + 8b3301966ef40626a05b1682e1e1832a + + + 2d8904f3cb71c26495fd4865996e85ac + 9f284f5b89ce99505c25bedfbbaf9ea8 + 361140d6ae57362c5f74da03ca5ab122 + + 0ed483072bb3d743c0e564e87ab2e50d + 2c0a75958ca769f86ee9c62cb597d897 + 407ea59491615ad1d85c54c5d49a1cbc + b9237c1d80286efdd25e9376233f7bc8 + bc3b4a3700e5a861ab183a2f3ae6228b + 909457911ce04f417af9451e03e3757d + c701955f6a7bee258a666287eccb458e + + + + 42cab3ce87df67f3863b73e59377441e + + f94d5ee81eabcdb23d6e3d0c597a79bf + + dc67a59a9101373a0a0aab4d1a37406b + 55d4a87d030efc9426685250882fdf25 + 14010c4f6f5c12606dd5e00ef5855fdc + e0ec4bdbbcb0e8a59023c7e986b44a21 + + + 5414c2b984e09e0cb0a47c408fcdce0a + + + c4b63b767380c6a42e56b65a4dea7a9e + + fc399ad5f1435dfe0cb204910e44be27 + + + f6613ca25c2af3874ad4117fe664eb59 + 052e4bad52c632cabb3540e5086a5f73 + e6e4b3a581724e2590370225e1fc9198 + 530c936ebe8524f5f847fc54950bc2f8 + fc78bbdf8c387195446636e08f72edf3 + 49241f84579739aec5777fd54a9cbe22 + 5b294cccf5da7fa8c44bff361be666f1 + 174b18d078296f3f0d7eb9f961e22ef0 + 7ad14c7104568052b53818111375a2f3 + 3a51ade8ba35bb95e656aacb1db1521e + 1d1f2afc960a768a943e879ca93d8276 + e67e1ba92c5c3b590e1440e9faf7c874 + 8efb82a3ac6d14bab70f1a42d1724f19 + 41c47d33cab7c84954aa3df39fa59a03 + eab0ff118f5c428011356e5d3c35800d + 0c252f843c46634dc2349bd0f0d62c61 + bf2c2c6d4cf356ddde0e0a92ed714218 + fda820cb52422994914fb20ef8b40983 + 839179b4a1f4de9bcfce7815b8cc7a4f + 47e975302d4f91c208bc58c4266f9caf + 1a972f1753f3d77a10cea06fb2e733b0 + 12907e07def89fe791687f00d130f97a + b2862c72ae733162fd9d691696050cc1 + 40a50cf14b5503f6c5cea256253b5231 + 39f698b8badcf24ef84f05d9cd5f1cfc + a4e9c96c1c7fc956d10e394312867ccf + 809db138c609075657d8d2e81fabaa5c + 52dbe7660c58107077d0e7069fe43498 + 1988c14b94f384746ef607b7e7fee0ed + a8363b3d0e4e39d9e77e244e216c7840 + 809db138c609075657d8d2e81fabaa5c + f23cc9a4a8eb94571ac2d98e31c32743 + + 64daece3ed1bee14151c3d42ab0d25a4 + a8c5de9abe9b73b694ed99b6bcb4cbef + 9b2e9c0210e67512ceb1cb70b8bc1d5d + 8cdbe5c6843e803c122bfd8e3e2cdda8 + + 33bd82dda56ba9c2e91233961fec2523 + 1ba01e4e7930693fe3263ebc1cc5b014 + 149efaa994224c96542daaa1b45509bf + a070327f924916b416a4f84d5085cecc + b74d79fd55c55a3de135767617192de0 + 5c4234783e5bf02ea2ebc07f932a72d0 + + + + + f94d5ee81eabcdb23d6e3d0c597a79bf + 49e951ef3bb1edd0b4faf77cd55e8eed + 72dff881c05036ed97976b4bac83536d + + + + + 0d509ae9c4638ed750f54f1888e2301a + + 34c21a79ab0bc8332ea5c142e4b8d636 + + + 96fe7b1e5cd48c7332cf17b789f7af66 + + 24cc17d8ae965601b7ffdc0473d8312b + de471949923e79ef976e314c74adcad2 + 9f9baa5319cbed2bafd8500aa5c2c9dc + + + 9f867da7a73fad2715291348e80d0763 + a8c6a30ab1a4493084f9789d3c8403b0 + fc037b603dc40195bbd1bbd8564340cc + 90ae8780196d47f77e6c4e3042e7ef83 + 896afdebfc3f279860ff9bf3c7831e3d + 80810c8ed3ec5756f029cf584b11c81f + f2b633fd2839641cd4c095935a1d8a33 + + + 9f867da7a73fad2715291348e80d0763 + 1000a53f98be8258946d51516864989e + fc037b603dc40195bbd1bbd8564340cc + aaeeab2d5344153a897728f12a5bde71 + 5f28daf5850a1ad61051cc432eb053b1 + 979ae350ce77ba897f567cebacff6eae + 0dba7d44ec611c7bdca62e51921c34d9 + + + a2e9f46a8e42686872c9d6761a549199 + 877880ae713f5679a53e5b47c9b4f32e + 34f12a4b2efc6ba0739da4702a42616e + 2f218d1adbdc1bd2e4ebc0b382bb3b8a + d32239bcb673463ab874e80d47fae504 + 8a728fb63dbde78b3af79baa3fb97510 + + + f47e1bd2753896200a97fea6f6175ce9 + 409cf2c0195d2b5802d6948999f023c5 + cc8c19ca8b612519b040f6f6d6ed2a2b + c04898b16f88e2c2fa98fbbbe7fbef95 + 916b61cbb2bd621b617c36b51f681935 + 97e543830b6483a04637601bd4b62e11 + d32239bcb673463ab874e80d47fae504 + df20737ca34758b0c9542631d7884979 + + dfbd810d93a50a07dfcf37bb233cd10b + 338bf17de7248821ee33c2eff77e9d5c + 3daad3713df02c15beebd09ceecacacd + 4856e25c5027ef93e512646becf3eda5 + 2652ce7b4dcf00a1b07d8b1debedf867 + b9180475fb312ff211c397b19242cdc2 + 16aa93d6a17c67cebf9ede2168018e29 + a874a391c41c223a007297af0fc82d71 + c940b153fb6c5b3498efa181881b5b6c + 562d027d0090fcf872158162e9a3ca4b + be9c85808d55cbef8619a67495a43fbc + bcc98729a04598aecb86c451b91433ea + 18638db567f8b6fd7b1c6641ebf2c958 + f3d1e27ac78ef1f985cd42365b3604d0 + 28b46c5f466ce631317e1fe067daa7ab + 2894170c52a47ac02bf094bf047f1984 + 3538a74f377d39d74fbb8cdcdb8c6fa8 + 50d61b15904ee2a7d56673fc42dcc1ae + 0a9d5e42c711a284436fa6f267e8ab85 + 9ffcb7d53dfb7a80e61419cffbbbc952 + b76ace3e5487a0c49c6bbda84dc90a56 + bf1c8fcdd3706774086cd133a6e04d45 + 1c632653ab6592fb8cfef0471afb6807 + 3d251a8fb2df58153f1b6820c81858df + c458a95a74915bb3e01102060bf3d27c + 463334491415afc3e56661e87196b4f8 + f52ed143368f4a4776d8c79c67e946de + 1fc1e2e5af73ffc8bfe1222c61bfda37 + 3a95f101300286c33f2ae8cc4e105029 + 22ebf9af13beac714c8114f15b40ef97 + eb85dc872664c0769e9fab1b7540b4d5 + 36cc4107f0d39d89b8031042c4159468 + 34b9ef2cadf050ad58f391a7990c6975 + 5ad7b719402d1042038241da3c2d950a + 3f20f10cb46cd58bb26d5a80b4f29d74 + 8250c16214460a972f33820c056d6ed1 + 7ad3c70ef87d3657f918d3ee3649f31f + de96058dc4fedbe4ccca03f9966ff743 + 624c779b5be21bc75a6143c5c6bed476 + 5af577705b43ce01285f2721a4850ac4 + 3cbfa12b1f62d72314cf2daae4ceaa3e + 4076a566cc91006c7db31ce3516bb133 + c22fdc8941f2956e0930b20105870468 + 9b2ce8f93949146d63dfef4d4784ad4c + a5f3fbbef1831fe0bcd060edb6e5010b + a1775d6ba3d8b76629dcdc2c1006048b + a2a228f499608ddddeb2ba54834a5b7f + 9b187fb3a908fb75b7b2a8573a4d13c4 + 034ce5e2a8acc79b58b6aaae31cf5bf1 + abfa503eb43ae328fe9b2c980ebe0a2a + c0f60dd955a2bd3e6bace66eb362c9a5 + bae95a030b030f44bcad2e87dcc14815 + 2cd707fef915349263363bedb83ceba6 + 1f2386bedbebd633223278c1fd25109a + 2cd707fef915349263363bedb83ceba6 + 4775a411c20fe8fb13e9fb3a46629dc3 + f910decf31ee5f189c5397ee0937794a + b8b582e30d3f3bd8867221dcc3dbf365 + 4fd59032d7c3a59fd45028bafa245721 + 0daa9bbabdda3c85e5060086916447d5 + 5aeb1084e3a6ae5ef7ecc2bfc7a15592 + 81924961aadc0697a09a0c6594d55811 + a83da87e770342aba842708f6ddc5379 + 287cb7bb6e6966708534cb9ed48d48ac + 71e67935c1f0c9475c2b9489bf812ef8 + e0d060c7f70126e74c443b72ae560791 + f9389202889738a0935be0d96f3aa609 + ad485022027867116de0bf6c25b1854a + 807af038ca9bf1036916265df16bacb4 + 718087c09de2e30da4b348a474687652 + 4e7e7def683b75b19157aca2512da95c + afdcd64e0d7d78942401354d7f5f180d + 2c5e8a67d1a805aae9842bbad59a873f + 95bf00532c504c237041c4e3f04936a1 + 6cf11a9402bc087474b90cb56c91b74d + 13907e3bfcd13606bdda730ce79e8399 + 181cfa98e2e195d89255fae25bbff32d + 71e67935c1f0c9475c2b9489bf812ef8 + a75033315ee90464410b47cc27ce9ff0 + 0dae2b4888dbfa64798623f701eefed5 + 950310a6c12362b084a68b0cfa7f3373 + 18ca47dea418152b135e93b582f84d3b + 716611c7a37f177cf3cb53c5866c7e43 + b8f1f393d7a247fdfe7668acf776e9d2 + 32347eeb8a29a880094fc12ca3f737b2 + 99d8349acae8fcd95094364adf24dae2 + eab0ec8a49a5c70306868aa902bf9fa6 + 72b2fd6a41260897ef758436603d33a2 + fc1cb0e9030ce6b891319ce46dd8c434 + 0f6007361d5e4c8f34a2e83d402567b1 + 19753dca7aaacbd7aa38c86ae5565fb9 + 8b75ae7921f26b4f4b11d18ed921248e + f8e88e908e5bfecb162849d885e6b960 + 191b3c2e856e750c06c0ba7987f902fb + 8973197006c4361981420bc87ef5d9bf + db1790e0fe82682912346b130a1c18ed + 351ce642d2008500c8780cce574acdb2 + c49883919b7912057b1ffad674a9c7c2 + 545a8d71aed6db0d0f484381919153e5 + 016527b52b6af2d6784fffeb23a2349b + 96c6b586a6afb6d72dc8b93b30f844d5 + 35b71c6a8e678cdaa9d484ebab42c2ca + 7db990cc030127f1b64a4d3492f8f3e2 + cdf0f9187269fe46938e4009eeddf8e3 + e0b76dd30e46b3642f866bfed35e07e1 + baadbf936466cfc106ae73e5f15dba89 + 51f6fe162641de3714866950d5eff4e8 + 8ba4178280ca7bb1ac22a197deef154e + 8fd8e9a11cca513a4da0f25ff1a24149 + 3ae824c26cb84c39a279c29472b4a5de + 8f55434707b160cf1a8331d27e37e7e4 + 04f68b3d4cd7d6bc69dbcc10d2888002 + ccd6c02b787b16078ecd92c0942163c8 + 1915ac55e94138dcd9f924e4fe507ea0 + 78fdf805f1cea6cd01912192821ec734 + 8702f5d6fbad08bf74378506ef376f83 + eee692f442eaec2b8291419a2017e50b + 15331f3dc06c251d4e70172b102b6c27 + 3f20f10cb46cd58bb26d5a80b4f29d74 + 2a315fa2593161154c319788f0ef2127 + c40ce9128e9f654222f0c17958ba14f9 + 084dca967854129a0aaec1713a46733e + 75c68bb955477a99fc98600f5e1f40a3 + 0eac1ff3b999791227dadfb340ddd83f + 8973197006c4361981420bc87ef5d9bf + 6cf11a9402bc087474b90cb56c91b74d + 368af9ad30db4935e51b2109b9d4e9ca + 20e28c8b386ddbb38ead777f717d7c44 + bc1d75d2d4988d2ad9cac651bc44b8b3 + 52b7639c5c4e35f33bb3c69cbfa0588d + 80bd51941ebdfdd61f69aa3067ae600e + 17dfe118f580bc2a08e21e8104ef68eb + c61fb661657d61d6acc0fa631bb23755 + f110fbb18db8a227880b27e099358117 + 649d51e9fcd4989c23940a24fc271742 + d9b4f759ac774221a94e535647f2a5d4 + f110fbb18db8a227880b27e099358117 + bccc18d3b8c2b941ef7ef6602aab6c69 + e0a7f23376f50de631db93814aff2e35 + 7596c070ac1bc839022e0a7aba2156ef + 844d1631ba8f58ce496d4ff6897d121f + 78e033eb5863a8b60f987f5fb2b604ac + 02aac38356af65808e08e21f1ddd225d + fa8aa7a5c2077676637614809bc0ea0c + 3fd9b7f1009f8aaf22dd9a5b25509ff7 + f9f9da534cce6a9124cc6b919329944b + 4856e25c5027ef93e512646becf3eda5 + 0b833b6efe53fc391c5f90b3b916c8f6 + adf3957c2eca46fa765d43004c0cc48e + b1cabe1c591ed9bd76afff6b00f32dc4 + bdf5ae55ea4d553beb785266dd0f9ffa + 4711cc4662b9136a881497c27b596135 + bc1ca4370455ca07e2c22b8c5c5d3cce + 08c775814634616b5ea683f297d60a51 + 6ac17b4d7485fe73dd2d754ce2a0e2d9 + 3cbfa12b1f62d72314cf2daae4ceaa3e + 1213e9dbdad624c9eeb8c0c4499df2e7 + 2937220203e5a52762f5c9a4527e1988 + 941a72b661dbada4602f430afcc6e6b1 + + + 880606746cd9ac55f54a5eaf19907e8e + + 2be8e018b68158ca4559e7fb69652f03 + 129d38ba35c953cdf63335cc5a1be6d6 + e95caa2b84b25a15a6443b932a3a2df8 + + 122c56ffbf3a57ced57a49465ca2dce9 + 50d66a4374124a243d71c4400625b9bd + 7fb30d688bf82d32a0e748daf3dba95d + 29506ab743712357990b3d39e3408fb9 + 8f83bbc144d70505672f82679546c72d + 7c3e0b061b07efe04d55f275a4f11155 + + + 01d1bb3c8c8bdb35f3837e2715dbe681 + 9467022f9c3f6c7aef00b3896e0ba092 + 183e8e4abc660eaba3c3da4bb82b0bcf + + 1c64af75bc98e15dc7b373c8806c16a6 + 94ae7a7d3f5454e07027ec04a4475488 + 1fc37a5ad8019d602788b2a9504da31f + 0789788af49a5d4fcc8a480f2e0d7e98 + bcb93bbeb8cf2831e49ff5541d277a1f + 0a9c3814d7001acd22218b0f94335753 + dd6470bbcd3436ca317f82d34abaf688 + cb8084c9e10e62dbe463b939e269449e + + + + + + + + 0f11ff9a61441c13c2f09e3cecb6a9ef + 78715f10610e40ced2f8b6cb88f9d32e + + + 8f74b723decb6f2fd41ab0b1df8a9a64 + 6637c5f93d3ded41035f2dcf33a63c5e + + 508d1107d405290ae7523a4f766b5802 + + b2ae2ded1e5efcae08f802098333a9f9 + + + + + + + + + + + + + + c6fd0470d789192e765a0095139fcebc + + + 2b1bdfd1a2b8c54966b04f7d143c6632 + ef8677184e87d4232938795634a8f73e + 20ad1d1005402766ddd16b7110aaf4ca + 9a46af08f1452fb3a8a13bc5c7104dd9 + + + + + + 27728fef0414b2c8ce6edba11274ad81 + adf465a2c9d22aa4718b879fd0c0f9fe + + 1ed9b177b55a0d479cbe34b63dea580b + + 0c5e927235bf5d8a0f208f4de1c9c38a + eb99e644d8d69985551f57392d40de2c + caf5f775a5d61062126041b079c747ab + + + ba7437ba97d953923ef1e185d643f136 + f5bda38342085f42bf0c409a480a4916 + 20a45cf8947048e4df447cac84670ad7 + d7ad54d0cdd88eed621935468748f76a + 555caff70bee91ccdbf25284843bb50f + 8be7d45230ef827595644df29173f352 + 35df3645402559babb0101c51cbc1977 + 88cc9e31a42c9b0483a98557e6acee94 + f1fc3dd099f3f9abda52047475a17e06 + 688edb5b040795ffc1c649949b9020e4 + + + c1d586918f181931620ae18a9aca6405 + 1b9bbcdccd7b605ea1b99a64fc941366 + e6e9fe4cb145b15c0111ec7700814bc3 + + + 592b4962a8cb86a39ddfe863b9b0aee3 + 73e2b6c6f1ee78bbdcd33f8bf91c64a8 + cd46095566edba7cc788d1dab5cd4be7 + + + f054bbbb376b6222645132a4104bde38 + c1d01790d034d65d53df3095be33a3d3 + d74371345bd83298f7a3bda6a33d12fc + 230566f6ad64ef3008fa6c87f9db4bf3 + + + 02ec7a8e9711e15867449575ede9f62c + + 1799976844e1d589e8b42144040015fa + + b058fc597486fcc70186a058cbe8008c + e4bd5c0f836e5287ec2dff90d0134c97 + 631726763384ac53411e7a8ab0379be6 + 37a6c0d27da41f67c71d37c9522fc3ab + aad02a9dcb4a9b961a14cfd9a395840c + 8026dc07f391b027960a24f0028bf4e0 + 2ab4af71cc11116201a8c2f85a109f5b + 3911fba4609bf376ed8cf8ab7cbb783e + 5fe25024048cf2f6f40ef1201c482033 + e288666b50d25c9ca715e28e7efe2246 + 740b30dafbbd84abb3c4bf84237bbff1 + 08054e7515875543c026e70a260503d2 + bf16aa555475333ead541693f891f31f + 297075c07489ad267ac9e036252de819 + f61f1ed73ffa40b38f9cca63a20cb587 + d916b824e012ed7d252a5492d9fea98c + c96dc2e1b4a97f56d40c7017242dd3a8 + a42e3600f6ee4b9015146f146407de1a + 0098bfbf0fcfcb1dcf7c377e106a3535 + cb87841e24a810cf136c6b406a115974 + 49bb447d9e19c4ffe3febf89bd425896 + 02f14987dc37f3695153f6b6d05280b8 + dee985d04916ec39044cc3208cc3ff27 + ae3ba349dcf1cb2f7a4b5b206703b480 + 6ab46e39a69bf3dfd478f682b8e72119 + + + d0c94f835d7aa723b332cde44dd4c911 + + + 38fc779e9c5980ba7f94a2849dd5324f + cd17f8493b63f5b89dfe547596ce71f4 + 0841b13bf17f7b63e8bb3035ab853d49 + f7ba0d4e9fea1f9f0901d57a35adf22a + 7be826a6a6075075f25093008418431e + a9150247da6362e0a59803119ef8a957 + ddf5b605c4e2a73aeb733db9a94b2ec8 + + + 29417f636626e6afe122482bd58f77c6 + d1e1bd8bb4e790fd89d212607c6214f0 + 82b2f2f30567e3189d54c03c9b4f1ca4 + + acca240be16008563b01161a6a922592 + 8bc235ac05cb6555da8b1578cfce1202 + 40e182f31e72a824417ec353538b0f5b + ac7f8286538e20cefafc9eeb376c653f + 8b14d518a26c60fd5b63cebfdc72dcb0 + 2f251e2ec130563384764b4728f924c1 + 42f8324645ca23fcffab442ef2205c4e + b23bacc7daa066580bafbb184ed3c30f + c6895989d8ebaa867d86738f02cac94c + c56d590a0b11cb204c27965802f542a3 + 2afc9b891fea3ecef2133b1184a7e060 + 54c0d3c943d3e6f224234669bbaa076d + 32794ff97e17f73dc017f16994e70b8d + 14fef2e2519c6465afbe540252fd983c + 8610ae5fcc509a77c0d8a1f34076863b + 1c85c9566478e9454b836df8afdb49ca + 46961e0750fca62408ed5a3c37d98d87 + + d8f7034152c131f5343f7df3e7c90b02 + 567440282e90ad48390bbc38760e73e4 + e58ad9e711d95c58724e3f460f2ec785 + 7b73350a4337407e4d6483ffcaab6f72 + 88d8a4b5ba6e88c695f38c95addca309 + e3a85fbc1a53256d72e73a47cc8cc285 + f0f8df41745713e81dfaa75cc9265a3a + 871cddc4995f464d1595902ebe13a09b + 16b1d072dc99c58079cf148f66391546 + 72cda7dba065a6b014ad6ef7dc81c404 + ee6843b1c44064f861b52bc2c8a4e9ea + f877f342873179aba2901b88367e9d63 + f8ba844823cd01212ff4c2eeb4bd5173 + 72cab50fd3878b3384249f1bf950b3de + 3a4cea9d80361e47c146b3956b713e06 + 314467c75e7bb20a8c03b0afb311e21e + c951b7a8810c22d79630239725087bba + ca578f22204072bb6784755eda23058c + 22705486f37e7e25ed2a0fcd9dd76205 + 0a4391961609db681888f3f62c8cb9e8 + 2ceac17b4de1dd2f2a4c528550fb9b83 + f9c9f7b960f2ff2025785f1ac3e26d6b + 1781466f91c8ff87c35027deaf4067c8 + 3c43a99961404047611ec1bfbdb2bc20 + + + 25cb96407499dd198e2a29890823a4ff + 18395988a9e87b16ba82d4a371085067 + 14d6553aaf462a57822a6cfd945bea52 + 044d68e2b7f74a08fba1b5440d7c7fa9 + + + + 1ce8071a411924db93550334b8e1d085 + + 138ad25c5ab391aab4b316096cd57deb + + de55c6d77ab92900639af3db0720e735 + 0b965d47fd5d38bc78d8d2543c9a1d6e + 25dbf92c3b4a724b4baa515ff35cffdf + d9b5f30f385d94b04e3084322d308765 + + + 680a4932ed3f03b6e1de4b036bc63d12 + 885e5d61024db413d0e3f2f12db6ba73 + + + + 8f6906681f3dad4af51b3820fbf8edc6 + 774c190dd87be83c9ebac19544fa3c38 + 4247d0dc4002dc3285d5d7a7831b567e + 473ddcf4c14aa80c8fbc36842a265bc3 + f01595f594858048d26829875b74a514 + 8361f5eeaee1f42ab335dacf0999ead2 + 4230f8c32c9a1d9fc9741523e95d55f4 + e5164378ab0e6f7e06aac81ef51ab6c2 + + + 70a2e2f9d4a0ab7e081d0168534374f7 + 49a86ec5804b1efc15b36ae6921406f3 + 2d036635d5b69759deb499e65cd9cb53 + 73396c65865edd730253eb6628371caf + 253cb1313bdcbc5679a3a7fc412fdfea + + + f663d48c14cc064537cc1f4ea4cba112 + 5bc7d481acf4dd38985c162ab4cae027 + f2ccc63d6071dd3731f846fc0b654bcb + cf774d3b6c9eadd7711fa2df720f7a34 + a024ef320e3269eadfdd1e2b5dc05fa4 + 28a7098fc100768007970b2041682280 + 7004cf5adb5746b3d47fe329fb679e61 + d8cf415bbca37de06b67154c5430cea8 + fd71c20b76449c6efa228a4a67b44290 + be1b06306361964abb2660eccf3f3156 + 0270a02fbe4ea7e03b89f58974012d15 + 2cc395683206cb660f3db54d6b87fecb + 1c313a3c27b20a3630982a84c5b19988 + 34f1d8640aa365cc0896449d04ab2ca8 + b773efd8e7494d6ff2b138c7d8ac472a + a239d8a52f738bfc5c18e3011cb7b2fc + 68da51661238d0198f0ce9977898e4d6 + 6f9be7f865b86fd55a14b188d2b61f5d + 16ab3b0ea57429059dcc3cc76d28edff + + + 841670da4d34353fde12664debad9aa9 + 77b59f8d0098cde86db5c2b5fdf6634e + + e89f45756e52660402470855d4288e55 + 4d1ee1bc4f07665ad94fd7fca9082352 + 134adf58815fb44f921645e13318c9c6 + c33584305776aa03342690aa0381aa6f + 2280a4f28af7447163155cbb59547c01 + 596a3e70da0d05a703269b1038491a8e + 34d62ee5481c94ec179f183c7e33164e + 6c53c78587248aed3b245aee02686259 + 993c47854290a867168ee45e090ea539 + e7f1f51d835a26fdab7536254a2cdab5 + b7b72185b7e1d7725a04f59c7dd7aedc + 511694c1bc7af224c35c0433293aec3b + 9fc74752e3ccc9765210d1fba2ddc0d9 + acd4e709ef52b069abb88593d163e65f + 17fab939689d57c0359a9fc910eb9f15 + 65a3dd4008d980d70b15107352687a58 + fc239b277f8b479666009cfecf82a42b + f13f494d889b1d42b6aa3360f4cee0f2 + 3da376a63add0412aacb80e4287369fc + 0cd57326fc3e51779ffae9bc156792c0 + 0ecd2cd7e2d45a4e9a98c4e02c098de9 + 3e69f85ce1f6333e1eabaccc20d32faf + e041f9feb249c738f0fe66d8bddb829d + 965a0baf7212fef6ea2e800237c4cf13 + c718685eebc9e55023f7efefac0658ab + 4af85028cb2fa68a645350153f9b34ef + 140c0ae0d35491457f251fab039ed014 + 02f93c5a401fcdfe12aadbfb705405cf + f9dd5060017c46c5a87995d740ef2c27 + bdbb2b34e421a070b404ed446dae5da4 + c9302daee438f554ad386d08b70d03a9 + 0eee13147783b69c7abd5b2c1958eac5 + dfe0fb95128967ba0d2822e742310a99 + f879825a8eb81494fe560951b7315b1d + 7897962ea6cece13730b91dc26c5d8ed + b0c94a75545adf1564c6aec5724c8a25 + 95d433f3c7de31318ff0e1fd6585c1f0 + 43e5bba4755d56197abd26c6e937417b + 56158c52565b15eaab10dc772e4e2dbd + e1e629fbb3094426dd875e1c58baf659 + def08b94d6df738637708a70c5602e84 + 55123f74d0421add26460fdb57cb89fe + 85db6f2fc0eac55f14a1e4c8fa9a241e + eb9478b25ed1364b5d95d27a0ad45481 + 7448c500ff00e371ee4bb980d2536030 + f641a8e9b4eb0405ce2d416759bb6c6a + afb3054b7bfe34c261a20df93807f8c3 + 111ca315f23d3ae1355c155d1392bcaa + 64bfc41b1fe5c31654465feda90cc872 + + + + + 88ecd8f4caaea426867302cc79e5d664 + d4ea3fc112e7ac1f0271c140b0414c9a + 9c0cb07c081e8d406fc4498b6c74c042 + 7e3cab0242418ec374266731c66200bd + + e5728a1e9926ae153bdcfb95a0712c97 + + 0ed58d3c9f70b82e95fc35acc1fa8a52 + fa98d9d6ed44f56b84a228b2dada9e8f + 13f38b201b8bfe6b57d969ce8fbacf1a + + + b840d14ab6afb9c191b9369b5e8d9980 + d40cad04ec0c869100f68e72aab140e6 + 75df53505422debc4765a060db6cec20 + f5199b0b4e8e73d1760c8e228c72fb6b + d8c82a29001d5e0577086c048f382b57 + a1554d9ac096cd64648e2c66ebd8fdb6 + 8f82cf100a66579fc3b488a975b6812b + e3f8771385cec8c4ede3a66551cfd452 + 8203e3ef64a61d9c9e52a961c0c417b6 + ff072ceeeadb39e7af3b155e9cbcfb9e + 0f0ff64e333784e74159f7482c0ac060 + f821f3d4e2916c16233a63110ed184fe + 0d3f0dea4f9f1f39923d739b050ec96b + + + 3392b3d83bb5399a4344f5a7b1d3307d + 059bc805ab6c8daf99f4ba238678a4aa + d525c4c99898b8a5e7a15939bde66438 + b19786586c3608754da4ab4c63a59052 + d91fefed718dddb64a4c54227da6a950 + 345293588ecb537893db1514d6cb54ac + + + 7bb77bec530cb791c5b81a85c1b2c2a5 + + + fa9f33a3009118c94c907d4dbff507e8 + 43cf2ff8a101776586aa901b6c82ec3b + 1168e30d8ec8572eac8c5986e4896406 + 699818dae2a4000ad41e6baf7200ca21 + 835b52f3e10c37e90fb736c9758c5992 + 3281cc8e2362eea41e92d472ddd56444 + 5b39ad25381fdb440cba49aafc5eb0b9 + dfe1f12b2a2293b70f71989904a97a34 + 3300438124f9bd44b7a5d335f5fc8cd1 + 3fed54bc7ff2d7230a9591948c1d0d5a + 30c1793c5131ecdbefff42891eb3dda2 + e39894ac7340226215da856ac0261f8d + 9350f1cb951cdd2ecde8a3030cfa1d04 + bcda121bdc19e23408b93449c23b807a + eb498d0aba006adae71a654219697f65 + 471adb6892da3d726d4e86e2452e241a + cc2fb53232128df6bf1bee24a40d0722 + 45ff83d84433dc9e2fdfd7683723ed94 + 84a2b4c4d6c13a0176bdaf00e5c372bf + a4c7fff788b02718101f6d0da4aef648 + 201272eafbdb16269449ce5f20d766a8 + ff86e9a1e5a7e327e6f63217036fcf39 + 8f5daf8a347d13de49e2b090a990a791 + 6be789a33f824dbb29787784f35df04f + 837e3f0772594775c8a141bd7b9a6363 + ca99250bde07c3ed8b263a64d3b7f5c6 + + + b636929a69395d39ba5b4f522abb3bb9 + 351447f267ce109847737db1c7cf79f2 + 18f18498f678e2086ef18a155faca801 + fee0676b41473cbc1ac31a8a635af236 + 942b74b8233afa6e6bb4c4eea456c4ef + 9ad56fd901d3720ae8e87cd341a3cd65 + d29bc1a216c4cc2f003b817e9775bf2e + + + 8f2084984e11516f80a87cb55ef0f1b7 + 391b6f417e545857e3c0c7ea9d0c892b + f2a2bc5865635ad93866a8b331bce43c + f3ed92173c568dd729c41594187d5343 + + 88b3f35a822d45ad67121ac0e0d3acda + + ff8f80d3a8f2a277d3f2f2ac0347d580 + + 9c8f4ffdf1e1c2c568a699189faaccd3 + 5e8eef1a3dd0d9a9bca06152828edf4a + b2784ab56d108c651e2faded69daf3e3 + 17f312cb547832eb531a02df8bbf2361 + fad5b659f2fff3636ca1c7ef1a9d84ff + c4ea21df31e0b128d0ff4c0678307f40 + e1d60af11430d1fe99d71060ff419290 + cc5bfb4184c9baef68b97b9293d34d99 + 8033af7464e2cb9ae87d6ee343abed2a + d5ca7d7caa49f283cd01cdab662c39a3 + 0c5f00038e513b69ea88e9af59813392 + c55ff9544a43eb9e633c7551cc433fc7 + ce49f5f454bb932cf981e8e50b585ad6 + e0cb58f4c0e9eaf5f118abbe38cfaecf + b71ef09633a9fbafa3f138981cd1ed4c + 2f47ccb7652d5ea7885c38d1f924df76 + 7d605ef96703757438f0a49b84335ebb + + a745234ca075aa7b634dc5b83242cd32 + dc306c16a9fec4e8131a4759d5fd64f4 + 5e862feec5cb735c945713bb561715b5 + ed66056587fa42e49f7c4c186185cf45 + 363fce5057b33e6a8761f6475947e8b9 + c431522464753dc23e9e06651dcca6b7 + 92a7112d4f25298fbec8961437cdf4b3 + b73cfa8d24ef5545d6e6c1eeab83913f + 986ca7ce4713c6d7edfb46e7ec1f5e3c + 8e1087156b9bbf9186693023f5cdb339 + 2d3c8755c73bed018a3ce411a595b1c9 + 97ea179a615d5d2c5ff6b90b459377e3 + 9cb9052a5b8dde60969c1654718189d8 + eaf6238301034cf16c20e85dc4b7b4bb + 2c55c1ff619165ae24547b44c1194445 + 046328f3002248db09e4d2a89f14d103 + b9b814fdb9af405da68db48540ee48ca + 2eda4c45ba8b695fbdf8126ed4a2be08 + a9188e9090b1bd9865f044d5695614cf + 57b3532a899ef0e1982f2ef6cae12661 + ae58208e3094d0bbb8c6b331a6415325 + aed732468557aa7452e811c9f4714225 + 891abceb9bcffc9cd9fadca026c29cee + fdd12b4efc5a2e8777e46638cdf28aef + 1a9d90a02a9395c7e1a6b28087bc4be3 + 9b204a25e34b0821ffe5de21a36433cd + 885249b2273600311a37e0ccd447bb42 + + + bebc4917738e86fd34a61f44b7be9046 + 38bbc40b3e159c6184ee927b8d97c095 + f91c18954f4d77e8fba611ddb7de3916 + 8dc65f4298409383e4242ac7fc513170 + 2ccbe2293d291022063a686f8c114c4e + 0067b09ef187578b7ff95b9b7c9ac4c9 + + + + acc3e10830d101f5849d6ee26f2ee4a1 + + 7dfdd7aab606108526740ed2410cb7d3 + + c6c8b27f9d27d140cf4f4816706c1feb + ef6338c77dc17ffb369daa4969134f07 + d18c8fd29ce71af7649896d1cea671d2 + 177c1f2c16b7d1d5ac0c53d44c7dd585 + + + 24b7fd54ba4b1254c6d19ee5f34746e8 + d20e5cf6e162cf8020432893f4c829e8 + + + + 85f35aebed11d999cc49d7e33c939e69 + 5168f15aa362004eb85ad5343ed9b5f8 + fd1ea8a2d1362d9d08bc286f69a946b6 + + + 90476341be144439cb05639fa001fb40 + ab487ec3041846a0172ff59e388db827 + cd7077cf541307775e25d34b3860e1d9 + 15844b0e64f84351308fbb19ab527b7e + d52874981b38a6c5a0ef57029ae7fbec + 9759fb37627bfa4ad59e83eeebbd3859 + e55b4abc2a4ad5a836d2b0cfcec0e56d + 126b8f204ffc4e34db381592cba2d03a + + + 125f5fd18c36eaa693b752a4d7476daf + 20b7e1284a7f765c598fd37c2feb5065 + + + f71fc041fd314dbbf3b241f220974213 + c901ddef0fbb4e9cddc15cf1782fbd85 + 9735a11437b31bacd805b6484fe97f62 + 4fcc064fd242a4d0342c05407bdf6b03 + 414442707567ab1608c3c9d161518fb0 + b4e82d6e3edbf7425288ba1625afb4c5 + a7a3c1765db0005a73dac9d98600a57c + c518eb0e45b10bda2c562a885cd62885 + 8442f2750f7f59942924ab91baad9836 + df73a30dd1a1222b0fc2ff37f4d7b6ac + 5bdbcae78c9d4c19c3399e1927daeecb + 58e90c3f9bb359ec9b6c3e60e419fa53 + 4ae926ceddfbcce96afd676b0773185d + 7cf31479a55d08d3159bf38671d8d60f + 697fc69a0a4eb5d06be1a3675d76632f + e17300c14c09668b656791dc892bc592 + 76f39d9c2f2976765afb16f025b6712f + 62928b38ade9553b3ce69bae576c8d78 + e0c6fd95e6126d471a93c9d2be39f17c + a2e806185585f54c123c74313d1039e1 + c5c6c61c73f7ca660d425e2e7a8a6e5b + 69cbb64bd6796067cab0a39c0a379aac + + + 942cb3a3f6794ca867a3e6b2c2de9ba1 + 95e8577b871e6576d437d31832f09155 + + acaa0615bcfa9f5a60b9f3337a8de605 + f7a4ec1df31d9d70c741be3570f9463f + 04a575426a4c4a911e48d09c0e37fbe1 + 2e4be076b56a6b01ae8259e6f3f2af07 + f204c330acbda7993a2dc262c61b7627 + 6dc3f92292610ebf33dbe728d8e628e4 + 012bf2f6bb81f53138e3457116eac0c6 + 7c28d26af6d13610023779507d9f6d5a + 49656fdc980c512b78c59f38490d38f4 + 29d66df1a8526c1190f4434f314a259d + 730486d6ae853d34a512ed12c93fb8c2 + 47e391f784152c9fd3bb838e18a99145 + 69564afd8b69ad3abb02bafababd34e3 + 6997d5d7cfc92d3a10e525f68ba05277 + 1848541512aedbc4fcefb7b84c4cd3b3 + + b1acb4394c75e1655de10bb191af6f1a + ebb219d4f239d5d16888781f48454ac1 + + + + + + 8c9f04208c6f9e9a40d30e37daee927d + + 5de17f5f78c1dcbadb3792393419bf63 + + + 3b98e7b96261843cd752c96a0dc5105d + + + 5119565d69cd68fae2e2a709363f8754 + b346a6ef36796ad05c8b0fc2f7ee9d9d + + 242ef43d8cc177365650ac67459f830f + 0c7996ca741c35ec24e82e5b116604dc + c56229536ad87927314859f93955da48 + ff890bf2268eaf487e01bcab4c0b6506 + 3c8b76b47ce4e08cc5812f2cad6e8208 + 6bb656febc77262e626390ab13ebe324 + 0bc536adc27e3cd718b66c6e02d6789e + 66ebebfb5ce8bac4d33e763ef0d7811d + ab23e03888b87f010e7ee688b8f43190 + + diff --git a/config/xml/channel.xml b/config/xml/channel.xml new file mode 100644 index 0000000..e210c0f --- /dev/null +++ b/config/xml/channel.xml @@ -0,0 +1,116 @@ + + + + + 1.4.11 stable + 1.4.11.1 + + http://www.prestashop.com/download/old/prestashop_1.4.11.1.zip + 5e98afb0b7d8d4749f2d6704c9d08dbf + + http://www.prestashop.com/download/old/changelog_1.4.11.1-stable.txt + + + 1.5.6.3 stable + 1.5.6.3 + + http://www.prestashop.com/download/old/prestashop_1.5.6.3.zip + b3b70201b3e95f3b2feb0775a0cb02f6 + + http://www.prestashop.com/download/old/changelog_1.5.6.3-stable.txt + + + 1.6.1 stable + 1.6.1.24 + + http://download.prestashop.com/download/releases/prestashop_1.6.1.24.zip + 8cd5dd3470bc42137c1018a1a8e97c0a + + http://build.prestashop.com/news/prestashop-1-7-5-2-1-6-1-24-maintenance-release/ + + + 1.7.8 stable + 1.7.8.11 + + https://github.com/PrestaShop/PrestaShop/releases/download/1.7.8.11/prestashop_1.7.8.11.zip + d29d55f89a2c44bef3d5c51b70e3a771 + + https://build.prestashop-project.org/news/2024/prestashop-1-7-8-11-maintenance-release/ + + + + 8 stable + 8.2.1 + + https://github.com/PrestaShop/PrestaShop/releases/download/8.2.1/prestashop_8.2.1.zip + 513bd62a9f9ad35a723f362d88c99790 + + https://build.prestashop-project.org/news/2025/prestashop-8-2-1-maintenance-release/ + + + + 8 stable + 8.2.1 + + https://github.com/PrestaShop/PrestaShop/releases/download/8.2.1/prestashop_8.2.1.zip + 513bd62a9f9ad35a723f362d88c99790 + + https://build.prestashop-project.org/news/2025/prestashop-8-2-1-maintenance-release/ + + + 8 stable + 8.2.1 + + https://github.com/PrestaShop/PrestaShop/releases/download/8.2.1/prestashop_8.2.1.zip + 513bd62a9f9ad35a723f362d88c99790 + + https://build.prestashop-project.org/news/2025/prestashop-8-2-1-maintenance-release/ + + + 8 stable + 8.2.1 + + https://github.com/PrestaShop/PrestaShop/releases/download/8.2.1/prestashop_8.2.1.zip + 513bd62a9f9ad35a723f362d88c99790 + + https://build.prestashop-project.org/news/2025/prestashop-8-2-1-maintenance-release/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6.2.0 + + https://github.com/PrestaShop/autoupgrade/releases/download/v6.2.0/autoupgrade-v6.2.0.zip + 766c2372702f83cb32466c50222cb8fc + + + + diff --git a/config/xml/index.php b/config/xml/index.php new file mode 100644 index 0000000..76cd9dd --- /dev/null +++ b/config/xml/index.php @@ -0,0 +1,35 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/config/xml/themes/default.xml b/config/xml/themes/default.xml new file mode 100644 index 0000000..b775004 --- /dev/null +++ b/config/xml/themes/default.xml @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/xml/themes/index.php b/config/xml/themes/index.php new file mode 100644 index 0000000..76cd9dd --- /dev/null +++ b/config/xml/themes/index.php @@ -0,0 +1,35 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/config/xml/trusted_modules_list.xml b/config/xml/trusted_modules_list.xml new file mode 100644 index 0000000..9168769 --- /dev/null +++ b/config/xml/trusted_modules_list.xml @@ -0,0 +1,2 @@ + + diff --git a/config/xml/untrusted_modules_list.xml b/config/xml/untrusted_modules_list.xml new file mode 100644 index 0000000..8cb9975 --- /dev/null +++ b/config/xml/untrusted_modules_list.xml @@ -0,0 +1,2 @@ + + diff --git a/controllers/.htaccess b/controllers/.htaccess new file mode 100644 index 0000000..3de9e40 --- /dev/null +++ b/controllers/.htaccess @@ -0,0 +1,10 @@ +# Apache 2.2 + + Order deny,allow + Deny from all + + +# Apache 2.4 + + Require all denied + diff --git a/controllers/admin/AdminAccessController.php b/controllers/admin/AdminAccessController.php new file mode 100644 index 0000000..f950044 --- /dev/null +++ b/controllers/admin/AdminAccessController.php @@ -0,0 +1,235 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property Profile $object + */ +class AdminAccessControllerCore extends AdminController +{ + /** @var array : Black list of id_tab that do not have access */ + public $accesses_black_list = []; + + public function __construct() + { + $this->bootstrap = true; + $this->show_toolbar = false; + $this->table = 'access'; + $this->className = 'Profile'; + $this->multishop_context = Shop::CONTEXT_ALL; + $this->lang = false; + $this->context = Context::getContext(); + + // Blacklist AdminLogin + $this->accesses_black_list[] = Tab::getIdFromClassName('AdminLogin'); + + parent::__construct(); + } + + /** + * AdminController::renderForm() override. + * + * @see AdminController::renderForm() + */ + public function renderForm() + { + $current_profile = (int) $this->getCurrentProfileId(); + $profiles = Profile::getProfiles($this->context->language->id); + $tabs = Tab::getTabs($this->context->language->id); + + $accesses = []; + foreach ($profiles as $profile) { + $accesses[$profile['id_profile']] = Profile::getProfileAccesses($profile['id_profile']); + } + + // Deleted id_tab that do not have access + foreach ($tabs as $key => $tab) { + // Don't allow permissions for unnamed tabs (ie. AdminLogin) + if (empty($tab['name'])) { + unset($tabs[$key]); + } + + foreach ($this->accesses_black_list as $id_tab) { + if ($tab['id_tab'] == (int) $id_tab) { + unset($tabs[$key]); + } + } + } + + $modules = []; + foreach ($profiles as $profile) { + $modules[$profile['id_profile']] = Module::getModulesAccessesByIdProfile($profile['id_profile']); + uasort($modules[$profile['id_profile']], [$this, 'sortModuleByName']); + } + + $this->fields_form = ['']; + $this->tpl_form_vars = [ + 'profiles' => $profiles, + 'accesses' => $accesses, + 'id_tab_parentmodule' => (int) Tab::getIdFromClassName('AdminParentModules'), + 'id_tab_module' => (int) Tab::getIdFromClassName('AdminModules'), + 'tabs' => $this->displayTabs($tabs), + 'current_profile' => (int) $current_profile, + 'admin_profile' => (int) _PS_ADMIN_PROFILE_, + 'access_edit' => $this->access('edit'), + 'perms' => ['view', 'add', 'edit', 'delete'], + 'id_perms' => ['view' => 0, 'add' => 1, 'edit' => 2, 'delete' => 3, 'all' => 4], + 'modules' => $modules, + 'link' => $this->context->link, + 'employee_profile_id' => (int) $this->context->employee->id_profile, + ]; + + return parent::renderForm(); + } + + /** + * AdminController::initContent() override. + * + * @see AdminController::initContent() + */ + public function initContent() + { + $this->display = 'edit'; + + if (!$this->loadObject(true)) { + return; + } + + $this->content .= $this->renderForm(); + + $this->context->smarty->assign([ + 'content' => $this->content, + ]); + } + + public function initToolbarTitle() + { + $this->toolbar_title = array_unique($this->breadcrumbs); + } + + public function initPageHeaderToolbar() + { + parent::initPageHeaderToolbar(); + unset($this->page_header_toolbar_btn['cancel']); + } + + public function ajaxProcessUpdateAccess() + { + if (_PS_MODE_DEMO_) { + throw new PrestaShopException($this->trans('This functionality has been disabled.', [], 'Admin.Notifications.Error')); + } + if ($this->access('edit') != '1') { + throw new PrestaShopException($this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error')); + } + + if (Tools::isSubmit('submitAddAccess')) { + $access = new Access(); + $perm = Tools::getValue('perm'); + if (!in_array($perm, ['view', 'add', 'edit', 'delete', 'all'])) { + throw new PrestaShopException('permission does not exist'); + } + + $enabled = (int) Tools::getValue('enabled'); + $id_tab = (int) Tools::getValue('id_tab'); + $id_profile = (int) Tools::getValue('id_profile'); + $addFromParent = (int) Tools::getValue('addFromParent'); + + die($access->updateLgcAccess((int) $id_profile, $id_tab, $perm, $enabled, $addFromParent)); + } + } + + public function ajaxProcessUpdateModuleAccess() + { + if (_PS_MODE_DEMO_) { + throw new PrestaShopException($this->trans('This functionality has been disabled.', [], 'Admin.Notifications.Error')); + } + if ($this->access('edit') != '1') { + throw new PrestaShopException($this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error')); + } + + if (Tools::isSubmit('changeModuleAccess')) { + $access = new Access(); + $perm = Tools::getValue('perm'); + $enabled = (int) Tools::getValue('enabled'); + $id_module = (int) Tools::getValue('id_module'); + $id_profile = (int) Tools::getValue('id_profile'); + + if (!in_array($perm, ['view', 'configure', 'uninstall'])) { + throw new PrestaShopException('permission does not exist'); + } + + die($access->updateLgcModuleAccess((int) $id_profile, $id_module, $perm, $enabled)); + } + } + + /** + * Get the current profile id. + * + * @return int the $_GET['profile'] if valid, else 1 (the first profile id) + */ + public function getCurrentProfileId() + { + return (isset($_GET['id_profile']) && !empty($_GET['id_profile']) && is_numeric($_GET['id_profile'])) ? (int) $_GET['id_profile'] : 1; + } + + /** + * @param array $a module data + * @param array $b module data + * + * @return int + */ + protected function sortModuleByName($a, $b) + { + $moduleAName = isset($a['name']) ? $a['name'] : null; + $moduleBName = isset($b['name']) ? $b['name'] : null; + + return strnatcmp($moduleAName, $moduleBName); + } + + /** + * return human readable Tabs hierarchy for display. + */ + protected function displayTabs(array $tabs) + { + $tabsTree = $this->getChildrenTab($tabs); + + return $tabsTree; + } + + protected function getChildrenTab(array &$tabs, $id_parent = 0) + { + $children = []; + foreach ($tabs as $tab) { + $id = $tab['id_tab']; + + if ($tab['id_parent'] == $id_parent) { + $children[$id] = $tab; + $children[$id]['children'] = $this->getChildrenTab($tabs, $id); + } + } + + return $children; + } +} diff --git a/controllers/admin/AdminAddressesController.php b/controllers/admin/AdminAddressesController.php new file mode 100644 index 0000000..28872bc --- /dev/null +++ b/controllers/admin/AdminAddressesController.php @@ -0,0 +1,571 @@ + + * @copyright 2007-2019 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +/** + * @property Address $object + */ +class AdminAddressesControllerCore extends AdminController +{ + /** @var array countries list */ + protected $countries_array = array(); + + public function __construct() + { + $this->bootstrap = true; + $this->required_database = true; + $this->required_fields = array('company', 'address2', 'postcode', 'other', 'phone', 'phone_mobile', 'vat_number', 'dni'); + $this->table = 'address'; + $this->className = 'CustomerAddress'; + $this->lang = false; + $this->addressType = 'customer'; + $this->explicitSelect = true; + + parent::__construct(); + + $this->addRowAction('edit'); + $this->addRowAction('delete'); + $this->bulk_actions = array( + 'delete' => array( + 'text' => $this->trans('Delete selected', array(), 'Admin.Notifications.Info'), + 'confirm' => $this->trans('Delete selected items?', array(), 'Admin.Notifications.Info'), + 'icon' => 'icon-trash', + ), + ); + + $this->allow_export = true; + + if (!Tools::getValue('realedit')) { + $this->deleted = true; + } + + $countries = Country::getCountries($this->context->language->id); + foreach ($countries as $country) { + $this->countries_array[$country['id_country']] = $country['name']; + } + + $this->fields_list = array( + 'id_address' => array( + 'title' => $this->trans('ID', array(), 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ), + 'firstname' => array( + 'title' => $this->trans('First Name', array(), 'Admin.Global'), + 'filter_key' => 'a!firstname', + 'maxlength' => 30, + ), + 'lastname' => array( + 'title' => $this->trans('Last Name', array(), 'Admin.Global'), + 'filter_key' => 'a!lastname', + 'maxlength' => 30, + ), + 'address1' => array( + 'title' => $this->trans('Address', array(), 'Admin.Global'), + ), + 'postcode' => array( + 'title' => $this->trans('Zip/postal code', array(), 'Admin.Global'), + 'align' => 'right', + ), + 'city' => array( + 'title' => $this->trans('City', array(), 'Admin.Global'), + ), + 'country' => array( + 'title' => $this->trans('Country', array(), 'Admin.Global'), + 'type' => 'select', + 'list' => $this->countries_array, + 'filter_key' => 'cl!id_country', + ), + ); + + $this->_select = 'cl.`name` as country'; + $this->_join = ' + LEFT JOIN `' . _DB_PREFIX_ . 'country_lang` cl ON (cl.`id_country` = a.`id_country` AND cl.`id_lang` = ' . (int) $this->context->language->id . ') + LEFT JOIN `' . _DB_PREFIX_ . 'customer` c ON a.id_customer = c.id_customer + '; + $this->_where = 'AND a.id_customer != 0 ' . Shop::addSqlRestriction(Shop::SHARE_CUSTOMER, 'c'); + $this->_use_found_rows = false; + } + + public function initToolbar() + { + parent::initToolbar(); + + if (!$this->display && $this->can_import) { + $this->toolbar_btn['import'] = array( + 'href' => $this->context->link->getAdminLink('AdminImport', true, array(), array('import_type' => 'addresses')), + 'desc' => $this->trans('Import', array(), 'Admin.Actions'), + ); + } + } + + public function initPageHeaderToolbar() + { + if (empty($this->display)) { + $this->page_header_toolbar_btn['new_address'] = array( + 'href' => $this->context->link->getAdminLink('AdminAddresses', true, array(), array('addaddress' => 1)), + 'desc' => $this->trans('Add new address', array(), 'Admin.Orderscustomers.Feature'), + 'icon' => 'process-icon-new', + ); + } + + parent::initPageHeaderToolbar(); + } + + public function renderForm() + { + $this->fields_form = array( + 'legend' => array( + 'title' => $this->trans('Addresses', array(), 'Admin.Orderscustomers.Feature'), + 'icon' => 'icon-envelope-alt', + ), + 'input' => array( + array( + 'type' => 'text_customer', + 'label' => $this->trans('Customer', array(), 'Admin.Global'), + 'name' => 'id_customer', + 'required' => false, + ), + array( + 'type' => 'text', + 'label' => $this->trans('Identification number', array(), 'Admin.Orderscustomers.Feature'), + 'name' => 'dni', + 'required' => false, + 'col' => '4', + 'hint' => $this->trans('The national ID card number of this person, or a unique tax identification number.', array(), 'Admin.Orderscustomers.Feature'), + ), + array( + 'type' => 'text', + 'label' => $this->trans('Address alias', array(), 'Admin.Orderscustomers.Feature'), + 'name' => 'alias', + 'required' => true, + 'col' => '4', + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + array( + 'type' => 'textarea', + 'label' => $this->trans('Other', array(), 'Admin.Global'), + 'name' => 'other', + 'required' => false, + 'cols' => 15, + 'rows' => 3, + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + array( + 'type' => 'hidden', + 'name' => 'id_order', + ), + array( + 'type' => 'hidden', + 'name' => 'address_type', + ), + array( + 'type' => 'hidden', + 'name' => 'back', + ), + ), + 'submit' => array( + 'title' => $this->trans('Save', array(), 'Admin.Actions'), + ), + ); + + $this->fields_value['address_type'] = (int) Tools::getValue('address_type', 1); + + $id_customer = (int) Tools::getValue('id_customer'); + if (!$id_customer && Validate::isLoadedObject($this->object)) { + $id_customer = $this->object->id_customer; + } + if ($id_customer) { + $customer = new Customer((int) $id_customer); + } + + $this->tpl_form_vars = array( + 'customer' => isset($customer) ? $customer : null, + 'customer_view_url' => $this->context->link->getAdminLink('AdminCustomers', true, [], [ + 'viewcustomer' => 1, + 'id_customer' => $id_customer, + ]), + 'back_url' => urldecode(Tools::getValue('back')), + ); + + // Order address fields depending on country format + $addresses_fields = $this->processAddressFormat(); + // we use delivery address + $addresses_fields = $addresses_fields['dlv_all_fields']; + + // get required field + $required_fields = AddressFormat::getFieldsRequired(); + + // Merge with field required + $addresses_fields = array_unique(array_merge($addresses_fields, $required_fields)); + + $temp_fields = array(); + + foreach ($addresses_fields as $addr_field_item) { + if ($addr_field_item == 'company') { + $temp_fields[] = array( + 'type' => 'text', + 'label' => $this->trans('Company', array(), 'Admin.Global'), + 'name' => 'company', + 'required' => in_array('company', $required_fields), + 'col' => '4', + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ); + $temp_fields[] = array( + 'type' => 'text', + 'label' => $this->trans('VAT number', array(), 'Admin.Orderscustomers.Feature'), + 'col' => '2', + 'name' => 'vat_number', + 'required' => in_array('vat_number', $required_fields), + ); + } elseif ($addr_field_item == 'lastname') { + if (isset($customer) && + !Tools::isSubmit('submit' . strtoupper($this->table)) && + Validate::isLoadedObject($customer) && + !Validate::isLoadedObject($this->object)) { + $default_value = $customer->lastname; + } else { + $default_value = ''; + } + + $temp_fields[] = array( + 'type' => 'text', + 'label' => $this->trans('Last Name', array(), 'Admin.Global'), + 'name' => 'lastname', + 'required' => true, + 'col' => '4', + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' 0-9!&lt;&gt;,;?=+()@#"�{}_$%:', + 'default_value' => $default_value, + ); + } elseif ($addr_field_item == 'firstname') { + if (isset($customer) && + !Tools::isSubmit('submit' . strtoupper($this->table)) && + Validate::isLoadedObject($customer) && + !Validate::isLoadedObject($this->object)) { + $default_value = $customer->firstname; + } else { + $default_value = ''; + } + + $temp_fields[] = array( + 'type' => 'text', + 'label' => $this->trans('First Name', array(), 'Admin.Global'), + 'name' => 'firstname', + 'required' => true, + 'col' => '4', + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' 0-9!&lt;&gt;,;?=+()@#"�{}_$%:', + 'default_value' => $default_value, + ); + } elseif ($addr_field_item == 'address1') { + $temp_fields[] = array( + 'type' => 'text', + 'label' => $this->trans('Address', array(), 'Admin.Global'), + 'name' => 'address1', + 'col' => '6', + 'required' => true, + ); + } elseif ($addr_field_item == 'address2') { + $temp_fields[] = array( + 'type' => 'text', + 'label' => $this->trans('Address', array(), 'Admin.Global') . ' (2)', + 'name' => 'address2', + 'col' => '6', + 'required' => in_array('address2', $required_fields), + ); + } elseif ($addr_field_item == 'postcode') { + $temp_fields[] = array( + 'type' => 'text', + 'label' => $this->trans('Zip/postal code', array(), 'Admin.Global'), + 'name' => 'postcode', + 'col' => '2', + 'required' => true, + ); + } elseif ($addr_field_item == 'city') { + $temp_fields[] = array( + 'type' => 'text', + 'label' => $this->trans('City', array(), 'Admin.Global'), + 'name' => 'city', + 'col' => '4', + 'required' => true, + ); + } elseif ($addr_field_item == 'country' || $addr_field_item == 'Country:name') { + $temp_fields[] = array( + 'type' => 'select', + 'label' => $this->trans('Country', array(), 'Admin.Global'), + 'name' => 'id_country', + 'required' => in_array('Country:name', $required_fields) || in_array('country', $required_fields), + 'col' => '4', + 'default_value' => (int) $this->context->country->id, + 'options' => array( + 'query' => Country::getCountries($this->context->language->id), + 'id' => 'id_country', + 'name' => 'name', + ), + ); + $temp_fields[] = array( + 'type' => 'select', + 'label' => $this->trans('State', array(), 'Admin.Global'), + 'name' => 'id_state', + 'required' => false, + 'col' => '4', + 'options' => array( + 'query' => array(), + 'id' => 'id_state', + 'name' => 'name', + ), + ); + } elseif ($addr_field_item == 'phone') { + $temp_fields[] = array( + 'type' => 'text', + 'label' => $this->trans('Home phone', array(), 'Admin.Global'), + 'name' => 'phone', + 'required' => in_array('phone', $required_fields), + 'col' => '4', + ); + } elseif ($addr_field_item == 'phone_mobile') { + $temp_fields[] = array( + 'type' => 'text', + 'label' => $this->trans('Mobile phone', array(), 'Admin.Global'), + 'name' => 'phone_mobile', + 'required' => in_array('phone_mobile', $required_fields), + 'col' => '4', + ); + } + } + + // merge address format with the rest of the form + array_splice($this->fields_form['input'], 3, 0, $temp_fields); + + return parent::renderForm(); + } + + public function processSave() + { + if (Tools::getValue('submitFormAjax')) { + $this->redirect_after = false; + } + + // Transform e-mail in id_customer for parent processing + if (Validate::isEmail(Tools::getValue('email'))) { + $customer = new Customer(); + $customer->getByEmail(Tools::getValue('email'), null, false); + if (Validate::isLoadedObject($customer)) { + $_POST['id_customer'] = $customer->id; + } else { + $this->errors[] = $this->trans('This email address is not registered.', array(), 'Admin.Orderscustomers.Notification'); + } + } elseif ($id_customer = Tools::getValue('id_customer')) { + $customer = new Customer((int) $id_customer); + if (Validate::isLoadedObject($customer)) { + $_POST['id_customer'] = $customer->id; + } else { + $this->errors[] = $this->trans('This customer ID is not recognized.', array(), 'Admin.Orderscustomers.Notification'); + } + } else { + $this->errors[] = $this->trans('This email address is not valid. Please use an address like bob@example.com.', array(), 'Admin.Orderscustomers.Notification'); + } + if (Country::isNeedDniByCountryId(Tools::getValue('id_country')) && !Tools::getValue('dni')) { + $this->errors[] = $this->trans('The identification number is incorrect or has already been used.', array(), 'Admin.Orderscustomers.Notification'); + } + + /* If the selected country does not contain states */ + $id_state = (int) Tools::getValue('id_state'); + $id_country = (int) Tools::getValue('id_country'); + $country = new Country((int) $id_country); + if ($country && !(int) $country->contains_states && $id_state) { + $this->errors[] = $this->trans('You have selected a state for a country that does not contain states.', array(), 'Admin.Orderscustomers.Notification'); + } + + /* If the selected country contains states, then a state have to be selected */ + if ((int) $country->contains_states && !$id_state) { + $this->errors[] = $this->trans('An address located in a country containing states must have a state selected.', array(), 'Admin.Orderscustomers.Notification'); + } + + $postcode = Tools::getValue('postcode'); + /* Check zip code format */ + if ($country->zip_code_format && !$country->checkZipCode($postcode)) { + $this->errors[] = $this->trans('Your Zip/postal code is incorrect.', array(), 'Admin.Notifications.Error') . '
' . $this->trans('It must be entered as follows:', array(), 'Admin.Notifications.Error') . ' ' . str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format))); + } elseif (empty($postcode) && $country->need_zip_code) { + $this->errors[] = $this->trans('A Zip/postal code is required.', array(), 'Admin.Notifications.Error'); + } elseif ($postcode && !Validate::isPostCode($postcode)) { + $this->errors[] = $this->trans('The Zip/postal code is invalid.', array(), 'Admin.Notifications.Error'); + } + + /* If this address come from order's edition and is the same as the other one (invoice or delivery one) + ** we delete its id_address to force the creation of a new one */ + if ((int) Tools::getValue('id_order')) { + $this->_redirect = false; + if (isset($_POST['address_type'])) { + $_POST['id_address'] = ''; + $this->id_object = null; + } + } + + // Check the requires fields which are settings in the BO + $address = new Address(); + $this->errors = array_merge($this->errors, $address->validateFieldsRequiredDatabase()); + + $return = false; + if (empty($this->errors)) { + $return = parent::processSave(); + } else { + // if we have errors, we stay on the form instead of going back to the list + $this->display = 'edit'; + } + + /* Reassignation of the order's new (invoice or delivery) address */ + $address_type = (int) Tools::getValue('address_type') == 2 ? 'invoice' : 'delivery'; + + if ($this->action == 'save' && ($id_order = (int) Tools::getValue('id_order')) && !count($this->errors) && !empty($address_type)) { + if (!Db::getInstance()->execute('UPDATE ' . _DB_PREFIX_ . 'orders SET `id_address_' . bqSQL($address_type) . '` = ' . (int) $this->object->id . ' WHERE `id_order` = ' . (int) $id_order)) { + $this->errors[] = $this->trans('An error occurred while linking this address to its order.', array(), 'Admin.Orderscustomers.Notification'); + } else { + //update order shipping cost + $order = new Order($id_order); + $order->refreshShippingCost(); + + // update cart + $cart = Cart::getCartByOrderId($id_order); + if (Validate::isLoadedObject($cart)) { + if ($address_type == 'invoice') { + $cart->id_address_invoice = (int) $this->object->id; + } else { + $cart->id_address_delivery = (int) $this->object->id; + } + $cart->update(); + } + // redirect + Tools::redirectAdmin(urldecode(Tools::getValue('back')) . '&conf=4'); + } + } + + return $return; + } + + public function processAdd() + { + if (Tools::getValue('submitFormAjax')) { + $this->redirect_after = false; + } + + return parent::processAdd(); + } + + /** + * Get Address formats used by the country where the address id retrieved from POST/GET is. + * + * @return array address formats + */ + protected function processAddressFormat() + { + $tmp_addr = new CustomerAddress((int) Tools::getValue('id_address')); + + $selected_country = ($tmp_addr && $tmp_addr->id_country) ? $tmp_addr->id_country : (int) Configuration::get('PS_COUNTRY_DEFAULT'); + $adr_fields = AddressFormat::getOrderedAddressFields($selected_country, false, true); + + $all_fields = array(); + $out = array(); + + foreach ($adr_fields as $fields_line) { + foreach (explode(' ', $fields_line) as $field_item) { + $all_fields[] = trim($field_item); + } + } + + foreach (array('inv', 'dlv') as $adr_type) { + $out[$adr_type . '_adr_fields'] = $adr_fields; + $out[$adr_type . '_all_fields'] = $all_fields; + } + + return $out; + } + + /** + * Method called when an ajax request is made. + * + * @see AdminController::postProcess() + */ + public function ajaxProcess() + { + if (Tools::isSubmit('email')) { + $email = pSQL(Tools::getValue('email')); + $customer = Customer::searchByName($email); + if (!empty($customer)) { + $customer = $customer['0']; + echo json_encode(array('infos' => pSQL($customer['firstname']) . '_' . pSQL($customer['lastname']) . '_' . pSQL($customer['company']))); + } + } + + if (Tools::isSubmit('dni_required')) { + echo json_encode(['dni_required' => Address::dniRequired((int) Tools::getValue('id_country'))]); + } + + die; + } + + /** + * Object Delete. + */ + public function processDelete() + { + if (Validate::isLoadedObject($object = $this->loadObject())) { + /** @var Address $object */ + if (!$object->isUsed()) { + $this->deleted = false; + } + } + + $res = parent::processDelete(); + + if ($back = Tools::getValue('back')) { + $this->redirect_after = urldecode($back) . '&conf=1'; + } + + return $res; + } + + /** + * Delete multiple items. + * + * @return bool true if succcess + */ + protected function processBulkDelete() + { + if (is_array($this->boxes) && !empty($this->boxes)) { + $deleted = false; + foreach ($this->boxes as $id) { + $to_delete = new Address((int) $id); + if ($to_delete->isUsed()) { + $deleted = true; + + break; + } + } + $this->deleted = $deleted; + } + + return parent::processBulkDelete(); + } +} diff --git a/controllers/admin/AdminAttachmentsController.php b/controllers/admin/AdminAttachmentsController.php new file mode 100644 index 0000000..26b5c1a --- /dev/null +++ b/controllers/admin/AdminAttachmentsController.php @@ -0,0 +1,264 @@ + + * @copyright 2007-2019 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +/** + * @property Attachment $object + */ +class AdminAttachmentsControllerCore extends AdminController +{ + public $bootstrap = true; + + protected $product_attachements = array(); + + public function __construct() + { + $this->table = 'attachment'; + $this->className = 'Attachment'; + $this->lang = true; + + $this->addRowAction('edit'); + $this->addRowAction('view'); + $this->addRowAction('delete'); + + $this->_select = 'IFNULL(virtual_product_attachment.products, 0) as products'; + $this->_join = 'LEFT JOIN (SELECT id_attachment, COUNT(*) as products FROM ' . _DB_PREFIX_ . 'product_attachment GROUP BY id_attachment) virtual_product_attachment ON a.id_attachment = virtual_product_attachment.id_attachment'; + $this->_use_found_rows = false; + + parent::__construct(); + + $this->fields_list = array( + 'id_attachment' => array( + 'title' => $this->trans('ID', array(), 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ), + 'name' => array( + 'title' => $this->trans('Name', array(), 'Admin.Global'), + ), + 'file' => array( + 'title' => $this->trans('File', array(), 'Admin.Global'), + 'orderby' => false, + 'search' => false, + ), + 'file_size' => array( + 'title' => $this->trans('Size', array(), 'Admin.Global'), + 'callback' => 'displayHumanReadableSize', + ), + 'products' => array( + 'title' => $this->trans('Associated with', array(), 'Admin.Catalog.Feature'), + 'suffix' => $this->trans('product(s)', array(), 'Admin.Catalog.Feature'), + 'filter_key' => 'virtual_product_attachment!products', + ), + ); + + $this->bulk_actions = array( + 'delete' => array( + 'text' => $this->trans('Delete selected', array(), 'Admin.Notifications.Info'), + 'icon' => 'icon-trash', + 'confirm' => $this->trans('Delete selected items?', array(), 'Admin.Notifications.Info'), + ), + ); + } + + public function setMedia($isNewTheme = false) + { + parent::setMedia($isNewTheme); + + $this->addJs(_PS_JS_DIR_ . '/admin/attachments.js'); + Media::addJsDefL('confirm_text', $this->trans('This file is associated with the following products, do you really want to delete it?', array(), 'Admin.Catalog.Notification')); + } + + public static function displayHumanReadableSize($size) + { + return Tools::formatBytes($size); + } + + public function initPageHeaderToolbar() + { + if (empty($this->display)) { + $this->page_header_toolbar_btn['new_attachment'] = array( + 'href' => self::$currentIndex . '&addattachment&token=' . $this->token, + 'desc' => $this->trans('Add new file', array(), 'Admin.Catalog.Feature'), + 'icon' => 'process-icon-new', + ); + } + + parent::initPageHeaderToolbar(); + } + + public function renderView() + { + if (($obj = $this->loadObject(true)) && Validate::isLoadedObject($obj)) { + $link = $this->context->link->getPageLink('attachment', true, null, 'id_attachment=' . $obj->id); + Tools::redirectLink($link); + } + + return $this->displayWarning($this->trans('File not found', array(), 'Admin.Catalog.Notification')); + } + + public function renderForm() + { + if (($obj = $this->loadObject(true)) && Validate::isLoadedObject($obj)) { + /** @var Attachment $obj */ + $link = $this->context->link->getPageLink('attachment', true, null, 'id_attachment=' . $obj->id); + + if (file_exists(_PS_DOWNLOAD_DIR_ . $obj->file)) { + $size = round(filesize(_PS_DOWNLOAD_DIR_ . $obj->file) / 1024); + } + } + + $this->fields_form = array( + 'legend' => array( + 'title' => $this->trans('Add new file', array(), 'Admin.Catalog.Feature'), + 'icon' => 'icon-paper-clip', + ), + 'input' => array( + array( + 'type' => 'text', + 'label' => $this->trans('Filename', array(), 'Admin.Global'), + 'name' => 'name', + 'required' => true, + 'lang' => true, + 'col' => 4, + ), + array( + 'type' => 'textarea', + 'label' => $this->trans('Description', array(), 'Admin.Global'), + 'name' => 'description', + 'lang' => true, + 'col' => 6, + ), + array( + 'type' => 'file', + 'file' => isset($link) ? $link : null, + 'size' => isset($size) ? $size : null, + 'label' => $this->trans('File', array(), 'Admin.Global'), + 'name' => 'file', + 'required' => true, + 'col' => 6, + ), + ), + 'submit' => array( + 'title' => $this->trans('Save', array(), 'Admin.Actions'), + ), + ); + + return parent::renderForm(); + } + + public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false) + { + parent::getList((int) $id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop); + + if (count($this->_list)) { + $this->product_attachements = Attachment::getProductAttached((int) $id_lang, $this->_list); + + $list_product_list = array(); + foreach ($this->_list as $list) { + $product_list = ''; + + if (isset($this->product_attachements[$list['id_attachment']])) { + foreach ($this->product_attachements[$list['id_attachment']] as $product) { + $product_list .= $product . ', '; + } + + $product_list = rtrim($product_list, ', '); + } + + $list_product_list[$list['id_attachment']] = $product_list; + } + + // Assign array in list_action_delete.tpl + $this->tpl_delete_link_vars = array( + 'product_list' => $list_product_list, + 'product_attachements' => $this->product_attachements, + ); + } + } + + public function postProcess() + { + if (_PS_MODE_DEMO_) { + $this->errors[] = $this->trans('This functionality has been disabled.', array(), 'Admin.Notifications.Error'); + + return; + } + + if (Tools::isSubmit('submitAdd' . $this->table)) { + $id = (int) Tools::getValue('id_attachment'); + if ($id && $a = new Attachment($id)) { + $_POST['file'] = $a->file; + $_POST['mime'] = $a->mime; + } + if (!count($this->errors)) { + if (isset($_FILES['file']) && is_uploaded_file($_FILES['file']['tmp_name'])) { + if ($_FILES['file']['size'] > (Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024 * 1024)) { + $this->errors[] = $this->trans( + 'The file is too large. Maximum size allowed is: %1$d kB. The file you are trying to upload is %2$d kB.', + array( + '%1$d' => (Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024), + '%2$d' => number_format(($_FILES['file']['size'] / 1024), 2, '.', ''), + ), + 'Admin.Notifications.Error' + ); + } else { + do { + $uniqid = sha1(microtime()); + } while (file_exists(_PS_DOWNLOAD_DIR_ . $uniqid)); + if (!move_uploaded_file($_FILES['file']['tmp_name'], _PS_DOWNLOAD_DIR_ . $uniqid)) { + $this->errors[] = $this->trans('Failed to copy the file.', array(), 'Admin.Catalog.Notification'); + } + $_POST['file_name'] = $_FILES['file']['name']; + @unlink($_FILES['file']['tmp_name']); + if (!count($this->errors) && isset($a) && file_exists(_PS_DOWNLOAD_DIR_ . $a->file)) { + unlink(_PS_DOWNLOAD_DIR_ . $a->file); + } + $_POST['file'] = $uniqid; + $_POST['mime'] = $_FILES['file']['type']; + } + } elseif (array_key_exists('file', $_FILES) && (int) $_FILES['file']['error'] === 1) { + $max_upload = (int) ini_get('upload_max_filesize'); + $max_post = (int) ini_get('post_max_size'); + $upload_mb = min($max_upload, $max_post); + $this->errors[] = $this->trans( + 'The file %file% exceeds the size allowed by the server. The limit is set to %size% MB.', + array('%file%' => '' . $_FILES['file']['name'] . ' ', '%size%' => '' . $upload_mb . ''), + 'Admin.Catalog.Notification' + ); + } elseif (!isset($a) || (isset($a) && !file_exists(_PS_DOWNLOAD_DIR_ . $a->file))) { + $this->errors[] = $this->trans('Upload error. Please check your server configurations for the maximum upload size allowed.', array(), 'Admin.Catalog.Notification'); + } + } + $this->validateRules(); + } + $return = parent::postProcess(); + if (!$return && isset($uniqid) && file_exists(_PS_DOWNLOAD_DIR_ . $uniqid)) { + unlink(_PS_DOWNLOAD_DIR_ . $uniqid); + } + + return $return; + } +} diff --git a/controllers/admin/AdminAttributeGeneratorController.php b/controllers/admin/AdminAttributeGeneratorController.php new file mode 100644 index 0000000..1789a47 --- /dev/null +++ b/controllers/admin/AdminAttributeGeneratorController.php @@ -0,0 +1,274 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ +@ini_set('max_execution_time', 3600); + +/** + * @property Product $object + */ +class AdminAttributeGeneratorControllerCore extends AdminController +{ + protected $combinations = []; + + /** @var Product */ + protected $product; + + public function __construct() + { + $this->bootstrap = true; + $this->table = 'product_attribute'; + $this->className = 'Product'; + $this->multishop_context_group = false; + + parent::__construct(); + } + + public function setMedia($isNewTheme = false) + { + parent::setMedia($isNewTheme); + $this->addJS(_PS_JS_DIR_ . 'admin/attributes.js'); + } + + protected function addAttribute($attributes, $price = 0, $weight = 0) + { + foreach ($attributes as $attribute) { + $price += (float) preg_replace('/[^0-9.-]/', '', str_replace(',', '.', Tools::getValue('price_impact_' . (int) $attribute))); + $weight += (float) preg_replace('/[^0-9.]/', '', str_replace(',', '.', Tools::getValue('weight_impact_' . (int) $attribute))); + } + if ($this->product->id) { + return [ + 'id_product' => (int) $this->product->id, + 'price' => (float) $price, + 'weight' => (float) $weight, + 'ecotax' => 0, + 'quantity' => (int) Tools::getValue('quantity'), + 'reference' => pSQL($_POST['reference']), + 'default_on' => 0, + 'available_date' => '0000-00-00', + ]; + } + + return []; + } + + public static function createCombinations($list) + { + if (count($list) <= 1) { + return count($list) ? array_map(function ($v) { return [$v]; }, $list[0]) : $list; + } + $res = []; + $first = array_pop($list); + foreach ($first as $attribute) { + $tab = AdminAttributeGeneratorController::createCombinations($list); + foreach ($tab as $to_add) { + $res[] = is_array($to_add) ? array_merge($to_add, [$attribute]) : [$to_add, $attribute]; + } + } + + return $res; + } + + public function initProcess() + { + if (!defined('PS_MASS_PRODUCT_CREATION')) { + define('PS_MASS_PRODUCT_CREATION', true); + } + + if (Tools::isSubmit('generate')) { + if ($this->access('edit')) { + $this->action = 'generate'; + } else { + $this->errors[] = $this->trans('You do not have permission to add this.', [], 'Admin.Notifications.Error'); + } + } + parent::initProcess(); + } + + public function postProcess() + { + $this->product = new Product((int) Tools::getValue('id_product')); + $this->product->loadStockData(); + parent::postProcess(); + } + + public function processGenerate() + { + if (!is_array(Tools::getValue('options'))) { + $this->errors[] = $this->trans('Please select at least one attribute.', [], 'Admin.Catalog.Notification'); + } else { + $tab = array_values(Tools::getValue('options')); + if (count($tab) && Validate::isLoadedObject($this->product)) { + AdminAttributeGeneratorController::setAttributesImpacts($this->product->id, $tab); + $this->combinations = array_values(AdminAttributeGeneratorController::createCombinations($tab)); + $values = array_values(array_map([$this, 'addAttribute'], $this->combinations)); + + // @since 1.5.0 + if ($this->product->depends_on_stock == 0) { + $attributes = Product::getProductAttributesIds($this->product->id, true); + foreach ($attributes as $attribute) { + StockAvailable::removeProductFromStockAvailable($this->product->id, $attribute['id_product_attribute'], Context::getContext()->shop); + } + } + + SpecificPriceRule::disableAnyApplication(); + + $this->product->deleteProductAttributes(); + $this->product->generateMultipleCombinations($values, $this->combinations); + + // Reset cached default attribute for the product and get a new one + Product::getDefaultAttribute($this->product->id, 0, true); + Product::updateDefaultAttribute($this->product->id); + + // @since 1.5.0 + if ($this->product->depends_on_stock == 0) { + $attributes = Product::getProductAttributesIds($this->product->id, true); + $quantity = (int) Tools::getValue('quantity'); + foreach ($attributes as $attribute) { + if (Shop::getContext() == Shop::CONTEXT_ALL) { + $shops_list = Shop::getShops(); + if (is_array($shops_list)) { + foreach ($shops_list as $current_shop) { + if (isset($current_shop['id_shop']) && (int) $current_shop['id_shop'] > 0) { + StockAvailable::setQuantity($this->product->id, (int) $attribute['id_product_attribute'], $quantity, (int) $current_shop['id_shop']); + } + } + } + } else { + StockAvailable::setQuantity($this->product->id, (int) $attribute['id_product_attribute'], $quantity); + } + } + } else { + StockAvailable::synchronize($this->product->id); + } + + SpecificPriceRule::enableAnyApplication(); + SpecificPriceRule::applyAllRules([(int) $this->product->id]); + + Tools::redirectAdmin($this->context->link->getAdminLink('AdminProducts') . '&id_product=' . (int) Tools::getValue('id_product') . '&updateproduct&key_tab=Combinations&conf=4'); + } else { + $this->errors[] = $this->trans('Unable to initialize these parameters. A combination is missing or an object cannot be loaded.', [], 'Admin.Catalog.Notification'); + } + } + } + + protected static function setAttributesImpacts($id_product, $tab) + { + $attributes = []; + foreach ($tab as $group) { + foreach ($group as $attribute) { + $price = preg_replace('/[^0-9.]/', '', str_replace(',', '.', Tools::getValue('price_impact_' . (int) $attribute))); + $weight = preg_replace('/[^0-9.]/', '', str_replace(',', '.', Tools::getValue('weight_impact_' . (int) $attribute))); + $attributes[] = '(' . (int) $id_product . ', ' . (int) $attribute . ', ' . (float) $price . ', ' . (float) $weight . ')'; + } + } + + return Db::getInstance()->execute(' + INSERT INTO `' . _DB_PREFIX_ . 'attribute_impact` (`id_product`, `id_attribute`, `price`, `weight`) + VALUES ' . implode(',', $attributes) . ' + ON DUPLICATE KEY UPDATE `price` = VALUES(price), `weight` = VALUES(weight)'); + } + + public function initGroupTable() + { + $combinations_groups = $this->product->getAttributesGroups($this->context->language->id); + $attributes = []; + $impacts = Product::getAttributesImpacts($this->product->id); + foreach ($combinations_groups as $combination) { + if (isset($impacts[$combination['id_attribute']])) { + $combination['price'] = $impacts[$combination['id_attribute']]['price']; + $combination['weight'] = $impacts[$combination['id_attribute']]['weight']; + } + + $attributes[$combination['id_attribute_group']][$combination['id_attribute']] = $combination; + } + + $this->context->smarty->assign([ + 'currency_sign' => $this->context->currency->sign, + 'weight_unit' => Configuration::get('PS_WEIGHT_UNIT'), + 'attributes' => $attributes, + ]); + } + + public function initPageHeaderToolbar() + { + parent::initPageHeaderToolbar(); + + $this->page_header_toolbar_title = $this->trans('Attributes generator', [], 'Admin.Catalog.Feature'); + $this->page_header_toolbar_btn['back'] = [ + 'href' => $this->context->link->getAdminLink('AdminProducts') . '&id_product=' . (int) Tools::getValue('id_product') . '&updateproduct&key_tab=Combinations', + 'desc' => $this->trans('Back to the product', [], 'Admin.Catalog.Feature'), + ]; + } + + public function initBreadcrumbs($tab_id = null, $tabs = null) + { + $this->display = 'generator'; + + return parent::initBreadcrumbs(); + } + + public function initContent() + { + if (!Combination::isFeatureActive()) { + $adminPerformanceUrl = $this->context->link->getAdminLink('AdminPerformance'); + + $url = '' . + $this->trans('Performance', [], 'Admin.Global') . ''; + $this->displayWarning($this->trans('This feature has been disabled. You can activate it here: %link%.', ['%link%' => $url], 'Admin.Catalog.Notification')); + + return; + } + + // Init toolbar + $this->initPageHeaderToolbar(); + $this->initGroupTable(); + + $attributes = Attribute::getAttributes(Context::getContext()->language->id, true); + $attribute_js = []; + + foreach ($attributes as $k => $attribute) { + $attribute_js[$attribute['id_attribute_group']][$attribute['id_attribute']] = $attribute['name']; + } + + $attribute_groups = AttributeGroup::getAttributesGroups($this->context->language->id); + $this->product = new Product((int) Tools::getValue('id_product')); + + $this->context->smarty->assign([ + 'tax_rates' => $this->product->getTaxesRate(), + 'generate' => isset($_POST['generate']) && !count($this->errors), + 'combinations_size' => count($this->combinations), + 'product_name' => $this->product->name[$this->context->language->id], + 'product_reference' => $this->product->reference, + 'url_generator' => self::$currentIndex . '&id_product=' . (int) Tools::getValue('id_product') . '&attributegenerator&token=' . Tools::getValue('token'), + 'attribute_groups' => $attribute_groups, + 'attribute_js' => $attribute_js, + 'toolbar_btn' => $this->toolbar_btn, + 'toolbar_scroll' => true, + 'show_page_header_toolbar' => $this->show_page_header_toolbar, + 'page_header_toolbar_title' => $this->page_header_toolbar_title, + 'page_header_toolbar_btn' => $this->page_header_toolbar_btn, + ]); + } +} diff --git a/controllers/admin/AdminAttributesGroupsController.php b/controllers/admin/AdminAttributesGroupsController.php new file mode 100644 index 0000000..7864468 --- /dev/null +++ b/controllers/admin/AdminAttributesGroupsController.php @@ -0,0 +1,974 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property AttributeGroup $object + */ +class AdminAttributesGroupsControllerCore extends AdminController +{ + public $bootstrap = true; + protected $id_attribute; + protected $position_identifier = 'id_attribute_group'; + protected $attribute_name; + + public function __construct() + { + $this->bootstrap = true; + $this->table = 'attribute_group'; + $this->list_id = 'attribute_group'; + $this->identifier = 'id_attribute_group'; + $this->className = 'AttributeGroup'; + $this->lang = true; + $this->_defaultOrderBy = 'position'; + + parent::__construct(); + + $this->fields_list = [ + 'id_attribute_group' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'name' => [ + 'title' => $this->trans('Name', [], 'Admin.Global'), + 'filter_key' => 'b!name', + 'align' => 'left', + ], + 'count_values' => [ + 'title' => $this->trans('Values', [], 'Admin.Catalog.Feature'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + 'orderby' => false, + 'search' => false, + ], + 'position' => [ + 'title' => $this->trans('Position', [], 'Admin.Global'), + 'filter_key' => 'a!position', + 'position' => 'position', + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + ]; + + $this->bulk_actions = [ + 'delete' => [ + 'text' => $this->trans('Delete selected', [], 'Admin.Notifications.Info'), + 'icon' => 'icon-trash', + 'confirm' => $this->trans('Delete selected items?', [], 'Admin.Notifications.Info'), + ], + ]; + $this->fieldImageSettings = ['name' => 'texture', 'dir' => 'co']; + + $this->image_dir = 'co'; + } + + /** + * AdminController::renderList() override. + * + * @see AdminController::renderList() + */ + public function renderList() + { + $this->addRowAction('view'); + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + return parent::renderList(); + } + + public function renderView() + { + if (($id = (int) Tools::getValue('id_attribute_group'))) { + $this->table = 'attribute'; + $this->className = 'Attribute'; + $this->identifier = 'id_attribute'; + $this->position_identifier = 'id_attribute'; + $this->position_group_identifier = 'id_attribute_group'; + $this->list_id = 'attribute_values'; + $this->lang = true; + + $this->context->smarty->assign([ + 'current' => self::$currentIndex . '&id_attribute_group=' . (int) $id . '&viewattribute_group', + ]); + + if (!Validate::isLoadedObject($obj = new AttributeGroup((int) $id))) { + $this->errors[] = $this->trans('An error occurred while updating the status for an object.', [], 'Admin.Catalog.Notification') . + ' ' . $this->table . ' ' . + $this->trans('(cannot load object)', [], 'Admin.Catalog.Notification'); + + return; + } + + $this->attribute_name = $obj->name; + $this->fields_list = [ + 'id_attribute' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'name' => [ + 'title' => $this->trans('Value', [], 'Admin.Catalog.Feature'), + 'width' => 'auto', + 'filter_key' => 'b!name', + ], + ]; + + if ($obj->group_type == 'color') { + $this->fields_list['color'] = [ + 'title' => $this->trans('Color', [], 'Admin.Catalog.Feature'), + 'filter_key' => 'a!color', + ]; + } + + $this->fields_list['position'] = [ + 'title' => $this->trans('Position', [], 'Admin.Global'), + 'filter_key' => 'a!position', + 'position' => 'position', + 'class' => 'fixed-width-md', + ]; + + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + $this->_where = 'AND a.`id_attribute_group` = ' . (int) $id; + $this->_orderBy = 'position'; + + self::$currentIndex = self::$currentIndex . '&id_attribute_group=' . (int) $id . '&viewattribute_group'; + $this->processFilter(); + + return parent::renderList(); + } + } + + /** + * AdminController::renderForm() override. + * + * @see AdminController::renderForm() + */ + public function renderForm() + { + $this->table = 'attribute_group'; + $this->identifier = 'id_attribute_group'; + + $group_type = [ + [ + 'id' => 'select', + 'name' => $this->trans('Drop-down list', [], 'Admin.Global'), + ], + [ + 'id' => 'radio', + 'name' => $this->trans('Radio buttons', [], 'Admin.Global'), + ], + [ + 'id' => 'color', + 'name' => $this->trans('Color or texture', [], 'Admin.Catalog.Feature'), + ], + ]; + + $this->fields_form = [ + 'legend' => [ + 'title' => $this->trans('Attributes', [], 'Admin.Catalog.Feature'), + 'icon' => 'icon-info-sign', + ], + 'input' => [ + [ + 'type' => 'text', + 'label' => $this->trans('Name', [], 'Admin.Global'), + 'name' => 'name', + 'lang' => true, + 'required' => true, + 'col' => '4', + 'hint' => $this->trans('Your internal name for this attribute.', [], 'Admin.Catalog.Help') . ' ' . $this->trans('Invalid characters:', [], 'Admin.Notifications.Info') . ' <>;=#{}', + ], + [ + 'type' => 'text', + 'label' => $this->trans('Public name', [], 'Admin.Catalog.Feature'), + 'name' => 'public_name', + 'lang' => true, + 'required' => true, + 'col' => '4', + 'hint' => $this->trans('The public name for this attribute, displayed to the customers.', [], 'Admin.Catalog.Help') . ' ' . $this->trans('Invalid characters:', [], 'Admin.Notifications.Info') . ' <>;=#{}', + ], + [ + 'type' => 'select', + 'label' => $this->trans('Attribute type', [], 'Admin.Catalog.Feature'), + 'name' => 'group_type', + 'required' => true, + 'options' => [ + 'query' => $group_type, + 'id' => 'id', + 'name' => 'name', + ], + 'col' => '2', + 'hint' => $this->trans('The way the attribute\'s values will be presented to the customers in the product\'s page.', [], 'Admin.Catalog.Help'), + ], + ], + ]; + + if (Shop::isFeatureActive()) { + $this->fields_form['input'][] = [ + 'type' => 'shop', + 'label' => $this->trans('Shop association', [], 'Admin.Global'), + 'name' => 'checkBoxShopAsso', + ]; + } + + $this->fields_form['submit'] = [ + 'title' => $this->trans('Save', [], 'Admin.Actions'), + ]; + + if (!($obj = $this->loadObject(true))) { + return; + } + + return parent::renderForm(); + } + + public function renderFormAttributes() + { + $attributes_groups = AttributeGroup::getAttributesGroups($this->context->language->id); + + $this->table = 'attribute'; + $this->identifier = 'id_attribute'; + + $this->show_form_cancel_button = true; + $this->fields_form = [ + 'legend' => [ + 'title' => $this->trans('Values', [], 'Admin.Global'), + 'icon' => 'icon-info-sign', + ], + 'input' => [ + [ + 'type' => 'select', + 'label' => $this->trans('Attribute group', [], 'Admin.Catalog.Feature'), + 'name' => 'id_attribute_group', + 'required' => true, + 'options' => [ + 'query' => $attributes_groups, + 'id' => 'id_attribute_group', + 'name' => 'name', + ], + 'hint' => $this->trans('Choose the attribute group for this value.', [], 'Admin.Catalog.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Value', [], 'Admin.Global'), + 'name' => 'name', + 'lang' => true, + 'required' => true, + 'hint' => $this->trans('Invalid characters:', [], 'Admin.Notifications.Info') . ' <>;=#{}', + ], + ], + ]; + + if (Shop::isFeatureActive()) { + // We get all associated shops for all attribute groups, because we will disable group shops + // for attributes that the selected attribute group don't support + $sql = 'SELECT id_attribute_group, id_shop FROM ' . _DB_PREFIX_ . 'attribute_group_shop'; + $associations = []; + foreach (Db::getInstance()->executeS($sql) as $row) { + $associations[$row['id_attribute_group']][] = $row['id_shop']; + } + + $this->fields_form['input'][] = [ + 'type' => 'shop', + 'label' => $this->trans('Shop association', [], 'Admin.Global'), + 'name' => 'checkBoxShopAsso', + 'values' => Shop::getTree(), + ]; + } else { + $associations = []; + } + + $this->fields_form['shop_associations'] = json_encode($associations); + + $this->fields_form['input'][] = [ + 'type' => 'color', + 'label' => $this->trans('Color', [], 'Admin.Catalog.Feature'), + 'name' => 'color', + 'hint' => $this->trans('Choose a color with the color picker, or enter an HTML color (e.g. "lightblue", "#CC6600").', [], 'Admin.Catalog.Help'), + ]; + + $this->fields_form['input'][] = [ + 'type' => 'file', + 'label' => $this->trans('Texture', [], 'Admin.Catalog.Feature'), + 'name' => 'texture', + 'hint' => [ + $this->trans('Upload an image file containing the color texture from your computer.', [], 'Admin.Catalog.Help'), + $this->trans('This will override the HTML color!', [], 'Admin.Catalog.Help'), + ], + ]; + + $this->fields_form['input'][] = [ + 'type' => 'current_texture', + 'label' => $this->trans('Current texture', [], 'Admin.Catalog.Feature'), + 'name' => 'current_texture', + ]; + + $this->fields_form['input'][] = [ + 'type' => 'closediv', + 'name' => '', + ]; + + $this->fields_form['submit'] = [ + 'title' => $this->trans('Save', [], 'Admin.Actions'), + ]; + + $this->fields_form['buttons'] = [ + 'save-and-stay' => [ + 'title' => $this->trans('Save then add another value', [], 'Admin.Catalog.Feature'), + 'name' => 'submitAdd' . $this->table . 'AndStay', + 'type' => 'submit', + 'class' => 'btn btn-default pull-right', + 'icon' => 'process-icon-save', + ], + ]; + + $this->fields_value['id_attribute_group'] = (int) Tools::getValue('id_attribute_group'); + + // Override var of Controller + $this->table = 'attribute'; + $this->className = 'Attribute'; + $this->identifier = 'id_attribute'; + $this->lang = true; + $this->tpl_folder = 'attributes/'; + + // Create object Attribute + if (!$obj = new Attribute((int) Tools::getValue($this->identifier))) { + return; + } + + $str_attributes_groups = ''; + foreach ($attributes_groups as $attribute_group) { + $str_attributes_groups .= '"' . $attribute_group['id_attribute_group'] . '" : ' . ($attribute_group['group_type'] == 'color' ? '1' : '0') . ', '; + } + + $image = '../img/' . $this->fieldImageSettings['dir'] . '/' . (int) $obj->id . '.jpg'; + + $this->tpl_form_vars = [ + 'strAttributesGroups' => $str_attributes_groups, + 'colorAttributeProperties' => Validate::isLoadedObject($obj) && $obj->isColorAttribute(), + 'imageTextureExists' => file_exists(_PS_IMG_DIR_ . $this->fieldImageSettings['dir'] . '/' . (int) $obj->id . '.jpg'), + 'imageTexture' => $image, + 'imageTextureUrl' => Tools::safeOutput($_SERVER['REQUEST_URI']) . '&deleteImage=1', + ]; + + return parent::renderForm(); + } + + /** + * AdminController::init() override. + * + * @see AdminController::init() + */ + public function init() + { + if (Tools::isSubmit('updateattribute')) { + $this->display = 'editAttributes'; + } elseif (Tools::isSubmit('submitAddattribute')) { + $this->display = 'editAttributes'; + } elseif (Tools::isSubmit('submitAddattribute_group')) { + $this->display = 'add'; + } + + parent::init(); + } + + /** + * Override processAdd to change SaveAndStay button action. + * + * @see classes/AdminControllerCore::processUpdate() + */ + public function processAdd() + { + if ($this->table == 'attribute') { + /** @var AttributeGroup $object */ + $object = new $this->className(); + foreach (Language::getLanguages(false) as $language) { + if ($object->isAttribute( + (int) Tools::getValue('id_attribute_group'), + Tools::getValue('name_' . $language['id_lang']), + $language['id_lang'] + )) { + $this->errors['name_' . $language['id_lang']] = $this->trans( + 'The attribute value "%1$s" already exist for %2$s language', + [ + Tools::getValue('name_' . $language['id_lang']), + $language['name'], + ], + 'Admin.Catalog.Notification' + ); + } + } + + if (!empty($this->errors)) { + return $object; + } + } + + $object = parent::processAdd(); + + if (Tools::isSubmit('submitAdd' . $this->table . 'AndStay') && !count($this->errors)) { + if ($this->display == 'add') { + $this->redirect_after = self::$currentIndex . '&' . $this->identifier . '=&conf=3&update' . $this->table . '&token=' . $this->token; + } else { + $this->redirect_after = self::$currentIndex . '&id_attribute_group=' . (int) Tools::getValue('id_attribute_group') . '&conf=3&update' . $this->table . '&token=' . $this->token; + } + } + + if (count($this->errors)) { + $this->setTypeAttribute(); + } + + return $object; + } + + /** + * Override processUpdate to change SaveAndStay button action. + * + * @see classes/AdminControllerCore::processUpdate() + */ + public function processUpdate() + { + $object = parent::processUpdate(); + + if (Tools::isSubmit('submitAdd' . $this->table . 'AndStay') && !count($this->errors)) { + if ($this->display == 'add') { + $this->redirect_after = self::$currentIndex . '&' . $this->identifier . '=&conf=3&update' . $this->table . '&token=' . $this->token; + } else { + $this->redirect_after = self::$currentIndex . '&' . $this->identifier . '=&id_attribute_group=' . (int) Tools::getValue('id_attribute_group') . '&conf=3&update' . $this->table . '&token=' . $this->token; + } + } + + if (count($this->errors)) { + $this->setTypeAttribute(); + } + + if (Tools::isSubmit('updateattribute') || Tools::isSubmit('deleteattribute') || Tools::isSubmit('submitAddattribute') || Tools::isSubmit('submitBulkdeleteattribute')) { + Tools::clearColorListCache(); + } + + return $object; + } + + /** + * AdminController::initContent() override. + * + * @see AdminController::initContent() + */ + public function initContent() + { + if (Combination::isFeatureActive()) { + if ($this->display == 'edit' || $this->display == 'add') { + if (!($this->object = $this->loadObject(true))) { + return; + } + $this->content .= $this->renderForm(); + } elseif ($this->display == 'editAttributes') { + if (!$this->object = new Attribute((int) Tools::getValue('id_attribute'))) { + return; + } + + $this->content .= $this->renderFormAttributes(); + } elseif ($this->display != 'view' && !$this->ajax) { + $this->content .= $this->renderList(); + $this->content .= $this->renderOptions(); + /* reset all attributes filter */ + if (!Tools::getValue('submitFilterattribute_group', 0) && !Tools::getIsset('id_attribute_group')) { + $this->processResetFilters('attribute_values'); + } + } elseif ($this->display == 'view' && !$this->ajax) { + $this->content = $this->renderView(); + } + } else { + $adminPerformanceUrl = $this->context->link->getAdminLink('AdminPerformance'); + $url = '' . $this->trans('Performance', [], 'Admin.Global') . ''; + $this->displayWarning($this->trans('This feature has been disabled. You can activate it here: %link%.', ['%link%' => $url], 'Admin.Catalog.Notification')); + } + + $this->context->smarty->assign([ + 'table' => $this->table, + 'current' => self::$currentIndex, + 'token' => $this->token, + 'content' => $this->content, + ]); + } + + public function initPageHeaderToolbar() + { + if (Combination::isFeatureActive()) { + if (empty($this->display)) { + $this->page_header_toolbar_btn['new_attribute_group'] = [ + 'href' => self::$currentIndex . '&addattribute_group&token=' . $this->token, + 'desc' => $this->trans('Add new attribute', [], 'Admin.Catalog.Feature'), + 'icon' => 'process-icon-new', + ]; + $this->page_header_toolbar_btn['new_value'] = [ + 'href' => self::$currentIndex . '&updateattribute&id_attribute_group=' . (int) Tools::getValue('id_attribute_group') . '&token=' . $this->token, + 'desc' => $this->trans('Add new value', [], 'Admin.Catalog.Feature'), + 'icon' => 'process-icon-new', + ]; + } + } + + if ($this->display == 'view') { + $this->page_header_toolbar_btn['new_value'] = [ + 'href' => self::$currentIndex . '&updateattribute&id_attribute_group=' . (int) Tools::getValue('id_attribute_group') . '&token=' . $this->token, + 'desc' => $this->trans('Add new value', [], 'Admin.Catalog.Feature'), + 'icon' => 'process-icon-new', + ]; + } + + parent::initPageHeaderToolbar(); + } + + public function initToolbar() + { + switch ($this->display) { + // @todo defining default buttons + case 'add': + case 'edit': + case 'editAttributes': + // Default save button - action dynamically handled in javascript + $this->toolbar_btn['save'] = [ + 'href' => '#', + 'desc' => $this->trans('Save', [], 'Admin.Actions'), + ]; + + if ($this->display == 'editAttributes' && !$this->id_attribute) { + $this->toolbar_btn['save-and-stay'] = [ + 'short' => 'SaveAndStay', + 'href' => '#', + 'desc' => $this->trans('Save then add another value', [], 'Admin.Catalog.Help'), + 'force_desc' => true, + ]; + } + + $this->toolbar_btn['back'] = [ + 'href' => $this->context->link->getAdminLink('AdminAttributesGroups'), + 'desc' => $this->trans('Back to list', [], 'Admin.Actions'), + ]; + + break; + case 'view': + $this->toolbar_btn['newAttributes'] = [ + 'href' => $this->context->link->getAdminLink('AdminAttributesGroups', true, [], ['updateattribute' => 1, 'id_attribute_group' => (int) Tools::getValue('id_attribute_group')]), + 'desc' => $this->trans('Add New Values', [], 'Admin.Catalog.Feature'), + 'class' => 'toolbar-new', + ]; + + $this->toolbar_btn['back'] = [ + 'href' => $this->context->link->getAdminLink('AdminAttributesGroups'), + 'desc' => $this->trans('Back to list', [], 'Admin.Actions'), + ]; + + break; + default: // list + $this->toolbar_btn['new'] = [ + 'href' => $this->context->link->getAdminLink('AdminAttributesGroups', true, [], ['add' . $this->table => 1]), + 'desc' => $this->trans('Add New Attributes', [], 'Admin.Catalog.Feature'), + ]; + if ($this->can_import) { + $this->toolbar_btn['import'] = [ + 'href' => $this->context->link->getAdminLink('AdminImport', true, [], ['import_type' => 'combinations']), + 'desc' => $this->trans('Import', [], 'Admin.Actions'), + ]; + } + } + } + + public function initToolbarTitle() + { + $bread_extended = $this->breadcrumbs; + + switch ($this->display) { + case 'edit': + $bread_extended[] = $this->trans('Edit New Attribute', [], 'Admin.Catalog.Feature'); + + break; + + case 'add': + $bread_extended[] = $this->trans('Add New Attribute', [], 'Admin.Catalog.Feature'); + + break; + + case 'view': + if (Tools::getIsset('viewattribute_group')) { + if (($id = (int) Tools::getValue('id_attribute_group'))) { + if (Validate::isLoadedObject($obj = new AttributeGroup((int) $id))) { + $bread_extended[] = $obj->name[$this->context->employee->id_lang]; + } + } + } else { + $bread_extended[] = $this->attribute_name[$this->context->employee->id_lang]; + } + + break; + + case 'editAttributes': + if ($this->id_attribute) { + if (($id = (int) Tools::getValue('id_attribute_group'))) { + if (Validate::isLoadedObject($obj = new AttributeGroup((int) $id))) { + $bread_extended[] = '' . $obj->name[$this->context->employee->id_lang] . ''; + } + if (Validate::isLoadedObject($obj = new Attribute((int) $this->id_attribute))) { + $bread_extended[] = $this->trans( + 'Edit: %value%', + [ + '%value%' => $obj->name[$this->context->employee->id_lang], + ], + 'Admin.Catalog.Feature' + ); + } + } else { + $bread_extended[] = $this->trans('Edit Value', [], 'Admin.Catalog.Feature'); + } + } else { + $bread_extended[] = $this->trans('Add New Value', [], 'Admin.Catalog.Feature'); + } + + break; + } + + if (count($bread_extended) > 0) { + $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); + } + + $this->toolbar_title = $bread_extended; + } + + public function initProcess() + { + $this->setTypeAttribute(); + + if (Tools::getIsset('viewattribute_group')) { + $this->list_id = 'attribute_values'; + + if (isset($_POST['submitReset' . $this->list_id])) { + $this->processResetFilters(); + } + } else { + $this->list_id = 'attribute_group'; + } + + parent::initProcess(); + + if ($this->table == 'attribute') { + $this->display = 'editAttributes'; + $this->id_attribute = (int) Tools::getValue('id_attribute'); + } + } + + protected function setTypeAttribute() + { + if (Tools::isSubmit('updateattribute') || Tools::isSubmit('deleteattribute') || Tools::isSubmit('submitAddattribute') || Tools::isSubmit('submitBulkdeleteattribute')) { + $this->table = 'attribute'; + $this->className = 'Attribute'; + $this->identifier = 'id_attribute'; + + if ($this->display == 'edit') { + $this->display = 'editAttributes'; + } + } + } + + public function processPosition() + { + if (Tools::getIsset('viewattribute_group')) { + $object = new Attribute((int) Tools::getValue('id_attribute')); + self::$currentIndex = self::$currentIndex . '&viewattribute_group'; + } else { + $object = new AttributeGroup((int) Tools::getValue('id_attribute_group')); + } + + if (!Validate::isLoadedObject($object)) { + $this->errors[] = $this->trans('An error occurred while updating the status for an object.', [], 'Admin.Notifications.Error') . + ' ' . $this->table . ' ' . $this->trans('(cannot load object)', [], 'Admin.Notifications.Error'); + } elseif (!$object->updatePosition((int) Tools::getValue('way'), (int) Tools::getValue('position'))) { + $this->errors[] = $this->trans('Failed to update the position.', [], 'Admin.Notifications.Error'); + } else { + $id_identifier_str = ($id_identifier = (int) Tools::getValue($this->identifier)) ? '&' . $this->identifier . '=' . $id_identifier : ''; + $redirect = self::$currentIndex . '&' . $this->table . 'Orderby=position&' . $this->table . 'Orderway=asc&conf=5' . $id_identifier_str . '&token=' . $this->token; + $this->redirect_after = $redirect; + } + + return $object; + } + + /** + * Call the right method for creating or updating object. + * + * @return mixed + */ + public function processSave() + { + if ($this->display == 'add' || $this->display == 'edit') { + $this->identifier = 'id_attribute_group'; + } + + if (!$this->id_object) { + return $this->processAdd(); + } else { + return $this->processUpdate(); + } + } + + public function postProcess() + { + if (!Combination::isFeatureActive()) { + return; + } + + if (!Tools::getValue($this->identifier) && (int) Tools::getValue('id_attribute') && !Tools::getValue('attributeOrderby')) { + // Override var of Controller + $this->table = 'attribute'; + $this->className = 'Attribute'; + $this->identifier = 'id_attribute'; + } + + /* set location with current index */ + if (Tools::getIsset('id_attribute_group') && Tools::getIsset('viewattribute_group')) { + self::$currentIndex = self::$currentIndex . '&id_attribute_group=' . (int) Tools::getValue('id_attribute_group', 0) . '&viewattribute_group'; + } + + // If it's an attribute, load object Attribute() + if (Tools::getValue('updateattribute') || Tools::isSubmit('deleteattribute') || Tools::isSubmit('submitAddattribute')) { + if (true !== $this->access('edit')) { + $this->errors[] = $this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error'); + + return; + } elseif (!$object = new Attribute((int) Tools::getValue($this->identifier))) { + $this->errors[] = $this->trans('An error occurred while updating the status for an object.', [], 'Admin.Notifications.Error') . + ' ' . $this->table . ' ' . + $this->trans('(cannot load object)', [], 'Admin.Notifications.Error'); + + return; + } + + if (Tools::getValue('position') !== false && Tools::getValue('id_attribute')) { + $_POST['id_attribute_group'] = $object->id_attribute_group; + if (!$object->updatePosition((int) Tools::getValue('way'), (int) Tools::getValue('position'))) { + $this->errors[] = $this->trans('Failed to update the position.', [], 'Admin.Notifications.Error'); + } else { + Tools::redirectAdmin(self::$currentIndex . '&conf=5&token=' . Tools::getAdminTokenLite('AdminAttributesGroups') . '#details_details_' . $object->id_attribute_group); + } + } elseif (Tools::isSubmit('deleteattribute') && Tools::getValue('id_attribute')) { + if (!$object->delete()) { + $this->errors[] = $this->trans('Failed to delete the attribute.', [], 'Admin.Catalog.Notification'); + } else { + Tools::redirectAdmin(self::$currentIndex . '&conf=1&token=' . Tools::getAdminTokenLite('AdminAttributesGroups')); + } + } elseif (Tools::isSubmit('submitAddattribute')) { + Hook::exec('actionObjectAttributeAddBefore'); + $this->action = 'save'; + $id_attribute = (int) Tools::getValue('id_attribute'); + // Adding last position to the attribute if not exist + if ($id_attribute <= 0) { + $sql = 'SELECT `position`+1 + FROM `' . _DB_PREFIX_ . 'attribute` + WHERE `id_attribute_group` = ' . (int) Tools::getValue('id_attribute_group') . ' + ORDER BY position DESC'; + // set the position of the new group attribute in $_POST for postProcess() method + $_POST['position'] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + $_POST['id_parent'] = 0; + $this->processSave($this->token); + } + } else { + if (Tools::isSubmit('submitBulkdelete' . $this->table)) { + if ($this->access('delete')) { + if (isset($_POST[$this->list_id . 'Box'])) { + /** @var AttributeGroup $object */ + $object = new $this->className(); + if ($object->deleteSelection($_POST[$this->list_id . 'Box'])) { + AttributeGroup::cleanPositions(); + Tools::redirectAdmin(self::$currentIndex . '&conf=2' . '&token=' . $this->token); + } + $this->errors[] = $this->trans('An error occurred while deleting this selection.', [], 'Admin.Notifications.Error'); + } else { + $this->errors[] = $this->trans('You must select at least one element to delete.', [], 'Admin.Notifications.Error'); + } + } else { + $this->errors[] = $this->trans('You do not have permission to delete this.', [], 'Admin.Notifications.Error'); + } + // clean position after delete + AttributeGroup::cleanPositions(); + } elseif (Tools::isSubmit('submitAdd' . $this->table)) { + Hook::exec('actionObjectAttributeGroupAddBefore'); + $id_attribute_group = (int) Tools::getValue('id_attribute_group'); + // Adding last position to the attribute if not exist + if ($id_attribute_group <= 0) { + $sql = 'SELECT `position`+1 + FROM `' . _DB_PREFIX_ . 'attribute_group` + ORDER BY position DESC'; + // set the position of the new group attribute in $_POST for postProcess() method + $_POST['position'] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + // clean \n\r characters + foreach ($_POST as $key => $value) { + if (preg_match('/^name_/Ui', $key)) { + $_POST[$key] = str_replace('\n', '', str_replace('\r', '', $value)); + } + } + parent::postProcess(); + } else { + parent::postProcess(); + if (Tools::isSubmit('delete' . $this->table)) { + AttributeGroup::cleanPositions(); + } + } + } + } + + /** + * AdminController::getList() override. + * + * @see AdminController::getList() + * + * @param int $id_lang + * @param string|null $order_by + * @param string|null $order_way + * @param int $start + * @param int|null $limit + * @param int|bool $id_lang_shop + * + * @throws PrestaShopException + */ + public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false) + { + parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop); + + if ($this->display == 'view') { + foreach ($this->_list as &$list) { + if (file_exists(_PS_IMG_DIR_ . $this->fieldImageSettings['dir'] . '/' . (int) $list['id_attribute'] . '.jpg')) { + if (!isset($list['color']) || !is_array($list['color'])) { + $list['color'] = []; + } + $list['color']['texture'] = '../img/' . $this->fieldImageSettings['dir'] . '/' . (int) $list['id_attribute'] . '.jpg'; + } + } + } else { + $nb_items = count($this->_list); + for ($i = 0; $i < $nb_items; ++$i) { + $item = &$this->_list[$i]; + + $query = new DbQuery(); + $query->select('COUNT(a.id_attribute) as count_values'); + $query->from('attribute', 'a'); + $query->join(Shop::addSqlAssociation('attribute', 'a')); + $query->where('a.id_attribute_group =' . (int) $item['id_attribute_group']); + $query->groupBy('attribute_shop.id_shop'); + $query->orderBy('count_values DESC'); + $item['count_values'] = (int) Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query); + unset($query); + } + } + } + + /** + * Overrides parent to delete items from sublist. + * + * @return mixed + */ + public function processBulkDelete() + { + // If we are deleting attributes instead of attribute_groups + if (Tools::getIsset('attributeBox')) { + $this->className = 'Attribute'; + $this->table = 'attribute'; + $this->boxes = Tools::getValue($this->table . 'Box'); + } + + $result = parent::processBulkDelete(); + // Restore vars + $this->className = 'AttributeGroup'; + $this->table = 'attribute_group'; + + return $result; + } + + /* Modify group attribute position */ + public function ajaxProcessUpdateGroupsPositions() + { + $way = (int) Tools::getValue('way'); + $id_attribute_group = (int) Tools::getValue('id_attribute_group'); + $positions = Tools::getValue('attribute_group'); + + $new_positions = []; + foreach ($positions as $v) { + if (count(explode('_', $v)) == 4) { + $new_positions[] = $v; + } + } + + foreach ($new_positions as $position => $value) { + $pos = explode('_', $value); + + if (isset($pos[2]) && (int) $pos[2] === $id_attribute_group) { + if ($group_attribute = new AttributeGroup((int) $pos[2])) { + if (isset($position) && $group_attribute->updatePosition($way, $position)) { + echo 'ok position ' . (int) $position . ' for attribute group ' . (int) $pos[2] . '\r\n'; + } else { + echo '{"hasError" : true, "errors" : "Can not update the ' . (int) $id_attribute_group . ' attribute group to position ' . (int) $position . ' "}'; + } + } else { + echo '{"hasError" : true, "errors" : "The (' . (int) $id_attribute_group . ') attribute group cannot be loaded."}'; + } + + break; + } + } + } + + /* Modify attribute position */ + public function ajaxProcessUpdateAttributesPositions() + { + $way = (int) Tools::getValue('way'); + $id_attribute = (int) Tools::getValue('id_attribute'); + $id_attribute_group = (int) Tools::getValue('id_attribute_group'); + $positions = Tools::getValue('attribute'); + + if (is_array($positions)) { + foreach ($positions as $position => $value) { + $pos = explode('_', $value); + + if ((isset($pos[1], $pos[2])) && (int) $pos[2] === $id_attribute) { + if ($attribute = new Attribute((int) $pos[2])) { + if (isset($position) && $attribute->updatePosition($way, $position)) { + echo 'ok position ' . (int) $position . ' for attribute ' . (int) $pos[2] . '\r\n'; + } else { + echo '{"hasError" : true, "errors" : "Can not update the ' . (int) $id_attribute . ' attribute to position ' . (int) $position . ' "}'; + } + } else { + echo '{"hasError" : true, "errors" : "The (' . (int) $id_attribute . ') attribute cannot be loaded"}'; + } + + break; + } + } + } + } +} diff --git a/controllers/admin/AdminCarrierWizardController.php b/controllers/admin/AdminCarrierWizardController.php new file mode 100644 index 0000000..e0d0545 --- /dev/null +++ b/controllers/admin/AdminCarrierWizardController.php @@ -0,0 +1,960 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property Carrier $object + */ +class AdminCarrierWizardControllerCore extends AdminController +{ + protected $wizard_access; + + public function __construct() + { + $this->bootstrap = true; + $this->display = 'view'; + $this->table = 'carrier'; + $this->identifier = 'id_carrier'; + $this->className = 'Carrier'; + $this->lang = false; + $this->deleted = true; + $this->step_number = 0; + $this->type_context = Shop::getContext(); + $this->old_context = Context::getContext(); + $this->multishop_context = Shop::CONTEXT_ALL; + $this->context = Context::getContext(); + + $this->fieldImageSettings = [ + 'name' => 'logo', + 'dir' => 's', + ]; + + parent::__construct(); + + $this->tabAccess = Profile::getProfileAccess($this->context->employee->id_profile, Tab::getIdFromClassName('AdminCarriers')); + } + + public function setMedia($isNewTheme = false) + { + parent::setMedia($isNewTheme); + $this->addJqueryPlugin('smartWizard'); + $this->addJqueryPlugin('typewatch'); + $this->addJs(_PS_JS_DIR_ . 'admin/carrier_wizard.js'); + } + + public function initWizard() + { + $this->wizard_steps = [ + 'name' => 'carrier_wizard', + 'steps' => [ + [ + 'title' => $this->trans('General settings', [], 'Admin.Shipping.Feature'), + ], + [ + 'title' => $this->trans('Shipping locations and costs', [], 'Admin.Shipping.Feature'), + ], + [ + 'title' => $this->trans('Size, weight, and group access', [], 'Admin.Shipping.Feature'), + ], + [ + 'title' => $this->trans('Summary', [], 'Admin.Global'), + ], ], + ]; + + if (Shop::isFeatureActive()) { + $multistore_step = [ + [ + 'title' => $this->trans('MultiStore', [], 'Admin.Global'), + ], + ]; + array_splice($this->wizard_steps['steps'], 1, 0, $multistore_step); + } + } + + public function renderView() + { + $this->initWizard(); + + if (Tools::getValue('id_carrier') && $this->access('edit')) { + $carrier = $this->loadObject(); + } elseif ($this->access('add')) { + $carrier = new Carrier(); + } + + if ((!$this->access('edit') && Tools::getValue('id_carrier')) || (!$this->access('add') && !Tools::getValue('id_carrier'))) { + $this->errors[] = $this->trans('You do not have permission to use this wizard.', [], 'Admin.Shipping.Notification'); + + return; + } + + $currency = $this->getActualCurrency(); + + $this->tpl_view_vars = [ + 'currency_sign' => $currency->sign, + 'PS_WEIGHT_UNIT' => Configuration::get('PS_WEIGHT_UNIT'), + 'enableAllSteps' => Validate::isLoadedObject($carrier), + 'wizard_steps' => $this->wizard_steps, + 'validate_url' => $this->context->link->getAdminLink('AdminCarrierWizard'), + 'carrierlist_url' => $this->context->link->getAdminLink('AdminCarriers') . '&conf=' . ((int) Validate::isLoadedObject($carrier) ? 4 : 3), + 'multistore_enable' => Shop::isFeatureActive(), + 'wizard_contents' => [ + 'contents' => [ + 0 => $this->renderStepOne($carrier), + 1 => $this->renderStepThree($carrier), + 2 => $this->renderStepFour($carrier), + 3 => $this->renderStepFive($carrier), + ], + ], + 'labels' => [ + 'next' => $this->trans('Next', [], 'Admin.Global'), + 'previous' => $this->trans('Previous', [], 'Admin.Global'), + 'finish' => $this->trans('Finish', [], 'Admin.Actions'), ], + ]; + + if (Shop::isFeatureActive()) { + array_splice($this->tpl_view_vars['wizard_contents']['contents'], 1, 0, [0 => $this->renderStepTwo($carrier)]); + } + + $this->context->smarty->assign([ + 'carrier_logo' => (Validate::isLoadedObject($carrier) && file_exists(_PS_SHIP_IMG_DIR_ . $carrier->id . '.jpg') ? _THEME_SHIP_DIR_ . $carrier->id . '.jpg' : false), + ]); + + $this->context->smarty->assign([ + 'logo_content' => $this->createTemplate('logo.tpl')->fetch(), + ]); + + $this->addjQueryPlugin(['ajaxfileupload']); + + return parent::renderView(); + } + + public function initBreadcrumbs($tab_id = null, $tabs = null) + { + if (Tools::getValue('id_carrier')) { + $this->display = 'edit'; + } else { + $this->display = 'add'; + } + + parent::initBreadcrumbs((int) Tab::getIdFromClassName('AdminCarriers')); + + $this->display = 'view'; + } + + public function initPageHeaderToolbar() + { + parent::initPageHeaderToolbar(); + + $this->page_header_toolbar_btn['cancel'] = [ + 'href' => $this->context->link->getAdminLink('AdminCarriers'), + 'desc' => $this->trans('Cancel', [], 'Admin.Actions'), + ]; + } + + public function renderStepOne($carrier) + { + $this->fields_form = [ + 'form' => [ + 'id_form' => 'step_carrier_general', + 'input' => [ + [ + 'type' => 'text', + 'label' => $this->trans('Carrier name', [], 'Admin.Shipping.Feature'), + 'name' => 'name', + 'required' => true, + 'hint' => [ + $this->trans('Allowed characters: letters, spaces and "%special_chars%".', ['%special_chars%' => '().-'], 'Admin.Shipping.Help'), + $this->trans('The carrier\'s name will be displayed during checkout.', [], 'Admin.Shipping.Help'), + $this->trans('For in-store pickup, enter 0 to replace the carrier name with your shop name.', [], 'Admin.Shipping.Help'), + ], + ], + [ + 'type' => 'text', + 'label' => $this->trans('Transit time', [], 'Admin.Shipping.Feature'), + 'name' => 'delay', + 'lang' => true, + 'required' => true, + 'maxlength' => 512, + 'hint' => $this->trans('The delivery time will be displayed during checkout.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Speed grade', [], 'Admin.Shipping.Feature'), + 'name' => 'grade', + 'required' => false, + 'size' => 1, + 'hint' => $this->trans('Enter "0" for a longest shipping delay, or "9" for the shortest shipping delay.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'logo', + 'label' => $this->trans('Logo', [], 'Admin.Global'), + 'name' => 'logo', + ], + [ + 'type' => 'text', + 'label' => $this->trans('Tracking URL', [], 'Admin.Shipping.Feature'), + 'name' => 'url', + 'hint' => $this->trans('Delivery tracking URL: Type \'@\' where the tracking number should appear. It will be automatically replaced by the tracking number.', [], 'Admin.Shipping.Help'), + 'desc' => $this->trans('For example: \'http://example.com/track.php?num=@\' with \'@\' where the tracking number should appear.', [], 'Admin.Shipping.Help'), + ], + ], + ], + ]; + + $tpl_vars = ['max_image_size' => (int) Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE') / 1024 / 1024]; + $fields_value = $this->getStepOneFieldsValues($carrier); + + return $this->renderGenericForm(['form' => $this->fields_form], $fields_value, $tpl_vars); + } + + public function renderStepTwo($carrier) + { + $this->fields_form = [ + 'form' => [ + 'id_form' => 'step_carrier_shops', + 'force' => true, + 'input' => [ + [ + 'type' => 'shop', + 'label' => $this->trans('Shop association', [], 'Admin.Global'), + 'name' => 'checkBoxShopAsso', + ], + ], + ], + ]; + $fields_value = $this->getStepTwoFieldsValues($carrier); + + return $this->renderGenericForm(['form' => $this->fields_form], $fields_value); + } + + public function renderStepThree($carrier) + { + $this->fields_form = [ + 'form' => [ + 'id_form' => 'step_carrier_ranges', + 'input' => [ + 'shipping_handling' => [ + 'type' => 'switch', + 'label' => $this->trans('Add handling costs', [], 'Admin.Shipping.Feature'), + 'name' => 'shipping_handling', + 'required' => false, + 'class' => 't', + 'is_bool' => true, + 'values' => [ + [ + 'id' => 'shipping_handling_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'shipping_handling_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + 'hint' => $this->trans('Include the handling costs (as set in Shipping > Preferences) in the final carrier price.', [], 'Admin.Shipping.Help'), + ], + 'is_free' => [ + 'type' => 'switch', + 'label' => $this->trans('Free shipping', [], 'Admin.Shipping.Feature'), + 'name' => 'is_free', + 'required' => false, + 'class' => 't', + 'values' => [ + [ + 'id' => 'is_free_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'is_free_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + ], + 'shipping_method' => [ + 'type' => 'radio', + 'label' => $this->trans('Billing', [], 'Admin.Shipping.Feature'), + 'name' => 'shipping_method', + 'required' => false, + 'class' => 't', + 'br' => true, + 'values' => [ + [ + 'id' => 'billing_price', + 'value' => Carrier::SHIPPING_METHOD_PRICE, + 'label' => $this->trans('According to total price.', [], 'Admin.Shipping.Feature'), + ], + [ + 'id' => 'billing_weight', + 'value' => Carrier::SHIPPING_METHOD_WEIGHT, + 'label' => $this->trans('According to total weight.', [], 'Admin.Shipping.Feature'), + ], + ], + ], + 'id_tax_rules_group' => [ + 'type' => 'select', + 'label' => $this->trans('Tax', [], 'Admin.Global'), + 'name' => 'id_tax_rules_group', + 'options' => [ + 'query' => TaxRulesGroup::getTaxRulesGroups(true), + 'id' => 'id_tax_rules_group', + 'name' => 'name', + 'default' => [ + 'label' => $this->trans('No tax', [], 'Admin.Global'), + 'value' => 0, + ], + ], + ], + 'range_behavior' => [ + 'type' => 'select', + 'label' => $this->trans('Out-of-range behavior', [], 'Admin.Shipping.Feature'), + 'name' => 'range_behavior', + 'options' => [ + 'query' => [ + [ + 'id' => 0, + 'name' => $this->trans('Apply the cost of the highest defined range', [], 'Admin.Shipping.Feature'), + ], + [ + 'id' => 1, + 'name' => $this->trans('Disable carrier', [], 'Admin.Shipping.Feature'), + ], + ], + 'id' => 'id', + 'name' => 'name', + ], + 'hint' => $this->trans('Out-of-range behavior occurs when no defined range matches the customer\'s cart (e.g. when the weight of the cart is greater than the highest weight limit defined by the weight ranges).', [], 'Admin.Shipping.Help'), + ], + 'zones' => [ + 'type' => 'zone', + 'name' => 'zones', + ], + ], + ], + ]; + + if (Configuration::get('PS_ATCP_SHIPWRAP')) { + unset($this->fields_form['form']['input']['id_tax_rules_group']); + } + + $tpl_vars = []; + $tpl_vars['PS_WEIGHT_UNIT'] = Configuration::get('PS_WEIGHT_UNIT'); + + $currency = $this->getActualCurrency(); + + $tpl_vars['currency_sign'] = $currency->sign; + + $fields_value = $this->getStepThreeFieldsValues($carrier); + + $this->getTplRangesVarsAndValues($carrier, $tpl_vars, $fields_value); + + return $this->renderGenericForm(['form' => $this->fields_form], $fields_value, $tpl_vars); + } + + /** + * @param Carrier $carrier + * + * @return string + */ + public function renderStepFour($carrier) + { + $this->fields_form = [ + 'form' => [ + 'id_form' => 'step_carrier_conf', + 'input' => [ + [ + 'type' => 'text', + 'label' => $this->trans('Maximum package width (%s)', ['%s' => Configuration::get('PS_DIMENSION_UNIT')], 'Admin.Shipping.Feature'), + 'name' => 'max_width', + 'required' => false, + 'hint' => $this->trans('Maximum width managed by this carrier. Set the value to "0", or leave this field blank to ignore.', [], 'Admin.Shipping.Help') . ' ' . $this->trans('The value must be an integer.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Maximum package height (%s)', ['%s' => Configuration::get('PS_DIMENSION_UNIT')], 'Admin.Shipping.Feature'), + 'name' => 'max_height', + 'required' => false, + 'hint' => $this->trans('Maximum height managed by this carrier. Set the value to "0", or leave this field blank to ignore.', [], 'Admin.Shipping.Help') . ' ' . $this->trans('The value must be an integer.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Maximum package depth (%s)', ['%s' => Configuration::get('PS_DIMENSION_UNIT')], 'Admin.Shipping.Feature'), + 'name' => 'max_depth', + 'required' => false, + 'hint' => $this->trans('Maximum depth managed by this carrier. Set the value to "0", or leave this field blank to ignore.', [], 'Admin.Shipping.Help') . ' ' . $this->trans('The value must be an integer.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Maximum package weight (%s)', ['%s' => Configuration::get('PS_WEIGHT_UNIT')], 'Admin.Shipping.Feature'), + 'name' => 'max_weight', + 'required' => false, + 'hint' => $this->trans('Maximum weight managed by this carrier. Set the value to "0", or leave this field blank to ignore.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'group', + 'label' => $this->trans('Group access', [], 'Admin.Shipping.Feature'), + 'name' => 'groupBox', + 'values' => Group::getGroups(Context::getContext()->language->id), + 'hint' => $this->trans('Mark the groups that are allowed access to this carrier.', [], 'Admin.Shipping.Help'), + ], + ], + ], + ]; + + $fields_value = $this->getStepFourFieldsValues($carrier); + + // Added values of object Group + $carrier_groups = $carrier->getGroups(); + $carrier_groups_ids = []; + if (is_array($carrier_groups)) { + foreach ($carrier_groups as $carrier_group) { + $carrier_groups_ids[] = $carrier_group['id_group']; + } + } + + $groups = Group::getGroups($this->context->language->id); + + foreach ($groups as $group) { + $fields_value['groupBox_' . $group['id_group']] = Tools::getValue('groupBox_' . $group['id_group'], (in_array($group['id_group'], $carrier_groups_ids) || empty($carrier_groups_ids) && !$carrier->id)); + } + + return $this->renderGenericForm(['form' => $this->fields_form], $fields_value); + } + + public function renderStepFive($carrier) + { + $this->fields_form = [ + 'form' => [ + 'id_form' => 'step_carrier_summary', + 'input' => [ + [ + 'type' => 'switch', + 'label' => $this->trans('Enabled', [], 'Admin.Global'), + 'name' => 'active', + 'required' => false, + 'class' => 't', + 'is_bool' => true, + 'values' => [ + [ + 'id' => 'active_on', + 'value' => 1, + ], + [ + 'id' => 'active_off', + 'value' => 0, + ], + ], + 'hint' => $this->trans('Enable the carrier in the front office.', [], 'Admin.Shipping.Help'), + ], + ], + ], + ]; + $template = $this->createTemplate('controllers/carrier_wizard/summary.tpl'); + $fields_value = $this->getStepFiveFieldsValues($carrier); + $active_form = $this->renderGenericForm(['form' => $this->fields_form], $fields_value); + $active_form = str_replace(['
', '
'], '', $active_form); + $template->assign('active_form', $active_form); + + return $template->fetch(); + } + + /** + * @param Carrier $carrier + * @param array $tpl_vars + * @param array $fields_value + */ + protected function getTplRangesVarsAndValues($carrier, &$tpl_vars, &$fields_value) + { + $tpl_vars['zones'] = Zone::getZones(false, true); + $carrier_zones = $carrier->getZones(); + $carrier_zones_ids = []; + if (is_array($carrier_zones)) { + foreach ($carrier_zones as $carrier_zone) { + $carrier_zones_ids[] = $carrier_zone['id_zone']; + } + } + + $range_table = $carrier->getRangeTable(); + $shipping_method = $carrier->getShippingMethod(); + + $zones = Zone::getZones(false); + foreach ($zones as $zone) { + $fields_value['zones'][$zone['id_zone']] = Tools::getValue('zone_' . $zone['id_zone'], (in_array($zone['id_zone'], $carrier_zones_ids))); + } + + if ($shipping_method == Carrier::SHIPPING_METHOD_FREE) { + $range_obj = $carrier->getRangeObject($carrier->shipping_method); + $price_by_range = []; + } else { + $range_obj = $carrier->getRangeObject(); + $price_by_range = Carrier::getDeliveryPriceByRanges($range_table, (int) $carrier->id); + } + + foreach ($price_by_range as $price) { + $tpl_vars['price_by_range'][$price['id_' . $range_table]][$price['id_zone']] = $price['price']; + } + + $tmp_range = $range_obj->getRanges((int) $carrier->id); + $tpl_vars['ranges'] = []; + if ($shipping_method != Carrier::SHIPPING_METHOD_FREE) { + foreach ($tmp_range as $id => $range) { + $tpl_vars['ranges'][$range['id_' . $range_table]] = $range; + $tpl_vars['ranges'][$range['id_' . $range_table]]['id_range'] = $range['id_' . $range_table]; + } + } + + // init blank range + if (!count($tpl_vars['ranges'])) { + $tpl_vars['ranges'][] = ['id_range' => 0, 'delimiter1' => 0, 'delimiter2' => 0]; + } + } + + public function renderGenericForm($fields_form, $fields_value, $tpl_vars = []) + { + $helper = new HelperForm(); + $helper->show_toolbar = false; + $helper->table = $this->table; + $lang = new Language((int) Configuration::get('PS_LANG_DEFAULT')); + $helper->default_form_language = $lang->id; + $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; + $this->fields_form = []; + $helper->id = (int) Tools::getValue('id_carrier'); + $helper->identifier = $this->identifier; + $helper->tpl_vars = array_merge([ + 'fields_value' => $fields_value, + 'languages' => $this->getLanguages(), + 'id_language' => $this->context->language->id, + ], $tpl_vars); + $helper->override_folder = 'carrier_wizard/'; + + return $helper->generateForm($fields_form); + } + + public function getStepOneFieldsValues($carrier) + { + return [ + 'id_carrier' => $this->getFieldValue($carrier, 'id_carrier'), + 'name' => $this->getFieldValue($carrier, 'name'), + 'delay' => $this->getFieldValue($carrier, 'delay'), + 'grade' => $this->getFieldValue($carrier, 'grade'), + 'url' => $this->getFieldValue($carrier, 'url'), + ]; + } + + public function getStepTwoFieldsValues($carrier) + { + return ['shop' => $this->getFieldValue($carrier, 'shop')]; + } + + public function getStepThreeFieldsValues($carrier) + { + $id_tax_rules_group = (is_object($this->object) && !$this->object->id) ? Carrier::getIdTaxRulesGroupMostUsed() : Carrier::getIdTaxRulesGroupByIdCarrier($this->object->id); + + $shipping_handling = (is_object($this->object) && !$this->object->id) ? 0 : $this->getFieldValue($carrier, 'shipping_handling'); + + return [ + 'is_free' => $this->getFieldValue($carrier, 'is_free'), + 'id_tax_rules_group' => (int) $id_tax_rules_group, + 'shipping_handling' => $shipping_handling, + 'shipping_method' => $this->getFieldValue($carrier, 'shipping_method'), + 'range_behavior' => $this->getFieldValue($carrier, 'range_behavior'), + 'zones' => $this->getFieldValue($carrier, 'zones'), + ]; + } + + public function getStepFourFieldsValues($carrier) + { + return [ + 'range_behavior' => $this->getFieldValue($carrier, 'range_behavior'), + 'max_height' => $this->getFieldValue($carrier, 'max_height'), + 'max_width' => $this->getFieldValue($carrier, 'max_width'), + 'max_depth' => $this->getFieldValue($carrier, 'max_depth'), + 'max_weight' => $this->getFieldValue($carrier, 'max_weight'), + 'group' => $this->getFieldValue($carrier, 'group'), + ]; + } + + public function getStepFiveFieldsValues($carrier) + { + return ['active' => $this->getFieldValue($carrier, 'active')]; + } + + public function ajaxProcessChangeRanges() + { + if ((Validate::isLoadedObject($this->object) && !$this->access('edit')) || !$this->access('add')) { + $this->errors[] = $this->trans('You do not have permission to use this wizard.', [], 'Admin.Shipping.Notification'); + + return; + } + if ((!(int) $shipping_method = Tools::getValue('shipping_method')) || !in_array($shipping_method, [Carrier::SHIPPING_METHOD_PRICE, Carrier::SHIPPING_METHOD_WEIGHT])) { + return; + } + + $carrier = $this->loadObject(true); + $carrier->shipping_method = $shipping_method; + + $tpl_vars = []; + $fields_value = $this->getStepThreeFieldsValues($carrier); + $this->getTplRangesVarsAndValues($carrier, $tpl_vars, $fields_value); + $template = $this->createTemplate('controllers/carrier_wizard/helpers/form/form_ranges.tpl'); + $template->assign($tpl_vars); + $template->assign('change_ranges', 1); + + $template->assign('fields_value', $fields_value); + $template->assign('input', ['type' => 'zone', 'name' => 'zones']); + + $currency = $this->getActualCurrency(); + + $template->assign('currency_sign', $currency->sign); + $template->assign('PS_WEIGHT_UNIT', Configuration::get('PS_WEIGHT_UNIT')); + + die($template->fetch()); + } + + protected function validateForm($die = true) + { + $step_number = (int) Tools::getValue('step_number'); + $return = ['has_error' => false]; + + if (!$this->access('edit')) { + $this->errors[] = $this->trans('You do not have permission to use this wizard.', [], 'Admin.Shipping.Notification'); + } else { + if (Shop::isFeatureActive() && $step_number == 2) { + if (!Tools::getValue('checkBoxShopAsso_carrier')) { + $return['has_error'] = true; + $return['errors'][] = $this->trans('You must choose at least one shop or group shop.', [], 'Admin.Shipping.Notification'); + } + } else { + $this->validateRules(); + } + } + + if (count($this->errors)) { + $return['has_error'] = true; + $return['errors'] = $this->errors; + } + if (count($this->errors) || $die) { + die(json_encode($return)); + } + } + + public function ajaxProcessValidateStep() + { + $this->validateForm(true); + } + + public function processRanges($id_carrier) + { + if (!$this->access('edit') || !$this->access('add')) { + $this->errors[] = $this->trans('You do not have permission to use this wizard.', [], 'Admin.Shipping.Notification'); + + return; + } + + $carrier = new Carrier((int) $id_carrier); + if (!Validate::isLoadedObject($carrier)) { + return false; + } + + $range_inf = Tools::getValue('range_inf'); + $range_sup = Tools::getValue('range_sup'); + $range_type = Tools::getValue('shipping_method'); + + $fees = Tools::getValue('fees'); + + $carrier->deleteDeliveryPrice($carrier->getRangeTable()); + if ($range_type != Carrier::SHIPPING_METHOD_FREE) { + foreach ($range_inf as $key => $delimiter1) { + if (!isset($range_sup[$key])) { + continue; + } + $range = $carrier->getRangeObject((int) $range_type); + $range->id_carrier = (int) $carrier->id; + $range->delimiter1 = (float) $delimiter1; + $range->delimiter2 = (float) $range_sup[$key]; + $range->save(); + + if (!Validate::isLoadedObject($range)) { + return false; + } + $price_list = []; + if (is_array($fees) && count($fees)) { + foreach ($fees as $id_zone => $fee) { + $price_list[] = [ + 'id_range_price' => ($range_type == Carrier::SHIPPING_METHOD_PRICE ? (int) $range->id : null), + 'id_range_weight' => ($range_type == Carrier::SHIPPING_METHOD_WEIGHT ? (int) $range->id : null), + 'id_carrier' => (int) $carrier->id, + 'id_zone' => (int) $id_zone, + 'price' => isset($fee[$key]) ? (float) str_replace(',', '.', $fee[$key]) : 0, + ]; + } + } + + if (count($price_list) && !$carrier->addDeliveryPrice($price_list, true)) { + return false; + } + } + } + + return true; + } + + public function ajaxProcessUploadLogo() + { + if (!$this->access('edit')) { + die(''); + } + + $allowedExtensions = ['jpeg', 'gif', 'png', 'jpg']; + + $logo = (isset($_FILES['carrier_logo_input']) ? $_FILES['carrier_logo_input'] : false); + if ($logo && !empty($logo['tmp_name']) && $logo['tmp_name'] != 'none' + && (!isset($logo['error']) || !$logo['error']) + && preg_match('/\.(jpe?g|gif|png)$/', $logo['name']) + && is_uploaded_file($logo['tmp_name']) + && ImageManager::isRealImage($logo['tmp_name'], $logo['type'])) { + $file = $logo['tmp_name']; + do { + $tmp_name = uniqid() . '.jpg'; + } while (file_exists(_PS_TMP_IMG_DIR_ . $tmp_name)); + if (!ImageManager::resize($file, _PS_TMP_IMG_DIR_ . $tmp_name)) { + die(''); + } + @unlink($file); + die(''); + } else { + die(''); + } + } + + public function ajaxProcessFinishStep() + { + $return = ['has_error' => false]; + if (!$this->access('edit')) { + $return = [ + 'has_error' => true, + $return['errors'][] = $this->trans('You do not have permission to use this wizard.', [], 'Admin.Shipping.Notification'), + ]; + } else { + $this->validateForm(false); + if ($id_carrier = Tools::getValue('id_carrier')) { + $current_carrier = new Carrier((int) $id_carrier); + + // if update we duplicate current Carrier + /** @var Carrier $new_carrier */ + $new_carrier = $current_carrier->duplicateObject(); + + if (Validate::isLoadedObject($new_carrier)) { + // Set flag deteled to true for historization + $current_carrier->deleted = true; + $current_carrier->update(); + + // Fill the new carrier object + $this->copyFromPost($new_carrier, $this->table); + $new_carrier->position = $current_carrier->position; + $new_carrier->update(); + + $this->updateAssoShop((int) $new_carrier->id); + $this->duplicateLogo((int) $new_carrier->id, (int) $current_carrier->id); + $this->changeGroups((int) $new_carrier->id); + + //Copy default carrier + if (Configuration::get('PS_CARRIER_DEFAULT') == $current_carrier->id) { + Configuration::updateValue('PS_CARRIER_DEFAULT', (int) $new_carrier->id); + } + + // Call of hooks + Hook::exec('actionCarrierUpdate', [ + 'id_carrier' => (int) $current_carrier->id, + 'carrier' => $new_carrier, + ]); + $this->postImage($new_carrier->id); + $this->changeZones($new_carrier->id); + $new_carrier->setTaxRulesGroup((int) Tools::getValue('id_tax_rules_group')); + $carrier = $new_carrier; + } + } else { + $carrier = new Carrier(); + $this->copyFromPost($carrier, $this->table); + if (!$carrier->add()) { + $return['has_error'] = true; + $return['errors'][] = $this->trans('An error occurred while saving this carrier.', [], 'Admin.Shipping.Notification'); + } + } + + if ($carrier->is_free) { + //if carrier is free delete shipping cost + $carrier->deleteDeliveryPrice('range_weight'); + $carrier->deleteDeliveryPrice('range_price'); + } + + if (Validate::isLoadedObject($carrier)) { + if (!$this->changeGroups((int) $carrier->id)) { + $return['has_error'] = true; + $return['errors'][] = $this->trans('An error occurred while saving carrier groups.', [], 'Admin.Shipping.Notification'); + } + + if (!$this->changeZones((int) $carrier->id)) { + $return['has_error'] = true; + $return['errors'][] = $this->trans('An error occurred while saving carrier zones.', [], 'Admin.Shipping.Notification'); + } + + if (!$carrier->is_free) { + if (!$this->processRanges((int) $carrier->id)) { + $return['has_error'] = true; + $return['errors'][] = $this->trans('An error occurred while saving carrier ranges.', [], 'Admin.Shipping.Notification'); + } + } + + if (Shop::isFeatureActive() && !$this->updateAssoShop((int) $carrier->id)) { + $return['has_error'] = true; + $return['errors'][] = $this->trans('An error occurred while saving associations of shops.', [], 'Admin.Shipping.Notification'); + } + + if (!$carrier->setTaxRulesGroup((int) Tools::getValue('id_tax_rules_group'))) { + $return['has_error'] = true; + $return['errors'][] = $this->trans('An error occurred while saving the tax rules group.', [], 'Admin.Shipping.Notification'); + } + + if (Tools::getValue('logo')) { + if (Tools::getValue('logo') == 'null' && file_exists(_PS_SHIP_IMG_DIR_ . $carrier->id . '.jpg')) { + unlink(_PS_SHIP_IMG_DIR_ . $carrier->id . '.jpg'); + } else { + $logo = basename(Tools::getValue('logo')); + if (!file_exists(_PS_TMP_IMG_DIR_ . $logo) || !copy(_PS_TMP_IMG_DIR_ . $logo, _PS_SHIP_IMG_DIR_ . $carrier->id . '.jpg')) { + $return['has_error'] = true; + $return['errors'][] = $this->trans('An error occurred while saving carrier logo.', [], 'Admin.Shipping.Notification'); + } + } + } + $return['id_carrier'] = $carrier->id; + } + } + die(json_encode($return)); + } + + protected function changeGroups($id_carrier, $delete = true) + { + $carrier = new Carrier((int) $id_carrier); + if (!Validate::isLoadedObject($carrier)) { + return false; + } + + return $carrier->setGroups(Tools::getValue('groupBox')); + } + + public function changeZones($id) + { + $return = true; + $carrier = new Carrier($id); + if (!Validate::isLoadedObject($carrier)) { + die($this->trans('The object cannot be loaded.', [], 'Admin.Notifications.Error')); + } + $zones = Zone::getZones(false); + foreach ($zones as $zone) { + if (count($carrier->getZone($zone['id_zone']))) { + if (!isset($_POST['zone_' . $zone['id_zone']]) || !$_POST['zone_' . $zone['id_zone']]) { + $return &= $carrier->deleteZone((int) $zone['id_zone']); + } + } elseif (isset($_POST['zone_' . $zone['id_zone']]) && $_POST['zone_' . $zone['id_zone']]) { + $return &= $carrier->addZone((int) $zone['id_zone']); + } + } + + return $return; + } + + public function getValidationRules() + { + $step_number = (int) Tools::getValue('step_number'); + if (!$step_number) { + return; + } + + if ($step_number == 4 && !Shop::isFeatureActive() || $step_number == 5 && Shop::isFeatureActive()) { + return ['fields' => []]; + } + + $step_fields = [ + 1 => ['name', 'delay', 'grade', 'url'], + 2 => ['is_free', 'id_tax_rules_group', 'shipping_handling', 'shipping_method', 'range_behavior'], + 3 => ['range_behavior', 'max_height', 'max_width', 'max_depth', 'max_weight'], + 4 => [], + ]; + if (Shop::isFeatureActive()) { + $tmp = $step_fields; + $step_fields = array_slice($tmp, 0, 1, true) + [2 => ['shop']]; + $step_fields[3] = $tmp[2]; + $step_fields[4] = $tmp[3]; + } + + $definition = ObjectModel::getDefinition('Carrier'); + foreach ($definition['fields'] as $field => $def) { + if (is_array($step_fields[$step_number]) && !in_array($field, $step_fields[$step_number])) { + unset($definition['fields'][$field]); + } + } + + return $definition; + } + + public static function displayFieldName($field) + { + return $field; + } + + public function duplicateLogo($new_id, $old_id) + { + $old_logo = _PS_SHIP_IMG_DIR_ . '/' . (int) $old_id . '.jpg'; + if (file_exists($old_logo)) { + copy($old_logo, _PS_SHIP_IMG_DIR_ . '/' . (int) $new_id . '.jpg'); + } + + $old_tmp_logo = _PS_TMP_IMG_DIR_ . '/carrier_mini_' . (int) $old_id . '.jpg'; + if (file_exists($old_tmp_logo)) { + if (!isset($_FILES['logo'])) { + copy($old_tmp_logo, _PS_TMP_IMG_DIR_ . '/carrier_mini_' . $new_id . '.jpg'); + } + unlink($old_tmp_logo); + } + } + + public function getActualCurrency() + { + if ($this->type_context == Shop::CONTEXT_SHOP) { + Shop::setContext($this->type_context, $this->old_context->shop->id); + } elseif ($this->type_context == Shop::CONTEXT_GROUP) { + Shop::setContext($this->type_context, $this->old_context->shop->id_shop_group); + } + + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + + Shop::setContext(Shop::CONTEXT_ALL); + + return $currency; + } +} diff --git a/controllers/admin/AdminCarriersController.php b/controllers/admin/AdminCarriersController.php new file mode 100644 index 0000000..8aff056 --- /dev/null +++ b/controllers/admin/AdminCarriersController.php @@ -0,0 +1,737 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property Carrier $object + */ +class AdminCarriersControllerCore extends AdminController +{ + protected $position_identifier = 'id_carrier'; + + public function __construct() + { + if ($id_carrier = Tools::getValue('id_carrier') && !Tools::isSubmit('deletecarrier') && !Tools::isSubmit('statuscarrier') && !Tools::isSubmit('isFreecarrier')) { + Tools::redirectAdmin(Context::getContext()->link->getAdminLink('AdminCarrierWizard', true, [], ['id_carrier' => (int) $id_carrier])); + } + + $this->bootstrap = true; + $this->table = 'carrier'; + $this->className = 'Carrier'; + $this->lang = false; + $this->deleted = true; + + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + $this->_defaultOrderBy = 'position'; + + parent::__construct(); + + $this->bulk_actions = [ + 'delete' => [ + 'text' => $this->trans('Delete selected', [], 'Admin.Notifications.Info'), + 'confirm' => $this->trans('Delete selected items?', [], 'Admin.Notifications.Info'), + 'icon' => 'icon-trash', + ], + ]; + + $this->fieldImageSettings = [ + 'name' => 'logo', + 'dir' => 's', + ]; + + $this->fields_list = [ + 'id_carrier' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'name' => [ + 'title' => $this->trans('Name', [], 'Admin.Global'), + ], + 'image' => [ + 'title' => $this->trans('Logo', [], 'Admin.Global'), + 'align' => 'center', + 'image' => 's', + 'class' => 'fixed-width-xs', + 'orderby' => false, + 'search' => false, + ], + 'delay' => [ + 'title' => $this->trans('Delay', [], 'Admin.Shipping.Feature'), + 'orderby' => false, + ], + 'active' => [ + 'title' => $this->trans('Status', [], 'Admin.Global'), + 'align' => 'center', + 'active' => 'status', + 'type' => 'bool', + 'class' => 'fixed-width-sm', + 'orderby' => false, + ], + 'is_free' => [ + 'title' => $this->trans('Free Shipping', [], 'Admin.Shipping.Feature'), + 'align' => 'center', + 'active' => 'isFree', + 'type' => 'bool', + 'class' => 'fixed-width-sm', + 'orderby' => false, + ], + 'position' => [ + 'title' => $this->trans('Position', [], 'Admin.Global'), + 'filter_key' => 'a!position', + 'align' => 'center', + 'class' => 'fixed-width-sm', + 'position' => 'position', + ], + ]; + } + + public function initToolbar() + { + parent::initToolbar(); + + if (isset($this->toolbar_btn['new']) && $this->display != 'view') { + $this->toolbar_btn['new']['href'] = $this->context->link->getAdminLink('AdminCarrierWizard'); + } + } + + public function initPageHeaderToolbar() + { + $this->page_header_toolbar_title = $this->trans('Carriers', [], 'Admin.Shipping.Feature'); + if ($this->display != 'view') { + $this->page_header_toolbar_btn['new_carrier'] = [ + 'href' => $this->context->link->getAdminLink('AdminCarrierWizard'), + 'desc' => $this->trans('Add new carrier', [], 'Admin.Shipping.Feature'), + 'icon' => 'process-icon-new', + ]; + } + + parent::initPageHeaderToolbar(); + } + + public function renderList() + { + $this->_select = 'b.*'; + $this->_join = 'INNER JOIN `' . _DB_PREFIX_ . 'carrier_lang` b ON a.id_carrier = b.id_carrier' . Shop::addSqlRestrictionOnLang('b') . ' AND b.id_lang = ' . (int) $this->context->language->id . ' LEFT JOIN `' . _DB_PREFIX_ . 'carrier_tax_rules_group_shop` ctrgs ON (a.`id_carrier` = ctrgs.`id_carrier` AND ctrgs.id_shop=' . (int) $this->context->shop->id . ')'; + $this->_use_found_rows = false; + + // Removes the Recommended modules button + unset($this->page_header_toolbar_btn['modules-list']); + + // test if need to show header alert. + $sql = 'SELECT COUNT(1) FROM `' . _DB_PREFIX_ . 'carrier` WHERE deleted = 0 AND id_reference > 2'; + $showHeaderAlert = (Db::getInstance()->executeS($sql, false)->fetchColumn(0) == 0); + + // Assign them in two steps! Because renderModulesList needs it before to be called. + $this->context->smarty->assign('panel_title', $this->trans('Use one of our recommended carrier modules', [], 'Admin.Shipping.Feature')); + $this->context->smarty->assign('panel_id', 'recommended-carriers-panel'); + + $this->context->smarty->assign([ + 'showHeaderAlert' => $showHeaderAlert, + 'modules_list' => $this->renderModulesList('back-office,AdminCarriers,new'), + ]); + + return parent::renderList(); + } + + public function renderForm() + { + $this->fields_form = [ + 'legend' => [ + 'title' => $this->trans('Carriers', [], 'Admin.Shipping.Feature'), + 'icon' => 'icon-truck', + ], + 'input' => [ + [ + 'type' => 'text', + 'label' => $this->trans('Company', [], 'Admin.Global'), + 'name' => 'name', + 'required' => true, + 'hint' => [ + $this->trans('Allowed characters: letters, spaces and "%special_chars%".', ['%special_chars%' => '().-'], 'Admin.Shipping.Help'), + $this->trans('Carrier name displayed during checkout', [], 'Admin.Shipping.Help'), + $this->trans('For in-store pickup, enter 0 to replace the carrier name with your shop name.', [], 'Admin.Shipping.Help'), + ], + ], + [ + 'type' => 'file', + 'label' => $this->trans('Logo', [], 'Admin.Global'), + 'name' => 'logo', + 'hint' => $this->trans('Upload a logo from your computer.', [], 'Admin.Shipping.Help') . ' (.gif, .jpg, .jpeg ' . $this->trans('or', [], 'Admin.Shipping.Help') . ' .png)', + ], + [ + 'type' => 'text', + 'label' => $this->trans('Transit time', [], 'Admin.Shipping.Feature'), + 'name' => 'delay', + 'lang' => true, + 'required' => true, + 'maxlength' => 512, + 'hint' => $this->trans('Estimated delivery time will be displayed during checkout.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Speed grade', [], 'Admin.Shipping.Feature'), + 'name' => 'grade', + 'required' => false, + 'hint' => $this->trans('Enter "0" for a longest shipping delay, or "9" for the shortest shipping delay.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('URL', [], 'Admin.Global'), + 'name' => 'url', + 'hint' => $this->trans('Delivery tracking URL: Type \'@\' where the tracking number should appear. It will then be automatically replaced by the tracking number.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'checkbox', + 'label' => $this->trans('Zone', [], 'Admin.Global'), + 'name' => 'zone', + 'values' => [ + 'query' => Zone::getZones(false), + 'id' => 'id_zone', + 'name' => 'name', + ], + 'hint' => $this->trans('The zones in which this carrier will be used.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'group', + 'label' => $this->trans('Group access', [], 'Admin.Shipping.Help'), + 'name' => 'groupBox', + 'values' => Group::getGroups(Context::getContext()->language->id), + 'hint' => $this->trans('Mark the groups that are allowed access to this carrier.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Status', [], 'Admin.Global'), + 'name' => 'active', + 'required' => false, + 'class' => 't', + 'is_bool' => true, + 'values' => [ + [ + 'id' => 'active_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'active_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + 'hint' => $this->trans('Enable the carrier in the front office.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Apply shipping cost', [], 'Admin.Shipping.Feature'), + 'name' => 'is_free', + 'required' => false, + 'class' => 't', + 'values' => [ + [ + 'id' => 'is_free_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'is_free_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + 'hint' => $this->trans('Apply both regular shipping cost and product-specific shipping costs.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'select', + 'label' => $this->trans('Tax', [], 'Admin.Global'), + 'name' => 'id_tax_rules_group', + 'options' => [ + 'query' => TaxRulesGroup::getTaxRulesGroups(true), + 'id' => 'id_tax_rules_group', + 'name' => 'name', + 'default' => [ + 'label' => $this->trans('No Tax', [], 'Admin.Global'), + 'value' => 0, + ], + ], + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Shipping and handling', [], 'Admin.Shipping.Feature'), + 'name' => 'shipping_handling', + 'required' => false, + 'class' => 't', + 'is_bool' => true, + 'values' => [ + [ + 'id' => 'shipping_handling_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'shipping_handling_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + 'hint' => $this->trans('Include the shipping and handling costs in the carrier price.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'radio', + 'label' => $this->trans('Billing', [], 'Admin.Shipping.Feature'), + 'name' => 'shipping_method', + 'required' => false, + 'class' => 't', + 'br' => true, + 'values' => [ + [ + 'id' => 'billing_default', + 'value' => Carrier::SHIPPING_METHOD_DEFAULT, + 'label' => $this->trans('Default behavior', [], 'Admin.Shipping.Feature'), + ], + [ + 'id' => 'billing_price', + 'value' => Carrier::SHIPPING_METHOD_PRICE, + 'label' => $this->trans('According to total price', [], 'Admin.Shipping.Feature'), + ], + [ + 'id' => 'billing_weight', + 'value' => Carrier::SHIPPING_METHOD_WEIGHT, + 'label' => $this->trans('According to total weight', [], 'Admin.Shipping.Feature'), + ], + ], + ], + [ + 'type' => 'select', + 'label' => $this->trans('Out-of-range behavior', [], 'Admin.Shipping.Feature'), + 'name' => 'range_behavior', + 'options' => [ + 'query' => [ + [ + 'id' => 0, + 'name' => $this->trans('Apply the cost of the highest defined range', [], 'Admin.Shipping.Help'), + ], + [ + 'id' => 1, + 'name' => $this->trans('Disable carrier', [], 'Admin.Shipping.Feature'), + ], + ], + 'id' => 'id', + 'name' => 'name', + ], + 'hint' => $this->trans('Out-of-range behavior occurs when none is defined (e.g. when a customer\'s cart weight is greater than the highest range limit).', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Maximum package height', [], 'Admin.Shipping.Feature'), + 'name' => 'max_height', + 'required' => false, + 'hint' => $this->trans('Maximum height managed by this carrier. Set the value to "0," or leave this field blank to ignore.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Maximum package width', [], 'Admin.Shipping.Feature'), + 'name' => 'max_width', + 'required' => false, + 'hint' => $this->trans('Maximum width managed by this carrier. Set the value to "0," or leave this field blank to ignore.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Maximum package depth', [], 'Admin.Shipping.Feature'), + 'name' => 'max_depth', + 'required' => false, + 'hint' => $this->trans('Maximum depth managed by this carrier. Set the value to "0," or leave this field blank to ignore.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Maximum package weight', [], 'Admin.Shipping.Feature'), + 'name' => 'max_weight', + 'required' => false, + 'hint' => $this->trans('Maximum weight managed by this carrier. Set the value to "0," or leave this field blank to ignore.', [], 'Admin.Shipping.Help'), + ], + [ + 'type' => 'hidden', + 'name' => 'is_module', + ], + [ + 'type' => 'hidden', + 'name' => 'external_module_name', + ], + [ + 'type' => 'hidden', + 'name' => 'shipping_external', + ], + [ + 'type' => 'hidden', + 'name' => 'need_range', + ], + ], + ]; + + if (Shop::isFeatureActive()) { + $this->fields_form['input'][] = [ + 'type' => 'shop', + 'label' => $this->trans('Shop association', [], 'Admin.Global'), + 'name' => 'checkBoxShopAsso', + ]; + } + + $this->fields_form['submit'] = [ + 'title' => $this->trans('Save', [], 'Admin.Actions'), + ]; + + if (!($obj = $this->loadObject(true))) { + return; + } + + $this->getFieldsValues($obj); + + return parent::renderForm(); + } + + public function postProcess() + { + if (Tools::getValue('action') == 'GetModuleQuickView' && Tools::getValue('ajax') == '1') { + $this->ajaxProcessGetModuleQuickView(); + } + + if (Tools::getValue('submitAdd' . $this->table)) { + /* Checking fields validity */ + $this->validateRules(); + if (!count($this->errors)) { + $id = (int) Tools::getValue('id_' . $this->table); + + /* Object update */ + if (isset($id) && !empty($id)) { + try { + if ($this->access('edit')) { + $current_carrier = new Carrier($id); + if (!Validate::isLoadedObject($current_carrier)) { + throw new PrestaShopException('Cannot load Carrier object'); + } + + /** @var Carrier $new_carrier */ + // Duplicate current Carrier + $new_carrier = $current_carrier->duplicateObject(); + if (Validate::isLoadedObject($new_carrier)) { + // Set flag deteled to true for historization + $current_carrier->deleted = true; + $current_carrier->update(); + + // Fill the new carrier object + $this->copyFromPost($new_carrier, $this->table); + $new_carrier->position = $current_carrier->position; + $new_carrier->update(); + + $this->updateAssoShop($new_carrier->id); + $new_carrier->copyCarrierData((int) $current_carrier->id); + $this->changeGroups($new_carrier->id); + // Call of hooks + Hook::exec('actionCarrierUpdate', [ + 'id_carrier' => (int) $current_carrier->id, + 'carrier' => $new_carrier, + ]); + $this->postImage($new_carrier->id); + $this->changeZones($new_carrier->id); + $new_carrier->setTaxRulesGroup((int) Tools::getValue('id_tax_rules_group')); + Tools::redirectAdmin(self::$currentIndex . '&id_' . $this->table . '=' . $current_carrier->id . '&conf=4&token=' . $this->token); + } else { + $this->errors[] = $this->trans('An error occurred while updating an object.', [], 'Admin.Notifications.Error') . ' ' . $this->table . ''; + } + } else { + $this->errors[] = $this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error'); + } + } catch (PrestaShopException $e) { + $this->errors[] = $e->getMessage(); + } + } else { + // Object creation + if ($this->access('add')) { + // Create new Carrier + $carrier = new Carrier(); + $this->copyFromPost($carrier, $this->table); + $carrier->position = Carrier::getHigherPosition() + 1; + if ($carrier->add()) { + if (($_POST['id_' . $this->table] = $carrier->id /* voluntary */) && $this->postImage($carrier->id) && $this->_redirect) { + $carrier->setTaxRulesGroup((int) Tools::getValue('id_tax_rules_group'), true); + $this->changeZones($carrier->id); + $this->changeGroups($carrier->id); + $this->updateAssoShop($carrier->id); + Tools::redirectAdmin(self::$currentIndex . '&id_' . $this->table . '=' . $carrier->id . '&conf=3&token=' . $this->token); + } + } else { + $this->errors[] = $this->trans('An error occurred while creating an object.', [], 'Admin.Notifications.Error') . ' ' . $this->table . ''; + } + } else { + $this->errors[] = $this->trans('You do not have permission to add this.', [], 'Admin.Notifications.Error'); + } + } + } + parent::postProcess(); + } elseif (isset($_GET['isFree' . $this->table])) { + if (!$this->access('edit')) { + $this->errors[] = $this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error'); + + return; + } + + $this->processIsFree(); + } else { + // if deletion : removes the carrier from the warehouse/carrier association + if (Tools::isSubmit('delete' . $this->table)) { + $id = (int) Tools::getValue('id_' . $this->table); + // Delete from the reference_id and not from the carrier id + $carrier = new Carrier((int) $id); + Warehouse::removeCarrier($carrier->id_reference); + } elseif (Tools::isSubmit($this->table . 'Box') && count(Tools::getValue($this->table . 'Box', [])) > 0) { + $ids = Tools::getValue($this->table . 'Box'); + array_walk($ids, 'intval'); + foreach ($ids as $id) { + // Delete from the reference_id and not from the carrier id + $carrier = new Carrier((int) $id); + Warehouse::removeCarrier($carrier->id_reference); + } + } + parent::postProcess(); + Carrier::cleanPositions(); + } + } + + public function processIsFree() + { + $carrier = new Carrier($this->id_object); + if (!Validate::isLoadedObject($carrier)) { + $this->errors[] = $this->trans('An error occurred while updating carrier information.', [], 'Admin.Shipping.Notification'); + } + $carrier->is_free = $carrier->is_free ? 0 : 1; + if (!$carrier->update()) { + $this->errors[] = $this->trans('An error occurred while updating carrier information.', [], 'Admin.Shipping.Notification'); + } + Tools::redirectAdmin(self::$currentIndex . '&conf=5&token=' . $this->token); + } + + /** + * Overload the property $fields_value. + * + * @param object $obj + */ + public function getFieldsValues($obj) + { + if ($this->getFieldValue($obj, 'is_module')) { + $this->fields_value['is_module'] = 1; + } + + if ($this->getFieldValue($obj, 'shipping_external')) { + $this->fields_value['shipping_external'] = 1; + } + + if ($this->getFieldValue($obj, 'need_range')) { + $this->fields_value['need_range'] = 1; + } + // Added values of object Zone + $carrier_zones = $obj->getZones(); + $carrier_zones_ids = []; + if (is_array($carrier_zones)) { + foreach ($carrier_zones as $carrier_zone) { + $carrier_zones_ids[] = $carrier_zone['id_zone']; + } + } + + $zones = Zone::getZones(false); + foreach ($zones as $zone) { + $this->fields_value['zone_' . $zone['id_zone']] = Tools::getValue('zone_' . $zone['id_zone'], (in_array($zone['id_zone'], $carrier_zones_ids))); + } + + // Added values of object Group + $carrier_groups = $obj->getGroups(); + $carrier_groups_ids = []; + if (is_array($carrier_groups)) { + foreach ($carrier_groups as $carrier_group) { + $carrier_groups_ids[] = $carrier_group['id_group']; + } + } + + $groups = Group::getGroups($this->context->language->id); + + foreach ($groups as $group) { + $this->fields_value['groupBox_' . $group['id_group']] = Tools::getValue('groupBox_' . $group['id_group'], (in_array($group['id_group'], $carrier_groups_ids) || empty($carrier_groups_ids) && !$obj->id)); + } + + $this->fields_value['id_tax_rules_group'] = $this->object->getIdTaxRulesGroup($this->context); + } + + /** + * @param Carrier $object + * + * @return int + */ + protected function beforeDelete($object) + { + return $object->isUsed(); + } + + protected function changeGroups($id_carrier, $delete = true) + { + if ($delete) { + Db::getInstance()->execute('DELETE FROM ' . _DB_PREFIX_ . 'carrier_group WHERE id_carrier = ' . (int) $id_carrier); + } + $groups = Db::getInstance()->executeS('SELECT id_group FROM `' . _DB_PREFIX_ . 'group`'); + foreach ($groups as $group) { + if (Tools::getIsset('groupBox') && in_array($group['id_group'], Tools::getValue('groupBox'))) { + Db::getInstance()->execute(' + INSERT INTO ' . _DB_PREFIX_ . 'carrier_group (id_group, id_carrier) + VALUES(' . (int) $group['id_group'] . ',' . (int) $id_carrier . ') + '); + } + } + } + + public function changeZones($id) + { + /** @var Carrier $carrier */ + $carrier = new $this->className($id); + if (!Validate::isLoadedObject($carrier)) { + die($this->trans('The object cannot be loaded.', [], 'Admin.Notifications.Error')); + } + $zones = Zone::getZones(false); + foreach ($zones as $zone) { + if (count($carrier->getZone($zone['id_zone']))) { + if (!isset($_POST['zone_' . $zone['id_zone']]) || !$_POST['zone_' . $zone['id_zone']]) { + $carrier->deleteZone($zone['id_zone']); + } + } elseif (isset($_POST['zone_' . $zone['id_zone']]) && $_POST['zone_' . $zone['id_zone']]) { + $carrier->addZone($zone['id_zone']); + } + } + } + + /** + * Modifying initial getList method to display position feature (drag and drop). + * + * @param int $id_lang + * @param string|null $order_by + * @param string|null $order_way + * @param int $start + * @param int|null $limit + * @param int|bool $id_lang_shop + * + * @throws PrestaShopException + */ + public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false) + { + parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop); + + foreach ($this->_list as $key => $list) { + if ($list['name'] == '0') { + $this->_list[$key]['name'] = Carrier::getCarrierNameFromShopName(); + } + } + } + + public function ajaxProcessUpdatePositions() + { + $way = (int) (Tools::getValue('way')); + $id_carrier = (int) (Tools::getValue('id')); + $positions = Tools::getValue($this->table); + + foreach ($positions as $position => $value) { + $pos = explode('_', $value); + + if (isset($pos[2]) && (int) $pos[2] === $id_carrier) { + if ($carrier = new Carrier((int) $pos[2])) { + if (isset($position) && $carrier->updatePosition($way, $position)) { + echo 'ok position ' . (int) $position . ' for carrier ' . (int) $pos[1] . '\r\n'; + } else { + echo '{"hasError" : true, "errors" : "Can not update carrier ' . (int) $id_carrier . ' to position ' . (int) $position . ' "}'; + } + } else { + echo '{"hasError" : true, "errors" : "This carrier (' . (int) $id_carrier . ') can t be loaded"}'; + } + + break; + } + } + } + + public function displayEditLink($token, $id, $name = null) + { + if ($this->access('edit')) { + $tpl = $this->createTemplate('helpers/list/list_action_edit.tpl'); + if (!array_key_exists('Edit', self::$cache_lang)) { + self::$cache_lang['Edit'] = $this->trans('Edit', [], 'Admin.Actions'); + } + + $tpl->assign([ + 'href' => $this->context->link->getAdminLink('AdminCarrierWizard', true, [], ['id_carrier' => (int) $id]), + 'action' => self::$cache_lang['Edit'], + 'id' => $id, + ]); + + return $tpl->fetch(); + } else { + return; + } + } + + public function displayDeleteLink($token, $id, $name = null) + { + if ($this->access('delete')) { + $tpl = $this->createTemplate('helpers/list/list_action_delete.tpl'); + + if (!array_key_exists('Delete', self::$cache_lang)) { + self::$cache_lang['Delete'] = $this->trans('Delete', [], 'Admin.Actions'); + } + + if (!array_key_exists('DeleteItem', self::$cache_lang)) { + self::$cache_lang['DeleteItem'] = $this->trans('Delete selected item?', [], 'Admin.Notifications.Info'); + } + + if (!array_key_exists('Name', self::$cache_lang)) { + self::$cache_lang['Name'] = $this->trans('Name:', [], 'Admin.Shipping.Feature'); + } + + if (null !== $name) { + $name = '\n\n' . self::$cache_lang['Name'] . ' ' . $name; + } + + $data = [ + $this->identifier => $id, + 'href' => $this->context->link->getAdminLink('AdminCarriers', true, [], ['id_carrier' => (int) $id, 'deletecarrier' => 1]), + 'action' => self::$cache_lang['Delete'], + ]; + + if ($this->specificConfirmDelete !== false) { + $data['confirm'] = null !== $this->specificConfirmDelete ? '\r' . $this->specificConfirmDelete : addcslashes(Tools::htmlentitiesDecodeUTF8(self::$cache_lang['DeleteItem'] . $name), '\''); + } + + $tpl->assign(array_merge($this->tpl_delete_link_vars, $data)); + + return $tpl->fetch(); + } else { + return; + } + } +} diff --git a/controllers/admin/AdminCartRulesController.php b/controllers/admin/AdminCartRulesController.php new file mode 100644 index 0000000..b160509 --- /dev/null +++ b/controllers/admin/AdminCartRulesController.php @@ -0,0 +1,828 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property CartRule $object + */ +class AdminCartRulesControllerCore extends AdminController +{ + public function __construct() + { + $this->bootstrap = true; + $this->table = 'cart_rule'; + $this->className = 'CartRule'; + $this->lang = true; + $this->addRowAction('edit'); + $this->addRowAction('delete'); + $this->_orderWay = 'DESC'; + + parent::__construct(); + + $this->bulk_actions = [ + 'delete' => [ + 'text' => $this->trans('Delete selected', [], 'Admin.Actions'), + 'icon' => 'icon-trash', + 'confirm' => $this->trans('Delete selected items?', [], 'Admin.Notifications.Warning'), + ], + ]; + + $this->fields_list = [ + 'id_cart_rule' => ['title' => $this->trans('ID', [], 'Admin.Global'), 'align' => 'center', 'class' => 'fixed-width-xs'], + 'name' => ['title' => $this->trans('Name', [], 'Admin.Global')], + 'priority' => ['title' => $this->trans('Priority', [], 'Admin.Global'), 'align' => 'center', 'class' => 'fixed-width-xs'], + 'code' => ['title' => $this->trans('Code', [], 'Admin.Global'), 'class' => 'fixed-width-sm'], + 'quantity' => ['title' => $this->trans('Quantity', [], 'Admin.Catalog.Feature'), 'align' => 'center', 'class' => 'fixed-width-xs'], + 'date_to' => ['title' => $this->trans('Expiration date', [], 'Admin.Catalog.Feature'), 'type' => 'datetime', 'class' => 'fixed-width-lg'], + 'active' => ['title' => $this->trans('Status', [], 'Admin.Global'), 'active' => 'status', 'type' => 'bool', 'align' => 'center', 'class' => 'fixed-width-xs', 'orderby' => false], + ]; + } + + public function ajaxProcessLoadCartRules() + { + if (!$this->access('view')) { + return die(json_encode(['error' => 'You do not have the right permission'])); + } + + $type = $token = $search = ''; + $limit = $count = $id_cart_rule = 0; + if (Tools::getIsset('limit')) { + $limit = Tools::getValue('limit'); + } + + if (Tools::getIsset('type')) { + $type = Tools::getValue('type'); + } + + if (Tools::getIsset('count')) { + $count = Tools::getValue('count'); + } + + if (Tools::getIsset('id_cart_rule')) { + $id_cart_rule = Tools::getValue('id_cart_rule'); + } + + if (Tools::getIsset('search')) { + $search = Tools::getValue('search'); + } + + $page = floor($count / $limit); + + $html = ''; + $next_link = ''; + + if (($page * $limit) + 1 == $count || $count == 0) { + if ($count == 0) { + $count = 1; + } + + /** @var CartRule $current_object */ + $current_object = $this->loadObject(true); + $cart_rules = $current_object->getAssociatedRestrictions('cart_rule', false, true, ($page) * $limit, $limit, $search); + + if ($type == 'selected') { + $i = 1; + foreach ($cart_rules['selected'] as $cart_rule) { + $html .= ''; + if ($i == $limit) { + break; + } + ++$i; + } + if ($i == $limit) { + $next_link = Context::getContext()->link->getAdminLink('AdminCartRules') . '&ajaxMode=1&ajax=1&id_cart_rule=' . (int) $id_cart_rule . '&action=loadCartRules&limit=' . (int) $limit . '&type=selected&count=' . ($count - 1 + count($cart_rules['selected']) . '&search=' . urlencode($search)); + } + } else { + $i = 1; + foreach ($cart_rules['unselected'] as $cart_rule) { + $html .= ''; + if ($i == $limit) { + break; + } + ++$i; + } + if ($i == $limit) { + $next_link = Context::getContext()->link->getAdminLink('AdminCartRules') . '&ajaxMode=1&ajax=1&id_cart_rule=' . (int) $id_cart_rule . '&action=loadCartRules&limit=' . (int) $limit . '&type=unselected&count=' . ($count - 1 + count($cart_rules['unselected']) . '&search=' . urlencode($search)); + } + } + } + echo json_encode(['html' => $html, 'next_link' => $next_link]); + } + + public function setMedia($isNewTheme = false) + { + parent::setMedia($isNewTheme); + $this->addJqueryPlugin(['typewatch', 'fancybox', 'autocomplete']); + } + + public function initPageHeaderToolbar() + { + if (empty($this->display)) { + $this->page_header_toolbar_btn['new_cart_rule'] = [ + 'href' => self::$currentIndex . '&addcart_rule&token=' . $this->token, + 'desc' => $this->trans('Add new cart rule', [], 'Admin.Catalog.Feature'), + 'icon' => 'process-icon-new', + ]; + } + + parent::initPageHeaderToolbar(); + } + + public function postProcess() + { + if (Tools::isSubmit('submitAddcart_rule') || Tools::isSubmit('submitAddcart_ruleAndStay')) { + // If the reduction is associated to a specific product, then it must be part of the product restrictions + if ((int) Tools::getValue('reduction_product') && Tools::getValue('apply_discount_to') == 'specific' && Tools::getValue('apply_discount') != 'off') { + $reduction_product = (int) Tools::getValue('reduction_product'); + + // First, check if it is not already part of the restrictions + $already_restricted = false; + if (is_array($rule_group_array = Tools::getValue('product_rule_group')) && count($rule_group_array) && Tools::getValue('product_restriction')) { + foreach ($rule_group_array as $rule_group_id) { + if (is_array($rule_array = Tools::getValue('product_rule_' . $rule_group_id)) && count($rule_array)) { + foreach ($rule_array as $rule_id) { + if (Tools::getValue('product_rule_' . $rule_group_id . '_' . $rule_id . '_type') == 'products' + && in_array($reduction_product, Tools::getValue('product_rule_select_' . $rule_group_id . '_' . $rule_id))) { + $already_restricted = true; + + break 2; + } + } + } + } + } + if ($already_restricted == false) { + // Check the product restriction + $_POST['product_restriction'] = 1; + + // Add a new rule group + $rule_group_id = 1; + if (is_array($rule_group_array)) { + // Find the first rule_group_id that is not available in the array + while (in_array($rule_group_id, $rule_group_array)) { + ++$rule_group_id; + } + $_POST['product_rule_group'][] = $rule_group_id; + } else { + $_POST['product_rule_group'] = [$rule_group_id]; + } + + // Set a quantity of 1 for this new rule group + $_POST['product_rule_group_' . $rule_group_id . '_quantity'] = 1; + // Add one rule to the new rule group + $_POST['product_rule_' . $rule_group_id] = [1]; + // Set a type 'product' for this 1 rule + $_POST['product_rule_' . $rule_group_id . '_1_type'] = 'products'; + // Add the product in the selected products + $_POST['product_rule_select_' . $rule_group_id . '_1'] = [$reduction_product]; + } + } + + // These are checkboxes (which aren't sent through POST when they are not check), so they are forced to 0 + foreach (['country', 'carrier', 'group', 'cart_rule', 'product', 'shop'] as $type) { + if (!Tools::getValue($type . '_restriction')) { + $_POST[$type . '_restriction'] = 0; + } + } + + // Remove the gift if the radio button is set to "no" + if (!(int) Tools::getValue('free_gift')) { + $_POST['gift_product'] = 0; + } + + // Retrieve the product attribute id of the gift (if available) + if ($id_product = (int) Tools::getValue('gift_product')) { + $_POST['gift_product_attribute'] = (int) Tools::getValue('ipa_' . $id_product); + } + + // Idiot-proof control + if (strtotime(Tools::getValue('date_from')) > strtotime(Tools::getValue('date_to'))) { + $this->errors[] = $this->trans('The voucher cannot end before it begins.', [], 'Admin.Catalog.Notification'); + } + if ((int) Tools::getValue('minimum_amount') < 0) { + $this->errors[] = $this->trans('The minimum amount cannot be lower than zero.', [], 'Admin.Catalog.Notification'); + } + if ((float) Tools::getValue('reduction_percent') < 0 || (float) Tools::getValue('reduction_percent') > 100) { + $this->errors[] = $this->trans('Reduction percentage must be between 0% and 100%', [], 'Admin.Catalog.Notification'); + } + if ((int) Tools::getValue('reduction_amount') < 0) { + $this->errors[] = $this->trans('Reduction amount cannot be lower than zero.', [], 'Admin.Catalog.Notification'); + } + if (Tools::getValue('code') && ($same_code = (int) CartRule::getIdByCode(Tools::getValue('code'))) && $same_code != Tools::getValue('id_cart_rule')) { + $this->errors[] = $this->trans('This cart rule code is already used (conflict with cart rule %rulename%)', ['%rulename%' => $same_code], 'Admin.Catalog.Notification'); + } + if (Tools::getValue('apply_discount') == 'off' && !Tools::getValue('free_shipping') && !Tools::getValue('free_gift')) { + $this->errors[] = $this->trans('An action is required for this cart rule.', [], 'Admin.Catalog.Notification'); + } + } + + return parent::postProcess(); + } + + public function processDelete() + { + $res = parent::processDelete(); + if (Tools::isSubmit('delete' . $this->table)) { + $back = rawurldecode(Tools::getValue('back', '')); + if (!empty($back)) { + $this->redirect_after = $back; + } + } + + return $res; + } + + protected function afterUpdate($current_object) + { + // All the associations are deleted for an update, then recreated when we call the "afterAdd" method + $id_cart_rule = Tools::getValue('id_cart_rule'); + foreach (['country', 'carrier', 'group', 'product_rule_group', 'shop'] as $type) { + Db::getInstance()->delete('cart_rule_' . $type, '`id_cart_rule` = ' . (int) $id_cart_rule); + } + + Db::getInstance()->delete('cart_rule_product_rule', 'NOT EXISTS (SELECT 1 FROM `' . _DB_PREFIX_ . 'cart_rule_product_rule_group` + WHERE `' . _DB_PREFIX_ . 'cart_rule_product_rule`.`id_product_rule_group` = `' . _DB_PREFIX_ . 'cart_rule_product_rule_group`.`id_product_rule_group`)'); + Db::getInstance()->delete('cart_rule_product_rule_value', 'NOT EXISTS (SELECT 1 FROM `' . _DB_PREFIX_ . 'cart_rule_product_rule` + WHERE `' . _DB_PREFIX_ . 'cart_rule_product_rule_value`.`id_product_rule` = `' . _DB_PREFIX_ . 'cart_rule_product_rule`.`id_product_rule`)'); + Db::getInstance()->delete('cart_rule_combination', '`id_cart_rule_1` = ' . (int) $id_cart_rule . ' OR `id_cart_rule_2` = ' . (int) $id_cart_rule); + + $this->afterAdd($current_object); + } + + public function processAdd() + { + if ($cart_rule = parent::processAdd()) { + $this->context->smarty->assign('new_cart_rule', $cart_rule); + } + if (Tools::getValue('submitFormAjax')) { + $this->redirect_after = false; + if ($cart_rule) { + $this->context->smarty->assign('refresh_cart', true); + $this->display = 'edit'; + } + } + + return $cart_rule; + } + + /** + * @TODO Move this function into CartRule + * + * @param ObjectModel $currentObject + * + * @throws PrestaShopDatabaseException + */ + protected function afterAdd($currentObject) + { + // Add restrictions for generic entities like country, carrier and group + foreach (['country', 'carrier', 'group', 'shop'] as $type) { + if (Tools::getValue($type . '_restriction') && is_array($array = Tools::getValue($type . '_select')) && count($array)) { + $values = []; + foreach ($array as $id) { + $values[] = '(' . (int) $currentObject->id . ',' . (int) $id . ')'; + } + Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'cart_rule_' . $type . '` (`id_cart_rule`, `id_' . $type . '`) VALUES ' . implode(',', $values)); + } + } + // Add cart rule restrictions + if (Tools::getValue('cart_rule_restriction') && is_array($array = Tools::getValue('cart_rule_select')) && count($array)) { + $values = []; + foreach ($array as $id) { + $values[] = '(' . (int) $currentObject->id . ',' . (int) $id . ')'; + } + Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'cart_rule_combination` (`id_cart_rule_1`, `id_cart_rule_2`) VALUES ' . implode(',', $values)); + } + // Add product rule restrictions + if (Tools::getValue('product_restriction') && is_array($ruleGroupArray = Tools::getValue('product_rule_group')) && count($ruleGroupArray)) { + foreach ($ruleGroupArray as $ruleGroupId) { + Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'cart_rule_product_rule_group` (`id_cart_rule`, `quantity`) + VALUES (' . (int) $currentObject->id . ', ' . (int) Tools::getValue('product_rule_group_' . $ruleGroupId . '_quantity') . ')'); + $id_product_rule_group = Db::getInstance()->Insert_ID(); + + if (is_array($ruleArray = Tools::getValue('product_rule_' . $ruleGroupId)) && count($ruleArray)) { + foreach ($ruleArray as $ruleId) { + Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'cart_rule_product_rule` (`id_product_rule_group`, `type`) + VALUES (' . (int) $id_product_rule_group . ', "' . pSQL(Tools::getValue('product_rule_' . $ruleGroupId . '_' . $ruleId . '_type')) . '")'); + $id_product_rule = Db::getInstance()->Insert_ID(); + + $values = []; + foreach (Tools::getValue('product_rule_select_' . $ruleGroupId . '_' . $ruleId) as $id) { + $values[] = '(' . (int) $id_product_rule . ',' . (int) $id . ')'; + } + $values = array_unique($values); + if (count($values)) { + Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'cart_rule_product_rule_value` (`id_product_rule`, `id_item`) VALUES ' . implode(',', $values)); + } + } + } + } + } + + // If the new rule has no cart rule restriction, then it must be added to the white list of the other cart rules that have restrictions + if (!Tools::getValue('cart_rule_restriction')) { + Db::getInstance()->execute(' + INSERT INTO `' . _DB_PREFIX_ . 'cart_rule_combination` (`id_cart_rule_1`, `id_cart_rule_2`) ( + SELECT id_cart_rule, ' . (int) $currentObject->id . ' FROM `' . _DB_PREFIX_ . 'cart_rule` WHERE cart_rule_restriction = 1 + )'); + } else { + // And if the new cart rule has restrictions, previously unrestricted cart rules may now be restricted (a mug of coffee is strongly advised to understand this sentence) + $ruleCombinations = Db::getInstance()->executeS(' + SELECT cr.id_cart_rule + FROM ' . _DB_PREFIX_ . 'cart_rule cr + WHERE cr.id_cart_rule != ' . (int) $currentObject->id . ' + AND cr.cart_rule_restriction = 0 + AND NOT EXISTS ( + SELECT 1 + FROM ' . _DB_PREFIX_ . 'cart_rule_combination + WHERE cr.id_cart_rule = ' . _DB_PREFIX_ . 'cart_rule_combination.id_cart_rule_2 AND ' . (int) $currentObject->id . ' = id_cart_rule_1 + ) + AND NOT EXISTS ( + SELECT 1 + FROM ' . _DB_PREFIX_ . 'cart_rule_combination + WHERE cr.id_cart_rule = ' . _DB_PREFIX_ . 'cart_rule_combination.id_cart_rule_1 AND ' . (int) $currentObject->id . ' = id_cart_rule_2 + ) + '); + foreach ($ruleCombinations as $incompatibleRule) { + Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'cart_rule` SET cart_rule_restriction = 1 WHERE id_cart_rule = ' . (int) $incompatibleRule['id_cart_rule'] . ' LIMIT 1'); + Db::getInstance()->execute(' + INSERT IGNORE INTO `' . _DB_PREFIX_ . 'cart_rule_combination` (`id_cart_rule_1`, `id_cart_rule_2`) ( + SELECT id_cart_rule, ' . (int) $incompatibleRule['id_cart_rule'] . ' FROM `' . _DB_PREFIX_ . 'cart_rule` + WHERE active = 1 + AND id_cart_rule != ' . (int) $currentObject->id . ' + AND id_cart_rule != ' . (int) $incompatibleRule['id_cart_rule'] . ' + )'); + } + } + } + + /** + * Retrieve the cart rule product rule groups in the POST data + * if available, and in the database if there is none. + * + * @param CartRule $cart_rule + * + * @return array + */ + public function getProductRuleGroupsDisplay($cart_rule) + { + $productRuleGroupsArray = []; + if (Tools::getValue('product_restriction') && is_array($array = Tools::getValue('product_rule_group')) && count($array)) { + $i = 1; + foreach ($array as $ruleGroupId) { + $productRulesArray = []; + if (is_array($array = Tools::getValue('product_rule_' . $ruleGroupId)) && count($array)) { + foreach ($array as $ruleId) { + $productRulesArray[] = $this->getProductRuleDisplay( + $ruleGroupId, + $ruleId, + Tools::getValue('product_rule_' . $ruleGroupId . '_' . $ruleId . '_type'), + Tools::getValue('product_rule_select_' . $ruleGroupId . '_' . $ruleId) + ); + } + } + + $productRuleGroupsArray[] = $this->getProductRuleGroupDisplay( + $i++, + (int) Tools::getValue('product_rule_group_' . $ruleGroupId . '_quantity'), + $productRulesArray + ); + } + } else { + $i = 1; + foreach ($cart_rule->getProductRuleGroups() as $productRuleGroup) { + $j = 1; + $productRulesDisplay = []; + foreach ($productRuleGroup['product_rules'] as $productRule) { + $productRulesDisplay[] = $this->getProductRuleDisplay($i, $j++, $productRule['type'], $productRule['values']); + } + $productRuleGroupsArray[] = $this->getProductRuleGroupDisplay($i++, $productRuleGroup['quantity'], $productRulesDisplay); + } + } + + return $productRuleGroupsArray; + } + + /* Return the form for a single cart rule group either with or without product_rules set up */ + public function getProductRuleGroupDisplay($product_rule_group_id, $product_rule_group_quantity = 1, $product_rules = null) + { + Context::getContext()->smarty->assign('product_rule_group_id', $product_rule_group_id); + Context::getContext()->smarty->assign('product_rule_group_quantity', $product_rule_group_quantity); + Context::getContext()->smarty->assign('product_rules', $product_rules); + + return $this->createTemplate('product_rule_group.tpl')->fetch(); + } + + public function getProductRuleDisplay($product_rule_group_id, $product_rule_id, $product_rule_type, $selected = []) + { + Context::getContext()->smarty->assign( + [ + 'product_rule_group_id' => (int) $product_rule_group_id, + 'product_rule_id' => (int) $product_rule_id, + 'product_rule_type' => $product_rule_type, + ] + ); + + switch ($product_rule_type) { + case 'attributes': + $attributes = ['selected' => [], 'unselected' => []]; + $results = Db::getInstance()->executeS(' + SELECT CONCAT(agl.name, " - ", al.name) as name, a.id_attribute as id + FROM ' . _DB_PREFIX_ . 'attribute_group_lang agl + LEFT JOIN ' . _DB_PREFIX_ . 'attribute a ON a.id_attribute_group = agl.id_attribute_group + LEFT JOIN ' . _DB_PREFIX_ . 'attribute_lang al ON (a.id_attribute = al.id_attribute AND al.id_lang = ' . (int) Context::getContext()->language->id . ') + WHERE agl.id_lang = ' . (int) Context::getContext()->language->id . ' + ORDER BY agl.name, al.name'); + foreach ($results as $row) { + $attributes[in_array($row['id'], $selected) ? 'selected' : 'unselected'][] = $row; + } + Context::getContext()->smarty->assign('product_rule_itemlist', $attributes); + $choose_content = $this->createTemplate('controllers/cart_rules/product_rule_itemlist.tpl')->fetch(); + Context::getContext()->smarty->assign('product_rule_choose_content', $choose_content); + + break; + case 'products': + $products = ['selected' => [], 'unselected' => []]; + $results = Db::getInstance()->executeS(' + SELECT DISTINCT name, p.id_product as id + FROM ' . _DB_PREFIX_ . 'product p + LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl + ON (p.`id_product` = pl.`id_product` + AND pl.`id_lang` = ' . (int) Context::getContext()->language->id . Shop::addSqlRestrictionOnLang('pl') . ') + ' . Shop::addSqlAssociation('product', 'p') . ' + WHERE id_lang = ' . (int) Context::getContext()->language->id . ' + ORDER BY name'); + foreach ($results as $row) { + $products[in_array($row['id'], $selected) ? 'selected' : 'unselected'][] = $row; + } + Context::getContext()->smarty->assign('product_rule_itemlist', $products); + $choose_content = $this->createTemplate('product_rule_itemlist.tpl')->fetch(); + Context::getContext()->smarty->assign('product_rule_choose_content', $choose_content); + + break; + case 'manufacturers': + $products = ['selected' => [], 'unselected' => []]; + $results = Db::getInstance()->executeS(' + SELECT name, id_manufacturer as id + FROM ' . _DB_PREFIX_ . 'manufacturer + ORDER BY name'); + foreach ($results as $row) { + $products[in_array($row['id'], $selected) ? 'selected' : 'unselected'][] = $row; + } + Context::getContext()->smarty->assign('product_rule_itemlist', $products); + $choose_content = $this->createTemplate('product_rule_itemlist.tpl')->fetch(); + Context::getContext()->smarty->assign('product_rule_choose_content', $choose_content); + + break; + case 'suppliers': + $products = ['selected' => [], 'unselected' => []]; + $results = Db::getInstance()->executeS(' + SELECT name, id_supplier as id + FROM ' . _DB_PREFIX_ . 'supplier + ORDER BY name'); + foreach ($results as $row) { + $products[in_array($row['id'], $selected) ? 'selected' : 'unselected'][] = $row; + } + Context::getContext()->smarty->assign('product_rule_itemlist', $products); + $choose_content = $this->createTemplate('product_rule_itemlist.tpl')->fetch(); + Context::getContext()->smarty->assign('product_rule_choose_content', $choose_content); + + break; + case 'categories': + $categories = ['selected' => [], 'unselected' => []]; + $results = Db::getInstance()->executeS(' + SELECT DISTINCT name, c.id_category as id + FROM ' . _DB_PREFIX_ . 'category c + LEFT JOIN `' . _DB_PREFIX_ . 'category_lang` cl + ON (c.`id_category` = cl.`id_category` + AND cl.`id_lang` = ' . (int) Context::getContext()->language->id . Shop::addSqlRestrictionOnLang('cl') . ') + ' . Shop::addSqlAssociation('category', 'c') . ' + WHERE id_lang = ' . (int) Context::getContext()->language->id . ' + ORDER BY name'); + foreach ($results as $row) { + $categories[in_array($row['id'], $selected) ? 'selected' : 'unselected'][] = $row; + } + Context::getContext()->smarty->assign('product_rule_itemlist', $categories); + $choose_content = $this->createTemplate('product_rule_itemlist.tpl')->fetch(); + Context::getContext()->smarty->assign('product_rule_choose_content', $choose_content); + + break; + default: + Context::getContext()->smarty->assign('product_rule_itemlist', ['selected' => [], 'unselected' => []]); + Context::getContext()->smarty->assign('product_rule_choose_content', ''); + } + + return $this->createTemplate('product_rule.tpl')->fetch(); + } + + public function ajaxProcess() + { + if (Tools::isSubmit('newProductRule')) { + die($this->getProductRuleDisplay(Tools::getValue('product_rule_group_id'), Tools::getValue('product_rule_id'), Tools::getValue('product_rule_type'))); + } + if (Tools::isSubmit('newProductRuleGroup') && $product_rule_group_id = Tools::getValue('product_rule_group_id')) { + die($this->getProductRuleGroupDisplay($product_rule_group_id, Tools::getValue('product_rule_group_' . $product_rule_group_id . '_quantity', 1))); + } + + if (Tools::isSubmit('customerFilter')) { + $search_query = trim(Tools::getValue('q')); + $customers = Db::getInstance()->executeS(' + SELECT `id_customer`, `email`, CONCAT(`firstname`, \' \', `lastname`) as cname + FROM `' . _DB_PREFIX_ . 'customer` + WHERE `deleted` = 0 AND is_guest = 0 AND active = 1 + AND ( + `id_customer` = ' . (int) $search_query . ' + OR `email` LIKE "%' . pSQL($search_query) . '%" + OR `firstname` LIKE "%' . pSQL($search_query) . '%" + OR `lastname` LIKE "%' . pSQL($search_query) . '%" + ) + ' . Shop::addSqlRestriction(Shop::SHARE_CUSTOMER) . ' + ORDER BY `firstname`, `lastname` ASC + LIMIT 50'); + die(json_encode($customers)); + } + // Both product filter (free product and product discount) search for products + if (Tools::isSubmit('giftProductFilter') || Tools::isSubmit('reductionProductFilter')) { + $products = Product::searchByName(Context::getContext()->language->id, trim(Tools::getValue('q'))); + die(json_encode($products)); + } + } + + protected function searchProducts($search) + { + if ($products = Product::searchByName((int) $this->context->language->id, $search)) { + foreach ($products as &$product) { + $combinations = []; + $productObj = new Product((int) $product['id_product'], false, (int) $this->context->language->id); + $attributes = $productObj->getAttributesGroups((int) $this->context->language->id); + $product['formatted_price'] = $product['price_tax_incl'] + ? $this->context->getCurrentLocale()->formatPrice(Tools::convertPrice($product['price_tax_incl'], $this->context->currency), $this->context->currency->iso_code) + : ''; + + foreach ($attributes as $attribute) { + if (!isset($combinations[$attribute['id_product_attribute']]['attributes'])) { + $combinations[$attribute['id_product_attribute']]['attributes'] = ''; + } + $combinations[$attribute['id_product_attribute']]['attributes'] .= $attribute['attribute_name'] . ' - '; + $combinations[$attribute['id_product_attribute']]['id_product_attribute'] = $attribute['id_product_attribute']; + $combinations[$attribute['id_product_attribute']]['default_on'] = $attribute['default_on']; + if (!isset($combinations[$attribute['id_product_attribute']]['price'])) { + $price_tax_incl = Product::getPriceStatic((int) $product['id_product'], true, $attribute['id_product_attribute']); + $combinations[$attribute['id_product_attribute']]['formatted_price'] = $price_tax_incl + ? $this->context->getCurrentLocale()->formatPrice(Tools::convertPrice($price_tax_incl, $this->context->currency), $this->context->currency->iso_code) + : ''; + } + } + + foreach ($combinations as &$combination) { + $combination['attributes'] = rtrim($combination['attributes'], ' - '); + } + $product['combinations'] = $combinations; + } + + return [ + 'products' => $products, + 'found' => true, + ]; + } else { + return ['found' => false, 'notfound' => $this->trans('No product has been found.', [], 'Admin.Catalog.Notification')]; + } + } + + public function ajaxProcessSearchProducts() + { + $array = $this->searchProducts(Tools::getValue('product_search')); + $this->content = trim(json_encode($array)); + } + + public function renderForm() + { + $limit = 40; + $this->toolbar_btn['save'] = [ + 'href' => '#', + 'desc' => $this->trans('Save', [], 'Admin.Actions'), + ]; + + $this->toolbar_btn['save-and-stay'] = [ + 'href' => '#', + 'desc' => $this->trans('Save and stay', [], 'Admin.Actions'), + ]; + + /** @var CartRule $current_object */ + $current_object = $this->loadObject(true); + + // All the filter are prefilled with the correct information + $customer_filter = ''; + if (Validate::isUnsignedId($current_object->id_customer) && + ($customer = new Customer($current_object->id_customer)) && + Validate::isLoadedObject($customer)) { + $customer_filter = $customer->firstname . ' ' . $customer->lastname . ' (' . $customer->email . ')'; + } + + $gift_product_filter = ''; + if (Validate::isUnsignedId($current_object->gift_product) && + ($product = new Product($current_object->gift_product, false, $this->context->language->id)) && + Validate::isLoadedObject($product)) { + $gift_product_filter = (!empty($product->reference) ? $product->reference : $product->name); + } + + $reduction_product_filter = ''; + if (Validate::isUnsignedId($current_object->reduction_product) && + ($product = new Product($current_object->reduction_product, false, $this->context->language->id)) && + Validate::isLoadedObject($product)) { + $reduction_product_filter = (!empty($product->reference) ? $product->reference : $product->name); + } + + $product_rule_groups = $this->getProductRuleGroupsDisplay($current_object); + + $attribute_groups = AttributeGroup::getAttributesGroups($this->context->language->id); + $currencies = Currency::getCurrencies(false, true, true); + $languages = Language::getLanguages(); + $countries = $current_object->getAssociatedRestrictions('country', true, true); + $groups = $current_object->getAssociatedRestrictions('group', false, true); + $shops = $current_object->getAssociatedRestrictions('shop', false, false); + $cart_rules = $current_object->getAssociatedRestrictions('cart_rule', false, true, 0, $limit); + $carriers = $current_object->getAssociatedRestrictions('carrier', true, true); + + foreach ($carriers as &$carriers2) { + $prev_id_carrier = 0; + + foreach ($carriers2 as $key => &$carrier) { + if ($prev_id_carrier == $carrier['id_carrier']) { + unset($carriers2[$key]); + + continue; + } + + foreach ($carrier as $field => &$value) { + if ($field == 'name') { + if ($value == '0') { + $value = $carrier['id_carrier'] . ' - ' . Configuration::get('PS_SHOP_NAME'); + } else { + $value = $carrier['id_carrier'] . ' - ' . $carrier['name']; + if ($carrier['name']) { + $value .= ' (' . $carrier['delay'] . ')'; + } + } + } + } + + $prev_id_carrier = $carrier['id_carrier']; + } + } + + $gift_product_select = ''; + $gift_product_attribute_select = ''; + if ((int) $current_object->gift_product) { + $search_products = $this->searchProducts($gift_product_filter); + if (isset($search_products['products']) && is_array($search_products['products'])) { + foreach ($search_products['products'] as $product) { + $gift_product_select .= ' + '; + + if (count($product['combinations'])) { + $gift_product_attribute_select .= ''; + } + } + } + } + + $product = new Product($current_object->gift_product); + $this->context->smarty->assign( + [ + 'show_toolbar' => true, + 'toolbar_btn' => $this->toolbar_btn, + 'toolbar_scroll' => $this->toolbar_scroll, + 'title' => [$this->trans('Payment:', [], 'Admin.Catalog.Feature'), $this->trans('Cart Rules', [], 'Admin.Catalog.Feature')], + 'defaultDateFrom' => date('Y-m-d H:00:00'), + 'defaultDateTo' => date('Y-m-d H:00:00', strtotime('+1 month')), + 'customerFilter' => $customer_filter, + 'giftProductFilter' => $gift_product_filter, + 'gift_product_select' => $gift_product_select, + 'gift_product_attribute_select' => $gift_product_attribute_select, + 'reductionProductFilter' => $reduction_product_filter, + 'defaultCurrency' => Configuration::get('PS_CURRENCY_DEFAULT'), + 'id_lang_default' => Configuration::get('PS_LANG_DEFAULT'), + 'languages' => $languages, + 'currencies' => $currencies, + 'countries' => $countries, + 'carriers' => $carriers, + 'groups' => $groups, + 'shops' => $shops, + 'cart_rules' => $cart_rules, + 'product_rule_groups' => $product_rule_groups, + 'product_rule_groups_counter' => count($product_rule_groups), + 'attribute_groups' => $attribute_groups, + 'currentIndex' => self::$currentIndex, + 'currentToken' => $this->token, + 'currentObject' => $current_object, + 'currentTab' => $this, + 'hasAttribute' => $product->hasAttributes(), + ] + ); + Media::addJsDef(['baseHref' => $this->context->link->getAdminLink('AdminCartRules') . '&ajaxMode=1&ajax=1&id_cart_rule=' . + (int) Tools::getValue('id_cart_rule') . '&action=loadCartRules&limit=' . (int) $limit . '&count=0', ]); + $this->content .= $this->createTemplate('form.tpl')->fetch(); + + $this->addJqueryUI('ui.datepicker'); + $this->addJqueryPlugin(['jscroll', 'typewatch']); + + return parent::renderForm(); + } + + public function displayAjaxSearchCartRuleVouchers() + { + $found = false; + if ($vouchers = CartRule::getCartsRuleByCode(Tools::getValue('q'), (int) $this->context->language->id, true)) { + $found = true; + } + echo json_encode(['found' => $found, 'vouchers' => $vouchers]); + } + + /** + * For the listing, Override the method displayDeleteLink for the HelperList + * That allows to have links with all characters (like < & >) + * + * @param string $token + * @param string $id + * @param string|null $name + * + * @return string + */ + public function displayDeleteLink(string $token, string $id, ?string $name = null): string + { + if (!$this->access('delete')) { + return ''; + } + + $tpl = $this->createTemplate('helpers/list/list_action_delete.tpl'); + + if (!array_key_exists('Delete', self::$cache_lang)) { + self::$cache_lang['Delete'] = $this->trans('Delete', [], 'Admin.Actions'); + } + if (!array_key_exists('DeleteItem', self::$cache_lang)) { + self::$cache_lang['DeleteItem'] = $this->trans('Delete selected item?', [], 'Admin.Notifications.Info'); + } + if (!array_key_exists('Name', self::$cache_lang)) { + self::$cache_lang['Name'] = $this->trans('Name:', [], 'Admin.Shipping.Feature'); + } + + if (null !== $name) { + // \n\n is not between double quotes because in js/jquery/plugins/alerts/jquery.alerts.js, \n is replaced by
. + $name = '\n\n' . self::$cache_lang['Name'] . ' ' . $name; + } + + $data = [ + $this->identifier => $id, + 'href' => $this->context->link->getAdminLink( + 'AdminCartRules', + true, [], + [ + 'id_cart_rule' => (int) $id, + 'deletecart_rule' => 1, + ] + ), + 'action' => self::$cache_lang['Delete'], + ]; + + if ($this->specificConfirmDelete !== false) { + $data['confirm'] = null !== $this->specificConfirmDelete + ? '\r' . $this->specificConfirmDelete + : Tools::htmlentitiesDecodeUTF8(self::$cache_lang['DeleteItem'] . $name); + } + + $tpl->assign(array_merge($this->tpl_delete_link_vars, $data)); + + return $tpl->fetch(); + } +} diff --git a/controllers/admin/AdminCartsController.php b/controllers/admin/AdminCartsController.php new file mode 100644 index 0000000..86f4f16 --- /dev/null +++ b/controllers/admin/AdminCartsController.php @@ -0,0 +1,994 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property Cart $object + */ +class AdminCartsControllerCore extends AdminController +{ + public function __construct() + { + $this->bootstrap = true; + $this->table = 'cart'; + $this->className = 'Cart'; + $this->lang = false; + $this->explicitSelect = true; + + parent::__construct(); + + $this->addRowAction('view'); + $this->addRowAction('delete'); + $this->allow_export = true; + $this->_orderWay = 'DESC'; + + $this->_select = ' + CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) `customer`, + a.id_cart total, + ca.name carrier, + o.id_order, + IF ( + IFNULL(o.id_order, \'' . $this->trans('Non ordered', [], 'Admin.Orderscustomers.Feature') . '\') = \'' . $this->trans('Non ordered', [], 'Admin.Orderscustomers.Feature') . '\', + IF(TIME_TO_SEC(TIMEDIFF(\'' . pSQL(date('Y-m-d H:i:00', time())) . '\', a.`date_add`)) > 86400, \'' . $this->trans('Abandoned cart', [], 'Admin.Orderscustomers.Feature') . '\', + \'' . $this->trans('Non ordered', [], 'Admin.Orderscustomers.Feature') . '\'), + o.id_order + ) AS status, + IF(o.id_order, 1, 0) badge_success, + IF(o.id_order, 0, 1) badge_danger, + IF(co.id_guest, 1, 0) id_guest'; + $this->_join = 'LEFT JOIN ' . _DB_PREFIX_ . 'customer c ON (c.id_customer = a.id_customer) + LEFT JOIN ' . _DB_PREFIX_ . 'currency cu ON (cu.id_currency = a.id_currency) + LEFT JOIN ' . _DB_PREFIX_ . 'carrier ca ON (ca.id_carrier = a.id_carrier) + LEFT JOIN ' . _DB_PREFIX_ . 'orders o ON (o.id_cart = a.id_cart) + LEFT JOIN ( + SELECT DISTINCT `id_guest` + FROM `' . _DB_PREFIX_ . 'connections` + WHERE + TIME_TO_SEC(TIMEDIFF(\'' . pSQL(date('Y-m-d H:i:00', time())) . '\', `date_add`)) < 1800 + ) AS co ON co.`id_guest` = a.`id_guest`'; + + if (Tools::getValue('action') && Tools::getValue('action') == 'filterOnlyAbandonedCarts') { + $this->_having = 'status = \'' . $this->trans('Abandoned cart', [], 'Admin.Orderscustomers.Feature') . '\''; + } else { + $this->_use_found_rows = false; + } + + $this->fields_list = [ + 'id_cart' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'text-center', + 'class' => 'fixed-width-xs', + ], + 'status' => [ + 'title' => $this->trans('Order ID', [], 'Admin.Orderscustomers.Feature'), + 'align' => 'text-center', + 'badge_danger' => true, + 'havingFilter' => true, + ], + 'customer' => [ + 'title' => $this->trans('Customer', [], 'Admin.Global'), + 'filter_key' => 'c!lastname', + ], + 'total' => [ + 'title' => $this->trans('Total', [], 'Admin.Global'), + 'callback' => 'getOrderTotalUsingTaxCalculationMethod', + 'orderby' => false, + 'search' => false, + 'align' => 'text-right', + 'badge_success' => true, + ], + 'carrier' => [ + 'title' => $this->trans('Carrier', [], 'Admin.Shipping.Feature'), + 'align' => 'text-left', + 'callback' => 'replaceZeroByShopName', + 'filter_key' => 'ca!name', + ], + 'date_add' => [ + 'title' => $this->trans('Date', [], 'Admin.Global'), + 'align' => 'text-left', + 'type' => 'datetime', + 'class' => 'fixed-width-lg', + 'filter_key' => 'a!date_add', + ], + ]; + + if (Configuration::get('PS_GUEST_CHECKOUT_ENABLED')) { + $this->fields_list['id_guest'] = [ + 'title' => $this->trans('Online', [], 'Admin.Global'), + 'align' => 'text-center', + 'type' => 'bool', + 'havingFilter' => true, + 'class' => 'fixed-width-xs', + ]; + } + + $this->shopLinkType = 'shop'; + + $this->bulk_actions = [ + 'delete' => [ + 'text' => $this->trans('Delete selected', [], 'Admin.Actions'), + 'confirm' => $this->trans('Delete selected items?', [], 'Admin.Notifications.Warning'), + 'icon' => 'icon-trash', + ], + ]; + } + + public function initPageHeaderToolbar() + { + if (empty($this->display)) { + $this->page_header_toolbar_btn['export_cart'] = [ + 'href' => self::$currentIndex . '&exportcart&token=' . $this->token, + 'desc' => $this->trans('Export carts', [], 'Admin.Orderscustomers.Feature'), + 'icon' => 'process-icon-export', + ]; + } + + parent::initPageHeaderToolbar(); + } + + public function renderKpis() + { + $time = time(); + $kpis = []; + + /* The data generation is located in AdminStatsControllerCore */ + $helper = new HelperKpi(); + $helper->id = 'box-conversion-rate'; + $helper->icon = 'icon-sort-by-attributes-alt'; + //$helper->chart = true; + $helper->color = 'color1'; + $helper->title = $this->trans('Conversion Rate', [], 'Admin.Global'); + $helper->subtitle = $this->trans('30 days', [], 'Admin.Global'); + if (ConfigurationKPI::get('CONVERSION_RATE') !== false) { + $helper->value = ConfigurationKPI::get('CONVERSION_RATE'); + } + if (ConfigurationKPI::get('CONVERSION_RATE_CHART') !== false) { + $helper->data = ConfigurationKPI::get('CONVERSION_RATE_CHART'); + } + $helper->source = $this->context->link->getAdminLink('AdminStats') . '&ajax=1&action=getKpi&kpi=conversion_rate'; + $helper->refresh = (bool) (ConfigurationKPI::get('CONVERSION_RATE_EXPIRE') < $time); + $kpis[] = $helper->generate(); + + $helper = new HelperKpi(); + $helper->id = 'box-carts'; + $helper->icon = 'icon-shopping-cart'; + $helper->color = 'color2'; + $helper->title = $this->trans('Abandoned Carts', [], 'Admin.Orderscustomers.Feature'); + $date_from = date(Context::getContext()->language->date_format_lite, strtotime('-2 day')); + $date_to = date(Context::getContext()->language->date_format_lite, strtotime('-1 day')); + $helper->subtitle = $this->trans('From %date1% to %date2%', ['%date1%' => $date_from, '%date2%' => $date_to], 'Admin.Orderscustomers.Feature'); + $helper->href = $this->context->link->getAdminLink('AdminCarts') . '&action=filterOnlyAbandonedCarts'; + if (ConfigurationKPI::get('ABANDONED_CARTS') !== false) { + $helper->value = ConfigurationKPI::get('ABANDONED_CARTS'); + } + $helper->source = $this->context->link->getAdminLink('AdminStats') . '&ajax=1&action=getKpi&kpi=abandoned_cart'; + $helper->refresh = (bool) (ConfigurationKPI::get('ABANDONED_CARTS_EXPIRE') < $time); + $kpis[] = $helper->generate(); + + $helper = new HelperKpi(); + $helper->id = 'box-average-order'; + $helper->icon = 'icon-money'; + $helper->color = 'color3'; + $helper->title = $this->trans('Average Order Value', [], 'Admin.Orderscustomers.Feature'); + $helper->subtitle = $this->trans('30 days', [], 'Admin.Global'); + if (ConfigurationKPI::get('AVG_ORDER_VALUE') !== false) { + $helper->value = $this->trans('%amount% tax excl.', ['%amount%' => ConfigurationKPI::get('AVG_ORDER_VALUE')], 'Admin.Orderscustomers.Feature'); + } + if (ConfigurationKPI::get('AVG_ORDER_VALUE_EXPIRE') < $time) { + $helper->source = $this->context->link->getAdminLink('AdminStats') . '&ajax=1&action=getKpi&kpi=average_order_value'; + } + $kpis[] = $helper->generate(); + + $helper = new HelperKpi(); + $helper->id = 'box-net-profit-visitor'; + $helper->icon = 'icon-user'; + $helper->color = 'color4'; + $helper->title = $this->trans('Net Profit per Visitor', [], 'Admin.Orderscustomers.Feature'); + $helper->subtitle = $this->trans('30 days', [], 'Admin.Global'); + if (ConfigurationKPI::get('NETPROFIT_VISITOR') !== false) { + $helper->value = ConfigurationKPI::get('NETPROFIT_VISITOR'); + } + $helper->source = $this->context->link->getAdminLink('AdminStats') . '&ajax=1&action=getKpi&kpi=netprofit_visitor'; + $helper->refresh = (bool) (ConfigurationKPI::get('NETPROFIT_VISITOR_EXPIRE') < $time); + $kpis[] = $helper->generate(); + + $helper = new HelperKpiRow(); + $helper->kpis = $kpis; + + return $helper->generate(); + } + + public function renderView() + { + /** @var Cart $cart */ + if (!($cart = $this->loadObject(true))) { + return; + } + $customer = new Customer($cart->id_customer); + $currency = new Currency($cart->id_currency); + $this->context->cart = $cart; + $this->context->currency = $currency; + $this->context->customer = $customer; + $this->toolbar_title = $this->trans('Cart #%ID%', ['%ID%' => $this->context->cart->id], 'Admin.Orderscustomers.Feature'); + $products = $cart->getProducts(); + $summary = $cart->getSummaryDetails(); + + /* Display order information */ + $id_order = (int) Order::getIdByCartId($cart->id); + $order = new Order($id_order); + if (Validate::isLoadedObject($order)) { + $tax_calculation_method = $order->getTaxCalculationMethod(); + $id_shop = (int) $order->id_shop; + } else { + $id_shop = (int) $cart->id_shop; + $tax_calculation_method = Group::getPriceDisplayMethod(Group::getCurrent()->id); + } + + if ($tax_calculation_method == PS_TAX_EXC) { + $total_products = $summary['total_products']; + $total_discounts = $summary['total_discounts_tax_exc']; + $total_wrapping = $summary['total_wrapping_tax_exc']; + $total_price = $summary['total_price_without_tax']; + $total_shipping = $summary['total_shipping_tax_exc']; + } else { + $total_products = $summary['total_products_wt']; + $total_discounts = $summary['total_discounts']; + $total_wrapping = $summary['total_wrapping']; + $total_price = $summary['total_price']; + $total_shipping = $summary['total_shipping']; + } + foreach ($products as &$product) { + if ($tax_calculation_method == PS_TAX_EXC) { + $product['product_price'] = $product['price']; + $product['product_total'] = $product['total']; + } else { + $product['product_price'] = $product['price_wt']; + $product['product_total'] = $product['total_wt']; + } + $image = []; + if (isset($product['id_product_attribute']) && (int) $product['id_product_attribute']) { + $image = Db::getInstance()->getRow('SELECT id_image FROM ' . _DB_PREFIX_ . 'product_attribute_image WHERE id_product_attribute = ' . (int) $product['id_product_attribute']); + } + if (!isset($image['id_image'])) { + $image = Db::getInstance()->getRow('SELECT id_image FROM ' . _DB_PREFIX_ . 'image WHERE id_product = ' . (int) $product['id_product'] . ' AND cover = 1'); + } + + $product['qty_in_stock'] = StockAvailable::getQuantityAvailableByProduct($product['id_product'], isset($product['id_product_attribute']) ? $product['id_product_attribute'] : null, (int) $id_shop); + + $image_product = new Image($image['id_image']); + $product['image'] = (isset($image['id_image']) ? ImageManager::thumbnail(_PS_IMG_DIR_ . 'p/' . $image_product->getExistingImgPath() . '.jpg', 'product_mini_' . (int) $product['id_product'] . (isset($product['id_product_attribute']) ? '_' . (int) $product['id_product_attribute'] : '') . '.jpg', 45, 'jpg') : '--'); + + $customized_datas = Product::getAllCustomizedDatas($this->context->cart->id, null, true, null, (int) $product['id_customization']); + $this->context->cart->setProductCustomizedDatas($product, $customized_datas); + if ($customized_datas) { + Product::addProductCustomizationPrice($product, $customized_datas); + } + } + + $helper = new HelperKpi(); + $helper->id = 'box-kpi-cart'; + $helper->icon = 'icon-shopping-cart'; + $helper->color = 'color1'; + $helper->title = $this->trans('Total Cart', [], 'Admin.Orderscustomers.Feature'); + $helper->subtitle = $this->trans('Cart #%ID%', ['%ID%' => $cart->id], 'Admin.Orderscustomers.Feature'); + $helper->value = $this->context->getCurrentLocale()->formatPrice($total_price, $currency->iso_code); + $kpi = $helper->generate(); + + $this->tpl_view_vars = [ + 'kpi' => $kpi, + 'products' => $products, + 'discounts' => $cart->getCartRules(), + 'order' => $order, + 'cart' => $cart, + 'currency' => $currency, + 'customer' => $customer, + 'customer_stats' => $customer->getStats(), + 'total_products' => $total_products, + 'total_discounts' => $total_discounts, + 'total_wrapping' => $total_wrapping, + 'total_price' => $total_price, + 'total_shipping' => $total_shipping, + 'tax_calculation_method' => $tax_calculation_method, + ]; + + return parent::renderView(); + } + + public function ajaxPreProcess() + { + if ($this->access('edit')) { + $id_customer = (int) Tools::getValue('id_customer'); + $customer = new Customer((int) $id_customer); + $this->context->customer = $customer; + $id_cart = (int) Tools::getValue('id_cart'); + if (!$id_cart) { + $id_cart = $customer->getLastEmptyCart(false); + } + $this->context->cart = new Cart((int) $id_cart); + + if (!$this->context->cart->id) { + $this->context->cart->recyclable = 0; + $this->context->cart->gift = 0; + } + + if (!$this->context->cart->id_customer) { + $this->context->cart->id_customer = $id_customer; + } + if (Validate::isLoadedObject($this->context->cart) && $this->context->cart->OrderExists()) { + return; + } + if (!$this->context->cart->secure_key) { + $this->context->cart->secure_key = $this->context->customer->secure_key; + } + if (!$this->context->cart->id_shop) { + $this->context->cart->id_shop = (int) $this->context->shop->id; + } + if (!$this->context->cart->id_lang) { + $this->context->cart->id_lang = (($id_lang = (int) Tools::getValue('id_lang')) ? $id_lang : Configuration::get('PS_LANG_DEFAULT')); + } + if (!$this->context->cart->id_currency) { + $this->context->cart->id_currency = (($id_currency = (int) Tools::getValue('id_currency')) ? $id_currency : Configuration::get('PS_CURRENCY_DEFAULT')); + } + + $addresses = $customer->getAddresses((int) $this->context->cart->id_lang); + $id_address_delivery = (int) Tools::getValue('id_address_delivery'); + $id_address_invoice = (int) Tools::getValue('id_address_delivery'); + + if (!$this->context->cart->id_address_invoice && isset($addresses[0])) { + $this->context->cart->id_address_invoice = (int) $addresses[0]['id_address']; + } elseif ($id_address_invoice) { + $this->context->cart->id_address_invoice = (int) $id_address_invoice; + } + if (!$this->context->cart->id_address_delivery && isset($addresses[0])) { + $this->context->cart->id_address_delivery = $addresses[0]['id_address']; + } elseif ($id_address_delivery) { + $this->context->cart->id_address_delivery = (int) $id_address_delivery; + } + $this->context->cart->setNoMultishipping(); + $this->context->cart->save(); + $currency = new Currency((int) $this->context->cart->id_currency); + $this->context->currency = $currency; + } + } + + public function ajaxProcessDeleteProduct() + { + if ($this->access('edit')) { + $errors = []; + if ((!$id_product = (int) Tools::getValue('id_product')) || !Validate::isInt($id_product)) { + $errors[] = $this->trans('Invalid product', [], 'Admin.Catalog.Notification'); + } + if (($id_product_attribute = (int) Tools::getValue('id_product_attribute')) && !Validate::isInt($id_product_attribute)) { + $errors[] = $this->trans('Invalid combination', [], 'Admin.Catalog.Notification'); + } + if (count($errors)) { + die(json_encode($errors)); + } + if ($this->context->cart->deleteProduct($id_product, $id_product_attribute, (int) Tools::getValue('id_customization'))) { + echo json_encode($this->ajaxReturnVars()); + } + } + } + + public function ajaxProcessUpdateCustomizationFields() + { + $errors = []; + if ($this->access('edit')) { + $errors = []; + if (Tools::getValue('only_display') != 1) { + if (!$this->context->cart->id || (!$id_product = (int) Tools::getValue('id_product'))) { + return; + } + $product = new Product((int) $id_product); + if (!$customization_fields = $product->getCustomizationFieldIds()) { + return; + } + foreach ($customization_fields as $customization_field) { + $field_id = 'customization_' . $id_product . '_' . $customization_field['id_customization_field']; + if ($customization_field['type'] == Product::CUSTOMIZE_TEXTFIELD) { + if (!Tools::getValue($field_id)) { + if ($customization_field['required']) { + $errors[] = $this->trans('Please fill in all the required fields.', [], 'Admin.Notifications.Error'); + } + + continue; + } + if (!Validate::isMessage(Tools::getValue($field_id))) { + $errors[] = $this->trans('Invalid message', [], 'Admin.Notifications.Error'); + } + $this->context->cart->addTextFieldToProduct((int) $product->id, (int) $customization_field['id_customization_field'], Product::CUSTOMIZE_TEXTFIELD, Tools::getValue($field_id)); + } elseif ($customization_field['type'] == Product::CUSTOMIZE_FILE) { + if (!isset($_FILES[$field_id]) || !isset($_FILES[$field_id]['tmp_name']) || empty($_FILES[$field_id]['tmp_name'])) { + if ($customization_field['required']) { + $errors[] = $this->trans('Please fill in all the required fields.', [], 'Admin.Notifications.Error'); + } + + continue; + } + if ($error = ImageManager::validateUpload($_FILES[$field_id], (int) Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE'))) { + $errors[] = $error; + } + if (!($tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS')) || !move_uploaded_file($_FILES[$field_id]['tmp_name'], $tmp_name)) { + $errors[] = $this->trans('An error occurred during the image upload process.', [], 'Admin.Catalog.Notification'); + } + $file_name = md5(uniqid(mt_rand(0, mt_getrandmax()), true)); + if (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_ . $file_name)) { + continue; + } elseif (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_ . $file_name . '_small', (int) Configuration::get('PS_PRODUCT_PICTURE_WIDTH'), (int) Configuration::get('PS_PRODUCT_PICTURE_HEIGHT'))) { + $errors[] = $this->trans('An error occurred during the image upload process.', [], 'Admin.Catalog.Notification'); + } else { + $this->context->cart->addPictureToProduct((int) $product->id, (int) $customization_field['id_customization_field'], Product::CUSTOMIZE_FILE, $file_name); + } + unlink($tmp_name); + } + } + } + $this->setMedia(false); + $this->initFooter(); + $this->context->smarty->assign(['customization_errors' => implode('
', $errors), + 'css_files' => $this->css_files, ]); + + return $this->smartyOutputContent('controllers/orders/form_customization_feedback.tpl'); + } + } + + public function ajaxProcessUpdateQty() + { + if ($this->access('edit')) { + $errors = []; + if (!$this->context->cart->id) { + return; + } + if ($this->context->cart->OrderExists()) { + $errors[] = $this->trans('An order has already been placed with this cart.', [], 'Admin.Catalog.Notification'); + } elseif (!($id_product = (int) Tools::getValue('id_product')) || !($product = new Product((int) $id_product, true, $this->context->language->id))) { + $errors[] = $this->trans('Invalid product', [], 'Admin.Catalog.Notification'); + } elseif (!($qty = Tools::getValue('qty')) || $qty == 0) { + $errors[] = $this->trans('Invalid quantity', [], 'Admin.Catalog.Notification'); + } + + // Don't try to use a product if not instanciated before due to errors + if (isset($product) && $product->id) { + if (($id_product_attribute = Tools::getValue('id_product_attribute')) != 0) { + if (!Product::isAvailableWhenOutOfStock($product->out_of_stock) && !Attribute::checkAttributeQty((int) $id_product_attribute, (int) $qty)) { + $errors[] = $this->trans('There are not enough products in stock.', [], 'Admin.Catalog.Notification'); + } + } elseif (!$product->checkQty((int) $qty)) { + $errors[] = $this->trans('There are not enough products in stock.', [], 'Admin.Catalog.Notification'); + } + if (!($id_customization = (int) Tools::getValue('id_customization', 0)) && !$product->hasAllRequiredCustomizableFields()) { + $errors[] = $this->trans('Please fill in all the required fields.', [], 'Admin.Notifications.Error'); + } + $this->context->cart->save(); + } else { + $errors[] = $this->trans('This product cannot be added to the cart.', [], 'Admin.Catalog.Notification'); + } + + if (!count($errors)) { + if ((int) $qty < 0) { + $qty = str_replace('-', '', $qty); + $operator = 'down'; + } else { + $operator = 'up'; + } + + if (!($qty_upd = $this->context->cart->updateQty($qty, $id_product, (int) $id_product_attribute, (int) $id_customization, $operator))) { + $errors[] = $this->trans('You already have the maximum quantity available for this product.', [], 'Admin.Catalog.Notification'); + } elseif ($qty_upd < 0) { + $minimal_qty = $id_product_attribute ? Attribute::getAttributeMinimalQty((int) $id_product_attribute) : $product->minimal_quantity; + $errors[] = $this->trans('You must add a minimum quantity of %d', [$minimal_qty], 'Admin.Orderscustomers.Notification'); + } + } + + echo json_encode(array_merge($this->ajaxReturnVars(), ['errors' => $errors])); + } + } + + public function ajaxProcessUpdateDeliveryOption() + { + if ($this->access('edit')) { + $delivery_option = Tools::getValue('delivery_option'); + if ($delivery_option !== false) { + $this->context->cart->setDeliveryOption([$this->context->cart->id_address_delivery => $delivery_option]); + } + if (Validate::isBool(($recyclable = (int) Tools::getValue('recyclable')))) { + $this->context->cart->recyclable = $recyclable; + } + if (Validate::isBool(($gift = (int) Tools::getValue('gift')))) { + $this->context->cart->gift = $gift; + } + if (Validate::isMessage(($gift_message = pSQL(Tools::getValue('gift_message'))))) { + $this->context->cart->gift_message = $gift_message; + } + $this->context->cart->save(); + echo json_encode($this->ajaxReturnVars()); + } + } + + public function ajaxProcessUpdateOrderMessage() + { + if ($this->access('edit')) { + $id_message = false; + if ($old_message = Message::getMessageByCartId((int) $this->context->cart->id)) { + $id_message = $old_message['id_message']; + } + $message = new Message((int) $id_message); + if ($message_content = Tools::getValue('message')) { + if (Validate::isMessage($message_content)) { + $message->message = $message_content; + $message->id_cart = (int) $this->context->cart->id; + $message->id_customer = (int) $this->context->cart->id_customer; + $message->save(); + } + } elseif (Validate::isLoadedObject($message)) { + $message->delete(); + } + echo json_encode($this->ajaxReturnVars()); + } + } + + public function ajaxProcessUpdateCurrency() + { + if ($this->access('edit')) { + $currency = new Currency((int) Tools::getValue('id_currency')); + if (Validate::isLoadedObject($currency) && !$currency->deleted && $currency->active) { + $this->context->cart->id_currency = (int) $currency->id; + $this->context->currency = $currency; + $this->context->cart->save(); + } + echo json_encode($this->ajaxReturnVars()); + } + } + + public function ajaxProcessUpdateLang() + { + if ($this->access('edit')) { + $lang = new Language((int) Tools::getValue('id_lang')); + if (Validate::isLoadedObject($lang) && $lang->active) { + $this->context->cart->id_lang = (int) $lang->id; + $this->context->cart->save(); + } + echo json_encode($this->ajaxReturnVars()); + } + } + + public function ajaxProcessDuplicateOrder() + { + if ($this->access('edit')) { + $errors = []; + if (!$id_order = Tools::getValue('id_order')) { + $errors[] = $this->trans('Invalid order', [], 'Admin.Orderscustomers.Notification'); + } + $cart = Cart::getCartByOrderId($id_order); + $new_cart = $cart->duplicate(); + if (!$new_cart || !Validate::isLoadedObject($new_cart['cart'])) { + $errors[] = $this->trans('The order cannot be renewed.', [], 'Admin.Orderscustomers.Notification'); + } elseif (!$new_cart['success']) { + $errors[] = $this->trans('The order cannot be renewed.', [], 'Admin.Orderscustomers.Notification'); + } else { + $this->context->cart = $new_cart['cart']; + echo json_encode($this->ajaxReturnVars()); + } + } + } + + public function ajaxProcessDeleteVoucher() + { + if ($this->access('edit')) { + if ($this->context->cart->removeCartRule((int) Tools::getValue('id_cart_rule'))) { + echo json_encode($this->ajaxReturnVars()); + } + } + } + + public function ajaxProcessupdateFreeShipping() + { + if ($this->access('edit')) { + if (!$id_cart_rule = CartRule::getIdByCode(CartRule::BO_ORDER_CODE_PREFIX . (int) $this->context->cart->id)) { + $cart_rule = new CartRule(); + $cart_rule->code = CartRule::BO_ORDER_CODE_PREFIX . (int) $this->context->cart->id; + $cart_rule->name = [Configuration::get('PS_LANG_DEFAULT') => $this->trans('Free Shipping', [], 'Admin.Orderscustomers.Feature')]; + $cart_rule->id_customer = (int) $this->context->cart->id_customer; + $cart_rule->free_shipping = true; + $cart_rule->quantity = 1; + $cart_rule->quantity_per_user = 1; + $cart_rule->minimum_amount_currency = (int) $this->context->cart->id_currency; + $cart_rule->reduction_currency = (int) $this->context->cart->id_currency; + $cart_rule->date_from = date('Y-m-d H:i:s', time()); + $cart_rule->date_to = date('Y-m-d H:i:s', time() + 24 * 36000); + $cart_rule->active = 1; + $cart_rule->add(); + } else { + $cart_rule = new CartRule((int) $id_cart_rule); + } + + $this->context->cart->removeCartRule((int) $cart_rule->id); + if (Tools::getValue('free_shipping')) { + $this->context->cart->addCartRule((int) $cart_rule->id); + } + + echo json_encode($this->ajaxReturnVars()); + } + } + + public function ajaxProcessAddVoucher() + { + if ($this->access('edit')) { + $errors = []; + if (!($id_cart_rule = Tools::getValue('id_cart_rule')) || !$cart_rule = new CartRule((int) $id_cart_rule)) { + $errors[] = $this->trans('Invalid voucher.', [], 'Admin.Catalog.Notification'); + } elseif ($err = $cart_rule->checkValidity($this->context)) { + $errors[] = $err; + } + if (!count($errors)) { + if (!$this->context->cart->addCartRule((int) $cart_rule->id)) { + $errors[] = $this->trans('Can\'t add the voucher.', [], 'Admin.Advparameters.Notification'); + } + } + echo json_encode(array_merge($this->ajaxReturnVars(), ['errors' => $errors])); + } + } + + public function ajaxProcessUpdateAddress() + { + if ($this->access('edit')) { + echo json_encode(['addresses' => $this->context->customer->getAddresses((int) $this->context->cart->id_lang)]); + } + } + + public function ajaxProcessUpdateAddresses() + { + if ($this->access('edit')) { + if (($id_address_delivery = (int) Tools::getValue('id_address_delivery')) && + ($address_delivery = new Address((int) $id_address_delivery)) && + $address_delivery->id_customer == $this->context->cart->id_customer) { + $this->context->cart->id_address_delivery = (int) $address_delivery->id; + } + + if (($id_address_invoice = (int) Tools::getValue('id_address_invoice')) && + ($address_invoice = new Address((int) $id_address_invoice)) && + $address_invoice->id_customer = $this->context->cart->id_customer) { + $this->context->cart->id_address_invoice = (int) $address_invoice->id; + } + $this->context->cart->save(); + + echo json_encode($this->ajaxReturnVars()); + } + } + + protected function getCartSummary() + { + $summary = $this->context->cart->getSummaryDetails(null, true); + $currency = Context::getContext()->currency; + if (count($summary['products'])) { + foreach ($summary['products'] as &$product) { + $product['numeric_price'] = $product['price']; + $product['numeric_total'] = $product['total']; + $product['price'] = str_replace($currency->symbol, '', $this->context->getCurrentLocale()->formatPrice($product['price'], $currency->iso_code)); + $product['total'] = str_replace($currency->symbol, '', $this->context->getCurrentLocale()->formatPrice($product['total'], $currency->iso_code)); + $product['image_link'] = $this->context->link->getImageLink($product['link_rewrite'], $product['id_image'], 'small_default'); + if (!isset($product['attributes_small'])) { + $product['attributes_small'] = ''; + } + $product['customized_datas'] = Product::getAllCustomizedDatas((int) $this->context->cart->id, null, true, null, (int) $product['id_customization']); + } + } + if (count($summary['discounts'])) { + foreach ($summary['discounts'] as &$voucher) { + $voucher['value_real'] = $this->context->getCurrentLocale()->formatPrice($voucher['value_real'], $currency->iso_code); + } + } + + if (isset($summary['gift_products']) && count($summary['gift_products'])) { + foreach ($summary['gift_products'] as &$product) { + $product['image_link'] = $this->context->link->getImageLink($product['link_rewrite'], $product['id_image'], 'small_default'); + if (!isset($product['attributes_small'])) { + $product['attributes_small'] = ''; + } + } + } + + return $summary; + } + + protected function getDeliveryOptionList() + { + $delivery_option_list_formated = []; + $delivery_option_list = $this->context->cart->getDeliveryOptionList(); + + if (!count($delivery_option_list)) { + return []; + } + + $id_default_carrier = (int) Configuration::get('PS_CARRIER_DEFAULT'); + foreach (current($delivery_option_list) as $key => $delivery_option) { + $name = ''; + $first = true; + $id_default_carrier_delivery = false; + foreach ($delivery_option['carrier_list'] as $carrier) { + if (!$first) { + $name .= ', '; + } else { + $first = false; + } + + $name .= $carrier['instance']->name; + + if ($delivery_option['unique_carrier']) { + $name .= ' - ' . $carrier['instance']->delay[$this->context->employee->id_lang]; + } + + if (!$id_default_carrier_delivery) { + $id_default_carrier_delivery = (int) $carrier['instance']->id; + } + if ($carrier['instance']->id == $id_default_carrier) { + $id_default_carrier_delivery = $id_default_carrier; + } + if (!$this->context->cart->id_carrier) { + $this->context->cart->setDeliveryOption([$this->context->cart->id_address_delivery => (int) $carrier['instance']->id . ',']); + $this->context->cart->save(); + } + } + $delivery_option_list_formated[] = ['name' => $name, 'key' => $key]; + } + + return $delivery_option_list_formated; + } + + public function displayAjaxSearchCarts() + { + $id_customer = (int) Tools::getValue('id_customer'); + $carts = Cart::getCustomerCarts((int) $id_customer, false); + $orders = Order::getCustomerOrders((int) $id_customer); + + if (count($carts)) { + foreach ($carts as $key => &$cart) { + $cart_obj = new Cart((int) $cart['id_cart']); + if ($cart['id_cart'] == $this->context->cart->id) { + unset($carts[$key]); + + continue; + } + $currency = new Currency((int) $cart['id_currency']); + $cart['total_price'] = $this->context->getCurrentLocale()->formatPrice($cart_obj->getOrderTotal(), $currency->iso_code); + } + } + if (count($orders)) { + foreach ($orders as &$order) { + $currency = new Currency((int) $order['id_currency']); + $order['total_paid_real'] = $this->context->getCurrentLocale()->formatPrice($order['total_paid_real'], $currency->iso_code); + } + } + if ($orders || $carts) { + $to_return = array_merge( + $this->ajaxReturnVars(), + [ + 'carts' => $carts, + 'orders' => $orders, + 'found' => true, + ] + ); + } else { + $to_return = array_merge($this->ajaxReturnVars(), ['found' => false]); + } + + echo json_encode($to_return); + } + + public function ajaxReturnVars() + { + $id_cart = (int) $this->context->cart->id; + $message_content = ''; + if ($message = Message::getMessageByCartId((int) $this->context->cart->id)) { + $message_content = $message['message']; + } + $cart_rules = $this->context->cart->getCartRules(CartRule::FILTER_ACTION_SHIPPING); + + $free_shipping = false; + if (count($cart_rules)) { + foreach ($cart_rules as $cart_rule) { + if ($cart_rule['id_cart_rule'] == CartRule::getIdByCode(CartRule::BO_ORDER_CODE_PREFIX . (int) $this->context->cart->id)) { + $free_shipping = true; + + break; + } + } + } + + $addresses = $this->context->customer->getAddresses((int) $this->context->cart->id_lang); + + foreach ($addresses as &$data) { + $address = new Address((int) $data['id_address']); + $data['formated_address'] = AddressFormat::generateAddress($address, [], '
'); + } + + return [ + 'summary' => $this->getCartSummary(), + 'delivery_option_list' => $this->getDeliveryOptionList(), + 'cart' => $this->context->cart, + 'currency' => new Currency($this->context->cart->id_currency), + 'addresses' => $addresses, + 'id_cart' => $id_cart, + 'order_message' => $message_content, + 'link_order' => $this->context->link->getPageLink( + 'order', + false, + (int) $this->context->cart->id_lang, + 'step=3&recover_cart=' . $id_cart . '&token_cart=' . md5(_COOKIE_KEY_ . 'recover_cart_' . $id_cart) + ), + 'free_shipping' => (int) $free_shipping, + ]; + } + + public function initToolbar() + { + parent::initToolbar(); + unset($this->toolbar_btn['new']); + } + + /** + * Display an image as a download. + */ + public function displayAjaxCustomizationImage() + { + if (!Tools::isSubmit('img') || !Tools::isSubmit('name')) { + return; + } + + $img = Tools::getValue('img'); + $name = Tools::getValue('name'); + $path = _PS_UPLOAD_DIR_ . $img; + + if (Validate::isMd5($img) && Validate::isGenericName($path)) { + header('Content-type: image/jpeg'); + header('Content-Disposition: attachment; filename="' . $name . '.jpg"'); + readfile($path); + } + } + + public function displayAjaxGetSummary() + { + echo json_encode($this->ajaxReturnVars()); + } + + public function ajaxProcessUpdateProductPrice() + { + if ($this->access('edit')) { + SpecificPrice::deleteByIdCart((int) $this->context->cart->id, (int) Tools::getValue('id_product'), (int) Tools::getValue('id_product_attribute')); + $specific_price = new SpecificPrice(); + $specific_price->id_cart = (int) $this->context->cart->id; + $specific_price->id_shop = 0; + $specific_price->id_shop_group = 0; + $specific_price->id_currency = 0; + $specific_price->id_country = 0; + $specific_price->id_group = 0; + $specific_price->id_customer = (int) $this->context->customer->id; + $specific_price->id_product = (int) Tools::getValue('id_product'); + $specific_price->id_product_attribute = (int) Tools::getValue('id_product_attribute'); + $specific_price->price = (float) Tools::getValue('price'); + $specific_price->from_quantity = 1; + $specific_price->reduction = 0; + $specific_price->reduction_type = 'amount'; + $specific_price->from = '0000-00-00 00:00:00'; + $specific_price->to = '0000-00-00 00:00:00'; + $specific_price->add(); + echo json_encode($this->ajaxReturnVars()); + } + } + + public static function getOrderTotalUsingTaxCalculationMethod($id_cart) + { + $context = Context::getContext(); + $context->cart = new Cart($id_cart); + $context->currency = new Currency((int) $context->cart->id_currency); + $context->customer = new Customer((int) $context->cart->id_customer); + + return Cart::getTotalCart($id_cart, true, Cart::BOTH_WITHOUT_SHIPPING); + } + + public static function replaceZeroByShopName($echo, $tr) + { + return $echo == '0' ? Carrier::getCarrierNameFromShopName() : $echo; + } + + public function displayDeleteLink($token, $id, $name = null) + { + // don't display ordered carts + foreach ($this->_list as $row) { + if ($row['id_cart'] == $id && isset($row['id_order']) && is_numeric($row['id_order'])) { + return; + } + } + + return $this->helper->displayDeleteLink($token, $id, $name); + } + + public function renderList() + { + if (!($this->fields_list && is_array($this->fields_list))) { + return false; + } + $this->getList($this->context->language->id); + + $helper = new HelperList(); + + // Empty list is ok + if (!is_array($this->_list)) { + $this->displayWarning($this->trans('Bad SQL query', [], 'Admin.Notifications.Error') . '
' . htmlspecialchars($this->_list_error)); + + return false; + } + + $this->setHelperDisplay($helper); + $helper->tpl_vars = $this->tpl_list_vars; + $helper->tpl_delete_link_vars = $this->tpl_delete_link_vars; + + // For compatibility reasons, we have to check standard actions in class attributes + foreach ($this->actions_available as $action) { + if (!in_array($action, $this->actions) && isset($this->$action) && $this->$action) { + $this->actions[] = $action; + } + } + $helper->is_cms = $this->is_cms; + $skip_list = []; + + foreach ($this->_list as $row) { + if (isset($row['id_order']) && is_numeric($row['id_order'])) { + $skip_list[] = $row['id_cart']; + } + } + + if (array_key_exists('delete', $helper->list_skip_actions)) { + $helper->list_skip_actions['delete'] = array_merge($helper->list_skip_actions['delete'], (array) $skip_list); + } else { + $helper->list_skip_actions['delete'] = (array) $skip_list; + } + + $list = $helper->generateList($this->_list, $this->fields_list); + + return $list; + } + + /** + * @param string|null $orderBy + * @param string|null $orderDirection + * + * @return string + * + * @throws PrestaShopException + */ + protected function getOrderByClause($orderBy, $orderDirection) + { + $this->_orderBy = $this->checkOrderBy($orderBy); + $this->_orderWay = $this->checkOrderDirection($orderDirection); + + if ($this->_orderBy == 'status') { + return ' ORDER BY CAST(status AS unsigned)' . $this->_orderWay . + ($this->_tmpTableFilter ? ') tmpTable WHERE 1' . $this->_tmpTableFilter : ''); + } + + return parent::getOrderByClause($orderBy, $orderDirection); + } +} diff --git a/controllers/admin/AdminCmsCategoriesController.php b/controllers/admin/AdminCmsCategoriesController.php new file mode 100644 index 0000000..5359720 --- /dev/null +++ b/controllers/admin/AdminCmsCategoriesController.php @@ -0,0 +1,320 @@ + + * @copyright 2007-2019 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +/** + * @property CMSCategory $object + */ +class AdminCmsCategoriesControllerCore extends AdminController +{ + /** @var object CMSCategory() instance for navigation */ + protected $cms_category; + + protected $position_identifier = 'id_cms_category_to_move'; + + /** + * @deprecated since 1.7.6, to be removed in the next minor + */ + public function __construct() + { + @trigger_error( + 'The AdminCmsCategoriesController is deprecated and will be removed in the next minor', + E_USER_DEPRECATED + ); + + $this->bootstrap = true; + $this->is_cms = true; + $this->table = 'cms_category'; + $this->list_id = 'cms_category'; + $this->className = 'CMSCategory'; + $this->lang = true; + $this->addRowAction('view'); + $this->addRowAction('edit'); + $this->addRowAction('delete'); + $this->_orderBy = 'position'; + + parent::__construct(); + + $this->bulk_actions = array( + 'delete' => array( + 'text' => $this->trans('Delete selected', array(), 'Admin.Actions'), + 'confirm' => $this->trans('Delete selected items?', array(), 'Admin.Notifications.Warning'), + 'icon' => 'icon-trash', + ), + ); + $this->tpl_list_vars['icon'] = 'icon-folder-close'; + $this->tpl_list_vars['title'] = $this->trans('Categories', array(), 'Admin.Catalog.Feature'); + $this->fields_list = array( + 'id_cms_category' => array('title' => $this->trans('ID', array(), 'Admin.Global'), 'align' => 'center', 'class' => 'fixed-width-xs'), + 'name' => array('title' => $this->trans('Name', array(), 'Admin.Global'), 'width' => 'auto', 'callback' => 'hideCMSCategoryPosition', 'callback_object' => 'CMSCategory'), + 'description' => array('title' => $this->trans('Description', array(), 'Admin.Global'), 'maxlength' => 90, 'orderby' => false), + 'position' => array('title' => $this->trans('Position', array(), 'Admin.Global'), 'filter_key' => 'position', 'align' => 'center', 'class' => 'fixed-width-sm', 'position' => 'position'), + 'active' => array( + 'title' => $this->trans('Displayed', array(), 'Admin.Global'), 'class' => 'fixed-width-sm', 'active' => 'status', + 'align' => 'center', 'type' => 'bool', 'orderby' => false, + ), + ); + + // The controller can't be call directly + // In this case, AdminCmsContentController::getCurrentCMSCategory() is null + if (!AdminCmsContentController::getCurrentCMSCategory()) { + $this->redirect_after = '?controller=AdminCmsContent&token=' . Tools::getAdminTokenLite('AdminCmsContent'); + $this->redirect(); + } + + $this->cms_category = AdminCmsContentController::getCurrentCMSCategory(); + $this->_where = ' AND `id_parent` = ' . (int) $this->cms_category->id; + $this->_select = 'position '; + } + + public function getTabSlug() + { + return 'ROLE_MOD_TAB_ADMINCMSCONTENT_'; + } + + public function renderList() + { + $this->initToolbar(); + $this->_group = 'GROUP BY a.`id_cms_category`'; + if (isset($this->toolbar_btn['new'])) { + $this->toolbar_btn['new']['href'] .= '&id_parent=' . (int) Tools::getValue('id_cms_category'); + } + + return parent::renderList(); + } + + public function postProcess() + { + if (Tools::isSubmit('submitAdd' . $this->table)) { + $this->action = 'save'; + if ($id_cms_category = (int) Tools::getValue('id_cms_category')) { + $this->id_object = $id_cms_category; + if (!CMSCategory::checkBeforeMove($id_cms_category, (int) Tools::getValue('id_parent'))) { + $this->errors[] = $this->trans('The page Category cannot be moved here.', array(), 'Admin.Design.Notification'); + + return false; + } + } + $object = parent::postProcess(); + $this->updateAssoShop((int) Tools::getValue('id_cms_category')); + if ($object !== false) { + Tools::redirectAdmin(self::$currentIndex . '&conf=3&id_cms_category=' . (int) $object->id . '&token=' . Tools::getValue('token')); + } + + return $object; + } elseif (Tools::isSubmit('statuscms_category') && Tools::getValue($this->identifier)) { + // Change object statuts (active, inactive) + if ($this->access('edit')) { + if (Validate::isLoadedObject($object = $this->loadObject())) { + if ($object->toggleStatus()) { + $identifier = ((int) $object->id_parent ? '&id_cms_category=' . (int) $object->id_parent : ''); + Tools::redirectAdmin(self::$currentIndex . '&conf=5' . $identifier . '&token=' . Tools::getValue('token')); + } else { + $this->errors[] = $this->trans('An error occurred while updating the status.', array(), 'Admin.Notifications.Error'); + } + } else { + $this->errors[] = $this->trans('An error occurred while updating the status for an object.', array(), 'Admin.Notifications.Error') + . ' ' . $this->table . ' ' . $this->trans('(cannot load object)', array(), 'Admin.Notifications.Error'); + } + } else { + $this->errors[] = $this->trans('You do not have permission to edit this.', array(), 'Admin.Notifications.Error'); + } + } elseif (Tools::isSubmit('delete' . $this->table)) { + // Delete object + if ($this->access('delete')) { + if (Validate::isLoadedObject($object = $this->loadObject()) && isset($this->fieldImageSettings)) { + // check if request at least one object with noZeroObject + if (isset($object->noZeroObject) && count($taxes = call_user_func(array($this->className, $object->noZeroObject))) <= 1) { + $this->errors[] = $this->trans('You need at least one object.', array(), 'Admin.Notifications.Error') + . ' ' . $this->table . '
' . $this->trans('You cannot delete all of the items.', array(), 'Admin.Notifications.Error'); + } else { + $identifier = ((int) $object->id_parent ? '&' . $this->identifier . '=' . (int) $object->id_parent : ''); + if ($this->deleted) { + $object->deleted = 1; + if ($object->update()) { + Tools::redirectAdmin(self::$currentIndex . '&conf=1&token=' . Tools::getValue('token') . $identifier); + } + } elseif ($object->delete()) { + Tools::redirectAdmin(self::$currentIndex . '&conf=1&token=' . Tools::getValue('token') . $identifier); + } + $this->errors[] = $this->trans('An error occurred during deletion.', array(), 'Admin.Notifications.Error'); + } + } else { + $this->errors[] = $this->trans('An error occurred while deleting the object.', array(), 'Admin.Notifications.Error') + . ' ' . $this->table . ' ' . $this->trans('(cannot load object)', array(), 'Admin.Notifications.Error'); + } + } else { + $this->errors[] = $this->trans('You do not have permission to delete this.', array(), 'Admin.Notifications.Error'); + } + } elseif (Tools::isSubmit('position')) { + $object = new CMSCategory((int) Tools::getValue($this->identifier, Tools::getValue('id_cms_category_to_move', 1))); + if (!$this->access('edit')) { + $this->errors[] = $this->trans('You do not have permission to edit this.', array(), 'Admin.Notifications.Error'); + } elseif (!Validate::isLoadedObject($object)) { + $this->errors[] = $this->trans('An error occurred while updating the status for an object.', array(), 'Admin.Notifications.Error') + . ' ' . $this->table . ' ' . $this->trans('(cannot load object)', array(), 'Admin.Notifications.Error'); + } elseif (!$object->updatePosition((int) Tools::getValue('way'), (int) Tools::getValue('position'))) { + $this->errors[] = $this->trans('Failed to update the position.', array(), 'Admin.Notifications.Error'); + } else { + $identifier = ((int) $object->id_parent ? '&' . $this->identifier . '=' . (int) $object->id_parent : ''); + $token = Tools::getAdminTokenLite('AdminCmsContent'); + Tools::redirectAdmin( + self::$currentIndex . '&' . $this->table . 'Orderby=position&' . $this->table . 'Orderway=asc&conf=5' . $identifier . '&token=' . $token + ); + } + } elseif (Tools::getValue('submitDel' . $this->table) || Tools::getValue('submitBulkdelete' . $this->table)) { + // Delete multiple objects + if ($this->access('delete')) { + if (Tools::isSubmit($this->table . 'Box')) { + $cms_category = new CMSCategory(); + $result = true; + $result = $cms_category->deleteSelection(Tools::getValue($this->table . 'Box')); + if ($result) { + $cms_category->cleanPositions((int) Tools::getValue('id_cms_category')); + $token = Tools::getAdminTokenLite('AdminCmsContent'); + Tools::redirectAdmin(self::$currentIndex . '&conf=2&token=' . $token . '&id_cms_category=' . (int) Tools::getValue('id_cms_category')); + } + $this->errors[] = $this->trans('An error occurred while deleting this selection.', array(), 'Admin.Notifications.Error'); + } else { + $this->errors[] = $this->trans('You must select at least one element to delete.', array(), 'Admin.Notifications.Error'); + } + } else { + $this->errors[] = $this->trans('You do not have permission to delete this.', array(), 'Admin.Notifications.Error'); + } + } + parent::postProcess(); + } + + public function renderForm() + { + $this->display = 'edit'; + $this->initToolbar(); + if (!$this->loadObject(true)) { + return; + } + + $categories = CMSCategory::getCategories($this->context->language->id, false); + $html_categories = CMSCategory::recurseCMSCategory($categories, $categories[0][1], 1, $this->getFieldValue($this->object, 'id_parent'), 1); + + $this->fields_form = array( + 'legend' => array( + 'title' => $this->trans('CMS Category', array(), 'Admin.Design.Feature'), + 'icon' => 'icon-folder-close', + ), + 'input' => array( + array( + 'type' => 'text', + 'label' => $this->trans('Name', array(), 'Admin.Global'), + 'name' => 'name', + 'class' => 'copyMeta2friendlyURL', + 'required' => true, + 'lang' => true, + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + array( + 'type' => 'switch', + 'label' => $this->trans('Displayed', array(), 'Admin.Global'), + 'name' => 'active', + 'required' => false, + 'is_bool' => true, + 'values' => array( + array( + 'id' => 'active_on', + 'value' => 1, + 'label' => $this->trans('Enabled', array(), 'Admin.Global'), + ), + array( + 'id' => 'active_off', + 'value' => 0, + 'label' => $this->trans('Disabled', array(), 'Admin.Global'), + ), + ), + ), + // custom template + array( + 'type' => 'select_category', + 'label' => $this->trans('Parent category', array(), 'Admin.Design.Feature'), + 'name' => 'id_parent', + 'options' => array( + 'html' => $html_categories, + ), + ), + array( + 'type' => 'textarea', + 'label' => $this->trans('Description', array(), 'Admin.Global'), + 'name' => 'description', + 'lang' => true, + 'rows' => 5, + 'cols' => 40, + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + array( + 'type' => 'text', + 'label' => $this->trans('Meta title', array(), 'Admin.Global'), + 'name' => 'meta_title', + 'lang' => true, + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + array( + 'type' => 'text', + 'label' => $this->trans('Meta description', array(), 'Admin.Global'), + 'name' => 'meta_description', + 'lang' => true, + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + array( + 'type' => 'text', + 'label' => $this->trans('Meta keywords', array(), 'Admin.Global'), + 'name' => 'meta_keywords', + 'lang' => true, + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + array( + 'type' => 'text', + 'label' => $this->trans('Friendly URL', array(), 'Admin.Global'), + 'name' => 'link_rewrite', + 'required' => true, + 'lang' => true, + 'hint' => $this->trans('Only letters and the minus (-) character are allowed.', array(), 'Admin.Catalog.Help'), + ), + ), + 'submit' => array( + 'title' => $this->trans('Save', array(), 'Admin.Actions'), + ), + ); + + if (Shop::isFeatureActive()) { + $this->fields_form['input'][] = array( + 'type' => 'shop', + 'label' => $this->trans('Shop association', array(), 'Admin.Global'), + 'name' => 'checkBoxShopAsso', + ); + } + + $this->tpl_form_vars['PS_ALLOW_ACCENTED_CHARS_URL'] = (int) Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL'); + + return parent::renderForm(); + } +} diff --git a/controllers/admin/AdminCmsContentController.php b/controllers/admin/AdminCmsContentController.php new file mode 100644 index 0000000..76ceff6 --- /dev/null +++ b/controllers/admin/AdminCmsContentController.php @@ -0,0 +1,314 @@ + + * @copyright 2007-2019 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +/** + * @property CMS $object + */ +class AdminCmsContentControllerCore extends AdminController +{ + /** @var object adminCMSCategories() instance */ + protected $admin_cms_categories; + + /** @var object adminCMS() instance */ + protected $admin_cms; + + /** @var object Category() instance for navigation */ + protected static $category = null; + + /** + * @deprecated since 1.7.6, to be removed in the next minor + */ + public function __construct() + { + @trigger_error( + 'The AdminCmsContentController is deprecated and will be removed in the next minor', + E_USER_DEPRECATED + ); + + $this->bootstrap = true; + /* Get current category */ + $id_cms_category = (int) Tools::getValue('id_cms_category', Tools::getValue('id_cms_category_parent', 1)); + self::$category = new CMSCategory($id_cms_category); + if (!Validate::isLoadedObject(self::$category)) { + die('Category cannot be loaded'); + } + + parent::__construct(); + + $this->table = 'cms'; + $this->className = 'CMS'; + $this->bulk_actions = array( + 'delete' => array( + 'text' => $this->trans('Delete selected', array(), 'Admin.Actions'), + 'confirm' => $this->trans('Delete selected items?', array(), 'Admin.Notifications.Warning'), + 'icon' => 'icon-trash', + ), + ); + + $this->admin_cms_categories = new AdminCmsCategoriesController(); + $this->admin_cms_categories->tabAccess = $this->tabAccess; + $this->admin_cms_categories->init(); + $this->admin_cms = new AdminCmsController(); + $this->admin_cms->tabAccess = $this->tabAccess; + $this->admin_cms->init(); + $this->context->controller = $this; + } + + /** + * Return current category. + * + * @return object + */ + public static function getCurrentCMSCategory() + { + return self::$category; + } + + public function initProcess() + { + if (((Tools::isSubmit('submitAddcms_category') || Tools::isSubmit('submitAddcms_categoryAndStay')) && count($this->admin_cms_categories->errors)) + || Tools::isSubmit('updatecms_category') + || Tools::isSubmit('addcms_category')) { + $this->display = 'edit_category'; + } elseif (((Tools::isSubmit('submitAddcms') || Tools::isSubmit('submitAddcmsAndStay')) && count($this->admin_cms->errors)) + || Tools::isSubmit('updatecms') + || Tools::isSubmit('addcms')) { + $this->display = 'edit_page'; + } else { + $this->display = 'list'; + } + } + + public function initContent() + { + $id_cms_category = (int) Tools::getValue('id_cms_category'); + + if (!$id_cms_category) { + $id_cms_category = 1; + } + + if ($this->display == 'list') { + $this->page_header_toolbar_btn['new_cms_category'] = array( + 'href' => self::$currentIndex . '&addcms_category&token=' . $this->token, + 'desc' => $this->trans('Add new page category', array(), 'Admin.Design.Help'), + 'icon' => 'process-icon-new', + ); + $this->page_header_toolbar_btn['new_cms_page'] = array( + 'href' => self::$currentIndex . '&addcms&id_cms_category=' . (int) $id_cms_category . '&token=' . $this->token, + 'desc' => $this->trans('Add new page', array(), 'Admin.Design.Help'), + 'icon' => 'process-icon-new', + ); + } + + $this->page_header_toolbar_title = implode(' ' . Configuration::get('PS_NAVIGATION_PIPE') . ' ', $this->toolbar_title); + + if (is_array($this->page_header_toolbar_btn) + && $this->page_header_toolbar_btn instanceof Traversable + || trim($this->page_header_toolbar_title) != '') { + $this->show_page_header_toolbar = true; + } + + $this->admin_cms_categories->token = $this->token; + $this->admin_cms->token = $this->token; + + if ($this->display == 'edit_category') { + $this->content .= $this->admin_cms_categories->renderForm(); + } elseif ($this->display == 'edit_page') { + $this->content .= $this->admin_cms->renderForm(); + } elseif ($this->display == 'list') { + $id_cms_category = (int) Tools::getValue('id_cms_category'); + if (!$id_cms_category) { + $id_cms_category = 1; + } + + // CMS categories breadcrumb + $cms_tabs = array('cms_category', 'cms'); + // Cleaning links + $cat_bar_index = self::$currentIndex; + foreach ($cms_tabs as $tab) { + if (Tools::getValue($tab . 'Orderby') && Tools::getValue($tab . 'Orderway')) { + $cat_bar_index = preg_replace('/&' . $tab . 'Orderby=([a-z _]*)&' . $tab . 'Orderway=([a-z]*)/i', '', self::$currentIndex); + } + } + $this->context->smarty->assign(array( + 'cms_breadcrumb' => Tools::getPath($cat_bar_index, $id_cms_category, '', '', 'cms'), + )); + + $this->content .= $this->admin_cms_categories->renderList(); + $this->admin_cms->id_cms_category = $id_cms_category; + $this->content .= $this->admin_cms->renderList(); + } + + $this->context->smarty->assign(array( + 'content' => $this->content, + 'show_page_header_toolbar' => $this->show_page_header_toolbar, + 'title' => $this->page_header_toolbar_title, + 'toolbar_btn' => $this->page_header_toolbar_btn, + 'page_header_toolbar_btn' => $this->page_header_toolbar_btn, + 'page_header_toolbar_title' => $this->toolbar_title, + )); + } + + public function initToolbarTitle() + { + $this->toolbar_title = is_array($this->breadcrumbs) ? array_unique($this->breadcrumbs) : array($this->breadcrumbs); + + $id_cms_category = (int) Tools::getValue('id_cms_category'); + if ($id_cms_category && $id_cms_category !== 1) { + $cms_category = new CMSCategory($id_cms_category); + } + $id_cms_page = Tools::getValue('id_cms'); + + if ($this->display == 'edit_category') { + if (Tools::getValue('addcms_category') !== false) { + $this->toolbar_title[] = $this->trans('Add new category', array(), 'Admin.Design.Feature'); + } else { + if (isset($cms_category)) { + $this->toolbar_title[] = $this->trans('Edit category: %name%', array('%name%' => $cms_category->name[$this->context->employee->id_lang]), 'Admin.Design.Feature'); + } + } + } elseif ($this->display == 'edit_page') { + if (Tools::getValue('addcms') !== false) { + $this->toolbar_title[] = $this->trans('Add new page', array(), 'Admin.Design.Feature'); + } elseif ($id_cms_page) { + $cms_page = new CMS($id_cms_page); + $this->toolbar_title[] = $this->trans('Edit page: %meta_title%', array('%meta_title%' => $cms_page->meta_title[$this->context->employee->id_lang]), 'Admin.Design.Feature'); + } + } elseif ($this->display == 'list' && isset($cms_category)) { + $this->toolbar_title[] = $this->trans('Category: %category%', array('%category%' => $cms_category->name[$this->context->employee->id_lang]), 'Admin.Design.Feature'); + } + } + + public function postProcess() + { + $this->admin_cms->postProcess(); + $this->admin_cms_categories->postProcess(); + + parent::postProcess(); + + if (isset($this->admin_cms->errors)) { + $this->errors = array_merge($this->errors, $this->admin_cms->errors); + } + + if (isset($this->admin_cms_categories->errors)) { + $this->errors = array_merge($this->errors, $this->admin_cms_categories->errors); + } + } + + public function setMedia($isNewTheme = false) + { + parent::setMedia($isNewTheme); + $this->addJqueryUi('ui.widget'); + $this->addJqueryPlugin('tagify'); + } + + public function ajaxProcessUpdateCmsPositions() + { + if ($this->access('edit')) { + $id_cms = (int) Tools::getValue('id_cms'); + $id_category = (int) Tools::getValue('id_cms_category'); + $way = (int) Tools::getValue('way'); + $positions = Tools::getValue('cms'); + if (is_array($positions)) { + foreach ($positions as $key => $value) { + $pos = explode('_', $value); + if ((isset($pos[1], $pos[2])) && ($pos[1] == $id_category && $pos[2] == $id_cms)) { + $position = $key; + + break; + } + } + } + $cms = new CMS($id_cms); + if (Validate::isLoadedObject($cms)) { + if (isset($position) && $cms->updatePosition($way, $position)) { + die(true); + } else { + die('{"hasError" : true, "errors" : "Can not update cms position"}'); + } + } else { + die('{"hasError" : true, "errors" : "This cms can not be loaded"}'); + } + } + } + + public function ajaxProcessUpdateCmsCategoriesPositions() + { + if ($this->access('edit')) { + $id_cms_category_to_move = (int) Tools::getValue('id_cms_category_to_move'); + $id_cms_category_parent = (int) Tools::getValue('id_cms_category_parent'); + $way = (int) Tools::getValue('way'); + $positions = Tools::getValue('cms_category'); + if (is_array($positions)) { + foreach ($positions as $key => $value) { + $pos = explode('_', $value); + if ((isset($pos[1], $pos[2])) && ($pos[1] == $id_cms_category_parent && $pos[2] == $id_cms_category_to_move)) { + $position = $key; + + break; + } + } + } + $cms_category = new CMSCategory($id_cms_category_to_move); + if (Validate::isLoadedObject($cms_category)) { + if (isset($position) && $cms_category->updatePosition($way, $position)) { + die(true); + } else { + die('{"hasError" : true, "errors" : "Can not update cms categories position"}'); + } + } else { + die('{"hasError" : true, "errors" : "This cms category can not be loaded"}'); + } + } + } + + public function ajaxProcessPublishCMS() + { + if ($this->access('edit')) { + if ($id_cms = (int) Tools::getValue('id_cms')) { + $bo_cms_url = _PS_BASE_URL_ . __PS_BASE_URI__ . basename(_PS_ADMIN_DIR_) . '/index.php?tab=AdminCmsContent&id_cms=' . (int) $id_cms . '&updatecms&token=' . $this->token; + + if (Tools::getValue('redirect')) { + die($bo_cms_url); + } + + $cms = new CMS((int) (Tools::getValue('id_cms'))); + if (!Validate::isLoadedObject($cms)) { + die('error: invalid id'); + } + + $cms->active = 1; + if ($cms->save()) { + die($bo_cms_url); + } else { + die('error: saving'); + } + } else { + die('error: parameters'); + } + } + } +} diff --git a/controllers/admin/AdminCmsController.php b/controllers/admin/AdminCmsController.php new file mode 100644 index 0000000..43fa77b --- /dev/null +++ b/controllers/admin/AdminCmsController.php @@ -0,0 +1,468 @@ + + * @copyright 2007-2019 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +/** + * @property CMS $object + */ +class AdminCmsControllerCore extends AdminController +{ + protected $category; + + public $id_cms_category; + + protected $position_identifier = 'id_cms'; + + /** + * @deprecated since 1.7.6, to be removed in the next minor + */ + public function __construct() + { + @trigger_error( + 'The AdminCmsController is deprecated and will be removed in the next minor', + E_USER_DEPRECATED + ); + + $this->bootstrap = true; + $this->table = 'cms'; + $this->list_id = 'cms'; + $this->className = 'CMS'; + $this->lang = true; + $this->addRowAction('edit'); + $this->addRowAction('delete'); + $this->_orderBy = 'position'; + + parent::__construct(); + + $this->bulk_actions = array( + 'delete' => array( + 'text' => $this->trans('Delete selected', array(), 'Admin.Actions'), + 'confirm' => $this->trans('Delete selected items?', array(), 'Admin.Notifications.Warning'), + 'icon' => 'icon-trash', + ), + ); + $this->fields_list = array( + 'id_cms' => array( + 'title' => $this->trans('ID', array(), 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ), + 'link_rewrite' => array( + 'title' => $this->trans('URL', array(), 'Admin.Global'), + ), + 'meta_title' => array( + 'title' => $this->trans('Title', array(), 'Admin.Global'), + 'filter_key' => 'b!meta_title', + 'maxlength' => 50, + ), + 'head_seo_title' => array( + 'title' => $this->trans('Meta title', array(), 'Admin.Global'), + 'filter_key' => 'b!head_seo_title', + 'maxlength' => 50, + ), + 'position' => array( + 'title' => $this->trans('Position', array(), 'Admin.Global'), + 'filter_key' => 'position', + 'align' => 'center', + 'class' => 'fixed-width-sm', + 'position' => 'position', + ), + 'active' => array( + 'title' => $this->trans('Displayed', array(), 'Admin.Global'), + 'align' => 'center', + 'active' => 'status', + 'class' => 'fixed-width-sm', + 'type' => 'bool', + 'orderby' => false, + ), + ); + + // The controller can't be call directly + // In this case, AdminCmsContentController::getCurrentCMSCategory() is null + if (!AdminCmsContentController::getCurrentCMSCategory()) { + $this->redirect_after = '?controller=AdminCmsContent&token=' . Tools::getAdminTokenLite('AdminCmsContent'); + $this->redirect(); + } + + $this->_category = AdminCmsContentController::getCurrentCMSCategory(); + $this->tpl_list_vars['icon'] = 'icon-folder-close'; + $this->tpl_list_vars['title'] = $this->trans('Pages in category "%name%"', array('%name%' => $this->_category->name[Context::getContext()->employee->id_lang]), 'Admin.Design.Feature'); + $this->_join = ' + LEFT JOIN `' . _DB_PREFIX_ . 'cms_category` c ON (c.`id_cms_category` = a.`id_cms_category`)'; + $this->_select = 'a.position '; + $this->_where = ' AND c.id_cms_category = ' . (int) $this->_category->id; + } + + public function getTabSlug() + { + return 'ROLE_MOD_TAB_ADMINCMSCONTENT_'; + } + + public function initPageHeaderToolbar() + { + $this->page_header_toolbar_btn['save-and-preview'] = array( + 'href' => '#', + 'desc' => $this->trans('Save and preview', array(), 'Admin.Actions'), + ); + $this->page_header_toolbar_btn['save-and-stay'] = array( + 'short' => $this->trans('Save and stay', array(), 'Admin.Actions'), + 'href' => '#', + 'desc' => $this->trans('Save and stay', array(), 'Admin.Actions'), + ); + + return parent::initPageHeaderToolbar(); + } + + public function renderForm() + { + if (!$this->loadObject(true)) { + return; + } + + if (Validate::isLoadedObject($this->object)) { + $this->display = 'edit'; + } else { + $this->display = 'add'; + } + + $this->initToolbar(); + $this->initPageHeaderToolbar(); + + $categories = CMSCategory::getCategories($this->context->language->id, false); + $html_categories = CMSCategory::recurseCMSCategory($categories, $categories[0][1], 1, $this->getFieldValue($this->object, 'id_cms_category'), 1); + + $this->fields_form = array( + 'tinymce' => true, + 'legend' => array( + 'title' => $this->l('Page'), + 'icon' => 'icon-folder-close', + ), + 'input' => array( + // custom template + array( + 'type' => 'select_category', + 'label' => $this->trans('Page Category', array(), 'Admin.Design.Feature'), + 'name' => 'id_cms_category', + 'options' => array( + 'html' => $html_categories, + ), + ), + array( + 'type' => 'text', + 'label' => $this->trans('Title', array(), 'Admin.Global'), + 'name' => 'meta_title', + 'id' => 'name', // for copyMeta2friendlyURL compatibility + 'lang' => true, + 'required' => true, + 'class' => 'copyMeta2friendlyURL', + 'hint' => array( + $this->trans('Used in the h1 page tag, and as the default title tag value.', array(), 'Admin.Design.Help'), + $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + ), + array( + 'type' => 'text', + 'label' => $this->trans('Meta title', array(), 'Admin.Global'), + 'name' => 'head_seo_title', + 'lang' => true, + 'hint' => array( + $this->trans('Used to override the title tag value. If left blank, the default title value is used.', array(), 'Admin.Design.Help'), + $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + ), + array( + 'type' => 'text', + 'label' => $this->trans('Meta description', array(), 'Admin.Global'), + 'name' => 'meta_description', + 'lang' => true, + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + array( + 'type' => 'tags', + 'label' => $this->trans('Meta keywords', array(), 'Admin.Global'), + 'name' => 'meta_keywords', + 'lang' => true, + 'hint' => array( + $this->trans('To add tags, click in the field, write something, and then press the "Enter" key.', array(), 'Admin.Shopparameters.Help'), + $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + ), + array( + 'type' => 'text', + 'label' => $this->trans('Friendly URL', array(), 'Admin.Global'), + 'name' => 'link_rewrite', + 'required' => true, + 'lang' => true, + 'hint' => $this->trans('Only letters and the hyphen (-) character are allowed.', array(), 'Admin.Design.Feature'), + ), + array( + 'type' => 'textarea', + 'label' => $this->trans('Page content', array(), 'Admin.Design.Feature'), + 'name' => 'content', + 'autoload_rte' => true, + 'lang' => true, + 'rows' => 5, + 'cols' => 40, + 'hint' => $this->trans('Invalid characters:', array(), 'Admin.Notifications.Info') . ' <>;=#{}', + ), + array( + 'type' => 'switch', + 'label' => $this->trans('Indexation by search engines', array(), 'Admin.Design.Feature'), + 'name' => 'indexation', + 'required' => false, + 'class' => 't', + 'is_bool' => true, + 'values' => array( + array( + 'id' => 'indexation_on', + 'value' => 1, + 'label' => $this->trans('Enabled', array(), 'Admin.Global'), + ), + array( + 'id' => 'indexation_off', + 'value' => 0, + 'label' => $this->trans('Disabled', array(), 'Admin.Global'), + ), + ), + ), + array( + 'type' => 'switch', + 'label' => $this->trans('Displayed', array(), 'Admin.Global'), + 'name' => 'active', + 'required' => false, + 'is_bool' => true, + 'values' => array( + array( + 'id' => 'active_on', + 'value' => 1, + 'label' => $this->trans('Enabled', array(), 'Admin.Global'), + ), + array( + 'id' => 'active_off', + 'value' => 0, + 'label' => $this->trans('Disabled', array(), 'Admin.Global'), + ), + ), + ), + ), + 'submit' => array( + 'title' => $this->trans('Save', array(), 'Admin.Actions'), + ), + 'buttons' => array( + 'save_and_preview' => array( + 'name' => 'viewcms', + 'type' => 'submit', + 'title' => $this->trans('Save and preview', array(), 'Admin.Actions'), + 'class' => 'btn btn-default pull-right', + 'icon' => 'process-icon-preview', + ), + ), + ); + + if (Shop::isFeatureActive()) { + $this->fields_form['input'][] = array( + 'type' => 'shop', + 'label' => $this->trans('Shop association', array(), 'Admin.Global'), + 'name' => 'checkBoxShopAsso', + ); + } + + if (Validate::isLoadedObject($this->object)) { + $this->context->smarty->assign('url_prev', $this->getPreviewUrl($this->object)); + } + + $this->tpl_form_vars = array( + 'active' => $this->object->active, + 'PS_ALLOW_ACCENTED_CHARS_URL', (int) Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL'), + ); + + return parent::renderForm(); + } + + public function renderList() + { + $this->_group = 'GROUP BY a.`id_cms`'; + //self::$currentIndex = self::$currentIndex.'&cms'; + $this->position_group_identifier = (int) $this->id_cms_category; + + $this->toolbar_title = $this->trans('Pages in this category', array(), 'Admin.Design.Feature'); + $this->toolbar_btn['new'] = array( + 'href' => self::$currentIndex . '&add' . $this->table . '&id_cms_category=' . (int) $this->id_cms_category . '&token=' . $this->token, + 'desc' => $this->trans('Add new', array(), 'Admin.Actions'), + ); + + return parent::renderList(); + } + + public function displayList($token = null) + { + /* Display list header (filtering, pagination and column names) */ + $this->displayListHeader($token); + if (!count($this->_list)) { + echo '' . $this->trans('No items found', array(), 'Admin.Design.Notification') . ''; + } + + /* Show the content of the table */ + $this->displayListContent($token); + + /* Close list table and submit button */ + $this->displayListFooter($token); + } + + public function postProcess() + { + if (Tools::isSubmit('viewcms') && ($id_cms = (int) Tools::getValue('id_cms'))) { + parent::postProcess(); + if (($cms = new CMS($id_cms, $this->context->language->id)) && Validate::isLoadedObject($cms)) { + Tools::redirectAdmin(self::$currentIndex . '&id_cms=' . $id_cms . '&conf=4&updatecms&token=' . Tools::getAdminTokenLite('AdminCmsContent') . '&url_preview=1'); + } + } elseif (Tools::isSubmit('deletecms')) { + if (Tools::getValue('id_cms') == Configuration::get('PS_CONDITIONS_CMS_ID')) { + Configuration::updateValue('PS_CONDITIONS', 0); + Configuration::updateValue('PS_CONDITIONS_CMS_ID', 0); + } + $cms = new CMS((int) Tools::getValue('id_cms')); + $cms->cleanPositions($cms->id_cms_category); + if (!$cms->delete()) { + $this->errors[] = $this->trans('An error occurred while deleting the object.', array(), 'Admin.Notifications.Error') + . ' ' . $this->table . ' (' . Db::getInstance()->getMsgError() . ')'; + } else { + Tools::redirectAdmin(self::$currentIndex . '&id_cms_category=' . $cms->id_cms_category . '&conf=1&token=' . Tools::getAdminTokenLite('AdminCmsContent')); + } + } elseif (Tools::getValue('submitDel' . $this->table)) { + // Delete multiple objects + if ($this->access('delete')) { + if (Tools::isSubmit($this->table . 'Box')) { + $cms = new CMS(); + $result = true; + $result = $cms->deleteSelection(Tools::getValue($this->table . 'Box')); + if ($result) { + $cms->cleanPositions((int) Tools::getValue('id_cms_category')); + $token = Tools::getAdminTokenLite('AdminCmsContent'); + Tools::redirectAdmin(self::$currentIndex . '&conf=2&token=' . $token . '&id_cms_category=' . (int) Tools::getValue('id_cms_category')); + } + $this->errors[] = $this->trans('An error occurred while deleting this selection.', array(), 'Admin.Notifications.Error'); + } else { + $this->errors[] = $this->trans('You must select at least one element to delete.', array(), 'Admin.Notifications.Error'); + } + } else { + $this->errors[] = $this->trans('You do not have permission to delete this.', array(), 'Admin.Notifications.Error'); + } + } elseif (Tools::isSubmit('submitAddcms') || Tools::isSubmit('submitAddcmsAndPreview')) { + parent::validateRules(); + if (count($this->errors)) { + return false; + } + if (!$id_cms = (int) Tools::getValue('id_cms')) { + $cms = new CMS(); + $this->copyFromPost($cms, 'cms'); + if (!$cms->add()) { + $this->errors[] = $this->trans('An error occurred while creating an object.', array(), 'Admin.Notifications.Error') . ' ' . $this->table . ' (' . Db::getInstance()->getMsgError() . ')'; + } else { + $this->updateAssoShop($cms->id); + } + } else { + $cms = new CMS($id_cms); + $this->copyFromPost($cms, 'cms'); + if (!$cms->update()) { + $this->errors[] = $this->trans('An error occurred while updating an object.', array(), 'Admin.Notifications.Error') . ' ' . $this->table . ' (' . Db::getInstance()->getMsgError() . ')'; + } else { + $this->updateAssoShop($cms->id); + } + } + if (Tools::isSubmit('view' . $this->table)) { + Tools::redirectAdmin(self::$currentIndex . '&id_cms=' . $cms->id . '&conf=4&updatecms&token=' . Tools::getAdminTokenLite('AdminCmsContent') . '&url_preview=1'); + } elseif (Tools::isSubmit('submitAdd' . $this->table . 'AndStay')) { + Tools::redirectAdmin(self::$currentIndex . '&' . $this->identifier . '=' . $cms->id . '&conf=4&update' . $this->table . '&token=' . Tools::getAdminTokenLite('AdminCmsContent')); + } else { + Tools::redirectAdmin(self::$currentIndex . '&id_cms_category=' . $cms->id_cms_category . '&conf=4&token=' . Tools::getAdminTokenLite('AdminCmsContent')); + } + } elseif (Tools::isSubmit('way') && Tools::isSubmit('id_cms') && (Tools::isSubmit('position'))) { + /* @var CMS $object */ + if (!$this->access('edit')) { + $this->errors[] = $this->trans('You do not have permission to edit this.', array(), 'Admin.Notifications.Error'); + } elseif (!Validate::isLoadedObject($object = $this->loadObject())) { + $this->errors[] = $this->trans('An error occurred while updating the status for an object.', array(), 'Admin.Notifications.Error') + . ' ' . $this->table . ' ' . $this->trans('(cannot load object)', array(), 'Admin.Notifications.Error'); + } elseif (!$object->updatePosition((int) Tools::getValue('way'), (int) Tools::getValue('position'))) { + $this->errors[] = $this->trans('Failed to update the position.', array(), 'Admin.Notifications.Error'); + } else { + Tools::redirectAdmin(self::$currentIndex . '&' . $this->table . 'Orderby=position&' . $this->table . 'Orderway=asc&conf=4&id_cms_category=' . (int) $object->id_cms_category . '&token=' . Tools::getAdminTokenLite('AdminCmsContent')); + } + } elseif (Tools::isSubmit('statuscms') && Tools::isSubmit($this->identifier)) { + // Change object status (active, inactive) + if ($this->access('edit')) { + if (Validate::isLoadedObject($object = $this->loadObject())) { + /** @var CMS $object */ + if ($object->toggleStatus()) { + Tools::redirectAdmin(self::$currentIndex . '&conf=5&id_cms_category=' . (int) $object->id_cms_category . '&token=' . Tools::getValue('token')); + } else { + $this->errors[] = $this->trans('An error occurred while updating the status.', array(), 'Admin.Notifications.Error'); + } + } else { + $this->errors[] = $this->trans('An error occurred while updating the status for an object.', array(), 'Admin.Notifications.Error') + . ' ' . $this->table . ' ' . $this->trans('(cannot load object)', array(), 'Admin.Notifications.Error'); + } + } else { + $this->errors[] = $this->trans('You do not have permission to edit this.', array(), 'Admin.Notifications.Error'); + } + } elseif (Tools::isSubmit('submitBulkdeletecms')) { + // Delete multiple CMS content + if ($this->access('delete')) { + $this->action = 'bulkdelete'; + $this->boxes = Tools::getValue($this->table . 'Box'); + if (is_array($this->boxes) && array_key_exists(0, $this->boxes)) { + $firstCms = new CMS((int) $this->boxes[0]); + $id_cms_category = (int) $firstCms->id_cms_category; + if (!$res = parent::postProcess(true)) { + return $res; + } + Tools::redirectAdmin(self::$currentIndex . '&conf=2&token=' . Tools::getAdminTokenLite('AdminCmsContent') . '&id_cms_category=' . $id_cms_category); + } + } else { + $this->errors[] = $this->trans('You do not have permission to delete this.', array(), 'Admin.Notifications.Error'); + } + } else { + parent::postProcess(true); + } + } + + public function getPreviewUrl(CMS $cms) + { + $preview_url = $this->context->link->getCMSLink($cms, null, null, $this->context->language->id); + if (!$cms->active) { + $params = http_build_query( + array( + 'adtoken' => Tools::getAdminTokenLite('AdminCmsContent'), + 'ad' => basename(_PS_ADMIN_DIR_), + 'id_employee' => (int) $this->context->employee->id, + ) + ); + $preview_url .= (strpos($preview_url, '?') === false ? '?' : '&') . $params; + } + + return $preview_url; + } +} diff --git a/controllers/admin/AdminCountriesController.php b/controllers/admin/AdminCountriesController.php new file mode 100644 index 0000000..193a4d6 --- /dev/null +++ b/controllers/admin/AdminCountriesController.php @@ -0,0 +1,527 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property Country $object + */ +class AdminCountriesControllerCore extends AdminController +{ + public function __construct() + { + $this->bootstrap = true; + $this->table = 'country'; + $this->className = 'Country'; + $this->lang = true; + $this->deleted = false; + $this->_defaultOrderBy = 'name'; + $this->_defaultOrderWay = 'ASC'; + + $this->explicitSelect = true; + $this->addRowAction('edit'); + + parent::__construct(); + + $this->bulk_actions = [ + 'delete' => ['text' => $this->trans('Delete selected', [], 'Admin.Actions'), 'confirm' => $this->trans('Delete selected items?', [], 'Admin.Actions')], + 'AffectZone' => ['text' => $this->trans('Assign to a new zone', [], 'Admin.International.Feature')], + ]; + + $this->fieldImageSettings = [ + 'name' => 'logo', + 'dir' => 'st', + ]; + + $this->fields_options = [ + 'general' => [ + 'title' => $this->trans('Country options', [], 'Admin.International.Feature'), + 'fields' => [ + 'PS_RESTRICT_DELIVERED_COUNTRIES' => [ + 'title' => $this->trans('Restrict country selections in front office to those covered by active carriers', [], 'Admin.International.Help'), + 'cast' => 'intval', + 'type' => 'bool', + 'default' => '0', + ], + ], + 'submit' => ['title' => $this->trans('Save', [], 'Admin.Actions')], + ], + ]; + + $zones_array = []; + $this->zones = Zone::getZones(); + foreach ($this->zones as $zone) { + $zones_array[$zone['id_zone']] = $zone['name']; + } + + $this->fields_list = [ + 'id_country' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'name' => [ + 'title' => $this->trans('Country', [], 'Admin.Global'), + 'filter_key' => 'b!name', + ], + 'iso_code' => [ + 'title' => $this->trans('ISO code', [], 'Admin.International.Feature'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'call_prefix' => [ + 'title' => $this->trans('Call prefix', [], 'Admin.International.Feature'), + 'align' => 'center', + 'callback' => 'displayCallPrefix', + 'class' => 'fixed-width-sm', + ], + 'zone' => [ + 'title' => $this->trans('Zone', [], 'Admin.Global'), + 'type' => 'select', + 'list' => $zones_array, + 'filter_key' => 'z!id_zone', + 'filter_type' => 'int', + 'order_key' => 'z!name', + ], + 'active' => [ + 'title' => $this->trans('Enabled', [], 'Admin.Global'), + 'align' => 'center', + 'active' => 'status', + 'type' => 'bool', + 'orderby' => false, + 'filter_key' => 'a!active', + 'class' => 'fixed-width-sm', + ], + ]; + } + + public function initPageHeaderToolbar() + { + if (empty($this->display)) { + $this->page_header_toolbar_btn['new_country'] = [ + 'href' => self::$currentIndex . '&addcountry&token=' . $this->token, + 'desc' => $this->trans('Add new country', [], 'Admin.International.Feature'), + 'icon' => 'process-icon-new', + ]; + } + + parent::initPageHeaderToolbar(); + } + + /** + * AdminController::setMedia() override. + * + * @see AdminController::setMedia() + */ + public function setMedia($isNewTheme = false) + { + parent::setMedia($isNewTheme); + + $this->addJqueryPlugin('fieldselection'); + } + + public function renderList() + { + $this->_select = 'z.`name` AS zone'; + $this->_join = 'LEFT JOIN `' . _DB_PREFIX_ . 'zone` z ON (z.`id_zone` = a.`id_zone`)'; + $this->_use_found_rows = false; + + $this->tpl_list_vars['zones'] = Zone::getZones(); + $this->tpl_list_vars['REQUEST_URI'] = $_SERVER['REQUEST_URI']; + $this->tpl_list_vars['POST'] = $_POST; + + return parent::renderList(); + } + + public function renderForm() + { + if (!($obj = $this->loadObject(true))) { + return; + } + + $address_layout = AddressFormat::getAddressCountryFormat($obj->id); + if ($value = Tools::getValue('address_layout')) { + $address_layout = $value; + } + + $default_layout = ''; + + // TODO: Use format from XML + $default_layout_tab = [ + ['firstname', 'lastname'], + ['company'], + ['vat_number'], + ['address1'], + ['address2'], + ['postcode', 'city'], + ['Country:name'], + ['phone'], + ]; + + foreach ($default_layout_tab as $line) { + $default_layout .= implode(' ', $line) . AddressFormat::FORMAT_NEW_LINE; + } + + $this->fields_form = [ + 'legend' => [ + 'title' => $this->trans('Countries', [], 'Admin.International.Feature'), + 'icon' => 'icon-globe', + ], + 'input' => [ + [ + 'type' => 'text', + 'label' => $this->trans('Country', [], 'Admin.Global'), + 'name' => 'name', + 'lang' => true, + 'required' => true, + 'hint' => $this->trans('Country name', [], 'Admin.International.Feature') . ' - ' . $this->trans('Invalid characters:', [], 'Admin.Global') . ' <>;=#{} ', + ], + [ + 'type' => 'text', + 'label' => $this->trans('ISO code', [], 'Admin.International.Feature'), + 'name' => 'iso_code', + 'maxlength' => 3, + 'class' => 'uppercase', + 'required' => true, + 'hint' => $this->trans('Two -- or three -- letter ISO code (e.g. "us" for United States).', [], 'Admin.International.Help'), + /* @TODO - add two lines for the hint? */ + /*'desc' => $this->trans('Two -- or three -- letter ISO code (e.g. U.S. for United States)', [], 'Admin.International.Help').'. + '. + $this->trans('Official list here', [], 'Admin.International.Feature').' + .'*/ + ], + [ + 'type' => 'text', + 'label' => $this->trans('Call prefix', [], 'Admin.International.Feature'), + 'name' => 'call_prefix', + 'maxlength' => 3, + 'class' => 'uppercase', + 'required' => true, + 'hint' => $this->trans('International call prefix, (e.g. 1 for United States).', [], 'Admin.International.Help'), + ], + [ + 'type' => 'select', + 'label' => $this->trans('Default currency', [], 'Admin.International.Feature'), + 'name' => 'id_currency', + 'options' => [ + 'query' => Currency::getCurrencies(false, true, true), + 'id' => 'id_currency', + 'name' => 'name', + 'default' => [ + 'label' => $this->trans('Default store currency', [], 'Admin.International.Feature'), + 'value' => 0, + ], + ], + ], + [ + 'type' => 'select', + 'label' => $this->trans('Zone', [], 'Admin.Global'), + 'name' => 'id_zone', + 'options' => [ + 'query' => Zone::getZones(), + 'id' => 'id_zone', + 'name' => 'name', + ], + 'hint' => $this->trans('Geographical region.', [], 'Admin.International.Help'), + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Does it need Zip/Postal code?', [], 'Admin.International.Feature'), + 'name' => 'need_zip_code', + 'required' => false, + 'is_bool' => true, + 'values' => [ + [ + 'id' => 'need_zip_code_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'need_zip_code_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + ], + [ + 'type' => 'text', + 'label' => $this->trans('Zip/Postal code format', [], 'Admin.International.Feature'), + 'name' => 'zip_code_format', + 'required' => true, + 'desc' => $this->trans('Indicate the format of the postal code: use L for a letter, N for a number, and C for the country\'s ISO 3166-1 alpha-2 code. For example, NNNNN for the United States, France, Poland and many other; LNNNNLLL for Argentina, etc. If you do not want PrestaShop to verify the postal code for this country, leave it blank.', [], 'Admin.International.Help'), + ], + [ + 'type' => 'address_layout', + 'label' => $this->trans('Address format', [], 'Admin.International.Feature'), + 'name' => 'address_layout', + 'address_layout' => $address_layout, + 'encoding_address_layout' => urlencode($address_layout), + 'encoding_default_layout' => urlencode($default_layout), + 'display_valid_fields' => $this->displayValidFields(), + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Active', [], 'Admin.Global'), + 'name' => 'active', + 'required' => false, + 'is_bool' => true, + 'values' => [ + [ + 'id' => 'active_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'active_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + 'hint' => $this->trans('Display this country to your customers (the selected country will always be displayed in the Back Office).', [], 'Admin.International.Help'), + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Contains states', [], 'Admin.International.Feature'), + 'name' => 'contains_states', + 'required' => false, + 'values' => [ + [ + 'id' => 'contains_states_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'contains_states_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Do you need a tax identification number?', [], 'Admin.International.Feature'), + 'name' => 'need_identification_number', + 'required' => false, + 'values' => [ + [ + 'id' => 'need_identification_number_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'need_identification_number_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Display tax label (e.g. "Tax incl.")', [], 'Admin.International.Feature'), + 'name' => 'display_tax_label', + 'required' => false, + 'values' => [ + [ + 'id' => 'display_tax_label_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'display_tax_label_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + ], + ], + ]; + + if (Shop::isFeatureActive()) { + $this->fields_form['input'][] = [ + 'type' => 'shop', + 'label' => $this->trans('Shop association', [], 'Admin.Global'), + 'name' => 'checkBoxShopAsso', + ]; + } + + $this->fields_form['submit'] = [ + 'title' => $this->trans('Save', [], 'Admin.Actions'), + ]; + + return parent::renderForm(); + } + + public function processUpdate() + { + /** @var Country $country */ + $country = $this->loadObject(); + if (Validate::isLoadedObject($country) && Tools::getValue('id_zone')) { + $old_id_zone = $country->id_zone; + $results = Db::getInstance()->executeS('SELECT `id_state` FROM `' . _DB_PREFIX_ . 'state` WHERE `id_country` = ' . (int) $country->id . ' AND `id_zone` = ' . (int) $old_id_zone); + + if ($results && count($results)) { + $ids = []; + foreach ($results as $res) { + $ids[] = (int) $res['id_state']; + } + + if (count($ids)) { + $res = Db::getInstance()->execute( + 'UPDATE `' . _DB_PREFIX_ . 'state` + SET `id_zone` = ' . (int) Tools::getValue('id_zone') . ' + WHERE `id_state` IN (' . implode(',', $ids) . ')' + ); + } + } + } + + return parent::processUpdate(); + } + + public function postProcess() + { + if (!Tools::getValue('id_' . $this->table)) { + if (Validate::isLanguageIsoCode(Tools::getValue('iso_code')) && (int) Country::getByIso(Tools::getValue('iso_code'))) { + $this->errors[] = $this->trans('This ISO code already exists.You cannot create two countries with the same ISO code.', [], 'Admin.International.Notification'); + } + } elseif (Validate::isLanguageIsoCode(Tools::getValue('iso_code'))) { + $id_country = (int) Country::getByIso(Tools::getValue('iso_code')); + if ($id_country != 0 && $id_country != Tools::getValue('id_' . $this->table)) { + $this->errors[] = $this->trans('This ISO code already exists.You cannot create two countries with the same ISO code.', [], 'Admin.International.Notification'); + } + } + + return parent::postProcess(); + } + + public function processSave() + { + if (!$this->id_object) { + $tmp_addr_format = new AddressFormat(); + } else { + $tmp_addr_format = new AddressFormat($this->id_object); + } + + $tmp_addr_format->format = Tools::getValue('address_layout'); + + if (!$tmp_addr_format->checkFormatFields()) { + $error_list = $tmp_addr_format->getErrorList(); + foreach ($error_list as $error) { + $this->errors[] = $error; + } + } + if (strlen($tmp_addr_format->format) <= 0) { + $this->errors[] = $this->trans('Address format invalid', [], 'Admin.Notifications.Error'); + } + + $country = parent::processSave(); + + if (!count($this->errors)) { + if (null === $tmp_addr_format->id_country) { + $tmp_addr_format->id_country = $country->id; + } + + if (!$tmp_addr_format->save()) { + $this->errors[] = $this->trans('Invalid address layout %s', [Db::getInstance()->getMsgError()], 'Admin.International.Notification'); + } + } + + return $country; + } + + public function processStatus() + { + parent::processStatus(); + + /** @var Country $object */ + if (Validate::isLoadedObject($object = $this->loadObject()) && $object->active == 1) { + return Country::addModuleRestrictions([], [['id_country' => $object->id]], []); + } + + return false; + } + + /** + * Allow the assignation of zone only if the form is displayed. + */ + protected function processBulkAffectZone() + { + $zone_to_affect = Tools::getValue('zone_to_affect'); + if ($zone_to_affect && $zone_to_affect !== 0) { + parent::processBulkAffectZone(); + } + + if (Tools::getIsset('submitBulkAffectZonecountry')) { + $this->tpl_list_vars['assign_zone'] = true; + } + } + + protected function displayValidFields() + { + /* The following translations are needed later - don't remove the comments! + $this->trans('Customer', array(), 'Admin.Global'); + $this->trans('Warehouse', [], 'Admin.Global'); + $this->trans('Country', array(), 'Admin.Global'); + $this->trans('State', [], 'Admin.Global'); + $this->trans('Address', [], 'Admin.Global'); + */ + + $html_tabnav = ''; + $html_tabcontent .= ''; + + return $html_tabnav . $html_tabcontent; + } + + public static function displayCallPrefix($prefix) + { + return (int) $prefix ? '+' . $prefix : '-'; + } +} diff --git a/controllers/admin/AdminCustomerThreadsController.php b/controllers/admin/AdminCustomerThreadsController.php new file mode 100644 index 0000000..350b437 --- /dev/null +++ b/controllers/admin/AdminCustomerThreadsController.php @@ -0,0 +1,1221 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property CustomerThread $object + */ +class AdminCustomerThreadsControllerCore extends AdminController +{ + public function __construct() + { + $this->bootstrap = true; + $this->context = Context::getContext(); + $this->table = 'customer_thread'; + $this->className = 'CustomerThread'; + $this->lang = false; + + $contact_array = []; + $contacts = Contact::getContacts($this->context->language->id); + + foreach ($contacts as $contact) { + $contact_array[$contact['id_contact']] = $contact['name']; + } + + $language_array = []; + $languages = Language::getLanguages(); + foreach ($languages as $language) { + $language_array[$language['id_lang']] = $language['name']; + } + + parent::__construct(); + + $icon_array = [ + 'open' => ['class' => 'icon-circle text-success', 'alt' => $this->trans('Open', [], 'Admin.Catalog.Feature')], + 'closed' => ['class' => 'icon-circle text-danger', 'alt' => $this->trans('Closed', [], 'Admin.Catalog.Feature')], + 'pending1' => ['class' => 'icon-circle text-warning', 'alt' => $this->trans('Pending 1', [], 'Admin.Catalog.Feature')], + 'pending2' => ['class' => 'icon-circle text-warning', 'alt' => $this->trans('Pending 2', [], 'Admin.Catalog.Feature')], + ]; + + $status_array = []; + foreach ($icon_array as $k => $v) { + $status_array[$k] = $v['alt']; + } + + $this->fields_list = [ + 'id_customer_thread' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'customer' => [ + 'title' => $this->trans('Customer', [], 'Admin.Global'), + 'filter_key' => 'customer', + 'tmpTableFilter' => true, + ], + 'email' => [ + 'title' => $this->trans('Email', [], 'Admin.Global'), + 'filter_key' => 'a!email', + ], + 'contact' => [ + 'title' => $this->trans('Type', [], 'Admin.Catalog.Feature'), + 'type' => 'select', + 'list' => $contact_array, + 'filter_key' => 'cl!id_contact', + 'filter_type' => 'int', + ], + 'language' => [ + 'title' => $this->trans('Language', [], 'Admin.Global'), + 'type' => 'select', + 'list' => $language_array, + 'filter_key' => 'l!id_lang', + 'filter_type' => 'int', + ], + 'status' => [ + 'title' => $this->trans('Status', [], 'Admin.Global'), + 'type' => 'select', + 'list' => $status_array, + 'icon' => $icon_array, + 'align' => 'center', + 'filter_key' => 'a!status', + 'filter_type' => 'string', + ], + 'employee' => [ + 'title' => $this->trans('Employee', [], 'Admin.Global'), + 'filter_key' => 'employee', + 'tmpTableFilter' => true, + ], + 'messages' => [ + 'title' => $this->trans('Messages', [], 'Admin.Catalog.Feature'), + 'filter_key' => 'messages', + 'tmpTableFilter' => true, + 'maxlength' => 40, + ], + 'private' => [ + 'title' => $this->trans('Private', [], 'Admin.Catalog.Feature'), + 'type' => 'select', + 'filter_key' => 'private', + 'align' => 'center', + 'cast' => 'intval', + 'callback' => 'printOptinIcon', + 'list' => [ + '0' => $this->trans('No', [], 'Admin.Global'), + '1' => $this->trans('Yes', [], 'Admin.Global'), + ], + ], + 'date_upd' => [ + 'title' => $this->trans('Last message', [], 'Admin.Catalog.Feature'), + 'havingFilter' => true, + 'type' => 'datetime', + ], + ]; + + $this->bulk_actions = [ + 'delete' => [ + 'text' => $this->trans('Delete selected', [], 'Admin.Actions'), + 'confirm' => $this->trans('Delete selected items?', [], 'Admin.Notifications.Warning'), + 'icon' => 'icon-trash', + ], + ]; + + $this->shopLinkType = 'shop'; + + $this->fields_options = [ + 'contact' => [ + 'title' => $this->trans('Contact options', [], 'Admin.Catalog.Feature'), + 'fields' => [ + 'PS_CUSTOMER_SERVICE_FILE_UPLOAD' => [ + 'title' => $this->trans('Allow file uploading', [], 'Admin.Catalog.Feature'), + 'hint' => $this->trans('Allow customers to upload files using the contact page.', [], 'Admin.Catalog.Help'), + 'type' => 'bool', + ], + 'PS_CUSTOMER_SERVICE_SIGNATURE' => [ + 'title' => $this->trans('Default message', [], 'Admin.Catalog.Feature'), + 'hint' => $this->trans('Please fill out the message fields that appear by default when you answer a thread on the customer service page.', [], 'Admin.Catalog.Help'), + 'type' => 'textareaLang', + 'lang' => true, + ], + ], + 'submit' => ['title' => $this->trans('Save', [], 'Admin.Actions')], + ], + 'general' => [ + 'title' => $this->trans('Customer service options', [], 'Admin.Catalog.Feature'), + 'fields' => [ + 'PS_SAV_IMAP_URL' => [ + 'title' => $this->trans('IMAP URL', [], 'Admin.Catalog.Feature'), + 'hint' => $this->trans('URL for your IMAP server (ie.: mail.server.com).', [], 'Admin.Catalog.Help'), + 'type' => 'text', + 'validation' => 'isValidImapUrl', + ], + 'PS_SAV_IMAP_PORT' => [ + 'title' => $this->trans('IMAP port', [], 'Admin.Catalog.Feature'), + 'hint' => $this->trans('Port to use to connect to your IMAP server.', [], 'Admin.Catalog.Help'), + 'type' => 'text', + 'defaultValue' => 143, + ], + 'PS_SAV_IMAP_USER' => [ + 'title' => $this->trans('IMAP user', [], 'Admin.Catalog.Feature'), + 'hint' => $this->trans('User to use to connect to your IMAP server.', [], 'Admin.Catalog.Help'), + 'type' => 'text', + ], + 'PS_SAV_IMAP_PWD' => [ + 'title' => $this->trans('IMAP password', [], 'Admin.Catalog.Feature'), + 'hint' => $this->trans('Password to use to connect your IMAP server.', [], 'Admin.Catalog.Help'), + 'type' => 'password', + ], + 'PS_SAV_IMAP_DELETE_MSG' => [ + 'title' => $this->trans('Delete messages', [], 'Admin.Catalog.Feature'), + 'hint' => $this->trans('Delete messages after synchronization. If you do not enable this option, the synchronization will take more time.', [], 'Admin.Catalog.Help'), + 'type' => 'bool', + ], + 'PS_SAV_IMAP_CREATE_THREADS' => [ + 'title' => $this->trans('Create new threads', [], 'Admin.Catalog.Feature'), + 'hint' => $this->trans('Create new threads for unrecognized emails.', [], 'Admin.Catalog.Help'), + 'type' => 'bool', + ], + 'PS_SAV_IMAP_OPT_POP3' => [ + 'title' => $this->trans('IMAP options', [], 'Admin.Catalog.Feature') . ' (/pop3)', + 'hint' => $this->trans('Use POP3 instead of IMAP.', [], 'Admin.Catalog.Help'), + 'type' => 'bool', + ], + 'PS_SAV_IMAP_OPT_NORSH' => [ + 'title' => $this->trans('IMAP options', [], 'Admin.Catalog.Feature') . ' (/norsh)', + 'type' => 'bool', + 'hint' => $this->trans('Do not use RSH or SSH to establish a preauthenticated IMAP sessions.', [], 'Admin.Catalog.Help'), + ], + 'PS_SAV_IMAP_OPT_SSL' => [ + 'title' => $this->trans('IMAP options', [], 'Admin.Catalog.Feature') . ' (/ssl)', + 'type' => 'bool', + 'hint' => $this->trans('Use the Secure Socket Layer (TLS/SSL) to encrypt the session.', [], 'Admin.Catalog.Help'), + ], + 'PS_SAV_IMAP_OPT_VALIDATE-CERT' => [ + 'title' => $this->trans('IMAP options', [], 'Admin.Catalog.Feature') . ' (/validate-cert)', + 'type' => 'bool', + 'hint' => $this->trans('Validate certificates from the TLS/SSL server.', [], 'Admin.Catalog.Help'), + ], + 'PS_SAV_IMAP_OPT_NOVALIDATE-CERT' => [ + 'title' => $this->trans('IMAP options', [], 'Admin.Catalog.Feature') . ' (/novalidate-cert)', + 'type' => 'bool', + 'hint' => $this->trans('Do not validate certificates from the TLS/SSL server. This is only needed if a server uses self-signed certificates.', [], 'Admin.Catalog.Help'), + ], + 'PS_SAV_IMAP_OPT_TLS' => [ + 'title' => $this->trans('IMAP options', [], 'Admin.Catalog.Feature') . ' (/tls)', + 'type' => 'bool', + 'hint' => $this->trans('Force use of start-TLS to encrypt the session, and reject connection to servers that do not support it.', [], 'Admin.Catalog.Help'), + ], + 'PS_SAV_IMAP_OPT_NOTLS' => [ + 'title' => $this->trans('IMAP options', [], 'Admin.Catalog.Feature') . ' (/notls)', + 'type' => 'bool', + 'hint' => $this->trans('Do not use start-TLS to encrypt the session, even with servers that support it.', [], 'Admin.Catalog.Help'), + ], + ], + 'submit' => ['title' => $this->trans('Save', [], 'Admin.Actions')], + ], + ]; + } + + public function renderList() + { + // Check the new IMAP messages before rendering the list + $this->renderProcessSyncImap(); + + $this->addRowAction('view'); + $this->addRowAction('delete'); + + $this->_select = ' + CONCAT(c.`firstname`," ",c.`lastname`) as customer, cl.`name` as contact, l.`name` as language, group_concat(cm.`message`) as messages, cm.private, + ( + SELECT IFNULL(CONCAT(LEFT(e.`firstname`, 1),". ",e.`lastname`), "--") + FROM `' . _DB_PREFIX_ . 'customer_message` cm2 + INNER JOIN ' . _DB_PREFIX_ . 'employee e + ON e.`id_employee` = cm2.`id_employee` + WHERE cm2.id_employee > 0 + AND cm2.`id_customer_thread` = a.`id_customer_thread` + ORDER BY cm2.`date_add` DESC LIMIT 1 + ) as employee'; + + $this->_join = ' + LEFT JOIN `' . _DB_PREFIX_ . 'customer` c + ON c.`id_customer` = a.`id_customer` + LEFT JOIN `' . _DB_PREFIX_ . 'customer_message` cm + ON cm.`id_customer_thread` = a.`id_customer_thread` + LEFT JOIN `' . _DB_PREFIX_ . 'lang` l + ON l.`id_lang` = a.`id_lang` + LEFT JOIN `' . _DB_PREFIX_ . 'contact_lang` cl + ON (cl.`id_contact` = a.`id_contact` AND cl.`id_lang` = ' . (int) $this->context->language->id . ')'; + + if ($id_order = Tools::getValue('id_order')) { + $this->_where .= ' AND id_order = ' . (int) $id_order; + } + + $this->_group = 'GROUP BY cm.id_customer_thread'; + $this->_orderBy = 'id_customer_thread'; + $this->_orderWay = 'DESC'; + + $contacts = CustomerThread::getContacts(); + + $categories = Contact::getCategoriesContacts(); + + $params = [ + $this->trans('Total threads', [], 'Admin.Catalog.Feature') => $all = CustomerThread::getTotalCustomerThreads(), + $this->trans('Threads pending', [], 'Admin.Catalog.Feature') => $pending = CustomerThread::getTotalCustomerThreads('status LIKE "%pending%"'), + $this->trans('Total number of customer messages', [], 'Admin.Catalog.Feature') => CustomerMessage::getTotalCustomerMessages('id_employee = 0'), + $this->trans('Total number of employee messages', [], 'Admin.Catalog.Feature') => CustomerMessage::getTotalCustomerMessages('id_employee != 0'), + $this->trans('Unread threads', [], 'Admin.Catalog.Feature') => $unread = CustomerThread::getTotalCustomerThreads('status = "open"'), + $this->trans('Closed threads', [], 'Admin.Catalog.Feature') => $all - ($unread + $pending), + ]; + + $this->tpl_list_vars = [ + 'contacts' => $contacts, + 'categories' => $categories, + 'params' => $params, + ]; + + return parent::renderList(); + } + + public function initToolbar() + { + parent::initToolbar(); + unset($this->toolbar_btn['new']); + } + + public function printOptinIcon($value, $customer) + { + return $value ? '' : ''; + } + + public function postProcess() + { + if ($id_customer_thread = (int) Tools::getValue('id_customer_thread')) { + if (($id_contact = (int) Tools::getValue('id_contact'))) { + $result = Db::getInstance()->execute( + ' + UPDATE ' . _DB_PREFIX_ . 'customer_thread + SET id_contact = ' . $id_contact . ' + WHERE id_customer_thread = ' . $id_customer_thread + ); + if ($result) { + $this->object->id_contact = $id_contact; + } + } + if ($id_status = (int) Tools::getValue('setstatus')) { + $status_array = [1 => 'open', 2 => 'closed', 3 => 'pending1', 4 => 'pending2']; + $result = Db::getInstance()->execute(' + UPDATE ' . _DB_PREFIX_ . 'customer_thread + SET status = "' . $status_array[$id_status] . '" + WHERE id_customer_thread = ' . $id_customer_thread . ' LIMIT 1 + '); + if ($result) { + $this->object->status = $status_array[$id_status]; + } + } + if (isset($_POST['id_employee_forward'])) { + $messages = Db::getInstance()->getRow(' + SELECT ct.*, cm.*, cl.name subject, CONCAT(e.firstname, \' \', e.lastname) employee_name, + CONCAT(c.firstname, \' \', c.lastname) customer_name, c.firstname + FROM ' . _DB_PREFIX_ . 'customer_thread ct + LEFT JOIN ' . _DB_PREFIX_ . 'customer_message cm + ON (ct.id_customer_thread = cm.id_customer_thread) + LEFT JOIN ' . _DB_PREFIX_ . 'contact_lang cl + ON (cl.id_contact = ct.id_contact AND cl.id_lang = ' . (int) $this->context->language->id . ') + LEFT OUTER JOIN ' . _DB_PREFIX_ . 'employee e + ON e.id_employee = cm.id_employee + LEFT OUTER JOIN ' . _DB_PREFIX_ . 'customer c + ON (c.email = ct.email) + WHERE ct.id_customer_thread = ' . (int) Tools::getValue('id_customer_thread') . ' + ORDER BY cm.date_add DESC + '); + $output = $this->displayMessage($messages, true, (int) Tools::getValue('id_employee_forward')); + $cm = new CustomerMessage(); + $cm->id_employee = (int) $this->context->employee->id; + $cm->id_customer_thread = (int) Tools::getValue('id_customer_thread'); + $cm->ip_address = (int) ip2long(Tools::getRemoteAddr()); + $current_employee = $this->context->employee; + $id_employee = (int) Tools::getValue('id_employee_forward'); + $employee = new Employee($id_employee); + $email = Tools::getValue('email'); + $message = Tools::getValue('message_forward'); + if (($error = $cm->validateField('message', $message, null, [], true)) !== true) { + $this->errors[] = $error; + } elseif ($id_employee && $employee && Validate::isLoadedObject($employee)) { + $params = [ + '{messages}' => Tools::stripslashes($output), + '{employee}' => $current_employee->firstname . ' ' . $current_employee->lastname, + '{comment}' => Tools::stripslashes(Tools::nl2br($_POST['message_forward'])), + '{firstname}' => $employee->firstname, + '{lastname}' => $employee->lastname, + ]; + + if (Mail::Send( + $this->context->language->id, + 'forward_msg', + $this->trans( + 'Fwd: Customer message', + [], + 'Emails.Subject', + $this->context->language->locale + ), + $params, + $employee->email, + $employee->firstname . ' ' . $employee->lastname, + $current_employee->email, + $current_employee->firstname . ' ' . $current_employee->lastname, + null, + null, + _PS_MAIL_DIR_, + true + )) { + $cm->private = 1; + $cm->message = $this->trans('Message forwarded to', [], 'Admin.Catalog.Feature') . ' ' . $employee->firstname . ' ' . $employee->lastname . "\n" . $this->trans('Comment:') . ' ' . $message; + $cm->add(); + } + } elseif ($email && Validate::isEmail($email)) { + $params = [ + '{messages}' => Tools::nl2br(Tools::stripslashes($output)), + '{employee}' => $current_employee->firstname . ' ' . $current_employee->lastname, + '{comment}' => Tools::stripslashes($_POST['message_forward']), + '{firstname}' => '', + '{lastname}' => '', + ]; + + if (Mail::Send( + $this->context->language->id, + 'forward_msg', + $this->trans( + 'Fwd: Customer message', + [], + 'Emails.Subject', + $this->context->language->locale + ), + $params, + $email, + null, + $current_employee->email, + $current_employee->firstname . ' ' . $current_employee->lastname, + null, + null, + _PS_MAIL_DIR_, + true + )) { + $cm->message = $this->trans('Message forwarded to', [], 'Admin.Catalog.Feature') . ' ' . $email . "\n" . $this->trans('Comment:') . ' ' . $message; + $cm->add(); + } + } else { + $this->errors[] = '
' . $this->trans('The email address is invalid.', [], 'Admin.Notifications.Error') . '
'; + } + } + if (Tools::isSubmit('submitReply')) { + $ct = new CustomerThread($id_customer_thread); + + ShopUrl::cacheMainDomainForShop((int) $ct->id_shop); + + $cm = new CustomerMessage(); + $cm->id_employee = (int) $this->context->employee->id; + $cm->id_customer_thread = $ct->id; + $cm->ip_address = (int) ip2long(Tools::getRemoteAddr()); + $cm->message = Tools::getValue('reply_message'); + if (($error = $cm->validateField('message', $cm->message, null, [], true)) !== true) { + $this->errors[] = $error; + } elseif (isset($_FILES) && !empty($_FILES['joinFile']['name']) && $_FILES['joinFile']['error'] != 0) { + $this->errors[] = $this->trans('An error occurred during the file upload process.', [], 'Admin.Notifications.Error'); + } elseif ($cm->add()) { + $file_attachment = null; + if (!empty($_FILES['joinFile']['name'])) { + $file_attachment['content'] = file_get_contents($_FILES['joinFile']['tmp_name']); + $file_attachment['name'] = $_FILES['joinFile']['name']; + $file_attachment['mime'] = $_FILES['joinFile']['type']; + } + $customer = new Customer($ct->id_customer); + + $params = [ + '{reply}' => Tools::nl2br(Tools::htmlentitiesUTF8(Tools::getValue('reply_message'))), + '{link}' => Tools::url( + $this->context->link->getPageLink('contact', true, null, null, false, $ct->id_shop), + 'id_customer_thread=' . (int) $ct->id . '&token=' . $ct->token + ), + '{firstname}' => $customer->firstname, + '{lastname}' => $customer->lastname, + ]; + //#ct == id_customer_thread #tc == token of thread <== used in the synchronization imap + $contact = new Contact((int) $ct->id_contact, (int) $ct->id_lang); + + if (Validate::isLoadedObject($contact)) { + $from_name = $contact->name; + $from_email = $contact->email; + } else { + $from_name = null; + $from_email = null; + } + + $language = new Language((int) $ct->id_lang); + + if (Mail::Send( + (int) $ct->id_lang, + 'reply_msg', + $this->trans( + 'An answer to your message is available #ct%thread_id% #tc%thread_token%', + [ + '%thread_id%' => $ct->id, + '%thread_token%' => $ct->token, + ], + 'Emails.Subject', + $language->locale + ), + $params, + Tools::getValue('msg_email'), + null, + $from_email, + $from_name, + $file_attachment, + null, + _PS_MAIL_DIR_, + true, + $ct->id_shop + )) { + $ct->status = 'closed'; + $ct->update(); + } + Tools::redirectAdmin( + self::$currentIndex . '&id_customer_thread=' . (int) $id_customer_thread . '&viewcustomer_thread&token=' . Tools::getValue('token') + ); + } else { + $this->errors[] = $this->trans('An error occurred. Your message was not sent. Please contact your system administrator.', [], 'Admin.Orderscustomers.Notification'); + } + } + } + + return parent::postProcess(); + } + + public function initContent() + { + if (isset($_GET['filename'])) { + if (file_exists(_PS_UPLOAD_DIR_ . $_GET['filename']) && Validate::isFileName($_GET['filename'])) { + $this->openUploadedFile(!Tools::getValue('show')); + } else { + Tools::redirect('404'); + } + } + + return parent::initContent(); + } + + protected function openUploadedFile(bool $forceDownload = true) + { + $filename = $_GET['filename']; + + $extensions = [ + '.txt' => 'text/plain', + '.rtf' => 'application/rtf', + '.doc' => 'application/msword', + '.docx' => 'application/msword', + '.pdf' => 'application/pdf', + '.zip' => 'multipart/x-zip', + '.png' => 'image/png', + '.jpeg' => 'image/jpeg', + '.gif' => 'image/gif', + '.jpg' => 'image/jpeg', + ]; + + $extension = false; + foreach ($extensions as $key => $val) { + if (substr(Tools::strtolower($filename), -4) == $key || substr(Tools::strtolower($filename), -5) == $key) { + $extension = $val; + + break; + } + } + + if (!$extension || !Validate::isFileName($filename)) { + die(Tools::displayError()); + } + + if (ob_get_level() && ob_get_length() > 0) { + ob_end_clean(); + } + header('Content-Type: ' . $extension); + if ($forceDownload) { + header('Content-Disposition:attachment;filename="' . $filename . '"'); + } + readfile(_PS_UPLOAD_DIR_ . $filename); + die; + } + + public function renderKpis() + { + $time = time(); + $kpis = []; + + /* The data generation is located in AdminStatsControllerCore */ + + $helper = new HelperKpi(); + $helper->id = 'box-pending-messages'; + $helper->icon = 'icon-envelope'; + $helper->color = 'color1'; + $helper->href = $this->context->link->getAdminLink('AdminCustomerThreads'); + $helper->title = $this->trans('Pending Discussion Threads', [], 'Admin.Catalog.Feature'); + if (ConfigurationKPI::get('PENDING_MESSAGES') !== false) { + $helper->value = ConfigurationKPI::get('PENDING_MESSAGES'); + } + $helper->source = $this->context->link->getAdminLink('AdminStats') . '&ajax=1&action=getKpi&kpi=pending_messages'; + $helper->refresh = (bool) (ConfigurationKPI::get('PENDING_MESSAGES_EXPIRE') < $time); + $kpis[] = $helper->generate(); + + $helper = new HelperKpi(); + $helper->id = 'box-age'; + $helper->icon = 'icon-time'; + $helper->color = 'color2'; + $helper->title = $this->trans('Average Response Time', [], 'Admin.Catalog.Feature'); + $helper->subtitle = $this->trans('30 days', [], 'Admin.Global'); + if (ConfigurationKPI::get('AVG_MSG_RESPONSE_TIME') !== false) { + $helper->value = ConfigurationKPI::get('AVG_MSG_RESPONSE_TIME'); + } + $helper->source = $this->context->link->getAdminLink('AdminStats') . '&ajax=1&action=getKpi&kpi=avg_msg_response_time'; + $helper->refresh = (bool) (ConfigurationKPI::get('AVG_MSG_RESPONSE_TIME_EXPIRE') < $time); + $kpis[] = $helper->generate(); + + $helper = new HelperKpi(); + $helper->id = 'box-messages-per-thread'; + $helper->icon = 'icon-copy'; + $helper->color = 'color3'; + $helper->title = $this->trans('Messages per Thread', [], 'Admin.Catalog.Feature'); + $helper->subtitle = $this->trans('30 day', [], 'Admin.Global'); + if (ConfigurationKPI::get('MESSAGES_PER_THREAD') !== false) { + $helper->value = ConfigurationKPI::get('MESSAGES_PER_THREAD'); + } + $helper->source = $this->context->link->getAdminLink('AdminStats') . '&ajax=1&action=getKpi&kpi=messages_per_thread'; + $helper->refresh = (bool) (ConfigurationKPI::get('MESSAGES_PER_THREAD_EXPIRE') < $time); + $kpis[] = $helper->generate(); + + $helper = new HelperKpiRow(); + $helper->kpis = $kpis; + + return $helper->generate(); + } + + public function renderView() + { + if (!$id_customer_thread = (int) Tools::getValue('id_customer_thread')) { + return; + } + + $this->context = Context::getContext(); + if (!($thread = $this->loadObject())) { + return; + } + $this->context->cookie->{'customer_threadFilter_cl!id_contact'} = $thread->id_contact; + + $employees = Employee::getEmployees(); + + $messages = CustomerThread::getMessageCustomerThreads($id_customer_thread); + + foreach ($messages as $key => $mess) { + if ($mess['id_employee']) { + $employee = new Employee($mess['id_employee']); + $messages[$key]['employee_image'] = $employee->getImage(); + } + if (empty($mess['file_name'])) { + unset($messages[$key]['file_name']); + } else { + $messages[$key]['file_link'] = $this->context->link->getAdminLink( + 'AdminCustomerThreads', + true, + [], + [ + 'id_customer_thread' => $id_customer_thread, + 'viewcustomer_thread' => '', + 'filename' => $mess['file_name'], + 'show' => true, + ] + ); + } + + if ($mess['id_product']) { + $product = new Product((int) $mess['id_product'], false, $this->context->language->id); + if (Validate::isLoadedObject($product)) { + $messages[$key]['product_name'] = $product->name; + $messages[$key]['product_link'] = $this->context->link->getAdminLink('AdminProducts', true, ['id_product' => (int) $product->id, 'updateproduct' => '1']); + } + } + } + + $next_thread = CustomerThread::getNextThread((int) $thread->id); + + $contacts = Contact::getContacts($this->context->language->id); + + $actions = []; + + if ($next_thread) { + $next_thread = [ + 'href' => self::$currentIndex . '&id_customer_thread=' . (int) $next_thread . '&viewcustomer_thread&token=' . $this->token, + 'name' => $this->trans('Reply to the next unanswered message in this thread', [], 'Admin.Catalog.Feature'), + ]; + } + + if ($thread->status != 'closed') { + $actions['closed'] = [ + 'href' => self::$currentIndex . '&viewcustomer_thread&setstatus=2&id_customer_thread=' . (int) Tools::getValue('id_customer_thread') . '&viewmsg&token=' . $this->token, + 'label' => $this->trans('Mark as "handled"', [], 'Admin.Catalog.Feature'), + 'name' => 'setstatus', + 'value' => 2, + ]; + } else { + $actions['open'] = [ + 'href' => self::$currentIndex . '&viewcustomer_thread&setstatus=1&id_customer_thread=' . (int) Tools::getValue('id_customer_thread') . '&viewmsg&token=' . $this->token, + 'label' => $this->trans('Re-open', [], 'Admin.Catalog.Feature'), + 'name' => 'setstatus', + 'value' => 1, + ]; + } + + if ($thread->status != 'pending1') { + $actions['pending1'] = [ + 'href' => self::$currentIndex . '&viewcustomer_thread&setstatus=3&id_customer_thread=' . (int) Tools::getValue('id_customer_thread') . '&viewmsg&token=' . $this->token, + 'label' => $this->trans('Mark as "pending 1" (will be answered later)', [], 'Admin.Catalog.Feature'), + 'name' => 'setstatus', + 'value' => 3, + ]; + } else { + $actions['pending1'] = [ + 'href' => self::$currentIndex . '&viewcustomer_thread&setstatus=1&id_customer_thread=' . (int) Tools::getValue('id_customer_thread') . '&viewmsg&token=' . $this->token, + 'label' => $this->trans('Disable pending status', [], 'Admin.Catalog.Feature'), + 'name' => 'setstatus', + 'value' => 1, + ]; + } + + if ($thread->status != 'pending2') { + $actions['pending2'] = [ + 'href' => self::$currentIndex . '&viewcustomer_thread&setstatus=4&id_customer_thread=' . (int) Tools::getValue('id_customer_thread') . '&viewmsg&token=' . $this->token, + 'label' => $this->trans('Mark as "pending 2" (will be answered later)', [], 'Admin.Catalog.Feature'), + 'name' => 'setstatus', + 'value' => 4, + ]; + } else { + $actions['pending2'] = [ + 'href' => self::$currentIndex . '&viewcustomer_thread&setstatus=1&id_customer_thread=' . (int) Tools::getValue('id_customer_thread') . '&viewmsg&token=' . $this->token, + 'label' => $this->trans('Disable pending status', [], 'Admin.Catalog.Feature'), + 'name' => 'setstatus', + 'value' => 1, + ]; + } + + if ($thread->id_customer) { + $customer = new Customer($thread->id_customer); + $orders = Order::getCustomerOrders($customer->id); + if ($orders && count($orders)) { + $total_ok = 0; + $orders_ok = []; + foreach ($orders as $key => $order) { + if ($order['valid']) { + $orders_ok[] = $order; + $total_ok += $order['total_paid_real'] / $order['conversion_rate']; + } + $orders[$key]['date_add'] = Tools::displayDate($order['date_add']); + $orders[$key]['total_paid_real'] = $this->context->getCurrentLocale()->formatPrice($order['total_paid_real'], Currency::getIsoCodeById((int) $order['id_currency'])); + } + } + + $products = $customer->getBoughtProducts(); + if ($products && count($products)) { + foreach ($products as $key => $product) { + $products[$key]['date_add'] = Tools::displayDate($product['date_add'], null, true); + } + } + } + $timeline_items = $this->getTimeline($messages, $thread->id_order); + $first_message = $messages[0]; + + if (!$messages[0]['id_employee']) { + unset($messages[0]); + } + + $contact = ''; + foreach ($contacts as $c) { + if ($c['id_contact'] == $thread->id_contact) { + $contact = $c['name']; + } + } + + $this->tpl_view_vars = [ + 'id_customer_thread' => $id_customer_thread, + 'thread' => $thread, + 'actions' => $actions, + 'employees' => $employees, + 'current_employee' => $this->context->employee, + 'messages' => $messages, + 'first_message' => $first_message, + 'contact' => $contact, + 'next_thread' => $next_thread, + 'orders' => isset($orders) ? $orders : false, + 'customer' => isset($customer) ? $customer : false, + 'products' => isset($products) ? $products : false, + 'total_ok' => isset($total_ok) ? $this->context->getCurrentLocale()->formatPrice($total_ok, $this->context->currency->iso_code) : false, + 'orders_ok' => isset($orders_ok) ? $orders_ok : false, + 'count_ok' => isset($orders_ok) ? count($orders_ok) : false, + 'PS_CUSTOMER_SERVICE_SIGNATURE' => str_replace('\r\n', "\n", Configuration::get('PS_CUSTOMER_SERVICE_SIGNATURE', (int) $thread->id_lang)), + 'timeline_items' => $timeline_items, + ]; + + if ($next_thread) { + $this->tpl_view_vars['next_thread'] = $next_thread; + } + + return parent::renderView(); + } + + public function getTimeline($messages, $id_order) + { + $timeline = []; + foreach ($messages as $message) { + $product = new Product((int) $message['id_product'], false, $this->context->language->id); + + $content = ''; + if (!$message['private']) { + $content .= $this->trans('Message to:', [], 'Admin.Catalog.Feature') . ' ' . (!$message['id_employee'] ? $message['subject'] : $message['customer_name']) . '
'; + } + if (Validate::isLoadedObject($product)) { + $content .= '
' . $this->trans('Product:', [], 'Admin.Catalog.Feature') . '' . $product->name . '

'; + } + $content .= Tools::safeOutput($message['message']); + + $timeline[$message['date_add']][] = [ + 'arrow' => 'left', + 'background_color' => '', + 'icon' => 'icon-envelope', + 'content' => $content, + 'date' => $message['date_add'], + ]; + } + + $order = new Order((int) $id_order); + if (Validate::isLoadedObject($order)) { + $order_history = $order->getHistory($this->context->language->id); + foreach ($order_history as $history) { + $parameters = ['vieworder' => 1, 'id_order' => (int) $order->id]; + $link_order = $this->context->link->getAdminLink('AdminOrders', true, [], $parameters); + + $content = '' . $this->trans('Order', [], 'Admin.Global') . ' #' . (int) $order->id . '

'; + + $content .= '' . $this->trans('Status:', [], 'Admin.Catalog.Feature') . ' ' . $history['ostate_name'] . ''; + + $timeline[$history['date_add']][] = [ + 'arrow' => 'right', + 'alt' => true, + 'background_color' => $history['color'], + 'icon' => 'icon-credit-card', + 'content' => $content, + 'date' => $history['date_add'], + 'see_more_link' => $link_order, + ]; + } + } + krsort($timeline); + + return $timeline; + } + + protected function displayMessage($message, $email = false, $id_employee = null) + { + $tpl = $this->createTemplate('message.tpl'); + + $contacts = Contact::getContacts($this->context->language->id); + foreach ($contacts as $contact) { + $contact_array[$contact['id_contact']] = ['id_contact' => $contact['id_contact'], 'name' => $contact['name']]; + } + $contacts = $contact_array; + + if (!$email) { + if (!empty($message['id_product']) && empty($message['employee_name'])) { + $id_order_product = Order::getIdOrderProduct((int) $message['id_customer'], (int) $message['id_product']); + } + } + $message['date_add'] = Tools::displayDate($message['date_add'], null, true); + $message['user_agent'] = strip_tags($message['user_agent']); + $message['message'] = preg_replace( + '/(https?:\/\/[a-z0-9#%&_=\(\)\.\? \+\-@\/]{6,1000})([\s\n<])/Uui', + '\1\2', + html_entity_decode( + $message['message'], + ENT_QUOTES, + 'UTF-8' + ) + ); + + $is_valid_order_id = true; + $order = new Order((int) $message['id_order']); + + if (!Validate::isLoadedObject($order)) { + $is_valid_order_id = false; + } + + $tpl->assign([ + 'thread_url' => Tools::getAdminUrl(basename(_PS_ADMIN_DIR_) . '/' . + $this->context->link->getAdminLink('AdminCustomerThreads') . '&id_customer_thread=' + . (int) $message['id_customer_thread'] . '&viewcustomer_thread=1'), + 'link' => Context::getContext()->link, + 'current' => self::$currentIndex, + 'token' => $this->token, + 'message' => $message, + 'id_order_product' => isset($id_order_product) ? $id_order_product : null, + 'email' => $email, + 'id_employee' => $id_employee, + 'PS_SHOP_NAME' => Configuration::get('PS_SHOP_NAME'), + 'file_name' => file_exists(_PS_UPLOAD_DIR_ . $message['file_name']), + 'contacts' => $contacts, + 'is_valid_order_id' => $is_valid_order_id, + ]); + + return $tpl->fetch(); + } + + protected function displayButton($content) + { + return '

' . $content . '

'; + } + + public function renderOptions() + { + if (Configuration::get('PS_SAV_IMAP_URL') + && Configuration::get('PS_SAV_IMAP_PORT') + && Configuration::get('PS_SAV_IMAP_USER') + && Configuration::get('PS_SAV_IMAP_PWD')) { + $this->tpl_option_vars['use_sync'] = true; + } else { + $this->tpl_option_vars['use_sync'] = false; + } + + return parent::renderOptions(); + } + + public function updateOptionPsSavImapOpt($value) + { + if ($this->access('edit') != '1') { + throw new PrestaShopException($this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error')); + } + + if (!$this->errors && $value) { + Configuration::updateValue('PS_SAV_IMAP_OPT', implode('', $value)); + } + } + + public function ajaxProcessMarkAsRead() + { + if ($this->access('edit') != '1') { + throw new PrestaShopException($this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error')); + } + + $id_thread = Tools::getValue('id_thread'); + $messages = CustomerThread::getMessageCustomerThreads($id_thread); + if (count($messages)) { + Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'customer_message` set `read` = 1 WHERE `id_employee` = ' . (int) $this->context->employee->id . ' AND `id_customer_thread` = ' . (int) $id_thread); + } + } + + /** + * Call the IMAP synchronization during an AJAX process. + * + * @throws PrestaShopException + */ + public function ajaxProcessSyncImap() + { + if ($this->access('edit') != '1') { + throw new PrestaShopException($this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error')); + } + + if (Tools::isSubmit('syncImapMail')) { + die(json_encode($this->syncImap())); + } + } + + /** + * Call the IMAP synchronization during the render process. + */ + public function renderProcessSyncImap() + { + // To avoid an error if the IMAP isn't configured, we check the configuration here, like during + // the synchronization. All parameters will exists. + if (!(Configuration::get('PS_SAV_IMAP_URL') + || Configuration::get('PS_SAV_IMAP_PORT') + || Configuration::get('PS_SAV_IMAP_USER') + || Configuration::get('PS_SAV_IMAP_PWD'))) { + return; + } + + // Executes the IMAP synchronization. + $sync_errors = $this->syncImap(); + + // Show the errors. + if (isset($sync_errors['hasError']) && $sync_errors['hasError']) { + if (isset($sync_errors['errors'])) { + foreach ($sync_errors['errors'] as $error) { + $this->displayWarning($error); + } + } + } + } + + /** + * Imap synchronization method. + * + * @return array errors list + */ + public function syncImap() + { + if (!($url = Configuration::get('PS_SAV_IMAP_URL')) + || !($port = Configuration::get('PS_SAV_IMAP_PORT')) + || !($user = Configuration::get('PS_SAV_IMAP_USER')) + || !($password = Configuration::get('PS_SAV_IMAP_PWD'))) { + return ['hasError' => true, 'errors' => ['IMAP configuration is not correct']]; + } + + $conf = Configuration::getMultiple([ + 'PS_SAV_IMAP_OPT_POP3', 'PS_SAV_IMAP_OPT_NORSH', 'PS_SAV_IMAP_OPT_SSL', + 'PS_SAV_IMAP_OPT_VALIDATE-CERT', 'PS_SAV_IMAP_OPT_NOVALIDATE-CERT', + 'PS_SAV_IMAP_OPT_TLS', 'PS_SAV_IMAP_OPT_NOTLS', ]); + + $conf_str = ''; + if ($conf['PS_SAV_IMAP_OPT_POP3']) { + $conf_str .= '/pop3'; + } + if ($conf['PS_SAV_IMAP_OPT_NORSH']) { + $conf_str .= '/norsh'; + } + if ($conf['PS_SAV_IMAP_OPT_SSL']) { + $conf_str .= '/ssl'; + } + if ($conf['PS_SAV_IMAP_OPT_VALIDATE-CERT']) { + $conf_str .= '/validate-cert'; + } + if ($conf['PS_SAV_IMAP_OPT_NOVALIDATE-CERT']) { + $conf_str .= '/novalidate-cert'; + } + if ($conf['PS_SAV_IMAP_OPT_TLS']) { + $conf_str .= '/tls'; + } + if ($conf['PS_SAV_IMAP_OPT_NOTLS']) { + $conf_str .= '/notls'; + } + + if (!function_exists('imap_open')) { + return ['hasError' => true, 'errors' => ['imap is not installed on this server']]; + } + + $mbox = @imap_open('{' . $url . ':' . $port . $conf_str . '}', $user, $password); + + //checks if there is no error when connecting imap server + $errors = imap_errors(); + if (is_array($errors)) { + $errors = array_unique($errors); + } + $str_errors = ''; + $str_error_delete = ''; + + if (count($errors) && is_array($errors)) { + $str_errors = ''; + foreach ($errors as $error) { + $str_errors .= $error . ', '; + } + $str_errors = rtrim(trim($str_errors), ','); + } + //checks if imap connexion is active + if (!$mbox) { + return ['hasError' => true, 'errors' => ['Cannot connect to the mailbox :
' . ($str_errors)]]; + } + + //Returns information about the current mailbox. Returns FALSE on failure. + $check = imap_check($mbox); + if (!$check) { + return ['hasError' => true, 'errors' => ['Fail to get information about the current mailbox']]; + } + + if ($check->Nmsgs == 0) { + return ['hasError' => true, 'errors' => ['NO message to sync']]; + } + + $result = imap_fetch_overview($mbox, "1:{$check->Nmsgs}", 0); + $message_errors = []; + foreach ($result as $overview) { + //check if message exist in database + if (isset($overview->subject)) { + $subject = $overview->subject; + } else { + $subject = ''; + } + //Creating an md5 to check if message has been allready processed + $md5 = md5($overview->date . $overview->from . $subject . $overview->msgno); + $exist = Db::getInstance()->getValue( + 'SELECT `md5_header` + FROM `' . _DB_PREFIX_ . 'customer_message_sync_imap` + WHERE `md5_header` = \'' . pSQL($md5) . '\'' + ); + if ($exist) { + if (Configuration::get('PS_SAV_IMAP_DELETE_MSG')) { + if (!imap_delete($mbox, $overview->msgno)) { + $str_error_delete = ', Fail to delete message'; + } + } + } else { + //check if subject has id_order + preg_match('/\#ct([0-9]*)/', $subject, $matches1); + preg_match('/\#tc([0-9-a-z-A-Z]*)/', $subject, $matches2); + $match_found = false; + if (isset($matches1[1], $matches2[1])) { + $match_found = true; + } + + $new_ct = (Configuration::get('PS_SAV_IMAP_CREATE_THREADS') && !$match_found && (strpos($subject, '[no_sync]') == false)); + + $fetch_succeed = true; + if ($match_found || $new_ct) { + if ($new_ct) { + // parse from attribute and fix it if needed + $from_parsed = []; + if (!isset($overview->from) + || (!preg_match('/<(' . Tools::cleanNonUnicodeSupport('[a-z\p{L}0-9!#$%&\'*+\/=?^`{}|~_-]+[.a-z\p{L}0-9!#$%&\'*+\/=?^`{}|~_-]*@[a-z\p{L}0-9]+[._a-z\p{L}0-9-]*\.[a-z0-9]+') . ')>/', $overview->from, $from_parsed) + && !Validate::isEmail($overview->from))) { + $message_errors[] = $this->trans('Cannot create message in a new thread.', [], 'Admin.Orderscustomers.Notification'); + + continue; + } + + // fix email format: from "Mr Sanders " to "sanders@blueforest.com" + $from = $overview->from; + if (isset($from_parsed[1])) { + $from = $from_parsed[1]; + } + + // we want to assign unrecognized mails to the right contact category + $contacts = Contact::getContacts($this->context->language->id); + if (!$contacts) { + continue; + } + + foreach ($contacts as $contact) { + if (isset($overview->to) && strpos($overview->to, $contact['email']) !== false) { + $id_contact = $contact['id_contact']; + } + } + + if (!isset($id_contact)) { // if not use the default contact category + $id_contact = $contacts[0]['id_contact']; + } + + $customer = new Customer(); + $client = $customer->getByEmail($from); //check if we already have a customer with this email + $ct = new CustomerThread(); + if (isset($client->id)) { //if mail is owned by a customer assign to him + $ct->id_customer = $client->id; + } + $ct->email = $from; + $ct->id_contact = $id_contact; + $ct->id_lang = (int) Configuration::get('PS_LANG_DEFAULT'); + $ct->id_shop = $this->context->shop->id; //new customer threads for unrecognized mails are not shown without shop id + $ct->status = 'open'; + $ct->token = Tools::passwdGen(12); + $ct->add(); + } else { + $ct = new CustomerThread((int) $matches1[1]); + } //check if order exist in database + + if (Validate::isLoadedObject($ct) && ((isset($matches2[1]) && $ct->token == $matches2[1]) || $new_ct)) { + $structure = imap_bodystruct($mbox, $overview->msgno, '1'); + if ($structure->type == 0) { + $message = imap_fetchbody($mbox, $overview->msgno, '1'); + } elseif ($structure->type == 1) { + $structure = imap_bodystruct($mbox, $overview->msgno, '1.1'); + $message = imap_fetchbody($mbox, $overview->msgno, '1.1'); + } else { + continue; + } + + switch ($structure->encoding) { + case 3: + $message = imap_base64($message); + + break; + case 4: + $message = imap_qprint($message); + + break; + } + $message = iconv($this->getEncoding($structure), 'utf-8', $message); + $message = nl2br($message); + if (!$message || strlen($message) == 0) { + $message_errors[] = $this->trans('The message body is empty, cannot import it.', [], 'Admin.Orderscustomers.Notification'); + $fetch_succeed = false; + + continue; + } + $cm = new CustomerMessage(); + $cm->id_customer_thread = $ct->id; + if (empty($message) || !Validate::isCleanHtml($message)) { + $str_errors .= $this->trans('Invalid message content for subject: %s', [$subject], 'Admin.Orderscustomers.Notification'); + } else { + try { + $cm->message = $message; + $cm->add(); + } catch (PrestaShopException $pse) { + $message_errors[] = $this->trans('The message content is not valid, cannot import it.', [], 'Admin.Orderscustomers.Notification'); + $fetch_succeed = false; + + continue; + } + } + } + } + if ($fetch_succeed) { + Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'customer_message_sync_imap` (`md5_header`) VALUES (\'' . pSQL($md5) . '\')'); + } + } + } + imap_expunge($mbox); + imap_close($mbox); + if (count($message_errors) > 0) { + if (($more_error = $str_errors . $str_error_delete) && strlen($more_error) > 0) { + $message_errors = array_merge([$more_error], $message_errors); + } + + return ['hasError' => true, 'errors' => $message_errors]; + } + if ($str_errors . $str_error_delete) { + return ['hasError' => true, 'errors' => [$str_errors . $str_error_delete]]; + } else { + return ['hasError' => false, 'errors' => '']; + } + } + + protected function getEncoding($structure) + { + foreach ($structure->parameters as $parameter) { + if ($parameter->attribute == 'CHARSET') { + return $parameter->value; + } + } + + return 'utf-8'; + } +} diff --git a/controllers/admin/AdminDashboardController.php b/controllers/admin/AdminDashboardController.php new file mode 100644 index 0000000..d29fb8e --- /dev/null +++ b/controllers/admin/AdminDashboardController.php @@ -0,0 +1,503 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ +use PrestaShop\PrestaShop\Core\Addon\Module\ModuleManagerBuilder; + +class AdminDashboardControllerCore extends AdminController +{ + public function __construct() + { + $this->bootstrap = true; + $this->display = 'view'; + + parent::__construct(); + + if (Tools::isSubmit('profitability_conf') || Tools::isSubmit('submitOptionsconfiguration')) { + $this->fields_options = $this->getOptionFields(); + } + } + + public function setMedia($isNewTheme = false) + { + parent::setMedia($isNewTheme); + + $this->addJqueryUI('ui.datepicker'); + $this->addJS([ + _PS_JS_DIR_ . 'vendor/d3.v3.min.js', + __PS_BASE_URI__ . $this->admin_webpath . '/themes/' . $this->bo_theme . '/js/vendor/nv.d3.min.js', + _PS_JS_DIR_ . '/admin/dashboard.js', + ]); + $this->addCSS(__PS_BASE_URI__ . $this->admin_webpath . '/themes/' . $this->bo_theme . '/css/vendor/nv.d3.css'); + } + + public function initPageHeaderToolbar() + { + $this->page_header_toolbar_title = $this->trans('Dashboard', [], 'Admin.Dashboard.Feature'); + $this->page_header_toolbar_btn['switch_demo'] = [ + 'desc' => $this->trans('Demo mode', [], 'Admin.Dashboard.Feature'), + 'icon' => 'process-icon-toggle-' . (Configuration::get('PS_DASHBOARD_SIMULATION') ? 'on' : 'off'), + 'help' => $this->trans('This mode displays sample data so you can try your dashboard without real numbers.', [], 'Admin.Dashboard.Help'), + ]; + + parent::initPageHeaderToolbar(); + + // Remove the last element on this controller to match the title with the rule of the others + array_pop($this->meta_title); + } + + protected function getOptionFields() + { + $forms = []; + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + $carriers = Carrier::getCarriers((int) $this->context->language->id, true, false, false, null, Carrier::ALL_CARRIERS); + $modules = Module::getModulesOnDisk(true); + + $forms = [ + 'payment' => ['title' => $this->trans('Average bank fees per payment method', [], 'Admin.Dashboard.Feature'), 'id' => 'payment'], + 'carriers' => ['title' => $this->trans('Average shipping fees per shipping method', [], 'Admin.Dashboard.Feature'), 'id' => 'carriers'], + 'other' => ['title' => $this->trans('Other settings', [], 'Admin.Dashboard.Feature'), 'id' => 'other'], + ]; + foreach ($forms as &$form) { + $form['icon'] = 'tab-preferences'; + $form['fields'] = []; + $form['submit'] = ['title' => $this->trans('Save', [], 'Admin.Actions')]; + } + + foreach ($modules as $module) { + if (isset($module->tab) && $module->tab == 'payments_gateways' && $module->id) { + $moduleClass = Module::getInstanceByName($module->name); + if (!$moduleClass->isEnabledForShopContext()) { + continue; + } + + $forms['payment']['fields']['CONF_' . strtoupper($module->name) . '_FIXED'] = [ + 'title' => $module->displayName, + 'desc' => $this->trans( + 'Choose a fixed fee for each order placed in %currency% with %module%.', + [ + '%currency' => $currency->iso_code, + '%module%' => $module->displayName, + ], + 'Admin.Dashboard.Help' + ), + 'validation' => 'isPrice', + 'cast' => 'floatval', + 'type' => 'text', + 'defaultValue' => '0', + 'suffix' => $currency->iso_code, + ]; + $forms['payment']['fields']['CONF_' . strtoupper($module->name) . '_VAR'] = [ + 'title' => $module->displayName, + 'desc' => $this->trans( + 'Choose a variable fee for each order placed in %currency% with %module%. It will be applied on the total paid with taxes.', + [ + '%currency' => $currency->iso_code, + '%module%' => $module->displayName, + ], + 'Admin.Dashboard.Help' + ), + 'validation' => 'isPercentage', + 'cast' => 'floatval', + 'type' => 'text', + 'defaultValue' => '0', + 'suffix' => '%', + ]; + + if (Currency::isMultiCurrencyActivated()) { + $forms['payment']['fields']['CONF_' . strtoupper($module->name) . '_FIXED_FOREIGN'] = [ + 'title' => $module->displayName, + 'desc' => $this->trans( + 'Choose a fixed fee for each order placed with a foreign currency with %module%.', + [ + '%module%' => $module->displayName, + ], + 'Admin.Dashboard.Help' + ), + 'validation' => 'isPrice', + 'cast' => 'floatval', + 'type' => 'text', + 'defaultValue' => '0', + 'suffix' => $currency->iso_code, + ]; + $forms['payment']['fields']['CONF_' . strtoupper($module->name) . '_VAR_FOREIGN'] = [ + 'title' => $module->displayName, + 'desc' => $this->trans( + 'Choose a variable fee for each order placed with a foreign currency with %module%. It will be applied on the total paid with taxes.', + ['%module%' => $module->displayName], + 'Admin.Dashboard.Help' + ), + 'validation' => 'isPercentage', + 'cast' => 'floatval', + 'type' => 'text', + 'defaultValue' => '0', + 'suffix' => '%', + ]; + } + } + } + + foreach ($carriers as $carrier) { + $forms['carriers']['fields']['CONF_' . strtoupper($carrier['id_reference']) . '_SHIP'] = [ + 'title' => $carrier['name'], + 'desc' => $this->trans( + 'For the carrier named %s, indicate the domestic delivery costs in percentage of the price charged to customers.', + [ + '%s' => $carrier['name'], + ], + 'Admin.Dashboard.Help' + ), + 'validation' => 'isPercentage', + 'cast' => 'floatval', + 'type' => 'text', + 'defaultValue' => '0', + 'suffix' => '%', + ]; + $forms['carriers']['fields']['CONF_' . strtoupper($carrier['id_reference']) . '_SHIP_OVERSEAS'] = [ + 'title' => $carrier['name'], + 'desc' => $this->trans( + 'For the carrier named %s, indicate the overseas delivery costs in percentage of the price charged to customers.', + [ + '%s' => $carrier['name'], + ], + 'Admin.Dashboard.Help' + ), + 'validation' => 'isPercentage', + 'cast' => 'floatval', + 'type' => 'text', + 'defaultValue' => '0', + 'suffix' => '%', + ]; + } + + $forms['carriers']['description'] = $this->trans('Method: Indicate the percentage of your carrier margin. For example, if you charge $10 of shipping fees to your customer for each shipment, but you really pay $4 to this carrier, then you should indicate "40" in the percentage field.', [], 'Admin.Dashboard.Help'); + + $forms['other']['fields']['CONF_AVERAGE_PRODUCT_MARGIN'] = [ + 'title' => $this->trans('Average gross margin percentage', [], 'Admin.Dashboard.Feature'), + 'desc' => $this->trans('You should calculate this percentage as follows: ((total sales revenue) - (cost of goods sold)) / (total sales revenue) * 100. This value is only used to calculate the Dashboard approximate gross margin, if you do not specify the wholesale price for each product.', [], 'Admin.Dashboard.Help'), + 'validation' => 'isPercentage', + 'cast' => 'intval', + 'type' => 'text', + 'defaultValue' => '0', + 'suffix' => '%', + ]; + + $forms['other']['fields']['CONF_ORDER_FIXED'] = [ + 'title' => $this->trans('Other fees per order', [], 'Admin.Dashboard.Feature'), + 'desc' => $this->trans('You should calculate this value by making the sum of all of your additional costs per order.', [], 'Admin.Dashboard.Help'), + 'validation' => 'isPrice', + 'cast' => 'floatval', + 'type' => 'text', + 'defaultValue' => '0', + 'suffix' => $currency->iso_code, + ]; + + Media::addJsDef([ + 'dashboard_ajax_url' => $this->context->link->getAdminLink('AdminDashboard'), + 'read_more' => '', + ]); + + return $forms; + } + + public function renderView() + { + if (Tools::isSubmit('profitability_conf')) { + return parent::renderOptions(); + } + + $testStatsDateUpdate = $this->context->cookie->__get('stats_date_update'); + if (!empty($testStatsDateUpdate) && $this->context->cookie->__get('stats_date_update') < strtotime(date('Y-m-d'))) { + switch ($this->context->employee->preselect_date_range) { + case 'day': + $date_from = date('Y-m-d'); + $date_to = date('Y-m-d'); + + break; + case 'prev-day': + $date_from = date('Y-m-d', strtotime('-1 day')); + $date_to = date('Y-m-d', strtotime('-1 day')); + + break; + case 'month': + default: + $date_from = date('Y-m-01'); + $date_to = date('Y-m-d'); + + break; + case 'prev-month': + $date_from = date('Y-m-01', strtotime('-1 month')); + $date_to = date('Y-m-t', strtotime('-1 month')); + + break; + case 'year': + $date_from = date('Y-01-01'); + $date_to = date('Y-m-d'); + + break; + case 'prev-year': + $date_from = date('Y-m-01', strtotime('-1 year')); + $date_to = date('Y-12-t', strtotime('-1 year')); + + break; + } + $this->context->employee->stats_date_from = $date_from; + $this->context->employee->stats_date_to = $date_to; + $this->context->employee->update(); + $this->context->cookie->__set('stats_date_update', strtotime(date('Y-m-d'))); + $this->context->cookie->write(); + } + + $calendar_helper = new HelperCalendar(); + + $calendar_helper->setDateFrom(Tools::getValue('date_from', $this->context->employee->stats_date_from)); + $calendar_helper->setDateTo(Tools::getValue('date_to', $this->context->employee->stats_date_to)); + + $stats_compare_from = $this->context->employee->stats_compare_from; + $stats_compare_to = $this->context->employee->stats_compare_to; + + if (null === $stats_compare_from || $stats_compare_from == '0000-00-00') { + $stats_compare_from = null; + } + + if (null === $stats_compare_to || $stats_compare_to == '0000-00-00') { + $stats_compare_to = null; + } + + $calendar_helper->setCompareDateFrom($stats_compare_from); + $calendar_helper->setCompareDateTo($stats_compare_to); + $calendar_helper->setCompareOption(Tools::getValue('compare_date_option', $this->context->employee->stats_compare_option)); + + $params = [ + 'date_from' => $this->context->employee->stats_date_from, + 'date_to' => $this->context->employee->stats_date_to, + ]; + + $moduleManagerBuilder = ModuleManagerBuilder::getInstance(); + $moduleManager = $moduleManagerBuilder->build(); + + $this->tpl_view_vars = [ + 'date_from' => $this->context->employee->stats_date_from, + 'date_to' => $this->context->employee->stats_date_to, + 'hookDashboardZoneOne' => Hook::exec('dashboardZoneOne', $params), + 'hookDashboardZoneTwo' => Hook::exec('dashboardZoneTwo', $params), + 'action' => '#', + 'warning' => $this->getWarningDomainName(), + 'new_version_url' => Tools::getCurrentUrlProtocolPrefix() . _PS_API_DOMAIN_ . '/version/check_version.php?v=' . _PS_VERSION_ . '&lang=' . $this->context->language->iso_code . '&autoupgrade=' . (int) ($moduleManager->isInstalled('autoupgrade') && $moduleManager->isEnabled('autoupgrade')) . '&hosted_mode=' . (int) defined('_PS_HOST_MODE_'), + 'dashboard_use_push' => Configuration::get('PS_DASHBOARD_USE_PUSH'), + 'calendar' => $calendar_helper->generate(), + 'PS_DASHBOARD_SIMULATION' => Configuration::get('PS_DASHBOARD_SIMULATION'), + 'datepickerFrom' => Tools::getValue('datepickerFrom', $this->context->employee->stats_date_from), + 'datepickerTo' => Tools::getValue('datepickerTo', $this->context->employee->stats_date_to), + 'preselect_date_range' => Tools::getValue('preselectDateRange', $this->context->employee->preselect_date_range), + 'help_center_link' => $this->getHelpCenterLink($this->context->language->iso_code), + ]; + + return parent::renderView(); + } + + public function postProcess() + { + if (Tools::isSubmit('submitDateRealTime')) { + if ($use_realtime = (int) Tools::getValue('submitDateRealTime')) { + $this->context->employee->stats_date_from = date('Y-m-d'); + $this->context->employee->stats_date_to = date('Y-m-d'); + $this->context->employee->stats_compare_option = HelperCalendar::DEFAULT_COMPARE_OPTION; + $this->context->employee->stats_compare_from = null; + $this->context->employee->stats_compare_to = null; + $this->context->employee->update(); + } + Configuration::updateValue('PS_DASHBOARD_USE_PUSH', $use_realtime); + } + + if (Tools::isSubmit('submitDateRange')) { + if (!Validate::isDate(Tools::getValue('date_from')) + || !Validate::isDate(Tools::getValue('date_to'))) { + $this->errors[] = $this->trans('The selected date range is not valid.', [], 'Admin.Notifications.Error'); + } + + if (Tools::getValue('datepicker_compare')) { + if (!Validate::isDate(Tools::getValue('compare_date_from')) + || !Validate::isDate(Tools::getValue('compare_date_to'))) { + $this->errors[] = $this->trans('The selected date range is not valid.', [], 'Admin.Notifications.Error'); + } + } + + if (!count($this->errors)) { + $this->context->employee->stats_date_from = Tools::getValue('date_from'); + $this->context->employee->stats_date_to = Tools::getValue('date_to'); + $this->context->employee->preselect_date_range = Tools::getValue('preselectDateRange'); + + if (Tools::getValue('datepicker_compare')) { + $this->context->employee->stats_compare_from = Tools::getValue('compare_date_from'); + $this->context->employee->stats_compare_to = Tools::getValue('compare_date_to'); + $this->context->employee->stats_compare_option = Tools::getValue('compare_date_option'); + } else { + $this->context->employee->stats_compare_from = null; + $this->context->employee->stats_compare_to = null; + $this->context->employee->stats_compare_option = HelperCalendar::DEFAULT_COMPARE_OPTION; + } + + $this->context->employee->update(); + } + } + + parent::postProcess(); + } + + protected function getWarningDomainName() + { + $warning = false; + if (Shop::isFeatureActive()) { + return; + } + + $shop = Context::getContext()->shop; + if ($_SERVER['HTTP_HOST'] != $shop->domain && $_SERVER['HTTP_HOST'] != $shop->domain_ssl && Tools::getValue('ajax') == false && !defined('_PS_HOST_MODE_')) { + $warning = $this->trans('You are currently connected under the following domain name:', [], 'Admin.Dashboard.Notification') . ' ' . $_SERVER['HTTP_HOST'] . '
'; + if (Configuration::get('PS_MULTISHOP_FEATURE_ACTIVE')) { + $warning .= $this->trans( + 'This is different from the shop domain name set in the Multistore settings: "%s".', + [ + '%s' => $shop->domain, + ], + 'Admin.Dashboard.Notification' + ) . $this->trans( + 'If this is your main domain, please {link}change it now{/link}.', + [ + '{link}' => '', + '{/link}' => '', + ], + 'Admin.Dashboard.Notification' + ); + } else { + $warning .= $this->trans('This is different from the domain name set in the "SEO & URLs" tab.', [], 'Admin.Dashboard.Notification') . ' + ' . $this->trans( + 'If this is your main domain, please {link}change it now{/link}.', + [ + '{link}' => '', + '{/link}' => '', + ], + 'Admin.Dashboard.Notification' + ); + } + } + + return $warning; + } + + public function ajaxProcessRefreshDashboard() + { + $id_module = null; + if ($module = Tools::getValue('module')) { + $module_obj = Module::getInstanceByName($module); + if (Validate::isLoadedObject($module_obj)) { + $id_module = $module_obj->id; + } + } + + $params = [ + 'date_from' => $this->context->employee->stats_date_from, + 'date_to' => $this->context->employee->stats_date_to, + 'compare_from' => $this->context->employee->stats_compare_from, + 'compare_to' => $this->context->employee->stats_compare_to, + 'dashboard_use_push' => (int) Tools::getValue('dashboard_use_push'), + 'extra' => (int) Tools::getValue('extra'), + ]; + + die(json_encode(Hook::exec('dashboardData', $params, $id_module, true, true, (int) Tools::getValue('dashboard_use_push')))); + } + + public function ajaxProcessSetSimulationMode() + { + Configuration::updateValue('PS_DASHBOARD_SIMULATION', (int) Tools::getValue('PS_DASHBOARD_SIMULATION')); + die('k' . Configuration::get('PS_DASHBOARD_SIMULATION') . 'k'); + } + + /** + * Returns last news from the blog + * + * @throws PrestaShopException + */ + public function displayAjaxGetBlogRss() + { + $newsFetcher = $this->get('prestashop.adapter.news.provider'); + $return = $newsFetcher->getData($this->context->language->iso_code); + + // Response + header('Content-Type: application/json'); + $this->ajaxRender(json_encode($return)); + } + + public function ajaxProcessSaveDashConfig() + { + $return = ['has_errors' => false, 'errors' => []]; + $module = Tools::getValue('module'); + $hook = Tools::getValue('hook'); + $configs = Tools::getValue('configs'); + + $params = [ + 'date_from' => $this->context->employee->stats_date_from, + 'date_to' => $this->context->employee->stats_date_to, + ]; + + if (Validate::isModuleName($module) && $module_obj = Module::getInstanceByName($module)) { + $return['errors'] = $module_obj->validateDashConfig($configs); + if (count($return['errors'])) { + $return['has_errors'] = true; + } else { + $return['has_errors'] = $module_obj->saveDashConfig($configs); + } + } + + if (Validate::isHookName($hook) && method_exists($module_obj, $hook)) { + $return['widget_html'] = $module_obj->$hook($params); + } + + die(json_encode($return)); + } + + /** + * Returns the Help center link for the provided locale + * + * @param string $languageCode 2-letter locale code + * + * @return string + */ + private function getHelpCenterLink($languageCode) + { + $links = [ + 'fr' => 'https://www.prestashop.com/fr/contact?utm_source=back-office&utm_medium=links&utm_campaign=help-center-fr&utm_content=download17', + 'en' => 'https://www.prestashop.com/en/contact?utm_source=back-office&utm_medium=links&utm_campaign=help-center-en&utm_content=download17', + 'es' => 'https://www.prestashop.com/es/contacto?utm_source=back-office&utm_medium=links&utm_campaign=help-center-es&utm_content=download17', + 'de' => 'https://www.prestashop.com/de/kontakt?utm_source=back-office&utm_medium=links&utm_campaign=help-center-de&utm_content=download17', + 'it' => 'https://www.prestashop.com/it/contatti?utm_source=back-office&utm_medium=links&utm_campaign=help-center-it&utm_content=download17', + 'nl' => 'https://www.prestashop.com/nl/contacteer-ons?utm_source=back-office&utm_medium=links&utm_campaign=help-center-nl&utm_content=download17', + 'pt' => 'https://www.prestashop.com/pt/contato?utm_source=back-office&utm_medium=links&utm_campaign=help-center-pt&utm_content=download17', + 'pl' => 'https://www.prestashop.com/pl/kontakt?utm_source=back-office&utm_medium=links&utm_campaign=help-center-pl&utm_content=download17', + ]; + + return isset($links[$languageCode]) ? $links[$languageCode] : $links['en']; + } +} diff --git a/controllers/admin/AdminFeaturesController.php b/controllers/admin/AdminFeaturesController.php new file mode 100644 index 0000000..f0e6885 --- /dev/null +++ b/controllers/admin/AdminFeaturesController.php @@ -0,0 +1,656 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property Feature $object + */ +class AdminFeaturesControllerCore extends AdminController +{ + public $bootstrap = true; + protected $position_identifier = 'id_feature'; + protected $feature_name; + + public function __construct() + { + $this->table = 'feature'; + $this->className = 'Feature'; + $this->list_id = 'feature'; + $this->identifier = 'id_feature'; + $this->lang = true; + + parent::__construct(); + + $this->fields_list = [ + 'id_feature' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'name' => [ + 'title' => $this->trans('Name', [], 'Admin.Global'), + 'width' => 'auto', + 'filter_key' => 'b!name', + ], + 'value' => [ + 'title' => $this->trans('Values', [], 'Admin.Global'), + 'orderby' => false, + 'search' => false, + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'position' => [ + 'title' => $this->trans('Position', [], 'Admin.Global'), + 'filter_key' => 'a!position', + 'align' => 'center', + 'class' => 'fixed-width-xs', + 'position' => 'position', + ], + ]; + + $this->bulk_actions = [ + 'delete' => [ + 'text' => $this->trans('Delete selected', [], 'Admin.Actions'), + 'icon' => 'icon-trash', + 'confirm' => $this->trans('Delete selected items?', [], 'Admin.Notifications.Warning'), + ], + ]; + } + + /** + * AdminController::renderList() override. + * + * @see AdminController::renderList() + */ + public function renderList() + { + $this->addRowAction('view'); + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + return parent::renderList(); + } + + /** + * Change object type to feature value (use when processing a feature value). + */ + protected function setTypeValue() + { + $this->table = 'feature_value'; + $this->className = 'FeatureValue'; + $this->identifier = 'id_feature_value'; + } + + /** + * Change object type to feature (use when processing a feature). + */ + protected function setTypeFeature() + { + $this->table = 'feature'; + $this->className = 'Feature'; + $this->identifier = 'id_feature'; + } + + public function renderView() + { + if (($id = (int) Tools::getValue('id_feature'))) { + $this->setTypeValue(); + $this->list_id = 'feature_value'; + $this->lang = true; + + // Action for list + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + if (!Validate::isLoadedObject($obj = new Feature((int) $id))) { + $this->errors[] = $this->trans('An error occurred while updating the status for an object.', [], 'Admin.Notifications.Error') . ' ' . $this->table . ' ' . $this->trans('(cannot load object)', [], 'Admin.Notifications.Error'); + + return; + } + + $this->feature_name = $obj->name; + $this->toolbar_title = $this->feature_name[$this->context->employee->id_lang]; + $this->fields_list = [ + 'id_feature_value' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'value' => [ + 'title' => $this->trans('Value', [], 'Admin.Global'), + ], + ]; + + $this->_where = sprintf('AND `id_feature` = %d', (int) $id); + self::$currentIndex = self::$currentIndex . '&id_feature=' . (int) $id . '&viewfeature'; + $this->processFilter(); + + return parent::renderList(); + } + } + + /** + * AdminController::renderForm() override. + * + * @see AdminController::renderForm() + */ + public function renderForm() + { + $this->toolbar_title = $this->trans('Add a new feature', [], 'Admin.Catalog.Feature'); + $this->fields_form = [ + 'legend' => [ + 'title' => $this->trans('Feature', [], 'Admin.Catalog.Feature'), + 'icon' => 'icon-info-sign', + ], + 'input' => [ + [ + 'type' => 'text', + 'label' => $this->trans('Name', [], 'Admin.Global'), + 'name' => 'name', + 'lang' => true, + 'size' => 33, + 'hint' => $this->trans('Invalid characters:', [], 'Admin.Notifications.Info') . ' <>;=#{}', + 'required' => true, + ], + ], + ]; + + if (Shop::isFeatureActive()) { + $this->fields_form['input'][] = [ + 'type' => 'shop', + 'label' => $this->trans('Shop association', [], 'Admin.Global'), + 'name' => 'checkBoxShopAsso', + ]; + } + + $this->fields_form['submit'] = [ + 'title' => $this->trans('Save', [], 'Admin.Actions'), + ]; + + return parent::renderForm(); + } + + public function initPageHeaderToolbar() + { + if (Feature::isFeatureActive()) { + if (empty($this->display)) { + $this->page_header_toolbar_btn['new_feature'] = [ + 'href' => self::$currentIndex . '&addfeature&token=' . $this->token, + 'desc' => $this->trans('Add new feature', [], 'Admin.Catalog.Feature'), + 'icon' => 'process-icon-new', + ]; + + $this->page_header_toolbar_btn['new_feature_value'] = [ + 'href' => self::$currentIndex . '&addfeature_value&id_feature=' . (int) Tools::getValue('id_feature') . '&token=' . $this->token, + 'desc' => $this->trans('Add new feature value', [], 'Admin.Catalog.Help'), + 'icon' => 'process-icon-new', + ]; + } + } + + if ($this->display == 'view') { + $this->page_header_toolbar_btn['new_feature_value'] = [ + 'href' => self::$currentIndex . '&addfeature_value&id_feature=' . (int) Tools::getValue('id_feature') . '&token=' . $this->token, + 'desc' => $this->trans('Add new feature value', [], 'Admin.Catalog.Help'), + 'icon' => 'process-icon-new', + ]; + } + + parent::initPageHeaderToolbar(); + } + + /** + * AdminController::initToolbar() override. + * + * @see AdminController::initToolbar() + */ + public function initToolbar() + { + switch ($this->display) { + case 'editFeatureValue': + case 'add': + case 'edit': + $this->toolbar_btn['save'] = [ + 'href' => '#', + 'desc' => $this->trans('Save', [], 'Admin.Actions'), + ]; + + if ($this->display == 'editFeatureValue') { + $this->toolbar_btn['save-and-stay'] = [ + 'short' => 'SaveAndStay', + 'href' => '#', + 'desc' => $this->trans('Save and add another value', [], 'Admin.Catalog.Help'), + 'force_desc' => true, + ]; + } + + // Default cancel button - like old back link + $back = Tools::safeOutput(Tools::getValue('back', '')); + if (empty($back)) { + $back = self::$currentIndex . '&token=' . $this->token; + } + + $this->toolbar_btn['back'] = [ + 'href' => $back, + 'desc' => $this->trans('Back to the list', [], 'Admin.Catalog.Help'), + ]; + + break; + case 'view': + $this->toolbar_btn['newAttributes'] = [ + 'href' => self::$currentIndex . '&addfeature_value&id_feature=' . (int) Tools::getValue('id_feature') . '&token=' . $this->token, + 'desc' => $this->trans('Add new feature values', [], 'Admin.Catalog.Help'), + ]; + $this->toolbar_btn['back'] = [ + 'href' => self::$currentIndex . '&token=' . $this->token, + 'desc' => $this->trans('Back to the list', [], 'Admin.Catalog.Help'), + ]; + + break; + default: + parent::initToolbar(); + } + } + + public function initToolbarTitle() + { + $bread_extended = $this->breadcrumbs; + + switch ($this->display) { + case 'edit': + $bread_extended[] = $this->trans('Edit New Feature', [], 'Admin.Catalog.Feature'); + $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); + + break; + + case 'add': + $bread_extended[] = $this->trans('Add New Feature', [], 'Admin.Catalog.Feature'); + $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); + + break; + + case 'view': + $bread_extended[] = $this->feature_name[$this->context->employee->id_lang] ?? null; + $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); + + break; + + case 'editFeatureValue': + if (Tools::getValue('id_feature_value')) { + if (($id = (int) Tools::getValue('id_feature'))) { + if (Validate::isLoadedObject($obj = new Feature((int) $id))) { + $bread_extended[] = '' . $obj->name[$this->context->employee->id_lang] . ''; + } + + if (Validate::isLoadedObject($obj = new FeatureValue((int) Tools::getValue('id_feature_value')))) { + $bread_extended[] = $this->trans('Edit: %value%', ['%value%' => $obj->value[$this->context->employee->id_lang]], 'Admin.Catalog.Feature'); + } + } else { + $bread_extended[] = $this->trans('Edit Value', [], 'Admin.Catalog.Feature'); + } + } else { + $bread_extended[] = $this->trans('Add New Value', [], 'Admin.Catalog.Feature'); + } + + if (count($bread_extended) > 0) { + $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); + } + + break; + } + + $this->toolbar_title = $bread_extended; + } + + /** + * AdminController::renderForm() override. + * + * @see AdminController::renderForm() + */ + public function initFormFeatureValue() + { + $this->setTypeValue(); + + $this->fields_form[0]['form'] = [ + 'legend' => [ + 'title' => $this->trans('Feature value', [], 'Admin.Catalog.Feature'), + 'icon' => 'icon-info-sign', + ], + 'input' => [ + [ + 'type' => 'select', + 'label' => $this->trans('Feature', [], 'Admin.Catalog.Feature'), + 'name' => 'id_feature', + 'options' => [ + 'query' => Feature::getFeatures($this->context->language->id), + 'id' => 'id_feature', + 'name' => 'name', + ], + 'required' => true, + ], + [ + 'type' => 'text', + 'label' => $this->trans('Value', [], 'Admin.Global'), + 'name' => 'value', + 'lang' => true, + 'size' => 33, + 'hint' => $this->trans('Invalid characters:', [], 'Admin.Notifications.Info') . ' <>;=#{}', + 'required' => true, + ], + ], + 'submit' => [ + 'title' => $this->trans('Save', [], 'Admin.Actions'), + ], + 'buttons' => [ + 'save-and-stay' => [ + 'title' => $this->trans('Save then add another value', [], 'Admin.Catalog.Feature'), + 'name' => 'submitAdd' . $this->table . 'AndStay', + 'type' => 'submit', + 'class' => 'btn btn-default pull-right', + 'icon' => 'process-icon-save', + ], + ], + ]; + + $this->fields_value['id_feature'] = (int) Tools::getValue('id_feature'); + + // Create Object FeatureValue + $feature_value = new FeatureValue(Tools::getValue('id_feature_value')); + + $this->tpl_vars = [ + 'feature_value' => $feature_value, + ]; + + $this->getlanguages(); + $helper = new HelperForm(); + $helper->show_cancel_button = true; + + $back = Tools::safeOutput(Tools::getValue('back', '')); + if (empty($back)) { + $back = self::$currentIndex . '&token=' . $this->token; + } + if (!Validate::isCleanHtml($back)) { + die(Tools::displayError()); + } + + $helper->back_url = $back; + $helper->currentIndex = self::$currentIndex; + $helper->token = $this->token; + $helper->table = $this->table; + $helper->identifier = $this->identifier; + $helper->override_folder = 'feature_value/'; + $helper->id = $feature_value->id; + $helper->toolbar_scroll = false; + $helper->tpl_vars = $this->tpl_vars; + $helper->languages = $this->_languages; + $helper->default_form_language = $this->default_form_language; + $helper->allow_employee_form_lang = $this->allow_employee_form_lang; + $helper->fields_value = $this->getFieldsValue($feature_value); + $helper->toolbar_btn = $this->toolbar_btn; + $helper->title = $this->trans('Add a new feature value', [], 'Admin.Catalog.Feature'); + $this->content .= $helper->generateForm($this->fields_form); + } + + /** + * AdminController::initContent() override. + * + * @see AdminController::initContent() + */ + public function initContent() + { + if (Feature::isFeatureActive()) { + if ($this->display == 'edit' || $this->display == 'add') { + if (!$this->loadObject(true)) { + return; + } + $this->content .= $this->renderForm(); + } elseif ($this->display == 'view') { + // Some controllers use the view action without an object + if ($this->className) { + $this->loadObject(true); + } + $this->content .= $this->renderView(); + } elseif ($this->display == 'editFeatureValue') { + if (!$this->object = new FeatureValue((int) Tools::getValue('id_feature_value'))) { + return; + } + $this->content .= $this->initFormFeatureValue(); + } elseif ($this->display != 'view' && !$this->ajax) { + // If a feature value was saved, we need to reset the values to display the list + $this->setTypeFeature(); + $this->content .= $this->renderList(); + /* reset all attributes filter */ + if (!Tools::getValue('submitFilterfeature_value', 0) && !Tools::getIsset('id_feature_value')) { + $this->processResetFilters('feature_value'); + } + } + } else { + $adminPerformanceUrl = $this->context->link->getAdminLink('AdminPerformance'); + $url = '' . $this->trans('Performance', [], 'Admin.Global') . ''; + $this->displayWarning($this->trans('This feature has been disabled. You can activate it here: %url%.', ['%url%' => $url], 'Admin.Catalog.Notification')); + } + + $this->context->smarty->assign([ + 'content' => $this->content, + ]); + } + + public function initProcess() + { + // Are we working on feature values? + if ((Tools::getValue('id_feature_value') && !Tools::getValue('id_feature')) + || Tools::isSubmit('deletefeature_value') + || Tools::isSubmit('submitAddfeature_value') + || Tools::isSubmit('addfeature_value') + || Tools::isSubmit('updatefeature_value') + || Tools::isSubmit('submitBulkdeletefeature_value')) { + $this->setTypeValue(); + } + + if (Tools::getIsset('viewfeature')) { + $this->list_id = 'feature_value'; + + if (isset($_POST['submitReset' . $this->list_id])) { + $this->processResetFilters(); + } + } else { + $this->list_id = 'feature'; + $this->_defaultOrderBy = 'position'; + $this->_defaultOrderWay = 'ASC'; + } + + parent::initProcess(); + } + + public function postProcess() + { + if (!Feature::isFeatureActive()) { + return; + } + + /* set location with current index */ + if (Tools::getIsset('id_feature') && Tools::getIsset('viewfeature')) { + self::$currentIndex = self::$currentIndex . '&id_feature=' . Tools::getValue('id_feature', 0) . '&viewfeature'; + } + + if ($this->table == 'feature_value' && ($this->action == 'save' || $this->action == 'delete' || $this->action == 'bulkDelete')) { + Hook::exec( + 'displayFeatureValuePostProcess', + ['errors' => &$this->errors] + ); + } // send errors as reference to allow displayFeatureValuePostProcess to stop saving process + else { + Hook::exec( + 'displayFeaturePostProcess', + ['errors' => &$this->errors] + ); + } // send errors as reference to allow displayFeaturePostProcess to stop saving process + + parent::postProcess(); + + if ($this->table == 'feature_value' && ($this->display == 'edit' || $this->display == 'add')) { + $this->display = 'editFeatureValue'; + } + } + + /** + * Override processAdd to change SaveAndStay button action. + * + * @see classes/AdminControllerCore::processAdd() + */ + public function processAdd() + { + $object = parent::processAdd(); + + if (Tools::isSubmit('submitAdd' . $this->table . 'AndStay') && !count($this->errors)) { + if ($this->table == 'feature_value' && ($this->display == 'edit' || $this->display == 'add')) { + $this->redirect_after = self::$currentIndex . '&addfeature_value&id_feature=' . (int) Tools::getValue('id_feature') . '&token=' . $this->token; + } else { + $this->redirect_after = self::$currentIndex . '&' . $this->identifier . '=&conf=3&update' . $this->table . '&token=' . $this->token; + } + } elseif (Tools::isSubmit('submitAdd' . $this->table . 'AndStay') && count($this->errors)) { + $this->display = 'editFeatureValue'; + } + + return $object; + } + + /** + * Override processUpdate to change SaveAndStay button action. + * + * @see classes/AdminControllerCore::processUpdate() + */ + public function processUpdate() + { + $object = parent::processUpdate(); + + if (Tools::isSubmit('submitAdd' . $this->table . 'AndStay') && !count($this->errors)) { + $this->redirect_after = self::$currentIndex . '&' . $this->identifier . '=&conf=3&update' . $this->table . '&token=' . $this->token; + } + + return $object; + } + + /** + * Call the right method for creating or updating object. + * + * @return mixed + */ + public function processSave() + { + if ($this->table == 'feature') { + $id_feature = (int) Tools::getValue('id_feature'); + // Adding last position to the feature if not exist + if ($id_feature <= 0) { + $sql = 'SELECT `position`+1 + FROM `' . _DB_PREFIX_ . 'feature` + ORDER BY position DESC'; + // set the position of the new feature in $_POST for postProcess() method + $_POST['position'] = Db::getInstance()->getValue($sql); + } + // clean \n\r characters + foreach ($_POST as $key => $value) { + if (preg_match('/^name_/Ui', $key)) { + $_POST[$key] = str_replace('\n', '', str_replace('\r', '', $value)); + } + } + } + + return parent::processSave(); + } + + /** + * AdminController::getList() override. + * + * @see AdminController::getList() + * + * @param int $id_lang + * @param string|null $order_by + * @param string|null $order_way + * @param int $start + * @param int|null $limit + * @param int|bool $id_lang_shop + * + * @throws PrestaShopException + */ + public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false) + { + if ($this->table == 'feature_value') { + $this->_where .= ' AND (a.custom = 0 OR a.custom IS NULL)'; + } + + parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop); + + if ($this->table == 'feature') { + $nb_items = count($this->_list); + for ($i = 0; $i < $nb_items; ++$i) { + $item = &$this->_list[$i]; + + $query = new DbQuery(); + $query->select('COUNT(fv.id_feature_value) as count_values'); + $query->from('feature_value', 'fv'); + $query->where('fv.id_feature =' . (int) $item['id_feature']); + $query->where('(fv.custom=0 OR fv.custom IS NULL)'); + $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query); + $item['value'] = (int) $res; + unset($query); + } + } + } + + public function ajaxProcessUpdatePositions() + { + if ($this->access('edit')) { + $way = (int) Tools::getValue('way'); + $id_feature = (int) Tools::getValue('id'); + $positions = Tools::getValue('feature'); + + $new_positions = []; + foreach ($positions as $v) { + if (!empty($v)) { + $new_positions[] = $v; + } + } + + foreach ($new_positions as $position => $value) { + $pos = explode('_', $value); + + if (isset($pos[2]) && (int) $pos[2] === $id_feature) { + if ($feature = new Feature((int) $pos[2])) { + if (isset($position) && $feature->updatePosition($way, $position, $id_feature)) { + echo 'ok position ' . (int) $position . ' for feature ' . (int) $pos[1] . '\r\n'; + } else { + echo '{"hasError" : true, "errors" : "Can not update feature ' . (int) $id_feature . ' to position ' . (int) $position . ' "}'; + } + } else { + echo '{"hasError" : true, "errors" : "This feature (' . (int) $id_feature . ') can t be loaded"}'; + } + + break; + } + } + } + } +} diff --git a/controllers/admin/AdminGendersController.php b/controllers/admin/AdminGendersController.php new file mode 100644 index 0000000..a8ba1f1 --- /dev/null +++ b/controllers/admin/AdminGendersController.php @@ -0,0 +1,232 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property Gender $object + */ +class AdminGendersControllerCore extends AdminController +{ + public function __construct() + { + $this->bootstrap = true; + $this->table = 'gender'; + $this->className = 'Gender'; + $this->lang = true; + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + parent::__construct(); + + if (!Tools::getValue('realedit')) { + $this->deleted = false; + } + + $this->bulk_actions = [ + 'delete' => [ + 'text' => $this->trans('Delete selected', [], 'Admin.Actions'), + 'confirm' => $this->trans('Delete selected items?', [], 'Admin.Notifications.Warning'), + 'icon' => 'icon-trash', + ], + ]; + + $this->default_image_height = 16; + $this->default_image_width = 16; + + $this->fieldImageSettings = [ + 'name' => 'image', + 'dir' => 'genders', + ]; + + $this->fields_list = [ + 'id_gender' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'name' => [ + 'title' => $this->trans('Social title', [], 'Admin.Shopparameters.Feature'), + 'filter_key' => 'b!name', + ], + 'type' => [ + 'title' => $this->trans('Gender', [], 'Admin.Global'), + 'orderby' => false, + 'type' => 'select', + 'list' => [ + 0 => $this->trans('Male', [], 'Admin.Shopparameters.Feature'), + 1 => $this->trans('Female', [], 'Admin.Shopparameters.Feature'), + 2 => $this->trans('Neutral', [], 'Admin.Shopparameters.Feature'), + ], + 'filter_key' => 'a!type', + 'callback' => 'displayGenderType', + 'callback_object' => $this, + ], + 'image' => [ + 'title' => $this->trans('Image', [], 'Admin.Global'), + 'align' => 'center', + 'image' => 'genders', + 'orderby' => false, + 'search' => false, + ], + ]; + } + + public function initPageHeaderToolbar() + { + if (empty($this->display)) { + $this->page_header_toolbar_btn['new_gender'] = [ + 'href' => self::$currentIndex . '&addgender&token=' . $this->token, + 'desc' => $this->trans('Add new social title', [], 'Admin.Shopparameters.Feature'), + 'icon' => 'process-icon-new', + ]; + } + + parent::initPageHeaderToolbar(); + } + + public function renderForm() + { + $this->fields_form = [ + 'legend' => [ + 'title' => $this->trans('Social titles', [], 'Admin.Shopparameters.Feature'), + 'icon' => 'icon-male', + ], + 'input' => [ + [ + 'type' => 'text', + 'label' => $this->trans('Social title', [], 'Admin.Global'), + 'name' => 'name', + 'lang' => true, + 'col' => 4, + 'hint' => $this->trans('Invalid characters:', [], 'Admin.Shopparameters.Help') . ' 0-9!<>,;?=+()@#"�{}_$%:', + 'required' => true, + ], + [ + 'type' => 'radio', + 'label' => $this->trans('Gender', [], 'Admin.Global'), + 'name' => 'type', + 'required' => false, + 'class' => 't', + 'values' => [ + [ + 'id' => 'type_male', + 'value' => 0, + 'label' => $this->trans('Male', [], 'Admin.Shopparameters.Feature'), + ], + [ + 'id' => 'type_female', + 'value' => 1, + 'label' => $this->trans('Female', [], 'Admin.Shopparameters.Feature'), + ], + [ + 'id' => 'type_neutral', + 'value' => 2, + 'label' => $this->trans('Neutral', [], 'Admin.Shopparameters.Feature'), + ], + ], + ], + [ + 'type' => 'file', + 'label' => $this->trans('Image', [], 'Admin.Global'), + 'name' => 'image', + 'col' => 6, + 'value' => true, + ], + [ + 'type' => 'text', + 'label' => $this->trans('Image width', [], 'Admin.Shopparameters.Feature'), + 'name' => 'img_width', + 'col' => 2, + 'hint' => $this->trans('Image width in pixels. Enter "0" to use the original size.', [], 'Admin.Shopparameters.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Image height', [], 'Admin.Shopparameters.Feature'), + 'name' => 'img_height', + 'col' => 2, + 'hint' => $this->trans('Image height in pixels. Enter "0" to use the original size.', [], 'Admin.Shopparameters.Help'), + ], + ], + 'submit' => [ + 'title' => $this->trans('Save', [], 'Admin.Actions'), + ], + ]; + + /** @var Gender $obj */ + if (!($obj = $this->loadObject(true))) { + return; + } + + $this->fields_value = [ + 'img_width' => $this->default_image_width, + 'img_height' => $this->default_image_height, + 'image' => $obj->getImage(), + ]; + + return parent::renderForm(); + } + + public function displayGenderType($value, $tr) + { + return $this->fields_list['type']['list'][$value]; + } + + protected function postImage($id) + { + if (isset($this->fieldImageSettings['name'], $this->fieldImageSettings['dir'])) { + if (!Validate::isInt(Tools::getValue('img_width')) || !Validate::isInt(Tools::getValue('img_height'))) { + $this->errors[] = $this->trans('Width and height must be numeric values.', [], 'Admin.Shopparameters.Notification'); + } else { + if ((int) Tools::getValue('img_width') > 0 && (int) Tools::getValue('img_height') > 0) { + $width = (int) Tools::getValue('img_width'); + $height = (int) Tools::getValue('img_height'); + } else { + $width = null; + $height = null; + } + + return $this->uploadImage($id, $this->fieldImageSettings['name'], $this->fieldImageSettings['dir'] . '/', false, $width, $height); + } + } + + return !count($this->errors) ? true : false; + } + + protected function afterImageUpload() + { + parent::afterImageUpload(); + + if (($id_gender = (int) Tools::getValue('id_gender')) && + isset($_FILES) && count($_FILES) && file_exists(_PS_GENDERS_DIR_ . $id_gender . '.jpg')) { + $current_file = _PS_TMP_IMG_DIR_ . 'gender_mini_' . $id_gender . '_' . $this->context->shop->id . '.jpg'; + + if (file_exists($current_file)) { + unlink($current_file); + } + } + + return true; + } +} diff --git a/controllers/admin/AdminGroupsController.php b/controllers/admin/AdminGroupsController.php new file mode 100644 index 0000000..e18a881 --- /dev/null +++ b/controllers/admin/AdminGroupsController.php @@ -0,0 +1,656 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property Group $object + */ +class AdminGroupsControllerCore extends AdminController +{ + public function __construct() + { + $this->bootstrap = true; + $this->table = 'group'; + $this->className = 'Group'; + $this->list_id = 'group'; + $this->lang = true; + + parent::__construct(); + + $this->addRowAction('edit'); + $this->addRowAction('view'); + $this->addRowAction('delete'); + $this->bulk_actions = [ + 'delete' => [ + 'text' => $this->trans('Delete selected', [], 'Admin.Actions'), + 'confirm' => $this->trans('Delete selected items?', [], 'Admin.Notifications.Warning'), + 'icon' => 'icon-trash', + ], + ]; + + $groups_to_keep = [ + Configuration::get('PS_UNIDENTIFIED_GROUP'), + Configuration::get('PS_GUEST_GROUP'), + Configuration::get('PS_CUSTOMER_GROUP'), + ]; + + $this->fields_list = [ + 'id_group' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-xs', + ], + 'name' => [ + 'title' => $this->trans('Group name', [], 'Admin.Shopparameters.Feature'), + 'filter_key' => 'b!name', + ], + 'reduction' => [ + 'title' => $this->trans('Discount (%)', [], 'Admin.Shopparameters.Feature'), + 'align' => 'right', + 'type' => 'percent', + ], + 'nb' => [ + 'title' => $this->trans('Members', [], 'Admin.Shopparameters.Feature'), + 'align' => 'center', + 'havingFilter' => true, + ], + 'show_prices' => [ + 'title' => $this->trans('Show prices', [], 'Admin.Shopparameters.Feature'), + 'align' => 'center', + 'type' => 'bool', + 'orderby' => false, + ], + 'date_add' => [ + 'title' => $this->trans('Creation date', [], 'Admin.Shopparameters.Feature'), + 'type' => 'date', + 'align' => 'right', + ], + ]; + + $this->addRowActionSkipList('delete', $groups_to_keep); + + $this->_select .= '(SELECT COUNT(jcg.`id_customer`) + FROM `' . _DB_PREFIX_ . 'customer_group` jcg + LEFT JOIN `' . _DB_PREFIX_ . 'customer` jc ON (jc.`id_customer` = jcg.`id_customer`) + WHERE jc.`deleted` != 1 + ' . Shop::addSqlRestriction(Shop::SHARE_CUSTOMER) . ' + AND jcg.`id_group` = a.`id_group`) AS nb'; + $this->_use_found_rows = false; + + $groups = Group::getGroups(Context::getContext()->language->id, true); + + if (Group::isFeatureActive()) { + $this->fields_options = [ + 'general' => [ + 'title' => $this->trans('Default groups options', [], 'Admin.Shopparameters.Feature'), + 'fields' => [ + 'PS_UNIDENTIFIED_GROUP' => [ + 'title' => $this->trans('Visitors group', [], 'Admin.Shopparameters.Feature'), + 'desc' => $this->trans('The group defined for your un-identified visitors.', [], 'Admin.Shopparameters.Help'), + 'cast' => 'intval', + 'type' => 'select', + 'list' => $groups, + 'identifier' => 'id_group', + ], + 'PS_GUEST_GROUP' => [ + 'title' => $this->trans('Guests group', [], 'Admin.Shopparameters.Feature'), + 'desc' => $this->trans('The group defined for your identified guest customers (used in guest checkout).', [], 'Admin.Shopparameters.Help'), + 'cast' => 'intval', + 'type' => 'select', + 'list' => $groups, + 'identifier' => 'id_group', + ], + 'PS_CUSTOMER_GROUP' => [ + 'title' => $this->trans('Customers group', [], 'Admin.Shopparameters.Feature'), + 'desc' => $this->trans('The group defined for your identified registered customers.', [], 'Admin.Shopparameters.Help'), + 'cast' => 'intval', + 'type' => 'select', + 'list' => $groups, + 'identifier' => 'id_group', + ], + ], + 'submit' => [ + 'title' => $this->trans('Save', [], 'Admin.Actions'), + ], + ], + ]; + } + } + + public function setMedia($isNewTheme = false) + { + parent::setMedia($isNewTheme); + $this->addJqueryPlugin('fancybox'); + $this->addJqueryUi('ui.sortable'); + } + + public function initToolbar() + { + if ($this->display == 'add' || $this->display == 'edit') { + $this->toolbar_btn['save-and-stay'] = [ + 'short' => 'SaveAndStay', + 'href' => '#', + 'desc' => $this->trans('Save, then add a category reduction.', [], 'Admin.Shopparameters.Feature'), + 'force_desc' => true, + ]; + } + parent::initToolbar(); + } + + public function initPageHeaderToolbar() + { + if (empty($this->display)) { + $this->page_header_toolbar_btn['new_group'] = [ + 'href' => self::$currentIndex . '&addgroup&token=' . $this->token, + 'desc' => $this->trans('Add new group', [], 'Admin.Shopparameters.Feature'), + 'icon' => 'process-icon-new', + ]; + } + + parent::initPageHeaderToolbar(); + } + + public function initProcess() + { + $this->id_object = Tools::getValue('id_' . $this->table); + + if (Tools::isSubmit('changeShowPricesVal') && $this->id_object) { + $this->action = 'change_show_prices_val'; + } + + if (Tools::getIsset('viewgroup')) { + $this->list_id = 'customer_group'; + + if (isset($_POST['submitReset' . $this->list_id])) { + $this->processResetFilters(); + } + + if (Tools::isSubmit('submitFilter')) { + self::$currentIndex .= '&id_group=' . (int) Tools::getValue('id_group') . '&viewgroup'; + } + } else { + $this->list_id = 'group'; + } + + parent::initProcess(); + } + + public function renderView() + { + $this->context = Context::getContext(); + if (!($group = $this->loadObject(true))) { + return; + } + + $this->tpl_view_vars = [ + 'group' => $group, + 'language' => $this->context->language, + 'customerList' => $this->renderCustomersList($group), + 'categorieReductions' => $this->formatCategoryDiscountList($group->id), + ]; + + return parent::renderView(); + } + + protected function renderCustomersList($group) + { + $genders = [0 => '?']; + $genders_icon = ['default' => 'unknown.gif']; + foreach (Gender::getGenders() as $gender) { + /* @var Gender $gender */ + $genders_icon[$gender->id] = '../genders/' . (int) $gender->id . '.jpg'; + $genders[$gender->id] = $gender->name; + } + $this->table = 'customer_group'; + $this->lang = false; + $this->list_id = 'customer_group'; + $this->actions = []; + $this->addRowAction('edit'); + $this->identifier = 'id_customer'; + $this->bulk_actions = false; + $this->list_no_link = true; + $this->explicitSelect = true; + + $this->fields_list = ([ + 'id_customer' => [ + 'title' => $this->trans('ID', [], 'Admin.Global'), + 'align' => 'center', + 'filter_key' => 'c!id_customer', + 'class' => 'fixed-width-xs', + ], + 'id_gender' => [ + 'title' => $this->trans('Social title', [], 'Admin.Global'), + 'icon' => $genders_icon, + 'list' => $genders, + ], + 'firstname' => [ + 'title' => $this->trans('First name', [], 'Admin.Global'), + 'maxlength' => 30, + ], + 'lastname' => [ + 'title' => $this->trans('Last name', [], 'Admin.Global'), + 'maxlength' => 30, + ], + 'email' => [ + 'title' => $this->trans('Email address', [], 'Admin.Global'), + 'filter_key' => 'c!email', + 'orderby' => true, + 'maxlength' => 50, + ], + 'birthday' => [ + 'title' => $this->trans('Date of birth', [], 'Admin.Global'), + 'type' => 'date', + 'class' => 'fixed-width-md', + 'align' => 'center', + ], + 'date_add' => [ + 'title' => $this->trans('Registration date', [], 'Admin.Shopparameters.Feature'), + 'type' => 'date', + 'class' => 'fixed-width-md', + 'align' => 'center', + ], + 'active' => [ + 'title' => $this->trans('Enabled', [], 'Admin.Global'), + 'align' => 'center', + 'class' => 'fixed-width-sm', + 'type' => 'bool', + 'search' => false, + 'orderby' => false, + 'filter_key' => 'c!active', + 'callback' => 'printOptinIcon', + ], + ]); + $this->_select = 'c.*, a.id_group'; + $this->_join = 'LEFT JOIN `' . _DB_PREFIX_ . 'customer` c ON (a.`id_customer` = c.`id_customer`)'; + $this->_where = 'AND a.`id_group` = ' . (int) $group->id . ' AND c.`deleted` != 1'; + $this->_where .= Shop::addSqlRestriction(Shop::SHARE_CUSTOMER, 'c'); + self::$currentIndex = self::$currentIndex . '&id_group=' . (int) $group->id . '&viewgroup'; + + $this->processFilter(); + + return parent::renderList(); + } + + public function printOptinIcon($value, $customer) + { + return $value ? '' : ''; + } + + public function renderForm() + { + if (!($group = $this->loadObject(true))) { + return; + } + + $this->fields_form = [ + 'legend' => [ + 'title' => $this->trans('Customer group', [], 'Admin.Shopparameters.Feature'), + 'icon' => 'icon-group', + ], + 'submit' => [ + 'title' => $this->trans('Save', [], 'Admin.Actions'), + ], + 'input' => [ + [ + 'type' => 'text', + 'label' => $this->trans('Name', [], 'Admin.Global'), + 'name' => 'name', + 'required' => true, + 'lang' => true, + 'col' => 4, + 'hint' => $this->trans('Forbidden characters:', [], 'Admin.Notifications.Info') . ' 0-9!&lt;&gt;,;?=+()@#"�{}_$%:', + ], + [ + 'type' => 'text', + 'label' => $this->trans('Discount', [], 'Admin.Global'), + 'name' => 'reduction', + 'suffix' => '%', + 'col' => 3, + 'hint' => $this->trans('Automatically apply this value as a discount on all products for members of this customer group.', [], 'Admin.Shopparameters.Help'), + ], + [ + 'type' => 'select', + 'label' => $this->trans('Price display method', [], 'Admin.Shopparameters.Feature'), + 'name' => 'price_display_method', + 'col' => 2, + 'hint' => $this->trans('How prices are displayed in the order summary for this customer group.', [], 'Admin.Shopparameters.Help'), + 'options' => [ + 'query' => [ + [ + 'id_method' => PS_TAX_EXC, + 'name' => $this->trans('Tax excluded', [], 'Admin.Global'), + ], + [ + 'id_method' => PS_TAX_INC, + 'name' => $this->trans('Tax included', [], 'Admin.Global'), + ], + ], + 'id' => 'id_method', + 'name' => 'name', + ], + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Show prices', [], 'Admin.Shopparameters.Feature'), + 'name' => 'show_prices', + 'required' => false, + 'class' => 't', + 'is_bool' => true, + 'values' => [ + [ + 'id' => 'show_prices_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'show_prices_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + 'hint' => $this->trans('Customers in this group can view prices.', [], 'Admin.Shopparameters.Help'), + 'desc' => $this->trans('Need to hide prices for all groups? Save time, enable catalog mode in Product Settings instead.', [], 'Admin.Shopparameters.Help'), + ], + [ + 'type' => 'group_discount_category', + 'label' => $this->trans('Category discount', [], 'Admin.Shopparameters.Feature'), + 'name' => 'reduction', + 'values' => ($group->id ? $this->formatCategoryDiscountList((int) $group->id) : []), + ], + [ + 'type' => 'modules', + 'label' => $this->trans('Modules authorization', [], 'Admin.Shopparameters.Feature'), + 'name' => 'auth_modules', + 'values' => $this->formatModuleListAuth($group->id), + ], + ], + ]; + + if (Shop::isFeatureActive()) { + $this->fields_form['input'][] = [ + 'type' => 'shop', + 'label' => $this->trans('Shop association', [], 'Admin.Global'), + 'name' => 'checkBoxShopAsso', + ]; + } + + if (Tools::getIsset('addgroup')) { + $this->fields_value['price_display_method'] = Configuration::get('PRICE_DISPLAY_METHOD'); + } + + $this->fields_value['reduction'] = isset($group->reduction) ? $group->reduction : 0; + + $tree = new HelperTreeCategories('categories-tree'); + $this->tpl_form_vars['categoryTreeView'] = $tree->setRootCategory((int) Category::getRootCategory()->id)->render(); + + return parent::renderForm(); + } + + protected function formatCategoryDiscountList($id_group) + { + $group_reductions = GroupReduction::getGroupReductions((int) $id_group, $this->context->language->id); + $category_reductions = []; + $category_reduction = Tools::getValue('category_reduction'); + + foreach ($group_reductions as $category) { + if (is_array($category_reduction) && array_key_exists($category['id_category'], $category_reduction)) { + $category['reduction'] = $category_reduction[$category['id_category']]; + } + + $category_reductions[(int) $category['id_category']] = [ + 'path' => Tools::getPath(Context::getContext()->link->getAdminLink('AdminCategories'), (int) $category['id_category']), + 'reduction' => (float) $category['reduction'] * 100, + 'id_category' => (int) $category['id_category'], + ]; + } + + if (is_array($category_reduction)) { + foreach ($category_reduction as $key => $val) { + if (!array_key_exists($key, $category_reductions)) { + $category_reductions[(int) $key] = [ + 'path' => Tools::getPath(Context::getContext()->link->getAdminLink('AdminCategories'), $key), + 'reduction' => (float) $val * 100, + 'id_category' => (int) $key, + ]; + } + } + } + + return $category_reductions; + } + + public function formatModuleListAuth($id_group) + { + $modules = Module::getModulesInstalled(); + $authorized_modules = ''; + + $auth_modules = []; + $unauth_modules = []; + + $shops = Shop::getContextListShopID(); + + if ($id_group) { + $authorized_modules = Module::getAuthorizedModules($id_group, $shops); + } + + if (is_array($authorized_modules)) { + foreach ($modules as $module) { + $authorized = false; + foreach ($authorized_modules as $auth_module) { + if ($module['id_module'] == $auth_module['id_module']) { + $authorized = true; + } + } + + if ($authorized) { + $auth_modules[] = $module; + } else { + $unauth_modules[] = $module; + } + } + } else { + $auth_modules = $modules; + } + $auth_modules_tmp = []; + foreach ($auth_modules as $key => $val) { + if ($module = Module::getInstanceById($val['id_module'])) { + $auth_modules_tmp[] = $module; + } + } + + $auth_modules = $auth_modules_tmp; + + $unauth_modules_tmp = []; + foreach ($unauth_modules as $key => $val) { + if (($tmp_obj = Module::getInstanceById($val['id_module']))) { + $unauth_modules_tmp[] = $tmp_obj; + } + } + + $unauth_modules = $unauth_modules_tmp; + + return ['unauth_modules' => $unauth_modules, 'auth_modules' => $auth_modules]; + } + + public function processSave() + { + if (!$this->validateDiscount(Tools::getValue('reduction'))) { + $this->errors[] = $this->trans('The discount value is incorrect (must be a percentage).', [], 'Admin.Shopparameters.Notification'); + } else { + $this->updateCategoryReduction(); + $object = parent::processSave(); + $this->updateRestrictions(); + + return $object; + } + } + + protected function validateDiscount($reduction) + { + if (!Validate::isPrice($reduction) || $reduction > 100 || $reduction < 0) { + return false; + } else { + return true; + } + } + + public function ajaxProcessAddCategoryReduction() + { + $category_reduction = Tools::getValue('category_reduction'); + $id_category = Tools::getValue('id_category'); //no cast validation is done with Validate::isUnsignedId($id_category) + + $result = []; + if (!Validate::isUnsignedId($id_category)) { + $result['errors'][] = $this->trans('Wrong category ID.', [], 'Admin.Shopparameters.Notification'); + $result['hasError'] = true; + } elseif (!$this->validateDiscount($category_reduction)) { + $result['errors'][] = $this->trans('The discount value is incorrect (must be a percentage).', [], 'Admin.Shopparameters.Notification'); + $result['hasError'] = true; + } else { + $result['id_category'] = (int) $id_category; + $result['catPath'] = Tools::getPath(self::$currentIndex . '?tab=AdminCategories', (int) $id_category); + $result['discount'] = $category_reduction; + $result['hasError'] = false; + } + die(json_encode($result)); + } + + /** + * Update (or create) restrictions for modules by group. + */ + protected function updateRestrictions() + { + $id_group = Tools::getValue('id_group'); + $auth_modules = Tools::getValue('modulesBoxAuth'); + $return = true; + if ($id_group) { + $shops = Shop::getContextListShopID(); + if (is_array($auth_modules)) { + $return &= Group::addModulesRestrictions($id_group, $auth_modules, $shops); + } + } + + // update module list by hook cache + Cache::clean(Hook::MODULE_LIST_BY_HOOK_KEY . '*'); + + return $return; + } + + protected function updateCategoryReduction() + { + $category_reduction = Tools::getValue('category_reduction'); + Db::getInstance()->execute( + ' + DELETE FROM `' . _DB_PREFIX_ . 'group_reduction` + WHERE `id_group` = ' . (int) Tools::getValue('id_group') + ); + Db::getInstance()->execute( + ' + DELETE FROM `' . _DB_PREFIX_ . 'product_group_reduction_cache` + WHERE `id_group` = ' . (int) Tools::getValue('id_group') + ); + if (is_array($category_reduction) && count($category_reduction)) { + if (!Configuration::getGlobalValue('PS_GROUP_FEATURE_ACTIVE')) { + Configuration::updateGlobalValue('PS_GROUP_FEATURE_ACTIVE', 1); + } + foreach ($category_reduction as $cat => $reduction) { + if (!Validate::isUnsignedId($cat) || !$this->validateDiscount($reduction)) { + $this->errors[] = $this->trans('The discount value is incorrect.', [], 'Admin.Shopparameters.Notification'); + } else { + $category = new Category((int) $cat); + $category->addGroupsIfNoExist((int) Tools::getValue('id_group')); + $group_reduction = new GroupReduction(); + $group_reduction->id_group = (int) Tools::getValue('id_group'); + $group_reduction->reduction = (float) ($reduction / 100); + $group_reduction->id_category = (int) $cat; + if (!$group_reduction->save()) { + $this->errors[] = $this->trans('You cannot save group reductions.', [], 'Admin.Shopparameters.Notification'); + } + } + } + } + } + + /** + * Toggle show prices flag. + */ + public function processChangeShowPricesVal() + { + $group = new Group($this->id_object); + if (!Validate::isLoadedObject($group)) { + $this->errors[] = $this->trans('An error occurred while updating this group.', [], 'Admin.Shopparameters.Notification'); + } + $update = Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'group` SET show_prices = ' . ($group->show_prices ? 0 : 1) . ' WHERE `id_group` = ' . (int) $group->id); + if (!$update) { + $this->errors[] = $this->trans('An error occurred while updating this group.', [], 'Admin.Shopparameters.Notification'); + } + Tools::clearSmartyCache(); + Tools::redirectAdmin(self::$currentIndex . '&token=' . $this->token); + } + + public function renderList() + { + $unidentified = new Group(Configuration::get('PS_UNIDENTIFIED_GROUP')); + $guest = new Group(Configuration::get('PS_GUEST_GROUP')); + $default = new Group(Configuration::get('PS_CUSTOMER_GROUP')); + + $unidentified_group_information = $this->trans('%group_name% - All persons without a customer account or customers that are not logged in.', ['%group_name%' => '' . $unidentified->name[$this->context->language->id] . ''], 'Admin.Shopparameters.Help'); + $guest_group_information = $this->trans('%group_name% - All persons who placed an order through Guest Checkout.', ['%group_name%' => '' . $guest->name[$this->context->language->id] . ''], 'Admin.Shopparameters.Help'); + $default_group_information = $this->trans('%group_name% - All persons who created an account on this site.', ['%group_name%' => '' . $default->name[$this->context->language->id] . ''], 'Admin.Shopparameters.Help'); + + $this->displayInformation($this->trans('PrestaShop has three default customer groups:', [], 'Admin.Shopparameters.Help')); + $this->displayInformation($unidentified_group_information); + $this->displayInformation($guest_group_information); + $this->displayInformation($default_group_information); + + return parent::renderList(); + } + + public function displayEditLink($token, $id) + { + $tpl = $this->createTemplate('helpers/list/list_action_edit.tpl'); + if (!array_key_exists('Edit', self::$cache_lang)) { + self::$cache_lang['Edit'] = $this->trans('Edit', [], 'Admin.Actions'); + } + + $href = self::$currentIndex . '&' . $this->identifier . '=' . $id . '&update' . $this->table . '&token=' . ($token != null ? $token : $this->token); + + if ($this->display == 'view') { + $href = Context::getContext()->link->getAdminLink('AdminCustomers', true, [], [ + 'id_customer' => $id, + 'updatecustomer' => 1, + 'back' => urlencode($href), + ]); + } + + $tpl->assign([ + 'href' => $href, + 'action' => self::$cache_lang['Edit'], + 'id' => $id, + ]); + + return $tpl->fetch(); + } +} diff --git a/controllers/admin/AdminImagesController.php b/controllers/admin/AdminImagesController.php new file mode 100644 index 0000000..b8814b5 --- /dev/null +++ b/controllers/admin/AdminImagesController.php @@ -0,0 +1,755 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ + +/** + * @property ImageType $object + */ +class AdminImagesControllerCore extends AdminController +{ + protected $start_time = 0; + protected $max_execution_time = 7200; + protected $display_move; + + public function __construct() + { + $this->bootstrap = true; + $this->table = 'image_type'; + $this->className = 'ImageType'; + $this->lang = false; + + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + parent::__construct(); + + $this->bulk_actions = [ + 'delete' => [ + 'text' => $this->trans('Delete selected', [], 'Admin.Actions'), + 'confirm' => $this->trans('Delete selected items?', [], 'Admin.Notifications.Warning'), + 'icon' => 'icon-trash', + ], + ]; + + $this->fields_list = [ + 'id_image_type' => ['title' => $this->trans('ID', [], 'Admin.Global'), 'align' => 'center', 'class' => 'fixed-width-xs'], + 'name' => ['title' => $this->trans('Name', [], 'Admin.Global')], + 'width' => ['title' => $this->trans('Width', [], 'Admin.Global'), 'suffix' => ' px'], + 'height' => ['title' => $this->trans('Height', [], 'Admin.Global'), 'suffix' => ' px'], + 'products' => ['title' => $this->trans('Products', [], 'Admin.Global'), 'align' => 'center', 'type' => 'bool', 'callback' => 'printEntityActiveIcon', 'orderby' => false], + 'categories' => ['title' => $this->trans('Categories', [], 'Admin.Global'), 'align' => 'center', 'type' => 'bool', 'callback' => 'printEntityActiveIcon', 'orderby' => false], + 'manufacturers' => ['title' => $this->trans('Brands', [], 'Admin.Global'), 'align' => 'center', 'type' => 'bool', 'callback' => 'printEntityActiveIcon', 'orderby' => false], + 'suppliers' => ['title' => $this->trans('Suppliers', [], 'Admin.Global'), 'align' => 'center', 'type' => 'bool', 'callback' => 'printEntityActiveIcon', 'orderby' => false], + 'stores' => ['title' => $this->trans('Stores', [], 'Admin.Global'), 'align' => 'center', 'type' => 'bool', 'callback' => 'printEntityActiveIcon', 'orderby' => false], + ]; + + // No need to display the old image system migration tool except if product images are in _PS_PROD_IMG_DIR_ + $this->display_move = false; + $dir = _PS_PROD_IMG_DIR_; + if (is_dir($dir)) { + if ($dh = opendir($dir)) { + while (($file = readdir($dh)) !== false && $this->display_move == false) { + if (!is_dir($dir . DIRECTORY_SEPARATOR . $file) && $file[0] != '.' && is_numeric($file[0])) { + $this->display_move = true; + } + } + closedir($dh); + } + } + + $this->fields_options = [ + 'images' => [ + 'title' => $this->trans('Images generation options', [], 'Admin.Design.Feature'), + 'icon' => 'icon-picture', + 'top' => '', + 'bottom' => '', + 'description' => $this->trans('JPEG images have a small file size and standard quality. PNG images have a larger file size, a higher quality and support transparency. Note that in all cases the image files will have the .jpg extension.', [], 'Admin.Design.Help') . ' +

' . $this->trans('WARNING: This feature may not be compatible with your theme, or with some of your modules. In particular, PNG mode is not compatible with the Watermark module. If you encounter any issues, turn it off by selecting "Use JPEG".', [], 'Admin.Design.Help'), + 'fields' => [ + 'PS_IMAGE_QUALITY' => [ + 'title' => $this->trans('Image format', [], 'Admin.Design.Feature'), + 'show' => true, + 'required' => true, + 'type' => 'radio', + 'choices' => ['jpg' => $this->trans('Use JPEG.', [], 'Admin.Design.Feature'), 'png' => $this->trans('Use PNG only if the base image is in PNG format.', [], 'Admin.Design.Feature'), 'png_all' => $this->trans('Use PNG for all images.', [], 'Admin.Design.Feature')], + ], + 'PS_JPEG_QUALITY' => [ + 'title' => $this->trans('JPEG compression', [], 'Admin.Design.Feature'), + 'hint' => $this->trans('Ranges from 0 (worst quality, smallest file) to 100 (best quality, biggest file).', [], 'Admin.Design.Help') . ' ' . $this->trans('Recommended: 90.', [], 'Admin.Design.Help'), + 'validation' => 'isUnsignedId', + 'required' => true, + 'cast' => 'intval', + 'type' => 'text', + ], + 'PS_PNG_QUALITY' => [ + 'title' => $this->trans('PNG compression', [], 'Admin.Design.Feature'), + 'hint' => $this->trans('PNG compression is lossless: unlike JPG, you do not lose image quality with a high compression ratio. However, photographs will compress very badly.', [], 'Admin.Design.Help') . ' ' . $this->trans('Ranges from 0 (biggest file) to 9 (smallest file, slowest decompression).', [], 'Admin.Design.Help') . ' ' . $this->trans('Recommended: 7.', [], 'Admin.Design.Help'), + 'validation' => 'isUnsignedId', + 'required' => true, + 'cast' => 'intval', + 'type' => 'text', + ], + 'PS_IMAGE_GENERATION_METHOD' => [ + 'title' => $this->trans('Generate images based on one side of the source image', [], 'Admin.Design.Feature'), + 'validation' => 'isUnsignedId', + 'required' => false, + 'cast' => 'intval', + 'type' => 'select', + 'list' => [ + [ + 'id' => '0', + 'name' => $this->trans('Automatic (longest side)', [], 'Admin.Design.Feature'), + ], + [ + 'id' => '1', + 'name' => $this->trans('Width', [], 'Admin.Global'), + ], + [ + 'id' => '2', + 'name' => $this->trans('Height', [], 'Admin.Global'), + ], + ], + 'identifier' => 'id', + 'visibility' => Shop::CONTEXT_ALL, + ], + 'PS_PRODUCT_PICTURE_MAX_SIZE' => [ + 'title' => $this->trans('Maximum file size of product customization pictures', [], 'Admin.Design.Feature'), + 'hint' => $this->trans('The maximum file size of pictures that customers can upload to customize a product (in bytes).', [], 'Admin.Design.Help'), + 'validation' => 'isUnsignedInt', + 'required' => true, + 'cast' => 'intval', + 'type' => 'text', + 'suffix' => $this->trans('bytes', [], 'Admin.Design.Feature'), + 'visibility' => Shop::CONTEXT_ALL, + ], + 'PS_PRODUCT_PICTURE_WIDTH' => [ + 'title' => $this->trans('Product picture width', [], 'Admin.Design.Feature'), + 'hint' => $this->trans('Width of product customization pictures that customers can upload (in pixels).', [], 'Admin.Design.Help'), + 'validation' => 'isUnsignedInt', + 'required' => true, + 'cast' => 'intval', + 'type' => 'text', + 'width' => 'px', + 'suffix' => $this->trans('pixels', [], 'Admin.Design.Feature'), + 'visibility' => Shop::CONTEXT_ALL, + ], + 'PS_PRODUCT_PICTURE_HEIGHT' => [ + 'title' => $this->trans('Product picture height', [], 'Admin.Design.Feature'), + 'hint' => $this->trans('Height of product customization pictures that customers can upload (in pixels).', [], 'Admin.Design.Help'), + 'validation' => 'isUnsignedInt', + 'required' => true, + 'cast' => 'intval', + 'type' => 'text', + 'height' => 'px', + 'suffix' => $this->trans('pixels', [], 'Admin.Design.Feature'), + 'visibility' => Shop::CONTEXT_ALL, + ], + 'PS_HIGHT_DPI' => [ + 'type' => 'bool', + 'title' => $this->trans('Generate high resolution images', [], 'Admin.Design.Feature'), + 'required' => false, + 'is_bool' => true, + 'hint' => $this->trans('This will generate an additional file for each image (thus doubling your total amount of images). Resolution of these images will be twice higher.', [], 'Admin.Design.Help'), + 'desc' => $this->trans('Enable to optimize the display of your images on high pixel density screens.', [], 'Admin.Design.Help'), + 'visibility' => Shop::CONTEXT_ALL, + ], + ], + 'submit' => ['title' => $this->trans('Save', [], 'Admin.Actions')], + ], + ]; + + if ($this->display_move) { + $this->fields_options['product_images']['fields']['PS_LEGACY_IMAGES'] = [ + 'title' => $this->trans('Use the legacy image filesystem', [], 'Admin.Design.Feature'), + 'hint' => $this->trans('This should be set to yes unless you successfully moved images in "Images" page under the "Preferences" menu.', [], 'Admin.Design.Help'), + 'validation' => 'isBool', + 'cast' => 'intval', + 'required' => false, + 'type' => 'bool', + 'visibility' => Shop::CONTEXT_ALL, + ]; + } + + $this->fields_form = [ + 'legend' => [ + 'title' => $this->trans('Image type', [], 'Admin.Design.Feature'), + 'icon' => 'icon-picture', + ], + 'input' => [ + [ + 'type' => 'text', + 'label' => $this->trans('Name for the image type', [], 'Admin.Design.Feature'), + 'name' => 'name', + 'required' => true, + 'hint' => $this->trans('Letters, underscores and hyphens only (e.g. "small_custom", "cart_medium", "large", "thickbox_extra-large").', [], 'Admin.Design.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Width', [], 'Admin.Global'), + 'name' => 'width', + 'required' => true, + 'maxlength' => 5, + 'suffix' => $this->trans('pixels', [], 'Admin.Design.Feature'), + 'hint' => $this->trans('Maximum image width in pixels.', [], 'Admin.Design.Help'), + ], + [ + 'type' => 'text', + 'label' => $this->trans('Height', [], 'Admin.Global'), + 'name' => 'height', + 'required' => true, + 'maxlength' => 5, + 'suffix' => $this->trans('pixels', [], 'Admin.Design.Feature'), + 'hint' => $this->trans('Maximum image height in pixels.', [], 'Admin.Design.Help'), + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Products', [], 'Admin.Global'), + 'name' => 'products', + 'required' => false, + 'is_bool' => true, + 'hint' => $this->trans('This type will be used for Product images.', [], 'Admin.Design.Help'), + 'values' => [ + [ + 'id' => 'products_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'products_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Categories', [], 'Admin.Global'), + 'name' => 'categories', + 'required' => false, + 'class' => 't', + 'is_bool' => true, + 'hint' => $this->trans('This type will be used for Category images.', [], 'Admin.Design.Help'), + 'values' => [ + [ + 'id' => 'categories_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'categories_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Brands', [], 'Admin.Global'), + 'name' => 'manufacturers', + 'required' => false, + 'is_bool' => true, + 'hint' => $this->trans('This type will be used for Brand images.', [], 'Admin.Design.Help'), + 'values' => [ + [ + 'id' => 'manufacturers_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'manufacturers_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Suppliers', [], 'Admin.Global'), + 'name' => 'suppliers', + 'required' => false, + 'is_bool' => true, + 'hint' => $this->trans('This type will be used for Supplier images.', [], 'Admin.Design.Help'), + 'values' => [ + [ + 'id' => 'suppliers_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'suppliers_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + ], + [ + 'type' => 'switch', + 'label' => $this->trans('Stores', [], 'Admin.Global'), + 'name' => 'stores', + 'required' => false, + 'is_bool' => true, + 'hint' => $this->trans('This type will be used for Store images.', [], 'Admin.Design.Help'), + 'values' => [ + [ + 'id' => 'stores_on', + 'value' => 1, + 'label' => $this->trans('Yes', [], 'Admin.Global'), + ], + [ + 'id' => 'stores_off', + 'value' => 0, + 'label' => $this->trans('No', [], 'Admin.Global'), + ], + ], + ], + ], + 'submit' => [ + 'title' => $this->trans('Save', [], 'Admin.Actions'), + ], + ]; + } + + public function postProcess() + { + // When moving images, if duplicate images were found they are moved to a folder named duplicates/ + if (file_exists(_PS_PROD_IMG_DIR_ . 'duplicates/')) { + $this->warnings[] = $this->trans('Duplicate images were found when moving the product images. This is likely caused by unused demonstration images. Please make sure that the folder %folder% only contains demonstration images, and then delete it.', ['%folder%' => _PS_PROD_IMG_DIR_ . 'duplicates/'], 'Admin.Design.Notification'); + } + + if (Tools::isSubmit('submitRegenerate' . $this->table)) { + if ($this->access('edit')) { + if ($this->_regenerateThumbnails(Tools::getValue('type'), Tools::getValue('erase'))) { + Tools::redirectAdmin(self::$currentIndex . '&conf=9' . '&token=' . $this->token); + } + } else { + $this->errors[] = $this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error'); + } + } elseif (Tools::isSubmit('submitMoveImages' . $this->table)) { + if ($this->access('edit')) { + if ($this->_moveImagesToNewFileSystem()) { + Tools::redirectAdmin(self::$currentIndex . '&conf=25' . '&token=' . $this->token); + } + } else { + $this->errors[] = $this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error'); + } + } elseif (Tools::isSubmit('submitOptions' . $this->table)) { + if ($this->access('edit')) { + if ((int) Tools::getValue('PS_JPEG_QUALITY') < 0 + || (int) Tools::getValue('PS_JPEG_QUALITY') > 100) { + $this->errors[] = $this->trans('Incorrect value for the selected JPEG image compression.', [], 'Admin.Design.Notification'); + } elseif ((int) Tools::getValue('PS_PNG_QUALITY') < 0 + || (int) Tools::getValue('PS_PNG_QUALITY') > 9) { + $this->errors[] = $this->trans('Incorrect value for the selected PNG image compression.', [], 'Admin.Design.Notification'); + } elseif (!Configuration::updateValue('PS_IMAGE_QUALITY', Tools::getValue('PS_IMAGE_QUALITY')) + || !Configuration::updateValue('PS_JPEG_QUALITY', Tools::getValue('PS_JPEG_QUALITY')) + || !Configuration::updateValue('PS_PNG_QUALITY', Tools::getValue('PS_PNG_QUALITY'))) { + $this->errors[] = $this->trans('Unknown error.', [], 'Admin.Notifications.Error'); + } else { + $this->confirmations[] = $this->_conf[6]; + } + + return parent::postProcess(); + } else { + $this->errors[] = $this->trans('You do not have permission to edit this.', [], 'Admin.Notifications.Error'); + } + } else { + return parent::postProcess(); + } + } + + public static function printEntityActiveIcon($value, $object) + { + return $value ? '' : ''; + } + + protected function _childValidation() + { + if (!Tools::getValue('id_image_type') && Validate::isImageTypeName($typeName = Tools::getValue('name')) && ImageType::typeAlreadyExists($typeName)) { + $this->errors[] = $this->trans('This name already exists.', [], 'Admin.Design.Notification'); + } + } + + /** + * Init display for the thumbnails regeneration block. + */ + public function initRegenerate() + { + $types = [ + 'categories' => $this->trans('Categories', [], 'Admin.Global'), + 'manufacturers' => $this->trans('Brands', [], 'Admin.Global'), + 'suppliers' => $this->trans('Suppliers', [], 'Admin.Global'), + 'products' => $this->trans('Products', [], 'Admin.Global'), + 'stores' => $this->trans('Stores', [], 'Admin.Global'), + ]; + + $formats = []; + foreach ($types as $i => $type) { + $formats[$i] = ImageType::getImagesTypes($i); + } + + $this->context->smarty->assign([ + 'types' => $types, + 'formats' => $formats, + ]); + } + + /** + * Delete resized image then regenerate new one with updated settings. + * + * @param string $dir + * @param array $type + * @param bool $product + * + * @return bool + */ + protected function _deleteOldImages($dir, $type, $product = false) + { + if (!is_dir($dir)) { + return false; + } + $toDel = scandir($dir, SCANDIR_SORT_NONE); + + foreach ($toDel as $d) { + foreach ($type as $imageType) { + if (preg_match('/^[0-9]+\-' . ($product ? '[0-9]+\-' : '') . $imageType['name'] . '\.jpg$/', $d) + || (count($type) > 1 && preg_match('/^[0-9]+\-[_a-zA-Z0-9-]*\.jpg$/', $d)) + || preg_match('/^([[:lower:]]{2})\-default\-' . $imageType['name'] . '\.jpg$/', $d)) { + if (file_exists($dir . $d)) { + unlink($dir . $d); + } + } + } + } + + // delete product images using new filesystem. + if ($product) { + $productsImages = Image::getAllImages(); + foreach ($productsImages as $image) { + $imageObj = new Image($image['id_image']); + $imageObj->id_product = $image['id_product']; + if (file_exists($dir . $imageObj->getImgFolder())) { + $toDel = scandir($dir . $imageObj->getImgFolder(), SCANDIR_SORT_NONE); + foreach ($toDel as $d) { + foreach ($type as $imageType) { + if (preg_match('/^[0-9]+\-' . $imageType['name'] . '\.jpg$/', $d) || (count($type) > 1 && preg_match('/^[0-9]+\-[_a-zA-Z0-9-]*\.jpg$/', $d))) { + if (file_exists($dir . $imageObj->getImgFolder() . $d)) { + unlink($dir . $imageObj->getImgFolder() . $d); + } + } + } + } + } + } + } + } + + /** + * Regenerate images. + * + * @param $dir + * @param $type + * @param bool $productsImages + * + * @return bool|string + */ + protected function _regenerateNewImages($dir, $type, $productsImages = false) + { + if (!is_dir($dir)) { + return false; + } + + $generate_hight_dpi_images = (bool) Configuration::get('PS_HIGHT_DPI'); + + if (!$productsImages) { + $formated_medium = ImageType::getFormattedName('medium'); + foreach (scandir($dir, SCANDIR_SORT_NONE) as $image) { + if (preg_match('/^[0-9]*\.jpg$/', $image)) { + foreach ($type as $k => $imageType) { + // Customizable writing dir + $newDir = $dir; + if (!file_exists($newDir)) { + continue; + } + + if (($dir == _PS_CAT_IMG_DIR_) && ($imageType['name'] == $formated_medium) && is_file(_PS_CAT_IMG_DIR_ . str_replace('.', '_thumb.', $image))) { + $image = str_replace('.', '_thumb.', $image); + } + + if (!file_exists($newDir . substr($image, 0, -4) . '-' . stripslashes($imageType['name']) . '.jpg')) { + if (!file_exists($dir . $image) || !filesize($dir . $image)) { + $this->errors[] = $this->trans('Source file does not exist or is empty (%filepath%)', ['%filepath%' => $dir . $image], 'Admin.Design.Notification'); + } elseif (!ImageManager::resize($dir . $image, $newDir . substr(str_replace('_thumb.', '.', $image), 0, -4) . '-' . stripslashes($imageType['name']) . '.jpg', (int) $imageType['width'], (int) $imageType['height'])) { + $this->errors[] = $this->trans('Failed to resize image file (%filepath%)', ['%filepath%' => $dir . $image], 'Admin.Design.Notification'); + } + + if ($generate_hight_dpi_images) { + if (!ImageManager::resize($dir . $image, $newDir . substr($image, 0, -4) . '-' . stripslashes($imageType['name']) . '2x.jpg', (int) $imageType['width'] * 2, (int) $imageType['height'] * 2)) { + $this->errors[] = $this->trans('Failed to resize image file to high resolution (%filepath%)', ['%filepath%' => $dir . $image], 'Admin.Design.Notification'); + } + } + } + // stop 4 seconds before the timeout, just enough time to process the end of the page on a slow server + if (time() - $this->start_time > $this->max_execution_time - 4) { + return 'timeout'; + } + } + } + } + } else { + foreach (Image::getAllImages() as $image) { + $imageObj = new Image($image['id_image']); + $existing_img = $dir . $imageObj->getExistingImgPath() . '.jpg'; + if (file_exists($existing_img) && filesize($existing_img)) { + foreach ($type as $imageType) { + if (!file_exists($dir . $imageObj->getExistingImgPath() . '-' . stripslashes($imageType['name']) . '.jpg')) { + if (!ImageManager::resize($existing_img, $dir . $imageObj->getExistingImgPath() . '-' . stripslashes($imageType['name']) . '.jpg', (int) $imageType['width'], (int) $imageType['height'])) { + $this->errors[] = $this->trans( + 'Original image is corrupt (%filename%) for product ID %id% or bad permission on folder.', + [ + '%filename%' => $existing_img, + '%id%' => (int) $imageObj->id_product, + ], + 'Admin.Design.Notification' + ); + } + } + if ($generate_hight_dpi_images) { + if (!file_exists($dir . $imageObj->getExistingImgPath() . '-' . stripslashes($imageType['name']) . '2x.jpg')) { + if (!ImageManager::resize($existing_img, $dir . $imageObj->getExistingImgPath() . '-' . stripslashes($imageType['name']) . '2x.jpg', (int) $imageType['width'] * 2, (int) $imageType['height'] * 2)) { + $this->errors[] = $this->trans( + 'Original image is corrupt (%filename%) for product ID %id% or bad permission on folder.', + [ + '%filename%' => $existing_img, + '%id%' => (int) $imageObj->id_product, + ], + 'Admin.Design.Notification' + ); + } + } + } + } + } else { + $this->errors[] = $this->trans( + 'Original image is missing or empty (%filename%) for product ID %id%', + [ + '%filename%' => $existing_img, + '%id%' => (int) $imageObj->id_product, + ], + 'Admin.Design.Notification' + ); + } + if (time() - $this->start_time > $this->max_execution_time - 4) { // stop 4 seconds before the tiemout, just enough time to process the end of the page on a slow server + return 'timeout'; + } + } + } + + return (bool) count($this->errors); + } + + /** + * Regenerate no-pictures images. + * + * @param $dir + * @param $type + * @param $languages + * + * @return bool + */ + protected function _regenerateNoPictureImages($dir, $type, $languages) + { + $errors = false; + $generate_hight_dpi_images = (bool) Configuration::get('PS_HIGHT_DPI'); + + foreach ($type as $image_type) { + foreach ($languages as $language) { + $file = $dir . $language['iso_code'] . '.jpg'; + if (!file_exists($file)) { + $file = _PS_PROD_IMG_DIR_ . Language::getIsoById((int) Configuration::get('PS_LANG_DEFAULT')) . '.jpg'; + } + if (!file_exists($dir . $language['iso_code'] . '-default-' . stripslashes($image_type['name']) . '.jpg')) { + if (!ImageManager::resize($file, $dir . $language['iso_code'] . '-default-' . stripslashes($image_type['name']) . '.jpg', (int) $image_type['width'], (int) $image_type['height'])) { + $errors = true; + } + + if ($generate_hight_dpi_images) { + if (!ImageManager::resize($file, $dir . $language['iso_code'] . '-default-' . stripslashes($image_type['name']) . '2x.jpg', (int) $image_type['width'] * 2, (int) $image_type['height'] * 2)) { + $errors = true; + } + } + } + } + } + + return $errors; + } + + /* Hook watermark optimization */ + protected function _regenerateWatermark($dir, $type = null) + { + $result = Db::getInstance()->executeS(' + SELECT m.`name` FROM `' . _DB_PREFIX_ . 'module` m + LEFT JOIN `' . _DB_PREFIX_ . 'hook_module` hm ON hm.`id_module` = m.`id_module` + LEFT JOIN `' . _DB_PREFIX_ . 'hook` h ON hm.`id_hook` = h.`id_hook` + WHERE h.`name` = \'actionWatermark\' AND m.`active` = 1'); + + if ($result && count($result)) { + $productsImages = Image::getAllImages(); + foreach ($productsImages as $image) { + $imageObj = new Image($image['id_image']); + if (file_exists($dir . $imageObj->getExistingImgPath() . '.jpg')) { + foreach ($result as $module) { + $moduleInstance = Module::getInstanceByName($module['name']); + if ($moduleInstance && is_callable([$moduleInstance, 'hookActionWatermark'])) { + call_user_func([$moduleInstance, 'hookActionWatermark'], ['id_image' => $imageObj->id, 'id_product' => $imageObj->id_product, 'image_type' => $type]); + } + + if (time() - $this->start_time > $this->max_execution_time - 4) { // stop 4 seconds before the tiemout, just enough time to process the end of the page on a slow server + return 'timeout'; + } + } + } + } + } + } + + protected function _regenerateThumbnails($type = 'all', $deleteOldImages = false) + { + $this->start_time = time(); + ini_set('max_execution_time', $this->max_execution_time); // ini_set may be disabled, we need the real value + $this->max_execution_time = (int) ini_get('max_execution_time'); + $languages = Language::getLanguages(false); + + $process = [ + ['type' => 'categories', 'dir' => _PS_CAT_IMG_DIR_], + ['type' => 'manufacturers', 'dir' => _PS_MANU_IMG_DIR_], + ['type' => 'suppliers', 'dir' => _PS_SUPP_IMG_DIR_], + ['type' => 'products', 'dir' => _PS_PROD_IMG_DIR_], + ['type' => 'stores', 'dir' => _PS_STORE_IMG_DIR_], + ]; + + // Launching generation process + foreach ($process as $proc) { + if ($type != 'all' && $type != $proc['type']) { + continue; + } + + // Getting format generation + $formats = ImageType::getImagesTypes($proc['type']); + if ($type != 'all') { + $format = (string) (Tools::getValue('format_' . $type)); + if ($format != 'all') { + foreach ($formats as $k => $form) { + if ($form['id_image_type'] != $format) { + unset($formats[$k]); + } + } + } + } + + if ($deleteOldImages) { + $this->_deleteOldImages($proc['dir'], $formats, ($proc['type'] == 'products' ? true : false)); + } + if (($return = $this->_regenerateNewImages($proc['dir'], $formats, ($proc['type'] == 'products' ? true : false))) === true) { + if (!count($this->errors)) { + $this->errors[] = $this->trans('Cannot write images for this type: %1$s. Please check the %2$s folder\'s writing permissions.', [$proc['type'], $proc['dir']], 'Admin.Design.Notification'); + } + } elseif ($return == 'timeout') { + $this->errors[] = $this->trans('Only part of the images have been regenerated. The server timed out before finishing.', [], 'Admin.Design.Notification'); + } else { + if ($proc['type'] == 'products') { + if ($this->_regenerateWatermark($proc['dir'], $formats) == 'timeout') { + $this->errors[] = $this->trans('Server timed out. The watermark may not have been applied to all images.', [], 'Admin.Design.Notification'); + } + } + if (!count($this->errors)) { + if ($this->_regenerateNoPictureImages($proc['dir'], $formats, $languages)) { + $this->errors[] = $this->trans('Cannot write "No picture" image to %s images folder. Please check the folder\'s writing permissions.', [$proc['type']], 'Admin.Design.Notification'); + } + } + } + } + + return count($this->errors) > 0 ? false : true; + } + + public function initPageHeaderToolbar() + { + if (empty($this->display)) { + $this->page_header_toolbar_btn['new_image_type'] = [ + 'href' => self::$currentIndex . '&addimage_type&token=' . $this->token, + 'desc' => $this->trans('Add new image type', [], 'Admin.Design.Feature'), + 'icon' => 'process-icon-new', + ]; + } + + parent::initPageHeaderToolbar(); + } + + /** + * Move product images to the new filesystem. + */ + protected function _moveImagesToNewFileSystem() + { + if (!Image::testFileSystem()) { + $this->errors[] = $this->trans('Error: Your server configuration is not compatible with the new image system. No images were moved.', [], 'Admin.Design.Notification'); + } else { + ini_set('max_execution_time', $this->max_execution_time); // ini_set may be disabled, we need the real value + $this->max_execution_time = (int) ini_get('max_execution_time'); + $result = Image::moveToNewFileSystem($this->max_execution_time); + if ($result === 'timeout') { + $this->errors[] = $this->trans( + 'Not all images have been moved. The server timed out before finishing. Click on "%move_images_label%" again to resume the moving process.', + [ + '%move_images_label%' => $this->trans('Move images', [], 'Admin.Design.Feature'), + ], + 'Admin.Design.Notification' + ); + } elseif ($result === false) { + $this->errors[] = $this->trans('Error: Some -- or all -- images cannot be moved.', [], 'Admin.Design.Notification'); + } + } + + return count($this->errors) > 0 ? false : true; + } + + public function initContent() + { + if ($this->display != 'edit' && $this->display != 'add') { + $this->initRegenerate(); + + $this->context->smarty->assign([ + 'display_regenerate' => true, + 'display_move' => $this->display_move, + ]); + } + + if ($this->display == 'edit') { + $this->warnings[] = $this->trans('After modification, do not forget to regenerate thumbnails', [], 'Admin.Design.Notification'); + } + + parent::initContent(); + } +} diff --git a/controllers/admin/AdminImportController.php b/controllers/admin/AdminImportController.php new file mode 100644 index 0000000..de57959 --- /dev/null +++ b/controllers/admin/AdminImportController.php @@ -0,0 +1,4954 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + */ +use PhpOffice\PhpSpreadsheet\IOFactory; + +@ini_set('max_execution_time', 0); +/* No max line limit since the lines can be more than 4096. Performance impact is not significant. */ +define('MAX_LINE_SIZE', 0); + +/* Used for validatefields diying without user friendly error or not */ +define('UNFRIENDLY_ERROR', false); + +/* this value set the number of columns visible on each page */ +define('MAX_COLUMNS', 6); + +/* correct Mac error on eof */ +@ini_set('auto_detect_line_endings', '1'); + +class AdminImportControllerCore extends AdminController +{ + public static $column_mask; + + public $entities = []; + + public $available_fields = []; + + public $required_fields = []; + + public static $default_values = []; + + public static $validators = [ + 'active' => ['AdminImportController', 'getBoolean'], + 'tax_rate' => ['AdminImportController', 'getPrice'], + /* Tax excluded */ + 'price_tex' => ['AdminImportController', 'getPrice'], + /* Tax included */ + 'price_tin' => ['AdminImportController', 'getPrice'], + 'reduction_price' => ['AdminImportController', 'getPrice'], + 'reduction_percent' => ['AdminImportController', 'getPrice'], + 'wholesale_price' => ['AdminImportController', 'getPrice'], + 'ecotax' => ['AdminImportController', 'getPrice'], + 'name' => ['AdminImportController', 'createMultiLangField'], + 'description' => ['AdminImportController', 'createMultiLangField'], + 'description_short' => ['AdminImportController', 'createMultiLangField'], + 'meta_title' => ['AdminImportController', 'createMultiLangField'], + 'meta_keywords' => ['AdminImportController', 'createMultiLangField'], + 'meta_description' => ['AdminImportController', 'createMultiLangField'], + 'link_rewrite' => ['AdminImportController', 'createMultiLangField'], + 'available_now' => ['AdminImportController', 'createMultiLangField'], + 'available_later' => ['AdminImportController', 'createMultiLangField'], + 'category' => ['AdminImportController', 'split'], + 'online_only' => ['AdminImportController', 'getBoolean'], + 'accessories' => ['AdminImportController', 'split'], + 'image_alt' => ['AdminImportController', 'split'], + 'delivery_in_stock' => ['AdminImportController', 'createMultiLangField'], + 'delivery_out_stock' => ['AdminImportController', 'createMultiLangField'], + ]; + + public $separator; + public $convert; + public $multiple_value_separator; + + /** + * This flag shows if import was executed in current request. + * Used for symfony migration purposes. + * + * @var bool + */ + private $importExecuted = false; + + public function __construct() + { + $this->bootstrap = true; + + parent::__construct(); + + $this->entities = [ + $this->trans('Categories', [], 'Admin.Global'), + $this->trans('Products', [], 'Admin.Global'), + $this->trans('Combinations', [], 'Admin.Global'), + $this->trans('Customers', [], 'Admin.Global'), + $this->trans('Addresses', [], 'Admin.Global'), + $this->trans('Brands', [], 'Admin.Global'), + $this->trans('Suppliers', [], 'Admin.Global'), + $this->trans('Alias', [], 'Admin.Shopparameters.Feature'), + $this->trans('Store contacts', [], 'Admin.Advparameters.Feature'), + ]; + + // @since 1.5.0 + if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) { + $this->entities = array_merge( + $this->entities, + [ + $this->trans('Supply Orders', [], 'Admin.Advparameters.Feature'), + $this->trans('Supply Order Details', [], 'Admin.Advparameters.Feature'), + ] + ); + } + + $this->entities = array_flip($this->entities); + + switch ((int) Tools::getValue('entity')) { + case $this->entities[$this->trans('Combinations', [], 'Admin.Global')]: + $this->required_fields = [ + 'group', + 'attribute', + ]; + + $this->available_fields = [ + 'no' => ['label' => $this->trans('Ignore this column', [], 'Admin.Advparameters.Feature')], + 'id_product' => ['label' => $this->trans('Product ID', [], 'Admin.Advparameters.Feature')], + 'product_reference' => ['label' => $this->trans('Product Reference', [], 'Admin.Advparameters.Feature')], + 'group' => [ + 'label' => $this->trans('Attribute (Name:Type:Position)', [], 'Admin.Advparameters.Feature') . '*', + ], + 'attribute' => [ + 'label' => $this->trans('Value (Value:Position)', [], 'Admin.Advparameters.Feature') . '*', + ], + 'supplier_reference' => ['label' => $this->trans('Supplier reference', [], 'Admin.Advparameters.Feature')], + 'reference' => ['label' => $this->trans('Reference', [], 'Admin.Global')], + 'ean13' => ['label' => $this->trans('EAN13', [], 'Admin.Advparameters.Feature')], + 'upc' => ['label' => $this->trans('UPC', [], 'Admin.Advparameters.Feature')], + 'mpn' => ['label' => $this->trans('MPN', [], 'Admin.Catalog.Feature')], + 'wholesale_price' => ['label' => $this->trans('Cost price', [], 'Admin.Catalog.Feature')], + 'price' => ['label' => $this->trans('Impact on price', [], 'Admin.Catalog.Feature')], + 'ecotax' => ['label' => $this->trans('Ecotax', [], 'Admin.Catalog.Feature')], + 'quantity' => ['label' => $this->trans('Quantity', [], 'Admin.Global')], + 'minimal_quantity' => ['label' => $this->trans('Minimal quantity', [], 'Admin.Advparameters.Feature')], + 'low_stock_threshold' => ['label' => $this->trans('Low stock level', [], 'Admin.Catalog.Feature')], + 'low_stock_alert' => ['label' => $this->trans('Send me an email when the quantity is under this level', [], 'Admin.Catalog.Feature')], + 'weight' => ['label' => $this->trans('Impact on weight', [], 'Admin.Catalog.Feature')], + 'default_on' => ['label' => $this->trans('Default (0 = No, 1 = Yes)', [], 'Admin.Advparameters.Feature')], + 'available_date' => ['label' => $this->trans('Combination availability date', [], 'Admin.Advparameters.Feature')], + 'image_position' => [ + 'label' => $this->trans('Choose among product images by position (1,2,3...)', [], 'Admin.Advparameters.Feature'), + ], + 'image_url' => ['label' => $this->trans('Image URLs (x,y,z...)', [], 'Admin.Advparameters.Feature')], + 'image_alt' => ['label' => $this->trans('Image alt texts (x,y,z...)', [], 'Admin.Advparameters.Feature')], + 'shop' => [ + 'label' => $this->trans('ID / Name of shop', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('Ignore this field if you don\'t use the Multistore tool. If you leave this field empty, the default shop will be used.', [], 'Admin.Advparameters.Help'), + ], + 'advanced_stock_management' => [ + 'label' => $this->trans('Advanced Stock Management', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('Enable Advanced Stock Management on product (0 = No, 1 = Yes)', [], 'Admin.Advparameters.Help'), + ], + 'depends_on_stock' => [ + 'label' => $this->trans('Depends on stock', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('0 = Use quantity set in product, 1 = Use quantity from warehouse.', [], 'Admin.Advparameters.Help'), + ], + 'warehouse' => [ + 'label' => $this->trans('Warehouse', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('ID of the warehouse to set as storage.', [], 'Admin.Advparameters.Help'), + ], + ]; + + self::$default_values = [ + 'reference' => '', + 'supplier_reference' => '', + 'ean13' => '', + 'upc' => '', + 'mpn' => '', + 'wholesale_price' => 0, + 'price' => 0, + 'ecotax' => 0, + 'quantity' => 0, + 'minimal_quantity' => 1, + 'low_stock_threshold' => null, + 'low_stock_alert' => false, + 'weight' => 0, + 'default_on' => null, + 'advanced_stock_management' => 0, + 'depends_on_stock' => 0, + 'available_date' => date('Y-m-d'), + ]; + + break; + + case $this->entities[$this->trans('Categories', [], 'Admin.Global')]: + $this->available_fields = [ + 'no' => ['label' => $this->trans('Ignore this column', [], 'Admin.Advparameters.Feature')], + 'id' => ['label' => $this->trans('ID', [], 'Admin.Global')], + 'active' => ['label' => $this->trans('Active (0/1)', [], 'Admin.Advparameters.Feature')], + 'name' => ['label' => $this->trans('Name', [], 'Admin.Global')], + 'parent' => ['label' => $this->trans('Parent category', [], 'Admin.Catalog.Feature')], + 'is_root_category' => [ + 'label' => $this->trans('Root category (0/1)', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('A category root is where a category tree can begin. This is used with multistore.', [], 'Admin.Advparameters.Help'), + ], + 'description' => ['label' => $this->trans('Description', [], 'Admin.Global')], + 'meta_title' => ['label' => $this->trans('Meta title', [], 'Admin.Global')], + 'meta_keywords' => ['label' => $this->trans('Meta keywords', [], 'Admin.Global')], + 'meta_description' => ['label' => $this->trans('Meta description', [], 'Admin.Global')], + 'link_rewrite' => ['label' => $this->trans('Rewritten URL', [], 'Admin.Shopparameters.Feature')], + 'image' => ['label' => $this->trans('Image URL', [], 'Admin.Advparameters.Feature')], + 'shop' => [ + 'label' => $this->trans('ID / Name of shop', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('Ignore this field if you don\'t use the Multistore tool. If you leave this field empty, the default shop will be used.', [], 'Admin.Advparameters.Help'), + ], + ]; + + self::$default_values = [ + 'active' => '1', + 'parent' => Configuration::get('PS_HOME_CATEGORY'), + 'link_rewrite' => '', + ]; + + break; + + case $this->entities[$this->trans('Products', [], 'Admin.Global')]: + self::$validators['image'] = [ + 'AdminImportController', + 'split', + ]; + + $this->available_fields = [ + 'no' => ['label' => $this->trans('Ignore this column', [], 'Admin.Advparameters.Feature')], + 'id' => ['label' => $this->trans('ID', [], 'Admin.Global')], + 'active' => ['label' => $this->trans('Active (0/1)', [], 'Admin.Advparameters.Feature')], + 'name' => ['label' => $this->trans('Name', [], 'Admin.Global')], + 'category' => ['label' => $this->trans('Categories (x,y,z...)', [], 'Admin.Advparameters.Feature')], + 'price_tex' => ['label' => $this->trans('Price tax excluded', [], 'Admin.Advparameters.Feature')], + 'price_tin' => ['label' => $this->trans('Price tax included', [], 'Admin.Advparameters.Feature')], + 'id_tax_rules_group' => ['label' => $this->trans('Tax rule ID', [], 'Admin.Advparameters.Feature')], + 'wholesale_price' => ['label' => $this->trans('Cost price', [], 'Admin.Catalog.Feature')], + 'on_sale' => ['label' => $this->trans('On sale (0/1)', [], 'Admin.Advparameters.Feature')], + 'reduction_price' => ['label' => $this->trans('Discount amount', [], 'Admin.Advparameters.Feature')], + 'reduction_percent' => ['label' => $this->trans('Discount percent', [], 'Admin.Advparameters.Feature')], + 'reduction_from' => ['label' => $this->trans('Discount from (yyyy-mm-dd)', [], 'Admin.Advparameters.Feature')], + 'reduction_to' => ['label' => $this->trans('Discount to (yyyy-mm-dd)', [], 'Admin.Advparameters.Feature')], + 'reference' => ['label' => $this->trans('Reference #', [], 'Admin.Advparameters.Feature')], + 'supplier_reference' => ['label' => $this->trans('Supplier reference #', [], 'Admin.Advparameters.Feature')], + 'supplier' => ['label' => $this->trans('Supplier', [], 'Admin.Global')], + 'manufacturer' => ['label' => $this->trans('Brand', [], 'Admin.Global')], + 'ean13' => ['label' => $this->trans('EAN13', [], 'Admin.Advparameters.Feature')], + 'upc' => ['label' => $this->trans('UPC', [], 'Admin.Advparameters.Feature')], + 'mpn' => ['label' => $this->trans('MPN', [], 'Admin.Catalog.Feature')], + 'ecotax' => ['label' => $this->trans('Ecotax', [], 'Admin.Catalog.Feature')], + 'width' => ['label' => $this->trans('Width', [], 'Admin.Global')], + 'height' => ['label' => $this->trans('Height', [], 'Admin.Global')], + 'depth' => ['label' => $this->trans('Depth', [], 'Admin.Global')], + 'weight' => ['label' => $this->trans('Weight', [], 'Admin.Global')], + 'delivery_in_stock' => [ + 'label' => $this->trans( + 'Delivery time of in-stock products:', + [], + 'Admin.Catalog.Feature' + ), + ], + 'delivery_out_stock' => [ + 'label' => $this->trans( + 'Delivery time of out-of-stock products with allowed orders:', + [], + 'Admin.Advparameters.Feature' + ), + ], + 'quantity' => ['label' => $this->trans('Quantity', [], 'Admin.Global')], + 'minimal_quantity' => ['label' => $this->trans('Minimal quantity', [], 'Admin.Advparameters.Feature')], + 'low_stock_threshold' => ['label' => $this->trans('Low stock level', [], 'Admin.Catalog.Feature')], + 'low_stock_alert' => ['label' => $this->trans('Send me an email when the quantity is under this level', [], 'Admin.Catalog.Feature')], + 'visibility' => ['label' => $this->trans('Visibility', [], 'Admin.Catalog.Feature')], + 'additional_shipping_cost' => ['label' => $this->trans('Additional shipping cost', [], 'Admin.Advparameters.Feature')], + 'unity' => ['label' => $this->trans('Unit for the price per unit', [], 'Admin.Advparameters.Feature')], + 'unit_price' => ['label' => $this->trans('Price per unit', [], 'Admin.Advparameters.Feature')], + 'description_short' => ['label' => $this->trans('Summary', [], 'Admin.Catalog.Feature')], + 'description' => ['label' => $this->trans('Description', [], 'Admin.Global')], + 'tags' => ['label' => $this->trans('Tags (x,y,z...)', [], 'Admin.Advparameters.Feature')], + 'meta_title' => ['label' => $this->trans('Meta title', [], 'Admin.Global')], + 'meta_keywords' => ['label' => $this->trans('Meta keywords', [], 'Admin.Global')], + 'meta_description' => ['label' => $this->trans('Meta description', [], 'Admin.Global')], + 'link_rewrite' => ['label' => $this->trans('Rewritten URL', [], 'Admin.Advparameters.Feature')], + 'available_now' => ['label' => $this->trans('Label when in stock', [], 'Admin.Catalog.Feature')], + 'available_later' => ['label' => $this->trans('Label when backorder allowed', [], 'Admin.Advparameters.Feature')], + 'available_for_order' => ['label' => $this->trans('Available for order (0 = No, 1 = Yes)', [], 'Admin.Advparameters.Feature')], + 'available_date' => ['label' => $this->trans('Product availability date', [], 'Admin.Advparameters.Feature')], + 'date_add' => ['label' => $this->trans('Product creation date', [], 'Admin.Advparameters.Feature')], + 'show_price' => ['label' => $this->trans('Show price (0 = No, 1 = Yes)', [], 'Admin.Advparameters.Feature')], + 'image' => ['label' => $this->trans('Image URLs (x,y,z...)', [], 'Admin.Advparameters.Feature')], + 'image_alt' => ['label' => $this->trans('Image alt texts (x,y,z...)', [], 'Admin.Advparameters.Feature')], + 'delete_existing_images' => [ + 'label' => $this->trans('Delete existing images (0 = No, 1 = Yes)', [], 'Admin.Advparameters.Feature'), + ], + 'features' => ['label' => $this->trans('Feature (Name:Value:Position:Customized)', [], 'Admin.Advparameters.Feature')], + 'online_only' => ['label' => $this->trans('Available online only (0 = No, 1 = Yes)', [], 'Admin.Advparameters.Feature')], + 'condition' => ['label' => $this->trans('Condition', [], 'Admin.Catalog.Feature')], + 'customizable' => ['label' => $this->trans('Customizable (0 = No, 1 = Yes)', [], 'Admin.Advparameters.Feature')], + 'uploadable_files' => ['label' => $this->trans('Uploadable files (0 = No, 1 = Yes)', [], 'Admin.Advparameters.Feature')], + 'text_fields' => ['label' => $this->trans('Text fields (0 = No, 1 = Yes)', [], 'Admin.Advparameters.Feature')], + 'out_of_stock' => ['label' => $this->trans('Action when out of stock', [], 'Admin.Advparameters.Feature')], + 'is_virtual' => ['label' => $this->trans('Virtual product (0 = No, 1 = Yes)', [], 'Admin.Advparameters.Feature')], + 'file_url' => ['label' => $this->trans('File URL', [], 'Admin.Advparameters.Feature')], + 'nb_downloadable' => [ + 'label' => $this->trans('Number of allowed downloads', [], 'Admin.Catalog.Feature'), + 'help' => $this->trans('Number of days this file can be accessed by customers. Set to zero for unlimited access.', [], 'Admin.Catalog.Help'), + ], + 'date_expiration' => ['label' => $this->trans('Expiration date (yyyy-mm-dd)', [], 'Admin.Advparameters.Feature')], + 'nb_days_accessible' => [ + 'label' => $this->trans('Number of days', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('Number of days this file can be accessed by customers. Set to zero for unlimited access.', [], 'Admin.Catalog.Help'), + ], + 'shop' => [ + 'label' => $this->trans('ID / Name of shop', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('Ignore this field if you don\'t use the Multistore tool. If you leave this field empty, the default shop will be used.', [], 'Admin.Advparameters.Help'), + ], + 'advanced_stock_management' => [ + 'label' => $this->trans('Advanced Stock Management', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('Enable Advanced Stock Management on product (0 = No, 1 = Yes).', [], 'Admin.Advparameters.Help'), + ], + 'depends_on_stock' => [ + 'label' => $this->trans('Depends on stock', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('0 = Use quantity set in product, 1 = Use quantity from warehouse.', [], 'Admin.Advparameters.Help'), + ], + 'warehouse' => [ + 'label' => $this->trans('Warehouse', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('ID of the warehouse to set as storage.', [], 'Admin.Advparameters.Help'), + ], + 'accessories' => ['label' => $this->trans('Accessories (x,y,z...)', [], 'Admin.Advparameters.Feature')], + ]; + + self::$default_values = [ + 'id_category' => [(int) Configuration::get('PS_HOME_CATEGORY')], + 'id_category_default' => null, + 'active' => '1', + 'width' => 0.000000, + 'height' => 0.000000, + 'depth' => 0.000000, + 'weight' => 0.000000, + 'visibility' => 'both', + 'additional_shipping_cost' => 0.00, + 'unit_price' => 0, + 'quantity' => 0, + 'minimal_quantity' => 1, + 'low_stock_threshold' => null, + 'low_stock_alert' => false, + 'price' => 0, + 'id_tax_rules_group' => 0, + 'description_short' => [(int) Configuration::get('PS_LANG_DEFAULT') => ''], + 'link_rewrite' => [(int) Configuration::get('PS_LANG_DEFAULT') => ''], + 'online_only' => 0, + 'condition' => 'new', + 'available_date' => date('Y-m-d'), + 'date_add' => date('Y-m-d H:i:s'), + 'date_upd' => date('Y-m-d H:i:s'), + 'customizable' => 0, + 'uploadable_files' => 0, + 'text_fields' => 0, + 'advanced_stock_management' => 0, + 'depends_on_stock' => 0, + 'is_virtual' => 0, + ]; + + break; + + case $this->entities[$this->trans('Customers', [], 'Admin.Global')]: + //Overwrite required_fields AS only email is required whereas other entities + $this->required_fields = ['email', 'passwd', 'lastname', 'firstname']; + + $this->available_fields = [ + 'no' => ['label' => $this->trans('Ignore this column', [], 'Admin.Advparameters.Feature')], + 'id' => ['label' => $this->trans('ID', [], 'Admin.Global')], + 'active' => ['label' => $this->trans('Active (0/1)', [], 'Admin.Advparameters.Feature')], + 'id_gender' => ['label' => $this->trans('Titles ID (Mr = 1, Ms = 2, else 0)', [], 'Admin.Advparameters.Feature')], + 'email' => ['label' => $this->trans('Email', [], 'Admin.Global') . '*'], + 'passwd' => ['label' => $this->trans('Password', [], 'Admin.Global') . '*'], + 'birthday' => ['label' => $this->trans('Birth date (yyyy-mm-dd)', [], 'Admin.Advparameters.Feature')], + 'lastname' => ['label' => $this->trans('Last name', [], 'Admin.Global') . '*'], + 'firstname' => ['label' => $this->trans('First name', [], 'Admin.Global') . '*'], + 'newsletter' => ['label' => $this->trans('Newsletter (0/1)', [], 'Admin.Advparameters.Feature')], + 'optin' => ['label' => $this->trans('Partner offers (0/1)', [], 'Admin.Advparameters.Feature')], + 'date_add' => ['label' => $this->trans('Registration date (yyyy-mm-dd)', [], 'Admin.Advparameters.Feature')], + 'group' => ['label' => $this->trans('Groups (x,y,z...)', [], 'Admin.Advparameters.Feature')], + 'id_default_group' => ['label' => $this->trans('Default group ID', [], 'Admin.Advparameters.Feature')], + 'id_shop' => [ + 'label' => $this->trans('ID / Name of shop', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('Ignore this field if you don\'t use the Multistore tool. If you leave this field empty, the default shop will be used.', [], 'Admin.Advparameters.Help'), + ], + ]; + + self::$default_values = [ + 'active' => '1', + 'id_shop' => Configuration::get('PS_SHOP_DEFAULT'), + ]; + + break; + + case $this->entities[$this->trans('Addresses', [], 'Admin.Global')]: + //Overwrite required_fields + $this->required_fields = [ + 'alias', + 'lastname', + 'firstname', + 'address1', + 'postcode', + 'country', + 'customer_email', + 'city', + ]; + + $this->available_fields = [ + 'no' => ['label' => $this->trans('Ignore this column', [], 'Admin.Advparameters.Feature')], + 'id' => ['label' => $this->trans('ID', [], 'Admin.Global')], + 'alias' => ['label' => $this->trans('Alias', [], 'Admin.Shopparameters.Feature') . '*'], + 'active' => ['label' => $this->trans('Active (0/1)', [], 'Admin.Advparameters.Feature')], + 'customer_email' => ['label' => $this->trans('Customer email', [], 'Admin.Advparameters.Feature') . '*'], + 'id_customer' => ['label' => $this->trans('Customer ID', [], 'Admin.Advparameters.Feature')], + 'manufacturer' => ['label' => $this->trans('Brand', [], 'Admin.Global')], + 'supplier' => ['label' => $this->trans('Supplier', [], 'Admin.Global')], + 'company' => ['label' => $this->trans('Company', [], 'Admin.Global')], + 'lastname' => ['label' => $this->trans('Last name', [], 'Admin.Global') . '*'], + 'firstname' => ['label' => $this->trans('First name', [], 'Admin.Global') . '*'], + 'address1' => ['label' => $this->trans('Address', [], 'Admin.Global') . '*'], + 'address2' => ['label' => $this->trans('Address (2)', [], 'Admin.Global')], + 'postcode' => ['label' => $this->trans('Zip/Postal code', [], 'Admin.Global') . '*'], + 'city' => ['label' => $this->trans('City', [], 'Admin.Global') . '*'], + 'country' => ['label' => $this->trans('Country', [], 'Admin.Global') . '*'], + 'state' => ['label' => $this->trans('State', [], 'Admin.Global')], + 'other' => ['label' => $this->trans('Other', [], 'Admin.Global')], + 'phone' => ['label' => $this->trans('Phone', [], 'Admin.Global')], + 'phone_mobile' => ['label' => $this->trans('Mobile Phone', [], 'Admin.Global')], + 'vat_number' => ['label' => $this->trans('VAT number', [], 'Admin.Orderscustomers.Feature')], + 'dni' => ['label' => $this->trans('Identification number', [], 'Admin.Orderscustomers.Feature')], + ]; + + self::$default_values = [ + 'alias' => 'Alias', + 'postcode' => 'X', + ]; + + break; + case $this->entities[$this->trans('Brands', [], 'Admin.Global')]: + case $this->entities[$this->trans('Suppliers', [], 'Admin.Global')]: + //Overwrite validators AS name is not MultiLangField + self::$validators = [ + 'description' => ['AdminImportController', 'createMultiLangField'], + 'short_description' => ['AdminImportController', 'createMultiLangField'], + 'meta_title' => ['AdminImportController', 'createMultiLangField'], + 'meta_keywords' => ['AdminImportController', 'createMultiLangField'], + 'meta_description' => ['AdminImportController', 'createMultiLangField'], + ]; + + $this->available_fields = [ + 'no' => ['label' => $this->trans('Ignore this column', [], 'Admin.Advparameters.Feature')], + 'id' => ['label' => $this->trans('ID', [], 'Admin.Global')], + 'active' => ['label' => $this->trans('Active (0/1)', [], 'Admin.Advparameters.Feature')], + 'name' => ['label' => $this->trans('Name', [], 'Admin.Global')], + 'description' => ['label' => $this->trans('Description', [], 'Admin.Global')], + 'short_description' => ['label' => $this->trans('Short description', [], 'Admin.Catalog.Feature')], + 'meta_title' => ['label' => $this->trans('Meta title', [], 'Admin.Global')], + 'meta_keywords' => ['label' => $this->trans('Meta keywords', [], 'Admin.Global')], + 'meta_description' => ['label' => $this->trans('Meta description', [], 'Admin.Global')], + 'image' => ['label' => $this->trans('Image URL', [], 'Admin.Advparameters.Feature')], + 'shop' => [ + 'label' => $this->trans('ID / Name of group shop', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('Ignore this field if you don\'t use the Multistore tool. If you leave this field empty, the default shop will be used.', [], 'Admin.Advparameters.Help'), + ], + ]; + + self::$default_values = [ + 'shop' => Shop::getGroupFromShop(Configuration::get('PS_SHOP_DEFAULT')), + ]; + + break; + case $this->entities[$this->trans('Alias', [], 'Admin.Shopparameters.Feature')]: + //Overwrite required_fields + $this->required_fields = [ + 'alias', + 'search', + ]; + $this->available_fields = [ + 'no' => ['label' => $this->trans('Ignore this column', [], 'Admin.Advparameters.Feature')], + 'id' => ['label' => $this->trans('ID', [], 'Admin.Global')], + 'alias' => ['label' => $this->trans('Alias', [], 'Admin.Shopparameters.Feature') . '*'], + 'search' => ['label' => $this->trans('Search', [], 'Admin.Shopparameters.Feature') . '*'], + 'active' => ['label' => $this->trans('Active', [], 'Admin.Global')], + ]; + self::$default_values = [ + 'active' => '1', + ]; + + break; + case $this->entities[$this->trans('Store contacts', [], 'Admin.Advparameters.Feature')]: + self::$validators['hours'] = ['AdminImportController', 'split']; + self::$validators['address1'] = ['AdminImportController', 'createMultiLangField']; + self::$validators['address2'] = ['AdminImportController', 'createMultiLangField']; + + $this->required_fields = [ + 'address1', + 'city', + 'country', + 'latitude', + 'longitude', + ]; + $this->available_fields = [ + 'no' => ['label' => $this->trans('Ignore this column', [], 'Admin.Advparameters.Feature')], + 'id' => ['label' => $this->trans('ID', [], 'Admin.Global')], + 'active' => ['label' => $this->trans('Active (0/1)', [], 'Admin.Advparameters.Feature')], + 'name' => ['label' => $this->trans('Name', [], 'Admin.Global')], + 'address1' => ['label' => $this->trans('Address', [], 'Admin.Global') . '*'], + 'address2' => ['label' => $this->trans('Address (2)', [], 'Admin.Advparameters.Feature')], + 'postcode' => ['label' => $this->trans('Zip/Postal code', [], 'Admin.Global')], + 'state' => ['label' => $this->trans('State', [], 'Admin.Global')], + 'city' => ['label' => $this->trans('City', [], 'Admin.Global') . '*'], + 'country' => ['label' => $this->trans('Country', [], 'Admin.Global') . '*'], + 'latitude' => ['label' => $this->trans('Latitude', [], 'Admin.Advparameters.Feature') . '*'], + 'longitude' => ['label' => $this->trans('Longitude', [], 'Admin.Advparameters.Feature') . '*'], + 'phone' => ['label' => $this->trans('Phone', [], 'Admin.Global')], + 'fax' => ['label' => $this->trans('Fax', [], 'Admin.Global')], + 'email' => ['label' => $this->trans('Email address', [], 'Admin.Global')], + 'note' => ['label' => $this->trans('Note', [], 'Admin.Advparameters.Feature')], + 'hours' => ['label' => $this->trans('Hours (x,y,z...)', [], 'Admin.Advparameters.Feature')], + 'image' => ['label' => $this->trans('Image URL', [], 'Admin.Advparameters.Feature')], + 'shop' => [ + 'label' => $this->trans('ID / Name of shop', [], 'Admin.Advparameters.Feature'), + 'help' => $this->trans('Ignore this field if you don\'t use the Multistore tool. If you leave this field empty, the default shop will be used.', [], 'Admin.Advparameters.Help'), + ], + ]; + self::$default_values = [ + 'active' => '1', + ]; + + break; + } + + // @since 1.5.0 + if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) { + switch ((int) Tools::getValue('entity')) { + case $this->entities[$this->trans('Supply Orders', [], 'Admin.Advparameters.Feature')]: + // required fields + $this->required_fields = [ + 'id_supplier', + 'id_warehouse', + 'reference', + 'date_delivery_expected', + ]; + // available fields + $this->available_fields = [ + 'no' => ['label' => $this->trans('Ignore this column', [], 'Admin.Advparameters.Feature')], + 'id' => ['label' => $this->trans('ID', [], 'Admin.Global')], + 'id_supplier' => ['label' => $this->trans('Supplier ID *', [], 'Admin.Advparameters.Feature')], + 'id_lang' => ['label' => $this->trans('Lang ID', [], 'Admin.Advparameters.Feature')], + 'id_warehouse' => ['label' => $this->trans('Warehouse ID *', [], 'Admin.Advparameters.Feature')], + 'id_currency' => ['label' => $this->trans('Currency ID *', [], 'Admin.Advparameters.Feature')], + 'reference' => ['label' => $this->trans('Supply Order Reference *', [], 'Admin.Advparameters.Feature')], + 'date_delivery_expected' => ['label' => $this->trans('Delivery Date (Y-M-D)*', [], 'Admin.Advparameters.Feature')], + 'discount_rate' => ['label' => $this->trans('Discount rate', [], 'Admin.Advparameters.Feature')], + 'is_template' => ['label' => $this->trans('Template', [], 'Admin.Advparameters.Feature')], + ]; + // default values + self::$default_values = [ + 'id_lang' => (int) Configuration::get('PS_LANG_DEFAULT'), + 'id_currency' => Currency::getDefaultCurrency()->id, + 'discount_rate' => '0', + 'is_template' => '0', + ]; + + break; + case $this->entities[$this->trans('Supply Order Details', [], 'Admin.Advparameters.Feature')]: + // required fields + $this->required_fields = [ + 'supply_order_reference', + 'id_product', + 'unit_price_te', + 'quantity_expected', + ]; + // available fields + $this->available_fields = [ + 'no' => ['label' => $this->trans('Ignore this column', [], 'Admin.Advparameters.Feature')], + 'supply_order_reference' => ['label' => $this->trans('Supply Order Reference *', [], 'Admin.Advparameters.Feature')], + 'id_product' => ['label' => $this->trans('Product ID *', [], 'Admin.Advparameters.Feature')], + 'id_product_attribute' => ['label' => $this->trans('Product Attribute ID', [], 'Admin.Advparameters.Feature')], + 'unit_price_te' => ['label' => $this->trans('Unit Price (tax excl.)*', [], 'Admin.Advparameters.Feature')], + 'quantity_expected' => ['label' => $this->trans('Quantity Expected *', [], 'Admin.Advparameters.Feature')], + 'discount_rate' => ['label' => $this->trans('Discount Rate', [], 'Admin.Advparameters.Feature')], + 'tax_rate' => ['label' => $this->trans('Tax Rate', [], 'Admin.Advparameters.Feature')], + ]; + // default values + self::$default_values = [ + 'discount_rate' => '0', + 'tax_rate' => '0', + ]; + + break; + } + } + + $this->separator = ($separator = Tools::substr((string) (trim(Tools::getValue('separator'))), 0, 1)) ? $separator : ';'; + $this->convert = false; + $this->multiple_value_separator = ($separator = Tools::substr((string) (trim(Tools::getValue('multiple_value_separator'))), 0, 1)) ? $separator : ','; + } + + public function setMedia($isNewTheme = false) + { + $bo_theme = ((Validate::isLoadedObject($this->context->employee) + && $this->context->employee->bo_theme) ? $this->context->employee->bo_theme : 'default'); + + if (!file_exists(_PS_BO_ALL_THEMES_DIR_ . $bo_theme . DIRECTORY_SEPARATOR + . 'template')) { + $bo_theme = 'default'; + } + + // We need to set parent media first, so that jQuery is loaded before the dependant plugins + parent::setMedia($isNewTheme); + + $this->addJs(__PS_BASE_URI__ . $this->admin_webpath . '/themes/' . $bo_theme . '/js/jquery.iframe-transport.js'); + $this->addJs(__PS_BASE_URI__ . $this->admin_webpath . '/themes/' . $bo_theme . '/js/jquery.fileupload.js'); + $this->addJs(__PS_BASE_URI__ . $this->admin_webpath . '/themes/' . $bo_theme . '/js/jquery.fileupload-process.js'); + $this->addJs(__PS_BASE_URI__ . $this->admin_webpath . '/themes/' . $bo_theme . '/js/jquery.fileupload-validate.js'); + $this->addJs(__PS_BASE_URI__ . 'js/vendor/spin.js'); + $this->addJs(__PS_BASE_URI__ . 'js/vendor/ladda.js'); + } + + public function renderForm() + { + // If import was executed - collect errors or success message + // and send them to the migrated controller. + if ($this->importExecuted) { + $session = $this->getSession(); + + if ($this->errors) { + foreach ($this->errors as $error) { + $session->getFlashBag()->add('error', $error); + } + } else { + foreach ($this->warnings as $warning) { + $session->getFlashBag()->add('warning', $warning); + } + + $session->getFlashBag()->add( + 'success', + $this->trans( + 'Your file has been successfully imported into your shop. Don\'t forget to re-build the products\' search index.', + [], + 'Admin.Advparameters.Notification' + ) + ); + } + } + + $request = $this->getSymfonyRequest(); + + if ($request && $request->isMethod(\Symfony\Component\HttpFoundation\Request::METHOD_GET)) { + // Import form is reworked in Symfony. + // If user tries to access legacy form directly, + // we redirect him to new form. + $symfonyImportForm = $this->context->link->getAdminLink('AdminImport'); + Tools::redirectAdmin($symfonyImportForm); + } + + if (!is_dir(AdminImportController::getPath())) { + return !($this->errors[] = $this->trans('The import directory doesn\'t exist. Please check your file path.', [], 'Admin.Advparameters.Notification')); + } + + if (!is_writable(AdminImportController::getPath())) { + $this->displayWarning($this->trans('The import directory must be writable (CHMOD 755 / 777).', [], 'Admin.Advparameters.Notification')); + } + + $files_to_import = scandir(AdminImportController::getPath(), SCANDIR_SORT_NONE); + uasort($files_to_import, ['AdminImportController', 'usortFiles']); + foreach ($files_to_import as $k => &$filename) { + //exclude . .. .svn and index.php and all hidden files + if (preg_match('/^\..*|index\.php/i', $filename) || is_dir(AdminImportController::getPath() . $filename)) { + unset($files_to_import[$k]); + } + } + unset($filename); + + $this->fields_form = ['']; + + $this->toolbar_scroll = false; + $this->toolbar_btn = []; + + // adds fancybox + $this->addJqueryPlugin(['fancybox']); + + $entity_selected = 0; + if (isset($this->entities[$this->trans(Tools::ucfirst(Tools::getValue('import_type')))])) { + $entity_selected = $this->entities[$this->trans(Tools::ucfirst(Tools::getValue('import_type')))]; + $this->context->cookie->entity_selected = (int) $entity_selected; + } elseif (isset($this->context->cookie->entity_selected)) { + $entity_selected = (int) $this->context->cookie->entity_selected; + } + + $csv_selected = ''; + if (isset($this->context->cookie->csv_selected) && + @filemtime(AdminImportController::getPath( + urldecode($this->context->cookie->csv_selected) + ))) { + $csv_selected = urldecode($this->context->cookie->csv_selected); + } else { + $this->context->cookie->csv_selected = $csv_selected; + } + + $id_lang_selected = ''; + if (isset($this->context->cookie->iso_lang_selected) && $this->context->cookie->iso_lang_selected) { + $id_lang_selected = (int) Language::getIdByIso(urldecode($this->context->cookie->iso_lang_selected)); + } + + $separator_selected = $this->separator; + if (isset($this->context->cookie->separator_selected) && $this->context->cookie->separator_selected) { + $separator_selected = urldecode($this->context->cookie->separator_selected); + } + + $multiple_value_separator_selected = $this->multiple_value_separator; + if (isset($this->context->cookie->multiple_value_separator_selected) && $this->context->cookie->multiple_value_separator_selected) { + $multiple_value_separator_selected = urldecode($this->context->cookie->multiple_value_separator_selected); + } + + //get post max size + $post_max_size = ini_get('post_max_size'); + $bytes = (int) trim($post_max_size); + $last = strtolower($post_max_size[strlen($post_max_size) - 1]); + + switch ($last) { + case 'g': + $bytes *= 1024; + // no break to fall-through + case 'm': + $bytes *= 1024; + // no break to fall-through + case 'k': + $bytes *= 1024; + } + + if (!isset($bytes) || $bytes == '') { + $bytes = 20971520; + } // 20Mb + + $this->tpl_form_vars = [ + 'post_max_size' => (int) $bytes, + 'module_confirmation' => Tools::isSubmit('import') && (isset($this->warnings) && !count($this->warnings)), + 'path_import' => AdminImportController::getPath(), + 'entities' => $this->entities, + 'entity_selected' => $entity_selected, + 'csv_selected' => $csv_selected, + 'separator_selected' => $separator_selected, + 'multiple_value_separator_selected' => $multiple_value_separator_selected, + 'files_to_import' => $files_to_import, + 'languages' => Language::getLanguages(false), + 'id_language' => ($id_lang_selected) ? $id_lang_selected : $this->context->language->id, + 'available_fields' => $this->getAvailableFields(), + 'truncateAuthorized' => (Shop::isFeatureActive() && $this->context->employee->isSuperAdmin()) || !Shop::isFeatureActive(), + 'PS_ADVANCED_STOCK_MANAGEMENT' => Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT'), + ]; + + return parent::renderForm(); + } + + public function ajaxProcessuploadCsv() + { + $filename_prefix = date('YmdHis') . '-'; + + if (isset($_FILES['file']) && !empty($_FILES['file']['error'])) { + switch ($_FILES['file']['error']) { + case UPLOAD_ERR_INI_SIZE: + $_FILES['file']['error'] = $this->trans('The uploaded file exceeds the upload_max_filesize directive in php.ini. If your server configuration allows it, you may add a directive in your .htaccess.', [], 'Admin.Advparameters.Notification'); + + break; + case UPLOAD_ERR_FORM_SIZE: + $_FILES['file']['error'] = $this->trans('The uploaded file exceeds the post_max_size directive in php.ini. If your server configuration allows it, you may add a directive in your .htaccess, for example:', [], 'Admin.Advparameters.Notification') + . '
+ php_value post_max_size 20M ' . + $this->trans('(click to open "Generators" page)', [], 'Admin.Advparameters.Notification') . ''; + + break; + + break; + case UPLOAD_ERR_PARTIAL: + $_FILES['file']['error'] = $this->trans('The uploaded file was only partially uploaded.', [], 'Admin.Advparameters.Notification'); + + break; + + break; + case UPLOAD_ERR_NO_FILE: + $_FILES['file']['error'] = $this->trans('No file was uploaded.', [], 'Admin.Advparameters.Notification'); + + break; + + break; + } + } elseif (!preg_match('#([^\.]*?)\.(csv|xls[xt]?|o[dt]s)$#is', $_FILES['file']['name'])) { + $_FILES['file']['error'] = $this->trans('The extension of your file should be .csv.', [], 'Admin.Advparameters.Notification'); + } elseif (!@filemtime($_FILES['file']['tmp_name']) || + !@move_uploaded_file($_FILES['file']['tmp_name'], AdminImportController::getPath() . $filename_prefix . str_replace("\0", '', $_FILES['file']['name']))) { + $_FILES['file']['error'] = $this->trans('An error occurred while uploading / copying the file.', [], 'Admin.Advparameters.Notification'); + } else { + @chmod(AdminImportController::getPath() . $filename_prefix . $_FILES['file']['name'], 0664); + $_FILES['file']['filename'] = $filename_prefix . str_replace('\0', '', $_FILES['file']['name']); + } + + die(json_encode($_FILES)); + } + + public function renderView() + { + $this->addJS(_PS_JS_DIR_ . 'admin/import.js'); + + $handle = $this->openCsvFile(); + $nb_column = $this->getNbrColumn($handle, $this->separator); + $nb_table = ceil($nb_column / MAX_COLUMNS); + + $res = []; + foreach ($this->required_fields as $elem) { + $res[] = '\'' . $elem . '\''; + } + + $data = []; + for ($i = 0; $i < $nb_table; ++$i) { + $data[$i] = $this->generateContentTable($i, $nb_column, $handle, $this->separator); + } + + $this->context->cookie->entity_selected = (int) Tools::getValue('entity'); + $this->context->cookie->iso_lang_selected = urlencode(Tools::getValue('iso_lang')); + $this->context->cookie->separator_selected = urlencode($this->separator); + $this->context->cookie->multiple_value_separator_selected = urlencode($this->multiple_value_separator); + $this->context->cookie->csv_selected = urlencode(Tools::getValue('csv')); + + $this->tpl_view_vars = [ + 'import_matchs' => Db::getInstance()->executeS('SELECT * FROM ' . _DB_PREFIX_ . 'import_match', true, false), + 'fields_value' => [ + 'csv' => Tools::getValue('csv'), + 'entity' => (int) Tools::getValue('entity'), + 'iso_lang' => Tools::getValue('iso_lang'), + 'truncate' => Tools::getValue('truncate'), + 'forceIDs' => Tools::getValue('forceIDs'), + 'regenerate' => Tools::getValue('regenerate'), + 'sendemail' => Tools::getValue('sendemail'), + 'match_ref' => Tools::getValue('match_ref'), + 'separator' => $this->separator, + 'multiple_value_separator' => $this->multiple_value_separator, + ], + 'nb_table' => $nb_table, + 'nb_column' => $nb_column, + 'res' => implode(',', $res), + 'max_columns' => MAX_COLUMNS, + 'no_pre_select' => ['price_tin', 'feature'], + 'available_fields' => $this->available_fields, + 'data' => $data, + ]; + + return parent::renderView(); + } + + public function initToolbar() + { + switch ($this->display) { + case 'import': + // Default cancel button - like old back link + $back = Tools::safeOutput(Tools::getValue('back', '')); + if (empty($back)) { + $back = self::$currentIndex . '&token=' . $this->token; + } + + $this->toolbar_btn['cancel'] = [ + 'href' => $back, + 'desc' => $this->trans('Cancel', [], 'Admin.Actions'), + ]; + // Default save button - action dynamically handled in javascript + $this->toolbar_btn['save-import'] = [ + 'href' => '#', + 'desc' => $this->trans('Import .CSV data', [], 'Admin.Advparameters.Feature'), + ]; + + break; + } + } + + protected function generateContentTable($current_table, $nb_column, $handle, $glue) + { + $html = ''; + // Header + for ($i = 0; $i < $nb_column; ++$i) { + if (MAX_COLUMNS * (int) $current_table <= $i && (int) $i < MAX_COLUMNS * ((int) $current_table + 1)) { + $html .= ''; + } + } + $html .= ''; + + AdminImportController::setLocale(); + for ($current_line = 0; $current_line < 10 && $line = fgetcsv($handle, MAX_LINE_SIZE, $glue); ++$current_line) { + /* UTF-8 conversion */ + if ($this->convert) { + $line = $this->utf8EncodeArray($line); + } + $html .= ''; + foreach ($line as $nb_c => $column) { + if ((MAX_COLUMNS * (int) $current_table <= $nb_c) && ((int) $nb_c < MAX_COLUMNS * ((int) $current_table + 1))) { + $html .= ''; + } + } + $html .= ''; + } + $html .= ''; + AdminImportController::rewindBomAware($handle); + + return $html; + } + + public function init() + { + parent::init(); + if (Tools::isSubmit('submitImportFile')) { + $this->display = 'import'; + } + } + + public function initContent() + { + if ($this->display == 'import') { + if (Tools::getValue('csv')) { + $this->content .= $this->renderView(); + } else { + $this->errors[] = $this->trans('To proceed, please upload a file first.', [], 'Admin.Advparameters.Notification'); + $this->content .= $this->renderForm(); + } + } else { + $this->content .= $this->renderForm(); + } + + $this->context->smarty->assign([ + 'content' => $this->content, + ]); + } + + protected static function rewindBomAware($handle) + { + // A rewind wrapper that skips BOM signature wrongly + if (!is_resource($handle)) { + return false; + } + rewind($handle); + if (($bom = fread($handle, 3)) != "\xEF\xBB\xBF") { + rewind($handle); + } + } + + protected static function getBoolean($field) + { + return (bool) $field; + } + + protected static function getPrice($field) + { + $field = ((float) str_replace(',', '.', $field)); + $field = ((float) str_replace('%', '', $field)); + + return $field; + } + + protected static function split($field) + { + if (empty($field)) { + return []; + } + + $separator = Tools::getValue('multiple_value_separator'); + if (null === $separator || trim($separator) == '') { + $separator = ','; + } + + $tab = ''; + $uniqid_path = false; + + // try data:// protocole. If failed, old school file on filesystem. + if (($fd = @fopen('data://text/plain;base64,' . base64_encode($field), 'rb')) === false) { + do { + $uniqid_path = _PS_UPLOAD_DIR_ . uniqid(); + } while (file_exists($uniqid_path)); + file_put_contents($uniqid_path, $field); + $fd = fopen($uniqid_path, 'rb'); + } + + if ($fd === false) { + return []; + } + + $tab = fgetcsv($fd, MAX_LINE_SIZE, $separator); + fclose($fd); + if ($uniqid_path !== false && file_exists($uniqid_path)) { + @unlink($uniqid_path); + } + + if (empty($tab) || (!is_array($tab))) { + return []; + } + + return $tab; + } + + protected static function createMultiLangField($field) + { + $res = []; + foreach (Language::getIDs(false) as $id_lang) { + $res[$id_lang] = $field; + } + + return $res; + } + + protected function getTypeValuesOptions($nb_c) + { + $i = 0; + $no_pre_select = ['price_tin', 'feature']; + + $options = ''; + foreach ($this->available_fields as $k => $field) { + $options .= '