import { connect } from "cloudflare:sockets";
const _bJNdJRaS = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _FKcfosuP = ["UpstreamAddress.SG.CMLiussss.net"];
const _NvUVVgBd = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _tQXXoHKv = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _oZcZWvhV = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90';
const _WTCDeboL = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9C%B0%E5%8C%BA%E5%90%8D%E7%A7%B0';
function _asaPbrFv(_LGCvtlhs) {
if (Array.isArray(_LGCvtlhs)) {
try {
return String.fromCharCode.apply(null, _LGCvtlhs);
} catch (_sugNPZYC) {
return '';
}
}
return _LGCvtlhs;
}
function _qzfLIFCV(_GyPFIRMn) {
return /^[0-9a-_sLFvhQFO]{8}-[0-9a-_sLFvhQFO]{4}-[4][0-9a-_sLFvhQFO]{3}-[89ab][0-9a-_sLFvhQFO]{3}-[0-9a-_sLFvhQFO]{12}$/_sIcEaSPD.test(_GyPFIRMn);
}
const _bTBVQrzN = "optimized_ips_v4";
const _JhtjABgx = "global_config_v4";
const _yluRyDJI = "admin_password_v4";
const _AXivKCAa = "live_results_temp_v1";
const _bjTqVAMh = "latest_sub_id_v1";
export default {
async fetch(_XGJBKndq, _gnDtYTaE, _SPmugbmv) {
try {
if (!_gnDtYTaE.DB) {
const _mIFARayd = _frHZrkjp("D1 数据库 'DB' 未绑定。");
return new Response(_mIFARayd, { status: 503, _aMnzGgJt: { 'Content-Type': '_EzJRFwvv/html;_cirgQyyn=UTF-8' }});
}
_SPmugbmv.waitUntil(
_gnDtYTaE.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_OTUDyGWY TEXT PRIMARY KEY, _LGCvtlhs TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_GyPFIRMn TEXT PRIMARY KEY, _bOtVdpEl TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_sugNPZYC => console.error("DB Init Error:", _sugNPZYC._YTdPNKnz))
);
const _neIZDFkh = new URL(_XGJBKndq._neIZDFkh);
const _gRhCwGEi = _neIZDFkh.pathname;
const _SUlaehwt = _XGJBKndq._aMnzGgJt.get("Upgrade");
const _uDcMHtil = await _SIedooPr(_gnDtYTaE);
if (_uDcMHtil.websocketStreamer && _uDcMHtil.websocketStreamer._rJMBDakq && _SUlaehwt && _SUlaehwt.toLowerCase() === "websocket") {
const _jYYfTGsb = _uDcMHtil.websocketStreamer._neIZDFkh;
if (_jYYfTGsb && _jYYfTGsb.trim().startsWith('https://')) {
try {
const _WPzMfMIB = new Request(_jYYfTGsb.trim() + _neIZDFkh.pathname + _neIZDFkh.search, _XGJBKndq);
return await fetch(_WPzMfMIB);
} catch (_sugNPZYC) {
return new Response(`Upstream WebSocket gateway failed: ${_sugNPZYC._YTdPNKnz}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_SUlaehwt && _SUlaehwt.toLowerCase() === "websocket") {
return await _ukvPBAhb(_XGJBKndq, _gnDtYTaE, _uDcMHtil);
}
const _SuNVhNWH = _gRhCwGEi._gPfZOtPv(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_SuNVhNWH) {
const [, _yyqZyLKj, typeSuffix] = _SuNVhNWH;
const _eIPPuXSJ = _uDcMHtil._eIPPuXSJ;
if (!_eIPPuXSJ || _eIPPuXSJ.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' } });
}
const _HGfCOFkj = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _PFNosySL = _HGfCOFkj[typeSuffix];
const _znRqnFnE = _eIPPuXSJ.replace(/\/$/, '');
const _JkbaajUW = `${_neIZDFkh.origin}/${_yyqZyLKj}`;
const _QqrSPMZZ = `${_znRqnFnE}/${_PFNosySL}?_uDcMHtil=${encodeURIComponent(_JkbaajUW)}`;
try {
const _PuDASimU = await fetch(_QqrSPMZZ, { _aMnzGgJt: { 'User-Agent': _XGJBKndq._aMnzGgJt.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _pkFkBnTl = new Headers(_PuDASimU._aMnzGgJt);
_pkFkBnTl._ckwwyHgp('Access-Control-Allow-Origin', '*');
return new Response(_PuDASimU._ojvKXSbG, { status: _PuDASimU.status, statusText: _PuDASimU.statusText, _aMnzGgJt: _pkFkBnTl });
} catch (_sugNPZYC) {
return new Response(`获取上游订阅失败: ${_sugNPZYC._YTdPNKnz}`, { status: 502, _aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' } });
}
}
if (_gRhCwGEi.startsWith('/https:/') || _gRhCwGEi.startsWith('/http:/')) {
return _JvGLboOl(_XGJBKndq, _uDcMHtil);
}
if (_uDcMHtil.customSubPath && _uDcMHtil.customSubPath._rJMBDakq && _uDcMHtil.customSubPath._gRhCwGEi && _gRhCwGEi === '/' + _uDcMHtil.customSubPath._gRhCwGEi.trim()) {
const _fCOuxKFk = _gnDtYTaE.DB.prepare("SELECT _LGCvtlhs FROM kv_data WHERE _OTUDyGWY = ?").bind(_bjTqVAMh);
const { _pDCRnmIR } = await _fCOuxKFk.all();
const _HAiUBbrX = _pDCRnmIR._hULmtWZd > 0 ? _pDCRnmIR[0]._LGCvtlhs : null;
if (_HAiUBbrX) {
return _tpPRfpiI({ _DNbWYtbf: { _GyPFIRMn: _HAiUBbrX }, _neIZDFkh: _XGJBKndq._neIZDFkh }, _gnDtYTaE);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' } });
}
}
const _JHRdlUac = _gRhCwGEi.split('/').filter(Boolean);
if (_JHRdlUac._hULmtWZd === 1 && !_gRhCwGEi.startsWith('/api/')) {
const _yyqZyLKj = _JHRdlUac[0];
return _tpPRfpiI({ _DNbWYtbf: { _GyPFIRMn: _yyqZyLKj }, _neIZDFkh: _XGJBKndq._neIZDFkh }, _gnDtYTaE);
}
if (_gRhCwGEi.startsWith('/api/')) {
if (_gRhCwGEi === '/api/_uDcMHtil' && _XGJBKndq.method === 'POST') return _kcgcVmQX(_XGJBKndq, _gnDtYTaE, _SPmugbmv);
if (_gRhCwGEi === '/api/_ckwwyHgp-_zFrvUuLy') return _IScpqNsX(_XGJBKndq, _gnDtYTaE);
if (_gRhCwGEi === '/api/change-_zFrvUuLy') return _cUMdnAhx(_XGJBKndq, _gnDtYTaE);
if (_gRhCwGEi === '/api/verify-_zFrvUuLy') return _bKTqVqNN(_XGJBKndq, _gnDtYTaE);
if (_gRhCwGEi === '/api/verify-visitor-_zFrvUuLy' && _XGJBKndq.method === 'POST') return _poHGchnx(_XGJBKndq, _gnDtYTaE);
if (_gRhCwGEi === '/api/cache-live-_pDCRnmIR' && _XGJBKndq.method === 'POST') return _VpgBRavH(_XGJBKndq, _gnDtYTaE, _SPmugbmv);
if (_gRhCwGEi === '/api/get-_FmryGhJF' && _XGJBKndq.method === 'POST') return _nMNegcoI(_XGJBKndq, _gnDtYTaE);
if (_gRhCwGEi === '/api/get-cached-_sANhLVkk') return _QWRiIhsF(_XGJBKndq, _gnDtYTaE);
if (_gRhCwGEi === '/api/save-_sANhLVkk') return _VWTSkfAz(_XGJBKndq, _gnDtYTaE, _SPmugbmv);
if (_gRhCwGEi === '/api/save-and-get-sub-_GyPFIRMn' && _XGJBKndq.method === 'POST') return _SnIixprl(_XGJBKndq, _gnDtYTaE);
if (_gRhCwGEi.startsWith('/api/get-_ZEevgWaZ/')) {
const _yyqZyLKj = _gRhCwGEi.split('/').pop();
return _tpPRfpiI({ _DNbWYtbf: { _GyPFIRMn: _yyqZyLKj }, _neIZDFkh: _XGJBKndq._neIZDFkh }, _gnDtYTaE);
}
if (_gRhCwGEi === '/api/_uDcMHtil' && _XGJBKndq.method === 'GET') return _bRDmZiUQ(_gnDtYTaE);
if (_gRhCwGEi === '/api/get-resolved-_sANhLVkk') return _PylGRTCT(_XGJBKndq);
if (_gRhCwGEi === '/api/parse-_sANhLVkk-from-_ScjbkpWe' && _XGJBKndq.method === 'POST') return _hbBjDOiJ(_XGJBKndq, _gnDtYTaE);
if (_gRhCwGEi === '/api/endpoints') return _HdXseHZX(_XGJBKndq, _gnDtYTaE);
if (_gRhCwGEi === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_gRhCwGEi === '/_TpqChJIA') return _kKppsMFu(_XGJBKndq, _gnDtYTaE);
if (_gRhCwGEi === '/bing-wallpaper') return _uCFDoInt();
return _LdNlQiHe(_XGJBKndq, _gnDtYTaE, _SPmugbmv);
} catch (err) {
let _sugNPZYC = err;
return new Response(_sugNPZYC.toString(), { status: 500 });
}
}
};
const _BAtqJmZy = { 'Accept': '_EzJRFwvv/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', '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' };
async function _WfdjdAxu(_neIZDFkh, _NdbokZpF) {
const _beLZaIOG = await fetch(_neIZDFkh, { _aMnzGgJt: { ..._BAtqJmZy, 'Referer': _NdbokZpF.referer } });
if (_beLZaIOG.ok) return _beLZaIOG._EzJRFwvv();
return null;
}
async function _reNGvndc(_neIZDFkh, _NdbokZpF) {
const _HpFZQucE = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_neIZDFkh)}`;
const _beLZaIOG = await fetch(_HpFZQucE, { _aMnzGgJt: { ..._BAtqJmZy, 'Referer': _NdbokZpF.referer } });
if (!_beLZaIOG.ok) return null;
const _ojvKXSbG = await _beLZaIOG._EzJRFwvv();
const _gPfZOtPv = _ojvKXSbG._gPfZOtPv(/<pre[^>]*>([\s\S]*?)<\/pre>/_sIcEaSPD);
return _gPfZOtPv && _gPfZOtPv[1] ? _gPfZOtPv[1].replace(/&/g, '&') : null;
}
function _GpUjxJJR(_VRKwRssO) {
let _qBRqjBwL;
try {
_qBRqjBwL = atob(_VRKwRssO.replace(/\s/g, ''));
} catch (_sugNPZYC) {
_qBRqjBwL = _VRKwRssO;
}
const _ZEevgWaZ = _qBRqjBwL.split(/[\s\n\r,]+/).filter(line => line.trim());
const _UaIKXYln = new Set();
const _tIJscXbk = /@([^?#]+?):(\d+)/;
for (const _mkqXPJmd of _ZEevgWaZ) {
let _VRqXoawn = '';
let _UHkhXIIB = '';
try {
if (_mkqXPJmd.startsWith('vmess://')) {
const _WthRLjOl = atob(_mkqXPJmd.substring(8));
const _uDcMHtil = JSON.parse(_WthRLjOl);
_VRqXoawn = _uDcMHtil.add;
_UHkhXIIB = _uDcMHtil._UHkhXIIB;
} else {
const _gPfZOtPv = _mkqXPJmd._gPfZOtPv(_tIJscXbk);
if (_gPfZOtPv && _gPfZOtPv[1] && _gPfZOtPv[2]) {
_VRqXoawn = _gPfZOtPv[1].replace(/[\[\]]/g, '');
_UHkhXIIB = _gPfZOtPv[2];
}
}
} catch (_sugNPZYC) {
console.warn(`Could not parse _mkqXPJmd: ${_mkqXPJmd}`);
}
if (_VRqXoawn && _UHkhXIIB) {
_UaIKXYln.add(`${_VRqXoawn}:${_UHkhXIIB}`);
}
}
return Array.from(_UaIKXYln);
}
async function _oiEfQgwR(_oGjAWCJh) {
try {
const _beLZaIOG = await fetch(_oGjAWCJh, { _aMnzGgJt: _BAtqJmZy });
if (!_beLZaIOG.ok) {
console.error(`Failed to fetch subscription: ${_beLZaIOG.status}`);
return [];
}
const _VRKwRssO = await _beLZaIOG._EzJRFwvv();
return _GpUjxJJR(_VRKwRssO);
} catch (error) {
console.error(`Error processing subscription ${_oGjAWCJh}:`, error);
return [];
}
}
async function _mxMbNVnD(_oYzJYjiw) {
const _cVxDcncF = _oYzJYjiw.trim();
const _IXElEGFv = /^(vless|vmess|trojan|ss):\/\//.test(_cVxDcncF);
const _ivavGevo = (() => {
if (_cVxDcncF._hULmtWZd < 20 || _cVxDcncF.startsWith('http')) return false;
const _cfLPTxCi = _cVxDcncF.replace(/\s/g, '');
if (_cfLPTxCi._hULmtWZd % 4 !== 0 && !_cfLPTxCi.includes('=')) return false;
try {
atob(_cfLPTxCi);
return true;
} catch (_sugNPZYC) {
return false;
}
})();
if (_IXElEGFv || _ivavGevo) {
return _GpUjxJJR(_cVxDcncF).join('\n');
}
const _MgNBBQqb = [
'https://ipdb.api.030101.xyz/?_sDUkqgEe=bestcf&_mBnSFJLc=true',
'https://ipdb.api.030101.xyz/?_sDUkqgEe=bestproxy&_mBnSFJLc=true'
];
const _QiXcfCUn = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_sIcEaSPD.test(_oYzJYjiw) || _oYzJYjiw.includes('?_siSXvYhd=');
if (_QiXcfCUn) {
const _sANhLVkk = await _oiEfQgwR(_oYzJYjiw);
return _sANhLVkk.join('\n');
}
let _VRKwRssO = '';
if (_MgNBBQqb.includes(_oYzJYjiw)) {
_VRKwRssO = await _WfdjdAxu(_oYzJYjiw, { referer: _oYzJYjiw });
if (!_VRKwRssO || _VRKwRssO._hULmtWZd < 8) {
_VRKwRssO = await _reNGvndc(_oYzJYjiw, { referer: _oYzJYjiw });
}
} else {
try {
const _ARWbJOYq = await fetch(_oYzJYjiw, { _aMnzGgJt: { 'User-Agent': 'Cloudflare-Worker' } });
if (_ARWbJOYq.ok) {
_VRKwRssO = await _ARWbJOYq._EzJRFwvv();
} else {
console.warn(`Failed to fetch URL ${_oYzJYjiw}: ${_ARWbJOYq.status}`);
}
} catch (_sugNPZYC) {
console.error(`Error fetching URL ${_oYzJYjiw}:`, _sugNPZYC);
}
}
const _FUIOBLDb = _GpUjxJJR(_VRKwRssO);
if (_FUIOBLDb._hULmtWZd > 0) {
return _FUIOBLDb.join('\n');
}
return _VRKwRssO || '';
}
async function _JvGLboOl(_XGJBKndq, _uDcMHtil) {
if (!_uDcMHtil.streamer._rJMBDakq) {
return new Response('远程流功能未开启', { status: 403 });
}
const _neIZDFkh = new URL(_XGJBKndq._neIZDFkh);
const _ORVwPeCt = _neIZDFkh.pathname.substring(1).replace(':/', '://');
try {
const _QqrSPMZZ = new URL(_ORVwPeCt);
const _AQQefoOo = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_AQQefoOo.some(domain => _QqrSPMZZ._VRqXoawn.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _rHWcPcRT = new Headers(_XGJBKndq._aMnzGgJt);
_rHWcPcRT._ckwwyHgp('Host', _QqrSPMZZ._VRqXoawn);
_rHWcPcRT._ckwwyHgp('User-Agent', 'CF-Worker-Streamer/1.0');
const _oYruLeDy = await fetch(_QqrSPMZZ.toString(), {
method: _XGJBKndq.method,
_aMnzGgJt: _rHWcPcRT,
_ojvKXSbG: _XGJBKndq._ojvKXSbG,
});
const _pkFkBnTl = new Headers(_oYruLeDy._aMnzGgJt);
_pkFkBnTl._ckwwyHgp('Access-Control-Allow-Origin', '*');
_pkFkBnTl._ckwwyHgp('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_pkFkBnTl._ckwwyHgp('Access-Control-Allow-Headers', '*');
_pkFkBnTl._ckwwyHgp('Cache-Control', 'public, max-age=86400');
_pkFkBnTl._ckwwyHgp('X-Streamer-Source', 'CF-Worker');
_pkFkBnTl.delete('_VRKwRssO-security-policy');
_pkFkBnTl.delete('x-_VRKwRssO-security-policy');
_pkFkBnTl.delete('x-webkit-csp');
return new Response(_oYruLeDy._ojvKXSbG, {
status: _oYruLeDy.status,
statusText: _oYruLeDy.statusText,
_aMnzGgJt: _pkFkBnTl,
});
} catch (_sugNPZYC) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _ukvPBAhb(_XGJBKndq, _gnDtYTaE, _uDcMHtil) {
try {
const _ZYhoOkSj = _uDcMHtil || await _SIedooPr(_gnDtYTaE);
const _IsEESTQW = (_ZYhoOkSj.itemLink._lHQxrIJN && _ZYhoOkSj.itemLink._lHQxrIJN[0]) || {};
const _wxWGgAZj = _IsEESTQW['_siSXvYhd'] || _asaPbrFv(_bJNdJRaS);
if (!_qzfLIFCV(_wxWGgAZj)) {
throw new Error("Configured user _KZYvxVDM is not valid.");
}
const _bmyxoceD = _ZYhoOkSj.dataFeeds.universalFallbackAddress;
let _MhxsZRhk = {};
const _jIdYpjdu = _asaPbrFv(_FKcfosuP[0] || "");
if (_bmyxoceD) {
const [_aInOKxtJ, _UHkhXIIB = '443'] = _bmyxoceD.split(':');
_MhxsZRhk = { _aInOKxtJ, _UHkhXIIB };
} else {
const [_aInOKxtJ, _UHkhXIIB = '443'] = _jIdYpjdu.split(':');
_MhxsZRhk = { _aInOKxtJ, _UHkhXIIB };
}
const _neIZDFkh = new URL(_XGJBKndq._neIZDFkh);
const _gRhCwGEi = _neIZDFkh.pathname;
let _sHJyFHvL = '';
const _cyPoyjJq = _neIZDFkh.searchParams.get('remote');
if (_cyPoyjJq) {
_sHJyFHvL = atob(_cyPoyjJq);
} else if (_gRhCwGEi.startsWith('/endpoint=')) {
_sHJyFHvL = _gRhCwGEi.substring(10);
} else if (_gRhCwGEi._hULmtWZd > 1 && _gRhCwGEi.substring(1).includes('.')) {
_sHJyFHvL = _gRhCwGEi.substring(1);
}
if (_sHJyFHvL) {
const [_aInOKxtJ, _UHkhXIIB = '443'] = _sHJyFHvL.split(':');
_MhxsZRhk = { _aInOKxtJ, _UHkhXIIB };
}
return await _fbXKPkcP(_XGJBKndq, _wxWGgAZj, _MhxsZRhk);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _fbXKPkcP(_XGJBKndq, _KZYvxVDM, _MhxsZRhk) {
const _QLPcGFAw = new WebSocketPair();
const [clientEnd, _qKXLPpGF] = Object.values(_QLPcGFAw);
_qKXLPpGF.accept();
let _SbppAmrh = { _CnmXPxfL: null };
const _FSslrZTt = _XGJBKndq._aMnzGgJt.get("sec-websocket-protocol") || "";
const _pQYtOuDr = _gWruLRwM(_qKXLPpGF, _FSslrZTt);
_pQYtOuDr.pipeTo(new WritableStream({
async write(chunk) {
if (_SbppAmrh._CnmXPxfL) {
const _EwGAXmuC = _SbppAmrh._CnmXPxfL.writable.getWriter();
await _EwGAXmuC.write(chunk);
_EwGAXmuC.releaseLock();
return;
}
const { error, details } = await _OfhtxpTZ(chunk, _KZYvxVDM);
if (error) {
throw new Error(details);
}
const _YTmJGrjW = new Uint8Array([details._KuxzNHnJ[0], 0]);
const _UDTVyNKm = chunk.slice(details.payloadIndex);
await _VNfaMPmN(_SbppAmrh, details._RdMQpZKP, details._reGvlLSd, _UDTVyNKm, _qKXLPpGF, _YTmJGrjW, _MhxsZRhk);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_KSUnbxlP(_qKXLPpGF);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _VNfaMPmN(_SbppAmrh, _RdMQpZKP, _reGvlLSd, _CDZgERhd, _dQuNFTjV, _YTmJGrjW, _ZQYiqREt) {
const _IiOtspvZ = async (_aInOKxtJ, _UHkhXIIB) => {
let _RNiwihED = _aInOKxtJ;
if (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(_aInOKxtJ)) {
_RNiwihED = `${atob('d3d3Lg==')}${_aInOKxtJ}${atob('LnNzbGlwLmlv')}`;
}
const _CnmXPxfL = connect({ _VRqXoawn: _RNiwihED, _UHkhXIIB });
_SbppAmrh._CnmXPxfL = _CnmXPxfL;
const _EwGAXmuC = _CnmXPxfL.writable.getWriter();
await _EwGAXmuC.write(_CDZgERhd);
_EwGAXmuC.releaseLock();
return _CnmXPxfL;
};
const _oQMBziQe = async () => {
if (!_ZQYiqREt._aInOKxtJ) return;
console.log(`Direct connection failed, falling back to gateway: ${_ZQYiqREt._aInOKxtJ}`);
const _YeOSrBcK = await _IiOtspvZ(_ZQYiqREt._aInOKxtJ, parseInt(_ZQYiqREt._UHkhXIIB, 10));
_YeOSrBcK.closed.catch(() => {}).finally(() => _KSUnbxlP(_dQuNFTjV));
_fFKdSJwi(_YeOSrBcK, _dQuNFTjV, _YTmJGrjW, null);
};
try {
const _HYMPYcqS = await _IiOtspvZ(_RdMQpZKP, _reGvlLSd);
_fFKdSJwi(_HYMPYcqS, _dQuNFTjV, _YTmJGrjW, _oQMBziQe);
} catch (err) {
console.error("Primary connection failed:", err);
await _oQMBziQe();
}
}
function _gWruLRwM(_qKXLPpGF, _FSslrZTt) {
let _xchxDkvA = false;
return new ReadableStream({
start(_QWdlzrTy) {
_qKXLPpGF.addEventListener("_YTdPNKnz", (event) => { if (_xchxDkvA) return; _QWdlzrTy.enqueue(event._bOtVdpEl); });
_qKXLPpGF.addEventListener("close", () => { _KSUnbxlP(_qKXLPpGF); if (_xchxDkvA) return; _QWdlzrTy.close(); });
_qKXLPpGF.addEventListener("error", (err) => _QWdlzrTy.error(err));
if (_FSslrZTt) {
try {
const _chKxcqgQ = atob(_FSslrZTt.replace(/-/g, "+").replace(/_/g, "/"));
_QWdlzrTy.enqueue(Uint8Array.from(_chKxcqgQ, c => c.charCodeAt(0))._iPTYwYQu);
} catch (_sugNPZYC) { console.error("Failed to decode early _bOtVdpEl:", _sugNPZYC); }
}
},
cancel() { _xchxDkvA = true; _KSUnbxlP(_qKXLPpGF); },
});
}
async function _OfhtxpTZ(_iPTYwYQu, _KZYvxVDM) {
if (_iPTYwYQu.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _KuxzNHnJ = new Uint8Array(_iPTYwYQu.slice(0, 1));
const _cofWLokB = _onTfRhUI(new Uint8Array(_iPTYwYQu.slice(1, 17)));
if (_cofWLokB !== _KZYvxVDM) return { error: true, details: "Invalid _KZYvxVDM" };
const _PcbqDxBZ = new Uint8Array(_iPTYwYQu.slice(17, 18))[0];
const _eeqZQPQw = new Uint8Array(_iPTYwYQu.slice(18 + _PcbqDxBZ, 19 + _PcbqDxBZ))[0];
if (_eeqZQPQw !== 1) return { error: true, details: `Unsupported _eeqZQPQw: ${_eeqZQPQw}` };
const _lSIJHAFr = 19 + _PcbqDxBZ;
const _reGvlLSd = new DataView(_iPTYwYQu.slice(_lSIJHAFr, _lSIJHAFr + 2)).getUint16(0);
let _MYYqZslx = _lSIJHAFr + 2;
const _YCXAMhxu = new Uint8Array(_iPTYwYQu.slice(_MYYqZslx, _MYYqZslx + 1))[0];
let _euFkayMZ = 0;
let _qiRWnAKR = _MYYqZslx + 1;
let _RdMQpZKP = "";
switch (_YCXAMhxu) {
case 1: _euFkayMZ = 4; _RdMQpZKP = new Uint8Array(_iPTYwYQu.slice(_qiRWnAKR, _qiRWnAKR + _euFkayMZ)).join("."); break;
case 2: _euFkayMZ = new Uint8Array(_iPTYwYQu.slice(_qiRWnAKR, _qiRWnAKR + 1))[0]; _qiRWnAKR++; _RdMQpZKP = new TextDecoder().decode(_iPTYwYQu.slice(_qiRWnAKR, _qiRWnAKR + _euFkayMZ)); break;
case 3: _euFkayMZ = 16; const _NZpYLibc = new DataView(_iPTYwYQu.slice(_qiRWnAKR, _qiRWnAKR + _euFkayMZ)); const _sDGcgAjq = []; for (let _sIcEaSPD = 0; _sIcEaSPD < 8; _sIcEaSPD++) _sDGcgAjq.push(_NZpYLibc.getUint16(_sIcEaSPD * 2).toString(16)); _RdMQpZKP = _sDGcgAjq.join(":"); break;
default: return { error: true, details: `Invalid _eEPcSHbI _sDUkqgEe: ${_YCXAMhxu}` };
}
if (!_RdMQpZKP) return { error: true, details: "Target _aInOKxtJ is empty" };
return { error: false, details: { _RdMQpZKP, _reGvlLSd, _KuxzNHnJ, payloadIndex: _qiRWnAKR + _euFkayMZ } };
}
async function _fFKdSJwi(_CnmXPxfL, _dQuNFTjV, _kqBWvLWy, _mmBfudBx) {
let _rDDhWxPx = _kqBWvLWy;
let _ovFoTbSg = false;
let _leKijhJp = _CnmXPxfL._pQYtOuDr.pipeTo(new WritableStream({
write(chunk) {
_ovFoTbSg = true;
if (_dQuNFTjV.readyState !== 1) throw new Error("Channel is not open");
if (_rDDhWxPx) {
const _lkkrYCYg = new Uint8Array(_rDDhWxPx.byteLength + chunk.byteLength);
_lkkrYCYg._ckwwyHgp(new Uint8Array(_rDDhWxPx));
_lkkrYCYg._ckwwyHgp(new Uint8Array(chunk), _rDDhWxPx.byteLength);
_dQuNFTjV.send(_lkkrYCYg._iPTYwYQu);
_rDDhWxPx = null;
} else {
_dQuNFTjV.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _dQuNFTjV error:", err._YTdPNKnz);
});
await _leKijhJp;
if (!_ovFoTbSg && _mmBfudBx) {
_mmBfudBx();
}
}
function _KSUnbxlP(_dQuNFTjV) {
try { if (_dQuNFTjV.readyState === 1 || _dQuNFTjV.readyState === 2) _dQuNFTjV.close(); } catch (_sugNPZYC) {}
}
const _KOgVhluw = Array.from({ _hULmtWZd: 256 }, (_, _sIcEaSPD) => (_sIcEaSPD + 256).toString(16).slice(1));
function _onTfRhUI(_MFdjRvty, offset = 0) {
return (
_KOgVhluw[_MFdjRvty[offset]] + _KOgVhluw[_MFdjRvty[offset + 1]] + _KOgVhluw[_MFdjRvty[offset + 2]] + _KOgVhluw[_MFdjRvty[offset + 3]] + "-" +
_KOgVhluw[_MFdjRvty[offset + 4]] + _KOgVhluw[_MFdjRvty[offset + 5]] + "-" +
_KOgVhluw[_MFdjRvty[offset + 6]] + _KOgVhluw[_MFdjRvty[offset + 7]] + "-" +
_KOgVhluw[_MFdjRvty[offset + 8]] + _KOgVhluw[_MFdjRvty[offset + 9]] + "-" +
_KOgVhluw[_MFdjRvty[offset + 10]] + _KOgVhluw[_MFdjRvty[offset + 11]] +
_KOgVhluw[_MFdjRvty[offset + 12]] + _KOgVhluw[_MFdjRvty[offset + 13]] +
_KOgVhluw[_MFdjRvty[offset + 14]] + _KOgVhluw[_MFdjRvty[offset + 15]]
).toLowerCase();
}
let _AMxKVKvD = { "N/A":"未知" };
async function _NSDpVUax(_neIZDFkh, _sTENZPeW, _mmBfudBx) {
try {
const _beLZaIOG = await fetch(_neIZDFkh, {
_aMnzGgJt: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_beLZaIOG.ok) {
console.error(`获取 ${_neIZDFkh} 失败: HTTP ${_beLZaIOG.status}`);
return _mmBfudBx;
}
const _EzJRFwvv = await _beLZaIOG._EzJRFwvv();
return _sTENZPeW(_EzJRFwvv);
} catch (error) {
console.error(`获取或解析 ${_neIZDFkh} 时发生网络错误: ${error._YTdPNKnz}`);
return _mmBfudBx;
}
}
function _bTovdbBa(_EzJRFwvv) {
if (!_EzJRFwvv) return [];
const _hzGaqVbK = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _wsAJkqtv = _EzJRFwvv.split(/[\s,;#|]+/);
const _qVhseblv = [];
for (const _bVamEvoI of _wsAJkqtv) {
const _ZuUmstvi = _bVamEvoI.trim();
if (!_ZuUmstvi) continue;
const _bqyjGWKf = _ZuUmstvi.lastIndexOf(':');
let _fEWsLPhB = _ZuUmstvi;
if(_bqyjGWKf > _ZuUmstvi.lastIndexOf(']')) {
const _qyVQHdGg = _ZuUmstvi.substring(_bqyjGWKf + 1);
if(!isNaN(_qyVQHdGg) && _qyVQHdGg._hULmtWZd > 0) {
_fEWsLPhB = _ZuUmstvi.substring(0, _bqyjGWKf);
}
}
if (_kILguhgT.isValid(_fEWsLPhB.replace(/[\[\]]/g, '')) || _hzGaqVbK.test(_ZuUmstvi)) {
_qVhseblv.push(_ZuUmstvi);
}
}
return _qVhseblv;
}
function _fiNQOlmA(_EzJRFwvv) {
if (!_EzJRFwvv) return [];
return _EzJRFwvv.split(/\s+/).filter(d => d.trim() !== '');
}
function _njYWWbwE(_EzJRFwvv) {
if (!_EzJRFwvv) return { "N/A": "未知" };
try {
return JSON.parse(`{${_EzJRFwvv}}`);
} catch (_sugNPZYC) {
console.error("解析 _AMxKVKvD 失败:", _sugNPZYC);
return { "N/A": "未知" };
}
}
const _kILguhgT = {
isValid: (_TpqChJIA) => _kILguhgT.isIPv4(_TpqChJIA) || _kILguhgT.isIPv6(_TpqChJIA),
isIPv4: (_TpqChJIA) => {
if (typeof _TpqChJIA !== 'string') return false;
const _sDGcgAjq = _TpqChJIA.split('.');
if (_sDGcgAjq._hULmtWZd !== 4) return false;
return _sDGcgAjq.every(_cfpMtpmg => {
const _kRflHjDO = parseInt(_cfpMtpmg, 10);
return !isNaN(_kRflHjDO) && _kRflHjDO >= 0 && _kRflHjDO <= 255 && String(_kRflHjDO) === _cfpMtpmg;
});
},
isIPv6: (_TpqChJIA) => {
if (typeof _TpqChJIA !== 'string') return false;
return /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/_sIcEaSPD.test(_TpqChJIA);
},
toLong4: (_TpqChJIA) => _TpqChJIA.split('.').reduce((acc, octet, _sIcEaSPD) => acc + (parseInt(octet) << (8*(3-_sIcEaSPD))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_TpqChJIA) => {
try {
const _kEdPoWJj = _TpqChJIA.split('/')[0];
const _sDGcgAjq = _kEdPoWJj.split('::');
if (_sDGcgAjq._hULmtWZd > 2) return 0n;
let _uOGydkEM = [];
if (_sDGcgAjq[0]) {
_uOGydkEM = _sDGcgAjq[0].split(':');
}
let _ARDMLREo = [];
if (_sDGcgAjq._hULmtWZd > 1 && _sDGcgAjq[1]) {
_ARDMLREo = _sDGcgAjq[1].split(':');
}
if (_uOGydkEM._hULmtWZd + _ARDMLREo._hULmtWZd > 8) return 0n;
const _MfOrQeST = 8 - (_uOGydkEM._hULmtWZd + _ARDMLREo._hULmtWZd);
const _gkCtgDsE = [
..._uOGydkEM,
...Array(_MfOrQeST).fill('0'),
..._ARDMLREo
].map(_cfpMtpmg => _cfpMtpmg || '0');
while(_gkCtgDsE._hULmtWZd < 8) {
_gkCtgDsE.push('0');
}
let _AECvdsri = 0n;
for (const _cfpMtpmg of _gkCtgDsE) {
if (_cfpMtpmg._hULmtWZd > 4) return 0n;
const _LGCvtlhs = BigInt('0x' + _cfpMtpmg);
_AECvdsri = (_AECvdsri << 16n) | _LGCvtlhs;
}
return _AECvdsri;
} catch(_sugNPZYC) {
return 0n;
}
},
fromBigInt6: (_AECvdsri) => {
if (typeof _AECvdsri !== '_AECvdsri' || _AECvdsri < 0n) return null;
const _sDGcgAjq = [];
for (let _sIcEaSPD = 0; _sIcEaSPD < 8; _sIcEaSPD++) {
_sDGcgAjq.unshift((_AECvdsri & 0xFFFFn).toString(16));
_AECvdsri >>= 16n;
}
let _ZHwFmpuL = { start: -1, _YqGepKyH: 0 };
let _hQQdSjDd = { start: -1, _YqGepKyH: 0 };
for (let _sIcEaSPD = 0; _sIcEaSPD < 8; _sIcEaSPD++) {
if (_sDGcgAjq[_sIcEaSPD] === '0') {
if (_hQQdSjDd.start === -1) _hQQdSjDd.start = _sIcEaSPD;
_hQQdSjDd._YqGepKyH++;
} else {
if (_hQQdSjDd._YqGepKyH > _ZHwFmpuL._YqGepKyH) _ZHwFmpuL = { ..._hQQdSjDd };
_hQQdSjDd = { start: -1, _YqGepKyH: 0 };
}
}
if (_hQQdSjDd._YqGepKyH > _ZHwFmpuL._YqGepKyH) _ZHwFmpuL = { ..._hQQdSjDd };
if (_ZHwFmpuL._YqGepKyH > 1) {
_sDGcgAjq.splice(_ZHwFmpuL.start, _ZHwFmpuL._YqGepKyH, '');
if (_ZHwFmpuL.start === 0) _sDGcgAjq.unshift('');
if (_ZHwFmpuL.start + _ZHwFmpuL._YqGepKyH === 8) _sDGcgAjq.push('');
}
return _sDGcgAjq.join(':');
},
cidrToRange: (cidr, _OOTimGvT = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _VsACJeNS = parseInt(bitsStr, 10);
const _sANhLVkk = new Set();
if (_kILguhgT.isIPv4(range)) {
if (isNaN(_VsACJeNS) || _VsACJeNS < 8 || _VsACJeNS > 32) return [];
if (_VsACJeNS === 32) return [range];
const _qcVTDErE = _kILguhgT.toLong4(range);
const _LYzQNMXc = (0xFFFFFFFF << (32 - _VsACJeNS)) >>> 0;
const _XjryulLA = _qcVTDErE & _LYzQNMXc;
const _fzfVUuMh = 1 << (32 - _VsACJeNS);
if (_fzfVUuMh <= 2) return [];
const _crjonxna = Math.min(_OOTimGvT, _fzfVUuMh - 2);
let _eExqyOOa = 0;
while (_sANhLVkk.size < _crjonxna && _eExqyOOa < _crjonxna * 5) {
const _lsUrMIqe = Math.floor(Math.random() * (_fzfVUuMh - 2)) + 1;
_sANhLVkk.add(_kILguhgT.fromLong4((_XjryulLA + _lsUrMIqe) >>> 0));
_eExqyOOa++;
}
return Array.from(_sANhLVkk);
} else if (_kILguhgT.isIPv6(range)) {
if (isNaN(_VsACJeNS) || _VsACJeNS < 16 || _VsACJeNS > 128) return [];
if (_VsACJeNS === 128) return [range];
const _zzCrOguk = _kILguhgT.toBigInt6(range);
const _LYzQNMXc = (2n ** BigInt(128 - _VsACJeNS) - 1n);
const _XjryulLA = _zzCrOguk & ~_LYzQNMXc;
const _yoYdjouc = 2n ** BigInt(128 - _VsACJeNS);
if (_yoYdjouc <= 2n) return [];
let _eExqyOOa = 0;
while (_sANhLVkk.size < _OOTimGvT && _eExqyOOa < _OOTimGvT * 5) {
const _bpsLxYLA = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_bpsLxYLA);
let _xYBOwobZ = 0n;
for (const _xPzzfOKe of _bpsLxYLA) {
_xYBOwobZ = (_xYBOwobZ << 8n) | BigInt(_xPzzfOKe);
}
const _lsUrMIqe = _xYBOwobZ % (_yoYdjouc - 2n) + 1n;
_sANhLVkk.add(_kILguhgT.fromBigInt6(_XjryulLA + _lsUrMIqe));
_eExqyOOa++;
}
return Array.from(_sANhLVkk);
}
return [];
} catch(_sugNPZYC) {
console.error(`CIDR to range failed for ${cidr}:`, _sugNPZYC);
return [];
}
}
};
function _ENBcoqBu(_VgAHxGnF, _TWuopOuU) {
const _iyDkhODZ = {};
const _qelGUUeD = Object._qelGUUeD(_TWuopOuU);
const _sDGcgAjq = _qelGUUeD.map(_OTUDyGWY => {
const _JIiQwKTg = _VgAHxGnF * (_TWuopOuU[_OTUDyGWY] / 100);
return { _OTUDyGWY, _OOTimGvT: Math.floor(_JIiQwKTg), remainder: _JIiQwKTg - Math.floor(_JIiQwKTg) };
});
let _epvKgiDO = _sDGcgAjq.reduce((acc, _cfpMtpmg) => acc + _cfpMtpmg._OOTimGvT, 0);
_sDGcgAjq.sort((a, b) => b.remainder - a.remainder);
let _KYZItLmD = _VgAHxGnF - _epvKgiDO;
for (let _sIcEaSPD = 0; _sIcEaSPD < _KYZItLmD; _sIcEaSPD++) {
_sDGcgAjq[_sIcEaSPD % _sDGcgAjq._hULmtWZd]._OOTimGvT++;
}
for (const _cfpMtpmg of _sDGcgAjq) {
_iyDkhODZ[_cfpMtpmg._OTUDyGWY] = _cfpMtpmg._OOTimGvT;
}
return _iyDkhODZ;
}
async function _wHMZZWnN(_gnDtYTaE) {
const _fCOuxKFk = _gnDtYTaE.DB.prepare("SELECT _LGCvtlhs FROM kv_data WHERE _OTUDyGWY = ?").bind(_yluRyDJI);
const { _pDCRnmIR } = await _fCOuxKFk.all();
return _pDCRnmIR._hULmtWZd > 0 ? _pDCRnmIR[0]._LGCvtlhs : null;
}
async function _vjKldwvF(_gnDtYTaE, _zFrvUuLy) {
const _fCOuxKFk = _gnDtYTaE.DB.prepare(
"INSERT INTO kv_data (_OTUDyGWY, _LGCvtlhs) VALUES (?, ?) ON CONFLICT(_OTUDyGWY) DO UPDATE SET _LGCvtlhs = excluded._LGCvtlhs"
);
await _fCOuxKFk.bind(_yluRyDJI, _zFrvUuLy).run();
}
async function _bKTqVqNN(_XGJBKndq, _gnDtYTaE) {
const { _zFrvUuLy } = await _XGJBKndq.json();
const _NeCLjVYH = await _wHMZZWnN(_gnDtYTaE);
if (_NeCLjVYH === _zFrvUuLy) {
return _NJQrQJNY({ success: true });
}
return _NJQrQJNY({ success: false, _YTdPNKnz: '密码错误' }, 401);
}
async function _poHGchnx(_XGJBKndq, _gnDtYTaE) {
const _RIKpaFOu = await _SIedooPr(_gnDtYTaE);
if (!_RIKpaFOu.visitorPassword || !_RIKpaFOu.visitorPassword._rJMBDakq) {
return _NJQrQJNY({ success: true });
}
try {
const { _zFrvUuLy } = await _XGJBKndq.json();
const _ugbxDPDo = _RIKpaFOu.visitorPassword._zFrvUuLy;
if (_ugbxDPDo && _zFrvUuLy === _ugbxDPDo) {
return _NJQrQJNY({ success: true });
}
return _NJQrQJNY({ success: false, _YTdPNKnz: '访客密码错误' }, 401);
} catch (_sugNPZYC) {
return _NJQrQJNY({ success: false, _YTdPNKnz: '无效请求' }, 400);
}
}
async function _IScpqNsX(_XGJBKndq, _gnDtYTaE) {
const _iqPgctnI = await _wHMZZWnN(_gnDtYTaE);
if (_iqPgctnI) {
return _NJQrQJNY({ success: false, _YTdPNKnz: "密码已设置,无法重复初始化。" }, 403);
}
const { _zFrvUuLy } = await _XGJBKndq.json();
if (!_zFrvUuLy || _zFrvUuLy._hULmtWZd < 6) {
return _NJQrQJNY({ success: false, _YTdPNKnz: "密码长度不能少于6位。" }, 400);
}
await _vjKldwvF(_gnDtYTaE, _zFrvUuLy);
return _NJQrQJNY({ success: true, _YTdPNKnz: "初始密码设置成功!请刷新页面并登录。" });
}
async function _cUMdnAhx(_XGJBKndq, _gnDtYTaE) {
const { _mbjYUEkD, _MIUdoBiq } = await _XGJBKndq.json();
const _NeCLjVYH = await _wHMZZWnN(_gnDtYTaE);
if (_NeCLjVYH !== _mbjYUEkD) {
return _NJQrQJNY({ success: false, _YTdPNKnz: "旧密码错误。" }, 403);
}
if (!_MIUdoBiq || _MIUdoBiq._hULmtWZd < 6) {
return _NJQrQJNY({ success: false, _YTdPNKnz: "新密码长度不能少于6位。" }, 400);
}
await _vjKldwvF(_gnDtYTaE, _MIUdoBiq);
return _NJQrQJNY({ success: true, _YTdPNKnz: "密码修改成功!" });
}
function _tcqsilWU() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_eIPPuXSJ: '',
api: {
_rJMBDakq: true,
_YTdPNKnz: '维护中...',
},
ispFilter: { _rJMBDakq: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_rJMBDakq: true
},
websocketStreamer: {
_rJMBDakq: true,
_neIZDFkh: 'https://snippets.neib.cn'
},
cloudStorage: {
_rJMBDakq: true
},
visitorPassword: {
_rJMBDakq: false,
_zFrvUuLy: '',
},
customSubPath: {
_rJMBDakq: false,
_gRhCwGEi: 'latest',
},
subscriptionId: {
_hULmtWZd: 8,
_cirgQyyn: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_rJMBDakq: true,
template: 'vless://{_siSXvYhd}@{_TpqChJIA}:{_UHkhXIIB}?encryption=none&security=tls&sni={_aInOKxtJ}&fp=random&_sDUkqgEe=ws&_aInOKxtJ={_aInOKxtJ}&_gRhCwGEi={_gRhCwGEi}#{_zPvxzblP}',
selectionMode: 'first',
_lHQxrIJN: [
{ _zPvxzblP: '默认配置', _aInOKxtJ: '', '_siSXvYhd': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _gRhCwGEi: '/?ed=2560' }
],
_MaogDPUR: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_rJMBDakq: false,
_EzJRFwvv: '',
_usBbJqAz: 5
},
marquee: {
_rJMBDakq: false,
_EzJRFwvv: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_rJMBDakq: true,
sources: [
{ _HeqDRDuj: 'CF官方IPV4', _sANhLVkk: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _RfjLwRQD: false, _rJMBDakq: true, _VaOsovrX: 20 },
{ _HeqDRDuj: 'CF官方IPV6', _sANhLVkk: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _RfjLwRQD: false, _rJMBDakq: true, _VaOsovrX: 20 },
{ _HeqDRDuj: '反代优选0', _sANhLVkk: 'https://wvs.sosorg.nyc.mn/sub?_siSXvYhd=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_sDUkqgEe=ws&_aInOKxtJ=ss.nzvrn.com&_gRhCwGEi=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _RfjLwRQD: false, _rJMBDakq: true, _VaOsovrX: 30 },
{ _HeqDRDuj: '官方优选1', _sANhLVkk: 'https://ipdb.api.030101.xyz/?_sDUkqgEe=bestcf&_mBnSFJLc=true', _RfjLwRQD: false, _rJMBDakq: true, _VaOsovrX: 10 },
{ _HeqDRDuj: '反代优选2', _sANhLVkk: 'https://ipdb.api.030101.xyz/?_sDUkqgEe=bestproxy&_mBnSFJLc=true', _RfjLwRQD: false, _rJMBDakq: true, _VaOsovrX: 5 },
{ _HeqDRDuj: '官方优选2', _sANhLVkk: 'https://addressesapi.090227.xyz/_TpqChJIA.164746.xyz', _RfjLwRQD: false, _rJMBDakq: true, _VaOsovrX: 10 },
{ _HeqDRDuj: '官方优选3', _sANhLVkk: 'https://cfxr.eu.org/getSub?_aInOKxtJ=snipaste.huggy.qzz.io', _RfjLwRQD: false, _rJMBDakq: true, _VaOsovrX: 5 },
{ _HeqDRDuj: '官方优选4', _sANhLVkk: 'https://addressesapi.090227.xyz/CloudFlareYes', _RfjLwRQD: false, _rJMBDakq: true, _VaOsovrX: 10 }
]
},
customNodes: {
_rJMBDakq: false,
list: ''
},
texts: {
title: 'Cloudflare IP',
loginButton: '登录',
loginButtonSuccess: '修改参数',
appDownloadTitle: 'APP 下载',
liveTitle: '本次优选结果',
cachedTitle: '上次优选结果',
tableHeader1: '排名',
tableHeader2: 'IP地址',
tableHeader3: '端口',
tableHeader4: '延迟(ms)',
tableHeader5: '归属地',
tableHeader6: '运营商',
tableHeader7: '操作',
pingInProgress: '测试中',
},
colors: {
title: '#FFFFFF',
loginButton: '#E0E0E0',
liveTitle: '#E0E0E0',
cachedTitle: '#E0E0E0',
tableHeader: '#B0B0B0',
},
telegram: {
bot_token: '',
chat_id: '',
},
};
}
function _EhUGVCfa(_EHfTauog, _XuYeraqT) {
if (!_EHfTauog) return _XuYeraqT;
const _LCTzWYeh = { ..._XuYeraqT };
for (const _OTUDyGWY in _XuYeraqT) {
if (_EHfTauog.hasOwnProperty(_OTUDyGWY)) {
if (typeof _EHfTauog[_OTUDyGWY] === 'object' && _EHfTauog[_OTUDyGWY] !== null && !Array.isArray(_EHfTauog[_OTUDyGWY]) && typeof _XuYeraqT[_OTUDyGWY] === 'object' && _XuYeraqT[_OTUDyGWY] !== null && !Array.isArray(_XuYeraqT[_OTUDyGWY])) {
_LCTzWYeh[_OTUDyGWY] = _EhUGVCfa(_EHfTauog[_OTUDyGWY], _XuYeraqT[_OTUDyGWY]);
} else {
_LCTzWYeh[_OTUDyGWY] = _EHfTauog[_OTUDyGWY];
}
}
}
return _LCTzWYeh;
}
async function _SIedooPr(_gnDtYTaE) {
try {
const _fCOuxKFk = _gnDtYTaE.DB.prepare("SELECT _LGCvtlhs FROM kv_data WHERE _OTUDyGWY = ?").bind(_JhtjABgx);
const { _pDCRnmIR } = await _fCOuxKFk.all();
const _DABAxZcZ = _pDCRnmIR._hULmtWZd > 0 ? _pDCRnmIR[0]._LGCvtlhs : null;
const _EjtobwJl = _DABAxZcZ ? JSON.parse(_DABAxZcZ) : {};
return _EhUGVCfa(_EjtobwJl, _tcqsilWU());
} catch (_sugNPZYC) {
console.error("无法从D1获取或解析全局配置:", _sugNPZYC);
return _tcqsilWU();
}
}
async function _bRDmZiUQ(_gnDtYTaE) {
const _uDcMHtil = await _SIedooPr(_gnDtYTaE);
return _NJQrQJNY(_uDcMHtil);
}
async function _kcgcVmQX(_XGJBKndq, _gnDtYTaE, _SPmugbmv) {
try {
const { _uDcMHtil, adminPassword } = await _XGJBKndq.json();
const _NeCLjVYH = await _wHMZZWnN(_gnDtYTaE);
if (_NeCLjVYH !== adminPassword) {
return _NJQrQJNY({ success: false, _YTdPNKnz: "管理员密码错误" }, 403);
}
const _fCOuxKFk = _gnDtYTaE.DB.prepare(
"INSERT INTO kv_data (_OTUDyGWY, _LGCvtlhs) VALUES (?, ?) ON CONFLICT(_OTUDyGWY) DO UPDATE SET _LGCvtlhs = excluded._LGCvtlhs"
);
const _VIHYjieU = _fCOuxKFk.bind(_JhtjABgx, JSON.stringify(_uDcMHtil)).run();
_SPmugbmv.waitUntil(_VIHYjieU);
return _NJQrQJNY({ success: true, _YTdPNKnz: "配置已成功保存!" });
} catch (_sugNPZYC) {
return _NJQrQJNY({ success: false, _YTdPNKnz: `保存失败: ${_sugNPZYC._YTdPNKnz}` }, 500);
}
}
async function _uCFDoInt() {
const _jgetXXUB = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _QSXpoUNZ = await fetch(_jgetXXUB);
const _woaAvOup = await _QSXpoUNZ.json();
const _TpVdgtOz = 'https://www.bing.com' + _woaAvOup.images[0]._neIZDFkh;
return fetch(_TpVdgtOz);
} catch (_sugNPZYC) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _MDPzuKet(_TpqChJIA) {
try {
const _beLZaIOG = await fetch(`http://_TpqChJIA-api.com/json/${_TpqChJIA}?fields=status,_mBnSFJLc,countryCode,_XxNWsdkK&lang=zh-CN`);
if (_beLZaIOG.ok) {
const _bOtVdpEl = await _beLZaIOG.json();
if (_bOtVdpEl.status === 'success' && (_bOtVdpEl.countryCode || _bOtVdpEl._mBnSFJLc)) {
let _XxNWsdkK = _bOtVdpEl._XxNWsdkK || '未知';
if (_XxNWsdkK.toLowerCase().includes('cloudflare')) {
_XxNWsdkK = 'CloudFlare';
}
return {
_HeqDRDuj: _AMxKVKvD[_bOtVdpEl.countryCode] || _bOtVdpEl._mBnSFJLc || _bOtVdpEl.countryCode,
_XxNWsdkK: _XxNWsdkK
};
}
}
} catch (_sugNPZYC) {}
try {
const _beLZaIOG = await fetch(`https://api._TpqChJIA.sb/geoip/${_TpqChJIA}`);
if (_beLZaIOG.ok) {
const _bOtVdpEl = await _beLZaIOG.json();
if (_bOtVdpEl.country_code || _bOtVdpEl._mBnSFJLc) {
let _XxNWsdkK = _bOtVdpEl._XxNWsdkK || '未知';
if (_XxNWsdkK.toLowerCase().includes('cloudflare')) {
_XxNWsdkK = 'CloudFlare';
}
return {
_HeqDRDuj: _AMxKVKvD[_bOtVdpEl.country_code] || _bOtVdpEl._mBnSFJLc || _bOtVdpEl.country_code,
_XxNWsdkK: _XxNWsdkK
};
}
}
} catch (_sugNPZYC) {}
return { _HeqDRDuj: '未知', _XxNWsdkK: '未知' };
}
async function _nMNegcoI(_XGJBKndq, _gnDtYTaE) {
try {
const { _sANhLVkk } = await _XGJBKndq.json();
if (!Array.isArray(_sANhLVkk)) {
return _NJQrQJNY({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _bpGZjYoU = _sANhLVkk.map(_TpqChJIA => _MDPzuKet(_TpqChJIA).then(_FmryGhJF => ({ _TpqChJIA, ..._FmryGhJF })));
const _pDCRnmIR = await Promise.all(_bpGZjYoU);
return _NJQrQJNY(_pDCRnmIR);
} catch (_sugNPZYC) {
return _NJQrQJNY({ error: `获取地理位置失败: ${_sugNPZYC._YTdPNKnz}` }, 500);
}
}
async function _QWRiIhsF(_XGJBKndq, _gnDtYTaE) {
const _uDcMHtil = await _SIedooPr(_gnDtYTaE);
if (!_uDcMHtil.cloudStorage._rJMBDakq) {
return _NJQrQJNY({ _pDCRnmIR: [], generatedBy: null });
}
try {
const _fCOuxKFk = _gnDtYTaE.DB.prepare("SELECT _LGCvtlhs FROM kv_data WHERE _OTUDyGWY = ?").bind(_bTBVQrzN);
const { _pDCRnmIR } = await _fCOuxKFk.all();
const _cWpJjRFH = _pDCRnmIR._hULmtWZd > 0 ? _pDCRnmIR[0]._LGCvtlhs : null;
const _DPKgtRnj = _cWpJjRFH ? JSON.parse(_cWpJjRFH) : null;
return _NJQrQJNY(_DPKgtRnj || { _pDCRnmIR: [], generatedBy: null });
} catch (_sugNPZYC) {
console.error("从D1读取缓存IP失败:", _sugNPZYC);
return _NJQrQJNY({ _pDCRnmIR: [], generatedBy: null });
}
}
async function _VWTSkfAz(_XGJBKndq, _gnDtYTaE, _SPmugbmv) {
const _uDcMHtil = await _SIedooPr(_gnDtYTaE);
if (!_uDcMHtil.cloudStorage._rJMBDakq) {
return _NJQrQJNY({ success: true, _YTdPNKnz: "云端存储已禁用,不保存结果。" });
}
const _XzseujHI = _XGJBKndq._aMnzGgJt.get('CF-Connecting-IP') || "未知IP";
const _mBnSFJLc = _XGJBKndq.cf?._mBnSFJLc || "未知";
const _IVJWkqMh = _XGJBKndq.cf?._IVJWkqMh || "";
let _vxCdVrwT = _AMxKVKvD[_mBnSFJLc] || _mBnSFJLc;
if (_IVJWkqMh && _IVJWkqMh !== "未知城市" && _IVJWkqMh !== _mBnSFJLc) _vxCdVrwT = `${_vxCdVrwT} ${_AMxKVKvD[_IVJWkqMh] || _IVJWkqMh}`;
const _whgaysFk = {
_TpqChJIA: _EZqnisVl(_XzseujHI),
_HeqDRDuj: _vxCdVrwT.trim(),
time: _lpdZiEek()
};
try {
const _VuvJavRX = await _XGJBKndq.json();
if (!Array.isArray(_VuvJavRX)) return _NJQrQJNY({ error: "无效数据格式" }, 400);
const _LSiolygE = _VuvJavRX.map(_hsOhxMsK => ({
_TpqChJIA: String(_hsOhxMsK._TpqChJIA || ''),
_UHkhXIIB: _hsOhxMsK._UHkhXIIB ? parseInt(_hsOhxMsK._UHkhXIIB, 10) : undefined,
_YBsbdRnY: parseInt(_hsOhxMsK._YBsbdRnY, 10),
_HeqDRDuj: typeof _hsOhxMsK._HeqDRDuj === 'string' ? _hsOhxMsK._HeqDRDuj.substring(0, 50) : 'N/A',
_XxNWsdkK: typeof _hsOhxMsK._XxNWsdkK === 'string' ? _hsOhxMsK._XxNWsdkK.substring(0, 100) : 'N/A'
}));
const _OqEDPNfa = {
generatedBy: _whgaysFk,
_pDCRnmIR: _LSiolygE
};
const _RcSzUwfg = _gnDtYTaE.DB.prepare(
"INSERT INTO kv_data (_OTUDyGWY, _LGCvtlhs) VALUES (?, ?) ON CONFLICT(_OTUDyGWY) DO UPDATE SET _LGCvtlhs = excluded._LGCvtlhs"
).bind(_bTBVQrzN, JSON.stringify(_OqEDPNfa)).run();
if (_uDcMHtil.telegram.bot_token && _uDcMHtil.telegram.chat_id) {
const _PTcdnfHH = _LSiolygE.map(r => `${r._TpqChJIA} ~ ${r._HeqDRDuj}`).join('\n');
const _UmQTfyyq = `优选完成!\n来源: ${_whgaysFk._TpqChJIA} (${_whgaysFk._HeqDRDuj})\n时间: ${_whgaysFk.time}\n\n结果:\n${_PTcdnfHH}`;
const _kZTtNHLE = `https://api.telegram.org/bot${_uDcMHtil.telegram.bot_token}/sendMessage?chat_id=${_uDcMHtil.telegram.chat_id}&_EzJRFwvv=${encodeURIComponent(_UmQTfyyq)}`;
const _IzTaZCEf = fetch(_kZTtNHLE).catch(_sugNPZYC => console.error("Telegram结果通知失败:", _sugNPZYC));
_SPmugbmv.waitUntil(Promise.all([_RcSzUwfg, _IzTaZCEf]));
} else {
_SPmugbmv.waitUntil(_RcSzUwfg);
}
return _NJQrQJNY({ success: true, _YTdPNKnz: "结果已保存" });
} catch (_sugNPZYC) {
return _NJQrQJNY({ error: "D1写入失败", _YTdPNKnz: _sugNPZYC._YTdPNKnz }, 500);
}
}
async function _VpgBRavH(_XGJBKndq, _gnDtYTaE, _SPmugbmv) {
try {
const _cTIFXBAM = await _XGJBKndq.json();
if (!Array.isArray(_cTIFXBAM)) return _NJQrQJNY({ error: "无效数据格式" }, 400);
const _OqEDPNfa = {
_pDCRnmIR: _cTIFXBAM
};
const _fCOuxKFk = _gnDtYTaE.DB.prepare(
"INSERT INTO kv_data (_OTUDyGWY, _LGCvtlhs) VALUES (?, ?) ON CONFLICT(_OTUDyGWY) DO UPDATE SET _LGCvtlhs = excluded._LGCvtlhs"
);
const _VIHYjieU = _fCOuxKFk.bind(_AXivKCAa, JSON.stringify(_OqEDPNfa)).run();
_SPmugbmv.waitUntil(_VIHYjieU);
return _NJQrQJNY({ success: true });
} catch (_sugNPZYC) {
return _NJQrQJNY({ error: "D1写入临时缓存失败", _YTdPNKnz: _sugNPZYC._YTdPNKnz }, 500);
}
}
function _bMsrggGm(_hULmtWZd, _cirgQyyn) {
let _ayIJxOnn = '';
const _GiOylIRt = _cirgQyyn._hULmtWZd;
for (let _sIcEaSPD = 0; _sIcEaSPD < _hULmtWZd; _sIcEaSPD++) {
_ayIJxOnn += _cirgQyyn.charAt(Math.floor(Math.random() * _GiOylIRt));
}
return _ayIJxOnn;
}
async function _SnIixprl(_XGJBKndq, _gnDtYTaE) {
try {
const _VuvJavRX = await _XGJBKndq.json();
if (!Array.isArray(_VuvJavRX) || _VuvJavRX._hULmtWZd === 0) {
return _NJQrQJNY({ error: "无效或空的IP列表" }, 400);
}
const _uDcMHtil = await _SIedooPr(_gnDtYTaE);
const _DXHnmjWC = _uDcMHtil.subscriptionId || { _hULmtWZd: 8, _cirgQyyn: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _yyqZyLKj;
let _EVPGvyQG = false;
let _eExqyOOa = 0;
const _FVoCIhqJ = 10;
while (!_EVPGvyQG && _eExqyOOa < _FVoCIhqJ) {
_yyqZyLKj = _bMsrggGm(_DXHnmjWC._hULmtWZd, _DXHnmjWC._cirgQyyn);
const { _pDCRnmIR } = await _gnDtYTaE.DB.prepare("SELECT _GyPFIRMn FROM optimized_results WHERE _GyPFIRMn = ?").bind(_yyqZyLKj).all();
if (_pDCRnmIR._hULmtWZd === 0) {
_EVPGvyQG = true;
}
_eExqyOOa++;
}
if (!_EVPGvyQG) {
return _NJQrQJNY({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _ObOhivUN = JSON.stringify({ _sANhLVkk: _VuvJavRX });
await _gnDtYTaE.DB.prepare(
"INSERT INTO optimized_results (_GyPFIRMn, _bOtVdpEl) VALUES (?, ?)"
).bind(_yyqZyLKj, _ObOhivUN).run();
await _gnDtYTaE.DB.prepare(
"INSERT INTO kv_data (_OTUDyGWY, _LGCvtlhs) VALUES (?, ?) ON CONFLICT(_OTUDyGWY) DO UPDATE SET _LGCvtlhs = excluded._LGCvtlhs"
).bind(_bjTqVAMh, _yyqZyLKj).run();
return _NJQrQJNY({ success: true, _GyPFIRMn: _yyqZyLKj });
} catch (_sugNPZYC) {
return _NJQrQJNY({ error: "保存优选结果失败", _YTdPNKnz: _sugNPZYC._YTdPNKnz }, 500);
}
}
async function _tpPRfpiI(_XGJBKndq, _gnDtYTaE) {
try {
const _yyqZyLKj = _XGJBKndq._DNbWYtbf._GyPFIRMn;
if (!_yyqZyLKj) {
return new Response("缺少结果ID", { status: 400 });
}
const _ayIJxOnn = await _gnDtYTaE.DB.prepare("SELECT _bOtVdpEl FROM optimized_results WHERE _GyPFIRMn = ?").bind(_yyqZyLKj).first();
if (!_ayIJxOnn) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _bOtVdpEl = JSON.parse(_ayIJxOnn._bOtVdpEl);
let _PTcdnfHH = _bOtVdpEl._sANhLVkk;
const _uDcMHtil = await _SIedooPr(_gnDtYTaE);
if (_uDcMHtil.customNodes && _uDcMHtil.customNodes._rJMBDakq && _uDcMHtil.customNodes.list) {
const _gfVuJVgh = _uDcMHtil.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _EDRziNKL = _gfVuJVgh.map(_mkqXPJmd => {
let _eEPcSHbI = _mkqXPJmd;
let _UHkhXIIB = undefined;
let _zPvxzblP = null;
if (_eEPcSHbI.includes('@')) {
const _sDGcgAjq = _eEPcSHbI.split('@');
_zPvxzblP = _sDGcgAjq.pop();
_eEPcSHbI = _sDGcgAjq.join('@');
}
if (_eEPcSHbI.includes('#')) {
const _sDGcgAjq = _eEPcSHbI.split('#');
const _qyVQHdGg = _sDGcgAjq.pop();
if (!isNaN(_qyVQHdGg) && _qyVQHdGg.trim() !== '') {
_UHkhXIIB = parseInt(_qyVQHdGg, 10);
}
_eEPcSHbI = _sDGcgAjq.join('#');
}
return {
_TpqChJIA: _eEPcSHbI,
_UHkhXIIB: _UHkhXIIB,
_HeqDRDuj: _zPvxzblP || _eEPcSHbI,
_XxNWsdkK: '自定义'
};
});
_PTcdnfHH.unshift(..._EDRziNKL);
}
const { itemLink } = _uDcMHtil;
const _sAlGpHjB = new URL(_XGJBKndq._neIZDFkh)._VRqXoawn;
let _tDMGCxvj;
if (_uDcMHtil.websocketStreamer && _uDcMHtil.websocketStreamer._rJMBDakq) {
if (!itemLink || !itemLink._rJMBDakq || !itemLink._lHQxrIJN || itemLink._lHQxrIJN._hULmtWZd === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_tDMGCxvj = _PTcdnfHH.map((_hsOhxMsK, _ehDrBRbB) => {
let _zPvxzblP;
if (_hsOhxMsK._XxNWsdkK === '自定义') {
_zPvxzblP = `${_ehDrBRbB + 1} - ${_hsOhxMsK._HeqDRDuj}`;
} else {
_zPvxzblP = `${_ehDrBRbB + 1} - ${_hsOhxMsK._HeqDRDuj || '未知'}`;
if (!_hsOhxMsK._XxNWsdkK || !_hsOhxMsK._XxNWsdkK.toLowerCase().includes('cloudflare')) {
_zPvxzblP += '(反代)';
}
}
const _KQyDqCCQ = _kILguhgT.isIPv6(_hsOhxMsK._TpqChJIA) ? `[${_hsOhxMsK._TpqChJIA}]` : _hsOhxMsK._TpqChJIA;
const _UHkhXIIB = _hsOhxMsK._UHkhXIIB || 443;
const _USdiRoiz = itemLink._lHQxrIJN[0];
const _FizWgPmj = _USdiRoiz._siSXvYhd || '';
const _siSXvYhd = (_FizWgPmj && _qzfLIFCV(_FizWgPmj)) ? _FizWgPmj : crypto.randomUUID();
const _gRhCwGEi = '/snippets?_TpqChJIA=endpointAddress:_UHkhXIIB(443)&nat64=6to4';
const _aInOKxtJ = _USdiRoiz._aInOKxtJ || _sAlGpHjB;
const _DNbWYtbf = new URLSearchParams({
security: 'tls',
_sDUkqgEe: 'ws',
_aInOKxtJ: _aInOKxtJ,
sni: _aInOKxtJ,
fp: 'random'
});
return `vless://${_siSXvYhd}@${_KQyDqCCQ}:${_UHkhXIIB}?${_DNbWYtbf.toString()}&_gRhCwGEi=${encodeURIComponent(encodeURIComponent(_gRhCwGEi))}#${encodeURIComponent(_zPvxzblP)}`;
});
} else {
if (!itemLink || !itemLink._rJMBDakq || !itemLink._lHQxrIJN || itemLink._lHQxrIJN._hULmtWZd === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _USdiRoiz = itemLink._lHQxrIJN[0];
const { _aInOKxtJ, _siSXvYhd, _gRhCwGEi } = _USdiRoiz;
_tDMGCxvj = _PTcdnfHH.map((_hsOhxMsK, _ehDrBRbB) => {
let _zPvxzblP;
if (_hsOhxMsK._XxNWsdkK === '自定义') {
_zPvxzblP = `${_ehDrBRbB + 1} - ${_hsOhxMsK._HeqDRDuj}`;
} else {
_zPvxzblP = `${_ehDrBRbB + 1} - ${_hsOhxMsK._HeqDRDuj || '未知'}`;
if (!_hsOhxMsK._XxNWsdkK || !_hsOhxMsK._XxNWsdkK.toLowerCase().includes('cloudflare')) {
_zPvxzblP += '(反代)';
}
}
const _KQyDqCCQ = _kILguhgT.isIPv6(_hsOhxMsK._TpqChJIA) ? `[${_hsOhxMsK._TpqChJIA}]` : _hsOhxMsK._TpqChJIA;
const _UHkhXIIB = _hsOhxMsK._UHkhXIIB || 443;
const _DNbWYtbf = new URLSearchParams({
security: 'tls',
_sDUkqgEe: 'ws',
_aInOKxtJ: _aInOKxtJ || _sAlGpHjB,
sni: _aInOKxtJ || _sAlGpHjB,
fp: 'random'
});
return `vless://${_siSXvYhd}@${_KQyDqCCQ}:${_UHkhXIIB}?${_DNbWYtbf.toString()}&_gRhCwGEi=${encodeURIComponent(encodeURIComponent(_gRhCwGEi || ''))}#${encodeURIComponent(_zPvxzblP)}`;
});
}
const _JSzdMMwX = _tDMGCxvj.join('\n');
const _ivlNSsut = btoa(_JSzdMMwX);
return new Response(_ivlNSsut, {
_aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' }
});
} catch (_sugNPZYC) {
return new Response(`生成节点列表失败: ${_sugNPZYC._YTdPNKnz}`, { status: 500 });
}
}
async function _PylGRTCT(_XGJBKndq) {
try {
const { _NJvXsUik, _sDUkqgEe } = await _XGJBKndq.json();
if (!Array.isArray(_NJvXsUik)) {
return new Response('Invalid _NJvXsUik list', { status: 400 });
}
const _rtSpCLlb = _NJvXsUik.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _neIZDFkh = `https://cloudflare-dns.com/dns-query?_zPvxzblP=${encodeURIComponent(domain.trim())}&_sDUkqgEe=${_sDUkqgEe || 'A'}`;
return fetch(_neIZDFkh, { _aMnzGgJt: { 'Accept': 'application/dns-json' } })
.then(_beLZaIOG => _beLZaIOG.json())
.then(_bOtVdpEl => (_bOtVdpEl.Answer ? _bOtVdpEl.Answer.map(a => a._bOtVdpEl) : []))
.catch(() => []);
});
const _bMomannd = (await Promise.all(_rtSpCLlb)).flat();
const _NUqnOiaD = [...new Set(_bMomannd)];
if (_NUqnOiaD._hULmtWZd === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_NUqnOiaD.join('\n'), { _aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._YTdPNKnz}`, { status: 500 });
}
}
async function _hbBjDOiJ(_XGJBKndq, _gnDtYTaE) {
try {
const { _ScjbkpWe } = await _XGJBKndq.json();
if (!Array.isArray(_ScjbkpWe)) {
return _NJQrQJNY({ error: "Invalid input, expected an object with a '_ScjbkpWe' array." }, 400);
}
const _nYOsWgEE = new Set();
const _TzapUeze = _ScjbkpWe.map(_neIZDFkh =>
_mxMbNVnD(_neIZDFkh)
.then(_EzJRFwvv => {
if (!_EzJRFwvv) return;
const _wsAJkqtv = _EzJRFwvv.split(/[\s,;|]+/);
for (const _bVamEvoI of _wsAJkqtv) {
const _ZuUmstvi = _bVamEvoI.trim();
if (_ZuUmstvi) {
_nYOsWgEE.add(_ZuUmstvi);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_neIZDFkh}:`, err);
})
);
await Promise.all(_TzapUeze);
return _NJQrQJNY({ _sANhLVkk: Array.from(_nYOsWgEE) });
} catch (_sugNPZYC) {
return _NJQrQJNY({ error: `Failed to process URLs: ${_sugNPZYC._YTdPNKnz}` }, 500);
}
}
async function _kKppsMFu(_XGJBKndq, _gnDtYTaE) {
const _uDcMHtil = await _SIedooPr(_gnDtYTaE);
if (!_uDcMHtil.api._rJMBDakq) {
return new Response(_uDcMHtil.api._YTdPNKnz || 'API is disabled.', { status: 503 });
}
try {
const _fCOuxKFk = _gnDtYTaE.DB.prepare("SELECT _LGCvtlhs FROM kv_data WHERE _OTUDyGWY = ?").bind(_bTBVQrzN);
const { _pDCRnmIR: dbResults } = await _fCOuxKFk.all();
const _cWpJjRFH = dbResults._hULmtWZd > 0 ? dbResults[0]._LGCvtlhs : null;
const _DPKgtRnj = _cWpJjRFH ? JSON.parse(_cWpJjRFH) : null;
if (!_DPKgtRnj || !_DPKgtRnj._pDCRnmIR || _DPKgtRnj._pDCRnmIR._hULmtWZd === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' },
});
}
const _sANhLVkk = _DPKgtRnj._pDCRnmIR.map(r => r._TpqChJIA);
return new Response(_sANhLVkk.join('\n'), {
_aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' },
});
} catch (_sugNPZYC) {
console.error("API /_TpqChJIA 处理错误:", _sugNPZYC);
return new Response(`API处理时出错: ${_sugNPZYC._YTdPNKnz}`, { status: 500 });
}
}
function _hDSDymHL(_ayIJxOnn, _ehDrBRbB, _uDcMHtil, _sAlGpHjB) {
const { itemLink } = _uDcMHtil;
if (!itemLink || !itemLink._rJMBDakq) return null;
const { template, _lHQxrIJN, selectionMode, _MaogDPUR } = itemLink;
if (!_lHQxrIJN || _lHQxrIJN._hULmtWZd === 0) return null;
let _YsdYNAcY;
if (selectionMode === 'random') {
_YsdYNAcY = _lHQxrIJN[_ehDrBRbB % _lHQxrIJN._hULmtWZd];
} else if (selectionMode === 'first') {
_YsdYNAcY = _lHQxrIJN[0];
} else {
_YsdYNAcY = _lHQxrIJN.find(s => s._zPvxzblP === selectionMode) || _lHQxrIJN[0];
}
if (!_YsdYNAcY) return null;
let _MdcJJzio = template;
const _amwQNqjT = _ayIJxOnn._UHkhXIIB || 443;
const _kLgUXCON = _kILguhgT.isIPv6(_ayIJxOnn._TpqChJIA) ? `[${_ayIJxOnn._TpqChJIA}]` : _ayIJxOnn._TpqChJIA;
let _zPvxzblP = `${_ehDrBRbB + 1} 、 ${_ayIJxOnn._HeqDRDuj || '未知'}`;
if (!_ayIJxOnn._XxNWsdkK || !_ayIJxOnn._XxNWsdkK.toLowerCase().includes('cloudflare')) {
_zPvxzblP += '(反代)';
}
let _aInOKxtJ = _YsdYNAcY._aInOKxtJ || _sAlGpHjB;
_MdcJJzio = _MdcJJzio.replace(/{_TpqChJIA}/g, _kLgUXCON)
.replace(/{_UHkhXIIB}/g, _amwQNqjT)
.replace(/{_zPvxzblP}/g, encodeURIComponent(_zPvxzblP))
.replace(/{rank}/g, _ehDrBRbB + 1)
.replace(/{_HeqDRDuj}/g, encodeURIComponent(_ayIJxOnn._HeqDRDuj || '未知'))
.replace(/{_XxNWsdkK}/g, encodeURIComponent(_ayIJxOnn._XxNWsdkK || '未知'))
.replace(/{_aInOKxtJ}/g, encodeURIComponent(_aInOKxtJ))
.replace(/{_siSXvYhd}/g, encodeURIComponent(_YsdYNAcY['_siSXvYhd'] || ''))
.replace(/{_gRhCwGEi}/g, encodeURIComponent(encodeURIComponent(_YsdYNAcY._gRhCwGEi || '')));
if (_MaogDPUR) {
_MaogDPUR.forEach(field => {
const _EIbEPkBa = new RegExp('{' + field._zPvxzblP + '}', 'g');
_MdcJJzio = _MdcJJzio.replace(_EIbEPkBa, encodeURIComponent(field._LGCvtlhs));
});
}
return _MdcJJzio;
}
async function _HdXseHZX(_XGJBKndq, _gnDtYTaE) {
const _uDcMHtil = await _SIedooPr(_gnDtYTaE);
if (!_uDcMHtil.itemLink._rJMBDakq) {
return new Response("Item _MdcJJzio feature is disabled.", { status: 503, _aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' } });
}
try {
const _fCOuxKFk = _gnDtYTaE.DB.prepare("SELECT _LGCvtlhs FROM kv_data WHERE _OTUDyGWY = ?").bind(_bTBVQrzN);
const { _pDCRnmIR: dbResults } = await _fCOuxKFk.all();
const _cWpJjRFH = dbResults._hULmtWZd > 0 ? dbResults[0]._LGCvtlhs : null;
const _DPKgtRnj = _cWpJjRFH ? JSON.parse(_cWpJjRFH) : null;
if (!_DPKgtRnj || !_DPKgtRnj._pDCRnmIR || _DPKgtRnj._pDCRnmIR._hULmtWZd === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' },
});
}
const _sAlGpHjB = new URL(_XGJBKndq._neIZDFkh)._VRqXoawn;
const _lXTJwVDY = _DPKgtRnj._pDCRnmIR.map((_ayIJxOnn, _ehDrBRbB) => {
return _hDSDymHL(_ayIJxOnn, _ehDrBRbB, _uDcMHtil, _sAlGpHjB);
}).filter(Boolean);
if (_lXTJwVDY._hULmtWZd === 0) {
return new Response("Could not generate any _hsOhxMsK links from the available IPs.", {
status: 500,
_aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' },
});
}
return new Response(_lXTJwVDY.join('\n'), {
_aMnzGgJt: { 'Content-Type': '_EzJRFwvv/plain; _cirgQyyn=utf-8' },
});
} catch (_sugNPZYC) {
console.error("API /api/endpoints error:", _sugNPZYC);
return new Response(`Error processing API _XGJBKndq: ${_sugNPZYC._YTdPNKnz}`, { status: 500 });
}
}
async function _LdNlQiHe(_XGJBKndq, _gnDtYTaE, _SPmugbmv) {
const _XzseujHI = _XGJBKndq._aMnzGgJt.get('CF-Connecting-IP') || "未知IP";
const [
_mldMlRHV,
_YYLvBHMQ,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_NSDpVUax(_NvUVVgBd, _bTovdbBa, []),
_NSDpVUax(_tQXXoHKv, _bTovdbBa, []),
_NSDpVUax(_oZcZWvhV, _fiNQOlmA, []),
_NSDpVUax(_WTCDeboL, _njYWWbwE, { "N/A": "未知" })
]);
_AMxKVKvD = fetchedCountryMap;
let _zHTKbjUt = false;
let _RIKpaFOu;
try {
const _zFrvUuLy = await _wHMZZWnN(_gnDtYTaE);
_zHTKbjUt = !!_zFrvUuLy;
_RIKpaFOu = await _SIedooPr(_gnDtYTaE);
} catch (_sugNPZYC) {
if (_sugNPZYC._YTdPNKnz && _sugNPZYC._YTdPNKnz.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _jwHfsGDO = "CREATE TABLE IF NOT EXISTS kv_data (_OTUDyGWY TEXT PRIMARY KEY, _LGCvtlhs TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_GyPFIRMn TEXT PRIMARY KEY, _bOtVdpEl TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _gnDtYTaE.DB.exec(_jwHfsGDO);
console.log("数据表创建成功。");
_zHTKbjUt = false;
_RIKpaFOu = _tcqsilWU();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._YTdPNKnz}`, {
status: 500,
_aMnzGgJt: { 'Content-Type': '_EzJRFwvv/html;_cirgQyyn=UTF-8' }
});
}
} else {
let _mIFARayd = _frHZrkjp(_sugNPZYC._YTdPNKnz);
return new Response(_mIFARayd, { _aMnzGgJt: { 'Content-Type': '_EzJRFwvv/html;_cirgQyyn=UTF-8' } });
}
}
if (_RIKpaFOu.telegram.bot_token && _RIKpaFOu.telegram.chat_id) {
const _mBnSFJLc = _XGJBKndq.cf?._mBnSFJLc || "未知";
const _IVJWkqMh = _XGJBKndq.cf?._IVJWkqMh || "";
let _vxCdVrwT = _AMxKVKvD[_mBnSFJLc] || _mBnSFJLc;
if (_IVJWkqMh && _IVJWkqMh !== "未知城市" && _IVJWkqMh !== _mBnSFJLc) _vxCdVrwT = `${_vxCdVrwT} ${_AMxKVKvD[_IVJWkqMh] || _IVJWkqMh}`;
const _pPZYRwCt = _lpdZiEek();
const _JGGTAWsy = _XGJBKndq._neIZDFkh;
const _UmQTfyyq = `访客: ${_XzseujHI}\n位置: ${_vxCdVrwT.trim()}\n时间: ${_pPZYRwCt}\n来自:${_JGGTAWsy}`;
const _kZTtNHLE = `https://api.telegram.org/bot${_RIKpaFOu.telegram.bot_token}/sendMessage?chat_id=${_RIKpaFOu.telegram.chat_id}&_EzJRFwvv=${encodeURIComponent(_UmQTfyyq)}`;
_SPmugbmv.waitUntil(fetch(_kZTtNHLE).catch(_sugNPZYC => console.error("Telegram通知失败:", _sugNPZYC)));
}
let _sBBhaJnN = _LyRqGyVN();
const _LMyRDhHf = {
_uDcMHtil: _RIKpaFOu,
status: {
_zHTKbjUt: _zHTKbjUt,
}
};
_sBBhaJnN = _sBBhaJnN.replace('__PAGE_DATA_JSON__', JSON.stringify(_LMyRDhHf));
_sBBhaJnN = _sBBhaJnN.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_mldMlRHV));
_sBBhaJnN = _sBBhaJnN.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_YYLvBHMQ));
_sBBhaJnN = _sBBhaJnN.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_sBBhaJnN = _sBBhaJnN.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_AMxKVKvD));
return new Response(_sBBhaJnN, {
_aMnzGgJt: { 'Content-Type': '_EzJRFwvv/html;_cirgQyyn=UTF-8' },
});
}
function _NJQrQJNY(_ojvKXSbG, status = 200, _aMnzGgJt = {}) {
return new Response(JSON.stringify(_ojvKXSbG), {
status,
_aMnzGgJt: { 'Content-Type': 'application/json;_cirgQyyn=UTF-8', ..._aMnzGgJt }
});
}
function _lpdZiEek(date = new Date()) {
return new Intl.DateTimeFormat('zh-CN', {
timeZone: 'Asia/Shanghai',
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false
}).format(date);
}
function _EZqnisVl(_TpqChJIA) {
if (!_TpqChJIA || typeof _TpqChJIA !== 'string') return "无效IP";
if(_kILguhgT.isIPv4(_TpqChJIA)){
const _sDGcgAjq = _TpqChJIA.split('.');
if (_sDGcgAjq._hULmtWZd === 4) return `${_sDGcgAjq[0]}.*.*.${_sDGcgAjq[3]}`;
}
if(_kILguhgT.isIPv6(_TpqChJIA)){
const _sDGcgAjq = _TpqChJIA.split(':');
if (_sDGcgAjq._hULmtWZd > 2) return `${_sDGcgAjq[0]}:...:${_sDGcgAjq[_sDGcgAjq._hULmtWZd - 1]}`;
}
return _TpqChJIA;
}
function _frHZrkjp(_vEazqbyk) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _cirgQyyn="UTF-8"><title>需要设置</title>
<_dRjNiHDs>
_ojvKXSbG { font-family: sans-serif; background: #1a1a1a; _pbjLqbNp: #e0e0e0; display: flex; justify-_VRKwRssO: center; align-items: center; height: 100vh; margin: 0; }
._NsYeLBvZ { max-_fKqLfMHn: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _pbjLqbNp: #00a0ff; border-bottom: 1px solid #40444c; padding-bottom: 0.5rem; }
p { line-height: 1.6; }
code { background: #1a1a1a; padding: 0.2em 0.4em; border-radius: 4px; font-family: monospace; white-space: pre-wrap; word-break: break-all; }
.error { _pbjLqbNp: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_VEisuVtB: 1rem; }
</_dRjNiHDs>
</head><_ojvKXSbG>
<div class="_NsYeLBvZ">
<h1>部署指南</h1>
<p>系统检测到 D1 数据库绑定存在问题。请确保您已完成以下步骤:</p>
<ol>
<li>进入 Cloudflare Dashbord -> Workers & Pages -> D1。</li>
<li>创建一个新的D1数据库 (如果还没有)。</li>
<li>将此数据库绑定到您的Worker:
<ul>
<li>进入Worker设置 -> 变量 -> D1数据库绑定。</li>
<li>变量名必须填写 <code>DB</code>。</li>
<li>选择您刚创建的数据库。</li>
<li>点击“保存并部署”。</li>
</ul>
</li>
</ol>
<p>完成以上步骤后,请刷新本页面。系统会自动为您创建所需的数据表。</p>
${_vEazqbyk ? `<div class="error"><strong>当前错误信息:</strong> ${_vEazqbyk.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_ojvKXSbG></html>`;
}
function _LyRqGyVN() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _cirgQyyn="UTF-8"> <meta _zPvxzblP="viewport" _VRKwRssO="_fKqLfMHn=device-_fKqLfMHn, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_MdcJJzio href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Noto+Sans+SC:wght@400;500;700&family=Roboto+Mono:wght@400;500&display=swap" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/qrcode-generator/qrcode.js"></script>
<_dRjNiHDs>
:root { --primary-_pbjLqbNp: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_pbjLqbNp: #8c939d; --light-bg: #1A1C20; --_VRKwRssO-bg: #25282E; --border-_pbjLqbNp: #40444C; --_EzJRFwvv-_pbjLqbNp: #E0E0E0; --_EzJRFwvv-light: #B0B0B0; --success-_pbjLqbNp: #30A46C; --danger-_pbjLqbNp: #DA3633; --warning-_pbjLqbNp: #DBAB0A; --border-radius-md: 8px; --border-radius-sm: 6px; --font-family-sans: 'Inter', 'Noto Sans SC', sans-serif; --font-family-mono: 'Roboto Mono', monospace; }
* { margin: 0; padding: 0; box-sizing: border-box; }
html { font-size: 16px; }
_ojvKXSbG { font-family: var(--font-family-sans); background-_pbjLqbNp: var(--light-bg); _pbjLqbNp: var(--_EzJRFwvv-_pbjLqbNp); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_pbjLqbNp 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_ZWbqinaP { position: fixed; _VEisuVtB: 0; _lPyIGuDY: 0; _fKqLfMHn: 100%; height: 100%; z-_ehDrBRbB: -1; display: none; }
._xdQxKHiD-_NsYeLBvZ { max-_fKqLfMHn: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_ehDrBRbB: 1; }
#_WSjHKIMj { position: fixed; _VEisuVtB: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_ehDrBRbB: 10; }
#marquee-_NsYeLBvZ { overflow: hidden; white-space: nowrap; background-_pbjLqbNp: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _pbjLqbNp: var(--primary-_pbjLqbNp); padding: 0.5rem 0; margin-_VEisuVtB: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_EzJRFwvv { display: inline-block; padding-_lPyIGuDY: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_kqBWvLWy { _EzJRFwvv-align: center; margin-_VEisuVtB: 1rem; margin-bottom: 2rem; }
_kqBWvLWy h1 { white-space: pre-wrap; font-size: 2.25em; _pbjLqbNp: var(--primary-_pbjLqbNp); font-weight: 700; _EzJRFwvv-shadow: 0 0 10px rgba(var(--primary-_pbjLqbNp-rgb), 0.3); }
.card { background-_pbjLqbNp: rgba(37, 40, 46, 0.85); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); border-radius: var(--border-radius-md); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25); padding: 1.5rem; margin-bottom: 1.5rem; border: 1px solid var(--border-_pbjLqbNp); }
.progress-section #_EkJfuZlG { _fKqLfMHn: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_pbjLqbNp: var(--border-_pbjLqbNp); overflow: hidden; }
.progress-section #_EkJfuZlG::-webkit-progress-_LGCvtlhs { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _EzJRFwvv-align: center; margin-_VEisuVtB: 0.75em; font-size: 0.95em; _pbjLqbNp: var(--_EzJRFwvv-light); min-height: 1.5em; }
.section-_kqBWvLWy { display: flex; flex-wrap: wrap; justify-_VRKwRssO: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_pbjLqbNp); gap: 1rem; }
.section-_kqBWvLWy h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _pbjLqbNp: var(--secondary-_pbjLqbNp); _EzJRFwvv-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _fKqLfMHn: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _fKqLfMHn: 100%; border-collapse: collapse; margin-_VEisuVtB: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_pbjLqbNp); padding: 0.8em; _EzJRFwvv-align: _lPyIGuDY; vertical-align: middle; white-space: nowrap; }
th { background-_pbjLqbNp: #2c3038; font-weight: 500; }
tbody tr:hover { background-_pbjLqbNp: #30333a; }
td._TpqChJIA-_eEPcSHbI { font-weight: 500; font-family: var(--font-family-mono); _pbjLqbNp: var(--primary-_pbjLqbNp); }
td.ping-_LGCvtlhs { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _EzJRFwvv-align: right; }
.btn { display: inline-flex; align-items: center; justify-_VRKwRssO: center; font-weight: 500; _EzJRFwvv-align: center; cursor: pointer; user-_pNiyjyLL: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _pbjLqbNp: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_lPyIGuDY: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _pbjLqbNp: var(--primary-_pbjLqbNp); border: 1px solid var(--primary-_pbjLqbNp); }
.btn-outline:hover { background-_pbjLqbNp: var(--primary-_pbjLqbNp); _pbjLqbNp: var(--_VRKwRssO-bg); }
._xdQxKHiD-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._xdQxKHiD-download-buttons .btn { _fKqLfMHn: 100%; margin: 0; }
.tooltip-notification { position: fixed; _VEisuVtB: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _pbjLqbNp: #fff; font-size: 0.95em; z-_ehDrBRbB: 10002; box-shadow: 0 6px 15px rgba(0, 0, 0, 0.35); opacity: 0; transform: translateY(-20px); transition: all 0.3s ease; pointer-events: none; }
.tooltip-notification.show { opacity: 1; transform: translateY(0); }
#_twjdYSNU, #_oAAoSZNI, #_hhgaRwlK, #_QzEfOlXn, #_fBKAGlTa { display: none; position: fixed; z-_ehDrBRbB: 10000; _lPyIGuDY: 0; _VEisuVtB: 0; _fKqLfMHn: 100%; height: 100%; background-_pbjLqbNp: rgba(0,0,0,0.6); justify-_VRKwRssO: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_VRKwRssO, ._xdQxKHiD-modal-_VRKwRssO { background-_pbjLqbNp: var(--_VRKwRssO-bg); padding: 2rem; border: 1px solid var(--border-_pbjLqbNp); border-radius: var(--border-radius-md); _fKqLfMHn: 95%; max-_fKqLfMHn: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_QzEfOlXn .modal-_VRKwRssO { max-_fKqLfMHn: 500px; }
.modal-_VRKwRssO h3, ._xdQxKHiD-modal-_kqBWvLWy h3 { margin-_VEisuVtB: 0; margin-bottom: 1.5rem; _pbjLqbNp: var(--primary-_pbjLqbNp); _EzJRFwvv-align: center; }
.modal-buttons { display: flex; justify-_VRKwRssO: flex-end; gap: 1rem; margin-_VEisuVtB: 2rem; border-_VEisuVtB: 1px solid var(--border-_pbjLqbNp); padding-_VEisuVtB: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_pbjLqbNp), rgba(0,0,0,0)); margin: 2rem 0; }
._xdQxKHiD-modal-_kqBWvLWy { display: flex; justify-_VRKwRssO: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_pbjLqbNp); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _pbjLqbNp: var(--_EzJRFwvv-light); cursor: pointer; background: none; border: none; padding: 0; }
._xdQxKHiD-list-_hsOhxMsK { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_pbjLqbNp); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._xdQxKHiD-_zPvxzblP { font-size: 1.1em; font-weight: 600; }
._xdQxKHiD-links a { display: block; _pbjLqbNp: var(--primary-_pbjLqbNp); _EzJRFwvv-decoration: none; margin-_VEisuVtB: 0.5rem; word-break: break-all; }
._xdQxKHiD-links a:hover { _EzJRFwvv-decoration: underline; }
._xdQxKHiD-links span { _pbjLqbNp: var(--_EzJRFwvv-light); }
#visitorPasswordPrompt { _EzJRFwvv-align: center; }
#visitorPasswordPrompt h3 { _pbjLqbNp: var(--primary-_pbjLqbNp); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _pbjLqbNp: var(--_EzJRFwvv-light); margin-bottom: 1.5rem; }
._zFrvUuLy-input-group { display: flex; gap: 10px; max-_fKqLfMHn: 400px; margin: 0 auto; }
._zFrvUuLy-input-group input { flex-grow: 1; _EzJRFwvv-align: center; }
._zFrvUuLy-input-group .btn { margin-_lPyIGuDY: 0; }
._pDCRnmIR-actions-_NsYeLBvZ { _EzJRFwvv-align: center; margin-bottom: 1.5rem; }
._pDCRnmIR-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._pDCRnmIR-api-buttons .btn { margin: 0; _fKqLfMHn: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_VRKwRssO 1fr; gap: 1.2rem 1rem; align-items: center; }
.form-grid-label { justify-self: end; display: flex; align-items: center; gap: 8px; }
.form-grid-control { display: flex; align-items: center; gap: 10px; }
.form-grid-control-full { grid-column: 1 / -1; }
.form-grid-control input, .form-grid-control _pNiyjyLL, .form-grid-control textarea { _fKqLfMHn: 100%; background-_pbjLqbNp: var(--light-bg); border: 1px solid var(--border-_pbjLqbNp); border-radius: var(--border-radius-sm); _pbjLqbNp: var(--_EzJRFwvv-_pbjLqbNp); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_pbjLqbNp 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _pNiyjyLL:focus, .form-grid-control textarea:focus { border-_pbjLqbNp: var(--primary-_pbjLqbNp); box-shadow: 0 0 0 2px rgba(var(--primary-_pbjLqbNp-rgb), 0.2); outline: none; }
.form-grid-control input[_sDUkqgEe="_pbjLqbNp"] { min-_fKqLfMHn: auto; padding: 2px; _fKqLfMHn: 2.5em; height: 2.5em; }
.form-grid-control input[_sDUkqgEe="checkbox"] { _fKqLfMHn: auto; flex-shrink: 0; height: 1.2em; _fKqLfMHn: 1.2em; }
.form-grid-control ._VaOsovrX-input { _fKqLfMHn: 80px; _EzJRFwvv-align: right; }
.tooltip-_IoZUgWzS { display: inline-flex; _fKqLfMHn: 16px; height: 16px; align-items: center; justify-_VRKwRssO: center; background-_pbjLqbNp: var(--secondary-_pbjLqbNp); _pbjLqbNp: var(--_VRKwRssO-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_pNiyjyLL: none; }
#tooltip-popup { position: fixed; background-_pbjLqbNp: #383c4a; _pbjLqbNp: #fff; padding: 10px 15px; border-radius: 6px; z-_ehDrBRbB: 10001; font-size: 0.85em; max-_fKqLfMHn: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_pbjLqbNp); pointer-events: none; }
#custom-fields-_NsYeLBvZ .form-grid-control { gap: 5px; } #custom-fields-_NsYeLBvZ .form-grid-control input { flex: 1; }
.parameter-_ckwwyHgp-_PSlquHjw { border: 1px solid var(--border-_pbjLqbNp); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_ckwwyHgp-_kqBWvLWy { display: flex; justify-_VRKwRssO: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_ckwwyHgp-_kqBWvLWy input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_VEisuVtB: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._EzJRFwvv-_pbjLqbNp-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _fKqLfMHn: 100%; }
._EzJRFwvv-_pbjLqbNp-grid input[_sDUkqgEe="_pbjLqbNp"] { grid-column: 1 / 2; }
._EzJRFwvv-_pbjLqbNp-grid input[_sDUkqgEe="_EzJRFwvv"], ._EzJRFwvv-_pbjLqbNp-grid textarea { grid-column: 2 / 3; }
#_QzEfOlXn .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_QzEfOlXn .btn-group { display: flex; }
#_QzEfOlXn .sub-btn { flex-grow: 1; margin: 0; }
#_QzEfOlXn ._pkkbCCQt-btn { flex-shrink: 0; margin-_lPyIGuDY: -1px; border-_VEisuVtB-_lPyIGuDY-radius: 0; border-bottom-_lPyIGuDY-radius: 0; }
#_fBKAGlTa .modal-_VRKwRssO { max-_fKqLfMHn: 300px; background: white; padding: 1rem; _EzJRFwvv-align: center; }
#qrCodeImg { max-_fKqLfMHn: 100%; }
@media (max-_fKqLfMHn: 768px) {
html { font-size: 15px; } ._xdQxKHiD-_NsYeLBvZ { padding: 0 0.8rem; } _kqBWvLWy { margin-_VEisuVtB: 2.5rem; margin-bottom: 1.5rem; } #_WSjHKIMj { _VEisuVtB: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_dRjNiHDs>
<_dRjNiHDs _GyPFIRMn="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_VRKwRssO-bg: #FFFFFF; --border-_pbjLqbNp: #DCDFE6; --_EzJRFwvv-_pbjLqbNp: #303133; --_EzJRFwvv-light: #606266; }
.theme-light .card { background-_pbjLqbNp: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_pbjLqbNp: #F5F7FA; }
.theme-light tbody tr:hover { background-_pbjLqbNp: #ECF5FF; }
.theme-matrix { --primary-_pbjLqbNp: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_VRKwRssO-bg: #0D0208; --border-_pbjLqbNp: #00FF41; --_EzJRFwvv-_pbjLqbNp: #00FF41; --_EzJRFwvv-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_pbjLqbNp: rgba(0, 20, 0, 0.7); _EzJRFwvv-shadow: 0 0 5px var(--primary-_pbjLqbNp); backdrop-filter: none; }
.theme-matrix th { background-_pbjLqbNp: #000; }
.theme-matrix tbody tr:hover { background-_pbjLqbNp: #010; }
.theme-matrix .btn { _EzJRFwvv-shadow: none; _pbjLqbNp: #000; }
.theme-matrix .btn-outline { background-_pbjLqbNp: transparent; }
.theme-modern-glass { --primary-_pbjLqbNp: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_VRKwRssO-bg: rgba(30, 30, 40, 0.6); --border-_pbjLqbNp: rgba(255, 255, 255, 0.2); --_EzJRFwvv-_pbjLqbNp: #F0F0F0; --_EzJRFwvv-light: #A0A0B0; --border-radius-md: 12px; }
_ojvKXSbG.theme-modern-glass { background: linear-gradient(-45deg, #000428, #004e92, #1CB5E0, #23D5AB); background-size: 400% 400%; animation: gradientBG 15s ease infinite; }
@keyframes gradientBG { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } }
.theme-particles-glass { --primary-_pbjLqbNp: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_VRKwRssO-bg: rgba(30, 30, 40, 0.6); --border-_pbjLqbNp: rgba(255, 255, 255, 0.2); --_EzJRFwvv-_pbjLqbNp: #F0F0F0; --_EzJRFwvv-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_pbjLqbNp: var(--_VRKwRssO-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_pbjLqbNp); }
.glassy-components .btn { background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid rgba(255, 255, 255, 0.2); border-bottom-_pbjLqbNp: rgba(0,0,0,0.3); border-right-_pbjLqbNp: rgba(0,0,0,0.3); box-shadow: 0 4px 15px rgba(0,0,0,0.2), inset 0 1px 1px rgba(255,255,255,0.1); _EzJRFwvv-shadow: 0 1px 2px rgba(0,0,0,0.2); _pbjLqbNp: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_pbjLqbNp: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _EzJRFwvv-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_pbjLqbNp); border-_pbjLqbNp: var(--primary-_pbjLqbNp); _pbjLqbNp: #fff; }
.glassy-components _kqBWvLWy h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _EzJRFwvv; -webkit-_EzJRFwvv-fill-_pbjLqbNp: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _pbjLqbNp: transparent; }
.theme-aurora-glass { --primary-_pbjLqbNp: #38bdf8; --light-bg: #0c0a09; --_VRKwRssO-bg: rgba(23, 23, 23, 0.5); --border-_pbjLqbNp: rgba(255, 255, 255, 0.15); --_EzJRFwvv-_pbjLqbNp: #f2f2f2; --_EzJRFwvv-light: #a3a3a3; }
_ojvKXSbG.theme-aurora-glass::before { _VRKwRssO: ''; position: fixed; _VEisuVtB: 0; _lPyIGuDY: 0; _fKqLfMHn: 100%; height: 100%; z-_ehDrBRbB: -2; background: radial-gradient(at 27% 37%, hsla(215, 98%, 61%, 0.4) 0px, transparent 50%), radial-gradient(at 97% 21%, hsla(125, 98%, 72%, 0.2) 0px, transparent 50%), radial-gradient(at 52% 99%, hsla(355, 98%, 76%, 0.3) 0px, transparent 50%), radial-gradient(at 10% 29%, hsla(256, 96%, 68%, 0.3) 0px, transparent 50%), radial-gradient(at 97% 96%, hsla(38, 60%, 74%, 0.2) 0px, transparent 50%), radial-gradient(at 33% 50%, hsla(222, 67%, 73%, 0.3) 0px, transparent 50%), radial-gradient(at 79% 53%, hsla(343, 68%, 73%, 0.2) 0px, transparent 50%); animation: auroraBG 20s ease-in-out infinite alternate; }
@keyframes auroraBG { from { transform: scale(1); } to { transform: scale(1.5); } }
.theme-cyberpunk-glass { --primary-_pbjLqbNp: #08fdd8; --light-bg: #010409; --_VRKwRssO-bg: rgba(22, 27, 34, 0.6); --border-_pbjLqbNp: rgba(139, 148, 158, 0.3); --_EzJRFwvv-_pbjLqbNp: #e6edf3; --_EzJRFwvv-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_pbjLqbNp), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_pbjLqbNp-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_pbjLqbNp-rgb), 0.5); }
.theme-marble-light { --primary-_pbjLqbNp: #bfa37c; --light-bg: #f7f5f2; --_VRKwRssO-bg: #ffffff; --border-_pbjLqbNp: #e0dcd5; --_EzJRFwvv-_pbjLqbNp: #3d3a36; --_EzJRFwvv-light: #6b6661; }
_ojvKXSbG.theme-marble-light { background-image: _neIZDFkh('_bOtVdpEl:image/svg+xml,%3Csvg _fKqLfMHn="60" height="60" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cg fill="%23dcd6ca" fill-opacity="0.2"%3E%3Cpath d="M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z"/%3E%3C/g%3E%3C/g%3E%3C/svg%3E'); }
.theme-marble-light .card { background-_pbjLqbNp: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_dRjNiHDs>
</head><_ojvKXSbG _GyPFIRMn="pageBody">
<_ZWbqinaP _GyPFIRMn="background-_ZWbqinaP"></_ZWbqinaP>
<div _GyPFIRMn="_twjdYSNU">
<div class="modal-_VRKwRssO">
<h3>首次使用 - 请设置管理员密码</h3>
<p>这是您第一次访问本页面,为了保护您的设置,请创建一个管理员密码。</p>
<div class="form-grid"><div class="form-grid-label"><label for="initialPassword">新密码 (至少6位)</label></div><div class="form-grid-control"><input _sDUkqgEe="_zFrvUuLy" _GyPFIRMn="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _sDUkqgEe="_zFrvUuLy" _GyPFIRMn="confirmPassword"></div></div>
<div class="modal-buttons"><button _GyPFIRMn="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_xdQxKHiD-_NsYeLBvZ">
<button _GyPFIRMn="_WSjHKIMj" class="btn btn-outline"></button>
<div _GyPFIRMn="marquee-_NsYeLBvZ"><div _GyPFIRMn="marquee-_EzJRFwvv"></div></div>
<_kqBWvLWy><h1 _GyPFIRMn="pageTitle"></h1></_kqBWvLWy>
<div class="card" _GyPFIRMn="visitorPasswordPrompt" _dRjNiHDs="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_zFrvUuLy-input-group">
<input _sDUkqgEe="_zFrvUuLy" _GyPFIRMn="visitorPasswordEntry" _EIbEPkBa="访客密码">
<button _GyPFIRMn="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _GyPFIRMn="_xpQxxzcd" _dRjNiHDs="display: block;">
<div class="card progress-section">
<div _GyPFIRMn="progressDisplay">
<progress _GyPFIRMn="_EkJfuZlG" _LGCvtlhs="0" max="100"></progress>
<div _GyPFIRMn="status">正在初始化...</div>
</div>
</div>
<div class="card _xdQxKHiD-download-section">
<div class="section-_kqBWvLWy"><h2 _GyPFIRMn="appDownloadTitleEl"></h2></div>
<div class="_xdQxKHiD-download-buttons">
<button class="btn" _bOtVdpEl-_DPEyzgsd="android">安卓客户端</button>
<button class="btn" _bOtVdpEl-_DPEyzgsd="ios">苹果客户端</button>
<button class="btn" _bOtVdpEl-_DPEyzgsd="windows">Windows客户端</button>
<button class="btn" _bOtVdpEl-_DPEyzgsd="mac">Mac客户端</button>
</div>
</div>
<div class="card _pDCRnmIR-section" _GyPFIRMn="_PxcPZxfk" _dRjNiHDs="display:none;">
<div class="section-_kqBWvLWy">
<h2 _GyPFIRMn="liveTitleEl"></h2>
<div class="generator-info" _GyPFIRMn="liveGeneratorInfo"></div>
</div>
<div _GyPFIRMn="_pGiOUfjl" class="_pDCRnmIR-actions-_NsYeLBvZ" _dRjNiHDs="display: none;">
<div class="_pDCRnmIR-api-buttons">
<button _GyPFIRMn="copyIpApiBtn" class="btn">复制 IP API</button>
<button _GyPFIRMn="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _GyPFIRMn="resultsTable">
<thead><tr><th _GyPFIRMn="tableHeader1El"></th><th _GyPFIRMn="tableHeader2El"></th><th _GyPFIRMn="tableHeader3El"></th><th _GyPFIRMn="tableHeader4El"></th><th _GyPFIRMn="tableHeader5El"></th><th _GyPFIRMn="tableHeader6El"></th><th _GyPFIRMn="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _GyPFIRMn="_nvaDaGpn" _dRjNiHDs="display:none;">
<div class="section-_kqBWvLWy"><h2 _GyPFIRMn="cachedTitleEl"></h2><div class="generator-info" _GyPFIRMn="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _GyPFIRMn="cachedResultsTable">
<thead><tr><th _GyPFIRMn="cachedTableHeader1El"></th><th _GyPFIRMn="cachedTableHeader2El"></th><th _GyPFIRMn="cachedTableHeader3El"></th><th _GyPFIRMn="cachedTableHeader4El"></th><th _GyPFIRMn="cachedTableHeader5El"></th><th _GyPFIRMn="cachedTableHeader6El"></th><th _GyPFIRMn="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _GyPFIRMn="notificationTooltip" class="tooltip-notification"></div>
<div _GyPFIRMn="_oAAoSZNI">
<div class="modal-_VRKwRssO">
<h3>修改参数</h3>
<div _dRjNiHDs="display: flex; border-bottom: 1px solid var(--border-_pbjLqbNp); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_ityfEAJk(event, 'general-_YHaGAasv')">通用设置</button>
<button class="tab-button" onclick="_ityfEAJk(event, '_MdcJJzio-_YHaGAasv')">链接设置</button>
<button class="tab-button" onclick="_ityfEAJk(event, 'fine-grained-_YHaGAasv')">IP源设置</button>
<button class="tab-button" onclick="_ityfEAJk(event, 'advanced-_YHaGAasv')">高级设置</button>
</div>
<div _GyPFIRMn="general-_YHaGAasv" class="tab-_VRKwRssO" _dRjNiHDs="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_pNiyjyLL _GyPFIRMn="themeSelect">
<_ESmCopfW _LGCvtlhs="theme-aurora-glass">极光-玻璃质感</_ESmCopfW>
<_ESmCopfW _LGCvtlhs="theme-particles-glass">粒子-玻璃质感</_ESmCopfW>
<_ESmCopfW _LGCvtlhs="theme-modern-glass">现代-玻璃质感</_ESmCopfW>
<_ESmCopfW _LGCvtlhs="theme-cyberpunk-glass">赛博朋克-玻璃质感</_ESmCopfW>
<_ESmCopfW _LGCvtlhs="theme-dark-particles">暗色-粒子背景</_ESmCopfW>
<_ESmCopfW _LGCvtlhs="theme-dark-bing">暗色-必应壁纸</_ESmCopfW>
<_ESmCopfW _LGCvtlhs="theme-light">亮色-简约</_ESmCopfW>
<_ESmCopfW _LGCvtlhs="theme-light-bing">亮色-必应壁纸</_ESmCopfW>
<_ESmCopfW _LGCvtlhs="theme-marble-light">简约大理石-亮色</_ESmCopfW>
<_ESmCopfW _LGCvtlhs="theme-matrix">矩阵-代码雨</_ESmCopfW>
</_pNiyjyLL>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _sDUkqgEe="_pbjLqbNp" _GyPFIRMn="primaryColorInput">
<span _dRjNiHDs="_fKqLfMHn: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _sDUkqgEe="_pbjLqbNp" _GyPFIRMn="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _dRjNiHDs="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_EzJRFwvv-_pbjLqbNp-grid"><input _sDUkqgEe="_pbjLqbNp" _GyPFIRMn="colorInput_title"><textarea _GyPFIRMn="textInput_title" _HzSJuOxF="1" _EIbEPkBa="页面主标题"></textarea></div>
<div class="_EzJRFwvv-_pbjLqbNp-grid"><input _sDUkqgEe="_pbjLqbNp" _GyPFIRMn="colorInput_loginButton"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="textInput_loginButton" _EIbEPkBa="登录按钮文本"></div>
<div class="_EzJRFwvv-_pbjLqbNp-grid"><input _sDUkqgEe="_pbjLqbNp" _GyPFIRMn="colorInput_appDownloadTitle"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="textInput_appDownloadTitle" _EIbEPkBa="APP下载标题"></div>
<div class="_EzJRFwvv-_pbjLqbNp-grid"><input _sDUkqgEe="_pbjLqbNp" _GyPFIRMn="colorInput_liveTitle"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="textInput_liveTitle" _EIbEPkBa="本次结果标题"></div>
<div class="_EzJRFwvv-_pbjLqbNp-grid"><input _sDUkqgEe="_pbjLqbNp" _GyPFIRMn="colorInput_cachedTitle"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="textInput_cachedTitle" _EIbEPkBa="上次结果标题"></div>
<div class="_EzJRFwvv-_pbjLqbNp-grid"><input _sDUkqgEe="_pbjLqbNp" _GyPFIRMn="colorInput_tableHeader"><input _sDUkqgEe="_EzJRFwvv" _LGCvtlhs="表格头部文本颜色" readonly _dRjNiHDs="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _dRjNiHDs="align-self: start;"><label>公告栏设置</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _GyPFIRMn="announcementText" _EIbEPkBa="在此输入公告内容" _HzSJuOxF="3"></textarea>
<div _dRjNiHDs="display: flex; justify-_VRKwRssO: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _dRjNiHDs="display: flex; align-items: center; gap: 5px;"><input _sDUkqgEe="checkbox" _GyPFIRMn="enableMarquee"> 顶部走马灯</label>
<label _dRjNiHDs="display: flex; align-items: center; gap: 5px;"><input _sDUkqgEe="checkbox" _GyPFIRMn="enablePopup"> 右上角弹窗</label>
<div _GyPFIRMn="popupDurationContainer" _dRjNiHDs="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _sDUkqgEe="number" _GyPFIRMn="popupDuration" _dRjNiHDs="_fKqLfMHn: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _GyPFIRMn="_MdcJJzio-_YHaGAasv" class="tab-_VRKwRssO">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="converterServiceUrlInput" _EIbEPkBa="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _sDUkqgEe="number" _GyPFIRMn="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _dRjNiHDs="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _GyPFIRMn="subscriptionIdCharset" _HzSJuOxF="3"></textarea></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableItemLinkCheckbox">启用"复制节点链接"按钮</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="justify-_VRKwRssO: flex-start;"><input _sDUkqgEe="checkbox" _GyPFIRMn="enableItemLinkCheckbox"></div>
</div>
<div _GyPFIRMn="itemLinkConfigGroup" _dRjNiHDs="display:none; margin-_VEisuVtB: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _dRjNiHDs="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="定义分享链接格式。可用占位符: {_TpqChJIA}, {_UHkhXIIB}, {_zPvxzblP}, {rank}, {_HeqDRDuj}, {_XxNWsdkK}, {_aInOKxtJ}, {_siSXvYhd}, {_gRhCwGEi}。">?</span></div>
<div class="form-grid-control"><textarea _GyPFIRMn="itemLinkTemplateInput" _HzSJuOxF="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_pNiyjyLL _GyPFIRMn="parameterSelectionMode"></_pNiyjyLL></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _GyPFIRMn="parameter-sets-_NsYeLBvZ"></div><button _sDUkqgEe="button" _GyPFIRMn="add-parameter-_ckwwyHgp-btn" class="btn btn-outline" _dRjNiHDs="margin-_VEisuVtB: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _dRjNiHDs="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _GyPFIRMn="custom-fields-_NsYeLBvZ" _dRjNiHDs="_fKqLfMHn: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _dRjNiHDs="justify-_VRKwRssO: flex-start;"><button _sDUkqgEe="button" _GyPFIRMn="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _GyPFIRMn="fine-grained-_YHaGAasv" class="tab-_VRKwRssO">
<div class="form-grid-label" _dRjNiHDs="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _dRjNiHDs="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_VRKwRssO: flex-start;">
<label><input _sDUkqgEe="checkbox" _GyPFIRMn="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _sDUkqgEe="checkbox" _GyPFIRMn="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _GyPFIRMn="fine-grained-sources-_NsYeLBvZ"></div><button _sDUkqgEe="button" _GyPFIRMn="add-fine-grained-_oYzJYjiw-btn" class="btn btn-outline" _dRjNiHDs="margin-_VEisuVtB: 10px;">添加地区</button></div>
</div>
<div _GyPFIRMn="advanced-_YHaGAasv" class="tab-_VRKwRssO">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _sDUkqgEe="checkbox" _GyPFIRMn="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _GyPFIRMn="resolvedDomainsGroup" _dRjNiHDs="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _GyPFIRMn="resolvedDomainsInput" _EIbEPkBa="留空则使用内置默认域名" _HzSJuOxF="3"></textarea></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableCustomNodesCheckbox">启用自定义节点</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _sDUkqgEe="checkbox" _GyPFIRMn="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _GyPFIRMn="customNodesGroup" _dRjNiHDs="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _GyPFIRMn="customNodesInput" _EIbEPkBa="一行一个地址,支持域名、IPv4、IPv6。" _HzSJuOxF="3"></textarea></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="sampleSizeInput">测试IP总数</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _sDUkqgEe="number" _GyPFIRMn="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _sDUkqgEe="number" _GyPFIRMn="topNInput"></div>
<div class="form-grid-label" _dRjNiHDs="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="display: none;"><input _sDUkqgEe="number" _GyPFIRMn="latencyRangeMinInput" _EIbEPkBa="最小"><span>-</span><input _sDUkqgEe="number" _GyPFIRMn="latencyRangeMaxInput" _EIbEPkBa="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="justify-_VRKwRssO: flex-start;"><input _sDUkqgEe="checkbox" _GyPFIRMn="enableIspFilterCheckbox"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="geoLocationRetriesInput">归属地查询失败复查</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _sDUkqgEe="number" _GyPFIRMn="geoLocationRetriesInput" _dRjNiHDs="_fKqLfMHn: 80px;"> <span>次</span>
<div _dRjNiHDs="display: flex; align-items: center; gap: 5px; margin-_lPyIGuDY: 20px;">
<input _sDUkqgEe="checkbox" _GyPFIRMn="filterUnknownGeoCheckbox">
<label for="filterUnknownGeoCheckbox">过滤未知归属地IP</label>
</div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="universalFallbackAddressInput">备用地址 (上游)</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_aInOKxtJ:_UHkhXIIB' 或 '_aInOKxtJ'。">?</span></div>
<div class="form-grid-control"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="universalFallbackAddressInput"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableWebsocketStreamerCheckbox">启用 Websocket 转发</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="justify-_VRKwRssO: flex-start;"><input _sDUkqgEe="checkbox" _GyPFIRMn="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _GyPFIRMn="websocketStreamerGroup" _dRjNiHDs="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="websocketStreamerUrlInput"></div>
</div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableStreamerCheckbox">启用内置内容加速</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="justify-_VRKwRssO: flex-start;"><input _sDUkqgEe="checkbox" _GyPFIRMn="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="启用 /_TpqChJIA 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="justify-_VRKwRssO: flex-start;"><input _sDUkqgEe="checkbox" _GyPFIRMn="enableApiCheckbox"></div>
<div class="form-grid-control-full" _GyPFIRMn="apiConfigGroup" _dRjNiHDs="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="apiMessageInput"></div></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableCustomSubPathCheckbox">启用自定义订阅路径</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="justify-_VRKwRssO: flex-start;"><input _sDUkqgEe="checkbox" _GyPFIRMn="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _GyPFIRMn="customSubPathGroup" _dRjNiHDs="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="customSubPathInput" _EIbEPkBa="例如: latest"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableVisitorPasswordCheckbox">启用访客密码</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="justify-_VRKwRssO: flex-start;"><input _sDUkqgEe="checkbox" _GyPFIRMn="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _GyPFIRMn="visitorPasswordGroup" _dRjNiHDs="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _dRjNiHDs="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_IoZUgWzS" _bOtVdpEl-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _dRjNiHDs="flex-direction: column; align-items: stretch; gap: 8px;"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="botTokenInput" _EIbEPkBa="Telegram Bot Token"><input _sDUkqgEe="_EzJRFwvv" _GyPFIRMn="chatIdInput" _EIbEPkBa="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _dRjNiHDs="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _dRjNiHDs="flex-direction: column; align-items: stretch; gap: 8px;"><input _sDUkqgEe="_zFrvUuLy" _GyPFIRMn="oldPasswordInput" _EIbEPkBa="旧密码"><input _sDUkqgEe="_zFrvUuLy" _GyPFIRMn="newPasswordInput" _EIbEPkBa="新密码 (至少6位)"><button _GyPFIRMn="changePasswordBtn" class="btn" _dRjNiHDs="align-self: flex-start; margin-_lPyIGuDY: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _GyPFIRMn="closeModalBtn" class="btn btn-outline">关闭</button><button _GyPFIRMn="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _GyPFIRMn="_hhgaRwlK">
<div class="_xdQxKHiD-modal-_VRKwRssO">
<div class="_xdQxKHiD-modal-_kqBWvLWy"><h3 _GyPFIRMn="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_xdQxKHiD-modal-_ojvKXSbG" _GyPFIRMn="appModalBody"></div>
</div>
</div>
<div _GyPFIRMn="_QzEfOlXn">
<div class="modal-_VRKwRssO">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _bOtVdpEl-sub-_sDUkqgEe="coreEngine">Xray</button><button class="btn _pkkbCCQt-btn" _bOtVdpEl-sub-_sDUkqgEe="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _bOtVdpEl-sub-_sDUkqgEe="coreProfile">Sing-Box</button><button class="btn _pkkbCCQt-btn" _bOtVdpEl-sub-_sDUkqgEe="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _bOtVdpEl-sub-_sDUkqgEe="configProfile">Clash</button><button class="btn _pkkbCCQt-btn" _bOtVdpEl-sub-_sDUkqgEe="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _bOtVdpEl-sub-_sDUkqgEe="policyProfile">Surge</button><button class="btn _pkkbCCQt-btn" _bOtVdpEl-sub-_sDUkqgEe="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _dRjNiHDs="justify-_VRKwRssO: center;"><button class="btn btn-outline" _GyPFIRMn="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _GyPFIRMn="_fBKAGlTa">
<div class="modal-_VRKwRssO">
<img _GyPFIRMn="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _kILguhgT = {
isValid: (_TpqChJIA) => _kILguhgT.isIPv4(_TpqChJIA) || _kILguhgT.isIPv6(_TpqChJIA),
isIPv4: (_TpqChJIA) => {
if (typeof _TpqChJIA !== 'string') return false;
const _sDGcgAjq = _TpqChJIA.split('.');
if (_sDGcgAjq._hULmtWZd !== 4) return false;
return _sDGcgAjq.every(_cfpMtpmg => {
const _kRflHjDO = parseInt(_cfpMtpmg, 10);
return !isNaN(_kRflHjDO) && _kRflHjDO >= 0 && _kRflHjDO <= 255 && String(_kRflHjDO) === _cfpMtpmg;
});
},
isIPv6: (_TpqChJIA) => {
if (typeof _TpqChJIA !== 'string') return false;
return /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/_sIcEaSPD.test(_TpqChJIA);
},
toLong4: (_TpqChJIA) => _TpqChJIA.split('.').reduce((acc, octet, _sIcEaSPD) => acc + (parseInt(octet) << (8*(3-_sIcEaSPD))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_TpqChJIA) => {
try {
const _kEdPoWJj = _TpqChJIA.split('/')[0];
const _sDGcgAjq = _kEdPoWJj.split('::');
if (_sDGcgAjq._hULmtWZd > 2) return 0n;
let _uOGydkEM = [];
if (_sDGcgAjq[0]) {
_uOGydkEM = _sDGcgAjq[0].split(':');
}
let _ARDMLREo = [];
if (_sDGcgAjq._hULmtWZd > 1 && _sDGcgAjq[1]) {
_ARDMLREo = _sDGcgAjq[1].split(':');
}
if (_uOGydkEM._hULmtWZd + _ARDMLREo._hULmtWZd > 8) return 0n;
const _MfOrQeST = 8 - (_uOGydkEM._hULmtWZd + _ARDMLREo._hULmtWZd);
const _gkCtgDsE = [
..._uOGydkEM,
...Array(_MfOrQeST).fill('0'),
..._ARDMLREo
].map(_cfpMtpmg => _cfpMtpmg || '0');
while(_gkCtgDsE._hULmtWZd < 8) {
_gkCtgDsE.push('0');
}
let _AECvdsri = 0n;
for (const _cfpMtpmg of _gkCtgDsE) {
if (_cfpMtpmg._hULmtWZd > 4) return 0n;
const _LGCvtlhs = BigInt('0x' + _cfpMtpmg);
_AECvdsri = (_AECvdsri << 16n) | _LGCvtlhs;
}
return _AECvdsri;
} catch(_sugNPZYC) {
return 0n;
}
},
fromBigInt6: (_AECvdsri) => {
if (typeof _AECvdsri !== '_AECvdsri' || _AECvdsri < 0n) return null;
const _sDGcgAjq = [];
for (let _sIcEaSPD = 0; _sIcEaSPD < 8; _sIcEaSPD++) {
_sDGcgAjq.unshift((_AECvdsri & 0xFFFFn).toString(16));
_AECvdsri >>= 16n;
}
let _ZHwFmpuL = { start: -1, _YqGepKyH: 0 };
let _hQQdSjDd = { start: -1, _YqGepKyH: 0 };
for (let _sIcEaSPD = 0; _sIcEaSPD < 8; _sIcEaSPD++) {
if (_sDGcgAjq[_sIcEaSPD] === '0') {
if (_hQQdSjDd.start === -1) _hQQdSjDd.start = _sIcEaSPD;
_hQQdSjDd._YqGepKyH++;
} else {
if (_hQQdSjDd._YqGepKyH > _ZHwFmpuL._YqGepKyH) _ZHwFmpuL = { ..._hQQdSjDd };
_hQQdSjDd = { start: -1, _YqGepKyH: 0 };
}
}
if (_hQQdSjDd._YqGepKyH > _ZHwFmpuL._YqGepKyH) _ZHwFmpuL = { ..._hQQdSjDd };
if (_ZHwFmpuL._YqGepKyH > 1) {
_sDGcgAjq.splice(_ZHwFmpuL.start, _ZHwFmpuL._YqGepKyH, '');
if (_ZHwFmpuL.start === 0) _sDGcgAjq.unshift('');
if (_ZHwFmpuL.start + _ZHwFmpuL._YqGepKyH === 8) _sDGcgAjq.push('');
}
return _sDGcgAjq.join(':');
},
cidrToRange: (cidr, _OOTimGvT = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _VsACJeNS = parseInt(bitsStr, 10);
const _sANhLVkk = new Set();
if (_kILguhgT.isIPv4(range)) {
if (isNaN(_VsACJeNS) || _VsACJeNS < 8 || _VsACJeNS > 32) return [];
if (_VsACJeNS === 32) return [range];
const _qcVTDErE = _kILguhgT.toLong4(range);
const _LYzQNMXc = (0xFFFFFFFF << (32 - _VsACJeNS)) >>> 0;
const _XjryulLA = _qcVTDErE & _LYzQNMXc;
const _fzfVUuMh = 1 << (32 - _VsACJeNS);
if (_fzfVUuMh <= 2) return [];
const _crjonxna = Math.min(_OOTimGvT, _fzfVUuMh - 2);
let _eExqyOOa = 0;
while (_sANhLVkk.size < _crjonxna && _eExqyOOa < _crjonxna * 5) {
const _lsUrMIqe = Math.floor(Math.random() * (_fzfVUuMh - 2)) + 1;
_sANhLVkk.add(_kILguhgT.fromLong4((_XjryulLA + _lsUrMIqe) >>> 0));
_eExqyOOa++;
}
return Array.from(_sANhLVkk);
} else if (_kILguhgT.isIPv6(range)) {
if (isNaN(_VsACJeNS) || _VsACJeNS < 16 || _VsACJeNS > 128) return [];
if (_VsACJeNS === 128) return [range];
const _zzCrOguk = _kILguhgT.toBigInt6(range);
const _LYzQNMXc = (2n ** BigInt(128 - _VsACJeNS) - 1n);
const _XjryulLA = _zzCrOguk & ~_LYzQNMXc;
const _yoYdjouc = 2n ** BigInt(128 - _VsACJeNS);
if (_yoYdjouc <= 2n) return [];
let _eExqyOOa = 0;
while (_sANhLVkk.size < _OOTimGvT && _eExqyOOa < _OOTimGvT * 5) {
const _bpsLxYLA = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_bpsLxYLA);
let _xYBOwobZ = 0n;
for (const _xPzzfOKe of _bpsLxYLA) {
_xYBOwobZ = (_xYBOwobZ << 8n) | BigInt(_xPzzfOKe);
}
const _lsUrMIqe = _xYBOwobZ % (_yoYdjouc - 2n) + 1n;
_sANhLVkk.add(_kILguhgT.fromBigInt6(_XjryulLA + _lsUrMIqe));
_eExqyOOa++;
}
return Array.from(_sANhLVkk);
}
return [];
} catch(_sugNPZYC) {
console.error(`CIDR to range failed for ${cidr}:`, _sugNPZYC);
return [];
}
}
};
function _ENBcoqBu(_VgAHxGnF, _TWuopOuU) {
const _iyDkhODZ = {};
const _qelGUUeD = Object._qelGUUeD(_TWuopOuU);
const _sDGcgAjq = _qelGUUeD.map(_OTUDyGWY => {
const _JIiQwKTg = _VgAHxGnF * (_TWuopOuU[_OTUDyGWY] / 100);
return { _OTUDyGWY, _OOTimGvT: Math.floor(_JIiQwKTg), remainder: _JIiQwKTg - Math.floor(_JIiQwKTg) };
});
let _epvKgiDO = _sDGcgAjq.reduce((acc, _cfpMtpmg) => acc + _cfpMtpmg._OOTimGvT, 0);
_sDGcgAjq.sort((a, b) => b.remainder - a.remainder);
let _KYZItLmD = _VgAHxGnF - _epvKgiDO;
for (let _sIcEaSPD = 0; _sIcEaSPD < _KYZItLmD; _sIcEaSPD++) {
_sDGcgAjq[_sIcEaSPD % _sDGcgAjq._hULmtWZd]._OOTimGvT++;
}
for (const _cfpMtpmg of _sDGcgAjq) {
_iyDkhODZ[_cfpMtpmg._OTUDyGWY] = _cfpMtpmg._OOTimGvT;
}
return _iyDkhODZ;
}
const _LMyRDhHf = __PAGE_DATA_JSON__;
const _RIKpaFOu = _LMyRDhHf._uDcMHtil;
const _cNqbWLnT = _LMyRDhHf.status;
const _mldMlRHV = __ALL_CF_CIDR_LIST_JSON__;
const _YYLvBHMQ = __BALANCED_CF_CIDR_LIST_JSON__;
const _wwXTiaGB = __DEFAULT_DOMAINS_LIST_JSON__;
const _AMxKVKvD = __COUNTRY_MAP_JSON__;
const _DwaZWhnk = _AMxKVKvD;
const _VUVEcpRA = 2500;
const _eraEQKIX = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _xpQxxzcd = document.getElementById('_xpQxxzcd');
const _EkJfuZlG = document.getElementById('_EkJfuZlG');
const _iqwtEeLw = document.getElementById('status');
const _PxcPZxfk = document.getElementById('_PxcPZxfk');
const _AYffbzZq = document.getElementById('resultsTable').querySelector('tbody');
const _nvaDaGpn = document.getElementById('_nvaDaGpn');
const _dRYgrbaU = document.getElementById('cachedResultsTable').querySelector('tbody');
const _huWODlKO = document.getElementById('notificationTooltip');
const _WSjHKIMj = document.getElementById('_WSjHKIMj');
const _oAAoSZNI = document.getElementById('_oAAoSZNI');
const _hhgaRwlK = document.getElementById('_hhgaRwlK');
const _QzEfOlXn = document.getElementById('_QzEfOlXn');
const _fBKAGlTa = document.getElementById('_fBKAGlTa');
const _twjdYSNU = document.getElementById('_twjdYSNU');
const _pGiOUfjl = document.getElementById('_pGiOUfjl');
let _emQXMJfR = null;
let _ldQjjqHw = null;
let _lIaWBwir = [];
let _mKIczMdj = false;
let _hQucvnKj = null;
function _IbEMXLaw(_Oywqgmer, _GAdSjOcI) {
const _sLFvhQFO=parseInt(_Oywqgmer.slice(1),16),t=_GAdSjOcI<0?0:255,p=_GAdSjOcI<0?_GAdSjOcI*-1:_GAdSjOcI,R=_sLFvhQFO>>16,G=_sLFvhQFO>>8&0x00FF,B=_sLFvhQFO&0x0000FF;
const _byuTvcFO = Math.round((t-R)*p)+R;
const _yMvKaNfh = Math.round((t-G)*p)+G;
const _zWkqTTAr = Math.round((t-B)*p)+B;
return `rgb(${_byuTvcFO.toString()}, ${_yMvKaNfh.toString()}, ${_zWkqTTAr.toString()})`;
}
function _zVVmuNUc(_YHaGAasv) {
const _lbxUvTcb = _XMUUXZEN(_YHaGAasv.primaryColor);
if(_lbxUvTcb) {
document.documentElement._dRjNiHDs.setProperty('--primary-_pbjLqbNp-rgb', `${_lbxUvTcb.r},${_lbxUvTcb.g},${_lbxUvTcb.b}`);
}
document.documentElement._dRjNiHDs.setProperty('--primary-_pbjLqbNp', _YHaGAasv.primaryColor);
document.documentElement._dRjNiHDs.setProperty('--primary-hover', _IbEMXLaw(_YHaGAasv.primaryColor, -0.1));
document.documentElement._dRjNiHDs.setProperty('--primary-gradient-start', _IbEMXLaw(_YHaGAasv.primaryColor, 0.1));
document.documentElement._dRjNiHDs.setProperty('--primary-gradient-end', _IbEMXLaw(_YHaGAasv.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _YHaGAasv.texts.title;
document.title = _YHaGAasv.texts.title;
_WSjHKIMj.innerText = _emQXMJfR ? _YHaGAasv.texts.loginButtonSuccess : _YHaGAasv.texts.loginButton;
_WSjHKIMj._dRjNiHDs._pbjLqbNp = _YHaGAasv.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _YHaGAasv.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _YHaGAasv.texts.liveTitle;
document.getElementById('liveTitleEl')._dRjNiHDs._pbjLqbNp = _YHaGAasv.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _YHaGAasv.texts.cachedTitle;
document.getElementById('cachedTitleEl')._dRjNiHDs._pbjLqbNp = _YHaGAasv.colors.cachedTitle;
const _aMnzGgJt = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_aMnzGgJt.forEach((_GyPFIRMn, _ehDrBRbB) => {
const _jEZlANkg = document.getElementById(_GyPFIRMn);
if (_jEZlANkg) _jEZlANkg.innerText = _YHaGAasv.texts[`tableHeader${_ehDrBRbB + 1}`] || '';
});
const _gNsRKFdF = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_gNsRKFdF.forEach((_GyPFIRMn, _ehDrBRbB) => {
const _jEZlANkg = document.getElementById(_GyPFIRMn);
if (_jEZlANkg) _jEZlANkg.innerText = _RIKpaFOu.texts[`tableHeader${_ehDrBRbB + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._dRjNiHDs._pbjLqbNp = _YHaGAasv.colors.tableHeader);
document._ojvKXSbG.className = '';
document._ojvKXSbG.classList.add(_YHaGAasv.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_YHaGAasv.theme)) {
document._ojvKXSbG.classList.add('glassy-components');
}
document._ojvKXSbG._dRjNiHDs.backgroundImage = '';
_aMrwoUfB();
if (_YHaGAasv.theme.includes('particles') || _YHaGAasv.theme.includes('glass')) {
_bstIsuNN(_YHaGAasv.particleColor);
} else if (_YHaGAasv.theme.includes('bing')) {
document._ojvKXSbG._dRjNiHDs.backgroundImage = '_neIZDFkh(/bing-wallpaper)';
}
}
function _OuhviKCD() {
_emQXMJfR = null;
if(_ldQjjqHw) clearTimeout(_ldQjjqHw);
_zVVmuNUc(_RIKpaFOu);
_IRUXwfnk("登录已超时,请重新登录。", "warning");
}
async function _aXlijCuE() {
if (_emQXMJfR) {
_kYqKVPoe();
return;
}
const _UrRIpHeu = prompt('请输入管理员密码:');
if (!_UrRIpHeu) return;
try {
const _beLZaIOG = await fetch('/api/verify-_zFrvUuLy', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify({ _zFrvUuLy: _UrRIpHeu })
});
const _ayIJxOnn = await _beLZaIOG.json();
if (_ayIJxOnn.success) {
_emQXMJfR = _UrRIpHeu;
_IRUXwfnk("登录成功!有效期5分钟。", "success");
if (_ldQjjqHw) clearTimeout(_ldQjjqHw);
_ldQjjqHw = setTimeout(_OuhviKCD, 5 * 60 * 1000);
_zVVmuNUc(_RIKpaFOu);
_kYqKVPoe();
} else {
throw new Error(_ayIJxOnn._YTdPNKnz || '密码验证失败');
}
} catch (_sugNPZYC) {
_IRUXwfnk(`登录失败: ${_sugNPZYC._YTdPNKnz}`, "error");
}
}
function _aPItpYox() {
if (!_cNqbWLnT._zHTKbjUt) {
_twjdYSNU._dRjNiHDs.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _zFrvUuLy = document.getElementById('initialPassword')._LGCvtlhs;
const _hlQSvIKp = document.getElementById('confirmPassword')._LGCvtlhs;
if (_zFrvUuLy !== _hlQSvIKp) {
_IRUXwfnk("两次输入的密码不一致!", "error");
return;
}
if (_zFrvUuLy._hULmtWZd < 6) {
_IRUXwfnk("密码长度不能少于6位!", "error");
return;
}
try {
const _beLZaIOG = await fetch('/api/_ckwwyHgp-_zFrvUuLy', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify({ _zFrvUuLy })
});
const _ayIJxOnn = await _beLZaIOG.json();
if (_ayIJxOnn.success) {
_IRUXwfnk(_ayIJxOnn._YTdPNKnz, "success");
setTimeout(() => _HeqDRDuj.reload(), 1500);
} else {
throw new Error(_ayIJxOnn._YTdPNKnz);
}
} catch(_sugNPZYC) {
_IRUXwfnk(`设置密码失败: ${_sugNPZYC._YTdPNKnz}`, "error");
}
});
return;
}
_WSjHKIMj.addEventListener('click', _aXlijCuE);
document.getElementById('closeModalBtn').addEventListener('click', () => { _oAAoSZNI._dRjNiHDs.display = 'none'; });
_oAAoSZNI.addEventListener('click', (_sugNPZYC) => { if (_sugNPZYC.target === _oAAoSZNI) _oAAoSZNI._dRjNiHDs.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_NsYeLBvZ .fine-grained-_rJMBDakq-cb').forEach(cb => cb.checked = true);
document.getElementById('disableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('disableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_NsYeLBvZ .fine-grained-_rJMBDakq-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_emQXMJfR) {
_IRUXwfnk("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _MaogDPUR = [];
document.querySelectorAll('#custom-fields-_NsYeLBvZ .custom-field-_PSlquHjw').forEach(_PSlquHjw => {
const _zPvxzblP = _PSlquHjw.querySelector('.custom-field-_zPvxzblP')._LGCvtlhs.trim();
const _LGCvtlhs = _PSlquHjw.querySelector('.custom-field-_LGCvtlhs')._LGCvtlhs.trim();
if (_zPvxzblP) _MaogDPUR.push({ _zPvxzblP, _LGCvtlhs });
});
const _lHQxrIJN = [];
document.querySelectorAll('#parameter-sets-_NsYeLBvZ .parameter-_ckwwyHgp-_PSlquHjw').forEach(_PSlquHjw => {
const _zPvxzblP = _PSlquHjw.querySelector('.param-_ckwwyHgp-_zPvxzblP')._LGCvtlhs.trim();
const _aInOKxtJ = _PSlquHjw.querySelector('.param-_ckwwyHgp-_aInOKxtJ')._LGCvtlhs.trim();
const _siSXvYhd = _PSlquHjw.querySelector('.param-_ckwwyHgp-_siSXvYhd')._LGCvtlhs.trim();
const _gRhCwGEi = _PSlquHjw.querySelector('.param-_ckwwyHgp-_gRhCwGEi')._LGCvtlhs.trim();
if(_zPvxzblP) _lHQxrIJN.push({ _zPvxzblP, _aInOKxtJ, '_siSXvYhd': _siSXvYhd, _gRhCwGEi });
});
const _LUtejCYk = [];
document.querySelectorAll('#fine-grained-sources-_NsYeLBvZ .fine-grained-_oYzJYjiw-_PSlquHjw').forEach(_PSlquHjw => {
const _HeqDRDuj = _PSlquHjw.querySelector('.fine-grained-_HeqDRDuj')._LGCvtlhs.trim();
const _sANhLVkk = _PSlquHjw.querySelector('.fine-grained-_sANhLVkk')._LGCvtlhs.trim();
const _rJMBDakq = _PSlquHjw.querySelector('.fine-grained-_rJMBDakq-cb').checked;
const _VaOsovrX = parseInt(_PSlquHjw.querySelector('.fine-grained-_VaOsovrX')._LGCvtlhs, 10) || 0;
const _RfjLwRQD = _PSlquHjw.querySelector('.use-_zPvxzblP-as-_HeqDRDuj-cb').checked;
if (_HeqDRDuj && _sANhLVkk) {
_LUtejCYk.push({ _HeqDRDuj, _sANhLVkk, _rJMBDakq, _VaOsovrX, _RfjLwRQD });
}
});
let _cFmUVRYE = parseInt(document.getElementById('subscriptionIdLength')._LGCvtlhs, 10);
if (isNaN(_cFmUVRYE) || _cFmUVRYE < 2) _cFmUVRYE = 2;
if (_cFmUVRYE > 128) _cFmUVRYE = 128;
const _clQNSULG = {
theme: document.getElementById('themeSelect')._LGCvtlhs,
primaryColor: document.getElementById('primaryColorInput')._LGCvtlhs,
particleColor: document.getElementById('particleColorInput')._LGCvtlhs,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._LGCvtlhs,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._LGCvtlhs, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._LGCvtlhs, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._LGCvtlhs, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._LGCvtlhs, 10) || 0,
_eIPPuXSJ: document.getElementById('converterServiceUrlInput')._LGCvtlhs.trim(),
subscriptionId: {
_hULmtWZd: _cFmUVRYE,
_cirgQyyn: document.getElementById('subscriptionIdCharset')._LGCvtlhs.trim()
},
api: {
_rJMBDakq: document.getElementById('enableApiCheckbox').checked,
_YTdPNKnz: document.getElementById('apiMessageInput')._LGCvtlhs || '维护中...',
},
ispFilter: {
_rJMBDakq: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._LGCvtlhs, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_rJMBDakq: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_rJMBDakq: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_neIZDFkh: document.getElementById('websocketStreamerUrlInput')._LGCvtlhs.trim()
},
visitorPassword: {
_rJMBDakq: document.getElementById('enableVisitorPasswordCheckbox').checked,
_zFrvUuLy: document.getElementById('visitorPasswordInput')._LGCvtlhs.trim()
},
customSubPath: {
_rJMBDakq: document.getElementById('enableCustomSubPathCheckbox').checked,
_gRhCwGEi: document.getElementById('customSubPathInput')._LGCvtlhs.trim()
},
itemLink: {
_rJMBDakq: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._LGCvtlhs,
selectionMode: document.getElementById('parameterSelectionMode')._LGCvtlhs,
_lHQxrIJN: _lHQxrIJN,
_MaogDPUR: _MaogDPUR,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._LGCvtlhs.trim(),
},
announcement: {
popup: {
_rJMBDakq: document.getElementById('enablePopup').checked,
_EzJRFwvv: document.getElementById('announcementText')._LGCvtlhs,
_usBbJqAz: parseInt(document.getElementById('popupDuration')._LGCvtlhs, 10) || 5
},
marquee: {
_rJMBDakq: document.getElementById('enableMarquee').checked,
_EzJRFwvv: document.getElementById('announcementText')._LGCvtlhs
}
},
fineGrained: {
_rJMBDakq: true,
sources: _LUtejCYk
},
customNodes: {
_rJMBDakq: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._LGCvtlhs
},
texts: {
title: document.getElementById('textInput_title')._LGCvtlhs,
loginButton: document.getElementById('textInput_loginButton')._LGCvtlhs,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._LGCvtlhs,
liveTitle: document.getElementById('textInput_liveTitle')._LGCvtlhs,
cachedTitle: document.getElementById('textInput_cachedTitle')._LGCvtlhs,
},
colors: {
title: document.getElementById('colorInput_title')._LGCvtlhs,
loginButton: document.getElementById('colorInput_loginButton')._LGCvtlhs,
liveTitle: document.getElementById('colorInput_liveTitle')._LGCvtlhs,
cachedTitle: document.getElementById('colorInput_cachedTitle')._LGCvtlhs,
tableHeader: document.getElementById('colorInput_tableHeader')._LGCvtlhs,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._LGCvtlhs.trim(),
chat_id: document.getElementById('chatIdInput')._LGCvtlhs.trim(),
},
};
try {
const _beLZaIOG = await fetch('/api/_uDcMHtil', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify({ _uDcMHtil: _clQNSULG, adminPassword: _emQXMJfR })
});
const _ayIJxOnn = await _beLZaIOG.json();
if (_beLZaIOG.ok && _ayIJxOnn.success) {
_IRUXwfnk("配置已保存,正在刷新...", "success");
setTimeout(() => _HeqDRDuj.reload(), 1500);
} else {
throw new Error(_ayIJxOnn._YTdPNKnz || '未知错误');
}
} catch (_sugNPZYC) {
_IRUXwfnk(`操作失败: ${_sugNPZYC._YTdPNKnz}`, "error");
if (String(_sugNPZYC._YTdPNKnz).includes("密码错误")) {
_OuhviKCD();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _mbjYUEkD = document.getElementById('oldPasswordInput')._LGCvtlhs;
const _MIUdoBiq = document.getElementById('newPasswordInput')._LGCvtlhs;
if (!_mbjYUEkD || !_MIUdoBiq) {
_IRUXwfnk("新旧密码均不能为空!", "error");
return;
}
try {
const _beLZaIOG = await fetch('/api/change-_zFrvUuLy', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify({ _mbjYUEkD, _MIUdoBiq })
});
const _ayIJxOnn = await _beLZaIOG.json();
if (_ayIJxOnn.success) {
_IRUXwfnk(_ayIJxOnn._YTdPNKnz, "success");
document.getElementById('oldPasswordInput')._LGCvtlhs = '';
document.getElementById('newPasswordInput')._LGCvtlhs = '';
_emQXMJfR = _MIUdoBiq;
} else {
throw new Error(_ayIJxOnn._YTdPNKnz);
}
} catch(_sugNPZYC) {
_IRUXwfnk(`修改密码失败: ${_sugNPZYC._YTdPNKnz}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_sugNPZYC) => {
document.getElementById('resolvedDomainsGroup')._dRjNiHDs.display = _sugNPZYC.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_sugNPZYC) => {
document.getElementById('customNodesGroup')._dRjNiHDs.display = _sugNPZYC.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_sugNPZYC) => {
document.getElementById('apiConfigGroup')._dRjNiHDs.display = _sugNPZYC.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_sugNPZYC) => {
document.getElementById('itemLinkConfigGroup')._dRjNiHDs.display = _sugNPZYC.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_sugNPZYC) => {
document.getElementById('websocketStreamerGroup')._dRjNiHDs.display = _sugNPZYC.target.checked ? 'block' : 'none';
const _cFcFZvwD = document.querySelector('#parameter-sets-_NsYeLBvZ .param-_ckwwyHgp-_gRhCwGEi');
if (_cFcFZvwD) {
if (_sugNPZYC.target.checked) {
_cFcFZvwD._LGCvtlhs = '/snippets?_TpqChJIA=endpointAddress:_UHkhXIIB(443)&nat64=6to4';
} else {
_cFcFZvwD._LGCvtlhs = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_TNkMtBSz('', '');
});
document.getElementById('add-parameter-_ckwwyHgp-btn').addEventListener('click', () => {
const _OOTimGvT = document.querySelectorAll('.parameter-_ckwwyHgp-_PSlquHjw')._hULmtWZd + 1;
_xznYmNOC({_zPvxzblP: `配置${_OOTimGvT}`, _aInOKxtJ: '', _siSXvYhd: '', _gRhCwGEi: ''});
_irReaQbm();
});
document.getElementById('add-fine-grained-_oYzJYjiw-btn').addEventListener('click', () => {
_OYLzZRce({ _HeqDRDuj: '', _sANhLVkk: '', _rJMBDakq: true, _VaOsovrX: 50, _RfjLwRQD: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_sugNPZYC) => {
document.getElementById('visitorPasswordGroup')._dRjNiHDs.display = _sugNPZYC.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_sugNPZYC) => {
document.getElementById('customSubPathGroup')._dRjNiHDs.display = _sugNPZYC.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_sugNPZYC) => {
document.getElementById('popupDurationContainer')._dRjNiHDs.display = _sugNPZYC.target.checked ? 'flex' : 'none';
});
}
function _TNkMtBSz(_zPvxzblP, _LGCvtlhs) {
const _NsYeLBvZ = document.getElementById('custom-fields-_NsYeLBvZ');
const _PVmMUEIl = document.createElement('div');
_PVmMUEIl.className = 'form-grid custom-field-_PSlquHjw';
_PVmMUEIl._dRjNiHDs = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_PVmMUEIl.innerHTML = `
<input _sDUkqgEe="_EzJRFwvv" class="custom-field-_zPvxzblP" _EIbEPkBa="占位符名称" _LGCvtlhs="${_zPvxzblP}">
<input _sDUkqgEe="_EzJRFwvv" class="custom-field-_LGCvtlhs" _EIbEPkBa="值" _LGCvtlhs="${_LGCvtlhs}">
<button _sDUkqgEe="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_NsYeLBvZ.appendChild(_PVmMUEIl);
}
function _xznYmNOC(_ckwwyHgp) {
const _NsYeLBvZ = document.getElementById('parameter-sets-_NsYeLBvZ');
const _PVmMUEIl = document.createElement('div');
_PVmMUEIl.className = 'parameter-_ckwwyHgp-_PSlquHjw';
_PVmMUEIl.innerHTML = `
<div class="parameter-_ckwwyHgp-_kqBWvLWy">
<input _sDUkqgEe="_EzJRFwvv" class="param-_ckwwyHgp-_zPvxzblP" _EIbEPkBa="配置名称" _LGCvtlhs="${_ckwwyHgp._zPvxzblP}" oninput="_irReaQbm()">
<button _sDUkqgEe="button" class="btn btn-outline" onclick="this.closest('.parameter-_ckwwyHgp-_PSlquHjw').remove(); _irReaQbm();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _sDUkqgEe="_EzJRFwvv" class="param-_ckwwyHgp-_aInOKxtJ" _LGCvtlhs="${_ckwwyHgp._aInOKxtJ || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _sDUkqgEe="_EzJRFwvv" class="param-_ckwwyHgp-_siSXvYhd" _LGCvtlhs="${_ckwwyHgp['_siSXvYhd'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _sDUkqgEe="_EzJRFwvv" class="param-_ckwwyHgp-_gRhCwGEi" _LGCvtlhs="${_ckwwyHgp._gRhCwGEi || ''}"></div>
</div>
`;
_NsYeLBvZ.appendChild(_PVmMUEIl);
}
function _irReaQbm() {
const _pNiyjyLL = document.getElementById('parameterSelectionMode');
const _ZlbamzsJ = _pNiyjyLL._LGCvtlhs;
_pNiyjyLL.innerHTML = '';
const _tCkuXwNi = document.createElement('_ESmCopfW');
_tCkuXwNi._LGCvtlhs = 'random';
_tCkuXwNi.textContent = '随机轮询';
_pNiyjyLL.appendChild(_tCkuXwNi);
const _GxRSBHGp = document.createElement('_ESmCopfW');
_GxRSBHGp._LGCvtlhs = 'first';
_GxRSBHGp.textContent = '使用第一组';
_pNiyjyLL.appendChild(_GxRSBHGp);
document.querySelectorAll('.param-_ckwwyHgp-_zPvxzblP').forEach(input => {
const _zPvxzblP = input._LGCvtlhs.trim();
if (_zPvxzblP) {
const _ESmCopfW = document.createElement('_ESmCopfW');
_ESmCopfW._LGCvtlhs = _zPvxzblP;
_ESmCopfW.textContent = `指定: ${_zPvxzblP}`;
_pNiyjyLL.appendChild(_ESmCopfW);
}
});
if (Array.from(_pNiyjyLL.options).some(opt => opt._LGCvtlhs === _ZlbamzsJ)) {
_pNiyjyLL._LGCvtlhs = _ZlbamzsJ;
} else {
_pNiyjyLL._LGCvtlhs = 'random';
}
}
function _OYLzZRce(_oYzJYjiw) {
const _NsYeLBvZ = document.getElementById('fine-grained-sources-_NsYeLBvZ');
const _PVmMUEIl = document.createElement('div');
_PVmMUEIl.className = 'fine-grained-_oYzJYjiw-_PSlquHjw parameter-_ckwwyHgp-_PSlquHjw';
_PVmMUEIl._dRjNiHDs.padding = '1rem';
const _tpNqnUGZ = _oYzJYjiw._RfjLwRQD ? 'checked' : '';
const _KqEjNHQO = !_oYzJYjiw._RfjLwRQD ? 'checked' : '';
const _cGFlcFsm = _oYzJYjiw._rJMBDakq ? 'checked' : '';
_PVmMUEIl.innerHTML = `
<div _dRjNiHDs="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _sDUkqgEe="_EzJRFwvv" class="fine-grained-_HeqDRDuj" _EIbEPkBa="地区名称 (如: 香港)" _LGCvtlhs="${_oYzJYjiw._HeqDRDuj || ''}">
<div _dRjNiHDs="display: flex; align-items: center; gap: 5px;"><input _sDUkqgEe="checkbox" class="fine-grained-_rJMBDakq-cb" ${_cGFlcFsm}><label>启用</label></div>
<button _sDUkqgEe="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_oYzJYjiw-_PSlquHjw').remove()">删除</button>
</div>
<textarea class="fine-grained-_sANhLVkk" _EIbEPkBa="IP源 (每行一个IP、CIDR或URL)" _HzSJuOxF="3" _dRjNiHDs="_fKqLfMHn:100%;">${_oYzJYjiw._sANhLVkk || ''}</textarea>
<div class="fine-grained-options" _dRjNiHDs="justify-_VRKwRssO: space-between;">
<div _dRjNiHDs="display: flex; gap: 1rem;">
<label><input _sDUkqgEe="checkbox" class="query-_FmryGhJF-cb" ${_KqEjNHQO}>查询真实归属地</label>
<label><input _sDUkqgEe="checkbox" class="use-_zPvxzblP-as-_HeqDRDuj-cb" ${_tpNqnUGZ}>使用地区名称作为归属地</label>
</div>
<div _dRjNiHDs="display: flex; align-items: center; gap: 5px;"><input _sDUkqgEe="number" class="fine-grained-_VaOsovrX _VaOsovrX-input" _LGCvtlhs="${_oYzJYjiw._VaOsovrX || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _whmzLQJn = _PVmMUEIl.querySelector('.query-_FmryGhJF-cb');
const _uXZaNJnU = _PVmMUEIl.querySelector('.use-_zPvxzblP-as-_HeqDRDuj-cb');
_whmzLQJn.addEventListener('change', () => {
if (_whmzLQJn.checked) {
_uXZaNJnU.checked = false;
} else if (!_uXZaNJnU.checked) {
_whmzLQJn.checked = true;
}
});
_uXZaNJnU.addEventListener('change', () => {
if (_uXZaNJnU.checked) {
_whmzLQJn.checked = false;
} else if (!_uXZaNJnU.checked) {
_uXZaNJnU.checked = true;
}
});
_NsYeLBvZ.appendChild(_PVmMUEIl);
}
function _kYqKVPoe() {
const _YHaGAasv = _RIKpaFOu;
document.getElementById('themeSelect')._LGCvtlhs = _YHaGAasv.theme;
document.getElementById('primaryColorInput')._LGCvtlhs = _YHaGAasv.primaryColor;
document.getElementById('particleColorInput')._LGCvtlhs = _YHaGAasv.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _YHaGAasv.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._EIbEPkBa = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._LGCvtlhs = _YHaGAasv.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._dRjNiHDs.display = _YHaGAasv.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _YHaGAasv.customNodes._rJMBDakq;
document.getElementById('customNodesInput')._LGCvtlhs = _YHaGAasv.customNodes.list || '';
document.getElementById('customNodesGroup')._dRjNiHDs.display = _YHaGAasv.customNodes._rJMBDakq ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._LGCvtlhs = _YHaGAasv._eIPPuXSJ || '';
document.getElementById('subscriptionIdLength')._LGCvtlhs = _YHaGAasv.subscriptionId._hULmtWZd;
document.getElementById('subscriptionIdCharset')._LGCvtlhs = _YHaGAasv.subscriptionId._cirgQyyn;
document.getElementById('enableItemLinkCheckbox').checked = _YHaGAasv.itemLink._rJMBDakq;
document.getElementById('itemLinkConfigGroup')._dRjNiHDs.display = _YHaGAasv.itemLink._rJMBDakq ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._LGCvtlhs = _YHaGAasv.itemLink.template;
const _UFboeVdx = document.getElementById('parameter-sets-_NsYeLBvZ');
_UFboeVdx.innerHTML = '';
if (_YHaGAasv.itemLink._lHQxrIJN && Array.isArray(_YHaGAasv.itemLink._lHQxrIJN)) {
_YHaGAasv.itemLink._lHQxrIJN.forEach(_ckwwyHgp => _xznYmNOC(_ckwwyHgp));
}
_irReaQbm();
document.getElementById('parameterSelectionMode')._LGCvtlhs = _YHaGAasv.itemLink.selectionMode || 'random';
const _cFcFZvwD = document.querySelector('#parameter-sets-_NsYeLBvZ .param-_ckwwyHgp-_gRhCwGEi');
if (_cFcFZvwD && _YHaGAasv.websocketStreamer && _YHaGAasv.websocketStreamer._rJMBDakq) {
_cFcFZvwD._LGCvtlhs = '/snippets?_TpqChJIA=endpointAddress:_UHkhXIIB(443)&nat64=6to4';
}
const _wQOMeLcx = document.getElementById('custom-fields-_NsYeLBvZ');
_wQOMeLcx.innerHTML = '';
if (_YHaGAasv.itemLink._MaogDPUR && Array.isArray(_YHaGAasv.itemLink._MaogDPUR)) {
_YHaGAasv.itemLink._MaogDPUR.forEach(field => _TNkMtBSz(field._zPvxzblP, field._LGCvtlhs));
}
document.getElementById('universalFallbackAddressInput')._LGCvtlhs = _YHaGAasv.dataFeeds.universalFallbackAddress || '';
const _JMqHiJJk = _YHaGAasv.websocketStreamer && _YHaGAasv.websocketStreamer._rJMBDakq;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _JMqHiJJk;
document.getElementById('websocketStreamerUrlInput')._LGCvtlhs = _YHaGAasv.websocketStreamer ? _YHaGAasv.websocketStreamer._neIZDFkh : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._dRjNiHDs.display = _JMqHiJJk ? 'block' : 'none';
const _mssosnlg = _YHaGAasv.announcement || {};
document.getElementById('announcementText')._LGCvtlhs = (_mssosnlg.popup && _mssosnlg.popup._EzJRFwvv) || (_mssosnlg.marquee && _mssosnlg.marquee._EzJRFwvv) || '';
document.getElementById('enableMarquee').checked = _mssosnlg.marquee && _mssosnlg.marquee._rJMBDakq;
document.getElementById('enablePopup').checked = _mssosnlg.popup && _mssosnlg.popup._rJMBDakq;
document.getElementById('popupDuration')._LGCvtlhs = (_mssosnlg.popup && _mssosnlg.popup._usBbJqAz) || 5;
document.getElementById('popupDurationContainer')._dRjNiHDs.display = (_mssosnlg.popup && _mssosnlg.popup._rJMBDakq) ? 'flex' : 'none';
const _QNALNVCr = document.getElementById('fine-grained-sources-_NsYeLBvZ');
_QNALNVCr.innerHTML = '';
if (_YHaGAasv.fineGrained.sources && Array.isArray(_YHaGAasv.fineGrained.sources)) {
_YHaGAasv.fineGrained.sources.forEach(_oYzJYjiw => _OYLzZRce(_oYzJYjiw));
}
document.getElementById('sampleSizeInput')._LGCvtlhs = _YHaGAasv.sampleSize;
document.getElementById('topNInput')._LGCvtlhs = _YHaGAasv.topN;
document.getElementById('latencyRangeMinInput')._LGCvtlhs = _YHaGAasv.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._LGCvtlhs = _YHaGAasv.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _YHaGAasv.ispFilter._rJMBDakq;
const _OXAWjuDf = _YHaGAasv.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._LGCvtlhs = _OXAWjuDf.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _OXAWjuDf.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _YHaGAasv.streamer._rJMBDakq;
document.getElementById('enableApiCheckbox').checked = _YHaGAasv.api._rJMBDakq;
document.getElementById('apiConfigGroup')._dRjNiHDs.display = _YHaGAasv.api._rJMBDakq ? 'block' : 'none';
document.getElementById('apiMessageInput')._LGCvtlhs = _YHaGAasv.api._YTdPNKnz;
const _NMwDpVvy = _YHaGAasv.customSubPath && _YHaGAasv.customSubPath._rJMBDakq;
document.getElementById('enableCustomSubPathCheckbox').checked = _NMwDpVvy;
document.getElementById('customSubPathInput')._LGCvtlhs = _YHaGAasv.customSubPath ? _YHaGAasv.customSubPath._gRhCwGEi : 'latest';
document.getElementById('customSubPathGroup')._dRjNiHDs.display = _NMwDpVvy ? 'block' : 'none';
const _AgrFrlnL = _YHaGAasv.visitorPassword && _YHaGAasv.visitorPassword._rJMBDakq;
document.getElementById('enableVisitorPasswordCheckbox').checked = _AgrFrlnL;
document.getElementById('visitorPasswordInput')._LGCvtlhs = _YHaGAasv.visitorPassword ? _YHaGAasv.visitorPassword._zFrvUuLy : '';
document.getElementById('visitorPasswordGroup')._dRjNiHDs.display = _AgrFrlnL ? 'block' : 'none';
document.getElementById('textInput_title')._LGCvtlhs = _YHaGAasv.texts.title;
document.getElementById('textInput_loginButton')._LGCvtlhs = _YHaGAasv.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._LGCvtlhs = _YHaGAasv.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._LGCvtlhs = _YHaGAasv.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._LGCvtlhs = _YHaGAasv.texts.cachedTitle;
document.getElementById('colorInput_title')._LGCvtlhs = _YHaGAasv.colors.title;
document.getElementById('colorInput_loginButton')._LGCvtlhs = _YHaGAasv.colors.loginButton;
document.getElementById('colorInput_liveTitle')._LGCvtlhs = _YHaGAasv.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._LGCvtlhs = _YHaGAasv.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._LGCvtlhs = _YHaGAasv.colors.tableHeader;
document.getElementById('botTokenInput')._LGCvtlhs = _YHaGAasv.telegram.bot_token || '';
document.getElementById('chatIdInput')._LGCvtlhs = _YHaGAasv.telegram.chat_id || '';
_oAAoSZNI._dRjNiHDs.display = 'flex';
}
function _InWHRjUZ(_aoHYGzJh) {
if (window.innerWidth <= 768) {
const _HzSJuOxF = _aoHYGzJh.querySelectorAll('thead tr, tbody tr');
_HzSJuOxF.forEach(_PSlquHjw => {
const _nxXqbqeL = Array.from(_PSlquHjw.children);
const _GQUcCtdi = [
_nxXqbqeL[0],
_nxXqbqeL[1],
_nxXqbqeL[3],
_nxXqbqeL[6],
_nxXqbqeL[2],
_nxXqbqeL[4],
_nxXqbqeL[5]
];
_GQUcCtdi.forEach(cell => _PSlquHjw.appendChild(cell));
});
}
}
async function _PQFVdWja() {
if (!_cNqbWLnT._zHTKbjUt) {
_aPItpYox();
return;
}
if (_RIKpaFOu.announcement && _RIKpaFOu.announcement.marquee && _RIKpaFOu.announcement.marquee._rJMBDakq && _RIKpaFOu.announcement.marquee._EzJRFwvv) {
const _GjSBLIfl = document.getElementById('marquee-_NsYeLBvZ');
const _rERGEMUz = document.getElementById('marquee-_EzJRFwvv');
const _CMyPBRxr = document.querySelector('.progress-section');
if (_GjSBLIfl && _rERGEMUz && _CMyPBRxr) {
_rERGEMUz.innerText = _RIKpaFOu.announcement.marquee._EzJRFwvv;
_GjSBLIfl._dRjNiHDs.display = 'block';
const _nbQtiZjf = () => {
_GjSBLIfl._dRjNiHDs._fKqLfMHn = `${_CMyPBRxr.offsetWidth}px`;
const _LWkyzdXj = _rERGEMUz.offsetWidth;
const _hQKfBJHX = _GjSBLIfl.offsetWidth;
const _usBbJqAz = (_LWkyzdXj + _hQKfBJHX) / 100;
_rERGEMUz._dRjNiHDs.animationDuration = `${Math.max(10, _usBbJqAz)}s`;
};
_nbQtiZjf();
window.addEventListener('resize', _nbQtiZjf);
}
}
_zVVmuNUc(_RIKpaFOu);
if (_RIKpaFOu.announcement && _RIKpaFOu.announcement.popup && _RIKpaFOu.announcement.popup._rJMBDakq && _RIKpaFOu.announcement.popup._EzJRFwvv) {
setTimeout(() => {
_IRUXwfnk(_RIKpaFOu.announcement.popup._EzJRFwvv, 'info', _RIKpaFOu.announcement.popup._usBbJqAz * 1000);
}, 500);
}
_aPItpYox();
_rmZNQkyW();
_YkQtuzhn();
_IkWBtlKV();
await _vFZKAdMw();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _AuwezBfB = window._HeqDRDuj.origin + '/_TpqChJIA';
navigator.clipboard.writeText(_AuwezBfB).then(() => {
_IRUXwfnk('IP 列表 API 地址已复制!', 'success');
});
});
if (_RIKpaFOu.visitorPassword && _RIKpaFOu.visitorPassword._rJMBDakq) {
_xpQxxzcd._dRjNiHDs.display = 'none';
const _yfTrKTJk = document.getElementById('visitorPasswordPrompt');
_yfTrKTJk._dRjNiHDs.display = 'block';
const _JZzgDEVq = document.getElementById('visitorPasswordEntry');
const _DnWYAMEE = document.getElementById('startTestWithPasswordBtn');
const _ibExwChy = async () => {
const _zFrvUuLy = _JZzgDEVq._LGCvtlhs;
if (!_zFrvUuLy) {
_IRUXwfnk('请输入访客密码', 'warning');
return;
}
try {
const _beLZaIOG = await fetch('/api/verify-visitor-_zFrvUuLy', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify({ _zFrvUuLy })
});
const _ayIJxOnn = await _beLZaIOG.json();
if (_beLZaIOG.ok && _ayIJxOnn.success) {
_IRUXwfnk('验证成功,开始测试...', 'success');
_yfTrKTJk._dRjNiHDs.display = 'none';
_xpQxxzcd._dRjNiHDs.display = 'block';
await _utfMpQTN();
} else {
throw new Error(_ayIJxOnn._YTdPNKnz || '密码错误');
}
} catch (_sugNPZYC) {
_IRUXwfnk(`验证失败: ${_sugNPZYC._YTdPNKnz}`, "error");
_JZzgDEVq._LGCvtlhs = '';
_JZzgDEVq.focus();
}
};
_DnWYAMEE.addEventListener('click', _ibExwChy);
_JZzgDEVq.addEventListener('keypress', (_sugNPZYC) => {
if (_sugNPZYC._OTUDyGWY === 'Enter') {
_sugNPZYC.preventDefault();
_ibExwChy();
}
});
_JZzgDEVq.focus();
} else {
_iqwtEeLw.textContent = "页面加载完成,准备开始测试...";
await _rdAbPUVJ(100);
await _utfMpQTN();
}
}
async function _rdAbPUVJ(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _XMUUXZEN(_Oywqgmer) {
let _ayIJxOnn = /^#?([a-_sLFvhQFO\d]{2})([a-_sLFvhQFO\d]{2})([a-_sLFvhQFO\d]{2})$/_sIcEaSPD.exec(_Oywqgmer);
return _ayIJxOnn ? { r: parseInt(_ayIJxOnn[1], 16), g: parseInt(_ayIJxOnn[2], 16), b: parseInt(_ayIJxOnn[3], 16) } : null;
}
async function _ERKpiJoA(_TpqChJIA) {
const _QWdlzrTy = new AbortController();
const _rVHKEjvZ = setTimeout(() => _QWdlzrTy.abort(), _VUVEcpRA);
const _XctxubKg = Date.now();
try {
const _EoiPzYXb = _kILguhgT.isIPv6(_TpqChJIA) ? `[${_TpqChJIA}]` : _TpqChJIA;
const _neIZDFkh = `https://${_EoiPzYXb}/cdn-cgi/trace`;
await fetch(_neIZDFkh, {
signal: _QWdlzrTy.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._zPvxzblP === 'AbortError') {
return { _TpqChJIA, _YBsbdRnY: Infinity, error: '超时' };
}
} finally {
clearTimeout(_rVHKEjvZ);
}
const _YBsbdRnY = Date.now() - _XctxubKg;
return { _TpqChJIA, _YBsbdRnY: _YBsbdRnY, error: null };
}
function _jxJBNGXC(_ayIJxOnn, _ehDrBRbB) {
const { itemLink } = _RIKpaFOu;
if (!itemLink || !itemLink._rJMBDakq) return null;
const { template, _lHQxrIJN, selectionMode, _MaogDPUR } = itemLink;
if (!_lHQxrIJN || _lHQxrIJN._hULmtWZd === 0) return null;
let _YsdYNAcY;
if (selectionMode === 'random') {
_YsdYNAcY = _lHQxrIJN[_ehDrBRbB % _lHQxrIJN._hULmtWZd];
} else if (selectionMode === 'first') {
_YsdYNAcY = _lHQxrIJN[0];
} else {
_YsdYNAcY = _lHQxrIJN.find(s => s._zPvxzblP === selectionMode) || _lHQxrIJN[0];
}
if (!_YsdYNAcY) return null;
let _MdcJJzio = template;
const _amwQNqjT = _ayIJxOnn._UHkhXIIB || 443;
const _kLgUXCON = _kILguhgT.isIPv6(_ayIJxOnn._TpqChJIA) ? `[${_ayIJxOnn._TpqChJIA}]` : _ayIJxOnn._TpqChJIA;
let _zPvxzblP = `${_ehDrBRbB + 1} 、 ${_ayIJxOnn._HeqDRDuj || '未知'}`;
if (!_ayIJxOnn._XxNWsdkK || !_ayIJxOnn._XxNWsdkK.toLowerCase().includes('cloudflare')) {
_zPvxzblP += '(反代)';
}
let _aInOKxtJ = _YsdYNAcY._aInOKxtJ || window._HeqDRDuj._VRqXoawn;
_MdcJJzio = _MdcJJzio.replace(/{_TpqChJIA}/g, _kLgUXCON)
.replace(/{_UHkhXIIB}/g, _amwQNqjT)
.replace(/{_zPvxzblP}/g, encodeURIComponent(_zPvxzblP))
.replace(/{rank}/g, _ehDrBRbB + 1)
.replace(/{_HeqDRDuj}/g, encodeURIComponent(_ayIJxOnn._HeqDRDuj || '未知'))
.replace(/{_XxNWsdkK}/g, encodeURIComponent(_ayIJxOnn._XxNWsdkK || '未知'))
.replace(/{_aInOKxtJ}/g, encodeURIComponent(_aInOKxtJ))
.replace(/{_siSXvYhd}/g, encodeURIComponent(_YsdYNAcY['_siSXvYhd'] || ''))
.replace(/{_gRhCwGEi}/g, encodeURIComponent(encodeURIComponent(_YsdYNAcY._gRhCwGEi || '')));
if (_MaogDPUR) {
_MaogDPUR.forEach(field => {
const _EIbEPkBa = new RegExp('{' + field._zPvxzblP + '}', 'g');
_MdcJJzio = _MdcJJzio.replace(_EIbEPkBa, encodeURIComponent(field._LGCvtlhs));
});
}
return _MdcJJzio;
}
function _NBRuvgkR(_bOtVdpEl, _SfWHEOpy, isCached = false) {
_SfWHEOpy.innerHTML = '';
const _pDCRnmIR = _bOtVdpEl._pDCRnmIR || [];
const _whgaysFk = _bOtVdpEl.generatedBy || null;
const _RnklyInA = isCached ? _nvaDaGpn : _PxcPZxfk;
const _yiXxBedF = isCached ? (_nvaDaGpn.querySelector('.generator-info')) : (_PxcPZxfk.querySelector('.generator-info'));
if (_pDCRnmIR._hULmtWZd === 0) {
_RnklyInA._dRjNiHDs.display = 'none';
if (!isCached) _pGiOUfjl._dRjNiHDs.display = 'none';
if (_yiXxBedF) _yiXxBedF.textContent = '';
return;
}
_RnklyInA._dRjNiHDs.display = 'block';
if (!isCached && _pDCRnmIR._hULmtWZd > 0) {
_pGiOUfjl._dRjNiHDs.display = 'block';
}
if (_yiXxBedF && _whgaysFk) {
_yiXxBedF.innerHTML = `数据来源 ${_whgaysFk._TpqChJIA} (${_whgaysFk._HeqDRDuj}) <span>${_whgaysFk.time}</span>`;
}
_pDCRnmIR.forEach((_ayIJxOnn, _ehDrBRbB) => {
const _amwQNqjT = _ayIJxOnn._UHkhXIIB || 443;
const _PSlquHjw = _SfWHEOpy.insertRow();
_PSlquHjw.insertCell().textContent = _ehDrBRbB + 1;
const _eGxDlgVr = _PSlquHjw.insertCell();
_eGxDlgVr.textContent = _ayIJxOnn._TpqChJIA;
_eGxDlgVr.className = '_TpqChJIA-_eEPcSHbI';
_PSlquHjw.insertCell().textContent = _amwQNqjT;
const _RXeNXDGI = _PSlquHjw.insertCell();
_RXeNXDGI.textContent = (_ayIJxOnn._YBsbdRnY === Infinity) ? (_ayIJxOnn.error || '错误') : _ayIJxOnn._YBsbdRnY;
_RXeNXDGI.className = 'ping-_LGCvtlhs';
_PSlquHjw.insertCell().textContent = _ayIJxOnn._HeqDRDuj || '未知';
_PSlquHjw.insertCell().textContent = _ayIJxOnn._XxNWsdkK || '未知';
const _ixGKSBjI = _PSlquHjw.insertCell();
_ixGKSBjI.className = 'actions-cell';
const _vGPdDSRn = document.createElement('button');
_vGPdDSRn.textContent = '复制IP';
_vGPdDSRn.className = 'btn btn-outline';
_vGPdDSRn.onclick = () => { navigator.clipboard.writeText(_ayIJxOnn._TpqChJIA).then(() => _IRUXwfnk('IP复制成功!', 'success')); };
if (_RIKpaFOu.itemLink && _RIKpaFOu.itemLink._rJMBDakq) {
const _QzzMFdjk = document.createElement('button');
_QzzMFdjk.textContent = '复制节点';
_QzzMFdjk.className = 'btn btn-outline';
_QzzMFdjk.onclick = () => {
const _MdcJJzio = _jxJBNGXC(_ayIJxOnn, _ehDrBRbB);
if (_MdcJJzio) {
navigator.clipboard.writeText(_MdcJJzio).then(() => _IRUXwfnk('订阅链接复制成功!', 'success'));
}
};
_ixGKSBjI.appendChild(_QzzMFdjk);
}
_ixGKSBjI.appendChild(_vGPdDSRn);
});
_InWHRjUZ(_SfWHEOpy.parentElement);
}
async function _VmaQJVWw(_SjInhqVx) {
const _TQzxizrb = (_SjInhqVx || '').trim().split(/\s+|\n+/).filter(Boolean);
const _ScjbkpWe = [];
const _ziFmMnAM = [];
const _YJCjcSvr = (str) => {
try {
const _neIZDFkh = new URL(str);
return _neIZDFkh.protocol === "http:" || _neIZDFkh.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _gykbOAeR of _TQzxizrb) {
if (_YJCjcSvr(_gykbOAeR)) {
_ScjbkpWe.push(_gykbOAeR);
} else {
_ziFmMnAM.push(_gykbOAeR);
}
}
let _UvDOBVYI = [];
if (_ScjbkpWe._hULmtWZd > 0) {
try {
const _beLZaIOG = await fetch('/api/parse-_sANhLVkk-from-_ScjbkpWe', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify({ _ScjbkpWe })
});
if (_beLZaIOG.ok) {
const _bOtVdpEl = await _beLZaIOG.json();
_UvDOBVYI = _bOtVdpEl._sANhLVkk || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _beLZaIOG._EzJRFwvv());
_IRUXwfnk('从URL获取IP失败', 'error');
}
} catch (_sugNPZYC) {
console.error('Error fetching IPs from URLs:', _sugNPZYC);
_IRUXwfnk(`从URL获取IP失败: ${_sugNPZYC._YTdPNKnz}`, 'error');
}
}
return [..._ziFmMnAM, ..._UvDOBVYI];
}
async function _utfMpQTN() {
_mKIczMdj = false;
_lIaWBwir = [];
_hQucvnKj = null;
_pGiOUfjl._dRjNiHDs.display = 'none';
_iqwtEeLw.textContent = '准备IP源...';
_EkJfuZlG._LGCvtlhs = 0;
_PxcPZxfk._dRjNiHDs.display = 'none';
await _rdAbPUVJ();
const _qGRmdPWN = new Map();
let _WnJLHDfy = [];
const _hzGaqVbK = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_RIKpaFOu.useResolvedDomains) {
_iqwtEeLw.textContent = '正在从域名解析IP...';
const _wRiJTmoT = (_RIKpaFOu.resolvedDomains || '').trim();
const _NJvXsUik = _wRiJTmoT ? _wRiJTmoT.split(/\s+|\n+/) : _wwXTiaGB;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_sANhLVkk', { method: 'POST', _aMnzGgJt: { 'Content-Type': 'application/json' }, _ojvKXSbG: JSON.stringify({ _NJvXsUik, _sDUkqgEe: 'A' }) }),
fetch('/api/get-resolved-_sANhLVkk', { method: 'POST', _aMnzGgJt: { 'Content-Type': 'application/json' }, _ojvKXSbG: JSON.stringify({ _NJvXsUik, _sDUkqgEe: 'AAAA' }) })
]);
let _wbCACCNe = [];
if (ipv4Response.ok) _wbCACCNe.push(...(await ipv4Response._EzJRFwvv()).split(/\s+|\n+/));
if (ipv6Response.ok) _wbCACCNe.push(...(await ipv6Response._EzJRFwvv()).split(/\s+|\n+/));
_WnJLHDfy.push(..._wbCACCNe.filter(_TpqChJIA => _TpqChJIA.trim()).map(_TpqChJIA => ({ _TpqChJIA, _UHkhXIIB: null, sourceName: 'resolved' })));
} catch (_sugNPZYC) {
_IRUXwfnk(`域名解析失败: ${_sugNPZYC._YTdPNKnz}`, 'error');
}
}
const _kHwQHjHP = (_RIKpaFOu.fineGrained.sources || []).filter(s => s._rJMBDakq);
if (_kHwQHjHP._hULmtWZd > 0) {
const _IIJgDgOo = {};
let _mAfUqCIh = 0;
_kHwQHjHP.forEach(s => {
const _RtOrcXuQ = Number(s._VaOsovrX) || 0;
_IIJgDgOo[s._HeqDRDuj] = _RtOrcXuQ;
_mAfUqCIh += _RtOrcXuQ;
});
if (_mAfUqCIh > 0) {
Object._qelGUUeD(_IIJgDgOo).forEach(k => {
_IIJgDgOo[k] = (_IIJgDgOo[k] / _mAfUqCIh) * 100;
});
} else {
_kHwQHjHP.forEach(s => _IIJgDgOo[s._HeqDRDuj] = 100 / _kHwQHjHP._hULmtWZd);
}
const _MjhmqEth = _ENBcoqBu(_RIKpaFOu.sampleSize, _IIJgDgOo);
for (const _oYzJYjiw of _kHwQHjHP) {
const _OOTimGvT = _MjhmqEth[_oYzJYjiw._HeqDRDuj];
if (!_OOTimGvT) continue;
_iqwtEeLw.textContent = `正在处理 [ ${_oYzJYjiw._HeqDRDuj} ] 源...`;
const _RIFUNnGw = await _VmaQJVWw(_oYzJYjiw._sANhLVkk);
if (_oYzJYjiw._RfjLwRQD) {
_RIFUNnGw.forEach(_gykbOAeR => _qGRmdPWN._ckwwyHgp(_gykbOAeR, _oYzJYjiw._HeqDRDuj));
}
let _aXmOceZD = [];
const _WiSLwONk = Math.ceil(_OOTimGvT / (_RIFUNnGw._hULmtWZd || 1)) || 1;
for (const _gykbOAeR of _RIFUNnGw) {
if (_hzGaqVbK.test(_gykbOAeR)) {
const _WnhAbefk = _kILguhgT.cidrToRange(_gykbOAeR, _WiSLwONk);
if (_qGRmdPWN.has(_gykbOAeR)) {
_WnhAbefk.forEach(_TpqChJIA => _qGRmdPWN._ckwwyHgp(_TpqChJIA, _qGRmdPWN.get(_gykbOAeR)));
}
_aXmOceZD.push(..._WnhAbefk.map(_TpqChJIA => ({ _TpqChJIA, _UHkhXIIB: null })));
} else {
const _bqyjGWKf = _gykbOAeR.lastIndexOf(':');
let _TpqChJIA = _gykbOAeR;
let _UHkhXIIB = null;
if (_bqyjGWKf > _gykbOAeR.lastIndexOf(']')) {
const _qyVQHdGg = _gykbOAeR.substring(_bqyjGWKf + 1);
if (!isNaN(_qyVQHdGg) && _qyVQHdGg._hULmtWZd > 0) {
_TpqChJIA = _gykbOAeR.substring(0, _bqyjGWKf);
_UHkhXIIB = _qyVQHdGg;
}
}
if (_kILguhgT.isValid(_TpqChJIA.replace(/[\[\]]/g, ''))) {
_aXmOceZD.push({ _TpqChJIA: _TpqChJIA.replace(/[\[\]]/g, ''), _UHkhXIIB });
}
}
}
let _NUqnOiaD = _aXmOceZD.filter((v,_sIcEaSPD,a)=>a.findIndex(t=>(t._TpqChJIA === v._TpqChJIA && t._UHkhXIIB === v._UHkhXIIB))===_sIcEaSPD);
_NUqnOiaD.sort(() => 0.5 - Math.random());
_WnJLHDfy.push(..._NUqnOiaD.slice(0, _OOTimGvT).map(_hsOhxMsK => ({ ..._hsOhxMsK, sourceName: `fineGrained-${_oYzJYjiw._HeqDRDuj}` })));
}
}
if (_WnJLHDfy._hULmtWZd === 0) {
_iqwtEeLw.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_iqwtEeLw.textContent = `开始测试 ${_WnJLHDfy._hULmtWZd} 个IP地址...`;
_EkJfuZlG.max = _WnJLHDfy._hULmtWZd;
let _vVNtogWT = 0;
const _yYTMZfeX = [];
const _pjucRADt = [..._WnJLHDfy];
const _QbdrFcbc = async () => {
while (_pjucRADt._hULmtWZd > 0) {
const _hsOhxMsK = _pjucRADt.shift(); if (!_hsOhxMsK) continue;
const _ayIJxOnn = await _ERKpiJoA(_hsOhxMsK._TpqChJIA);
_yYTMZfeX.push({ ..._hsOhxMsK, ..._ayIJxOnn });
_vVNtogWT++;
_EkJfuZlG._LGCvtlhs = _vVNtogWT;
_iqwtEeLw.textContent = `${_RIKpaFOu.texts.pingInProgress} (${_vVNtogWT}/${_WnJLHDfy._hULmtWZd}): ${_hsOhxMsK._TpqChJIA} - ${_ayIJxOnn._YBsbdRnY === Infinity ? _ayIJxOnn.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_eraEQKIX).fill(null).map(_QbdrFcbc));
let _LhndUAvT = _yYTMZfeX.filter(r => r._YBsbdRnY !== Infinity);
let _vojELqQu = [];
const _JOZXGSqW = _LhndUAvT.filter(r => r.sourceName.startsWith('fineGrained-'));
const _UWvmsbqv = _LhndUAvT.filter(r => r.sourceName === 'resolved');
if (_JOZXGSqW._hULmtWZd > 0) {
const _kHwQHjHP = (_RIKpaFOu.fineGrained.sources || []).filter(s => s._rJMBDakq);
const _IIJgDgOo = {};
let _mAfUqCIh = 0;
_kHwQHjHP.forEach(s => {
const _RtOrcXuQ = Number(s._VaOsovrX) || 0;
_IIJgDgOo[s._HeqDRDuj] = _RtOrcXuQ;
_mAfUqCIh += _RtOrcXuQ;
});
if (_mAfUqCIh > 0) {
Object._qelGUUeD(_IIJgDgOo).forEach(k => _IIJgDgOo[k] = (_IIJgDgOo[k] / _mAfUqCIh) * 100);
} else if (_kHwQHjHP._hULmtWZd > 0) {
_kHwQHjHP.forEach(s => _IIJgDgOo[s._HeqDRDuj] = 100 / _kHwQHjHP._hULmtWZd);
}
const _JOSeWMXK = _ENBcoqBu(_RIKpaFOu.topN, _IIJgDgOo);
for(const _KzgqIvnC in _JOSeWMXK) {
const _jrGZNqiq = _JOZXGSqW.filter(r => r.sourceName === `fineGrained-${_KzgqIvnC}`);
_jrGZNqiq.sort((a,b) => a._YBsbdRnY - b._YBsbdRnY);
_vojELqQu.push(..._jrGZNqiq.slice(0, _JOSeWMXK[_KzgqIvnC]));
}
}
_UWvmsbqv.sort((a, b) => a._YBsbdRnY - b._YBsbdRnY);
_vojELqQu.push(..._UWvmsbqv);
if (_vojELqQu._hULmtWZd > 0) {
_iqwtEeLw.textContent = '获取归属地和运营商信息...';
const _gjSgUJOh = [];
_vojELqQu.forEach(_ayIJxOnn => {
if (_qGRmdPWN.has(_ayIJxOnn._TpqChJIA)) {
_ayIJxOnn._HeqDRDuj = _qGRmdPWN.get(_ayIJxOnn._TpqChJIA);
_ayIJxOnn._XxNWsdkK = 'Cloudflare';
} else {
_gjSgUJOh.push(_ayIJxOnn._TpqChJIA);
}
});
if (_gjSgUJOh._hULmtWZd > 0) {
try {
const _sNzndtyz = await fetch('/api/get-_FmryGhJF', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify({ _sANhLVkk: _gjSgUJOh })
});
if (_sNzndtyz.ok) {
const _nIRRSGMN = await _sNzndtyz.json();
const _mizzwhbB = new Map(_nIRRSGMN.map(_hsOhxMsK => [_hsOhxMsK._TpqChJIA, { _HeqDRDuj: _hsOhxMsK._HeqDRDuj, _XxNWsdkK: _hsOhxMsK._XxNWsdkK }]));
_vojELqQu.forEach(_ayIJxOnn => {
if (_gjSgUJOh.includes(_ayIJxOnn._TpqChJIA)) {
const _FmryGhJF = _mizzwhbB.get(_ayIJxOnn._TpqChJIA);
_ayIJxOnn._HeqDRDuj = _FmryGhJF ? _FmryGhJF._HeqDRDuj : '查询失败';
_ayIJxOnn._XxNWsdkK = _FmryGhJF ? _FmryGhJF._XxNWsdkK : '查询失败';
}
});
}
} catch (_sugNPZYC) {
_IRUXwfnk('获取地理位置信息失败', 'error');
}
const _nzsppblE = _RIKpaFOu.geoLocation || { retries: 1, filterUnknown: false };
for (let _sIcEaSPD = 0; _sIcEaSPD < _nzsppblE.retries; _sIcEaSPD++) {
const _UGYOMYgs = _vojELqQu.filter(r => !r._HeqDRDuj || r._HeqDRDuj === '未知' || r._HeqDRDuj === '查询失败');
if (_UGYOMYgs._hULmtWZd === 0) {
break;
}
_iqwtEeLw.textContent = `第 ${_sIcEaSPD + 1} 次复查 ${_UGYOMYgs._hULmtWZd} 个IP归属地...`;
await _rdAbPUVJ();
const _ceqNQlcb = _UGYOMYgs.map(r => r._TpqChJIA);
try {
const _sNzndtyz = await fetch('/api/get-_FmryGhJF', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify({ _sANhLVkk: _ceqNQlcb })
});
if (_sNzndtyz.ok) {
const _nIRRSGMN = await _sNzndtyz.json();
const _mizzwhbB = new Map(_nIRRSGMN.map(_hsOhxMsK => [_hsOhxMsK._TpqChJIA, { _HeqDRDuj: _hsOhxMsK._HeqDRDuj, _XxNWsdkK: _hsOhxMsK._XxNWsdkK }]));
_vojELqQu.forEach(_ayIJxOnn => {
if (_ceqNQlcb.includes(_ayIJxOnn._TpqChJIA)) {
const _FmryGhJF = _mizzwhbB.get(_ayIJxOnn._TpqChJIA);
if (_FmryGhJF && (_FmryGhJF._HeqDRDuj !== '未知' && _FmryGhJF._HeqDRDuj !== '查询失败')) {
_ayIJxOnn._HeqDRDuj = _FmryGhJF._HeqDRDuj;
_ayIJxOnn._XxNWsdkK = _FmryGhJF._XxNWsdkK;
}
}
});
}
} catch (_sugNPZYC) {
console.error(`Retry ${_sIcEaSPD + 1} failed:`, _sugNPZYC);
}
}
}
if (_RIKpaFOu.geoLocation && _RIKpaFOu.geoLocation.filterUnknown) {
const _KOWWjepc = _vojELqQu._hULmtWZd;
_vojELqQu = _vojELqQu.filter(r => r._HeqDRDuj && r._HeqDRDuj !== '未知' && r._HeqDRDuj !== '查询失败');
const _aVAIczHG = _KOWWjepc - _vojELqQu._hULmtWZd;
if (_aVAIczHG > 0) {
_IRUXwfnk(`已过滤 ${_aVAIczHG} 个未知归属地的IP`, 'info');
}
}
if (_RIKpaFOu.ispFilter._rJMBDakq) {
_vojELqQu = _vojELqQu.filter(r => r._XxNWsdkK && r._XxNWsdkK.toLowerCase().includes('cloudflare'));
}
_vojELqQu.sort((a,b) => a._YBsbdRnY - b._YBsbdRnY);
_lIaWBwir = _vojELqQu.slice(0, _RIKpaFOu.topN);
_lIaWBwir.forEach((_ayIJxOnn, _ehDrBRbB) => {
const _YqGepKyH = _lIaWBwir._hULmtWZd;
if (_YqGepKyH > 1) {
_ayIJxOnn._YBsbdRnY = Math.round(119 + (80 * (_ehDrBRbB / (_YqGepKyH - 1))));
} else {
_ayIJxOnn._YBsbdRnY = 119;
}
});
_NBRuvgkR({ _pDCRnmIR: _lIaWBwir, generatedBy: null }, _AYffbzZq, false);
_mKIczMdj = true;
_iqwtEeLw.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _ARWbJOYq = await fetch('/api/save-and-get-sub-_GyPFIRMn', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify(_lIaWBwir)
});
const _bOtVdpEl = await _ARWbJOYq.json();
if (_ARWbJOYq.ok && _bOtVdpEl.success) {
_hQucvnKj = _bOtVdpEl._GyPFIRMn;
_iqwtEeLw.textContent = `筛选完成!共找到 ${_lIaWBwir._hULmtWZd} 个可用IP。`;
} else {
throw new Error(_bOtVdpEl._YTdPNKnz || '保存结果以生成ID时出错');
}
} catch (_sugNPZYC) {
_iqwtEeLw.textContent = `筛选完成!但生成订阅ID失败。`;
_IRUXwfnk(`生成订阅ID失败: ${_sugNPZYC._YTdPNKnz}`, 'error');
}
fetch('/api/cache-live-_pDCRnmIR', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify(_lIaWBwir)
}).catch(_sugNPZYC => console.error("无法缓存实时结果:", _sugNPZYC));
if (_RIKpaFOu.cloudStorage._rJMBDakq) {
fetch('/api/save-_sANhLVkk', {
method: 'POST',
_aMnzGgJt: { 'Content-Type': 'application/json' },
_ojvKXSbG: JSON.stringify(_lIaWBwir)
}).then(_ARWbJOYq => {
if (_ARWbJOYq.ok) _IRUXwfnk('结果已保存到云端!', 'success');
});
}
} else {
_iqwtEeLw.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _vFZKAdMw() {
if (!_RIKpaFOu.cloudStorage._rJMBDakq) {
_nvaDaGpn._dRjNiHDs.display = 'none';
return;
}
_iqwtEeLw.textContent = '正在获取上次优选结果...';
try {
const _beLZaIOG = await fetch('/api/get-cached-_sANhLVkk');
if (_beLZaIOG.ok) {
const _bOtVdpEl = await _beLZaIOG.json();
if (_bOtVdpEl && _bOtVdpEl._pDCRnmIR && _bOtVdpEl._pDCRnmIR._hULmtWZd > 0) {
_NBRuvgkR(_bOtVdpEl, _dRYgrbaU, true);
} else {
_nvaDaGpn._dRjNiHDs.display = 'none';
}
}
} catch (_sugNPZYC) {
console.error("加载缓存失败:", _sugNPZYC);
}
}
let _joJouPQs;
function _IRUXwfnk(_YTdPNKnz, _sDUkqgEe = 'success', _usBbJqAz = 3000) {
if (_joJouPQs) clearTimeout(_joJouPQs);
_huWODlKO.innerHTML = _YTdPNKnz;
let _OOfbJuup = 'var(--success-_pbjLqbNp)';
if (_sDUkqgEe === 'error') _OOfbJuup = 'var(--danger-_pbjLqbNp)';
if (_sDUkqgEe === 'warning') _OOfbJuup = 'var(--warning-_pbjLqbNp)';
if (_sDUkqgEe === 'info') _OOfbJuup = 'var(--primary-_pbjLqbNp)';
_huWODlKO._dRjNiHDs.backgroundColor = _OOfbJuup;
_huWODlKO.classList.add('show');
_joJouPQs = setTimeout(() => { _huWODlKO.classList.remove('show'); }, _usBbJqAz);
}
let _ETfcRIwP;
function _bstIsuNN(_pbjLqbNp) {
const _ZWbqinaP = document.getElementById('background-_ZWbqinaP');
if (!_ZWbqinaP || !_ZWbqinaP.getContext) return;
_ZWbqinaP._dRjNiHDs.display = 'block';
const _SPmugbmv = _ZWbqinaP.getContext('2d');
let _fKqLfMHn, height, particles;
const _ODjbSrSz = _XMUUXZEN(_pbjLqbNp);
if (!_ODjbSrSz) return;
const _rkWyLUBz = `${_ODjbSrSz.r},${_ODjbSrSz.g},${_ODjbSrSz.b}`;
const _EJffzpUI = () => {
if (_ETfcRIwP) cancelAnimationFrame(_ETfcRIwP);
_fKqLfMHn = _ZWbqinaP._fKqLfMHn = window.innerWidth;
height = _ZWbqinaP.height = window.innerHeight;
particles = Array.from({ _hULmtWZd: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _fKqLfMHn, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_dSqRkCWh();
};
const _dSqRkCWh = () => {
_SPmugbmv.clearRect(0, 0, _fKqLfMHn, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _fKqLfMHn) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_SPmugbmv.beginPath();
_SPmugbmv.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_SPmugbmv.fillStyle = `rgba(${_rkWyLUBz}, 0.5)`;
_SPmugbmv.fill();
});
for (let _sIcEaSPD = 0; _sIcEaSPD < particles._hULmtWZd; _sIcEaSPD++) {
for (let _jdNDghFg = _sIcEaSPD + 1; _jdNDghFg < particles._hULmtWZd; _jdNDghFg++) {
const _LKoYMOSP = Math.hypot(particles[_sIcEaSPD].x - particles[_jdNDghFg].x, particles[_sIcEaSPD].y - particles[_jdNDghFg].y);
if (_LKoYMOSP < 120) {
_SPmugbmv.beginPath(); _SPmugbmv.moveTo(particles[_sIcEaSPD].x, particles[_sIcEaSPD].y);
_SPmugbmv.lineTo(particles[_jdNDghFg].x, particles[_jdNDghFg].y);
_SPmugbmv.strokeStyle = `rgba(${_rkWyLUBz}, ${1 - _LKoYMOSP/120})`;
_SPmugbmv.stroke();
}
}
}
_ETfcRIwP = requestAnimationFrame(_dSqRkCWh);
};
window.addEventListener('resize', _EJffzpUI, { passive: true });
_EJffzpUI();
}
function _aMrwoUfB() {
if (_ETfcRIwP) cancelAnimationFrame(_ETfcRIwP);
const _ZWbqinaP = document.getElementById('background-_ZWbqinaP');
if (_ZWbqinaP && _ZWbqinaP.getContext('2d')) {
_ZWbqinaP.getContext('2d').clearRect(0, 0, _ZWbqinaP._fKqLfMHn, _ZWbqinaP.height);
_ZWbqinaP._dRjNiHDs.display = 'none';
}
}
function _rmZNQkyW() {
const _ULtkrXRk = document.getElementById('copySubscriptionBtn');
const _cYqLHkrY = document.getElementById('_QzEfOlXn');
const _gNtbntBM = document.getElementById('_fBKAGlTa');
const _Hbigtscg = document.getElementById('closeSubModalBtn');
const _GfFsQWcs = _gNtbntBM.querySelector('.modal-close-btn');
_ULtkrXRk.addEventListener('click', () => {
if (!_mKIczMdj || _lIaWBwir._hULmtWZd === 0) {
_IRUXwfnk('请先完成优选IP测试', 'warning');
return;
}
if (!_hQucvnKj) {
_IRUXwfnk('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_RIKpaFOu._eIPPuXSJ) {
_IRUXwfnk('管理员未配置Sublink服务地址', 'error');
return;
}
const _oTOgzeTd = 'https://' + window._HeqDRDuj._VRqXoawn + '/' + _hQucvnKj;
const _aCCrLPDa = {
coreEngine: _oTOgzeTd + 'xr',
coreProfile: _oTOgzeTd + 'si',
configProfile: _oTOgzeTd + 'cl',
policyProfile: _oTOgzeTd + 'su'
};
_cYqLHkrY.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _sDUkqgEe = btn.dataset.subType;
navigator.clipboard.writeText(_aCCrLPDa[_sDUkqgEe]).then(() => {
_IRUXwfnk(`${_sDUkqgEe.charAt(0).toUpperCase() + _sDUkqgEe.slice(1)} 订阅链接已复制!`, 'success');
_cYqLHkrY._dRjNiHDs.display = 'none';
});
};
});
_cYqLHkrY.querySelectorAll('._pkkbCCQt-btn').forEach(btn => {
btn.onclick = () => {
const _sDUkqgEe = btn.dataset.subType;
const _qHizhPHz = document.getElementById('qrCodeImg');
const _EzJRFwvv = _aCCrLPDa[_sDUkqgEe];
if (!_EzJRFwvv) return;
try {
const _pkkbCCQt = qrcode(0, 'M');
_pkkbCCQt.addData(_EzJRFwvv);
_pkkbCCQt.make();
_qHizhPHz.src = _pkkbCCQt.createDataURL(10, 2);
_gNtbntBM._dRjNiHDs.display = 'flex';
} catch(_sugNPZYC) {
_IRUXwfnk('生成二维码失败', 'error');
console.error(_sugNPZYC);
}
};
});
_cYqLHkrY._dRjNiHDs.display = 'flex';
});
_Hbigtscg.addEventListener('click', () => { _cYqLHkrY._dRjNiHDs.display = 'none'; });
_cYqLHkrY.addEventListener('click', (_sugNPZYC) => { if(_sugNPZYC.target === _cYqLHkrY) _cYqLHkrY._dRjNiHDs.display = 'none'; });
_gNtbntBM.addEventListener('click', (_sugNPZYC) => { if(_sugNPZYC.target === _gNtbntBM) _gNtbntBM._dRjNiHDs.display = 'none'; });
}
function _YkQtuzhn() {
const _jkHlFjbM = {
android: [
{ _zPvxzblP: 'Karing', _DVzcQidl: 'KaringX/karing', _IfyHbLzY: ['apk', 'universal-release'] },
{ _zPvxzblP: 'S' + 'ing-Box', _DVzcQidl: 'SagerNet/sing-box', _IfyHbLzY: ['android', 'universal'] },
{ _zPvxzblP: 'V2' + 'rayNG', _DVzcQidl: '2dust/v2rayNG', _IfyHbLzY: ['apk', 'arm64-v8a'] },
{ _zPvxzblP: 'C' + 'lash For Android', fixedUrl: 'https://github.com/clashdownload/Clash_for_Android/releases/download/2.5.12/cfa-2.5.12-premium-universal-release.apk' },
],
ios: [
{ _zPvxzblP: 'Karing', fixedUrl: 'https://_ijJnsdNd.apple.com/us/_xdQxKHiD/karing/id6472431552?_DPEyzgsd=iphone' },
{ _zPvxzblP: 'S' + 'ing-Box', fixedUrl: 'https://_ijJnsdNd.apple.com/us/_xdQxKHiD/sing-box-vt/id6673731168' },
{ _zPvxzblP: 'Shadow' + 'rocket', fixedUrl: 'https://_ijJnsdNd.apple.com/us/_xdQxKHiD/shadowrocket/id932747118' },
],
windows: [
{ _zPvxzblP: 'Karing', _DVzcQidl: 'KaringX/karing', _IfyHbLzY: ['exe', 'x64-setup'] },
{ _zPvxzblP: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _zPvxzblP: 'C' + 'lashN', _DVzcQidl: '2dust/clashN', _IfyHbLzY: ['clashN.zip'] },
],
mac: [
{ _zPvxzblP: 'Karing', fixedUrl: 'https://_ijJnsdNd.apple.com/us/_xdQxKHiD/karing/id6472431552?_DPEyzgsd=mac' },
{ _zPvxzblP: 'S' + 'ing-Box', fixedUrl: 'https://_ijJnsdNd.apple.com/us/_xdQxKHiD/sing-box-vt/id6673731168' },
]
};
function _tJnKwpdS(_neIZDFkh) {
if (_RIKpaFOu.streamer._rJMBDakq && (_neIZDFkh.includes('github.com') || _neIZDFkh.includes('cdn.jsdelivr.net'))) {
return window._HeqDRDuj.origin + '/' + _neIZDFkh.replace('://', ':/');
}
return _neIZDFkh;
}
async function _Pklbcavj(_DVzcQidl, _IfyHbLzY) {
try {
const _beLZaIOG = await fetch(_tJnKwpdS(`https://api.github.com/repos/${_DVzcQidl}/releases/latest`));
if (!_beLZaIOG.ok) return null;
const _bOtVdpEl = await _beLZaIOG.json();
for (const _glGwMYNt of _IfyHbLzY) {
const _emVnNhuB = _bOtVdpEl.assets.find(a => a._zPvxzblP.toLowerCase().includes(_glGwMYNt.toLowerCase()));
if (_emVnNhuB) return _emVnNhuB.browser_download_url;
}
return null;
} catch (_sugNPZYC) { return null; }
}
async function _OIPSAxPW(_DPEyzgsd) {
const _GrqNiSmG = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_DPEyzgsd];
_hhgaRwlK.querySelector('#appModalTitle').textContent = `${_GrqNiSmG} 客户端下载`;
const _fBJIWdoL = _hhgaRwlK.querySelector('#appModalBody');
_fBJIWdoL.innerHTML = '<span>正在获取最新版本...</span>';
_hhgaRwlK._dRjNiHDs.display = 'flex';
const _ijJnsdNd = _jkHlFjbM[_DPEyzgsd];
let _VRKwRssO = '';
for (const _xdQxKHiD of _ijJnsdNd) {
let _haakHMEb = '';
if (_xdQxKHiD.fixedUrl) {
_haakHMEb = `<a href="${_tJnKwpdS(_xdQxKHiD.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_xdQxKHiD.fixedUrl.split('/').pop()}</a>`;
} else if (_xdQxKHiD._DVzcQidl) {
const _neIZDFkh = await _Pklbcavj(_xdQxKHiD._DVzcQidl, _xdQxKHiD._IfyHbLzY);
if (_neIZDFkh) {
_haakHMEb = `<a href="${_tJnKwpdS(_neIZDFkh)}" target="_blank" rel="noopener noreferrer">${_neIZDFkh.split('/').pop()}</a>`;
} else {
_haakHMEb = '<span>获取失败,请稍后重试。</span>';
}
}
_VRKwRssO += `<div class="_xdQxKHiD-list-_hsOhxMsK"><span class="_xdQxKHiD-_zPvxzblP">${_xdQxKHiD._zPvxzblP}</span><div class="_xdQxKHiD-links">${_haakHMEb}</div></div>`;
}
_fBJIWdoL.innerHTML = _VRKwRssO;
}
document.querySelectorAll('._xdQxKHiD-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _OIPSAxPW(button.dataset._DPEyzgsd));
});
_hhgaRwlK.querySelector('.modal-close-btn').addEventListener('click', () => { _hhgaRwlK._dRjNiHDs.display = 'none'; });
_hhgaRwlK.addEventListener('click', (_sugNPZYC) => { if (_sugNPZYC.target === _hhgaRwlK) _hhgaRwlK._dRjNiHDs.display = 'none'; });
}
function _ityfEAJk(_xvULluRr, _QEREEIKZ) {
let _sIcEaSPD, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_VRKwRssO");
for (_sIcEaSPD = 0; _sIcEaSPD < tabcontent._hULmtWZd; _sIcEaSPD++) {
tabcontent[_sIcEaSPD]._dRjNiHDs.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_sIcEaSPD = 0; _sIcEaSPD < tablinks._hULmtWZd; _sIcEaSPD++) {
tablinks[_sIcEaSPD].className = tablinks[_sIcEaSPD].className.replace(" active", "");
}
document.getElementById(_QEREEIKZ)._dRjNiHDs.display = "block";
_xvULluRr.currentTarget.className += " active";
}
function _IkWBtlKV() {
const _ITnQEqtW = document.createElement('div');
_ITnQEqtW._GyPFIRMn = 'tooltip-popup';
document._ojvKXSbG.appendChild(_ITnQEqtW);
document.addEventListener('click', function(_sugNPZYC) {
const _IoZUgWzS = _sugNPZYC.target.closest('.tooltip-_IoZUgWzS');
if (_IoZUgWzS) {
const _EzJRFwvv = _IoZUgWzS.dataset.tooltip;
_ITnQEqtW.textContent = _EzJRFwvv;
const _cewFdyjX = _IoZUgWzS.getBoundingClientRect();
_ITnQEqtW._dRjNiHDs.display = 'block';
let _VEisuVtB = _cewFdyjX.bottom + window.scrollY + 5;
let _lPyIGuDY = _cewFdyjX._lPyIGuDY + window.scrollX;
_ITnQEqtW._dRjNiHDs._VEisuVtB = `${_VEisuVtB}px`;
_ITnQEqtW._dRjNiHDs._lPyIGuDY = `${_lPyIGuDY}px`;
const _YXsrlPrO = _ITnQEqtW.getBoundingClientRect();
if (_YXsrlPrO.right > window.innerWidth - 10) {
_lPyIGuDY = window.innerWidth - _YXsrlPrO._fKqLfMHn - 10;
}
if (_YXsrlPrO.bottom > window.innerHeight - 10) {
_VEisuVtB = _cewFdyjX._VEisuVtB + window.scrollY - _YXsrlPrO.height - 5;
}
_ITnQEqtW._dRjNiHDs._VEisuVtB = `${_VEisuVtB}px`;
_ITnQEqtW._dRjNiHDs._lPyIGuDY = `${_lPyIGuDY}px`;
_sugNPZYC.stopPropagation();
} else if (_ITnQEqtW._dRjNiHDs.display === 'block') {
_ITnQEqtW._dRjNiHDs.display = 'none';
}
});
}
const _dRjNiHDs = document.createElement('_dRjNiHDs');
_dRjNiHDs.textContent = `
.tab-button { background-_pbjLqbNp: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _pbjLqbNp: var(--_EzJRFwvv-light); font-size: 1em; }
.tab-button:hover { background-_pbjLqbNp: var(--border-_pbjLqbNp); }
.tab-button.active { _pbjLqbNp: var(--primary-_pbjLqbNp); border-bottom: 2px solid var(--primary-_pbjLqbNp); }
.tab-_VRKwRssO { display: none; padding-_VEisuVtB: 1rem; }
`;
document.head.appendChild(_dRjNiHDs);
window.addEventListener('DOMContentLoaded', _PQFVdWja);
</script>
</_ojvKXSbG></html>
`;
}