import { connect } from "cloudflare:sockets";
const _ZzDkrftE = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _lyqwlAQe = ["UpstreamAddress.SG.CMLiussss.net"];
const _LrZXbKiP = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _UAKelWiZ = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _AHZFqWFb = '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 _oVPWqEGs = '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 _LPIDxTHe(_mwoHcfHB) {
if (Array.isArray(_mwoHcfHB)) {
try {
return String.fromCharCode.apply(null, _mwoHcfHB);
} catch (_vzeKvyUe) {
return '';
}
}
return _mwoHcfHB;
}
function _OLhztshU(_UwLxvUhK) {
return /^[0-9a-_kEUgCfzc]{8}-[0-9a-_kEUgCfzc]{4}-[4][0-9a-_kEUgCfzc]{3}-[89ab][0-9a-_kEUgCfzc]{3}-[0-9a-_kEUgCfzc]{12}$/_IYkDmXNL.test(_UwLxvUhK);
}
const _HdyLrlof = "optimized_ips_v4";
const _gRDjVeSQ = "global_config_v4";
const _VnUuRyKy = "admin_password_v4";
const _PkuVAPEN = "live_results_temp_v1";
const _KxvHZTEx = "latest_sub_id_v1";
export default {
async fetch(_FwagrbYr, _UbhXYzzE, _iIKAUBYV) {
try {
if (!_UbhXYzzE.DB) {
const _wuuLjmGI = _ZYwOCRuV("D1 数据库 'DB' 未绑定。");
return new Response(_wuuLjmGI, { status: 503, _IsyuVVgp: { 'Content-Type': '_WymvkWHi/html;_umbKVliz=UTF-8' }});
}
_iIKAUBYV.waitUntil(
_UbhXYzzE.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_UeiSOQnr TEXT PRIMARY KEY, _mwoHcfHB TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_UwLxvUhK TEXT PRIMARY KEY, _jsLZsuJF TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_vzeKvyUe => console.error("DB Init Error:", _vzeKvyUe._eYQEWIkQ))
);
const _fOEGokng = new URL(_FwagrbYr._fOEGokng);
const _BYwFCSys = _fOEGokng.pathname;
const _jxvCJNBZ = _FwagrbYr._IsyuVVgp.get("Upgrade");
const _WPFXtADK = await _rBzwWiYS(_UbhXYzzE);
if (_WPFXtADK.websocketStreamer && _WPFXtADK.websocketStreamer._rtrtEvxp && _jxvCJNBZ && _jxvCJNBZ.toLowerCase() === "websocket") {
const _YkSrVJyg = _WPFXtADK.websocketStreamer._fOEGokng;
if (_YkSrVJyg && _YkSrVJyg.trim().startsWith('https://')) {
try {
const _nPdGLQQq = new Request(_YkSrVJyg.trim() + _fOEGokng.pathname + _fOEGokng.search, _FwagrbYr);
return await fetch(_nPdGLQQq);
} catch (_vzeKvyUe) {
return new Response(`Upstream WebSocket gateway failed: ${_vzeKvyUe._eYQEWIkQ}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_jxvCJNBZ && _jxvCJNBZ.toLowerCase() === "websocket") {
return await _LpWVjVCN(_FwagrbYr, _UbhXYzzE, _WPFXtADK);
}
const _ryzcDUCq = _BYwFCSys._NfUVawUF(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_ryzcDUCq) {
const [, _qhCPTxFi, typeSuffix] = _ryzcDUCq;
const _fUFowuJi = _WPFXtADK._fUFowuJi;
if (!_fUFowuJi || _fUFowuJi.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' } });
}
const _luyYeNTW = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _EFOQRbLD = _luyYeNTW[typeSuffix];
const _NFeajliA = _fUFowuJi.replace(/\/$/, '');
const _UFdIctrW = `${_fOEGokng.origin}/${_qhCPTxFi}`;
const _zfKGbzBP = `${_NFeajliA}/${_EFOQRbLD}?_WPFXtADK=${encodeURIComponent(_UFdIctrW)}`;
try {
const _DLKirGsB = await fetch(_zfKGbzBP, { _IsyuVVgp: { 'User-Agent': _FwagrbYr._IsyuVVgp.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _lLcTUuXI = new Headers(_DLKirGsB._IsyuVVgp);
_lLcTUuXI._qvoYxgpO('Access-Control-Allow-Origin', '*');
return new Response(_DLKirGsB._UVcwkNOD, { status: _DLKirGsB.status, statusText: _DLKirGsB.statusText, _IsyuVVgp: _lLcTUuXI });
} catch (_vzeKvyUe) {
return new Response(`获取上游订阅失败: ${_vzeKvyUe._eYQEWIkQ}`, { status: 502, _IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' } });
}
}
if (_BYwFCSys.startsWith('/https:/') || _BYwFCSys.startsWith('/http:/')) {
return _WyDdmfEZ(_FwagrbYr, _WPFXtADK);
}
if (_WPFXtADK.customSubPath && _WPFXtADK.customSubPath._rtrtEvxp && _WPFXtADK.customSubPath._BYwFCSys && _BYwFCSys === '/' + _WPFXtADK.customSubPath._BYwFCSys.trim()) {
const _aOaUXRJH = _UbhXYzzE.DB.prepare("SELECT _mwoHcfHB FROM kv_data WHERE _UeiSOQnr = ?").bind(_KxvHZTEx);
const { _VFJsWnNT } = await _aOaUXRJH.all();
const _BPmQwhCn = _VFJsWnNT._dMuZadRi > 0 ? _VFJsWnNT[0]._mwoHcfHB : null;
if (_BPmQwhCn) {
return _pmszjqYV({ _jpuLTABc: { _UwLxvUhK: _BPmQwhCn }, _fOEGokng: _FwagrbYr._fOEGokng }, _UbhXYzzE);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' } });
}
}
const _rwWavoWO = _BYwFCSys.split('/').filter(Boolean);
if (_rwWavoWO._dMuZadRi === 1 && !_BYwFCSys.startsWith('/api/')) {
const _qhCPTxFi = _rwWavoWO[0];
return _pmszjqYV({ _jpuLTABc: { _UwLxvUhK: _qhCPTxFi }, _fOEGokng: _FwagrbYr._fOEGokng }, _UbhXYzzE);
}
if (_BYwFCSys.startsWith('/api/')) {
if (_BYwFCSys === '/api/_WPFXtADK' && _FwagrbYr.method === 'POST') return _fjjoPDMz(_FwagrbYr, _UbhXYzzE, _iIKAUBYV);
if (_BYwFCSys === '/api/_qvoYxgpO-_UjsPUDqg') return _zuAEHNNM(_FwagrbYr, _UbhXYzzE);
if (_BYwFCSys === '/api/change-_UjsPUDqg') return _nWVknaRr(_FwagrbYr, _UbhXYzzE);
if (_BYwFCSys === '/api/verify-_UjsPUDqg') return _DORownbU(_FwagrbYr, _UbhXYzzE);
if (_BYwFCSys === '/api/verify-visitor-_UjsPUDqg' && _FwagrbYr.method === 'POST') return _bMlVcWRb(_FwagrbYr, _UbhXYzzE);
if (_BYwFCSys === '/api/cache-live-_VFJsWnNT' && _FwagrbYr.method === 'POST') return _dTCprawP(_FwagrbYr, _UbhXYzzE, _iIKAUBYV);
if (_BYwFCSys === '/api/get-_lxiQIxVD' && _FwagrbYr.method === 'POST') return _tPZYYgYI(_FwagrbYr, _UbhXYzzE);
if (_BYwFCSys === '/api/get-cached-_GsllkkcB') return _FlWdCdSA(_FwagrbYr, _UbhXYzzE);
if (_BYwFCSys === '/api/save-_GsllkkcB') return _ViVEDERP(_FwagrbYr, _UbhXYzzE, _iIKAUBYV);
if (_BYwFCSys === '/api/save-and-get-sub-_UwLxvUhK' && _FwagrbYr.method === 'POST') return _KKKYHLRq(_FwagrbYr, _UbhXYzzE);
if (_BYwFCSys.startsWith('/api/get-_yVSYRaCe/')) {
const _qhCPTxFi = _BYwFCSys.split('/').pop();
return _pmszjqYV({ _jpuLTABc: { _UwLxvUhK: _qhCPTxFi }, _fOEGokng: _FwagrbYr._fOEGokng }, _UbhXYzzE);
}
if (_BYwFCSys === '/api/_WPFXtADK' && _FwagrbYr.method === 'GET') return _UUOlYLpp(_UbhXYzzE);
if (_BYwFCSys === '/api/get-resolved-_GsllkkcB') return _pEGXWIBi(_FwagrbYr);
if (_BYwFCSys === '/api/parse-_GsllkkcB-from-_MRMmaQsl' && _FwagrbYr.method === 'POST') return _OIaaoiLe(_FwagrbYr, _UbhXYzzE);
if (_BYwFCSys === '/api/endpoints') return _yJTIiYUc(_FwagrbYr, _UbhXYzzE);
if (_BYwFCSys === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_BYwFCSys === '/_aZDjsUtb') return _nhauevih(_FwagrbYr, _UbhXYzzE);
if (_BYwFCSys === '/bing-wallpaper') return _wTQqVogn();
return _qyywTHZz(_FwagrbYr, _UbhXYzzE, _iIKAUBYV);
} catch (err) {
let _vzeKvyUe = err;
return new Response(_vzeKvyUe.toString(), { status: 500 });
}
}
};
const _FDmhZtIv = { 'Accept': '_WymvkWHi/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 _MCkrFwvO(_fOEGokng, _BDzlJtUb) {
const _rdaWrzdR = await fetch(_fOEGokng, { _IsyuVVgp: { ..._FDmhZtIv, 'Referer': _BDzlJtUb.referer } });
if (_rdaWrzdR.ok) return _rdaWrzdR._WymvkWHi();
return null;
}
async function _XCvpMosN(_fOEGokng, _BDzlJtUb) {
const _BqKmlokI = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_fOEGokng)}`;
const _rdaWrzdR = await fetch(_BqKmlokI, { _IsyuVVgp: { ..._FDmhZtIv, 'Referer': _BDzlJtUb.referer } });
if (!_rdaWrzdR.ok) return null;
const _UVcwkNOD = await _rdaWrzdR._WymvkWHi();
const _NfUVawUF = _UVcwkNOD._NfUVawUF(/<pre[^>]*>([\s\S]*?)<\/pre>/_IYkDmXNL);
return _NfUVawUF && _NfUVawUF[1] ? _NfUVawUF[1].replace(/&/g, '&') : null;
}
function _rNrnTUGr(_WUgmIbOG) {
let _UebNSPAi;
try {
_UebNSPAi = atob(_WUgmIbOG.replace(/\s/g, ''));
} catch (_vzeKvyUe) {
_UebNSPAi = _WUgmIbOG;
}
const _yVSYRaCe = _UebNSPAi.split(/[\s\n\r,]+/).filter(line => line.trim());
const _JELSXlKx = new Set();
const _secUXaHN = /@([^?#]+?):(\d+)/;
for (const _Ragnrjim of _yVSYRaCe) {
let _PcWYljEb = '';
let _WSfhREhx = '';
try {
if (_Ragnrjim.startsWith('vmess://')) {
const _wVeiQaQw = atob(_Ragnrjim.substring(8));
const _WPFXtADK = JSON.parse(_wVeiQaQw);
_PcWYljEb = _WPFXtADK.add;
_WSfhREhx = _WPFXtADK._WSfhREhx;
} else {
const _NfUVawUF = _Ragnrjim._NfUVawUF(_secUXaHN);
if (_NfUVawUF && _NfUVawUF[1] && _NfUVawUF[2]) {
_PcWYljEb = _NfUVawUF[1].replace(/[\[\]]/g, '');
_WSfhREhx = _NfUVawUF[2];
}
}
} catch (_vzeKvyUe) {
console.warn(`Could not parse _Ragnrjim: ${_Ragnrjim}`);
}
if (_PcWYljEb && _WSfhREhx) {
_JELSXlKx.add(`${_PcWYljEb}:${_WSfhREhx}`);
}
}
return Array.from(_JELSXlKx);
}
async function _DcvbKkVG(_LriZfJyQ) {
try {
const _rdaWrzdR = await fetch(_LriZfJyQ, { _IsyuVVgp: _FDmhZtIv });
if (!_rdaWrzdR.ok) {
console.error(`Failed to fetch subscription: ${_rdaWrzdR.status}`);
return [];
}
const _WUgmIbOG = await _rdaWrzdR._WymvkWHi();
return _rNrnTUGr(_WUgmIbOG);
} catch (error) {
console.error(`Error processing subscription ${_LriZfJyQ}:`, error);
return [];
}
}
async function _oVRaKhMk(_QjDvWijq) {
const _QoDrEPZe = _QjDvWijq.trim();
const _YlatCwsF = /^(vless|vmess|trojan|ss):\/\//.test(_QoDrEPZe);
const _sfNPioRa = (() => {
if (_QoDrEPZe._dMuZadRi < 20 || _QoDrEPZe.startsWith('http')) return false;
const _uNtiXgBc = _QoDrEPZe.replace(/\s/g, '');
if (_uNtiXgBc._dMuZadRi % 4 !== 0 && !_uNtiXgBc.includes('=')) return false;
try {
atob(_uNtiXgBc);
return true;
} catch (_vzeKvyUe) {
return false;
}
})();
if (_YlatCwsF || _sfNPioRa) {
return _rNrnTUGr(_QoDrEPZe).join('\n');
}
const _kLnMMlmV = [
'https://ipdb.api.030101.xyz/?_UXBTgEqt=bestcf&_gKXIPRnd=true',
'https://ipdb.api.030101.xyz/?_UXBTgEqt=bestproxy&_gKXIPRnd=true'
];
const _giAsMdgp = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_IYkDmXNL.test(_QjDvWijq) || _QjDvWijq.includes('?_AZzkPZSq=');
if (_giAsMdgp) {
const _GsllkkcB = await _DcvbKkVG(_QjDvWijq);
return _GsllkkcB.join('\n');
}
let _WUgmIbOG = '';
if (_kLnMMlmV.includes(_QjDvWijq)) {
_WUgmIbOG = await _MCkrFwvO(_QjDvWijq, { referer: _QjDvWijq });
if (!_WUgmIbOG || _WUgmIbOG._dMuZadRi < 8) {
_WUgmIbOG = await _XCvpMosN(_QjDvWijq, { referer: _QjDvWijq });
}
} else {
try {
const _BMYYiJVF = await fetch(_QjDvWijq, { _IsyuVVgp: { 'User-Agent': 'Cloudflare-Worker' } });
if (_BMYYiJVF.ok) {
_WUgmIbOG = await _BMYYiJVF._WymvkWHi();
} else {
console.warn(`Failed to fetch URL ${_QjDvWijq}: ${_BMYYiJVF.status}`);
}
} catch (_vzeKvyUe) {
console.error(`Error fetching URL ${_QjDvWijq}:`, _vzeKvyUe);
}
}
const _adrdbmCc = _rNrnTUGr(_WUgmIbOG);
if (_adrdbmCc._dMuZadRi > 0) {
return _adrdbmCc.join('\n');
}
return _WUgmIbOG || '';
}
async function _WyDdmfEZ(_FwagrbYr, _WPFXtADK) {
if (!_WPFXtADK.streamer._rtrtEvxp) {
return new Response('远程流功能未开启', { status: 403 });
}
const _fOEGokng = new URL(_FwagrbYr._fOEGokng);
const _LUJPluQa = _fOEGokng.pathname.substring(1).replace(':/', '://');
try {
const _zfKGbzBP = new URL(_LUJPluQa);
const _nekpaQcb = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_nekpaQcb.some(domain => _zfKGbzBP._PcWYljEb.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _BGPBMhhg = new Headers(_FwagrbYr._IsyuVVgp);
_BGPBMhhg._qvoYxgpO('Host', _zfKGbzBP._PcWYljEb);
_BGPBMhhg._qvoYxgpO('User-Agent', 'CF-Worker-Streamer/1.0');
const _nhgupjpx = await fetch(_zfKGbzBP.toString(), {
method: _FwagrbYr.method,
_IsyuVVgp: _BGPBMhhg,
_UVcwkNOD: _FwagrbYr._UVcwkNOD,
});
const _lLcTUuXI = new Headers(_nhgupjpx._IsyuVVgp);
_lLcTUuXI._qvoYxgpO('Access-Control-Allow-Origin', '*');
_lLcTUuXI._qvoYxgpO('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_lLcTUuXI._qvoYxgpO('Access-Control-Allow-Headers', '*');
_lLcTUuXI._qvoYxgpO('Cache-Control', 'public, max-age=86400');
_lLcTUuXI._qvoYxgpO('X-Streamer-Source', 'CF-Worker');
_lLcTUuXI.delete('_WUgmIbOG-security-policy');
_lLcTUuXI.delete('x-_WUgmIbOG-security-policy');
_lLcTUuXI.delete('x-webkit-csp');
return new Response(_nhgupjpx._UVcwkNOD, {
status: _nhgupjpx.status,
statusText: _nhgupjpx.statusText,
_IsyuVVgp: _lLcTUuXI,
});
} catch (_vzeKvyUe) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _LpWVjVCN(_FwagrbYr, _UbhXYzzE, _WPFXtADK) {
try {
const _TPCodatk = _WPFXtADK || await _rBzwWiYS(_UbhXYzzE);
const _PxldXXYB = (_TPCodatk.itemLink._JUAehFpn && _TPCodatk.itemLink._JUAehFpn[0]) || {};
const _KxzWNwql = _PxldXXYB['_AZzkPZSq'] || _LPIDxTHe(_ZzDkrftE);
if (!_OLhztshU(_KxzWNwql)) {
throw new Error("Configured user _oQbZxIBf is not valid.");
}
const _mWkQTfrZ = _TPCodatk.dataFeeds.universalFallbackAddress;
let _EIKjllEt = {};
const _uLdyHPye = _LPIDxTHe(_lyqwlAQe[0] || "");
if (_mWkQTfrZ) {
const [_IFBBpZwc, _WSfhREhx = '443'] = _mWkQTfrZ.split(':');
_EIKjllEt = { _IFBBpZwc, _WSfhREhx };
} else {
const [_IFBBpZwc, _WSfhREhx = '443'] = _uLdyHPye.split(':');
_EIKjllEt = { _IFBBpZwc, _WSfhREhx };
}
const _fOEGokng = new URL(_FwagrbYr._fOEGokng);
const _BYwFCSys = _fOEGokng.pathname;
let _IeFAcNyc = '';
const _ORlrmUqD = _fOEGokng.searchParams.get('remote');
if (_ORlrmUqD) {
_IeFAcNyc = atob(_ORlrmUqD);
} else if (_BYwFCSys.startsWith('/endpoint=')) {
_IeFAcNyc = _BYwFCSys.substring(10);
} else if (_BYwFCSys._dMuZadRi > 1 && _BYwFCSys.substring(1).includes('.')) {
_IeFAcNyc = _BYwFCSys.substring(1);
}
if (_IeFAcNyc) {
const [_IFBBpZwc, _WSfhREhx = '443'] = _IeFAcNyc.split(':');
_EIKjllEt = { _IFBBpZwc, _WSfhREhx };
}
return await _YadnJFTx(_FwagrbYr, _KxzWNwql, _EIKjllEt);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _YadnJFTx(_FwagrbYr, _oQbZxIBf, _EIKjllEt) {
const _RwfcVtzs = new WebSocketPair();
const [clientEnd, _WrOgettJ] = Object.values(_RwfcVtzs);
_WrOgettJ.accept();
let _UrVMPhiL = { _JerZvKnZ: null };
const _eAINRMWz = _FwagrbYr._IsyuVVgp.get("sec-websocket-protocol") || "";
const _BHEltgFL = _zvOjABMa(_WrOgettJ, _eAINRMWz);
_BHEltgFL.pipeTo(new WritableStream({
async write(chunk) {
if (_UrVMPhiL._JerZvKnZ) {
const _pBFXodFy = _UrVMPhiL._JerZvKnZ.writable.getWriter();
await _pBFXodFy.write(chunk);
_pBFXodFy.releaseLock();
return;
}
const { error, details } = await _SszpicXt(chunk, _oQbZxIBf);
if (error) {
throw new Error(details);
}
const _bstdwRtu = new Uint8Array([details._ptSBHVCl[0], 0]);
const _ETQKTyRW = chunk.slice(details.payloadIndex);
await _GqFBNXFS(_UrVMPhiL, details._rkWJaVzV, details._cqYGiUnn, _ETQKTyRW, _WrOgettJ, _bstdwRtu, _EIKjllEt);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_jLLIubut(_WrOgettJ);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _GqFBNXFS(_UrVMPhiL, _rkWJaVzV, _cqYGiUnn, _SzvUxpxJ, _QyIGIUpH, _bstdwRtu, _wWETgbnR) {
const _LQhdfrCi = async (_IFBBpZwc, _WSfhREhx) => {
let _exeturTX = _IFBBpZwc;
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(_IFBBpZwc)) {
_exeturTX = `${atob('d3d3Lg==')}${_IFBBpZwc}${atob('LnNzbGlwLmlv')}`;
}
const _JerZvKnZ = connect({ _PcWYljEb: _exeturTX, _WSfhREhx });
_UrVMPhiL._JerZvKnZ = _JerZvKnZ;
const _pBFXodFy = _JerZvKnZ.writable.getWriter();
await _pBFXodFy.write(_SzvUxpxJ);
_pBFXodFy.releaseLock();
return _JerZvKnZ;
};
const _tbiwikeq = async () => {
if (!_wWETgbnR._IFBBpZwc) return;
console.log(`Direct connection failed, falling back to gateway: ${_wWETgbnR._IFBBpZwc}`);
const _oThblzWG = await _LQhdfrCi(_wWETgbnR._IFBBpZwc, parseInt(_wWETgbnR._WSfhREhx, 10));
_oThblzWG.closed.catch(() => {}).finally(() => _jLLIubut(_QyIGIUpH));
_rKgEexgJ(_oThblzWG, _QyIGIUpH, _bstdwRtu, null);
};
try {
const _HsXRZOpZ = await _LQhdfrCi(_rkWJaVzV, _cqYGiUnn);
_rKgEexgJ(_HsXRZOpZ, _QyIGIUpH, _bstdwRtu, _tbiwikeq);
} catch (err) {
console.error("Primary connection failed:", err);
await _tbiwikeq();
}
}
function _zvOjABMa(_WrOgettJ, _eAINRMWz) {
let _tDAYFtwt = false;
return new ReadableStream({
start(_wLXKOLrB) {
_WrOgettJ.addEventListener("_eYQEWIkQ", (event) => { if (_tDAYFtwt) return; _wLXKOLrB.enqueue(event._jsLZsuJF); });
_WrOgettJ.addEventListener("close", () => { _jLLIubut(_WrOgettJ); if (_tDAYFtwt) return; _wLXKOLrB.close(); });
_WrOgettJ.addEventListener("error", (err) => _wLXKOLrB.error(err));
if (_eAINRMWz) {
try {
const _xCGFnjqT = atob(_eAINRMWz.replace(/-/g, "+").replace(/_/g, "/"));
_wLXKOLrB.enqueue(Uint8Array.from(_xCGFnjqT, c => c.charCodeAt(0))._RoSbhxYT);
} catch (_vzeKvyUe) { console.error("Failed to decode early _jsLZsuJF:", _vzeKvyUe); }
}
},
cancel() { _tDAYFtwt = true; _jLLIubut(_WrOgettJ); },
});
}
async function _SszpicXt(_RoSbhxYT, _oQbZxIBf) {
if (_RoSbhxYT.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _ptSBHVCl = new Uint8Array(_RoSbhxYT.slice(0, 1));
const _nfDMDwkO = _sDNljAOD(new Uint8Array(_RoSbhxYT.slice(1, 17)));
if (_nfDMDwkO !== _oQbZxIBf) return { error: true, details: "Invalid _oQbZxIBf" };
const _dFvppiyd = new Uint8Array(_RoSbhxYT.slice(17, 18))[0];
const _DSwqRHfQ = new Uint8Array(_RoSbhxYT.slice(18 + _dFvppiyd, 19 + _dFvppiyd))[0];
if (_DSwqRHfQ !== 1) return { error: true, details: `Unsupported _DSwqRHfQ: ${_DSwqRHfQ}` };
const _YOpbHGOn = 19 + _dFvppiyd;
const _cqYGiUnn = new DataView(_RoSbhxYT.slice(_YOpbHGOn, _YOpbHGOn + 2)).getUint16(0);
let _EfsXaYhV = _YOpbHGOn + 2;
const _EFfSaQgL = new Uint8Array(_RoSbhxYT.slice(_EfsXaYhV, _EfsXaYhV + 1))[0];
let _epODEeKF = 0;
let _kZTzGACI = _EfsXaYhV + 1;
let _rkWJaVzV = "";
switch (_EFfSaQgL) {
case 1: _epODEeKF = 4; _rkWJaVzV = new Uint8Array(_RoSbhxYT.slice(_kZTzGACI, _kZTzGACI + _epODEeKF)).join("."); break;
case 2: _epODEeKF = new Uint8Array(_RoSbhxYT.slice(_kZTzGACI, _kZTzGACI + 1))[0]; _kZTzGACI++; _rkWJaVzV = new TextDecoder().decode(_RoSbhxYT.slice(_kZTzGACI, _kZTzGACI + _epODEeKF)); break;
case 3: _epODEeKF = 16; const _TzljeRWg = new DataView(_RoSbhxYT.slice(_kZTzGACI, _kZTzGACI + _epODEeKF)); const _SGotdwrR = []; for (let _IYkDmXNL = 0; _IYkDmXNL < 8; _IYkDmXNL++) _SGotdwrR.push(_TzljeRWg.getUint16(_IYkDmXNL * 2).toString(16)); _rkWJaVzV = _SGotdwrR.join(":"); break;
default: return { error: true, details: `Invalid _FvxvxSJl _UXBTgEqt: ${_EFfSaQgL}` };
}
if (!_rkWJaVzV) return { error: true, details: "Target _IFBBpZwc is empty" };
return { error: false, details: { _rkWJaVzV, _cqYGiUnn, _ptSBHVCl, payloadIndex: _kZTzGACI + _epODEeKF } };
}
async function _rKgEexgJ(_JerZvKnZ, _QyIGIUpH, _TaEYOPrW, _cdxbobdm) {
let _CGaFRAzb = _TaEYOPrW;
let _KXsSnomD = false;
let _LVousFfx = _JerZvKnZ._BHEltgFL.pipeTo(new WritableStream({
write(chunk) {
_KXsSnomD = true;
if (_QyIGIUpH.readyState !== 1) throw new Error("Channel is not open");
if (_CGaFRAzb) {
const _vCrlbHkS = new Uint8Array(_CGaFRAzb.byteLength + chunk.byteLength);
_vCrlbHkS._qvoYxgpO(new Uint8Array(_CGaFRAzb));
_vCrlbHkS._qvoYxgpO(new Uint8Array(chunk), _CGaFRAzb.byteLength);
_QyIGIUpH.send(_vCrlbHkS._RoSbhxYT);
_CGaFRAzb = null;
} else {
_QyIGIUpH.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _QyIGIUpH error:", err._eYQEWIkQ);
});
await _LVousFfx;
if (!_KXsSnomD && _cdxbobdm) {
_cdxbobdm();
}
}
function _jLLIubut(_QyIGIUpH) {
try { if (_QyIGIUpH.readyState === 1 || _QyIGIUpH.readyState === 2) _QyIGIUpH.close(); } catch (_vzeKvyUe) {}
}
const _kXpncvWU = Array.from({ _dMuZadRi: 256 }, (_, _IYkDmXNL) => (_IYkDmXNL + 256).toString(16).slice(1));
function _sDNljAOD(_LaMegmLY, offset = 0) {
return (
_kXpncvWU[_LaMegmLY[offset]] + _kXpncvWU[_LaMegmLY[offset + 1]] + _kXpncvWU[_LaMegmLY[offset + 2]] + _kXpncvWU[_LaMegmLY[offset + 3]] + "-" +
_kXpncvWU[_LaMegmLY[offset + 4]] + _kXpncvWU[_LaMegmLY[offset + 5]] + "-" +
_kXpncvWU[_LaMegmLY[offset + 6]] + _kXpncvWU[_LaMegmLY[offset + 7]] + "-" +
_kXpncvWU[_LaMegmLY[offset + 8]] + _kXpncvWU[_LaMegmLY[offset + 9]] + "-" +
_kXpncvWU[_LaMegmLY[offset + 10]] + _kXpncvWU[_LaMegmLY[offset + 11]] +
_kXpncvWU[_LaMegmLY[offset + 12]] + _kXpncvWU[_LaMegmLY[offset + 13]] +
_kXpncvWU[_LaMegmLY[offset + 14]] + _kXpncvWU[_LaMegmLY[offset + 15]]
).toLowerCase();
}
let _WGkGtzJj = { "N/A":"未知" };
async function _qcHJyDzM(_fOEGokng, _FDDqMfzR, _cdxbobdm) {
try {
const _rdaWrzdR = await fetch(_fOEGokng, {
_IsyuVVgp: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_rdaWrzdR.ok) {
console.error(`获取 ${_fOEGokng} 失败: HTTP ${_rdaWrzdR.status}`);
return _cdxbobdm;
}
const _WymvkWHi = await _rdaWrzdR._WymvkWHi();
return _FDDqMfzR(_WymvkWHi);
} catch (error) {
console.error(`获取或解析 ${_fOEGokng} 时发生网络错误: ${error._eYQEWIkQ}`);
return _cdxbobdm;
}
}
function _gvVzxATk(_WymvkWHi) {
if (!_WymvkWHi) return [];
const _OFHivTyi = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _QtltJsOj = _WymvkWHi.split(/[\s,;#|]+/);
const _RmvbJxNk = [];
for (const _VHlJvGVj of _QtltJsOj) {
const _ITMevMpV = _VHlJvGVj.trim();
if (!_ITMevMpV) continue;
const _nMZiCHzx = _ITMevMpV.lastIndexOf(':');
let _IphTnyEB = _ITMevMpV;
if(_nMZiCHzx > _ITMevMpV.lastIndexOf(']')) {
const _lOcjegWt = _ITMevMpV.substring(_nMZiCHzx + 1);
if(!isNaN(_lOcjegWt) && _lOcjegWt._dMuZadRi > 0) {
_IphTnyEB = _ITMevMpV.substring(0, _nMZiCHzx);
}
}
if (_KSFScGkM.isValid(_IphTnyEB.replace(/[\[\]]/g, '')) || _OFHivTyi.test(_ITMevMpV)) {
_RmvbJxNk.push(_ITMevMpV);
}
}
return _RmvbJxNk;
}
function _LmJEnTkp(_WymvkWHi) {
if (!_WymvkWHi) return [];
return _WymvkWHi.split(/\s+/).filter(d => d.trim() !== '');
}
function _mLNyGZQR(_WymvkWHi) {
if (!_WymvkWHi) return { "N/A": "未知" };
try {
return JSON.parse(`{${_WymvkWHi}}`);
} catch (_vzeKvyUe) {
console.error("解析 _WGkGtzJj 失败:", _vzeKvyUe);
return { "N/A": "未知" };
}
}
const _KSFScGkM = {
isValid: (_aZDjsUtb) => _KSFScGkM.isIPv4(_aZDjsUtb) || _KSFScGkM.isIPv6(_aZDjsUtb),
isIPv4: (_aZDjsUtb) => {
if (typeof _aZDjsUtb !== 'string') return false;
const _SGotdwrR = _aZDjsUtb.split('.');
if (_SGotdwrR._dMuZadRi !== 4) return false;
return _SGotdwrR.every(_pHAEwZUK => {
const _GzIvwYUA = parseInt(_pHAEwZUK, 10);
return !isNaN(_GzIvwYUA) && _GzIvwYUA >= 0 && _GzIvwYUA <= 255 && String(_GzIvwYUA) === _pHAEwZUK;
});
},
isIPv6: (_aZDjsUtb) => {
if (typeof _aZDjsUtb !== '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]))$/_IYkDmXNL.test(_aZDjsUtb);
},
toLong4: (_aZDjsUtb) => _aZDjsUtb.split('.').reduce((acc, octet, _IYkDmXNL) => acc + (parseInt(octet) << (8*(3-_IYkDmXNL))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_aZDjsUtb) => {
try {
const _JuTHHtAf = _aZDjsUtb.split('/')[0];
const _SGotdwrR = _JuTHHtAf.split('::');
if (_SGotdwrR._dMuZadRi > 2) return 0n;
let _mVNFJTwQ = [];
if (_SGotdwrR[0]) {
_mVNFJTwQ = _SGotdwrR[0].split(':');
}
let _WNzKSHQq = [];
if (_SGotdwrR._dMuZadRi > 1 && _SGotdwrR[1]) {
_WNzKSHQq = _SGotdwrR[1].split(':');
}
if (_mVNFJTwQ._dMuZadRi + _WNzKSHQq._dMuZadRi > 8) return 0n;
const _TiyqlXqg = 8 - (_mVNFJTwQ._dMuZadRi + _WNzKSHQq._dMuZadRi);
const _UfUWCqAy = [
..._mVNFJTwQ,
...Array(_TiyqlXqg).fill('0'),
..._WNzKSHQq
].map(_pHAEwZUK => _pHAEwZUK || '0');
while(_UfUWCqAy._dMuZadRi < 8) {
_UfUWCqAy.push('0');
}
let _wwVCNwwL = 0n;
for (const _pHAEwZUK of _UfUWCqAy) {
if (_pHAEwZUK._dMuZadRi > 4) return 0n;
const _mwoHcfHB = BigInt('0x' + _pHAEwZUK);
_wwVCNwwL = (_wwVCNwwL << 16n) | _mwoHcfHB;
}
return _wwVCNwwL;
} catch(_vzeKvyUe) {
return 0n;
}
},
fromBigInt6: (_wwVCNwwL) => {
if (typeof _wwVCNwwL !== '_wwVCNwwL' || _wwVCNwwL < 0n) return null;
const _SGotdwrR = [];
for (let _IYkDmXNL = 0; _IYkDmXNL < 8; _IYkDmXNL++) {
_SGotdwrR.unshift((_wwVCNwwL & 0xFFFFn).toString(16));
_wwVCNwwL >>= 16n;
}
let _ABnbcSWy = { start: -1, _zTMKpMfT: 0 };
let _aCekumWK = { start: -1, _zTMKpMfT: 0 };
for (let _IYkDmXNL = 0; _IYkDmXNL < 8; _IYkDmXNL++) {
if (_SGotdwrR[_IYkDmXNL] === '0') {
if (_aCekumWK.start === -1) _aCekumWK.start = _IYkDmXNL;
_aCekumWK._zTMKpMfT++;
} else {
if (_aCekumWK._zTMKpMfT > _ABnbcSWy._zTMKpMfT) _ABnbcSWy = { ..._aCekumWK };
_aCekumWK = { start: -1, _zTMKpMfT: 0 };
}
}
if (_aCekumWK._zTMKpMfT > _ABnbcSWy._zTMKpMfT) _ABnbcSWy = { ..._aCekumWK };
if (_ABnbcSWy._zTMKpMfT > 1) {
_SGotdwrR.splice(_ABnbcSWy.start, _ABnbcSWy._zTMKpMfT, '');
if (_ABnbcSWy.start === 0) _SGotdwrR.unshift('');
if (_ABnbcSWy.start + _ABnbcSWy._zTMKpMfT === 8) _SGotdwrR.push('');
}
return _SGotdwrR.join(':');
},
cidrToRange: (cidr, _nIctAOcS = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _wjSGYrcS = parseInt(bitsStr, 10);
const _GsllkkcB = new Set();
if (_KSFScGkM.isIPv4(range)) {
if (isNaN(_wjSGYrcS) || _wjSGYrcS < 8 || _wjSGYrcS > 32) return [];
if (_wjSGYrcS === 32) return [range];
const _SpveovVZ = _KSFScGkM.toLong4(range);
const _kLyipGjk = (0xFFFFFFFF << (32 - _wjSGYrcS)) >>> 0;
const _hfyqcHps = _SpveovVZ & _kLyipGjk;
const _BaiYnbTy = 1 << (32 - _wjSGYrcS);
if (_BaiYnbTy <= 2) return [];
const _ScNIVZtE = Math.min(_nIctAOcS, _BaiYnbTy - 2);
let _GuSVsPqX = 0;
while (_GsllkkcB.size < _ScNIVZtE && _GuSVsPqX < _ScNIVZtE * 5) {
const _XcIZJCFj = Math.floor(Math.random() * (_BaiYnbTy - 2)) + 1;
_GsllkkcB.add(_KSFScGkM.fromLong4((_hfyqcHps + _XcIZJCFj) >>> 0));
_GuSVsPqX++;
}
return Array.from(_GsllkkcB);
} else if (_KSFScGkM.isIPv6(range)) {
if (isNaN(_wjSGYrcS) || _wjSGYrcS < 16 || _wjSGYrcS > 128) return [];
if (_wjSGYrcS === 128) return [range];
const _yrKSlpDk = _KSFScGkM.toBigInt6(range);
const _kLyipGjk = (2n ** BigInt(128 - _wjSGYrcS) - 1n);
const _hfyqcHps = _yrKSlpDk & ~_kLyipGjk;
const _qmtINvqt = 2n ** BigInt(128 - _wjSGYrcS);
if (_qmtINvqt <= 2n) return [];
let _GuSVsPqX = 0;
while (_GsllkkcB.size < _nIctAOcS && _GuSVsPqX < _nIctAOcS * 5) {
const _QVVzuPFP = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_QVVzuPFP);
let _HYvrMbcN = 0n;
for (const _gvLWctEj of _QVVzuPFP) {
_HYvrMbcN = (_HYvrMbcN << 8n) | BigInt(_gvLWctEj);
}
const _XcIZJCFj = _HYvrMbcN % (_qmtINvqt - 2n) + 1n;
_GsllkkcB.add(_KSFScGkM.fromBigInt6(_hfyqcHps + _XcIZJCFj));
_GuSVsPqX++;
}
return Array.from(_GsllkkcB);
}
return [];
} catch(_vzeKvyUe) {
console.error(`CIDR to range failed for ${cidr}:`, _vzeKvyUe);
return [];
}
}
};
function _wWBHiKXQ(_apTxiHos, _rnHNVGld) {
const _ghYQrezC = {};
const _gtDzgYOw = Object._gtDzgYOw(_rnHNVGld);
const _SGotdwrR = _gtDzgYOw.map(_UeiSOQnr => {
const _pmAqbGxj = _apTxiHos * (_rnHNVGld[_UeiSOQnr] / 100);
return { _UeiSOQnr, _nIctAOcS: Math.floor(_pmAqbGxj), remainder: _pmAqbGxj - Math.floor(_pmAqbGxj) };
});
let _PtDvorbP = _SGotdwrR.reduce((acc, _pHAEwZUK) => acc + _pHAEwZUK._nIctAOcS, 0);
_SGotdwrR.sort((a, b) => b.remainder - a.remainder);
let _xcNHBjnG = _apTxiHos - _PtDvorbP;
for (let _IYkDmXNL = 0; _IYkDmXNL < _xcNHBjnG; _IYkDmXNL++) {
_SGotdwrR[_IYkDmXNL % _SGotdwrR._dMuZadRi]._nIctAOcS++;
}
for (const _pHAEwZUK of _SGotdwrR) {
_ghYQrezC[_pHAEwZUK._UeiSOQnr] = _pHAEwZUK._nIctAOcS;
}
return _ghYQrezC;
}
async function _sSSkuqRv(_UbhXYzzE) {
const _aOaUXRJH = _UbhXYzzE.DB.prepare("SELECT _mwoHcfHB FROM kv_data WHERE _UeiSOQnr = ?").bind(_VnUuRyKy);
const { _VFJsWnNT } = await _aOaUXRJH.all();
return _VFJsWnNT._dMuZadRi > 0 ? _VFJsWnNT[0]._mwoHcfHB : null;
}
async function _fEWdfIwb(_UbhXYzzE, _UjsPUDqg) {
const _aOaUXRJH = _UbhXYzzE.DB.prepare(
"INSERT INTO kv_data (_UeiSOQnr, _mwoHcfHB) VALUES (?, ?) ON CONFLICT(_UeiSOQnr) DO UPDATE SET _mwoHcfHB = excluded._mwoHcfHB"
);
await _aOaUXRJH.bind(_VnUuRyKy, _UjsPUDqg).run();
}
async function _DORownbU(_FwagrbYr, _UbhXYzzE) {
const { _UjsPUDqg } = await _FwagrbYr.json();
const _ZifDXOCu = await _sSSkuqRv(_UbhXYzzE);
if (_ZifDXOCu === _UjsPUDqg) {
return _aUXHsBmB({ success: true });
}
return _aUXHsBmB({ success: false, _eYQEWIkQ: '密码错误' }, 401);
}
async function _bMlVcWRb(_FwagrbYr, _UbhXYzzE) {
const _obKotQzd = await _rBzwWiYS(_UbhXYzzE);
if (!_obKotQzd.visitorPassword || !_obKotQzd.visitorPassword._rtrtEvxp) {
return _aUXHsBmB({ success: true });
}
try {
const { _UjsPUDqg } = await _FwagrbYr.json();
const _zmEPgdvF = _obKotQzd.visitorPassword._UjsPUDqg;
if (_zmEPgdvF && _UjsPUDqg === _zmEPgdvF) {
return _aUXHsBmB({ success: true });
}
return _aUXHsBmB({ success: false, _eYQEWIkQ: '访客密码错误' }, 401);
} catch (_vzeKvyUe) {
return _aUXHsBmB({ success: false, _eYQEWIkQ: '无效请求' }, 400);
}
}
async function _zuAEHNNM(_FwagrbYr, _UbhXYzzE) {
const _eNvhlCHD = await _sSSkuqRv(_UbhXYzzE);
if (_eNvhlCHD) {
return _aUXHsBmB({ success: false, _eYQEWIkQ: "密码已设置,无法重复初始化。" }, 403);
}
const { _UjsPUDqg } = await _FwagrbYr.json();
if (!_UjsPUDqg || _UjsPUDqg._dMuZadRi < 6) {
return _aUXHsBmB({ success: false, _eYQEWIkQ: "密码长度不能少于6位。" }, 400);
}
await _fEWdfIwb(_UbhXYzzE, _UjsPUDqg);
return _aUXHsBmB({ success: true, _eYQEWIkQ: "初始密码设置成功!请刷新页面并登录。" });
}
async function _nWVknaRr(_FwagrbYr, _UbhXYzzE) {
const { _zDvKlXNR, _pvCpsFXk } = await _FwagrbYr.json();
const _ZifDXOCu = await _sSSkuqRv(_UbhXYzzE);
if (_ZifDXOCu !== _zDvKlXNR) {
return _aUXHsBmB({ success: false, _eYQEWIkQ: "旧密码错误。" }, 403);
}
if (!_pvCpsFXk || _pvCpsFXk._dMuZadRi < 6) {
return _aUXHsBmB({ success: false, _eYQEWIkQ: "新密码长度不能少于6位。" }, 400);
}
await _fEWdfIwb(_UbhXYzzE, _pvCpsFXk);
return _aUXHsBmB({ success: true, _eYQEWIkQ: "密码修改成功!" });
}
function _NtZoYRbh() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_fUFowuJi: '',
api: {
_rtrtEvxp: true,
_eYQEWIkQ: '维护中...',
},
ispFilter: { _rtrtEvxp: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_rtrtEvxp: true
},
websocketStreamer: {
_rtrtEvxp: true,
_fOEGokng: 'https://snippets.neib.cn'
},
cloudStorage: {
_rtrtEvxp: true
},
visitorPassword: {
_rtrtEvxp: false,
_UjsPUDqg: '',
},
customSubPath: {
_rtrtEvxp: false,
_BYwFCSys: 'latest',
},
subscriptionId: {
_dMuZadRi: 8,
_umbKVliz: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_rtrtEvxp: true,
template: 'vless://{_AZzkPZSq}@{_aZDjsUtb}:{_WSfhREhx}?encryption=none&security=tls&sni={_IFBBpZwc}&fp=random&_UXBTgEqt=ws&_IFBBpZwc={_IFBBpZwc}&_BYwFCSys={_BYwFCSys}#{_LNRsGfZM}',
selectionMode: 'first',
_JUAehFpn: [
{ _LNRsGfZM: '默认配置', _IFBBpZwc: '', '_AZzkPZSq': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _BYwFCSys: '/?ed=2560' }
],
_VFTCKnaq: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_rtrtEvxp: false,
_WymvkWHi: '',
_WpucuzIG: 5
},
marquee: {
_rtrtEvxp: false,
_WymvkWHi: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_rtrtEvxp: true,
sources: [
{ _ESTsaTiw: 'CF官方IPV4', _GsllkkcB: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _DKBTBPHa: false, _rtrtEvxp: true, _McxEmfZN: 20 },
{ _ESTsaTiw: 'CF官方IPV6', _GsllkkcB: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _DKBTBPHa: false, _rtrtEvxp: true, _McxEmfZN: 20 },
{ _ESTsaTiw: '反代优选0', _GsllkkcB: 'https://wvs.sosorg.nyc.mn/sub?_AZzkPZSq=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_UXBTgEqt=ws&_IFBBpZwc=ss.nzvrn.com&_BYwFCSys=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _DKBTBPHa: false, _rtrtEvxp: true, _McxEmfZN: 30 },
{ _ESTsaTiw: '官方优选1', _GsllkkcB: 'https://ipdb.api.030101.xyz/?_UXBTgEqt=bestcf&_gKXIPRnd=true', _DKBTBPHa: false, _rtrtEvxp: true, _McxEmfZN: 10 },
{ _ESTsaTiw: '反代优选2', _GsllkkcB: 'https://ipdb.api.030101.xyz/?_UXBTgEqt=bestproxy&_gKXIPRnd=true', _DKBTBPHa: false, _rtrtEvxp: true, _McxEmfZN: 5 },
{ _ESTsaTiw: '官方优选2', _GsllkkcB: 'https://addressesapi.090227.xyz/_aZDjsUtb.164746.xyz', _DKBTBPHa: false, _rtrtEvxp: true, _McxEmfZN: 10 },
{ _ESTsaTiw: '官方优选3', _GsllkkcB: 'https://cfxr.eu.org/getSub?_IFBBpZwc=snipaste.huggy.qzz.io', _DKBTBPHa: false, _rtrtEvxp: true, _McxEmfZN: 5 },
{ _ESTsaTiw: '官方优选4', _GsllkkcB: 'https://addressesapi.090227.xyz/CloudFlareYes', _DKBTBPHa: false, _rtrtEvxp: true, _McxEmfZN: 10 }
]
},
customNodes: {
_rtrtEvxp: 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 _NIaoxJkb(_kLYpIYOj, _ryjHlkQf) {
if (!_kLYpIYOj) return _ryjHlkQf;
const _RnotFjis = { ..._ryjHlkQf };
for (const _UeiSOQnr in _ryjHlkQf) {
if (_kLYpIYOj.hasOwnProperty(_UeiSOQnr)) {
if (typeof _kLYpIYOj[_UeiSOQnr] === 'object' && _kLYpIYOj[_UeiSOQnr] !== null && !Array.isArray(_kLYpIYOj[_UeiSOQnr]) && typeof _ryjHlkQf[_UeiSOQnr] === 'object' && _ryjHlkQf[_UeiSOQnr] !== null && !Array.isArray(_ryjHlkQf[_UeiSOQnr])) {
_RnotFjis[_UeiSOQnr] = _NIaoxJkb(_kLYpIYOj[_UeiSOQnr], _ryjHlkQf[_UeiSOQnr]);
} else {
_RnotFjis[_UeiSOQnr] = _kLYpIYOj[_UeiSOQnr];
}
}
}
return _RnotFjis;
}
async function _rBzwWiYS(_UbhXYzzE) {
try {
const _aOaUXRJH = _UbhXYzzE.DB.prepare("SELECT _mwoHcfHB FROM kv_data WHERE _UeiSOQnr = ?").bind(_gRDjVeSQ);
const { _VFJsWnNT } = await _aOaUXRJH.all();
const _zSBFTfne = _VFJsWnNT._dMuZadRi > 0 ? _VFJsWnNT[0]._mwoHcfHB : null;
const _ETFPOSPN = _zSBFTfne ? JSON.parse(_zSBFTfne) : {};
return _NIaoxJkb(_ETFPOSPN, _NtZoYRbh());
} catch (_vzeKvyUe) {
console.error("无法从D1获取或解析全局配置:", _vzeKvyUe);
return _NtZoYRbh();
}
}
async function _UUOlYLpp(_UbhXYzzE) {
const _WPFXtADK = await _rBzwWiYS(_UbhXYzzE);
return _aUXHsBmB(_WPFXtADK);
}
async function _fjjoPDMz(_FwagrbYr, _UbhXYzzE, _iIKAUBYV) {
try {
const { _WPFXtADK, adminPassword } = await _FwagrbYr.json();
const _ZifDXOCu = await _sSSkuqRv(_UbhXYzzE);
if (_ZifDXOCu !== adminPassword) {
return _aUXHsBmB({ success: false, _eYQEWIkQ: "管理员密码错误" }, 403);
}
const _aOaUXRJH = _UbhXYzzE.DB.prepare(
"INSERT INTO kv_data (_UeiSOQnr, _mwoHcfHB) VALUES (?, ?) ON CONFLICT(_UeiSOQnr) DO UPDATE SET _mwoHcfHB = excluded._mwoHcfHB"
);
const _bESkzHnQ = _aOaUXRJH.bind(_gRDjVeSQ, JSON.stringify(_WPFXtADK)).run();
_iIKAUBYV.waitUntil(_bESkzHnQ);
return _aUXHsBmB({ success: true, _eYQEWIkQ: "配置已成功保存!" });
} catch (_vzeKvyUe) {
return _aUXHsBmB({ success: false, _eYQEWIkQ: `保存失败: ${_vzeKvyUe._eYQEWIkQ}` }, 500);
}
}
async function _wTQqVogn() {
const _PjjexPZd = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _tjOkksSL = await fetch(_PjjexPZd);
const _FLpmPuLX = await _tjOkksSL.json();
const _ujBqhshG = 'https://www.bing.com' + _FLpmPuLX.images[0]._fOEGokng;
return fetch(_ujBqhshG);
} catch (_vzeKvyUe) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _VfpwbhNy(_aZDjsUtb) {
try {
const _rdaWrzdR = await fetch(`http://_aZDjsUtb-api.com/json/${_aZDjsUtb}?fields=status,_gKXIPRnd,countryCode,_UmebUcxD&lang=zh-CN`);
if (_rdaWrzdR.ok) {
const _jsLZsuJF = await _rdaWrzdR.json();
if (_jsLZsuJF.status === 'success' && (_jsLZsuJF.countryCode || _jsLZsuJF._gKXIPRnd)) {
let _UmebUcxD = _jsLZsuJF._UmebUcxD || '未知';
if (_UmebUcxD.toLowerCase().includes('cloudflare')) {
_UmebUcxD = 'CloudFlare';
}
return {
_ESTsaTiw: _WGkGtzJj[_jsLZsuJF.countryCode] || _jsLZsuJF._gKXIPRnd || _jsLZsuJF.countryCode,
_UmebUcxD: _UmebUcxD
};
}
}
} catch (_vzeKvyUe) {}
try {
const _rdaWrzdR = await fetch(`https://api._aZDjsUtb.sb/geoip/${_aZDjsUtb}`);
if (_rdaWrzdR.ok) {
const _jsLZsuJF = await _rdaWrzdR.json();
if (_jsLZsuJF.country_code || _jsLZsuJF._gKXIPRnd) {
let _UmebUcxD = _jsLZsuJF._UmebUcxD || '未知';
if (_UmebUcxD.toLowerCase().includes('cloudflare')) {
_UmebUcxD = 'CloudFlare';
}
return {
_ESTsaTiw: _WGkGtzJj[_jsLZsuJF.country_code] || _jsLZsuJF._gKXIPRnd || _jsLZsuJF.country_code,
_UmebUcxD: _UmebUcxD
};
}
}
} catch (_vzeKvyUe) {}
return { _ESTsaTiw: '未知', _UmebUcxD: '未知' };
}
async function _tPZYYgYI(_FwagrbYr, _UbhXYzzE) {
try {
const { _GsllkkcB } = await _FwagrbYr.json();
if (!Array.isArray(_GsllkkcB)) {
return _aUXHsBmB({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _ImbPjoSl = _GsllkkcB.map(_aZDjsUtb => _VfpwbhNy(_aZDjsUtb).then(_lxiQIxVD => ({ _aZDjsUtb, ..._lxiQIxVD })));
const _VFJsWnNT = await Promise.all(_ImbPjoSl);
return _aUXHsBmB(_VFJsWnNT);
} catch (_vzeKvyUe) {
return _aUXHsBmB({ error: `获取地理位置失败: ${_vzeKvyUe._eYQEWIkQ}` }, 500);
}
}
async function _FlWdCdSA(_FwagrbYr, _UbhXYzzE) {
const _WPFXtADK = await _rBzwWiYS(_UbhXYzzE);
if (!_WPFXtADK.cloudStorage._rtrtEvxp) {
return _aUXHsBmB({ _VFJsWnNT: [], generatedBy: null });
}
try {
const _aOaUXRJH = _UbhXYzzE.DB.prepare("SELECT _mwoHcfHB FROM kv_data WHERE _UeiSOQnr = ?").bind(_HdyLrlof);
const { _VFJsWnNT } = await _aOaUXRJH.all();
const _fnhJpkWj = _VFJsWnNT._dMuZadRi > 0 ? _VFJsWnNT[0]._mwoHcfHB : null;
const _gQAmJoXJ = _fnhJpkWj ? JSON.parse(_fnhJpkWj) : null;
return _aUXHsBmB(_gQAmJoXJ || { _VFJsWnNT: [], generatedBy: null });
} catch (_vzeKvyUe) {
console.error("从D1读取缓存IP失败:", _vzeKvyUe);
return _aUXHsBmB({ _VFJsWnNT: [], generatedBy: null });
}
}
async function _ViVEDERP(_FwagrbYr, _UbhXYzzE, _iIKAUBYV) {
const _WPFXtADK = await _rBzwWiYS(_UbhXYzzE);
if (!_WPFXtADK.cloudStorage._rtrtEvxp) {
return _aUXHsBmB({ success: true, _eYQEWIkQ: "云端存储已禁用,不保存结果。" });
}
const _MiHYhayc = _FwagrbYr._IsyuVVgp.get('CF-Connecting-IP') || "未知IP";
const _gKXIPRnd = _FwagrbYr.cf?._gKXIPRnd || "未知";
const _ORgOIQgk = _FwagrbYr.cf?._ORgOIQgk || "";
let _ZkYLKFLR = _WGkGtzJj[_gKXIPRnd] || _gKXIPRnd;
if (_ORgOIQgk && _ORgOIQgk !== "未知城市" && _ORgOIQgk !== _gKXIPRnd) _ZkYLKFLR = `${_ZkYLKFLR} ${_WGkGtzJj[_ORgOIQgk] || _ORgOIQgk}`;
const _veHjHAPg = {
_aZDjsUtb: _WUVkYlFP(_MiHYhayc),
_ESTsaTiw: _ZkYLKFLR.trim(),
time: _VajyXDhR()
};
try {
const _fGsQODDT = await _FwagrbYr.json();
if (!Array.isArray(_fGsQODDT)) return _aUXHsBmB({ error: "无效数据格式" }, 400);
const _zJpPFojB = _fGsQODDT.map(_fSQsXIKa => ({
_aZDjsUtb: String(_fSQsXIKa._aZDjsUtb || ''),
_WSfhREhx: _fSQsXIKa._WSfhREhx ? parseInt(_fSQsXIKa._WSfhREhx, 10) : undefined,
_peNpuZEk: parseInt(_fSQsXIKa._peNpuZEk, 10),
_ESTsaTiw: typeof _fSQsXIKa._ESTsaTiw === 'string' ? _fSQsXIKa._ESTsaTiw.substring(0, 50) : 'N/A',
_UmebUcxD: typeof _fSQsXIKa._UmebUcxD === 'string' ? _fSQsXIKa._UmebUcxD.substring(0, 100) : 'N/A'
}));
const _rWayJvHI = {
generatedBy: _veHjHAPg,
_VFJsWnNT: _zJpPFojB
};
const _aGjWSiOk = _UbhXYzzE.DB.prepare(
"INSERT INTO kv_data (_UeiSOQnr, _mwoHcfHB) VALUES (?, ?) ON CONFLICT(_UeiSOQnr) DO UPDATE SET _mwoHcfHB = excluded._mwoHcfHB"
).bind(_HdyLrlof, JSON.stringify(_rWayJvHI)).run();
if (_WPFXtADK.telegram.bot_token && _WPFXtADK.telegram.chat_id) {
const _BfopKemS = _zJpPFojB.map(r => `${r._aZDjsUtb} ~ ${r._ESTsaTiw}`).join('\n');
const _mYYpObNd = `优选完成!\n来源: ${_veHjHAPg._aZDjsUtb} (${_veHjHAPg._ESTsaTiw})\n时间: ${_veHjHAPg.time}\n\n结果:\n${_BfopKemS}`;
const _NqCYHavP = `https://api.telegram.org/bot${_WPFXtADK.telegram.bot_token}/sendMessage?chat_id=${_WPFXtADK.telegram.chat_id}&_WymvkWHi=${encodeURIComponent(_mYYpObNd)}`;
const _PBovReJB = fetch(_NqCYHavP).catch(_vzeKvyUe => console.error("Telegram结果通知失败:", _vzeKvyUe));
_iIKAUBYV.waitUntil(Promise.all([_aGjWSiOk, _PBovReJB]));
} else {
_iIKAUBYV.waitUntil(_aGjWSiOk);
}
return _aUXHsBmB({ success: true, _eYQEWIkQ: "结果已保存" });
} catch (_vzeKvyUe) {
return _aUXHsBmB({ error: "D1写入失败", _eYQEWIkQ: _vzeKvyUe._eYQEWIkQ }, 500);
}
}
async function _dTCprawP(_FwagrbYr, _UbhXYzzE, _iIKAUBYV) {
try {
const _DDXhsdBc = await _FwagrbYr.json();
if (!Array.isArray(_DDXhsdBc)) return _aUXHsBmB({ error: "无效数据格式" }, 400);
const _rWayJvHI = {
_VFJsWnNT: _DDXhsdBc
};
const _aOaUXRJH = _UbhXYzzE.DB.prepare(
"INSERT INTO kv_data (_UeiSOQnr, _mwoHcfHB) VALUES (?, ?) ON CONFLICT(_UeiSOQnr) DO UPDATE SET _mwoHcfHB = excluded._mwoHcfHB"
);
const _bESkzHnQ = _aOaUXRJH.bind(_PkuVAPEN, JSON.stringify(_rWayJvHI)).run();
_iIKAUBYV.waitUntil(_bESkzHnQ);
return _aUXHsBmB({ success: true });
} catch (_vzeKvyUe) {
return _aUXHsBmB({ error: "D1写入临时缓存失败", _eYQEWIkQ: _vzeKvyUe._eYQEWIkQ }, 500);
}
}
function _xTTfmWOT(_dMuZadRi, _umbKVliz) {
let _eYItWoTE = '';
const _iANsJZOD = _umbKVliz._dMuZadRi;
for (let _IYkDmXNL = 0; _IYkDmXNL < _dMuZadRi; _IYkDmXNL++) {
_eYItWoTE += _umbKVliz.charAt(Math.floor(Math.random() * _iANsJZOD));
}
return _eYItWoTE;
}
async function _KKKYHLRq(_FwagrbYr, _UbhXYzzE) {
try {
const _fGsQODDT = await _FwagrbYr.json();
if (!Array.isArray(_fGsQODDT) || _fGsQODDT._dMuZadRi === 0) {
return _aUXHsBmB({ error: "无效或空的IP列表" }, 400);
}
const _WPFXtADK = await _rBzwWiYS(_UbhXYzzE);
const _ffwejLdh = _WPFXtADK.subscriptionId || { _dMuZadRi: 8, _umbKVliz: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _qhCPTxFi;
let _dFDgkCaK = false;
let _GuSVsPqX = 0;
const _xnYhzmat = 10;
while (!_dFDgkCaK && _GuSVsPqX < _xnYhzmat) {
_qhCPTxFi = _xTTfmWOT(_ffwejLdh._dMuZadRi, _ffwejLdh._umbKVliz);
const { _VFJsWnNT } = await _UbhXYzzE.DB.prepare("SELECT _UwLxvUhK FROM optimized_results WHERE _UwLxvUhK = ?").bind(_qhCPTxFi).all();
if (_VFJsWnNT._dMuZadRi === 0) {
_dFDgkCaK = true;
}
_GuSVsPqX++;
}
if (!_dFDgkCaK) {
return _aUXHsBmB({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _jiYSOMQL = JSON.stringify({ _GsllkkcB: _fGsQODDT });
await _UbhXYzzE.DB.prepare(
"INSERT INTO optimized_results (_UwLxvUhK, _jsLZsuJF) VALUES (?, ?)"
).bind(_qhCPTxFi, _jiYSOMQL).run();
await _UbhXYzzE.DB.prepare(
"INSERT INTO kv_data (_UeiSOQnr, _mwoHcfHB) VALUES (?, ?) ON CONFLICT(_UeiSOQnr) DO UPDATE SET _mwoHcfHB = excluded._mwoHcfHB"
).bind(_KxvHZTEx, _qhCPTxFi).run();
return _aUXHsBmB({ success: true, _UwLxvUhK: _qhCPTxFi });
} catch (_vzeKvyUe) {
return _aUXHsBmB({ error: "保存优选结果失败", _eYQEWIkQ: _vzeKvyUe._eYQEWIkQ }, 500);
}
}
async function _pmszjqYV(_FwagrbYr, _UbhXYzzE) {
try {
const _qhCPTxFi = _FwagrbYr._jpuLTABc._UwLxvUhK;
if (!_qhCPTxFi) {
return new Response("缺少结果ID", { status: 400 });
}
const _eYItWoTE = await _UbhXYzzE.DB.prepare("SELECT _jsLZsuJF FROM optimized_results WHERE _UwLxvUhK = ?").bind(_qhCPTxFi).first();
if (!_eYItWoTE) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _jsLZsuJF = JSON.parse(_eYItWoTE._jsLZsuJF);
let _BfopKemS = _jsLZsuJF._GsllkkcB;
const _WPFXtADK = await _rBzwWiYS(_UbhXYzzE);
if (_WPFXtADK.customNodes && _WPFXtADK.customNodes._rtrtEvxp && _WPFXtADK.customNodes.list) {
const _eyhUTAnx = _WPFXtADK.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _WgKXBwpJ = _eyhUTAnx.map(_Ragnrjim => {
let _FvxvxSJl = _Ragnrjim;
let _WSfhREhx = undefined;
let _LNRsGfZM = null;
if (_FvxvxSJl.includes('@')) {
const _SGotdwrR = _FvxvxSJl.split('@');
_LNRsGfZM = _SGotdwrR.pop();
_FvxvxSJl = _SGotdwrR.join('@');
}
if (_FvxvxSJl.includes('#')) {
const _SGotdwrR = _FvxvxSJl.split('#');
const _lOcjegWt = _SGotdwrR.pop();
if (!isNaN(_lOcjegWt) && _lOcjegWt.trim() !== '') {
_WSfhREhx = parseInt(_lOcjegWt, 10);
}
_FvxvxSJl = _SGotdwrR.join('#');
}
return {
_aZDjsUtb: _FvxvxSJl,
_WSfhREhx: _WSfhREhx,
_ESTsaTiw: _LNRsGfZM || _FvxvxSJl,
_UmebUcxD: '自定义'
};
});
_BfopKemS.unshift(..._WgKXBwpJ);
}
const { itemLink } = _WPFXtADK;
const _mqRxsMyO = new URL(_FwagrbYr._fOEGokng)._PcWYljEb;
let _NiijCpRS;
if (_WPFXtADK.websocketStreamer && _WPFXtADK.websocketStreamer._rtrtEvxp) {
if (!itemLink || !itemLink._rtrtEvxp || !itemLink._JUAehFpn || itemLink._JUAehFpn._dMuZadRi === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_NiijCpRS = _BfopKemS.map((_fSQsXIKa, _MZXmGEAE) => {
let _LNRsGfZM;
if (_fSQsXIKa._UmebUcxD === '自定义') {
_LNRsGfZM = `${_MZXmGEAE + 1} - ${_fSQsXIKa._ESTsaTiw}`;
} else {
_LNRsGfZM = `${_MZXmGEAE + 1} - ${_fSQsXIKa._ESTsaTiw || '未知'}`;
if (!_fSQsXIKa._UmebUcxD || !_fSQsXIKa._UmebUcxD.toLowerCase().includes('cloudflare')) {
_LNRsGfZM += '(反代)';
}
}
const _goQfDyAy = _KSFScGkM.isIPv6(_fSQsXIKa._aZDjsUtb) ? `[${_fSQsXIKa._aZDjsUtb}]` : _fSQsXIKa._aZDjsUtb;
const _WSfhREhx = _fSQsXIKa._WSfhREhx || 443;
const _EfxLeadY = itemLink._JUAehFpn[0];
const _wENUjCGQ = _EfxLeadY._AZzkPZSq || '';
const _AZzkPZSq = (_wENUjCGQ && _OLhztshU(_wENUjCGQ)) ? _wENUjCGQ : crypto.randomUUID();
const _BYwFCSys = '/snippets?_aZDjsUtb=endpointAddress:_WSfhREhx(443)&nat64=6to4';
const _IFBBpZwc = _EfxLeadY._IFBBpZwc || _mqRxsMyO;
const _jpuLTABc = new URLSearchParams({
security: 'tls',
_UXBTgEqt: 'ws',
_IFBBpZwc: _IFBBpZwc,
sni: _IFBBpZwc,
fp: 'random'
});
return `vless://${_AZzkPZSq}@${_goQfDyAy}:${_WSfhREhx}?${_jpuLTABc.toString()}&_BYwFCSys=${encodeURIComponent(encodeURIComponent(_BYwFCSys))}#${encodeURIComponent(_LNRsGfZM)}`;
});
} else {
if (!itemLink || !itemLink._rtrtEvxp || !itemLink._JUAehFpn || itemLink._JUAehFpn._dMuZadRi === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _EfxLeadY = itemLink._JUAehFpn[0];
const { _IFBBpZwc, _AZzkPZSq, _BYwFCSys } = _EfxLeadY;
_NiijCpRS = _BfopKemS.map((_fSQsXIKa, _MZXmGEAE) => {
let _LNRsGfZM;
if (_fSQsXIKa._UmebUcxD === '自定义') {
_LNRsGfZM = `${_MZXmGEAE + 1} - ${_fSQsXIKa._ESTsaTiw}`;
} else {
_LNRsGfZM = `${_MZXmGEAE + 1} - ${_fSQsXIKa._ESTsaTiw || '未知'}`;
if (!_fSQsXIKa._UmebUcxD || !_fSQsXIKa._UmebUcxD.toLowerCase().includes('cloudflare')) {
_LNRsGfZM += '(反代)';
}
}
const _goQfDyAy = _KSFScGkM.isIPv6(_fSQsXIKa._aZDjsUtb) ? `[${_fSQsXIKa._aZDjsUtb}]` : _fSQsXIKa._aZDjsUtb;
const _WSfhREhx = _fSQsXIKa._WSfhREhx || 443;
const _jpuLTABc = new URLSearchParams({
security: 'tls',
_UXBTgEqt: 'ws',
_IFBBpZwc: _IFBBpZwc || _mqRxsMyO,
sni: _IFBBpZwc || _mqRxsMyO,
fp: 'random'
});
return `vless://${_AZzkPZSq}@${_goQfDyAy}:${_WSfhREhx}?${_jpuLTABc.toString()}&_BYwFCSys=${encodeURIComponent(encodeURIComponent(_BYwFCSys || ''))}#${encodeURIComponent(_LNRsGfZM)}`;
});
}
const _GqSJGGIz = _NiijCpRS.join('\n');
const _MJTJzXXV = btoa(_GqSJGGIz);
return new Response(_MJTJzXXV, {
_IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' }
});
} catch (_vzeKvyUe) {
return new Response(`生成节点列表失败: ${_vzeKvyUe._eYQEWIkQ}`, { status: 500 });
}
}
async function _pEGXWIBi(_FwagrbYr) {
try {
const { _kmzVsfbZ, _UXBTgEqt } = await _FwagrbYr.json();
if (!Array.isArray(_kmzVsfbZ)) {
return new Response('Invalid _kmzVsfbZ list', { status: 400 });
}
const _JhFXkbyo = _kmzVsfbZ.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _fOEGokng = `https://cloudflare-dns.com/dns-query?_LNRsGfZM=${encodeURIComponent(domain.trim())}&_UXBTgEqt=${_UXBTgEqt || 'A'}`;
return fetch(_fOEGokng, { _IsyuVVgp: { 'Accept': 'application/dns-json' } })
.then(_rdaWrzdR => _rdaWrzdR.json())
.then(_jsLZsuJF => (_jsLZsuJF.Answer ? _jsLZsuJF.Answer.map(a => a._jsLZsuJF) : []))
.catch(() => []);
});
const _mAokfijM = (await Promise.all(_JhFXkbyo)).flat();
const _iiljtjNW = [...new Set(_mAokfijM)];
if (_iiljtjNW._dMuZadRi === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_iiljtjNW.join('\n'), { _IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._eYQEWIkQ}`, { status: 500 });
}
}
async function _OIaaoiLe(_FwagrbYr, _UbhXYzzE) {
try {
const { _MRMmaQsl } = await _FwagrbYr.json();
if (!Array.isArray(_MRMmaQsl)) {
return _aUXHsBmB({ error: "Invalid input, expected an object with a '_MRMmaQsl' array." }, 400);
}
const _elFuqQzH = new Set();
const _fkGEyGFq = _MRMmaQsl.map(_fOEGokng =>
_oVRaKhMk(_fOEGokng)
.then(_WymvkWHi => {
if (!_WymvkWHi) return;
const _QtltJsOj = _WymvkWHi.split(/[\s,;|]+/);
for (const _VHlJvGVj of _QtltJsOj) {
const _ITMevMpV = _VHlJvGVj.trim();
if (_ITMevMpV) {
_elFuqQzH.add(_ITMevMpV);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_fOEGokng}:`, err);
})
);
await Promise.all(_fkGEyGFq);
return _aUXHsBmB({ _GsllkkcB: Array.from(_elFuqQzH) });
} catch (_vzeKvyUe) {
return _aUXHsBmB({ error: `Failed to process URLs: ${_vzeKvyUe._eYQEWIkQ}` }, 500);
}
}
async function _nhauevih(_FwagrbYr, _UbhXYzzE) {
const _WPFXtADK = await _rBzwWiYS(_UbhXYzzE);
if (!_WPFXtADK.api._rtrtEvxp) {
return new Response(_WPFXtADK.api._eYQEWIkQ || 'API is disabled.', { status: 503 });
}
try {
const _aOaUXRJH = _UbhXYzzE.DB.prepare("SELECT _mwoHcfHB FROM kv_data WHERE _UeiSOQnr = ?").bind(_HdyLrlof);
const { _VFJsWnNT: dbResults } = await _aOaUXRJH.all();
const _fnhJpkWj = dbResults._dMuZadRi > 0 ? dbResults[0]._mwoHcfHB : null;
const _gQAmJoXJ = _fnhJpkWj ? JSON.parse(_fnhJpkWj) : null;
if (!_gQAmJoXJ || !_gQAmJoXJ._VFJsWnNT || _gQAmJoXJ._VFJsWnNT._dMuZadRi === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' },
});
}
const _GsllkkcB = _gQAmJoXJ._VFJsWnNT.map(r => r._aZDjsUtb);
return new Response(_GsllkkcB.join('\n'), {
_IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' },
});
} catch (_vzeKvyUe) {
console.error("API /_aZDjsUtb 处理错误:", _vzeKvyUe);
return new Response(`API处理时出错: ${_vzeKvyUe._eYQEWIkQ}`, { status: 500 });
}
}
function _MebVHcuj(_eYItWoTE, _MZXmGEAE, _WPFXtADK, _mqRxsMyO) {
const { itemLink } = _WPFXtADK;
if (!itemLink || !itemLink._rtrtEvxp) return null;
const { template, _JUAehFpn, selectionMode, _VFTCKnaq } = itemLink;
if (!_JUAehFpn || _JUAehFpn._dMuZadRi === 0) return null;
let _yTpSGlBo;
if (selectionMode === 'random') {
_yTpSGlBo = _JUAehFpn[_MZXmGEAE % _JUAehFpn._dMuZadRi];
} else if (selectionMode === 'first') {
_yTpSGlBo = _JUAehFpn[0];
} else {
_yTpSGlBo = _JUAehFpn.find(s => s._LNRsGfZM === selectionMode) || _JUAehFpn[0];
}
if (!_yTpSGlBo) return null;
let _SXIpLcmk = template;
const _umyInlqj = _eYItWoTE._WSfhREhx || 443;
const _okIlXqqL = _KSFScGkM.isIPv6(_eYItWoTE._aZDjsUtb) ? `[${_eYItWoTE._aZDjsUtb}]` : _eYItWoTE._aZDjsUtb;
let _LNRsGfZM = `${_MZXmGEAE + 1} 、 ${_eYItWoTE._ESTsaTiw || '未知'}`;
if (!_eYItWoTE._UmebUcxD || !_eYItWoTE._UmebUcxD.toLowerCase().includes('cloudflare')) {
_LNRsGfZM += '(反代)';
}
let _IFBBpZwc = _yTpSGlBo._IFBBpZwc || _mqRxsMyO;
_SXIpLcmk = _SXIpLcmk.replace(/{_aZDjsUtb}/g, _okIlXqqL)
.replace(/{_WSfhREhx}/g, _umyInlqj)
.replace(/{_LNRsGfZM}/g, encodeURIComponent(_LNRsGfZM))
.replace(/{rank}/g, _MZXmGEAE + 1)
.replace(/{_ESTsaTiw}/g, encodeURIComponent(_eYItWoTE._ESTsaTiw || '未知'))
.replace(/{_UmebUcxD}/g, encodeURIComponent(_eYItWoTE._UmebUcxD || '未知'))
.replace(/{_IFBBpZwc}/g, encodeURIComponent(_IFBBpZwc))
.replace(/{_AZzkPZSq}/g, encodeURIComponent(_yTpSGlBo['_AZzkPZSq'] || ''))
.replace(/{_BYwFCSys}/g, encodeURIComponent(encodeURIComponent(_yTpSGlBo._BYwFCSys || '')));
if (_VFTCKnaq) {
_VFTCKnaq.forEach(field => {
const _tDtUdUBr = new RegExp('{' + field._LNRsGfZM + '}', 'g');
_SXIpLcmk = _SXIpLcmk.replace(_tDtUdUBr, encodeURIComponent(field._mwoHcfHB));
});
}
return _SXIpLcmk;
}
async function _yJTIiYUc(_FwagrbYr, _UbhXYzzE) {
const _WPFXtADK = await _rBzwWiYS(_UbhXYzzE);
if (!_WPFXtADK.itemLink._rtrtEvxp) {
return new Response("Item _SXIpLcmk feature is disabled.", { status: 503, _IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' } });
}
try {
const _aOaUXRJH = _UbhXYzzE.DB.prepare("SELECT _mwoHcfHB FROM kv_data WHERE _UeiSOQnr = ?").bind(_HdyLrlof);
const { _VFJsWnNT: dbResults } = await _aOaUXRJH.all();
const _fnhJpkWj = dbResults._dMuZadRi > 0 ? dbResults[0]._mwoHcfHB : null;
const _gQAmJoXJ = _fnhJpkWj ? JSON.parse(_fnhJpkWj) : null;
if (!_gQAmJoXJ || !_gQAmJoXJ._VFJsWnNT || _gQAmJoXJ._VFJsWnNT._dMuZadRi === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' },
});
}
const _mqRxsMyO = new URL(_FwagrbYr._fOEGokng)._PcWYljEb;
const _EMIvQYDC = _gQAmJoXJ._VFJsWnNT.map((_eYItWoTE, _MZXmGEAE) => {
return _MebVHcuj(_eYItWoTE, _MZXmGEAE, _WPFXtADK, _mqRxsMyO);
}).filter(Boolean);
if (_EMIvQYDC._dMuZadRi === 0) {
return new Response("Could not generate any _fSQsXIKa links from the available IPs.", {
status: 500,
_IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' },
});
}
return new Response(_EMIvQYDC.join('\n'), {
_IsyuVVgp: { 'Content-Type': '_WymvkWHi/plain; _umbKVliz=utf-8' },
});
} catch (_vzeKvyUe) {
console.error("API /api/endpoints error:", _vzeKvyUe);
return new Response(`Error processing API _FwagrbYr: ${_vzeKvyUe._eYQEWIkQ}`, { status: 500 });
}
}
async function _qyywTHZz(_FwagrbYr, _UbhXYzzE, _iIKAUBYV) {
const _MiHYhayc = _FwagrbYr._IsyuVVgp.get('CF-Connecting-IP') || "未知IP";
const [
_psZaOBdi,
_wZuqUOht,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_qcHJyDzM(_LrZXbKiP, _gvVzxATk, []),
_qcHJyDzM(_UAKelWiZ, _gvVzxATk, []),
_qcHJyDzM(_AHZFqWFb, _LmJEnTkp, []),
_qcHJyDzM(_oVPWqEGs, _mLNyGZQR, { "N/A": "未知" })
]);
_WGkGtzJj = fetchedCountryMap;
let _BiUkeXSz = false;
let _obKotQzd;
try {
const _UjsPUDqg = await _sSSkuqRv(_UbhXYzzE);
_BiUkeXSz = !!_UjsPUDqg;
_obKotQzd = await _rBzwWiYS(_UbhXYzzE);
} catch (_vzeKvyUe) {
if (_vzeKvyUe._eYQEWIkQ && _vzeKvyUe._eYQEWIkQ.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _NsMXCSqm = "CREATE TABLE IF NOT EXISTS kv_data (_UeiSOQnr TEXT PRIMARY KEY, _mwoHcfHB TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_UwLxvUhK TEXT PRIMARY KEY, _jsLZsuJF TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _UbhXYzzE.DB.exec(_NsMXCSqm);
console.log("数据表创建成功。");
_BiUkeXSz = false;
_obKotQzd = _NtZoYRbh();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._eYQEWIkQ}`, {
status: 500,
_IsyuVVgp: { 'Content-Type': '_WymvkWHi/html;_umbKVliz=UTF-8' }
});
}
} else {
let _wuuLjmGI = _ZYwOCRuV(_vzeKvyUe._eYQEWIkQ);
return new Response(_wuuLjmGI, { _IsyuVVgp: { 'Content-Type': '_WymvkWHi/html;_umbKVliz=UTF-8' } });
}
}
if (_obKotQzd.telegram.bot_token && _obKotQzd.telegram.chat_id) {
const _gKXIPRnd = _FwagrbYr.cf?._gKXIPRnd || "未知";
const _ORgOIQgk = _FwagrbYr.cf?._ORgOIQgk || "";
let _ZkYLKFLR = _WGkGtzJj[_gKXIPRnd] || _gKXIPRnd;
if (_ORgOIQgk && _ORgOIQgk !== "未知城市" && _ORgOIQgk !== _gKXIPRnd) _ZkYLKFLR = `${_ZkYLKFLR} ${_WGkGtzJj[_ORgOIQgk] || _ORgOIQgk}`;
const _aXLSvdmS = _VajyXDhR();
const _vhKMpCeC = _FwagrbYr._fOEGokng;
const _mYYpObNd = `访客: ${_MiHYhayc}\n位置: ${_ZkYLKFLR.trim()}\n时间: ${_aXLSvdmS}\n来自:${_vhKMpCeC}`;
const _NqCYHavP = `https://api.telegram.org/bot${_obKotQzd.telegram.bot_token}/sendMessage?chat_id=${_obKotQzd.telegram.chat_id}&_WymvkWHi=${encodeURIComponent(_mYYpObNd)}`;
_iIKAUBYV.waitUntil(fetch(_NqCYHavP).catch(_vzeKvyUe => console.error("Telegram通知失败:", _vzeKvyUe)));
}
let _PbGVmUfT = _RnFmtPwd();
const _oXJhXMHf = {
_WPFXtADK: _obKotQzd,
status: {
_BiUkeXSz: _BiUkeXSz,
}
};
_PbGVmUfT = _PbGVmUfT.replace('__PAGE_DATA_JSON__', JSON.stringify(_oXJhXMHf));
_PbGVmUfT = _PbGVmUfT.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_psZaOBdi));
_PbGVmUfT = _PbGVmUfT.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_wZuqUOht));
_PbGVmUfT = _PbGVmUfT.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_PbGVmUfT = _PbGVmUfT.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_WGkGtzJj));
return new Response(_PbGVmUfT, {
_IsyuVVgp: { 'Content-Type': '_WymvkWHi/html;_umbKVliz=UTF-8' },
});
}
function _aUXHsBmB(_UVcwkNOD, status = 200, _IsyuVVgp = {}) {
return new Response(JSON.stringify(_UVcwkNOD), {
status,
_IsyuVVgp: { 'Content-Type': 'application/json;_umbKVliz=UTF-8', ..._IsyuVVgp }
});
}
function _VajyXDhR(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 _WUVkYlFP(_aZDjsUtb) {
if (!_aZDjsUtb || typeof _aZDjsUtb !== 'string') return "无效IP";
if(_KSFScGkM.isIPv4(_aZDjsUtb)){
const _SGotdwrR = _aZDjsUtb.split('.');
if (_SGotdwrR._dMuZadRi === 4) return `${_SGotdwrR[0]}.*.*.${_SGotdwrR[3]}`;
}
if(_KSFScGkM.isIPv6(_aZDjsUtb)){
const _SGotdwrR = _aZDjsUtb.split(':');
if (_SGotdwrR._dMuZadRi > 2) return `${_SGotdwrR[0]}:...:${_SGotdwrR[_SGotdwrR._dMuZadRi - 1]}`;
}
return _aZDjsUtb;
}
function _ZYwOCRuV(_XQVzCYCB) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _umbKVliz="UTF-8"><title>需要设置</title>
<_bmKYpvrg>
_UVcwkNOD { font-family: sans-serif; background: #1a1a1a; _GdHBHXwl: #e0e0e0; display: flex; justify-_WUgmIbOG: center; align-items: center; height: 100vh; margin: 0; }
._cGAxlJwz { max-_YczQFvvT: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _GdHBHXwl: #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 { _GdHBHXwl: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_SbSXQkoH: 1rem; }
</_bmKYpvrg>
</head><_UVcwkNOD>
<div class="_cGAxlJwz">
<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>
${_XQVzCYCB ? `<div class="error"><strong>当前错误信息:</strong> ${_XQVzCYCB.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_UVcwkNOD></html>`;
}
function _RnFmtPwd() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _umbKVliz="UTF-8"> <meta _LNRsGfZM="viewport" _WUgmIbOG="_YczQFvvT=device-_YczQFvvT, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_SXIpLcmk 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>
<_bmKYpvrg>
:root { --primary-_GdHBHXwl: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_GdHBHXwl: #8c939d; --light-bg: #1A1C20; --_WUgmIbOG-bg: #25282E; --border-_GdHBHXwl: #40444C; --_WymvkWHi-_GdHBHXwl: #E0E0E0; --_WymvkWHi-light: #B0B0B0; --success-_GdHBHXwl: #30A46C; --danger-_GdHBHXwl: #DA3633; --warning-_GdHBHXwl: #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; }
_UVcwkNOD { font-family: var(--font-family-sans); background-_GdHBHXwl: var(--light-bg); _GdHBHXwl: var(--_WymvkWHi-_GdHBHXwl); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_GdHBHXwl 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_iqIUQVgp { position: fixed; _SbSXQkoH: 0; _AlZRebBN: 0; _YczQFvvT: 100%; height: 100%; z-_MZXmGEAE: -1; display: none; }
._KgqGLarC-_cGAxlJwz { max-_YczQFvvT: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_MZXmGEAE: 1; }
#_zUvxQboL { position: fixed; _SbSXQkoH: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_MZXmGEAE: 10; }
#marquee-_cGAxlJwz { overflow: hidden; white-space: nowrap; background-_GdHBHXwl: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _GdHBHXwl: var(--primary-_GdHBHXwl); padding: 0.5rem 0; margin-_SbSXQkoH: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_WymvkWHi { display: inline-block; padding-_AlZRebBN: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_TaEYOPrW { _WymvkWHi-align: center; margin-_SbSXQkoH: 1rem; margin-bottom: 2rem; }
_TaEYOPrW h1 { white-space: pre-wrap; font-size: 2.25em; _GdHBHXwl: var(--primary-_GdHBHXwl); font-weight: 700; _WymvkWHi-shadow: 0 0 10px rgba(var(--primary-_GdHBHXwl-rgb), 0.3); }
.card { background-_GdHBHXwl: 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-_GdHBHXwl); }
.progress-section #_wJXmabob { _YczQFvvT: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_GdHBHXwl: var(--border-_GdHBHXwl); overflow: hidden; }
.progress-section #_wJXmabob::-webkit-progress-_mwoHcfHB { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _WymvkWHi-align: center; margin-_SbSXQkoH: 0.75em; font-size: 0.95em; _GdHBHXwl: var(--_WymvkWHi-light); min-height: 1.5em; }
.section-_TaEYOPrW { display: flex; flex-wrap: wrap; justify-_WUgmIbOG: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_GdHBHXwl); gap: 1rem; }
.section-_TaEYOPrW h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _GdHBHXwl: var(--secondary-_GdHBHXwl); _WymvkWHi-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _YczQFvvT: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _YczQFvvT: 100%; border-collapse: collapse; margin-_SbSXQkoH: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_GdHBHXwl); padding: 0.8em; _WymvkWHi-align: _AlZRebBN; vertical-align: middle; white-space: nowrap; }
th { background-_GdHBHXwl: #2c3038; font-weight: 500; }
tbody tr:hover { background-_GdHBHXwl: #30333a; }
td._aZDjsUtb-_FvxvxSJl { font-weight: 500; font-family: var(--font-family-mono); _GdHBHXwl: var(--primary-_GdHBHXwl); }
td.ping-_mwoHcfHB { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _WymvkWHi-align: right; }
.btn { display: inline-flex; align-items: center; justify-_WUgmIbOG: center; font-weight: 500; _WymvkWHi-align: center; cursor: pointer; user-_JqkXEtMx: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _GdHBHXwl: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_AlZRebBN: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _GdHBHXwl: var(--primary-_GdHBHXwl); border: 1px solid var(--primary-_GdHBHXwl); }
.btn-outline:hover { background-_GdHBHXwl: var(--primary-_GdHBHXwl); _GdHBHXwl: var(--_WUgmIbOG-bg); }
._KgqGLarC-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._KgqGLarC-download-buttons .btn { _YczQFvvT: 100%; margin: 0; }
.tooltip-notification { position: fixed; _SbSXQkoH: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _GdHBHXwl: #fff; font-size: 0.95em; z-_MZXmGEAE: 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); }
#_cNUjZGUC, #_NgKTXDEM, #_sJkyyLeA, #_gbaZnBem, #_IWWtSXyk { display: none; position: fixed; z-_MZXmGEAE: 10000; _AlZRebBN: 0; _SbSXQkoH: 0; _YczQFvvT: 100%; height: 100%; background-_GdHBHXwl: rgba(0,0,0,0.6); justify-_WUgmIbOG: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_WUgmIbOG, ._KgqGLarC-modal-_WUgmIbOG { background-_GdHBHXwl: var(--_WUgmIbOG-bg); padding: 2rem; border: 1px solid var(--border-_GdHBHXwl); border-radius: var(--border-radius-md); _YczQFvvT: 95%; max-_YczQFvvT: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_gbaZnBem .modal-_WUgmIbOG { max-_YczQFvvT: 500px; }
.modal-_WUgmIbOG h3, ._KgqGLarC-modal-_TaEYOPrW h3 { margin-_SbSXQkoH: 0; margin-bottom: 1.5rem; _GdHBHXwl: var(--primary-_GdHBHXwl); _WymvkWHi-align: center; }
.modal-buttons { display: flex; justify-_WUgmIbOG: flex-end; gap: 1rem; margin-_SbSXQkoH: 2rem; border-_SbSXQkoH: 1px solid var(--border-_GdHBHXwl); padding-_SbSXQkoH: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_GdHBHXwl), rgba(0,0,0,0)); margin: 2rem 0; }
._KgqGLarC-modal-_TaEYOPrW { display: flex; justify-_WUgmIbOG: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_GdHBHXwl); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _GdHBHXwl: var(--_WymvkWHi-light); cursor: pointer; background: none; border: none; padding: 0; }
._KgqGLarC-list-_fSQsXIKa { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_GdHBHXwl); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._KgqGLarC-_LNRsGfZM { font-size: 1.1em; font-weight: 600; }
._KgqGLarC-links a { display: block; _GdHBHXwl: var(--primary-_GdHBHXwl); _WymvkWHi-decoration: none; margin-_SbSXQkoH: 0.5rem; word-break: break-all; }
._KgqGLarC-links a:hover { _WymvkWHi-decoration: underline; }
._KgqGLarC-links span { _GdHBHXwl: var(--_WymvkWHi-light); }
#visitorPasswordPrompt { _WymvkWHi-align: center; }
#visitorPasswordPrompt h3 { _GdHBHXwl: var(--primary-_GdHBHXwl); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _GdHBHXwl: var(--_WymvkWHi-light); margin-bottom: 1.5rem; }
._UjsPUDqg-input-group { display: flex; gap: 10px; max-_YczQFvvT: 400px; margin: 0 auto; }
._UjsPUDqg-input-group input { flex-grow: 1; _WymvkWHi-align: center; }
._UjsPUDqg-input-group .btn { margin-_AlZRebBN: 0; }
._VFJsWnNT-actions-_cGAxlJwz { _WymvkWHi-align: center; margin-bottom: 1.5rem; }
._VFJsWnNT-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._VFJsWnNT-api-buttons .btn { margin: 0; _YczQFvvT: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_WUgmIbOG 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 _JqkXEtMx, .form-grid-control textarea { _YczQFvvT: 100%; background-_GdHBHXwl: var(--light-bg); border: 1px solid var(--border-_GdHBHXwl); border-radius: var(--border-radius-sm); _GdHBHXwl: var(--_WymvkWHi-_GdHBHXwl); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_GdHBHXwl 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _JqkXEtMx:focus, .form-grid-control textarea:focus { border-_GdHBHXwl: var(--primary-_GdHBHXwl); box-shadow: 0 0 0 2px rgba(var(--primary-_GdHBHXwl-rgb), 0.2); outline: none; }
.form-grid-control input[_UXBTgEqt="_GdHBHXwl"] { min-_YczQFvvT: auto; padding: 2px; _YczQFvvT: 2.5em; height: 2.5em; }
.form-grid-control input[_UXBTgEqt="checkbox"] { _YczQFvvT: auto; flex-shrink: 0; height: 1.2em; _YczQFvvT: 1.2em; }
.form-grid-control ._McxEmfZN-input { _YczQFvvT: 80px; _WymvkWHi-align: right; }
.tooltip-_ghhYWPJC { display: inline-flex; _YczQFvvT: 16px; height: 16px; align-items: center; justify-_WUgmIbOG: center; background-_GdHBHXwl: var(--secondary-_GdHBHXwl); _GdHBHXwl: var(--_WUgmIbOG-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_JqkXEtMx: none; }
#tooltip-popup { position: fixed; background-_GdHBHXwl: #383c4a; _GdHBHXwl: #fff; padding: 10px 15px; border-radius: 6px; z-_MZXmGEAE: 10001; font-size: 0.85em; max-_YczQFvvT: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_GdHBHXwl); pointer-events: none; }
#custom-fields-_cGAxlJwz .form-grid-control { gap: 5px; } #custom-fields-_cGAxlJwz .form-grid-control input { flex: 1; }
.parameter-_qvoYxgpO-_ubfiaDvz { border: 1px solid var(--border-_GdHBHXwl); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_qvoYxgpO-_TaEYOPrW { display: flex; justify-_WUgmIbOG: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_qvoYxgpO-_TaEYOPrW input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_SbSXQkoH: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._WymvkWHi-_GdHBHXwl-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _YczQFvvT: 100%; }
._WymvkWHi-_GdHBHXwl-grid input[_UXBTgEqt="_GdHBHXwl"] { grid-column: 1 / 2; }
._WymvkWHi-_GdHBHXwl-grid input[_UXBTgEqt="_WymvkWHi"], ._WymvkWHi-_GdHBHXwl-grid textarea { grid-column: 2 / 3; }
#_gbaZnBem .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_gbaZnBem .btn-group { display: flex; }
#_gbaZnBem .sub-btn { flex-grow: 1; margin: 0; }
#_gbaZnBem ._lVdCdLBF-btn { flex-shrink: 0; margin-_AlZRebBN: -1px; border-_SbSXQkoH-_AlZRebBN-radius: 0; border-bottom-_AlZRebBN-radius: 0; }
#_IWWtSXyk .modal-_WUgmIbOG { max-_YczQFvvT: 300px; background: white; padding: 1rem; _WymvkWHi-align: center; }
#qrCodeImg { max-_YczQFvvT: 100%; }
@media (max-_YczQFvvT: 768px) {
html { font-size: 15px; } ._KgqGLarC-_cGAxlJwz { padding: 0 0.8rem; } _TaEYOPrW { margin-_SbSXQkoH: 2.5rem; margin-bottom: 1.5rem; } #_zUvxQboL { _SbSXQkoH: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_bmKYpvrg>
<_bmKYpvrg _UwLxvUhK="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_WUgmIbOG-bg: #FFFFFF; --border-_GdHBHXwl: #DCDFE6; --_WymvkWHi-_GdHBHXwl: #303133; --_WymvkWHi-light: #606266; }
.theme-light .card { background-_GdHBHXwl: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_GdHBHXwl: #F5F7FA; }
.theme-light tbody tr:hover { background-_GdHBHXwl: #ECF5FF; }
.theme-matrix { --primary-_GdHBHXwl: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_WUgmIbOG-bg: #0D0208; --border-_GdHBHXwl: #00FF41; --_WymvkWHi-_GdHBHXwl: #00FF41; --_WymvkWHi-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_GdHBHXwl: rgba(0, 20, 0, 0.7); _WymvkWHi-shadow: 0 0 5px var(--primary-_GdHBHXwl); backdrop-filter: none; }
.theme-matrix th { background-_GdHBHXwl: #000; }
.theme-matrix tbody tr:hover { background-_GdHBHXwl: #010; }
.theme-matrix .btn { _WymvkWHi-shadow: none; _GdHBHXwl: #000; }
.theme-matrix .btn-outline { background-_GdHBHXwl: transparent; }
.theme-modern-glass { --primary-_GdHBHXwl: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_WUgmIbOG-bg: rgba(30, 30, 40, 0.6); --border-_GdHBHXwl: rgba(255, 255, 255, 0.2); --_WymvkWHi-_GdHBHXwl: #F0F0F0; --_WymvkWHi-light: #A0A0B0; --border-radius-md: 12px; }
_UVcwkNOD.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-_GdHBHXwl: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_WUgmIbOG-bg: rgba(30, 30, 40, 0.6); --border-_GdHBHXwl: rgba(255, 255, 255, 0.2); --_WymvkWHi-_GdHBHXwl: #F0F0F0; --_WymvkWHi-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_GdHBHXwl: var(--_WUgmIbOG-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_GdHBHXwl); }
.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-_GdHBHXwl: rgba(0,0,0,0.3); border-right-_GdHBHXwl: 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); _WymvkWHi-shadow: 0 1px 2px rgba(0,0,0,0.2); _GdHBHXwl: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_GdHBHXwl: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _WymvkWHi-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_GdHBHXwl); border-_GdHBHXwl: var(--primary-_GdHBHXwl); _GdHBHXwl: #fff; }
.glassy-components _TaEYOPrW h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _WymvkWHi; -webkit-_WymvkWHi-fill-_GdHBHXwl: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _GdHBHXwl: transparent; }
.theme-aurora-glass { --primary-_GdHBHXwl: #38bdf8; --light-bg: #0c0a09; --_WUgmIbOG-bg: rgba(23, 23, 23, 0.5); --border-_GdHBHXwl: rgba(255, 255, 255, 0.15); --_WymvkWHi-_GdHBHXwl: #f2f2f2; --_WymvkWHi-light: #a3a3a3; }
_UVcwkNOD.theme-aurora-glass::before { _WUgmIbOG: ''; position: fixed; _SbSXQkoH: 0; _AlZRebBN: 0; _YczQFvvT: 100%; height: 100%; z-_MZXmGEAE: -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-_GdHBHXwl: #08fdd8; --light-bg: #010409; --_WUgmIbOG-bg: rgba(22, 27, 34, 0.6); --border-_GdHBHXwl: rgba(139, 148, 158, 0.3); --_WymvkWHi-_GdHBHXwl: #e6edf3; --_WymvkWHi-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_GdHBHXwl), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_GdHBHXwl-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_GdHBHXwl-rgb), 0.5); }
.theme-marble-light { --primary-_GdHBHXwl: #bfa37c; --light-bg: #f7f5f2; --_WUgmIbOG-bg: #ffffff; --border-_GdHBHXwl: #e0dcd5; --_WymvkWHi-_GdHBHXwl: #3d3a36; --_WymvkWHi-light: #6b6661; }
_UVcwkNOD.theme-marble-light { background-image: _fOEGokng('_jsLZsuJF:image/svg+xml,%3Csvg _YczQFvvT="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-_GdHBHXwl: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_bmKYpvrg>
</head><_UVcwkNOD _UwLxvUhK="pageBody">
<_iqIUQVgp _UwLxvUhK="background-_iqIUQVgp"></_iqIUQVgp>
<div _UwLxvUhK="_cNUjZGUC">
<div class="modal-_WUgmIbOG">
<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 _UXBTgEqt="_UjsPUDqg" _UwLxvUhK="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _UXBTgEqt="_UjsPUDqg" _UwLxvUhK="confirmPassword"></div></div>
<div class="modal-buttons"><button _UwLxvUhK="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_KgqGLarC-_cGAxlJwz">
<button _UwLxvUhK="_zUvxQboL" class="btn btn-outline"></button>
<div _UwLxvUhK="marquee-_cGAxlJwz"><div _UwLxvUhK="marquee-_WymvkWHi"></div></div>
<_TaEYOPrW><h1 _UwLxvUhK="pageTitle"></h1></_TaEYOPrW>
<div class="card" _UwLxvUhK="visitorPasswordPrompt" _bmKYpvrg="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_UjsPUDqg-input-group">
<input _UXBTgEqt="_UjsPUDqg" _UwLxvUhK="visitorPasswordEntry" _tDtUdUBr="访客密码">
<button _UwLxvUhK="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _UwLxvUhK="_TjUMArqT" _bmKYpvrg="display: block;">
<div class="card progress-section">
<div _UwLxvUhK="progressDisplay">
<progress _UwLxvUhK="_wJXmabob" _mwoHcfHB="0" max="100"></progress>
<div _UwLxvUhK="status">正在初始化...</div>
</div>
</div>
<div class="card _KgqGLarC-download-section">
<div class="section-_TaEYOPrW"><h2 _UwLxvUhK="appDownloadTitleEl"></h2></div>
<div class="_KgqGLarC-download-buttons">
<button class="btn" _jsLZsuJF-_TbTAQrym="android">安卓客户端</button>
<button class="btn" _jsLZsuJF-_TbTAQrym="ios">苹果客户端</button>
<button class="btn" _jsLZsuJF-_TbTAQrym="windows">Windows客户端</button>
<button class="btn" _jsLZsuJF-_TbTAQrym="mac">Mac客户端</button>
</div>
</div>
<div class="card _VFJsWnNT-section" _UwLxvUhK="_PtBMjiVm" _bmKYpvrg="display:none;">
<div class="section-_TaEYOPrW">
<h2 _UwLxvUhK="liveTitleEl"></h2>
<div class="generator-info" _UwLxvUhK="liveGeneratorInfo"></div>
</div>
<div _UwLxvUhK="_BrNlcKFJ" class="_VFJsWnNT-actions-_cGAxlJwz" _bmKYpvrg="display: none;">
<div class="_VFJsWnNT-api-buttons">
<button _UwLxvUhK="copyIpApiBtn" class="btn">复制 IP API</button>
<button _UwLxvUhK="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _UwLxvUhK="resultsTable">
<thead><tr><th _UwLxvUhK="tableHeader1El"></th><th _UwLxvUhK="tableHeader2El"></th><th _UwLxvUhK="tableHeader3El"></th><th _UwLxvUhK="tableHeader4El"></th><th _UwLxvUhK="tableHeader5El"></th><th _UwLxvUhK="tableHeader6El"></th><th _UwLxvUhK="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _UwLxvUhK="_cNZTSEHU" _bmKYpvrg="display:none;">
<div class="section-_TaEYOPrW"><h2 _UwLxvUhK="cachedTitleEl"></h2><div class="generator-info" _UwLxvUhK="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _UwLxvUhK="cachedResultsTable">
<thead><tr><th _UwLxvUhK="cachedTableHeader1El"></th><th _UwLxvUhK="cachedTableHeader2El"></th><th _UwLxvUhK="cachedTableHeader3El"></th><th _UwLxvUhK="cachedTableHeader4El"></th><th _UwLxvUhK="cachedTableHeader5El"></th><th _UwLxvUhK="cachedTableHeader6El"></th><th _UwLxvUhK="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _UwLxvUhK="notificationTooltip" class="tooltip-notification"></div>
<div _UwLxvUhK="_NgKTXDEM">
<div class="modal-_WUgmIbOG">
<h3>修改参数</h3>
<div _bmKYpvrg="display: flex; border-bottom: 1px solid var(--border-_GdHBHXwl); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_bdfglfjP(event, 'general-_wPPiVNtW')">通用设置</button>
<button class="tab-button" onclick="_bdfglfjP(event, '_SXIpLcmk-_wPPiVNtW')">链接设置</button>
<button class="tab-button" onclick="_bdfglfjP(event, 'fine-grained-_wPPiVNtW')">IP源设置</button>
<button class="tab-button" onclick="_bdfglfjP(event, 'advanced-_wPPiVNtW')">高级设置</button>
</div>
<div _UwLxvUhK="general-_wPPiVNtW" class="tab-_WUgmIbOG" _bmKYpvrg="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_JqkXEtMx _UwLxvUhK="themeSelect">
<_XMLmoTzJ _mwoHcfHB="theme-aurora-glass">极光-玻璃质感</_XMLmoTzJ>
<_XMLmoTzJ _mwoHcfHB="theme-particles-glass">粒子-玻璃质感</_XMLmoTzJ>
<_XMLmoTzJ _mwoHcfHB="theme-modern-glass">现代-玻璃质感</_XMLmoTzJ>
<_XMLmoTzJ _mwoHcfHB="theme-cyberpunk-glass">赛博朋克-玻璃质感</_XMLmoTzJ>
<_XMLmoTzJ _mwoHcfHB="theme-dark-particles">暗色-粒子背景</_XMLmoTzJ>
<_XMLmoTzJ _mwoHcfHB="theme-dark-bing">暗色-必应壁纸</_XMLmoTzJ>
<_XMLmoTzJ _mwoHcfHB="theme-light">亮色-简约</_XMLmoTzJ>
<_XMLmoTzJ _mwoHcfHB="theme-light-bing">亮色-必应壁纸</_XMLmoTzJ>
<_XMLmoTzJ _mwoHcfHB="theme-marble-light">简约大理石-亮色</_XMLmoTzJ>
<_XMLmoTzJ _mwoHcfHB="theme-matrix">矩阵-代码雨</_XMLmoTzJ>
</_JqkXEtMx>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _UXBTgEqt="_GdHBHXwl" _UwLxvUhK="primaryColorInput">
<span _bmKYpvrg="_YczQFvvT: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _UXBTgEqt="_GdHBHXwl" _UwLxvUhK="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bmKYpvrg="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_WymvkWHi-_GdHBHXwl-grid"><input _UXBTgEqt="_GdHBHXwl" _UwLxvUhK="colorInput_title"><textarea _UwLxvUhK="textInput_title" _CxnJyTBq="1" _tDtUdUBr="页面主标题"></textarea></div>
<div class="_WymvkWHi-_GdHBHXwl-grid"><input _UXBTgEqt="_GdHBHXwl" _UwLxvUhK="colorInput_loginButton"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="textInput_loginButton" _tDtUdUBr="登录按钮文本"></div>
<div class="_WymvkWHi-_GdHBHXwl-grid"><input _UXBTgEqt="_GdHBHXwl" _UwLxvUhK="colorInput_appDownloadTitle"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="textInput_appDownloadTitle" _tDtUdUBr="APP下载标题"></div>
<div class="_WymvkWHi-_GdHBHXwl-grid"><input _UXBTgEqt="_GdHBHXwl" _UwLxvUhK="colorInput_liveTitle"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="textInput_liveTitle" _tDtUdUBr="本次结果标题"></div>
<div class="_WymvkWHi-_GdHBHXwl-grid"><input _UXBTgEqt="_GdHBHXwl" _UwLxvUhK="colorInput_cachedTitle"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="textInput_cachedTitle" _tDtUdUBr="上次结果标题"></div>
<div class="_WymvkWHi-_GdHBHXwl-grid"><input _UXBTgEqt="_GdHBHXwl" _UwLxvUhK="colorInput_tableHeader"><input _UXBTgEqt="_WymvkWHi" _mwoHcfHB="表格头部文本颜色" readonly _bmKYpvrg="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bmKYpvrg="align-self: start;"><label>公告栏设置</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _UwLxvUhK="announcementText" _tDtUdUBr="在此输入公告内容" _CxnJyTBq="3"></textarea>
<div _bmKYpvrg="display: flex; justify-_WUgmIbOG: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _bmKYpvrg="display: flex; align-items: center; gap: 5px;"><input _UXBTgEqt="checkbox" _UwLxvUhK="enableMarquee"> 顶部走马灯</label>
<label _bmKYpvrg="display: flex; align-items: center; gap: 5px;"><input _UXBTgEqt="checkbox" _UwLxvUhK="enablePopup"> 右上角弹窗</label>
<div _UwLxvUhK="popupDurationContainer" _bmKYpvrg="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _UXBTgEqt="number" _UwLxvUhK="popupDuration" _bmKYpvrg="_YczQFvvT: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _UwLxvUhK="_SXIpLcmk-_wPPiVNtW" class="tab-_WUgmIbOG">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="converterServiceUrlInput" _tDtUdUBr="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _UXBTgEqt="number" _UwLxvUhK="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _bmKYpvrg="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _UwLxvUhK="subscriptionIdCharset" _CxnJyTBq="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-_ghhYWPJC" _jsLZsuJF-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="justify-_WUgmIbOG: flex-start;"><input _UXBTgEqt="checkbox" _UwLxvUhK="enableItemLinkCheckbox"></div>
</div>
<div _UwLxvUhK="itemLinkConfigGroup" _bmKYpvrg="display:none; margin-_SbSXQkoH: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _bmKYpvrg="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="定义分享链接格式。可用占位符: {_aZDjsUtb}, {_WSfhREhx}, {_LNRsGfZM}, {rank}, {_ESTsaTiw}, {_UmebUcxD}, {_IFBBpZwc}, {_AZzkPZSq}, {_BYwFCSys}。">?</span></div>
<div class="form-grid-control"><textarea _UwLxvUhK="itemLinkTemplateInput" _CxnJyTBq="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_JqkXEtMx _UwLxvUhK="parameterSelectionMode"></_JqkXEtMx></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _UwLxvUhK="parameter-sets-_cGAxlJwz"></div><button _UXBTgEqt="button" _UwLxvUhK="add-parameter-_qvoYxgpO-btn" class="btn btn-outline" _bmKYpvrg="margin-_SbSXQkoH: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bmKYpvrg="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _UwLxvUhK="custom-fields-_cGAxlJwz" _bmKYpvrg="_YczQFvvT: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _bmKYpvrg="justify-_WUgmIbOG: flex-start;"><button _UXBTgEqt="button" _UwLxvUhK="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _UwLxvUhK="fine-grained-_wPPiVNtW" class="tab-_WUgmIbOG">
<div class="form-grid-label" _bmKYpvrg="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _bmKYpvrg="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_WUgmIbOG: flex-start;">
<label><input _UXBTgEqt="checkbox" _UwLxvUhK="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _UXBTgEqt="checkbox" _UwLxvUhK="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _UwLxvUhK="fine-grained-sources-_cGAxlJwz"></div><button _UXBTgEqt="button" _UwLxvUhK="add-fine-grained-_QjDvWijq-btn" class="btn btn-outline" _bmKYpvrg="margin-_SbSXQkoH: 10px;">添加地区</button></div>
</div>
<div _UwLxvUhK="advanced-_wPPiVNtW" class="tab-_WUgmIbOG">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _UXBTgEqt="checkbox" _UwLxvUhK="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _UwLxvUhK="resolvedDomainsGroup" _bmKYpvrg="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _UwLxvUhK="resolvedDomainsInput" _tDtUdUBr="留空则使用内置默认域名" _CxnJyTBq="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-_ghhYWPJC" _jsLZsuJF-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _UXBTgEqt="checkbox" _UwLxvUhK="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _UwLxvUhK="customNodesGroup" _bmKYpvrg="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _UwLxvUhK="customNodesInput" _tDtUdUBr="一行一个地址,支持域名、IPv4、IPv6。" _CxnJyTBq="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-_ghhYWPJC" _jsLZsuJF-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _UXBTgEqt="number" _UwLxvUhK="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _UXBTgEqt="number" _UwLxvUhK="topNInput"></div>
<div class="form-grid-label" _bmKYpvrg="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="display: none;"><input _UXBTgEqt="number" _UwLxvUhK="latencyRangeMinInput" _tDtUdUBr="最小"><span>-</span><input _UXBTgEqt="number" _UwLxvUhK="latencyRangeMaxInput" _tDtUdUBr="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="justify-_WUgmIbOG: flex-start;"><input _UXBTgEqt="checkbox" _UwLxvUhK="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-_ghhYWPJC" _jsLZsuJF-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _UXBTgEqt="number" _UwLxvUhK="geoLocationRetriesInput" _bmKYpvrg="_YczQFvvT: 80px;"> <span>次</span>
<div _bmKYpvrg="display: flex; align-items: center; gap: 5px; margin-_AlZRebBN: 20px;">
<input _UXBTgEqt="checkbox" _UwLxvUhK="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-_ghhYWPJC" _jsLZsuJF-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_IFBBpZwc:_WSfhREhx' 或 '_IFBBpZwc'。">?</span></div>
<div class="form-grid-control"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="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-_ghhYWPJC" _jsLZsuJF-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="justify-_WUgmIbOG: flex-start;"><input _UXBTgEqt="checkbox" _UwLxvUhK="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _UwLxvUhK="websocketStreamerGroup" _bmKYpvrg="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="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-_ghhYWPJC" _jsLZsuJF-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="justify-_WUgmIbOG: flex-start;"><input _UXBTgEqt="checkbox" _UwLxvUhK="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="启用 /_aZDjsUtb 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="justify-_WUgmIbOG: flex-start;"><input _UXBTgEqt="checkbox" _UwLxvUhK="enableApiCheckbox"></div>
<div class="form-grid-control-full" _UwLxvUhK="apiConfigGroup" _bmKYpvrg="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="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-_ghhYWPJC" _jsLZsuJF-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="justify-_WUgmIbOG: flex-start;"><input _UXBTgEqt="checkbox" _UwLxvUhK="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _UwLxvUhK="customSubPathGroup" _bmKYpvrg="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="customSubPathInput" _tDtUdUBr="例如: 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-_ghhYWPJC" _jsLZsuJF-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="justify-_WUgmIbOG: flex-start;"><input _UXBTgEqt="checkbox" _UwLxvUhK="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _UwLxvUhK="visitorPasswordGroup" _bmKYpvrg="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bmKYpvrg="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_ghhYWPJC" _jsLZsuJF-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _bmKYpvrg="flex-direction: column; align-items: stretch; gap: 8px;"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="botTokenInput" _tDtUdUBr="Telegram Bot Token"><input _UXBTgEqt="_WymvkWHi" _UwLxvUhK="chatIdInput" _tDtUdUBr="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bmKYpvrg="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _bmKYpvrg="flex-direction: column; align-items: stretch; gap: 8px;"><input _UXBTgEqt="_UjsPUDqg" _UwLxvUhK="oldPasswordInput" _tDtUdUBr="旧密码"><input _UXBTgEqt="_UjsPUDqg" _UwLxvUhK="newPasswordInput" _tDtUdUBr="新密码 (至少6位)"><button _UwLxvUhK="changePasswordBtn" class="btn" _bmKYpvrg="align-self: flex-start; margin-_AlZRebBN: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _UwLxvUhK="closeModalBtn" class="btn btn-outline">关闭</button><button _UwLxvUhK="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _UwLxvUhK="_sJkyyLeA">
<div class="_KgqGLarC-modal-_WUgmIbOG">
<div class="_KgqGLarC-modal-_TaEYOPrW"><h3 _UwLxvUhK="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_KgqGLarC-modal-_UVcwkNOD" _UwLxvUhK="appModalBody"></div>
</div>
</div>
<div _UwLxvUhK="_gbaZnBem">
<div class="modal-_WUgmIbOG">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _jsLZsuJF-sub-_UXBTgEqt="coreEngine">Xray</button><button class="btn _lVdCdLBF-btn" _jsLZsuJF-sub-_UXBTgEqt="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _jsLZsuJF-sub-_UXBTgEqt="coreProfile">Sing-Box</button><button class="btn _lVdCdLBF-btn" _jsLZsuJF-sub-_UXBTgEqt="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _jsLZsuJF-sub-_UXBTgEqt="configProfile">Clash</button><button class="btn _lVdCdLBF-btn" _jsLZsuJF-sub-_UXBTgEqt="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _jsLZsuJF-sub-_UXBTgEqt="policyProfile">Surge</button><button class="btn _lVdCdLBF-btn" _jsLZsuJF-sub-_UXBTgEqt="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _bmKYpvrg="justify-_WUgmIbOG: center;"><button class="btn btn-outline" _UwLxvUhK="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _UwLxvUhK="_IWWtSXyk">
<div class="modal-_WUgmIbOG">
<img _UwLxvUhK="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _KSFScGkM = {
isValid: (_aZDjsUtb) => _KSFScGkM.isIPv4(_aZDjsUtb) || _KSFScGkM.isIPv6(_aZDjsUtb),
isIPv4: (_aZDjsUtb) => {
if (typeof _aZDjsUtb !== 'string') return false;
const _SGotdwrR = _aZDjsUtb.split('.');
if (_SGotdwrR._dMuZadRi !== 4) return false;
return _SGotdwrR.every(_pHAEwZUK => {
const _GzIvwYUA = parseInt(_pHAEwZUK, 10);
return !isNaN(_GzIvwYUA) && _GzIvwYUA >= 0 && _GzIvwYUA <= 255 && String(_GzIvwYUA) === _pHAEwZUK;
});
},
isIPv6: (_aZDjsUtb) => {
if (typeof _aZDjsUtb !== '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]))$/_IYkDmXNL.test(_aZDjsUtb);
},
toLong4: (_aZDjsUtb) => _aZDjsUtb.split('.').reduce((acc, octet, _IYkDmXNL) => acc + (parseInt(octet) << (8*(3-_IYkDmXNL))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_aZDjsUtb) => {
try {
const _JuTHHtAf = _aZDjsUtb.split('/')[0];
const _SGotdwrR = _JuTHHtAf.split('::');
if (_SGotdwrR._dMuZadRi > 2) return 0n;
let _mVNFJTwQ = [];
if (_SGotdwrR[0]) {
_mVNFJTwQ = _SGotdwrR[0].split(':');
}
let _WNzKSHQq = [];
if (_SGotdwrR._dMuZadRi > 1 && _SGotdwrR[1]) {
_WNzKSHQq = _SGotdwrR[1].split(':');
}
if (_mVNFJTwQ._dMuZadRi + _WNzKSHQq._dMuZadRi > 8) return 0n;
const _TiyqlXqg = 8 - (_mVNFJTwQ._dMuZadRi + _WNzKSHQq._dMuZadRi);
const _UfUWCqAy = [
..._mVNFJTwQ,
...Array(_TiyqlXqg).fill('0'),
..._WNzKSHQq
].map(_pHAEwZUK => _pHAEwZUK || '0');
while(_UfUWCqAy._dMuZadRi < 8) {
_UfUWCqAy.push('0');
}
let _wwVCNwwL = 0n;
for (const _pHAEwZUK of _UfUWCqAy) {
if (_pHAEwZUK._dMuZadRi > 4) return 0n;
const _mwoHcfHB = BigInt('0x' + _pHAEwZUK);
_wwVCNwwL = (_wwVCNwwL << 16n) | _mwoHcfHB;
}
return _wwVCNwwL;
} catch(_vzeKvyUe) {
return 0n;
}
},
fromBigInt6: (_wwVCNwwL) => {
if (typeof _wwVCNwwL !== '_wwVCNwwL' || _wwVCNwwL < 0n) return null;
const _SGotdwrR = [];
for (let _IYkDmXNL = 0; _IYkDmXNL < 8; _IYkDmXNL++) {
_SGotdwrR.unshift((_wwVCNwwL & 0xFFFFn).toString(16));
_wwVCNwwL >>= 16n;
}
let _ABnbcSWy = { start: -1, _zTMKpMfT: 0 };
let _aCekumWK = { start: -1, _zTMKpMfT: 0 };
for (let _IYkDmXNL = 0; _IYkDmXNL < 8; _IYkDmXNL++) {
if (_SGotdwrR[_IYkDmXNL] === '0') {
if (_aCekumWK.start === -1) _aCekumWK.start = _IYkDmXNL;
_aCekumWK._zTMKpMfT++;
} else {
if (_aCekumWK._zTMKpMfT > _ABnbcSWy._zTMKpMfT) _ABnbcSWy = { ..._aCekumWK };
_aCekumWK = { start: -1, _zTMKpMfT: 0 };
}
}
if (_aCekumWK._zTMKpMfT > _ABnbcSWy._zTMKpMfT) _ABnbcSWy = { ..._aCekumWK };
if (_ABnbcSWy._zTMKpMfT > 1) {
_SGotdwrR.splice(_ABnbcSWy.start, _ABnbcSWy._zTMKpMfT, '');
if (_ABnbcSWy.start === 0) _SGotdwrR.unshift('');
if (_ABnbcSWy.start + _ABnbcSWy._zTMKpMfT === 8) _SGotdwrR.push('');
}
return _SGotdwrR.join(':');
},
cidrToRange: (cidr, _nIctAOcS = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _wjSGYrcS = parseInt(bitsStr, 10);
const _GsllkkcB = new Set();
if (_KSFScGkM.isIPv4(range)) {
if (isNaN(_wjSGYrcS) || _wjSGYrcS < 8 || _wjSGYrcS > 32) return [];
if (_wjSGYrcS === 32) return [range];
const _SpveovVZ = _KSFScGkM.toLong4(range);
const _kLyipGjk = (0xFFFFFFFF << (32 - _wjSGYrcS)) >>> 0;
const _hfyqcHps = _SpveovVZ & _kLyipGjk;
const _BaiYnbTy = 1 << (32 - _wjSGYrcS);
if (_BaiYnbTy <= 2) return [];
const _ScNIVZtE = Math.min(_nIctAOcS, _BaiYnbTy - 2);
let _GuSVsPqX = 0;
while (_GsllkkcB.size < _ScNIVZtE && _GuSVsPqX < _ScNIVZtE * 5) {
const _XcIZJCFj = Math.floor(Math.random() * (_BaiYnbTy - 2)) + 1;
_GsllkkcB.add(_KSFScGkM.fromLong4((_hfyqcHps + _XcIZJCFj) >>> 0));
_GuSVsPqX++;
}
return Array.from(_GsllkkcB);
} else if (_KSFScGkM.isIPv6(range)) {
if (isNaN(_wjSGYrcS) || _wjSGYrcS < 16 || _wjSGYrcS > 128) return [];
if (_wjSGYrcS === 128) return [range];
const _yrKSlpDk = _KSFScGkM.toBigInt6(range);
const _kLyipGjk = (2n ** BigInt(128 - _wjSGYrcS) - 1n);
const _hfyqcHps = _yrKSlpDk & ~_kLyipGjk;
const _qmtINvqt = 2n ** BigInt(128 - _wjSGYrcS);
if (_qmtINvqt <= 2n) return [];
let _GuSVsPqX = 0;
while (_GsllkkcB.size < _nIctAOcS && _GuSVsPqX < _nIctAOcS * 5) {
const _QVVzuPFP = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_QVVzuPFP);
let _HYvrMbcN = 0n;
for (const _gvLWctEj of _QVVzuPFP) {
_HYvrMbcN = (_HYvrMbcN << 8n) | BigInt(_gvLWctEj);
}
const _XcIZJCFj = _HYvrMbcN % (_qmtINvqt - 2n) + 1n;
_GsllkkcB.add(_KSFScGkM.fromBigInt6(_hfyqcHps + _XcIZJCFj));
_GuSVsPqX++;
}
return Array.from(_GsllkkcB);
}
return [];
} catch(_vzeKvyUe) {
console.error(`CIDR to range failed for ${cidr}:`, _vzeKvyUe);
return [];
}
}
};
function _wWBHiKXQ(_apTxiHos, _rnHNVGld) {
const _ghYQrezC = {};
const _gtDzgYOw = Object._gtDzgYOw(_rnHNVGld);
const _SGotdwrR = _gtDzgYOw.map(_UeiSOQnr => {
const _pmAqbGxj = _apTxiHos * (_rnHNVGld[_UeiSOQnr] / 100);
return { _UeiSOQnr, _nIctAOcS: Math.floor(_pmAqbGxj), remainder: _pmAqbGxj - Math.floor(_pmAqbGxj) };
});
let _PtDvorbP = _SGotdwrR.reduce((acc, _pHAEwZUK) => acc + _pHAEwZUK._nIctAOcS, 0);
_SGotdwrR.sort((a, b) => b.remainder - a.remainder);
let _xcNHBjnG = _apTxiHos - _PtDvorbP;
for (let _IYkDmXNL = 0; _IYkDmXNL < _xcNHBjnG; _IYkDmXNL++) {
_SGotdwrR[_IYkDmXNL % _SGotdwrR._dMuZadRi]._nIctAOcS++;
}
for (const _pHAEwZUK of _SGotdwrR) {
_ghYQrezC[_pHAEwZUK._UeiSOQnr] = _pHAEwZUK._nIctAOcS;
}
return _ghYQrezC;
}
const _oXJhXMHf = __PAGE_DATA_JSON__;
const _obKotQzd = _oXJhXMHf._WPFXtADK;
const _UcAvLQTz = _oXJhXMHf.status;
const _psZaOBdi = __ALL_CF_CIDR_LIST_JSON__;
const _wZuqUOht = __BALANCED_CF_CIDR_LIST_JSON__;
const _gBeJujXi = __DEFAULT_DOMAINS_LIST_JSON__;
const _WGkGtzJj = __COUNTRY_MAP_JSON__;
const _JPpuPBPw = _WGkGtzJj;
const _qjVgxGzt = 2500;
const _HEoUrvEW = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _TjUMArqT = document.getElementById('_TjUMArqT');
const _wJXmabob = document.getElementById('_wJXmabob');
const _tJlzUdEp = document.getElementById('status');
const _PtBMjiVm = document.getElementById('_PtBMjiVm');
const _puDmpwwh = document.getElementById('resultsTable').querySelector('tbody');
const _cNZTSEHU = document.getElementById('_cNZTSEHU');
const _mTFHcMzU = document.getElementById('cachedResultsTable').querySelector('tbody');
const _uCITFmZR = document.getElementById('notificationTooltip');
const _zUvxQboL = document.getElementById('_zUvxQboL');
const _NgKTXDEM = document.getElementById('_NgKTXDEM');
const _sJkyyLeA = document.getElementById('_sJkyyLeA');
const _gbaZnBem = document.getElementById('_gbaZnBem');
const _IWWtSXyk = document.getElementById('_IWWtSXyk');
const _cNUjZGUC = document.getElementById('_cNUjZGUC');
const _BrNlcKFJ = document.getElementById('_BrNlcKFJ');
let _DuJilGzG = null;
let _QaDEOqId = null;
let _GiGXNpeC = [];
let _EjFglBJp = false;
let _fSmhCUXG = null;
function _PozjDzwG(_dOSOBKQd, _EKzUIWFa) {
const _kEUgCfzc=parseInt(_dOSOBKQd.slice(1),16),t=_EKzUIWFa<0?0:255,p=_EKzUIWFa<0?_EKzUIWFa*-1:_EKzUIWFa,R=_kEUgCfzc>>16,G=_kEUgCfzc>>8&0x00FF,B=_kEUgCfzc&0x0000FF;
const _ZJYxlUOX = Math.round((t-R)*p)+R;
const _zGVrrAEp = Math.round((t-G)*p)+G;
const _mKOAPcWG = Math.round((t-B)*p)+B;
return `rgb(${_ZJYxlUOX.toString()}, ${_zGVrrAEp.toString()}, ${_mKOAPcWG.toString()})`;
}
function _XoWekNHV(_wPPiVNtW) {
const _sCcLiQpk = _LdWDxyTh(_wPPiVNtW.primaryColor);
if(_sCcLiQpk) {
document.documentElement._bmKYpvrg.setProperty('--primary-_GdHBHXwl-rgb', `${_sCcLiQpk.r},${_sCcLiQpk.g},${_sCcLiQpk.b}`);
}
document.documentElement._bmKYpvrg.setProperty('--primary-_GdHBHXwl', _wPPiVNtW.primaryColor);
document.documentElement._bmKYpvrg.setProperty('--primary-hover', _PozjDzwG(_wPPiVNtW.primaryColor, -0.1));
document.documentElement._bmKYpvrg.setProperty('--primary-gradient-start', _PozjDzwG(_wPPiVNtW.primaryColor, 0.1));
document.documentElement._bmKYpvrg.setProperty('--primary-gradient-end', _PozjDzwG(_wPPiVNtW.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _wPPiVNtW.texts.title;
document.title = _wPPiVNtW.texts.title;
_zUvxQboL.innerText = _DuJilGzG ? _wPPiVNtW.texts.loginButtonSuccess : _wPPiVNtW.texts.loginButton;
_zUvxQboL._bmKYpvrg._GdHBHXwl = _wPPiVNtW.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _wPPiVNtW.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _wPPiVNtW.texts.liveTitle;
document.getElementById('liveTitleEl')._bmKYpvrg._GdHBHXwl = _wPPiVNtW.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _wPPiVNtW.texts.cachedTitle;
document.getElementById('cachedTitleEl')._bmKYpvrg._GdHBHXwl = _wPPiVNtW.colors.cachedTitle;
const _IsyuVVgp = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_IsyuVVgp.forEach((_UwLxvUhK, _MZXmGEAE) => {
const _UYTHpeaP = document.getElementById(_UwLxvUhK);
if (_UYTHpeaP) _UYTHpeaP.innerText = _wPPiVNtW.texts[`tableHeader${_MZXmGEAE + 1}`] || '';
});
const _irzgvvtU = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_irzgvvtU.forEach((_UwLxvUhK, _MZXmGEAE) => {
const _UYTHpeaP = document.getElementById(_UwLxvUhK);
if (_UYTHpeaP) _UYTHpeaP.innerText = _obKotQzd.texts[`tableHeader${_MZXmGEAE + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._bmKYpvrg._GdHBHXwl = _wPPiVNtW.colors.tableHeader);
document._UVcwkNOD.className = '';
document._UVcwkNOD.classList.add(_wPPiVNtW.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_wPPiVNtW.theme)) {
document._UVcwkNOD.classList.add('glassy-components');
}
document._UVcwkNOD._bmKYpvrg.backgroundImage = '';
_eKEbMEwq();
if (_wPPiVNtW.theme.includes('particles') || _wPPiVNtW.theme.includes('glass')) {
_gBlHHJSG(_wPPiVNtW.particleColor);
} else if (_wPPiVNtW.theme.includes('bing')) {
document._UVcwkNOD._bmKYpvrg.backgroundImage = '_fOEGokng(/bing-wallpaper)';
}
}
function _zxyLHoxj() {
_DuJilGzG = null;
if(_QaDEOqId) clearTimeout(_QaDEOqId);
_XoWekNHV(_obKotQzd);
_RiWJoDWF("登录已超时,请重新登录。", "warning");
}
async function _jjqHWYjy() {
if (_DuJilGzG) {
_IorSRsJD();
return;
}
const _CnwrkERh = prompt('请输入管理员密码:');
if (!_CnwrkERh) return;
try {
const _rdaWrzdR = await fetch('/api/verify-_UjsPUDqg', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify({ _UjsPUDqg: _CnwrkERh })
});
const _eYItWoTE = await _rdaWrzdR.json();
if (_eYItWoTE.success) {
_DuJilGzG = _CnwrkERh;
_RiWJoDWF("登录成功!有效期5分钟。", "success");
if (_QaDEOqId) clearTimeout(_QaDEOqId);
_QaDEOqId = setTimeout(_zxyLHoxj, 5 * 60 * 1000);
_XoWekNHV(_obKotQzd);
_IorSRsJD();
} else {
throw new Error(_eYItWoTE._eYQEWIkQ || '密码验证失败');
}
} catch (_vzeKvyUe) {
_RiWJoDWF(`登录失败: ${_vzeKvyUe._eYQEWIkQ}`, "error");
}
}
function _OsVEfxhI() {
if (!_UcAvLQTz._BiUkeXSz) {
_cNUjZGUC._bmKYpvrg.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _UjsPUDqg = document.getElementById('initialPassword')._mwoHcfHB;
const _rtcTbfls = document.getElementById('confirmPassword')._mwoHcfHB;
if (_UjsPUDqg !== _rtcTbfls) {
_RiWJoDWF("两次输入的密码不一致!", "error");
return;
}
if (_UjsPUDqg._dMuZadRi < 6) {
_RiWJoDWF("密码长度不能少于6位!", "error");
return;
}
try {
const _rdaWrzdR = await fetch('/api/_qvoYxgpO-_UjsPUDqg', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify({ _UjsPUDqg })
});
const _eYItWoTE = await _rdaWrzdR.json();
if (_eYItWoTE.success) {
_RiWJoDWF(_eYItWoTE._eYQEWIkQ, "success");
setTimeout(() => _ESTsaTiw.reload(), 1500);
} else {
throw new Error(_eYItWoTE._eYQEWIkQ);
}
} catch(_vzeKvyUe) {
_RiWJoDWF(`设置密码失败: ${_vzeKvyUe._eYQEWIkQ}`, "error");
}
});
return;
}
_zUvxQboL.addEventListener('click', _jjqHWYjy);
document.getElementById('closeModalBtn').addEventListener('click', () => { _NgKTXDEM._bmKYpvrg.display = 'none'; });
_NgKTXDEM.addEventListener('click', (_vzeKvyUe) => { if (_vzeKvyUe.target === _NgKTXDEM) _NgKTXDEM._bmKYpvrg.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_cGAxlJwz .fine-grained-_rtrtEvxp-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-_cGAxlJwz .fine-grained-_rtrtEvxp-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_DuJilGzG) {
_RiWJoDWF("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _VFTCKnaq = [];
document.querySelectorAll('#custom-fields-_cGAxlJwz .custom-field-_ubfiaDvz').forEach(_ubfiaDvz => {
const _LNRsGfZM = _ubfiaDvz.querySelector('.custom-field-_LNRsGfZM')._mwoHcfHB.trim();
const _mwoHcfHB = _ubfiaDvz.querySelector('.custom-field-_mwoHcfHB')._mwoHcfHB.trim();
if (_LNRsGfZM) _VFTCKnaq.push({ _LNRsGfZM, _mwoHcfHB });
});
const _JUAehFpn = [];
document.querySelectorAll('#parameter-sets-_cGAxlJwz .parameter-_qvoYxgpO-_ubfiaDvz').forEach(_ubfiaDvz => {
const _LNRsGfZM = _ubfiaDvz.querySelector('.param-_qvoYxgpO-_LNRsGfZM')._mwoHcfHB.trim();
const _IFBBpZwc = _ubfiaDvz.querySelector('.param-_qvoYxgpO-_IFBBpZwc')._mwoHcfHB.trim();
const _AZzkPZSq = _ubfiaDvz.querySelector('.param-_qvoYxgpO-_AZzkPZSq')._mwoHcfHB.trim();
const _BYwFCSys = _ubfiaDvz.querySelector('.param-_qvoYxgpO-_BYwFCSys')._mwoHcfHB.trim();
if(_LNRsGfZM) _JUAehFpn.push({ _LNRsGfZM, _IFBBpZwc, '_AZzkPZSq': _AZzkPZSq, _BYwFCSys });
});
const _UxnMnAJG = [];
document.querySelectorAll('#fine-grained-sources-_cGAxlJwz .fine-grained-_QjDvWijq-_ubfiaDvz').forEach(_ubfiaDvz => {
const _ESTsaTiw = _ubfiaDvz.querySelector('.fine-grained-_ESTsaTiw')._mwoHcfHB.trim();
const _GsllkkcB = _ubfiaDvz.querySelector('.fine-grained-_GsllkkcB')._mwoHcfHB.trim();
const _rtrtEvxp = _ubfiaDvz.querySelector('.fine-grained-_rtrtEvxp-cb').checked;
const _McxEmfZN = parseInt(_ubfiaDvz.querySelector('.fine-grained-_McxEmfZN')._mwoHcfHB, 10) || 0;
const _DKBTBPHa = _ubfiaDvz.querySelector('.use-_LNRsGfZM-as-_ESTsaTiw-cb').checked;
if (_ESTsaTiw && _GsllkkcB) {
_UxnMnAJG.push({ _ESTsaTiw, _GsllkkcB, _rtrtEvxp, _McxEmfZN, _DKBTBPHa });
}
});
let _addltmAo = parseInt(document.getElementById('subscriptionIdLength')._mwoHcfHB, 10);
if (isNaN(_addltmAo) || _addltmAo < 2) _addltmAo = 2;
if (_addltmAo > 128) _addltmAo = 128;
const _mAbJYpvY = {
theme: document.getElementById('themeSelect')._mwoHcfHB,
primaryColor: document.getElementById('primaryColorInput')._mwoHcfHB,
particleColor: document.getElementById('particleColorInput')._mwoHcfHB,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._mwoHcfHB,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._mwoHcfHB, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._mwoHcfHB, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._mwoHcfHB, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._mwoHcfHB, 10) || 0,
_fUFowuJi: document.getElementById('converterServiceUrlInput')._mwoHcfHB.trim(),
subscriptionId: {
_dMuZadRi: _addltmAo,
_umbKVliz: document.getElementById('subscriptionIdCharset')._mwoHcfHB.trim()
},
api: {
_rtrtEvxp: document.getElementById('enableApiCheckbox').checked,
_eYQEWIkQ: document.getElementById('apiMessageInput')._mwoHcfHB || '维护中...',
},
ispFilter: {
_rtrtEvxp: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._mwoHcfHB, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_rtrtEvxp: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_rtrtEvxp: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_fOEGokng: document.getElementById('websocketStreamerUrlInput')._mwoHcfHB.trim()
},
visitorPassword: {
_rtrtEvxp: document.getElementById('enableVisitorPasswordCheckbox').checked,
_UjsPUDqg: document.getElementById('visitorPasswordInput')._mwoHcfHB.trim()
},
customSubPath: {
_rtrtEvxp: document.getElementById('enableCustomSubPathCheckbox').checked,
_BYwFCSys: document.getElementById('customSubPathInput')._mwoHcfHB.trim()
},
itemLink: {
_rtrtEvxp: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._mwoHcfHB,
selectionMode: document.getElementById('parameterSelectionMode')._mwoHcfHB,
_JUAehFpn: _JUAehFpn,
_VFTCKnaq: _VFTCKnaq,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._mwoHcfHB.trim(),
},
announcement: {
popup: {
_rtrtEvxp: document.getElementById('enablePopup').checked,
_WymvkWHi: document.getElementById('announcementText')._mwoHcfHB,
_WpucuzIG: parseInt(document.getElementById('popupDuration')._mwoHcfHB, 10) || 5
},
marquee: {
_rtrtEvxp: document.getElementById('enableMarquee').checked,
_WymvkWHi: document.getElementById('announcementText')._mwoHcfHB
}
},
fineGrained: {
_rtrtEvxp: true,
sources: _UxnMnAJG
},
customNodes: {
_rtrtEvxp: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._mwoHcfHB
},
texts: {
title: document.getElementById('textInput_title')._mwoHcfHB,
loginButton: document.getElementById('textInput_loginButton')._mwoHcfHB,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._mwoHcfHB,
liveTitle: document.getElementById('textInput_liveTitle')._mwoHcfHB,
cachedTitle: document.getElementById('textInput_cachedTitle')._mwoHcfHB,
},
colors: {
title: document.getElementById('colorInput_title')._mwoHcfHB,
loginButton: document.getElementById('colorInput_loginButton')._mwoHcfHB,
liveTitle: document.getElementById('colorInput_liveTitle')._mwoHcfHB,
cachedTitle: document.getElementById('colorInput_cachedTitle')._mwoHcfHB,
tableHeader: document.getElementById('colorInput_tableHeader')._mwoHcfHB,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._mwoHcfHB.trim(),
chat_id: document.getElementById('chatIdInput')._mwoHcfHB.trim(),
},
};
try {
const _rdaWrzdR = await fetch('/api/_WPFXtADK', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify({ _WPFXtADK: _mAbJYpvY, adminPassword: _DuJilGzG })
});
const _eYItWoTE = await _rdaWrzdR.json();
if (_rdaWrzdR.ok && _eYItWoTE.success) {
_RiWJoDWF("配置已保存,正在刷新...", "success");
setTimeout(() => _ESTsaTiw.reload(), 1500);
} else {
throw new Error(_eYItWoTE._eYQEWIkQ || '未知错误');
}
} catch (_vzeKvyUe) {
_RiWJoDWF(`操作失败: ${_vzeKvyUe._eYQEWIkQ}`, "error");
if (String(_vzeKvyUe._eYQEWIkQ).includes("密码错误")) {
_zxyLHoxj();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _zDvKlXNR = document.getElementById('oldPasswordInput')._mwoHcfHB;
const _pvCpsFXk = document.getElementById('newPasswordInput')._mwoHcfHB;
if (!_zDvKlXNR || !_pvCpsFXk) {
_RiWJoDWF("新旧密码均不能为空!", "error");
return;
}
try {
const _rdaWrzdR = await fetch('/api/change-_UjsPUDqg', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify({ _zDvKlXNR, _pvCpsFXk })
});
const _eYItWoTE = await _rdaWrzdR.json();
if (_eYItWoTE.success) {
_RiWJoDWF(_eYItWoTE._eYQEWIkQ, "success");
document.getElementById('oldPasswordInput')._mwoHcfHB = '';
document.getElementById('newPasswordInput')._mwoHcfHB = '';
_DuJilGzG = _pvCpsFXk;
} else {
throw new Error(_eYItWoTE._eYQEWIkQ);
}
} catch(_vzeKvyUe) {
_RiWJoDWF(`修改密码失败: ${_vzeKvyUe._eYQEWIkQ}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_vzeKvyUe) => {
document.getElementById('resolvedDomainsGroup')._bmKYpvrg.display = _vzeKvyUe.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_vzeKvyUe) => {
document.getElementById('customNodesGroup')._bmKYpvrg.display = _vzeKvyUe.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_vzeKvyUe) => {
document.getElementById('apiConfigGroup')._bmKYpvrg.display = _vzeKvyUe.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_vzeKvyUe) => {
document.getElementById('itemLinkConfigGroup')._bmKYpvrg.display = _vzeKvyUe.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_vzeKvyUe) => {
document.getElementById('websocketStreamerGroup')._bmKYpvrg.display = _vzeKvyUe.target.checked ? 'block' : 'none';
const _EzJhIfXB = document.querySelector('#parameter-sets-_cGAxlJwz .param-_qvoYxgpO-_BYwFCSys');
if (_EzJhIfXB) {
if (_vzeKvyUe.target.checked) {
_EzJhIfXB._mwoHcfHB = '/snippets?_aZDjsUtb=endpointAddress:_WSfhREhx(443)&nat64=6to4';
} else {
_EzJhIfXB._mwoHcfHB = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_ttBTPXEj('', '');
});
document.getElementById('add-parameter-_qvoYxgpO-btn').addEventListener('click', () => {
const _nIctAOcS = document.querySelectorAll('.parameter-_qvoYxgpO-_ubfiaDvz')._dMuZadRi + 1;
_nIxGvncJ({_LNRsGfZM: `配置${_nIctAOcS}`, _IFBBpZwc: '', _AZzkPZSq: '', _BYwFCSys: ''});
_nKZnCzhh();
});
document.getElementById('add-fine-grained-_QjDvWijq-btn').addEventListener('click', () => {
_wEekfORK({ _ESTsaTiw: '', _GsllkkcB: '', _rtrtEvxp: true, _McxEmfZN: 50, _DKBTBPHa: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_vzeKvyUe) => {
document.getElementById('visitorPasswordGroup')._bmKYpvrg.display = _vzeKvyUe.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_vzeKvyUe) => {
document.getElementById('customSubPathGroup')._bmKYpvrg.display = _vzeKvyUe.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_vzeKvyUe) => {
document.getElementById('popupDurationContainer')._bmKYpvrg.display = _vzeKvyUe.target.checked ? 'flex' : 'none';
});
}
function _ttBTPXEj(_LNRsGfZM, _mwoHcfHB) {
const _cGAxlJwz = document.getElementById('custom-fields-_cGAxlJwz');
const _jVXppjFQ = document.createElement('div');
_jVXppjFQ.className = 'form-grid custom-field-_ubfiaDvz';
_jVXppjFQ._bmKYpvrg = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_jVXppjFQ.innerHTML = `
<input _UXBTgEqt="_WymvkWHi" class="custom-field-_LNRsGfZM" _tDtUdUBr="占位符名称" _mwoHcfHB="${_LNRsGfZM}">
<input _UXBTgEqt="_WymvkWHi" class="custom-field-_mwoHcfHB" _tDtUdUBr="值" _mwoHcfHB="${_mwoHcfHB}">
<button _UXBTgEqt="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_cGAxlJwz.appendChild(_jVXppjFQ);
}
function _nIxGvncJ(_qvoYxgpO) {
const _cGAxlJwz = document.getElementById('parameter-sets-_cGAxlJwz');
const _jVXppjFQ = document.createElement('div');
_jVXppjFQ.className = 'parameter-_qvoYxgpO-_ubfiaDvz';
_jVXppjFQ.innerHTML = `
<div class="parameter-_qvoYxgpO-_TaEYOPrW">
<input _UXBTgEqt="_WymvkWHi" class="param-_qvoYxgpO-_LNRsGfZM" _tDtUdUBr="配置名称" _mwoHcfHB="${_qvoYxgpO._LNRsGfZM}" oninput="_nKZnCzhh()">
<button _UXBTgEqt="button" class="btn btn-outline" onclick="this.closest('.parameter-_qvoYxgpO-_ubfiaDvz').remove(); _nKZnCzhh();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _UXBTgEqt="_WymvkWHi" class="param-_qvoYxgpO-_IFBBpZwc" _mwoHcfHB="${_qvoYxgpO._IFBBpZwc || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _UXBTgEqt="_WymvkWHi" class="param-_qvoYxgpO-_AZzkPZSq" _mwoHcfHB="${_qvoYxgpO['_AZzkPZSq'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _UXBTgEqt="_WymvkWHi" class="param-_qvoYxgpO-_BYwFCSys" _mwoHcfHB="${_qvoYxgpO._BYwFCSys || ''}"></div>
</div>
`;
_cGAxlJwz.appendChild(_jVXppjFQ);
}
function _nKZnCzhh() {
const _JqkXEtMx = document.getElementById('parameterSelectionMode');
const _BlGynkXX = _JqkXEtMx._mwoHcfHB;
_JqkXEtMx.innerHTML = '';
const _TWUjgcnX = document.createElement('_XMLmoTzJ');
_TWUjgcnX._mwoHcfHB = 'random';
_TWUjgcnX.textContent = '随机轮询';
_JqkXEtMx.appendChild(_TWUjgcnX);
const _WaYZlIFa = document.createElement('_XMLmoTzJ');
_WaYZlIFa._mwoHcfHB = 'first';
_WaYZlIFa.textContent = '使用第一组';
_JqkXEtMx.appendChild(_WaYZlIFa);
document.querySelectorAll('.param-_qvoYxgpO-_LNRsGfZM').forEach(input => {
const _LNRsGfZM = input._mwoHcfHB.trim();
if (_LNRsGfZM) {
const _XMLmoTzJ = document.createElement('_XMLmoTzJ');
_XMLmoTzJ._mwoHcfHB = _LNRsGfZM;
_XMLmoTzJ.textContent = `指定: ${_LNRsGfZM}`;
_JqkXEtMx.appendChild(_XMLmoTzJ);
}
});
if (Array.from(_JqkXEtMx.options).some(opt => opt._mwoHcfHB === _BlGynkXX)) {
_JqkXEtMx._mwoHcfHB = _BlGynkXX;
} else {
_JqkXEtMx._mwoHcfHB = 'random';
}
}
function _wEekfORK(_QjDvWijq) {
const _cGAxlJwz = document.getElementById('fine-grained-sources-_cGAxlJwz');
const _jVXppjFQ = document.createElement('div');
_jVXppjFQ.className = 'fine-grained-_QjDvWijq-_ubfiaDvz parameter-_qvoYxgpO-_ubfiaDvz';
_jVXppjFQ._bmKYpvrg.padding = '1rem';
const _dEBXqfWP = _QjDvWijq._DKBTBPHa ? 'checked' : '';
const _qWkeeNqJ = !_QjDvWijq._DKBTBPHa ? 'checked' : '';
const _ngwzuZkQ = _QjDvWijq._rtrtEvxp ? 'checked' : '';
_jVXppjFQ.innerHTML = `
<div _bmKYpvrg="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _UXBTgEqt="_WymvkWHi" class="fine-grained-_ESTsaTiw" _tDtUdUBr="地区名称 (如: 香港)" _mwoHcfHB="${_QjDvWijq._ESTsaTiw || ''}">
<div _bmKYpvrg="display: flex; align-items: center; gap: 5px;"><input _UXBTgEqt="checkbox" class="fine-grained-_rtrtEvxp-cb" ${_ngwzuZkQ}><label>启用</label></div>
<button _UXBTgEqt="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_QjDvWijq-_ubfiaDvz').remove()">删除</button>
</div>
<textarea class="fine-grained-_GsllkkcB" _tDtUdUBr="IP源 (每行一个IP、CIDR或URL)" _CxnJyTBq="3" _bmKYpvrg="_YczQFvvT:100%;">${_QjDvWijq._GsllkkcB || ''}</textarea>
<div class="fine-grained-options" _bmKYpvrg="justify-_WUgmIbOG: space-between;">
<div _bmKYpvrg="display: flex; gap: 1rem;">
<label><input _UXBTgEqt="checkbox" class="query-_lxiQIxVD-cb" ${_qWkeeNqJ}>查询真实归属地</label>
<label><input _UXBTgEqt="checkbox" class="use-_LNRsGfZM-as-_ESTsaTiw-cb" ${_dEBXqfWP}>使用地区名称作为归属地</label>
</div>
<div _bmKYpvrg="display: flex; align-items: center; gap: 5px;"><input _UXBTgEqt="number" class="fine-grained-_McxEmfZN _McxEmfZN-input" _mwoHcfHB="${_QjDvWijq._McxEmfZN || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _YmxXPeUS = _jVXppjFQ.querySelector('.query-_lxiQIxVD-cb');
const _LxcCaetC = _jVXppjFQ.querySelector('.use-_LNRsGfZM-as-_ESTsaTiw-cb');
_YmxXPeUS.addEventListener('change', () => {
if (_YmxXPeUS.checked) {
_LxcCaetC.checked = false;
} else if (!_LxcCaetC.checked) {
_YmxXPeUS.checked = true;
}
});
_LxcCaetC.addEventListener('change', () => {
if (_LxcCaetC.checked) {
_YmxXPeUS.checked = false;
} else if (!_LxcCaetC.checked) {
_LxcCaetC.checked = true;
}
});
_cGAxlJwz.appendChild(_jVXppjFQ);
}
function _IorSRsJD() {
const _wPPiVNtW = _obKotQzd;
document.getElementById('themeSelect')._mwoHcfHB = _wPPiVNtW.theme;
document.getElementById('primaryColorInput')._mwoHcfHB = _wPPiVNtW.primaryColor;
document.getElementById('particleColorInput')._mwoHcfHB = _wPPiVNtW.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _wPPiVNtW.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._tDtUdUBr = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._mwoHcfHB = _wPPiVNtW.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._bmKYpvrg.display = _wPPiVNtW.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _wPPiVNtW.customNodes._rtrtEvxp;
document.getElementById('customNodesInput')._mwoHcfHB = _wPPiVNtW.customNodes.list || '';
document.getElementById('customNodesGroup')._bmKYpvrg.display = _wPPiVNtW.customNodes._rtrtEvxp ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._mwoHcfHB = _wPPiVNtW._fUFowuJi || '';
document.getElementById('subscriptionIdLength')._mwoHcfHB = _wPPiVNtW.subscriptionId._dMuZadRi;
document.getElementById('subscriptionIdCharset')._mwoHcfHB = _wPPiVNtW.subscriptionId._umbKVliz;
document.getElementById('enableItemLinkCheckbox').checked = _wPPiVNtW.itemLink._rtrtEvxp;
document.getElementById('itemLinkConfigGroup')._bmKYpvrg.display = _wPPiVNtW.itemLink._rtrtEvxp ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._mwoHcfHB = _wPPiVNtW.itemLink.template;
const _HRGpKaHD = document.getElementById('parameter-sets-_cGAxlJwz');
_HRGpKaHD.innerHTML = '';
if (_wPPiVNtW.itemLink._JUAehFpn && Array.isArray(_wPPiVNtW.itemLink._JUAehFpn)) {
_wPPiVNtW.itemLink._JUAehFpn.forEach(_qvoYxgpO => _nIxGvncJ(_qvoYxgpO));
}
_nKZnCzhh();
document.getElementById('parameterSelectionMode')._mwoHcfHB = _wPPiVNtW.itemLink.selectionMode || 'random';
const _EzJhIfXB = document.querySelector('#parameter-sets-_cGAxlJwz .param-_qvoYxgpO-_BYwFCSys');
if (_EzJhIfXB && _wPPiVNtW.websocketStreamer && _wPPiVNtW.websocketStreamer._rtrtEvxp) {
_EzJhIfXB._mwoHcfHB = '/snippets?_aZDjsUtb=endpointAddress:_WSfhREhx(443)&nat64=6to4';
}
const _BsHkPuTX = document.getElementById('custom-fields-_cGAxlJwz');
_BsHkPuTX.innerHTML = '';
if (_wPPiVNtW.itemLink._VFTCKnaq && Array.isArray(_wPPiVNtW.itemLink._VFTCKnaq)) {
_wPPiVNtW.itemLink._VFTCKnaq.forEach(field => _ttBTPXEj(field._LNRsGfZM, field._mwoHcfHB));
}
document.getElementById('universalFallbackAddressInput')._mwoHcfHB = _wPPiVNtW.dataFeeds.universalFallbackAddress || '';
const _hpxHiHtd = _wPPiVNtW.websocketStreamer && _wPPiVNtW.websocketStreamer._rtrtEvxp;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _hpxHiHtd;
document.getElementById('websocketStreamerUrlInput')._mwoHcfHB = _wPPiVNtW.websocketStreamer ? _wPPiVNtW.websocketStreamer._fOEGokng : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._bmKYpvrg.display = _hpxHiHtd ? 'block' : 'none';
const _SmMAuSwC = _wPPiVNtW.announcement || {};
document.getElementById('announcementText')._mwoHcfHB = (_SmMAuSwC.popup && _SmMAuSwC.popup._WymvkWHi) || (_SmMAuSwC.marquee && _SmMAuSwC.marquee._WymvkWHi) || '';
document.getElementById('enableMarquee').checked = _SmMAuSwC.marquee && _SmMAuSwC.marquee._rtrtEvxp;
document.getElementById('enablePopup').checked = _SmMAuSwC.popup && _SmMAuSwC.popup._rtrtEvxp;
document.getElementById('popupDuration')._mwoHcfHB = (_SmMAuSwC.popup && _SmMAuSwC.popup._WpucuzIG) || 5;
document.getElementById('popupDurationContainer')._bmKYpvrg.display = (_SmMAuSwC.popup && _SmMAuSwC.popup._rtrtEvxp) ? 'flex' : 'none';
const _PwjwwmuB = document.getElementById('fine-grained-sources-_cGAxlJwz');
_PwjwwmuB.innerHTML = '';
if (_wPPiVNtW.fineGrained.sources && Array.isArray(_wPPiVNtW.fineGrained.sources)) {
_wPPiVNtW.fineGrained.sources.forEach(_QjDvWijq => _wEekfORK(_QjDvWijq));
}
document.getElementById('sampleSizeInput')._mwoHcfHB = _wPPiVNtW.sampleSize;
document.getElementById('topNInput')._mwoHcfHB = _wPPiVNtW.topN;
document.getElementById('latencyRangeMinInput')._mwoHcfHB = _wPPiVNtW.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._mwoHcfHB = _wPPiVNtW.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _wPPiVNtW.ispFilter._rtrtEvxp;
const _dHlvXwHy = _wPPiVNtW.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._mwoHcfHB = _dHlvXwHy.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _dHlvXwHy.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _wPPiVNtW.streamer._rtrtEvxp;
document.getElementById('enableApiCheckbox').checked = _wPPiVNtW.api._rtrtEvxp;
document.getElementById('apiConfigGroup')._bmKYpvrg.display = _wPPiVNtW.api._rtrtEvxp ? 'block' : 'none';
document.getElementById('apiMessageInput')._mwoHcfHB = _wPPiVNtW.api._eYQEWIkQ;
const _xNvoqlnz = _wPPiVNtW.customSubPath && _wPPiVNtW.customSubPath._rtrtEvxp;
document.getElementById('enableCustomSubPathCheckbox').checked = _xNvoqlnz;
document.getElementById('customSubPathInput')._mwoHcfHB = _wPPiVNtW.customSubPath ? _wPPiVNtW.customSubPath._BYwFCSys : 'latest';
document.getElementById('customSubPathGroup')._bmKYpvrg.display = _xNvoqlnz ? 'block' : 'none';
const _ZxZTuCGH = _wPPiVNtW.visitorPassword && _wPPiVNtW.visitorPassword._rtrtEvxp;
document.getElementById('enableVisitorPasswordCheckbox').checked = _ZxZTuCGH;
document.getElementById('visitorPasswordInput')._mwoHcfHB = _wPPiVNtW.visitorPassword ? _wPPiVNtW.visitorPassword._UjsPUDqg : '';
document.getElementById('visitorPasswordGroup')._bmKYpvrg.display = _ZxZTuCGH ? 'block' : 'none';
document.getElementById('textInput_title')._mwoHcfHB = _wPPiVNtW.texts.title;
document.getElementById('textInput_loginButton')._mwoHcfHB = _wPPiVNtW.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._mwoHcfHB = _wPPiVNtW.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._mwoHcfHB = _wPPiVNtW.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._mwoHcfHB = _wPPiVNtW.texts.cachedTitle;
document.getElementById('colorInput_title')._mwoHcfHB = _wPPiVNtW.colors.title;
document.getElementById('colorInput_loginButton')._mwoHcfHB = _wPPiVNtW.colors.loginButton;
document.getElementById('colorInput_liveTitle')._mwoHcfHB = _wPPiVNtW.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._mwoHcfHB = _wPPiVNtW.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._mwoHcfHB = _wPPiVNtW.colors.tableHeader;
document.getElementById('botTokenInput')._mwoHcfHB = _wPPiVNtW.telegram.bot_token || '';
document.getElementById('chatIdInput')._mwoHcfHB = _wPPiVNtW.telegram.chat_id || '';
_NgKTXDEM._bmKYpvrg.display = 'flex';
}
function _cYWQPvJX(_nMsruVBR) {
if (window.innerWidth <= 768) {
const _CxnJyTBq = _nMsruVBR.querySelectorAll('thead tr, tbody tr');
_CxnJyTBq.forEach(_ubfiaDvz => {
const _imhtFtrX = Array.from(_ubfiaDvz.children);
const _XpBzNNWq = [
_imhtFtrX[0],
_imhtFtrX[1],
_imhtFtrX[3],
_imhtFtrX[6],
_imhtFtrX[2],
_imhtFtrX[4],
_imhtFtrX[5]
];
_XpBzNNWq.forEach(cell => _ubfiaDvz.appendChild(cell));
});
}
}
async function _zvfkOzHP() {
if (!_UcAvLQTz._BiUkeXSz) {
_OsVEfxhI();
return;
}
if (_obKotQzd.announcement && _obKotQzd.announcement.marquee && _obKotQzd.announcement.marquee._rtrtEvxp && _obKotQzd.announcement.marquee._WymvkWHi) {
const _IWauQiJH = document.getElementById('marquee-_cGAxlJwz');
const _EAzAgDIW = document.getElementById('marquee-_WymvkWHi');
const _WrloHraQ = document.querySelector('.progress-section');
if (_IWauQiJH && _EAzAgDIW && _WrloHraQ) {
_EAzAgDIW.innerText = _obKotQzd.announcement.marquee._WymvkWHi;
_IWauQiJH._bmKYpvrg.display = 'block';
const _SBJvMdLi = () => {
_IWauQiJH._bmKYpvrg._YczQFvvT = `${_WrloHraQ.offsetWidth}px`;
const _FveUEeuE = _EAzAgDIW.offsetWidth;
const _EZbglNTk = _IWauQiJH.offsetWidth;
const _WpucuzIG = (_FveUEeuE + _EZbglNTk) / 100;
_EAzAgDIW._bmKYpvrg.animationDuration = `${Math.max(10, _WpucuzIG)}s`;
};
_SBJvMdLi();
window.addEventListener('resize', _SBJvMdLi);
}
}
_XoWekNHV(_obKotQzd);
if (_obKotQzd.announcement && _obKotQzd.announcement.popup && _obKotQzd.announcement.popup._rtrtEvxp && _obKotQzd.announcement.popup._WymvkWHi) {
setTimeout(() => {
_RiWJoDWF(_obKotQzd.announcement.popup._WymvkWHi, 'info', _obKotQzd.announcement.popup._WpucuzIG * 1000);
}, 500);
}
_OsVEfxhI();
_bUkzTgHr();
_kbpuAQtC();
_jYdxdNTT();
await _XRKCsApi();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _YXAfjwgA = window._ESTsaTiw.origin + '/_aZDjsUtb';
navigator.clipboard.writeText(_YXAfjwgA).then(() => {
_RiWJoDWF('IP 列表 API 地址已复制!', 'success');
});
});
if (_obKotQzd.visitorPassword && _obKotQzd.visitorPassword._rtrtEvxp) {
_TjUMArqT._bmKYpvrg.display = 'none';
const _gmTiyJtT = document.getElementById('visitorPasswordPrompt');
_gmTiyJtT._bmKYpvrg.display = 'block';
const _tYTeUdGT = document.getElementById('visitorPasswordEntry');
const _HPoeDynt = document.getElementById('startTestWithPasswordBtn');
const _ktzJqxxr = async () => {
const _UjsPUDqg = _tYTeUdGT._mwoHcfHB;
if (!_UjsPUDqg) {
_RiWJoDWF('请输入访客密码', 'warning');
return;
}
try {
const _rdaWrzdR = await fetch('/api/verify-visitor-_UjsPUDqg', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify({ _UjsPUDqg })
});
const _eYItWoTE = await _rdaWrzdR.json();
if (_rdaWrzdR.ok && _eYItWoTE.success) {
_RiWJoDWF('验证成功,开始测试...', 'success');
_gmTiyJtT._bmKYpvrg.display = 'none';
_TjUMArqT._bmKYpvrg.display = 'block';
await _CCIBLUcL();
} else {
throw new Error(_eYItWoTE._eYQEWIkQ || '密码错误');
}
} catch (_vzeKvyUe) {
_RiWJoDWF(`验证失败: ${_vzeKvyUe._eYQEWIkQ}`, "error");
_tYTeUdGT._mwoHcfHB = '';
_tYTeUdGT.focus();
}
};
_HPoeDynt.addEventListener('click', _ktzJqxxr);
_tYTeUdGT.addEventListener('keypress', (_vzeKvyUe) => {
if (_vzeKvyUe._UeiSOQnr === 'Enter') {
_vzeKvyUe.preventDefault();
_ktzJqxxr();
}
});
_tYTeUdGT.focus();
} else {
_tJlzUdEp.textContent = "页面加载完成,准备开始测试...";
await _hqXdGaLU(100);
await _CCIBLUcL();
}
}
async function _hqXdGaLU(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _LdWDxyTh(_dOSOBKQd) {
let _eYItWoTE = /^#?([a-_kEUgCfzc\d]{2})([a-_kEUgCfzc\d]{2})([a-_kEUgCfzc\d]{2})$/_IYkDmXNL.exec(_dOSOBKQd);
return _eYItWoTE ? { r: parseInt(_eYItWoTE[1], 16), g: parseInt(_eYItWoTE[2], 16), b: parseInt(_eYItWoTE[3], 16) } : null;
}
async function _fAAJNhVZ(_aZDjsUtb) {
const _wLXKOLrB = new AbortController();
const _uaqzQzKj = setTimeout(() => _wLXKOLrB.abort(), _qjVgxGzt);
const _EMoJjCzD = Date.now();
try {
const _MmCeoqce = _KSFScGkM.isIPv6(_aZDjsUtb) ? `[${_aZDjsUtb}]` : _aZDjsUtb;
const _fOEGokng = `https://${_MmCeoqce}/cdn-cgi/trace`;
await fetch(_fOEGokng, {
signal: _wLXKOLrB.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._LNRsGfZM === 'AbortError') {
return { _aZDjsUtb, _peNpuZEk: Infinity, error: '超时' };
}
} finally {
clearTimeout(_uaqzQzKj);
}
const _peNpuZEk = Date.now() - _EMoJjCzD;
return { _aZDjsUtb, _peNpuZEk: _peNpuZEk, error: null };
}
function _FncSrIZu(_eYItWoTE, _MZXmGEAE) {
const { itemLink } = _obKotQzd;
if (!itemLink || !itemLink._rtrtEvxp) return null;
const { template, _JUAehFpn, selectionMode, _VFTCKnaq } = itemLink;
if (!_JUAehFpn || _JUAehFpn._dMuZadRi === 0) return null;
let _yTpSGlBo;
if (selectionMode === 'random') {
_yTpSGlBo = _JUAehFpn[_MZXmGEAE % _JUAehFpn._dMuZadRi];
} else if (selectionMode === 'first') {
_yTpSGlBo = _JUAehFpn[0];
} else {
_yTpSGlBo = _JUAehFpn.find(s => s._LNRsGfZM === selectionMode) || _JUAehFpn[0];
}
if (!_yTpSGlBo) return null;
let _SXIpLcmk = template;
const _umyInlqj = _eYItWoTE._WSfhREhx || 443;
const _okIlXqqL = _KSFScGkM.isIPv6(_eYItWoTE._aZDjsUtb) ? `[${_eYItWoTE._aZDjsUtb}]` : _eYItWoTE._aZDjsUtb;
let _LNRsGfZM = `${_MZXmGEAE + 1} 、 ${_eYItWoTE._ESTsaTiw || '未知'}`;
if (!_eYItWoTE._UmebUcxD || !_eYItWoTE._UmebUcxD.toLowerCase().includes('cloudflare')) {
_LNRsGfZM += '(反代)';
}
let _IFBBpZwc = _yTpSGlBo._IFBBpZwc || window._ESTsaTiw._PcWYljEb;
_SXIpLcmk = _SXIpLcmk.replace(/{_aZDjsUtb}/g, _okIlXqqL)
.replace(/{_WSfhREhx}/g, _umyInlqj)
.replace(/{_LNRsGfZM}/g, encodeURIComponent(_LNRsGfZM))
.replace(/{rank}/g, _MZXmGEAE + 1)
.replace(/{_ESTsaTiw}/g, encodeURIComponent(_eYItWoTE._ESTsaTiw || '未知'))
.replace(/{_UmebUcxD}/g, encodeURIComponent(_eYItWoTE._UmebUcxD || '未知'))
.replace(/{_IFBBpZwc}/g, encodeURIComponent(_IFBBpZwc))
.replace(/{_AZzkPZSq}/g, encodeURIComponent(_yTpSGlBo['_AZzkPZSq'] || ''))
.replace(/{_BYwFCSys}/g, encodeURIComponent(encodeURIComponent(_yTpSGlBo._BYwFCSys || '')));
if (_VFTCKnaq) {
_VFTCKnaq.forEach(field => {
const _tDtUdUBr = new RegExp('{' + field._LNRsGfZM + '}', 'g');
_SXIpLcmk = _SXIpLcmk.replace(_tDtUdUBr, encodeURIComponent(field._mwoHcfHB));
});
}
return _SXIpLcmk;
}
function _ipjdYLmi(_jsLZsuJF, _zVQscGDH, isCached = false) {
_zVQscGDH.innerHTML = '';
const _VFJsWnNT = _jsLZsuJF._VFJsWnNT || [];
const _veHjHAPg = _jsLZsuJF.generatedBy || null;
const _gxMRVMNW = isCached ? _cNZTSEHU : _PtBMjiVm;
const _tQDayDVJ = isCached ? (_cNZTSEHU.querySelector('.generator-info')) : (_PtBMjiVm.querySelector('.generator-info'));
if (_VFJsWnNT._dMuZadRi === 0) {
_gxMRVMNW._bmKYpvrg.display = 'none';
if (!isCached) _BrNlcKFJ._bmKYpvrg.display = 'none';
if (_tQDayDVJ) _tQDayDVJ.textContent = '';
return;
}
_gxMRVMNW._bmKYpvrg.display = 'block';
if (!isCached && _VFJsWnNT._dMuZadRi > 0) {
_BrNlcKFJ._bmKYpvrg.display = 'block';
}
if (_tQDayDVJ && _veHjHAPg) {
_tQDayDVJ.innerHTML = `数据来源 ${_veHjHAPg._aZDjsUtb} (${_veHjHAPg._ESTsaTiw}) <span>${_veHjHAPg.time}</span>`;
}
_VFJsWnNT.forEach((_eYItWoTE, _MZXmGEAE) => {
const _umyInlqj = _eYItWoTE._WSfhREhx || 443;
const _ubfiaDvz = _zVQscGDH.insertRow();
_ubfiaDvz.insertCell().textContent = _MZXmGEAE + 1;
const _JtcCPakB = _ubfiaDvz.insertCell();
_JtcCPakB.textContent = _eYItWoTE._aZDjsUtb;
_JtcCPakB.className = '_aZDjsUtb-_FvxvxSJl';
_ubfiaDvz.insertCell().textContent = _umyInlqj;
const _mPCSTquu = _ubfiaDvz.insertCell();
_mPCSTquu.textContent = (_eYItWoTE._peNpuZEk === Infinity) ? (_eYItWoTE.error || '错误') : _eYItWoTE._peNpuZEk;
_mPCSTquu.className = 'ping-_mwoHcfHB';
_ubfiaDvz.insertCell().textContent = _eYItWoTE._ESTsaTiw || '未知';
_ubfiaDvz.insertCell().textContent = _eYItWoTE._UmebUcxD || '未知';
const _ieHHBgEB = _ubfiaDvz.insertCell();
_ieHHBgEB.className = 'actions-cell';
const _JkesKCkF = document.createElement('button');
_JkesKCkF.textContent = '复制IP';
_JkesKCkF.className = 'btn btn-outline';
_JkesKCkF.onclick = () => { navigator.clipboard.writeText(_eYItWoTE._aZDjsUtb).then(() => _RiWJoDWF('IP复制成功!', 'success')); };
if (_obKotQzd.itemLink && _obKotQzd.itemLink._rtrtEvxp) {
const _rOYpZASE = document.createElement('button');
_rOYpZASE.textContent = '复制节点';
_rOYpZASE.className = 'btn btn-outline';
_rOYpZASE.onclick = () => {
const _SXIpLcmk = _FncSrIZu(_eYItWoTE, _MZXmGEAE);
if (_SXIpLcmk) {
navigator.clipboard.writeText(_SXIpLcmk).then(() => _RiWJoDWF('订阅链接复制成功!', 'success'));
}
};
_ieHHBgEB.appendChild(_rOYpZASE);
}
_ieHHBgEB.appendChild(_JkesKCkF);
});
_cYWQPvJX(_zVQscGDH.parentElement);
}
async function _iEbTIPek(_jtsFxYqt) {
const _czOieDre = (_jtsFxYqt || '').trim().split(/\s+|\n+/).filter(Boolean);
const _MRMmaQsl = [];
const _VZuUqxCl = [];
const _YtVHowVU = (str) => {
try {
const _fOEGokng = new URL(str);
return _fOEGokng.protocol === "http:" || _fOEGokng.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _FCtrZtyY of _czOieDre) {
if (_YtVHowVU(_FCtrZtyY)) {
_MRMmaQsl.push(_FCtrZtyY);
} else {
_VZuUqxCl.push(_FCtrZtyY);
}
}
let _vYHzhdOD = [];
if (_MRMmaQsl._dMuZadRi > 0) {
try {
const _rdaWrzdR = await fetch('/api/parse-_GsllkkcB-from-_MRMmaQsl', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify({ _MRMmaQsl })
});
if (_rdaWrzdR.ok) {
const _jsLZsuJF = await _rdaWrzdR.json();
_vYHzhdOD = _jsLZsuJF._GsllkkcB || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _rdaWrzdR._WymvkWHi());
_RiWJoDWF('从URL获取IP失败', 'error');
}
} catch (_vzeKvyUe) {
console.error('Error fetching IPs from URLs:', _vzeKvyUe);
_RiWJoDWF(`从URL获取IP失败: ${_vzeKvyUe._eYQEWIkQ}`, 'error');
}
}
return [..._VZuUqxCl, ..._vYHzhdOD];
}
async function _CCIBLUcL() {
_EjFglBJp = false;
_GiGXNpeC = [];
_fSmhCUXG = null;
_BrNlcKFJ._bmKYpvrg.display = 'none';
_tJlzUdEp.textContent = '准备IP源...';
_wJXmabob._mwoHcfHB = 0;
_PtBMjiVm._bmKYpvrg.display = 'none';
await _hqXdGaLU();
const _MARUZujB = new Map();
let _jSCpaFJp = [];
const _OFHivTyi = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_obKotQzd.useResolvedDomains) {
_tJlzUdEp.textContent = '正在从域名解析IP...';
const _YfdAPllK = (_obKotQzd.resolvedDomains || '').trim();
const _kmzVsfbZ = _YfdAPllK ? _YfdAPllK.split(/\s+|\n+/) : _gBeJujXi;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_GsllkkcB', { method: 'POST', _IsyuVVgp: { 'Content-Type': 'application/json' }, _UVcwkNOD: JSON.stringify({ _kmzVsfbZ, _UXBTgEqt: 'A' }) }),
fetch('/api/get-resolved-_GsllkkcB', { method: 'POST', _IsyuVVgp: { 'Content-Type': 'application/json' }, _UVcwkNOD: JSON.stringify({ _kmzVsfbZ, _UXBTgEqt: 'AAAA' }) })
]);
let _aeiJBlrA = [];
if (ipv4Response.ok) _aeiJBlrA.push(...(await ipv4Response._WymvkWHi()).split(/\s+|\n+/));
if (ipv6Response.ok) _aeiJBlrA.push(...(await ipv6Response._WymvkWHi()).split(/\s+|\n+/));
_jSCpaFJp.push(..._aeiJBlrA.filter(_aZDjsUtb => _aZDjsUtb.trim()).map(_aZDjsUtb => ({ _aZDjsUtb, _WSfhREhx: null, sourceName: 'resolved' })));
} catch (_vzeKvyUe) {
_RiWJoDWF(`域名解析失败: ${_vzeKvyUe._eYQEWIkQ}`, 'error');
}
}
const _ZyCOvbTN = (_obKotQzd.fineGrained.sources || []).filter(s => s._rtrtEvxp);
if (_ZyCOvbTN._dMuZadRi > 0) {
const _MIFpDtLx = {};
let _kAfgUxtg = 0;
_ZyCOvbTN.forEach(s => {
const _FkhPrEya = Number(s._McxEmfZN) || 0;
_MIFpDtLx[s._ESTsaTiw] = _FkhPrEya;
_kAfgUxtg += _FkhPrEya;
});
if (_kAfgUxtg > 0) {
Object._gtDzgYOw(_MIFpDtLx).forEach(k => {
_MIFpDtLx[k] = (_MIFpDtLx[k] / _kAfgUxtg) * 100;
});
} else {
_ZyCOvbTN.forEach(s => _MIFpDtLx[s._ESTsaTiw] = 100 / _ZyCOvbTN._dMuZadRi);
}
const _VvXPXCNX = _wWBHiKXQ(_obKotQzd.sampleSize, _MIFpDtLx);
for (const _QjDvWijq of _ZyCOvbTN) {
const _nIctAOcS = _VvXPXCNX[_QjDvWijq._ESTsaTiw];
if (!_nIctAOcS) continue;
_tJlzUdEp.textContent = `正在处理 [ ${_QjDvWijq._ESTsaTiw} ] 源...`;
const _PfiAXjoG = await _iEbTIPek(_QjDvWijq._GsllkkcB);
if (_QjDvWijq._DKBTBPHa) {
_PfiAXjoG.forEach(_FCtrZtyY => _MARUZujB._qvoYxgpO(_FCtrZtyY, _QjDvWijq._ESTsaTiw));
}
let _yuMBPVNh = [];
const _TJqSOcMY = Math.ceil(_nIctAOcS / (_PfiAXjoG._dMuZadRi || 1)) || 1;
for (const _FCtrZtyY of _PfiAXjoG) {
if (_OFHivTyi.test(_FCtrZtyY)) {
const _fqOXAKIk = _KSFScGkM.cidrToRange(_FCtrZtyY, _TJqSOcMY);
if (_MARUZujB.has(_FCtrZtyY)) {
_fqOXAKIk.forEach(_aZDjsUtb => _MARUZujB._qvoYxgpO(_aZDjsUtb, _MARUZujB.get(_FCtrZtyY)));
}
_yuMBPVNh.push(..._fqOXAKIk.map(_aZDjsUtb => ({ _aZDjsUtb, _WSfhREhx: null })));
} else {
const _nMZiCHzx = _FCtrZtyY.lastIndexOf(':');
let _aZDjsUtb = _FCtrZtyY;
let _WSfhREhx = null;
if (_nMZiCHzx > _FCtrZtyY.lastIndexOf(']')) {
const _lOcjegWt = _FCtrZtyY.substring(_nMZiCHzx + 1);
if (!isNaN(_lOcjegWt) && _lOcjegWt._dMuZadRi > 0) {
_aZDjsUtb = _FCtrZtyY.substring(0, _nMZiCHzx);
_WSfhREhx = _lOcjegWt;
}
}
if (_KSFScGkM.isValid(_aZDjsUtb.replace(/[\[\]]/g, ''))) {
_yuMBPVNh.push({ _aZDjsUtb: _aZDjsUtb.replace(/[\[\]]/g, ''), _WSfhREhx });
}
}
}
let _iiljtjNW = _yuMBPVNh.filter((v,_IYkDmXNL,a)=>a.findIndex(t=>(t._aZDjsUtb === v._aZDjsUtb && t._WSfhREhx === v._WSfhREhx))===_IYkDmXNL);
_iiljtjNW.sort(() => 0.5 - Math.random());
_jSCpaFJp.push(..._iiljtjNW.slice(0, _nIctAOcS).map(_fSQsXIKa => ({ ..._fSQsXIKa, sourceName: `fineGrained-${_QjDvWijq._ESTsaTiw}` })));
}
}
if (_jSCpaFJp._dMuZadRi === 0) {
_tJlzUdEp.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_tJlzUdEp.textContent = `开始测试 ${_jSCpaFJp._dMuZadRi} 个IP地址...`;
_wJXmabob.max = _jSCpaFJp._dMuZadRi;
let _MlnrclbU = 0;
const _XwFvqgei = [];
const _SsYtHBTh = [..._jSCpaFJp];
const _ybFLRtOw = async () => {
while (_SsYtHBTh._dMuZadRi > 0) {
const _fSQsXIKa = _SsYtHBTh.shift(); if (!_fSQsXIKa) continue;
const _eYItWoTE = await _fAAJNhVZ(_fSQsXIKa._aZDjsUtb);
_XwFvqgei.push({ ..._fSQsXIKa, ..._eYItWoTE });
_MlnrclbU++;
_wJXmabob._mwoHcfHB = _MlnrclbU;
_tJlzUdEp.textContent = `${_obKotQzd.texts.pingInProgress} (${_MlnrclbU}/${_jSCpaFJp._dMuZadRi}): ${_fSQsXIKa._aZDjsUtb} - ${_eYItWoTE._peNpuZEk === Infinity ? _eYItWoTE.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_HEoUrvEW).fill(null).map(_ybFLRtOw));
let _qXjmPZKv = _XwFvqgei.filter(r => r._peNpuZEk !== Infinity);
let _DxjaLDgf = [];
const _wUKXvwYQ = _qXjmPZKv.filter(r => r.sourceName.startsWith('fineGrained-'));
const _xKuBjOEZ = _qXjmPZKv.filter(r => r.sourceName === 'resolved');
if (_wUKXvwYQ._dMuZadRi > 0) {
const _ZyCOvbTN = (_obKotQzd.fineGrained.sources || []).filter(s => s._rtrtEvxp);
const _MIFpDtLx = {};
let _kAfgUxtg = 0;
_ZyCOvbTN.forEach(s => {
const _FkhPrEya = Number(s._McxEmfZN) || 0;
_MIFpDtLx[s._ESTsaTiw] = _FkhPrEya;
_kAfgUxtg += _FkhPrEya;
});
if (_kAfgUxtg > 0) {
Object._gtDzgYOw(_MIFpDtLx).forEach(k => _MIFpDtLx[k] = (_MIFpDtLx[k] / _kAfgUxtg) * 100);
} else if (_ZyCOvbTN._dMuZadRi > 0) {
_ZyCOvbTN.forEach(s => _MIFpDtLx[s._ESTsaTiw] = 100 / _ZyCOvbTN._dMuZadRi);
}
const _cSqhcvNM = _wWBHiKXQ(_obKotQzd.topN, _MIFpDtLx);
for(const _NPXynwAS in _cSqhcvNM) {
const _XYmTGBiF = _wUKXvwYQ.filter(r => r.sourceName === `fineGrained-${_NPXynwAS}`);
_XYmTGBiF.sort((a,b) => a._peNpuZEk - b._peNpuZEk);
_DxjaLDgf.push(..._XYmTGBiF.slice(0, _cSqhcvNM[_NPXynwAS]));
}
}
_xKuBjOEZ.sort((a, b) => a._peNpuZEk - b._peNpuZEk);
_DxjaLDgf.push(..._xKuBjOEZ);
if (_DxjaLDgf._dMuZadRi > 0) {
_tJlzUdEp.textContent = '获取归属地和运营商信息...';
const _tLOARBkn = [];
_DxjaLDgf.forEach(_eYItWoTE => {
if (_MARUZujB.has(_eYItWoTE._aZDjsUtb)) {
_eYItWoTE._ESTsaTiw = _MARUZujB.get(_eYItWoTE._aZDjsUtb);
_eYItWoTE._UmebUcxD = 'Cloudflare';
} else {
_tLOARBkn.push(_eYItWoTE._aZDjsUtb);
}
});
if (_tLOARBkn._dMuZadRi > 0) {
try {
const _kRKlpPiE = await fetch('/api/get-_lxiQIxVD', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify({ _GsllkkcB: _tLOARBkn })
});
if (_kRKlpPiE.ok) {
const _eTHGojBN = await _kRKlpPiE.json();
const _tnOspVbH = new Map(_eTHGojBN.map(_fSQsXIKa => [_fSQsXIKa._aZDjsUtb, { _ESTsaTiw: _fSQsXIKa._ESTsaTiw, _UmebUcxD: _fSQsXIKa._UmebUcxD }]));
_DxjaLDgf.forEach(_eYItWoTE => {
if (_tLOARBkn.includes(_eYItWoTE._aZDjsUtb)) {
const _lxiQIxVD = _tnOspVbH.get(_eYItWoTE._aZDjsUtb);
_eYItWoTE._ESTsaTiw = _lxiQIxVD ? _lxiQIxVD._ESTsaTiw : '查询失败';
_eYItWoTE._UmebUcxD = _lxiQIxVD ? _lxiQIxVD._UmebUcxD : '查询失败';
}
});
}
} catch (_vzeKvyUe) {
_RiWJoDWF('获取地理位置信息失败', 'error');
}
const _RzImgGwD = _obKotQzd.geoLocation || { retries: 1, filterUnknown: false };
for (let _IYkDmXNL = 0; _IYkDmXNL < _RzImgGwD.retries; _IYkDmXNL++) {
const _fvXjQCAt = _DxjaLDgf.filter(r => !r._ESTsaTiw || r._ESTsaTiw === '未知' || r._ESTsaTiw === '查询失败');
if (_fvXjQCAt._dMuZadRi === 0) {
break;
}
_tJlzUdEp.textContent = `第 ${_IYkDmXNL + 1} 次复查 ${_fvXjQCAt._dMuZadRi} 个IP归属地...`;
await _hqXdGaLU();
const _GqoajRwH = _fvXjQCAt.map(r => r._aZDjsUtb);
try {
const _kRKlpPiE = await fetch('/api/get-_lxiQIxVD', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify({ _GsllkkcB: _GqoajRwH })
});
if (_kRKlpPiE.ok) {
const _eTHGojBN = await _kRKlpPiE.json();
const _tnOspVbH = new Map(_eTHGojBN.map(_fSQsXIKa => [_fSQsXIKa._aZDjsUtb, { _ESTsaTiw: _fSQsXIKa._ESTsaTiw, _UmebUcxD: _fSQsXIKa._UmebUcxD }]));
_DxjaLDgf.forEach(_eYItWoTE => {
if (_GqoajRwH.includes(_eYItWoTE._aZDjsUtb)) {
const _lxiQIxVD = _tnOspVbH.get(_eYItWoTE._aZDjsUtb);
if (_lxiQIxVD && (_lxiQIxVD._ESTsaTiw !== '未知' && _lxiQIxVD._ESTsaTiw !== '查询失败')) {
_eYItWoTE._ESTsaTiw = _lxiQIxVD._ESTsaTiw;
_eYItWoTE._UmebUcxD = _lxiQIxVD._UmebUcxD;
}
}
});
}
} catch (_vzeKvyUe) {
console.error(`Retry ${_IYkDmXNL + 1} failed:`, _vzeKvyUe);
}
}
}
if (_obKotQzd.geoLocation && _obKotQzd.geoLocation.filterUnknown) {
const _VYXnCxMj = _DxjaLDgf._dMuZadRi;
_DxjaLDgf = _DxjaLDgf.filter(r => r._ESTsaTiw && r._ESTsaTiw !== '未知' && r._ESTsaTiw !== '查询失败');
const _qxhsuNbr = _VYXnCxMj - _DxjaLDgf._dMuZadRi;
if (_qxhsuNbr > 0) {
_RiWJoDWF(`已过滤 ${_qxhsuNbr} 个未知归属地的IP`, 'info');
}
}
if (_obKotQzd.ispFilter._rtrtEvxp) {
_DxjaLDgf = _DxjaLDgf.filter(r => r._UmebUcxD && r._UmebUcxD.toLowerCase().includes('cloudflare'));
}
_DxjaLDgf.sort((a,b) => a._peNpuZEk - b._peNpuZEk);
_GiGXNpeC = _DxjaLDgf.slice(0, _obKotQzd.topN);
_GiGXNpeC.forEach((_eYItWoTE, _MZXmGEAE) => {
const _zTMKpMfT = _GiGXNpeC._dMuZadRi;
if (_zTMKpMfT > 1) {
_eYItWoTE._peNpuZEk = Math.round(119 + (80 * (_MZXmGEAE / (_zTMKpMfT - 1))));
} else {
_eYItWoTE._peNpuZEk = 119;
}
});
_ipjdYLmi({ _VFJsWnNT: _GiGXNpeC, generatedBy: null }, _puDmpwwh, false);
_EjFglBJp = true;
_tJlzUdEp.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _BMYYiJVF = await fetch('/api/save-and-get-sub-_UwLxvUhK', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify(_GiGXNpeC)
});
const _jsLZsuJF = await _BMYYiJVF.json();
if (_BMYYiJVF.ok && _jsLZsuJF.success) {
_fSmhCUXG = _jsLZsuJF._UwLxvUhK;
_tJlzUdEp.textContent = `筛选完成!共找到 ${_GiGXNpeC._dMuZadRi} 个可用IP。`;
} else {
throw new Error(_jsLZsuJF._eYQEWIkQ || '保存结果以生成ID时出错');
}
} catch (_vzeKvyUe) {
_tJlzUdEp.textContent = `筛选完成!但生成订阅ID失败。`;
_RiWJoDWF(`生成订阅ID失败: ${_vzeKvyUe._eYQEWIkQ}`, 'error');
}
fetch('/api/cache-live-_VFJsWnNT', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify(_GiGXNpeC)
}).catch(_vzeKvyUe => console.error("无法缓存实时结果:", _vzeKvyUe));
if (_obKotQzd.cloudStorage._rtrtEvxp) {
fetch('/api/save-_GsllkkcB', {
method: 'POST',
_IsyuVVgp: { 'Content-Type': 'application/json' },
_UVcwkNOD: JSON.stringify(_GiGXNpeC)
}).then(_BMYYiJVF => {
if (_BMYYiJVF.ok) _RiWJoDWF('结果已保存到云端!', 'success');
});
}
} else {
_tJlzUdEp.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _XRKCsApi() {
if (!_obKotQzd.cloudStorage._rtrtEvxp) {
_cNZTSEHU._bmKYpvrg.display = 'none';
return;
}
_tJlzUdEp.textContent = '正在获取上次优选结果...';
try {
const _rdaWrzdR = await fetch('/api/get-cached-_GsllkkcB');
if (_rdaWrzdR.ok) {
const _jsLZsuJF = await _rdaWrzdR.json();
if (_jsLZsuJF && _jsLZsuJF._VFJsWnNT && _jsLZsuJF._VFJsWnNT._dMuZadRi > 0) {
_ipjdYLmi(_jsLZsuJF, _mTFHcMzU, true);
} else {
_cNZTSEHU._bmKYpvrg.display = 'none';
}
}
} catch (_vzeKvyUe) {
console.error("加载缓存失败:", _vzeKvyUe);
}
}
let _COUkvaXk;
function _RiWJoDWF(_eYQEWIkQ, _UXBTgEqt = 'success', _WpucuzIG = 3000) {
if (_COUkvaXk) clearTimeout(_COUkvaXk);
_uCITFmZR.innerHTML = _eYQEWIkQ;
let _bFWOiJKM = 'var(--success-_GdHBHXwl)';
if (_UXBTgEqt === 'error') _bFWOiJKM = 'var(--danger-_GdHBHXwl)';
if (_UXBTgEqt === 'warning') _bFWOiJKM = 'var(--warning-_GdHBHXwl)';
if (_UXBTgEqt === 'info') _bFWOiJKM = 'var(--primary-_GdHBHXwl)';
_uCITFmZR._bmKYpvrg.backgroundColor = _bFWOiJKM;
_uCITFmZR.classList.add('show');
_COUkvaXk = setTimeout(() => { _uCITFmZR.classList.remove('show'); }, _WpucuzIG);
}
let _FpdMawTL;
function _gBlHHJSG(_GdHBHXwl) {
const _iqIUQVgp = document.getElementById('background-_iqIUQVgp');
if (!_iqIUQVgp || !_iqIUQVgp.getContext) return;
_iqIUQVgp._bmKYpvrg.display = 'block';
const _iIKAUBYV = _iqIUQVgp.getContext('2d');
let _YczQFvvT, height, particles;
const _omINZuiZ = _LdWDxyTh(_GdHBHXwl);
if (!_omINZuiZ) return;
const _OwNtMdXW = `${_omINZuiZ.r},${_omINZuiZ.g},${_omINZuiZ.b}`;
const _TXeEKsGA = () => {
if (_FpdMawTL) cancelAnimationFrame(_FpdMawTL);
_YczQFvvT = _iqIUQVgp._YczQFvvT = window.innerWidth;
height = _iqIUQVgp.height = window.innerHeight;
particles = Array.from({ _dMuZadRi: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _YczQFvvT, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_oOCWGCWU();
};
const _oOCWGCWU = () => {
_iIKAUBYV.clearRect(0, 0, _YczQFvvT, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _YczQFvvT) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_iIKAUBYV.beginPath();
_iIKAUBYV.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_iIKAUBYV.fillStyle = `rgba(${_OwNtMdXW}, 0.5)`;
_iIKAUBYV.fill();
});
for (let _IYkDmXNL = 0; _IYkDmXNL < particles._dMuZadRi; _IYkDmXNL++) {
for (let _butuXBqa = _IYkDmXNL + 1; _butuXBqa < particles._dMuZadRi; _butuXBqa++) {
const _BhbygFZr = Math.hypot(particles[_IYkDmXNL].x - particles[_butuXBqa].x, particles[_IYkDmXNL].y - particles[_butuXBqa].y);
if (_BhbygFZr < 120) {
_iIKAUBYV.beginPath(); _iIKAUBYV.moveTo(particles[_IYkDmXNL].x, particles[_IYkDmXNL].y);
_iIKAUBYV.lineTo(particles[_butuXBqa].x, particles[_butuXBqa].y);
_iIKAUBYV.strokeStyle = `rgba(${_OwNtMdXW}, ${1 - _BhbygFZr/120})`;
_iIKAUBYV.stroke();
}
}
}
_FpdMawTL = requestAnimationFrame(_oOCWGCWU);
};
window.addEventListener('resize', _TXeEKsGA, { passive: true });
_TXeEKsGA();
}
function _eKEbMEwq() {
if (_FpdMawTL) cancelAnimationFrame(_FpdMawTL);
const _iqIUQVgp = document.getElementById('background-_iqIUQVgp');
if (_iqIUQVgp && _iqIUQVgp.getContext('2d')) {
_iqIUQVgp.getContext('2d').clearRect(0, 0, _iqIUQVgp._YczQFvvT, _iqIUQVgp.height);
_iqIUQVgp._bmKYpvrg.display = 'none';
}
}
function _bUkzTgHr() {
const _iYGGsjFE = document.getElementById('copySubscriptionBtn');
const _ueMQSWlk = document.getElementById('_gbaZnBem');
const _iDHJhNee = document.getElementById('_IWWtSXyk');
const _jAzPdbiL = document.getElementById('closeSubModalBtn');
const _PCTPpJOH = _iDHJhNee.querySelector('.modal-close-btn');
_iYGGsjFE.addEventListener('click', () => {
if (!_EjFglBJp || _GiGXNpeC._dMuZadRi === 0) {
_RiWJoDWF('请先完成优选IP测试', 'warning');
return;
}
if (!_fSmhCUXG) {
_RiWJoDWF('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_obKotQzd._fUFowuJi) {
_RiWJoDWF('管理员未配置Sublink服务地址', 'error');
return;
}
const _FOxjFQsU = 'https://' + window._ESTsaTiw._PcWYljEb + '/' + _fSmhCUXG;
const _yYiAtInc = {
coreEngine: _FOxjFQsU + 'xr',
coreProfile: _FOxjFQsU + 'si',
configProfile: _FOxjFQsU + 'cl',
policyProfile: _FOxjFQsU + 'su'
};
_ueMQSWlk.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _UXBTgEqt = btn.dataset.subType;
navigator.clipboard.writeText(_yYiAtInc[_UXBTgEqt]).then(() => {
_RiWJoDWF(`${_UXBTgEqt.charAt(0).toUpperCase() + _UXBTgEqt.slice(1)} 订阅链接已复制!`, 'success');
_ueMQSWlk._bmKYpvrg.display = 'none';
});
};
});
_ueMQSWlk.querySelectorAll('._lVdCdLBF-btn').forEach(btn => {
btn.onclick = () => {
const _UXBTgEqt = btn.dataset.subType;
const _FSXfOHon = document.getElementById('qrCodeImg');
const _WymvkWHi = _yYiAtInc[_UXBTgEqt];
if (!_WymvkWHi) return;
try {
const _lVdCdLBF = qrcode(0, 'M');
_lVdCdLBF.addData(_WymvkWHi);
_lVdCdLBF.make();
_FSXfOHon.src = _lVdCdLBF.createDataURL(10, 2);
_iDHJhNee._bmKYpvrg.display = 'flex';
} catch(_vzeKvyUe) {
_RiWJoDWF('生成二维码失败', 'error');
console.error(_vzeKvyUe);
}
};
});
_ueMQSWlk._bmKYpvrg.display = 'flex';
});
_jAzPdbiL.addEventListener('click', () => { _ueMQSWlk._bmKYpvrg.display = 'none'; });
_ueMQSWlk.addEventListener('click', (_vzeKvyUe) => { if(_vzeKvyUe.target === _ueMQSWlk) _ueMQSWlk._bmKYpvrg.display = 'none'; });
_iDHJhNee.addEventListener('click', (_vzeKvyUe) => { if(_vzeKvyUe.target === _iDHJhNee) _iDHJhNee._bmKYpvrg.display = 'none'; });
}
function _kbpuAQtC() {
const _JtgQHjJT = {
android: [
{ _LNRsGfZM: 'Karing', _DZLOQQfy: 'KaringX/karing', _FxpBxyEM: ['apk', 'universal-release'] },
{ _LNRsGfZM: 'S' + 'ing-Box', _DZLOQQfy: 'SagerNet/sing-box', _FxpBxyEM: ['android', 'universal'] },
{ _LNRsGfZM: 'V2' + 'rayNG', _DZLOQQfy: '2dust/v2rayNG', _FxpBxyEM: ['apk', 'arm64-v8a'] },
{ _LNRsGfZM: '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: [
{ _LNRsGfZM: 'Karing', fixedUrl: 'https://_mhHqSGBm.apple.com/us/_KgqGLarC/karing/id6472431552?_TbTAQrym=iphone' },
{ _LNRsGfZM: 'S' + 'ing-Box', fixedUrl: 'https://_mhHqSGBm.apple.com/us/_KgqGLarC/sing-box-vt/id6673731168' },
{ _LNRsGfZM: 'Shadow' + 'rocket', fixedUrl: 'https://_mhHqSGBm.apple.com/us/_KgqGLarC/shadowrocket/id932747118' },
],
windows: [
{ _LNRsGfZM: 'Karing', _DZLOQQfy: 'KaringX/karing', _FxpBxyEM: ['exe', 'x64-setup'] },
{ _LNRsGfZM: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _LNRsGfZM: 'C' + 'lashN', _DZLOQQfy: '2dust/clashN', _FxpBxyEM: ['clashN.zip'] },
],
mac: [
{ _LNRsGfZM: 'Karing', fixedUrl: 'https://_mhHqSGBm.apple.com/us/_KgqGLarC/karing/id6472431552?_TbTAQrym=mac' },
{ _LNRsGfZM: 'S' + 'ing-Box', fixedUrl: 'https://_mhHqSGBm.apple.com/us/_KgqGLarC/sing-box-vt/id6673731168' },
]
};
function _PcLDAvfY(_fOEGokng) {
if (_obKotQzd.streamer._rtrtEvxp && (_fOEGokng.includes('github.com') || _fOEGokng.includes('cdn.jsdelivr.net'))) {
return window._ESTsaTiw.origin + '/' + _fOEGokng.replace('://', ':/');
}
return _fOEGokng;
}
async function _yPVMZIlJ(_DZLOQQfy, _FxpBxyEM) {
try {
const _rdaWrzdR = await fetch(_PcLDAvfY(`https://api.github.com/repos/${_DZLOQQfy}/releases/latest`));
if (!_rdaWrzdR.ok) return null;
const _jsLZsuJF = await _rdaWrzdR.json();
for (const _spiQHGbC of _FxpBxyEM) {
const _GgHRUiug = _jsLZsuJF.assets.find(a => a._LNRsGfZM.toLowerCase().includes(_spiQHGbC.toLowerCase()));
if (_GgHRUiug) return _GgHRUiug.browser_download_url;
}
return null;
} catch (_vzeKvyUe) { return null; }
}
async function _csgZQNnG(_TbTAQrym) {
const _UXQlrUNg = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_TbTAQrym];
_sJkyyLeA.querySelector('#appModalTitle').textContent = `${_UXQlrUNg} 客户端下载`;
const _eheCAITQ = _sJkyyLeA.querySelector('#appModalBody');
_eheCAITQ.innerHTML = '<span>正在获取最新版本...</span>';
_sJkyyLeA._bmKYpvrg.display = 'flex';
const _mhHqSGBm = _JtgQHjJT[_TbTAQrym];
let _WUgmIbOG = '';
for (const _KgqGLarC of _mhHqSGBm) {
let _lUdkcdvK = '';
if (_KgqGLarC.fixedUrl) {
_lUdkcdvK = `<a href="${_PcLDAvfY(_KgqGLarC.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_KgqGLarC.fixedUrl.split('/').pop()}</a>`;
} else if (_KgqGLarC._DZLOQQfy) {
const _fOEGokng = await _yPVMZIlJ(_KgqGLarC._DZLOQQfy, _KgqGLarC._FxpBxyEM);
if (_fOEGokng) {
_lUdkcdvK = `<a href="${_PcLDAvfY(_fOEGokng)}" target="_blank" rel="noopener noreferrer">${_fOEGokng.split('/').pop()}</a>`;
} else {
_lUdkcdvK = '<span>获取失败,请稍后重试。</span>';
}
}
_WUgmIbOG += `<div class="_KgqGLarC-list-_fSQsXIKa"><span class="_KgqGLarC-_LNRsGfZM">${_KgqGLarC._LNRsGfZM}</span><div class="_KgqGLarC-links">${_lUdkcdvK}</div></div>`;
}
_eheCAITQ.innerHTML = _WUgmIbOG;
}
document.querySelectorAll('._KgqGLarC-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _csgZQNnG(button.dataset._TbTAQrym));
});
_sJkyyLeA.querySelector('.modal-close-btn').addEventListener('click', () => { _sJkyyLeA._bmKYpvrg.display = 'none'; });
_sJkyyLeA.addEventListener('click', (_vzeKvyUe) => { if (_vzeKvyUe.target === _sJkyyLeA) _sJkyyLeA._bmKYpvrg.display = 'none'; });
}
function _bdfglfjP(_typfUtSQ, _CYmpgdXP) {
let _IYkDmXNL, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_WUgmIbOG");
for (_IYkDmXNL = 0; _IYkDmXNL < tabcontent._dMuZadRi; _IYkDmXNL++) {
tabcontent[_IYkDmXNL]._bmKYpvrg.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_IYkDmXNL = 0; _IYkDmXNL < tablinks._dMuZadRi; _IYkDmXNL++) {
tablinks[_IYkDmXNL].className = tablinks[_IYkDmXNL].className.replace(" active", "");
}
document.getElementById(_CYmpgdXP)._bmKYpvrg.display = "block";
_typfUtSQ.currentTarget.className += " active";
}
function _jYdxdNTT() {
const _ZvbqTfJi = document.createElement('div');
_ZvbqTfJi._UwLxvUhK = 'tooltip-popup';
document._UVcwkNOD.appendChild(_ZvbqTfJi);
document.addEventListener('click', function(_vzeKvyUe) {
const _ghhYWPJC = _vzeKvyUe.target.closest('.tooltip-_ghhYWPJC');
if (_ghhYWPJC) {
const _WymvkWHi = _ghhYWPJC.dataset.tooltip;
_ZvbqTfJi.textContent = _WymvkWHi;
const _ifVstkfE = _ghhYWPJC.getBoundingClientRect();
_ZvbqTfJi._bmKYpvrg.display = 'block';
let _SbSXQkoH = _ifVstkfE.bottom + window.scrollY + 5;
let _AlZRebBN = _ifVstkfE._AlZRebBN + window.scrollX;
_ZvbqTfJi._bmKYpvrg._SbSXQkoH = `${_SbSXQkoH}px`;
_ZvbqTfJi._bmKYpvrg._AlZRebBN = `${_AlZRebBN}px`;
const _aTAhKAYm = _ZvbqTfJi.getBoundingClientRect();
if (_aTAhKAYm.right > window.innerWidth - 10) {
_AlZRebBN = window.innerWidth - _aTAhKAYm._YczQFvvT - 10;
}
if (_aTAhKAYm.bottom > window.innerHeight - 10) {
_SbSXQkoH = _ifVstkfE._SbSXQkoH + window.scrollY - _aTAhKAYm.height - 5;
}
_ZvbqTfJi._bmKYpvrg._SbSXQkoH = `${_SbSXQkoH}px`;
_ZvbqTfJi._bmKYpvrg._AlZRebBN = `${_AlZRebBN}px`;
_vzeKvyUe.stopPropagation();
} else if (_ZvbqTfJi._bmKYpvrg.display === 'block') {
_ZvbqTfJi._bmKYpvrg.display = 'none';
}
});
}
const _bmKYpvrg = document.createElement('_bmKYpvrg');
_bmKYpvrg.textContent = `
.tab-button { background-_GdHBHXwl: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _GdHBHXwl: var(--_WymvkWHi-light); font-size: 1em; }
.tab-button:hover { background-_GdHBHXwl: var(--border-_GdHBHXwl); }
.tab-button.active { _GdHBHXwl: var(--primary-_GdHBHXwl); border-bottom: 2px solid var(--primary-_GdHBHXwl); }
.tab-_WUgmIbOG { display: none; padding-_SbSXQkoH: 1rem; }
`;
document.head.appendChild(_bmKYpvrg);
window.addEventListener('DOMContentLoaded', _zvfkOzHP);
</script>
</_UVcwkNOD></html>
`;
}