import { connect } from "cloudflare:sockets";
const _WxJTFrVZ = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _YguKyhpw = ["UpstreamAddress.SG.CMLiussss.net"];
const _GQflSqPi = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _TaAHxqAN = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _yoIKOqFD = '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 _xVOQDmHZ = '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 _DBbjLKrC(_zEUwoOLx) {
if (Array.isArray(_zEUwoOLx)) {
try {
return String.fromCharCode.apply(null, _zEUwoOLx);
} catch (_TypLzJyb) {
return '';
}
}
return _zEUwoOLx;
}
function _joFWJDEw(_WMHQbbce) {
return /^[0-9a-_dCLZVYyJ]{8}-[0-9a-_dCLZVYyJ]{4}-[4][0-9a-_dCLZVYyJ]{3}-[89ab][0-9a-_dCLZVYyJ]{3}-[0-9a-_dCLZVYyJ]{12}$/_aYUntfEd.test(_WMHQbbce);
}
const _jCKPInJs = "optimized_ips_v4";
const _gJWEBxqT = "global_config_v4";
const _JWYbennF = "admin_password_v4";
const _qgrCVzzR = "live_results_temp_v1";
const _GhFQuyCk = "latest_sub_id_v1";
export default {
async fetch(_PbxHterf, _BqBpPDHi, _lzkCHIQe) {
try {
if (!_BqBpPDHi.DB) {
const _IhWsdHZl = _AFAfuUjH("D1 数据库 'DB' 未绑定。");
return new Response(_IhWsdHZl, { status: 503, _ZSCbaYzy: { 'Content-Type': '_oivNELJI/html;_xbSMAFzA=UTF-8' }});
}
_lzkCHIQe.waitUntil(
_BqBpPDHi.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_fcHRWHAI TEXT PRIMARY KEY, _zEUwoOLx TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_WMHQbbce TEXT PRIMARY KEY, _YtKORMAW TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_TypLzJyb => console.error("DB Init Error:", _TypLzJyb._MBvXPQjK))
);
const _vGtvnGlV = new URL(_PbxHterf._vGtvnGlV);
const _UmImaGSA = _vGtvnGlV.pathname;
const _OXZouNbs = _PbxHterf._ZSCbaYzy.get("Upgrade");
const _fQFNrZVl = await _sVgCbqDF(_BqBpPDHi);
if (_fQFNrZVl.websocketStreamer && _fQFNrZVl.websocketStreamer._eeCieDoE && _OXZouNbs && _OXZouNbs.toLowerCase() === "websocket") {
const _iroKOgTA = _fQFNrZVl.websocketStreamer._vGtvnGlV;
if (_iroKOgTA && _iroKOgTA.trim().startsWith('https://')) {
try {
const _CzKIrYtu = new Request(_iroKOgTA.trim() + _vGtvnGlV.pathname + _vGtvnGlV.search, _PbxHterf);
return await fetch(_CzKIrYtu);
} catch (_TypLzJyb) {
return new Response(`Upstream WebSocket gateway failed: ${_TypLzJyb._MBvXPQjK}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_OXZouNbs && _OXZouNbs.toLowerCase() === "websocket") {
return await _UJVSVqmu(_PbxHterf, _BqBpPDHi, _fQFNrZVl);
}
const _ClpNEQNS = _UmImaGSA._EdthzLba(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_ClpNEQNS) {
const [, _xsDlrBjr, typeSuffix] = _ClpNEQNS;
const _bRlKRqTQ = _fQFNrZVl._bRlKRqTQ;
if (!_bRlKRqTQ || _bRlKRqTQ.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' } });
}
const _yvNXwkNd = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _KnhXmajY = _yvNXwkNd[typeSuffix];
const _yOIKuEBb = _bRlKRqTQ.replace(/\/$/, '');
const _ZArwuNQt = `${_vGtvnGlV.origin}/${_xsDlrBjr}`;
const _KLVDrXTU = `${_yOIKuEBb}/${_KnhXmajY}?_fQFNrZVl=${encodeURIComponent(_ZArwuNQt)}`;
try {
const _RKOhbZes = await fetch(_KLVDrXTU, { _ZSCbaYzy: { 'User-Agent': _PbxHterf._ZSCbaYzy.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _ZBDXajJL = new Headers(_RKOhbZes._ZSCbaYzy);
_ZBDXajJL._qORUHIZA('Access-Control-Allow-Origin', '*');
return new Response(_RKOhbZes._jWmkrTWC, { status: _RKOhbZes.status, statusText: _RKOhbZes.statusText, _ZSCbaYzy: _ZBDXajJL });
} catch (_TypLzJyb) {
return new Response(`获取上游订阅失败: ${_TypLzJyb._MBvXPQjK}`, { status: 502, _ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' } });
}
}
if (_UmImaGSA.startsWith('/https:/') || _UmImaGSA.startsWith('/http:/')) {
return _pzPrjOdj(_PbxHterf, _fQFNrZVl);
}
if (_fQFNrZVl.customSubPath && _fQFNrZVl.customSubPath._eeCieDoE && _fQFNrZVl.customSubPath._UmImaGSA && _UmImaGSA === '/' + _fQFNrZVl.customSubPath._UmImaGSA.trim()) {
const _iUMcrmPH = _BqBpPDHi.DB.prepare("SELECT _zEUwoOLx FROM kv_data WHERE _fcHRWHAI = ?").bind(_GhFQuyCk);
const { _qfQmGQAV } = await _iUMcrmPH.all();
const _vMDupDPl = _qfQmGQAV._IIkxJcSQ > 0 ? _qfQmGQAV[0]._zEUwoOLx : null;
if (_vMDupDPl) {
return _GmpZNSrA({ _aNskTGPB: { _WMHQbbce: _vMDupDPl }, _vGtvnGlV: _PbxHterf._vGtvnGlV }, _BqBpPDHi);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' } });
}
}
const _uFvvBSwW = _UmImaGSA.split('/').filter(Boolean);
if (_uFvvBSwW._IIkxJcSQ === 1 && !_UmImaGSA.startsWith('/api/')) {
const _xsDlrBjr = _uFvvBSwW[0];
return _GmpZNSrA({ _aNskTGPB: { _WMHQbbce: _xsDlrBjr }, _vGtvnGlV: _PbxHterf._vGtvnGlV }, _BqBpPDHi);
}
if (_UmImaGSA.startsWith('/api/')) {
if (_UmImaGSA === '/api/_fQFNrZVl' && _PbxHterf.method === 'POST') return _GLqyOszZ(_PbxHterf, _BqBpPDHi, _lzkCHIQe);
if (_UmImaGSA === '/api/_qORUHIZA-_pmGHgKae') return _YdNdfNkT(_PbxHterf, _BqBpPDHi);
if (_UmImaGSA === '/api/change-_pmGHgKae') return _udDuHWCI(_PbxHterf, _BqBpPDHi);
if (_UmImaGSA === '/api/verify-_pmGHgKae') return _vsrCcPvk(_PbxHterf, _BqBpPDHi);
if (_UmImaGSA === '/api/verify-visitor-_pmGHgKae' && _PbxHterf.method === 'POST') return _tMsDFCnz(_PbxHterf, _BqBpPDHi);
if (_UmImaGSA === '/api/cache-live-_qfQmGQAV' && _PbxHterf.method === 'POST') return _YiwUyxnx(_PbxHterf, _BqBpPDHi, _lzkCHIQe);
if (_UmImaGSA === '/api/get-_LEfhUEpV' && _PbxHterf.method === 'POST') return _RhlRjVul(_PbxHterf, _BqBpPDHi);
if (_UmImaGSA === '/api/get-cached-_YaMcNmHt') return _nokqNjYn(_PbxHterf, _BqBpPDHi);
if (_UmImaGSA === '/api/save-_YaMcNmHt') return _InKnmzdX(_PbxHterf, _BqBpPDHi, _lzkCHIQe);
if (_UmImaGSA === '/api/save-and-get-sub-_WMHQbbce' && _PbxHterf.method === 'POST') return _pQfieGrv(_PbxHterf, _BqBpPDHi);
if (_UmImaGSA.startsWith('/api/get-_TQkUSzku/')) {
const _xsDlrBjr = _UmImaGSA.split('/').pop();
return _GmpZNSrA({ _aNskTGPB: { _WMHQbbce: _xsDlrBjr }, _vGtvnGlV: _PbxHterf._vGtvnGlV }, _BqBpPDHi);
}
if (_UmImaGSA === '/api/_fQFNrZVl' && _PbxHterf.method === 'GET') return _tbUesKsl(_BqBpPDHi);
if (_UmImaGSA === '/api/get-resolved-_YaMcNmHt') return _KzOdJLoc(_PbxHterf);
if (_UmImaGSA === '/api/parse-_YaMcNmHt-from-_LvSDpwzm' && _PbxHterf.method === 'POST') return _MwOFKZOS(_PbxHterf, _BqBpPDHi);
if (_UmImaGSA === '/api/endpoints') return _XKWhbyWP(_PbxHterf, _BqBpPDHi);
if (_UmImaGSA === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_UmImaGSA === '/_whSCQXik') return _gLrzHPjH(_PbxHterf, _BqBpPDHi);
if (_UmImaGSA === '/bing-wallpaper') return _PlwldESS();
return _tfNoBUDk(_PbxHterf, _BqBpPDHi, _lzkCHIQe);
} catch (err) {
let _TypLzJyb = err;
return new Response(_TypLzJyb.toString(), { status: 500 });
}
}
};
const _ZyfLkKMc = { 'Accept': '_oivNELJI/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 _UUaQzWaJ(_vGtvnGlV, _btEKcFFg) {
const _oSLywggo = await fetch(_vGtvnGlV, { _ZSCbaYzy: { ..._ZyfLkKMc, 'Referer': _btEKcFFg.referer } });
if (_oSLywggo.ok) return _oSLywggo._oivNELJI();
return null;
}
async function _weRYiOBz(_vGtvnGlV, _btEKcFFg) {
const _ewMInhNR = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_vGtvnGlV)}`;
const _oSLywggo = await fetch(_ewMInhNR, { _ZSCbaYzy: { ..._ZyfLkKMc, 'Referer': _btEKcFFg.referer } });
if (!_oSLywggo.ok) return null;
const _jWmkrTWC = await _oSLywggo._oivNELJI();
const _EdthzLba = _jWmkrTWC._EdthzLba(/<pre[^>]*>([\s\S]*?)<\/pre>/_aYUntfEd);
return _EdthzLba && _EdthzLba[1] ? _EdthzLba[1].replace(/&/g, '&') : null;
}
function _HIIDRhJC(_XdcCXKqC) {
let _lRRVBNjV;
try {
_lRRVBNjV = atob(_XdcCXKqC.replace(/\s/g, ''));
} catch (_TypLzJyb) {
_lRRVBNjV = _XdcCXKqC;
}
const _TQkUSzku = _lRRVBNjV.split(/[\s\n\r,]+/).filter(line => line.trim());
const _weaWiGun = new Set();
const _uIbkDgoO = /@([^?#]+?):(\d+)/;
for (const _tDtfDHxZ of _TQkUSzku) {
let _ZvPPjLqC = '';
let _ZObIIUps = '';
try {
if (_tDtfDHxZ.startsWith('vmess://')) {
const _QAAdcudO = atob(_tDtfDHxZ.substring(8));
const _fQFNrZVl = JSON.parse(_QAAdcudO);
_ZvPPjLqC = _fQFNrZVl.add;
_ZObIIUps = _fQFNrZVl._ZObIIUps;
} else {
const _EdthzLba = _tDtfDHxZ._EdthzLba(_uIbkDgoO);
if (_EdthzLba && _EdthzLba[1] && _EdthzLba[2]) {
_ZvPPjLqC = _EdthzLba[1].replace(/[\[\]]/g, '');
_ZObIIUps = _EdthzLba[2];
}
}
} catch (_TypLzJyb) {
console.warn(`Could not parse _tDtfDHxZ: ${_tDtfDHxZ}`);
}
if (_ZvPPjLqC && _ZObIIUps) {
_weaWiGun.add(`${_ZvPPjLqC}:${_ZObIIUps}`);
}
}
return Array.from(_weaWiGun);
}
async function _ROfTesjU(_oSmlxhCr) {
try {
const _oSLywggo = await fetch(_oSmlxhCr, { _ZSCbaYzy: _ZyfLkKMc });
if (!_oSLywggo.ok) {
console.error(`Failed to fetch subscription: ${_oSLywggo.status}`);
return [];
}
const _XdcCXKqC = await _oSLywggo._oivNELJI();
return _HIIDRhJC(_XdcCXKqC);
} catch (error) {
console.error(`Error processing subscription ${_oSmlxhCr}:`, error);
return [];
}
}
async function _BJObFTPI(_pmriNyic) {
const _bFvaKtlE = _pmriNyic.trim();
const _QVcErRKc = /^(vless|vmess|trojan|ss):\/\//.test(_bFvaKtlE);
const _ICAYnVQU = (() => {
if (_bFvaKtlE._IIkxJcSQ < 20 || _bFvaKtlE.startsWith('http')) return false;
const _HEvfaVCr = _bFvaKtlE.replace(/\s/g, '');
if (_HEvfaVCr._IIkxJcSQ % 4 !== 0 && !_HEvfaVCr.includes('=')) return false;
try {
atob(_HEvfaVCr);
return true;
} catch (_TypLzJyb) {
return false;
}
})();
if (_QVcErRKc || _ICAYnVQU) {
return _HIIDRhJC(_bFvaKtlE).join('\n');
}
const _swyDhAYK = [
'https://ipdb.api.030101.xyz/?_mCxoiXge=bestcf&_bfevbNWg=true',
'https://ipdb.api.030101.xyz/?_mCxoiXge=bestproxy&_bfevbNWg=true'
];
const _FWvMrKga = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_aYUntfEd.test(_pmriNyic) || _pmriNyic.includes('?_SOExyrkk=');
if (_FWvMrKga) {
const _YaMcNmHt = await _ROfTesjU(_pmriNyic);
return _YaMcNmHt.join('\n');
}
let _XdcCXKqC = '';
if (_swyDhAYK.includes(_pmriNyic)) {
_XdcCXKqC = await _UUaQzWaJ(_pmriNyic, { referer: _pmriNyic });
if (!_XdcCXKqC || _XdcCXKqC._IIkxJcSQ < 8) {
_XdcCXKqC = await _weRYiOBz(_pmriNyic, { referer: _pmriNyic });
}
} else {
try {
const _ocjOrHqd = await fetch(_pmriNyic, { _ZSCbaYzy: { 'User-Agent': 'Cloudflare-Worker' } });
if (_ocjOrHqd.ok) {
_XdcCXKqC = await _ocjOrHqd._oivNELJI();
} else {
console.warn(`Failed to fetch URL ${_pmriNyic}: ${_ocjOrHqd.status}`);
}
} catch (_TypLzJyb) {
console.error(`Error fetching URL ${_pmriNyic}:`, _TypLzJyb);
}
}
const _liHVUqDs = _HIIDRhJC(_XdcCXKqC);
if (_liHVUqDs._IIkxJcSQ > 0) {
return _liHVUqDs.join('\n');
}
return _XdcCXKqC || '';
}
async function _pzPrjOdj(_PbxHterf, _fQFNrZVl) {
if (!_fQFNrZVl.streamer._eeCieDoE) {
return new Response('远程流功能未开启', { status: 403 });
}
const _vGtvnGlV = new URL(_PbxHterf._vGtvnGlV);
const _PhDidCbH = _vGtvnGlV.pathname.substring(1).replace(':/', '://');
try {
const _KLVDrXTU = new URL(_PhDidCbH);
const _LVAsprNN = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_LVAsprNN.some(domain => _KLVDrXTU._ZvPPjLqC.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _TEszSoEg = new Headers(_PbxHterf._ZSCbaYzy);
_TEszSoEg._qORUHIZA('Host', _KLVDrXTU._ZvPPjLqC);
_TEszSoEg._qORUHIZA('User-Agent', 'CF-Worker-Streamer/1.0');
const _BCIyElbB = await fetch(_KLVDrXTU.toString(), {
method: _PbxHterf.method,
_ZSCbaYzy: _TEszSoEg,
_jWmkrTWC: _PbxHterf._jWmkrTWC,
});
const _ZBDXajJL = new Headers(_BCIyElbB._ZSCbaYzy);
_ZBDXajJL._qORUHIZA('Access-Control-Allow-Origin', '*');
_ZBDXajJL._qORUHIZA('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_ZBDXajJL._qORUHIZA('Access-Control-Allow-Headers', '*');
_ZBDXajJL._qORUHIZA('Cache-Control', 'public, max-age=86400');
_ZBDXajJL._qORUHIZA('X-Streamer-Source', 'CF-Worker');
_ZBDXajJL.delete('_XdcCXKqC-security-policy');
_ZBDXajJL.delete('x-_XdcCXKqC-security-policy');
_ZBDXajJL.delete('x-webkit-csp');
return new Response(_BCIyElbB._jWmkrTWC, {
status: _BCIyElbB.status,
statusText: _BCIyElbB.statusText,
_ZSCbaYzy: _ZBDXajJL,
});
} catch (_TypLzJyb) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _UJVSVqmu(_PbxHterf, _BqBpPDHi, _fQFNrZVl) {
try {
const _GCnhoQUJ = _fQFNrZVl || await _sVgCbqDF(_BqBpPDHi);
const _lTSBYzxO = (_GCnhoQUJ.itemLink._zEklqmsL && _GCnhoQUJ.itemLink._zEklqmsL[0]) || {};
const _UknQljuh = _lTSBYzxO['_SOExyrkk'] || _DBbjLKrC(_WxJTFrVZ);
if (!_joFWJDEw(_UknQljuh)) {
throw new Error("Configured user _wSYsaZjW is not valid.");
}
const _PuLjnCOc = _GCnhoQUJ.dataFeeds.universalFallbackAddress;
let _FJsqtbbA = {};
const _spJUNkrb = _DBbjLKrC(_YguKyhpw[0] || "");
if (_PuLjnCOc) {
const [_yUpbIijN, _ZObIIUps = '443'] = _PuLjnCOc.split(':');
_FJsqtbbA = { _yUpbIijN, _ZObIIUps };
} else {
const [_yUpbIijN, _ZObIIUps = '443'] = _spJUNkrb.split(':');
_FJsqtbbA = { _yUpbIijN, _ZObIIUps };
}
const _vGtvnGlV = new URL(_PbxHterf._vGtvnGlV);
const _UmImaGSA = _vGtvnGlV.pathname;
let _tdVdgFxi = '';
const _PBUXuhES = _vGtvnGlV.searchParams.get('remote');
if (_PBUXuhES) {
_tdVdgFxi = atob(_PBUXuhES);
} else if (_UmImaGSA.startsWith('/endpoint=')) {
_tdVdgFxi = _UmImaGSA.substring(10);
} else if (_UmImaGSA._IIkxJcSQ > 1 && _UmImaGSA.substring(1).includes('.')) {
_tdVdgFxi = _UmImaGSA.substring(1);
}
if (_tdVdgFxi) {
const [_yUpbIijN, _ZObIIUps = '443'] = _tdVdgFxi.split(':');
_FJsqtbbA = { _yUpbIijN, _ZObIIUps };
}
return await _tJfaEtfy(_PbxHterf, _UknQljuh, _FJsqtbbA);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _tJfaEtfy(_PbxHterf, _wSYsaZjW, _FJsqtbbA) {
const _CsRkMABM = new WebSocketPair();
const [clientEnd, _drESwqjL] = Object.values(_CsRkMABM);
_drESwqjL.accept();
let _moQCYWkU = { _RjgSrDYR: null };
const _zCdIVfuy = _PbxHterf._ZSCbaYzy.get("sec-websocket-protocol") || "";
const _FgJZtzXI = _hhFXxtbL(_drESwqjL, _zCdIVfuy);
_FgJZtzXI.pipeTo(new WritableStream({
async write(chunk) {
if (_moQCYWkU._RjgSrDYR) {
const _ndyzZooj = _moQCYWkU._RjgSrDYR.writable.getWriter();
await _ndyzZooj.write(chunk);
_ndyzZooj.releaseLock();
return;
}
const { error, details } = await _WqbSXTAe(chunk, _wSYsaZjW);
if (error) {
throw new Error(details);
}
const _MAgEgIOM = new Uint8Array([details._zCzRSosF[0], 0]);
const _VxdWxWwQ = chunk.slice(details.payloadIndex);
await _jjRGmCJo(_moQCYWkU, details._ovdKjDQy, details._ZgQUkjUo, _VxdWxWwQ, _drESwqjL, _MAgEgIOM, _FJsqtbbA);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_HFGBtRTM(_drESwqjL);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _jjRGmCJo(_moQCYWkU, _ovdKjDQy, _ZgQUkjUo, _QfrRMBQv, _RcILMrdn, _MAgEgIOM, _DXDexYCL) {
const _NFgAydhR = async (_yUpbIijN, _ZObIIUps) => {
let _JEIOgxxw = _yUpbIijN;
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(_yUpbIijN)) {
_JEIOgxxw = `${atob('d3d3Lg==')}${_yUpbIijN}${atob('LnNzbGlwLmlv')}`;
}
const _RjgSrDYR = connect({ _ZvPPjLqC: _JEIOgxxw, _ZObIIUps });
_moQCYWkU._RjgSrDYR = _RjgSrDYR;
const _ndyzZooj = _RjgSrDYR.writable.getWriter();
await _ndyzZooj.write(_QfrRMBQv);
_ndyzZooj.releaseLock();
return _RjgSrDYR;
};
const _OkXdQmLi = async () => {
if (!_DXDexYCL._yUpbIijN) return;
console.log(`Direct connection failed, falling back to gateway: ${_DXDexYCL._yUpbIijN}`);
const _LvbBjnKQ = await _NFgAydhR(_DXDexYCL._yUpbIijN, parseInt(_DXDexYCL._ZObIIUps, 10));
_LvbBjnKQ.closed.catch(() => {}).finally(() => _HFGBtRTM(_RcILMrdn));
_iomMLvsa(_LvbBjnKQ, _RcILMrdn, _MAgEgIOM, null);
};
try {
const _UHyjSrZo = await _NFgAydhR(_ovdKjDQy, _ZgQUkjUo);
_iomMLvsa(_UHyjSrZo, _RcILMrdn, _MAgEgIOM, _OkXdQmLi);
} catch (err) {
console.error("Primary connection failed:", err);
await _OkXdQmLi();
}
}
function _hhFXxtbL(_drESwqjL, _zCdIVfuy) {
let _LYrlHLJR = false;
return new ReadableStream({
start(_vVOYLagK) {
_drESwqjL.addEventListener("_MBvXPQjK", (event) => { if (_LYrlHLJR) return; _vVOYLagK.enqueue(event._YtKORMAW); });
_drESwqjL.addEventListener("close", () => { _HFGBtRTM(_drESwqjL); if (_LYrlHLJR) return; _vVOYLagK.close(); });
_drESwqjL.addEventListener("error", (err) => _vVOYLagK.error(err));
if (_zCdIVfuy) {
try {
const _sQJaaXwN = atob(_zCdIVfuy.replace(/-/g, "+").replace(/_/g, "/"));
_vVOYLagK.enqueue(Uint8Array.from(_sQJaaXwN, c => c.charCodeAt(0))._LQsQAwYJ);
} catch (_TypLzJyb) { console.error("Failed to decode early _YtKORMAW:", _TypLzJyb); }
}
},
cancel() { _LYrlHLJR = true; _HFGBtRTM(_drESwqjL); },
});
}
async function _WqbSXTAe(_LQsQAwYJ, _wSYsaZjW) {
if (_LQsQAwYJ.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _zCzRSosF = new Uint8Array(_LQsQAwYJ.slice(0, 1));
const _bBhIKgDS = _ypGxzctW(new Uint8Array(_LQsQAwYJ.slice(1, 17)));
if (_bBhIKgDS !== _wSYsaZjW) return { error: true, details: "Invalid _wSYsaZjW" };
const _skkCvgPP = new Uint8Array(_LQsQAwYJ.slice(17, 18))[0];
const _iImimwWz = new Uint8Array(_LQsQAwYJ.slice(18 + _skkCvgPP, 19 + _skkCvgPP))[0];
if (_iImimwWz !== 1) return { error: true, details: `Unsupported _iImimwWz: ${_iImimwWz}` };
const _ZEEKoXZM = 19 + _skkCvgPP;
const _ZgQUkjUo = new DataView(_LQsQAwYJ.slice(_ZEEKoXZM, _ZEEKoXZM + 2)).getUint16(0);
let _bGtyPpJa = _ZEEKoXZM + 2;
const _wnPpaKnA = new Uint8Array(_LQsQAwYJ.slice(_bGtyPpJa, _bGtyPpJa + 1))[0];
let _AMsrNFys = 0;
let _ugexIIge = _bGtyPpJa + 1;
let _ovdKjDQy = "";
switch (_wnPpaKnA) {
case 1: _AMsrNFys = 4; _ovdKjDQy = new Uint8Array(_LQsQAwYJ.slice(_ugexIIge, _ugexIIge + _AMsrNFys)).join("."); break;
case 2: _AMsrNFys = new Uint8Array(_LQsQAwYJ.slice(_ugexIIge, _ugexIIge + 1))[0]; _ugexIIge++; _ovdKjDQy = new TextDecoder().decode(_LQsQAwYJ.slice(_ugexIIge, _ugexIIge + _AMsrNFys)); break;
case 3: _AMsrNFys = 16; const _NOSHGtXx = new DataView(_LQsQAwYJ.slice(_ugexIIge, _ugexIIge + _AMsrNFys)); const _onorrDOQ = []; for (let _aYUntfEd = 0; _aYUntfEd < 8; _aYUntfEd++) _onorrDOQ.push(_NOSHGtXx.getUint16(_aYUntfEd * 2).toString(16)); _ovdKjDQy = _onorrDOQ.join(":"); break;
default: return { error: true, details: `Invalid _bCuVHijH _mCxoiXge: ${_wnPpaKnA}` };
}
if (!_ovdKjDQy) return { error: true, details: "Target _yUpbIijN is empty" };
return { error: false, details: { _ovdKjDQy, _ZgQUkjUo, _zCzRSosF, payloadIndex: _ugexIIge + _AMsrNFys } };
}
async function _iomMLvsa(_RjgSrDYR, _RcILMrdn, _YivsTWpg, _gzlniSXv) {
let _DpilDCju = _YivsTWpg;
let _tloimlFi = false;
let _bHkFkvMe = _RjgSrDYR._FgJZtzXI.pipeTo(new WritableStream({
write(chunk) {
_tloimlFi = true;
if (_RcILMrdn.readyState !== 1) throw new Error("Channel is not open");
if (_DpilDCju) {
const _dUCfpTjS = new Uint8Array(_DpilDCju.byteLength + chunk.byteLength);
_dUCfpTjS._qORUHIZA(new Uint8Array(_DpilDCju));
_dUCfpTjS._qORUHIZA(new Uint8Array(chunk), _DpilDCju.byteLength);
_RcILMrdn.send(_dUCfpTjS._LQsQAwYJ);
_DpilDCju = null;
} else {
_RcILMrdn.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _RcILMrdn error:", err._MBvXPQjK);
});
await _bHkFkvMe;
if (!_tloimlFi && _gzlniSXv) {
_gzlniSXv();
}
}
function _HFGBtRTM(_RcILMrdn) {
try { if (_RcILMrdn.readyState === 1 || _RcILMrdn.readyState === 2) _RcILMrdn.close(); } catch (_TypLzJyb) {}
}
const _yEAkOOZo = Array.from({ _IIkxJcSQ: 256 }, (_, _aYUntfEd) => (_aYUntfEd + 256).toString(16).slice(1));
function _ypGxzctW(_nTzjbDsf, offset = 0) {
return (
_yEAkOOZo[_nTzjbDsf[offset]] + _yEAkOOZo[_nTzjbDsf[offset + 1]] + _yEAkOOZo[_nTzjbDsf[offset + 2]] + _yEAkOOZo[_nTzjbDsf[offset + 3]] + "-" +
_yEAkOOZo[_nTzjbDsf[offset + 4]] + _yEAkOOZo[_nTzjbDsf[offset + 5]] + "-" +
_yEAkOOZo[_nTzjbDsf[offset + 6]] + _yEAkOOZo[_nTzjbDsf[offset + 7]] + "-" +
_yEAkOOZo[_nTzjbDsf[offset + 8]] + _yEAkOOZo[_nTzjbDsf[offset + 9]] + "-" +
_yEAkOOZo[_nTzjbDsf[offset + 10]] + _yEAkOOZo[_nTzjbDsf[offset + 11]] +
_yEAkOOZo[_nTzjbDsf[offset + 12]] + _yEAkOOZo[_nTzjbDsf[offset + 13]] +
_yEAkOOZo[_nTzjbDsf[offset + 14]] + _yEAkOOZo[_nTzjbDsf[offset + 15]]
).toLowerCase();
}
let _eVRIAVlh = { "N/A":"未知" };
async function _XyxahkHH(_vGtvnGlV, _BZANdbpt, _gzlniSXv) {
try {
const _oSLywggo = await fetch(_vGtvnGlV, {
_ZSCbaYzy: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_oSLywggo.ok) {
console.error(`获取 ${_vGtvnGlV} 失败: HTTP ${_oSLywggo.status}`);
return _gzlniSXv;
}
const _oivNELJI = await _oSLywggo._oivNELJI();
return _BZANdbpt(_oivNELJI);
} catch (error) {
console.error(`获取或解析 ${_vGtvnGlV} 时发生网络错误: ${error._MBvXPQjK}`);
return _gzlniSXv;
}
}
function _NZNmHcfl(_oivNELJI) {
if (!_oivNELJI) return [];
const _zvKVgVXB = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _RAKwIUcK = _oivNELJI.split(/[\s,;#|]+/);
const _HoKDcqTR = [];
for (const _maJmIRlv of _RAKwIUcK) {
const _KcqnLUOP = _maJmIRlv.trim();
if (!_KcqnLUOP) continue;
const _eaDCBSys = _KcqnLUOP.lastIndexOf(':');
let _QxeguXzP = _KcqnLUOP;
if(_eaDCBSys > _KcqnLUOP.lastIndexOf(']')) {
const _zJsSSaZV = _KcqnLUOP.substring(_eaDCBSys + 1);
if(!isNaN(_zJsSSaZV) && _zJsSSaZV._IIkxJcSQ > 0) {
_QxeguXzP = _KcqnLUOP.substring(0, _eaDCBSys);
}
}
if (_iGVIAASX.isValid(_QxeguXzP.replace(/[\[\]]/g, '')) || _zvKVgVXB.test(_KcqnLUOP)) {
_HoKDcqTR.push(_KcqnLUOP);
}
}
return _HoKDcqTR;
}
function _gltBabvI(_oivNELJI) {
if (!_oivNELJI) return [];
return _oivNELJI.split(/\s+/).filter(d => d.trim() !== '');
}
function _jIErJVpS(_oivNELJI) {
if (!_oivNELJI) return { "N/A": "未知" };
try {
return JSON.parse(`{${_oivNELJI}}`);
} catch (_TypLzJyb) {
console.error("解析 _eVRIAVlh 失败:", _TypLzJyb);
return { "N/A": "未知" };
}
}
const _iGVIAASX = {
isValid: (_whSCQXik) => _iGVIAASX.isIPv4(_whSCQXik) || _iGVIAASX.isIPv6(_whSCQXik),
isIPv4: (_whSCQXik) => {
if (typeof _whSCQXik !== 'string') return false;
const _onorrDOQ = _whSCQXik.split('.');
if (_onorrDOQ._IIkxJcSQ !== 4) return false;
return _onorrDOQ.every(_LgGTGIpa => {
const _BnZWpSHx = parseInt(_LgGTGIpa, 10);
return !isNaN(_BnZWpSHx) && _BnZWpSHx >= 0 && _BnZWpSHx <= 255 && String(_BnZWpSHx) === _LgGTGIpa;
});
},
isIPv6: (_whSCQXik) => {
if (typeof _whSCQXik !== '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]))$/_aYUntfEd.test(_whSCQXik);
},
toLong4: (_whSCQXik) => _whSCQXik.split('.').reduce((acc, octet, _aYUntfEd) => acc + (parseInt(octet) << (8*(3-_aYUntfEd))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_whSCQXik) => {
try {
const _CKAiCZju = _whSCQXik.split('/')[0];
const _onorrDOQ = _CKAiCZju.split('::');
if (_onorrDOQ._IIkxJcSQ > 2) return 0n;
let _lWzstIWp = [];
if (_onorrDOQ[0]) {
_lWzstIWp = _onorrDOQ[0].split(':');
}
let _eTFHmuyM = [];
if (_onorrDOQ._IIkxJcSQ > 1 && _onorrDOQ[1]) {
_eTFHmuyM = _onorrDOQ[1].split(':');
}
if (_lWzstIWp._IIkxJcSQ + _eTFHmuyM._IIkxJcSQ > 8) return 0n;
const _kOyYZZHH = 8 - (_lWzstIWp._IIkxJcSQ + _eTFHmuyM._IIkxJcSQ);
const _zYnGbvYu = [
..._lWzstIWp,
...Array(_kOyYZZHH).fill('0'),
..._eTFHmuyM
].map(_LgGTGIpa => _LgGTGIpa || '0');
while(_zYnGbvYu._IIkxJcSQ < 8) {
_zYnGbvYu.push('0');
}
let _RcxZbLht = 0n;
for (const _LgGTGIpa of _zYnGbvYu) {
if (_LgGTGIpa._IIkxJcSQ > 4) return 0n;
const _zEUwoOLx = BigInt('0x' + _LgGTGIpa);
_RcxZbLht = (_RcxZbLht << 16n) | _zEUwoOLx;
}
return _RcxZbLht;
} catch(_TypLzJyb) {
return 0n;
}
},
fromBigInt6: (_RcxZbLht) => {
if (typeof _RcxZbLht !== '_RcxZbLht' || _RcxZbLht < 0n) return null;
const _onorrDOQ = [];
for (let _aYUntfEd = 0; _aYUntfEd < 8; _aYUntfEd++) {
_onorrDOQ.unshift((_RcxZbLht & 0xFFFFn).toString(16));
_RcxZbLht >>= 16n;
}
let _mBSljxLj = { start: -1, _pLsyfBad: 0 };
let _iVhOldQc = { start: -1, _pLsyfBad: 0 };
for (let _aYUntfEd = 0; _aYUntfEd < 8; _aYUntfEd++) {
if (_onorrDOQ[_aYUntfEd] === '0') {
if (_iVhOldQc.start === -1) _iVhOldQc.start = _aYUntfEd;
_iVhOldQc._pLsyfBad++;
} else {
if (_iVhOldQc._pLsyfBad > _mBSljxLj._pLsyfBad) _mBSljxLj = { ..._iVhOldQc };
_iVhOldQc = { start: -1, _pLsyfBad: 0 };
}
}
if (_iVhOldQc._pLsyfBad > _mBSljxLj._pLsyfBad) _mBSljxLj = { ..._iVhOldQc };
if (_mBSljxLj._pLsyfBad > 1) {
_onorrDOQ.splice(_mBSljxLj.start, _mBSljxLj._pLsyfBad, '');
if (_mBSljxLj.start === 0) _onorrDOQ.unshift('');
if (_mBSljxLj.start + _mBSljxLj._pLsyfBad === 8) _onorrDOQ.push('');
}
return _onorrDOQ.join(':');
},
cidrToRange: (cidr, _CtGXOnKQ = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _PArfsHWb = parseInt(bitsStr, 10);
const _YaMcNmHt = new Set();
if (_iGVIAASX.isIPv4(range)) {
if (isNaN(_PArfsHWb) || _PArfsHWb < 8 || _PArfsHWb > 32) return [];
if (_PArfsHWb === 32) return [range];
const _thLCIfqc = _iGVIAASX.toLong4(range);
const _vLYAOfOT = (0xFFFFFFFF << (32 - _PArfsHWb)) >>> 0;
const _uCkAXQAW = _thLCIfqc & _vLYAOfOT;
const _eGHmeHQL = 1 << (32 - _PArfsHWb);
if (_eGHmeHQL <= 2) return [];
const _nYOafzHY = Math.min(_CtGXOnKQ, _eGHmeHQL - 2);
let _QMrsnLHJ = 0;
while (_YaMcNmHt.size < _nYOafzHY && _QMrsnLHJ < _nYOafzHY * 5) {
const _zjqXJPfL = Math.floor(Math.random() * (_eGHmeHQL - 2)) + 1;
_YaMcNmHt.add(_iGVIAASX.fromLong4((_uCkAXQAW + _zjqXJPfL) >>> 0));
_QMrsnLHJ++;
}
return Array.from(_YaMcNmHt);
} else if (_iGVIAASX.isIPv6(range)) {
if (isNaN(_PArfsHWb) || _PArfsHWb < 16 || _PArfsHWb > 128) return [];
if (_PArfsHWb === 128) return [range];
const _WkacATdD = _iGVIAASX.toBigInt6(range);
const _vLYAOfOT = (2n ** BigInt(128 - _PArfsHWb) - 1n);
const _uCkAXQAW = _WkacATdD & ~_vLYAOfOT;
const _VztJnSQx = 2n ** BigInt(128 - _PArfsHWb);
if (_VztJnSQx <= 2n) return [];
let _QMrsnLHJ = 0;
while (_YaMcNmHt.size < _CtGXOnKQ && _QMrsnLHJ < _CtGXOnKQ * 5) {
const _YTTFByjs = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_YTTFByjs);
let _keqmaanz = 0n;
for (const _mwXGoCWa of _YTTFByjs) {
_keqmaanz = (_keqmaanz << 8n) | BigInt(_mwXGoCWa);
}
const _zjqXJPfL = _keqmaanz % (_VztJnSQx - 2n) + 1n;
_YaMcNmHt.add(_iGVIAASX.fromBigInt6(_uCkAXQAW + _zjqXJPfL));
_QMrsnLHJ++;
}
return Array.from(_YaMcNmHt);
}
return [];
} catch(_TypLzJyb) {
console.error(`CIDR to range failed for ${cidr}:`, _TypLzJyb);
return [];
}
}
};
function _NGdjZSPO(_oWDOdwLO, _eIBcaHfh) {
const _xUKDihVa = {};
const _qgdJSRDh = Object._qgdJSRDh(_eIBcaHfh);
const _onorrDOQ = _qgdJSRDh.map(_fcHRWHAI => {
const _rZRGpHVd = _oWDOdwLO * (_eIBcaHfh[_fcHRWHAI] / 100);
return { _fcHRWHAI, _CtGXOnKQ: Math.floor(_rZRGpHVd), remainder: _rZRGpHVd - Math.floor(_rZRGpHVd) };
});
let _fPeaghXs = _onorrDOQ.reduce((acc, _LgGTGIpa) => acc + _LgGTGIpa._CtGXOnKQ, 0);
_onorrDOQ.sort((a, b) => b.remainder - a.remainder);
let _halfzaeg = _oWDOdwLO - _fPeaghXs;
for (let _aYUntfEd = 0; _aYUntfEd < _halfzaeg; _aYUntfEd++) {
_onorrDOQ[_aYUntfEd % _onorrDOQ._IIkxJcSQ]._CtGXOnKQ++;
}
for (const _LgGTGIpa of _onorrDOQ) {
_xUKDihVa[_LgGTGIpa._fcHRWHAI] = _LgGTGIpa._CtGXOnKQ;
}
return _xUKDihVa;
}
async function _JaaHuRlE(_BqBpPDHi) {
const _iUMcrmPH = _BqBpPDHi.DB.prepare("SELECT _zEUwoOLx FROM kv_data WHERE _fcHRWHAI = ?").bind(_JWYbennF);
const { _qfQmGQAV } = await _iUMcrmPH.all();
return _qfQmGQAV._IIkxJcSQ > 0 ? _qfQmGQAV[0]._zEUwoOLx : null;
}
async function _nzNqpDHi(_BqBpPDHi, _pmGHgKae) {
const _iUMcrmPH = _BqBpPDHi.DB.prepare(
"INSERT INTO kv_data (_fcHRWHAI, _zEUwoOLx) VALUES (?, ?) ON CONFLICT(_fcHRWHAI) DO UPDATE SET _zEUwoOLx = excluded._zEUwoOLx"
);
await _iUMcrmPH.bind(_JWYbennF, _pmGHgKae).run();
}
async function _vsrCcPvk(_PbxHterf, _BqBpPDHi) {
const { _pmGHgKae } = await _PbxHterf.json();
const _mncElFzf = await _JaaHuRlE(_BqBpPDHi);
if (_mncElFzf === _pmGHgKae) {
return _fsqXPSpD({ success: true });
}
return _fsqXPSpD({ success: false, _MBvXPQjK: '密码错误' }, 401);
}
async function _tMsDFCnz(_PbxHterf, _BqBpPDHi) {
const _chpTzINx = await _sVgCbqDF(_BqBpPDHi);
if (!_chpTzINx.visitorPassword || !_chpTzINx.visitorPassword._eeCieDoE) {
return _fsqXPSpD({ success: true });
}
try {
const { _pmGHgKae } = await _PbxHterf.json();
const _hUDnSJmJ = _chpTzINx.visitorPassword._pmGHgKae;
if (_hUDnSJmJ && _pmGHgKae === _hUDnSJmJ) {
return _fsqXPSpD({ success: true });
}
return _fsqXPSpD({ success: false, _MBvXPQjK: '访客密码错误' }, 401);
} catch (_TypLzJyb) {
return _fsqXPSpD({ success: false, _MBvXPQjK: '无效请求' }, 400);
}
}
async function _YdNdfNkT(_PbxHterf, _BqBpPDHi) {
const _oCQhrlvR = await _JaaHuRlE(_BqBpPDHi);
if (_oCQhrlvR) {
return _fsqXPSpD({ success: false, _MBvXPQjK: "密码已设置,无法重复初始化。" }, 403);
}
const { _pmGHgKae } = await _PbxHterf.json();
if (!_pmGHgKae || _pmGHgKae._IIkxJcSQ < 6) {
return _fsqXPSpD({ success: false, _MBvXPQjK: "密码长度不能少于6位。" }, 400);
}
await _nzNqpDHi(_BqBpPDHi, _pmGHgKae);
return _fsqXPSpD({ success: true, _MBvXPQjK: "初始密码设置成功!请刷新页面并登录。" });
}
async function _udDuHWCI(_PbxHterf, _BqBpPDHi) {
const { _bfxzMViB, _GAdmtQGj } = await _PbxHterf.json();
const _mncElFzf = await _JaaHuRlE(_BqBpPDHi);
if (_mncElFzf !== _bfxzMViB) {
return _fsqXPSpD({ success: false, _MBvXPQjK: "旧密码错误。" }, 403);
}
if (!_GAdmtQGj || _GAdmtQGj._IIkxJcSQ < 6) {
return _fsqXPSpD({ success: false, _MBvXPQjK: "新密码长度不能少于6位。" }, 400);
}
await _nzNqpDHi(_BqBpPDHi, _GAdmtQGj);
return _fsqXPSpD({ success: true, _MBvXPQjK: "密码修改成功!" });
}
function _mWVOUlYw() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_bRlKRqTQ: '',
api: {
_eeCieDoE: true,
_MBvXPQjK: '维护中...',
},
ispFilter: { _eeCieDoE: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_eeCieDoE: true
},
websocketStreamer: {
_eeCieDoE: true,
_vGtvnGlV: 'https://snippets.neib.cn'
},
cloudStorage: {
_eeCieDoE: true
},
visitorPassword: {
_eeCieDoE: false,
_pmGHgKae: '',
},
customSubPath: {
_eeCieDoE: false,
_UmImaGSA: 'latest',
},
subscriptionId: {
_IIkxJcSQ: 8,
_xbSMAFzA: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_eeCieDoE: true,
template: 'vless://{_SOExyrkk}@{_whSCQXik}:{_ZObIIUps}?encryption=none&security=tls&sni={_yUpbIijN}&fp=random&_mCxoiXge=ws&_yUpbIijN={_yUpbIijN}&_UmImaGSA={_UmImaGSA}#{_XhjeVTvM}',
selectionMode: 'first',
_zEklqmsL: [
{ _XhjeVTvM: '默认配置', _yUpbIijN: '', '_SOExyrkk': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _UmImaGSA: '/?ed=2560' }
],
_phZoMDbo: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_eeCieDoE: false,
_oivNELJI: '',
_FHuKcKCQ: 5
},
marquee: {
_eeCieDoE: false,
_oivNELJI: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_eeCieDoE: true,
sources: [
{ _ipvEvNap: 'CF官方IPV4', _YaMcNmHt: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _wkvJtQUx: false, _eeCieDoE: true, _RghwavkK: 20 },
{ _ipvEvNap: 'CF官方IPV6', _YaMcNmHt: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _wkvJtQUx: false, _eeCieDoE: true, _RghwavkK: 20 },
{ _ipvEvNap: '反代优选0', _YaMcNmHt: 'https://wvs.sosorg.nyc.mn/sub?_SOExyrkk=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_mCxoiXge=ws&_yUpbIijN=ss.nzvrn.com&_UmImaGSA=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _wkvJtQUx: false, _eeCieDoE: true, _RghwavkK: 30 },
{ _ipvEvNap: '官方优选1', _YaMcNmHt: 'https://ipdb.api.030101.xyz/?_mCxoiXge=bestcf&_bfevbNWg=true', _wkvJtQUx: false, _eeCieDoE: true, _RghwavkK: 10 },
{ _ipvEvNap: '反代优选2', _YaMcNmHt: 'https://ipdb.api.030101.xyz/?_mCxoiXge=bestproxy&_bfevbNWg=true', _wkvJtQUx: false, _eeCieDoE: true, _RghwavkK: 5 },
{ _ipvEvNap: '官方优选2', _YaMcNmHt: 'https://addressesapi.090227.xyz/_whSCQXik.164746.xyz', _wkvJtQUx: false, _eeCieDoE: true, _RghwavkK: 10 },
{ _ipvEvNap: '官方优选3', _YaMcNmHt: 'https://cfxr.eu.org/getSub?_yUpbIijN=snipaste.huggy.qzz.io', _wkvJtQUx: false, _eeCieDoE: true, _RghwavkK: 5 },
{ _ipvEvNap: '官方优选4', _YaMcNmHt: 'https://addressesapi.090227.xyz/CloudFlareYes', _wkvJtQUx: false, _eeCieDoE: true, _RghwavkK: 10 }
]
},
customNodes: {
_eeCieDoE: 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 _iYrDnfkD(_FvyDsqQM, _IzXLqAtS) {
if (!_FvyDsqQM) return _IzXLqAtS;
const _eOwhalkp = { ..._IzXLqAtS };
for (const _fcHRWHAI in _IzXLqAtS) {
if (_FvyDsqQM.hasOwnProperty(_fcHRWHAI)) {
if (typeof _FvyDsqQM[_fcHRWHAI] === 'object' && _FvyDsqQM[_fcHRWHAI] !== null && !Array.isArray(_FvyDsqQM[_fcHRWHAI]) && typeof _IzXLqAtS[_fcHRWHAI] === 'object' && _IzXLqAtS[_fcHRWHAI] !== null && !Array.isArray(_IzXLqAtS[_fcHRWHAI])) {
_eOwhalkp[_fcHRWHAI] = _iYrDnfkD(_FvyDsqQM[_fcHRWHAI], _IzXLqAtS[_fcHRWHAI]);
} else {
_eOwhalkp[_fcHRWHAI] = _FvyDsqQM[_fcHRWHAI];
}
}
}
return _eOwhalkp;
}
async function _sVgCbqDF(_BqBpPDHi) {
try {
const _iUMcrmPH = _BqBpPDHi.DB.prepare("SELECT _zEUwoOLx FROM kv_data WHERE _fcHRWHAI = ?").bind(_gJWEBxqT);
const { _qfQmGQAV } = await _iUMcrmPH.all();
const _xdRjWeqw = _qfQmGQAV._IIkxJcSQ > 0 ? _qfQmGQAV[0]._zEUwoOLx : null;
const _ZaDTYcEK = _xdRjWeqw ? JSON.parse(_xdRjWeqw) : {};
return _iYrDnfkD(_ZaDTYcEK, _mWVOUlYw());
} catch (_TypLzJyb) {
console.error("无法从D1获取或解析全局配置:", _TypLzJyb);
return _mWVOUlYw();
}
}
async function _tbUesKsl(_BqBpPDHi) {
const _fQFNrZVl = await _sVgCbqDF(_BqBpPDHi);
return _fsqXPSpD(_fQFNrZVl);
}
async function _GLqyOszZ(_PbxHterf, _BqBpPDHi, _lzkCHIQe) {
try {
const { _fQFNrZVl, adminPassword } = await _PbxHterf.json();
const _mncElFzf = await _JaaHuRlE(_BqBpPDHi);
if (_mncElFzf !== adminPassword) {
return _fsqXPSpD({ success: false, _MBvXPQjK: "管理员密码错误" }, 403);
}
const _iUMcrmPH = _BqBpPDHi.DB.prepare(
"INSERT INTO kv_data (_fcHRWHAI, _zEUwoOLx) VALUES (?, ?) ON CONFLICT(_fcHRWHAI) DO UPDATE SET _zEUwoOLx = excluded._zEUwoOLx"
);
const _yRkGgMuy = _iUMcrmPH.bind(_gJWEBxqT, JSON.stringify(_fQFNrZVl)).run();
_lzkCHIQe.waitUntil(_yRkGgMuy);
return _fsqXPSpD({ success: true, _MBvXPQjK: "配置已成功保存!" });
} catch (_TypLzJyb) {
return _fsqXPSpD({ success: false, _MBvXPQjK: `保存失败: ${_TypLzJyb._MBvXPQjK}` }, 500);
}
}
async function _PlwldESS() {
const _xZzWtKTE = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _yuDDLFLE = await fetch(_xZzWtKTE);
const _EnYwdzBn = await _yuDDLFLE.json();
const _OTKSPhch = 'https://www.bing.com' + _EnYwdzBn.images[0]._vGtvnGlV;
return fetch(_OTKSPhch);
} catch (_TypLzJyb) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _tXALUfAT(_whSCQXik) {
try {
const _oSLywggo = await fetch(`http://_whSCQXik-api.com/json/${_whSCQXik}?fields=status,_bfevbNWg,countryCode,_djGKrAQe&lang=zh-CN`);
if (_oSLywggo.ok) {
const _YtKORMAW = await _oSLywggo.json();
if (_YtKORMAW.status === 'success' && (_YtKORMAW.countryCode || _YtKORMAW._bfevbNWg)) {
let _djGKrAQe = _YtKORMAW._djGKrAQe || '未知';
if (_djGKrAQe.toLowerCase().includes('cloudflare')) {
_djGKrAQe = 'CloudFlare';
}
return {
_ipvEvNap: _eVRIAVlh[_YtKORMAW.countryCode] || _YtKORMAW._bfevbNWg || _YtKORMAW.countryCode,
_djGKrAQe: _djGKrAQe
};
}
}
} catch (_TypLzJyb) {}
try {
const _oSLywggo = await fetch(`https://api._whSCQXik.sb/geoip/${_whSCQXik}`);
if (_oSLywggo.ok) {
const _YtKORMAW = await _oSLywggo.json();
if (_YtKORMAW.country_code || _YtKORMAW._bfevbNWg) {
let _djGKrAQe = _YtKORMAW._djGKrAQe || '未知';
if (_djGKrAQe.toLowerCase().includes('cloudflare')) {
_djGKrAQe = 'CloudFlare';
}
return {
_ipvEvNap: _eVRIAVlh[_YtKORMAW.country_code] || _YtKORMAW._bfevbNWg || _YtKORMAW.country_code,
_djGKrAQe: _djGKrAQe
};
}
}
} catch (_TypLzJyb) {}
return { _ipvEvNap: '未知', _djGKrAQe: '未知' };
}
async function _RhlRjVul(_PbxHterf, _BqBpPDHi) {
try {
const { _YaMcNmHt } = await _PbxHterf.json();
if (!Array.isArray(_YaMcNmHt)) {
return _fsqXPSpD({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _toIfmHsq = _YaMcNmHt.map(_whSCQXik => _tXALUfAT(_whSCQXik).then(_LEfhUEpV => ({ _whSCQXik, ..._LEfhUEpV })));
const _qfQmGQAV = await Promise.all(_toIfmHsq);
return _fsqXPSpD(_qfQmGQAV);
} catch (_TypLzJyb) {
return _fsqXPSpD({ error: `获取地理位置失败: ${_TypLzJyb._MBvXPQjK}` }, 500);
}
}
async function _nokqNjYn(_PbxHterf, _BqBpPDHi) {
const _fQFNrZVl = await _sVgCbqDF(_BqBpPDHi);
if (!_fQFNrZVl.cloudStorage._eeCieDoE) {
return _fsqXPSpD({ _qfQmGQAV: [], generatedBy: null });
}
try {
const _iUMcrmPH = _BqBpPDHi.DB.prepare("SELECT _zEUwoOLx FROM kv_data WHERE _fcHRWHAI = ?").bind(_jCKPInJs);
const { _qfQmGQAV } = await _iUMcrmPH.all();
const _LssVEvQd = _qfQmGQAV._IIkxJcSQ > 0 ? _qfQmGQAV[0]._zEUwoOLx : null;
const _vEDNOgIF = _LssVEvQd ? JSON.parse(_LssVEvQd) : null;
return _fsqXPSpD(_vEDNOgIF || { _qfQmGQAV: [], generatedBy: null });
} catch (_TypLzJyb) {
console.error("从D1读取缓存IP失败:", _TypLzJyb);
return _fsqXPSpD({ _qfQmGQAV: [], generatedBy: null });
}
}
async function _InKnmzdX(_PbxHterf, _BqBpPDHi, _lzkCHIQe) {
const _fQFNrZVl = await _sVgCbqDF(_BqBpPDHi);
if (!_fQFNrZVl.cloudStorage._eeCieDoE) {
return _fsqXPSpD({ success: true, _MBvXPQjK: "云端存储已禁用,不保存结果。" });
}
const _OKXGOdmm = _PbxHterf._ZSCbaYzy.get('CF-Connecting-IP') || "未知IP";
const _bfevbNWg = _PbxHterf.cf?._bfevbNWg || "未知";
const _jvLiuLnl = _PbxHterf.cf?._jvLiuLnl || "";
let _quRzKWMm = _eVRIAVlh[_bfevbNWg] || _bfevbNWg;
if (_jvLiuLnl && _jvLiuLnl !== "未知城市" && _jvLiuLnl !== _bfevbNWg) _quRzKWMm = `${_quRzKWMm} ${_eVRIAVlh[_jvLiuLnl] || _jvLiuLnl}`;
const _madXNRso = {
_whSCQXik: _nvchzGZP(_OKXGOdmm),
_ipvEvNap: _quRzKWMm.trim(),
time: _WZfDvrBg()
};
try {
const _FxFVARQf = await _PbxHterf.json();
if (!Array.isArray(_FxFVARQf)) return _fsqXPSpD({ error: "无效数据格式" }, 400);
const _ZlakWTlX = _FxFVARQf.map(_TvtziHCp => ({
_whSCQXik: String(_TvtziHCp._whSCQXik || ''),
_ZObIIUps: _TvtziHCp._ZObIIUps ? parseInt(_TvtziHCp._ZObIIUps, 10) : undefined,
_adGKqDaI: parseInt(_TvtziHCp._adGKqDaI, 10),
_ipvEvNap: typeof _TvtziHCp._ipvEvNap === 'string' ? _TvtziHCp._ipvEvNap.substring(0, 50) : 'N/A',
_djGKrAQe: typeof _TvtziHCp._djGKrAQe === 'string' ? _TvtziHCp._djGKrAQe.substring(0, 100) : 'N/A'
}));
const _QGumLoVw = {
generatedBy: _madXNRso,
_qfQmGQAV: _ZlakWTlX
};
const _XjRuAFZf = _BqBpPDHi.DB.prepare(
"INSERT INTO kv_data (_fcHRWHAI, _zEUwoOLx) VALUES (?, ?) ON CONFLICT(_fcHRWHAI) DO UPDATE SET _zEUwoOLx = excluded._zEUwoOLx"
).bind(_jCKPInJs, JSON.stringify(_QGumLoVw)).run();
if (_fQFNrZVl.telegram.bot_token && _fQFNrZVl.telegram.chat_id) {
const _TdnitoaH = _ZlakWTlX.map(r => `${r._whSCQXik} ~ ${r._ipvEvNap}`).join('\n');
const _uQHFMkkx = `优选完成!\n来源: ${_madXNRso._whSCQXik} (${_madXNRso._ipvEvNap})\n时间: ${_madXNRso.time}\n\n结果:\n${_TdnitoaH}`;
const _tuQPastC = `https://api.telegram.org/bot${_fQFNrZVl.telegram.bot_token}/sendMessage?chat_id=${_fQFNrZVl.telegram.chat_id}&_oivNELJI=${encodeURIComponent(_uQHFMkkx)}`;
const _WvlyodCy = fetch(_tuQPastC).catch(_TypLzJyb => console.error("Telegram结果通知失败:", _TypLzJyb));
_lzkCHIQe.waitUntil(Promise.all([_XjRuAFZf, _WvlyodCy]));
} else {
_lzkCHIQe.waitUntil(_XjRuAFZf);
}
return _fsqXPSpD({ success: true, _MBvXPQjK: "结果已保存" });
} catch (_TypLzJyb) {
return _fsqXPSpD({ error: "D1写入失败", _MBvXPQjK: _TypLzJyb._MBvXPQjK }, 500);
}
}
async function _YiwUyxnx(_PbxHterf, _BqBpPDHi, _lzkCHIQe) {
try {
const _HpgkptWZ = await _PbxHterf.json();
if (!Array.isArray(_HpgkptWZ)) return _fsqXPSpD({ error: "无效数据格式" }, 400);
const _QGumLoVw = {
_qfQmGQAV: _HpgkptWZ
};
const _iUMcrmPH = _BqBpPDHi.DB.prepare(
"INSERT INTO kv_data (_fcHRWHAI, _zEUwoOLx) VALUES (?, ?) ON CONFLICT(_fcHRWHAI) DO UPDATE SET _zEUwoOLx = excluded._zEUwoOLx"
);
const _yRkGgMuy = _iUMcrmPH.bind(_qgrCVzzR, JSON.stringify(_QGumLoVw)).run();
_lzkCHIQe.waitUntil(_yRkGgMuy);
return _fsqXPSpD({ success: true });
} catch (_TypLzJyb) {
return _fsqXPSpD({ error: "D1写入临时缓存失败", _MBvXPQjK: _TypLzJyb._MBvXPQjK }, 500);
}
}
function _fGCcBbZP(_IIkxJcSQ, _xbSMAFzA) {
let _RisxZExA = '';
const _dTRpTrlv = _xbSMAFzA._IIkxJcSQ;
for (let _aYUntfEd = 0; _aYUntfEd < _IIkxJcSQ; _aYUntfEd++) {
_RisxZExA += _xbSMAFzA.charAt(Math.floor(Math.random() * _dTRpTrlv));
}
return _RisxZExA;
}
async function _pQfieGrv(_PbxHterf, _BqBpPDHi) {
try {
const _FxFVARQf = await _PbxHterf.json();
if (!Array.isArray(_FxFVARQf) || _FxFVARQf._IIkxJcSQ === 0) {
return _fsqXPSpD({ error: "无效或空的IP列表" }, 400);
}
const _fQFNrZVl = await _sVgCbqDF(_BqBpPDHi);
const _zIAbFldk = _fQFNrZVl.subscriptionId || { _IIkxJcSQ: 8, _xbSMAFzA: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _xsDlrBjr;
let _DSjMFhPm = false;
let _QMrsnLHJ = 0;
const _qKNsWXer = 10;
while (!_DSjMFhPm && _QMrsnLHJ < _qKNsWXer) {
_xsDlrBjr = _fGCcBbZP(_zIAbFldk._IIkxJcSQ, _zIAbFldk._xbSMAFzA);
const { _qfQmGQAV } = await _BqBpPDHi.DB.prepare("SELECT _WMHQbbce FROM optimized_results WHERE _WMHQbbce = ?").bind(_xsDlrBjr).all();
if (_qfQmGQAV._IIkxJcSQ === 0) {
_DSjMFhPm = true;
}
_QMrsnLHJ++;
}
if (!_DSjMFhPm) {
return _fsqXPSpD({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _onCwvaqK = JSON.stringify({ _YaMcNmHt: _FxFVARQf });
await _BqBpPDHi.DB.prepare(
"INSERT INTO optimized_results (_WMHQbbce, _YtKORMAW) VALUES (?, ?)"
).bind(_xsDlrBjr, _onCwvaqK).run();
await _BqBpPDHi.DB.prepare(
"INSERT INTO kv_data (_fcHRWHAI, _zEUwoOLx) VALUES (?, ?) ON CONFLICT(_fcHRWHAI) DO UPDATE SET _zEUwoOLx = excluded._zEUwoOLx"
).bind(_GhFQuyCk, _xsDlrBjr).run();
return _fsqXPSpD({ success: true, _WMHQbbce: _xsDlrBjr });
} catch (_TypLzJyb) {
return _fsqXPSpD({ error: "保存优选结果失败", _MBvXPQjK: _TypLzJyb._MBvXPQjK }, 500);
}
}
async function _GmpZNSrA(_PbxHterf, _BqBpPDHi) {
try {
const _xsDlrBjr = _PbxHterf._aNskTGPB._WMHQbbce;
if (!_xsDlrBjr) {
return new Response("缺少结果ID", { status: 400 });
}
const _RisxZExA = await _BqBpPDHi.DB.prepare("SELECT _YtKORMAW FROM optimized_results WHERE _WMHQbbce = ?").bind(_xsDlrBjr).first();
if (!_RisxZExA) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _YtKORMAW = JSON.parse(_RisxZExA._YtKORMAW);
let _TdnitoaH = _YtKORMAW._YaMcNmHt;
const _fQFNrZVl = await _sVgCbqDF(_BqBpPDHi);
if (_fQFNrZVl.customNodes && _fQFNrZVl.customNodes._eeCieDoE && _fQFNrZVl.customNodes.list) {
const _aIVURqPK = _fQFNrZVl.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _oqlLIsTY = _aIVURqPK.map(_tDtfDHxZ => {
let _bCuVHijH = _tDtfDHxZ;
let _ZObIIUps = undefined;
let _XhjeVTvM = null;
if (_bCuVHijH.includes('@')) {
const _onorrDOQ = _bCuVHijH.split('@');
_XhjeVTvM = _onorrDOQ.pop();
_bCuVHijH = _onorrDOQ.join('@');
}
if (_bCuVHijH.includes('#')) {
const _onorrDOQ = _bCuVHijH.split('#');
const _zJsSSaZV = _onorrDOQ.pop();
if (!isNaN(_zJsSSaZV) && _zJsSSaZV.trim() !== '') {
_ZObIIUps = parseInt(_zJsSSaZV, 10);
}
_bCuVHijH = _onorrDOQ.join('#');
}
return {
_whSCQXik: _bCuVHijH,
_ZObIIUps: _ZObIIUps,
_ipvEvNap: _XhjeVTvM || _bCuVHijH,
_djGKrAQe: '自定义'
};
});
_TdnitoaH.unshift(..._oqlLIsTY);
}
const { itemLink } = _fQFNrZVl;
const _ZHqAhuQQ = new URL(_PbxHterf._vGtvnGlV)._ZvPPjLqC;
let _JHkJmkqK;
if (_fQFNrZVl.websocketStreamer && _fQFNrZVl.websocketStreamer._eeCieDoE) {
if (!itemLink || !itemLink._eeCieDoE || !itemLink._zEklqmsL || itemLink._zEklqmsL._IIkxJcSQ === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_JHkJmkqK = _TdnitoaH.map((_TvtziHCp, _rSrUKrJc) => {
let _XhjeVTvM;
if (_TvtziHCp._djGKrAQe === '自定义') {
_XhjeVTvM = `${_rSrUKrJc + 1} - ${_TvtziHCp._ipvEvNap}`;
} else {
_XhjeVTvM = `${_rSrUKrJc + 1} - ${_TvtziHCp._ipvEvNap || '未知'}`;
if (!_TvtziHCp._djGKrAQe || !_TvtziHCp._djGKrAQe.toLowerCase().includes('cloudflare')) {
_XhjeVTvM += '(反代)';
}
}
const _pvfJGJvk = _iGVIAASX.isIPv6(_TvtziHCp._whSCQXik) ? `[${_TvtziHCp._whSCQXik}]` : _TvtziHCp._whSCQXik;
const _ZObIIUps = _TvtziHCp._ZObIIUps || 443;
const _pyFArUCZ = itemLink._zEklqmsL[0];
const _RBfaORXl = _pyFArUCZ._SOExyrkk || '';
const _SOExyrkk = (_RBfaORXl && _joFWJDEw(_RBfaORXl)) ? _RBfaORXl : crypto.randomUUID();
const _UmImaGSA = '/snippets?_whSCQXik=endpointAddress:_ZObIIUps(443)&nat64=6to4';
const _yUpbIijN = _pyFArUCZ._yUpbIijN || _ZHqAhuQQ;
const _aNskTGPB = new URLSearchParams({
security: 'tls',
_mCxoiXge: 'ws',
_yUpbIijN: _yUpbIijN,
sni: _yUpbIijN,
fp: 'random'
});
return `vless://${_SOExyrkk}@${_pvfJGJvk}:${_ZObIIUps}?${_aNskTGPB.toString()}&_UmImaGSA=${encodeURIComponent(encodeURIComponent(_UmImaGSA))}#${encodeURIComponent(_XhjeVTvM)}`;
});
} else {
if (!itemLink || !itemLink._eeCieDoE || !itemLink._zEklqmsL || itemLink._zEklqmsL._IIkxJcSQ === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _pyFArUCZ = itemLink._zEklqmsL[0];
const { _yUpbIijN, _SOExyrkk, _UmImaGSA } = _pyFArUCZ;
_JHkJmkqK = _TdnitoaH.map((_TvtziHCp, _rSrUKrJc) => {
let _XhjeVTvM;
if (_TvtziHCp._djGKrAQe === '自定义') {
_XhjeVTvM = `${_rSrUKrJc + 1} - ${_TvtziHCp._ipvEvNap}`;
} else {
_XhjeVTvM = `${_rSrUKrJc + 1} - ${_TvtziHCp._ipvEvNap || '未知'}`;
if (!_TvtziHCp._djGKrAQe || !_TvtziHCp._djGKrAQe.toLowerCase().includes('cloudflare')) {
_XhjeVTvM += '(反代)';
}
}
const _pvfJGJvk = _iGVIAASX.isIPv6(_TvtziHCp._whSCQXik) ? `[${_TvtziHCp._whSCQXik}]` : _TvtziHCp._whSCQXik;
const _ZObIIUps = _TvtziHCp._ZObIIUps || 443;
const _aNskTGPB = new URLSearchParams({
security: 'tls',
_mCxoiXge: 'ws',
_yUpbIijN: _yUpbIijN || _ZHqAhuQQ,
sni: _yUpbIijN || _ZHqAhuQQ,
fp: 'random'
});
return `vless://${_SOExyrkk}@${_pvfJGJvk}:${_ZObIIUps}?${_aNskTGPB.toString()}&_UmImaGSA=${encodeURIComponent(encodeURIComponent(_UmImaGSA || ''))}#${encodeURIComponent(_XhjeVTvM)}`;
});
}
const _LeNlVBvJ = _JHkJmkqK.join('\n');
const _VUauMcox = btoa(_LeNlVBvJ);
return new Response(_VUauMcox, {
_ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' }
});
} catch (_TypLzJyb) {
return new Response(`生成节点列表失败: ${_TypLzJyb._MBvXPQjK}`, { status: 500 });
}
}
async function _KzOdJLoc(_PbxHterf) {
try {
const { _txWFtQsP, _mCxoiXge } = await _PbxHterf.json();
if (!Array.isArray(_txWFtQsP)) {
return new Response('Invalid _txWFtQsP list', { status: 400 });
}
const _yQzMnPHh = _txWFtQsP.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _vGtvnGlV = `https://cloudflare-dns.com/dns-query?_XhjeVTvM=${encodeURIComponent(domain.trim())}&_mCxoiXge=${_mCxoiXge || 'A'}`;
return fetch(_vGtvnGlV, { _ZSCbaYzy: { 'Accept': 'application/dns-json' } })
.then(_oSLywggo => _oSLywggo.json())
.then(_YtKORMAW => (_YtKORMAW.Answer ? _YtKORMAW.Answer.map(a => a._YtKORMAW) : []))
.catch(() => []);
});
const _EIdqOoHh = (await Promise.all(_yQzMnPHh)).flat();
const _LHOGzHtn = [...new Set(_EIdqOoHh)];
if (_LHOGzHtn._IIkxJcSQ === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_LHOGzHtn.join('\n'), { _ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._MBvXPQjK}`, { status: 500 });
}
}
async function _MwOFKZOS(_PbxHterf, _BqBpPDHi) {
try {
const { _LvSDpwzm } = await _PbxHterf.json();
if (!Array.isArray(_LvSDpwzm)) {
return _fsqXPSpD({ error: "Invalid input, expected an object with a '_LvSDpwzm' array." }, 400);
}
const _yukkdAtJ = new Set();
const _TTkgZQdA = _LvSDpwzm.map(_vGtvnGlV =>
_BJObFTPI(_vGtvnGlV)
.then(_oivNELJI => {
if (!_oivNELJI) return;
const _RAKwIUcK = _oivNELJI.split(/[\s,;|]+/);
for (const _maJmIRlv of _RAKwIUcK) {
const _KcqnLUOP = _maJmIRlv.trim();
if (_KcqnLUOP) {
_yukkdAtJ.add(_KcqnLUOP);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_vGtvnGlV}:`, err);
})
);
await Promise.all(_TTkgZQdA);
return _fsqXPSpD({ _YaMcNmHt: Array.from(_yukkdAtJ) });
} catch (_TypLzJyb) {
return _fsqXPSpD({ error: `Failed to process URLs: ${_TypLzJyb._MBvXPQjK}` }, 500);
}
}
async function _gLrzHPjH(_PbxHterf, _BqBpPDHi) {
const _fQFNrZVl = await _sVgCbqDF(_BqBpPDHi);
if (!_fQFNrZVl.api._eeCieDoE) {
return new Response(_fQFNrZVl.api._MBvXPQjK || 'API is disabled.', { status: 503 });
}
try {
const _iUMcrmPH = _BqBpPDHi.DB.prepare("SELECT _zEUwoOLx FROM kv_data WHERE _fcHRWHAI = ?").bind(_jCKPInJs);
const { _qfQmGQAV: dbResults } = await _iUMcrmPH.all();
const _LssVEvQd = dbResults._IIkxJcSQ > 0 ? dbResults[0]._zEUwoOLx : null;
const _vEDNOgIF = _LssVEvQd ? JSON.parse(_LssVEvQd) : null;
if (!_vEDNOgIF || !_vEDNOgIF._qfQmGQAV || _vEDNOgIF._qfQmGQAV._IIkxJcSQ === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' },
});
}
const _YaMcNmHt = _vEDNOgIF._qfQmGQAV.map(r => r._whSCQXik);
return new Response(_YaMcNmHt.join('\n'), {
_ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' },
});
} catch (_TypLzJyb) {
console.error("API /_whSCQXik 处理错误:", _TypLzJyb);
return new Response(`API处理时出错: ${_TypLzJyb._MBvXPQjK}`, { status: 500 });
}
}
function _NFOuYqTg(_RisxZExA, _rSrUKrJc, _fQFNrZVl, _ZHqAhuQQ) {
const { itemLink } = _fQFNrZVl;
if (!itemLink || !itemLink._eeCieDoE) return null;
const { template, _zEklqmsL, selectionMode, _phZoMDbo } = itemLink;
if (!_zEklqmsL || _zEklqmsL._IIkxJcSQ === 0) return null;
let _ZqOGtGzA;
if (selectionMode === 'random') {
_ZqOGtGzA = _zEklqmsL[_rSrUKrJc % _zEklqmsL._IIkxJcSQ];
} else if (selectionMode === 'first') {
_ZqOGtGzA = _zEklqmsL[0];
} else {
_ZqOGtGzA = _zEklqmsL.find(s => s._XhjeVTvM === selectionMode) || _zEklqmsL[0];
}
if (!_ZqOGtGzA) return null;
let _LvbhDBDQ = template;
const _zSPVfOob = _RisxZExA._ZObIIUps || 443;
const _gHRrhjLH = _iGVIAASX.isIPv6(_RisxZExA._whSCQXik) ? `[${_RisxZExA._whSCQXik}]` : _RisxZExA._whSCQXik;
let _XhjeVTvM = `${_rSrUKrJc + 1} 、 ${_RisxZExA._ipvEvNap || '未知'}`;
if (!_RisxZExA._djGKrAQe || !_RisxZExA._djGKrAQe.toLowerCase().includes('cloudflare')) {
_XhjeVTvM += '(反代)';
}
let _yUpbIijN = _ZqOGtGzA._yUpbIijN || _ZHqAhuQQ;
_LvbhDBDQ = _LvbhDBDQ.replace(/{_whSCQXik}/g, _gHRrhjLH)
.replace(/{_ZObIIUps}/g, _zSPVfOob)
.replace(/{_XhjeVTvM}/g, encodeURIComponent(_XhjeVTvM))
.replace(/{rank}/g, _rSrUKrJc + 1)
.replace(/{_ipvEvNap}/g, encodeURIComponent(_RisxZExA._ipvEvNap || '未知'))
.replace(/{_djGKrAQe}/g, encodeURIComponent(_RisxZExA._djGKrAQe || '未知'))
.replace(/{_yUpbIijN}/g, encodeURIComponent(_yUpbIijN))
.replace(/{_SOExyrkk}/g, encodeURIComponent(_ZqOGtGzA['_SOExyrkk'] || ''))
.replace(/{_UmImaGSA}/g, encodeURIComponent(encodeURIComponent(_ZqOGtGzA._UmImaGSA || '')));
if (_phZoMDbo) {
_phZoMDbo.forEach(field => {
const _KENAeUYh = new RegExp('{' + field._XhjeVTvM + '}', 'g');
_LvbhDBDQ = _LvbhDBDQ.replace(_KENAeUYh, encodeURIComponent(field._zEUwoOLx));
});
}
return _LvbhDBDQ;
}
async function _XKWhbyWP(_PbxHterf, _BqBpPDHi) {
const _fQFNrZVl = await _sVgCbqDF(_BqBpPDHi);
if (!_fQFNrZVl.itemLink._eeCieDoE) {
return new Response("Item _LvbhDBDQ feature is disabled.", { status: 503, _ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' } });
}
try {
const _iUMcrmPH = _BqBpPDHi.DB.prepare("SELECT _zEUwoOLx FROM kv_data WHERE _fcHRWHAI = ?").bind(_jCKPInJs);
const { _qfQmGQAV: dbResults } = await _iUMcrmPH.all();
const _LssVEvQd = dbResults._IIkxJcSQ > 0 ? dbResults[0]._zEUwoOLx : null;
const _vEDNOgIF = _LssVEvQd ? JSON.parse(_LssVEvQd) : null;
if (!_vEDNOgIF || !_vEDNOgIF._qfQmGQAV || _vEDNOgIF._qfQmGQAV._IIkxJcSQ === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' },
});
}
const _ZHqAhuQQ = new URL(_PbxHterf._vGtvnGlV)._ZvPPjLqC;
const _QwaxrNED = _vEDNOgIF._qfQmGQAV.map((_RisxZExA, _rSrUKrJc) => {
return _NFOuYqTg(_RisxZExA, _rSrUKrJc, _fQFNrZVl, _ZHqAhuQQ);
}).filter(Boolean);
if (_QwaxrNED._IIkxJcSQ === 0) {
return new Response("Could not generate any _TvtziHCp links from the available IPs.", {
status: 500,
_ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' },
});
}
return new Response(_QwaxrNED.join('\n'), {
_ZSCbaYzy: { 'Content-Type': '_oivNELJI/plain; _xbSMAFzA=utf-8' },
});
} catch (_TypLzJyb) {
console.error("API /api/endpoints error:", _TypLzJyb);
return new Response(`Error processing API _PbxHterf: ${_TypLzJyb._MBvXPQjK}`, { status: 500 });
}
}
async function _tfNoBUDk(_PbxHterf, _BqBpPDHi, _lzkCHIQe) {
const _OKXGOdmm = _PbxHterf._ZSCbaYzy.get('CF-Connecting-IP') || "未知IP";
const [
_tQbnVJSD,
_WbkRzjnf,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_XyxahkHH(_GQflSqPi, _NZNmHcfl, []),
_XyxahkHH(_TaAHxqAN, _NZNmHcfl, []),
_XyxahkHH(_yoIKOqFD, _gltBabvI, []),
_XyxahkHH(_xVOQDmHZ, _jIErJVpS, { "N/A": "未知" })
]);
_eVRIAVlh = fetchedCountryMap;
let _uIOgcLyR = false;
let _chpTzINx;
try {
const _pmGHgKae = await _JaaHuRlE(_BqBpPDHi);
_uIOgcLyR = !!_pmGHgKae;
_chpTzINx = await _sVgCbqDF(_BqBpPDHi);
} catch (_TypLzJyb) {
if (_TypLzJyb._MBvXPQjK && _TypLzJyb._MBvXPQjK.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _MgTBJEfH = "CREATE TABLE IF NOT EXISTS kv_data (_fcHRWHAI TEXT PRIMARY KEY, _zEUwoOLx TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_WMHQbbce TEXT PRIMARY KEY, _YtKORMAW TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _BqBpPDHi.DB.exec(_MgTBJEfH);
console.log("数据表创建成功。");
_uIOgcLyR = false;
_chpTzINx = _mWVOUlYw();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._MBvXPQjK}`, {
status: 500,
_ZSCbaYzy: { 'Content-Type': '_oivNELJI/html;_xbSMAFzA=UTF-8' }
});
}
} else {
let _IhWsdHZl = _AFAfuUjH(_TypLzJyb._MBvXPQjK);
return new Response(_IhWsdHZl, { _ZSCbaYzy: { 'Content-Type': '_oivNELJI/html;_xbSMAFzA=UTF-8' } });
}
}
if (_chpTzINx.telegram.bot_token && _chpTzINx.telegram.chat_id) {
const _bfevbNWg = _PbxHterf.cf?._bfevbNWg || "未知";
const _jvLiuLnl = _PbxHterf.cf?._jvLiuLnl || "";
let _quRzKWMm = _eVRIAVlh[_bfevbNWg] || _bfevbNWg;
if (_jvLiuLnl && _jvLiuLnl !== "未知城市" && _jvLiuLnl !== _bfevbNWg) _quRzKWMm = `${_quRzKWMm} ${_eVRIAVlh[_jvLiuLnl] || _jvLiuLnl}`;
const _BGTAtXOm = _WZfDvrBg();
const _tkScuvsU = _PbxHterf._vGtvnGlV;
const _uQHFMkkx = `访客: ${_OKXGOdmm}\n位置: ${_quRzKWMm.trim()}\n时间: ${_BGTAtXOm}\n来自:${_tkScuvsU}`;
const _tuQPastC = `https://api.telegram.org/bot${_chpTzINx.telegram.bot_token}/sendMessage?chat_id=${_chpTzINx.telegram.chat_id}&_oivNELJI=${encodeURIComponent(_uQHFMkkx)}`;
_lzkCHIQe.waitUntil(fetch(_tuQPastC).catch(_TypLzJyb => console.error("Telegram通知失败:", _TypLzJyb)));
}
let _AiIPBuOu = _wCasksMF();
const _boVuXOHD = {
_fQFNrZVl: _chpTzINx,
status: {
_uIOgcLyR: _uIOgcLyR,
}
};
_AiIPBuOu = _AiIPBuOu.replace('__PAGE_DATA_JSON__', JSON.stringify(_boVuXOHD));
_AiIPBuOu = _AiIPBuOu.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_tQbnVJSD));
_AiIPBuOu = _AiIPBuOu.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_WbkRzjnf));
_AiIPBuOu = _AiIPBuOu.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_AiIPBuOu = _AiIPBuOu.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_eVRIAVlh));
return new Response(_AiIPBuOu, {
_ZSCbaYzy: { 'Content-Type': '_oivNELJI/html;_xbSMAFzA=UTF-8' },
});
}
function _fsqXPSpD(_jWmkrTWC, status = 200, _ZSCbaYzy = {}) {
return new Response(JSON.stringify(_jWmkrTWC), {
status,
_ZSCbaYzy: { 'Content-Type': 'application/json;_xbSMAFzA=UTF-8', ..._ZSCbaYzy }
});
}
function _WZfDvrBg(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 _nvchzGZP(_whSCQXik) {
if (!_whSCQXik || typeof _whSCQXik !== 'string') return "无效IP";
if(_iGVIAASX.isIPv4(_whSCQXik)){
const _onorrDOQ = _whSCQXik.split('.');
if (_onorrDOQ._IIkxJcSQ === 4) return `${_onorrDOQ[0]}.*.*.${_onorrDOQ[3]}`;
}
if(_iGVIAASX.isIPv6(_whSCQXik)){
const _onorrDOQ = _whSCQXik.split(':');
if (_onorrDOQ._IIkxJcSQ > 2) return `${_onorrDOQ[0]}:...:${_onorrDOQ[_onorrDOQ._IIkxJcSQ - 1]}`;
}
return _whSCQXik;
}
function _AFAfuUjH(_WYsIKcJh) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _xbSMAFzA="UTF-8"><title>需要设置</title>
<_opyqAExW>
_jWmkrTWC { font-family: sans-serif; background: #1a1a1a; _ZByYaVjC: #e0e0e0; display: flex; justify-_XdcCXKqC: center; align-items: center; height: 100vh; margin: 0; }
._byzvTaLq { max-_opxxaWJC: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _ZByYaVjC: #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 { _ZByYaVjC: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_EFAdJLCL: 1rem; }
</_opyqAExW>
</head><_jWmkrTWC>
<div class="_byzvTaLq">
<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>
${_WYsIKcJh ? `<div class="error"><strong>当前错误信息:</strong> ${_WYsIKcJh.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_jWmkrTWC></html>`;
}
function _wCasksMF() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _xbSMAFzA="UTF-8"> <meta _XhjeVTvM="viewport" _XdcCXKqC="_opxxaWJC=device-_opxxaWJC, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_LvbhDBDQ 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>
<_opyqAExW>
:root { --primary-_ZByYaVjC: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_ZByYaVjC: #8c939d; --light-bg: #1A1C20; --_XdcCXKqC-bg: #25282E; --border-_ZByYaVjC: #40444C; --_oivNELJI-_ZByYaVjC: #E0E0E0; --_oivNELJI-light: #B0B0B0; --success-_ZByYaVjC: #30A46C; --danger-_ZByYaVjC: #DA3633; --warning-_ZByYaVjC: #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; }
_jWmkrTWC { font-family: var(--font-family-sans); background-_ZByYaVjC: var(--light-bg); _ZByYaVjC: var(--_oivNELJI-_ZByYaVjC); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_ZByYaVjC 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_ivYqUaRR { position: fixed; _EFAdJLCL: 0; _NgyAzyuD: 0; _opxxaWJC: 100%; height: 100%; z-_rSrUKrJc: -1; display: none; }
._CVXBHlen-_byzvTaLq { max-_opxxaWJC: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_rSrUKrJc: 1; }
#_tQoKGZZF { position: fixed; _EFAdJLCL: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_rSrUKrJc: 10; }
#marquee-_byzvTaLq { overflow: hidden; white-space: nowrap; background-_ZByYaVjC: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _ZByYaVjC: var(--primary-_ZByYaVjC); padding: 0.5rem 0; margin-_EFAdJLCL: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_oivNELJI { display: inline-block; padding-_NgyAzyuD: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_YivsTWpg { _oivNELJI-align: center; margin-_EFAdJLCL: 1rem; margin-bottom: 2rem; }
_YivsTWpg h1 { white-space: pre-wrap; font-size: 2.25em; _ZByYaVjC: var(--primary-_ZByYaVjC); font-weight: 700; _oivNELJI-shadow: 0 0 10px rgba(var(--primary-_ZByYaVjC-rgb), 0.3); }
.card { background-_ZByYaVjC: 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-_ZByYaVjC); }
.progress-section #_PojoGszn { _opxxaWJC: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_ZByYaVjC: var(--border-_ZByYaVjC); overflow: hidden; }
.progress-section #_PojoGszn::-webkit-progress-_zEUwoOLx { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _oivNELJI-align: center; margin-_EFAdJLCL: 0.75em; font-size: 0.95em; _ZByYaVjC: var(--_oivNELJI-light); min-height: 1.5em; }
.section-_YivsTWpg { display: flex; flex-wrap: wrap; justify-_XdcCXKqC: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_ZByYaVjC); gap: 1rem; }
.section-_YivsTWpg h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _ZByYaVjC: var(--secondary-_ZByYaVjC); _oivNELJI-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _opxxaWJC: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _opxxaWJC: 100%; border-collapse: collapse; margin-_EFAdJLCL: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_ZByYaVjC); padding: 0.8em; _oivNELJI-align: _NgyAzyuD; vertical-align: middle; white-space: nowrap; }
th { background-_ZByYaVjC: #2c3038; font-weight: 500; }
tbody tr:hover { background-_ZByYaVjC: #30333a; }
td._whSCQXik-_bCuVHijH { font-weight: 500; font-family: var(--font-family-mono); _ZByYaVjC: var(--primary-_ZByYaVjC); }
td.ping-_zEUwoOLx { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _oivNELJI-align: right; }
.btn { display: inline-flex; align-items: center; justify-_XdcCXKqC: center; font-weight: 500; _oivNELJI-align: center; cursor: pointer; user-_sgoEMyyM: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _ZByYaVjC: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_NgyAzyuD: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _ZByYaVjC: var(--primary-_ZByYaVjC); border: 1px solid var(--primary-_ZByYaVjC); }
.btn-outline:hover { background-_ZByYaVjC: var(--primary-_ZByYaVjC); _ZByYaVjC: var(--_XdcCXKqC-bg); }
._CVXBHlen-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._CVXBHlen-download-buttons .btn { _opxxaWJC: 100%; margin: 0; }
.tooltip-notification { position: fixed; _EFAdJLCL: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _ZByYaVjC: #fff; font-size: 0.95em; z-_rSrUKrJc: 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); }
#_YiWxbyCm, #_MyXbSEXb, #_sVOtZryN, #_XFgntNHQ, #_XoJlRYwJ { display: none; position: fixed; z-_rSrUKrJc: 10000; _NgyAzyuD: 0; _EFAdJLCL: 0; _opxxaWJC: 100%; height: 100%; background-_ZByYaVjC: rgba(0,0,0,0.6); justify-_XdcCXKqC: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_XdcCXKqC, ._CVXBHlen-modal-_XdcCXKqC { background-_ZByYaVjC: var(--_XdcCXKqC-bg); padding: 2rem; border: 1px solid var(--border-_ZByYaVjC); border-radius: var(--border-radius-md); _opxxaWJC: 95%; max-_opxxaWJC: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_XFgntNHQ .modal-_XdcCXKqC { max-_opxxaWJC: 500px; }
.modal-_XdcCXKqC h3, ._CVXBHlen-modal-_YivsTWpg h3 { margin-_EFAdJLCL: 0; margin-bottom: 1.5rem; _ZByYaVjC: var(--primary-_ZByYaVjC); _oivNELJI-align: center; }
.modal-buttons { display: flex; justify-_XdcCXKqC: flex-end; gap: 1rem; margin-_EFAdJLCL: 2rem; border-_EFAdJLCL: 1px solid var(--border-_ZByYaVjC); padding-_EFAdJLCL: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_ZByYaVjC), rgba(0,0,0,0)); margin: 2rem 0; }
._CVXBHlen-modal-_YivsTWpg { display: flex; justify-_XdcCXKqC: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_ZByYaVjC); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _ZByYaVjC: var(--_oivNELJI-light); cursor: pointer; background: none; border: none; padding: 0; }
._CVXBHlen-list-_TvtziHCp { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_ZByYaVjC); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._CVXBHlen-_XhjeVTvM { font-size: 1.1em; font-weight: 600; }
._CVXBHlen-links a { display: block; _ZByYaVjC: var(--primary-_ZByYaVjC); _oivNELJI-decoration: none; margin-_EFAdJLCL: 0.5rem; word-break: break-all; }
._CVXBHlen-links a:hover { _oivNELJI-decoration: underline; }
._CVXBHlen-links span { _ZByYaVjC: var(--_oivNELJI-light); }
#visitorPasswordPrompt { _oivNELJI-align: center; }
#visitorPasswordPrompt h3 { _ZByYaVjC: var(--primary-_ZByYaVjC); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _ZByYaVjC: var(--_oivNELJI-light); margin-bottom: 1.5rem; }
._pmGHgKae-input-group { display: flex; gap: 10px; max-_opxxaWJC: 400px; margin: 0 auto; }
._pmGHgKae-input-group input { flex-grow: 1; _oivNELJI-align: center; }
._pmGHgKae-input-group .btn { margin-_NgyAzyuD: 0; }
._qfQmGQAV-actions-_byzvTaLq { _oivNELJI-align: center; margin-bottom: 1.5rem; }
._qfQmGQAV-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._qfQmGQAV-api-buttons .btn { margin: 0; _opxxaWJC: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_XdcCXKqC 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 _sgoEMyyM, .form-grid-control textarea { _opxxaWJC: 100%; background-_ZByYaVjC: var(--light-bg); border: 1px solid var(--border-_ZByYaVjC); border-radius: var(--border-radius-sm); _ZByYaVjC: var(--_oivNELJI-_ZByYaVjC); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_ZByYaVjC 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _sgoEMyyM:focus, .form-grid-control textarea:focus { border-_ZByYaVjC: var(--primary-_ZByYaVjC); box-shadow: 0 0 0 2px rgba(var(--primary-_ZByYaVjC-rgb), 0.2); outline: none; }
.form-grid-control input[_mCxoiXge="_ZByYaVjC"] { min-_opxxaWJC: auto; padding: 2px; _opxxaWJC: 2.5em; height: 2.5em; }
.form-grid-control input[_mCxoiXge="checkbox"] { _opxxaWJC: auto; flex-shrink: 0; height: 1.2em; _opxxaWJC: 1.2em; }
.form-grid-control ._RghwavkK-input { _opxxaWJC: 80px; _oivNELJI-align: right; }
.tooltip-_BRYUxzLb { display: inline-flex; _opxxaWJC: 16px; height: 16px; align-items: center; justify-_XdcCXKqC: center; background-_ZByYaVjC: var(--secondary-_ZByYaVjC); _ZByYaVjC: var(--_XdcCXKqC-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_sgoEMyyM: none; }
#tooltip-popup { position: fixed; background-_ZByYaVjC: #383c4a; _ZByYaVjC: #fff; padding: 10px 15px; border-radius: 6px; z-_rSrUKrJc: 10001; font-size: 0.85em; max-_opxxaWJC: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_ZByYaVjC); pointer-events: none; }
#custom-fields-_byzvTaLq .form-grid-control { gap: 5px; } #custom-fields-_byzvTaLq .form-grid-control input { flex: 1; }
.parameter-_qORUHIZA-_SCnnhoLd { border: 1px solid var(--border-_ZByYaVjC); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_qORUHIZA-_YivsTWpg { display: flex; justify-_XdcCXKqC: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_qORUHIZA-_YivsTWpg input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_EFAdJLCL: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._oivNELJI-_ZByYaVjC-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _opxxaWJC: 100%; }
._oivNELJI-_ZByYaVjC-grid input[_mCxoiXge="_ZByYaVjC"] { grid-column: 1 / 2; }
._oivNELJI-_ZByYaVjC-grid input[_mCxoiXge="_oivNELJI"], ._oivNELJI-_ZByYaVjC-grid textarea { grid-column: 2 / 3; }
#_XFgntNHQ .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_XFgntNHQ .btn-group { display: flex; }
#_XFgntNHQ .sub-btn { flex-grow: 1; margin: 0; }
#_XFgntNHQ ._TKxuAGIJ-btn { flex-shrink: 0; margin-_NgyAzyuD: -1px; border-_EFAdJLCL-_NgyAzyuD-radius: 0; border-bottom-_NgyAzyuD-radius: 0; }
#_XoJlRYwJ .modal-_XdcCXKqC { max-_opxxaWJC: 300px; background: white; padding: 1rem; _oivNELJI-align: center; }
#qrCodeImg { max-_opxxaWJC: 100%; }
@media (max-_opxxaWJC: 768px) {
html { font-size: 15px; } ._CVXBHlen-_byzvTaLq { padding: 0 0.8rem; } _YivsTWpg { margin-_EFAdJLCL: 2.5rem; margin-bottom: 1.5rem; } #_tQoKGZZF { _EFAdJLCL: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_opyqAExW>
<_opyqAExW _WMHQbbce="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_XdcCXKqC-bg: #FFFFFF; --border-_ZByYaVjC: #DCDFE6; --_oivNELJI-_ZByYaVjC: #303133; --_oivNELJI-light: #606266; }
.theme-light .card { background-_ZByYaVjC: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_ZByYaVjC: #F5F7FA; }
.theme-light tbody tr:hover { background-_ZByYaVjC: #ECF5FF; }
.theme-matrix { --primary-_ZByYaVjC: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_XdcCXKqC-bg: #0D0208; --border-_ZByYaVjC: #00FF41; --_oivNELJI-_ZByYaVjC: #00FF41; --_oivNELJI-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_ZByYaVjC: rgba(0, 20, 0, 0.7); _oivNELJI-shadow: 0 0 5px var(--primary-_ZByYaVjC); backdrop-filter: none; }
.theme-matrix th { background-_ZByYaVjC: #000; }
.theme-matrix tbody tr:hover { background-_ZByYaVjC: #010; }
.theme-matrix .btn { _oivNELJI-shadow: none; _ZByYaVjC: #000; }
.theme-matrix .btn-outline { background-_ZByYaVjC: transparent; }
.theme-modern-glass { --primary-_ZByYaVjC: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_XdcCXKqC-bg: rgba(30, 30, 40, 0.6); --border-_ZByYaVjC: rgba(255, 255, 255, 0.2); --_oivNELJI-_ZByYaVjC: #F0F0F0; --_oivNELJI-light: #A0A0B0; --border-radius-md: 12px; }
_jWmkrTWC.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-_ZByYaVjC: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_XdcCXKqC-bg: rgba(30, 30, 40, 0.6); --border-_ZByYaVjC: rgba(255, 255, 255, 0.2); --_oivNELJI-_ZByYaVjC: #F0F0F0; --_oivNELJI-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_ZByYaVjC: var(--_XdcCXKqC-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_ZByYaVjC); }
.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-_ZByYaVjC: rgba(0,0,0,0.3); border-right-_ZByYaVjC: 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); _oivNELJI-shadow: 0 1px 2px rgba(0,0,0,0.2); _ZByYaVjC: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_ZByYaVjC: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _oivNELJI-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_ZByYaVjC); border-_ZByYaVjC: var(--primary-_ZByYaVjC); _ZByYaVjC: #fff; }
.glassy-components _YivsTWpg h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _oivNELJI; -webkit-_oivNELJI-fill-_ZByYaVjC: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _ZByYaVjC: transparent; }
.theme-aurora-glass { --primary-_ZByYaVjC: #38bdf8; --light-bg: #0c0a09; --_XdcCXKqC-bg: rgba(23, 23, 23, 0.5); --border-_ZByYaVjC: rgba(255, 255, 255, 0.15); --_oivNELJI-_ZByYaVjC: #f2f2f2; --_oivNELJI-light: #a3a3a3; }
_jWmkrTWC.theme-aurora-glass::before { _XdcCXKqC: ''; position: fixed; _EFAdJLCL: 0; _NgyAzyuD: 0; _opxxaWJC: 100%; height: 100%; z-_rSrUKrJc: -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-_ZByYaVjC: #08fdd8; --light-bg: #010409; --_XdcCXKqC-bg: rgba(22, 27, 34, 0.6); --border-_ZByYaVjC: rgba(139, 148, 158, 0.3); --_oivNELJI-_ZByYaVjC: #e6edf3; --_oivNELJI-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_ZByYaVjC), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_ZByYaVjC-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_ZByYaVjC-rgb), 0.5); }
.theme-marble-light { --primary-_ZByYaVjC: #bfa37c; --light-bg: #f7f5f2; --_XdcCXKqC-bg: #ffffff; --border-_ZByYaVjC: #e0dcd5; --_oivNELJI-_ZByYaVjC: #3d3a36; --_oivNELJI-light: #6b6661; }
_jWmkrTWC.theme-marble-light { background-image: _vGtvnGlV('_YtKORMAW:image/svg+xml,%3Csvg _opxxaWJC="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-_ZByYaVjC: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_opyqAExW>
</head><_jWmkrTWC _WMHQbbce="pageBody">
<_ivYqUaRR _WMHQbbce="background-_ivYqUaRR"></_ivYqUaRR>
<div _WMHQbbce="_YiWxbyCm">
<div class="modal-_XdcCXKqC">
<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 _mCxoiXge="_pmGHgKae" _WMHQbbce="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _mCxoiXge="_pmGHgKae" _WMHQbbce="confirmPassword"></div></div>
<div class="modal-buttons"><button _WMHQbbce="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_CVXBHlen-_byzvTaLq">
<button _WMHQbbce="_tQoKGZZF" class="btn btn-outline"></button>
<div _WMHQbbce="marquee-_byzvTaLq"><div _WMHQbbce="marquee-_oivNELJI"></div></div>
<_YivsTWpg><h1 _WMHQbbce="pageTitle"></h1></_YivsTWpg>
<div class="card" _WMHQbbce="visitorPasswordPrompt" _opyqAExW="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_pmGHgKae-input-group">
<input _mCxoiXge="_pmGHgKae" _WMHQbbce="visitorPasswordEntry" _KENAeUYh="访客密码">
<button _WMHQbbce="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _WMHQbbce="_qpVPbkdT" _opyqAExW="display: block;">
<div class="card progress-section">
<div _WMHQbbce="progressDisplay">
<progress _WMHQbbce="_PojoGszn" _zEUwoOLx="0" max="100"></progress>
<div _WMHQbbce="status">正在初始化...</div>
</div>
</div>
<div class="card _CVXBHlen-download-section">
<div class="section-_YivsTWpg"><h2 _WMHQbbce="appDownloadTitleEl"></h2></div>
<div class="_CVXBHlen-download-buttons">
<button class="btn" _YtKORMAW-_mtccyHrb="android">安卓客户端</button>
<button class="btn" _YtKORMAW-_mtccyHrb="ios">苹果客户端</button>
<button class="btn" _YtKORMAW-_mtccyHrb="windows">Windows客户端</button>
<button class="btn" _YtKORMAW-_mtccyHrb="mac">Mac客户端</button>
</div>
</div>
<div class="card _qfQmGQAV-section" _WMHQbbce="_CYGOocpM" _opyqAExW="display:none;">
<div class="section-_YivsTWpg">
<h2 _WMHQbbce="liveTitleEl"></h2>
<div class="generator-info" _WMHQbbce="liveGeneratorInfo"></div>
</div>
<div _WMHQbbce="_CzSJmnGr" class="_qfQmGQAV-actions-_byzvTaLq" _opyqAExW="display: none;">
<div class="_qfQmGQAV-api-buttons">
<button _WMHQbbce="copyIpApiBtn" class="btn">复制 IP API</button>
<button _WMHQbbce="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _WMHQbbce="resultsTable">
<thead><tr><th _WMHQbbce="tableHeader1El"></th><th _WMHQbbce="tableHeader2El"></th><th _WMHQbbce="tableHeader3El"></th><th _WMHQbbce="tableHeader4El"></th><th _WMHQbbce="tableHeader5El"></th><th _WMHQbbce="tableHeader6El"></th><th _WMHQbbce="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _WMHQbbce="_qOFOKaLE" _opyqAExW="display:none;">
<div class="section-_YivsTWpg"><h2 _WMHQbbce="cachedTitleEl"></h2><div class="generator-info" _WMHQbbce="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _WMHQbbce="cachedResultsTable">
<thead><tr><th _WMHQbbce="cachedTableHeader1El"></th><th _WMHQbbce="cachedTableHeader2El"></th><th _WMHQbbce="cachedTableHeader3El"></th><th _WMHQbbce="cachedTableHeader4El"></th><th _WMHQbbce="cachedTableHeader5El"></th><th _WMHQbbce="cachedTableHeader6El"></th><th _WMHQbbce="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _WMHQbbce="notificationTooltip" class="tooltip-notification"></div>
<div _WMHQbbce="_MyXbSEXb">
<div class="modal-_XdcCXKqC">
<h3>修改参数</h3>
<div _opyqAExW="display: flex; border-bottom: 1px solid var(--border-_ZByYaVjC); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_bBnzEiHf(event, 'general-_FKrjSuSd')">通用设置</button>
<button class="tab-button" onclick="_bBnzEiHf(event, '_LvbhDBDQ-_FKrjSuSd')">链接设置</button>
<button class="tab-button" onclick="_bBnzEiHf(event, 'fine-grained-_FKrjSuSd')">IP源设置</button>
<button class="tab-button" onclick="_bBnzEiHf(event, 'advanced-_FKrjSuSd')">高级设置</button>
</div>
<div _WMHQbbce="general-_FKrjSuSd" class="tab-_XdcCXKqC" _opyqAExW="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_sgoEMyyM _WMHQbbce="themeSelect">
<_mfsIUkxD _zEUwoOLx="theme-aurora-glass">极光-玻璃质感</_mfsIUkxD>
<_mfsIUkxD _zEUwoOLx="theme-particles-glass">粒子-玻璃质感</_mfsIUkxD>
<_mfsIUkxD _zEUwoOLx="theme-modern-glass">现代-玻璃质感</_mfsIUkxD>
<_mfsIUkxD _zEUwoOLx="theme-cyberpunk-glass">赛博朋克-玻璃质感</_mfsIUkxD>
<_mfsIUkxD _zEUwoOLx="theme-dark-particles">暗色-粒子背景</_mfsIUkxD>
<_mfsIUkxD _zEUwoOLx="theme-dark-bing">暗色-必应壁纸</_mfsIUkxD>
<_mfsIUkxD _zEUwoOLx="theme-light">亮色-简约</_mfsIUkxD>
<_mfsIUkxD _zEUwoOLx="theme-light-bing">亮色-必应壁纸</_mfsIUkxD>
<_mfsIUkxD _zEUwoOLx="theme-marble-light">简约大理石-亮色</_mfsIUkxD>
<_mfsIUkxD _zEUwoOLx="theme-matrix">矩阵-代码雨</_mfsIUkxD>
</_sgoEMyyM>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _mCxoiXge="_ZByYaVjC" _WMHQbbce="primaryColorInput">
<span _opyqAExW="_opxxaWJC: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _mCxoiXge="_ZByYaVjC" _WMHQbbce="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _opyqAExW="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _opyqAExW="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_oivNELJI-_ZByYaVjC-grid"><input _mCxoiXge="_ZByYaVjC" _WMHQbbce="colorInput_title"><textarea _WMHQbbce="textInput_title" _UyAcFXIp="1" _KENAeUYh="页面主标题"></textarea></div>
<div class="_oivNELJI-_ZByYaVjC-grid"><input _mCxoiXge="_ZByYaVjC" _WMHQbbce="colorInput_loginButton"><input _mCxoiXge="_oivNELJI" _WMHQbbce="textInput_loginButton" _KENAeUYh="登录按钮文本"></div>
<div class="_oivNELJI-_ZByYaVjC-grid"><input _mCxoiXge="_ZByYaVjC" _WMHQbbce="colorInput_appDownloadTitle"><input _mCxoiXge="_oivNELJI" _WMHQbbce="textInput_appDownloadTitle" _KENAeUYh="APP下载标题"></div>
<div class="_oivNELJI-_ZByYaVjC-grid"><input _mCxoiXge="_ZByYaVjC" _WMHQbbce="colorInput_liveTitle"><input _mCxoiXge="_oivNELJI" _WMHQbbce="textInput_liveTitle" _KENAeUYh="本次结果标题"></div>
<div class="_oivNELJI-_ZByYaVjC-grid"><input _mCxoiXge="_ZByYaVjC" _WMHQbbce="colorInput_cachedTitle"><input _mCxoiXge="_oivNELJI" _WMHQbbce="textInput_cachedTitle" _KENAeUYh="上次结果标题"></div>
<div class="_oivNELJI-_ZByYaVjC-grid"><input _mCxoiXge="_ZByYaVjC" _WMHQbbce="colorInput_tableHeader"><input _mCxoiXge="_oivNELJI" _zEUwoOLx="表格头部文本颜色" readonly _opyqAExW="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _opyqAExW="align-self: start;"><label>公告栏设置</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _opyqAExW="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _WMHQbbce="announcementText" _KENAeUYh="在此输入公告内容" _UyAcFXIp="3"></textarea>
<div _opyqAExW="display: flex; justify-_XdcCXKqC: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _opyqAExW="display: flex; align-items: center; gap: 5px;"><input _mCxoiXge="checkbox" _WMHQbbce="enableMarquee"> 顶部走马灯</label>
<label _opyqAExW="display: flex; align-items: center; gap: 5px;"><input _mCxoiXge="checkbox" _WMHQbbce="enablePopup"> 右上角弹窗</label>
<div _WMHQbbce="popupDurationContainer" _opyqAExW="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _mCxoiXge="number" _WMHQbbce="popupDuration" _opyqAExW="_opxxaWJC: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _WMHQbbce="_LvbhDBDQ-_FKrjSuSd" class="tab-_XdcCXKqC">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _mCxoiXge="_oivNELJI" _WMHQbbce="converterServiceUrlInput" _KENAeUYh="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _mCxoiXge="number" _WMHQbbce="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _opyqAExW="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _WMHQbbce="subscriptionIdCharset" _UyAcFXIp="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-_BRYUxzLb" _YtKORMAW-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _opyqAExW="justify-_XdcCXKqC: flex-start;"><input _mCxoiXge="checkbox" _WMHQbbce="enableItemLinkCheckbox"></div>
</div>
<div _WMHQbbce="itemLinkConfigGroup" _opyqAExW="display:none; margin-_EFAdJLCL: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _opyqAExW="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="定义分享链接格式。可用占位符: {_whSCQXik}, {_ZObIIUps}, {_XhjeVTvM}, {rank}, {_ipvEvNap}, {_djGKrAQe}, {_yUpbIijN}, {_SOExyrkk}, {_UmImaGSA}。">?</span></div>
<div class="form-grid-control"><textarea _WMHQbbce="itemLinkTemplateInput" _UyAcFXIp="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_sgoEMyyM _WMHQbbce="parameterSelectionMode"></_sgoEMyyM></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _WMHQbbce="parameter-sets-_byzvTaLq"></div><button _mCxoiXge="button" _WMHQbbce="add-parameter-_qORUHIZA-btn" class="btn btn-outline" _opyqAExW="margin-_EFAdJLCL: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _opyqAExW="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _WMHQbbce="custom-fields-_byzvTaLq" _opyqAExW="_opxxaWJC: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _opyqAExW="justify-_XdcCXKqC: flex-start;"><button _mCxoiXge="button" _WMHQbbce="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _WMHQbbce="fine-grained-_FKrjSuSd" class="tab-_XdcCXKqC">
<div class="form-grid-label" _opyqAExW="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _opyqAExW="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_XdcCXKqC: flex-start;">
<label><input _mCxoiXge="checkbox" _WMHQbbce="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _mCxoiXge="checkbox" _WMHQbbce="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _WMHQbbce="fine-grained-sources-_byzvTaLq"></div><button _mCxoiXge="button" _WMHQbbce="add-fine-grained-_pmriNyic-btn" class="btn btn-outline" _opyqAExW="margin-_EFAdJLCL: 10px;">添加地区</button></div>
</div>
<div _WMHQbbce="advanced-_FKrjSuSd" class="tab-_XdcCXKqC">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _mCxoiXge="checkbox" _WMHQbbce="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _WMHQbbce="resolvedDomainsGroup" _opyqAExW="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _WMHQbbce="resolvedDomainsInput" _KENAeUYh="留空则使用内置默认域名" _UyAcFXIp="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-_BRYUxzLb" _YtKORMAW-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _mCxoiXge="checkbox" _WMHQbbce="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _WMHQbbce="customNodesGroup" _opyqAExW="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _WMHQbbce="customNodesInput" _KENAeUYh="一行一个地址,支持域名、IPv4、IPv6。" _UyAcFXIp="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-_BRYUxzLb" _YtKORMAW-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _mCxoiXge="number" _WMHQbbce="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _mCxoiXge="number" _WMHQbbce="topNInput"></div>
<div class="form-grid-label" _opyqAExW="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _opyqAExW="display: none;"><input _mCxoiXge="number" _WMHQbbce="latencyRangeMinInput" _KENAeUYh="最小"><span>-</span><input _mCxoiXge="number" _WMHQbbce="latencyRangeMaxInput" _KENAeUYh="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _opyqAExW="justify-_XdcCXKqC: flex-start;"><input _mCxoiXge="checkbox" _WMHQbbce="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-_BRYUxzLb" _YtKORMAW-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _mCxoiXge="number" _WMHQbbce="geoLocationRetriesInput" _opyqAExW="_opxxaWJC: 80px;"> <span>次</span>
<div _opyqAExW="display: flex; align-items: center; gap: 5px; margin-_NgyAzyuD: 20px;">
<input _mCxoiXge="checkbox" _WMHQbbce="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-_BRYUxzLb" _YtKORMAW-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_yUpbIijN:_ZObIIUps' 或 '_yUpbIijN'。">?</span></div>
<div class="form-grid-control"><input _mCxoiXge="_oivNELJI" _WMHQbbce="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-_BRYUxzLb" _YtKORMAW-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _opyqAExW="justify-_XdcCXKqC: flex-start;"><input _mCxoiXge="checkbox" _WMHQbbce="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _WMHQbbce="websocketStreamerGroup" _opyqAExW="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _mCxoiXge="_oivNELJI" _WMHQbbce="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-_BRYUxzLb" _YtKORMAW-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _opyqAExW="justify-_XdcCXKqC: flex-start;"><input _mCxoiXge="checkbox" _WMHQbbce="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="启用 /_whSCQXik 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _opyqAExW="justify-_XdcCXKqC: flex-start;"><input _mCxoiXge="checkbox" _WMHQbbce="enableApiCheckbox"></div>
<div class="form-grid-control-full" _WMHQbbce="apiConfigGroup" _opyqAExW="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _mCxoiXge="_oivNELJI" _WMHQbbce="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-_BRYUxzLb" _YtKORMAW-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _opyqAExW="justify-_XdcCXKqC: flex-start;"><input _mCxoiXge="checkbox" _WMHQbbce="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _WMHQbbce="customSubPathGroup" _opyqAExW="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _mCxoiXge="_oivNELJI" _WMHQbbce="customSubPathInput" _KENAeUYh="例如: 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-_BRYUxzLb" _YtKORMAW-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _opyqAExW="justify-_XdcCXKqC: flex-start;"><input _mCxoiXge="checkbox" _WMHQbbce="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _WMHQbbce="visitorPasswordGroup" _opyqAExW="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _mCxoiXge="_oivNELJI" _WMHQbbce="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _opyqAExW="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_BRYUxzLb" _YtKORMAW-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _opyqAExW="flex-direction: column; align-items: stretch; gap: 8px;"><input _mCxoiXge="_oivNELJI" _WMHQbbce="botTokenInput" _KENAeUYh="Telegram Bot Token"><input _mCxoiXge="_oivNELJI" _WMHQbbce="chatIdInput" _KENAeUYh="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _opyqAExW="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _opyqAExW="flex-direction: column; align-items: stretch; gap: 8px;"><input _mCxoiXge="_pmGHgKae" _WMHQbbce="oldPasswordInput" _KENAeUYh="旧密码"><input _mCxoiXge="_pmGHgKae" _WMHQbbce="newPasswordInput" _KENAeUYh="新密码 (至少6位)"><button _WMHQbbce="changePasswordBtn" class="btn" _opyqAExW="align-self: flex-start; margin-_NgyAzyuD: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _WMHQbbce="closeModalBtn" class="btn btn-outline">关闭</button><button _WMHQbbce="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _WMHQbbce="_sVOtZryN">
<div class="_CVXBHlen-modal-_XdcCXKqC">
<div class="_CVXBHlen-modal-_YivsTWpg"><h3 _WMHQbbce="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_CVXBHlen-modal-_jWmkrTWC" _WMHQbbce="appModalBody"></div>
</div>
</div>
<div _WMHQbbce="_XFgntNHQ">
<div class="modal-_XdcCXKqC">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _YtKORMAW-sub-_mCxoiXge="coreEngine">Xray</button><button class="btn _TKxuAGIJ-btn" _YtKORMAW-sub-_mCxoiXge="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _YtKORMAW-sub-_mCxoiXge="coreProfile">Sing-Box</button><button class="btn _TKxuAGIJ-btn" _YtKORMAW-sub-_mCxoiXge="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _YtKORMAW-sub-_mCxoiXge="configProfile">Clash</button><button class="btn _TKxuAGIJ-btn" _YtKORMAW-sub-_mCxoiXge="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _YtKORMAW-sub-_mCxoiXge="policyProfile">Surge</button><button class="btn _TKxuAGIJ-btn" _YtKORMAW-sub-_mCxoiXge="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _opyqAExW="justify-_XdcCXKqC: center;"><button class="btn btn-outline" _WMHQbbce="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _WMHQbbce="_XoJlRYwJ">
<div class="modal-_XdcCXKqC">
<img _WMHQbbce="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _iGVIAASX = {
isValid: (_whSCQXik) => _iGVIAASX.isIPv4(_whSCQXik) || _iGVIAASX.isIPv6(_whSCQXik),
isIPv4: (_whSCQXik) => {
if (typeof _whSCQXik !== 'string') return false;
const _onorrDOQ = _whSCQXik.split('.');
if (_onorrDOQ._IIkxJcSQ !== 4) return false;
return _onorrDOQ.every(_LgGTGIpa => {
const _BnZWpSHx = parseInt(_LgGTGIpa, 10);
return !isNaN(_BnZWpSHx) && _BnZWpSHx >= 0 && _BnZWpSHx <= 255 && String(_BnZWpSHx) === _LgGTGIpa;
});
},
isIPv6: (_whSCQXik) => {
if (typeof _whSCQXik !== '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]))$/_aYUntfEd.test(_whSCQXik);
},
toLong4: (_whSCQXik) => _whSCQXik.split('.').reduce((acc, octet, _aYUntfEd) => acc + (parseInt(octet) << (8*(3-_aYUntfEd))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_whSCQXik) => {
try {
const _CKAiCZju = _whSCQXik.split('/')[0];
const _onorrDOQ = _CKAiCZju.split('::');
if (_onorrDOQ._IIkxJcSQ > 2) return 0n;
let _lWzstIWp = [];
if (_onorrDOQ[0]) {
_lWzstIWp = _onorrDOQ[0].split(':');
}
let _eTFHmuyM = [];
if (_onorrDOQ._IIkxJcSQ > 1 && _onorrDOQ[1]) {
_eTFHmuyM = _onorrDOQ[1].split(':');
}
if (_lWzstIWp._IIkxJcSQ + _eTFHmuyM._IIkxJcSQ > 8) return 0n;
const _kOyYZZHH = 8 - (_lWzstIWp._IIkxJcSQ + _eTFHmuyM._IIkxJcSQ);
const _zYnGbvYu = [
..._lWzstIWp,
...Array(_kOyYZZHH).fill('0'),
..._eTFHmuyM
].map(_LgGTGIpa => _LgGTGIpa || '0');
while(_zYnGbvYu._IIkxJcSQ < 8) {
_zYnGbvYu.push('0');
}
let _RcxZbLht = 0n;
for (const _LgGTGIpa of _zYnGbvYu) {
if (_LgGTGIpa._IIkxJcSQ > 4) return 0n;
const _zEUwoOLx = BigInt('0x' + _LgGTGIpa);
_RcxZbLht = (_RcxZbLht << 16n) | _zEUwoOLx;
}
return _RcxZbLht;
} catch(_TypLzJyb) {
return 0n;
}
},
fromBigInt6: (_RcxZbLht) => {
if (typeof _RcxZbLht !== '_RcxZbLht' || _RcxZbLht < 0n) return null;
const _onorrDOQ = [];
for (let _aYUntfEd = 0; _aYUntfEd < 8; _aYUntfEd++) {
_onorrDOQ.unshift((_RcxZbLht & 0xFFFFn).toString(16));
_RcxZbLht >>= 16n;
}
let _mBSljxLj = { start: -1, _pLsyfBad: 0 };
let _iVhOldQc = { start: -1, _pLsyfBad: 0 };
for (let _aYUntfEd = 0; _aYUntfEd < 8; _aYUntfEd++) {
if (_onorrDOQ[_aYUntfEd] === '0') {
if (_iVhOldQc.start === -1) _iVhOldQc.start = _aYUntfEd;
_iVhOldQc._pLsyfBad++;
} else {
if (_iVhOldQc._pLsyfBad > _mBSljxLj._pLsyfBad) _mBSljxLj = { ..._iVhOldQc };
_iVhOldQc = { start: -1, _pLsyfBad: 0 };
}
}
if (_iVhOldQc._pLsyfBad > _mBSljxLj._pLsyfBad) _mBSljxLj = { ..._iVhOldQc };
if (_mBSljxLj._pLsyfBad > 1) {
_onorrDOQ.splice(_mBSljxLj.start, _mBSljxLj._pLsyfBad, '');
if (_mBSljxLj.start === 0) _onorrDOQ.unshift('');
if (_mBSljxLj.start + _mBSljxLj._pLsyfBad === 8) _onorrDOQ.push('');
}
return _onorrDOQ.join(':');
},
cidrToRange: (cidr, _CtGXOnKQ = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _PArfsHWb = parseInt(bitsStr, 10);
const _YaMcNmHt = new Set();
if (_iGVIAASX.isIPv4(range)) {
if (isNaN(_PArfsHWb) || _PArfsHWb < 8 || _PArfsHWb > 32) return [];
if (_PArfsHWb === 32) return [range];
const _thLCIfqc = _iGVIAASX.toLong4(range);
const _vLYAOfOT = (0xFFFFFFFF << (32 - _PArfsHWb)) >>> 0;
const _uCkAXQAW = _thLCIfqc & _vLYAOfOT;
const _eGHmeHQL = 1 << (32 - _PArfsHWb);
if (_eGHmeHQL <= 2) return [];
const _nYOafzHY = Math.min(_CtGXOnKQ, _eGHmeHQL - 2);
let _QMrsnLHJ = 0;
while (_YaMcNmHt.size < _nYOafzHY && _QMrsnLHJ < _nYOafzHY * 5) {
const _zjqXJPfL = Math.floor(Math.random() * (_eGHmeHQL - 2)) + 1;
_YaMcNmHt.add(_iGVIAASX.fromLong4((_uCkAXQAW + _zjqXJPfL) >>> 0));
_QMrsnLHJ++;
}
return Array.from(_YaMcNmHt);
} else if (_iGVIAASX.isIPv6(range)) {
if (isNaN(_PArfsHWb) || _PArfsHWb < 16 || _PArfsHWb > 128) return [];
if (_PArfsHWb === 128) return [range];
const _WkacATdD = _iGVIAASX.toBigInt6(range);
const _vLYAOfOT = (2n ** BigInt(128 - _PArfsHWb) - 1n);
const _uCkAXQAW = _WkacATdD & ~_vLYAOfOT;
const _VztJnSQx = 2n ** BigInt(128 - _PArfsHWb);
if (_VztJnSQx <= 2n) return [];
let _QMrsnLHJ = 0;
while (_YaMcNmHt.size < _CtGXOnKQ && _QMrsnLHJ < _CtGXOnKQ * 5) {
const _YTTFByjs = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_YTTFByjs);
let _keqmaanz = 0n;
for (const _mwXGoCWa of _YTTFByjs) {
_keqmaanz = (_keqmaanz << 8n) | BigInt(_mwXGoCWa);
}
const _zjqXJPfL = _keqmaanz % (_VztJnSQx - 2n) + 1n;
_YaMcNmHt.add(_iGVIAASX.fromBigInt6(_uCkAXQAW + _zjqXJPfL));
_QMrsnLHJ++;
}
return Array.from(_YaMcNmHt);
}
return [];
} catch(_TypLzJyb) {
console.error(`CIDR to range failed for ${cidr}:`, _TypLzJyb);
return [];
}
}
};
function _NGdjZSPO(_oWDOdwLO, _eIBcaHfh) {
const _xUKDihVa = {};
const _qgdJSRDh = Object._qgdJSRDh(_eIBcaHfh);
const _onorrDOQ = _qgdJSRDh.map(_fcHRWHAI => {
const _rZRGpHVd = _oWDOdwLO * (_eIBcaHfh[_fcHRWHAI] / 100);
return { _fcHRWHAI, _CtGXOnKQ: Math.floor(_rZRGpHVd), remainder: _rZRGpHVd - Math.floor(_rZRGpHVd) };
});
let _fPeaghXs = _onorrDOQ.reduce((acc, _LgGTGIpa) => acc + _LgGTGIpa._CtGXOnKQ, 0);
_onorrDOQ.sort((a, b) => b.remainder - a.remainder);
let _halfzaeg = _oWDOdwLO - _fPeaghXs;
for (let _aYUntfEd = 0; _aYUntfEd < _halfzaeg; _aYUntfEd++) {
_onorrDOQ[_aYUntfEd % _onorrDOQ._IIkxJcSQ]._CtGXOnKQ++;
}
for (const _LgGTGIpa of _onorrDOQ) {
_xUKDihVa[_LgGTGIpa._fcHRWHAI] = _LgGTGIpa._CtGXOnKQ;
}
return _xUKDihVa;
}
const _boVuXOHD = __PAGE_DATA_JSON__;
const _chpTzINx = _boVuXOHD._fQFNrZVl;
const _REulMQnV = _boVuXOHD.status;
const _tQbnVJSD = __ALL_CF_CIDR_LIST_JSON__;
const _WbkRzjnf = __BALANCED_CF_CIDR_LIST_JSON__;
const _erxdzbuU = __DEFAULT_DOMAINS_LIST_JSON__;
const _eVRIAVlh = __COUNTRY_MAP_JSON__;
const _uOyUQtiw = _eVRIAVlh;
const _JLmkeFUq = 2500;
const _DeDByjOq = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _qpVPbkdT = document.getElementById('_qpVPbkdT');
const _PojoGszn = document.getElementById('_PojoGszn');
const _ssSSmlif = document.getElementById('status');
const _CYGOocpM = document.getElementById('_CYGOocpM');
const _ySLtYDTX = document.getElementById('resultsTable').querySelector('tbody');
const _qOFOKaLE = document.getElementById('_qOFOKaLE');
const _JaqEWGzz = document.getElementById('cachedResultsTable').querySelector('tbody');
const _dNOcaaUE = document.getElementById('notificationTooltip');
const _tQoKGZZF = document.getElementById('_tQoKGZZF');
const _MyXbSEXb = document.getElementById('_MyXbSEXb');
const _sVOtZryN = document.getElementById('_sVOtZryN');
const _XFgntNHQ = document.getElementById('_XFgntNHQ');
const _XoJlRYwJ = document.getElementById('_XoJlRYwJ');
const _YiWxbyCm = document.getElementById('_YiWxbyCm');
const _CzSJmnGr = document.getElementById('_CzSJmnGr');
let _ApImXVxu = null;
let _IfTrwYjR = null;
let _xieKWdGl = [];
let _UMaNRJIp = false;
let _BeMMWJuy = null;
function _OmieUHMF(_WPFcNvQI, _IcXzBgWc) {
const _dCLZVYyJ=parseInt(_WPFcNvQI.slice(1),16),t=_IcXzBgWc<0?0:255,p=_IcXzBgWc<0?_IcXzBgWc*-1:_IcXzBgWc,R=_dCLZVYyJ>>16,G=_dCLZVYyJ>>8&0x00FF,B=_dCLZVYyJ&0x0000FF;
const _RiBjfhZQ = Math.round((t-R)*p)+R;
const _TVoMoxrx = Math.round((t-G)*p)+G;
const _RlfcuRKw = Math.round((t-B)*p)+B;
return `rgb(${_RiBjfhZQ.toString()}, ${_TVoMoxrx.toString()}, ${_RlfcuRKw.toString()})`;
}
function _EoQXmTEY(_FKrjSuSd) {
const _kFHJVIuY = _YDKVjJJN(_FKrjSuSd.primaryColor);
if(_kFHJVIuY) {
document.documentElement._opyqAExW.setProperty('--primary-_ZByYaVjC-rgb', `${_kFHJVIuY.r},${_kFHJVIuY.g},${_kFHJVIuY.b}`);
}
document.documentElement._opyqAExW.setProperty('--primary-_ZByYaVjC', _FKrjSuSd.primaryColor);
document.documentElement._opyqAExW.setProperty('--primary-hover', _OmieUHMF(_FKrjSuSd.primaryColor, -0.1));
document.documentElement._opyqAExW.setProperty('--primary-gradient-start', _OmieUHMF(_FKrjSuSd.primaryColor, 0.1));
document.documentElement._opyqAExW.setProperty('--primary-gradient-end', _OmieUHMF(_FKrjSuSd.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _FKrjSuSd.texts.title;
document.title = _FKrjSuSd.texts.title;
_tQoKGZZF.innerText = _ApImXVxu ? _FKrjSuSd.texts.loginButtonSuccess : _FKrjSuSd.texts.loginButton;
_tQoKGZZF._opyqAExW._ZByYaVjC = _FKrjSuSd.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _FKrjSuSd.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _FKrjSuSd.texts.liveTitle;
document.getElementById('liveTitleEl')._opyqAExW._ZByYaVjC = _FKrjSuSd.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _FKrjSuSd.texts.cachedTitle;
document.getElementById('cachedTitleEl')._opyqAExW._ZByYaVjC = _FKrjSuSd.colors.cachedTitle;
const _ZSCbaYzy = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_ZSCbaYzy.forEach((_WMHQbbce, _rSrUKrJc) => {
const _zgvsiCEW = document.getElementById(_WMHQbbce);
if (_zgvsiCEW) _zgvsiCEW.innerText = _FKrjSuSd.texts[`tableHeader${_rSrUKrJc + 1}`] || '';
});
const _sdbOySkq = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_sdbOySkq.forEach((_WMHQbbce, _rSrUKrJc) => {
const _zgvsiCEW = document.getElementById(_WMHQbbce);
if (_zgvsiCEW) _zgvsiCEW.innerText = _chpTzINx.texts[`tableHeader${_rSrUKrJc + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._opyqAExW._ZByYaVjC = _FKrjSuSd.colors.tableHeader);
document._jWmkrTWC.className = '';
document._jWmkrTWC.classList.add(_FKrjSuSd.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_FKrjSuSd.theme)) {
document._jWmkrTWC.classList.add('glassy-components');
}
document._jWmkrTWC._opyqAExW.backgroundImage = '';
_cdAHPuxH();
if (_FKrjSuSd.theme.includes('particles') || _FKrjSuSd.theme.includes('glass')) {
_JfLGpnvR(_FKrjSuSd.particleColor);
} else if (_FKrjSuSd.theme.includes('bing')) {
document._jWmkrTWC._opyqAExW.backgroundImage = '_vGtvnGlV(/bing-wallpaper)';
}
}
function _YZvNgaKq() {
_ApImXVxu = null;
if(_IfTrwYjR) clearTimeout(_IfTrwYjR);
_EoQXmTEY(_chpTzINx);
_uzYJoZfK("登录已超时,请重新登录。", "warning");
}
async function _cLMRJCwc() {
if (_ApImXVxu) {
_TfzZmxBe();
return;
}
const _QHxanRoY = prompt('请输入管理员密码:');
if (!_QHxanRoY) return;
try {
const _oSLywggo = await fetch('/api/verify-_pmGHgKae', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify({ _pmGHgKae: _QHxanRoY })
});
const _RisxZExA = await _oSLywggo.json();
if (_RisxZExA.success) {
_ApImXVxu = _QHxanRoY;
_uzYJoZfK("登录成功!有效期5分钟。", "success");
if (_IfTrwYjR) clearTimeout(_IfTrwYjR);
_IfTrwYjR = setTimeout(_YZvNgaKq, 5 * 60 * 1000);
_EoQXmTEY(_chpTzINx);
_TfzZmxBe();
} else {
throw new Error(_RisxZExA._MBvXPQjK || '密码验证失败');
}
} catch (_TypLzJyb) {
_uzYJoZfK(`登录失败: ${_TypLzJyb._MBvXPQjK}`, "error");
}
}
function _HaISvMWw() {
if (!_REulMQnV._uIOgcLyR) {
_YiWxbyCm._opyqAExW.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _pmGHgKae = document.getElementById('initialPassword')._zEUwoOLx;
const _zqZQCNwA = document.getElementById('confirmPassword')._zEUwoOLx;
if (_pmGHgKae !== _zqZQCNwA) {
_uzYJoZfK("两次输入的密码不一致!", "error");
return;
}
if (_pmGHgKae._IIkxJcSQ < 6) {
_uzYJoZfK("密码长度不能少于6位!", "error");
return;
}
try {
const _oSLywggo = await fetch('/api/_qORUHIZA-_pmGHgKae', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify({ _pmGHgKae })
});
const _RisxZExA = await _oSLywggo.json();
if (_RisxZExA.success) {
_uzYJoZfK(_RisxZExA._MBvXPQjK, "success");
setTimeout(() => _ipvEvNap.reload(), 1500);
} else {
throw new Error(_RisxZExA._MBvXPQjK);
}
} catch(_TypLzJyb) {
_uzYJoZfK(`设置密码失败: ${_TypLzJyb._MBvXPQjK}`, "error");
}
});
return;
}
_tQoKGZZF.addEventListener('click', _cLMRJCwc);
document.getElementById('closeModalBtn').addEventListener('click', () => { _MyXbSEXb._opyqAExW.display = 'none'; });
_MyXbSEXb.addEventListener('click', (_TypLzJyb) => { if (_TypLzJyb.target === _MyXbSEXb) _MyXbSEXb._opyqAExW.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_byzvTaLq .fine-grained-_eeCieDoE-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-_byzvTaLq .fine-grained-_eeCieDoE-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_ApImXVxu) {
_uzYJoZfK("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _phZoMDbo = [];
document.querySelectorAll('#custom-fields-_byzvTaLq .custom-field-_SCnnhoLd').forEach(_SCnnhoLd => {
const _XhjeVTvM = _SCnnhoLd.querySelector('.custom-field-_XhjeVTvM')._zEUwoOLx.trim();
const _zEUwoOLx = _SCnnhoLd.querySelector('.custom-field-_zEUwoOLx')._zEUwoOLx.trim();
if (_XhjeVTvM) _phZoMDbo.push({ _XhjeVTvM, _zEUwoOLx });
});
const _zEklqmsL = [];
document.querySelectorAll('#parameter-sets-_byzvTaLq .parameter-_qORUHIZA-_SCnnhoLd').forEach(_SCnnhoLd => {
const _XhjeVTvM = _SCnnhoLd.querySelector('.param-_qORUHIZA-_XhjeVTvM')._zEUwoOLx.trim();
const _yUpbIijN = _SCnnhoLd.querySelector('.param-_qORUHIZA-_yUpbIijN')._zEUwoOLx.trim();
const _SOExyrkk = _SCnnhoLd.querySelector('.param-_qORUHIZA-_SOExyrkk')._zEUwoOLx.trim();
const _UmImaGSA = _SCnnhoLd.querySelector('.param-_qORUHIZA-_UmImaGSA')._zEUwoOLx.trim();
if(_XhjeVTvM) _zEklqmsL.push({ _XhjeVTvM, _yUpbIijN, '_SOExyrkk': _SOExyrkk, _UmImaGSA });
});
const _ZEXJPcWe = [];
document.querySelectorAll('#fine-grained-sources-_byzvTaLq .fine-grained-_pmriNyic-_SCnnhoLd').forEach(_SCnnhoLd => {
const _ipvEvNap = _SCnnhoLd.querySelector('.fine-grained-_ipvEvNap')._zEUwoOLx.trim();
const _YaMcNmHt = _SCnnhoLd.querySelector('.fine-grained-_YaMcNmHt')._zEUwoOLx.trim();
const _eeCieDoE = _SCnnhoLd.querySelector('.fine-grained-_eeCieDoE-cb').checked;
const _RghwavkK = parseInt(_SCnnhoLd.querySelector('.fine-grained-_RghwavkK')._zEUwoOLx, 10) || 0;
const _wkvJtQUx = _SCnnhoLd.querySelector('.use-_XhjeVTvM-as-_ipvEvNap-cb').checked;
if (_ipvEvNap && _YaMcNmHt) {
_ZEXJPcWe.push({ _ipvEvNap, _YaMcNmHt, _eeCieDoE, _RghwavkK, _wkvJtQUx });
}
});
let _bFtjfmoM = parseInt(document.getElementById('subscriptionIdLength')._zEUwoOLx, 10);
if (isNaN(_bFtjfmoM) || _bFtjfmoM < 2) _bFtjfmoM = 2;
if (_bFtjfmoM > 128) _bFtjfmoM = 128;
const _rzGvQHMm = {
theme: document.getElementById('themeSelect')._zEUwoOLx,
primaryColor: document.getElementById('primaryColorInput')._zEUwoOLx,
particleColor: document.getElementById('particleColorInput')._zEUwoOLx,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._zEUwoOLx,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._zEUwoOLx, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._zEUwoOLx, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._zEUwoOLx, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._zEUwoOLx, 10) || 0,
_bRlKRqTQ: document.getElementById('converterServiceUrlInput')._zEUwoOLx.trim(),
subscriptionId: {
_IIkxJcSQ: _bFtjfmoM,
_xbSMAFzA: document.getElementById('subscriptionIdCharset')._zEUwoOLx.trim()
},
api: {
_eeCieDoE: document.getElementById('enableApiCheckbox').checked,
_MBvXPQjK: document.getElementById('apiMessageInput')._zEUwoOLx || '维护中...',
},
ispFilter: {
_eeCieDoE: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._zEUwoOLx, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_eeCieDoE: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_eeCieDoE: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_vGtvnGlV: document.getElementById('websocketStreamerUrlInput')._zEUwoOLx.trim()
},
visitorPassword: {
_eeCieDoE: document.getElementById('enableVisitorPasswordCheckbox').checked,
_pmGHgKae: document.getElementById('visitorPasswordInput')._zEUwoOLx.trim()
},
customSubPath: {
_eeCieDoE: document.getElementById('enableCustomSubPathCheckbox').checked,
_UmImaGSA: document.getElementById('customSubPathInput')._zEUwoOLx.trim()
},
itemLink: {
_eeCieDoE: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._zEUwoOLx,
selectionMode: document.getElementById('parameterSelectionMode')._zEUwoOLx,
_zEklqmsL: _zEklqmsL,
_phZoMDbo: _phZoMDbo,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._zEUwoOLx.trim(),
},
announcement: {
popup: {
_eeCieDoE: document.getElementById('enablePopup').checked,
_oivNELJI: document.getElementById('announcementText')._zEUwoOLx,
_FHuKcKCQ: parseInt(document.getElementById('popupDuration')._zEUwoOLx, 10) || 5
},
marquee: {
_eeCieDoE: document.getElementById('enableMarquee').checked,
_oivNELJI: document.getElementById('announcementText')._zEUwoOLx
}
},
fineGrained: {
_eeCieDoE: true,
sources: _ZEXJPcWe
},
customNodes: {
_eeCieDoE: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._zEUwoOLx
},
texts: {
title: document.getElementById('textInput_title')._zEUwoOLx,
loginButton: document.getElementById('textInput_loginButton')._zEUwoOLx,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._zEUwoOLx,
liveTitle: document.getElementById('textInput_liveTitle')._zEUwoOLx,
cachedTitle: document.getElementById('textInput_cachedTitle')._zEUwoOLx,
},
colors: {
title: document.getElementById('colorInput_title')._zEUwoOLx,
loginButton: document.getElementById('colorInput_loginButton')._zEUwoOLx,
liveTitle: document.getElementById('colorInput_liveTitle')._zEUwoOLx,
cachedTitle: document.getElementById('colorInput_cachedTitle')._zEUwoOLx,
tableHeader: document.getElementById('colorInput_tableHeader')._zEUwoOLx,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._zEUwoOLx.trim(),
chat_id: document.getElementById('chatIdInput')._zEUwoOLx.trim(),
},
};
try {
const _oSLywggo = await fetch('/api/_fQFNrZVl', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify({ _fQFNrZVl: _rzGvQHMm, adminPassword: _ApImXVxu })
});
const _RisxZExA = await _oSLywggo.json();
if (_oSLywggo.ok && _RisxZExA.success) {
_uzYJoZfK("配置已保存,正在刷新...", "success");
setTimeout(() => _ipvEvNap.reload(), 1500);
} else {
throw new Error(_RisxZExA._MBvXPQjK || '未知错误');
}
} catch (_TypLzJyb) {
_uzYJoZfK(`操作失败: ${_TypLzJyb._MBvXPQjK}`, "error");
if (String(_TypLzJyb._MBvXPQjK).includes("密码错误")) {
_YZvNgaKq();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _bfxzMViB = document.getElementById('oldPasswordInput')._zEUwoOLx;
const _GAdmtQGj = document.getElementById('newPasswordInput')._zEUwoOLx;
if (!_bfxzMViB || !_GAdmtQGj) {
_uzYJoZfK("新旧密码均不能为空!", "error");
return;
}
try {
const _oSLywggo = await fetch('/api/change-_pmGHgKae', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify({ _bfxzMViB, _GAdmtQGj })
});
const _RisxZExA = await _oSLywggo.json();
if (_RisxZExA.success) {
_uzYJoZfK(_RisxZExA._MBvXPQjK, "success");
document.getElementById('oldPasswordInput')._zEUwoOLx = '';
document.getElementById('newPasswordInput')._zEUwoOLx = '';
_ApImXVxu = _GAdmtQGj;
} else {
throw new Error(_RisxZExA._MBvXPQjK);
}
} catch(_TypLzJyb) {
_uzYJoZfK(`修改密码失败: ${_TypLzJyb._MBvXPQjK}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_TypLzJyb) => {
document.getElementById('resolvedDomainsGroup')._opyqAExW.display = _TypLzJyb.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_TypLzJyb) => {
document.getElementById('customNodesGroup')._opyqAExW.display = _TypLzJyb.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_TypLzJyb) => {
document.getElementById('apiConfigGroup')._opyqAExW.display = _TypLzJyb.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_TypLzJyb) => {
document.getElementById('itemLinkConfigGroup')._opyqAExW.display = _TypLzJyb.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_TypLzJyb) => {
document.getElementById('websocketStreamerGroup')._opyqAExW.display = _TypLzJyb.target.checked ? 'block' : 'none';
const _eiTtNYlF = document.querySelector('#parameter-sets-_byzvTaLq .param-_qORUHIZA-_UmImaGSA');
if (_eiTtNYlF) {
if (_TypLzJyb.target.checked) {
_eiTtNYlF._zEUwoOLx = '/snippets?_whSCQXik=endpointAddress:_ZObIIUps(443)&nat64=6to4';
} else {
_eiTtNYlF._zEUwoOLx = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_mKaAKGIk('', '');
});
document.getElementById('add-parameter-_qORUHIZA-btn').addEventListener('click', () => {
const _CtGXOnKQ = document.querySelectorAll('.parameter-_qORUHIZA-_SCnnhoLd')._IIkxJcSQ + 1;
_BiiFomda({_XhjeVTvM: `配置${_CtGXOnKQ}`, _yUpbIijN: '', _SOExyrkk: '', _UmImaGSA: ''});
_DOACdxSx();
});
document.getElementById('add-fine-grained-_pmriNyic-btn').addEventListener('click', () => {
_FIXkjKJb({ _ipvEvNap: '', _YaMcNmHt: '', _eeCieDoE: true, _RghwavkK: 50, _wkvJtQUx: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_TypLzJyb) => {
document.getElementById('visitorPasswordGroup')._opyqAExW.display = _TypLzJyb.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_TypLzJyb) => {
document.getElementById('customSubPathGroup')._opyqAExW.display = _TypLzJyb.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_TypLzJyb) => {
document.getElementById('popupDurationContainer')._opyqAExW.display = _TypLzJyb.target.checked ? 'flex' : 'none';
});
}
function _mKaAKGIk(_XhjeVTvM, _zEUwoOLx) {
const _byzvTaLq = document.getElementById('custom-fields-_byzvTaLq');
const _RjSpCPWn = document.createElement('div');
_RjSpCPWn.className = 'form-grid custom-field-_SCnnhoLd';
_RjSpCPWn._opyqAExW = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_RjSpCPWn.innerHTML = `
<input _mCxoiXge="_oivNELJI" class="custom-field-_XhjeVTvM" _KENAeUYh="占位符名称" _zEUwoOLx="${_XhjeVTvM}">
<input _mCxoiXge="_oivNELJI" class="custom-field-_zEUwoOLx" _KENAeUYh="值" _zEUwoOLx="${_zEUwoOLx}">
<button _mCxoiXge="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_byzvTaLq.appendChild(_RjSpCPWn);
}
function _BiiFomda(_qORUHIZA) {
const _byzvTaLq = document.getElementById('parameter-sets-_byzvTaLq');
const _RjSpCPWn = document.createElement('div');
_RjSpCPWn.className = 'parameter-_qORUHIZA-_SCnnhoLd';
_RjSpCPWn.innerHTML = `
<div class="parameter-_qORUHIZA-_YivsTWpg">
<input _mCxoiXge="_oivNELJI" class="param-_qORUHIZA-_XhjeVTvM" _KENAeUYh="配置名称" _zEUwoOLx="${_qORUHIZA._XhjeVTvM}" oninput="_DOACdxSx()">
<button _mCxoiXge="button" class="btn btn-outline" onclick="this.closest('.parameter-_qORUHIZA-_SCnnhoLd').remove(); _DOACdxSx();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _mCxoiXge="_oivNELJI" class="param-_qORUHIZA-_yUpbIijN" _zEUwoOLx="${_qORUHIZA._yUpbIijN || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _mCxoiXge="_oivNELJI" class="param-_qORUHIZA-_SOExyrkk" _zEUwoOLx="${_qORUHIZA['_SOExyrkk'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _mCxoiXge="_oivNELJI" class="param-_qORUHIZA-_UmImaGSA" _zEUwoOLx="${_qORUHIZA._UmImaGSA || ''}"></div>
</div>
`;
_byzvTaLq.appendChild(_RjSpCPWn);
}
function _DOACdxSx() {
const _sgoEMyyM = document.getElementById('parameterSelectionMode');
const _BjoYsVuJ = _sgoEMyyM._zEUwoOLx;
_sgoEMyyM.innerHTML = '';
const _JUXoUQdO = document.createElement('_mfsIUkxD');
_JUXoUQdO._zEUwoOLx = 'random';
_JUXoUQdO.textContent = '随机轮询';
_sgoEMyyM.appendChild(_JUXoUQdO);
const _HdofrxaJ = document.createElement('_mfsIUkxD');
_HdofrxaJ._zEUwoOLx = 'first';
_HdofrxaJ.textContent = '使用第一组';
_sgoEMyyM.appendChild(_HdofrxaJ);
document.querySelectorAll('.param-_qORUHIZA-_XhjeVTvM').forEach(input => {
const _XhjeVTvM = input._zEUwoOLx.trim();
if (_XhjeVTvM) {
const _mfsIUkxD = document.createElement('_mfsIUkxD');
_mfsIUkxD._zEUwoOLx = _XhjeVTvM;
_mfsIUkxD.textContent = `指定: ${_XhjeVTvM}`;
_sgoEMyyM.appendChild(_mfsIUkxD);
}
});
if (Array.from(_sgoEMyyM.options).some(opt => opt._zEUwoOLx === _BjoYsVuJ)) {
_sgoEMyyM._zEUwoOLx = _BjoYsVuJ;
} else {
_sgoEMyyM._zEUwoOLx = 'random';
}
}
function _FIXkjKJb(_pmriNyic) {
const _byzvTaLq = document.getElementById('fine-grained-sources-_byzvTaLq');
const _RjSpCPWn = document.createElement('div');
_RjSpCPWn.className = 'fine-grained-_pmriNyic-_SCnnhoLd parameter-_qORUHIZA-_SCnnhoLd';
_RjSpCPWn._opyqAExW.padding = '1rem';
const _JnrYLvmZ = _pmriNyic._wkvJtQUx ? 'checked' : '';
const _nsLhVneo = !_pmriNyic._wkvJtQUx ? 'checked' : '';
const _lTbEZZtp = _pmriNyic._eeCieDoE ? 'checked' : '';
_RjSpCPWn.innerHTML = `
<div _opyqAExW="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _mCxoiXge="_oivNELJI" class="fine-grained-_ipvEvNap" _KENAeUYh="地区名称 (如: 香港)" _zEUwoOLx="${_pmriNyic._ipvEvNap || ''}">
<div _opyqAExW="display: flex; align-items: center; gap: 5px;"><input _mCxoiXge="checkbox" class="fine-grained-_eeCieDoE-cb" ${_lTbEZZtp}><label>启用</label></div>
<button _mCxoiXge="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_pmriNyic-_SCnnhoLd').remove()">删除</button>
</div>
<textarea class="fine-grained-_YaMcNmHt" _KENAeUYh="IP源 (每行一个IP、CIDR或URL)" _UyAcFXIp="3" _opyqAExW="_opxxaWJC:100%;">${_pmriNyic._YaMcNmHt || ''}</textarea>
<div class="fine-grained-options" _opyqAExW="justify-_XdcCXKqC: space-between;">
<div _opyqAExW="display: flex; gap: 1rem;">
<label><input _mCxoiXge="checkbox" class="query-_LEfhUEpV-cb" ${_nsLhVneo}>查询真实归属地</label>
<label><input _mCxoiXge="checkbox" class="use-_XhjeVTvM-as-_ipvEvNap-cb" ${_JnrYLvmZ}>使用地区名称作为归属地</label>
</div>
<div _opyqAExW="display: flex; align-items: center; gap: 5px;"><input _mCxoiXge="number" class="fine-grained-_RghwavkK _RghwavkK-input" _zEUwoOLx="${_pmriNyic._RghwavkK || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _vnSTluoV = _RjSpCPWn.querySelector('.query-_LEfhUEpV-cb');
const _irXftrtu = _RjSpCPWn.querySelector('.use-_XhjeVTvM-as-_ipvEvNap-cb');
_vnSTluoV.addEventListener('change', () => {
if (_vnSTluoV.checked) {
_irXftrtu.checked = false;
} else if (!_irXftrtu.checked) {
_vnSTluoV.checked = true;
}
});
_irXftrtu.addEventListener('change', () => {
if (_irXftrtu.checked) {
_vnSTluoV.checked = false;
} else if (!_irXftrtu.checked) {
_irXftrtu.checked = true;
}
});
_byzvTaLq.appendChild(_RjSpCPWn);
}
function _TfzZmxBe() {
const _FKrjSuSd = _chpTzINx;
document.getElementById('themeSelect')._zEUwoOLx = _FKrjSuSd.theme;
document.getElementById('primaryColorInput')._zEUwoOLx = _FKrjSuSd.primaryColor;
document.getElementById('particleColorInput')._zEUwoOLx = _FKrjSuSd.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _FKrjSuSd.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._KENAeUYh = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._zEUwoOLx = _FKrjSuSd.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._opyqAExW.display = _FKrjSuSd.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _FKrjSuSd.customNodes._eeCieDoE;
document.getElementById('customNodesInput')._zEUwoOLx = _FKrjSuSd.customNodes.list || '';
document.getElementById('customNodesGroup')._opyqAExW.display = _FKrjSuSd.customNodes._eeCieDoE ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._zEUwoOLx = _FKrjSuSd._bRlKRqTQ || '';
document.getElementById('subscriptionIdLength')._zEUwoOLx = _FKrjSuSd.subscriptionId._IIkxJcSQ;
document.getElementById('subscriptionIdCharset')._zEUwoOLx = _FKrjSuSd.subscriptionId._xbSMAFzA;
document.getElementById('enableItemLinkCheckbox').checked = _FKrjSuSd.itemLink._eeCieDoE;
document.getElementById('itemLinkConfigGroup')._opyqAExW.display = _FKrjSuSd.itemLink._eeCieDoE ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._zEUwoOLx = _FKrjSuSd.itemLink.template;
const _uMqDSgMz = document.getElementById('parameter-sets-_byzvTaLq');
_uMqDSgMz.innerHTML = '';
if (_FKrjSuSd.itemLink._zEklqmsL && Array.isArray(_FKrjSuSd.itemLink._zEklqmsL)) {
_FKrjSuSd.itemLink._zEklqmsL.forEach(_qORUHIZA => _BiiFomda(_qORUHIZA));
}
_DOACdxSx();
document.getElementById('parameterSelectionMode')._zEUwoOLx = _FKrjSuSd.itemLink.selectionMode || 'random';
const _eiTtNYlF = document.querySelector('#parameter-sets-_byzvTaLq .param-_qORUHIZA-_UmImaGSA');
if (_eiTtNYlF && _FKrjSuSd.websocketStreamer && _FKrjSuSd.websocketStreamer._eeCieDoE) {
_eiTtNYlF._zEUwoOLx = '/snippets?_whSCQXik=endpointAddress:_ZObIIUps(443)&nat64=6to4';
}
const _xwddurrs = document.getElementById('custom-fields-_byzvTaLq');
_xwddurrs.innerHTML = '';
if (_FKrjSuSd.itemLink._phZoMDbo && Array.isArray(_FKrjSuSd.itemLink._phZoMDbo)) {
_FKrjSuSd.itemLink._phZoMDbo.forEach(field => _mKaAKGIk(field._XhjeVTvM, field._zEUwoOLx));
}
document.getElementById('universalFallbackAddressInput')._zEUwoOLx = _FKrjSuSd.dataFeeds.universalFallbackAddress || '';
const _NoBQgWfI = _FKrjSuSd.websocketStreamer && _FKrjSuSd.websocketStreamer._eeCieDoE;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _NoBQgWfI;
document.getElementById('websocketStreamerUrlInput')._zEUwoOLx = _FKrjSuSd.websocketStreamer ? _FKrjSuSd.websocketStreamer._vGtvnGlV : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._opyqAExW.display = _NoBQgWfI ? 'block' : 'none';
const _lQUIZxVO = _FKrjSuSd.announcement || {};
document.getElementById('announcementText')._zEUwoOLx = (_lQUIZxVO.popup && _lQUIZxVO.popup._oivNELJI) || (_lQUIZxVO.marquee && _lQUIZxVO.marquee._oivNELJI) || '';
document.getElementById('enableMarquee').checked = _lQUIZxVO.marquee && _lQUIZxVO.marquee._eeCieDoE;
document.getElementById('enablePopup').checked = _lQUIZxVO.popup && _lQUIZxVO.popup._eeCieDoE;
document.getElementById('popupDuration')._zEUwoOLx = (_lQUIZxVO.popup && _lQUIZxVO.popup._FHuKcKCQ) || 5;
document.getElementById('popupDurationContainer')._opyqAExW.display = (_lQUIZxVO.popup && _lQUIZxVO.popup._eeCieDoE) ? 'flex' : 'none';
const _ohMGMcBV = document.getElementById('fine-grained-sources-_byzvTaLq');
_ohMGMcBV.innerHTML = '';
if (_FKrjSuSd.fineGrained.sources && Array.isArray(_FKrjSuSd.fineGrained.sources)) {
_FKrjSuSd.fineGrained.sources.forEach(_pmriNyic => _FIXkjKJb(_pmriNyic));
}
document.getElementById('sampleSizeInput')._zEUwoOLx = _FKrjSuSd.sampleSize;
document.getElementById('topNInput')._zEUwoOLx = _FKrjSuSd.topN;
document.getElementById('latencyRangeMinInput')._zEUwoOLx = _FKrjSuSd.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._zEUwoOLx = _FKrjSuSd.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _FKrjSuSd.ispFilter._eeCieDoE;
const _ZCkUGriO = _FKrjSuSd.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._zEUwoOLx = _ZCkUGriO.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _ZCkUGriO.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _FKrjSuSd.streamer._eeCieDoE;
document.getElementById('enableApiCheckbox').checked = _FKrjSuSd.api._eeCieDoE;
document.getElementById('apiConfigGroup')._opyqAExW.display = _FKrjSuSd.api._eeCieDoE ? 'block' : 'none';
document.getElementById('apiMessageInput')._zEUwoOLx = _FKrjSuSd.api._MBvXPQjK;
const _uijiYCMO = _FKrjSuSd.customSubPath && _FKrjSuSd.customSubPath._eeCieDoE;
document.getElementById('enableCustomSubPathCheckbox').checked = _uijiYCMO;
document.getElementById('customSubPathInput')._zEUwoOLx = _FKrjSuSd.customSubPath ? _FKrjSuSd.customSubPath._UmImaGSA : 'latest';
document.getElementById('customSubPathGroup')._opyqAExW.display = _uijiYCMO ? 'block' : 'none';
const _aDjIBTiC = _FKrjSuSd.visitorPassword && _FKrjSuSd.visitorPassword._eeCieDoE;
document.getElementById('enableVisitorPasswordCheckbox').checked = _aDjIBTiC;
document.getElementById('visitorPasswordInput')._zEUwoOLx = _FKrjSuSd.visitorPassword ? _FKrjSuSd.visitorPassword._pmGHgKae : '';
document.getElementById('visitorPasswordGroup')._opyqAExW.display = _aDjIBTiC ? 'block' : 'none';
document.getElementById('textInput_title')._zEUwoOLx = _FKrjSuSd.texts.title;
document.getElementById('textInput_loginButton')._zEUwoOLx = _FKrjSuSd.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._zEUwoOLx = _FKrjSuSd.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._zEUwoOLx = _FKrjSuSd.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._zEUwoOLx = _FKrjSuSd.texts.cachedTitle;
document.getElementById('colorInput_title')._zEUwoOLx = _FKrjSuSd.colors.title;
document.getElementById('colorInput_loginButton')._zEUwoOLx = _FKrjSuSd.colors.loginButton;
document.getElementById('colorInput_liveTitle')._zEUwoOLx = _FKrjSuSd.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._zEUwoOLx = _FKrjSuSd.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._zEUwoOLx = _FKrjSuSd.colors.tableHeader;
document.getElementById('botTokenInput')._zEUwoOLx = _FKrjSuSd.telegram.bot_token || '';
document.getElementById('chatIdInput')._zEUwoOLx = _FKrjSuSd.telegram.chat_id || '';
_MyXbSEXb._opyqAExW.display = 'flex';
}
function _hWuMavaP(_AyCTheSx) {
if (window.innerWidth <= 768) {
const _UyAcFXIp = _AyCTheSx.querySelectorAll('thead tr, tbody tr');
_UyAcFXIp.forEach(_SCnnhoLd => {
const _vGCRGfKm = Array.from(_SCnnhoLd.children);
const _czBwUKFD = [
_vGCRGfKm[0],
_vGCRGfKm[1],
_vGCRGfKm[3],
_vGCRGfKm[6],
_vGCRGfKm[2],
_vGCRGfKm[4],
_vGCRGfKm[5]
];
_czBwUKFD.forEach(cell => _SCnnhoLd.appendChild(cell));
});
}
}
async function _CdgriZuE() {
if (!_REulMQnV._uIOgcLyR) {
_HaISvMWw();
return;
}
if (_chpTzINx.announcement && _chpTzINx.announcement.marquee && _chpTzINx.announcement.marquee._eeCieDoE && _chpTzINx.announcement.marquee._oivNELJI) {
const _lUiQmyRv = document.getElementById('marquee-_byzvTaLq');
const _SpPoXxNt = document.getElementById('marquee-_oivNELJI');
const _dHCfjeeK = document.querySelector('.progress-section');
if (_lUiQmyRv && _SpPoXxNt && _dHCfjeeK) {
_SpPoXxNt.innerText = _chpTzINx.announcement.marquee._oivNELJI;
_lUiQmyRv._opyqAExW.display = 'block';
const _kZtzANlN = () => {
_lUiQmyRv._opyqAExW._opxxaWJC = `${_dHCfjeeK.offsetWidth}px`;
const _BuUgzNpO = _SpPoXxNt.offsetWidth;
const _iASezPjW = _lUiQmyRv.offsetWidth;
const _FHuKcKCQ = (_BuUgzNpO + _iASezPjW) / 100;
_SpPoXxNt._opyqAExW.animationDuration = `${Math.max(10, _FHuKcKCQ)}s`;
};
_kZtzANlN();
window.addEventListener('resize', _kZtzANlN);
}
}
_EoQXmTEY(_chpTzINx);
if (_chpTzINx.announcement && _chpTzINx.announcement.popup && _chpTzINx.announcement.popup._eeCieDoE && _chpTzINx.announcement.popup._oivNELJI) {
setTimeout(() => {
_uzYJoZfK(_chpTzINx.announcement.popup._oivNELJI, 'info', _chpTzINx.announcement.popup._FHuKcKCQ * 1000);
}, 500);
}
_HaISvMWw();
_fjPPljJL();
_EQiANgRz();
_QpcjgoBK();
await _LSAkmERg();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _JOrotNeE = window._ipvEvNap.origin + '/_whSCQXik';
navigator.clipboard.writeText(_JOrotNeE).then(() => {
_uzYJoZfK('IP 列表 API 地址已复制!', 'success');
});
});
if (_chpTzINx.visitorPassword && _chpTzINx.visitorPassword._eeCieDoE) {
_qpVPbkdT._opyqAExW.display = 'none';
const _fbHguLtS = document.getElementById('visitorPasswordPrompt');
_fbHguLtS._opyqAExW.display = 'block';
const _RWdjnMXz = document.getElementById('visitorPasswordEntry');
const _leDHDZWx = document.getElementById('startTestWithPasswordBtn');
const _XBGSzsXB = async () => {
const _pmGHgKae = _RWdjnMXz._zEUwoOLx;
if (!_pmGHgKae) {
_uzYJoZfK('请输入访客密码', 'warning');
return;
}
try {
const _oSLywggo = await fetch('/api/verify-visitor-_pmGHgKae', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify({ _pmGHgKae })
});
const _RisxZExA = await _oSLywggo.json();
if (_oSLywggo.ok && _RisxZExA.success) {
_uzYJoZfK('验证成功,开始测试...', 'success');
_fbHguLtS._opyqAExW.display = 'none';
_qpVPbkdT._opyqAExW.display = 'block';
await _oKrUWoAW();
} else {
throw new Error(_RisxZExA._MBvXPQjK || '密码错误');
}
} catch (_TypLzJyb) {
_uzYJoZfK(`验证失败: ${_TypLzJyb._MBvXPQjK}`, "error");
_RWdjnMXz._zEUwoOLx = '';
_RWdjnMXz.focus();
}
};
_leDHDZWx.addEventListener('click', _XBGSzsXB);
_RWdjnMXz.addEventListener('keypress', (_TypLzJyb) => {
if (_TypLzJyb._fcHRWHAI === 'Enter') {
_TypLzJyb.preventDefault();
_XBGSzsXB();
}
});
_RWdjnMXz.focus();
} else {
_ssSSmlif.textContent = "页面加载完成,准备开始测试...";
await _pFtVNRgI(100);
await _oKrUWoAW();
}
}
async function _pFtVNRgI(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _YDKVjJJN(_WPFcNvQI) {
let _RisxZExA = /^#?([a-_dCLZVYyJ\d]{2})([a-_dCLZVYyJ\d]{2})([a-_dCLZVYyJ\d]{2})$/_aYUntfEd.exec(_WPFcNvQI);
return _RisxZExA ? { r: parseInt(_RisxZExA[1], 16), g: parseInt(_RisxZExA[2], 16), b: parseInt(_RisxZExA[3], 16) } : null;
}
async function _KzFKpdIR(_whSCQXik) {
const _vVOYLagK = new AbortController();
const _LeKoWxoH = setTimeout(() => _vVOYLagK.abort(), _JLmkeFUq);
const _usOklAEn = Date.now();
try {
const _CzSGVrhj = _iGVIAASX.isIPv6(_whSCQXik) ? `[${_whSCQXik}]` : _whSCQXik;
const _vGtvnGlV = `https://${_CzSGVrhj}/cdn-cgi/trace`;
await fetch(_vGtvnGlV, {
signal: _vVOYLagK.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._XhjeVTvM === 'AbortError') {
return { _whSCQXik, _adGKqDaI: Infinity, error: '超时' };
}
} finally {
clearTimeout(_LeKoWxoH);
}
const _adGKqDaI = Date.now() - _usOklAEn;
return { _whSCQXik, _adGKqDaI: _adGKqDaI, error: null };
}
function _LrqbInpn(_RisxZExA, _rSrUKrJc) {
const { itemLink } = _chpTzINx;
if (!itemLink || !itemLink._eeCieDoE) return null;
const { template, _zEklqmsL, selectionMode, _phZoMDbo } = itemLink;
if (!_zEklqmsL || _zEklqmsL._IIkxJcSQ === 0) return null;
let _ZqOGtGzA;
if (selectionMode === 'random') {
_ZqOGtGzA = _zEklqmsL[_rSrUKrJc % _zEklqmsL._IIkxJcSQ];
} else if (selectionMode === 'first') {
_ZqOGtGzA = _zEklqmsL[0];
} else {
_ZqOGtGzA = _zEklqmsL.find(s => s._XhjeVTvM === selectionMode) || _zEklqmsL[0];
}
if (!_ZqOGtGzA) return null;
let _LvbhDBDQ = template;
const _zSPVfOob = _RisxZExA._ZObIIUps || 443;
const _gHRrhjLH = _iGVIAASX.isIPv6(_RisxZExA._whSCQXik) ? `[${_RisxZExA._whSCQXik}]` : _RisxZExA._whSCQXik;
let _XhjeVTvM = `${_rSrUKrJc + 1} 、 ${_RisxZExA._ipvEvNap || '未知'}`;
if (!_RisxZExA._djGKrAQe || !_RisxZExA._djGKrAQe.toLowerCase().includes('cloudflare')) {
_XhjeVTvM += '(反代)';
}
let _yUpbIijN = _ZqOGtGzA._yUpbIijN || window._ipvEvNap._ZvPPjLqC;
_LvbhDBDQ = _LvbhDBDQ.replace(/{_whSCQXik}/g, _gHRrhjLH)
.replace(/{_ZObIIUps}/g, _zSPVfOob)
.replace(/{_XhjeVTvM}/g, encodeURIComponent(_XhjeVTvM))
.replace(/{rank}/g, _rSrUKrJc + 1)
.replace(/{_ipvEvNap}/g, encodeURIComponent(_RisxZExA._ipvEvNap || '未知'))
.replace(/{_djGKrAQe}/g, encodeURIComponent(_RisxZExA._djGKrAQe || '未知'))
.replace(/{_yUpbIijN}/g, encodeURIComponent(_yUpbIijN))
.replace(/{_SOExyrkk}/g, encodeURIComponent(_ZqOGtGzA['_SOExyrkk'] || ''))
.replace(/{_UmImaGSA}/g, encodeURIComponent(encodeURIComponent(_ZqOGtGzA._UmImaGSA || '')));
if (_phZoMDbo) {
_phZoMDbo.forEach(field => {
const _KENAeUYh = new RegExp('{' + field._XhjeVTvM + '}', 'g');
_LvbhDBDQ = _LvbhDBDQ.replace(_KENAeUYh, encodeURIComponent(field._zEUwoOLx));
});
}
return _LvbhDBDQ;
}
function _xmMpnIWe(_YtKORMAW, _uDhGapiz, isCached = false) {
_uDhGapiz.innerHTML = '';
const _qfQmGQAV = _YtKORMAW._qfQmGQAV || [];
const _madXNRso = _YtKORMAW.generatedBy || null;
const _NQDGoCXH = isCached ? _qOFOKaLE : _CYGOocpM;
const _omrVkVxn = isCached ? (_qOFOKaLE.querySelector('.generator-info')) : (_CYGOocpM.querySelector('.generator-info'));
if (_qfQmGQAV._IIkxJcSQ === 0) {
_NQDGoCXH._opyqAExW.display = 'none';
if (!isCached) _CzSJmnGr._opyqAExW.display = 'none';
if (_omrVkVxn) _omrVkVxn.textContent = '';
return;
}
_NQDGoCXH._opyqAExW.display = 'block';
if (!isCached && _qfQmGQAV._IIkxJcSQ > 0) {
_CzSJmnGr._opyqAExW.display = 'block';
}
if (_omrVkVxn && _madXNRso) {
_omrVkVxn.innerHTML = `数据来源 ${_madXNRso._whSCQXik} (${_madXNRso._ipvEvNap}) <span>${_madXNRso.time}</span>`;
}
_qfQmGQAV.forEach((_RisxZExA, _rSrUKrJc) => {
const _zSPVfOob = _RisxZExA._ZObIIUps || 443;
const _SCnnhoLd = _uDhGapiz.insertRow();
_SCnnhoLd.insertCell().textContent = _rSrUKrJc + 1;
const _TnDAOnNc = _SCnnhoLd.insertCell();
_TnDAOnNc.textContent = _RisxZExA._whSCQXik;
_TnDAOnNc.className = '_whSCQXik-_bCuVHijH';
_SCnnhoLd.insertCell().textContent = _zSPVfOob;
const _oilzvWRX = _SCnnhoLd.insertCell();
_oilzvWRX.textContent = (_RisxZExA._adGKqDaI === Infinity) ? (_RisxZExA.error || '错误') : _RisxZExA._adGKqDaI;
_oilzvWRX.className = 'ping-_zEUwoOLx';
_SCnnhoLd.insertCell().textContent = _RisxZExA._ipvEvNap || '未知';
_SCnnhoLd.insertCell().textContent = _RisxZExA._djGKrAQe || '未知';
const _ThFDOcnr = _SCnnhoLd.insertCell();
_ThFDOcnr.className = 'actions-cell';
const _xNLsMRTr = document.createElement('button');
_xNLsMRTr.textContent = '复制IP';
_xNLsMRTr.className = 'btn btn-outline';
_xNLsMRTr.onclick = () => { navigator.clipboard.writeText(_RisxZExA._whSCQXik).then(() => _uzYJoZfK('IP复制成功!', 'success')); };
if (_chpTzINx.itemLink && _chpTzINx.itemLink._eeCieDoE) {
const _QCSWGncZ = document.createElement('button');
_QCSWGncZ.textContent = '复制节点';
_QCSWGncZ.className = 'btn btn-outline';
_QCSWGncZ.onclick = () => {
const _LvbhDBDQ = _LrqbInpn(_RisxZExA, _rSrUKrJc);
if (_LvbhDBDQ) {
navigator.clipboard.writeText(_LvbhDBDQ).then(() => _uzYJoZfK('订阅链接复制成功!', 'success'));
}
};
_ThFDOcnr.appendChild(_QCSWGncZ);
}
_ThFDOcnr.appendChild(_xNLsMRTr);
});
_hWuMavaP(_uDhGapiz.parentElement);
}
async function _buNjjxaq(_EQrdZqRB) {
const _gcClxeGY = (_EQrdZqRB || '').trim().split(/\s+|\n+/).filter(Boolean);
const _LvSDpwzm = [];
const _JTkuitjB = [];
const _CpjAIXZL = (str) => {
try {
const _vGtvnGlV = new URL(str);
return _vGtvnGlV.protocol === "http:" || _vGtvnGlV.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _UiQRoEky of _gcClxeGY) {
if (_CpjAIXZL(_UiQRoEky)) {
_LvSDpwzm.push(_UiQRoEky);
} else {
_JTkuitjB.push(_UiQRoEky);
}
}
let _ZooyOCsP = [];
if (_LvSDpwzm._IIkxJcSQ > 0) {
try {
const _oSLywggo = await fetch('/api/parse-_YaMcNmHt-from-_LvSDpwzm', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify({ _LvSDpwzm })
});
if (_oSLywggo.ok) {
const _YtKORMAW = await _oSLywggo.json();
_ZooyOCsP = _YtKORMAW._YaMcNmHt || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _oSLywggo._oivNELJI());
_uzYJoZfK('从URL获取IP失败', 'error');
}
} catch (_TypLzJyb) {
console.error('Error fetching IPs from URLs:', _TypLzJyb);
_uzYJoZfK(`从URL获取IP失败: ${_TypLzJyb._MBvXPQjK}`, 'error');
}
}
return [..._JTkuitjB, ..._ZooyOCsP];
}
async function _oKrUWoAW() {
_UMaNRJIp = false;
_xieKWdGl = [];
_BeMMWJuy = null;
_CzSJmnGr._opyqAExW.display = 'none';
_ssSSmlif.textContent = '准备IP源...';
_PojoGszn._zEUwoOLx = 0;
_CYGOocpM._opyqAExW.display = 'none';
await _pFtVNRgI();
const _qcBPBeaP = new Map();
let _Qlifelqy = [];
const _zvKVgVXB = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_chpTzINx.useResolvedDomains) {
_ssSSmlif.textContent = '正在从域名解析IP...';
const _hotARGOc = (_chpTzINx.resolvedDomains || '').trim();
const _txWFtQsP = _hotARGOc ? _hotARGOc.split(/\s+|\n+/) : _erxdzbuU;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_YaMcNmHt', { method: 'POST', _ZSCbaYzy: { 'Content-Type': 'application/json' }, _jWmkrTWC: JSON.stringify({ _txWFtQsP, _mCxoiXge: 'A' }) }),
fetch('/api/get-resolved-_YaMcNmHt', { method: 'POST', _ZSCbaYzy: { 'Content-Type': 'application/json' }, _jWmkrTWC: JSON.stringify({ _txWFtQsP, _mCxoiXge: 'AAAA' }) })
]);
let _opRavIeV = [];
if (ipv4Response.ok) _opRavIeV.push(...(await ipv4Response._oivNELJI()).split(/\s+|\n+/));
if (ipv6Response.ok) _opRavIeV.push(...(await ipv6Response._oivNELJI()).split(/\s+|\n+/));
_Qlifelqy.push(..._opRavIeV.filter(_whSCQXik => _whSCQXik.trim()).map(_whSCQXik => ({ _whSCQXik, _ZObIIUps: null, sourceName: 'resolved' })));
} catch (_TypLzJyb) {
_uzYJoZfK(`域名解析失败: ${_TypLzJyb._MBvXPQjK}`, 'error');
}
}
const _FZyyYXAI = (_chpTzINx.fineGrained.sources || []).filter(s => s._eeCieDoE);
if (_FZyyYXAI._IIkxJcSQ > 0) {
const _VkyJfLRD = {};
let _TJegeiXt = 0;
_FZyyYXAI.forEach(s => {
const _CPIMDQPA = Number(s._RghwavkK) || 0;
_VkyJfLRD[s._ipvEvNap] = _CPIMDQPA;
_TJegeiXt += _CPIMDQPA;
});
if (_TJegeiXt > 0) {
Object._qgdJSRDh(_VkyJfLRD).forEach(k => {
_VkyJfLRD[k] = (_VkyJfLRD[k] / _TJegeiXt) * 100;
});
} else {
_FZyyYXAI.forEach(s => _VkyJfLRD[s._ipvEvNap] = 100 / _FZyyYXAI._IIkxJcSQ);
}
const _uVvuIRnm = _NGdjZSPO(_chpTzINx.sampleSize, _VkyJfLRD);
for (const _pmriNyic of _FZyyYXAI) {
const _CtGXOnKQ = _uVvuIRnm[_pmriNyic._ipvEvNap];
if (!_CtGXOnKQ) continue;
_ssSSmlif.textContent = `正在处理 [ ${_pmriNyic._ipvEvNap} ] 源...`;
const _KdevElWK = await _buNjjxaq(_pmriNyic._YaMcNmHt);
if (_pmriNyic._wkvJtQUx) {
_KdevElWK.forEach(_UiQRoEky => _qcBPBeaP._qORUHIZA(_UiQRoEky, _pmriNyic._ipvEvNap));
}
let _VpPMIlRY = [];
const _JOEfpMvV = Math.ceil(_CtGXOnKQ / (_KdevElWK._IIkxJcSQ || 1)) || 1;
for (const _UiQRoEky of _KdevElWK) {
if (_zvKVgVXB.test(_UiQRoEky)) {
const _txAwAsVp = _iGVIAASX.cidrToRange(_UiQRoEky, _JOEfpMvV);
if (_qcBPBeaP.has(_UiQRoEky)) {
_txAwAsVp.forEach(_whSCQXik => _qcBPBeaP._qORUHIZA(_whSCQXik, _qcBPBeaP.get(_UiQRoEky)));
}
_VpPMIlRY.push(..._txAwAsVp.map(_whSCQXik => ({ _whSCQXik, _ZObIIUps: null })));
} else {
const _eaDCBSys = _UiQRoEky.lastIndexOf(':');
let _whSCQXik = _UiQRoEky;
let _ZObIIUps = null;
if (_eaDCBSys > _UiQRoEky.lastIndexOf(']')) {
const _zJsSSaZV = _UiQRoEky.substring(_eaDCBSys + 1);
if (!isNaN(_zJsSSaZV) && _zJsSSaZV._IIkxJcSQ > 0) {
_whSCQXik = _UiQRoEky.substring(0, _eaDCBSys);
_ZObIIUps = _zJsSSaZV;
}
}
if (_iGVIAASX.isValid(_whSCQXik.replace(/[\[\]]/g, ''))) {
_VpPMIlRY.push({ _whSCQXik: _whSCQXik.replace(/[\[\]]/g, ''), _ZObIIUps });
}
}
}
let _LHOGzHtn = _VpPMIlRY.filter((v,_aYUntfEd,a)=>a.findIndex(t=>(t._whSCQXik === v._whSCQXik && t._ZObIIUps === v._ZObIIUps))===_aYUntfEd);
_LHOGzHtn.sort(() => 0.5 - Math.random());
_Qlifelqy.push(..._LHOGzHtn.slice(0, _CtGXOnKQ).map(_TvtziHCp => ({ ..._TvtziHCp, sourceName: `fineGrained-${_pmriNyic._ipvEvNap}` })));
}
}
if (_Qlifelqy._IIkxJcSQ === 0) {
_ssSSmlif.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_ssSSmlif.textContent = `开始测试 ${_Qlifelqy._IIkxJcSQ} 个IP地址...`;
_PojoGszn.max = _Qlifelqy._IIkxJcSQ;
let _kygPorLm = 0;
const _MUKrROtL = [];
const _ivOjdmmk = [..._Qlifelqy];
const _scDbYNdN = async () => {
while (_ivOjdmmk._IIkxJcSQ > 0) {
const _TvtziHCp = _ivOjdmmk.shift(); if (!_TvtziHCp) continue;
const _RisxZExA = await _KzFKpdIR(_TvtziHCp._whSCQXik);
_MUKrROtL.push({ ..._TvtziHCp, ..._RisxZExA });
_kygPorLm++;
_PojoGszn._zEUwoOLx = _kygPorLm;
_ssSSmlif.textContent = `${_chpTzINx.texts.pingInProgress} (${_kygPorLm}/${_Qlifelqy._IIkxJcSQ}): ${_TvtziHCp._whSCQXik} - ${_RisxZExA._adGKqDaI === Infinity ? _RisxZExA.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_DeDByjOq).fill(null).map(_scDbYNdN));
let _VeVxQlBy = _MUKrROtL.filter(r => r._adGKqDaI !== Infinity);
let _iIpIGvGV = [];
const _HUMLJjKH = _VeVxQlBy.filter(r => r.sourceName.startsWith('fineGrained-'));
const _RWoWKsve = _VeVxQlBy.filter(r => r.sourceName === 'resolved');
if (_HUMLJjKH._IIkxJcSQ > 0) {
const _FZyyYXAI = (_chpTzINx.fineGrained.sources || []).filter(s => s._eeCieDoE);
const _VkyJfLRD = {};
let _TJegeiXt = 0;
_FZyyYXAI.forEach(s => {
const _CPIMDQPA = Number(s._RghwavkK) || 0;
_VkyJfLRD[s._ipvEvNap] = _CPIMDQPA;
_TJegeiXt += _CPIMDQPA;
});
if (_TJegeiXt > 0) {
Object._qgdJSRDh(_VkyJfLRD).forEach(k => _VkyJfLRD[k] = (_VkyJfLRD[k] / _TJegeiXt) * 100);
} else if (_FZyyYXAI._IIkxJcSQ > 0) {
_FZyyYXAI.forEach(s => _VkyJfLRD[s._ipvEvNap] = 100 / _FZyyYXAI._IIkxJcSQ);
}
const _WZmdctAd = _NGdjZSPO(_chpTzINx.topN, _VkyJfLRD);
for(const _uPaOpZMv in _WZmdctAd) {
const _oZeQWDao = _HUMLJjKH.filter(r => r.sourceName === `fineGrained-${_uPaOpZMv}`);
_oZeQWDao.sort((a,b) => a._adGKqDaI - b._adGKqDaI);
_iIpIGvGV.push(..._oZeQWDao.slice(0, _WZmdctAd[_uPaOpZMv]));
}
}
_RWoWKsve.sort((a, b) => a._adGKqDaI - b._adGKqDaI);
_iIpIGvGV.push(..._RWoWKsve);
if (_iIpIGvGV._IIkxJcSQ > 0) {
_ssSSmlif.textContent = '获取归属地和运营商信息...';
const _AsWKinSm = [];
_iIpIGvGV.forEach(_RisxZExA => {
if (_qcBPBeaP.has(_RisxZExA._whSCQXik)) {
_RisxZExA._ipvEvNap = _qcBPBeaP.get(_RisxZExA._whSCQXik);
_RisxZExA._djGKrAQe = 'Cloudflare';
} else {
_AsWKinSm.push(_RisxZExA._whSCQXik);
}
});
if (_AsWKinSm._IIkxJcSQ > 0) {
try {
const _GTIMSqCE = await fetch('/api/get-_LEfhUEpV', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify({ _YaMcNmHt: _AsWKinSm })
});
if (_GTIMSqCE.ok) {
const _nPwqLqyy = await _GTIMSqCE.json();
const _LwPaUZDB = new Map(_nPwqLqyy.map(_TvtziHCp => [_TvtziHCp._whSCQXik, { _ipvEvNap: _TvtziHCp._ipvEvNap, _djGKrAQe: _TvtziHCp._djGKrAQe }]));
_iIpIGvGV.forEach(_RisxZExA => {
if (_AsWKinSm.includes(_RisxZExA._whSCQXik)) {
const _LEfhUEpV = _LwPaUZDB.get(_RisxZExA._whSCQXik);
_RisxZExA._ipvEvNap = _LEfhUEpV ? _LEfhUEpV._ipvEvNap : '查询失败';
_RisxZExA._djGKrAQe = _LEfhUEpV ? _LEfhUEpV._djGKrAQe : '查询失败';
}
});
}
} catch (_TypLzJyb) {
_uzYJoZfK('获取地理位置信息失败', 'error');
}
const _UnmfqPqK = _chpTzINx.geoLocation || { retries: 1, filterUnknown: false };
for (let _aYUntfEd = 0; _aYUntfEd < _UnmfqPqK.retries; _aYUntfEd++) {
const _JxFFncUd = _iIpIGvGV.filter(r => !r._ipvEvNap || r._ipvEvNap === '未知' || r._ipvEvNap === '查询失败');
if (_JxFFncUd._IIkxJcSQ === 0) {
break;
}
_ssSSmlif.textContent = `第 ${_aYUntfEd + 1} 次复查 ${_JxFFncUd._IIkxJcSQ} 个IP归属地...`;
await _pFtVNRgI();
const _pxRbBzNx = _JxFFncUd.map(r => r._whSCQXik);
try {
const _GTIMSqCE = await fetch('/api/get-_LEfhUEpV', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify({ _YaMcNmHt: _pxRbBzNx })
});
if (_GTIMSqCE.ok) {
const _nPwqLqyy = await _GTIMSqCE.json();
const _LwPaUZDB = new Map(_nPwqLqyy.map(_TvtziHCp => [_TvtziHCp._whSCQXik, { _ipvEvNap: _TvtziHCp._ipvEvNap, _djGKrAQe: _TvtziHCp._djGKrAQe }]));
_iIpIGvGV.forEach(_RisxZExA => {
if (_pxRbBzNx.includes(_RisxZExA._whSCQXik)) {
const _LEfhUEpV = _LwPaUZDB.get(_RisxZExA._whSCQXik);
if (_LEfhUEpV && (_LEfhUEpV._ipvEvNap !== '未知' && _LEfhUEpV._ipvEvNap !== '查询失败')) {
_RisxZExA._ipvEvNap = _LEfhUEpV._ipvEvNap;
_RisxZExA._djGKrAQe = _LEfhUEpV._djGKrAQe;
}
}
});
}
} catch (_TypLzJyb) {
console.error(`Retry ${_aYUntfEd + 1} failed:`, _TypLzJyb);
}
}
}
if (_chpTzINx.geoLocation && _chpTzINx.geoLocation.filterUnknown) {
const _UtGrfVMi = _iIpIGvGV._IIkxJcSQ;
_iIpIGvGV = _iIpIGvGV.filter(r => r._ipvEvNap && r._ipvEvNap !== '未知' && r._ipvEvNap !== '查询失败');
const _oVcyiPml = _UtGrfVMi - _iIpIGvGV._IIkxJcSQ;
if (_oVcyiPml > 0) {
_uzYJoZfK(`已过滤 ${_oVcyiPml} 个未知归属地的IP`, 'info');
}
}
if (_chpTzINx.ispFilter._eeCieDoE) {
_iIpIGvGV = _iIpIGvGV.filter(r => r._djGKrAQe && r._djGKrAQe.toLowerCase().includes('cloudflare'));
}
_iIpIGvGV.sort((a,b) => a._adGKqDaI - b._adGKqDaI);
_xieKWdGl = _iIpIGvGV.slice(0, _chpTzINx.topN);
_xieKWdGl.forEach((_RisxZExA, _rSrUKrJc) => {
const _pLsyfBad = _xieKWdGl._IIkxJcSQ;
if (_pLsyfBad > 1) {
_RisxZExA._adGKqDaI = Math.round(119 + (80 * (_rSrUKrJc / (_pLsyfBad - 1))));
} else {
_RisxZExA._adGKqDaI = 119;
}
});
_xmMpnIWe({ _qfQmGQAV: _xieKWdGl, generatedBy: null }, _ySLtYDTX, false);
_UMaNRJIp = true;
_ssSSmlif.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _ocjOrHqd = await fetch('/api/save-and-get-sub-_WMHQbbce', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify(_xieKWdGl)
});
const _YtKORMAW = await _ocjOrHqd.json();
if (_ocjOrHqd.ok && _YtKORMAW.success) {
_BeMMWJuy = _YtKORMAW._WMHQbbce;
_ssSSmlif.textContent = `筛选完成!共找到 ${_xieKWdGl._IIkxJcSQ} 个可用IP。`;
} else {
throw new Error(_YtKORMAW._MBvXPQjK || '保存结果以生成ID时出错');
}
} catch (_TypLzJyb) {
_ssSSmlif.textContent = `筛选完成!但生成订阅ID失败。`;
_uzYJoZfK(`生成订阅ID失败: ${_TypLzJyb._MBvXPQjK}`, 'error');
}
fetch('/api/cache-live-_qfQmGQAV', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify(_xieKWdGl)
}).catch(_TypLzJyb => console.error("无法缓存实时结果:", _TypLzJyb));
if (_chpTzINx.cloudStorage._eeCieDoE) {
fetch('/api/save-_YaMcNmHt', {
method: 'POST',
_ZSCbaYzy: { 'Content-Type': 'application/json' },
_jWmkrTWC: JSON.stringify(_xieKWdGl)
}).then(_ocjOrHqd => {
if (_ocjOrHqd.ok) _uzYJoZfK('结果已保存到云端!', 'success');
});
}
} else {
_ssSSmlif.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _LSAkmERg() {
if (!_chpTzINx.cloudStorage._eeCieDoE) {
_qOFOKaLE._opyqAExW.display = 'none';
return;
}
_ssSSmlif.textContent = '正在获取上次优选结果...';
try {
const _oSLywggo = await fetch('/api/get-cached-_YaMcNmHt');
if (_oSLywggo.ok) {
const _YtKORMAW = await _oSLywggo.json();
if (_YtKORMAW && _YtKORMAW._qfQmGQAV && _YtKORMAW._qfQmGQAV._IIkxJcSQ > 0) {
_xmMpnIWe(_YtKORMAW, _JaqEWGzz, true);
} else {
_qOFOKaLE._opyqAExW.display = 'none';
}
}
} catch (_TypLzJyb) {
console.error("加载缓存失败:", _TypLzJyb);
}
}
let _GyvbVtKz;
function _uzYJoZfK(_MBvXPQjK, _mCxoiXge = 'success', _FHuKcKCQ = 3000) {
if (_GyvbVtKz) clearTimeout(_GyvbVtKz);
_dNOcaaUE.innerHTML = _MBvXPQjK;
let _esNKkAgF = 'var(--success-_ZByYaVjC)';
if (_mCxoiXge === 'error') _esNKkAgF = 'var(--danger-_ZByYaVjC)';
if (_mCxoiXge === 'warning') _esNKkAgF = 'var(--warning-_ZByYaVjC)';
if (_mCxoiXge === 'info') _esNKkAgF = 'var(--primary-_ZByYaVjC)';
_dNOcaaUE._opyqAExW.backgroundColor = _esNKkAgF;
_dNOcaaUE.classList.add('show');
_GyvbVtKz = setTimeout(() => { _dNOcaaUE.classList.remove('show'); }, _FHuKcKCQ);
}
let _hlXQsUyl;
function _JfLGpnvR(_ZByYaVjC) {
const _ivYqUaRR = document.getElementById('background-_ivYqUaRR');
if (!_ivYqUaRR || !_ivYqUaRR.getContext) return;
_ivYqUaRR._opyqAExW.display = 'block';
const _lzkCHIQe = _ivYqUaRR.getContext('2d');
let _opxxaWJC, height, particles;
const _meOeYMOI = _YDKVjJJN(_ZByYaVjC);
if (!_meOeYMOI) return;
const _rXnUGwFN = `${_meOeYMOI.r},${_meOeYMOI.g},${_meOeYMOI.b}`;
const _sNDtuDTc = () => {
if (_hlXQsUyl) cancelAnimationFrame(_hlXQsUyl);
_opxxaWJC = _ivYqUaRR._opxxaWJC = window.innerWidth;
height = _ivYqUaRR.height = window.innerHeight;
particles = Array.from({ _IIkxJcSQ: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _opxxaWJC, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_SdzUfkzd();
};
const _SdzUfkzd = () => {
_lzkCHIQe.clearRect(0, 0, _opxxaWJC, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _opxxaWJC) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_lzkCHIQe.beginPath();
_lzkCHIQe.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_lzkCHIQe.fillStyle = `rgba(${_rXnUGwFN}, 0.5)`;
_lzkCHIQe.fill();
});
for (let _aYUntfEd = 0; _aYUntfEd < particles._IIkxJcSQ; _aYUntfEd++) {
for (let _oZrLHhIL = _aYUntfEd + 1; _oZrLHhIL < particles._IIkxJcSQ; _oZrLHhIL++) {
const _IcmjGTax = Math.hypot(particles[_aYUntfEd].x - particles[_oZrLHhIL].x, particles[_aYUntfEd].y - particles[_oZrLHhIL].y);
if (_IcmjGTax < 120) {
_lzkCHIQe.beginPath(); _lzkCHIQe.moveTo(particles[_aYUntfEd].x, particles[_aYUntfEd].y);
_lzkCHIQe.lineTo(particles[_oZrLHhIL].x, particles[_oZrLHhIL].y);
_lzkCHIQe.strokeStyle = `rgba(${_rXnUGwFN}, ${1 - _IcmjGTax/120})`;
_lzkCHIQe.stroke();
}
}
}
_hlXQsUyl = requestAnimationFrame(_SdzUfkzd);
};
window.addEventListener('resize', _sNDtuDTc, { passive: true });
_sNDtuDTc();
}
function _cdAHPuxH() {
if (_hlXQsUyl) cancelAnimationFrame(_hlXQsUyl);
const _ivYqUaRR = document.getElementById('background-_ivYqUaRR');
if (_ivYqUaRR && _ivYqUaRR.getContext('2d')) {
_ivYqUaRR.getContext('2d').clearRect(0, 0, _ivYqUaRR._opxxaWJC, _ivYqUaRR.height);
_ivYqUaRR._opyqAExW.display = 'none';
}
}
function _fjPPljJL() {
const _nGNMnQsf = document.getElementById('copySubscriptionBtn');
const _MdcLuZev = document.getElementById('_XFgntNHQ');
const _fRoVMrdl = document.getElementById('_XoJlRYwJ');
const _bUGqsfRj = document.getElementById('closeSubModalBtn');
const _TaKMqqWW = _fRoVMrdl.querySelector('.modal-close-btn');
_nGNMnQsf.addEventListener('click', () => {
if (!_UMaNRJIp || _xieKWdGl._IIkxJcSQ === 0) {
_uzYJoZfK('请先完成优选IP测试', 'warning');
return;
}
if (!_BeMMWJuy) {
_uzYJoZfK('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_chpTzINx._bRlKRqTQ) {
_uzYJoZfK('管理员未配置Sublink服务地址', 'error');
return;
}
const _oExLwqeR = 'https://' + window._ipvEvNap._ZvPPjLqC + '/' + _BeMMWJuy;
const _fvNBCbEW = {
coreEngine: _oExLwqeR + 'xr',
coreProfile: _oExLwqeR + 'si',
configProfile: _oExLwqeR + 'cl',
policyProfile: _oExLwqeR + 'su'
};
_MdcLuZev.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _mCxoiXge = btn.dataset.subType;
navigator.clipboard.writeText(_fvNBCbEW[_mCxoiXge]).then(() => {
_uzYJoZfK(`${_mCxoiXge.charAt(0).toUpperCase() + _mCxoiXge.slice(1)} 订阅链接已复制!`, 'success');
_MdcLuZev._opyqAExW.display = 'none';
});
};
});
_MdcLuZev.querySelectorAll('._TKxuAGIJ-btn').forEach(btn => {
btn.onclick = () => {
const _mCxoiXge = btn.dataset.subType;
const _qtrWMECG = document.getElementById('qrCodeImg');
const _oivNELJI = _fvNBCbEW[_mCxoiXge];
if (!_oivNELJI) return;
try {
const _TKxuAGIJ = qrcode(0, 'M');
_TKxuAGIJ.addData(_oivNELJI);
_TKxuAGIJ.make();
_qtrWMECG.src = _TKxuAGIJ.createDataURL(10, 2);
_fRoVMrdl._opyqAExW.display = 'flex';
} catch(_TypLzJyb) {
_uzYJoZfK('生成二维码失败', 'error');
console.error(_TypLzJyb);
}
};
});
_MdcLuZev._opyqAExW.display = 'flex';
});
_bUGqsfRj.addEventListener('click', () => { _MdcLuZev._opyqAExW.display = 'none'; });
_MdcLuZev.addEventListener('click', (_TypLzJyb) => { if(_TypLzJyb.target === _MdcLuZev) _MdcLuZev._opyqAExW.display = 'none'; });
_fRoVMrdl.addEventListener('click', (_TypLzJyb) => { if(_TypLzJyb.target === _fRoVMrdl) _fRoVMrdl._opyqAExW.display = 'none'; });
}
function _EQiANgRz() {
const _ZxXSBMKm = {
android: [
{ _XhjeVTvM: 'Karing', _YMMkdamO: 'KaringX/karing', _rwLveomY: ['apk', 'universal-release'] },
{ _XhjeVTvM: 'S' + 'ing-Box', _YMMkdamO: 'SagerNet/sing-box', _rwLveomY: ['android', 'universal'] },
{ _XhjeVTvM: 'V2' + 'rayNG', _YMMkdamO: '2dust/v2rayNG', _rwLveomY: ['apk', 'arm64-v8a'] },
{ _XhjeVTvM: '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: [
{ _XhjeVTvM: 'Karing', fixedUrl: 'https://_ruFMcBZc.apple.com/us/_CVXBHlen/karing/id6472431552?_mtccyHrb=iphone' },
{ _XhjeVTvM: 'S' + 'ing-Box', fixedUrl: 'https://_ruFMcBZc.apple.com/us/_CVXBHlen/sing-box-vt/id6673731168' },
{ _XhjeVTvM: 'Shadow' + 'rocket', fixedUrl: 'https://_ruFMcBZc.apple.com/us/_CVXBHlen/shadowrocket/id932747118' },
],
windows: [
{ _XhjeVTvM: 'Karing', _YMMkdamO: 'KaringX/karing', _rwLveomY: ['exe', 'x64-setup'] },
{ _XhjeVTvM: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _XhjeVTvM: 'C' + 'lashN', _YMMkdamO: '2dust/clashN', _rwLveomY: ['clashN.zip'] },
],
mac: [
{ _XhjeVTvM: 'Karing', fixedUrl: 'https://_ruFMcBZc.apple.com/us/_CVXBHlen/karing/id6472431552?_mtccyHrb=mac' },
{ _XhjeVTvM: 'S' + 'ing-Box', fixedUrl: 'https://_ruFMcBZc.apple.com/us/_CVXBHlen/sing-box-vt/id6673731168' },
]
};
function _aKugshVf(_vGtvnGlV) {
if (_chpTzINx.streamer._eeCieDoE && (_vGtvnGlV.includes('github.com') || _vGtvnGlV.includes('cdn.jsdelivr.net'))) {
return window._ipvEvNap.origin + '/' + _vGtvnGlV.replace('://', ':/');
}
return _vGtvnGlV;
}
async function _HnivoqdX(_YMMkdamO, _rwLveomY) {
try {
const _oSLywggo = await fetch(_aKugshVf(`https://api.github.com/repos/${_YMMkdamO}/releases/latest`));
if (!_oSLywggo.ok) return null;
const _YtKORMAW = await _oSLywggo.json();
for (const _UFbLfrib of _rwLveomY) {
const _YhvhVegG = _YtKORMAW.assets.find(a => a._XhjeVTvM.toLowerCase().includes(_UFbLfrib.toLowerCase()));
if (_YhvhVegG) return _YhvhVegG.browser_download_url;
}
return null;
} catch (_TypLzJyb) { return null; }
}
async function _mKhHCsFO(_mtccyHrb) {
const _JcWfxMak = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_mtccyHrb];
_sVOtZryN.querySelector('#appModalTitle').textContent = `${_JcWfxMak} 客户端下载`;
const _okWeDtIG = _sVOtZryN.querySelector('#appModalBody');
_okWeDtIG.innerHTML = '<span>正在获取最新版本...</span>';
_sVOtZryN._opyqAExW.display = 'flex';
const _ruFMcBZc = _ZxXSBMKm[_mtccyHrb];
let _XdcCXKqC = '';
for (const _CVXBHlen of _ruFMcBZc) {
let _ZfWvmNPk = '';
if (_CVXBHlen.fixedUrl) {
_ZfWvmNPk = `<a href="${_aKugshVf(_CVXBHlen.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_CVXBHlen.fixedUrl.split('/').pop()}</a>`;
} else if (_CVXBHlen._YMMkdamO) {
const _vGtvnGlV = await _HnivoqdX(_CVXBHlen._YMMkdamO, _CVXBHlen._rwLveomY);
if (_vGtvnGlV) {
_ZfWvmNPk = `<a href="${_aKugshVf(_vGtvnGlV)}" target="_blank" rel="noopener noreferrer">${_vGtvnGlV.split('/').pop()}</a>`;
} else {
_ZfWvmNPk = '<span>获取失败,请稍后重试。</span>';
}
}
_XdcCXKqC += `<div class="_CVXBHlen-list-_TvtziHCp"><span class="_CVXBHlen-_XhjeVTvM">${_CVXBHlen._XhjeVTvM}</span><div class="_CVXBHlen-links">${_ZfWvmNPk}</div></div>`;
}
_okWeDtIG.innerHTML = _XdcCXKqC;
}
document.querySelectorAll('._CVXBHlen-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _mKhHCsFO(button.dataset._mtccyHrb));
});
_sVOtZryN.querySelector('.modal-close-btn').addEventListener('click', () => { _sVOtZryN._opyqAExW.display = 'none'; });
_sVOtZryN.addEventListener('click', (_TypLzJyb) => { if (_TypLzJyb.target === _sVOtZryN) _sVOtZryN._opyqAExW.display = 'none'; });
}
function _bBnzEiHf(_uMcZxgqC, _HApRpOpq) {
let _aYUntfEd, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_XdcCXKqC");
for (_aYUntfEd = 0; _aYUntfEd < tabcontent._IIkxJcSQ; _aYUntfEd++) {
tabcontent[_aYUntfEd]._opyqAExW.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_aYUntfEd = 0; _aYUntfEd < tablinks._IIkxJcSQ; _aYUntfEd++) {
tablinks[_aYUntfEd].className = tablinks[_aYUntfEd].className.replace(" active", "");
}
document.getElementById(_HApRpOpq)._opyqAExW.display = "block";
_uMcZxgqC.currentTarget.className += " active";
}
function _QpcjgoBK() {
const _tYDBspkd = document.createElement('div');
_tYDBspkd._WMHQbbce = 'tooltip-popup';
document._jWmkrTWC.appendChild(_tYDBspkd);
document.addEventListener('click', function(_TypLzJyb) {
const _BRYUxzLb = _TypLzJyb.target.closest('.tooltip-_BRYUxzLb');
if (_BRYUxzLb) {
const _oivNELJI = _BRYUxzLb.dataset.tooltip;
_tYDBspkd.textContent = _oivNELJI;
const _oCPHudFd = _BRYUxzLb.getBoundingClientRect();
_tYDBspkd._opyqAExW.display = 'block';
let _EFAdJLCL = _oCPHudFd.bottom + window.scrollY + 5;
let _NgyAzyuD = _oCPHudFd._NgyAzyuD + window.scrollX;
_tYDBspkd._opyqAExW._EFAdJLCL = `${_EFAdJLCL}px`;
_tYDBspkd._opyqAExW._NgyAzyuD = `${_NgyAzyuD}px`;
const _tkkbFvMn = _tYDBspkd.getBoundingClientRect();
if (_tkkbFvMn.right > window.innerWidth - 10) {
_NgyAzyuD = window.innerWidth - _tkkbFvMn._opxxaWJC - 10;
}
if (_tkkbFvMn.bottom > window.innerHeight - 10) {
_EFAdJLCL = _oCPHudFd._EFAdJLCL + window.scrollY - _tkkbFvMn.height - 5;
}
_tYDBspkd._opyqAExW._EFAdJLCL = `${_EFAdJLCL}px`;
_tYDBspkd._opyqAExW._NgyAzyuD = `${_NgyAzyuD}px`;
_TypLzJyb.stopPropagation();
} else if (_tYDBspkd._opyqAExW.display === 'block') {
_tYDBspkd._opyqAExW.display = 'none';
}
});
}
const _opyqAExW = document.createElement('_opyqAExW');
_opyqAExW.textContent = `
.tab-button { background-_ZByYaVjC: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _ZByYaVjC: var(--_oivNELJI-light); font-size: 1em; }
.tab-button:hover { background-_ZByYaVjC: var(--border-_ZByYaVjC); }
.tab-button.active { _ZByYaVjC: var(--primary-_ZByYaVjC); border-bottom: 2px solid var(--primary-_ZByYaVjC); }
.tab-_XdcCXKqC { display: none; padding-_EFAdJLCL: 1rem; }
`;
document.head.appendChild(_opyqAExW);
window.addEventListener('DOMContentLoaded', _CdgriZuE);
</script>
</_jWmkrTWC></html>
`;
}