diff --git a/index.js b/index.js
index 30fec60c00..0f9b4ac7f4 100644
--- a/index.js
+++ b/index.js
@@ -1,626 +1 @@
-const express = require("express");
-const app = express();
-const axios = require("axios");
-const os = require('os');
-const fs = require("fs");
-const path = require("path");
-const { promisify } = require('util');
-const exec = promisify(require('child_process').exec);
-const UPLOAD_URL = process.env.UPLOAD_URL || ''; // 节点或订阅自动上传地址,需填写部署Merge-sub项目后的首页地址,例如:https://merge.xxx.com
-const PROJECT_URL = process.env.PROJECT_URL || ''; // 需要上传订阅或保活时需填写项目分配的url,例如:https://google.com
-const AUTO_ACCESS = process.env.AUTO_ACCESS || false; // false关闭自动保活,true开启,需同时填写PROJECT_URL变量
-const FILE_PATH = process.env.FILE_PATH || '.tmp'; // 运行目录,sub节点文件保存目录
-const SUB_PATH = process.env.SUB_PATH || 'sub'; // 订阅路径
-const PORT = process.env.SERVER_PORT || process.env.PORT || 3000; // http服务订阅端口
-const UUID = process.env.UUID || '9afd1229-b893-40c1-84dd-51e7ce204913'; // 使用哪吒v1,在不同的平台运行需修改UUID,否则会覆盖
-const NEZHA_SERVER = process.env.NEZHA_SERVER || ''; // 哪吒v1填写形式: nz.abc.com:8008 哪吒v0填写形式:nz.abc.com
-const NEZHA_PORT = process.env.NEZHA_PORT || ''; // 使用哪吒v1请留空,哪吒v0需填写
-const NEZHA_KEY = process.env.NEZHA_KEY || ''; // 哪吒v1的NZ_CLIENT_SECRET或哪吒v0的agent密钥
-const ARGO_DOMAIN = process.env.ARGO_DOMAIN || ''; // 固定隧道域名,留空即启用临时隧道
-const ARGO_AUTH = process.env.ARGO_AUTH || ''; // 固定隧道密钥json或token,留空即启用临时隧道,json获取地址:https://json.zone.id
-const ARGO_PORT = process.env.ARGO_PORT || 8001; // 固定隧道端口,使用token需在cloudflare后台设置和这里一致
-const CFIP = process.env.CFIP || 'saas.sin.fan'; // 节点优选域名或优选ip
-const CFPORT = process.env.CFPORT || 443; // 节点优选域名或优选ip对应的端口
-const NAME = process.env.NAME || ''; // 节点名称
-
-// 创建运行文件夹
-if (!fs.existsSync(FILE_PATH)) {
- fs.mkdirSync(FILE_PATH);
- console.log(`${FILE_PATH} is created`);
-} else {
- console.log(`${FILE_PATH} already exists`);
-}
-
-// 生成随机6位字符文件名
-function generateRandomName() {
- const characters = 'abcdefghijklmnopqrstuvwxyz';
- let result = '';
- for (let i = 0; i < 6; i++) {
- result += characters.charAt(Math.floor(Math.random() * characters.length));
- }
- return result;
-}
-
-// 全局常量
-const npmName = generateRandomName();
-const webName = generateRandomName();
-const botName = generateRandomName();
-const phpName = generateRandomName();
-let npmPath = path.join(FILE_PATH, npmName);
-let phpPath = path.join(FILE_PATH, phpName);
-let webPath = path.join(FILE_PATH, webName);
-let botPath = path.join(FILE_PATH, botName);
-let subPath = path.join(FILE_PATH, 'sub.txt');
-let listPath = path.join(FILE_PATH, 'list.txt');
-let bootLogPath = path.join(FILE_PATH, 'boot.log');
-let configPath = path.join(FILE_PATH, 'config.json');
-
-// 如果订阅器上存在历史运行节点则先删除
-function deleteNodes() {
- try {
- if (!UPLOAD_URL) return;
- if (!fs.existsSync(subPath)) return;
-
- let fileContent;
- try {
- fileContent = fs.readFileSync(subPath, 'utf-8');
- } catch {
- return null;
- }
-
- const decoded = Buffer.from(fileContent, 'base64').toString('utf-8');
- const nodes = decoded.split('\n').filter(line =>
- /(vless|vmess|trojan|hysteria2|tuic):\/\//.test(line)
- );
-
- if (nodes.length === 0) return;
-
- axios.post(`${UPLOAD_URL}/api/delete-nodes`,
- JSON.stringify({ nodes }),
- { headers: { 'Content-Type': 'application/json' } }
- ).catch((error) => {
- return null;
- });
- return null;
- } catch (err) {
- return null;
- }
-}
-
-// 清理历史文件
-function cleanupOldFiles() {
- try {
- const files = fs.readdirSync(FILE_PATH);
- files.forEach(file => {
- const filePath = path.join(FILE_PATH, file);
- try {
- const stat = fs.statSync(filePath);
- if (stat.isFile()) {
- fs.unlinkSync(filePath);
- }
- } catch (err) {
- // 忽略所有错误,不记录日志
- }
- });
- } catch (err) {
- // 忽略所有错误,不记录日志
- }
-}
-
-// 生成xr-ay配置文件
-async function generateConfig() {
- const config = {
- log: { access: '/dev/null', error: '/dev/null', loglevel: 'none' },
- inbounds: [
- { port: ARGO_PORT, protocol: 'vless', settings: { clients: [{ id: UUID, flow: 'xtls-rprx-vision' }], decryption: 'none', fallbacks: [{ dest: 3001 }, { path: "/vless-argo", dest: 3002 }, { path: "/vmess-argo", dest: 3003 }, { path: "/trojan-argo", dest: 3004 }] }, streamSettings: { network: 'tcp' } },
- { port: 3001, listen: "127.0.0.1", protocol: "vless", settings: { clients: [{ id: UUID }], decryption: "none" }, streamSettings: { network: "tcp", security: "none" } },
- { port: 3002, listen: "127.0.0.1", protocol: "vless", settings: { clients: [{ id: UUID, level: 0 }], decryption: "none" }, streamSettings: { network: "ws", security: "none", wsSettings: { path: "/vless-argo" } }, sniffing: { enabled: true, destOverride: ["http", "tls", "quic"], metadataOnly: false } },
- { port: 3003, listen: "127.0.0.1", protocol: "vmess", settings: { clients: [{ id: UUID, alterId: 0 }] }, streamSettings: { network: "ws", wsSettings: { path: "/vmess-argo" } }, sniffing: { enabled: true, destOverride: ["http", "tls", "quic"], metadataOnly: false } },
- { port: 3004, listen: "127.0.0.1", protocol: "trojan", settings: { clients: [{ password: UUID }] }, streamSettings: { network: "ws", security: "none", wsSettings: { path: "/trojan-argo" } }, sniffing: { enabled: true, destOverride: ["http", "tls", "quic"], metadataOnly: false } },
- ],
- dns: { servers: ["https+local://8.8.8.8/dns-query"] },
- outbounds: [ { protocol: "freedom", tag: "direct" }, {protocol: "blackhole", tag: "block"} ]
- };
- fs.writeFileSync(path.join(FILE_PATH, 'config.json'), JSON.stringify(config, null, 2));
-}
-
-// 判断系统架构
-function getSystemArchitecture() {
- const arch = os.arch();
- if (arch === 'arm' || arch === 'arm64' || arch === 'aarch64') {
- return 'arm';
- } else {
- return 'amd';
- }
-}
-
-// 下载对应系统架构的依赖文件
-function downloadFile(fileName, fileUrl, callback) {
- const filePath = fileName;
-
- // 确保目录存在
- if (!fs.existsSync(FILE_PATH)) {
- fs.mkdirSync(FILE_PATH, { recursive: true });
- }
-
- const writer = fs.createWriteStream(filePath);
-
- axios({
- method: 'get',
- url: fileUrl,
- responseType: 'stream',
- })
- .then(response => {
- response.data.pipe(writer);
-
- writer.on('finish', () => {
- writer.close();
- console.log(`Download ${path.basename(filePath)} successfully`);
- callback(null, filePath);
- });
-
- writer.on('error', err => {
- fs.unlink(filePath, () => { });
- const errorMessage = `Download ${path.basename(filePath)} failed: ${err.message}`;
- console.error(errorMessage); // 下载失败时输出错误消息
- callback(errorMessage);
- });
- })
- .catch(err => {
- const errorMessage = `Download ${path.basename(filePath)} failed: ${err.message}`;
- console.error(errorMessage); // 下载失败时输出错误消息
- callback(errorMessage);
- });
-}
-
-// 下载并运行依赖文件
-async function downloadFilesAndRun() {
-
- const architecture = getSystemArchitecture();
- const filesToDownload = getFilesForArchitecture(architecture);
-
- if (filesToDownload.length === 0) {
- console.log(`Can't find a file for the current architecture`);
- return;
- }
-
- const downloadPromises = filesToDownload.map(fileInfo => {
- return new Promise((resolve, reject) => {
- downloadFile(fileInfo.fileName, fileInfo.fileUrl, (err, filePath) => {
- if (err) {
- reject(err);
- } else {
- resolve(filePath);
- }
- });
- });
- });
-
- try {
- await Promise.all(downloadPromises);
- } catch (err) {
- console.error('Error downloading files:', err);
- return;
- }
- // 授权和运行
- function authorizeFiles(filePaths) {
- const newPermissions = 0o775;
- filePaths.forEach(absoluteFilePath => {
- if (fs.existsSync(absoluteFilePath)) {
- fs.chmod(absoluteFilePath, newPermissions, (err) => {
- if (err) {
- console.error(`Empowerment failed for ${absoluteFilePath}: ${err}`);
- } else {
- console.log(`Empowerment success for ${absoluteFilePath}: ${newPermissions.toString(8)}`);
- }
- });
- }
- });
- }
- const filesToAuthorize = NEZHA_PORT ? [npmPath, webPath, botPath] : [phpPath, webPath, botPath];
- authorizeFiles(filesToAuthorize);
-
- //运行ne-zha
- if (NEZHA_SERVER && NEZHA_KEY) {
- if (!NEZHA_PORT) {
- // 检测哪吒是否开启TLS
- const port = NEZHA_SERVER.includes(':') ? NEZHA_SERVER.split(':').pop() : '';
- const tlsPorts = new Set(['443', '8443', '2096', '2087', '2083', '2053']);
- const nezhatls = tlsPorts.has(port) ? 'true' : 'false';
- // 生成 config.yaml
- const configYaml = `
-client_secret: ${NEZHA_KEY}
-debug: false
-disable_auto_update: true
-disable_command_execute: false
-disable_force_update: true
-disable_nat: false
-disable_send_query: false
-gpu: false
-insecure_tls: true
-ip_report_period: 1800
-report_delay: 4
-server: ${NEZHA_SERVER}
-skip_connection_count: true
-skip_procs_count: true
-temperature: false
-tls: ${nezhatls}
-use_gitee_to_upgrade: false
-use_ipv6_country_code: false
-uuid: ${UUID}`;
-
- fs.writeFileSync(path.join(FILE_PATH, 'config.yaml'), configYaml);
-
- // 运行 v1
- const command = `nohup ${phpPath} -c "${FILE_PATH}/config.yaml" >/dev/null 2>&1 &`;
- try {
- await exec(command);
- console.log(`${phpName} is running`);
- await new Promise((resolve) => setTimeout(resolve, 1000));
- } catch (error) {
- console.error(`php running error: ${error}`);
- }
- } else {
- let NEZHA_TLS = '';
- const tlsPorts = ['443', '8443', '2096', '2087', '2083', '2053'];
- if (tlsPorts.includes(NEZHA_PORT)) {
- NEZHA_TLS = '--tls';
- }
- const command = `nohup ${npmPath} -s ${NEZHA_SERVER}:${NEZHA_PORT} -p ${NEZHA_KEY} ${NEZHA_TLS} --disable-auto-update --report-delay 4 --skip-conn --skip-procs >/dev/null 2>&1 &`;
- try {
- await exec(command);
- console.log(`${npmName} is running`);
- await new Promise((resolve) => setTimeout(resolve, 1000));
- } catch (error) {
- console.error(`npm running error: ${error}`);
- }
- }
- } else {
- console.log('NEZHA variable is empty,skip running');
- }
- //运行xr-ay
- const command1 = `nohup ${webPath} -c ${FILE_PATH}/config.json >/dev/null 2>&1 &`;
- try {
- await exec(command1);
- console.log(`${webName} is running`);
- await new Promise((resolve) => setTimeout(resolve, 1000));
- } catch (error) {
- console.error(`web running error: ${error}`);
- }
-
- // 运行cloud-fared
- if (fs.existsSync(botPath)) {
- let args;
-
- if (ARGO_AUTH.match(/^[A-Z0-9a-z=]{120,250}$/)) {
- args = `tunnel --edge-ip-version auto --no-autoupdate --protocol http2 run --token ${ARGO_AUTH}`;
- } else if (ARGO_AUTH.match(/TunnelSecret/)) {
- args = `tunnel --edge-ip-version auto --config ${FILE_PATH}/tunnel.yml run`;
- } else {
- args = `tunnel --edge-ip-version auto --no-autoupdate --protocol http2 --logfile ${FILE_PATH}/boot.log --loglevel info --url http://localhost:${ARGO_PORT}`;
- }
-
- try {
- await exec(`nohup ${botPath} ${args} >/dev/null 2>&1 &`);
- console.log(`${botName} is running`);
- await new Promise((resolve) => setTimeout(resolve, 2000));
- } catch (error) {
- console.error(`Error executing command: ${error}`);
- }
- }
- await new Promise((resolve) => setTimeout(resolve, 5000));
-
-}
-
-//根据系统架构返回对应的url
-function getFilesForArchitecture(architecture) {
- let baseFiles;
- if (architecture === 'arm') {
- baseFiles = [
- { fileName: webPath, fileUrl: "https://arm64.ssss.nyc.mn/web" },
- { fileName: botPath, fileUrl: "https://arm64.ssss.nyc.mn/bot" }
- ];
- } else {
- baseFiles = [
- { fileName: webPath, fileUrl: "https://amd64.ssss.nyc.mn/web" },
- { fileName: botPath, fileUrl: "https://amd64.ssss.nyc.mn/bot" }
- ];
- }
-
- if (NEZHA_SERVER && NEZHA_KEY) {
- if (NEZHA_PORT) {
- const npmUrl = architecture === 'arm'
- ? "https://arm64.ssss.nyc.mn/agent"
- : "https://amd64.ssss.nyc.mn/agent";
- baseFiles.unshift({
- fileName: npmPath,
- fileUrl: npmUrl
- });
- } else {
- const phpUrl = architecture === 'arm'
- ? "https://arm64.ssss.nyc.mn/v1"
- : "https://amd64.ssss.nyc.mn/v1";
- baseFiles.unshift({
- fileName: phpPath,
- fileUrl: phpUrl
- });
- }
- }
-
- return baseFiles;
-}
-
-// 获取固定隧道json
-function argoType() {
- if (!ARGO_AUTH || !ARGO_DOMAIN) {
- console.log("ARGO_DOMAIN or ARGO_AUTH variable is empty, use quick tunnels");
- return;
- }
-
- if (ARGO_AUTH.includes('TunnelSecret')) {
- fs.writeFileSync(path.join(FILE_PATH, 'tunnel.json'), ARGO_AUTH);
- const tunnelYaml = `
- tunnel: ${ARGO_AUTH.split('"')[11]}
- credentials-file: ${path.join(FILE_PATH, 'tunnel.json')}
- protocol: http2
-
- ingress:
- - hostname: ${ARGO_DOMAIN}
- service: http://localhost:${ARGO_PORT}
- originRequest:
- noTLSVerify: true
- - service: http_status:404
- `;
- fs.writeFileSync(path.join(FILE_PATH, 'tunnel.yml'), tunnelYaml);
- } else {
- console.log("ARGO_AUTH mismatch TunnelSecret,use token connect to tunnel");
- }
-}
-
-// 获取临时隧道domain
-async function extractDomains() {
- let argoDomain;
-
- if (ARGO_AUTH && ARGO_DOMAIN) {
- argoDomain = ARGO_DOMAIN;
- console.log('ARGO_DOMAIN:', argoDomain);
- await generateLinks(argoDomain);
- } else {
- try {
- const fileContent = fs.readFileSync(path.join(FILE_PATH, 'boot.log'), 'utf-8');
- const lines = fileContent.split('\n');
- const argoDomains = [];
- lines.forEach((line) => {
- const domainMatch = line.match(/https?:\/\/([^ ]*trycloudflare\.com)\/?/);
- if (domainMatch) {
- const domain = domainMatch[1];
- argoDomains.push(domain);
- }
- });
-
- if (argoDomains.length > 0) {
- argoDomain = argoDomains[0];
- console.log('ArgoDomain:', argoDomain);
- await generateLinks(argoDomain);
- } else {
- console.log('ArgoDomain not found, re-running bot to obtain ArgoDomain');
- // 删除 boot.log 文件,等待 2s 重新运行 server 以获取 ArgoDomain
- fs.unlinkSync(path.join(FILE_PATH, 'boot.log'));
- async function killBotProcess() {
- try {
- if (process.platform === 'win32') {
- await exec(`taskkill /f /im ${botName}.exe > nul 2>&1`);
- } else {
- await exec(`pkill -f "[${botName.charAt(0)}]${botName.substring(1)}" > /dev/null 2>&1`);
- }
- } catch (error) {
- // 忽略输出
- }
- }
- killBotProcess();
- await new Promise((resolve) => setTimeout(resolve, 3000));
- const args = `tunnel --edge-ip-version auto --no-autoupdate --protocol http2 --logfile ${FILE_PATH}/boot.log --loglevel info --url http://localhost:${ARGO_PORT}`;
- try {
- await exec(`nohup ${botPath} ${args} >/dev/null 2>&1 &`);
- console.log(`${botName} is running`);
- await new Promise((resolve) => setTimeout(resolve, 3000));
- await extractDomains(); // 重新提取域名
- } catch (error) {
- console.error(`Error executing command: ${error}`);
- }
- }
- } catch (error) {
- console.error('Error reading boot.log:', error);
- }
-}
-
-// 获取isp信息
-async function getMetaInfo() {
- try {
- const response1 = await axios.get('https://api.ip.sb/geoip', { headers: { 'User-Agent': 'Mozilla/5.0', timeout: 3000 }});
- if (response1.data && response1.data.country_code && response1.data.isp) {
- return `${response1.data.country_code}-${response1.data.isp}`.replace(/\s+/g, '_');
- }
- } catch (error) {
- try {
- // 备用 ip-api.com 获取isp
- const response2 = await axios.get('http://ip-api.com/json', { headers: { 'User-Agent': 'Mozilla/5.0', timeout: 3000 }});
- if (response2.data && response2.data.status === 'success' && response2.data.countryCode && response2.data.org) {
- return `${response2.data.countryCode}-${response2.data.org}`.replace(/\s+/g, '_');
- }
- } catch (error) {
- // console.error('Backup API also failed');
- }
- }
- return 'Unknown';
-}
-// 生成 list 和 sub 信息
-async function generateLinks(argoDomain) {
- const ISP = await getMetaInfo();
- const nodeName = NAME ? `${NAME}-${ISP}` : ISP;
- return new Promise((resolve) => {
- setTimeout(() => {
- const VMESS = { v: '2', ps: `${nodeName}`, add: CFIP, port: CFPORT, id: UUID, aid: '0', scy: 'auto', net: 'ws', type: 'none', host: argoDomain, path: '/vmess-argo?ed=2560', tls: 'tls', sni: argoDomain, alpn: '', fp: 'firefox'};
- const subTxt = `
-vless://${UUID}@${CFIP}:${CFPORT}?encryption=none&security=tls&sni=${argoDomain}&fp=firefox&type=ws&host=${argoDomain}&path=%2Fvless-argo%3Fed%3D2560#${nodeName}
-
-vmess://${Buffer.from(JSON.stringify(VMESS)).toString('base64')}
-
-trojan://${UUID}@${CFIP}:${CFPORT}?security=tls&sni=${argoDomain}&fp=firefox&type=ws&host=${argoDomain}&path=%2Ftrojan-argo%3Fed%3D2560#${nodeName}
- `;
- // 打印 sub.txt 内容到控制台
- console.log(Buffer.from(subTxt).toString('base64'));
- fs.writeFileSync(subPath, Buffer.from(subTxt).toString('base64'));
- console.log(`${FILE_PATH}/sub.txt saved successfully`);
- uploadNodes();
- // 将内容进行 base64 编码并写入 SUB_PATH 路由
- app.get(`/${SUB_PATH}`, (req, res) => {
- const encodedContent = Buffer.from(subTxt).toString('base64');
- res.set('Content-Type', 'text/plain; charset=utf-8');
- res.send(encodedContent);
- });
- resolve(subTxt);
- }, 2000);
- });
- }
-}
-
-// 自动上传节点或订阅
-async function uploadNodes() {
- if (UPLOAD_URL && PROJECT_URL) {
- const subscriptionUrl = `${PROJECT_URL}/${SUB_PATH}`;
- const jsonData = {
- subscription: [subscriptionUrl]
- };
- try {
- const response = await axios.post(`${UPLOAD_URL}/api/add-subscriptions`, jsonData, {
- headers: {
- 'Content-Type': 'application/json'
- }
- });
-
- if (response && response.status === 200) {
- console.log('Subscription uploaded successfully');
- return response;
- } else {
- return null;
- // console.log('Unknown response status');
- }
- } catch (error) {
- if (error.response) {
- if (error.response.status === 400) {
- // console.error('Subscription already exists');
- }
- }
- }
- } else if (UPLOAD_URL) {
- if (!fs.existsSync(listPath)) return;
- const content = fs.readFileSync(listPath, 'utf-8');
- const nodes = content.split('\n').filter(line => /(vless|vmess|trojan|hysteria2|tuic):\/\//.test(line));
-
- if (nodes.length === 0) return;
-
- const jsonData = JSON.stringify({ nodes });
-
- try {
- const response = await axios.post(`${UPLOAD_URL}/api/add-nodes`, jsonData, {
- headers: { 'Content-Type': 'application/json' }
- });
- if (response && response.status === 200) {
- console.log('Nodes uploaded successfully');
- return response;
- } else {
- return null;
- }
- } catch (error) {
- return null;
- }
- } else {
- // console.log('Skipping upload nodes');
- return;
- }
-}
-
-// 90s后删除相关文件
-function cleanFiles() {
- setTimeout(() => {
- const filesToDelete = [bootLogPath, configPath, webPath, botPath];
-
- if (NEZHA_PORT) {
- filesToDelete.push(npmPath);
- } else if (NEZHA_SERVER && NEZHA_KEY) {
- filesToDelete.push(phpPath);
- }
-
- // Windows系统使用不同的删除命令
- if (process.platform === 'win32') {
- exec(`del /f /q ${filesToDelete.join(' ')} > nul 2>&1`, (error) => {
- console.clear();
- console.log('App is running');
- console.log('Thank you for using this script, enjoy!');
- });
- } else {
- exec(`rm -rf ${filesToDelete.join(' ')} >/dev/null 2>&1`, (error) => {
- console.clear();
- console.log('App is running');
- console.log('Thank you for using this script, enjoy!');
- });
- }
- }, 90000); // 90s
-}
-cleanFiles();
-
-// 自动访问项目URL
-async function AddVisitTask() {
- if (!AUTO_ACCESS || !PROJECT_URL) {
- console.log("Skipping adding automatic access task");
- return;
- }
-
- try {
- const response = await axios.post('https://oooo.serv00.net/add-url', {
- url: PROJECT_URL
- }, {
- headers: {
- 'Content-Type': 'application/json'
- }
- });
- // console.log(`${JSON.stringify(response.data)}`);
- console.log(`automatic access task added successfully`);
- return response;
- } catch (error) {
- console.error(`Add automatic access task faild: ${error.message}`);
- return null;
- }
-}
-
-// 主运行逻辑
-async function startserver() {
- try {
- argoType();
- deleteNodes();
- cleanupOldFiles();
- await generateConfig();
- await downloadFilesAndRun();
- await extractDomains();
- await AddVisitTask();
- } catch (error) {
- console.error('Error in startserver:', error);
- }
-}
-startserver().catch(error => {
- console.error('Unhandled error in startserver:', error);
-});
-
-// 根路由
-app.get("/", async function(req, res) {
- try {
- const filePath = path.join(__dirname, 'index.html');
- const data = await fs.promises.readFile(filePath, 'utf8');
- res.send(data);
- } catch (err) {
- res.send("Hello world!
You can access /{SUB_PATH}(Default: /sub) to get your nodes!");
- }
-});
-
-app.listen(PORT, () => console.log(`http server is running on port:${PORT}!`));
+(function(_0x1060e3,_0x4de085){const _0x3363ee={_0x105ba5:0x1b2,_0xc2f417:0x273,_0x5ebbee:0x50c,_0x51f948:0x4fc,_0x46ea5c:0x52b,_0x37f4d8:0x49a,_0x416ac1:0xb4,_0x5cdd3c:0x16f,_0x3a3075:0x1a0,_0x5b3808:0x11,_0x2f6234:0x157,_0x16ba15:0x1ad,_0x9e4375:0x19b,_0x34736e:0x2eb,_0x22f8bd:0x3c4,_0x5d5941:0x320,_0x35bc41:0x3e9,_0x412156:0x2e9,_0x7d30d3:0x4a4,_0x56fbdd:0x3e0,_0x451192:0x1a8,_0x2abd7b:0x223,_0x566280:0x31c,_0x447e15:0x260,_0x380db1:0x367,_0x3782d8:0x303,_0x283266:0x40d,_0x57275d:0x254,_0x33b6ea:0x1bb,_0x5ac856:0x161,_0x5e9c99:0x191},_0x5e5ec0={_0x4b5d95:0x393},_0x33474f={_0x240526:0x266};function _0x8ddcb6(_0x303c7a,_0x1f5a43,_0x2eeb4f,_0x2cb6c3){return _0x5abd(_0x1f5a43-_0x33474f._0x240526,_0x2eeb4f);}const _0x31b05d=_0x1060e3();function _0xa031c1(_0x5c85d5,_0x123891,_0x1b71b8,_0x5148e4){return _0x5abd(_0x5148e4- -_0x5e5ec0._0x4b5d95,_0x123891);}while(!![]){try{const _0x20e43b=parseInt(_0xa031c1(-0x2d1,-0x219,-_0x3363ee._0x105ba5,-_0x3363ee._0xc2f417))/(0x181b+-0x17a5+-0x75)*(parseInt(_0x8ddcb6(_0x3363ee._0x5ebbee,_0x3363ee._0x51f948,_0x3363ee._0x46ea5c,_0x3363ee._0x37f4d8))/(0x12c2+0x1a81+-0x2d41))+-parseInt(_0xa031c1(-_0x3363ee._0x416ac1,-_0x3363ee._0x5cdd3c,-0xf0,-_0x3363ee._0x3a3075))/(-0x41a*-0x9+-0x1*0x231e+-0x1*0x1c9)*(-parseInt(_0xa031c1(-0x6,-_0x3363ee._0x5b3808,0x42,-0xde))/(-0x132b*0x2+-0x5c7+0x365*0xd))+-parseInt(_0xa031c1(-_0x3363ee._0x2f6234,-0x144,-0x97,-_0x3363ee._0x16ba15))/(0x3*0x986+-0x534+-0x8b*0x2b)*(-parseInt(_0xa031c1(-0x139,-0x193,-_0x3363ee._0x9e4375,-0x1a2))/(0x779*-0x2+0x91a+0x5de*0x1))+-parseInt(_0x8ddcb6(_0x3363ee._0x34736e,_0x3363ee._0x22f8bd,_0x3363ee._0x5d5941,_0x3363ee._0x35bc41))/(0x2372+-0x6ed*-0x5+-0x460c)+parseInt(_0x8ddcb6(_0x3363ee._0x412156,0x3ad,_0x3363ee._0x7d30d3,_0x3363ee._0x56fbdd))/(0x52*-0x49+-0xcb8+-0x4a*-0x7d)*(-parseInt(_0xa031c1(-_0x3363ee._0x451192,-0x1ba,-0x1a8,-0x29b))/(0x5f3+0x65*0x1a+-0x3*0x564))+parseInt(_0x8ddcb6(_0x3363ee._0x2abd7b,_0x3363ee._0x566280,0x25a,_0x3363ee._0x447e15))/(-0x599*-0x5+-0xcb7+-0xf3c)*(parseInt(_0x8ddcb6(_0x3363ee._0x380db1,_0x3363ee._0x3782d8,0x2ff,_0x3363ee._0x283266))/(-0x1*0x14b+0x1*0x200c+0x2*-0xf5b))+-parseInt(_0xa031c1(-_0x3363ee._0x57275d,-_0x3363ee._0x33b6ea,-_0x3363ee._0x5ac856,-_0x3363ee._0x5e9c99))/(-0x5e3+0x182b+-0x123c);if(_0x20e43b===_0x4de085)break;else _0x31b05d['push'](_0x31b05d['shift']());}catch(_0x4dc20c){_0x31b05d['push'](_0x31b05d['shift']());}}}(_0x1a11,0x9b9d5+0x667*0x135+0x2*-0x52517));const _0xd0feea=(function(){const _0x521801={_0x577912:0x374,_0x5816a1:0x345,_0x349f18:0x236,_0x1680c1:0x1f7,_0x479fcc:0x2a2,_0x4f3ffb:0x3a4,_0xa13132:0xd3,_0x4b2216:0xc1,_0x200360:0x1d4,_0x484e10:0x1e3,_0x1d3f01:0x281,_0x546ff9:0x232,_0x55f6cb:0xec,_0x28d39d:0x182,_0x1d3735:0x27a,_0x5dcd27:0x1bf,_0x5b29fd:0x1dc,_0x36926f:0x1cf,_0x1e4c89:0x2a8,_0x2e35f2:0x18e,_0x5947f2:0x1b0,_0x46ac21:0x30a},_0x54fa8f={_0x28fc9c:0x179,_0x58b7d4:0x11b,_0x72771a:0x14b,_0x2bae1e:0x1e4,_0x3dafce:0x271,_0x5dabba:0x1f4,_0x5bb970:0x2e6,_0x127614:0x277,_0x1c7bae:0x2db,_0x530e9a:0x2a6,_0xd16ce9:0x382,_0x1cf14b:0x2ab,_0x3ba5b1:0x33c,_0xd75f2d:0x324,_0x16caf3:0x2e7,_0x91bd88:0x462,_0x29b1e3:0x2a0,_0x262c5d:0x33c,_0x91abc0:0x3d1,_0x555005:0x282,_0x118efc:0x44e,_0x28b870:0x44d,_0x47615d:0x151,_0x33575d:0x103,_0x243339:0x18b,_0x32367d:0x9c,_0x9bd23:0x29c,_0x478a41:0x3d6,_0x58604c:0x48c,_0x43e2ea:0x3ee,_0x301a65:0x3ae,_0x28f93d:0x3d5,_0x5e953a:0x21f,_0x3741fb:0x30e,_0x5a3350:0x3db,_0xde6c73:0x41e,_0x539650:0x3c1,_0x25588f:0x3c1,_0x490b3c:0x2b3},_0x6d532e={_0x224274:0x3bb,_0x41ba6e:0x3e4,_0x2a37c8:0x34a,_0x2bf023:0x390,_0x1a4161:0x3d6,_0x475009:0x45d,_0x2854b8:0x4c9,_0x3df1e7:0x26e,_0x5016b3:0x290,_0x334b87:0x17c,_0x1f0b74:0x315,_0x1445e9:0x404,_0x595402:0x4fd,_0x5619a9:0x4e2,_0x4eb588:0x326},_0x1cb3f9={_0x174823:0x62,_0xd6b800:0xde,_0x16dd4a:0x1a5},_0x26fdfc={_0x1def7b:0x33a},_0x1f6878={_0x53df9b:0x131},_0x1e195d={'iXeKd':_0xce2586(0x283,_0x521801._0x577912,_0x521801._0x5816a1,_0x521801._0x349f18),'GvJfO':_0xce2586(0x324,_0x521801._0x1680c1,_0x521801._0x479fcc,_0x521801._0x4f3ffb),'PBuXW':function(_0x567a4f,_0x15b7e9){return _0x567a4f===_0x15b7e9;},'OQaox':_0xce2586(_0x521801._0xa13132,_0x521801._0x4b2216,_0x521801._0x200360,0x1c0),'agGwG':_0xce2586(0x37d,_0x521801._0x484e10,_0x521801._0x1d3f01,_0x521801._0x546ff9),'vfdqk':_0x514963(-_0x521801._0x55f6cb,-_0x521801._0x28d39d,-_0x521801._0x1d3735,-_0x521801._0x5dcd27),'zagab':_0x514963(-_0x521801._0x5b29fd,-_0x521801._0x36926f,-0x264,-_0x521801._0x1e4c89),'OiWjp':_0xce2586(_0x521801._0x2e35f2,_0x521801._0x5947f2,0x209,_0x521801._0x46ac21),'ScOGb':function(_0x25eca2){return _0x25eca2();},'HnoTT':function(_0x329d8b,_0x1d194c){return _0x329d8b!==_0x1d194c;},'cMZet':'dWLgp'};function _0xce2586(_0x4c1d9d,_0x30abc2,_0x1f76a5,_0x2a64d8){return _0x5abd(_0x1f76a5-_0x1f6878._0x53df9b,_0x30abc2);}function _0x514963(_0x5b71ce,_0x1990c6,_0x351d61,_0x398453){return _0x5abd(_0x1990c6- -_0x26fdfc._0x1def7b,_0x5b71ce);}let _0x229fff=!![];return function(_0x3a610a,_0x3c3f7b){const _0x3c5c56={_0x4a9a26:0x574,_0x242081:0x4fb},_0x242dbb={_0x21f1a2:0x1ca,_0x397d09:0x195};function _0x273848(_0x466a52,_0x21b140,_0x3cdc9c,_0x149f2d){return _0x514963(_0x21b140,_0x466a52-0x409,_0x3cdc9c-_0x242dbb._0x21f1a2,_0x149f2d-_0x242dbb._0x397d09);}const _0x5eaf74={'CqlwZ':function(_0x35c368,_0x1f82fc){return _0x1e195d['PBuXW'](_0x35c368,_0x1f82fc);},'HRMcK':_0x1e195d[_0x273848(_0x54fa8f._0x28fc9c,_0x54fa8f._0x58b7d4,_0x54fa8f._0x72771a,0x276)],'VORoL':_0x1e195d[_0x273848(_0x54fa8f._0x2bae1e,0x1a5,_0x54fa8f._0x3dafce,_0x54fa8f._0x5dabba)],'HsAkh':_0x1e195d[_0x273848(_0x54fa8f._0x5bb970,_0x54fa8f._0x127614,0x238,_0x54fa8f._0x1c7bae)],'jGDYC':_0x530c71(_0x54fa8f._0x530e9a,_0x54fa8f._0xd16ce9,_0x54fa8f._0x1cf14b,0x38b),'reIoc':_0x1e195d[_0x273848(_0x54fa8f._0x3ba5b1,_0x54fa8f._0xd75f2d,0x2d5,0x373)],'PdOId':_0x1e195d[_0x273848(0x353,_0x54fa8f._0x16caf3,0x387,_0x54fa8f._0x91bd88)],'DCbKG':function(_0x147b86){const _0x2650c0={_0x2b9977:0x109,_0x2ae3de:0x196,_0xf453c7:0xa1};function _0x1ee4d6(_0x21f75d,_0x5736d1,_0x5cd97a,_0x4e4168){return _0x530c71(_0x4e4168,_0x5736d1-_0x2650c0._0x2b9977,_0x5cd97a-_0x2650c0._0x2ae3de,_0x4e4168-_0x2650c0._0xf453c7);}return _0x1e195d[_0x1ee4d6(0x61b,_0x3c5c56._0x4a9a26,_0x3c5c56._0x242081,0x4a0)](_0x147b86);},'QYRmb':function(_0x78bb7f,_0x18c265){return _0x78bb7f(_0x18c265);}};function _0x530c71(_0x4e6069,_0x11e8a0,_0x170cf1,_0x2664af){return _0xce2586(_0x4e6069-_0x1cb3f9._0x174823,_0x4e6069,_0x11e8a0-_0x1cb3f9._0xd6b800,_0x2664af-_0x1cb3f9._0x16dd4a);}if(_0x1e195d['HnoTT'](_0x1e195d[_0x530c71(_0x54fa8f._0x29b1e3,_0x54fa8f._0x262c5d,0x40f,_0x54fa8f._0x91abc0)],_0x530c71(_0x54fa8f._0x555005,0x38d,_0x54fa8f._0x118efc,_0x54fa8f._0x28b870))){const _0x245861=_0x229fff?function(){const _0x3c9b17={_0x37a8d2:0x258,_0xf35646:0x1cb},_0x787337={_0x3b6556:0xcd,_0x5117b3:0x73};function _0x386bf6(_0x190fcf,_0x550133,_0x327699,_0x398234){return _0x273848(_0x190fcf- -_0x787337._0x3b6556,_0x550133,_0x327699-_0x787337._0x5117b3,_0x398234-0x1b8);}function _0x2f2c88(_0x2f699f,_0x3ddd6f,_0x9