// ==UserScript== // @name My-虎牙优化 // @namespace huya-live-optimized-ai.local // @version 2026.06.29 // @description 优化虎牙直播观看体验:画质、显示模式、加载转圈和页面控件屏蔽。 // @author 云上夜未央 // @license GPL-3.0-or-later // @match *://www.huya.com/* // @noframes // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @grant GM_addValueChangeListener // @grant GM_registerMenuCommand // @grant unsafeWindow // @run-at document-end // ==/UserScript== // === 01-constants.js === // 01-constants.js === 常量定义和文本模式 (function () { 'use strict'; const __hyB64ABC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; const __hyB64Cache = Object.create(null); const __hyTextDecoder = typeof TextDecoder === 'function' ? new TextDecoder() : null; const __hyB64 = value => { if (Object.prototype.hasOwnProperty.call(__hyB64Cache, value)) return __hyB64Cache[value]; let buffer = 0; let bits = 0; const bytes = []; for (let index = 0; index < value.length; index += 1) { const char = value.charAt(index); if (char === '=') break; const code = __hyB64ABC.indexOf(char); if (code < 0) continue; buffer = (buffer << 6) | code; bits += 6; if (bits >= 8) { bits -= 8; bytes.push((buffer >> bits) & 255); } } const decoded = __hyTextDecoder ? __hyTextDecoder.decode(new Uint8Array(bytes)) : decodeURIComponent(bytes.map(byte => '%' + byte.toString(16).padStart(2, '0')).join('')); __hyB64Cache[value] = decoded; return decoded; }; const _w = (typeof unsafeWindow !== 'undefined') ? unsafeWindow : window; const VERSION = '2026.06.29'; const STORE_KEY = 'hy_opt'; const CUSTOM_PROFILE_STORE_KEY = '__custom_control_profiles'; const CUSTOM_PROFILE_LIMIT = 12; const AREA = { POPUP: 180000, GIFT: 160000, NAV: 12000, SMALL: 5000, BADGE: 1200 }; const TIMING = { FULLSCREEN_POLL_MS: 1200, FULLSCREEN_MAX: 8, QUALITY_POLL_MS: 1500, QUALITY_MAX: 8, STOP_MIN_DELAY: 15000, OBSERVER_THROTTLE: 1500, DETAIL_SCROLL_MS: 1200, EFFECT_DETECT_MS: 1500, EFFECT_PREVIEW_MS: 2200 }; const EFFECT_SAMPLE_LIMIT = 20; const TEXT_LEN = { NAV_SHORT: 12, NAV_LONG: 18, LOGIN: 6 }; const joinText = parts => parts.join(''); const buildTextPattern = (parts, flags = '') => new RegExp(parts.map(part => Array.isArray(part) ? joinText(part) : part).join('|'), flags); const SECRET_CONTROL_LABEL = joinText(['这', '是', '一', '个', '小', '秘', '密']); const HEADER_GAME_PROMO_TEXT_RE = buildTextPattern([['三', '角', '洲'], ['跑', '图'], ['游', '戏', '推', '广']]); const HEADER_ACTIVITY_PROMO_TEXT_RE = buildTextPattern([['活', '动'], ['福', '利'], ['礼', '包'], ['抽', '奖'], ['竞', '猜']]); const HEADER_USER_NAME_EXCLUDE_RE = new RegExp(`^(?:登录|下载|历史|任务|开播|消息|通知|${joinText(['活', '动'])}|${joinText(['福', '利'])})$`); const PLAYER_POPUP_SIGNAL_RE = buildTextPattern([['广', '告'], ['推', '广'], ['赞', '助'], ['福', '利'], ['活', '动'], ['抽', '奖'], ['红', '包'], ['礼', '包'], ['下', '载'], ['游', '戏', '推', '荐'], ['游', '戏', '推', '广'], ['一', '起', '来', '捞', '金'], ['捞', '金'], ['乐', '享', '豆'], ['瓜', '分'], ['点', '击', '参', '与'], 'APP', ['扫', '码'], ['二', '维', '码'], 'ad\\b', 'ads\\b', 'advert', 'promo', 'promotion', 'welfare', 'lottery', 'activity', 'campaign', 'game[-_ ]?(?:recommend|promo|promote)', 'download', 'app', 'qrcode', 'qr-code'], 'i'); const SIDEBAR_ACTIVITY_SIGNAL_RE = buildTextPattern([['甜', '蜜', '互', '动'], ['互', '动'], ['活', '动'], ['福', '利'], ['任', '务'], ['抽', '奖'], ['派', '对'], ['宝', '箱'], ['参', '与'], ['领', '取'], ['助', '力'], ['打', '榜'], ['查', '看', '详', '情'], ['热', '度'], ['加', '热'], ['投', '票'], ['集', '卡'], ['红', '包'], ['预', '约'], ['赛', '程'], 'sweet', 'interaction', 'interact', 'festival', 'task', 'mission', 'lottery', 'welfare', 'event', 'campaign', 'activity'], 'i'); const GIFT_BENEFIT_SIGNAL_RE = buildTextPattern(['benefit', 'Benefit', 'privilege', 'Privilege', 'rights', 'Rights', 'reward', 'Reward', 'bonus', 'Bonus', 'rebate', 'Rebate', 'welfare', 'Welfare', 'activity[-_ ]?tip', 'ActivityTip', 'activity[-_ ]?pop', 'ActivityPop', 'activity[-_ ]?tooltip', 'ActivityTooltip', ['权', '益'], ['特', '权'], ['奖', '励'], ['福', '利'], ['返', '利'], ['加', '成'], ['活', '动', '说', '明'], ['活', '动', '浮', '层']], 'i'); const FIRST_CHARGE_TEXT_RE = new RegExp(`^首充(?:${joinText(['礼', '包'])})?$`); // === 02-storage.js === // 02-storage.js 实例检查、全局变量、设置项、存储和迁移 if (_w.__MY_HUYA_OPT_ACTIVE__) { console.warn('[HY] My-虎牙优化 已有实例运行,跳过重复初始化'); return; } _w.__MY_HUYA_OPT_ACTIVE__ = VERSION; let store = {}; let panel = null; let panelTitleEl = null; let mainViewEl = null; let detailViewEl = null; let detailEscapeHandler = null; let statsEl = null; let statusPillEl = null; let settingsPillEl = null; let blocksPillEl = null; let settingsEntryStatusEl = null; let experienceModeStatusEl = null; let cleanModeStatusEl = null; let cleanBlockListEl = null; let proBlockListEl = null; let theme = 'dark'; const roomFlags = {}; const activeTimers = new Set(); const regionRowRefs = {}; const regionBulkRefs = {}; let controlBulkInput = null; let controlBulkStatusEl = null; const compactGroupRefs = {}; const cleanGroupRefs = {}; let experienceModeButtons = []; let controlPresetButtons = []; let secretControlInputEl = null; let customProfileSelectEl = null; let customProfileNameInputEl = null; let customProfileStatusEl = null; let customProfileApplyBtnEl = null; let customProfileDeleteBtnEl = null; let deferredApplyTimer = null; let storageSyncTimer = null; let effectDetectTimer = null; let effectPreviewTimer = null; let lastUndoSnapshot = null; let controlEffectReport = null; let effectPillEl = null; let effectStatusEl = null; let effectDetectBtnEl = null; let effectPreviewBtnEl = null; let undoBtnEl = null; let undoStatusEl = null; const SETTINGS = [ { key: 'script_enabled', name: '脚本功能总开关', desc: '一键启用或暂停显示模式、画质选择和控件屏蔽;关闭后保留设置但不再应用到页面', type: 'switch', def: true }, { key: 'fullscreen_mode', name: '进房显示模式', desc: '进入直播间后自动切换播放器显示状态', type: 'dropdown', def: 'off', options: [ { value: 'off', label: '不切换' }, { value: 'theater', label: '网页剧场模式' }, { value: 'fullscreen', label: '尝试浏览器全屏' } ] }, { key: 'quality_mode', name: '画质选择', desc: '默认不切换;可手动选择画质,自动最高优先选择无需扫码的最高可用画质', type: 'quality', def: 'off' }, { key: 'stop_loading_spinner', name: '加载转圈修复', desc: '直播间核心播放器就绪并完成一段补载后,停止统计等悬挂请求,减少浏览器标签页一直转圈', type: 'switch', def: false } ]; function loadStore() { try { const raw = GM_getValue(STORE_KEY, null); if (raw && typeof raw === 'object') store = raw; } catch (e) {} } function saveStore() { try { GM_setValue(STORE_KEY, store); } catch (e) {} } function getVal(key, def) { return Object.prototype.hasOwnProperty.call(store, key) ? store[key] : def; } function setVal(key, val) { store[key] = val; saveStore(); } function clonePlain(value) { try { return JSON.parse(JSON.stringify(value || {})); } catch (e) { return {}; } } function rememberUndoSnapshot(label) { lastUndoSnapshot = { label: label || '上次操作', ts: Date.now(), store: clonePlain(store) }; refreshEffectStatusUI(); } function prepareUserChange(label) { rememberUndoSnapshot(label); controlEffectReport = null; } function restoreLastUndoSnapshot() { if (!lastUndoSnapshot || !lastUndoSnapshot.store) return false; store = clonePlain(lastUndoSnapshot.store); lastUndoSnapshot = null; controlEffectReport = null; saveStore(); resetRoomState(); resetQualityRoomState(); refreshPanelStateFromStore(); scheduleApplyAll(); scheduleEffectDetection(120); return true; } function refreshPanelStateFromStore() { refreshSwitchInputs(); refreshDropdownRows(); updateQualityOptions(); refreshExperienceModeUI(); refreshRegionRows(); refreshCleanGroupRows(); refreshControlBulkState(); refreshControlPresetState(); refreshSecretControlState(); refreshCustomProfileUI(); refreshStats(); } function scheduleStorageRefresh() { if (storageSyncTimer) clearTimeout(storageSyncTimer); storageSyncTimer = setTimeout(() => { storageSyncTimer = null; refreshPanelStateFromStore(); scheduleApplyAll(); }, 120); } function setupStorageSync() { if (typeof GM_addValueChangeListener !== 'function') return; try { GM_addValueChangeListener(STORE_KEY, (key, oldValue, newValue, remote) => { if (!remote || !newValue || typeof newValue !== 'object') return; store = newValue; scheduleStorageRefresh(); }); GM_addValueChangeListener(CUSTOM_PROFILE_STORE_KEY, (key, oldValue, newValue, remote) => { if (!remote) return; refreshCustomProfileUI(); }); } catch (e) {} } function isScriptEnabled() { return getVal('script_enabled', true) !== false; } function migrateLegacyControlBlocks() { let changed = false; Object.entries(LEGACY_CONTROL_BLOCK_MIGRATIONS).forEach(([legacyKey, childKeys]) => { if (!getVal(legacyKey, false)) return; childKeys.forEach(key => { if (!CONTROL_BLOCK_MAP[key] || getVal(key, false)) return; store[key] = true; changed = true; }); store[legacyKey] = false; changed = true; }); ONE_TIME_CONTROL_BLOCK_MIGRATIONS.forEach(({ markerKey, sourceKey, childKeys }) => { if (getVal(markerKey, false)) return; if (getVal(sourceKey, false)) { childKeys.forEach(key => { if (!CONTROL_BLOCK_MAP[key] || getVal(key, false)) return; store[key] = true; }); } store[markerKey] = true; changed = true; }); if (changed) saveStore(); } // === 03-utils.js === // 03-utils.js 通用工具函数、页面检测、主题和控件CSS管理 function managedSetInterval(fn, ms, maxCount) { let count = 0; const id = setInterval(() => { count += 1; fn(id, count); if (count >= maxCount) clearManagedInterval(id); }, ms); activeTimers.add(id); return id; } function clearManagedInterval(id) { clearInterval(id); activeTimers.delete(id); } function clearAllTimers() { activeTimers.forEach(id => clearInterval(id)); activeTimers.clear(); } function resetForegroundWorkState() { Object.keys(roomFlags).forEach(key => { if (key.indexOf('_fs_') === 0 || key.indexOf('_ql_') === 0 || key.indexOf('_stop_load_') === 0) delete roomFlags[key]; }); } function isHuyaHost() { return location.hostname === 'huya.com' || location.hostname.endsWith('.huya.com'); } function getLiveRoot() { return document.querySelector('[data-h-lr="1"]') || document.querySelector('#J_mainRoom') || document.querySelector('.main-room') || document.querySelector('#liveRoomObj') || document.querySelector('.room-player'); } function markLiveRoot() { const root = getLiveRoot(); if (root && root.setAttribute) root.setAttribute('data-h-lr', '1'); return root; } function isLivePage() { return isHuyaHost() && /^\/[^/?#]+\/?$/.test(location.pathname) && !!getLiveRoot(); } function getRoomId() { const m = location.pathname.match(/^\/([^/?#]+)/); return m ? m[1] : null; } function resetRoomState() { Object.keys(roomFlags).forEach(key => delete roomFlags[key]); clearAllTimers(); QualityUnlocker.stop(); } function detectTheme() { theme = window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'; if (document.documentElement) document.documentElement.setAttribute('data-h-t', theme); if (panel) panel.setAttribute('data-theme', theme); } function ensureControlBlockStyleEl() { if (controlBlockStyleEl && controlBlockStyleEl.isConnected) return controlBlockStyleEl; controlBlockStyleEl = document.getElementById('hy-control-block-css'); if (!controlBlockStyleEl) { controlBlockStyleEl = document.createElement('style'); controlBlockStyleEl.id = 'hy-control-block-css'; const appendControlBlockStyle = () => (document.head || document.documentElement).appendChild(controlBlockStyleEl); if (document.head || document.documentElement) appendControlBlockStyle(); else document.addEventListener('DOMContentLoaded', appendControlBlockStyle, { once: true }); } return controlBlockStyleEl; } function buildControlBlockCss(item) { const body = item.hideMode === 'transparent' ? 'opacity:0!important;pointer-events:none!important' : 'display:none!important'; return item.selectors.map(selector => `${withKeepVisibleExclusion(selector)}{${body}}`).join('\n'); } function getControlBlockCss(item) { const cacheKey = item.key + ':' + (item.hideMode || 'hide'); if (controlBlockCssCache.has(cacheKey)) return controlBlockCssCache.get(cacheKey); const css = buildControlBlockCss(item); controlBlockCssCache.set(cacheKey, css); return css; } function getEffectiveControlBlocks(enabledBlocks) { const enabledKeys = new Set(enabledBlocks.map(item => item.key)); const coveredKeys = new Set(); const fastBlocks = []; CONTROL_BLOCK_FAST_GROUPS.forEach(group => { const keys = group.keys.filter(key => CONTROL_BLOCK_MAP[key]); if (!keys.length || !keys.every(key => enabledKeys.has(key))) return; keys.forEach(key => coveredKeys.add(key)); fastBlocks.push({ key: '__fast_' + group.key, hideMode: group.hideMode || 'hide', selectors: group.selectors }); }); return enabledBlocks.filter(item => !coveredKeys.has(item.key)).concat(fastBlocks); } function getControlBlockSignature(enabledBlocks) { return enabledBlocks.map(item => item.key + ':' + (item.hideMode || 'hide')).join('|'); } function getCurrentControlBlockStyleEl() { if (controlBlockStyleEl && controlBlockStyleEl.isConnected) return controlBlockStyleEl; return document.getElementById('hy-control-block-css'); } function clearControlBlockCss() { const styleEl = getCurrentControlBlockStyleEl(); if (styleEl && styleEl.textContent) styleEl.textContent = ''; lastControlBlockKeySignature = ''; lastControlBlockCss = ''; } function clearPendingDynamicMark() { if (!pendingDynamicMarkTimer) return; clearTimeout(pendingDynamicMarkTimer); pendingDynamicMarkTimer = null; } function schedulePendingDynamicMark(delay) { if (pendingDynamicMarkTimer) return; pendingDynamicMarkTimer = setTimeout(() => { pendingDynamicMarkTimer = null; if (isScriptEnabled()) markDynamicControls(); }, Math.max(50, delay)); } // === 04-control-apply.js === // 04-control-apply.js 控件应用、区域状态和效果检测 let _lastEnabledBlockSignature = ''; function applyControlBlocks() { if (!isScriptEnabled()) { clearPendingDynamicMark(); clearControlBlockCss(); clearDynamicControlMarks(true); lastDynamicControlKeySignature = ''; lastDynamicMarkAt = 0; _lastEnabledBlockSignature = ''; return; } const enabledBlocks = ACTIVE_CONTROL_BLOCKS.filter(item => getVal(item.key, false)); const effectiveBlocks = getEffectiveControlBlocks(enabledBlocks); markKeepVisibleControls(); const signature = getControlBlockSignature(effectiveBlocks); // 只在签名变化时执行动态标记,避免重复扫描DOM if (signature !== _lastEnabledBlockSignature) { markDynamicControls(effectiveBlocks); _lastEnabledBlockSignature = signature; } const css = signature === lastControlBlockKeySignature ? lastControlBlockCss : effectiveBlocks.map(getControlBlockCss).join('\n'); lastControlBlockKeySignature = signature; lastControlBlockCss = css; if (!css) { clearControlBlockCss(); return; } const styleEl = getCurrentControlBlockStyleEl(); if (styleEl && styleEl.textContent === css) return; ensureControlBlockStyleEl().textContent = css; } function getRegionChildren(region) { return region.childKeys .map(key => CONTROL_BLOCK_MAP[key]) .filter(item => item && !INTERNAL_CONTROL_BLOCK_KEYS.has(item.key)); } function getRegionState(region) { const children = getRegionChildren(region); const enabled = children.filter(item => getVal(item.key, false)).length; return { total: children.length, enabled, all: children.length > 0 && enabled === children.length, partial: enabled > 0 && enabled < children.length }; } const ADVANCED_CONTROL_BLOCK_KEYS = new Set([ 'block_header_message', 'block_header_message_badge', 'block_header_user_avatar', 'block_header_user_name', 'block_header_user_menu', 'block_sidebar_header', 'block_sidebar_tab_switcher', 'block_sidebar_rank_nav', 'block_sidebar_rank_content', 'block_sidebar_rank_detail', 'block_sidebar_user_badges', 'block_sidebar_match_notice', 'block_sidebar_chat_messages', 'block_sidebar_chat_system_all', 'block_sidebar_chat_fans_badges', 'block_sidebar_chat_level_badges', 'block_sidebar_chat_noble_effects', 'block_sidebar_chat_user_names', 'block_sidebar_chat_input', 'block_sidebar_chat_textarea', 'block_sidebar_chat_emoji_button', 'block_sidebar_chat_quick_buttons', 'block_sidebar_chat_input_identity_entry', 'block_sidebar_chat_input_tips', 'block_sidebar_chat_send_button', 'block_sidebar_chat_emoji_panel', 'block_sidebar_chat_quick_reply_panel', 'block_sidebar_chat_identity_panel', 'block_sidebar_chat_login_permission_tip', 'block_sidebar_chat_tool_popover', 'block_gift_face_hover_detail', 'block_gift_face_combo_controls', 'block_gift_face_send_button', 'block_gift_face_activity_badges_ext', 'block_room_below_category_recommend_hover_overlay' ]); const PLAYER_CONTROL_SELECTORS = [ '#player-ctrl-wrap', '.player-ctrl-wrap', '[class*="player-control"]', '[class*="PlayerControl"]', '[class*="control-bar"]', '[class*="ControlBar"]', '#player-danmu-wrap', '#player-danmu-btn', '#player-sound-btn', '#player-videotype', '#player-fullpage-btn', '#player-fullscreen-btn', '#shielding-effect', '.player-refresh-btn', '.player-report-btn', '.sound-progress', '.sound-bg', '.sound-bar', '.sound-btn' ].join(','); function isAdvancedControlBlock(item) { return !!item && ADVANCED_CONTROL_BLOCK_KEYS.has(item.key); } function isElementVisible(el) { if (!el || !el.isConnected) return false; const style = window.getComputedStyle(el); if (style.display === 'none' || style.visibility === 'hidden' || style.pointerEvents === 'none') return false; const rect = el.getBoundingClientRect(); return rect.width > 0 && rect.height > 0; } function getElementEffectState(el) { if (!el || !el.isConnected) return 'missing'; const style = window.getComputedStyle(el); const rect = el.getBoundingClientRect(); if (style.display === 'none' || style.visibility === 'hidden' || rect.width <= 0 || rect.height <= 0) return 'hidden'; if (style.opacity === '0' || style.pointerEvents === 'none') return 'hidden'; return 'visible'; } function queryControlBlockTargets(item) { const seen = new Set(); const targets = []; item.selectors.forEach(selector => { try { document.querySelectorAll(selector).forEach(el => { if (!el || seen.has(el) || targets.length >= EFFECT_SAMPLE_LIMIT) return; if (el.closest && el.closest('#hy-panel')) return; if (shouldKeepVisible(el)) return; seen.add(el); targets.push(el); }); } catch (e) {} }); return targets; } function emptyEffectReport() { return { ts: 0, enabled: 0, matched: 0, hidden: 0, visible: 0, missing: 0, byKey: {}, byRegion: {} }; } function getControlEffectStatus(item) { const report = controlEffectReport && controlEffectReport.byKey ? controlEffectReport.byKey[item.key] : null; const enabled = !!getVal(item.key, item.def === undefined ? false : item.def); if (!enabled) return { text: '', kind: 'off', visible: false }; if (!controlEffectReport || !controlEffectReport.ts || !report) return { text: '待检测', kind: 'pending' }; if (report.matched === 0) return { text: '本页未出现', kind: 'missing' }; if (report.hidden > 0 && report.visible === 0) return { text: '已隐藏 ' + report.hidden, kind: 'hidden' }; if (report.hidden > 0) return { text: '部分隐藏 ' + report.hidden + '/' + report.matched, kind: 'partial' }; return { text: '可能失效', kind: 'risk' }; } function getEffectSummaryText(report, hasReport) { if (!hasReport) return '未检测本页效果'; if (!report.enabled) return '还没有开启控件'; if (report.hidden > 0) return '已隐藏 ' + report.hidden + ' 处 · 命中 ' + report.matched + ' 处'; if (report.matched > 0) return '命中 ' + report.matched + ' 处 · 可能未隐藏 ' + report.visible + ' 处'; return '本页未出现 ' + report.missing + ' 项'; } function applyEffectBadgeState(el, item) { const status = getControlEffectStatus(item); el.textContent = status.text; el.dataset.hyEffectState = status.kind; el.hidden = status.visible === false; } function getRegionEffectState(region) { const state = getRegionState(region); const report = controlEffectReport && controlEffectReport.byRegion ? controlEffectReport.byRegion[region.key] : null; return Object.assign({ matched: 0, hidden: 0, visible: 0, missing: state.enabled }, report || {}, state); } function refreshEffectStatusUI() { const report = controlEffectReport || emptyEffectReport(); const hasReport = !!report.ts; if (effectPillEl) { effectPillEl.textContent = hasReport ? (report.enabled ? (report.hidden + '/' + report.enabled) : '未开启') : '未检测'; effectPillEl.parentElement.classList.toggle('hy-stat-card-on', hasReport && report.hidden > 0); } if (effectStatusEl) { effectStatusEl.textContent = getEffectSummaryText(report, hasReport); effectStatusEl.style.color = hasReport && report.hidden > 0 ? 'var(--hy-accent)' : 'var(--hy-text3)'; } if (effectPreviewBtnEl) effectPreviewBtnEl.disabled = !hasReport || report.matched <= 0; if (undoBtnEl) undoBtnEl.disabled = !lastUndoSnapshot; if (undoStatusEl) undoStatusEl.textContent = lastUndoSnapshot ? '可撤销上次设置' : '暂无可撤销操作'; if (panel) panel.querySelectorAll('.hy-effect-badge[data-hy-effect-key]').forEach(el => { const item = CONTROL_BLOCK_MAP[el.dataset.hyEffectKey]; if (!item) return; applyEffectBadgeState(el, item); }); CONTROL_BLOCK_REGIONS.forEach(updateRegionRow); } // === 05-dom-helpers.js === // 05-dom-helpers.js DOM可见性检测、文本提取、元素查找和标记 function detectControlBlockEffects() { if (!isScriptEnabled()) { controlEffectReport = emptyEffectReport(); refreshEffectStatusUI(); return controlEffectReport; } const enabledBlocks = PUBLIC_CONTROL_BLOCKS.filter(item => getVal(item.key, false)); markDynamicControls(enabledBlocks); const report = emptyEffectReport(); report.ts = Date.now(); report.enabled = enabledBlocks.length; enabledBlocks.forEach(item => { const targets = queryControlBlockTargets(item); const itemReport = { matched: targets.length, hidden: 0, visible: 0 }; targets.forEach(el => { if (getElementEffectState(el) === 'hidden') itemReport.hidden += 1; else itemReport.visible += 1; }); if (itemReport.matched === 0) report.missing += 1; report.matched += itemReport.matched; report.hidden += itemReport.hidden; report.visible += itemReport.visible; report.byKey[item.key] = itemReport; }); CONTROL_BLOCK_REGIONS.forEach(region => { const regionReport = { enabled: 0, matched: 0, hidden: 0, visible: 0, missing: 0 }; getRegionChildren(region).forEach(item => { if (!getVal(item.key, false)) return; const itemReport = report.byKey[item.key] || { matched: 0, hidden: 0, visible: 0 }; regionReport.enabled += 1; regionReport.matched += itemReport.matched; regionReport.hidden += itemReport.hidden; regionReport.visible += itemReport.visible; if (itemReport.matched === 0) regionReport.missing += 1; }); report.byRegion[region.key] = regionReport; }); controlEffectReport = report; refreshEffectStatusUI(); return report; } function scheduleEffectDetection(delay) { if (!panel || panel.classList.contains('hy-hidden') || document.hidden) return; if (effectDetectTimer) clearTimeout(effectDetectTimer); effectDetectTimer = setTimeout(() => { effectDetectTimer = null; detectControlBlockEffects(); }, delay === undefined ? TIMING.EFFECT_DETECT_MS : delay); } function clearEffectPreview() { document.querySelectorAll('.hy-effect-preview-target').forEach(el => el.classList.remove('hy-effect-preview-target')); } function previewMatchedControlEffects() { const report = controlEffectReport && controlEffectReport.ts ? controlEffectReport : detectControlBlockEffects(); if (!report || report.matched <= 0) return; clearEffectPreview(); const styleEl = getCurrentControlBlockStyleEl(); const previousCss = styleEl ? styleEl.textContent : ''; if (styleEl) styleEl.textContent = ''; PUBLIC_CONTROL_BLOCKS.filter(item => getVal(item.key, false)).forEach(item => { queryControlBlockTargets(item).forEach(el => el.classList.add('hy-effect-preview-target')); }); if (effectPreviewTimer) clearTimeout(effectPreviewTimer); effectPreviewTimer = setTimeout(() => { effectPreviewTimer = null; clearEffectPreview(); if (styleEl) styleEl.textContent = previousCss; scheduleApplyAll(); }, TIMING.EFFECT_PREVIEW_MS); } function findFirstVisible(selectors) { for (const selector of selectors) { const candidates = document.querySelectorAll(selector); for (const el of candidates) { if (isElementVisible(el)) return el; } } return null; } function findFirstConnected(selectors) { for (const selector of selectors) { try { const el = document.querySelector(selector); if (el && el.isConnected) return el; } catch (e) {} } return null; } function getText(el) { return String(el && el.textContent || '').trim().replace(/\s+/g, ' '); } function getOwnText(el) { if (!el || !el.childNodes) return ''; return Array.from(el.childNodes) .filter(node => node.nodeType === Node.TEXT_NODE) .map(node => node.textContent || '') .join(' ') .trim() .replace(/\s+/g, ' '); } function getElementSignal(el, options) { const opts = options || {}; return [ opts.includeId ? el.id : null, el.getAttribute('title'), el.getAttribute('aria-label'), el.getAttribute('data-title'), el.getAttribute('data-name'), el.getAttribute('data-tip'), el.getAttribute('alt'), el.className, getOwnText(el), opts.includeText ? (opts.maxTextLength ? getText(el).slice(0, opts.maxTextLength) : getText(el)) : null ].filter(Boolean).join(' '); } function withKeepVisibleExclusion(selector) { if (!selector || selector.includes(KEEP_VISIBLE_ATTR)) return selector; return selector + ':not(' + KEEP_VISIBLE_SELECTOR + '):not(' + KEEP_VISIBLE_SELECTOR + ' *)'; } function isKeepVisibleSignal(signal) { return /彩蛋|easter[-_\s]?egg|easteregg|easter\b|\begg\b|cai[-_\s]?dan|caidan/i.test(String(signal || '')); } function shouldKeepVisible(el) { if (!el || !el.getAttribute) return false; if (el.hasAttribute(KEEP_VISIBLE_ATTR) || el.closest(KEEP_VISIBLE_SELECTOR)) return true; return false; } function markKeepVisible(el) { if (!el || !el.setAttribute || el.closest('#hy-panel')) return; el.setAttribute(KEEP_VISIBLE_ATTR, 'easter_egg'); hasKeepVisibleMarks = true; } function resolveKeepVisibleContainer(el) { let current = el; let best = el; while (current && current !== document.body && current !== document.documentElement) { const signal = getElementSignal(current, { includeId: true }); const rect = current.getBoundingClientRect(); const area = rect.width * rect.height; if (isKeepVisibleSignal(signal) && rect.width > 0 && rect.height > 0 && area <= AREA.POPUP) best = current; current = current.parentElement; } return best; } function markKeepVisibleControls() { const selector = [ '[data-hy-kv]', '[data-h-q-keep-visible]', '[data-h-q-easter-egg]', '[class*="egg"]', '[class*="Egg"]', '[class*="easter"]', '[class*="Easter"]', '[class*="caidan"]', '[class*="Caidan"]', '[class*="cai-dan"]', '[class*="CaiDan"]', '[title*="彩蛋"]', '[aria-label*="彩蛋"]', '[data-title*="彩蛋"]', '[data-name*="彩蛋"]' ].join(','); const direct = Array.from(document.querySelectorAll(selector)); const textHits = Array.from(document.querySelectorAll('div,section,aside,a,button,li,span,p,strong,em,i')) .filter(el => !el.closest('#hy-panel')) .filter(el => isElementVisible(el)) .filter(el => isKeepVisibleSignal(getElementSignal(el, { includeId: true }))); Array.from(new Set(direct.concat(textHits))).forEach(el => { markKeepVisible(el); markKeepVisible(resolveKeepVisibleContainer(el)); const item = el.closest('a,button,li,section,aside,div'); if (item) markKeepVisible(resolveKeepVisibleContainer(item)); }); } function genSelectors(dynBlock, roots, items, classPatterns) { const selectors = ['[data-hy-cb="' + dynBlock + '"]']; for (const root of roots) { for (const item of items) { for (const cls of classPatterns) { selectors.push(root + ' ' + item + ' ' + cls); } } } return selectors; } function genChatInputSelectors(dynBlock, roots, subSelectors) { const selectors = ['[data-hy-cb="' + dynBlock + '"]']; for (const root of roots) { for (const sub of subSelectors) { selectors.push(root + ' ' + sub); } } return selectors; } function markLeafElements(root, leafSel, pattern, name, opts) { const o = opts || {}; Array.from(root.querySelectorAll(leafSel)) .filter(el => el !== root) .filter(el => o.excludeSelector ? !el.closest(o.excludeSelector) : true) .filter(el => o.leafFilter ? o.leafFilter(el) : isElementVisible(el)) .filter(el => { const signal = getElementSignal(el, o.signalOptions || {}); if (!signal || !pattern.test(signal)) return false; if (o.reject && o.reject.test(signal)) return false; return true; }) .forEach(el => { const target = o.container ? (el.closest(o.container) || el) : el; if (!target || target === root) return; if (o.targetExcludeSelector && target.closest(o.targetExcludeSelector)) return; markControl(target, name); }); } function makeSmallLeafFilter(maxText, maxW, maxH, extraCheck) { return (el) => { if (!isElementVisible(el)) return false; if (extraCheck && !extraCheck(el)) return false; const rect = el.getBoundingClientRect(); const text = getOwnText(el) || getText(el); if (text.length > maxText) return false; return rect.width > 0 && rect.height > 0 && rect.width <= maxW && rect.height <= maxH; }; } function clearDynamicControlOnlyMarks(force) { if (!force && !hasDynamicControlMarks) return; document.querySelectorAll('[' + DYNAMIC_CONTROL_ATTR + ']').forEach(el => { el.removeAttribute(DYNAMIC_CONTROL_ATTR); }); hasDynamicControlMarks = false; } function clearKeepVisibleMarks(force) { if (!force && !hasKeepVisibleMarks) return; document.querySelectorAll(KEEP_VISIBLE_SELECTOR).forEach(el => { el.removeAttribute(KEEP_VISIBLE_ATTR); }); hasKeepVisibleMarks = false; lastKeepVisibleMarkAt = 0; } function clearDynamicControlMarks(force) { clearDynamicControlOnlyMarks(force); clearKeepVisibleMarks(force); } function refreshKeepVisibleControls(now, minInterval, force) { if (!force && lastKeepVisibleMarkAt && now - lastKeepVisibleMarkAt < minInterval) return false; clearKeepVisibleMarks(false); markKeepVisibleControls(); lastKeepVisibleMarkAt = now; return true; } // === 06-dynamic-header.js === // 06-dynamic-header.js 顶部导航动态标记 function markControl(el, name) { if (!el || !el.setAttribute || shouldKeepVisible(el)) return; el.setAttribute(DYNAMIC_CONTROL_ATTR, name); hasDynamicControlMarks = true; } function findTextTarget(root, pattern, options) { if (!root) return null; const opts = options || {}; const candidates = Array.from(root.querySelectorAll(opts.selector || '*')) .filter(isElementVisible) .map(el => { const rect = el.getBoundingClientRect(); const text = getOwnText(el) || getText(el); return { el, rect, text, area: rect.width * rect.height }; }) .filter(item => { if (!item.text || !pattern.test(item.text)) return false; if (opts.maxTextLength && item.text.length > opts.maxTextLength) return false; if (opts.maxArea && item.area > opts.maxArea) return false; if (opts.minX !== undefined && item.rect.x < opts.minX) return false; if (opts.maxX !== undefined && item.rect.x > opts.maxX) return false; if (opts.minY !== undefined && item.rect.y < opts.minY) return false; if (opts.maxY !== undefined && item.rect.y > opts.maxY) return false; return true; }) .sort((a, b) => a.area - b.area); return candidates.length ? candidates[0].el : null; } function markHeaderDynamicControls(enabledKeys) { const canMark = name => !enabledKeys || enabledKeys.has('block_' + name); const navMaxX = Math.min(window.innerWidth * 0.72, 960); const headerRightSelector = '#J_duyaHeaderRight, [class*="HeaderRight"], .duya-header-right, [class*="header-right"], [class*="HeaderActions"], [class*="header-actions"], [class*="NavIg--"], [class*="NavActivity--"], [class*="NavWelfare--"], [class*="NavLottery--"], [class*="NavKaiBo--"], [class*="NavDownload--"]'; const navRoot = document.querySelector('#J_duyaHeaderNav, .duya-header-nav, .duya-header-menu'); const markNavItem = (name, pattern) => { if (!canMark(name)) return; const el = findTextTarget(navRoot, pattern, { selector: 'a,span,li,div', maxTextLength: TEXT_LEN.NAV_SHORT, maxArea: AREA.NAV, minY: 0, maxY: 70, maxX: navMaxX }); const target = el && (el.closest('a,li') || el); if (target && target.closest(headerRightSelector)) return; markControl(target, name); }; markNavItem('header_nav_home', /^首页$/); markNavItem('header_nav_live', /^直播$/); markNavItem('header_nav_category', /^分类$/); markNavItem('header_nav_match', /^赛事$/); markNavItem('header_nav_video', /^视频$/); markNavItem('header_nav_game', /^游戏$/); markNavItem('header_nav_trade', /^(?:游戏卖号|卖号)$/); const root = document.querySelector('#J_duyaHeaderRight') || document.querySelector('[class*="HeaderRight"]'); if (!root) return; const markHeaderItem = (name, pattern) => { if (!canMark(name)) return; const el = findTextTarget(root, pattern, { maxTextLength: TEXT_LEN.NAV_LONG, maxArea: AREA.SMALL, minY: 0, maxY: 70 }); const item = el && (el.closest('[class*="NavItem--"]') || el.closest('a, button') || el); markControl(item, name); }; const markHeaderBySelector = (name, selector, closestSelector) => { if (!canMark(name)) return false; const el = Array.from(root.querySelectorAll(selector)).find(isElementVisible); markControl(el && (closestSelector ? el.closest(closestSelector) : el), name); return !!el; }; const isSmallTopTarget = (el, maxArea) => { if (!isElementVisible(el)) return false; const rect = el.getBoundingClientRect(); return rect.y >= 0 && rect.y <= 70 && rect.width >= 6 && rect.height >= 6 && rect.width * rect.height <= maxArea; }; markHeaderItem('header_game_promo', HEADER_GAME_PROMO_TEXT_RE); markHeaderItem('header_activity_promo', HEADER_ACTIVITY_PROMO_TEXT_RE); markHeaderItem('header_start_live', /^开播$/); markHeaderItem('header_download', /^下载$/); markHeaderItem('header_history', /^历史$/); markHeaderItem('header_task', /^任务$/); markHeaderItem('header_follow', /^(?:关注|订阅)$/); markHeaderBySelector('header_follow', '[class*="NavFollow"], [class*="NavSubscribe"], [class*="Follow"], [class*="Subscribe"], [class*="follow"], [class*="subscribe"], [class*="heart"], [class*="Heart"]', '[class*="NavItem--"], a, button, div'); if (canMark('header_login')) { const login = findTextTarget(root, /^登录$/, { selector: 'a,button,div,span', maxTextLength: TEXT_LEN.LOGIN, maxArea: AREA.SMALL, minY: 0, maxY: 70 }); markControl(login && (login.closest('[class*="Login--"], [class*="LoginHd--"], a, button') || login), 'header_login'); } if (canMark('header_message')) { markHeaderItem('header_message', /消息|通知|私信/); markHeaderBySelector('header_message', '[class*="NavMessage"], [class*="NavMsg"], [class*="Message"], [class*="message"], [class*="NavIcon-msg"], [class*="NavIcon-message"]', '[class*="NavItem--"], a, button, div'); } const messageRoot = root.querySelector('[data-hy-cb="header_message"], [class*="NavMessage"], [class*="NavMsg"], [class*="Message"], [class*="message"]'); if (canMark('header_message_badge')) { const badge = messageRoot && Array.from(messageRoot.querySelectorAll('[class*="Badge"], [class*="badge"], [class*="Unread"], [class*="unread"], [class*="Red"], [class*="red"], [class*="Dot"], [class*="dot"], em, i, span')) .find(el => isSmallTopTarget(el, AREA.BADGE) && (/badge|unread|red|dot|num|count/i.test(el.className || '') || /^[\d.]+$/.test(getOwnText(el) || getText(el)))); markControl(badge, 'header_message_badge'); } if (canMark('header_user_avatar')) { const avatar = Array.from(root.querySelectorAll('[class*="UserAvatar"], [class*="user-avatar"], [class*="UserHead"], [class*="user-head"], [class*="Avatar"], [class*="avatar"], [class*="Profile"], [class*="profile"], img[alt*="头像"], img[src*="avatar"], img[src*="head"]')) .find(el => isSmallTopTarget(el, 3600) && !el.closest('[data-hy-cb="header_message"], [class*="NavMessage"], [class*="NavMsg"], [class*="Message"], [class*="message"]')); markControl(avatar && (avatar.closest('[class*="User"], [class*="user"], a, button') || avatar), 'header_user_avatar'); } if (canMark('header_user_name')) { const userName = Array.from(root.querySelectorAll('[class*="UserName"], [class*="user-name"], [class*="NickName"], [class*="nick-name"], [class*="Nick"], [class*="nick"], [class*="Name"], [class*="name"]')) .map(el => ({ el, text: getOwnText(el) || getText(el) })) .find(item => item.text && item.text.length <= TEXT_LEN.NAV_LONG && !HEADER_USER_NAME_EXCLUDE_RE.test(item.text) && isSmallTopTarget(item.el, AREA.SMALL)); markControl(userName && (userName.el.closest('[class*="User"], [class*="user"], a, button') || userName.el), 'header_user_name'); } if (canMark('header_user_menu')) { const userMenu = Array.from(document.querySelectorAll('[class*="UserMenu"], [class*="user-menu"], [class*="UserPanel"], [class*="user-panel"], [class*="UserDrop"], [class*="user-drop"], [class*="Popover"], [class*="popover"], [class*="Dropdown"], [class*="dropdown"]')) .find(el => { if (!isElementVisible(el)) return false; const rect = el.getBoundingClientRect(); const text = getText(el); return rect.y >= 0 && rect.y <= 220 && rect.width <= 520 && /个人中心|我的订阅|我的关注|退出登录|账号|账户|我的钱包|贵族|开播中心/.test(text); }); markControl(userMenu, 'header_user_menu'); } } // === 07-dynamic-room-sidebar.js === // 07-dynamic-room-sidebar.js 直播间头部和右侧栏动态标记 function markRoomHeaderDynamicControls() { const root = document.querySelector('#J_mainRoom') || document.body; if (!root) return; markControl(findTextTarget(root, /败者组|胜者组|赛事|比赛|LPL|AL|BLG/i, { maxTextLength: 40, maxArea: 16000, minX: 80, maxX: 360, minY: 68, maxY: 110 }), 'room_match_label'); const metaTargets = Array.from(root.querySelectorAll('*')) .filter(isElementVisible) .filter(el => { const rect = el.getBoundingClientRect(); const text = getOwnText(el) || getText(el); return rect.x >= 150 && rect.x <= 560 && rect.y >= 108 && rect.y <= 145 && /^(?:\d{4,}|\d+(?:\.\d+)?万)$/.test(text); }); metaTargets.forEach(el => { const text = getOwnText(el) || getText(el); if (/^\d{4,}$/.test(text)) { markControl(el, 'room_id'); } else if (/^\d+(?:\.\d+)?万$/.test(text)) { markControl(el, 'room_viewer_count'); } }); markControl(findTextTarget(root, /(?:英雄联盟|王者荣耀|穿越火线|绝地求生|视频|游戏)$/, { maxTextLength: 16, maxArea: 8000, minX: 360, maxX: 560, minY: 105, maxY: 150 }), 'room_category'); Array.from(document.querySelectorAll('a,button,span,div')) .filter(isElementVisible) .filter(el => { const rect = el.getBoundingClientRect(); const text = getOwnText(el) || getText(el); return rect.x >= 340 && rect.x <= 620 && rect.y >= 96 && rect.y <= 155 && rect.width >= 20 && rect.width <= 180 && rect.height >= 10 && rect.height <= 40 && /(?:英雄联盟|王者荣耀|穿越火线|绝地求生|视频|游戏)$/.test(text) && text.length <= 18; }) .forEach(el => markControl(el.closest('a,button') || el, 'room_category')); } function markSidebarRankDynamicControls() { const roots = Array.from(new Set(Array.from(document.querySelectorAll('#J_roomWeeklyRankListRoot, .room-weeklyRankList-content, [class*="RankNabob"]')))) .filter(isElementVisible); if (!roots.length) return; const leafSelector = 'img,picture,span,em,i,b,strong,a,p,div'; const itemSelector = 'li, [class*="rank-item--"], [class*="RankItem"], [class*="rankItem"]'; const isRankLeaf = (el, item) => { if (!isElementVisible(el) || el === item) return false; const rect = el.getBoundingClientRect(); const text = getOwnText(el) || getText(el); if (text.length > 36) return false; return rect.width > 0 && rect.height > 0 && rect.width <= 220 && rect.height <= 48; }; roots.forEach(root => { const items = Array.from(root.querySelectorAll(itemSelector)) .filter(isElementVisible) .filter(item => root.contains(item)); items.forEach((item, index) => { markLeafElements(item, leafSelector, /avatar|Avatar|head|Head|face|Face|photo|Photo|portrait|Portrait|头像/i, 'sidebar_rank_avatars', { leafFilter: (el) => isElementVisible(el) && el !== item, reject: /badge|Badge|medal|Medal|noble|Noble|guardian|Guardian|fans|Fans|level|Level/i }); markLeafElements(item, leafSelector, /nick|Nick|user[-_]?name|UserName|rank[-_]?name|RankName|name|Name|昵称|用户名/i, 'sidebar_rank_user_names', { leafFilter: (el) => isRankLeaf(el, item), reject: /badge|Badge|medal|Medal|fans|Fans|level|Level|score|Score|value|Value|heat|Heat|count|Count|num|Num|index|Index|rank[-_]?no|RankNo/i }); markLeafElements(item, leafSelector, /score|Score|value|Value|contribution|Contribution|heat|Heat|count|Count|point|Point|贡献|互动值|热度|积分|^\d{1,3}(?:,\d{3})*$|^\d+(?:\.\d+)?万?$/i, 'sidebar_rank_values', { leafFilter: (el) => isRankLeaf(el, item), reject: /badge|Badge|medal|Medal|fans|Fans|level|Level|rank[-_]?no|RankNo|rank[-_]?index|RankIndex|rank[-_]?num|RankNum|order|Order|avatar|Avatar|nick|Nick|name|Name/i }); markLeafElements(item, leafSelector, /rank[-_]?index|RankIndex|rank[-_]?no|RankNo|rank[-_]?num|RankNum|rank[-_]?order|RankOrder|order|Order|排名|序号|名次/i, 'sidebar_rank_numbers', { leafFilter: (el) => isRankLeaf(el, item), reject: /score|Score|value|Value|heat|Heat|count|Count|badge|Badge|medal|Medal|fans|Fans|level|Level|avatar|Avatar|nick|Nick|name|Name/i }); const firstRankNumber = Array.from(item.querySelectorAll(leafSelector)) .filter(el => isRankLeaf(el, item)) .find(el => { const text = getOwnText(el) || getText(el); const signal = getElementSignal(el); return /^\d{1,2}$/.test(text) && !/ConsumeLevel|fans-icon|badge|Badge|medal|Medal|level|Level|score|Score|value|Value|heat|Heat/i.test(signal); }); if (firstRankNumber && index < 20) markControl(firstRankNumber, 'sidebar_rank_numbers'); }); }); } function markSidebarActivityControls(root) { const sidebarRoot = root || document.querySelector('#J_roomSide') || document.querySelector('.room-sidebar'); if (!sidebarRoot) return; const chatScopeSelector = '#chat-room__wrap, #J_roomChatList, #J_msgList, #chat-room__list, .room-chat-list, .chat-room__list, [class*="ChatList"], [class*="chat-list"]'; const excludedSelector = [ '#hy-panel', chatScopeSelector, '#J_roomChatInput', '.room-chat-input', '.chat-room__input', '[class*="ChatInput"]', '[class*="chat-input"]', '#pub_msg_input', '#J_roomWeeklyRankListRoot', '.room-weeklyRankList-content', '[class*="RankNabob"]', '#liveRoomObj', '#J_player', '#player-wrap', '#player-container', '#player', '.room-player', '#player-gift-wrap', '.player-gift-wrap', '#player-face', '.player-face-list', '.player-face-gift', '#player-ctrl-wrap', '.player-ctrl-wrap' ].join(','); const nestedProtectedSelector = [ chatScopeSelector, '#J_roomChatInput', '.room-chat-input', '.chat-room__input', '#J_roomWeeklyRankListRoot', '.room-weeklyRankList-content', '[class*="RankNabob"]' ].join(','); const activitySelector = [ '#J_mod_matchSchedule', '.room-mod-matchSchedule', '.hy-match-notices', '.match-notices__hd', '.match-notices__bd', '[data-h-q-sidebar-activity]', '[class*="SweetInteraction"]', '[class*="sweet"]', '[class*="Sweet"]', '[class*="Interaction"]', '[class*="interaction"]', '[class*="Interact"]', '[class*="interact"]', '[class*="Festival"]', '[class*="festival"]', '[class*="Task"]', '[class*="task"]', '[class*="Mission"]', '[class*="mission"]', '[class*="Lottery"]', '[class*="lottery"]', '[class*="Welfare"]', '[class*="welfare"]', '[class*="Event"]', '[class*="event"]', '[class*="Campaign"]', '[class*="campaign"]', '[class*="Activity"]', '[class*="activity"]' ].join(','); const getSidebarActivitySignal = (el) => getElementSignal(el, { includeId: true, includeText: true, maxTextLength: 180 }); const isSidebarActivityCandidate = (el) => { if (!el || !isElementVisible(el) || el.closest('#hy-panel') || shouldKeepVisible(el)) return false; if (el !== sidebarRoot && el.closest(excludedSelector)) return false; if (el.querySelector && el.querySelector(nestedProtectedSelector)) return false; const rect = el.getBoundingClientRect(); const area = rect.width * rect.height; if (rect.width < 80 || rect.height < 18 || rect.width > 430 || rect.height > 220 || area > 120000) return false; const insideSidebar = !!el.closest('#J_roomSide, .room-sidebar'); if (!insideSidebar && (rect.right < window.innerWidth - 560 || rect.top < 80)) return false; const signal = getSidebarActivitySignal(el); if (!SIDEBAR_ACTIVITY_SIGNAL_RE.test(signal)) return false; return !/普通发言|聊天输入|发送|表情|粉丝牌|贵族|守护|清晰|画质|全屏|剧场|音量|弹幕|danmu|fullscreen|fullpage|volume/i.test(signal); }; const resolveSidebarActivityTarget = (el) => { let current = el; let best = isSidebarActivityCandidate(el) ? el : null; while (current && current !== document.body && current !== document.documentElement && sidebarRoot.contains(current)) { if (isSidebarActivityCandidate(current)) best = current; if (current === sidebarRoot) break; current = current.parentElement; } return best; }; const classCandidates = Array.from(sidebarRoot.querySelectorAll(activitySelector)); const textCandidates = Array.from(sidebarRoot.querySelectorAll('div,section,aside,a,button,span,strong,em,p')) .filter(el => SIDEBAR_ACTIVITY_SIGNAL_RE.test(getSidebarActivitySignal(el))); Array.from(new Set(classCandidates.concat(textCandidates))) .map(resolveSidebarActivityTarget) .filter(Boolean) .filter((el, index, list) => list.indexOf(el) === index) .slice(0, 8) .forEach(el => markControl(el, 'sidebar_match_notice')); } function markSidebarDynamicControls(enabledKeys) { const root = document.querySelector('#J_roomSide') || document.querySelector('.room-sidebar') || document.body; if (!root) return; const canMark = name => !enabledKeys || enabledKeys.has('block_' + name); const hasEnabledChatKey = !enabledKeys || Array.from(enabledKeys).some(key => key.startsWith('block_sidebar_chat_')); if (canMark('sidebar_match_notice')) markSidebarActivityControls(root); if (!hasEnabledChatKey) return; Array.from(root.querySelectorAll('[class*="ChatList"], [class*="chat-list"], [class*="msg-list"], [class*="MsgList"], .room-chat-list, #J_msgList, #J_roomChatList, #chat-room__list')) .filter(isElementVisible) .forEach(el => markControl(el, 'sidebar_chat_messages')); const chatRoot = root.querySelector('#chat-room__wrap') || root.querySelector('#J_roomChatList, #J_msgList, #chat-room__list, .room-chat-list, .chat-room__list, [class*="ChatList"], [class*="chat-list"]'); if (chatRoot) { markControl(chatRoot, 'sidebar_chat_messages'); Array.from(chatRoot.querySelectorAll('.msg-normal-decorationPrefix, .fans-icon, [class*="fans-icon"]')) .filter(isElementVisible) .forEach(el => markControl(el, 'sidebar_chat_fans_badges')); Array.from(chatRoot.querySelectorAll('[class*="ConsumeLevelBadge"]')) .filter(isElementVisible) .forEach(el => markControl(el, 'sidebar_chat_level_badges')); Array.from(chatRoot.querySelectorAll('[class*="noble-medal"], [class*="GuardianMedal"], [class*="msg-pic"]')) .filter(isElementVisible) .forEach(el => markControl(el, 'sidebar_chat_noble_effects')); Array.from(chatRoot.querySelectorAll('.name.J_userMenu, [class*="name--"]')) .filter(isElementVisible) .forEach(el => markControl(el, 'sidebar_chat_user_names')); // 聊天系统消息:统一标记为 sidebar_chat_system_all // 不再逐条分类,所有系统消息用一个控件控制 const allMsgEls = chatRoot.querySelectorAll('[class*="RoomMessageRichText"], [class*="msg--"], [class*="box-noble-level"]'); const recentMsgEls = Array.from(allMsgEls).slice(-30); recentMsgEls.filter(isElementVisible).forEach(el => { const className = String(el.className || ''); if (/RoomMessageRichText|box-noble-level|msg--/.test(className)) { markControl(el.closest('[class*="msg--"], [class*="box-noble-level"], a, div') || el, 'sidebar_chat_system_all'); } }); } Array.from(root.querySelectorAll('input, textarea, [contenteditable="true"], [class*="ChatInput"], [class*="chat-input"], .room-chat-input, #pub_msg_input, #J_roomChatInput')) .filter(isElementVisible) .forEach(el => { const target = el.closest('[class*="ChatInput"], [class*="chat-input"], .room-chat-input, form, div') || el; markControl(target, 'sidebar_chat_input'); }); const inputRoot = root.querySelector('#J_roomChatInput, .room-chat-input, .chat-room__input, [class*="ChatInput"], [class*="chat-input"]'); const sendButton = findTextTarget(inputRoot, /^(发送|Send)$/i, { selector: 'button,a,span,div', maxTextLength: 8, maxArea: 9000 }); const sendButtonTarget = sendButton && (sendButton.closest('button,a,[class*="SendBtn"],[class*="send-btn"]') || sendButton); if (inputRoot) { Array.from(inputRoot.querySelectorAll('#pub_msg_input, textarea, input, [contenteditable="true"]')) .filter(isElementVisible) .filter(el => { if (el.matches && el.matches('input[type="hidden"], input[type="button"], input[type="submit"], input[type="checkbox"], input[type="radio"]')) return false; if (el.matches && el.matches('input') && el.type && !/^(?:text|search)?$/i.test(el.type)) return false; return true; }) .forEach(el => markControl(el, 'sidebar_chat_textarea')); const getInputControlSignal = (el) => [ el.getAttribute('title'), el.getAttribute('aria-label'), el.getAttribute('data-title'), el.getAttribute('data-name'), el.getAttribute('data-tip'), el.className, getOwnText(el) ].filter(Boolean).join(' '); const markInputControl = (el, name) => { const target = el.closest('button,a,[role="button"],[class*="Btn"],[class*="btn"],[class*="Item"],[class*="item"],[class*="Icon"],[class*="icon"],span,div') || el; if (!target || target === inputRoot) return; if (sendButtonTarget && (target === sendButtonTarget || target.contains(sendButtonTarget) || sendButtonTarget.contains(target))) return; markControl(target, name); }; Array.from(inputRoot.querySelectorAll('button,a,[role="button"],i,span,div')) .filter(isElementVisible) .forEach(el => { const signal = getInputControlSignal(el); if (!signal || /^(发送|Send)$/i.test(getOwnText(el))) return; if (/表情|颜文字|emoji|emotion|emoticon|face/i.test(signal)) { markInputControl(el, 'sidebar_chat_emoji_button'); } else if (/快捷|回复|常用语|弹幕|样式|颜色|quick|reply|phrase|preset|danmu|style|color/i.test(signal)) { markInputControl(el, 'sidebar_chat_quick_buttons'); } else if (/粉丝牌|徽章|身份|装扮|贵族|守护|勋章|佩戴|badge|medal|fansmedal|noble|guardian|dress|decoration/i.test(signal)) { markInputControl(el, 'sidebar_chat_input_identity_entry'); } else if (/提示|公告|规则|禁言|登录后|文明发言|字数|剩余|tip|hint|notice|guide|limit|counter/i.test(signal)) { markInputControl(el, 'sidebar_chat_input_tips'); } }); const inputRect = inputRoot.getBoundingClientRect(); const popupSelectors = [ '[role="dialog"]', '[role="menu"]', '[role="tooltip"]', '[class*="Panel"]', '[class*="panel"]', '[class*="Popover"]', '[class*="popover"]', '[class*="Pop"]', '[class*="pop"]', '[class*="Dropdown"]', '[class*="dropdown"]', '[class*="Tooltip"]', '[class*="tooltip"]', '[class*="Layer"]', '[class*="layer"]', '[class*="Bubble"]', '[class*="bubble"]', '[class*="Menu"]', '[class*="menu"]', '[class*="Tip"]', '[class*="tip"]', '[class*="Guide"]', '[class*="guide"]', '[data-h-q-chat-popover]' ].join(','); const getInputPopupSignal = (el) => [ el.id, el.getAttribute('role'), el.getAttribute('title'), el.getAttribute('aria-label'), el.getAttribute('data-title'), el.getAttribute('data-name'), el.getAttribute('data-tip'), el.className, getOwnText(el), getText(el).slice(0, 160) ].filter(Boolean).join(' '); const resolvePopupTarget = (el) => { const target = el.closest('[role="dialog"],[role="menu"],[role="tooltip"],[class*="Panel"],[class*="panel"],[class*="Popover"],[class*="popover"],[class*="Dropdown"],[class*="dropdown"],[class*="Tooltip"],[class*="tooltip"],[class*="Layer"],[class*="layer"],[class*="Bubble"],[class*="bubble"],[class*="Menu"],[class*="menu"],[class*="Tip"],[class*="tip"],[class*="Guide"],[class*="guide"],[data-h-q-chat-popover]') || el; return target === inputRoot ? el : target; }; const isChatInputPopupCandidate = (el) => { if (!el || !isElementVisible(el)) return false; if (el === inputRoot || el.closest('#hy-panel')) return false; if (el.closest('#chat-room__wrap, #J_roomChatList, #J_msgList, #chat-room__list, .room-chat-list, .chat-room__list')) return false; if (el.closest('#player-face, .player-face-list, .player-face-gift, #player-gift-wrap, #player-ctrl-wrap, #player-recommend')) return false; if (el.matches && el.matches('button,a,input,textarea,[contenteditable="true"]')) return false; const rect = el.getBoundingClientRect(); const area = rect.width * rect.height; if (rect.width < 16 || rect.height < 10 || area > AREA.POPUP) return false; const style = window.getComputedStyle(el); const signal = getInputPopupSignal(el); const popupish = /panel|popover|popup|dropdown|tooltip|layer|bubble|menu|tip|guide|dialog/i.test(signal) || /^(?:absolute|fixed)$/i.test(style.position) || ['dialog', 'menu', 'tooltip'].includes(String(el.getAttribute('role') || '').toLowerCase()); if (!popupish) return false; const nearInput = rect.right >= inputRect.left - 260 && rect.left <= inputRect.right + 260 && rect.bottom >= inputRect.top - 360 && rect.top <= inputRect.bottom + 300; const rightSide = rect.right >= window.innerWidth - 560 || !!el.closest('#J_roomSide, .room-sidebar'); return inputRoot.contains(el) || (nearInput && rightSide); }; Array.from(document.querySelectorAll(popupSelectors)) .filter(isChatInputPopupCandidate) .forEach(el => { const signal = getInputPopupSignal(el); const target = resolvePopupTarget(el); if (/登录后|请先登录|登录才|游客|发言权限|权限不足|禁言|被禁言|解禁|等级不足|绑定手机|实名|实名认证|关注后|粉丝牌发言|login|permission|mute|forbid|banned|speak.?limit/i.test(signal)) { markControl(target, 'sidebar_chat_login_permission_tip'); } else if (/表情|颜文字|emoji|emotion|emoticon|face-panel|facePanel/i.test(signal)) { markControl(target, 'sidebar_chat_emoji_panel'); } else if (/快捷回复|快捷发言|快捷弹幕|常用语|常用回复|预设回复|quick.?reply|phrase|preset|canned/i.test(signal)) { markControl(target, 'sidebar_chat_quick_reply_panel'); } else if (/粉丝牌|徽章|身份|装扮|贵族|守护|勋章|佩戴|badge|medal|fansmedal|identity|noble|guardian|dress|decoration/i.test(signal)) { markControl(target, 'sidebar_chat_identity_panel'); } else if (/聊天工具|弹幕样式|弹幕颜色|样式|颜色|字体|字号|气泡|tool|style|color|font|bubble/i.test(signal)) { markControl(target, 'sidebar_chat_tool_popover'); } }); } markControl(sendButtonTarget, 'sidebar_chat_send_button'); } function getPlayerAreaRoot() { const selectors = [ '#liveRoomObj', '#J_player', '#player-wrap', '#player-container', '#player', '.room-player', '[class*="RoomPlayer"]', '[class*="room-player"]' ]; const roots = selectors.map(selector => document.querySelector(selector)).filter(Boolean); return roots.find(isElementVisible) || roots[0] || null; } // === 08-dynamic-player-gift.js === // 08-dynamic-player-gift.js 播放器和礼物区域动态标记 function markPlayerStatusDynamicControls() { const root = getPlayerAreaRoot(); if (!root || !isElementVisible(root)) return; const controlSelector = PLAYER_CONTROL_SELECTORS; const leafSelector = 'div,span,p,em,i,b,strong,a,button'; const statusContainerSelector = [ '[data-h-q-player-status]', '[class*="tip"]', '[class*="Tip"]', '[class*="notice"]', '[class*="Notice"]', '[class*="toast"]', '[class*="Toast"]', '[class*="mask"]', '[class*="Mask"]', '[class*="loading"]', '[class*="Loading"]', '[class*="buffer"]', '[class*="Buffer"]', '[class*="error"]', '[class*="Error"]', '[class*="reconnect"]', '[class*="Reconnect"]', '[class*="qrcode"]', '[class*="QRCode"]', '[class*="qr-code"]', '[class*="network"]', '[class*="Network"]', '[class*="latency"]', '[class*="Latency"]' ].join(','); const isStatusCandidate = (el) => { if (!isElementVisible(el)) return false; if (el.closest(controlSelector)) return false; const rect = el.getBoundingClientRect(); const rootRect = root.getBoundingClientRect(); if (rect.bottom < rootRect.top || rect.top > rootRect.bottom || rect.right < rootRect.left || rect.left > rootRect.right) return false; const text = getOwnText(el) || getText(el); if (text.length > 80) return false; return rect.width > 0 && rect.height > 0 && rect.width <= Math.max(420, rootRect.width) && rect.height <= 180; }; const markPlayerStatusPart = (pattern, name, options) => { const opts = options || {}; markLeafElements(root, leafSelector, pattern, name, { leafFilter: isStatusCandidate, signalOptions: { includeText: true }, reject: opts.reject, container: statusContainerSelector, targetExcludeSelector: controlSelector }); }; markPlayerStatusPart(/线路|切线|切换线路|备用线路|网络|网速|弱网|网络波动|network|net[-_ ]?tip|connection|line[-_ ]?tip|route/i, 'player_network_notice', { reject: /清晰|画质|quality|qrcode|qr-code|扫码|全屏|音量|sound|volume|danmu|弹幕/i }); markPlayerStatusPart(/延迟|低延迟|高延迟|实时|卡顿|追帧|delay|latency|lag|stutter|frame/i, 'player_latency_notice', { reject: /清晰|画质|quality|错误|重连|error|reconnect|全屏|音量|sound|volume/i }); markPlayerStatusPart(/播放失败|播放错误|错误|异常|断开|断线|重连|重新连接|重试|连接失败|error|fail|failed|disconnect|reconnect|retry/i, 'player_reconnect_notice', { reject: /举报|report|刷新按钮|refresh-btn|全屏|音量|sound|volume|danmu|弹幕/i }); markPlayerStatusPart(/暂停|已暂停|加载中|正在加载|缓冲|转圈|loading|buffering|spinner|paused|pause|waiting/i, 'player_pause_loading_notice', { reject: /按钮|button|btn|control|全屏|音量|sound|volume|danmu|弹幕/i }); markPlayerStatusPart(/扫码|二维码|清晰度锁定|画质锁定|登录后.*(?:清晰|画质)|APP.*(?:清晰|画质)|蓝光|超清|quality|qrcode|qr-code|scan/i, 'player_quality_qrcode_notice', { reject: /清晰度入口|player-videotype|全屏|音量|sound|volume|danmu|弹幕/i }); } function markPlayerAdDynamicControls() { const root = getPlayerAreaRoot(); if (!root || !isElementVisible(root)) return; const controlSelector = PLAYER_CONTROL_SELECTORS; const giftAreaSelector = [ '#player-gift-wrap', '.player-gift-wrap', '.player-gift-left', '[class*="gift-left"]', '.player-gift-right', '[class*="gift-right"]', '#player-face', '.player-face-list', '.player-face-gift', '.player-face-arrow', '#player-recharge-btn', '#player-package-btn', '#player-guard-btn', '#player-noble-btn' ].join(','); const popupContainerSelector = [ '[data-h-q-player-popup-ad]', '.ab-middle', '.ab-content', '.ab-logo', '.ab-qr-code-wrap', '.ab-qr-code' ].join(','); const leafSelector = 'div,section,aside,a,button,img,span,p,i,em'; const isAdPopupCandidate = (el) => { if (!el || el === root || !isElementVisible(el) || el.closest('#hy-panel') || el.closest(controlSelector) || el.closest(giftAreaSelector) || shouldKeepVisible(el)) return false; const rect = el.getBoundingClientRect(); const rootRect = root.getBoundingClientRect(); if (rect.bottom < rootRect.top || rect.top > rootRect.bottom || rect.right < rootRect.left || rect.left > rootRect.right) return false; const area = rect.width * rect.height; if (rect.width < 24 || rect.height < 18 || area > rootRect.width * rootRect.height * 0.9) return false; const signal = getElementSignal(el, { includeId: true, includeText: true, maxTextLength: 120 }); if (!PLAYER_POPUP_SIGNAL_RE.test(signal)) return false; if (/清晰|画质|quality|全屏|fullscreen|剧场|fullpage|音量|sound|volume|弹幕|danmu|举报|report|刷新|refresh|控制|control/i.test(signal)) return false; const style = window.getComputedStyle(el); const isKnownContainer = !!el.closest(popupContainerSelector); const popupish = /absolute|fixed|sticky/i.test(style.position) || isKnownContainer; return popupish; }; Array.from(root.querySelectorAll(popupContainerSelector + ',' + leafSelector)) .filter(isAdPopupCandidate) .forEach(el => { const target = el.closest(popupContainerSelector) || el.closest('a,button,section,aside,div') || el; if (!target || target === root || target.closest(controlSelector) || target.closest(giftAreaSelector) || shouldKeepVisible(target)) return; markControl(target, 'player_popup_ad'); }); } function markGiftDynamicControls() { const rightRoot = document.querySelector('.player-gift-right'); if (rightRoot) { markControl(rightRoot.querySelector('#player-punch-btn'), 'gift_first_charge'); Array.from(rightRoot.querySelectorAll('li, a, button, div, p, span')) .filter(isElementVisible) .filter(el => FIRST_CHARGE_TEXT_RE.test(getOwnText(el) || getText(el))) .forEach(el => { const item = el.closest('li, a, button') || el; if (item !== rightRoot && rightRoot.contains(item)) markControl(item, 'gift_first_charge'); }); } const leftRoot = document.querySelector('.player-gift-left') || document.querySelector('#player-gift-wrap'); if (!leftRoot) return; Array.from(leftRoot.querySelectorAll('.diy-activity-icon, .diy-activity-icon-box, [id^="diy-activity-icon-"]')) .filter(isElementVisible) .forEach(el => { const text = getText(el); const item = el.closest('.diy-activity-icon') || el.closest('.diy-activity-icon-box') || el; if (/小黄车/.test(text)) markControl(item, 'gift_cart_activity'); if (/告白计划/.test(text)) markControl(item, 'gift_confession_activity'); if (/上热门|热推|加热|助推|hot[-_ ]?promote|boost/i.test(text)) markControl(item, 'gift_hot_promote'); }); const giftRoot = document.querySelector('#player-gift-wrap') || leftRoot; const activityRoots = Array.from(new Set([ ...Array.from(leftRoot.querySelectorAll('.player-left-icon-enter, .player-lucky-burst-icon, .diy-activity-icon, .diy-activity-icon-box, [id^="diy-activity-icon-"], .more-activity-icon, .more-activity-icon-box')), ...Array.from(giftRoot.querySelectorAll('[class*="activity-pop"], [class*="ActivityPop"], [class*="activity-tooltip"], [class*="ActivityTooltip"], [class*="benefit"], [class*="Benefit"], [class*="reward"], [class*="Reward"]')) ])).filter(root => isElementVisible(root) && !root.closest('.player-gift-right, [class*="gift-right"]')); const getActivitySignal = (el) => [ el.id, el.className, el.getAttribute('title'), el.getAttribute('data-title'), el.getAttribute('aria-label'), getOwnText(el) ].filter(Boolean).join(' '); const isActivityPlaceholder = (el) => { const signal = getActivitySignal(el); return /loading|Loading|skeleton|Skeleton|placeholder|Placeholder|empty|Empty|加载中|暂无|空空|占位/i.test(signal); }; activityRoots.forEach(root => { Array.from(root.querySelectorAll('span, em, i, b, strong, p, div, button, a')) .filter(el => el !== root && isElementVisible(el) && !isActivityPlaceholder(el)) .forEach(el => { if (shouldKeepVisible(el)) return; const signal = getActivitySignal(el); const target = el.closest('[class*="countdown"], [class*="Countdown"], [class*="time-left"], [class*="TimeLeft"], [class*="remain-time"], [class*="RemainTime"], [class*="benefit"], [class*="Benefit"], [class*="reward"], [class*="Reward"], [class*="bonus"], [class*="Bonus"], [class*="rebate"], [class*="Rebate"], [class*="activity-pop"], [class*="ActivityPop"], [class*="activity-tooltip"], [class*="ActivityTooltip"]') || el; if (shouldKeepVisible(target)) return; if (/countdown|Countdown|time[-_ ]?left|TimeLeft|remain[-_ ]?time|RemainTime|倒计时|剩余|限时|距.*(?:开始|结束)|\b\d{1,2}:\d{2}(?::\d{2})?\b/i.test(signal)) { markControl(target, 'gift_activity_countdown'); } if (GIFT_BENEFIT_SIGNAL_RE.test(signal)) { markControl(target, 'gift_activity_benefit_tips'); } }); }); const giftRootRect = giftRoot.getBoundingClientRect(); const isNearGiftRoot = (el) => { if (giftRoot.contains(el) || leftRoot.contains(el)) return true; const rect = el.getBoundingClientRect(); return rect.right >= giftRootRect.left - 80 && rect.left <= giftRootRect.right + 80 && rect.bottom >= giftRootRect.top - 280 && rect.top <= giftRootRect.bottom + 160; }; const isOceanActivityPanel = (el) => { if (!el || !isElementVisible(el) || el.closest('#hy-panel')) return false; if (el === giftRoot || el === leftRoot) return false; if (el.closest('.player-gift-right, [class*="gift-right"], #player-face, .player-face-list, .player-face-gift')) return false; const rect = el.getBoundingClientRect(); const area = rect.width * rect.height; if (rect.width < 120 || rect.height < 36 || rect.width > 520 || rect.height > 220 || area > AREA.GIFT) return false; if (!isNearGiftRoot(el)) return false; const signal = [getActivitySignal(el), getText(el).slice(0, 240)].filter(Boolean).join(' '); return /海洋之心|梦想人鱼|人鱼之恋|鲨鲨/.test(signal) && /第\s*\d+\s*\/\s*\d+\s*天|完成\s*\d+\s*星|次日\s*\d+\s*倍|点击查看|奖池|宝箱/.test(signal); }; const resolveOceanActivityPanel = (el) => { const candidates = []; let current = el; while (current && current !== document.body && current !== document.documentElement) { if (isOceanActivityPanel(current)) candidates.push(current); current = current.parentElement; } return candidates.sort((a, b) => { const rectA = a.getBoundingClientRect(); const rectB = b.getBoundingClientRect(); return rectB.width * rectB.height - rectA.width * rectA.height; })[0] || el; }; Array.from(new Set(Array.from(document.querySelectorAll('div, section, aside, a')) .filter(isOceanActivityPanel) .map(resolveOceanActivityPanel))) .slice(0, 4) .forEach(el => markControl(el, 'gift_activity_benefit_tips')); const faceRoots = Array.from(document.querySelectorAll('#player-face, .player-face-list, .player-face-gift')) .filter(root => isElementVisible(root)) .filter(root => !root.closest('.player-gift-right, [class*="gift-right"]')) .filter(root => leftRoot.contains(root) || root.closest('#player-gift-wrap, .player-gift-left, [class*="gift-left"]')); faceRoots.forEach(root => { Array.from(root.querySelectorAll('button, a, span, em, i, p, div')) .filter(el => el !== root && isElementVisible(el)) .forEach(el => { const ownText = getOwnText(el); const signal = [ el.id, el.className, el.getAttribute('title'), el.getAttribute('data-title'), el.getAttribute('aria-label'), ownText ].filter(Boolean).join(' '); const actionTarget = el.closest('button, a, [role="button"]') || el; if (/gift[-_]?detail|GiftDetail|gift[-_]?pop|GiftPop|gift[-_]?tooltip|GiftTooltip|hover[-_]?detail|HoverDetail|礼物详情|悬浮详情/i.test(signal)) { markControl(el, 'gift_face_hover_detail'); } if (/combo|continuous|streak|连送|连击/i.test(signal)) { markControl(actionTarget, 'gift_face_combo_controls'); } if (/inventory|bag[-_]?status|BagStatus|stock[-_]?status|StockStatus|owned[-_]?status|OwnedStatus|remain[-_]?status|RemainStatus|背包|库存|拥有|剩余/i.test(signal)) { markControl(el, 'gift_face_inventory_status'); } if ((/gift[-_]?send|GiftSend|send[-_]?btn|SendBtn/i.test(signal) || /^(赠送|送出|发送|send)$/i.test(ownText || '')) && !/recharge|package|guard|noble|chat|充值|包裹|守护|贵族|聊天/i.test(signal)) { markControl(actionTarget, 'gift_face_send_button'); } if (/gift[-_]?activity[-_]?badge|GiftActivityBadge|activity[-_]?badge|ActivityBadge|event[-_]?badge|EventBadge|bonus[-_]?badge|BonusBadge|rebate|活动角标|活动加成|返利加成/i.test(signal)) { markControl(el, 'gift_face_activity_badges_ext'); } }); }); } // === 09-dynamic-below.js === // 09-dynamic-below.js 下方区域动态标记和动态控制主入口 function markBelowRecommendDynamicControls() { const roots = Array.from(document.querySelectorAll('#J_roomMain .room-recommend, #J_roomMain [class*="RoomRecommend"], #J_roomMain [class*="roomRecommend"]')) .filter(isElementVisible) .filter(root => !root.closest('#room-moments, .room-moments, .room-footer-r, #room-union, #J_roomULike, #J_roomPersonalRecom, #classify-recom, .classify-recom, #recom-list')); if (!roots.length) return; const cardSelector = 'li, .live-card, [class*="card"], [class*="Card"]'; const leafSelector = 'img,picture,video,canvas,span,em,i,b,strong,a,p,div'; const isSmallLeaf = makeSmallLeafFilter(36, 260, 90); const belowExclude = '#room-moments, .room-moments, #room-union, #J_roomULike, #J_roomPersonalRecom, #classify-recom, .classify-recom, #recom-list'; const markCardPart = (card, pattern, name, options) => { const opts = options || {}; markLeafElements(card, leafSelector, pattern, name, { leafFilter: opts.allowMedia ? (el) => isElementVisible(el) : isSmallLeaf, excludeSelector: belowExclude, reject: opts.reject }); }; roots.forEach(root => { const cards = Array.from(root.querySelectorAll(cardSelector)) .filter(isElementVisible) .filter(card => root.contains(card)) .filter(card => !card.closest('#room-moments, .room-moments, #room-union, #J_roomULike, #J_roomPersonalRecom, #classify-recom, .classify-recom, #recom-list')); cards.forEach(card => { markCardPart(card, /cover|thumb|pic|poster|封面/i, 'room_below_recommend_cover', { allowMedia: true, reject: /avatar|nick|anchor|author|badge|medal|tag|label|title/i }); markCardPart(card, /title|room-name|roomName|RoomName|live-title|LiveTitle|标题|房间名/i, 'room_below_recommend_titles', { reject: /anchor|author|avatar|nick|viewer|online|heat|count|tag|label|category|badge|medal/i }); markCardPart(card, /avatar|nick|anchor-name|anchorName|author-name|authorName|identity|badge|medal|主播|昵称|头像|身份|徽章/i, 'room_below_recommend_anchor_info', { reject: /title|room-name|live-title|viewer|online|heat|count|cover|thumb|pic|poster/i }); markCardPart(card, /viewer|online|heat|hot|audience|观看|热度|在线|人看|^\d+(?:\.\d+)?万?$/i, 'room_below_recommend_view_counts', { reject: /title|room-name|anchor|author|avatar|nick|tag|label|category|badge|cover|thumb|pic/i }); markCardPart(card, /tag|label|category|badge|game-tag|gameTag|game-label|gameLabel|分类|标签|角标|游戏/i, 'room_below_recommend_tags', { reject: /title|room-name|live-title|viewer|online|heat|count|cover|thumb|pic|poster|anchor|author|avatar|nick/i }); }); }); } function markBelowCategoryRecommendDynamicControls() { const roots = Array.from(new Set(Array.from(document.querySelectorAll('#classify-recom, .classify-recom, #recom-list')))) .filter(isElementVisible); if (!roots.length) return; const leafSelector = 'img,picture,span,em,i,b,strong,a,p,div,button'; const itemSelector = 'li, a, [role="link"], [class*="item"], [class*="Item"], [class*="card"], [class*="Card"]'; const isPlaceholderSignal = (signal) => /loading|Loading|skeleton|Skeleton|placeholder|Placeholder|empty|Empty|no[-_ ]?data|NoData|加载|暂无|空空|占位/i.test(signal || ''); const isCategoryPlaceholder = (el) => { if (!el) return true; if (isPlaceholderSignal(getElementSignal(el, { includeId: true }))) return true; const placeholder = el.closest('[class*="loading"], [class*="Loading"], [class*="skeleton"], [class*="Skeleton"], [class*="placeholder"], [class*="Placeholder"], [class*="empty"], [class*="Empty"], [class*="no-data"], [class*="NoData"]'); return !!placeholder && !!placeholder.closest('#classify-recom, .classify-recom, #recom-list'); }; const isRealCategoryItem = (el) => { if (!isElementVisible(el) || isCategoryPlaceholder(el)) return false; if (el.closest('#room-union, #J_roomULike, #J_roomPersonalRecom, #room-moments, .room-moments')) return false; const rect = el.getBoundingClientRect(); const signal = getElementSignal(el, { includeId: true }); const text = getText(el); if (/推荐分类|分类推荐|换一换|刷新|更多/.test(text) && rect.height <= 36) return false; const hasItemShape = el.matches('li, a, [role="link"]') || /item|Item|card|Card|list-item|ListItem|recom/.test(signal); const hasRealContent = !!el.querySelector('img, picture, [class*="cover"], [class*="Cover"], [class*="icon"], [class*="Icon"], [class*="name"], [class*="Name"], [class*="viewer"], [class*="Viewer"], [class*="heat"], [class*="Heat"]') || /观看|热度|在线|人看|\d+(?:\.\d+)?万?/.test(text); return rect.width > 0 && rect.height >= 24 && rect.width <= 360 && hasItemShape && hasRealContent; }; const isSmallLeaf = makeSmallLeafFilter(40, 280, 96, (el) => !isCategoryPlaceholder(el)); const markCategoryPart = (root, pattern, name, options) => { const opts = options || {}; const leafFilter = opts.allowMedia ? (el) => isElementVisible(el) && !isCategoryPlaceholder(el) : (el) => isSmallLeaf(el); const rejectPattern = opts.actionOnly ? /button|btn|more|refresh|change|action|换一换|刷新|更多/ : null; if (!opts.actionOnly) { markLeafElements(root, leafSelector, pattern, name, { leafFilter, signalOptions: { includeId: true }, reject: opts.reject }); } if (opts.actionOnly) { Array.from(root.querySelectorAll(leafSelector)) .filter(el => el !== root && leafFilter(el)) .forEach(el => { const signal = getElementSignal(el, { includeId: true }); if (!signal || !pattern.test(signal)) return; if (isPlaceholderSignal(signal)) return; if (opts.reject && opts.reject.test(signal)) return; if (el.matches('button,[role="button"]') || /button|btn|more|refresh|change|action|换一换|刷新|更多/.test(signal)) { markControl(el, name); } }); } }; roots.forEach(root => { Array.from(root.querySelectorAll(itemSelector)) .filter(el => el !== root) .filter(isRealCategoryItem) .forEach(item => { markControl(item, 'room_below_category_recommend_items'); Array.from(item.querySelectorAll(leafSelector)) .filter(el => el !== item && isSmallLeaf(el)) .forEach(el => { const signal = getElementSignal(el, { includeId: true }); if (/live|Live|living|Living|status|Status|badge|Badge|tag|Tag|hot|Hot|recommend|Recommend|直播中|热播|推荐|开播|热门/i.test(signal) && !/name|Name|viewer|Viewer|online|Online|heat|Heat|count|Count|cover|Cover|thumb|Thumb|pic|Pic|icon|Icon/i.test(signal)) { markControl(el, 'room_below_category_recommend_status_badges'); } if (/hover|Hover|preview|Preview|overlay|Overlay|mask|Mask|pop|Pop|tooltip|Tooltip|enter|Enter|进入|预览|悬浮|浮层|遮罩/i.test(signal) && !/loading|Loading|skeleton|Skeleton|empty|Empty|加载|暂无/i.test(signal)) { markControl(el, 'room_below_category_recommend_hover_overlay'); } }); }); markCategoryPart(root, /title|Title|head|Head|hd|推荐分类|分类推荐/i, 'room_below_category_recommend_title', { reject: /item|card|list|name|viewer|online|heat|count|cover|thumb|pic|icon|button|btn|more|refresh|change/i }); markCategoryPart(root, /cover|Cover|thumb|Thumb|icon|Icon|pic|Pic|poster|封面|图标|缩略图/i, 'room_below_category_recommend_icons', { allowMedia: true, reject: /title|head|name|viewer|online|heat|count|button|btn|more|refresh|change/i }); markCategoryPart(root, /category-name|CategoryName|game-name|GameName|room-name|RoomName|name|Name|分类名|游戏名|房间名/i, 'room_below_category_recommend_names', { reject: /title|head|viewer|online|heat|count|cover|thumb|pic|icon|button|btn|more|refresh|change/i }); markCategoryPart(root, /viewer|Viewer|online|Online|heat|Heat|hot|Hot|count|Count|观看|热度|在线|人看|^\d+(?:\.\d+)?万?$/i, 'room_below_category_recommend_view_counts', { reject: /title|head|name|cover|thumb|pic|icon|button|btn|more|refresh|change/i }); markCategoryPart(root, /button|btn|more|More|refresh|Refresh|change|Change|action|Action|更多|换一换|刷新|进入/i, 'room_below_category_recommend_actions', { actionOnly: true, reject: /title|head|name|viewer|online|heat|count|cover|thumb|pic|icon/i }); }); } // === 10-display-mode.js === // 10-display-mode.js 显示模式、画质应用、加载修复和主应用入口 function markDynamicControls(enabledBlocksInput) { const enabledBlocks = Array.isArray(enabledBlocksInput) ? enabledBlocksInput : ACTIVE_CONTROL_BLOCKS.filter(item => getVal(item.key, false)); const dynamicKeys = enabledBlocks .map(item => item.key) .filter(key => DYNAMIC_CONTROL_BLOCK_KEYS.has(key)); if (!dynamicKeys.length) { clearPendingDynamicMark(); clearDynamicControlOnlyMarks(false); if (enabledBlocks.length) { const now = Date.now(); const minInterval = document.hidden ? 2500 : 700; refreshKeepVisibleControls(now, minInterval, false); } else { clearKeepVisibleMarks(false); } lastDynamicControlKeySignature = ''; lastDynamicMarkAt = 0; return; } const signature = dynamicKeys.join('|'); const now = Date.now(); const minInterval = document.hidden ? 2500 : 700; const elapsed = now - lastDynamicMarkAt; if (signature === lastDynamicControlKeySignature && elapsed < minInterval) { schedulePendingDynamicMark(minInterval - elapsed + 20); return; } clearPendingDynamicMark(); clearDynamicControlOnlyMarks(false); refreshKeepVisibleControls(now, minInterval, signature !== lastDynamicControlKeySignature); const enabledKeys = new Set(dynamicKeys); DYNAMIC_CONTROL_GROUPS.forEach(group => { if (group.keys.some(key => enabledKeys.has(key))) group.mark(enabledKeys); }); lastDynamicControlKeySignature = signature; lastDynamicMarkAt = now; } function getButtonLabel(el) { if (!el) return ''; return [ el.getAttribute('title'), el.getAttribute('aria-label'), el.getAttribute('data-title'), el.textContent ].filter(Boolean).join(' '); } function findDisplayModeButton(config, mode) { const btn = findFirstVisible(config.selectors) || findFirstConnected(config.selectors); if (!btn || mode !== 'fullscreen') return btn; const label = getButtonLabel(btn); if (/网页全屏|页面全屏|剧场/.test(label)) { return findFirstVisible(['#player-fullscreen-btn', '.player-fullscreen-btn']) || findFirstConnected(['#player-fullscreen-btn', '.player-fullscreen-btn']); } return btn; } function getDisplayModeConfig(mode) { if (mode === 'theater') { return { label: '网页剧场模式', selectors: [ '#player-fullpage-btn', '.player-fullpage-btn', '[data-title*="剧场"]', '[title*="剧场"]', '[aria-label*="剧场"]', '[data-title*="网页全屏"]', '[title*="网页全屏"]', '[aria-label*="网页全屏"]' ], isActive: () => { const root = getLiveRoot(); const bodyClass = document.body ? document.body.className : ''; const rootClass = root && typeof root.className === 'string' ? root.className : ''; return /fullpage|full-page|web-full|theater|wide-screen/.test(String(bodyClass + ' ' + rootClass).toLowerCase()); } }; } if (mode === 'fullscreen') { return { label: '尝试浏览器全屏', selectors: [ '#player-fullscreen-btn', '.player-fullscreen-btn', '[data-title*="全屏"]', '[title*="全屏"]', '[aria-label*="全屏"]' ], isActive: () => !!document.fullscreenElement }; } return null; } // 进房模式:用 MutationObserver 监听播放器容器,按钮出现时立即点击 let displayModeObserver = null; function applyFullscreenState() { if (!isScriptEnabled()) return; const mode = getVal('fullscreen_mode', 'off'); if (mode === 'off' || !isLivePage()) return; const config = getDisplayModeConfig(mode); if (!config) return; if (config.isActive()) return; const room = getRoomId(); const key = '_fs_' + room + '_' + mode; if (!room || roomFlags[key] === 'done' || roomFlags[key] === 'pending') return; const observeRoot = document.body; if (!observeRoot) return; roomFlags[key] = 'pending'; let clickAttempts = 0; const MAX_CLICK_ATTEMPTS = 10; const startedAt = Date.now(); const markDebug = (status) => { window.__HY_DISPLAY_MODE_DEBUG__ = { mode, status, clickAttempts, elapsed: Date.now() - startedAt }; }; const tryClick = () => { if (config.isActive()) { roomFlags[key] = 'done'; markDebug('active'); return true; } if (clickAttempts >= MAX_CLICK_ATTEMPTS) { delete roomFlags[key]; markDebug('giveup'); return true; } const b = findDisplayModeButton(config, mode); if (b && !b.disabled && b.getAttribute('aria-disabled') !== 'true') { clickAttempts++; markDebug('click'); b.click(); } else { markDebug('waiting'); } return false; }; tryClick(); const poll = setInterval(() => { if (tryClick()) clearInterval(poll); }, 1200); const obs = new MutationObserver(() => { if (tryClick()) { obs.disconnect(); clearInterval(poll); } }); obs.observe(observeRoot, { childList: true, subtree: true, attributes: true, attributeFilter: ['class', 'style', 'disabled', 'title', 'aria-label', 'data-title'] }); setTimeout(() => { obs.disconnect(); clearInterval(poll); if (roomFlags[key] === 'pending') delete roomFlags[key]; markDebug(config.isActive() ? 'active' : 'timeout'); }, 20000); } function applyQualityMode() { if (!isScriptEnabled()) return; const mode = getVal('quality_mode', 'off'); if (mode === 'off' || !isLivePage()) return; const room = getRoomId(); const key = '_ql_' + room + '_' + mode; if (!room || roomFlags[key] === 'done' || roomFlags[key] === 'pending') return; roomFlags[key] = 'pending'; managedSetInterval((timerId, count) => { if (roomFlags[key] === 'done') { clearManagedInterval(timerId); return; } const qualities = QualityUnlocker.detectQualities(); const target = mode === 'highest' ? qualities.find(q => !q.isLocked) : qualities.find(q => q.value === mode); if (!target) { if (count >= 8) delete roomFlags[key]; return; } if (target.isLocked) QualityUnlocker.unlockAll(); setTimeout(() => QualityUnlocker.clickQuality(target), 0); roomFlags[key] = 'done'; clearManagedInterval(timerId); }, TIMING.QUALITY_POLL_MS, TIMING.QUALITY_MAX); } function scheduleStopPageLoading() { if (!getVal('stop_loading_spinner', true) || !isLivePage()) return; if (document.readyState === 'complete') return; const room = getRoomId(); const key = '_stop_load_' + room; if (!room || roomFlags[key] === 'done' || roomFlags[key] === 'pending') return; roomFlags[key] = 'pending'; const startedAt = Date.now(); const minStopDelay = TIMING.STOP_MIN_DELAY; managedSetInterval((timerId, count) => { if (document.readyState === 'complete') { roomFlags[key] = 'done'; clearManagedInterval(timerId); return; } const video = document.querySelector('video, #player video, [id*="player"] video'); const playerReady = video && (video.readyState >= 2 || !video.paused || video.currentTime > 0); if (playerReady && Date.now() - startedAt >= minStopDelay) { try { window.stop(); roomFlags[key] = 'done'; clearManagedInterval(timerId); } catch (err) { delete roomFlags[key]; clearManagedInterval(timerId); } } else if (count >= 30) { delete roomFlags[key]; } }, 1000, 15); } let _lastApplyAllAt = 0; function applyAll() { // 前台节流:200ms 内不重复执行 const now = Date.now(); if (!document.hidden && now - _lastApplyAllAt < 200) return; _lastApplyAllAt = now; detectTheme(); if (!isScriptEnabled()) { applyControlBlocks(); clearAllTimers(); QualityUnlocker.stop(); return; } applyControlBlocks(); if (!isLivePage()) { return; } markLiveRoot(); if (document.hidden) return; // 进房模式和画质:延迟 100ms 让 DOM 先渲染,然后立即执行 setTimeout(() => { if (document.hidden) return; applyFullscreenState(); applyQualityMode(); scheduleStopPageLoading(); if (getVal('quality_mode', 'off') !== 'off') QualityUnlocker.waitForPlayer(); }, 100); } // === 11-observer-spa.js === // 11-observer-spa.js MutationObserver和SPA路由钩子(性能优化版) // === 后台暂停控制 === let observerConnected = false; function connectObserver() { if (observerConnected || !document.body) return; observer.observe(document.body, { childList: true, subtree: true }); observerConnected = true; } function disconnectObserver() { if (!observerConnected) return; observer.disconnect(); observerConnected = false; } // === 聊天区独立节流 === let chatThrottle = 0; const CHAT_THROTTLE_MS = 2000; function isChatMutation(mutations) { for (let i = 0; i < mutations.length; i++) { const t = mutations[i].target; if (t.closest && (t.closest('#chat-room__wrap') || t.closest('#J_roomChatList') || t.closest('#J_msgList'))) return true; } return false; } // === 主 Observer === function scheduleApplyAll() { if (deferredApplyTimer) clearTimeout(deferredApplyTimer); deferredApplyTimer = setTimeout(() => { deferredApplyTimer = null; if (!document.hidden) applyAll(); }, document.hidden ? 1200 : 0); } let debounceTimer = null; let obsThrottle = 0; const observer = new MutationObserver((mutations) => { // 后台完全跳过 if (document.hidden) return; const now = Date.now(); // 快速过滤:只涉及脚本自身元素的变化,跳过 let hasRelevantChange = false; for (let i = 0; i < mutations.length; i++) { const m = mutations[i]; if (m.target.closest && m.target.closest('#hy-panel')) continue; if (m.target.id === 'hy-control-block-css') continue; hasRelevantChange = true; break; } if (!hasRelevantChange) return; // 聊天区变化用独立节流,不触发全量 applyAll if (isChatMutation(mutations)) { if (now - chatThrottle < CHAT_THROTTLE_MS) return; chatThrottle = now; // 聊天区变化只触发控件应用,不触发画质/进房模式 if (isScriptEnabled()) applyControlBlocks(); return; } // 非聊天区变化走正常节流 if (now - obsThrottle < TIMING.OBSERVER_THROTTLE) return; obsThrottle = now; clearTimeout(debounceTimer); debounceTimer = setTimeout(() => { if (document.querySelector('#liveRoomObj, .room-player, #J_mainRoom')) applyAll(); }, 800); }); // === visibilitychange:后台暂停,前台恢复 === document.addEventListener('visibilitychange', () => { if (document.hidden) { // 进入后台:暂停 observer,减少 CPU disconnectObserver(); clearAllTimers(); QualityUnlocker.stop(); } else { // 回到前台:重新连接 observer,执行一次 applyAll connectObserver(); scheduleApplyAll(); } }); // === SPA 路由钩子 === function hookSPA() { const refresh = () => { resetRoomState(); managedSetInterval((timerId) => { if (!document.querySelector('#liveRoomObj, .room-player, #J_mainRoom')) return; clearManagedInterval(timerId); applyAll(); if (!document.hidden && isScriptEnabled() && getVal('quality_mode', 'off') !== 'off') QualityUnlocker.waitForPlayer(); }, 500, 10); }; const pushState = history.pushState; const replaceState = history.replaceState; history.pushState = function () { pushState.apply(this, arguments); refresh(); }; history.replaceState = function () { replaceState.apply(this, arguments); refresh(); }; window.addEventListener('popstate', refresh); } // === 12-ui-css.js === // 12-ui-css.js 控制面板CSS样式注入 function injectUICSS() { const css = [ '[data-theme="dark"]{--hy-bg:#17181c;--hy-surface:#202126;--hy-surface-2:#25272d;--hy-card:#202126;--hy-card-hover:#282a30;--hy-hover:#282a30;--hy-text:#f4f5f7;--hy-text2:#d6d9df;--hy-text3:#9ca3af;--hy-border:#34363d;--hy-accent:#ff7a1a;--hy-accent-hover:#ff8f3d;--hy-accent-soft:rgba(255,122,26,.16);--hy-sw-off:#4b4d55;--hy-sw-knob:#fff;--hy-shadow:0 12px 28px rgba(0,0,0,.22)}', '[data-theme="light"]{--hy-bg:#f7f8fa;--hy-surface:#fff;--hy-surface-2:#f3f4f6;--hy-card:#fff;--hy-card-hover:#f0f2f5;--hy-hover:#f0f2f5;--hy-text:#1f2329;--hy-text2:#4b5563;--hy-text3:#6b7280;--hy-border:#e6e8ee;--hy-accent:#ff6900;--hy-accent-hover:#f25f00;--hy-accent-soft:rgba(255,105,0,.12);--hy-sw-off:rgba(0,0,0,.12);--hy-sw-knob:#fff;--hy-shadow:0 12px 28px rgba(31,35,41,.08)}', ':root{--hy-fs-l1:16px;--hy-fs-l2:15px;--hy-fs-l3:14px;--hy-fs-l4:13px;--hy-fs-l5:12px;--hy-radius:8px}', '#hy-panel{position:fixed;z-index:2147483647;width:min(720px,calc(100vw - 40px));height:min(540px,calc(100vh - 40px));max-height:calc(100vh - 40px);display:flex;flex-direction:column;background:var(--hy-bg);border:1px solid var(--hy-border);border-radius:var(--hy-radius);box-shadow:var(--hy-shadow);font-family:MiSans,"Xiaomi Sans","PingFang SC","Microsoft YaHei",system-ui,sans-serif;transition:opacity .16s ease,transform .16s ease;overflow:hidden;letter-spacing:0}', '#hy-panel.hy-hidden{opacity:0;pointer-events:none;transform:scale(.98)}', '.hy-hdr{display:flex;justify-content:space-between;align-items:center;padding:13px 16px;font-size:var(--hy-fs-l1);font-weight:700;color:var(--hy-text);background:var(--hy-surface);border-bottom:1px solid var(--hy-border);flex-shrink:0;cursor:move}', '.hy-x{cursor:pointer;font-size:20px;color:var(--hy-text3);line-height:1;transition:all .16s ease;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:8px}', '.hy-x:hover{color:var(--hy-accent);background:var(--hy-hover)}', '.hy-body{display:flex;flex:1;min-height:0;overflow:hidden;background:var(--hy-bg)}', '.hy-content-wrap{flex:1;overflow-y:auto;overflow-x:hidden;min-height:0;padding:14px;box-sizing:border-box}', '.hy-content-wrap::-webkit-scrollbar{width:3px}', '.hy-content-wrap::-webkit-scrollbar-thumb{background:var(--hy-border);border-radius:999px}', '.hy-dashboard{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin-bottom:10px}', '.hy-stat-card{min-width:0;border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-card);padding:9px 12px;box-sizing:border-box;transition:border-color .16s ease,background .16s ease}', '.hy-stat-label{font-size:var(--hy-fs-l5);font-weight:500;line-height:1.35;color:var(--hy-text3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}', '.hy-stat-value{padding-top:4px;font-size:var(--hy-fs-l3);font-weight:700;line-height:1.35;color:var(--hy-text)}', '.hy-stat-card-on{border-color:var(--hy-accent);background:var(--hy-accent-soft)}', '.hy-stat-card-on .hy-stat-value{color:var(--hy-accent)}', '.hy-section{background:var(--hy-card);border:1px solid var(--hy-border);border-radius:8px;margin-bottom:12px;padding:12px 14px;overflow:visible}', '.hy-section:last-child{margin-bottom:0}', '.hy-section-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;gap:12px}', '.hy-section-title{font-size:var(--hy-fs-l2);font-weight:600;color:var(--hy-text);line-height:1.35}', '.hy-section-stat{font-size:var(--hy-fs-l5);font-weight:500;color:var(--hy-text3);line-height:1.35;white-space:nowrap}', '.hy-profile-select{height:32px;border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-surface-2);font-size:var(--hy-fs-l4);font-family:inherit;color:var(--hy-text);padding:0 10px;min-width:0;width:100%;box-sizing:border-box;outline:none}', '.hy-profile-select:focus{border-color:var(--hy-accent);background:var(--hy-card-hover);box-shadow:0 0 0 2px var(--hy-accent-soft)}', '.hy-preset-bar{display:grid;grid-template-columns:76px minmax(0,1fr);align-items:center;gap:10px 12px;border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-surface-2);padding:10px 12px;margin-bottom:10px;box-sizing:border-box}', '.hy-preset-label{font-size:var(--hy-fs-l5);font-weight:500;line-height:1.35;color:var(--hy-text3);white-space:nowrap;min-width:0}', '.hy-preset-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}', '.hy-profile-actions{display:grid;grid-template-columns:minmax(150px,1.1fr) minmax(150px,1fr) auto auto auto;gap:8px;width:100%;align-items:center}', '.hy-profile-actions .hy-detail-search-input{width:100%;min-width:0;flex:none}', '.hy-profile-actions .hy-preset-btn{min-width:48px}', '.hy-preset-btn{height:28px;border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-card);color:var(--hy-text2);font-size:var(--hy-fs-l5);font-family:inherit;font-weight:500;line-height:18px;padding:0 10px;cursor:pointer;transition:border-color .16s ease,background .16s ease,color .16s ease}', '.hy-preset-btn:hover,.hy-preset-btn-active{color:var(--hy-accent);border-color:var(--hy-accent);background:var(--hy-accent-soft)}', '.hy-preset-btn:disabled{cursor:not-allowed;color:var(--hy-text3);border-color:var(--hy-border);background:var(--hy-surface-2);opacity:.68}', '.hy-effect-tools{grid-template-columns:76px minmax(0,1fr)}', '.hy-effect-tools .hy-preset-actions{align-items:center}', '.hy-effect-note{font-size:var(--hy-fs-l5);font-weight:400;line-height:1.35;color:var(--hy-text3);white-space:nowrap}', '.hy-effect-badge{display:inline-flex;align-items:center;margin-left:6px;padding:0 5px;border:1px solid var(--hy-border);border-radius:999px;background:var(--hy-surface-2);color:var(--hy-text3);font-size:10px;font-weight:500;line-height:16px;vertical-align:1px;white-space:nowrap}', '.hy-effect-badge[hidden]{display:none!important}', '.hy-effect-badge[data-hy-effect-state="hidden"]{border-color:var(--hy-accent);background:var(--hy-accent-soft);color:var(--hy-accent)}', '.hy-effect-badge[data-hy-effect-state="partial"]{border-color:rgba(255,105,0,.45);background:rgba(255,105,0,.12);color:var(--hy-accent)}', '.hy-effect-badge[data-hy-effect-state="risk"]{border-color:rgba(255,77,79,.45);background:rgba(255,77,79,.12);color:#ff4d4f}', '.hy-effect-preview-target{outline:2px solid var(--hy-accent)!important;outline-offset:2px!important;box-shadow:0 0 0 4px var(--hy-accent-soft)!important}', '.hy-list{border-top:1px solid var(--hy-border)}', '.hy-control-list{display:flex;flex-direction:column;gap:10px;border-top:none}', '.hy-control-mode-wrap{display:flex;flex-direction:column;gap:10px}', '.hy-control-mode-wrap .hy-preset-bar{margin-bottom:0}', '.hy-clean-control-list.hy-hidden,.hy-pro-control-list.hy-hidden{display:none}', '.hy-control-list>.hy-control-bulk{border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-surface-2);padding:10px 12px}', '.hy-control-list>.hy-control-bulk .hy-desc-line{display:none}', '.hy-clean-group-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}', '.hy-clean-group{border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-surface-2);padding:10px 12px;box-sizing:border-box}', '.hy-clean-group .hy-row{align-items:flex-start}', '.hy-clean-group .hy-rname{font-size:var(--hy-fs-l4);font-weight:600}', '.hy-clean-group .hy-desc-line{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:36px;padding-top:8px}', '.hy-compact-group-list{border-top:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:8px 0 10px}', '.hy-compact-group{border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-surface-2);padding:9px 10px}', '.hy-compact-group .hy-row{align-items:flex-start}', '.hy-compact-group .hy-rname{font-size:var(--hy-fs-l4);font-weight:600}', '.hy-compact-group .hy-group-status{padding-top:4px}', '.hy-compact-group .hy-desc-line{display:none}', '.hy-region-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}', '.hy-region-card{border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-surface-2);padding:12px 14px;box-sizing:border-box;transition:border-color .16s ease,background .16s ease,transform .16s ease}', '.hy-region-card.hy-setting{border:1px solid var(--hy-border);padding:12px 14px}', '.hy-region-card:hover{border-color:var(--hy-accent);background:var(--hy-card-hover);transform:translateY(-1px)}', '.hy-region-card .hy-row{align-items:flex-start}', '.hy-region-card .hy-rname{font-size:var(--hy-fs-l3);font-weight:600}', '.hy-region-card .hy-group-status{padding-top:5px}', '.hy-region-card .hy-desc-line{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:36px;padding-top:8px}', '.hy-region-card .hy-detail-btn{min-width:46px}', '.hy-detail-filter{display:flex;align-items:center;gap:8px;margin:10px 0 8px}', '.hy-detail-search-input{flex:1;min-width:0;height:32px;border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-surface-2);color:var(--hy-text);font-size:var(--hy-fs-l4);font-family:inherit;line-height:32px;padding:0 10px;box-sizing:border-box;outline:none;transition:border-color .16s ease,background .16s ease,box-shadow .16s ease}', '.hy-detail-search-input::placeholder{color:var(--hy-text3)}', '.hy-detail-search-input:focus{border-color:var(--hy-accent);background:var(--hy-card-hover);box-shadow:0 0 0 2px var(--hy-accent-soft)}', '.hy-detail-jump-select{height:32px;max-width:180px;min-width:120px;flex:0 1 180px;border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-surface-2);color:var(--hy-text);font-size:var(--hy-fs-l4);font-family:inherit;line-height:32px;padding:0 8px;box-sizing:border-box;outline:none;cursor:pointer;transition:border-color .16s ease,background .16s ease,box-shadow .16s ease}', '.hy-detail-jump-select:focus{border-color:var(--hy-accent);background:var(--hy-card-hover);box-shadow:0 0 0 2px var(--hy-accent-soft)}', '.hy-detail-enabled-only{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 10px;border:1px solid var(--hy-border);border-radius:8px;background:var(--hy-surface-2);color:var(--hy-text2);font-size:var(--hy-fs-l5);font-weight:500;white-space:nowrap;box-sizing:border-box;cursor:pointer;transition:border-color .16s ease,background .16s ease,color .16s ease}', '.hy-detail-enabled-only:hover{border-color:var(--hy-accent);background:var(--hy-accent-soft);color:var(--hy-accent)}', '.hy-detail-enabled-only input{width:14px;height:14px;margin:0;accent-color:var(--hy-accent);cursor:pointer}', '.hy-advanced-hidden{display:none!important}', '.hy-advanced-control .hy-rname:after{content:"高级";display:inline-flex;margin-left:6px;padding:0 5px;border-radius:999px;background:var(--hy-surface-2);color:var(--hy-text3);font-size:10px;font-weight:500;line-height:16px;vertical-align:1px}', '.hy-filter-hidden{display:none!important}', '.hy-detail-jump-target{background:var(--hy-accent-soft);box-shadow:inset 0 0 0 1px var(--hy-accent);border-radius:8px}', '.hy-detail-empty{display:none;padding:12px 0 2px;border-top:1px solid var(--hy-border);font-size:var(--hy-fs-l5);font-weight:400;line-height:1.5;color:var(--hy-text3);text-align:center}', '.hy-detail-empty-on{display:block}', '.hy-setting{border-bottom:1px solid var(--hy-border);padding:10px 0}', '.hy-setting:last-child{border-bottom:none;padding-bottom:0}', '.hy-row{display:flex;justify-content:space-between;align-items:center;gap:12px}', '.hy-rleft{flex:1;min-width:0;margin-right:4px}', '.hy-rname{font-size:var(--hy-fs-l3);color:var(--hy-text);font-weight:500;line-height:1.4}', '.hy-desc-line{padding-top:4px;font-size:var(--hy-fs-l5);color:var(--hy-text3);font-weight:400;line-height:1.5;white-space:normal;word-break:break-word}', '.hy-footer{padding:8px 16px;background:var(--hy-surface);border-top:1px solid var(--hy-border);font-size:var(--hy-fs-l5);color:var(--hy-text3);flex-shrink:0;display:flex;justify-content:space-between}', '.hy-dd{position:relative;width:172px;flex-shrink:0}', '.hy-dd-sel{display:flex;align-items:center;justify-content:space-between;height:32px;padding:0 12px;border-radius:8px;background:var(--hy-surface-2);border:1px solid var(--hy-border);font-size:var(--hy-fs-l3);font-weight:500;color:var(--hy-text);cursor:pointer;transition:all .16s ease;gap:8px;box-sizing:border-box}', '.hy-dd-sel:hover{border-color:var(--hy-accent);background:var(--hy-card-hover)}', '.hy-dd-text{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:20px}', '.hy-dd-arrow{font-size:10px;color:var(--hy-text3);flex-shrink:0;transition:transform .2s cubic-bezier(.2,0,0,1)}', '.hy-dd-open .hy-dd-arrow{transform:rotate(180deg)}', '.hy-dd-menu{position:absolute;top:calc(100% + 6px);right:0;width:max-content;min-width:100%;max-width:320px;max-height:210px;border-radius:8px;background:var(--hy-surface);border:1px solid var(--hy-border);box-shadow:var(--hy-shadow);z-index:2147483647;overflow-y:auto;display:none;padding:6px 0}', '.hy-dd-open .hy-dd-menu{display:block}', '.hy-dd-opt{display:flex;align-items:center;padding:9px 14px;font-size:var(--hy-fs-l3);font-weight:500;color:var(--hy-text2);cursor:pointer;transition:all .15s;line-height:1.35;white-space:nowrap;border-radius:8px;margin:2px 6px}', '.hy-dd-opt:hover{background:var(--hy-accent-soft);color:var(--hy-accent)}', '.hy-dd-opt-on{color:var(--hy-accent)!important;font-weight:600;background:var(--hy-accent-soft)}', '.hy-switch{position:relative;width:40px;height:22px;display:inline-flex;align-items:center;flex-shrink:0;cursor:pointer}', '.hy-switch input{position:absolute;opacity:0;width:0;height:0;pointer-events:none}', '.hy-switch-knob{position:absolute;inset:0;border-radius:11px;background:var(--hy-sw-off);transition:all .25s cubic-bezier(.4,0,.2,1)}', '.hy-switch-knob:after{content:"";position:absolute;left:2px;top:2px;width:18px;height:18px;border-radius:50%;background:var(--hy-sw-knob);transition:all .25s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 4px rgba(0,0,0,.2)}', '.hy-switch input:checked+.hy-switch-knob{background:var(--hy-accent)}', '.hy-switch input:checked+.hy-switch-knob:after{transform:translateX(18px)}', '.hy-switch input:indeterminate+.hy-switch-knob{background:var(--hy-accent-soft)}', '.hy-switch input:indeterminate+.hy-switch-knob:after{transform:translateX(9px);background:var(--hy-accent)}', '.hy-row-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}', '.hy-detail-btn,.hy-back-btn{border:1px solid var(--hy-border);background:var(--hy-surface-2);color:var(--hy-text2);border-radius:8px;padding:5px 10px;font-size:var(--hy-fs-l5);font-weight:500;line-height:18px;cursor:pointer;transition:all .16s ease}', '.hy-detail-btn:hover,.hy-back-btn:hover{color:var(--hy-accent);border-color:var(--hy-accent);background:var(--hy-accent-soft)}', '.hy-region-row{cursor:pointer;border-radius:8px;margin:0 -6px;padding:8px 6px;transition:background .16s ease}', '.hy-list>.hy-setting:not(.hy-region-card) .hy-region-row:hover{background:var(--hy-hover)}', '.hy-region-row:hover .hy-rname{color:var(--hy-accent)}', '.hy-group-status{font-size:var(--hy-fs-l5);font-weight:500;color:var(--hy-text3);padding-top:4px;line-height:1.4}', '.hy-detail-view.hy-hidden,.hy-main-view.hy-hidden{display:none}', '.hy-subview-head{display:flex;align-items:center;gap:10px;padding:0 0 10px}', '.hy-subview-title{font-size:var(--hy-fs-l2);font-weight:600;color:var(--hy-text);line-height:1.4}', '@media (max-width:620px){.hy-dashboard{grid-template-columns:repeat(2,minmax(0,1fr))}.hy-profile-actions{grid-template-columns:repeat(3,minmax(0,1fr))}.hy-profile-actions .hy-profile-select,.hy-profile-actions .hy-detail-search-input{grid-column:1/-1}}', '@media (max-width:520px){.hy-dashboard,.hy-region-grid,.hy-clean-group-grid{grid-template-columns:1fr}.hy-preset-bar{grid-template-columns:1fr}.hy-detail-filter{flex-wrap:wrap}.hy-detail-search-input{flex-basis:100%}.hy-detail-jump-select{flex:1 1 0;max-width:none}}' ].join('\n'); try { GM_addStyle(css); } catch (e) { const el = document.createElement('style'); el.id = 'hy-ui-css'; el.textContent = css; const append = () => (document.head || document.documentElement).appendChild(el); if (document.head || document.documentElement) append(); else document.addEventListener('DOMContentLoaded', append, { once: true }); } } function closeAllDDs() { document.querySelectorAll('.hy-dd-open').forEach(el => el.classList.remove('hy-dd-open')); } function refreshDropdownRows() { if (!panel) return; SETTINGS.filter(item => item.type === 'dropdown').forEach(item => { const row = panel.querySelector('.hy-setting[data-hy-key="' + item.key + '"]'); if (!row) return; const currentVal = getVal(item.key, item.def); const selectedOpt = item.options.find(opt => opt.value === currentVal) || item.options[0]; const textEl = row.querySelector('.hy-dd-text'); if (textEl && selectedOpt) textEl.textContent = selectedOpt.label; row.querySelectorAll('.hy-dd-opt').forEach(optEl => { optEl.classList.toggle('hy-dd-opt-on', optEl.textContent === (selectedOpt && selectedOpt.label)); }); }); } // === 13-ui-builders.js === // 13-ui-builders.js UI构建辅助函数:下拉框、开关行、区域行、批量控件 function buildDropdownRow(item, onChange) { const container = document.createElement('div'); container.className = 'hy-setting'; container.dataset.hyKey = item.key; const row = document.createElement('div'); row.className = 'hy-row'; const left = document.createElement('div'); left.className = 'hy-rleft'; const name = document.createElement('div'); name.className = 'hy-rname'; name.textContent = item.name; left.appendChild(name); row.appendChild(left); const dd = document.createElement('div'); dd.className = 'hy-dd'; const sel = document.createElement('div'); sel.className = 'hy-dd-sel'; const txt = document.createElement('span'); txt.className = 'hy-dd-text'; const arrow = document.createElement('span'); arrow.className = 'hy-dd-arrow'; arrow.textContent = '▼'; sel.appendChild(txt); sel.appendChild(arrow); dd.appendChild(sel); const menu = document.createElement('div'); menu.className = 'hy-dd-menu'; dd.appendChild(menu); const currentVal = getVal(item.key, item.def); item.options.forEach(opt => { const optEl = document.createElement('div'); optEl.className = 'hy-dd-opt'; if (opt.value === currentVal) optEl.classList.add('hy-dd-opt-on'); optEl.textContent = opt.label; optEl.addEventListener('click', (e) => { e.stopPropagation(); if (getVal(item.key, item.def) !== opt.value) prepareUserChange(item.name); setVal(item.key, opt.value); menu.querySelectorAll('.hy-dd-opt').forEach(o => o.classList.remove('hy-dd-opt-on')); optEl.classList.add('hy-dd-opt-on'); txt.textContent = opt.label; dd.classList.remove('hy-dd-open'); resetRoomState(); onChange(); }); menu.appendChild(optEl); }); const selectedOpt = item.options.find(o => o.value === currentVal) || item.options[0]; txt.textContent = selectedOpt.label; sel.addEventListener('click', (e) => { e.stopPropagation(); const wasOpen = dd.classList.contains('hy-dd-open'); closeAllDDs(); if (!wasOpen) dd.classList.add('hy-dd-open'); }); row.appendChild(dd); container.appendChild(row); appendDesc(container, item.desc); return container; } function buildSwitchRow(item, onChange, options) { function getDefaultSwitchDesc(target) { const key = String(target.key || ''); const label = String(target.name || target.key || '该控件').replace(/^(屏蔽|隐藏)/, ''); if (key.indexOf('block_header_') === 0) return '隐藏页面顶部的' + label + ',让顶部导航和入口更安静。'; if (key.indexOf('block_room_') === 0 || key.indexOf('block_anchor_') === 0) return '隐藏直播间头部的' + label + ',不影响直播画面播放。'; if (key.indexOf('block_sidebar_chat_input') === 0 || key === 'block_sidebar_chat_send_button' || key === 'block_sidebar_chat_textarea') return '隐藏右侧聊天输入区里的' + label + ';开启后对应聊天操作入口会消失。'; if (key.indexOf('block_sidebar_chat_') === 0) return '隐藏右侧聊天区里的' + label + ',减少聊天栏滚动和互动干扰。'; if (key.indexOf('block_sidebar_rank') === 0 || key.indexOf('block_sidebar_user_') === 0) return '隐藏右侧榜单里的' + label + ',减少排名和用户信息占用。'; if (key.indexOf('block_sidebar_') === 0) return '隐藏右侧栏里的' + label + ',适合减少侧边栏干扰。'; if (key === 'block_player_control_bar') return target.desc || '隐藏整条播放器底部控制栏;只建议需要纯净画面时单独开启。'; if (key.indexOf('block_player_') === 0) return '隐藏播放器上的' + label + ';开启前确认不需要这个播放器入口。'; if (key.indexOf('block_gift_') === 0) return '隐藏礼物栏里的' + label + ',减少活动、礼物和付费入口干扰。'; return '隐藏' + label + ',减少页面干扰。'; } const opts = options || {}; const container = document.createElement('div'); container.className = 'hy-setting'; container.dataset.hyKey = item.key; if (isAdvancedControlBlock(item)) { container.classList.add('hy-advanced-control'); container.dataset.hyAdvanced = 'true'; } const row = document.createElement('div'); row.className = 'hy-row'; const left = document.createElement('div'); left.className = 'hy-rleft'; const name = document.createElement('div'); name.className = 'hy-rname'; name.textContent = item.name || item.key || '未命名控件'; if (CONTROL_BLOCK_MAP[item.key]) { const badge = document.createElement('span'); badge.className = 'hy-effect-badge'; badge.dataset.hyEffectKey = item.key; applyEffectBadgeState(badge, item); name.appendChild(badge); } left.appendChild(name); row.appendChild(left); const label = document.createElement('label'); label.className = 'hy-switch'; const input = document.createElement('input'); input.type = 'checkbox'; if (opts.inputClassName) input.className = opts.inputClassName; input.checked = opts.getChecked ? !!opts.getChecked() : !!getVal(item.key, item.def === undefined ? false : item.def); if (opts.getIndeterminate) input.indeterminate = !!opts.getIndeterminate(); const knob = document.createElement('span'); knob.className = 'hy-switch-knob'; label.appendChild(input); label.appendChild(knob); row.appendChild(label); input.addEventListener('change', () => { prepareUserChange(item.name); if (opts.onToggle) { opts.onToggle(input.checked, input); } else { setVal(item.key, input.checked); if (item.key === 'script_enabled') resetRoomState(); } onChange(); scheduleEffectDetection(); }); container.appendChild(row); if (opts.appendDesc !== false) { const descText = item.desc || getDefaultSwitchDesc(item); appendDesc(container, descText); } return container; } function updateRegionRow(region) { const refs = regionRowRefs[region.key]; if (!refs) return; const state = getRegionEffectState(region); let text = state.enabled + '/' + state.total + ' 个子控件已开启'; if (controlEffectReport && controlEffectReport.ts && state.enabled > 0) { if (state.hidden > 0) text = state.enabled + '/' + state.total + ' 已开启 · 已隐藏 ' + state.hidden; else if (state.missing > 0) text = state.enabled + '/' + state.total + ' 已开启 · 本页未出现 ' + state.missing; else text = state.enabled + '/' + state.total + ' 已开启 · 可能失效'; } refs.status.textContent = text; refs.status.style.color = state.enabled > 0 ? 'var(--hy-accent)' : 'var(--hy-text3)'; } function refreshRegionRows() { refreshSwitchInputs(); CONTROL_BLOCK_REGIONS.forEach(updateRegionRow); refreshRegionBulkRows(); refreshCompactGroupRows(); refreshCleanGroupRows(); refreshExperienceModeUI(); refreshControlBulkState(); refreshControlPresetState(); refreshSecretControlState(); } function refreshSwitchInputs() { if (!panel) return; const settingByKey = Object.fromEntries(SETTINGS.map(item => [item.key, item])); panel.querySelectorAll('.hy-setting[data-hy-key]').forEach(row => { const key = row.dataset.hyKey; const input = row.querySelector('.hy-switch input'); if (!key || !input) return; const item = CONTROL_BLOCK_MAP[key] || settingByKey[key] || {}; const def = item.def === undefined ? false : item.def; input.checked = !!getVal(key, def); input.indeterminate = false; }); } function getControlBulkState() { const enabled = PUBLIC_CONTROL_BLOCKS.filter(item => getVal(item.key, false)).length; return { enabled, total: PUBLIC_CONTROL_BLOCKS.length, all: PUBLIC_CONTROL_BLOCKS.length > 0 && enabled === PUBLIC_CONTROL_BLOCKS.length, partial: enabled > 0 && enabled < PUBLIC_CONTROL_BLOCKS.length }; } function refreshControlBulkState() { if (!controlBulkInput) return; const state = getControlBulkState(); controlBulkInput.checked = state.all; controlBulkInput.indeterminate = state.partial; if (controlBulkStatusEl) { controlBulkStatusEl.textContent = state.enabled + '/' + state.total + ' 个控件已开启'; controlBulkStatusEl.style.color = state.enabled > 0 ? 'var(--hy-accent)' : 'var(--hy-text3)'; } } // 弹幕保护:这些控件不受"全部开启/关闭"影响 const DANMU_PROTECTED_KEYS = new Set(['block_player_danmu', 'block_player_danmu_button']); function setAllControlBlocks(enabled) { const blocks = enabled ? PUBLIC_CONTROL_BLOCKS : ACTIVE_CONTROL_BLOCKS; blocks.forEach(item => { // 弹幕控件永远不受批量操作影响 if (DANMU_PROTECTED_KEYS.has(item.key)) return; store[item.key] = !!enabled; }); saveStore(); refreshRegionRows(); refreshStats(); } function getCompactGroupState(group) { const keys = group.keys.filter(key => CONTROL_BLOCK_MAP[key]); const enabled = keys.filter(key => getVal(key, false)).length; return { enabled, total: keys.length, all: keys.length > 0 && enabled === keys.length, partial: enabled > 0 && enabled < keys.length }; } function setCompactGroupBlocks(group, enabled) { group.keys.forEach(key => { if (CONTROL_BLOCK_MAP[key]) store[key] = !!enabled; }); saveStore(); refreshRegionRows(); refreshStats(); } function refreshCompactGroupState(group) { const refs = compactGroupRefs[group.key]; if (!refs || !refs.input) return; const state = getCompactGroupState(group); refs.input.checked = state.all; refs.input.indeterminate = state.partial; if (refs.status) { refs.status.textContent = state.enabled + '/' + state.total + ' 个细项已开启'; refs.status.style.color = state.enabled > 0 ? 'var(--hy-accent)' : 'var(--hy-text3)'; } } function refreshCompactGroupRows() { COMPACT_CONTROL_GROUPS.forEach(refreshCompactGroupState); } function getExperienceMode() { return 'pro'; } function getCleanGroupKeys(group) { return group.keys.filter(key => CONTROL_BLOCK_MAP[key] && !INTERNAL_CONTROL_BLOCK_KEYS.has(key)); } function getCleanViewKeys() { return Array.from(new Set(CLEAN_VIEW_GROUPS.flatMap(getCleanGroupKeys))); } function getCleanGroupState(group) { const keys = getCleanGroupKeys(group); const enabled = keys.filter(key => getVal(key, false)).length; return { total: keys.length, enabled, all: keys.length > 0 && enabled === keys.length, partial: enabled > 0 && enabled < keys.length }; } function refreshCleanGroupState(group) { const refs = cleanGroupRefs[group.key]; if (!refs || !refs.input || !refs.input.isConnected) return; const state = getCleanGroupState(group); refs.input.checked = state.all; refs.input.indeterminate = state.partial; if (refs.status) { refs.status.textContent = state.enabled + '/' + state.total + ' 项已开启'; refs.status.style.color = state.enabled > 0 ? 'var(--hy-accent)' : 'var(--hy-text3)'; } } function refreshCleanGroupRows() { CLEAN_VIEW_GROUPS.forEach(refreshCleanGroupState); if (cleanModeStatusEl) { const keys = getCleanViewKeys(); const enabled = keys.filter(key => getVal(key, false)).length; cleanModeStatusEl.textContent = enabled + '/' + keys.length + ' 项清爽干扰已处理'; cleanModeStatusEl.style.color = enabled > 0 ? 'var(--hy-accent)' : 'var(--hy-text3)'; } } function setCleanGroupBlocks(group, enabled) { getCleanGroupKeys(group).forEach(key => { store[key] = !!enabled; }); saveStore(); refreshRegionRows(); refreshCleanGroupRows(); refreshStats(); } function setCleanViewBlocks(enabled) { getCleanViewKeys().forEach(key => { store[key] = !!enabled; }); saveStore(); refreshRegionRows(); refreshCleanGroupRows(); refreshStats(); } // === 14-ui-experience.js === // 14-ui-experience.js 兼容桩:体验模式与推荐配置 UI 已精简 function refreshExperienceModeUI() { return; } function getCurrentControlPresetKey() { return ""; } function refreshControlPresetState() { return; } function applyControlPreset(preset) { const targetKeys = new Set(preset.keys); PUBLIC_CONTROL_BLOCKS.forEach(item => { if (DANMU_PROTECTED_KEYS.has(item.key)) return; store[item.key] = targetKeys.has(item.key); }); saveStore(); refreshRegionRows(); refreshStats(); } function getSecretControlState() { const keys = SECRET_CONTROL_BLOCK_KEYS.filter(key => ACTIVE_CONTROL_BLOCK_KEYS.has(key)); const enabled = keys.filter(key => getVal(key, false)).length; return { total: keys.length, enabled, all: keys.length > 0 && enabled === keys.length, partial: enabled > 0 && enabled < keys.length }; } function refreshSecretControlState() { if (!secretControlInputEl || !secretControlInputEl.isConnected) return; const state = getSecretControlState(); secretControlInputEl.checked = state.all; secretControlInputEl.indeterminate = state.partial; } function setSecretControlBlocks(enabled) { SECRET_CONTROL_BLOCK_KEYS.forEach(key => { if (ACTIVE_CONTROL_BLOCK_KEYS.has(key)) store[key] = !!enabled; }); saveStore(); refreshRegionRows(); refreshSecretControlState(); refreshStats(); } function buildSecretSwitchRow(onChange) { const row = buildSwitchRow({ key: "__secret_control_blocks", name: SECRET_CONTROL_LABEL, type: "switch", def: false }, onChange, { inputClassName: "hy-secret-input", getChecked: () => getSecretControlState().all, getIndeterminate: () => getSecretControlState().partial, onToggle: checked => setSecretControlBlocks(checked), appendDesc: false }); secretControlInputEl = row.querySelector(".hy-secret-input"); refreshSecretControlState(); return row; } function getCustomProfiles() { try { const raw = GM_getValue(CUSTOM_PROFILE_STORE_KEY, null); if (raw && typeof raw === "object") return raw; } catch (e) {} return {}; } function saveCustomProfiles(profiles) { try { GM_setValue(CUSTOM_PROFILE_STORE_KEY, profiles); } catch (e) {} } function getSnapshotForCurrentSettings() { const snap = { ts: Date.now(), settings: {}, blocks: {} }; SETTINGS.forEach(function(item) { snap.settings[item.key] = getVal(item.key, item.def); }); PUBLIC_CONTROL_BLOCKS.forEach(function(item) { snap.blocks[item.key] = !!getVal(item.key, false); }); snap.internalBlocks = {}; INTERNAL_CONTROL_BLOCKS.forEach(function(item) { snap.internalBlocks[item.key] = !!getVal(item.key, false); }); snap.enabledCount = Object.values(snap.blocks).filter(Boolean).length; return snap; } function saveCustomProfile(name) { if (!name || !name.trim()) return null; name = name.trim().slice(0, 40); const profiles = getCustomProfiles(); const keys = Object.keys(profiles); if (keys.length >= CUSTOM_PROFILE_LIMIT) { delete profiles[keys[0]]; console.warn("[HY] 已保存" + CUSTOM_PROFILE_LIMIT + "套方案,最早移除"); } const snap = getSnapshotForCurrentSettings(); const id = "p_" + snap.ts + "_" + String(keys.length + 1).padStart(2, "0"); profiles[id] = { id: id, name: snap.settings.script_enabled !== false ? name : "已暂停-" + name, ts: snap.ts, settings: snap.settings, blocks: snap.blocks, internalBlocks: snap.internalBlocks, enabledCount: snap.enabledCount }; saveCustomProfiles(profiles); return id; } function applyCustomProfile(profileId) { const profiles = getCustomProfiles(); const profile = profiles[profileId]; if (!profile) return false; if (profile.settings) Object.entries(profile.settings).forEach(function(e) { store[e[0]] = e[1]; }); if (profile.blocks) PUBLIC_CONTROL_BLOCKS.forEach(function(item) { store[item.key] = !!profile.blocks[item.key]; }); INTERNAL_CONTROL_BLOCKS.forEach(function(item) { if (profile.internalBlocks && Object.prototype.hasOwnProperty.call(profile.internalBlocks, item.key)) store[item.key] = !!profile.internalBlocks[item.key]; else if (profile.blocks && Object.prototype.hasOwnProperty.call(profile.blocks, item.key)) store[item.key] = !!profile.blocks[item.key]; }); saveStore(); return true; } function deleteCustomProfile(profileId) { const profiles = getCustomProfiles(); delete profiles[profileId]; saveCustomProfiles(profiles); } function getProfileLabel(profileId, profile) { const d = new Date(profile.ts); const pad = function(n) { return String(n).padStart(2, "0"); }; return pad(d.getMonth()+1) + "/" + pad(d.getDate()) + " " + pad(d.getHours()) + ":" + pad(d.getMinutes()) + " • " + profile.enabledCount + "/" + PUBLIC_CONTROL_BLOCKS.length + " 个控件)"; } function refreshCustomProfileUI() { if (!customProfileSelectEl) return; const profiles = getCustomProfiles(); const keys = Object.keys(profiles); const previousValue = customProfileSelectEl.value; while (customProfileSelectEl.options.length > 1) customProfileSelectEl.remove(1); keys.sort(function(a, b) { return (profiles[b].ts || 0) - (profiles[a].ts || 0); }).forEach(function(id) { const option = document.createElement("option"); option.value = id; option.textContent = getProfileLabel(id, profiles[id]) || profiles[id].name || id; customProfileSelectEl.appendChild(option); }); customProfileSelectEl.value = profiles[previousValue] ? previousValue : "__none__"; if (customProfileSelectEl.value === "__none__" && keys.length) customProfileSelectEl.value = keys[0]; if (customProfileStatusEl) customProfileStatusEl.textContent = keys.length + " 套方案"; if (customProfileApplyBtnEl) customProfileApplyBtnEl.disabled = customProfileSelectEl.value === "__none__"; if (customProfileDeleteBtnEl) customProfileDeleteBtnEl.disabled = customProfileSelectEl.value === "__none__"; } function buildCustomProfileBar(onChange) { const container = document.createElement("div"); container.className = "hy-preset-bar"; const label = document.createElement("div"); label.className = "hy-preset-label"; label.textContent = "我的方案"; container.appendChild(label); customProfileStatusEl = document.createElement("span"); customProfileStatusEl.style.fontSize = "var(--hy-fs-l5)"; customProfileStatusEl.style.fontWeight = "400"; customProfileStatusEl.style.color = "var(--hy-text3)"; customProfileStatusEl.style.marginLeft = "4px"; label.appendChild(customProfileStatusEl); const actions = document.createElement("div"); actions.className = "hy-preset-actions hy-profile-actions"; customProfileSelectEl = document.createElement("select"); customProfileSelectEl.className = "hy-profile-select"; customProfileSelectEl.setAttribute("aria-label", "选择方案"); const noneOpt = document.createElement("option"); noneOpt.value = "__none__"; noneOpt.textContent = "无"; customProfileSelectEl.appendChild(noneOpt); actions.appendChild(customProfileSelectEl); customProfileNameInputEl = document.createElement("input"); customProfileNameInputEl.className = "hy-detail-search-input"; customProfileNameInputEl.placeholder = "方案名称"; customProfileNameInputEl.setAttribute("aria-label", "输入方案名称"); actions.appendChild(customProfileNameInputEl); customProfileNameInputEl.addEventListener("keydown", function(ev) { if (ev.key === "Enter" && customProfileNameInputEl.value.trim()) { saveCurrentCustomProfile(onChange); } }); function saveCurrentCustomProfile(changeHandler) { const id = saveCustomProfile(customProfileNameInputEl.value); if (!id) return; customProfileNameInputEl.value = ""; refreshCustomProfileUI(); changeHandler(); } const saveBtn = document.createElement("button"); saveBtn.type = "button"; saveBtn.className = "hy-preset-btn"; saveBtn.textContent = "保存"; saveBtn.addEventListener("click", function() { saveCurrentCustomProfile(onChange); }); actions.appendChild(saveBtn); customProfileApplyBtnEl = document.createElement("button"); customProfileApplyBtnEl.type = "button"; customProfileApplyBtnEl.className = "hy-preset-btn"; customProfileApplyBtnEl.textContent = "应用"; customProfileApplyBtnEl.disabled = true; customProfileApplyBtnEl.addEventListener("click", function() { const selId = customProfileSelectEl.value; if (!selId || selId === "__none__") return; prepareUserChange("应用我的方案"); applyCustomProfile(selId); refreshStats(); refreshRegionRows(); refreshControlBulkState(); refreshControlPresetState(); onChange(); scheduleEffectDetection(); }); actions.appendChild(customProfileApplyBtnEl); customProfileDeleteBtnEl = document.createElement("button"); customProfileDeleteBtnEl.type = "button"; customProfileDeleteBtnEl.className = "hy-preset-btn"; customProfileDeleteBtnEl.textContent = "删除"; customProfileDeleteBtnEl.disabled = true; customProfileDeleteBtnEl.addEventListener("click", function() { const selId = customProfileSelectEl.value; if (!selId || selId === "__none__") return; deleteCustomProfile(selId); customProfileSelectEl.value = "__none__"; refreshCustomProfileUI(); onChange(); }); actions.appendChild(customProfileDeleteBtnEl); customProfileSelectEl.addEventListener("change", function() { if (customProfileStatusEl) { const selId = customProfileSelectEl.value; if (selId && selId !== "__none__") { customProfileStatusEl.textContent = getProfileLabel(selId, getCustomProfiles()[selId]); } else { customProfileStatusEl.textContent = "无方案选中"; } } }); container.appendChild(actions); return container; } // === 15-ui-detail-panels.js === // 15-ui-detail-panels.js 二级面板:设置详情、区域详情、效果工具栏、推荐配置 function buildEntryRow(entry) { const container = document.createElement('div'); container.className = 'hy-setting hy-region-card hy-entry-card'; if (entry.className) container.classList.add(entry.className); const row = document.createElement('div'); row.className = 'hy-row hy-region-row'; row.addEventListener('click', entry.onOpen); const left = document.createElement('div'); left.className = 'hy-rleft'; const name = document.createElement('div'); name.className = 'hy-rname'; name.textContent = entry.name; const status = document.createElement('div'); status.className = 'hy-group-status'; status.textContent = entry.status || ''; left.appendChild(name); left.appendChild(status); row.appendChild(left); const actions = document.createElement('div'); actions.className = 'hy-row-actions'; const detail = document.createElement('button'); detail.type = 'button'; detail.className = 'hy-detail-btn'; detail.textContent = '进入'; detail.addEventListener('click', (e) => { e.stopPropagation(); entry.onOpen(); }); actions.appendChild(detail); row.appendChild(actions); container.appendChild(row); appendDesc(container, entry.desc); return { container, status }; } function refreshRegionBulkState(region) { const refs = regionBulkRefs[region.key]; if (!refs || !refs.input || !refs.input.isConnected) return; const state = getRegionState(region); refs.input.checked = state.all; refs.input.indeterminate = state.partial; if (refs.status) { refs.status.textContent = state.enabled + '/' + state.total + ' 个子控件已开启'; refs.status.style.color = state.enabled > 0 ? 'var(--hy-accent)' : 'var(--hy-text3)'; } } function refreshRegionBulkRows() { CONTROL_BLOCK_REGIONS.forEach(refreshRegionBulkState); } function setRegionControlBlocks(region, enabled) { getRegionChildren(region).forEach(item => { store[item.key] = !!enabled; }); saveStore(); refreshRegionRows(); refreshStats(); } function buildRegionBulkRow(region, onChange) { const container = document.createElement('div'); container.className = 'hy-setting hy-region-bulk'; const row = document.createElement('div'); row.className = 'hy-row'; const left = document.createElement('div'); left.className = 'hy-rleft'; const name = document.createElement('div'); name.className = 'hy-rname'; name.textContent = region.name + '总开关'; const status = document.createElement('div'); status.className = 'hy-group-status'; left.appendChild(name); left.appendChild(status); row.appendChild(left); const label = document.createElement('label'); label.className = 'hy-switch'; const input = document.createElement('input'); input.type = 'checkbox'; const knob = document.createElement('span'); knob.className = 'hy-switch-knob'; label.appendChild(input); label.appendChild(knob); row.appendChild(label); input.addEventListener('change', () => { prepareUserChange(region.name + '总开关'); setRegionControlBlocks(region, input.checked); onChange(); scheduleEffectDetection(); }); container.appendChild(row); appendDesc(container, '一键开启或关闭本区域内所有单个控件,下面仍可逐项微调'); regionBulkRefs[region.key] = { input, status }; refreshRegionBulkState(region); return container; } function getRegionCompactGroups(region) { return COMPACT_CONTROL_GROUPS .filter(group => group.regionKey === region.key) .map(group => ({ ...group, keys: group.keys.filter(key => CONTROL_BLOCK_MAP[key]) })) .filter(group => group.keys.length > 0); } function buildCompactGroupRow(group, onChange) { const container = document.createElement('div'); container.className = 'hy-setting hy-compact-group'; container.dataset.hyCompactGroup = group.key; container.dataset.hyCompactKeys = group.keys.join(','); const row = document.createElement('div'); row.className = 'hy-row'; const left = document.createElement('div'); left.className = 'hy-rleft'; const name = document.createElement('div'); name.className = 'hy-rname'; name.textContent = group.name; const status = document.createElement('div'); status.className = 'hy-group-status'; left.appendChild(name); left.appendChild(status); row.appendChild(left); const label = document.createElement('label'); label.className = 'hy-switch'; const input = document.createElement('input'); input.type = 'checkbox'; const knob = document.createElement('span'); knob.className = 'hy-switch-knob'; label.appendChild(input); label.appendChild(knob); row.appendChild(label); input.addEventListener('change', () => { prepareUserChange(group.name); setCompactGroupBlocks(group, input.checked); onChange(); scheduleEffectDetection(); }); container.appendChild(row); appendDesc(container, group.desc); compactGroupRefs[group.key] = { input, status }; refreshCompactGroupState(group); return container; } function buildControlBulkRow(onChange) { const container = document.createElement('div'); container.className = 'hy-setting hy-control-bulk'; const row = document.createElement('div'); row.className = 'hy-row'; const left = document.createElement('div'); left.className = 'hy-rleft'; const name = document.createElement('div'); name.className = 'hy-rname'; name.textContent = '控件屏蔽总开关'; controlBulkStatusEl = document.createElement('div'); controlBulkStatusEl.className = 'hy-group-status'; left.appendChild(name); left.appendChild(controlBulkStatusEl); row.appendChild(left); const label = document.createElement('label'); label.className = 'hy-switch'; controlBulkInput = document.createElement('input'); controlBulkInput.type = 'checkbox'; const knob = document.createElement('span'); knob.className = 'hy-switch-knob'; label.appendChild(controlBulkInput); label.appendChild(knob); row.appendChild(label); controlBulkInput.addEventListener('change', () => { prepareUserChange('控件屏蔽总开关'); setAllControlBlocks(controlBulkInput.checked); onChange(); scheduleEffectDetection(); }); container.appendChild(row); appendDesc(container, '一键开启或关闭所有单个控件屏蔽,仍可进入二级页面单独微调'); refreshControlBulkState(); return container; } function buildEffectToolBar() { const container = document.createElement('div'); container.className = 'hy-preset-bar hy-effect-tools'; const label = document.createElement('div'); label.className = 'hy-preset-label'; label.textContent = '本页效果'; container.appendChild(label); const actions = document.createElement('div'); actions.className = 'hy-preset-actions'; effectDetectBtnEl = document.createElement('button'); effectDetectBtnEl.type = 'button'; effectDetectBtnEl.className = 'hy-preset-btn'; effectDetectBtnEl.textContent = '检测本页'; effectDetectBtnEl.addEventListener('click', () => detectControlBlockEffects()); actions.appendChild(effectDetectBtnEl); effectPreviewBtnEl = document.createElement('button'); effectPreviewBtnEl.type = 'button'; effectPreviewBtnEl.className = 'hy-preset-btn'; effectPreviewBtnEl.textContent = '预览命中'; effectPreviewBtnEl.addEventListener('click', previewMatchedControlEffects); actions.appendChild(effectPreviewBtnEl); effectStatusEl = document.createElement('span'); effectStatusEl.className = 'hy-effect-note'; actions.appendChild(effectStatusEl); undoBtnEl = document.createElement('button'); undoBtnEl.type = 'button'; undoBtnEl.className = 'hy-preset-btn'; undoBtnEl.textContent = '撤销上次'; undoBtnEl.addEventListener('click', restoreLastUndoSnapshot); actions.appendChild(undoBtnEl); undoStatusEl = document.createElement('span'); undoStatusEl.className = 'hy-effect-note'; actions.appendChild(undoStatusEl); container.appendChild(actions); refreshEffectStatusUI(); return container; } function buildControlPresetBar(onChange) { return document.createElement('div'); } function buildExperienceModeBar(onChange) { return document.createElement('div'); } function buildCleanGroupRow(group, onChange) { const container = document.createElement('div'); container.className = 'hy-setting hy-clean-group'; container.dataset.hyCleanGroup = group.key; container.dataset.hyCleanKeys = getCleanGroupKeys(group).join(','); const row = document.createElement('div'); row.className = 'hy-row'; const left = document.createElement('div'); left.className = 'hy-rleft'; const name = document.createElement('div'); name.className = 'hy-rname'; name.textContent = group.name; const status = document.createElement('div'); status.className = 'hy-group-status'; left.appendChild(name); left.appendChild(status); row.appendChild(left); const label = document.createElement('label'); label.className = 'hy-switch'; const input = document.createElement('input'); input.type = 'checkbox'; const knob = document.createElement('span'); knob.className = 'hy-switch-knob'; label.appendChild(input); label.appendChild(knob); row.appendChild(label); input.addEventListener('change', () => { prepareUserChange(group.name); setCleanGroupBlocks(group, input.checked); onChange(); scheduleEffectDetection(); }); container.appendChild(row); appendDesc(container, group.desc); cleanGroupRefs[group.key] = { input, status }; refreshCleanGroupState(group); return container; } function buildCleanViewPanel(onChange) { cleanBlockListEl = document.createElement('div'); return cleanBlockListEl; } function buildProControlPanel(onChange) { const container = document.createElement('div'); container.className = 'hy-list hy-control-list hy-pro-control-list'; proBlockListEl = container; container.appendChild(buildControlBulkRow(onChange)); container.appendChild(buildCustomProfileBar(onChange)); // 推荐配置已从一级页面移除,用户按区域手动控制 // container.appendChild(buildControlPresetBar(onChange)); const regionGrid = document.createElement('div'); regionGrid.className = 'hy-region-grid'; CONTROL_BLOCK_REGIONS.forEach(region => { regionGrid.appendChild(buildRegionRow(region, onChange)); }); container.appendChild(regionGrid); return container; } function showMainView() { if (mainViewEl) mainViewEl.classList.remove('hy-hidden'); if (detailViewEl) detailViewEl.classList.add('hy-hidden'); detailEscapeHandler = null; if (panelTitleEl) panelTitleEl.textContent = 'My-虎牙优化'; closeAllDDs(); refreshRegionRows(); refreshStats(); } function openSettingsDetail(onChange) { if (!mainViewEl || !detailViewEl) return; closeAllDDs(); mainViewEl.classList.add('hy-hidden'); detailViewEl.classList.remove('hy-hidden'); if (panelTitleEl) panelTitleEl.textContent = '功能设置'; while (detailViewEl.firstChild) detailViewEl.removeChild(detailViewEl.firstChild); const head = document.createElement('div'); head.className = 'hy-subview-head'; const back = document.createElement('button'); back.type = 'button'; back.className = 'hy-back-btn'; back.textContent = '返回'; back.addEventListener('click', showMainView); const title = document.createElement('div'); title.className = 'hy-subview-title'; title.textContent = '功能设置'; head.appendChild(back); head.appendChild(title); detailViewEl.appendChild(head); const section = document.createElement('div'); section.className = 'hy-section hy-settings-detail'; appendDesc(section, '管理脚本启用、进房显示、画质和加载修复'); const list = document.createElement('div'); list.className = 'hy-list'; SETTINGS.forEach(item => { if (item.type === 'switch') list.appendChild(buildSwitchRow(item, onChange)); if (item.type === 'dropdown') list.appendChild(buildDropdownRow(item, onChange)); if (item.type === 'quality') list.appendChild(buildQualityRow(item, onChange)); }); list.appendChild(buildSecretSwitchRow(onChange)); section.appendChild(list); detailViewEl.appendChild(section); detailEscapeHandler = () => { showMainView(); return true; }; refreshPanelStateFromStore(); } function openRegionDetail(region, onChange) { closeAllDDs(); mainViewEl.classList.add('hy-hidden'); detailViewEl.classList.remove('hy-hidden'); if (panelTitleEl) panelTitleEl.textContent = '控件屏蔽'; while (detailViewEl.firstChild) detailViewEl.removeChild(detailViewEl.firstChild); const head = document.createElement('div'); head.className = 'hy-subview-head'; const back = document.createElement('button'); back.type = 'button'; back.className = 'hy-back-btn'; back.textContent = '返回'; back.addEventListener('click', showMainView); const title = document.createElement('div'); title.className = 'hy-subview-title'; title.textContent = region.name; head.appendChild(back); head.appendChild(title); detailViewEl.appendChild(head); const section = document.createElement('div'); section.className = 'hy-section'; appendDesc(section, region.desc); const children = getRegionChildren(region); const filterBar = document.createElement('div'); filterBar.className = 'hy-detail-filter'; const filterInput = document.createElement('input'); filterInput.type = 'search'; filterInput.className = 'hy-detail-search-input'; filterInput.placeholder = '搜索名称或 key'; filterInput.setAttribute('aria-label', '搜索控件'); filterBar.appendChild(filterInput); const jumpSelect = document.createElement('select'); jumpSelect.className = 'hy-detail-jump-select'; jumpSelect.setAttribute('aria-label', '跳转到控件'); const jumpPlaceholder = document.createElement('option'); jumpPlaceholder.value = ''; jumpPlaceholder.textContent = '跳转到控件'; jumpSelect.appendChild(jumpPlaceholder); children.forEach(item => { const option = document.createElement('option'); option.value = item.key; option.textContent = item.name; jumpSelect.appendChild(option); }); filterBar.appendChild(jumpSelect); const enabledOnlyLabel = document.createElement('label'); enabledOnlyLabel.className = 'hy-detail-enabled-only'; const enabledOnlyInput = document.createElement('input'); enabledOnlyInput.type = 'checkbox'; enabledOnlyInput.className = 'hy-detail-enabled-only-input'; enabledOnlyInput.setAttribute('aria-label', '只看已开启控件'); const enabledOnlyText = document.createElement('span'); enabledOnlyText.textContent = '只看已开启'; enabledOnlyLabel.appendChild(enabledOnlyInput); enabledOnlyLabel.appendChild(enabledOnlyText); filterBar.appendChild(enabledOnlyLabel); const advancedLabel = document.createElement('label'); advancedLabel.className = 'hy-detail-enabled-only hy-detail-advanced-toggle'; const advancedInput = document.createElement('input'); advancedInput.type = 'checkbox'; advancedInput.className = 'hy-detail-advanced-input'; advancedInput.setAttribute('aria-label', '显示高级控件'); const advancedText = document.createElement('span'); advancedText.textContent = '显示高级'; advancedLabel.appendChild(advancedInput); advancedLabel.appendChild(advancedText); filterBar.appendChild(advancedLabel); section.appendChild(filterBar); const list = document.createElement('div'); list.className = 'hy-list'; list.appendChild(buildRegionBulkRow(region, () => { onChange(); applyDetailFilter(); })); const compactGroups = getRegionCompactGroups(region); const compactCoveredKeys = new Set(compactGroups.flatMap(group => group.keys)); if (compactGroups.length) { const compactList = document.createElement('div'); compactList.className = 'hy-compact-group-list'; compactGroups.forEach(group => { compactList.appendChild(buildCompactGroupRow(group, () => { onChange(); applyDetailFilter(); })); }); list.appendChild(compactList); } const childRows = children.map(item => { const row = buildSwitchRow(item, () => { onChange(); refreshRegionRows(); applyDetailFilter(); }); row.dataset.hySearchText = [item.name, item.key].join(' ').toLowerCase(); list.appendChild(row); return { item, row }; }); const empty = document.createElement('div'); empty.className = 'hy-detail-empty'; empty.textContent = '没有匹配的控件'; list.appendChild(empty); function applyDetailFilter() { const query = filterInput.value.trim().toLowerCase(); const enabledOnly = enabledOnlyInput.checked; const showAdvanced = advancedInput.checked; let visible = 0; childRows.forEach(({ item, row }) => { const matchedQuery = !query || row.dataset.hySearchText.includes(query); const matchedEnabled = !enabledOnly || !!getVal(item.key, item.def === undefined ? false : item.def); const isAdvanced = isAdvancedControlBlock(item); const activeAdvanced = isAdvanced && !!getVal(item.key, item.def === undefined ? false : item.def) && !compactCoveredKeys.has(item.key); const matchedAdvanced = showAdvanced || query || enabledOnly || !isAdvanced || activeAdvanced; const matched = matchedQuery && matchedEnabled && matchedAdvanced; row.classList.toggle('hy-filter-hidden', !matched); if (matched) visible += 1; }); empty.classList.toggle('hy-detail-empty-on', (query || enabledOnly || showAdvanced) && visible === 0); } filterInput.addEventListener('input', applyDetailFilter); enabledOnlyInput.addEventListener('change', applyDetailFilter); advancedInput.addEventListener('change', applyDetailFilter); jumpSelect.addEventListener('change', () => { const targetKey = jumpSelect.value; jumpSelect.value = ''; const target = childRows.find(({ item }) => item.key === targetKey); if (!target) return; filterInput.value = ''; enabledOnlyInput.checked = false; if (isAdvancedControlBlock(target.item)) advancedInput.checked = true; applyDetailFilter(); target.row.tabIndex = -1; try { target.row.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'smooth' }); } catch (err) { target.row.scrollIntoView(); } try { target.row.focus({ preventScroll: true }); } catch (err) { target.row.focus(); } target.row.classList.add('hy-detail-jump-target'); setTimeout(() => { target.row.classList.remove('hy-detail-jump-target'); }, TIMING.DETAIL_SCROLL_MS); }); section.appendChild(list); detailViewEl.appendChild(section); detailEscapeHandler = () => { const hasQuery = filterInput.value.trim() !== ''; if (hasQuery) { filterInput.value = ''; applyDetailFilter(); return true; } if (enabledOnlyInput.checked) { enabledOnlyInput.checked = false; applyDetailFilter(); return true; } if (advancedInput.checked) { advancedInput.checked = false; applyDetailFilter(); return true; } showMainView(); return true; }; const focusSearch = () => { try { filterInput.focus({ preventScroll: true }); } catch (err) { filterInput.focus(); } }; if (typeof requestAnimationFrame === 'function') requestAnimationFrame(focusSearch); else setTimeout(focusSearch, 0); applyDetailFilter(); } function buildRegionRow(region, onChange) { const container = document.createElement('div'); container.className = 'hy-setting hy-region-card'; const row = document.createElement('div'); row.className = 'hy-row hy-region-row'; row.addEventListener('click', () => openRegionDetail(region, onChange)); const left = document.createElement('div'); left.className = 'hy-rleft'; const name = document.createElement('div'); name.className = 'hy-rname'; name.textContent = region.name; const status = document.createElement('div'); status.className = 'hy-group-status'; left.appendChild(name); left.appendChild(status); row.appendChild(left); const actions = document.createElement('div'); actions.className = 'hy-row-actions'; const detail = document.createElement('button'); detail.type = 'button'; detail.className = 'hy-detail-btn'; detail.textContent = '进入'; detail.addEventListener('click', (e) => { e.stopPropagation(); openRegionDetail(region, onChange); }); actions.appendChild(detail); row.appendChild(actions); container.appendChild(row); appendDesc(container, region.desc); regionRowRefs[region.key] = { status }; updateRegionRow(region); return container; } let qualityDDEl = null; let qualityTxtEl = null; let qualityMenuEl = null; function buildQualityRow(item, onChange) { const container = document.createElement('div'); container.className = 'hy-setting'; container.id = 'hy-quality-row'; const row = document.createElement('div'); row.className = 'hy-row'; const left = document.createElement('div'); left.className = 'hy-rleft'; const name = document.createElement('div'); name.className = 'hy-rname'; name.textContent = item.name; left.appendChild(name); row.appendChild(left); qualityDDEl = document.createElement('div'); qualityDDEl.className = 'hy-dd'; const sel = document.createElement('div'); sel.className = 'hy-dd-sel'; qualityTxtEl = document.createElement('span'); qualityTxtEl.className = 'hy-dd-text'; qualityTxtEl.textContent = getVal('quality_mode', 'off') === 'off' ? '不切换' : '自动最高可用'; const arrow = document.createElement('span'); arrow.className = 'hy-dd-arrow'; arrow.textContent = '▼'; sel.appendChild(qualityTxtEl); sel.appendChild(arrow); qualityDDEl.appendChild(sel); qualityMenuEl = document.createElement('div'); qualityMenuEl.className = 'hy-dd-menu'; qualityDDEl.appendChild(qualityMenuEl); addQualityBaseOptions(onChange); sel.addEventListener('click', (e) => { e.stopPropagation(); const wasOpen = qualityDDEl.classList.contains('hy-dd-open'); closeAllDDs(); updateQualityOptions(); if (!wasOpen) qualityDDEl.classList.add('hy-dd-open'); }); row.appendChild(qualityDDEl); container.appendChild(row); appendDesc(container, item.desc); return container; } function addQualityBaseOptions(onChange) { const currentVal = getVal('quality_mode', 'off'); const optEl = document.createElement('div'); optEl.className = 'hy-dd-opt'; if (currentVal === 'off') optEl.classList.add('hy-dd-opt-on'); optEl.textContent = '不切换'; optEl.dataset.value = 'off'; optEl.addEventListener('click', (e) => { e.stopPropagation(); if (getVal('quality_mode', 'off') !== 'off') prepareUserChange('画质选择'); setVal('quality_mode', 'off'); qualityMenuEl.querySelectorAll('.hy-dd-opt').forEach(o => o.classList.remove('hy-dd-opt-on')); optEl.classList.add('hy-dd-opt-on'); qualityTxtEl.textContent = '不切换'; qualityDDEl.classList.remove('hy-dd-open'); resetRoomState(); onChange(); }); qualityMenuEl.appendChild(optEl); const autoEl = document.createElement('div'); autoEl.className = 'hy-dd-opt'; if (currentVal === 'highest') autoEl.classList.add('hy-dd-opt-on'); autoEl.textContent = '自动最高可用'; autoEl.dataset.value = 'highest'; autoEl.addEventListener('click', (e) => { e.stopPropagation(); if (getVal('quality_mode', 'off') !== 'highest') prepareUserChange('画质选择'); setVal('quality_mode', 'highest'); qualityMenuEl.querySelectorAll('.hy-dd-opt').forEach(o => o.classList.remove('hy-dd-opt-on')); autoEl.classList.add('hy-dd-opt-on'); qualityTxtEl.textContent = '自动最高可用'; qualityDDEl.classList.remove('hy-dd-open'); resetQualityRoomState(); refreshStats(); scheduleApplyAll(); scheduleEffectDetection(); }); qualityMenuEl.appendChild(autoEl); } function updateQualityOptions() { if (!qualityMenuEl || !qualityTxtEl) return; qualityMenuEl.querySelectorAll('.hy-dd-opt').forEach(optEl => optEl.classList.remove('hy-dd-opt-on')); const baseOpt = qualityMenuEl.querySelector('.hy-dd-opt[data-value="' + getVal('quality_mode', 'off') + '"]'); if (baseOpt) baseOpt.classList.add('hy-dd-opt-on'); const qualities = QualityUnlocker.detectQualities(); qualityMenuEl.querySelectorAll('[data-value^="q_"]').forEach(el => el.remove()); const currentVal = getVal('quality_mode', 'off'); if (qualities.length === 0) { if (currentVal === 'off') qualityTxtEl.textContent = '不切换'; if (currentVal !== 'off') { qualityTxtEl.textContent = currentVal === 'highest' ? '自动最高可用' : '检测中...'; } return; } const highest = qualities.find(q => !q.isLocked); qualities.forEach(q => { const optEl = document.createElement('div'); optEl.className = 'hy-dd-opt'; optEl.dataset.value = q.value; optEl.textContent = q.label + (q.isLocked ? ' [扫码]' : ''); if (q.isLocked) { optEl.style.color = 'var(--hy-text3)'; optEl.style.fontStyle = 'italic'; } if (currentVal === q.value) optEl.classList.add('hy-dd-opt-on'); optEl.addEventListener('click', (e) => { e.stopPropagation(); if (getVal('quality_mode', 'off') !== q.value) prepareUserChange('画质选择'); setVal('quality_mode', q.value); qualityMenuEl.querySelectorAll('.hy-dd-opt').forEach(o => o.classList.remove('hy-dd-opt-on')); optEl.classList.add('hy-dd-opt-on'); qualityTxtEl.textContent = q.label + (q.isLocked ? ' [扫码]' : ''); qualityDDEl.classList.remove('hy-dd-open'); if (q.isLocked) QualityUnlocker.unlockAll(); setTimeout(() => QualityUnlocker.clickQuality(q), 0); resetQualityRoomState(); refreshStats(); scheduleApplyAll(); scheduleEffectDetection(); }); qualityMenuEl.appendChild(optEl); }); if (currentVal === 'off') { qualityTxtEl.textContent = '不切换'; return; } if (currentVal === 'highest') { qualityTxtEl.textContent = highest ? '自动最高可用: ' + highest.label : '自动最高可用'; return; } const selected = qualities.find(q => q.value === currentVal); if (selected) { qualityTxtEl.textContent = selected.label + (selected.isLocked ? ' [扫码]' : ''); } } function resetQualityRoomState() { Object.keys(roomFlags).forEach(key => { if (key.indexOf('_ql_') === 0) delete roomFlags[key]; }); } function appendDesc(container, text) { if (!text) return; const desc = document.createElement('div'); desc.className = 'hy-desc-line'; desc.textContent = text; container.appendChild(desc); } // === 16-quality-unlocker.js === // 16-quality-unlocker.js 画质解锁器 const QualityUnlocker = (() => { let listObserver = null; let initObserver = null; let pollTimer = null; let jqTimer = null; let onListChange = null; let waiting = false; let ready = false; let polling = false; function doubleRAF(fn) { requestAnimationFrame(() => requestAnimationFrame(fn)); } function getVideoTypeList() { const $ = getJQ(); if (!$) return null; const $list = $('#player-ctrl-wrap .player-videotype-list'); return $list.length ? $list : null; } function unlockAll() { try { const $ = getJQ(); const $list = getVideoTypeList(); if (!$ || !$list) return; $list.children(':has(.bitrate-right-btn.common-enjoy-btn)').each((i, el) => { const data = $(el).data('data'); if (data && typeof data === 'object' && 'status' in data) data.status = 0; }); if (onListChange) onListChange(); } catch (err) { console.warn('[HY] unlockAll error:', err); } } function detectQualities() { try { const $list = getVideoTypeList(); if (!$list) return []; const qualities = []; $list.children().each((i, li) => { if (li.nodeType !== 1) return; const span = li.querySelector('span'); const text = (span ? span.textContent : li.textContent).trim(); if (!text) return; const isLocked = li.querySelector('.bitrate-right-btn.common-enjoy-btn') !== null; qualities.push({ value: 'q_' + i, label: text, isLocked, li, rank: getQualityRank(text), sourceIndex: i }); }); qualities.sort((a, b) => { if (b.rank !== a.rank) return b.rank - a.rank; return a.sourceIndex - b.sourceIndex; }); return qualities; } catch (err) { return []; } } function getQualityRank(label) { const text = String(label || '').toLowerCase(); let rank = 0; const resolution = text.match(/(\d+(?:\.\d+)?)\s*k/); if (resolution) rank += Number(resolution[1]) * 1000; const bitrate = text.match(/(\d+)\s*m/); if (bitrate) rank += Number(bitrate[1]) * 20; if (/hdr/.test(text)) rank += 800; if (/原画|蓝光/.test(text)) rank += 700; if (/超清/.test(text)) rank += 500; if (/高清/.test(text)) rank += 300; if (/标清/.test(text)) rank += 100; if (/流畅/.test(text)) rank += 50; return rank; } function clickQuality(option) { try { const $ = getJQ(); const $list = getVideoTypeList(); if (!$ || !$list || !option) return; let targetLi = option.li && option.li.isConnected ? option.li : null; if (!targetLi) { $list.children().each((i, li) => { if (li.nodeType !== 1) return; const span = li.querySelector('span'); const text = (span ? span.textContent : li.textContent).trim(); if (text === option.label) { targetLi = li; return false; } }); } if (!targetLi || !targetLi.isConnected) return; const data = $(targetLi).data('data'); if (data && typeof data === 'object' && 'status' in data) data.status = 0; doubleRAF(() => { if (targetLi.isConnected) targetLi.click(); }); } catch (err) { console.warn('[HY] clickQuality error:', err); } } function setupListObserver() { try { const $list = getVideoTypeList(); if (!$list) { waitForJQuery(); return; } if (listObserver) listObserver.disconnect(); ready = true; waiting = false; polling = false; if (pollTimer) { clearTimeout(pollTimer); pollTimer = null; } if (initObserver) { initObserver.disconnect(); initObserver = null; } const syncList = () => { if (isScriptEnabled() && getVal('quality_mode', 'off') !== 'off') unlockAll(); else if (onListChange) onListChange(); }; listObserver = new MutationObserver(syncList); listObserver.observe($list[0], { childList: true, subtree: true, attributes: true, attributeFilter: ['class', 'data-status'] }); syncList(); updateQualityOptions(); } catch (err) { console.warn('[HY] setupListObserver error:', err); } } function waitForJQuery() { if (jqTimer) return; let count = 0; jqTimer = setInterval(() => { count += 1; if (getJQ()) { clearInterval(jqTimer); jqTimer = null; setupListObserver(); } else if (count >= 60) { clearInterval(jqTimer); jqTimer = null; } }, 500); } function waitForPlayer() { if (ready || waiting) return; waiting = true; if (document.getElementById('player-ctrl-wrap')) { setupListObserver(); return; } if (!document.body) { document.addEventListener('DOMContentLoaded', () => { waiting = false; waitForPlayer(); }, { once: true }); return; } if (initObserver) initObserver.disconnect(); initObserver = new MutationObserver(() => { if (document.getElementById('player-ctrl-wrap')) setupListObserver(); }); initObserver.observe(document.body, { childList: true, subtree: true }); pollTimer = setTimeout(() => { pollTimer = null; if (ready) return; if (document.getElementById('player-ctrl-wrap')) { setupListObserver(); return; } if (polling) return; polling = true; if (initObserver) { initObserver.disconnect(); initObserver = null; } const poll = setInterval(() => { if (document.getElementById('player-ctrl-wrap')) { clearInterval(poll); polling = false; setupListObserver(); } }, 1000); setTimeout(() => { clearInterval(poll); polling = false; waiting = false; }, 30000); }, 10000); } function stop() { waiting = false; ready = false; polling = false; if (listObserver) { listObserver.disconnect(); listObserver = null; } if (initObserver) { initObserver.disconnect(); initObserver = null; } if (pollTimer) { clearTimeout(pollTimer); pollTimer = null; } if (jqTimer) { clearInterval(jqTimer); jqTimer = null; } } return { waitForPlayer, stop, detectQualities, clickQuality, unlockAll, set onListChange(fn) { onListChange = fn; } }; })(); // === 17-ui-panel.js === // 17-ui-panel.js 主面板创建和管理 function centerPanel() { if (!panel) return; const width = Math.min(720, Math.max(360, window.innerWidth - 40)); const height = Math.min(540, Math.max(320, window.innerHeight - 40)); panel.style.left = Math.max(0, (window.innerWidth - width) / 2) + 'px'; panel.style.top = Math.max(0, (window.innerHeight - height) / 2) + 'px'; } function openPanel() { if (!panel) createUI(); if (!panel) return; centerPanel(); panel.classList.remove('hy-hidden'); if (isScriptEnabled()) QualityUnlocker.waitForPlayer(); updateQualityOptions(); showMainView(); scheduleEffectDetection(120); } function closePanel() { if (!panel) return; panel.classList.add('hy-hidden'); closeAllDDs(); showMainView(); } function createUI() { panel = document.createElement('div'); panel.id = 'hy-panel'; panel.className = 'hy-hidden'; panel.setAttribute('data-theme', theme); const header = document.createElement('div'); header.className = 'hy-hdr'; panelTitleEl = document.createElement('span'); panelTitleEl.textContent = 'My-虎牙优化'; const close = document.createElement('span'); close.className = 'hy-x'; close.textContent = '×'; close.addEventListener('click', closePanel); header.appendChild(panelTitleEl); header.appendChild(close); panel.appendChild(header); header.addEventListener('mousedown', (e) => { if (e.target === close) return; e.preventDefault(); const rect = panel.getBoundingClientRect(); const offsetX = e.clientX - rect.left; const offsetY = e.clientY - rect.top; panel.style.transition = 'none'; function move(ev) { const nextX = Math.max(0, Math.min(window.innerWidth - rect.width, ev.clientX - offsetX)); const nextY = Math.max(0, Math.min(window.innerHeight - rect.height, ev.clientY - offsetY)); panel.style.left = nextX + 'px'; panel.style.top = nextY + 'px'; } function up() { document.removeEventListener('mousemove', move); document.removeEventListener('mouseup', up); panel.style.transition = ''; } document.addEventListener('mousemove', move); document.addEventListener('mouseup', up); }); const body = document.createElement('div'); body.className = 'hy-body'; const contentWrap = document.createElement('div'); contentWrap.className = 'hy-content-wrap'; contentWrap.classList.add('hy-main-view'); mainViewEl = contentWrap; contentWrap.addEventListener('scroll', closeAllDDs); const dashboard = document.createElement('div'); dashboard.className = 'hy-dashboard'; const createStatCard = (labelText) => { const card = document.createElement('div'); card.className = 'hy-stat-card'; const label = document.createElement('div'); label.className = 'hy-stat-label'; label.textContent = labelText; const value = document.createElement('div'); value.className = 'hy-stat-value'; card.appendChild(label); card.appendChild(value); dashboard.appendChild(card); return { card, value }; }; const statusStat = createStatCard('脚本状态'); const settingsStat = createStatCard('基础设置'); const blocksStat = createStatCard('控件屏蔽'); const effectStat = createStatCard('本页效果'); statusPillEl = statusStat.value; settingsPillEl = settingsStat.value; blocksPillEl = blocksStat.value; effectPillEl = effectStat.value; contentWrap.appendChild(dashboard); const section = document.createElement('div'); section.className = 'hy-section'; const sectionHead = document.createElement('div'); sectionHead.className = 'hy-section-head'; const sectionTitle = document.createElement('div'); sectionTitle.className = 'hy-section-title'; sectionTitle.textContent = '功能设置'; sectionHead.appendChild(sectionTitle); section.appendChild(sectionHead); const onChange = () => { refreshStats(); scheduleApplyAll(); scheduleEffectDetection(); }; const settingsEntry = buildEntryRow({ name: '功能设置', status: '显示模式、画质和加载修复', desc: '管理观看方式、画质和加载状态', className: 'hy-settings-entry', onOpen: () => openSettingsDetail(onChange) }); settingsEntryStatusEl = settingsEntry.status; section.appendChild(settingsEntry.container); contentWrap.appendChild(section); const blockSection = document.createElement('div'); blockSection.className = 'hy-section'; const blockHead = document.createElement('div'); blockHead.className = 'hy-section-head'; const blockTitle = document.createElement('div'); blockTitle.className = 'hy-section-title'; blockTitle.textContent = '控件屏蔽'; blockHead.appendChild(blockTitle); blockSection.appendChild(blockHead); const blockList = document.createElement('div'); blockList.className = 'hy-control-mode-wrap'; blockList.appendChild(buildEffectToolBar()); blockList.appendChild(buildProControlPanel(onChange)); blockSection.appendChild(blockList); contentWrap.appendChild(blockSection); body.appendChild(contentWrap); detailViewEl = document.createElement('div'); detailViewEl.className = 'hy-content-wrap hy-detail-view hy-hidden'; detailViewEl.addEventListener('scroll', closeAllDDs); body.appendChild(detailViewEl); panel.appendChild(body); const footer = document.createElement('div'); footer.className = 'hy-footer'; footer.textContent = VERSION; panel.appendChild(footer); if (!document.body) return; document.body.appendChild(panel); document.addEventListener('keydown', (e) => { if (e.key !== 'Escape' || panel.classList.contains('hy-hidden')) return; if (detailViewEl && !detailViewEl.classList.contains('hy-hidden') && typeof detailEscapeHandler === 'function') { e.preventDefault(); e.stopPropagation(); detailEscapeHandler(); return; } closePanel(); }); refreshStats(); centerPanel(); } function refreshStats() { const changedBase = SETTINGS.filter(item => getVal(item.key, item.def) !== item.def).length; const changedBlocks = PUBLIC_CONTROL_BLOCKS.filter(item => getVal(item.key, false)).length; const running = isScriptEnabled(); if (statusPillEl) { statusPillEl.textContent = running ? '运行中' : '已暂停'; statusPillEl.parentElement.classList.toggle('hy-stat-card-on', running); } if (settingsPillEl) { settingsPillEl.textContent = changedBase + '/' + SETTINGS.length; settingsPillEl.parentElement.classList.toggle('hy-stat-card-on', changedBase > 0); } if (settingsEntryStatusEl) { settingsEntryStatusEl.textContent = changedBase + '/' + SETTINGS.length + ' 项基础设置已调整'; settingsEntryStatusEl.style.color = changedBase > 0 ? 'var(--hy-accent)' : 'var(--hy-text3)'; } if (blocksPillEl) { blocksPillEl.textContent = changedBlocks + '/' + PUBLIC_CONTROL_BLOCKS.length; blocksPillEl.parentElement.classList.toggle('hy-stat-card-on', changedBlocks > 0); } refreshEffectStatusUI(); } // === 18-control-blocks.js === // 18-control-blocks.js 控件注册表(104个公开控件+3个内部控件) const CONTROL_BLOCKS = [ { key: 'block_header_nav', name:__hyB64('5bGP6JS96aG26YOo5a+86Iiq'), selectors: [__hyB64('I2R1eWEtaGVhZGVy'), __hyB64('LmR1eWEtaGVhZGVy')] }, { key: 'block_header_nav_links', name:__hyB64('5bGP6JS96aG26YOo6aKR6YGT5a+86Iiq'), selectors: [__hyB64('I0pfZHV5YUhlYWRlck5hdg=='), __hyB64('LmR1eWEtaGVhZGVyLW5hdg=='), __hyB64('LmR1eWEtaGVhZGVyLW1lbnU='), __hyB64('LmR1eWEtbmF2'), __hyB64('LmR1eWEtbmF2LWxpbms=')] }, { key: 'block_header_nav_home', name:__hyB64('5bGP6JS96aG26YOo6aaW6aG15YWl5Y+j'), selectors: [__hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9uYXZfaG9tZSJd')] }, { key: 'block_header_nav_live', name:__hyB64('5bGP6JS96aG26YOo55u05pKt5YWl5Y+j'), selectors: [__hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9uYXZfbGl2ZSJd')] }, { key: 'block_header_nav_category', name:__hyB64('5bGP6JS96aG26YOo5YiG57G75YWl5Y+j'), selectors: [__hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9uYXZfY2F0ZWdvcnkiXQ==')] }, { key: 'block_header_nav_match', name:__hyB64('5bGP6JS96aG26YOo6LWb5LqL5YWl5Y+j'), selectors: [__hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9uYXZfbWF0Y2giXQ==')] }, { key: 'block_header_nav_video', name:__hyB64('5bGP6JS96aG26YOo6KeG6aKR5YWl5Y+j'), selectors: [__hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9uYXZfdmlkZW8iXQ==')] }, { key: 'block_header_nav_game', name:__hyB64('5bGP6JS96aG26YOo5ri45oiP5YWl5Y+j'), selectors: [__hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9uYXZfZ2FtZSJd')] }, { key: 'block_header_nav_trade', name:__hyB64('5bGP6JS96aG26YOo5ri45oiP5Y2W5Y+35YWl5Y+j'), selectors: [__hyB64('I0pfaHlIZE5hdkl0ZW1TaG9w'), __hyB64('Lmh5LW5hdi1pdGVtLXNob3A='), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9uYXZfdHJhZGUiXQ==')] }, { key: 'block_top_banners', name:__hyB64('5bGP6JS96aG26YOo5rS75Yqo'), selectors: [ __hyB64('I0pfcm9vbUdnVG9w'), __hyB64('LnJvb20tbW9kLWdnVG9w'), __hyB64('LnJvb20tZ2ctdG9w'), __hyB64('I3Jvb20taGQtYmFubmVy'), __hyB64('LnJvb20taGQtYmFubmVy'), __hyB64('W2NsYXNzKj0icm9vbUJhbm5lckluZm8iXQ=='), __hyB64('W2NsYXNzKj0iYmFubmVyTGlzdCJd'), __hyB64('W2NsYXNzKj0iYmFubmVySXRlbSJd') ] }, { key: 'block_anchor_extras', name:__hyB64('5bGP6JS95Li75pKt6ZmE5Yqg5L+h5oGv'), selectors: [ __hyB64('LnN1YnNjcmliZS1lbnRyYW5jZQ=='), __hyB64('I3l5bGl2ZVJrX2dhbWVfbmV3c0J1dA=='), __hyB64('I0pfcm9vbUhkSG9zdEx2SWNvbg=='), __hyB64('LmFuY2hvci1sZXZlbC1pY29u'), __hyB64('I0pfcm9vbUhvdXJSYW5r'), __hyB64('I0pfcm9vbUZhbnNSYW5r'), __hyB64('LnJvb20taG91ci1yYW5r'), __hyB64('LnJvb20tZmFucy1yYW5r') ] }, { key: 'block_sidebar_rank', name:__hyB64('5bGP6JS95Y+z5L6n5qac5Y2V'), selectors: [ __hyB64('I0pfcm9vbVNpZGVIZA=='), __hyB64('I0pfcm9vbVdlZWtseVJhbmtMaXN0'), __hyB64('I0pfcm9vbVdlZWtseVJhbmtMaXN0Um9vdA=='), __hyB64('LnJvb20td2Vla2x5UmFua0xpc3Q='), __hyB64('LnJvb20td2Vla2x5UmFua0xpc3QtY29udGVudA=='), __hyB64('W2NsYXNzKj0iUmFua05hYm9iIl0='), __hyB64('W2NsYXNzKj0icmFuay1pdGVtLS0iXQ==') ] }, { key: 'block_player_danmu', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5by55bmV'), hideMode: 'transparent', selectors: [__hyB64('I2Rhbm11d3JhcA=='), __hyB64('I2Rhbm11ZGl2'), __hyB64('I2Rhbm11ZGl2Mg=='), __hyB64('LmRhbm11LWl0ZW0=')] }, { key: 'block_gift_activity', name:__hyB64('5bGP6JS956S854mp5rS75Yqo5qCP'), selectors: [ __hyB64('I3BsYXllci1naWZ0LXdyYXA='), __hyB64('LnJvb20tcGxheWVyLWdpZnQtcGxhY2Vob2xkZXI='), __hyB64('LnBsYXllci1naWZ0LWxlZnQ='), __hyB64('LnBsYXllci1naWZ0LXJpZ2h0'), __hyB64('LnBsYXllci1ib3gtaWNvbg=='), __hyB64('LnBsYXllci1jaGVzdC1idG4='), __hyB64('LmRpeS1hY3Rpdml0eS1pY29u'), __hyB64('LmRpeS1hY3Rpdml0eS1pY29uLWJveA=='), __hyB64('W2lkXj0iZGl5LWFjdGl2aXR5LWljb24tIl0=') ] }, { key: 'block_player_tips', name:__hyB64('5bGP6JS95o+Q56S65LiO5YaX5L2Z5oyJ6ZKu'), selectors: [ __hyB64('I3BsYXllci1sb2dpbi1ndWlkZS10aXA='), __hyB64('LnBsYXllci1sb2dpbi1ndWlkZS1jbG9zZQ=='), __hyB64('LnBsYXllci1sb2dpbi1ndWlkZS10ZXh0'), __hyB64('LnBsYXllci1yZXBvcnQtYnRu'), __hyB64('LnBsYXllci1yZWZyZXNoLWJ0bg=='), __hyB64('LnBsYXllci1kb3dubG9hZC10aXBz'), __hyB64('LnBsYXllci1hcHAtZ3VpZGU='), __hyB64('W2NsYXNzKj0ibG9naW4tZ3VpZGUiXQ=='), __hyB64('W2NsYXNzKj0iTG9naW5HdWlkZSJd') ] }, { key: 'block_header_search', name:__hyB64('5bGP6JS96aG26YOo5pCc57Si'), selectors: [__hyB64('I0pfZHV5YUhkU2VhcmNo'), __hyB64('LmR1eWEtaGVhZGVyLXNlYXJjaA==')] }, { key: 'block_header_actions', name:__hyB64('5bGP6JS96aG26YOo5YWl5Y+j5oyJ6ZKu'), selectors: [__hyB64('I0pfZHV5YUhlYWRlclJpZ2h0'), __hyB64('LmR1eWEtaGVhZGVyLXJpZ2h0')] }, { key: 'block_header_game_promo', name:__hyB64('5bGP6JS96aG26YOo5ri45oiP5o6o5bm/'), selectors: [ __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdklnLS0iXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcyhbY2xhc3MqPSJOYXZJY29uLWlnIl0p'), __hyB64('W2RhdGEtaC1xLWhlYWRlci1nYW1lLXByb21vXQ=='), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9nYW1lX3Byb21vIl0=') ] }, { key: 'block_header_activity_promo', name:__hyB64('5bGP6JS96aG26YOo5rS75Yqo5YWl5Y+j'), selectors: [ __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkFjdGl2aXR5LS0iXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdldlbGZhcmUtLSJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkxvdHRlcnktLSJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcyhbY2xhc3MqPSJOYXZJY29uLWFjdGl2aXR5Il0p'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcyhbY2xhc3MqPSJOYXZJY29uLXdlbGZhcmUiXSk='), __hyB64('W2RhdGEtaC1xLWhlYWRlci1hY3Rpdml0eS1wcm9tb10='), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9hY3Rpdml0eV9wcm9tbyJd') ] }, { key: 'block_header_start_live', name:__hyB64('5bGP6JS96aG26YOo5byA5pKt5YWl5Y+j'), selectors: [ __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkthaUJvLS0iXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcyhbY2xhc3MqPSJOYXZJY29uLWxzIl0p'), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9zdGFydF9saXZlIl0='), __hyB64('LnNpZGViYXItaWNvbi1hdXRob3I=') ] }, { key: 'block_header_download', name:__hyB64('5bGP6JS96aG26YOo5LiL6L295YWl5Y+j'), selectors: [__hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkRvd25sb2FkLS0iXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcyhbY2xhc3MqPSJOYXZJY29uLWRvd25sb2FkIl0p'), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9kb3dubG9hZCJd')] }, { key: 'block_header_history', name:__hyB64('5bGP6JS96aG26YOo5Y6G5Y+y6K6w5b2V'), selectors: [__hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcyhbY2xhc3MqPSJOYXZJY29uLWhpc3RvcnkiXSk='), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9oaXN0b3J5Il0=')] }, { key: 'block_header_task', name:__hyB64('5bGP6JS96aG26YOo5Lu75Yqh5YWl5Y+j'), selectors: [__hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcygjdGFzay1pdGVtKQ=='), __hyB64('I3Rhc2staXRlbQ=='), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl90YXNrIl0=')] }, { key: 'block_header_follow', name:__hyB64('5bGP6JS96aG26YOo5YWz5rOo5YWl5Y+j'), selectors: [ __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkZvbGxvdyJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdlN1YnNjcmliZSJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcyhbY2xhc3MqPSJGb2xsb3ciXSk='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcyhbY2xhc3MqPSJTdWJzY3JpYmUiXSk='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFt0aXRsZSo9IuWFs+azqCJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFthcmlhLWxhYmVsKj0i5YWz5rOoIl0='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtkYXRhLXRpdGxlKj0i5YWz5rOoIl0='), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9mb2xsb3ciXQ==') ] }, { key: 'block_header_login', name:__hyB64('5bGP6JS96aG26YOo55m75b2V5YWl5Y+j'), selectors: [__hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9IkxvZ2luLS0iXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9IkxvZ2luSGQtLSJd'), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9sb2dpbiJd')] }, { key: 'block_header_message', name:__hyB64('5bGP6JS96aG26YOo5raI5oGv5YWl5Y+j'), selectors: [ __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdk1lc3NhZ2UiXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdk1zZyJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik1lc3NhZ2UiXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Im1lc3NhZ2UiXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcyhbY2xhc3MqPSJOYXZJY29uLW1zZyJdKQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdkl0ZW0tLSJdOmhhcyhbY2xhc3MqPSJOYXZJY29uLW1lc3NhZ2UiXSk='), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9tZXNzYWdlIl0=') ] }, { key: 'block_header_message_badge', name:__hyB64('5bGP6JS96aG26YOo5raI5oGv57qi54K5'), selectors: [ __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdk1lc3NhZ2UiXSBbY2xhc3MqPSJCYWRnZSJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdk1lc3NhZ2UiXSBbY2xhc3MqPSJiYWRnZSJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdk1zZyJdIFtjbGFzcyo9IkJhZGdlIl0='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5hdk1zZyJdIFtjbGFzcyo9ImJhZGdlIl0='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik1lc3NhZ2UiXSBbY2xhc3MqPSJVbnJlYWQiXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Im1lc3NhZ2UiXSBbY2xhc3MqPSJ1bnJlYWQiXQ=='), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl9tZXNzYWdlX2JhZGdlIl0=') ] }, { key: 'block_header_user_avatar', name:__hyB64('5bGP6JS96aG26YOo55So5oi35aS05YOP'), selectors: [ __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9IlVzZXJBdmF0YXIiXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9InVzZXItYXZhdGFyIl0='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9IkF2YXRhciJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9ImF2YXRhciJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IGltZ1thbHQqPSLlpLTlg48iXQ=='), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl91c2VyX2F2YXRhciJd') ] }, { key: 'block_header_user_name', name:__hyB64('5bGP6JS96aG26YOo55So5oi35ZCN'), selectors: [ __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9IlVzZXJOYW1lIl0='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9InVzZXItbmFtZSJd'), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Ik5pY2siXQ=='), __hyB64('I0pfZHV5YUhlYWRlclJpZ2h0IFtjbGFzcyo9Im5pY2siXQ=='), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl91c2VyX25hbWUiXQ==') ] }, { key: 'block_header_user_menu', name:__hyB64('5bGP6JS96aG26YOo55So5oi36I+c5Y2V'), selectors: [ __hyB64('W2NsYXNzKj0iVXNlck1lbnUiXTpoYXMoYSk='), __hyB64('W2NsYXNzKj0idXNlci1tZW51Il06aGFzKGEp'), __hyB64('W2NsYXNzKj0iVXNlclBhbmVsIl06aGFzKGEp'), __hyB64('W2NsYXNzKj0idXNlci1wYW5lbCJdOmhhcyhhKQ=='), __hyB64('W2NsYXNzKj0iVXNlckRyb3AiXTpoYXMoYSk='), __hyB64('W2NsYXNzKj0idXNlci1kcm9wIl06aGFzKGEp'), __hyB64('W2RhdGEtaHktY2I9ImhlYWRlcl91c2VyX21lbnUiXQ==') ] }, { key: 'block_anchor_follow', name:__hyB64('5bGP6JS95YWz5rOo5oyJ6ZKu'), selectors: [__hyB64('LnN1YnNjcmliZS1lbnRyYW5jZQ=='), __hyB64('I3l5bGl2ZVJrX2dhbWVfbmV3c0J1dA=='), __hyB64('LnN1YnNjcmliZS1jb250cm9s'), __hyB64('LnN1YnNjcmliZS1jb3VudA==')] }, { key: 'block_anchor_level', name:__hyB64('5bGP6JS95Li75pKt562J57qn'), selectors: [__hyB64('I0pfcm9vbUhkSG9zdEx2SWNvbg=='), __hyB64('LmFuY2hvci1sZXZlbC1pY29u')] }, { key: 'block_anchor_hour_rank', name:__hyB64('5bGP6JS95aS06YOo5bCP5pe25qac'), selectors: [__hyB64('I0pfcm9vbUhvdXJSYW5r'), __hyB64('LnJvb20taG91ci1yYW5r')] }, { key: 'block_anchor_fans_rank', name:__hyB64('5bGP6JS95aS06YOo57KJ5LidL+WuiOaKpOamnA=='), selectors: [__hyB64('I0pfcm9vbUZhbnNSYW5r'), __hyB64('LnJvb20tZmFucy1yYW5r')] }, { key: 'block_room_banner', name:__hyB64('5bGP6JS955u05pKt6Ze05aS06YOo5rS75Yqo5qiq5bmF'), selectors: [__hyB64('I0pfcm9vbUdnVG9w'), __hyB64('LnJvb20tbW9kLWdnVG9w'), __hyB64('LnJvb20tZ2ctdG9w'), __hyB64('I3Jvb20taGQtYmFubmVy'), __hyB64('LnJvb20taGQtYmFubmVy'), __hyB64('W2NsYXNzKj0icm9vbUJhbm5lckluZm8iXQ=='), __hyB64('W2NsYXNzKj0iYmFubmVyTGlzdCJd'), __hyB64('W2NsYXNzKj0iYmFubmVySXRlbSJd')] }, { key: 'block_room_match_label', name:__hyB64('5bGP6JS955u05pKt6Ze06LWb5LqL5qCH6aKY'), selectors: [__hyB64('W2RhdGEtaHktY2I9InJvb21fbWF0Y2hfbGFiZWwiXQ==')] }, { key: 'block_room_id', name:__hyB64('5bGP6JS95oi/6Ze05Y+3'), selectors: [__hyB64('W2RhdGEtaHktY2I9InJvb21faWQiXQ==')] }, { key: 'block_room_viewer_count', name:__hyB64('5bGP6JS96KeC55yL5Lq65pWw'), selectors: [__hyB64('W2RhdGEtaHktY2I9InJvb21fdmlld2VyX2NvdW50Il0=')] }, { key: 'block_room_category', name:__hyB64('5bGP6JS955u05pKt5YiG57G75YWl5Y+j'), selectors: [__hyB64('W2RhdGEtaHktY2I9InJvb21fY2F0ZWdvcnkiXQ==')] }, { key: 'block_sidebar_rank_nav', name:__hyB64('5bGP6JS95Y+z5L6n5qac5Y2V5YiH5o2i5qCH562+'), selectors: [__hyB64('LnJvb20td2Vla2x5UmFua0xpc3QtbmF2'), __hyB64('LnJvb20td2Vla2x5UmFua0xpc3QtbmF2LWl0ZW0=')] }, { key: 'block_sidebar_rank_content', name:__hyB64('5bGP6JS95Y+z5L6n5qac5Y2V5YaF5a65'), selectors: [__hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfcmFua19jb250ZW50Il0=')] }, { key: 'block_sidebar_user_badges', name:__hyB64('5bGP6JS95qac5Y2V55So5oi35b6956ug'), selectors: [ __hyB64('I0pfcm9vbVdlZWtseVJhbmtMaXN0Um9vdCBbY2xhc3MqPSJub2JsZS1tZWRhbCJd'), __hyB64('I0pfcm9vbVdlZWtseVJhbmtMaXN0Um9vdCBbY2xhc3MqPSJHdWFyZGlhbk1lZGFsIl0='), __hyB64('I0pfcm9vbVdlZWtseVJhbmtMaXN0Um9vdCAuZmFucy1pY29u'), __hyB64('I0pfcm9vbVdlZWtseVJhbmtMaXN0Um9vdCBbY2xhc3MqPSJDb25zdW1lTGV2ZWxCYWRnZSJd') ] }, { key: 'block_sidebar_chat_messages', name:__hyB64('5bGP6JS95Y+z5L6n6IGK5aSp5raI5oGv'), selectors: [ __hyB64('I0pfcm9vbUNoYXRMaXN0'), __hyB64('I0pfbXNnTGlzdA=='), __hyB64('I2NoYXQtcm9vbV9fd3JhcA=='), __hyB64('I2NoYXQtcm9vbV9fbGlzdA=='), __hyB64('LnJvb20tY2hhdC1saXN0'), __hyB64('LmNoYXQtcm9vbV9fbGlzdA=='), __hyB64('LnJvb20tc2lkZWJhci1jaGF0ICNjaGF0LXJvb21fX3dyYXA='), __hyB64('W2NsYXNzKj0iQ2hhdExpc3QiXQ=='), __hyB64('W2NsYXNzKj0iY2hhdC1saXN0Il0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X21lc3NhZ2VzIl0=') ] }, { key: 'block_sidebar_chat_input', name:__hyB64('5bGP6JS95Y+z5L6n6IGK5aSp6L6T5YWl5Yy6'), selectors: [ __hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('I3B1Yl9tc2dfaW5wdXQ='), __hyB64('LnJvb20tY2hhdC1pbnB1dA=='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQ='), __hyB64('W2NsYXNzKj0iQ2hhdElucHV0Il0='), __hyB64('W2NsYXNzKj0iY2hhdC1pbnB1dCJd'), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2lucHV0Il0=') ] }, { key: 'block_sidebar_chat_textarea', name:__hyB64('5bGP6JS96IGK5aSp6L6T5YWl5qGG'), selectors: [ __hyB64('I0pfcm9vbUNoYXRJbnB1dCAjcHViX21zZ19pbnB1dA=='), __hyB64('I3B1Yl9tc2dfaW5wdXQ='), ...genChatInputSelectors(__hyB64('c2lkZWJhcl9jaGF0X3RleHRhcmVh'), [__hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('LnJvb20tY2hhdC1pbnB1dA=='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQ='), __hyB64('W2NsYXNzKj0iQ2hhdElucHV0Il0='), __hyB64('W2NsYXNzKj0iY2hhdC1pbnB1dCJd')], [__hyB64('dGV4dGFyZWE='), __hyB64('aW5wdXRbdHlwZT0idGV4dCJd'), __hyB64('aW5wdXQ6bm90KFt0eXBlXSk='), __hyB64('W2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJd')]) ] }, { key: 'block_sidebar_chat_emoji_button', name:__hyB64('5bGP6JS96IGK5aSp6KGo5oOF5oyJ6ZKu'), selectors: genChatInputSelectors(__hyB64('c2lkZWJhcl9jaGF0X2Vtb2ppX2J1dHRvbg=='), [__hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('LnJvb20tY2hhdC1pbnB1dA=='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQ=')], [__hyB64('W3RpdGxlKj0i6KGo5oOFIl0='), __hyB64('W2FyaWEtbGFiZWwqPSLooajmg4UiXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLooajmg4UiXQ=='), __hyB64('W2NsYXNzKj0iRW1vamkiXQ=='), __hyB64('W2NsYXNzKj0iZW1vamkiXQ=='), __hyB64('W2NsYXNzKj0iRW1vdGlvbiJd'), __hyB64('W2NsYXNzKj0iZW1vdGlvbiJd'), __hyB64('W2NsYXNzKj0iRW1vdGljb24iXQ=='), __hyB64('W2NsYXNzKj0iZW1vdGljb24iXQ=='), __hyB64('W2NsYXNzKj0iRmFjZSJd'), __hyB64('W2NsYXNzKj0iZmFjZSJd')]) }, { key: 'block_sidebar_chat_quick_buttons', name:__hyB64('5bGP6JS96IGK5aSp5b+r5o235bel5YW3'), selectors: genChatInputSelectors(__hyB64('c2lkZWJhcl9jaGF0X3F1aWNrX2J1dHRvbnM='), [__hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('LnJvb20tY2hhdC1pbnB1dA==')], [__hyB64('W3RpdGxlKj0i5b+r5o23Il0='), __hyB64('W2FyaWEtbGFiZWwqPSLlv6vmjbciXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLlv6vmjbciXQ=='), __hyB64('W3RpdGxlKj0i5by55bmVIl0='), __hyB64('W2FyaWEtbGFiZWwqPSLlvLnluZUiXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLlvLnluZUiXQ=='), __hyB64('W3RpdGxlKj0i6aKc6ImyIl0='), __hyB64('W2FyaWEtbGFiZWwqPSLpopzoibIiXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLpopzoibIiXQ=='), __hyB64('W2NsYXNzKj0iUXVpY2tSZXBseSJd'), __hyB64('W2NsYXNzKj0icXVpY2stcmVwbHkiXQ=='), __hyB64('W2NsYXNzKj0iRGFubXUiXQ=='), __hyB64('W2NsYXNzKj0iZGFubXUiXQ=='), __hyB64('W2NsYXNzKj0iQ29sb3IiXQ=='), __hyB64('W2NsYXNzKj0iY29sb3IiXQ==')]) }, { key: 'block_sidebar_chat_input_identity_entry', name:__hyB64('5bGP6JS96L6T5YWl5Yy66Lqr5Lu95YWl5Y+j'), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2lucHV0X2lkZW50aXR5X2VudHJ5Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLnsonkuJ3niYwiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLlvr3nq6AiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLouqvku70iXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLoo4Xmia4iXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLotLXml48iXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLlrojmiqQiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJCYWRnZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJNZWRhbCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJOb2JsZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJHdWFyZGlhbiJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJEcmVzcyJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJEZWNvcmF0aW9uIl0='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJCYWRnZSJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJNZWRhbCJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJOb2JsZSJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJHdWFyZGlhbiJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJEcmVzcyJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJEZWNvcmF0aW9uIl0=') ] }, { key: 'block_sidebar_chat_input_tips', name:__hyB64('5bGP6JS96L6T5YWl5Yy65o+Q56S6'), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2lucHV0X3RpcHMiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJUaXAiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJ0aXAiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJIaW50Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJoaW50Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJOb3RpY2UiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJub3RpY2UiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJHdWlkZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJndWlkZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJMaW1pdCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJsaW1pdCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJDb3VudGVyIl0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJjb3VudGVyIl0='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJUaXAiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJ0aXAiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJOb3RpY2UiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJub3RpY2UiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJHdWlkZSJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJndWlkZSJd') ] }, { key: 'block_sidebar_chat_send_button', name:__hyB64('5bGP6JS96IGK5aSp5Y+R6YCB5oyJ6ZKu'), selectors: [ __hyB64('I0pfcm9vbUNoYXRJbnB1dCBidXR0b25bdHlwZT0ic3VibWl0Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCAuc2VuZC1idG4='), __hyB64('LnJvb20tY2hhdC1pbnB1dCAuc2VuZC1idG4='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQgLnNlbmQtYnRu'), __hyB64('W2NsYXNzKj0iQ2hhdElucHV0Il0gW2NsYXNzKj0iU2VuZEJ0biJd'), __hyB64('W2NsYXNzKj0iY2hhdC1pbnB1dCJdIFtjbGFzcyo9InNlbmQtYnRuIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3NlbmRfYnV0dG9uIl0=') ] }, { key: 'block_sidebar_chat_emoji_panel', name:__hyB64('5bGP6JS96IGK5aSp6KGo5oOF6Z2i5p2/'), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2Vtb2ppX3BhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRW1vamlQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iZW1vamktcGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRW1vdGlvblBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iZW1vdGlvbi1wYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRW1vdGljb25QYW5lbCJd'), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJFbW9qaVBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJlbW9qaS1wYW5lbCJd') ] }, { key: 'block_sidebar_chat_quick_reply_panel', name:__hyB64('5bGP6JS96IGK5aSp5b+r5o235Zue5aSN6Z2i5p2/'), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3F1aWNrX3JlcGx5X3BhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iUXVpY2tSZXBseVBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0icXVpY2stcmVwbHktcGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iUGhyYXNlUGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0icGhyYXNlLXBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iUHJlc2V0UGFuZWwiXQ=='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJRdWlja1JlcGx5UGFuZWwiXQ=='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJxdWljay1yZXBseS1wYW5lbCJd') ] }, { key: 'block_sidebar_chat_identity_panel', name:__hyB64('5bGP6JS96L6T5YWl5Yy66Lqr5Lu9L+ijheaJruW8ueWxgg=='), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2lkZW50aXR5X3BhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iSWRlbnRpdHlQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iaWRlbnRpdHktcGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iQmFkZ2VQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iTWVkYWxQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iTm9ibGVQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRHJlc3NQYW5lbCJd'), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJJZGVudGl0eVBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJCYWRnZVBhbmVsIl0=') ] }, { key: 'block_sidebar_chat_login_permission_tip', name:__hyB64('5bGP6JS96L6T5YWl5Yy655m75b2VL+adg+mZkOaPkOekug=='), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2xvZ2luX3Blcm1pc3Npb25fdGlwIl0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJMb2dpblRpcCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJsb2dpbi10aXAiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJQZXJtaXNzaW9uVGlwIl0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJwZXJtaXNzaW9uLXRpcCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJTcGVha0xpbWl0Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJzcGVhay1saW1pdCJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJMb2dpblRpcCJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJQZXJtaXNzaW9uVGlwIl0=') ] }, { key: 'block_sidebar_chat_tool_popover', name:__hyB64('5bGP6JS96IGK5aSp5bel5YW35rWu5bGC'), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3Rvb2xfcG9wb3ZlciJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iQ2hhdFRvb2xQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iVG9vbFBvcG92ZXIiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0idG9vbC1wb3BvdmVyIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRGFubXVTdHlsZVBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iQ29sb3JQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRm9udFBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJDaGF0VG9vbFBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJUb29sUG9wb3ZlciJd') ] }, { key: 'block_sidebar_header', name:__hyB64('5bGP6JS95Y+z5L6n5qCP5aS06YOo'), selectors: [__hyB64('I0pfcm9vbVNpZGVIZA=='), __hyB64('LnJvb20tc2lkZS1oZA=='), __hyB64('LnJvb20tc2lkZWJhci1oZA==')] }, { key: 'block_sidebar_chat_fans_badges', name:__hyB64('5bGP6JS96IGK5aSp57KJ5Lid54mM'), selectors: [ __hyB64('I2NoYXQtcm9vbV9fd3JhcCAubXNnLW5vcm1hbC1kZWNvcmF0aW9uUHJlZml4'), __hyB64('I2NoYXQtcm9vbV9fd3JhcCAuZmFucy1pY29u'), __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJmYW5zLWljb24iXQ=='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2ZhbnNfYmFkZ2VzIl0=') ] }, { key: 'block_sidebar_chat_level_badges', name:__hyB64('5bGP6JS96IGK5aSp562J57qn5qCH562+'), selectors: [ __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJDb25zdW1lTGV2ZWxCYWRnZSJd'), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2xldmVsX2JhZGdlcyJd') ] }, { key: 'block_sidebar_chat_noble_effects', name:__hyB64('5bGP6JS96IGK5aSp6LS15pePL+i/m+Wcuuagh+ivhg=='), selectors: [ __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJub2JsZS1tZWRhbCJd'), __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJHdWFyZGlhbk1lZGFsIl0='), __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJtc2ctcGljIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X25vYmxlX2VmZmVjdHMiXQ==') ] }, { key: 'block_sidebar_chat_user_names', name:__hyB64('5bGP6JS96IGK5aSp55So5oi35ZCN'), selectors: [ __hyB64('I2NoYXQtcm9vbV9fd3JhcCAubmFtZS5KX3VzZXJNZW51'), __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJuYW1lLS0iXQ=='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3VzZXJfbmFtZXMiXQ==') ] }, { name:__hyB64('5bGP6JS96IGK5aSp57O757ufL+i/m+Wcuua2iOaBrw=='), selectors: [ __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJSb29tTWVzc2FnZVJpY2hUZXh0Il0='), __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJib3gtbm9ibGUtbGV2ZWwiXQ=='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3N5c3RlbV9tZXNzYWdlcyJd'), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2VudGVyX21lc3NhZ2VzIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X25vdGljZV9tZXNzYWdlcyJd'), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X25vYmxlX21lc3NhZ2VzIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2d1YXJkX21lc3NhZ2VzIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3N1YnNjcmliZV9tZXNzYWdlcyJd'), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2dpZnRfbWVzc2FnZXMiXQ=='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X21hbmFnZXJfbWVzc2FnZXMiXQ=='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2xvdHRlcnlfbWVzc2FnZXMiXQ==') ] }, { name:__hyB64('5bGP6JS96IGK5aSp6L+b5Zy65raI5oGv'), selectors: [__hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2VudGVyX21lc3NhZ2VzIl0=')] }, { name:__hyB64('5bGP6JS96IGK5aSp5YWs5ZGK5raI5oGv'), selectors: [__hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X25vdGljZV9tZXNzYWdlcyJd')] }, { name:__hyB64('5bGP6JS96IGK5aSp6LS15peP5raI5oGv'), selectors: [__hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X25vYmxlX21lc3NhZ2VzIl0=')] }, { name:__hyB64('5bGP6JS96IGK5aSp5a6I5oqk5raI5oGv'), selectors: [__hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2d1YXJkX21lc3NhZ2VzIl0=')] }, { name:__hyB64('5bGP6JS96IGK5aSp6K6i6ZiF5raI5oGv'), selectors: [__hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3N1YnNjcmliZV9tZXNzYWdlcyJd')] }, { name:__hyB64('5bGP6JS96IGK5aSp56S854mp5raI5oGv'), selectors: [__hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2dpZnRfbWVzc2FnZXMiXQ==')] }, { name:__hyB64('5bGP6JS96IGK5aSp5oi/566h5raI5oGv'), selectors: [__hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X21hbmFnZXJfbWVzc2FnZXMiXQ==')] }, { name:__hyB64('5bGP6JS96IGK5aSp5oq95aWW5Lit5aWW5raI5oGv'), selectors: [__hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2xvdHRlcnlfbWVzc2FnZXMiXQ==')] }, { name:__hyB64('5bGP6JS95Y+z5L6n6IGK5aSp6L6T5YWl5Yy6'), selectors: [ __hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('I3B1Yl9tc2dfaW5wdXQ='), __hyB64('LnJvb20tY2hhdC1pbnB1dA=='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQ='), __hyB64('W2NsYXNzKj0iQ2hhdElucHV0Il0='), __hyB64('W2NsYXNzKj0iY2hhdC1pbnB1dCJd'), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2lucHV0Il0=') ] }, { name:__hyB64('5bGP6JS96IGK5aSp6L6T5YWl5qGG'), selectors: [ __hyB64('I0pfcm9vbUNoYXRJbnB1dCAjcHViX21zZ19pbnB1dA=='), __hyB64('I3B1Yl9tc2dfaW5wdXQ='), ...genChatInputSelectors(__hyB64('c2lkZWJhcl9jaGF0X3RleHRhcmVh'), [__hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('LnJvb20tY2hhdC1pbnB1dA=='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQ='), __hyB64('W2NsYXNzKj0iQ2hhdElucHV0Il0='), __hyB64('W2NsYXNzKj0iY2hhdC1pbnB1dCJd')], [__hyB64('dGV4dGFyZWE='), __hyB64('aW5wdXRbdHlwZT0idGV4dCJd'), __hyB64('aW5wdXQ6bm90KFt0eXBlXSk='), __hyB64('W2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJd')]) ] }, { name:__hyB64('5bGP6JS96IGK5aSp6KGo5oOF5oyJ6ZKu'), selectors: genChatInputSelectors(__hyB64('c2lkZWJhcl9jaGF0X2Vtb2ppX2J1dHRvbg=='), [__hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('LnJvb20tY2hhdC1pbnB1dA=='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQ=')], [__hyB64('W3RpdGxlKj0i6KGo5oOFIl0='), __hyB64('W2FyaWEtbGFiZWwqPSLooajmg4UiXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLooajmg4UiXQ=='), __hyB64('W2NsYXNzKj0iRW1vamkiXQ=='), __hyB64('W2NsYXNzKj0iZW1vamkiXQ=='), __hyB64('W2NsYXNzKj0iRW1vdGlvbiJd'), __hyB64('W2NsYXNzKj0iZW1vdGlvbiJd'), __hyB64('W2NsYXNzKj0iRW1vdGljb24iXQ=='), __hyB64('W2NsYXNzKj0iZW1vdGljb24iXQ=='), __hyB64('W2NsYXNzKj0iRmFjZSJd'), __hyB64('W2NsYXNzKj0iZmFjZSJd')]) }, { name:__hyB64('5bGP6JS96IGK5aSp5b+r5o235bel5YW3'), selectors: genChatInputSelectors(__hyB64('c2lkZWJhcl9jaGF0X3F1aWNrX2J1dHRvbnM='), [__hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('LnJvb20tY2hhdC1pbnB1dA==')], [__hyB64('W3RpdGxlKj0i5b+r5o23Il0='), __hyB64('W2FyaWEtbGFiZWwqPSLlv6vmjbciXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLlv6vmjbciXQ=='), __hyB64('W3RpdGxlKj0i5by55bmVIl0='), __hyB64('W2FyaWEtbGFiZWwqPSLlvLnluZUiXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLlvLnluZUiXQ=='), __hyB64('W3RpdGxlKj0i6aKc6ImyIl0='), __hyB64('W2FyaWEtbGFiZWwqPSLpopzoibIiXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLpopzoibIiXQ=='), __hyB64('W2NsYXNzKj0iUXVpY2tSZXBseSJd'), __hyB64('W2NsYXNzKj0icXVpY2stcmVwbHkiXQ=='), __hyB64('W2NsYXNzKj0iRGFubXUiXQ=='), __hyB64('W2NsYXNzKj0iZGFubXUiXQ=='), __hyB64('W2NsYXNzKj0iQ29sb3IiXQ=='), __hyB64('W2NsYXNzKj0iY29sb3IiXQ==')]) }, { name:__hyB64('5bGP6JS96L6T5YWl5Yy66Lqr5Lu95YWl5Y+j'), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2lucHV0X2lkZW50aXR5X2VudHJ5Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLnsonkuJ3niYwiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLlvr3nq6AiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLouqvku70iXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLoo4Xmia4iXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLotLXml48iXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLlrojmiqQiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJCYWRnZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJNZWRhbCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJOb2JsZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJHdWFyZGlhbiJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJEcmVzcyJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJEZWNvcmF0aW9uIl0='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJCYWRnZSJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJNZWRhbCJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJOb2JsZSJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJHdWFyZGlhbiJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJEcmVzcyJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJEZWNvcmF0aW9uIl0=') ] }, { name:__hyB64('5bGP6JS96L6T5YWl5Yy65o+Q56S6'), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2lucHV0X3RpcHMiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJUaXAiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJ0aXAiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJIaW50Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJoaW50Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJOb3RpY2UiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJub3RpY2UiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJHdWlkZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJndWlkZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJMaW1pdCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJsaW1pdCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJDb3VudGVyIl0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJjb3VudGVyIl0='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJUaXAiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJ0aXAiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJOb3RpY2UiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJub3RpY2UiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJHdWlkZSJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJndWlkZSJd') ] }, { name:__hyB64('5bGP6JS96IGK5aSp5Y+R6YCB5oyJ6ZKu'), selectors: [ __hyB64('I0pfcm9vbUNoYXRJbnB1dCBidXR0b25bdHlwZT0ic3VibWl0Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCAuc2VuZC1idG4='), __hyB64('LnJvb20tY2hhdC1pbnB1dCAuc2VuZC1idG4='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQgLnNlbmQtYnRu'), __hyB64('W2NsYXNzKj0iQ2hhdElucHV0Il0gW2NsYXNzKj0iU2VuZEJ0biJd'), __hyB64('W2NsYXNzKj0iY2hhdC1pbnB1dCJdIFtjbGFzcyo9InNlbmQtYnRuIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3NlbmRfYnV0dG9uIl0=') ] }, { name:__hyB64('5bGP6JS96IGK5aSp6KGo5oOF6Z2i5p2/'), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2Vtb2ppX3BhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRW1vamlQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iZW1vamktcGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRW1vdGlvblBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iZW1vdGlvbi1wYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRW1vdGljb25QYW5lbCJd'), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJFbW9qaVBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJlbW9qaS1wYW5lbCJd') ] }, { name:__hyB64('5bGP6JS96IGK5aSp5b+r5o235Zue5aSN6Z2i5p2/'), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3F1aWNrX3JlcGx5X3BhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iUXVpY2tSZXBseVBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0icXVpY2stcmVwbHktcGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iUGhyYXNlUGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0icGhyYXNlLXBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iUHJlc2V0UGFuZWwiXQ=='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJRdWlja1JlcGx5UGFuZWwiXQ=='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJxdWljay1yZXBseS1wYW5lbCJd') ] }, { name:__hyB64('5bGP6JS96L6T5YWl5Yy66Lqr5Lu9L+ijheaJruW8ueWxgg=='), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2lkZW50aXR5X3BhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iSWRlbnRpdHlQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iaWRlbnRpdHktcGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iQmFkZ2VQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iTWVkYWxQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iTm9ibGVQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRHJlc3NQYW5lbCJd'), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJJZGVudGl0eVBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJCYWRnZVBhbmVsIl0=') ] }, { name:__hyB64('5bGP6JS96L6T5YWl5Yy655m75b2VL+adg+mZkOaPkOekug=='), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2xvZ2luX3Blcm1pc3Npb25fdGlwIl0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJMb2dpblRpcCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJsb2dpbi10aXAiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJQZXJtaXNzaW9uVGlwIl0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJwZXJtaXNzaW9uLXRpcCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJTcGVha0xpbWl0Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJzcGVhay1saW1pdCJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJMb2dpblRpcCJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJQZXJtaXNzaW9uVGlwIl0=') ] }, { name:__hyB64('5bGP6JS96IGK5aSp5bel5YW35rWu5bGC'), selectors: [ __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3Rvb2xfcG9wb3ZlciJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iQ2hhdFRvb2xQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iVG9vbFBvcG92ZXIiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0idG9vbC1wb3BvdmVyIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRGFubXVTdHlsZVBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iQ29sb3JQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRm9udFBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJDaGF0VG9vbFBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJUb29sUG9wb3ZlciJd') ] }, { name:__hyB64('5bGP6JS95Y+z5L6n5qCP5aS06YOo'), selectors: [__hyB64('I0pfcm9vbVNpZGVIZA=='), __hyB64('LnJvb20tc2lkZS1oZA=='), __hyB64('LnJvb20tc2lkZWJhci1oZA==')] }, { name:__hyB64('5bGP6JS95Y+z5L6n6IGK5aSp5raI5oGv'), selectors: [ __hyB64('I0pfcm9vbUNoYXRMaXN0'), __hyB64('I0pfbXNnTGlzdA=='), __hyB64('I2NoYXQtcm9vbV9fd3JhcA=='), __hyB64('I2NoYXQtcm9vbV9fbGlzdA=='), __hyB64('LnJvb20tY2hhdC1saXN0'), __hyB64('LmNoYXQtcm9vbV9fbGlzdA=='), __hyB64('LnJvb20tc2lkZWJhci1jaGF0ICNjaGF0LXJvb21fX3dyYXA='), __hyB64('W2NsYXNzKj0iQ2hhdExpc3QiXQ=='), __hyB64('W2NsYXNzKj0iY2hhdC1saXN0Il0='), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9tZXNzYWdlcyJd') ] }, { name:__hyB64('5bGP6JS96IGK5aSp57KJ5Lid54mM'), selectors: [ __hyB64('I2NoYXQtcm9vbV9fd3JhcCAubXNnLW5vcm1hbC1kZWNvcmF0aW9uUHJlZml4'), __hyB64('I2NoYXQtcm9vbV9fd3JhcCAuZmFucy1pY29u'), __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJmYW5zLWljb24iXQ=='), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9mYW5zX2JhZGdlcyJd') ] }, { name:__hyB64('5bGP6JS96IGK5aSp562J57qn5qCH562+'), selectors: [ __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJDb25zdW1lTGV2ZWxCYWRnZSJd'), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9sZXZlbF9iYWRnZXMiXQ==') ] }, { name:__hyB64('5bGP6JS96IGK5aSp6LS15pePL+i/m+Wcuuagh+ivhg=='), selectors: [ __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJub2JsZS1tZWRhbCJd'), __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJHdWFyZGlhbk1lZGFsIl0='), __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJtc2ctcGljIl0='), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9ub2JsZV9lZmZlY3RzIl0=') ] }, { name:__hyB64('5bGP6JS96IGK5aSp55So5oi35ZCN'), selectors: [ __hyB64('I2NoYXQtcm9vbV9fd3JhcCAubmFtZS5KX3VzZXJNZW51'), __hyB64('I2NoYXQtcm9vbV9fd3JhcCBbY2xhc3MqPSJuYW1lLS0iXQ=='), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF91c2VyX25hbWVzIl0=') ] }, { name:__hyB64('5bGP6JS95Y+z5L6n6IGK5aSp6L6T5YWl5Yy6'), selectors: [ __hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('I3B1Yl9tc2dfaW5wdXQ='), __hyB64('LnJvb20tY2hhdC1pbnB1dA=='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQ='), __hyB64('W2NsYXNzKj0iQ2hhdElucHV0Il0='), __hyB64('W2NsYXNzKj0iY2hhdC1pbnB1dCJd'), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9pbnB1dCJd') ] }, { name:__hyB64('5bGP6JS96IGK5aSp6L6T5YWl5qGG'), selectors: [ __hyB64('I0pfcm9vbUNoYXRJbnB1dCAjcHViX21zZ19pbnB1dA=='), __hyB64('I3B1Yl9tc2dfaW5wdXQ='), ...genChatInputSelectors(__hyB64('c2lkZWJhcl9jaGF0X3RleHRhcmVh'), [__hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('LnJvb20tY2hhdC1pbnB1dA=='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQ='), __hyB64('W2NsYXNzKj0iQ2hhdElucHV0Il0='), __hyB64('W2NsYXNzKj0iY2hhdC1pbnB1dCJd')], [__hyB64('dGV4dGFyZWE='), __hyB64('aW5wdXRbdHlwZT0idGV4dCJd'), __hyB64('aW5wdXQ6bm90KFt0eXBlXSk='), __hyB64('W2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJd')]) ] }, { name:__hyB64('5bGP6JS96IGK5aSp6KGo5oOF5oyJ6ZKu'), selectors: genChatInputSelectors(__hyB64('c2lkZWJhcl9jaGF0X2Vtb2ppX2J1dHRvbg=='), [__hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('LnJvb20tY2hhdC1pbnB1dA=='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQ=')], [__hyB64('W3RpdGxlKj0i6KGo5oOFIl0='), __hyB64('W2FyaWEtbGFiZWwqPSLooajmg4UiXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLooajmg4UiXQ=='), __hyB64('W2NsYXNzKj0iRW1vamkiXQ=='), __hyB64('W2NsYXNzKj0iZW1vamkiXQ=='), __hyB64('W2NsYXNzKj0iRW1vdGlvbiJd'), __hyB64('W2NsYXNzKj0iZW1vdGlvbiJd'), __hyB64('W2NsYXNzKj0iRW1vdGljb24iXQ=='), __hyB64('W2NsYXNzKj0iZW1vdGljb24iXQ=='), __hyB64('W2NsYXNzKj0iRmFjZSJd'), __hyB64('W2NsYXNzKj0iZmFjZSJd')]) }, { name:__hyB64('5bGP6JS96IGK5aSp5b+r5o235bel5YW3'), selectors: genChatInputSelectors(__hyB64('c2lkZWJhcl9jaGF0X3F1aWNrX2J1dHRvbnM='), [__hyB64('I0pfcm9vbUNoYXRJbnB1dA=='), __hyB64('LnJvb20tY2hhdC1pbnB1dA==')], [__hyB64('W3RpdGxlKj0i5b+r5o23Il0='), __hyB64('W2FyaWEtbGFiZWwqPSLlv6vmjbciXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLlv6vmjbciXQ=='), __hyB64('W3RpdGxlKj0i5by55bmVIl0='), __hyB64('W2FyaWEtbGFiZWwqPSLlvLnluZUiXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLlvLnluZUiXQ=='), __hyB64('W3RpdGxlKj0i6aKc6ImyIl0='), __hyB64('W2FyaWEtbGFiZWwqPSLpopzoibIiXQ=='), __hyB64('W2RhdGEtdGl0bGUqPSLpopzoibIiXQ=='), __hyB64('W2NsYXNzKj0iUXVpY2tSZXBseSJd'), __hyB64('W2NsYXNzKj0icXVpY2stcmVwbHkiXQ=='), __hyB64('W2NsYXNzKj0iRGFubXUiXQ=='), __hyB64('W2NsYXNzKj0iZGFubXUiXQ=='), __hyB64('W2NsYXNzKj0iQ29sb3IiXQ=='), __hyB64('W2NsYXNzKj0iY29sb3IiXQ==')]) }, { name:__hyB64('5bGP6JS96L6T5YWl5Yy66Lqr5Lu95YWl5Y+j'), selectors: [ __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9pbnB1dF9pZGVudGl0eV9lbnRyeSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLnsonkuJ3niYwiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLlvr3nq6AiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLouqvku70iXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLoo4Xmia4iXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLotLXml48iXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbdGl0bGUqPSLlrojmiqQiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJCYWRnZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJNZWRhbCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJOb2JsZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJHdWFyZGlhbiJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJEcmVzcyJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJEZWNvcmF0aW9uIl0='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJCYWRnZSJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJNZWRhbCJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJOb2JsZSJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJHdWFyZGlhbiJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJEcmVzcyJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJEZWNvcmF0aW9uIl0=') ] }, { name:__hyB64('5bGP6JS96L6T5YWl5Yy65o+Q56S6'), selectors: [ __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9pbnB1dF90aXBzIl0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJUaXAiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJ0aXAiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJIaW50Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJoaW50Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJOb3RpY2UiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJub3RpY2UiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJHdWlkZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJndWlkZSJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJMaW1pdCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJsaW1pdCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJDb3VudGVyIl0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJjb3VudGVyIl0='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJUaXAiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJ0aXAiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJOb3RpY2UiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJub3RpY2UiXQ=='), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJHdWlkZSJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJndWlkZSJd') ] }, { name:__hyB64('5bGP6JS96IGK5aSp5Y+R6YCB5oyJ6ZKu'), selectors: [ __hyB64('I0pfcm9vbUNoYXRJbnB1dCBidXR0b25bdHlwZT0ic3VibWl0Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCAuc2VuZC1idG4='), __hyB64('LnJvb20tY2hhdC1pbnB1dCAuc2VuZC1idG4='), __hyB64('LmNoYXQtcm9vbV9faW5wdXQgLnNlbmQtYnRu'), __hyB64('W2NsYXNzKj0iQ2hhdElucHV0Il0gW2NsYXNzKj0iU2VuZEJ0biJd'), __hyB64('W2NsYXNzKj0iY2hhdC1pbnB1dCJdIFtjbGFzcyo9InNlbmQtYnRuIl0='), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9zZW5kX2J1dHRvbiJd') ] }, { name:__hyB64('5bGP6JS96IGK5aSp6KGo5oOF6Z2i5p2/'), selectors: [ __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9lbW9qaV9wYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRW1vamlQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iZW1vamktcGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRW1vdGlvblBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iZW1vdGlvbi1wYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRW1vdGljb25QYW5lbCJd'), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJFbW9qaVBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJlbW9qaS1wYW5lbCJd') ] }, { name:__hyB64('5bGP6JS96IGK5aSp5b+r5o235Zue5aSN6Z2i5p2/'), selectors: [ __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9xdWlja19yZXBseV9wYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iUXVpY2tSZXBseVBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0icXVpY2stcmVwbHktcGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iUGhyYXNlUGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0icGhyYXNlLXBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iUHJlc2V0UGFuZWwiXQ=='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJRdWlja1JlcGx5UGFuZWwiXQ=='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJxdWljay1yZXBseS1wYW5lbCJd') ] }, { name:__hyB64('5bGP6JS96L6T5YWl5Yy66Lqr5Lu9L+ijheaJruW8ueWxgg=='), selectors: [ __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9pZGVudGl0eV9wYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iSWRlbnRpdHlQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iaWRlbnRpdHktcGFuZWwiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iQmFkZ2VQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iTWVkYWxQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iTm9ibGVQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRHJlc3NQYW5lbCJd'), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJJZGVudGl0eVBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJCYWRnZVBhbmVsIl0=') ] }, { name:__hyB64('5bGP6JS96L6T5YWl5Yy655m75b2VL+adg+mZkOaPkOekug=='), selectors: [ __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9sb2dpbl9wZXJtaXNzaW9uX3RpcCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJMb2dpblRpcCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJsb2dpbi10aXAiXQ=='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJQZXJtaXNzaW9uVGlwIl0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJwZXJtaXNzaW9uLXRpcCJd'), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJTcGVha0xpbWl0Il0='), __hyB64('I0pfcm9vbUNoYXRJbnB1dCBbY2xhc3MqPSJzcGVhay1saW1pdCJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJMb2dpblRpcCJd'), __hyB64('LnJvb20tY2hhdC1pbnB1dCBbY2xhc3MqPSJQZXJtaXNzaW9uVGlwIl0=') ] }, { name:__hyB64('5bGP6JS96IGK5aSp5bel5YW35rWu5bGC'), selectors: [ __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF90b29sX3BvcG92ZXIiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iQ2hhdFRvb2xQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iVG9vbFBvcG92ZXIiXQ=='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0idG9vbC1wb3BvdmVyIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRGFubXVTdHlsZVBhbmVsIl0='), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iQ29sb3JQYW5lbCJd'), __hyB64('I0pfcm9vbVNpZGUgW2NsYXNzKj0iRm9udFBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJDaGF0VG9vbFBhbmVsIl0='), __hyB64('LnJvb20tc2lkZWJhciBbY2xhc3MqPSJUb29sUG9wb3ZlciJd') ] }, { name:__hyB64('5bGP6JS95Y+z5L6n5qCP5aS06YOo'), selectors: [__hyB64('I0pfcm9vbVNpZGVIZA=='), __hyB64('LnJvb20tc2lkZS1oZA=='), __hyB64('LnJvb20tc2lkZWJhci1oZA==')] }, { key: 'block_sidebar_tab_switcher', name:__hyB64('5bGP6JS95Y+z5L6n5qCP5YiH5o2i5qCH562+'), selectors: [__hyB64('LnJvb20tc2lkZWJhci10YWI='), __hyB64('W2NsYXNzKj0icm9vbVNpZGViYXJUYWIiXQ=='), __hyB64('W2NsYXNzKj0ibmF2VGFiLS0iXQ==')] }, { key: 'block_sidebar_match_notice', name:__hyB64('5bGP6JS95Y+z5L6n6LWb56iLL+a0u+WKqOaPkOekug=='), selectors: [__hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfbWF0Y2hfbm90aWNlIl0='), __hyB64('I0pfbW9kX21hdGNoU2NoZWR1bGU='), __hyB64('LnJvb20tbW9kLW1hdGNoU2NoZWR1bGU='), __hyB64('Lmh5LW1hdGNoLW5vdGljZXM='), __hyB64('Lm1hdGNoLW5vdGljZXNfX2hk'), __hyB64('Lm1hdGNoLW5vdGljZXNfX2Jk')] }, { key: 'block_player_danmu_button', name:__hyB64('5bGP6JS95by55bmV5byA5YWz'), selectors: [__hyB64('I3BsYXllci1kYW5tdS13cmFw'), __hyB64('I3BsYXllci1kYW5tdS1idG4=')] }, { key: 'block_player_refresh_report', name:__hyB64('5bGP6JS95Yi35pawL+S4vuaKpeaMiemSrg=='), selectors: [__hyB64('LnBsYXllci1yZWZyZXNoLWJ0bg=='), __hyB64('LnBsYXllci1yZXBvcnQtYnRu')] }, { key: 'block_player_refresh', name:__hyB64('5bGP6JS95Yi35paw5oyJ6ZKu'), selectors: [__hyB64('LnBsYXllci1yZWZyZXNoLWJ0bg==')] }, { key: 'block_player_report', name:__hyB64('5bGP6JS95Li+5oql5oyJ6ZKu'), selectors: [__hyB64('LnBsYXllci1yZXBvcnQtYnRu')] }, { key: 'block_player_login_tip', name:__hyB64('5bGP6JS955m75b2V55S76LSo5o+Q56S6'), selectors: [__hyB64('I3BsYXllci1sb2dpbi1ndWlkZS10aXA='), __hyB64('LnBsYXllci1sb2dpbi1ndWlkZS1jbG9zZQ=='), __hyB64('LnBsYXllci1sb2dpbi1ndWlkZS10ZXh0'), __hyB64('W2NsYXNzKj0ibG9naW4tZ3VpZGUiXQ=='), __hyB64('W2NsYXNzKj0iTG9naW5HdWlkZSJd')] }, { key: 'block_player_download_tip', name:__hyB64('5bGP6JS95LiL6L295byV5a+8'), selectors: [__hyB64('LnBsYXllci1kb3dubG9hZC10aXBz'), __hyB64('LnBsYXllci1hcHAtZ3VpZGU=')] }, { key: 'block_player_network_notice', name:__hyB64('5bGP6JS95pKt5pS+5Zmo57q/6LevL+e9kee7nOaPkOekug=='), selectors: [ __hyB64('W2RhdGEtaHktY2I9InBsYXllcl9uZXR3b3JrX25vdGljZSJd'), __hyB64('I2xpdmVSb29tT2JqIFtkYXRhLWgtcS1wbGF5ZXItc3RhdHVzPSJuZXR3b3JrIl0='), __hyB64('LnJvb20tcGxheWVyIFtkYXRhLWgtcS1wbGF5ZXItc3RhdHVzPSJuZXR3b3JrIl0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9Im5ldHdvcmstdGlwIl0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9Ik5ldHdvcmtUaXAiXQ=='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9ImxpbmUtdGlwIl0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9IkxpbmVUaXAiXQ=='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9Im5ldC10aXAiXQ=='), __hyB64('LnJvb20tcGxheWVyIFtjbGFzcyo9Im5ldHdvcmstdGlwIl0='), __hyB64('LnJvb20tcGxheWVyIFtjbGFzcyo9ImxpbmUtdGlwIl0=') ] }, { key: 'block_player_latency_notice', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5bu26L+f5o+Q56S6'), selectors: [ __hyB64('W2RhdGEtaHktY2I9InBsYXllcl9sYXRlbmN5X25vdGljZSJd'), __hyB64('I2xpdmVSb29tT2JqIFtkYXRhLWgtcS1wbGF5ZXItc3RhdHVzPSJsYXRlbmN5Il0='), __hyB64('LnJvb20tcGxheWVyIFtkYXRhLWgtcS1wbGF5ZXItc3RhdHVzPSJsYXRlbmN5Il0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9ImxhdGVuY3kiXQ=='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9IkxhdGVuY3kiXQ=='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9ImRlbGF5LXRpcCJd'), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9IkRlbGF5VGlwIl0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9ImxhZy10aXAiXQ=='), __hyB64('LnJvb20tcGxheWVyIFtjbGFzcyo9ImxhdGVuY3kiXQ=='), __hyB64('LnJvb20tcGxheWVyIFtjbGFzcyo9ImRlbGF5LXRpcCJd') ] }, { key: 'block_player_reconnect_notice', name:__hyB64('5bGP6JS95pKt5pS+5Zmo6ZSZ6K+vL+mHjei/nuaPkOekug=='), selectors: [ __hyB64('W2RhdGEtaHktY2I9InBsYXllcl9yZWNvbm5lY3Rfbm90aWNlIl0='), __hyB64('I2xpdmVSb29tT2JqIFtkYXRhLWgtcS1wbGF5ZXItc3RhdHVzPSJyZWNvbm5lY3QiXQ=='), __hyB64('LnJvb20tcGxheWVyIFtkYXRhLWgtcS1wbGF5ZXItc3RhdHVzPSJyZWNvbm5lY3QiXQ=='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9InJlY29ubmVjdCJd'), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9IlJlY29ubmVjdCJd'), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9ImVycm9yLXRpcCJd'), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9IkVycm9yVGlwIl0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9InBsYXllci1lcnJvciJd'), __hyB64('LnJvb20tcGxheWVyIFtjbGFzcyo9InJlY29ubmVjdCJd'), __hyB64('LnJvb20tcGxheWVyIFtjbGFzcyo9ImVycm9yLXRpcCJd') ] }, { key: 'block_player_pause_loading_notice', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5pqC5YGcL+WKoOi9veaPkOekug=='), selectors: [ __hyB64('W2RhdGEtaHktY2I9InBsYXllcl9wYXVzZV9sb2FkaW5nX25vdGljZSJd'), __hyB64('I2xpdmVSb29tT2JqIFtkYXRhLWgtcS1wbGF5ZXItc3RhdHVzPSJwYXVzZUxvYWRpbmciXQ=='), __hyB64('LnJvb20tcGxheWVyIFtkYXRhLWgtcS1wbGF5ZXItc3RhdHVzPSJwYXVzZUxvYWRpbmciXQ=='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9ImxvYWRpbmctdGlwIl0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9IkxvYWRpbmdUaXAiXQ=='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9ImxvYWRpbmctbWFzayJd'), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9IkxvYWRpbmdNYXNrIl0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9ImJ1ZmZlci1sb2FkaW5nIl0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9InBhdXNlLXRpcCJd'), __hyB64('LnJvb20tcGxheWVyIFtjbGFzcyo9ImxvYWRpbmctdGlwIl0='), __hyB64('LnJvb20tcGxheWVyIFtjbGFzcyo9ImxvYWRpbmctbWFzayJd') ] }, { key: 'block_player_quality_qrcode_notice', name:__hyB64('5bGP6JS95riF5pmw5bqm6ZSB5a6aL+aJq+eggeaPkOekug=='), selectors: [ __hyB64('W2RhdGEtaHktY2I9InBsYXllcl9xdWFsaXR5X3FyY29kZV9ub3RpY2UiXQ=='), __hyB64('I2xpdmVSb29tT2JqIFtkYXRhLWgtcS1wbGF5ZXItc3RhdHVzPSJxdWFsaXR5UXJjb2RlIl0='), __hyB64('LnJvb20tcGxheWVyIFtkYXRhLWgtcS1wbGF5ZXItc3RhdHVzPSJxdWFsaXR5UXJjb2RlIl0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9InFyY29kZSJd'), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9IlFSQ29kZSJd'), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9InFyLWNvZGUiXQ=='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9InF1YWxpdHktbG9jayJd'), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9IlF1YWxpdHlMb2NrIl0='), __hyB64('I2xpdmVSb29tT2JqIFtjbGFzcyo9InNjYW4tY29kZSJd'), __hyB64('LnJvb20tcGxheWVyIFtjbGFzcyo9InFyY29kZSJd'), __hyB64('LnJvb20tcGxheWVyIFtjbGFzcyo9InF1YWxpdHktbG9jayJd') ] }, { key: 'block_player_popup_ad', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5by556qX5o+Q56S6'), selectors: [ __hyB64('W2RhdGEtaHktY2I9InBsYXllcl9wb3B1cF9hZCJd'), __hyB64('I2xpdmVSb29tT2JqIFtkYXRhLWgtcS1wbGF5ZXItcG9wdXAtYWRd'), __hyB64('LnJvb20tcGxheWVyIFtkYXRhLWgtcS1wbGF5ZXItcG9wdXAtYWRd'), __hyB64('I2xpdmVSb29tT2JqIC5yb29tLXBsYXllci1wb3B1cA=='), __hyB64('LnJvb20tcGxheWVyIC5yb29tLXBsYXllci1wb3B1cA==') ] }, { key: 'block_player_ad_embed', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5YaF5bWM5bm/5ZGK'), selectors: [__hyB64('LmFiLW1pZGRsZQ=='), __hyB64('LmFiLWNvbnRlbnQ='), __hyB64('LmFiLWxvZ28='), __hyB64('LmFiLXFyLWNvZGUtd3JhcA=='), __hyB64('LmFiLXFyLWNvZGU='), __hyB64('I3NvdW5kLnNvdW5kLWNsb3Nl'), __hyB64('W2NsYXNzKj0iYWItbWlkZGxlIl0='), __hyB64('W2NsYXNzKj0iYWItY29udGVudCJd'), __hyB64('W2NsYXNzKj0iYWItbG9nbyJd')] }, { key: 'block_player_effect_settings', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5bGP6JS96K6+572u5oyJ6ZKu'), selectors: [__hyB64('I3NoaWVsZGluZy1lZmZlY3Q=')] }, { key: 'block_player_control_bar', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5bqV6YOo5o6n5Yi25qCP'), desc:__hyB64('6ZqQ6JeP5pW05p2h5pKt5pS+5Zmo5bqV6YOo5o6n5Yi25rWu5bGC77yM5Lya5ZCM5pe26ZqQ6JeP5a2X5bmV44CB6Z+z6YeP44CB5riF5pmw5bqm44CB572R6aG15Ymn5Zy65ZKM5rWP6KeI5Zmo5YWo5bGP562J5YWl5Y+j77yb5Y+q5bu66K6u6ZyA6KaB57qv5YeA55S76Z2i5pe25Y2V54us5byA5ZCv44CC'), selectors: [__hyB64('I3BsYXllci1jdHJsLXdyYXA='), __hyB64('LnBsYXllci1jdHJsLXdyYXA='), __hyB64('W2NsYXNzKj0icGxheWVyLWNvbnRyb2wiXQ=='), __hyB64('W2NsYXNzKj0iUGxheWVyQ29udHJvbCJd'), __hyB64('W2NsYXNzKj0iY29udHJvbC1iYXIiXQ=='), __hyB64('W2NsYXNzKj0iQ29udHJvbEJhciJd')] }, { key: 'block_player_sound_button', name:__hyB64('5bGP6JS95pKt5pS+5Zmo6Z+z6YeP5oyJ6ZKu'), selectors: [__hyB64('I3BsYXllci1zb3VuZC1idG4='), __hyB64('LnBsYXllci1zb3VuZC1vbg=='), __hyB64('LnBsYXllci1zb3VuZC1vZmY=')] }, { key: 'block_player_sound_slider', name:__hyB64('5bGP6JS95pKt5pS+5Zmo6Z+z6YeP5ruR5p2h'), selectors: [__hyB64('LnNvdW5kLXByb2dyZXNz'), __hyB64('LnNvdW5kLWJn'), __hyB64('LnNvdW5kLWJhcg=='), __hyB64('LnNvdW5kLWJ0bg==')] }, { key: 'block_player_quality_selector', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5riF5pmw5bqm5YWl5Y+j'), selectors: [__hyB64('I3BsYXllci12aWRlb3R5cGU='), __hyB64('LnBsYXllci12aWRlb3R5cGU='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgLnBsYXllci12aWRlb3R5cGUtbGlzdA=='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2NsYXNzKj0icGxheWVyLXZpZGVvdHlwZSJd'), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2RhdGEtdGl0bGUqPSLmuIXmmbAiXQ=='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW3RpdGxlKj0i5riF5pmwIl0='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2FyaWEtbGFiZWwqPSLmuIXmmbAiXQ=='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2RhdGEtdGl0bGUqPSLnlLvotKgiXQ=='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW3RpdGxlKj0i55S76LSoIl0='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2FyaWEtbGFiZWwqPSLnlLvotKgiXQ==')] }, { key: 'block_player_fullpage_button', name:__hyB64('5bGP6JS9572R6aG15Ymn5Zy65oyJ6ZKu'), selectors: [__hyB64('I3BsYXllci1mdWxscGFnZS1idG4='), __hyB64('LnBsYXllci1mdWxscGFnZS1idG4='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2RhdGEtdGl0bGUqPSLliaflnLoiXQ=='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW3RpdGxlKj0i5Ymn5Zy6Il0='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2FyaWEtbGFiZWwqPSLliaflnLoiXQ=='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2RhdGEtdGl0bGUqPSLnvZHpobXlhajlsY8iXQ=='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW3RpdGxlKj0i572R6aG15YWo5bGPIl0='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2FyaWEtbGFiZWwqPSLnvZHpobXlhajlsY8iXQ==')] }, { key: 'block_player_fullscreen_button', name:__hyB64('5bGP6JS95rWP6KeI5Zmo5YWo5bGP5oyJ6ZKu'), selectors: [__hyB64('I3BsYXllci1mdWxsc2NyZWVuLWJ0bg=='), __hyB64('LnBsYXllci1mdWxsc2NyZWVuLWJ0bg=='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2RhdGEtdGl0bGU9IuWFqOWxjyJd'), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW3RpdGxlPSLlhajlsY8iXQ=='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2FyaWEtbGFiZWw9IuWFqOWxjyJd'), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2RhdGEtdGl0bGUqPSLmtY/op4jlmajlhajlsY8iXQ=='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW3RpdGxlKj0i5rWP6KeI5Zmo5YWo5bGPIl0='), __hyB64('I3BsYXllci1jdHJsLXdyYXAgW2FyaWEtbGFiZWwqPSLmtY/op4jlmajlhajlsY8iXQ==')] }, { key: 'block_player_recommend_background', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5o6o6I2Q6IOM5pmv'), selectors: [__hyB64('I3BsYXllci1yZWNvbW1lbmQtYmc='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgLnBsYXllci1yZWNvbW1lbmQtYmc='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgLnBsYXllci1yZWNvbW1lbmQtYmctY292ZXI=')] }, { key: 'block_player_recommend_notice', name:__hyB64('5bGP6JS955u05pKt6aKE5ZGKL+aVtOaUueaPkOekug=='), selectors: [__hyB64('I3BsYXllci1yZWNvbW1lbmQgLnJlY29tbWVuZC10b3AtdWk='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgLnJlY29tbWVuZC1saXZlLWZvcmVub3RpY2U='), __hyB64('I3JlY29tbWVuZC1mb3JiaWQ=')] }, { key: 'block_player_recommend_cards', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5o6o6I2Q55u05pKt5Y2h54mH'), selectors: [__hyB64('I3BsYXllci1yZWNvbW1lbmQgLnBsYXllci1yZWNvbW1lbmQtYmlnLXZpZGVv'), __hyB64('I3BsYXllci1yZWNvbW1lbmQgLnBsYXllci1yZWNvbW1lbmQtbGlzdA=='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgLnBsYXllci1yZWNvbW1lbmQtdmJveA=='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgLnBsYXllci1yZWNvbW1lbmQtaG9tZQ==')] }, { key: 'block_player_recommend_big_card', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5o6o6I2Q5aSn5Y2h'), selectors: [ __hyB64('I3BsYXllci1yZWNvbW1lbmQgLnBsYXllci1yZWNvbW1lbmQtYmlnLXZpZGVv'), __hyB64('I3BsYXllci1yZWNvbW1lbmQgW2NsYXNzKj0icmVjb21tZW5kLWJpZy12aWRlbyJd'), __hyB64('I3BsYXllci1yZWNvbW1lbmQgW2NsYXNzKj0iUmVjb21tZW5kQmlnVmlkZW8iXQ==') ] }, { key: 'block_player_recommend_list', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5o6o6I2Q5YiX6KGo'), selectors: [ __hyB64('I3BsYXllci1yZWNvbW1lbmQgLnBsYXllci1yZWNvbW1lbmQtbGlzdA=='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgLnBsYXllci1yZWNvbW1lbmQtdmJveA=='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgW2NsYXNzKj0icmVjb21tZW5kLWxpc3QiXQ=='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgW2NsYXNzKj0iUmVjb21tZW5kTGlzdCJd'), __hyB64('I3BsYXllci1yZWNvbW1lbmQgW2NsYXNzKj0icmVjb21tZW5kLXZib3giXQ=='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgW2NsYXNzKj0iUmVjb21tZW5kVmJveCJd') ] }, { key: 'block_player_recommend_home', name:__hyB64('5bGP6JS95pKt5pS+5Zmo5pu05aSa54Ot6Zeo5YWl5Y+j'), selectors: [ __hyB64('I3BsYXllci1yZWNvbW1lbmQgLnBsYXllci1yZWNvbW1lbmQtaG9tZQ=='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgW2NsYXNzKj0icmVjb21tZW5kLWhvbWUiXQ=='), __hyB64('I3BsYXllci1yZWNvbW1lbmQgW2NsYXNzKj0iUmVjb21tZW5kSG9tZSJd') ] }, { key: 'block_gift_bar_full', name:__hyB64('5bGP6JS95pW05p2h56S854mp5qCP'), selectors: [__hyB64('I3BsYXllci1naWZ0LXdyYXA='), __hyB64('LnJvb20tcGxheWVyLWdpZnQtcGxhY2Vob2xkZXI=')] }, { key: 'block_gift_quick_bar', name:__hyB64('5bGP6JS956S854mp5b+r5o235qCP'), selectors: [__hyB64('LnBsYXllci1naWZ0LWxlZnQ='), __hyB64('W2NsYXNzKj0iZ2lmdC1sZWZ0Il0=')] }, { key: 'block_gift_lucky_burst', name:__hyB64('5bGP6JS95qyn55qHL+eIhueCueWFpeWPow=='), selectors: [__hyB64('LnBsYXllci1sZWZ0LWljb24tZW50ZXI='), __hyB64('LnBsYXllci1sdWNreS1idXJzdC1pY29u')] }, { key: 'block_gift_game_recommend', name:__hyB64('5bGP6JS956S854mp5qCP5ri45oiP5o6o6I2Q'), selectors: [__hyB64('LmFiLWljb24ueHNiLWljb24=')] }, { key: 'block_gift_box', name:__hyB64('5bGP6JS955m+5a6d566x'), selectors: [__hyB64('LnBsYXllci1ib3gtaWNvbg=='), __hyB64('LnBsYXllci1jaGVzdC1idG4=')] }, { key: 'block_gift_hot_promote', name:__hyB64('5bGP6JS95LiK54Ot6Zeo5YWl5Y+j'), selectors: [ __hyB64('W2RhdGEtaHktY2I9ImdpZnRfaG90X3Byb21vdGUiXQ=='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iaG90LXByb21vdGUiXQ=='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iSG90UHJvbW90ZSJd'), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iYm9vc3QiXQ=='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iQm9vc3QiXQ==') ] }, { key: 'block_gift_activity_icons', name:__hyB64('5bGP6JS95rS75Yqo5Zu+5qCH'), selectors: [__hyB64('LmRpeS1hY3Rpdml0eS1pY29u'), __hyB64('LmRpeS1hY3Rpdml0eS1pY29uLWJveA=='), __hyB64('W2lkXj0iZGl5LWFjdGl2aXR5LWljb24tIl0=')] }, { key: 'block_gift_cart_activity', name:__hyB64('5bGP6JS95bCP6buE6L2m5YWl5Y+j'), selectors: [__hyB64('W2RhdGEtaHktY2I9ImdpZnRfY2FydF9hY3Rpdml0eSJd')] }, { key: 'block_gift_confession_activity', name:__hyB64('5bGP6JS95ZGK55m96K6h5YiS5YWl5Y+j'), selectors: [__hyB64('W2RhdGEtaHktY2I9ImdpZnRfY29uZmVzc2lvbl9hY3Rpdml0eSJd')] }, { key: 'block_gift_activity_countdown', name:__hyB64('5bGP6JS956S854mp5rS75Yqo5YCS6K6h5pe2'), selectors: [ __hyB64('W2RhdGEtaHktY2I9ImdpZnRfYWN0aXZpdHlfY291bnRkb3duIl0='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iY291bnRkb3duIl0='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iQ291bnRkb3duIl0='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0idGltZS1sZWZ0Il0='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iVGltZUxlZnQiXQ=='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0icmVtYWluLXRpbWUiXQ=='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iUmVtYWluVGltZSJd'), __hyB64('I3BsYXllci1naWZ0LXdyYXAgW2NsYXNzKj0iYWN0aXZpdHkiXSBbY2xhc3MqPSJjb3VudGRvd24iXQ=='), __hyB64('I3BsYXllci1naWZ0LXdyYXAgW2NsYXNzKj0iQWN0aXZpdHkiXSBbY2xhc3MqPSJDb3VudGRvd24iXQ=='), __hyB64('LmRpeS1hY3Rpdml0eS1pY29uIFtjbGFzcyo9ImNvdW50ZG93biJd'), __hyB64('LmRpeS1hY3Rpdml0eS1pY29uLWJveCBbY2xhc3MqPSJjb3VudGRvd24iXQ==') ] }, { key: 'block_gift_activity_benefit_tips', name:__hyB64('5bGP6JS956S854mp5rS75Yqo5p2D55uK5o+Q56S6'), selectors: [ __hyB64('W2RhdGEtaHktY2I9ImdpZnRfYWN0aXZpdHlfYmVuZWZpdF90aXBzIl0='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iYmVuZWZpdCJd'), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iQmVuZWZpdCJd'), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0icmV3YXJkIl0='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iUmV3YXJkIl0='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iYm9udXMiXQ=='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iQm9udXMiXQ=='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0icmViYXRlIl0='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iUmViYXRlIl0='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iYWN0aXZpdHktdGlwIl0='), __hyB64('LnBsYXllci1naWZ0LWxlZnQgW2NsYXNzKj0iQWN0aXZpdHlUaXAiXQ=='), __hyB64('I3BsYXllci1naWZ0LXdyYXAgW2NsYXNzKj0iYWN0aXZpdHktcG9wIl0='), __hyB64('I3BsYXllci1naWZ0LXdyYXAgW2NsYXNzKj0iQWN0aXZpdHlQb3AiXQ=='), __hyB64('I3BsYXllci1naWZ0LXdyYXAgW2NsYXNzKj0iYWN0aXZpdHktdG9vbHRpcCJd'), __hyB64('I3BsYXllci1naWZ0LXdyYXAgW2NsYXNzKj0iQWN0aXZpdHlUb29sdGlwIl0='), __hyB64('LmRpeS1hY3Rpdml0eS1pY29uIFtjbGFzcyo9ImJlbmVmaXQiXQ=='), __hyB64('LmRpeS1hY3Rpdml0eS1pY29uLWJveCBbY2xhc3MqPSJiZW5lZml0Il0=') ] }, { key: 'block_gift_more_activity', name:__hyB64('5bGP6JS95pu05aSa5rS75Yqo'), selectors: [__hyB64('Lm1vcmUtYWN0aXZpdHktaWNvbg=='), __hyB64('Lm1vcmUtYWN0aXZpdHktaWNvbi1ib3g=')] }, { key: 'block_gift_week_star', name:__hyB64('5bGP6JS95ZGo5pif'), selectors: [__hyB64('I3dlZWstc3Rhci1idG4=')] }, { key: 'block_gift_face_list', name:__hyB64('5bGP6JS956S854mp5b+r5o235YiX6KGo'), selectors: [__hyB64('I3BsYXllci1mYWNl'), __hyB64('LnBsYXllci1mYWNlLWxpc3Q='), __hyB64('LnBsYXllci1mYWNlLWdpZnQ=')] }, { key: 'block_gift_face_arrow', name:__hyB64('5bGP6JS956S854mp5b+r5o235bGV5byA566t5aS0'), selectors: [__hyB64('LnBsYXllci1mYWNlLWFycm93')] }, { key: 'block_gift_charge', name:__hyB64('5bGP6JS95YWF5YC8L+WMheijueWFpeWPow=='), selectors: [__hyB64('LnBsYXllci1naWZ0LXJpZ2h0'), __hyB64('W2NsYXNzKj0iZ2lmdC1yaWdodCJd'), __hyB64('W2NsYXNzKj0icmVjaGFyZ2UiXQ==')] }, { key: 'block_gift_first_charge', name:__hyB64('5bGP6JS96aaW5YWF56S85YyF'), selectors: [__hyB64('I3BsYXllci1wdW5jaC1idG4='), __hyB64('W2RhdGEtaHktY2I9ImdpZnRfZmlyc3RfY2hhcmdlIl0='), __hyB64('I3BsYXllci1maXJzdC1yZWNoYXJnZS1idG4='), __hyB64('I3BsYXllci1maXJzdFJlY2hhcmdlLWJ0bg=='), __hyB64('W2NsYXNzKj0iZmlyc3QtcmVjaGFyZ2UiXQ=='), __hyB64('W2NsYXNzKj0iZmlyc3RSZWNoYXJnZSJd')] }, { key: 'block_gift_recharge', name:__hyB64('5bGP6JS95YWF5YC85YWl5Y+j'), selectors: [__hyB64('I3BsYXllci1yZWNoYXJnZS1idG4='), __hyB64('I3BsYXllci1yZWNoYXJnZS1jbGljaw=='), __hyB64('I3JlY2hhcmdlLWJ0bg==')] }, { key: 'block_gift_package', name:__hyB64('5bGP6JS95YyF6KO55YWl5Y+j'), selectors: [__hyB64('I3BsYXllci1wYWNrYWdlLWJ0bg==')] }, { key: 'block_gift_guard', name:__hyB64('5bGP6JS95a6I5oqk5YWl5Y+j'), selectors: [__hyB64('I3BsYXllci1ndWFyZC1idG4=')] }, { key: 'block_gift_noble', name:__hyB64('5bGP6JS96LS15peP5YWl5Y+j'), selectors: [__hyB64('I3BsYXllci1ub2JsZS1idG4=')] }, { key: 'block_room_below_info', name:__hyB64('5bGP6JS955u05pKt6Ze05LiL5pa55L+h5oGv'), selectors: [ __hyB64('I21hdGNoLWNtcy1jb250ZW50'), __hyB64('I21hdGNoTWFpbg=='), __hyB64('W2lkXj0ibWF0Y2hMaXZlIl0='), __hyB64('Lm1hdGNoX2JvZHlfd3JhcA=='), __hyB64('LmRpeS1jb21wcy13cmFw'), __hyB64('I0pfcm9vbU1haW4gLnJvb20tcHJvZmlsZQ=='), __hyB64('I0pfcm9vbU1haW4gLnJvb20tZGV0YWls'), __hyB64('I0pfcm9vbU1haW4gLnJvb20taW5mby13cmFw'), __hyB64('I0pfcm9vbU1haW4gLnJvb20tbW9kLXByb2ZpbGU='), __hyB64('I0pfcm9vbU1haW4gLnJvb20tcmVjb21tZW5k'), __hyB64('I0pfcm9vbU1haW4gW2NsYXNzKj0iUm9vbVByb2ZpbGUiXQ=='), __hyB64('I0pfcm9vbU1haW4gW2NsYXNzKj0icm9vbVByb2ZpbGUiXQ==') ] }, { key: 'block_room_below_match_cms', name:__hyB64('6ZqQ6JeP5LiL5pa56LWb5LqLL+a0u+WKqOWMug=='), desc:__hyB64('6ZqQ6JeP55u05pKt6Ze05LiL5pa555qE6LWb5LqL44CB5rS75Yqo5ZKM6L+Q6JCl57uE5Lu277yM5LiN5b2x5ZON5pKt5pS+5Zmo5ZKM6IGK5aSp44CC'), selectors: [ __hyB64('I21hdGNoLWNtcy1jb250ZW50'), __hyB64('I21hdGNoTWFpbg=='), __hyB64('W2lkXj0ibWF0Y2hMaXZlIl0='), __hyB64('Lm1hdGNoX2JvZHlfd3JhcA=='), __hyB64('LmRpeS1jb21wcy13cmFw') ] }, { key: 'block_room_below_profile', name:__hyB64('6ZqQ6JeP5LiL5pa55oi/6Ze06LWE5paZ'), desc:__hyB64('6ZqQ6JeP5Li75pKt6LWE5paZ44CB5oi/6Ze05LuL57uN562J5L+h5oGv5Yy677yM5LiN5b2x5ZON55u05pKt5pKt5pS+44CC'), selectors: [ __hyB64('I0pfcm9vbU1haW4gLnJvb20tcHJvZmlsZQ=='), __hyB64('I0pfcm9vbU1haW4gLnJvb20tZGV0YWls'), __hyB64('I0pfcm9vbU1haW4gLnJvb20taW5mby13cmFw'), __hyB64('I0pfcm9vbU1haW4gLnJvb20tbW9kLXByb2ZpbGU='), __hyB64('I0pfcm9vbU1haW4gW2NsYXNzKj0iUm9vbVByb2ZpbGUiXQ=='), __hyB64('I0pfcm9vbU1haW4gW2NsYXNzKj0icm9vbVByb2ZpbGUiXQ==') ] }, { key: 'block_room_below_recommend', name:__hyB64('6ZqQ6JeP5LiL5pa55o6o6I2Q55u05pKt'), desc:__hyB64('6ZqQ6JeP55u05pKt6Ze05LiL5pa555qE5o6o6I2Q55u05pKt5YiX6KGo77yM5YeP5bCR6aG16Z2i5bqV6YOo5bmy5omw44CC'), selectors: [ __hyB64('I0pfcm9vbU1haW4gLnJvb20tcmVjb21tZW5k'), __hyB64('I0pfcm9vbU1haW4gW2NsYXNzKj0iUm9vbVJlY29tbWVuZCJd'), __hyB64('I0pfcm9vbU1haW4gW2NsYXNzKj0icm9vbVJlY29tbWVuZCJd') ] }, { key: 'block_room_below_moments_nav', name:__hyB64('5bGP6JS95LiL5pa55Yqo5oCB5a+86Iiq'), desc:__hyB64('6ZqQ6JeP55u05pKt6Ze05LiL5pa55Yqo5oCB5Yy655qE5a+86Iiq5qCH562+44CC'), selectors: [ __hyB64('I3Jvb20tbW9tZW50cyAubW9tZW50cy1uYXY='), __hyB64('I3Jvb20tbW9tZW50cyAubW9tZW50cy1uYXYtaXRlbQ=='), __hyB64('LnJvb20tbW9tZW50cyAubW9tZW50cy1uYXY='), __hyB64('LnJvb20tbW9tZW50cyAubW9tZW50cy1uYXYtaXRlbQ==') ] }, { name:__hyB64('5bGP6JS95LiL5pa55Yqo5oCB5a+86Iiq'), selectors: [ __hyB64('I3Jvb20tbW9tZW50cyAubW9tZW50cy1uYXY='), __hyB64('I3Jvb20tbW9tZW50cyAubW9tZW50cy1uYXYtaXRlbQ=='), __hyB64('LnJvb20tbW9tZW50cyAubW9tZW50cy1uYXY='), __hyB64('LnJvb20tbW9tZW50cyAubW9tZW50cy1uYXYtaXRlbQ==') ] }, { key: 'block_room_below_moments_content', name:__hyB64('5bGP6JS95LiL5pa55Yqo5oCB5YaF5a65'), desc:__hyB64('6ZqQ6JeP55u05pKt6Ze05LiL5pa55Yqo5oCB5Yy66YeM55qE5YW35L2T5YaF5a6544CC'), selectors: [ __hyB64('I3Jvb20tbW9tZW50cyAubW9tZW50cy1jb250ZW50'), __hyB64('LnJvb20tbW9tZW50cyAubW9tZW50cy1jb250ZW50') ] }, { key: 'block_room_below_union', name:__hyB64('5bGP6JS95LiL5pa5562+57qm5YWs5Lya'), desc:__hyB64('6ZqQ6JeP55u05pKt6Ze05LiL5pa555qE562+57qm5YWs5Lya5L+h5oGv44CC'), selectors: [ __hyB64('I3Jvb20tdW5pb24='), __hyB64('LnJvb20tdW5pb24=') ] }, { key: 'block_room_below_you_like', name:__hyB64('5bGP6JS95LiL5pa554yc5L2g5Zac5qyi'), desc:__hyB64('6ZqQ6JeP55u05pKt6Ze05LiL5pa555qE54yc5L2g5Zac5qyi5o6o6I2Q5qih5Z2X44CC'), selectors: [ __hyB64('I0pfcm9vbVVMaWtl'), __hyB64('LnJvb20teW91bGlrZQ=='), __hyB64('I0pfcm9vbVBlcnNvbmFsUmVjb20=') ] }, { key: 'block_room_below_category_recommend', name:__hyB64('6ZqQ6JeP5LiL5pa55o6o6I2Q5YiG57G7'), desc:__hyB64('6ZqQ6JeP55u05pKt6Ze05LiL5pa55oyJ5YiG57G75o6o6I2Q55u05pKt55qE5pW05Z2X5Yy65Z+f44CC'), selectors: [__hyB64('I2NsYXNzaWZ5LXJlY29t'), __hyB64('LmNsYXNzaWZ5LXJlY29t'), __hyB64('W2RhdGEtaHktY2I9InJvb21fYmVsb3dfY2F0ZWdvcnlfcmVjb21tZW5kIl0=')] }, { key: 'block_sidebar_chat_system_all', name:__hyB64('5bGP6JS96IGK5aSp57O757uf5raI5oGv'), selectors: [__hyB64('W2NsYXNzKj0iUm9vbU1lc3NhZ2VSaWNoVGV4dCJd'), __hyB64('W2NsYXNzKj0iYm94LW5vYmxlLWxldmVsIl0='), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfY2hhdF9zeXN0ZW1fYWxsIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3N5c3RlbV9tZXNzYWdlcyJd'), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2VudGVyX21lc3NhZ2VzIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X25vdGljZV9tZXNzYWdlcyJd'), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X25vYmxlX21lc3NhZ2VzIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2d1YXJkX21lc3NhZ2VzIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X3N1YnNjcmliZV9tZXNzYWdlcyJd'), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2dpZnRfbWVzc2FnZXMiXQ=='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X21hbmFnZXJfbWVzc2FnZXMiXQ=='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9jaGF0X2xvdHRlcnlfbWVzc2FnZXMiXQ=='), __hyB64('W2RhdGEtaHktcWEtc3lzdGVtXQ=='), __hyB64('W2RhdGEtaHktcWEtc3lzdGVtLWVudGVyXQ=='), __hyB64('W2RhdGEtaHktcWEtc3lzdGVtLW5vdGljZV0='), __hyB64('W2RhdGEtaHktcWEtc3lzdGVtLW5vYmxlXQ=='), __hyB64('W2RhdGEtaHktcWEtc3lzdGVtLWd1YXJkXQ=='), __hyB64('W2RhdGEtaHktcWEtc3lzdGVtLXN1YnNjcmliZV0='), __hyB64('W2RhdGEtaHktcWEtc3lzdGVtLWdpZnRd'), __hyB64('W2RhdGEtaHktcWEtc3lzdGVtLW1hbmFnZXJd'), __hyB64('W2RhdGEtaHktcWEtc3lzdGVtLWxvdHRlcnld')] }, { key: 'block_room_below_recommend_detail', name:__hyB64('6ZqQ6JeP5o6o6I2Q55u05pKt5Y2h54mH57uG6IqC'), desc:__hyB64('5Y+q6ZqQ6JeP5LiL5pa55o6o6I2Q55u05pKt5Y2h54mH6YeM55qE5bCB6Z2i44CB5qCH6aKY44CB5Li75pKt44CB5Lq65pWw5ZKM5qCH562+44CC'), selectors: [ __hyB64('I0pfcm9vbU1haW4gLnJvb20tcmVjb21tZW5kIGxp'), __hyB64('I0pfcm9vbU1haW4gLnJvb20tcmVjb21tZW5kIC5saXZlLWNhcmQ='), __hyB64('W2RhdGEtaHktY2I9InJvb21fYmVsb3dfcmVjb21tZW5kX2RldGFpbCJd') ] }, { key: 'block_room_below_category_detail', name:__hyB64('6ZqQ6JeP5o6o6I2Q5YiG57G75Y2h54mH57uG6IqC'), desc:__hyB64('5Y+q6ZqQ6JeP5YiG57G75o6o6I2Q6YeM55qE5p2h55uu44CB5bCB6Z2i44CB5ZCN56ew44CB5Lq65pWw5ZKM5pON5L2c5oyJ6ZKu562J57uG6IqC44CC'), selectors: [ __hyB64('I2NsYXNzaWZ5LXJlY29tICNyZWNvbS1saXN0IGxp'), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9Iml0ZW0iXQ=='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9InRpdGxlIl0='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9IlRpdGxlIl0='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9ImhlYWQiXQ=='), __hyB64('I2NsYXNzaWZ5LXJlY29tIC5yZWNvbS10aXRsZS1pY29u'), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9Im5hbWUiXQ=='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9Ik5hbWUiXQ=='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9InZpZXdlciJd'), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9Im9ubGluZSJd'), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9ImhlYXQiXQ=='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9ImNvdW50Il0='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9InN0YXR1cyJd'), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9ImJhZGdlIl0='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9ImxpdmUiXQ=='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9Im1vcmUiXQ=='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9InJlZnJlc2giXQ=='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9ImNoYW5nZSJd'), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9ImFjdGlvbiJd'), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9ImhvdmVyIl0='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9InByZXZpZXciXQ=='), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9Im92ZXJsYXkiXQ=='), __hyB64('I2NsYXNzaWZ5LXJlY29tIC5sb2FkaW5n'), __hyB64('I2NsYXNzaWZ5LXJlY29tIFtjbGFzcyo9InNrZWxldG9uIl0='), __hyB64('W2RhdGEtaHktY2I9InJvb21fYmVsb3dfY2F0ZWdvcnlfZGV0YWlsIl0=') ], }, { key: 'block_gift_face_detail', name:__hyB64('5bGP6JS95b+r5o2356S854mp6K+m5oOF'), desc:__hyB64('5ZCI5bm25bGP6JS95b+r5o2356S854mp55qE5Zu+5qCH44CB5ZCN56ew44CB5Lu35qC844CB6KeS5qCH5ZKM6LWg6YCB5oyJ6ZKu'), selectors: [ __hyB64('I3BsYXllci1mYWNlIGltZw=='), __hyB64('I3BsYXllci1mYWNlIFtjbGFzcyo9ImdpZnQtaWNvbiJd'), __hyB64('I3BsYXllci1mYWNlIFtjbGFzcyo9ImdpZnQtbmFtZSJd'), __hyB64('I3BsYXllci1mYWNlIFtjbGFzcyo9ImdpZnQtcHJpY2UiXQ=='), __hyB64('I3BsYXllci1mYWNlIFtjbGFzcyo9ImdpZnQtYmFkZ2UiXQ=='), __hyB64('I3BsYXllci1mYWNlIFtjbGFzcyo9ImdpZnQtY291bnQiXQ=='), __hyB64('I3BsYXllci1mYWNlIFtjbGFzcyo9ImdpZnQtc2VuZCJd'), __hyB64('I3BsYXllci1mYWNlIFtjbGFzcyo9ImdpZnQtZGV0YWlsIl0='), __hyB64('I3BsYXllci1mYWNlIFtjbGFzcyo9ImNvbWJvIl0='), __hyB64('I3BsYXllci1mYWNlIFtjbGFzcyo9ImludmVudG9yeSJd'), __hyB64('LnBsYXllci1mYWNlLWxpc3QgaW1n'), __hyB64('LnBsYXllci1mYWNlLWxpc3QgW2NsYXNzKj0iZ2lmdC1pY29uIl0='), __hyB64('LnBsYXllci1mYWNlLWxpc3QgW2NsYXNzKj0iZ2lmdC1uYW1lIl0='), __hyB64('LnBsYXllci1mYWNlLWxpc3QgW2NsYXNzKj0iZ2lmdC1wcmljZSJd'), __hyB64('LnBsYXllci1mYWNlLWxpc3QgW2NsYXNzKj0iZ2lmdC1zZW5kIl0='), __hyB64('W2RhdGEtaHktY2I9ImdpZnRfZmFjZV9kZXRhaWwiXQ==') ] }, { key: 'block_sidebar_rank_detail', name:__hyB64('5bGP6JS95qac5Y2V6K+m5oOF'), selectors: [__hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfcmFua19hdmF0YXJzIl0='), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfcmFua191c2VyX25hbWVzIl0='), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfcmFua192YWx1ZXMiXQ=='), __hyB64('W2RhdGEtaHktY2I9InNpZGViYXJfcmFua19udW1iZXJzIl0='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9yYW5rX2F2YXRhcnMiXQ=='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9yYW5rX3VzZXJfbmFtZXMiXQ=='), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9yYW5rX3ZhbHVlcyJd'), __hyB64('W2RhdGEtaHktY29udHJvbC1ibG9jaz0ic2lkZWJhcl9yYW5rX251bWJlcnMiXQ==')] }, ]; // === 19-regions-presets.js === // 19-regions-presets.js 区域定义、控件映射、预设配置、体验模式、动态控制分组 const CONTROL_BLOCK_REGIONS = [ { key: 'region_header', name:__hyB64('6aG16Z2i6aG26YOo'), desc:__hyB64('566h55CG6aG16Z2i6aG26YOo5YWl5Y+j5ZKM54q25oCB5pi+56S6'), childKeys: ['block_header_nav_home', 'block_header_nav_live', 'block_header_nav_category', 'block_header_nav_match', 'block_header_nav_video', 'block_header_nav_game', 'block_header_nav_trade', 'block_header_search', 'block_header_start_live', 'block_header_download', 'block_header_history', 'block_header_task', 'block_header_follow', 'block_header_login', 'block_header_message', 'block_header_message_badge', 'block_header_user_avatar', 'block_header_user_name', 'block_header_user_menu'] }, { key: 'region_room_header', name:__hyB64('55u05pKt6Ze05aS06YOo'), desc:__hyB64('566h55CG55u05pKt6Ze05aS06YOo5L+h5oGv5pi+56S6'), childKeys: ['block_room_banner', 'block_room_match_label', 'block_anchor_follow', 'block_anchor_level', 'block_room_id', 'block_room_viewer_count', 'block_room_category', 'block_anchor_hour_rank', 'block_anchor_fans_rank'] }, { key: 'region_sidebar', name:__hyB64('5Y+z5L6n5qac5Y2VL+iBiuWkqeagjw=='), desc:__hyB64('566h55CG5Y+z5L6n5Yy65Z+f5YaF5a655ZKM6L6T5YWl5Yy65pi+56S6'), childKeys: ['block_sidebar_header', 'block_sidebar_tab_switcher', 'block_sidebar_rank_nav', 'block_sidebar_rank_content', 'block_sidebar_rank_detail', 'block_sidebar_user_badges', 'block_sidebar_match_notice', 'block_sidebar_chat_messages', 'block_sidebar_chat_system_all', 'block_sidebar_chat_fans_badges', 'block_sidebar_chat_level_badges', 'block_sidebar_chat_noble_effects', 'block_sidebar_chat_user_names', 'block_sidebar_chat_input', 'block_sidebar_chat_textarea', 'block_sidebar_chat_emoji_button', 'block_sidebar_chat_quick_buttons', 'block_sidebar_chat_input_identity_entry', 'block_sidebar_chat_input_tips', 'block_sidebar_chat_send_button', 'block_sidebar_chat_emoji_panel', 'block_sidebar_chat_quick_reply_panel', 'block_sidebar_chat_identity_panel', 'block_sidebar_chat_login_permission_tip', 'block_sidebar_chat_tool_popover'] }, { key: 'region_player', name:__hyB64('5pKt5pS+5Zmo'), desc:__hyB64('566h55CG5pKt5pS+5Zmo55S76Z2i44CB5o+Q56S65ZKM5o6n5Yi26aG55pi+56S6'), childKeys: ['block_player_danmu', 'block_player_danmu_button', 'block_player_refresh', 'block_player_report', 'block_player_login_tip', 'block_player_download_tip', 'block_player_network_notice', 'block_player_latency_notice', 'block_player_reconnect_notice', 'block_player_pause_loading_notice', 'block_player_quality_qrcode_notice', 'block_player_effect_settings', 'block_player_control_bar', 'block_player_sound_button', 'block_player_sound_slider', 'block_player_quality_selector', 'block_player_fullpage_button', 'block_player_fullscreen_button', 'block_player_recommend_background', 'block_player_recommend_notice', 'block_player_recommend_big_card', 'block_player_recommend_list', 'block_player_recommend_home'] }, { key: 'region_gift', name:__hyB64('56S854mp5rS75Yqo'), desc:__hyB64('566h55CG56S854mp5Yy65Z+f5YWl5Y+j5ZKM54q25oCB5pi+56S6'), childKeys: ['block_gift_lucky_burst', 'block_gift_game_recommend', 'block_gift_box', 'block_gift_hot_promote', 'block_gift_cart_activity', 'block_gift_confession_activity', 'block_gift_activity_countdown', 'block_gift_activity_benefit_tips', 'block_gift_more_activity', 'block_gift_week_star', 'block_gift_face_list', 'block_gift_face_detail', 'block_gift_face_arrow', 'block_gift_first_charge', 'block_gift_recharge', 'block_gift_package', 'block_gift_guard', 'block_gift_noble'] }, { key: 'region_below', name:__hyB64('55u05pKt6Ze05LiL5pa5'), desc:__hyB64('6ZqQ6JeP55u05pKt6Ze06aG16Z2i5bqV6YOo55qE6LWE5paZ44CB5rS75Yqo44CB5Yqo5oCB5ZKM5o6o6I2Q5YaF5a65'), childKeys: ['block_room_below_match_cms', 'block_room_below_profile', 'block_room_below_recommend', 'block_room_below_recommend_detail', 'block_room_below_moments_nav', 'block_room_below_moments_content', 'block_room_below_union', 'block_room_below_you_like', 'block_room_below_category_recommend', 'block_room_below_category_detail'] } ]; const CONTROL_BLOCK_MAP = Object.fromEntries(CONTROL_BLOCKS.map(item => [item.key, item])); const COMPACT_CONTROL_GROUPS = [ { key: 'compact_header_user_entries', regionKey: 'region_header', name:__hyB64('6aG26YOo5Liq5Lq65YWl5Y+j'), desc:__hyB64('5ZCI5bm25raI5oGv44CB5aS05YOP44CB5pi156ew5ZKM55So5oi36I+c5Y2V6L+Z5Lqb5L2O6aKR5YWl5Y+j77yM5YeP5bCR6aG26YOo57uG6aG55pWw6YeP'), keys: ['block_header_follow', 'block_header_message', 'block_header_message_badge', 'block_header_user_avatar', 'block_header_user_name', 'block_header_user_menu'] }, { key: 'compact_sidebar_rank_area', regionKey: 'region_sidebar', name:__hyB64('5Y+z5L6n5qac5Y2V5Yy6'), desc:__hyB64('5ZCI5bm25Y+z5L6n5qCP5aS06YOo44CB5YiH5o2i5qCH562+44CB5qac5Y2V5YaF5a655ZKM5qac5Y2V55So5oi35L+h5oGv77yM6YG/5YWN5Y+q6ZqQ6JeP5bGA6YOo5ZCO55WZ5LiL5q6L57y65qac5Y2V44CC'), keys: ['block_sidebar_header', 'block_sidebar_tab_switcher', 'block_sidebar_rank_nav', 'block_sidebar_rank_content', 'block_sidebar_rank_detail', 'block_sidebar_user_badges'] }, { key: 'compact_sidebar_activity_notice', regionKey: 'region_sidebar', name:__hyB64('5Y+z5L6n5rS75YqoL+i1m+eoi+aPkOekug=='), desc:__hyB64('6ZqQ6JeP5Y+z5L6n5qCP6YeM55qE6LWb56iL44CB5rS75Yqo5ZKM5LqS5Yqo5o+Q56S65p2h77yM5L+d55WZ6IGK5aSp5Yy65Li75L2T44CC'), keys: ['block_sidebar_match_notice'] }, { key: 'compact_sidebar_chat_messages', regionKey: 'region_sidebar', name:__hyB64('6IGK5aSp5raI5oGv5Yy6'), desc:__hyB64('6ZqQ6JeP5Y+z5L6n6IGK5aSp5raI5oGv5YiX6KGo77yM6YCC5ZCI5Y+q55yL55u05pKt55S76Z2i5pe25YeP5bCR5rua5Yqo5bmy5omw44CC'), keys: ['block_sidebar_chat_messages'] }, { key: 'compact_sidebar_chat_decorations', regionKey: 'region_sidebar', name:__hyB64('6IGK5aSp6KOF6aWw'), desc:__hyB64('5ZCI5bm257O757uf5raI5oGv44CB57KJ5Lid54mM44CB562J57qn44CB6LS15peP5qCH6K+G5ZKM55So5oi35ZCN77yM5YeP5bCR6IGK5aSp5Yy66Iqx5ZOo5YWD57Sg44CC'), keys: ['block_sidebar_chat_system_all', 'block_sidebar_chat_fans_badges', 'block_sidebar_chat_level_badges', 'block_sidebar_chat_noble_effects', 'block_sidebar_chat_user_names'] }, { key: 'compact_sidebar_chat_input_area', regionKey: 'region_sidebar', name:__hyB64('6IGK5aSp6L6T5YWl5Yy6'), desc:__hyB64('6ZqQ6JeP6L6T5YWl5qGG44CB6KGo5oOF44CB5b+r5o235bel5YW344CB6Lqr5Lu95YWl5Y+j44CB5o+Q56S65ZKM5Y+R6YCB5oyJ6ZKu77yM6YG/5YWN5Y+q5Ymp6Zu25pWj6L6T5YWl5o6n5Lu244CC'), keys: ['block_sidebar_chat_input', 'block_sidebar_chat_textarea', 'block_sidebar_chat_emoji_button', 'block_sidebar_chat_quick_buttons', 'block_sidebar_chat_input_identity_entry', 'block_sidebar_chat_input_tips', 'block_sidebar_chat_send_button'] }, { key: 'compact_sidebar_chat_popovers', regionKey: 'region_sidebar', name:__hyB64('6IGK5aSp5by55bGCL+W3peWFtw=='), desc:__hyB64('6ZqQ6JeP6KGo5oOF6Z2i5p2/44CB5b+r5o235Zue5aSN44CB6Lqr5Lu96KOF5omu44CB55m75b2V5p2D6ZmQ5o+Q56S65ZKM6IGK5aSp5bel5YW35rWu5bGC44CC'), keys: ['block_sidebar_chat_emoji_panel', 'block_sidebar_chat_quick_reply_panel', 'block_sidebar_chat_identity_panel', 'block_sidebar_chat_login_permission_tip', 'block_sidebar_chat_tool_popover'] }, { key: 'compact_player_status_tips', regionKey: 'region_player', name:__hyB64('5pKt5pS+5Zmo54q25oCB5o+Q56S6'), desc:__hyB64('5ZCI5bm2572R57uc44CB5bu26L+f44CB6YeN6L+e44CB5pqC5YGc5Yqg6L295ZKM5riF5pmw5bqm6ZSB5a6a5o+Q56S6'), keys: ['block_player_network_notice', 'block_player_latency_notice', 'block_player_reconnect_notice', 'block_player_pause_loading_notice', 'block_player_quality_qrcode_notice'] }, { key: 'compact_player_recommend', regionKey: 'region_player', name:__hyB64('5pKt5pS+5Zmo5o6o6I2Q5YaF5a65'), desc:__hyB64('5ZCI5bm25pKt5pS+5Zmo5o6o6I2Q6IOM5pmv44CB5o+Q56S644CB5aSn5Y2h44CB5YiX6KGo5ZKM5pu05aSa54Ot6Zeo5YWl5Y+j'), keys: ['block_player_recommend_background', 'block_player_recommend_notice', 'block_player_recommend_big_card', 'block_player_recommend_list', 'block_player_recommend_home'] }, { key: 'compact_gift_quick_details', regionKey: 'region_gift', name:__hyB64('5b+r5o2356S854mp57uG6IqC'), desc:__hyB64('5ZCI5bm25b+r5o2356S854mp5Zu+5qCH44CB5ZCN56ew44CB5Lu35qC844CB6KeS5qCH44CB5pWw6YeP44CB5oKs5rWu6K+m5oOF5ZKM6LWg6YCB54q25oCB'), keys: [] }, { key: 'compact_below_category_details', regionKey: 'region_below', name:__hyB64('5o6o6I2Q5YiG57G757uG6IqC'), desc:__hyB64('5ZCI5bm25o6o6I2Q5YiG57G75p2h55uu44CB5qCH6aKY44CB5bCB6Z2i44CB5ZCN56ew44CB54q25oCB44CB5Lq65pWw44CB5pON5L2c5YWl5Y+j5ZKM5oKs5rWu5rWu5bGC'), keys: [] } ]; const CONTROL_BLOCK_FAST_GROUPS = [ { key: 'player_recommend', keys: ['block_player_recommend_background', 'block_player_recommend_notice', 'block_player_recommend_big_card', 'block_player_recommend_list', 'block_player_recommend_home'], selectors: ['#player-recommend'] }, { key: 'sidebar_rank_area', keys: ['block_sidebar_rank_nav', 'block_sidebar_rank_content', 'block_sidebar_rank_detail', 'block_sidebar_user_badges'], selectors: ['#J_roomWeeklyRankList', '#J_roomWeeklyRankListRoot', '.room-weeklyRankList', '.room-weeklyRankList-content', '[class*="RankNabob"]'] }, { key: 'sidebar_chat_input_area', keys: ['block_sidebar_chat_input', 'block_sidebar_chat_textarea', 'block_sidebar_chat_emoji_button', 'block_sidebar_chat_quick_buttons', 'block_sidebar_chat_input_identity_entry', 'block_sidebar_chat_input_tips', 'block_sidebar_chat_send_button'], selectors: ['#J_roomChatInput', '.room-chat-input', '.chat-room__input', '[class*="ChatInput"]', '[class*="chat-input"]'] }, { key: 'below_recommend', keys: ['block_room_below_recommend', 'block_room_below_recommend_detail'], selectors: ['#J_roomMain .room-recommend', '#J_roomMain [class*="RoomRecommend"]', '#J_roomMain [class*="roomRecommend"]'] }, { key: 'below_category_recommend', keys: ['block_room_below_category_recommend', 'block_room_below_category_detail'], selectors: ['#classify-recom', '.classify-recom', '[data-hy-cb="room_below_category_recommend"]'] } ]; const LEGACY_CONTROL_BLOCK_MIGRATIONS = { block_header_nav: ['block_header_nav_home', 'block_header_nav_live', 'block_header_nav_category', 'block_header_nav_match', 'block_header_nav_video', 'block_header_nav_game', 'block_header_nav_trade', 'block_header_search', 'block_header_start_live', 'block_header_download', 'block_header_history', 'block_header_task', 'block_header_follow', 'block_header_login', 'block_header_message', 'block_header_message_badge', 'block_header_user_avatar', 'block_header_user_name', 'block_header_user_menu'], block_header_nav_links: ['block_header_nav_home', 'block_header_nav_live', 'block_header_nav_category', 'block_header_nav_match', 'block_header_nav_video', 'block_header_nav_game', 'block_header_nav_trade'], block_header_actions: ['block_header_start_live', 'block_header_download', 'block_header_history', 'block_header_task', 'block_header_follow', 'block_header_login', 'block_header_message', 'block_header_message_badge', 'block_header_user_avatar', 'block_header_user_name', 'block_header_user_menu'], block_top_banners: ['block_room_banner'], block_anchor_extras: ['block_anchor_follow', 'block_anchor_level', 'block_anchor_hour_rank', 'block_anchor_fans_rank'], block_anchor_ranks: ['block_anchor_hour_rank', 'block_anchor_fans_rank'], block_room_meta: ['block_room_id', 'block_room_viewer_count'], block_sidebar_rank: ['block_sidebar_header', 'block_sidebar_rank_nav', 'block_sidebar_rank_content', 'block_sidebar_rank_detail', 'block_sidebar_user_badges', 'block_sidebar_chat_messages'], block_sidebar_head: ['block_sidebar_header'], block_sidebar_tabs: ['block_sidebar_tab_switcher'], block_sidebar_match_schedule: ['block_sidebar_match_notice'], block_player_refresh_report: ['block_player_refresh', 'block_player_report'], block_player_tips: ['block_player_refresh', 'block_player_report', 'block_player_login_tip', 'block_player_download_tip', 'block_player_network_notice', 'block_player_latency_notice', 'block_player_reconnect_notice', 'block_player_pause_loading_notice', 'block_player_quality_qrcode_notice', 'block_player_effect_settings', 'block_player_recommend_background', 'block_player_recommend_notice', 'block_player_recommend_big_card', 'block_player_recommend_list', 'block_player_recommend_home'], block_player_recommend_cards: ['block_player_recommend_big_card', 'block_player_recommend_list', 'block_player_recommend_home'], block_gift_activity: ['block_gift_lucky_burst', 'block_gift_game_recommend', 'block_gift_box', 'block_gift_hot_promote', 'block_gift_cart_activity', 'block_gift_confession_activity', 'block_gift_activity_countdown', 'block_gift_activity_benefit_tips', 'block_gift_more_activity', 'block_gift_recharge', 'block_gift_package', 'block_gift_guard', 'block_gift_noble'], block_gift_activity_icons: ['block_gift_cart_activity', 'block_gift_confession_activity'], block_gift_bar_full: ['block_gift_lucky_burst', 'block_gift_game_recommend', 'block_gift_box', 'block_gift_hot_promote', 'block_gift_cart_activity', 'block_gift_confession_activity', 'block_gift_activity_countdown', 'block_gift_activity_benefit_tips', 'block_gift_more_activity', 'block_gift_week_star', 'block_gift_face_list', 'block_gift_face_detail', 'block_gift_face_arrow', 'block_gift_first_charge', 'block_gift_recharge', 'block_gift_package', 'block_gift_guard', 'block_gift_noble'], block_gift_quick_bar: ['block_gift_lucky_burst', 'block_gift_game_recommend', 'block_gift_box', 'block_gift_hot_promote', 'block_gift_cart_activity', 'block_gift_confession_activity', 'block_gift_more_activity'], block_gift_charge: ['block_gift_first_charge', 'block_gift_recharge', 'block_gift_package', 'block_gift_guard', 'block_gift_noble'], block_room_below_info: ['block_room_below_match_cms', 'block_room_below_profile', 'block_room_below_recommend', 'block_room_below_recommend_detail', 'block_room_below_moments_nav', 'block_room_below_moments_content', 'block_room_below_union', 'block_room_below_you_like', 'block_room_below_category_recommend', 'block_room_below_category_detail'] }; const LEGACY_CONTROL_BLOCK_KEYS = new Set(Object.keys(LEGACY_CONTROL_BLOCK_MIGRATIONS)); const INTERNAL_CONTROL_BLOCK_KEYS = new Set(['block_header_game_promo', 'block_header_activity_promo', 'block_player_popup_ad', 'block_player_ad_embed']); const ACTIVE_CONTROL_BLOCKS = CONTROL_BLOCKS.filter(item => !LEGACY_CONTROL_BLOCK_KEYS.has(item.key)); const ACTIVE_CONTROL_BLOCK_KEYS = new Set(ACTIVE_CONTROL_BLOCKS.map(item => item.key)); const INTERNAL_CONTROL_BLOCKS = ACTIVE_CONTROL_BLOCKS.filter(item => INTERNAL_CONTROL_BLOCK_KEYS.has(item.key)); const PUBLIC_CONTROL_BLOCKS = ACTIVE_CONTROL_BLOCKS.filter(item => !INTERNAL_CONTROL_BLOCK_KEYS.has(item.key)); const PUBLIC_CONTROL_BLOCK_KEYS = new Set(PUBLIC_CONTROL_BLOCKS.map(item => item.key)); const DYNAMIC_CONTROL_GROUP_SPECS = [ { prefixes: ['header_'], mark: markHeaderDynamicControls }, { names: ['room_match_label', 'room_id', 'room_viewer_count', 'room_category'], mark: markRoomHeaderDynamicControls }, { prefixes: ['sidebar_rank_'], mark: markSidebarRankDynamicControls }, { names: ['sidebar_match_notice'], prefixes: ['sidebar_chat_'], mark: markSidebarDynamicControls }, { names: ['player_network_notice', 'player_latency_notice', 'player_reconnect_notice', 'player_pause_loading_notice', 'player_quality_qrcode_notice'], mark: markPlayerStatusDynamicControls }, { names: ['player_popup_ad'], mark: markPlayerAdDynamicControls }, { prefixes: ['gift_'], mark: markGiftDynamicControls }, { prefixes: ['room_below_recommend_'], mark: markBelowRecommendDynamicControls }, { prefixes: ['room_below_category_recommend_'], mark: markBelowCategoryRecommendDynamicControls } ]; const DYNAMIC_CONTROL_GROUPS = DYNAMIC_CONTROL_GROUP_SPECS.map(spec => ({ mark: spec.mark, keys: ACTIVE_CONTROL_BLOCKS .filter(item => item.selectors.some(selector => { const match = String(selector).match(/\[data-hy-cb="([^"]+)"\]/); if (!match) return false; const name = match[1]; return (spec.names && spec.names.includes(name)) || (spec.prefixes && spec.prefixes.some(prefix => name.startsWith(prefix))); })) .map(item => item.key) })).filter(group => group.keys.length); const DYNAMIC_CONTROL_BLOCK_KEYS = new Set(); DYNAMIC_CONTROL_GROUPS.forEach(group => { group.keys.forEach(key => DYNAMIC_CONTROL_BLOCK_KEYS.add(key)); }); function normalizeControlPresetKeys(keys) { const uniqueKeys = Array.from(new Set(keys)); const missingKeys = uniqueKeys.filter(key => !PUBLIC_CONTROL_BLOCK_KEYS.has(key)); if (missingKeys.length) console.warn('[HY] 推荐配置包含未知控件 key:', missingKeys.join(', ')); return uniqueKeys.filter(key => PUBLIC_CONTROL_BLOCK_KEYS.has(key)); } function normalizeSecretControlKeys(keys) { const uniqueKeys = Array.from(new Set(keys)); return uniqueKeys.filter(key => ACTIVE_CONTROL_BLOCK_KEYS.has(key)); } // 推荐配置:按干扰类型分组,用户按需选择 const SECRET_CONTROL_BLOCK_KEYS = normalizeSecretControlKeys([ 'block_header_game_promo', 'block_header_activity_promo', 'block_player_popup_ad' ]); // 去广告:屏蔽游戏推广、活动入口、弹窗广告、下载引导 const CONTROL_PRESET_AD_KEYS = normalizeControlPresetKeys([ 'block_header_game_promo', 'block_header_activity_promo', 'block_header_start_live', 'block_header_download', 'block_header_task', 'block_player_popup_ad', 'block_player_login_tip', 'block_player_download_tip', 'block_gift_lucky_burst', 'block_gift_game_recommend', 'block_gift_box', 'block_gift_hot_promote', 'block_gift_cart_activity', 'block_gift_confession_activity', 'block_gift_activity_countdown', 'block_gift_activity_benefit_tips', 'block_gift_more_activity', 'block_gift_recharge', 'block_gift_package' ]); // 去干扰:屏蔽礼物特效、活动倒计时、榜单刷屏、下方推荐 const CONTROL_PRESET_DISTURB_KEYS = normalizeControlPresetKeys([ 'block_gift_week_star', 'block_gift_face_hover_detail', 'block_gift_face_combo_controls', 'block_gift_face_activity_badges_ext', 'block_room_banner', 'block_room_match_label', 'block_anchor_hour_rank', 'block_anchor_fans_rank', 'block_sidebar_rank_nav', 'block_sidebar_rank_content', 'block_sidebar_rank_detail', 'block_sidebar_rank_detail', 'block_sidebar_rank_detail', 'block_sidebar_rank_detail', 'block_sidebar_match_notice', 'block_room_below_match_cms', 'block_room_below_recommend', 'block_room_below_moments_nav', 'block_room_below_moments_content', 'block_room_below_union', 'block_room_below_you_like', 'block_room_below_category_recommend' ]); // 沉浸观看:仅收拢顶部和榜单干扰,默认不压播放器提示与推荐 const CONTROL_PRESET_IMMERSIVE_KEYS = normalizeControlPresetKeys([ 'block_header_nav_game', 'block_header_nav_trade', 'block_header_follow', 'block_header_history', ]); const CONTROL_PRESETS = []; const EXPERIENCE_MODES = []; const CLEAN_VIEW_GROUPS = []; const ONE_TIME_CONTROL_BLOCK_MIGRATIONS = [ { markerKey: '__migrated_block_gift_face_arrow_20260610', sourceKey: 'block_gift_face_list', childKeys: ['block_gift_face_arrow'] }, { markerKey: '__migrated_block_sidebar_chat_input_split_20260610', sourceKey: 'block_sidebar_chat_input', childKeys: ['block_sidebar_chat_textarea', 'block_sidebar_chat_emoji_button', 'block_sidebar_chat_quick_buttons', 'block_sidebar_chat_input_identity_entry', 'block_sidebar_chat_input_tips', 'block_sidebar_chat_send_button'] }, { markerKey: '__migrated_block_sidebar_chat_system_split_20260610', sourceKey: 'block_sidebar_chat_system_messages', childKeys: ['block_sidebar_chat_system_all'] }, { markerKey: '__migrated_block_sidebar_chat_interaction_split_20260611', sourceKey: 'block_sidebar_chat_system_messages', childKeys: ['block_sidebar_chat_system_all'] }, { markerKey: '__migrated_block_sidebar_chat_input_popovers_20260610', sourceKey: 'block_sidebar_chat_emoji_button', childKeys: ['block_sidebar_chat_emoji_panel'] }, { markerKey: '__migrated_block_sidebar_chat_quick_popovers_20260610', sourceKey: 'block_sidebar_chat_quick_buttons', childKeys: ['block_sidebar_chat_quick_reply_panel', 'block_sidebar_chat_tool_popover'] }, { markerKey: '__migrated_block_sidebar_chat_identity_popover_20260610', sourceKey: 'block_sidebar_chat_input_identity_entry', childKeys: ['block_sidebar_chat_identity_panel'] }, { markerKey: '__migrated_block_sidebar_chat_login_permission_tip_20260610', sourceKey: 'block_sidebar_chat_input_tips', childKeys: ['block_sidebar_chat_login_permission_tip'] } ]; let controlBlockStyleEl = null; let lastControlBlockKeySignature = ''; let lastControlBlockCss = ''; let lastDynamicControlKeySignature = ''; let lastDynamicMarkAt = 0; let lastKeepVisibleMarkAt = 0; let pendingDynamicMarkTimer = null; let hasDynamicControlMarks = false; let hasKeepVisibleMarks = false; const controlBlockCssCache = new Map(); const DYNAMIC_CONTROL_ATTR = 'data-hy-cb'; const KEEP_VISIBLE_ATTR = 'data-hy-kv'; const KEEP_VISIBLE_SELECTOR = '[' + KEEP_VISIBLE_ATTR + ']'; function getJQ() { return _w.jQuery || _w.$ || window.jQuery || window.$; } loadStore(); migrateLegacyControlBlocks(); detectTheme(); injectUICSS(); setupStorageSync(); // === 20-init.js === // 20-init.js 初始化入口 let domInited = false; function initDOM() { if (domInited) return; domInited = true; // 核心功能优先执行 applyAll(); connectObserver(); hookSPA(); // 画质解锁懒加载:只在用户设置了画质时才初始化 QualityUnlocker.onListChange = updateQualityOptions; if (!document.hidden && isScriptEnabled() && getVal('quality_mode', 'off') !== 'off') { // 等页面基本加载完再初始化画质 setTimeout(() => { if (!document.hidden && isScriptEnabled() && getVal('quality_mode', 'off') !== 'off') { QualityUnlocker.waitForPlayer(); } }, 2000); } // UI 面板延迟到浏览器空闲时创建,并确保 body 已经可用 const safeCreateUI = () => { if (!document.body) return; createUI(); try { if (typeof GM_registerMenuCommand === 'function') GM_registerMenuCommand('打开设置', openPanel); else { window.__gmMenus = window.__gmMenus || {}; window.__gmMenus['打开设置'] = openPanel; } } catch (e) {} }; if (typeof requestIdleCallback === 'function') { requestIdleCallback(safeCreateUI, { timeout: 2000 }); } else { setTimeout(safeCreateUI, 300); } if (window.matchMedia) { const mql = window.matchMedia('(prefers-color-scheme: light)'); const onThemeChange = () => detectTheme(); if (mql.addEventListener) mql.addEventListener('change', onThemeChange); else if (mql.addListener) mql.addListener(onThemeChange); } } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initDOM); else initDOM(); })();