import { connect } from "cloudflare:sockets";
const _ALzaBYVE = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _YuFjVlZT = ["UpstreamAddress.SG.CMLiussss.net"];
const _wyodLJAJ = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _JNFopdSy = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _TxzzYDSe = '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 _nIMMLLrw = '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 _iUAncyoc(_gudkTzqR) {
if (Array.isArray(_gudkTzqR)) {
try {
return String.fromCharCode.apply(null, _gudkTzqR);
} catch (_PYcZMUbl) {
return '';
}
}
return _gudkTzqR;
}
function _sxOvCWcz(_joTocpFS) {
return /^[0-9a-_aQXUTuMK]{8}-[0-9a-_aQXUTuMK]{4}-[4][0-9a-_aQXUTuMK]{3}-[89ab][0-9a-_aQXUTuMK]{3}-[0-9a-_aQXUTuMK]{12}$/_OEUMmbfs.test(_joTocpFS);
}
const _gvMzdGdo = "optimized_ips_v4";
const _ZhPfndzV = "global_config_v4";
const _FQlqSOke = "admin_password_v4";
const _ceSmBarK = "live_results_temp_v1";
const _usdWqdIi = "latest_sub_id_v1";
export default {
async fetch(_wxjiLWAt, _ObelqQDR, _BYpCteXs) {
try {
if (!_ObelqQDR.DB) {
const _xNdmSiTy = _dfPYIVvF("D1 数据库 'DB' 未绑定。");
return new Response(_xNdmSiTy, { status: 503, _ErTBALIz: { 'Content-Type': '_zAgbeWTG/html;_rDytWtAs=UTF-8' }});
}
_BYpCteXs.waitUntil(
_ObelqQDR.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_OdTxZQdE TEXT PRIMARY KEY, _gudkTzqR TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_joTocpFS TEXT PRIMARY KEY, _yQYkytSl TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_PYcZMUbl => console.error("DB Init Error:", _PYcZMUbl._CmgWzXJB))
);
const _PSJNEttw = new URL(_wxjiLWAt._PSJNEttw);
const _vfcwsRdY = _PSJNEttw.pathname;
const _mnDTSBoZ = _wxjiLWAt._ErTBALIz.get("Upgrade");
const _NphbyHQe = await _HvaJlUXG(_ObelqQDR);
if (_NphbyHQe.websocketStreamer && _NphbyHQe.websocketStreamer._WcKsucyv && _mnDTSBoZ && _mnDTSBoZ.toLowerCase() === "websocket") {
const _lTRcpgsn = _NphbyHQe.websocketStreamer._PSJNEttw;
if (_lTRcpgsn && _lTRcpgsn.trim().startsWith('https://')) {
try {
const _HAAVooJi = new Request(_lTRcpgsn.trim() + _PSJNEttw.pathname + _PSJNEttw.search, _wxjiLWAt);
return await fetch(_HAAVooJi);
} catch (_PYcZMUbl) {
return new Response(`Upstream WebSocket gateway failed: ${_PYcZMUbl._CmgWzXJB}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_mnDTSBoZ && _mnDTSBoZ.toLowerCase() === "websocket") {
return await _VFurGYta(_wxjiLWAt, _ObelqQDR, _NphbyHQe);
}
const _zIsxvYxq = _vfcwsRdY._DSHWYVBc(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_zIsxvYxq) {
const [, _pNQffmYd, typeSuffix] = _zIsxvYxq;
const _PtDFrgDq = _NphbyHQe._PtDFrgDq;
if (!_PtDFrgDq || _PtDFrgDq.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' } });
}
const _JyiaFAVw = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _wJCFYazC = _JyiaFAVw[typeSuffix];
const _OjhmZXlK = _PtDFrgDq.replace(/\/$/, '');
const _kRiXCsPX = `${_PSJNEttw.origin}/${_pNQffmYd}`;
const _tpzUWqjy = `${_OjhmZXlK}/${_wJCFYazC}?_NphbyHQe=${encodeURIComponent(_kRiXCsPX)}`;
try {
const _FgNFLThy = await fetch(_tpzUWqjy, { _ErTBALIz: { 'User-Agent': _wxjiLWAt._ErTBALIz.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _aedJNvij = new Headers(_FgNFLThy._ErTBALIz);
_aedJNvij._dUmxTpdC('Access-Control-Allow-Origin', '*');
return new Response(_FgNFLThy._BkcxYVCU, { status: _FgNFLThy.status, statusText: _FgNFLThy.statusText, _ErTBALIz: _aedJNvij });
} catch (_PYcZMUbl) {
return new Response(`获取上游订阅失败: ${_PYcZMUbl._CmgWzXJB}`, { status: 502, _ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' } });
}
}
if (_vfcwsRdY.startsWith('/https:/') || _vfcwsRdY.startsWith('/http:/')) {
return _IrPhYAQv(_wxjiLWAt, _NphbyHQe);
}
if (_NphbyHQe.customSubPath && _NphbyHQe.customSubPath._WcKsucyv && _NphbyHQe.customSubPath._vfcwsRdY && _vfcwsRdY === '/' + _NphbyHQe.customSubPath._vfcwsRdY.trim()) {
const _yamuSLBz = _ObelqQDR.DB.prepare("SELECT _gudkTzqR FROM kv_data WHERE _OdTxZQdE = ?").bind(_usdWqdIi);
const { _etOvATbc } = await _yamuSLBz.all();
const _SFFqRkOf = _etOvATbc._buUZGShz > 0 ? _etOvATbc[0]._gudkTzqR : null;
if (_SFFqRkOf) {
return _AsoIUNdP({ _WjEdJdwh: { _joTocpFS: _SFFqRkOf }, _PSJNEttw: _wxjiLWAt._PSJNEttw }, _ObelqQDR);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' } });
}
}
const _OqRGsALW = _vfcwsRdY.split('/').filter(Boolean);
if (_OqRGsALW._buUZGShz === 1 && !_vfcwsRdY.startsWith('/api/')) {
const _pNQffmYd = _OqRGsALW[0];
return _AsoIUNdP({ _WjEdJdwh: { _joTocpFS: _pNQffmYd }, _PSJNEttw: _wxjiLWAt._PSJNEttw }, _ObelqQDR);
}
if (_vfcwsRdY.startsWith('/api/')) {
if (_vfcwsRdY === '/api/_NphbyHQe' && _wxjiLWAt.method === 'POST') return _EpotYXDi(_wxjiLWAt, _ObelqQDR, _BYpCteXs);
if (_vfcwsRdY === '/api/_dUmxTpdC-_NnlYFPVr') return _iOfOhLCb(_wxjiLWAt, _ObelqQDR);
if (_vfcwsRdY === '/api/change-_NnlYFPVr') return _NfmAPTZK(_wxjiLWAt, _ObelqQDR);
if (_vfcwsRdY === '/api/verify-_NnlYFPVr') return _KwOCwbUE(_wxjiLWAt, _ObelqQDR);
if (_vfcwsRdY === '/api/verify-visitor-_NnlYFPVr' && _wxjiLWAt.method === 'POST') return _lkBjrLOM(_wxjiLWAt, _ObelqQDR);
if (_vfcwsRdY === '/api/cache-live-_etOvATbc' && _wxjiLWAt.method === 'POST') return _mIWtUYmF(_wxjiLWAt, _ObelqQDR, _BYpCteXs);
if (_vfcwsRdY === '/api/get-_eUSpMMAc' && _wxjiLWAt.method === 'POST') return _GbMsNsgY(_wxjiLWAt, _ObelqQDR);
if (_vfcwsRdY === '/api/get-cached-_DXSpaMDv') return _gIUJyoAD(_wxjiLWAt, _ObelqQDR);
if (_vfcwsRdY === '/api/save-_DXSpaMDv') return _BdXCZELn(_wxjiLWAt, _ObelqQDR, _BYpCteXs);
if (_vfcwsRdY === '/api/save-and-get-sub-_joTocpFS' && _wxjiLWAt.method === 'POST') return _aJtGxqNn(_wxjiLWAt, _ObelqQDR);
if (_vfcwsRdY.startsWith('/api/get-_wxnqQFal/')) {
const _pNQffmYd = _vfcwsRdY.split('/').pop();
return _AsoIUNdP({ _WjEdJdwh: { _joTocpFS: _pNQffmYd }, _PSJNEttw: _wxjiLWAt._PSJNEttw }, _ObelqQDR);
}
if (_vfcwsRdY === '/api/_NphbyHQe' && _wxjiLWAt.method === 'GET') return _JQIottTi(_ObelqQDR);
if (_vfcwsRdY === '/api/get-resolved-_DXSpaMDv') return _jilAxNqt(_wxjiLWAt);
if (_vfcwsRdY === '/api/parse-_DXSpaMDv-from-_zKgDFqtN' && _wxjiLWAt.method === 'POST') return _RsFVmHng(_wxjiLWAt, _ObelqQDR);
if (_vfcwsRdY === '/api/endpoints') return _mcvFqnKo(_wxjiLWAt, _ObelqQDR);
if (_vfcwsRdY === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_vfcwsRdY === '/_SXgiuKqH') return _ISLBXkGy(_wxjiLWAt, _ObelqQDR);
if (_vfcwsRdY === '/bing-wallpaper') return _ULSDJcTn();
return _UWDbfgEd(_wxjiLWAt, _ObelqQDR, _BYpCteXs);
} catch (err) {
let _PYcZMUbl = err;
return new Response(_PYcZMUbl.toString(), { status: 500 });
}
}
};
const _XLRlcmTF = { 'Accept': '_zAgbeWTG/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 _eyCGiJYb(_PSJNEttw, _hLPmOdMw) {
const _fjiAUfpp = await fetch(_PSJNEttw, { _ErTBALIz: { ..._XLRlcmTF, 'Referer': _hLPmOdMw.referer } });
if (_fjiAUfpp.ok) return _fjiAUfpp._zAgbeWTG();
return null;
}
async function _NAIOJKpX(_PSJNEttw, _hLPmOdMw) {
const _IidVQVNw = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_PSJNEttw)}`;
const _fjiAUfpp = await fetch(_IidVQVNw, { _ErTBALIz: { ..._XLRlcmTF, 'Referer': _hLPmOdMw.referer } });
if (!_fjiAUfpp.ok) return null;
const _BkcxYVCU = await _fjiAUfpp._zAgbeWTG();
const _DSHWYVBc = _BkcxYVCU._DSHWYVBc(/<pre[^>]*>([\s\S]*?)<\/pre>/_OEUMmbfs);
return _DSHWYVBc && _DSHWYVBc[1] ? _DSHWYVBc[1].replace(/&/g, '&') : null;
}
function _cUYoeAvu(_WtZkTPKQ) {
let _OrCRxboN;
try {
_OrCRxboN = atob(_WtZkTPKQ.replace(/\s/g, ''));
} catch (_PYcZMUbl) {
_OrCRxboN = _WtZkTPKQ;
}
const _wxnqQFal = _OrCRxboN.split(/[\s\n\r,]+/).filter(line => line.trim());
const _tpWKOGrd = new Set();
const _TxYeLuDV = /@([^?#]+?):(\d+)/;
for (const _hazZZzxP of _wxnqQFal) {
let _yTzFvNTF = '';
let _STTIXetB = '';
try {
if (_hazZZzxP.startsWith('vmess://')) {
const _cxlrRxWr = atob(_hazZZzxP.substring(8));
const _NphbyHQe = JSON.parse(_cxlrRxWr);
_yTzFvNTF = _NphbyHQe.add;
_STTIXetB = _NphbyHQe._STTIXetB;
} else {
const _DSHWYVBc = _hazZZzxP._DSHWYVBc(_TxYeLuDV);
if (_DSHWYVBc && _DSHWYVBc[1] && _DSHWYVBc[2]) {
_yTzFvNTF = _DSHWYVBc[1].replace(/[\[\]]/g, '');
_STTIXetB = _DSHWYVBc[2];
}
}
} catch (_PYcZMUbl) {
console.warn(`Could not parse _hazZZzxP: ${_hazZZzxP}`);
}
if (_yTzFvNTF && _STTIXetB) {
_tpWKOGrd.add(`${_yTzFvNTF}:${_STTIXetB}`);
}
}
return Array.from(_tpWKOGrd);
}
async function _ApYnIJNx(_VlfDrLLM) {
try {
const _fjiAUfpp = await fetch(_VlfDrLLM, { _ErTBALIz: _XLRlcmTF });
if (!_fjiAUfpp.ok) {
console.error(`Failed to fetch subscription: ${_fjiAUfpp.status}`);
return [];
}
const _WtZkTPKQ = await _fjiAUfpp._zAgbeWTG();
return _cUYoeAvu(_WtZkTPKQ);
} catch (error) {
console.error(`Error processing subscription ${_VlfDrLLM}:`, error);
return [];
}
}
async function _ENYDFdxJ(_bfQessFD) {
const _vslqJvqx = _bfQessFD.trim();
const _MIYSaaXd = /^(vless|vmess|trojan|ss):\/\//.test(_vslqJvqx);
const _bTXpjoTT = (() => {
if (_vslqJvqx._buUZGShz < 20 || _vslqJvqx.startsWith('http')) return false;
const _XczAdaeu = _vslqJvqx.replace(/\s/g, '');
if (_XczAdaeu._buUZGShz % 4 !== 0 && !_XczAdaeu.includes('=')) return false;
try {
atob(_XczAdaeu);
return true;
} catch (_PYcZMUbl) {
return false;
}
})();
if (_MIYSaaXd || _bTXpjoTT) {
return _cUYoeAvu(_vslqJvqx).join('\n');
}
const _gjDWamYT = [
'https://ipdb.api.030101.xyz/?_BeXfIBhp=bestcf&_cHPhvqEd=true',
'https://ipdb.api.030101.xyz/?_BeXfIBhp=bestproxy&_cHPhvqEd=true'
];
const _JUaicDSx = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_OEUMmbfs.test(_bfQessFD) || _bfQessFD.includes('?_bOvLeAhR=');
if (_JUaicDSx) {
const _DXSpaMDv = await _ApYnIJNx(_bfQessFD);
return _DXSpaMDv.join('\n');
}
let _WtZkTPKQ = '';
if (_gjDWamYT.includes(_bfQessFD)) {
_WtZkTPKQ = await _eyCGiJYb(_bfQessFD, { referer: _bfQessFD });
if (!_WtZkTPKQ || _WtZkTPKQ._buUZGShz < 8) {
_WtZkTPKQ = await _NAIOJKpX(_bfQessFD, { referer: _bfQessFD });
}
} else {
try {
const _XkPafhpX = await fetch(_bfQessFD, { _ErTBALIz: { 'User-Agent': 'Cloudflare-Worker' } });
if (_XkPafhpX.ok) {
_WtZkTPKQ = await _XkPafhpX._zAgbeWTG();
} else {
console.warn(`Failed to fetch URL ${_bfQessFD}: ${_XkPafhpX.status}`);
}
} catch (_PYcZMUbl) {
console.error(`Error fetching URL ${_bfQessFD}:`, _PYcZMUbl);
}
}
const _uXrVQkOc = _cUYoeAvu(_WtZkTPKQ);
if (_uXrVQkOc._buUZGShz > 0) {
return _uXrVQkOc.join('\n');
}
return _WtZkTPKQ || '';
}
async function _IrPhYAQv(_wxjiLWAt, _NphbyHQe) {
if (!_NphbyHQe.streamer._WcKsucyv) {
return new Response('远程流功能未开启', { status: 403 });
}
const _PSJNEttw = new URL(_wxjiLWAt._PSJNEttw);
const _awJbxIET = _PSJNEttw.pathname.substring(1).replace(':/', '://');
try {
const _tpzUWqjy = new URL(_awJbxIET);
const _PaIeZjmm = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_PaIeZjmm.some(domain => _tpzUWqjy._yTzFvNTF.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _tVmUCqdD = new Headers(_wxjiLWAt._ErTBALIz);
_tVmUCqdD._dUmxTpdC('Host', _tpzUWqjy._yTzFvNTF);
_tVmUCqdD._dUmxTpdC('User-Agent', 'CF-Worker-Streamer/1.0');
const _eJIWqPEq = await fetch(_tpzUWqjy.toString(), {
method: _wxjiLWAt.method,
_ErTBALIz: _tVmUCqdD,
_BkcxYVCU: _wxjiLWAt._BkcxYVCU,
});
const _aedJNvij = new Headers(_eJIWqPEq._ErTBALIz);
_aedJNvij._dUmxTpdC('Access-Control-Allow-Origin', '*');
_aedJNvij._dUmxTpdC('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_aedJNvij._dUmxTpdC('Access-Control-Allow-Headers', '*');
_aedJNvij._dUmxTpdC('Cache-Control', 'public, max-age=86400');
_aedJNvij._dUmxTpdC('X-Streamer-Source', 'CF-Worker');
_aedJNvij.delete('_WtZkTPKQ-security-policy');
_aedJNvij.delete('x-_WtZkTPKQ-security-policy');
_aedJNvij.delete('x-webkit-csp');
return new Response(_eJIWqPEq._BkcxYVCU, {
status: _eJIWqPEq.status,
statusText: _eJIWqPEq.statusText,
_ErTBALIz: _aedJNvij,
});
} catch (_PYcZMUbl) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _VFurGYta(_wxjiLWAt, _ObelqQDR, _NphbyHQe) {
try {
const _AkmeWvxU = _NphbyHQe || await _HvaJlUXG(_ObelqQDR);
const _WRZUAEeH = (_AkmeWvxU.itemLink._QuTsIToJ && _AkmeWvxU.itemLink._QuTsIToJ[0]) || {};
const _lpmXSnIX = _WRZUAEeH['_bOvLeAhR'] || _iUAncyoc(_ALzaBYVE);
if (!_sxOvCWcz(_lpmXSnIX)) {
throw new Error("Configured user _ugrTymIt is not valid.");
}
const _FdTJPPvA = _AkmeWvxU.dataFeeds.universalFallbackAddress;
let _dmhELFJh = {};
const _apGLalCe = _iUAncyoc(_YuFjVlZT[0] || "");
if (_FdTJPPvA) {
const [_TXGWBDeK, _STTIXetB = '443'] = _FdTJPPvA.split(':');
_dmhELFJh = { _TXGWBDeK, _STTIXetB };
} else {
const [_TXGWBDeK, _STTIXetB = '443'] = _apGLalCe.split(':');
_dmhELFJh = { _TXGWBDeK, _STTIXetB };
}
const _PSJNEttw = new URL(_wxjiLWAt._PSJNEttw);
const _vfcwsRdY = _PSJNEttw.pathname;
let _JMiAtVRP = '';
const _IXYsYUff = _PSJNEttw.searchParams.get('remote');
if (_IXYsYUff) {
_JMiAtVRP = atob(_IXYsYUff);
} else if (_vfcwsRdY.startsWith('/endpoint=')) {
_JMiAtVRP = _vfcwsRdY.substring(10);
} else if (_vfcwsRdY._buUZGShz > 1 && _vfcwsRdY.substring(1).includes('.')) {
_JMiAtVRP = _vfcwsRdY.substring(1);
}
if (_JMiAtVRP) {
const [_TXGWBDeK, _STTIXetB = '443'] = _JMiAtVRP.split(':');
_dmhELFJh = { _TXGWBDeK, _STTIXetB };
}
return await _MMeHmmvB(_wxjiLWAt, _lpmXSnIX, _dmhELFJh);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _MMeHmmvB(_wxjiLWAt, _ugrTymIt, _dmhELFJh) {
const _vpiwUUHv = new WebSocketPair();
const [clientEnd, _uVYoRWMW] = Object.values(_vpiwUUHv);
_uVYoRWMW.accept();
let _ObTUJyqg = { _pvWGbPKL: null };
const _CgYYBjaS = _wxjiLWAt._ErTBALIz.get("sec-websocket-protocol") || "";
const _jxCuYxmT = _LbUcpCOF(_uVYoRWMW, _CgYYBjaS);
_jxCuYxmT.pipeTo(new WritableStream({
async write(chunk) {
if (_ObTUJyqg._pvWGbPKL) {
const _RunAuwwJ = _ObTUJyqg._pvWGbPKL.writable.getWriter();
await _RunAuwwJ.write(chunk);
_RunAuwwJ.releaseLock();
return;
}
const { error, details } = await _LeAlOmQW(chunk, _ugrTymIt);
if (error) {
throw new Error(details);
}
const _aPVMbDnP = new Uint8Array([details._injfSPhy[0], 0]);
const _NynETyrh = chunk.slice(details.payloadIndex);
await _QVpLgukq(_ObTUJyqg, details._vTSmrXLg, details._WXZnMZzq, _NynETyrh, _uVYoRWMW, _aPVMbDnP, _dmhELFJh);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_PJxcnsZV(_uVYoRWMW);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _QVpLgukq(_ObTUJyqg, _vTSmrXLg, _WXZnMZzq, _BPbeOnLZ, _yRtQtaLZ, _aPVMbDnP, _PwsBWAsB) {
const _ykLrlmiT = async (_TXGWBDeK, _STTIXetB) => {
let _bWYxzdhR = _TXGWBDeK;
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(_TXGWBDeK)) {
_bWYxzdhR = `${atob('d3d3Lg==')}${_TXGWBDeK}${atob('LnNzbGlwLmlv')}`;
}
const _pvWGbPKL = connect({ _yTzFvNTF: _bWYxzdhR, _STTIXetB });
_ObTUJyqg._pvWGbPKL = _pvWGbPKL;
const _RunAuwwJ = _pvWGbPKL.writable.getWriter();
await _RunAuwwJ.write(_BPbeOnLZ);
_RunAuwwJ.releaseLock();
return _pvWGbPKL;
};
const _uMvREqPq = async () => {
if (!_PwsBWAsB._TXGWBDeK) return;
console.log(`Direct connection failed, falling back to gateway: ${_PwsBWAsB._TXGWBDeK}`);
const _pNuruCsC = await _ykLrlmiT(_PwsBWAsB._TXGWBDeK, parseInt(_PwsBWAsB._STTIXetB, 10));
_pNuruCsC.closed.catch(() => {}).finally(() => _PJxcnsZV(_yRtQtaLZ));
_VqLYbQvL(_pNuruCsC, _yRtQtaLZ, _aPVMbDnP, null);
};
try {
const _yIxfbzvi = await _ykLrlmiT(_vTSmrXLg, _WXZnMZzq);
_VqLYbQvL(_yIxfbzvi, _yRtQtaLZ, _aPVMbDnP, _uMvREqPq);
} catch (err) {
console.error("Primary connection failed:", err);
await _uMvREqPq();
}
}
function _LbUcpCOF(_uVYoRWMW, _CgYYBjaS) {
let _xXWEzkdf = false;
return new ReadableStream({
start(_eHfPCVJN) {
_uVYoRWMW.addEventListener("_CmgWzXJB", (event) => { if (_xXWEzkdf) return; _eHfPCVJN.enqueue(event._yQYkytSl); });
_uVYoRWMW.addEventListener("close", () => { _PJxcnsZV(_uVYoRWMW); if (_xXWEzkdf) return; _eHfPCVJN.close(); });
_uVYoRWMW.addEventListener("error", (err) => _eHfPCVJN.error(err));
if (_CgYYBjaS) {
try {
const _uGaaMqdo = atob(_CgYYBjaS.replace(/-/g, "+").replace(/_/g, "/"));
_eHfPCVJN.enqueue(Uint8Array.from(_uGaaMqdo, c => c.charCodeAt(0))._Qntkyepq);
} catch (_PYcZMUbl) { console.error("Failed to decode early _yQYkytSl:", _PYcZMUbl); }
}
},
cancel() { _xXWEzkdf = true; _PJxcnsZV(_uVYoRWMW); },
});
}
async function _LeAlOmQW(_Qntkyepq, _ugrTymIt) {
if (_Qntkyepq.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _injfSPhy = new Uint8Array(_Qntkyepq.slice(0, 1));
const _chYjSxfP = _QXBJMxAx(new Uint8Array(_Qntkyepq.slice(1, 17)));
if (_chYjSxfP !== _ugrTymIt) return { error: true, details: "Invalid _ugrTymIt" };
const _qsReUWOc = new Uint8Array(_Qntkyepq.slice(17, 18))[0];
const _vefxKRXv = new Uint8Array(_Qntkyepq.slice(18 + _qsReUWOc, 19 + _qsReUWOc))[0];
if (_vefxKRXv !== 1) return { error: true, details: `Unsupported _vefxKRXv: ${_vefxKRXv}` };
const _tgOWhZwI = 19 + _qsReUWOc;
const _WXZnMZzq = new DataView(_Qntkyepq.slice(_tgOWhZwI, _tgOWhZwI + 2)).getUint16(0);
let _SMzmkfwJ = _tgOWhZwI + 2;
const _ofIUdTow = new Uint8Array(_Qntkyepq.slice(_SMzmkfwJ, _SMzmkfwJ + 1))[0];
let _pVujVSvi = 0;
let _PIAHppEl = _SMzmkfwJ + 1;
let _vTSmrXLg = "";
switch (_ofIUdTow) {
case 1: _pVujVSvi = 4; _vTSmrXLg = new Uint8Array(_Qntkyepq.slice(_PIAHppEl, _PIAHppEl + _pVujVSvi)).join("."); break;
case 2: _pVujVSvi = new Uint8Array(_Qntkyepq.slice(_PIAHppEl, _PIAHppEl + 1))[0]; _PIAHppEl++; _vTSmrXLg = new TextDecoder().decode(_Qntkyepq.slice(_PIAHppEl, _PIAHppEl + _pVujVSvi)); break;
case 3: _pVujVSvi = 16; const _ISDQIqTj = new DataView(_Qntkyepq.slice(_PIAHppEl, _PIAHppEl + _pVujVSvi)); const _gwihScoG = []; for (let _OEUMmbfs = 0; _OEUMmbfs < 8; _OEUMmbfs++) _gwihScoG.push(_ISDQIqTj.getUint16(_OEUMmbfs * 2).toString(16)); _vTSmrXLg = _gwihScoG.join(":"); break;
default: return { error: true, details: `Invalid _rbiEKUca _BeXfIBhp: ${_ofIUdTow}` };
}
if (!_vTSmrXLg) return { error: true, details: "Target _TXGWBDeK is empty" };
return { error: false, details: { _vTSmrXLg, _WXZnMZzq, _injfSPhy, payloadIndex: _PIAHppEl + _pVujVSvi } };
}
async function _VqLYbQvL(_pvWGbPKL, _yRtQtaLZ, _OAoAOLwG, _GOTerzug) {
let _JRYqDyNh = _OAoAOLwG;
let _jSqdOBxA = false;
let _vzMEZJhK = _pvWGbPKL._jxCuYxmT.pipeTo(new WritableStream({
write(chunk) {
_jSqdOBxA = true;
if (_yRtQtaLZ.readyState !== 1) throw new Error("Channel is not open");
if (_JRYqDyNh) {
const _XpyfXqnp = new Uint8Array(_JRYqDyNh.byteLength + chunk.byteLength);
_XpyfXqnp._dUmxTpdC(new Uint8Array(_JRYqDyNh));
_XpyfXqnp._dUmxTpdC(new Uint8Array(chunk), _JRYqDyNh.byteLength);
_yRtQtaLZ.send(_XpyfXqnp._Qntkyepq);
_JRYqDyNh = null;
} else {
_yRtQtaLZ.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _yRtQtaLZ error:", err._CmgWzXJB);
});
await _vzMEZJhK;
if (!_jSqdOBxA && _GOTerzug) {
_GOTerzug();
}
}
function _PJxcnsZV(_yRtQtaLZ) {
try { if (_yRtQtaLZ.readyState === 1 || _yRtQtaLZ.readyState === 2) _yRtQtaLZ.close(); } catch (_PYcZMUbl) {}
}
const _pChpjjSx = Array.from({ _buUZGShz: 256 }, (_, _OEUMmbfs) => (_OEUMmbfs + 256).toString(16).slice(1));
function _QXBJMxAx(_oBrWMHAB, offset = 0) {
return (
_pChpjjSx[_oBrWMHAB[offset]] + _pChpjjSx[_oBrWMHAB[offset + 1]] + _pChpjjSx[_oBrWMHAB[offset + 2]] + _pChpjjSx[_oBrWMHAB[offset + 3]] + "-" +
_pChpjjSx[_oBrWMHAB[offset + 4]] + _pChpjjSx[_oBrWMHAB[offset + 5]] + "-" +
_pChpjjSx[_oBrWMHAB[offset + 6]] + _pChpjjSx[_oBrWMHAB[offset + 7]] + "-" +
_pChpjjSx[_oBrWMHAB[offset + 8]] + _pChpjjSx[_oBrWMHAB[offset + 9]] + "-" +
_pChpjjSx[_oBrWMHAB[offset + 10]] + _pChpjjSx[_oBrWMHAB[offset + 11]] +
_pChpjjSx[_oBrWMHAB[offset + 12]] + _pChpjjSx[_oBrWMHAB[offset + 13]] +
_pChpjjSx[_oBrWMHAB[offset + 14]] + _pChpjjSx[_oBrWMHAB[offset + 15]]
).toLowerCase();
}
let _jWGdUbdE = { "N/A":"未知" };
async function _JxUdHkkK(_PSJNEttw, _Srvhsvyh, _GOTerzug) {
try {
const _fjiAUfpp = await fetch(_PSJNEttw, {
_ErTBALIz: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_fjiAUfpp.ok) {
console.error(`获取 ${_PSJNEttw} 失败: HTTP ${_fjiAUfpp.status}`);
return _GOTerzug;
}
const _zAgbeWTG = await _fjiAUfpp._zAgbeWTG();
return _Srvhsvyh(_zAgbeWTG);
} catch (error) {
console.error(`获取或解析 ${_PSJNEttw} 时发生网络错误: ${error._CmgWzXJB}`);
return _GOTerzug;
}
}
function _IfhjtQMr(_zAgbeWTG) {
if (!_zAgbeWTG) return [];
const _SGumnTek = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _eXfXXLIJ = _zAgbeWTG.split(/[\s,;#|]+/);
const _UIBiXYvz = [];
for (const _ARbMpOik of _eXfXXLIJ) {
const _CxsVOtHS = _ARbMpOik.trim();
if (!_CxsVOtHS) continue;
const _qoYdUsTJ = _CxsVOtHS.lastIndexOf(':');
let _SUQWloIQ = _CxsVOtHS;
if(_qoYdUsTJ > _CxsVOtHS.lastIndexOf(']')) {
const _EicEMCuC = _CxsVOtHS.substring(_qoYdUsTJ + 1);
if(!isNaN(_EicEMCuC) && _EicEMCuC._buUZGShz > 0) {
_SUQWloIQ = _CxsVOtHS.substring(0, _qoYdUsTJ);
}
}
if (_gWTrqJkR.isValid(_SUQWloIQ.replace(/[\[\]]/g, '')) || _SGumnTek.test(_CxsVOtHS)) {
_UIBiXYvz.push(_CxsVOtHS);
}
}
return _UIBiXYvz;
}
function _fytHKPer(_zAgbeWTG) {
if (!_zAgbeWTG) return [];
return _zAgbeWTG.split(/\s+/).filter(d => d.trim() !== '');
}
function _BtnPejVZ(_zAgbeWTG) {
if (!_zAgbeWTG) return { "N/A": "未知" };
try {
return JSON.parse(`{${_zAgbeWTG}}`);
} catch (_PYcZMUbl) {
console.error("解析 _jWGdUbdE 失败:", _PYcZMUbl);
return { "N/A": "未知" };
}
}
const _gWTrqJkR = {
isValid: (_SXgiuKqH) => _gWTrqJkR.isIPv4(_SXgiuKqH) || _gWTrqJkR.isIPv6(_SXgiuKqH),
isIPv4: (_SXgiuKqH) => {
if (typeof _SXgiuKqH !== 'string') return false;
const _gwihScoG = _SXgiuKqH.split('.');
if (_gwihScoG._buUZGShz !== 4) return false;
return _gwihScoG.every(_YePsxUmE => {
const _hPrdgEAP = parseInt(_YePsxUmE, 10);
return !isNaN(_hPrdgEAP) && _hPrdgEAP >= 0 && _hPrdgEAP <= 255 && String(_hPrdgEAP) === _YePsxUmE;
});
},
isIPv6: (_SXgiuKqH) => {
if (typeof _SXgiuKqH !== '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]))$/_OEUMmbfs.test(_SXgiuKqH);
},
toLong4: (_SXgiuKqH) => _SXgiuKqH.split('.').reduce((acc, octet, _OEUMmbfs) => acc + (parseInt(octet) << (8*(3-_OEUMmbfs))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_SXgiuKqH) => {
try {
const _IlqNhKRb = _SXgiuKqH.split('/')[0];
const _gwihScoG = _IlqNhKRb.split('::');
if (_gwihScoG._buUZGShz > 2) return 0n;
let _HpvBDziL = [];
if (_gwihScoG[0]) {
_HpvBDziL = _gwihScoG[0].split(':');
}
let _LuFPiWLC = [];
if (_gwihScoG._buUZGShz > 1 && _gwihScoG[1]) {
_LuFPiWLC = _gwihScoG[1].split(':');
}
if (_HpvBDziL._buUZGShz + _LuFPiWLC._buUZGShz > 8) return 0n;
const _rlTdKjBa = 8 - (_HpvBDziL._buUZGShz + _LuFPiWLC._buUZGShz);
const _QRoDxExd = [
..._HpvBDziL,
...Array(_rlTdKjBa).fill('0'),
..._LuFPiWLC
].map(_YePsxUmE => _YePsxUmE || '0');
while(_QRoDxExd._buUZGShz < 8) {
_QRoDxExd.push('0');
}
let _juaTMOOw = 0n;
for (const _YePsxUmE of _QRoDxExd) {
if (_YePsxUmE._buUZGShz > 4) return 0n;
const _gudkTzqR = BigInt('0x' + _YePsxUmE);
_juaTMOOw = (_juaTMOOw << 16n) | _gudkTzqR;
}
return _juaTMOOw;
} catch(_PYcZMUbl) {
return 0n;
}
},
fromBigInt6: (_juaTMOOw) => {
if (typeof _juaTMOOw !== '_juaTMOOw' || _juaTMOOw < 0n) return null;
const _gwihScoG = [];
for (let _OEUMmbfs = 0; _OEUMmbfs < 8; _OEUMmbfs++) {
_gwihScoG.unshift((_juaTMOOw & 0xFFFFn).toString(16));
_juaTMOOw >>= 16n;
}
let _fMPFokio = { start: -1, _EbIxBbxA: 0 };
let _eJHOABWR = { start: -1, _EbIxBbxA: 0 };
for (let _OEUMmbfs = 0; _OEUMmbfs < 8; _OEUMmbfs++) {
if (_gwihScoG[_OEUMmbfs] === '0') {
if (_eJHOABWR.start === -1) _eJHOABWR.start = _OEUMmbfs;
_eJHOABWR._EbIxBbxA++;
} else {
if (_eJHOABWR._EbIxBbxA > _fMPFokio._EbIxBbxA) _fMPFokio = { ..._eJHOABWR };
_eJHOABWR = { start: -1, _EbIxBbxA: 0 };
}
}
if (_eJHOABWR._EbIxBbxA > _fMPFokio._EbIxBbxA) _fMPFokio = { ..._eJHOABWR };
if (_fMPFokio._EbIxBbxA > 1) {
_gwihScoG.splice(_fMPFokio.start, _fMPFokio._EbIxBbxA, '');
if (_fMPFokio.start === 0) _gwihScoG.unshift('');
if (_fMPFokio.start + _fMPFokio._EbIxBbxA === 8) _gwihScoG.push('');
}
return _gwihScoG.join(':');
},
cidrToRange: (cidr, _VKFstGtG = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _jglzTJuE = parseInt(bitsStr, 10);
const _DXSpaMDv = new Set();
if (_gWTrqJkR.isIPv4(range)) {
if (isNaN(_jglzTJuE) || _jglzTJuE < 8 || _jglzTJuE > 32) return [];
if (_jglzTJuE === 32) return [range];
const _VAkZkplG = _gWTrqJkR.toLong4(range);
const _qysEFnCP = (0xFFFFFFFF << (32 - _jglzTJuE)) >>> 0;
const _hOmoKFUA = _VAkZkplG & _qysEFnCP;
const _CAVxhkUt = 1 << (32 - _jglzTJuE);
if (_CAVxhkUt <= 2) return [];
const _gLevWZVP = Math.min(_VKFstGtG, _CAVxhkUt - 2);
let _vNLQojTA = 0;
while (_DXSpaMDv.size < _gLevWZVP && _vNLQojTA < _gLevWZVP * 5) {
const _OVuBwKgv = Math.floor(Math.random() * (_CAVxhkUt - 2)) + 1;
_DXSpaMDv.add(_gWTrqJkR.fromLong4((_hOmoKFUA + _OVuBwKgv) >>> 0));
_vNLQojTA++;
}
return Array.from(_DXSpaMDv);
} else if (_gWTrqJkR.isIPv6(range)) {
if (isNaN(_jglzTJuE) || _jglzTJuE < 16 || _jglzTJuE > 128) return [];
if (_jglzTJuE === 128) return [range];
const _fgpOBYPH = _gWTrqJkR.toBigInt6(range);
const _qysEFnCP = (2n ** BigInt(128 - _jglzTJuE) - 1n);
const _hOmoKFUA = _fgpOBYPH & ~_qysEFnCP;
const _XMhhdWyx = 2n ** BigInt(128 - _jglzTJuE);
if (_XMhhdWyx <= 2n) return [];
let _vNLQojTA = 0;
while (_DXSpaMDv.size < _VKFstGtG && _vNLQojTA < _VKFstGtG * 5) {
const _IbMpwHML = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_IbMpwHML);
let _IvBSNLKH = 0n;
for (const _hZPmimGt of _IbMpwHML) {
_IvBSNLKH = (_IvBSNLKH << 8n) | BigInt(_hZPmimGt);
}
const _OVuBwKgv = _IvBSNLKH % (_XMhhdWyx - 2n) + 1n;
_DXSpaMDv.add(_gWTrqJkR.fromBigInt6(_hOmoKFUA + _OVuBwKgv));
_vNLQojTA++;
}
return Array.from(_DXSpaMDv);
}
return [];
} catch(_PYcZMUbl) {
console.error(`CIDR to range failed for ${cidr}:`, _PYcZMUbl);
return [];
}
}
};
function _dwhnBvgI(_UuDbTJRi, _ojKOktnn) {
const _GnFJoGgp = {};
const _jfrfcGXG = Object._jfrfcGXG(_ojKOktnn);
const _gwihScoG = _jfrfcGXG.map(_OdTxZQdE => {
const _JvcFykSp = _UuDbTJRi * (_ojKOktnn[_OdTxZQdE] / 100);
return { _OdTxZQdE, _VKFstGtG: Math.floor(_JvcFykSp), remainder: _JvcFykSp - Math.floor(_JvcFykSp) };
});
let _RAEGdznj = _gwihScoG.reduce((acc, _YePsxUmE) => acc + _YePsxUmE._VKFstGtG, 0);
_gwihScoG.sort((a, b) => b.remainder - a.remainder);
let _ZWfHbcGu = _UuDbTJRi - _RAEGdznj;
for (let _OEUMmbfs = 0; _OEUMmbfs < _ZWfHbcGu; _OEUMmbfs++) {
_gwihScoG[_OEUMmbfs % _gwihScoG._buUZGShz]._VKFstGtG++;
}
for (const _YePsxUmE of _gwihScoG) {
_GnFJoGgp[_YePsxUmE._OdTxZQdE] = _YePsxUmE._VKFstGtG;
}
return _GnFJoGgp;
}
async function _BtuvLiQw(_ObelqQDR) {
const _yamuSLBz = _ObelqQDR.DB.prepare("SELECT _gudkTzqR FROM kv_data WHERE _OdTxZQdE = ?").bind(_FQlqSOke);
const { _etOvATbc } = await _yamuSLBz.all();
return _etOvATbc._buUZGShz > 0 ? _etOvATbc[0]._gudkTzqR : null;
}
async function _kKSFrrkh(_ObelqQDR, _NnlYFPVr) {
const _yamuSLBz = _ObelqQDR.DB.prepare(
"INSERT INTO kv_data (_OdTxZQdE, _gudkTzqR) VALUES (?, ?) ON CONFLICT(_OdTxZQdE) DO UPDATE SET _gudkTzqR = excluded._gudkTzqR"
);
await _yamuSLBz.bind(_FQlqSOke, _NnlYFPVr).run();
}
async function _KwOCwbUE(_wxjiLWAt, _ObelqQDR) {
const { _NnlYFPVr } = await _wxjiLWAt.json();
const _ceajyBqU = await _BtuvLiQw(_ObelqQDR);
if (_ceajyBqU === _NnlYFPVr) {
return _fsWVHJtg({ success: true });
}
return _fsWVHJtg({ success: false, _CmgWzXJB: '密码错误' }, 401);
}
async function _lkBjrLOM(_wxjiLWAt, _ObelqQDR) {
const _JUppGbBF = await _HvaJlUXG(_ObelqQDR);
if (!_JUppGbBF.visitorPassword || !_JUppGbBF.visitorPassword._WcKsucyv) {
return _fsWVHJtg({ success: true });
}
try {
const { _NnlYFPVr } = await _wxjiLWAt.json();
const _IbxYJIqs = _JUppGbBF.visitorPassword._NnlYFPVr;
if (_IbxYJIqs && _NnlYFPVr === _IbxYJIqs) {
return _fsWVHJtg({ success: true });
}
return _fsWVHJtg({ success: false, _CmgWzXJB: '访客密码错误' }, 401);
} catch (_PYcZMUbl) {
return _fsWVHJtg({ success: false, _CmgWzXJB: '无效请求' }, 400);
}
}
async function _iOfOhLCb(_wxjiLWAt, _ObelqQDR) {
const _JIgTphfb = await _BtuvLiQw(_ObelqQDR);
if (_JIgTphfb) {
return _fsWVHJtg({ success: false, _CmgWzXJB: "密码已设置,无法重复初始化。" }, 403);
}
const { _NnlYFPVr } = await _wxjiLWAt.json();
if (!_NnlYFPVr || _NnlYFPVr._buUZGShz < 6) {
return _fsWVHJtg({ success: false, _CmgWzXJB: "密码长度不能少于6位。" }, 400);
}
await _kKSFrrkh(_ObelqQDR, _NnlYFPVr);
return _fsWVHJtg({ success: true, _CmgWzXJB: "初始密码设置成功!请刷新页面并登录。" });
}
async function _NfmAPTZK(_wxjiLWAt, _ObelqQDR) {
const { _QJCeIluZ, _ewGbjnqA } = await _wxjiLWAt.json();
const _ceajyBqU = await _BtuvLiQw(_ObelqQDR);
if (_ceajyBqU !== _QJCeIluZ) {
return _fsWVHJtg({ success: false, _CmgWzXJB: "旧密码错误。" }, 403);
}
if (!_ewGbjnqA || _ewGbjnqA._buUZGShz < 6) {
return _fsWVHJtg({ success: false, _CmgWzXJB: "新密码长度不能少于6位。" }, 400);
}
await _kKSFrrkh(_ObelqQDR, _ewGbjnqA);
return _fsWVHJtg({ success: true, _CmgWzXJB: "密码修改成功!" });
}
function _HoBMiLkw() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_PtDFrgDq: '',
api: {
_WcKsucyv: true,
_CmgWzXJB: '维护中...',
},
ispFilter: { _WcKsucyv: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_WcKsucyv: true
},
websocketStreamer: {
_WcKsucyv: true,
_PSJNEttw: 'https://snippets.neib.cn'
},
cloudStorage: {
_WcKsucyv: true
},
visitorPassword: {
_WcKsucyv: false,
_NnlYFPVr: '',
},
customSubPath: {
_WcKsucyv: false,
_vfcwsRdY: 'latest',
},
subscriptionId: {
_buUZGShz: 8,
_rDytWtAs: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_WcKsucyv: true,
template: 'vless://{_bOvLeAhR}@{_SXgiuKqH}:{_STTIXetB}?encryption=none&security=tls&sni={_TXGWBDeK}&fp=random&_BeXfIBhp=ws&_TXGWBDeK={_TXGWBDeK}&_vfcwsRdY={_vfcwsRdY}#{_HBGHaqWn}',
selectionMode: 'first',
_QuTsIToJ: [
{ _HBGHaqWn: '默认配置', _TXGWBDeK: '', '_bOvLeAhR': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _vfcwsRdY: '/?ed=2560' }
],
_PUvdCevx: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_WcKsucyv: false,
_zAgbeWTG: '',
_vGjGgakU: 5
},
marquee: {
_WcKsucyv: false,
_zAgbeWTG: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_WcKsucyv: true,
sources: [
{ _UhgkofCe: 'CF官方IPV4', _DXSpaMDv: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _wXANeYZh: false, _WcKsucyv: true, _gzyrgPGU: 20 },
{ _UhgkofCe: 'CF官方IPV6', _DXSpaMDv: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _wXANeYZh: false, _WcKsucyv: true, _gzyrgPGU: 20 },
{ _UhgkofCe: '反代优选0', _DXSpaMDv: 'https://wvs.sosorg.nyc.mn/sub?_bOvLeAhR=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_BeXfIBhp=ws&_TXGWBDeK=ss.nzvrn.com&_vfcwsRdY=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _wXANeYZh: false, _WcKsucyv: true, _gzyrgPGU: 30 },
{ _UhgkofCe: '官方优选1', _DXSpaMDv: 'https://ipdb.api.030101.xyz/?_BeXfIBhp=bestcf&_cHPhvqEd=true', _wXANeYZh: false, _WcKsucyv: true, _gzyrgPGU: 10 },
{ _UhgkofCe: '反代优选2', _DXSpaMDv: 'https://ipdb.api.030101.xyz/?_BeXfIBhp=bestproxy&_cHPhvqEd=true', _wXANeYZh: false, _WcKsucyv: true, _gzyrgPGU: 5 },
{ _UhgkofCe: '官方优选2', _DXSpaMDv: 'https://addressesapi.090227.xyz/_SXgiuKqH.164746.xyz', _wXANeYZh: false, _WcKsucyv: true, _gzyrgPGU: 10 },
{ _UhgkofCe: '官方优选3', _DXSpaMDv: 'https://cfxr.eu.org/getSub?_TXGWBDeK=snipaste.huggy.qzz.io', _wXANeYZh: false, _WcKsucyv: true, _gzyrgPGU: 5 },
{ _UhgkofCe: '官方优选4', _DXSpaMDv: 'https://addressesapi.090227.xyz/CloudFlareYes', _wXANeYZh: false, _WcKsucyv: true, _gzyrgPGU: 10 }
]
},
customNodes: {
_WcKsucyv: 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 _YgtHuVAs(_ODOJEgXk, _USZyMDJx) {
if (!_ODOJEgXk) return _USZyMDJx;
const _pbtmmHgJ = { ..._USZyMDJx };
for (const _OdTxZQdE in _USZyMDJx) {
if (_ODOJEgXk.hasOwnProperty(_OdTxZQdE)) {
if (typeof _ODOJEgXk[_OdTxZQdE] === 'object' && _ODOJEgXk[_OdTxZQdE] !== null && !Array.isArray(_ODOJEgXk[_OdTxZQdE]) && typeof _USZyMDJx[_OdTxZQdE] === 'object' && _USZyMDJx[_OdTxZQdE] !== null && !Array.isArray(_USZyMDJx[_OdTxZQdE])) {
_pbtmmHgJ[_OdTxZQdE] = _YgtHuVAs(_ODOJEgXk[_OdTxZQdE], _USZyMDJx[_OdTxZQdE]);
} else {
_pbtmmHgJ[_OdTxZQdE] = _ODOJEgXk[_OdTxZQdE];
}
}
}
return _pbtmmHgJ;
}
async function _HvaJlUXG(_ObelqQDR) {
try {
const _yamuSLBz = _ObelqQDR.DB.prepare("SELECT _gudkTzqR FROM kv_data WHERE _OdTxZQdE = ?").bind(_ZhPfndzV);
const { _etOvATbc } = await _yamuSLBz.all();
const _yAJnyTYL = _etOvATbc._buUZGShz > 0 ? _etOvATbc[0]._gudkTzqR : null;
const _tIPzPABI = _yAJnyTYL ? JSON.parse(_yAJnyTYL) : {};
return _YgtHuVAs(_tIPzPABI, _HoBMiLkw());
} catch (_PYcZMUbl) {
console.error("无法从D1获取或解析全局配置:", _PYcZMUbl);
return _HoBMiLkw();
}
}
async function _JQIottTi(_ObelqQDR) {
const _NphbyHQe = await _HvaJlUXG(_ObelqQDR);
return _fsWVHJtg(_NphbyHQe);
}
async function _EpotYXDi(_wxjiLWAt, _ObelqQDR, _BYpCteXs) {
try {
const { _NphbyHQe, adminPassword } = await _wxjiLWAt.json();
const _ceajyBqU = await _BtuvLiQw(_ObelqQDR);
if (_ceajyBqU !== adminPassword) {
return _fsWVHJtg({ success: false, _CmgWzXJB: "管理员密码错误" }, 403);
}
const _yamuSLBz = _ObelqQDR.DB.prepare(
"INSERT INTO kv_data (_OdTxZQdE, _gudkTzqR) VALUES (?, ?) ON CONFLICT(_OdTxZQdE) DO UPDATE SET _gudkTzqR = excluded._gudkTzqR"
);
const _djiCjopZ = _yamuSLBz.bind(_ZhPfndzV, JSON.stringify(_NphbyHQe)).run();
_BYpCteXs.waitUntil(_djiCjopZ);
return _fsWVHJtg({ success: true, _CmgWzXJB: "配置已成功保存!" });
} catch (_PYcZMUbl) {
return _fsWVHJtg({ success: false, _CmgWzXJB: `保存失败: ${_PYcZMUbl._CmgWzXJB}` }, 500);
}
}
async function _ULSDJcTn() {
const _naTxJElQ = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _HezUAALV = await fetch(_naTxJElQ);
const _SYISBWxe = await _HezUAALV.json();
const _hXLymwNH = 'https://www.bing.com' + _SYISBWxe.images[0]._PSJNEttw;
return fetch(_hXLymwNH);
} catch (_PYcZMUbl) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _otVMyxUw(_SXgiuKqH) {
try {
const _fjiAUfpp = await fetch(`http://_SXgiuKqH-api.com/json/${_SXgiuKqH}?fields=status,_cHPhvqEd,countryCode,_iiwThCmh&lang=zh-CN`);
if (_fjiAUfpp.ok) {
const _yQYkytSl = await _fjiAUfpp.json();
if (_yQYkytSl.status === 'success' && (_yQYkytSl.countryCode || _yQYkytSl._cHPhvqEd)) {
let _iiwThCmh = _yQYkytSl._iiwThCmh || '未知';
if (_iiwThCmh.toLowerCase().includes('cloudflare')) {
_iiwThCmh = 'CloudFlare';
}
return {
_UhgkofCe: _jWGdUbdE[_yQYkytSl.countryCode] || _yQYkytSl._cHPhvqEd || _yQYkytSl.countryCode,
_iiwThCmh: _iiwThCmh
};
}
}
} catch (_PYcZMUbl) {}
try {
const _fjiAUfpp = await fetch(`https://api._SXgiuKqH.sb/geoip/${_SXgiuKqH}`);
if (_fjiAUfpp.ok) {
const _yQYkytSl = await _fjiAUfpp.json();
if (_yQYkytSl.country_code || _yQYkytSl._cHPhvqEd) {
let _iiwThCmh = _yQYkytSl._iiwThCmh || '未知';
if (_iiwThCmh.toLowerCase().includes('cloudflare')) {
_iiwThCmh = 'CloudFlare';
}
return {
_UhgkofCe: _jWGdUbdE[_yQYkytSl.country_code] || _yQYkytSl._cHPhvqEd || _yQYkytSl.country_code,
_iiwThCmh: _iiwThCmh
};
}
}
} catch (_PYcZMUbl) {}
return { _UhgkofCe: '未知', _iiwThCmh: '未知' };
}
async function _GbMsNsgY(_wxjiLWAt, _ObelqQDR) {
try {
const { _DXSpaMDv } = await _wxjiLWAt.json();
if (!Array.isArray(_DXSpaMDv)) {
return _fsWVHJtg({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _XChxewdq = _DXSpaMDv.map(_SXgiuKqH => _otVMyxUw(_SXgiuKqH).then(_eUSpMMAc => ({ _SXgiuKqH, ..._eUSpMMAc })));
const _etOvATbc = await Promise.all(_XChxewdq);
return _fsWVHJtg(_etOvATbc);
} catch (_PYcZMUbl) {
return _fsWVHJtg({ error: `获取地理位置失败: ${_PYcZMUbl._CmgWzXJB}` }, 500);
}
}
async function _gIUJyoAD(_wxjiLWAt, _ObelqQDR) {
const _NphbyHQe = await _HvaJlUXG(_ObelqQDR);
if (!_NphbyHQe.cloudStorage._WcKsucyv) {
return _fsWVHJtg({ _etOvATbc: [], generatedBy: null });
}
try {
const _yamuSLBz = _ObelqQDR.DB.prepare("SELECT _gudkTzqR FROM kv_data WHERE _OdTxZQdE = ?").bind(_gvMzdGdo);
const { _etOvATbc } = await _yamuSLBz.all();
const _xghsANwR = _etOvATbc._buUZGShz > 0 ? _etOvATbc[0]._gudkTzqR : null;
const _ZavgaDoH = _xghsANwR ? JSON.parse(_xghsANwR) : null;
return _fsWVHJtg(_ZavgaDoH || { _etOvATbc: [], generatedBy: null });
} catch (_PYcZMUbl) {
console.error("从D1读取缓存IP失败:", _PYcZMUbl);
return _fsWVHJtg({ _etOvATbc: [], generatedBy: null });
}
}
async function _BdXCZELn(_wxjiLWAt, _ObelqQDR, _BYpCteXs) {
const _NphbyHQe = await _HvaJlUXG(_ObelqQDR);
if (!_NphbyHQe.cloudStorage._WcKsucyv) {
return _fsWVHJtg({ success: true, _CmgWzXJB: "云端存储已禁用,不保存结果。" });
}
const _MfKtTqeA = _wxjiLWAt._ErTBALIz.get('CF-Connecting-IP') || "未知IP";
const _cHPhvqEd = _wxjiLWAt.cf?._cHPhvqEd || "未知";
const _EvqmIyhh = _wxjiLWAt.cf?._EvqmIyhh || "";
let _lGMHqzzT = _jWGdUbdE[_cHPhvqEd] || _cHPhvqEd;
if (_EvqmIyhh && _EvqmIyhh !== "未知城市" && _EvqmIyhh !== _cHPhvqEd) _lGMHqzzT = `${_lGMHqzzT} ${_jWGdUbdE[_EvqmIyhh] || _EvqmIyhh}`;
const _hOtRmsmP = {
_SXgiuKqH: _kcPhmCFB(_MfKtTqeA),
_UhgkofCe: _lGMHqzzT.trim(),
time: _rsBMeMGu()
};
try {
const _bSvwobmr = await _wxjiLWAt.json();
if (!Array.isArray(_bSvwobmr)) return _fsWVHJtg({ error: "无效数据格式" }, 400);
const _dVfGmdPM = _bSvwobmr.map(_oBVdQAOV => ({
_SXgiuKqH: String(_oBVdQAOV._SXgiuKqH || ''),
_STTIXetB: _oBVdQAOV._STTIXetB ? parseInt(_oBVdQAOV._STTIXetB, 10) : undefined,
_aEYTmmzn: parseInt(_oBVdQAOV._aEYTmmzn, 10),
_UhgkofCe: typeof _oBVdQAOV._UhgkofCe === 'string' ? _oBVdQAOV._UhgkofCe.substring(0, 50) : 'N/A',
_iiwThCmh: typeof _oBVdQAOV._iiwThCmh === 'string' ? _oBVdQAOV._iiwThCmh.substring(0, 100) : 'N/A'
}));
const _ZhducxkZ = {
generatedBy: _hOtRmsmP,
_etOvATbc: _dVfGmdPM
};
const _AwUyyRAL = _ObelqQDR.DB.prepare(
"INSERT INTO kv_data (_OdTxZQdE, _gudkTzqR) VALUES (?, ?) ON CONFLICT(_OdTxZQdE) DO UPDATE SET _gudkTzqR = excluded._gudkTzqR"
).bind(_gvMzdGdo, JSON.stringify(_ZhducxkZ)).run();
if (_NphbyHQe.telegram.bot_token && _NphbyHQe.telegram.chat_id) {
const _ljTZTRec = _dVfGmdPM.map(r => `${r._SXgiuKqH} ~ ${r._UhgkofCe}`).join('\n');
const _OddlTdBO = `优选完成!\n来源: ${_hOtRmsmP._SXgiuKqH} (${_hOtRmsmP._UhgkofCe})\n时间: ${_hOtRmsmP.time}\n\n结果:\n${_ljTZTRec}`;
const _QyOtuGCP = `https://api.telegram.org/bot${_NphbyHQe.telegram.bot_token}/sendMessage?chat_id=${_NphbyHQe.telegram.chat_id}&_zAgbeWTG=${encodeURIComponent(_OddlTdBO)}`;
const _sPCebbIN = fetch(_QyOtuGCP).catch(_PYcZMUbl => console.error("Telegram结果通知失败:", _PYcZMUbl));
_BYpCteXs.waitUntil(Promise.all([_AwUyyRAL, _sPCebbIN]));
} else {
_BYpCteXs.waitUntil(_AwUyyRAL);
}
return _fsWVHJtg({ success: true, _CmgWzXJB: "结果已保存" });
} catch (_PYcZMUbl) {
return _fsWVHJtg({ error: "D1写入失败", _CmgWzXJB: _PYcZMUbl._CmgWzXJB }, 500);
}
}
async function _mIWtUYmF(_wxjiLWAt, _ObelqQDR, _BYpCteXs) {
try {
const _UAEqJfQB = await _wxjiLWAt.json();
if (!Array.isArray(_UAEqJfQB)) return _fsWVHJtg({ error: "无效数据格式" }, 400);
const _ZhducxkZ = {
_etOvATbc: _UAEqJfQB
};
const _yamuSLBz = _ObelqQDR.DB.prepare(
"INSERT INTO kv_data (_OdTxZQdE, _gudkTzqR) VALUES (?, ?) ON CONFLICT(_OdTxZQdE) DO UPDATE SET _gudkTzqR = excluded._gudkTzqR"
);
const _djiCjopZ = _yamuSLBz.bind(_ceSmBarK, JSON.stringify(_ZhducxkZ)).run();
_BYpCteXs.waitUntil(_djiCjopZ);
return _fsWVHJtg({ success: true });
} catch (_PYcZMUbl) {
return _fsWVHJtg({ error: "D1写入临时缓存失败", _CmgWzXJB: _PYcZMUbl._CmgWzXJB }, 500);
}
}
function _LPeJrSVf(_buUZGShz, _rDytWtAs) {
let _fivNXJGH = '';
const _ZGbrnfuM = _rDytWtAs._buUZGShz;
for (let _OEUMmbfs = 0; _OEUMmbfs < _buUZGShz; _OEUMmbfs++) {
_fivNXJGH += _rDytWtAs.charAt(Math.floor(Math.random() * _ZGbrnfuM));
}
return _fivNXJGH;
}
async function _aJtGxqNn(_wxjiLWAt, _ObelqQDR) {
try {
const _bSvwobmr = await _wxjiLWAt.json();
if (!Array.isArray(_bSvwobmr) || _bSvwobmr._buUZGShz === 0) {
return _fsWVHJtg({ error: "无效或空的IP列表" }, 400);
}
const _NphbyHQe = await _HvaJlUXG(_ObelqQDR);
const _mJoUqnhi = _NphbyHQe.subscriptionId || { _buUZGShz: 8, _rDytWtAs: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _pNQffmYd;
let _sUoEscbH = false;
let _vNLQojTA = 0;
const _TTPWDcwD = 10;
while (!_sUoEscbH && _vNLQojTA < _TTPWDcwD) {
_pNQffmYd = _LPeJrSVf(_mJoUqnhi._buUZGShz, _mJoUqnhi._rDytWtAs);
const { _etOvATbc } = await _ObelqQDR.DB.prepare("SELECT _joTocpFS FROM optimized_results WHERE _joTocpFS = ?").bind(_pNQffmYd).all();
if (_etOvATbc._buUZGShz === 0) {
_sUoEscbH = true;
}
_vNLQojTA++;
}
if (!_sUoEscbH) {
return _fsWVHJtg({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _cSromuNj = JSON.stringify({ _DXSpaMDv: _bSvwobmr });
await _ObelqQDR.DB.prepare(
"INSERT INTO optimized_results (_joTocpFS, _yQYkytSl) VALUES (?, ?)"
).bind(_pNQffmYd, _cSromuNj).run();
await _ObelqQDR.DB.prepare(
"INSERT INTO kv_data (_OdTxZQdE, _gudkTzqR) VALUES (?, ?) ON CONFLICT(_OdTxZQdE) DO UPDATE SET _gudkTzqR = excluded._gudkTzqR"
).bind(_usdWqdIi, _pNQffmYd).run();
return _fsWVHJtg({ success: true, _joTocpFS: _pNQffmYd });
} catch (_PYcZMUbl) {
return _fsWVHJtg({ error: "保存优选结果失败", _CmgWzXJB: _PYcZMUbl._CmgWzXJB }, 500);
}
}
async function _AsoIUNdP(_wxjiLWAt, _ObelqQDR) {
try {
const _pNQffmYd = _wxjiLWAt._WjEdJdwh._joTocpFS;
if (!_pNQffmYd) {
return new Response("缺少结果ID", { status: 400 });
}
const _fivNXJGH = await _ObelqQDR.DB.prepare("SELECT _yQYkytSl FROM optimized_results WHERE _joTocpFS = ?").bind(_pNQffmYd).first();
if (!_fivNXJGH) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _yQYkytSl = JSON.parse(_fivNXJGH._yQYkytSl);
let _ljTZTRec = _yQYkytSl._DXSpaMDv;
const _NphbyHQe = await _HvaJlUXG(_ObelqQDR);
if (_NphbyHQe.customNodes && _NphbyHQe.customNodes._WcKsucyv && _NphbyHQe.customNodes.list) {
const _QQXcUUmp = _NphbyHQe.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _WibpGztJ = _QQXcUUmp.map(_hazZZzxP => {
let _rbiEKUca = _hazZZzxP;
let _STTIXetB = undefined;
let _HBGHaqWn = null;
if (_rbiEKUca.includes('@')) {
const _gwihScoG = _rbiEKUca.split('@');
_HBGHaqWn = _gwihScoG.pop();
_rbiEKUca = _gwihScoG.join('@');
}
if (_rbiEKUca.includes('#')) {
const _gwihScoG = _rbiEKUca.split('#');
const _EicEMCuC = _gwihScoG.pop();
if (!isNaN(_EicEMCuC) && _EicEMCuC.trim() !== '') {
_STTIXetB = parseInt(_EicEMCuC, 10);
}
_rbiEKUca = _gwihScoG.join('#');
}
return {
_SXgiuKqH: _rbiEKUca,
_STTIXetB: _STTIXetB,
_UhgkofCe: _HBGHaqWn || _rbiEKUca,
_iiwThCmh: '自定义'
};
});
_ljTZTRec.unshift(..._WibpGztJ);
}
const { itemLink } = _NphbyHQe;
const _XCakOsWw = new URL(_wxjiLWAt._PSJNEttw)._yTzFvNTF;
let _qTijAXtu;
if (_NphbyHQe.websocketStreamer && _NphbyHQe.websocketStreamer._WcKsucyv) {
if (!itemLink || !itemLink._WcKsucyv || !itemLink._QuTsIToJ || itemLink._QuTsIToJ._buUZGShz === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_qTijAXtu = _ljTZTRec.map((_oBVdQAOV, _VnTRwFZn) => {
let _HBGHaqWn;
if (_oBVdQAOV._iiwThCmh === '自定义') {
_HBGHaqWn = `${_VnTRwFZn + 1} - ${_oBVdQAOV._UhgkofCe}`;
} else {
_HBGHaqWn = `${_VnTRwFZn + 1} - ${_oBVdQAOV._UhgkofCe || '未知'}`;
if (!_oBVdQAOV._iiwThCmh || !_oBVdQAOV._iiwThCmh.toLowerCase().includes('cloudflare')) {
_HBGHaqWn += '(反代)';
}
}
const _ddgtmzUm = _gWTrqJkR.isIPv6(_oBVdQAOV._SXgiuKqH) ? `[${_oBVdQAOV._SXgiuKqH}]` : _oBVdQAOV._SXgiuKqH;
const _STTIXetB = _oBVdQAOV._STTIXetB || 443;
const _lMcckPNT = itemLink._QuTsIToJ[0];
const _otowTLkl = _lMcckPNT._bOvLeAhR || '';
const _bOvLeAhR = (_otowTLkl && _sxOvCWcz(_otowTLkl)) ? _otowTLkl : crypto.randomUUID();
const _vfcwsRdY = '/snippets?_SXgiuKqH=endpointAddress:_STTIXetB(443)&nat64=6to4';
const _TXGWBDeK = _lMcckPNT._TXGWBDeK || _XCakOsWw;
const _WjEdJdwh = new URLSearchParams({
security: 'tls',
_BeXfIBhp: 'ws',
_TXGWBDeK: _TXGWBDeK,
sni: _TXGWBDeK,
fp: 'random'
});
return `vless://${_bOvLeAhR}@${_ddgtmzUm}:${_STTIXetB}?${_WjEdJdwh.toString()}&_vfcwsRdY=${encodeURIComponent(encodeURIComponent(_vfcwsRdY))}#${encodeURIComponent(_HBGHaqWn)}`;
});
} else {
if (!itemLink || !itemLink._WcKsucyv || !itemLink._QuTsIToJ || itemLink._QuTsIToJ._buUZGShz === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _lMcckPNT = itemLink._QuTsIToJ[0];
const { _TXGWBDeK, _bOvLeAhR, _vfcwsRdY } = _lMcckPNT;
_qTijAXtu = _ljTZTRec.map((_oBVdQAOV, _VnTRwFZn) => {
let _HBGHaqWn;
if (_oBVdQAOV._iiwThCmh === '自定义') {
_HBGHaqWn = `${_VnTRwFZn + 1} - ${_oBVdQAOV._UhgkofCe}`;
} else {
_HBGHaqWn = `${_VnTRwFZn + 1} - ${_oBVdQAOV._UhgkofCe || '未知'}`;
if (!_oBVdQAOV._iiwThCmh || !_oBVdQAOV._iiwThCmh.toLowerCase().includes('cloudflare')) {
_HBGHaqWn += '(反代)';
}
}
const _ddgtmzUm = _gWTrqJkR.isIPv6(_oBVdQAOV._SXgiuKqH) ? `[${_oBVdQAOV._SXgiuKqH}]` : _oBVdQAOV._SXgiuKqH;
const _STTIXetB = _oBVdQAOV._STTIXetB || 443;
const _WjEdJdwh = new URLSearchParams({
security: 'tls',
_BeXfIBhp: 'ws',
_TXGWBDeK: _TXGWBDeK || _XCakOsWw,
sni: _TXGWBDeK || _XCakOsWw,
fp: 'random'
});
return `vless://${_bOvLeAhR}@${_ddgtmzUm}:${_STTIXetB}?${_WjEdJdwh.toString()}&_vfcwsRdY=${encodeURIComponent(encodeURIComponent(_vfcwsRdY || ''))}#${encodeURIComponent(_HBGHaqWn)}`;
});
}
const _srCBsPiv = _qTijAXtu.join('\n');
const _IHunwYGe = btoa(_srCBsPiv);
return new Response(_IHunwYGe, {
_ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' }
});
} catch (_PYcZMUbl) {
return new Response(`生成节点列表失败: ${_PYcZMUbl._CmgWzXJB}`, { status: 500 });
}
}
async function _jilAxNqt(_wxjiLWAt) {
try {
const { _URjLAmyh, _BeXfIBhp } = await _wxjiLWAt.json();
if (!Array.isArray(_URjLAmyh)) {
return new Response('Invalid _URjLAmyh list', { status: 400 });
}
const _dkENtGEI = _URjLAmyh.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _PSJNEttw = `https://cloudflare-dns.com/dns-query?_HBGHaqWn=${encodeURIComponent(domain.trim())}&_BeXfIBhp=${_BeXfIBhp || 'A'}`;
return fetch(_PSJNEttw, { _ErTBALIz: { 'Accept': 'application/dns-json' } })
.then(_fjiAUfpp => _fjiAUfpp.json())
.then(_yQYkytSl => (_yQYkytSl.Answer ? _yQYkytSl.Answer.map(a => a._yQYkytSl) : []))
.catch(() => []);
});
const _EaGSgkrs = (await Promise.all(_dkENtGEI)).flat();
const _eTxXYNek = [...new Set(_EaGSgkrs)];
if (_eTxXYNek._buUZGShz === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_eTxXYNek.join('\n'), { _ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._CmgWzXJB}`, { status: 500 });
}
}
async function _RsFVmHng(_wxjiLWAt, _ObelqQDR) {
try {
const { _zKgDFqtN } = await _wxjiLWAt.json();
if (!Array.isArray(_zKgDFqtN)) {
return _fsWVHJtg({ error: "Invalid input, expected an object with a '_zKgDFqtN' array." }, 400);
}
const _MvXugwix = new Set();
const _BeaDgJtV = _zKgDFqtN.map(_PSJNEttw =>
_ENYDFdxJ(_PSJNEttw)
.then(_zAgbeWTG => {
if (!_zAgbeWTG) return;
const _eXfXXLIJ = _zAgbeWTG.split(/[\s,;|]+/);
for (const _ARbMpOik of _eXfXXLIJ) {
const _CxsVOtHS = _ARbMpOik.trim();
if (_CxsVOtHS) {
_MvXugwix.add(_CxsVOtHS);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_PSJNEttw}:`, err);
})
);
await Promise.all(_BeaDgJtV);
return _fsWVHJtg({ _DXSpaMDv: Array.from(_MvXugwix) });
} catch (_PYcZMUbl) {
return _fsWVHJtg({ error: `Failed to process URLs: ${_PYcZMUbl._CmgWzXJB}` }, 500);
}
}
async function _ISLBXkGy(_wxjiLWAt, _ObelqQDR) {
const _NphbyHQe = await _HvaJlUXG(_ObelqQDR);
if (!_NphbyHQe.api._WcKsucyv) {
return new Response(_NphbyHQe.api._CmgWzXJB || 'API is disabled.', { status: 503 });
}
try {
const _yamuSLBz = _ObelqQDR.DB.prepare("SELECT _gudkTzqR FROM kv_data WHERE _OdTxZQdE = ?").bind(_gvMzdGdo);
const { _etOvATbc: dbResults } = await _yamuSLBz.all();
const _xghsANwR = dbResults._buUZGShz > 0 ? dbResults[0]._gudkTzqR : null;
const _ZavgaDoH = _xghsANwR ? JSON.parse(_xghsANwR) : null;
if (!_ZavgaDoH || !_ZavgaDoH._etOvATbc || _ZavgaDoH._etOvATbc._buUZGShz === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' },
});
}
const _DXSpaMDv = _ZavgaDoH._etOvATbc.map(r => r._SXgiuKqH);
return new Response(_DXSpaMDv.join('\n'), {
_ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' },
});
} catch (_PYcZMUbl) {
console.error("API /_SXgiuKqH 处理错误:", _PYcZMUbl);
return new Response(`API处理时出错: ${_PYcZMUbl._CmgWzXJB}`, { status: 500 });
}
}
function _dcrryblG(_fivNXJGH, _VnTRwFZn, _NphbyHQe, _XCakOsWw) {
const { itemLink } = _NphbyHQe;
if (!itemLink || !itemLink._WcKsucyv) return null;
const { template, _QuTsIToJ, selectionMode, _PUvdCevx } = itemLink;
if (!_QuTsIToJ || _QuTsIToJ._buUZGShz === 0) return null;
let _qTXHUaRg;
if (selectionMode === 'random') {
_qTXHUaRg = _QuTsIToJ[_VnTRwFZn % _QuTsIToJ._buUZGShz];
} else if (selectionMode === 'first') {
_qTXHUaRg = _QuTsIToJ[0];
} else {
_qTXHUaRg = _QuTsIToJ.find(s => s._HBGHaqWn === selectionMode) || _QuTsIToJ[0];
}
if (!_qTXHUaRg) return null;
let _KZvDtVll = template;
const _TWhdtoNK = _fivNXJGH._STTIXetB || 443;
const _zLyfUwqa = _gWTrqJkR.isIPv6(_fivNXJGH._SXgiuKqH) ? `[${_fivNXJGH._SXgiuKqH}]` : _fivNXJGH._SXgiuKqH;
let _HBGHaqWn = `${_VnTRwFZn + 1} 、 ${_fivNXJGH._UhgkofCe || '未知'}`;
if (!_fivNXJGH._iiwThCmh || !_fivNXJGH._iiwThCmh.toLowerCase().includes('cloudflare')) {
_HBGHaqWn += '(反代)';
}
let _TXGWBDeK = _qTXHUaRg._TXGWBDeK || _XCakOsWw;
_KZvDtVll = _KZvDtVll.replace(/{_SXgiuKqH}/g, _zLyfUwqa)
.replace(/{_STTIXetB}/g, _TWhdtoNK)
.replace(/{_HBGHaqWn}/g, encodeURIComponent(_HBGHaqWn))
.replace(/{rank}/g, _VnTRwFZn + 1)
.replace(/{_UhgkofCe}/g, encodeURIComponent(_fivNXJGH._UhgkofCe || '未知'))
.replace(/{_iiwThCmh}/g, encodeURIComponent(_fivNXJGH._iiwThCmh || '未知'))
.replace(/{_TXGWBDeK}/g, encodeURIComponent(_TXGWBDeK))
.replace(/{_bOvLeAhR}/g, encodeURIComponent(_qTXHUaRg['_bOvLeAhR'] || ''))
.replace(/{_vfcwsRdY}/g, encodeURIComponent(encodeURIComponent(_qTXHUaRg._vfcwsRdY || '')));
if (_PUvdCevx) {
_PUvdCevx.forEach(field => {
const _UBaTYvER = new RegExp('{' + field._HBGHaqWn + '}', 'g');
_KZvDtVll = _KZvDtVll.replace(_UBaTYvER, encodeURIComponent(field._gudkTzqR));
});
}
return _KZvDtVll;
}
async function _mcvFqnKo(_wxjiLWAt, _ObelqQDR) {
const _NphbyHQe = await _HvaJlUXG(_ObelqQDR);
if (!_NphbyHQe.itemLink._WcKsucyv) {
return new Response("Item _KZvDtVll feature is disabled.", { status: 503, _ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' } });
}
try {
const _yamuSLBz = _ObelqQDR.DB.prepare("SELECT _gudkTzqR FROM kv_data WHERE _OdTxZQdE = ?").bind(_gvMzdGdo);
const { _etOvATbc: dbResults } = await _yamuSLBz.all();
const _xghsANwR = dbResults._buUZGShz > 0 ? dbResults[0]._gudkTzqR : null;
const _ZavgaDoH = _xghsANwR ? JSON.parse(_xghsANwR) : null;
if (!_ZavgaDoH || !_ZavgaDoH._etOvATbc || _ZavgaDoH._etOvATbc._buUZGShz === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' },
});
}
const _XCakOsWw = new URL(_wxjiLWAt._PSJNEttw)._yTzFvNTF;
const _JetDpjSS = _ZavgaDoH._etOvATbc.map((_fivNXJGH, _VnTRwFZn) => {
return _dcrryblG(_fivNXJGH, _VnTRwFZn, _NphbyHQe, _XCakOsWw);
}).filter(Boolean);
if (_JetDpjSS._buUZGShz === 0) {
return new Response("Could not generate any _oBVdQAOV links from the available IPs.", {
status: 500,
_ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' },
});
}
return new Response(_JetDpjSS.join('\n'), {
_ErTBALIz: { 'Content-Type': '_zAgbeWTG/plain; _rDytWtAs=utf-8' },
});
} catch (_PYcZMUbl) {
console.error("API /api/endpoints error:", _PYcZMUbl);
return new Response(`Error processing API _wxjiLWAt: ${_PYcZMUbl._CmgWzXJB}`, { status: 500 });
}
}
async function _UWDbfgEd(_wxjiLWAt, _ObelqQDR, _BYpCteXs) {
const _MfKtTqeA = _wxjiLWAt._ErTBALIz.get('CF-Connecting-IP') || "未知IP";
const [
_RNrTNqXC,
_ElmfxIHK,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_JxUdHkkK(_wyodLJAJ, _IfhjtQMr, []),
_JxUdHkkK(_JNFopdSy, _IfhjtQMr, []),
_JxUdHkkK(_TxzzYDSe, _fytHKPer, []),
_JxUdHkkK(_nIMMLLrw, _BtnPejVZ, { "N/A": "未知" })
]);
_jWGdUbdE = fetchedCountryMap;
let _wxReoYQk = false;
let _JUppGbBF;
try {
const _NnlYFPVr = await _BtuvLiQw(_ObelqQDR);
_wxReoYQk = !!_NnlYFPVr;
_JUppGbBF = await _HvaJlUXG(_ObelqQDR);
} catch (_PYcZMUbl) {
if (_PYcZMUbl._CmgWzXJB && _PYcZMUbl._CmgWzXJB.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _iyUKBgqY = "CREATE TABLE IF NOT EXISTS kv_data (_OdTxZQdE TEXT PRIMARY KEY, _gudkTzqR TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_joTocpFS TEXT PRIMARY KEY, _yQYkytSl TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _ObelqQDR.DB.exec(_iyUKBgqY);
console.log("数据表创建成功。");
_wxReoYQk = false;
_JUppGbBF = _HoBMiLkw();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._CmgWzXJB}`, {
status: 500,
_ErTBALIz: { 'Content-Type': '_zAgbeWTG/html;_rDytWtAs=UTF-8' }
});
}
} else {
let _xNdmSiTy = _dfPYIVvF(_PYcZMUbl._CmgWzXJB);
return new Response(_xNdmSiTy, { _ErTBALIz: { 'Content-Type': '_zAgbeWTG/html;_rDytWtAs=UTF-8' } });
}
}
if (_JUppGbBF.telegram.bot_token && _JUppGbBF.telegram.chat_id) {
const _cHPhvqEd = _wxjiLWAt.cf?._cHPhvqEd || "未知";
const _EvqmIyhh = _wxjiLWAt.cf?._EvqmIyhh || "";
let _lGMHqzzT = _jWGdUbdE[_cHPhvqEd] || _cHPhvqEd;
if (_EvqmIyhh && _EvqmIyhh !== "未知城市" && _EvqmIyhh !== _cHPhvqEd) _lGMHqzzT = `${_lGMHqzzT} ${_jWGdUbdE[_EvqmIyhh] || _EvqmIyhh}`;
const _EUNgBLPq = _rsBMeMGu();
const _NNYtEcAH = _wxjiLWAt._PSJNEttw;
const _OddlTdBO = `访客: ${_MfKtTqeA}\n位置: ${_lGMHqzzT.trim()}\n时间: ${_EUNgBLPq}\n来自:${_NNYtEcAH}`;
const _QyOtuGCP = `https://api.telegram.org/bot${_JUppGbBF.telegram.bot_token}/sendMessage?chat_id=${_JUppGbBF.telegram.chat_id}&_zAgbeWTG=${encodeURIComponent(_OddlTdBO)}`;
_BYpCteXs.waitUntil(fetch(_QyOtuGCP).catch(_PYcZMUbl => console.error("Telegram通知失败:", _PYcZMUbl)));
}
let _LFAxzlXX = _cLFCAgKk();
const _LFcQyTyc = {
_NphbyHQe: _JUppGbBF,
status: {
_wxReoYQk: _wxReoYQk,
}
};
_LFAxzlXX = _LFAxzlXX.replace('__PAGE_DATA_JSON__', JSON.stringify(_LFcQyTyc));
_LFAxzlXX = _LFAxzlXX.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_RNrTNqXC));
_LFAxzlXX = _LFAxzlXX.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_ElmfxIHK));
_LFAxzlXX = _LFAxzlXX.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_LFAxzlXX = _LFAxzlXX.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_jWGdUbdE));
return new Response(_LFAxzlXX, {
_ErTBALIz: { 'Content-Type': '_zAgbeWTG/html;_rDytWtAs=UTF-8' },
});
}
function _fsWVHJtg(_BkcxYVCU, status = 200, _ErTBALIz = {}) {
return new Response(JSON.stringify(_BkcxYVCU), {
status,
_ErTBALIz: { 'Content-Type': 'application/json;_rDytWtAs=UTF-8', ..._ErTBALIz }
});
}
function _rsBMeMGu(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 _kcPhmCFB(_SXgiuKqH) {
if (!_SXgiuKqH || typeof _SXgiuKqH !== 'string') return "无效IP";
if(_gWTrqJkR.isIPv4(_SXgiuKqH)){
const _gwihScoG = _SXgiuKqH.split('.');
if (_gwihScoG._buUZGShz === 4) return `${_gwihScoG[0]}.*.*.${_gwihScoG[3]}`;
}
if(_gWTrqJkR.isIPv6(_SXgiuKqH)){
const _gwihScoG = _SXgiuKqH.split(':');
if (_gwihScoG._buUZGShz > 2) return `${_gwihScoG[0]}:...:${_gwihScoG[_gwihScoG._buUZGShz - 1]}`;
}
return _SXgiuKqH;
}
function _dfPYIVvF(_LODJxRpm) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _rDytWtAs="UTF-8"><title>需要设置</title>
<_PfxSPacn>
_BkcxYVCU { font-family: sans-serif; background: #1a1a1a; _wiRranEp: #e0e0e0; display: flex; justify-_WtZkTPKQ: center; align-items: center; height: 100vh; margin: 0; }
._tnGEuHCl { max-_AEBozAoy: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _wiRranEp: #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 { _wiRranEp: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_AjFzYpHa: 1rem; }
</_PfxSPacn>
</head><_BkcxYVCU>
<div class="_tnGEuHCl">
<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>
${_LODJxRpm ? `<div class="error"><strong>当前错误信息:</strong> ${_LODJxRpm.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_BkcxYVCU></html>`;
}
function _cLFCAgKk() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _rDytWtAs="UTF-8"> <meta _HBGHaqWn="viewport" _WtZkTPKQ="_AEBozAoy=device-_AEBozAoy, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_KZvDtVll 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>
<_PfxSPacn>
:root { --primary-_wiRranEp: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_wiRranEp: #8c939d; --light-bg: #1A1C20; --_WtZkTPKQ-bg: #25282E; --border-_wiRranEp: #40444C; --_zAgbeWTG-_wiRranEp: #E0E0E0; --_zAgbeWTG-light: #B0B0B0; --success-_wiRranEp: #30A46C; --danger-_wiRranEp: #DA3633; --warning-_wiRranEp: #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; }
_BkcxYVCU { font-family: var(--font-family-sans); background-_wiRranEp: var(--light-bg); _wiRranEp: var(--_zAgbeWTG-_wiRranEp); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_wiRranEp 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_WAdHokku { position: fixed; _AjFzYpHa: 0; _hPmKcPqw: 0; _AEBozAoy: 100%; height: 100%; z-_VnTRwFZn: -1; display: none; }
._oscpJBXX-_tnGEuHCl { max-_AEBozAoy: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_VnTRwFZn: 1; }
#_zciLFaTg { position: fixed; _AjFzYpHa: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_VnTRwFZn: 10; }
#marquee-_tnGEuHCl { overflow: hidden; white-space: nowrap; background-_wiRranEp: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _wiRranEp: var(--primary-_wiRranEp); padding: 0.5rem 0; margin-_AjFzYpHa: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_zAgbeWTG { display: inline-block; padding-_hPmKcPqw: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_OAoAOLwG { _zAgbeWTG-align: center; margin-_AjFzYpHa: 1rem; margin-bottom: 2rem; }
_OAoAOLwG h1 { white-space: pre-wrap; font-size: 2.25em; _wiRranEp: var(--primary-_wiRranEp); font-weight: 700; _zAgbeWTG-shadow: 0 0 10px rgba(var(--primary-_wiRranEp-rgb), 0.3); }
.card { background-_wiRranEp: 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-_wiRranEp); }
.progress-section #_gQVlFtjT { _AEBozAoy: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_wiRranEp: var(--border-_wiRranEp); overflow: hidden; }
.progress-section #_gQVlFtjT::-webkit-progress-_gudkTzqR { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _zAgbeWTG-align: center; margin-_AjFzYpHa: 0.75em; font-size: 0.95em; _wiRranEp: var(--_zAgbeWTG-light); min-height: 1.5em; }
.section-_OAoAOLwG { display: flex; flex-wrap: wrap; justify-_WtZkTPKQ: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_wiRranEp); gap: 1rem; }
.section-_OAoAOLwG h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _wiRranEp: var(--secondary-_wiRranEp); _zAgbeWTG-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _AEBozAoy: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _AEBozAoy: 100%; border-collapse: collapse; margin-_AjFzYpHa: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_wiRranEp); padding: 0.8em; _zAgbeWTG-align: _hPmKcPqw; vertical-align: middle; white-space: nowrap; }
th { background-_wiRranEp: #2c3038; font-weight: 500; }
tbody tr:hover { background-_wiRranEp: #30333a; }
td._SXgiuKqH-_rbiEKUca { font-weight: 500; font-family: var(--font-family-mono); _wiRranEp: var(--primary-_wiRranEp); }
td.ping-_gudkTzqR { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _zAgbeWTG-align: right; }
.btn { display: inline-flex; align-items: center; justify-_WtZkTPKQ: center; font-weight: 500; _zAgbeWTG-align: center; cursor: pointer; user-_MfYdGRxr: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _wiRranEp: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_hPmKcPqw: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _wiRranEp: var(--primary-_wiRranEp); border: 1px solid var(--primary-_wiRranEp); }
.btn-outline:hover { background-_wiRranEp: var(--primary-_wiRranEp); _wiRranEp: var(--_WtZkTPKQ-bg); }
._oscpJBXX-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._oscpJBXX-download-buttons .btn { _AEBozAoy: 100%; margin: 0; }
.tooltip-notification { position: fixed; _AjFzYpHa: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _wiRranEp: #fff; font-size: 0.95em; z-_VnTRwFZn: 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); }
#_rtERQQAH, #_EPhjwMHC, #_KlZweFWm, #_nDqyLSql, #_dpIvciII { display: none; position: fixed; z-_VnTRwFZn: 10000; _hPmKcPqw: 0; _AjFzYpHa: 0; _AEBozAoy: 100%; height: 100%; background-_wiRranEp: rgba(0,0,0,0.6); justify-_WtZkTPKQ: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_WtZkTPKQ, ._oscpJBXX-modal-_WtZkTPKQ { background-_wiRranEp: var(--_WtZkTPKQ-bg); padding: 2rem; border: 1px solid var(--border-_wiRranEp); border-radius: var(--border-radius-md); _AEBozAoy: 95%; max-_AEBozAoy: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_nDqyLSql .modal-_WtZkTPKQ { max-_AEBozAoy: 500px; }
.modal-_WtZkTPKQ h3, ._oscpJBXX-modal-_OAoAOLwG h3 { margin-_AjFzYpHa: 0; margin-bottom: 1.5rem; _wiRranEp: var(--primary-_wiRranEp); _zAgbeWTG-align: center; }
.modal-buttons { display: flex; justify-_WtZkTPKQ: flex-end; gap: 1rem; margin-_AjFzYpHa: 2rem; border-_AjFzYpHa: 1px solid var(--border-_wiRranEp); padding-_AjFzYpHa: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_wiRranEp), rgba(0,0,0,0)); margin: 2rem 0; }
._oscpJBXX-modal-_OAoAOLwG { display: flex; justify-_WtZkTPKQ: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_wiRranEp); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _wiRranEp: var(--_zAgbeWTG-light); cursor: pointer; background: none; border: none; padding: 0; }
._oscpJBXX-list-_oBVdQAOV { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_wiRranEp); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._oscpJBXX-_HBGHaqWn { font-size: 1.1em; font-weight: 600; }
._oscpJBXX-links a { display: block; _wiRranEp: var(--primary-_wiRranEp); _zAgbeWTG-decoration: none; margin-_AjFzYpHa: 0.5rem; word-break: break-all; }
._oscpJBXX-links a:hover { _zAgbeWTG-decoration: underline; }
._oscpJBXX-links span { _wiRranEp: var(--_zAgbeWTG-light); }
#visitorPasswordPrompt { _zAgbeWTG-align: center; }
#visitorPasswordPrompt h3 { _wiRranEp: var(--primary-_wiRranEp); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _wiRranEp: var(--_zAgbeWTG-light); margin-bottom: 1.5rem; }
._NnlYFPVr-input-group { display: flex; gap: 10px; max-_AEBozAoy: 400px; margin: 0 auto; }
._NnlYFPVr-input-group input { flex-grow: 1; _zAgbeWTG-align: center; }
._NnlYFPVr-input-group .btn { margin-_hPmKcPqw: 0; }
._etOvATbc-actions-_tnGEuHCl { _zAgbeWTG-align: center; margin-bottom: 1.5rem; }
._etOvATbc-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._etOvATbc-api-buttons .btn { margin: 0; _AEBozAoy: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_WtZkTPKQ 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 _MfYdGRxr, .form-grid-control textarea { _AEBozAoy: 100%; background-_wiRranEp: var(--light-bg); border: 1px solid var(--border-_wiRranEp); border-radius: var(--border-radius-sm); _wiRranEp: var(--_zAgbeWTG-_wiRranEp); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_wiRranEp 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _MfYdGRxr:focus, .form-grid-control textarea:focus { border-_wiRranEp: var(--primary-_wiRranEp); box-shadow: 0 0 0 2px rgba(var(--primary-_wiRranEp-rgb), 0.2); outline: none; }
.form-grid-control input[_BeXfIBhp="_wiRranEp"] { min-_AEBozAoy: auto; padding: 2px; _AEBozAoy: 2.5em; height: 2.5em; }
.form-grid-control input[_BeXfIBhp="checkbox"] { _AEBozAoy: auto; flex-shrink: 0; height: 1.2em; _AEBozAoy: 1.2em; }
.form-grid-control ._gzyrgPGU-input { _AEBozAoy: 80px; _zAgbeWTG-align: right; }
.tooltip-_jzmPpnaq { display: inline-flex; _AEBozAoy: 16px; height: 16px; align-items: center; justify-_WtZkTPKQ: center; background-_wiRranEp: var(--secondary-_wiRranEp); _wiRranEp: var(--_WtZkTPKQ-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_MfYdGRxr: none; }
#tooltip-popup { position: fixed; background-_wiRranEp: #383c4a; _wiRranEp: #fff; padding: 10px 15px; border-radius: 6px; z-_VnTRwFZn: 10001; font-size: 0.85em; max-_AEBozAoy: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_wiRranEp); pointer-events: none; }
#custom-fields-_tnGEuHCl .form-grid-control { gap: 5px; } #custom-fields-_tnGEuHCl .form-grid-control input { flex: 1; }
.parameter-_dUmxTpdC-_AdeoCjdO { border: 1px solid var(--border-_wiRranEp); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_dUmxTpdC-_OAoAOLwG { display: flex; justify-_WtZkTPKQ: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_dUmxTpdC-_OAoAOLwG input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_AjFzYpHa: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._zAgbeWTG-_wiRranEp-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _AEBozAoy: 100%; }
._zAgbeWTG-_wiRranEp-grid input[_BeXfIBhp="_wiRranEp"] { grid-column: 1 / 2; }
._zAgbeWTG-_wiRranEp-grid input[_BeXfIBhp="_zAgbeWTG"], ._zAgbeWTG-_wiRranEp-grid textarea { grid-column: 2 / 3; }
#_nDqyLSql .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_nDqyLSql .btn-group { display: flex; }
#_nDqyLSql .sub-btn { flex-grow: 1; margin: 0; }
#_nDqyLSql ._EvMrdtNP-btn { flex-shrink: 0; margin-_hPmKcPqw: -1px; border-_AjFzYpHa-_hPmKcPqw-radius: 0; border-bottom-_hPmKcPqw-radius: 0; }
#_dpIvciII .modal-_WtZkTPKQ { max-_AEBozAoy: 300px; background: white; padding: 1rem; _zAgbeWTG-align: center; }
#qrCodeImg { max-_AEBozAoy: 100%; }
@media (max-_AEBozAoy: 768px) {
html { font-size: 15px; } ._oscpJBXX-_tnGEuHCl { padding: 0 0.8rem; } _OAoAOLwG { margin-_AjFzYpHa: 2.5rem; margin-bottom: 1.5rem; } #_zciLFaTg { _AjFzYpHa: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_PfxSPacn>
<_PfxSPacn _joTocpFS="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_WtZkTPKQ-bg: #FFFFFF; --border-_wiRranEp: #DCDFE6; --_zAgbeWTG-_wiRranEp: #303133; --_zAgbeWTG-light: #606266; }
.theme-light .card { background-_wiRranEp: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_wiRranEp: #F5F7FA; }
.theme-light tbody tr:hover { background-_wiRranEp: #ECF5FF; }
.theme-matrix { --primary-_wiRranEp: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_WtZkTPKQ-bg: #0D0208; --border-_wiRranEp: #00FF41; --_zAgbeWTG-_wiRranEp: #00FF41; --_zAgbeWTG-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_wiRranEp: rgba(0, 20, 0, 0.7); _zAgbeWTG-shadow: 0 0 5px var(--primary-_wiRranEp); backdrop-filter: none; }
.theme-matrix th { background-_wiRranEp: #000; }
.theme-matrix tbody tr:hover { background-_wiRranEp: #010; }
.theme-matrix .btn { _zAgbeWTG-shadow: none; _wiRranEp: #000; }
.theme-matrix .btn-outline { background-_wiRranEp: transparent; }
.theme-modern-glass { --primary-_wiRranEp: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_WtZkTPKQ-bg: rgba(30, 30, 40, 0.6); --border-_wiRranEp: rgba(255, 255, 255, 0.2); --_zAgbeWTG-_wiRranEp: #F0F0F0; --_zAgbeWTG-light: #A0A0B0; --border-radius-md: 12px; }
_BkcxYVCU.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-_wiRranEp: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_WtZkTPKQ-bg: rgba(30, 30, 40, 0.6); --border-_wiRranEp: rgba(255, 255, 255, 0.2); --_zAgbeWTG-_wiRranEp: #F0F0F0; --_zAgbeWTG-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_wiRranEp: var(--_WtZkTPKQ-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_wiRranEp); }
.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-_wiRranEp: rgba(0,0,0,0.3); border-right-_wiRranEp: 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); _zAgbeWTG-shadow: 0 1px 2px rgba(0,0,0,0.2); _wiRranEp: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_wiRranEp: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _zAgbeWTG-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_wiRranEp); border-_wiRranEp: var(--primary-_wiRranEp); _wiRranEp: #fff; }
.glassy-components _OAoAOLwG h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _zAgbeWTG; -webkit-_zAgbeWTG-fill-_wiRranEp: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _wiRranEp: transparent; }
.theme-aurora-glass { --primary-_wiRranEp: #38bdf8; --light-bg: #0c0a09; --_WtZkTPKQ-bg: rgba(23, 23, 23, 0.5); --border-_wiRranEp: rgba(255, 255, 255, 0.15); --_zAgbeWTG-_wiRranEp: #f2f2f2; --_zAgbeWTG-light: #a3a3a3; }
_BkcxYVCU.theme-aurora-glass::before { _WtZkTPKQ: ''; position: fixed; _AjFzYpHa: 0; _hPmKcPqw: 0; _AEBozAoy: 100%; height: 100%; z-_VnTRwFZn: -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-_wiRranEp: #08fdd8; --light-bg: #010409; --_WtZkTPKQ-bg: rgba(22, 27, 34, 0.6); --border-_wiRranEp: rgba(139, 148, 158, 0.3); --_zAgbeWTG-_wiRranEp: #e6edf3; --_zAgbeWTG-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_wiRranEp), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_wiRranEp-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_wiRranEp-rgb), 0.5); }
.theme-marble-light { --primary-_wiRranEp: #bfa37c; --light-bg: #f7f5f2; --_WtZkTPKQ-bg: #ffffff; --border-_wiRranEp: #e0dcd5; --_zAgbeWTG-_wiRranEp: #3d3a36; --_zAgbeWTG-light: #6b6661; }
_BkcxYVCU.theme-marble-light { background-image: _PSJNEttw('_yQYkytSl:image/svg+xml,%3Csvg _AEBozAoy="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-_wiRranEp: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_PfxSPacn>
</head><_BkcxYVCU _joTocpFS="pageBody">
<_WAdHokku _joTocpFS="background-_WAdHokku"></_WAdHokku>
<div _joTocpFS="_rtERQQAH">
<div class="modal-_WtZkTPKQ">
<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 _BeXfIBhp="_NnlYFPVr" _joTocpFS="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _BeXfIBhp="_NnlYFPVr" _joTocpFS="confirmPassword"></div></div>
<div class="modal-buttons"><button _joTocpFS="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_oscpJBXX-_tnGEuHCl">
<button _joTocpFS="_zciLFaTg" class="btn btn-outline"></button>
<div _joTocpFS="marquee-_tnGEuHCl"><div _joTocpFS="marquee-_zAgbeWTG"></div></div>
<_OAoAOLwG><h1 _joTocpFS="pageTitle"></h1></_OAoAOLwG>
<div class="card" _joTocpFS="visitorPasswordPrompt" _PfxSPacn="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_NnlYFPVr-input-group">
<input _BeXfIBhp="_NnlYFPVr" _joTocpFS="visitorPasswordEntry" _UBaTYvER="访客密码">
<button _joTocpFS="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _joTocpFS="_mtDDCAYY" _PfxSPacn="display: block;">
<div class="card progress-section">
<div _joTocpFS="progressDisplay">
<progress _joTocpFS="_gQVlFtjT" _gudkTzqR="0" max="100"></progress>
<div _joTocpFS="status">正在初始化...</div>
</div>
</div>
<div class="card _oscpJBXX-download-section">
<div class="section-_OAoAOLwG"><h2 _joTocpFS="appDownloadTitleEl"></h2></div>
<div class="_oscpJBXX-download-buttons">
<button class="btn" _yQYkytSl-_gSRKJGUP="android">安卓客户端</button>
<button class="btn" _yQYkytSl-_gSRKJGUP="ios">苹果客户端</button>
<button class="btn" _yQYkytSl-_gSRKJGUP="windows">Windows客户端</button>
<button class="btn" _yQYkytSl-_gSRKJGUP="mac">Mac客户端</button>
</div>
</div>
<div class="card _etOvATbc-section" _joTocpFS="_IYEZDcjR" _PfxSPacn="display:none;">
<div class="section-_OAoAOLwG">
<h2 _joTocpFS="liveTitleEl"></h2>
<div class="generator-info" _joTocpFS="liveGeneratorInfo"></div>
</div>
<div _joTocpFS="_rGTqRqJf" class="_etOvATbc-actions-_tnGEuHCl" _PfxSPacn="display: none;">
<div class="_etOvATbc-api-buttons">
<button _joTocpFS="copyIpApiBtn" class="btn">复制 IP API</button>
<button _joTocpFS="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _joTocpFS="resultsTable">
<thead><tr><th _joTocpFS="tableHeader1El"></th><th _joTocpFS="tableHeader2El"></th><th _joTocpFS="tableHeader3El"></th><th _joTocpFS="tableHeader4El"></th><th _joTocpFS="tableHeader5El"></th><th _joTocpFS="tableHeader6El"></th><th _joTocpFS="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _joTocpFS="_ySaSDmhC" _PfxSPacn="display:none;">
<div class="section-_OAoAOLwG"><h2 _joTocpFS="cachedTitleEl"></h2><div class="generator-info" _joTocpFS="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _joTocpFS="cachedResultsTable">
<thead><tr><th _joTocpFS="cachedTableHeader1El"></th><th _joTocpFS="cachedTableHeader2El"></th><th _joTocpFS="cachedTableHeader3El"></th><th _joTocpFS="cachedTableHeader4El"></th><th _joTocpFS="cachedTableHeader5El"></th><th _joTocpFS="cachedTableHeader6El"></th><th _joTocpFS="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _joTocpFS="notificationTooltip" class="tooltip-notification"></div>
<div _joTocpFS="_EPhjwMHC">
<div class="modal-_WtZkTPKQ">
<h3>修改参数</h3>
<div _PfxSPacn="display: flex; border-bottom: 1px solid var(--border-_wiRranEp); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_ClmAfIqv(event, 'general-_uFfMAEiM')">通用设置</button>
<button class="tab-button" onclick="_ClmAfIqv(event, '_KZvDtVll-_uFfMAEiM')">链接设置</button>
<button class="tab-button" onclick="_ClmAfIqv(event, 'fine-grained-_uFfMAEiM')">IP源设置</button>
<button class="tab-button" onclick="_ClmAfIqv(event, 'advanced-_uFfMAEiM')">高级设置</button>
</div>
<div _joTocpFS="general-_uFfMAEiM" class="tab-_WtZkTPKQ" _PfxSPacn="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_MfYdGRxr _joTocpFS="themeSelect">
<_RETCFXUL _gudkTzqR="theme-aurora-glass">极光-玻璃质感</_RETCFXUL>
<_RETCFXUL _gudkTzqR="theme-particles-glass">粒子-玻璃质感</_RETCFXUL>
<_RETCFXUL _gudkTzqR="theme-modern-glass">现代-玻璃质感</_RETCFXUL>
<_RETCFXUL _gudkTzqR="theme-cyberpunk-glass">赛博朋克-玻璃质感</_RETCFXUL>
<_RETCFXUL _gudkTzqR="theme-dark-particles">暗色-粒子背景</_RETCFXUL>
<_RETCFXUL _gudkTzqR="theme-dark-bing">暗色-必应壁纸</_RETCFXUL>
<_RETCFXUL _gudkTzqR="theme-light">亮色-简约</_RETCFXUL>
<_RETCFXUL _gudkTzqR="theme-light-bing">亮色-必应壁纸</_RETCFXUL>
<_RETCFXUL _gudkTzqR="theme-marble-light">简约大理石-亮色</_RETCFXUL>
<_RETCFXUL _gudkTzqR="theme-matrix">矩阵-代码雨</_RETCFXUL>
</_MfYdGRxr>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _BeXfIBhp="_wiRranEp" _joTocpFS="primaryColorInput">
<span _PfxSPacn="_AEBozAoy: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _BeXfIBhp="_wiRranEp" _joTocpFS="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PfxSPacn="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _PfxSPacn="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_zAgbeWTG-_wiRranEp-grid"><input _BeXfIBhp="_wiRranEp" _joTocpFS="colorInput_title"><textarea _joTocpFS="textInput_title" _IRBERofK="1" _UBaTYvER="页面主标题"></textarea></div>
<div class="_zAgbeWTG-_wiRranEp-grid"><input _BeXfIBhp="_wiRranEp" _joTocpFS="colorInput_loginButton"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="textInput_loginButton" _UBaTYvER="登录按钮文本"></div>
<div class="_zAgbeWTG-_wiRranEp-grid"><input _BeXfIBhp="_wiRranEp" _joTocpFS="colorInput_appDownloadTitle"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="textInput_appDownloadTitle" _UBaTYvER="APP下载标题"></div>
<div class="_zAgbeWTG-_wiRranEp-grid"><input _BeXfIBhp="_wiRranEp" _joTocpFS="colorInput_liveTitle"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="textInput_liveTitle" _UBaTYvER="本次结果标题"></div>
<div class="_zAgbeWTG-_wiRranEp-grid"><input _BeXfIBhp="_wiRranEp" _joTocpFS="colorInput_cachedTitle"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="textInput_cachedTitle" _UBaTYvER="上次结果标题"></div>
<div class="_zAgbeWTG-_wiRranEp-grid"><input _BeXfIBhp="_wiRranEp" _joTocpFS="colorInput_tableHeader"><input _BeXfIBhp="_zAgbeWTG" _gudkTzqR="表格头部文本颜色" readonly _PfxSPacn="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PfxSPacn="align-self: start;"><label>公告栏设置</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _PfxSPacn="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _joTocpFS="announcementText" _UBaTYvER="在此输入公告内容" _IRBERofK="3"></textarea>
<div _PfxSPacn="display: flex; justify-_WtZkTPKQ: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _PfxSPacn="display: flex; align-items: center; gap: 5px;"><input _BeXfIBhp="checkbox" _joTocpFS="enableMarquee"> 顶部走马灯</label>
<label _PfxSPacn="display: flex; align-items: center; gap: 5px;"><input _BeXfIBhp="checkbox" _joTocpFS="enablePopup"> 右上角弹窗</label>
<div _joTocpFS="popupDurationContainer" _PfxSPacn="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _BeXfIBhp="number" _joTocpFS="popupDuration" _PfxSPacn="_AEBozAoy: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _joTocpFS="_KZvDtVll-_uFfMAEiM" class="tab-_WtZkTPKQ">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="converterServiceUrlInput" _UBaTYvER="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _BeXfIBhp="number" _joTocpFS="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _PfxSPacn="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _joTocpFS="subscriptionIdCharset" _IRBERofK="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-_jzmPpnaq" _yQYkytSl-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _PfxSPacn="justify-_WtZkTPKQ: flex-start;"><input _BeXfIBhp="checkbox" _joTocpFS="enableItemLinkCheckbox"></div>
</div>
<div _joTocpFS="itemLinkConfigGroup" _PfxSPacn="display:none; margin-_AjFzYpHa: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _PfxSPacn="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="定义分享链接格式。可用占位符: {_SXgiuKqH}, {_STTIXetB}, {_HBGHaqWn}, {rank}, {_UhgkofCe}, {_iiwThCmh}, {_TXGWBDeK}, {_bOvLeAhR}, {_vfcwsRdY}。">?</span></div>
<div class="form-grid-control"><textarea _joTocpFS="itemLinkTemplateInput" _IRBERofK="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_MfYdGRxr _joTocpFS="parameterSelectionMode"></_MfYdGRxr></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _joTocpFS="parameter-sets-_tnGEuHCl"></div><button _BeXfIBhp="button" _joTocpFS="add-parameter-_dUmxTpdC-btn" class="btn btn-outline" _PfxSPacn="margin-_AjFzYpHa: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PfxSPacn="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _joTocpFS="custom-fields-_tnGEuHCl" _PfxSPacn="_AEBozAoy: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _PfxSPacn="justify-_WtZkTPKQ: flex-start;"><button _BeXfIBhp="button" _joTocpFS="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _joTocpFS="fine-grained-_uFfMAEiM" class="tab-_WtZkTPKQ">
<div class="form-grid-label" _PfxSPacn="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _PfxSPacn="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_WtZkTPKQ: flex-start;">
<label><input _BeXfIBhp="checkbox" _joTocpFS="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _BeXfIBhp="checkbox" _joTocpFS="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _joTocpFS="fine-grained-sources-_tnGEuHCl"></div><button _BeXfIBhp="button" _joTocpFS="add-fine-grained-_bfQessFD-btn" class="btn btn-outline" _PfxSPacn="margin-_AjFzYpHa: 10px;">添加地区</button></div>
</div>
<div _joTocpFS="advanced-_uFfMAEiM" class="tab-_WtZkTPKQ">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _BeXfIBhp="checkbox" _joTocpFS="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _joTocpFS="resolvedDomainsGroup" _PfxSPacn="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _joTocpFS="resolvedDomainsInput" _UBaTYvER="留空则使用内置默认域名" _IRBERofK="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-_jzmPpnaq" _yQYkytSl-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _BeXfIBhp="checkbox" _joTocpFS="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _joTocpFS="customNodesGroup" _PfxSPacn="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _joTocpFS="customNodesInput" _UBaTYvER="一行一个地址,支持域名、IPv4、IPv6。" _IRBERofK="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-_jzmPpnaq" _yQYkytSl-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _BeXfIBhp="number" _joTocpFS="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _BeXfIBhp="number" _joTocpFS="topNInput"></div>
<div class="form-grid-label" _PfxSPacn="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _PfxSPacn="display: none;"><input _BeXfIBhp="number" _joTocpFS="latencyRangeMinInput" _UBaTYvER="最小"><span>-</span><input _BeXfIBhp="number" _joTocpFS="latencyRangeMaxInput" _UBaTYvER="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _PfxSPacn="justify-_WtZkTPKQ: flex-start;"><input _BeXfIBhp="checkbox" _joTocpFS="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-_jzmPpnaq" _yQYkytSl-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _BeXfIBhp="number" _joTocpFS="geoLocationRetriesInput" _PfxSPacn="_AEBozAoy: 80px;"> <span>次</span>
<div _PfxSPacn="display: flex; align-items: center; gap: 5px; margin-_hPmKcPqw: 20px;">
<input _BeXfIBhp="checkbox" _joTocpFS="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-_jzmPpnaq" _yQYkytSl-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_TXGWBDeK:_STTIXetB' 或 '_TXGWBDeK'。">?</span></div>
<div class="form-grid-control"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="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-_jzmPpnaq" _yQYkytSl-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _PfxSPacn="justify-_WtZkTPKQ: flex-start;"><input _BeXfIBhp="checkbox" _joTocpFS="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _joTocpFS="websocketStreamerGroup" _PfxSPacn="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="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-_jzmPpnaq" _yQYkytSl-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _PfxSPacn="justify-_WtZkTPKQ: flex-start;"><input _BeXfIBhp="checkbox" _joTocpFS="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="启用 /_SXgiuKqH 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _PfxSPacn="justify-_WtZkTPKQ: flex-start;"><input _BeXfIBhp="checkbox" _joTocpFS="enableApiCheckbox"></div>
<div class="form-grid-control-full" _joTocpFS="apiConfigGroup" _PfxSPacn="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="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-_jzmPpnaq" _yQYkytSl-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _PfxSPacn="justify-_WtZkTPKQ: flex-start;"><input _BeXfIBhp="checkbox" _joTocpFS="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _joTocpFS="customSubPathGroup" _PfxSPacn="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="customSubPathInput" _UBaTYvER="例如: 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-_jzmPpnaq" _yQYkytSl-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _PfxSPacn="justify-_WtZkTPKQ: flex-start;"><input _BeXfIBhp="checkbox" _joTocpFS="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _joTocpFS="visitorPasswordGroup" _PfxSPacn="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PfxSPacn="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_jzmPpnaq" _yQYkytSl-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _PfxSPacn="flex-direction: column; align-items: stretch; gap: 8px;"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="botTokenInput" _UBaTYvER="Telegram Bot Token"><input _BeXfIBhp="_zAgbeWTG" _joTocpFS="chatIdInput" _UBaTYvER="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PfxSPacn="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _PfxSPacn="flex-direction: column; align-items: stretch; gap: 8px;"><input _BeXfIBhp="_NnlYFPVr" _joTocpFS="oldPasswordInput" _UBaTYvER="旧密码"><input _BeXfIBhp="_NnlYFPVr" _joTocpFS="newPasswordInput" _UBaTYvER="新密码 (至少6位)"><button _joTocpFS="changePasswordBtn" class="btn" _PfxSPacn="align-self: flex-start; margin-_hPmKcPqw: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _joTocpFS="closeModalBtn" class="btn btn-outline">关闭</button><button _joTocpFS="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _joTocpFS="_KlZweFWm">
<div class="_oscpJBXX-modal-_WtZkTPKQ">
<div class="_oscpJBXX-modal-_OAoAOLwG"><h3 _joTocpFS="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_oscpJBXX-modal-_BkcxYVCU" _joTocpFS="appModalBody"></div>
</div>
</div>
<div _joTocpFS="_nDqyLSql">
<div class="modal-_WtZkTPKQ">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _yQYkytSl-sub-_BeXfIBhp="coreEngine">Xray</button><button class="btn _EvMrdtNP-btn" _yQYkytSl-sub-_BeXfIBhp="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _yQYkytSl-sub-_BeXfIBhp="coreProfile">Sing-Box</button><button class="btn _EvMrdtNP-btn" _yQYkytSl-sub-_BeXfIBhp="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _yQYkytSl-sub-_BeXfIBhp="configProfile">Clash</button><button class="btn _EvMrdtNP-btn" _yQYkytSl-sub-_BeXfIBhp="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _yQYkytSl-sub-_BeXfIBhp="policyProfile">Surge</button><button class="btn _EvMrdtNP-btn" _yQYkytSl-sub-_BeXfIBhp="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _PfxSPacn="justify-_WtZkTPKQ: center;"><button class="btn btn-outline" _joTocpFS="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _joTocpFS="_dpIvciII">
<div class="modal-_WtZkTPKQ">
<img _joTocpFS="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _gWTrqJkR = {
isValid: (_SXgiuKqH) => _gWTrqJkR.isIPv4(_SXgiuKqH) || _gWTrqJkR.isIPv6(_SXgiuKqH),
isIPv4: (_SXgiuKqH) => {
if (typeof _SXgiuKqH !== 'string') return false;
const _gwihScoG = _SXgiuKqH.split('.');
if (_gwihScoG._buUZGShz !== 4) return false;
return _gwihScoG.every(_YePsxUmE => {
const _hPrdgEAP = parseInt(_YePsxUmE, 10);
return !isNaN(_hPrdgEAP) && _hPrdgEAP >= 0 && _hPrdgEAP <= 255 && String(_hPrdgEAP) === _YePsxUmE;
});
},
isIPv6: (_SXgiuKqH) => {
if (typeof _SXgiuKqH !== '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]))$/_OEUMmbfs.test(_SXgiuKqH);
},
toLong4: (_SXgiuKqH) => _SXgiuKqH.split('.').reduce((acc, octet, _OEUMmbfs) => acc + (parseInt(octet) << (8*(3-_OEUMmbfs))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_SXgiuKqH) => {
try {
const _IlqNhKRb = _SXgiuKqH.split('/')[0];
const _gwihScoG = _IlqNhKRb.split('::');
if (_gwihScoG._buUZGShz > 2) return 0n;
let _HpvBDziL = [];
if (_gwihScoG[0]) {
_HpvBDziL = _gwihScoG[0].split(':');
}
let _LuFPiWLC = [];
if (_gwihScoG._buUZGShz > 1 && _gwihScoG[1]) {
_LuFPiWLC = _gwihScoG[1].split(':');
}
if (_HpvBDziL._buUZGShz + _LuFPiWLC._buUZGShz > 8) return 0n;
const _rlTdKjBa = 8 - (_HpvBDziL._buUZGShz + _LuFPiWLC._buUZGShz);
const _QRoDxExd = [
..._HpvBDziL,
...Array(_rlTdKjBa).fill('0'),
..._LuFPiWLC
].map(_YePsxUmE => _YePsxUmE || '0');
while(_QRoDxExd._buUZGShz < 8) {
_QRoDxExd.push('0');
}
let _juaTMOOw = 0n;
for (const _YePsxUmE of _QRoDxExd) {
if (_YePsxUmE._buUZGShz > 4) return 0n;
const _gudkTzqR = BigInt('0x' + _YePsxUmE);
_juaTMOOw = (_juaTMOOw << 16n) | _gudkTzqR;
}
return _juaTMOOw;
} catch(_PYcZMUbl) {
return 0n;
}
},
fromBigInt6: (_juaTMOOw) => {
if (typeof _juaTMOOw !== '_juaTMOOw' || _juaTMOOw < 0n) return null;
const _gwihScoG = [];
for (let _OEUMmbfs = 0; _OEUMmbfs < 8; _OEUMmbfs++) {
_gwihScoG.unshift((_juaTMOOw & 0xFFFFn).toString(16));
_juaTMOOw >>= 16n;
}
let _fMPFokio = { start: -1, _EbIxBbxA: 0 };
let _eJHOABWR = { start: -1, _EbIxBbxA: 0 };
for (let _OEUMmbfs = 0; _OEUMmbfs < 8; _OEUMmbfs++) {
if (_gwihScoG[_OEUMmbfs] === '0') {
if (_eJHOABWR.start === -1) _eJHOABWR.start = _OEUMmbfs;
_eJHOABWR._EbIxBbxA++;
} else {
if (_eJHOABWR._EbIxBbxA > _fMPFokio._EbIxBbxA) _fMPFokio = { ..._eJHOABWR };
_eJHOABWR = { start: -1, _EbIxBbxA: 0 };
}
}
if (_eJHOABWR._EbIxBbxA > _fMPFokio._EbIxBbxA) _fMPFokio = { ..._eJHOABWR };
if (_fMPFokio._EbIxBbxA > 1) {
_gwihScoG.splice(_fMPFokio.start, _fMPFokio._EbIxBbxA, '');
if (_fMPFokio.start === 0) _gwihScoG.unshift('');
if (_fMPFokio.start + _fMPFokio._EbIxBbxA === 8) _gwihScoG.push('');
}
return _gwihScoG.join(':');
},
cidrToRange: (cidr, _VKFstGtG = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _jglzTJuE = parseInt(bitsStr, 10);
const _DXSpaMDv = new Set();
if (_gWTrqJkR.isIPv4(range)) {
if (isNaN(_jglzTJuE) || _jglzTJuE < 8 || _jglzTJuE > 32) return [];
if (_jglzTJuE === 32) return [range];
const _VAkZkplG = _gWTrqJkR.toLong4(range);
const _qysEFnCP = (0xFFFFFFFF << (32 - _jglzTJuE)) >>> 0;
const _hOmoKFUA = _VAkZkplG & _qysEFnCP;
const _CAVxhkUt = 1 << (32 - _jglzTJuE);
if (_CAVxhkUt <= 2) return [];
const _gLevWZVP = Math.min(_VKFstGtG, _CAVxhkUt - 2);
let _vNLQojTA = 0;
while (_DXSpaMDv.size < _gLevWZVP && _vNLQojTA < _gLevWZVP * 5) {
const _OVuBwKgv = Math.floor(Math.random() * (_CAVxhkUt - 2)) + 1;
_DXSpaMDv.add(_gWTrqJkR.fromLong4((_hOmoKFUA + _OVuBwKgv) >>> 0));
_vNLQojTA++;
}
return Array.from(_DXSpaMDv);
} else if (_gWTrqJkR.isIPv6(range)) {
if (isNaN(_jglzTJuE) || _jglzTJuE < 16 || _jglzTJuE > 128) return [];
if (_jglzTJuE === 128) return [range];
const _fgpOBYPH = _gWTrqJkR.toBigInt6(range);
const _qysEFnCP = (2n ** BigInt(128 - _jglzTJuE) - 1n);
const _hOmoKFUA = _fgpOBYPH & ~_qysEFnCP;
const _XMhhdWyx = 2n ** BigInt(128 - _jglzTJuE);
if (_XMhhdWyx <= 2n) return [];
let _vNLQojTA = 0;
while (_DXSpaMDv.size < _VKFstGtG && _vNLQojTA < _VKFstGtG * 5) {
const _IbMpwHML = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_IbMpwHML);
let _IvBSNLKH = 0n;
for (const _hZPmimGt of _IbMpwHML) {
_IvBSNLKH = (_IvBSNLKH << 8n) | BigInt(_hZPmimGt);
}
const _OVuBwKgv = _IvBSNLKH % (_XMhhdWyx - 2n) + 1n;
_DXSpaMDv.add(_gWTrqJkR.fromBigInt6(_hOmoKFUA + _OVuBwKgv));
_vNLQojTA++;
}
return Array.from(_DXSpaMDv);
}
return [];
} catch(_PYcZMUbl) {
console.error(`CIDR to range failed for ${cidr}:`, _PYcZMUbl);
return [];
}
}
};
function _dwhnBvgI(_UuDbTJRi, _ojKOktnn) {
const _GnFJoGgp = {};
const _jfrfcGXG = Object._jfrfcGXG(_ojKOktnn);
const _gwihScoG = _jfrfcGXG.map(_OdTxZQdE => {
const _JvcFykSp = _UuDbTJRi * (_ojKOktnn[_OdTxZQdE] / 100);
return { _OdTxZQdE, _VKFstGtG: Math.floor(_JvcFykSp), remainder: _JvcFykSp - Math.floor(_JvcFykSp) };
});
let _RAEGdznj = _gwihScoG.reduce((acc, _YePsxUmE) => acc + _YePsxUmE._VKFstGtG, 0);
_gwihScoG.sort((a, b) => b.remainder - a.remainder);
let _ZWfHbcGu = _UuDbTJRi - _RAEGdznj;
for (let _OEUMmbfs = 0; _OEUMmbfs < _ZWfHbcGu; _OEUMmbfs++) {
_gwihScoG[_OEUMmbfs % _gwihScoG._buUZGShz]._VKFstGtG++;
}
for (const _YePsxUmE of _gwihScoG) {
_GnFJoGgp[_YePsxUmE._OdTxZQdE] = _YePsxUmE._VKFstGtG;
}
return _GnFJoGgp;
}
const _LFcQyTyc = __PAGE_DATA_JSON__;
const _JUppGbBF = _LFcQyTyc._NphbyHQe;
const _RQpBNBWt = _LFcQyTyc.status;
const _RNrTNqXC = __ALL_CF_CIDR_LIST_JSON__;
const _ElmfxIHK = __BALANCED_CF_CIDR_LIST_JSON__;
const _TIAaYoOa = __DEFAULT_DOMAINS_LIST_JSON__;
const _jWGdUbdE = __COUNTRY_MAP_JSON__;
const _HkUZrONL = _jWGdUbdE;
const _HlELWLUs = 2500;
const _IsESwggg = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _mtDDCAYY = document.getElementById('_mtDDCAYY');
const _gQVlFtjT = document.getElementById('_gQVlFtjT');
const _nTrFNVTY = document.getElementById('status');
const _IYEZDcjR = document.getElementById('_IYEZDcjR');
const _enxTRPDY = document.getElementById('resultsTable').querySelector('tbody');
const _ySaSDmhC = document.getElementById('_ySaSDmhC');
const _znKUbeiz = document.getElementById('cachedResultsTable').querySelector('tbody');
const _pEzGWoCn = document.getElementById('notificationTooltip');
const _zciLFaTg = document.getElementById('_zciLFaTg');
const _EPhjwMHC = document.getElementById('_EPhjwMHC');
const _KlZweFWm = document.getElementById('_KlZweFWm');
const _nDqyLSql = document.getElementById('_nDqyLSql');
const _dpIvciII = document.getElementById('_dpIvciII');
const _rtERQQAH = document.getElementById('_rtERQQAH');
const _rGTqRqJf = document.getElementById('_rGTqRqJf');
let _mCJkJGse = null;
let _rDzmZOYG = null;
let _emktypsv = [];
let _cQQLGnjq = false;
let _pQBkMocR = null;
function _jjDFqGJO(_JTbZMVXt, _clFJzCfI) {
const _aQXUTuMK=parseInt(_JTbZMVXt.slice(1),16),t=_clFJzCfI<0?0:255,p=_clFJzCfI<0?_clFJzCfI*-1:_clFJzCfI,R=_aQXUTuMK>>16,G=_aQXUTuMK>>8&0x00FF,B=_aQXUTuMK&0x0000FF;
const _wzoXGdqE = Math.round((t-R)*p)+R;
const _UHpRDdxY = Math.round((t-G)*p)+G;
const _jVzEUYbx = Math.round((t-B)*p)+B;
return `rgb(${_wzoXGdqE.toString()}, ${_UHpRDdxY.toString()}, ${_jVzEUYbx.toString()})`;
}
function _FlOnsugP(_uFfMAEiM) {
const _SHgGWPpP = _cMpJUvCn(_uFfMAEiM.primaryColor);
if(_SHgGWPpP) {
document.documentElement._PfxSPacn.setProperty('--primary-_wiRranEp-rgb', `${_SHgGWPpP.r},${_SHgGWPpP.g},${_SHgGWPpP.b}`);
}
document.documentElement._PfxSPacn.setProperty('--primary-_wiRranEp', _uFfMAEiM.primaryColor);
document.documentElement._PfxSPacn.setProperty('--primary-hover', _jjDFqGJO(_uFfMAEiM.primaryColor, -0.1));
document.documentElement._PfxSPacn.setProperty('--primary-gradient-start', _jjDFqGJO(_uFfMAEiM.primaryColor, 0.1));
document.documentElement._PfxSPacn.setProperty('--primary-gradient-end', _jjDFqGJO(_uFfMAEiM.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _uFfMAEiM.texts.title;
document.title = _uFfMAEiM.texts.title;
_zciLFaTg.innerText = _mCJkJGse ? _uFfMAEiM.texts.loginButtonSuccess : _uFfMAEiM.texts.loginButton;
_zciLFaTg._PfxSPacn._wiRranEp = _uFfMAEiM.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _uFfMAEiM.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _uFfMAEiM.texts.liveTitle;
document.getElementById('liveTitleEl')._PfxSPacn._wiRranEp = _uFfMAEiM.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _uFfMAEiM.texts.cachedTitle;
document.getElementById('cachedTitleEl')._PfxSPacn._wiRranEp = _uFfMAEiM.colors.cachedTitle;
const _ErTBALIz = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_ErTBALIz.forEach((_joTocpFS, _VnTRwFZn) => {
const _tTNJfLdY = document.getElementById(_joTocpFS);
if (_tTNJfLdY) _tTNJfLdY.innerText = _uFfMAEiM.texts[`tableHeader${_VnTRwFZn + 1}`] || '';
});
const _aSuGQttW = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_aSuGQttW.forEach((_joTocpFS, _VnTRwFZn) => {
const _tTNJfLdY = document.getElementById(_joTocpFS);
if (_tTNJfLdY) _tTNJfLdY.innerText = _JUppGbBF.texts[`tableHeader${_VnTRwFZn + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._PfxSPacn._wiRranEp = _uFfMAEiM.colors.tableHeader);
document._BkcxYVCU.className = '';
document._BkcxYVCU.classList.add(_uFfMAEiM.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_uFfMAEiM.theme)) {
document._BkcxYVCU.classList.add('glassy-components');
}
document._BkcxYVCU._PfxSPacn.backgroundImage = '';
_pNlbCkNJ();
if (_uFfMAEiM.theme.includes('particles') || _uFfMAEiM.theme.includes('glass')) {
_idRJMmmL(_uFfMAEiM.particleColor);
} else if (_uFfMAEiM.theme.includes('bing')) {
document._BkcxYVCU._PfxSPacn.backgroundImage = '_PSJNEttw(/bing-wallpaper)';
}
}
function _UckeioPI() {
_mCJkJGse = null;
if(_rDzmZOYG) clearTimeout(_rDzmZOYG);
_FlOnsugP(_JUppGbBF);
_ivikqmKS("登录已超时,请重新登录。", "warning");
}
async function _ulfWeiZx() {
if (_mCJkJGse) {
_kYWiccND();
return;
}
const _ripSfXuB = prompt('请输入管理员密码:');
if (!_ripSfXuB) return;
try {
const _fjiAUfpp = await fetch('/api/verify-_NnlYFPVr', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify({ _NnlYFPVr: _ripSfXuB })
});
const _fivNXJGH = await _fjiAUfpp.json();
if (_fivNXJGH.success) {
_mCJkJGse = _ripSfXuB;
_ivikqmKS("登录成功!有效期5分钟。", "success");
if (_rDzmZOYG) clearTimeout(_rDzmZOYG);
_rDzmZOYG = setTimeout(_UckeioPI, 5 * 60 * 1000);
_FlOnsugP(_JUppGbBF);
_kYWiccND();
} else {
throw new Error(_fivNXJGH._CmgWzXJB || '密码验证失败');
}
} catch (_PYcZMUbl) {
_ivikqmKS(`登录失败: ${_PYcZMUbl._CmgWzXJB}`, "error");
}
}
function _boepuyHw() {
if (!_RQpBNBWt._wxReoYQk) {
_rtERQQAH._PfxSPacn.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _NnlYFPVr = document.getElementById('initialPassword')._gudkTzqR;
const _Ksgnnugv = document.getElementById('confirmPassword')._gudkTzqR;
if (_NnlYFPVr !== _Ksgnnugv) {
_ivikqmKS("两次输入的密码不一致!", "error");
return;
}
if (_NnlYFPVr._buUZGShz < 6) {
_ivikqmKS("密码长度不能少于6位!", "error");
return;
}
try {
const _fjiAUfpp = await fetch('/api/_dUmxTpdC-_NnlYFPVr', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify({ _NnlYFPVr })
});
const _fivNXJGH = await _fjiAUfpp.json();
if (_fivNXJGH.success) {
_ivikqmKS(_fivNXJGH._CmgWzXJB, "success");
setTimeout(() => _UhgkofCe.reload(), 1500);
} else {
throw new Error(_fivNXJGH._CmgWzXJB);
}
} catch(_PYcZMUbl) {
_ivikqmKS(`设置密码失败: ${_PYcZMUbl._CmgWzXJB}`, "error");
}
});
return;
}
_zciLFaTg.addEventListener('click', _ulfWeiZx);
document.getElementById('closeModalBtn').addEventListener('click', () => { _EPhjwMHC._PfxSPacn.display = 'none'; });
_EPhjwMHC.addEventListener('click', (_PYcZMUbl) => { if (_PYcZMUbl.target === _EPhjwMHC) _EPhjwMHC._PfxSPacn.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_tnGEuHCl .fine-grained-_WcKsucyv-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-_tnGEuHCl .fine-grained-_WcKsucyv-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_mCJkJGse) {
_ivikqmKS("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _PUvdCevx = [];
document.querySelectorAll('#custom-fields-_tnGEuHCl .custom-field-_AdeoCjdO').forEach(_AdeoCjdO => {
const _HBGHaqWn = _AdeoCjdO.querySelector('.custom-field-_HBGHaqWn')._gudkTzqR.trim();
const _gudkTzqR = _AdeoCjdO.querySelector('.custom-field-_gudkTzqR')._gudkTzqR.trim();
if (_HBGHaqWn) _PUvdCevx.push({ _HBGHaqWn, _gudkTzqR });
});
const _QuTsIToJ = [];
document.querySelectorAll('#parameter-sets-_tnGEuHCl .parameter-_dUmxTpdC-_AdeoCjdO').forEach(_AdeoCjdO => {
const _HBGHaqWn = _AdeoCjdO.querySelector('.param-_dUmxTpdC-_HBGHaqWn')._gudkTzqR.trim();
const _TXGWBDeK = _AdeoCjdO.querySelector('.param-_dUmxTpdC-_TXGWBDeK')._gudkTzqR.trim();
const _bOvLeAhR = _AdeoCjdO.querySelector('.param-_dUmxTpdC-_bOvLeAhR')._gudkTzqR.trim();
const _vfcwsRdY = _AdeoCjdO.querySelector('.param-_dUmxTpdC-_vfcwsRdY')._gudkTzqR.trim();
if(_HBGHaqWn) _QuTsIToJ.push({ _HBGHaqWn, _TXGWBDeK, '_bOvLeAhR': _bOvLeAhR, _vfcwsRdY });
});
const _RIhgrIyG = [];
document.querySelectorAll('#fine-grained-sources-_tnGEuHCl .fine-grained-_bfQessFD-_AdeoCjdO').forEach(_AdeoCjdO => {
const _UhgkofCe = _AdeoCjdO.querySelector('.fine-grained-_UhgkofCe')._gudkTzqR.trim();
const _DXSpaMDv = _AdeoCjdO.querySelector('.fine-grained-_DXSpaMDv')._gudkTzqR.trim();
const _WcKsucyv = _AdeoCjdO.querySelector('.fine-grained-_WcKsucyv-cb').checked;
const _gzyrgPGU = parseInt(_AdeoCjdO.querySelector('.fine-grained-_gzyrgPGU')._gudkTzqR, 10) || 0;
const _wXANeYZh = _AdeoCjdO.querySelector('.use-_HBGHaqWn-as-_UhgkofCe-cb').checked;
if (_UhgkofCe && _DXSpaMDv) {
_RIhgrIyG.push({ _UhgkofCe, _DXSpaMDv, _WcKsucyv, _gzyrgPGU, _wXANeYZh });
}
});
let _KoTuAEIh = parseInt(document.getElementById('subscriptionIdLength')._gudkTzqR, 10);
if (isNaN(_KoTuAEIh) || _KoTuAEIh < 2) _KoTuAEIh = 2;
if (_KoTuAEIh > 128) _KoTuAEIh = 128;
const _pNYFCiDr = {
theme: document.getElementById('themeSelect')._gudkTzqR,
primaryColor: document.getElementById('primaryColorInput')._gudkTzqR,
particleColor: document.getElementById('particleColorInput')._gudkTzqR,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._gudkTzqR,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._gudkTzqR, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._gudkTzqR, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._gudkTzqR, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._gudkTzqR, 10) || 0,
_PtDFrgDq: document.getElementById('converterServiceUrlInput')._gudkTzqR.trim(),
subscriptionId: {
_buUZGShz: _KoTuAEIh,
_rDytWtAs: document.getElementById('subscriptionIdCharset')._gudkTzqR.trim()
},
api: {
_WcKsucyv: document.getElementById('enableApiCheckbox').checked,
_CmgWzXJB: document.getElementById('apiMessageInput')._gudkTzqR || '维护中...',
},
ispFilter: {
_WcKsucyv: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._gudkTzqR, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_WcKsucyv: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_WcKsucyv: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_PSJNEttw: document.getElementById('websocketStreamerUrlInput')._gudkTzqR.trim()
},
visitorPassword: {
_WcKsucyv: document.getElementById('enableVisitorPasswordCheckbox').checked,
_NnlYFPVr: document.getElementById('visitorPasswordInput')._gudkTzqR.trim()
},
customSubPath: {
_WcKsucyv: document.getElementById('enableCustomSubPathCheckbox').checked,
_vfcwsRdY: document.getElementById('customSubPathInput')._gudkTzqR.trim()
},
itemLink: {
_WcKsucyv: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._gudkTzqR,
selectionMode: document.getElementById('parameterSelectionMode')._gudkTzqR,
_QuTsIToJ: _QuTsIToJ,
_PUvdCevx: _PUvdCevx,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._gudkTzqR.trim(),
},
announcement: {
popup: {
_WcKsucyv: document.getElementById('enablePopup').checked,
_zAgbeWTG: document.getElementById('announcementText')._gudkTzqR,
_vGjGgakU: parseInt(document.getElementById('popupDuration')._gudkTzqR, 10) || 5
},
marquee: {
_WcKsucyv: document.getElementById('enableMarquee').checked,
_zAgbeWTG: document.getElementById('announcementText')._gudkTzqR
}
},
fineGrained: {
_WcKsucyv: true,
sources: _RIhgrIyG
},
customNodes: {
_WcKsucyv: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._gudkTzqR
},
texts: {
title: document.getElementById('textInput_title')._gudkTzqR,
loginButton: document.getElementById('textInput_loginButton')._gudkTzqR,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._gudkTzqR,
liveTitle: document.getElementById('textInput_liveTitle')._gudkTzqR,
cachedTitle: document.getElementById('textInput_cachedTitle')._gudkTzqR,
},
colors: {
title: document.getElementById('colorInput_title')._gudkTzqR,
loginButton: document.getElementById('colorInput_loginButton')._gudkTzqR,
liveTitle: document.getElementById('colorInput_liveTitle')._gudkTzqR,
cachedTitle: document.getElementById('colorInput_cachedTitle')._gudkTzqR,
tableHeader: document.getElementById('colorInput_tableHeader')._gudkTzqR,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._gudkTzqR.trim(),
chat_id: document.getElementById('chatIdInput')._gudkTzqR.trim(),
},
};
try {
const _fjiAUfpp = await fetch('/api/_NphbyHQe', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify({ _NphbyHQe: _pNYFCiDr, adminPassword: _mCJkJGse })
});
const _fivNXJGH = await _fjiAUfpp.json();
if (_fjiAUfpp.ok && _fivNXJGH.success) {
_ivikqmKS("配置已保存,正在刷新...", "success");
setTimeout(() => _UhgkofCe.reload(), 1500);
} else {
throw new Error(_fivNXJGH._CmgWzXJB || '未知错误');
}
} catch (_PYcZMUbl) {
_ivikqmKS(`操作失败: ${_PYcZMUbl._CmgWzXJB}`, "error");
if (String(_PYcZMUbl._CmgWzXJB).includes("密码错误")) {
_UckeioPI();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _QJCeIluZ = document.getElementById('oldPasswordInput')._gudkTzqR;
const _ewGbjnqA = document.getElementById('newPasswordInput')._gudkTzqR;
if (!_QJCeIluZ || !_ewGbjnqA) {
_ivikqmKS("新旧密码均不能为空!", "error");
return;
}
try {
const _fjiAUfpp = await fetch('/api/change-_NnlYFPVr', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify({ _QJCeIluZ, _ewGbjnqA })
});
const _fivNXJGH = await _fjiAUfpp.json();
if (_fivNXJGH.success) {
_ivikqmKS(_fivNXJGH._CmgWzXJB, "success");
document.getElementById('oldPasswordInput')._gudkTzqR = '';
document.getElementById('newPasswordInput')._gudkTzqR = '';
_mCJkJGse = _ewGbjnqA;
} else {
throw new Error(_fivNXJGH._CmgWzXJB);
}
} catch(_PYcZMUbl) {
_ivikqmKS(`修改密码失败: ${_PYcZMUbl._CmgWzXJB}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_PYcZMUbl) => {
document.getElementById('resolvedDomainsGroup')._PfxSPacn.display = _PYcZMUbl.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_PYcZMUbl) => {
document.getElementById('customNodesGroup')._PfxSPacn.display = _PYcZMUbl.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_PYcZMUbl) => {
document.getElementById('apiConfigGroup')._PfxSPacn.display = _PYcZMUbl.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_PYcZMUbl) => {
document.getElementById('itemLinkConfigGroup')._PfxSPacn.display = _PYcZMUbl.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_PYcZMUbl) => {
document.getElementById('websocketStreamerGroup')._PfxSPacn.display = _PYcZMUbl.target.checked ? 'block' : 'none';
const _obBHjRsf = document.querySelector('#parameter-sets-_tnGEuHCl .param-_dUmxTpdC-_vfcwsRdY');
if (_obBHjRsf) {
if (_PYcZMUbl.target.checked) {
_obBHjRsf._gudkTzqR = '/snippets?_SXgiuKqH=endpointAddress:_STTIXetB(443)&nat64=6to4';
} else {
_obBHjRsf._gudkTzqR = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_fjytQYDu('', '');
});
document.getElementById('add-parameter-_dUmxTpdC-btn').addEventListener('click', () => {
const _VKFstGtG = document.querySelectorAll('.parameter-_dUmxTpdC-_AdeoCjdO')._buUZGShz + 1;
_AsDeipXw({_HBGHaqWn: `配置${_VKFstGtG}`, _TXGWBDeK: '', _bOvLeAhR: '', _vfcwsRdY: ''});
_GwDNmcGk();
});
document.getElementById('add-fine-grained-_bfQessFD-btn').addEventListener('click', () => {
_qBUZluYT({ _UhgkofCe: '', _DXSpaMDv: '', _WcKsucyv: true, _gzyrgPGU: 50, _wXANeYZh: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_PYcZMUbl) => {
document.getElementById('visitorPasswordGroup')._PfxSPacn.display = _PYcZMUbl.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_PYcZMUbl) => {
document.getElementById('customSubPathGroup')._PfxSPacn.display = _PYcZMUbl.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_PYcZMUbl) => {
document.getElementById('popupDurationContainer')._PfxSPacn.display = _PYcZMUbl.target.checked ? 'flex' : 'none';
});
}
function _fjytQYDu(_HBGHaqWn, _gudkTzqR) {
const _tnGEuHCl = document.getElementById('custom-fields-_tnGEuHCl');
const _rEPvuyQv = document.createElement('div');
_rEPvuyQv.className = 'form-grid custom-field-_AdeoCjdO';
_rEPvuyQv._PfxSPacn = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_rEPvuyQv.innerHTML = `
<input _BeXfIBhp="_zAgbeWTG" class="custom-field-_HBGHaqWn" _UBaTYvER="占位符名称" _gudkTzqR="${_HBGHaqWn}">
<input _BeXfIBhp="_zAgbeWTG" class="custom-field-_gudkTzqR" _UBaTYvER="值" _gudkTzqR="${_gudkTzqR}">
<button _BeXfIBhp="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_tnGEuHCl.appendChild(_rEPvuyQv);
}
function _AsDeipXw(_dUmxTpdC) {
const _tnGEuHCl = document.getElementById('parameter-sets-_tnGEuHCl');
const _rEPvuyQv = document.createElement('div');
_rEPvuyQv.className = 'parameter-_dUmxTpdC-_AdeoCjdO';
_rEPvuyQv.innerHTML = `
<div class="parameter-_dUmxTpdC-_OAoAOLwG">
<input _BeXfIBhp="_zAgbeWTG" class="param-_dUmxTpdC-_HBGHaqWn" _UBaTYvER="配置名称" _gudkTzqR="${_dUmxTpdC._HBGHaqWn}" oninput="_GwDNmcGk()">
<button _BeXfIBhp="button" class="btn btn-outline" onclick="this.closest('.parameter-_dUmxTpdC-_AdeoCjdO').remove(); _GwDNmcGk();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _BeXfIBhp="_zAgbeWTG" class="param-_dUmxTpdC-_TXGWBDeK" _gudkTzqR="${_dUmxTpdC._TXGWBDeK || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _BeXfIBhp="_zAgbeWTG" class="param-_dUmxTpdC-_bOvLeAhR" _gudkTzqR="${_dUmxTpdC['_bOvLeAhR'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _BeXfIBhp="_zAgbeWTG" class="param-_dUmxTpdC-_vfcwsRdY" _gudkTzqR="${_dUmxTpdC._vfcwsRdY || ''}"></div>
</div>
`;
_tnGEuHCl.appendChild(_rEPvuyQv);
}
function _GwDNmcGk() {
const _MfYdGRxr = document.getElementById('parameterSelectionMode');
const _uuOUdZha = _MfYdGRxr._gudkTzqR;
_MfYdGRxr.innerHTML = '';
const _MocYKqdb = document.createElement('_RETCFXUL');
_MocYKqdb._gudkTzqR = 'random';
_MocYKqdb.textContent = '随机轮询';
_MfYdGRxr.appendChild(_MocYKqdb);
const _AwYRaZWR = document.createElement('_RETCFXUL');
_AwYRaZWR._gudkTzqR = 'first';
_AwYRaZWR.textContent = '使用第一组';
_MfYdGRxr.appendChild(_AwYRaZWR);
document.querySelectorAll('.param-_dUmxTpdC-_HBGHaqWn').forEach(input => {
const _HBGHaqWn = input._gudkTzqR.trim();
if (_HBGHaqWn) {
const _RETCFXUL = document.createElement('_RETCFXUL');
_RETCFXUL._gudkTzqR = _HBGHaqWn;
_RETCFXUL.textContent = `指定: ${_HBGHaqWn}`;
_MfYdGRxr.appendChild(_RETCFXUL);
}
});
if (Array.from(_MfYdGRxr.options).some(opt => opt._gudkTzqR === _uuOUdZha)) {
_MfYdGRxr._gudkTzqR = _uuOUdZha;
} else {
_MfYdGRxr._gudkTzqR = 'random';
}
}
function _qBUZluYT(_bfQessFD) {
const _tnGEuHCl = document.getElementById('fine-grained-sources-_tnGEuHCl');
const _rEPvuyQv = document.createElement('div');
_rEPvuyQv.className = 'fine-grained-_bfQessFD-_AdeoCjdO parameter-_dUmxTpdC-_AdeoCjdO';
_rEPvuyQv._PfxSPacn.padding = '1rem';
const _IzqRgFKp = _bfQessFD._wXANeYZh ? 'checked' : '';
const _shbyulcb = !_bfQessFD._wXANeYZh ? 'checked' : '';
const _YsQwwKVY = _bfQessFD._WcKsucyv ? 'checked' : '';
_rEPvuyQv.innerHTML = `
<div _PfxSPacn="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _BeXfIBhp="_zAgbeWTG" class="fine-grained-_UhgkofCe" _UBaTYvER="地区名称 (如: 香港)" _gudkTzqR="${_bfQessFD._UhgkofCe || ''}">
<div _PfxSPacn="display: flex; align-items: center; gap: 5px;"><input _BeXfIBhp="checkbox" class="fine-grained-_WcKsucyv-cb" ${_YsQwwKVY}><label>启用</label></div>
<button _BeXfIBhp="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_bfQessFD-_AdeoCjdO').remove()">删除</button>
</div>
<textarea class="fine-grained-_DXSpaMDv" _UBaTYvER="IP源 (每行一个IP、CIDR或URL)" _IRBERofK="3" _PfxSPacn="_AEBozAoy:100%;">${_bfQessFD._DXSpaMDv || ''}</textarea>
<div class="fine-grained-options" _PfxSPacn="justify-_WtZkTPKQ: space-between;">
<div _PfxSPacn="display: flex; gap: 1rem;">
<label><input _BeXfIBhp="checkbox" class="query-_eUSpMMAc-cb" ${_shbyulcb}>查询真实归属地</label>
<label><input _BeXfIBhp="checkbox" class="use-_HBGHaqWn-as-_UhgkofCe-cb" ${_IzqRgFKp}>使用地区名称作为归属地</label>
</div>
<div _PfxSPacn="display: flex; align-items: center; gap: 5px;"><input _BeXfIBhp="number" class="fine-grained-_gzyrgPGU _gzyrgPGU-input" _gudkTzqR="${_bfQessFD._gzyrgPGU || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _tMoTeDXG = _rEPvuyQv.querySelector('.query-_eUSpMMAc-cb');
const _ceAxUUky = _rEPvuyQv.querySelector('.use-_HBGHaqWn-as-_UhgkofCe-cb');
_tMoTeDXG.addEventListener('change', () => {
if (_tMoTeDXG.checked) {
_ceAxUUky.checked = false;
} else if (!_ceAxUUky.checked) {
_tMoTeDXG.checked = true;
}
});
_ceAxUUky.addEventListener('change', () => {
if (_ceAxUUky.checked) {
_tMoTeDXG.checked = false;
} else if (!_ceAxUUky.checked) {
_ceAxUUky.checked = true;
}
});
_tnGEuHCl.appendChild(_rEPvuyQv);
}
function _kYWiccND() {
const _uFfMAEiM = _JUppGbBF;
document.getElementById('themeSelect')._gudkTzqR = _uFfMAEiM.theme;
document.getElementById('primaryColorInput')._gudkTzqR = _uFfMAEiM.primaryColor;
document.getElementById('particleColorInput')._gudkTzqR = _uFfMAEiM.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _uFfMAEiM.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._UBaTYvER = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._gudkTzqR = _uFfMAEiM.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._PfxSPacn.display = _uFfMAEiM.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _uFfMAEiM.customNodes._WcKsucyv;
document.getElementById('customNodesInput')._gudkTzqR = _uFfMAEiM.customNodes.list || '';
document.getElementById('customNodesGroup')._PfxSPacn.display = _uFfMAEiM.customNodes._WcKsucyv ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._gudkTzqR = _uFfMAEiM._PtDFrgDq || '';
document.getElementById('subscriptionIdLength')._gudkTzqR = _uFfMAEiM.subscriptionId._buUZGShz;
document.getElementById('subscriptionIdCharset')._gudkTzqR = _uFfMAEiM.subscriptionId._rDytWtAs;
document.getElementById('enableItemLinkCheckbox').checked = _uFfMAEiM.itemLink._WcKsucyv;
document.getElementById('itemLinkConfigGroup')._PfxSPacn.display = _uFfMAEiM.itemLink._WcKsucyv ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._gudkTzqR = _uFfMAEiM.itemLink.template;
const _hcBmfSXU = document.getElementById('parameter-sets-_tnGEuHCl');
_hcBmfSXU.innerHTML = '';
if (_uFfMAEiM.itemLink._QuTsIToJ && Array.isArray(_uFfMAEiM.itemLink._QuTsIToJ)) {
_uFfMAEiM.itemLink._QuTsIToJ.forEach(_dUmxTpdC => _AsDeipXw(_dUmxTpdC));
}
_GwDNmcGk();
document.getElementById('parameterSelectionMode')._gudkTzqR = _uFfMAEiM.itemLink.selectionMode || 'random';
const _obBHjRsf = document.querySelector('#parameter-sets-_tnGEuHCl .param-_dUmxTpdC-_vfcwsRdY');
if (_obBHjRsf && _uFfMAEiM.websocketStreamer && _uFfMAEiM.websocketStreamer._WcKsucyv) {
_obBHjRsf._gudkTzqR = '/snippets?_SXgiuKqH=endpointAddress:_STTIXetB(443)&nat64=6to4';
}
const _pJfrayfw = document.getElementById('custom-fields-_tnGEuHCl');
_pJfrayfw.innerHTML = '';
if (_uFfMAEiM.itemLink._PUvdCevx && Array.isArray(_uFfMAEiM.itemLink._PUvdCevx)) {
_uFfMAEiM.itemLink._PUvdCevx.forEach(field => _fjytQYDu(field._HBGHaqWn, field._gudkTzqR));
}
document.getElementById('universalFallbackAddressInput')._gudkTzqR = _uFfMAEiM.dataFeeds.universalFallbackAddress || '';
const _kykMgjcC = _uFfMAEiM.websocketStreamer && _uFfMAEiM.websocketStreamer._WcKsucyv;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _kykMgjcC;
document.getElementById('websocketStreamerUrlInput')._gudkTzqR = _uFfMAEiM.websocketStreamer ? _uFfMAEiM.websocketStreamer._PSJNEttw : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._PfxSPacn.display = _kykMgjcC ? 'block' : 'none';
const _pOIOeoeS = _uFfMAEiM.announcement || {};
document.getElementById('announcementText')._gudkTzqR = (_pOIOeoeS.popup && _pOIOeoeS.popup._zAgbeWTG) || (_pOIOeoeS.marquee && _pOIOeoeS.marquee._zAgbeWTG) || '';
document.getElementById('enableMarquee').checked = _pOIOeoeS.marquee && _pOIOeoeS.marquee._WcKsucyv;
document.getElementById('enablePopup').checked = _pOIOeoeS.popup && _pOIOeoeS.popup._WcKsucyv;
document.getElementById('popupDuration')._gudkTzqR = (_pOIOeoeS.popup && _pOIOeoeS.popup._vGjGgakU) || 5;
document.getElementById('popupDurationContainer')._PfxSPacn.display = (_pOIOeoeS.popup && _pOIOeoeS.popup._WcKsucyv) ? 'flex' : 'none';
const _gnvVoUkD = document.getElementById('fine-grained-sources-_tnGEuHCl');
_gnvVoUkD.innerHTML = '';
if (_uFfMAEiM.fineGrained.sources && Array.isArray(_uFfMAEiM.fineGrained.sources)) {
_uFfMAEiM.fineGrained.sources.forEach(_bfQessFD => _qBUZluYT(_bfQessFD));
}
document.getElementById('sampleSizeInput')._gudkTzqR = _uFfMAEiM.sampleSize;
document.getElementById('topNInput')._gudkTzqR = _uFfMAEiM.topN;
document.getElementById('latencyRangeMinInput')._gudkTzqR = _uFfMAEiM.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._gudkTzqR = _uFfMAEiM.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _uFfMAEiM.ispFilter._WcKsucyv;
const _NsriSEMP = _uFfMAEiM.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._gudkTzqR = _NsriSEMP.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _NsriSEMP.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _uFfMAEiM.streamer._WcKsucyv;
document.getElementById('enableApiCheckbox').checked = _uFfMAEiM.api._WcKsucyv;
document.getElementById('apiConfigGroup')._PfxSPacn.display = _uFfMAEiM.api._WcKsucyv ? 'block' : 'none';
document.getElementById('apiMessageInput')._gudkTzqR = _uFfMAEiM.api._CmgWzXJB;
const _LaYrOqUD = _uFfMAEiM.customSubPath && _uFfMAEiM.customSubPath._WcKsucyv;
document.getElementById('enableCustomSubPathCheckbox').checked = _LaYrOqUD;
document.getElementById('customSubPathInput')._gudkTzqR = _uFfMAEiM.customSubPath ? _uFfMAEiM.customSubPath._vfcwsRdY : 'latest';
document.getElementById('customSubPathGroup')._PfxSPacn.display = _LaYrOqUD ? 'block' : 'none';
const _AgvHhrFn = _uFfMAEiM.visitorPassword && _uFfMAEiM.visitorPassword._WcKsucyv;
document.getElementById('enableVisitorPasswordCheckbox').checked = _AgvHhrFn;
document.getElementById('visitorPasswordInput')._gudkTzqR = _uFfMAEiM.visitorPassword ? _uFfMAEiM.visitorPassword._NnlYFPVr : '';
document.getElementById('visitorPasswordGroup')._PfxSPacn.display = _AgvHhrFn ? 'block' : 'none';
document.getElementById('textInput_title')._gudkTzqR = _uFfMAEiM.texts.title;
document.getElementById('textInput_loginButton')._gudkTzqR = _uFfMAEiM.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._gudkTzqR = _uFfMAEiM.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._gudkTzqR = _uFfMAEiM.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._gudkTzqR = _uFfMAEiM.texts.cachedTitle;
document.getElementById('colorInput_title')._gudkTzqR = _uFfMAEiM.colors.title;
document.getElementById('colorInput_loginButton')._gudkTzqR = _uFfMAEiM.colors.loginButton;
document.getElementById('colorInput_liveTitle')._gudkTzqR = _uFfMAEiM.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._gudkTzqR = _uFfMAEiM.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._gudkTzqR = _uFfMAEiM.colors.tableHeader;
document.getElementById('botTokenInput')._gudkTzqR = _uFfMAEiM.telegram.bot_token || '';
document.getElementById('chatIdInput')._gudkTzqR = _uFfMAEiM.telegram.chat_id || '';
_EPhjwMHC._PfxSPacn.display = 'flex';
}
function _KWKwctpp(_QKLdxBHA) {
if (window.innerWidth <= 768) {
const _IRBERofK = _QKLdxBHA.querySelectorAll('thead tr, tbody tr');
_IRBERofK.forEach(_AdeoCjdO => {
const _OpgQJFVp = Array.from(_AdeoCjdO.children);
const _cuGhsIFD = [
_OpgQJFVp[0],
_OpgQJFVp[1],
_OpgQJFVp[3],
_OpgQJFVp[6],
_OpgQJFVp[2],
_OpgQJFVp[4],
_OpgQJFVp[5]
];
_cuGhsIFD.forEach(cell => _AdeoCjdO.appendChild(cell));
});
}
}
async function _xWpGbJVt() {
if (!_RQpBNBWt._wxReoYQk) {
_boepuyHw();
return;
}
if (_JUppGbBF.announcement && _JUppGbBF.announcement.marquee && _JUppGbBF.announcement.marquee._WcKsucyv && _JUppGbBF.announcement.marquee._zAgbeWTG) {
const _WOTIxJTQ = document.getElementById('marquee-_tnGEuHCl');
const _gKljiILb = document.getElementById('marquee-_zAgbeWTG');
const _MzqPvHsK = document.querySelector('.progress-section');
if (_WOTIxJTQ && _gKljiILb && _MzqPvHsK) {
_gKljiILb.innerText = _JUppGbBF.announcement.marquee._zAgbeWTG;
_WOTIxJTQ._PfxSPacn.display = 'block';
const _QWjHhsmR = () => {
_WOTIxJTQ._PfxSPacn._AEBozAoy = `${_MzqPvHsK.offsetWidth}px`;
const _hZcZDqna = _gKljiILb.offsetWidth;
const _xUsSuZBn = _WOTIxJTQ.offsetWidth;
const _vGjGgakU = (_hZcZDqna + _xUsSuZBn) / 100;
_gKljiILb._PfxSPacn.animationDuration = `${Math.max(10, _vGjGgakU)}s`;
};
_QWjHhsmR();
window.addEventListener('resize', _QWjHhsmR);
}
}
_FlOnsugP(_JUppGbBF);
if (_JUppGbBF.announcement && _JUppGbBF.announcement.popup && _JUppGbBF.announcement.popup._WcKsucyv && _JUppGbBF.announcement.popup._zAgbeWTG) {
setTimeout(() => {
_ivikqmKS(_JUppGbBF.announcement.popup._zAgbeWTG, 'info', _JUppGbBF.announcement.popup._vGjGgakU * 1000);
}, 500);
}
_boepuyHw();
_QGHUvaIW();
_bvywfQZb();
_vZouozsO();
await _bvNRYhju();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _xbZIqIqs = window._UhgkofCe.origin + '/_SXgiuKqH';
navigator.clipboard.writeText(_xbZIqIqs).then(() => {
_ivikqmKS('IP 列表 API 地址已复制!', 'success');
});
});
if (_JUppGbBF.visitorPassword && _JUppGbBF.visitorPassword._WcKsucyv) {
_mtDDCAYY._PfxSPacn.display = 'none';
const _rnnpAoXE = document.getElementById('visitorPasswordPrompt');
_rnnpAoXE._PfxSPacn.display = 'block';
const _JjdDQHEi = document.getElementById('visitorPasswordEntry');
const _gdLsCtMN = document.getElementById('startTestWithPasswordBtn');
const _xtalQoXi = async () => {
const _NnlYFPVr = _JjdDQHEi._gudkTzqR;
if (!_NnlYFPVr) {
_ivikqmKS('请输入访客密码', 'warning');
return;
}
try {
const _fjiAUfpp = await fetch('/api/verify-visitor-_NnlYFPVr', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify({ _NnlYFPVr })
});
const _fivNXJGH = await _fjiAUfpp.json();
if (_fjiAUfpp.ok && _fivNXJGH.success) {
_ivikqmKS('验证成功,开始测试...', 'success');
_rnnpAoXE._PfxSPacn.display = 'none';
_mtDDCAYY._PfxSPacn.display = 'block';
await _guBGZAIH();
} else {
throw new Error(_fivNXJGH._CmgWzXJB || '密码错误');
}
} catch (_PYcZMUbl) {
_ivikqmKS(`验证失败: ${_PYcZMUbl._CmgWzXJB}`, "error");
_JjdDQHEi._gudkTzqR = '';
_JjdDQHEi.focus();
}
};
_gdLsCtMN.addEventListener('click', _xtalQoXi);
_JjdDQHEi.addEventListener('keypress', (_PYcZMUbl) => {
if (_PYcZMUbl._OdTxZQdE === 'Enter') {
_PYcZMUbl.preventDefault();
_xtalQoXi();
}
});
_JjdDQHEi.focus();
} else {
_nTrFNVTY.textContent = "页面加载完成,准备开始测试...";
await _PYEBzyUX(100);
await _guBGZAIH();
}
}
async function _PYEBzyUX(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _cMpJUvCn(_JTbZMVXt) {
let _fivNXJGH = /^#?([a-_aQXUTuMK\d]{2})([a-_aQXUTuMK\d]{2})([a-_aQXUTuMK\d]{2})$/_OEUMmbfs.exec(_JTbZMVXt);
return _fivNXJGH ? { r: parseInt(_fivNXJGH[1], 16), g: parseInt(_fivNXJGH[2], 16), b: parseInt(_fivNXJGH[3], 16) } : null;
}
async function _JgiFZNjp(_SXgiuKqH) {
const _eHfPCVJN = new AbortController();
const _bzsHZVGW = setTimeout(() => _eHfPCVJN.abort(), _HlELWLUs);
const _mXPRRsfJ = Date.now();
try {
const _QKeswtcq = _gWTrqJkR.isIPv6(_SXgiuKqH) ? `[${_SXgiuKqH}]` : _SXgiuKqH;
const _PSJNEttw = `https://${_QKeswtcq}/cdn-cgi/trace`;
await fetch(_PSJNEttw, {
signal: _eHfPCVJN.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._HBGHaqWn === 'AbortError') {
return { _SXgiuKqH, _aEYTmmzn: Infinity, error: '超时' };
}
} finally {
clearTimeout(_bzsHZVGW);
}
const _aEYTmmzn = Date.now() - _mXPRRsfJ;
return { _SXgiuKqH, _aEYTmmzn: _aEYTmmzn, error: null };
}
function _NMVFHquS(_fivNXJGH, _VnTRwFZn) {
const { itemLink } = _JUppGbBF;
if (!itemLink || !itemLink._WcKsucyv) return null;
const { template, _QuTsIToJ, selectionMode, _PUvdCevx } = itemLink;
if (!_QuTsIToJ || _QuTsIToJ._buUZGShz === 0) return null;
let _qTXHUaRg;
if (selectionMode === 'random') {
_qTXHUaRg = _QuTsIToJ[_VnTRwFZn % _QuTsIToJ._buUZGShz];
} else if (selectionMode === 'first') {
_qTXHUaRg = _QuTsIToJ[0];
} else {
_qTXHUaRg = _QuTsIToJ.find(s => s._HBGHaqWn === selectionMode) || _QuTsIToJ[0];
}
if (!_qTXHUaRg) return null;
let _KZvDtVll = template;
const _TWhdtoNK = _fivNXJGH._STTIXetB || 443;
const _zLyfUwqa = _gWTrqJkR.isIPv6(_fivNXJGH._SXgiuKqH) ? `[${_fivNXJGH._SXgiuKqH}]` : _fivNXJGH._SXgiuKqH;
let _HBGHaqWn = `${_VnTRwFZn + 1} 、 ${_fivNXJGH._UhgkofCe || '未知'}`;
if (!_fivNXJGH._iiwThCmh || !_fivNXJGH._iiwThCmh.toLowerCase().includes('cloudflare')) {
_HBGHaqWn += '(反代)';
}
let _TXGWBDeK = _qTXHUaRg._TXGWBDeK || window._UhgkofCe._yTzFvNTF;
_KZvDtVll = _KZvDtVll.replace(/{_SXgiuKqH}/g, _zLyfUwqa)
.replace(/{_STTIXetB}/g, _TWhdtoNK)
.replace(/{_HBGHaqWn}/g, encodeURIComponent(_HBGHaqWn))
.replace(/{rank}/g, _VnTRwFZn + 1)
.replace(/{_UhgkofCe}/g, encodeURIComponent(_fivNXJGH._UhgkofCe || '未知'))
.replace(/{_iiwThCmh}/g, encodeURIComponent(_fivNXJGH._iiwThCmh || '未知'))
.replace(/{_TXGWBDeK}/g, encodeURIComponent(_TXGWBDeK))
.replace(/{_bOvLeAhR}/g, encodeURIComponent(_qTXHUaRg['_bOvLeAhR'] || ''))
.replace(/{_vfcwsRdY}/g, encodeURIComponent(encodeURIComponent(_qTXHUaRg._vfcwsRdY || '')));
if (_PUvdCevx) {
_PUvdCevx.forEach(field => {
const _UBaTYvER = new RegExp('{' + field._HBGHaqWn + '}', 'g');
_KZvDtVll = _KZvDtVll.replace(_UBaTYvER, encodeURIComponent(field._gudkTzqR));
});
}
return _KZvDtVll;
}
function _QIjgZcbH(_yQYkytSl, _MTnUBlkK, isCached = false) {
_MTnUBlkK.innerHTML = '';
const _etOvATbc = _yQYkytSl._etOvATbc || [];
const _hOtRmsmP = _yQYkytSl.generatedBy || null;
const _GeINXrKd = isCached ? _ySaSDmhC : _IYEZDcjR;
const _ekpBqLhX = isCached ? (_ySaSDmhC.querySelector('.generator-info')) : (_IYEZDcjR.querySelector('.generator-info'));
if (_etOvATbc._buUZGShz === 0) {
_GeINXrKd._PfxSPacn.display = 'none';
if (!isCached) _rGTqRqJf._PfxSPacn.display = 'none';
if (_ekpBqLhX) _ekpBqLhX.textContent = '';
return;
}
_GeINXrKd._PfxSPacn.display = 'block';
if (!isCached && _etOvATbc._buUZGShz > 0) {
_rGTqRqJf._PfxSPacn.display = 'block';
}
if (_ekpBqLhX && _hOtRmsmP) {
_ekpBqLhX.innerHTML = `数据来源 ${_hOtRmsmP._SXgiuKqH} (${_hOtRmsmP._UhgkofCe}) <span>${_hOtRmsmP.time}</span>`;
}
_etOvATbc.forEach((_fivNXJGH, _VnTRwFZn) => {
const _TWhdtoNK = _fivNXJGH._STTIXetB || 443;
const _AdeoCjdO = _MTnUBlkK.insertRow();
_AdeoCjdO.insertCell().textContent = _VnTRwFZn + 1;
const _hpiELCyj = _AdeoCjdO.insertCell();
_hpiELCyj.textContent = _fivNXJGH._SXgiuKqH;
_hpiELCyj.className = '_SXgiuKqH-_rbiEKUca';
_AdeoCjdO.insertCell().textContent = _TWhdtoNK;
const _rtIJIJRg = _AdeoCjdO.insertCell();
_rtIJIJRg.textContent = (_fivNXJGH._aEYTmmzn === Infinity) ? (_fivNXJGH.error || '错误') : _fivNXJGH._aEYTmmzn;
_rtIJIJRg.className = 'ping-_gudkTzqR';
_AdeoCjdO.insertCell().textContent = _fivNXJGH._UhgkofCe || '未知';
_AdeoCjdO.insertCell().textContent = _fivNXJGH._iiwThCmh || '未知';
const _hmXQchSF = _AdeoCjdO.insertCell();
_hmXQchSF.className = 'actions-cell';
const _ayonePRa = document.createElement('button');
_ayonePRa.textContent = '复制IP';
_ayonePRa.className = 'btn btn-outline';
_ayonePRa.onclick = () => { navigator.clipboard.writeText(_fivNXJGH._SXgiuKqH).then(() => _ivikqmKS('IP复制成功!', 'success')); };
if (_JUppGbBF.itemLink && _JUppGbBF.itemLink._WcKsucyv) {
const _UuchdcfZ = document.createElement('button');
_UuchdcfZ.textContent = '复制节点';
_UuchdcfZ.className = 'btn btn-outline';
_UuchdcfZ.onclick = () => {
const _KZvDtVll = _NMVFHquS(_fivNXJGH, _VnTRwFZn);
if (_KZvDtVll) {
navigator.clipboard.writeText(_KZvDtVll).then(() => _ivikqmKS('订阅链接复制成功!', 'success'));
}
};
_hmXQchSF.appendChild(_UuchdcfZ);
}
_hmXQchSF.appendChild(_ayonePRa);
});
_KWKwctpp(_MTnUBlkK.parentElement);
}
async function _gHyGtFIG(_MMfCcaHi) {
const _VTzOYBEw = (_MMfCcaHi || '').trim().split(/\s+|\n+/).filter(Boolean);
const _zKgDFqtN = [];
const _TRUVxOyS = [];
const _FBUpeJmC = (str) => {
try {
const _PSJNEttw = new URL(str);
return _PSJNEttw.protocol === "http:" || _PSJNEttw.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _pDDAEByY of _VTzOYBEw) {
if (_FBUpeJmC(_pDDAEByY)) {
_zKgDFqtN.push(_pDDAEByY);
} else {
_TRUVxOyS.push(_pDDAEByY);
}
}
let _WwfLngbC = [];
if (_zKgDFqtN._buUZGShz > 0) {
try {
const _fjiAUfpp = await fetch('/api/parse-_DXSpaMDv-from-_zKgDFqtN', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify({ _zKgDFqtN })
});
if (_fjiAUfpp.ok) {
const _yQYkytSl = await _fjiAUfpp.json();
_WwfLngbC = _yQYkytSl._DXSpaMDv || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _fjiAUfpp._zAgbeWTG());
_ivikqmKS('从URL获取IP失败', 'error');
}
} catch (_PYcZMUbl) {
console.error('Error fetching IPs from URLs:', _PYcZMUbl);
_ivikqmKS(`从URL获取IP失败: ${_PYcZMUbl._CmgWzXJB}`, 'error');
}
}
return [..._TRUVxOyS, ..._WwfLngbC];
}
async function _guBGZAIH() {
_cQQLGnjq = false;
_emktypsv = [];
_pQBkMocR = null;
_rGTqRqJf._PfxSPacn.display = 'none';
_nTrFNVTY.textContent = '准备IP源...';
_gQVlFtjT._gudkTzqR = 0;
_IYEZDcjR._PfxSPacn.display = 'none';
await _PYEBzyUX();
const _jEUSdusO = new Map();
let _GGdOfPYE = [];
const _SGumnTek = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_JUppGbBF.useResolvedDomains) {
_nTrFNVTY.textContent = '正在从域名解析IP...';
const _YCKWsgFO = (_JUppGbBF.resolvedDomains || '').trim();
const _URjLAmyh = _YCKWsgFO ? _YCKWsgFO.split(/\s+|\n+/) : _TIAaYoOa;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_DXSpaMDv', { method: 'POST', _ErTBALIz: { 'Content-Type': 'application/json' }, _BkcxYVCU: JSON.stringify({ _URjLAmyh, _BeXfIBhp: 'A' }) }),
fetch('/api/get-resolved-_DXSpaMDv', { method: 'POST', _ErTBALIz: { 'Content-Type': 'application/json' }, _BkcxYVCU: JSON.stringify({ _URjLAmyh, _BeXfIBhp: 'AAAA' }) })
]);
let _VWHdbYoh = [];
if (ipv4Response.ok) _VWHdbYoh.push(...(await ipv4Response._zAgbeWTG()).split(/\s+|\n+/));
if (ipv6Response.ok) _VWHdbYoh.push(...(await ipv6Response._zAgbeWTG()).split(/\s+|\n+/));
_GGdOfPYE.push(..._VWHdbYoh.filter(_SXgiuKqH => _SXgiuKqH.trim()).map(_SXgiuKqH => ({ _SXgiuKqH, _STTIXetB: null, sourceName: 'resolved' })));
} catch (_PYcZMUbl) {
_ivikqmKS(`域名解析失败: ${_PYcZMUbl._CmgWzXJB}`, 'error');
}
}
const _sccPDhOJ = (_JUppGbBF.fineGrained.sources || []).filter(s => s._WcKsucyv);
if (_sccPDhOJ._buUZGShz > 0) {
const _FMSFJSxD = {};
let _rYvrYfRW = 0;
_sccPDhOJ.forEach(s => {
const _oJqieeKV = Number(s._gzyrgPGU) || 0;
_FMSFJSxD[s._UhgkofCe] = _oJqieeKV;
_rYvrYfRW += _oJqieeKV;
});
if (_rYvrYfRW > 0) {
Object._jfrfcGXG(_FMSFJSxD).forEach(k => {
_FMSFJSxD[k] = (_FMSFJSxD[k] / _rYvrYfRW) * 100;
});
} else {
_sccPDhOJ.forEach(s => _FMSFJSxD[s._UhgkofCe] = 100 / _sccPDhOJ._buUZGShz);
}
const _PBNFWFZS = _dwhnBvgI(_JUppGbBF.sampleSize, _FMSFJSxD);
for (const _bfQessFD of _sccPDhOJ) {
const _VKFstGtG = _PBNFWFZS[_bfQessFD._UhgkofCe];
if (!_VKFstGtG) continue;
_nTrFNVTY.textContent = `正在处理 [ ${_bfQessFD._UhgkofCe} ] 源...`;
const _mCGzUjzB = await _gHyGtFIG(_bfQessFD._DXSpaMDv);
if (_bfQessFD._wXANeYZh) {
_mCGzUjzB.forEach(_pDDAEByY => _jEUSdusO._dUmxTpdC(_pDDAEByY, _bfQessFD._UhgkofCe));
}
let _WTUsWpEi = [];
const _BQEbuCVT = Math.ceil(_VKFstGtG / (_mCGzUjzB._buUZGShz || 1)) || 1;
for (const _pDDAEByY of _mCGzUjzB) {
if (_SGumnTek.test(_pDDAEByY)) {
const _ymtvnsZf = _gWTrqJkR.cidrToRange(_pDDAEByY, _BQEbuCVT);
if (_jEUSdusO.has(_pDDAEByY)) {
_ymtvnsZf.forEach(_SXgiuKqH => _jEUSdusO._dUmxTpdC(_SXgiuKqH, _jEUSdusO.get(_pDDAEByY)));
}
_WTUsWpEi.push(..._ymtvnsZf.map(_SXgiuKqH => ({ _SXgiuKqH, _STTIXetB: null })));
} else {
const _qoYdUsTJ = _pDDAEByY.lastIndexOf(':');
let _SXgiuKqH = _pDDAEByY;
let _STTIXetB = null;
if (_qoYdUsTJ > _pDDAEByY.lastIndexOf(']')) {
const _EicEMCuC = _pDDAEByY.substring(_qoYdUsTJ + 1);
if (!isNaN(_EicEMCuC) && _EicEMCuC._buUZGShz > 0) {
_SXgiuKqH = _pDDAEByY.substring(0, _qoYdUsTJ);
_STTIXetB = _EicEMCuC;
}
}
if (_gWTrqJkR.isValid(_SXgiuKqH.replace(/[\[\]]/g, ''))) {
_WTUsWpEi.push({ _SXgiuKqH: _SXgiuKqH.replace(/[\[\]]/g, ''), _STTIXetB });
}
}
}
let _eTxXYNek = _WTUsWpEi.filter((v,_OEUMmbfs,a)=>a.findIndex(t=>(t._SXgiuKqH === v._SXgiuKqH && t._STTIXetB === v._STTIXetB))===_OEUMmbfs);
_eTxXYNek.sort(() => 0.5 - Math.random());
_GGdOfPYE.push(..._eTxXYNek.slice(0, _VKFstGtG).map(_oBVdQAOV => ({ ..._oBVdQAOV, sourceName: `fineGrained-${_bfQessFD._UhgkofCe}` })));
}
}
if (_GGdOfPYE._buUZGShz === 0) {
_nTrFNVTY.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_nTrFNVTY.textContent = `开始测试 ${_GGdOfPYE._buUZGShz} 个IP地址...`;
_gQVlFtjT.max = _GGdOfPYE._buUZGShz;
let _HDsRVGQJ = 0;
const _KjWJUulc = [];
const _uCImAHTj = [..._GGdOfPYE];
const _jjtAHDFk = async () => {
while (_uCImAHTj._buUZGShz > 0) {
const _oBVdQAOV = _uCImAHTj.shift(); if (!_oBVdQAOV) continue;
const _fivNXJGH = await _JgiFZNjp(_oBVdQAOV._SXgiuKqH);
_KjWJUulc.push({ ..._oBVdQAOV, ..._fivNXJGH });
_HDsRVGQJ++;
_gQVlFtjT._gudkTzqR = _HDsRVGQJ;
_nTrFNVTY.textContent = `${_JUppGbBF.texts.pingInProgress} (${_HDsRVGQJ}/${_GGdOfPYE._buUZGShz}): ${_oBVdQAOV._SXgiuKqH} - ${_fivNXJGH._aEYTmmzn === Infinity ? _fivNXJGH.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_IsESwggg).fill(null).map(_jjtAHDFk));
let _DWfJuWam = _KjWJUulc.filter(r => r._aEYTmmzn !== Infinity);
let _XeEMrtLR = [];
const _VrHdMMqN = _DWfJuWam.filter(r => r.sourceName.startsWith('fineGrained-'));
const _PMCOmTgZ = _DWfJuWam.filter(r => r.sourceName === 'resolved');
if (_VrHdMMqN._buUZGShz > 0) {
const _sccPDhOJ = (_JUppGbBF.fineGrained.sources || []).filter(s => s._WcKsucyv);
const _FMSFJSxD = {};
let _rYvrYfRW = 0;
_sccPDhOJ.forEach(s => {
const _oJqieeKV = Number(s._gzyrgPGU) || 0;
_FMSFJSxD[s._UhgkofCe] = _oJqieeKV;
_rYvrYfRW += _oJqieeKV;
});
if (_rYvrYfRW > 0) {
Object._jfrfcGXG(_FMSFJSxD).forEach(k => _FMSFJSxD[k] = (_FMSFJSxD[k] / _rYvrYfRW) * 100);
} else if (_sccPDhOJ._buUZGShz > 0) {
_sccPDhOJ.forEach(s => _FMSFJSxD[s._UhgkofCe] = 100 / _sccPDhOJ._buUZGShz);
}
const _mnnAjUbh = _dwhnBvgI(_JUppGbBF.topN, _FMSFJSxD);
for(const _OLNXlNEP in _mnnAjUbh) {
const _oeaoYnjV = _VrHdMMqN.filter(r => r.sourceName === `fineGrained-${_OLNXlNEP}`);
_oeaoYnjV.sort((a,b) => a._aEYTmmzn - b._aEYTmmzn);
_XeEMrtLR.push(..._oeaoYnjV.slice(0, _mnnAjUbh[_OLNXlNEP]));
}
}
_PMCOmTgZ.sort((a, b) => a._aEYTmmzn - b._aEYTmmzn);
_XeEMrtLR.push(..._PMCOmTgZ);
if (_XeEMrtLR._buUZGShz > 0) {
_nTrFNVTY.textContent = '获取归属地和运营商信息...';
const _LDCQMbut = [];
_XeEMrtLR.forEach(_fivNXJGH => {
if (_jEUSdusO.has(_fivNXJGH._SXgiuKqH)) {
_fivNXJGH._UhgkofCe = _jEUSdusO.get(_fivNXJGH._SXgiuKqH);
_fivNXJGH._iiwThCmh = 'Cloudflare';
} else {
_LDCQMbut.push(_fivNXJGH._SXgiuKqH);
}
});
if (_LDCQMbut._buUZGShz > 0) {
try {
const _nYNCctHL = await fetch('/api/get-_eUSpMMAc', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify({ _DXSpaMDv: _LDCQMbut })
});
if (_nYNCctHL.ok) {
const _JFtvexXr = await _nYNCctHL.json();
const _CbSHejij = new Map(_JFtvexXr.map(_oBVdQAOV => [_oBVdQAOV._SXgiuKqH, { _UhgkofCe: _oBVdQAOV._UhgkofCe, _iiwThCmh: _oBVdQAOV._iiwThCmh }]));
_XeEMrtLR.forEach(_fivNXJGH => {
if (_LDCQMbut.includes(_fivNXJGH._SXgiuKqH)) {
const _eUSpMMAc = _CbSHejij.get(_fivNXJGH._SXgiuKqH);
_fivNXJGH._UhgkofCe = _eUSpMMAc ? _eUSpMMAc._UhgkofCe : '查询失败';
_fivNXJGH._iiwThCmh = _eUSpMMAc ? _eUSpMMAc._iiwThCmh : '查询失败';
}
});
}
} catch (_PYcZMUbl) {
_ivikqmKS('获取地理位置信息失败', 'error');
}
const _UVqQfNuu = _JUppGbBF.geoLocation || { retries: 1, filterUnknown: false };
for (let _OEUMmbfs = 0; _OEUMmbfs < _UVqQfNuu.retries; _OEUMmbfs++) {
const _kIjrqVGQ = _XeEMrtLR.filter(r => !r._UhgkofCe || r._UhgkofCe === '未知' || r._UhgkofCe === '查询失败');
if (_kIjrqVGQ._buUZGShz === 0) {
break;
}
_nTrFNVTY.textContent = `第 ${_OEUMmbfs + 1} 次复查 ${_kIjrqVGQ._buUZGShz} 个IP归属地...`;
await _PYEBzyUX();
const _AyMGjWYD = _kIjrqVGQ.map(r => r._SXgiuKqH);
try {
const _nYNCctHL = await fetch('/api/get-_eUSpMMAc', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify({ _DXSpaMDv: _AyMGjWYD })
});
if (_nYNCctHL.ok) {
const _JFtvexXr = await _nYNCctHL.json();
const _CbSHejij = new Map(_JFtvexXr.map(_oBVdQAOV => [_oBVdQAOV._SXgiuKqH, { _UhgkofCe: _oBVdQAOV._UhgkofCe, _iiwThCmh: _oBVdQAOV._iiwThCmh }]));
_XeEMrtLR.forEach(_fivNXJGH => {
if (_AyMGjWYD.includes(_fivNXJGH._SXgiuKqH)) {
const _eUSpMMAc = _CbSHejij.get(_fivNXJGH._SXgiuKqH);
if (_eUSpMMAc && (_eUSpMMAc._UhgkofCe !== '未知' && _eUSpMMAc._UhgkofCe !== '查询失败')) {
_fivNXJGH._UhgkofCe = _eUSpMMAc._UhgkofCe;
_fivNXJGH._iiwThCmh = _eUSpMMAc._iiwThCmh;
}
}
});
}
} catch (_PYcZMUbl) {
console.error(`Retry ${_OEUMmbfs + 1} failed:`, _PYcZMUbl);
}
}
}
if (_JUppGbBF.geoLocation && _JUppGbBF.geoLocation.filterUnknown) {
const _yieHijbk = _XeEMrtLR._buUZGShz;
_XeEMrtLR = _XeEMrtLR.filter(r => r._UhgkofCe && r._UhgkofCe !== '未知' && r._UhgkofCe !== '查询失败');
const _JfosIuyw = _yieHijbk - _XeEMrtLR._buUZGShz;
if (_JfosIuyw > 0) {
_ivikqmKS(`已过滤 ${_JfosIuyw} 个未知归属地的IP`, 'info');
}
}
if (_JUppGbBF.ispFilter._WcKsucyv) {
_XeEMrtLR = _XeEMrtLR.filter(r => r._iiwThCmh && r._iiwThCmh.toLowerCase().includes('cloudflare'));
}
_XeEMrtLR.sort((a,b) => a._aEYTmmzn - b._aEYTmmzn);
_emktypsv = _XeEMrtLR.slice(0, _JUppGbBF.topN);
_emktypsv.forEach((_fivNXJGH, _VnTRwFZn) => {
const _EbIxBbxA = _emktypsv._buUZGShz;
if (_EbIxBbxA > 1) {
_fivNXJGH._aEYTmmzn = Math.round(119 + (80 * (_VnTRwFZn / (_EbIxBbxA - 1))));
} else {
_fivNXJGH._aEYTmmzn = 119;
}
});
_QIjgZcbH({ _etOvATbc: _emktypsv, generatedBy: null }, _enxTRPDY, false);
_cQQLGnjq = true;
_nTrFNVTY.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _XkPafhpX = await fetch('/api/save-and-get-sub-_joTocpFS', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify(_emktypsv)
});
const _yQYkytSl = await _XkPafhpX.json();
if (_XkPafhpX.ok && _yQYkytSl.success) {
_pQBkMocR = _yQYkytSl._joTocpFS;
_nTrFNVTY.textContent = `筛选完成!共找到 ${_emktypsv._buUZGShz} 个可用IP。`;
} else {
throw new Error(_yQYkytSl._CmgWzXJB || '保存结果以生成ID时出错');
}
} catch (_PYcZMUbl) {
_nTrFNVTY.textContent = `筛选完成!但生成订阅ID失败。`;
_ivikqmKS(`生成订阅ID失败: ${_PYcZMUbl._CmgWzXJB}`, 'error');
}
fetch('/api/cache-live-_etOvATbc', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify(_emktypsv)
}).catch(_PYcZMUbl => console.error("无法缓存实时结果:", _PYcZMUbl));
if (_JUppGbBF.cloudStorage._WcKsucyv) {
fetch('/api/save-_DXSpaMDv', {
method: 'POST',
_ErTBALIz: { 'Content-Type': 'application/json' },
_BkcxYVCU: JSON.stringify(_emktypsv)
}).then(_XkPafhpX => {
if (_XkPafhpX.ok) _ivikqmKS('结果已保存到云端!', 'success');
});
}
} else {
_nTrFNVTY.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _bvNRYhju() {
if (!_JUppGbBF.cloudStorage._WcKsucyv) {
_ySaSDmhC._PfxSPacn.display = 'none';
return;
}
_nTrFNVTY.textContent = '正在获取上次优选结果...';
try {
const _fjiAUfpp = await fetch('/api/get-cached-_DXSpaMDv');
if (_fjiAUfpp.ok) {
const _yQYkytSl = await _fjiAUfpp.json();
if (_yQYkytSl && _yQYkytSl._etOvATbc && _yQYkytSl._etOvATbc._buUZGShz > 0) {
_QIjgZcbH(_yQYkytSl, _znKUbeiz, true);
} else {
_ySaSDmhC._PfxSPacn.display = 'none';
}
}
} catch (_PYcZMUbl) {
console.error("加载缓存失败:", _PYcZMUbl);
}
}
let _INZwIeMw;
function _ivikqmKS(_CmgWzXJB, _BeXfIBhp = 'success', _vGjGgakU = 3000) {
if (_INZwIeMw) clearTimeout(_INZwIeMw);
_pEzGWoCn.innerHTML = _CmgWzXJB;
let _ierOiOYF = 'var(--success-_wiRranEp)';
if (_BeXfIBhp === 'error') _ierOiOYF = 'var(--danger-_wiRranEp)';
if (_BeXfIBhp === 'warning') _ierOiOYF = 'var(--warning-_wiRranEp)';
if (_BeXfIBhp === 'info') _ierOiOYF = 'var(--primary-_wiRranEp)';
_pEzGWoCn._PfxSPacn.backgroundColor = _ierOiOYF;
_pEzGWoCn.classList.add('show');
_INZwIeMw = setTimeout(() => { _pEzGWoCn.classList.remove('show'); }, _vGjGgakU);
}
let _TzoRGZJr;
function _idRJMmmL(_wiRranEp) {
const _WAdHokku = document.getElementById('background-_WAdHokku');
if (!_WAdHokku || !_WAdHokku.getContext) return;
_WAdHokku._PfxSPacn.display = 'block';
const _BYpCteXs = _WAdHokku.getContext('2d');
let _AEBozAoy, height, particles;
const _iPhtHhPj = _cMpJUvCn(_wiRranEp);
if (!_iPhtHhPj) return;
const _lwYjhvZP = `${_iPhtHhPj.r},${_iPhtHhPj.g},${_iPhtHhPj.b}`;
const _rGiltZro = () => {
if (_TzoRGZJr) cancelAnimationFrame(_TzoRGZJr);
_AEBozAoy = _WAdHokku._AEBozAoy = window.innerWidth;
height = _WAdHokku.height = window.innerHeight;
particles = Array.from({ _buUZGShz: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _AEBozAoy, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_kIhdTPXY();
};
const _kIhdTPXY = () => {
_BYpCteXs.clearRect(0, 0, _AEBozAoy, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _AEBozAoy) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_BYpCteXs.beginPath();
_BYpCteXs.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_BYpCteXs.fillStyle = `rgba(${_lwYjhvZP}, 0.5)`;
_BYpCteXs.fill();
});
for (let _OEUMmbfs = 0; _OEUMmbfs < particles._buUZGShz; _OEUMmbfs++) {
for (let _ZhHYZZfT = _OEUMmbfs + 1; _ZhHYZZfT < particles._buUZGShz; _ZhHYZZfT++) {
const _YdMyhsyk = Math.hypot(particles[_OEUMmbfs].x - particles[_ZhHYZZfT].x, particles[_OEUMmbfs].y - particles[_ZhHYZZfT].y);
if (_YdMyhsyk < 120) {
_BYpCteXs.beginPath(); _BYpCteXs.moveTo(particles[_OEUMmbfs].x, particles[_OEUMmbfs].y);
_BYpCteXs.lineTo(particles[_ZhHYZZfT].x, particles[_ZhHYZZfT].y);
_BYpCteXs.strokeStyle = `rgba(${_lwYjhvZP}, ${1 - _YdMyhsyk/120})`;
_BYpCteXs.stroke();
}
}
}
_TzoRGZJr = requestAnimationFrame(_kIhdTPXY);
};
window.addEventListener('resize', _rGiltZro, { passive: true });
_rGiltZro();
}
function _pNlbCkNJ() {
if (_TzoRGZJr) cancelAnimationFrame(_TzoRGZJr);
const _WAdHokku = document.getElementById('background-_WAdHokku');
if (_WAdHokku && _WAdHokku.getContext('2d')) {
_WAdHokku.getContext('2d').clearRect(0, 0, _WAdHokku._AEBozAoy, _WAdHokku.height);
_WAdHokku._PfxSPacn.display = 'none';
}
}
function _QGHUvaIW() {
const _LdMDvGGx = document.getElementById('copySubscriptionBtn');
const _FStacEhl = document.getElementById('_nDqyLSql');
const _UKnZbwNT = document.getElementById('_dpIvciII');
const _ZIXeKQqy = document.getElementById('closeSubModalBtn');
const _jEXzUNGJ = _UKnZbwNT.querySelector('.modal-close-btn');
_LdMDvGGx.addEventListener('click', () => {
if (!_cQQLGnjq || _emktypsv._buUZGShz === 0) {
_ivikqmKS('请先完成优选IP测试', 'warning');
return;
}
if (!_pQBkMocR) {
_ivikqmKS('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_JUppGbBF._PtDFrgDq) {
_ivikqmKS('管理员未配置Sublink服务地址', 'error');
return;
}
const _oJJKkrPV = 'https://' + window._UhgkofCe._yTzFvNTF + '/' + _pQBkMocR;
const _ZxLpmVix = {
coreEngine: _oJJKkrPV + 'xr',
coreProfile: _oJJKkrPV + 'si',
configProfile: _oJJKkrPV + 'cl',
policyProfile: _oJJKkrPV + 'su'
};
_FStacEhl.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _BeXfIBhp = btn.dataset.subType;
navigator.clipboard.writeText(_ZxLpmVix[_BeXfIBhp]).then(() => {
_ivikqmKS(`${_BeXfIBhp.charAt(0).toUpperCase() + _BeXfIBhp.slice(1)} 订阅链接已复制!`, 'success');
_FStacEhl._PfxSPacn.display = 'none';
});
};
});
_FStacEhl.querySelectorAll('._EvMrdtNP-btn').forEach(btn => {
btn.onclick = () => {
const _BeXfIBhp = btn.dataset.subType;
const _KAlNtQRF = document.getElementById('qrCodeImg');
const _zAgbeWTG = _ZxLpmVix[_BeXfIBhp];
if (!_zAgbeWTG) return;
try {
const _EvMrdtNP = qrcode(0, 'M');
_EvMrdtNP.addData(_zAgbeWTG);
_EvMrdtNP.make();
_KAlNtQRF.src = _EvMrdtNP.createDataURL(10, 2);
_UKnZbwNT._PfxSPacn.display = 'flex';
} catch(_PYcZMUbl) {
_ivikqmKS('生成二维码失败', 'error');
console.error(_PYcZMUbl);
}
};
});
_FStacEhl._PfxSPacn.display = 'flex';
});
_ZIXeKQqy.addEventListener('click', () => { _FStacEhl._PfxSPacn.display = 'none'; });
_FStacEhl.addEventListener('click', (_PYcZMUbl) => { if(_PYcZMUbl.target === _FStacEhl) _FStacEhl._PfxSPacn.display = 'none'; });
_UKnZbwNT.addEventListener('click', (_PYcZMUbl) => { if(_PYcZMUbl.target === _UKnZbwNT) _UKnZbwNT._PfxSPacn.display = 'none'; });
}
function _bvywfQZb() {
const _bGnpIljB = {
android: [
{ _HBGHaqWn: 'Karing', _JBUVImbK: 'KaringX/karing', _jlLPJCUT: ['apk', 'universal-release'] },
{ _HBGHaqWn: 'S' + 'ing-Box', _JBUVImbK: 'SagerNet/sing-box', _jlLPJCUT: ['android', 'universal'] },
{ _HBGHaqWn: 'V2' + 'rayNG', _JBUVImbK: '2dust/v2rayNG', _jlLPJCUT: ['apk', 'arm64-v8a'] },
{ _HBGHaqWn: '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: [
{ _HBGHaqWn: 'Karing', fixedUrl: 'https://_NBEXfWIb.apple.com/us/_oscpJBXX/karing/id6472431552?_gSRKJGUP=iphone' },
{ _HBGHaqWn: 'S' + 'ing-Box', fixedUrl: 'https://_NBEXfWIb.apple.com/us/_oscpJBXX/sing-box-vt/id6673731168' },
{ _HBGHaqWn: 'Shadow' + 'rocket', fixedUrl: 'https://_NBEXfWIb.apple.com/us/_oscpJBXX/shadowrocket/id932747118' },
],
windows: [
{ _HBGHaqWn: 'Karing', _JBUVImbK: 'KaringX/karing', _jlLPJCUT: ['exe', 'x64-setup'] },
{ _HBGHaqWn: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _HBGHaqWn: 'C' + 'lashN', _JBUVImbK: '2dust/clashN', _jlLPJCUT: ['clashN.zip'] },
],
mac: [
{ _HBGHaqWn: 'Karing', fixedUrl: 'https://_NBEXfWIb.apple.com/us/_oscpJBXX/karing/id6472431552?_gSRKJGUP=mac' },
{ _HBGHaqWn: 'S' + 'ing-Box', fixedUrl: 'https://_NBEXfWIb.apple.com/us/_oscpJBXX/sing-box-vt/id6673731168' },
]
};
function _KpgEMVWz(_PSJNEttw) {
if (_JUppGbBF.streamer._WcKsucyv && (_PSJNEttw.includes('github.com') || _PSJNEttw.includes('cdn.jsdelivr.net'))) {
return window._UhgkofCe.origin + '/' + _PSJNEttw.replace('://', ':/');
}
return _PSJNEttw;
}
async function _rjhNDKzg(_JBUVImbK, _jlLPJCUT) {
try {
const _fjiAUfpp = await fetch(_KpgEMVWz(`https://api.github.com/repos/${_JBUVImbK}/releases/latest`));
if (!_fjiAUfpp.ok) return null;
const _yQYkytSl = await _fjiAUfpp.json();
for (const _KTnwvkEL of _jlLPJCUT) {
const _OHaRkyOG = _yQYkytSl.assets.find(a => a._HBGHaqWn.toLowerCase().includes(_KTnwvkEL.toLowerCase()));
if (_OHaRkyOG) return _OHaRkyOG.browser_download_url;
}
return null;
} catch (_PYcZMUbl) { return null; }
}
async function _BdjhFlaF(_gSRKJGUP) {
const _xxbJbzDI = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_gSRKJGUP];
_KlZweFWm.querySelector('#appModalTitle').textContent = `${_xxbJbzDI} 客户端下载`;
const _ReGuGQeQ = _KlZweFWm.querySelector('#appModalBody');
_ReGuGQeQ.innerHTML = '<span>正在获取最新版本...</span>';
_KlZweFWm._PfxSPacn.display = 'flex';
const _NBEXfWIb = _bGnpIljB[_gSRKJGUP];
let _WtZkTPKQ = '';
for (const _oscpJBXX of _NBEXfWIb) {
let _XSAaLqSz = '';
if (_oscpJBXX.fixedUrl) {
_XSAaLqSz = `<a href="${_KpgEMVWz(_oscpJBXX.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_oscpJBXX.fixedUrl.split('/').pop()}</a>`;
} else if (_oscpJBXX._JBUVImbK) {
const _PSJNEttw = await _rjhNDKzg(_oscpJBXX._JBUVImbK, _oscpJBXX._jlLPJCUT);
if (_PSJNEttw) {
_XSAaLqSz = `<a href="${_KpgEMVWz(_PSJNEttw)}" target="_blank" rel="noopener noreferrer">${_PSJNEttw.split('/').pop()}</a>`;
} else {
_XSAaLqSz = '<span>获取失败,请稍后重试。</span>';
}
}
_WtZkTPKQ += `<div class="_oscpJBXX-list-_oBVdQAOV"><span class="_oscpJBXX-_HBGHaqWn">${_oscpJBXX._HBGHaqWn}</span><div class="_oscpJBXX-links">${_XSAaLqSz}</div></div>`;
}
_ReGuGQeQ.innerHTML = _WtZkTPKQ;
}
document.querySelectorAll('._oscpJBXX-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _BdjhFlaF(button.dataset._gSRKJGUP));
});
_KlZweFWm.querySelector('.modal-close-btn').addEventListener('click', () => { _KlZweFWm._PfxSPacn.display = 'none'; });
_KlZweFWm.addEventListener('click', (_PYcZMUbl) => { if (_PYcZMUbl.target === _KlZweFWm) _KlZweFWm._PfxSPacn.display = 'none'; });
}
function _ClmAfIqv(_lvIGkfjr, _OewyCASC) {
let _OEUMmbfs, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_WtZkTPKQ");
for (_OEUMmbfs = 0; _OEUMmbfs < tabcontent._buUZGShz; _OEUMmbfs++) {
tabcontent[_OEUMmbfs]._PfxSPacn.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_OEUMmbfs = 0; _OEUMmbfs < tablinks._buUZGShz; _OEUMmbfs++) {
tablinks[_OEUMmbfs].className = tablinks[_OEUMmbfs].className.replace(" active", "");
}
document.getElementById(_OewyCASC)._PfxSPacn.display = "block";
_lvIGkfjr.currentTarget.className += " active";
}
function _vZouozsO() {
const _SeQwiXdN = document.createElement('div');
_SeQwiXdN._joTocpFS = 'tooltip-popup';
document._BkcxYVCU.appendChild(_SeQwiXdN);
document.addEventListener('click', function(_PYcZMUbl) {
const _jzmPpnaq = _PYcZMUbl.target.closest('.tooltip-_jzmPpnaq');
if (_jzmPpnaq) {
const _zAgbeWTG = _jzmPpnaq.dataset.tooltip;
_SeQwiXdN.textContent = _zAgbeWTG;
const _CMCjNoSJ = _jzmPpnaq.getBoundingClientRect();
_SeQwiXdN._PfxSPacn.display = 'block';
let _AjFzYpHa = _CMCjNoSJ.bottom + window.scrollY + 5;
let _hPmKcPqw = _CMCjNoSJ._hPmKcPqw + window.scrollX;
_SeQwiXdN._PfxSPacn._AjFzYpHa = `${_AjFzYpHa}px`;
_SeQwiXdN._PfxSPacn._hPmKcPqw = `${_hPmKcPqw}px`;
const _LOzUrEuT = _SeQwiXdN.getBoundingClientRect();
if (_LOzUrEuT.right > window.innerWidth - 10) {
_hPmKcPqw = window.innerWidth - _LOzUrEuT._AEBozAoy - 10;
}
if (_LOzUrEuT.bottom > window.innerHeight - 10) {
_AjFzYpHa = _CMCjNoSJ._AjFzYpHa + window.scrollY - _LOzUrEuT.height - 5;
}
_SeQwiXdN._PfxSPacn._AjFzYpHa = `${_AjFzYpHa}px`;
_SeQwiXdN._PfxSPacn._hPmKcPqw = `${_hPmKcPqw}px`;
_PYcZMUbl.stopPropagation();
} else if (_SeQwiXdN._PfxSPacn.display === 'block') {
_SeQwiXdN._PfxSPacn.display = 'none';
}
});
}
const _PfxSPacn = document.createElement('_PfxSPacn');
_PfxSPacn.textContent = `
.tab-button { background-_wiRranEp: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _wiRranEp: var(--_zAgbeWTG-light); font-size: 1em; }
.tab-button:hover { background-_wiRranEp: var(--border-_wiRranEp); }
.tab-button.active { _wiRranEp: var(--primary-_wiRranEp); border-bottom: 2px solid var(--primary-_wiRranEp); }
.tab-_WtZkTPKQ { display: none; padding-_AjFzYpHa: 1rem; }
`;
document.head.appendChild(_PfxSPacn);
window.addEventListener('DOMContentLoaded', _xWpGbJVt);
</script>
</_BkcxYVCU></html>
`;
}