NGA优化摸鱼体验

NGA论坛显示优化,功能增强,防止突然蹦出一对??而导致的突然性的社会死亡

目前為 2020-12-09 提交的版本,檢視 最新版本

// ==UserScript==
// @name         NGA优化摸鱼体验
// @namespace    https://github.com/kisshang1993/NGA-BBS-Script
// @version      3.5
// @author       HLD
// @description  NGA论坛显示优化,功能增强,防止突然蹦出一对??而导致的突然性的社会死亡
// @license      MIT
// @require      https://cdn.staticfile.org/jquery/3.4.0/jquery.min.js
// @require      https://cdn.staticfile.org/spectrum/1.8.0/spectrum.js
// @icon         https://s1.ax1x.com/2020/06/28/N25WBF.png
// @match        *://bbs.nga.cn/*
// @match        *://ngabbs.com/*
// @match        *://nga.178.com/*
// @inject-into content
// ==/UserScript==
(function () {
    'use strict';

    const defaultShortcut = [81, 87, 69, 37, 39, 82, 84, 66]
    let setting = {
        hideAvatar: true,
        hideSmile: true,
        hideImage: false,
        imgEnhance: true,
        hideSign: true,
        hideHeader: true,
        excelMode: false,
        foldQuote: true,
        linkTargetBlank: false,
        imgResize: true,
        authorMark: true,
        autoPage: true,
        keywordsBlock: true,
        markAndBan: true,
        shortcutKeys: defaultShortcut
    }
    let advancedSetting = {
        dynamicEnable: true,
        banStrictMode: 'REMOVE',
        kwdWithoutTitle: false,
        hideCustomBg: false,
        autoPageOffset: 5,
        excelNoMode: true,
        excelTitle: '工作簿1',
        authorMarkColor: '#FF0000',
        imgResizeWidth: 200,
        foldQuoteHeight: 300,
        classicRemark: false,
        autoHideBanIcon: false
    }
    let postAuthor = []
    let banList = []
    let markList = []
    let keywordsList = []
    let beforeUrl = window.location.href
    let $window = $(window)

    const shortcutName = ['隐藏头像', '隐藏表情', '隐藏图片', '楼内上一张图', '楼内下一张图', '切换Excel模式', '返回顶部', '跳转尾页']
    const shortcutCode = {
        'A': 65, 'B': 66, 'C': 67, 'D': 68, 'E': 69, 'F': 70, 'G': 71,
        'H': 72, 'I': 73, 'J': 74, 'K': 75, 'L': 76, 'M': 77, 'N': 78,
        'O': 79, 'P': 80, 'Q': 81, 'R': 82, 'S': 83, 'T': 84,
        'U': 85, 'V': 86, 'W': 87, 'X': 88, 'Y': 89, 'Z': 90,
        '0': 48, '1': 49, '2': 50, '3': 51, '4': 52, '5': 53, '6': 54, '7': 55, '8': 56, '9': 57,
        'LEFT': 37, 'RIGHT': 39, 'UP': 38, 'DOWN': 40, '': 0
    }
    const getCodeName = (code) => {
        let keyname = ''
        for (let [n, c] of Object.entries(shortcutCode)) {
            c == code && (keyname = n)
        }
        return keyname
    }

    const colorPickerConfig = {
        type: 'color',
        preferredFormat: 'hex',
        showPaletteOnly: 'true',
        togglePaletteOnly: 'true',
        hideAfterPaletteSelect: 'true',
        showAlpha: 'false',
        togglePaletteMoreText: '更多选项',
        togglePaletteLessText: '隐藏',
        palette: [
            ['#000000','#444444','#5b5b5b','#999999','#bcbcbc','#eeeeee','#f3f6f4','#ffffff'],
            ['#f44336','#744700','#ce7e00','#8fce00','#2986cc','#16537e','#6a329f','#c90076'],
            ['#f4cccc','#fce5cd','#fff2cc','#d9ead3','#d0e0e3','#cfe2f3','#d9d2e9','#ead1dc'],
            ['#ea9999','#f9cb9c','#ffe599','#b6d7a8','#a2c4c9','#9fc5e8','#b4a7d6','#d5a6bd'],
            ['#e06666','#f6b26b','#ffd966','#93c47d','#76a5af','#6fa8dc','#8e7cc3','#c27ba0'],
            ['#cc0000','#e69138','#f1c232','#6aa84f','#45818e','#3d85c6','#674ea7','#a64d79'],
            ['#990000','#b45f06','#bf9000','#38761d','#134f5c','#0b5394','#351c75','#741b47'],
            ['#660000','#783f04','#7f6000','#274e13','#0c343d','#073763','#20124d','#4c1130']
        ]
    }

    //检查更新
    if (window.localStorage.getItem('hld__NGA_version')) {
        const current_version = +window.localStorage.getItem('hld__NGA_version')
        if (GM_info.script.version > current_version) {
            const focus = ''
            $('body').append(`<div id="hld__updated" class="animated-1s bounce"><p><a href="javascript:void(0)" class="hld__setting-close">×</a><b>NGA优化摸鱼插件已更新至v${GM_info.script.version}</b></p>${focus}<p><a class="hld__readme" href="https://gf.qytechs.cn/zh-CN/scripts/393991-nga%E4%BC%98%E5%8C%96%E6%91%B8%E9%B1%BC%E4%BD%93%E9%AA%8C" target="_blank">查看更新内容</a></p></div>`)
            $('body').on('click', '#hld__updated a', function () {
                $(this).parents('#hld__updated').remove()
                window.localStorage.setItem('hld__NGA_version', GM_info.script.version)
            })
        }
    } else window.localStorage.setItem('hld__NGA_version', GM_info.script.version)
    //同步配置
    //基础设置
    if (window.localStorage.getItem('hld__NGA_setting')) {
        let localSetting = JSON.parse(window.localStorage.getItem('hld__NGA_setting'))
        for (let k in setting) {
            !localSetting.hasOwnProperty(k) && (localSetting[k] = setting[k])
            if (k == 'shortcutKeys') {
                if (localSetting[k].length < setting[k].length) {
                    const offset_count = setting[k].length - localSetting[k].length
                    localSetting[k] = localSetting[k].concat(setting[k].slice(-offset_count))
                }
            }
        }
        for (let k in localSetting) {
            !setting.hasOwnProperty(k) && delete localSetting[k]
        }
        setting = localSetting
    }
    //高级设置
    if (window.localStorage.getItem('hld__NGA_advanced_setting')) {
        let localAdvancedSetting = JSON.parse(window.localStorage.getItem('hld__NGA_advanced_setting'))
        for (let k in advancedSetting) {
            !localAdvancedSetting.hasOwnProperty(k) && (localAdvancedSetting[k] = advancedSetting[k])
        }
        for (let k in localAdvancedSetting) {
            !advancedSetting.hasOwnProperty(k) && delete localAdvancedSetting[k]
        }
        advancedSetting = localAdvancedSetting
    }
    //同步列表
    const localKeywordsList = window.localStorage.getItem('hld__NGA_keywords_list')
    localKeywordsList && (keywordsList = localKeywordsList.split(','))
    const localBanList = window.localStorage.getItem('hld__NGA_ban_list')
    if(localBanList) {
        try {
            banList = JSON.parse(localBanList)
        } catch (error) {
            //3.3版本升级数据格式转换
            const t = localBanList.split(',')
            if (t) {
                t.forEach(item => banList.push({name: item, uid: ''}))
                window.localStorage.setItem('hld__NGA_ban_list', JSON.stringify(banList))
                window.localStorage.setItem('hld__NGA_ban_list', localBanList)
            }
        }
    }
    const localMarkList = window.localStorage.getItem('hld__NGA_mark_list')
    if(localMarkList) {
        try {
            markList = JSON.parse(localMarkList)
        } catch (error) {
            const mark_list_str_obj = localMarkList.split(',')
            mark_list_str_obj.forEach(item => {
                const name = item.split(':')[0]
                const markStr = item.split(':')[1]
                let markObj = {name, uid: '', marks: []}
                const r_l = markStr.split('&')
                r_l.forEach(item => {
                    let marks = {}
                    const f = item.split('(')
                    marks.mark = f[0]
                    if(f.length > 1) {
                        const g = f[1].substring(0, f[1].length - 1)
                        marks.text_color = g.split('^')[0]
                        marks.bg_color = g.split('^')[1]
                    }
                    markObj.marks.push(marks)
                });
                markList.push(markObj)
            })
            window.localStorage.setItem('hld__NGA_mark_list', JSON.stringify(markList))
            window.localStorage.setItem('hld__NGA_mark_list_bak', localMarkList)
        }
    }
    //注册(不可用)按键
    $('body').keyup(function (event) {
        if (/textarea|select|input/i.test(event.target.nodeName)
            || /text|password|number|email|url|range|date|month/i.test(event.target.type)) {
            return;
        }
        //切换显示头像
        if ((setting.hideAvatar || advancedSetting.dynamicEnable) && event.keyCode == setting.shortcutKeys[0]) {
            $('.avatar').toggle()
            popNotification(`${$('.avatar:hidden').length == 0 ? '显示' : '隐藏'}头像`)
        }
        //切换显示表情
        if ((setting.hideSmile || advancedSetting.dynamicEnable) && event.keyCode == setting.shortcutKeys[1]) {
            $('img').each(function () {
                const classs = $(this).attr('class');
                if (classs && classs.includes('smile')) $(this).toggle()
            })
            $('.smile_alt_text').toggle()
            popNotification(`${$('.smile_alt_text:hidden').length > 0 ? '显示' : '隐藏'}表情`)
        }
        //切换显示图片
        if ((setting.hideImage || advancedSetting.dynamicEnable) && event.keyCode == setting.shortcutKeys[2]) {
            if ($('.hld__img-resize:hidden').length < $('.switch-img').length) {
                $('.hld__img-resize').hide()
                $('.switch-img').text('图').show()
                popNotification(`隐藏图片`)
                return
            }
            $('.hld__img-resize').each(function () {
                $(this).toggle()
                $(this).is(':hidden') ? $(this).next('button.switch-img').show() : $(this).next('button.switch-img').hide()
            })
            popNotification(`${$('.switch-img:hidden').length > 0 ? '显示' : '隐藏'}图片`)
        }
        //关闭大图
        if (event.keyCode == 27) {
            if ($('#hld__img_full').length > 0) {
                $('#hld__img_full').remove()
            }
        }
        //上一张图片
        if (event.keyCode == setting.shortcutKeys[3]) {
            if ($('#hld__img_full').length > 0) {
                $('#hld__img_full .prev-img').click()
            }
        }
        //下一张图片
        if (event.keyCode == setting.shortcutKeys[4]) {
            if ($('#hld__img_full').length > 0) {
                $('#hld__img_full .next-img').click()
            }
        }
        //Excel模式
        if ((setting.excelMode || advancedSetting.dynamicEnable) && event.keyCode == setting.shortcutKeys[5]) {
            switchExcelMode()
            popNotification($('.hld__excel-body').length > 0 ? 'Excel模式' : '普通模式')
        }
        //返回顶部
        if (event.keyCode == setting.shortcutKeys[6]) {
            $('#hld__jump_top').click()
            popNotification('返回顶部')
        }
        //最后一页
        if (event.keyCode == setting.shortcutKeys[7]) {
            $('#hld__jump_bottom').click()
            popNotification('最后一页')
        }
    })
    //自动翻页
    setting.autoPage && $('body').addClass('hld__reply-fixed')
    //Excel
    $('body').append('<div class="hld__excel-div hld__excel-header"><img src="https://s1.ax1x.com/2020/06/28/N25bjK.png"></div>')
    $('body').append('<div class="hld__excel-div hld__excel-footer"><img src="https://s1.ax1x.com/2020/06/28/N2I93t.jpg"></div>')
    $('.hld__excel-header, .hld__excel-footer').append('【这里应该是一张仿造Excel的图片,如不显示,请刷新重试,如还不显示,请及时反馈!】')
    $('body').append('<div class="hld__excel-div hld__excel-setting"><img src="https://s1.ax1x.com/2020/06/28/N25WBF.png"><a id="hld__excel_setting" href="javascript:void(0)" title="打开NGA优化摸鱼插件设置面板">摸鱼</div>')
    $('#hld__excel_setting').click(()=>$('#hld__setting_cover').css('display', 'flex'))
    //扩展坞
    const $dockerDom = $(`<div class="hld__docker"><div class="hld__docker-sidebar"><svg t="1603961015993" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3634" width="64" height="64"><path d="M518.344359 824.050365c-7.879285 0-15.758569-2.967523-21.693614-9.004897l-281.403018-281.403018c-5.730389-5.730389-9.004897-13.609673-9.004897-21.693614s3.274508-15.963226 9.004897-21.693614l281.403018-281.403018c11.972419-11.972419 31.41481-11.972419 43.387229 0 11.972419 11.972419 11.972419 31.41481 0 43.387229L280.32857 511.948836l259.709403 259.709403c11.972419 11.972419 11.972419 31.41481 0 43.387229C534.0006 821.082842 526.223643 824.050365 518.344359 824.050365z" p-id="3635" fill="#888888"></path><path d="M787.160987 772.88618c-7.879285 0-15.758569-2.967523-21.693614-9.004897l-230.238833-230.238833c-11.972419-11.972419-11.972419-31.41481 0-43.387229l230.238833-230.238833c11.972419-11.972419 31.41481-11.972419 43.387229 0 11.972419 11.972419 11.972419 31.41481 0 43.387229L600.309383 511.948836l208.545218 208.545218c11.972419 11.972419 11.972419 31.41481 0 43.387229C802.817228 769.918657 794.937943 772.88618 787.160987 772.88618z" p-id="3636" fill="#888888"></path></svg></div>
    <div class="hld__docker-btns">
    <div data-type="TOP" id="hld__jump_top"><svg t="1603962702679" title="返回顶部" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9013" width="64" height="64"><path d="M528.73 161.5c-9.39-9.38-24.6-9.38-33.99 0L319.65 336.59a24.028 24.028 0 0 0-7.05 23.59A24.04 24.04 0 0 0 330 377.6c8.56 2.17 17.62-0.52 23.6-7.02l158.14-158.14 158.1 158.14a23.901 23.901 0 0 0 17 7.09c6.39 0 12.5-2.55 17-7.09 9.38-9.39 9.38-24.61 0-34L528.73 161.5zM63.89 607.09h102.79V869.5h48.04V607.09h102.79v-48.04H63.89v48.04z m518.69-48.05h-127.3c-15.37 0-30.75 5.85-42.49 17.59a59.846 59.846 0 0 0-17.59 42.49v190.3c0 15.37 5.89 30.75 17.59 42.49 11.74 11.74 27.12 17.59 42.49 17.59h127.3c15.37 0 30.75-5.85 42.49-17.59 11.7-11.74 17.59-27.12 17.59-42.49V619.17a59.903 59.903 0 0 0-17.53-42.55 59.912 59.912 0 0 0-42.55-17.54v-0.04z m12 250.38c0 2.31-0.6 5.59-3.5 8.54a11.785 11.785 0 0 1-8.5 3.5h-127.3c-3.2 0.02-6.26-1.26-8.5-3.54a11.785 11.785 0 0 1-3.5-8.5V619.17c0-2.31 0.6-5.59 3.5-8.54 2.24-2.27 5.31-3.53 8.5-3.5h127.3c2.27 0 5.55 0.64 8.5 3.55 2.27 2.24 3.53 5.31 3.5 8.5v190.29-0.05z m347.4-232.78a59.846 59.846 0 0 0-42.49-17.59H734.74V869.5h48.04V733.32h116.71a59.94 59.94 0 0 0 42.54-17.55 59.923 59.923 0 0 0 17.55-42.54v-54.07c0-15.37-5.85-30.74-17.59-42.49v-0.03z m-30.44 96.64c0 2.26-0.64 5.55-3.55 8.5a11.785 11.785 0 0 1-8.5 3.5H782.78v-78.15h116.71c2.27 0 5.59 0.6 8.54 3.5 2.27 2.24 3.53 5.31 3.5 8.5v54.15z m0 0" p-id="9014" fill="#591804"></path></svg></div>
    <div data-type="BOTTOM" id="hld__jump_bottom"><svg t="1603962680160" title="跳转至最后一页" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7501" width="64" height="64"><path d="M792.855 465.806c-6.24-6.208-14.369-9.312-22.56-9.312s-16.447 3.169-22.688 9.44l-207.91 207.74v-565.28c0-17.697-14.336-32-32-32s-32.002 14.303-32.002 32v563.712l-206.24-206.164c-6.271-6.209-14.432-9.344-22.624-9.344-8.224 0-16.417 3.135-22.656 9.407-12.511 12.513-12.48 32.768 0.032 45.248L483.536 770.38c3.265 3.263 7.104 5.6 11.136 7.135 4 1.793 8.352 2.88 13.024 2.88 1.12 0 2.08-0.544 3.2-0.64 8.288 0.064 16.608-3.009 22.976-9.408l259.11-259.292c12.48-12.511 12.448-32.8-0.127-45.248z m99.706 409.725c0 17.665-14.303 32.001-31.999 32.001h-704c-17.665 0-32-14.334-32-31.999s14.335-32 32-32h704c17.696 0 32 14.334 32 31.998z" p-id="7502" fill="#591804"></path></svg></div></div></div>`)
    $('body').append($dockerDom)
    $('body').on('click', '.hld__docker-btns>div', function () {
        const type = $(this).data('type')
        if (type == 'TOP') {
            const $nav_link = $('#m_nav a.nav_link')
            if ($nav_link.length > 0) {
                $nav_link[$nav_link.length-1].click()
            }
        }
        if (type == 'BOTTOM') {
            let currentUrl = window.location.href
            let queryset = getQuerySet()
            queryset.page = 9999
            let search = ''
            for (let key in queryset) {
                search += `${search == '' ? '?' : '&'}${key}=${queryset[key]}`
            }
            window.location.href = `${window.location.origin}${window.location.pathname}${search}`
        }
    })

    //快捷键-列表维护
    $('body').on('click', '#hld__shortcut_manage', function () {
        if($('#hld__shortcut_panel').length > 0) return
        let $shortcutPanel = $(`<div id="hld__shortcut_panel" class="hld__list-panel animated fadeInUp">
        <a href="javascript:void(0)" class="hld__setting-close">×</a>
        <div>
        <div><p>编辑快捷键</p><div class="hld__float-left"><table class="hld__table hld__table-keyword"><thead><tr><td>功能</td><td width="60">快捷键</td></tr></thead>
        <tbody></tbody></table></div><div class="hld__float-left hld__shortcut-desc"><p><b>支持的快捷键范围</b></p><p>键盘 <code>A</code>~<code>Z</code></p><p>左箭头 <code>LEFT</code></p><p>右箭头 <code>RIGHT</code></p><p>上箭头 <code>UP</code></p><p>下箭头 <code>DOWN</code></p><p><i>* 留空则取消快捷键</i></p><br><p>如按键异常请尝试重置按键</p>
        </div>
        <div class="clearfix"></div></div>
        </div>
        <div class="hld__btn-groups">
        <button class="hld__btn" data-type="reset_shortcut">重置按键</button>
        <button class="hld__btn" data-type="save_shortcut">保存快捷键</button>
        </div>
        </div>`)
        for (let [index, sn] of shortcutName.entries()) {
            const keycode = setting.shortcutKeys[index]
            $shortcutPanel.find('.hld__table tbody').append(`<tr><td>${sn}</td><td><input type="text" value="${getCodeName(keycode)}"></td></tr>`)
        }
        $('#hld__setting_cover').append($shortcutPanel)
    })

    //拉黑标签-列表维护
    if (setting.markAndBan) {
        //绑定事件
        $('body').on('click', '.hld__extra-icon', function () {
            const type = $(this).data('type')
            const name = $(this).data('name')
            const uid = $(this).data('uid') + ''
            $('.hld__dialog').length > 0 && $('.hld__dialog').remove()
            if (type == 'ban') {
                banlistPopup({
                    type: 'confirm',
                    name,
                    uid,
                    top: $(this).offset().top+20,
                    left: $(this).offset().left-10
                })
            }
            if (type == 'mark') {
                userMarkPopup({
                    name,
                    uid,
                    top: $(this).offset().top+20,
                    left: $(this).offset().left-10
                })
            }
        })
    }
    //关键字管理
    $('body').on('click', '#hld__keywords_manage', function () {
        if($('#hld__keywords_panel').length > 0) return
        $('#hld__setting_cover').append(`<div id="hld__keywords_panel" class="hld__list-panel animated fadeInUp">
        <a href="javascript:void(0)" class="hld__setting-close">×</a>
        <div>
        <div class="hld__list-c"><p>屏蔽关键字</p><textarea row="20" id="hld__keywords_list_textarea"></textarea><p class="hld__list-desc">一行一条</p></div>
        </div>
        <div class="hld__btn-groups"><button class="hld__btn" data-type="save_keywords">保存列表</button></div>
        </div>`)
        $('#hld__keywords_list_textarea').val(keywordsList.join('\n'))
    })
    //名单管理
    $('body').on('click', '#hld__list_manage', function () {
        if($('#hld__banlist_panel').length > 0) return
        $('#hld__setting_cover').append(`<div id="hld__banlist_panel"  class="hld__list-panel animated fadeInUp">
        <a href="javascript:void(0)" class="hld__setting-close">×</a>
        <div class="hld__tab-header"><span class="hld__table-active">简易模式</span><span>原始数据</span></div>
        <div class="hld__tab-content hld__format-list hld__table-active">
        <div class="hld__list-c"><p>黑名单</p>
        <div class="hld__scroll-area">
        <table class="hld__table hld__table-banlist">
        <thead><tr><th width="175">用户名</th><th>UID</th><th width="25">操作</th></tr></thead><tbody id="hld__banlist"></tbody></table>
        </div>
        <div class="hld__table-banlist-buttons"><button id="hld__banlist_add_btn" class="hld__btn">+添加用户</button></div>
        </div>
        <div class="hld__list-c"><p>标签名单</p>
        <div class="hld__scroll-area">
        <table class="hld__table hld__table-banlist">
        <thead><tr><th width="100">用户名</th><th>UID</th><th width="50">标签数</th><th width="50">操作</th></tr></thead><tbody id="hld__marklist"></tbody></table>
        </div>
        <div class="hld__table-banlist-buttons"><button id="hld__marklist_add_btn" class="hld__btn">+添加用户</button></div>
        </div>
        </div>
        <div class="hld__tab-content hld__source-list">
        <div class="hld__list-c"><p>黑名单</p><textarea row="20" id="hld__ban_list_textarea"></textarea><p class="hld__list-desc" title='[{\n    "uid": "UID",\n    "name": "用户名"\n  }, ...]'>查看数据结构</p></div>
        <div class="hld__list-c"><p>标签名单</p><textarea row="20" id="hld__mark_list_textarea"></textarea><p class="hld__list-desc" title='[{\n    "uid": "UID",\n    "name": "用户名",\n    "marks": [{\n        "mark": "标记",\n        "text_color": "文字色",\n        "bg_color": "背景色"\n    }, ...]\n  }, ...]'>查看数据结构</p></div>
        <div class="hld__btn-groups" style="width: 100%;"><button class="hld__btn" data-type="save_banlist">保存列表</button></div>
        </div>
        </div>`)
        //切换选项卡
        $('body').on('click', '.hld__tab-header > span', function(){
            $('.hld__tab-header > span, .hld__tab-content').removeClass('hld__table-active')
            $(this).addClass('hld__table-active')
            $('.hld__tab-content').eq($(this).index()).addClass('hld__table-active')
        })
        //移除黑名单用户
        $('body').on('click', '.hld__bl-del', function(){
            const index = $(this).data('index')
            banList.splice(index, 1)
            window.localStorage.setItem('hld__NGA_ban_list', JSON.stringify(banList))
            reloadBanlist()
        })
        //添加黑名单用户
        $('body').on('click', '#hld__banlist_add_btn', function(){
            banlistPopup({
                type: 'add',
                name: $(this).data('name'),
                uid: $(this).data('uid'),
                top: $(this).offset().top + 30,
                left: $(this).offset().left - 5,
                callback: () => {reloadBanlist()}
            })
        })
        //修改标记
        $('body').on('click', '.hld__ml-edit', function(){
            const name = $(this).data('name')
            const uid = $(this).data('uid') + ''
            userMarkPopup({
                name,
                uid,
                top: $(this).offset().top + 30,
                left: $(this).offset().left - 5,
                callback: () => {reloadMarklist()}
            })
        })
        //删除标记
        $('body').on('click', '.hld__ml-del', function(){
            const index = $(this).data('index')
            markList.splice(index, 1)
            window.localStorage.setItem('hld__NGA_mark_list', JSON.stringify(markList))
            reloadMarklist()
        })
        //添加标记
        $('body').on('click', '#hld__marklist_add_btn', function(){
            userMarkPopup({
                type: 'add',
                name: $(this).data('name'),
                uid: $(this).data('uid'),
                top: $(this).offset().top + 30,
                left: $(this).offset().left - 5,
                callback: () => {reloadMarklist()}
            })
        })
        //重载名单
        reloadBanlist()
        reloadMarklist()
    })
    //集中面板按钮响应
    $('body').on('click', '.hld__btn', function () {
        const type = $(this).data('type')
        if(!type) return
        if (type == 'save_keywords') {
            let keywordsList = $('#hld__keywords_list_textarea').val().split('\n')
            keywordsList = removeBlank(keywordsList)
            keywordsList = uniq(keywordsList)
            window.localStorage.setItem('hld__NGA_keywords_list', keywordsList.join(','))
        }
        if (type == 'save_banlist') {
            const banList = $('#hld__ban_list_textarea').val()
            const markList = $('#hld__mark_list_textarea').val()
            window.localStorage.setItem('hld__NGA_ban_list', banList)
            window.localStorage.setItem('hld__NGA_mark_list', markList)
            //重载名单
            reloadBanlist()
            reloadMarklist()
        }
        if (type == 'reset_shortcut') {
            setting.shortcutKeys = defaultShortcut
            window.localStorage.setItem('hld__NGA_setting', JSON.stringify(setting))
            popMsg('重置成功,刷新页面生效')
        }
        if (type == 'save_shortcut') {
            let shortcutKeys = []
            $('.hld__table tbody>tr').each(function () {
                const v = $(this).find('input').val().trim().toUpperCase()
                if (Object.keys(shortcutCode).includes(v)) shortcutKeys.push(shortcutCode[v])
                else popMsg(`${v}是个无效的快捷键`)
            })
            if (shortcutKeys.length != setting.shortcutKeys.length) return
            setting.shortcutKeys = shortcutKeys
            window.localStorage.setItem('hld__NGA_setting', JSON.stringify(setting))
            popMsg('保存成功,刷新页面生效')
        }
        $('.hld__list-panel').remove()
    })
    $('body').on('click', '.hld__list-panel .hld__setting-close', function () {
        $(this).parent().remove()
    })

    //动态检测
    setInterval(() => {
        alwaysDetect()
        isThreads() && renderThreads()
        isPosts() && renderPosts()
    }, 100)

    //持续监测
    const alwaysDetect = () => {
        //insert Menu
        if($('.hld__setting-box').length == 0) {
            $('#startmenu > tbody > tr > td.last').append('<div><div class="item hld__setting-box"></div></div>')
            let $entry = $('<a id="hld__setting" title="打开NGA优化摸鱼插件设置面板">NGA优化摸鱼插件设置</a>')
            $entry.click(()=>$('#hld__setting_cover').css('display', 'flex'))
            $('#hld__setting_close').click(()=>$('#hld__setting_cover').fadeOut(200))
            $('.hld__setting-box').append($entry)
        }
        if(setting.excelMode && window.location.href != beforeUrl) {
            beforeUrl = window.location.href
            if(beforeUrl.includes('thread.php') || beforeUrl.includes('read.php')) {
                $('.hld__excel-body').length == 0 && $('body').addClass('hld__excel-body')
            }else {
                $('.hld__excel-body').length > 0 && $('body').removeClass('hld__excel-body')
            }
        }
        if ($('.hld__excel-body').length > 0) {
            if (advancedSetting.excelTitle) {
                $(document).attr('title') != advancedSetting.excelTitle && $(document).attr('title', advancedSetting.excelTitle)
            }
            $('#hld__excel_icon').length == 0 && $('head').append('<link id= "hld__excel_icon" rel="shortcut icon" type="image/png" href="https://s1.ax1x.com/2020/06/28/N25Jpt.png" />')
        }
        //自动翻页
        if(setting.autoPage) {
            if($('#hld__next_page').length > 0) return
            $('#pagebbtm>.stdbtn[hld-auto-page!=ok] td').each(function(){
                if($(this).children('a').text() == '>') {
                    $(this).children('a').attr('id', 'hld__next_page')
                    $window.on('scroll.autoPage', function(){
                        const offset = +advancedSetting.autoPageOffset;
                        if ($(document).scrollTop() != 0 && ($(document).scrollTop() + $(window).height() >= $(document).height() * (1 - offset / 100))) {
                            if($('#hld__next_page').length > 0) {
                                console.warn('Auto Page')
                                document.getElementById('hld__next_page').click()
                                $('#hld__next_page').removeAttr('id')
                                $window.off('scroll.autoPage')
                            }
                        }
                    })
                }
            })
            $('#pagebbtm>.stdbtn').attr('hld-auto-page', 'ok')
        }
    }
    const isThreads = () => $('#m_threads').length > 0
    const isPosts = () => $('#m_posts').length > 0
    const switchExcelMode = () => {
        $('body').toggleClass('hld__excel-body')
        !advancedSetting.excelNoMode && $('body').addClass('hld__excel-original-no')
    }
    if(setting.excelMode) {
        if(beforeUrl.includes('thread.php') || beforeUrl.includes('read.php')) switchExcelMode()
    }
    //论坛列表
    const renderThreads = () => {
        //隐藏版头
        if (setting.hideHeader && $('#hld__switch_header').length == 0) {
            $('#toppedtopic, #sub_forums').hide()
            let $toggleHeaderBtn = $('<button style="position: absolute;right: 16px;" id="hld__switch_header">切换显示版头</button>')
            $toggleHeaderBtn.click(() => $('#toppedtopic, #sub_forums').toggle())
            $('#toptopics > div > h3').append($toggleHeaderBtn)
        }
        if(setting.hideHeader && advancedSetting.hideCustomBg) {
            $('#custombg').hide()
            $('#mainmenu').css('margin', '0px')
        }
        $('.topicrow[hld-render!=ok]').each(function () {
            const title = $(this).find('.c2>a').text()
            const uid = ($(this).find('.author').attr('href') && $(this).find('.author').attr('href').indexOf('uid=') > -1) ? $(this).find('.author').attr('href').split('uid=')[1] + '' : ''
            const name = $(this).find('.author').text()
            if (setting.markAndBan) {
                const banUser = getBanUser({name, uid})
                //黑名单屏蔽
                if (banList.length > 0 && banUser) {
                    console.warn(`【NGA优化摸鱼体验脚本-黑名单屏蔽】标题:${title}  连接:${$(this).find('.c2>a').attr('href')}`)
                    $(this).parents('tbody').remove()
                }
                //标记
                if (markList.length > 0) {
                    const userMark = getUserMarks({name, uid})
                    if (userMark) {
                        let f = []
                        userMark.marks.forEach(e => f.push(e.mark))
                        $(this).find('.author').append(`<span class="hld__remark"> (${f.join(', ')}) </span>`)
                    }
                }
            }
            //关键字屏蔽
            if (!advancedSetting.kwdWithoutTitle && setting.keywordsBlock && keywordsList.length > 0) {
                for (let keyword of keywordsList) {
                    if (title.includes(keyword)) {
                        console.warn(`【NGA优化摸鱼体验脚本-关键字屏蔽】标题:${title}  连接:${$(this).find('.c2>a').attr('href')}`)
                        $(this).remove()
                        break
                    }
                }
            }
            //新页面打开链接
            if (setting.linkTargetBlank) {
                let $link = $(this).find('.topic')
                $link.data('href', $link.attr('href')).attr('href', 'javascript:void(0)')
                $link.click(() => {
                    window.open($link.data('href'))
                    return false
                })
            }
            //添加标志位
            $(this).attr('hld-render', 'ok')
        })

    }

    //论坛详情
    const renderPosts = () => {
        //标记楼主
        if (setting.authorMark) {
            const author = $('#postauthor0').text().replace('[楼主]', '')
            if (author && $('#hld__post-author').val() != author) {
                const localPostAuthor = window.localStorage.getItem('hld__NGA_post_author')
                localPostAuthor && (postAuthor = localPostAuthor.split(','))
                const tid = getQueryString('tid')
                if (tid) {
                    const authorStr = `${tid}:${author}`
                    if (!postAuthor.includes(authorStr))
                        postAuthor.unshift(authorStr) > 10 && postAuthor.pop()
                    window.localStorage.setItem('hld__NGA_post_author', postAuthor.join(','))
                }
                for (let pa of postAuthor) {
                    const t = pa.split(':')
                    if (t[0] == tid) {
                        if ($('#hld__post-author').length == 0) $('body').append(`<input type="hidden" value="${t[1]}" id="hld__post-author">`)
                        else $('#hld__post-author').val(t[1])
                        break
                    }
                }
            }
        }
        //回复列表
        $('.forumbox.postbox[hld-render!=ok]').each(function () {
            if ($(this).find('.small_colored_text_btn.block_txt_c2.stxt').length == 0) return true
            //excel 序号
            $(this).find('.postrow>td:first-child').before('<td class="c0"></td>')
            //关键字屏蔽
            if (setting.keywordsBlock && keywordsList.length > 0) {
                const $postcontent = $(this).find('.postcontent')
                const $postcontentClone = $postcontent.clone()
                const consoleLog = (text) => console.warn(`【NGA优化摸鱼体验脚本-关键字屏蔽】内容:${text}`)
                let postcontentQuote = ''
                let postcontentText = ''

                if ($postcontent.find('.quote').length > 0) {
                    $postcontentClone.find('.quote').remove()
                    let postcontentText = $postcontent.find('.quote').text()
                    const endIndex = postcontentText.indexOf(')')
                    postcontentQuote = postcontentText.substring(endIndex + 1)
                }

                postcontentText = $postcontentClone.text()

                for (let keyword of keywordsList) {
                    if (postcontentText && postcontentText.includes(keyword)) {
                        consoleLog(postcontentText)
                        $(this).remove()
                        break
                    }
                    if (postcontentQuote && postcontentQuote.includes(keyword)) {
                        consoleLog(postcontentQuote)
                        $postcontent.find('.quote').remove()
                    }
                }
                const $commentCList = $(this).find('.comment_c')
                if ($commentCList.length > 0) {
                    let postcontentReply = ''
                    $commentCList.each(function () {
                        let postcontentReplyText = $(this).find('.ubbcode').text()
                        const end_index = postcontentReplyText.indexOf(')')
                        postcontentReply = postcontentReplyText.substring(end_index + 1)
                        for (let keyword of keywordsList) {
                            if (postcontentReply && postcontentReply.includes(keyword)) {
                                consoleLog(postcontentReply)
                                $(this).remove()
                            }
                        }
                    })
                }
            }
            //隐藏头像
            setting.hideAvatar && $(this).find('.avatar').css('display', 'none')
            //隐藏表情
            $(this).find('img').each(function () {
                const classs = $(this).attr('class');
                if (classs && classs.includes('smile')) {
                    const alt = $(this).attr('alt')
                    const $alt = $('<span class="smile_alt_text">[' + alt + ']</span>')
                    setting.hideSmile ? $(this).hide() : $alt.hide()
                    $(this).after($alt)
                } else if (!classs && $(this).attr('onload')) {
                    $(this).attr('hld__imglist', 'ready')
                    if (setting.imgResize) {
                        $(this).addClass('hld__img-resize').attr('title', '点击大图显示')
                    }
                    let $imgB = $('<button class="switch-img" style="display:none">图</button>')
                    $imgB.on('click', function () {
                        $(this).prev('img').toggle()
                        $(this).text($(this).prev('img').is(':hidden') ? '图' : '隐藏')
                    })
                    $(this).removeAttr('onload')
                    if (setting.hideImage) {
                        $(this).hide();
                        $imgB.show()
                    }
                    $(this).after($imgB)
                }
            })
            //图片增强
            if (setting.imgEnhance) {
                $('#mc').on('click', '.postcontent img[hld__imglist=ready]', function () {
                    resizeImg($(this))
                    e.stopPropagation()
                    return false
                })
            }
            //隐藏签名
            setting.hideSign && $(this).find('.sign, .sigline').css('display', 'none')
            //添加拉黑标记菜单及功能
            if (setting.markAndBan) {
                const currentUid = $(this).find('[name=uid]').text() + ''
                $(this).find('.small_colored_text_btn.block_txt_c2.stxt').each(function () {
                    let currentName = ''
                    if ($(this).parents('td').prev('td').html() == '') {
                        currentName = $(this).parents('table').prev('.posterinfo').children('.author').text()
                    } else {
                        currentName = $(this).parents('td').prev('td').find('.author').text()
                    }
                    const mbDom = `<a class="hld__extra-icon" data-type="mark" title="标签此用户" data-name="${currentName}" data-uid="${currentUid}"><svg t="1578453291663" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15334" width="32" height="32"><path d="M978.488889 494.933333l-335.644445 477.866667-415.288888 45.511111c-45.511111 5.688889-91.022222-28.444444-102.4-73.955555L22.755556 540.444444 358.4 56.888889C398.222222 0 477.866667-11.377778 529.066667 28.444444l420.977777 295.822223c56.888889 39.822222 68.266667 113.777778 28.444445 170.666666zM187.733333 927.288889c5.688889 11.377778 17.066667 22.755556 28.444445 22.755555l386.844444-39.822222 318.577778-455.111111c22.755556-22.755556 17.066667-56.888889-11.377778-73.955555L489.244444 85.333333c-22.755556-17.066667-56.888889-11.377778-79.644444 11.377778l-318.577778 455.111111 96.711111 375.466667z" fill="#3970fe" p-id="15335" data-spm-anchor-id="a313x.7781069.0.i43" class="selected"></path><path d="M574.577778 745.244444c-56.888889 85.333333-176.355556 108.088889-261.688889 45.511112-85.333333-56.888889-108.088889-176.355556-45.511111-261.688889s176.355556-108.088889 261.688889-45.511111c85.333333 56.888889 102.4 176.355556 45.511111 261.688888z m-56.888889-39.822222c39.822222-56.888889 22.755556-130.844444-28.444445-170.666666s-130.844444-22.755556-170.666666 28.444444c-39.822222 56.888889-22.755556 130.844444 28.444444 170.666667s130.844444 22.755556 170.666667-28.444445z" fill="#3970fe" p-id="15336" data-spm-anchor-id="a313x.7781069.0.i44" class="selected"></path></svg></a><a class="hld__extra-icon" title="拉黑此用户(屏蔽所有言论)" data-type="ban"  data-name="${currentName}" data-uid="${currentUid}"><svg t="1578452808565" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9668" data-spm-anchor-id="a313x.7781069.0.i27" width="32" height="32"><path d="M512 1024A512 512 0 1 1 512 0a512 512 0 0 1 0 1024z m0-146.285714A365.714286 365.714286 0 1 0 512 146.285714a365.714286 365.714286 0 0 0 0 731.428572z" fill="#a20106" p-id="9669" data-spm-anchor-id="a313x.7781069.0.i28" class="selected"></path><path d="M828.708571 329.142857l-633.417142 365.714286 633.417142-365.714286z m63.341715-36.571428a73.142857 73.142857 0 0 1-26.770286 99.913142l-633.417143 365.714286a73.142857 73.142857 0 0 1-73.142857-126.683428l633.417143-365.714286A73.142857 73.142857 0 0 1 892.050286 292.571429z" fill="#a20106" p-id="9670" data-spm-anchor-id="a313x.7781069.0.i31" class="selected"></path></svg></a>`
                    advancedSetting.autoHideBanIcon ? $(this).after(`<span class="hld__extra-icon-box">${mbDom}</span>`) : $(this).append(mbDom)
                })
            }
            //自动折叠过长引用
            if (setting.foldQuote && $(this).find('.postcontent .quote').length > 0) {
                let $quote = $(this).find('.postcontent .quote')
                if ($quote.height() > (advancedSetting.foldQuoteHeight || 300)) {
                    const originalHeight = $quote.height()
                    $quote.addClass('hld__quote-fold')
                    const foldHeight = $quote.height()
                    const $openBtn = $(`<div class="hld__quote-box"><button>查看全部 (剩余${100-parseInt(foldHeight/originalHeight*100)}%)</button></div>`)
                    $openBtn.on('click', 'button', function(){
                        $(this).parent().remove()
                        $quote.removeClass('hld__quote-fold')
                    })
                    $quote.append($openBtn)
                }
            }
            //标记拉黑标签
            markDom($(this))
            //添加标志位
            $(this).attr('hld-render', 'ok')
        })
    }

    //大图
    const resizeImg = (el) => {
        if ($('#hld__img_full').length > 0) return
        let urlList = []
        let currentIndex = el.parent().find('[hld__imglist=ready]').index(el)
        el.parent().find('[hld__imglist=ready]').each(function () {
            urlList.push($(this).data('srcorg') || $(this).data('srclazy') || $(this).attr('src'))
        })
        let $imgBox = $('<div id="hld__img_full" title="点击背景关闭"><div id="loader"></div></div>')
        let $imgContainer = $('<div class="hld__img_container hld__zoom-target"></div>')
        let $img = $('<img title="鼠标滚轮放大/缩小\n左键拖动移动" class="hld__img hld__zoom-target">')

        const renderImg = (index) => {
            let timer = null
            $('#loader').show()
            $imgContainer.css({
                'top': $(window).height() * 0.03 + 'px',
                'left': (($(window).width() - ($(window).height()) * 0.85) / 2) + 'px',
                'width': $(window).height() * 0.85 + 'px',
                'height': $(window).height() * 0.85 + 'px'
            })
            $img.css({ 'width': '', 'height': '' }).attr('src', urlList[index]).hide()
            timer = setInterval(() => {
                const w = $img.width()
                const h = $img.height()
                if (w > 0) {
                    w > h ? $img.css({ 'width': '100%', 'height': 'auto' }) : $img.css({ 'height': '100%', 'width': 'auto' })
                    $img.show()
                    $('#loader').hide()
                    clearInterval(timer)
                }
            }, 1)
        }
        //当前图片
        renderImg(currentIndex)
        $img.mousedown(function (e) {
            let endx = 0;
            let endy = 0;
            let left = parseInt($imgContainer.css("left"))
            let top = parseInt($imgContainer.css("top"))
            let downx = e.pageX
            let downy = e.pageY
            e.preventDefault()
            $(document).on("mousemove", function (es) {
                let endx = es.pageX - downx + left
                let endy = es.pageY - downy + top
                $imgContainer.css("left", endx + "px").css("top", endy + "px")
                return false
            });
        })
        $img.mouseup(function () { $(document).unbind("mousemove") })

        $imgContainer.append($img)
        $imgBox.append($imgContainer)
        $imgBox.click(function (e) { !$(e.target).hasClass('hld__img') && $(this).remove() })
        $imgBox.append(`<div class="hld__if_control">
<div class="change prev-img" title="本楼内上一张(快捷键${getCodeName(setting.shortcutKeys[3])})"><div></div></div>
<div class="change rotate-right" title="逆时针旋转90°"><div></div></div>
<div class="change rotate-left" title="顺时针旋转90°"><div></div></div>
<div class="change next-img" title="本楼内下一张(快捷键${getCodeName(setting.shortcutKeys[4])})"><div></div></div>
</div>`)
        $imgBox.on('click', '.change', function () {
            if ($(this).hasClass('prev-img') && currentIndex - 1 >= 0)
                renderImg(--currentIndex)

            if ($(this).hasClass('next-img') && currentIndex + 1 < urlList.length)
                renderImg(++currentIndex)

            if ($(this).hasClass('rotate-right') || $(this).hasClass('rotate-left')) {
                let deg = ($img.data('rotate-deg') || 0) - ($(this).hasClass('rotate-right') ? 90 : -90)
                if (deg >= 360 || deg <= -360) deg = 0
                $img.css('transform', `rotate(${deg}deg)`)
                $img.data('rotate-deg', deg)
            } else {
                $img.css('transform', '')
                $img.data('rotate-deg', 0)
            }
            window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty()
            return false;
        })

        $imgBox.on("mousewheel DOMMouseScroll", function (e) {
            const delta = (e.originalEvent.wheelDelta && (e.originalEvent.wheelDelta > 0 ? 1 : -1)) ||
                (e.originalEvent.detail && (e.originalEvent.detail > 0 ? -1 : 1));

            if ($imgContainer.width() > 50 || delta > 0) {
                const offsetY = $imgContainer.height() * 0.2
                const offsetX = $imgContainer.width() * 0.2
                let offsetTop = offsetY / 2
                let offsetLeft = offsetX / 2

                if ($(e.target).hasClass('hld__zoom-target')) {
                    const targetOffsetX = Math.round(e.clientX - $imgContainer.position().left)
                    const targetOffsetY = Math.round(e.clientY - $imgContainer.position().top)
                    offsetLeft = (targetOffsetX / ($imgContainer.height() / 2)) * offsetLeft
                    offsetTop = (targetOffsetY / ($imgContainer.height() / 2)) * offsetTop
                }

                if (delta > 0) {
                    $imgContainer.css({
                        'width': ($imgContainer.height() + offsetY) + 'px',
                        'height': ($imgContainer.height() + offsetY) + 'px',
                        'top': ($imgContainer.position().top - offsetTop) + 'px',
                        'left': ($imgContainer.position().left - offsetLeft) + 'px'
                    })
                }
                if (delta < 0) {
                    $imgContainer.css({
                        'width': ($imgContainer.height() - offsetY) + 'px',
                        'height': ($imgContainer.height() - offsetY) + 'px',
                        'top': ($imgContainer.position().top + offsetTop) + 'px',
                        'left': ($imgContainer.position().left + offsetLeft) + 'px'
                    })
                }
            }
            e.stopPropagation()
            return false
        })

        $('body').append($imgBox)
    }

    //拉黑与标签
    const markDom = $el => {
        $el.find('a.b').each(function () {
            const uid = ($(this).attr('href') && $(this).attr('href').indexOf('uid=') > -1) ? $(this).attr('href').split('uid=')[1] + '' : ''
            $(this).find('span.hld__post-author, span.hld__remark').remove()
            let name = $(this).attr('hld-mark-before-name') || $(this).text().replace('[', '').replace(']', '')
            if (setting.markAndBan) {
                const banUser = getBanUser({name, uid})
                if (banUser) {
                    //拉黑用户实现
                    if (advancedSetting.banStrictMode == 'HIDE') {
                        if ($(this).hasClass('author')) {
                            if ($(this).parents('div.comment_c').length > 0) {
                                $(this).parents('div.comment_c').find('.ubbcode').hide()
                                $(this).parents('div.comment_c').find('.ubbcode').after('<span class="hld__banned">此用户在你的黑名单中,已屏蔽其言论,点击查看</span>')
                            } else {
                                $(this).parents('.forumbox.postbox').find('.c2 .postcontent').hide()
                                $(this).parents('.forumbox.postbox').find('.c2 .postcontent').after('<span class="hld__banned">此用户在你的黑名单中,已屏蔽其言论,点击查看</span>')
                            }
                        } else {
                            if (!$(this).parent().is(':hidden')) {
                                $(this).parent().hide()
                                $(this).parent().after('<div class="quote"><span class="hld__banned">此用户在你的黑名单中,已屏蔽其言论,点击查看</span></div>')
                            }
                        }
                    } else if (advancedSetting.banStrictMode == 'ALL') {
                        if ($(this).parents('div.comment_c').length > 0) $(this).parents('div.comment_c').remove()
                        else $(this).parents('.forumbox.postbox').remove()
                    } else {
                        if ($(this).hasClass('author')) {
                            if ($(this).parents('div.comment_c').length > 0) $(this).parents('div.comment_c').remove()
                            else $(this).parents('.forumbox.postbox').remove()
                        } else {
                            $(this).parent().html('<span class="hld__banned">此用户在你的黑名单中,已屏蔽其言论,点击查看</span>')
                        }
                    }
                    console.warn(`【NGA优化摸鱼体验脚本-黑名单屏蔽】用户:${name}, UID:${uid}`)
                }
                if(advancedSetting.classicRemark) {
                    //经典备注风格
                    const userMarks = getUserMarks({name, uid})
                    if (userMarks) {
                        let f = []
                        userMarks.marks.forEach(e => f.push(e.mark))
                        $(this).attr('hld-mark-before-name', name).append(`<span class="hld__remark"> (${f.join(', ')}) </span>`)
                    }
                }else {
                    //新版标签风格
                    const userMarks = getUserMarks({name, uid})
                    if(userMarks) {
                        const $el = $(this).parents('.c1').find('.clickextend')
                        let marksDom = ''
                        userMarks.marks.forEach(item => marksDom += `<span style="color: ${item.text_color};background-color: ${item.bg_color};" title="${item.mark}">${item.mark}</span>`);
                        $el.before(`<div class="hld__marks-container">标签: ${marksDom}</div>`)
                    }
                }
                if (setting.authorMark) {
                    if (name == $('#hld__post-author').val() && $(this).find('span.hld__post-author').length == 0)
                        $(this).append('<span class="hld__post-author">[楼主]</span>')
                }
            }
        })
    }
    $('body').on('click', '.hld__banned', function(){
        if ($(this).parent().hasClass('quote')) {
            $(this).parent().prev().show()
            $(this).parent().hide()
        } else {
            $(this).prev().show()
            $(this).hide()
        }
 
    })
    //设置面板
    let $panelDom = $(`<div id="hld__setting_cover" class="animated zoomIn"><div id="hld__setting_panel">
   <a href="javascript:void(0)" id="hld__setting_close" class="hld__setting-close">×</a>
    <p class="hld__sp-title"><a title="更新地址" href="https://gf.qytechs.cn/zh-CN/scripts/393991-nga%E4%BC%98%E5%8C%96%E6%91%B8%E9%B1%BC%E4%BD%93%E9%AA%8C" target="_blank">NGA优化摸鱼插件<span class="hld__script-info">v${GM_info.script.version}</span></a></p>
    <div class="hld__field">
    <p class="hld__sp-section">显示优化</p>
    <p><label><input type="checkbox" id="hld__cb_hideAvatar"> 隐藏头像(快捷键切换显示[<b>${getCodeName(setting.shortcutKeys[0])}</b>])</label></p>
    <p><label><input type="checkbox" id="hld__cb_hideSmile"> 隐藏表情(快捷键切换显示[<b>${getCodeName(setting.shortcutKeys[1])}</b>])</label></p>
    <p><label><input type="checkbox" id="hld__cb_hideImage"> 隐藏贴内图片(快捷键切换显示[<b>${getCodeName(setting.shortcutKeys[2])}</b>])</label></p>
    <p><label><input type="checkbox" id="hld__cb_imgResize"> 贴内图片缩放</label></p>
    <p><label><input type="checkbox" id="hld__cb_hideSign"> 隐藏签名</label></p>
    <p><label><input type="checkbox" id="hld__cb_hideHeader"> 隐藏版头/版规/子版入口</label></p>
    <p><label><input type="checkbox" id="hld__cb_excelMode"> Excel模式(快捷键切换显示[<b>${getCodeName(setting.shortcutKeys[5])}</b>])</label></p>
    <p><label><input type="checkbox" id="hld__cb_foldQuote"> 自动折叠过长的引用</label></p>
    <p><button id="hld__shortcut_manage">编辑快捷键</button></p>
    </div>
    <div class="hld__field">
    <p class="hld__sp-section">功能强化</p>
    <p><label><input type="checkbox" id="hld__cb_linkTargetBlank"> 论坛列表新窗口打开</label></p>
    <p><label><input type="checkbox" id="hld__cb_imgEnhance"> 贴内图片功能增强</label></p>
    <p><label><input type="checkbox" id="hld__cb_authorMark"> 高亮楼主</label></p>
    <p><label><input type="checkbox" id="hld__cb_autoPage"> 自动翻页</label></p>
    <p><label><input type="checkbox" id="hld__cb_keywordsBlock" enable="hld__keywordsBlock_fold"> 关键字屏蔽</label></p>
    <div class="hld__sp-fold" id="hld__keywordsBlock_fold" data-id="hld__cb_keywordsBlock">
    <p><button id="hld__keywords_manage">管理关键字</button></p>
    </div>
    <p><label><input type="checkbox" id="hld__cb_markAndBan" enable="hld__markAndBan_fold"> 拉黑/标签功能</label></p>
    <div class="hld__sp-fold" id="hld__markAndBan_fold">
    <p><button id="hld__list_manage">名单管理</button></p>
    </div>
    </div>
    <div style="clear:both"></div>
    <div class="hld__advanced-setting">
    <button id="hld__advanced_button">+</button><span>高级设置</span>
    <div class="hld__advanced-setting-panel" >
    <p><svg t="1590560820184" class="icon" viewBox="0 0 1040 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2738" width="200" height="200"><path d="M896.355855 975.884143 127.652332 975.884143c-51.575656 0-92.993974-19.771299-113.653503-54.238298-20.708648-34.515095-18.194384-79.5815 6.9022-123.5632L408.803663 117.885897c25.244964-44.376697 62.767556-69.77004 102.953813-69.77004 40.136116 0 77.658707 25.393343 103.002932 69.671803L1003.006873 798.131763c25.097608 44.030819 27.711132 89.049129 6.952342 123.514081C989.348806 956.159916 947.881368 975.884143 896.355855 975.884143L896.355855 975.884143 896.355855 975.884143 896.355855 975.884143 896.355855 975.884143zM511.805572 119.511931c-12.769838 0-27.414373 12.376888-39.298028 33.134655L84.656075 832.892451c-12.130272 21.350261-14.989389 40.530089-7.741311 52.611242 7.297197 12.08013 25.787316 19.033495 50.737568 19.033495l768.703523 0c24.997324 0 43.439348-6.903224 50.736545-19.033495 7.197936-12.031011 4.387937-31.210839-7.791453-52.5611L551.055504 152.646586C539.220968 131.888819 524.527314 119.511931 511.805572 119.511931L511.805572 119.511931 511.805572 119.511931 511.805572 119.511931 511.805572 119.511931zM512.004093 653.807726c-20.1182 0-36.488029-15.975856-36.488029-35.69906L475.516064 296.773124c0-19.723204 16.369829-35.698037 36.488029-35.698037 20.117177 0 36.485983 15.975856 36.485983 35.698037l0 321.335543C548.490076 637.832893 532.12127 653.807726 512.004093 653.807726L512.004093 653.807726 512.004093 653.807726 512.004093 653.807726zM511.757476 828.308039c31.359218 0 56.851822-24.950252 56.851822-55.717999s-25.491581-55.716976-56.851822-55.716976c-31.408337 0-56.851822 24.949228-56.851822 55.716976S480.349139 828.308039 511.757476 828.308039L511.757476 828.308039 511.757476 828.308039 511.757476 828.308039z" p-id="2739"></path></svg> 鼠标停留在<span class="hld__adv-help" title="详细描述">选项文字</span>上可以显示详细描述,设置有误可能会导致插件异常或者无效!</p>
    <table>
    <!-- <tr><td><span class="hld__adv-help" title=" "> </td><td><input type="checkbox" id="hld__adv_"></td></tr> -->
    <tr><td><span class="hld__adv-help" title="此配置表示部分可以快捷键切换的功能默认行为策略\n选中时:关闭功能(如隐藏头像)也可以通过快捷键切换显示/隐藏\n取消时:关闭功能(如隐藏头像)将彻底关闭功能,快捷键会失效">动态功能启用</span></td><td><input type="checkbox" id="hld__adv_dynamicEnable"></td></tr>
    <tr><td><span class="hld__adv-help" title="此配置表示拉黑某人后对帖子的屏蔽策略\n屏蔽:保留楼层, 仅会屏蔽用户的回复\n删除:将会删除楼层\n全部删除: 回复被拉黑用户的回复也会被删除"> 拉黑模式</td><td><select id="hld__adv_banStrictMode"><option value="HIDE">屏蔽</option><option value="REMOVE">删除</option><option value="ALL">全部删除</option></select></td></tr>
    <tr><td><span class="hld__adv-help" title="选中时:默认隐藏标注与拉黑按钮, 当鼠标停留区域时, 才会显示\n取消时:一直显示"> 按需显示标注拉黑按钮</td><td><input type="checkbox" id="hld__adv_autoHideBanIcon"></td></tr>
    <tr><td><span class="hld__adv-help" title="此配置表示关键字的屏蔽策略\n选中时:关键字屏蔽将排除标题\n取消时:标题及正文回复都会被屏蔽"> 关键字屏蔽排除标题</td><td><input type="checkbox" id="hld__adv_kwdWithoutTitle"></td></tr>
    <tr><td><span class="hld__adv-help" title="Excel最左列的显示序号,此策略为尽可能的更像Excel\n选中时:Excel最左栏为从1开始往下,逐行+1\n取消时:Excel最左栏为原始的回帖数\n*此功能仅在贴列表有效">Excel左列序号</span></td><td><input type="checkbox" id="hld__adv_excelNoMode"></td></tr>
    <tr><td><span class="hld__adv-help" title="Excel模式下标签栏的名称, 如留空, 则显示原始标题">Excel覆盖标题</span></td><td><input type="text" id="hld__adv_excelTitle"></td></tr>    </table>
    <table>
    <!-- <tr><td><span class="hld__adv-help" title=" "> </td><td><input type="checkbox" id="hld__adv_"></td></tr> -->
    <tr><td><span class="hld__adv-help" title="滚动条滚动到距离底部多少距离时执行自动翻页\n单位是页面高度的百分比(%)\n例如10即为滚动条滚动到距离底部有页面高度10%距离的时候,进行翻页">自动翻页检测距离</span></td><td><input type="number" id="hld__adv_autoPageOffset"></td></tr>
    <tr><td><span class="hld__adv-help" title="标记楼主中的[楼主]的颜色,单位为16进制颜色代码">标记楼主颜色</span></td><td><input type="text" id="hld__adv_authorMarkColor"></td></tr>
    <tr><td><span class="hld__adv-help" title="图片缩放功能中对图片缩放的大小,单位为像素(px)\n*图片高度自适应">图片缩放宽度</span></td><td><input type="number" id="hld__adv_imgResizeWidth"></td></tr>
    <tr><td><span class="hld__adv-help" title="自动折叠引用的高度阈值,单位为像素(px)">自动折叠引用高度</span></td><td><input type="number" id="hld__adv_foldQuoteHeight"></td></tr>
    <tr><td><span class="hld__adv-help" title="此配置表示标记功能的风格显示\n选中时:v2.9及以前的备注风格(仿微博),此风格不能更改颜色\n取消时:新版标记风格"> 经典备注风格</td><td><input type="checkbox" id="hld__adv_classicRemark"></td></tr>
    <tr><td><span class="hld__adv-help" title="选中时:隐藏版头顶部背景图片\n取消时:无操作"> 隐藏版头同时隐藏背景图片</td><td><input type="checkbox" id="hld__adv_hideCustomBg"></td></tr>
    </table>
    </div>
    </div>
    <div class="hld__buttons">
    <span>
    <button class="hld__btn" id="hld__backup_panel" title="导入/导出配置字符串,包含设置,黑名单,标记名单等等">导入/导出</button>
    <button class="hld__btn" id="hld__reset__data" title="重置配置">重置</button>
    <button class="hld__btn hld__reward" id="hld__reward" title="好活当赏"><span style="margin-right:3px">¥</span>赏</button>
    </span>
    <button class="hld__btn" id="hld__save__data">保存设置</button>
    </div>
    </div>
    </div>`)
    $('body').append($panelDom)
    //本地恢复设置
    //基础设置
    for (let k in setting) {
        if ($('#hld__cb_' + k).length > 0) {
            $('#hld__cb_' + k)[0].checked = setting[k]
            const enableDomID = $('#hld__cb_' + k).attr('enable')
            if (enableDomID) {
                setting[k] ? $('#' + enableDomID).show() : $('#' + enableDomID).hide()
                $('#' + enableDomID).find('input').each(function () {
                    $(this).val() == setting[$(this).attr('name').substr(8)] && ($(this)[0].checked = true)
                })
                $('#hld__cb_' + k).on('click', function () {
                    $(this)[0].checked ? $('#' + enableDomID).slideDown() : $('#' + enableDomID).slideUp()
                })
            }
        }
    }
    //高级设置
    for (let k in advancedSetting) {
        if ($('#hld__adv_' + k).length > 0) {
            const valueType = typeof advancedSetting[k]
            if (valueType == 'boolean') {
                $('#hld__adv_' + k)[0].checked = advancedSetting[k]
            }
            if (valueType == 'number' || valueType == 'string') {
                $('#hld__adv_' + k).val(advancedSetting[k])
                console.log(k, $('#hld__adv_' + k).val())
            }
        }
    }
    //高级设置-事件绑定
    $('body').on('click', '#hld__advanced_button', function () {
        if ($('.hld__advanced-setting-panel').is(':hidden')) {
            $('.hld__advanced-setting-panel').css('display', 'flex')
            $(this).text('-')
        } else {
            $('.hld__advanced-setting-panel').css('display', 'none')
            $(this).text('+')
        }
    })
    //调色板绑定
    $('#hld__setting_cover').find('#hld__adv_authorMarkColor').spectrum(colorPickerConfig)
    /**
     * 导入导出设置面板
     */
    $('body').on('click', '#hld__backup_panel', function () {
        const unsupported = 3.3
        const currentVer = +GM_info.script.version
        if($('#hld__export_panel').length > 0) return
        $('#hld__setting_cover').append(`<div id="hld__export_panel" class="hld__list-panel animated fadeInUp">
            <a href="javascript:void(0)" class="hld__setting-close">×</a>
            <div class="hld__ep-container">
            <div>
            <p><b>选择导出的设置</b></p>
            <p><label><input type="checkbox" id="hld__cb_export_setting"> 配置</label></p>
            <p><label><input type="checkbox" id="hld__cb_export_banlist"> 黑名单列表</label></p>
            <p><label><input type="checkbox" id="hld__cb_export_marklist"> 标签列表</label></p>
            <p><label><input type="checkbox" id="hld__cb_export_keywordlist"> 屏蔽列表</label></p>
            <br>
            <p><button id="hld__export__data">导出</button> <button id="hld__import__data">导入</button></p>
            </div>
            <div>
            <p><b style="text-decoration: underline;cursor:help;" title="【导出】\n选择要导出的内容,点击导出,复制以下字符串用于备份,分享等\n【导入】\n将字符串复制到以下输入框中,点击导入,将会自动导入字符串中包含的内容">字符串</b></p>
            <textarea id="hld__export_str" rows="9"></textarea>
            </div>
            </div>
            <div><p id="hld__export_msg"></p></div>
            </div>`)
        /**
         * 导出配置
         */
        $('#hld__export__data').click(function(){
            let obj = {}
            if ($('#hld__cb_export_setting').prop('checked')) {
                obj['setting'] = setting
                obj['advanced_setting'] = advancedSetting
            }
            $('#hld__cb_export_banlist').prop('checked') && (obj['ban_list'] = banList)
            $('#hld__cb_export_marklist').prop('checked') && (obj['mark_list'] = markList)
            $('#hld__cb_export_keywordlist').prop('checked') && (obj['keywords_list'] = keywordsList)

            if (Object.keys(obj).length == 0) {
                $('#hld__export_msg').html('<span style="color:#CC0000">没有选择任何项目可供导出!</span>')
                return
            }
            obj['name'] = 'HLD-NGA-BBS'
            obj['ver'] = +GM_info.script.version
            $('#hld__export_str').val(Base64.encode(JSON.stringify(obj)))
            $('#hld__export_msg').html('<span style="color:#009900">导出成功,请复制右侧字符串以备份</span>')
        })
        /**
         * 导入配置
         */
        $('#hld__import__data').click(function(){
            if ($('#hld__export_str').val()) {
                try {
                    let obj = JSON.parse(Base64.decode($('#hld__export_str').val()))
                    if (obj.ver > currentVer) {
                        popMsg(`此配置是由更高版本(v${obj.ver.toFixed(1)})的脚本导出,请升级您的脚本 <a title="更新地址" href="https://gf.qytechs.cn/zh-CN/scripts/393991-nga%E4%BC%98%E5%8C%96%E6%91%B8%E9%B1%BC%E4%BD%93%E9%AA%8C" target="_blank">[脚本地址]</a>`, 'warn')
                        return
                    }
                    if (obj.ver < unsupported) {
                        popMsg(`此配置是由低版本(v${obj.ver.toFixed(1)})的脚本导出,当前版本(v${currentVer})已不支持!`, 'err')
                        return
                    }
                    let confirm = window.confirm('此操作会覆盖你的配置,确认吗?')
                    if (!confirm) return
                    if (Object.keys(obj).includes('setting')) {
                        obj.setting && (setting = obj.setting)
                        obj.advanced_setting && (advancedSetting = obj.advanced_setting)
                        window.localStorage.setItem('hld__NGA_setting', JSON.stringify(setting))
                        window.localStorage.setItem('hld__NGA_advanced_setting', JSON.stringify(advancedSetting))
                    }
                    if (Object.keys(obj).includes('ban_list')) {
                        banList = obj.ban_list
                        window.localStorage.setItem('hld__NGA_ban_list', banList.join(','))
                    }
                    if (Object.keys(obj).includes('mark_list')) {
                        markList = obj.mark_list
                        window.localStorage.setItem('hld__NGA_mark_list', markList.join(','))
                    }
                    if (Object.keys(obj).includes('keywords_list')) {
                        keywordsList = obj.keywords_list
                        window.localStorage.setItem('hld__NGA_keywords_list', keywordsList.join(','))
                    }
                    $('#hld__export_msg').html('<span style="color:#009900">导入成功,刷新浏览器以生效</span>')

                } catch (err){
                    $('#hld__export_msg').html('<span style="color:#CC0000">字符串有误,解析失败!</span>')
                }
            }
        })
    })
    /**
     * 保存配置
     */
    $('body').on('click', '#hld__save__data', function () {
        for (let k in setting) {
            $('input#hld__cb_' + k).length > 0 && (setting[k] = $('input#hld__cb_' + k)[0].checked)
        }
        window.localStorage.setItem('hld__NGA_setting', JSON.stringify(setting))
        for (let k in advancedSetting) {
            if ($('#hld__adv_' + k).length > 0) {
                const valueType = typeof advancedSetting[k]
                const inputType = $('#hld__adv_' + k)[0].nodeName
                if (inputType == 'SELECT') {
                    advancedSetting[k] = $('#hld__adv_' + k).val()
                } else {
                    if (valueType == 'boolean') {
                        advancedSetting[k] = $('#hld__adv_' + k)[0].checked
                    }
                    if (valueType == 'number') {
                        advancedSetting[k] = +$('#hld__adv_' + k).val()
                    }
                    if (valueType == 'string') {
                        advancedSetting[k] = $('#hld__adv_' + k).val()
                    }
                }
            }
        }
        window.localStorage.setItem('hld__NGA_advanced_setting', JSON.stringify(advancedSetting))
        $panelDom.hide()
        popMsg('保存成功,刷新页面生效')
    })
    /**
     * 重置配置
     */
    $('body').on('click', '#hld__reset__data', function(){
        if(confirm('若发生配置不生效的情况,或者插件失效,重置所有配置\n确认吗?')){
            localStorage.removeItem("hld__NGA_setting")
            localStorage.removeItem("hld__NGA_advanced_setting")
            popMsg('重置成功,即将自动刷新')
            window.location.reload()
       }
    })
    /**
     * 打赏
     */
    $('body').on('click', '#hld__reward', function () {
        $('#hld__setting_cover').append(`<div class="hld__list-panel hld__reward-panel animated fadeInUp">
        <a href="javascript:void(0)" class="hld__setting-close">×</a>
        <div class="hld__reward-info">
        <p><b>本脚本完全开源,并且长期维护<br>您若有好的功能需求或者建议,欢迎反馈</b></p>
        <p>如果您觉得脚本好用<span class="hld__delete-line">帮助到更好的摸鱼</span>,也可以请作者喝杯咖啡~<img src="https://s1.ax1x.com/2020/06/28/N25w7Q.png"></p>
        </div>
        <div class="hld__flex">
        <div class="hld__list-c"><img src="https://s1.ax1x.com/2020/06/28/N25Bkj.png">
        </div>
        <div class="hld__list-c"><img src="https://s1.ax1x.com/2020/06/28/N25Dts.png">
        </div>
        </div>
        </div>`)
    })
    /**
     * 消息弹框
     * @param {String} msg 消息内容
     * @param {String} type 消息类型
     * @param {Boolean} refreshEnable 启用自动刷新
     */
    function popMsg(msg, type='ok', refreshEnable=true) {
        $('.hld__msg').length > 0 && $('.hld__msg').remove()
        let $msg = $(`<div class="hld__msg hld__msg-${type}">${msg}</div>`)
        $('body').append($msg)
        $msg.slideDown(200)
        setTimeout(() => { $msg.fadeOut(500) }, type == 'ok' ? 2000 : 5000)
        setTimeout(() => { $msg.remove() }, type == 'ok' ? 2500 : 5500)
    }
    /**
     * 通知弹框
     * @param {String} msg 消息内容
     */
    function popNotification (msg) {
        $('#hld__noti_container').length == 0 && $('body').append('<div id="hld__noti_container"></div>')
        let $msgBox = $(`<div class="hld__noti-msg">${msg}</div>`)
        $('#hld__noti_container').append($msgBox)
        $msgBox.slideDown(100)
        setTimeout(() => { $msgBox.fadeOut(500) }, 1000)
        setTimeout(() => { $msgBox.remove() }, 1500)
    }
    /**
     * 获取URL参数对象
     * @return {Object} 参数对象
     */
    function getQuerySet() {
        let queryList = {}
        let url = decodeURI(window.location.search.replace(/&amp;/g, "&"))
        url.startsWith('?') && (url = url.substring(1))
        url.split('&').forEach(item => {
            let t = item.split('=')
            if (t[0] && t[1]) {
                queryList[t[0]] = t[1]
            }
        })
        return queryList
    }
    /**
     * 获取URL参数
     * @param {String} name 参数
     * @return {String|null} 参数的值
     */
    function getQueryString(name) {
        let url = decodeURI(window.location.search.replace(/&amp;/g, "&"))
        let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)")
        let r = url.substr(1).match(reg)
        if (r != null) return unescape(r[2])
        return null
    }
    /**
     * 列表去重
     * @param {Array} array 列表
     * @return {Array} 处理后的列表
     */
    function uniq(array) {
        return [...new Set(array)]
    }
    /**
     * 列表去空
     * @param {Array} array 列表
     * @return {Array} 处理后的列表
     */
    function removeBlank(array) {
        let r = [];
        array.map(function (val, index) {
            if (val !== '' && val != undefined) {
                r.push(val);
            }
        });
        return r;
    }
    /**
     * Base64互转
     */
    const Base64 = {
        encode: (str) => {
            return window.btoa(unescape(encodeURIComponent(str)))
        },
        decode: (str) => {
            return decodeURIComponent(escape(window.atob(str)))
        }
    }
    /**
     * 黑名单弹窗
     * @param {Object} setting 设置项
     * @param {String} setting.name 用户昵称
     * @param {String} setting.uid UID
     * @param {String} setting.type 模式
     * @param {Number} setting.top  pos.top位置
     * @param {Number} setting.left pos.left 位置
     * @param {Function} setting.callback 回调函数
     */
    function banlistPopup (setting) {
        $('.hld__dialog').length > 0 && $('.hld__dialog').remove()
        const retainWord = [':', '(', ')', '&', '#', '^', ',']
        let $banDialog = $(`<div class="hld__dialog hld__dialog-sub-top hld__list-panel animated zoomIn"  style="top: ${setting.top}px;left: ${setting.left}px;"><a href="javascript:void(0)" class="hld__setting-close">×</a><div id="container_dom"></div><div class="hld__dialog-buttons"></div></div>`)
        if (setting.type == 'confirm') {
            $banDialog.find('#container_dom').append(`<div><span>您确定要拉黑用户</span><span class="hld__dialog-user">${setting.name}</span><span>吗?</span></div>`)
            let $okBtn = $('<button class="hld__btn">拉黑</button>')
            $okBtn.click(function(){
                const banObj = {name: setting.name, uid: setting.uid}
                !getBanUser(banObj) && banList.push(banObj)
                window.localStorage.setItem('hld__NGA_ban_list', JSON.stringify(banList))
                $('.hld__dialog').remove()
                popMsg('拉黑成功,重载页面生效')
            })
            $banDialog.find('.hld__dialog-buttons').append($okBtn)
        }else if (setting.type == 'add') {
            $banDialog.find('#container_dom').append(`<div>添加用户:</div><div><input id="hld__dialog_add_uid" type="text" value="" placeholder="UID"></div><div><input id="hld__dialog_add_name" type="text" value="" placeholder="用户名"></div>`)
            let $okBtn = $('<button class="hld__btn">添加</button>')
            $okBtn.click(function(){
                const name = $banDialog.find('#hld__dialog_add_name').val().trim()
                const uid = $banDialog.find('#hld__dialog_add_uid').val().trim() + ''
                if (!name && !uid) {
                    popMsg('UID与用户名必填一个,其中UID权重较大', 'err')
                    return
                }
                !getBanUser({name, uid}) && banList.push({name, uid})
                window.localStorage.setItem('hld__NGA_ban_list', JSON.stringify(banList))
                $('.hld__dialog').remove()
                setting.callback()
            })
            $banDialog.find('.hld__dialog-buttons').append($okBtn)
        }
        $('body').append($banDialog)
    }
    /**
     * 获取黑名单用户
     */
    function getBanUser(ban_obj) {
        for (let u of banList) {
            if ((u.uid && ban_obj.uid && u.uid == ban_obj.uid) || 
                (u.name && ban_obj.name && u.name == ban_obj.name)) {
                if ((!u.uid && ban_obj.uid) || (!u.name && ban_obj.name)) {
                    u.uid = ban_obj.uid + '' || ''
                    u.name = ban_obj.name || ''
                    window.localStorage.setItem('hld__NGA_ban_list', JSON.stringify(banList))
                }
                return u
            }
        }
        return null
    }
    /**
     * 重新渲染黑名单列表
     */
    function reloadBanlist() {
        $('#hld__banlist').empty()
        banList.forEach((item, index) => $('#hld__banlist').append(`<tr><td title="${item.name}">${item.name}</td><td title="${item.uid}">${item.uid}</td><td><span class="hld__us-action hld__us-del hld__bl-del" title="删除" data-index="${index}" data-name="${item.name}" data-uid="${item.uid}"></span></td></tr>`))
        $('#hld__ban_list_textarea').val(JSON.stringify(banList))
    }
    /**
     * 重新渲染标签列表
     */
    function reloadMarklist() {
        $('#hld__marklist').empty()
        markList.forEach((user_mark, index) => {
            $('#hld__marklist').append(`<tr><td title="${user_mark.name}">${user_mark.name}</td><td title="${user_mark.uid}">${user_mark.uid}</td><td title="${user_mark.marks.length}">${user_mark.marks.length}</td><td><span class="hld__us-action hld__us-edit hld__ml-edit" title="编辑" data-index="${index}" data-name="${user_mark.name}" data-uid="${user_mark.uid}"></span><span class="hld__us-action hld__us-del hld__ml-del" title="删除" data-index="${index}" data-name="${user_mark.name}" data-uid="${user_mark.uid}"></span></td></tr>`)
        })
        $('#hld__mark_list_textarea').val(JSON.stringify(markList))
    }
    /**
     * 标记弹窗
     * @param {Object} setting 设置项
     * @param {String} setting.name 用户名
     * @param {String} setting.uid UID
     * @param {String} setting.type 模式
     * @param {Number} setting.top  pos.top位置
     * @param {Number} setting.left pos.left 位置
     * @param {Function} setting.callback 回调函数
     */
    function userMarkPopup(setting) {
        $('.hld__dialog').length > 0 && $('.hld__dialog').remove()
        const retain_word = [':', '(', ')', '&', '#', '^', ',']
        let $markDialog = $(`<div class="hld__dialog hld__dialog-sub-top hld__list-panel animated zoomIn" style="top: ${setting.top}px;left: ${setting.left}px;">
        <a href="javascript:void(0)" class="hld__setting-close">×</a>
        ${setting.type == 'add' ? `<div style="display:block;">添加用户:<input id="hld__dialog_add_uid" type="text" value="" placeholder="UID"><input id="hld__dialog_add_name" type="text" value="" placeholder="用户名"></div>` : ''}
        <table class="hld__dialog-mark-table">
        <thead>
        <tr>
        <th width="100">标签</th><th width="50">文字</th><th width="50">背景</th><th>操作</th>
        </tr>
        </thead>
        <tbody id="hld__mark_body"></tbody>
        </table>
        <div class="hld__dialog-buttons" style="justify-content: space-between !important;"></div>
        </div>`)
        const insertRemarkRow = (r='', t='#ffffff', b='#1f72f1', n=true) => {
            let $tr = $(`<tr>
            <td><input type="text" class="hld__mark-mark" value="${r}"></td>
            <td><input class="hld__dialog-color-picker hld__mark-text-color" value="${t}"></td>
            <td><input class="hld__dialog-color-picker hld__mark-bg-color" value="${b}"></td>
            <td><button title="删除此标签" class="hld__mark-del">x</button></td>
            </tr>`)
            $tr.find('.hld__mark-del').click(function(){$(this).parents('tr').remove()})
            $tr.find('.hld__dialog-color-picker').spectrum(colorPickerConfig)
            $markDialog.find('#hld__mark_body').append($tr)
            n && $tr.find('.hld__mark-mark').focus()
        }

        //恢复标签
        const existMark = getUserMarks({name: setting.name, uid: setting.uid})
        existMark !== null && existMark.marks.forEach(item => insertRemarkRow(item.mark, item.text_color, item.bg_color, false))

        let $addBtn = $('<button class="hld__btn">+添加标签</button>')
        $addBtn.click(() => insertRemarkRow())
        $markDialog.find('.hld__dialog-buttons').append($addBtn)
        let $okBtn = $('<button class="hld__btn">保存</button>')

        $okBtn.click(function(){
            let userMarks = {marks: []}
            if (setting.type == 'add') {
                userMarks.name = $markDialog.find('#hld__dialog_add_name').val().trim()
                userMarks.uid = $markDialog.find('#hld__dialog_add_uid').val().trim() + ''
            } else {
                userMarks.name = setting.name
                userMarks.uid = setting.uid + ''
            }
            if (!userMarks.name && !userMarks.uid) {
                popMsg('UID与用户名必填一个,其中UID权重较大', 'err')
                return
            }
            $('#hld__mark_body > tr').each(function(){
                const mark = $(this).find('.hld__mark-mark').val().trim()
                const textColor = $(this).find('.hld__mark-text-color').val()
                const bgColor = $(this).find('.hld__mark-bg-color').val()
                if(mark) {
                    userMarks.marks.push({mark, text_color: textColor, bg_color: bgColor})
                }
            })
            if (setting.type == 'add' && userMarks.marks.length == 0) {
                popMsg('至少添加一个标签内容', 'err')
                return
            }
            setUserMarks(userMarks)
            popMsg('保存成功,重载页面生效')
            $('.hld__dialog').remove()
            setting.callback()
        })
        $markDialog.find('.hld__dialog-buttons').append($okBtn)
        $('body').append($markDialog)
        $('.hld__dialog-color-picker').spectrum(colorPickerConfig)
    }
    /**
     * 获取用户标签对象
     * @param {String} uid UID
     * @param {String} user 用户名
     * @return {Object|null} 标签对象
     */
    function getUserMarks(user) {
        const check = markList.findIndex(v => (v.uid && user.uid && v.uid == user.uid) || 
        (v.name && user.name && v.name == user.name))
        if(check > -1) {
            let userMark = markList[check]
            if ((!userMark.uid && user.uid) || (!userMark.name && user.name)) {
                userMark.uid = user.uid + '' || ''
                userMark.name = user.name || ''
                window.localStorage.setItem('hld__NGA_mark_list', JSON.stringify(markList))
            }
            return markList[check]
        } else {
            return null
        }
    }
    /**
     * 保存标签
     * @param {Object} userMarks 标签对象
     */
    function setUserMarks(userMarks) {
        //检查是否已有标签
        const check = markList.findIndex(v => (v.uid && userMarks.uid && v.uid == userMarks.uid) || 
        (v.name && userMarks.name && v.name == userMarks.name))
        if(check > -1) {
            if (userMarks.marks.length == 0) {
                markList.splice(check, 1)
            } else {
                markList[check] = userMarks
            }
        }else {
            markList.push(userMarks)
        }
        window.localStorage.setItem('hld__NGA_mark_list', JSON.stringify(markList))
    }
    /**
     * 颜色RGB转HEX
     * @param {String} rgb rgb颜色代码
     * @return {String} 16进制颜色代码
     */
    function rgb2hex(rgb) {
      rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
      function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
      }
      return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
    }
    /**
     * Style Sheet
     */
    const style = document.createElement("style")
    style.type = "text/css"
    style.appendChild(document.createTextNode(`
.animated {animation-duration:.3s;animation-fill-mode:both;}
.animated-1s {animation-duration:1s;animation-fill-mode:both;}
.zoomIn {animation-name:zoomIn;}
.bounce {-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom;}
.fadeInUp {-webkit-animation-name:fadeInUp;animation-name:fadeInUp;}
#loader {display:none;position:absolute;top:50%;left:50%;margin-top:-10px;margin-left:-10px;width:20px;height:20px;border:6px dotted #FFF;border-radius:50%;-webkit-animation:1s loader linear infinite;animation:1s loader linear infinite;}
@keyframes loader {0% {-webkit-transform:rotate(0deg);transform:rotate(0deg);}100% {-webkit-transform:rotate(360deg);transform:rotate(360deg);}}
@keyframes zoomIn {from {opacity:0;-webkit-transform:scale3d(0.3,0.3,0.3);transform:scale3d(0.3,0.3,0.3);}50% {opacity:1;}}
@keyframes bounce {from,20%,53%,80%,to {-webkit-animation-timing-function:cubic-bezier(0.215,0.61,0.355,1);animation-timing-function:cubic-bezier(0.215,0.61,0.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}40%,43% {-webkit-animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0);}70% {-webkit-animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0);}90% {-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0);}}
@keyframes fadeInUp {from {opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);}to {opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}
.postcontent img {margin:0 5px 5px 0 !important;box-shadow:none !important;outline:none !important;}
.hld__img_container {position:absolute;display:flex;justify-content:center;align-items:center;}
.hld__if_control {position:absolute;display:flex;left:50%;bottom:15px;width:160px;margin-left:-80px;height:40px;background:rgba(0,0,0,0.6);z-index:9999999;}
#hld__setting_cover {display:none;justify-content:center;align-items:center;position:fixed;top:0;left:0;right:0;bottom:0;z-index:999;}
#hld__img_full {position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.6);z-index:99999;/*display:flex;*//*align-items:center;*//*justify-content:center;*/}
#hld__img_full img {cursor:move;transition:transform .2s ease;}
#hld__img_full .hld__imgcenter {top:50%;left:50%;transform:translate(-50%,-50%);}
#hld__img_full .change {width:40px;height:40px;cursor:pointer;}
#hld__img_full .rotate-right,#hld__img_full .rotate-left {background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAgCAYAAAB6kdqOAAADYElEQVRYR8WYS8hWVRSGn3cipg0qCExBKYxKQVJRIh1olF0GXpIIoVIUBZWahZeJOpDEQYMcWCBZQRFCZkpGJGgD0yJSwSyVIO0yMrpObPLK+tvnY3f8zu1Tfxfsydlrrf3uve5HXAPZfgR4HJiY1r3Av8BvwCXgOPChpCNtj1FbxoLPdhy+AHgaeLil/DngHWCHpL/qZDoBsj0P+LQliH5s3yVQO6t0dAW0GdhUUvYP8DXwc1q3AncBYb4pFQfvlrS8314nQKHA9n5gDnAKWCfpi6rbJvM+CSwFppf4jkiaW5btDGhQc9leBbwKjM50vC5pda5z2ACl170P+AS4OwOxRVK4whANK6AsUk8DkzNQiyXtvZmAJqVAuCWB6vnTTXmhZL5yxK6UtOsqQLaD8UdJbw3qwG3kbEdqiHQxNvHvlbT4f4Bsn08lIHg2SNrWRnm68e3APUBk4ouSLjfJ2n4DiOgLuiTpzh4g248Cn5WUrJFUmVUzJ80Vx+efgBeaapjtZ4A92ZnTckCvAOv73Oo5Se9W3db2i8BrFfuTJZ2peynbzvYX5IC+AaZWCM+XdKC8Z/s24PeaA49Kmt0A6JfMj1YMAbIdQAJQFf0JLCybwPaDwIkauSG/aAAUjl2UlXUFoJeB7Q1OeBFYJKkH3Hbkk29r5H6VNG4QQMeAh5qiAjgpqWdW2yOBePI7KmQPSJrfyWS2J0TeaQGmYJmbm64UumU1EyX90MmpG6KkrOsPYLykv/MN2wuBjcCM9D3q0kuS4vUqyfYyYHfGME22D6f+pk72SyD6nv11ucV2NGSRFAN4I9l+D1iSGP9LjLYPAtFEVdEhSY81au/IYPuB8ElgRPGqvdJhO7JlhOfnwAfAE6WoWyHpzY5n1rLb3prMXPD1L67Fru3IsHGLoJgaZkmK0eaayfZMINygoOb2w/azwPuZ0EfA82WHHgRdqVyEinYNmu2PgafymwDLJF0YEEj4avhsTu1bWNsxykRhLcI5FIUjhpJ9XUClJj+6gpy6N/mpkYqpM9qTnGI8fruukbthY5DtGP4C1KI+rxI5JzJ9rHD+UcM2KNpeC6wBoqgOQtd3lA4E6bUKYONbooqxJyL2+v5syA+3PSaVnPuBGACLFb9ivgfOAl9FyWkqsLneKyNmUcarECm7AAAAAElFTkSuQmCC) center no-repeat;background-size:25px;}
#hld__img_full .rotate-right {transform:rotateY(180deg);}
#hld__img_full .rotate-left:hover {transform:scale(1.2);}
#hld__img_full .rotate-right:hover {transform:scale(1.2) rotateY(180deg);}
#hld__img_full .next-img:hover {transform:scale(1.2) rotate(180deg);}
#hld__img_full .prev-img,#hld__img_full .next-img {background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABmUlEQVRYR+3WsUtWURjH8e8z+J/4J7QF4vL+C5ZBiAoh6lCDDQmBoIMOOiiIoBCBU+DiUENRQUWigiAuCjoo5JAmkQ41/OTCEzxEwznnvr4u750vfD/nOfdcjnHLj91ynzagqROQ1AC2zOxH6tY2DSBpAnju4Ttmtp2CaApA0hTwLAT7zexFSwCSZoCxENsDuszs/MYBkuaAxyG0A9wzs/2UePVO8RZIWgBGQmgTuG9mh6nxYoCkJeBRCH3x+HFOvAggaQUYCKGPQK+ZfcuNZwMkvQQehtA7X/n3kngWQNIn4G4IvfGVX5TGkwGSDoDOEFr3+GWdeA7gN9DhsV9Aw8y+1o3nAN4D3SF45BPYqItI/g9IGgcmQ7A6ctXX/7kOIhlQRSQ9BaZD8NQRH0oRWQBHPAFmQ/DMj+LbEkQ2wBGjwHwI/nTE61xEEcARQ8BiCF45ojqiyU8xwBGDwHKo/XHEWqqgFsARfcC/l4+W34geAKth1T1m9iplCrUn8DciqceP6C4wbGYnLQWkxP73TtMm0Aa0J1A6gWvfCH8hDgZXwQAAAABJRU5ErkJggg==) center no-repeat;}
#hld__img_full .next-img {transform:rotate(180deg);}
#hld__img_full .prev-img:hover {transform:scale(1.2);}
#hld__img_full .next-img:hover {transform:scale(1.2) rotate(180deg);}
.clearfix{clear:both;}
#hld__setting {color:#6666CC;cursor:pointer;}
.hld__list-panel {position:fixed;background:#fff8e7;padding:15px 20px;border-radius:10px;box-shadow:0 0 10px #666;border:1px solid #591804;z-index:9999;}
#hld__banlist_panel {width:500px;}
#hld__keywords_panel {width:182px;}
.hld__tab-content {display:flex;justify-content:space-between;flex-wrap: wrap;}
.hld__list-panel .hld__list-c {width:45%;}
#hld__keywords_panel .hld__list-c {width:100%;}
.hld__list-panel .hld__list-c textarea {box-sizing:border-box;padding:0;margin:0;height:200px;width:100%;resize:none;}
.hld__list-panel .hld__list-desc {margin-top:5px;font-size:9px;color:#666;cursor:help;text-decoration: underline;}
.hld__list-panel .hld__list-c > p:first-child {font-weight:bold;font-size:14px;margin-bottom:10px;}
#hld__updated {position:fixed;top:20px;right:20px;width:200px;padding:10px;border-radius:5px;box-shadow:0 0 15px #666;border:1px solid #591804;background:#fff8e7;z-index: 9999;}
#hld__updated .hld__readme {text-decoration:underline;color:#591804;}
.hld__img-resize {outline:'';outline-offset:'';cursor:alias;min-width:auto !important;min-height:auto !important;max-width:${advancedSetting.imgResizeWidth || 200}px !important;margin:5px;}
#hld__setting_panel {position:relative;background:#fff8e7;width:526px;padding:15px 20px;border-radius:10px;box-shadow:0 0 10px #666;border:1px solid #591804;}
#hld__setting_panel > div.hld__field {float:left;width:50%;}
#hld__setting_panel p {margin-bottom:10px;}
#hld__setting_panel .hld__sp-title {font-size:15px;font-weight:bold;text-align:center;}
#hld__setting_panel .hld__sp-section {font-weight:bold;margin-top:20px;}
.hld__setting-close {position:absolute;top:5px;right:5px;padding:3px 6px;background:#fff0cd;color:#591804;transition:all .2s ease;cursor:pointer;border-radius:4px;text-decoration:none;}
.hld__setting-close:hover {background:#591804;color:#fff0cd;text-decoration:none;}
#hld__setting_panel button {transition:all .2s ease;cursor:pointer;}
button.hld__btn {padding:3px 8px;border:1px solid #591804;background:#fff8e7;color:#591804;}
button.hld__btn:hover {background:#591804;color:#fff0cd;}
.hld__btn-groups {display:flex;justify-content:center !important;margin-top:10px;}
.hld__post-author {color:${advancedSetting.authorMarkColor};font-weight:bold;}
.hld__extra-icon-box {padding: 5px 5px 5px 0;opacity: 0;transition: all ease .2s;}
.hld__extra-icon-box:hover {opacity: 1;}
.hld__extra-icon {position: relative;padding:0 2px;background-repeat:no-repeat;background-position:center;}
.hld__extra-icon svg {width:10px;height:10px;vertical-align:-0.15em;fill:currentColor;overflow:hidden;cursor:pointer;}
.hld__extra-icon:hover {text-decoration:none;}
span.hld__remark {color:#666;font-size:0.8em;}
span.hld__banned {color:#ba2026;}
span.hld__banned:hover {text-decoration: underline;cursor: pointer;}
.hld__sp-fold {padding-left:23px;}
.hld__sp-fold .hld__f-title {font-weight:bold;}
.hld__buttons {clear:both;display:flex;justify-content:space-between;padding-top:15px;}
code {padding:2px 4px;font-size:90%;font-weight:bold;color:#c7254e;background-color:#f9f2f4;border-radius:4px;}
.hld__float-left {float:left;}
.hld__shortcut-desc {width:120px;margin-left:20px;padding-top:6px}
.hld__shortcut-desc p {margin-bottom:5px;}
.hld__script-info {margin-left:4px;font-size:70%;color:#666;}
.hld__reward-panel {width:500px;}
.hld__reward-panel .hld__reward-info {display:block;font-size:15px;margin-bottom:20px;line-height:20px;}
.hld__delete-line {text-decoration:line-through;color:#666;}
.hld__reward-panel .hld__list-c {width:50%;}
.hld__reward-panel .hld__list-c:first-child {margin-right:15px;}
.hld__reward-panel .hld__list-c>img {width:100%;height:auto;}
.hld__excel-body {background:#fff !important;}
.hld__excel-header, .hld__excel-footer, .hld__excel-setting {display: none;}
.hld__excel-body #mainmenu,.hld__excel-body .catenew,.hld__excel-body #toptopics,.hld__excel-body #m_pbtntop,.hld__excel-body #m_fopts,.hld__excel-body #b_nav,.hld__excel-body #fast_post_c,.hld__excel-body #custombg,.hld__excel-body #m_threads th,.hld__excel-body #m_posts th,.hld__excel-body .r_container,.hld__excel-body #footer,.hld__excel-body .clickextend {display:none !important;}
.hld__excel-body #mmc {margin-top:195px;margin-bottom:35px;}
.hld__excel-body .postBtnPos > div, .hld__excel-body .postBtnPos .stdbtn a {background:#fff !important;border-color:#bbb;}
.hld__excel-body .hld__excel-div,.hld__excel-body .hld__excel-setting {display:block;}
.hld__excel-body .hld__excel-setting {position:fixed;width:60px;height:20px;top:5px;right:95px;background:#f2f4f7;z-index:999;}
.hld__excel-body .hld__excel-setting img {width:20px;height:auto;vertical-align:middle;}
.hld__excel-body .hld__excel-setting a {margin-left:5px;vertical-align:middle;}
.hld__excel-body .hld__excel-header {position:fixed;top:0;left:0;height:196px;}
.hld__excel-body .hld__excel-footer {position:fixed;bottom:0;left:0;height:50px;}
.hld__excel-body .hld__excel-header, .hld__excel-body .hld__excel-footer {width: 100%;text-align: center;font-size: 16px;font-weight: bold;background:#e8e8e8;color:#337ab7;line-height: 45px;}
.hld__excel-body .hld__excel-header>img, .hld__excel-body .hld__excel-footer>img{position:absolute;top:0;left:0}
.hld__excel-body #m_nav {position:fixed;top:136px;left:261px;margin:0;padding:0;z-index:99;width: 9999px;}
.hld__excel-body #m_nav .nav_spr {display:block;border:0;border-radius:0;padding:0;box-shadow:none;background:none;}
.hld__excel-body #m_nav .nav_spr span {color:#000;font-size:16px;vertical-align:unset;font-weight:normal;}
.hld__excel-body #m_nav .nav_root,.hld__excel-body #m_nav .nav_link {background:none;border:none;box-shadow:none;padding:0;color:#000;border-radius:0;font-weight:normal;}
.hld__excel-body #m_threads {margin:0;}
.hld__excel-body #topicrows {border:none;box-shadow:none;border-radius:0;margin:0;background-color:#fff;counter-reset:num;border-spacing:0;}
.hld__excel-body #topicrows tbody {border-spacing:0;}
.hld__excel-body .topicrow {border-spacing:0;}
.hld__excel-body #topicrows td {background:#fff;padding:5px 0;margin:0;border:none;border-right:1px solid #bbbbbb;border-bottom:1px solid #bbbbbb;margin-right:-1px;}
.hld__excel-body .topicrow .c1 {width:33px;background:#e8e8e8 !important;}
.hld__excel-body .topicrow .c1 a {display:none;color: #777777 !important;font-size: 16px !important;font-family: auto;width: 30px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}
.hld__excel-body.hld__excel-original-no .topicrow .c1:before {display:none;}
.hld__excel-body.hld__excel-original-no .topicrow .c1 a {display:inline-block;}
.hld__excel-body.hld__excel-original-no .topicrow .c1 img {width:20px;}
.hld__excel-body .topicrow .c1:before {content:counter(num);counter-increment:num;color:#777777;font-size:16px;}
.hld__excel-body .topicrow .c2 {padding-left:5px !important;}
.hld__excel-body .topicrow .c3 {color:#1a3959 !important;}
.hld__excel-body .block_txt {background:#fff !important;color:#1a3959 !important;border-radius:0;padding:0 !important;min-width:0 !important;font-weight:normal;}
.hld__excel-body .quote {background:#fff !important;}
.hld__excel-body #m_posts .block_txt {font-weight:bold;}
.hld__excel-body .topicrow .postdate,.hld__excel-body .topicrow .replydate {display:inline;margin:10px;}
.hld__excel-body #m_pbtnbtm {margin:0;border-bottom:1px solid #bbbbbb;}
.hld__excel-body #pagebbtm,.hld__excel-body #m_pbtnbtm .right_ {margin:0;}
.hld__excel-body #pagebbtm:before {display:block;line-height:35px;width:33px;float:left;content:"#";border-right:1px solid #bbbbbb;color:#777;font-size:16px;background:#e8e8e8;}
.hld__excel-body #m_pbtnbtm td {line-height:35px;padding:0 5px;}
.hld__excel-body #m_pbtnbtm .stdbtn {box-shadow:none;border:none;padding:0;padding-left:5px;background:#fff;border-radius:0;}
.hld__excel-body #m_pbtnbtm .stdbtn .invert {color:#591804;}
.hld__excel-body #m_pbtnbtm td a {background:#fff;padding:0;border:0;}
.hld__excel-body #m_posts .comment_c .comment_c_1 {border-top-color:#bbbbbb;}
.hld__excel-body #m_posts .comment_c .comment_c_2 {border-color:#bbbbbb;}
.hld__excel-body #m_posts {border:0;box-shadow:none;padding-bottom:0;margin:0;counter-reset:num;}
.hld__excel-body #m_posts td {background:#fff;border-right:1px solid #bbbbbb;border-bottom:1px solid #bbbbbb;}
.hld__excel-body #m_posts .c0 {width:32px;color:#777;font-size:16px;background:#e8e8e8;text-align:center;}
.hld__excel-body #m_posts .c0:before {content:counter(num);counter-increment:num;}
.hld__excel-body #m_posts .vertmod {background:#fff !important;color:#ccc;}
.hld__excel-body #m_posts a[name="uid"]:before {content:"UID:"}
.hld__excel-body #m_posts .white,.hld__excel-body #m_posts .block_txt_c2,.hld__excel-body #m_posts .block_txt_c0 {background:#fff !important;color:#777777;}
.hld__excel-body #m_posts .quote {background:#fff;border-color:#bbbbbb;}
.hld__excel-body #m_posts button {background:#eee;}
.hld__excel-body #m_posts .postbox {border:none !important;}
.hld__excel-body.hld__reply-fixed #postbbtm {position:fixed;right:30px;top:75px;z-index:999;border-radius: 10px;overflow: hidden;}
.hld__flex{display:flex;}
#hld__noti_container {position:fixed;top:10px;left:10px;}
.hld__noti-msg {display:none;padding:10px 20px;font-size:14px;font-weight:bold;color:#fff;margin-bottom:10px;background:rgba(0,0,0,0.6);border-radius:10px;cursor:pointer;}
.hld__advanced-setting {border-top: 1px solid #e0c19e;border-bottom: 1px solid #e0c19e;padding: 3px 0;margin-top:25px;}
.hld__advanced-setting >span {font-weight:bold}
.hld__advanced-setting >button {padding: 0px;margin-right:5px;width: 18px;text-align: center;}
.hld__advanced-setting-panel {display:none;padding:5px 0;flex-wrap: wrap;}
.hld__advanced-setting-panel>p {width:100%;}
.hld__advanced-setting-panel>table {width:50%;}
.hld__advanced-setting-panel>p {margin: 7px 0 !important;font-weight:bold;}
.hld__advanced-setting-panel>p svg {height:16px;width:16px;vertical-align: top;margin-right:3px;}
.hld__advanced-setting-panel>table td {padding-right:10px}
.hld__advanced-setting-panel input[type=text],.hld__advanced-setting-panel input[type=number] {width:80px}
.hld__advanced-setting-panel .hld__adv-help {cursor:help;text-decoration: underline;}
.hld__ep-container{display:flex;width:300px;margin-bottom: 7px;}
.hld__ep-container p {margin-bottom:10px;}
.hld__ep-container >div{width:50%;}
.hld__ep-container textarea {width: 100%;padding:0;margin:0;resize:none;}
.hld__table-keyword {margin-top:10px;width:200px;}
.hld__table-keyword tr td:last-child {text-align:center;}
.hld__table-keyword input[type=text] {width:48px;text-transform:uppercase;text-align:center;}
.hld__tab-header{height:40px}
.hld__tab-header>span{margin-right:10px;padding:5px;cursor:pointer}
.hld__tab-header .hld__table-active,.hld__tab-header>span:hover{color:#591804;font-weight:700;border-bottom:3px solid #591804}
.hld__tab-content{display:none}
.hld__tab-content.hld__table-active{display:flex}
.hld__msg{display:none;position:fixed;top:10px;left:48%;color:#fff;text-align:center;z-index:99996;padding:10px 30px 10px 45px;font-size:16px;border-radius:10px;background-image:url("data:image/svg+xml,%3Csvg t='1595842925125' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='2280' width='200' height='200'%3E%3Cpath d='M89.216226 575.029277c-6.501587-7.223986-10.47478-15.892769-12.641975-26.367549-1.805996-10.47478-0.722399-20.22716 3.973192-29.257143l4.695591-10.47478c5.05679-8.307584 11.558377-13.725573 19.865961-15.892769 7.946384-2.167196 15.892769-0.361199 23.477954 5.417989L323.995767 639.322751c8.307584 5.779189 17.698765 8.668783 27.812346 8.307584 10.11358-0.361199 18.782363-3.611993 26.006349-10.11358L898.302646 208.411993c7.585185-5.779189 16.253968-8.307584 26.006349-7.585185 9.752381 0.722399 18.059965 4.334392 24.922751 10.47478l-12.641975-12.641975c6.501587 7.223986 9.752381 15.17037 9.752381 24.561552 0 9.391182-3.250794 17.337566-9.752381 24.561552L376.008466 816.310406c-7.223986 7.223986-15.17037 10.47478-24.200353 10.47478-9.029982 0-16.976367-3.250794-24.200353-9.752381L89.216226 575.029277z' p-id='2281' fill='%23ffffff'%3E%3C/path%3E%3C/svg%3E");background-size:25px;background-repeat:no-repeat;background-position:15px}
.hld__msg a{color:#fff;text-decoration: underline;}
.hld__msg-ok{background:#4bcc4b}
.hld__msg-err{background:#c33}
.hld__msg-warn{background:#FF9900}
.hld__dialog{position:absolute;padding-right:35px}
.hld__dialog>div{line-height:30px}
.hld__dialog:before{position:absolute;content:' ';width:10px;height:10px;background-color:#fff6df;left:10px;transform:rotate(45deg)}
.hld__dialog-sub-top:before{top:-6px;border-top:1px solid #591804;border-left:1px solid #591804}
.hld__dialog-sub-bottom:before{bottom:-5px;border-bottom:1px solid #591804;border-right:1px solid #591804}
.hld__dialog-buttons{display:flex;justify-content:flex-end!important;margin-top:10px}
.hld__dialog-buttons>button{cursor:pointer}
.hld__dialog-user{font-size:1.5em;color:red;margin:0 5px}
.hld__dialog input[type=text]{width:100px;margin-right:15px}
.hld__dialog-mark-table td{padding-bottom:3px}
.hld__dialog-mark-table button{padding:0 6px;margin:0;height:20px;line-height:20px;width:20px;text-align:center;cursor:pointer}
.cp-color-picker{z-index:99997}
.sp-container{position:absolute;top:0;left:0;display:inline-block;z-index:9999994;overflow:hidden}
.sp-original-input-container{position:relative;display:inline-flex}
.sp-original-input-container input{margin:0!important}
.sp-original-input-container .sp-add-on{width:40px;border-top-right-radius:0!important;border-bottom-right-radius:0!important}
input.spectrum.with-add-on{border-top-left-radius:0;border-bottom-left-radius:0;border-left:0}
.sp-original-input-container .sp-add-on .sp-colorize{height:100%;width:100%;border-radius:inherit}
.sp-colorize-container{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}
.sp-container.sp-flat{position:relative}
.sp-container,.sp-container *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}
.sp-top{position:relative;width:100%;display:inline-block}
.sp-top-inner{position:absolute;top:0;left:0;bottom:0;right:0}
.sp-color{position:absolute;top:0;left:0;bottom:0;right:20px!important}
.sp-hue{position:absolute;top:0;right:0;bottom:0;width:12px;height:100%;left:initial!important}
.sp-clear-enabled .sp-hue{top:15%;height:85%}
.sp-fill{padding-top:80%}
.sp-sat,.sp-val{position:absolute;top:0;left:0;right:0;bottom:0}
.sp-alpha-enabled .sp-top{margin-bottom:28px!important}
.sp-alpha-enabled .sp-alpha{display:block}
.sp-alpha-handle{position:absolute;top:-3px;cursor:pointer;height:16px;border-radius:50%;width:16px;margin-right:5px;left:-2px;right:0;background:#f9f9f9;box-shadow:0 0 2px 0 #3a3a3a}
.sp-alpha{display:none;position:absolute;bottom:-18px;right:0;left:0;height:10px}
.sp-alpha-inner{border-radius:4px}
.sp-clear{display:none}
.sp-clear.sp-clear-display{background-position:center}
.sp-clear-enabled .sp-clear{display:block;position:absolute;top:3px;right:0;bottom:0;cursor:pointer;left:initial;height:12px;width:12px}
.sp-alpha,.sp-alpha-handle,.sp-clear,.sp-container,.sp-container button,.sp-container.sp-dragging .sp-input,.sp-dragger,.sp-preview,.sp-replacer,.sp-slider{-webkit-user-select:none;-moz-user-select:-moz-none;-o-user-select:none;user-select:none}
.sp-container.sp-input-disabled .sp-input-container{display:none}
.sp-container.sp-buttons-disabled .sp-button-container{display:none}
.sp-container.sp-palette-buttons-disabled .sp-palette-button-container{display:none}
.sp-palette-only .sp-picker-container{display:none}
.sp-palette-disabled .sp-palette-container{display:none}
.sp-initial-disabled .sp-initial{display:none}
.sp-sat{background-image:-webkit-gradient(linear,0 0,100% 0,from(#fff),to(rgba(204,154,129,0)));background-image:-webkit-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:-moz-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:-o-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:-ms-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:linear-gradient(to right,#fff,rgba(204,154,129,0))}
.sp-val{border-radius:4px;background-image:-webkit-gradient(linear,0 100%,0 0,from(#000),to(rgba(204,154,129,0)));background-image:-webkit-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-moz-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-o-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-ms-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:linear-gradient(to top,#000,rgba(204,154,129,0))}
.sp-hue{background:-moz-linear-gradient(top,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);background:-ms-linear-gradient(top,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);background:-o-linear-gradient(top,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(.17,#ff0),color-stop(.33,#0f0),color-stop(.5,#0ff),color-stop(.67,#00f),color-stop(.83,#f0f),to(red));background:-webkit-linear-gradient(top,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}
.sp-1{height:17%}
.sp-2{height:16%}
.sp-3{height:17%}
.sp-4{height:17%}
.sp-5{height:16%}
.sp-6{height:17%}
.sp-hidden{display:none!important}
.sp-cf:after,.sp-cf:before{content:"";display:table}
.sp-cf:after{clear:both}
@media (max-device-width:480px){.sp-color{right:40%}
.sp-hue{left:63%}
.sp-fill{padding-top:60%}
}
.sp-dragger{border-radius:5px;height:10px;width:10px;border:1px solid #fff;cursor:pointer;position:absolute;top:0;left:0;margin-left:3px;margin-top:3px;box-shadow:0 0 2px 1px rgba(0,0,0,.2)}
.sp-slider{position:absolute;top:0;cursor:pointer;height:16px;border-radius:50%;width:16px;left:-2px;background:#f9f9f9;box-shadow:0 0 2px 0 #3a3a3a;margin-top:8px}
.sp-container{display:inline-flex;border-radius:0;background-color:#fff;padding:0;border-radius:4px;color:#000;box-shadow:0 0 0 1px rgba(99,114,130,.16),0 8px 16px rgba(27,39,51,.08)}
.sp-clear,.sp-color,.sp-container,.sp-container button,.sp-container input,.sp-hue{font-size:12px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}
.sp-top{margin-bottom:10px}
.sp-clear,.sp-color,.sp-hue,.sp-sat,.sp-val{border-radius:3px}
.sp-input-container{margin-top:-5px}
.sp-button-container.sp-cf,.sp-initial.sp-thumb.sp-cf,.sp-input-container.sp-cf{height:25px}
.sp-picker-container .sp-cf{margin-bottom:10px}
.sp-palette-row-initial>span:first-child{cursor:pointer}
.sp-initial-disabled .sp-input-container{width:100%}
.sp-input{padding:0 5px!important;margin:0;width:100%;box-shadow:none!important;height:100%!important;background:0 0;color:#3a3a3a;border-radius:2px!important;border:1px solid #e0e0e0!important;text-align:center;font-family:monospace;font-size:inherit!important}
.sp-input.sp-validation-error{border:1px solid red;background:#fdd}
.sp-palette-container,.sp-picker-container{position:relative;padding:10px}
.sp-picker-container{width:200px;padding-bottom:0}
.sp-palette-container{border-right:solid 1px #ccc}
.sp-palette-only .sp-palette-container{border:0}
.sp-palette .sp-thumb-el{display:block;position:relative;float:left;width:24px;height:15px;margin:3px;cursor:pointer;border:solid 2px transparent}
.sp-palette .sp-thumb-el.sp-thumb-active,.sp-palette .sp-thumb-el:hover{border-color:orange}
.sp-thumb-el{position:relative}
.sp-initial{float:left}
.sp-initial span{width:30px;height:25px;border:none;display:block;float:left;margin:0}
.sp-initial .spe-thumb-el.sp-thumb-active{border-radius:0 5px 5px 0}
.sp-initial .spe-thumb-el{border-radius:5px 0 0 5px}
.sp-initial .sp-clear-display{background-position:center}
.sp-button-container{float:right;display:none;}
.sp-palette-button-container{margin-top:10px}
.sp-replacer{position:relative;overflow:hidden;cursor:pointer;display:inline-block;border-radius:3px;border:1px solid #aaa;color:#666;transition:border-color .3s;vertical-align:middle;width:40px;height:20px;margin: 1.5px 3px;}
.sp-replacer.sp-active,.sp-replacer:hover{border:1px solid #666;color:#000}
.sp-replacer.sp-disabled{cursor:default;border-color:silver;color:silver}
.sp-dd{position:absolute;font-size:10px;right:0;top:0;bottom:0;padding:0 1px;line-height:22px;background-color:#fff;border-left: 1px solid #aaa;}
.sp-preview{position:relative;width:100%;height:100%;float:left;z-index:0}
.sp-preview-inner{transition:background-color .2s}
.sp-preview-inner.sp-clear-display{display:none}
.sp-palette .sp-thumb-el{width:16px;height:16px;margin:3px;border:none;border-radius:3px}
.sp-container button{border-radius:3px;border:none;background:0 0;line-height:1;padding:0 8px;height:25px;text-transform:capitalize;text-align:center;vertical-align:middle;cursor:pointer;color:#606c72;font-weight:700}
.sp-container button.sp-choose{background-color:#3cab3b;color:#fff;margin-left:5px}
.sp-container button:hover{opacity:.8}
.sp-container button.sp-palette-toggle{width:100%;background-color:#f3f3f3;margin:0}
.sp-palette span.sp-thumb-active,.sp-palette span:hover{border-color:#000}
.sp-alpha,.sp-preview,.sp-thumb-el{position:relative;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}
.sp-alpha-inner,.sp-preview-inner,.sp-thumb-inner{display:block;position:absolute;top:0;left:0;bottom:0;right:0}
.sp-palette .sp-thumb-inner{border-radius:3px;background-position:50% 50%;background-repeat:no-repeat}
.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=)}
.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=)}
.sp-clear-display{background-repeat:no-repeat;background-position:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABe0lEQVQokYXSsUtcQRTF4d8Jj+VhHSxkEQuLsEUKK0nhTBFTmLSSUhBCMCAWsmgIwWrBLk0akfwLCaSQKBJmtrIIISwpRFKIhViETScphGMzysMtvOVwvpm5d0bGNCuGWAOPgYdl6S8wSDn9b+bUhDHEKWAdeAFMANg+l/TV9ofcz6cjMIbYBvaBMds7QCqZ58CmpBNgPuV0DvAAIMyFGugWtJr7eTv38xEwkPRPErY7QDeG2LqFkjrAgu0dSd/KDVqSNmxvAZ8lfbS9AHRuYemnLWkv5XRVBrQMbAI/gTXgEzAJtJuwBVS2L2OIle03QA/4Lmkl5XQBXEqqbFcAVYFDYChpFngiqWf7l6TXKaezMt2Zkhk24THwG+jZriX9AFZvUAyxLbRke2D75O5zPAO+ADXwEtizjaRHwDvbTyUtppwOmicCHAJvbXcl9YA1SQDjtseA97YPRz7ATcUQp2y/kjRdevsjaTfldNrMjcDGBjXA3T96L7yvrgFzP69+0Ao/HAAAAABJRU5ErkJggg==)}
.hld__marks-container>span{padding:1px 5px;border-radius:3px;margin-right:5px;color:#fff;background-color:#1f72f1}
.hld__table{table-layout:fixed;border-top:1px solid #ead5bc;border-left:1px solid #ead5bc}
.hld__table-banlist-buttons{margin-top:10px}
.hld__table thead{background:#591804;border:1px solid #591804;color:#fff}
.hld__scroll-area{position:relative;height:200px;overflow:auto;border:1px solid #ead5bc}
.hld__scroll-area::-webkit-scrollbar{width:6px;height:6px}
.hld__scroll-area::-webkit-scrollbar-thumb{border-radius:10px;box-shadow:inset 0 0 5px rgba(0,0,0,.2);background:#591804}
.hld__scroll-area::-webkit-scrollbar-track{box-shadow:inset 0 0 5px rgba(0,0,0,.2);border-radius:10px;background:#ededed}
.hld__table td,.hld__table th{padding:3px 5px;border-bottom:1px solid #ead5bc;border-right:1px solid #ead5bc;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hld__us-action{display: inline-block;width:18px;height:18px;margin:0 3px;}
.hld__us-action:hover{opacity:.8}
.hld__us-edit{background-size:20px;background-image:url("data:image/svg+xml,%3Csvg t='1595910222437' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='3699'%3E%3Cpath d='M533.333333 106.666667v85.333333H213.333333v618.666667h618.666667V490.666667h85.333333v405.333333H128V106.666667h405.333333z m355.114667 97.237333L501.504 590.826667l-64.426667-64.426667L824.021333 139.498667l64.426667 64.426666z' p-id='3700'%3E%3C/path%3E%3C/svg%3E")}
.hld__us-del{background-image:url("data:image/svg+xml,%3Csvg t='1595910451854' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='4969'%3E%3Cpath d='M769.214785 190.785215V0h-511.488511v190.785215H2.365634v65.918082H1022.977023V190.785215h-253.762238zM320.959041 61.954046h384.383616v128.895105H320.959041V61.954046zM386.621379 382.593407h61.954046v446.593406h-61.954046V382.593407zM577.406593 382.593407H639.360639v446.593406h-61.954046V382.593407z' p-id='4970'%3E%3C/path%3E%3Cpath d='M832.191808 959.040959h-639.360639V318.657343h-63.936064v705.342657h767.616384V318.657343h-64.319681V959.040959z' p-id='4971'%3E%3C/path%3E%3C/svg%3E")}
.hld__docker{position:fixed;height:80px;width:30px;bottom:135px;right:0;transition:all ease .2s}
.hld__docker:hover{width:150px;height:200px;bottom:80px}
.hld__docker-sidebar{background:#0f0;position:fixed;height:50px;width:20px;bottom:150px;right:0;display:flex;justify-content:center;align-items:center;background:#fff6df;border:1px solid #591804;box-shadow:0 0 5px #444;border-right:none;border-radius:5px 0 0 5px}
.hld__excel-body .hld__docker-sidebar{background:#fff;border:1px solid #bbb}
.hld__docker-btns{position:absolute;top:0;left:50px;bottom:0;right:50px;display:flex;justify-content:center;align-items:center;flex-direction:column}
.hld__docker .hld__docker-btns>div{opacity:0}
.hld__docker:hover .hld__docker-btns>div{opacity:1}
.hld__docker-btns>div{background:#fff6df;border:1px solid #591804;box-shadow:0 0 5px #444;width:50px;height:50px;border-radius:50%;margin:10px 0;cursor:pointer;display:flex;justify-content:center;align-items:center}
.hld__excel-body .hld__docker-btns>div{background:#fff;border:1px solid #bbb}
.hld__docker-btns svg{width:30px;height:30px;transition:all ease .2s}
.hld__docker-btns svg:hover{width:40px;height:40px}
.hld__quote-fold{height:150px;overflow:hidden;position: relative;}
.hld__quote-box{padding:10px;position: absolute;left:0;right:0;bottom:0;background:#f2eddf;}
.hld__excel-body .hld__quote-box{background:#FFF;}
`))
    document.getElementsByTagName('head')[0].appendChild(style)
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址