2 Commits
2.1.0 ... 2.1.1

Author SHA1 Message Date
Jenkins CI
31d00f4330 ci: auto build & obfuscate [2026-04-28 00:51:59] (Jenkins #19) 2026-04-28 00:51:59 +08:00
Jenkins CI
13d05651f3 ci: auto build & obfuscate [2026-04-26 23:26:32] (Jenkins #18) 2026-04-26 23:26:32 +08:00
13 changed files with 171 additions and 48 deletions

View File

@@ -2,8 +2,7 @@ import { Module, ModuleBuilder } from './Module.js';
import { extension_settings, getContext } from '../../../../../extensions.js';
import { saveSettingsDebounced, saveChat, reloadCurrentChat, eventSource, event_types } from '../../../../../../script.js';
import { registerSlashCommand } from '../../../../../slash-commands.js';
const extensionName = 'ST-Amily2-Chat-Optimisation-Dev'; // Use main extension name for settings
import { extensionName } from '../../utils/settings.js';
const sfigenSettingsKey = 'sfigen_settings';
const defaultSettings = {

View File

@@ -9,20 +9,20 @@ import {
buildGoogleEmbeddingApiUrl
} from './utils/googleAdapter.js';
import { getSlotProfile } from './api/api-resolver.js';
import { extensionName } from '../utils/settings.js';
const MODULE_NAME = 'hanlinyuan-rag-core';
const GOOGLE_API_BASE_URL = 'https://generativelanguage.googleapis.com';
function getSettings() {
const context = SillyTavern.getContext();
if (!context || !context.extensionSettings || !context.extensionSettings[MODULE_NAME]) {
const root = extension_settings[extensionName];
const nested = root && root[MODULE_NAME];
if (nested) return nested;
// 读侧兼容:若迁移尚未触发(极早期调用),回退至旧顶层位置,避免空配置。
const legacy = extension_settings[MODULE_NAME];
if (legacy) return legacy;
console.error('[翰林院-API] 无法获取设置API调用可能失败。');
return {
retrieval: {},
rerank: {}
};
}
return context.extensionSettings[MODULE_NAME];
return { retrieval: {}, rerank: {} };
}
/**

View File

@@ -4,14 +4,17 @@ import {
extension_prompt_roles,
setExtensionPrompt,
eventSource,
event_types
event_types,
saveSettingsDebounced
} from '/script.js';
import { extension_settings } from '/scripts/extensions.js';
import * as ContextUtils from './utils/context-utils.js';
import { getCollectionIdInfo, getCharacterId, getCharacterStableId } from './utils/context-utils.js';
import { defaultSettings as ragDefaultSettings } from './rag-settings.js';
import { extractBlocksByTags, applyExclusionRules } from './utils/rag-tag-extractor.js';
import { resolveQueryPreprocessingRuleConfig } from '../utils/config/RuleProfileManager.js';
import { extensionName } from '../utils/settings.js';
import * as IngestionManager from './ingestion-manager.js';
import {
getEmbeddings,
@@ -148,6 +151,7 @@ function initialize() {
console.error('[翰林院] 未能获取SillyTavern上下文初始化失败。');
return;
}
migrateLegacyRagSettings();
settings = getSettings();
if (!window.hanlinyuanRagProcessor) {
window.hanlinyuanRagProcessor = {};
@@ -296,17 +300,16 @@ async function ingestTextToHanlinyuan(text, source = 'manual', metadata = {}, pr
}
function getSettings() {
if (!context || !context.extensionSettings) {
return structuredClone(ragDefaultSettings);
if (!extension_settings[extensionName]) {
extension_settings[extensionName] = {};
}
const root = extension_settings[extensionName];
let s = context.extensionSettings[MODULE_NAME];
let s = root[MODULE_NAME];
if (!s) {
s = {};
context.extensionSettings[MODULE_NAME] = s;
root[MODULE_NAME] = s;
}
if (s.condensationHistory === undefined) {
@@ -343,16 +346,49 @@ function getSettings() {
}
function saveSettings() {
if (context) context.saveSettingsDebounced();
saveSettingsDebounced();
}
function resetSettings() {
if (context) {
context.extensionSettings[MODULE_NAME] = structuredClone(ragDefaultSettings);
saveSettings();
if (!extension_settings[extensionName]) {
extension_settings[extensionName] = {};
}
extension_settings[extensionName][MODULE_NAME] = structuredClone(ragDefaultSettings);
saveSettings();
}
function migrateLegacyRagSettings() {
const legacy = extension_settings[MODULE_NAME];
if (!legacy || typeof legacy !== 'object') return;
if (!extension_settings[extensionName]) {
extension_settings[extensionName] = {};
}
const root = extension_settings[extensionName];
// legacy 是用户此前实际交互过的真数据来源nested 可能已被 super-memory 等模块用默认值填过,
// 因此采用 legacy-优先的深合并legacy 中的叶子值覆盖 nestednested 中 legacy 没有的键保留。
if (!root[MODULE_NAME] || typeof root[MODULE_NAME] !== 'object') {
root[MODULE_NAME] = legacy;
console.log(`[翰林院] 已迁移旧版 '${MODULE_NAME}' 设置到 extension_settings['${extensionName}']。`);
} else {
const merged = root[MODULE_NAME];
const overlayLegacy = (src, dst) => {
for (const key of Object.keys(src)) {
const sv = src[key];
if (sv && typeof sv === 'object' && !Array.isArray(sv) && dst[key] && typeof dst[key] === 'object' && !Array.isArray(dst[key])) {
overlayLegacy(sv, dst[key]);
} else {
dst[key] = sv;
}
}
};
overlayLegacy(legacy, merged);
console.log(`[翰林院] 发现新旧两处配置;已将顶层 '${MODULE_NAME}' 深合并覆盖到 extension_settings['${extensionName}']。`);
}
delete extension_settings[MODULE_NAME];
saveSettingsDebounced();
}
function showNotification(message, type = 'info') {

View File

@@ -1,4 +1,5 @@
import { getContext, extension_settings } from "/scripts/extensions.js";
import { saveSettingsDebounced } from "/script.js";
import { getCharacterStableId } from "../utils/context-utils.js";
import { getMemoryState } from "../table-system/manager.js";
import { extensionName } from "../../utils/settings.js";
@@ -160,26 +161,62 @@ export function getRelatedNodes(nodeId, maxDepth = 1) {
return related;
}
function getGraphStore(create = false) {
if (!extension_settings[extensionName]) {
if (!create) return null;
extension_settings[extensionName] = {};
}
const root = extension_settings[extensionName];
if (!root.relationship_graphs) {
if (!create) return null;
root.relationship_graphs = {};
}
return root.relationship_graphs;
}
function migrateLegacyRelationshipGraphs() {
const legacy = extension_settings.relationship_graphs;
if (!legacy || typeof legacy !== 'object') return;
if (!extension_settings[extensionName]) {
extension_settings[extensionName] = {};
}
const root = extension_settings[extensionName];
if (!root.relationship_graphs) {
root.relationship_graphs = legacy;
console.log(`[关系图谱] 已迁移旧版 'relationship_graphs' 到 extension_settings['${extensionName}']。`);
} else {
console.log(`[关系图谱] 发现遗留顶层 'relationship_graphs',但新位置已存在;合并遗留数据并清理顶层。`);
for (const [cid, data] of Object.entries(legacy)) {
if (!root.relationship_graphs[cid]) {
root.relationship_graphs[cid] = data;
}
}
}
delete extension_settings.relationship_graphs;
saveSettingsDebounced();
}
export async function saveGraph() {
const context = getContext();
const charId = getCharacterStableId();
if (!charId) return;
if (!context.extensionSettings.relationship_graphs) {
context.extensionSettings.relationship_graphs = {};
}
const store = getGraphStore(true);
if (!store) return;
context.extensionSettings.relationship_graphs[charId] = graphData;
context.saveSettingsDebounced();
store[charId] = graphData;
saveSettingsDebounced();
}
export async function loadGraph() {
const context = getContext();
const charId = getCharacterStableId();
if (!charId) return;
if (context.extensionSettings.relationship_graphs && context.extensionSettings.relationship_graphs[charId]) {
graphData = context.extensionSettings.relationship_graphs[charId];
const store = getGraphStore(false);
if (store && store[charId]) {
graphData = store[charId];
console.log(`[关系图谱] 已加载角色 ${charId} 的图谱: ${graphData.nodes.length} 个节点, ${graphData.edges.length} 条边。`);
} else {
graphData = { nodes: [], edges: [] };
@@ -188,6 +225,7 @@ export async function loadGraph() {
const context = getContext();
if (context) {
migrateLegacyRelationshipGraphs();
loadGraph();
document.addEventListener('AMILY2_TABLE_UPDATED', (e) => {
const { tableName } = e.detail;

View File

@@ -24,6 +24,7 @@ export { characters, this_chid, eventSource, event_types, saveSettingsDebounced
// Core Systems
export { injectTableData, generateTableContent } from "./core/table-system/injector.js";
export { initialize as initializeRagProcessor } from "./core/rag-processor.js";
export { loadSettingsToUI as loadHanlinyuanSettingsToUI } from "./ui/hanlinyuan-bindings.js";
export { loadTables, clearHighlights, rollbackAndRefill, rollbackState, commitPendingDeletions, saveStateToMessage, getMemoryState, clearUpdatedTables } from './core/table-system/manager.js';
export { fillWithSecondaryApi } from './core/table-system/secondary-filler.js';
export { renderTables } from './ui/table-bindings.js';

View File

@@ -8,6 +8,7 @@ import {
characters, this_chid, eventSource, event_types, saveSettingsDebounced,
injectTableData, generateTableContent,
initializeRagProcessor,
loadHanlinyuanSettingsToUI,
loadTables, clearHighlights, rollbackAndRefill, rollbackState, commitPendingDeletions, saveStateToMessage, getMemoryState, clearUpdatedTables,
fillWithSecondaryApi,
renderTables,
@@ -773,6 +774,15 @@ function initializeRagAndInjection() {
console.error('[Amily2-翰林院] RAG处理器初始化失败:', error);
}
// 此时 ST settings hydration 已完成,且 RAG 第二次 init 拿到的是真实 saved settings 引用。
// mount 阶段那次 loadSettingsToUI 跑得过早hydration 之前UI 拿到的是默认值;
// 在此重跑一次以让翰林院面板显示真实持久化值。
try {
loadHanlinyuanSettingsToUI();
} catch (error) {
console.error('[Amily2-翰林院] 步骤五重载面板设置失败:', error);
}
console.log("[Amily2号-开国大典] 步骤六:智能冲突检测与注入策略...");
console.log('[Amily2-策略] 采用“完全主导”策略,覆盖 `vectors_rearrangeChat`。');
window['vectors_rearrangeChat'] = executeAmily2Injection;

View File

@@ -1,7 +1,7 @@
{
"name": "Amily2号聊天优化助手",
"display_name": "Amily2号助手",
"version": "2.1.0",
"version": "2.1.1",
"author": "Wx-2025",
"description": "一个拥有独立UI的智能引擎正文优化、自动总结、记忆表格、rag向量、隐藏楼层、剧情推进等多功能整合。",
"minSillyTavernVersion": "1.10.0",

View File

@@ -161,14 +161,26 @@ export function bindHanlinyuanEvents() {
// 确保核心已经初始化
if (HanlinyuanCore.initialize) {
try {
HanlinyuanCore.initialize();
} catch (e) {
console.error('[翰林院-枢纽] 核心初始化抛出异常:', e);
}
} else {
console.error('[翰林院-枢纽] 核心法典未能提供初始化圣旨!');
return;
}
try {
loadSettingsToUI();
loadWorldbookList(); // 【新增】加载书库列表
} catch (e) {
console.error('[翰林院-枢纽] loadSettingsToUI 抛出异常:', e);
}
try {
loadWorldbookList();
} catch (e) {
console.error('[翰林院-枢纽] loadWorldbookList 抛出异常:', e);
}
log('[翰林院-枢纽] 已成功连接各部,政令畅通。', 'info');
const fileInput = document.getElementById('hanlinyuan-ingest-novel-file-input');
const fileNameSpan = document.getElementById('hanlinyuan-ingest-novel-file-name');
@@ -603,7 +615,7 @@ function handleApiModeChange() {
}
}
function loadSettingsToUI() {
export function loadSettingsToUI() {
const settings = HanlinyuanCore.getSettings();
if (!settings) return;
@@ -649,14 +661,17 @@ function loadSettingsToUI() {
histMaxRetriesEl.value = settings.historiographyMaxRetries ?? 2;
}
// 新增:加载标签提取设置
// hly-tag-extraction-toggle / hly-tag-input / hly-tag-input-container 已从 HTML 移除,
// 标签提取规则改由 RuleProfileManager 管理。此处保留兼容性 null 检查,避免抛错吞掉后续段落加载。
const tagExtractionToggle = document.getElementById('hly-tag-extraction-toggle');
const tagInput = document.getElementById('hly-tag-input');
const tagInputContainer = document.getElementById('hly-tag-input-container');
tagExtractionToggle.checked = settings.condensation.tagExtractionEnabled;
tagInput.value = settings.condensation.tags; // 直接使用从核心获取的值
if (tagExtractionToggle) tagExtractionToggle.checked = settings.condensation.tagExtractionEnabled;
if (tagInput) tagInput.value = settings.condensation.tags;
if (tagInputContainer && tagExtractionToggle) {
tagInputContainer.style.display = tagExtractionToggle.checked ? 'block' : 'none';
}
// Rerank 设置
document.getElementById('hly-rerank-enabled').checked = settings.rerank.enabled;

View File

@@ -1043,12 +1043,32 @@ function bindConcurrentWorldbookEvents() {
});
}
function opt_purgeGarbageKeys() {
const store = extension_settings[extensionName];
if (!store) return;
let removed = 0;
for (const key of Object.keys(store)) {
// 历史 bug 造成的污染 keyhandleSettingChange 误把世界书/条目复选框当作设置项,
// 生成形如 plotOpt_amily2-opt-wb-*、plotOpt_amily2-opt-entry-*、plotOpt_amily2-opt-concurrent-wb-* 的键
if (/^plotOpt_amily2-opt-/.test(key)) {
delete store[key];
removed++;
}
}
if (removed > 0) {
console.log(`[${extensionName}] 清理残留的 ${removed} 条无效 plotOpt_* 设置键。`);
saveSettingsDebounced();
}
}
export function initializePlotOptimizationBindings() {
const panel = $('#amily2_plot_optimization_panel');
if (panel.length === 0 || panel.data('events-bound')) {
return;
}
opt_purgeGarbageKeys();
// Tab switching logic
panel.find('.sinan-navigation-deck').on('click', '.sinan-nav-item', function() {
const tabButton = $(this);
@@ -1179,7 +1199,11 @@ export function initializePlotOptimizationBindings() {
const handleSettingChange = function(element) {
const el = $(element);
const key_part = (element.name || element.id).replace('amily2_opt_', '');
const rawName = element.name || element.id || '';
// 仅处理下划线前缀的真实设置项;动态生成的世界书/条目复选框用连字符命名amily2-opt-wb-*、amily2-opt-entry-*
// 它们有自己的专属 handler若被此处捕获会生成 plotOpt_amily2-opt-... 的垃圾 key 污染 settings
if (!rawName.startsWith('amily2_opt_')) return;
const key_part = rawName.replace('amily2_opt_', '');
const key = 'plotOpt_' + key_part.replace(/_([a-z])/g, (g) => g[1].toUpperCase());
let value = element.type === 'checkbox' ? element.checked : el.val();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
const a0_0x483ad6=a0_0xa4a6;(function(_0x347c41,_0x3681fa){const _0x439ab9=a0_0xa4a6,_0x19ae58=_0x347c41();while(!![]){try{const _0x5b741e=-parseInt(_0x439ab9(0x8b,'ZFoI'))/0x1*(-parseInt(_0x439ab9(0x9c,'FP7g'))/0x2)+-parseInt(_0x439ab9(0x8c,'*G1t'))/0x3*(-parseInt(_0x439ab9(0x9e,'DPPl'))/0x4)+parseInt(_0x439ab9(0x93,'*G1t'))/0x5*(-parseInt(_0x439ab9(0x96,'butc'))/0x6)+-parseInt(_0x439ab9(0x81,'0sy3'))/0x7*(parseInt(_0x439ab9(0x9b,'QR)F'))/0x8)+parseInt(_0x439ab9(0x86,'DPPl'))/0x9+parseInt(_0x439ab9(0x91,'&LNc'))/0xa*(parseInt(_0x439ab9(0x99,'I7rj'))/0xb)+-parseInt(_0x439ab9(0x90,'Ue90'))/0xc;if(_0x5b741e===_0x3681fa)break;else _0x19ae58['push'](_0x19ae58['shift']());}catch(_0x33f9a1){_0x19ae58['push'](_0x19ae58['shift']());}}}(a0_0x1527,0x8ab75));function a0_0xa4a6(_0xa2dfc1,_0x138a0c){_0xa2dfc1=_0xa2dfc1-0x7f;const _0x152796=a0_0x1527();let _0xa4a638=_0x152796[_0xa2dfc1];if(a0_0xa4a6['JmeJrD']===undefined){var _0x517737=function(_0x5a8e29){const _0x319d63='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4e0805='',_0x57921f='';for(let _0x997e7d=0x0,_0x2df684,_0x5ad720,_0x433629=0x0;_0x5ad720=_0x5a8e29['charAt'](_0x433629++);~_0x5ad720&&(_0x2df684=_0x997e7d%0x4?_0x2df684*0x40+_0x5ad720:_0x5ad720,_0x997e7d++%0x4)?_0x4e0805+=String['fromCharCode'](0xff&_0x2df684>>(-0x2*_0x997e7d&0x6)):0x0){_0x5ad720=_0x319d63['indexOf'](_0x5ad720);}for(let _0x33166c=0x0,_0x28e4f2=_0x4e0805['length'];_0x33166c<_0x28e4f2;_0x33166c++){_0x57921f+='%'+('00'+_0x4e0805['charCodeAt'](_0x33166c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x57921f);};const _0x6d6410=function(_0x4f3ad6,_0x28cd52){let _0x3a4fa6=[],_0x494034=0x0,_0x4f28b1,_0x1ec03f='';_0x4f3ad6=_0x517737(_0x4f3ad6);let _0x1acd8b;for(_0x1acd8b=0x0;_0x1acd8b<0x100;_0x1acd8b++){_0x3a4fa6[_0x1acd8b]=_0x1acd8b;}for(_0x1acd8b=0x0;_0x1acd8b<0x100;_0x1acd8b++){_0x494034=(_0x494034+_0x3a4fa6[_0x1acd8b]+_0x28cd52['charCodeAt'](_0x1acd8b%_0x28cd52['length']))%0x100,_0x4f28b1=_0x3a4fa6[_0x1acd8b],_0x3a4fa6[_0x1acd8b]=_0x3a4fa6[_0x494034],_0x3a4fa6[_0x494034]=_0x4f28b1;}_0x1acd8b=0x0,_0x494034=0x0;for(let _0x400606=0x0;_0x400606<_0x4f3ad6['length'];_0x400606++){_0x1acd8b=(_0x1acd8b+0x1)%0x100,_0x494034=(_0x494034+_0x3a4fa6[_0x1acd8b])%0x100,_0x4f28b1=_0x3a4fa6[_0x1acd8b],_0x3a4fa6[_0x1acd8b]=_0x3a4fa6[_0x494034],_0x3a4fa6[_0x494034]=_0x4f28b1,_0x1ec03f+=String['fromCharCode'](_0x4f3ad6['charCodeAt'](_0x400606)^_0x3a4fa6[(_0x3a4fa6[_0x1acd8b]+_0x3a4fa6[_0x494034])%0x100]);}return _0x1ec03f;};a0_0xa4a6['YEbknG']=_0x6d6410,a0_0xa4a6['QNQDqw']={},a0_0xa4a6['JmeJrD']=!![];}const _0x10211e=_0x152796[0x0],_0x2a793d=_0xa2dfc1+_0x10211e,_0x2bc5e3=a0_0xa4a6['QNQDqw'][_0x2a793d];return!_0x2bc5e3?(a0_0xa4a6['lYBLiN']===undefined&&(a0_0xa4a6['lYBLiN']=!![]),_0xa4a638=a0_0xa4a6['YEbknG'](_0xa4a638,_0x138a0c),a0_0xa4a6['QNQDqw'][_0x2a793d]=_0xa4a638):_0xa4a638=_0x2bc5e3,_0xa4a638;}function a0_0x1527(){const _0x21a110=['FSootSo+W67cRspcJZldV0FdTq','WOv7W59+W6BdKSodwIBcIa','uSo6W6FdHmkTCmovAa','WRxdUN/dOSkFbGe','fmkBfSoIWQCAcCoOWR9nW5hdVgO','WObJymkihSoVBWv+DW','ggWVW4rMuCkpW4dcGbyhW47dLCkvDGaXW43cMX7cKSoqy1q','lCoSWQzFumkPWRtcJSk6WOiJgCkHW5W','WQBcUmkeW7ZcSSocg8oL','ofBcQ8oWkSkehmkFWRD4WQnj','WRVcHWNcKmkdmcJdMmkUWQK','C8kBk1FdP2bcyNmYE8oaWQeQ','WOJcPgqbWPPsWPW','WPpdM0XKzenpgCkkmq','r8oOef3cP8oFqSk1WOdcOa','ESojs8oZW63cR3BcIYZdVNtdKSoo','W54TWOm1WPtcLmkCzYJcTSoJW7yv','BtjZW73cJCkxWRddTfK9WOj+W6Kk','hGddJqnBmvXdxMZdLgS','DqxdNb08cuhcHdeMzGW','WQ4zFqxdNLxcOJ8','WQieW5OeuXmWDColxCorf8oh','tSoGDaZcQCobDCkU','W4BdKSk1bmofWOtdPCoOWQJcMG','zCkPWOWIW5JdUSonWOC','nK4fldX7','W4tdTc7dKCoMrCknWOdcQCkyW7hdJ8ol','Ac3dH8okWOldPgqdWPCg','nNOYWQxdVSoFW6/cH0Op','WQOpW58duHm1wSoDq8oyl8o9','WPhdNWCmDubfiG','p3WPWPldNSoFW6/cK0qtWPC'];a0_0x1527=function(){return _0x21a110;};return a0_0x1527();}export const SENSITIVE_KEYS=new Set([a0_0x483ad6(0x82,'zzAg'),a0_0x483ad6(0x94,'Lp4^'),a0_0x483ad6(0x8f,']o&H'),a0_0x483ad6(0x8a,'I7rj'),a0_0x483ad6(0x80,'MLS]'),a0_0x483ad6(0x85,'x5GK'),a0_0x483ad6(0x88,'x5GK'),a0_0x483ad6(0x84,'Vzpf')]);
const a0_0x383f33=a0_0x406f;function a0_0x406f(_0x38c647,_0x2eef82){_0x38c647=_0x38c647-0x1bf;const _0x13ec5a=a0_0x13ec();let _0x406f44=_0x13ec5a[_0x38c647];if(a0_0x406f['mcIgMD']===undefined){var _0x880012=function(_0x56f00f){const _0x353c93='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2b1422='',_0x3cae10='';for(let _0x5ee855=0x0,_0x5d3d2c,_0x2d54a0,_0x369a4b=0x0;_0x2d54a0=_0x56f00f['charAt'](_0x369a4b++);~_0x2d54a0&&(_0x5d3d2c=_0x5ee855%0x4?_0x5d3d2c*0x40+_0x2d54a0:_0x2d54a0,_0x5ee855++%0x4)?_0x2b1422+=String['fromCharCode'](0xff&_0x5d3d2c>>(-0x2*_0x5ee855&0x6)):0x0){_0x2d54a0=_0x353c93['indexOf'](_0x2d54a0);}for(let _0x2c6072=0x0,_0x2bafef=_0x2b1422['length'];_0x2c6072<_0x2bafef;_0x2c6072++){_0x3cae10+='%'+('00'+_0x2b1422['charCodeAt'](_0x2c6072)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3cae10);};const _0x5c9f22=function(_0x18cdd2,_0x31652d){let _0x275e49=[],_0x3d1e74=0x0,_0x27305b,_0x2e0cd2='';_0x18cdd2=_0x880012(_0x18cdd2);let _0xae5d1;for(_0xae5d1=0x0;_0xae5d1<0x100;_0xae5d1++){_0x275e49[_0xae5d1]=_0xae5d1;}for(_0xae5d1=0x0;_0xae5d1<0x100;_0xae5d1++){_0x3d1e74=(_0x3d1e74+_0x275e49[_0xae5d1]+_0x31652d['charCodeAt'](_0xae5d1%_0x31652d['length']))%0x100,_0x27305b=_0x275e49[_0xae5d1],_0x275e49[_0xae5d1]=_0x275e49[_0x3d1e74],_0x275e49[_0x3d1e74]=_0x27305b;}_0xae5d1=0x0,_0x3d1e74=0x0;for(let _0x443ce2=0x0;_0x443ce2<_0x18cdd2['length'];_0x443ce2++){_0xae5d1=(_0xae5d1+0x1)%0x100,_0x3d1e74=(_0x3d1e74+_0x275e49[_0xae5d1])%0x100,_0x27305b=_0x275e49[_0xae5d1],_0x275e49[_0xae5d1]=_0x275e49[_0x3d1e74],_0x275e49[_0x3d1e74]=_0x27305b,_0x2e0cd2+=String['fromCharCode'](_0x18cdd2['charCodeAt'](_0x443ce2)^_0x275e49[(_0x275e49[_0xae5d1]+_0x275e49[_0x3d1e74])%0x100]);}return _0x2e0cd2;};a0_0x406f['RINnil']=_0x5c9f22,a0_0x406f['jyQqgG']={},a0_0x406f['mcIgMD']=!![];}const _0x53a9e4=_0x13ec5a[0x0],_0x4a8d46=_0x38c647+_0x53a9e4,_0x53e05e=a0_0x406f['jyQqgG'][_0x4a8d46];return!_0x53e05e?(a0_0x406f['PzWMwc']===undefined&&(a0_0x406f['PzWMwc']=!![]),_0x406f44=a0_0x406f['RINnil'](_0x406f44,_0x2eef82),a0_0x406f['jyQqgG'][_0x4a8d46]=_0x406f44):_0x406f44=_0x53e05e,_0x406f44;}(function(_0x5e6b06,_0x3bf36f){const _0x541f64=a0_0x406f,_0x4d4193=_0x5e6b06();while(!![]){try{const _0x38a176=-parseInt(_0x541f64(0x1d4,'YmDf'))/0x1+parseInt(_0x541f64(0x1d0,'1U!2'))/0x2+parseInt(_0x541f64(0x1c6,'0ET$'))/0x3+-parseInt(_0x541f64(0x1c2,']FTT'))/0x4*(-parseInt(_0x541f64(0x1c3,'zeae'))/0x5)+-parseInt(_0x541f64(0x1c4,'dXxe'))/0x6*(parseInt(_0x541f64(0x1cd,'kAFF'))/0x7)+parseInt(_0x541f64(0x1ce,'cXHt'))/0x8+-parseInt(_0x541f64(0x1c0,'w1%x'))/0x9;if(_0x38a176===_0x3bf36f)break;else _0x4d4193['push'](_0x4d4193['shift']());}catch(_0xd9b60f){_0x4d4193['push'](_0x4d4193['shift']());}}}(a0_0x13ec,0x930fc));export const SENSITIVE_KEYS=new Set([a0_0x383f33(0x1d3,'qdX^'),a0_0x383f33(0x1d7,'K2[j'),a0_0x383f33(0x1d8,'Xxef'),a0_0x383f33(0x1c5,'E@Pn'),a0_0x383f33(0x1cf,'WS4S'),a0_0x383f33(0x1ca,'cXHt'),a0_0x383f33(0x1cc,'AycC'),a0_0x383f33(0x1bf,'xJcn')]);function a0_0x13ec(){const _0xab003=['W4VdRgGxWQNdNJJcUCoxW6ldRW','m1PqsCkiWOhcIu5sW6xcT8oUwsq','xmonW47cLWZcQmotyN/cLmkWiSkRW6NdNmooWRhcVX0MW6fxWOhcRW','BCoBWOn0W6JdHCo1cXLm','mKDCqCkao8oDuXldPCoqW6mJCG','W4ldKSk2WO8AvmoYWRpcUXVcN1PUjW','W4/cUComuCkJbZ4bzG','hNVcPSklhmkDfCkmWO4tWRu','DmoTh3WYW6Sy','yNCZW68EcCkKW4jmW6G','WOXqWP/dPh/dSCoUW5NcKCkgW4lcSmkz','WOL3WRngW4qeWR4','dmoxseRcG3/cISo4W6u','WPJdPsvAW5DFj2dcMSkjxSk6iW','vmksbvRcG13cImoxW4v/','W6ldRSkzW7pcG8kMC0qmW53cKWS','W5NcMCkNe8kaFqH1isP2','W7ldUmkHBCkukXtdL8o2eCoJWRW','d8oqrqxdTbNdKCo9W5PqWQBcKCoT','W7lcPmk4tCoTWPhdU1FdSr8','W4VdTNVdTmk6yCo1B8kWWOlcMmkG','lr0jW4ibW4VcG8oCW6JdLSkUW5m','CGugcSoXW4xdJxbjW4pcLmoTwW','W4RcOhSOWOeu','jmkfWOtcJCoLd8kXsIqAWRbF','v2RdNXq8W7ZcVmoCahXUWQy'];a0_0x13ec=function(){return _0xab003;};return a0_0x13ec();}