diff --git a/Dockerfile b/Dockerfile
index 0377fc19..63bb1162 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -43,13 +43,28 @@ RUN cp /app/.env.development /app/.env && \
# 但是,我们仍然需要安装Node.js运行时本身(除非drpys项目是一个纯静态资源服务,不需要Node.js运行时)
RUN apk add --no-cache nodejs
+# 安装php8.3及其扩展
+RUN apk add --no-cache \
+ php83 \
+ php83-cli \
+ php83-curl \
+ php83-mbstring \
+ php83-xml \
+ php83-pdo \
+ php83-pdo_mysql \
+ php83-pdo_sqlite \
+ php83-openssl \
+ php83-sqlite3 \
+ php83-json
+RUN ln -sf /usr/bin/php83 /usr/bin/php
+
# 安装python3依赖
RUN apk add --no-cache python3 \
py3-pip \
py3-setuptools \
py3-wheel
-# 激活python3虚拟环境并安装依pip3赖
+# 激活python3虚拟环境并安装requirements依赖
RUN python3 -m venv /app/.venv && \
. /app/.venv/bin/activate && \
pip3 install -r /app/spider/py/base/requirements.txt
diff --git a/README.md b/README.md
index b13b50b5..558b3c0e 100644
--- a/README.md
+++ b/README.md
@@ -70,6 +70,10 @@ nodejs作为服务端的drpy实现。全面升级异步写法
## 更新记录
+### 20260131
+
+更新至V1.3.21
+
### 20260127
更新至V1.3.20
diff --git a/controllers/config.js b/controllers/config.js
index 7af9baec..3fa9b978 100644
--- a/controllers/config.js
+++ b/controllers/config.js
@@ -419,6 +419,11 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
filterable: 1, // 固定值
quickSearch: 1, // 固定值
};
+ if (baseName.includes('[画]')) {
+ ruleObject.类型 = '漫画'
+ } else if (baseName.includes('[书]')) {
+ ruleObject.类型 = '小说'
+ }
let ruleMeta = {...ruleObject};
const filePath = path.join(pyDir, file);
const header = await FileHeaderManager.readHeader(filePath);
@@ -496,9 +501,9 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
// 根据用户是否启用php源去生成对应配置
const enable_php = ENV.get('enable_php', '1');
console.log('isPhpAvailable:', isPhpAvailable);
- if (enable_php === '1' && isPhpAvailable) {
+ if ((enable_php === '1' && isPhpAvailable) || enable_php === '2') {
const php_files = readdirSync(phpDir);
- const api_type = 4;
+ const api_type = enable_php === '2' ? 3 : 4;
let php_valid_files = php_files.filter((file) => file.endsWith('.php') && !file.startsWith('_') && !['config.php', 'index.php', 'test_runner.php'].includes(file));
log(`开始生成php的T${api_type}配置,phpDir:${phpDir},源数量: ${php_valid_files.length}`);
@@ -506,16 +511,21 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
return {
func: async ({file, phpDir, requestHost, pwd, SitesMap}) => {
const baseName = path.basename(file, '.php');
- let api = `${requestHost}/api/${baseName}?do=php`;
+ let api = enable_php === '2' ? `${requestHost}/php/${file}` : `${requestHost}/api/${baseName}?do=php`;
let ext = '';
if (pwd) {
- api += `&pwd=${pwd}`;
+ api += enable_php === '2' ? `?pwd=${pwd}` : `&pwd=${pwd}`;
}
let ruleObject = {
searchable: 1,
filterable: 1,
quickSearch: 1,
};
+ if (baseName.includes('[画]')) {
+ ruleObject.类型 = '漫画'
+ } else if (baseName.includes('[书]')) {
+ ruleObject.类型 = '小说'
+ }
let ruleMeta = {...ruleObject};
const filePath = path.join(phpDir, file);
@@ -579,6 +589,11 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
filterable: 1, // 固定值
quickSearch: 1, // 固定值
};
+ if (baseName.includes('[画]')) {
+ ruleObject.类型 = '漫画'
+ } else if (baseName.includes('[书]')) {
+ ruleObject.类型 = '小说'
+ }
let ruleMeta = {...ruleObject};
const filePath = path.join(catDir, file);
const header = await FileHeaderManager.readHeader(filePath);
diff --git a/controllers/static.js b/controllers/static.js
index 18ccb24e..66493679 100644
--- a/controllers/static.js
+++ b/controllers/static.js
@@ -79,6 +79,19 @@ export default (fastify, options, done) => {
}
});
+ // 注册PHP脚本文件服务 - 用于存放PHP相关的脚本文件
+ fastify.register(fastifyStatic, {
+ root: options.phpDir, // PHP脚本根目录
+ prefix: '/php/', // URL访问前缀
+ decorateReply: false, // 禁用 sendFile 装饰器
+ setHeaders: (res, path) => {
+ // 为PHP文件设置正确的Content-Type,确保浏览器以纯文本形式显示
+ if (path.endsWith('.php')) {
+ res.setHeader('Content-Type', 'text/plain; charset=utf-8')
+ }
+ }
+ });
+
// 注册CAT相关文件服务 - 用于存放CAT视频源相关文件
fastify.register(fastifyStatic, {
root: options.catDir, // CAT文件根目录
diff --git a/docs/envdoc.md b/docs/envdoc.md
index 8d4ea81c..f50c7c8a 100644
--- a/docs/envdoc.md
+++ b/docs/envdoc.md
@@ -26,6 +26,7 @@
| VIRTUAL_ENV | 本地python虚拟环境路径 | 同上,差别在于虚拟环境会自动拼scripts路径下的python.exe,跟真实环境二选一 |
| daemonMode | 守护进程版本 | 0: 旗舰版 1:轻量版 |
| DS_REQ_LIB | ds/cat 默认req实现 | 0:fetch 1:axios (已知模式1为前面版本默认功能,但是后面发现某些场景无法获取源码,新写了模式0,不保证完全兼容) |
+| PHP_PATH | 本地PHP可执行文件路径 | php (全局) 或 /usr/bin/php8.3 (指定路径) |
| CLIPBOARD_MAX_SIZE | 单次文本传输最大体积 默认100KB | 102400 |
| CLIPBOARD_SECURITY_CODE | 剪切板接口请求头安全码 | drpys |
| CLIPBOARD_ALLOWED_CHARSET | 允许字符集,默认utf-8 | utf-8 |
@@ -35,3 +36,65 @@
| MAX_TEXT_SIZE | 设置最大文本大小(剪切板插件) | 0.1 * 1024 * 1024 |
| MAX_IMAGE_SIZE | 设置最大图片大小(图片插件) | 0.5 * 1024 * 1024 |
+# 用户自定义配置 (config/env.json)
+
+该文件位于 `config/env.json`,存储用户自定义的运行时配置。
+
+| 参数键 | 参数说明 | 备注 |
+| :--- | :--- | :--- |
+| enable_php | 是否开启 PHP 源支持 | 0:关闭 1:开启(本地执行T4,需环境) 2:开启(远程加载T3,免环境) |
+| api_pwd | 全局接口访问密码 | 访问敏感接口或文件时需要 |
+| thread | 爬虫并发数 | 建议设置在 4-8 之间 |
+| quark_cookie | 夸克网盘 Cookie | 观看夸克网盘资源需要 |
+| uc_cookie | UC 网盘 Cookie | 观看 UC 网盘资源需要 |
+| ali_token | 阿里云盘 Token | 观看阿里云盘资源需要 |
+| deepseek_apiKey | DeepSeek API Key | AI 搜索/对话功能需要 |
+| kimi_apiKey | Kimi API Key | AI 搜索/对话功能需要 |
+| bili_cookie | Bilibili Cookie | B站相关资源需要 |
+| play_proxy_mode | 播放代理模式 | 0:直接播放 1:代理播放 |
+
+## 环境搭建指南
+
+### 1. PHP 环境搭建 (推荐)
+
+本项目支持 PHP 爬虫源(`spider/php/*.php`),需要本地安装 PHP 环境。
+
+#### Linux (Ubuntu/Debian)
+
+推荐使用 PPA 安装 PHP 8.3+:
+
+```bash
+# 1. 添加 PPA 源
+sudo apt install software-properties-common -y
+sudo add-apt-repository ppa:ondrej/php -y
+sudo apt update
+
+# 2. 安装 PHP 8.3 及常用扩展 (drpy 爬虫需要 curl, mbstring, xml, mysql 等)
+sudo apt install php8.3-cli php8.3-curl php8.3-mbstring php8.3-xml php8.3-mysql -y
+
+# 3. 验证安装
+php -v
+```
+
+#### Windows
+
+1. 下载 PHP 8.3+ NTS 版本 (推荐)。
+2. 解压到 `C:\php` 等目录。
+3. 将解压目录添加到系统 `Path` 环境变量中。
+4. 修改 `php.ini`,开启 `extension=curl`, `mbstring`, `openssl` 等扩展。
+
+### 2. 7-Zip 工具安装 (可选)
+
+部分功能可能依赖 7z 进行解压操作。
+
+#### Linux (Ubuntu/Debian)
+
+```bash
+sudo apt update
+sudo apt install p7zip-full -y
+```
+
+验证安装:
+```bash
+7z
+```
diff --git a/docs/updateRecord.md b/docs/updateRecord.md
index d0dc5e58..6fa7355e 100644
--- a/docs/updateRecord.md
+++ b/docs/updateRecord.md
@@ -1,5 +1,14 @@
# drpyS更新记录
+### 20260131
+
+更新至V1.3.21
+
+1. 更新一点文档和文件名称
+2. 修复番茄动漫ds源在皮卡丘壳子上无法使用问题(
+ BUG羊的壳子tid为链接时处理逻辑一团乱,http链接被篡改成https就算了,链接含有{{page}}变量竟然被篡改成1了)
+3. 更新文档、生成配置类型,使php、py源也更兼容皮卡丘的漫画小说
+
### 20260127
更新至V1.3.20
diff --git a/libs/php.js b/libs/php.js
index a63d5f9a..4e582268 100644
--- a/libs/php.js
+++ b/libs/php.js
@@ -5,6 +5,7 @@ import {execFile} from 'child_process';
import {promisify} from 'util';
import {getSitesMap} from "../utils/sites-map.js";
import {computeHash, deepCopy, getNowTime, urljoin} from "../utils/utils.js";
+import {prepareBinary} from "../utils/binHelper.js";
import {md5} from "../libs_drpy/crypto-util.js";
import {fastify} from "../controllers/fastlogger.js";
// import dotenv from 'dotenv';
@@ -51,7 +52,14 @@ function json2Object(json) {
// Execute PHP bridge
const callPhpMethod = async (filePath, methodName, env, ...args) => {
- const phpPath = process.env.PHP_PATH || 'php';
+ let phpPath = process.env.PHP_PATH || 'php';
+
+ const validPath = prepareBinary(phpPath);
+ if (!validPath) {
+ throw new Error(`PHP executable not found or invalid: ${phpPath}`);
+ }
+ phpPath = validPath;
+
const phpMethodName = methodMapping[methodName] || methodName;
const cliArgs = [
diff --git a/package.json b/package.json
index f5397a43..0d84c6ed 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "drpy-node",
- "version": "1.3.20",
+ "version": "1.3.21",
"main": "index.js",
"type": "module",
"scripts": {
diff --git a/public/index.html b/public/index.html
index 015a5b24..8e5f11e2 100644
--- a/public/index.html
+++ b/public/index.html
@@ -71,6 +71,8 @@
免费壳子推荐
皮卡丘
更新记录
+20260131
+更新至V1.3.21
20260127
更新至V1.3.20
20260125
diff --git "a/spider/catvod/\350\223\235\350\216\223\350\201\232\345\220\210\347\237\255\345\211\247[B].js" "b/spider/catvod/\350\223\235\350\216\223\350\201\232\345\220\210\347\237\255\345\211\247[B].js"
index a699e4e1..2b940d50 100644
--- "a/spider/catvod/\350\223\235\350\216\223\350\201\232\345\220\210\347\237\255\345\211\247[B].js"
+++ "b/spider/catvod/\350\223\235\350\216\223\350\201\232\345\220\210\347\237\255\345\211\247[B].js"
@@ -8,4 +8,4 @@
})
*/
-22DAA16367B92CC030386164898346DD1C0609E5E4216F8DBCAECCF35EF70F55C25CE8F59EEED9164FDD8C3D453708E101E456346123448D658C94C0869AB7674CE7EFBD6258F1FEC412F8941F11017D143F2C4CF0FCBC32A3002C132208834E3C52CBACA4AED32A44BD9B515936CC0394704099B511F18BF3F35BCDBDD1A76E49A45DD5DA51ADB54014B3284BA7A5BB9A69A60E35966EE12ACFCD5D4AC4EC96CFB44F8B15BEA6CEC221FF7B90DA9FC027927A6505257C3E562934F81FCF81CF6ED36E981BE2A608F5B01B6138500D16C720B560EAD4D223A280E54FCE22838AD070DD8219D1D5FC6D6AD204C5E584B49F419C954E944CD189340FC87B01EE424399AA4ED45AAF0B35E10D9B36BA9B493951BEC257025998ACC0C8115CCED73BFCBDC1FFD3DFD6DAFB1A065DDF8B7CCED61C73FFCC02076BA49FF37719AC60E60F11A75716A0BD6AB221A413F0E80A7A8F58C670B5ADFA7A914CB105EB8364CBF5763D2A8BF14072D906D715FC779F36987910C29832E56A9573762ACB105EFEF5119892059422CD79300EF60408F05A1DB8AD64E6B53C76AB9A82BA2DB9F266EE5ED7C00401B63AF4709C71C16D11E0E451D79F96CDC0F5A9379988B6413C9F6B41A0343DA3869AE33A69312BE6DF05CD5BDA8783AE53E3843A45A25A4A4C2FFAFA48285F419EA9909B3B43A89C53CC5F5F58EF747023111CBA085BF16F8C48A46FDCCF1324F2160C433AC7092ED6966E7B84D49C2809F015A45A2B2F8326C0066A247F9A630D74BAEB068918CF7FA09EEA004412A9314D6078C4157C566523EFFC85678C063A36FDAA9A189FAACB6CCDA183D4DE30F4094CEF3CC9613D5596017206BCCD7D9EFFB34203B7C3E60F33E96D5A288E494E030C79E81CD6698C494AEE621467FCC615DF4B4CB587BC4BD594EA26668C06FEB662676C5110D7A14D90F8D1B0921964E6F48BC738B160F3AE0658CB9487DDC904BBC7CD80451975FDCBBBF5CB59F7DFBF034F8B738375A99D1416696BEAB17C924E5D2D37B0FE5C116FABDACB5C99F245C867A96D21792FF7C5622CCC88C2EA0BE56B3DF069731B22C9116DA6A9D75AA8CA50E9555FE32EC237A48A5364F3E09E5D63961EEBF795139CAD4D79810EEA914B014D0A05E4D9CAF883EF7D94E2432FAA0B657FF9B71049D7EA0959096B941DC18792A1746ECBF91F5837728DD7DF365E7D168FA39C61DC65F7351A35D7172E55F10F03197686ED6AF14D8C5AEB941A35DAD514D58D84C3D920DA793D5CFEE71C25E53EC21C1936FCE766119A6492CBB9B67925B9DB30B75E2391D8DF684AD5DF08B64F3DDFC31FEAAF35B5CA72BB73BCA95CA621C9D0C03E877B115EF2B3988078E83AF83D2AC691092C7AAF8D45557CF4003D4FA67A81C880EBCD8318B37C5219808335CB7F8664E176769B1BACCAB58E0E1C8B2F7B06D339FB38718653D352F6A5B2FBEDF758F2AD54B2548DE7A343B23B8E7B437C1AE212CF0DE693DD84ECB9D922B756FCBF8F67C143A90671A7A0DFE8A08063F24539FCD1579DAAC2A6DF8BA36B6DC901FF6AAA05763A10334ADF0381DF233A56FD68CE17F5B3279C1F5CAB7CB1D8FB5C490DD23B77D895061426287D96106858325AA4E666605D6A1488781190781DE82AEF9EFD0700D189757D64634844EE0EB21F152401DA3527A75B29519B9115B9A5CA3F2C181551079205A874877E61BCF897C2444DAE41DDC644D8F2635211C6A1851AF13DAFDE63DD929ED87434B8C2E3BC0AF17040ABC43EEE2F7170680AD7194194EA04AA55905F746778DB544F9F06013E3276BF535FE4255383F31BDE7F5F9CC241A7EE71CC839F57C6A8356B89BEF0C43975A1381FAA09D7CB1C0ACC85FDFACE418B994FA2A86E0F4B55E17E40830FF0236F140455E44063D126F164DAEC12BA124D2D212D52311103353E5D7E6BFCA89923F294673BD43CD5DE58C051BE48F7CBB49687F675A4EE1A407738713130868401CF272324A3675A1DDE2960FFDA9065B1E5479E0B62B5E36C8440FE50C2AAF5EDF7FE1001869A9A93763B9B805B2628E6759A1DBD1A68465709D52B808701E5ACB87E68AE661BE8B3CED65D6D57D23F3680E21C2A3766D0A13AEE06E042C973A04A1D13AB4E320AE59DBDCCE0A5DE7B3E6B6D70DCA38910B3267F21CFC6D5457B9C119E1AEA4CE2DEEBDFBBAB3731FFF612426DF576D4A82AC5B2C043346B152E1632635C708D6BCD21902666EA42CDF002D526D91D37576197FDE6721211C47EED3F1D753219E8730EF4299D321AEBA5115C4C99DD532B34044CC1C2E65D4421BB4F28B9A10A0FB6B1D23B1C1867B698C9DBEE0600FB29AEE4D5661D128BA572B285AD7E646F689D93CC5C1F41DF28CA28A402BA3036745A6FE8C783E4E5104CBFCA723F28FE4377A5C9398592BE67BB2F5E8203C76DE5197B39B1477DF3FE167E667B77D6A965F98B2CB6AA37C8AE5707AA27B3D6367277EF6D4F90DF1E60929189CBD8215AB3510D1A62935D672D7DFC2BA16E204B77BD2E8BF34FFD6AB21A87D147349F58BD8F9245B8B396E0DFCF23DB0DDEE7A32DFAEA6E1ECF18DDC32E868E1C2A54CABCFE97D08CAC8856F9353A21E3E840AF5DD56450F474F1AFFA6A4AA5538B903C2B696618BEBD087612F0800B22A721993A7285F462F30CA340A093A37E70F49FCA876A3096C23A2E08DB4619B5C48DB7F3FEAC8DEBD60642424511DC26DCE6B749FFF58C3905D0E095768771EF820E0944BCD2DE87F551E388DAE0CC5E81653CC9F82411E6B84B358B6F2FCF3933A356AEB2E799163E163C6A7D79FBAD027291C77D630A652270F10ED4DC9F7F6AF04FD21FC7257C6079DF692170E0065674323313911BE264C40A0070BDD9E631C5893070134DAD54D53C9A47694B3F731AD6A6D45D9661A9A5A0C89614352199E3E38911D7649D40ADC731DBF8B100644BB3D836CD15A534CE876D98E92810E0A22FC410F6CB55D224689E2C7FC6C6A357D2143105CAD937916EBBE2B2F683237566EECE0CA25A2FC51283E43C0DE5A9875BD13C94E3EE9FF71B77E5A410CECF084565F535DDAC9D1023BAF6F43D3850FC17E916B277477FA144978694FF61852C77805C28D29C8A19AF52CF3C0666C324AF9D77034C1FD1581179C063C0B9AC1D72A038F4B85214B2226ADF8702B940EC21F6F5C25A432E317BEFBDCBD735D60F8DBC1AB833B969E351C113114E5AEC7982BAC7F4B095C77EEBE42FBE837426409DAC0EA79589CB07B0437AEDF524D14BAF59A3DCBC8D4BF2B1C4F45C6F1B9D8C76427D1E242DF18A4AE933A8A3A4CED486BD0EA9277E093D36463C61E0DDE2CF5BA7E103689FBF7184F547BECD5AD25C635FA921FAC0ACC9903B448812BBDF67DCE05C28D29C8A19AF52CF3C0666C324AF9EDA4202C51A8100878F0259D6E78D637545421AF73DF114174D1B0CDAA710C0D4671D9936E9CD93307F8F879CB2CF3C50A1A7BC177FD4D38ADF97ACB09576F2BD91EF1D4A4244F665BD0969D372749A305C28D29C8A19AF52CF3C0666C324AF923815C408A0E8F777CD2583FE2062F438A7682D6690478D1BED2315E3F00E866C1AB833B969E351C113114E5AEC7982BF0730EF2A4111EA27B25DAD22F3FB483820B695209A37DDFC70561A7EF86EDD22EF31B834BF01F50873B6913E72AB018D5093F092F2C2BCD802D2B91EF5E179416255AE46B97E9145579367068007662EEF1ACFB3BFB7B5E448FFB764115BE3141FF35528F85373C71167B13AD82167895F6029FE858CD17B9B43029811056962059891A700283696F8175F1D805F14855A406C54CF4749D4E2BD5C00F782BB870946FBAFE98A4F2DA1EC3F4F1016FD105C28D29C8A19AF52CF3C0666C324AF902FD756803F2B47F0C54594198D273D6E2BEB8A2CCBD33215C84EDC6A48412AD9219952C8FBAE7D669357BC7B422785F41FF35528F85373C71167B13AD821678DE1AEDC5C49478E0D029291F3A98D315825CBEC7A61D64012300CD34FE07C5CA54BF1E91E1D1C6310035B73DA20D0D9F05C28D29C8A19AF52CF3C0666C324AF9C11E23C1D743CBD139E1E1F0459D4E4A0B58B7D69D72AA79325628E1B31F394F05C28D29C8A19AF52CF3C0666C324AF9B9EE558BCD2C3970430837EC85D734B87F95E78BF6A283BA9988B521A47A41BDD9C0EC00939DEE2574F7875B3B098A408873C10ECE16421EB807A62B13FCAE375BB74D628AECA3BD9C19C2A8D50946E805C28D29C8A19AF52CF3C0666C324AF9FD3CE85280A2D758C01B7D8CE889B8C24991041F9FEAAC90A271E9DB4D0BED2958E3028B6D30B2014121B7897A48A428E06B5A60EDFE80A70E8B1222310C7CFC1A639AE85B45F3836BB04BAB585541EBA80FC5AC5FB7FA13C70EB0D1CA40190FB5F8FE78C8D283EE9CF7E26ED287E1B27E90D85B3C77C0FCC49FE301727799C5E626F6BD4395121CEE9D11BD9160BF2201EA2D833D9F9150418E77D3A3B4F860505443C633C4EE6C4CBF3709FB8FCC64F400E3A9B3F97F282FB88C60808D00293C1F733615FDAAA5C180D12C073A8412BBD380BB60DC4773AC037BBEB78103C8121F28FE4C8E17F6C6F4B19A7DC5B9B5A189FAACB6CCDA183D4DE30F4094CEF3587A484338B82B7DD143C594401E4D0DF7FD608DB622A03F3C0EF94269EB2C7E93CB72F3764EA83AFEB2E062C34D2354BA63582E8187F1487390D031EAF2C8EBE6415815F5ECD7C4E72FBE4228B3E12F635136D3BCCA82845D49649510BB90BA43A333792275C86A0372ED608A6E22882FBCA2C83A2F7ABD0DAA21D443EE0BCFD4722C78C61A06445CCA2807FF3130A291AE10029A084CFE86851602EBFD2D1BE17240295A7E69C1DDA7BB48462DC9F3B19066037BA4316A1FF10788AB670D604FA812C6110E0C68D4B6BBA93A6A95D7F098755DBB6CF7E2CB170A3F6B271C5515514FB01789F488B28BEB235BE05CDA8D83D971DB00CF7A845EE904833D261E41FF35528F85373C71167B13AD8216787D57B4BA5CBB54BC268E0E20ABE595AE56F2387DA935EB666F3D77C59FA73CBBEA676F58A843E809AD48AC102EE1DB12A206898ED94D69EF0D868FDF7355E993862D80DC04D43382510D88042A0555CA259A39CAF911836214412D0C49A0E5AAD65666C9BC11F34999A4BA5902BF243C56F2387DA935EB666F3D77C59FA73CBB826FCD5378B557CBC1EBF7C22EB8631896C695C97340A74AB3740075489901A94722E419647BBD294C83945AE9EBB1FF5501AF1AC28CA9F579D326D8BE740DFB686F6F8EC98D1E5B61EC1123698B323DC0EA79589CB07B0437AEDF524D14BAF5545C9BCFF3DB20040F337F1F3906CD73CB78210273B70CC470466232637EE18E5E6AAE9AD4359D929AC271390946C40530B78BC343E2FFEE8A800D6F977C4056D2D37E4D6435E6A379CC5D16789CEC38097DC23581CDFA72EA11715CF62460D2D0DD57862A8897B5BA6D4F865FF0C7CE155CB1B0940975ED691FF19D416975AA26BD2A8FAF6D3BF47B4A005CD37F9C67A5E3D42D6F12CEE01091123478F0FED450BA1A701C48D9DF1D2C7088230F6BE5C8A4C1D328CF4CAF9B1B4208F8D295ECB44E688B0A2A646B2A1B815602DBD3EFFADE9A221E638E8515F390BD45EF8EFC0CB5D4C724E34BE62176CBAD3B55BAE0C40EC1CEFB0AEDF4F020CEFFF037BBAF92FEE5FDA909FB5F3351B903D965D6A45D9816F1139D03D9B9B53B69FAD5A31FDDC0666F1C85261F319EEFCA4D133CAFBFE328F8D948E781D417768D73F4EF360A4E5231E1C0881E56399787A22C2F68E27C6E3512E8D648B6D80ED3DB9166F41459DB9CB42BB93B94E626E3D2265C43E37FA3BB1FB8FEC735906EE68269E6F62D80AC7470E0B37B370AEBB2D49A4873E985EE3FECCCB41DBB671215B494FF18FE4EAA26A773012EF68EE008312BF91670BF13F16911D60DEE8AD0322286C713CFBE728A7FADC8C9381B8538018D173BE01CCA64D3E40645572AFF0F752AAF9F9659382845A813E9D4B9BFDA2D4B16D2E24332F42FCE55C031F02ECFFAC89B6AA504B445AD91C0709DC904A1530B2D7375226D33C653C73A18C7D752BA298969EBCD743654E9CC95C0A937E256F24D36148E9D70FA86C2C01CED746800DB5CA1B54A6F8D5892E1C270732993632595921DE2663DC0A230CCC13B4DE3312F941857E28E162653A9970AE066AF1F596122DBBDBFB30819FE0EC4A2C71E74CF86B3AE9F11A4162F96AEC0BF88D79A2A2E9D049C1F290EE19169E42E461C32F3D48DE379AF02366B794D540CEF1A6E3896492BAEA61CB5032811D9D0DD1FC788D2056093F3E14D5B1CD6CA96C7543F8D80E19E4C467306743F21A7D7D2C18DFC2DDEDE608F9E1DB7C4AC7CD6FE94A3C64C24E17240295A7E69C1DDA7BB48462DC9F3B19066037BA4316A1FF10788AB670D60C3DF3306F19F62A69D88778E3EEB1A55C83404C7B4F1157290630B5A5A6AD34BBE48F26AE5115FC5842736DC21532D402EEA945DE13F572031A713FEE8E3D47CAA36F7B05174FF2D631FFAAED61D4E56A4BB744185C2F984E76570E7DAD0C237F30B15B68A590B5BC9697A257A7F7EA1006E6D266E3754859E3795529DF707AF3617E0A47399AE2DB893FF654E1253277FC916C5FFAB6111CDBFEE42BE653FAB9B78EDBA81BD1F48A9203788E42D1BEB781B84292D84455D1D17611E6D910C1389EED1588D9EAEA076ED82F2151714C92D7C04F94AC6FC18146CA1D3F994CC7AB79DA78175FB9DADE105FFB7AB95A2054286EF4C678568C78461AB5D51B4417F787C8DFB3ABC1E8A3CF0AD326DCC7AB3EE029463C9FBC16EFDD9017813901A39ECAC0C74E271B71E42660BF576A264245B3F4377D43C9098D14931988DD6B6823362A524DA3F8A0D6AA52D7D1558FB31536876B8E507E34E01F7AC9BA1743A8DCB91E2D46D1886067EDACE62F948771B226DA87F5FC43CEA2E8290108C3B5BBF64B83285E79295D88A1F304A380BAC17300FB2FD64E1FE0CE92BE4CB18715E9FC0EEB2EFFDA222433188E99B05CEFD251F92CBDF22E35C7EDF719ED0D6BE20D6C0EA79589CB07B0437AEDF524D14BAF5CE226292D40B24F01CB97C7712832F9729F02DEBA2C6FC6C0A226DD6D6CAFE160682713ADBB2E18FE4F8906C6F8B768A88B58AA4259142AED2333AE73650E773BEC40015B91171B1B4BF9B8C68686C647BDFC2B4AA6596AF36D882FC3464D6DD6FEB6ADD5BF224ACCAF68D2E341BE4F041FF35528F85373C71167B13AD821678839FA87F83B69C43DFCE83C4CAF2363519BE2624D4E5842393EFF18C8037383A84E2231B6D8F27B045B05DCF0EB63ABE8BF5EBFA3D338B22261D067A93A3788DFAA3EA2E7E0AEFDABF5688CCD0CCD0CD91A99CC73FE6AC204988E24A3B04833083D8AAFCAE69DB47846B1CE94908CDC97938DB809BD048C42A7C658F79A1934683252CCC8BCC788E65B6D4193D146DE58C0B34DFF1C76B4FE156845B0B813FE2D236FA51F75C464985542B9ACBE0028DF379158CA32475A832BD2CCDF52C3062B373A8F1886BC03AB1A094DD4B6F27E7963D71503922CE66A690501DEE9BD3367CC60FD3E30978829A3984400CE1AE34EEF8CD9EC26A0156E18A178835C6832154195F1472B7F22741067B06F04977491B80CB2C5860F0E378BF71A9AE4B4A0E740FD06E960762AAE6D40029E471A4079837A27733314C53A43FF2D09C81CEAFE05B9C8C503F854AC91A08D2E69F30945FE450867D1838A593A118163576A28303DF9B1B530BE2CB3B00F56C38F4B62E3C3289C6AB4C1BDFE060318CC46CFDB5CACAFF5619000C9FDD8922D513366BEBBA2A4CD70DE94582FE2FCF63EDB67AFB3289F1ADE014A195CDEB1E8567B2B68FA7CF291DE2B654DA293C98F6153E68037FC5071BF0638FAF5E4F840ABB09884238973DB688602C293D9F34D93996FBD26757C352E58DB8BDD9611AF68206B58C6F051C8705C63A7D84DB01D67CBCAF2475464A6A2627F7CC9FD0DA332C5B3E94E22497DC844432857CC5897F887585AD4F31FE8589766FF04B0727331E6083B806358790AE1F73B7047E5A7841A20693B384885CC142AD514C525256BE613C81922C38649DB4D8549E36A1480A56098BB86BAF4D2DBAF5B822624B0F8971D96C9605176997D8E5BBF1A50B35002A949FEAD7DDA87F829357FAA35839D66F45BBF9D8E8037F7EC7CEFC5A18D3ACFCFA94473A78DE0BF2001A7DA4183F150AD0D83C818FF5209EA012ABB739F60DB45A475962260BDD0B104C571FF651B3C1F11A8A08063F24539FCD1579DAAC2A6DF8BA36B6DC901FF6AAA05763A10334ADF0385E56C949B1B206ABFBF60262FAB9102B05C28D29C8A19AF52CF3C0666C324AF9B1F2A113F06D7604992431034279DAF7753FA6773CFE21D73B9E92A71EF550CC87AB3605FE7814973B70D8CE3CAC6F6EE863FB281EDC96577EBF427359A2D830E6ADFD29D0D88B3A35000DCEC23F09E37F6A7AFBDA97DD8330204EBAAF12D7171A9F69E8FD6C892880BF6B4DD8ECAE16B5A5D8A7A199200C96C845E979332EB08CC1FA5E47BB51E37B997167ADB099CFA2F5D29DB3E9EB3B5108F077A9FB201746569D8739F572E393B2540CE575EDC8B4C6F63370EDF14C2358EA5C4B093D0E0772CECA542DF9C788BA436D257E27531715DD6A51AF22FAF0106700C6AA25B7C7F70B246C1A0B1F1DD0E52FAA3F6CB399BA5EB3C2E2ECB93839359980000E4774E93436950CEB9A63D50D9456D2C7ABB517904BAB1AC82DFC3DF59A368F326C206EA092B7B0082446391CBD569B27B2045D8CB3A893F585DD6C388D8F42FA956D0D58184FA0C49524FB3FB5DE394EE84D8C8E43111C101B5AD062C1B32E4C64A7CF291DE2B654DA293C98F6153E68036872A5B756D2C33E7C7648B0968A4B75C0EA79589CB07B0437AEDF524D14BAF52E4E8E86F5EEA7E42585F3B0454043EE82DB3B526DA6C9086CA46442AA138D33B5134B996B001789553E8884B19AA1B002E84A5AA060C9F3067FDA1C4F7BDCC0393B19646FC6FDF78F92E9C9A297E196BD85CABE3173FCA65B31925C0C243FA2C1AB833B969E351C113114E5AEC7982B89F742F9DDFFF15846D8E44E4648BED04F14C6DC450E8D9B88147E78BFD30F800C9340A2D88138AAB98F9A40EFC416D19B4AB5C66E214C23A74331E3FB2D2F2856ABD0D8FFDFAEC9992B63BACFA0748BC804FA53CB9BE97C9D3B9359A159A1EED0E4DBEAB5409E58E29F1DD3F317CBE28A7615C7DA896DC451E665826D72BAA27532D536869DF2F45B6A1B93A7CDBDA65E2F214AF4C1A8C9B25AC39F4E2F4853E892E7A4F0D809064795567CB2E5DBCCB3FB0DCC82525FB3776CDB6132A2EC199AA70D2C558AAE430C3EA1DFF8F09BEE865E5ABF07563C85686B2A0C1A8339620E729CDCDE0A844B547C703BE49E58A0154E00664F661D9C3612B81C429F813E76A8A0486D27CC7EAC0E6946979E9402B2B073F873FA0C7BA888BA197636D87C4C7D4741FD68FAD1CD265EE3E89F32C0DB015701A09068F04BD0505C58EE239217A33414E568A610D2D4AC946BD4AEB5453F958F832284D359AAFF3D6F39C788E78D4A9664A0F4D79F5AFEC0610ADA27E26E348FF3A480F16C1BFB74B3C41F825075C8FD9A15796E0033893A586582CE11A6392FF8581A3E5C6D7EF6E9DB08833A043AC0179AECC2505242C84DAAA4AB5C7B4CFAC3E17EC0FBC234E07824AA7333CE7988DE6CB3EDD47CF06FBD9D4264A57D5E4F0CEE8E0747EDB5D18463E1FDBDA91C1D938FBD135B898D1AA3B7E49A2D6BEA6D0DEA07BD614AB017B023798C560F6335316D580E3F5CD95610A0C0E40256D779B3761E4C2DB2422CEAD6B6D7F068BC077CF2E7EF42C6DE30BBE493903BEAE8D8020FCDA5ECAFFB23D956FEEDA8F90F22A17D68706FFE5FFA975865A596D21792FF7C5622CCC88C2EA0BE56B3DF069731B22C9116DA6A9D75AA8CA50EA84F41E8DBC5757D262C8B3FD0F741CEEFB3CD3FF9E0F1B2834C91ED3D15A5B9DAAE04502130C16A67018A6248B37DE47ED0282E1C7133C4D2E626F27A2827A93CBCE1165DD40EF6A5A26E373599D8DFE2C3F775CA41A279D23CBDE07D697DD52462D2C1878FFF629CFBE70051D6846C78ADF01716BB691DEB014361FA9DC313301BE423F410A9BB92455EA8B20485147D2A3C365F51B1186419FD93D6F533A2474B12B829320C5F150A0A9078D9FACEA7CF291DE2B654DA293C98F6153E680375ACCAAE2BD4315F4C6FCE216D4BD6FA8AE38F0A188A6AB7A85CA96A8C17DBB2D97006C47FF07C9EE493BCDFE9D6819F8269696B470AE1CF022E5FFF6241FB55C0EA79589CB07B0437AEDF524D14BAF5F22E864B47782819500AC78EC26597135BB583190F189109338A27D0055791A0DEA5D8261F9A9C26C7DF1F7C02D3B8DC03D4FA67A81C880EBCD8318B37C52198D048BD45A8752310D42229E002EAF0F5C0EA12CC647B10403890D06BB4B47699E3964AD473FE9A0D5C20EE43F6C5C96C10A160DD7C97BB3701FBE3DA9EEFFCF0A510A7FF543A110CADECF6AECF5226134F2807AB2607799395CB4CDB670A3F1F487AF2CE4CA3F0B8EA4D3CFCD65729436C1F24A4344C7D0C1713C0B5529322880AEC64FFB4E3A8B1BD1EA28448571D7F603D0AC30A62910F8005BCD5BC29389DFF962925A666C3DD3D5A05206C251693A6B34BAFAFAAFE8A0BF96FEF695480E9AA332F6ED7F5D0EFB6016F0B593F0EDA2B066FC8AE05E37AB549335A999A26A6976588E3531355AF21A831E9DC31D12805C28D29C8A19AF52CF3C0666C324AF9F6A1CF5650D72BC9A883E7ECD3CB2DF771FD39AF6231B388F0F85966FB60679641FF35528F85373C71167B13AD8216781C3A081649A1E1D792766F30AABEC2BB335EE6A610585CF074CCD43F7808EB0304BD91D2E08EEF33345845CC663BDEDE97159CCC8FC5BDFDE3CA339EA2BEE2850457595E9BA24D7ED422735137F568BCE1B7E6F16D0F94AFB195AD43F1951920001609DBCAB43F4DB6CBB10CDE443018EE611A2BC475BF8AF96684AAB99D24E03E8209EA0E064526FBE616C8C527390E48C81DC2354C7DDE3CD9673EBE57089706E70D3B1EA3F642D83A4FB1A5DC356801B86DC75C24EE218EB2D3ABDF645DDAA1424777EE01052B997ED1D38F2A55FC269E565E8F2FDB674E3F508795584BC599BA5EB3C2E2ECB93839359980000E4774E93436950CEB9A63D50D9456D2C7ABB517904BAB1AC82DFC3DF59A368F326C206EA092B7B0082446391CBD569B27B2556899FC3E8B23080B9F1B1315B1B95A6E27F970072EE89FF3CA4D257B1AAFED3B610410B441BF7DD4F95FCB5B364673281F5AA47781636D39A82A4D8141F90C206E149C0DA5A64C48C3D3248F289C798B7EAB6FDE3015E7E28CA8C44DC89C2F23380057E3403D1300D4E7E8E38545449D10BF0C51E3349AE060081BE4F8D0FDBD0F1924678D037AC5F8AC2EC2576ECEC0EA79589CB07B0437AEDF524D14BAF580AB402C591CA94B316A5D209A6508D2097DC23581CDFA72EA11715CF62460D2D44017D8F04DB3BF574B1B84D4CD5606F12F8D3D1B510C28F8788951B52BC8252E072C363FDD7501072B469952067E65B6795052B572F5600E60CD4CEBAEF82A3914A2E06BE2687EE90D6EF094CE7145BAF8DD868805957C029495953816A29BF7B90DA9FC027927A6505257C3E56293CB587BC4BD594EA26668C06FEB66267633CE7988DE6CB3EDD47CF06FBD9D426479495D471A32AD1AFADC22D5BACD44477591D872D394BE10DC917FF63FF3CC3F5B41EA00EDFF64C150C7531F5634F1360CBCD6BC1611E2CE07C987FED0DE1D454E871BD31E6AF9849779CBB330D871CE21448D2A59F2ACE7EA9548CA988B301D3343B2107D777E332B8ED8BD043D8808010686D809368529AD43586963474551A8999261698C57513E637B5E6EFDABCE21FC7257C6079DF692170E0065674323F710E763EE3A89423B6E0204514440C1434C196A670C732FF338328FF27E712305C28D29C8A19AF52CF3C0666C324AF9EB2E3F88B7413C33F736278C74D89B3C4CFCD8FCEE0DD7AAAE06C3F0AFB7775BE190FA4FBCBB19FD1484602AFEBA5972C38E8B132588FCD6BFB8CB7B8E67F8CD6E9747CB7AD4FF463C6CAB9C3D9AD1A467E88BDFBAE0B4F29F6BBC1861986E0C69181B1086D21429466DE1593B293FAB41EA8E892D050A3878B679562A2FF4C4B48F7AB792C504BA921893AA271F7780657D9141C04C46DB34A34BFA4C47F1F53EBAF8746BC1FCCFFB43F0616ADD0383DC3A6E8B770DFD7CBBA538BCD210914CEB2E799163E163C6A7D79FBAD027291C14C0D5C2ED3D5699C1EA5344DD3A56E64508927480B25B4D36D1ADE3E08B0E5E41FF35528F85373C71167B13AD8216782DE60F6E81CD5E10D3D279E87B8EF46A36B6DC901FF6AAA05763A10334ADF038DDB6C968FC3CEC9BC9CBB9A6F3B2F097906E179EB4FDFD328EDA28B47FCF14E4CA3C8BF264AD455A817857CC7136A0E4518270B935D52B6AB3EE5CE7593CFA4AE1F9E274B9C918F2A9FBD323E83F7A8B0C9340A2D88138AAB98F9A40EFC416D1F37977067C59B4ADD60C2D4343A6DF95DDA0E83B40CED0D291D073D53DDE5B5BB48BFCF8D3A53ABB3FBB27B19D711A547DB695A2B3576C9129C9A29219E8535B5DDF3A71F1B30AB7C933219AC3E9F9263B083A12CD055F55F9B54FDBFF3272AC1B36CC7B3C67DA8A559E42E59D9F92A443AA39F890F6704590130442378F82919DDE5DE7C7AAB44DE9B4E3F5A57B31CBC19C95BC788EA483D88A87B7A0365A49AFEAF09B249945E02557FED97996FBBDAC3FBB12E58FDC2B770756BD0D34466904F612918E104478A44FA5830D4D8D4E8014F570B78B86506571095A78ECE65E60DEADAA9954354B17693D82E87CD6D232A71165A471703EB3DD25285BCC83FE651684DD5ECCDBEA7B530ED7763A68D9008BA197AF7F2061F88E4B30AE4313D735102ABA1C46D78202A0FDB667E0030E75EB6491F5EB653ED8758F003A915C896CA393E0E89C2BD1C4A16615C13F399B90B0EF15B26D742D5A8D9D3C2E5C77A1C5473858B50B0AF63F51DDB1A0C332DFACB228275DEFD66C1DACACCE720ABB62BA538C7FF8C32892939ABF9C659EAEEDE9F6A7053444F4966AE58910458DAF509D2527E3CCF57906FC8AF79561DCCE0721FC7257C6079DF692170E0065674323151C0D90564EBB08D471152227280A72BEE1237DCB03FB5A1DE7C1005789F56593D23AF9467EB995630A2590DF26B7F6B4620A03DFB1328E73FFACFC1DC96592C0EA79589CB07B0437AEDF524D14BAF5F3CFBD702B465312D1385A50893132EC5F609D7A6E3406D1460606A6FAA8E62A38E46BAB9F0645F70447212E94AD982B8512C0682EE2EB6C8AF927CBF3E4FAFB5C582D1D0AC354928FAFF8CFC4A8557474DC19A842D1CAC1A70E5211488813C44A69F14277C3780FD8CBA3636B8DB30B89256CC5F519746BC7D78F7A3712D413D5C9B1C49C1BF7D657A4727AA51C3FA2DCBA2A665EE752EA78C9780925A06A0DD5C9B1C49C1BF7D657A4727AA51C3FA2D6A8225E2D5F3BB74DBBD7EBCAC7D2017E90D85B3C77C0FCC49FE301727799C503D4FA67A81C880EBCD8318B37C521989E084A2A7AA1ED67B4D5B002028E786807A54FD7F2034514A0C3E601335FC3BE39F1F093355C1EBF82539386158134659753E1704E464B4C4DCC79646664FE8E7E0F7FB6D72FFB97550E301A5B2B83928151EA935C11E8CA3A19BDD6BDD8F5C547548D7EDFDDDD7A0985C0083B46010005C28D29C8A19AF52CF3C0666C324AF9AEBE964003215D9B42BBA0235C008E83AAB3017060DA4D3869E70B6F13A4921C52E734C5E0532CC5CC9E4F37F2439E94C13A9942AB30E124CB2406182332A7944BF181CE62614AD5C88B64693131FA91AC587D400978887B1B94DF79F580DAEE39BCB505DF889E8FCDD5156A0BD29FC605C28D29C8A19AF52CF3C0666C324AF9801A6A9362FBF4B57F8929CB0965044A5E812B96D9B5B313ED44171F241A61C04E909771F2A1F84176DDEE101718233A95C0B73D71A39452816FCCD452BC6C4CE601A2CB72C1B7CCF748EC4D882E64A817D729A8A9C8E792CA61A83DABE3CA321E38D1611DB9E0035EDB1C7E7BA812E9E326388BEB807A41ED24A1E06EE33A593B643FD5B2B881BFC21AED48BEB3A8BA15053C7EB28CC4011D4CF66CD8A81B5039EA667BCDF93E8079741F5BF4EDFCCDFF6AB481CB5CBA2601A9A1F172D022D1AF8CD20DC7090EA4852F04E4C282828731E93D4068B8D85621C75C35C27081EA1EE50ED98BB7EFD8E9B7E2072F7E1E4581C33530F536AE0482D898FB005200ED602AE6E6460103BB2FD2999A5738D209FAF98C72961D5F873F8A4634BB1F3BAD24104435C96AACE15780099B6642F3D511CA9064D021FF37C4F90EF5CF75762DEA546B7762117FBAB99E2A92ABE34711FFFC9EE1183059EBEA0A45FCD91681CEE77006425DB8F2F2F499C6840C8D431E4F417E03F6602689BCC51B685C4C8E5BD3BB00D2379EED5B016E970203105654B5A5D8A7A199200C96C845E979332EB05894B4AB36C89E3BF0FED36F97A7A55B44C3E11E54CF6BB7F95C4020076E991B9478175E22A6EE6B67AF3E8291E303DE2C5C93FBC9FA0566623557A2B41FAFBA18AF9A5FB463C9E9C9A70BD7FB0BD16E5B103A734B7BF28BEB0A14A589BD3192C175E5B509EDC382FEF3A6A99302D0DAE3FA1DD5B49E837DCB1826EC9921A19B16CC76876C08296B4EB21E2DDBF49BC0B2A20A027C3C69994ABD2361200FFA8CCFB6A8C6643EEFB73FA2A24F4319FE9205EB689B285F77A25B7946572A4E9C9F09CB871AC2FB4527E3B7B8158C5AA8B997D6CD152BF45A3315C3C2A524865BBCE0542A5CE1DD6A71B1D08F448E5BF4CB920B64CA874FDF1FED718ABF65FFB008436053D1E9B0AD97001EBAE0B87E86AEF14DD5F9AC13F20B0CB2C4F50F7EC22116DE98C45BCE676AF3D6D026B03B39681CB92E94ABD921F99E71BD2BEC222154052A3BD454B5C92C39285F915649A3EA817735AB9ECDA654C49DF5EEA9084B30BE9F3D2D2513D0209C0498BC89D4AD116312D4B446DB811E0239C2ABC783B8FA00FB26A635FF754B76B1C2679862851743E2E5BF86CD44061D5958E05467AD6E4DA3BABC8754A5FAFD26BB892F3CAD2D5540F908C8DBE46737EAFAFE49D195F60CEFFCABEBF4380285B21CC44241D38CA1F3C5BEF4CF3FA66DF25C5EF5CC67737E14366134D0DD9631DF2C5B245E1017EDD0DC8646A873ED364E2404A40EE35DBD1A1FB03093DF6C1D47442F0C5F47518869EEEBD1555A52660E18D06BC7A66EE62A83735EB75A503E0A612504FCCA9A5DEFFFE51F0764EFDB4636D7FCD9B7A3F7408C8F5C974DED30DC7B447D1EC863A218F1FCD54F6DE7339705260205F979650AC27241C4D98DBE075497A204AF9EA62CDC5562E768BDCBA0665F77B1FC3E5F7D9680A5979110B65453E0E5D773B0E6E5200A6636F2E59778403DCBAB7BC43A0F3CDBFE6A21ED6EB5DC617C55FD4819A2EB7C5D7E99D4613F918535DE881E38C7DCA21FD3E84AD5734EC91D72FCB9E9001641089E6274FAAE7806E68E3A86A1C8A5F29540ECA3521A9D3D11AE42B3EF3A67E951A85893F578B8203F555DC683BAC144574E5A9B0B09F7ED0282E1C7133C4D2E626F27A2827A9327BB42185E5330D4D6A22FA30B17313B2B636BD505BA703F3A43F1225D49ED941FF35528F85373C71167B13AD821678AFA0B5A629A0C6F7EE91A057375360ABC0EA79589CB07B0437AEDF524D14BAF53CC11A9D3763AB0ACD845EE72CA3E7418E252CE748F4D11DB71F3283707522C113D2B9B030BCE6E5060EEC5BECE25EFB1E217DE1D2FBA5C925A36C11A45A39264D828C04AB8D65F478CD4DDD9A1B99905456DF0FB6842B1E33FDACF1162402076D62551DE6477CFDEFA748F54F49B6C58A0A8B7A925B9F6D2EDCA5F70CCA9446694F4F2A70CE82075B89078AE10E3083622D9EC658712AB9F8F98EE0919783C121FC7257C6079DF692170E0065674323130AFEA5E8DC8C4B3119B319A83E817B85F756DBBF3E3FDB925C2628F2294D38FBA107752E8609C83B3BB3A67E77A769B56F17EA3D468E0BC78A7D47B82C676C05C28D29C8A19AF52CF3C0666C324AF99C5BCB71071114010CE5500B358BF4CFC0EA79589CB07B0437AEDF524D14BAF5D602520B5C3CEFEBED377C19F7C2AF3B13CDB7A1959747F253545FC81C19CC327FBADC0C930ACE112A5173B116D438CE66248B7DDB757E7A1792787F77357CE3046EB305F533ECD50C813AE29E2608A748C81DC2354C7DDE3CD9673EBE570897493CF9E38A4E3DE62AB18B1A692FC19A24067C1CDE5F420437CEE20C18CF40E18CEB5957C2F46F11AE115A92C708BCAD15DBCB43D375A62B25532434C9CB797207455BA4517EB8A4254F2B2A0C54F8CEC8BFEE2036E9B1CBA72037B8AB699BB72BD4D322123D437B2A4C5341A9ED7B89EC91D72FCB9E9001641089E6274FAAE7206E61EA76C697795B53E14D1830F0EADD8F4A924BDEBE254DD7288F66C43BE7BC76F1471096AD3AA6980CBD2B0154E146C990CA0B52C562AD7CA21AD936BD5A32348CFB29058CBFEA91C9BAAA09B54334A9D2206858A323EE752BA209BF075E1BE9E92DD43DA126704227AD6C8ACEC9C07D0167CC59994D73253E78BC50327EE2383A0D49B7CE1810102876625151FCFF0C4B8263FC912299D0593B924639F4ADF3F280A832B20B79BE51F51781010C833E21F464BF3C84CD5B8AA17B0DB6846F92E92013193A7192776D562A15740FF046B622351C2FD5FB1ED9C3A84AB4F49C9DF4A3E47947E36464863DBCE729586EBBA0DAE7282DE6459936D55336BD0110E5EBAB11167188A455736035747A94792F41582B1A13DBF325CE1451C30DF141FF35528F85373C71167B13AD821678773B0B220363D11B26EC7FF0CA206252BDCF073ADF9C1F7C69BF5E2CF9D088E147AC62094699DDB977F08722CC1D1A471064B1FDF47E1B6B15F1289ABA62F62057D87A0998745AFF3D9AD7C6A05605D3DE39E5FAE2BB95A3C84943A78945B855168E68CFC94B64A7EB1B698B3CFFF5DEA189FAACB6CCDA183D4DE30F4094CEF3582126877B4DE65BFAC092CC12B2BAEDB2C31D10703E570AFBE62578528A27859C7DE619BDF17733F7A80FD26D9861621EB27FA30B79A7F66B146F3090B4F42E8E65C181182E4C57E7DE6A6979158016C933A7A8BC571FDB93463510B0295DC9D633FCDCC6639DD8C1B60837CFFCB39916D0D7F23CB8FC26E2DC26FDC34572154C932B56BE7C884321BE1D37852064E1DC863053C0D1247C3AB4633D7D51A1DE50CB505AC71D99C1D57B2437FCE495BA0A078CE9F9CAFE2E946A2BAB340A1C5B1591C199D28D761CD11803413555796599BAC31C61E20732898D50C2A1F4A818B79DA78175FB9DADE105FFB7AB95A2059DDC4ABAD841EC39B5C80AD70F43515BD9756F809DB3CFEF7E0F85F0D50D2B54DC9A1149C68DB091A5F5B6B8F4F8CDDBC2EE58A460D826E8032AB03360C03C21F10D3BAACC2F83C4DA443D6D6FEDCF2D95391FCF84C681E5342E974FA0824112B122182B86062A7239E2CA146FD1D0887EC0236A96EAFA216962E780AA905967E1F72A485661B990DA62CD535E64E6B17176DEF76C248B1DDF33A991D7927E62348CDE86AD987CA06D9D87110CDCCB3108D374DCD493C4D25B060E21B6353B561A6C970543D9DDBF94C3225E91C11AE157E502C3DF2D4E693B54D0F99C8F11EEEDE8B6DC427EEF408C0B35C8D6A48B1366F1D54BC29AFDA8296AD7B828C3813496CB0A7C094F05FC1EC5B0D4789D4917CBB0518571533B17C89D4D501B7DB15ADEC2099E66CCC7290B7676DBC08435F622C1518289042663C95E83099DFB0AEBD2A094759CFA6B924E9645F407AF56D95F0168522F92379D4A235D9274B128D5D20BEA2E33AA199A26BE33692438F35AE3E4887596A7B21A4F46286E5F94F4A829450014225B9D5B18536A8042D3EB9FDEC68EC2177001A10DCDC94D1D047F4138E9ECE19F179BC105FE39A4DBE86B4564878A04083C82C5B91181540A0AE1DCFB1B92289D8AC15FBB504360E6136FD7924242964139BB14D59D25A0B999930E0D30990D98376ECF101E3510E2DD605A64A7301804DDB1454D479D208A4D5929F311FDA8D7E8F0A38FCE7AC22AA98524138EEBFD64049F667EC1404388EFD6F760862C71EB223A18634BBB0D3147254041C640F1037FC5EE323B8F9C6BA18C16D7A1267C6D9DF871F377DF4A8783D3FB3519A06E0467A9FEBF999122E7693B82015B9A915EAC60C4A4F5D8112EF27C3AC9DF4AF759AD04E0ACFC3F9D793634F295391FCF84C681E5342E974FA0824112F709FAE6142DA20DD0AF802C36A45FF0CFEE0D0C299526927E2569D98EA2FC6D5F0168522F92379D4A235D9274B128D5D20BEA2E33AA199A26BE33692438F35AE3E4887596A7B21A4F46286E5F94F4A8E01FB5F41E32ACFA14B1AF7263FC1E172BE960574941FE14256E0748B0C6EB49D21AD9286E1A610C27677305D31B34252016F50620496A77111828928368584361FF012011CC89EEEF5A47D58144A524665A9DFECB48F654E8B8CB66C0F9323B8B396BC7B0C10ED0FCFEC94883A6F0072F2E6ACD78A2BDAAAD627DFCE7CC78AF457DC2CD01884CEA34DAF8F95D67665AF1D899A3E0B2616ADDCEEF8D29307CD057A6DF8E43779824CBAB01AD16FD96F5B1EF471D2FB5C53388F5951A07E0C18A3251394491DEE06996C196DF89A50B459B9C7587381A2CBFA766156A174736DBF2BA82DBDF197C6AF6BEC5D28ECE2EBDA283E5429EBD694D5CB787BD47D42F6AD3145F0D50F7617D77AFB8035AE4953E35CC60AFA48D9F06088912135461AE8CD43012DD69F11637827590E2125B808AE5E458F1475C71406F28D5428A648824B9547B082C0BCFDF2D157289B32078D39CCBACEB8F28D3430FC5C9ACA1926AD60737595D7AA2F30B59C790F2C3114BCF7E2E6DEAECA3C502FBF573DFC856F3DE8423F21CAC9285172F85A6F44FD75529A8DF30E57BF156B9C4B7AC614438A312886E8AF5A63B297F390D5B217903B24DCF15FCA0E9BEE5766791688315522AB6F11C7B947B8F6F8670C05D2635C31C9635C7891C322ED398C0FFE0D2344E06280AF0A0FE97DC1A63021722B5D4D5A6365F0D0733E3CF94E5784561C9708FA804F588322031662A1D993FBD2B7CB0F2CF7FF6BA1C4D0C86EF58D66912C617139AA44ADA01E266EDB2C8B9D0A25643A5F526413FAB629DF09AAFC836A2FD56227428F2E7085188F8962CF391E4CD265523D6E89D4F131DC43A5212CBF58B0A80BF65D84FE5D9759862C753E63356EAEDB2676A8470F61040C40B5E6BBCA6F01FBE0851A892C409ADFAD3097B6F7F631F84B1A006400F30AE24D888468A9867BCD3E4C07D51BEDB6A52F5B86F054F60DF061BC63C43BA6176E4A5B02E6E669D46189404B709C2D37D4D92213149E02A3B285B29E41D5CE24ACA35CBA3E93831A6E75104374369AFF531C4B5B7405E711EFFFCEADCE1F1CCA5C7AD3E4CC89D2581CE12907EB337AD8CE4E54CB222C89C20F539F1161485793B5807B441045BA843C007FBD664A153E764C7DC242448719B2BB202D98A180302D1B083DC08E12C94C7AF80A13D0ACC2F98260408651DF7239F286D5C5ACDA1A5EBF78F016A5A7221F226561971E33A5F20556D04E41354024427146B00281B54223491855304A4AC1173999CB9E8818BCB8EE4E2D9DEAA51E495EF44AAC1637A6B45D199B5C9A45EAB8B83C4B374BD432BEAA545ECD974971F12304DBBC1C8823164996F030AF245BAD586C958657ECEA362BBA51C384D99E3B43F24AD84697F965D0E5EFB22AAF36241C7773724DAC4CDB77F4E6C87D2386D6DFFC552DA47A0FB32F5342BC4A0294AA9066E291451F6D7A6CC428BDABE898428A29223AD003EEB642978AAB9D8DE9808970B442121831D04356C3161E8251B13BD6F6D0ED50E2440C7A59B3FAE513B6FA16D7345E17FAAF1A381D0ED1A7754BDED1F58EDE6989E7F9DA13B8CA136C50BD36638B3C3BBAA81F883885F5449E3D595B9CB309D5D607C37A91D26B09884104443917ABE1C8255DD34A77FAA3B746C038EAB5FD3C5499836A35D7D1550666E02CC4D9317680854094E107C71D961E2586F64C1599B2026C0C67C9DDF38B6CF5D4E6FA8A381F652743316BAE79062E2380DC916B7F0496A4F67A9655E7A7290D3296E619B14B370291B7A2AB2B3295260205F979650AC27241C4D98DBE075497A204AF9EA62CDC5562E768BDCBA06FA1803CC024FF9295EB3A7DA79B4F0ED83466F8CECCBB40621708BA729FE75376A7B53C2B1E001E3BE5047DC553B7405DA146FB10ACFC73697C9C4C7018A19583B1557093DD466B8AAF1F8B5058165779EAEA59BE175C862B83B87264990C039A3B77D8B19E3A6CC22C70087E90C1ADB3B51B1664870371DC8207A3E155B1836E626F6BD4395121CEE9D11BD9160BF221F80BA0C6F0DA424022893A1B583C7088C0B261CA36E37B40B84540B4DFC25E55D8C2E8C6E03B5D487CF09662503394EB700FAA44529B9C30E9419A2E26BD6B2E676A36A9A8EA37E580F95CCD4A38B4E651CE9690794F463913732718B569A8501B35FC0E90CDCCE1724507AD13D5ED7F07CC41D1BEFD1598FDDCC83F37980544E360A3FF34F0B08CA1184B3FF5219A04C43E9B68782F9594758F49A6F3D342B0D812C1B13A620343F15D9ACE0022E33BA499744DA27F277F914D56DE45698A741FF35528F85373C71167B13AD82167834B08BF720F2414C19F67E427EBD2D4D14CC2ACB24F7F5F8FE32B35982FC5E43030188027E824EA2910708DECAA47ECFAED42413FEA5137E8257CC0D4E949B116C89784C4BC37F5B02614941CED6639676541AF4DDF436980BB7693C813E6A9C44D6FBDC48E2B9A40AF1EE67463180D4705709E78F7FE799EF00ADAD414F83FA3BCF391E82F3C26B90520C4DA669ABF7DFBFEA315006F450397CFAE72EB9BD2B41FF35528F85373C71167B13AD821678F3E62A2C6306C92EFF436518FEB2B887130AFEA5E8DC8C4B3119B319A83E817BC1AB833B969E351C113114E5AEC7982B45FA2222959403E2B2FD6BDD4A56D2A4E9568BC1830E91577F2683A424773DA230505E197890167509F51FEAC10D63A3DE33CE61E2834CCDE976EA39B9C9CEF30751FDD33271D05743FEFC045A975D0205C28D29C8A19AF52CF3C0666C324AF9606C3600C5BA9C05735C636212AE00EE05C28D29C8A19AF52CF3C0666C324AF976C444D691CC6363DF8F5E1ACC4DEB90C3C84BB5C3DA8054A0CDC1CAA68614ACDE33CE61E2834CCDE976EA39B9C9CEF3F6D0C7D315C24F7007700992215EE31C0E5FD4E6C8B7DC718A3F26D468931CB9EDA4202C51A8100878F0259D6E78D6370C9340A2D88138AAB98F9A40EFC416D165A9099F3D8C2E642328B84175E18524DB2F5136BDFC63A5C442B4EB71D67074DA31D80A6AEB5A00155C73FAB3B374888A08063F24539FCD1579DAAC2A6DF8BA36B6DC901FF6AAA05763A10334ADF038EFD40ECBE72A1BFB9CE8AA8774DD4B1F21E2F1B6CB1966010B97E2265B473A29B38D3406B97830B6FCD9410DC3FBF7BE63937B0129B949454EE9EBEC761CF05ECE5C9A603709C2BBC9561D22AAB0827C5C800BF685ACAB3A15FF9EF4627B5A045FFE3C7A552B8FE7458E4D4A55F66F531686B69A0E65F120FFBAF1D63A65619DCBEAC05C344A9770422194F87CB362906887515FB87A9CA56CD78E1D860C8E5C49DC50567382E2AFDF9D9F2698FEAD057725DF33429580C2960646228417535575DE843733BFDBB31CD65842DD19DC82F1835E2BA29F02049756FB11606EE7BA393D385150A4E2A381CA50EF60E503DE0E7D3CD8AC1118872321C99BCBEDC9C1317C96F91A8437983D36E782336B61FC36AC68825B1D1DE26C17E4B98F8549E206AA207DFCF13B366F018F1975ACED82EFC606F9904B45FBE22C4483A243C2F3CC533ED020D9F2D5D8DE507E9AC031BEF72A03C4D5FADB162B4BC0D0348CB30CA16AAC4A7E287D7C407373AC0FD88B66C6E0FDE0B9BE374900FDCB68DC218F755659A7038813EED7479A1FE0337BF067EDDED5D58FC3F762650B152499C57499447F4B494815F722116584213F98D4846D7E934B259916E66453C3CE956B7D9DCA92879312BEEEB5BDA5A45E9F7444250EBD8982591D5CD660E22D5F46972CC19DF2799F369EF0535CA58CA18F79BAF5C60EDC77819352C12053B113AE113D95750E232C756DD91DB44FDD225C2F1DEAE14DB82FA214F3094E2B91B1AE2EF8B5F71DE619AF867CA6223135F2B596C406D22C4C626DC15300BE20052DE1E49E61204862D0814D2A7F145C778039BF3CCD6F6C5F739F073A0313C72284411D65A28A08063F24539FCD1579DAAC2A6DF8BA36B6DC901FF6AAA05763A10334ADF0385D020126A63F933CF3B92F5C797A127821FC7257C6079DF692170E0065674323A086F526DD55CBE899B1DEC4E53DC71B11A08C2726D1B3575B2278203F56348316F4CCC3EC7CF487AE61DB84F935E878B05313C3F0613C5BEE7E2E566567353A5F25648F5E15CE28B3A1B9C6E3E2996295391FCF84C681E5342E974FA0824112C4D500B99DC2C206A62CB88EB33395B774EAC744B0C62097D8D50F43FCFCFC41DE33CE61E2834CCDE976EA39B9C9CEF3EC58EB2C60384394FBD3FD23B138E8A0BA526F6F4C1964F83C03951BC8FEBB788660015823BB51255EC74DC1974A29126E9747CB7AD4FF463C6CAB9C3D9AD1A4AC74610134768DCE49DD211F29129D57B0104B4F52ECA43EC8A4E54F09894973CF7A0F958EB82E785FD669E0D0723F1A954DF1605DF2EA6EB30A9E3C7E5853AF169AA32069728E4095D817E6BA020DA2321047D5516EECB6DE17E17F47819B3D5E1B9D5B07889AD00A8CAD9F86CD5753A6D49D45FBAE46B936E892A12B162A1278D0E675578B8FCCD3762E1CC97649EE81E07CCB0E02F5743CD9454618F6244628BEB08C56DC781560F27E90641217BFF41975CDD8F88180FB6749B364D47B7BD9064B4F85F2773BBA45DC865A9D32CFA2A470527A6497EADBD968068D02FE57336FB7E8CB29DB344343255DD767E4BB846CEFBED4266EFBCED105319701EF66D1AB82ADBA18220DEF216EB52D909D7C8213BFCFE93D437F89B5CF0D4E621AD15F25648F5E15CE28B3A1B9C6E3E2996240ED516BA9AEEF92ADB29F3A7A69B70D05FD3D7D38193717FA603738A8BCA29E874BADE9CE6DB4E54DC7CBDBA5E1B390DE1AEDC5C49478E0D029291F3A98D3154F25CBF61558AF773958E31D38F11B321B7301CF4A26B6C5D30EFDE6C5FE5D89C0EA79589CB07B0437AEDF524D14BAF556005612042EFEE55F230EE97B65725F2271413966089C1BBA0304E7D6A475C3DF9A626AB43D0CEABE5945B40BAFBEC9AB26A8367BCA6FE12782EAB8DF36D3859061B9C14F3690A5186B07C0AE5D73C9080B431BEEA1D327767A180F2AA72F2A6104B2311E7A841115EB885BD0723319CA8A9A487744D6945EF812978B3A7E73A325B22744F920EA44DB0256F6DEB659A08A4CF56135622370C8A1E9381601956A4C2383D8242B3437E4765C62594E2FBF52571A07CEC204879590B7BAB7FDE405C28D29C8A19AF52CF3C0666C324AF9FD3CE85280A2D758C01B7D8CE889B8C2C5082D3F0D2E4FB1255E093D2FC7B81F692AB419C5AA1D32A030CDB7DDFCB256DA4F3A5E3D890E785195DB37FC0516B4111C47EFA76539A16E198877A26C5D3DFA000787AA7191C3311B4F1E7328B32E0D5D1406B4647450A8D69D26431D184DC3931792B68CB5F619AF5E45AB94CF3EB9B628AAE240F71D8F81942615A62618DBDCF3290826EE9B97FC3AC3B23BA5FC7961F38BED9E636873621A9FFB90A50784AD1CEE38CFFCB9AAD3E6F7BD78DC75143A5CA235CAD1106F80B91D43A669C5DC95704ED70EE462BBFD35957AFC94DEA876A3096C23A2E08DB4619B5C48DB7F3FEAC8DEBD60642424511DC26DCE6B744EAA34F4D0FFEDCB4C8A1AD244FEEF54C1AB833B969E351C113114E5AEC7982BC2AC15EDF8771A6077FCDAE3526187AF2CA7927920D77B85197B8E1D302B7BBE3E0531BD69AB22A4A19D51F7C795668FDCFFF5B5865360B6423275EEA9CD092462F87F8E1103E18228E314AAA7C3290BAE6A688DE97740003190CAF86A630BE75751EF136C99509A91A6BDAC5BD970B598876D4BB387E241CF866159815B4578F1575685BCB7722E3B87E7B934B75344599AF72259507AA1B3CCF43DD82248BBA22082958DE6E9FBF7B1A3F9D4A4058DC1AB833B969E351C113114E5AEC7982B8671DAF4A2D18DD92C974D2356C611D605C28D29C8A19AF52CF3C0666C324AF9A3D4630228F96E7B25D0ACAFF6A6ECFDB75F97F8C7A81155C2956FC44E079E545DF647E3985E9C1151D134F0E6350073E06B5A60EDFE80A70E8B1222310C7CFC1A639AE85B45F3836BB04BAB585541EB2534BE065AC456A902904463FF609EFDE674436BE5D8BA29198F3E2E9C905569D131EB3A99CBF5B66270D1FDB90B1642653E21E9863AD5BB6D94BFA52C86696A3DC10C1F9E880E5A2BF4840DD77A5BB0D4C5472495C369FE7E96358A2FD4AEE2B079A652121D68B59E09078BC05D425F704B0BFA9579F877FB82CDF89505C18E111A3E63D3FDF2060D6D6583FF6F251CA7C65AE869512237F68A70FE61FCFDF762A5478716F27529D07481C9F55C9A09C7BA845CC367D7959D4BD76341D4132C91C827DBE187AB866B6AA49C6C2882F20F328A1C2B5B06BE47B9A310CBFDDEEC5075C8FD9A15796E0033893A586582CE345C01AFBA363CA5E13C9FF0A357E0F5FC7D14E0F11CADEC794EBF788210252643A665395B5E11ED9E6096A49E6C943776BBB2B4F211FC11560C311EC44D4C2EC454266A1F9077EF38EEFA2C3F00B34B25914A671D127426AB198B310C858CCCFA621259B75DA53577AE2E9A6752348EC0EA79589CB07B0437AEDF524D14BAF55EFBEBFE72B69CE04E1C72A52D3F621CBBAE44321C30D3320A3FD5672E3B2E062BEC43AC9FE9810C1BA1790C0F0FFBECC0EA79589CB07B0437AEDF524D14BAF5F1575685BCB7722E3B87E7B934B75344E318B6BB4703C76D2723767BBAB22098AE2BE03B82A583CB6A66A8442663AEFB05C28D29C8A19AF52CF3C0666C324AF992EADA4C79EFE9BEF1273F0458E398A5E85FD04E7C7A67588A9345E8B43098FA835CECB4804B953B65800B2D34B0954D152D19F241CC50800094FABC437A7250FD2253D3129C1B32D8B45EBC7F1FADCB5F25648F5E15CE28B3A1B9C6E3E2996220200FE661CD3ABBA9891AFC80F217CDD640082B8077A1E4AEF8D023F91B5BC63F31D4D52077EF3EA6AE62786396548866B350772F6CB61A98188F869F21A144A7CF291DE2B654DA293C98F6153E6803EDA4202C51A8100878F0259D6E78D637545421AF73DF114174D1B0CDAA710C0D4671D9936E9CD93307F8F879CB2CF3C50A1A7BC177FD4D38ADF97ACB09576F2BD91EF1D4A4244F665BD0969D372749A305C28D29C8A19AF52CF3C0666C324AF9A754E6E19DDBB9F189686F1F35C34F0EA7CF291DE2B654DA293C98F6153E680311F71EC57235C517F3522784A6C0F8E1BCE10A712970838484F7BDF1C21ED3DE7CF40C8501C0585F274999EB132F9148C0EA79589CB07B0437AEDF524D14BAF5BACA99811B5E905C8C61EE4A94E212A40C19BA269A4B8F14765A30030B7892C18203F555DC683BAC144574E5A9B0B09F7ED0282E1C7133C4D2E626F27A2827A9285F8935E3588D61BA19C7C429F66A771CEC73C324FC53CC73542B5EF06719779D321F8B0DED862E02AA603521C2AC4947AEA081E2B1F68D73DBADF72DE65C97C1AB833B969E351C113114E5AEC7982BE9B96C30B931E8648050DDE9E16A53B48596249E2869DA7C56246EE74C5719C5BEEC6067020C3EC17CDC8E8953B66F6EC1AB833B969E351C113114E5AEC7982B27EA0E176BF6D98E156E907826154E5B790AB955204CEF0A527C6C705CCC7CF80C9340A2D88138AAB98F9A40EFC416D1CDDFEF3D4F3F0C82F6D09267FBD21C7B929D02085F5EC0D83A0E651C3863CCB3035D8CC452B1884E60C9C58AB79AE0537E103689FBF7184F547BECD5AD25C635FA921FAC0ACC9903B448812BBDF67DCE05C28D29C8A19AF52CF3C0666C324AF9B9EE558BCD2C3970430837EC85D734B87F95E78BF6A283BA9988B521A47A41BDD9C0EC00939DEE2574F7875B3B098A408873C10ECE16421EB807A62B13FCAE375BB74D628AECA3BD9C19C2A8D50946E8ECE0CA25A2FC51283E43C0DE5A9875BDC04E908E0C7902E6AAE0A5B0D65E5FDF1C08146E6E6AEDB3BAA00D3AC5B9DE05232FFB1AFED78C4276558BB008B6C6D9AFBFC143E524263DF4D1BB5D5777F3AF41FF35528F85373C71167B13AD821678F83137E352B0FFEF259E50E333C633E78E7385148F1AAC58BBE4F90A0C948003C3F5E82C58C968A4210D09F2CC641BD2AA332F6ED7F5D0EFB6016F0B593F0EDA42F3BC800C4A5BE02F7D79C637195077C0AC19B39F674ABFC6045E6BA6FF3ACEB3DE1BC658F2F3FD502A8FA21FB1D9425FE1AD724AEE24B5B109BEE072659D0F04DEC773F47D102E132259B565131930F80C3EE1ECB1F16D087A491490472FB5E585E1DDE753D745B4A310655470E695E816E7AB922962924F2CDB0755AEB923A4AFAA64E8BA1176C1A96C3DFE3AFAEC2E3DE96005A0EFF6A7550C4A9B19E509DD295598454DF0B0EE35C1597F8E58015142824F1862C2AAF25D8D62C94DD48231029748140F00642435198C33FDD941129186904549B4CDBBDDDED5A93AEDEA3C2BBD0E9F231ABC8F3B038ACA0BA20F839458E3498653DA238E25A10DC152360095D9A524CE121ED9C0CAC42E76B0390B22E243567E4B7CDDF1E1FBDA6036361F7DB11E6ABD76113536595937372DA9ED714F146CF900DA05140D3094A383EC13021C8409480180F61F473429A59AD961CB10FE4C1C71311C8AF77448BD550F4BA4505ACD43CE1A46D1831B22B78940F652A8D0C5DD7B9F55D0ADB8F9F77770487B016CBA338DFC8FD79B792F67F43E7B67343A19CED970E3BDB606BA72FCE627E8E47911A1BE129811EA9A958EF6952FA7D78A12DCB98FD7978991837D72A16122CE0182D22002982AE940C2022A35356C731CC5D511B6F199BC1E49F783D64879846E5301180138DF9B54285F8BF636D1F431813E6E5D3E0E7C3B63A922FE1838B26A744E21A049512F991A00A41D2ECCE85FAF34D5FD2194A54D12563A4FE31420B9C4228FA379EC22B7AF8214686A2F3B16E93BD32ADDE9DE899FFEBC494C6381F6ADF39A8C2C4F2EA000F9276D5F32D2F263BCD7C1E547C9F386DDDC6407DAA7C52F14A18C57B1F87CF0FDCA5FFBFD6E9D07BE8E82C4D75D9519824200FEC8667ABB0B63AC4D10060FE925B6000364DF0E30FB4F1FC4237FE8679807954921EB72F1BC84B5BDB65F6BF9BB7D74BA3AE6319FB682F26C3A91791DB1B1CF9F33517D61C766E41FF30DD64385DD5379BEDFA7BF0A04328513472DDF52003518676D425B9F932692150E43D5778DE2D6A54D2256C5ADF872B516C41354EFB82DBDC1812C561A499BF951FDF94A5C87B137947231B9A9543E5356CDF43BA11D78F59FEF29F4B474D859BFBF16C0ACE0D0E51F9132BBB98D0C69EE385D6E45792501B80BC6C0B01626DFF645304DA433A37D311BC70BF53E0AF1AEF81963E6A3CE7B2E4450B87B01C84B0BDD220597EE8B17DD072CD2E4FCB995CD4E6E5AE54FF80E939E6E40241DC7B93E2C118C3DDBC9045634743B298AA00862A4EB4188429659382845A813E9D4B9BFDA2D4B16D24DF0E39AF7F399F27B25F3B8612228F8B12050C844D5F2720F28CED22FA9E5161C02EF2F373CB45A1383B09E05B11DB86CF1C3B662D9D6C023EA07FE6F2C2C6946C23EC9A45A066AD3D184B8D5D500D846EDD46C8C61710B5817C576EDAC0453DA8BFDB759955DEB87E6A5F75D95AB0B43EF8F0848242966234CF315C1951E91B2C55D1EDBE3EC1419AEFE2347C59D649E14035D9899B29F14AA6085C5CFDA25BAE52F86F4D1BD4556DEA43CCDC0A944AC903F2F89A3FE4D229AE349B5509B140FEF64826092BB018CE69EB7685AF2A6A57665488FC4A5B6B5A0D61A7948FE41675E1B1EF2E090C9E162284635F3F9E412C1C846996B909917F121FE4FEE786083B60A40E74ACF84D7753B5B38E328A98203F555DC683BAC144574E5A9B0B09F7ED0282E1C7133C4D2E626F27A2827A960129571A954CBF4581E484C9D4B7540826FCD5378B557CBC1EBF7C22EB86318B3A58E460D8CEA593F35575BAA35B60EE27C6E3512E8D648B6D80ED3DB9166F4FF4AEC892B61EABFAE1527066FA081D8689C05803406FAFBC563D7B7D50344964B3A96FA3AA3DCB8986FC9FE7154242E65FA35B99852A1BFF4B4487D2ADEC6A62059891A700283696F8175F1D805F148390BA30F9A7B2EC8F0A29654E82C3EC3035A77040D192FF717D9692446F873FCC058DF1A77D1C460094501F243A53CA0457FDEB92D231B67F5BC2F348BD7BE75CBEAC05C344A9770422194F87CB36290ED3A6D5C2F793D82F9EADC940F1868AF4B5D40E4AE44F7BEFD5E8551763945A19CB734FD19C7C33F1E1E587C89CC326A9D577ED83AF8AA358F08BA8740C4A7607E6309879257BE3C28F7E455E54BAC25F2A750C4EF89370BF3D22C1C268A5658AD549EBB3D500FDB5EFB67CC1C0E0179B2A92487C83406684D110A05BA7E42B8F0670DFED89AE3175BDEDE6285A47156470C276F611DB5C5485AE19F2E5BDD0F7AE4C7D7E9B9DC1A20255D5AE205937A0C0AAD448D018590D2D73773D2B07652889446CB4110CF3BA8A67660EC52DBA3ACF77AD8CB61197FB327C50969A4BAE7E1C567E4A2E101791ED2FB4A1594DA62A2DAF059A79218BFA512E063E39B06869118CE92EB2DB978402D9840AEAAA0815F46F913F80D8ACAFE4077F09C7A86B8A9F95AFA2FA234B494F0BDBE62EB275F9118CE92EB2DB978402D9840AEAAA0817D7B82E550B2AAF97414B9371612C339D2FC624B8446E010155228FCB6F013741692C99E51783B6A4C74E9468B3D22C8532A8D2E89B718C467E54B152401E3AE3D48CCB08722394F6C3F92FA387BB30CDE566D5B0C654CAAD9094D2997D38707DBA1F34D2E86B76E665F725FDC445E7CF8E68FAE2CBA5A887993189FD5024A91BD83A679A01DF8A425CF9FE85DCD7DB3EE6FB2A067A8FDB88E937BE5269206ACBED470AC6AA8591EC72AF84EB82BA6957C509F3BC280C9D4F6E18633433BBB0EAE3C23C01FB9626BFCC0B93A45D7EA6AFE9F5EC69F089746290BCDC6B889079474DF112181B090EFB0CBAD3B5874AB76FD5D7F550A784090FAC8841D464CEE04877FAD49E75193D04DB983A954ABB64ECD8EA20C8C5B0CA47C95B79C876E52C9A63A5A6E42734CF22E3FB62F5EFBF7491C0CDE6484F537D898D95D108A4A0AF9AA3CCCD0CE01369D8E5F15757854BDA1E1C8B2F7B06D339FB38718653D352F6A9AD791A057BDBD2FACFB606CD8F1B6BBECA6E384E67956633FD30C1153715EABFD983FF6ADD0B29B311E83F05E311066FEB942A9D92DB2B6466463C4951873C5B98DDCFFF96DE3FD7E6FF153ED1107301751BA0CA9B92D66D68A4C209048AC688565EA5538EB8A850EFBB2116C3D13D4C3D44D60451BE14E6E2D47BD24F25C3C4F32E5BD830545DAAD67278E0BD151982BC25C6585181290C7CB686D101B55D4C36226021EA0B7D19D671C70150878FD9086795329C771A6B5202C76BABDD3E373939AEE46D891AC09A4885284685A90796B1E3DA316321E73B2C84BABDE10E7930322F8E5826F8C190CA0E2C26AB733D4EA70BCDCAC0CC5F3E3480BB20CBE7BCC307BDDA0201A71C4C2C8FDCECD16C33DCE3A7663DD5E7A71BD024C5507CB14AD70F9A184E23DF02E222B579A21F51D3FDD9CD220F279074BD409DC74250CFD036EDDC7CC22156BBE4E9F2A39097E2171C084AD4D8CD202A133486BA5105C162059891A700283696F8175F1D805F148710291134431D15702D6861338DD5A6E7F91702EDA2B7D88D736EA3B5CD9599A0DE6A2F200F050CF0880C9D092EFD9334BDDA3913B7D8D2E724AB88EE96B97B3C241D19091565023D5BB654E89598D61DB1B3F94DE628CF5D4CD058E8602C8B12DF0EAF355304C0DEAA4D6C34F9F2C7F5A0587E3AD957AE120B0E4C30AC434ED7E2E6DEAECA3C502FBF573DFC856F3DE2C4155681AF334978090535ED8EEF66A9979F5B7227493EB335B836B5DDB0A332D849963ADFAF82F4FEAFA747F89ED33BA7248E099E474F13ABE4F7355E3661D2FE30ED31C4FBA9C5448D026121B4733ED1304AC60F124F372971A9407A37E3CE2B9A1EEBCE1A42F9E02E0CB1BCFA2F8AA507EACA8847D09BB64B30AB86F5E7A2830A50B50AF20DBCD0370F9286B942769E51B324B3D1963163D6576740F5021BFE081309746B8CE8721265CEB9267B6A6077121FB3B38CFBB908C39C8B40A0C493BE661FD95658909AF6B825053470BB45526B10EE3245936BA4E4276A8E2A01DE832D59AEEF3D84712F4B90F0632AB5BA0652B25D49A308FB06C29AE1F3F3F7F4F3894A81E0B3CD487F68D56ED3844CD2FCC9D208E0B7CF03FB95C09DBCDB1CF7C727A6332F5D3A41C7BF7EE1D267F60FD900211B4737A7345EE80003AF8B5843882AF006A91DC9EDB22170639012F0B9FBE87408EE4EFD94E256AE44B178F00971569FA2445428616D7701F4F303A803C0DF98B6313D3A376085111AD6BE9F98965481DEBF4CDBE81A662557E462F4B8BB7B95FDA36BCBEA490DD7BEC2D8E4C2E4FF0F500B34D82849155347790A763A0262EB5C0B10288B020241255290CBC39EE01D3C8D108F59BB936BDD8F2A82DA5689157FA44BA9B6B302169EE573E66D93654419EAED3CD626905DD77F178AC394BEEDF43723F3CC60E77827AFAFC7CCD8450B6E7A680CB3E2CFFE05B7D5B5B039EC9D39405030052F78AF68972E168923302197F5C1313A29022991707EECDFD5245988934A50FD769BA2FC9C2018374ADB90888155BDA52F280D1C19ED98D0DF197EA99BF15EED8A270C8668A145C2E9B7F5B8D6D3F9E07908519CBB1F58FC0B4E00E1348F69CD4FCAB62585B43587707B28725A48EF5AD8B35ADDFBE0C2E84CEDC518D0F9A9FB24FBE68CC296CB93C5408837934DD9D492D989DCC669563DA0B757A5A0DF78C4D42DC18D76BFC35207CDBD322270493FAD01D50021678E251390A364FDF03FBE0CD9C9FEF5C161EE58854E27E51924083FC38C06C45BE0ED27345373646FF28992121329C857534D74B014352E95060B8EBD533D2F2D14C33FA2288C8286358689FD4989B089EBA04B8AB0CDD1EEBD3B477B0E39CD761F16FBBCB7CF4A9D83A73D6ADEFAC1B3CE386DB4B71E438D8E9662C0F9BB4B0AB6A132CBAF3C9B6EC08DC62C37CF2150F8A1A1283A8C40396AA935270DC868A51CC5580D5064F293B939C203AA4F82EB7C8B744F091D68223EC42584CADEC7D6B41CEC0910AC4B7D61546F4B24825AD32254F1B48EDEDCD762D9BF980BCB6E4012D8ADFFE29A6839BF18557C7FE4E5A28D3DEA7CCCCAF48246E29D3CDFACF584226AC8639318B98CFCB577B67247FB9496FE6128BF388AB5F8E4869E70110469D297C5194A32A22CD9007F6CF269EE5AEB92F1D462D72D26F9FBB4AA7FA914D5E4998614C605F3CA8D3DA86D8E4F86228A469929EC20F5CF8E82EDB8858550581942BF3BA3096107E41FB66EFF45EC3FE5708D5B2DF000530A80E72E8FAFB4DC0CB41CD2892539EBF11C7CCE918CD2529CF35A47AC3F384BF3D0ADC7CBA41725F802D3B05A145DD9D3E9E69CA69978EE47FCE294C68BD611B87AA7127565EF89A6713D583C295B3DF8D5F42C9D4E4A90EA3E7ECAEB7DC4292897ECF3A496D10B4AFBBBDD35AC46AD59CFF0ADAA99C2020A45257A87D4E4FD61061526EDD0D556CA195BB0D043D6099BC0600F5166F58849FAB80FF8E7D77B9E8E0DC8F958A07E309526C6A79F80C2779A9CE4D2EDF5A0AB0886510C5F68E01F2C736CFD8500EBD56187CDDF414C35C7E6A9AA9DB75D613AD579E18BCF416C13BA7B2526FDEDD4F0684412AC8DB5695D858162A4DED6F32102EE1E4A40D8E5BFAFF88A75623B5CC9510C4C53FAAC04850E605F4FD8DDBF81A04BC57D69613D16B83C374FC1A7EB3449A29584B6DF7A05F5F53F599B6BB05D0F96E671DC2DF943E6B031769706A92F73C2C737392341E15A3D5FF9994EFA4F20C0FB8120DA1F2659931E5264F3B961E4C5583E54EDFAF3C639F2ECF6704BD3E4D6D1EF5E822576636482C5E7C3ED6BEB67E1F1C7099DA9D14FC6431CCD1DBFFF96E1D1553D81F4C1E9F805D7D3FC67FFFFC9B1D8E3C8A6707F26590FEC1288356D053587C08DEEC0F29DCB4C7B3027D67027B5AD0A16A16371FCC0A0836FC10A386645F32EECD44E189B9F860C7C27466AF154C169D2393850BD6FB7368A6BA807A2790663255790006FBAB132476BE7351259DE171DB13C33A95F34DE9218733D2CA358CA0354E745BFDF07F1624878D5E2EC6958C430B093FBA511AF5D1599C421FCEC5624C3E6B025494CDD67328A3E7ACF189A894C81094ED0DD26131311B5E1A2DB1E7665F631AE4E9AA87540D0D03CFEC23C18FC0E8CAC8CE7C57065D1BF1DC9D1DE9B07A83227481BE92C48F37CEEF579C7F48C0536F634C64EFCB6F3801D8DC75F1C203CE49C9FE47EDF0A0ED6F5A322AF9F84CF7F89AA510B621F54C05FC30F53163D15DBB14767E4D14FBA76E28DE123041E9F5A23F9F2E705C59971F62E9B2D4D0E4C8B4552B8BEA499C0A6607D21D93CCDD540F16849039C78E5A44C55DBBA1AEAABAD700918BEB5E134C3445AB953D2585E7F5811640CB4C64FE0EB310AE6D53652D5C6F9081356E69AE9B29BA30C5E7BE59B776EE45F2D8B3FE517178F266DF5DCE2BCD4C097EE1F1B72F8808664768948E7D8426B9CE17F1B1D22A3AF0E4FA1DD768A5E641B51D0CBACFD3030585461A6ED99A3451A6E2C415CDC760E7E1A3AEE6BF0A2DEED6DE7223EE46D6B45A38B22DD5FCFD4D474322292522E3BEAF7F48F31339A4C81A21441AF438A20628FA55BC0802BD70B1700C541E357FD2F6F00961921CB0E8E9CFDC80C3E9F9EF6227D1F7A02414530BFCFEE950F2D350C7C59A0A18E77FE8A6F76A528CEBCC04A409F73263BAF858AF8A7E1A4FE63E0F14F6B22C15D4D0370C93693D12ACE67645EB17C3EE378C3F1E00B3EAA675DE35B9EC0B04352A1A672FBE52C00258464AC42275384BF9F1057876435A9276E3F736E3AEC7C19146F71BB87565F519A63EBA44FEE1CEC9673ADE2E7E5E394816798ACD2724BDFBDE93BA190B7C6D308205659C0EF3F0163AD42596C39BBF8C92BACCDA7EAD63DE7C68A072A61FCA33AB0EB533ED4A182C4B09A7EDD439C4C54F0F9D59D24C42E767A5053D7E12148ECD0126E5F77731B4BE6F50DF189A74A4927CA038C8B3C269E61DF7E5A3AA93C0A572AAA218988F5FF8DAF042F7A58CA36A069292812F8810374B768EDCCFCBA337AF9C362353942243146BED5F62921A252C378B5F9B41B6934EDBF6ECD7123273818276870CCE45B81AEE4C971FEC69A75249626821F05651786E952F3C533F525FC8B7B5F6EAB33C320532774256C42C01B7205AD6265ECB324F364F6785D5D54BCDC595B252BA48F4933C74F262A680E908D6217F81FD778E240D7ADD32B568DD00B1A2FCB2CB70D39CD39632D4883546D2FBAD0748DAE6D34E090694DFFFABF7705237947C6C8BBFE827F97009544A56B3FC94F67A972F2C5EFB19748EFF9B8ADB783E114470A7ADBBD1595E490846DF2E9531BEE796F63A1166850BB6B1FC2C14F429282EE3AD5B213835E8445F50C8711E06296371F912EAA6CBB756BEFEBE373FA80A7CE147BCF84A12E39FF68EFF2A0D40F44A304D170F20D49EE207611E67EC1AF24C244C49F842039DEB0728CBBDBD50BABB546CCE699E32FF668603387FCA38ACE7C89BB8BA142F52706D6898888D6BF4F99999E0003FBB62CAB4536B066517C8F7D022DAF488FF6617304B96D9CF3D45C1845E2443C59C3A6F6B3ECB173E9F193421AD77C449D96218488343F9E7AFBAEE2139078547CEBB62ED5FB12024C936E9D1F56C1852B392346F3B92219D09CA83E89F7EBD613518B29DCE4BDE26686F75617CD7E7690BFF58D520B16D87F5522F4F8BCBFF808BBFCDEB16CA08FBC9E71104E2923602D027C1C3B8AB9EF1F550C138970A9C21AB3A416A23BEFDF57D8091BAE54A636CEDD05596901D581308048CF77C5A0270D8AEEFCEC454CC1879C0B59C03AA4A2526DB6D3C2BF48482C8B47969C49E480F11ECD54C6A121CBBF1EEEDA08DF309F919EB484C1718CC373C8F29E9A8DFBDC3A2B64E3E3C91B5E5819F7EC4F8EA190F40374B43CF65D8EF9ECD2430C171123CE4FC643D3B1296A8B35DC8F29C4939BDA0D6BA4E5681A0304FC0B131D9CDD4E92FC48AFA4C6771F34D762CF151616F7E44C00EB5A553144FF3D2214DBFECF85205B8E060C4B7A9039A5A99C62A2C95B5FCCE42888BA45EC5FB1A8E6D7C49786445552370E45116E7DCA0129838B9909648A6F20EA06315FE643D660DAAAEC5167B5C204AECE536812E798F69E14F634CA9EFD711AC7B1A887DB433AAF6AB84BC2650ECBC864894B6B01413530163B9A0E0C93E7D67CBDCA1AAC561A35E4605BC37B452D469E01BBAF52CCC9E08329875F1558D7293BD73D7992CF3FAE2BA844CB4C3EA1BE890375ADC66CB1406E6AC043C02FB6CCF652186E8D6A59ACF284C0A4ACCF7DC8F7E57A94E3321B3839E2CF469EA737EE6E8980549B76829B29234BD5F877ECB298B21DEE6B37D5E46CD3403AC854FAE1BB3E08DC7096491F6CC7BB937FF4BE3FEDF68CD6538745BE7E760FBA1B9068DEC40641C3F3897DD9F90EDEB78530F6474539A9F61A0EF0528BE905CA2A512AB8B3E98CA0F0F7860E14B9412266F74B88CFE88A99935B38C4CC18BFA4791CD3B5575005419528735F9DACEFB259D167C250F782FFED6992436F35D8BAC8DA7BBBD8BB525F614A9CBC54CE98DB4367290035D15E957CEDCE9C84F52468ADD40F1788B45792FBEA514FACE15787C6DF86867A7E9BE693DB1C8876CEFAB16E60AFB71D66693D046C0C7ACBF96FE51188E61F63289DB8D1FF68FAD8E979F44E9C4907ED2DD3B9A11C23B1E7D472DCA16C3117E29333C1559AAB77B6F8A2928F9CA8D8677969D41668D7FD849ECC63EA7887A097B957AB6A2EFED953F2401402C249863E1A48015763F426CD818764B87A5EFBC29FABC1420FD78852A1BD727A634E2D7631B4E8D13F653E9AE9CAF331C27179E42233EDE93BE998524A329BEBB41E16943FA0B425B3184E6D756DAD71E4F185A601C5AA07468CFEE447841524999292C6A366EAF6525E276DE21F2FAC66F938015652AAD176419143762FC7C8C67FD0ABC69443C5AB5728183205B8C4C2197A9FD0EBCE2BCABCCB92ECE940534C4308E93F3850072784A16D4AD96220C1E824EF9053CCDD76CA78D834F1085D91AF9195A029E1E7445A67709E9EE2919DE4BCAC1C0FD2126A432D54E8736BA51CE906D9B784F43275F88E61B5E05A488BD7B2613E38D832166F4D236136FF3B88D0795B9937667F523BE902BC11604EC956A00CA3EDE437DA9BF9EF64C8F2288E92CA2B72587FA01E0E09D4AA606C8BB2F92CB9AE4C8753E910716EE44FC3DB7FF5884866463B0D0264019B39C4065CAD037911A44C0EF78402497E3CF7318F12FA666F555511A68AEE13448C3D7AB7E45480DDC241E0CBDCE2299E497382DFC84B7E455965CE6F9C9B64AFDF6C89E31482A0844C525AFF963280D1E00B4DB9079EC897E3DA2AD187FB81006F09E35E2A00B7B5DDBF6383A0F722233D1C8EC17B17537CA446CB9592AEE7CDB6D76C9B56A73E0B90C521BC745221FD083800899BD6CDF33ABBCA54235C522A744EF6F3A990853958B0C8C25320E3246BC43691379018A93CA28F69FE315C20E583C58BF0748C4546D89760E314F2E9A3222D641D6B4B963E4949F5BF278A1551BE72B2565AAE225D877EE56409CD9DA5D0CAC8E191822623B4E4AEAF5FC3E3700096E0C5942C3B97E65D138AC6DBCE6D8788535100CC0089017545E5697924F3A0EC31FFBFEB19679F1431DD0A607F173DD466F98266B1248D425B7E32F0360047D58BF1340BECB1126C3818DA4360175C6D7D8CAD5FCC1BCC9DC36C4E74C4FDFB70C62A98CE75466278AB3AEA9E6B79D16C4C75432317B375417DEFFD5846584F0AE5B05ECDCE6C99B3A03C216BF45866B1EC12EA0A5F7587C6DE1C497A2E08B85F385B71569EDBD406D93B3B1D0DB2E7F557561CD36E737C2B43E298AA9739004BCF55D7C96CB1438F2BD7BEABAA9C64B58932AEA808BBDF30FA4D363DC501741CF8A43AA1039E7B46576B8B299AE300E7BB49B61FFD29D0F814857931FC2AF69E6988F12C6731D619C20DF1D7096DF5C656C765A35DBF099EC5AD97B54F5A40128182B0508A6C5E6C7BBE9958F290D76637909E4759AD778E6924255A7AE038296127F00124B51F5F3742475E68C2BA4B2BBCBF39CE7463999A2C95569FADBAE6F80CC073BEA063CC5587D9DB5962C9B392E6FCD143F95EFAB1F619EFF7FC7CF64FE3D195916CB53AE2A956880EBD9EB199B87E5FC55D497FE261DE93C129564E90DF1BB21DCF41A53EDFD430213C35BF4D85E860C04C06A7CFE8126CE520C1286A24D6872949B702F09581F8351658CB86D44C1629B4A0F24BE07CCD39DD21D9AB8DD1B082462AB67338D0326B481CB4BD541D25DCAC6FF5A98AAD4B5C6B50BA0F7177C4D40964B46E96EF198309222D50005E1ECD5458C71473466EB2693B3EA732309B19A3EA582099C4A16BADE4850097BCD495BFE8DF97E1FFBBA29638CBFD8D841549FB213EFB29AEA862D6AE28FD152820CD0AB67965C2D08956016C4DD6D24F94BFCC9A396BAFD26AC085709F5899C4A6831E8DF072A96A05DD8B854963BD0F2346F13E5FDB7050BEB13B4DDDE99B2A60BB4550129FE53E049CA595351E29A07CE7828F387468AD313E11040C3C0C2F42DA056A311FEB561DBBB9910F080485FE31B1A3C46D44000BC619C578B387C7521E4CB99000AADAC71BC2FE7CE8EBEBD9EEDB294702EB294E0E2CF639B6766C12416A3EEFA84CE71C8D630851B5FC5C57F80F92A119F07CF623DD1CD80988C7CE6B6E1688EFC9226050ED3494822309E2049C0ADCA80327165283C8C8028769134D9FF9DDC6769E4EA422C5777215EF7006B8EB54FE5298D5386EC0AAC906B03C5E1180C5E2AC69E1C93053DCC41921E66F976CA35EF242F2A26C86F311F7B998BBDE5B83C547B4039F44B0DF8ACFD24F2928D4CFBE7DB647ADB1FBC95A7E2DB518A5A370D9A74619283F4F77F159BF5CAA1A489631458F8030C645731078489A144DF87BF847318F420FF5A611B4AB8D7E3E4DC2DD74F3C91E7ADCA32E4D4EF99C0410664A32B50A85D2AF82006C859378791E86DAF7C94ABC34C166B9AD0EC287AEB8F8E275E45C51FCB7EC3EC5B65668A07F8D8DCDF19F201DF1FD0134B3309212EA13CDF3E0A25CE16201B0A69C2830B7AE5F7F8A95EB38399BDE01FFA81D642147D2686E56C213C42F3866445F567252A47A95AB5AC483F2BC6C9E269A9F75349768567159BAF00B0A5809ADA84870721AFAABC61BB2263167D70B916871208C64794C929BDADA24D89393E40747EB6F5E4316FF5360AC876F726224F5319332B90CFDDC2AF9F401EEC6BCC002940EBDA36AD04905B209DCAC11C943DC58565D53E260494E7A3266533A0B6B98D21D1AAB449F08981B01B2EFBAB0ED4E7126E54ADF47F5C8C45D3DCF2C65ADBC8989FC7D5263040CA402B76897811D409D1B04A0C80A078ABC9C4567AAC088F1C20210FEA960236D485728326EE3515B05BECDDE2D1FDB5549260FC023A5BA9BB775C14001F88A4C5B35BDCEF9858BB8660D1ECDB0A780FA439E5E38E96BF36C1E97BD80CC0B11A704EB2A73A2E6C0495FE780397C157CC378F2BFFB86014DFA7774B0558CA6AACDAA5D29CBCEDA55CB321D2B635EC312BDAFB30C45C006D8248D6F8F80D037EFCF94692F5DCA16E244D665DDABEB2C39F0011BD0F624E30D2F6853DD46DA56AF67E51D0B34C9D075F5BC3A90393FC8F5E96CD8E029A7901191E66CF79D64651CD6B95870F483A39AD9CFB53B5D1C66FF7CDDDE4FA42405350DAD3B010F645C5175461EBAC27731FA4466461AD472A0F37B531227A59AAB687D14409213EEA815AE4F925BFAF43276947B28F965F99AB15948FE8074F7130F929E481041DC9372B7B249E1B8A5AE6FEAE678C1DDE54520167ACD1CE98EB678DDA102E7F3B8B432228EDD58AE4AA4CF9A24ACABE95DB1F544421B177E30F32443B8A13732A45DDEC167958C4E7A35E65391C59617EFA7E4A18E0BFFF6ED42A494B070D7298944A7A2654663BF1BE91C73F023B6439BBD4368A191E1B31B4229329E2E81949E46F2AF68609AD9A72DE6F75FA4725A4B50012BAF07F460B04FEB6B15483EEE459135B6EBE5EBA62493F23B4B046F1D712FBEC4E9DBA3FA5D0CA2DBCFCDBAC154771B39385F0F0834779D6B35F888FC881A47BCF4C074FF9195B18685B30DDDE3899D3E0D553FBD6EF5F8788BA2E977C93551E92288E2149804A3B64743ED730D265E82534D123563B3D3311264DDFF1B884043EAF01B8333944BAF360F09FEC910F44AB8AB1406FCF4286F04C88250CE337995994A9BE19B0599307A0557F722233BA3D325EF2F2C4504ECB5C157CE80267942DDB304A4CEDAC15915639B162776C4C853B98E9B45CB12D03144696C1DC81F3EC75DCB2C0D7947683F1E39DF344E30DEEB7F21552AA6720D81ECC47EAB91988223172920012B0DA85B78F80027C3FDA06F30E60CDF1F9DAE40188F51DB83767E6550FC97C66BF183E580F55A9FA682504A86C4DC29E81C6AC3973D24731C630180AD764938B71DEEE937DB1682BBE9A4C7D49349B615B688E13F3DB8AE25439F4686217BB31974584320FAFE77E167386C6D54CD8F9F0082DDF6CEEA87673F2D1B5F15A12A8A844D2BD55E7DB2D842E456B321432C62623C4E304B20230E7837D67F4DDF293F46520BC957FD952234605126FFDDEEF94FC5E77D2013D1A49CD7020DDEBE9E8A704BADDF4EC56E2A47AC02E134BA6B1CDA80FA5A0E2530E4866C99B163C3E378CC770FA5E3855CE5C146583D3783474F83187F9AE5936FCD448BC8CB91E2E29965368A9F3B140D9DFA6E95CCAFE976A93C6730B6149CA739816C02F4EEC2600216CEECC8C14073CB6C93A6472119345BB0E0BD96E557FF284DCC19F90784E39AD0EA77708A37DCA7AD9403FDC6655A45028D0393804F7A4249D3F592998DB96950F78EA46592CC53A0C197E141F930F58DF7BE81FED9B158E3F232D4DA926135CE6CD8D16FD88C43623D13F2401587323B822F581E3D2935AF2ACF3E4FDBB682CD9E0D2C09C995B47AC930AAC36CFF6C556B94E1DA0561151EC280806EAB7F9ADD950B791B720DA3442BCD0BA3528FAD1E11997E3FE8DDD4496981630F6D664960E5DA44984A2025499BAAC975C12F57CA9F5F425242BE527C64CC062463D03F93530157A256DA1575AB97EA7528986AEA76D5B1EFC34A81B809F5979700EDC9D3BE902C28EBE1741E1F1109F5FB1BED02631FB0F25867119BC63D6443A22013C6B38B1E2231DF0C5E1CCC1B05E34917285B003AA9E13011458B2F776A64A63DB3BFE85675F8DA25C8E697D594A6F801E78EB375472F039DF556B74FA908260F1CFEEE87B938CF6ABC4717039DF7F29E31F503CD38BC3FA6441A0CABD24C7EB9685C1971EA977CC7166F3C6FC857227F04C47B239BC9B66AB1C900CBA95637A72948037601877D8AD8CA60D935C2D4A7175ECE306AFC15344DCBC568EF74EEAF981B4C28AB56B2DE51A8CC9D3F2D61B06189CDEFBE371C3442DCAFFE1C0555ECE43523C5D00DEE2C4AF477C773A4CC02CA63337489DDCCD645E6D10268083B3A148E09D4902A3E15813EA8F6E27FFC022B144454667BAA3A67D01FA2DC0F26FF7721EC6F0FC13AEFFB2F7111D181B57978277BDB694F6F34076895F91A078F2BEC3303AEF47F5EEB898164CD4D80426B9593B0F5473C6B2BB947FDDB377A957521F9417DBE4162A1A3842218EC2F87FA87D4702E2A4766B1A8D14CCE492DB85F7D028D0E77CD29CA26221E1A738376378E1D7D611CA9064D021FF37C4F90EF5CF75762DF8C79474D1CC66D1B655BD5E30AD8C0B7676E8E96F8BC155CC94584E4D5FCB1BDFCED948F8ED31F5241E591DB6C53EEDBAD4B167299DEFD4A9E7C64EAC9AE5B1BD4C0C8BC29915E7B2E0F32407040F390DB5DE243106CD74B6FD02554FCD534D9FA3DBB34133FE1AB83162B5BFA019B27874CA226AB586DB37DB60EEE066E2E71A74321D15254C8611EA500329A050526E6EB229745EBEC1B2E01AAEFA4D4A839DD60C5B5B4F41AFAAFB3DA78DFE5A3108B837BD3F5EE623D878D39AE6C77F4CCFAB9D0F572018F46BE01E0CCA9DFBDD6C6438F7240CFCF1C0C25231D72A2C48EB9B553275B299DE98D02B15075398A837EDE94A85BB834089F969C06B45D5A33C548ACA31CB006D5C7B4B2CEE7E346F96415161D79721A22A29D8B2EDC3ED99B08557F5A170BC0EBB6526821BC5DB7297AF25DE46570F975BA8B5845CC7FFA5A74C201B51A90A2293B45D77D52F90A2B9AB42922379DA819B6B54138590D7E8ECD8B50F455C492B85ABDC1042E1ACFFACA92B0CCC629C1135DF4DB0FC76330043CCDB2E26DE48574113DADFCE23B146BBE8F5C22D501778AA5DCBFEE4FCD0173BB60EB93A0796E6E2E4A13676B39A5BB5E4D7A3E292DD20917CA3CC170E12C5C933036A31D80080BAE9B45574D70B5282859401145DE90810D0DB0D6E76A222D36E483C3CD9DFA0923696B024F0D06ED83DE0E56F662C3F0884CEACAC9A95F6632889420E3E57224F43C6EB5888DCC95F14041B66096219D49B3186C94477432D47F605788B34F491FBA6657772651BA8F9DB8F469898315AF514FCFBCE15FB82AC5B2C043346B152E1632635C708D61A000E420813C3A31BC1DC1352EFD258244DC3454157882E19486D6A74DA1021A0431A2FC43D03B7FD8993422D30027183E8B2BC727DDE4AECE3DAF454D6FB7BFAA4BAEC281100C2A59D2530AE67421DF76D8E9D01EA507544BC8799DF19FD2FBCB214D3B80435B5BC9040051048B02390EBF080DE1111178A915BEB018E3EE5A43B483A1526532CCFB48221A7319EAF8AE2215C37D7A7684FB7B924D9079EDACA56BE7B57AAFA979BC20992A69745E91A3B74911D238033AD90B8C6241F1D72C1CB8B2672841F61119B5A6298D5B34213384DDD540B965A600C682540A3BD8F466AA25E75CA34883E68EEEFEDE502BA7665AEDC133707A380627F92A990E2E27874CA226AB586DB37DB60EEE066E2E71A74321D15254C8611EA500329A050526E6EB229745EBEC1B2E01AAEFA4D4A83E93CC0DD26A8D770423D127B762AF62E3F3BCA02510AA7C67E14B038F075C5C0511878324C47DE85C28C9CCF10245325D5D52717ED331EDEDBBDFCD4DC61A9E63100328197EAAA40DD8600B21E1C8AD0AD1187B69E29FA78FA7D618F7F82B6100C102EAC3DA727F9E322543355DD0128F5420E17564BA6638CD784D9E9A83814EC0F46C6F2113F35D12117F0C93948F7C789DDC46EF7842E95FC78CB961DC312ECB58ACB1EF0D614F2E9F144D464124EFA9E06148E78DEC111050B93F0BEAE9BB408392FB4506F350DB7ECBB6E026DFC61336D130B1EBFC9A702DCD80915BE21C7372A3B767068E27040CC5679158C166C159794AC3FF300F5F9E53C1F84420B692A14500F98C72FE2E52D6643D185D217CFAB3CD9EF9C41BB297F65E164B654EEC777CA127A0173197179A3003783C2D48F7C2E1B257FF189D40030776CCA162E0F130F1798BFE2B588CEFC16BE109B03BF936AC25A28785951E49DB104AB23BBC121C5D5D6BF441E2A49B61E8E201346EFDC76ADAA55CCEFE4BAA25C540483096F36D767112B16009FBF74708EC3E38982DFE9B31B75C09B524B91E64461865BDCAAD85445D208E013874415964E448929D746C1AE26A6B932F919577F60E836BCD7937E677BA4D8134820696116850AB81F22EE3691BB4F306FB9F4029BD87D3C9BDDE5ADC1B3578F099809A8FC88BF3866E9428B6DC2FA66C8FF172A1283B3FA3D76561CFAC53DF900A895DA44CCC9A34D99C46C056243CF601CC3D2E300B32F60C74E739932A2F2CA0B2C91B9C539B885A4A33A164D35B6949BD5EE060BA28D02DF6672F5FAFD386C1CC5FC2E3AA8D1B1E91B8CAA7A2CD45EF78E822DE10B4AB0C4941DC4C01A4FC21BCA8BD1843ED0914E511350ADB4DF15E4561083C59754749A5726637CB64200BB665511F59B37408568F438D8FD0F8BD34BE5B2B789F5C733E1DE46DE6808F06311152E94DE6173B784FF6E0B367FE993993E0C3065925CB492F60F023B00423670119FAE218E54A5CC0C73E08BD6E8883F0FBB83F243868D609889B0220D7997728ADACF39B885A4A33A164D35B6949BD5EE060BA28D02DF6672F5FAFD386C1CC5FC2E3AAC3B31671BE86983D2FC361C7576CB730B4AB0C4941DC4C01A4FC21BCA8BD184BDC143E13AB03AFB8B460FC86564C5797068DDBE9995E5B798B9993DA100D94B05C0EF0620AB84CCD3DF8FE4261FF4BE168B4B471FA03FBFDB59820DFE0BB59532D82B88E154C051AAE9F7C2DE99D8F348F3682415A25EF8BB1DC0A5EF37015CAA780A19678FB2BD1299374BC9F7CD3F416A96D70D0C8BC84ADE068F1CC158D89A2073F04DE9A442482670A75534D8E2075929024AAED011EF7B27582DD1DB65B3EC7CC7FDED33037E8F56BBCE353156F268D9BE25F3982EBB4731646FF7E5A2854A243B2381D6AC9A8B3C40476B25CBCC362DCEE464C4099972FD4A763F48D21A6FE20FD68323E6DEF620F656CF28E41D8E14E6438405C2B22728B7AB9C088E413074EEDE5E07B4994CD2049A185678BDCC0F26D406900C223E3D3D73966F8935A072AFB238380778EC85DED3E9736DFCCF9C7A402173B8C5C616CD8E7A8EC8B9CC837A6C7CBBA15E62E6C50A7A828FA1C0FC246AA805F1E4CA1B6FC1138CB35211FAD88DA43E92D5C73201AEDD60B54F5E5F3875B6B412B6ADC0980821E0A16DDF2202C2097C974C14BC490612D356682CE5CF702E6CFB49F4F8B6318322DECDC96FEDD79B47848B2B517A6A0A519C46A0F17A81817F1E50D36B94BE0A2D1D018602B2645F3C0EF839BF2874DFB5AB6BD5F8B4EBC52574E2E6FBBFE698523E6F84E8906CEB38CFE07B333AAB0DAC201878E9171BB0EB56A753E4FDF8A4504241484214D578263A3DD058187C4EA24ABDFA707BD1004A9125CEBBC8913F250CCF4EF4AA2D4B89D689CC8E99EA12BE553B8DD975350EAE6D121543C13BD03DBDD57ECA97C16E6461C710CF4052B84C5821BEA529C55227F401E4BA9EB584C7EB26648AF893F20E3C73E038B2C76DF8C2CF35EF70F55C25CE8F59EEED9164FDD8C3D453708E101E456346123448D658C94C0869AB7674CE7EFBD6258F1FEC412F8941F11017D143F2C4CF0FCBC32A3002C132208834E3C52CBACA4AED32A44BD9B515936CC0394704099B511F18BF3F35BCDBDD1A76E49A45DD5DA51ADB54014B3284BA7A5BB9A69A60E35966EE12ACFC9780CE7EA0CDF220AA0E3E7FE30E110704BD91D2E08EEF33345845CC663BDEDE1801D04A682119B6E7184BC8EEDEEDCE8F8D62191BFFDBF4852356845FDBABAA4FF5809935FC86BD21360285E6F6081AEC6B26EAD2CF3B038A05381C7153DF51C7A36B3EC1A54AA44F52B80B855C90167BFA28C21458F4715EEEDDC9E43C5D9C23668C7615484FA19E9643032D91CD34E8BDFC213DF36EEAF780C444E50E01E9AC6804CFAA9F2E0BB0115F7A16179A22D5853C765B6A6DD59F2393DF15051182E6EF1700227477F25B4F74B99D0064AD68682D5120D932D827A4C795468440BBED354761639E22B305346FD74EA67E9D1D4A6F4B9F08ED159A62A976180874940B891E189B2412190C85BD0162382767EED017D37D9AC7579F3136D3D38DDEA358FC0D7DA7E2D81AC17EF82DE6BBE5065B37FA86470F50933A143841658747F47779B3C321E4CE4C22363C3F31F2196B65DF63C56FD9E2EC886CADBEAEF65CC4A8A00EC3792AC5FF6691EA37CF4B7C7EC938D0DE37CE22A11E186C13299EA4803085FF7BA0771D7B376E5866FD45B64B9045936BA753A71E2B10FC7B21579FF84069562AC291E11D35235DD45C87A6F7A016F9C24F7D60C01B7E101155C90F0D3808EB0528FAA080769E5E3F6E29F7C4F97626E202A32C47C7F62732DA5BF0B6F492F4BC56550DA1A9371BBBD7D0B1F026BF41573CD2EAFF09884CD0071BCCD5156F849FE6F8545CF58F14B969520ECDA988E531A36CDB5031EAE88850E1F33C4FE43E61B0482AA0B198EF0194EF383ED964DF673FBFB6096C0844087D47B39D57ECE891059A623AAF24921B9BCCD56818F43462E88FC0415F58370CFD8C9087C23304AB7F39B3E1CEF3E035B93AACACF681610BFEA6F41FBF1A8D0D18E91252E938120EA579EE755F8735AE26E651670D344A7178D0327166931E90B35D1ADC9F583D225B1001E50CE8B0791F2E02FC1A2B5631D9D27A79F2E0DB0073CD029F40A2D73AA495F3F844CF22B1C383D70C43D90530F59922BA8D297A3B38B92C21321AC900999094B6E49F5F8E67E8D3986A8D6B1F7F31507288508615F0EF11143344A74B798845BCAE5C3880E01014A37FD18A1025B51A3EADC8A927A52571A2845CB71AE284A8E4802BE0B8944104E858CFDEB9146634E9A40DAF7E7CF3D3D4319C9E6B0D2B0ED90BE7EA0AA987F8A58A9D5BB6B36FE0A6BA8F1388CFA586376672795FB3F22E743C55F099DE488217F97A9BCDF74289975DDA109F0A7530D03AEC15D57DA947AC0C653EE57887745655A5DDF88B9B40B8C576F244209047F6CEE2A0E714F8DC883232E283F9E217C6E66AC6AAA17285BEA81B15DCC5872435720C2E462F1127C3B41BC1405B80FFD4E3B5C652DC22DCB3BD0389D7E2D2168208CB590EB7302FFB1EFB037CEB53E5D1830507C1572D6110161E921E6FFC49DB4445DAD603FB4E83220DA450CB9EB4D988DB3AD6C9D36FD7D50BB8052DE49AC9B174098FF92189817CFA066D9A4098ED588C45148A54D67F8DB0B0C8A17FF049AA87EE8DFE2F4F8B7284CC0E041758F4419C11005EA764B84575FB61CE2E09EDF2BEFD4BBE5AF2ADFB2437B10717F396F899D3E30431779A2B492DD6B578B9B458A8B11AD1E8DFADD3834DA854FCF95F81C4FA2D8F96D3E4F860BECCB4C2C3D10A6FB7750D09D4DBC28FEF753B16F536C5FAA942D7C30B9BD0BE62AA96DF892EC27B8B16A54947441C30EE4E0180A19E8FA094D3DCCFE591ABA767AA6F7962DE2E2373DD45C3C88A7B2915
\ No newline at end of file
+EFE643AF98362E004A0B709FC1212F80BAB72360DC142D08F4004331133594E20668B50E06A5B790C162021C4BA45A5150DDD680E8AA307A3BCAE59F8EDAE2F3F3BE296208BF7BABEAEAEDE0CE8792AFBE8A31AD3BAA5F06C5F6EF7962292BEBEF612077D2C54BF73609030AFA17C3DF7D78119051188791EBB4D79F2FD9488E81061B730D1F58F0054A00880AE7604B8CA1145F2690D2F3EAA18F933258BC3923C608BD8C16DFA2992BD82C9FDE1628C94D31A8B3D3F98CD71665FCB0AE232FEB47447B8ABE33344078508644FD8BDBCC177176D506F77609B94A8AA1558BF53F365DFA4234C7DEA81A08D9A578058B28D2ECED0A902CC0666D001BBA6E441A56A5A430E0F2EFFED4515B1EC7032739BAA30F57868E734BF72594331E00EAD996AA23D50A59A2D4151B4B041E9400D595CAEE695F68298535F14B29271C1C54CC26B74DFB34B311B3620001A4BB13D3773F250616F48D2548F5C24222BB073C50336CB9A87481CE86B59D3377E99B2306459D775DD67DA3EE957C3740B6F777D198B88A27CE86CB795FD742350A7F39F5FE058B3A382D1B8FE121EF236415EFFDEB739B19A6EF285262C1F0C845C9A7B1FADABA3E2E87AE3175A1C610FFDCAA148B32D726D741F7DBB8AC0D0E4D8BCDA02F6F44F1A2171999237D22EBD42977D2C4CF4E1C8069E7E7056B7A9157AEFBE82B4DE2655C6E75C8BB68A9AE2AA2F97E66B30B14F9C79C3D192AD03376859365CDD172CF03EECD2D99AA720EB15EA176F757009C01525768919D35D71FBC6F807BEC94482214C91FC07F2AA22F31C56C750A0F88DE5C67A312BEFF4DD509798ED7E030492A4EC1ADA3052442845FE367871E2D52B4595016F1F8375788BF6C3816DFC8567C5B8106CCB8DED71D8C2E216FD5B2E9E4C74CC1E835239156FE6A580B57B8C279556345B70A0683BD6CF046039D1D5F3D98383B3DDFDB43DC1394ADF3C401FA87D11AA011DB68CA3C6FEC41538D807C94D7CE8EDA12A5C734543227D9522683C155B54ACE43FB50B2A7559E4783F5F5F796504B389210B8A304B7F615522AC2A27EC188F5569B0FCB2AE006B22B1DD0FD8FA24FE43F24B62371F795752D026CC5CBE80133BA8DD60B2585ED3CC823C34568EFB7C669117FE8520B21FE4B66640EB747BAB87AD132DBCCAA1142E82CEAABD687A457E800D2DE96D43047C165B71DEF5FEC951EE192414667E370585895303C3606EBA44F97315F2EB2B3B95A0235060BE892C0B3FD7EAEFFB3A9E04568162B0ACC8BCBE37B201CD3CE326745FFB4668943C2CEF294512381BD15565F799477B0CF15BFE9A60630006705661079639C81CF5A0F6966831DC548D5EA19282A980BCE863F35720BA54104F7D0CBD8D7909C06DFBA397021DC816DC1AE686E5736B88F0B6D690B95E538F0383F8E85E2B1F8B47C569E751F5F597136AB1364DCD069722037D084688E54325B3D4D54C52A8B7286A581B72644F2B549974DDA1FB0439DE1C52427F6B1CA847BB206C761A2F3A3CE20847DB98F74F49FDA0FDBE907F54E60D5081148609905E4B2E09EF4350FA0362AF990D14AE43D2CBA05AC537DAE102498B52B4F0ED2FA0F43CCDA991BD4BA62BF1DBD7F460B39DC225BCEED3203BCCCD276F037C15B39408E07A7A37302F266DD3CBA633CD602828E512B0C5DA5ACC5209048FB92AEE387DF95C3C6F05242DB2227129AA235D569360A31E2BAC02865DEE3960400830C56AEBC052CE37C76D5824A84EAC91081D5ECE718839E4066AF477750308FF8E8B783A035AD99EE7F2EFF0753B9555DC13127AA3298373DCC394164176BB991E9FDDB7602058E53AF995C7CAD3D2EAA1B80FAF63FC240735B0CA6B9BC4ACB3C40A37A3F3CDAC9E3B1381ED9F21F7CE334D87887A0BDECD8F1F231830CB580E5DC301B03018D899514B93787BE604D7B9B5B41E13EF492A8886C50B01791154071DC11252127EED15348AF2AC9A3A1C66CBAFA68E709A2E0B1F32B2DAA5D21E7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291D1BF086753B46B24865EB05E5C5AFD7498F949E92413D905EF9564FB09373391AA0475E2BA9AD6CAD5F316CA79096C59660B2941DBCA200F25E344DCF2B71298766892EAB62E3E72B47778FA80334D4093C2E5BE133B9C13E1754C16C3C31EA17AC5B1E9D6A82A84CE7537F2C16870AD6DB7EF435BD027D255F04F074283E759DA2452CBE19E99BADF3A0D6D50E32F36A61B05DA1C8DA466B39282E142E69A00B871C872FAD02993D2468CBDD3AC7FF7283996C8AB9FE864DD783D3529AD101AA7FB8A4178CCE6861C980508A847FBE06051F7852187CA86C14373BBCA898A8E937453884F5DB723646B9152689B4E2E18164B5B793DC6F15B3FD4191B1462E9FC9B19759D534CB09F6F125C4E33CE208C94E43AE4FC4D051CE15EE294B52F5028266CE310FD83F504DA7C0ECE14FC8D1E3E4A89C6A7D638FB4D68354A92546B5C7C4636C0D635A520FAD72C8AA97BC1EBA2895FCBB3FCDEB62246A3D9F386928F97EBDE09A8743B4505492FF3E90ABAB32654959880E4A291F010B2DBF6EBA8E64952DB68AFED3774D563F9925D368F6EE0F94EE3337EF9EF80931AEE947C115718A1148111D2E69CFBB9518FF48368698C089AE59BFD38F9B69F4492B81FFAD9BCE4FAF291E08AFD68C828E30F692E613BEC38EF52F0B4E855DE72DC964B0D49D3414B3B67092AE1E8A862BE39B890F427833BA4ED53D42C1EFDC329CB3062BA3EDFD921240D304BA96D3348DF612CDD24AF7E4A85972CD448AD0A44B00814B9578DA2EC0BE52D0F8305EBA9DCF2486186F0F930E10A2976A942DE435344893548872117EF5215673695784460B9942C9549B6833E7630FD5B8ECDD8C15F0D8EB42664BFD471A00BD2C73B50119ABB0E2B3C9997BE136AD5495D18933B802F5D9CC21A9D02081A622524D1AF44AD3C36FF281F317A16683D35320769632AE5D7BE73D9CE8E2D4A04677D521C0C3BEB2DEBDDEF1500A91DA3BF261B8F3E450691E602BB4EE704E2B16BBABCCD35E06131E894A53C41DFBCC4A46434F616A109DC664FED07E6FE8FA0C6FF0B7A11DE2AB65446633DE634B9588073C905809BAD32DF3676866F23F6CB9DE77A83E8FCA52F012E56A7764FE69A0A84ACBE85F549FBBC4E8DA632FB7E70C2035C772ABD5296AB4C872DE25843CF93EF8A502938480C323822EEADDAEE431DF3711F7043AD4DDBB4704D243B6DFCD7EB629267AA43894A11085F07645EB03A32B61FE29527CD222994A21BE8F108F7672E220EC3BDE02F7FCB0A65591941489CD7727B981A9F46637789CC40EDB0608DAC79947DEAFBE2CE39EAC9A9C0D4895C0FF0E5E7588125C03B9CC6741950FFB209CC38024489C4CB41A52A2551F649D742D781270544ECF2171DF580F62E3085FA1C8AAF44EB05C4BED224BDC08E52B8E699CAE7B5902F7FCB0A65591941489CD7727B981A9D81E01481AA205D1287903F849507EFA77D0B39D1C198B0838604DE94148E3EE9CF098D5AAFF3A4270CF5E4251AE2C324D3C39E648D55ED4C77139E5BEDA260CD6BC67D1048DE879B19DCF56E4363973402A6B18DA8CC744AA90A843767BC4359BBC152EDF0D61406BC69F8B63B934FA08AF925BAD881B25B104B8CA928C154513A1E59DF691CB46F76FB75CB277F3CCBCD85F97B44B97DA63B68DED02A86F7602F7FCB0A65591941489CD7727B981A96252FA784009C02A59C68ECBBEE349E20A96B9E399049DB5F2A4DF8B498EAB0657AD7C2D2C0FFCDD5FF44B93C94DA8277AE570EF93EF0BAE0B417B89A2D5ED8DE9ADDAADF40D3E576D532B4D3267B5FE02F7FCB0A65591941489CD7727B981A98CC207739970C8F2937B4A07FC77ACA384F054A17C2A6BCD0418379393223D743C06564982B14D753CCB7829F134E6F09557B191B95F66E76426762CBEE31889FEF3E74932D04119DA3EC992D336C36502F7FCB0A65591941489CD7727B981A9FA91688618D3A422FACE6FC0018B3DF108AF925BAD881B25B104B8CA928C154520576A4A462BA3A96C90BCCB76ED3A560C8A762C9188D02E07C5E9AB26C6364D02F7FCB0A65591941489CD7727B981A942D4B8309F970B5496F9B3C2864F6E3CD68BC9C6EF87278FB4BE5016989260D002F7FCB0A65591941489CD7727B981A96DE46850C2E498000B9AF897171AB98902F7FCB0A65591941489CD7727B981A9B44EA8F4AC8C08E6A854AAE0FDD94D980D76D0C12A318268690089B241AECA731F51D75BAA8EDBD39EF13D490C2C257C18236FFED80489848B2BEEA20111F24102F7FCB0A65591941489CD7727B981A9FD99A4410D814A6DD9761FFD09D55DAF8129619707A564D8947C1293221E826E4D2BC8C70583C5E744C74D0FB141AAC502F7FCB0A65591941489CD7727B981A9F691A50DF3653EEB0987909E1E355858FD055BCB1D3D5DFBF739AF033715740CEDB7B27D96D6FAB084CC5A592F5D345A02F7FCB0A65591941489CD7727B981A94E237E414F7DDD7D613C1F731458453CC83250B907675C7C8257D07CC03DCAEF1B263AA437DBE5C2B9E8490CD26F3C2FD277625A9B58528E9D31E7921B0B443536574806CFEC4EA6090F072E480AC37381A75E6954C0171573D728FFD4370AA6D642848B685185EC81127A19F4664AF570E43631628876CDBA595103A7FAD5BCD6BC67D1048DE879B19DCF56E43639738A1B8C7453FC349723B7BA45A241F5BADC4C71D1CDF742B73545888CDDE215B4B89F905EEB0BBDA8B4C4FF093A132C42AB967CD8487A1F3DCEB8F530E3BC735894A11085F07645EB03A32B61FE29527C90ABA4377743B0F3FA6B76B5BCCAA102899D4B0352F1DEE1FACB4DC4F2E62952E863996D5DF73058CF3CF153708A99271DB3B6B3467639B93051FA0A53D82355F256C402AFFEF6C3A2C807CE4A3975D5FCB522AA2323C3CEFF53D8F63E92F7169D4932D319D430247BE60465D34A53F27C276B9A5F12A4121791F16F3369FAA0DB08DD4F8E8C27A3EA3CF7C6310EED53DEDB4D0ED7E211FBBBC602054E2701211BD15565F799477B0CF15BFE9A6063006B2C2CF5AB7F8B43666153A8A16EFB52B045BFBD7EAB60B9AB0C518140E3C2AAA6F35613C6D8F3BAFBBABAE48EFBDE5D299BFAE30FD8DB6EA8DBE1117195673A057B467F1A80F6C2CC818324FECFE8ED21B93FF1DC1DBC1D457779EA74E50EF14E6D1A3F30DB024233330AB14B2D061FB02C848E91CC16E5D887850ABCF458B2EA4325ADF366592A8A67410392F4F256D179FFA511FD1C44FAD45611C5D573EC2C4E1AD9D9EF734A89D91D64860DAE91D5161E440E4E7212B69C621E6B24F46499B5511134793476AA5DF9C1E5D5461422692AD80A82565452591AFED50F5513CC67B0C106F8D24F45C46F751F5C9E878A158E4B50B86495F2CF37D80C726BC46D10A41408E34868F8CE0F7852C6A50C5F79DD02A76EE733D478FE4C91B5B0EB1876E1E58C4F8597C421D5BE7FC859D13B849398FDF4A45F9DA57DFB698ABDED94A11085F07645EB03A32B61FE29527C9E4AE53B099CB8513CB5F2E9D5DF254E02F7FCB0A65591941489CD7727B981A9D5DB5F056BF83545055AC63A2E9564661876E1E58C4F8597C421D5BE7FC859D186117924E6E576EB0C4704CBA69E6E3952AC346432C704FE09A657BFBC896CCC02F7FCB0A65591941489CD7727B981A9BC677745E2182B983D9D63DB0C08DB778BEB4DBAA246D99247108D9FA08154ACC14502F8A717D3A09F24E3AB1383CE0E50D6C3C414568EE3FC2902DD64E654FB0A49F2C7A668C8445947C917A3271D633BA68F7C47EFD7A2C079A992264A504D249657EB6706E569D6702616961217CB669E97C474E6BAE9AA66A6114EDDF7CC4CB0ACB61CF24AB11AF0940E03D210A32226CEFE79AA6831C46A0C5B8710326B23D9711328161C20B46E9299A8919063A82D5ACE11E3B94FCEBD37480870FFEE9FE0482B2506DA714EC6D18AED572D3D85A1262D45D1A93B7464C5EB833B6FEBC8653C56085C3B9F12FEE612188FB8BA6559A5749F531BD56EEB34F9F12E6440EF844E42553AE6590C6ACCD31D2F840F56565D69B2FB38A43D3505DDED4B49477F53024252E555EA80ECB52381AB5869D6400DACB4778E1D9F306F542601AE68285EA143512C9F84D51DA724D7D4E44D30BAD85D73FDB52E0225A942788E393A77955519B971B0E52939A55A6EAAA7440BC24EDDEF1A50ED8DEC7BFA5C7C0F63C336423B75D125BE0363318B8B433B3624EA3AA0D06A78282C7F4199D45A41147A778CB2B4DB69A9D7052CEE172F17435BA495D8DA92E29776B11C80D8437B993C0558CECAC7FA1ECC861913757886D20420C3E9EA2EC7B5DC78FD036C61BC9860EB91492799F32AFC13CE89F4701C444B0D53E212F2B9A3AB1789DF8120CC1B00BC89BBE3FB70554914D1029A51A47B896936AC1DA446756B502F2E6B9CF2175F1531600B24D5106E8A29A3EBB7D4D4737EC1FF30AEBCB175570B5F59F8AE55A74259944F350A37E4B6153B4A1C24C7EBB93EE80FD5E24A08801F5BD981A5AB34B3CC236F59EFA5A8F5263A440E52F919D7851B0C81C09DF6232D731774FAA90D0A9379536DE15C568A8D5D304C529CA886FD8841BBCA1DDBA389F1DA9D7B098A5DD1DD34E4B65D550BEEDD00CA0B7D9D55F41768F0130E8A3BC03914F9BCF5FA6BCFAC72EFD777F56F812D30FBC8B576DF5729B028426EF39A7D9595393AB794F3080ABBE44F197BC6AC77542D4FF7E82C5F3DD0936266DA4BFD82E3A0F54B9FDC2C3E73D1DF7796527DACA91366B2299427CE395BD8FE561B3C37C321318C2C4E1AD9D9EF734A89D91D64860DAE91D5161E440E4E7212B69C621E6B24F464A8873832843774C6DDBB76147C010E017E5EE54257287CAB02086170A792205A277E2A18F9C2A7E37A3FE01722BAF063981B1986594FC52D86E778B53FF61206E04487125BE2900FED0C8044B40B69E7AFA1D07194123D66D2225C2B975DE8BF09A6849FAAE7DDE1440139C20801C391F49906ED4504FBDC80CC3BA5FFDB4CFAED5C688BD7697ECD7417FB5791F3608DBFB465606A80AF120377ECB30E8B5CFF31B8CA83B73FCA2716590305314429A79B53AAED5DA007C7B3D96BF99A296CFA05B5B4661DF78B131A4BBA57B64ADDF2BF30FB867541D12B91BE54A25AA27E47FD6EFF63849D92EDEDAB03FD065D25CFA7F97BA269F0909F02DB614BD573414602F7FCB0A65591941489CD7727B981A996FC994205128AD0071D6661C193FB2C438ACB246D7CB7F7DB7484AF0526696A99FBA6AE8C33252E187AB9F7A84ED0AD2428290CA197A9DB90D8256D7A5BC26704A1EA860D075A6D4C35E5F9B05A85F3A6E76812EA801DA832AA17CFEFC0FF6E65C063A09B87553D0A35E4E48D6FC2CF26D916425BD03DE883AE3D2F865D96D294A11085F07645EB03A32B61FE29527CF3C710DD7CD27247A79485B3692E9EABB3998040859B9933D0D4FB173ED7AF272B6B72894FA2A2D9CF38C70E3FFCC129AD1DD14429DCBED050431F990B6688554535F6E7BAFFD64C909C3ED96AED4AAEC3047E2BE71372CF3EF076AD49F5336C438ACB246D7CB7F7DB7484AF0526696ABB37F81AA73A9F1ED2BBF0AD03040EC880AAC9E1C43379236F4B8718EE45149E591F4B965BB384215160546E6E329140CFE0F1C2157DB5372A8E44D501C6D1BE3820973D39B9E9DC47B1AC43440B8F510C614075670898E8A29713A939B6F62937B939A13321B466D47CA080BD7452CB10355739F83EE47FF1D15516C6F0787DBC3BE0D039713A4C4ECF9EA1E29CD611B014E0C208460FAAC757ECC1C16728A99C7E1618BD00EDF037C4938ED14E2057B15F0392A16DF0F9DD894F945453C0EC06E3096811662E5309858D89F3B49FCEC8016021E2DD868BEA5DC0EC892F81041221E8AF1EF3C27D7192D096F7E323235F1B62DC2D3ACC91BCCD742B6527400153E5E0FA106F47CC113F796BA0A499090DDFA5A3401C1551D21A3F24986EFEBF08AF925BAD881B25B104B8CA928C15457DC1EB66C2EB0332B720AA4B5C3FF1DFBF2CD353DC8307DCFB935C1B6C34048604491390F6568FC034D99D4127F14426A20EC2137E4BD7F317F90334A6F50A61DBA243109A2368AF7229B724D84A00C377955519B971B0E52939A55A6EAAA744C1DF3E31FFD083D6BD59DE4919E99B4BC1E42D9FB041D119BD39FA38369BDB6B9EFCE417184364814CD45A8369AD3FDFFDF4D784EF483E1F0FDF81FCAF59C378DBA5BC2639F83B230A23F41CA4B2D52617E0F237EEB29DC76303AB6FA05DA83602C0C17B921537DA0FAAB07872F80BE4905D42FFCDDF9A3E2CC27C20F764229B77955519B971B0E52939A55A6EAAA74490DEFDF99D1833F60B7BD3EB1D7669680BF43F0D598A85C25483108E21CD1002F96BB9CDAF8F5F948BC8CC10803AAD47AAA1524C1DA0811957CD156EF83F30108ED854495BDB982A734BA01D8B963C44E2921F622A9479F347299C9456146979889E9A1E78E66627806EAFED304CD9B412A505F9DC3014EFA2E85AB377FE8C293F60BD0714165D33E435E4A3D9AC66DC6E7ED54A766716CF5BDE0DA614A4EAEBD68B804CED4F1F64D870F1B34EFC5060D4C7931B4DB876A2EDBFAE7C5454D47C277E2A18F9C2A7E37A3FE01722BAF0633F40ACA29BAE89F1BF78C883C244A806B77DF4E34506962C94CAE54A7C6CD6BB7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291DC7FBDF6F37D58726E208D9258B06BE2D142E451DB92BD6ADC3014A4E3B900B59F18016A1C132ACE7C9FCC05E42D8689A9E20653A9918A036B9A74E7723CA0A63C37E622674864DA026C1A6BE275B801FE9F3D83F051AED7DEF71BCD798615FCCD7FB1C9A337CBEFBBF750D586B8CC22C67A298CE2E3828ED8D3A97F00235D8CBD1FAAF0088EF29C3C878DCA87969DFAB3F514A8E265D39F0615AB9ED3508510FF217B431737C2CE217656571914DE975F4D5540CB8690E5493DFA60D7B6A97ACE6AC4A1BB61FFCD44BFCFE093930C861B5D28F4D14D1D640FF2B10F8939E262DDD6D403F9CFF4E6A6CBB9DBBD307BC03FA76A6902C8D56BC553A5C12CE1F0B4485F91488AA86B269EB03BBD16664786F24BDC7B8A959C2297FE059D713FB6971BD325C19A4B1E85D46E043778F4306814597174436C5EB2D8BE05DB17276814FFE495C0FF57DD462853AD61961CB449963ACF54F8FD896CB2D2090DA246D71C977955519B971B0E52939A55A6EAAA744E8C4F3B23A7F4D179B5FB1B52404501707690BF8240081EED3019CD109FA3B5D54EC8C6F9D15EAFD84BF72C93366F3BB387052BA9101D9C1444197BBFE1688195AD746666A27258CBCA7746F6B7B2D4DB09136F5F2ED5EA9D48B6355B5982B6594A11085F07645EB03A32B61FE29527C30734FA275F5601A6E7964A5F8EA2A3EAB3B078D56021BA54E0EF60B00EE3C556AC666BB20DE57E1F899389CD636F418A110F832C18A27929D4FB532C13EB740928EEEB0487263A6FDD4EA63C9959F81FE3C7C1F7DE0DB338A706B010E7C857577955519B971B0E52939A55A6EAAA744EE26DFB48EDF8E5D0999EA64FB807E02EAA7A897CF05A01D81537459BD2CC419AFBF67032353567AF1875E195FF996BFE53E85D5508F70E9F79158397D9B70E48604C35CB285A24758A5BAB173C3A7A31A8489015AF8E740BD6F152C01EB250023FE5823AF84C65744942B71DFD42F657D08E877659143AD61DFF1F4268FA374A82509151427E743557B9F8D56262D29A18AFE294133F60F336D1949320D05E871A4E6C86A0F08CC13E0C9CEA8E2D5EFF6C7618382BA3BF9271D53DDF8837E918F5C0EAF12D293C6BDA9502268502587C10FB1B064C0040F69F42D91EF5971B067452FA91D314E709EA7DCEDBC0DEA29B5CF12C3E84E1D09FF855AB1328BCDE724B03D50287A9B52656D9B5FC4368D8BD68E8A2632EF2B2B7B3ADAB00A912AEDB4789FF4EBE69F0B3800A6D92DD6EBFE6802B73AB166A70F811FCDB939D97498FA428487CDFAD5F3CC1E180FAC5CC7A7D5CC5F44031C99030AB0311F3AD20EC6416C64F13E8D6AB3C657D59D1ACAC9FF667B575AAEE7465520E45DDBE275A2518157C0C655659FA6E529A1E117A128651C0C427C4F432291D628116C2A709AFD68C4B0319F429AFF99D83AC7AF81713D1B1C463B83CFD3EB16B3DE367AFADA404628ECF5DC2728BEA13FD86D9803DCDABC200175214D3942F20F43BC9FA8A678EE547F599C634E04C0F34653FF1B8856DB98752CB4410A386BFE3AA01107400FA934FB393A8DF3F78710467D53BA62FFEF8DCF365D54715FD7A1B6DB23E854614F49FDA0FDBE907F54E60D5081148609905E4B2E09EF4350FA0362AF990D14AE94D98580354019DFF27240CF4D35355B63D4F6BA33AA91AEE2677BB4A38AC9E932BC5511B334A4DF6E88ECD47434E7201747BB3C09BE4440BC47642B08F86FB7AA0A8A319136321D46793984483F887368C4B0319F429AFF99D83AC7AF81713D77955519B971B0E52939A55A6EAAA7442CAD5D698776A2EE9B20F1F34873C3FD20932811169CECC7F3C85495CBFDF40D02F7FCB0A65591941489CD7727B981A9015AEFCDAB2E93E71574C7015E643F7A07690BF8240081EED3019CD109FA3B5D5965E6AD14F81B950EC08A7F1B65EDB0557EE36F7A520B06F90CED8A61C9DC4177955519B971B0E52939A55A6EAAA744E937588583F30F0A4B989077D740C528114EFBF4AC8FA3D928A360474DDE632671AB84C90C2DDAFA48EE69ECEBA987BDFFC351C2199CEF4DCBAF7DEFFBA22D24C9CF29C6B4E460D470C32339359D40C9C40A37A3F3CDAC9E3B1381ED9F21F7CE78A84A1027654278EA3A8217EAC2330E00D79AE2D9FD36B483C27C2D98FC12534CC52CBE0843C0586873BD80538EF3D8531A89906BDB07A5112B4E290673749C653C077FD85E70F718F40FF91F15FF9BD7BD30E051C723EF617B6A8F2BDA143C49D468E58DFCD265E9310DE1E7F377F7E5B35557960DDDD73ACD1940BB1A65C4B32FA9890263339E88512EE5C2900DD468D6934A90C05A6CA7844D7423E7B4A7AD304BDD5D8CF00EC5040030DFDB8B286B5C249CBB7E342FD45EFF6621F5121D1DCA6DE016CA4A124C09CCB8A486233594A11085F07645EB03A32B61FE29527C6F18957EC6A3EA46135A12E91C751CC51747BB3C09BE4440BC47642B08F86FB7DEEFDDB809EE0DEF230B0E238417FBE8AED58521F5C44D171F0B299E2FEB6A9A02F7FCB0A65591941489CD7727B981A9F7BC328FB0A0FDDCE8CC8A4202E7EF8A94A11085F07645EB03A32B61FE29527CA6FE94BFBABB8A21EFE55FBE761DFA03BED52DCBFB01C68F417D70B65CC31F9FD9330203DBC29F316EF1A4E35E3C2A8092D86C2D178B8361A92276FCC8197A2D0520E2E2800E7E5D257DC0CC6AF39F0CFB9B5EC47A19A6DC2D95C76BFE20B9B03202707DC779D7DD4049528135B6741D5C00FB2F706B64A84E96B0EA4D9104F7098D29E303513CD55FAA868D43DD04377AFD502374153ED7883F4B1AE7DCDDB7E216703A22A30EB12DCE6FDEB63729F54C7DAFFB652D2E48D8F041030961E81224BDC7B8A959C2297FE059D713FB6971BD325C19A4B1E85D46E043778F4306814597174436C5EB2D8BE05DB17276814FFE495C0FF57DD462853AD61961CB4499CE467EFEECA3EC033AB96B0556BD307A3981E5E7597FE270C982E93E5C6BF3E008AF925BAD881B25B104B8CA928C15458AC0BC7469FFA16B384556F5D45160F677955519B971B0E52939A55A6EAAA744A01BF36EC12D71E1FDC25820C53A697594A11085F07645EB03A32B61FE29527C394D636C8236ABCA0D24733C92C703662ACEA44489EC6158F99B3E88B960E90EC6886467C203FC948FD48220398229C116FAD82E69BC1C7E0FCBF6565B448F024CB0ACB61CF24AB11AF0940E03D210A3B2B3430C919F1792C033470000B76C6E09AE97095E2F539FF174CFC77517F4AC4B727628A1D2113E7004D02856647A9D97856A7AB3B798E2DD8DF93AEB69F3909D34983E64B67603EA58F56CF7895F2DDAA9C0EEABB040412ECD8AD9D686EDB186EEF992F24AF9F4E0BBB48EC1260AFD86F05F48783456D28C6FC72303BA1291D098D7A475CD49C0FFD839EEAFD92F93330595D7DA040B8EFFDD27E70743598FC510C3FF75F4C7665F153EBA393626E4F11E6C0EE7D481CEBF7016039B6F37B9918B9315EA8A5FBD5D1DD0D380C0AC8CB6FB5BB68239F07D9D9296B0F57BB5954BFE3846C46CFDCA0154CF9E59F7483395B1B20F79C224D7F409106AB4EC78FC0D883A73C619CDE930F4B5B45EB20A0F29C6BF53FFF16010EE0E9917DE15B3B0624C553EBEB82D87F460F9A573ABB4E5C5E53D66C6AC5A7742BB34AAED558AAF68ECFD0E7B313F69D92B9455EB7FB8934B73B06B9F56B57A9E6249FA3421430E8B7DE0E3B6EA0B38ED84E6433C624474F88D088770CB3A270F93738A8660EED28F7B26C33DEA14269F6E5CA79333107EC336423B75D125BE0363318B8B433B362CD3AE62F42CA809C23F529BF43C6ED07B0D8196B4B9B66975305A3226C5CC4C2E7F4145F6E5B20A590FE2B9D42629A95E06ADCD84272841F18303F474B054B8FE3399251F7DA19FEEF2E9BF5F533219B91BAF2656C4B0FA17659B11E114D6C2747533BBDEE382C00F881EF03700D38E0C9B564B5025548B6055FE60C035C85594A11085F07645EB03A32B61FE29527CFDD06961DD0F313C4B64A4E7B616F12BABD90B3851942445DF2E8DDA4D2C9E92A526F33DE27808D086F797AAE5F8B26BCE02CE050555B48621F7C453FABD0BA1C403F561B8D99992E3E0F03E6179291D14762DCEDBAF5B00049803F5308712777F16F61C25F85BB79CD4C6AF9B657119E970DE64C6AD6C7FE7F1B14745EA2ED1BF056F333584FD98D883F0F68CE0B397F304A4C33BDE9E21F1C8D21E1E370BE177955519B971B0E52939A55A6EAAA744F7B03B6636B85B4C227C2AD90F28455502F7FCB0A65591941489CD7727B981A9B32B69113650BAE4EC2753C54C01614E7EC3B1C968DF606368608EEE9AFAA0F7DB06625E64BE0609C490726F2DA291F7F49906ED4504FBDC80CC3BA5FFDB4CFAAE7C06E18856A48CE62AA0F5CCE999513C0DA2E91755A089DD189AA4D61DF8C72D68BC823CFD9B5106F1A2CBE6E2704A646F403C5D4FBD31B24984E1D357BD9E3BFB8A919F4B4B12FBDF7CBCC91263480AEE3934D757EE43A3C86BE482A49BD8127573B57BDCA4EEBFB759C3A40A40C5411409CEC072F643B804C0D4C339D5E6BCF421CBAC85AB9B81FA802C91E902F30AFE8B736F3931EC11C6DB30D926CBD18BB012AE427493EF4A0754FBE891CA99AF30A8E12F28BEC0E61CA3B9B99D59228040B5EE1C9DE64D1B1B66239D6C1C6BB4335340D681B35D05534EA15B482CB35949514358ADA32009C3AE92A6D20F5BFE79A3147026318E10225D2C9D356B85BB1E200FBFE9DD30A3F160FD25D91FCC0513986060CC0B785A55D12C36EAFCE8DC0EED4FB88F9FA4972CED5D79C090ECE407CECC087F9D62B778F9532E63298BCC37478A4264CF16FAFF6ED661D3AFE602F7FCB0A65591941489CD7727B981A9EA4E7422AD5D258E4C40411C9B709257CEAA4FAB862DBE2677C4B06D7BA161C58BD9E8A3A9C2D961CAE4E1E266A46749F74A26D9AF2CF144E949D0F09AB61DB802F7FCB0A65591941489CD7727B981A9320A13E6C31A435F446B87754955978C7BA5103570240FA4242D8C1E77BA99D894A11085F07645EB03A32B61FE29527C872D4BF6D24FAEF3449A7DE7E999DB59F4A348A1255C7BFDFC26F49C68713F4294A11085F07645EB03A32B61FE29527CFB27FFA7003BE08F96F6A40B7623AF1F86C216F21CBE5FCF9C91A334A1EA9EB0AF47E40A0B417A1ACBD0B1D1D1A2DF91A06594D8423336350E6A8C76D029C4D3AF47E40A0B417A1ACBD0B1D1D1A2DF91516D57FA491921516CBAEF605BD08090E863996D5DF73058CF3CF153708A9927C40A37A3F3CDAC9E3B1381ED9F21F7CEFCF4B5966E8001E796CFC9A898FD1932B3E29D662540AFB704900F2AE81CEA704684C9388A68F182A0CC0002248D52CB11C37FC03395050550AA37A2616DEDAE2E0042386789C8FDA45D48597ED23A1F949B25747B0DEC43F605DA11796480DFE4613D47BE536FCB57BF2A5F07FC8A3A142E451DB92BD6ADC3014A4E3B900B599FC175084E735F135F18467DB19BF397A1719B8089078CA3F247E87EE23C9D008C713CE7B0AEF1999AEC58AAD334F1188379653CEC1964D8FED2A907B196E7C194A11085F07645EB03A32B61FE29527CCB0E38140D1B74DF0D9B332E79F7ACB45996C1C6E206A2258FD169E24A8E8CE19A0D233653C9F5D962F49A415A9C690D40BED0CCA9BBD5AA2883E8796AD932E90EBB81CBFB39BB02E08AC24FD9B4AEB85BE67491C504D91026B2A67F770DC8C594A11085F07645EB03A32B61FE29527C8045FFBF27F9C4F3C37C2F348499D20894A11085F07645EB03A32B61FE29527CDD3A9E07D5A46CFFE45ACA668FDA27C194A11085F07645EB03A32B61FE29527C7C084B295332A48406892597430A101394A11085F07645EB03A32B61FE29527CCF24B3BCEBCA5BF6D6D7AC1F37E97BA373ED797A94949BD144F20A913A7A2C9D0562303813636F18280E99B8632F399EFE891A8B10F21BD2F1D8EBF665325D49A41D286D4C5CFB6B3D88131BB7AFEEA5CF4116DD5C3914608335792CDB3B7169E3841454D79C59B9A5606B37098E979C11BA3D25210285B09539743E8FC6DA8900AC8FF5CF0B5D838C532FB804211FCA5BC7C93E0803C0E49FCB0312A883C3E069E8169AA98303884CB6C3FDC7D9153157A1D4D1BFF387B57CD1555F7A0C72F4FB7F0DB5EAA8FF791F635863FDB7BD671FFCED925272D4D35F284F37E4A4E3357FD34A01B379DDAF209E2D4CF5ED3D4DBB6FEC3BA80D0EB4807FEC1F1BA3CB5CEC2B4A776732A7E36F8DDA12ADD28473CBE6E7539A0155CF70E7CDA0B0F6BB08F99E0161BC8B1566B319400B0E119AAA57138B26B0CFBBB0FED8FDF26D8FC3BC7A899B60F371FF4154192854D9CAC31AEE0793C8498D64BC8CB06FA021E0FB865D323ABA26DB5A6A742871FC1EEF443D7179B325352E5AC4788481B2A6E1FBBEC02370B22E4E649D6542AAE25C270F1A74C078502270C88F0D19309B97705230969609CF7B711DDD4D515CDB8153ADD6A418AE8D1223559D56D4957117FBEBA67324DB52A67C4B57B00D935C6CAE79705FA8317592E1405AE491840338BCC62B02F7FCB0A65591941489CD7727B981A9E01561CA2391BF8E34F2646DD263ADEBA674091AEDD376CA674B457A8AACA61ACAA188178680E5194C9B7FA52E4262DCF0FEE50EBC63B2C8A1B12F5C5359F322AD566BBA51B253A8170E26EE97D684E9CFC97514A385EB93DD989E1AA1E0C4621F4181E85935E26DA85202530B6AF3BC3DE4221930CFF59813C889BC239EF77FC84999CC5B2E62311CC4415DC7510AEAB26209B994B55BD6EB89CF8ECB87A2CDD5C42E0344629B7DF0C599819307E1B3240E86B6BAFB44B8868894B344E958E9257C246B5E07D9B06AEF3ED62562F2753F22692F1ADC582DE6D5ADB0C291164F9A95ADC280FB835898236EEEF254054D5D5ADBC0B8228CE8508F06311632A776478F2B7044DE266AF9CF8B6EE777E95A721D775CDC1D0007E187C6562F9EABC936AA03540422B3CFD2E458F1FA0D170F82A637ACC809922C9837C6D298995133BB326F17755F47BF7C59D2AEA5094FADBB07F2F9B6D409A0EE17C406025BEE4186287EBA1A5B4DB347B1C5B5FB1CE188396CEE1F774EC4895CA9F4FD7B1CF269394F8583064EF15DFDF443170DD0C2C9A1BD5BFFD82A5A8AA9D64B1B742BEA8E845D805A82AB369D6E253A71D5EE1DE10B0EFD5412C04749E511EAB080F83A67C1A3C8EE9C89DEE11541F6A2285E936EDA2E6CF8804DC1E9407D15D364F4829DD41EA71D19BF2FE9390EFB100A67E600E361370F87415AFA7C5D8DD3C252B9F20AC3E4149AE9B6AF9160BA4B9E04E83AC81F9AE1F1341511C0474D04222873F3498EDF5A54BC69F035E618E1C6AEB5ACEA76431B117825202D954A60872B3F661BFEC2F78526260010FC41C36CB381B6827831DDFD9D0EABC84769EAE8ADCCAD92A08ADFA74FF1DAE16C03079378955A6E39022E6A13EDCB0E5CEBCE8E52672120B45282B3DD8D2469BAEBD5A46F9541AD2B1C9CF542C066E3824364E48CFC47B202943631FAB79BA379EF7DA3B2936FE27BB19467A0C5AF90420095E6E18129458C30C879D1794D3C00EC17BDD26C6BCEE23BD88F3C100BBF1AC6874F60C1CFFA3D48031584A89FC3FFF09D5D63F675496A96604B2DD6DEA46B40DAAD887E19DB42EF62F9283AFDDBC48FDA99CAE5F1D41112096DABD90B3851942445DF2E8DDA4D2C9E9221CDAC11EA02A1A133A2650541AF724F0BB0BD2A4D427CAA857DFE82645BEF1DF5B935B1B57F9A686A54EFFA95E28B8510D009B57782E0845E10B99B9FD7A46545D0B8156FB7C5464014FF41F49E681C9F86E480AED2C88D667EE8225B03A390D47BDE505A99114EBCA79D59D56BBC4755109ABBD01EACE19186F857C2A8C03C51BB34A980C4CE79FD9919D14D74ED9A5107BEABB42780621CEF4385D09CE105354D1A035F0C6B75E31D2E78767BF848FC5242FF30EFC7B6DA05BDA2D1392FBE923EDB3A4E4B055A7171D96336A130D303EBBDC710D0BD8F42D6AF10CAEC2E1A86A0462DBFC732ECB85CB44309000A2732B7AAF0390EF6E65A2337ACBFFCA69B39021196DED7AFA1B03DD7E83A023623424E5A71CEFEA4AE86A0B1DB314669FA3B2634629F01C7A15A03108084C2BFF335E7ACFA0681219AD8B7DFDDE63C80B5B3D9FE83B6B03F63AD9AC4C732617D0EBF4B362F945E82CAC9D399448C28C7A69727E3569224741DF56D26DF00DB17ADEC07EB2BDECA872E90178838AFA552200571B958FB17D57DBBA721EE1830659D8F66CC4AF8DA1AAD23DDA7AD1461F01D3B03FB9698A28DF0A5D09144331ADD9C5D909B8F9A511A2FA3837ADEC42C25D7052F1F3BF0DC47768BA87634A36CFB7567642A5BDE90D39928FD610EF6CF7553AD365F0B2612F8BED1E2261676B6863514097D309EB6734BB1ED45F6EC261AC5D0EB0BB31DA966BF39CA58795E36C0B328B4F44E7206F2A604A80D25F49AA6D24A67622F593A01172C5F639C877339E46A800354A14BA1FB1038E9A637D5502AAED88DB00BEBC4D33221C0F938317209B4B413BED072290489D09189C63B7F92AF3D3EF93D122A6B0409C5CD5206B2F567A9037F46003DBB10EE21B5B34D3DDCA937E4D838EEFE3D5FADDBE575668181048B2D366E13FFB8C48FE47E8A3505CA6F27F2C00ED92A89AC74E3725B325F3A0BD2289F3FA57D5213F8B549D94381DFE4668FA7BFA882F7599A2AF6A6FDD962A2F53BF7D4C5C43456DFFE9A8CF9BBEB313976E9650F5C72EC46AD81A9C3146621A52A4BBEB9A0F4FD6D2D0F5665A6101210853E25E188C09D80AFD1C2C7FAB268270AB2AAF0A7D6E40918F2EFE5D2BAA18AFE294133F60F336D1949320D05E8B4D1094CC8D43D5778B5933266CC43FA41DB18D3E60057E7D7424433FEF0A7A7125016B1CB289CFE641BEC566385259807690BF8240081EED3019CD109FA3B5D3F0C0A2DFF28F9BD8779399B5B97C6F37140E0CD88E56D1D4F4E365A874281FC0EF4DB1A154DF8766F16633F5D501580A3A69161A027F983BF9F9EA42E0FB2ED84B1CD1A09C849E268A80A47F8E1BF5935F0407D997E54F731EFE2EA0FA997B8D0B69324BE2F93BF55ABDC488E0088F89606347464978F68FE62B8845C15DAEECCF58405389877F0B6EE840606E557907CA8E60F1CCA3F46B0EA6D0995BEB51BA57B03D9DD0626A49F8AB1288E2079FA0F0C5131D9756C8C9356DB1CC675D37A7DF1CA3831BAF1FD5945762180BA52A910D8D9AC89746F816BC4D3B697B3159A68E1A0928D6C2C4F985C5CAA1C861BE19A0D233653C9F5D962F49A415A9C690DF08C4842A2108CBDAD961C40B8D0FC811FCB0555053A333E905FA1D27C4796BAB6194E2E5C85C1864BD0A70F9C3300F6207678318CCBAD5FD55DF927CADEFD370EF4DB1A154DF8766F16633F5D5015807FC63E529DF0EB8B8D5E09FAFA2FA3A702F7FCB0A65591941489CD7727B981A91321FB1F424BA934386F6852CF705B1621F703C34EF202029A329A2679E560D383F5EC836F9C30A78AAD5F45665C5C311286653F8682979E00DF3D8DE9D3E761D9330203DBC29F316EF1A4E35E3C2A805B3F843A3A3BD25A5A680047E0B4655FE73147B3121F93F6B60407892D4A99ADC3265FD6CE6D4086DB260EF1DDC031B422B365698E0D264DA76B977E0BD0CCFBAA80F426229C53A7ACCAF834674CC0D5B833AE1A8B6AB8C6270B30302A1D1A0B9BEA926C9D58AF4171E5C62725F6E9F83CBED7FAA7B47A2C014F3CDF9FB3E5C12E0042386789C8FDA45D48597ED23A1FAE4401EE188D83D32D1C4935464193D47161B838FC9A901A04C481D933C8DD6F8FDBDB54A8834467532741C75D264860EA5F7456395233A1E5A0EE93290503B628E140462C699C68F0ED0C1DDC94D9DA2AA2D6F8403BC16F03B45DB889E3C57C8801D6153218F9E9CFF4A46EB3C470BE0A6734249275DFB3D6B47813548441B1D2D04B20C9F9E4D7932C14F4CDE8EF53E76D193EB0CF134E9C843A826CE361F9A49E712DBC4F36F9F78A9CB250B9032D35822ECDE1217AF26822304C44B12062216F750E18AA6609A132E96AF44A776546E431F3181563557C7E9632CF1031D33EF833D7E51A8A8A4A2CFFF32192C52DFB1C2ACA30F7EC5B0DB51B03840C2BB966C7E9BB5A824F789533E6CB9E16425DDA580F77B747F9DB25DCBBBCCEC2A6D90EF4DB1A154DF8766F16633F5D5015806BE6BEB287D5297B1BBCE463946A195CDCE76CDCFB0FFEA5B2A3CC889AE54AD3D8B9254327E5FDA6CC43562898F861D21298EC7EB7DCF1523348B82B055A055F1DD55B0497AE6860F07BF2DB7AB5B99FC336423B75D125BE0363318B8B433B36EC0D287E805DEF355F30193060DCB9FF1BD15565F799477B0CF15BFE9A6063000314EC0EDE977039CB2BBA790C0A9B53876C8D4EE140DFB2C12EAE54A2725225ABF968223AF4489DF2AD94635A55E1DC5267D80BE8691AC7933976DB26F72FF8E21F795CC085397040077A6E7EC97013E5564DFCAD048CD678661EF08AE6AE028E4E7AB7CDBFEFE5D8CA97C5B1FD9DEA7C7205911DEA120C5328E5610A0F62BC8FF03633D8E1B38CAF05E20ADB40AB3A187DF321EB68556D0B9AC60DA842590DE913B94B4A69D9772F58FEFD86AA4B2265C37F653DCC935E683D30C31A78F8DC89E88B2FB93C364CBE0B5E9F76B3C9AD1DB3B6B3467639B93051FA0A53D82355FD6EFF63849D92EDEDAB03FD065D25CF64DF8B2439EF36A03927E54C2FC545D3C83329BD658FB39B2B6CCAD2DEB0E458CED581CF1AAD07602092B32BAE60F3713652E6CB0F6E8D1E2172FF7A307CCE7FCA3F0B3018EB970028D83FACFB0949A53FED00FE3ADBC6AC58A7E86985A6543BCF108582463FC12784CDAF58FBEC76F03A2752C13EB82742AF0C6F6E197AC8D3C336423B75D125BE0363318B8B433B36D4F220B8345D7464A5268456D3C3CF050DA49437333BA4E66CD76147F46336DA4657191A302FCD04546D262F66D200A1C97C86150C6CB051D744A2D2D7F7EC8EE6148E895D5CD2FFC21E208F6E676C452C8CA1A41B063246A595D6D82F3B68D0AAE2B8B16EED703FC881B71C1EE06A83385EECBA6DF391F892B2368EC2FB59CA6601AD5F821DB53BC08EEA8F1DBEE9B233B57EF4941FF46A41299D8AEE52400043E4AA1DBCB1650529262DB4796BE48F9014EE0798321439BC552B42559B7588CC28E8E255669F33F375D26FF98806654632C4A661D3EA3866E00F9C23CD51E31729476347748879FDD8B7704F80420FFCA749AD9DD6BB9F80A0D9AA953E9B03F17E479D7E92EBB7DB60C93D4B1A26FDC8E0812694CE0A8A5C8C2305E6D5519865265E776528B944CBA67F283858154981FB5AEE9F8057581065C8A8F75886964C3BB5311ED21E173B3EC11FBD0171946C86A77C290F55D27D6B23915837BEE67E2D4498715CB4E4BC4AB2CAA43A4555A874C6B60800E4972901ADA61226C287505E87D216DB31FA6524B4A8629F95D88C35DEEC70E63BAEF917B7119BCDA924D076BD339ACF3054217DCB011973D0A664D8A6C38B654A4CF37336DAF2A9E45DD81E01481AA205D1287903F849507EFA63ACF54F8FD896CB2D2090DA246D71C9C3EBA3A06FD856BCFFD6F4B75BF7BCAA3FED00FE3ADBC6AC58A7E86985A6543BEF6CDB8AE75E457610359445BD83EC95D26A76C43B5AA04C7F6BD7350BD14CECCC28E8E255669F33F375D26FF98806654632C4A661D3EA3866E00F9C23CD51E3BD532BC8CE0E52794E132AD97A65FE95D502C649953A58FD8B9AAE7C233FCAF092A35E278F83BFC662EE5CA1D0EF258B2072D38E7CD182B208CD0DB1CD3F5EF6467B4C621C54C095AE7840AD4DC084981D5057A473C1A1326389CD7883761192999CB5779DEED8C9BBE8A0BA9CF2644B83735091CBD6B99CB62F80A175F767AF17DBCAFDCA8026E0ABB380AE9938E8DA9C0DC802B4168A2F5F24483830D3B31203677B4A035E7B0D828EC76A68DEED70974142781EB8709CABDBA967E0D9750AF5423C4F219BA82DA61169F0937215FB9EBB97C192032072A01292E7A88B0F8368C4B0319F429AFF99D83AC7AF81713DAA43E7EA6823A13E3C445080644B8D4D5A4FFC05CF3C7CD93273C287BC3C7B61D8ADB7FD648D75B5179516DF792006A70F0E510C2E8CE00A5EA084F3CDC5ADC97ACB3316730C31658425314471FB57BF852279589A9CA273CE2FD5C56136B11C7B7DF38E5B0FE09BAAD132D105B395DE1D94076D707EB8A970BC3F291C5CA784B2CA51BA8C7FD32BB0A26A0AD45C811E9BAA30F57868E734BF72594331E00EAD746AC1450601CE95C29C5293279C89C13999996E7298372D17F2DC5697F2242F0F6A26AD61F67F60678151671562797CC30076D7C3433F6FEBEE789B0DF739EA61A1A8D884B0A4CD64D87E2A9062B99357F58759716C07692DE093D90338E1D9E61923917DDE422B536AFA6580D87D2F745265C6BA8099C5DB51C8BEAA5E2CF5D974143D5EFBE4EBA42A941BAC54749095033E3D31B2EF8E2B41DA36A7D61325B50D39E7CE91F0CA3B6F422A6B813DA4667B79376E820BE711A34F6DA54A6B921B1A30B3FF22CFB32A83CA5EE0F3F94FA0D03E58ABE36BEC05260CC4E5A77C83015BB04ABB1A7641A9B0298B791F7E28371BAE546B6162975D938737DC5A3DC6316204F7F51D3ABEA111E62462A887FB4B746100A707D9D5C6E300E903CDB227F28CA6FF40ED0A658A5020E1D89052A4C2C9F2382035FAD667FFB5C2BFBA6BC9A2A11DFAAD5C2679DF3A230E6C90879D11FA136A38228ADCE2D7A56A1C194175E6D7EBC310DE31DE4C327E5E7B2D1F57F7C3E9D04838D25B04A68862A94EA076B844A6635835B435A2AB68751714D263A92C673F7CAD73C02F5DBB040037885751E81127218AB7A69E5403A1060B5A6AE6CF7E04F82B9DFB5A093D13F827BD8E4F1B758E9764FA921BEBBAAF9F39B7C3DB08DD4F8E8C27A3EA3CF7C6310EED53D005BA3B8E8AF82D74964A6D88207F8FF654F1162A9CF206F6139F60369397DC2FD18B9EC99A512B49474805B842B5071C3F962DDD801E9291E553A93D9AD0AEA6EDE03806D980BF308113A210C91F935579296900B5B1AA95530153B691FEC9F3863CFCDA88F976DD111F77992A3DA12CD01F6814B91162205D8EBA4535D2DEBD2183983A0B27F59604082ABE597041C1F2E858735FF382BD3D0E239450DECA635535F5356BDBC4D76644F307485352089DA33B82779791B6EED268B034E76DBE5E850595FFE0A346DAACA1A3BEBFC75BE1564A6A9E8094D7605E8021EA20649601B98361E793C62BD2ACC6A5D6E3C52025CB35EBB425AD3B001CD6FAA542D8432BAE0148D0A9EF8C4ACEEB5D2A640A4C5EDD01695EEA92D40B0664FC1EA05D64BFA378884E1F7EA43E7B3BBFC52F480E7231ED64EBC994F0CBC2C937B5D6FD74311F7ABF7A81ED042276B525E5B2C47D3CA2D856E61DB0BD364A66D10F5C9152EA6EAE3C2AACA0DE40EAE1C30722A06A38884EECF9CE95B4C7721E3572C47F782A5B5C75A5D4D374395C8F2DBA59E00BD2289F3FA57D5213F8B549D94381DF64633A491780A9A50C950A59ADF990D844E42ED80D05BA26A38D2623190984C44014BE89A7F8F6A88EB527B24FBCFE607BBCCE735E2E0D8047969A3BFF25128B6599DCD6FCFB219082DAB7D57CD16A6D584D3F3ACBF333C892AF9E69A3543319F0F0983D2DF69F2DC06BCD24B4BF0A4604D6AC865698491C06DD6E28B99077823D5DCC28EA18224587995A116C5DB8D6580C5C528C9EB4A6A944EDEBE8F5029EB590D4B67C39027EF147E955AD9C2641355DD3F1BF90F69CBED42AA6C9653025B874AB32040BFEDAA511202D4F8B46D307A3B7C6AAED4D9BCD89BB35C1DD0C14ADF9E56E84788B6D7EF98CC9A9C82701B0DBDFAD92CFC867FED418B370605C6102F7FCB0A65591941489CD7727B981A9C84BAA75457502D397CB71241EE3EB49C20B9857352667E6004DE64BC9D6806002F7FCB0A65591941489CD7727B981A906B08985CA1CD5646D2208AA5163C8A557D1764112717D26803D541217330C5B0414561040BBF6A5E7BF077E850B55BC4AAA4E20568474253187F30D9C1C099C850DA4F2F41D90D6547DB2A53DD16CFCEB42664BFD471A00BD2C73B50119ABB0B1941DC74E2EE9DAE7729CA4DFD56C1D67CDCD14247C1670ACA4DDF3C9B6B9665FBCF95EFF25D69070F897009D80D4B502F7FCB0A65591941489CD7727B981A9596EA4721A298975C3D4371EB5B8E7BD0A8A92640422425196615C8C53C443CE8AA5E34FBD6ED314376A2743932A9D87544ECABEF060E9ECAEB58EB06C6584429A0D233653C9F5D962F49A415A9C690DF08C4842A2108CBDAD961C40B8D0FC81AA3FD14D8D828B03CA96893A3D19671F3025F8417168F7088CE70B7B5A52069330A1E0937752A7D2A7E4B0945313A0E7FA6A2D3EC998E68662AC037FBFFAF0DDCED581CF1AAD07602092B32BAE60F371E21E4ACBDE363EF2FE9C194EC71E48C95D8DC03AA012CBD583BA44BF0E5444F172DD47E5A6ADA03B40D884D0D54671681B263AA437DBE5C2B9E8490CD26F3C2FEF46FEC3F626AA32831BECF9BC3F16568BFA798E95052DCA90A804FE79CAA02895453CB17AE8433576C1A9AF05F83FAC25FB0E941CD8F09AE927F37D70B0F28D02F7FCB0A65591941489CD7727B981A9C01CB65ECF4338777517367B9D76E81177955519B971B0E52939A55A6EAAA7446954D35688780F09BA71914D9E70D18EDD7B2E149B83028A6CB318DEB18946BDCBFAC860D5148FB84B57CEBE9DEEE4EE7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291D834BC4D7A85C55690850636BF57DA46A403CD181F58AF86CD70EF98BB7DFEBBB416B58E66F3DEF2A340F714017D6439F4422E0025A6F6F3FE937306DDB7C25B2A6A91896CA241736C0651268E1884565F8C54D39CF395714A0816595E73E5C008DB304D5B74D8A988261E52AD0DDBF688A865AC3B974CBA8BFBE516589971E02758718B86D6C098908EC64CF691E049C8540EC519C0F6230D50F7D5590AFC1B7CC3C0C1B07782B631138F021EFAFBA684B1D3E516EDAAF0398656B1FC4B88B34E4418691DC72379280FC4ADB805F007E1CEAB838534BA40D61619F15FBA5C875D4B8F5420377E7A22A88B78298FC29DDB485874B12F40A1634A0DCE789448ABE99FCEFF58456453A89D306E21469C2B374D684F75194B457EA825EC19F72F8A672A92AE6FE40B7D586EAA6AD522AF5065863627AC79B81DEBD12E71116177E0F3BE82AAAAA63C06FC282C023210BFCC84AFD474E64D27639488D35AF21C526FB40316EFA4FFE8422B38EF5943D5E96FB7386C39AD98B8D10B99C6F9B25A233B35A9164AC35D42B1152D4F42D071AA8820CA133E2A5D7257E1538165CE0F2686D7D4DE8AAB63446258DACA3AD1F15294EB5E15FD22B73C2F73E001D1B293DC1F770B6B9617AF5851C0232376D42506E661A72C13D03B78AEE93A7EAAA0CFE6935769CDCF1995AFFBEA094F2621453985F5D5BA281C74227D6BAF8AD822C45E3B0A9A65C9F995AE40B7BAD2A969BA31B0BF791BCF50B34349BEB07B922DEDC5982BE5AACB0D2E2391629DA0C3EB6AE3854EFC3795DCB7AF7EA43A64D1B2C0742BFB6DBA7A62AB01DC9F4A2FB795C369E8E4EBD84378E28BC13B92BB15806D2754B7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291D6507794B2505E84EE8013E40612EC5AA52FC73F152A7F2E2C9B9DF47B8A2D98C907CDD2061EB77713B1F99942207D92F64217523B2B73DD89ABC13C7B26492A3ABEBC0067F39DDFB94C114A5B00EF2089EDB8B9FC7BE43B8D0546913FC32EFF2CA3F0B3018EB970028D83FACFB0949A53FED00FE3ADBC6AC58A7E86985A6543B1291127B80244FEC574B94FCACB514A2CDC95FB8FAFD18EFC14AD1D29D30AD8172EF771830CD80D1EC1CEFA21270F4208EE37F4AE53A5B9EAEFD0C824D6F0AFB1D20E4F359A8FCB0DC7A1508952C1B0C045C449805F6A0552053F24AA1727C6B8E6899815687D5D03E1B4F4BE57AD5766A770B5A2EB9B8D61DDFD326B26162EBB5399F3837611F4FB0C1F1C915EBAC205E06ADCD84272841F18303F474B054B86DF05272F7C882ECD6808C61AD403597E22AFA59E41277D19F75BE7D734503013F54FFB8E91ED4F1C66690B132A6F95765F98FEC6317BC679E026BC1F894B37586494B4A6382578698EBDF7AE26D740CBBF063F0AB9D5ECB0509D10F668B83F254F731E4ED3730E75420416988077CB75BFFBFC1B25ED615C8BB3134FD69346000F5DCF08121D16B950F53112D5B5770A836B458CA037FC5B9A6A0FA7D0E0DD894A11085F07645EB03A32B61FE29527C4A5064DD2A10B96A59ADA8C33989EAA21A84314A4FA3CFA267B8CB75FDC4D3EBBE78DD60015A76B91B9D96F3EF2FAAC65A4E9413C36B093FE577F50598421619C481817A0675F36E1B90DB899FE2269FBE7B9CAB9E215508383BD9369205719FD76D93FFD3F25AEED04A87D2B4D46CC79CCBDECD48E2EF637707DC593A1E11D9F691A50DF3653EEB0987909E1E3558580C47F44AFAEB4CB61FB37CBFC05DE5D417A90F6AD49C5121892D5661E290256152FC73F152A7F2E2C9B9DF47B8A2D98CDC6DB0FBCF4168E65F0B433E8BE2886EF030DA36FF62BBCFB93D49CE60CE5CB0013BB4EA2F31256957238CE41305D595F65BE655D76C7F104EFD12289AE3EBCFA2DE16164DF46159DDCD399B7AC373D527E77B6871B7D5E4F7653E426861C8ECB5D571D4581BC90219FE0B1C7EDCBCE9BCAEF232AFF3E9D801EA418F5B4E77B4C24EEB7657A69009F9C8B7AA5C3F6755D8E845B1A04686F27CE3721AD4A901BC8341FDEBDE4B9ED0AB6C4002A3386462C2A534C5148AA8F8F663B23D8F9D85FDD6BC67D1048DE879B19DCF56E43639731751BAAF5F36005A432CC7B5174652E41B80747A93FB375ED9641883E71CC5ACE13BA04643BADE35B0C4ABABB8ADACA0A7918C31EAD8D2D839C35BBD0879636EB337E3549227A9780CE27D7888769B1DBA26BE2B6DD7C7B8918E9C52A6EF5F37BC081A56EF8F01AB93E9E0001BB29D292654419B5D313BBCA6B7620AD14AC364B37BB5F15AE07681EA720937380C294C3422EE8838FDC0CE0FF4043D8023C8B38ED854495BDB982A734BA01D8B963C442A0F0EE3B18E327DB06AA22E06B2FDA115E05550314077D3CF405B0B770950A794FF8D6C44B99EFCEB51998CEED8052BF012E56A7764FE69A0A84ACBE85F549FBBC4E8DA632FB7E70C2035C772ABD52954E6680242CFA8E85D0AC9B3C228D026AA3FD14D8D828B03CA96893A3D19671FD335FBC1D6372ADF051A9C1ED622E6AC3C79DEEFC0CAD6BC738ECFBEC86D845ED968C8F707DD1CA34A3679A692A9BA1D8AAA208BE2511F6CD6B9B24E59BF342D00A3F5D52FB1DD1A8F1D63865D7499F57C000298103D6312187A2FE57D6C91F1DED437C5DAD50EF1BDAF94D7F94745F177955519B971B0E52939A55A6EAAA74423A9685B43C4874F983F92658086CC6046F7B3EFBC3675DBB71F9127A360C4BC22C33833F3846A413AC79412E984BD2413A1E59DF691CB46F76FB75CB277F3CCA35154AB51FB65E64B5D181A25BCA532D6BC67D1048DE879B19DCF56E4363973B4AF7280D43926E10C924283585461AF00CBAD34A70B81C3D1A03472021A24B1B89F905EEB0BBDA8B4C4FF093A132C42AB967CD8487A1F3DCEB8F530E3BC735894A11085F07645EB03A32B61FE29527C0E1F9BD9B2BE9A774A69B1A31BBC6A4CD4DE9145319FA2EE4C0BA3364D3A2D10D7B22248F3F95CB4EE8284A7674833835A624A231E490DFBA3E7A553AE1C9A07D73A7279C10BA978FA9ABCF789D29C851286653F8682979E00DF3D8DE9D3E7611DD46D476140E3472F522914100365BF282DD2935220B3A9CE6057DC86F9CC331B019AF36EE99D8C8FA942AE7469F335B3F5B83A073A318CE695F3986DEA103FF6A7880C4EB5C08817DE703ECAD3F10FA9DC1225D1D5AE0A1BCC7D9FF7F3BB0B21ED55ED599CF936BBD88A6A63EAB3808156E0F1490442D8A40390FA1E0678FB48C7F12B8ADD9C5CC5E8118A8A61DC1602F7FCB0A65591941489CD7727B981A9FBC6AAB8C3AC54ABDDD455544C21CC0E355577E8E53A9BA703D57B83015EECFAB327F89BC4EA2F40E5EA554518E2F3BE294DEFB114FDB6A1FB6F2A33A2BB1340423BE56A6D1AEC04E92801C143755136920A920683432455D6F4B13EF828A6D402F7FCB0A65591941489CD7727B981A90A9B7EFB4CB7BF37CA0B4D505FA04251F1B620BB07C5CBA3691FF15F7A57A17AD4A43883B21B3C6FEFB8DC11123B4B4A02F7FCB0A65591941489CD7727B981A923A9685B43C4874F983F92658086CC6025B793FBDFBA572090556B432181AB57B387D76B90C57F8E9D8AB35144801B3C5D8DC03AA012CBD583BA44BF0E5444F1A3BF213671B9548EC2D4E9A885F1A4870C01A44D99A0F1BFC3ECFCB2DAB0C5533D9B44F5B64224E65F2B6233351DDFFA8814C110F85746FFA7C84B73CE66C3CEA06594D8423336350E6A8C76D029C4D3FAFE16444D4D940D940B696200629F5DB521CD444DAFC01B9DBF89641DC5741883A0C40DD62BE48EC878E4133772F2125DAA48676F047999067583C9C6722B7156462817D1E13CFEEF314229ECCAE38602F7FCB0A65591941489CD7727B981A98CC207739970C8F2937B4A07FC77ACA384F054A17C2A6BCD0418379393223D743C06564982B14D753CCB7829F134E6F09557B191B95F66E76426762CBEE31889FEF3E74932D04119DA3EC992D336C365D6BC67D1048DE879B19DCF56E43639739EA1F4E096DE9FED3F7E27E77D5C59EB02F7FCB0A65591941489CD7727B981A9D3F3FEEA2A9DC17A268BA148D5D835025B4DC7120E7465416BB44F2B5858818C4D367C712CD1B829EA1F9C4C848AE583F317157D32303D2BC584D6A0CE67357E5E61994EE68BB0D56500008D776134575878FFB80D412327651A3EDBFF4BC6B5125016B1CB289CFE641BEC566385259802F7FCB0A65591941489CD7727B981A92A0CF474606B19AF455B0FE76A74577DC9E786D0B6B4F42D54050680EDD032F420DF431912079BBC9B1A1A5873BF7AD259264E5132BD8218A6E21B83D3DF3937B250E21B3F7DC4D8232066990765E989898B0251FC925DB20A5899FCD65AD45B811F5370F1038A6A48BA678ABF5DD0383B18C7D7295C19FFEDABF798E5E8BA255B8B8E52DAB9BF0FDF5977E50D366E9B99D524A0F4C618ADAA0E9CB9D1A002F26523E108BFA77E3EE98BB2A45F2B31C577955519B971B0E52939A55A6EAAA744D7BEF2E2BF0730268D6346C36A7EAF803B980CAF1454D8CF356DBF8AAC8C06B78090BF49A48F81B5A893426FE297CE2B7AE570EF93EF0BAE0B417B89A2D5ED8DE9ADDAADF40D3E576D532B4D3267B5FE1B263AA437DBE5C2B9E8490CD26F3C2FD277625A9B58528E9D31E7921B0B443536574806CFEC4EA6090F072E480AC37381A75E6954C0171573D728FFD4370AA6D642848B685185EC81127A19F4664AF570E43631628876CDBA595103A7FAD5BC02A139A981E0FC14819AD97794432B354D94996A23ACB2CBBD3008A6B852003D22039F09B8FDDB60D427FA655DCD5E95CA26D3F99B538662A40320CA1E4A264F75AAE24B3DA2946EDC1782C6133CEEB458E14049410B8F094BC50C70BA3FC6591F3E9E02294C5B383BE6A55FCB0964F08B98DFC25C73799ECFD0D52EFD15C96040D659F73FBE9F4A8AD34DFAF3C1705F1DCA6DE016CA4A124C09CCB8A48623354CAA7C7C9AFC5E4BE64A5D1CBFCF07FEDA0CF68C859E2427EDB5B2F89FD79F24C470425C8F828EA6458CBF747B7562E97223B2B2C1FE9274AE04AEEFEFB6B9676E83FF646A1DAC29C61BAE6B17274A74DCABBEB4F46AAC46D0D59B4063752DCE4531DF3991BD51F378FA87F1BC0D8F60656A928DE314FCDB764FE306503FCF2BC45A8DE0AE36852B5DFBDF63D60E7397148939FD667DEF1D11D4485D0DE5DC15423BC4A62B48C292E92F65378BF39DF1EEBD6A3BB3058472C2F817CB29EEB3F7A2EFEFC3FF2D7A688E52894C5F7365F758E4122B1380F9C047E028896682378A1853E343F055566996CB5D6C60EADB5C92C7D480467437DD5620DCB7A7AA40331BCEA497260414E5EB6E174FE606D3BA8977E94D46DA4A779359A7A0F1761DC7FE471CBCB6506BD4A5E6B3C9B5CCA33979568574FB49E2A9CB8197A4E206E5CD55CFCA35AE6363B9A1EFC6F0F8C41D1080C2C7BC90F881582C51A7DEBBC418D9E337C27E72EB838608E281291E4EF69C7EDB305C896D98DF94AEC31AB35276CFB4A3D5E3A11878E51A3645C592D26988A6CA14A8438A84FC022E38E34FA15B2653EF129813B1777AB7236B6F5B603405C0C56ED91EB34921B15DA78AAF024D1A726C1539B4675AF8260D12C1CD211C06EC2FE76A6F6E6BE636D211442E3FF8775B07E63394A05E44E82E28AABF695E691725426E4F57C3AD7F102571DFEB169B1ECB64B9DBD14AF2422FA7369409A4D37E1D824DC18ADD3A67B086CA7DC05BC6F1DBF507D1B6DAE06582173315949523C56843E93F3662B0496BA8AA1C1917AD50589A1F766C72E4446BF8FB72AF5B8DD92EF721616B942B893C6DDA9C4C8B637572696DCDD81BB042A8F9CD2ACAC557FD4A450B74F84F54530B63A110694CC13AF1A248EA501304CCBAD1BF299EE112C8F0ED5CA8EAE2648B13689FC3223612C8D608D5B34740A25CAE922DE1CE5A6A0331B59E9B07E2AE35D05DA3DE49EE6217A08439859E6E33141E6BEEE308A39C668D0613CA8CD402721F039DC24A66389F3CB5E9380EBCE93DAEF0FAA6EFBD918CD3DF53090E4AFFD6B7EB3BDA93232C697BA6914D26EEB2B64B5C8939CE94FCAF5323244205DD5FDD2352142810274B9D31BE9FA99FF27DBD6502A4AE5F1D05BB8175570702C16D0DC3AF7F2CAE6BA85E09FC500AD177AD4B1BB53A8CF0CD3A6B5F5397CC445246A20F2D042E2CF5A8095AB988DC3100FFBED813248831560C6CAE7C6A067714DC3AC53D57DA86F68F09DB0E789285D98CC386860F07D80CB91F253265E64C4784E46E2B74CA1C8C6A896936AC1DA446756B502F2E6B9CF2178D339066C9BE085EE8C7EB9A92AA9393000F455F163C270E8E756183079874C5B61D1965E5087B7E527764DAF84353CA9CF263BD248F9603FFDCE2C0D95A007D525993BD1D9944D69EC4172836DC41A9D65CD7C2E24BAEA04B04AEE61889995FBACB55E240E2D29577766AD592B56B0789BDD7FD5B55CAC161D167653EE425818A5F795E62DA6125BAB6156777713BAB9773ADD664D74ECA8942FB37C99F85F0B24573C35E4390C00B56BB63F58D01EBD94BE76D8EE8848805126A723424A4F5846B6C9B040F82C82B1A8E24A5634271782A5B5C75A5D4D374395C8F2DBA59E072B6049CD9851FEE8ED4DFA2658D92FC948726C56B257B831A7571371BE1489682FB1DD1B0438D881F7F8EB7B35A22E7125016B1CB289CFE641BEC5663852598D1B9AF693490AC2D38F2E52B15780F2827120EEB0F36F9256A71C5F94E0485EBE9215E33B05F05946D161B579602DF463FE0338EE27F0D800C66C07ECA9A4230C336423B75D125BE0363318B8B433B36D335C8B9C9271F5E10EB40514874ED72DEF03250AF00B20A426E7028E821F536F16979CC0877708DE98FCD06901DCFBC954978D859CAEBA4C45767703B87D26407231540794FE71F782061D7BA81D097D79369E061B8E8373C7D09E3ACF500135D8A61E5B75533015399D7EC74CE8DBD24721BBB1DDC2D8ED198078FDEB842B3E25F792AA8CC44D1D6C8664EAC1CE2370BFD182B97EF270F6FAE61B7FD2F16403F1B124D71679103E66E9E8DB9573DD96443D2FE51678CDE250C9E644AE7A290EA75F57905716439F31B7E13F1FB0BB3E7C35C783067222ECC3B617BD67BCCA6C57F3AB6BC6B061FB32C487D90369A1639F6D50DF26D7C53351A26843AADFE5D87B30C1A948832AA058D2044F1B01DF1338A7C290BCCB42295FA9794C0C20AEF9BA5B707B7E2437F3264166B1AC7EA803B8F34C7DC2C177AEF41301584C0EE8F7B40D68F36256F3F957B65B967A71A7B6982B40BDD7855D11AB391EBEAB0E578D181D57C645BD43965156C2D779882A8C5577B3CB86ADCCED447B2BE74A97F7C64AD8F900D806ED6C6B3DEB749DCF91B6210A5D6ACAB1C48050B4BDF2BECB4308EBF12D07CB59610B24C84B9737E4E8AA76EF9F50C25ED1A9B2DC46F57FBB8216210A5D6ACAB1C48050B4BDF2BECB430E16EC610D14D53B1EA2BEA843E7C68ACA4D1493B494221D5BBAD78C1204C4CEE45A0054CF560CA3DEB3BC51ECDDFE99250D580A80E1FE6D07F2A33445232CA5F7BBCCE735E2E0D8047969A3BFF25128B4AAD70FD27C9B44D99A525F334194718385FE416805AD86832D9E6EA50BE32C3D579085BB7DD98B6493C25E0A289686B0DE2323A1365EDCBB5F7D4BFFE7A7591343AEA7D3ACB208D208DE8D2CACA0E5B3AA036489299EEABD2219A746165B60883AD764072B0645213ED78FCC5DF68E325AE5DD8CDAAF3A8CD0CFB1340AEB238005299251E9AC31D119C4A955A58CE9576245C44B638CD1E5BF58792BF80421C98AE2E701FA218C1A0AFA308499812D7CCB2AC2049DBE4AEFF5326EC53459653E86696C1965551EF9B00EDA3C698A00245541FFBA45CDA334551C5D791BA2A194F374FE2003EEDC5F5F4A2A078CB21F7F32C71ADBCC9A50EE7ACED604E74C815DECE98DDCF70DA73316E23391C4C76135DC301B03018D899514B93787BE604D70B5892CEFE1679B32DAE02D595F5AEF9FF263230C2C83A98A79AC4F74F292A63BC12DCFF0CE8D73244282D7C3582B745DCD241F10C375F9F765D1F41492FCD0116DC1AE686E5736B88F0B6D690B95E53F86EE35EE18D7AD24A0BC517E5119557C6EDCB559D2562BCDEAD98E63D7E406A5397D5951EBB5841659DAA03061DCED256B409F338F7319341513AAAAF611FC0AE9A233345E02C4F682E18E95CD7ECA7AF6282D4D2D9E8A9C36C95FFDFB947D102A139A981E0FC14819AD97794432B35452414759272796CD27CE6492C6B36400E9CB297A50A1A114D244246CC302C0064871352B45558A10DCD3660F0FD8AAB4FF91B3F2D1606E201930B6D2AA3C74608F5DEBFB67E1AA1F60A4EA0913C764660C0FA64B8D1D0B3F39FBCE6E54D97D26F3CB82EE26853CF2355F628A0B0CE9A015562B9805B94941345BEF64CDC69BDA04789FECE538292322FD7C3B9EA13855E602ED45DA7AF96ABCB880D6CDA6A108808A6625F3EFD2D5B7FC2063134F1E85C5633D81C37450E9A91C9403DA58740FD49E596B8DE72123D1DA81BEF10CD5B427B6175ABBE13CA534D7407BCCF3AC3179D262CEE73E7F8C5712EC4285F2B5B04536AB0454465BB3FD3A3570C77ABDF78A4B4B746E9605160073EFAF2F095CEB8600FFDFCCEA5F9CE1B9CBDD96F814AEAD4C74D0B162B200437DEA981561FF849A0C289E3BB640760235EADA017274A0E793A1782363369CFC3D1127B234E2EF0164987FC41BDC6E926EE671DF0F6AF17CB58D91EF453F5EE4CCBA0A6AC13F61B2FFB4AB9C6049E8B904B9FE468DD1484F7848BF729349A4C66442308F007AB66FC8A10E8D8D586BAD4A8B81B6B43AA6CC48E48D0EFC8865F984E33856742FB418B6776AF92A37A354341E0A1C2C62C27A76541799A4F15E90FF1452001EC58E26E14FC018F43F83AE1564557565555CFC49F4AA76F016606A12CFC91D935F165999C68DABA4651C1AF808278997EDE9C0EDA30185F4844573F10F0D9D297520F522657C3B42C784535CADBEAC69C219F7CF1E412A26E24BCD15AF604BA112DD5E22F644244C348F437C87AE31EC481C861CE582B59B3407DFA00CA2F94ED0EC0B5827CD1ACDC03EDB1D86E687CBE69D033EB4C36CCEA2B7CD881EBB0E0AE7402C02EBD00620AAB063213152456600E4A078FB4CED01BC671B851854EE2FB92F3C29798571BA34AD601F962DD450B07F8B4935F06734A6558664EB65BCCD6473D209D788B0181803FFBCF1FC53651C1945167998770E914F9FD6A9E6D20E7AD714A3C66D937275CB08E1B1122DD4A19390AEDB25CB3A4401E7B77D2B66BD9B2F34711FB756DBA8DB7D3365826AF8CDB12C6FFB775EC5E628FC4074B7FA5C5EEB5F566220B40CD32B9A8F360673F9480CF2E76910B2FE47EA7C364BCBD158833E35860C887C279CFC1E350EDBE1373888C9CA0FD1576869C92159FBE97178294A40A4FA4BFE980011DBD0F05BFC30C84091E8B10736F359C041B03850A5F7EDE25EA8725C7F3E3C64FA9A3433DDFA6FE9E266018B997B36B84A0E73F827DB6C08C93E86BE28344777D2AFFD238132AB8835D574CE9A1EF5BCB80BE9F56F7B03A215BB437166A0CD2A967A409256CA75D86E942BE48C1160279BFFE459EC93EE3C7538B3E7AE8A166F1B01DCF63FD89206CAAF56FE454B9D6D5D51ADD64EAEA6EE5FB89C554944DE9FCCC8173DB52E1E2736975CC251248629E98500BEDDC316C8C1DE9290466C1CF069C6C39EB80885AC5E0C8C7759D4FD2E06CFE1A389E2988EE2CD07F6161A232B5D69AAC893AFBD15C8EC5E1AAA3D8407C6D9CFC9DD1027476D89A4CB4F82C7E6005E3B3BE1A651832E6D3F0B47DAB9F8600A74C8E34A0B17EA74162A19F68705904E060A41046FFE711A090D2C92C95EE33024F9635CC61C6BEFD20AD64F5B4B968D3DA3BF9FC1B5DD69AAAE2F89E66E3D9A3C7E76BDCC209BB46716819662BF1C084BCBA0A237B518BA8145B0EE249A0136CEF181E112A9AE621F078613E7E7B8D5CE1E952F9E5F425300E22B9C62D0AAC3A7BDB7D0CE497D158B8802F10ACA99B2DF9691FE3185127B64D4081E11E27299BCF88B8DD3B64A921B0F24A09CC571005B41C76F8BF4F0D13F9C28F0DCDFA7D05309FA8E6B1E419C472EFA785A4E44A3F3719955B0331F7207D174CC9987F487049AF927301802B12667057E260F53CE5EF4F8CC845CACBE86E3AD6573EE36BF2625442A59BC57B0AD82AE28D0E29846F3CD9DE0A1E77EE99491D9E198146FC4F02CC45424803155F536015D698FB092E7AAD38891926E2279139C906DBA59CEE4E741C1B3C1BC5E00FB75233705B63934B7B4DCE5101C6D2E40D14755F356E4AEC3563B944F4D1D741C3747AC185043BA18B102B698E95CADB19226861BE181F3274223F9F23BD175E90DA8FE2193012478AEE0EC6C708CA7E0DA540D6A3D0F6B1B037E07DFF58A0E4564B2F311C0FEC16F2C1849F005D5A2A138D88F4C6D5064AE021A3DE96EBD8DA09D8311630AE0CA6C7D8508F7CAB060F8C7DBB0B36644453A2881CD6A7B5DB7C193B977AA7014A4C331C754D21F205E62923E22ECDAFDF5058942EE34AD9971F6EB0567949E00F23DAD36A531B1546894317D32702B9BECA963457606F59E68926F0CE72B0A9633F16147935C02C449F9F959755DDB45B114C574C90172F513C5093AD3D35CC3A3151E65B9946B8B5288A89E24CB3B02C030844F593B682AD283D6DF8C343B5A98177EDB44E2E56C4A6CCFB929F7B7163285DB7001FAC759DEC5EFB6104BCA8EA50E97ADCD094AC08379F75D39B88F3DDDF578041996E0AC12FC998B1C22D3B00770FD1B8B6F34AC2233E9688A437183101CCBDFDB51EDE666F89004938E1BDD4C4369058FD7B993B90E9C483AA9C42AA3091E1FFDE2A69C8CB96C39ED2586FD26772D8C54DE25BA7290272AAF946A903B078CBB4D14B517F209F9AD7164A0BD31E02612D3D342B879D4B4C03EA196D6F26A059F375108654842E33EA84C3DACBFE75B6C8EE2C7AC69492DE261CAFA8E677C1B27C3DD88C350B0833A9887E4DE9A4CC38F72F2A6E71DF5038E1EBB7ABB6CABD7ED458CA00BD452855C02F517AC999BF94282CF334713DCB7273E6C8F077A35D9212525C6E1BEC78E7103A00182D5EFD0B1292A179527E25F705FA7662E554AA0D684843D87675CB47CA12350F841E10855DCBACFE083AE39BA5E071BEE5174233C1CF8A703A8F2D737C02E3938C6EE1932A312ADCC08CA489F1E6261480EF79DBB8E78DBC50397F01D90D8810FCB3DB2C5AE1C8089B5A1BEDCFAB6E29A23F28B6F2B593B7CFDAEE43329E8F90C2281FC9D38EF1456D1C0601A50844462F4A0F9EAEEBF8989961EC25C8E48946690D2610E2EF0245B766BE00835ED230B86B71000C3A9515E25D95ADCC076F85D0F0783F557F479878328AB8E685B0C6E98A7BBBC97DB6AD9FCC3200C71A4B496EEA6E796DDE701A66206273F8B19D8E689F2A6FF1BB6203837415C038757C65D06A9158D069B08585FB6B6895F38A2B5E8045AE88D55E0E702722E9141BFCB6581F834C369D1F3DD7C4ECE254848D2B507D500C04FA9A644B184782159EC80354FD2FD724F531198CC782A1E34C0C1F5F001EC232F7364979FF1632497FD6C9FE806D024DDA77E92B9D5CD8FF0591E60C939F4F526837DF3E311D67E4CFE1DA8D505116DF401EAFCC86783A4B954823BA9BD089EB45EAC381968781D09EB214955C6F5305AB209E61A2593A31E282F3FE2C04C6FB0D738FB968458D1EA267F99BFBF6B280FA2568DD1D6A2D80C3A3D021F5940004D20A38F1E85C0DCF0B3D289AFC834956E41E50490F41BC41C6E0958447E1C3DD07D6ADA4CB2BF4AC11443F5698588DA27239EB2C01627398C8252403603AA224843928DB26D783347822707BDD5087B9CAD63C84A1E05E74D40D2C1BC324AE951C59A26F55A9A1022C5C76281CE4BF5B96EAB67063F5F1E02B5CE96AEA9033C949CCA87E8701C5E1D4AF8943E9040C0F1380E801DDEB679D356EAA1C9184564AD94E8AACD98E45163F03F2AEED789F7FBC00761415AAE2A331569853778CCBFF134671AF7A8C015628326BD20ECE436C126AFD5A73F9A649E0651B25959CEA30CDAA5B9222940203AD0DD25F9C6FE5FAE5E1AA4EB277678F0B6EE9EAD96195E1A443953664C02DD871A050370FFBB2AC9571744064225391309919913851A3BD1799B8C0333F22BFBDE47B05DA3BE3801B91CAAF95258BD1F743D39E6C6F11B2F363019F224BCFBC967CA677474A25EACFD7540D0759E2072699A657F621F25BBD25A95402CB3951A876FE114947DCAA035D6352349C7AF97194DCFC188847F8794EEAC4475CAAC4BE7921455979775669B51F0489643AAE52D8AC16CAD92B26EC9C0CCFD16FE0D207CC77A68449C971CDBD999FB21448312FA62A08A50545FFB9BE392F79C37CBE2D7F93E33D7AA4B4AA806309396F2F4DDEC53361FC11D874140C34592D6AAF3ED7659C6CC3394D5EF943F5F5A9016C90CA0BBC4B5F51E55BD0A1E2EB0AD44E624002CA7D8CB195A4E78C9FEF90BA83E613E4B1D563376DD12CCF257D0512BA9B7B9AFBADA306D0E34CFF6C16F3F9CB5581946AE746434067AC9D97A37D4CEAAC65FBBBD605B6555678FEAD1845C8A95B458373014CCC0599939CB50D74C4EA0C87B85D0515CC4D55228BB2928A6D59892ECAAA26006FC924F528AC42FD273379927AE472299D3CA24C71D531BA2DF833FBF5C4B404C178819789C430353EE2A2A3FCE8815F5F640650E7BE540D28817156F8C301B0F45C3373FDBC43A615B83987EAE6C722D7D1141E26F67D7C9698F4D8DC7EDD5E1CB128E2027F1DCE2219562E857F44B508AF20347483302FA7CFB086821CF4DA534504FAC4C3FB6B2A8F5342916C08D65B1AC04E30B16F5CDCD5678B339734D1FCD6EE0FBDE39060E08053390BFEC0DFC4E06454954093182538A42A9B098E7ADA41A51175DD8353D117E3B4A969643C186B8AF071266F8B0CEECFAF0AB76A8853D79C216524E4776F5B45A35ADBE1D526B9D93A425360A52AC08B4792A89251F1265801DC2EFD2D4B9B460FB615B6EAC6C0C5E6B5F2CD0C1DF0D20EAE796B8BB25B3DF4A639A95392B80EBA2F3AAD054C74A1884DB8A5347AFE1B9FF33CBC33CE4D20FFCA2BB0C7F4A131C85F0A0A091E26F99CDA40789B9906C890B90D55CC9589FA360AC35F66DB9A6FC8974FA836F30A3EFB935803A7847E324E6F1ECF54161055689160BCF07A0D0F83EF7422533E2FC340F553DF0F968BA5D5D339E70BFCEB41A6A2A17523C6C6F586A7D506442186D839F64D63AF74D93AABC4BAC05B751D683669E47CEC57A873DF7A31D2ED18712A9CBB98B8E35FB739A4F4CF2072E45F8A2885BF278BD0EFA275250B6901328AF2DBE07EB36AF1A17B622438A2A14B84A17E5AF049064EB2EC5791E0221D95B8DEB057E778812D095063036E0EF9392FBF11792ACAC14892F84E5D0990B727EE9EE58DB88B6CBAC22FF24D3F443D6F73792A41F87AB88332C40B61B3A4288FC88D8DCCD7FDAA042C62CA74D734294FECDE53EDDF59FAE9A7FE651565802CC957C8CC6D1709AA7C6D236605400AE4BDFE19C5BB9BB38F6B990A9F57F17253E623990905244E373EBD5D70A8106CCB68B3CF0326D92916F5B0F5A6CD00F7F13C060129E9272A4544351A073D307E990F627FD99E164108991AE89C7017190EABF0572747BA2673F7CFF9BACEF0A5E73E66AA66AD9C605375D122499E7A60981DCDB7544AA4ADDBB9D2806A35CDE65FC44DE0ED40576CA79023B6E4D996DA6A4823BC2EB933FB27A7C239E00B742209A7056E7982668D06F19AE0ABEFD44FC3EC15A4DF7BCD4F5BEA60802DADA0E8F72EEE72C005603749F3A9A3A675E7660C21640D647FB7A2F68E0280A43C2F4E16C0B62C1335B6DD9CD22A431215E7F1736C3FA887C3023969234B05F57749D721CA5E06A4022033D3A93B071287743AE370D560B3B05FC92B7328BAF1C81D72351CA05EF5EF230CE59D3FF7EAC2124E9720E78F4C286B592DB1B4536BF502C77B8F868582A2D059B8C4E5499480DC74B1581AF3C847D99CAABC7A277963A5397F0F0E3E1A5161134ADAF6BFF2719641394DAAA656478FDAC8337BBBB5F694C9650170D26F200537127A26CE5AA66E525BDB774CA62088FCC42FD2D700DF13440FD1F05BAE3FFBA5098F1B7CC28120639569AD1B4DE726BEF0EA6453EC3930F87A612EAECCF9BEDEAB231920D62916A22489A924E52A18BC66BEF7F125D4BA54F064F4C1F1090A0A1F3DA56BF843815B59DF8C8F6ED4CA3A2226F3DADFDAF64DD01189A98BA951D6EAAFE009694A51A86EDE9BBEFFC2F3157EA077BF3148C669E0D2BE4AD439629B469941ECEE71AE5686A850963FACD34B594029B8DE939D97E73AF9CB396D0CE8A5DEE1E142876B9ED482B8487CAC7AD5367510DD4F531C6C4E1418A1B1031EBED7E3A356771608C6A91DB9AFBBA55997B1959B815B344B465CA4C1D2ADE976F3AC6B764F4BAE21DCBED51D2F5BD16AE309FF92996399FB1E50BC2AE521D6EC2ACF1F93EFCD511A66CCFB2B0C8B9445FF5FD8E774E409C970610379AC3C22443EF82EF87758759A506796179D72F227911DD942E9C00AD8C37C7DC7811A545373EF103059C72A9D1A3D6CF3FFC6C64C77CE6EA687FD14AA8BA6B052E3FC07FB8C39BF7045076B5993487E9F4D25E2D1FD82D0A51FE7895E4D0DCC27698ED42F6BC56F6AECD2A3979A141275EDEE8CC02D2F829F3AB3F4F6C71B9BAC2DAF401996E613293BEB634DC4ED8F206D4F23ECC67954DB3BFBE041158C0B5FF055E51FC087150632FA40B18CDC41B715502CD0071FC98E660532C44340528B7D8252FAEF8B333EB8B46998F5DB67EF7A93AE400F3210F4FD6C3E3220CB35F9703AAB17847223A9BD8BAD1FB9BD049494100557F5EC90CCFA99A95C695BA9DC2888FD9F3DD1F3FA9908E699F02F8E34149E22963B8235B60ECFDF86DC7A03D9AFBDD9A7B55BE142AA9B54D68CCDF647AA441B115E70218C32006CE55AD91A2915D33317E8134F49FEA1DD6F4EFA0110B4862A7C18425AD3EB2ECEBCED908E4F13F9AEE7C9AD53300E0F01542BF7B7E5654D133C43CADE22DCF0257DF572E89B5F953325EE58646D8E2FB5A928400F767FDD794484E0A3483ED34EC6D9CF835F898910527A0003BD3D7699CD22F61E4479737247CBF1D91EEB0ADB38C7E6595C10045437090A3B20D3AD3A36BDB9AF75CCF6CD6453CD7665645D176C3895628C269DEEA0C18B0F0A78A5AD2CD1935835A62A9D53E49F00E31B4B9ADC7F7A48148657C441CF49E0CA57FAB3B6F4508CEC57B3BC42A3F04B076020D40D896BF3E0604237E4A7E661B7BDADA2E7B55DB294E88810C369739D3AE502405B5BF819315FA69B7B1FCE5A1C2C292BFF64639D0CA2D517D91DBB0F3F8A92D89AA3A315EE2BAF5E26DDE82AA332142AB0D5919DC75880DCA8F69E113DDABC635165C933285F118C7CBB8C1A9F71D7E2ADCC5CE52604731CBD6E6ABE886AF1F38E3EC54E21CA4E5F2D73D39DC9A76F1F8A2529AFC20088EFB3AD3DBB2CC00F609B56D4BA2D4C692D6320940B172A946C02329820FB99CD61AD1C938C96E1E88E8C7885D288B5D35BC0701E1FEDECC61808D486C90ABF38109EE0D3133D4EC2B50F0762BE8778B8D9CB9E8BC93AA16131B5722AC9E2E8CC92E1B461301EE73CAB9290F5564D6CA567A15FE408EB63330E6E71C68139F34F9BEE5AA43C09D4586E8ED13D88584225CFFB3DC636BAD330A14F628D406F16B15D8B34C4B66570684F1186C4D77EFE0A1B15B7723B2DEE59722F8239469B3C7AEA53FDFF2ADDF7348349795F5BBE2485FD1466D5ADE2265D6AF775DD03481B4B8D645DE335D3562E93A93CFEF1F1DA7E6B964EC6382912F1FEEE36053582960B13CF36BC20CBC31BB4406E7DED085006FED5D91B7AB2A684A0939325302B10652E4A4F29D19B629E65DC0B495970419237FABEBBF313CF0D3F90F1DCE2B6BE18DF96F362ACD78B23A156529891E0526BC351566FB135F3461AC0C46C91B23331C8FAFC886A5DFC27EBF8B8D8BE733398B894A1CA4F2C1B09610E1EAB2B5CFF674AFF27A80D63F4329D79A18579E2B873C300DB9CF226BB89925591B79DF9C2CF87886FD7898C3D545C6DDF38B8628D565E08CCF92040D0A261A430818C68DE1F1D65296D8AEE79BF7A3C00DDE2DD1215BF2F03E732FA4E92B9721A2CA29B284EFE07EDEE8462EFD997403A1D4DB6A6672199AFB870DB2BA46958055C508FFBF13C77A8FF93A88F18C78E692771EC7F3AAFBC9C9720ECD883ED3EB4DEC66BFBE3B83EE27DC9EA3DB6AD83030B826A1C74C67450B7726BD358EDB53B97461AC81ED299296668731E73E76BA3F65ECB46F23E57B4897027A2CBC030FC3546FD950DE96C75CF1F052EBB36A8EEBF48119E87C5995AD0E84A6815B7C903B2FAB897475478499ED821C972AA305EB3778D957AB11600D331C90682C3D07669622B05492940DCB194844E155603D45A0A791FB2C9ECAC176DE2B78BDC8C838C113E338D673848CBF55E8781829957487643275AF62C9E6B630B9B21CAFA507361D8BD39D0F5E32BE3B0D2EB820F4D06B67A1819DDF3142912E48F685B75583755982FDB530BCF29A1E2EE58CAB1594FA5E931CDC52B4FBD94F55972B44D123D6E26AAB1F60AC9167D579EB3810619765E13157BFA39AC2AC0BE772CA0EDD82F561CE893167ED4A4E61808F878B8CE364D36E4B3D1538B7DEDED012787609161EFD16AE65B389B39552DD1ACD3BC55904DB90FBCC807BA468A9A7941F861A317D958D089DE00BF376711295D4C96B6964C6870AA2B5FB78F726693E5220AA311C7AD24BF1D0FC50C7EEBA0B286CBAA1D3511326D76E4934322E6ED26F268E03E4306AB8D670FBD1D304B64209DE3F267E2996B732C07032E6787E5636F9409E9502C5B1B32C267D5997AE87AD6903F38BE9ECB0EC6D0F2E495502BBDBB9A4CBE12DAB09356D3C69EB074FB648AD1C54C277FDE4069D43C6ABBE5EA5E6AD483C16B6C3222EB499E053C77206F9C220C51338E31EE28A98A219FC1DF57DB399763883E6895DFC3C7A832DAC4A43F6D531ACE173740520C6A42936B21234948B31FBBD5A58F1B8ADAF8540F0E428C73676D4E74DD131D8A8B2369129AB146E364375290A1686E2A4A865C5D24ABF6658FEB50F18C3E45C0139D35AAFC523D95E0E06FC06613A7A764347318E1552E7C3868269B7C1697ED0148376F1F7B070BAC5B0E9ACC3A90EEB234124EBBF1D19C73447F7DA0A302BCEF9604281ABFDBBDE857683FD4B6EF613DF24154D34FA40F25837B471C3EB4EAF6DEFF1CBCB765F11D846BB684E816D93B2ECD85ACB3E9D1333EA84D8D224E88A78F6E67468341B7B0F23AD5C80FC7C72157EE732A4398AB95F395A63D5015787552F548A11DFA9BE245F1EE813CC7850A09EE035203FFA3366F0BC70F00367C85C695290A134BE6BA1EABBDCD1C9B4E0C14177BB0541DE87033699B0DEDFE5523CB9DDB331AEEA5F6BCF4BFACD9866D569AE43BC4C2D18C685C4FD132ED5920959279EC65ABE2B23B68FF349912D568EC3CC4AF6EDA4FC3561C9185BF40156B22E5A0CF195C8FC891C43F560BEC196FD760FF8964D332CC6572E91AFA9498E78E8ED43E4248B7EBA31952F7E7799D647A1BACBF106E0DFEAE953189DF61B1C940BB65AE1B70D1D9A510BD8432E9AE6025D3F531B6AA2EA77CBC49186BAC7237A288FEBF02304EF0B2EBF6273AAC3895802FB0E614B5C9E73167ABC2E833CCFE885E4129663F23E9A7ECF3D62F2583BCE67304812DA64234137BF67C4678B4E7FC10D5BFBF478BA29C1729E64231ABE0F611BFD9D40B48B99C37678073BA402885ED58A9824663F8DCE9BFAA709C473CFA28136926CC395F675EA2F34E9EFEF527279DC72D1964AC1B1E45C7F0256AC6C7FB83BE783CDC4317C8C7BA70E02F072969C3AA6CBC0346DA6C3B100E3BF60D52A4AEABC809D9BF55B74A51DC018115790BFAA5AB9FDD5BBB7CB0BF3C47E9A4A9AECD21ECB8F0EBD5CE2C06F262EF2F082DEE76B1253010BE670FA67AFF89059088AC776D30C2A03BCC612A6AFE0CC9003F435A34987D36D1F9DFA105167918BDC0B12D007DD96B99156F518ECF92D99795B5E0CA7D58E977CE35F87E8F6EA57663F9638A32E8D94EFB242DDF5EA767BE5EFAE3C2C7FCE1F16C55060A7D3DA23212CE709BC337EBE6C4DEABF60F7CF6E3AAC49CC561BF1759136009A454A2A0E5E665194E0063B6E5FD3983A45CDFB10D7F8119853804A4C3740F578E83BE95329FD1778B169BC94DAF1FD10D5417FE70011D4329B615E34C72F32A4C85AFF4E90028444EC41DDC9FE1E3C7964E1307A9457FE4A14DEFFCD14324C11BB3592529367C0CAA7AFA9874B0BA51140040316EFA4FFE8422B38EF5943D5E96FBA920CA7BB76BF7278DD9E9E95378E77F9AC079095032FF70414B97FB3D795B2B769CDCF1995AFFBEA094F2621453985F4DA2EC2D4F1E5F14D5D938C5E85B78F8B479943F3D93E66CB464536D2F35560448A7DFBC8D824BB2723B6EF271A681D85BBE0DF3433E93708A17EC56831ABCE174FE260C99E49C01FB11503B6327A8DD2E202429AC480392C0642E3A4ADD2DF6D3FB7D7622A8E23F9D082B6F2816A53E5F03614BE7665C093C9F9391563ACF934DAAC84F1C6C908CA83DB9D67C349869AFB3B6AE5384AA3E04E522874FA18D13266563482F795570FFD1443EFFE14AF86391442186FB7D4AA45EC5F9569C3D6EE38B35BF95E7354E8E5F40D62E35E815714F8730EFCBD9B064437B96E4322AB96570E225E45309A237B57BA7EDD37E73AB49FDA7820AC10DDFF2DE47BCD7960F64E9B2403BE63D50347C8D89A66A090C05DCFE7892F87D3984B64906934ADF36E3DDC3B664B350E2AF9157584F09B0506901226F2C566B85342F4BD1AE96446F40AE873BE92BC66A0643DD8C9286ACC8655B4C767377098B2EFA2D11382C0FD6CD83E57C7204F5A2BE5C7172DA69EBE79033DD7A30448C28B4AE78449A041FDC9F3381BA5E7A2FBD48F6743F487BA59C55F4FEE2504AE6D0DFA241801DFE79EAF470EFFDD4795E75F061DB6C53F97CCE537BE0ACDE2DBB4858C2F62A4313251D7502C145CEBC430BABC8922ECD5D1C2B78CD08820C8AA619FE98A1B15228323A392F523F1C7C448CF025CA57B58B532F6ABA0948AE3BE921CB0985C8A0394F6D8998E271F7E3BE9E707F4F43219CF3527008B126F4DB85983E83414919FB1882FAC4516CC276CF5F67D6E048170726F78BBCE782F6162043573FA8F3E3D6177173C9FD9052441503629C4D4EFCE68F6E3E967CC19D92923206E49590C20E4E5A38A4BF71992953447E27FD8FB4928E09FB3A9E04568162B0ACC8BCBE37B201CDB699E9E1F2269283B3B93FE2BAF621E4CC434C1DFA6EBCB58268958344D684CD40316EFA4FFE8422B38EF5943D5E96FBA920CA7BB76BF7278DD9E9E95378E77F9AC079095032FF70414B97FB3D795B2BBF811C9A99ACB8B32A9F904AEC602FF1E7FE4DDFB85F737F3E6BAC095E6E30D30FFB58CEE8C00A2E20B4BA4A1C6C057C6C634A675B9A542D5FDB862F92AF0F2A3DB5E63E6A747990B39898F4EBDC9DE7C649C45E1D0FC0098EC64726E929CE620A875B4B98539CBF6EFCA8EF192CB90FB65F9196AAC1D8A99CE268EA960B211D9A694B308C4EB02680C19212769CEB109E71628D4F9442FD076A1AED785263DA0885D0C7C1EA93D2C1475C402352F1317088507E0E4216F79CBE4A83E02456287D1400208A9EE8E1472508DC2715E028508FDDCAABE0563F3C036A75B42969F37C0C3D4C29F5553AEBA773F20D5112EA447E390667294F39EB328155010513111C044FB066263AFA6107F3C069F981A95C8DAC20A4E8E40E86B3135DDA286BF6EDE2392A7E71FD027122E2BC3EC5BCFAB833DEB56E77FBAD9F738F7032C6921C51657260C2CF05F3D1358587FC56EAAFA63ED0D2394D2B69FBC6C5B0F34DA7FA6092CC5C318705050C7EB7ED9E158E9599C53B36500027FEDAF2A241C530F7866DB36A0BDFFAEB74504EB0363FC783DE998103C3421172B4C40CC7B01607EB22E47C24D13A0A3BCF0739E38F359813808EF71255E01B90A0AFC619464BEACD0AA8969A2248B2D738B059FBA4643784E67221E6D0C6142A83048D7366E5D3D180ADE9E95A79EDFFDB2B892AB7B3A2F25DE0550EA4B52E9B1C5E2C4F65480B17797F28493C38FD23F3EEA21162E8297B86E49B5283477759DB53E9AD4FD869E7507C60876942968DAA8DF9B7808EC10F7F9C296F862038F8A1E77FF5E3D3A9309DDCF6BBA0660D19B292851FF123712D1E51E9D2F7616A8098D9DF00B0BCEBDD1E15BBFD68CB3C92707E190F7881BB9FCF928F8536F28C7804A00018AFA9BD1937F38BDD65B176BAB441D727C4D3071BDEFC170A84C615F8F53B0D42763519DDB491FF871AE4AC985C9647861FE883E2A0C5B24D02A52A639F8881E095FAF9067F57D4094BE5F2E0F191F7488CD3DD93CA1C5082B6956E6F62DE3061840D3FD8FC3CE5DBEC65E3989AE612D6796FF907F1C6A1891DE2235BB073CDDE9E47588FD4DCF6BBA0660D19B292851FF123712D1E771DF77A062186EDB5F7F030303B19D015BBFD68CB3C92707E190F7881BB9FCF26B2AEC7C1B95C2D2216CC6C134619176DC89CE3D25790BD0BE8E612220D607D52FD79CA26DAB4ECED9EBA35C3126E098FF81ACE1366037AB8D0C81FC87C6AF0C23627B5967B8CBBD27CC6C1A62EEF6DDBAF2F0CCB2CA2609AD9EF3C6EFAFD5416BD7EB16DCE8FC6E2FFBCB0CE080343C8F3E69A6C2C1E7C8FA67429E3B47A24E6CFC8476676A0EE5B9CD485A7752FB9653574640293B018BBEE15D1830C17D52E8401B67BE62F0B075BDDE27A922B45352ADA1D0A0292657CFF5B4E6BD6DAC617813C38D4A65A12C58CDD9FCC6A3953AD27274429EB34EDD58DCB0099E67F1B742EB7053B262155F1FD47E92B089A359E76C4D285AEFD0AF5B3CCD41BF7BA5DFD5CA9E29B212DFCFC02ECFBAA4775EBD5E697934CF243CD211E611FF9C54E2B43A21C8DDAA35E923E92F32CFC0F44A168E26E308F0D5C660DF601CFB6D9A35BBDCC16F5CA67ADF167F35313834A4CC8F7D2FA689C01C71D049E4856B1F10E79B35EBE3139CBED5AB4D1E685596BC92DCABF8DCD54852139AD03C811DF81F8176B417154C47F87EB13B5C783B0A1BEA70C6394F28DBC1C934F098FE167E1DCC7B695746C15E47E9DF2F390EB7ACBACE327EA0DC3E20A2D4E7F657D09E5D3CFAE463CC7CDDF7E38A978D5D5AF35B98C910DC2C79EB3A53B750C417C6C14AE6C16FD611B2A9A8BB91DF3418CE7EB7BA87F8B2C6FD26D1019E39DDF5DA802837457A98C9DEE2B6FB90AF4068DECA8F5E8B2AAF48645760584C602AD3BFAB4BD8369EB0D958EBC89C0FF2C4A73FE1CCAA802370863CD24ECB0A0A4933F2F02B5A707B5FBA9A778391055FC70CE6753DF36C2D62D49C91F62DF6E42DDA7303387E463C2C382A8A1B430A6262BD6C9D9838DA67F3631E7A8EB41E360F0CA190DA43C3AF195727B41AC51DAB4B8E2D6C58D242BF388B7738FC09194DCDDAF1F859558FD973721FB9F6FBFF748650CE4F2D12BCBE241C5AAFD717A20B80F6C5E53D3A5F50B8463A57AC39657B13D410BF975D5D65494648AB8826448E3053038D475CE42F72F27BEF2E36033F12F96AE8F719B1F31CE6AA346AFA23537D743DF5C430E96E8CD1F6CEB50E75174FA04A7AE8948EB89D46FC9BA233BA4AD8B9C57E7B357B06A7ACD29C8AB7D702F7BF18B990FECD15A3BB2AFA7B415EB09A3F48C341BBF7EEDE24B339C8515010E0C4CCAFCFBB2813EFA9A84FC466991FAE52715EC4C26A7E0E0063917E5BCFD96AE966AF846F25EE04CD6174E649CA7B8A52B803D3B4C26A14D4AA544CBE1D12020FF078947879C1B6D553545CEF2BF28C1807EF7216BB6DB3388F97A8DE80A5B921AFAA5D0EF8462A9F6B064E1186D3AC5EB012C28C10FAD0B58CFCAED362E6B9B6C47A7993602876E780F4A08665F65DD3A4C6B7BD24EF38EE86430A80820338ABA932A22AAEFE25D7BE2E2DC0C7D1ABF5055C7F52B63A2D9FAB474CC49C5F886890A9E90C094505635EE7E4F65C1C14B0410D1A14527679F0C88C11ED4EB528C3C7930B1D093F43CE6E5562A14F5CF151174AE14B98E90D2A8115BDA20174856B71406C627492190E8F8CB8346D5796C0BE39A19396A62521F19A76A36C0D7A0816AD5ED717B33EB742904C1E980BD425B3C936B3AAC9BF0FEC84369C8EB3ABF1072FF63AF5E6E8CADD00F0336624AFB714ACD524C0594F3080ABBE44F197BC6AC77542D4FF7EB10092227615640A3C03258794D96936AAA34CF32394EF04E29EDCCE2186081421BF595FAD4E7BC9725F4E9789C09E067C8C6F2F0C80F13FE43764CC3EE9A0D813F4107CE388CD20CB76298693F6D4D6CE65BBA32DF9B80F6FD32B8D53975A2B20C96151C63EEFE7EE3458E32942DE4FC775C3AE4BCF7AF90BD6028E5AA9BDAE803DB6C023589F664903EB889A8EF1BF27EEF271DAEEA0E398F68AF5078A9D33162503D240DBD16A8A8A7EE078D612857938A53E91DED56EBD9DC0E757F88FB48DEA48FF701406004461A9AB5125F189D882349F70774ACCB4D45D9DDD20329E4D856A77A5E644D73AA92585D2E286F41227B95AD050278E206477617DCE3DABBD72B81621D2BF3B8B44BC6FC55C99DBC610FD4630B9E868455ED5E69CCF18F48E90C6B2E613A06651769D0BB31A879A38C12A85138834043C6545A85A8E8317ACC7EBCC0BE492D7D6028E1BFD2BDBD1D515142FFA9B9BE42507DDF8CB202A2B9B6E8E13A61D11A13ED54326F73CE6A28BF1803B4E9758B07D19D9D30F3BFDEEEB79DD51B4D2C7A4D3C4187E8D402AF3B5F103411F992722B213362FA7A07619FC7A296EEA585382D1082C52E5C4EC703F3997DDB14745DAB7CBD9EEEFB4D0CE5F01FABDDFC31A9B0F0D7A8B2C791807440786E6D7E9A94EE6D67FCC70F40DCCBFEFB12951986159254BB422F86A54A5889BF871043222858E51CA4E41A8EC4487F5D41077DCB856E73B9410075D761E6613074AF1E00A9DFA7DB9146DB9C4833730800976C3AF55DCC50E70D52FDBDF082BE30BDA4AFF91F4FEF12C926BBA928B4F44E7206F2A604A80D25F49AA6D231FB0694AEF6DB4ACC8A6CC9B969581431CCE458B660F205CA117682050494324AE3EB758049F8EECF4A3073FB8FFEDF54C2420ADA9520BDC946112A64908D4A072394371341A42DFED1CCC2BB2BF55AD6138325F46FE8B8B61ABA0A7AB2679E3BBEE7CEB18E93FD5AD0710AD9B63548F268DE94E7A32D5BAF57F8E9AAD87017AB398FAF8CFEF856C4F376DB77B30F1E79E7E4F1D08DC72F0ADC6B8D79F7E1A9F262226758EBFF31E1011E02A1D3374B2C85DFD6D28A28984A84CAB3B36C07D589D48A1E59E0C0D4AE81B58EFD6C13D741A10F91D2FF77F33ADCE2653D96CE25A95C8340C1766D78E4A951C833D0F1F1C0C037248262EB18F4942D8F0EA40AB94A409C0854B3F8C078EAFA7E7DD6C2F4539B9076B150FBB4D8DE7D6E6D8AF0EA0AC821B1BFA57677FD1A2DB02AC05A1B306459D775DD67DA3EE957C3740B6F777D198B88A27CE86CB795FD742350A7F39F5FE058B3A382D1B8FE121EF236415EFFDEB739B19A6EF285262C1F0C845C9A7B1FADABA3E2E87AE3175A1C610FFDCAA148B32D726D741F7DBB8AC0D0E4D8BCDA02F6F44F1A2171999237D22EBD42977D2C4CF4E1C8069E7E7056B7A9157AEF4E0A3AA6B2673054ED50D7ABAE5D0052D08DEA4E7BC834DC440F3E5F2939DE72BEA396D9F4EDF8D588208271EF89199E28A74BEFBCEA0C66825FD6AD76A88D302E6C9716EA883101DC8CFE5AACE738A6C1F33B633C5E1869F7CCD3A26218965E407F661E3B589A2633F83EF46BCFA25785252710C7877DD8B93C9D0A28F1468AD3AF67C98FD20820AEFDF1842CA880390F22C7389D6676D77EF34203F024C4DFB539320869FD1B6214A697C5E9378B7E63B6F38A7D55CD9F5B5139A7B79AB6F3435DC2D7B432C3C325D604019E22CC16FCC52AE6E5C5784212309D5935C1DBC11B2BB22AAF7855B87131A2BD4FEDD6C921474CC89CDFCE7A8C91A8D49E7F892A78223E796A39C5132093A66BCD222E74B48CAD76A4A00551B6C5E1B3E9BDA986ABE914CDE65ED34389D4F601F73137A91F37EAFD91DA4F8BFD398ECFD423A930058CAF529D3BC7320EB6B6F7E18CF15C44986BA1CFDEE84049BAB3C1BC74851BD
\ No newline at end of file
diff --git "a/spider/js/\347\225\252\350\214\204\346\274\253\347\224\273[\347\224\273].js" "b/spider/js/\347\225\252\350\214\204\346\274\253\347\224\273[\347\224\273].js"
index b183a52d..98e71dda 100644
--- "a/spider/js/\347\225\252\350\214\204\346\274\253\347\224\273[\347\224\273].js"
+++ "b/spider/js/\347\225\252\350\214\204\346\274\253\347\224\273[\347\224\273].js"
@@ -10,6 +10,7 @@
})
*/
+
var rule = {
类型: '漫画',
title: '番茄漫画',
@@ -29,12 +30,13 @@ var rule = {
limit: 10,
class_parse: async function () {
let {input} = this;
+ // log('[class_parse] input:', input);
let html = await request(input);
let data = html.parseX.data;
let d = data.filter(item => item.url.trim()).map((it) => {
return {
type_name: it.title,
- type_id: it.url,
+ type_id: gzip(it.url),
}
});
return {class: d}
@@ -74,11 +76,15 @@ var rule = {
推荐: async function () {
let {HOST} = this;
let url = HOST + '/api/discover?tab=漫画&type=7&gender=2&genre_type=110&page=1';
+ // log('[推荐]: url: ' + url);
let html = await request(url);
return this.parseList(html);
},
一级: async function (tid, pg, filter, extend) {
+ // log('[一级]: tid:', tid);
+ tid = ungzip(tid);
input = jinja.render(tid, {page: pg});
+ // log('[一级]: input: ' + input);
let html = await request(input);
return this.parseList(html);
},
diff --git "a/spider/js/\350\256\276\347\275\256\344\270\255\345\277\203.js" "b/spider/js/\350\256\276\347\275\256\344\270\255\345\277\203.js"
index 3124489c..49c5cf27 100644
--- "a/spider/js/\350\256\276\347\275\256\344\270\255\345\277\203.js"
+++ "b/spider/js/\350\256\276\347\275\256\344\270\255\345\277\203.js"
@@ -401,7 +401,7 @@ var rule = {
d.push(getInput('get_enable_dr2', '查看drpy2源启用状态', images.settings));
d.push(genMultiInput('enable_py', '设置py源启用状态', '设置为1可启用此功能,设置为2启用T4(默认没设置也属于启动,设置其他值关闭)', images.settings));
d.push(getInput('get_enable_py', '查看py源启用状态', images.settings));
- d.push(genMultiInput('enable_php', '设置php源启用状态', '设置为1可启用此功能,设置为0可关闭(默认没设置也属于启动,设置其他值关闭)', images.settings));
+ d.push(genMultiInput('enable_php', '设置php源启用状态', '设置为1可启用此功能,设置为0可关闭(1-T4|2-T3 默认没设置也属于启动1,设置其他值关闭)', images.settings));
d.push(getInput('get_enable_php', '查看php源启用状态', images.settings));
d.push(genMultiInput('enable_cat', '设置cat源启用状态', '设置为1可启用此功能,设置为2启用T4(默认没设置也属于启动,设置其他值关闭)', images.settings));
d.push(getInput('get_enable_cat', '查看cat源启用状态', images.settings));
diff --git "a/spider/php/74P\347\246\217\345\210\251\345\233\276 \341\265\210\341\265\207[\347\224\273].php" "b/spider/php/74P\347\246\217\345\210\251\345\233\276 \341\265\210\341\265\207[\347\224\273].php"
new file mode 100644
index 00000000..7523dddd
--- /dev/null
+++ "b/spider/php/74P\347\246\217\345\210\251\345\233\276 \341\265\210\341\265\207[\347\224\273].php"
@@ -0,0 +1,210 @@
+dbPath = __DIR__ . '/' . $dbName;
+
+ // 尝试查找对应的数据库文件 (如果当前文件名不匹配,尝试查找原版爬虫名对应的db)
+ if (!file_exists($this->dbPath)) {
+ $originName = '74P福利图 ᵈᶻ[画].db';
+ if (file_exists(__DIR__ . '/' . $originName)) {
+ $this->dbPath = __DIR__ . '/' . $originName;
+ }
+ }
+
+ try {
+ $this->db = new SQLite3($this->dbPath);
+ $this->db->busyTimeout(5000);
+ } catch (Exception $e) {
+ // 数据库连接失败,可能是文件不存在
+ }
+ }
+
+ public function isVideoFormat($url) {
+ return false;
+ }
+
+ public function manualVideoCheck() {
+ return false;
+ }
+
+ public function homeContent($filter) {
+ if (!$this->db) return ['class' => []];
+
+ $classes = [];
+ $res = $this->db->query("SELECT tid, name FROM categories");
+ while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
+ $classes[] = [
+ "type_id" => $row['tid'],
+ "type_name" => $row['name']
+ ];
+ }
+ return ['class' => $classes, 'filters' => []];
+ }
+
+ public function homeVideoContent() {
+ return ['list' => []];
+ }
+
+ public function categoryContent($tid, $pg = 1, $filter = [], $extend = []) {
+ if (!$this->db) return ['list' => [], 'page' => $pg, 'pagecount' => 0, 'limit' => 20, 'total' => 0];
+
+ $limit = 20;
+ $offset = ($pg - 1) * $limit;
+
+ // 获取总数
+ $countStmt = $this->db->prepare("SELECT COUNT(*) as total FROM vods WHERE type_id = :tid");
+ $countStmt->bindValue(':tid', $tid, SQLITE3_TEXT);
+ $countRes = $countStmt->execute();
+ $total = 0;
+ if ($row = $countRes->fetchArray(SQLITE3_ASSOC)) {
+ $total = $row['total'];
+ }
+
+ $stmt = $this->db->prepare("SELECT * FROM vods WHERE type_id = :tid ORDER BY crawled_at DESC LIMIT :limit OFFSET :offset");
+ $stmt->bindValue(':tid', $tid, SQLITE3_TEXT);
+ $stmt->bindValue(':limit', $limit, SQLITE3_INTEGER);
+ $stmt->bindValue(':offset', $offset, SQLITE3_INTEGER);
+
+ $res = $stmt->execute();
+ $vlist = [];
+ while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
+ $vlist[] = [
+ 'vod_id' => $row['vod_id'],
+ 'vod_name' => $row['vod_name'],
+ 'vod_pic' => $row['vod_pic'],
+ 'vod_remarks' => $row['vod_remarks'],
+ 'style' => ["type" => "rect", "ratio" => 1.33]
+ ];
+ }
+
+ $pageCount = ceil($total / $limit);
+
+ return ['list' => $vlist, 'page' => $pg, 'pagecount' => $pageCount, 'limit' => $limit, 'total' => $total];
+ }
+
+ public function detailContent($ids) {
+ if (!$this->db) return ['list' => []];
+
+ $vod_id = $ids[0];
+
+ // 1. 获取视频详情 (关联 categories 获取 type_name)
+ $stmt = $this->db->prepare("
+ SELECT v.*, c.name as type_name
+ FROM vods v
+ LEFT JOIN categories c ON v.type_id = c.tid
+ WHERE v.vod_id = :vod_id
+ ");
+ $stmt->bindValue(':vod_id', $vod_id, SQLITE3_TEXT);
+ $res = $stmt->execute();
+ $vod_row = $res->fetchArray(SQLITE3_ASSOC);
+
+ if (!$vod_row) return ['list' => []];
+
+ $vod = [
+ 'vod_id' => $vod_row['vod_id'],
+ 'vod_name' => $vod_row['vod_name'],
+ 'vod_pic' => $vod_row['vod_pic'],
+ 'type_name' => $vod_row['type_name'],
+ 'vod_content' => $vod_row['vod_content'],
+ 'vod_play_from' => '',
+ 'vod_play_url' => ''
+ ];
+ $vod_pk = $vod_row['id'];
+
+ // 2. 获取剧集列表 (关联 play_sources 获取 play_from)
+ $stmt_ep = $this->db->prepare("
+ SELECT e.*, s.name as play_from
+ FROM episodes e
+ LEFT JOIN play_sources s ON e.sid = s.id
+ WHERE e.vod_pk = :vod_pk
+ ");
+ $stmt_ep->bindValue(':vod_pk', $vod_pk, SQLITE3_INTEGER);
+ $res_ep = $stmt_ep->execute();
+
+ $episodes_map = []; // play_from => [ "name$url" ]
+
+ while ($row = $res_ep->fetchArray(SQLITE3_ASSOC)) {
+ $play_from = $row['play_from'];
+ $name = $row['name'];
+ // 优先使用已解析的 URL,如果没有则使用原始 URL
+ $url = !empty($row['resolved_url']) ? $row['resolved_url'] : $row['raw_url'];
+
+ if (!isset($episodes_map[$play_from])) {
+ $episodes_map[$play_from] = [];
+ }
+ $episodes_map[$play_from][] = "{$name}\${$url}";
+ }
+
+ $play_from_list = [];
+ $play_url_list = [];
+
+ foreach ($episodes_map as $from => $eps) {
+ $play_from_list[] = $from;
+ $play_url_list[] = implode("#", $eps);
+ }
+
+ $vod['vod_play_from'] = implode("$$$", $play_from_list);
+ $vod['vod_play_url'] = implode("$$$", $play_url_list);
+
+ return ['list' => [$vod]];
+ }
+
+ public function searchContent($key, $quick = false, $pg = 1) {
+ if (!$this->db) return ['list' => [], 'page' => $pg];
+
+ $limit = 20;
+ $offset = ($pg - 1) * $limit;
+
+ // 获取总数
+ $countStmt = $this->db->prepare("SELECT COUNT(*) as total FROM vods WHERE vod_name LIKE :key");
+ $countStmt->bindValue(':key', "%$key%", SQLITE3_TEXT);
+ $countRes = $countStmt->execute();
+ $total = 0;
+ if ($row = $countRes->fetchArray(SQLITE3_ASSOC)) {
+ $total = $row['total'];
+ }
+
+ $stmt = $this->db->prepare("SELECT * FROM vods WHERE vod_name LIKE :key ORDER BY crawled_at DESC LIMIT :limit OFFSET :offset");
+ $stmt->bindValue(':key', "%$key%", SQLITE3_TEXT);
+ $stmt->bindValue(':limit', $limit, SQLITE3_INTEGER);
+ $stmt->bindValue(':offset', $offset, SQLITE3_INTEGER);
+
+ $res = $stmt->execute();
+ $vlist = [];
+ while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
+ $vlist[] = [
+ 'vod_id' => $row['vod_id'],
+ 'vod_name' => $row['vod_name'],
+ 'vod_pic' => $row['vod_pic'],
+ 'vod_remarks' => $row['vod_remarks'],
+ 'style' => ["type" => "rect", "ratio" => 1.33]
+ ];
+ }
+
+ $pageCount = ceil($total / $limit);
+ return ['list' => $vlist, 'page' => $pg, 'pagecount' => $pageCount, 'limit' => $limit, 'total' => $total];
+ }
+
+ public function playerContent($flag, $id, $vipFlags = []) {
+ // id 已经是 detailContent 中返回的 url
+ // 如果是已解析的 pics:// 链接,直接返回
+ // 如果是原始链接,说明爬取时未解析成功,这里直接返回原始链接让客户端尝试处理(虽然本地模式下通常无法处理网络请求,但保持一致性)
+ return [
+ "parse" => 0,
+ "playUrl" => "",
+ "url" => $id,
+ "header" => ""
+ ];
+ }
+}
diff --git "a/spider/php/74P\347\246\217\345\210\251\345\233\276 \341\265\210\341\266\273[\347\224\273].db" "b/spider/php/74P\347\246\217\345\210\251\345\233\276 \341\265\210\341\266\273[\347\224\273].db"
new file mode 100644
index 00000000..53557b2d
Binary files /dev/null and "b/spider/php/74P\347\246\217\345\210\251\345\233\276 \341\265\210\341\266\273[\347\224\273].db" differ
diff --git "a/spider/php/74P\347\246\217\345\210\251\345\233\276 \341\265\210\341\266\273[\347\224\273].php" "b/spider/php/74P\347\246\217\345\210\251\345\233\276 \341\265\210\341\266\273[\347\224\273].php"
index 38c67ae8..4ca5b177 100644
--- "a/spider/php/74P\347\246\217\345\210\251\345\233\276 \341\265\210\341\266\273[\347\224\273].php"
+++ "b/spider/php/74P\347\246\217\345\210\251\345\233\276 \341\265\210\341\266\273[\347\224\273].php"
@@ -172,7 +172,7 @@ public function detailContent($ids) {
];
if (preg_match('/]*>(.*?)<\/h1>/', $html, $h1)) {
- $vod['vod_name'] = $h1[1];
+ $vod['vod_name'] = trim(strip_tags($h1[1]));
}
$contentHtml = "";
@@ -258,6 +258,8 @@ private function scrapeAllImages($url) {
foreach ($matches[1] as $src) {
$lowerSrc = strtolower($src);
if (strpos($lowerSrc, '.gif') !== false || strpos($lowerSrc, '.svg') !== false || strpos($lowerSrc, 'logo') !== false || strpos($lowerSrc, 'avatar') !== false || strpos($lowerSrc, 'icon') !== false) continue;
+ if (strpos($lowerSrc, '/covers/') !== false) continue; // 过滤封面图推荐
+
if (strpos($src, '//') === 0) $src = 'https:' . $src;
elseif (strpos($src, '/') === 0) $src = $this->baseUrl . $src;
diff --git "a/spider/php/PHP\345\206\231\346\272\220(\351\201\223\351\225\277).pdf" "b/spider/php/PHP\345\206\231\346\272\220(\351\201\223\351\225\277).pdf"
index 104678d6..cc46c03f 100644
Binary files "a/spider/php/PHP\345\206\231\346\272\220(\351\201\223\351\225\277).pdf" and "b/spider/php/PHP\345\206\231\346\272\220(\351\201\223\351\225\277).pdf" differ
diff --git a/spider/php/_crawler_bridge.php b/spider/php/_crawler_bridge.php
new file mode 100644
index 00000000..078a139d
--- /dev/null
+++ b/spider/php/_crawler_bridge.php
@@ -0,0 +1,73 @@
+ [args...]
+
+ini_set('display_errors', 0); // Disable error printing to stdout
+error_reporting(E_ALL);
+date_default_timezone_set('Asia/Shanghai');
+
+header('Content-Type: application/json');
+
+$output = ['status' => 'error', 'data' => null, 'message' => ''];
+
+try {
+ if ($argc < 3) {
+ throw new Exception("Usage: php crawler_bridge.php [args...]");
+ }
+
+ $spiderPath = $argv[1];
+ $method = $argv[2];
+ $args = array_slice($argv, 3);
+
+ if (!file_exists($spiderPath)) {
+ throw new Exception("Spider file not found: $spiderPath");
+ }
+
+ // Capture any output during include
+ ob_start();
+ require_once $spiderPath;
+ ob_end_clean();
+
+ if (!class_exists('Spider')) {
+ throw new Exception("Class 'Spider' not found in $spiderPath");
+ }
+
+ $spider = new Spider();
+ if (method_exists($spider, 'init')) {
+ $spider->init();
+ }
+
+ if (!method_exists($spider, $method)) {
+ throw new Exception("Method '$method' not found in Spider class");
+ }
+
+ // Call method with args
+ // Note: Args passed from CLI are strings. Some methods might expect specific types.
+ // However, PHP is loosely typed, so it usually works.
+ // Special handling for extend field or complex structures might be needed if passed via CLI,
+ // but standard DrPy methods usually take simple scalars (tid, page, filter) or arrays.
+ // For complex args (like filter array), we might need to decode JSON passed as string.
+
+ $methodArgs = [];
+ foreach ($args as $arg) {
+ // Try to decode JSON args if they look like JSON
+ $decoded = json_decode($arg, true);
+ if (json_last_error() === JSON_ERROR_NONE) {
+ $methodArgs[] = $decoded;
+ } else {
+ $methodArgs[] = $arg;
+ }
+ }
+
+ $result = call_user_func_array([$spider, $method], $methodArgs);
+
+ $output['status'] = 'success';
+ $output['data'] = $result;
+
+} catch (Exception $e) {
+ $output['message'] = $e->getMessage();
+ $output['trace'] = $e->getTraceAsString();
+}
+
+echo json_encode($output, JSON_UNESCAPED_UNICODE);
diff --git a/spider/php/config.php b/spider/php/config.php
index 01b694c5..839289ae 100644
--- a/spider/php/config.php
+++ b/spider/php/config.php
@@ -42,7 +42,9 @@
if (in_array($file, ['index.php', 'spider.php', 'example_t4.php', 'test_runner.php']) ||
$file === $self ||
strpos($file, '_') === 0 ||
- fnmatch('config*.php', $file)) {
+ fnmatch('config*.php', $file) ||
+ stripos($file, 'test') !== false ||
+ stripos($file, 'bridge') !== false) {
continue;
}
diff --git a/spider/php/crawler.py b/spider/php/crawler.py
new file mode 100644
index 00000000..4cf5d793
--- /dev/null
+++ b/spider/php/crawler.py
@@ -0,0 +1,503 @@
+import subprocess
+import sqlite3
+import json
+import os
+import sys
+import time
+import argparse
+import threading
+import queue
+from datetime import datetime
+from concurrent.futures import ThreadPoolExecutor
+
+# --- 用户配置区域 (User Configuration) ---
+# 默认使用的PHP爬虫文件路径
+# 获取当前脚本所在目录
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+# 获取项目根目录 (假设脚本在 scripts/python,根目录在 ../../)
+PROJECT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, "../../"))
+DEFAULT_SPIDER = os.path.join(SCRIPT_DIR, "74P福利图 ᵈᶻ[画].php")
+
+# 每个分类默认最大爬取页数 (设置为 0 或 None 表示不限制,直到爬完)
+DEFAULT_MAX_PAGES = 1
+# 默认并发线程数
+DEFAULT_THREADS = 8
+# 是否解析最终播放地址 (True: 解析并存入resolved_url, False: 只存入原始链接)
+RESOLVE_FINAL_URLS = True
+# PHP 命令路径
+PHP_CMD = "php"
+# 桥接脚本路径
+BRIDGE_SCRIPT = os.path.join(SCRIPT_DIR, "_crawler_bridge.php")
+
+# --- 数据库管理 (Database Manager) ---
+class DBManager:
+ def __init__(self, db_path):
+ # check_same_thread=False 允许在多线程中使用同一个连接,但需要我们自己加锁
+ self.conn = sqlite3.connect(db_path, check_same_thread=False)
+ self.cursor = self.conn.cursor()
+ self.lock = threading.Lock()
+ self.init_tables()
+ self._source_cache = {}
+
+ def init_tables(self):
+ with self.lock:
+ # 优化:移除 source_file 字段 (假设每个DB只对应一个源)
+ # 优化:移除 type_name (通过关联查询获取)
+ # 优化:crawled_at 使用 INTEGER 时间戳
+
+ self.cursor.execute('''
+ CREATE TABLE IF NOT EXISTS categories (
+ tid TEXT PRIMARY KEY,
+ name TEXT
+ )
+ ''')
+
+ self.cursor.execute('''
+ CREATE TABLE IF NOT EXISTS vods (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ vod_id TEXT UNIQUE,
+ vod_name TEXT,
+ type_id TEXT,
+ vod_pic TEXT,
+ vod_remarks TEXT,
+ vod_content TEXT,
+ crawled_at INTEGER,
+ FOREIGN KEY(type_id) REFERENCES categories(tid)
+ )
+ ''')
+
+ # 新增:播放源表 (归一化 play_from)
+ self.cursor.execute('''
+ CREATE TABLE IF NOT EXISTS play_sources (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ name TEXT UNIQUE
+ )
+ ''')
+
+ self.cursor.execute('''
+ CREATE TABLE IF NOT EXISTS episodes (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ vod_pk INTEGER,
+ sid INTEGER,
+ name TEXT,
+ raw_url TEXT,
+ resolved_url TEXT,
+ FOREIGN KEY(vod_pk) REFERENCES vods(id),
+ FOREIGN KEY(sid) REFERENCES play_sources(id)
+ )
+ ''')
+ self.conn.commit()
+
+ def get_or_create_source(self, name):
+ # 简单缓存
+ if name in self._source_cache:
+ return self._source_cache[name]
+
+ with self.lock:
+ try:
+ self.cursor.execute('INSERT OR IGNORE INTO play_sources (name) VALUES (?)', (name,))
+ self.cursor.execute('SELECT id FROM play_sources WHERE name = ?', (name,))
+ row = self.cursor.fetchone()
+ if row:
+ sid = row[0]
+ self._source_cache[name] = sid
+ return sid
+ return 0
+ except Exception as e:
+ print(f"[DB Error] get_or_create_source: {e}")
+ return 0
+
+ def save_category(self, tid, name):
+ with self.lock:
+ try:
+ self.cursor.execute('INSERT OR IGNORE INTO categories (tid, name) VALUES (?, ?)',
+ (tid, name))
+ # 如果名称更新了,也可以 update
+ self.cursor.execute('UPDATE categories SET name = ? WHERE tid = ? AND name != ?', (name, tid, name))
+ self.conn.commit()
+ except Exception as e:
+ print(f"[DB Error] save_category: {e}")
+
+ def item_exists(self, vod_id):
+ with self.lock:
+ try:
+ self.cursor.execute('SELECT 1 FROM vods WHERE vod_id = ?', (vod_id,))
+ return self.cursor.fetchone() is not None
+ except Exception as e:
+ print(f"[DB Error] item_exists: {e}")
+ return False
+
+ def save_vod(self, data):
+ with self.lock:
+ try:
+ self.cursor.execute('''
+ INSERT OR REPLACE INTO vods (vod_id, vod_name, type_id, vod_pic, vod_remarks, vod_content, crawled_at)
+ VALUES (?, ?, ?, ?, ?, ?, ?)
+ ''', (
+ data.get('vod_id'),
+ data.get('vod_name'),
+ data.get('type_id'),
+ data.get('vod_pic'),
+ data.get('vod_remarks'),
+ data.get('vod_content'),
+ int(time.time())
+ ))
+ vod_pk = self.cursor.lastrowid
+ if vod_pk == 0:
+ self.cursor.execute('SELECT id FROM vods WHERE vod_id = ?', (data.get('vod_id'),))
+ res = self.cursor.fetchone()
+ if res: vod_pk = res[0]
+
+ self.conn.commit()
+ return vod_pk
+ except Exception as e:
+ print(f"[DB Error] save_vod: {e}")
+ return None
+
+ def save_episodes(self, vod_pk, episodes):
+ # 预处理 source_id 以减少锁内操作时间
+ # 但 get_or_create_source 本身也加锁,所以这里可以先收集
+ processed_eps = []
+ for ep in episodes:
+ sid = self.get_or_create_source(ep['play_from'])
+ processed_eps.append((sid, ep['name'], ep['url'], ep.get('resolved_url', '')))
+
+ with self.lock:
+ try:
+ self.cursor.execute('DELETE FROM episodes WHERE vod_pk = ?', (vod_pk,))
+ self.cursor.executemany('''
+ INSERT INTO episodes (vod_pk, sid, name, raw_url, resolved_url)
+ VALUES (?, ?, ?, ?, ?)
+ ''', [(vod_pk, sid, name, raw_url, res_url) for sid, name, raw_url, res_url in processed_eps])
+ self.conn.commit()
+ except Exception as e:
+ print(f"[DB Error] save_episodes: {e}")
+
+ def close(self):
+ self.conn.close()
+
+# --- PHP 桥接调用 (PHP Bridge) ---
+class PHPBridge:
+ def __init__(self, spider_path):
+ self.spider_path = spider_path
+
+ def call(self, method, *args):
+ # 构建命令
+ cmd = [PHP_CMD, BRIDGE_SCRIPT, self.spider_path, method]
+ cmd_args = []
+ for arg in args:
+ if isinstance(arg, (dict, list)):
+ cmd_args.append(json.dumps(arg))
+ else:
+ cmd_args.append(str(arg))
+ cmd.extend(cmd_args)
+
+ try:
+ # subprocess.run 是同步阻塞的,但在多线程中调用是安全的
+ result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8')
+ if result.returncode != 0:
+ if "Warning" not in result.stderr and "Notice" not in result.stderr:
+ pass
+ return None
+
+ output = result.stdout.strip()
+ try:
+ json_res = json.loads(output)
+ if json_res['status'] == 'success':
+ return json_res['data']
+ else:
+ return None
+ except json.JSONDecodeError:
+ return None
+
+ except Exception as e:
+ print(f"[Bridge Error] {e}")
+ return None
+
+# --- 任务追踪器 (Task Tracker) ---
+class TaskTracker:
+ def __init__(self):
+ self.lock = threading.Lock()
+ self.cond = threading.Condition(self.lock)
+ self.pending = 0
+
+ def add(self, n=1):
+ with self.lock:
+ self.pending += n
+
+ def done(self):
+ with self.lock:
+ self.pending -= 1
+ if self.pending == 0:
+ self.cond.notify_all()
+
+ def wait_until_done(self):
+ with self.lock:
+ while self.pending > 0:
+ self.cond.wait()
+
+# --- 统计与监控 (Stats & Monitor) ---
+class Stats:
+ def __init__(self):
+ self.lock = threading.Lock()
+ self.categories_found = 0
+ self.pages_scanned = 0
+ self.items_found = 0
+ self.items_processed = 0
+ self.items_skipped = 0
+ self.episodes_resolved = 0
+ self.errors = 0
+ self.start_time = time.time()
+
+ def inc(self, field, count=1):
+ with self.lock:
+ setattr(self, field, getattr(self, field) + count)
+
+# --- 爬虫逻辑 (Crawler Logic) ---
+class Crawler:
+ def __init__(self, spider_path, db_path, max_pages=DEFAULT_MAX_PAGES, max_workers=DEFAULT_THREADS):
+ self.spider_path = spider_path
+ self.bridge = PHPBridge(spider_path)
+ self.db = DBManager(db_path)
+ self.max_pages = max_pages
+ self.max_workers = max_workers
+ self.stats = Stats()
+ self.executor = ThreadPoolExecutor(max_workers=max_workers)
+ self.tracker = TaskTracker()
+ self.running = True
+
+ # 启动监控线程
+ self.monitor_thread = threading.Thread(target=self.monitor_loop, daemon=True)
+ self.monitor_thread.start()
+
+ def submit_task(self, func, *args):
+ self.tracker.add()
+ self.executor.submit(self._wrap_task, func, *args)
+
+ def _wrap_task(self, func, *args):
+ try:
+ func(*args)
+ except Exception as e:
+ print(f"[Task Error] {e}")
+ self.stats.inc('errors')
+ finally:
+ self.tracker.done()
+
+ def run(self):
+ print(f"🚀 开始并发爬取: {os.path.basename(self.spider_path)}")
+ print(f"⚙️ 配置: 最大线程={self.max_workers}, 每个分类最大页数={self.max_pages}, 解 析地址={RESOLVE_FINAL_URLS}")
+
+ # 1. 获取首页分类
+ home_data = self.bridge.call('homeContent', True)
+ if not home_data or 'class' not in home_data:
+ print("❌ 无法获取分类信息,退出。")
+ return
+
+ categories = home_data['class']
+ self.stats.categories_found = len(categories)
+ print(f"📋 获取到 {len(categories)} 个分类,开始派发任务...")
+
+ # 2. 保存分类并派发分类任务
+ for cat in categories:
+ tid = str(cat['type_id'])
+ name = cat['type_name']
+ self.db.save_category(tid, name)
+ self.submit_task(self.process_category, tid, name)
+
+ # 3. 等待所有任务完成
+ self.tracker.wait_until_done()
+ self.running = False
+
+ self.print_final_stats()
+
+ # 关闭 executor 和 db
+ self.executor.shutdown(wait=True)
+ self.db.close()
+
+ def monitor_loop(self):
+ while self.running:
+ self.print_progress()
+ time.sleep(1)
+
+ def print_progress(self):
+ elapsed = time.time() - self.stats.start_time
+ speed = self.stats.items_processed / elapsed if elapsed > 0 else 0
+ # \033[K 清除当前行剩余内容,确保更新时不会有残留字符
+ sys.stdout.write(
+ f"\r\033[K⏱️ {elapsed:.1f}s | "
+ f"Pages: {self.stats.pages_scanned} | "
+ f"Items: {self.stats.items_processed}/{self.stats.items_found} | "
+ f"Skip: {self.stats.items_skipped} | "
+ f"Eps: {self.stats.episodes_resolved} | "
+ f"Speed: {speed:.2f} it/s | "
+ f"Err: {self.stats.errors}"
+ )
+ sys.stdout.flush()
+
+ def print_final_stats(self):
+ elapsed = time.time() - self.stats.start_time
+ print("\n" + "-" * 50)
+ print(f"统计报告:")
+ print(f" 总耗时: {elapsed:.2f} 秒")
+ print(f" 扫描页数: {self.stats.pages_scanned}")
+ print(f" 处理资源: {self.stats.items_processed}")
+ print(f" 跳过资源: {self.stats.items_skipped}")
+ print(f" 解析集数: {self.stats.episodes_resolved}")
+ print(f" 错误数量: {self.stats.errors}")
+ print("-" * 50)
+
+ def process_category(self, tid, tname):
+ cat_data = self.bridge.call('categoryContent', tid, 1, False, {})
+
+ if not cat_data or 'list' not in cat_data:
+ self.stats.inc('errors')
+ return
+
+ items = cat_data.get('list', [])
+ self.stats.inc('items_found', len(items))
+ self.stats.inc('pages_scanned')
+
+ for item in items:
+ item['type_id'] = tid
+ item['type_name'] = tname
+ self.submit_task(self.process_item, item)
+
+ page_count = 0
+ if 'pagecount' in cat_data:
+ try:
+ page_count = int(cat_data['pagecount'])
+ except:
+ page_count = 9999
+
+ # 递归触发第2页(如果需要)
+ # 如果明确返回只有1页,则停止;否则只要没达到max_pages就尝试下一页
+ if page_count != 1:
+ next_page = 2
+ if not self.max_pages or next_page <= self.max_pages:
+ self.submit_task(self.process_page, tid, tname, next_page)
+
+ def process_page(self, tid, tname, page):
+ cat_data = self.bridge.call('categoryContent', tid, page, False, {})
+ if not cat_data or 'list' not in cat_data:
+ self.stats.inc('errors')
+ return
+
+ items = cat_data.get('list', [])
+ self.stats.inc('items_found', len(items))
+ self.stats.inc('pages_scanned')
+
+ if len(items) == 0:
+ return
+
+ for item in items:
+ item['type_id'] = tid
+ item['type_name'] = tname
+ self.submit_task(self.process_item, item)
+
+ # 提交下一页任务(递归爬取)
+ if len(items) > 0:
+ next_page = page + 1
+ if not self.max_pages or next_page <= self.max_pages:
+ self.submit_task(self.process_page, tid, tname, next_page)
+
+ def process_item(self, item):
+ vod_id = item['vod_id']
+ vod_name = item['vod_name']
+
+ # 增量爬取检查:如果数据库中已存在该 vod_id,则跳过
+ if self.db.item_exists(vod_id):
+ # 即使跳过,也可以尝试更新 type_id (如果之前为空)
+ # 但为了性能,这里暂时略过,除非强制更新
+ self.stats.inc('items_skipped')
+ return
+
+ # 详情页爬取
+ detail_res = self.bridge.call('detailContent', [vod_id])
+ if not detail_res or 'list' not in detail_res or not detail_res['list']:
+ self.stats.inc('errors')
+ return
+
+ vod_data = detail_res['list'][0]
+ # 补全可能缺失的字段
+ if 'vod_id' not in vod_data: vod_data['vod_id'] = vod_id
+ if 'type_id' not in vod_data: vod_data['type_id'] = item.get('type_id')
+
+ # 存入 VOD 主表
+ vod_pk = self.db.save_vod(vod_data)
+ if not vod_pk:
+ self.stats.inc('errors')
+ return
+
+ self.stats.inc('items_processed')
+
+ # 处理播放列表
+ play_from_str = vod_data.get('vod_play_from', '')
+ play_url_str = vod_data.get('vod_play_url', '')
+
+ if not play_from_str or not play_url_str:
+ return
+
+ play_from_list = play_from_str.split('$$$')
+ play_url_list = play_url_str.split('$$$')
+
+ all_episodes = []
+
+ for i, source_name in enumerate(play_from_list):
+ if i >= len(play_url_list): break
+ url_text = play_url_list[i]
+
+ # 格式: 名字$地址#名字$地址
+ episodes = url_text.split('#')
+ for ep_str in episodes:
+ if '$' in ep_str:
+ ep_name, ep_url = ep_str.split('$', 1)
+ else:
+ ep_name, ep_url = '正片', ep_str
+
+ episode = {
+ 'play_from': source_name,
+ 'name': ep_name,
+ 'url': ep_url,
+ 'resolved_url': ''
+ }
+
+ if RESOLVE_FINAL_URLS:
+ play_res = self.bridge.call('playerContent', source_name, ep_url, [])
+ if play_res and 'url' in play_res:
+ episode['resolved_url'] = play_res['url']
+ self.stats.inc('episodes_resolved')
+ else:
+ pass
+
+ all_episodes.append(episode)
+
+ if all_episodes:
+ self.db.save_episodes(vod_pk, all_episodes)
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="DrPy PHP Spider Concurrent Crawler")
+ parser.add_argument("spider", nargs="?", default=DEFAULT_SPIDER, help="PHP spider file path")
+ parser.add_argument("-p", "--max-pages", type=int, default=DEFAULT_MAX_PAGES, help="Max pages per category")
+ parser.add_argument("-t", "--threads", type=int, default=DEFAULT_THREADS, help="Concurrency threshold (max workers)")
+ parser.add_argument("-n", "--no-resolve", action="store_true", help="Skip resolving final playback URLs")
+
+ args = parser.parse_args()
+
+ if args.no_resolve:
+ RESOLVE_FINAL_URLS = False
+
+ spider_file = args.spider
+ if not os.path.exists(spider_file):
+ print(f"Error: File not found: {spider_file}")
+ sys.exit(1)
+
+ # 根据爬虫文件名生成数据库文件名 (例如: spider.php -> spider.db)
+ # 确保数据库文件生成在爬虫文件同级目录
+ spider_dir = os.path.dirname(os.path.abspath(spider_file))
+ base_name = os.path.splitext(os.path.basename(spider_file))[0]
+ db_path = os.path.join(spider_dir, f"{base_name}.db")
+
+ print(f"📁 数据库路径: {db_path}")
+
+ crawler = Crawler(spider_file, db_path, args.max_pages, args.threads)
+ crawler.run()
diff --git a/spider/php/readme.md b/spider/php/readme.md
index 345189a8..c951ac71 100644
--- a/spider/php/readme.md
+++ b/spider/php/readme.md
@@ -30,6 +30,7 @@
extension=mbstring
extension=openssl
extension=sockets
+ extension=sqlite3
```
3. **验证安装**:
打开新的 CMD 或 PowerShell 窗口,输入 `php -v`。
@@ -58,7 +59,7 @@ sudo apt update
安装 CLI 版本及 Drpy 爬虫所需的常用扩展 (curl, mbstring, xml, mysql 等):
```bash
# 注意:openssl 通常已包含在核心或 common 包中,无需单独指定 php8.3-openssl
-sudo apt install php8.3-cli php8.3-curl php8.3-mbstring php8.3-xml php8.3-mysql -y
+sudo apt install php8.3-cli php8.3-curl php8.3-mbstring php8.3-xml php8.3-mysql php8.3-sqlite3 -y
```
### 0.5.4 验证安装
@@ -67,6 +68,16 @@ php -v
# 输出应显示 PHP 8.3.x
```
+### 0.5.5 改init
+```bash
+php --ini
+cd /etc/php/8.3/cli
+vi php.ini
+# 找到 extension=sqlite3 并取消注释(用到下面安装命令安装完了会自动配置好,这里还是给注释掉)
+# 0.5.3已经包含了下面的命令,可以不管了
+apt-get install php8.3-sqlite3
+```
+
## 1. 核心架构与工具
### 1.1 基础框架 (`lib/spider.php`)
diff --git a/utils/binHelper.js b/utils/binHelper.js
new file mode 100644
index 00000000..ceecb7e6
--- /dev/null
+++ b/utils/binHelper.js
@@ -0,0 +1,49 @@
+import fs from 'fs';
+import path from 'path';
+
+/**
+ * 确保文件具有执行权限 (Linux/macOS)
+ * @param {string} filePath 文件绝对路径
+ */
+export function ensureExecutable(filePath) {
+ if (process.platform === "win32") {
+ // Windows 不需要 chmod,直接返回
+ return;
+ }
+ try {
+ if (!fs.existsSync(filePath)) {
+ return;
+ }
+ const stats = fs.statSync(filePath);
+ if (!(stats.mode & 0o111)) {
+ fs.chmodSync(filePath, 0o755);
+ console.log(`[binHelper] 已为文件 ${filePath} 添加执行权限`);
+ }
+ } catch (err) {
+ console.error(`[binHelper] 无法设置执行权限: ${filePath}`, err.message);
+ }
+}
+
+/**
+ * 检查并准备二进制文件(检查存在性 + 赋予权限)
+ * @param {string} binPath 二进制文件路径或命令
+ * @returns {string|null} 如果是现有文件路径返回路径,如果是全局命令返回原命令,如果文件不存在返回 null
+ */
+export function prepareBinary(binPath) {
+ if (!binPath) return null;
+
+ // 如果不包含路径分隔符,假定是全局命令(如 'php', 'node'),直接返回
+ // 注意:这里简单判断,如果用户写 ./php 或 /usr/bin/php 都会进入下面的 exist 检查
+ if (!binPath.includes('/') && !binPath.includes('\\')) {
+ return binPath;
+ }
+
+ // 如果是路径,检查是否存在
+ if (fs.existsSync(binPath)) {
+ ensureExecutable(binPath);
+ return binPath;
+ }
+
+ // 路径不存在
+ return null;
+}
diff --git a/utils/phpEnv.js b/utils/phpEnv.js
index 30b3f432..31f3d54e 100644
--- a/utils/phpEnv.js
+++ b/utils/phpEnv.js
@@ -1,19 +1,32 @@
import { execFile } from 'child_process';
import { promisify } from 'util';
+import { prepareBinary } from './binHelper.js';
const execFileAsync = promisify(execFile);
export let isPhpAvailable = false;
export const checkPhpAvailable = async () => {
- const phpPath = process.env.PHP_PATH || 'php';
+ let phpPath = process.env.PHP_PATH || 'php';
+
+ // Check existence and permissions
+ const validPath = prepareBinary(phpPath);
+ if (!validPath) {
+ console.warn(`⚠️ PHP binary not found or invalid: ${phpPath}`);
+ isPhpAvailable = false;
+ return false;
+ }
+ phpPath = validPath;
+
try {
+ console.log(`[phpEnv] Verifying PHP executable: ${phpPath}`);
await execFileAsync(phpPath, ['-v']);
isPhpAvailable = true;
- console.log('✅ PHP environment check passed.');
+ console.log(`✅ PHP environment check passed (${phpPath}).`);
} catch (e) {
isPhpAvailable = false;
- console.warn('⚠️ PHP environment check failed. PHP features will be disabled.');
+ console.warn(`⚠️ PHP environment check failed. PHP features will be disabled.`);
+ console.warn(`[phpEnv] Error details:`, e.message);
// console.error(e);
}
return isPhpAvailable;
diff --git a/utils/pluginManager.js b/utils/pluginManager.js
index 879ef734..5a58d30c 100644
--- a/utils/pluginManager.js
+++ b/utils/pluginManager.js
@@ -2,6 +2,7 @@ import fs from "fs";
import path from "path";
import {spawn} from "child_process";
import {fileURLToPath, pathToFileURL} from "url";
+import {ensureExecutable} from "./binHelper.js";
// 获取 pluginManager.js 的目录
const __filename = fileURLToPath(import.meta.url);
@@ -54,22 +55,6 @@ function getPluginBinary(rootDir, pluginPath, pluginName) {
return path.join(binDir, binaryName);
}
-function ensureExecutable(filePath) {
- if (process.platform === "win32") {
- // Windows 不需要 chmod,直接返回
- return;
- }
- try {
- const stats = fs.statSync(filePath);
- if (!(stats.mode & 0o111)) {
- fs.chmodSync(filePath, 0o755);
- console.log(`[pluginManager] 已为插件 ${filePath} 添加执行权限`);
- }
- } catch (err) {
- console.error(`[pluginManager] 无法设置执行权限: ${filePath}`, err.message);
- }
-}
-
/**
* 启动插件
* @param {Object} plugin 插件配置