diff --git a/.env.development b/.env.development index 6edf51d2..6aba1651 100644 --- a/.env.development +++ b/.env.development @@ -34,6 +34,7 @@ QQ_SMTP_AUTH_CODE = # 调试猫源-推荐开启 CAT_DEBUG=1 +PHP_PATH= PYTHON_PATH= VIRTUAL_ENV= daemonMode=0 diff --git a/.gitignore b/.gitignore index 78c5d859..7bbca429 100644 --- a/.gitignore +++ b/.gitignore @@ -159,3 +159,6 @@ dist /scripts/mjs/index.db /scripts/test/rsa-test.json /apps/salary/ +/jx/_30wmv.js +.DS_Store +/spider/catvod/mtv60w[差].js diff --git a/.plugins.example.js b/.plugins.example.js index c61674e6..6b429d01 100644 --- a/.plugins.example.js +++ b/.plugins.example.js @@ -35,14 +35,14 @@ const plugins = [ path: 'plugins/pup-sniffer', // 插件路径 params: '-port 57573', // 启动参数:端口57573 desc: 'drplayer嗅探服务', // 插件描述:提供视频适配代理功能 - active: true // 是否激活:true表示启用此插件 + active: false // 是否激活:true表示启用此插件 }, { name: 'mediaProxy', // 插件名称 path: 'plugins/mediaProxy', // 插件路径 params: '-port 57574', // 启动参数:端口57574 desc: 'go媒体代理服务', // 插件描述:提供视频适配代理功能 - active: true // 是否激活:true表示启用此插件 + active: false // 是否激活:true表示启用此插件 }, ] 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 da5f1e36..0e0387e6 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ nodejs作为服务端的drpy实现。全面升级异步写法 ### 常用超链接 * [本项目主页-免翻](https://github.com/hjdhnx/drpy-node) -* [最新DS本地包-适配皮卡丘](/gh/release) +* ~~[最新DS本地包-适配皮卡丘](/gh/release)~~ +* [DS本地包下载中心](/admin/download) * [接口文档](docs/apidoc.md) | [接口列表如定时任务](docs/apiList.md) | ~~[小猫影视-待对接T4](https://github.com/waifu-project/movie/pull/135)~~ * [代码质量评估工具说明](docs/codeCheck.md) | [DS项目代码评估报告](docs/codeCheckReport.md) @@ -19,9 +20,11 @@ nodejs作为服务端的drpy实现。全面升级异步写法 * [本地配置接口-动态外网/局域网](/config/1?healthy=1&pwd=$pwd) * [其他配置接口-订阅过滤](/docs/sub.md) * [python环境](/docs/pyenv.md) | [DS项目环境变量说明](/docs/envdoc.md) +* php环境(详见 spider/php/readme.md) 不在这里赘述 * [猫源调试教程](/docs/catDebug.md) * [接口压测教程](/docs/httpTest.md) * [AI编程工具 trae](https://www.trae.ai/account-setting#subscription) | 邮编ZIP输入: 518000 +* [推荐使用AI模型-GLM4.7](https://www.bigmodel.cn/glm-coding?ic=DRV3C8M5NX) | [GLM配置文档](https://docs.bigmodel.cn/cn/coding-plan/tool/trae) * [免费AI-360纳米](https://bot.n.cn/)|[免费AI-当贝AI](https://ai.dangbei.com/chat)|[国外聚合全模型](https://lmarena.ai/) * [本站防止爬虫协议](/robots.txt) * [油猴脚本-反切屏检测](/public/monkey/check_screen_leave.user.js) @@ -44,6 +47,7 @@ nodejs作为服务端的drpy实现。全面升级异步写法 * [DS时钟插件-白色时钟](/apps/clock/white_clock.html)|[日历时钟](/apps/clock/index.html) * [DS庆祝页面-完结撒花](/apps/happy/index.html) * [bookReader](/apps/book-reader) +* [系统备份与恢复](/apps/backup-restore/index.html) * [代码加解密工具](/admin/encoder) * [央视点播解析工具](/proxy/央视大全[官]/index.html) * [在线猫ds源主页](/cat/index.html) @@ -66,13 +70,17 @@ nodejs作为服务端的drpy实现。全面升级异步写法 ## 更新记录 -### 20260113 +### 20260208 -更新至V1.3.16 +更新至V1.3.22 -### 20260112 +### 20260131 -更新至V1.3.15 +更新至V1.3.21 + +### 20260127 + +更新至V1.3.20 [点此查看完整更新记录](docs/updateRecord.md) @@ -176,6 +184,7 @@ pm2 restart drpys * [源动力-老](https://sourcepower.top/index) * [电竞专业反应测试](https://www.arealme.com/brain-memory-game/zh/) * [桌面启动器](https://wwbty.lanzouv.com/iDZaP3d3i5ud) +* [不知名获取网盘CK工具](http://sspa8.top:8100/pan/admin/index.php) ## AI接入 diff --git a/apps/backup-restore/index.html b/apps/backup-restore/index.html new file mode 100644 index 00000000..98a03231 --- /dev/null +++ b/apps/backup-restore/index.html @@ -0,0 +1,373 @@ + + + + + + 系统备份与恢复 + + + +
+

📂 系统备份与恢复

+ +
+
+

备份说明: 点击“立即备份”将系统配置、插件及脚本备份到同级 backup 目录。

+

恢复说明: 点击“恢复备份”将从 backup 目录恢复文件覆盖当前系统。

+
+ +
+
+ 涉及文件清单 + 只读 +
+
+ 加载中... +
+
+
上次备份:--
+
上次恢复:--
+
+
+
+ +
+ + +
+ +
+
系统准备就绪,等待操作...
+
+
+ + + + diff --git a/apps/cookie-butler/index.html b/apps/cookie-butler/index.html index 51942ecc..ca9d936d 100644 --- a/apps/cookie-butler/index.html +++ b/apps/cookie-butler/index.html @@ -12,6 +12,7 @@ +
@@ -19,10 +20,13 @@ @@ -93,28 +97,67 @@ const textValue = document.getElementById("cookie-res").value || ''; const active_name = activeLi.textContent.trim(); const active_key = activeLi.getAttribute('data-platform').trim(); - const save_key = active_key === 'ali' ? active_key + '_token' : active_key + '_cookie'; + let save_key = '' + if (/ali|pikpak/.test(active_key)) { + save_key = active_key + '_token' + } else { + save_key = active_key + '_cookie'; + } + console.log(`准备入库cookie:${active_name} ${save_key},值为:${textValue}`); const cookie_auth_code = prompt('cookie入库功能需要管理员授权码,请你正确输入后继续'); if (cookie_auth_code) { - // 使用 axios 发送 POST 请求 - axios.post('/admin/cookie-set', { - cookie_auth_code: cookie_auth_code, - key: save_key, - value: textValue.trim().replaceAll('\n', '') - }) - .then(response => { + if (save_key.includes('pikpak')) { + // 使用 axios 发送 POST 请求 + axios.post('/admin/cookie-set', { + cookie_auth_code: cookie_auth_code, + key: save_key, + value: textValue.split(';')[0].trim().replaceAll('\n', '') + }).then(response => { if (response.data.success) { alert(`Cookie 入库成功:${active_name} (${save_key})`); } else { alert(`入库失败:${response.data.message}`); } - }) - .catch(error => { + }).catch(error => { + console.error('请求失败:', error); + alert(`入库失败,服务器出现问题,请稍后再试。\n${error.response.data.message}`); + }); + axios.post('/admin/cookie-set', { + cookie_auth_code: cookie_auth_code, + key: save_key.replace('token', 'refresh_token'), + value: textValue.split(';')[1].trim().replaceAll('\n', '') + }).then(response => { + if (response.data.success) { + alert(`Cookie 入库成功:${active_name} (${save_key.replace('token', 'refresh_token')})`); + } else { + alert(`入库失败:${response.data.message}`); + } + }).catch(error => { console.error('请求失败:', error); alert(`入库失败,服务器出现问题,请稍后再试。\n${error.response.data.message}`); }); + } else { + // 使用 axios 发送 POST 请求 + axios.post('/admin/cookie-set', { + cookie_auth_code: cookie_auth_code, + key: save_key, + value: textValue.trim().replaceAll('\n', '') + }) + .then(response => { + if (response.data.success) { + alert(`Cookie 入库成功:${active_name} (${save_key})`); + } else { + alert(`入库失败:${response.data.message}`); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert(`入库失败,服务器出现问题,请稍后再试。\n${error.response.data.message}`); + }); + } + } } else { alert('至少选中一个cookie入库项目'); diff --git a/apps/cookie-butler/static/js/cookie.js b/apps/cookie-butler/static/js/cookie.js index bff8f94a..f01be452 100644 --- a/apps/cookie-butler/static/js/cookie.js +++ b/apps/cookie-butler/static/js/cookie.js @@ -20,7 +20,7 @@ function showToast(message, type = 'success') { // 初始化页面 async function initializePage() { // 加载cookie - const platforms = ['ali', 'quark', 'uc', 'uc_token', 'bili', 'baidu']; + const platforms = ['ali', 'quark', 'quark_token', 'uc', 'uc_token', 'bili', 'yun', 'baidu', 'pikpak']; // 绑定按钮事件 platforms.forEach(platform => { diff --git a/apps/cookie-butler/static/js/jsencrypt.min.js b/apps/cookie-butler/static/js/jsencrypt.min.js new file mode 100644 index 00000000..27c29d5e --- /dev/null +++ b/apps/cookie-butler/static/js/jsencrypt.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.JSEncrypt={})}(this,function(t){"use strict";var e="0123456789abcdefghijklmnopqrstuvwxyz";function a(t){return e.charAt(t)}function i(t,e){return t&e}function u(t,e){return t|e}function r(t,e){return t^e}function n(t,e){return t&~e}function s(t){if(0==t)return-1;var e=0;return 0==(65535&t)&&(t>>=16,e+=16),0==(255&t)&&(t>>=8,e+=8),0==(15&t)&&(t>>=4,e+=4),0==(3&t)&&(t>>=2,e+=2),0==(1&t)&&++e,e}function o(t){for(var e=0;0!=t;)t&=t-1,++e;return e}var h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function c(t){var e,i,r="";for(e=0;e+3<=t.length;e+=3)i=parseInt(t.substring(e,e+3),16),r+=h.charAt(i>>6)+h.charAt(63&i);for(e+1==t.length?(i=parseInt(t.substring(e,e+1),16),r+=h.charAt(i<<2)):e+2==t.length&&(i=parseInt(t.substring(e,e+2),16),r+=h.charAt(i>>2)+h.charAt((3&i)<<4));0<(3&r.length);)r+="=";return r}function f(t){var e,i="",r=0,n=0;for(e=0;e>2),n=3&s,r=1):1==r?(i+=a(n<<2|s>>4),n=15&s,r=2):2==r?(i+=a(n),i+=a(s>>2),n=3&s,r=3):(i+=a(n<<2|s>>4),i+=a(15&s),r=0))}return 1==r&&(i+=a(n<<2)),i}var l,p=function(t,e){return(p=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])})(t,e)};var g,d=function(t){var e;if(void 0===l){var i="0123456789ABCDEF",r=" \f\n\r\t \u2028\u2029";for(l={},e=0;e<16;++e)l[i.charAt(e)]=e;for(i=i.toLowerCase(),e=10;e<16;++e)l[i.charAt(e)]=e;for(e=0;e>16,r[r.length]=n>>8&255,r[r.length]=255&n,s=n=0):n<<=6}}switch(s){case 1:throw new Error("Base64 encoding incomplete: at least 2 bits missing");case 2:r[r.length]=n>>10;break;case 3:r[r.length]=n>>16,r[r.length]=n>>8&255}return r},re:/-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,unarmor:function(t){var e=v.re.exec(t);if(e)if(e[1])t=e[1];else{if(!e[2])throw new Error("RegExp out of sync");t=e[2]}return v.decode(t)}},m=1e13,y=function(){function t(t){this.buf=[+t||0]}return t.prototype.mulAdd=function(t,e){var i,r,n=this.buf,s=n.length;for(i=0;ie&&(t=t.substring(0,e)+b),t}var w,D=function(){function i(t,e){this.hexDigits="0123456789ABCDEF",t instanceof i?(this.enc=t.enc,this.pos=t.pos):(this.enc=t,this.pos=e)}return i.prototype.get=function(t){if(void 0===t&&(t=this.pos++),t>=this.enc.length)throw new Error("Requesting byte offset "+t+" on a stream of length "+this.enc.length);return"string"==typeof this.enc?this.enc.charCodeAt(t):this.enc[t]},i.prototype.hexByte=function(t){return this.hexDigits.charAt(t>>4&15)+this.hexDigits.charAt(15&t)},i.prototype.hexDump=function(t,e,i){for(var r="",n=t;n>u&1?"1":"0";if(s.length>i)return n+E(s,i)}return n+s},i.prototype.parseOctetString=function(t,e,i){if(this.isASCII(t,e))return E(this.parseStringISO(t,e),i);var r=e-t,n="("+r+" byte)\n";(i/=2)i)return E(r,i);n=new y,s=0}}return 0>6,this.tagConstructed=0!=(32&e),this.tagNumber=31&e,31==this.tagNumber){for(var i=new y;e=t.get(),i.mulAdd(128,127&e),128&e;);this.tagNumber=i.simplify()}}return t.prototype.isUniversal=function(){return 0===this.tagClass},t.prototype.isEOC=function(){return 0===this.tagClass&&0===this.tagNumber},t}(),B=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],A=(1<<26)/B[B.length-1],O=function(){function b(t,e,i){null!=t&&("number"==typeof t?this.fromNumber(t,e,i):null==e&&"string"!=typeof t?this.fromString(t,256):this.fromString(t,e))}return b.prototype.toString=function(t){if(this.s<0)return"-"+this.negate().toString(t);var e;if(16==t)e=4;else if(8==t)e=3;else if(2==t)e=1;else if(32==t)e=5;else{if(4!=t)return this.toRadix(t);e=2}var i,r=(1<>h)&&(n=!0,s=a(i));0<=o;)h>(h+=this.DB-e)):(i=this[o]>>(h-=e)&r,h<=0&&(h+=this.DB,--o)),0>24},b.prototype.shortValue=function(){return 0==this.t?this.s:this[0]<<16>>16},b.prototype.signum=function(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1},b.prototype.toByteArray=function(){var t=this.t,e=[];e[0]=this.s;var i,r=this.DB-t*this.DB%8,n=0;if(0>r)!=(this.s&this.DM)>>r&&(e[n++]=i|this.s<>(r+=this.DB-8)):(i=this[t]>>(r-=8)&255,r<=0&&(r+=this.DB,--t)),0!=(128&i)&&(i|=-256),0==n&&(128&this.s)!=(128&i)&&++n,(0=this.t?0!=this.s:0!=(this[e]&1<>n-a&u:(f=(t[p]&(1<>this.DB+n-a)),h=i;0==(1&f);)f>>=1,--h;if((n-=h)<0&&(n+=this.DB,--p),g)o[f].copyTo(s),g=!1;else{for(;1this.DB?(this[this.t-1]|=(o&(1<>this.DB-s):this[this.t-1]|=o<=this.DB&&(s-=this.DB))}8==i&&0!=(128&+t[0])&&(this.s=-1,0>r|o,o=(this[h]&n)<=this.t)e.t=0;else{var r=t%this.DB,n=this.DB-r,s=(1<>r;for(var o=i+1;o>r;0>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;i>=this.DB;r-=t.s}e.s=r<0?-1:0,r<-1?e[i++]=this.DV+r:0=e.DV&&(t[i+e.t]-=e.DV,t[i+e.t+1]=1)}0>this.F2:0),l=this.FV/f,p=(1<=i&&(this.dMultiply(r),this.dAddOffset(o,0),o=s=0))}0t&&this.subTo(b.ONE.shiftLeft(t-1),this);else{var r=[],n=7&t;r.length=1+(t>>3),e.nextBytes(r),0>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;i>=this.DB;r+=t.s}e.s=r<0?-1:0,0=this.DV;)this[e]-=this.DV,++e>=this.t&&(this[this.t++]=0),++this[e]}},b.prototype.multiplyLowerTo=function(t,e,i){var r=Math.min(this.t+t.t,e);for(i.s=0,i.t=r;0>1)&&(t=B.length);for(var n=M(),s=0;st&&n.subTo(b.ONE.shiftLeft(t-1),n),n.isProbablePrime(e)?setTimeout(function(){r()},0):setTimeout(s,0)};setTimeout(s,0)}else{var o=[],h=7&t;o.length=1+(t>>3),e.nextBytes(o),0>15,this.um=(1<>15)*this.mpl&this.um)<<15)&t.DM;for(t[i=e+this.m.t]+=this.m.am(0,r,t,e,0,this.m.t);t[i]>=t.DV;)t[i]-=t.DV,t[++i]++}t.clamp(),t.drShiftTo(this.m.t,t),0<=t.compareTo(this.m)&&t.subTo(this.m,t)},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i),this.reduce(i)},t.prototype.sqrTo=function(t,e){t.squareTo(e),this.reduce(e)},t}(),P=function(){function t(t){this.m=t,this.r2=M(),this.q3=M(),O.ONE.dlShiftTo(2*t.t,this.r2),this.mu=this.r2.divide(t)}return t.prototype.convert=function(t){if(t.s<0||t.t>2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var e=M();return t.copyTo(e),this.reduce(e),e},t.prototype.revert=function(t){return t},t.prototype.reduce=function(t){for(t.drShiftTo(this.m.t-1,this.r2),t.t>this.m.t+1&&(t.t=this.m.t+1,t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);t.compareTo(this.r2)<0;)t.dAddOffset(1,this.m.t+1);for(t.subTo(this.r2,t);0<=t.compareTo(this.m);)t.subTo(this.m,t)},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i),this.reduce(i)},t.prototype.sqrTo=function(t,e){t.squareTo(e),this.reduce(e)},t}();function M(){return new O(null)}function q(t,e){return new O(t,e)}"Microsoft Internet Explorer"==navigator.appName?(O.prototype.am=function(t,e,i,r,n,s){for(var o=32767&e,h=e>>15;0<=--s;){var a=32767&this[t],u=this[t++]>>15,c=h*a+u*o;n=((a=o*a+((32767&c)<<15)+i[r]+(1073741823&n))>>>30)+(c>>>15)+h*u+(n>>>30),i[r++]=1073741823&a}return n},w=30):"Netscape"!=navigator.appName?(O.prototype.am=function(t,e,i,r,n,s){for(;0<=--s;){var o=e*this[t++]+i[r]+n;n=Math.floor(o/67108864),i[r++]=67108863&o}return n},w=26):(O.prototype.am=function(t,e,i,r,n,s){for(var o=16383&e,h=e>>14;0<=--s;){var a=16383&this[t],u=this[t++]>>14,c=h*a+u*o;n=((a=o*a+((16383&c)<<14)+i[r]+n)>>28)+(c>>14)+h*u,i[r++]=268435455&a}return n},w=28),O.prototype.DB=w,O.prototype.DM=(1<>>16)&&(t=e,i+=16),0!=(e=t>>8)&&(t=e,i+=8),0!=(e=t>>4)&&(t=e,i+=4),0!=(e=t>>2)&&(t=e,i+=2),0!=(e=t>>1)&&(t=e,i+=1),i}O.ZERO=F(0),O.ONE=F(1);var K=function(){function t(){this.i=0,this.j=0,this.S=[]}return t.prototype.init=function(t){var e,i,r;for(e=0;e<256;++e)this.S[e]=e;for(e=i=0;e<256;++e)i=i+this.S[e]+t[e%t.length]&255,r=this.S[e],this.S[e]=this.S[i],this.S[i]=r;this.i=0,this.j=0},t.prototype.next=function(){var t;return this.i=this.i+1&255,this.j=this.j+this.S[this.i]&255,t=this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]=t,this.S[t+this.S[this.i]&255]},t}();var k,_,z=256,Z=null;if(null==Z){Z=[];var G=void(_=0);if(window.crypto&&window.crypto.getRandomValues){var $=new Uint32Array(256);for(window.crypto.getRandomValues($),G=0;G<$.length;++G)Z[_++]=255&$[G]}var Y=function(t){if(this.count=this.count||0,256<=this.count||z<=_)window.removeEventListener?window.removeEventListener("mousemove",Y,!1):window.detachEvent&&window.detachEvent("onmousemove",Y);else try{var e=t.x+t.y;Z[_++]=255&e,this.count+=1}catch(t){}};window.addEventListener?window.addEventListener("mousemove",Y,!1):window.attachEvent&&window.attachEvent("onmousemove",Y)}function J(){if(null==k){for(k=new K;_>6|192):(i[--e]=63&n|128,i[--e]=n>>6&63|128,i[--e]=n>>12|224)}i[--e]=0;for(var s=new X,o=[];2>3);if(null==e)return null;var i=this.doPublic(e);if(null==i)return null;var r=i.toString(16);return 0==(1&r.length)?r:"0"+r},t.prototype.setPrivate=function(t,e,i){null!=t&&null!=e&&0>1;this.e=parseInt(e,16);for(var n=new O(e,16);;){for(;this.p=new O(t-r,1,i),0!=this.p.subtract(O.ONE).gcd(n).compareTo(O.ONE)||!this.p.isProbablePrime(10););for(;this.q=new O(r,1,i),0!=this.q.subtract(O.ONE).gcd(n).compareTo(O.ONE)||!this.q.isProbablePrime(10););if(this.p.compareTo(this.q)<=0){var s=this.p;this.p=this.q,this.q=s}var o=this.p.subtract(O.ONE),h=this.q.subtract(O.ONE),a=o.multiply(h);if(0==a.gcd(n).compareTo(O.ONE)){this.n=this.p.multiply(this.q),this.d=n.modInverse(a),this.dmp1=this.d.mod(o),this.dmq1=this.d.mod(h),this.coeff=this.q.modInverse(this.p);break}}},t.prototype.decrypt=function(t){var e=q(t,16),i=this.doPrivate(e);return null==i?null:function(t,e){var i=t.toByteArray(),r=0;for(;r=i.length)return null;var n="";for(;++r>3)},t.prototype.generateAsync=function(t,e,n){var s=new X,o=t>>1;this.e=parseInt(e,16);var h=new O(e,16),a=this,u=function(){var e=function(){if(a.p.compareTo(a.q)<=0){var t=a.p;a.p=a.q,a.q=t}var e=a.p.subtract(O.ONE),i=a.q.subtract(O.ONE),r=e.multiply(i);0==r.gcd(h).compareTo(O.ONE)?(a.n=a.p.multiply(a.q),a.d=h.modInverse(r),a.dmp1=a.d.mod(e),a.dmq1=a.d.mod(i),a.coeff=a.q.modInverse(a.p),setTimeout(function(){n()},0)):setTimeout(u,0)},i=function(){a.q=M(),a.q.fromNumberAsync(o,1,s,function(){a.q.subtract(O.ONE).gcda(h,function(t){0==t.compareTo(O.ONE)&&a.q.isProbablePrime(10)?setTimeout(e,0):setTimeout(i,0)})})},r=function(){a.p=M(),a.p.fromNumberAsync(t-o,1,s,function(){a.p.subtract(O.ONE).gcda(h,function(t){0==t.compareTo(O.ONE)&&a.p.isProbablePrime(10)?setTimeout(i,0):setTimeout(r,0)})})};setTimeout(r,0)};setTimeout(u,0)},t.prototype.sign=function(t,e,i){var r=function(t,e){if(e=e?t:new Array(e-t.length+1).join("0")+t},this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=stohex(t)},this.setByDateValue=function(t,e,i,r,n,s){var o=new Date(Date.UTC(t,e-1,i,r,n,s,0));this.setByDate(o)},this.getFreshValueHex=function(){return this.hV}},tt.lang.extend(et.asn1.DERAbstractTime,et.asn1.ASN1Object),et.asn1.DERAbstractStructured=function(t){et.asn1.DERAbstractString.superclass.constructor.call(this),this.setByASN1ObjectArray=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array=t},this.appendASN1Object=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array.push(t)},this.asn1Array=new Array,void 0!==t&&void 0!==t.array&&(this.asn1Array=t.array)},tt.lang.extend(et.asn1.DERAbstractStructured,et.asn1.ASN1Object),et.asn1.DERBoolean=function(){et.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},tt.lang.extend(et.asn1.DERBoolean,et.asn1.ASN1Object),et.asn1.DERInteger=function(t){et.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(t){this.hTLV=null,this.isModified=!0,this.hV=et.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger=function(t){var e=new O(String(t),10);this.setByBigInteger(e)},this.setValueHex=function(t){this.hV=t},this.getFreshValueHex=function(){return this.hV},void 0!==t&&(void 0!==t.bigint?this.setByBigInteger(t.bigint):void 0!==t.int?this.setByInteger(t.int):"number"==typeof t?this.setByInteger(t):void 0!==t.hex&&this.setValueHex(t.hex))},tt.lang.extend(et.asn1.DERInteger,et.asn1.ASN1Object),et.asn1.DERBitString=function(t){if(void 0!==t&&void 0!==t.obj){var e=et.asn1.ASN1Util.newObject(t.obj);t.hex="00"+e.getEncodedHex()}et.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(t){this.hTLV=null,this.isModified=!0,this.hV=t},this.setUnusedBitsAndHexValue=function(t,e){if(t<0||7 { - if (enable_dr2 === '1') { + if (enable_dr2 === '1' || enable_dr2 === '2') { // dr2ApiType=0 使用接口drpy2 dr2ApiType=1 使用壳子内置的drpy2 let api = dr2ApiType ? `assets://js/lib/drpy2.js` : `${requestHost}/public/drpy/drpy2.min.js`; + if (enable_dr2 === '2') { + api = `${requestHost}/public/drpy/drpy2-fast.min.js`; + } let ext = `${requestHost}/js/${file}`; if (pwd) { ext += `?pwd=${pwd}`; @@ -348,31 +369,33 @@ async function generateSiteJSON(options, requestHost, sub, pwd) { ext: ext || "", // 固定为空字符串 }; sites.push(site); - } else if (enable_dr2 === '2') { - // 模式2:只启用T3脚本的T4风格API配置 - const t4site = { - key: fileSite.key, - name: fileSite.name, - type: 4, // 固定值 - api: `${requestHost}/api/${baseName}`, - ...ruleMeta, - ext: "", // 固定为空字符串 - }; - // 添加isdr2参数到API URL - if (pwd) { - t4site.api += `?pwd=${pwd}&do=dr`; - } else { - t4site.api += `?do=dr`; - } - - // 处理传参源的API参数 - if (fileSite.queryStr) { - const separator = t4site.api.includes('?') ? '&' : '?'; - site.api += `${separator}extend=${encodeURIComponent(fileSite.queryStr)}`; - } - - sites.push(t4site); } + // else if (enable_dr2 === '2') { + // + // // 模式2:只启用T3脚本的T4风格API配置 + // const t4site = { + // key: fileSite.key, + // name: fileSite.name, + // type: 4, // 固定值 + // api: `${requestHost}/api/${baseName}`, + // ...ruleMeta, + // ext: "", // 固定为空字符串 + // }; + // // 添加isdr2参数到API URL + // if (pwd) { + // t4site.api += `?pwd=${pwd}&do=dr`; + // } else { + // t4site.api += `?do=dr`; + // } + // + // // 处理传参源的API参数 + // if (fileSite.queryStr) { + // const separator = t4site.api.includes('?') ? '&' : '?'; + // site.api += `${separator}extend=${encodeURIComponent(fileSite.queryStr)}`; + // } + // + // sites.push(t4site); + // } }); }, param: {file, dr2Dir, requestHost, pwd, drpyS, SitesMap}, @@ -412,6 +435,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); @@ -485,6 +513,68 @@ async function generateSiteJSON(options, requestHost, sub, pwd) { await batchExecute(py_tasks, listener); } + + // 根据用户是否启用php源去生成对应配置 + const enable_php = ENV.get('enable_php', '1'); + console.log('isPhpAvailable:', isPhpAvailable); + if ((enable_php === '1' && isPhpAvailable) || enable_php === '2') { + const php_files = readdirSync(phpDir); + 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}`); + + const php_tasks = php_valid_files.map((file) => { + return { + func: async ({file, phpDir, requestHost, pwd, SitesMap}) => { + const baseName = path.basename(file, '.php'); + let api = enable_php === '2' ? `${requestHost}/php/${file}` : `${requestHost}/api/${baseName}?do=php`; + let ext = ''; + if (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); + + Object.assign(ruleMeta, { + title: baseName, + lang: 'php', + }); + ruleMeta.title = enableRuleName ? ruleMeta.title || baseName : baseName; + + let fileSites = []; + let key = `php_${ruleMeta.title}`; + let name = `${ruleMeta.title}(PHP)`; + fileSites.push({key, name, ext}); + + fileSites.forEach((fileSite) => { + const site = { + key: fileSite.key, + name: fileSite.name, + type: api_type, + api, + ...ruleMeta, + ext: fileSite.ext || "", + }; + sites.push(site); + }); + }, + param: {file, phpDir, requestHost, pwd, SitesMap}, + id: file, + }; + }); + await batchExecute(php_tasks, listener); + } + const enable_cat = ENV.get('enable_cat', '1'); // 根据用户是否启用cat源去生成对应配置 if (enable_cat === '1' || enable_cat === '2') { @@ -515,6 +605,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); @@ -655,78 +750,82 @@ async function generateSiteJSON(options, requestHost, sub, pwd) { * @returns {Promise} 包含parses数组的对象 */ async function generateParseJSON(jxDir, requestHost) { - const files = readdirSync(jxDir); - const jx_files = files.filter((file) => file.endsWith('.js') && !file.startsWith('_')) // 筛选出不是 "_" 开头的 .js 文件 - const jx_dict = getParsesDict(requestHost); + let enable_self_jx = ENV.get('enable_self_jx', '0') === '1'; let parses = []; - const tasks = jx_files.map((file) => { - return { - func: async ({file, jxDir, requestHost, drpyS}) => { - const baseName = path.basename(file, '.js'); // 去掉文件扩展名 - const api = `${requestHost}/parse/${baseName}?url=`; // 使用请求的 host 地址,避免硬编码端口 - - let jxObject = { - type: 1, // 固定值 - ext: { - flag: [ - "qiyi", - "imgo", - "爱奇艺", - "奇艺", - "qq", - "qq 预告及花絮", - "腾讯", - "youku", - "优酷", - "pptv", - "PPTV", - "letv", - "乐视", - "leshi", - "mgtv", - "芒果", - "sohu", - "xigua", - "fun", - "风行" - ] - }, - header: { - "User-Agent": "Mozilla/5.0" + let sorted_parses = []; + const jx_dict = getParsesDict(requestHost); + if (enable_self_jx) { + const files = readdirSync(jxDir); + const jx_files = files.filter((file) => file.endsWith('.js') && !file.startsWith('_')) // 筛选出不是 "_" 开头的 .js 文件 + const tasks = jx_files.map((file) => { + return { + func: async ({file, jxDir, requestHost, drpyS}) => { + const baseName = path.basename(file, '.js'); // 去掉文件扩展名 + const api = `${requestHost}/parse/${baseName}?url=`; // 使用请求的 host 地址,避免硬编码端口 + + let jxObject = { + type: 1, // 固定值 + ext: { + flag: [ + "qiyi", + "imgo", + "爱奇艺", + "奇艺", + "qq", + "qq 预告及花絮", + "腾讯", + "youku", + "优酷", + "pptv", + "PPTV", + "letv", + "乐视", + "leshi", + "mgtv", + "芒果", + "sohu", + "xigua", + "fun", + "风行" + ] + }, + header: { + "User-Agent": "Mozilla/5.0" + } + }; + try { + let _jxObject = await drpyS.getJx(path.join(jxDir, file)); + jxObject = {...jxObject, ..._jxObject}; + } catch (e) { + throw new Error(`Error parsing jx object for file: ${file}, ${e.message}`); } - }; - try { - let _jxObject = await drpyS.getJx(path.join(jxDir, file)); - jxObject = {...jxObject, ..._jxObject}; - } catch (e) { - throw new Error(`Error parsing jx object for file: ${file}, ${e.message}`); - } - parses.push({ - name: baseName, - url: jxObject.url || api, - type: jxObject.type, - ext: jxObject.ext, - header: jxObject.header - }); + parses.push({ + name: baseName, + url: jxObject.url || api, + type: jxObject.type, + ext: jxObject.ext, + header: jxObject.header + }); + }, + param: {file, jxDir, requestHost, drpyS}, + id: file, + }; + }); + + const listener = { + func: (param, id, error, result) => { + if (error) { + console.error(`Error processing file ${id}:`, error.message); + } else { + // console.log(`Successfully processed file ${id}:`, result); + } }, - param: {file, jxDir, requestHost, drpyS}, - id: file, + param: {}, // 外部参数可以在这里传入 }; - }); - - const listener = { - func: (param, id, error, result) => { - if (error) { - console.error(`Error processing file ${id}:`, error.message); - } else { - // console.log(`Successfully processed file ${id}:`, result); - } - }, - param: {}, // 外部参数可以在这里传入 - }; - await batchExecute(tasks, listener); - let sorted_parses = naturalSort(parses, 'name', ['JSON并发', 'JSON合集', '虾米', '奇奇']); + await batchExecute(tasks, listener); + sorted_parses = naturalSort(parses, 'name', ['JSON并发', 'JSON合集', '虾米', '奇奇']); + } let sorted_jx_dict = naturalSort(jx_dict, 'name', ['J', 'W']); parses = sorted_parses.concat(sorted_jx_dict); return {parses}; diff --git a/controllers/fastlogger.js b/controllers/fastlogger.js index 474f4475..352d851d 100644 --- a/controllers/fastlogger.js +++ b/controllers/fastlogger.js @@ -11,9 +11,9 @@ dotenv.config(); const LOG_WITH_FILE = Number(process.env.LOG_WITH_FILE) || 0; const LOG_LEVEL = process.env.LOG_LEVEL && ['trace', 'debug', 'info', 'warn', 'error', 'fatal'].includes(process.env.LOG_LEVEL) ? process.env.LOG_LEVEL : 'info'; const COOKIE_AUTH_CODE = process.env.COOKIE_AUTH_CODE || 'drpys'; -console.log('LOG_WITH_FILE:', LOG_WITH_FILE); -console.log('LOG_LEVEL:', LOG_LEVEL); -console.log('COOKIE_AUTH_CODE:', COOKIE_AUTH_CODE); +// console.log('LOG_WITH_FILE:', LOG_WITH_FILE); +// console.log('LOG_LEVEL:', LOG_LEVEL); +// console.log('COOKIE_AUTH_CODE:', COOKIE_AUTH_CODE); let _logger = true; let logStream = null; diff --git a/controllers/index.js b/controllers/index.js index afe461b6..aa6f2853 100644 --- a/controllers/index.js +++ b/controllers/index.js @@ -1,120 +1,59 @@ -/** - * 控制器路由注册模块 - * 统一管理和注册所有控制器路由 - * 提供应用程序的所有API端点和功能模块 - */ import formBody from '@fastify/formbody'; import websocket from '@fastify/websocket'; -// WebSocket实时日志控制器-最早引入才能全局拦截console日志 import websocketController from './websocket.js'; -// 静态文件服务控制器 import staticController from './static.js'; -// 文档服务控制器 import docsController from './docs.js'; -// 配置管理控制器 import configController from './config.js'; -// API接口控制器 import apiController from './api.js'; -// 媒体代理控制器 import mediaProxyController from './mediaProxy.js'; -// 根路径控制器 import rootController from './root.js'; -// 编码器控制器 import encoderController from './encoder.js'; -// 解码器控制器 import decoderController from './decoder.js'; -// 认证编码控制器 -import authCoderController from './authcoder.js'; -// Web界面控制器 +import authcoderController from './authcoder.js'; import webController from './web.js'; -// HTTP请求控制器 import httpController from './http.js'; -// 剪贴板推送控制器 import clipboardPusherController from './clipboard-pusher.js'; -// 任务控制器(已注释) -// import taskController from './tasker.js'; -// 定时任务控制器 +// import taskerController from './tasker.js'; import cronTaskerController from './cron-tasker.js'; -// 源检查控制器 import sourceCheckerController from './source-checker.js'; -// 图片存储控制器 import imageStoreController from './image-store.js'; -// WebDAV 代理控制器 import webdavProxyController from './webdav-proxy.js'; -// FTP 代理控制器 import ftpProxyController from './ftp-proxy.js'; -// 文件代理控制器 import fileProxyController from './file-proxy.js'; import m3u8ProxyController from './m3u8-proxy.js'; import unifiedProxyController from './unified-proxy.js'; -// WebSocket实时弹幕日志控制器 -import websocketServerController from "./websocketServer.js"; import githubController from './github.js'; +import websocketServerController from "./websocketServer.js"; -/** - * 注册所有路由控制器 - * 将各个功能模块的路由注册到Fastify实例中 - * @param {Object} fastify - Fastify应用实例 - * @param {Object} options - 路由配置选项 - */ export const registerRoutes = (fastify, options) => { - // 注册插件以支持 application/x-www-form-urlencoded fastify.register(formBody); - // 注册WebSocket插件 fastify.register(websocket); - // 注册WebSocket路由 + fastify.register(websocketController, options); - // 注册静态文件服务路由 fastify.register(staticController, options); - // 注册文档服务路由 fastify.register(docsController, options); - // 注册配置管理路由 fastify.register(configController, options); - // 注册API接口路由 fastify.register(apiController, options); - // 注册媒体代理路由 fastify.register(mediaProxyController, options); - // 注册根路径路由 fastify.register(rootController, options); - // 注册编码器路由 fastify.register(encoderController, options); - // 注册解码器路由 fastify.register(decoderController, options); - // 注册认证编码路由 - fastify.register(authCoderController, options); - // 注册Web界面路由 + fastify.register(authcoderController, options); fastify.register(webController, options); - // 注册HTTP请求路由 fastify.register(httpController, options); - // 注册剪贴板推送路由 fastify.register(clipboardPusherController, options); - // 注册任务路由(已注释) - // fastify.register(taskController, options); - // 注册定时任务路由 + // fastify.register(taskerController, options); fastify.register(cronTaskerController, options); - // 注册源检查路由 fastify.register(sourceCheckerController, options); - // 注册图片存储路由 fastify.register(imageStoreController, options); - // 注册 WebDAV 代理路由 fastify.register(webdavProxyController, options); - // 注册 FTP 代理路由 fastify.register(ftpProxyController, options); - // 注册文件代理路由 fastify.register(fileProxyController, options); fastify.register(m3u8ProxyController, options); - // 注册统一代理路由 fastify.register(unifiedProxyController, options); - // 注册GitHub Release路由 fastify.register(githubController, options); }; -/** - * 注册弹幕路由控制器 - * 将弹幕功能模块的路由注册到Fastify实例中 - * @param {Object} wsApp - Ws实时弹幕预览应用实例 - * @param {Object} options - 路由配置选项 - */ export const registerWsRoutes = (wsApp, options) => { wsApp.register(websocketServerController, options); -} \ No newline at end of file +}; 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/controllers/web.js b/controllers/web.js index ce58537a..516cffb0 100644 --- a/controllers/web.js +++ b/controllers/web.js @@ -1,9 +1,93 @@ -import {readFileSync, existsSync} from 'fs'; +import {readFileSync, existsSync, readdirSync, statSync, unlinkSync, mkdirSync, copyFileSync, lstatSync, writeFileSync} from 'fs'; +import {createReadStream} from 'fs'; +import {execSync} from 'child_process'; import path from 'path'; +import {fileURLToPath} from 'url'; +import {createHash} from 'crypto'; import {ENV} from '../utils/env.js'; import COOKIE from '../utils/cookieManager.js'; +import {validateBasicAuth} from '../utils/api_validate.js'; const COOKIE_AUTH_CODE = process.env.COOKIE_AUTH_CODE || 'drpys'; +const IS_VERCEL = process.env.VERCEL; +const DOWNLOAD_AUTH_SECRET = process.env.DOWNLOAD_AUTH_SECRET || 'drpys_download_secret'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const projectRootDir = path.dirname(__dirname); +const pkg = JSON.parse(readFileSync(path.join(projectRootDir, 'package.json'), 'utf-8')); + +const generateDownloadToken = (filename) => { + const timestamp = Date.now(); + const data = `${filename}-${timestamp}-${DOWNLOAD_AUTH_SECRET}`; + const token = createHash('md5').update(data).digest('hex'); + return `${token}-${timestamp}`; +}; + +const validateDownloadToken = (filename, token) => { + if (!token) return false; + const parts = token.split('-'); + if (parts.length < 2) return false; + const timestamp = parseInt(parts.pop()); + const hash = parts.join('-'); + const data = `${filename}-${timestamp}-${DOWNLOAD_AUTH_SECRET}`; + const expectedHash = createHash('md5').update(data).digest('hex'); + const now = Date.now(); + return hash === expectedHash && (now - timestamp) < 3600000; +}; + +const findLatestPackage = (projectDir, packageName) => { + try { + const parentDir = path.dirname(projectDir); + const files = readdirSync(parentDir); + + const isGreen = packageName.includes('-green'); + const ext = packageName.split('.').pop(); + const baseName = packageName.replace(/-green\.[^.]+$/, '').replace(/\.[^.]+$/, ''); + const pattern = new RegExp(`^${baseName.replace(/\./g, '\\.')}-\\d{8}${isGreen ? '-green' : ''}\\.${ext}`); + + console.log(`查找包: ${packageName}, 正则: ${pattern.source}, 父目录: ${parentDir}`); + console.log('目录中的文件:', files.filter(f => f.includes('drpy-node'))); + + const packageFiles = files + .filter(file => pattern.test(file)) + .map(file => { + const filePath = path.join(parentDir, file); + const stats = statSync(filePath); + return {file, filePath, mtime: stats.mtime, size: stats.size}; + }) + .sort((a, b) => b.mtime - a.mtime); + + console.log('匹配到的文件:', packageFiles.map(f => f.file)); + return packageFiles.length > 0 ? packageFiles[0] : null; + } catch (error) { + console.error('查找包失败:', error.message); + return null; + } +}; + +const buildPackage = (packageName) => { + try { + let command = 'node package.js'; + if (packageName.includes('-green')) { + command += ' -g'; + } + if (packageName.includes('.zip')) { + command += ' -z'; + } + + console.log(`执行打包命令: ${command}, 目录: ${projectRootDir}`); + const output = execSync(command, {cwd: projectRootDir, stdio: 'pipe'}); + console.log('打包输出:', output.toString()); + const result = findLatestPackage(projectRootDir, packageName); + console.log('打包后查找结果:', result ? result.file : '未找到'); + return result; + } catch (error) { + console.error('打包失败:', error.message); + console.error('错误详情:', error.stdout?.toString(), error.stderr?.toString()); + throw error; + } +}; export default (fastify, options, done) => { fastify.get('/admin/encoder', async (request, reply) => { @@ -75,5 +159,375 @@ export default (fastify, options, done) => { } }); + fastify.get('/admin/download', { + preHandler: validateBasicAuth + }, async (request, reply) => { + try { + if (IS_VERCEL) { + return reply.code(403).send({ + success: false, + message: 'Vercel 环境不支持文件下载功能', + }); + } + + const projectName = path.basename(projectRootDir); + const templatePath = path.join(projectRootDir, 'public', 'download.html'); + + if (!existsSync(templatePath)) { + return reply.code(500).send({ + success: false, + message: '下载页面模板不存在', + }); + } + + let html = readFileSync(templatePath, 'utf-8'); + + const files = [ + {name: `${projectName}.7z`, desc: '7z 压缩包(标准版)'}, + {name: `${projectName}.zip`, desc: 'ZIP 压缩包(标准版)'}, + {name: `${projectName}-green.7z`, desc: '7z 压缩包(绿色版,不含[密]文件)'}, + {name: `${projectName}-green.zip`, desc: 'ZIP 压缩包(绿色版,不含[密]文件)'} + ]; + + const formatFileSize = (bytes) => { + if (!bytes || bytes === 0) return '未打包'; + const mb = bytes / (1024 * 1024); + return mb.toFixed(2) + ' MB'; + }; + + const downloadItems = files.map(file => { + const latestPackage = findLatestPackage(projectRootDir, file.name); + const fileSize = latestPackage ? formatFileSize(latestPackage.size) : '未打包'; + const sizeClass = latestPackage ? '' : ' not-packed'; + const token = generateDownloadToken(file.name); + const downloadUrl = `/admin/download/${file.name}?auth=${token}`; + + let buildTime = '未打包'; + if (latestPackage && latestPackage.mtime) { + const date = new Date(latestPackage.mtime); + buildTime = date.toLocaleString('zh-CN', { hour12: false }); + } + + return '
' + + '
' + + '
' + file.name + '
' + + '
' + file.desc + '
' + + '
版本: ' + pkg.version + ' | 打包时间: ' + buildTime + '
' + + '
' + + '
' + fileSize + '
' + + '
' + + '下载' + + '' + + '
' + + '
'; + }).join(''); + + html = html.replace(/\{\{projectName\}\}/g, projectName); + html = html.replace(/\{\{downloadItems\}\}/g, downloadItems); + + reply.type('text/html').send(html); + } catch (error) { + console.error('获取下载页面失败:', error.message); + return reply.code(500).send({ + success: false, + message: '获取下载页面失败', + error: error.message, + }); + } + }); + + fastify.get('/admin/download/:filename', { + preHandler: async (request, reply) => { + const {auth} = request.query; + if (validateDownloadToken(request.params.filename, auth)) { + return; + } + const authHeader = request.headers.authorization; + if (!authHeader) { + reply.header('WWW-Authenticate', 'Basic'); + return reply.code(401).send('Authentication required'); + } + const base64Credentials = authHeader.split(' ')[1]; + const credentials = Buffer.from(base64Credentials, 'base64').toString('utf-8'); + const [username, password] = credentials.split(':'); + const validUsername = process.env.API_AUTH_NAME || ''; + const validPassword = process.env.API_AUTH_CODE || ''; + if (username === validUsername && password === validPassword) { + return; + } + reply.header('WWW-Authenticate', 'Basic'); + return reply.code(401).send('Invalid credentials'); + } + }, async (request, reply) => { + try { + if (IS_VERCEL) { + return reply.code(403).send({ + success: false, + message: 'Vercel 环境不支持文件下载功能', + }); + } + + const {filename} = request.params; + const projectName = path.basename(projectRootDir); + + const validFilenames = [ + `${projectName}.7z`, + `${projectName}.zip`, + `${projectName}-green.7z`, + `${projectName}-green.zip` + ]; + + if (!validFilenames.includes(filename)) { + return reply.code(400).send({ + success: false, + message: '无效的文件名', + }); + } + + let latestPackage = findLatestPackage(projectRootDir, filename); + + if (!latestPackage) { + console.log(`未找到 ${filename},开始打包...`); + latestPackage = buildPackage(filename); + if (!latestPackage) { + return reply.code(500).send({ + success: false, + message: '打包失败,无法创建压缩文件', + }); + } + } + + const fileStream = createReadStream(latestPackage.filePath); + const contentType = filename.endsWith('.zip') ? 'application/zip' : 'application/x-7z-compressed'; + reply.header('Content-Type', contentType); + reply.header('Content-Disposition', `attachment; filename="${encodeURIComponent(latestPackage.file)}"`); + return reply.send(fileStream); + } catch (error) { + console.error('下载文件失败:', error.message); + return reply.code(500).send({ + success: false, + message: '下载失败', + error: error.message, + }); + } + }); + + fastify.post('/admin/download/clear', { + preHandler: validateBasicAuth + }, async (request, reply) => { + try { + if (IS_VERCEL) { + return reply.code(403).send({ + success: false, + message: 'Vercel 环境不支持文件操作', + }); + } + + const parentDir = path.dirname(projectRootDir); + const projectName = path.basename(projectRootDir); + const files = readdirSync(parentDir); + const pattern = new RegExp(`^${projectName.replace(/\./g, '\\.')}-\\d{8}(-green)?\\.(7z|zip)$`); + + let deletedCount = 0; + const deletedFiles = []; + + for (const file of files) { + if (pattern.test(file)) { + const filePath = path.join(parentDir, file); + try { + unlinkSync(filePath); + deletedFiles.push(file); + deletedCount++; + } catch (error) { + console.error(`删除文件失败: ${file}`, error.message); + } + } + } + + return reply.send({ + success: true, + count: deletedCount, + deletedFiles, + message: `已清除 ${deletedCount} 个历史文件` + }); + } catch (error) { + console.error('清除历史文件失败:', error.message); + return reply.code(500).send({ + success: false, + message: '清除历史文件失败', + error: error.message, + }); + } + }); + + const BACKUP_PATHS = [ + '.env', + '.plugins.js', + 'config/env.json', + 'config/map.txt', + 'config/parses.conf', + 'config/player.json', + 'scripts/cron', + 'plugins' + ]; + + const BACKINFO_FILENAME = '.backinfo'; + + const getBackupRootDir = () => { + return path.join(path.dirname(projectRootDir), path.basename(projectRootDir) + '-backup'); + }; + + const getBackinfoPath = (backupDir) => { + return path.join(backupDir, BACKINFO_FILENAME); + }; + + const loadBackinfo = (backupDir) => { + const infoPath = getBackinfoPath(backupDir); + if (!existsSync(infoPath)) { + return null; + } + try { + const content = readFileSync(infoPath, 'utf-8'); + return JSON.parse(content); + } catch (e) { + return null; + } + }; + + const saveBackinfo = (backupDir, data) => { + const infoPath = getBackinfoPath(backupDir); + writeFileSync(infoPath, JSON.stringify(data, null, 2), 'utf-8'); + }; + + const getEffectiveBackupPaths = (backupDir) => { + const info = loadBackinfo(backupDir); + if (info && Array.isArray(info.paths) && info.paths.length > 0) { + return {paths: info.paths, info}; + } + return {paths: BACKUP_PATHS, info}; + }; + + const copyRecursiveSync = (src, dest) => { + const stats = lstatSync(src); + if (stats.isDirectory()) { + if (!existsSync(dest)) { + mkdirSync(dest, { recursive: true }); + } + readdirSync(src).forEach((childItemName) => { + copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName)); + }); + } else { + const destDir = path.dirname(dest); + if (!existsSync(destDir)) { + mkdirSync(destDir, { recursive: true }); + } + copyFileSync(src, dest); + } + }; + + fastify.get('/admin/backup/config', { + preHandler: validateBasicAuth + }, async (request, reply) => { + const backupDir = getBackupRootDir(); + let paths; + let lastBackupAt = null; + let lastRestoreAt = null; + if (!existsSync(backupDir)) { + paths = BACKUP_PATHS; + } else { + const result = getEffectiveBackupPaths(backupDir); + paths = result.paths; + if (result.info) { + lastBackupAt = result.info.lastBackupAt || null; + lastRestoreAt = result.info.lastRestoreAt || null; + } + } + return reply.send({success: true, paths, lastBackupAt, lastRestoreAt}); + }); + + fastify.post('/admin/backup', { + preHandler: validateBasicAuth + }, async (request, reply) => { + if (IS_VERCEL) { + return reply.code(403).send({ success: false, message: 'Vercel环境不支持备份' }); + } + try { + const backupDir = getBackupRootDir(); + if (!existsSync(backupDir)) { + mkdirSync(backupDir, { recursive: true }); + } + + const {paths, info} = getEffectiveBackupPaths(backupDir); + const details = []; + for (const item of paths) { + const srcPath = path.join(projectRootDir, item); + const destPath = path.join(backupDir, item); + + if (existsSync(srcPath)) { + copyRecursiveSync(srcPath, destPath); + details.push(`Backed up: ${item}`); + } else { + details.push(`Skipped (not found): ${item}`); + } + } + + const now = new Date().toISOString(); + const customPaths = info && Array.isArray(info.paths) && info.paths.length > 0 ? info.paths : []; + const backinfoData = { + paths: customPaths, + lastBackupAt: now, + lastRestoreAt: info && info.lastRestoreAt ? info.lastRestoreAt : null + }; + saveBackinfo(backupDir, backinfoData); + + return reply.send({ success: true, message: '备份完成', backupDir, details }); + } catch (error) { + fastify.log.error(`Backup failed: ${error.message}`); + return reply.code(500).send({ success: false, message: '备份失败: ' + error.message }); + } + }); + + fastify.post('/admin/restore', { + preHandler: validateBasicAuth + }, async (request, reply) => { + if (IS_VERCEL) { + return reply.code(403).send({ success: false, message: 'Vercel环境不支持恢复' }); + } + try { + const backupDir = getBackupRootDir(); + if (!existsSync(backupDir)) { + return reply.code(404).send({ success: false, message: '备份目录不存在' }); + } + + const {paths, info} = getEffectiveBackupPaths(backupDir); + const details = []; + for (const item of paths) { + const srcPath = path.join(backupDir, item); + const destPath = path.join(projectRootDir, item); + + if (existsSync(srcPath)) { + copyRecursiveSync(srcPath, destPath); + details.push(`Restored: ${item}`); + } else { + details.push(`Skipped (not found in backup): ${item}`); + } + } + + const now = new Date().toISOString(); + const customPaths = info && Array.isArray(info.paths) && info.paths.length > 0 ? info.paths : []; + const backinfoData = { + paths: customPaths, + lastBackupAt: info && info.lastBackupAt ? info.lastBackupAt : null, + lastRestoreAt: now + }; + saveBackinfo(backupDir, backinfoData); + + return reply.send({ success: true, message: '恢复完成', backupDir, details }); + } catch (error) { + fastify.log.error(`Restore failed: ${error.message}`); + return reply.code(500).send({ success: false, message: '恢复失败: ' + error.message }); + } + }); + done(); }; 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 6959904f..10ebc5db 100644 --- a/docs/updateRecord.md +++ b/docs/updateRecord.md @@ -1,5 +1,63 @@ # drpyS更新记录 +### 20260208 + +更新至V1.3.22 + +1. 增强海阔`跳过形式二级` 功能适配更多壳子,配置/首页分类接口会返回 `mergeList` 属性代表此源可以合并 +2. 修改了支持合并属性的历史源,壳子适配后可以把一级列表数据合并后在详情页顺序播放 +3. dr2 fast模式支持,需要爱佬修改版的so,加解密性能提升,补充缺失的文件 `public/dist/drpy-core-fast.min.js`,当 + `enable_dr2 = 2` 时走这个逻辑 + +写法说明: + +1. ds/dr2 源里写了 `rule.二级 = '*'` 或者 `rule.mergeList = 1`,自动生成配置会自动处理 +2. 所有源(不含php),文件头@header里有 `mergeList = 1` 或者 `more.mergeList = 1` + +### 20260131 + +更新至V1.3.21 + +1. 更新一点文档和文件名称 +2. 修复番茄动漫ds源在皮卡丘壳子上无法使用问题( + BUG羊的壳子tid为链接时处理逻辑一团乱,http链接被篡改成https就算了,链接含有{{page}}变量竟然被篡改成1了) +3. 更新文档、生成配置类型,使php、py源也更兼容皮卡丘的漫画小说 + +### 20260127 + +更新至V1.3.20 + +重磅升级来了!!! + +1. 支持了php适配器,支持自动加载php源,环境变量新增 `PHP_PATH=`,如果不指定默认则是'php',可以配置成自己的路径 +2. 尝试启动加速,插件异步加载 +3. 启动日志大幅精简,还你一个干净清爽的启动界面 +4. 设置中心修改,支持启用/关闭 PHP的源 + +### 20260125 + +更新至V1.3.19 + +1. 合并了E佬修复&新增的源 +2. 增加了PHP的T4源标准 + +### 20260118 + +更新至V1.3.18 + +1. 合并E佬修改的源,新增&修复源 +2. 新增drpy2-fast壳依赖,需自行适配爱老so文件,取消不可用的dr2的t4模式,改为使用drpy2-fast本地依赖 +3. 规范一些小说源的代码,确保统一返回了类型:'小说' +4. 修改了index.js中的start、stop函数确保有返回值,适配新版zy本地插件 +5. 调整了部分内置解析 + 其它细节自测... + +### 20260115 + +更新至V1.3.17 + +1. 新增一些源 & 修复一些源 + ### 20260113 更新至V1.3.16 @@ -101,7 +159,7 @@ 2. 修复 `cut` 逻辑错误导致的`番茄小说`二级无数据,增强字符串的`parseX`改用`JSON5` 3. 新增 `网盘` 模板源及map示例 4. 新收录了几个源 -5. 增加 `hikerSkipEr` 属性,允许海阔跳过T4源的形式二级 +5. 增加 `mergeList` 属性,允许海阔跳过T4源的形式二级 6. 修复百度盘特殊路径(如含#)的选集解析与播放 ### 20250919 diff --git a/index.js b/index.js index 6b140a7a..f31b67ae 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,9 @@ +import { performance } from 'perf_hooks'; +const startTime = performance.now(); + import * as fastlogger from './controllers/fastlogger.js' import path from 'path'; +import {checkPhpAvailable} from './utils/phpEnv.js'; import os from 'os'; import qs from 'qs'; import {fileURLToPath} from 'url'; @@ -30,16 +34,23 @@ const jsonDir = path.join(__dirname, 'json'); const jsDir = path.join(__dirname, 'spider/js'); const dr2Dir = path.join(__dirname, 'spider/js_dr2'); const pyDir = path.join(__dirname, 'spider/py'); +const phpDir = path.join(__dirname, 'spider/php'); const catDir = path.join(__dirname, 'spider/catvod'); const catLibDir = path.join(__dirname, 'spider/catLib'); const xbpqDir = path.join(__dirname, 'spider/xbpq'); const configDir = path.join(__dirname, 'config'); -const pluginProcs = startAllPlugins(__dirname); -// console.log('pluginProcs:', pluginProcs); +// 异步启动插件,不阻塞主线程 +let pluginProcs = {}; +setTimeout(() => { + pluginProcs = startAllPlugins(__dirname); +}, 0); // 添加钩子事件 fastify.addHook('onReady', async () => { + await checkPhpAvailable(); + const endTime = performance.now(); + console.log(`🚀 Server started in ${(endTime - startTime).toFixed(2)}ms`); try { await daemon.startDaemon(); fastify.log.info('Python守护进程已启动'); @@ -168,6 +179,7 @@ const registerOptions = { jsDir, dr2Dir, pyDir, + phpDir, catDir, catLibDir, xbpqDir, @@ -250,7 +262,7 @@ const start = async () => { } else { console.log('Not running on Vercel!'); } - + return true; } catch (err) { fastify.log.error(err); process.exit(1); @@ -265,8 +277,10 @@ const stop = async () => { // 停止主服务器 await fastify.server.close(); console.log('🛑 所有服务已优雅停止'); + return true; } catch (err) { fastify.log.error(`停止服务器时发生错误:${err.message}`); + return false; } }; diff --git "a/json/App\346\250\241\346\235\277\351\205\215\347\275\256.json" "b/json/App\346\250\241\346\235\277\351\205\215\347\275\256.json" index 00d03223..eb9a2801 100644 --- "a/json/App\346\250\241\346\235\277\351\205\215\347\275\256.json" +++ "b/json/App\346\250\241\346\235\277\351\205\215\347\275\256.json" @@ -23,6 +23,214 @@ "password": "", "会员时长": "", "lazyheader": {} + }, + "仓鼠": { + "muban": "AppQiji", + "host": "https://hk440cms.cs4k.top", + "hosturl": "", + "key": "fL7sY4zN4kB3pG4p", + "iv": "fL7sY4zN4kB3pG4p", + "verify": "true" + }, + "云云": { + "muban": "AppQiji", + "host": "", + "hosturl": "https://staraugust123456.oss-cn-hangzhou.aliyuncs.com/2.txt", + "key": "staraugust123456", + "iv": "staraugust123456", + "verify": "true" + }, + "奇奇": { + "muban": "AppQiji", + "host": "", + "hosturl": "https://yun-1316442804.cos.ap-guangzhou.myqcloud.com/a.txt", + "key": "123456789abcdefg", + "iv": "123456789abcdefg", + "verify": "true" + }, + "鲸鱼": { + "muban": "AppQiji", + "host": "", + "hosturl": "https://jingyu4k-1312635929.cos.ap-nanjing.myqcloud.com/1.json", + "key": "AAdgrdghjfgswerA", + "iv": "AAdgrdghjfgswerA", + "verify": "true" + }, + "咖啡": { + "muban": "AppQiji", + "host": "", + "hosturl": "https://daen-1256234123.cos.ap-shanghai.myqcloud.com/MuQi/mqxh.txt", + "key": "37kj83zs1q16jk6t", + "iv": "37kj83zs1q16jk6t", + "verify": "true" + }, + "小猪": { + "muban": "AppQiji", + "host": "", + "hosturl": "https://tiantangyoulu.oss-cn-beijing.aliyuncs.com/tengxunyun.txt", + "key": "seb5tq9mykp2w9ry", + "iv": "seb5tq9mykp2w9ry", + "verify": "true" + }, + "影视": { + "muban": "AppQiji", + "host": "", + "hosturl": "https://aysappto.oss-cn-chengdu.aliyuncs.com/qj2.txt", + "key": "sada21321sdq231d", + "iv": "sada21321sdq231d", + "verify": "true" + }, + "优兔": { + "muban": "AppQiji", + "host": "", + "hosturl": "https://uututv-1319209748.cos.ap-shanghai.myqcloud.com/uutuv4.txt", + "key": "UrWKPnmQWJA8AQzd", + "iv": "UrWKPnmQWJA8AQzd", + "verify": "true" + }, + "王子": { + "muban": "AppGet", + "host": "https://app.95112475.xyz", + "hosturl": "", + "key": "5a9w6x58dsq6z3a6", + "iv": "5a9w6x58dsq6z3a6", + "verify": "true" + }, + "紫金": { + "muban": "AppGet", + "host": "", + "hosturl": "https://snysw.xyz/mf4kzs327.txt", + "key": "1234567887654321", + "iv": "1234567887654321", + "verify": "true" + }, + "数字": { + "muban": "AppGet", + "host": "http://app1-0-0.87333.cc", + "hosturl": "", + "key": "VwsHxkCViDXEExWa", + "iv": "VwsHxkCViDXEExWa", + "verify": "true" + }, + "火锅": { + "muban": "AppGet", + "host": "https://ios.hgyx.vip", + "hosturl": "", + "key": "062dec75d039980e", + "iv": "062dec75d039980e", + "verify": "true" + }, + "五八": { + "muban": "AppGet", + "host": "https://dy.58ys.vip", + "hosturl": "", + "key": "JEWibY1AgWF0V1xx", + "iv": "JEWibY1AgWF0V1xx", + "verify": "true" + }, + "旗星": { + "muban": "AppGet", + "host": "http://ys.qist.top", + "hosturl": "", + "key": "2SWSPFxugBLPPOKo", + "iv": "2SWSPFxugBLPPOKo", + "verify": "true" + }, + "灵虎": { + "muban": "AppGet", + "host": "", + "hosturl": "https://bind.315999.xyz/89.txt", + "key": "#getapp@TMD@2025", + "iv": "#getapp@TMD@2025", + "verify": "true" + }, + "剧梦": { + "muban": "AppGet", + "host": "https://www.jumengwu.com", + "hosturl": "", + "key": "1f0a873caf2550a5", + "iv": "1f0a873caf2550a5", + "verify": "true" + }, + "火狐": { + "muban": "AppGet", + "host": "http://huohu.yihn.cc", + "hosturl": "", + "key": "huohushipingetap", + "iv": "huohushipingetap", + "verify": "true" + }, + "金牌": { + "muban": "AppQiji", + "host": "", + "hosturl": "https://dtqj.ggtvb.cc/dtjp.txt", + "key": "eecbio48dsq131ee", + "iv": "eecbio48dsq131ee", + "verify": "true" + }, + "爱盈": { + "muban": "AppQiji", + "host": "", + "hosturl": "https://aysappto.oss-cn-chengdu.aliyuncs.com/qj3.txt", + "key": "sda1231sasddad21", + "iv": "sda1231sasddad21", + "verify": "true" + }, + "顾我": { + "muban": "AppQiji", + "host": "http://117.50.204.35:520", + "hosturl": "", + "key": "ca94b06ca3c7d80e", + "iv": "ca94b06ca3c7d80e", + "verify": "true" + }, + "爆炸": { + "muban": "AppQiji", + "host": "", + "hosturl": "https://daen-1256234123.cos.ap-shanghai.myqcloud.com/MuQi/mqxh.txt", + "key": "37kj83zs1q16jk6t", + "iv": "37kj83zs1q16jk6t", + "verify": "true" + }, + "丫丫动漫": { + "muban": "AppGet", + "host": "http://tv.yy-fun.cc", + "hosturl": "", + "key": "qkxnwkfjwpcnwycl", + "iv": "qkxnwkfjwpcnwycl", + "verify": "true" + }, + "番薯动漫": { + "muban": "AppGet", + "host": "https://new.app.bytegooty.com", + "hosturl": "", + "key": "N4yj7l7xKxHF4*gz", + "iv": "N4yj7l7xKxHF4*gz", + "verify": "true" + }, + "咕咕动漫": { + "muban": "AppGet", + "host": "https://www.gugu3.com", + "hosturl": "", + "key": "nKfZ8KX6JTNWRzTD", + "iv": "nKfZ8KX6JTNWRzTD", + "verify": "true" + }, + "元咲动漫": { + "muban": "AppGet", + "host": "http://cic.aicg.fun", + "hosturl": "", + "key": "2c4h36abd96se10u", + "iv": "2c4h36abd96se10u", + "verify": "true" + }, + "方舟动漫": { + "muban": "AppGet", + "host": "https://www.cyfz.vip", + "hosturl": "", + "key": "e72cdfd629e8895d", + "iv": "e72cdfd629e8895d", + "verify": "true" } }, "Appmuou": { @@ -40,14 +248,6 @@ "key1": "", "key2": "", "version": "" - }, - "光映视界": { - "host": "", - "hosturl": "https://ymdtsy.lingutv.cn/shark/api.txt", - "key": "IKXRx4M6cB45SNTs", - "key1": "rectangleadsadxa", - "key2": "aassddwwxxllsx1x", - "version": "2.2.0" } } } \ No newline at end of file diff --git "a/json/TG\351\242\221\351\201\223\351\205\215\347\275\256.json" "b/json/TG\351\242\221\351\201\223\351\205\215\347\275\256.json" index 273f60a0..6cda37ec 100644 --- "a/json/TG\351\242\221\351\201\223\351\205\215\347\275\256.json" +++ "b/json/TG\351\242\221\351\201\223\351\205\215\347\275\256.json" @@ -23,10 +23,6 @@ "type_id": "yunpanuc", "type_name": "UC资源" }, - { - "type_id": "xiangnikanj", - "type_name": "短剧频道" - }, { "type_id": "PanjClub", "type_name": "盘酱酱Club" diff --git "a/jx/JSON\345\220\210\351\233\206.js" "b/jx/JSON\345\220\210\351\233\206.js" index b0f4703d..1965a65e 100644 --- "a/jx/JSON\345\220\210\351\233\206.js" +++ "b/jx/JSON\345\220\210\351\233\206.js" @@ -64,7 +64,7 @@ async function lazy(input, params) { * 包含多个备用解析接口,提高解析成功率 */ let parse_list = [ - "https://zy.qiaoji8.com/gouzi.php?url=", // 主要解析接口 + "https://kalbim.xatut.top/kalbim2025/781718/play/video_player.php?url=", // 主要解析接口 "http://1.94.221.189:88/algorithm.php?url=" // 备用解析接口 ] diff --git a/jx/_30wmv.js b/jx/_30wmv.js deleted file mode 100644 index 1df6a6a3..00000000 --- a/jx/_30wmv.js +++ /dev/null @@ -1 +0,0 @@ -H4sIAAAAAAAAA81X61MTVxT/nr/immHcRMNuEqBgGKYDkWoRjMNjWqd2YNncJAub3XUfwYiZQVuZtghDW6yvitJKdUYN2tYHiPDHNLuBT/4LPXcfeWxiq/VL98Nm995zfuf1uydnGQaV722Vdhb2nnxVXnkwNjz4Zvumj2FQRtPkGMMIEscKGUnVYh2dHZ2MzCoqZsbbwjPZ3Me6IvQ4YjhLRyNJLUdzUpZRJTGtMpFwOHykrT0SprPTOR+BNDa2jcvrx0eHBvc2XphPLxkv1o3LL3ycJKoamk1j7biWFQqoB7XQCj6r8woOUDQzLvCT1jtWNXpKpYKOQpLV2BM4D+LUiejZtmk9PtA/gM9FhnPTSvbY2OftI+LoZyfxoKzIVLePOXTIhw6hvfu/mqvLxo0H+5cXy6+Lxsbm3tM1smEUb5Y2vy1tzTuu3fuztLtmXtyAPcYxOHUObM36EFwZzCaxEnPeyEWNqVhp7U1jUaNi6FR8fKw3hJpckIbS613I9Kl4+eFGVakKNIxTWMEKoFBOckk+6WxelTSJ5jiqArRX3IEYzNvr5tby/tqz/du/vNm+Yj5YMxfulF4tGcXr5k+b5Yc3ypc294q7+9eKlo1CyFfo9vl8rJoXOZTSRU7jJREJ7Pl8gBdlXQshKDKbVYNOdGCIxC8JmBakdICyhGJUCFkPwW5LyHqG9Fi/dJbVuEzA5sEZJnAmeTjIBL+IfNn97oACtisMmAMjiZO0qim8mOZT+QA7w/IawiKn5GUtMDHrF/XsJFb8sZZZC6BQmAg6IJqSrykRgZRkEq1aKaR72QVVY57lxspS0jSpCtNGd9FhKtQoHZdEEVs5JdInMJZbewU+h5vJ9nIclrXWfpGTkhAdUUif5+VmojlW4CEfEuGFnYHKSiDY3A0NPG4dzcuY4LKyLPAcS/xipqAw3YjLkLOs9ehaqrWLqkMo1ANmsZaRkgAiQx/wOEdqFLPu9etElNiOIV1M4hQv4mS9gMZnsQR1Rx3QJyo7he66cimYlMqOF1pAoPmJYIQ8J0lkjeEEHqJmch2WCANNQ8kz0KeAXU7pgw0Woi7HrObm8CuJbX7BPvQ0K5fQhGSB5aAp+QGOooLBGiwgtYI1XRG9dJ21UGMoHELgR8wySFv5qnaRf6JYoVBjxTEx+x+R7AaAOHI8UQAHa9iuZRRpBol4BvUrCuGUbbTgKzS0Cvfo2aancR5Obs7FajxyIG636TjRkgZGaFihx7RUl5NwQEAXLrj93FMfkE3IWuOBldkkOTKxKiqs0KemObXTQ14piWukyCvdH+9rxjg+hQJ8Dh08CPHQUMBsIIgO9PSQUnusO17RIP32uCAp3U21iA+1epZP8b54VbrgzcEwVnVBq1Xq7bcM1lTCTnTINdNImwoOrUkjFkErZW7KCUdN1AXh7WxwD4rjC04e/XdakEQfqFPwJrjBdGNWwPAH8Aq0/4e8crx6T165Wu/LK9Brzqu31NTOeMi110iwCmCVYA1BfDjjYFAc4dMiC6L4E15khYAqhlCW5ULWn4qqsVm5ZniJwEBrLmybS+vG0h3j/oJ59Ym5WPxr7uL+4xXzj6vwajy+Zvxwxbi1BUNg+dayMbft6u7Pvdrb+R4Aho52gBV0mJiBe8UOPPtbI+0fHenobG+PdPjJ+9DpkcRoYrwvkRj69OQxf9ACs0dI0FLZNI5AwidaZlWx0DILgHCvABZq0OqBJrprgDKsmonUlo046KIH6863G0sUwjCezJcfPSq9nNu//twsPiu/+tFc/bn0csnOHgRozC+aj9acdH1319iYb5oK27ybDVVsEmPUjtGSrIQJETthOJVu5n+03v9GAtRMPk3bi+1HtUY9CPiLaVGaCQQbWl9VAcKHMyl2hgeHpk53puJsV6Ivnug6TXkFSdQgGe4N9x7tix7pikfbKSfPLudoVF65Y36zXH68Yywveg0BeytjzTuxuR49SiNz9ev9ubvWrIGAvuVHv5Ve/u4xQxpfYnKqocX5Adwfs0zUrxO/YIP8eHesde9qxT/YrDx7NTWITAUBv6rDtKuq/mYdsuowFKdx5Hci8aShjUbQrJBNU2Pz+d7uinFr1dtL6j8XHBMwvs1IU7w+qadZSdVFcF5MC0ArFeaoPKtLmCcjXu2aKMCa60Hz7uV+1WBrgvL32zYJY1MsL+BkzA9/zjW0885c/kHyse3Sm+jBK6cLbA2GvzqY/Q2jRI9Yuw8AAA== \ No newline at end of file diff --git a/jx/json1.js b/jx/json1.js index a588aa42..7a0886d5 100644 --- a/jx/json1.js +++ b/jx/json1.js @@ -82,7 +82,7 @@ async function lazy(input, params) { let timeout = 8000; // 设置请求超时时间为8秒 // 调用第三方解析API获取视频直链 - let obj = await requestJson('https://cdnsrc.cdnapi.top/json/?url=' + input, {headers, timeout}); + let obj = await requestJson('https://kalbim.xatut.top/kalbim2025/781718/play/video_player.php?url=' + input, {headers, timeout}); return obj.url // 返回解析后的视频播放链接 } diff --git a/jx/web1.js b/jx/web1.js index e190d820..6c870d83 100644 --- a/jx/web1.js +++ b/jx/web1.js @@ -63,7 +63,7 @@ const jx = { * 添加url属性直接暴露api,不走系统。建议web解析才写这个属性,json解析隐藏起来 * @type {string} */ - url: 'https://bfq.cfwlgzs.cn/player?url=', + url: 'https://www.ckplayer.vip/jiexi/?url=', }; /** diff --git a/libs/catvod.js b/libs/catvod.js index efb465cf..320d850d 100644 --- a/libs/catvod.js +++ b/libs/catvod.js @@ -14,7 +14,7 @@ const _config_path = path.join(__dirname, '../config'); const _lib_path = path.join(__dirname, '../spider/catvod'); const enable_cat_debug = Number(process.env.CAT_DEBUG) !== 2; -console.log('enable_cat_debug:', enable_cat_debug); +// console.log('enable_cat_debug:', enable_cat_debug); const json2Object = function (json) { if (!json) { @@ -184,10 +184,16 @@ const category = async function (filePath, env, tid, pg = 1, filter = 1, extend const detail = async function (filePath, env, ids) { const moduleObject = await init(filePath, env); const vod_id = Array.isArray(ids) ? ids[0] : ids; - return json2Object(await moduleObject.detail(vod_id)); + let detailResult = '{}'; + // console.log('type of detailContent:', typeof moduleObject.detailContent); + if (moduleObject.detailContent) { // tvbox形式猫源二级参数传ids列表 + detailResult = await moduleObject.detailContent(ids); + } else { // ds/cat传非id + detailResult = await moduleObject.detail(vod_id); + } + return json2Object(detailResult); } - const search = async function (filePath, env, wd, quick = 0, pg = 1) { const moduleObject = await init(filePath, env); return json2Object(await moduleObject.search(wd, quick, pg)); diff --git a/libs/drpyS.js b/libs/drpyS.js index 6d57ba76..f178db21 100644 --- a/libs/drpyS.js +++ b/libs/drpyS.js @@ -416,9 +416,10 @@ export async function init(filePath, env = {}, refresh) { // ruleScript.runInContext(context); // const result = await ruleScript.runInContext(context); const executeWithTimeout = (script, context, timeout) => { + let timer; return Promise.race([ new Promise((_, reject) => - setTimeout(() => reject(new Error('Code execution timed out')), timeout) + timer = setTimeout(() => reject(new Error('Code execution timed out')), timeout) ), new Promise((resolve, reject) => { try { @@ -434,7 +435,9 @@ export async function init(filePath, env = {}, refresh) { reject(error); } }) - ]); + ]).finally(() => { + if (timer) clearTimeout(timer); + }); }; const result = await executeWithTimeout(ruleScript, context, 30000); // log('result:', result); @@ -708,7 +711,7 @@ async function invokeMethod(filePath, env, method, args = [], injectVars = {}) { result = await searchParseAfter(moduleObject, result, args[2]); log(`[invokeMethod js:] 搜索 ${injectVars.input} 执行完毕,结果为:`, JSON.stringify(result.list.slice(0, 2))); } else if (method === 'class_parse') { - result = await homeParseAfter(result, moduleObject.类型, moduleObject.hikerListCol, moduleObject.hikerClassListCol, moduleObject.hikerSkipEr, injectVars); + result = await homeParseAfter(result, moduleObject.类型, moduleObject.hikerListCol, moduleObject.hikerClassListCol, moduleObject.mergeList, injectVars); } return result; } @@ -798,9 +801,9 @@ async function initParse(rule, env, vm, context) { if (!rule.hasOwnProperty('sniffer')) { // 默认关闭辅助嗅探 rule.sniffer = false; } - // 二级为*自动添加hikerSkipEr属性允许跳过形式二级 - if (!rule.hasOwnProperty('hikerSkipEr') && rule.二级 === '*') { - rule.hikerSkipEr = 1; + // 二级为*自动添加mergeList属性允许跳过形式二级 + if (!rule.hasOwnProperty('mergeList') && rule.二级 === '*') { + rule.mergeList = 1; } rule.sniffer = rule.hasOwnProperty('sniffer') ? rule.sniffer : ''; rule.sniffer = !!(rule.sniffer && rule.sniffer !== '0' && rule.sniffer !== 'false'); diff --git a/libs/drpysParser.js b/libs/drpysParser.js index 36bd3b60..388bce9a 100644 --- a/libs/drpysParser.js +++ b/libs/drpysParser.js @@ -424,7 +424,7 @@ export async function homeParse(rule) { return context; } -export async function homeParseAfter(d, _type, hikerListCol, hikerClassListCol, hikerSkipEr, injectVars) { +export async function homeParseAfter(d, _type, hikerListCol, hikerClassListCol, mergeList, injectVars) { if (!d) { d = {}; } @@ -436,8 +436,9 @@ export async function homeParseAfter(d, _type, hikerListCol, hikerClassListCol, d.hikerClassListCol = hikerClassListCol; } // 跳过形式二级 - if (hikerSkipEr) { - d.hikerSkipEr = hikerSkipEr; + if (mergeList) { + d.hikerSkipEr = mergeList; + d.mergeList = mergeList; } const { classes, @@ -1489,7 +1490,7 @@ export async function invokeWithInjectVars(rule, method, injectVars, args) { } break; case 'class_parse': - result = await homeParseAfter(result, rule.类型, rule.hikerListCol, rule.hikerClassListCol, rule.hikerSkipEr, injectVars); + result = await homeParseAfter(result, rule.类型, rule.hikerListCol, rule.hikerClassListCol, rule.mergeList, injectVars); break; case '一级': result = await cateParseAfter(rule, result, args[1]); diff --git a/libs/php.js b/libs/php.js new file mode 100644 index 00000000..4e582268 --- /dev/null +++ b/libs/php.js @@ -0,0 +1,220 @@ +import path from "path"; +import {readFile} from "fs/promises"; +import {fileURLToPath} from 'url'; +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'; +// +// dotenv.config({ path: path.join(process.cwd(), '.env.development') }); + +const execFileAsync = promisify(execFile); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const _config_path = path.join(__dirname, '../config'); +const _bridge_path = path.join(__dirname, '../spider/php/_bridge.php'); + +// Cache for module objects +const moduleCache = new Map(); + +// Mapping from JS method names to PHP Spider method names +const methodMapping = { + 'init': 'init', + 'home': 'homeContent', + 'homeVod': 'homeVideoContent', + 'category': 'categoryContent', + 'detail': 'detailContent', + 'search': 'searchContent', + 'play': 'playerContent', + 'proxy': 'proxy', // Not standard in BaseSpider, but might exist + 'action': 'action' // Not standard +}; + +// Helper to stringify args for CLI +function stringify(arg) { + if (arg === undefined) return 'null'; + return JSON.stringify(arg); +} + +// Helper to parse JSON output +function json2Object(json) { + if (!json) return {}; + if (typeof json === 'object') return json; + try { + return JSON.parse(json); + } catch (e) { + return json; + } +} + +// Execute PHP bridge +const callPhpMethod = async (filePath, methodName, env, ...args) => { + 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 = [ + _bridge_path, + filePath, + phpMethodName, + JSON.stringify(env), + ...args.map(stringify) + ]; + + try { + // fastify.log.info(`Calling PHP: ${phpPath} ${cliArgs.join(' ')}`); + const {stdout, stderr} = await execFileAsync(phpPath, cliArgs, { + encoding: 'utf8', + maxBuffer: 10 * 1024 * 1024, // 10MB buffer + env: { + ...process.env, + PYTHONIOENCODING: 'utf-8', // Just in case + // Add any PHP specific env vars if needed + } + }); + + if (stderr) { + // Log stderr but don't fail immediately unless stdout is empty or error + // fastify.log.warn(`PHP Stderr: ${stderr}`); + console.error(`PHP Stderr: ${stderr}`); + } + + const result = json2Object(stdout.trim()); + + if (result && result.error) { + throw new Error(`PHP Error: ${result.error}\nTrace: ${result.traceback}`); + } + + return result; + + } catch (error) { + console.error(`Error calling PHP method ${methodName}:`, error); + throw error; + } +}; + +const loadEsmWithHash = async function (filePath, fileHash, env) { + const spiderProxy = {}; + const spiderMethods = Object.keys(methodMapping); + + spiderMethods.forEach(method => { + spiderProxy[method] = async (...args) => { + return callPhpMethod(filePath, method, env, ...args); + }; + }); + + return spiderProxy; +}; + +const init = async function (filePath, env = {}, refresh) { + try { + const fileContent = await readFile(filePath, 'utf-8'); + const fileHash = computeHash(fileContent); + const moduleName = path.basename(filePath, '.php'); // .php extension + let moduleExt = env.ext || ''; + + // Logic for SitesMap and moduleExt (similar to hipy.js) + let SitesMap = getSitesMap(_config_path); + if (moduleExt && SitesMap[moduleName]) { + // ... logic for compressed ext ... + // Simplified for now, assuming plain string or handled by caller + } + + let hashMd5 = md5(filePath + '#php#' + moduleExt); + + if (moduleCache.has(hashMd5) && !refresh) { + const cached = moduleCache.get(hashMd5); + if (cached.hash === fileHash) { + return cached.moduleObject; + } + } + + fastify.log.info(`Loading PHP module: ${filePath}`); + let t1 = getNowTime(); + + const module = await loadEsmWithHash(filePath, fileHash, env); + const rule = module; + + // Initialize the spider + const initValue = await rule.init(moduleExt) || {}; + + let t2 = getNowTime(); + const moduleObject = deepCopy(rule); + moduleObject.cost = t2 - t1; + + moduleCache.set(hashMd5, {moduleObject, hash: fileHash}); + return {...moduleObject, ...initValue}; + + } catch (error) { + fastify.log.error(`Error in php.init :${filePath}`, error); + throw new Error(`Failed to initialize PHP module:${error.message}`); + } +}; + +const getRule = async function (filePath, env) { + const moduleObject = await init(filePath, env); + return JSON.stringify(moduleObject); +}; + +const home = async function (filePath, env, filter = 1) { + const moduleObject = await init(filePath, env); + return json2Object(await moduleObject.home(filter)); +}; + +const homeVod = async function (filePath, env) { + const moduleObject = await init(filePath, env); + const homeVodResult = json2Object(await moduleObject.homeVod()); + return homeVodResult && homeVodResult.list ? homeVodResult.list : homeVodResult; +}; + +const category = async function (filePath, env, tid, pg = 1, filter = 1, extend = {}) { + const moduleObject = await init(filePath, env); + return json2Object(await moduleObject.category(tid, pg, filter, extend)); +}; + +const detail = async function (filePath, env, ids) { + const moduleObject = await init(filePath, env); + return json2Object(await moduleObject.detail(ids)); +}; + +const search = async function (filePath, env, wd, quick = 0, pg = 1) { + const moduleObject = await init(filePath, env); + return json2Object(await moduleObject.search(wd, quick, pg)); +}; + +const play = async function (filePath, env, flag, id, flags) { + const moduleObject = await init(filePath, env); + return json2Object(await moduleObject.play(flag, id, flags)); +}; + +const proxy = async function (filePath, env, params) { + const moduleObject = await init(filePath, env); + return json2Object(await moduleObject.proxy(params)); +}; + +const action = async function (filePath, env, action, value) { + const moduleObject = await init(filePath, env); + return json2Object(await moduleObject.action(action, value)); +}; + +export default { + getRule, + init, + home, + homeVod, + category, + detail, + search, + play, + proxy, + action +}; diff --git a/libs_drpy/drpyInject.js b/libs_drpy/drpyInject.js index 75d25c8c..27598677 100644 --- a/libs_drpy/drpyInject.js +++ b/libs_drpy/drpyInject.js @@ -163,10 +163,10 @@ async function request(url, opt = {}) { let effectivePostType = postType; if (!effectivePostType) { // 查找不区分大小写的 Content-Type 头 - const contentTypeKey = Object.keys(headers).find(key => + const contentTypeKey = Object.keys(headers).find(key => key.toLowerCase() === 'content-type' ); - + if (contentTypeKey && headers[contentTypeKey]) { const contentType = headers[contentTypeKey].toLowerCase(); if (contentType.includes('application/x-www-form-urlencoded')) { @@ -176,7 +176,7 @@ async function request(url, opt = {}) { } } } - + // 根据有效的 postType 处理数据 if (effectivePostType === 'form' && data != null && typeof data === 'object') { data = qs.stringify(data, {encode: false}); @@ -724,4 +724,58 @@ globalThis.jsonToCookie = jsonToCookie; globalThis.cookieToJson = cookieToJson; globalThis.keysToLowerCase = keysToLowerCase; +class BaseSpider { + constructor() { + this.home = this.homeContent; + this.category = this.categoryContent; + // this.detail = this.detailContent; + this.search = this.searchContent; + this.play = this.playerContent; + this.homeVod = this.homeVideoContent; + this.proxy = this.localProxy; + // this.fetch = request; + } + + async fetch(url, options) { + const resp = await req(url, options); + return { + ...resp, + get data() { // data尝试返回object + try { + return this.content.parseX; + } catch (e) { + return {}; + } + } + }; + } + + async homeContent() { + } + + async categoryContent() { + } + + async detailContent() { + } + + async searchContent() { + } + + async playerContent() { + } + + async homeVideoContent() { + } + + async localProxy() { + + } + + async action() { + + } +} + +globalThis.BaseSpider = BaseSpider; export default {}; diff --git a/libs_drpy/fetchAxios.js b/libs_drpy/fetchAxios.js index 789fe5c2..4e90ffa8 100644 --- a/libs_drpy/fetchAxios.js +++ b/libs_drpy/fetchAxios.js @@ -4,6 +4,50 @@ */ import FormData from 'form-data'; import https from "https"; +import diagnosticsChannel from 'diagnostics_channel'; + +let undiciStripUASubscribed = false; + +function ensureUndiciStripUASubscription() { + if (undiciStripUASubscribed) { + return; + } + undiciStripUASubscribed = true; + + diagnosticsChannel.channel('undici:request:create').subscribe(({request}) => { + if (!request || !Array.isArray(request.headers)) { + return; + } + const headers = request.headers; + + let shouldStrip = false; + for (let i = 0; i < headers.length; i += 2) { + const k = headers[i]; + if (typeof k === 'string' && k.toLowerCase() === 'x-remove-user-agent') { + shouldStrip = true; + break; + } + } + if (!shouldStrip) { + return; + } + + for (let i = 0; i < headers.length; i += 2) { + const k = headers[i]; + if (typeof k === 'string' && k.toLowerCase() === 'x-remove-user-agent') { + headers.splice(i, 2); + i -= 2; + } + } + for (let i = 0; i < headers.length; i += 2) { + const k = headers[i]; + if (typeof k === 'string' && k.toLowerCase() === 'user-agent') { + headers.splice(i, 2); + i -= 2; + } + } + }); +} /** * FetchAxios类 - HTTP客户端实现 @@ -71,6 +115,18 @@ class FetchAxios { finalConfig = await interceptor(finalConfig) || finalConfig; } + if (finalConfig.headers) { + const headerKeys = Object.keys(finalConfig.headers); + for (const key of headerKeys) { + if (key.toLowerCase() === 'user-agent' && finalConfig.headers[key] === 'RemoveUserAgent') { + delete finalConfig.headers[key]; + finalConfig.headers['x-remove-user-agent'] = '1'; + ensureUndiciStripUASubscription(); + break; + } + } + } + // 拼接查询参数 if (finalConfig.params) { const query = new URLSearchParams(finalConfig.params).toString(); @@ -300,4 +356,4 @@ export function createHttpsInstance() { responseType: 'arraybuffer', httpsAgent: httpsAgent }); -} \ No newline at end of file +} diff --git a/libs_drpy/req-extend.js b/libs_drpy/req-extend.js index 86a75912..cf080579 100644 --- a/libs_drpy/req-extend.js +++ b/libs_drpy/req-extend.js @@ -40,6 +40,9 @@ async function request(url, obj = {}, ocr_flag = false) { obj.headers["Content-Type"] = 'text/html; charset=' + rule.encoding; } } + if (rule.timeout && typeof obj.timeout === 'undefined') { + obj.timeout = rule.timeout; + } if (typeof (obj.body) != 'undefined' && obj.body && typeof (obj.body) === 'string') { // 传body加 "Content-Type":"application/x-www-form-urlencoded;" 即可post form if (!obj.headers.hasOwnProperty('Content-Type') && !obj.headers.hasOwnProperty('content-type')) { // 手动指定了就不管 @@ -75,7 +78,7 @@ async function request(url, obj = {}, ocr_flag = false) { // } log(`[request] headers: ${JSON.stringify(obj.headers)}`); - log('[request] url:' + url + ` |method:${obj.method || 'GET'} |body:${obj.body || ''}`); + log('[request] url:' + url + ` |method:${obj.method || 'GET'}|timeout:${obj.timeout} |body:${obj.body || ''}`); let res = await req(url, obj); let html = res.content || ''; if (obj.withHeaders) { diff --git a/package.js b/package.js index 0ba76628..c718bc78 100644 --- a/package.js +++ b/package.js @@ -4,10 +4,10 @@ import {join, basename, dirname, resolve, relative} from 'path'; import url from 'url'; // 要排除的目录列表 -const EXCLUDE_DIRS = ['.git', '.idea', 'soft', 'examples', 'apps/cat', 'plugins/pvideo', 'plugins/req-proxy', 'plugins/pup-sniffer', 'plugins/mediaProxy', 'pyTools', 'drop_code', 'jstest', 'local', 'logs', '对话1.txt', 'vod_cache', 'data/mv']; +const EXCLUDE_DIRS = ['.git', '.idea', 'soft', 'examples', 'apps/cat', 'plugins/pvideo', 'plugins/req-proxy', 'plugins/pup-sniffer', 'plugins/mediaProxy', 'pyTools', 'drop_code','local', 'logs', '对话1.txt', 'vod_cache', 'data/mv']; // 要排除的文件列表 -const EXCLUDE_FILES = ['config/env.json', '.env', '.claude', 'clipboard.txt', 'clipboard.txt.bak', '.plugins.js', 'yarn.lock', 't4_daemon.pid', 'spider/js/UC分享.js', 'spider/js/百忙无果[官].js', 'json/UC分享.json', 'jx/奇奇.js', 'jx/芒果关姐.js', 'data/settings/link_data.json', 'index.json', 'custom.json']; +const EXCLUDE_FILES = ['config/env.json', '.env', '.claude', 'clipboard.txt', 'clipboard.txt.bak', '.plugins.js', 'yarn.lock', 't4_daemon.pid', 'spider/js/UC分享.js', 'spider/js/百忙无果[官].js', 'spider/catvod/mtv60w[差].js', 'json/UC分享.json', 'jx/_30wmv.js', 'jx/奇奇.js', 'jx/芒果关姐.js', 'data/settings/link_data.json', 'index.json', 'custom.json']; // 获取脚本所在目录 const getScriptDir = () => dirname(resolve(url.fileURLToPath(import.meta.url))); @@ -37,7 +37,7 @@ const filterGreenFiles = (scriptDir) => { }; // 压缩目录 -const compressDirectory = (scriptDir, green) => { +const compressDirectory = (scriptDir, green, useZip) => { const currentDir = basename(scriptDir); const currentTime = new Date().toLocaleDateString('zh-CN', { year: 'numeric', @@ -45,12 +45,13 @@ const compressDirectory = (scriptDir, green) => { day: '2-digit' }).replace(/\//g, ''); const archiveSuffix = green ? '-green' : ''; - const archiveName = `${currentDir}-${currentTime}${archiveSuffix}.7z`; + const archiveExt = useZip ? '.zip' : '.7z'; + const archiveName = `${currentDir}-${currentTime}${archiveSuffix}${archiveExt}`; const parentDir = resolve(scriptDir, '..'); const archivePath = join(parentDir, archiveName); - // 构建 7z 命令 + // 构建压缩命令参数 const excludeParams = []; // 排除目录 @@ -77,7 +78,7 @@ const compressDirectory = (scriptDir, green) => { } // 构建命令,打包目录内容而不包含目录本身 - const command = `7z a "${archivePath}" "${join(scriptDir, '*')}" -r ${excludeParams.join(' ')}`; + const command = `7z a -t${useZip ? 'zip' : '7z'} "${archivePath}" "${join(scriptDir, '*')}" -r ${excludeParams.join(' ')}`; console.log(`构建的 7z 命令: ${command}`); try { @@ -95,8 +96,9 @@ const main = () => { // 简单解析命令行参数 const args = process.argv.slice(2); const green = args.includes('-g') || args.includes('--green'); + const useZip = args.includes('-z') || args.includes('--zip'); - compressDirectory(scriptDir, green); + compressDirectory(scriptDir, green, useZip); }; main(); diff --git a/package.json b/package.json index af0c9f5a..db4efb0c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "drpy-node", - "version": "1.3.16", + "version": "1.3.22", "main": "index.js", "type": "module", "scripts": { @@ -14,8 +14,12 @@ "node22-win": "chcp 65001 && node --trace-deprecation --experimental-sqlite index.js", "package": "python package.py", "package-green": "python package.py -g", + "package-zip": "python package.py -z", + "package-green-zip": "python package.py -g -z", "packageJS": "node package.js", "packageJS-green": "node package.js -g", + "packageJS-zip": "node package.js -z", + "packageJS-green-zip": "node package.js -g -z", "gzip-1": "node controllers/encoder.js json/十六万歌曲.json", "ungzip-1": "node controllers/decoder.js json/十六万歌曲.json.gz", "moontv": "node scripts/mjs/moontv.mjs 采集2025.json -p" diff --git a/package.py b/package.py index 3067cbcb..02854a94 100644 --- a/package.py +++ b/package.py @@ -7,7 +7,6 @@ EXCLUDE_DIRS = ['.git', '.idea', 'soft', 'examples', 'apps/cat', 'plugins/pvideo', 'plugins/req-proxy', 'plugins/pup-sniffer', 'plugins/mediaProxy', 'pyTools', 'drop_code', - 'jstest', 'local', 'logs', '对话1.txt', 'vod_cache', 'data/mv'] @@ -16,8 +15,10 @@ EXCLUDE_FILES = ['config/env.json', '.env', '.claude', 'clipboard.txt', 'clipboard.txt.bak', '.plugins.js', 'yarn.lock', 't4_daemon.pid', 'spider/js/UC分享.js', 'spider/js/百忙无果[官].js', + 'spider/catvod/mtv60w[差].js', 'json/UC分享.json', - 'jx/奇奇.js', 'jx/芒果关姐.js', 'data/settings/link_data.json', 'index.json', 'custom.json'] + 'jx/_30wmv.js', 'jx/奇奇.js', 'jx/芒果关姐.js', 'data/settings/link_data.json', 'index.json', + 'custom.json'] def get_script_dir(): @@ -43,13 +44,14 @@ def filter_green_files(script_dir): return green_files -def generate_archive_name(script_dir, green=False): +def generate_archive_name(script_dir, green=False, use_zip=False): """ 生成压缩包文件名 Args: script_dir (str): 脚本所在目录 green (bool): 是否为green模式 + use_zip (bool): 是否使用ZIP格式 Returns: str: 压缩包的完整路径 @@ -62,7 +64,8 @@ def generate_archive_name(script_dir, green=False): # 根据是否传入 green 参数生成压缩包文件名 archive_suffix = "-green" if green else "" - archive_name = f"{current_dir}-{current_time}{archive_suffix}.7z" + archive_ext = ".zip" if use_zip else ".7z" + archive_name = f"{current_dir}-{current_time}{archive_suffix}{archive_ext}" # 压缩包输出路径 (脚本所在目录的外面) parent_dir = os.path.abspath(os.path.join(script_dir, "..")) @@ -106,7 +109,7 @@ def build_exclude_params(script_dir, green=False): return exclude_params -def execute_compression(archive_path, script_dir, exclude_params): +def execute_compression(archive_path, script_dir, exclude_params, use_zip=False): """ 执行7z压缩命令 @@ -114,9 +117,11 @@ def execute_compression(archive_path, script_dir, exclude_params): archive_path (str): 压缩包输出路径 script_dir (str): 脚本所在目录 exclude_params (list): 排除参数列表 + use_zip (bool): 是否使用ZIP格式 """ # 构建命令,打包目录内容而不包含目录本身 - command = f"7z a \"{archive_path}\" \"{script_dir}\\*\" " + " ".join(exclude_params) + archive_type = "zip" if use_zip else "7z" + command = f"7z a -t{archive_type} \"{archive_path}\" \"{script_dir}\\*\" " + " ".join(exclude_params) # 打印构建的命令进行调试 print(f"构建的 7z 命令: {command}") @@ -129,22 +134,23 @@ def execute_compression(archive_path, script_dir, exclude_params): print(f"压缩失败: {e}") -def compress_directory(script_dir, green=False): +def compress_directory(script_dir, green=False, use_zip=False): """ 压缩目录为7z包 Args: script_dir (str): 要压缩的目录路径 green (bool): 是否启用green模式,筛选带[密]的文件 + use_zip (bool): 是否使用ZIP格式 """ # 生成压缩包文件名和路径 - archive_path = generate_archive_name(script_dir, green) + archive_path = generate_archive_name(script_dir, green, use_zip) # 构建排除参数 exclude_params = build_exclude_params(script_dir, green) # 执行压缩 - execute_compression(archive_path, script_dir, exclude_params) + execute_compression(archive_path, script_dir, exclude_params, use_zip) if __name__ == "__main__": @@ -154,7 +160,8 @@ def compress_directory(script_dir, green=False): # 解析命令行参数 parser = argparse.ArgumentParser(description="压缩当前目录为 7z 包,支持可选参数。") parser.add_argument('-g', '--green', action='store_true', help="启用 green 模式,筛选 js 目录下所有带 [密] 的文件。") + parser.add_argument('-z', '--zip', action='store_true', help="使用 ZIP 格式打包,默认使用 7z 格式。") args = parser.parse_args() # 调用压缩函数 - compress_directory(script_dir, green=args.green) + compress_directory(script_dir, green=args.green, use_zip=args.zip) diff --git a/public/dist/drpy-core-fast.min.js b/public/dist/drpy-core-fast.min.js new file mode 100644 index 00000000..5d17f0ea --- /dev/null +++ b/public/dist/drpy-core-fast.min.js @@ -0,0 +1 @@ +var e={27:e=>{e.exports='(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?module.exports=factory():typeof define==="function"&&define.amd?define(factory):(global=typeof globalThis!=="undefined"?globalThis:global||self,global.JSON5=factory())})(this,function(){"use strict";function createCommonjsModule(fn,module){return module={exports:{}},fn(module,module.exports),module.exports}var _global=createCommonjsModule(function(module){var global=module.exports=typeof window!="undefined"&&window.Math==Math?window:typeof self!="undefined"&&self.Math==Math?self:Function("return this")();if(typeof __g=="number"){__g=global}});var _core=createCommonjsModule(function(module){var core=module.exports={version:"2.6.5"};if(typeof __e=="number"){__e=core}});var _core_1=_core.version;var _isObject=function(it){return typeof it==="object"?it!==null:typeof it==="function"};var _anObject=function(it){if(!_isObject(it)){throw TypeError(it+" is not an object!")}return it};var _fails=function(exec){try{return!!exec()}catch(e){return true}};var _descriptors=!_fails(function(){return Object.defineProperty({},"a",{get:function(){return 7}}).a!=7});var document=_global.document;var is=_isObject(document)&&_isObject(document.createElement);var _domCreate=function(it){return is?document.createElement(it):{}};var _ie8DomDefine=!_descriptors&&!_fails(function(){return Object.defineProperty(_domCreate("div"),"a",{get:function(){return 7}}).a!=7});var _toPrimitive=function(it,S){if(!_isObject(it)){return it}var fn,val;if(S&&typeof(fn=it.toString)=="function"&&!_isObject(val=fn.call(it))){return val}if(typeof(fn=it.valueOf)=="function"&&!_isObject(val=fn.call(it))){return val}if(!S&&typeof(fn=it.toString)=="function"&&!_isObject(val=fn.call(it))){return val}throw TypeError("Can\'t convert object to primitive value")};var dP=Object.defineProperty;var f=_descriptors?Object.defineProperty:function defineProperty(O,P,Attributes){_anObject(O);P=_toPrimitive(P,true);_anObject(Attributes);if(_ie8DomDefine){try{return dP(O,P,Attributes)}catch(e){}}if("get"in Attributes||"set"in Attributes){throw TypeError("Accessors not supported!")}if("value"in Attributes){O[P]=Attributes.value}return O};var _objectDp={f:f};var _propertyDesc=function(bitmap,value){return{enumerable:!(bitmap&1),configurable:!(bitmap&2),writable:!(bitmap&4),value:value}};var _hide=_descriptors?function(object,key,value){return _objectDp.f(object,key,_propertyDesc(1,value))}:function(object,key,value){object[key]=value;return object};var hasOwnProperty={}.hasOwnProperty;var _has=function(it,key){return hasOwnProperty.call(it,key)};var id=0;var px=Math.random();var _uid=function(key){return"Symbol(".concat(key===undefined?"":key,")_",(++id+px).toString(36))};var _library=false;var _shared=createCommonjsModule(function(module){var SHARED="__core-js_shared__";var store=_global[SHARED]||(_global[SHARED]={});(module.exports=function(key,value){return store[key]||(store[key]=value!==undefined?value:{})})("versions",[]).push({version:_core.version,mode:_library?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})});var _functionToString=_shared("native-function-to-string",Function.toString);var _redefine=createCommonjsModule(function(module){var SRC=_uid("src");var TO_STRING="toString";var TPL=(""+_functionToString).split(TO_STRING);_core.inspectSource=function(it){return _functionToString.call(it)};(module.exports=function(O,key,val,safe){var isFunction=typeof val=="function";if(isFunction){_has(val,"name")||_hide(val,"name",key)}if(O[key]===val){return}if(isFunction){_has(val,SRC)||_hide(val,SRC,O[key]?""+O[key]:TPL.join(String(key)))}if(O===_global){O[key]=val}else if(!safe){delete O[key];_hide(O,key,val)}else if(O[key]){O[key]=val}else{_hide(O,key,val)}})(Function.prototype,TO_STRING,function toString(){return typeof this=="function"&&this[SRC]||_functionToString.call(this)})});var _aFunction=function(it){if(typeof it!="function"){throw TypeError(it+" is not a function!")}return it};var _ctx=function(fn,that,length){_aFunction(fn);if(that===undefined){return fn}switch(length){case 1:return function(a){return fn.call(that,a)};case 2:return function(a,b){return fn.call(that,a,b)};case 3:return function(a,b,c){return fn.call(that,a,b,c)}}return function(){return fn.apply(that,arguments)}};var PROTOTYPE="prototype";var $export=function(type,name,source){var IS_FORCED=type&$export.F;var IS_GLOBAL=type&$export.G;var IS_STATIC=type&$export.S;var IS_PROTO=type&$export.P;var IS_BIND=type&$export.B;var target=IS_GLOBAL?_global:IS_STATIC?_global[name]||(_global[name]={}):(_global[name]||{})[PROTOTYPE];var exports=IS_GLOBAL?_core:_core[name]||(_core[name]={});var expProto=exports[PROTOTYPE]||(exports[PROTOTYPE]={});var key,own,out,exp;if(IS_GLOBAL){source=name}for(key in source){own=!IS_FORCED&&target&&target[key]!==undefined;out=(own?target:source)[key];exp=IS_BIND&&own?_ctx(out,_global):IS_PROTO&&typeof out=="function"?_ctx(Function.call,out):out;if(target){_redefine(target,key,out,type&$export.U)}if(exports[key]!=out){_hide(exports,key,exp)}if(IS_PROTO&&expProto[key]!=out){expProto[key]=out}}};_global.core=_core;$export.F=1;$export.G=2;$export.S=4;$export.P=8;$export.B=16;$export.W=32;$export.U=64;$export.R=128;var _export=$export;var ceil=Math.ceil;var floor=Math.floor;var _toInteger=function(it){return isNaN(it=+it)?0:(it>0?floor:ceil)(it)};var _defined=function(it){if(it==undefined){throw TypeError("Can\'t call method on "+it)}return it};var _stringAt=function(TO_STRING){return function(that,pos){var s=String(_defined(that));var i=_toInteger(pos);var l=s.length;var a,b;if(i<0||i>=l){return TO_STRING?"":undefined}a=s.charCodeAt(i);return a<55296||a>56319||i+1===l||(b=s.charCodeAt(i+1))<56320||b>57343?TO_STRING?s.charAt(i):a:TO_STRING?s.slice(i,i+2):(a-55296<<10)+(b-56320)+65536}};var $at=_stringAt(false);_export(_export.P,"String",{codePointAt:function codePointAt(pos){return $at(this,pos)}});var codePointAt=_core.String.codePointAt;var max=Math.max;var min=Math.min;var _toAbsoluteIndex=function(index,length){index=_toInteger(index);return index<0?max(index+length,0):min(index,length)};var fromCharCode=String.fromCharCode;var $fromCodePoint=String.fromCodePoint;_export(_export.S+_export.F*(!!$fromCodePoint&&$fromCodePoint.length!=1),"String",{fromCodePoint:function fromCodePoint(x){var arguments$1=arguments;var res=[];var aLen=arguments.length;var i=0;var code;while(aLen>i){code=+arguments$1[i++];if(_toAbsoluteIndex(code,1114111)!==code){throw RangeError(code+" is not a valid code point")}res.push(code<65536?fromCharCode(code):fromCharCode(((code-=65536)>>10)+55296,code%1024+56320))}return res.join("")}});var fromCodePoint=_core.String.fromCodePoint;var Space_Separator=/[\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/;var ID_Start=/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE83\\uDE86-\\uDE89\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]/;var ID_Continue=/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u09FC\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9-\\u0AFF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D00-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1CD0-\\u1CD2\\u1CD4-\\u1CF9\\u1D00-\\u1DF9\\u1DFB-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C5\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC00-\\uDC4A\\uDC50-\\uDC59\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDE00-\\uDE3E\\uDE47\\uDE50-\\uDE83\\uDE86-\\uDE99\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC40\\uDC50-\\uDC59\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD47\\uDD50-\\uDD59]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6\\uDD00-\\uDD4A\\uDD50-\\uDD59]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/;var unicode={Space_Separator:Space_Separator,ID_Start:ID_Start,ID_Continue:ID_Continue};var util={isSpaceSeparator:function isSpaceSeparator(c){return typeof c==="string"&&unicode.Space_Separator.test(c)},isIdStartChar:function isIdStartChar(c){return typeof c==="string"&&(c>="a"&&c<="z"||c>="A"&&c<="Z"||c==="$"||c==="_"||unicode.ID_Start.test(c))},isIdContinueChar:function isIdContinueChar(c){return typeof c==="string"&&(c>="a"&&c<="z"||c>="A"&&c<="Z"||c>="0"&&c<="9"||c==="$"||c==="_"||c==="‌"||c==="‍"||unicode.ID_Continue.test(c))},isDigit:function isDigit(c){return typeof c==="string"&&/[0-9]/.test(c)},isHexDigit:function isHexDigit(c){return typeof c==="string"&&/[0-9A-Fa-f]/.test(c)}};var source;var parseState;var stack;var pos;var line;var column;var token;var key;var root;var parse=function parse(text,reviver){source=String(text);parseState="start";stack=[];pos=0;line=1;column=0;token=undefined;key=undefined;root=undefined;do{token=lex();parseStates[parseState]()}while(token.type!=="eof");if(typeof reviver==="function"){return internalize({"":root},"",reviver)}return root};function internalize(holder,name,reviver){var value=holder[name];if(value!=null&&typeof value==="object"){if(Array.isArray(value)){for(var i=0;i0){var c=peek();if(!util.isHexDigit(c)){throw invalidChar(read())}buffer+=read()}return String.fromCodePoint(parseInt(buffer,16))}var parseStates={start:function start(){if(token.type==="eof"){throw invalidEOF()}push()},beforePropertyName:function beforePropertyName(){switch(token.type){case"identifier":case"string":key=token.value;parseState="afterPropertyName";return;case"punctuator":pop();return;case"eof":throw invalidEOF()}},afterPropertyName:function afterPropertyName(){if(token.type==="eof"){throw invalidEOF()}parseState="beforePropertyValue"},beforePropertyValue:function beforePropertyValue(){if(token.type==="eof"){throw invalidEOF()}push()},beforeArrayValue:function beforeArrayValue(){if(token.type==="eof"){throw invalidEOF()}if(token.type==="punctuator"&&token.value==="]"){pop();return}push()},afterPropertyValue:function afterPropertyValue(){if(token.type==="eof"){throw invalidEOF()}switch(token.value){case",":parseState="beforePropertyName";return;case"}":pop()}},afterArrayValue:function afterArrayValue(){if(token.type==="eof"){throw invalidEOF()}switch(token.value){case",":parseState="beforeArrayValue";return;case"]":pop()}},end:function end(){}};function push(){var value;switch(token.type){case"punctuator":switch(token.value){case"{":value={};break;case"[":value=[];break}break;case"null":case"boolean":case"numeric":case"string":value=token.value;break}if(root===undefined){root=value}else{var parent=stack[stack.length-1];if(Array.isArray(parent)){parent.push(value)}else{Object.defineProperty(parent,key,{value:value,writable:true,enumerable:true,configurable:true})}}if(value!==null&&typeof value==="object"){stack.push(value);if(Array.isArray(value)){parseState="beforeArrayValue"}else{parseState="beforePropertyName"}}else{var current=stack[stack.length-1];if(current==null){parseState="end"}else if(Array.isArray(current)){parseState="afterArrayValue"}else{parseState="afterPropertyValue"}}}function pop(){stack.pop();var current=stack[stack.length-1];if(current==null){parseState="end"}else if(Array.isArray(current)){parseState="afterArrayValue"}else{parseState="afterPropertyValue"}}function invalidChar(c){if(c===undefined){return syntaxError("JSON5: invalid end of input at "+line+":"+column)}return syntaxError("JSON5: invalid character \'"+formatChar(c)+"\' at "+line+":"+column)}function invalidEOF(){return syntaxError("JSON5: invalid end of input at "+line+":"+column)}function invalidIdentifier(){column-=5;return syntaxError("JSON5: invalid identifier character at "+line+":"+column)}function separatorChar(c){console.warn("JSON5: \'"+formatChar(c)+"\' in strings is not valid ECMAScript; consider escaping")}function formatChar(c){var replacements={"\'":"\\\\\'",\'"\':\'\\\\"\',"\\\\":"\\\\\\\\","\\b":"\\\\b","\\f":"\\\\f","\\n":"\\\\n","\\r":"\\\\r","\\t":"\\\\t","\\v":"\\\\v","\\0":"\\\\0","\\u2028":"\\\\u2028","\\u2029":"\\\\u2029"};if(replacements[c]){return replacements[c]}if(c<" "){var hexString=c.charCodeAt(0).toString(16);return"\\\\x"+("00"+hexString).substring(hexString.length)}return c}function syntaxError(message){var err=new SyntaxError(message);err.lineNumber=line;err.columnNumber=column;return err}var stringify=function stringify(value,replacer,space){var stack=[];var indent="";var propertyList;var replacerFunc;var gap="";var quote;if(replacer!=null&&typeof replacer==="object"&&!Array.isArray(replacer)){space=replacer.space;quote=replacer.quote;replacer=replacer.replacer}if(typeof replacer==="function"){replacerFunc=replacer}else if(Array.isArray(replacer)){propertyList=[];for(var i=0,list=replacer;i0){space=Math.min(10,Math.floor(space));gap=" ".substr(0,space)}}else if(typeof space==="string"){gap=space.substr(0,10)}return serializeProperty("",{"":value});function serializeProperty(key,holder){var value=holder[key];if(value!=null){if(typeof value.toJSON5==="function"){value=value.toJSON5(key)}else if(typeof value.toJSON==="function"){value=value.toJSON(key)}}if(replacerFunc){value=replacerFunc.call(holder,key,value)}if(value instanceof Number){value=Number(value)}else if(value instanceof String){value=String(value)}else if(value instanceof Boolean){value=value.valueOf()}switch(value){case null:return"null";case true:return"true";case false:return"false"}if(typeof value==="string"){return quoteString(value,false)}if(typeof value==="number"){return String(value)}if(typeof value==="object"){return Array.isArray(value)?serializeArray(value):serializeObject(value)}return undefined}function quoteString(value){var quotes={"\'":.1,\'"\':.2};var replacements={"\'":"\\\\\'",\'"\':\'\\\\"\',"\\\\":"\\\\\\\\","\\b":"\\\\b","\\f":"\\\\f","\\n":"\\\\n","\\r":"\\\\r","\\t":"\\\\t","\\v":"\\\\v","\\0":"\\\\0","\\u2028":"\\\\u2028","\\u2029":"\\\\u2029"};var product="";for(var i=0;i=0){throw TypeError("Converting circular structure to JSON5")}stack.push(value);var stepback=indent;indent=indent+gap;var keys=propertyList||Object.keys(value);var partial=[];for(var i=0,list=keys;i=0){throw TypeError("Converting circular structure to JSON5")}stack.push(value);var stepback=indent;indent=indent+gap;var partial=[];for(var i=0;i{e.exports='(function(root,factory){if(typeof exports==="object"){module.exports=exports=factory()}else if(typeof define==="function"&&define.amd){define([],factory)}else{globalThis.CryptoJS=factory()}})(this,function(){var CryptoJS=CryptoJS||function(Math,undefined){var crypto;if(typeof window!=="undefined"&&window.crypto){crypto=window.crypto}if(typeof self!=="undefined"&&self.crypto){crypto=self.crypto}if(typeof globalThis!=="undefined"&&globalThis.crypto){crypto=globalThis.crypto}if(!crypto&&typeof window!=="undefined"&&window.msCrypto){crypto=window.msCrypto}if(!crypto&&typeof global!=="undefined"&&global.crypto){crypto=global.crypto}if(!crypto&&typeof require==="function"){try{crypto=require("crypto")}catch(err){}}var cryptoSecureRandomInt=function(){if(crypto){if(typeof crypto.getRandomValues==="function"){try{return crypto.getRandomValues(new Uint32Array(1))[0]}catch(err){}}if(typeof crypto.randomBytes==="function"){try{return crypto.randomBytes(4).readInt32LE()}catch(err){}}}throw new Error("Native crypto module could not be used to get secure random number.")};var create=Object.create||function(){function F(){}return function(obj){var subtype;F.prototype=obj;subtype=new F;F.prototype=null;return subtype}}();var C={};var C_lib=C.lib={};var Base=C_lib.Base=function(){return{extend:function(overrides){var subtype=create(this);if(overrides){subtype.mixIn(overrides)}if(!subtype.hasOwnProperty("init")||this.init===subtype.init){subtype.init=function(){subtype.$super.init.apply(this,arguments)}}subtype.init.prototype=subtype;subtype.$super=this;return subtype},create:function(){var instance=this.extend();instance.init.apply(instance,arguments);return instance},init:function(){},mixIn:function(properties){for(var propertyName in properties){if(properties.hasOwnProperty(propertyName)){this[propertyName]=properties[propertyName]}}if(properties.hasOwnProperty("toString")){this.toString=properties.toString}},clone:function(){return this.init.prototype.extend(this)}}}();var WordArray=C_lib.WordArray=Base.extend({init:function(words,sigBytes){words=this.words=words||[];if(sigBytes!=undefined){this.sigBytes=sigBytes}else{this.sigBytes=words.length*4}},toString:function(encoder){return(encoder||Hex).stringify(this)},concat:function(wordArray){var thisWords=this.words;var thatWords=wordArray.words;var thisSigBytes=this.sigBytes;var thatSigBytes=wordArray.sigBytes;this.clamp();if(thisSigBytes%4){for(var i=0;i>>2]>>>24-i%4*8&255;thisWords[thisSigBytes+i>>>2]|=thatByte<<24-(thisSigBytes+i)%4*8}}else{for(var j=0;j>>2]=thatWords[j>>>2]}}this.sigBytes+=thatSigBytes;return this},clamp:function(){var words=this.words;var sigBytes=this.sigBytes;words[sigBytes>>>2]&=4294967295<<32-sigBytes%4*8;words.length=Math.ceil(sigBytes/4)},clone:function(){var clone=Base.clone.call(this);clone.words=this.words.slice(0);return clone},random:function(nBytes){var words=[];for(var i=0;i>>2]>>>24-i%4*8&255;hexChars.push((bite>>>4).toString(16));hexChars.push((bite&15).toString(16))}return hexChars.join("")},parse:function(hexStr){var hexStrLength=hexStr.length;var words=[];for(var i=0;i>>3]|=parseInt(hexStr.substr(i,2),16)<<24-i%8*4}return new WordArray.init(words,hexStrLength/2)}};var Latin1=C_enc.Latin1={stringify:function(wordArray){var words=wordArray.words;var sigBytes=wordArray.sigBytes;var latin1Chars=[];for(var i=0;i>>2]>>>24-i%4*8&255;latin1Chars.push(String.fromCharCode(bite))}return latin1Chars.join("")},parse:function(latin1Str){var latin1StrLength=latin1Str.length;var words=[];for(var i=0;i>>2]|=(latin1Str.charCodeAt(i)&255)<<24-i%4*8}return new WordArray.init(words,latin1StrLength)}};var Utf8=C_enc.Utf8={stringify:function(wordArray){try{return decodeURIComponent(escape(Latin1.stringify(wordArray)))}catch(e){throw new Error("Malformed UTF-8 data")}},parse:function(utf8Str){return Latin1.parse(unescape(encodeURIComponent(utf8Str)))}};var BufferedBlockAlgorithm=C_lib.BufferedBlockAlgorithm=Base.extend({reset:function(){this._data=new WordArray.init;this._nDataBytes=0},_append:function(data){if(typeof data=="string"){data=Utf8.parse(data)}this._data.concat(data);this._nDataBytes+=data.sigBytes},_process:function(doFlush){var processedWords;var data=this._data;var dataWords=data.words;var dataSigBytes=data.sigBytes;var blockSize=this.blockSize;var blockSizeBytes=blockSize*4;var nBlocksReady=dataSigBytes/blockSizeBytes;if(doFlush){nBlocksReady=Math.ceil(nBlocksReady)}else{nBlocksReady=Math.max((nBlocksReady|0)-this._minBufferSize,0)}var nWordsReady=nBlocksReady*blockSize;var nBytesReady=Math.min(nWordsReady*4,dataSigBytes);if(nWordsReady){for(var offset=0;offset>>2]|=typedArray[i]<<24-i%4*8}superInit.call(this,words,typedArrayByteLength)}else{superInit.apply(this,arguments)}};subInit.prototype=WordArray})();(function(){var C=CryptoJS;var C_lib=C.lib;var WordArray=C_lib.WordArray;var C_enc=C.enc;var Utf16BE=C_enc.Utf16=C_enc.Utf16BE={stringify:function(wordArray){var words=wordArray.words;var sigBytes=wordArray.sigBytes;var utf16Chars=[];for(var i=0;i>>2]>>>16-i%4*8&65535;utf16Chars.push(String.fromCharCode(codePoint))}return utf16Chars.join("")},parse:function(utf16Str){var utf16StrLength=utf16Str.length;var words=[];for(var i=0;i>>1]|=utf16Str.charCodeAt(i)<<16-i%2*16}return WordArray.create(words,utf16StrLength*2)}};C_enc.Utf16LE={stringify:function(wordArray){var words=wordArray.words;var sigBytes=wordArray.sigBytes;var utf16Chars=[];for(var i=0;i>>2]>>>16-i%4*8&65535);utf16Chars.push(String.fromCharCode(codePoint))}return utf16Chars.join("")},parse:function(utf16Str){var utf16StrLength=utf16Str.length;var words=[];for(var i=0;i>>1]|=swapEndian(utf16Str.charCodeAt(i)<<16-i%2*16)}return WordArray.create(words,utf16StrLength*2)}};function swapEndian(word){return word<<8&4278255360|word>>>8&16711935}})();(function(){var C=CryptoJS;var C_lib=C.lib;var WordArray=C_lib.WordArray;var C_enc=C.enc;var Base64=C_enc.Base64={stringify:function(wordArray){var words=wordArray.words;var sigBytes=wordArray.sigBytes;var map=this._map;wordArray.clamp();var base64Chars=[];for(var i=0;i>>2]>>>24-i%4*8&255;var byte2=words[i+1>>>2]>>>24-(i+1)%4*8&255;var byte3=words[i+2>>>2]>>>24-(i+2)%4*8&255;var triplet=byte1<<16|byte2<<8|byte3;for(var j=0;j<4&&i+j*.75>>6*(3-j)&63))}}var paddingChar=map.charAt(64);if(paddingChar){while(base64Chars.length%4){base64Chars.push(paddingChar)}}return base64Chars.join("")},parse:function(base64Str){var base64StrLength=base64Str.length;var map=this._map;var reverseMap=this._reverseMap;if(!reverseMap){reverseMap=this._reverseMap=[];for(var j=0;j>>6-i%4*2;var bitsCombined=bits1|bits2;words[nBytes>>>2]|=bitsCombined<<24-nBytes%4*8;nBytes++}}return WordArray.create(words,nBytes)}})();(function(){var C=CryptoJS;var C_lib=C.lib;var WordArray=C_lib.WordArray;var C_enc=C.enc;var Base64url=C_enc.Base64url={stringify:function(wordArray,urlSafe=true){var words=wordArray.words;var sigBytes=wordArray.sigBytes;var map=urlSafe?this._safe_map:this._map;wordArray.clamp();var base64Chars=[];for(var i=0;i>>2]>>>24-i%4*8&255;var byte2=words[i+1>>>2]>>>24-(i+1)%4*8&255;var byte3=words[i+2>>>2]>>>24-(i+2)%4*8&255;var triplet=byte1<<16|byte2<<8|byte3;for(var j=0;j<4&&i+j*.75>>6*(3-j)&63))}}var paddingChar=map.charAt(64);if(paddingChar){while(base64Chars.length%4){base64Chars.push(paddingChar)}}return base64Chars.join("")},parse:function(base64Str,urlSafe=true){var base64StrLength=base64Str.length;var map=urlSafe?this._safe_map:this._map;var reverseMap=this._reverseMap;if(!reverseMap){reverseMap=this._reverseMap=[];for(var j=0;j>>6-i%4*2;var bitsCombined=bits1|bits2;words[nBytes>>>2]|=bitsCombined<<24-nBytes%4*8;nBytes++}}return WordArray.create(words,nBytes)}})();(function(Math){var C=CryptoJS;var C_lib=C.lib;var WordArray=C_lib.WordArray;var Hasher=C_lib.Hasher;var C_algo=C.algo;var T=[];(function(){for(var i=0;i<64;i++){T[i]=Math.abs(Math.sin(i+1))*4294967296|0}})();var MD5=C_algo.MD5=Hasher.extend({_doReset:function(){this._hash=new WordArray.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(M,offset){for(var i=0;i<16;i++){var offset_i=offset+i;var M_offset_i=M[offset_i];M[offset_i]=(M_offset_i<<8|M_offset_i>>>24)&16711935|(M_offset_i<<24|M_offset_i>>>8)&4278255360}var H=this._hash.words;var M_offset_0=M[offset+0];var M_offset_1=M[offset+1];var M_offset_2=M[offset+2];var M_offset_3=M[offset+3];var M_offset_4=M[offset+4];var M_offset_5=M[offset+5];var M_offset_6=M[offset+6];var M_offset_7=M[offset+7];var M_offset_8=M[offset+8];var M_offset_9=M[offset+9];var M_offset_10=M[offset+10];var M_offset_11=M[offset+11];var M_offset_12=M[offset+12];var M_offset_13=M[offset+13];var M_offset_14=M[offset+14];var M_offset_15=M[offset+15];var a=H[0];var b=H[1];var c=H[2];var d=H[3];a=FF(a,b,c,d,M_offset_0,7,T[0]);d=FF(d,a,b,c,M_offset_1,12,T[1]);c=FF(c,d,a,b,M_offset_2,17,T[2]);b=FF(b,c,d,a,M_offset_3,22,T[3]);a=FF(a,b,c,d,M_offset_4,7,T[4]);d=FF(d,a,b,c,M_offset_5,12,T[5]);c=FF(c,d,a,b,M_offset_6,17,T[6]);b=FF(b,c,d,a,M_offset_7,22,T[7]);a=FF(a,b,c,d,M_offset_8,7,T[8]);d=FF(d,a,b,c,M_offset_9,12,T[9]);c=FF(c,d,a,b,M_offset_10,17,T[10]);b=FF(b,c,d,a,M_offset_11,22,T[11]);a=FF(a,b,c,d,M_offset_12,7,T[12]);d=FF(d,a,b,c,M_offset_13,12,T[13]);c=FF(c,d,a,b,M_offset_14,17,T[14]);b=FF(b,c,d,a,M_offset_15,22,T[15]);a=GG(a,b,c,d,M_offset_1,5,T[16]);d=GG(d,a,b,c,M_offset_6,9,T[17]);c=GG(c,d,a,b,M_offset_11,14,T[18]);b=GG(b,c,d,a,M_offset_0,20,T[19]);a=GG(a,b,c,d,M_offset_5,5,T[20]);d=GG(d,a,b,c,M_offset_10,9,T[21]);c=GG(c,d,a,b,M_offset_15,14,T[22]);b=GG(b,c,d,a,M_offset_4,20,T[23]);a=GG(a,b,c,d,M_offset_9,5,T[24]);d=GG(d,a,b,c,M_offset_14,9,T[25]);c=GG(c,d,a,b,M_offset_3,14,T[26]);b=GG(b,c,d,a,M_offset_8,20,T[27]);a=GG(a,b,c,d,M_offset_13,5,T[28]);d=GG(d,a,b,c,M_offset_2,9,T[29]);c=GG(c,d,a,b,M_offset_7,14,T[30]);b=GG(b,c,d,a,M_offset_12,20,T[31]);a=HH(a,b,c,d,M_offset_5,4,T[32]);d=HH(d,a,b,c,M_offset_8,11,T[33]);c=HH(c,d,a,b,M_offset_11,16,T[34]);b=HH(b,c,d,a,M_offset_14,23,T[35]);a=HH(a,b,c,d,M_offset_1,4,T[36]);d=HH(d,a,b,c,M_offset_4,11,T[37]);c=HH(c,d,a,b,M_offset_7,16,T[38]);b=HH(b,c,d,a,M_offset_10,23,T[39]);a=HH(a,b,c,d,M_offset_13,4,T[40]);d=HH(d,a,b,c,M_offset_0,11,T[41]);c=HH(c,d,a,b,M_offset_3,16,T[42]);b=HH(b,c,d,a,M_offset_6,23,T[43]);a=HH(a,b,c,d,M_offset_9,4,T[44]);d=HH(d,a,b,c,M_offset_12,11,T[45]);c=HH(c,d,a,b,M_offset_15,16,T[46]);b=HH(b,c,d,a,M_offset_2,23,T[47]);a=II(a,b,c,d,M_offset_0,6,T[48]);d=II(d,a,b,c,M_offset_7,10,T[49]);c=II(c,d,a,b,M_offset_14,15,T[50]);b=II(b,c,d,a,M_offset_5,21,T[51]);a=II(a,b,c,d,M_offset_12,6,T[52]);d=II(d,a,b,c,M_offset_3,10,T[53]);c=II(c,d,a,b,M_offset_10,15,T[54]);b=II(b,c,d,a,M_offset_1,21,T[55]);a=II(a,b,c,d,M_offset_8,6,T[56]);d=II(d,a,b,c,M_offset_15,10,T[57]);c=II(c,d,a,b,M_offset_6,15,T[58]);b=II(b,c,d,a,M_offset_13,21,T[59]);a=II(a,b,c,d,M_offset_4,6,T[60]);d=II(d,a,b,c,M_offset_11,10,T[61]);c=II(c,d,a,b,M_offset_2,15,T[62]);b=II(b,c,d,a,M_offset_9,21,T[63]);H[0]=H[0]+a|0;H[1]=H[1]+b|0;H[2]=H[2]+c|0;H[3]=H[3]+d|0},_doFinalize:function(){var data=this._data;var dataWords=data.words;var nBitsTotal=this._nDataBytes*8;var nBitsLeft=data.sigBytes*8;dataWords[nBitsLeft>>>5]|=128<<24-nBitsLeft%32;var nBitsTotalH=Math.floor(nBitsTotal/4294967296);var nBitsTotalL=nBitsTotal;dataWords[(nBitsLeft+64>>>9<<4)+15]=(nBitsTotalH<<8|nBitsTotalH>>>24)&16711935|(nBitsTotalH<<24|nBitsTotalH>>>8)&4278255360;dataWords[(nBitsLeft+64>>>9<<4)+14]=(nBitsTotalL<<8|nBitsTotalL>>>24)&16711935|(nBitsTotalL<<24|nBitsTotalL>>>8)&4278255360;data.sigBytes=(dataWords.length+1)*4;this._process();var hash=this._hash;var H=hash.words;for(var i=0;i<4;i++){var H_i=H[i];H[i]=(H_i<<8|H_i>>>24)&16711935|(H_i<<24|H_i>>>8)&4278255360}return hash},clone:function(){var clone=Hasher.clone.call(this);clone._hash=this._hash.clone();return clone}});function FF(a,b,c,d,x,s,t){var n=a+(b&c|~b&d)+x+t;return(n<>>32-s)+b}function GG(a,b,c,d,x,s,t){var n=a+(b&d|c&~d)+x+t;return(n<>>32-s)+b}function HH(a,b,c,d,x,s,t){var n=a+(b^c^d)+x+t;return(n<>>32-s)+b}function II(a,b,c,d,x,s,t){var n=a+(c^(b|~d))+x+t;return(n<>>32-s)+b}C.MD5=Hasher._createHelper(MD5);C.HmacMD5=Hasher._createHmacHelper(MD5)})(Math);(function(){var C=CryptoJS;var C_lib=C.lib;var WordArray=C_lib.WordArray;var Hasher=C_lib.Hasher;var C_algo=C.algo;var W=[];var SHA1=C_algo.SHA1=Hasher.extend({_doReset:function(){this._hash=new WordArray.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(M,offset){var H=this._hash.words;var a=H[0];var b=H[1];var c=H[2];var d=H[3];var e=H[4];for(var i=0;i<80;i++){if(i<16){W[i]=M[offset+i]|0}else{var n=W[i-3]^W[i-8]^W[i-14]^W[i-16];W[i]=n<<1|n>>>31}var t=(a<<5|a>>>27)+e+W[i];if(i<20){t+=(b&c|~b&d)+1518500249}else if(i<40){t+=(b^c^d)+1859775393}else if(i<60){t+=(b&c|b&d|c&d)-1894007588}else{t+=(b^c^d)-899497514}e=d;d=c;c=b<<30|b>>>2;b=a;a=t}H[0]=H[0]+a|0;H[1]=H[1]+b|0;H[2]=H[2]+c|0;H[3]=H[3]+d|0;H[4]=H[4]+e|0},_doFinalize:function(){var data=this._data;var dataWords=data.words;var nBitsTotal=this._nDataBytes*8;var nBitsLeft=data.sigBytes*8;dataWords[nBitsLeft>>>5]|=128<<24-nBitsLeft%32;dataWords[(nBitsLeft+64>>>9<<4)+14]=Math.floor(nBitsTotal/4294967296);dataWords[(nBitsLeft+64>>>9<<4)+15]=nBitsTotal;data.sigBytes=dataWords.length*4;this._process();return this._hash},clone:function(){var clone=Hasher.clone.call(this);clone._hash=this._hash.clone();return clone}});C.SHA1=Hasher._createHelper(SHA1);C.HmacSHA1=Hasher._createHmacHelper(SHA1)})();(function(Math){var C=CryptoJS;var C_lib=C.lib;var WordArray=C_lib.WordArray;var Hasher=C_lib.Hasher;var C_algo=C.algo;var H=[];var K=[];(function(){function isPrime(n){var sqrtN=Math.sqrt(n);for(var factor=2;factor<=sqrtN;factor++){if(!(n%factor)){return false}}return true}function getFractionalBits(n){return(n-(n|0))*4294967296|0}var n=2;var nPrime=0;while(nPrime<64){if(isPrime(n)){if(nPrime<8){H[nPrime]=getFractionalBits(Math.pow(n,1/2))}K[nPrime]=getFractionalBits(Math.pow(n,1/3));nPrime++}n++}})();var W=[];var SHA256=C_algo.SHA256=Hasher.extend({_doReset:function(){this._hash=new WordArray.init(H.slice(0))},_doProcessBlock:function(M,offset){var H=this._hash.words;var a=H[0];var b=H[1];var c=H[2];var d=H[3];var e=H[4];var f=H[5];var g=H[6];var h=H[7];for(var i=0;i<64;i++){if(i<16){W[i]=M[offset+i]|0}else{var gamma0x=W[i-15];var gamma0=(gamma0x<<25|gamma0x>>>7)^(gamma0x<<14|gamma0x>>>18)^gamma0x>>>3;var gamma1x=W[i-2];var gamma1=(gamma1x<<15|gamma1x>>>17)^(gamma1x<<13|gamma1x>>>19)^gamma1x>>>10;W[i]=gamma0+W[i-7]+gamma1+W[i-16]}var ch=e&f^~e&g;var maj=a&b^a&c^b&c;var sigma0=(a<<30|a>>>2)^(a<<19|a>>>13)^(a<<10|a>>>22);var sigma1=(e<<26|e>>>6)^(e<<21|e>>>11)^(e<<7|e>>>25);var t1=h+sigma1+ch+K[i]+W[i];var t2=sigma0+maj;h=g;g=f;f=e;e=d+t1|0;d=c;c=b;b=a;a=t1+t2|0}H[0]=H[0]+a|0;H[1]=H[1]+b|0;H[2]=H[2]+c|0;H[3]=H[3]+d|0;H[4]=H[4]+e|0;H[5]=H[5]+f|0;H[6]=H[6]+g|0;H[7]=H[7]+h|0},_doFinalize:function(){var data=this._data;var dataWords=data.words;var nBitsTotal=this._nDataBytes*8;var nBitsLeft=data.sigBytes*8;dataWords[nBitsLeft>>>5]|=128<<24-nBitsLeft%32;dataWords[(nBitsLeft+64>>>9<<4)+14]=Math.floor(nBitsTotal/4294967296);dataWords[(nBitsLeft+64>>>9<<4)+15]=nBitsTotal;data.sigBytes=dataWords.length*4;this._process();return this._hash},clone:function(){var clone=Hasher.clone.call(this);clone._hash=this._hash.clone();return clone}});C.SHA256=Hasher._createHelper(SHA256);C.HmacSHA256=Hasher._createHmacHelper(SHA256)})(Math);(function(){var C=CryptoJS;var C_lib=C.lib;var WordArray=C_lib.WordArray;var C_algo=C.algo;var SHA256=C_algo.SHA256;var SHA224=C_algo.SHA224=SHA256.extend({_doReset:function(){this._hash=new WordArray.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var hash=SHA256._doFinalize.call(this);hash.sigBytes-=4;return hash}});C.SHA224=SHA256._createHelper(SHA224);C.HmacSHA224=SHA256._createHmacHelper(SHA224)})();(function(){var C=CryptoJS;var C_lib=C.lib;var Hasher=C_lib.Hasher;var C_x64=C.x64;var X64Word=C_x64.Word;var X64WordArray=C_x64.WordArray;var C_algo=C.algo;function X64Word_create(){return X64Word.create.apply(X64Word,arguments)}var K=[X64Word_create(1116352408,3609767458),X64Word_create(1899447441,602891725),X64Word_create(3049323471,3964484399),X64Word_create(3921009573,2173295548),X64Word_create(961987163,4081628472),X64Word_create(1508970993,3053834265),X64Word_create(2453635748,2937671579),X64Word_create(2870763221,3664609560),X64Word_create(3624381080,2734883394),X64Word_create(310598401,1164996542),X64Word_create(607225278,1323610764),X64Word_create(1426881987,3590304994),X64Word_create(1925078388,4068182383),X64Word_create(2162078206,991336113),X64Word_create(2614888103,633803317),X64Word_create(3248222580,3479774868),X64Word_create(3835390401,2666613458),X64Word_create(4022224774,944711139),X64Word_create(264347078,2341262773),X64Word_create(604807628,2007800933),X64Word_create(770255983,1495990901),X64Word_create(1249150122,1856431235),X64Word_create(1555081692,3175218132),X64Word_create(1996064986,2198950837),X64Word_create(2554220882,3999719339),X64Word_create(2821834349,766784016),X64Word_create(2952996808,2566594879),X64Word_create(3210313671,3203337956),X64Word_create(3336571891,1034457026),X64Word_create(3584528711,2466948901),X64Word_create(113926993,3758326383),X64Word_create(338241895,168717936),X64Word_create(666307205,1188179964),X64Word_create(773529912,1546045734),X64Word_create(1294757372,1522805485),X64Word_create(1396182291,2643833823),X64Word_create(1695183700,2343527390),X64Word_create(1986661051,1014477480),X64Word_create(2177026350,1206759142),X64Word_create(2456956037,344077627),X64Word_create(2730485921,1290863460),X64Word_create(2820302411,3158454273),X64Word_create(3259730800,3505952657),X64Word_create(3345764771,106217008),X64Word_create(3516065817,3606008344),X64Word_create(3600352804,1432725776),X64Word_create(4094571909,1467031594),X64Word_create(275423344,851169720),X64Word_create(430227734,3100823752),X64Word_create(506948616,1363258195),X64Word_create(659060556,3750685593),X64Word_create(883997877,3785050280),X64Word_create(958139571,3318307427),X64Word_create(1322822218,3812723403),X64Word_create(1537002063,2003034995),X64Word_create(1747873779,3602036899),X64Word_create(1955562222,1575990012),X64Word_create(2024104815,1125592928),X64Word_create(2227730452,2716904306),X64Word_create(2361852424,442776044),X64Word_create(2428436474,593698344),X64Word_create(2756734187,3733110249),X64Word_create(3204031479,2999351573),X64Word_create(3329325298,3815920427),X64Word_create(3391569614,3928383900),X64Word_create(3515267271,566280711),X64Word_create(3940187606,3454069534),X64Word_create(4118630271,4000239992),X64Word_create(116418474,1914138554),X64Word_create(174292421,2731055270),X64Word_create(289380356,3203993006),X64Word_create(460393269,320620315),X64Word_create(685471733,587496836),X64Word_create(852142971,1086792851),X64Word_create(1017036298,365543100),X64Word_create(1126000580,2618297676),X64Word_create(1288033470,3409855158),X64Word_create(1501505948,4234509866),X64Word_create(1607167915,987167468),X64Word_create(1816402316,1246189591)];var W=[];(function(){for(var i=0;i<80;i++){W[i]=X64Word_create()}})();var SHA512=C_algo.SHA512=Hasher.extend({_doReset:function(){this._hash=new X64WordArray.init([new X64Word.init(1779033703,4089235720),new X64Word.init(3144134277,2227873595),new X64Word.init(1013904242,4271175723),new X64Word.init(2773480762,1595750129),new X64Word.init(1359893119,2917565137),new X64Word.init(2600822924,725511199),new X64Word.init(528734635,4215389547),new X64Word.init(1541459225,327033209)])},_doProcessBlock:function(M,offset){var H=this._hash.words;var H0=H[0];var H1=H[1];var H2=H[2];var H3=H[3];var H4=H[4];var H5=H[5];var H6=H[6];var H7=H[7];var H0h=H0.high;var H0l=H0.low;var H1h=H1.high;var H1l=H1.low;var H2h=H2.high;var H2l=H2.low;var H3h=H3.high;var H3l=H3.low;var H4h=H4.high;var H4l=H4.low;var H5h=H5.high;var H5l=H5.low;var H6h=H6.high;var H6l=H6.low;var H7h=H7.high;var H7l=H7.low;var ah=H0h;var al=H0l;var bh=H1h;var bl=H1l;var ch=H2h;var cl=H2l;var dh=H3h;var dl=H3l;var eh=H4h;var el=H4l;var fh=H5h;var fl=H5l;var gh=H6h;var gl=H6l;var hh=H7h;var hl=H7l;for(var i=0;i<80;i++){var Wil;var Wih;var Wi=W[i];if(i<16){Wih=Wi.high=M[offset+i*2]|0;Wil=Wi.low=M[offset+i*2+1]|0}else{var gamma0x=W[i-15];var gamma0xh=gamma0x.high;var gamma0xl=gamma0x.low;var gamma0h=(gamma0xh>>>1|gamma0xl<<31)^(gamma0xh>>>8|gamma0xl<<24)^gamma0xh>>>7;var gamma0l=(gamma0xl>>>1|gamma0xh<<31)^(gamma0xl>>>8|gamma0xh<<24)^(gamma0xl>>>7|gamma0xh<<25);var gamma1x=W[i-2];var gamma1xh=gamma1x.high;var gamma1xl=gamma1x.low;var gamma1h=(gamma1xh>>>19|gamma1xl<<13)^(gamma1xh<<3|gamma1xl>>>29)^gamma1xh>>>6;var gamma1l=(gamma1xl>>>19|gamma1xh<<13)^(gamma1xl<<3|gamma1xh>>>29)^(gamma1xl>>>6|gamma1xh<<26);var Wi7=W[i-7];var Wi7h=Wi7.high;var Wi7l=Wi7.low;var Wi16=W[i-16];var Wi16h=Wi16.high;var Wi16l=Wi16.low;Wil=gamma0l+Wi7l;Wih=gamma0h+Wi7h+(Wil>>>0>>0?1:0);Wil=Wil+gamma1l;Wih=Wih+gamma1h+(Wil>>>0>>0?1:0);Wil=Wil+Wi16l;Wih=Wih+Wi16h+(Wil>>>0>>0?1:0);Wi.high=Wih;Wi.low=Wil}var chh=eh&fh^~eh&gh;var chl=el&fl^~el≷var majh=ah&bh^ah&ch^bh&ch;var majl=al&bl^al&cl^bl&cl;var sigma0h=(ah>>>28|al<<4)^(ah<<30|al>>>2)^(ah<<25|al>>>7);var sigma0l=(al>>>28|ah<<4)^(al<<30|ah>>>2)^(al<<25|ah>>>7);var sigma1h=(eh>>>14|el<<18)^(eh>>>18|el<<14)^(eh<<23|el>>>9);var sigma1l=(el>>>14|eh<<18)^(el>>>18|eh<<14)^(el<<23|eh>>>9);var Ki=K[i];var Kih=Ki.high;var Kil=Ki.low;var t1l=hl+sigma1l;var t1h=hh+sigma1h+(t1l>>>0>>0?1:0);var t1l=t1l+chl;var t1h=t1h+chh+(t1l>>>0>>0?1:0);var t1l=t1l+Kil;var t1h=t1h+Kih+(t1l>>>0>>0?1:0);var t1l=t1l+Wil;var t1h=t1h+Wih+(t1l>>>0>>0?1:0);var t2l=sigma0l+majl;var t2h=sigma0h+majh+(t2l>>>0>>0?1:0);hh=gh;hl=gl;gh=fh;gl=fl;fh=eh;fl=el;el=dl+t1l|0;eh=dh+t1h+(el>>>0
>>0?1:0)|0;dh=ch;dl=cl;ch=bh;cl=bl;bh=ah;bl=al;al=t1l+t2l|0;ah=t1h+t2h+(al>>>0>>0?1:0)|0}H0l=H0.low=H0l+al;H0.high=H0h+ah+(H0l>>>0>>0?1:0);H1l=H1.low=H1l+bl;H1.high=H1h+bh+(H1l>>>0>>0?1:0);H2l=H2.low=H2l+cl;H2.high=H2h+ch+(H2l>>>0>>0?1:0);H3l=H3.low=H3l+dl;H3.high=H3h+dh+(H3l>>>0
>>0?1:0);H4l=H4.low=H4l+el;H4.high=H4h+eh+(H4l>>>0>>0?1:0);H5l=H5.low=H5l+fl;H5.high=H5h+fh+(H5l>>>0>>0?1:0);H6l=H6.low=H6l+gl;H6.high=H6h+gh+(H6l>>>0>>0?1:0);H7l=H7.low=H7l+hl;H7.high=H7h+hh+(H7l>>>0>>0?1:0)},_doFinalize:function(){var data=this._data;var dataWords=data.words;var nBitsTotal=this._nDataBytes*8;var nBitsLeft=data.sigBytes*8;dataWords[nBitsLeft>>>5]|=128<<24-nBitsLeft%32;dataWords[(nBitsLeft+128>>>10<<5)+30]=Math.floor(nBitsTotal/4294967296);dataWords[(nBitsLeft+128>>>10<<5)+31]=nBitsTotal;data.sigBytes=dataWords.length*4;this._process();var hash=this._hash.toX32();return hash},clone:function(){var clone=Hasher.clone.call(this);clone._hash=this._hash.clone();return clone},blockSize:1024/32});C.SHA512=Hasher._createHelper(SHA512);C.HmacSHA512=Hasher._createHmacHelper(SHA512)})();(function(){var C=CryptoJS;var C_x64=C.x64;var X64Word=C_x64.Word;var X64WordArray=C_x64.WordArray;var C_algo=C.algo;var SHA512=C_algo.SHA512;var SHA384=C_algo.SHA384=SHA512.extend({_doReset:function(){this._hash=new X64WordArray.init([new X64Word.init(3418070365,3238371032),new X64Word.init(1654270250,914150663),new X64Word.init(2438529370,812702999),new X64Word.init(355462360,4144912697),new X64Word.init(1731405415,4290775857),new X64Word.init(2394180231,1750603025),new X64Word.init(3675008525,1694076839),new X64Word.init(1203062813,3204075428)])},_doFinalize:function(){var hash=SHA512._doFinalize.call(this);hash.sigBytes-=16;return hash}});C.SHA384=SHA512._createHelper(SHA384);C.HmacSHA384=SHA512._createHmacHelper(SHA384)})();(function(Math){var C=CryptoJS;var C_lib=C.lib;var WordArray=C_lib.WordArray;var Hasher=C_lib.Hasher;var C_x64=C.x64;var X64Word=C_x64.Word;var C_algo=C.algo;var RHO_OFFSETS=[];var PI_INDEXES=[];var ROUND_CONSTANTS=[];(function(){var x=1,y=0;for(var t=0;t<24;t++){RHO_OFFSETS[x+5*y]=(t+1)*(t+2)/2%64;var newX=y%5;var newY=(2*x+3*y)%5;x=newX;y=newY}for(var x=0;x<5;x++){for(var y=0;y<5;y++){PI_INDEXES[x+5*y]=y+(2*x+3*y)%5*5}}var LFSR=1;for(var i=0;i<24;i++){var roundConstantMsw=0;var roundConstantLsw=0;for(var j=0;j<7;j++){if(LFSR&1){var bitPosition=(1<>>24)&16711935|(M2i<<24|M2i>>>8)&4278255360;M2i1=(M2i1<<8|M2i1>>>24)&16711935|(M2i1<<24|M2i1>>>8)&4278255360;var lane=state[i];lane.high^=M2i1;lane.low^=M2i}for(var round=0;round<24;round++){for(var x=0;x<5;x++){var tMsw=0,tLsw=0;for(var y=0;y<5;y++){var lane=state[x+5*y];tMsw^=lane.high;tLsw^=lane.low}var Tx=T[x];Tx.high=tMsw;Tx.low=tLsw}for(var x=0;x<5;x++){var Tx4=T[(x+4)%5];var Tx1=T[(x+1)%5];var Tx1Msw=Tx1.high;var Tx1Lsw=Tx1.low;var tMsw=Tx4.high^(Tx1Msw<<1|Tx1Lsw>>>31);var tLsw=Tx4.low^(Tx1Lsw<<1|Tx1Msw>>>31);for(var y=0;y<5;y++){var lane=state[x+5*y];lane.high^=tMsw;lane.low^=tLsw}}for(var laneIndex=1;laneIndex<25;laneIndex++){var tMsw;var tLsw;var lane=state[laneIndex];var laneMsw=lane.high;var laneLsw=lane.low;var rhoOffset=RHO_OFFSETS[laneIndex];if(rhoOffset<32){tMsw=laneMsw<>>32-rhoOffset;tLsw=laneLsw<>>32-rhoOffset}else{tMsw=laneLsw<>>64-rhoOffset;tLsw=laneMsw<>>64-rhoOffset}var TPiLane=T[PI_INDEXES[laneIndex]];TPiLane.high=tMsw;TPiLane.low=tLsw}var T0=T[0];var state0=state[0];T0.high=state0.high;T0.low=state0.low;for(var x=0;x<5;x++){for(var y=0;y<5;y++){var laneIndex=x+5*y;var lane=state[laneIndex];var TLane=T[laneIndex];var Tx1Lane=T[(x+1)%5+5*y];var Tx2Lane=T[(x+2)%5+5*y];lane.high=TLane.high^~Tx1Lane.high&Tx2Lane.high;lane.low=TLane.low^~Tx1Lane.low&Tx2Lane.low}}var lane=state[0];var roundConstant=ROUND_CONSTANTS[round];lane.high^=roundConstant.high;lane.low^=roundConstant.low}},_doFinalize:function(){var data=this._data;var dataWords=data.words;var nBitsTotal=this._nDataBytes*8;var nBitsLeft=data.sigBytes*8;var blockSizeBits=this.blockSize*32;dataWords[nBitsLeft>>>5]|=1<<24-nBitsLeft%32;dataWords[(Math.ceil((nBitsLeft+1)/blockSizeBits)*blockSizeBits>>>5)-1]|=128;data.sigBytes=dataWords.length*4;this._process();var state=this._state;var outputLengthBytes=this.cfg.outputLength/8;var outputLengthLanes=outputLengthBytes/8;var hashWords=[];for(var i=0;i>>24)&16711935|(laneMsw<<24|laneMsw>>>8)&4278255360;laneLsw=(laneLsw<<8|laneLsw>>>24)&16711935|(laneLsw<<24|laneLsw>>>8)&4278255360;hashWords.push(laneLsw);hashWords.push(laneMsw)}return new WordArray.init(hashWords,outputLengthBytes)},clone:function(){var clone=Hasher.clone.call(this);var state=clone._state=this._state.slice(0);for(var i=0;i<25;i++){state[i]=state[i].clone()}return clone}});C.SHA3=Hasher._createHelper(SHA3);C.HmacSHA3=Hasher._createHmacHelper(SHA3)})(Math);(function(Math){var C=CryptoJS;var C_lib=C.lib;var WordArray=C_lib.WordArray;var Hasher=C_lib.Hasher;var C_algo=C.algo;var _zl=WordArray.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]);var _zr=WordArray.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]);var _sl=WordArray.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]);var _sr=WordArray.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]);var _hl=WordArray.create([0,1518500249,1859775393,2400959708,2840853838]);var _hr=WordArray.create([1352829926,1548603684,1836072691,2053994217,0]);var RIPEMD160=C_algo.RIPEMD160=Hasher.extend({_doReset:function(){this._hash=WordArray.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(M,offset){for(var i=0;i<16;i++){var offset_i=offset+i;var M_offset_i=M[offset_i];M[offset_i]=(M_offset_i<<8|M_offset_i>>>24)&16711935|(M_offset_i<<24|M_offset_i>>>8)&4278255360}var H=this._hash.words;var hl=_hl.words;var hr=_hr.words;var zl=_zl.words;var zr=_zr.words;var sl=_sl.words;var sr=_sr.words;var al,bl,cl,dl,el;var ar,br,cr,dr,er;ar=al=H[0];br=bl=H[1];cr=cl=H[2];dr=dl=H[3];er=el=H[4];var t;for(var i=0;i<80;i+=1){t=al+M[offset+zl[i]]|0;if(i<16){t+=f1(bl,cl,dl)+hl[0]}else if(i<32){t+=f2(bl,cl,dl)+hl[1]}else if(i<48){t+=f3(bl,cl,dl)+hl[2]}else if(i<64){t+=f4(bl,cl,dl)+hl[3]}else{t+=f5(bl,cl,dl)+hl[4]}t=t|0;t=rotl(t,sl[i]);t=t+el|0;al=el;el=dl;dl=rotl(cl,10);cl=bl;bl=t;t=ar+M[offset+zr[i]]|0;if(i<16){t+=f5(br,cr,dr)+hr[0]}else if(i<32){t+=f4(br,cr,dr)+hr[1]}else if(i<48){t+=f3(br,cr,dr)+hr[2]}else if(i<64){t+=f2(br,cr,dr)+hr[3]}else{t+=f1(br,cr,dr)+hr[4]}t=t|0;t=rotl(t,sr[i]);t=t+er|0;ar=er;er=dr;dr=rotl(cr,10);cr=br;br=t}t=H[1]+cl+dr|0;H[1]=H[2]+dl+er|0;H[2]=H[3]+el+ar|0;H[3]=H[4]+al+br|0;H[4]=H[0]+bl+cr|0;H[0]=t},_doFinalize:function(){var data=this._data;var dataWords=data.words;var nBitsTotal=this._nDataBytes*8;var nBitsLeft=data.sigBytes*8;dataWords[nBitsLeft>>>5]|=128<<24-nBitsLeft%32;dataWords[(nBitsLeft+64>>>9<<4)+14]=(nBitsTotal<<8|nBitsTotal>>>24)&16711935|(nBitsTotal<<24|nBitsTotal>>>8)&4278255360;data.sigBytes=(dataWords.length+1)*4;this._process();var hash=this._hash;var H=hash.words;for(var i=0;i<5;i++){var H_i=H[i];H[i]=(H_i<<8|H_i>>>24)&16711935|(H_i<<24|H_i>>>8)&4278255360}return hash},clone:function(){var clone=Hasher.clone.call(this);clone._hash=this._hash.clone();return clone}});function f1(x,y,z){return x^y^z}function f2(x,y,z){return x&y|~x&z}function f3(x,y,z){return(x|~y)^z}function f4(x,y,z){return x&z|y&~z}function f5(x,y,z){return x^(y|~z)}function rotl(x,n){return x<>>32-n}C.RIPEMD160=Hasher._createHelper(RIPEMD160);C.HmacRIPEMD160=Hasher._createHmacHelper(RIPEMD160)})(Math);(function(){var C=CryptoJS;var C_lib=C.lib;var Base=C_lib.Base;var C_enc=C.enc;var Utf8=C_enc.Utf8;var C_algo=C.algo;var HMAC=C_algo.HMAC=Base.extend({init:function(hasher,key){hasher=this._hasher=new hasher.init;if(typeof key=="string"){key=Utf8.parse(key)}var hasherBlockSize=hasher.blockSize;var hasherBlockSizeBytes=hasherBlockSize*4;if(key.sigBytes>hasherBlockSizeBytes){key=hasher.finalize(key)}key.clamp();var oKey=this._oKey=key.clone();var iKey=this._iKey=key.clone();var oKeyWords=oKey.words;var iKeyWords=iKey.words;for(var i=0;i>>2]&255;data.sigBytes-=nPaddingBytes}};var BlockCipher=C_lib.BlockCipher=Cipher.extend({cfg:Cipher.cfg.extend({mode:CBC,padding:Pkcs7}),reset:function(){var modeCreator;Cipher.reset.call(this);var cfg=this.cfg;var iv=cfg.iv;var mode=cfg.mode;if(this._xformMode==this._ENC_XFORM_MODE){modeCreator=mode.createEncryptor}else{modeCreator=mode.createDecryptor;this._minBufferSize=1}if(this._mode&&this._mode.__creator==modeCreator){this._mode.init(this,iv&&iv.words)}else{this._mode=modeCreator.call(mode,this,iv&&iv.words);this._mode.__creator=modeCreator}},_doProcessBlock:function(words,offset){this._mode.processBlock(words,offset)},_doFinalize:function(){var finalProcessedBlocks;var padding=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){padding.pad(this._data,this.blockSize);finalProcessedBlocks=this._process(!!"flush")}else{finalProcessedBlocks=this._process(!!"flush");padding.unpad(finalProcessedBlocks)}return finalProcessedBlocks},blockSize:128/32});var CipherParams=C_lib.CipherParams=Base.extend({init:function(cipherParams){this.mixIn(cipherParams)},toString:function(formatter){return(formatter||this.formatter).stringify(this)}});var C_format=C.format={};var OpenSSLFormatter=C_format.OpenSSL={stringify:function(cipherParams){var wordArray;var ciphertext=cipherParams.ciphertext;var salt=cipherParams.salt;if(salt){wordArray=WordArray.create([1398893684,1701076831]).concat(salt).concat(ciphertext)}else{wordArray=ciphertext}return wordArray.toString(Base64)},parse:function(openSSLStr){var salt;var ciphertext=Base64.parse(openSSLStr);var ciphertextWords=ciphertext.words;if(ciphertextWords[0]==1398893684&&ciphertextWords[1]==1701076831){salt=WordArray.create(ciphertextWords.slice(2,4));ciphertextWords.splice(0,4);ciphertext.sigBytes-=16}return CipherParams.create({ciphertext:ciphertext,salt:salt})}};var SerializableCipher=C_lib.SerializableCipher=Base.extend({cfg:Base.extend({format:OpenSSLFormatter}),encrypt:function(cipher,message,key,cfg){cfg=this.cfg.extend(cfg);var encryptor=cipher.createEncryptor(key,cfg);var ciphertext=encryptor.finalize(message);var cipherCfg=encryptor.cfg;return CipherParams.create({ciphertext:ciphertext,key:key,iv:cipherCfg.iv,algorithm:cipher,mode:cipherCfg.mode,padding:cipherCfg.padding,blockSize:cipher.blockSize,formatter:cfg.format})},decrypt:function(cipher,ciphertext,key,cfg){cfg=this.cfg.extend(cfg);ciphertext=this._parse(ciphertext,cfg.format);var plaintext=cipher.createDecryptor(key,cfg).finalize(ciphertext.ciphertext);return plaintext},_parse:function(ciphertext,format){if(typeof ciphertext=="string"){return format.parse(ciphertext,this)}else{return ciphertext}}});var C_kdf=C.kdf={};var OpenSSLKdf=C_kdf.OpenSSL={execute:function(password,keySize,ivSize,salt){if(!salt){salt=WordArray.random(64/8)}var key=EvpKDF.create({keySize:keySize+ivSize}).compute(password,salt);var iv=WordArray.create(key.words.slice(keySize),ivSize*4);key.sigBytes=keySize*4;return CipherParams.create({key:key,iv:iv,salt:salt})}};var PasswordBasedCipher=C_lib.PasswordBasedCipher=SerializableCipher.extend({cfg:SerializableCipher.cfg.extend({kdf:OpenSSLKdf}),encrypt:function(cipher,message,password,cfg){cfg=this.cfg.extend(cfg);var derivedParams=cfg.kdf.execute(password,cipher.keySize,cipher.ivSize);cfg.iv=derivedParams.iv;var ciphertext=SerializableCipher.encrypt.call(this,cipher,message,derivedParams.key,cfg);ciphertext.mixIn(derivedParams);return ciphertext},decrypt:function(cipher,ciphertext,password,cfg){cfg=this.cfg.extend(cfg);ciphertext=this._parse(ciphertext,cfg.format);var derivedParams=cfg.kdf.execute(password,cipher.keySize,cipher.ivSize,ciphertext.salt);cfg.iv=derivedParams.iv;var plaintext=SerializableCipher.decrypt.call(this,cipher,ciphertext,derivedParams.key,cfg);return plaintext}})}();CryptoJS.mode.CFB=function(){var CFB=CryptoJS.lib.BlockCipherMode.extend();CFB.Encryptor=CFB.extend({processBlock:function(words,offset){var cipher=this._cipher;var blockSize=cipher.blockSize;generateKeystreamAndEncrypt.call(this,words,offset,blockSize,cipher);this._prevBlock=words.slice(offset,offset+blockSize)}});CFB.Decryptor=CFB.extend({processBlock:function(words,offset){var cipher=this._cipher;var blockSize=cipher.blockSize;var thisBlock=words.slice(offset,offset+blockSize);generateKeystreamAndEncrypt.call(this,words,offset,blockSize,cipher);this._prevBlock=thisBlock}});function generateKeystreamAndEncrypt(words,offset,blockSize,cipher){var keystream;var iv=this._iv;if(iv){keystream=iv.slice(0);this._iv=undefined}else{keystream=this._prevBlock}cipher.encryptBlock(keystream,0);for(var i=0;i>24&255)===255){var b1=word>>16&255;var b2=word>>8&255;var b3=word&255;if(b1===255){b1=0;if(b2===255){b2=0;if(b3===255){b3=0}else{++b3}}else{++b2}}else{++b1}word=0;word+=b1<<16;word+=b2<<8;word+=b3}else{word+=1<<24}return word}function incCounter(counter){if((counter[0]=incWord(counter[0]))===0){counter[1]=incWord(counter[1])}return counter}var Encryptor=CTRGladman.Encryptor=CTRGladman.extend({processBlock:function(words,offset){var cipher=this._cipher;var blockSize=cipher.blockSize;var iv=this._iv;var counter=this._counter;if(iv){counter=this._counter=iv.slice(0);this._iv=undefined}incCounter(counter);var keystream=counter.slice(0);cipher.encryptBlock(keystream,0);for(var i=0;i>>2]|=nPaddingBytes<<24-lastBytePos%4*8;data.sigBytes+=nPaddingBytes},unpad:function(data){var nPaddingBytes=data.words[data.sigBytes-1>>>2]&255;data.sigBytes-=nPaddingBytes}};CryptoJS.pad.Iso10126={pad:function(data,blockSize){var blockSizeBytes=blockSize*4;var nPaddingBytes=blockSizeBytes-data.sigBytes%blockSizeBytes;data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes-1)).concat(CryptoJS.lib.WordArray.create([nPaddingBytes<<24],1))},unpad:function(data){var nPaddingBytes=data.words[data.sigBytes-1>>>2]&255;data.sigBytes-=nPaddingBytes}};CryptoJS.pad.Iso97971={pad:function(data,blockSize){data.concat(CryptoJS.lib.WordArray.create([2147483648],1));CryptoJS.pad.ZeroPadding.pad(data,blockSize)},unpad:function(data){CryptoJS.pad.ZeroPadding.unpad(data);data.sigBytes--}};CryptoJS.pad.ZeroPadding={pad:function(data,blockSize){var blockSizeBytes=blockSize*4;data.clamp();data.sigBytes+=blockSizeBytes-(data.sigBytes%blockSizeBytes||blockSizeBytes)},unpad:function(data){var dataWords=data.words;var i=data.sigBytes-1;for(var i=data.sigBytes-1;i>=0;i--){if(dataWords[i>>>2]>>>24-i%4*8&255){data.sigBytes=i+1;break}}}};CryptoJS.pad.NoPadding={pad:function(){},unpad:function(){}};(function(undefined){var C=CryptoJS;var C_lib=C.lib;var CipherParams=C_lib.CipherParams;var C_enc=C.enc;var Hex=C_enc.Hex;var C_format=C.format;var HexFormatter=C_format.Hex={stringify:function(cipherParams){return cipherParams.ciphertext.toString(Hex)},parse:function(input){var ciphertext=Hex.parse(input);return CipherParams.create({ciphertext:ciphertext})}}})();(function(){var C=CryptoJS;var C_lib=C.lib;var BlockCipher=C_lib.BlockCipher;var C_algo=C.algo;var SBOX=[];var INV_SBOX=[];var SUB_MIX_0=[];var SUB_MIX_1=[];var SUB_MIX_2=[];var SUB_MIX_3=[];var INV_SUB_MIX_0=[];var INV_SUB_MIX_1=[];var INV_SUB_MIX_2=[];var INV_SUB_MIX_3=[];(function(){var d=[];for(var i=0;i<256;i++){if(i<128){d[i]=i<<1}else{d[i]=i<<1^283}}var x=0;var xi=0;for(var i=0;i<256;i++){var sx=xi^xi<<1^xi<<2^xi<<3^xi<<4;sx=sx>>>8^sx&255^99;SBOX[x]=sx;INV_SBOX[sx]=x;var x2=d[x];var x4=d[x2];var x8=d[x4];var t=d[sx]*257^sx*16843008;SUB_MIX_0[x]=t<<24|t>>>8;SUB_MIX_1[x]=t<<16|t>>>16;SUB_MIX_2[x]=t<<8|t>>>24;SUB_MIX_3[x]=t;var t=x8*16843009^x4*65537^x2*257^x*16843008;INV_SUB_MIX_0[sx]=t<<24|t>>>8;INV_SUB_MIX_1[sx]=t<<16|t>>>16;INV_SUB_MIX_2[sx]=t<<8|t>>>24;INV_SUB_MIX_3[sx]=t;if(!x){x=xi=1}else{x=x2^d[d[d[x8^x2]]];xi^=d[d[xi]]}}})();var RCON=[0,1,2,4,8,16,32,64,128,27,54];var AES=C_algo.AES=BlockCipher.extend({_doReset:function(){var t;if(this._nRounds&&this._keyPriorReset===this._key){return}var key=this._keyPriorReset=this._key;var keyWords=key.words;var keySize=key.sigBytes/4;var nRounds=this._nRounds=keySize+6;var ksRows=(nRounds+1)*4;var keySchedule=this._keySchedule=[];for(var ksRow=0;ksRow>>24;t=SBOX[t>>>24]<<24|SBOX[t>>>16&255]<<16|SBOX[t>>>8&255]<<8|SBOX[t&255];t^=RCON[ksRow/keySize|0]<<24}else if(keySize>6&&ksRow%keySize==4){t=SBOX[t>>>24]<<24|SBOX[t>>>16&255]<<16|SBOX[t>>>8&255]<<8|SBOX[t&255]}keySchedule[ksRow]=keySchedule[ksRow-keySize]^t}}var invKeySchedule=this._invKeySchedule=[];for(var invKsRow=0;invKsRow>>24]]^INV_SUB_MIX_1[SBOX[t>>>16&255]]^INV_SUB_MIX_2[SBOX[t>>>8&255]]^INV_SUB_MIX_3[SBOX[t&255]]}}},encryptBlock:function(M,offset){this._doCryptBlock(M,offset,this._keySchedule,SUB_MIX_0,SUB_MIX_1,SUB_MIX_2,SUB_MIX_3,SBOX)},decryptBlock:function(M,offset){var t=M[offset+1];M[offset+1]=M[offset+3];M[offset+3]=t;this._doCryptBlock(M,offset,this._invKeySchedule,INV_SUB_MIX_0,INV_SUB_MIX_1,INV_SUB_MIX_2,INV_SUB_MIX_3,INV_SBOX);var t=M[offset+1];M[offset+1]=M[offset+3];M[offset+3]=t},_doCryptBlock:function(M,offset,keySchedule,SUB_MIX_0,SUB_MIX_1,SUB_MIX_2,SUB_MIX_3,SBOX){var nRounds=this._nRounds;var s0=M[offset]^keySchedule[0];var s1=M[offset+1]^keySchedule[1];var s2=M[offset+2]^keySchedule[2];var s3=M[offset+3]^keySchedule[3];var ksRow=4;for(var round=1;round>>24]^SUB_MIX_1[s1>>>16&255]^SUB_MIX_2[s2>>>8&255]^SUB_MIX_3[s3&255]^keySchedule[ksRow++];var t1=SUB_MIX_0[s1>>>24]^SUB_MIX_1[s2>>>16&255]^SUB_MIX_2[s3>>>8&255]^SUB_MIX_3[s0&255]^keySchedule[ksRow++];var t2=SUB_MIX_0[s2>>>24]^SUB_MIX_1[s3>>>16&255]^SUB_MIX_2[s0>>>8&255]^SUB_MIX_3[s1&255]^keySchedule[ksRow++];var t3=SUB_MIX_0[s3>>>24]^SUB_MIX_1[s0>>>16&255]^SUB_MIX_2[s1>>>8&255]^SUB_MIX_3[s2&255]^keySchedule[ksRow++];s0=t0;s1=t1;s2=t2;s3=t3}var t0=(SBOX[s0>>>24]<<24|SBOX[s1>>>16&255]<<16|SBOX[s2>>>8&255]<<8|SBOX[s3&255])^keySchedule[ksRow++];var t1=(SBOX[s1>>>24]<<24|SBOX[s2>>>16&255]<<16|SBOX[s3>>>8&255]<<8|SBOX[s0&255])^keySchedule[ksRow++];var t2=(SBOX[s2>>>24]<<24|SBOX[s3>>>16&255]<<16|SBOX[s0>>>8&255]<<8|SBOX[s1&255])^keySchedule[ksRow++];var t3=(SBOX[s3>>>24]<<24|SBOX[s0>>>16&255]<<16|SBOX[s1>>>8&255]<<8|SBOX[s2&255])^keySchedule[ksRow++];M[offset]=t0;M[offset+1]=t1;M[offset+2]=t2;M[offset+3]=t3},keySize:256/32});C.AES=BlockCipher._createHelper(AES)})();(function(){var C=CryptoJS;var C_lib=C.lib;var WordArray=C_lib.WordArray;var BlockCipher=C_lib.BlockCipher;var C_algo=C.algo;var PC1=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4];var PC2=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32];var BIT_SHIFTS=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28];var SBOX_P=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}];var SBOX_MASK=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679];var DES=C_algo.DES=BlockCipher.extend({_doReset:function(){var key=this._key;var keyWords=key.words;var keyBits=[];for(var i=0;i<56;i++){var keyBitPos=PC1[i]-1;keyBits[i]=keyWords[keyBitPos>>>5]>>>31-keyBitPos%32&1}var subKeys=this._subKeys=[];for(var nSubKey=0;nSubKey<16;nSubKey++){var subKey=subKeys[nSubKey]=[];var bitShift=BIT_SHIFTS[nSubKey];for(var i=0;i<24;i++){subKey[i/6|0]|=keyBits[(PC2[i]-1+bitShift)%28]<<31-i%6;subKey[4+(i/6|0)]|=keyBits[28+(PC2[i+24]-1+bitShift)%28]<<31-i%6}subKey[0]=subKey[0]<<1|subKey[0]>>>31;for(var i=1;i<7;i++){subKey[i]=subKey[i]>>>(i-1)*4+3}subKey[7]=subKey[7]<<5|subKey[7]>>>27}var invSubKeys=this._invSubKeys=[];for(var i=0;i<16;i++){invSubKeys[i]=subKeys[15-i]}},encryptBlock:function(M,offset){this._doCryptBlock(M,offset,this._subKeys)},decryptBlock:function(M,offset){this._doCryptBlock(M,offset,this._invSubKeys)},_doCryptBlock:function(M,offset,subKeys){this._lBlock=M[offset];this._rBlock=M[offset+1];exchangeLR.call(this,4,252645135);exchangeLR.call(this,16,65535);exchangeRL.call(this,2,858993459);exchangeRL.call(this,8,16711935);exchangeLR.call(this,1,1431655765);for(var round=0;round<16;round++){var subKey=subKeys[round];var lBlock=this._lBlock;var rBlock=this._rBlock;var f=0;for(var i=0;i<8;i++){f|=SBOX_P[i][((rBlock^subKey[i])&SBOX_MASK[i])>>>0]}this._lBlock=rBlock;this._rBlock=lBlock^f}var t=this._lBlock;this._lBlock=this._rBlock;this._rBlock=t;exchangeLR.call(this,1,1431655765);exchangeRL.call(this,8,16711935);exchangeRL.call(this,2,858993459);exchangeLR.call(this,16,65535);exchangeLR.call(this,4,252645135);M[offset]=this._lBlock;M[offset+1]=this._rBlock},keySize:64/32,ivSize:64/32,blockSize:64/32});function exchangeLR(offset,mask){var t=(this._lBlock>>>offset^this._rBlock)&mask;this._rBlock^=t;this._lBlock^=t<>>offset^this._lBlock)&mask;this._lBlock^=t;this._rBlock^=t<192.")}var key1=keyWords.slice(0,2);var key2=keyWords.length<4?keyWords.slice(0,2):keyWords.slice(2,4);var key3=keyWords.length<6?keyWords.slice(0,2):keyWords.slice(4,6);this._des1=DES.createEncryptor(WordArray.create(key1));this._des2=DES.createEncryptor(WordArray.create(key2));this._des3=DES.createEncryptor(WordArray.create(key3))},encryptBlock:function(M,offset){this._des1.encryptBlock(M,offset);this._des2.decryptBlock(M,offset);this._des3.encryptBlock(M,offset)},decryptBlock:function(M,offset){this._des3.decryptBlock(M,offset);this._des2.encryptBlock(M,offset);this._des1.decryptBlock(M,offset)},keySize:192/32,ivSize:64/32,blockSize:64/32});C.TripleDES=BlockCipher._createHelper(TripleDES)})();(function(){var C=CryptoJS;var C_lib=C.lib;var StreamCipher=C_lib.StreamCipher;var C_algo=C.algo;var RC4=C_algo.RC4=StreamCipher.extend({_doReset:function(){var key=this._key;var keyWords=key.words;var keySigBytes=key.sigBytes;var S=this._S=[];for(var i=0;i<256;i++){S[i]=i}for(var i=0,j=0;i<256;i++){var keyByteIndex=i%keySigBytes;var keyByte=keyWords[keyByteIndex>>>2]>>>24-keyByteIndex%4*8&255;j=(j+S[i]+keyByte)%256;var t=S[i];S[i]=S[j];S[j]=t}this._i=this._j=0},_doProcessBlock:function(M,offset){M[offset]^=generateKeystreamWord.call(this)},keySize:256/32,ivSize:0});function generateKeystreamWord(){var S=this._S;var i=this._i;var j=this._j;var keystreamWord=0;for(var n=0;n<4;n++){i=(i+1)%256;j=(j+S[i])%256;var t=S[i];S[i]=S[j];S[j]=t;keystreamWord|=S[(S[i]+S[j])%256]<<24-n*8}this._i=i;this._j=j;return keystreamWord}C.RC4=StreamCipher._createHelper(RC4);var RC4Drop=C_algo.RC4Drop=RC4.extend({cfg:RC4.cfg.extend({drop:192}),_doReset:function(){RC4._doReset.call(this);for(var i=this.cfg.drop;i>0;i--){generateKeystreamWord.call(this)}}});C.RC4Drop=StreamCipher._createHelper(RC4Drop)})();(function(){var C=CryptoJS;var C_lib=C.lib;var StreamCipher=C_lib.StreamCipher;var C_algo=C.algo;var S=[];var C_=[];var G=[];var Rabbit=C_algo.Rabbit=StreamCipher.extend({_doReset:function(){var K=this._key.words;var iv=this.cfg.iv;for(var i=0;i<4;i++){K[i]=(K[i]<<8|K[i]>>>24)&16711935|(K[i]<<24|K[i]>>>8)&4278255360}var X=this._X=[K[0],K[3]<<16|K[2]>>>16,K[1],K[0]<<16|K[3]>>>16,K[2],K[1]<<16|K[0]>>>16,K[3],K[2]<<16|K[1]>>>16];var C=this._C=[K[2]<<16|K[2]>>>16,K[0]&4294901760|K[1]&65535,K[3]<<16|K[3]>>>16,K[1]&4294901760|K[2]&65535,K[0]<<16|K[0]>>>16,K[2]&4294901760|K[3]&65535,K[1]<<16|K[1]>>>16,K[3]&4294901760|K[0]&65535];this._b=0;for(var i=0;i<4;i++){nextState.call(this)}for(var i=0;i<8;i++){C[i]^=X[i+4&7]}if(iv){var IV=iv.words;var IV_0=IV[0];var IV_1=IV[1];var i0=(IV_0<<8|IV_0>>>24)&16711935|(IV_0<<24|IV_0>>>8)&4278255360;var i2=(IV_1<<8|IV_1>>>24)&16711935|(IV_1<<24|IV_1>>>8)&4278255360;var i1=i0>>>16|i2&4294901760;var i3=i2<<16|i0&65535;C[0]^=i0;C[1]^=i1;C[2]^=i2;C[3]^=i3;C[4]^=i0;C[5]^=i1;C[6]^=i2;C[7]^=i3;for(var i=0;i<4;i++){nextState.call(this)}}},_doProcessBlock:function(M,offset){var X=this._X;nextState.call(this);S[0]=X[0]^X[5]>>>16^X[3]<<16;S[1]=X[2]^X[7]>>>16^X[5]<<16;S[2]=X[4]^X[1]>>>16^X[7]<<16;S[3]=X[6]^X[3]>>>16^X[1]<<16;for(var i=0;i<4;i++){S[i]=(S[i]<<8|S[i]>>>24)&16711935|(S[i]<<24|S[i]>>>8)&4278255360;M[offset+i]^=S[i]}},blockSize:128/32,ivSize:64/32});function nextState(){var X=this._X;var C=this._C;for(var i=0;i<8;i++){C_[i]=C[i]}C[0]=C[0]+1295307597+this._b|0;C[1]=C[1]+3545052371+(C[0]>>>0>>0?1:0)|0;C[2]=C[2]+886263092+(C[1]>>>0>>0?1:0)|0;C[3]=C[3]+1295307597+(C[2]>>>0>>0?1:0)|0;C[4]=C[4]+3545052371+(C[3]>>>0>>0?1:0)|0;C[5]=C[5]+886263092+(C[4]>>>0>>0?1:0)|0;C[6]=C[6]+1295307597+(C[5]>>>0>>0?1:0)|0;C[7]=C[7]+3545052371+(C[6]>>>0>>0?1:0)|0;this._b=C[7]>>>0>>0?1:0;for(var i=0;i<8;i++){var gx=X[i]+C[i];var ga=gx&65535;var gb=gx>>>16;var gh=((ga*ga>>>17)+ga*gb>>>15)+gb*gb;var gl=((gx&4294901760)*gx|0)+((gx&65535)*gx|0);G[i]=gh^gl}X[0]=G[0]+(G[7]<<16|G[7]>>>16)+(G[6]<<16|G[6]>>>16)|0;X[1]=G[1]+(G[0]<<8|G[0]>>>24)+G[7]|0;X[2]=G[2]+(G[1]<<16|G[1]>>>16)+(G[0]<<16|G[0]>>>16)|0;X[3]=G[3]+(G[2]<<8|G[2]>>>24)+G[1]|0;X[4]=G[4]+(G[3]<<16|G[3]>>>16)+(G[2]<<16|G[2]>>>16)|0;X[5]=G[5]+(G[4]<<8|G[4]>>>24)+G[3]|0;X[6]=G[6]+(G[5]<<16|G[5]>>>16)+(G[4]<<16|G[4]>>>16)|0;X[7]=G[7]+(G[6]<<8|G[6]>>>24)+G[5]|0}C.Rabbit=StreamCipher._createHelper(Rabbit)})();(function(){var C=CryptoJS;var C_lib=C.lib;var StreamCipher=C_lib.StreamCipher;var C_algo=C.algo;var S=[];var C_=[];var G=[];var RabbitLegacy=C_algo.RabbitLegacy=StreamCipher.extend({_doReset:function(){var K=this._key.words;var iv=this.cfg.iv;var X=this._X=[K[0],K[3]<<16|K[2]>>>16,K[1],K[0]<<16|K[3]>>>16,K[2],K[1]<<16|K[0]>>>16,K[3],K[2]<<16|K[1]>>>16];var C=this._C=[K[2]<<16|K[2]>>>16,K[0]&4294901760|K[1]&65535,K[3]<<16|K[3]>>>16,K[1]&4294901760|K[2]&65535,K[0]<<16|K[0]>>>16,K[2]&4294901760|K[3]&65535,K[1]<<16|K[1]>>>16,K[3]&4294901760|K[0]&65535];this._b=0;for(var i=0;i<4;i++){nextState.call(this)}for(var i=0;i<8;i++){C[i]^=X[i+4&7]}if(iv){var IV=iv.words;var IV_0=IV[0];var IV_1=IV[1];var i0=(IV_0<<8|IV_0>>>24)&16711935|(IV_0<<24|IV_0>>>8)&4278255360;var i2=(IV_1<<8|IV_1>>>24)&16711935|(IV_1<<24|IV_1>>>8)&4278255360;var i1=i0>>>16|i2&4294901760;var i3=i2<<16|i0&65535;C[0]^=i0;C[1]^=i1;C[2]^=i2;C[3]^=i3;C[4]^=i0;C[5]^=i1;C[6]^=i2;C[7]^=i3;for(var i=0;i<4;i++){nextState.call(this)}}},_doProcessBlock:function(M,offset){var X=this._X;nextState.call(this);S[0]=X[0]^X[5]>>>16^X[3]<<16;S[1]=X[2]^X[7]>>>16^X[5]<<16;S[2]=X[4]^X[1]>>>16^X[7]<<16;S[3]=X[6]^X[3]>>>16^X[1]<<16;for(var i=0;i<4;i++){S[i]=(S[i]<<8|S[i]>>>24)&16711935|(S[i]<<24|S[i]>>>8)&4278255360;M[offset+i]^=S[i]}},blockSize:128/32,ivSize:64/32});function nextState(){var X=this._X;var C=this._C;for(var i=0;i<8;i++){C_[i]=C[i]}C[0]=C[0]+1295307597+this._b|0;C[1]=C[1]+3545052371+(C[0]>>>0>>0?1:0)|0;C[2]=C[2]+886263092+(C[1]>>>0>>0?1:0)|0;C[3]=C[3]+1295307597+(C[2]>>>0>>0?1:0)|0;C[4]=C[4]+3545052371+(C[3]>>>0>>0?1:0)|0;C[5]=C[5]+886263092+(C[4]>>>0>>0?1:0)|0;C[6]=C[6]+1295307597+(C[5]>>>0>>0?1:0)|0;C[7]=C[7]+3545052371+(C[6]>>>0>>0?1:0)|0;this._b=C[7]>>>0>>0?1:0;for(var i=0;i<8;i++){var gx=X[i]+C[i];var ga=gx&65535;var gb=gx>>>16;var gh=((ga*ga>>>17)+ga*gb>>>15)+gb*gb;var gl=((gx&4294901760)*gx|0)+((gx&65535)*gx|0);G[i]=gh^gl}X[0]=G[0]+(G[7]<<16|G[7]>>>16)+(G[6]<<16|G[6]>>>16)|0;X[1]=G[1]+(G[0]<<8|G[0]>>>24)+G[7]|0;X[2]=G[2]+(G[1]<<16|G[1]>>>16)+(G[0]<<16|G[0]>>>16)|0;X[3]=G[3]+(G[2]<<8|G[2]>>>24)+G[1]|0;X[4]=G[4]+(G[3]<<16|G[3]>>>16)+(G[2]<<16|G[2]>>>16)|0;X[5]=G[5]+(G[4]<<8|G[4]>>>24)+G[3]|0;X[6]=G[6]+(G[5]<<16|G[5]>>>16)+(G[4]<<16|G[4]>>>16)|0;X[7]=G[7]+(G[6]<<8|G[6]>>>24)+G[5]|0}C.RabbitLegacy=StreamCipher._createHelper(RabbitLegacy)})();return CryptoJS});'},156:(e,a,t)=>{t(642)(t(761))},321:e=>{e.exports='!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).JSONPath={})}(this,function(e){"use strict";function n(e,t,r){return t=l(t),function(e,t){{if(t&&("object"==typeof t||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called")}(e)}(e,i()?Reflect.construct(t,r||[],l(e).constructor):t.apply(e,r))}function o(e,t,r){if(i())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,t);n=new(e.bind.apply(e,n));return r&&h(n,r.prototype),n}function i(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(i=function(){return!!e})()}function t(t,e){var r,n=Object.keys(t);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(t),e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)),n}function r(n){for(var e=1;ee.length)&&(t=e.length);for(var r=0,n=new Array(t);ru.prec:r<=u.prec);)o=n.pop(),t=n.pop().value,c=n.pop(),e={type:l.BINARY_EXP,operator:t,left:c,right:o},n.push(e);(e=this.gobbleToken())||this.throwError("Expected expression after "+s),n.push(i,e)}for(e=n[a=n.length-1];1=t.length&&this.throwError("Unexpected token "+String.fromCharCode(e));break}if(i===l.COMMA_CODE){if(this.index++,++n!==t.length)if(e===l.CPAREN_CODE)this.throwError("Unexpected token ,");else if(e===l.CBRACK_CODE)for(var o=t.length;o":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10},right_associative:new Set,additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"}),v.max_unop_len=v.getMaxKeyLen(v.unary_ops),v.max_binop_len=v.getMaxKeyLen(v.binary_ops);var E=function(e){return new v(e).parse()};Object.getOwnPropertyNames(v).forEach(function(e){void 0===E[e]&&"prototype"!==e&&(E[e]=v[e])}),E.Jsep=v;b={name:"ternary",init:function(o){o.hooks.add("after-expression",function(e){if(e.node&&this.code===o.QUMARK_CODE){this.index++;var t=e.node,r=this.gobbleExpression();if(r||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===o.COLON_CODE){this.index++;var n=this.gobbleExpression();if(n||this.throwError("Expected expression"),e.node={type:"ConditionalExpression",test:t,consequent:r,alternate:n},t.operator&&o.binary_ops[t.operator]<=.9){for(var i=t;i.right.operator&&o.binary_ops[i.right.operator]<=.9;)i=i.right;e.node.test=i.right,i.right=e.node,e.node=t}}else this.throwError("Expected :")}})}};E.plugins.register(b);var b={name:"regex",init:function(s){s.hooks.add("gobble-token",function(e){if(47===this.code){for(var t=++this.index,r=!1;this.index>=",">>>=","&=","^=","|="]),updateOperators:[43,45],assignmentPrecedence:.9,init:function(t){var n=[t.IDENTIFIER,t.MEMBER_EXP];g.assignmentOperators.forEach(function(e){return t.addBinaryOp(e,g.assignmentPrecedence,!0)}),t.hooks.add("gobble-token",function(e){var t=this,r=this.code;g.updateOperators.some(function(e){return e===r&&e===t.expr.charCodeAt(t.index+1)})&&(this.index+=2,e.node={type:"UpdateExpression",operator:43===r?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},e.node.argument&&n.includes(e.node.argument.type)||this.throwError("Unexpected ".concat(e.node.operator)))}),t.hooks.add("after-token",function(e){var t,r=this;e.node&&(t=this.code,g.updateOperators.some(function(e){return e===t&&e===r.expr.charCodeAt(r.index+1)})&&(n.includes(e.node.type)||this.throwError("Unexpected ".concat(e.node.operator)),this.index+=2,e.node={type:"UpdateExpression",operator:43===t?"++":"--",argument:e.node,prefix:!1}))}),t.hooks.add("after-expression",function(e){e.node&&!function t(e){g.assignmentOperators.has(e.operator)?(e.type="AssignmentExpression",t(e.left),t(e.right)):e.operator||Object.values(e).forEach(function(e){e&&"object"===C(e)&&t(e)})}(e.node)})}},A=Object.prototype.hasOwnProperty;function w(e,t){return(e=e.slice()).push(t),e}function k(e,t){return(t=t.slice()).unshift(e),t}var x=function(){function r(e){var t;return s(this,r),(t=n(this,r,[\'JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)\'])).avoidNew=!0,t.value=e,t.name="NewError",t}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(r,p(Error)),c(r)}();function F(e,t,r,n,i){if(!(this instanceof F))try{return new F(e,t,r,n,i)}catch(e){if(!e.avoidNew)throw e;return e.value}"string"==typeof e&&(i=n,n=r,r=t,t=e,e=null);var o=e&&"object"===C(e);if(e=e||{},this.json=e.json||r,this.path=e.path||t,this.resultType=e.resultType||"value",this.flatten=e.flatten||!1,this.wrap=!A.call(e,"wrap")||e.wrap,this.sandbox=e.sandbox||{},this.eval=void 0===e.eval?"safe":e.eval,this.ignoreEvalErrors=void 0!==e.ignoreEvalErrors&&e.ignoreEvalErrors,this.parent=e.parent||null,this.parentProperty=e.parentProperty||null,this.callback=e.callback||n||null,this.otherTypeCallback=e.otherTypeCallback||i||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},!1!==e.autostart){var a={path:o?e.path:t};o?"json"in e&&(a.json=e.json):a.json=r;a=this.evaluate(a);if(!a||"object"!==C(a))throw new x(a);return a}}F.prototype.evaluate=function(e,t,r,n){var i=this,o=this.parent,a=this.parentProperty,s=this.flatten,u=this.wrap;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,r=r||this.callback,this.currOtherTypeCallback=n||this.otherTypeCallback,t=t||this.json,(e=e||this.path)&&"object"===C(e)&&!Array.isArray(e)){if(!e.path&&""!==e.path)throw new TypeError(\'You must supply a "path" property when providing an object argument to JSONPath.evaluate().\');if(!A.call(e,"json"))throw new TypeError(\'You must supply a "json" property when providing an object argument to JSONPath.evaluate().\');t=e.json,s=A.call(e,"flatten")?e.flatten:s,this.currResultType=A.call(e,"resultType")?e.resultType:this.currResultType,this.currSandbox=A.call(e,"sandbox")?e.sandbox:this.currSandbox,u=A.call(e,"wrap")?e.wrap:u,this.currEval=A.call(e,"eval")?e.eval:this.currEval,r=A.call(e,"callback")?e.callback:r,this.currOtherTypeCallback=A.call(e,"otherTypeCallback")?e.otherTypeCallback:this.currOtherTypeCallback,o=A.call(e,"parent")?e.parent:o,a=A.call(e,"parentProperty")?e.parentProperty:a,e=e.path}if(o=o||null,a=a||null,Array.isArray(e)&&(e=F.toPathString(e)),(e||""===e)&&t){e=F.toPathArray(e);"$"===e[0]&&1@-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])*)[\'\\[](\\??\\((?:[\\0-\\t\\x0B\\f\\x0E-\\u2027\\u202A-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])*?\\))(?!(?:[\\0-\\t\\x0B\\f\\x0E-\\u2027\\u202A-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])\\)\\])[\'\\]]/g.exec(f);d?this._walk(n,function(e){var t=[d[2]],r=d[1]?n[e][d[1]]:n[e];0=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:t}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,o=!0,a=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return o=e.done,e},e:function(e){a=!0,i=e},f:function(){try{o||null==r.return||r.return()}finally{if(a)throw i}}}}(c.split(","));try{for(E.s();!(g=E.n()).done;){var g=g.value;p(this._trace(k(g,l),n,i,o,a,s,!0))}}catch(e){E.e(e)}finally{E.f()}}else!r&&n&&A.call(n,c)&&p(this._trace(l,n[c],w(i,c),n,c,s,e,!0))}if(this._hasParentSelector)for(var x=0;x":function(e,t){return e>t()},"<=":function(e,t){return e<=t()},">=":function(e,t){return e>=t()},"<<":function(e,t){return e<>":function(e,t){return e>>t()},">>>":function(e,t){return e>>>t()},"+":function(e,t){return e+t()},"-":function(e,t){return e-t()},"*":function(e,t){return e*t()},"/":function(e,t){return e/t()},"%":function(e,t){return e%t()}}[e.operator](D.evalAst(e.left,t),function(){return D.evalAst(e.right,t)})},evalCompound:function(e,t){for(var r=0;r{function e(a){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(a)}!function(e){var a=Object.create(null);a.ftp=21,a.file=0,a.gopher=70,a.http=80,a.https=443,a.ws=80,a.wss=443;var t=Object.create(null);function r(e){return void 0!==a[e]}function c(){b.call(this),this._isInvalid=!0}function i(e){return""==e&&c.call(this),e.toLowerCase()}function n(e){var a=e.charCodeAt(0);return a>32&&a<127&&-1==[34,35,60,62,63,96].indexOf(a)?e:encodeURIComponent(e)}function f(e){var a=e.charCodeAt(0);return a>32&&a<127&&-1==[34,35,60,62,96].indexOf(a)?e:encodeURIComponent(e)}t["%2e"]=".",t[".%2e"]="..",t["%2e."]="..",t["%2e%2e"]="..";var d=void 0,u=/[a-zA-Z]/,o=/[a-zA-Z0-9\+\-\.]/;function s(e,s,b){function l(e){C.push(e)}var h=s||"scheme start",p=0,v="",D=!1,y=!1,C=[];e:for(;(e[p-1]!=d||0==p)&&!this._isInvalid;){var _=e[p];switch(h){case"scheme start":if(!_||!u.test(_)){if(s){l("Invalid scheme.");break e}v="",h="no scheme";continue}v+=_.toLowerCase(),h="scheme";break;case"scheme":if(_&&o.test(_))v+=_.toLowerCase();else{if(":"!=_){if(s){if(d==_)break e;l("Code point not allowed in scheme: "+_);break e}v="",p=0,h="no scheme";continue}if(this._scheme=v,v="",s)break e;r(this._scheme)&&(this._isRelative=!0),h="file"==this._scheme?"relative":this._isRelative&&b&&b._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==_?(this._query="?",h="query"):"#"==_?(this._fragment="#",h="fragment"):d!=_&&"\t"!=_&&"\n"!=_&&"\r"!=_&&(this._schemeData+=n(_));break;case"no scheme":if(b&&r(b._scheme)){h="relative";continue}l("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=_||"/"!=e[p+1]){l("Expected /, got: "+_),h="relative";continue}h="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=b._scheme),d==_){this._host=b._host,this._port=b._port,this._path=b._path.slice(),this._query=b._query,this._username=b._username,this._password=b._password;break e}if("/"==_||"\\"==_)"\\"==_&&l("\\ is an invalid code point."),h="relative slash";else if("?"==_)this._host=b._host,this._port=b._port,this._path=b._path.slice(),this._query="?",this._username=b._username,this._password=b._password,h="query";else{if("#"!=_){var g=e[p+1],m=e[p+2];("file"!=this._scheme||!u.test(_)||":"!=g&&"|"!=g||d!=m&&"/"!=m&&"\\"!=m&&"?"!=m&&"#"!=m)&&(this._host=b._host,this._port=b._port,this._username=b._username,this._password=b._password,this._path=b._path.slice(),this._path.pop()),h="relative path";continue}this._host=b._host,this._port=b._port,this._path=b._path.slice(),this._query=b._query,this._fragment="#",this._username=b._username,this._password=b._password,h="fragment"}break;case"relative slash":if("/"!=_&&"\\"!=_){"file"!=this._scheme&&(this._host=b._host,this._port=b._port,this._username=b._username,this._password=b._password),h="relative path";continue}"\\"==_&&l("\\ is an invalid code point."),h="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=_){l("Expected '/', got: "+_),h="authority ignore slashes";continue}h="authority second slash";break;case"authority second slash":if(h="authority ignore slashes","/"!=_){l("Expected '/', got: "+_);continue}break;case"authority ignore slashes":if("/"!=_&&"\\"!=_){h="authority";continue}l("Expected authority, got: "+_);break;case"authority":if("@"==_){D&&(l("@ already seen."),v+="%40"),D=!0;for(var A=0;A{t(642)(t(321))},481:e=>{e.exports='(function(root,factory){if(typeof exports==="object"){module.exports=exports=factory()}else if(typeof define==="function"&&define.amd){define([],factory)}else{globalThis.gbkTool=factory()}})(this,function(){var data=function(zipData){var re=zipData.replace(/#(\\d+)\\$/g,function(a,b){return Array(+b+3).join("#")}).replace(/#/g,"####").replace(/(\\w\\w):([\\w#]+)(?:,|$)/g,function(a,hd,dt){return dt.replace(/../g,function(a){if(a!="##"){return hd+a}else{return a}})});return re}("4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364"),U2Ghash={},G2Uhash={};!function(data){var k=0;data=data.match(/..../g);for(var i=129;i<=254;i++){for(var j=64;j<=254;j++){U2Ghash[data[k++]]=("%"+i.toString(16)+"%"+j.toString(16)).toUpperCase()}}for(var key in U2Ghash){G2Uhash[U2Ghash[key]]=key}}(data);function isAscii(unicode){return unicode==8364||unicode<=127&&unicode>=0}return{encode:function(str){return str.replace(/./g,function(a){var code=a.charCodeAt(0);if(isAscii(code)){return encodeURIComponent(a)}else{var key=code.toString(16);if(key.length!=4)key=("000"+key).match(/....$/)[0];return U2Ghash[key]||a}})},decode:function(str){return str.replace(/%[0-9A-F]{2}%[0-9A-F]{2}/g,function(a){if(a in G2Uhash){return String.fromCharCode("0x"+G2Uhash[a])}else{return a}}).replace(/%[\\w]{2}/g,function(a){return decodeURIComponent(a)})}}});'},536:(e,a,t)=>{t(642)(t(145))},642:e=>{e.exports=function(e){function a(e){"undefined"!=typeof console&&(console.error||console.log)("[Script Loader]",e)}try{"undefined"!=typeof execScript&&function t(){return"undefined"!=typeof attachEvent&&"undefined"==typeof addEventListener}()?execScript(e):"undefined"!=typeof eval?eval.call(null,e):a("EvalError: No eval function available")}catch(e){a(e)}}},740:(e,a,t)=>{t(642)(t(481))},761:e=>{e.exports='(function(root,factory){if(typeof exports==="object"){module.exports=exports=factory()}else if(typeof define==="function"&&define.amd){define([],factory)}else{globalThis.WXXH=factory()}})(this,function(){const t=new Uint8Array([0,97,115,109,1,0,0,0,1,48,8,96,3,127,127,127,1,127,96,3,127,127,127,0,96,2,127,127,0,96,1,127,1,127,96,3,127,127,126,1,126,96,3,126,127,127,1,126,96,2,127,126,0,96,1,127,1,126,3,11,10,0,0,2,1,3,4,5,6,1,7,5,3,1,0,1,7,85,9,3,109,101,109,2,0,5,120,120,104,51,50,0,0,6,105,110,105,116,51,50,0,2,8,117,112,100,97,116,101,51,50,0,3,8,100,105,103,101,115,116,51,50,0,4,5,120,120,104,54,52,0,5,6,105,110,105,116,54,52,0,7,8,117,112,100,97,116,101,54,52,0,8,8,100,105,103,101,115,116,54,52,0,9,10,251,22,10,242,1,1,4,127,32,0,32,1,106,33,3,32,1,65,16,79,4,127,32,3,65,16,107,33,6,32,2,65,168,136,141,161,2,106,33,3,32,2,65,137,235,208,208,7,107,33,4,32,2,65,207,140,162,142,6,106,33,5,3,64,32,3,32,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,3,32,4,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,4,32,2,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,2,32,5,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,5,32,6,32,0,65,4,106,34,0,79,13,0,11,32,2,65,12,119,32,5,65,18,119,106,32,4,65,7,119,106,32,3,65,1,119,106,5,32,2,65,177,207,217,178,1,106,11,32,1,106,32,0,32,1,65,15,113,16,1,11,146,1,0,32,1,32,2,106,33,2,3,64,32,1,65,4,106,32,2,75,69,4,64,32,0,32,1,40,2,0,65,189,220,202,149,124,108,106,65,17,119,65,175,214,211,190,2,108,33,0,32,1,65,4,106,33,1,12,1,11,11,3,64,32,1,32,2,79,69,4,64,32,0,32,1,45,0,0,65,177,207,217,178,1,108,106,65,11,119,65,177,243,221,241,121,108,33,0,32,1,65,1,106,33,1,12,1,11,11,32,0,32,0,65,15,118,115,65,247,148,175,175,120,108,34,0,65,13,118,32,0,115,65,189,220,202,149,124,108,34,0,65,16,118,32,0,115,11,63,0,32,0,65,8,106,32,1,65,168,136,141,161,2,106,54,2,0,32,0,65,12,106,32,1,65,137,235,208,208,7,107,54,2,0,32,0,65,16,106,32,1,54,2,0,32,0,65,20,106,32,1,65,207,140,162,142,6,106,54,2,0,11,195,4,1,6,127,32,1,32,2,106,33,6,32,0,65,24,106,33,4,32,0,65,40,106,40,2,0,33,3,32,0,32,0,40,2,0,32,2,106,54,2,0,32,0,65,4,106,34,5,32,5,40,2,0,32,2,65,16,79,32,0,40,2,0,65,16,79,114,114,54,2,0,32,2,32,3,106,65,16,73,4,64,32,3,32,4,106,32,1,32,2,252,10,0,0,32,0,65,40,106,32,2,32,3,106,54,2,0,15,11,32,3,4,64,32,3,32,4,106,32,1,65,16,32,3,107,34,2,252,10,0,0,32,0,65,8,106,34,3,32,3,40,2,0,32,4,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,12,106,34,3,32,3,40,2,0,32,4,65,4,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,16,106,34,3,32,3,40,2,0,32,4,65,8,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,20,106,34,3,32,3,40,2,0,32,4,65,12,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,40,106,65,0,54,2,0,32,1,32,2,106,33,1,11,32,1,32,6,65,16,107,77,4,64,32,6,65,16,107,33,8,32,0,65,8,106,40,2,0,33,2,32,0,65,12,106,40,2,0,33,3,32,0,65,16,106,40,2,0,33,5,32,0,65,20,106,40,2,0,33,7,3,64,32,2,32,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,2,32,3,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,3,32,5,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,5,32,7,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,7,32,8,32,1,65,4,106,34,1,79,13,0,11,32,0,65,8,106,32,2,54,2,0,32,0,65,12,106,32,3,54,2,0,32,0,65,16,106,32,5,54,2,0,32,0,65,20,106,32,7,54,2,0,11,32,1,32,6,73,4,64,32,4,32,1,32,6,32,1,107,34,1,252,10,0,0,32,0,65,40,106,32,1,54,2,0,11,11,97,1,1,127,32,0,65,16,106,40,2,0,33,1,32,0,65,4,106,40,2,0,4,127,32,1,65,12,119,32,0,65,20,106,40,2,0,65,18,119,106,32,0,65,12,106,40,2,0,65,7,119,106,32,0,65,8,106,40,2,0,65,1,119,106,5,32,1,65,177,207,217,178,1,106,11,32,0,40,2,0,106,32,0,65,24,106,32,0,65,40,106,40,2,0,16,1,11,255,3,2,3,126,1,127,32,0,32,1,106,33,6,32,1,65,32,79,4,126,32,6,65,32,107,33,6,32,2,66,214,235,130,238,234,253,137,245,224,0,124,33,3,32,2,66,177,169,172,193,173,184,212,166,61,125,33,4,32,2,66,249,234,208,208,231,201,161,228,225,0,124,33,5,3,64,32,3,32,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,3,32,4,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,4,32,2,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,2,32,5,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,5,32,6,32,0,65,8,106,34,0,79,13,0,11,32,2,66,12,137,32,5,66,18,137,124,32,4,66,7,137,124,32,3,66,1,137,124,32,3,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,4,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,2,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,5,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,5,32,2,66,197,207,217,178,241,229,186,234,39,124,11,32,1,173,124,32,0,32,1,65,31,113,16,6,11,134,2,0,32,1,32,2,106,33,2,3,64,32,2,32,1,65,8,106,79,4,64,32,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,32,0,133,66,27,137,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,33,0,32,1,65,8,106,33,1,12,1,11,11,32,1,65,4,106,32,2,77,4,64,32,0,32,1,53,2,0,66,135,149,175,175,152,182,222,155,158,127,126,133,66,23,137,66,207,214,211,190,210,199,171,217,66,126,66,249,243,221,241,153,246,153,171,22,124,33,0,32,1,65,4,106,33,1,11,3,64,32,1,32,2,73,4,64,32,0,32,1,49,0,0,66,197,207,217,178,241,229,186,234,39,126,133,66,11,137,66,135,149,175,175,152,182,222,155,158,127,126,33,0,32,1,65,1,106,33,1,12,1,11,11,32,0,32,0,66,33,136,133,66,207,214,211,190,210,199,171,217,66,126,34,0,32,0,66,29,136,133,66,249,243,221,241,153,246,153,171,22,126,34,0,32,0,66,32,136,133,11,77,0,32,0,65,8,106,32,1,66,214,235,130,238,234,253,137,245,224,0,124,55,3,0,32,0,65,16,106,32,1,66,177,169,172,193,173,184,212,166,61,125,55,3,0,32,0,65,24,106,32,1,55,3,0,32,0,65,32,106,32,1,66,249,234,208,208,231,201,161,228,225,0,124,55,3,0,11,244,4,2,3,127,4,126,32,1,32,2,106,33,5,32,0,65,40,106,33,4,32,0,65,200,0,106,40,2,0,33,3,32,0,32,0,41,3,0,32,2,173,124,55,3,0,32,2,32,3,106,65,32,73,4,64,32,3,32,4,106,32,1,32,2,252,10,0,0,32,0,65,200,0,106,32,2,32,3,106,54,2,0,15,11,32,3,4,64,32,3,32,4,106,32,1,65,32,32,3,107,34,2,252,10,0,0,32,0,65,8,106,34,3,32,3,41,3,0,32,4,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,16,106,34,3,32,3,41,3,0,32,4,65,8,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,24,106,34,3,32,3,41,3,0,32,4,65,16,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,32,106,34,3,32,3,41,3,0,32,4,65,24,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,200,0,106,65,0,54,2,0,32,1,32,2,106,33,1,11,32,1,65,32,106,32,5,77,4,64,32,5,65,32,107,33,2,32,0,65,8,106,41,3,0,33,6,32,0,65,16,106,41,3,0,33,7,32,0,65,24,106,41,3,0,33,8,32,0,65,32,106,41,3,0,33,9,3,64,32,6,32,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,6,32,7,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,7,32,8,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,8,32,9,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,9,32,2,32,1,65,8,106,34,1,79,13,0,11,32,0,65,8,106,32,6,55,3,0,32,0,65,16,106,32,7,55,3,0,32,0,65,24,106,32,8,55,3,0,32,0,65,32,106,32,9,55,3,0,11,32,1,32,5,73,4,64,32,4,32,1,32,5,32,1,107,34,1,252,10,0,0,32,0,65,200,0,106,32,1,54,2,0,11,11,188,2,1,5,126,32,0,65,24,106,41,3,0,33,1,32,0,41,3,0,34,2,66,32,90,4,126,32,0,65,8,106,41,3,0,34,3,66,1,137,32,0,65,16,106,41,3,0,34,4,66,7,137,124,32,1,66,12,137,32,0,65,32,106,41,3,0,34,5,66,18,137,124,124,32,3,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,4,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,1,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,5,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,5,32,1,66,197,207,217,178,241,229,186,234,39,124,11,32,2,124,32,0,65,40,106,32,2,66,31,131,167,16,6,11]);function e(){return function(t){const{exports:{mem:e,xxh32:n,xxh64:r,init32:i,update32:a,digest32:o,init64:s,update64:u,digest64:c}}=t;let h=new Uint8Array(e.buffer);function g(t,n){if(e.buffer.byteLength(h.set(o),a(i(0)))}}function y(t){return t>>>0}const b=2n**64n-1n;function d(t){return t&b}const w=new TextEncoder,l=0,p=0n;function x(t,e=l){return g(3*t.length,0),y(n(0,w.encodeInto(t,h).written,e))}function L(t,e=p){return g(3*t.length,0),d(r(0,w.encodeInto(t,h).written,e))}return{h32:x,h32ToString:(t,e=l)=>x(t,e).toString(16).padStart(8,"0"),h32Raw:(t,e=l)=>(g(t.byteLength,0),h.set(t),y(n(0,t.byteLength,e))),create32:(t=l)=>f(48,t,i,a,o,y),h64:L,h64ToString:(t,e=p)=>L(t,e).toString(16).padStart(16,"0"),h64Raw:(t,e=p)=>(g(t.byteLength,0),h.set(t),d(r(0,t.byteLength,e))),create64:(t=p)=>f(88,t,s,u,c,d)}}(new WebAssembly.Instance(new WebAssembly.Module(t)))}return e()});'},762:(e,a,t)=>{t(642)(t(27))},815:(e,a,t)=>{t(642)(t(842))},842:e=>{e.exports='(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?factory(exports):typeof define==="function"&&define.amd?define(["exports"],factory):(global=typeof globalThis!=="undefined"?globalThis:global||self,factory(global.jinja={}))})(this,function(jinja){"use strict";var STRINGS=/\'(\\\\.|[^\'])*\'|"(\\\\.|[^"\'"])*"/g;var IDENTS_AND_NUMS=/([$_a-z][$\\w]*)|([+-]?\\d+(\\.\\d+)?)/g;var NUMBER=/^[+-]?\\d+(\\.\\d+)?$/;var NON_PRIMITIVES=/\\[[@#~](,[@#~])*\\]|\\[\\]|\\{([@i]:[@#~])(,[@i]:[@#~])*\\}|\\{\\}/g;var IDENTIFIERS=/[$_a-z][$\\w]*/gi;var VARIABLES=/i(\\.i|\\[[@#i]\\])*/g;var ACCESSOR=/(\\.i|\\[[@#i]\\])/g;var OPERATORS=/(===?|!==?|>=?|<=?|&&|\\|\\||[+\\-\\*\\/%])/g;var EOPS=/(^|[^$\\w])(and|or|not|is|isnot)([^$\\w]|$)/g;var LEADING_SPACE=/^\\s+/;var TRAILING_SPACE=/\\s+$/;var START_TOKEN=/\\{\\{\\{|\\{\\{|\\{%|\\{#/;var TAGS={"{{{":/^(\'(\\\\.|[^\'])*\'|"(\\\\.|[^"\'"])*"|.)+?\\}\\}\\}/,"{{":/^(\'(\\\\.|[^\'])*\'|"(\\\\.|[^"\'"])*"|.)+?\\}\\}/,"{%":/^(\'(\\\\.|[^\'])*\'|"(\\\\.|[^"\'"])*"|.)+?%\\}/,"{#":/^(\'(\\\\.|[^\'])*\'|"(\\\\.|[^"\'"])*"|.)+?#\\}/};var delimeters={"{%":"directive","{{":"output","{#":"comment"};var operators={and:"&&",or:"||",not:"!",is:"==",isnot:"!="};var constants={true:true,false:false,null:null};function Parser(){this.nest=[];this.compiled=[];this.childBlocks=0;this.parentBlocks=0;this.isSilent=false}Parser.prototype.push=function(line){if(!this.isSilent){this.compiled.push(line)}};Parser.prototype.parse=function(src){this.tokenize(src);return this.compiled};Parser.prototype.tokenize=function(src){var lastEnd=0,parser=this,trimLeading=false;matchAll(src,START_TOKEN,function(open,index,src){var match=src.slice(index+open.length).match(TAGS[open]);match=match?match[0]:"";var simplified=match.replace(STRINGS,"@");if(!match||~simplified.indexOf(open)){return index+1}var inner=match.slice(0,0-open.length);if(inner.charAt(0)==="-")var wsCollapseLeft=true;if(inner.slice(-1)==="-")var wsCollapseRight=true;inner=inner.replace(/^-|-$/g,"").trim();if(parser.rawMode&&open+inner!=="{%endraw"){return index+1}var text=src.slice(lastEnd,index);lastEnd=index+open.length+match.length;if(trimLeading)text=trimLeft(text);if(wsCollapseLeft)text=trimRight(text);if(wsCollapseRight)trimLeading=true;if(open==="{{{"){open="{{";inner+="|safe"}parser.textHandler(text);parser.tokenHandler(open,inner)});var text=src.slice(lastEnd);if(trimLeading)text=trimLeft(text);this.textHandler(text)};Parser.prototype.textHandler=function(text){this.push("write("+JSON.stringify(text)+");")};Parser.prototype.tokenHandler=function(open,inner){var type=delimeters[open];if(type==="directive"){this.compileTag(inner)}else if(type==="output"){var extracted=this.extractEnt(inner,STRINGS,"@");extracted.src=extracted.src.replace(/\\|\\|/g,"~").split("|");extracted.src=extracted.src.map(function(part){return part.split("~").join("||")});var parts=this.injectEnt(extracted,"@");if(parts.length>1){var filters=parts.slice(1).map(this.parseFilter.bind(this));this.push("filter("+this.parseExpr(parts[0])+","+filters.join(",")+");")}else{this.push("filter("+this.parseExpr(parts[0])+");")}}};Parser.prototype.compileTag=function(str){var directive=str.split(" ")[0];var handler=tagHandlers[directive];if(!handler){throw new Error("Invalid tag: "+str)}handler.call(this,str.slice(directive.length).trim())};Parser.prototype.parseFilter=function(src){src=src.trim();var match=src.match(/[:(]/);var i=match?match.index:-1;if(i<0)return JSON.stringify([src]);var name=src.slice(0,i);var args=src.charAt(i)===":"?src.slice(i+1):src.slice(i+1,-1);args=this.parseExpr(args,{terms:true});return"["+JSON.stringify(name)+","+args+"]"};Parser.prototype.extractEnt=function(src,regex,placeholder){var subs=[],isFunc=typeof placeholder=="function";src=src.replace(regex,function(str){var replacement=isFunc?placeholder(str):placeholder;if(replacement){subs.push(str);return replacement}return str});return{src:src,subs:subs}};Parser.prototype.injectEnt=function(extracted,placeholder){var src=extracted.src,subs=extracted.subs,isArr=Array.isArray(src);var arr=isArr?src:[src];var re=new RegExp("["+placeholder+"]","g"),i=0;arr.forEach(function(src,index){arr[index]=src.replace(re,function(){return subs[i++]})});return isArr?arr:arr[0]};Parser.prototype.replaceComplex=function(s){var parsed=this.extractEnt(s,/i(\\.i|\\[[@#i]\\])+/g,"v");parsed.src=parsed.src.replace(NON_PRIMITIVES,"~");return this.injectEnt(parsed,"v")};Parser.prototype.parseExpr=function(src,opts){opts=opts||{};var parsed1=this.extractEnt(src,STRINGS,"@");parsed1.src=parsed1.src.replace(EOPS,function(s,before,op,after){return op in operators?before+operators[op]+after:s});var parsed2=this.extractEnt(parsed1.src,IDENTS_AND_NUMS,function(s){return s in constants||NUMBER.test(s)?"#":null});var parsed3=this.extractEnt(parsed2.src,IDENTIFIERS,"i");parsed3.src=parsed3.src.replace(/\\s+/g,"");var simplified=parsed3.src;while(simplified!==(simplified=this.replaceComplex(simplified)));while(simplified!==(simplified=simplified.replace(/i(\\.i|\\[[@#i]\\])+/,"v")));simplified=simplified.replace(/[iv]\\[v?\\]/g,"x");simplified=simplified.replace(/[@#~v]/g,"i");simplified=simplified.replace(OPERATORS,"%");simplified=simplified.replace(/!+[i]/g,"i");var terms=opts.terms?simplified.split(","):[simplified];terms.forEach(function(term){while(term!==(term=term.replace(/\\(i(%i)*\\)/g,"i")));if(!term.match(/^i(%i)*/)){throw new Error("Invalid expression: "+src+" "+term)}});parsed3.src=parsed3.src.replace(VARIABLES,this.parseVar.bind(this));parsed2.src=this.injectEnt(parsed3,"i");parsed1.src=this.injectEnt(parsed2,"#");return this.injectEnt(parsed1,"@")};Parser.prototype.parseVar=function(src){var args=Array.prototype.slice.call(arguments);var str=args.pop(),index=args.pop();if(src==="i"&&str.charAt(index+1)===":"){return\'"i"\'}var parts=[\'"i"\'];src.replace(ACCESSOR,function(part){if(part===".i"){parts.push(\'"i"\')}else if(part==="[i]"){parts.push(\'get("i")\')}else{parts.push(part.slice(1,-1))}});return"get("+parts.join(",")+")"};Parser.prototype.escName=function(str){return str.replace(/\\W/g,function(s){return"$"+s.charCodeAt(0).toString(16)})};Parser.prototype.parseQuoted=function(str){if(str.charAt(0)==="\'"){str=str.slice(1,-1).replace(/\\\\.|"/,function(s){if(s==="\\\\\'")return"\'";return s.charAt(0)==="\\\\"?s:"\\\\"+s});str=\'"\'+str+\'"\'}return JSON.parse(str)};var tagHandlers={if:function(expr){this.push("if ("+this.parseExpr(expr)+") {");this.nest.unshift("if")},else:function(){if(this.nest[0]==="for"){this.push("}, function() {")}else{this.push("} else {")}},elseif:function(expr){this.push("} else if ("+this.parseExpr(expr)+") {")},endif:function(){this.nest.shift();this.push("}")},for:function(str){var i=str.indexOf(" in ");var name=str.slice(0,i).trim();var expr=str.slice(i+4).trim();this.push("each("+this.parseExpr(expr)+","+JSON.stringify(name)+",function() {");this.nest.unshift("for")},endfor:function(){this.nest.shift();this.push("});")},raw:function(){this.rawMode=true},endraw:function(){this.rawMode=false},set:function(stmt){var i=stmt.indexOf("=");var name=stmt.slice(0,i).trim();var expr=stmt.slice(i+1).trim();this.push("set("+JSON.stringify(name)+","+this.parseExpr(expr)+");")},block:function(name){if(this.isParent){++this.parentBlocks;var blockName="block_"+(this.escName(name)||this.parentBlocks);this.push("block(typeof "+blockName+\' == "function" ? \'+blockName+" : function() {")}else if(this.hasParent){this.isSilent=false;++this.childBlocks;blockName="block_"+(this.escName(name)||this.childBlocks);this.push("function "+blockName+"() {")}this.nest.unshift("block")},endblock:function(){this.nest.shift();if(this.isParent){this.push("});")}else if(this.hasParent){this.push("}");this.isSilent=true}},extends:function(name){name=this.parseQuoted(name);var parentSrc=this.readTemplateFile(name);this.isParent=true;this.tokenize(parentSrc);this.isParent=false;this.hasParent=true;this.isSilent=true},include:function(name){name=this.parseQuoted(name);var incSrc=this.readTemplateFile(name);this.isInclude=true;this.tokenize(incSrc);this.isInclude=false}};tagHandlers.assign=tagHandlers.set;tagHandlers.elif=tagHandlers.elseif;var getRuntime=function runtime(data,opts){var defaults={autoEscape:"toJson"};var _toString=Object.prototype.toString;var _hasOwnProperty=Object.prototype.hasOwnProperty;var getKeys=Object.keys||function(obj){var keys=[];for(var n in obj)if(_hasOwnProperty.call(obj,n))keys.push(n);return keys};var isArray=Array.isArray||function(obj){return _toString.call(obj)==="[object Array]"};var create=Object.create||function(obj){function F(){}F.prototype=obj;return new F};var toString=function(val){if(val==null)return"";return typeof val.toString=="function"?val.toString():_toString.call(val)};var extend=function(dest,src){var keys=getKeys(src);for(var i=0,len=keys.length;i").join(">").split(\'"\').join(""")},safe:function(val){return val},toJson:function(val){if(typeof val==="object"){return JSON.stringify(val)}return toString(val)}},opts.filters||{});var stack=[create(data||{})],output=[];return{get:get,set:set,push:push,pop:pop,write:write,filter:filter,each:each,block:block,render:render}};var runtime;jinja.compile=function(markup,opts){opts=opts||{};var parser=new Parser;parser.readTemplateFile=this.readTemplateFile;var code=[];code.push("function render($) {");code.push("var get = $.get, set = $.set, push = $.push, pop = $.pop, write = $.write, filter = $.filter, each = $.each, block = $.block;");code.push.apply(code,parser.parse(markup));code.push("return $.render();");code.push("}");code=code.join("\\n");if(opts.runtime===false){var fn=new Function("data","options","return ("+code+")(runtime(data, options))")}else{runtime=runtime||(runtime=getRuntime.toString());fn=new Function("data","options","return ("+code+")(("+runtime+")(data, options))")}return{render:fn}};jinja.render=function(markup,data,opts){var tmpl=jinja.compile(markup);return tmpl.render(data,opts)};jinja.templateFiles=[];jinja.readTemplateFile=function(name){var templateFiles=this.templateFiles||[];var templateFile=templateFiles[name];if(templateFile==null){throw new Error("Template file not found: "+name)}return templateFile};function trimLeft(str){return str.replace(LEADING_SPACE,"")}function trimRight(str){return str.replace(TRAILING_SPACE,"")}function matchAll(str,reg,fn){reg=new RegExp(reg.source,"g"+(reg.ignoreCase?"i":"")+(reg.multiline?"m":""));var match;while(match=reg.exec(str)){var result=fn(match[0],match.index,str);if(typeof result=="number"){reg.lastIndex=result}}}});'},983:()=>{function e(a){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(a)}function a(e,a){if(!(e instanceof a))throw new TypeError("Cannot call a class as a function")}function t(e,a){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:":memory:",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{create:!0,readOnly:!1};a(this,e);var c=0;r.create&&(c|=n.SQLITE_OPEN_CREATE),r.readOnly?c|=n.SQLITE_OPEN_READONLY:c|=n.SQLITE_OPEN_READWRITE,this[f]=n.open(t,c)},[{key:"close",value:function e(){var a=!1;return this[f]&&(a=n.close(this[f]),this[f]=null),a}},{key:"exec",value:function e(a){if(!this[f])throw new Error("Invalid DB");return n.exec(this[f],a)}},{key:"prepare",value:function e(a){if(!this[f])throw new Error("Invalid DB");return new b(n.prepare(this[f],a))}},{key:"inTransaction",get:function e(){return!!this[f]&&n.in_transaction(this[f])}},{key:"transaction",value:function e(a){if("function"!=typeof a)throw new TypeError("Expected first argument to be a function");var t=this,r=u(t),c={default:{value:o(a,t,r.default)},deferred:{value:o(a,t,r.deferred)},immediate:{value:o(a,t,r.immediate)},exclusive:{value:o(a,t,r.exclusive)}};return Object.defineProperties(c.default.value,c),Object.defineProperties(c.deferred.value,c),Object.defineProperties(c.immediate.value,c),Object.defineProperties(c.exclusive.value,c),c.default.value}},{key:"loadExtension",value:function e(a){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;return n.load_extension(this[f],a,t)}}])}(),u=function e(a){var t=(i||(i=new WeakMap)).get(a);if(!t){var r={commit:a.prepare("COMMIT"),rollback:a.prepare("ROLLBACK"),savepoint:a.prepare("SAVEPOINT `\t_bs3.\t`"),release:a.prepare("RELEASE `\t_bs3.\t`"),rollbackTo:a.prepare("ROLLBACK TO `\t_bs3.\t`")};t={default:Object.assign({begin:a.prepare("BEGIN")},r),deferred:Object.assign({begin:a.prepare("BEGIN DEFERRED")},r),immediate:Object.assign({begin:a.prepare("BEGIN IMMEDIATE")},r),exclusive:Object.assign({begin:a.prepare("BEGIN EXCLUSIVE")},r)},i.set(a,t)}return t},o=function e(a,t,r){var c=r.begin,i=r.commit,n=r.rollback,f=r.savepoint,d=r.release,u=r.rollbackTo;return function e(){var r,o,s;t.inTransaction?(r=f,o=d,s=u):(r=c,o=i,s=n);try{r.run();var b=Function.prototype.apply.call(a,this,arguments);return o.run(),b}catch(e){throw t.inTransaction&&(s.run(),s!==n&&o.run()),e}}},s=Symbol("kSqlite3Stmt"),b=function(){return r(function e(t){a(this,e),this[s]=t},[{key:"finalize",value:function e(){return n.stmt_finalize(this[s])}},{key:"toString",value:function e(){return n.stmt_expand(this[s])}},{key:"all",value:function a(){for(var t=arguments.length,r=new Array(t),c=0;c + + + + + 下载 {{projectName}} + + + +
+

{{projectName}} 下载中心

+ +
+ 历史文件管理 +
+ + +
+
+ +
链接已复制到剪贴板
+ +
+ {{downloadItems}} +
+
+ + + + diff --git a/public/drpy/drpy2-fast.min.js b/public/drpy/drpy2-fast.min.js new file mode 100644 index 00000000..8d397161 --- /dev/null +++ b/public/drpy/drpy2-fast.min.js @@ -0,0 +1,102 @@ +import{cheerio,模板}from"../dist/drpy-core-fast.min.js";let vercode=typeof pdfl==="function"?"drpy2.1":"drpy2";const VERSION=vercode+" 3.9.54 20260117";const UpdateInfo=[{date:"20260117",title:"爱佬新So测试版,使用drpy-core-fast.min.js",version:"3.9.54 20260117",msg:` +drpy-core-fast.min.js内置了url和sqlite模块 + `},{date:"20251007",title:"爱佬新So测试版,使用drpy-core-lite.min.js,内置了Buffer库",version:"3.9.53 20251007",msg:` +drpy-core-lite.min.js 内置Buffer库 +gzip和ungzip改为新so的zlib实现 +内置RSA对象加解密效率提升 + + `},{date:"20250801",title:"drpy依赖更新,使用drpy-core-lite.min.js",version:"3.9.52beta3 20250801",msg:` +drpy-core.min.js 更换为更小的drpy-core-lite.min.js + + `},{date:"20250729",title:"drpy更新,所有依赖打包成一个js文件",version:"3.9.52beta2 20250729",msg:` + 1. wasm支持 + 2. 引入 TextEncoder、TextDecoder对象 + 3. 引入 WXXH 加解密库 + 4. 所有依赖打包成一个js + 5. 增加 buildQueryString + + `},{date:"20250728",title:"drpy更新,增加tab_order线路模糊排序,优化解密算法支持文件头",version:"3.9.52beta1 20250728",msg:` + 1. 增加tab_order线路模糊排序 + 2. 优化解密算法支持文件头 + 3. wasm支持 + 4. 增加 removeHeader 函数可用于清除js/py文件的头信息及所有头注释 + 5. 引入 TextEncoder、TextDecoder对象 + 6. 引入 WXXH 加解密库 + `},{date:"20241126",title:"drpy更新,优化去广告算法",version:"3.9.51beta6 20241126",msg:` + 1. 更新龙头大佬提供的去广告算法 + `},{date:"20241104",title:"drpy更新,增加新特性",version:"3.9.51beta5 20241104",msg:` + 1. rule增加 搜索验证标识 属性,可以不定义,默认为 '系统安全验证|请输入验证码' + 2. rule增加 searchNoPage 属性,可以不定义,如果定义 1 将关闭该源的搜索翻页功能,超过1页直接返回空 + `}];function getUpdateInfo(){return UpdateInfo.map(_o=>{_o.msg=_o.msg.trim().split("\n").map(_it=>_it.trim()).join("\n");return _o})}function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log("本地代理地址:"+getProxyUrl());console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function ocr_demo_test(){let img_base64=`iVBORw0KGgoAAAANSUhEUgAAAIAAAAAoBAMAAADEX+97AAAAG1BMVEXz+/4thQTa7N6QwIFFkyNeokKozqDB3b93sWHFR+MEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABN0lEQVRIie2TQU+DQBCFt9vScvQpxR4xrcSjJCZ67JDGXsX+AdR4B3vpsSYm/m2HXaRLmuySepR3Gdidb/btDAjRq5dT96eCMlfBuzi1QLZUoZy2yz5sOvI+9iomaPEZ6nWnEtxqIyiM1RcAy44GNDhBXUjot/VVNweV1ah68FqWRyjKIOqAcyYF6rGcmpYnHzGt3fycNoMw0d3/THFu7hFSJ/8OXO6iTM8/KSg09obAzIHLO250LgQ0txOZSfgrV4Exdw98uGycJ0ErAeExZGhOmFHV9zHO6qVSj0MpLq7xZON56o++MjlsEgfVhbQWWME+xQX7J4V6zfi9A1Ly9rP1BvEXp+BbVJ/M77n+wfOIDVp51pZ4iBxvmj9AGrtvry6emwfKnVkW+ZRKd5ZNMvob36vXP9YPDmQki8QiCFAAAAAASUVORK5CYII=`;OcrApi.api=OCR_API;let code=OcrApi.classification(img_base64);log("测试验证码图片的ocr识别结果为:"+code)}function rsa_demo_test(){let t1=(new Date).getTime();let pkcs1_public=` +-----BEGIN RSA PUBLIC KEY----- +MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy +lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE= +-----END RSA PUBLIC KEY----- +`.trim();let pkcs1_public_pem=` +MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy +lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE= +`.trim();let pkcs8_public=` +-----BEGIN PUBLIC KEY----- +MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/ +nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ== +-----END PUBLIC KEY-----`.trim();let pkcs8_public_pem=` +MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/ +nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ== +`.trim();let pkcs1_private=` +-----BEGIN RSA PRIVATE KEY----- +MIIBOAIBAAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/nas61fIPGUUrkPenokm7 +ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQI/b6OV1z65UokQaMvSeRXt +0Yv6wiYtduQI9qpq5nzy/ytaqsbBfClNTi/HifKPKxlRouWFkc518EQI8LBxoarJ +AiEA4DaONMplV8PQNa3TKn2F+SDEvLOCjdL0kHKdN90Ti28CIQDDZnTBaHgZwZbA +hS7Bbf5yvwjWMhO6Y7l04/Qm7R+35QIgPuQuqXIoUSD080mp1N5WyRW++atksIF+ +5lGv9e6GP/MCICnj8y/rl6Pd7tXDN6zcSeqLrfdNsREKhB3dKOCXgW9JAiAFYtFS +EJNBXVRTK42SNsZ2hJ/9xLwOwnH2epT8Q43s3Q== +-----END RSA PRIVATE KEY----- +`.trim();let pkcs8_private=` +-----BEGIN PRIVATE KEY----- +MIIBUgIBADANBgkqhkiG9w0BAQEFAASCATwwggE4AgEAAkEAqyNKUPxEUaSdzrtf +dFyXnRavOOpw2D+dqzrV8g8ZRSuQ96eiSbtkcLCsMpbEPcWNMWD6UWVGSjBHke3v +YJkTSwIDAQABAj9vo5XXPrlSiRBoy9J5Fe3Ri/rCJi125Aj2qmrmfPL/K1qqxsF8 +KU1OL8eJ8o8rGVGi5YWRznXwRAjwsHGhqskCIQDgNo40ymVXw9A1rdMqfYX5IMS8 +s4KN0vSQcp033ROLbwIhAMNmdMFoeBnBlsCFLsFt/nK/CNYyE7pjuXTj9CbtH7fl +AiA+5C6pcihRIPTzSanU3lbJFb75q2SwgX7mUa/17oY/8wIgKePzL+uXo93u1cM3 +rNxJ6out902xEQqEHd0o4JeBb0kCIAVi0VIQk0FdVFMrjZI2xnaEn/3EvA7CcfZ6 +lPxDjezd +-----END PRIVATE KEY----- +`.trim();let data=` +NodeRsa +这是node-rsa 现在修改集成在drpy里使用`.trim();let encryptedWithPublic=NODERSA.encryptRSAWithPublicKey(data,pkcs1_public,{outputEncoding:"base64",options:{environment:"browser",encryptionScheme:"pkcs1_oaep"}});console.log("公钥加密");console.log(encryptedWithPublic);let decryptedWithPrivate=NODERSA.decryptRSAWithPrivateKey(encryptedWithPublic,pkcs1_private,{options:{environment:"browser",encryptionScheme:"pkcs1_oaep"}});console.log("私钥解密");console.log(decryptedWithPrivate);let pkcs1_sha256_sign=NODERSA.sign("1",pkcs1_private,{outputEncoding:"base64",options:{environment:"browser",encryptionScheme:"pkcs1",signingScheme:"pkcs1-sha256"}});console.log("pkcs1_sha256_sign");console.log(pkcs1_sha256_sign);let pkcs1_sha256_sign_verify=NODERSA.verify("1","Oulx2QrgeipKYBtqEDqFb2s/+ndk2cGQxO4CkhU7iBM1vyNmmvqubpsmeoUuN3waGrYZLknSEdwBkfv0tUMpFQ==",pkcs1_private,{options:{environment:"browser",encryptionScheme:"pkcs1",signingScheme:"pkcs1-sha256"}});console.log("pkcs1_sha256_sign_verify");console.log(pkcs1_sha256_sign_verify);let pkcs1_oaep_sha256=NODERSA.encryptRSAWithPublicKey(data,`-----BEGIN RSA PUBLIC KEY----- +MIIBCgKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7IsT1du +SYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7Sxhdm +kte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy3zD8 +PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+HP+m +PfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEAApRb +Dd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQAB +-----END RSA PUBLIC KEY----- +`,{outputEncoding:"base64",options:{environment:"browser",encryptionScheme:{scheme:"pkcs1_oaep",hash:"sha256"}}});console.log("pkcs1_oaep_sha256");console.log(pkcs1_oaep_sha256);decryptedWithPrivate=NODERSA.decryptRSAWithPrivateKey("kSZesAAyYh2hdsQnYMdGqb6gKAzTauBKouvBzWcc4+F8RvGd0nwO6mVkUMVilPgUuNxjEauHayHiY8gI3Py45UI3+km0rSGyHrS6dHiHgCkMejXHieglYzAB0IxX3Jkm4z/66bdB/D+GFy0oct5fGCMI1UHPjEAYOsazJDa8lBFNbjiWFeb/qiZtIx3vGM7KYPAZzyRf/zPbbQ8zy9xOmRuOl5nnIxgo0Okp3KO/RIPO4GZOSBA8f2lx1UtNwwrXAMpcNavtoqHVcjJ/9lcotXYQFrn5b299pSIRf2gVm8ZJ31SK6Z8cc14nKtvgnmsgClDzIXJ1o1RcDK+knVAySg==",`-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7Is +T1duSYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7S +xhdmkte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy +3zD8PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+ +HP+mPfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEA +ApRbDd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQABAoIBADZ/QGgUzInvsLp/ +zO2WbfYm39o/uhNAvk9RbLt1TIZbMFhyOpeKynHi3Swwd9xsfWX/U9zS/lGi/m31 +iKrhmaW4OA1G3vqpMcK7TBbFufYwUEaA+ZJX344euH8pIfdzyneMQ4z3Far2dS7l +QsmjuilVV2kEFadveXewiYoVOWCu00w6bN8wy2SIHlQn+kIL6HQhWz12iKKflIKu +eGRdzLHsKmBt6WbY1Wuhx7HU0fAKdlBDPxCHNlI+kybUYE9o5C2vJiaVM5wqJBgZ +8Dz8kt1QbLJ910JoLXkLVQ8uC8NJKQwFtqQjTGPnEq0+wbgz6Ij599rKZkwW/xq9 +l6KoUiECgYEA6Ah42tVdkNW047f03xVYXFH96RgorHRS36mR8Y+ONUq1fwKidovC +WjwVujt4OPf3l1W6iyn/F6cu/bsmvPrSc3HTN0B1V31QK4OjgetxQ2PSbTldH02J +NPzkt+v+cPxXpx/P5mgt7Weefw5txU547KubGrHUV5rBKFtIx9pj16MCgYEA/EF0 +o19+D24DZAPwlDS5VbEd7FStnwY4oQ5PqbuNOSbSJLMWU0AqzXcRokp8UTyCZ0X3 +ATkS1REq97kShCuR+npTR6a6DlY7sdpPI1SMLNajgB2tkx0EOzX+PfNIbHUd4jpJ +I0ZMAHv/OOtkzQHDaeTWBTrzsWm6/nTiykfduNECgYEA46AMD4HpPECqKAs66e5i +tI6q7JSKskObWVdcmQEfnSAhVOwcvPb2Ptda6UuV8S0xcwDi88rLOUUFUFzc79+P +vTkY38cYVi/VChsluDpk7ptqv0PbGu5Rf+3n4pZdEjI7OvR2W64wAAn67uIUxc7p +yiO/ET0K9rYWb6S9jXGtKMkCgYEA2kPAqoO7zZoBMQ7/oR0lp/HC1HRIbiqx4RlC +8Lgpb+QZPEwA6zPAVVvLVENi4d+bbcRp/xLlKpraNNJcJSSWAMbLPFoU7sbKjA87 +HnTPfRSTEA2d3Ibk3F7Rh8TzS3Ti0JZiJjVzGZAwu41iAMifzwaD8K6boUy80eNN +QH2CaaECgYBUsLYvC/MiYg3w+LGOONuQongoVUXjGqnw2bjVa9RK7lwRdXPUqJ51 +MpVO98IkoLvGSI/0sGNP3GKNhC+eMGjJAVwFyEuOn+JsmMv9Y9uStIVi5tIHIhKw +m7mp8il0kaftHdSxTbspG3tZ2fjIiFIZkLEOmRpd7ogWumgOajzUdA== +-----END RSA PRIVATE KEY-----`,{options:{environment:"browser",encryptionScheme:"pkcs1_oaep"}});console.log("decryptedWithPrivate");console.log(decryptedWithPrivate);(()=>{let key=new NODERSA.NodeRSA({b:1024});key.setOptions({encryptionScheme:"pkcs1"});let text=`你好drpy node-ras`;let encrypted=key.encrypt(text,"base64");console.log("encrypted: ",encrypted);const decrypted=key.decrypt(encrypted,"utf8");console.log("decrypted: ",decrypted)})();let t2=(new Date).getTime();console.log("rsa_demo_test 测试耗时:"+(t2-t1)+"毫秒")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log(`预处理执行失败:${e.message}`)}}}let rule={};const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36";const PC_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";const UA="Mozilla/5.0";const UC_UA="Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";const IOS_UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|下载|剧情|榜|评论";const OCR_RETRY=3;const OCR_API="https://api.nn.ci/ocr/b64/text";if(typeof MY_URL==="undefined"){var MY_URL}var HOST;var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|-original|-src|-play|-url|style)$/;const SPECIAL_URL=/^(ftp|magnet|thunder|ws):/;const NOADD_INDEX=/:eq|:lt|:gt|:first|:last|^body$|^#/;const URLJOIN_ATTR=/(url|src|href|-original|-src|-play|-url|style)$|^(data-|url-|src-)/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;const $js={toString(func){let strfun=func.toString();return strfun.replace(/^\(\)(\s+)?=>(\s+)?\{/,"js:").replace(/\}$/,"")}};function window_b64(){let b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let base64DecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);function btoa(str){var out,i,len;var c1,c2,c3;len=str.length;i=0;out="";while(i>2);out+=b64map.charAt((c1&3)<<4);out+="==";break}c2=str.charCodeAt(i++);if(i==len){out+=b64map.charAt(c1>>2);out+=b64map.charAt((c1&3)<<4|(c2&240)>>4);out+=b64map.charAt((c2&15)<<2);out+="=";break}c3=str.charCodeAt(i++);out+=b64map.charAt(c1>>2);out+=b64map.charAt((c1&3)<<4|(c2&240)>>4);out+=b64map.charAt((c2&15)<<2|(c3&192)>>6);out+=b64map.charAt(c3&63)}return out}function atob(str){var c1,c2,c3,c4;var i,len,out;len=str.length;i=0;out="";while(i>4);do{c3=str.charCodeAt(i++)&255;if(c3==61)return out;c3=base64DecodeChars[c3]}while(i>2);do{c4=str.charCodeAt(i++)&255;if(c4==61)return out;c4=base64DecodeChars[c4]}while(ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out+=String.fromCharCode(c);break;case 12:case 13:char2=array[i++];out+=String.fromCharCode((c&31)<<6|char2&63);break;case 14:char2=array[i++];char3=array[i++];out+=String.fromCharCode((c&15)<<12|(char2&63)<<6|(char3&63)<<0);break}}return out}function gzip(str){let arr=zlib.gzip(str);return Buffer.from(arr,"utf-8").toString("base64")}function ungzip(b64Data){const binData=Buffer.from(b64Data,"base64");const data=zlib.ungzip(binData.buffer);return Buffer.from(data,"utf8").toString()}function encodeStr(input,encoding){encoding=encoding||"gbk";if(encoding.startsWith("gb")){input=gbkTool.encode(input)}return input}function decodeStr(input,encoding){encoding=encoding||"gbk";if(encoding.startsWith("gb")){input=gbkTool.decode(input)}return input}function getCryptoJS(){return'console.log("CryptoJS已装载");'}const RSA={cleanPEM:function(pem){pem=pem.replace(/-----BEGIN [A-Z0-9 ]+-----/g,"").replace(/-----END [A-Z0-9 ]+-----/g,"");pem=pem.replace(/\s/g,"");return pem},importPrivateKey:function(pem){const binaryDer=Uint8Array.from(Buffer.from(this.cleanPEM(pem),"base64"));const importedKey=crypto.subtle.importKey("pkcs8",binaryDer,{name:"RSA-PKCS1-v1_5",hash:"SHA-256"},false,["decrypt"]);return importedKey},importPublicKey:function(pem){const binaryDer=Uint8Array.from(Buffer.from(this.cleanPEM(pem),"base64"));const importedKey=crypto.subtle.importKey("spki",binaryDer,{name:"RSA-PKCS1-v1_5",hash:"SHA-256"},false,["encrypt"]);return importedKey},encryptMergedData:function(publicKey,data){const modulusLengthBytes=publicKey.algorithm.modulusLength+7>>3;const segmentLength=modulusLengthBytes-11;const dataBuffer=(new TextEncoder).encode(data);if(dataBuffer.length>segmentLength){const segments=[];for(let i=0;iacc+segment.length,0);let encryptedData=new Uint8Array(totalLength);let offset=0;for(const segment of encryptedSegments){encryptedData.set(segment,offset);offset+=segment.length}return encryptedData.slice(0,offset)}return crypto.subtle.encrypt({name:"RSA-PKCS1-v1_5"},publicKey,dataBuffer)},decryptMergedData:function(privateKey,mergedData){const segmentLength=privateKey.algorithm.modulusLength+7>>3;if(mergedData.length>segmentLength){const segments=[];for(let i=0;i{new_m3u8_body.push(it)})}}new_m3u8_body=new_m3u8_body.join("\n").trim();m3u8_text=[m3u8_start,new_m3u8_body,m3u8_end].join("\n").trim();return m3u8_text}function fixAdM3u8Ai(m3u8_url,headers){let ts=(new Date).getTime();let option=headers?{headers:headers}:{};function b(s1,s2){let i=0;while(iit.startsWith("#")?it:urljoin(m3u8_url,it)).join("\n");m3u8=m3u8.replace(/\n\n/gi,"\n");let last_url=m3u8.split("\n").slice(-1)[0];if(last_url.length<5){last_url=m3u8.split("\n").slice(-2)[0]}if(last_url.includes(".m3u8")&&last_url!==m3u8_url){m3u8_url=urljoin2(m3u8_url,last_url);log("嵌套的m3u8_url:"+m3u8_url);m3u8=request(m3u8_url,option)}let s=m3u8.trim().split("\n").filter(it=>it.trim()).join("\n");let ss=s.split("\n");if(m3u8_url.indexOf("ffzy")>0){let j=0,k1=0,m=0,n=0,t=0;let s2="";for(let i=0;i0){if(maxl>b(firststr,s)+1){if(secondstr.length<5)secondstr=s;kkk2++}else{maxl=b(firststr,s);kkk1++}}kk++;if(kk>=30)break}}if(kkk2>kkk1)firststr=secondstr;let firststrlen=firststr.length;let ml=Math.round(ss.length/2).toString().length;let maxc=0;let laststr=ss.toReversed().find(x=>{if(!x.startsWith("#")){let k=b(reverseString(firststr),reverseString(x));maxl=b(firststr,x);maxc++;if(firststrlen-maxl<=ml+k||maxc>10){return true}}return false});log("最后一条切片:"+laststr);let ad_urls=[];for(let i=0;i=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];function getQuery(url){try{if(url.indexOf("?")>-1){url=url.slice(url.indexOf("?")+1)}let arr=url.split("#")[0].split("&");const resObj={};arr.forEach(item=>{let arr1=item.split("=");let key=arr1[0];let value=arr1.slice(1).join("=");resObj[key]=value});return resObj}catch(err){log(`getQuery发生错误:${e.message}`);return{}}}function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd:pd};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print(`html对象转文本发生了错误:${e.message}`)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1];result=result.replace(/^['|"](.*)['|"]$/,"$1")}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print(`html对象转文本发生了错误:${e.message}`)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)&&!SPECIAL_URL.test(ret)){if(/http/.test(ret)){ret=ret.slice(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();let result=defaultParser.pdfh(html,parse);return result},pdfa(html,parse){if(!html||!parse||!parse.trim()){return[]}parse=parse.trim();let result=defaultParser.pdfa(html,parse);print(`pdfa解析${parse}=>${result.length}`);return result},pd(html,parse,base_url){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();base_url=base_url||MY_URL;return defaultParser.pd(html,parse,base_url)}},getParse(p0){if(p0.startsWith("jsp:")){return this.jsp}else if(p0.startsWith("json:")){return this.json}else if(p0.startsWith("jq:")){return this.jq}else{return this.jq}}};const stringify=JSON.stringify;const jsp=parseTags.jsp;const jq=parseTags.jq;function readFile(filePath){filePath=filePath||"./uri.min.js";var fd=os.open(filePath);var buffer=new ArrayBuffer(1024);var len=os.read(fd,buffer,0,1024);console.log(len);let text=String.fromCharCode.apply(null,new Uint8Array(buffer));console.log(text);return text}function dealJson(html){try{html=html.trim();if(!(html.startsWith("{")&&html.endsWith("}")||html.startsWith("[")&&html.endsWith("]"))){html="{"+html.match(/.*?\{(.*)\}/m)[1]+"}"}}catch(e){}try{html=JSON.parse(html)}catch(e){}return html}var OcrApi={api:OCR_API,classification:function(img){let code="";try{log("通过drpy_ocr验证码接口过验证...");let html="";if(this.api.endsWith("drpy/text")){html=request(this.api,{data:{img:img},headers:{"User-Agent":PC_UA},method:"POST"},true)}else{html=post(this.api,{body:img})}code=html||""}catch(e){log(`OCR识别验证码发生错误:${e.message}`)}return code}};function verifyCode(url){let cnt=0;let host=getHome(url);let cookie="";while(cntit.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function $require(url){eval(request(url))}function keysToLowerCase(obj){return Object.keys(obj).reduce((result,key)=>{const newKey=key.toLowerCase();result[newKey]=obj[key];return result},{})}function buildQueryString(params){const queryArray=[];for(const key in params){if(params.hasOwnProperty(key)){let value=params[key];if(value===undefined||value===null){value=""}else{value=value.toString()}const encodedKey=encodeURIComponent(key);const encodedValue=encodeURIComponent(value);queryArray.push(encodedKey+"="+encodedValue)}}return queryArray.join("&")}function parseQueryString(query){const params={};query.split("&").forEach(function(part){const regex=/^(.*?)=(.*)/;const match=part.match(regex);if(match){const key=decodeURIComponent(match[1]);const value=decodeURIComponent(match[2]);params[key]=value}});return params}function encodeIfContainsSpecialChars(value){const specialChars=":/?#[]@!$'()*+,;=%";if(specialChars.split("").some(char=>value.includes(char))){return encodeURIComponent(value)}return value}function objectToQueryString(obj){const encoded=[];for(let key in obj){if(obj.hasOwnProperty(key)){encoded.push(encodeURIComponent(key)+"="+encodeIfContainsSpecialChars(obj[key]))}}return encoded.join("&")}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}if(!fetch_params){fetch_params={}}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA;if(typeof fetch_params==="object"&&fetch_params&&fetch_params.headers){let fetch_headers=keysToLowerCase(fetch_params.headers);if(fetch_headers["user-agent"]){headers["User-Agent"]=fetch_headers["user-agent"]}}}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}if(obj.redirect===false){obj.redirect=0}if(obj.headers.hasOwnProperty("Content-Type")||obj.headers.hasOwnProperty("content-type")){let _contentType=obj.headers["Content-Type"]||obj.headers["content-type"]||"";if(_contentType.includes("application/x-www-form-urlencoded")){log("custom body is application/x-www-form-urlencoded");if(typeof obj.body=="string"){let temp_obj=parseQueryString(obj.body);console.log(JSON.stringify(temp_obj))}}}console.log(JSON.stringify(obj.headers));console.log("request:"+url+`|method:${obj.method||"GET"}|body:${obj.body||""}`);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}function post(url,obj){obj=obj||{};obj.method="POST";return request(url,obj)}function reqCookie(url,obj,all_cookie){obj=obj||{};obj.withHeaders=true;all_cookie=all_cookie||false;let html=request(url,obj);let json=JSON.parse(html);let setCk=Object.keys(json).find(it=>it.toLowerCase()==="set-cookie");let cookie=setCk?json[setCk]:"";if(Array.isArray(cookie)){cookie=cookie.join(";")}if(!all_cookie){cookie=cookie.split(";")[0]}html=json.body;return{cookie:cookie,html:html}}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{console.log(data)}};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;print("宝塔验证访问链接:"+url);html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i0){classes=list}}}catch(e){console.log(e.message)}}else if(p.length>=3&&!is_json){try{let html=homeObj.home_html||getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p0);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]&&!homeObj.home_html){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级?rule.一级.split(";"):[];if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log(`首页列表双层定位处理发生错误:${e.message}`)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log(`首页列表单层定位处理发生错误:${e.message}`)}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片替换){if(rule.图片替换.startsWith("js:")){d.forEach(it=>{try{var input=it.vod_pic;eval(rule.图片替换.trim().replace("js:",""));it.vod_pic=input}catch(e){log(`图片:${it.vod_pic}替换错误:${e.message}`)}})}else if(rule.图片替换.includes("=>")){let replace_from=rule.图片替换.split("=>")[0];let replace_to=rule.图片替换.split("=>")[1];d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic.replace(replace_from,replace_to)}})}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}url=url.replaceAll("fyclass",cateObj.tid);let fl=cateObj.filter?cateObj.extend:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print(`合并不同分类对应的默认筛选出错:${e.message}`)}}let new_url;new_url=cheerio.jinja2(url,{fl:fl,fyclass:cateObj.tid});url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片替换){if(rule.图片替换.startsWith("js:")){d.forEach(it=>{try{var input=it.vod_pic;eval(rule.图片替换.trim().replace("js:",""));it.vod_pic=input}catch(e){log(`图片:${it.vod_pic}替换错误:${e.message}`)}})}else if(rule.图片替换.includes("=>")){let replace_from=rule.图片替换.split("=>")[0];let replace_to=rule.图片替换.split("=>")[1];d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic.replace(replace_from,replace_to)}})}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}if(rule.searchNoPage&&Number(searchObj.pg)>1){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级?rule.一级.split(";"):[];let url=searchObj.searchUrl.replaceAll("**",searchObj.wd);if(searchObj.pg===1&&url.includes("[")&&url.includes("]")&&!url.includes("#")){url=url.split("[")[1].split("]")[0]}else if(searchObj.pg>1&&url.includes("[")&&url.includes("]")&&!url.includes("#")){url=url.split("[")[0]}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",searchObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",searchObj.pg)}}MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{html=getHtml(MY_URL)}if(html){let search_tag=rule.搜索验证标识||"系统安全验证|输入验证码";if(new RegExp(search_tag).test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}let list=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print(`搜索发生错误:${e.message}`);return"{}"}}if(rule.图片替换){if(rule.图片替换.startsWith("js:")){d.forEach(it=>{try{var input=it.vod_pic;eval(rule.图片替换.trim().replace("js:",""));it.vod_pic=input}catch(e){log(`图片:${it.vod_pic}替换错误:${e.message}`)}})}else if(rule.图片替换.includes("=>")){let replace_from=rule.图片替换.split("=>")[0];let replace_to=rule.图片替换.split("=>")[1];d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic.replace(replace_from,replace_to)}})}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,type_name:"类型",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");vod.vod_name=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();let type_name=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").replace(/ /g,"").trim():"";vod.type_name=type_name||vod.type_name}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""))}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();if(!v_title){v_title="线路空"}console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);try{var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print(`格式化LISTS发生错误:${e.message}`)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print(`js执行lists: 发生错误:${e.message}`)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let list_url_prefix=p.list_url_prefix||"";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i1&&!is_tab_js?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let new_vod_list=[];let tt1=(new Date).getTime();if(typeof pdfl==="function"){new_vod_list=pdfl(html,p1,list_text,list_url,MY_URL);if(list_url_prefix){new_vod_list=new_vod_list.map(it=>it.split("$")[0]+"$"+list_url_prefix+it.split("$").slice(1).join("$"))}}else{let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}for(let i=0;i0){new_vod_list=forceOrder(new_vod_list,"",x=>x.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`)}let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}if(rule.图片替换&&rule.图片替换.includes("=>")){let replace_from=rule.图片替换.split("=>")[0];let replace_to=rule.图片替换.split("=>")[1];vod.vod_pic=vod.vod_pic.replace(replace_from,replace_to)}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);try{vod=vodDeal(vod)}catch(e){console.log(`vodDeal发生错误:${e.message}`)}return JSON.stringify({list:[vod]})}function get_tab_index(vod){let obj={};vod.vod_play_from.split("$$$").forEach((it,index)=>{obj[it]=index});return obj}function vodDeal(vod){let vod_play_from=vod.vod_play_from.split("$$$");let vod_play_url=vod.vod_play_url.split("$$$");let tab_removed_list=vod_play_from;let tab_ordered_list=vod_play_from;let tab_renamed_list=vod_play_from;let tab_list=vod_play_from;let play_ordered_list=vod_play_url;if(rule.tab_remove&&rule.tab_remove.length>0||rule.tab_order&&rule.tab_order.length>0){let tab_index_dict=get_tab_index(vod);if(rule.tab_remove&&rule.tab_remove.length>0){tab_removed_list=vod_play_from.filter(it=>!rule.tab_remove.includes(it));tab_list=tab_removed_list}if(rule.tab_order&&rule.tab_order.length>0){let tab_order=rule.tab_order;tab_ordered_list=tab_removed_list.sort((a,b)=>{const getOrderIndex=(tabName,orderRules)=>{for(let i=0;ivod_play_url[tab_index_dict[it]])}if(rule.tab_rename&&typeof rule.tab_rename==="object"&Object.keys(rule.tab_rename).length>0){tab_renamed_list=tab_list.map(it=>rule.tab_rename[it]||it);tab_list=tab_renamed_list}vod.vod_play_from=tab_list.join("$$$");vod.vod_play_url=play_ordered_list.join("$$$");return vod}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;var MY_FLAG=playObj.flag;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;var flag=MY_FLAG;let common_play={parse:SPECIAL_URL.test(input)||/^(push:)/.test(input)?0:1,url:input,flag:flag,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.trim();if(lazy_code.startsWith("js:")){lazy_code=lazy_code.replace("js:","").trim()}print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:SPECIAL_URL.test(input)||/^(push:)/.test(input)?0:1,jx:tellIsJx(input),url:input}}catch(e){print(`js免嗅错误:${e.message}`);lazy_play=common_play}}else{lazy_play=common_play}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function proxyParse(proxyObj){var input=proxyObj.params;if(proxyObj.proxy_rule){log("准备执行本地代理规则:\n"+proxyObj.proxy_rule);try{eval(proxyObj.proxy_rule);if(input&&input!==proxyObj.params&&Array.isArray(input)&&input.length>=3){return input}else{return[404,"text/plain","Not Found"]}}catch(e){return[500,"text/plain","代理规则错误:"+e.message]}}else{return[404,"text/plain","Not Found"]}}function isVideoParse(isVideoObj){var input=isVideoObj.url;if(!isVideoObj.t){let re_matcher=new RegExp(isVideoObj.isVideo,"i");return re_matcher.test(input)}else{try{eval(isVideoObj.isVideo);if(typeof input==="boolean"){return input}else{return false}}catch(e){log(`执行嗅探规则发生错误:${e.message}`);return false}}}function removeHeader(content,options={}){const{mode="header-only",fileType}=options;const COMMENT_CONFIG={".js":{start:"/*",end:"*/",regex:/^\s*\/\*([\s\S]*?)\*\/\s*/,headerRegex:/@header\(([\s\S]*?)\)/,topCommentsRegex:/^(\s*(\/\/[^\n]*\n|\/\*[\s\S]*?\*\/)\s*)+/},".py":{start:'"""',end:'"""',regex:/^\s*"""([\s\S]*?)"""\s*/,headerRegex:/@header\(([\s\S]*?)\)/,topCommentsRegex:/^(\s*(#[^\n]*\n|'''[\s\S]*?'''|"""[\s\S]*?""")\s*)+/}};if(!fileType)throw new Error("fileType option is required");const ext=fileType.startsWith(".")?fileType:`.${fileType}`;const config=COMMENT_CONFIG[ext];if(!config)throw new Error(`Unsupported file type: ${ext}`);if(mode==="top-comments"){const match=content.match(config.topCommentsRegex);if(match){return content.substring(match[0].length).trim()}return content.trim()}const match=content.match(config.regex);if(!match)return content.trim();let[fullComment,innerContent]=match;if(config.headerRegex.test(innerContent)){innerContent=innerContent.replace(config.headerRegex,"");const cleanedInner=innerContent.split("\n").filter(line=>line.trim().length>0).join("\n");if(!cleanedInner.trim()){return content.replace(fullComment,"").trim()}else{const newComment=`${config.start}${cleanedInner}${config.end}`;return content.replace(fullComment,newComment).trim()}}return content.trim()}function getOriginalJs(js_code){let current_match=/var rule|function|let |var |const|class Rule|async|this\./;if(current_match.test(js_code)){return js_code}js_code=removeHeader(js_code,{mode:"top-comments",fileType:".js"});let rsa_private_key="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs=";let decode_content="";function aes_decrypt(data){const keyHex="686A64686E780A0A0A0A0A0A0A0A0A0A";const ivHex="647A797964730A0A0A0A0A0A0A0A0A0A";const keyArray=new Uint8Array(Buffer.from(keyHex,"hex"));const ivArray=new Uint8Array(Buffer.from(ivHex,"hex"));const encryptedArray=new Uint8Array(Buffer.from(data,"base64"));const key=crypto.subtle.importKey("raw",keyArray,{name:"AES-CBC"},false,["decrypt"]);try{const decryptedArray=crypto.subtle.decrypt({name:"AES-CBC",iv:ivArray},key,encryptedArray);const decryptedString=(new TextDecoder).decode(decryptedArray);return decryptedString}catch(e){console.error("解密失败:",e);return null}}let error_log=false;function logger(text){if(error_log){log(text)}}let decode_funcs=[text=>{try{return ungzip(text)}catch(e){logger("非gzip加密");return""}},text=>{try{return base64Decode(text)}catch(e){logger("非b64加密");return""}},text=>{try{return aes_decrypt(text)}catch(e){logger("非aes加密");return""}},text=>{try{return RSA.decode(text,rsa_private_key,null)}catch(e){logger("非rsa加密");return""}}];let func_index=0;while(!current_match.test(decode_content)){decode_content=decode_funcs[func_index](js_code);func_index++;if(func_index>=decode_funcs.length){break}}return decode_content}function runMain(main_func_code,arg){let mainFunc=function(){return""};try{eval(main_func_code+"\nmainFunc=main;");return mainFunc(arg)}catch(e){log(`执行main_funct发生了错误:${e.message}`);return""}}function init(ext){console.log("init");rule={};rule_fetch_params={};fetch_params=null;try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}else if(typeof ext=="string"){let is_file=ext.startsWith("file://");if(ext.startsWith("http")||is_file){let query=getQuery(ext);if(is_file){ext=ext.split("?")[0]}let js=request(ext,{method:"GET"});if(js){js=getOriginalJs(js);eval("(function(){"+js.replace("var rule","rule")+"})()")}if(query.type==="url"&&query.params){if(is_file&&/^http/.test(query.params)){rule.params=query.params}else{rule.params=urljoin(ext,query.params)}}else if(query.params){rule.params=query.params}}else{ext=getOriginalJs(ext);eval("(function(){"+ext.replace("var rule","rule")+"})()")}}else{console.log(`规则加载失败,不支持的规则类型:${typeof ext}`);return}rule.host=(rule.host||"").rstrip("/");HOST=rule.host;if(rule.hostJs){console.log(`检测到hostJs,准备执行...`);try{eval(rule.hostJs);rule.host=HOST.rstrip("/")}catch(e){console.log(`执行${rule.hostJs}获取host发生错误:${e.message}`)}}if(rule["模板"]==="自动"){try{let host_headers=rule["headers"]||{};let host_html=getCode(HOST,{headers:host_headers});let match_muban="";let muban_keys=Object.keys(muban).filter(it=>!/默认|短视2|采集1/.test(it));for(let muban_key of muban_keys){try{let host_data=JSON.parse(home({},host_html,muban[muban_key].class_parse));if(host_data.class&&host_data.class.length>0){match_muban=muban_key;console.log(`自动匹配模板:【${muban_key}】`);break}}catch(e){console.log(`自动匹配模板:【${muban_key}】错误:${e.message}`)}}if(match_muban){muban["自动"]=muban[match_muban];if(rule["模板修改"]&&rule["模板修改"].startsWith("js:")){eval(rule["模板修改"].replace("js:","").trim())}}else{delete rule["模板"]}}catch(e){delete rule["模板"]}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[rule.模板],rule)}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());rule_cate_excludes=rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it=>it.trim()));rule_tab_excludes=rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it=>it.trim()));rule.cate_exclude=rule_cate_excludes.join("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.类型=rule.类型||"影视";rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.homeUrl=cheerio.jinja2(rule.homeUrl,{rule:rule});rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;rule.二级访问前=rule.二级访问前||"";if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}if(rule.searchUrl.includes("[")&&rule.searchUrl.includes("]")&&!rule.searchUrl.includes("#")){let u1=rule.searchUrl.split("[")[0];let u2=rule.searchUrl.split("[")[1].split("]")[0];rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.searchUrl}else{rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl}rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.图片替换=rule.图片替换||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};rule.proxy_rule=rule.hasOwnProperty("proxy_rule")?rule.proxy_rule:"";if(!rule.hasOwnProperty("sniffer")){rule.sniffer=false}rule.sniffer=rule.hasOwnProperty("sniffer")?rule.sniffer:"";rule.sniffer=!!(rule.sniffer&&rule.sniffer!=="0"&&rule.sniffer!=="false");rule.isVideo=rule.hasOwnProperty("isVideo")?rule.isVideo:"";if(rule.sniffer&&!rule.isVideo){rule.isVideo="http((?!http).){12,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video/tos*|http((?!http).)*?obj/tos*"}rule.tab_remove=rule.hasOwnProperty("tab_remove")?rule.tab_remove:[];rule.tab_order=rule.hasOwnProperty("tab_order")?rule.tab_order:[];rule.tab_rename=rule.hasOwnProperty("tab_rename")?rule.tab_rename:{};if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}else if(k.toLowerCase()==="cookie"){let v=rule.headers[k];if(v&&v.startsWith("http")){console.log(v);try{v=fetch(v);console.log(v);rule.headers[k]=v}catch(e){console.log(`从${v}获取cookie发生错误:${e.message}`)}}}}}catch(e){console.log(`处理headers发生错误:${e.message}`)}}else{rule.headers={}}oheaders=deepCopy(rule.headers);rule_fetch_params={headers:rule.headers,timeout:rule.timeout,encoding:rule.encoding};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);pre();init_test()}catch(e){console.log(`init_test发生错误:${e.message}`);throw e}}let homeHtmlCache=undefined;function home(filter,home_html,class_parse){console.log("home");home_html=home_html||"";class_parse=class_parse||"";if(typeof rule.filter==="string"&&rule.filter.trim().length>0){try{let filter_json=ungzip(rule.filter.trim());rule.filter=JSON.parse(filter_json)}catch(e){rule.filter={}}}let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:class_parse||rule.class_parse||"",cate_exclude:rule.cate_exclude,home_html:home_html};return homeParse(homeObj)}function homeVod(params){console.log("homeVod");let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";log("orId:"+orId);if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,"二级访问前":rule.二级访问前,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick,pg){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:pg||1,quick:quick};return searchParse(searchObj)}function proxy(params){if(rule.proxy_rule&&rule.proxy_rule.trim()){rule.proxy_rule=rule.proxy_rule.trim()}if(rule.proxy_rule.startsWith("js:")){rule.proxy_rule=rule.proxy_rule.replace("js:","")}let proxyObj={params:params,proxy_rule:rule.proxy_rule};return proxyParse(proxyObj)}function sniffer(){let enable_sniffer=rule.sniffer||false;if(enable_sniffer){log("开始执行辅助嗅探代理规则...")}return enable_sniffer}function isVideo(url){let t=0;let is_video;if(rule.isVideo&&rule.isVideo.trim()){is_video=rule.isVideo.trim()}if(is_video.startsWith("js:")){is_video=is_video.replace("js:","");t=1}let isVideoObj={url:url,isVideo:is_video,t:t};let result=isVideoParse(isVideoObj);if(result){log("成功执行辅助嗅探规则并检测到视频地址:\n"+rule.isVideo)}return result}function getRule(key){return key?rule[key]||"":rule}function deepCopy(_obj){return JSON.parse(JSON.stringify(_obj))}function matchesAll(str,pattern,flatten){if(!pattern.global){pattern=new RegExp(pattern.source,"g"+(pattern.ignoreCase?"i":"")+(pattern.multiline?"m":""))}var matches=[];var match;while((match=pattern.exec(str))!==null){matches.push(match)}return flatten?matches.flat():matches}function stringUtils(){Object.defineProperties(String.prototype,{replaceX:{value:function(regex,replacement){let matches=matchesAll(this,regex,true);if(matches&&matches.length>1){const hasCaptureGroup=/\$\d/.test(replacement);if(hasCaptureGroup){return this.replace(regex,m=>m.replace(regex,replacement))}else{return this.replace(regex,(m,p1)=>m.replace(p1,replacement))}}return this.replace(regex,replacement)},configurable:true,enumerable:false,writable:true},parseX:{get:function(){try{return JSON.parse(this)}catch(e){console.log(e.message);return this.startsWith("[")?[]:{}}},configurable:true,enumerable:false}})}function cut(text,start,end,method,All){let result="";let c=(t,s,e)=>{let result="";let rs=[];let results=[];try{let lr=new RegExp(String.raw`${s}`.toString());let rr=new RegExp(String.raw`${e}`.toString());const segments=t.split(lr);if(segments.length<2)return"";let cutSegments=segments.slice(1).map(segment=>{let splitSegment=segment.split(rr);return splitSegment.length<2?undefined:splitSegment[0]+e}).filter(f=>f);if(All){return`[${cutSegments.join(",")}]`}else{return cutSegments[0]}}catch(e){console.log(`Error cutting text:${e.message}`)}return result};result=c(text,start,end);stringUtils();if(method&&typeof method==="function"){result=method(result)}return result}function DRPY(){return{runMain:runMain,getRule:getRule,init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo,fixAdM3u8Ai:fixAdM3u8Ai}}export default{runMain:runMain,getRule:getRule,init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo,fixAdM3u8Ai:fixAdM3u8Ai,DRPY:DRPY}; \ No newline at end of file diff --git a/public/index.html b/public/index.html index 6b7fb650..431f627a 100644 --- a/public/index.html +++ b/public/index.html @@ -14,7 +14,8 @@

drpyS(drpy-node)

常用超链接

更新记录

-

20260113

-

更新至V1.3.16

-

20260112

-

更新至V1.3.15

+

20260208

+

更新至V1.3.22

+

20260131

+

更新至V1.3.21

+

20260127

+

更新至V1.3.20

点此查看完整更新记录

注意事项

总是有人遇到各种奇葩问题,像什么没弹幕,访问/config/1服务马上崩溃等等,能自行解决最好,解决不了我建议你使用下方安装教程 @@ -159,6 +165,7 @@

友链(白嫖接口服务)

  • 源动力-老
  • 电竞专业反应测试
  • 桌面启动器
  • +
  • 不知名获取网盘CK工具
  • AI接入

      diff --git a/public/sub/order_common.example.html b/public/sub/order_common.example.html index 33cf163c..788cdb87 100644 --- a/public/sub/order_common.example.html +++ b/public/sub/order_common.example.html @@ -1,16 +1,23 @@ +豆瓣 设置中心 番茄小说 -大象影视 腾云驾雾 央视大全 +短剧聚合 IPTV [优] [盘] +[磁] [漫] +[短] [官] [听] +[书] +[画] +[M] [搜] DS cat +DR2 hipy 推送 diff --git a/spider/.DS_Store b/spider/.DS_Store deleted file mode 100644 index 76d54f9f..00000000 Binary files a/spider/.DS_Store and /dev/null differ diff --git "a/spider/catvod/yikm[\346\270\270\346\210\217].js" "b/spider/catvod/yikm[\346\270\270\346\210\217].js" new file mode 100644 index 00000000..864df648 --- /dev/null +++ "b/spider/catvod/yikm[\346\270\270\346\210\217].js" @@ -0,0 +1,431 @@ +/* +@header({ + searchable: 0, + filterable: 1, + quickSearch: 0, + title: 'yikm[游戏]', + logo: "https://file.yikm.net/logo.png" + lang: 'cat' +}) +*/ + + +let siteKey = "", siteType = "", sourceKey = "", ext = "", host = ""; + +const myGame = [ + { + name: '斗地主(人机)', + url: 'https://www.haiwaiqipai.com/games/doudizhus/index.html', + pic: 'https://www.haiwaiqipai.com/img/DouDiZhu.jpg' + }, + { + name: '五子棋', + url: 'https://wuziqi.hongton.com', + pic: 'https://wuziqi.hongton.com/img/stype/init-bg.png' + }, + { + name: '俄罗斯方块', + url: 'https://v2fy.com/game/tetris/', + pic: 'https://i-1-uc129.zswxy.cn/2023/0223/5d809bdb026646478a97a938f7b3300c.png' + }, + { + name: '魂斗罗(美版)', + url: 'https://www.yikm.net/play?id=4137', + pic: 'https://img.1990i.com/fcpic/sj/436a.png', + header: { + 'Upgrade-Insecure-Requests': '1', + 'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36' + } + }, +]; + +async function request(url, obj) { + if (!obj) { + obj = { + headers: headers, + timeout: 5000 + } + } + try { + const response = await req(url, obj); + let html = response.content; + return html; + } catch (e) { + console.log(`请求失败: ${url}`, e.message); + return ''; + } +} + +// 2. 全局默认请求头(匹配request函数,复用至vod_id的header) +const headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0' +}; + + +// 公共函数:返回统一的 header 配置 +function hdr() { + return { + 'Upgrade-Insecure-Requests': '1', + 'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36' + }; +} + +async function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype; + sourceKey = cfg.sourceKey; + ext = cfg.ext; + host = "https://www.yikm.net"; +} + +async function home(filter) { + const classes = [ + { + type_id: '定制', + type_name: '定制', + type_flag: '2-00-S' + }, { + type_id: '/nes?tag=0&e=0&page=', + type_name: 'FC', + type_flag: '[CFS]2-00-S' + }, { + type_id: '/nes?tag=&e=5&page=', + type_name: 'SFC', + type_flag: '[CFS]2-00-S', + }, { + type_id: '/nes?tag=9&e=&page=', + type_name: '街机', + type_flag: '[CFS]2-00-S', + }, { + type_id: '/nes?tag=&e=2&page=', + type_name: 'GBA', + type_flag: '[CFS]2-00-S', + }, { + type_id: '/nes?tag=&e=7&page=', + type_name: 'NDS', + type_flag: '[CFS]2-00-S', + }, { + type_id: '/nes?tag=&e=3&page=', + type_name: 'MD', + type_flag: '[CFS]2-00-S', + }, { + type_id: '/nes?tag=&e=6&page=', + type_name: 'DOS', + type_flag: '[CFS]2-00-S', + } + + ]; + const filters = { + "/nes?tag=0&e=0&page=": [ + { + key: 'class', + name: '分类', + value: [{"n": "FC高清", "v": "/nes?tag=&e=4&page="}, { + "n": "动作冒险", + "v": "/nes?tag=2&e=0&page=" + }, {"n": "小游戏", "v": "/nes?tag=8&e=0&page="}, { + "n": "飞行射击", + "v": "/nes?tag=3&e=0&page=" + }, {"n": "格斗", "v": "/nes?tag=4&e=0&page="}, {"n": "棋牌", "v": "/nes?tag=5&e=0&page="}, { + "n": "射击", + "v": "/nes?tag=6&e=0&page=" + }, {"n": "运动比赛", "v": "/nes?tag=7&e=0&page="}, {"n": "角色扮演", "v": "/nes?tag=10&e=0&page="},] + } + ], "/nes?tag=&e=5&page=": [ + { + key: 'class', + name: '分类', + value: [{"n": "汉化", "v": "/nes?tag=汉化&e=5&page="}, { + "n": "平台", + "v": "/nes?tag=平台&e=5&page=" + }, {"n": "策略", "v": "/nes?tag=策略&e=5&page="}, { + "n": "混合", + "v": "/nes?tag=混合&e=5&page=" + }, {"n": "动作", "v": "/nes?tag=动作&e=5&page="}, { + "n": "角色扮演", + "v": "/nes?tag=角色扮演&e=5&page=" + }, {"n": "射击", "v": "/nes?tag=射击&e=5&page="}, { + "n": "运动", + "v": "/nes?tag=运动&e=5&page=" + }, {"n": "格斗", "v": "/nes?tag=格斗&e=5&page="}, { + "n": "休闲", + "v": "/nes?tag=休闲&e=5&page=" + }, {"n": "冒险", "v": "/nes?tag=冒险&e=5&page="}, { + "n": "教育", + "v": "/nes?tag=教育&e=5&page=" + }, {"n": "赛车", "v": "/nes?tag=赛车&e=5&page="}, { + "n": "模拟", + "v": "/nes?tag=模拟&e=5&page=" + }, {"n": "其他", "v": "/nes?tag=其他&e=5&page="},] + } + ], "/nes?tag=9&e=&page=": [ + { + key: 'class', + name: '分类', + value: [{"n": "动作冒险", "v": "/nes?tag=动作&e=1&page="}, { + "n": "射击", + "v": "/nes?tag=射击&e=1&page=" + }, {"n": "赛车", "v": "/nes?tag=赛车&e=1&page="}, { + "n": "格斗", + "v": "/nes?tag=格斗&e=1&page=" + }, {"n": "体育", "v": "/nes?tag=体育&e=1&page="}, { + "n": "益智游戏", + "v": "/nes?tag=益智&e=1&page=" + }, {"n": "其他", "v": "/nes?tag=其他&e=1&page="},] + } + ], "/nes?tag=&e=2&page=": [ + { + key: 'class', + name: '分类', + value: [{"n": "动作", "v": "/nes?tag=动作&e=2&page="}, { + "n": "冒险", + "v": "/nes?tag=冒险&e=2&page=" + }, {"n": "角色扮演", "v": "/nes?tag=角色扮演&e=2&page="}, { + "n": "运动", + "v": "/nes?tag=运动&e=2&page=" + }, {"n": "策略", "v": "/nes?tag=策略&e=2&page="}, { + "n": "格斗", + "v": "/nes?tag=格斗&e=2&page=" + }, {"n": "射击", "v": "/nes?tag=射击&e=2&page="}, { + "n": "赛车", + "v": "/nes?tag=赛车&e=2&page=" + }, {"n": "体育", "v": "/nes?tag=体育&e=2&page="}, { + "n": "益智游戏", + "v": "/nes?tag=益智&e=2&page=" + }, {"n": "模拟", "v": "/nes?tag=模拟&e=2&page="}] + } + ], "/nes?tag=&e=7&page=": [ + { + key: 'class', + name: '分类', + value: [{"n": "角色扮演", "v": "/nes?tag=角色扮演&e=7&page="}, { + "n": "动作角色扮演", + "v": "/nes?tag=动作角色扮演&e=7&page=" + }, {"n": "模拟角色扮演", "v": "/nes?tag=模拟角色扮演&e=7&page="}, { + "n": "动作游戏", + "v": "/nes?tag=动作游戏&e=7&page=" + }, {"n": "冒险游戏", "v": "/nes?tag=冒险游戏&e=7&page="}, { + "n": "冒险解谜", + "v": "/nes?tag=冒险解谜&e=7&page=" + }, {"n": "策略战棋", "v": "/nes?tag=策略战棋&e=7&page="}, { + "n": "模拟经营", + "v": "/nes?tag=模拟经营&e=7&page=" + }, {"n": "体育竞技", "v": "/nes?tag=体育竞技&e=7&page="}, { + "n": "赛车竞速", + "v": "/nes?tag=赛车竞速&e=7&page=" + }, {"n": "格斗游戏", "v": "/nes?tag=格斗游戏&e=7&page="}, { + "n": "大乱斗游戏", + "v": "/nes?tag=大乱斗游戏&e=7&page=" + }, {"n": "射击游戏", "v": "/nes?tag=射击游戏&e=7&page="}, { + "n": "第一人称射击", + "v": "/nes?tag=第一人称射击&e=7&page=" + }, {"n": "益智游戏", "v": "/nes?tag=益智游戏&e=7&page="}, { + "n": "养成游戏", + "v": "/nes?tag=养成游戏&e=7&page=" + }, {"n": "音乐游戏", "v": "/nes?tag=音乐游戏&e=7&page="}, { + "n": "恋爱游戏", + "v": "/nes?tag=恋爱游戏&e=7&page=" + }, {"n": "卡片游戏", "v": "/nes?tag=卡片游戏&e=7&page="}, { + "n": "桌面游戏", + "v": "/nes?tag=桌面游戏&e=7&page=" + }] + } + ], "/nes?tag=&e=3&page=": [ + { + key: 'class', + name: '分类', + value: [{"n": "角色扮演", "v": "/nes?tag=角色扮演&e=3&page="}, { + "n": "动作冒险", + "v": "/nes?tag=动作冒险&e=3&page=" + }, {"n": "策略", "v": "/nes?tag=策略&e=3&page="}, { + "n": "棋牌", + "v": "/nes?tag=棋牌&e=3&page=" + }, {"n": "射击", "v": "/nes?tag=射击&e=3&page="}, { + "n": "模拟经营", + "v": "/nes?tag=模拟经营&e=3&page=" + }, {"n": "战棋", "v": "/nes?tag=战棋&e=3&page="}, { + "n": "格斗", + "v": "/nes?tag=格斗&e=3&page=" + }, {"n": "动作", "v": "/nes?tag=动作&e=3&page="}, { + "n": "解谜", + "v": "/nes?tag=解谜&e=3&page=" + }, {"n": "模拟", "v": "/nes?tag=模拟&e=3&page="}, { + "n": "休闲益智", + "v": "/nes?tag=休闲益智&e=3&page=" + }, {"n": "体育", "v": "/nes?tag=体育&e=3&page="}, {"n": "音乐", "v": "/nes?tag=音乐&e=3&page="}] + } + ] + }; + + return JSON.stringify({ + 'class': classes, + 'filters': filters + }); +} + +async function homeVod(params) { + return null; +} + +async function category(tid, pg, filter, extend) { + extend = extend || {}; + + if (tid == '定制') { + if (pg != 1) return null; + + const videos = []; + for (let it of myGame) { + videos.push({ + vod_id: JSON.stringify({ + actionId: 'browser', + type: 'browser', + title: '小游戏', + url: it.url, + header: it.header + }), + vod_name: it.name, + vod_pic: it.pic, + vod_tag: 'action' + }); + } + + return JSON.stringify({ + 'list': videos + }); + } + + if (extend.custom) { + return search(extend.custom, true, pg); + } + + const classz = extend.class; + const targetUrl = classz ? host + classz + pg : host + tid + pg; + const html = await request(targetUrl); + if (!html) return []; + + // 提取所有视频卡片 + const videoCards = pdfa(html, '.row .col-md-3.col-xs-6 .card-blog'); + const videos = []; + + for (const card of videoCards) { + // 提取图片链接 + const vod_pic = pdfh(card, '.card-image img&&src'); + + // 提取游戏名称 + const vod_name = pdfh(card, 'h4 a&&Text'); + + // 提取游戏链接 + const gamePath = pdfh(card, 'h4 a&&href'); + const gameUrl = gamePath.startsWith('http') ? gamePath : host + gamePath; + + // 提取标签(如果有多个标签,这里取第一个) + //const vod_tag = pdfh(card, '.table .label:first-child&&Text') || 'action'; + + videos.push({ + vod_id: JSON.stringify({ + actionId: 'browser', + type: 'browser', + title: '小游戏', + url: gameUrl, + textZoom: 100, + header: { + 'Upgrade-Insecure-Requests': '1', + 'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36' + } + }), + vod_name: vod_name, + vod_pic: vod_pic, + vod_tag: 'action' // 统一转为小写 + }); + } + + // 添加固定项(如crazygames和poki) + videos.push( + { + vod_id: JSON.stringify({ + actionId: 'browser', + type: 'browser', + title: '小游戏', + url: 'https://www.crazygames.com' + }), + vod_name: 'crazygames', + vod_pic: '', + vod_tag: 'action' + }, + { + vod_id: JSON.stringify({ + actionId: 'browser', + type: 'browser', + title: '小游戏', + url: 'https://poki.com/zh' + }), + vod_name: 'poki', + vod_pic: '', + vod_tag: 'action' + } + ); + + return JSON.stringify({ + 'list': videos + }); +} + + +async function search(wd, quick, pg) { + const p = pg || 1; + const url = host + '/search?name=' + encodeURIComponent(wd); + const html = await request(url); + if (!html) return []; + const videoCard = pdfa(html, '.row .col-md-3.col-xs-6'); + console.log('【调试】网络数据:', videoCard); + // 提取所有视频卡片 + const videoCards = pdfa(html, '.row .col-md-3.col-xs-6 .card.card-blog'); + const videos = []; + + for (const card of videoCards) { + // 提取图片链接 + const vod_pic = pdfh(card, '.card-image img&&src'); + + // 提取游戏名称 + const vod_name = pdfh(card, 'h4 a&&Text'); + + // 提取游戏链接 + const gamePath = pdfh(card, 'h4 a&&href'); + const gameUrl = gamePath.startsWith('http') ? gamePath : host + gamePath; + + // 提取标签(如果有多个标签,这里取第一个) + //const vod_tag = pdfh(card, '.table .label:first-child&&Text') || 'action'; + + videos.push({ + vod_id: JSON.stringify({ + actionId: 'browser', + type: 'browser', + title: '小游戏', + url: gameUrl, + textZoom: 100, + header: { + 'Upgrade-Insecure-Requests': '1', + 'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36' + } + }), + vod_name: vod_name, + vod_pic: vod_pic, + vod_tag: 'action' + }); + } + + return JSON.stringify({ + 'list': videos, + page: p + }); +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + search: search + }; +} diff --git "a/spider/catvod/\345\223\251\345\223\251[\345\256\230].js" "b/spider/catvod/\345\223\251\345\223\251[\345\256\230].js" new file mode 100644 index 00000000..91cecaa6 --- /dev/null +++ "b/spider/catvod/\345\223\251\345\223\251[\345\256\230].js" @@ -0,0 +1,323 @@ +/** + * 哔哩哔哩 - 猫影视JS爬虫格式 + * 调用壳子超级解析功能 + @header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '哩哩[官]', + lang: 'cat' + }) + */ + +class Spider extends BaseSpider { + + constructor() { + super(); + this.host = 'https://www.bilibili.com'; + this.headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Referer': 'https://www.bilibili.com', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8' + }; + + // B站Cookie(需要登录才能获取高清画质) + this.cookie = ""; + this.isLoggedIn = () => { + return this.cookie && this.cookie.includes("SESSDATA="); + }; + } + + init(extend = '') { + return ''; + } + + getName() { + return '哔哩哔哩'; + } + + isVideoFormat(url) { + return true; + } + + manualVideoCheck() { + return false; + } + + destroy() { + // 清理资源 + } + + homeContent(filter) { + const classes = [ + {type_id: '1', type_name: '番剧'}, + {type_id: '4', type_name: '国创'}, + {type_id: '2', type_name: '电影'}, + {type_id: '5', type_name: '电视剧'}, + {type_id: '3', type_name: '纪录片'}, + {type_id: '7', type_name: '综艺'} + ]; + + return { + class: classes + }; + } + + homeVideoContent() { + return {list: []}; + } + + async categoryContent(tid, pg, filter, extend) { + try { + const page = parseInt(pg) || 1; + let url = ''; + + if (['1', '4'].includes(tid)) { + url = `https://api.bilibili.com/pgc/web/rank/list?season_type=${tid}&pagesize=20&page=${page}&day=3`; + } else { + url = `https://api.bilibili.com/pgc/season/rank/web/list?season_type=${tid}&pagesize=20&page=${page}&day=3`; + } + + const headers = {...this.headers}; + if (this.cookie) { + headers.Cookie = this.cookie; + } + + const response = await this.fetch(url, {}, headers); + const data = response.data || {}; + + const videos = []; + if (data.code === 0) { + const vodList = data.result ? data.result.list : (data.data ? data.data.list : []); + + for (const vod of vodList) { + const title = vod.title ? vod.title.trim() : ''; + if (title.includes('预告')) { + continue; + } + + const remark = vod.new_ep ? vod.new_ep.index_show : vod.index_show; + + // 处理封面图片 + let cover = vod.cover || ''; + if (cover && cover.startsWith('//')) { + cover = 'https:' + cover; + } + + videos.push({ + vod_id: vod.season_id ? vod.season_id.toString() : '', + vod_name: title, + vod_pic: cover, + vod_remarks: remark || '' + }); + } + } + + return { + list: videos, + page: page, + pagecount: videos.length === 20 ? page + 1 : page, + limit: 20, + total: 9999 + }; + + } catch (error) { + console.error(`categoryContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + formatCount(num) { + if (num > 1e8) return (num / 1e8).toFixed(2) + '亿'; + if (num > 1e4) return (num / 1e4).toFixed(2) + '万'; + return num.toString(); + } + + async detailContent(ids) { + try { + const seasonId = ids[0]; + + const headers = {...this.headers}; + if (this.cookie) { + headers.Cookie = this.cookie; + } + + const url = `https://api.bilibili.com/pgc/view/web/season?season_id=${seasonId}`; + const response = await this.fetch(url, {}, headers); + const data = response.data || {}; + + if (data.code !== 0) { + return {list: []}; + } + + const res = data.result; + const stat = res.stat || {}; + + // 处理封面图片 + let cover = res.cover || ''; + if (cover && cover.startsWith('//')) { + cover = 'https:' + cover; + } + + const vod = { + vod_id: res.season_id ? res.season_id.toString() : '', + vod_name: res.title || '', + vod_pic: cover, + type_name: res.share_sub_title || res.type_name || '', + vod_year: res.publish && res.publish.pub_time ? res.publish.pub_time.substr(0, 4) : '', + vod_area: res.areas && res.areas.length > 0 ? res.areas[0].name : '', + vod_actor: `点赞:${this.formatCount(stat.likes || 0)} 投币:${this.formatCount(stat.coins || 0)}`, + vod_content: res.evaluate || res.new_ep?.desc || '', + vod_director: res.rating ? `评分:${res.rating.score}` : '暂无评分', + vod_play_from: '哔哩哔哩', + vod_play_url: '' + }; + + // 过滤预告片,构建播放列表 + const episodes = (res.episodes || []).filter(ep => !ep.title.includes('预告')); + const playUrls = []; + + for (const ep of episodes) { + const title = `${ep.title.replace(/#/g, '-')} ${ep.long_title || ''}`; + const playId = `${res.season_id}_${ep.id}_${ep.cid}`; + playUrls.push(`${title}$${playId}`); + } + + vod.vod_play_url = playUrls.join('#'); + + return {list: [vod]}; + + } catch (error) { + console.error(`detailContent error: ${error.message}`); + return {list: []}; + } + } + + async searchContent(key, quick, pg = '1') { + try { + const page = parseInt(pg) || 1; + const encodedKeyword = encodeURIComponent(key); + const searchTypes = ['media_bangumi', 'media_ft']; + + const headers = {...this.headers}; + if (this.cookie) { + headers.Cookie = this.cookie; + } + + const allVideos = []; + + for (const type of searchTypes) { + try { + const url = `https://api.bilibili.com/x/web-interface/search/type?search_type=${type}&keyword=${encodedKeyword}&page=${page}`; + const response = await this.fetch(url, {}, headers); + const data = response.data || {}; + + if (data.code === 0 && data.data && data.data.result) { + for (const vod of data.data.result) { + const title = vod.title ? vod.title.replace(/<[^>]+>/g, '') : ''; + if (title.includes('预告')) { + continue; + } + + // 处理封面图片 + let cover = vod.cover || ''; + if (cover && cover.startsWith('//')) { + cover = 'https:' + cover; + } + + allVideos.push({ + vod_id: vod.season_id ? vod.season_id.toString() : '', + vod_name: title, + vod_pic: cover, + vod_remarks: vod.index_show || '' + }); + } + } + } catch (searchError) { + console.error(`搜索类型 ${type} 失败: ${searchError.message}`); + } + } + + return { + list: allVideos, + page: page, + pagecount: allVideos.length > 0 ? page + 1 : page, + limit: 20, + total: allVideos.length + }; + + } catch (error) { + console.error(`searchContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async playerContent(flag, id, vipFlags) { + try { + // 哔哩哔哩有自己的解析逻辑,直接返回播放链接 + // 格式:seasonId_epId_cid + const parts = id.split('_'); + if (parts.length < 3) { + throw new Error('无效的播放ID格式'); + } + + const seasonId = parts[0]; + const epId = parts[1]; + const cid = parts[2]; + + // 构建播放链接(原版B站链接) + const playUrl = `https://www.bilibili.com/bangumi/play/ep${epId}`; + + // 调用壳子超级解析 + const playData = { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '哔哩哔哩', + url: playUrl, + header: JSON.stringify({ + 'User-Agent': this.headers['User-Agent'], + 'Referer': 'https://www.bilibili.com', + 'Origin': 'https://www.bilibili.com', + 'Cookie': this.cookie || '' + }) + }; + + return playData; + + } catch (error) { + console.error(`playerContent error: ${error.message}`); + // 即使出错也返回超级解析参数 + return { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '哔哩哔哩', + url: id.includes('_') ? `https://www.bilibili.com/bangumi/play/ep${id.split('_')[1]}` : id, + header: JSON.stringify(this.headers) + }; + } + } + + localProxy(param) { + return null; + } +} + + +export default new Spider(); \ No newline at end of file diff --git "a/spider/catvod/\345\226\234\345\210\267\345\210\267.js" "b/spider/catvod/\345\226\234\345\210\267\345\210\267.js" new file mode 100644 index 00000000..c3fd1380 --- /dev/null +++ "b/spider/catvod/\345\226\234\345\210\267\345\210\267.js" @@ -0,0 +1,173 @@ +/* +@header({ + searchable: 0, + filterable: 0, + quickSearch: 0, + title: '喜刷刷', + lang: 'cat' +}) +*/ + +async function init(cfg) { +} + +async function home(filter, param) { + let classes = [ + { + type_id: 'shua', + type_name: '测试示例', + type_flag: '0-00-S' + }, + ]; + + return {class: classes}; +} + +async function homeVod(params) { + return null; +} + +async function category(tid, pg, filter, extend) { + if (pg > 1) return null; + + const videos = [ + { + vod_id: '美颜怪$美颜怪', + vod_name: '美颜怪', + vod_pic: 'https://vcg05.cfp.cn/creative/vcg/nowarter800/new/VCG41N910289498.jpg' + }, + { + vod_id: '短视频$https://v.api.aa1.cn/api/api-vs/index.php', + vod_name: '短视频', + vod_pic: 'https://vcg05.cfp.cn/creative/vcg/nowarter800/new/VCG41N910289498.jpg' + }, + { + vod_id: '酷音视频$https://api.suyanw.cn/api/kysp.php', + vod_name: '酷音视频', + vod_pic: ' https://vcg05.cfp.cn/creative/vcg/nowarter800/new/VCG41N910289498.jpg' + }, + { + vod_id: '刷刷刷1$http://xjj2.716888.xyz/fenlei/mvmn/mvmn.php', + vod_name: '刷刷刷1', + vod_pic: 'clan://assets/collect.png?bg=1' + }, + { + vod_id: '刷刷刷2$https://www.hhlqilongzhu.cn/api/MP4_xiaojiejie.php', + vod_name: '刷刷刷2', + vod_pic: 'clan://assets/collect.png?bg=2' + }, + { + vod_id: '刷刷刷3$http://api.cc1990.cc/api/video/ks_xjj', + vod_name: '刷刷刷3', + vod_pic: 'clan://assets/collect.png?bg=3' + }, + { + vod_id: '刷刷刷4$http://av.npcq.cn/pc.php', + vod_name: '刷刷刷4', + vod_pic: 'clan://assets/collect.png?bg=4' + }, + { + vod_id: '刷刷刷5$https://av.npcq.cn/api.php?action=next_video', + vod_name: '刷刷刷5', + vod_pic: 'clan://assets/collect.png?bg=5' + }, + ]; + + return {list: videos}; +} + +async function detail(tid) { + const vod = { + vod_id: tid, + vod_name: tid.split('\$')[0], + vod_play_from: "测试", + vod_play_url: tid, + vod_tag: '[SHUA]' + }; + + return {list: [vod]}; +} + +async function play(flag, id, flags) { + if (id == '美颜怪') { + return await 美颜怪(); + } + + let url = id; + let title = ''; + let res = req(url, { + method: 'GET', + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36', + }, + redirect: 0 + }); + + if (res.headers.location) { + id = res.headers.location; + } else { + try { + const d = JSON.parse(res.content); + url = d.url ? d.url : d.video_url ? d.video_url : url; + title = d.title ? d.title : ''; + } catch (e) { + } + } + return { + parse: 0, + url: url, + header: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36' + }, + shuaTitle: title, + errorPlayNext: true + }; +} + +async function 美颜怪() { + + let pg = getRnd(1, 30000); + + const res = await req('http://81.70.181.238/hot_video/getList', { + method: 'POST', + body: `page=${pg}&limit=1&sign=${getSign(pg)}&device_id=ffffffff-ca78-c55b-ca78-c55b00000000&auth_code=NotLogin&pro_id=2`, + postType: 'form' + }); + + const d = JSON.parse(res.content); + + return { + parse: 0, + url: d.data.list[0].src, + errorPlayNext: true + }; +} + +function getSign(pg) { + let txt = "limit=30&page=" + pg + "&key=f6113acb6573d8b98502335e06f0c857"; + let sign = md5X(txt).toUpperCase(); + return sign; +} + +/* 生成指定范围的随机数(最小数,最大数,进制数, 是否大写)*/ +function getRnd(min, max, hexNum, isUpper) { + var r = parseInt(Math.random() * (max - min + 1) + min, 10); + if (hexNum) { + if (isUpper) + r = r.toString(hexNum).toUpperCase(); + else + r = r.toString(hexNum); + } + return r; +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + }; +} \ No newline at end of file diff --git "a/spider/catvod/\345\227\267\345\221\234\345\212\250\346\274\253[\346\274\253].js" "b/spider/catvod/\345\227\267\345\221\234\345\212\250\346\274\253[\346\274\253].js" new file mode 100644 index 00000000..9f9ded18 --- /dev/null +++ "b/spider/catvod/\345\227\267\345\221\234\345\212\250\346\274\253[\346\274\253].js" @@ -0,0 +1,321 @@ +/* +title: '嗷呜动漫', author: '小可乐/v6.1.1' +说明:可以不写ext,也可以写ext,ext支持的参数和格式参数如下 +"ext": { + "host": "xxxx", //站点网址 + "timeout": 6000 //请求超时,单位毫秒 +} +@header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '嗷呜动漫[漫]', + lang: 'cat' +}) +*/ +import {Crypto} from 'assets://js/lib/cat.js'; + +const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36'; +const DefHeader = {'User-Agent': MOBILE_UA}; +var HOST; +var KParams = { + headers: {'User-Agent': MOBILE_UA}, + timeout: 5000 +}; + +async function init(cfg) { + try { + HOST = (cfg.ext?.host?.trim() || 'https://www.aowu.tv').replace(/\/$/, ''); + KParams.headers['Referer'] = HOST; + let parseTimeout = parseInt(cfg.ext?.timeout?.trim(), 10); + KParams.timeout = parseTimeout > 0 ? parseTimeout : 5000; + } catch (e) { + console.error('初始化参数失败:', e.message); + } +} + +async function home(filter) { + try { + let kclassName = '新番$20&番剧$21&剧场$22'; + let classes = kclassName.split('&').map(item => { + let [cName, cId] = item.split('$'); + return {type_name: cName, type_id: cId}; + }); + let filters = {}; + try { + const nameObj = { class: 'class,剧情', year: 'year,年份', by: 'by,排序' }; + const flValues = { class: ['搞笑','恋爱','校园','后宫','治愈','日常','原创','战斗','百合','BL','卖肉','漫画改','游戏改','异世界','泡面番','轻小说改','OVA','OAD','京阿尼','芳文社','A-1Pictures','CloverWorks','J.C.STAFF','动画工房','SUNRISE','Production.I.G','MADHouse','BONES','P.A.WORKS','SHAFT','MAPPA','ufotable','TRIGGER','WITSTUDIO'], year: ['2026','2025','2024','2023','2022','2021','2020','2019','2018','2017','2016','2015','2014','2013','2012','2011','2010','2009','2008','2007','2006','2005','2004','2003','2002','2001','2000','1999','1998','1997','1996','1995','1994','1993','1992','1991','1990'], by: ['按最新,time', '按最热,hits', '按评分,score'] }; + for (let item of classes) { + filters[item.type_id] = Object.entries(nameObj).map(([nObjk, nObjv]) => { + let [kkey, kname] = nObjv.split(','); + let fvalue = flValues[nObjk] || []; + if (item.type_id === '20' && nObjk === 'year') {fvalue = fvalue.slice(0, 2);} + let kvalue = fvalue.map(it => { + let [n, v] = [it, it]; + if (nObjk === 'by') {[n, v] = it.split(',');} + return {n: n, v: v}; + }); + if (nObjk !== 'by') {kvalue.unshift({n: '全部', v: ''});} + return {key: kkey, name: kname, value: kvalue}; + }).filter(flt => flt.key && flt.value.length > 1); + } + } catch (e) { + filters = {}; + } + return JSON.stringify({class: classes, filters: filters}); + } catch (e) { + console.error('获取分类失败:', e.message); + return JSON.stringify({class: [], filters: {}}); + } +} + +async function homeVod() { + try { + let homeUrl = HOST; + let resHtml = await request(homeUrl); + let VODS = getVodList(resHtml, true); + return JSON.stringify({list: VODS}); + } catch (e) { + console.error('推荐页获取失败:', e.message); + return JSON.stringify({list: []}); + } +} + +async function category(tid, pg, filter, extend) { + try { + pg = parseInt(pg, 10); + pg = pg > 0 ? pg : 1; + let cateBody = `type=${tid}&class=${extend?.class ?? ''}&year=${extend?.year ?? ''}&by=${extend?.by ?? ''}&page=${pg}`; + let cateUrl = `${HOST}/index.php/ds_api/vod`; + let resObj = safeParseJSON(await request(cateUrl, { + headers: {...KParams.headers, 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'}, + method: 'POST', + body: cateBody + })); + if (!resObj) {throw new Error('源码对象为空');} + let VODS = []; + let listArr = Array.isArray(resObj.list) ? resObj.list : []; + for (let it of listArr) { + let kname = it.vod_name || '名称'; + let kpic = it.vod_pic || '图片'; + let kremarks = `${it.vod_remarks || '状态'}|${it.vod_douban_score || '无评分'}`; + let kyear = extend?.year || ''; + let kid = it.url ?? 'Id'; + VODS.push({ + vod_name: kname, + vod_pic: kpic, + vod_remarks: kremarks, + vod_year: kyear, + vod_id: `${kid}@${kname}@${kpic}@${kremarks}` + }); + } + let {pagecount=1000, limit=30, total=30000} = resObj; + return JSON.stringify({list: VODS, page: pg, pagecount: pagecount, limit: 30, total: total}); + } catch (e) { + console.error('类别页获取失败:', e.message); + return JSON.stringify({list: [], page: 1, pagecount: 0, limit: 30, total: 0}); + } +} + +async function search(wd, quick, pg) { + try { + pg = parseInt(pg, 10); + pg = pg > 0 ? pg : 1; + let searchUrl = `${HOST}/search/${wd}----------${pg}---.html`; + let resHtml = await request(searchUrl); + let VODS = getVodList(resHtml); + return JSON.stringify({list: VODS, page: pg, pagecount: 10, limit: 30, total: 300}); + } catch (e) { + console.error('搜索页获取失败:', e.message); + return JSON.stringify({list: [], page: 1, pagecount: 0, limit: 30, total: 0}); + } +} + +function getVodList(khtml, rec = false) { + try { + if (!khtml) {throw new Error('源码为空');} + let kvods = []; + let selector = rec ? '.public-list-box' : '.search-list'; + let listArr = pdfa(khtml, selector); + for (let it of listArr) { + let kname = cutStr(it, 'alt="', '"', '名称'); + let kpic = cutStr(it, 'data-src="', '"', '图片'); + let kremarks = rec ? `${cutStr(it, 'public-prt£>', '<', '类型')}|${cutStr(it, 'ft2">', '<', '状态')}` : cutStr(it, 'this-wap">', '', '状态'); + let kid = cutStr(it, 'href="', '"', 'Id'); + kvods.push({ + vod_name: kname, + vod_pic: kpic, + vod_remarks: kremarks, + vod_id: `${kid}@${kname}@${kpic}@${kremarks}` + }); + } + return kvods; + } catch (e) { + console.error(`生成视频列表失败:`, e.message); + return []; + } +} + +async function detail(ids) { + try { + let [id, kname, kpic, kremarks] = ids.split('@'); + let detailUrl = !/^http/.test(id) ? `${HOST}${id}` : id; + let resHtml = await request(detailUrl); + if (!resHtml) {throw new Error('源码为空');} + let intros = cutStr(resHtml, 'search-show', '
    ', '', false); + let ktabs = pdfa(resHtml, '.anthology-tab&&a').map((it,idx) => cutStr(it, '', '<', `线路${idx+1}`)); + let kurls = pdfa(resHtml, '.anthology-list-play').map(item => { + return pdfa(item, 'a').map(it => { return `${cutStr(it, '>', '<', 'noEpi')}$${cutStr(it, 'href="', '"', 'noUrl')}` }).join('#'); + }); + let VOD = { + vod_id: detailUrl, + vod_name: kname, + vod_pic: kpic, + type_name: cutStr(intros, '类型:', '', '类型'), + vod_remarks: `${cutStr(intros, '状态:', '', '状态')}|${cutStr(intros, '更新:', '', '更新')}`, + vod_year: cutStr(intros, '年份:', '', '1000'), + vod_area: cutStr(intros, '地区:', '', '地区'), + vod_lang: cutStr(intros, '语言:', '', '语言'), + vod_director: cutStr(intros, '导演:', '', '').replace(/,$/, '') || '导演', + vod_actor: cutStr(intros, '主演:', '', '').replace(/,$/, '') || '主演', + vod_content: cutStr(intros, '简介:', '', '') || kname, + vod_play_from: ktabs.join('$$$'), + vod_play_url: kurls.join('$$$') + }; + return JSON.stringify({list: [VOD]}); + } catch (e) { + console.error('详情页获取失败:', e.message); + return JSON.stringify({list: []}); + } +} + +async function play(flag, ids, flags) { + try { + let playUrl = !/^http/.test(ids) ? `${HOST}${ids}` : ids; + let kp = 0, kurl = ''; + let resHtml = await request(playUrl); + let codeObj = safeParseJSON(cutStr(resHtml, 'var player_£=', '<', '', false)); + let jurl = codeObj?.url ?? ''; + jurl = safeUrlDecode(safeB64Decode(jurl)); + if (jurl) { + jurl = `${HOST}/player/?url=${jurl}&next=`; + resHtml = await request(jurl); + let encryptedUrl = cutStr(resHtml, 'const encryptedUrl = "', '"', ''); + let sessionKey = cutStr(resHtml, 'const sessionKey = "', '"', ''); + kurl = urlAesDecrypt(encryptedUrl, sessionKey); + } + if (!/^http/.test(kurl)) { + kurl = playUrl; + kp = 1; + } + return JSON.stringify({jx: 0, parse: kp, url: kurl, header: DefHeader}); + } catch (e) { + console.error('播放失败:', e.message); + return JSON.stringify({jx: 0, parse: 0, url: '', header: {}}); + } +} + +function urlAesDecrypt(ciphertext, key) { + try { + const rawData = Crypto.enc.Base64.parse(ciphertext); + const keyWordArr = Crypto.enc.Utf8.parse(key); + const ivWordArr = Crypto.lib.WordArray.create(rawData.words.slice(0, 4)); + const encrypted = Crypto.lib.WordArray.create(rawData.words.slice(4)); + const decrypted = Crypto.AES.decrypt( { ciphertext: encrypted }, keyWordArr, + { + iv: ivWordArr, + mode: Crypto.mode.CBC, + padding: Crypto.pad.Pkcs7 + } + ); + return decrypted.toString(Crypto.enc.Utf8); + } catch (e) { + return ''; + } +} + +function safeB64Decode(b64Str) { + try {return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(b64Str));} catch (e) {return '';} +} + +function safeUrlDecode(urlStr) { + try {return decodeURIComponent(urlStr);} catch (e) {return '';} +} + +function safeParseJSON(jStr) { + try {return JSON.parse(jStr);} catch (e) {return null;} +} + +function cutStr(str, prefix = '', suffix = '', defaultVal = 'cutFaile', clean = true, i = 1, all = false) { + try { + if (typeof str !== 'string' || !str) {throw new Error('被截取对象需为非空字符串');} + const cleanStr = cs => String(cs).replace(/<[^>]*?>/g, ' ').replace(/( |\u00A0|\s)+/g, ' ').trim().replace(/\s+/g, ' '); + const esc = s => String(s).replace(/[.*+?${}()|[\]\\/^]/g, '\\$&'); + let pre = esc(prefix).replace(/£/g, '[^]*?'), end = esc(suffix); + let regex = new RegExp(`${pre ? pre : '^'}([^]*?)${end ? end : '$'}`, 'g'); + let matchIterator = str.matchAll(regex); + if (all) { + let matchArr = [...matchIterator]; + return matchArr.length ? matchArr.map(it => { + const val = it[1] ?? defaultVal; + return clean && val !== defaultVal ? cleanStr(val) : val; + }) : [defaultVal]; + } + i = parseInt(i, 10); + if (isNaN(i) || i < 1) {throw new Error('序号必须为正整数');} + let tgIdx = i - 1,matchIdx = 0; + for (const match of matchIterator) { + if (matchIdx++ === tgIdx) { + const result = match[1] ?? defaultVal; + return clean && result !== defaultVal ? cleanStr(result) : result; + } + } + return defaultVal; + } catch (e) { + console.error(`字符串截取失败:`, e.message); + return all ? ['cutErr'] : 'cutErr'; + } +} + +async function request(reqUrl, options = {}) { + try { + if (typeof reqUrl !== 'string' || !reqUrl.trim()) { throw new Error('reqUrl需为字符串且非空'); } + if (typeof options !== 'object' || Array.isArray(options) || options === null) { throw new Error('options类型需为非null对象'); } + options.method = options.method?.toUpperCase() || 'GET'; + if (['GET', 'HEAD'].includes(options.method)) { + delete options.body; + delete options.data; + delete options.postType; + } + let {headers, timeout, buffer, ...restOpts} = options; + const optObj = { + headers: (typeof headers === 'object' && !Array.isArray(headers) && headers) ? headers : KParams.headers, + timeout: parseInt(timeout, 10) > 0 ? parseInt(timeout, 10) : KParams.timeout, + buffer: buffer ?? 0, + ...restOpts + }; + const res = await req(reqUrl, optObj); + if (options.withHeaders) { + const resHeaders = typeof res.headers === 'object' && !Array.isArray(res.headers) && res.headers ? res.headers : {}; + const resWithHeaders = { ...resHeaders, body: res?.content ?? '' }; + return JSON.stringify(resWithHeaders); + } + return res?.content ?? ''; + } catch (e) { + console.error(`${reqUrl}→请求失败:`, e.message); + return options?.withHeaders ? JSON.stringify({ body: '' }) : ''; + } +} + +export function __jsEvalReturn() { + return { + init, + home, + homeVod, + category, + search, + detail, + play, + proxy: null + }; +} \ No newline at end of file diff --git "a/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" "b/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" new file mode 100644 index 00000000..478e4b10 --- /dev/null +++ "b/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" @@ -0,0 +1,290 @@ +/** + * 央视大全 - 猫影视/TVBox JS爬虫格式 + * 继承BaseSpider类 + @header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '央央[官]', + lang: 'cat' + }) + */ + +class Spider extends BaseSpider { + + constructor() { + super(); + this.host = 'https://api.cntv.cn'; + this.siteName = '央视大全'; + this.sessionStore = {}; + this.videoCache = {}; + + this.headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Referer": "https://tv.cctv.com", + "Accept": "application/json, text/plain, */*", + "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8" + }; + } + + init(extend = "") { + return ""; + } + + getName() { + return this.siteName; + } + + isVideoFormat(url) { + return url.includes('.m3u8') || url.includes('.mp4'); + } + + manualVideoCheck() { + return false; + } + + destroy() { + this.sessionStore = {}; + this.videoCache = {}; + } + + homeContent(filter) { + const categories = [ + {type_id: "栏目大全", type_name: "栏目大全"}, + {type_id: "特别节目", type_name: "特别节目"}, + {type_id: "纪录片", type_name: "纪录片"}, + {type_id: "电视剧", type_name: "电视剧"}, + {type_id: "动画片", type_name: "动画片"} + ]; + + return {class: categories}; + } + + async homeVideoContent() { + // 央视首页推荐 + return {list: []}; + } + + async categoryContent(tid, pg, filter, extend) { + try { + const page = parseInt(pg) || 1; + const videos = []; + + const channelMap = { + "特别节目": "CHAL1460955953877151", + "纪录片": "CHAL1460955924871139", + "电视剧": "CHAL1460955853485115", + "动画片": "CHAL1460955899450127", + }; + + let filterObj = {}; + if (extend && typeof extend === 'object') { + filterObj = extend; + } + + if (tid === '栏目大全') { + const url = `${this.host}/lanmu/columnSearch?&fl=&fc=&cid=&p=${page}&n=20&serviceId=tvcctv&t=json`; + const response = await this.fetch(url, {}, this.headers); + const data = response.data; + + if (data && data.response && data.response.docs) { + const docs = data.response.docs; + docs.forEach(it => { + videos.push({ + vod_id: `${it.lastVIDE.videoSharedCode}|${it.column_firstclass}|${it.column_name}|${it.channel_name}|${it.column_brief}|${it.column_logo}|${it.lastVIDE.videoTitle}|栏目大全`, + vod_name: it.column_name, + vod_pic: it.column_logo, + vod_remarks: it.channel_name, + vod_content: '' + }); + }); + } + } else { + // 处理筛选参数 + let fl_url = `&channelid=${channelMap[tid] || ''}&fc=${encodeURIComponent(tid)}`; + if (filterObj.channel) fl_url += `&channel=${encodeURIComponent(filterObj.channel)}`; + if (filterObj.sc) fl_url += `&sc=${encodeURIComponent(filterObj.sc)}`; + if (filterObj.year) fl_url += `&year=${filterObj.year}`; + + const url = `${this.host}/list/getVideoAlbumList?${fl_url}&area=&letter=&n=24&serviceId=tvcctv&t=json&p=${page}`; + const response = await this.fetch(url, {}, this.headers); + const data = response.data; + + if (data && data.data && data.data.list) { + const dataList = data.data.list; + dataList.forEach(it => { + videos.push({ + vod_id: `${it.id}|${it.sc}|${it.title}|${it.channel}|${it.brief}|${it.image}|${it.count}|${tid}`, + vod_name: it.title, + vod_pic: it.image, + vod_remarks: `${it.sc}${it.year ? '·' + it.year : ''}`, + vod_content: it.brief || '' + }); + }); + } + } + + return { + list: videos, + page: page, + pagecount: 9999, + limit: 20, + total: 999999 + }; + + } catch (error) { + console.error(`categoryContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async detailContent(ids) { + try { + const id = ids[0]; + if (!id) return {list: []}; + + // 检查缓存 + const cacheKey = `detail_${id}`; + if (this.videoCache[cacheKey]) { + return {list: [this.videoCache[cacheKey]]}; + } + + const info = id.split("|"); + // ID 结构: 0:id, 1:sc, 2:title, 3:channel, 4:brief, 5:image, 6:count/remark, 7:cate + + const cate = info[7]; + const ctid = info[0]; + const modeMap = { + "特别节目": "0", + "纪录片": "0", + "电视剧": "0", + "动画片": "1" + }; + + // 获取选集列表 + let playUrls = []; + const mode = modeMap[cate] || '0'; + const albumUrl = `${this.host}/NewVideo/getVideoListByAlbumIdNew?id=${ctid}&serviceId=tvcctv&p=1&n=100&mode=${mode}&pub=1`; + + const response = await this.fetch(albumUrl, {}, this.headers); + const data = response.data; + + if (data.errcode === '1001') { + // 需要获取真实的ctid + const videoInfoUrl = `${this.host}/video/videoinfoByGuid?guid=${ctid}&serviceId=tvcctv`; + const vInfoRes = await this.fetch(videoInfoUrl, {}, this.headers); + const vInfoData = vInfoRes.data; + const realCtid = vInfoData.ctid; + + const columnUrl = `${this.host}/NewVideo/getVideoListByColumn?id=${realCtid}&d=&p=1&n=100&sort=desc&mode=0&serviceId=tvcctv&t=json`; + const colRes = await this.fetch(columnUrl, {}, this.headers); + const colData = colRes.data; + playUrls = colData.data?.list || []; + } else { + playUrls = data.data?.list || []; + } + + // 构建播放列表 + const playList = []; + if (playUrls.length > 0) { + for (const item of playUrls) { + const title = item.title || `第${item.index || '?'}集`; + const cleanTitle = title.replace(/\$/g, ''); + const guid = item.guid || ''; + playList.push(`${cleanTitle}$${guid}`); + } + } + + const vod = { + vod_id: id, + vod_name: info[2] || '', + vod_pic: info[5] || '', + type_name: info[1] || '', + vod_year: '', + vod_area: '', + vod_remarks: info[6] ? `共${info[6]}集` : '', + vod_actor: '', + vod_director: '', + vod_content: info[4] || '', + vod_play_from: playList.length > 0 ? '央视频' : '', + vod_play_url: playList.length > 0 ? playList.join('#') : '' + }; + + // 缓存结果 + this.videoCache[cacheKey] = vod; + + return {list: [vod]}; + + } catch (error) { + console.error(`detailContent error: ${error.message}`); + return {list: []}; + } + } + + async searchContent(key, quick, pg = "1") { + // CCTV搜索接口较复杂,这里返回空结果 + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + + async playerContent(flag, id, vipFlags) { + try { + // 央视视频采用直接播放的方式 + // 根据GUID拼接m3u8地址 + let playUrl = `https://cntv.playdreamer.cn/proxy/asp/hls/2000/0303000a/3/default/${id}/2000.m3u8`; + + // 也可以尝试其他格式 + // playUrl = `https://hls.cntv.myalicdn.com/asp/hls/2000/0303000a/3/default/${id}/2000.m3u8`; + + return { + parse: 0, // 0表示直接播放,不需要解析 + jx: 0, // 0表示不解析 + url: playUrl, + header: JSON.stringify({ + 'User-Agent': this.headers['User-Agent'], + 'Referer': 'https://tv.cctv.com', + 'Origin': 'https://tv.cctv.com' + }) + }; + + } catch (error) { + console.error(`playerContent error: ${error.message}`); + return { + parse: 0, + jx: 0, + url: id, + header: JSON.stringify(this.headers) + }; + } + } + + localProxy(param) { + return null; + } + + // 辅助方法:安全获取对象属性 + getSafe(obj, path, defaultValue = '') { + if (!obj || typeof obj !== 'object') return defaultValue; + try { + return path.split('.').reduce((o, key) => { + if (o == null) return defaultValue; + return o[key]; + }, obj) ?? defaultValue; + } catch { + return defaultValue; + } + } +} + +export default new Spider(); \ No newline at end of file diff --git "a/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" "b/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" new file mode 100644 index 00000000..89ce8472 --- /dev/null +++ "b/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" @@ -0,0 +1,403 @@ +/** + * 爱奇艺视频 - 猫影视/TVBox JS爬虫格式 + * 调用壳子超级解析功能(壳子会自动读取json配置) + @header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '奇奇[官]', + lang: 'cat' + }) + */ + +class Spider extends BaseSpider { + + constructor() { + super(); + this.host = 'https://www.iqiyi.com'; + this.sessionStore = {}; + + this.headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Referer': 'https://www.iqiyi.com', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Accept-Encoding': 'gzip, deflate, br', + 'Connection': 'keep-alive' + }; + + // 分类配置 + this.classes = [ + {type_id: '1', type_name: '电影'}, + {type_id: '2', type_name: '电视剧'}, + {type_id: '6', type_name: '综艺'}, + {type_id: '4', type_name: '动漫'}, + {type_id: '3', type_name: '纪录片'}, + {type_id: '5', type_name: '音乐'}, + {type_id: '16', type_name: '网络电影'} + ]; + + // 筛选配置 + this.filters = { + '1': [{ + key: 'year', + name: '年代', + value: [{n: '全部', v: ''}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'}, {n: '2023', v: '2023'}] + }], + '2': [{ + key: 'year', + name: '年代', + value: [{n: '全部', v: ''}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'}, {n: '2023', v: '2023'}] + }] + }; + } + + init(extend = '') { + return ''; + } + + getName() { + return '爱奇艺视频'; + } + + isVideoFormat(url) { + return true; + } + + manualVideoCheck() { + return false; + } + + destroy() { + // 清理资源 + } + + homeContent(filter) { + const result = { + class: this.classes, + filters: this.filters + }; + + return result; + } + + homeVideoContent() { + return {list: []}; + } + + async categoryContent(tid, pg, filter, extend) { + try { + let channelId = tid; + let dataType = 1; + let extraParams = ""; + const page = parseInt(pg) || 1; + + if (tid === "16") { + channelId = "1"; + extraParams = "&three_category_id=27401"; + } else if (tid === "5") { + dataType = 2; + } + + // 处理筛选条件 + if (extend) { + let extendObj = {}; + if (typeof extend === 'string') { + try { + extendObj = JSON.parse(extend); + } catch (e) { + // 如果不是JSON,尝试解析为key=value格式 + extend.split('&').forEach(item => { + const [key, value] = item.split('='); + if (key && value) { + extendObj[key] = value; + } + }); + } + } else if (typeof extend === 'object') { + extendObj = extend; + } + + if (extendObj.year) { + extraParams += `&market_release_date_level=${extendObj.year}`; + } + } + + const url = `https://pcw-api.iqiyi.com/search/recommend/list?channel_id=${channelId}&data_type=${dataType}&page_id=${page}&ret_num=20${extraParams}`; + + const response = await this.fetch(url, {}, this.headers); + const jsonData = response.data; + + const videos = []; + if (jsonData.data && jsonData.data.list) { + for (const item of jsonData.data.list) { + const vid = `${item.channelId}$${item.albumId}`; + let remarks = ""; + + if (item.channelId === 1) { + remarks = item.score ? `${item.score}分` : ""; + } else if (item.channelId === 2 || item.channelId === 4) { + if (item.latestOrder && item.videoCount) { + remarks = item.latestOrder === item.videoCount ? + `${item.latestOrder}集全` : + `更新至${item.latestOrder}集`; + } else { + remarks = item.focus || ""; + } + } else { + remarks = item.period || item.focus || ""; + } + + videos.push({ + vod_id: vid, + vod_name: item.name, + vod_pic: item.imageUrl ? item.imageUrl.replace(".jpg", "_390_520.jpg") : "", + vod_remarks: remarks + }); + } + } + + return { + list: videos, + page: page, + pagecount: 9999, + limit: 20, + total: 999999 + }; + + } catch (error) { + console.error(`categoryContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async getPlaylists(channelId, albumId, data) { + let playlists = []; + const cid = parseInt(channelId || data.channelId || 0); + + try { + if (cid === 1 || cid === 5) { + // 电影或音乐 + if (data.playUrl) { + playlists.push({title: data.name || '正片', url: data.playUrl}); + } + } else if (cid === 6 && data.period) { + // 综艺 + let qs = data.period.toString().split("-")[0]; + let listUrl = `https://pcw-api.iqiyi.com/album/source/svlistinfo?cid=6&sourceid=${albumId}&timelist=${qs}`; + try { + const listResp = await this.fetch(listUrl, {}, this.headers); + const listJson = listResp.data; + if (listJson.data && listJson.data[qs]) { + listJson.data[qs].forEach(it => { + playlists.push({ + title: it.shortTitle || it.period || it.focus || `期${it.order}`, + url: it.playUrl + }); + }); + } + } catch (e) { + console.error(`综艺列表获取失败: ${e.message}`); + } + } else { + // 电视剧、动漫等 + let listUrl = `https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid=${albumId}&size=100&page=1`; + try { + const listResp = await this.fetch(listUrl, {}, this.headers); + const listJson = listResp.data; + + if (listJson.data && listJson.data.epsodelist) { + playlists = listJson.data.epsodelist.map(item => ({ + title: item.shortTitle || item.title || + (item.order ? `第${item.order}集` : `集${item.timelist}`), + url: item.playUrl || item.url || '' + })); + + // 处理分页 + const total = listJson.data.total; + if (total > 100) { + const totalPages = Math.ceil(total / 100); + for (let i = 2; i <= totalPages; i++) { + let nextUrl = `https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid=${albumId}&size=100&page=${i}`; + try { + const nextResp = await this.fetch(nextUrl, {}, this.headers); + const nextJson = nextResp.data; + if (nextJson.data && nextJson.data.epsodelist) { + playlists = playlists.concat(nextJson.data.epsodelist.map(item => ({ + title: item.shortTitle || item.title || + (item.order ? `第${item.order}集` : `集${item.timelist}`), + url: item.playUrl || item.url || '' + }))); + } + } catch (e) { + break; + } + } + } + } + } catch (e) { + console.error(`剧集列表获取失败: ${e.message}`); + } + } + } catch (error) { + console.error(`getPlaylists error: ${error.message}`); + } + + return playlists; + } + + async detailContent(ids) { + try { + const id = ids[0]; + let channelId = ""; + let albumId = id; + + if (id.includes('$')) { + const parts = id.split('$'); + channelId = parts[0]; + albumId = parts[1]; + } + + // 获取视频基本信息 + const infoUrl = `https://pcw-api.iqiyi.com/video/video/videoinfowithuser/${albumId}?agent_type=1&authcookie=&subkey=${albumId}&subscribe=1`; + const infoResp = await this.fetch(infoUrl, {}, this.headers); + const infoJson = infoResp.data; + const data = infoJson.data || {}; + + // 获取播放列表 + const playlists = await this.getPlaylists(channelId, albumId, data); + + // 构建播放地址 + const playUrls = []; + if (playlists.length > 0) { + for (const item of playlists) { + if (item.url) { + playUrls.push(`${item.title}$${item.url}`); + } + } + } + + const vod = { + vod_id: id, + vod_name: data.name || '未知标题', + type_name: data.categories ? data.categories.map(it => it.name).join(',') : '', + vod_year: data.formatPeriod || '', + vod_area: data.areas ? data.areas.map(it => it.name).join(',') : '', + vod_remarks: data.latestOrder ? + `更新至${data.latestOrder}集` : + (data.period || playlists.length > 0 ? `${playlists.length}集` : ''), + vod_actor: data.people && data.people.main_charactor ? + data.people.main_charactor.map(it => it.name).join(',') : '', + vod_director: data.people && data.people.director ? + data.people.director.map(it => it.name).join(',') : '', + vod_content: data.description || '暂无简介', + vod_pic: data.imageUrl ? data.imageUrl.replace(".jpg", "_480_270.jpg") : '', + vod_play_from: playUrls.length > 0 ? '爱奇艺视频' : '', + vod_play_url: playUrls.length > 0 ? playUrls.join('#') : '' + }; + + return {list: [vod]}; + + } catch (error) { + console.error(`detailContent error: ${error.message}`); + return {list: []}; + } + } + + async searchContent(key, quick, pg = '1') { + try { + const page = parseInt(pg) || 1; + const url = `https://search.video.iqiyi.com/o?if=html5&key=${encodeURIComponent(key)}&pageNum=${page}&pos=1&pageSize=20&site=iqiyi`; + + const response = await this.fetch(url, {}, this.headers); + const jsonData = response.data; + + const videos = []; + + if (jsonData.data && jsonData.data.docinfos) { + for (const item of jsonData.data.docinfos) { + if (item.albumDocInfo) { + const doc = item.albumDocInfo; + const channelId = doc.channel ? doc.channel.split(',')[0] : '0'; + videos.push({ + vod_id: `${channelId}$${doc.albumId}`, + vod_name: doc.albumTitle || '', + vod_pic: doc.albumVImage || '', + vod_remarks: doc.tvFocus || doc.year || '' + }); + } + } + } + + return { + list: videos, + page: page, + pagecount: 10, + limit: 20, + total: videos.length + }; + + } catch (error) { + console.error(`searchContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async playerContent(flag, id, vipFlags) { + try { + // 解析播放地址 + let playUrl = id; + if (id.includes('$')) { + playUrl = id.split('$')[1]; + } + + // 关键:调用壳子超级解析 + const playData = { + parse: 1, // 必须为1,表示需要解析 + jx: 1, // 必须为1,启用解析 + play_parse: true, // 启用播放解析 + parse_type: '壳子超级解析', + parse_source: '爱奇艺视频', + url: playUrl, // 原始爱奇艺链接 + header: JSON.stringify({ + 'User-Agent': this.headers['User-Agent'], + 'Referer': 'https://www.iqiyi.com', + 'Origin': 'https://www.iqiyi.com' + }) + }; + + return playData; + + } catch (error) { + console.error(`playerContent error: ${error.message}`); + // 即使出错也返回超级解析参数,让壳子处理 + return { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '爱奇艺视频', + url: id, + header: JSON.stringify(this.headers) + }; + } + } + + localProxy(param) { + return null; + } +} + +export default new Spider(); \ No newline at end of file diff --git "a/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" "b/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" new file mode 100644 index 00000000..ea5846fc --- /dev/null +++ "b/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" @@ -0,0 +1,365 @@ +/** + * 芒果TV - 猫影视JS爬虫格式(第二个版本) + * 调用壳子超级解析功能 + @header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '果果[官]', + lang: 'cat' + }) + */ + +class Spider extends BaseSpider { + + constructor() { + super(); + this.host = 'https://www.mgtv.com'; + this.headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', + 'Referer': 'https://www.mgtv.com/', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Accept-Encoding': 'gzip, deflate, br', + 'Connection': 'keep-alive' + }; + } + + init(extend = '') { + return ''; + } + + getName() { + return '芒果TV2'; + } + + isVideoFormat(url) { + return true; + } + + manualVideoCheck() { + return false; + } + + destroy() { + // 清理资源 + } + + homeContent(filter) { + const classes = [ + {type_id: '3', type_name: '电影'}, + {type_id: '2', type_name: '电视剧'}, + {type_id: '1', type_name: '综艺'}, + {type_id: '50', type_name: '动漫'}, + {type_id: '51', type_name: '纪录片'}, + {type_id: '115', type_name: '教育'}, + {type_id: '10', type_name: '少儿'} + ]; + + const filters = { + '3': [ + { + key: 'year', name: '年份', value: [ + {n: '全部', v: 'all'}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'}, + {n: '2023', v: '2023'}, {n: '2022', v: '2022'}, {n: '2021', v: '2021'}, + {n: '2020', v: '2020'}, {n: '2019', v: '2019'}, {n: '2010-2019', v: '2010-2019'}, + {n: '2000-2009', v: '2000-2009'} + ] + }, + { + key: 'sort', name: '排序', value: [ + {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'} + ] + } + ], + '2': [ + { + key: 'year', name: '年份', value: [ + {n: '全部', v: 'all'}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'}, + {n: '2023', v: '2023'}, {n: '2022', v: '2022'}, {n: '2021', v: '2021'}, + {n: '2020', v: '2020'} + ] + }, + { + key: 'sort', name: '排序', value: [ + {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'} + ] + } + ], + '1': [ + { + key: 'sort', name: '排序', value: [ + {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'} + ] + } + ], + '50': [ + { + key: 'sort', name: '排序', value: [ + {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'} + ] + } + ] + }; + + return { + class: classes, + filters: filters + }; + } + + homeVideoContent() { + return {list: []}; + } + + async categoryContent(tid, pg, filter, extend) { + try { + const page = parseInt(pg) || 1; + const baseUrl = 'https://pianku.api.mgtv.com/rider/list/pcweb/v3'; + + // 构建查询参数 + const params = { + platform: 'pcweb', + channelId: tid, + pn: page, + pc: '20', + hudong: '1', + _support: '10000000', + kind: 'a1', + area: 'a1' + }; + + // 处理筛选条件 + if (extend) { + if (extend.year && extend.year !== 'all') { + params.year = extend.year; + } + if (extend.sort) { + params.sort = extend.sort; + } + if (extend.chargeInfo) { + params.chargeInfo = extend.chargeInfo; + } + } + + const queryString = new URLSearchParams(params).toString(); + const url = `${baseUrl}?${queryString}`; + + const response = await this.fetch(url, {}, this.headers); + const json = response.data || {}; + + const videos = []; + if (json.data?.hitDocs && Array.isArray(json.data.hitDocs)) { + for (const item of json.data.hitDocs) { + videos.push({ + vod_id: item.playPartId || '', + vod_name: item.title || '', + vod_pic: item.img || '', + vod_remarks: item.updateInfo || item.rightCorner?.text || '' + }); + } + } + + return { + list: videos, + page: page, + pagecount: json.data?.totalPage || 999, + limit: 20, + total: json.data?.totalHit || 9999 + }; + + } catch (error) { + console.error(`categoryContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async detailContent(ids) { + try { + const videoId = ids[0]; + + // 获取视频基本信息 + const infoUrl = `https://pcweb.api.mgtv.com/video/info?video_id=${videoId}`; + const infoResponse = await this.fetch(infoUrl, {}, this.headers); + const infoData = infoResponse.data?.data?.info || {}; + + const vod = { + vod_id: videoId, + vod_name: infoData.title || '', + type_name: infoData.root_kind || '', + vod_actor: '', + vod_year: infoData.release_time || '', + vod_content: infoData.desc || '', + vod_remarks: infoData.time || '', + vod_pic: infoData.img || '', + vod_play_from: '芒果TV', + vod_play_url: '' + }; + + // 分页获取所有剧集 + const pageSize = 50; + let allEpisodes = []; + + try { + // 获取第一页,同时获取总页数 + const firstPageUrl = `https://pcweb.api.mgtv.com/episode/list?video_id=${videoId}&page=1&size=${pageSize}`; + const firstResponse = await this.fetch(firstPageUrl, {}, this.headers); + const firstData = firstResponse.data?.data || {}; + + if (firstData.list && Array.isArray(firstData.list)) { + allEpisodes = allEpisodes.concat(firstData.list); + const totalPages = firstData.total_page || 1; + + // 如果有多页,获取剩余页面 + if (totalPages > 1) { + const pagePromises = []; + for (let i = 2; i <= totalPages; i++) { + const pageUrl = `https://pcweb.api.mgtv.com/episode/list?video_id=${videoId}&page=${i}&size=${pageSize}`; + pagePromises.push(this.fetch(pageUrl, {}, this.headers)); + } + + const responses = await Promise.all(pagePromises); + for (const response of responses) { + const data = response.data?.data || {}; + if (data.list && Array.isArray(data.list)) { + allEpisodes = allEpisodes.concat(data.list); + } + } + } + } + } catch (episodeError) { + console.error(`获取剧集列表失败: ${episodeError.message}`); + } + + // 构建播放列表 + const playUrls = []; + if (allEpisodes.length > 0) { + // 过滤可播放的剧集(isIntact = 1) + const validEpisodes = allEpisodes.filter(item => + item.isIntact === "1" || item.isIntact === 1 + ); + + // 按集数排序 + validEpisodes.sort((a, b) => { + const orderA = parseInt(a.order) || 0; + const orderB = parseInt(b.order) || 0; + return orderA - orderB; + }); + + // 构建播放链接 + for (const item of validEpisodes) { + const name = item.t4 || item.t3 || item.title || `第${item.order || '?'}集`; + const playLink = item.url ? `https://www.mgtv.com${item.url}` : ''; + + if (playLink) { + playUrls.push(`${name}$${playLink}`); + } + } + } + + vod.vod_play_url = playUrls.join('#'); + + return {list: [vod]}; + + } catch (error) { + console.error(`detailContent error: ${error.message}`); + return {list: []}; + } + } + + async searchContent(key, quick, pg = '1') { + try { + const page = parseInt(pg) || 1; + const searchUrl = `https://mobileso.bz.mgtv.com/msite/search/v2?q=${encodeURIComponent(key)}&pn=${page}&pc=20`; + + const response = await this.fetch(searchUrl, {}, this.headers); + const json = response.data?.data || {}; + + const videos = []; + + if (json.contents && Array.isArray(json.contents)) { + for (const group of json.contents) { + if (group.type === 'media' && group.data && Array.isArray(group.data)) { + for (const item of group.data) { + if (item.source === 'imgo') { + // 提取视频ID + const match = item.url.match(/\/(\d+)\.html/); + if (match) { + videos.push({ + vod_id: match[1], + vod_name: item.title ? item.title.replace(/|<\/B>/g, '') : '', + vod_pic: item.img || '', + vod_remarks: item.desc ? item.desc.join(' ') : '' + }); + } + } + } + } + } + } + + return { + list: videos, + page: page, + pagecount: 10, + limit: 20, + total: videos.length + }; + + } catch (error) { + console.error(`searchContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async playerContent(flag, id, vipFlags) { + try { + // 调用壳子超级解析 + const playData = { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '芒果TV2', + url: id, + header: JSON.stringify({ + 'User-Agent': this.headers['User-Agent'], + 'Referer': 'https://www.mgtv.com', + 'Origin': 'https://www.mgtv.com' + }) + }; + + return playData; + + } catch (error) { + console.error(`playerContent error: ${error.message}`); + return { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '芒果TV2', + url: id, + header: JSON.stringify(this.headers) + }; + } + } + + localProxy(param) { + return null; + } +} + +export default new Spider(); \ No newline at end of file diff --git "a/spider/catvod/\347\225\252\350\214\204\346\274\253\347\224\273[\347\224\273].js" "b/spider/catvod/\347\225\252\350\214\204\346\274\253\347\224\273[\347\224\273].js" new file mode 100644 index 00000000..1afdc504 --- /dev/null +++ "b/spider/catvod/\347\225\252\350\214\204\346\274\253\347\224\273[\347\224\273].js" @@ -0,0 +1,252 @@ +/* +@header({ + searchable: 1, + filterable: 0, + quickSearch: 0, + title: '番茄漫画', + '类型': '漫画', + lang: 'ds' +}) +*/ +import cheerio from 'assets://js/lib/cheerio.min.js'; + +let HOST = 'https://qkfqapi.vv9v.cn'; +let UA = { + "User-Agent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36" +}; + +async function request(url, obj) { + if (!obj) { + obj = { + headers: UA, + timeout: 5000 + } + } + const response = await req(url, obj); + return response.content; +} + +function init(cfg) { + const ext = cfg.ext; + console.log('番茄漫画源初始化'); + console.log('初始化完成'); +} + +async function home(filter) { + try { + let html = await request('https://qkfqapi.vv9v.cn/api/discover/style?tab=漫画&source_type=男频'); + let json = JSON.parse(html); + let data = json.data; + let d = []; + data.forEach((it) => { + if (it.url && it.url.trim() !== '') { + d.push({ + type_name: it.title, + type_id: it.url, + }); + } + }); + return JSON.stringify({ + 'class': d + }); + } catch (error) { + console.log('home函数错误:', error); + } +} + + +async function homeVod(params) { + try { + let url = HOST + '/api/discover?tab=漫画&type=7&gender=2&genre_type=110&page=1'; + let html = await request(url); + let json = JSON.parse(html); + + if (json && json.data) { + let data = json.data.data || json.data; + let d = []; + + data.forEach((item) => { + if (item && item.book_name) { + d.push({ + vod_name: item.book_name, + vod_id: item.book_id || item.id, + vod_pic: item.thumb_url || item.cover, + vod_remarks: item.author || item.category || '', + vod_content: item.abstract || item.description || '' + }); + } + }); + + return JSON.stringify({ + list: d + }); + } + } catch (error) { + console.log('首页推荐请求错误:', error); + } +} + +async function category(tid, pg, filter, extend) { + try { + let url = tid; + let html = await request(url); + let json = JSON.parse(html); + + if (json && json.data) { + let data = json.data.data || json.data; + let d = []; + + data.forEach((item) => { + if (item && item.book_name) { + d.push({ + vod_name: item.book_name, + vod_id: item.book_id || item.id, + vod_pic: item.thumb_url || item.cover, + vod_remarks: item.author || item.category || '', + vod_content: item.abstract || item.description || '' + }); + } + }); + + if (d.length > 0) { + return JSON.stringify({ + list: d, + page: pg, + pagecount: 999, + limit: 20, + total: 999 + }); + } + } + } catch (error) { + console.log('分类请求错误:', error); + } +} + +async function detail(vod_url) { + try { + let detailUrl = HOST + '/api/detail?book_id=' + vod_url; + let json = JSON.parse(await request(detailUrl)); + + if (json?.data?.data) { + let data = json.data.data; + let vod = { + vod_name: data.book_name || '', + vod_id: vod_url, + type_name: data.category || '', + vod_pic: data.thumb_url || '', + vod_content: data.abstract || '', + vod_remarks: data.sub_info || '', + vod_director: data.author || '', + vod_play_from: '番茄漫画', + vod_play_url: '' + }; + + let chapterUrl = HOST + '/api/book?book_id=' + vod_url; + let chapterJson = JSON.parse(await request(chapterUrl)); + if (chapterJson?.data?.data) { + let bookInfo = chapterJson.data.data; + let list = bookInfo.chapterListWithVolume.flat(); + + let urls = []; + list.forEach((it) => { + if (it && it.title && it.itemId) { + urls.push(it.title + '$' + it.itemId + '@' + it.title); + } + }); + vod.vod_play_url = urls.join('#'); + } + + return JSON.stringify({list: [vod]}); + } + } catch (error) { + console.log('详情请求错误:', error); + } +} + +async function play(flag, id, flags) { + try { + let itemId = id; + let title = ''; + + if (id.includes('@')) { + let parts = id.split('@'); + itemId = parts[0]; + title = parts[1] || ''; + } + + let url = HOST + '/api/content?tab=漫画&item_id=' + itemId + '&show_html=0'; + let html = await request(url); + let json = JSON.parse(html); + let images = json.data.images; + images = pdfa(images, 'img'); + let pics = []; + images.forEach((img) => { + let pic = pdfh(img, 'img&&src'); + pics.push(pic); + }); + + if (pics.length > 0) { + return JSON.stringify({ + parse: 0, + url: 'pics://' + pics.join('&&') + }); + } + } catch (error) { + console.log('播放 请求错误:', error); + } +} + +async function search(wd, quick) { + try { + let searchUrl = HOST + '/api/search?key=' + encodeURIComponent(wd) + '&tab_type=8&offset=0'; + let html = await request(searchUrl); + let json = JSON.parse(html); + + if (json && json.data) { + let searchTabs = json.data.search_tabs || []; + let bookList = []; + + if (searchTabs.length > 3 && searchTabs[3].data) { + bookList = searchTabs[3].data; + } else if (json.data.data) { + bookList = json.data.data; + } + + let d = []; + bookList.forEach((item) => { + let book = item.book_data ? item.book_data[0] : item; + if (book && book.book_name) { + d.push({ + vod_name: book.book_name, + vod_id: book.book_id, + vod_pic: book.thumb_url || '', + vod_remarks: book.author || '', + vod_content: book.book_abstract || book.abstract || '' + }); + } + }); + + return JSON.stringify({ + list: d + }); + } + } catch (error) { + console.log('搜索请求错误:', error); + } +} + +function proxy(params) { + return [200, 'text/plain;charset=utf-8', '番茄漫画源代理测试', null]; +} + +export default { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search, + proxy: proxy, +} \ No newline at end of file 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 3b24d738..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 @@ }) */ -435F35785E45BA969DB95FC07396BBF327C50F94B452155A10B2127EB2743F686695A42CC071322F2A3F2D1F5DF8371791ED1331D3FC196192B1F5779953C4F0A74B825A27808280AF58BCEA6F33B6E1ADAD9A4FEA22075DE973CA16897BDFEE04A404065A3A4A9DF5598F7AD6F7312B612AF89D455139A6E96EE884F1D8D0404461A7D04472C01F875989C600C5C9B312189C7E05A8D06DE4EFC9C90E9626A577255A1BA848653FC669B7AEBBB00F15779981DF268A9FB202B853C63846F9220895F15EAA14568EBCEE1BC2CE35FF12BBC093E81BC02C4B57C6141ADC72B847C36F28028FF2BCD60D3AA72F6795DECC1A76CB2FF432D4DD66B253EF88909FC10E1FBFF1E7FD00ECDDA622B307053DA10648F23A133ED170B473B3DFE288C0219232673E5F11538B54534E9ED45A296E064C3FBBB1FA78DBAD5B7C42B2C286502F73421F3F448DC33E402961487AE257935734D0E20A2CB8037B47F2305DCDC5CB61AB7433D63150AC02AC258753EFED9E078291139039A81DD9E4EFD846D881724AE1A51228CD2D9E9D6896A63FF00479B9EF00BBC912F38FC624364BE0A1EE50BAECA4BA62D36D460EB0B70E4706EB787C62BF92D5B24629918C85EB2F0F914E58CD6759D248008B7388192A731530CC6E5CCBFA6B2C183114F6B099D7843510E012C2F7E09FDBA63EBF14AF321B293282997D1FB2B2199D350ABB235C7D4D4C40FE29993F5CE496AD45A26DBCB47527CCCCCC993BD007D29228BE3D813AD2B133390A39586B974FFFC524A9BFC96F68F9F295CB88A795AD7AD149E8139BE057244B9C2EF569AA1515845D22DE3654BF6B6149AAEDACCB9AFAA0B08FFA8B4104D3A2237FDBF6AAC3A1276C577C37113F3F411A8F6DEB33C2AD78341E9E9DD342EAD3FDD9D5546AF9381E50890249AD2E699F4E974D8808F8858E9B441373032693DE29ED770A0B9A35788A7C37E73922A0757471BEF52B8C0FEDADA03BE09A2DE1D222B5A2E20F0E56CF834BE8C7057F539D73728DBBBB6D06C79583CD86BB80B370A8EB643112C8234CE533FA48408B3BAA71DA651E566CAAF893F51FFF2F278041CA7EE421A03E96178BA38D585B168B4DC1FBBB4DBC855C425F74BA510A6E150175881E51ECD535EDC6B2C7C817CD5934C26A3486ACDB6C9E685D03B552DDD2D8D6D55903FF892B68C39097F05F422C27032D7CEADE1142C13C778291061E4F6F933B4795AA6DDAF057D5F4209AFEC7043F6F13C4B447BE11A7188BC439DF94D7F409BD7FDCBB726E213E02E78212620FD11599686CAF57D191B822BF6A2C3E4D387A3CAE2CE8F415DA13D83809908A9C9EEDBD797F8A6A3E0DFCDEFEE108B54E0155DEFF67291E2A850332634B28A28A213B5F4BA18B5F8AA5F0DD11558F32FDD9E78D15F67B04B91894EA8EB4F6506D60506C48B638ADF3CFB651590EE5AE5D869DA166CD23B634AF9A19AF1E5B70935CF0508EBA0D8F7A0D2B8321F91A0DAF61B708743A6EB7522289561273504A2A24A67F4651DB0DCBD44CBB4A62B9648FB814BF7C6E08671C03C7E0D2B56AED7E04332DDBD804559236022A9A4B0AF9CB04DB49D43B590E50943E248F86DE7F43F3E865022D842AB51BC9B9ECA8E47DD8DAA0786F161C5B5EF3E8C41A809AEA96F6B185BDE4F8A41306BA471740E5A38F6DD320F612A1AC3F10A485485124952139A26D1B30E5C3CAEAFB462927D28404FF79BBF0FED9C0BFA41708900E89E36FF8BB460C3BE6D94EF67626126A6F1449FBBC136E67FC3239E5F3793FC9E235A441C7CD3DAC7CECB1CBD4080F12C4C975F053045DC2B333BCE3ED7880A8C604718BAB96C339C9273C2BE62663833A99178882E6BC0125ED14B99A0E55535C65011BBA82EF1D5750BCED03CD31A2EFC249575011F387529639EB74B70F888850A50FE9477684F9A4E81B780CBC943315A303C12F65565DE3B060E66C733E355C7907DDC8401EDF2075B0EAAA4BE8EB9755DD92D3F3282DEDC7CC2771E256C7B1FC8434F2737D4C9C7A55072E36B8D9C07530E5FFBC2D70E643F0D3172D5BDAABF92B21DE2AF93966AE9D88EA917939B96D0A55351FD08BE8A07102196D87AEA586652BC53DBBC9952067D8E9E88AE6D12B772FF10057EB2BE32F2020B0E63AF8AD992F4696141353568FF720E3901980B27F32B24B2DE09219FBF0FC3B9E0376F5026558D5752DFCC73894B4261AA83B0A4EFB890F7215B50DAC1496BF67F1AEEEA31B3C8590E5DC390311C920E5472211FFE620000C306339A71F19A396B9F1589BBE9249E2A7FEEB1C56B42B89806AE62ADB41BD1AB93672DF5B426B447984C6FD5D82B9AC47AE78E2E1B02CEEA327DBB8F4D25258F0A53480FF68C788F133F02D923CFF658DF19D70C5D5E2E90FF659E1A5C4AD87EC5A93910F883FF77998D036EB5ADD91A6F56A78ACFEFD564E606AD2C93AF20A65AC03A0FD20C97BFE905950B22C028314F52F671CD0B6A268703EC909997B70372408C8A595C8DB35972193A76D5A39C1DD190955099DE507DB1A0AEAD1D78104F551F2A5AB25D4C53A1A5858EB2D08017909C4818AE75EEB8FAD7DF222415F76FDDEEA46AB882D626C23BB19080950D1FBCC8326CEA8249F13C669BE3A19754F8FEBC08EB0C4EBAC03DB1E54268276FD8D260E6532A58E41CFBB4311A48DB5459A2CCC2D27AE527144394371540A0150590E9EBC82325B42E403E7E857463E5757952B856B91DC642F4E43322BF0EB882A8F6EFF306B4004F3C183E6D4E9A0E7902FE1EC779CB0A7760720E036BBDFE765B2FEA463F262D87DFA5ECD4C38093F4993FF57AC74D11224EA30584301851EA36A4B86CDF186C96111E3449E69F9426DDA9AA6C29E409B4CA7F8DB95CF4BC202736D3AC884B00760CEDCBED1210A2EA017FAE4AF4AC082AC1441ACA99692222D0D37751D4767AAE64BE13B4C774FC27628E018AEF407D1AE64F03F91127F1CB924E2E1EAE89BB1D7412C26C629203F3ADCBA9F03BD213AD4D583EAE1C88C20D80149386C566936E0916567774B1276D0DA8880BAADB28C60C99279002F795819F3D8E2C58A58200ECD94761960CFD1A0CA735D67779341890F7888D5D0D3EAF5862A57998D0C6BA865AC2FC671885D84516297D03EAA021920AF521D448D8E9EE71B7F840D8F0C93218EE0B5FE07BADE0BD9EC6D1F12E22C2598E07B060FADEA688B1A5534F051C77660FE4FF00F79EC9881B0BFCF13FAFCB6E18004188FCF8B8A955CE0BB3C9368D5545751DC24853D2CA9F8AF798D11FD9574FDCF3AC7A888ACEF079A7C28F875177B3151CAF7CB6E84238A901077945678ABD363AA1572736ABED0E056029E754BE2D0333D90658AEE3F797B1C054D026ED0D1E055034C7A56655A08CEBC556FBF6E09B36F0440148195CDDD775E02245891B2011E38AC3B89939D88B5C6A12EDA6C2124320718964E603BF4A5032F63C112955BE80EF162F0C81DD0580066291A92581545432A239B6670CBF6DF1DB42341605353CA5C08D88591B0B065B666C59BDCE627ECD5D51DA5C2E92C54CA247542F99E3A6D49825C8FA3688AE5091E2EACF22AE8FA5A4CD65631D1B6CC4AD98B8C89C90A8D0910D30B656465CDD5DF4B08710BB916A2AA87E33ED1CE9A383C19369DBD152C46C2A6FF075173138565316F0A60B4DD93360FC07396BBF327C50F94B452155A10B213E8F78EFE0C9ED08F588B02091B4B69EBAFC8E5FCEE4E62FA6DCE39CA1D6C924F0B4332A7CCC6A0ABD1A0F0B67CF4DB1609C13BAF685A8C9353A2EAC2C4D3F7257E9152B5E289D17BB5B73959A49F877BF7F80C76F7B86675CB1DDB21404FA79EA28B61574F456257300302421FC36286D56342E1351FA3A158764EE162CCB97543468558BACAE631282DE11B78B563993ED941ED3451E9C0C2A3A4D39F61D87CA012885DCCCB0BD17CA28186B8C9F9FA3DB738E12E355C3208E337C505CFCDFEE74331EBE36B7A90DF91AF028441A51D2198992F969E8C3E9DEF8ADF16E01339A2D701B4B8A89AAABA1CF26FA61F00B8C305EE63FDB68B40FBC3BE227E9ADD6E64D2E784F2B44EC6C655479919A11793E99F5FDF45945797E786D619935CEE9AF4BB059F69527A45C196BB89AB35C6EBCE7507C092679F2BA7D0841C6764DF494CCB8C707E245C8F10D48E67F1CAC8B047F03D921C35FDF481AD46B78B87C4BFD7895D3A7FF9DE1C29EE2C573C5FF628A28458AD7BBF5FF72CEB83153270C50C22A1CABE2E619CC68FB784030FC84EBBF12C207606751AE0C707B1927F6BD42640FB540F099816265739C43CE0E04E03B0A0DB3094474BE690439F0772A73E3BAAB8B40484ACF326918C0FA6A3CC22F39342FEDBD6BD54CD43646F67F7F3AFD5BC717FBB4F22CE891411C278FBAD56A57A64A1863FFB10B163643317B21D14854F170905CE2B0894DBCD6950130D80C047E379EA5D982EE5363F9D2A6457A3815275889F1F00BBAFC5265D1B0887FC83E1D24722BE878D5DA2D693AE0FF6CD2B7F49E4CC0EBA132A74BAABCF9C66242AF0143A01F2EA6B4163E9196015D10197C75196581E5F3D28C11CE7AE02B8361FDC6CD13643A5AFC0BB21351910DE2CA47E33BA5C0972A666B6CCE1B9C62DAA8178F0942C96A4EA7B5E30FD87C11180929137E5AA496F275F527DFB02063F37D6C29CAB881BD4E5AE9886FB9842B86E8DAA9176EE9C2448A80815C6658E4AFB2798E348324AE2E9F27A874AB05190350B2D445DDFBA4A5AEB1410FEF3C09673C986D741ADC2781306F2930B1CBA604B3863CE19BF3FD78FE3EACE85F7355BED0B41AB740407E919AB98B062DC824A52E72F8FD627B49930D1C818B5D298CBD2F24290DC65E14A683B100092A2A3BC250D2AF06983C79B7D467C3AD941229E9D89C457761C061228F88776ECC2C93D53D1697A1FB1EEAA76AC1BD3AF43FDCED744D9CB89E8A4C342234C4B66F33928D2DD2965F4CB1FB7D7A1524F6755BDFCFD8FDFCA8FCE99C67C7828CE650654CDF283314E49962A28E1F8A7D654FB9EC3B8CB997A1BD08E7FB34C44B98BEEED7B79588B4C92E2ECA0B4F72D73BC46113A6A6E3E17E07AAD79E7585D793E5CBF7D829E626C71A5C91611C0036BECFDCB2E9C15B0F52178F5A31D59548DDF0BA0F3A6132A8D8E469DD32E43779B8AD10170399CC64EBCF6B04E44D6344406807781D00ACE8933D4154BAA16FBFCDA5D78C94C55B0F52178F5A31D59548DDF0BA0F3A61E9590F8712727B0D463BABD0F964CE89BA3830E0A7794EE34160B704E43DD174D2AF06983C79B7D467C3AD941229E9D88B247251C5DB9248713F4CDCFD778851796140B75F704D95B3BFD1DB59A79A7AFE9196A205AD4B2E5031929394417776C3994DFEA258A0A2860C0F2737B2E0C10897D32AEC1EB91BE453987BFB0D96AD0FC0C44D60350AFB7999DE88624185E923276034DC7796253D4560A0F841DFDB016BD3CDD13D6561CE0A69E415CD30CEBBA9106D82F166A6D3E8FAFE3B3B1F7E3A12C32DE46CDC9F3B761CB440FCC3365B0F52178F5A31D59548DDF0BA0F3A61EE68A987833C77097E538B19B926CDFAA2EF4663EA8C7379A5BF67FCB84CDCAE5B0F52178F5A31D59548DDF0BA0F3A61FA99BB5DCF1AF52BDA8A3F2ADEF75FA67C1B0A68B253ED0151563FF3E9ED84B818BD8A65ADC13D9021E3F7DFFA80B11C31B4DAD3EAA868FFB3B8A3F728C222BDA7DBE5ACD3E4E7547C51FC3C5D1F52D950D5757C3C87424C73B63AFBC4C6AC50106F71F9BCB94E5DD2E7590F915EEBF54ABD7DFE15B25A944931B8A48D335677F87F87734A730E8F90CE07DE2EFE6D7364F10DD581FC787D1B4BCBBC70FFE0EEA85984CE65E8EEE415BA94FDA1CC76565B0F52178F5A31D59548DDF0BA0F3A61C50E253EE3FAD89BE6152298B97138219BD7E8E76ADD1AE54887575B62956805CDB759037797E2E265C7591D35680B23F32CFF71D04ABC967827DBD20CC6AB324ABD7DFE15B25A944931B8A48D335677C317E3E5A8F0A31EC1E20336EBCDF1E07A3084ABD06F2F799616BAA890461B111D5E409BE3720F51CE50674C5CE75F649ABB9892EBC26A3B4676945AB51325521B25805656A7F2C5C1F4C6763F52DCD75B0F52178F5A31D59548DDF0BA0F3A61F6523210C73BE3747CB103E43AECFF646852CFA6ED371B71EB48C7639EBFE67B870A05637CEF0A50AA603056837F1438E56FF31DBABE17785F4443EAB6491F355BB58B31A3538ED0E79EC3752CC1E4845B0F52178F5A31D59548DDF0BA0F3A61851B028CC7B792DD33BAC70AF19D92C0078A5F6465DADBF7A4B77CDAC8B435CD82FFC7AD55467603E162F5F023C245607291A6F92798A2F10DEA3BC2C4AE7F67E62AA9F07E966C75AC39EB92C2D6804D73A66CDAF814D9C3951EF3EAAFB37CF80DB60ED2FEA32964A78D91D26C505813F28C0DDD34A7AC1BF58E0B800748F57F9CBEA21698A4E8B8DBACF81DFF89B81D668F097B50F3D2C53F6D5BB87BF26F332BB77DBB8FA16F618B2623503825A51FBE78F5A9FD23E4F66A4F98479F1A9ADCE09970542DADC30D964CB1A6E2BEF2EABAF0AC194EFBB7ACDC0CAFC58AD4C89152AF525B07851D7CA05B0F9944FCFB6EA4B86CDF186C96111E3449E69F9426DD11F08A32C3CE3BDFF37D6E3EAF2AEC8554E5F5CE52A5F92A9BBF9500687796E07B3DE3E23431A700F19B9907933147F8C1C3B2FE45CF2F3E244E6B870164173A924DEC731D64ADA7D6D100860356F092AFAE25926D89EAE216E9C94CC089F18899759E8396F5B5C1823C607B153AD1A0CB399B283C6B0FE993BA234C52CED8B4DA8BB5DDA77E8A59FEC85982182E8ED31E22070E06A125220DA1055112C0430CF0CCD04BB0C9793824D458A0AC53D3B7EFF4D3E7DE93D0D718D2035503A5099AA00B6D34D85F57DD96EF6522D370460D046FD36FA255D44A1F7C8E9DD49B57C7769A0947A5C2ED31055A465A5E8D3841BFC34E9DE955C79ECC5BD0EDAD29F427C32C4400D24E24F9EFE247D997C539011A472F70239B6FB2F895E993EB65470502CEC1E8F9FD6222E3E4FAACF6EDA0D8848F94DEA596BEEA61D3DAE7ED2713AC6C0134FC088050348C7B198801524603FFE17434BBD6A10A72E712EEC389C75ACC00E8AAA665C8418D1E014487C85C13496C31DFB6E6DE94817EAB42FB08AA7C02CEC1E8F9FD6222E3E4FAACF6EDA0D8D4887EE342362F29F64903BBE86753D8F918989C7F43EBB9497C7ED8C082881E321EE07FB62E7A4D84CDEE5CBFA9551C37E10CAEF20F2FEA31ABFA3824693197DE6E99048108EE9D76FABD77910181ACA7A274E12E59D44667438E40A679A04CF6BF6AB46440B65643CBD3F9C1FF0841BF3117CE42D12295D680B64976B9AFA359F0289F2CE66278B7CD7D6791F35249C36547BF8D6B3F8EF31AE86C5B9A1EA35F98FE01A31E08821058D69AEE1D3DA9DD80F93EFE8261CEF47DEF66072ADFA09B27DA881917A28E8253577A12AA662C07C1D3755E979744152E7C2708D437A77AC0AEED3B17104A27EF3E9E62C276BFDD80F93EFE8261CEF47DEF66072ADFA06D466652AA7470DD6A10D7487465F78F1B9208CB7B817A3F59C802350BBACE174A8FBC42E284F7F104802C0695E44FA1DAB2E67B6EAA637EA154F2A33A0D9D6613069C7A234146B28B6FCD7F1EA9F8F5B38922F55E96BB8A50732B5B8385BE3B8AF6FF3A4596FE7B6626E553A5EEE53DE7C1A07D2A16C221EB34C037AD1F7AEB461A1DC99712A45E829FCA1166857932D405BF384A7E8CA19CE4FF1630A3721BA1D7F58DE5300FD70AA6C91F4CBFB1B745254FB3A5D136C29B458FE41CAD9944FAFA513893A78D1FC9CC74C898E11E6CAC28F4AD3A85E574B45E338032B911896FD00E2581218A4A890F3F0C6F4BDB5DBC0A777C3FD91AFBDF870BDD9BD3A2DB10A4E3D08FF95F4D29845B4A6BED699149BD592DCFB06A21A5CE706E3C8B0AE2D9F6AF062B51B64E0A5FDED1D1A738B44918E6BFCF3ECB3A3761AAC73F6439D0C27B9D01CAE03D852BB8F3DEB1752924C6020A4A5DC38C78B932107660436C74333001E6B4A3E6FF9EAAD620029364B73A43ED596442381CAC1E74CBC4CCAAD5D596E5C1869C9A043E845DD48D07C57883879AAB0239B30E055EA80394CA2450D293D54FBFC411957EA632E8F1BDAD0C6F63B2ECD10118F9A5C56D463EF70E6BA481ABCFA29330C37283DF676101CD5FC8887379B3ADD6CD2C46D1FA6FAB4609CAE2921E1F4D6D21E0D13D0B689F9C702EAD429F0C89118ED0677E51A10727B8D0F7E24DF323CAE93434E552A4AB81FE31284D173AB286A2F0956E04C3956ECE1247E8ED0026C7A114E55CFCE24E2A506572CC77481EC38986C956F3A489B509851460D695815821E49B70AEA3A1237EF0CCD04BB0C9793824D458A0AC53D3B7EFF4D3E7DE93D0D718D2035503A5099A579BD3066E00A2AF59A770FE7E7259E6C66D53BCB6F62289C02346C3023196C94D5337834CE431DE4479FE150AB2828FE48AD42C771AD65DF2E3F4172C12ABD7B098B37D10BB88B63BC5E3CD49E85494BCF650C9A52C3A95F21E43415D231FB049A80138855720A4BAADCA8A5D570BBB2A25ED378722038D6FBE874F6B645DB36FB638A64566AE30B967EB1F36F958640E50E5BAA6CC7364DBEFAC85C3298280D553A879BAB18DA445B66A88041A8117398A0FD144653BEB6DCBB63F27F4AFCF5B518754369C26FE4396FA539A8DC17E07475E8F6EF88303C22C7CE7559F14A925644D7DE518D971617C7717437E34FAD9E69A5DD6EEA6AC1740029534F6D4C6ECF295DD2D61561CACAFDC9BF8858C29E73C54724E3B3EA4437845C03ABE8912E31B254CF5C383BD50C11B039DC6AE3C11C75B2383E21044F97EA6DBE2D02F80434887496EBD904EF99C10ECCFC7C0CA49692E89D41587B4604352C9B4C0717C48ED8631E608F8DDE85F56FBD9952F9934446856DCD03B2DAA5A26951E69B3AF470D76201CC7EAE77FEB4F8623CBD5C7E6D2A61D3FEF6EB2A43FA90AF9B62E0AEBBB9AD04845F8E803AA9F2C135E19B3DA0471DB8306F575733C38CE882A2D5A6EE9D6188673328FA453874085F35375710B2B16207910A7C6BFED365BF886841B8861B240626F45C7D542B4E74E202F46AC75CDB8D2A4153B8C7796D19E12736057EDB7581C513A415E4B4F7B156F9E4D0D2FE48200851E23CC3ED3295795AF84D13DF95F8F22214639D6AC48AE4176B8DB0E9926164C18EB7A152B14D1F2290D8E7D38D63759E30E2F8C4CF5B456F8B06DA8C3D768B22B864C89E1A7A3A1146AF37ADE19DA4A64B7C32D5790F287AFB88F3F110570373ABE8877D2847CBB96A84D6AB67FD90C25CF51AFA84EE0E4849C4A9BB0D66534DEDE64620BA7D6E20DD3E41E00B6798565DA910189DB3BE4BA9860894A53B9CDA0918F71684156CF631280BECD77883B477E387956D66E496218B8510894D07126785D43F486129A514435F5D3456E6DB4F10FF02BD0D3FAF705E32A432D27DE1453D495DB3EFDF1F25B0F52178F5A31D59548DDF0BA0F3A6182622ADEE0C2F9D5CC6EA248BC8F3E4A9BF0C019B433766DC8D63DB4DFD02C61C11B08C25FC30069FF545AE0E10A1379213D437DF597B5BC17050D28B3A4BF790B7BDC7458E45D508D1DE6D224407667E13DF33095E5985E3B2CA59EB613CE30249BFB072271DEDBF7E274DBE3B82D9CA652EDD0BA47C01D922ABF26A53B61350B1C1C4017398A092ED179929A5D6BD935F04948A5488AC8468967832A2C5D200035583584D8A7B7D7B8D98F1B330A7ACE2B6FA4E99157FBB988798D376D353B4E4E2670DFFD12B1850592AD7BB563D089385D155EA7B2CA31E0F60337C79500365AE9561B2046F54E3A4B2070965FB393DEFD5A50A882DA23D3F443D909EB58ADD9F12F5468A65286B1795F0925A3C01D729AB9256C860EF0505DC14F386376BBF588CD1A13AC0A95C3B0B7118C9013A8C1CB9B93EFC5A07BEBFDD2754DB6A2C0A089D17F028E78C40B172524C3835E1A44CDFE00EE3C48E87B61BC74F975E412A8AF1363162731C7FA5038C29F94B82B92C7731F824F910CF51D2006EAC09EC7F545886C93A65208E946CDF6FA6126559A0D4AF6FB48B7F754E31851111CC5B054A830F94B22856BBC9866812C49DFDC7F04322D90FBC0770751ADC155008DA28B2954209822AAE05AC882DE03BDA2E9D22CA0C974FFDCD176E373386E138DEE4A726F5403EDD3698CF8C4ECBC36D9418332A00F932CF66A809C9C4E89F47C5D2012A5CB3BD78A3714D202454533B7DA5C2E92C54CA247542F99E3A6D49825C8FA3688AE5091E2EACF22AE8FA5A4CDAE0B131F72A6B687544CE27280678CB4371AC190D6A13566C5B7BE108C07E04A10C26F008229CA00B89BE7FFD70E71E365457EBAD77AF9E2DD10401EAE6FC8D3213BA4BCB0BAD7986A94EB333F88940B640B7B0A6CDB2835C9A0EF3A5241774080DED89C9C31E4B3B7712D99F8DD1493A5AB7CDE8E493A08784794806F08383F3524DE856792FCACF108FC1C98B22BBF73C452D2EB5EC449D279785792274ED0119B67B5AA6A5158EE119DA181613F375203ED8E7D089B11059174BADADFB285D07148F7DE01B41AED70CD1AE270AACB25C43515DF9D8806E6B7EEB2AEBAC3AD70D9B8894B14F2EE058DBA9A30E5852A6D8EA122B04E5F03DDC6DE4ED8D3C5B593648CF930754FE985CEDE0BAC5AA107498C34808AC02AEC8033B95A40F7890ECD450BF13F9DCC6EA215EB0A167A98D726A726AF076CD83676EB8EA6EF6273AADC179CFFDE5BB79EAAD8FEAD7DFA0AAA3B78D887D3BACA022734C5CA856EF9DB6C041E85627DC21B93CBC6F6DE4533EE0C6A63D53ECA9AE9543D4C4A8F39D700288304DBB434EFCA3465E73047DDC138E59DC09F541C12F231CC3CC52FC454BFC489A4E0AC023596F306BEB658DB7481ED4C7665959A33E96476BBD0EB6E12B11E7E1C2F161F7FCFFEFA5C6C893C2849D994504FBEFAC908182AF541CA4BFFD9FC5879BF023F807420B455DFF15A3B3B3C31D98B046520A06D81117C4528903E2DFE431AFEBEA679B3D39A06265570490897D32AEC1EB91BE453987BFB0D96ADFD8199703DBD2F5EEB0C5B3EC37F79735B0F52178F5A31D59548DDF0BA0F3A617FA7DC55811EBE5BA6072440B2EFF51C47A53EA888AD57BF23793E671E6D495631BEF7704D01576F6ED6B1021A22F064CC69D2D157D182F57902B968C57986DCEA2605CC04271C14B269CAABDBC46585C645273D4F8D5A02A0940BEC17CC0A7D68DEFD5059CD66A112EF30F11929E95C80FEDA4E527B210AC6805F7CF1B5F327686AB7F210039B3E28B057D5E453F2A2BEF2881628216E0F3C5E6BBFC1A3D1B4A95B7088F598D07BA9AA2B05A751FE5A4514850F937B2139AE394BD7EDC4D4D98BCF8A573F2CBCB7E2CC288ECF7FE72B99A93CD708F380B443EC4AD28344C3E34F2FF1D7CA058C807521B1ACFF55175177AE2073EC3351734D8278AE66BFD8E68D39197FD11759CEEEE718D7CB0A20F0570DFE6C68F065829A7B7123D9F1E2E734BCFDE476CDD3C5108D6E801C821D9D9B11B6FBD79D4AA9CF4421BA0C6AF8CCB652786DC8D17C788E78EEE76738DA1199A898FF18C20F4D56E0BB9C6981A299D9F294F13A902A7736D7A8EF125B0BAAB2C06F1CE1F93BDA12ECE709FC7BC09D82ECC0BA28C95BF795B5580395CA01E7B916E4C63556BBCD7ADA11F6210278BAE02ECEC8E0F8497C882EC46E6BEB9D6F239D5593AC2C5ED9233E12545254FC78021594D825B8B0228296EA7D83C618A46617046C8139C5DFDF65571924186B7743769FCCAB5088003CD0E0D13A84A720D807A1C8275AF42A0F1E38CEBA9E89CFD066DD43143BA8CB2BDDCB70E0EA9C3D050DAC06B957C3FD42A92B17733A9669CC8825EA050F0897BFB8654CF73FD3103D8E2C58A58200ECD94761960CFD1A0CA735D67779341890F7888D5D0D3EAF58F7BF2D1CDC34837FB2DE4CE5917744F501A61CC88C8B2DDA88922AE71DA36A0F4435F5D3456E6DB4F10FF02BD0D3FAF71D813B7ACCE8E62EE036FEB59A615A85C48DFE1E60717DD1252497031EA5BA921A23E25B7759A6945327AADF2DD88214AE516BE150ED58AE2588E9E60094D7048FFE0F79EF021564D032E21446D125C719E9F92579157E46C49EFC03F2BBF46364D076BBCE9EB7C4D0E9817C58DD2441C865F7D47AB655C4E4A9D44F6F6F0DC1E928D9919BB223FF7DC2EED56A9EB6A9427629FB1F2ACA6BD8694D3915A5EBD8C6727D76F62E0ED33025CB0A96C13FB8358E4E4BFE720ED34AEB93CA3A2737D81586B6137F7449CB865BD9DCF5B007D59DC462B1F21A05374AD945E7892F084A670F0AEFFAB2230848108DAECFC19A5EB942B4505905296716388EEDF0AE0046CEA6F33B6E1ADAD9A4FEA22075DE973CFD3602175F2E21730C0A2A2EED60E08F326A35CCF51DA5C2859688F5E1F5DB16DB9188061D7279652BB5F2256BC1F538B026739142481952090A0034BA90190127C76D7CCAF353EF305B45C4E73E0A4B9B2D09D5BB07C43CA57844AF742957A2E20A6721F060A8B75A9FB5F72996637A507316C08D4C0A5DD0517832AE2CE4DE6A0D6EFEA98D1A2D10BF7A767F7EBFACE7F1730AB32D79EB96A8AF011B94CD69234B9846714C72ACA1D33D60647CC411DA5C2E92C54CA247542F99E3A6D49825C8FA3688AE5091E2EACF22AE8FA5A4CD48ECD595B525FB58E27E72490485BFDD6204C544522CA980EB41E8CED6912D75F57C23E0C19AA7A1A27E34B24E3279AEA289924F6E23640D7D2176D686C68539A1350FFEC701C2B233B14E09496C937EA6D457FCC1FB1FACF10C2B7F14FE1D2B2167F159E227FE8D85D1F305413086E863783E3A3D803312512FBBA240298A425B0F52178F5A31D59548DDF0BA0F3A617630D9B9740C169D8B4656DF6008E82664ABD2A15AF8006EB29485D159B6B9C36E982A4D6B76BF9EA05B300E2470C8F472F8FD627B49930D1C818B5D298CBD2F90E144C6B6F19F93E6AEEC0189B8946CF8C20613CD78024D3306C32BF6B74B61E05AFDD34FBDAF51C2F812C62DF2DA2FB787132026B705FC10D9760DFFB0DEB064CF1CEB156C8E1AE632F49906B1E1EA3475BB1BB36E9AD906CD8CF36559A2D8046FD36FA255D44A1F7C8E9DD49B57C7769A0947A5C2ED31055A465A5E8D3841BFC34E9DE955C79ECC5BD0EDAD29F427C32C4400D24E24F9EFE247D997C539019DA222E611379869AD081ECFDE5823C789AA97651399F8687572A5DF369E446C1C984FA7A917CECBA539AF7876F498F548374647CEA76FC7A51CE0DF25054BBF64D2BF3C4AE3D53E5969DEFFCC63D320848F94DEA596BEEA61D3DAE7ED2713AC63DAE331812F6BD3C6D75B795D96CBFF121AC3C56ED8DEB4719E47833B745267754A4C481C18DD50A161CCB03D8A067FBF93C4ACDAE0EFE39DFB12DD21CEA7C5C29441C7100F3C60878950202F95EA7EDD5367A3792298562FA882F34BB97C4976F74FF7A2E7715D2D03A633AAEF37B6027C66F78001BD6AEF522EF5EA68134C48CBC6A5AAFB7E6947F396A89DAC4857DED3EBA406908C3EE0A859A6573932409D841638D34583573978281343DF9C3070E023BC7653A1F9365FA620A0DA1B2EB4D366D0467EBC26DD04A76D07CA2FF57D285B0CEDF8FF40AE385DE1B5DE891AF68DDDB0AD8063D9C4EF8D416A6E378C60EC3367260CAD219209FD8589A6608D215E2CD27B56E4D2E94994233D78DCD479AACF3695B5EDAA77ED01260D7A5265DA5C2E92C54CA247542F99E3A6D49825C8FA3688AE5091E2EACF22AE8FA5A4CDAE0B131F72A6B687544CE27280678CB4371AC190D6A13566C5B7BE108C07E04A10C26F008229CA00B89BE7FFD70E71E365457EBAD77AF9E2DD10401EAE6FC8D3DD80F93EFE8261CEF47DEF66072ADFA08C4F39C61414EA2550ECE080444DF2A0213BA4BCB0BAD7986A94EB333F88940B640B7B0A6CDB2835C9A0EF3A524177408A046EE75B6739A7A2DCC6F3AD8E9EC7931518157EFABE2D82755B7CC4600A4EF8DEF8A95AA63D95B2B79067729A2322C2A7C8EED97FAB7A8E8735A57AB36154B3315E219681F77F05A8631D62FAFE55445F4447A0A91F1A23324C0C24E11A1D7E41D9758D5F016E4F5066371247CA28EF371D5708E10B714F4A38853D9D8E432A693AC2E157DB08FF30FB46B8B877A38A4297ED5649E4EFA63886F97BE49EE9B498C3322A9B946C06C5CE0E5CC9AB1FB95EDC53FD6E522BDE9057A2DDEC95942FFEA57A48827C8B74D2ABA4F065D1E6F48EBA8FD77CED033270409D9618F9086A56D4BAAA0E666F5D680DBD228EF82DCDFF67BC1A014E2244B99CEAC5CF3E83781BEEEA39C6291E6F16C692B6836541C4FF058620F17D8CDDDCEAA2F85D37255C1484BD3CD22EF2AB90D67067BCA6197036D99F18228A7DC2B6AF02FA4721357F95F736E121944711125C933C4F357814E6CC29C1918468D10B73B902CB05C196AA1BFF2EA2FFCC32E443EEE7F35853436B632DC8650E4C0D8BB8B99696FDC4EDD9FB35D048760FFAD4714247BE142E2891DD3ECFB11B511BB85ED29908FDF16E36BE1808C866067F87D9C9287AB88D6D440F547256240EBC9EC611391AC64DFCE9309C150B13A3970D58CA61B1831580FD6877AAF5AE5B9ABBEB8E624CEBBEBE7EDF3A2681A47EB0172347D42638B40CA4020BF1197919F7BB33E99F5FDF45945797E786D619935CEE90EB58D3B959BA8FD973BACAF2A32011B6A531C419C9F0A65E1E76607F0CAFD06D2BD87B0CC7D0B5E1B77F7C78665B5D325C43515DF9D8806E6B7EEB2AEBAC3AD70D9B8894B14F2EE058DBA9A30E5852A6317EBA7F3A8C28C5474BBEF6E4C71B24B17267AF12567255495AEFDAE3F3749E8336BFA373B9FD1C19D2F8F3955F5D830310F2043B718B4D57D689ACE1F41DD0BC91413973F1D3A4B173B02ACF433F863C55FCBC951BA1F770E25E8600C8131880FE9D37F7D00047EF6CDB9EBD9CFAEEC6DD840A89D6FA8D9DDFAF764255519A99CA040A869923FD43ABF31EEF7E9279EC27736687C42807DF5E4551AB551C05DAE114B8BA1A9F1A2DA26B7B1455B1E2B121D208F36A1F69109894F04580169A9D6793B0FD223CEED13A1FB69844E7DE8CEAF168E331D6D1830701F914A26656A800B525F777E2F96FBCA95A590FE8BB74D1AC98D9D158ECD57B03BFEF8CD823B7BA04100AFEE82B76CF2B9FBA1D1B06BAD069B4C4D08819B9F02417C4E72F00CAFB228C3806E81352733AEFC910DA48AA96705B2E05E68FCB314433D99AA0BC0D7DCC01E337840060B7B48939B816E2B68EE76AE01EC52257429211EF7BFFC68D3E8C4F4735D77661B1F85355990DDDE63233E2EBB17C11B8180EDA9A89C0482A5AD263A7097436D01742E1CE9986466E974CE29BACB0B4FD66D7BF6039B1ED9F294F13A902A7736D7A8EF125B0BAA944FC1A4C5CC3E0DB9A8481485D8528689CC0B8A9FDD4E7B570CE3B4FEC6246C97B4A3601BB42AC1378FBB68BD395534AF4E5C13FFE1207755A2895A9B8EB0774838529E781022A1C80EFB9A4ECA12D20AD938DE4CC808CD99ECC0F389F2E6CEB9B3A107733B86AE2D695912FC51D4E601511B05AA0B6E75F11938C8AD6C38371275F17A3D727417F102A4AD2B1F87D79DCE910FC2CD36C575F33143D1907F852B61FF138FFAD6AE8B58BCED4A1FDAB82A433AF2390CB56BA14CF55D0EC52DBCFDB55D49F4531E822C2B25A09F48A59C01CBE1E6C21188CF2DBE0AD7EC96C5735DD641CC5E591EF327B10568F07C2C35C28B783097178556424C4531BA4B602C439975C682ECD87C21E65AC8BEB0A5E978AD57EAEBBB1FD89D2A90CD2D17A1639B774CFB632AC8D754D6E5EE2D23F9471EA927A331815EEDCE538AF03B7DA13449692E89D41587B4604352C9B4C0717C79F19F146E372DD214F8451590DC5D2FB01C75FDA21747B15E7E98733C320D31FC123EF7DF9DC9CF9D22E96637EF378987598E649BA0FFC8C1816541B4C5CF8D5E06094ED40AF35AFFC4C92CCE7378D32487B1546CDCB27A53DB5257BE243B58559E383B34B922080268B98D91CC0982EC8B0AB75B3FC3E41577A712CA6D320320BCF3472C5EA86E94ED1BDC211A50252EDA4017C5EF9BE3811BE77A221B0E9A4A0C5F36AF4AB4F39AF51D575A3BF06BF2F9C2D17A98776A1394FFCC0DC7BB9ACC6C13A7F20A1403C9A57958DC53A0421F4E6ADB60CF94D46ED28094A96639F119807E43D844B84482070858B89B9D43089CD65AAF33E33EC7DE3F14DD59F309FB8C37B5446223ED392C9749FB62429E56FE066BCC427AF926C3E9F72DB65F1951ADBB5E7EF8051DF2785994D9D08744FB3893FA40AD05974777EF96FABA3BA6E99368DB582B51966E470E17621AA4B0C23EB7FB26B147BDB4776F15E3D187767634819F59BBBAC98BF65873C48B7C253DB025A4A7BA35DB3D172868CFF12EEE83E78120391A6F69C0605BD818EC7FD7FEAC8D57F20E856CC111587553AA0E67D06B0FF484DF6FF7ECEA4F665F7BF03C39BB3428ECB4EAFB8CF06B1F65DF4FE0C245BA22CD9C64B8A69572B7BE140A68746AC94DE3B5AA81160D326ACDED65958625B8D871CD4D52E9D71D6037B3DBE96BF0527FFFDF646D4347B9B6D633958CC23EB7FB26B147BDB4776F15E3D187766AF6B69824855FCA7782ED76717D96A74AB0680AC4387D390079F45049E67634557B39879DAE397B9119C03162BCA7AF9160845FA656C910A87D4E5A0DF8FFC20D5BA860AB6C2BBA04BA28E818D119A87D8556E35CABF6E2DFF1D75F4FEAF5EA12FA6AC19938058926C1E4D4AD3D1305288BC9DD983F5FDD839ABBE82B4FF21DBF9328B99C16A3C212D0532181A061A4263826C808ADC10DC8177852077C3D95737832884AB788888F3C9ABFBCAF9AD139BB3428ECB4EAFB8CF06B1F65DF4FE06DEAA2B49B3CE7A26101FE4B8F695F948177B2220888C07A889503F8875AF2859BC094266BCD7A6BB265B974AF7141B0D4D528B339D99F2C8A7BBB5D3CFB5630E1CF67D1E8B8586B6BF17EAEF0187950529F1496A9E4A01496C7EF9700804FEF6EB51C4A5C1BCC2921CA8D947F2724DB9F010F62F081828AC896028AE6B9FF2EE4A05EDFDAD29949A6416D93D973DA149F010F62F081828AC896028AE6B9FF2E43FE421CB812C6736ED449E05EA0AA7D39BB3428ECB4EAFB8CF06B1F65DF4FE0520A8316264FC2464483945B0B567E1CA16CAE87DC30A142EE104940FE2A1FFC06CD5E8F056262AB1C3290DD82ADA1E2BB102E6C96196299C036F93B0E9C9BCEDC1EDC7C415AC0D44BBDC5923294C473A3166DC2F3A0C338281A095FC9003318DDBA64189E9F39F65E203D59729FFE06B9B3A107733B86AE2D695912FC51D4E65CF6560695989E6307948549F7A404C537C8A0BA2A10BC084EC9C41E13C8CFC8C5589ED209CD1E02830DC6DCDF2957F90D72285B261D97AAAFFB29F3D3017B0AE31599C8361179CAACC680DDC60DAE5FF90E202A70A8860FE4BEB50404D32952EB1F6D1F4BA5A3AB489BE92A87C5BC9C659D8FCBFA632FAD238E874009F6F579B5AE3E6CA44F68104DCD6DF61869959AC6278154A07ED3CCBF1CFE879C7F59C0FE672F5065AE00668C41EA9A5FB8F4EE7F4D0D0949CBF5E8533862B7FD198582A1C8F247CC7CB780C54D658AEAE7365F5C31432438C46DB7E73994CE33B356182BD4859DFEA352845DDDD367EA48622DFD806D55C9F4E20F12B7EBF3F1BA8C5DF56493465EF98E516179F96A34B2DB0AE5A57729FE89EF4F55AB9DBB6C6C849ADF63B229FBBE3755952AF53975A5419CBDFC05728A042C281821E3B48676F718E3F1B8DE4062B86058CF16E12B3DF98E1D0363094C08A40AE9F0923242665674C4B693F0C789F0677B1FB1DF0321DDAA3BAA356C7C13F38D35B4E4FA53E6D37A19807E43D844B84482070858B89B9D434CD33EE6838BCEAD9E4725D585517082E589EEF6554FA5D57BF2C2B8B51A111E2680EC36750175BD9CBF09788D58E8F294B1B40D3340C0997722398FBEFF26BDE99368DB582B51966E470E17621AA4B0357C6C35A118DD8078374FB16D775625BD71502C091747F2837EB8233BA040675F56EE92C9C21F4FA3D566B0F58AEEB4BB4E91101A62F845CF8CFE867C5676FC589FCDA2C9E3C7B4449E2E2034EDB517D7506664B389CD225C0E5ADD4337A0BDD8A0349F2CD4D07C3B5B20A9C94E4A9EE39CEC37EDAF82480550BA7979D4A6596A022F5747C7767398E3DCEA56CEF37483A18EE239E82D6E949E27E39C5F8DD1BAD4E847E6FEA479120E5D4CE50C069FD0E118B176DF018C2E9560F8B8E7B545DAC8D8719E2C9E4F65E6290E694F86F2E4CE7AB3F52A354E142EEFE1F6DB9BD6552447933A5D328C2DDF4F75005EE359D54D1FAFCB3FFBC0E0E57492E7A29569357C6C35A118DD8078374FB16D7756257916BED14DC892F03CE6D89AAE35C5EA937538D53FB8B1B998DE89E2C3D0261FC022426E0EB711DCA89DD46D69369595E57D53C03E55C8F18725E07CFFE6442E5E32AA05B15F503B403059A9DD9651FD27D2B885DA5C522505E1F5FBB09C17FFD82BBFDCC430D63758DCDFD8C5247D644C3D559108EC85A32E9B724E2AC15143F02D7AF19FFBEFE70D75BACCC199752EE4CE7AB3F52A354E142EEFE1F6DB9BD66A888DAFBDF4ED7893361461F9E6F43BE155D81DD267940C1D2386488E0744089B6768CB0BCAA826AF28A33DF5B227903F12863ABD8702969DFE677244090B7B4E2063B7EF13AC6AA0E45C5AF22DD3216DE0B4B6B5532C75F2368A65C4482DDEB7D53137CE0A99A949618DCA0976EE96AB4FA47D42DF231CF3440CAA39FF7781AF4E26F76DAD47E2C296FB8A972F272137FE5328C16CE73F89CC149BB188545CFDC8923185FD01E1DEE40BF0A070AB5DEB8313DD2833211216BE343433DEA39FEEF18EC756A90DE38F63899AB05EF5881075859E3E6A91ACE9E0A408E0757FEEF04A74EE84B37B2E508C5C8FD67D8C6F6B8E3D6F1A6A955835314EE0B5289890FB910BD0C8AFE1A00306D862A9D3732C42C2D0EDE3FBA1443AF2F0B733D0C487E5D93B10B0C45217D6989CE274A83479CCA64E201E984BD5F4B111D689895A39E2583BEE800C9D0C1C4F74697CF6BFC20D723F7A221693D33AF007E4FF4C3967DE9AFAFBCD4A8D348E7D3C53D8B096BFE155D81DD267940C1D2386488E0744089B6768CB0BCAA826AF28A33DF5B227903F12863ABD8702969DFE677244090B7B9AC0812071D2F23539D5E0895219298A26E4F0C7F389341C9594E71A12B684EFC825072E503ECED440C1634BF31123CBB02BD3A06B1070452AFAEC843D0E54487E041DBBB23E56EDF37EFD7B133E88339C1BD4B4266271634AB43F61C17978553AA857E0173A4118001559480F5F9DC3B179944B79C9FA2491CAFE41C56D21DF9557A2658A0FD171C50495797D0ADB0DF13FF09F5FC2F4122F712DFE999A5F8119A52B444BCABCF8AAADF0D9C2F9A64E23A41F2720D95ECBE9FFBFCC0A5F593E2CAB7F0BC7F4A276777E19B7B4C09FF1589EE720F2132921A49A9A29698838F658E1B69E0F738F47A1EED119A916B538CC328FDE0E19FB158EE9D04ACE2286A6A716AC52E292FA20F57B5BF723717215F683698A3217B0880AA8766AF605D5BC58F6C9451549A1516E5E2CA37ECE1F9A289433DB28A8D06127C516335EC910B20EE3D9D8F9BE786D1CAA957D8A32A2955653F3CE8026F3D7AAFB85B738428732E45ED1A95CD900A3EB18603B5027766B9860894A53B9CDA0918F71684156CF637ACE4A690E6D52F687DB850D3BC970B7C20DA783D64AED8D98655B15807D03C77B3DE3E23431A700F19B9907933147F8F85A3BAD3537AA3CABE5D9720730A2E3B86D4D6FCA28F12BAA49D3BD93BDBF5F516F6C02F69E6064FDD5521333EFCB21AE59977C874F2C2B01DA361922FE6477CE5929FE39750363EA0A812451704DC646132035F5B13784E4169351DB8CC05285BAD843FB04097BFF444B1DAD1C56E82658297B26C51434569814B76882CFAECC9149BE5B15FA8CD666E5DF693C6ED665637A0C01B88753DCDD949DD4F4AF02D8C48CE7DC2F912400916BD4D8B921C806508E37843709568FF38810A68A6874F990860D7234811D2E8EF98951248F557F2375DD8E3172472876273C48CFB58FA65A4BAEDFA04AAEE677475D538192DEE941E51ABD98559633AEC8CF482236E94B0DDFDA785D4C730E61D330EEEA33364F7CF47EAC5D5560ABC35B95E76A45C1147E920968DCB6F912DFE114D6D40CF28051BB15D0ED44CD93BBB508A7D79DCF2F033461E32B0876A0EB74649492CE53F8A273635B09A4A46383CF5C7FDCF737CC010C03DC3C869F913CF0735E04C6941610E54B727056F19D7E92FB5ED9206B49DD67032DB094CB4B131082A1D1BE021EEB9E115D894301DE9C9BCB27B60F732FC5DA09AF7DCD7C5C4262C0E5EC37E97934526A32BFFBF3ACCEC4DBDE5B2D54320BB9275B196E1DC41EC5A7961C48D5283E8369F1FE554CDD06F4AF0D139EBEE665A0900F0453F6F976A07B01F6E4BF06E66656C7F2097F3C232EB4234A699F016499EFC1734D340E6655771D5A3400FF5B9108079986D4E18D261B110FAA41F7BA85485F95452A247B541EC2A206CF2593C9E618B892BFD5E4740502054CE2F4D14D0B7842D88B844AAE362A7BA4B4C5B95D1BEE3BF94A8A5F2171019E9E6467006479DF15F36DE3D32A2B113EC05FE09970542DADC30D964CB1A6E2BEF2EAC6EC558B2781E0A73642F24AC2EB76A82E7B7E67F5E7B09E42978833B205CD1C5D28861F0CDE688F8482E9B236B937984146610D081830806CCFAFA1FA0602A27388E6ED178B8EEBB71BDD62056E30609C84D16BF611CB6D456FC9EDB3D5EDEC6132B757DB24FFD46DD96C6762C2A6B6E548D5EFD5B510003DAFB191803F64D1641BC1D246464935C9641E6B27F73210589C98DEC2C76ACE1D0722D35E333AD903ED41398B57D253FCFD6BF0DFBC47F448339AD805D31D117EA82209E74F1CB840B7D9F5F5C55C735C1591085117A0E83F19804CBCE3D0BA73E5AE87B50804398899A34DD32E859C546BFF71B32DDBA1A1D2F1E58F75946D3F369FDC303E294A0926413A3C9BE63700CF89866B72B442FBF4FF9C5864D949FFECB4EB2A73315A3EA61E9D6E61041819AF06131C40B2D9097DA6DDA5C45ADD1DB5363B61448E48216D8A9C50FD1464353B8356A0EF5689BBEB4F475AD703E8B164237CD904D8096AA753DA37527F27154AFFA9C7859600C6B4764E01E5B2B4E7947A1433A2A0D8C9EB2CA0629646C3E24322728B1D41E2F3194FC14274A204C031353C09A71A2003BF18E5659FE623674BEB3BF766671905AB6251BEFFA1B4756C12DD43371696B62C07E31464AD8197844A6C5F0BDB5AB13937C6810896CAD5E606C3408FDB1A4F04E19AEE1C5BD68369EEFD0DEA288D33338E78D7F9783215D5A6042F64379923573D60C85012706E578569CF07B14E6A48E823C9CBA2D54452082BDC5EB5FD11BDD769C4DFCDB06955CAB1559F95EB5B0F52178F5A31D59548DDF0BA0F3A617E865FC8DFA8C90AC15ED1FFC7869D119E2BADCB0582A88447ABCE80973ADED9DEB2DFB6E9CCC63341F54C0583966797026BD11F61D5051CD526DAFECA49B06AEE6EF2CAB3393A22A4E095CAA967327F5E57EA09B31681F0A6C02C18A171C3ECB13937C6810896CAD5E606C3408FDB1AE7A7A7C9041588772C3789671A075C6E75DA896840452C98BD8754B7BEBDBBFD2C9457BDB274F6010C265A366C7A1D105B0F52178F5A31D59548DDF0BA0F3A61DD80F93EFE8261CEF47DEF66072ADFA0C5035AE2DA56D416D9BFDF8F82FCCE1E164AB97D42603A7A0719187406FD3216FC53101E213F9AC47327637241C978475AE512BAB58FFDC1B61B363D361C03DA2A7ADE6057A013DDEE663F903D5B25874ABD7DFE15B25A944931B8A48D335677E7DE8ADD1A3BDFB07E9B4C8A71F786DE5B0F52178F5A31D59548DDF0BA0F3A616C93BF1A92B7478876BD48267CE8EC1E5B0F52178F5A31D59548DDF0BA0F3A61CC137901241434AC46AAD19EDF470B3971331C29645F2E7C637DDC7EB28864354ABD7DFE15B25A944931B8A48D33567743C32FC557519ABC4C8C5C90F258A7F90897D32AEC1EB91BE453987BFB0D96ADE180E52CF4549D0752C27EF3E5ED492F3CFE1848B1019E4C80F376242A11765638B22524E619EE4005C4FE4C0D6571FA49692E89D41587B4604352C9B4C0717CF3DA6677831B83EC31BACC85D19F66BD498C34808AC02AEC8033B95A40F7890ECD450BF13F9DCC6EA215EB0A167A98D7411035971DF9F4FDA3DB14593DC3F9A27C474C9D5815A0FFB575D7779B9F295B351F40544A4C66C524961B3C3E7AF0C24D2E75ADFA99E4765985112CB45160C990DF84F86DB775A51C0C20EC935519727ABBF5B20C57306C768DFDB524987F4234C1A78416F176C1FC6ED2DE39575A079144EC82A0278020A4834972034A9EEE72F6795DECC1A76CB2FF432D4DD66B25A58933850E097D8BD741426BC67EF0B84153C8E0A557599FA5D44019A311763988A7C37E73922A0757471BEF52B8C0FE587B6B116070E137B7C3F444FBA96F8942588CA53E29954EC6A18F24D0AE3D50B33125E4FEA5B0F1973752CC1E0BB8156F3CA33EFFF18D377E83C0655D33C435895AFD46EEAA55EC0BE894E9567B47D7D2DE8A816EB20A431EC61B1AA311BE8F2B1C0E8135E3A422E7D3372AF62B79E2F1EF75954DC101F1BF2E87D106AEA2092C4B311A95C519012D27C5004BA1E09102A7F0F7DDA87844833D947F991E1561BE22B480A097570A57544216A50917ED3A77B2BBA3140B7EC3EE4A03031CDBDA0DDF90083D988475BBF4F76B109E83D313644E33B2E5B76B98D9D9838AAED6ADAAA8B9C747F48092B5C7BF97CE9B9E7F4FA0C5857076FA21470F1E2233C69D43EC7D1BD9FB1C541DB5C9148BD3D164647232C5F004BEEFB0BA3F1B00128A434B1815147BD00A61822348EB3E3FB1083EC7BDD459CAACD236016DF3B69CDD5561B30121FDF3F8D4FC0B09711ADD854BF42A2BC64329D4E0DC1E1AF326C81A6FB8EE83A4746731CFA14B885D1376AC92EC184D62697CBBCD79D4130FFA13B0E2AC8C5781490FD0A990FAFE6DCDE96C0D279AE47BEA96FED2C4BF8821CFB03FEED5498C34808AC02AEC8033B95A40F7890ECD450BF13F9DCC6EA215EB0A167A98D7FF49DB02A17E7977BEBF2FCCEB999D7FDD80F93EFE8261CEF47DEF66072ADFA0892F05AB9C52EF597BA187677A8C8F8B1A44CDFE00EE3C48E87B61BC74F975E43BAA356C7C13F38D35B4E4FA53E6D37A4910916848DAF5D8F3CC1662D330D1E8D2AF06983C79B7D467C3AD941229E9D8E2583BEE800C9D0C1C4F74697CF6BFC2F2C4DAE3B7CB2966A56D1DE064B0CE3FAF4E779C6E735887E27F6A31BA82C53E4ABD7DFE15B25A944931B8A48D33567709A1B3821FF0C4C61A08C634D48DD040A04031707A3E82175A95E6D68E4B424DBF1586B714E432F5654A760846B0DF596ED6905F4DFF281D9607AEC42AF8E3F2B8F339A0FF7C003EADD0F46D58D80D56228969748593DF6E05A1B6C03CC3E91BD72D8F820785B5A457B2BF44480E74A59A387A77E23C212A2EEA5189A3C565D3C737C11B24F26A0FBC84F2CD94EEC34CC4BE08034AD58EFE1535FD6F32A1EAB77B9C68D417D237A2EA62C0A170470A3133C3511C6D238D1FED5FFDFB745B78963177CEF8FE908D4B42D9326673B22576A1DF589D8A78921D1C2A8A89C6F4942F68FCECD4AA7B0DF998934B7EE5B6072536A468566A60572174C563F215DA9FA450D5757C3C87424C73B63AFBC4C6AC50106F71F9BCB94E5DD2E7590F915EEBF5EA0D81DB8CB15B9EF5A5C221C0AF2847945CF25F939FE9BA9311BF3CF89BB32142ADC618F8B5C37B678AD7D3D95AD6A220EEE3F696EF784CD6E0C2A6E5E46487D2AF06983C79B7D467C3AD941229E9D8BA4167D00D2B2F03E2A24DB16DEBF145124542D7F69C51864391AA980B17C7927D34476364808BC45A0C842A49A7AB7B1D7A1B62F36D79F1A6B8915F176D9FA8E162B662B9CD0FF9203AB4086902DE90EEB37E936F856657FB7A04B84507B692DD80F93EFE8261CEF47DEF66072ADFA07EE7969AE7683C92AADF892326662AAA6ABED20462DE540B6CF0A7D8F4DDE089AFC3F7B8FE713764C127E13859A80668A3A7263672D76B941900C1345BBE3448C9232D1858CEE18B956E46EA9FB7B16ED23C3D577E3B396689553316A161A822D7EE69FB365139BEFF4C17634D729B6EDB4FD3FB0572A7FAE7814459975A0726209B859875385DB62E5E84B45BDADEDCFFBDD2498226587AD0A97E0379B6FEC7BBA9106D82F166A6D3E8FAFE3B3B1F7E3A12C32DE46CDC9F3B761CB440FCC336B997A1BD08E7FB34C44B98BEEED7B7958EC14FB29ED98D953151E362F47260C2CD04BE2ED2D9CD563FBF5C070669743EFF3B168AEEDE001ABE4BB9D6230E86780814713C95889D42144740EE33D521ABF3682F499A5CC231E09CB5482E3EB3226551767B1DD7A899E1C47E616DBAC4729FE1AF9001A123F6A2187999144D6CF17A6B7C986B025BFB1086B5A505088CD61275F17A3D727417F102A4AD2B1F87D79DCE910FC2CD36C575F33143D1907F8530A4A04B3010F9E7D1DF18AC0AAA3B8176C539F0B9EDFB5C0AA1E7CE9F6618E52091CD504B163786BD94349A46B9F58F44AC6276F63C4CFEC6F45665043D7CA2CAEDCD037E43D7B09A547A9B5D2E6A7F666283055A9B5FA04E6A13A8F9F547FE1FC1F809A42DBB7059443C9FB1FBE910E97AFDB841285E1CCA2E9FE974CAF499297045C85D59467FEF392EDBCE5375B7563A923ABDE3F8E93430907BE71187605B0F52178F5A31D59548DDF0BA0F3A61DEAB8101ED96D01E176FA19ADBE613ADD62F17C8D560E8CF2EF0C1C533CBA86AE8F774A4CE3307C4F8065D100712D65FB997A1BD08E7FB34C44B98BEEED7B79550B1204EBC9BB0E030A12488E2F56ABA659326B5351DF401CBC66D55A1F2EBAE37561E7648C56DF095962B8683289E6FB02EBC4B7D30D718B8A4B85677DC618243E7D9F44C8EEE6F036C847C7CA21EA07AF3261856EBF2E6F02C0D3AD6F0C466001168D584F92E641D14308B07515FA67F85B46363E9EA8E795771AD9211F42AB520AAE83ED7A60A34BCCEC6B98EBB05D77BA7CEA2F8D5C69B9DEBA71DEC1018164AB97D42603A7A0719187406FD32169DF703A4136A53466C4EF680EF3B1C3FDD80F93EFE8261CEF47DEF66072ADFA01D156AB733D6965B33EFC0774B4E70B26E68D72DA7B7270F72890003CC526930FB318C02285D8D02E0402BB2211C40B235CE955BF175FC56276D400D15CBFC7E1B2023A8C3C3EE7C781BBB33CF7A256850AC6768F0D1F5CC8BA97DB6270D4BCFC9EB2CA0629646C3E24322728B1D41E27F5BB1D5B7F00F03E1C290B2883F165419914B95BCAC91FCE2F6D67C561F0F21C700E3C74FCC167FD790ED747253F13EB63CBE5FE6AE782BBE6165BD294CFD06944FC1A4C5CC3E0DB9A8481485D8528690D9FD59E32749CB68BC1CCEE6DC672CB2D9B9380698F04661E0A278DE308BB3A62C33A68F66ED09E95D7ED37EA51212C761FF39FF07CA1074E4EF94378D6E62DFE08468FD6B20B7DB0D368210F5F48C0943E4C35E89390AF250169D3CB0F2CA00AD7E738BFC7889C83804EB7685B3453BAA356C7C13F38D35B4E4FA53E6D37A9F62C5892688B3F6DA6C72C17D442F4A0BAE48F3E792CB1B210022B0719F4A130211BBA8E2F26F6C29F352B6063A0E31942D0CB0FFFEB58844CC0BBAA24F871359ADFDC741F537AD656F04659791C4961C1C8B10A1A1AAC92F8705BE1E544EB85B0F52178F5A31D59548DDF0BA0F3A613FE694CB63C78984437C15F82DE65D85DD74B5E0F7AB512BCECEF0AFB9F587468C722F2C94DBC7631BBDE2D3C85C9AF0F38284F4C50AFEFCA3B594E2A5A106D3EA06716A8E450B953AAE90CD83DFA63C5B0F52178F5A31D59548DDF0BA0F3A61D53E381CF1442E2748DC2AC2919D3C53B6B9D234B01046454C6F53AD92A243372AF030E83B497BA576DA6767AAB2428273DDEAC46653026CB5E9C641151702AE00E8174E841C88EE28F353C2604FA7B70FC0C44D60350AFB7999DE88624185E923276034DC7796253D4560A0F841DFDB016BD3CDD13D6561CE0A69E415CD30CEBBA9106D82F166A6D3E8FAFE3B3B1F7E3A12C32DE46CDC9F3B761CB440FCC3365B0F52178F5A31D59548DDF0BA0F3A610E3543CD4840ADA8B7896603E2783D39E928D9919BB223FF7DC2EED56A9EB6A924E91523DF0B71F56337F1C61E2D9D9120D48C6CA5594F713B704535183807880DB60ED2FEA32964A78D91D26C505813512DCE47F9C39BFA579529609120E762A7DBE5ACD3E4E7547C51FC3C5D1F52D9EDEE6DF859F96B4C3DB8C6385DA0A4FD5B0F52178F5A31D59548DDF0BA0F3A615D0F434D5B36C0201402A9550A730D3DB1F9A78D34ECFC7733AAC4033A4494977105CFEF8BDAA379F7CD88457C5DCCADCD95DCF427051F37A01A4824913869054ABD7DFE15B25A944931B8A48D335677D0B184973D766720CC921BD9D3AD7DA0124542D7F69C51864391AA980B17C7927D34476364808BC45A0C842A49A7AB7B4ABD7DFE15B25A944931B8A48D335677C317E3E5A8F0A31EC1E20336EBCDF1E07A3084ABD06F2F799616BAA890461B111D5E409BE3720F51CE50674C5CE75F64648B420BD31B9B71507A1E4A2ABEB6E250FF55DB3711AE9BF962E7BA41C8739ED3F1FB96C62347341AC1807F45DEBA1960100825F3142BC9CB23C5DE6D5CC5D478E9D2491C6C1C9A414E5D6175D5FA0E5B0F52178F5A31D59548DDF0BA0F3A6126F652A1C2E8594F22872DD443DC84E84441A36CA09AD779FF85E85181DA9DE8BC50398EFDE8C90487488002BE1105690CE3EC5C6632E98CAB4ED73AFD7FAFEC3CFE1848B1019E4C80F376242A117656EE383AF12A2A70F0C38E9D2298FDF98536E3B295652F30153A37428C4C49218C9F05240782EBD0B97AF4ACF8233FF366B520AAE83ED7A60A34BCCEC6B98EBB05D77BA7CEA2F8D5C69B9DEBA71DEC101818C17CC66C403E2C1C212035EEF9901F195CDDD775E02245891B2011E38AC3B8E7F5DB7A1EEE624B145AAA974A76D2D6DACB16F00DB95E55939EB81597017B0134446856DCD03B2DAA5A26951E69B3AF3C8D6641EA16EC1CD7AB03C4BB6B4A1D3265F59DB1591ED51E61DB5A5D1A2F87553EADA174C3540E2D9540D4EC66D04A80D00F46646D66B3A859B159D6A50D4B5A19B45AA6353DD06BF85606A78093743DE1513AC19E8F612180371AC979C2FB02EBA99FF4153DE80E589AE2442695EDFB0C312C53D166EC2AE1D8CAF351C149AD49829054A899C200C92EB6BA747CD1103209767A86A7032AB168C2DFC59C784140E825A57EFD37501B2D29BB397A2F45DEEA614FDEA1436CDCBB5D2627175F50F1D9B7DBD8DAF7F63D3979C20528E6EC12D51F057B0C5DFF73450CA1F0A24DDC54DDD2F3B9E32019C0A5AFBB831FF99C0E0458E86D8F42D25B9F881D631C6370D0D3E59F522F6656170AE14F9F8E6DAAB9C88DFE07A6F61FACAC3EEA42A392210F06AA6CB0356254D374C28452C62542C211FC4BC31B47E5882266AD153BD7AB2265DB85D57320BBF6D59C3BD29AC4B744EB2E7D627D1806DD47477E332615693AFF192BDDAE8B775F702EACC0FAC789F6487FF9A4253BF23CAB5F7DA582E62A096C0BFBFAE46800601113BE6D19B2935E022CA71446B64094F75EA08B440982CF95BDED70FDB019C97A1B39208473FB42515FA65673E3FE7F491A73F8C112178F0942C96A4EA7B5E30FD87C11180977491AF3721A13D83890A3ADE53D753D8DD104A536A2E182965645EE362837DD1AE5F727EB45348AC939204DAC4A68E126E71E33E592CD0BD4EBF2D8331A4BBBBCFDF824206EC00D213B42C85ABDD8DAB8BDCCF2EBCE33CC9C8D20DB219A7D7CE3B57E9ADF82F20CBF65F1713D2D8D8413229567ADCD6406C402E09CE512D7C2EA5805BFDB335751A2DCBA8A00E57FA88356272C378DEBC61830C677BBA90B47361F0B0C25BD974685501B1A9F65F712006417C43123F4A48034654A69865091B79DDC82844A17CD1007CAECBA47AE34C3C682B02F5A766FA34248F7988CC0D24AC68D8565FD52F468A43D2EE000EE4192EA47D306588E0C36A568EA7A0752BF2AAE151EF528ABC3AC39CF9B6AE7A5B5DC017FE207C6B033BE57E3F321B1EF0173C7577A73C475CAF3D792E9C47E6533C7F6C5F0CB06C7CBB52EB31405E70231824F7FC0F9F64EA32802F114CF8A6B27DBE6C260201DAB6278A8FA05452F2FB0E60B1B527936DBC64F83D2A4DB65E5209D02A3C1EE4EC8B86E26852F0106D38933E3D862CA185771DE79AC31EB8034C0CDF9EA0163DB4EED20344B99E1DA0D47801D9849760DEC4BFEA8B771C5E102C66564BAC5534C7D1A43D47A7A17C7325BE732D70177BA8D4FC6232D0D6E5598C01BB493054E8F288D30D0FFD54E1B22EA4336D8F6599164F75B1D20CFE7E477EB5AA83E427D5407FDAA25349981AE48D2D3BE8707BD6FABDB620E9CF031B88FCB74F8A9723C70A401584D939F99F44DB4EDE558C86E827C8FF63E55376903651147E33BA5C0972A666B6CCE1B9C62DAA84252A1E9F880CE89946E9439B6D4B60972CCFD3E5624236858DFB874E3F53557A30AB3FB6EA7243B9B1EFCEC35EA4617D8B42BA54408832AED90683E4E22758A915D0EBB5223982F805F955FC68C2EAFDE2DD99E13A8D9E37B531053E980D81E3CB5E995D67F44398FA853E179D953E21036260B8D514379AB95625B447A42502E2D8AFC990314B504BD4E3413321686ADEA7FFE5864F8683291744A79D8003C961E701BA8DE060AED2DE23FA32C8475C3AEEC0014CF5ECB401463E4A47F06C5EC63309F1F57A2F1699D00B75525722E8BF451297D27AEEAB76782385F1E0A95051D543B4807D417E19AD2F332FFAA57F6727B801AF8F0487CA111FFC07C81F96F911AD1E75916CE6D37EEE631A6A2D8D585346703B261917C7DCFA178E55F45ECCEF116246AAF05E4A6F0527AE4FBCCDABE4287F73FB46B05849D920ADC00E611A7BF6CC4A65F1FB371ED68862CE0964DD44E81AB64EEADC571EBBD5225BE78DFFC5B65EC3B62BB55493AA0FB8796B0EE28D884F8C0E6B2DD2327B5F62D6615A28F8E2393FA185A982C15F679439B99E981BFD99A66CAEAC46FFDF2A665AE537BE34DCD020DC6C994E7CF310A57F807E209AC156A16318E2DF9B9E7114602CBC749CF5D0DA747B22B176DCA1546B774DC2785FE38C1B182BF5438807EA41B8E31159967D4C926F50F359569F521BBF17A42DE6E749617458AC223F5DFECD40D384CB447381F945D16D38E55F329FB9FB06AAD61D1F57B8BE021897CB9D539ABA6C5453FF323B5D8B26D47FA061DBD6098256F5669DB566717C2457AADB8BC487A085B5DCB1A87C2C25D743EF44FB174B66B6675F14C77FDB9B28FBAD23BF3B0DB0991F1FA1BB343063A9E8A961D3D4E47CB4C41F1CE18C4097BB71A4193186B76694A4C1D67825D2FD826D1D00711B21E51F147883BC33C19ED427878ADBDAC3BC7F59BB0E0056BAAD24E35D9C523587C235EF7E399CBDDA77D10F05F7F1C9FD34957EEB30DB6BA17BCC7DE0983C89B9AC539394740355437537666A77413C0A1F2E4B2257D66BBF948B6C3D88095AA3A2E1B3EE4A0834132ECF15756C5F19AD45059AFF07B43C3B307083AF349A1CD2048D52E2E74A0715ED7074FF74066CA5274FD226D29E8F9A5BE22CD317772FD0AE65CF74A6F671C5064D91FD3145A752DBDFA26C53521585345F5A31A1AFBF31AC2DB702F28FACA51FCD577FEC7397B2405400057B44C5A0512785377B081C75F12EFD67EF3739BF7C53D736E4CB13CE5D58EAB0A5D575588A32CBEB301BB516021DFF09E8D16EDC2E3CA5F7A766DE5AF412867F65786CBBACE0551E98A25A3ACC07EB1A3E2A08E337F72BCBFDC18225ACCE32AF7F266818DA10BBCE85BC042A76BCF5481DCEDBC9BD13F0986086EB0E741CBA5116401AA08336F73B5AAE77758A72601A03CD94600197726825C838B3B9F2045AD2D5342ED9380FC714B9F5FE9C45CE9393BDE2B3CC0FD3D77F16557BA60535432ADB5E8791C495B60A45EC042378DBF3992BD3E40AAA8BF66EA9ECF735EB67B1B2A5A5CA2CEDBE06068423D62D572255CFFD3D01A235DA5A5BDC2EC1449B3B9F3FF232CB09D384358DA197FFDB27ACA8D6003C2C261108823F383FE3DFD4EC0E295AAFE4DF8537EE883B3513AB6AF4C4AFD6C05A12EDA51C92B8FC466B478FC9B31A6C4E3B541C99881EB248DC13E6E8751B46D96ECE34F40EEB449014CD59074FFBFCEFF66591C52E4F6B04535C2F134B1197B99869C8030DFD15D84B7CAD57DF7EE134C91C3B6AA5454185348DA517A3BDAC735B33F0D2A7DE032373E52D5FC0AF626B882BAB7F2EF093DBC776E1822A7CE2EE6639B9A2F833DDBBB629237B29A2E935004D215C51D025042F886DBC5077A029B095214E8FC7854670B3600743D1F1B3594F047AC77048A1C1B2668B59C67AE95D567707C5EDC3EFC4866879E12EDF53D29BF1C183D84CADAE03318FA8277C5816658F6B425AF427C75B754EF9C38907C74EAF44912A9BE463A4D4E6458CDFFD8ED6763F25C3D9590622D4E793023EA06337F0AD985431463FFDEDFE446B26929B4A6530781BA584532E4C2BA14627C9F0B7CCE3150B4F5851E10D5F3FA9F6A42E03146A1A10A627DD92A2444C17D9BDE40E8ADC6BBE617BBB0996D315CF43AD16CB64B8FA24F1E07A0E4CCE6A1300EE436B8E3EF3279EFD142A75F131FA3279512C6ABC0F28D84A1B2C0EDEC6FFCFEAC19F5F6C94E2528883E4AF3EDF3A297E0235F47F18A17EAD1051800652B767C4BF0AFD56FBA6428B7217E764F435FEF41D7A3B621E20E0CF69221337BCAC379E44FE43FD00DD5CA5908A0B9FBDAE01783672E29CBBD1B7F276144DBA9B8B6129520B693808A9E7C76A68FFD111931284C77F0AB8418D55F91ACBA03F44593856C77C7F473417F250A2FEAAAC16D259EADB31D27171440407949B1F2912A6CAF58F9955F8FE99713491092B9479AE850A2EC7B7C5A130EE9B23A1AC56D2BEDF632B75D3424A01CF1FACC903C744212D93F044E22019106C0C662726C52DC92C8ADE5D9BA91B58F5439751ABC638E65D6939DD8ED65A947DF54BD35E4C3CD188B6288390B1421BCC92661703DA704AF78C05DC054176B9A115614525D84A05411C44B183FEBD7A860CDC09467F8E409134681460FD45FFF21A4EF4716D1546284BF8AC32F96899D76E391F3050D6643C1C32EE49BB4D0CE850A246D585032D58F9A677A614E98614AA53B7356C5B4044057ECEC7A8AAAC312676257C3B86498298E665E2EC2DF97BAB727273E63545EEE701E02035CD63253DACF7CBC08B27690D8F85A64E72076517832EA5D2B3939F118050D89A7B17AD464A615AD1459106D48EB3C2BEAD6D9BBEB1044FF296763CF5519C19BC5AD8A6E808B80BC0C14DE982A7100C77CBD08AA57E6ECC2363969FA0D03C0A70334E0D891EFED98A1B935D0ABC4ADAF5382F630796250C7AB6ED5C653A9DBE7770955BF3A03A473EC1224AF8ECA0ABF92FF07A7A8C4E91DF8684C96CA5FA6C528F61D1D5E3C2E74CE982B0C18C241CF6E18A049B477FA52E6BEE354F79CD6FB8EBCE876E01FFC8A72777D558CA88E2E3D376B7788F254BFA1672F8DEC36E35037FDB72E4761E0814C02F59098DA1976B4EF18C3C95DA30BB36C14CDFC9DD1C9775C0CC6A80CACB777271438829F4F6F87BEE68D48A875EAEB2207DC849A60BD036DD4A7EDCECAEEF5F06743754BD166F12DE4CAE05A669E5A5153E90A0448935E2C692C4485E78E6E5A73D764405812551089C87C36492A2E34738F895FD4D57DAF324F563B69DE5F373F4F723434B605FDC221B491621D0214FB9512BD584203C29DDA800DD08F107160F53659D8B755F2FC49F1FA8B2C47283985A5260BF622052D0B7920EF23F7776CC1E7D3118D07867C0BD20CA80A60D928EF0D64268F1DB2FEF8DB116D65F0B1EE7DB6D66608EAE6B9D573C964D0F69ED8674A4AA1C567D8EAE3EBC53DA2B7369E349F36EF7C4DD34AEA701F3C876FA314706C6ECD371B106CB1F1BE02483F9AC50CC8BCE7E39FF84510BFCF5A4DA44399E86EF902F3DDE79C67AF35F3BC3934AAF510307AD8B6CFF9FF5B63235D57F8903B98DA013C741C3428B56C046739B6CC0EFA0C03C5E4953D50D26C12E8E62E6F13C6639FA949723FDB6D56FCEF39FCE897D7102A8C43BFCCA4C258152B325D1EC0A59334089F7BD63F15C5BEB99068B240D7E5FE892F0597B4732C94A14B39C3C435A01D31AD8311E857FF8C47C576ED7BEB030A0264A67CBDE7C2211CE2B5CD736C6B656F314A70ED909ABC4E1C32E1B0A09827166B4E2E8835539C3EB777F63A9360066962637D660173C2BA9451FE2AF3F6F7FFF5AFF7EFE6F41D157776078119E375ED5D6C73711E3B9B387ECD8A06570AA6B6C0EDAB12775763250EC72AE936570950851D7EF303CA26EB17D55E55CAD97CD00109E80DB720971C9A8EFF7767CEBC81C68003F5282A8DAD68536831342E75C3A03CBBF48E22EDE3755F34F059B15F879A35F757505FBF08AD8655392B0D8E539F4C53DB9CCFE8138FC268F42AF408E3185FF07E8F61B1EAA6FA46924A16E65551913911C0C705D26658FF42227DF851A7404C3A0082BAC3F0504C8E8254EFEBF046C7508EECF2183430985F381F9A39FE531482A728683BD221182415FFA1E9AFB70D6708B511325BC21C623AC530E45E514F5F389CDC32CD0D2A65FB01E39AE339519D3848A47192D5BEC78E5881795B2C18037703D79A2EAB9BE5BB06474F23ADBDD42171E899BED9EC44ACCD96719262DC787F6C4CFDFA6284207502C12152DC25FA060E7C2BC90A55228C26DA74A94DD69E1DA78B97B7E72CE22D07EA33EB83FBA0F1BDC65AFC4559C9D7A4B826657FF22AA584BE89DEBE40E4FC69489A16BD98842F27E7CED00E5C7864673FA3383B5FD38353230AD205519AFECBB4EF009CB6EEAA912E7E8A73D6F0EA9E1AC743CA050EBA10115E5A1FFCF3F27E072F98134776A0D3F0BED9667BCABD9E68EB6BF4F46270833D34C4A875E1F17C4CA0F8B6615B2DBE9B2FCF1252E2A528BB5F5B63960AE4B7174C9CBD99ED1665E24446C93C549276A1A48C336D22208A7234FABF3B984574AD550C030D60DD8E2850915871093F6534D60B392667428BFE76AF04A4D34D7737405AD8274A514540925720C873A212F25D63F2B7A181BB6FE266D01000E527C5134994B99F630B81DEC3371E5B1771B745B0F369411EE1BB53422D753168B7F055413C08221EFB76A63CF09CD9167040A8B961065D8F9BD1BB75411CE7DBCE4671D812A603D8A9CF932BD070D966A69923CCB3203343F233AA3FDE52078B17F53ABFC22E73D515A63A3BE56616FC138ADD84D6E2E3AD1F1BE1DF698F8CF4E72B1E3C3ADEADCDA90FD9A2B6C424516AD28DEF9D96BA82B0835E0716B80AE3BF78D7F0B9DAB584C51C540342D89268C316931851EC580C7F6A2AB5BA05F98582E19DBE167B9DEAE57B78DFF7D4F6D322D8BC138DABCC44B4FC97FB514F2F4AD0E3BCC7FB6DD1C08638BBEE1C5AFB722B385CC7EAD522E5D78B9F02F21AA53079B499E70F5D450C58CC9BC4C79624DE65BD4BA8799089A7A32456DEA32393C6753EEE364F81A0196EC18EFAD4E21914A446EAF8CAD124F1E2A4EEB54F3B60B7A99D50D9414F488DA8F2F87ABFC79FBBE3F204A6D61870D46B3B2F4DF5ACFE088A6B4D3DD966F8A35954FE1EF07713D6BD849D64366F67711FFBE2217A177F6F28115E82BFEEB6F2F007083BB2B75A2D72526A9DAF638A94B714E4DF066744CE1619D977E20F1E490FDFD2E3976F650DC58D5D7B1052D31F35B95D7ABBE7DCD59B876AC99F0D162ABD467EDE78ADFFEA4D1ACE20E949641520FE75D5C1CF14EC21067A2B27DA8F989BD0ADD15047886AC273C7DAB8C1BA563346EE26009667414631E71B3564AAC840847A22DBAC0DA87A208CC81CC22D2E0032F62D62AB77E2299C2CB44DC9761067A9C083D4292907919C85F0E8EC9394497F2B9965C1455C0091D3AB8146A4D0664C5B24D0DC5F8FD23DEC1BF7D6D6203693D3C8F447B754C9CCDBE957863F534F69D4A1365A5A18648442CD5A53322EC1AF72287ABD92FD82B1510FD84017C0496C0C643D4E457C2FE492E2FE3F4D7A16389078FC93737B8A97D5046FC941EA9D291752DEF205A17A9761573F9FDFE232EDB3F60292A8AC3E23D873DC1A88C0712DEDD80265575AA92AF1AE787EEF161CE164B5B9DF9D7A2AF8AC605BDEEF0C11E4345C3823E86B63B7CE5D7A4B88A2E2346FD9FCA6FD90BC83E536F2765FE3A625CB4F147C834700044CF2DB7872EC8884F808FDCEE5D1D6748FE545E7ED3D8E473C4BC2EAFD4216BB7C5038072334B4F63526903802EDEFBB056B0FB76A768D785CC4CA29A206E32961ABFE55ABD5BB0DB605004F2B364B09EB48B68962F13512533EADC6FFC65EE25535426332F928D8C30499C51624825DCFE28DCC31BB6A68FBB22CD4F0967BA1B361C081AA1E9B73E8FCA6610445861BD3F0B37DC3BBB19A36E726D46207F3FAA4F1708049055926633A441FD9E624642E4586812986615477D6FCEFBD1EBB5D0E052918836CA5DFBF1AD147AD9AC297318F74F22E07F3157C4B7DD311A2F3F93D66E335BF5E2F78BC1BC8F4967C92467889D76226F5E92A6177906E7D6ECA48692AA3CD5358970E54719886BCC1C394601E8D4F439E3B8C01EC73AE2DDC576DFB57C5F5BE1A5C52257461E9F17056878B49DD4723F16FB3A9F8624E5F5A4DDAF0847E41F815A8817CBB42D606BE9A184B4059D77EE30C64DFF6A8F27A7FD2E878B70D9BA63C5398BDAFA5A3B1FC2BCBA6EF9051E12936C7B3647B2E1C48FEBF6A7CA1287472F0F4F5A274D0266B275943DD48E1FBBFB41A967DB119C1DBB9B99BB1D93B2BF55CCCF83FD17B8DBA7D1BEFF995D67ABABD7FF4B51477E651FD8E1EE7E650C6E160E8E3184F9AFA3CD2B7D293D25D831C6518F40B264849C74226EA8048C79F786379BFBF1BF97384FE6DD2324924DE2678FE5A4036F45E0B813FDAF968A523817F921AF4C94B6611C04E41BE91ACDE367FEF119742B0322AC0516A1C270E2D7831FED91776F1904C81877B74D93BFA6051F1FAD2C303A37A1B4611FDC1E57F96075B37AE6A5295BE842161115052BFECC8E9B69266455C914994822423BAD5791EDDDF4C81C05FC7458AFE17C4F6B5FC9E9A7659500F582593A34525D56D5C3966EDF25BEB2A4B0E54440643705C02E6B96381E4A21E8DD797443A5F4BCE60D31191FC6372921C2C6815562B8E7B81AE1A827A1AE2FFFC6BA7CB9F61399A91F37101C1DB157FBAEF6F20A569C2BE79608D2E426DF0929E4B9ABC8019BAA5F276B83FE05F923D3CDD9B45B229151B20E5FC011A6254B8DCA42CED3198C4B453D1C43B386106F40007C05047DC1884719D07BD9729ABE87B0B847D95845AA31AD177124EBAD08E5A935801862A7413F1241C7FCB5C24E3D204A6B982E6D86198552597C9E35CAD46CD668AA4087CDE901C6DEB630E92FBA1DBF06B5415AA776BE410400FEF562D86267ECEE07106981614EE78FDD3342E1003DB418546FA84AA682A2BCF2001B3F4D5D94707A4B4600141BFDDBE6BA9D704F331EDBE9BE3486BC5C3FDF94BEE51099989F10F08115E29E6DC8C2C6F9C06278CF8550B8E0AD0BA79BB6ADBF3BF11A883E41B54BD588298F9EE03ACE70CA38E9FAD11A403D143A34534F266CED15D32C85509D5394689D715A66305A26231E2860157B479B36AC47138EA96A75ADBDB01D115B820B310DD013B81C0CB7E2553CD2694DEC474DB5A468C260E5C21A9C2311414354F5810E6E34867D9129787E4C64AED7EC64CC556D16CA6C96C2B4264C5ED6ADE8461AF305F40793978DA2F99178EF33D7D7599423E1161D0F0959A6B5CE7248462D9A16E15C6CA67CFA9DE9D977D8FF9B24C52F991077E34DEC41767D6FE22A5B5D9DDC0DD2CAF294FB3CCE958652B6250E2A8EE1319158B38B21252B467DD5522E2D7E68F9EB94169794DD7C514A29CEEE2FF507937F62EE8FB90BCA1B911D1BA06EA1C8A1AAF598C0C81388E4FD0D2310F4AB98C56987B620F97853B02AEDC3F2CF3081D2674862D754F96D0E1FAD2796C3310D84AB76D512403BFDE5C8141C5660E2FF42D2E89DD99D3C364017C031B917694122792D91443DA5C556C2D927C53664D63B17C8EC8C63D8B45CA3D74D0B7CD9B57D7DBC591D86F001DE976764410EEBB57151C31887490DDA396B81C49B5203FA8BE424B36770A361648DE5610D24AD85FF0E8BFA76A48BDADA9D99ED220EB1F190D56A41DB7CA1684C55F9FDED8F2FD672998571954B9ED81DB3C8CD5E71DAFF453E87EBA89F3BAD615505592B4C2EAFBD5D912DD8FBFEAD94F200805064160A34111AA2C43FBE66E973D27D5CC3E0F2035EAEF6B186AC52A2512CAF788071FDEF03E348B42EBEC6263896928E498280F58B99083CA3B10A19DCD283EC94D74EA3FC2CD37AB5A4983914ECD4DDC2DC80AB8FA6A95C945A7CCE4885367939085C9E97965B160635723C2A6EBD15852CCB84763BFE22E0D87202024A824BEE0E9E164FAA0D0F473324B2597486B9E27C010C90C5D113163B0A9CF2B29C909CE0951850424BE2DD4CD21B502536C462A55ABB4A3153D0A86B7232B8CA0DA55443F1DF4BC9240F80DD34789176421AE067E556346296FCCFE47DDA106BDE6E469C9B7B88285B4376EBE4BD777C93DC16858B8C1AE51D9BB8C8603D66570B7F63885FE41A03FD0C14B908A83F8A463CB38D3E02468966F1D62A9AA76063F627E72659C0593F76212BA283BF65B84A100943B08AE7AC6BB1A718EA2D17DBE0C2C387FC43ECF7C60BABAE526EF7BAF7C3AF1DA32909AF9E575359219A96FDA6533462689C2D177D4A9C2BCBB23603387D55C70333098C529FF92ECF72E525CF43E24FDFDBD1E909EF188DF48906B2145472AF71B461FB2A7132D5CF6FAD6E109FB1A7A48F966B0CAEB6242351F6367AA96AA4C71F50DF33FAB9669CED4FC01AC733E16B46F6FA303183784F8AA9C61E679C7EC09CCC29A5BFBCB671630E14DC60D467F0C05EDD74D307FBA09CFE3B2114E9263F50DE50309BA45156D428A72B7F49DC4168CBF72D41686D6A3F4943917F46787B879071E6C00BF2160E44EC5505A9DE52862786F7B80C2553200013F3211C3D936D675566AD37148AB96B62CFB40EB928D4385CAFDA3AE87183539DCC366697ED0F04C2FEEE86BDA8D256935CA0DDE2E30D26C91FA92216928B1E2896FF29D8EADE611DD5F21EEA0D6B6F7A57DCCBE56C51A74F61E8FD242917EADD4149290E9ADA2361845C4BCD4814D0245BE4CC17B84F4D6C70ED07C2C579D08B782B6D0D68BF460D3214E320FCF4777F5B21DECDBC2FAF9E0F5087F7A683BED41273C21561F4C2D1D7C7D2053D168899B94EA83AD51BD706956B1D6685BC6317C32C26960980B9FFF3D2131F691D7A70113C23F82F61A4BA74F06068DD609C0D64E38DB0D279693E8131ACCD8F1F185C4EB988067DCB4AB4755030FB552A25E294EA9EDFC2EB29662AADC5172231EFA9F928022023582AADB16A57BB182806D6190997217B1120F1F0425BAB2273C4EE65B666283055A9B5FA04E6A13A8F9F547FEE7DE8ADD1A3BDFB07E9B4C8A71F786DE7CCB74B39FD5F31AD5733F0281B448EF7F8B6F643176623C532348D0923DE10C23C3D9C05BC6D40F3A25A6D0B10456D2E93677C783E525BC5E4D4E72A041A02A65E9A5F32FFB69B9CF3EBE13CF4A0CE9BF05C0BB49675172843C61905D28AE89ADBD2AB587BA15695AB7011B230FE0A5A33DA46A3DE53F838C0D9F98283978A2066A350788D5DF3592E92D87FCBC9799C439E32FE0F467B0C49E8B06661805D117908BE3A2502958E3CF4F31DB1EEA12F93CD0303E9B69479986EC54309FC84831DCF9F71850796E6F02D733E52000DB469D00D8F3C9C77B37BD9626693683D97B4E4D21213EFB93A4C48305063B03C574C76E79AE443CCAE87961970E6FF9AB389C54FC8A3016A273237BC5D45720B7D82651F8A6148A28BB931FFE32D3CFE9FD0C95E1CEB614820857BA3AEA8693CC976AA7AFCDDA684DDFC6C1FD08165159A3A54D1E6C784CE7B1D8EA359F2175EB9AF696EDEE12172448CF3248566FC65731B335F97F81032BB658BC486D9B7D598025E8B45F5C70D00DB2D66465C54D1A16A5C49560622C851308526C0EFDC116205C39C6310B0912C5E179AB6DDDA6721D33F11218C5AC587D038336DDA3CC8325C8E0912AAE814AC734AADD65964A0BABF81F7E98ABAEA8DFF2D080490668C123A5F92425252D9E7FDFFAA91B86A9B6700999DF83469793E5A3955C16555B7FB133E7F6982BD53FD7FB293FC5AF3F89F92317705480A6C8F881FED1CD1FE1622DA6097F302AE13D95D3352461A7BDFCEF892EAEA58D7768C99D675871ADA78A46BB558B34BC7442ADF5E72878F7F39B124FE510167EBD74E95FF1BA1AFC4E71CD98B96987AB1318B1FB5551ED295D6614287156BFD3E153E01688DAB135CE6370064664B8265E604020CE973DB77D2AC4462237371A0893D8A7A3D188A2F226B57E6411B4720474986A7A60F01AE0BBBCCE9BAD9DF6B0580F211AB3919247589A14D4BBF245F5D84D8145B20C31B030C491B8814007DA2ADD59E84FF5FFE027E54A683C509C8A9A5F8B3527D2AD6A5EDAAE349041A369AFCB7DE463A668C8F6D4CCCE7D09770E39E61959B6C21F543B416BF354B802D432F364CD40340BB14B4EEC95F0930D156BB99A47C2F5838FC871387051BD93B1973E375A84090A0279BEB6B476F26C47DE1171A3AE91E77039BFD9BA1EFD79CE655DB6A6ADA3465131D28523C10B0B345E982096EAE1B390587EFBEC4735C5D6B28DD12B45824B13EB2A26D4BCF134A594E46C3E899D94312554DD97D87BAA1D89B7492798FFB9234D2C92BE548C82FABD61F381EB69B97C5C7B1CFB9CD4BDF9B15B6186D4C6C71A53C7AE533F0425773138C8617CA9A49399F33F4C799E2797FFAF07A1710ABA2ED3ADDD848218825634D3FD38DD2F68B6BB3A1F3BDC6312FB890FB3033D028E6621013F7A0E53FD5B21A62D99D39AD3386BC8AD9E4A97D8A7CC6E3E735506ABA84705AAB1E668A63CE3D330E4AE4583926EF3ECC5B9C02DBD11E3948051D7B35E7D0B29DA21655D336D7A24D5E8BD81C12C927B43653AEF54F6C21EC6015D2C440E5175AD2B44F3CD493B853D91790C8887E50175B2D15169D34FED5BD5249F6F4975FF87488126DB51BD212A404373C7959715947E365C911DAE00F81FDE7498C7AA27BEE03B89725E9B9F57AACC33F575E1B6ABC470AE9F089BA2622A0D9D33311D55AEA0BBE4783E95DD5633F2DF8B1A8A8AA5B85A736F51635830A6C72D66FA2D9A7EDEA0E0B114A2E5085025198D3C09E7DD414CC63EB742E7F79A716CF1E86CAE5C7174778343EC56A5B96D9CDD32E2A5F0B072D799B77008C1FE51C06848ABFEFB3ECD360AA6B00F4C16261F1BC713EB0EEF6173E3090FDBE444A2414B259BB93B16163258C1C5905181B09C7229C65080E4E1C54C94E208CF5A96DF2FFB1ADCDD95A76C83DE4CA2CEB066FF2677A46C3FD70DB72C4ED1F8AF78A58AE0DCB7F5BC46B8CDF1C279B7894D4548ACBBA6367B190B9B1ED65048790A8B81A1C18E3D6E16D9BA6A8B435DD6C523034E72F410B5DC600A82AF2A6F9D51FE23A7912D3221D320CD6E557A9B195AFD8AD81ABA2012F3E3BBEB6FC5C2871E53DBD8DCD708092E1BF7C1F85D4A6C759B3F85BD6854EEBB03865AC1A6C5D659E34078BA0FD85FF71BD2F40059B955FFE075B69D875CED443C8A0E16A1D3ED8C21684A2A7BA78A99F00CF3CD1A9362AC16C6B6D8D5489ECD4D0EF02B645901C9A7B93B43D28523C10B0B345E982096EAE1B390587EFBEC4735C5D6B28DD12B45824B13EB2A26D4BCF134A594E46C3E899D94312581488CA1CDECE76006A0DA2BE63059BA0C98D76B2DD92957C6F6C780C25A3DCAEE4E78A5C7F53F79D92329D76D6BAFEEA4579FB9D4E57DE35D4A84CD50C982AF89CBD30512E4C04E9587BB6F8FFCD78D290FDCFFF1F1F7C11E0476175A5200CA59E75EDB8DDAB8D47E372995D6E1AF200648BA22E2D995C79D9FB32FBB0EA94FA66CA231EAA20106C625B77798256EC470F98A78773760038ED39AB71B19D5DB3EFD3B77E206A5B95C4E9CD12C5D5F696B7FC7CFACAF4495982232F8F94B2969F0A774B67FE1CCB5BE470D7C156D0350318FBAAD273FE5AC8DE1AA20F43438B6A3B408DF01072694CEF830025623E304AF3B62E1C48120E144407E7221035D32F7BFD5E3508455538DA1D12E0EB2344BD5DAC76110ED53961A65AD381BC365EFC785EEF542B91B40C685DE0A0580AA9A7394FE39D1DA3D0CFB207875F4408E851EE361BEBD533627DDF4657B10FCD25737B608E27B0C2D70924E596AAFA5596C2165C1CF2CF536A2C071CDFFF3A1F44CE51861294690272B9D7829A99A9C3C918AE2BA194EC567F088AF2948A2DC2A3EEFB95D3B2D7EECFE96C14087A55A3C21234D35F7606016CA79CD65A767E42646C31D91786A3F6A6073DA31393C64529453B930010D0731087F99DA4228D626D2789E371A9812F12397F35A9BD01759AA533DDC1198E07FC8FB00DF6CD9D7AFA85086FDC9515CA5CE5C1FF2411585C15CA3B03C4E7EA3B3276EC6768DA77F460E5489265C3C023DA7B3C992FE08F90CA38C4F6C058B09BFC3EBAD4689D0BB5FC5EF395BD8204C8447D3B993A137B0A05E9800F97CC7AA290D4D519EF8D7221B7D44850714142BFCFBC2EA44D35E942524C981763076086D3C457745B5F4A73D6740B8F7AA92CCB5A5809DC411B50FF0E7E3DA8775BEC7CD683F4FCEB2300D09265E5387E67EC193B8D4DCB33C5A0F89575B9E54DDC49845A38F4BCE0125EF1AF735C38448C9C4FAB3D92F80137094A7B0F92BE205C6BBBC9816E1E9BB1E6B500AA377A91EE3FAE7CD4ADBE13AEAC7101F65AB03920B471C451904C8B6BFE41FD5EF395BD8204C8447D3B993A137B0A05E9800F97CC7AA290D4D519EF8D7221B7D46A0B1C2B89D0CC160D61784E98A2C1AC981763076086D3C457745B5F4A73D67185327668E388C1CFA1F5E9B5605FF3A4555E75EBC3ACC2034F97F17D7972692D5DAEDB47CD4E91B3E34E055CEED26A6633D0F0A1CA9D3081B65AED250C648128B299FD97AFED5087B52DC541C38D5556713333168845DEC8BA4B19DA49857904FCE7E3776D73CFBAE75F584289BBEA2179B9F21B46D1088AE2E36E2C7AF474BE103B591DB11D01EDD54B71527C661A7084AA9098E7F9134D256791F9FC5F649C8CAA30A2A640D63975FE3031F6092666D05981C85415ADF569AF793F147AD7DD2C54EC1245BCC2BF127D2BB95B1694FBCEC3FEE1CFF277FA034FB3398ECA4329447E00D6286DA0645CE08319CF8C83C595BEBD034FAF7B37C04CEC3DDB8BD74EB3ABCD78425C0518B004D1B650DE65E64AC1315B983A64F6EF560CB48A49286DAE9BFA28FC8BB1C84DB12A6D1B0188DF6CEF0AA558731D53BF82607C82014747EDAE6DF11D6AD59037FE7F2C9718BC9CB5DB73555086A93EB9CD5DBF867090AC107966DBB61BECA17184A4E8D0191AC4A665AD1FF7413A4C07D72A0E28712A86A7AD3DE6E3EA5CD42D6200CEC38E3D92D1C6B6C101B620BE98DBD64685E7337771974746EBC25CF6F0BC2B447689D6C25E140425A7CFC81C29B6864EFC0FCA8A228393446DB215F975917118BB850BF09F5B69F6EF0AA475A5AF36D29415DA0CA7DDABC9DD77532CD72ED31436CD3A25B6CBEBF886E75BB545313772BB84D969E740331149AF9DD0CD2178A97C1EA7B49F9ED3423BF220E2E232F5A95495C9D135F399F6F35A1EDA6E2A187FF427B92D650B0517C90D8BD0E8D2B1C9C27AD2156917CD7A6CEE705742BC44142B8553BC7F59E5C8D0365EBB8BFAFF6B9486DFEBB6DFEE586C14CD04DC913110CAA15BF8FC1B21098AAF5A52BD10BAB0BFA34564BAD68B5569BBE811907895657042DE014C02F79A07C93440C2D1A0BEF048FB5D470F858E79F3115CAA7E4C9F59E7D7486BFB1BF8EF2EF264F9BE77FCC8F41F5B803C2A70B80E6A7565F9D3B1123137BF6A27E8FED2D5EA5DD86EDC8CED518571E00B679A0F5909CC12A88D8F16D5C10623B572ADB922D7665D1868E309E747CB1A9F948439352ACB73262D29FD03FBDDB9B287F83B1BD9BD2E63BB180887BEFE255BD185D4488F4643AE682F5DE1B518E018AEF407D1AE64F03F91127F1CB92381B3B02A511C5853A9AAAD2DCB59B1BCEF314E1AF5719B5F28789AB75A4DD67512D446F4205D121903FCC086EC0A2C4BCF650C9A52C3A95F21E43415D231FB0B3693B1DCCC34B85B83C7AC395429AD6F752D9919CE9BE8164B5659A6F9D6E56F5437A2E93AD7223D9FDE9AB90855E8CCC0EE28C1F2107B295FFED3A96D35D1D8B7F2433EF91F62E7F585B9ED1D60AEC14941D21723E7EDFDDB46F923E9DAA08061357F371498C531E0562104CF007C68A770A51B6FC61DBAA3CD81F1FC7F99E579FCB6DE1862E72C4AA12FAFF71B3AB248D2B1FE10325FD4AA8B63BB537B08CFB70CE8E350B10535ECDD41DFB2557014AB0FDF8555131E27F73C6E0FAF3A5BAA1743B65B8F48CB063AD55C78BFA843A105360C9723693E8879A7C52AFF19F6E6925FC33BE1FD55A067E69998D396C89E151172B9BB13A88A4452090EC222483E969C2DA200B207F307B375532EECBAEF7E95C62BD28FAA5AD0B52643586F46E0CE72F17BD318768490FB55C3054AF111485C375895D6E7986347BC95DABF00A18470374F646FDBB46E0F1E3C1B4500B41CB7AEA5A2CF3DD5D24F613C341922A741D0041D647BEC77DE5A2C9DCDF8521D9171123737621FBDC7FE810F1E2FFDD7223A07F61977D3424667435361FA15A6FCD0B7B6F7D140A977D7268D77D3E8D8D2A55D0F10739ABD4851B0637A350550F6B893627D592BCA6796010586753DBF9FE729B8D67CC769961AC127216DEF591DAD59764050F5DB6B55E151DF2B7D748D7F27677FDA8782659D536CCBD790C700B143066A932E5F6CC30D027077B7501A2B3C5D77AE79B9D78E685266295F5E106C0EE76ADEA857B04B5DD6EE37897540A34FF40A9BE08FD4523576155D02484BC8E08717A6C14C6EEFDF01B9587805B92E44F99363BAB198549 \ No newline at end of file +EFE643AF98362E004A0B709FC1212F80BAB72360DC142D08F4004331133594E20668B50E06A5B790C162021C4BA45A5150DDD680E8AA307A3BCAE59F8EDAE2F3F3BE296208BF7BABEAEAEDE0CE8792AFBE8A31AD3BAA5F06C5F6EF7962292BEBEF612077D2C54BF73609030AFA17C3DF7D78119051188791EBB4D79F2FD9488E81061B730D1F58F0054A00880AE7604B8CA1145F2690D2F3EAA18F933258BC3923C608BD8C16DFA2992BD82C9FDE1628C94D31A8B3D3F98CD71665FCB0AE232FEB47447B8ABE33344078508644FD8BDBCC177176D506F77609B94A8AA1558BF53F365DFA4234C7DEA81A08D9A578058B28D2ECED0A902CC0666D001BBA6E441A56A5A430E0F2EFFED4515B1EC7032739BAA30F57868E734BF72594331E00EAD996AA23D50A59A2D4151B4B041E9400D595CAEE695F68298535F14B29271C1C54CC26B74DFB34B311B3620001A4BB13D3773F250616F48D2548F5C24222BB073C50336CB9A87481CE86B59D3377E99B2306459D775DD67DA3EE957C3740B6F777D198B88A27CE86CB795FD742350A7F39F5FE058B3A382D1B8FE121EF236415EFFDEB739B19A6EF285262C1F0C845C9A7B1FADABA3E2E87AE3175A1C610FFDCAA148B32D726D741F7DBB8AC0D0E4D8BCDA02F6F44F1A2171999237D22EBD42977D2C4CF4E1C8069E7E7056B7A9157AEFBE82B4DE2655C6E75C8BB68A9AE2AA2F97E66B30B14F9C79C3D192AD03376859365CDD172CF03EECD2D99AA720EB15EA176F757009C01525768919D35D71FBC6F807BEC94482214C91FC07F2AA22F31C56C750A0F88DE5C67A312BEFF4DD509798ED7E030492A4EC1ADA3052442845FE367871E2D52B4595016F1F8375788BF6C3816DFC8567C5B8106CCB8DED71D8C2E216FD5B2E9E4C74CC1E835239156FE6A580B57B8C279556345B70A0683BD6CF046039D1D5F3D98383B3DDFDB43DC1394ADF3C401FA87D11AA011DB68CA3C6FEC41538D807C94D7CE8EDA12A5C734543227D9522683C155B54ACE43FB50B2A7559E4783F5F5F796504B389210B8A304B7F615522AC2A27EC188F5569B0FCB2AE006B22B1DD0FD8FA24FE43F24B62371F795752D026CC5CBE80133BA8DD60B2585ED3CC823C34568EFB7C669117FE8520B21FE4B66640EB747BAB87AD132DBCCAA1142E82CEAABD687A457E800D2DE96D43047C165B71DEF5FEC951EE192414667E370585895303C3606EBA44F97315F2EB2B3B95A0235060BE892C0B3FD7EAEFFB3A9E04568162B0ACC8BCBE37B201CD3CE326745FFB4668943C2CEF294512381BD15565F799477B0CF15BFE9A60630006705661079639C81CF5A0F6966831DC548D5EA19282A980BCE863F35720BA54104F7D0CBD8D7909C06DFBA397021DC816DC1AE686E5736B88F0B6D690B95E538F0383F8E85E2B1F8B47C569E751F5F597136AB1364DCD069722037D084688E54325B3D4D54C52A8B7286A581B72644F2B549974DDA1FB0439DE1C52427F6B1CA847BB206C761A2F3A3CE20847DB98F74F49FDA0FDBE907F54E60D5081148609905E4B2E09EF4350FA0362AF990D14AE43D2CBA05AC537DAE102498B52B4F0ED2FA0F43CCDA991BD4BA62BF1DBD7F460B39DC225BCEED3203BCCCD276F037C15B39408E07A7A37302F266DD3CBA633CD602828E512B0C5DA5ACC5209048FB92AEE387DF95C3C6F05242DB2227129AA235D569360A31E2BAC02865DEE3960400830C56AEBC052CE37C76D5824A84EAC91081D5ECE718839E4066AF477750308FF8E8B783A035AD99EE7F2EFF0753B9555DC13127AA3298373DCC394164176BB991E9FDDB7602058E53AF995C7CAD3D2EAA1B80FAF63FC240735B0CA6B9BC4ACB3C40A37A3F3CDAC9E3B1381ED9F21F7CE334D87887A0BDECD8F1F231830CB580E5DC301B03018D899514B93787BE604D7B9B5B41E13EF492A8886C50B01791154071DC11252127EED15348AF2AC9A3A1C66CBAFA68E709A2E0B1F32B2DAA5D21E7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291D1BF086753B46B24865EB05E5C5AFD7498F949E92413D905EF9564FB09373391AA0475E2BA9AD6CAD5F316CA79096C59660B2941DBCA200F25E344DCF2B71298766892EAB62E3E72B47778FA80334D4093C2E5BE133B9C13E1754C16C3C31EA17AC5B1E9D6A82A84CE7537F2C16870AD6DB7EF435BD027D255F04F074283E759DA2452CBE19E99BADF3A0D6D50E32F36A61B05DA1C8DA466B39282E142E69A00B871C872FAD02993D2468CBDD3AC7FF7283996C8AB9FE864DD783D3529AD101AA7FB8A4178CCE6861C980508A847FBE06051F7852187CA86C14373BBCA898A8E937453884F5DB723646B9152689B4E2E18164B5B793DC6F15B3FD4191B1462E9FC9B19759D534CB09F6F125C4E33CE208C94E43AE4FC4D051CE15EE294B52F5028266CE310FD83F504DA7C0ECE14FC8D1E3E4A89C6A7D638FB4D68354A92546B5C7C4636C0D635A520FAD72C8AA97BC1EBA2895FCBB3FCDEB62246A3D9F386928F97EBDE09A8743B4505492FF3E90ABAB32654959880E4A291F010B2DBF6EBA8E64952DB68AFED3774D563F9925D368F6EE0F94EE3337EF9EF80931AEE947C115718A1148111D2E69CFBB9518FF48368698C089AE59BFD38F9B69F4492B81FFAD9BCE4FAF291E08AFD68C828E30F692E613BEC38EF52F0B4E855DE72DC964B0D49D3414B3B67092AE1E8A862BE39B890F427833BA4ED53D42C1EFDC329CB3062BA3EDFD921240D304BA96D3348DF612CDD24AF7E4A85972CD448AD0A44B00814B9578DA2EC0BE52D0F8305EBA9DCF2486186F0F930E10A2976A942DE435344893548872117EF5215673695784460B9942C9549B6833E7630FD5B8ECDD8C15F0D8EB42664BFD471A00BD2C73B50119ABB0E2B3C9997BE136AD5495D18933B802F5D9CC21A9D02081A622524D1AF44AD3C36FF281F317A16683D35320769632AE5D7BE73D9CE8E2D4A04677D521C0C3BEB2DEBDDEF1500A91DA3BF261B8F3E450691E602BB4EE704E2B16BBABCCD35E06131E894A53C41DFBCC4A46434F616A109DC664FED07E6FE8FA0C6FF0B7A11DE2AB65446633DE634B9588073C905809BAD32DF3676866F23F6CB9DE77A83E8FCA52F012E56A7764FE69A0A84ACBE85F549FBBC4E8DA632FB7E70C2035C772ABD5296AB4C872DE25843CF93EF8A502938480C323822EEADDAEE431DF3711F7043AD4DDBB4704D243B6DFCD7EB629267AA43894A11085F07645EB03A32B61FE29527CD222994A21BE8F108F7672E220EC3BDE02F7FCB0A65591941489CD7727B981A9F46637789CC40EDB0608DAC79947DEAFBE2CE39EAC9A9C0D4895C0FF0E5E7588125C03B9CC6741950FFB209CC38024489C4CB41A52A2551F649D742D781270544ECF2171DF580F62E3085FA1C8AAF44EB05C4BED224BDC08E52B8E699CAE7B5902F7FCB0A65591941489CD7727B981A9D81E01481AA205D1287903F849507EFA77D0B39D1C198B0838604DE94148E3EE9CF098D5AAFF3A4270CF5E4251AE2C324D3C39E648D55ED4C77139E5BEDA260CD6BC67D1048DE879B19DCF56E4363973402A6B18DA8CC744AA90A843767BC4359BBC152EDF0D61406BC69F8B63B934FA08AF925BAD881B25B104B8CA928C154513A1E59DF691CB46F76FB75CB277F3CCBCD85F97B44B97DA63B68DED02A86F7602F7FCB0A65591941489CD7727B981A96252FA784009C02A59C68ECBBEE349E20A96B9E399049DB5F2A4DF8B498EAB0657AD7C2D2C0FFCDD5FF44B93C94DA8277AE570EF93EF0BAE0B417B89A2D5ED8DE9ADDAADF40D3E576D532B4D3267B5FE02F7FCB0A65591941489CD7727B981A98CC207739970C8F2937B4A07FC77ACA384F054A17C2A6BCD0418379393223D743C06564982B14D753CCB7829F134E6F09557B191B95F66E76426762CBEE31889FEF3E74932D04119DA3EC992D336C36502F7FCB0A65591941489CD7727B981A9FA91688618D3A422FACE6FC0018B3DF108AF925BAD881B25B104B8CA928C154520576A4A462BA3A96C90BCCB76ED3A560C8A762C9188D02E07C5E9AB26C6364D02F7FCB0A65591941489CD7727B981A942D4B8309F970B5496F9B3C2864F6E3CD68BC9C6EF87278FB4BE5016989260D002F7FCB0A65591941489CD7727B981A96DE46850C2E498000B9AF897171AB98902F7FCB0A65591941489CD7727B981A9B44EA8F4AC8C08E6A854AAE0FDD94D980D76D0C12A318268690089B241AECA731F51D75BAA8EDBD39EF13D490C2C257C18236FFED80489848B2BEEA20111F24102F7FCB0A65591941489CD7727B981A9FD99A4410D814A6DD9761FFD09D55DAF8129619707A564D8947C1293221E826E4D2BC8C70583C5E744C74D0FB141AAC502F7FCB0A65591941489CD7727B981A9F691A50DF3653EEB0987909E1E355858FD055BCB1D3D5DFBF739AF033715740CEDB7B27D96D6FAB084CC5A592F5D345A02F7FCB0A65591941489CD7727B981A94E237E414F7DDD7D613C1F731458453CC83250B907675C7C8257D07CC03DCAEF1B263AA437DBE5C2B9E8490CD26F3C2FD277625A9B58528E9D31E7921B0B443536574806CFEC4EA6090F072E480AC37381A75E6954C0171573D728FFD4370AA6D642848B685185EC81127A19F4664AF570E43631628876CDBA595103A7FAD5BCD6BC67D1048DE879B19DCF56E43639738A1B8C7453FC349723B7BA45A241F5BADC4C71D1CDF742B73545888CDDE215B4B89F905EEB0BBDA8B4C4FF093A132C42AB967CD8487A1F3DCEB8F530E3BC735894A11085F07645EB03A32B61FE29527C90ABA4377743B0F3FA6B76B5BCCAA102899D4B0352F1DEE1FACB4DC4F2E62952E863996D5DF73058CF3CF153708A99271DB3B6B3467639B93051FA0A53D82355F256C402AFFEF6C3A2C807CE4A3975D5FCB522AA2323C3CEFF53D8F63E92F7169D4932D319D430247BE60465D34A53F27C276B9A5F12A4121791F16F3369FAA0DB08DD4F8E8C27A3EA3CF7C6310EED53DEDB4D0ED7E211FBBBC602054E2701211BD15565F799477B0CF15BFE9A6063006B2C2CF5AB7F8B43666153A8A16EFB52B045BFBD7EAB60B9AB0C518140E3C2AAA6F35613C6D8F3BAFBBABAE48EFBDE5D299BFAE30FD8DB6EA8DBE1117195673A057B467F1A80F6C2CC818324FECFE8ED21B93FF1DC1DBC1D457779EA74E50EF14E6D1A3F30DB024233330AB14B2D061FB02C848E91CC16E5D887850ABCF458B2EA4325ADF366592A8A67410392F4F256D179FFA511FD1C44FAD45611C5D573EC2C4E1AD9D9EF734A89D91D64860DAE91D5161E440E4E7212B69C621E6B24F46499B5511134793476AA5DF9C1E5D5461422692AD80A82565452591AFED50F5513CC67B0C106F8D24F45C46F751F5C9E878A158E4B50B86495F2CF37D80C726BC46D10A41408E34868F8CE0F7852C6A50C5F79DD02A76EE733D478FE4C91B5B0EB1876E1E58C4F8597C421D5BE7FC859D13B849398FDF4A45F9DA57DFB698ABDED94A11085F07645EB03A32B61FE29527C9E4AE53B099CB8513CB5F2E9D5DF254E02F7FCB0A65591941489CD7727B981A9D5DB5F056BF83545055AC63A2E9564661876E1E58C4F8597C421D5BE7FC859D186117924E6E576EB0C4704CBA69E6E3952AC346432C704FE09A657BFBC896CCC02F7FCB0A65591941489CD7727B981A9BC677745E2182B983D9D63DB0C08DB778BEB4DBAA246D99247108D9FA08154ACC14502F8A717D3A09F24E3AB1383CE0E50D6C3C414568EE3FC2902DD64E654FB0A49F2C7A668C8445947C917A3271D633BA68F7C47EFD7A2C079A992264A504D249657EB6706E569D6702616961217CB669E97C474E6BAE9AA66A6114EDDF7CC4CB0ACB61CF24AB11AF0940E03D210A32226CEFE79AA6831C46A0C5B8710326B23D9711328161C20B46E9299A8919063A82D5ACE11E3B94FCEBD37480870FFEE9FE0482B2506DA714EC6D18AED572D3D85A1262D45D1A93B7464C5EB833B6FEBC8653C56085C3B9F12FEE612188FB8BA6559A5749F531BD56EEB34F9F12E6440EF844E42553AE6590C6ACCD31D2F840F56565D69B2FB38A43D3505DDED4B49477F53024252E555EA80ECB52381AB5869D6400DACB4778E1D9F306F542601AE68285EA143512C9F84D51DA724D7D4E44D30BAD85D73FDB52E0225A942788E393A77955519B971B0E52939A55A6EAAA7440BC24EDDEF1A50ED8DEC7BFA5C7C0F63C336423B75D125BE0363318B8B433B3624EA3AA0D06A78282C7F4199D45A41147A778CB2B4DB69A9D7052CEE172F17435BA495D8DA92E29776B11C80D8437B993C0558CECAC7FA1ECC861913757886D20420C3E9EA2EC7B5DC78FD036C61BC9860EB91492799F32AFC13CE89F4701C444B0D53E212F2B9A3AB1789DF8120CC1B00BC89BBE3FB70554914D1029A51A47B896936AC1DA446756B502F2E6B9CF2175F1531600B24D5106E8A29A3EBB7D4D4737EC1FF30AEBCB175570B5F59F8AE55A74259944F350A37E4B6153B4A1C24C7EBB93EE80FD5E24A08801F5BD981A5AB34B3CC236F59EFA5A8F5263A440E52F919D7851B0C81C09DF6232D731774FAA90D0A9379536DE15C568A8D5D304C529CA886FD8841BBCA1DDBA389F1DA9D7B098A5DD1DD34E4B65D550BEEDD00CA0B7D9D55F41768F0130E8A3BC03914F9BCF5FA6BCFAC72EFD777F56F812D30FBC8B576DF5729B028426EF39A7D9595393AB794F3080ABBE44F197BC6AC77542D4FF7E82C5F3DD0936266DA4BFD82E3A0F54B9FDC2C3E73D1DF7796527DACA91366B2299427CE395BD8FE561B3C37C321318C2C4E1AD9D9EF734A89D91D64860DAE91D5161E440E4E7212B69C621E6B24F464A8873832843774C6DDBB76147C010E017E5EE54257287CAB02086170A792205A277E2A18F9C2A7E37A3FE01722BAF063981B1986594FC52D86E778B53FF61206E04487125BE2900FED0C8044B40B69E7AFA1D07194123D66D2225C2B975DE8BF09A6849FAAE7DDE1440139C20801C391F49906ED4504FBDC80CC3BA5FFDB4CFAED5C688BD7697ECD7417FB5791F3608DBFB465606A80AF120377ECB30E8B5CFF31B8CA83B73FCA2716590305314429A79B53AAED5DA007C7B3D96BF99A296CFA05B5B4661DF78B131A4BBA57B64ADDF2BF30FB867541D12B91BE54A25AA27E47FD6EFF63849D92EDEDAB03FD065D25CFA7F97BA269F0909F02DB614BD573414602F7FCB0A65591941489CD7727B981A996FC994205128AD0071D6661C193FB2C438ACB246D7CB7F7DB7484AF0526696A99FBA6AE8C33252E187AB9F7A84ED0AD2428290CA197A9DB90D8256D7A5BC26704A1EA860D075A6D4C35E5F9B05A85F3A6E76812EA801DA832AA17CFEFC0FF6E65C063A09B87553D0A35E4E48D6FC2CF26D916425BD03DE883AE3D2F865D96D294A11085F07645EB03A32B61FE29527CF3C710DD7CD27247A79485B3692E9EABB3998040859B9933D0D4FB173ED7AF272B6B72894FA2A2D9CF38C70E3FFCC129AD1DD14429DCBED050431F990B6688554535F6E7BAFFD64C909C3ED96AED4AAEC3047E2BE71372CF3EF076AD49F5336C438ACB246D7CB7F7DB7484AF0526696ABB37F81AA73A9F1ED2BBF0AD03040EC880AAC9E1C43379236F4B8718EE45149E591F4B965BB384215160546E6E329140CFE0F1C2157DB5372A8E44D501C6D1BE3820973D39B9E9DC47B1AC43440B8F510C614075670898E8A29713A939B6F62937B939A13321B466D47CA080BD7452CB10355739F83EE47FF1D15516C6F0787DBC3BE0D039713A4C4ECF9EA1E29CD611B014E0C208460FAAC757ECC1C16728A99C7E1618BD00EDF037C4938ED14E2057B15F0392A16DF0F9DD894F945453C0EC06E3096811662E5309858D89F3B49FCEC8016021E2DD868BEA5DC0EC892F81041221E8AF1EF3C27D7192D096F7E323235F1B62DC2D3ACC91BCCD742B6527400153E5E0FA106F47CC113F796BA0A499090DDFA5A3401C1551D21A3F24986EFEBF08AF925BAD881B25B104B8CA928C15457DC1EB66C2EB0332B720AA4B5C3FF1DFBF2CD353DC8307DCFB935C1B6C34048604491390F6568FC034D99D4127F14426A20EC2137E4BD7F317F90334A6F50A61DBA243109A2368AF7229B724D84A00C377955519B971B0E52939A55A6EAAA744C1DF3E31FFD083D6BD59DE4919E99B4BC1E42D9FB041D119BD39FA38369BDB6B9EFCE417184364814CD45A8369AD3FDFFDF4D784EF483E1F0FDF81FCAF59C378DBA5BC2639F83B230A23F41CA4B2D52617E0F237EEB29DC76303AB6FA05DA83602C0C17B921537DA0FAAB07872F80BE4905D42FFCDDF9A3E2CC27C20F764229B77955519B971B0E52939A55A6EAAA74490DEFDF99D1833F60B7BD3EB1D7669680BF43F0D598A85C25483108E21CD1002F96BB9CDAF8F5F948BC8CC10803AAD47AAA1524C1DA0811957CD156EF83F30108ED854495BDB982A734BA01D8B963C44E2921F622A9479F347299C9456146979889E9A1E78E66627806EAFED304CD9B412A505F9DC3014EFA2E85AB377FE8C293F60BD0714165D33E435E4A3D9AC66DC6E7ED54A766716CF5BDE0DA614A4EAEBD68B804CED4F1F64D870F1B34EFC5060D4C7931B4DB876A2EDBFAE7C5454D47C277E2A18F9C2A7E37A3FE01722BAF0633F40ACA29BAE89F1BF78C883C244A806B77DF4E34506962C94CAE54A7C6CD6BB7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291DC7FBDF6F37D58726E208D9258B06BE2D142E451DB92BD6ADC3014A4E3B900B59F18016A1C132ACE7C9FCC05E42D8689A9E20653A9918A036B9A74E7723CA0A63C37E622674864DA026C1A6BE275B801FE9F3D83F051AED7DEF71BCD798615FCCD7FB1C9A337CBEFBBF750D586B8CC22C67A298CE2E3828ED8D3A97F00235D8CBD1FAAF0088EF29C3C878DCA87969DFAB3F514A8E265D39F0615AB9ED3508510FF217B431737C2CE217656571914DE975F4D5540CB8690E5493DFA60D7B6A97ACE6AC4A1BB61FFCD44BFCFE093930C861B5D28F4D14D1D640FF2B10F8939E262DDD6D403F9CFF4E6A6CBB9DBBD307BC03FA76A6902C8D56BC553A5C12CE1F0B4485F91488AA86B269EB03BBD16664786F24BDC7B8A959C2297FE059D713FB6971BD325C19A4B1E85D46E043778F4306814597174436C5EB2D8BE05DB17276814FFE495C0FF57DD462853AD61961CB449963ACF54F8FD896CB2D2090DA246D71C977955519B971B0E52939A55A6EAAA744E8C4F3B23A7F4D179B5FB1B52404501707690BF8240081EED3019CD109FA3B5D54EC8C6F9D15EAFD84BF72C93366F3BB387052BA9101D9C1444197BBFE1688195AD746666A27258CBCA7746F6B7B2D4DB09136F5F2ED5EA9D48B6355B5982B6594A11085F07645EB03A32B61FE29527C30734FA275F5601A6E7964A5F8EA2A3EAB3B078D56021BA54E0EF60B00EE3C556AC666BB20DE57E1F899389CD636F418A110F832C18A27929D4FB532C13EB740928EEEB0487263A6FDD4EA63C9959F81FE3C7C1F7DE0DB338A706B010E7C857577955519B971B0E52939A55A6EAAA744EE26DFB48EDF8E5D0999EA64FB807E02EAA7A897CF05A01D81537459BD2CC419AFBF67032353567AF1875E195FF996BFE53E85D5508F70E9F79158397D9B70E48604C35CB285A24758A5BAB173C3A7A31A8489015AF8E740BD6F152C01EB250023FE5823AF84C65744942B71DFD42F657D08E877659143AD61DFF1F4268FA374A82509151427E743557B9F8D56262D29A18AFE294133F60F336D1949320D05E871A4E6C86A0F08CC13E0C9CEA8E2D5EFF6C7618382BA3BF9271D53DDF8837E918F5C0EAF12D293C6BDA9502268502587C10FB1B064C0040F69F42D91EF5971B067452FA91D314E709EA7DCEDBC0DEA29B5CF12C3E84E1D09FF855AB1328BCDE724B03D50287A9B52656D9B5FC4368D8BD68E8A2632EF2B2B7B3ADAB00A912AEDB4789FF4EBE69F0B3800A6D92DD6EBFE6802B73AB166A70F811FCDB939D97498FA428487CDFAD5F3CC1E180FAC5CC7A7D5CC5F44031C99030AB0311F3AD20EC6416C64F13E8D6AB3C657D59D1ACAC9FF667B575AAEE7465520E45DDBE275A2518157C0C655659FA6E529A1E117A128651C0C427C4F432291D628116C2A709AFD68C4B0319F429AFF99D83AC7AF81713D1B1C463B83CFD3EB16B3DE367AFADA404628ECF5DC2728BEA13FD86D9803DCDABC200175214D3942F20F43BC9FA8A678EE547F599C634E04C0F34653FF1B8856DB98752CB4410A386BFE3AA01107400FA934FB393A8DF3F78710467D53BA62FFEF8DCF365D54715FD7A1B6DB23E854614F49FDA0FDBE907F54E60D5081148609905E4B2E09EF4350FA0362AF990D14AE94D98580354019DFF27240CF4D35355B63D4F6BA33AA91AEE2677BB4A38AC9E932BC5511B334A4DF6E88ECD47434E7201747BB3C09BE4440BC47642B08F86FB7AA0A8A319136321D46793984483F887368C4B0319F429AFF99D83AC7AF81713D77955519B971B0E52939A55A6EAAA7442CAD5D698776A2EE9B20F1F34873C3FD20932811169CECC7F3C85495CBFDF40D02F7FCB0A65591941489CD7727B981A9015AEFCDAB2E93E71574C7015E643F7A07690BF8240081EED3019CD109FA3B5D5965E6AD14F81B950EC08A7F1B65EDB0557EE36F7A520B06F90CED8A61C9DC4177955519B971B0E52939A55A6EAAA744E937588583F30F0A4B989077D740C528114EFBF4AC8FA3D928A360474DDE632671AB84C90C2DDAFA48EE69ECEBA987BDFFC351C2199CEF4DCBAF7DEFFBA22D24C9CF29C6B4E460D470C32339359D40C9C40A37A3F3CDAC9E3B1381ED9F21F7CE78A84A1027654278EA3A8217EAC2330E00D79AE2D9FD36B483C27C2D98FC12534CC52CBE0843C0586873BD80538EF3D8531A89906BDB07A5112B4E290673749C653C077FD85E70F718F40FF91F15FF9BD7BD30E051C723EF617B6A8F2BDA143C49D468E58DFCD265E9310DE1E7F377F7E5B35557960DDDD73ACD1940BB1A65C4B32FA9890263339E88512EE5C2900DD468D6934A90C05A6CA7844D7423E7B4A7AD304BDD5D8CF00EC5040030DFDB8B286B5C249CBB7E342FD45EFF6621F5121D1DCA6DE016CA4A124C09CCB8A486233594A11085F07645EB03A32B61FE29527C6F18957EC6A3EA46135A12E91C751CC51747BB3C09BE4440BC47642B08F86FB7DEEFDDB809EE0DEF230B0E238417FBE8AED58521F5C44D171F0B299E2FEB6A9A02F7FCB0A65591941489CD7727B981A9F7BC328FB0A0FDDCE8CC8A4202E7EF8A94A11085F07645EB03A32B61FE29527CA6FE94BFBABB8A21EFE55FBE761DFA03BED52DCBFB01C68F417D70B65CC31F9FD9330203DBC29F316EF1A4E35E3C2A8092D86C2D178B8361A92276FCC8197A2D0520E2E2800E7E5D257DC0CC6AF39F0CFB9B5EC47A19A6DC2D95C76BFE20B9B03202707DC779D7DD4049528135B6741D5C00FB2F706B64A84E96B0EA4D9104F7098D29E303513CD55FAA868D43DD04377AFD502374153ED7883F4B1AE7DCDDB7E216703A22A30EB12DCE6FDEB63729F54C7DAFFB652D2E48D8F041030961E81224BDC7B8A959C2297FE059D713FB6971BD325C19A4B1E85D46E043778F4306814597174436C5EB2D8BE05DB17276814FFE495C0FF57DD462853AD61961CB4499CE467EFEECA3EC033AB96B0556BD307A3981E5E7597FE270C982E93E5C6BF3E008AF925BAD881B25B104B8CA928C15458AC0BC7469FFA16B384556F5D45160F677955519B971B0E52939A55A6EAAA744A01BF36EC12D71E1FDC25820C53A697594A11085F07645EB03A32B61FE29527C394D636C8236ABCA0D24733C92C703662ACEA44489EC6158F99B3E88B960E90EC6886467C203FC948FD48220398229C116FAD82E69BC1C7E0FCBF6565B448F024CB0ACB61CF24AB11AF0940E03D210A3B2B3430C919F1792C033470000B76C6E09AE97095E2F539FF174CFC77517F4AC4B727628A1D2113E7004D02856647A9D97856A7AB3B798E2DD8DF93AEB69F3909D34983E64B67603EA58F56CF7895F2DDAA9C0EEABB040412ECD8AD9D686EDB186EEF992F24AF9F4E0BBB48EC1260AFD86F05F48783456D28C6FC72303BA1291D098D7A475CD49C0FFD839EEAFD92F93330595D7DA040B8EFFDD27E70743598FC510C3FF75F4C7665F153EBA393626E4F11E6C0EE7D481CEBF7016039B6F37B9918B9315EA8A5FBD5D1DD0D380C0AC8CB6FB5BB68239F07D9D9296B0F57BB5954BFE3846C46CFDCA0154CF9E59F7483395B1B20F79C224D7F409106AB4EC78FC0D883A73C619CDE930F4B5B45EB20A0F29C6BF53FFF16010EE0E9917DE15B3B0624C553EBEB82D87F460F9A573ABB4E5C5E53D66C6AC5A7742BB34AAED558AAF68ECFD0E7B313F69D92B9455EB7FB8934B73B06B9F56B57A9E6249FA3421430E8B7DE0E3B6EA0B38ED84E6433C624474F88D088770CB3A270F93738A8660EED28F7B26C33DEA14269F6E5CA79333107EC336423B75D125BE0363318B8B433B362CD3AE62F42CA809C23F529BF43C6ED07B0D8196B4B9B66975305A3226C5CC4C2E7F4145F6E5B20A590FE2B9D42629A95E06ADCD84272841F18303F474B054B8FE3399251F7DA19FEEF2E9BF5F533219B91BAF2656C4B0FA17659B11E114D6C2747533BBDEE382C00F881EF03700D38E0C9B564B5025548B6055FE60C035C85594A11085F07645EB03A32B61FE29527CFDD06961DD0F313C4B64A4E7B616F12BABD90B3851942445DF2E8DDA4D2C9E92A526F33DE27808D086F797AAE5F8B26BCE02CE050555B48621F7C453FABD0BA1C403F561B8D99992E3E0F03E6179291D14762DCEDBAF5B00049803F5308712777F16F61C25F85BB79CD4C6AF9B657119E970DE64C6AD6C7FE7F1B14745EA2ED1BF056F333584FD98D883F0F68CE0B397F304A4C33BDE9E21F1C8D21E1E370BE177955519B971B0E52939A55A6EAAA744F7B03B6636B85B4C227C2AD90F28455502F7FCB0A65591941489CD7727B981A9B32B69113650BAE4EC2753C54C01614E7EC3B1C968DF606368608EEE9AFAA0F7DB06625E64BE0609C490726F2DA291F7F49906ED4504FBDC80CC3BA5FFDB4CFAAE7C06E18856A48CE62AA0F5CCE999513C0DA2E91755A089DD189AA4D61DF8C72D68BC823CFD9B5106F1A2CBE6E2704A646F403C5D4FBD31B24984E1D357BD9E3BFB8A919F4B4B12FBDF7CBCC91263480AEE3934D757EE43A3C86BE482A49BD8127573B57BDCA4EEBFB759C3A40A40C5411409CEC072F643B804C0D4C339D5E6BCF421CBAC85AB9B81FA802C91E902F30AFE8B736F3931EC11C6DB30D926CBD18BB012AE427493EF4A0754FBE891CA99AF30A8E12F28BEC0E61CA3B9B99D59228040B5EE1C9DE64D1B1B66239D6C1C6BB4335340D681B35D05534EA15B482CB35949514358ADA32009C3AE92A6D20F5BFE79A3147026318E10225D2C9D356B85BB1E200FBFE9DD30A3F160FD25D91FCC0513986060CC0B785A55D12C36EAFCE8DC0EED4FB88F9FA4972CED5D79C090ECE407CECC087F9D62B778F9532E63298BCC37478A4264CF16FAFF6ED661D3AFE602F7FCB0A65591941489CD7727B981A9EA4E7422AD5D258E4C40411C9B709257CEAA4FAB862DBE2677C4B06D7BA161C58BD9E8A3A9C2D961CAE4E1E266A46749F74A26D9AF2CF144E949D0F09AB61DB802F7FCB0A65591941489CD7727B981A9320A13E6C31A435F446B87754955978C7BA5103570240FA4242D8C1E77BA99D894A11085F07645EB03A32B61FE29527C872D4BF6D24FAEF3449A7DE7E999DB59F4A348A1255C7BFDFC26F49C68713F4294A11085F07645EB03A32B61FE29527CFB27FFA7003BE08F96F6A40B7623AF1F86C216F21CBE5FCF9C91A334A1EA9EB0AF47E40A0B417A1ACBD0B1D1D1A2DF91A06594D8423336350E6A8C76D029C4D3AF47E40A0B417A1ACBD0B1D1D1A2DF91516D57FA491921516CBAEF605BD08090E863996D5DF73058CF3CF153708A9927C40A37A3F3CDAC9E3B1381ED9F21F7CEFCF4B5966E8001E796CFC9A898FD1932B3E29D662540AFB704900F2AE81CEA704684C9388A68F182A0CC0002248D52CB11C37FC03395050550AA37A2616DEDAE2E0042386789C8FDA45D48597ED23A1F949B25747B0DEC43F605DA11796480DFE4613D47BE536FCB57BF2A5F07FC8A3A142E451DB92BD6ADC3014A4E3B900B599FC175084E735F135F18467DB19BF397A1719B8089078CA3F247E87EE23C9D008C713CE7B0AEF1999AEC58AAD334F1188379653CEC1964D8FED2A907B196E7C194A11085F07645EB03A32B61FE29527CCB0E38140D1B74DF0D9B332E79F7ACB45996C1C6E206A2258FD169E24A8E8CE19A0D233653C9F5D962F49A415A9C690D40BED0CCA9BBD5AA2883E8796AD932E90EBB81CBFB39BB02E08AC24FD9B4AEB85BE67491C504D91026B2A67F770DC8C594A11085F07645EB03A32B61FE29527C8045FFBF27F9C4F3C37C2F348499D20894A11085F07645EB03A32B61FE29527CDD3A9E07D5A46CFFE45ACA668FDA27C194A11085F07645EB03A32B61FE29527C7C084B295332A48406892597430A101394A11085F07645EB03A32B61FE29527CCF24B3BCEBCA5BF6D6D7AC1F37E97BA373ED797A94949BD144F20A913A7A2C9D0562303813636F18280E99B8632F399EFE891A8B10F21BD2F1D8EBF665325D49A41D286D4C5CFB6B3D88131BB7AFEEA5CF4116DD5C3914608335792CDB3B7169E3841454D79C59B9A5606B37098E979C11BA3D25210285B09539743E8FC6DA8900AC8FF5CF0B5D838C532FB804211FCA5BC7C93E0803C0E49FCB0312A883C3E069E8169AA98303884CB6C3FDC7D9153157A1D4D1BFF387B57CD1555F7A0C72F4FB7F0DB5EAA8FF791F635863FDB7BD671FFCED925272D4D35F284F37E4A4E3357FD34A01B379DDAF209E2D4CF5ED3D4DBB6FEC3BA80D0EB4807FEC1F1BA3CB5CEC2B4A776732A7E36F8DDA12ADD28473CBE6E7539A0155CF70E7CDA0B0F6BB08F99E0161BC8B1566B319400B0E119AAA57138B26B0CFBBB0FED8FDF26D8FC3BC7A899B60F371FF4154192854D9CAC31AEE0793C8498D64BC8CB06FA021E0FB865D323ABA26DB5A6A742871FC1EEF443D7179B325352E5AC4788481B2A6E1FBBEC02370B22E4E649D6542AAE25C270F1A74C078502270C88F0D19309B97705230969609CF7B711DDD4D515CDB8153ADD6A418AE8D1223559D56D4957117FBEBA67324DB52A67C4B57B00D935C6CAE79705FA8317592E1405AE491840338BCC62B02F7FCB0A65591941489CD7727B981A9E01561CA2391BF8E34F2646DD263ADEBA674091AEDD376CA674B457A8AACA61ACAA188178680E5194C9B7FA52E4262DCF0FEE50EBC63B2C8A1B12F5C5359F322AD566BBA51B253A8170E26EE97D684E9CFC97514A385EB93DD989E1AA1E0C4621F4181E85935E26DA85202530B6AF3BC3DE4221930CFF59813C889BC239EF77FC84999CC5B2E62311CC4415DC7510AEAB26209B994B55BD6EB89CF8ECB87A2CDD5C42E0344629B7DF0C599819307E1B3240E86B6BAFB44B8868894B344E958E9257C246B5E07D9B06AEF3ED62562F2753F22692F1ADC582DE6D5ADB0C291164F9A95ADC280FB835898236EEEF254054D5D5ADBC0B8228CE8508F06311632A776478F2B7044DE266AF9CF8B6EE777E95A721D775CDC1D0007E187C6562F9EABC936AA03540422B3CFD2E458F1FA0D170F82A637ACC809922C9837C6D298995133BB326F17755F47BF7C59D2AEA5094FADBB07F2F9B6D409A0EE17C406025BEE4186287EBA1A5B4DB347B1C5B5FB1CE188396CEE1F774EC4895CA9F4FD7B1CF269394F8583064EF15DFDF443170DD0C2C9A1BD5BFFD82A5A8AA9D64B1B742BEA8E845D805A82AB369D6E253A71D5EE1DE10B0EFD5412C04749E511EAB080F83A67C1A3C8EE9C89DEE11541F6A2285E936EDA2E6CF8804DC1E9407D15D364F4829DD41EA71D19BF2FE9390EFB100A67E600E361370F87415AFA7C5D8DD3C252B9F20AC3E4149AE9B6AF9160BA4B9E04E83AC81F9AE1F1341511C0474D04222873F3498EDF5A54BC69F035E618E1C6AEB5ACEA76431B117825202D954A60872B3F661BFEC2F78526260010FC41C36CB381B6827831DDFD9D0EABC84769EAE8ADCCAD92A08ADFA74FF1DAE16C03079378955A6E39022E6A13EDCB0E5CEBCE8E52672120B45282B3DD8D2469BAEBD5A46F9541AD2B1C9CF542C066E3824364E48CFC47B202943631FAB79BA379EF7DA3B2936FE27BB19467A0C5AF90420095E6E18129458C30C879D1794D3C00EC17BDD26C6BCEE23BD88F3C100BBF1AC6874F60C1CFFA3D48031584A89FC3FFF09D5D63F675496A96604B2DD6DEA46B40DAAD887E19DB42EF62F9283AFDDBC48FDA99CAE5F1D41112096DABD90B3851942445DF2E8DDA4D2C9E9221CDAC11EA02A1A133A2650541AF724F0BB0BD2A4D427CAA857DFE82645BEF1DF5B935B1B57F9A686A54EFFA95E28B8510D009B57782E0845E10B99B9FD7A46545D0B8156FB7C5464014FF41F49E681C9F86E480AED2C88D667EE8225B03A390D47BDE505A99114EBCA79D59D56BBC4755109ABBD01EACE19186F857C2A8C03C51BB34A980C4CE79FD9919D14D74ED9A5107BEABB42780621CEF4385D09CE105354D1A035F0C6B75E31D2E78767BF848FC5242FF30EFC7B6DA05BDA2D1392FBE923EDB3A4E4B055A7171D96336A130D303EBBDC710D0BD8F42D6AF10CAEC2E1A86A0462DBFC732ECB85CB44309000A2732B7AAF0390EF6E65A2337ACBFFCA69B39021196DED7AFA1B03DD7E83A023623424E5A71CEFEA4AE86A0B1DB314669FA3B2634629F01C7A15A03108084C2BFF335E7ACFA0681219AD8B7DFDDE63C80B5B3D9FE83B6B03F63AD9AC4C732617D0EBF4B362F945E82CAC9D399448C28C7A69727E3569224741DF56D26DF00DB17ADEC07EB2BDECA872E90178838AFA552200571B958FB17D57DBBA721EE1830659D8F66CC4AF8DA1AAD23DDA7AD1461F01D3B03FB9698A28DF0A5D09144331ADD9C5D909B8F9A511A2FA3837ADEC42C25D7052F1F3BF0DC47768BA87634A36CFB7567642A5BDE90D39928FD610EF6CF7553AD365F0B2612F8BED1E2261676B6863514097D309EB6734BB1ED45F6EC261AC5D0EB0BB31DA966BF39CA58795E36C0B328B4F44E7206F2A604A80D25F49AA6D24A67622F593A01172C5F639C877339E46A800354A14BA1FB1038E9A637D5502AAED88DB00BEBC4D33221C0F938317209B4B413BED072290489D09189C63B7F92AF3D3EF93D122A6B0409C5CD5206B2F567A9037F46003DBB10EE21B5B34D3DDCA937E4D838EEFE3D5FADDBE575668181048B2D366E13FFB8C48FE47E8A3505CA6F27F2C00ED92A89AC74E3725B325F3A0BD2289F3FA57D5213F8B549D94381DFE4668FA7BFA882F7599A2AF6A6FDD962A2F53BF7D4C5C43456DFFE9A8CF9BBEB313976E9650F5C72EC46AD81A9C3146621A52A4BBEB9A0F4FD6D2D0F5665A6101210853E25E188C09D80AFD1C2C7FAB268270AB2AAF0A7D6E40918F2EFE5D2BAA18AFE294133F60F336D1949320D05E8B4D1094CC8D43D5778B5933266CC43FA41DB18D3E60057E7D7424433FEF0A7A7125016B1CB289CFE641BEC566385259807690BF8240081EED3019CD109FA3B5D3F0C0A2DFF28F9BD8779399B5B97C6F37140E0CD88E56D1D4F4E365A874281FC0EF4DB1A154DF8766F16633F5D501580A3A69161A027F983BF9F9EA42E0FB2ED84B1CD1A09C849E268A80A47F8E1BF5935F0407D997E54F731EFE2EA0FA997B8D0B69324BE2F93BF55ABDC488E0088F89606347464978F68FE62B8845C15DAEECCF58405389877F0B6EE840606E557907CA8E60F1CCA3F46B0EA6D0995BEB51BA57B03D9DD0626A49F8AB1288E2079FA0F0C5131D9756C8C9356DB1CC675D37A7DF1CA3831BAF1FD5945762180BA52A910D8D9AC89746F816BC4D3B697B3159A68E1A0928D6C2C4F985C5CAA1C861BE19A0D233653C9F5D962F49A415A9C690DF08C4842A2108CBDAD961C40B8D0FC811FCB0555053A333E905FA1D27C4796BAB6194E2E5C85C1864BD0A70F9C3300F6207678318CCBAD5FD55DF927CADEFD370EF4DB1A154DF8766F16633F5D5015807FC63E529DF0EB8B8D5E09FAFA2FA3A702F7FCB0A65591941489CD7727B981A91321FB1F424BA934386F6852CF705B1621F703C34EF202029A329A2679E560D383F5EC836F9C30A78AAD5F45665C5C311286653F8682979E00DF3D8DE9D3E761D9330203DBC29F316EF1A4E35E3C2A805B3F843A3A3BD25A5A680047E0B4655FE73147B3121F93F6B60407892D4A99ADC3265FD6CE6D4086DB260EF1DDC031B422B365698E0D264DA76B977E0BD0CCFBAA80F426229C53A7ACCAF834674CC0D5B833AE1A8B6AB8C6270B30302A1D1A0B9BEA926C9D58AF4171E5C62725F6E9F83CBED7FAA7B47A2C014F3CDF9FB3E5C12E0042386789C8FDA45D48597ED23A1FAE4401EE188D83D32D1C4935464193D47161B838FC9A901A04C481D933C8DD6F8FDBDB54A8834467532741C75D264860EA5F7456395233A1E5A0EE93290503B628E140462C699C68F0ED0C1DDC94D9DA2AA2D6F8403BC16F03B45DB889E3C57C8801D6153218F9E9CFF4A46EB3C470BE0A6734249275DFB3D6B47813548441B1D2D04B20C9F9E4D7932C14F4CDE8EF53E76D193EB0CF134E9C843A826CE361F9A49E712DBC4F36F9F78A9CB250B9032D35822ECDE1217AF26822304C44B12062216F750E18AA6609A132E96AF44A776546E431F3181563557C7E9632CF1031D33EF833D7E51A8A8A4A2CFFF32192C52DFB1C2ACA30F7EC5B0DB51B03840C2BB966C7E9BB5A824F789533E6CB9E16425DDA580F77B747F9DB25DCBBBCCEC2A6D90EF4DB1A154DF8766F16633F5D5015806BE6BEB287D5297B1BBCE463946A195CDCE76CDCFB0FFEA5B2A3CC889AE54AD3D8B9254327E5FDA6CC43562898F861D21298EC7EB7DCF1523348B82B055A055F1DD55B0497AE6860F07BF2DB7AB5B99FC336423B75D125BE0363318B8B433B36EC0D287E805DEF355F30193060DCB9FF1BD15565F799477B0CF15BFE9A6063000314EC0EDE977039CB2BBA790C0A9B53876C8D4EE140DFB2C12EAE54A2725225ABF968223AF4489DF2AD94635A55E1DC5267D80BE8691AC7933976DB26F72FF8E21F795CC085397040077A6E7EC97013E5564DFCAD048CD678661EF08AE6AE028E4E7AB7CDBFEFE5D8CA97C5B1FD9DEA7C7205911DEA120C5328E5610A0F62BC8FF03633D8E1B38CAF05E20ADB40AB3A187DF321EB68556D0B9AC60DA842590DE913B94B4A69D9772F58FEFD86AA4B2265C37F653DCC935E683D30C31A78F8DC89E88B2FB93C364CBE0B5E9F76B3C9AD1DB3B6B3467639B93051FA0A53D82355FD6EFF63849D92EDEDAB03FD065D25CF64DF8B2439EF36A03927E54C2FC545D3C83329BD658FB39B2B6CCAD2DEB0E458CED581CF1AAD07602092B32BAE60F3713652E6CB0F6E8D1E2172FF7A307CCE7FCA3F0B3018EB970028D83FACFB0949A53FED00FE3ADBC6AC58A7E86985A6543BCF108582463FC12784CDAF58FBEC76F03A2752C13EB82742AF0C6F6E197AC8D3C336423B75D125BE0363318B8B433B36D4F220B8345D7464A5268456D3C3CF050DA49437333BA4E66CD76147F46336DA4657191A302FCD04546D262F66D200A1C97C86150C6CB051D744A2D2D7F7EC8EE6148E895D5CD2FFC21E208F6E676C452C8CA1A41B063246A595D6D82F3B68D0AAE2B8B16EED703FC881B71C1EE06A83385EECBA6DF391F892B2368EC2FB59CA6601AD5F821DB53BC08EEA8F1DBEE9B233B57EF4941FF46A41299D8AEE52400043E4AA1DBCB1650529262DB4796BE48F9014EE0798321439BC552B42559B7588CC28E8E255669F33F375D26FF98806654632C4A661D3EA3866E00F9C23CD51E31729476347748879FDD8B7704F80420FFCA749AD9DD6BB9F80A0D9AA953E9B03F17E479D7E92EBB7DB60C93D4B1A26FDC8E0812694CE0A8A5C8C2305E6D5519865265E776528B944CBA67F283858154981FB5AEE9F8057581065C8A8F75886964C3BB5311ED21E173B3EC11FBD0171946C86A77C290F55D27D6B23915837BEE67E2D4498715CB4E4BC4AB2CAA43A4555A874C6B60800E4972901ADA61226C287505E87D216DB31FA6524B4A8629F95D88C35DEEC70E63BAEF917B7119BCDA924D076BD339ACF3054217DCB011973D0A664D8A6C38B654A4CF37336DAF2A9E45DD81E01481AA205D1287903F849507EFA63ACF54F8FD896CB2D2090DA246D71C9C3EBA3A06FD856BCFFD6F4B75BF7BCAA3FED00FE3ADBC6AC58A7E86985A6543BEF6CDB8AE75E457610359445BD83EC95D26A76C43B5AA04C7F6BD7350BD14CECCC28E8E255669F33F375D26FF98806654632C4A661D3EA3866E00F9C23CD51E3BD532BC8CE0E52794E132AD97A65FE95D502C649953A58FD8B9AAE7C233FCAF092A35E278F83BFC662EE5CA1D0EF258B2072D38E7CD182B208CD0DB1CD3F5EF6467B4C621C54C095AE7840AD4DC084981D5057A473C1A1326389CD7883761192999CB5779DEED8C9BBE8A0BA9CF2644B83735091CBD6B99CB62F80A175F767AF17DBCAFDCA8026E0ABB380AE9938E8DA9C0DC802B4168A2F5F24483830D3B31203677B4A035E7B0D828EC76A68DEED70974142781EB8709CABDBA967E0D9750AF5423C4F219BA82DA61169F0937215FB9EBB97C192032072A01292E7A88B0F8368C4B0319F429AFF99D83AC7AF81713DAA43E7EA6823A13E3C445080644B8D4D5A4FFC05CF3C7CD93273C287BC3C7B61D8ADB7FD648D75B5179516DF792006A70F0E510C2E8CE00A5EA084F3CDC5ADC97ACB3316730C31658425314471FB57BF852279589A9CA273CE2FD5C56136B11C7B7DF38E5B0FE09BAAD132D105B395DE1D94076D707EB8A970BC3F291C5CA784B2CA51BA8C7FD32BB0A26A0AD45C811E9BAA30F57868E734BF72594331E00EAD746AC1450601CE95C29C5293279C89C13999996E7298372D17F2DC5697F2242F0F6A26AD61F67F60678151671562797CC30076D7C3433F6FEBEE789B0DF739EA61A1A8D884B0A4CD64D87E2A9062B99357F58759716C07692DE093D90338E1D9E61923917DDE422B536AFA6580D87D2F745265C6BA8099C5DB51C8BEAA5E2CF5D974143D5EFBE4EBA42A941BAC54749095033E3D31B2EF8E2B41DA36A7D61325B50D39E7CE91F0CA3B6F422A6B813DA4667B79376E820BE711A34F6DA54A6B921B1A30B3FF22CFB32A83CA5EE0F3F94FA0D03E58ABE36BEC05260CC4E5A77C83015BB04ABB1A7641A9B0298B791F7E28371BAE546B6162975D938737DC5A3DC6316204F7F51D3ABEA111E62462A887FB4B746100A707D9D5C6E300E903CDB227F28CA6FF40ED0A658A5020E1D89052A4C2C9F2382035FAD667FFB5C2BFBA6BC9A2A11DFAAD5C2679DF3A230E6C90879D11FA136A38228ADCE2D7A56A1C194175E6D7EBC310DE31DE4C327E5E7B2D1F57F7C3E9D04838D25B04A68862A94EA076B844A6635835B435A2AB68751714D263A92C673F7CAD73C02F5DBB040037885751E81127218AB7A69E5403A1060B5A6AE6CF7E04F82B9DFB5A093D13F827BD8E4F1B758E9764FA921BEBBAAF9F39B7C3DB08DD4F8E8C27A3EA3CF7C6310EED53D005BA3B8E8AF82D74964A6D88207F8FF654F1162A9CF206F6139F60369397DC2FD18B9EC99A512B49474805B842B5071C3F962DDD801E9291E553A93D9AD0AEA6EDE03806D980BF308113A210C91F935579296900B5B1AA95530153B691FEC9F3863CFCDA88F976DD111F77992A3DA12CD01F6814B91162205D8EBA4535D2DEBD2183983A0B27F59604082ABE597041C1F2E858735FF382BD3D0E239450DECA635535F5356BDBC4D76644F307485352089DA33B82779791B6EED268B034E76DBE5E850595FFE0A346DAACA1A3BEBFC75BE1564A6A9E8094D7605E8021EA20649601B98361E793C62BD2ACC6A5D6E3C52025CB35EBB425AD3B001CD6FAA542D8432BAE0148D0A9EF8C4ACEEB5D2A640A4C5EDD01695EEA92D40B0664FC1EA05D64BFA378884E1F7EA43E7B3BBFC52F480E7231ED64EBC994F0CBC2C937B5D6FD74311F7ABF7A81ED042276B525E5B2C47D3CA2D856E61DB0BD364A66D10F5C9152EA6EAE3C2AACA0DE40EAE1C30722A06A38884EECF9CE95B4C7721E3572C47F782A5B5C75A5D4D374395C8F2DBA59E00BD2289F3FA57D5213F8B549D94381DF64633A491780A9A50C950A59ADF990D844E42ED80D05BA26A38D2623190984C44014BE89A7F8F6A88EB527B24FBCFE607BBCCE735E2E0D8047969A3BFF25128B6599DCD6FCFB219082DAB7D57CD16A6D584D3F3ACBF333C892AF9E69A3543319F0F0983D2DF69F2DC06BCD24B4BF0A4604D6AC865698491C06DD6E28B99077823D5DCC28EA18224587995A116C5DB8D6580C5C528C9EB4A6A944EDEBE8F5029EB590D4B67C39027EF147E955AD9C2641355DD3F1BF90F69CBED42AA6C9653025B874AB32040BFEDAA511202D4F8B46D307A3B7C6AAED4D9BCD89BB35C1DD0C14ADF9E56E84788B6D7EF98CC9A9C82701B0DBDFAD92CFC867FED418B370605C6102F7FCB0A65591941489CD7727B981A9C84BAA75457502D397CB71241EE3EB49C20B9857352667E6004DE64BC9D6806002F7FCB0A65591941489CD7727B981A906B08985CA1CD5646D2208AA5163C8A557D1764112717D26803D541217330C5B0414561040BBF6A5E7BF077E850B55BC4AAA4E20568474253187F30D9C1C099C850DA4F2F41D90D6547DB2A53DD16CFCEB42664BFD471A00BD2C73B50119ABB0B1941DC74E2EE9DAE7729CA4DFD56C1D67CDCD14247C1670ACA4DDF3C9B6B9665FBCF95EFF25D69070F897009D80D4B502F7FCB0A65591941489CD7727B981A9596EA4721A298975C3D4371EB5B8E7BD0A8A92640422425196615C8C53C443CE8AA5E34FBD6ED314376A2743932A9D87544ECABEF060E9ECAEB58EB06C6584429A0D233653C9F5D962F49A415A9C690DF08C4842A2108CBDAD961C40B8D0FC81AA3FD14D8D828B03CA96893A3D19671F3025F8417168F7088CE70B7B5A52069330A1E0937752A7D2A7E4B0945313A0E7FA6A2D3EC998E68662AC037FBFFAF0DDCED581CF1AAD07602092B32BAE60F371E21E4ACBDE363EF2FE9C194EC71E48C95D8DC03AA012CBD583BA44BF0E5444F172DD47E5A6ADA03B40D884D0D54671681B263AA437DBE5C2B9E8490CD26F3C2FEF46FEC3F626AA32831BECF9BC3F16568BFA798E95052DCA90A804FE79CAA02895453CB17AE8433576C1A9AF05F83FAC25FB0E941CD8F09AE927F37D70B0F28D02F7FCB0A65591941489CD7727B981A9C01CB65ECF4338777517367B9D76E81177955519B971B0E52939A55A6EAAA7446954D35688780F09BA71914D9E70D18EDD7B2E149B83028A6CB318DEB18946BDCBFAC860D5148FB84B57CEBE9DEEE4EE7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291D834BC4D7A85C55690850636BF57DA46A403CD181F58AF86CD70EF98BB7DFEBBB416B58E66F3DEF2A340F714017D6439F4422E0025A6F6F3FE937306DDB7C25B2A6A91896CA241736C0651268E1884565F8C54D39CF395714A0816595E73E5C008DB304D5B74D8A988261E52AD0DDBF688A865AC3B974CBA8BFBE516589971E02758718B86D6C098908EC64CF691E049C8540EC519C0F6230D50F7D5590AFC1B7CC3C0C1B07782B631138F021EFAFBA684B1D3E516EDAAF0398656B1FC4B88B34E4418691DC72379280FC4ADB805F007E1CEAB838534BA40D61619F15FBA5C875D4B8F5420377E7A22A88B78298FC29DDB485874B12F40A1634A0DCE789448ABE99FCEFF58456453A89D306E21469C2B374D684F75194B457EA825EC19F72F8A672A92AE6FE40B7D586EAA6AD522AF5065863627AC79B81DEBD12E71116177E0F3BE82AAAAA63C06FC282C023210BFCC84AFD474E64D27639488D35AF21C526FB40316EFA4FFE8422B38EF5943D5E96FB7386C39AD98B8D10B99C6F9B25A233B35A9164AC35D42B1152D4F42D071AA8820CA133E2A5D7257E1538165CE0F2686D7D4DE8AAB63446258DACA3AD1F15294EB5E15FD22B73C2F73E001D1B293DC1F770B6B9617AF5851C0232376D42506E661A72C13D03B78AEE93A7EAAA0CFE6935769CDCF1995AFFBEA094F2621453985F5D5BA281C74227D6BAF8AD822C45E3B0A9A65C9F995AE40B7BAD2A969BA31B0BF791BCF50B34349BEB07B922DEDC5982BE5AACB0D2E2391629DA0C3EB6AE3854EFC3795DCB7AF7EA43A64D1B2C0742BFB6DBA7A62AB01DC9F4A2FB795C369E8E4EBD84378E28BC13B92BB15806D2754B7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291D6507794B2505E84EE8013E40612EC5AA52FC73F152A7F2E2C9B9DF47B8A2D98C907CDD2061EB77713B1F99942207D92F64217523B2B73DD89ABC13C7B26492A3ABEBC0067F39DDFB94C114A5B00EF2089EDB8B9FC7BE43B8D0546913FC32EFF2CA3F0B3018EB970028D83FACFB0949A53FED00FE3ADBC6AC58A7E86985A6543B1291127B80244FEC574B94FCACB514A2CDC95FB8FAFD18EFC14AD1D29D30AD8172EF771830CD80D1EC1CEFA21270F4208EE37F4AE53A5B9EAEFD0C824D6F0AFB1D20E4F359A8FCB0DC7A1508952C1B0C045C449805F6A0552053F24AA1727C6B8E6899815687D5D03E1B4F4BE57AD5766A770B5A2EB9B8D61DDFD326B26162EBB5399F3837611F4FB0C1F1C915EBAC205E06ADCD84272841F18303F474B054B86DF05272F7C882ECD6808C61AD403597E22AFA59E41277D19F75BE7D734503013F54FFB8E91ED4F1C66690B132A6F95765F98FEC6317BC679E026BC1F894B37586494B4A6382578698EBDF7AE26D740CBBF063F0AB9D5ECB0509D10F668B83F254F731E4ED3730E75420416988077CB75BFFBFC1B25ED615C8BB3134FD69346000F5DCF08121D16B950F53112D5B5770A836B458CA037FC5B9A6A0FA7D0E0DD894A11085F07645EB03A32B61FE29527C4A5064DD2A10B96A59ADA8C33989EAA21A84314A4FA3CFA267B8CB75FDC4D3EBBE78DD60015A76B91B9D96F3EF2FAAC65A4E9413C36B093FE577F50598421619C481817A0675F36E1B90DB899FE2269FBE7B9CAB9E215508383BD9369205719FD76D93FFD3F25AEED04A87D2B4D46CC79CCBDECD48E2EF637707DC593A1E11D9F691A50DF3653EEB0987909E1E3558580C47F44AFAEB4CB61FB37CBFC05DE5D417A90F6AD49C5121892D5661E290256152FC73F152A7F2E2C9B9DF47B8A2D98CDC6DB0FBCF4168E65F0B433E8BE2886EF030DA36FF62BBCFB93D49CE60CE5CB0013BB4EA2F31256957238CE41305D595F65BE655D76C7F104EFD12289AE3EBCFA2DE16164DF46159DDCD399B7AC373D527E77B6871B7D5E4F7653E426861C8ECB5D571D4581BC90219FE0B1C7EDCBCE9BCAEF232AFF3E9D801EA418F5B4E77B4C24EEB7657A69009F9C8B7AA5C3F6755D8E845B1A04686F27CE3721AD4A901BC8341FDEBDE4B9ED0AB6C4002A3386462C2A534C5148AA8F8F663B23D8F9D85FDD6BC67D1048DE879B19DCF56E43639731751BAAF5F36005A432CC7B5174652E41B80747A93FB375ED9641883E71CC5ACE13BA04643BADE35B0C4ABABB8ADACA0A7918C31EAD8D2D839C35BBD0879636EB337E3549227A9780CE27D7888769B1DBA26BE2B6DD7C7B8918E9C52A6EF5F37BC081A56EF8F01AB93E9E0001BB29D292654419B5D313BBCA6B7620AD14AC364B37BB5F15AE07681EA720937380C294C3422EE8838FDC0CE0FF4043D8023C8B38ED854495BDB982A734BA01D8B963C442A0F0EE3B18E327DB06AA22E06B2FDA115E05550314077D3CF405B0B770950A794FF8D6C44B99EFCEB51998CEED8052BF012E56A7764FE69A0A84ACBE85F549FBBC4E8DA632FB7E70C2035C772ABD52954E6680242CFA8E85D0AC9B3C228D026AA3FD14D8D828B03CA96893A3D19671FD335FBC1D6372ADF051A9C1ED622E6AC3C79DEEFC0CAD6BC738ECFBEC86D845ED968C8F707DD1CA34A3679A692A9BA1D8AAA208BE2511F6CD6B9B24E59BF342D00A3F5D52FB1DD1A8F1D63865D7499F57C000298103D6312187A2FE57D6C91F1DED437C5DAD50EF1BDAF94D7F94745F177955519B971B0E52939A55A6EAAA74423A9685B43C4874F983F92658086CC6046F7B3EFBC3675DBB71F9127A360C4BC22C33833F3846A413AC79412E984BD2413A1E59DF691CB46F76FB75CB277F3CCA35154AB51FB65E64B5D181A25BCA532D6BC67D1048DE879B19DCF56E4363973B4AF7280D43926E10C924283585461AF00CBAD34A70B81C3D1A03472021A24B1B89F905EEB0BBDA8B4C4FF093A132C42AB967CD8487A1F3DCEB8F530E3BC735894A11085F07645EB03A32B61FE29527C0E1F9BD9B2BE9A774A69B1A31BBC6A4CD4DE9145319FA2EE4C0BA3364D3A2D10D7B22248F3F95CB4EE8284A7674833835A624A231E490DFBA3E7A553AE1C9A07D73A7279C10BA978FA9ABCF789D29C851286653F8682979E00DF3D8DE9D3E7611DD46D476140E3472F522914100365BF282DD2935220B3A9CE6057DC86F9CC331B019AF36EE99D8C8FA942AE7469F335B3F5B83A073A318CE695F3986DEA103FF6A7880C4EB5C08817DE703ECAD3F10FA9DC1225D1D5AE0A1BCC7D9FF7F3BB0B21ED55ED599CF936BBD88A6A63EAB3808156E0F1490442D8A40390FA1E0678FB48C7F12B8ADD9C5CC5E8118A8A61DC1602F7FCB0A65591941489CD7727B981A9FBC6AAB8C3AC54ABDDD455544C21CC0E355577E8E53A9BA703D57B83015EECFAB327F89BC4EA2F40E5EA554518E2F3BE294DEFB114FDB6A1FB6F2A33A2BB1340423BE56A6D1AEC04E92801C143755136920A920683432455D6F4B13EF828A6D402F7FCB0A65591941489CD7727B981A90A9B7EFB4CB7BF37CA0B4D505FA04251F1B620BB07C5CBA3691FF15F7A57A17AD4A43883B21B3C6FEFB8DC11123B4B4A02F7FCB0A65591941489CD7727B981A923A9685B43C4874F983F92658086CC6025B793FBDFBA572090556B432181AB57B387D76B90C57F8E9D8AB35144801B3C5D8DC03AA012CBD583BA44BF0E5444F1A3BF213671B9548EC2D4E9A885F1A4870C01A44D99A0F1BFC3ECFCB2DAB0C5533D9B44F5B64224E65F2B6233351DDFFA8814C110F85746FFA7C84B73CE66C3CEA06594D8423336350E6A8C76D029C4D3FAFE16444D4D940D940B696200629F5DB521CD444DAFC01B9DBF89641DC5741883A0C40DD62BE48EC878E4133772F2125DAA48676F047999067583C9C6722B7156462817D1E13CFEEF314229ECCAE38602F7FCB0A65591941489CD7727B981A98CC207739970C8F2937B4A07FC77ACA384F054A17C2A6BCD0418379393223D743C06564982B14D753CCB7829F134E6F09557B191B95F66E76426762CBEE31889FEF3E74932D04119DA3EC992D336C365D6BC67D1048DE879B19DCF56E43639739EA1F4E096DE9FED3F7E27E77D5C59EB02F7FCB0A65591941489CD7727B981A9D3F3FEEA2A9DC17A268BA148D5D835025B4DC7120E7465416BB44F2B5858818C4D367C712CD1B829EA1F9C4C848AE583F317157D32303D2BC584D6A0CE67357E5E61994EE68BB0D56500008D776134575878FFB80D412327651A3EDBFF4BC6B5125016B1CB289CFE641BEC566385259802F7FCB0A65591941489CD7727B981A92A0CF474606B19AF455B0FE76A74577DC9E786D0B6B4F42D54050680EDD032F420DF431912079BBC9B1A1A5873BF7AD259264E5132BD8218A6E21B83D3DF3937B250E21B3F7DC4D8232066990765E989898B0251FC925DB20A5899FCD65AD45B811F5370F1038A6A48BA678ABF5DD0383B18C7D7295C19FFEDABF798E5E8BA255B8B8E52DAB9BF0FDF5977E50D366E9B99D524A0F4C618ADAA0E9CB9D1A002F26523E108BFA77E3EE98BB2A45F2B31C577955519B971B0E52939A55A6EAAA744D7BEF2E2BF0730268D6346C36A7EAF803B980CAF1454D8CF356DBF8AAC8C06B78090BF49A48F81B5A893426FE297CE2B7AE570EF93EF0BAE0B417B89A2D5ED8DE9ADDAADF40D3E576D532B4D3267B5FE1B263AA437DBE5C2B9E8490CD26F3C2FD277625A9B58528E9D31E7921B0B443536574806CFEC4EA6090F072E480AC37381A75E6954C0171573D728FFD4370AA6D642848B685185EC81127A19F4664AF570E43631628876CDBA595103A7FAD5BC02A139A981E0FC14819AD97794432B354D94996A23ACB2CBBD3008A6B852003D22039F09B8FDDB60D427FA655DCD5E95CA26D3F99B538662A40320CA1E4A264F75AAE24B3DA2946EDC1782C6133CEEB458E14049410B8F094BC50C70BA3FC6591F3E9E02294C5B383BE6A55FCB0964F08B98DFC25C73799ECFD0D52EFD15C96040D659F73FBE9F4A8AD34DFAF3C1705F1DCA6DE016CA4A124C09CCB8A48623354CAA7C7C9AFC5E4BE64A5D1CBFCF07FEDA0CF68C859E2427EDB5B2F89FD79F24C470425C8F828EA6458CBF747B7562E97223B2B2C1FE9274AE04AEEFEFB6B9676E83FF646A1DAC29C61BAE6B17274A74DCABBEB4F46AAC46D0D59B4063752DCE4531DF3991BD51F378FA87F1BC0D8F60656A928DE314FCDB764FE306503FCF2BC45A8DE0AE36852B5DFBDF63D60E7397148939FD667DEF1D11D4485D0DE5DC15423BC4A62B48C292E92F65378BF39DF1EEBD6A3BB3058472C2F817CB29EEB3F7A2EFEFC3FF2D7A688E52894C5F7365F758E4122B1380F9C047E028896682378A1853E343F055566996CB5D6C60EADB5C92C7D480467437DD5620DCB7A7AA40331BCEA497260414E5EB6E174FE606D3BA8977E94D46DA4A779359A7A0F1761DC7FE471CBCB6506BD4A5E6B3C9B5CCA33979568574FB49E2A9CB8197A4E206E5CD55CFCA35AE6363B9A1EFC6F0F8C41D1080C2C7BC90F881582C51A7DEBBC418D9E337C27E72EB838608E281291E4EF69C7EDB305C896D98DF94AEC31AB35276CFB4A3D5E3A11878E51A3645C592D26988A6CA14A8438A84FC022E38E34FA15B2653EF129813B1777AB7236B6F5B603405C0C56ED91EB34921B15DA78AAF024D1A726C1539B4675AF8260D12C1CD211C06EC2FE76A6F6E6BE636D211442E3FF8775B07E63394A05E44E82E28AABF695E691725426E4F57C3AD7F102571DFEB169B1ECB64B9DBD14AF2422FA7369409A4D37E1D824DC18ADD3A67B086CA7DC05BC6F1DBF507D1B6DAE06582173315949523C56843E93F3662B0496BA8AA1C1917AD50589A1F766C72E4446BF8FB72AF5B8DD92EF721616B942B893C6DDA9C4C8B637572696DCDD81BB042A8F9CD2ACAC557FD4A450B74F84F54530B63A110694CC13AF1A248EA501304CCBAD1BF299EE112C8F0ED5CA8EAE2648B13689FC3223612C8D608D5B34740A25CAE922DE1CE5A6A0331B59E9B07E2AE35D05DA3DE49EE6217A08439859E6E33141E6BEEE308A39C668D0613CA8CD402721F039DC24A66389F3CB5E9380EBCE93DAEF0FAA6EFBD918CD3DF53090E4AFFD6B7EB3BDA93232C697BA6914D26EEB2B64B5C8939CE94FCAF5323244205DD5FDD2352142810274B9D31BE9FA99FF27DBD6502A4AE5F1D05BB8175570702C16D0DC3AF7F2CAE6BA85E09FC500AD177AD4B1BB53A8CF0CD3A6B5F5397CC445246A20F2D042E2CF5A8095AB988DC3100FFBED813248831560C6CAE7C6A067714DC3AC53D57DA86F68F09DB0E789285D98CC386860F07D80CB91F253265E64C4784E46E2B74CA1C8C6A896936AC1DA446756B502F2E6B9CF2178D339066C9BE085EE8C7EB9A92AA9393000F455F163C270E8E756183079874C5B61D1965E5087B7E527764DAF84353CA9CF263BD248F9603FFDCE2C0D95A007D525993BD1D9944D69EC4172836DC41A9D65CD7C2E24BAEA04B04AEE61889995FBACB55E240E2D29577766AD592B56B0789BDD7FD5B55CAC161D167653EE425818A5F795E62DA6125BAB6156777713BAB9773ADD664D74ECA8942FB37C99F85F0B24573C35E4390C00B56BB63F58D01EBD94BE76D8EE8848805126A723424A4F5846B6C9B040F82C82B1A8E24A5634271782A5B5C75A5D4D374395C8F2DBA59E072B6049CD9851FEE8ED4DFA2658D92FC948726C56B257B831A7571371BE1489682FB1DD1B0438D881F7F8EB7B35A22E7125016B1CB289CFE641BEC5663852598D1B9AF693490AC2D38F2E52B15780F2827120EEB0F36F9256A71C5F94E0485EBE9215E33B05F05946D161B579602DF463FE0338EE27F0D800C66C07ECA9A4230C336423B75D125BE0363318B8B433B36D335C8B9C9271F5E10EB40514874ED72DEF03250AF00B20A426E7028E821F536F16979CC0877708DE98FCD06901DCFBC954978D859CAEBA4C45767703B87D26407231540794FE71F782061D7BA81D097D79369E061B8E8373C7D09E3ACF500135D8A61E5B75533015399D7EC74CE8DBD24721BBB1DDC2D8ED198078FDEB842B3E25F792AA8CC44D1D6C8664EAC1CE2370BFD182B97EF270F6FAE61B7FD2F16403F1B124D71679103E66E9E8DB9573DD96443D2FE51678CDE250C9E644AE7A290EA75F57905716439F31B7E13F1FB0BB3E7C35C783067222ECC3B617BD67BCCA6C57F3AB6BC6B061FB32C487D90369A1639F6D50DF26D7C53351A26843AADFE5D87B30C1A948832AA058D2044F1B01DF1338A7C290BCCB42295FA9794C0C20AEF9BA5B707B7E2437F3264166B1AC7EA803B8F34C7DC2C177AEF41301584C0EE8F7B40D68F36256F3F957B65B967A71A7B6982B40BDD7855D11AB391EBEAB0E578D181D57C645BD43965156C2D779882A8C5577B3CB86ADCCED447B2BE74A97F7C64AD8F900D806ED6C6B3DEB749DCF91B6210A5D6ACAB1C48050B4BDF2BECB4308EBF12D07CB59610B24C84B9737E4E8AA76EF9F50C25ED1A9B2DC46F57FBB8216210A5D6ACAB1C48050B4BDF2BECB430E16EC610D14D53B1EA2BEA843E7C68ACA4D1493B494221D5BBAD78C1204C4CEE45A0054CF560CA3DEB3BC51ECDDFE99250D580A80E1FE6D07F2A33445232CA5F7BBCCE735E2E0D8047969A3BFF25128B4AAD70FD27C9B44D99A525F334194718385FE416805AD86832D9E6EA50BE32C3D579085BB7DD98B6493C25E0A289686B0DE2323A1365EDCBB5F7D4BFFE7A7591343AEA7D3ACB208D208DE8D2CACA0E5B3AA036489299EEABD2219A746165B60883AD764072B0645213ED78FCC5DF68E325AE5DD8CDAAF3A8CD0CFB1340AEB238005299251E9AC31D119C4A955A58CE9576245C44B638CD1E5BF58792BF80421C98AE2E701FA218C1A0AFA308499812D7CCB2AC2049DBE4AEFF5326EC53459653E86696C1965551EF9B00EDA3C698A00245541FFBA45CDA334551C5D791BA2A194F374FE2003EEDC5F5F4A2A078CB21F7F32C71ADBCC9A50EE7ACED604E74C815DECE98DDCF70DA73316E23391C4C76135DC301B03018D899514B93787BE604D70B5892CEFE1679B32DAE02D595F5AEF9FF263230C2C83A98A79AC4F74F292A63BC12DCFF0CE8D73244282D7C3582B745DCD241F10C375F9F765D1F41492FCD0116DC1AE686E5736B88F0B6D690B95E53F86EE35EE18D7AD24A0BC517E5119557C6EDCB559D2562BCDEAD98E63D7E406A5397D5951EBB5841659DAA03061DCED256B409F338F7319341513AAAAF611FC0AE9A233345E02C4F682E18E95CD7ECA7AF6282D4D2D9E8A9C36C95FFDFB947D102A139A981E0FC14819AD97794432B35452414759272796CD27CE6492C6B36400E9CB297A50A1A114D244246CC302C0064871352B45558A10DCD3660F0FD8AAB4FF91B3F2D1606E201930B6D2AA3C74608F5DEBFB67E1AA1F60A4EA0913C764660C0FA64B8D1D0B3F39FBCE6E54D97D26F3CB82EE26853CF2355F628A0B0CE9A015562B9805B94941345BEF64CDC69BDA04789FECE538292322FD7C3B9EA13855E602ED45DA7AF96ABCB880D6CDA6A108808A6625F3EFD2D5B7FC2063134F1E85C5633D81C37450E9A91C9403DA58740FD49E596B8DE72123D1DA81BEF10CD5B427B6175ABBE13CA534D7407BCCF3AC3179D262CEE73E7F8C5712EC4285F2B5B04536AB0454465BB3FD3A3570C77ABDF78A4B4B746E9605160073EFAF2F095CEB8600FFDFCCEA5F9CE1B9CBDD96F814AEAD4C74D0B162B200437DEA981561FF849A0C289E3BB640760235EADA017274A0E793A1782363369CFC3D1127B234E2EF0164987FC41BDC6E926EE671DF0F6AF17CB58D91EF453F5EE4CCBA0A6AC13F61B2FFB4AB9C6049E8B904B9FE468DD1484F7848BF729349A4C66442308F007AB66FC8A10E8D8D586BAD4A8B81B6B43AA6CC48E48D0EFC8865F984E33856742FB418B6776AF92A37A354341E0A1C2C62C27A76541799A4F15E90FF1452001EC58E26E14FC018F43F83AE1564557565555CFC49F4AA76F016606A12CFC91D935F165999C68DABA4651C1AF808278997EDE9C0EDA30185F4844573F10F0D9D297520F522657C3B42C784535CADBEAC69C219F7CF1E412A26E24BCD15AF604BA112DD5E22F644244C348F437C87AE31EC481C861CE582B59B3407DFA00CA2F94ED0EC0B5827CD1ACDC03EDB1D86E687CBE69D033EB4C36CCEA2B7CD881EBB0E0AE7402C02EBD00620AAB063213152456600E4A078FB4CED01BC671B851854EE2FB92F3C29798571BA34AD601F962DD450B07F8B4935F06734A6558664EB65BCCD6473D209D788B0181803FFBCF1FC53651C1945167998770E914F9FD6A9E6D20E7AD714A3C66D937275CB08E1B1122DD4A19390AEDB25CB3A4401E7B77D2B66BD9B2F34711FB756DBA8DB7D3365826AF8CDB12C6FFB775EC5E628FC4074B7FA5C5EEB5F566220B40CD32B9A8F360673F9480CF2E76910B2FE47EA7C364BCBD158833E35860C887C279CFC1E350EDBE1373888C9CA0FD1576869C92159FBE97178294A40A4FA4BFE980011DBD0F05BFC30C84091E8B10736F359C041B03850A5F7EDE25EA8725C7F3E3C64FA9A3433DDFA6FE9E266018B997B36B84A0E73F827DB6C08C93E86BE28344777D2AFFD238132AB8835D574CE9A1EF5BCB80BE9F56F7B03A215BB437166A0CD2A967A409256CA75D86E942BE48C1160279BFFE459EC93EE3C7538B3E7AE8A166F1B01DCF63FD89206CAAF56FE454B9D6D5D51ADD64EAEA6EE5FB89C554944DE9FCCC8173DB52E1E2736975CC251248629E98500BEDDC316C8C1DE9290466C1CF069C6C39EB80885AC5E0C8C7759D4FD2E06CFE1A389E2988EE2CD07F6161A232B5D69AAC893AFBD15C8EC5E1AAA3D8407C6D9CFC9DD1027476D89A4CB4F82C7E6005E3B3BE1A651832E6D3F0B47DAB9F8600A74C8E34A0B17EA74162A19F68705904E060A41046FFE711A090D2C92C95EE33024F9635CC61C6BEFD20AD64F5B4B968D3DA3BF9FC1B5DD69AAAE2F89E66E3D9A3C7E76BDCC209BB46716819662BF1C084BCBA0A237B518BA8145B0EE249A0136CEF181E112A9AE621F078613E7E7B8D5CE1E952F9E5F425300E22B9C62D0AAC3A7BDB7D0CE497D158B8802F10ACA99B2DF9691FE3185127B64D4081E11E27299BCF88B8DD3B64A921B0F24A09CC571005B41C76F8BF4F0D13F9C28F0DCDFA7D05309FA8E6B1E419C472EFA785A4E44A3F3719955B0331F7207D174CC9987F487049AF927301802B12667057E260F53CE5EF4F8CC845CACBE86E3AD6573EE36BF2625442A59BC57B0AD82AE28D0E29846F3CD9DE0A1E77EE99491D9E198146FC4F02CC45424803155F536015D698FB092E7AAD38891926E2279139C906DBA59CEE4E741C1B3C1BC5E00FB75233705B63934B7B4DCE5101C6D2E40D14755F356E4AEC3563B944F4D1D741C3747AC185043BA18B102B698E95CADB19226861BE181F3274223F9F23BD175E90DA8FE2193012478AEE0EC6C708CA7E0DA540D6A3D0F6B1B037E07DFF58A0E4564B2F311C0FEC16F2C1849F005D5A2A138D88F4C6D5064AE021A3DE96EBD8DA09D8311630AE0CA6C7D8508F7CAB060F8C7DBB0B36644453A2881CD6A7B5DB7C193B977AA7014A4C331C754D21F205E62923E22ECDAFDF5058942EE34AD9971F6EB0567949E00F23DAD36A531B1546894317D32702B9BECA963457606F59E68926F0CE72B0A9633F16147935C02C449F9F959755DDB45B114C574C90172F513C5093AD3D35CC3A3151E65B9946B8B5288A89E24CB3B02C030844F593B682AD283D6DF8C343B5A98177EDB44E2E56C4A6CCFB929F7B7163285DB7001FAC759DEC5EFB6104BCA8EA50E97ADCD094AC08379F75D39B88F3DDDF578041996E0AC12FC998B1C22D3B00770FD1B8B6F34AC2233E9688A437183101CCBDFDB51EDE666F89004938E1BDD4C4369058FD7B993B90E9C483AA9C42AA3091E1FFDE2A69C8CB96C39ED2586FD26772D8C54DE25BA7290272AAF946A903B078CBB4D14B517F209F9AD7164A0BD31E02612D3D342B879D4B4C03EA196D6F26A059F375108654842E33EA84C3DACBFE75B6C8EE2C7AC69492DE261CAFA8E677C1B27C3DD88C350B0833A9887E4DE9A4CC38F72F2A6E71DF5038E1EBB7ABB6CABD7ED458CA00BD452855C02F517AC999BF94282CF334713DCB7273E6C8F077A35D9212525C6E1BEC78E7103A00182D5EFD0B1292A179527E25F705FA7662E554AA0D684843D87675CB47CA12350F841E10855DCBACFE083AE39BA5E071BEE5174233C1CF8A703A8F2D737C02E3938C6EE1932A312ADCC08CA489F1E6261480EF79DBB8E78DBC50397F01D90D8810FCB3DB2C5AE1C8089B5A1BEDCFAB6E29A23F28B6F2B593B7CFDAEE43329E8F90C2281FC9D38EF1456D1C0601A50844462F4A0F9EAEEBF8989961EC25C8E48946690D2610E2EF0245B766BE00835ED230B86B71000C3A9515E25D95ADCC076F85D0F0783F557F479878328AB8E685B0C6E98A7BBBC97DB6AD9FCC3200C71A4B496EEA6E796DDE701A66206273F8B19D8E689F2A6FF1BB6203837415C038757C65D06A9158D069B08585FB6B6895F38A2B5E8045AE88D55E0E702722E9141BFCB6581F834C369D1F3DD7C4ECE254848D2B507D500C04FA9A644B184782159EC80354FD2FD724F531198CC782A1E34C0C1F5F001EC232F7364979FF1632497FD6C9FE806D024DDA77E92B9D5CD8FF0591E60C939F4F526837DF3E311D67E4CFE1DA8D505116DF401EAFCC86783A4B954823BA9BD089EB45EAC381968781D09EB214955C6F5305AB209E61A2593A31E282F3FE2C04C6FB0D738FB968458D1EA267F99BFBF6B280FA2568DD1D6A2D80C3A3D021F5940004D20A38F1E85C0DCF0B3D289AFC834956E41E50490F41BC41C6E0958447E1C3DD07D6ADA4CB2BF4AC11443F5698588DA27239EB2C01627398C8252403603AA224843928DB26D783347822707BDD5087B9CAD63C84A1E05E74D40D2C1BC324AE951C59A26F55A9A1022C5C76281CE4BF5B96EAB67063F5F1E02B5CE96AEA9033C949CCA87E8701C5E1D4AF8943E9040C0F1380E801DDEB679D356EAA1C9184564AD94E8AACD98E45163F03F2AEED789F7FBC00761415AAE2A331569853778CCBFF134671AF7A8C015628326BD20ECE436C126AFD5A73F9A649E0651B25959CEA30CDAA5B9222940203AD0DD25F9C6FE5FAE5E1AA4EB277678F0B6EE9EAD96195E1A443953664C02DD871A050370FFBB2AC9571744064225391309919913851A3BD1799B8C0333F22BFBDE47B05DA3BE3801B91CAAF95258BD1F743D39E6C6F11B2F363019F224BCFBC967CA677474A25EACFD7540D0759E2072699A657F621F25BBD25A95402CB3951A876FE114947DCAA035D6352349C7AF97194DCFC188847F8794EEAC4475CAAC4BE7921455979775669B51F0489643AAE52D8AC16CAD92B26EC9C0CCFD16FE0D207CC77A68449C971CDBD999FB21448312FA62A08A50545FFB9BE392F79C37CBE2D7F93E33D7AA4B4AA806309396F2F4DDEC53361FC11D874140C34592D6AAF3ED7659C6CC3394D5EF943F5F5A9016C90CA0BBC4B5F51E55BD0A1E2EB0AD44E624002CA7D8CB195A4E78C9FEF90BA83E613E4B1D563376DD12CCF257D0512BA9B7B9AFBADA306D0E34CFF6C16F3F9CB5581946AE746434067AC9D97A37D4CEAAC65FBBBD605B6555678FEAD1845C8A95B458373014CCC0599939CB50D74C4EA0C87B85D0515CC4D55228BB2928A6D59892ECAAA26006FC924F528AC42FD273379927AE472299D3CA24C71D531BA2DF833FBF5C4B404C178819789C430353EE2A2A3FCE8815F5F640650E7BE540D28817156F8C301B0F45C3373FDBC43A615B83987EAE6C722D7D1141E26F67D7C9698F4D8DC7EDD5E1CB128E2027F1DCE2219562E857F44B508AF20347483302FA7CFB086821CF4DA534504FAC4C3FB6B2A8F5342916C08D65B1AC04E30B16F5CDCD5678B339734D1FCD6EE0FBDE39060E08053390BFEC0DFC4E06454954093182538A42A9B098E7ADA41A51175DD8353D117E3B4A969643C186B8AF071266F8B0CEECFAF0AB76A8853D79C216524E4776F5B45A35ADBE1D526B9D93A425360A52AC08B4792A89251F1265801DC2EFD2D4B9B460FB615B6EAC6C0C5E6B5F2CD0C1DF0D20EAE796B8BB25B3DF4A639A95392B80EBA2F3AAD054C74A1884DB8A5347AFE1B9FF33CBC33CE4D20FFCA2BB0C7F4A131C85F0A0A091E26F99CDA40789B9906C890B90D55CC9589FA360AC35F66DB9A6FC8974FA836F30A3EFB935803A7847E324E6F1ECF54161055689160BCF07A0D0F83EF7422533E2FC340F553DF0F968BA5D5D339E70BFCEB41A6A2A17523C6C6F586A7D506442186D839F64D63AF74D93AABC4BAC05B751D683669E47CEC57A873DF7A31D2ED18712A9CBB98B8E35FB739A4F4CF2072E45F8A2885BF278BD0EFA275250B6901328AF2DBE07EB36AF1A17B622438A2A14B84A17E5AF049064EB2EC5791E0221D95B8DEB057E778812D095063036E0EF9392FBF11792ACAC14892F84E5D0990B727EE9EE58DB88B6CBAC22FF24D3F443D6F73792A41F87AB88332C40B61B3A4288FC88D8DCCD7FDAA042C62CA74D734294FECDE53EDDF59FAE9A7FE651565802CC957C8CC6D1709AA7C6D236605400AE4BDFE19C5BB9BB38F6B990A9F57F17253E623990905244E373EBD5D70A8106CCB68B3CF0326D92916F5B0F5A6CD00F7F13C060129E9272A4544351A073D307E990F627FD99E164108991AE89C7017190EABF0572747BA2673F7CFF9BACEF0A5E73E66AA66AD9C605375D122499E7A60981DCDB7544AA4ADDBB9D2806A35CDE65FC44DE0ED40576CA79023B6E4D996DA6A4823BC2EB933FB27A7C239E00B742209A7056E7982668D06F19AE0ABEFD44FC3EC15A4DF7BCD4F5BEA60802DADA0E8F72EEE72C005603749F3A9A3A675E7660C21640D647FB7A2F68E0280A43C2F4E16C0B62C1335B6DD9CD22A431215E7F1736C3FA887C3023969234B05F57749D721CA5E06A4022033D3A93B071287743AE370D560B3B05FC92B7328BAF1C81D72351CA05EF5EF230CE59D3FF7EAC2124E9720E78F4C286B592DB1B4536BF502C77B8F868582A2D059B8C4E5499480DC74B1581AF3C847D99CAABC7A277963A5397F0F0E3E1A5161134ADAF6BFF2719641394DAAA656478FDAC8337BBBB5F694C9650170D26F200537127A26CE5AA66E525BDB774CA62088FCC42FD2D700DF13440FD1F05BAE3FFBA5098F1B7CC28120639569AD1B4DE726BEF0EA6453EC3930F87A612EAECCF9BEDEAB231920D62916A22489A924E52A18BC66BEF7F125D4BA54F064F4C1F1090A0A1F3DA56BF843815B59DF8C8F6ED4CA3A2226F3DADFDAF64DD01189A98BA951D6EAAFE009694A51A86EDE9BBEFFC2F3157EA077BF3148C669E0D2BE4AD439629B469941ECEE71AE5686A850963FACD34B594029B8DE939D97E73AF9CB396D0CE8A5DEE1E142876B9ED482B8487CAC7AD5367510DD4F531C6C4E1418A1B1031EBED7E3A356771608C6A91DB9AFBBA55997B1959B815B344B465CA4C1D2ADE976F3AC6B764F4BAE21DCBED51D2F5BD16AE309FF92996399FB1E50BC2AE521D6EC2ACF1F93EFCD511A66CCFB2B0C8B9445FF5FD8E774E409C970610379AC3C22443EF82EF87758759A506796179D72F227911DD942E9C00AD8C37C7DC7811A545373EF103059C72A9D1A3D6CF3FFC6C64C77CE6EA687FD14AA8BA6B052E3FC07FB8C39BF7045076B5993487E9F4D25E2D1FD82D0A51FE7895E4D0DCC27698ED42F6BC56F6AECD2A3979A141275EDEE8CC02D2F829F3AB3F4F6C71B9BAC2DAF401996E613293BEB634DC4ED8F206D4F23ECC67954DB3BFBE041158C0B5FF055E51FC087150632FA40B18CDC41B715502CD0071FC98E660532C44340528B7D8252FAEF8B333EB8B46998F5DB67EF7A93AE400F3210F4FD6C3E3220CB35F9703AAB17847223A9BD8BAD1FB9BD049494100557F5EC90CCFA99A95C695BA9DC2888FD9F3DD1F3FA9908E699F02F8E34149E22963B8235B60ECFDF86DC7A03D9AFBDD9A7B55BE142AA9B54D68CCDF647AA441B115E70218C32006CE55AD91A2915D33317E8134F49FEA1DD6F4EFA0110B4862A7C18425AD3EB2ECEBCED908E4F13F9AEE7C9AD53300E0F01542BF7B7E5654D133C43CADE22DCF0257DF572E89B5F953325EE58646D8E2FB5A928400F767FDD794484E0A3483ED34EC6D9CF835F898910527A0003BD3D7699CD22F61E4479737247CBF1D91EEB0ADB38C7E6595C10045437090A3B20D3AD3A36BDB9AF75CCF6CD6453CD7665645D176C3895628C269DEEA0C18B0F0A78A5AD2CD1935835A62A9D53E49F00E31B4B9ADC7F7A48148657C441CF49E0CA57FAB3B6F4508CEC57B3BC42A3F04B076020D40D896BF3E0604237E4A7E661B7BDADA2E7B55DB294E88810C369739D3AE502405B5BF819315FA69B7B1FCE5A1C2C292BFF64639D0CA2D517D91DBB0F3F8A92D89AA3A315EE2BAF5E26DDE82AA332142AB0D5919DC75880DCA8F69E113DDABC635165C933285F118C7CBB8C1A9F71D7E2ADCC5CE52604731CBD6E6ABE886AF1F38E3EC54E21CA4E5F2D73D39DC9A76F1F8A2529AFC20088EFB3AD3DBB2CC00F609B56D4BA2D4C692D6320940B172A946C02329820FB99CD61AD1C938C96E1E88E8C7885D288B5D35BC0701E1FEDECC61808D486C90ABF38109EE0D3133D4EC2B50F0762BE8778B8D9CB9E8BC93AA16131B5722AC9E2E8CC92E1B461301EE73CAB9290F5564D6CA567A15FE408EB63330E6E71C68139F34F9BEE5AA43C09D4586E8ED13D88584225CFFB3DC636BAD330A14F628D406F16B15D8B34C4B66570684F1186C4D77EFE0A1B15B7723B2DEE59722F8239469B3C7AEA53FDFF2ADDF7348349795F5BBE2485FD1466D5ADE2265D6AF775DD03481B4B8D645DE335D3562E93A93CFEF1F1DA7E6B964EC6382912F1FEEE36053582960B13CF36BC20CBC31BB4406E7DED085006FED5D91B7AB2A684A0939325302B10652E4A4F29D19B629E65DC0B495970419237FABEBBF313CF0D3F90F1DCE2B6BE18DF96F362ACD78B23A156529891E0526BC351566FB135F3461AC0C46C91B23331C8FAFC886A5DFC27EBF8B8D8BE733398B894A1CA4F2C1B09610E1EAB2B5CFF674AFF27A80D63F4329D79A18579E2B873C300DB9CF226BB89925591B79DF9C2CF87886FD7898C3D545C6DDF38B8628D565E08CCF92040D0A261A430818C68DE1F1D65296D8AEE79BF7A3C00DDE2DD1215BF2F03E732FA4E92B9721A2CA29B284EFE07EDEE8462EFD997403A1D4DB6A6672199AFB870DB2BA46958055C508FFBF13C77A8FF93A88F18C78E692771EC7F3AAFBC9C9720ECD883ED3EB4DEC66BFBE3B83EE27DC9EA3DB6AD83030B826A1C74C67450B7726BD358EDB53B97461AC81ED299296668731E73E76BA3F65ECB46F23E57B4897027A2CBC030FC3546FD950DE96C75CF1F052EBB36A8EEBF48119E87C5995AD0E84A6815B7C903B2FAB897475478499ED821C972AA305EB3778D957AB11600D331C90682C3D07669622B05492940DCB194844E155603D45A0A791FB2C9ECAC176DE2B78BDC8C838C113E338D673848CBF55E8781829957487643275AF62C9E6B630B9B21CAFA507361D8BD39D0F5E32BE3B0D2EB820F4D06B67A1819DDF3142912E48F685B75583755982FDB530BCF29A1E2EE58CAB1594FA5E931CDC52B4FBD94F55972B44D123D6E26AAB1F60AC9167D579EB3810619765E13157BFA39AC2AC0BE772CA0EDD82F561CE893167ED4A4E61808F878B8CE364D36E4B3D1538B7DEDED012787609161EFD16AE65B389B39552DD1ACD3BC55904DB90FBCC807BA468A9A7941F861A317D958D089DE00BF376711295D4C96B6964C6870AA2B5FB78F726693E5220AA311C7AD24BF1D0FC50C7EEBA0B286CBAA1D3511326D76E4934322E6ED26F268E03E4306AB8D670FBD1D304B64209DE3F267E2996B732C07032E6787E5636F9409E9502C5B1B32C267D5997AE87AD6903F38BE9ECB0EC6D0F2E495502BBDBB9A4CBE12DAB09356D3C69EB074FB648AD1C54C277FDE4069D43C6ABBE5EA5E6AD483C16B6C3222EB499E053C77206F9C220C51338E31EE28A98A219FC1DF57DB399763883E6895DFC3C7A832DAC4A43F6D531ACE173740520C6A42936B21234948B31FBBD5A58F1B8ADAF8540F0E428C73676D4E74DD131D8A8B2369129AB146E364375290A1686E2A4A865C5D24ABF6658FEB50F18C3E45C0139D35AAFC523D95E0E06FC06613A7A764347318E1552E7C3868269B7C1697ED0148376F1F7B070BAC5B0E9ACC3A90EEB234124EBBF1D19C73447F7DA0A302BCEF9604281ABFDBBDE857683FD4B6EF613DF24154D34FA40F25837B471C3EB4EAF6DEFF1CBCB765F11D846BB684E816D93B2ECD85ACB3E9D1333EA84D8D224E88A78F6E67468341B7B0F23AD5C80FC7C72157EE732A4398AB95F395A63D5015787552F548A11DFA9BE245F1EE813CC7850A09EE035203FFA3366F0BC70F00367C85C695290A134BE6BA1EABBDCD1C9B4E0C14177BB0541DE87033699B0DEDFE5523CB9DDB331AEEA5F6BCF4BFACD9866D569AE43BC4C2D18C685C4FD132ED5920959279EC65ABE2B23B68FF349912D568EC3CC4AF6EDA4FC3561C9185BF40156B22E5A0CF195C8FC891C43F560BEC196FD760FF8964D332CC6572E91AFA9498E78E8ED43E4248B7EBA31952F7E7799D647A1BACBF106E0DFEAE953189DF61B1C940BB65AE1B70D1D9A510BD8432E9AE6025D3F531B6AA2EA77CBC49186BAC7237A288FEBF02304EF0B2EBF6273AAC3895802FB0E614B5C9E73167ABC2E833CCFE885E4129663F23E9A7ECF3D62F2583BCE67304812DA64234137BF67C4678B4E7FC10D5BFBF478BA29C1729E64231ABE0F611BFD9D40B48B99C37678073BA402885ED58A9824663F8DCE9BFAA709C473CFA28136926CC395F675EA2F34E9EFEF527279DC72D1964AC1B1E45C7F0256AC6C7FB83BE783CDC4317C8C7BA70E02F072969C3AA6CBC0346DA6C3B100E3BF60D52A4AEABC809D9BF55B74A51DC018115790BFAA5AB9FDD5BBB7CB0BF3C47E9A4A9AECD21ECB8F0EBD5CE2C06F262EF2F082DEE76B1253010BE670FA67AFF89059088AC776D30C2A03BCC612A6AFE0CC9003F435A34987D36D1F9DFA105167918BDC0B12D007DD96B99156F518ECF92D99795B5E0CA7D58E977CE35F87E8F6EA57663F9638A32E8D94EFB242DDF5EA767BE5EFAE3C2C7FCE1F16C55060A7D3DA23212CE709BC337EBE6C4DEABF60F7CF6E3AAC49CC561BF1759136009A454A2A0E5E665194E0063B6E5FD3983A45CDFB10D7F8119853804A4C3740F578E83BE95329FD1778B169BC94DAF1FD10D5417FE70011D4329B615E34C72F32A4C85AFF4E90028444EC41DDC9FE1E3C7964E1307A9457FE4A14DEFFCD14324C11BB3592529367C0CAA7AFA9874B0BA51140040316EFA4FFE8422B38EF5943D5E96FBA920CA7BB76BF7278DD9E9E95378E77F9AC079095032FF70414B97FB3D795B2B769CDCF1995AFFBEA094F2621453985F4DA2EC2D4F1E5F14D5D938C5E85B78F8B479943F3D93E66CB464536D2F35560448A7DFBC8D824BB2723B6EF271A681D85BBE0DF3433E93708A17EC56831ABCE174FE260C99E49C01FB11503B6327A8DD2E202429AC480392C0642E3A4ADD2DF6D3FB7D7622A8E23F9D082B6F2816A53E5F03614BE7665C093C9F9391563ACF934DAAC84F1C6C908CA83DB9D67C349869AFB3B6AE5384AA3E04E522874FA18D13266563482F795570FFD1443EFFE14AF86391442186FB7D4AA45EC5F9569C3D6EE38B35BF95E7354E8E5F40D62E35E815714F8730EFCBD9B064437B96E4322AB96570E225E45309A237B57BA7EDD37E73AB49FDA7820AC10DDFF2DE47BCD7960F64E9B2403BE63D50347C8D89A66A090C05DCFE7892F87D3984B64906934ADF36E3DDC3B664B350E2AF9157584F09B0506901226F2C566B85342F4BD1AE96446F40AE873BE92BC66A0643DD8C9286ACC8655B4C767377098B2EFA2D11382C0FD6CD83E57C7204F5A2BE5C7172DA69EBE79033DD7A30448C28B4AE78449A041FDC9F3381BA5E7A2FBD48F6743F487BA59C55F4FEE2504AE6D0DFA241801DFE79EAF470EFFDD4795E75F061DB6C53F97CCE537BE0ACDE2DBB4858C2F62A4313251D7502C145CEBC430BABC8922ECD5D1C2B78CD08820C8AA619FE98A1B15228323A392F523F1C7C448CF025CA57B58B532F6ABA0948AE3BE921CB0985C8A0394F6D8998E271F7E3BE9E707F4F43219CF3527008B126F4DB85983E83414919FB1882FAC4516CC276CF5F67D6E048170726F78BBCE782F6162043573FA8F3E3D6177173C9FD9052441503629C4D4EFCE68F6E3E967CC19D92923206E49590C20E4E5A38A4BF71992953447E27FD8FB4928E09FB3A9E04568162B0ACC8BCBE37B201CDB699E9E1F2269283B3B93FE2BAF621E4CC434C1DFA6EBCB58268958344D684CD40316EFA4FFE8422B38EF5943D5E96FBA920CA7BB76BF7278DD9E9E95378E77F9AC079095032FF70414B97FB3D795B2BBF811C9A99ACB8B32A9F904AEC602FF1E7FE4DDFB85F737F3E6BAC095E6E30D30FFB58CEE8C00A2E20B4BA4A1C6C057C6C634A675B9A542D5FDB862F92AF0F2A3DB5E63E6A747990B39898F4EBDC9DE7C649C45E1D0FC0098EC64726E929CE620A875B4B98539CBF6EFCA8EF192CB90FB65F9196AAC1D8A99CE268EA960B211D9A694B308C4EB02680C19212769CEB109E71628D4F9442FD076A1AED785263DA0885D0C7C1EA93D2C1475C402352F1317088507E0E4216F79CBE4A83E02456287D1400208A9EE8E1472508DC2715E028508FDDCAABE0563F3C036A75B42969F37C0C3D4C29F5553AEBA773F20D5112EA447E390667294F39EB328155010513111C044FB066263AFA6107F3C069F981A95C8DAC20A4E8E40E86B3135DDA286BF6EDE2392A7E71FD027122E2BC3EC5BCFAB833DEB56E77FBAD9F738F7032C6921C51657260C2CF05F3D1358587FC56EAAFA63ED0D2394D2B69FBC6C5B0F34DA7FA6092CC5C318705050C7EB7ED9E158E9599C53B36500027FEDAF2A241C530F7866DB36A0BDFFAEB74504EB0363FC783DE998103C3421172B4C40CC7B01607EB22E47C24D13A0A3BCF0739E38F359813808EF71255E01B90A0AFC619464BEACD0AA8969A2248B2D738B059FBA4643784E67221E6D0C6142A83048D7366E5D3D180ADE9E95A79EDFFDB2B892AB7B3A2F25DE0550EA4B52E9B1C5E2C4F65480B17797F28493C38FD23F3EEA21162E8297B86E49B5283477759DB53E9AD4FD869E7507C60876942968DAA8DF9B7808EC10F7F9C296F862038F8A1E77FF5E3D3A9309DDCF6BBA0660D19B292851FF123712D1E51E9D2F7616A8098D9DF00B0BCEBDD1E15BBFD68CB3C92707E190F7881BB9FCF928F8536F28C7804A00018AFA9BD1937F38BDD65B176BAB441D727C4D3071BDEFC170A84C615F8F53B0D42763519DDB491FF871AE4AC985C9647861FE883E2A0C5B24D02A52A639F8881E095FAF9067F57D4094BE5F2E0F191F7488CD3DD93CA1C5082B6956E6F62DE3061840D3FD8FC3CE5DBEC65E3989AE612D6796FF907F1C6A1891DE2235BB073CDDE9E47588FD4DCF6BBA0660D19B292851FF123712D1E771DF77A062186EDB5F7F030303B19D015BBFD68CB3C92707E190F7881BB9FCF26B2AEC7C1B95C2D2216CC6C134619176DC89CE3D25790BD0BE8E612220D607D52FD79CA26DAB4ECED9EBA35C3126E098FF81ACE1366037AB8D0C81FC87C6AF0C23627B5967B8CBBD27CC6C1A62EEF6DDBAF2F0CCB2CA2609AD9EF3C6EFAFD5416BD7EB16DCE8FC6E2FFBCB0CE080343C8F3E69A6C2C1E7C8FA67429E3B47A24E6CFC8476676A0EE5B9CD485A7752FB9653574640293B018BBEE15D1830C17D52E8401B67BE62F0B075BDDE27A922B45352ADA1D0A0292657CFF5B4E6BD6DAC617813C38D4A65A12C58CDD9FCC6A3953AD27274429EB34EDD58DCB0099E67F1B742EB7053B262155F1FD47E92B089A359E76C4D285AEFD0AF5B3CCD41BF7BA5DFD5CA9E29B212DFCFC02ECFBAA4775EBD5E697934CF243CD211E611FF9C54E2B43A21C8DDAA35E923E92F32CFC0F44A168E26E308F0D5C660DF601CFB6D9A35BBDCC16F5CA67ADF167F35313834A4CC8F7D2FA689C01C71D049E4856B1F10E79B35EBE3139CBED5AB4D1E685596BC92DCABF8DCD54852139AD03C811DF81F8176B417154C47F87EB13B5C783B0A1BEA70C6394F28DBC1C934F098FE167E1DCC7B695746C15E47E9DF2F390EB7ACBACE327EA0DC3E20A2D4E7F657D09E5D3CFAE463CC7CDDF7E38A978D5D5AF35B98C910DC2C79EB3A53B750C417C6C14AE6C16FD611B2A9A8BB91DF3418CE7EB7BA87F8B2C6FD26D1019E39DDF5DA802837457A98C9DEE2B6FB90AF4068DECA8F5E8B2AAF48645760584C602AD3BFAB4BD8369EB0D958EBC89C0FF2C4A73FE1CCAA802370863CD24ECB0A0A4933F2F02B5A707B5FBA9A778391055FC70CE6753DF36C2D62D49C91F62DF6E42DDA7303387E463C2C382A8A1B430A6262BD6C9D9838DA67F3631E7A8EB41E360F0CA190DA43C3AF195727B41AC51DAB4B8E2D6C58D242BF388B7738FC09194DCDDAF1F859558FD973721FB9F6FBFF748650CE4F2D12BCBE241C5AAFD717A20B80F6C5E53D3A5F50B8463A57AC39657B13D410BF975D5D65494648AB8826448E3053038D475CE42F72F27BEF2E36033F12F96AE8F719B1F31CE6AA346AFA23537D743DF5C430E96E8CD1F6CEB50E75174FA04A7AE8948EB89D46FC9BA233BA4AD8B9C57E7B357B06A7ACD29C8AB7D702F7BF18B990FECD15A3BB2AFA7B415EB09A3F48C341BBF7EEDE24B339C8515010E0C4CCAFCFBB2813EFA9A84FC466991FAE52715EC4C26A7E0E0063917E5BCFD96AE966AF846F25EE04CD6174E649CA7B8A52B803D3B4C26A14D4AA544CBE1D12020FF078947879C1B6D553545CEF2BF28C1807EF7216BB6DB3388F97A8DE80A5B921AFAA5D0EF8462A9F6B064E1186D3AC5EB012C28C10FAD0B58CFCAED362E6B9B6C47A7993602876E780F4A08665F65DD3A4C6B7BD24EF38EE86430A80820338ABA932A22AAEFE25D7BE2E2DC0C7D1ABF5055C7F52B63A2D9FAB474CC49C5F886890A9E90C094505635EE7E4F65C1C14B0410D1A14527679F0C88C11ED4EB528C3C7930B1D093F43CE6E5562A14F5CF151174AE14B98E90D2A8115BDA20174856B71406C627492190E8F8CB8346D5796C0BE39A19396A62521F19A76A36C0D7A0816AD5ED717B33EB742904C1E980BD425B3C936B3AAC9BF0FEC84369C8EB3ABF1072FF63AF5E6E8CADD00F0336624AFB714ACD524C0594F3080ABBE44F197BC6AC77542D4FF7EB10092227615640A3C03258794D96936AAA34CF32394EF04E29EDCCE2186081421BF595FAD4E7BC9725F4E9789C09E067C8C6F2F0C80F13FE43764CC3EE9A0D813F4107CE388CD20CB76298693F6D4D6CE65BBA32DF9B80F6FD32B8D53975A2B20C96151C63EEFE7EE3458E32942DE4FC775C3AE4BCF7AF90BD6028E5AA9BDAE803DB6C023589F664903EB889A8EF1BF27EEF271DAEEA0E398F68AF5078A9D33162503D240DBD16A8A8A7EE078D612857938A53E91DED56EBD9DC0E757F88FB48DEA48FF701406004461A9AB5125F189D882349F70774ACCB4D45D9DDD20329E4D856A77A5E644D73AA92585D2E286F41227B95AD050278E206477617DCE3DABBD72B81621D2BF3B8B44BC6FC55C99DBC610FD4630B9E868455ED5E69CCF18F48E90C6B2E613A06651769D0BB31A879A38C12A85138834043C6545A85A8E8317ACC7EBCC0BE492D7D6028E1BFD2BDBD1D515142FFA9B9BE42507DDF8CB202A2B9B6E8E13A61D11A13ED54326F73CE6A28BF1803B4E9758B07D19D9D30F3BFDEEEB79DD51B4D2C7A4D3C4187E8D402AF3B5F103411F992722B213362FA7A07619FC7A296EEA585382D1082C52E5C4EC703F3997DDB14745DAB7CBD9EEEFB4D0CE5F01FABDDFC31A9B0F0D7A8B2C791807440786E6D7E9A94EE6D67FCC70F40DCCBFEFB12951986159254BB422F86A54A5889BF871043222858E51CA4E41A8EC4487F5D41077DCB856E73B9410075D761E6613074AF1E00A9DFA7DB9146DB9C4833730800976C3AF55DCC50E70D52FDBDF082BE30BDA4AFF91F4FEF12C926BBA928B4F44E7206F2A604A80D25F49AA6D231FB0694AEF6DB4ACC8A6CC9B969581431CCE458B660F205CA117682050494324AE3EB758049F8EECF4A3073FB8FFEDF54C2420ADA9520BDC946112A64908D4A072394371341A42DFED1CCC2BB2BF55AD6138325F46FE8B8B61ABA0A7AB2679E3BBEE7CEB18E93FD5AD0710AD9B63548F268DE94E7A32D5BAF57F8E9AAD87017AB398FAF8CFEF856C4F376DB77B30F1E79E7E4F1D08DC72F0ADC6B8D79F7E1A9F262226758EBFF31E1011E02A1D3374B2C85DFD6D28A28984A84CAB3B36C07D589D48A1E59E0C0D4AE81B58EFD6C13D741A10F91D2FF77F33ADCE2653D96CE25A95C8340C1766D78E4A951C833D0F1F1C0C037248262EB18F4942D8F0EA40AB94A409C0854B3F8C078EAFA7E7DD6C2F4539B9076B150FBB4D8DE7D6E6D8AF0EA0AC821B1BFA57677FD1A2DB02AC05A1B306459D775DD67DA3EE957C3740B6F777D198B88A27CE86CB795FD742350A7F39F5FE058B3A382D1B8FE121EF236415EFFDEB739B19A6EF285262C1F0C845C9A7B1FADABA3E2E87AE3175A1C610FFDCAA148B32D726D741F7DBB8AC0D0E4D8BCDA02F6F44F1A2171999237D22EBD42977D2C4CF4E1C8069E7E7056B7A9157AEF4E0A3AA6B2673054ED50D7ABAE5D0052D08DEA4E7BC834DC440F3E5F2939DE72BEA396D9F4EDF8D588208271EF89199E28A74BEFBCEA0C66825FD6AD76A88D302E6C9716EA883101DC8CFE5AACE738A6C1F33B633C5E1869F7CCD3A26218965E407F661E3B589A2633F83EF46BCFA25785252710C7877DD8B93C9D0A28F1468AD3AF67C98FD20820AEFDF1842CA880390F22C7389D6676D77EF34203F024C4DFB539320869FD1B6214A697C5E9378B7E63B6F38A7D55CD9F5B5139A7B79AB6F3435DC2D7B432C3C325D604019E22CC16FCC52AE6E5C5784212309D5935C1DBC11B2BB22AAF7855B87131A2BD4FEDD6C921474CC89CDFCE7A8C91A8D49E7F892A78223E796A39C5132093A66BCD222E74B48CAD76A4A00551B6C5E1B3E9BDA986ABE914CDE65ED34389D4F601F73137A91F37EAFD91DA4F8BFD398ECFD423A930058CAF529D3BC7320EB6B6F7E18CF15C44986BA1CFDEE84049BAB3C1BC74851BD \ No newline at end of file diff --git "a/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" "b/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" new file mode 100644 index 00000000..754e204f --- /dev/null +++ "b/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" @@ -0,0 +1,356 @@ +/** + * 优酷视频 - 猫影视/TVBox JS爬虫格式 + * 调用壳子超级解析功能(壳子会自动读取json配置) + @header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '酷酷[官]', + lang: 'cat' + }) + */ + +class Spider extends BaseSpider { + + constructor() { + super(); + this.host = 'https://www.youku.com'; + this.sessionStore = {}; + + this.headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Referer': 'https://www.youku.com', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Accept-Encoding': 'gzip, deflate, br', + 'Connection': 'keep-alive' + }; + } + + init(extend = '') { + return ''; + } + + getName() { + return '优酷视频'; + } + + isVideoFormat(url) { + return true; + } + + manualVideoCheck() { + return false; + } + + destroy() { + // 清理资源 + } + + homeContent(filter) { + const categories = '电视剧&电影&综艺&动漫&少儿&纪录片&文化&亲子&教育&搞笑&生活&体育&音乐&游戏'.split('&'); + + const result = { + class: categories.map(name => ({ + type_id: name, + type_name: name + })) + }; + + return result; + } + + homeVideoContent() { + return {list: []}; + } + + async categoryContent(tid, pg, filter, extend) { + try { + const page = parseInt(pg) || 1; + let filterObj = {}; + + if (extend && typeof extend === 'object') { + filterObj = extend; + } + + filterObj.type = tid; + const paramsStr = JSON.stringify(filterObj); + + let url = `https://www.youku.com/category/data?optionRefresh=1&pageNo=${page}¶ms=${encodeURIComponent(paramsStr)}`; + + // 处理session + if (page > 1 && this.sessionStore[tid]) { + url = url.replace("optionRefresh=1", `session=${encodeURIComponent(this.sessionStore[tid])}`); + } + + const response = await this.fetch(url, {}, this.headers); + const resData = response.data; + + if (resData.data && resData.data.filterData && resData.data.filterData.session) { + this.sessionStore[tid] = JSON.stringify(resData.data.filterData.session); + } + + const videos = []; + if (resData.data && resData.data.filterData && Array.isArray(resData.data.filterData.listData)) { + const lists = resData.data.filterData.listData; + for (const it of lists) { + let vid = ""; + if (it.videoLink && it.videoLink.includes("id_")) { + vid = it.videoLink.split("id_")[1].split(".html")[0]; + } else { + vid = "msearch:" + it.title; + } + + videos.push({ + vod_id: vid, + vod_name: it.title || '', + vod_pic: it.img || '', + vod_remarks: it.summary || '', + vod_content: it.subTitle || '' + }); + } + } + + return { + list: videos, + page: page, + pagecount: 9999, + limit: 20, + total: 999999 + }; + + } catch (error) { + console.error(`categoryContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + safeFixYoukuInitialData(rawStr) { + if (!rawStr) return '{}'; + let s = rawStr + .replace(/^[\s\S]*?window\.__INITIAL_DATA__\s*[=:]\s*/, '') + .replace(/;[\s\S]*$/, '') + .replace(/\.{3,}[\s\S]*$/, '') + .replace(/,\s*$/, '') + .trim(); + + if (!s || s.length < 2 || !/^\{/.test(s)) { + return '{}'; + } + + let open = 0, close = 0; + for (let char of s) { + if (char === '{') open++; + if (char === '}') close++; + } + + if (open > close) { + s += '}'.repeat(open - close); + } + if (!s.startsWith('{')) { + s = '{' + s; + } + if (!s.endsWith('}')) { + s += '}'; + } + + return s; + } + + getSafe(obj, path, defaultValue = '') { + if (!obj || typeof obj !== 'object') return defaultValue; + try { + return path.split('.').reduce((o, key) => { + if (o == null) return defaultValue; + return o[key]; + }, obj) ?? defaultValue; + } catch { + return defaultValue; + } + } + + async detailContent(ids) { + try { + const id = ids[0]; + + // 获取剧集列表 + const apiUrl = `https://search.youku.com/api/search?appScene=show_episode&showIds=${id}`; + const apiResponse = await this.fetch(apiUrl, {}, this.headers); + const jsonData = apiResponse.data; + const videoLists = jsonData.serisesList || []; + + // 构建播放列表 + const playUrls = []; + if (videoLists.length > 0) { + for (const item of videoLists) { + const title = item.showVideoStage?.replace("期", "集") || + item.displayName || + item.title || + `第${item.index || '?'}集`; + const url = `https://v.youku.com/v_show/id_${item.videoId}.html`; + playUrls.push(`${title}$${url}`); + } + } + + // 获取详情信息 + let detailInfo = { + title: '', + cover: '', + category: '', + remarks: '', + desc: '' + }; + + try { + const detailUrl = `https://v.youku.com/v_show/id_${id}.html`; + const htmlResponse = await this.fetch(detailUrl, { + headers: { + ...this.headers, + 'Referer': 'https://v.youku.com/' + } + }); + const html = htmlResponse.data; + + // 检查是否触发人机验证 + if (html.includes("人机验证") || html.includes("captcha") || html.includes("verify")) { + detailInfo.desc = "触发优酷人机验证,建议在浏览器中访问优酷官网解除限制后再重试"; + } else if (html.includes("window.__INITIAL_DATA__ =")) { + let dataStr = html.split("window.__INITIAL_DATA__ =")[1]?.split(";")?.[0]?.trim() || '{}'; + dataStr = this.safeFixYoukuInitialData(dataStr); + + try { + const detailJson = JSON.parse(dataStr); + const item = this.getSafe(detailJson, 'moduleList.0.components.0.itemList.0', {}); + const extra = this.getSafe(detailJson, 'pageMap.extra', {}); + + detailInfo.title = item.introTitle || extra.showName || videoLists[0]?.title || ''; + detailInfo.cover = item.showImgV || extra.showImgV || extra.showImg || ''; + detailInfo.category = item.showGenre || extra.videoCategory || ''; + detailInfo.remarks = item.introSubTitle || extra.showSubtitle || item.mark?.text || ''; + } catch (parseErr) { + console.error(`JSON解析失败: ${parseErr.message}`); + } + } else { + detailInfo.title = videoLists[0]?.title?.split(" ")[0] || ''; + } + } catch (detailError) { + console.error(`获取详情失败: ${detailError.message}`); + } + + const vod = { + vod_id: id, + vod_name: detailInfo.title || videoLists[0]?.title || '未知标题', + type_name: detailInfo.category || '', + vod_year: '', + vod_remarks: detailInfo.remarks || '', + vod_content: detailInfo.desc || (detailInfo.remarks ? `简介: ${detailInfo.remarks}` : '暂无简介'), + vod_play_from: playUrls.length > 0 ? '优酷视频' : '', + vod_play_url: playUrls.length > 0 ? playUrls.join('#') : '' + }; + + return {list: [vod]}; + + } catch (error) { + console.error(`detailContent error: ${error.message}`); + return {list: []}; + } + } + + async searchContent(key, quick, pg = '1') { + try { + const page = parseInt(pg) || 1; + const url = `https://search.youku.com/api/search?pg=${page}&keyword=${encodeURIComponent(key)}`; + + const response = await this.fetch(url, {}, this.headers); + const data = response.data; + + const videos = []; + + if (data && Array.isArray(data.pageComponentList)) { + for (const item of data.pageComponentList) { + if (item.commonData) { + const common = item.commonData; + let vid = common.showId || ''; + + if (!vid && common.titleDTO && common.titleDTO.displayName) { + vid = `msearch:${common.titleDTO.displayName}`; + } + + videos.push({ + vod_id: vid, + vod_name: common.titleDTO?.displayName || '', + vod_pic: common.posterDTO?.vThumbUrl || '', + vod_remarks: common.stripeBottom || '', + vod_content: common.updateNotice || '' + }); + } + } + } + + return { + list: videos, + page: page, + pagecount: 9999, + limit: 20, + total: 999999 + }; + + } catch (error) { + console.error(`searchContent error: ${error.message}`); + return { + list: [], + page: pg, + pagecount: 0, + limit: 20, + total: 0 + }; + } + } + + async playerContent(flag, id, vipFlags) { + try { + // 关键:调用壳子超级解析 + // 壳子会自动读取json配置中的解析规则 + const playData = { + parse: 1, // 必须为1,表示需要解析 + jx: 1, // 必须为1,启用解析 + play_parse: true, // 启用播放解析 + parse_type: '壳子超级解析', + parse_source: '优酷视频', + url: id, // 原始优酷链接 + header: JSON.stringify({ + 'User-Agent': this.headers['User-Agent'], + 'Referer': 'https://www.youku.com', + 'Origin': 'https://www.youku.com' + }) + }; + + return playData; + + } catch (error) { + console.error(`playerContent error: ${error.message}`); + // 即使出错也返回超级解析参数,让壳子处理 + return { + parse: 1, + jx: 1, + play_parse: true, + parse_type: '壳子超级解析', + parse_source: '优酷视频', + url: id, + header: JSON.stringify(this.headers) + }; + } + } + + localProxy(param) { + return null; + } +} + +export default new Spider(); \ No newline at end of file diff --git "a/spider/catvod/\351\237\251\345\211\247\347\275\221.js" "b/spider/catvod/\351\237\251\345\211\247\347\275\221.js" deleted file mode 100755 index e09b7dcd..00000000 --- "a/spider/catvod/\351\237\251\345\211\247\347\275\221.js" +++ /dev/null @@ -1,124 +0,0 @@ -/* -@header({ - searchable: 1, - filterable: 1, - quickSearch: 1, - title: '韩剧网', - lang: 'cat' -}) -*/ - -let host = 'https://hanju51.com'; -let headers = { - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", - "Referer": host + "/" -}; - -function extractVideos(html, limit = 0) { - let videos = []; - let liPattern = /
  • ([^<]+)<\/a>/) || [])[1] || ""; - let vod_pic = (item.match(/data-original="([^"]+)"/) || [])[1] || ""; - let vod_remarks = (item.match(/\s*]*>\.\.\.<\/a>/)?.[1] ? parseInt(html.match(/\/(\d+)\/<\/a>\s*]*>\.\.\.<\/a>/)[1]) : 999; - - return JSON.stringify({ list, page: parseInt(pg || 1), pagecount, limit: 20 }); -} - -async function detail(id) { - let html = (await req(`${host}/voddetail/${id}/`, { headers })).content || ''; - if (!html) return JSON.stringify({ list: [] }); - - // 提取线路名称 - let sources = [...html.matchAll(/]*class="fed-tabs-btn[^"]*"[^>]*>([^<]+)<\/a>/g)].map(m => m[1].trim()); - // 提取对应的集数区块 - let blocks = [...html.matchAll(/