import { connect } from "cloudflare:sockets";
const _nHnVajIF = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _pkvPpgtk = ["UpstreamAddress.SG.CMLiussss.net"];
const _DteOLKiy = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _rShxmsAy = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _PcPGLzVD = '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 _ntvesuxS = '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 _jqpNtfEi(_tHTUmKrx) {
if (Array.isArray(_tHTUmKrx)) {
try {
return String.fromCharCode.apply(null, _tHTUmKrx);
} catch (_xCydVfWL) {
return '';
}
}
return _tHTUmKrx;
}
function _wENsuRyC(_ZFMylRPE) {
return /^[0-9a-_IuEDKggu]{8}-[0-9a-_IuEDKggu]{4}-[4][0-9a-_IuEDKggu]{3}-[89ab][0-9a-_IuEDKggu]{3}-[0-9a-_IuEDKggu]{12}$/_uUkhUKtY.test(_ZFMylRPE);
}
const _BAKtQKzl = "optimized_ips_v4";
const _NwZYsUjH = "global_config_v4";
const _zJixQGui = "admin_password_v4";
const _vGleAeUq = "live_results_temp_v1";
const _dgnxTKKa = "latest_sub_id_v1";
export default {
async fetch(_NFlzziTu, _kSghXjZM, _keflYwWs) {
try {
if (!_kSghXjZM.DB) {
const _FCYfozFe = _eFZImgcf("D1 数据库 'DB' 未绑定。");
return new Response(_FCYfozFe, { status: 503, _VTWxvQwV: { 'Content-Type': '_dHJDuMPe/html;_bDmbqFUt=UTF-8' }});
}
_keflYwWs.waitUntil(
_kSghXjZM.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_sWpWHESH TEXT PRIMARY KEY, _tHTUmKrx TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_ZFMylRPE TEXT PRIMARY KEY, _VEFfqbuc TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_xCydVfWL => console.error("DB Init Error:", _xCydVfWL._MhwlvCzj))
);
const _tHpQGhxp = new URL(_NFlzziTu._tHpQGhxp);
const _MsJZEhdg = _tHpQGhxp.pathname;
const _qqFnQllB = _NFlzziTu._VTWxvQwV.get("Upgrade");
const _iBFSEHoA = await _REihPUSK(_kSghXjZM);
if (_iBFSEHoA.websocketStreamer && _iBFSEHoA.websocketStreamer._PxfEhgmV && _qqFnQllB && _qqFnQllB.toLowerCase() === "websocket") {
const _hFrOadzs = _iBFSEHoA.websocketStreamer._tHpQGhxp;
if (_hFrOadzs && _hFrOadzs.trim().startsWith('https://')) {
try {
const _DnYinjLw = new Request(_hFrOadzs.trim() + _tHpQGhxp.pathname + _tHpQGhxp.search, _NFlzziTu);
return await fetch(_DnYinjLw);
} catch (_xCydVfWL) {
return new Response(`Upstream WebSocket gateway failed: ${_xCydVfWL._MhwlvCzj}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_qqFnQllB && _qqFnQllB.toLowerCase() === "websocket") {
return await _szYgEMFE(_NFlzziTu, _kSghXjZM, _iBFSEHoA);
}
const _sibPAlHU = _MsJZEhdg._JUIPvPSj(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_sibPAlHU) {
const [, _mGQRxrYZ, typeSuffix] = _sibPAlHU;
const _egnAfGgU = _iBFSEHoA._egnAfGgU;
if (!_egnAfGgU || _egnAfGgU.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' } });
}
const _BSlnlniD = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _AKuEhIol = _BSlnlniD[typeSuffix];
const _VfCkVMyx = _egnAfGgU.replace(/\/$/, '');
const _MgnttaPk = `${_tHpQGhxp.origin}/${_mGQRxrYZ}`;
const _TwwlyNru = `${_VfCkVMyx}/${_AKuEhIol}?_iBFSEHoA=${encodeURIComponent(_MgnttaPk)}`;
try {
const _yGXevOlY = await fetch(_TwwlyNru, { _VTWxvQwV: { 'User-Agent': _NFlzziTu._VTWxvQwV.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _HjPALYqf = new Headers(_yGXevOlY._VTWxvQwV);
_HjPALYqf._jNwuomlq('Access-Control-Allow-Origin', '*');
return new Response(_yGXevOlY._RhJzDlxQ, { status: _yGXevOlY.status, statusText: _yGXevOlY.statusText, _VTWxvQwV: _HjPALYqf });
} catch (_xCydVfWL) {
return new Response(`获取上游订阅失败: ${_xCydVfWL._MhwlvCzj}`, { status: 502, _VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' } });
}
}
if (_MsJZEhdg.startsWith('/https:/') || _MsJZEhdg.startsWith('/http:/')) {
return _jBxUAalb(_NFlzziTu, _iBFSEHoA);
}
if (_iBFSEHoA.customSubPath && _iBFSEHoA.customSubPath._PxfEhgmV && _iBFSEHoA.customSubPath._MsJZEhdg && _MsJZEhdg === '/' + _iBFSEHoA.customSubPath._MsJZEhdg.trim()) {
const _qOcahdJY = _kSghXjZM.DB.prepare("SELECT _tHTUmKrx FROM kv_data WHERE _sWpWHESH = ?").bind(_dgnxTKKa);
const { _LaHpOhNV } = await _qOcahdJY.all();
const _UylCwbHz = _LaHpOhNV._BKxGrdWY > 0 ? _LaHpOhNV[0]._tHTUmKrx : null;
if (_UylCwbHz) {
return _LJwAKNWp({ _cFxixrai: { _ZFMylRPE: _UylCwbHz }, _tHpQGhxp: _NFlzziTu._tHpQGhxp }, _kSghXjZM);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' } });
}
}
const _YaHUKLYy = _MsJZEhdg.split('/').filter(Boolean);
if (_YaHUKLYy._BKxGrdWY === 1 && !_MsJZEhdg.startsWith('/api/')) {
const _mGQRxrYZ = _YaHUKLYy[0];
return _LJwAKNWp({ _cFxixrai: { _ZFMylRPE: _mGQRxrYZ }, _tHpQGhxp: _NFlzziTu._tHpQGhxp }, _kSghXjZM);
}
if (_MsJZEhdg.startsWith('/api/')) {
if (_MsJZEhdg === '/api/_iBFSEHoA' && _NFlzziTu.method === 'POST') return _ppcThWpb(_NFlzziTu, _kSghXjZM, _keflYwWs);
if (_MsJZEhdg === '/api/_jNwuomlq-_ZQcpOmgH') return _FquKoLZI(_NFlzziTu, _kSghXjZM);
if (_MsJZEhdg === '/api/change-_ZQcpOmgH') return _AgfThhvu(_NFlzziTu, _kSghXjZM);
if (_MsJZEhdg === '/api/verify-_ZQcpOmgH') return _dnhljPUP(_NFlzziTu, _kSghXjZM);
if (_MsJZEhdg === '/api/verify-visitor-_ZQcpOmgH' && _NFlzziTu.method === 'POST') return _qvJpIEKw(_NFlzziTu, _kSghXjZM);
if (_MsJZEhdg === '/api/cache-live-_LaHpOhNV' && _NFlzziTu.method === 'POST') return _urfWOnbc(_NFlzziTu, _kSghXjZM, _keflYwWs);
if (_MsJZEhdg === '/api/get-_gClllcBx' && _NFlzziTu.method === 'POST') return _ZxAxxVWe(_NFlzziTu, _kSghXjZM);
if (_MsJZEhdg === '/api/get-cached-_KZTmtaHQ') return _CXoytOfQ(_NFlzziTu, _kSghXjZM);
if (_MsJZEhdg === '/api/save-_KZTmtaHQ') return _gZxYQedd(_NFlzziTu, _kSghXjZM, _keflYwWs);
if (_MsJZEhdg === '/api/save-and-get-sub-_ZFMylRPE' && _NFlzziTu.method === 'POST') return _HrVoRILt(_NFlzziTu, _kSghXjZM);
if (_MsJZEhdg.startsWith('/api/get-_HuFljqkj/')) {
const _mGQRxrYZ = _MsJZEhdg.split('/').pop();
return _LJwAKNWp({ _cFxixrai: { _ZFMylRPE: _mGQRxrYZ }, _tHpQGhxp: _NFlzziTu._tHpQGhxp }, _kSghXjZM);
}
if (_MsJZEhdg === '/api/_iBFSEHoA' && _NFlzziTu.method === 'GET') return _JfjbnOYD(_kSghXjZM);
if (_MsJZEhdg === '/api/get-resolved-_KZTmtaHQ') return _SuqyuByk(_NFlzziTu);
if (_MsJZEhdg === '/api/parse-_KZTmtaHQ-from-_SLzPmHEY' && _NFlzziTu.method === 'POST') return _ELBnndse(_NFlzziTu, _kSghXjZM);
if (_MsJZEhdg === '/api/endpoints') return _ZEdPnzJb(_NFlzziTu, _kSghXjZM);
if (_MsJZEhdg === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_MsJZEhdg === '/_kePIaBxe') return _cmlFmhBz(_NFlzziTu, _kSghXjZM);
if (_MsJZEhdg === '/bing-wallpaper') return _LoSbVDYi();
return _UrnxZGId(_NFlzziTu, _kSghXjZM, _keflYwWs);
} catch (err) {
let _xCydVfWL = err;
return new Response(_xCydVfWL.toString(), { status: 500 });
}
}
};
const _DqtOjkZQ = { 'Accept': '_dHJDuMPe/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 _MuMQDdyW(_tHpQGhxp, _OPfWfbRA) {
const _KUgOgstY = await fetch(_tHpQGhxp, { _VTWxvQwV: { ..._DqtOjkZQ, 'Referer': _OPfWfbRA.referer } });
if (_KUgOgstY.ok) return _KUgOgstY._dHJDuMPe();
return null;
}
async function _HQUCauZc(_tHpQGhxp, _OPfWfbRA) {
const _qyqmkZyj = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_tHpQGhxp)}`;
const _KUgOgstY = await fetch(_qyqmkZyj, { _VTWxvQwV: { ..._DqtOjkZQ, 'Referer': _OPfWfbRA.referer } });
if (!_KUgOgstY.ok) return null;
const _RhJzDlxQ = await _KUgOgstY._dHJDuMPe();
const _JUIPvPSj = _RhJzDlxQ._JUIPvPSj(/<pre[^>]*>([\s\S]*?)<\/pre>/_uUkhUKtY);
return _JUIPvPSj && _JUIPvPSj[1] ? _JUIPvPSj[1].replace(/&/g, '&') : null;
}
function _rfIuMdIj(_hGGjqbIj) {
let _PpJrRGST;
try {
_PpJrRGST = atob(_hGGjqbIj.replace(/\s/g, ''));
} catch (_xCydVfWL) {
_PpJrRGST = _hGGjqbIj;
}
const _HuFljqkj = _PpJrRGST.split(/[\s\n\r,]+/).filter(line => line.trim());
const _vOtTygqr = new Set();
const _rXIHDhBU = /@([^?#]+?):(\d+)/;
for (const _cQdpymll of _HuFljqkj) {
let _vFragIfz = '';
let _tQnEOFqY = '';
try {
if (_cQdpymll.startsWith('vmess://')) {
const _OYacrQWo = atob(_cQdpymll.substring(8));
const _iBFSEHoA = JSON.parse(_OYacrQWo);
_vFragIfz = _iBFSEHoA.add;
_tQnEOFqY = _iBFSEHoA._tQnEOFqY;
} else {
const _JUIPvPSj = _cQdpymll._JUIPvPSj(_rXIHDhBU);
if (_JUIPvPSj && _JUIPvPSj[1] && _JUIPvPSj[2]) {
_vFragIfz = _JUIPvPSj[1].replace(/[\[\]]/g, '');
_tQnEOFqY = _JUIPvPSj[2];
}
}
} catch (_xCydVfWL) {
console.warn(`Could not parse _cQdpymll: ${_cQdpymll}`);
}
if (_vFragIfz && _tQnEOFqY) {
_vOtTygqr.add(`${_vFragIfz}:${_tQnEOFqY}`);
}
}
return Array.from(_vOtTygqr);
}
async function _PsbQLcXY(_nuIoQzBs) {
try {
const _KUgOgstY = await fetch(_nuIoQzBs, { _VTWxvQwV: _DqtOjkZQ });
if (!_KUgOgstY.ok) {
console.error(`Failed to fetch subscription: ${_KUgOgstY.status}`);
return [];
}
const _hGGjqbIj = await _KUgOgstY._dHJDuMPe();
return _rfIuMdIj(_hGGjqbIj);
} catch (error) {
console.error(`Error processing subscription ${_nuIoQzBs}:`, error);
return [];
}
}
async function _nWmKUPqq(_aaDiGKDE) {
const _IMCSeXrE = _aaDiGKDE.trim();
const _VOZcNNHc = /^(vless|vmess|trojan|ss):\/\//.test(_IMCSeXrE);
const _LHNZimIz = (() => {
if (_IMCSeXrE._BKxGrdWY < 20 || _IMCSeXrE.startsWith('http')) return false;
const _qXVDVqPY = _IMCSeXrE.replace(/\s/g, '');
if (_qXVDVqPY._BKxGrdWY % 4 !== 0 && !_qXVDVqPY.includes('=')) return false;
try {
atob(_qXVDVqPY);
return true;
} catch (_xCydVfWL) {
return false;
}
})();
if (_VOZcNNHc || _LHNZimIz) {
return _rfIuMdIj(_IMCSeXrE).join('\n');
}
const _RCycrhpO = [
'https://ipdb.api.030101.xyz/?_eEGkjqFr=bestcf&_UZshnkxY=true',
'https://ipdb.api.030101.xyz/?_eEGkjqFr=bestproxy&_UZshnkxY=true'
];
const _qvbsLewD = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_uUkhUKtY.test(_aaDiGKDE) || _aaDiGKDE.includes('?_uKhMcTyS=');
if (_qvbsLewD) {
const _KZTmtaHQ = await _PsbQLcXY(_aaDiGKDE);
return _KZTmtaHQ.join('\n');
}
let _hGGjqbIj = '';
if (_RCycrhpO.includes(_aaDiGKDE)) {
_hGGjqbIj = await _MuMQDdyW(_aaDiGKDE, { referer: _aaDiGKDE });
if (!_hGGjqbIj || _hGGjqbIj._BKxGrdWY < 8) {
_hGGjqbIj = await _HQUCauZc(_aaDiGKDE, { referer: _aaDiGKDE });
}
} else {
try {
const _KzLoWSto = await fetch(_aaDiGKDE, { _VTWxvQwV: { 'User-Agent': 'Cloudflare-Worker' } });
if (_KzLoWSto.ok) {
_hGGjqbIj = await _KzLoWSto._dHJDuMPe();
} else {
console.warn(`Failed to fetch URL ${_aaDiGKDE}: ${_KzLoWSto.status}`);
}
} catch (_xCydVfWL) {
console.error(`Error fetching URL ${_aaDiGKDE}:`, _xCydVfWL);
}
}
const _tACYAnWr = _rfIuMdIj(_hGGjqbIj);
if (_tACYAnWr._BKxGrdWY > 0) {
return _tACYAnWr.join('\n');
}
return _hGGjqbIj || '';
}
async function _jBxUAalb(_NFlzziTu, _iBFSEHoA) {
if (!_iBFSEHoA.streamer._PxfEhgmV) {
return new Response('远程流功能未开启', { status: 403 });
}
const _tHpQGhxp = new URL(_NFlzziTu._tHpQGhxp);
const _DoxtIoUY = _tHpQGhxp.pathname.substring(1).replace(':/', '://');
try {
const _TwwlyNru = new URL(_DoxtIoUY);
const _ETLodOzv = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_ETLodOzv.some(domain => _TwwlyNru._vFragIfz.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _eRAEgbYx = new Headers(_NFlzziTu._VTWxvQwV);
_eRAEgbYx._jNwuomlq('Host', _TwwlyNru._vFragIfz);
_eRAEgbYx._jNwuomlq('User-Agent', 'CF-Worker-Streamer/1.0');
const _cTMSKFYv = await fetch(_TwwlyNru.toString(), {
method: _NFlzziTu.method,
_VTWxvQwV: _eRAEgbYx,
_RhJzDlxQ: _NFlzziTu._RhJzDlxQ,
});
const _HjPALYqf = new Headers(_cTMSKFYv._VTWxvQwV);
_HjPALYqf._jNwuomlq('Access-Control-Allow-Origin', '*');
_HjPALYqf._jNwuomlq('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_HjPALYqf._jNwuomlq('Access-Control-Allow-Headers', '*');
_HjPALYqf._jNwuomlq('Cache-Control', 'public, max-age=86400');
_HjPALYqf._jNwuomlq('X-Streamer-Source', 'CF-Worker');
_HjPALYqf.delete('_hGGjqbIj-security-policy');
_HjPALYqf.delete('x-_hGGjqbIj-security-policy');
_HjPALYqf.delete('x-webkit-csp');
return new Response(_cTMSKFYv._RhJzDlxQ, {
status: _cTMSKFYv.status,
statusText: _cTMSKFYv.statusText,
_VTWxvQwV: _HjPALYqf,
});
} catch (_xCydVfWL) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _szYgEMFE(_NFlzziTu, _kSghXjZM, _iBFSEHoA) {
try {
const _FLxEOrhD = _iBFSEHoA || await _REihPUSK(_kSghXjZM);
const _UmpkwvxQ = (_FLxEOrhD.itemLink._keKQbOmm && _FLxEOrhD.itemLink._keKQbOmm[0]) || {};
const _nKjkxsjF = _UmpkwvxQ['_uKhMcTyS'] || _jqpNtfEi(_nHnVajIF);
if (!_wENsuRyC(_nKjkxsjF)) {
throw new Error("Configured user _QrdubXDV is not valid.");
}
const _nKToevqk = _FLxEOrhD.dataFeeds.universalFallbackAddress;
let _ZWfafvuS = {};
const _rdQpoTRO = _jqpNtfEi(_pkvPpgtk[0] || "");
if (_nKToevqk) {
const [_baJNbFBi, _tQnEOFqY = '443'] = _nKToevqk.split(':');
_ZWfafvuS = { _baJNbFBi, _tQnEOFqY };
} else {
const [_baJNbFBi, _tQnEOFqY = '443'] = _rdQpoTRO.split(':');
_ZWfafvuS = { _baJNbFBi, _tQnEOFqY };
}
const _tHpQGhxp = new URL(_NFlzziTu._tHpQGhxp);
const _MsJZEhdg = _tHpQGhxp.pathname;
let _FyTkiSNk = '';
const _cGmrrjsz = _tHpQGhxp.searchParams.get('remote');
if (_cGmrrjsz) {
_FyTkiSNk = atob(_cGmrrjsz);
} else if (_MsJZEhdg.startsWith('/endpoint=')) {
_FyTkiSNk = _MsJZEhdg.substring(10);
} else if (_MsJZEhdg._BKxGrdWY > 1 && _MsJZEhdg.substring(1).includes('.')) {
_FyTkiSNk = _MsJZEhdg.substring(1);
}
if (_FyTkiSNk) {
const [_baJNbFBi, _tQnEOFqY = '443'] = _FyTkiSNk.split(':');
_ZWfafvuS = { _baJNbFBi, _tQnEOFqY };
}
return await _gOnIoXVJ(_NFlzziTu, _nKjkxsjF, _ZWfafvuS);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _gOnIoXVJ(_NFlzziTu, _QrdubXDV, _ZWfafvuS) {
const _FNQIZCGj = new WebSocketPair();
const [clientEnd, _mYXYmspR] = Object.values(_FNQIZCGj);
_mYXYmspR.accept();
let _rIyOSZil = { _jjZfeOvc: null };
const _EPMgmYUJ = _NFlzziTu._VTWxvQwV.get("sec-websocket-protocol") || "";
const _ZzBvLuUa = _lxVKNSin(_mYXYmspR, _EPMgmYUJ);
_ZzBvLuUa.pipeTo(new WritableStream({
async write(chunk) {
if (_rIyOSZil._jjZfeOvc) {
const _wWeQhZYR = _rIyOSZil._jjZfeOvc.writable.getWriter();
await _wWeQhZYR.write(chunk);
_wWeQhZYR.releaseLock();
return;
}
const { error, details } = await _rSjzjYhy(chunk, _QrdubXDV);
if (error) {
throw new Error(details);
}
const _MmgNHEQN = new Uint8Array([details._pstFwFRt[0], 0]);
const _UestizhH = chunk.slice(details.payloadIndex);
await _TZNUQJmB(_rIyOSZil, details._NVScVsvY, details._GAYuhMTm, _UestizhH, _mYXYmspR, _MmgNHEQN, _ZWfafvuS);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_zkGOAKeY(_mYXYmspR);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _TZNUQJmB(_rIyOSZil, _NVScVsvY, _GAYuhMTm, _ClscPOFG, _BlUgLyJm, _MmgNHEQN, _eGESrAEr) {
const _jvayPAUt = async (_baJNbFBi, _tQnEOFqY) => {
let _xwVQwWzT = _baJNbFBi;
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(_baJNbFBi)) {
_xwVQwWzT = `${atob('d3d3Lg==')}${_baJNbFBi}${atob('LnNzbGlwLmlv')}`;
}
const _jjZfeOvc = connect({ _vFragIfz: _xwVQwWzT, _tQnEOFqY });
_rIyOSZil._jjZfeOvc = _jjZfeOvc;
const _wWeQhZYR = _jjZfeOvc.writable.getWriter();
await _wWeQhZYR.write(_ClscPOFG);
_wWeQhZYR.releaseLock();
return _jjZfeOvc;
};
const _jABSByOk = async () => {
if (!_eGESrAEr._baJNbFBi) return;
console.log(`Direct connection failed, falling back to gateway: ${_eGESrAEr._baJNbFBi}`);
const _BsRikCLm = await _jvayPAUt(_eGESrAEr._baJNbFBi, parseInt(_eGESrAEr._tQnEOFqY, 10));
_BsRikCLm.closed.catch(() => {}).finally(() => _zkGOAKeY(_BlUgLyJm));
_yfYdWChO(_BsRikCLm, _BlUgLyJm, _MmgNHEQN, null);
};
try {
const _OMheXTXu = await _jvayPAUt(_NVScVsvY, _GAYuhMTm);
_yfYdWChO(_OMheXTXu, _BlUgLyJm, _MmgNHEQN, _jABSByOk);
} catch (err) {
console.error("Primary connection failed:", err);
await _jABSByOk();
}
}
function _lxVKNSin(_mYXYmspR, _EPMgmYUJ) {
let _HlmZgCnh = false;
return new ReadableStream({
start(_kqJwafrb) {
_mYXYmspR.addEventListener("_MhwlvCzj", (event) => { if (_HlmZgCnh) return; _kqJwafrb.enqueue(event._VEFfqbuc); });
_mYXYmspR.addEventListener("close", () => { _zkGOAKeY(_mYXYmspR); if (_HlmZgCnh) return; _kqJwafrb.close(); });
_mYXYmspR.addEventListener("error", (err) => _kqJwafrb.error(err));
if (_EPMgmYUJ) {
try {
const _TIdSIbIp = atob(_EPMgmYUJ.replace(/-/g, "+").replace(/_/g, "/"));
_kqJwafrb.enqueue(Uint8Array.from(_TIdSIbIp, c => c.charCodeAt(0))._kOTyXBFX);
} catch (_xCydVfWL) { console.error("Failed to decode early _VEFfqbuc:", _xCydVfWL); }
}
},
cancel() { _HlmZgCnh = true; _zkGOAKeY(_mYXYmspR); },
});
}
async function _rSjzjYhy(_kOTyXBFX, _QrdubXDV) {
if (_kOTyXBFX.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _pstFwFRt = new Uint8Array(_kOTyXBFX.slice(0, 1));
const _JIULxdbh = _wbnSmiVh(new Uint8Array(_kOTyXBFX.slice(1, 17)));
if (_JIULxdbh !== _QrdubXDV) return { error: true, details: "Invalid _QrdubXDV" };
const _ZDMqjupW = new Uint8Array(_kOTyXBFX.slice(17, 18))[0];
const _TuZxnSeC = new Uint8Array(_kOTyXBFX.slice(18 + _ZDMqjupW, 19 + _ZDMqjupW))[0];
if (_TuZxnSeC !== 1) return { error: true, details: `Unsupported _TuZxnSeC: ${_TuZxnSeC}` };
const _DdzskZxF = 19 + _ZDMqjupW;
const _GAYuhMTm = new DataView(_kOTyXBFX.slice(_DdzskZxF, _DdzskZxF + 2)).getUint16(0);
let _bQXyjHUC = _DdzskZxF + 2;
const _MSjzDxUB = new Uint8Array(_kOTyXBFX.slice(_bQXyjHUC, _bQXyjHUC + 1))[0];
let _FXXkgZhJ = 0;
let _pBfbyQnk = _bQXyjHUC + 1;
let _NVScVsvY = "";
switch (_MSjzDxUB) {
case 1: _FXXkgZhJ = 4; _NVScVsvY = new Uint8Array(_kOTyXBFX.slice(_pBfbyQnk, _pBfbyQnk + _FXXkgZhJ)).join("."); break;
case 2: _FXXkgZhJ = new Uint8Array(_kOTyXBFX.slice(_pBfbyQnk, _pBfbyQnk + 1))[0]; _pBfbyQnk++; _NVScVsvY = new TextDecoder().decode(_kOTyXBFX.slice(_pBfbyQnk, _pBfbyQnk + _FXXkgZhJ)); break;
case 3: _FXXkgZhJ = 16; const _IDvNYSMq = new DataView(_kOTyXBFX.slice(_pBfbyQnk, _pBfbyQnk + _FXXkgZhJ)); const _EWHTfFBN = []; for (let _uUkhUKtY = 0; _uUkhUKtY < 8; _uUkhUKtY++) _EWHTfFBN.push(_IDvNYSMq.getUint16(_uUkhUKtY * 2).toString(16)); _NVScVsvY = _EWHTfFBN.join(":"); break;
default: return { error: true, details: `Invalid _mJGOsQki _eEGkjqFr: ${_MSjzDxUB}` };
}
if (!_NVScVsvY) return { error: true, details: "Target _baJNbFBi is empty" };
return { error: false, details: { _NVScVsvY, _GAYuhMTm, _pstFwFRt, payloadIndex: _pBfbyQnk + _FXXkgZhJ } };
}
async function _yfYdWChO(_jjZfeOvc, _BlUgLyJm, _tRTIzUXv, _ictXfORO) {
let _PGtHqSxu = _tRTIzUXv;
let _TiTrkDEZ = false;
let _yvZCtHGf = _jjZfeOvc._ZzBvLuUa.pipeTo(new WritableStream({
write(chunk) {
_TiTrkDEZ = true;
if (_BlUgLyJm.readyState !== 1) throw new Error("Channel is not open");
if (_PGtHqSxu) {
const _bvHdCEUm = new Uint8Array(_PGtHqSxu.byteLength + chunk.byteLength);
_bvHdCEUm._jNwuomlq(new Uint8Array(_PGtHqSxu));
_bvHdCEUm._jNwuomlq(new Uint8Array(chunk), _PGtHqSxu.byteLength);
_BlUgLyJm.send(_bvHdCEUm._kOTyXBFX);
_PGtHqSxu = null;
} else {
_BlUgLyJm.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _BlUgLyJm error:", err._MhwlvCzj);
});
await _yvZCtHGf;
if (!_TiTrkDEZ && _ictXfORO) {
_ictXfORO();
}
}
function _zkGOAKeY(_BlUgLyJm) {
try { if (_BlUgLyJm.readyState === 1 || _BlUgLyJm.readyState === 2) _BlUgLyJm.close(); } catch (_xCydVfWL) {}
}
const _MRUSiiNT = Array.from({ _BKxGrdWY: 256 }, (_, _uUkhUKtY) => (_uUkhUKtY + 256).toString(16).slice(1));
function _wbnSmiVh(_dqnRnNGR, offset = 0) {
return (
_MRUSiiNT[_dqnRnNGR[offset]] + _MRUSiiNT[_dqnRnNGR[offset + 1]] + _MRUSiiNT[_dqnRnNGR[offset + 2]] + _MRUSiiNT[_dqnRnNGR[offset + 3]] + "-" +
_MRUSiiNT[_dqnRnNGR[offset + 4]] + _MRUSiiNT[_dqnRnNGR[offset + 5]] + "-" +
_MRUSiiNT[_dqnRnNGR[offset + 6]] + _MRUSiiNT[_dqnRnNGR[offset + 7]] + "-" +
_MRUSiiNT[_dqnRnNGR[offset + 8]] + _MRUSiiNT[_dqnRnNGR[offset + 9]] + "-" +
_MRUSiiNT[_dqnRnNGR[offset + 10]] + _MRUSiiNT[_dqnRnNGR[offset + 11]] +
_MRUSiiNT[_dqnRnNGR[offset + 12]] + _MRUSiiNT[_dqnRnNGR[offset + 13]] +
_MRUSiiNT[_dqnRnNGR[offset + 14]] + _MRUSiiNT[_dqnRnNGR[offset + 15]]
).toLowerCase();
}
let _PiCtQLDu = { "N/A":"未知" };
async function _bWgzCmxH(_tHpQGhxp, _rpELDPda, _ictXfORO) {
try {
const _KUgOgstY = await fetch(_tHpQGhxp, {
_VTWxvQwV: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_KUgOgstY.ok) {
console.error(`获取 ${_tHpQGhxp} 失败: HTTP ${_KUgOgstY.status}`);
return _ictXfORO;
}
const _dHJDuMPe = await _KUgOgstY._dHJDuMPe();
return _rpELDPda(_dHJDuMPe);
} catch (error) {
console.error(`获取或解析 ${_tHpQGhxp} 时发生网络错误: ${error._MhwlvCzj}`);
return _ictXfORO;
}
}
function _rTSYsFnl(_dHJDuMPe) {
if (!_dHJDuMPe) return [];
const _GKDtwBRG = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _TTsJRZVt = _dHJDuMPe.split(/[\s,;#|]+/);
const _lgSeVlWh = [];
for (const _HzJHqizf of _TTsJRZVt) {
const _OHoaBnbY = _HzJHqizf.trim();
if (!_OHoaBnbY) continue;
const _WyKFriVe = _OHoaBnbY.lastIndexOf(':');
let _opOhDtyC = _OHoaBnbY;
if(_WyKFriVe > _OHoaBnbY.lastIndexOf(']')) {
const _RhkqAWii = _OHoaBnbY.substring(_WyKFriVe + 1);
if(!isNaN(_RhkqAWii) && _RhkqAWii._BKxGrdWY > 0) {
_opOhDtyC = _OHoaBnbY.substring(0, _WyKFriVe);
}
}
if (_rjKvxlhT.isValid(_opOhDtyC.replace(/[\[\]]/g, '')) || _GKDtwBRG.test(_OHoaBnbY)) {
_lgSeVlWh.push(_OHoaBnbY);
}
}
return _lgSeVlWh;
}
function _JWISkBOl(_dHJDuMPe) {
if (!_dHJDuMPe) return [];
return _dHJDuMPe.split(/\s+/).filter(d => d.trim() !== '');
}
function _RGWWENUy(_dHJDuMPe) {
if (!_dHJDuMPe) return { "N/A": "未知" };
try {
return JSON.parse(`{${_dHJDuMPe}}`);
} catch (_xCydVfWL) {
console.error("解析 _PiCtQLDu 失败:", _xCydVfWL);
return { "N/A": "未知" };
}
}
const _rjKvxlhT = {
isValid: (_kePIaBxe) => _rjKvxlhT.isIPv4(_kePIaBxe) || _rjKvxlhT.isIPv6(_kePIaBxe),
isIPv4: (_kePIaBxe) => {
if (typeof _kePIaBxe !== 'string') return false;
const _EWHTfFBN = _kePIaBxe.split('.');
if (_EWHTfFBN._BKxGrdWY !== 4) return false;
return _EWHTfFBN.every(_qsAVjdXs => {
const _VHUehYtC = parseInt(_qsAVjdXs, 10);
return !isNaN(_VHUehYtC) && _VHUehYtC >= 0 && _VHUehYtC <= 255 && String(_VHUehYtC) === _qsAVjdXs;
});
},
isIPv6: (_kePIaBxe) => {
if (typeof _kePIaBxe !== '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]))$/_uUkhUKtY.test(_kePIaBxe);
},
toLong4: (_kePIaBxe) => _kePIaBxe.split('.').reduce((acc, octet, _uUkhUKtY) => acc + (parseInt(octet) << (8*(3-_uUkhUKtY))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_kePIaBxe) => {
try {
const _KiTxMUaz = _kePIaBxe.split('/')[0];
const _EWHTfFBN = _KiTxMUaz.split('::');
if (_EWHTfFBN._BKxGrdWY > 2) return 0n;
let _FmqzKrhy = [];
if (_EWHTfFBN[0]) {
_FmqzKrhy = _EWHTfFBN[0].split(':');
}
let _FUIwmogZ = [];
if (_EWHTfFBN._BKxGrdWY > 1 && _EWHTfFBN[1]) {
_FUIwmogZ = _EWHTfFBN[1].split(':');
}
if (_FmqzKrhy._BKxGrdWY + _FUIwmogZ._BKxGrdWY > 8) return 0n;
const _iPvZtlnY = 8 - (_FmqzKrhy._BKxGrdWY + _FUIwmogZ._BKxGrdWY);
const _PCbtLqUZ = [
..._FmqzKrhy,
...Array(_iPvZtlnY).fill('0'),
..._FUIwmogZ
].map(_qsAVjdXs => _qsAVjdXs || '0');
while(_PCbtLqUZ._BKxGrdWY < 8) {
_PCbtLqUZ.push('0');
}
let _pHqeCYpL = 0n;
for (const _qsAVjdXs of _PCbtLqUZ) {
if (_qsAVjdXs._BKxGrdWY > 4) return 0n;
const _tHTUmKrx = BigInt('0x' + _qsAVjdXs);
_pHqeCYpL = (_pHqeCYpL << 16n) | _tHTUmKrx;
}
return _pHqeCYpL;
} catch(_xCydVfWL) {
return 0n;
}
},
fromBigInt6: (_pHqeCYpL) => {
if (typeof _pHqeCYpL !== '_pHqeCYpL' || _pHqeCYpL < 0n) return null;
const _EWHTfFBN = [];
for (let _uUkhUKtY = 0; _uUkhUKtY < 8; _uUkhUKtY++) {
_EWHTfFBN.unshift((_pHqeCYpL & 0xFFFFn).toString(16));
_pHqeCYpL >>= 16n;
}
let _vQvbvhoT = { start: -1, _ceypxXIY: 0 };
let _JhnfPVoH = { start: -1, _ceypxXIY: 0 };
for (let _uUkhUKtY = 0; _uUkhUKtY < 8; _uUkhUKtY++) {
if (_EWHTfFBN[_uUkhUKtY] === '0') {
if (_JhnfPVoH.start === -1) _JhnfPVoH.start = _uUkhUKtY;
_JhnfPVoH._ceypxXIY++;
} else {
if (_JhnfPVoH._ceypxXIY > _vQvbvhoT._ceypxXIY) _vQvbvhoT = { ..._JhnfPVoH };
_JhnfPVoH = { start: -1, _ceypxXIY: 0 };
}
}
if (_JhnfPVoH._ceypxXIY > _vQvbvhoT._ceypxXIY) _vQvbvhoT = { ..._JhnfPVoH };
if (_vQvbvhoT._ceypxXIY > 1) {
_EWHTfFBN.splice(_vQvbvhoT.start, _vQvbvhoT._ceypxXIY, '');
if (_vQvbvhoT.start === 0) _EWHTfFBN.unshift('');
if (_vQvbvhoT.start + _vQvbvhoT._ceypxXIY === 8) _EWHTfFBN.push('');
}
return _EWHTfFBN.join(':');
},
cidrToRange: (cidr, _dZDkQEsa = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _fncZNONp = parseInt(bitsStr, 10);
const _KZTmtaHQ = new Set();
if (_rjKvxlhT.isIPv4(range)) {
if (isNaN(_fncZNONp) || _fncZNONp < 8 || _fncZNONp > 32) return [];
if (_fncZNONp === 32) return [range];
const _IlaZoEOW = _rjKvxlhT.toLong4(range);
const _VkxPUUXD = (0xFFFFFFFF << (32 - _fncZNONp)) >>> 0;
const _FbTZLPAm = _IlaZoEOW & _VkxPUUXD;
const _rUGGIBuZ = 1 << (32 - _fncZNONp);
if (_rUGGIBuZ <= 2) return [];
const _yaoVrUKF = Math.min(_dZDkQEsa, _rUGGIBuZ - 2);
let _KWEjNvjh = 0;
while (_KZTmtaHQ.size < _yaoVrUKF && _KWEjNvjh < _yaoVrUKF * 5) {
const _oKelShli = Math.floor(Math.random() * (_rUGGIBuZ - 2)) + 1;
_KZTmtaHQ.add(_rjKvxlhT.fromLong4((_FbTZLPAm + _oKelShli) >>> 0));
_KWEjNvjh++;
}
return Array.from(_KZTmtaHQ);
} else if (_rjKvxlhT.isIPv6(range)) {
if (isNaN(_fncZNONp) || _fncZNONp < 16 || _fncZNONp > 128) return [];
if (_fncZNONp === 128) return [range];
const _SbtKWEUx = _rjKvxlhT.toBigInt6(range);
const _VkxPUUXD = (2n ** BigInt(128 - _fncZNONp) - 1n);
const _FbTZLPAm = _SbtKWEUx & ~_VkxPUUXD;
const _PfgEBwKz = 2n ** BigInt(128 - _fncZNONp);
if (_PfgEBwKz <= 2n) return [];
let _KWEjNvjh = 0;
while (_KZTmtaHQ.size < _dZDkQEsa && _KWEjNvjh < _dZDkQEsa * 5) {
const _xLDwXaoQ = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_xLDwXaoQ);
let _rHOGMVlu = 0n;
for (const _xPtawMgo of _xLDwXaoQ) {
_rHOGMVlu = (_rHOGMVlu << 8n) | BigInt(_xPtawMgo);
}
const _oKelShli = _rHOGMVlu % (_PfgEBwKz - 2n) + 1n;
_KZTmtaHQ.add(_rjKvxlhT.fromBigInt6(_FbTZLPAm + _oKelShli));
_KWEjNvjh++;
}
return Array.from(_KZTmtaHQ);
}
return [];
} catch(_xCydVfWL) {
console.error(`CIDR to range failed for ${cidr}:`, _xCydVfWL);
return [];
}
}
};
function _AzSdLfhV(_jFlugCfy, _mJMqBNIS) {
const _PCCyOjUv = {};
const _SFQevpug = Object._SFQevpug(_mJMqBNIS);
const _EWHTfFBN = _SFQevpug.map(_sWpWHESH => {
const _QhjFOYVP = _jFlugCfy * (_mJMqBNIS[_sWpWHESH] / 100);
return { _sWpWHESH, _dZDkQEsa: Math.floor(_QhjFOYVP), remainder: _QhjFOYVP - Math.floor(_QhjFOYVP) };
});
let _fAbtPRDm = _EWHTfFBN.reduce((acc, _qsAVjdXs) => acc + _qsAVjdXs._dZDkQEsa, 0);
_EWHTfFBN.sort((a, b) => b.remainder - a.remainder);
let _bdXlMgjY = _jFlugCfy - _fAbtPRDm;
for (let _uUkhUKtY = 0; _uUkhUKtY < _bdXlMgjY; _uUkhUKtY++) {
_EWHTfFBN[_uUkhUKtY % _EWHTfFBN._BKxGrdWY]._dZDkQEsa++;
}
for (const _qsAVjdXs of _EWHTfFBN) {
_PCCyOjUv[_qsAVjdXs._sWpWHESH] = _qsAVjdXs._dZDkQEsa;
}
return _PCCyOjUv;
}
async function _gnMzpuAb(_kSghXjZM) {
const _qOcahdJY = _kSghXjZM.DB.prepare("SELECT _tHTUmKrx FROM kv_data WHERE _sWpWHESH = ?").bind(_zJixQGui);
const { _LaHpOhNV } = await _qOcahdJY.all();
return _LaHpOhNV._BKxGrdWY > 0 ? _LaHpOhNV[0]._tHTUmKrx : null;
}
async function _XbfvvSgB(_kSghXjZM, _ZQcpOmgH) {
const _qOcahdJY = _kSghXjZM.DB.prepare(
"INSERT INTO kv_data (_sWpWHESH, _tHTUmKrx) VALUES (?, ?) ON CONFLICT(_sWpWHESH) DO UPDATE SET _tHTUmKrx = excluded._tHTUmKrx"
);
await _qOcahdJY.bind(_zJixQGui, _ZQcpOmgH).run();
}
async function _dnhljPUP(_NFlzziTu, _kSghXjZM) {
const { _ZQcpOmgH } = await _NFlzziTu.json();
const _pztDbgOf = await _gnMzpuAb(_kSghXjZM);
if (_pztDbgOf === _ZQcpOmgH) {
return _fZTkWWFY({ success: true });
}
return _fZTkWWFY({ success: false, _MhwlvCzj: '密码错误' }, 401);
}
async function _qvJpIEKw(_NFlzziTu, _kSghXjZM) {
const _kpnYRDyR = await _REihPUSK(_kSghXjZM);
if (!_kpnYRDyR.visitorPassword || !_kpnYRDyR.visitorPassword._PxfEhgmV) {
return _fZTkWWFY({ success: true });
}
try {
const { _ZQcpOmgH } = await _NFlzziTu.json();
const _DpikjDil = _kpnYRDyR.visitorPassword._ZQcpOmgH;
if (_DpikjDil && _ZQcpOmgH === _DpikjDil) {
return _fZTkWWFY({ success: true });
}
return _fZTkWWFY({ success: false, _MhwlvCzj: '访客密码错误' }, 401);
} catch (_xCydVfWL) {
return _fZTkWWFY({ success: false, _MhwlvCzj: '无效请求' }, 400);
}
}
async function _FquKoLZI(_NFlzziTu, _kSghXjZM) {
const _XHMLcTTn = await _gnMzpuAb(_kSghXjZM);
if (_XHMLcTTn) {
return _fZTkWWFY({ success: false, _MhwlvCzj: "密码已设置,无法重复初始化。" }, 403);
}
const { _ZQcpOmgH } = await _NFlzziTu.json();
if (!_ZQcpOmgH || _ZQcpOmgH._BKxGrdWY < 6) {
return _fZTkWWFY({ success: false, _MhwlvCzj: "密码长度不能少于6位。" }, 400);
}
await _XbfvvSgB(_kSghXjZM, _ZQcpOmgH);
return _fZTkWWFY({ success: true, _MhwlvCzj: "初始密码设置成功!请刷新页面并登录。" });
}
async function _AgfThhvu(_NFlzziTu, _kSghXjZM) {
const { _cogUkHti, _RogxEllm } = await _NFlzziTu.json();
const _pztDbgOf = await _gnMzpuAb(_kSghXjZM);
if (_pztDbgOf !== _cogUkHti) {
return _fZTkWWFY({ success: false, _MhwlvCzj: "旧密码错误。" }, 403);
}
if (!_RogxEllm || _RogxEllm._BKxGrdWY < 6) {
return _fZTkWWFY({ success: false, _MhwlvCzj: "新密码长度不能少于6位。" }, 400);
}
await _XbfvvSgB(_kSghXjZM, _RogxEllm);
return _fZTkWWFY({ success: true, _MhwlvCzj: "密码修改成功!" });
}
function _OFuxcEur() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_egnAfGgU: '',
api: {
_PxfEhgmV: true,
_MhwlvCzj: '维护中...',
},
ispFilter: { _PxfEhgmV: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_PxfEhgmV: true
},
websocketStreamer: {
_PxfEhgmV: true,
_tHpQGhxp: 'https://snippets.neib.cn'
},
cloudStorage: {
_PxfEhgmV: true
},
visitorPassword: {
_PxfEhgmV: false,
_ZQcpOmgH: '',
},
customSubPath: {
_PxfEhgmV: false,
_MsJZEhdg: 'latest',
},
subscriptionId: {
_BKxGrdWY: 8,
_bDmbqFUt: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_PxfEhgmV: true,
template: 'vless://{_uKhMcTyS}@{_kePIaBxe}:{_tQnEOFqY}?encryption=none&security=tls&sni={_baJNbFBi}&fp=random&_eEGkjqFr=ws&_baJNbFBi={_baJNbFBi}&_MsJZEhdg={_MsJZEhdg}#{_nzFYtWSh}',
selectionMode: 'first',
_keKQbOmm: [
{ _nzFYtWSh: '默认配置', _baJNbFBi: '', '_uKhMcTyS': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _MsJZEhdg: '/?ed=2560' }
],
_saILdGBL: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_PxfEhgmV: false,
_dHJDuMPe: '',
_OQgrUVdh: 5
},
marquee: {
_PxfEhgmV: false,
_dHJDuMPe: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_PxfEhgmV: true,
sources: [
{ _lCyqZFJg: 'CF官方IPV4', _KZTmtaHQ: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _jsfMiQkO: false, _PxfEhgmV: true, _qwdDfoqC: 20 },
{ _lCyqZFJg: 'CF官方IPV6', _KZTmtaHQ: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _jsfMiQkO: false, _PxfEhgmV: true, _qwdDfoqC: 20 },
{ _lCyqZFJg: '反代优选0', _KZTmtaHQ: 'https://wvs.sosorg.nyc.mn/sub?_uKhMcTyS=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_eEGkjqFr=ws&_baJNbFBi=ss.nzvrn.com&_MsJZEhdg=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _jsfMiQkO: false, _PxfEhgmV: true, _qwdDfoqC: 30 },
{ _lCyqZFJg: '官方优选1', _KZTmtaHQ: 'https://ipdb.api.030101.xyz/?_eEGkjqFr=bestcf&_UZshnkxY=true', _jsfMiQkO: false, _PxfEhgmV: true, _qwdDfoqC: 10 },
{ _lCyqZFJg: '反代优选2', _KZTmtaHQ: 'https://ipdb.api.030101.xyz/?_eEGkjqFr=bestproxy&_UZshnkxY=true', _jsfMiQkO: false, _PxfEhgmV: true, _qwdDfoqC: 5 },
{ _lCyqZFJg: '官方优选2', _KZTmtaHQ: 'https://addressesapi.090227.xyz/_kePIaBxe.164746.xyz', _jsfMiQkO: false, _PxfEhgmV: true, _qwdDfoqC: 10 },
{ _lCyqZFJg: '官方优选3', _KZTmtaHQ: 'https://cfxr.eu.org/getSub?_baJNbFBi=snipaste.huggy.qzz.io', _jsfMiQkO: false, _PxfEhgmV: true, _qwdDfoqC: 5 },
{ _lCyqZFJg: '官方优选4', _KZTmtaHQ: 'https://addressesapi.090227.xyz/CloudFlareYes', _jsfMiQkO: false, _PxfEhgmV: true, _qwdDfoqC: 10 }
]
},
customNodes: {
_PxfEhgmV: 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 _AfElbsAv(_ICflkkCW, _bOqfhGvB) {
if (!_ICflkkCW) return _bOqfhGvB;
const _pfOPJPGH = { ..._bOqfhGvB };
for (const _sWpWHESH in _bOqfhGvB) {
if (_ICflkkCW.hasOwnProperty(_sWpWHESH)) {
if (typeof _ICflkkCW[_sWpWHESH] === 'object' && _ICflkkCW[_sWpWHESH] !== null && !Array.isArray(_ICflkkCW[_sWpWHESH]) && typeof _bOqfhGvB[_sWpWHESH] === 'object' && _bOqfhGvB[_sWpWHESH] !== null && !Array.isArray(_bOqfhGvB[_sWpWHESH])) {
_pfOPJPGH[_sWpWHESH] = _AfElbsAv(_ICflkkCW[_sWpWHESH], _bOqfhGvB[_sWpWHESH]);
} else {
_pfOPJPGH[_sWpWHESH] = _ICflkkCW[_sWpWHESH];
}
}
}
return _pfOPJPGH;
}
async function _REihPUSK(_kSghXjZM) {
try {
const _qOcahdJY = _kSghXjZM.DB.prepare("SELECT _tHTUmKrx FROM kv_data WHERE _sWpWHESH = ?").bind(_NwZYsUjH);
const { _LaHpOhNV } = await _qOcahdJY.all();
const _klpleEIM = _LaHpOhNV._BKxGrdWY > 0 ? _LaHpOhNV[0]._tHTUmKrx : null;
const _nrwTeuHk = _klpleEIM ? JSON.parse(_klpleEIM) : {};
return _AfElbsAv(_nrwTeuHk, _OFuxcEur());
} catch (_xCydVfWL) {
console.error("无法从D1获取或解析全局配置:", _xCydVfWL);
return _OFuxcEur();
}
}
async function _JfjbnOYD(_kSghXjZM) {
const _iBFSEHoA = await _REihPUSK(_kSghXjZM);
return _fZTkWWFY(_iBFSEHoA);
}
async function _ppcThWpb(_NFlzziTu, _kSghXjZM, _keflYwWs) {
try {
const { _iBFSEHoA, adminPassword } = await _NFlzziTu.json();
const _pztDbgOf = await _gnMzpuAb(_kSghXjZM);
if (_pztDbgOf !== adminPassword) {
return _fZTkWWFY({ success: false, _MhwlvCzj: "管理员密码错误" }, 403);
}
const _qOcahdJY = _kSghXjZM.DB.prepare(
"INSERT INTO kv_data (_sWpWHESH, _tHTUmKrx) VALUES (?, ?) ON CONFLICT(_sWpWHESH) DO UPDATE SET _tHTUmKrx = excluded._tHTUmKrx"
);
const _ZKOAPoiT = _qOcahdJY.bind(_NwZYsUjH, JSON.stringify(_iBFSEHoA)).run();
_keflYwWs.waitUntil(_ZKOAPoiT);
return _fZTkWWFY({ success: true, _MhwlvCzj: "配置已成功保存!" });
} catch (_xCydVfWL) {
return _fZTkWWFY({ success: false, _MhwlvCzj: `保存失败: ${_xCydVfWL._MhwlvCzj}` }, 500);
}
}
async function _LoSbVDYi() {
const _kImLieuc = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _SytIjHEw = await fetch(_kImLieuc);
const _XWqXeFGx = await _SytIjHEw.json();
const _zJHLNazQ = 'https://www.bing.com' + _XWqXeFGx.images[0]._tHpQGhxp;
return fetch(_zJHLNazQ);
} catch (_xCydVfWL) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _EITjbUSY(_kePIaBxe) {
try {
const _KUgOgstY = await fetch(`http://_kePIaBxe-api.com/json/${_kePIaBxe}?fields=status,_UZshnkxY,countryCode,_CBufPriW&lang=zh-CN`);
if (_KUgOgstY.ok) {
const _VEFfqbuc = await _KUgOgstY.json();
if (_VEFfqbuc.status === 'success' && (_VEFfqbuc.countryCode || _VEFfqbuc._UZshnkxY)) {
let _CBufPriW = _VEFfqbuc._CBufPriW || '未知';
if (_CBufPriW.toLowerCase().includes('cloudflare')) {
_CBufPriW = 'CloudFlare';
}
return {
_lCyqZFJg: _PiCtQLDu[_VEFfqbuc.countryCode] || _VEFfqbuc._UZshnkxY || _VEFfqbuc.countryCode,
_CBufPriW: _CBufPriW
};
}
}
} catch (_xCydVfWL) {}
try {
const _KUgOgstY = await fetch(`https://api._kePIaBxe.sb/geoip/${_kePIaBxe}`);
if (_KUgOgstY.ok) {
const _VEFfqbuc = await _KUgOgstY.json();
if (_VEFfqbuc.country_code || _VEFfqbuc._UZshnkxY) {
let _CBufPriW = _VEFfqbuc._CBufPriW || '未知';
if (_CBufPriW.toLowerCase().includes('cloudflare')) {
_CBufPriW = 'CloudFlare';
}
return {
_lCyqZFJg: _PiCtQLDu[_VEFfqbuc.country_code] || _VEFfqbuc._UZshnkxY || _VEFfqbuc.country_code,
_CBufPriW: _CBufPriW
};
}
}
} catch (_xCydVfWL) {}
return { _lCyqZFJg: '未知', _CBufPriW: '未知' };
}
async function _ZxAxxVWe(_NFlzziTu, _kSghXjZM) {
try {
const { _KZTmtaHQ } = await _NFlzziTu.json();
if (!Array.isArray(_KZTmtaHQ)) {
return _fZTkWWFY({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _kDFuoZfT = _KZTmtaHQ.map(_kePIaBxe => _EITjbUSY(_kePIaBxe).then(_gClllcBx => ({ _kePIaBxe, ..._gClllcBx })));
const _LaHpOhNV = await Promise.all(_kDFuoZfT);
return _fZTkWWFY(_LaHpOhNV);
} catch (_xCydVfWL) {
return _fZTkWWFY({ error: `获取地理位置失败: ${_xCydVfWL._MhwlvCzj}` }, 500);
}
}
async function _CXoytOfQ(_NFlzziTu, _kSghXjZM) {
const _iBFSEHoA = await _REihPUSK(_kSghXjZM);
if (!_iBFSEHoA.cloudStorage._PxfEhgmV) {
return _fZTkWWFY({ _LaHpOhNV: [], generatedBy: null });
}
try {
const _qOcahdJY = _kSghXjZM.DB.prepare("SELECT _tHTUmKrx FROM kv_data WHERE _sWpWHESH = ?").bind(_BAKtQKzl);
const { _LaHpOhNV } = await _qOcahdJY.all();
const _UoHTYbjg = _LaHpOhNV._BKxGrdWY > 0 ? _LaHpOhNV[0]._tHTUmKrx : null;
const _UKJKXUep = _UoHTYbjg ? JSON.parse(_UoHTYbjg) : null;
return _fZTkWWFY(_UKJKXUep || { _LaHpOhNV: [], generatedBy: null });
} catch (_xCydVfWL) {
console.error("从D1读取缓存IP失败:", _xCydVfWL);
return _fZTkWWFY({ _LaHpOhNV: [], generatedBy: null });
}
}
async function _gZxYQedd(_NFlzziTu, _kSghXjZM, _keflYwWs) {
const _iBFSEHoA = await _REihPUSK(_kSghXjZM);
if (!_iBFSEHoA.cloudStorage._PxfEhgmV) {
return _fZTkWWFY({ success: true, _MhwlvCzj: "云端存储已禁用,不保存结果。" });
}
const _YnmSRDTA = _NFlzziTu._VTWxvQwV.get('CF-Connecting-IP') || "未知IP";
const _UZshnkxY = _NFlzziTu.cf?._UZshnkxY || "未知";
const _SgcOnqGU = _NFlzziTu.cf?._SgcOnqGU || "";
let _vbtcicAT = _PiCtQLDu[_UZshnkxY] || _UZshnkxY;
if (_SgcOnqGU && _SgcOnqGU !== "未知城市" && _SgcOnqGU !== _UZshnkxY) _vbtcicAT = `${_vbtcicAT} ${_PiCtQLDu[_SgcOnqGU] || _SgcOnqGU}`;
const _nIxbTlOR = {
_kePIaBxe: _lyQHBpfe(_YnmSRDTA),
_lCyqZFJg: _vbtcicAT.trim(),
time: _YMbqrbjY()
};
try {
const _DsjhSJzG = await _NFlzziTu.json();
if (!Array.isArray(_DsjhSJzG)) return _fZTkWWFY({ error: "无效数据格式" }, 400);
const _drBrONSd = _DsjhSJzG.map(_OmoEVAdr => ({
_kePIaBxe: String(_OmoEVAdr._kePIaBxe || ''),
_tQnEOFqY: _OmoEVAdr._tQnEOFqY ? parseInt(_OmoEVAdr._tQnEOFqY, 10) : undefined,
_KkdnZnol: parseInt(_OmoEVAdr._KkdnZnol, 10),
_lCyqZFJg: typeof _OmoEVAdr._lCyqZFJg === 'string' ? _OmoEVAdr._lCyqZFJg.substring(0, 50) : 'N/A',
_CBufPriW: typeof _OmoEVAdr._CBufPriW === 'string' ? _OmoEVAdr._CBufPriW.substring(0, 100) : 'N/A'
}));
const _bSfBLZBK = {
generatedBy: _nIxbTlOR,
_LaHpOhNV: _drBrONSd
};
const _FFuIBzyT = _kSghXjZM.DB.prepare(
"INSERT INTO kv_data (_sWpWHESH, _tHTUmKrx) VALUES (?, ?) ON CONFLICT(_sWpWHESH) DO UPDATE SET _tHTUmKrx = excluded._tHTUmKrx"
).bind(_BAKtQKzl, JSON.stringify(_bSfBLZBK)).run();
if (_iBFSEHoA.telegram.bot_token && _iBFSEHoA.telegram.chat_id) {
const _XqBWkMQf = _drBrONSd.map(r => `${r._kePIaBxe} ~ ${r._lCyqZFJg}`).join('\n');
const _GcigRYMr = `优选完成!\n来源: ${_nIxbTlOR._kePIaBxe} (${_nIxbTlOR._lCyqZFJg})\n时间: ${_nIxbTlOR.time}\n\n结果:\n${_XqBWkMQf}`;
const _VKIbqZiQ = `https://api.telegram.org/bot${_iBFSEHoA.telegram.bot_token}/sendMessage?chat_id=${_iBFSEHoA.telegram.chat_id}&_dHJDuMPe=${encodeURIComponent(_GcigRYMr)}`;
const _hrpxIVYu = fetch(_VKIbqZiQ).catch(_xCydVfWL => console.error("Telegram结果通知失败:", _xCydVfWL));
_keflYwWs.waitUntil(Promise.all([_FFuIBzyT, _hrpxIVYu]));
} else {
_keflYwWs.waitUntil(_FFuIBzyT);
}
return _fZTkWWFY({ success: true, _MhwlvCzj: "结果已保存" });
} catch (_xCydVfWL) {
return _fZTkWWFY({ error: "D1写入失败", _MhwlvCzj: _xCydVfWL._MhwlvCzj }, 500);
}
}
async function _urfWOnbc(_NFlzziTu, _kSghXjZM, _keflYwWs) {
try {
const _psuXuhPl = await _NFlzziTu.json();
if (!Array.isArray(_psuXuhPl)) return _fZTkWWFY({ error: "无效数据格式" }, 400);
const _bSfBLZBK = {
_LaHpOhNV: _psuXuhPl
};
const _qOcahdJY = _kSghXjZM.DB.prepare(
"INSERT INTO kv_data (_sWpWHESH, _tHTUmKrx) VALUES (?, ?) ON CONFLICT(_sWpWHESH) DO UPDATE SET _tHTUmKrx = excluded._tHTUmKrx"
);
const _ZKOAPoiT = _qOcahdJY.bind(_vGleAeUq, JSON.stringify(_bSfBLZBK)).run();
_keflYwWs.waitUntil(_ZKOAPoiT);
return _fZTkWWFY({ success: true });
} catch (_xCydVfWL) {
return _fZTkWWFY({ error: "D1写入临时缓存失败", _MhwlvCzj: _xCydVfWL._MhwlvCzj }, 500);
}
}
function _CAwLakfd(_BKxGrdWY, _bDmbqFUt) {
let _XoMuNRlG = '';
const _nGcqlFkY = _bDmbqFUt._BKxGrdWY;
for (let _uUkhUKtY = 0; _uUkhUKtY < _BKxGrdWY; _uUkhUKtY++) {
_XoMuNRlG += _bDmbqFUt.charAt(Math.floor(Math.random() * _nGcqlFkY));
}
return _XoMuNRlG;
}
async function _HrVoRILt(_NFlzziTu, _kSghXjZM) {
try {
const _DsjhSJzG = await _NFlzziTu.json();
if (!Array.isArray(_DsjhSJzG) || _DsjhSJzG._BKxGrdWY === 0) {
return _fZTkWWFY({ error: "无效或空的IP列表" }, 400);
}
const _iBFSEHoA = await _REihPUSK(_kSghXjZM);
const _vYPYasIG = _iBFSEHoA.subscriptionId || { _BKxGrdWY: 8, _bDmbqFUt: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _mGQRxrYZ;
let _WoJdZGvy = false;
let _KWEjNvjh = 0;
const _lsMGEUaW = 10;
while (!_WoJdZGvy && _KWEjNvjh < _lsMGEUaW) {
_mGQRxrYZ = _CAwLakfd(_vYPYasIG._BKxGrdWY, _vYPYasIG._bDmbqFUt);
const { _LaHpOhNV } = await _kSghXjZM.DB.prepare("SELECT _ZFMylRPE FROM optimized_results WHERE _ZFMylRPE = ?").bind(_mGQRxrYZ).all();
if (_LaHpOhNV._BKxGrdWY === 0) {
_WoJdZGvy = true;
}
_KWEjNvjh++;
}
if (!_WoJdZGvy) {
return _fZTkWWFY({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _EfJDXeHC = JSON.stringify({ _KZTmtaHQ: _DsjhSJzG });
await _kSghXjZM.DB.prepare(
"INSERT INTO optimized_results (_ZFMylRPE, _VEFfqbuc) VALUES (?, ?)"
).bind(_mGQRxrYZ, _EfJDXeHC).run();
await _kSghXjZM.DB.prepare(
"INSERT INTO kv_data (_sWpWHESH, _tHTUmKrx) VALUES (?, ?) ON CONFLICT(_sWpWHESH) DO UPDATE SET _tHTUmKrx = excluded._tHTUmKrx"
).bind(_dgnxTKKa, _mGQRxrYZ).run();
return _fZTkWWFY({ success: true, _ZFMylRPE: _mGQRxrYZ });
} catch (_xCydVfWL) {
return _fZTkWWFY({ error: "保存优选结果失败", _MhwlvCzj: _xCydVfWL._MhwlvCzj }, 500);
}
}
async function _LJwAKNWp(_NFlzziTu, _kSghXjZM) {
try {
const _mGQRxrYZ = _NFlzziTu._cFxixrai._ZFMylRPE;
if (!_mGQRxrYZ) {
return new Response("缺少结果ID", { status: 400 });
}
const _XoMuNRlG = await _kSghXjZM.DB.prepare("SELECT _VEFfqbuc FROM optimized_results WHERE _ZFMylRPE = ?").bind(_mGQRxrYZ).first();
if (!_XoMuNRlG) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _VEFfqbuc = JSON.parse(_XoMuNRlG._VEFfqbuc);
let _XqBWkMQf = _VEFfqbuc._KZTmtaHQ;
const _iBFSEHoA = await _REihPUSK(_kSghXjZM);
if (_iBFSEHoA.customNodes && _iBFSEHoA.customNodes._PxfEhgmV && _iBFSEHoA.customNodes.list) {
const _DDYJIkqi = _iBFSEHoA.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _BrJnBOBX = _DDYJIkqi.map(_cQdpymll => {
let _mJGOsQki = _cQdpymll;
let _tQnEOFqY = undefined;
let _nzFYtWSh = null;
if (_mJGOsQki.includes('@')) {
const _EWHTfFBN = _mJGOsQki.split('@');
_nzFYtWSh = _EWHTfFBN.pop();
_mJGOsQki = _EWHTfFBN.join('@');
}
if (_mJGOsQki.includes('#')) {
const _EWHTfFBN = _mJGOsQki.split('#');
const _RhkqAWii = _EWHTfFBN.pop();
if (!isNaN(_RhkqAWii) && _RhkqAWii.trim() !== '') {
_tQnEOFqY = parseInt(_RhkqAWii, 10);
}
_mJGOsQki = _EWHTfFBN.join('#');
}
return {
_kePIaBxe: _mJGOsQki,
_tQnEOFqY: _tQnEOFqY,
_lCyqZFJg: _nzFYtWSh || _mJGOsQki,
_CBufPriW: '自定义'
};
});
_XqBWkMQf.unshift(..._BrJnBOBX);
}
const { itemLink } = _iBFSEHoA;
const _QbqxeJbI = new URL(_NFlzziTu._tHpQGhxp)._vFragIfz;
let _QgiqfjLk;
if (_iBFSEHoA.websocketStreamer && _iBFSEHoA.websocketStreamer._PxfEhgmV) {
if (!itemLink || !itemLink._PxfEhgmV || !itemLink._keKQbOmm || itemLink._keKQbOmm._BKxGrdWY === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_QgiqfjLk = _XqBWkMQf.map((_OmoEVAdr, _tyznJeYN) => {
let _nzFYtWSh;
if (_OmoEVAdr._CBufPriW === '自定义') {
_nzFYtWSh = `${_tyznJeYN + 1} - ${_OmoEVAdr._lCyqZFJg}`;
} else {
_nzFYtWSh = `${_tyznJeYN + 1} - ${_OmoEVAdr._lCyqZFJg || '未知'}`;
if (!_OmoEVAdr._CBufPriW || !_OmoEVAdr._CBufPriW.toLowerCase().includes('cloudflare')) {
_nzFYtWSh += '(反代)';
}
}
const _iFOnGilY = _rjKvxlhT.isIPv6(_OmoEVAdr._kePIaBxe) ? `[${_OmoEVAdr._kePIaBxe}]` : _OmoEVAdr._kePIaBxe;
const _tQnEOFqY = _OmoEVAdr._tQnEOFqY || 443;
const _ZVpzqSdW = itemLink._keKQbOmm[0];
const _NTMDQzVA = _ZVpzqSdW._uKhMcTyS || '';
const _uKhMcTyS = (_NTMDQzVA && _wENsuRyC(_NTMDQzVA)) ? _NTMDQzVA : crypto.randomUUID();
const _MsJZEhdg = '/snippets?_kePIaBxe=endpointAddress:_tQnEOFqY(443)&nat64=6to4';
const _baJNbFBi = _ZVpzqSdW._baJNbFBi || _QbqxeJbI;
const _cFxixrai = new URLSearchParams({
security: 'tls',
_eEGkjqFr: 'ws',
_baJNbFBi: _baJNbFBi,
sni: _baJNbFBi,
fp: 'random'
});
return `vless://${_uKhMcTyS}@${_iFOnGilY}:${_tQnEOFqY}?${_cFxixrai.toString()}&_MsJZEhdg=${encodeURIComponent(encodeURIComponent(_MsJZEhdg))}#${encodeURIComponent(_nzFYtWSh)}`;
});
} else {
if (!itemLink || !itemLink._PxfEhgmV || !itemLink._keKQbOmm || itemLink._keKQbOmm._BKxGrdWY === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _ZVpzqSdW = itemLink._keKQbOmm[0];
const { _baJNbFBi, _uKhMcTyS, _MsJZEhdg } = _ZVpzqSdW;
_QgiqfjLk = _XqBWkMQf.map((_OmoEVAdr, _tyznJeYN) => {
let _nzFYtWSh;
if (_OmoEVAdr._CBufPriW === '自定义') {
_nzFYtWSh = `${_tyznJeYN + 1} - ${_OmoEVAdr._lCyqZFJg}`;
} else {
_nzFYtWSh = `${_tyznJeYN + 1} - ${_OmoEVAdr._lCyqZFJg || '未知'}`;
if (!_OmoEVAdr._CBufPriW || !_OmoEVAdr._CBufPriW.toLowerCase().includes('cloudflare')) {
_nzFYtWSh += '(反代)';
}
}
const _iFOnGilY = _rjKvxlhT.isIPv6(_OmoEVAdr._kePIaBxe) ? `[${_OmoEVAdr._kePIaBxe}]` : _OmoEVAdr._kePIaBxe;
const _tQnEOFqY = _OmoEVAdr._tQnEOFqY || 443;
const _cFxixrai = new URLSearchParams({
security: 'tls',
_eEGkjqFr: 'ws',
_baJNbFBi: _baJNbFBi || _QbqxeJbI,
sni: _baJNbFBi || _QbqxeJbI,
fp: 'random'
});
return `vless://${_uKhMcTyS}@${_iFOnGilY}:${_tQnEOFqY}?${_cFxixrai.toString()}&_MsJZEhdg=${encodeURIComponent(encodeURIComponent(_MsJZEhdg || ''))}#${encodeURIComponent(_nzFYtWSh)}`;
});
}
const _kBrfnReU = _QgiqfjLk.join('\n');
const _RXdbBlnY = btoa(_kBrfnReU);
return new Response(_RXdbBlnY, {
_VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' }
});
} catch (_xCydVfWL) {
return new Response(`生成节点列表失败: ${_xCydVfWL._MhwlvCzj}`, { status: 500 });
}
}
async function _SuqyuByk(_NFlzziTu) {
try {
const { _lyvfWtwD, _eEGkjqFr } = await _NFlzziTu.json();
if (!Array.isArray(_lyvfWtwD)) {
return new Response('Invalid _lyvfWtwD list', { status: 400 });
}
const _yPmWTKiE = _lyvfWtwD.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _tHpQGhxp = `https://cloudflare-dns.com/dns-query?_nzFYtWSh=${encodeURIComponent(domain.trim())}&_eEGkjqFr=${_eEGkjqFr || 'A'}`;
return fetch(_tHpQGhxp, { _VTWxvQwV: { 'Accept': 'application/dns-json' } })
.then(_KUgOgstY => _KUgOgstY.json())
.then(_VEFfqbuc => (_VEFfqbuc.Answer ? _VEFfqbuc.Answer.map(a => a._VEFfqbuc) : []))
.catch(() => []);
});
const _eKRQUVyu = (await Promise.all(_yPmWTKiE)).flat();
const _kiTgLkDX = [...new Set(_eKRQUVyu)];
if (_kiTgLkDX._BKxGrdWY === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_kiTgLkDX.join('\n'), { _VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._MhwlvCzj}`, { status: 500 });
}
}
async function _ELBnndse(_NFlzziTu, _kSghXjZM) {
try {
const { _SLzPmHEY } = await _NFlzziTu.json();
if (!Array.isArray(_SLzPmHEY)) {
return _fZTkWWFY({ error: "Invalid input, expected an object with a '_SLzPmHEY' array." }, 400);
}
const _FWxmsURJ = new Set();
const _dDSsNgXs = _SLzPmHEY.map(_tHpQGhxp =>
_nWmKUPqq(_tHpQGhxp)
.then(_dHJDuMPe => {
if (!_dHJDuMPe) return;
const _TTsJRZVt = _dHJDuMPe.split(/[\s,;|]+/);
for (const _HzJHqizf of _TTsJRZVt) {
const _OHoaBnbY = _HzJHqizf.trim();
if (_OHoaBnbY) {
_FWxmsURJ.add(_OHoaBnbY);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_tHpQGhxp}:`, err);
})
);
await Promise.all(_dDSsNgXs);
return _fZTkWWFY({ _KZTmtaHQ: Array.from(_FWxmsURJ) });
} catch (_xCydVfWL) {
return _fZTkWWFY({ error: `Failed to process URLs: ${_xCydVfWL._MhwlvCzj}` }, 500);
}
}
async function _cmlFmhBz(_NFlzziTu, _kSghXjZM) {
const _iBFSEHoA = await _REihPUSK(_kSghXjZM);
if (!_iBFSEHoA.api._PxfEhgmV) {
return new Response(_iBFSEHoA.api._MhwlvCzj || 'API is disabled.', { status: 503 });
}
try {
const _qOcahdJY = _kSghXjZM.DB.prepare("SELECT _tHTUmKrx FROM kv_data WHERE _sWpWHESH = ?").bind(_BAKtQKzl);
const { _LaHpOhNV: dbResults } = await _qOcahdJY.all();
const _UoHTYbjg = dbResults._BKxGrdWY > 0 ? dbResults[0]._tHTUmKrx : null;
const _UKJKXUep = _UoHTYbjg ? JSON.parse(_UoHTYbjg) : null;
if (!_UKJKXUep || !_UKJKXUep._LaHpOhNV || _UKJKXUep._LaHpOhNV._BKxGrdWY === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' },
});
}
const _KZTmtaHQ = _UKJKXUep._LaHpOhNV.map(r => r._kePIaBxe);
return new Response(_KZTmtaHQ.join('\n'), {
_VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' },
});
} catch (_xCydVfWL) {
console.error("API /_kePIaBxe 处理错误:", _xCydVfWL);
return new Response(`API处理时出错: ${_xCydVfWL._MhwlvCzj}`, { status: 500 });
}
}
function _cMJdzboo(_XoMuNRlG, _tyznJeYN, _iBFSEHoA, _QbqxeJbI) {
const { itemLink } = _iBFSEHoA;
if (!itemLink || !itemLink._PxfEhgmV) return null;
const { template, _keKQbOmm, selectionMode, _saILdGBL } = itemLink;
if (!_keKQbOmm || _keKQbOmm._BKxGrdWY === 0) return null;
let _EgEYOlwX;
if (selectionMode === 'random') {
_EgEYOlwX = _keKQbOmm[_tyznJeYN % _keKQbOmm._BKxGrdWY];
} else if (selectionMode === 'first') {
_EgEYOlwX = _keKQbOmm[0];
} else {
_EgEYOlwX = _keKQbOmm.find(s => s._nzFYtWSh === selectionMode) || _keKQbOmm[0];
}
if (!_EgEYOlwX) return null;
let _ksIXgZmy = template;
const _KdeJhkAO = _XoMuNRlG._tQnEOFqY || 443;
const _kctcBTAQ = _rjKvxlhT.isIPv6(_XoMuNRlG._kePIaBxe) ? `[${_XoMuNRlG._kePIaBxe}]` : _XoMuNRlG._kePIaBxe;
let _nzFYtWSh = `${_tyznJeYN + 1} 、 ${_XoMuNRlG._lCyqZFJg || '未知'}`;
if (!_XoMuNRlG._CBufPriW || !_XoMuNRlG._CBufPriW.toLowerCase().includes('cloudflare')) {
_nzFYtWSh += '(反代)';
}
let _baJNbFBi = _EgEYOlwX._baJNbFBi || _QbqxeJbI;
_ksIXgZmy = _ksIXgZmy.replace(/{_kePIaBxe}/g, _kctcBTAQ)
.replace(/{_tQnEOFqY}/g, _KdeJhkAO)
.replace(/{_nzFYtWSh}/g, encodeURIComponent(_nzFYtWSh))
.replace(/{rank}/g, _tyznJeYN + 1)
.replace(/{_lCyqZFJg}/g, encodeURIComponent(_XoMuNRlG._lCyqZFJg || '未知'))
.replace(/{_CBufPriW}/g, encodeURIComponent(_XoMuNRlG._CBufPriW || '未知'))
.replace(/{_baJNbFBi}/g, encodeURIComponent(_baJNbFBi))
.replace(/{_uKhMcTyS}/g, encodeURIComponent(_EgEYOlwX['_uKhMcTyS'] || ''))
.replace(/{_MsJZEhdg}/g, encodeURIComponent(encodeURIComponent(_EgEYOlwX._MsJZEhdg || '')));
if (_saILdGBL) {
_saILdGBL.forEach(field => {
const _sKCgjtAn = new RegExp('{' + field._nzFYtWSh + '}', 'g');
_ksIXgZmy = _ksIXgZmy.replace(_sKCgjtAn, encodeURIComponent(field._tHTUmKrx));
});
}
return _ksIXgZmy;
}
async function _ZEdPnzJb(_NFlzziTu, _kSghXjZM) {
const _iBFSEHoA = await _REihPUSK(_kSghXjZM);
if (!_iBFSEHoA.itemLink._PxfEhgmV) {
return new Response("Item _ksIXgZmy feature is disabled.", { status: 503, _VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' } });
}
try {
const _qOcahdJY = _kSghXjZM.DB.prepare("SELECT _tHTUmKrx FROM kv_data WHERE _sWpWHESH = ?").bind(_BAKtQKzl);
const { _LaHpOhNV: dbResults } = await _qOcahdJY.all();
const _UoHTYbjg = dbResults._BKxGrdWY > 0 ? dbResults[0]._tHTUmKrx : null;
const _UKJKXUep = _UoHTYbjg ? JSON.parse(_UoHTYbjg) : null;
if (!_UKJKXUep || !_UKJKXUep._LaHpOhNV || _UKJKXUep._LaHpOhNV._BKxGrdWY === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' },
});
}
const _QbqxeJbI = new URL(_NFlzziTu._tHpQGhxp)._vFragIfz;
const _bLFhqnXg = _UKJKXUep._LaHpOhNV.map((_XoMuNRlG, _tyznJeYN) => {
return _cMJdzboo(_XoMuNRlG, _tyznJeYN, _iBFSEHoA, _QbqxeJbI);
}).filter(Boolean);
if (_bLFhqnXg._BKxGrdWY === 0) {
return new Response("Could not generate any _OmoEVAdr links from the available IPs.", {
status: 500,
_VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' },
});
}
return new Response(_bLFhqnXg.join('\n'), {
_VTWxvQwV: { 'Content-Type': '_dHJDuMPe/plain; _bDmbqFUt=utf-8' },
});
} catch (_xCydVfWL) {
console.error("API /api/endpoints error:", _xCydVfWL);
return new Response(`Error processing API _NFlzziTu: ${_xCydVfWL._MhwlvCzj}`, { status: 500 });
}
}
async function _UrnxZGId(_NFlzziTu, _kSghXjZM, _keflYwWs) {
const _YnmSRDTA = _NFlzziTu._VTWxvQwV.get('CF-Connecting-IP') || "未知IP";
const [
_usoBhNQf,
_inExDkYM,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_bWgzCmxH(_DteOLKiy, _rTSYsFnl, []),
_bWgzCmxH(_rShxmsAy, _rTSYsFnl, []),
_bWgzCmxH(_PcPGLzVD, _JWISkBOl, []),
_bWgzCmxH(_ntvesuxS, _RGWWENUy, { "N/A": "未知" })
]);
_PiCtQLDu = fetchedCountryMap;
let _TbaYvcdF = false;
let _kpnYRDyR;
try {
const _ZQcpOmgH = await _gnMzpuAb(_kSghXjZM);
_TbaYvcdF = !!_ZQcpOmgH;
_kpnYRDyR = await _REihPUSK(_kSghXjZM);
} catch (_xCydVfWL) {
if (_xCydVfWL._MhwlvCzj && _xCydVfWL._MhwlvCzj.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _IBKpuvGf = "CREATE TABLE IF NOT EXISTS kv_data (_sWpWHESH TEXT PRIMARY KEY, _tHTUmKrx TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_ZFMylRPE TEXT PRIMARY KEY, _VEFfqbuc TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _kSghXjZM.DB.exec(_IBKpuvGf);
console.log("数据表创建成功。");
_TbaYvcdF = false;
_kpnYRDyR = _OFuxcEur();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._MhwlvCzj}`, {
status: 500,
_VTWxvQwV: { 'Content-Type': '_dHJDuMPe/html;_bDmbqFUt=UTF-8' }
});
}
} else {
let _FCYfozFe = _eFZImgcf(_xCydVfWL._MhwlvCzj);
return new Response(_FCYfozFe, { _VTWxvQwV: { 'Content-Type': '_dHJDuMPe/html;_bDmbqFUt=UTF-8' } });
}
}
if (_kpnYRDyR.telegram.bot_token && _kpnYRDyR.telegram.chat_id) {
const _UZshnkxY = _NFlzziTu.cf?._UZshnkxY || "未知";
const _SgcOnqGU = _NFlzziTu.cf?._SgcOnqGU || "";
let _vbtcicAT = _PiCtQLDu[_UZshnkxY] || _UZshnkxY;
if (_SgcOnqGU && _SgcOnqGU !== "未知城市" && _SgcOnqGU !== _UZshnkxY) _vbtcicAT = `${_vbtcicAT} ${_PiCtQLDu[_SgcOnqGU] || _SgcOnqGU}`;
const _cccKHJrf = _YMbqrbjY();
const _VIFlOOno = _NFlzziTu._tHpQGhxp;
const _GcigRYMr = `访客: ${_YnmSRDTA}\n位置: ${_vbtcicAT.trim()}\n时间: ${_cccKHJrf}\n来自:${_VIFlOOno}`;
const _VKIbqZiQ = `https://api.telegram.org/bot${_kpnYRDyR.telegram.bot_token}/sendMessage?chat_id=${_kpnYRDyR.telegram.chat_id}&_dHJDuMPe=${encodeURIComponent(_GcigRYMr)}`;
_keflYwWs.waitUntil(fetch(_VKIbqZiQ).catch(_xCydVfWL => console.error("Telegram通知失败:", _xCydVfWL)));
}
let _HEetumGr = _VSUOZaFI();
const _lrzhTNQa = {
_iBFSEHoA: _kpnYRDyR,
status: {
_TbaYvcdF: _TbaYvcdF,
}
};
_HEetumGr = _HEetumGr.replace('__PAGE_DATA_JSON__', JSON.stringify(_lrzhTNQa));
_HEetumGr = _HEetumGr.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_usoBhNQf));
_HEetumGr = _HEetumGr.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_inExDkYM));
_HEetumGr = _HEetumGr.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_HEetumGr = _HEetumGr.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_PiCtQLDu));
return new Response(_HEetumGr, {
_VTWxvQwV: { 'Content-Type': '_dHJDuMPe/html;_bDmbqFUt=UTF-8' },
});
}
function _fZTkWWFY(_RhJzDlxQ, status = 200, _VTWxvQwV = {}) {
return new Response(JSON.stringify(_RhJzDlxQ), {
status,
_VTWxvQwV: { 'Content-Type': 'application/json;_bDmbqFUt=UTF-8', ..._VTWxvQwV }
});
}
function _YMbqrbjY(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 _lyQHBpfe(_kePIaBxe) {
if (!_kePIaBxe || typeof _kePIaBxe !== 'string') return "无效IP";
if(_rjKvxlhT.isIPv4(_kePIaBxe)){
const _EWHTfFBN = _kePIaBxe.split('.');
if (_EWHTfFBN._BKxGrdWY === 4) return `${_EWHTfFBN[0]}.*.*.${_EWHTfFBN[3]}`;
}
if(_rjKvxlhT.isIPv6(_kePIaBxe)){
const _EWHTfFBN = _kePIaBxe.split(':');
if (_EWHTfFBN._BKxGrdWY > 2) return `${_EWHTfFBN[0]}:...:${_EWHTfFBN[_EWHTfFBN._BKxGrdWY - 1]}`;
}
return _kePIaBxe;
}
function _eFZImgcf(_uakviNxJ) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _bDmbqFUt="UTF-8"><title>需要设置</title>
<_HSEtCKXW>
_RhJzDlxQ { font-family: sans-serif; background: #1a1a1a; _OVBQuCzh: #e0e0e0; display: flex; justify-_hGGjqbIj: center; align-items: center; height: 100vh; margin: 0; }
._ergxyJcb { max-_IVlERQxT: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _OVBQuCzh: #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 { _OVBQuCzh: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_QXFxTdzm: 1rem; }
</_HSEtCKXW>
</head><_RhJzDlxQ>
<div class="_ergxyJcb">
<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>
${_uakviNxJ ? `<div class="error"><strong>当前错误信息:</strong> ${_uakviNxJ.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_RhJzDlxQ></html>`;
}
function _VSUOZaFI() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _bDmbqFUt="UTF-8"> <meta _nzFYtWSh="viewport" _hGGjqbIj="_IVlERQxT=device-_IVlERQxT, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_ksIXgZmy 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>
<_HSEtCKXW>
:root { --primary-_OVBQuCzh: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_OVBQuCzh: #8c939d; --light-bg: #1A1C20; --_hGGjqbIj-bg: #25282E; --border-_OVBQuCzh: #40444C; --_dHJDuMPe-_OVBQuCzh: #E0E0E0; --_dHJDuMPe-light: #B0B0B0; --success-_OVBQuCzh: #30A46C; --danger-_OVBQuCzh: #DA3633; --warning-_OVBQuCzh: #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; }
_RhJzDlxQ { font-family: var(--font-family-sans); background-_OVBQuCzh: var(--light-bg); _OVBQuCzh: var(--_dHJDuMPe-_OVBQuCzh); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_OVBQuCzh 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_mCSwUsgN { position: fixed; _QXFxTdzm: 0; _tbGHJIRk: 0; _IVlERQxT: 100%; height: 100%; z-_tyznJeYN: -1; display: none; }
._YewpUjzc-_ergxyJcb { max-_IVlERQxT: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_tyznJeYN: 1; }
#_FfTymvBS { position: fixed; _QXFxTdzm: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_tyznJeYN: 10; }
#marquee-_ergxyJcb { overflow: hidden; white-space: nowrap; background-_OVBQuCzh: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _OVBQuCzh: var(--primary-_OVBQuCzh); padding: 0.5rem 0; margin-_QXFxTdzm: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_dHJDuMPe { display: inline-block; padding-_tbGHJIRk: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_tRTIzUXv { _dHJDuMPe-align: center; margin-_QXFxTdzm: 1rem; margin-bottom: 2rem; }
_tRTIzUXv h1 { white-space: pre-wrap; font-size: 2.25em; _OVBQuCzh: var(--primary-_OVBQuCzh); font-weight: 700; _dHJDuMPe-shadow: 0 0 10px rgba(var(--primary-_OVBQuCzh-rgb), 0.3); }
.card { background-_OVBQuCzh: 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-_OVBQuCzh); }
.progress-section #_wVdlUAqb { _IVlERQxT: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_OVBQuCzh: var(--border-_OVBQuCzh); overflow: hidden; }
.progress-section #_wVdlUAqb::-webkit-progress-_tHTUmKrx { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _dHJDuMPe-align: center; margin-_QXFxTdzm: 0.75em; font-size: 0.95em; _OVBQuCzh: var(--_dHJDuMPe-light); min-height: 1.5em; }
.section-_tRTIzUXv { display: flex; flex-wrap: wrap; justify-_hGGjqbIj: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_OVBQuCzh); gap: 1rem; }
.section-_tRTIzUXv h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _OVBQuCzh: var(--secondary-_OVBQuCzh); _dHJDuMPe-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _IVlERQxT: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _IVlERQxT: 100%; border-collapse: collapse; margin-_QXFxTdzm: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_OVBQuCzh); padding: 0.8em; _dHJDuMPe-align: _tbGHJIRk; vertical-align: middle; white-space: nowrap; }
th { background-_OVBQuCzh: #2c3038; font-weight: 500; }
tbody tr:hover { background-_OVBQuCzh: #30333a; }
td._kePIaBxe-_mJGOsQki { font-weight: 500; font-family: var(--font-family-mono); _OVBQuCzh: var(--primary-_OVBQuCzh); }
td.ping-_tHTUmKrx { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _dHJDuMPe-align: right; }
.btn { display: inline-flex; align-items: center; justify-_hGGjqbIj: center; font-weight: 500; _dHJDuMPe-align: center; cursor: pointer; user-_TFTApgUo: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _OVBQuCzh: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_tbGHJIRk: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _OVBQuCzh: var(--primary-_OVBQuCzh); border: 1px solid var(--primary-_OVBQuCzh); }
.btn-outline:hover { background-_OVBQuCzh: var(--primary-_OVBQuCzh); _OVBQuCzh: var(--_hGGjqbIj-bg); }
._YewpUjzc-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._YewpUjzc-download-buttons .btn { _IVlERQxT: 100%; margin: 0; }
.tooltip-notification { position: fixed; _QXFxTdzm: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _OVBQuCzh: #fff; font-size: 0.95em; z-_tyznJeYN: 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); }
#_krKyETsN, #_fXAGgIqJ, #_rjxiCLbL, #_omUmroNk, #_RyBBJyhR { display: none; position: fixed; z-_tyznJeYN: 10000; _tbGHJIRk: 0; _QXFxTdzm: 0; _IVlERQxT: 100%; height: 100%; background-_OVBQuCzh: rgba(0,0,0,0.6); justify-_hGGjqbIj: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_hGGjqbIj, ._YewpUjzc-modal-_hGGjqbIj { background-_OVBQuCzh: var(--_hGGjqbIj-bg); padding: 2rem; border: 1px solid var(--border-_OVBQuCzh); border-radius: var(--border-radius-md); _IVlERQxT: 95%; max-_IVlERQxT: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_omUmroNk .modal-_hGGjqbIj { max-_IVlERQxT: 500px; }
.modal-_hGGjqbIj h3, ._YewpUjzc-modal-_tRTIzUXv h3 { margin-_QXFxTdzm: 0; margin-bottom: 1.5rem; _OVBQuCzh: var(--primary-_OVBQuCzh); _dHJDuMPe-align: center; }
.modal-buttons { display: flex; justify-_hGGjqbIj: flex-end; gap: 1rem; margin-_QXFxTdzm: 2rem; border-_QXFxTdzm: 1px solid var(--border-_OVBQuCzh); padding-_QXFxTdzm: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_OVBQuCzh), rgba(0,0,0,0)); margin: 2rem 0; }
._YewpUjzc-modal-_tRTIzUXv { display: flex; justify-_hGGjqbIj: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_OVBQuCzh); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _OVBQuCzh: var(--_dHJDuMPe-light); cursor: pointer; background: none; border: none; padding: 0; }
._YewpUjzc-list-_OmoEVAdr { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_OVBQuCzh); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._YewpUjzc-_nzFYtWSh { font-size: 1.1em; font-weight: 600; }
._YewpUjzc-links a { display: block; _OVBQuCzh: var(--primary-_OVBQuCzh); _dHJDuMPe-decoration: none; margin-_QXFxTdzm: 0.5rem; word-break: break-all; }
._YewpUjzc-links a:hover { _dHJDuMPe-decoration: underline; }
._YewpUjzc-links span { _OVBQuCzh: var(--_dHJDuMPe-light); }
#visitorPasswordPrompt { _dHJDuMPe-align: center; }
#visitorPasswordPrompt h3 { _OVBQuCzh: var(--primary-_OVBQuCzh); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _OVBQuCzh: var(--_dHJDuMPe-light); margin-bottom: 1.5rem; }
._ZQcpOmgH-input-group { display: flex; gap: 10px; max-_IVlERQxT: 400px; margin: 0 auto; }
._ZQcpOmgH-input-group input { flex-grow: 1; _dHJDuMPe-align: center; }
._ZQcpOmgH-input-group .btn { margin-_tbGHJIRk: 0; }
._LaHpOhNV-actions-_ergxyJcb { _dHJDuMPe-align: center; margin-bottom: 1.5rem; }
._LaHpOhNV-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._LaHpOhNV-api-buttons .btn { margin: 0; _IVlERQxT: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_hGGjqbIj 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 _TFTApgUo, .form-grid-control textarea { _IVlERQxT: 100%; background-_OVBQuCzh: var(--light-bg); border: 1px solid var(--border-_OVBQuCzh); border-radius: var(--border-radius-sm); _OVBQuCzh: var(--_dHJDuMPe-_OVBQuCzh); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_OVBQuCzh 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _TFTApgUo:focus, .form-grid-control textarea:focus { border-_OVBQuCzh: var(--primary-_OVBQuCzh); box-shadow: 0 0 0 2px rgba(var(--primary-_OVBQuCzh-rgb), 0.2); outline: none; }
.form-grid-control input[_eEGkjqFr="_OVBQuCzh"] { min-_IVlERQxT: auto; padding: 2px; _IVlERQxT: 2.5em; height: 2.5em; }
.form-grid-control input[_eEGkjqFr="checkbox"] { _IVlERQxT: auto; flex-shrink: 0; height: 1.2em; _IVlERQxT: 1.2em; }
.form-grid-control ._qwdDfoqC-input { _IVlERQxT: 80px; _dHJDuMPe-align: right; }
.tooltip-_wwyMCJNg { display: inline-flex; _IVlERQxT: 16px; height: 16px; align-items: center; justify-_hGGjqbIj: center; background-_OVBQuCzh: var(--secondary-_OVBQuCzh); _OVBQuCzh: var(--_hGGjqbIj-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_TFTApgUo: none; }
#tooltip-popup { position: fixed; background-_OVBQuCzh: #383c4a; _OVBQuCzh: #fff; padding: 10px 15px; border-radius: 6px; z-_tyznJeYN: 10001; font-size: 0.85em; max-_IVlERQxT: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_OVBQuCzh); pointer-events: none; }
#custom-fields-_ergxyJcb .form-grid-control { gap: 5px; } #custom-fields-_ergxyJcb .form-grid-control input { flex: 1; }
.parameter-_jNwuomlq-_rKRydXJm { border: 1px solid var(--border-_OVBQuCzh); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_jNwuomlq-_tRTIzUXv { display: flex; justify-_hGGjqbIj: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_jNwuomlq-_tRTIzUXv input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_QXFxTdzm: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._dHJDuMPe-_OVBQuCzh-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _IVlERQxT: 100%; }
._dHJDuMPe-_OVBQuCzh-grid input[_eEGkjqFr="_OVBQuCzh"] { grid-column: 1 / 2; }
._dHJDuMPe-_OVBQuCzh-grid input[_eEGkjqFr="_dHJDuMPe"], ._dHJDuMPe-_OVBQuCzh-grid textarea { grid-column: 2 / 3; }
#_omUmroNk .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_omUmroNk .btn-group { display: flex; }
#_omUmroNk .sub-btn { flex-grow: 1; margin: 0; }
#_omUmroNk ._zJywLBNl-btn { flex-shrink: 0; margin-_tbGHJIRk: -1px; border-_QXFxTdzm-_tbGHJIRk-radius: 0; border-bottom-_tbGHJIRk-radius: 0; }
#_RyBBJyhR .modal-_hGGjqbIj { max-_IVlERQxT: 300px; background: white; padding: 1rem; _dHJDuMPe-align: center; }
#qrCodeImg { max-_IVlERQxT: 100%; }
@media (max-_IVlERQxT: 768px) {
html { font-size: 15px; } ._YewpUjzc-_ergxyJcb { padding: 0 0.8rem; } _tRTIzUXv { margin-_QXFxTdzm: 2.5rem; margin-bottom: 1.5rem; } #_FfTymvBS { _QXFxTdzm: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_HSEtCKXW>
<_HSEtCKXW _ZFMylRPE="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_hGGjqbIj-bg: #FFFFFF; --border-_OVBQuCzh: #DCDFE6; --_dHJDuMPe-_OVBQuCzh: #303133; --_dHJDuMPe-light: #606266; }
.theme-light .card { background-_OVBQuCzh: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_OVBQuCzh: #F5F7FA; }
.theme-light tbody tr:hover { background-_OVBQuCzh: #ECF5FF; }
.theme-matrix { --primary-_OVBQuCzh: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_hGGjqbIj-bg: #0D0208; --border-_OVBQuCzh: #00FF41; --_dHJDuMPe-_OVBQuCzh: #00FF41; --_dHJDuMPe-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_OVBQuCzh: rgba(0, 20, 0, 0.7); _dHJDuMPe-shadow: 0 0 5px var(--primary-_OVBQuCzh); backdrop-filter: none; }
.theme-matrix th { background-_OVBQuCzh: #000; }
.theme-matrix tbody tr:hover { background-_OVBQuCzh: #010; }
.theme-matrix .btn { _dHJDuMPe-shadow: none; _OVBQuCzh: #000; }
.theme-matrix .btn-outline { background-_OVBQuCzh: transparent; }
.theme-modern-glass { --primary-_OVBQuCzh: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_hGGjqbIj-bg: rgba(30, 30, 40, 0.6); --border-_OVBQuCzh: rgba(255, 255, 255, 0.2); --_dHJDuMPe-_OVBQuCzh: #F0F0F0; --_dHJDuMPe-light: #A0A0B0; --border-radius-md: 12px; }
_RhJzDlxQ.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-_OVBQuCzh: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_hGGjqbIj-bg: rgba(30, 30, 40, 0.6); --border-_OVBQuCzh: rgba(255, 255, 255, 0.2); --_dHJDuMPe-_OVBQuCzh: #F0F0F0; --_dHJDuMPe-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_OVBQuCzh: var(--_hGGjqbIj-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_OVBQuCzh); }
.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-_OVBQuCzh: rgba(0,0,0,0.3); border-right-_OVBQuCzh: 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); _dHJDuMPe-shadow: 0 1px 2px rgba(0,0,0,0.2); _OVBQuCzh: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_OVBQuCzh: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _dHJDuMPe-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_OVBQuCzh); border-_OVBQuCzh: var(--primary-_OVBQuCzh); _OVBQuCzh: #fff; }
.glassy-components _tRTIzUXv h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _dHJDuMPe; -webkit-_dHJDuMPe-fill-_OVBQuCzh: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _OVBQuCzh: transparent; }
.theme-aurora-glass { --primary-_OVBQuCzh: #38bdf8; --light-bg: #0c0a09; --_hGGjqbIj-bg: rgba(23, 23, 23, 0.5); --border-_OVBQuCzh: rgba(255, 255, 255, 0.15); --_dHJDuMPe-_OVBQuCzh: #f2f2f2; --_dHJDuMPe-light: #a3a3a3; }
_RhJzDlxQ.theme-aurora-glass::before { _hGGjqbIj: ''; position: fixed; _QXFxTdzm: 0; _tbGHJIRk: 0; _IVlERQxT: 100%; height: 100%; z-_tyznJeYN: -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-_OVBQuCzh: #08fdd8; --light-bg: #010409; --_hGGjqbIj-bg: rgba(22, 27, 34, 0.6); --border-_OVBQuCzh: rgba(139, 148, 158, 0.3); --_dHJDuMPe-_OVBQuCzh: #e6edf3; --_dHJDuMPe-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_OVBQuCzh), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_OVBQuCzh-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_OVBQuCzh-rgb), 0.5); }
.theme-marble-light { --primary-_OVBQuCzh: #bfa37c; --light-bg: #f7f5f2; --_hGGjqbIj-bg: #ffffff; --border-_OVBQuCzh: #e0dcd5; --_dHJDuMPe-_OVBQuCzh: #3d3a36; --_dHJDuMPe-light: #6b6661; }
_RhJzDlxQ.theme-marble-light { background-image: _tHpQGhxp('_VEFfqbuc:image/svg+xml,%3Csvg _IVlERQxT="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-_OVBQuCzh: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_HSEtCKXW>
</head><_RhJzDlxQ _ZFMylRPE="pageBody">
<_mCSwUsgN _ZFMylRPE="background-_mCSwUsgN"></_mCSwUsgN>
<div _ZFMylRPE="_krKyETsN">
<div class="modal-_hGGjqbIj">
<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 _eEGkjqFr="_ZQcpOmgH" _ZFMylRPE="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _eEGkjqFr="_ZQcpOmgH" _ZFMylRPE="confirmPassword"></div></div>
<div class="modal-buttons"><button _ZFMylRPE="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_YewpUjzc-_ergxyJcb">
<button _ZFMylRPE="_FfTymvBS" class="btn btn-outline"></button>
<div _ZFMylRPE="marquee-_ergxyJcb"><div _ZFMylRPE="marquee-_dHJDuMPe"></div></div>
<_tRTIzUXv><h1 _ZFMylRPE="pageTitle"></h1></_tRTIzUXv>
<div class="card" _ZFMylRPE="visitorPasswordPrompt" _HSEtCKXW="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_ZQcpOmgH-input-group">
<input _eEGkjqFr="_ZQcpOmgH" _ZFMylRPE="visitorPasswordEntry" _sKCgjtAn="访客密码">
<button _ZFMylRPE="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _ZFMylRPE="_yOScQApX" _HSEtCKXW="display: block;">
<div class="card progress-section">
<div _ZFMylRPE="progressDisplay">
<progress _ZFMylRPE="_wVdlUAqb" _tHTUmKrx="0" max="100"></progress>
<div _ZFMylRPE="status">正在初始化...</div>
</div>
</div>
<div class="card _YewpUjzc-download-section">
<div class="section-_tRTIzUXv"><h2 _ZFMylRPE="appDownloadTitleEl"></h2></div>
<div class="_YewpUjzc-download-buttons">
<button class="btn" _VEFfqbuc-_wkyncmox="android">安卓客户端</button>
<button class="btn" _VEFfqbuc-_wkyncmox="ios">苹果客户端</button>
<button class="btn" _VEFfqbuc-_wkyncmox="windows">Windows客户端</button>
<button class="btn" _VEFfqbuc-_wkyncmox="mac">Mac客户端</button>
</div>
</div>
<div class="card _LaHpOhNV-section" _ZFMylRPE="_niBQTzOv" _HSEtCKXW="display:none;">
<div class="section-_tRTIzUXv">
<h2 _ZFMylRPE="liveTitleEl"></h2>
<div class="generator-info" _ZFMylRPE="liveGeneratorInfo"></div>
</div>
<div _ZFMylRPE="_OPCJUbgM" class="_LaHpOhNV-actions-_ergxyJcb" _HSEtCKXW="display: none;">
<div class="_LaHpOhNV-api-buttons">
<button _ZFMylRPE="copyIpApiBtn" class="btn">复制 IP API</button>
<button _ZFMylRPE="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _ZFMylRPE="resultsTable">
<thead><tr><th _ZFMylRPE="tableHeader1El"></th><th _ZFMylRPE="tableHeader2El"></th><th _ZFMylRPE="tableHeader3El"></th><th _ZFMylRPE="tableHeader4El"></th><th _ZFMylRPE="tableHeader5El"></th><th _ZFMylRPE="tableHeader6El"></th><th _ZFMylRPE="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _ZFMylRPE="_BYlKDwEl" _HSEtCKXW="display:none;">
<div class="section-_tRTIzUXv"><h2 _ZFMylRPE="cachedTitleEl"></h2><div class="generator-info" _ZFMylRPE="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _ZFMylRPE="cachedResultsTable">
<thead><tr><th _ZFMylRPE="cachedTableHeader1El"></th><th _ZFMylRPE="cachedTableHeader2El"></th><th _ZFMylRPE="cachedTableHeader3El"></th><th _ZFMylRPE="cachedTableHeader4El"></th><th _ZFMylRPE="cachedTableHeader5El"></th><th _ZFMylRPE="cachedTableHeader6El"></th><th _ZFMylRPE="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _ZFMylRPE="notificationTooltip" class="tooltip-notification"></div>
<div _ZFMylRPE="_fXAGgIqJ">
<div class="modal-_hGGjqbIj">
<h3>修改参数</h3>
<div _HSEtCKXW="display: flex; border-bottom: 1px solid var(--border-_OVBQuCzh); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_ZFYwWoSc(event, 'general-_NgOoawbj')">通用设置</button>
<button class="tab-button" onclick="_ZFYwWoSc(event, '_ksIXgZmy-_NgOoawbj')">链接设置</button>
<button class="tab-button" onclick="_ZFYwWoSc(event, 'fine-grained-_NgOoawbj')">IP源设置</button>
<button class="tab-button" onclick="_ZFYwWoSc(event, 'advanced-_NgOoawbj')">高级设置</button>
</div>
<div _ZFMylRPE="general-_NgOoawbj" class="tab-_hGGjqbIj" _HSEtCKXW="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_TFTApgUo _ZFMylRPE="themeSelect">
<_lynTdVtl _tHTUmKrx="theme-aurora-glass">极光-玻璃质感</_lynTdVtl>
<_lynTdVtl _tHTUmKrx="theme-particles-glass">粒子-玻璃质感</_lynTdVtl>
<_lynTdVtl _tHTUmKrx="theme-modern-glass">现代-玻璃质感</_lynTdVtl>
<_lynTdVtl _tHTUmKrx="theme-cyberpunk-glass">赛博朋克-玻璃质感</_lynTdVtl>
<_lynTdVtl _tHTUmKrx="theme-dark-particles">暗色-粒子背景</_lynTdVtl>
<_lynTdVtl _tHTUmKrx="theme-dark-bing">暗色-必应壁纸</_lynTdVtl>
<_lynTdVtl _tHTUmKrx="theme-light">亮色-简约</_lynTdVtl>
<_lynTdVtl _tHTUmKrx="theme-light-bing">亮色-必应壁纸</_lynTdVtl>
<_lynTdVtl _tHTUmKrx="theme-marble-light">简约大理石-亮色</_lynTdVtl>
<_lynTdVtl _tHTUmKrx="theme-matrix">矩阵-代码雨</_lynTdVtl>
</_TFTApgUo>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _eEGkjqFr="_OVBQuCzh" _ZFMylRPE="primaryColorInput">
<span _HSEtCKXW="_IVlERQxT: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _eEGkjqFr="_OVBQuCzh" _ZFMylRPE="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _HSEtCKXW="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_dHJDuMPe-_OVBQuCzh-grid"><input _eEGkjqFr="_OVBQuCzh" _ZFMylRPE="colorInput_title"><textarea _ZFMylRPE="textInput_title" _UojSvSLG="1" _sKCgjtAn="页面主标题"></textarea></div>
<div class="_dHJDuMPe-_OVBQuCzh-grid"><input _eEGkjqFr="_OVBQuCzh" _ZFMylRPE="colorInput_loginButton"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="textInput_loginButton" _sKCgjtAn="登录按钮文本"></div>
<div class="_dHJDuMPe-_OVBQuCzh-grid"><input _eEGkjqFr="_OVBQuCzh" _ZFMylRPE="colorInput_appDownloadTitle"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="textInput_appDownloadTitle" _sKCgjtAn="APP下载标题"></div>
<div class="_dHJDuMPe-_OVBQuCzh-grid"><input _eEGkjqFr="_OVBQuCzh" _ZFMylRPE="colorInput_liveTitle"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="textInput_liveTitle" _sKCgjtAn="本次结果标题"></div>
<div class="_dHJDuMPe-_OVBQuCzh-grid"><input _eEGkjqFr="_OVBQuCzh" _ZFMylRPE="colorInput_cachedTitle"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="textInput_cachedTitle" _sKCgjtAn="上次结果标题"></div>
<div class="_dHJDuMPe-_OVBQuCzh-grid"><input _eEGkjqFr="_OVBQuCzh" _ZFMylRPE="colorInput_tableHeader"><input _eEGkjqFr="_dHJDuMPe" _tHTUmKrx="表格头部文本颜色" readonly _HSEtCKXW="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _HSEtCKXW="align-self: start;"><label>公告栏设置</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _ZFMylRPE="announcementText" _sKCgjtAn="在此输入公告内容" _UojSvSLG="3"></textarea>
<div _HSEtCKXW="display: flex; justify-_hGGjqbIj: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _HSEtCKXW="display: flex; align-items: center; gap: 5px;"><input _eEGkjqFr="checkbox" _ZFMylRPE="enableMarquee"> 顶部走马灯</label>
<label _HSEtCKXW="display: flex; align-items: center; gap: 5px;"><input _eEGkjqFr="checkbox" _ZFMylRPE="enablePopup"> 右上角弹窗</label>
<div _ZFMylRPE="popupDurationContainer" _HSEtCKXW="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _eEGkjqFr="number" _ZFMylRPE="popupDuration" _HSEtCKXW="_IVlERQxT: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _ZFMylRPE="_ksIXgZmy-_NgOoawbj" class="tab-_hGGjqbIj">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="converterServiceUrlInput" _sKCgjtAn="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _eEGkjqFr="number" _ZFMylRPE="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _HSEtCKXW="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _ZFMylRPE="subscriptionIdCharset" _UojSvSLG="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-_wwyMCJNg" _VEFfqbuc-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="justify-_hGGjqbIj: flex-start;"><input _eEGkjqFr="checkbox" _ZFMylRPE="enableItemLinkCheckbox"></div>
</div>
<div _ZFMylRPE="itemLinkConfigGroup" _HSEtCKXW="display:none; margin-_QXFxTdzm: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _HSEtCKXW="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="定义分享链接格式。可用占位符: {_kePIaBxe}, {_tQnEOFqY}, {_nzFYtWSh}, {rank}, {_lCyqZFJg}, {_CBufPriW}, {_baJNbFBi}, {_uKhMcTyS}, {_MsJZEhdg}。">?</span></div>
<div class="form-grid-control"><textarea _ZFMylRPE="itemLinkTemplateInput" _UojSvSLG="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_TFTApgUo _ZFMylRPE="parameterSelectionMode"></_TFTApgUo></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _ZFMylRPE="parameter-sets-_ergxyJcb"></div><button _eEGkjqFr="button" _ZFMylRPE="add-parameter-_jNwuomlq-btn" class="btn btn-outline" _HSEtCKXW="margin-_QXFxTdzm: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _HSEtCKXW="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _ZFMylRPE="custom-fields-_ergxyJcb" _HSEtCKXW="_IVlERQxT: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _HSEtCKXW="justify-_hGGjqbIj: flex-start;"><button _eEGkjqFr="button" _ZFMylRPE="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _ZFMylRPE="fine-grained-_NgOoawbj" class="tab-_hGGjqbIj">
<div class="form-grid-label" _HSEtCKXW="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _HSEtCKXW="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_hGGjqbIj: flex-start;">
<label><input _eEGkjqFr="checkbox" _ZFMylRPE="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _eEGkjqFr="checkbox" _ZFMylRPE="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _ZFMylRPE="fine-grained-sources-_ergxyJcb"></div><button _eEGkjqFr="button" _ZFMylRPE="add-fine-grained-_aaDiGKDE-btn" class="btn btn-outline" _HSEtCKXW="margin-_QXFxTdzm: 10px;">添加地区</button></div>
</div>
<div _ZFMylRPE="advanced-_NgOoawbj" class="tab-_hGGjqbIj">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _eEGkjqFr="checkbox" _ZFMylRPE="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _ZFMylRPE="resolvedDomainsGroup" _HSEtCKXW="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _ZFMylRPE="resolvedDomainsInput" _sKCgjtAn="留空则使用内置默认域名" _UojSvSLG="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-_wwyMCJNg" _VEFfqbuc-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _eEGkjqFr="checkbox" _ZFMylRPE="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _ZFMylRPE="customNodesGroup" _HSEtCKXW="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _ZFMylRPE="customNodesInput" _sKCgjtAn="一行一个地址,支持域名、IPv4、IPv6。" _UojSvSLG="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-_wwyMCJNg" _VEFfqbuc-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _eEGkjqFr="number" _ZFMylRPE="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _eEGkjqFr="number" _ZFMylRPE="topNInput"></div>
<div class="form-grid-label" _HSEtCKXW="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="display: none;"><input _eEGkjqFr="number" _ZFMylRPE="latencyRangeMinInput" _sKCgjtAn="最小"><span>-</span><input _eEGkjqFr="number" _ZFMylRPE="latencyRangeMaxInput" _sKCgjtAn="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="justify-_hGGjqbIj: flex-start;"><input _eEGkjqFr="checkbox" _ZFMylRPE="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-_wwyMCJNg" _VEFfqbuc-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _eEGkjqFr="number" _ZFMylRPE="geoLocationRetriesInput" _HSEtCKXW="_IVlERQxT: 80px;"> <span>次</span>
<div _HSEtCKXW="display: flex; align-items: center; gap: 5px; margin-_tbGHJIRk: 20px;">
<input _eEGkjqFr="checkbox" _ZFMylRPE="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-_wwyMCJNg" _VEFfqbuc-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_baJNbFBi:_tQnEOFqY' 或 '_baJNbFBi'。">?</span></div>
<div class="form-grid-control"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="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-_wwyMCJNg" _VEFfqbuc-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="justify-_hGGjqbIj: flex-start;"><input _eEGkjqFr="checkbox" _ZFMylRPE="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _ZFMylRPE="websocketStreamerGroup" _HSEtCKXW="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="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-_wwyMCJNg" _VEFfqbuc-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="justify-_hGGjqbIj: flex-start;"><input _eEGkjqFr="checkbox" _ZFMylRPE="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="启用 /_kePIaBxe 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="justify-_hGGjqbIj: flex-start;"><input _eEGkjqFr="checkbox" _ZFMylRPE="enableApiCheckbox"></div>
<div class="form-grid-control-full" _ZFMylRPE="apiConfigGroup" _HSEtCKXW="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="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-_wwyMCJNg" _VEFfqbuc-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="justify-_hGGjqbIj: flex-start;"><input _eEGkjqFr="checkbox" _ZFMylRPE="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _ZFMylRPE="customSubPathGroup" _HSEtCKXW="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="customSubPathInput" _sKCgjtAn="例如: 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-_wwyMCJNg" _VEFfqbuc-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="justify-_hGGjqbIj: flex-start;"><input _eEGkjqFr="checkbox" _ZFMylRPE="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _ZFMylRPE="visitorPasswordGroup" _HSEtCKXW="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _HSEtCKXW="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_wwyMCJNg" _VEFfqbuc-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _HSEtCKXW="flex-direction: column; align-items: stretch; gap: 8px;"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="botTokenInput" _sKCgjtAn="Telegram Bot Token"><input _eEGkjqFr="_dHJDuMPe" _ZFMylRPE="chatIdInput" _sKCgjtAn="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _HSEtCKXW="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _HSEtCKXW="flex-direction: column; align-items: stretch; gap: 8px;"><input _eEGkjqFr="_ZQcpOmgH" _ZFMylRPE="oldPasswordInput" _sKCgjtAn="旧密码"><input _eEGkjqFr="_ZQcpOmgH" _ZFMylRPE="newPasswordInput" _sKCgjtAn="新密码 (至少6位)"><button _ZFMylRPE="changePasswordBtn" class="btn" _HSEtCKXW="align-self: flex-start; margin-_tbGHJIRk: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _ZFMylRPE="closeModalBtn" class="btn btn-outline">关闭</button><button _ZFMylRPE="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _ZFMylRPE="_rjxiCLbL">
<div class="_YewpUjzc-modal-_hGGjqbIj">
<div class="_YewpUjzc-modal-_tRTIzUXv"><h3 _ZFMylRPE="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_YewpUjzc-modal-_RhJzDlxQ" _ZFMylRPE="appModalBody"></div>
</div>
</div>
<div _ZFMylRPE="_omUmroNk">
<div class="modal-_hGGjqbIj">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _VEFfqbuc-sub-_eEGkjqFr="coreEngine">Xray</button><button class="btn _zJywLBNl-btn" _VEFfqbuc-sub-_eEGkjqFr="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _VEFfqbuc-sub-_eEGkjqFr="coreProfile">Sing-Box</button><button class="btn _zJywLBNl-btn" _VEFfqbuc-sub-_eEGkjqFr="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _VEFfqbuc-sub-_eEGkjqFr="configProfile">Clash</button><button class="btn _zJywLBNl-btn" _VEFfqbuc-sub-_eEGkjqFr="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _VEFfqbuc-sub-_eEGkjqFr="policyProfile">Surge</button><button class="btn _zJywLBNl-btn" _VEFfqbuc-sub-_eEGkjqFr="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _HSEtCKXW="justify-_hGGjqbIj: center;"><button class="btn btn-outline" _ZFMylRPE="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _ZFMylRPE="_RyBBJyhR">
<div class="modal-_hGGjqbIj">
<img _ZFMylRPE="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _rjKvxlhT = {
isValid: (_kePIaBxe) => _rjKvxlhT.isIPv4(_kePIaBxe) || _rjKvxlhT.isIPv6(_kePIaBxe),
isIPv4: (_kePIaBxe) => {
if (typeof _kePIaBxe !== 'string') return false;
const _EWHTfFBN = _kePIaBxe.split('.');
if (_EWHTfFBN._BKxGrdWY !== 4) return false;
return _EWHTfFBN.every(_qsAVjdXs => {
const _VHUehYtC = parseInt(_qsAVjdXs, 10);
return !isNaN(_VHUehYtC) && _VHUehYtC >= 0 && _VHUehYtC <= 255 && String(_VHUehYtC) === _qsAVjdXs;
});
},
isIPv6: (_kePIaBxe) => {
if (typeof _kePIaBxe !== '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]))$/_uUkhUKtY.test(_kePIaBxe);
},
toLong4: (_kePIaBxe) => _kePIaBxe.split('.').reduce((acc, octet, _uUkhUKtY) => acc + (parseInt(octet) << (8*(3-_uUkhUKtY))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_kePIaBxe) => {
try {
const _KiTxMUaz = _kePIaBxe.split('/')[0];
const _EWHTfFBN = _KiTxMUaz.split('::');
if (_EWHTfFBN._BKxGrdWY > 2) return 0n;
let _FmqzKrhy = [];
if (_EWHTfFBN[0]) {
_FmqzKrhy = _EWHTfFBN[0].split(':');
}
let _FUIwmogZ = [];
if (_EWHTfFBN._BKxGrdWY > 1 && _EWHTfFBN[1]) {
_FUIwmogZ = _EWHTfFBN[1].split(':');
}
if (_FmqzKrhy._BKxGrdWY + _FUIwmogZ._BKxGrdWY > 8) return 0n;
const _iPvZtlnY = 8 - (_FmqzKrhy._BKxGrdWY + _FUIwmogZ._BKxGrdWY);
const _PCbtLqUZ = [
..._FmqzKrhy,
...Array(_iPvZtlnY).fill('0'),
..._FUIwmogZ
].map(_qsAVjdXs => _qsAVjdXs || '0');
while(_PCbtLqUZ._BKxGrdWY < 8) {
_PCbtLqUZ.push('0');
}
let _pHqeCYpL = 0n;
for (const _qsAVjdXs of _PCbtLqUZ) {
if (_qsAVjdXs._BKxGrdWY > 4) return 0n;
const _tHTUmKrx = BigInt('0x' + _qsAVjdXs);
_pHqeCYpL = (_pHqeCYpL << 16n) | _tHTUmKrx;
}
return _pHqeCYpL;
} catch(_xCydVfWL) {
return 0n;
}
},
fromBigInt6: (_pHqeCYpL) => {
if (typeof _pHqeCYpL !== '_pHqeCYpL' || _pHqeCYpL < 0n) return null;
const _EWHTfFBN = [];
for (let _uUkhUKtY = 0; _uUkhUKtY < 8; _uUkhUKtY++) {
_EWHTfFBN.unshift((_pHqeCYpL & 0xFFFFn).toString(16));
_pHqeCYpL >>= 16n;
}
let _vQvbvhoT = { start: -1, _ceypxXIY: 0 };
let _JhnfPVoH = { start: -1, _ceypxXIY: 0 };
for (let _uUkhUKtY = 0; _uUkhUKtY < 8; _uUkhUKtY++) {
if (_EWHTfFBN[_uUkhUKtY] === '0') {
if (_JhnfPVoH.start === -1) _JhnfPVoH.start = _uUkhUKtY;
_JhnfPVoH._ceypxXIY++;
} else {
if (_JhnfPVoH._ceypxXIY > _vQvbvhoT._ceypxXIY) _vQvbvhoT = { ..._JhnfPVoH };
_JhnfPVoH = { start: -1, _ceypxXIY: 0 };
}
}
if (_JhnfPVoH._ceypxXIY > _vQvbvhoT._ceypxXIY) _vQvbvhoT = { ..._JhnfPVoH };
if (_vQvbvhoT._ceypxXIY > 1) {
_EWHTfFBN.splice(_vQvbvhoT.start, _vQvbvhoT._ceypxXIY, '');
if (_vQvbvhoT.start === 0) _EWHTfFBN.unshift('');
if (_vQvbvhoT.start + _vQvbvhoT._ceypxXIY === 8) _EWHTfFBN.push('');
}
return _EWHTfFBN.join(':');
},
cidrToRange: (cidr, _dZDkQEsa = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _fncZNONp = parseInt(bitsStr, 10);
const _KZTmtaHQ = new Set();
if (_rjKvxlhT.isIPv4(range)) {
if (isNaN(_fncZNONp) || _fncZNONp < 8 || _fncZNONp > 32) return [];
if (_fncZNONp === 32) return [range];
const _IlaZoEOW = _rjKvxlhT.toLong4(range);
const _VkxPUUXD = (0xFFFFFFFF << (32 - _fncZNONp)) >>> 0;
const _FbTZLPAm = _IlaZoEOW & _VkxPUUXD;
const _rUGGIBuZ = 1 << (32 - _fncZNONp);
if (_rUGGIBuZ <= 2) return [];
const _yaoVrUKF = Math.min(_dZDkQEsa, _rUGGIBuZ - 2);
let _KWEjNvjh = 0;
while (_KZTmtaHQ.size < _yaoVrUKF && _KWEjNvjh < _yaoVrUKF * 5) {
const _oKelShli = Math.floor(Math.random() * (_rUGGIBuZ - 2)) + 1;
_KZTmtaHQ.add(_rjKvxlhT.fromLong4((_FbTZLPAm + _oKelShli) >>> 0));
_KWEjNvjh++;
}
return Array.from(_KZTmtaHQ);
} else if (_rjKvxlhT.isIPv6(range)) {
if (isNaN(_fncZNONp) || _fncZNONp < 16 || _fncZNONp > 128) return [];
if (_fncZNONp === 128) return [range];
const _SbtKWEUx = _rjKvxlhT.toBigInt6(range);
const _VkxPUUXD = (2n ** BigInt(128 - _fncZNONp) - 1n);
const _FbTZLPAm = _SbtKWEUx & ~_VkxPUUXD;
const _PfgEBwKz = 2n ** BigInt(128 - _fncZNONp);
if (_PfgEBwKz <= 2n) return [];
let _KWEjNvjh = 0;
while (_KZTmtaHQ.size < _dZDkQEsa && _KWEjNvjh < _dZDkQEsa * 5) {
const _xLDwXaoQ = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_xLDwXaoQ);
let _rHOGMVlu = 0n;
for (const _xPtawMgo of _xLDwXaoQ) {
_rHOGMVlu = (_rHOGMVlu << 8n) | BigInt(_xPtawMgo);
}
const _oKelShli = _rHOGMVlu % (_PfgEBwKz - 2n) + 1n;
_KZTmtaHQ.add(_rjKvxlhT.fromBigInt6(_FbTZLPAm + _oKelShli));
_KWEjNvjh++;
}
return Array.from(_KZTmtaHQ);
}
return [];
} catch(_xCydVfWL) {
console.error(`CIDR to range failed for ${cidr}:`, _xCydVfWL);
return [];
}
}
};
function _AzSdLfhV(_jFlugCfy, _mJMqBNIS) {
const _PCCyOjUv = {};
const _SFQevpug = Object._SFQevpug(_mJMqBNIS);
const _EWHTfFBN = _SFQevpug.map(_sWpWHESH => {
const _QhjFOYVP = _jFlugCfy * (_mJMqBNIS[_sWpWHESH] / 100);
return { _sWpWHESH, _dZDkQEsa: Math.floor(_QhjFOYVP), remainder: _QhjFOYVP - Math.floor(_QhjFOYVP) };
});
let _fAbtPRDm = _EWHTfFBN.reduce((acc, _qsAVjdXs) => acc + _qsAVjdXs._dZDkQEsa, 0);
_EWHTfFBN.sort((a, b) => b.remainder - a.remainder);
let _bdXlMgjY = _jFlugCfy - _fAbtPRDm;
for (let _uUkhUKtY = 0; _uUkhUKtY < _bdXlMgjY; _uUkhUKtY++) {
_EWHTfFBN[_uUkhUKtY % _EWHTfFBN._BKxGrdWY]._dZDkQEsa++;
}
for (const _qsAVjdXs of _EWHTfFBN) {
_PCCyOjUv[_qsAVjdXs._sWpWHESH] = _qsAVjdXs._dZDkQEsa;
}
return _PCCyOjUv;
}
const _lrzhTNQa = __PAGE_DATA_JSON__;
const _kpnYRDyR = _lrzhTNQa._iBFSEHoA;
const _TTtRzdJX = _lrzhTNQa.status;
const _usoBhNQf = __ALL_CF_CIDR_LIST_JSON__;
const _inExDkYM = __BALANCED_CF_CIDR_LIST_JSON__;
const _oTyYGmGR = __DEFAULT_DOMAINS_LIST_JSON__;
const _PiCtQLDu = __COUNTRY_MAP_JSON__;
const _zSzTgHde = _PiCtQLDu;
const _xkSfVqqr = 2500;
const _zqMHlRPg = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _yOScQApX = document.getElementById('_yOScQApX');
const _wVdlUAqb = document.getElementById('_wVdlUAqb');
const _hwgRQlNu = document.getElementById('status');
const _niBQTzOv = document.getElementById('_niBQTzOv');
const _aAMBivRf = document.getElementById('resultsTable').querySelector('tbody');
const _BYlKDwEl = document.getElementById('_BYlKDwEl');
const _WzHiUxqr = document.getElementById('cachedResultsTable').querySelector('tbody');
const _hnMrqQTH = document.getElementById('notificationTooltip');
const _FfTymvBS = document.getElementById('_FfTymvBS');
const _fXAGgIqJ = document.getElementById('_fXAGgIqJ');
const _rjxiCLbL = document.getElementById('_rjxiCLbL');
const _omUmroNk = document.getElementById('_omUmroNk');
const _RyBBJyhR = document.getElementById('_RyBBJyhR');
const _krKyETsN = document.getElementById('_krKyETsN');
const _OPCJUbgM = document.getElementById('_OPCJUbgM');
let _OZVOAKwY = null;
let _IgCpwkBo = null;
let _eBdQZwyY = [];
let _PnyIyKsJ = false;
let _aVgTsyir = null;
function _sNRqpUaq(_hpTRzKPe, _DMUqczhD) {
const _IuEDKggu=parseInt(_hpTRzKPe.slice(1),16),t=_DMUqczhD<0?0:255,p=_DMUqczhD<0?_DMUqczhD*-1:_DMUqczhD,R=_IuEDKggu>>16,G=_IuEDKggu>>8&0x00FF,B=_IuEDKggu&0x0000FF;
const _qEiPjXgZ = Math.round((t-R)*p)+R;
const _PCSnngAA = Math.round((t-G)*p)+G;
const _tUZGJXLO = Math.round((t-B)*p)+B;
return `rgb(${_qEiPjXgZ.toString()}, ${_PCSnngAA.toString()}, ${_tUZGJXLO.toString()})`;
}
function _pSvocQCu(_NgOoawbj) {
const _QXWUGIbr = _fDimrCeK(_NgOoawbj.primaryColor);
if(_QXWUGIbr) {
document.documentElement._HSEtCKXW.setProperty('--primary-_OVBQuCzh-rgb', `${_QXWUGIbr.r},${_QXWUGIbr.g},${_QXWUGIbr.b}`);
}
document.documentElement._HSEtCKXW.setProperty('--primary-_OVBQuCzh', _NgOoawbj.primaryColor);
document.documentElement._HSEtCKXW.setProperty('--primary-hover', _sNRqpUaq(_NgOoawbj.primaryColor, -0.1));
document.documentElement._HSEtCKXW.setProperty('--primary-gradient-start', _sNRqpUaq(_NgOoawbj.primaryColor, 0.1));
document.documentElement._HSEtCKXW.setProperty('--primary-gradient-end', _sNRqpUaq(_NgOoawbj.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _NgOoawbj.texts.title;
document.title = _NgOoawbj.texts.title;
_FfTymvBS.innerText = _OZVOAKwY ? _NgOoawbj.texts.loginButtonSuccess : _NgOoawbj.texts.loginButton;
_FfTymvBS._HSEtCKXW._OVBQuCzh = _NgOoawbj.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _NgOoawbj.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _NgOoawbj.texts.liveTitle;
document.getElementById('liveTitleEl')._HSEtCKXW._OVBQuCzh = _NgOoawbj.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _NgOoawbj.texts.cachedTitle;
document.getElementById('cachedTitleEl')._HSEtCKXW._OVBQuCzh = _NgOoawbj.colors.cachedTitle;
const _VTWxvQwV = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_VTWxvQwV.forEach((_ZFMylRPE, _tyznJeYN) => {
const _lqUsytOK = document.getElementById(_ZFMylRPE);
if (_lqUsytOK) _lqUsytOK.innerText = _NgOoawbj.texts[`tableHeader${_tyznJeYN + 1}`] || '';
});
const _lLiFJkWx = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_lLiFJkWx.forEach((_ZFMylRPE, _tyznJeYN) => {
const _lqUsytOK = document.getElementById(_ZFMylRPE);
if (_lqUsytOK) _lqUsytOK.innerText = _kpnYRDyR.texts[`tableHeader${_tyznJeYN + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._HSEtCKXW._OVBQuCzh = _NgOoawbj.colors.tableHeader);
document._RhJzDlxQ.className = '';
document._RhJzDlxQ.classList.add(_NgOoawbj.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_NgOoawbj.theme)) {
document._RhJzDlxQ.classList.add('glassy-components');
}
document._RhJzDlxQ._HSEtCKXW.backgroundImage = '';
_dQfIkFBo();
if (_NgOoawbj.theme.includes('particles') || _NgOoawbj.theme.includes('glass')) {
_AYdiqFyg(_NgOoawbj.particleColor);
} else if (_NgOoawbj.theme.includes('bing')) {
document._RhJzDlxQ._HSEtCKXW.backgroundImage = '_tHpQGhxp(/bing-wallpaper)';
}
}
function _oujGhzLL() {
_OZVOAKwY = null;
if(_IgCpwkBo) clearTimeout(_IgCpwkBo);
_pSvocQCu(_kpnYRDyR);
_yyqzOdZy("登录已超时,请重新登录。", "warning");
}
async function _nJXTeITS() {
if (_OZVOAKwY) {
_YGTZmqsX();
return;
}
const _xCHYmleW = prompt('请输入管理员密码:');
if (!_xCHYmleW) return;
try {
const _KUgOgstY = await fetch('/api/verify-_ZQcpOmgH', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify({ _ZQcpOmgH: _xCHYmleW })
});
const _XoMuNRlG = await _KUgOgstY.json();
if (_XoMuNRlG.success) {
_OZVOAKwY = _xCHYmleW;
_yyqzOdZy("登录成功!有效期5分钟。", "success");
if (_IgCpwkBo) clearTimeout(_IgCpwkBo);
_IgCpwkBo = setTimeout(_oujGhzLL, 5 * 60 * 1000);
_pSvocQCu(_kpnYRDyR);
_YGTZmqsX();
} else {
throw new Error(_XoMuNRlG._MhwlvCzj || '密码验证失败');
}
} catch (_xCydVfWL) {
_yyqzOdZy(`登录失败: ${_xCydVfWL._MhwlvCzj}`, "error");
}
}
function _lcaddvUZ() {
if (!_TTtRzdJX._TbaYvcdF) {
_krKyETsN._HSEtCKXW.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _ZQcpOmgH = document.getElementById('initialPassword')._tHTUmKrx;
const _RCWrGUMr = document.getElementById('confirmPassword')._tHTUmKrx;
if (_ZQcpOmgH !== _RCWrGUMr) {
_yyqzOdZy("两次输入的密码不一致!", "error");
return;
}
if (_ZQcpOmgH._BKxGrdWY < 6) {
_yyqzOdZy("密码长度不能少于6位!", "error");
return;
}
try {
const _KUgOgstY = await fetch('/api/_jNwuomlq-_ZQcpOmgH', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify({ _ZQcpOmgH })
});
const _XoMuNRlG = await _KUgOgstY.json();
if (_XoMuNRlG.success) {
_yyqzOdZy(_XoMuNRlG._MhwlvCzj, "success");
setTimeout(() => _lCyqZFJg.reload(), 1500);
} else {
throw new Error(_XoMuNRlG._MhwlvCzj);
}
} catch(_xCydVfWL) {
_yyqzOdZy(`设置密码失败: ${_xCydVfWL._MhwlvCzj}`, "error");
}
});
return;
}
_FfTymvBS.addEventListener('click', _nJXTeITS);
document.getElementById('closeModalBtn').addEventListener('click', () => { _fXAGgIqJ._HSEtCKXW.display = 'none'; });
_fXAGgIqJ.addEventListener('click', (_xCydVfWL) => { if (_xCydVfWL.target === _fXAGgIqJ) _fXAGgIqJ._HSEtCKXW.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_ergxyJcb .fine-grained-_PxfEhgmV-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-_ergxyJcb .fine-grained-_PxfEhgmV-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_OZVOAKwY) {
_yyqzOdZy("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _saILdGBL = [];
document.querySelectorAll('#custom-fields-_ergxyJcb .custom-field-_rKRydXJm').forEach(_rKRydXJm => {
const _nzFYtWSh = _rKRydXJm.querySelector('.custom-field-_nzFYtWSh')._tHTUmKrx.trim();
const _tHTUmKrx = _rKRydXJm.querySelector('.custom-field-_tHTUmKrx')._tHTUmKrx.trim();
if (_nzFYtWSh) _saILdGBL.push({ _nzFYtWSh, _tHTUmKrx });
});
const _keKQbOmm = [];
document.querySelectorAll('#parameter-sets-_ergxyJcb .parameter-_jNwuomlq-_rKRydXJm').forEach(_rKRydXJm => {
const _nzFYtWSh = _rKRydXJm.querySelector('.param-_jNwuomlq-_nzFYtWSh')._tHTUmKrx.trim();
const _baJNbFBi = _rKRydXJm.querySelector('.param-_jNwuomlq-_baJNbFBi')._tHTUmKrx.trim();
const _uKhMcTyS = _rKRydXJm.querySelector('.param-_jNwuomlq-_uKhMcTyS')._tHTUmKrx.trim();
const _MsJZEhdg = _rKRydXJm.querySelector('.param-_jNwuomlq-_MsJZEhdg')._tHTUmKrx.trim();
if(_nzFYtWSh) _keKQbOmm.push({ _nzFYtWSh, _baJNbFBi, '_uKhMcTyS': _uKhMcTyS, _MsJZEhdg });
});
const _gwkReUVa = [];
document.querySelectorAll('#fine-grained-sources-_ergxyJcb .fine-grained-_aaDiGKDE-_rKRydXJm').forEach(_rKRydXJm => {
const _lCyqZFJg = _rKRydXJm.querySelector('.fine-grained-_lCyqZFJg')._tHTUmKrx.trim();
const _KZTmtaHQ = _rKRydXJm.querySelector('.fine-grained-_KZTmtaHQ')._tHTUmKrx.trim();
const _PxfEhgmV = _rKRydXJm.querySelector('.fine-grained-_PxfEhgmV-cb').checked;
const _qwdDfoqC = parseInt(_rKRydXJm.querySelector('.fine-grained-_qwdDfoqC')._tHTUmKrx, 10) || 0;
const _jsfMiQkO = _rKRydXJm.querySelector('.use-_nzFYtWSh-as-_lCyqZFJg-cb').checked;
if (_lCyqZFJg && _KZTmtaHQ) {
_gwkReUVa.push({ _lCyqZFJg, _KZTmtaHQ, _PxfEhgmV, _qwdDfoqC, _jsfMiQkO });
}
});
let _EEWLNbQU = parseInt(document.getElementById('subscriptionIdLength')._tHTUmKrx, 10);
if (isNaN(_EEWLNbQU) || _EEWLNbQU < 2) _EEWLNbQU = 2;
if (_EEWLNbQU > 128) _EEWLNbQU = 128;
const _vTWjqZZp = {
theme: document.getElementById('themeSelect')._tHTUmKrx,
primaryColor: document.getElementById('primaryColorInput')._tHTUmKrx,
particleColor: document.getElementById('particleColorInput')._tHTUmKrx,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._tHTUmKrx,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._tHTUmKrx, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._tHTUmKrx, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._tHTUmKrx, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._tHTUmKrx, 10) || 0,
_egnAfGgU: document.getElementById('converterServiceUrlInput')._tHTUmKrx.trim(),
subscriptionId: {
_BKxGrdWY: _EEWLNbQU,
_bDmbqFUt: document.getElementById('subscriptionIdCharset')._tHTUmKrx.trim()
},
api: {
_PxfEhgmV: document.getElementById('enableApiCheckbox').checked,
_MhwlvCzj: document.getElementById('apiMessageInput')._tHTUmKrx || '维护中...',
},
ispFilter: {
_PxfEhgmV: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._tHTUmKrx, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_PxfEhgmV: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_PxfEhgmV: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_tHpQGhxp: document.getElementById('websocketStreamerUrlInput')._tHTUmKrx.trim()
},
visitorPassword: {
_PxfEhgmV: document.getElementById('enableVisitorPasswordCheckbox').checked,
_ZQcpOmgH: document.getElementById('visitorPasswordInput')._tHTUmKrx.trim()
},
customSubPath: {
_PxfEhgmV: document.getElementById('enableCustomSubPathCheckbox').checked,
_MsJZEhdg: document.getElementById('customSubPathInput')._tHTUmKrx.trim()
},
itemLink: {
_PxfEhgmV: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._tHTUmKrx,
selectionMode: document.getElementById('parameterSelectionMode')._tHTUmKrx,
_keKQbOmm: _keKQbOmm,
_saILdGBL: _saILdGBL,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._tHTUmKrx.trim(),
},
announcement: {
popup: {
_PxfEhgmV: document.getElementById('enablePopup').checked,
_dHJDuMPe: document.getElementById('announcementText')._tHTUmKrx,
_OQgrUVdh: parseInt(document.getElementById('popupDuration')._tHTUmKrx, 10) || 5
},
marquee: {
_PxfEhgmV: document.getElementById('enableMarquee').checked,
_dHJDuMPe: document.getElementById('announcementText')._tHTUmKrx
}
},
fineGrained: {
_PxfEhgmV: true,
sources: _gwkReUVa
},
customNodes: {
_PxfEhgmV: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._tHTUmKrx
},
texts: {
title: document.getElementById('textInput_title')._tHTUmKrx,
loginButton: document.getElementById('textInput_loginButton')._tHTUmKrx,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._tHTUmKrx,
liveTitle: document.getElementById('textInput_liveTitle')._tHTUmKrx,
cachedTitle: document.getElementById('textInput_cachedTitle')._tHTUmKrx,
},
colors: {
title: document.getElementById('colorInput_title')._tHTUmKrx,
loginButton: document.getElementById('colorInput_loginButton')._tHTUmKrx,
liveTitle: document.getElementById('colorInput_liveTitle')._tHTUmKrx,
cachedTitle: document.getElementById('colorInput_cachedTitle')._tHTUmKrx,
tableHeader: document.getElementById('colorInput_tableHeader')._tHTUmKrx,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._tHTUmKrx.trim(),
chat_id: document.getElementById('chatIdInput')._tHTUmKrx.trim(),
},
};
try {
const _KUgOgstY = await fetch('/api/_iBFSEHoA', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify({ _iBFSEHoA: _vTWjqZZp, adminPassword: _OZVOAKwY })
});
const _XoMuNRlG = await _KUgOgstY.json();
if (_KUgOgstY.ok && _XoMuNRlG.success) {
_yyqzOdZy("配置已保存,正在刷新...", "success");
setTimeout(() => _lCyqZFJg.reload(), 1500);
} else {
throw new Error(_XoMuNRlG._MhwlvCzj || '未知错误');
}
} catch (_xCydVfWL) {
_yyqzOdZy(`操作失败: ${_xCydVfWL._MhwlvCzj}`, "error");
if (String(_xCydVfWL._MhwlvCzj).includes("密码错误")) {
_oujGhzLL();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _cogUkHti = document.getElementById('oldPasswordInput')._tHTUmKrx;
const _RogxEllm = document.getElementById('newPasswordInput')._tHTUmKrx;
if (!_cogUkHti || !_RogxEllm) {
_yyqzOdZy("新旧密码均不能为空!", "error");
return;
}
try {
const _KUgOgstY = await fetch('/api/change-_ZQcpOmgH', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify({ _cogUkHti, _RogxEllm })
});
const _XoMuNRlG = await _KUgOgstY.json();
if (_XoMuNRlG.success) {
_yyqzOdZy(_XoMuNRlG._MhwlvCzj, "success");
document.getElementById('oldPasswordInput')._tHTUmKrx = '';
document.getElementById('newPasswordInput')._tHTUmKrx = '';
_OZVOAKwY = _RogxEllm;
} else {
throw new Error(_XoMuNRlG._MhwlvCzj);
}
} catch(_xCydVfWL) {
_yyqzOdZy(`修改密码失败: ${_xCydVfWL._MhwlvCzj}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_xCydVfWL) => {
document.getElementById('resolvedDomainsGroup')._HSEtCKXW.display = _xCydVfWL.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_xCydVfWL) => {
document.getElementById('customNodesGroup')._HSEtCKXW.display = _xCydVfWL.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_xCydVfWL) => {
document.getElementById('apiConfigGroup')._HSEtCKXW.display = _xCydVfWL.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_xCydVfWL) => {
document.getElementById('itemLinkConfigGroup')._HSEtCKXW.display = _xCydVfWL.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_xCydVfWL) => {
document.getElementById('websocketStreamerGroup')._HSEtCKXW.display = _xCydVfWL.target.checked ? 'block' : 'none';
const _YOaOGkBe = document.querySelector('#parameter-sets-_ergxyJcb .param-_jNwuomlq-_MsJZEhdg');
if (_YOaOGkBe) {
if (_xCydVfWL.target.checked) {
_YOaOGkBe._tHTUmKrx = '/snippets?_kePIaBxe=endpointAddress:_tQnEOFqY(443)&nat64=6to4';
} else {
_YOaOGkBe._tHTUmKrx = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_REdRrdOJ('', '');
});
document.getElementById('add-parameter-_jNwuomlq-btn').addEventListener('click', () => {
const _dZDkQEsa = document.querySelectorAll('.parameter-_jNwuomlq-_rKRydXJm')._BKxGrdWY + 1;
_KCyOikEz({_nzFYtWSh: `配置${_dZDkQEsa}`, _baJNbFBi: '', _uKhMcTyS: '', _MsJZEhdg: ''});
_nnhkBqlk();
});
document.getElementById('add-fine-grained-_aaDiGKDE-btn').addEventListener('click', () => {
_huGdSoDt({ _lCyqZFJg: '', _KZTmtaHQ: '', _PxfEhgmV: true, _qwdDfoqC: 50, _jsfMiQkO: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_xCydVfWL) => {
document.getElementById('visitorPasswordGroup')._HSEtCKXW.display = _xCydVfWL.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_xCydVfWL) => {
document.getElementById('customSubPathGroup')._HSEtCKXW.display = _xCydVfWL.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_xCydVfWL) => {
document.getElementById('popupDurationContainer')._HSEtCKXW.display = _xCydVfWL.target.checked ? 'flex' : 'none';
});
}
function _REdRrdOJ(_nzFYtWSh, _tHTUmKrx) {
const _ergxyJcb = document.getElementById('custom-fields-_ergxyJcb');
const _IeDLAZzb = document.createElement('div');
_IeDLAZzb.className = 'form-grid custom-field-_rKRydXJm';
_IeDLAZzb._HSEtCKXW = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_IeDLAZzb.innerHTML = `
<input _eEGkjqFr="_dHJDuMPe" class="custom-field-_nzFYtWSh" _sKCgjtAn="占位符名称" _tHTUmKrx="${_nzFYtWSh}">
<input _eEGkjqFr="_dHJDuMPe" class="custom-field-_tHTUmKrx" _sKCgjtAn="值" _tHTUmKrx="${_tHTUmKrx}">
<button _eEGkjqFr="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_ergxyJcb.appendChild(_IeDLAZzb);
}
function _KCyOikEz(_jNwuomlq) {
const _ergxyJcb = document.getElementById('parameter-sets-_ergxyJcb');
const _IeDLAZzb = document.createElement('div');
_IeDLAZzb.className = 'parameter-_jNwuomlq-_rKRydXJm';
_IeDLAZzb.innerHTML = `
<div class="parameter-_jNwuomlq-_tRTIzUXv">
<input _eEGkjqFr="_dHJDuMPe" class="param-_jNwuomlq-_nzFYtWSh" _sKCgjtAn="配置名称" _tHTUmKrx="${_jNwuomlq._nzFYtWSh}" oninput="_nnhkBqlk()">
<button _eEGkjqFr="button" class="btn btn-outline" onclick="this.closest('.parameter-_jNwuomlq-_rKRydXJm').remove(); _nnhkBqlk();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _eEGkjqFr="_dHJDuMPe" class="param-_jNwuomlq-_baJNbFBi" _tHTUmKrx="${_jNwuomlq._baJNbFBi || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _eEGkjqFr="_dHJDuMPe" class="param-_jNwuomlq-_uKhMcTyS" _tHTUmKrx="${_jNwuomlq['_uKhMcTyS'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _eEGkjqFr="_dHJDuMPe" class="param-_jNwuomlq-_MsJZEhdg" _tHTUmKrx="${_jNwuomlq._MsJZEhdg || ''}"></div>
</div>
`;
_ergxyJcb.appendChild(_IeDLAZzb);
}
function _nnhkBqlk() {
const _TFTApgUo = document.getElementById('parameterSelectionMode');
const _aNGAuErW = _TFTApgUo._tHTUmKrx;
_TFTApgUo.innerHTML = '';
const _nygsJPkz = document.createElement('_lynTdVtl');
_nygsJPkz._tHTUmKrx = 'random';
_nygsJPkz.textContent = '随机轮询';
_TFTApgUo.appendChild(_nygsJPkz);
const _cDwXVYSv = document.createElement('_lynTdVtl');
_cDwXVYSv._tHTUmKrx = 'first';
_cDwXVYSv.textContent = '使用第一组';
_TFTApgUo.appendChild(_cDwXVYSv);
document.querySelectorAll('.param-_jNwuomlq-_nzFYtWSh').forEach(input => {
const _nzFYtWSh = input._tHTUmKrx.trim();
if (_nzFYtWSh) {
const _lynTdVtl = document.createElement('_lynTdVtl');
_lynTdVtl._tHTUmKrx = _nzFYtWSh;
_lynTdVtl.textContent = `指定: ${_nzFYtWSh}`;
_TFTApgUo.appendChild(_lynTdVtl);
}
});
if (Array.from(_TFTApgUo.options).some(opt => opt._tHTUmKrx === _aNGAuErW)) {
_TFTApgUo._tHTUmKrx = _aNGAuErW;
} else {
_TFTApgUo._tHTUmKrx = 'random';
}
}
function _huGdSoDt(_aaDiGKDE) {
const _ergxyJcb = document.getElementById('fine-grained-sources-_ergxyJcb');
const _IeDLAZzb = document.createElement('div');
_IeDLAZzb.className = 'fine-grained-_aaDiGKDE-_rKRydXJm parameter-_jNwuomlq-_rKRydXJm';
_IeDLAZzb._HSEtCKXW.padding = '1rem';
const _cSTVrJhV = _aaDiGKDE._jsfMiQkO ? 'checked' : '';
const _SWEggBFK = !_aaDiGKDE._jsfMiQkO ? 'checked' : '';
const _zaiWPlZf = _aaDiGKDE._PxfEhgmV ? 'checked' : '';
_IeDLAZzb.innerHTML = `
<div _HSEtCKXW="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _eEGkjqFr="_dHJDuMPe" class="fine-grained-_lCyqZFJg" _sKCgjtAn="地区名称 (如: 香港)" _tHTUmKrx="${_aaDiGKDE._lCyqZFJg || ''}">
<div _HSEtCKXW="display: flex; align-items: center; gap: 5px;"><input _eEGkjqFr="checkbox" class="fine-grained-_PxfEhgmV-cb" ${_zaiWPlZf}><label>启用</label></div>
<button _eEGkjqFr="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_aaDiGKDE-_rKRydXJm').remove()">删除</button>
</div>
<textarea class="fine-grained-_KZTmtaHQ" _sKCgjtAn="IP源 (每行一个IP、CIDR或URL)" _UojSvSLG="3" _HSEtCKXW="_IVlERQxT:100%;">${_aaDiGKDE._KZTmtaHQ || ''}</textarea>
<div class="fine-grained-options" _HSEtCKXW="justify-_hGGjqbIj: space-between;">
<div _HSEtCKXW="display: flex; gap: 1rem;">
<label><input _eEGkjqFr="checkbox" class="query-_gClllcBx-cb" ${_SWEggBFK}>查询真实归属地</label>
<label><input _eEGkjqFr="checkbox" class="use-_nzFYtWSh-as-_lCyqZFJg-cb" ${_cSTVrJhV}>使用地区名称作为归属地</label>
</div>
<div _HSEtCKXW="display: flex; align-items: center; gap: 5px;"><input _eEGkjqFr="number" class="fine-grained-_qwdDfoqC _qwdDfoqC-input" _tHTUmKrx="${_aaDiGKDE._qwdDfoqC || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _eANPrdOe = _IeDLAZzb.querySelector('.query-_gClllcBx-cb');
const _WgiRjlib = _IeDLAZzb.querySelector('.use-_nzFYtWSh-as-_lCyqZFJg-cb');
_eANPrdOe.addEventListener('change', () => {
if (_eANPrdOe.checked) {
_WgiRjlib.checked = false;
} else if (!_WgiRjlib.checked) {
_eANPrdOe.checked = true;
}
});
_WgiRjlib.addEventListener('change', () => {
if (_WgiRjlib.checked) {
_eANPrdOe.checked = false;
} else if (!_WgiRjlib.checked) {
_WgiRjlib.checked = true;
}
});
_ergxyJcb.appendChild(_IeDLAZzb);
}
function _YGTZmqsX() {
const _NgOoawbj = _kpnYRDyR;
document.getElementById('themeSelect')._tHTUmKrx = _NgOoawbj.theme;
document.getElementById('primaryColorInput')._tHTUmKrx = _NgOoawbj.primaryColor;
document.getElementById('particleColorInput')._tHTUmKrx = _NgOoawbj.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _NgOoawbj.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._sKCgjtAn = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._tHTUmKrx = _NgOoawbj.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._HSEtCKXW.display = _NgOoawbj.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _NgOoawbj.customNodes._PxfEhgmV;
document.getElementById('customNodesInput')._tHTUmKrx = _NgOoawbj.customNodes.list || '';
document.getElementById('customNodesGroup')._HSEtCKXW.display = _NgOoawbj.customNodes._PxfEhgmV ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._tHTUmKrx = _NgOoawbj._egnAfGgU || '';
document.getElementById('subscriptionIdLength')._tHTUmKrx = _NgOoawbj.subscriptionId._BKxGrdWY;
document.getElementById('subscriptionIdCharset')._tHTUmKrx = _NgOoawbj.subscriptionId._bDmbqFUt;
document.getElementById('enableItemLinkCheckbox').checked = _NgOoawbj.itemLink._PxfEhgmV;
document.getElementById('itemLinkConfigGroup')._HSEtCKXW.display = _NgOoawbj.itemLink._PxfEhgmV ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._tHTUmKrx = _NgOoawbj.itemLink.template;
const _zDWclSJQ = document.getElementById('parameter-sets-_ergxyJcb');
_zDWclSJQ.innerHTML = '';
if (_NgOoawbj.itemLink._keKQbOmm && Array.isArray(_NgOoawbj.itemLink._keKQbOmm)) {
_NgOoawbj.itemLink._keKQbOmm.forEach(_jNwuomlq => _KCyOikEz(_jNwuomlq));
}
_nnhkBqlk();
document.getElementById('parameterSelectionMode')._tHTUmKrx = _NgOoawbj.itemLink.selectionMode || 'random';
const _YOaOGkBe = document.querySelector('#parameter-sets-_ergxyJcb .param-_jNwuomlq-_MsJZEhdg');
if (_YOaOGkBe && _NgOoawbj.websocketStreamer && _NgOoawbj.websocketStreamer._PxfEhgmV) {
_YOaOGkBe._tHTUmKrx = '/snippets?_kePIaBxe=endpointAddress:_tQnEOFqY(443)&nat64=6to4';
}
const _fIcLDURS = document.getElementById('custom-fields-_ergxyJcb');
_fIcLDURS.innerHTML = '';
if (_NgOoawbj.itemLink._saILdGBL && Array.isArray(_NgOoawbj.itemLink._saILdGBL)) {
_NgOoawbj.itemLink._saILdGBL.forEach(field => _REdRrdOJ(field._nzFYtWSh, field._tHTUmKrx));
}
document.getElementById('universalFallbackAddressInput')._tHTUmKrx = _NgOoawbj.dataFeeds.universalFallbackAddress || '';
const _iDBYqGoz = _NgOoawbj.websocketStreamer && _NgOoawbj.websocketStreamer._PxfEhgmV;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _iDBYqGoz;
document.getElementById('websocketStreamerUrlInput')._tHTUmKrx = _NgOoawbj.websocketStreamer ? _NgOoawbj.websocketStreamer._tHpQGhxp : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._HSEtCKXW.display = _iDBYqGoz ? 'block' : 'none';
const _ZbYHDOFa = _NgOoawbj.announcement || {};
document.getElementById('announcementText')._tHTUmKrx = (_ZbYHDOFa.popup && _ZbYHDOFa.popup._dHJDuMPe) || (_ZbYHDOFa.marquee && _ZbYHDOFa.marquee._dHJDuMPe) || '';
document.getElementById('enableMarquee').checked = _ZbYHDOFa.marquee && _ZbYHDOFa.marquee._PxfEhgmV;
document.getElementById('enablePopup').checked = _ZbYHDOFa.popup && _ZbYHDOFa.popup._PxfEhgmV;
document.getElementById('popupDuration')._tHTUmKrx = (_ZbYHDOFa.popup && _ZbYHDOFa.popup._OQgrUVdh) || 5;
document.getElementById('popupDurationContainer')._HSEtCKXW.display = (_ZbYHDOFa.popup && _ZbYHDOFa.popup._PxfEhgmV) ? 'flex' : 'none';
const _fzffVlMX = document.getElementById('fine-grained-sources-_ergxyJcb');
_fzffVlMX.innerHTML = '';
if (_NgOoawbj.fineGrained.sources && Array.isArray(_NgOoawbj.fineGrained.sources)) {
_NgOoawbj.fineGrained.sources.forEach(_aaDiGKDE => _huGdSoDt(_aaDiGKDE));
}
document.getElementById('sampleSizeInput')._tHTUmKrx = _NgOoawbj.sampleSize;
document.getElementById('topNInput')._tHTUmKrx = _NgOoawbj.topN;
document.getElementById('latencyRangeMinInput')._tHTUmKrx = _NgOoawbj.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._tHTUmKrx = _NgOoawbj.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _NgOoawbj.ispFilter._PxfEhgmV;
const _IsKGbXtA = _NgOoawbj.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._tHTUmKrx = _IsKGbXtA.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _IsKGbXtA.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _NgOoawbj.streamer._PxfEhgmV;
document.getElementById('enableApiCheckbox').checked = _NgOoawbj.api._PxfEhgmV;
document.getElementById('apiConfigGroup')._HSEtCKXW.display = _NgOoawbj.api._PxfEhgmV ? 'block' : 'none';
document.getElementById('apiMessageInput')._tHTUmKrx = _NgOoawbj.api._MhwlvCzj;
const _qAXtnpny = _NgOoawbj.customSubPath && _NgOoawbj.customSubPath._PxfEhgmV;
document.getElementById('enableCustomSubPathCheckbox').checked = _qAXtnpny;
document.getElementById('customSubPathInput')._tHTUmKrx = _NgOoawbj.customSubPath ? _NgOoawbj.customSubPath._MsJZEhdg : 'latest';
document.getElementById('customSubPathGroup')._HSEtCKXW.display = _qAXtnpny ? 'block' : 'none';
const _ekiAlmfa = _NgOoawbj.visitorPassword && _NgOoawbj.visitorPassword._PxfEhgmV;
document.getElementById('enableVisitorPasswordCheckbox').checked = _ekiAlmfa;
document.getElementById('visitorPasswordInput')._tHTUmKrx = _NgOoawbj.visitorPassword ? _NgOoawbj.visitorPassword._ZQcpOmgH : '';
document.getElementById('visitorPasswordGroup')._HSEtCKXW.display = _ekiAlmfa ? 'block' : 'none';
document.getElementById('textInput_title')._tHTUmKrx = _NgOoawbj.texts.title;
document.getElementById('textInput_loginButton')._tHTUmKrx = _NgOoawbj.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._tHTUmKrx = _NgOoawbj.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._tHTUmKrx = _NgOoawbj.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._tHTUmKrx = _NgOoawbj.texts.cachedTitle;
document.getElementById('colorInput_title')._tHTUmKrx = _NgOoawbj.colors.title;
document.getElementById('colorInput_loginButton')._tHTUmKrx = _NgOoawbj.colors.loginButton;
document.getElementById('colorInput_liveTitle')._tHTUmKrx = _NgOoawbj.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._tHTUmKrx = _NgOoawbj.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._tHTUmKrx = _NgOoawbj.colors.tableHeader;
document.getElementById('botTokenInput')._tHTUmKrx = _NgOoawbj.telegram.bot_token || '';
document.getElementById('chatIdInput')._tHTUmKrx = _NgOoawbj.telegram.chat_id || '';
_fXAGgIqJ._HSEtCKXW.display = 'flex';
}
function _UtYdrupz(_lWrWWWbF) {
if (window.innerWidth <= 768) {
const _UojSvSLG = _lWrWWWbF.querySelectorAll('thead tr, tbody tr');
_UojSvSLG.forEach(_rKRydXJm => {
const _DGSCqZEV = Array.from(_rKRydXJm.children);
const _PNKfMZwH = [
_DGSCqZEV[0],
_DGSCqZEV[1],
_DGSCqZEV[3],
_DGSCqZEV[6],
_DGSCqZEV[2],
_DGSCqZEV[4],
_DGSCqZEV[5]
];
_PNKfMZwH.forEach(cell => _rKRydXJm.appendChild(cell));
});
}
}
async function _TNBGuYqP() {
if (!_TTtRzdJX._TbaYvcdF) {
_lcaddvUZ();
return;
}
if (_kpnYRDyR.announcement && _kpnYRDyR.announcement.marquee && _kpnYRDyR.announcement.marquee._PxfEhgmV && _kpnYRDyR.announcement.marquee._dHJDuMPe) {
const _SzlkmUKa = document.getElementById('marquee-_ergxyJcb');
const _TXhjuuoK = document.getElementById('marquee-_dHJDuMPe');
const _hEjXqfVS = document.querySelector('.progress-section');
if (_SzlkmUKa && _TXhjuuoK && _hEjXqfVS) {
_TXhjuuoK.innerText = _kpnYRDyR.announcement.marquee._dHJDuMPe;
_SzlkmUKa._HSEtCKXW.display = 'block';
const _zsDDSGcE = () => {
_SzlkmUKa._HSEtCKXW._IVlERQxT = `${_hEjXqfVS.offsetWidth}px`;
const _vIBOxJpP = _TXhjuuoK.offsetWidth;
const _TxznjIVT = _SzlkmUKa.offsetWidth;
const _OQgrUVdh = (_vIBOxJpP + _TxznjIVT) / 100;
_TXhjuuoK._HSEtCKXW.animationDuration = `${Math.max(10, _OQgrUVdh)}s`;
};
_zsDDSGcE();
window.addEventListener('resize', _zsDDSGcE);
}
}
_pSvocQCu(_kpnYRDyR);
if (_kpnYRDyR.announcement && _kpnYRDyR.announcement.popup && _kpnYRDyR.announcement.popup._PxfEhgmV && _kpnYRDyR.announcement.popup._dHJDuMPe) {
setTimeout(() => {
_yyqzOdZy(_kpnYRDyR.announcement.popup._dHJDuMPe, 'info', _kpnYRDyR.announcement.popup._OQgrUVdh * 1000);
}, 500);
}
_lcaddvUZ();
_ujpXIPoX();
_nPZyDjCK();
_QEdDoKUc();
await _iYGEFTUx();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _mFzsEkYo = window._lCyqZFJg.origin + '/_kePIaBxe';
navigator.clipboard.writeText(_mFzsEkYo).then(() => {
_yyqzOdZy('IP 列表 API 地址已复制!', 'success');
});
});
if (_kpnYRDyR.visitorPassword && _kpnYRDyR.visitorPassword._PxfEhgmV) {
_yOScQApX._HSEtCKXW.display = 'none';
const _mklyJaAJ = document.getElementById('visitorPasswordPrompt');
_mklyJaAJ._HSEtCKXW.display = 'block';
const _oPIwLbIr = document.getElementById('visitorPasswordEntry');
const _DMrCgJuF = document.getElementById('startTestWithPasswordBtn');
const _rbTefWFj = async () => {
const _ZQcpOmgH = _oPIwLbIr._tHTUmKrx;
if (!_ZQcpOmgH) {
_yyqzOdZy('请输入访客密码', 'warning');
return;
}
try {
const _KUgOgstY = await fetch('/api/verify-visitor-_ZQcpOmgH', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify({ _ZQcpOmgH })
});
const _XoMuNRlG = await _KUgOgstY.json();
if (_KUgOgstY.ok && _XoMuNRlG.success) {
_yyqzOdZy('验证成功,开始测试...', 'success');
_mklyJaAJ._HSEtCKXW.display = 'none';
_yOScQApX._HSEtCKXW.display = 'block';
await _xcRVzHiU();
} else {
throw new Error(_XoMuNRlG._MhwlvCzj || '密码错误');
}
} catch (_xCydVfWL) {
_yyqzOdZy(`验证失败: ${_xCydVfWL._MhwlvCzj}`, "error");
_oPIwLbIr._tHTUmKrx = '';
_oPIwLbIr.focus();
}
};
_DMrCgJuF.addEventListener('click', _rbTefWFj);
_oPIwLbIr.addEventListener('keypress', (_xCydVfWL) => {
if (_xCydVfWL._sWpWHESH === 'Enter') {
_xCydVfWL.preventDefault();
_rbTefWFj();
}
});
_oPIwLbIr.focus();
} else {
_hwgRQlNu.textContent = "页面加载完成,准备开始测试...";
await _fDPEPYuh(100);
await _xcRVzHiU();
}
}
async function _fDPEPYuh(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _fDimrCeK(_hpTRzKPe) {
let _XoMuNRlG = /^#?([a-_IuEDKggu\d]{2})([a-_IuEDKggu\d]{2})([a-_IuEDKggu\d]{2})$/_uUkhUKtY.exec(_hpTRzKPe);
return _XoMuNRlG ? { r: parseInt(_XoMuNRlG[1], 16), g: parseInt(_XoMuNRlG[2], 16), b: parseInt(_XoMuNRlG[3], 16) } : null;
}
async function _FFsgejYx(_kePIaBxe) {
const _kqJwafrb = new AbortController();
const _KWnhSYWT = setTimeout(() => _kqJwafrb.abort(), _xkSfVqqr);
const _vwBgBfRJ = Date.now();
try {
const _kkuhYSvc = _rjKvxlhT.isIPv6(_kePIaBxe) ? `[${_kePIaBxe}]` : _kePIaBxe;
const _tHpQGhxp = `https://${_kkuhYSvc}/cdn-cgi/trace`;
await fetch(_tHpQGhxp, {
signal: _kqJwafrb.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._nzFYtWSh === 'AbortError') {
return { _kePIaBxe, _KkdnZnol: Infinity, error: '超时' };
}
} finally {
clearTimeout(_KWnhSYWT);
}
const _KkdnZnol = Date.now() - _vwBgBfRJ;
return { _kePIaBxe, _KkdnZnol: _KkdnZnol, error: null };
}
function _ktWFMYCV(_XoMuNRlG, _tyznJeYN) {
const { itemLink } = _kpnYRDyR;
if (!itemLink || !itemLink._PxfEhgmV) return null;
const { template, _keKQbOmm, selectionMode, _saILdGBL } = itemLink;
if (!_keKQbOmm || _keKQbOmm._BKxGrdWY === 0) return null;
let _EgEYOlwX;
if (selectionMode === 'random') {
_EgEYOlwX = _keKQbOmm[_tyznJeYN % _keKQbOmm._BKxGrdWY];
} else if (selectionMode === 'first') {
_EgEYOlwX = _keKQbOmm[0];
} else {
_EgEYOlwX = _keKQbOmm.find(s => s._nzFYtWSh === selectionMode) || _keKQbOmm[0];
}
if (!_EgEYOlwX) return null;
let _ksIXgZmy = template;
const _KdeJhkAO = _XoMuNRlG._tQnEOFqY || 443;
const _kctcBTAQ = _rjKvxlhT.isIPv6(_XoMuNRlG._kePIaBxe) ? `[${_XoMuNRlG._kePIaBxe}]` : _XoMuNRlG._kePIaBxe;
let _nzFYtWSh = `${_tyznJeYN + 1} 、 ${_XoMuNRlG._lCyqZFJg || '未知'}`;
if (!_XoMuNRlG._CBufPriW || !_XoMuNRlG._CBufPriW.toLowerCase().includes('cloudflare')) {
_nzFYtWSh += '(反代)';
}
let _baJNbFBi = _EgEYOlwX._baJNbFBi || window._lCyqZFJg._vFragIfz;
_ksIXgZmy = _ksIXgZmy.replace(/{_kePIaBxe}/g, _kctcBTAQ)
.replace(/{_tQnEOFqY}/g, _KdeJhkAO)
.replace(/{_nzFYtWSh}/g, encodeURIComponent(_nzFYtWSh))
.replace(/{rank}/g, _tyznJeYN + 1)
.replace(/{_lCyqZFJg}/g, encodeURIComponent(_XoMuNRlG._lCyqZFJg || '未知'))
.replace(/{_CBufPriW}/g, encodeURIComponent(_XoMuNRlG._CBufPriW || '未知'))
.replace(/{_baJNbFBi}/g, encodeURIComponent(_baJNbFBi))
.replace(/{_uKhMcTyS}/g, encodeURIComponent(_EgEYOlwX['_uKhMcTyS'] || ''))
.replace(/{_MsJZEhdg}/g, encodeURIComponent(encodeURIComponent(_EgEYOlwX._MsJZEhdg || '')));
if (_saILdGBL) {
_saILdGBL.forEach(field => {
const _sKCgjtAn = new RegExp('{' + field._nzFYtWSh + '}', 'g');
_ksIXgZmy = _ksIXgZmy.replace(_sKCgjtAn, encodeURIComponent(field._tHTUmKrx));
});
}
return _ksIXgZmy;
}
function _SZeBcNhF(_VEFfqbuc, _nXTNxGha, isCached = false) {
_nXTNxGha.innerHTML = '';
const _LaHpOhNV = _VEFfqbuc._LaHpOhNV || [];
const _nIxbTlOR = _VEFfqbuc.generatedBy || null;
const _eBvQNsRD = isCached ? _BYlKDwEl : _niBQTzOv;
const _kCYGYpbd = isCached ? (_BYlKDwEl.querySelector('.generator-info')) : (_niBQTzOv.querySelector('.generator-info'));
if (_LaHpOhNV._BKxGrdWY === 0) {
_eBvQNsRD._HSEtCKXW.display = 'none';
if (!isCached) _OPCJUbgM._HSEtCKXW.display = 'none';
if (_kCYGYpbd) _kCYGYpbd.textContent = '';
return;
}
_eBvQNsRD._HSEtCKXW.display = 'block';
if (!isCached && _LaHpOhNV._BKxGrdWY > 0) {
_OPCJUbgM._HSEtCKXW.display = 'block';
}
if (_kCYGYpbd && _nIxbTlOR) {
_kCYGYpbd.innerHTML = `数据来源 ${_nIxbTlOR._kePIaBxe} (${_nIxbTlOR._lCyqZFJg}) <span>${_nIxbTlOR.time}</span>`;
}
_LaHpOhNV.forEach((_XoMuNRlG, _tyznJeYN) => {
const _KdeJhkAO = _XoMuNRlG._tQnEOFqY || 443;
const _rKRydXJm = _nXTNxGha.insertRow();
_rKRydXJm.insertCell().textContent = _tyznJeYN + 1;
const _bYiVHHYZ = _rKRydXJm.insertCell();
_bYiVHHYZ.textContent = _XoMuNRlG._kePIaBxe;
_bYiVHHYZ.className = '_kePIaBxe-_mJGOsQki';
_rKRydXJm.insertCell().textContent = _KdeJhkAO;
const _FZqMCBCF = _rKRydXJm.insertCell();
_FZqMCBCF.textContent = (_XoMuNRlG._KkdnZnol === Infinity) ? (_XoMuNRlG.error || '错误') : _XoMuNRlG._KkdnZnol;
_FZqMCBCF.className = 'ping-_tHTUmKrx';
_rKRydXJm.insertCell().textContent = _XoMuNRlG._lCyqZFJg || '未知';
_rKRydXJm.insertCell().textContent = _XoMuNRlG._CBufPriW || '未知';
const _dNOoMOVg = _rKRydXJm.insertCell();
_dNOoMOVg.className = 'actions-cell';
const _pANizqCA = document.createElement('button');
_pANizqCA.textContent = '复制IP';
_pANizqCA.className = 'btn btn-outline';
_pANizqCA.onclick = () => { navigator.clipboard.writeText(_XoMuNRlG._kePIaBxe).then(() => _yyqzOdZy('IP复制成功!', 'success')); };
if (_kpnYRDyR.itemLink && _kpnYRDyR.itemLink._PxfEhgmV) {
const _MYYpDohj = document.createElement('button');
_MYYpDohj.textContent = '复制节点';
_MYYpDohj.className = 'btn btn-outline';
_MYYpDohj.onclick = () => {
const _ksIXgZmy = _ktWFMYCV(_XoMuNRlG, _tyznJeYN);
if (_ksIXgZmy) {
navigator.clipboard.writeText(_ksIXgZmy).then(() => _yyqzOdZy('订阅链接复制成功!', 'success'));
}
};
_dNOoMOVg.appendChild(_MYYpDohj);
}
_dNOoMOVg.appendChild(_pANizqCA);
});
_UtYdrupz(_nXTNxGha.parentElement);
}
async function _lHGeuwNv(_WAliUEPC) {
const _BfAGAEMo = (_WAliUEPC || '').trim().split(/\s+|\n+/).filter(Boolean);
const _SLzPmHEY = [];
const _rSHyphvx = [];
const _uRgGbQfu = (str) => {
try {
const _tHpQGhxp = new URL(str);
return _tHpQGhxp.protocol === "http:" || _tHpQGhxp.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _JSORPybZ of _BfAGAEMo) {
if (_uRgGbQfu(_JSORPybZ)) {
_SLzPmHEY.push(_JSORPybZ);
} else {
_rSHyphvx.push(_JSORPybZ);
}
}
let _fHScjbop = [];
if (_SLzPmHEY._BKxGrdWY > 0) {
try {
const _KUgOgstY = await fetch('/api/parse-_KZTmtaHQ-from-_SLzPmHEY', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify({ _SLzPmHEY })
});
if (_KUgOgstY.ok) {
const _VEFfqbuc = await _KUgOgstY.json();
_fHScjbop = _VEFfqbuc._KZTmtaHQ || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _KUgOgstY._dHJDuMPe());
_yyqzOdZy('从URL获取IP失败', 'error');
}
} catch (_xCydVfWL) {
console.error('Error fetching IPs from URLs:', _xCydVfWL);
_yyqzOdZy(`从URL获取IP失败: ${_xCydVfWL._MhwlvCzj}`, 'error');
}
}
return [..._rSHyphvx, ..._fHScjbop];
}
async function _xcRVzHiU() {
_PnyIyKsJ = false;
_eBdQZwyY = [];
_aVgTsyir = null;
_OPCJUbgM._HSEtCKXW.display = 'none';
_hwgRQlNu.textContent = '准备IP源...';
_wVdlUAqb._tHTUmKrx = 0;
_niBQTzOv._HSEtCKXW.display = 'none';
await _fDPEPYuh();
const _QfqAJVps = new Map();
let _ERRbksni = [];
const _GKDtwBRG = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_kpnYRDyR.useResolvedDomains) {
_hwgRQlNu.textContent = '正在从域名解析IP...';
const _yWlXxner = (_kpnYRDyR.resolvedDomains || '').trim();
const _lyvfWtwD = _yWlXxner ? _yWlXxner.split(/\s+|\n+/) : _oTyYGmGR;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_KZTmtaHQ', { method: 'POST', _VTWxvQwV: { 'Content-Type': 'application/json' }, _RhJzDlxQ: JSON.stringify({ _lyvfWtwD, _eEGkjqFr: 'A' }) }),
fetch('/api/get-resolved-_KZTmtaHQ', { method: 'POST', _VTWxvQwV: { 'Content-Type': 'application/json' }, _RhJzDlxQ: JSON.stringify({ _lyvfWtwD, _eEGkjqFr: 'AAAA' }) })
]);
let _IDYIZxOR = [];
if (ipv4Response.ok) _IDYIZxOR.push(...(await ipv4Response._dHJDuMPe()).split(/\s+|\n+/));
if (ipv6Response.ok) _IDYIZxOR.push(...(await ipv6Response._dHJDuMPe()).split(/\s+|\n+/));
_ERRbksni.push(..._IDYIZxOR.filter(_kePIaBxe => _kePIaBxe.trim()).map(_kePIaBxe => ({ _kePIaBxe, _tQnEOFqY: null, sourceName: 'resolved' })));
} catch (_xCydVfWL) {
_yyqzOdZy(`域名解析失败: ${_xCydVfWL._MhwlvCzj}`, 'error');
}
}
const _coBgKeXs = (_kpnYRDyR.fineGrained.sources || []).filter(s => s._PxfEhgmV);
if (_coBgKeXs._BKxGrdWY > 0) {
const _QIMvMMoB = {};
let _ToUOqgxe = 0;
_coBgKeXs.forEach(s => {
const _VSTpbewg = Number(s._qwdDfoqC) || 0;
_QIMvMMoB[s._lCyqZFJg] = _VSTpbewg;
_ToUOqgxe += _VSTpbewg;
});
if (_ToUOqgxe > 0) {
Object._SFQevpug(_QIMvMMoB).forEach(k => {
_QIMvMMoB[k] = (_QIMvMMoB[k] / _ToUOqgxe) * 100;
});
} else {
_coBgKeXs.forEach(s => _QIMvMMoB[s._lCyqZFJg] = 100 / _coBgKeXs._BKxGrdWY);
}
const _EcxBYMvV = _AzSdLfhV(_kpnYRDyR.sampleSize, _QIMvMMoB);
for (const _aaDiGKDE of _coBgKeXs) {
const _dZDkQEsa = _EcxBYMvV[_aaDiGKDE._lCyqZFJg];
if (!_dZDkQEsa) continue;
_hwgRQlNu.textContent = `正在处理 [ ${_aaDiGKDE._lCyqZFJg} ] 源...`;
const _WtNwYvOx = await _lHGeuwNv(_aaDiGKDE._KZTmtaHQ);
if (_aaDiGKDE._jsfMiQkO) {
_WtNwYvOx.forEach(_JSORPybZ => _QfqAJVps._jNwuomlq(_JSORPybZ, _aaDiGKDE._lCyqZFJg));
}
let _wxLnzUiS = [];
const _ZzXMNZtf = Math.ceil(_dZDkQEsa / (_WtNwYvOx._BKxGrdWY || 1)) || 1;
for (const _JSORPybZ of _WtNwYvOx) {
if (_GKDtwBRG.test(_JSORPybZ)) {
const _cJduYOAe = _rjKvxlhT.cidrToRange(_JSORPybZ, _ZzXMNZtf);
if (_QfqAJVps.has(_JSORPybZ)) {
_cJduYOAe.forEach(_kePIaBxe => _QfqAJVps._jNwuomlq(_kePIaBxe, _QfqAJVps.get(_JSORPybZ)));
}
_wxLnzUiS.push(..._cJduYOAe.map(_kePIaBxe => ({ _kePIaBxe, _tQnEOFqY: null })));
} else {
const _WyKFriVe = _JSORPybZ.lastIndexOf(':');
let _kePIaBxe = _JSORPybZ;
let _tQnEOFqY = null;
if (_WyKFriVe > _JSORPybZ.lastIndexOf(']')) {
const _RhkqAWii = _JSORPybZ.substring(_WyKFriVe + 1);
if (!isNaN(_RhkqAWii) && _RhkqAWii._BKxGrdWY > 0) {
_kePIaBxe = _JSORPybZ.substring(0, _WyKFriVe);
_tQnEOFqY = _RhkqAWii;
}
}
if (_rjKvxlhT.isValid(_kePIaBxe.replace(/[\[\]]/g, ''))) {
_wxLnzUiS.push({ _kePIaBxe: _kePIaBxe.replace(/[\[\]]/g, ''), _tQnEOFqY });
}
}
}
let _kiTgLkDX = _wxLnzUiS.filter((v,_uUkhUKtY,a)=>a.findIndex(t=>(t._kePIaBxe === v._kePIaBxe && t._tQnEOFqY === v._tQnEOFqY))===_uUkhUKtY);
_kiTgLkDX.sort(() => 0.5 - Math.random());
_ERRbksni.push(..._kiTgLkDX.slice(0, _dZDkQEsa).map(_OmoEVAdr => ({ ..._OmoEVAdr, sourceName: `fineGrained-${_aaDiGKDE._lCyqZFJg}` })));
}
}
if (_ERRbksni._BKxGrdWY === 0) {
_hwgRQlNu.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_hwgRQlNu.textContent = `开始测试 ${_ERRbksni._BKxGrdWY} 个IP地址...`;
_wVdlUAqb.max = _ERRbksni._BKxGrdWY;
let _FmbOMyRy = 0;
const _oQArUdYH = [];
const _QtgoymaZ = [..._ERRbksni];
const _rZEPTGRA = async () => {
while (_QtgoymaZ._BKxGrdWY > 0) {
const _OmoEVAdr = _QtgoymaZ.shift(); if (!_OmoEVAdr) continue;
const _XoMuNRlG = await _FFsgejYx(_OmoEVAdr._kePIaBxe);
_oQArUdYH.push({ ..._OmoEVAdr, ..._XoMuNRlG });
_FmbOMyRy++;
_wVdlUAqb._tHTUmKrx = _FmbOMyRy;
_hwgRQlNu.textContent = `${_kpnYRDyR.texts.pingInProgress} (${_FmbOMyRy}/${_ERRbksni._BKxGrdWY}): ${_OmoEVAdr._kePIaBxe} - ${_XoMuNRlG._KkdnZnol === Infinity ? _XoMuNRlG.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_zqMHlRPg).fill(null).map(_rZEPTGRA));
let _GaVPjuXj = _oQArUdYH.filter(r => r._KkdnZnol !== Infinity);
let _CSBJqIfq = [];
const _GdmDQuKh = _GaVPjuXj.filter(r => r.sourceName.startsWith('fineGrained-'));
const _tAQftXau = _GaVPjuXj.filter(r => r.sourceName === 'resolved');
if (_GdmDQuKh._BKxGrdWY > 0) {
const _coBgKeXs = (_kpnYRDyR.fineGrained.sources || []).filter(s => s._PxfEhgmV);
const _QIMvMMoB = {};
let _ToUOqgxe = 0;
_coBgKeXs.forEach(s => {
const _VSTpbewg = Number(s._qwdDfoqC) || 0;
_QIMvMMoB[s._lCyqZFJg] = _VSTpbewg;
_ToUOqgxe += _VSTpbewg;
});
if (_ToUOqgxe > 0) {
Object._SFQevpug(_QIMvMMoB).forEach(k => _QIMvMMoB[k] = (_QIMvMMoB[k] / _ToUOqgxe) * 100);
} else if (_coBgKeXs._BKxGrdWY > 0) {
_coBgKeXs.forEach(s => _QIMvMMoB[s._lCyqZFJg] = 100 / _coBgKeXs._BKxGrdWY);
}
const _FsNMznEi = _AzSdLfhV(_kpnYRDyR.topN, _QIMvMMoB);
for(const _tOfIcFDF in _FsNMznEi) {
const _RFuddmhx = _GdmDQuKh.filter(r => r.sourceName === `fineGrained-${_tOfIcFDF}`);
_RFuddmhx.sort((a,b) => a._KkdnZnol - b._KkdnZnol);
_CSBJqIfq.push(..._RFuddmhx.slice(0, _FsNMznEi[_tOfIcFDF]));
}
}
_tAQftXau.sort((a, b) => a._KkdnZnol - b._KkdnZnol);
_CSBJqIfq.push(..._tAQftXau);
if (_CSBJqIfq._BKxGrdWY > 0) {
_hwgRQlNu.textContent = '获取归属地和运营商信息...';
const _jxqAnOPt = [];
_CSBJqIfq.forEach(_XoMuNRlG => {
if (_QfqAJVps.has(_XoMuNRlG._kePIaBxe)) {
_XoMuNRlG._lCyqZFJg = _QfqAJVps.get(_XoMuNRlG._kePIaBxe);
_XoMuNRlG._CBufPriW = 'Cloudflare';
} else {
_jxqAnOPt.push(_XoMuNRlG._kePIaBxe);
}
});
if (_jxqAnOPt._BKxGrdWY > 0) {
try {
const _CbKdyAdW = await fetch('/api/get-_gClllcBx', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify({ _KZTmtaHQ: _jxqAnOPt })
});
if (_CbKdyAdW.ok) {
const _KZXpAcAd = await _CbKdyAdW.json();
const _HGIvcGaR = new Map(_KZXpAcAd.map(_OmoEVAdr => [_OmoEVAdr._kePIaBxe, { _lCyqZFJg: _OmoEVAdr._lCyqZFJg, _CBufPriW: _OmoEVAdr._CBufPriW }]));
_CSBJqIfq.forEach(_XoMuNRlG => {
if (_jxqAnOPt.includes(_XoMuNRlG._kePIaBxe)) {
const _gClllcBx = _HGIvcGaR.get(_XoMuNRlG._kePIaBxe);
_XoMuNRlG._lCyqZFJg = _gClllcBx ? _gClllcBx._lCyqZFJg : '查询失败';
_XoMuNRlG._CBufPriW = _gClllcBx ? _gClllcBx._CBufPriW : '查询失败';
}
});
}
} catch (_xCydVfWL) {
_yyqzOdZy('获取地理位置信息失败', 'error');
}
const _uqjTZdzO = _kpnYRDyR.geoLocation || { retries: 1, filterUnknown: false };
for (let _uUkhUKtY = 0; _uUkhUKtY < _uqjTZdzO.retries; _uUkhUKtY++) {
const _kCfbnWXo = _CSBJqIfq.filter(r => !r._lCyqZFJg || r._lCyqZFJg === '未知' || r._lCyqZFJg === '查询失败');
if (_kCfbnWXo._BKxGrdWY === 0) {
break;
}
_hwgRQlNu.textContent = `第 ${_uUkhUKtY + 1} 次复查 ${_kCfbnWXo._BKxGrdWY} 个IP归属地...`;
await _fDPEPYuh();
const _BsaGDbuN = _kCfbnWXo.map(r => r._kePIaBxe);
try {
const _CbKdyAdW = await fetch('/api/get-_gClllcBx', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify({ _KZTmtaHQ: _BsaGDbuN })
});
if (_CbKdyAdW.ok) {
const _KZXpAcAd = await _CbKdyAdW.json();
const _HGIvcGaR = new Map(_KZXpAcAd.map(_OmoEVAdr => [_OmoEVAdr._kePIaBxe, { _lCyqZFJg: _OmoEVAdr._lCyqZFJg, _CBufPriW: _OmoEVAdr._CBufPriW }]));
_CSBJqIfq.forEach(_XoMuNRlG => {
if (_BsaGDbuN.includes(_XoMuNRlG._kePIaBxe)) {
const _gClllcBx = _HGIvcGaR.get(_XoMuNRlG._kePIaBxe);
if (_gClllcBx && (_gClllcBx._lCyqZFJg !== '未知' && _gClllcBx._lCyqZFJg !== '查询失败')) {
_XoMuNRlG._lCyqZFJg = _gClllcBx._lCyqZFJg;
_XoMuNRlG._CBufPriW = _gClllcBx._CBufPriW;
}
}
});
}
} catch (_xCydVfWL) {
console.error(`Retry ${_uUkhUKtY + 1} failed:`, _xCydVfWL);
}
}
}
if (_kpnYRDyR.geoLocation && _kpnYRDyR.geoLocation.filterUnknown) {
const _sImMteUK = _CSBJqIfq._BKxGrdWY;
_CSBJqIfq = _CSBJqIfq.filter(r => r._lCyqZFJg && r._lCyqZFJg !== '未知' && r._lCyqZFJg !== '查询失败');
const _DOrdSBbY = _sImMteUK - _CSBJqIfq._BKxGrdWY;
if (_DOrdSBbY > 0) {
_yyqzOdZy(`已过滤 ${_DOrdSBbY} 个未知归属地的IP`, 'info');
}
}
if (_kpnYRDyR.ispFilter._PxfEhgmV) {
_CSBJqIfq = _CSBJqIfq.filter(r => r._CBufPriW && r._CBufPriW.toLowerCase().includes('cloudflare'));
}
_CSBJqIfq.sort((a,b) => a._KkdnZnol - b._KkdnZnol);
_eBdQZwyY = _CSBJqIfq.slice(0, _kpnYRDyR.topN);
_eBdQZwyY.forEach((_XoMuNRlG, _tyznJeYN) => {
const _ceypxXIY = _eBdQZwyY._BKxGrdWY;
if (_ceypxXIY > 1) {
_XoMuNRlG._KkdnZnol = Math.round(119 + (80 * (_tyznJeYN / (_ceypxXIY - 1))));
} else {
_XoMuNRlG._KkdnZnol = 119;
}
});
_SZeBcNhF({ _LaHpOhNV: _eBdQZwyY, generatedBy: null }, _aAMBivRf, false);
_PnyIyKsJ = true;
_hwgRQlNu.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _KzLoWSto = await fetch('/api/save-and-get-sub-_ZFMylRPE', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify(_eBdQZwyY)
});
const _VEFfqbuc = await _KzLoWSto.json();
if (_KzLoWSto.ok && _VEFfqbuc.success) {
_aVgTsyir = _VEFfqbuc._ZFMylRPE;
_hwgRQlNu.textContent = `筛选完成!共找到 ${_eBdQZwyY._BKxGrdWY} 个可用IP。`;
} else {
throw new Error(_VEFfqbuc._MhwlvCzj || '保存结果以生成ID时出错');
}
} catch (_xCydVfWL) {
_hwgRQlNu.textContent = `筛选完成!但生成订阅ID失败。`;
_yyqzOdZy(`生成订阅ID失败: ${_xCydVfWL._MhwlvCzj}`, 'error');
}
fetch('/api/cache-live-_LaHpOhNV', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify(_eBdQZwyY)
}).catch(_xCydVfWL => console.error("无法缓存实时结果:", _xCydVfWL));
if (_kpnYRDyR.cloudStorage._PxfEhgmV) {
fetch('/api/save-_KZTmtaHQ', {
method: 'POST',
_VTWxvQwV: { 'Content-Type': 'application/json' },
_RhJzDlxQ: JSON.stringify(_eBdQZwyY)
}).then(_KzLoWSto => {
if (_KzLoWSto.ok) _yyqzOdZy('结果已保存到云端!', 'success');
});
}
} else {
_hwgRQlNu.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _iYGEFTUx() {
if (!_kpnYRDyR.cloudStorage._PxfEhgmV) {
_BYlKDwEl._HSEtCKXW.display = 'none';
return;
}
_hwgRQlNu.textContent = '正在获取上次优选结果...';
try {
const _KUgOgstY = await fetch('/api/get-cached-_KZTmtaHQ');
if (_KUgOgstY.ok) {
const _VEFfqbuc = await _KUgOgstY.json();
if (_VEFfqbuc && _VEFfqbuc._LaHpOhNV && _VEFfqbuc._LaHpOhNV._BKxGrdWY > 0) {
_SZeBcNhF(_VEFfqbuc, _WzHiUxqr, true);
} else {
_BYlKDwEl._HSEtCKXW.display = 'none';
}
}
} catch (_xCydVfWL) {
console.error("加载缓存失败:", _xCydVfWL);
}
}
let _pfnrBoqa;
function _yyqzOdZy(_MhwlvCzj, _eEGkjqFr = 'success', _OQgrUVdh = 3000) {
if (_pfnrBoqa) clearTimeout(_pfnrBoqa);
_hnMrqQTH.innerHTML = _MhwlvCzj;
let _PjtFMosj = 'var(--success-_OVBQuCzh)';
if (_eEGkjqFr === 'error') _PjtFMosj = 'var(--danger-_OVBQuCzh)';
if (_eEGkjqFr === 'warning') _PjtFMosj = 'var(--warning-_OVBQuCzh)';
if (_eEGkjqFr === 'info') _PjtFMosj = 'var(--primary-_OVBQuCzh)';
_hnMrqQTH._HSEtCKXW.backgroundColor = _PjtFMosj;
_hnMrqQTH.classList.add('show');
_pfnrBoqa = setTimeout(() => { _hnMrqQTH.classList.remove('show'); }, _OQgrUVdh);
}
let _BPecAWUl;
function _AYdiqFyg(_OVBQuCzh) {
const _mCSwUsgN = document.getElementById('background-_mCSwUsgN');
if (!_mCSwUsgN || !_mCSwUsgN.getContext) return;
_mCSwUsgN._HSEtCKXW.display = 'block';
const _keflYwWs = _mCSwUsgN.getContext('2d');
let _IVlERQxT, height, particles;
const _PXDLyzJA = _fDimrCeK(_OVBQuCzh);
if (!_PXDLyzJA) return;
const _xUeUqOjq = `${_PXDLyzJA.r},${_PXDLyzJA.g},${_PXDLyzJA.b}`;
const _IBpBZHle = () => {
if (_BPecAWUl) cancelAnimationFrame(_BPecAWUl);
_IVlERQxT = _mCSwUsgN._IVlERQxT = window.innerWidth;
height = _mCSwUsgN.height = window.innerHeight;
particles = Array.from({ _BKxGrdWY: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _IVlERQxT, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_XFaudGkG();
};
const _XFaudGkG = () => {
_keflYwWs.clearRect(0, 0, _IVlERQxT, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _IVlERQxT) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_keflYwWs.beginPath();
_keflYwWs.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_keflYwWs.fillStyle = `rgba(${_xUeUqOjq}, 0.5)`;
_keflYwWs.fill();
});
for (let _uUkhUKtY = 0; _uUkhUKtY < particles._BKxGrdWY; _uUkhUKtY++) {
for (let _ZSFrhxPf = _uUkhUKtY + 1; _ZSFrhxPf < particles._BKxGrdWY; _ZSFrhxPf++) {
const _kDIsOeaL = Math.hypot(particles[_uUkhUKtY].x - particles[_ZSFrhxPf].x, particles[_uUkhUKtY].y - particles[_ZSFrhxPf].y);
if (_kDIsOeaL < 120) {
_keflYwWs.beginPath(); _keflYwWs.moveTo(particles[_uUkhUKtY].x, particles[_uUkhUKtY].y);
_keflYwWs.lineTo(particles[_ZSFrhxPf].x, particles[_ZSFrhxPf].y);
_keflYwWs.strokeStyle = `rgba(${_xUeUqOjq}, ${1 - _kDIsOeaL/120})`;
_keflYwWs.stroke();
}
}
}
_BPecAWUl = requestAnimationFrame(_XFaudGkG);
};
window.addEventListener('resize', _IBpBZHle, { passive: true });
_IBpBZHle();
}
function _dQfIkFBo() {
if (_BPecAWUl) cancelAnimationFrame(_BPecAWUl);
const _mCSwUsgN = document.getElementById('background-_mCSwUsgN');
if (_mCSwUsgN && _mCSwUsgN.getContext('2d')) {
_mCSwUsgN.getContext('2d').clearRect(0, 0, _mCSwUsgN._IVlERQxT, _mCSwUsgN.height);
_mCSwUsgN._HSEtCKXW.display = 'none';
}
}
function _ujpXIPoX() {
const _ejioqtqi = document.getElementById('copySubscriptionBtn');
const _PdjOqUHG = document.getElementById('_omUmroNk');
const _AdYEtdHm = document.getElementById('_RyBBJyhR');
const _roQkELDc = document.getElementById('closeSubModalBtn');
const _OoGDHcvm = _AdYEtdHm.querySelector('.modal-close-btn');
_ejioqtqi.addEventListener('click', () => {
if (!_PnyIyKsJ || _eBdQZwyY._BKxGrdWY === 0) {
_yyqzOdZy('请先完成优选IP测试', 'warning');
return;
}
if (!_aVgTsyir) {
_yyqzOdZy('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_kpnYRDyR._egnAfGgU) {
_yyqzOdZy('管理员未配置Sublink服务地址', 'error');
return;
}
const _ylcLEAvx = 'https://' + window._lCyqZFJg._vFragIfz + '/' + _aVgTsyir;
const _XtQtByxa = {
coreEngine: _ylcLEAvx + 'xr',
coreProfile: _ylcLEAvx + 'si',
configProfile: _ylcLEAvx + 'cl',
policyProfile: _ylcLEAvx + 'su'
};
_PdjOqUHG.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _eEGkjqFr = btn.dataset.subType;
navigator.clipboard.writeText(_XtQtByxa[_eEGkjqFr]).then(() => {
_yyqzOdZy(`${_eEGkjqFr.charAt(0).toUpperCase() + _eEGkjqFr.slice(1)} 订阅链接已复制!`, 'success');
_PdjOqUHG._HSEtCKXW.display = 'none';
});
};
});
_PdjOqUHG.querySelectorAll('._zJywLBNl-btn').forEach(btn => {
btn.onclick = () => {
const _eEGkjqFr = btn.dataset.subType;
const _htTvXMGw = document.getElementById('qrCodeImg');
const _dHJDuMPe = _XtQtByxa[_eEGkjqFr];
if (!_dHJDuMPe) return;
try {
const _zJywLBNl = qrcode(0, 'M');
_zJywLBNl.addData(_dHJDuMPe);
_zJywLBNl.make();
_htTvXMGw.src = _zJywLBNl.createDataURL(10, 2);
_AdYEtdHm._HSEtCKXW.display = 'flex';
} catch(_xCydVfWL) {
_yyqzOdZy('生成二维码失败', 'error');
console.error(_xCydVfWL);
}
};
});
_PdjOqUHG._HSEtCKXW.display = 'flex';
});
_roQkELDc.addEventListener('click', () => { _PdjOqUHG._HSEtCKXW.display = 'none'; });
_PdjOqUHG.addEventListener('click', (_xCydVfWL) => { if(_xCydVfWL.target === _PdjOqUHG) _PdjOqUHG._HSEtCKXW.display = 'none'; });
_AdYEtdHm.addEventListener('click', (_xCydVfWL) => { if(_xCydVfWL.target === _AdYEtdHm) _AdYEtdHm._HSEtCKXW.display = 'none'; });
}
function _nPZyDjCK() {
const _XyQgspaD = {
android: [
{ _nzFYtWSh: 'Karing', _BMXHlQah: 'KaringX/karing', _jlUrWYVW: ['apk', 'universal-release'] },
{ _nzFYtWSh: 'S' + 'ing-Box', _BMXHlQah: 'SagerNet/sing-box', _jlUrWYVW: ['android', 'universal'] },
{ _nzFYtWSh: 'V2' + 'rayNG', _BMXHlQah: '2dust/v2rayNG', _jlUrWYVW: ['apk', 'arm64-v8a'] },
{ _nzFYtWSh: '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: [
{ _nzFYtWSh: 'Karing', fixedUrl: 'https://_ELsyeOgL.apple.com/us/_YewpUjzc/karing/id6472431552?_wkyncmox=iphone' },
{ _nzFYtWSh: 'S' + 'ing-Box', fixedUrl: 'https://_ELsyeOgL.apple.com/us/_YewpUjzc/sing-box-vt/id6673731168' },
{ _nzFYtWSh: 'Shadow' + 'rocket', fixedUrl: 'https://_ELsyeOgL.apple.com/us/_YewpUjzc/shadowrocket/id932747118' },
],
windows: [
{ _nzFYtWSh: 'Karing', _BMXHlQah: 'KaringX/karing', _jlUrWYVW: ['exe', 'x64-setup'] },
{ _nzFYtWSh: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _nzFYtWSh: 'C' + 'lashN', _BMXHlQah: '2dust/clashN', _jlUrWYVW: ['clashN.zip'] },
],
mac: [
{ _nzFYtWSh: 'Karing', fixedUrl: 'https://_ELsyeOgL.apple.com/us/_YewpUjzc/karing/id6472431552?_wkyncmox=mac' },
{ _nzFYtWSh: 'S' + 'ing-Box', fixedUrl: 'https://_ELsyeOgL.apple.com/us/_YewpUjzc/sing-box-vt/id6673731168' },
]
};
function _klMKksmF(_tHpQGhxp) {
if (_kpnYRDyR.streamer._PxfEhgmV && (_tHpQGhxp.includes('github.com') || _tHpQGhxp.includes('cdn.jsdelivr.net'))) {
return window._lCyqZFJg.origin + '/' + _tHpQGhxp.replace('://', ':/');
}
return _tHpQGhxp;
}
async function _KPrQyLkv(_BMXHlQah, _jlUrWYVW) {
try {
const _KUgOgstY = await fetch(_klMKksmF(`https://api.github.com/repos/${_BMXHlQah}/releases/latest`));
if (!_KUgOgstY.ok) return null;
const _VEFfqbuc = await _KUgOgstY.json();
for (const _UKfevAPs of _jlUrWYVW) {
const _LefaHzfF = _VEFfqbuc.assets.find(a => a._nzFYtWSh.toLowerCase().includes(_UKfevAPs.toLowerCase()));
if (_LefaHzfF) return _LefaHzfF.browser_download_url;
}
return null;
} catch (_xCydVfWL) { return null; }
}
async function _nlQDptoZ(_wkyncmox) {
const _ErotTBUB = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_wkyncmox];
_rjxiCLbL.querySelector('#appModalTitle').textContent = `${_ErotTBUB} 客户端下载`;
const _gUwZPZuG = _rjxiCLbL.querySelector('#appModalBody');
_gUwZPZuG.innerHTML = '<span>正在获取最新版本...</span>';
_rjxiCLbL._HSEtCKXW.display = 'flex';
const _ELsyeOgL = _XyQgspaD[_wkyncmox];
let _hGGjqbIj = '';
for (const _YewpUjzc of _ELsyeOgL) {
let _PpjuJgCg = '';
if (_YewpUjzc.fixedUrl) {
_PpjuJgCg = `<a href="${_klMKksmF(_YewpUjzc.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_YewpUjzc.fixedUrl.split('/').pop()}</a>`;
} else if (_YewpUjzc._BMXHlQah) {
const _tHpQGhxp = await _KPrQyLkv(_YewpUjzc._BMXHlQah, _YewpUjzc._jlUrWYVW);
if (_tHpQGhxp) {
_PpjuJgCg = `<a href="${_klMKksmF(_tHpQGhxp)}" target="_blank" rel="noopener noreferrer">${_tHpQGhxp.split('/').pop()}</a>`;
} else {
_PpjuJgCg = '<span>获取失败,请稍后重试。</span>';
}
}
_hGGjqbIj += `<div class="_YewpUjzc-list-_OmoEVAdr"><span class="_YewpUjzc-_nzFYtWSh">${_YewpUjzc._nzFYtWSh}</span><div class="_YewpUjzc-links">${_PpjuJgCg}</div></div>`;
}
_gUwZPZuG.innerHTML = _hGGjqbIj;
}
document.querySelectorAll('._YewpUjzc-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _nlQDptoZ(button.dataset._wkyncmox));
});
_rjxiCLbL.querySelector('.modal-close-btn').addEventListener('click', () => { _rjxiCLbL._HSEtCKXW.display = 'none'; });
_rjxiCLbL.addEventListener('click', (_xCydVfWL) => { if (_xCydVfWL.target === _rjxiCLbL) _rjxiCLbL._HSEtCKXW.display = 'none'; });
}
function _ZFYwWoSc(_JUGMINxG, _ZzJzTxHg) {
let _uUkhUKtY, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_hGGjqbIj");
for (_uUkhUKtY = 0; _uUkhUKtY < tabcontent._BKxGrdWY; _uUkhUKtY++) {
tabcontent[_uUkhUKtY]._HSEtCKXW.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_uUkhUKtY = 0; _uUkhUKtY < tablinks._BKxGrdWY; _uUkhUKtY++) {
tablinks[_uUkhUKtY].className = tablinks[_uUkhUKtY].className.replace(" active", "");
}
document.getElementById(_ZzJzTxHg)._HSEtCKXW.display = "block";
_JUGMINxG.currentTarget.className += " active";
}
function _QEdDoKUc() {
const _crReOhLD = document.createElement('div');
_crReOhLD._ZFMylRPE = 'tooltip-popup';
document._RhJzDlxQ.appendChild(_crReOhLD);
document.addEventListener('click', function(_xCydVfWL) {
const _wwyMCJNg = _xCydVfWL.target.closest('.tooltip-_wwyMCJNg');
if (_wwyMCJNg) {
const _dHJDuMPe = _wwyMCJNg.dataset.tooltip;
_crReOhLD.textContent = _dHJDuMPe;
const _tvqMjwZV = _wwyMCJNg.getBoundingClientRect();
_crReOhLD._HSEtCKXW.display = 'block';
let _QXFxTdzm = _tvqMjwZV.bottom + window.scrollY + 5;
let _tbGHJIRk = _tvqMjwZV._tbGHJIRk + window.scrollX;
_crReOhLD._HSEtCKXW._QXFxTdzm = `${_QXFxTdzm}px`;
_crReOhLD._HSEtCKXW._tbGHJIRk = `${_tbGHJIRk}px`;
const _jycUcYgi = _crReOhLD.getBoundingClientRect();
if (_jycUcYgi.right > window.innerWidth - 10) {
_tbGHJIRk = window.innerWidth - _jycUcYgi._IVlERQxT - 10;
}
if (_jycUcYgi.bottom > window.innerHeight - 10) {
_QXFxTdzm = _tvqMjwZV._QXFxTdzm + window.scrollY - _jycUcYgi.height - 5;
}
_crReOhLD._HSEtCKXW._QXFxTdzm = `${_QXFxTdzm}px`;
_crReOhLD._HSEtCKXW._tbGHJIRk = `${_tbGHJIRk}px`;
_xCydVfWL.stopPropagation();
} else if (_crReOhLD._HSEtCKXW.display === 'block') {
_crReOhLD._HSEtCKXW.display = 'none';
}
});
}
const _HSEtCKXW = document.createElement('_HSEtCKXW');
_HSEtCKXW.textContent = `
.tab-button { background-_OVBQuCzh: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _OVBQuCzh: var(--_dHJDuMPe-light); font-size: 1em; }
.tab-button:hover { background-_OVBQuCzh: var(--border-_OVBQuCzh); }
.tab-button.active { _OVBQuCzh: var(--primary-_OVBQuCzh); border-bottom: 2px solid var(--primary-_OVBQuCzh); }
.tab-_hGGjqbIj { display: none; padding-_QXFxTdzm: 1rem; }
`;
document.head.appendChild(_HSEtCKXW);
window.addEventListener('DOMContentLoaded', _TNBGuYqP);
</script>
</_RhJzDlxQ></html>
`;
}