搜索引擎重定向优化(百度、搜狗、谷歌、必应)

1.绕过百度、搜狗、谷歌、好搜搜索结果中的自己的跳转连接,直接访问原始网页-反正都能看懂 2.新增自定义网站拦截功能 3添加Favicon显示 4.页面CSS 5.添加计数 6.开关选择以上功能 7.自动翻页功能

// ==UserScript==
// @name    搜索引擎重定向优化(百度、搜狗、谷歌、必应)
// @name:en    Search engine redirection optimization (Baidu, Sogou, Google, Bing)
// @name:zh    搜索引擎重定向优化(百度、搜狗、谷歌、必应)
// @description  1.绕过百度、搜狗、谷歌、好搜搜索结果中的自己的跳转连接,直接访问原始网页-反正都能看懂 2.新增自定义网站拦截功能 3添加Favicon显示 4.页面CSS 5.添加计数 6.开关选择以上功能 7.自动翻页功能
// @description:en  1. Bypass your own redirect connection in search results from Baidu, Sogou, Google, and Haosu, and directly access the original webpage - you can understand it anyway. 2. Add custom website interception function. 3. Add Favicon display. 4. Page CSS. 5. Add counting. 6. Switch to select the above functions. 7. Automatic page flipping function
// @namespace    http://www.dfer.site
// @icon    data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAuRJREFUWEftmE/ITVEUxX/f0EyZIIVMFCVlQFHEgDIxUAyEDJRSFDGRfwP/IykTxUChGJMJolCKoQFRDA0kAwPFWdnnde6/c+95535109v1Bt97+56zzlpr77PvN8XAY2rg+JgAzFVowiCwwD5Px2FzOhgUoJ3ARmBlAOoz8Ab4CZwE9Hdr9A3wuNvxhO0qAO8d0FfADGARsBqYbeBuGdAoyL4AirU7xpgAbY8wpNyHwGLgHbAlxmYIcDlwEPjVwvscYB/wxfLEynPgK3AJuNKq2z8m1xvbYnph0zMhQEkjibrEeeCIJT4B1hprd7s8HOQcAC4D94Gtdc+WJZZPusRHSzprQMWa2B8nJPdSYIc7aKXScz34x4pg1TjI7Bl58qVZqyJ1DkAvz27X51SROeGrXwAL7ScH4C7gphm8U0+LnEAelpfXlWUuA1Ti74aFVKUhEIETyJxD+q0k8yfrAAUvh4vfcK1jT4tOYb73jU7dR6htqYcWqjncUL1pM/AtstvF4Le37sQzYz0sEbUKTl6Wp0eRI4+XWJJ0ac4xvIeAC+5KPOeq+WhfALfZ9aZrLbVBl8H6w64BXvQF0Btb96muyZyQn7WertFC5Eishbw0h4HQnylgPXuVFqNFQoCSTPdr27DwLPCJCuu0nV5XVUGeDih9/3sEbKrLL1exjNoWD0pseanVI++VTR5Z7BRwzKYgea+22edK7PcX+2eMSU1FmpibQqzfdrfQfOAHsDdWZH0BFBg/6gug2PgOfHDSvQaW2HeSVJ8wKq2lrypuYkhDxDKbmMN3EuXrutTsJ9DzrPfpMI3+7ZPBOsCSU7GioZlrWNWBBFJVXPFhGaAGx7ltVdLy++OE58N3mdqpOgR4FdifsHhT6rXEdQRS7zSSvFJgIUAlbgBmZYKU6VPDD7/yaGH0n24PpgAN/TgqmiEBlILX7T8So9YzJIBiW1Wv1jS614cGsGKJCcCUKqnLnTD43zP4Fzwyhikkf7jmAAAAAElFTkSuQmCC
// @author       dfer
// @supportURL [email protected]
// @copyright  2023-2024
// @license Copyright Dfer.Site
// @run-at     document-body
// @version    1.0.3

// @connect    baidu.com
// @connect    google.com
// @connect    google.com.hk
// @connect    google.com.jp
// @connect    bing.com
// @connect    duckduckgo.com
// @connect    dogedoge.com
// @connect    so.com

// @include    *://ipv6.baidu.com/*
// @include    *://www.baidu.com/*
// @include    *://www1.baidu.com/*
// @include    *://m.baidu.com/*
// @include    *://xueshu.baidu.com/s*
// @include    *://www.so.com/s?*
// @include    *://*.bing.com/*
// @include    *://encrypted.google.*/search*
// @include    *://*.google*/search*
// @include    *://*.google*/webhp*
// @include    *://*.zhihu.com/*
// @include    *://*duckduckgo.com/*
// @include    *://*.dogedoge.com/*

// @exclude    *://*.google*/sorry*
// @exclude    https://zhidao.baidu.com/*
// @exclude    https://*.zhidao.baidu.com/*
// @exclude    https://www.baidu.com/img/*
// @exclude    https://lens.google.com/*

// @resource  baiduCommonStyle   https://ibaidu.tujidu.com/newcss/baiduCommonStyle.less?t=26.05
// @resource  baiduOnePageStyle  https://ibaidu.tujidu.com/newcss/baiduOnePageStyle.less?t=26.05
// @resource  baiduTwoPageStyle  https://ibaidu.tujidu.com/newcss/baiduTwoPageStyle.less?t=26.05
// @resource  googleCommonStyle  https://ibaidu.tujidu.com/newcss/googleCommonStyle.less?t=26.06
// @resource  googleOnePageStyle https://ibaidu.tujidu.com/newcss/googleOnePageStyle.less?t=26.05
// @resource  googleTwoPageStyle https://ibaidu.tujidu.com/newcss/googleTwoPageStyle.less?t=26.05
// @resource  bingCommonStyle    https://ibaidu.tujidu.com/newcss/bingCommonStyle.less?t=26.05
// @resource  bingOnePageStyle   https://ibaidu.tujidu.com/newcss/bingOnePageStyle.less?t=26.05
// @resource  bingTwoPageStyle   https://ibaidu.tujidu.com/newcss/bingTwoPageStyle.less?t=26.05
// @resource  duckCommonStyle    https://ibaidu.tujidu.com/newcss/duckCommonStyle.less?t=26.05
// @resource  duckOnePageStyle   https://ibaidu.tujidu.com/newcss/duckOnePageStyle.less?t=26.05
// @resource  duckTwoPageStyle   https://ibaidu.tujidu.com/newcss/duckTwoPageStyle.less?t=26.05
// @resource  dogeCommonStyle    https://ibaidu.tujidu.com/newcss/dogeCommonStyle.less?t=26.05
// @resource  dogeOnePageStyle   https://ibaidu.tujidu.com/newcss/dogeOnePageStyle.less?t=26.05
// @resource  dogeTwoPageStyle   https://ibaidu.tujidu.com/newcss/dogeTwoPageStyle.less?t=26.05
// @resource  MainHuYanStyle     https://ibaidu.tujidu.com/newcss/HuYanStyle.less?t=26.06
// @resource  BgAutoFit          https://ibaidu.tujidu.com/newcss/BgAutoFit.less?t=26.05
// @resource  baiduLiteStyle     https://gitcode.net/-/snippets/1906/raw/master/LiteStyle.css?inline=false

// @require https://lib.baomitu.com/vue/2.6.14/vue.min.js
// @require https://lib.baomitu.com/less.js/4.1.2/less.min.js
// @require https://lib.baomitu.com/md5-wasm/1.2.0/md5-wasm.min.js

// @grant    GM_getValue
// @grant    GM.getValue
// @grant    GM_setValue
// @grant    GM.setValue
// @grant    GM_addStyle
// @grant    GM_getResourceURL
// @grant    GM_listValues
// @grant    GM.getResourceUrl
// @grant    GM_xmlhttpRequest
// @grant    GM_getResourceText
// @grant    GM_registerMenuCommand
// @grant    unsafeWindow

// ==/UserScript==

! function() {
    let isdebug = false; // 调试日志用
    let isLocalDebug = false; // 加载本地资源用,调试的时候小心GM的缓存机制
    let debug = isdebug ? console.log.bind(console) : () => {}
    let acCssLoadFlag = false;

    // 判断火狐浏览器
    let isFirefox = navigator.userAgent.indexOf("Firefox") > 0;
    let googleBlockType = isFirefox ? "#rso a[href]" : "#rso a[ping]";

    let inExtMode = typeof(isExtension) !== "undefined";
    let inGMMode = typeof(GM_info.scriptHandler) !==
        "undefined"; // = "Greasemonkey" || "Tampermonkey" || "ViolentMonkey"
    // inExtMode & inGMMode
    // true    true =扩展下的GM代码 不执行
    // true    false=扩展下代码 执行
    // false  true =仅GM代码 执行
    // false  false=异常 但是还是要执行代码
    debug("程序开始");
    if (inExtMode === true && inGMMode === true || typeof(window.AC666Init) !== 'undefined') {
        console.log("扩展模式-脚本不启用");
        return;
    }
    window.AC666Init = true
    if (typeof(GM) === "undefined") {
        // 这个是ViolentMonkey的支持选项
        GM = {};
        GM.setValue = GM_setValue;
        GM.getValue = GM_getValue;
    }
    // 增加了一个css的缓冲层,保证多次CSS操作不导致页面卡顿,减少重排的次数
    class FlushDomFragment {
        constructor() {
            this.init()
        }

        init() {
            this.length = 0

            this.fragmentHead = document.createDocumentFragment();
            this.fragmentBody = document.createDocumentFragment();
            this.fragmentDOM = document.createDocumentFragment();

            this.reloadList = [] // 所有需要动态刷新的都在这里面
        }

        _removeReload() {
            this.reloadList.map(selector => {
                safeRemove(selector)
            })
        }

        _singleInsert(node, toDom, checkDom) {
            if (node) {
                const {
                    dataset: {
                        xclass: selector = ''
                    } = {},
                    tagName = ''
                } = node
                if (tagName.toUpperCase() === 'STYLE') {
                    if (selector) {
                        if (checkDom.querySelector(selector)) return
                    } else {
                        console.error('出现没有样式的节点', node)
                    }
                }

                toDom.appendChild(node)

                this.length += 1
                debug('增加节点', node)
                debug('长度变化', this.length)
            }
        }

        // 如果CSS已经存在了,那么就不再添加了
        _dropMultiCSS(fragment) {
            const newFrag = document.createDocumentFragment();
            [...fragment.childNodes].map(node => {
                this._singleInsert(node, newFrag, document)
            })
            return newFrag
        }

        flush() {
            if (this.length > 0) { // 有数据,才进行flush,否则没有必要
                this._removeReload()

                // MARK 保证线程安全,将现有数据暂存,然后生成新的节点,避免其他js插入后丢失
                const curBodyFrag = this.fragmentBody
                const curHeadFrag = this.fragmentHead
                const curDomFrag = this.fragmentDOM

                this.init()

                // 数据清除
                const newBodyFrag = this._dropMultiCSS(curBodyFrag)
                const newHeadFrag = this._dropMultiCSS(curHeadFrag)
                const newDomFrag = this._dropMultiCSS(curDomFrag)

                debug('数据flush1', newBodyFrag.children.length)
                debug('数据flush2', newHeadFrag.children.length)
                debug('数据flush3', newDomFrag.children.length)

                safeWaitFunc("body", body => {
                    document.body.appendChild(newBodyFrag)
                })
                safeWaitFunc("head", body => {
                    document.head.appendChild(newHeadFrag)
                })
                document.insertBefore(newDomFrag, document.documentElement)
            }
        }

        appendChild(node, to = 'head', config = {
            isReload: false
        }) {
            return this.insert(node, to, config)
        }

        insert(node, to = 'head', config = {
            isReload: false
        }) {

            if (to === 'body') {
                this._singleInsert(node, this.fragmentBody, this.fragmentBody)
            } else if (to === 'head') {
                this._singleInsert(node, this.fragmentHead, this.fragmentHead)
            } else if (to === 'DOM') {
                this._singleInsert(node, this.fragmentDOM, this.fragmentDOM)
            } else {
                console.error('不支持的节点操作')
                return
            }

            const {
                isReload
            } = config
            if (isReload) {
                const {
                    classList = []
                } = node
                if (classList.length) {
                    this.reloadList.push('.' + [...(node.classList || [])].join('.'))
                } else {
                    console.error('异常的reload参数,没有classList', node)
                }
            }
            return this
        }
    }

    function safeRemoveAd(cssSelectorOrNodeList) {
        safeRemove(cssSelectorOrNodeList, {
            withAni: false,
            isAd: true // 标志是广告
        })
    }

    function safeRemove(cssSelectorOrNodeList, option = {
        withAni: false, // 带动效的删除
        isAd: false // true = 有日志,false = 无日志
    }) {
        safeFunction(() => {
            const {
                withAni = false, isAd = false
            } = option

            let removeNodes = cssSelectorOrNodeList
            if (typeof cssSelectorOrNodeList === 'string') {
                removeNodes = document.querySelectorAll(cssSelectorOrNodeList);
            }
            if (removeNodes.length) {
                if (isAd) {
                    console.log(`删除广告节点:${removeNodes.length}个`)
                    console.table(removeNodes)
                }
                for (let i = 0; i < removeNodes.length; i++) {
                    aniRemove(removeNodes[i], withAni)
                }
            }
        })
    }

    function aniRemove(node, withAni) {
        if (withAni) {
            node.classList.add('aniDelete')
            setTimeout(() => {
                node.remove();
            }, 200)
        } else {
            node.remove();
        }
    }

    function safeFunction(func, failCb) {
        try {
            func();
        } catch (e) {
            failCb && failCb()
        }
    }

    /**
     * @param callback 回调函数,需要返回是否结束True、False、否则相当于定时器
     * callback return:
     *  true = 倒计时
     *  false = 计时器
     *  none = 计时器
     * @param period 周期,如:200ms
     * @param runNow 立即执行
     */
    function RAFInterval(callback, period = 50, runNow = false) {
        var shouldFinish = false
        var int_id = null
        if (runNow) {
            shouldFinish = callback()
            if (shouldFinish) return
        }
        int_id = setInterval(() => {
            shouldFinish = callback()
            shouldFinish && clearInterval(int_id)
        }, period)
    }

    function safeWaitFunc(selector, callbackFunc, time, notClear) {
        time = time || 60;
        notClear = notClear || false;
        let doClear = !notClear;
        RAFInterval(function() {
            if ((typeof(selector) === "string" && document.querySelector(selector) != null)) {
                callbackFunc(document.querySelector(selector));
                if (doClear) return true;
            } else if (typeof(selector) === "function" && (selector() != null || (selector() || []).length >
                    0)) {
                callbackFunc(selector()[0]);
                if (doClear) return true;
            }
        }, time, true);
    }

    (function() {
        debug("程序执行");
        let needDisplayNewFun = true; // 本次更新是否有新功能需要展示
        if (window.NodeList && !NodeList.prototype.forEach) {
            NodeList.prototype.forEach = function(callback, thisArg) {
                thisArg = thisArg || window;
                for (var i = 0; i < this.length; i++) {
                    callback.call(thisArg, this[i], i, this);
                }
            };
        }
        GM_registerMenuCommand('AC-重定向脚本设置', function() {
            document.querySelector("#sp-ac-content").style.display = 'block';
        });
        GM_registerMenuCommand('脚本重置 - 修复脚本', function() {
            GM_setValue('Config', '{}');
            localStorage.setItem('ACConfig', '{}');
            location.reload();
        });
        // let RedirectMap = new Map();
        let ACConfig = {};
        let DBConfig = {}; // 仅作为普通ACConfig的原始备份,在其他非关键位置时进行保存使用
        /*存在对未初始化变量的初始化赋值-无需担心迭代兼容问题*/
        let DefaultConfig = {
            isRedirectEnable: true, // 是否开启重定向功能
            isAdsEnable: false, // 是否开启去广告模式
            isAutopage: true, // 是否开启自动翻页功能
            isBlockEnable: false, // 是否开启去拦截模式
            isBlockDisplay: false, // 是否删除已拦截的条目
            isBlockBtnNotDisplay: false, // 是否显示block按钮
            AdsStyleEnable: true, // 是否开启自定义样式模式

            baidu: {
                name: 'baidu', // CSS load 的前缀标志
                AdsStyleMode: '0', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
                HuYanMode: false, // 护眼模式-百度
                defaultBgUrl: '', // 默认背景图
                BgFit: true,
            },
            google: {
                name: 'google',
                AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
                HuYanMode: false, // 护眼模式-谷歌
                defaultBgUrl: '', // 默认背景图
                BgFit: true,
            },
            bing: {
                name: 'bing',
                AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
                HuYanMode: false, // 护眼模式-必应
                defaultBgUrl: '', // 默认背景图
                BgFit: true,
            },
            duck: {
                name: 'duck',
                AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
                HuYanMode: false, // 护眼模式-DuckGOGO
            },
            doge: {
                name: 'doge',
                AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
                HuYanMode: false, // 护眼模式-DuckGOGO
            },
            sogou: {
                name: 'sogou',
                AdsStyleMode: '1', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
                HuYanMode: false, // 护眼模式-搜狗
            },
            zhihu: {
                name: 'zhihu',
                AdsStyleMode: '0', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
                HuYanMode: false, // 护眼模式-搜狗
            },
            other: {
                name: 'other',
                AdsStyleMode: '0', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
                HuYanMode: false, // 护眼模式-搜狗
            },

            Style_BaiduLite: false, // Baidu_Lite样式表

            defaultHuYanColor: "#DEF1EF",
            isUserColorEnable: true, // 是否开启护眼模式
            isFaviconEnable: true, // 是否开启favicon图标功能
            defaultFaviconUrl: `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAuRJREFUWEftmE/ITVEUxX/f0EyZIIVMFCVlQFHEgDIxUAyEDJRSFDGRfwP/IykTxUChGJMJolCKoQFRDA0kAwPFWdnnde6/c+95535109v1Bt97+56zzlpr77PvN8XAY2rg+JgAzFVowiCwwD5Px2FzOhgUoJ3ARmBlAOoz8Ab4CZwE9Hdr9A3wuNvxhO0qAO8d0FfADGARsBqYbeBuGdAoyL4AirU7xpgAbY8wpNyHwGLgHbAlxmYIcDlwEPjVwvscYB/wxfLEynPgK3AJuNKq2z8m1xvbYnph0zMhQEkjibrEeeCIJT4B1hprd7s8HOQcAC4D94Gtdc+WJZZPusRHSzprQMWa2B8nJPdSYIc7aKXScz34x4pg1TjI7Bl58qVZqyJ1DkAvz27X51SROeGrXwAL7ScH4C7gphm8U0+LnEAelpfXlWUuA1Ti74aFVKUhEIETyJxD+q0k8yfrAAUvh4vfcK1jT4tOYb73jU7dR6htqYcWqjncUL1pM/AtstvF4Le37sQzYz0sEbUKTl6Wp0eRI4+XWJJ0ac4xvIeAC+5KPOeq+WhfALfZ9aZrLbVBl8H6w64BXvQF0Btb96muyZyQn7WertFC5Eishbw0h4HQnylgPXuVFqNFQoCSTPdr27DwLPCJCuu0nV5XVUGeDih9/3sEbKrLL1exjNoWD0pseanVI++VTR5Z7BRwzKYgea+22edK7PcX+2eMSU1FmpibQqzfdrfQfOAHsDdWZH0BFBg/6gug2PgOfHDSvQaW2HeSVJ8wKq2lrypuYkhDxDKbmMN3EuXrutTsJ9DzrPfpMI3+7ZPBOsCSU7GioZlrWNWBBFJVXPFhGaAGx7ltVdLy++OE58N3mdqpOgR4FdifsHhT6rXEdQRS7zSSvFJgIUAlbgBmZYKU6VPDD7/yaGH0n24PpgAN/TgqmiEBlILX7T8So9YzJIBiW1Wv1jS614cGsGKJCcCUKqnLnTD43zP4Fzwyhikkf7jmAAAAAElFTkSuQmCC`, // 默认图标
            doDisableSug: true, // 是否禁止百度搜索预测
            isRightDisplayEnable: true, // 是否开启右侧边栏
            isCounterEnable: false, // 是否显示计数器
            isALineEnable: false, // 是否禁止下划线
            isUserStyleEnable: false, // 是否开启自定义样式
            normalizeDuck: true, // 是否按照常用习惯去配置DuckDuckGo
            acceptLicense: false,
            isEnLang: false,
            isGooleInBaiduModeEnable: false, // 是否开启谷歌搜索结果页的百度图标显示
            UserBlockList: [],
            UserStyleText: `/**计数器的颜色样式*/
div .AC-CounterT{
  background: #FD9999;
}
/**百度样式区域**/
body[baidu] {
  position: relative;

  /**右侧栏的样式-其实不开启更好看一些*/
  #content_right{
    padding: 20px 15px 15px !important;
    border-radius: 5px;
    background-color: #FFFFFF66;
    box-sizing: border-box;
    box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1);
    -webkit-box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1);
    -moz-box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1);
  }
  &:before{
    position: fixed;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    content: '';
    background-image: url('https://img.tujidu.com/image/620210010b2cd.jpg');
    background-size: 100% auto;
    opacity: 0.6; /*背景图透明度=0.8,最大1*/
  }

  /**隐藏首页的大图标-修复可能导致外援样式异常**/
  #s_lg_img_new{
    display:none !important;
  }

  #wrapper #s_tab {
    background-color: rgba(248, 248, 248, 0.4);
  }

  #content_left>.c-container{
    border-radius: 5px;
    background-color: rgba(255,255,255, 0.6) !important; /*百度搜索块体的颜色;透明度=0.1,最大1*/

    h3{
      background-color: rgba(248,248,248, 0.6) !important; /*百度搜索块体 - 标题的颜色;透明度=0.1,最大1*/
    }
  }
}
body[google] {

  &:before {
    position: fixed;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    content: '';
    background-image: url('https://img.tujidu.com/image/620210010b2cd.jpg');
    background-size: 100% auto;
    opacity: 0.8; /*背景图透明度=0.8,最大1*/
  }

  #rso .g, .sfbg, .f6F9Be, .k8XOCe {
    background-color: rgba(248,248,248, 0.6) !important;
  }

  .sfbg{
    margin-top: -10px;
  }

  .yg51vc{
    background-color: transparent !important;
  }
}

`,
            oldVersion: "",
            lastSaveTime: new Date().getTime(),
        };
        let CONST = {
            hasNewFuncNeedDisplay: true,
            sortIndex: 1,
            isGoogleImageUrl: false,
            isGoogleSpecial: false, // 判断是否存在#rso>.g; true=存在
            useItem: {},
            fsBaidu: null,
            flushNode: new FlushDomFragment(),
        };

        var curSite = {
            SiteTypeID: 1, // 当前站点的ID
            MainType: "", // 主体节点,很多个的父节点
            Stype_Normal: "", // 重定向选择器,只有百度-搜狗-好搜
            FaviconType: "", // favicon的域名检查器cite,用于获取host用
            FaviconAddTo: "", // favicon选择器,用于插入到title之前的
            CounterType: "", // 计数器添加的位置,一般和favicon位置一致
            BlockType: "", // 屏蔽按钮的位置,一般在title之后
            GMStyleList: {},
        };
        let DBSite = {
            baidu: {
                SiteTypeID: 1,
                MainType: "#content_left>.c-container",
                Stype_Normal: "h3.t>a, .c-container article a",
                FaviconType: ".c-showurl, .c-title a",
                FaviconAddTo: "h3",
                CounterType: "#content_left>#double>div[srcid] *[class~=t],[class~=op_best_answer_question],#content_left>div[srcid] *[class~=t],[class~=op_best_answer_question]",
                BlockType: "h3 a",
                pager: {
                    nextLink: '//div[@id="page"]//a[contains(text(),"下一页")][@href]',
                    pageElement: "css;div#content_left > *",
                    HT_insert: ["css;div#content_left", 2], // 1 = beforebegin; 2 = beforeend
                    replaceE: "css;#page",
                    stylish: ".autopagerize_page_info, div.sp-separator {margin-bottom: 10px !important;}.c-img-border{display:none}",
                }
            },
            sogou: {
                SiteTypeID: 2,
                MainType: "#main .results>div",
                Stype_Normal: "h3.pt>a, h3.vrTitle>a",
                FaviconType: "cite[id*='cacheresult_info_']",
                FaviconAddTo: "h3",
                CounterType: ".results>div",
                BlockType: "h3 a",
                pager: {
                    nextLink: "//div[@id=\"pagebar_container\"]//a[@id=\"sogou_next\"]",
                    pageElement: "//div[@class=\"results\"]/div",
                    HT_insert: ["//div[@class=\"results\"]", 2], // 1 = beforebegin; 2 = beforeend
                    replaceE: "id(\"pagebar_container\")"
                }
            },
            haosou: {
                SiteTypeID: 3,
                MainType: ".res-list",
                Stype_Normal: "h3>a",
                FaviconType: "cite",
                FaviconAddTo: "h3",
                CounterType: ".results>div",
                BlockType: "h3 a",
                pager: {
                    nextLink: "//div[@id='page']//a[text()='下一页>'] | id('snext')",
                    pageElement: "//div[@id='container']/div",
                    HT_insert: ["//div[@id='container']", 2], // 1 = beforebegin; 2 = beforeend
                    replaceE: "id('page')"
                }
            },
            google: {
                SiteTypeID: 4,
                MainType: "#rso .g",
                FaviconType: ".iUh30",
                FaviconAddTo: "h3",
                CounterType: "#rso .g h3,._yE>div[class~=_kk] h3",
                BlockType: googleBlockType,
                pager: {
                    nextLink: "id('pnnext')|id('navbar navcnt nav')//td[span]/following-sibling::td[1]/a|id('nn')/parent::a",
                    pageElement: "id('rso')|id('center_col')/style[contains(.,'relative')][id('rso')]",
                    HT_insert: ["css;#res", 2], // 1 = beforebegin; 2 = beforeend
                    replaceE: '//div[@id="navcnt"] | //div[@id="rcnt"]//div[@role="navigation"]',
                }
            },
            bing: {
                SiteTypeID: 5,
                MainType: "#b_results>li",
                FaviconType: ".b_attribution>cite",
                FaviconAddTo: "h2",
                CounterType: "#b_results>li[class~=b_ans] h2,#b_results>li[class~=b_algo] h2",
                BlockType: "h2 a",
                pager: {
                    nextLink: "//a[contains(@class,\"sb_pagN\")]",
                    pageElement: "id(\"b_results\")/li[not(contains(@class,\"b_pag\") or contains(@class,\"b_ans b_top\"))]",
                    HT_insert: ["id(\"b_results\")/li[@class=\"b_pag\"]", 1], // 1 = beforebegin; 2 = beforeend
                    replaceE: "id(\"b_results\")//nav[@role=\"navigation\"]",
                }
            },
            duck: {
                SiteTypeID: 10,
                MainType: "#links_wrapper #links .nrn-react-div",
                FaviconType: ".nrn-react-div .result__url__domain",
                FaviconAddTo: "h2",
                CounterType: "#links_wrapper #links .nrn-react-div h2",
                BlockType: "h2 a",
                pager: {
                    nextLink: "//a[contains(@class,\"sb_pagN\")]",
                    pageElement: "id(\"b_results\")/li[not(contains(@class,\"b_pag\") or contains(@class,\"b_ans b_top\"))]",
                    HT_insert: ["id(\"b_results\")/li[@class=\"b_pag\"]", 1], // 1 = beforebegin; 2 = beforeend
                    replaceE: "id(\"b_results\")//nav[@role=\"navigation\"]",
                }
            },
            doge: {
                SiteTypeID: 11,
                MainType: "#links_wrapper #links .results_links_deep",
                FaviconType: ".results_links_deep .result__url__domain",
                FaviconAddTo: "h2",
                CounterType: "#links_wrapper #links .results_links_deep h2",
                BlockType: "h2 a",
                pager: {
                    nextLink: "//a[contains(@class,\"sb_pagN\")]",
                    pageElement: "id(\"b_results\")/li[not(contains(@class,\"b_pag\") or contains(@class,\"b_ans b_top\"))]",
                    HT_insert: ["id(\"b_results\")/li[@class=\"b_pag\"]", 1], // 1 = beforebegin; 2 = beforeend
                    replaceE: "id(\"b_results\")//nav[@role=\"navigation\"]",
                }
            },
            mBaidu: {
                SiteTypeID: 6,
                MainType: "#b_results>li",
                FaviconType: ".b_attribution>cite",
                FaviconAddTo: "h2",
                CounterType: "#b_results>li[class~=b_ans]>h2,#b_results>li[class~=b_algo]>h2,#b_results>li[class~=b_algo]>h2",
                BlockType: "h2 a",
            },
            zhihu: {
                SiteTypeID: 7,
            },
            baidu_xueshu: {
                SiteTypeID: 8,
                MainType: "#content_left .result",
                Stype_Normal: "h3.t>a, #results .c-container>.c-blocka",
                FaviconType: ".result-op, .c-showurl", // baidu 似乎要改版了?
                FaviconAddTo: "h3",
                CounterType: "#content_left>#double>div[srcid] *[class~=t],[class~=op_best_answer_question],#content_left>div[srcid] *[class~=t],[class~=op_best_answer_question]",
                BlockType: "h3 a",
            },
            other: {
                SiteTypeID: 9,
            }
        };
        // function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
        //
        // function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
        //
        // function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

        let SiteType = {
            BAIDU: DBSite.baidu.SiteTypeID,
            MBAIDU: DBSite.mBaidu.SiteTypeID,
            SOGOU: DBSite.sogou.SiteTypeID,
            SO: DBSite.haosou.SiteTypeID,
            GOOGLE: DBSite.google.SiteTypeID,
            BING: DBSite.bing.SiteTypeID,
            DUCK: DBSite.duck.SiteTypeID,
            DOGE: DBSite.doge.SiteTypeID,
            ZHIHU: DBSite.zhihu.SiteTypeID,
            BAIDU_XUESHU: DBSite.baidu_xueshu.SiteTypeID,
            OTHERS: 8
        };
        let otherData = {
            other: {
                curTab: 1, // 展示第二panel
                showBlockListArea: false, // blockList展示位textarea
                addBlockItem: "", // 用户手动输入的拦截规则
                curHosts: [], // 存放已经访问的hosts数据内容
                faviconListMap: {}, // favicon的遍历表 -> .AC-faviconTStyle
                isBlockChecking: false, // 当前Block功能是否还在执行中,避免多次执行,导致页面卡顿
            }
        }; // 到时候挂载到other上
        let AllData = {
            ACConfig: {},
            other: otherData.other,
            CONST: CONST,
            lan: {
                use: {},
                zh_cn: {
                    menu_text: "自定义",
                    curLang: "zh_cn",
                    fieldset_panel: {
                        panel_title: "设置 " + GM_info.script.version + (inExtMode ? 'Ext' : ''),
                        setting_panel: {
                            redirect_text: "主功能-处理重定向",
                            redirect_title: "重定向功能的开启与否",
                            useEn_text: "En-Language",
                            useEn_title: "Using English language to display",
                            ads_text: "附加1-去广告功能",
                            ads_title: "去除部分页面的广告信息,还你一个干净整洁的页面",
                            autopage_text: "自动翻页",
                            autopage_title: "自动翻页",
                            blockenable_text: "附加2-自主拦截域名",
                            blockenable_title: "点击页面block按钮添加你想要隐藏的地址,脚本将自动隐藏部分结果为小横幅,DIY按钮中点击表格内容可以取消隐藏",
                            blockDiyBtn_text: "DIY",
                            blockDiyBtn_title: "自定义BLOCK",
                            blockAutoRemove_text: "隐藏结果",
                            blockAutoRemove_title: "自动隐藏已经屏蔽的域名",
                            blockBtnShow_text: "隐藏'block'按钮",
                            blockBtnShow_title: "隐藏掉block按钮的显示",

                            userStyle_text: "附加3-自定义样式",
                            userStyle_baidu_lable: "展开百度设置>>",
                            userStyle_baidu_origin: "百度-原始模式",
                            userStyle_baidu_huyan: "百度-护眼模式",
                            userStyle_baidu_baiduLite: "百度Lite样式",
                            userStyle_baidu_1line: "单列",
                            userStyle_baidu_1line_enter: "单列居中",
                            userStyle_baidu_2line: "双列",
                            userStyle_baidu_3line: "三列",
                            userStyle_baidu_4line: "四列",

                            userStyle_google_lable: "展开谷歌设置>>",
                            userStyle_google_origin: "谷歌-原始模式",
                            userStyle_google_huyan: "谷歌-护眼模式",
                            userStyle_google_googleLite: "谷歌-伪装百度",
                            userStyle_google_1line: "单列",
                            userStyle_google_1line_enter: "单列居中",
                            userStyle_google_2line: "双列",
                            userStyle_google_3line: "三列",
                            userStyle_google_4line: "四列",

                            userStyle_bing_lable: "展开必应设置>>",
                            userStyle_bing_origin: "必应-原始模式",
                            userStyle_bing_huyan: "必应-护眼模式",
                            userStyle_bing_1line: "单列",
                            userStyle_bing_1line_enter: "单列居中",
                            userStyle_bing_2line: "双列",
                            userStyle_bing_3line: "三列",
                            userStyle_bing_4line: "四列",

                            userStyle_sogou_lable: "展开搜狗设置>>",
                            userStyle_sogou_origin: "搜狗-原始模式",
                            userStyle_sogou_huyan: "搜狗-护眼模式",
                            userStyle_sogou_1line: "单列",
                            userStyle_sogou_1line_enter: "单列居中",
                            userStyle_sogou_2line: "双列",
                            userStyle_sogou_3line: "三列",
                            userStyle_sogou_4line: "四列",

                            userStyle_duck_lable: "展开鸭鸭搜设置>>",
                            userStyle_duck_origin: "鸭鸭-原始模式",
                            userStyle_duck_huyan: "鸭鸭-护眼模式",
                            userStyle_duck_normal: "鸭鸭-常见配置",
                            userStyle_duck_1line: "单列",
                            userStyle_duck_1line_enter: "单列居中",
                            userStyle_duck_2line: "双列",
                            userStyle_duck_3line: "三列",
                            userStyle_duck_4line: "四列",

                            userStyle_doge_lable: "展开多吉设置>>",
                            userStyle_doge_origin: "多吉-原始模式",
                            userStyle_doge_huyan: "多吉-护眼模式",
                            userStyle_doge_normal: "多吉-常见配置",
                            userStyle_doge_1line: "单列",
                            userStyle_doge_1line_enter: "单列居中",
                            userStyle_doge_2line: "双列",
                            userStyle_doge_3line: "三列",
                            userStyle_doge_4line: "四列",

                            backgroundImage_text: "背景图:",
                            backgroundImage_text_hint: "图片需要允许跨域,建议使用图床",
                            backgroundImageAutoFit_text: "自动优化",
                            backgroundImageAutoFit_text_hint: "有背景图时,自动优化页面效果",

                            huyanMode_text: "附加4-护眼颜色配置-自定义3中需对应开启",
                            huyanMode_title: "!需要在自定义样式中启用护眼模式",
                            huyanColor_text: "默认护眼颜色:",
                            huyanColor_title: "自定义的护眼颜色:",
                            huyanColorMore_text: "更多颜色选择",

                            favicon_text: "附加5-Favicon功能",
                            favicon_title: "AC-添加Favicon",
                            favicon_defaultIcon_text: "Favicon默认图标:",

                            searchOrigin_text: "附加6-移除百度搜索预测(文字自动搜索)",
                            searchOrigin_title: "AC-移除搜索预测",

                            showRight_text: "附加7-显示右侧栏",
                            showCounter_text: "附加8-编号功能",
                            hintShowCounter_text: "可能会导致图片加载异常",
                            showALine_text: "附加9-文字下划线",
                            showUserStyle_text: "附加10-自定义样式 支持Less.js",

                            contactMe_text: "Dfer.Site",
                            contactMe_url: "http://www.dfer.site",

                            setting_panel_second: {
                                backBtn_text: "<-返回",
                                blockLabel_text: " 拦截列表  想要生效的话需要手动保存",
                                blockEditBtn_text: "编辑列表",
                                blockEditBtnEnd_text: "结束编辑",
                                addBlockLabel_text: "全匹配拦截:",
                                addBtnLabel_text: "添加",
                            },
                            cancelBtn_text: "取消",
                            okBtn_text: "保存",
                            resetBtn_text: "重置",
                        }
                    }
                },
                en: {
                    menu_text: "CUSTOM",
                    curLang: "en",
                    fieldset_panel: {
                        panel_title: "AC Redirect Settings " + GM_info.script.version + (inExtMode ? 'Ext' :
                            ''),
                        setting_panel: {
                            redirect_text: "Main-Deal Redirect",
                            redirect_title: "Turn on or off redirect",
                            useEn_text: "En-Language",
                            useEn_title: "使用英文显示页面",
                            ads_text: "Add1-Remove Ads",
                            ads_title: "Remove the ads on the page, and return you a clean page",
                            autopage_text: "Auto Pager",
                            autopage_title: "Auto Pager",
                            blockenable_text: "Add2-Block host",
                            blockenable_title: "Click the Block button to add the address which you want to hide. The script will hide it with small banner automatically. DIY button for editting the hiding list",
                            blockDiyBtn_text: "DIY",
                            blockDiyBtn_title: "Edit BLOCK",
                            blockAutoRemove_text: "Auto remove",
                            blockAutoRemove_title: "remove the block results automatically",
                            blockBtnShow_text: "Hide 'Block' button",
                            blockBtnShow_title: "Hide 'Block' button",

                            userStyle_text: "Add3-CustomStyle",
                            userStyle_baidu_lable: "Expand Baidu Settings>>",
                            userStyle_baidu_origin: "Baidu-Origin",
                            userStyle_baidu_huyan: "Baidu-EyeSave",
                            userStyle_baidu_baiduLite: "BaiduLiteStyle",
                            userStyle_baidu_1line: "SingleRow",
                            userStyle_baidu_1line_enter: "SingleCenter",
                            userStyle_baidu_2line: "Two",
                            userStyle_baidu_3line: "Three",
                            userStyle_baidu_4line: "Four",

                            userStyle_google_lable: "Expand Google Settings>>",
                            userStyle_google_origin: "Google-Origin",
                            userStyle_google_huyan: "Google-EyeSave",
                            userStyle_google_googleLite: "Fake Baidu",
                            userStyle_google_1line: "SingleRow",
                            userStyle_google_1line_enter: "SingleCenter",
                            userStyle_google_2line: "Two",
                            userStyle_google_3line: "Three",
                            userStyle_google_4line: "Four",

                            userStyle_bing_lable: "Expand Bing Settings>>",
                            userStyle_bing_origin: "Bing-Origin",
                            userStyle_bing_huyan: "Bing-EyeSave",
                            userStyle_bing_1line: "SingleRow",
                            userStyle_bing_1line_enter: "SingleCenter",
                            userStyle_bing_2line: "Two",
                            userStyle_bing_3line: "Three",
                            userStyle_bing_4line: "Four",

                            userStyle_sogou_lable: "Expand SoGou Settings>>",
                            userStyle_sogou_origin: "SoGou-Origin",
                            userStyle_sogou_huyan: "SoGou-EyeSave",
                            userStyle_sogou_1line: "SingleRow",
                            userStyle_sogou_1line_enter: "SingleCenter",
                            userStyle_sogou_2line: "Two",
                            userStyle_sogou_3line: "Three",
                            userStyle_sogou_4line: "Four",

                            userStyle_duck_lable: "Expand DuckDuckGo Settings>>",
                            userStyle_duck_origin: "DuckDuck-Origin",
                            userStyle_duck_huyan: "DuckDuck-EyeSave",
                            userStyle_duck_normal: "DuckDuck-Normal",
                            userStyle_duck_1line: "SingleRow",
                            userStyle_duck_1line_enter: "SingleCenter",
                            userStyle_duck_2line: "Two",
                            userStyle_duck_3line: "Three",
                            userStyle_duck_4line: "Four",

                            userStyle_doge_lable: "Expand DogeDoge Settings>>",
                            userStyle_doge_origin: "DogeDoge-Origin",
                            userStyle_doge_huyan: "DogeDoge-EyeSave",
                            userStyle_doge_normal: "DogeDoge-Normal",
                            userStyle_doge_1line: "SingleRow",
                            userStyle_doge_1line_enter: "SingleCenter",
                            userStyle_doge_2line: "Two",
                            userStyle_doge_3line: "Three",
                            userStyle_doge_4line: "Four",

                            backgroundImage_text: "background Image:",
                            backgroundImage_text_hint: "only CORS Image is allowed",
                            backgroundImageAutoFit_text: "Auto Fit:",
                            backgroundImageAutoFit_text_hint: "page auto fit when Bg is not null",

                            huyanMode_text: "Add4-EyeSave Color Setting-Need opened in Add3",
                            huyanMode_title: "!Open EyeSave Mode in CustomStyle is Must",
                            huyanColor_text: "Default EyeSave Color:",
                            huyanColor_title: "The color of EyeSave:",
                            huyanColorMore_text: "More Color",

                            favicon_text: "Add5-Favicon.Func",
                            favicon_title: "AC-AddFavicon",
                            favicon_defaultIcon_text: "FaviconFailedImg::",

                            searchOrigin_text: "AC-Remove Baidu AutoPredict in text search",
                            searchOrigin_title: "Add6-Remove Baidu AutoPredict in text search",

                            showRight_text: "Add7-Right Side Column",
                            showCounter_text: "Add8-NumFunc",
                            hintShowCounter_text: "May Cause image load problem",
                            showALine_text: "Add9-TextUnderLine",
                            showUserStyle_text: "Add10-Your own Style support Less.js",

                            contactMe_text: "For contact the writter, suggests, ask for help then click me",
                            contactMe_url: "https://github.com/langren1353/GM_script/",

                            setting_panel_second: {
                                backBtn_text: "<-Back",
                                blockLabel_text: "&nbsp;Block List&nbsp;&nbsp;Click Save Button if you want wo save the list",
                                blockEditBtn_text: "Edit List",
                                blockEditBtnEnd_text: "End Edit",
                                addBlockLabel_text: "Add Block item:",
                                addBtnLabel_text: "Add",
                            },
                            cancelBtn_text: "Cancel",
                            okBtn_text: "Save",
                            resetBtn_text: "Reset",
                        }
                    }
                }
            }
        };
        let vueVM = null;
        /**初始化所有的设置**/
        Promise.all([GM.getValue("Config")]).then(function(data) {
            let res = data[0]
            if (res && (res !== 'undefined' && res !== 'null')) {
                try {
                    ACConfig = JSON.parse(res);
                } catch (e) {
                    ACConfig = res;
                }
            } else {
                ACConfig = DefaultConfig;
            }
            const localData = localStorage.ACConfig; // 小心隐私模式
            if (localData && localData.length > 10) { // 避免重置为 '{}' 导致的误判
                try {
                    ACConfig = JSON.parse(localData);
                } catch (e) {}
            }
            for (var key in DefaultConfig) {
                if (typeof(ACConfig[key]) === "undefined") {
                    ACConfig[key] = DefaultConfig[key];
                }
            }
            if (ACConfig.isUserStyleEnable === false && (new Date().getTime() - ACConfig.lastSaveTime >
                    2592000000)) { // 大约30天时间
                // 如果用户取消了设置,并且长时间(30天)没有进行过处理,那么直接将数据置空 -> 用于刷新数据
                console.log("ac-baidu css reset for time");
                ACConfig.lastSaveTime = new Date().getTime();
                ACConfig.UserStyleText = DefaultConfig.UserStyleText;
                ACSetValue("Config", JSON.stringify(this.ACConfig))
            }
            AllData.ACConfig = ACConfig;
            DBConfig = JSON.parse(JSON.stringify(ACConfig)); // 暂时作为一个原始保存
            AllData.lan.use = ACConfig.isEnLang ? AllData.lan.en : AllData.lan.zh_cn;
            // 初始化完成之后才能调用正常函数
            callback();
        }).catch(function(except) {
            console.log(except);
        });

        function Reg_Get(HTML, reg) {
            let RegE = new RegExp(reg);
            try {
                return RegE.exec(HTML)[1];
            } catch (e) {
                return "";
            }
        }

        function ACSetValue(key, value) {
            GM_setValue(key, value);
            if (key === 'Config') {
                if (value) localStorage.ACConfig = value;
            }
        }

        function getElementByXpath(e, t, r) {
            r = r || document, t = t || r;
            try {
                return r.evaluate(e, t, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
            } catch (t) {
                return void console.error("无效的xpath");
            }
        }

        function getAllElementsByXpath(xpath, contextNode) {
            var doc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;
            contextNode = contextNode || doc;
            var result = [];

            try {
                var query = doc.evaluate(xpath, contextNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

                for (var i = 0; i < query.snapshotLength; i++) {
                    var node = query.snapshotItem(i); //if node is an element node

                    if (node.nodeType === 1) result.push(node);
                }
            } catch (err) {
                throw new Error(`Invalid xpath: ${xpath}`);
            } //@ts-ignore
            return result;
        }

        /**
         * Select multiple elements by css selector
         * @param {string} css css of dom
         * @param {ParentNode} contextNode dom contextNode
         * @returns {HTMLElement[]} an array of Nodes
         */

        function getAllElementsByCSS(css) {
            var contextNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
            return [].slice.call(contextNode.querySelectorAll(css));
        }

        /**
         * Get all elements matching the selector
         * @param {ISelectorFunction} selector css selector or xpath selector
         * @param {Element|Document|DocumentFragment} contextNode contextNode specifies the context node for the query (see the XPath specification). It's common to pass document as the context node.
         * @param {Document} doc the document to select from
         * @param {Window} win window of the browser
         * @param {string} _cplink current page link
         * @returns {HTMLElement[]} an array of nodes
         */

        function getAllElements(selector) {
            var contextNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
            var doc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;
            var win = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : window;

            var _cplink = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;

            if (!selector) return []; //@ts-ignore

            contextNode = contextNode || doc;

            if (typeof selector === 'string') {
                if (selector.search(/^css;/i) === 0) {
                    return getAllElementsByCSS(selector.slice(4), contextNode);
                } else {
                    return getAllElementsByXpath(selector, contextNode, doc);
                }
            } else {
                var query = selector(doc, win, _cplink);

                if (!Array.isArray(query)) {
                    throw new Error('Wrong type is returned by getAllElements');
                } else {
                    return query;
                }
            }
        }

        const throttle = (callback, wait = 100) => {
            let it = 0
            let preT = 0
            return function(...args) {
                const nowT = +new Date()
                if (nowT - preT > wait) {
                    preT = nowT
                    clearTimeout(it)

                    it = setTimeout(() => {
                        callback.apply(this, args)
                        clearTimeout(it)
                    }, wait)
                }
            }
        }

        function callback() {
            if (ACConfig.oldVersion === GM_info.script.version) {
                CONST.hasNewFuncNeedDisplay = false;
            } else {
                CONST.hasNewFuncNeedDisplay = needDisplayNewFun;
            }

            ! function() {
                /**
                 * 进行不重复插入,插入后执行回调函数
                 * @param data 待插入数据
                 * @param callback 回调函数
                 */
                function acpush(data, callback) {
                    // 如果是垃圾数据,那么可以丢弃的
                    if (!data) return;
                    // 如果数据中有回车,那数据也是无效的正文而已
                    if (data.replace(/({|}|,|\+|:|。|\n)/) !== data) return;
                    if (this.findIndex(m => m === data) < 0) {
                        this.push(data);
                        callback && callback(this);
                    }
                }

                function acremove(data, callback) {
                    let delId = this.findIndex(m => m === data);
                    if (delId >= 0) {
                        this.splice(delId, 1);
                        callback && callback(this);
                    } // 删除delId的数据,删除一个
                }
                // 避免污染全局原型链
                Object.defineProperty(ACConfig.UserBlockList, 'acpush', {
                    value: acpush
                })
                Object.defineProperty(ACConfig.UserBlockList, 'acremove', {
                    value: acremove
                })
                Object.defineProperty(otherData.other.curHosts, 'acpush', {
                    value: acpush
                })
                Object.defineProperty(otherData.other.curHosts, 'acremove', {
                    value: acremove
                })
            }();

            !async function() {
                if (typeof GM_getResourceText === 'undefined') {
                    GM.getResourceText = GM_getResourceText = async function(aResourceName) {
                        let res = await (await fetch(await GM.getResourceUrl(aResourceName))).text();
                        let saveRes = await GM.getValue(aResourceName);
                        if (typeof(saveRes) === 'undefined') {
                            GM.setValue(aResourceName, res);
                        } else {
                            return saveRes;
                        }
                        return res;
                    }
                }
                if (location.host.includes("xueshu.baidu.com")) {
                    curSite = DBSite.baidu_xueshu;
                } else if (location.host.includes(".baidu.com")) {
                    if (navigator.userAgent.replace(/(android|mobile|iphone)/igm, "") !== navigator.userAgent) {
                        curSite = DBSite.mBaidu;
                    } else {
                        curSite = DBSite.baidu;
                    }
                    CONST.useItem = ACConfig.baidu;
                } else if (location.host.includes("zhihu.com")) {
                    curSite = DBSite.zhihu;
                    CONST.useItem = ACConfig.zhihu;
                } else if (location.host.includes("sogou")) {
                    curSite = DBSite.sogou;
                    CONST.useItem = ACConfig.sogou;
                } else if (location.host.includes("so.com")) {
                    curSite = DBSite.haosou;
                    CONST.useItem = ACConfig.other;
                } else if (location.host.includes("google")) {
                    curSite = DBSite.google;
                    CONST.useItem = ACConfig.google;
                } else if (location.host.includes("bing")) {
                    curSite = DBSite.bing;
                    CONST.useItem = ACConfig.bing;
                } else if (location.host.includes("duckduckgo")) {
                    curSite = DBSite.duck;
                    CONST.useItem = ACConfig.duck;
                } else if (location.host.includes("dogedoge")) {
                    curSite = DBSite.doge;
                    CONST.useItem = ACConfig.doge;
                } else {
                    curSite = DBSite.other;
                    CONST.useItem = ACConfig.other;
                }
                curSite.pageNum = 1; // 当前页数
                curSite.pageLoading = false;
                curSite.pageUrl = "";
                curSite.GMStyleList = {}
                if (
                    (curSite.SiteTypeID === SiteType.GOOGLE && location.href.replace(/tbm=(isch|lcl|shop|flm)/,
                        "") !== location.href) ||
                    (curSite.SiteTypeID === SiteType.BING && location.href.replace(/images\/search/, "") !==
                        location.href)
                ) {
                    // 图片站 、地图站、购物站
                    console.log("特殊站,不加载样式,不添加menu");
                    CONST.isGoogleImageUrl = true;
                }

                if (curSite.SiteTypeID === SiteType.BAIDU_XUESHU) {
                    CONST.useItem.AdsStyleMode = 2; // 单列居中即可
                }

                // 预加载GMResource的CSS等
                preLoadGMStyle()

                CONST.fsBaidu = FSBaidu();

                if (ACConfig.AdsStyleEnable) {
                    CONST.fsBaidu.init() // 添加设置项-单双列显示
                }

                if (+CONST.useItem.AdsStyleMode > 0) { // 非原始模式,那么可以加载图片
                    if (CONST.useItem.defaultBgUrl && CONST.useItem.defaultBgUrl.trim()) {
                        changeSiteBackground(CONST.useItem.defaultBgUrl)
                    }
                }

                console.log(
                    "%c[AC-Redirect] %c让我向您介绍一个非常好的搜索引擎:%c %s %cSearch Engine.",
                    "font-weight:bold;color:cornflowerblue", "color:0", "font-weight:bold;color:darkorange",
                    CONST.useItem.name.replace(CONST.useItem.name[0], CONST.useItem.name[0].toUpperCase()),
                    "font-weight:normal;color:0");

                let SiteBlock = {
                    /**
                     * 初始化Block样式
                     */
                    initStyle: async function() {
                        CONST.flushNode.insert(await create_CSS_Node(
                            "button.ghhider.ghhb[ac-user-alter='1']::before{content:'取消 - ';}#sp-ac-container .ac-block-item{color:#AAA;margin-left:48px;}#sp-ac-container .ac-block-itemdel{float:right;margin-left:0;padding:0 20px;cursor:pointer;}#sp-ac-container .ac-block-itemdel:hover{color:red;}#sp-ac-container .ac-block-high{color:#000;}.ac-blockList li:hover{background-color:#a3caff;color:white !important;cursor:pointer;} *[ac-needhide] *{display:none} *[ac-needhide] .blockShow{display:unset;cursor:pointer;} *[ac-needhide] .blockShow:hover{border:1px solid #DDD}button.ghhider{color:#555;background-color:#fcfcfc;font-family:sans-serif;margin:auto 2px;border:1px solid #ccc;border-radius:4px;padding:2px 3px}button.ghhider{font-size:12px}button.ghhider:hover{color:#006aff;background:#fff}",
                            "AC-BlockStyle"))
                    },
                    /**
                     * 初始化屏蔽按钮加载
                     */
                    init: function() {
                        let checkNodes = document.querySelectorAll(curSite.MainType +
                            ":not([bhandle])");
                        for (let i = 0; i < checkNodes.length; i++) {
                            let curNode = checkNodes[i];
                            try {
                                let faviconNode = curNode.querySelector(curSite.FaviconType);
                                let host = getNodeHost(faviconNode).curHost;
                                let faNode = curNode.querySelector(curSite.BlockType);
                                let nodeStyle = "display:unset;";
                                if (ACConfig.isBlockBtnNotDisplay) {
                                    nodeStyle = "display:none;";
                                }
                                // 避免父节点出现两个block按钮
                                if (!faNode.hasAttribute('hasInsert')) {
                                    faNode.insertAdjacentHTML("afterend",
                                        `<button style='${ nodeStyle }' class='ghhider ghhb' href="${ faviconNode.href || faviconNode.innerText }" meta="${ host }" data-host="${ host }" title='${ this.getBlockBtnTitle(host) }'>block</button>`
                                    );
                                }
                                faNode.setAttribute("hasInsert", "1");
                                curNode.setAttribute("bhandle", "1");
                            } catch (e) {
                                const failed_count = +(curNode.getAttribute('failed_count') || 1)
                                curNode.setAttribute('failed_count', failed_count + 1)
                                if (failed_count > 3) {
                                    curNode.setAttribute("bhandle", "1");
                                }
                            }
                        }
                        this.initListener();
                        this.renderDisplay();
                    },
                    getBlockBtnTitle(host) {
                        return `点击即可屏蔽 ${ host } 放开,需要在自定义中手动配置放开`;
                    },
                    initListener: function() {
                        let checkNodes = document.querySelectorAll("button.ghhider:not([acEnv])");
                        for (let i = 0; i < checkNodes.length; i++) {
                            checkNodes[i].addEventListener("click", this.doHideEnv);
                            checkNodes[i].setAttribute("acEnv", "0");
                        }
                    },
                    doHideEnv: function(env) {
                        // 先插入数据---记得还要写入存储
                        let node = env.sourceTarget || env.target;
                        let host = node.dataset.host;
                        if (+node.getAttribute("ac-user-alter") === 1) {
                            // 已经屏蔽之后,再次点击block应该是取消状态
                            node.removeAttribute("ac-user-alter");
                            ACConfig.UserBlockList.acremove(host);
                        } else {
                            // 正常屏蔽操作
                            node.removeAttribute("ac-user-alter");
                            ACConfig.UserBlockList.acpush(host);
                        }
                        DBConfig.UserBlockList = ACConfig.UserBlockList;
                        ACSetValue("Config", JSON.stringify(DBConfig)); // 点击一次,保存一次
                        env.stopPropagation();
                    },
                    // 刷新显示效果--耗时操作
                    renderDisplay: throttle(function() {
                        // 增加checking中的检查,避免多次重复调用,减少cpu消耗
                        if (otherData.other.isBlockChecking) return
                        otherData.other.isBlockChecking = true

                        let checkNodes = document.querySelectorAll(curSite.MainType);
                        let {
                            md5: md5_tag = '',
                            list: regList = []
                        } = (vueVM && vueVM.calc_block_data) ||
                        {}; // 使用Vue的computed属性计算的数据值,一般根本不更新
                        let flag = "ac-needhide";
                        for (let i = 0; i < checkNodes.length; i++) {
                            try {
                                let curNode = checkNodes[i];
                                let {
                                    curHost,
                                    curUrl
                                } = getNodeHost(curNode.querySelector(curSite.FaviconType));
                                curUrl = curUrl || "";
                                if (curHost === null) continue;
                                let BlockBtn = curNode.querySelector(".ghhider.ghhb");
                                BlockBtn.dataset.host = BlockBtn.dataset.meta = curHost;
                                BlockBtn.title = this.getBlockBtnTitle(curHost);
                                if (curNode.querySelector("button[ac-user-alter]") != null)
                                    continue; // 用户手动点过显示的,那么跳过check

                                // 减少数据计算
                                if (curNode.dataset.md5 && curNode.dataset.md5 === md5_tag) continue
                                if (curUrl && regList.findIndex(one => {
                                        try {
                                            return one.test(curHost) || one.test(
                                                curUrl); // 耗时操作
                                        } catch (e) {
                                            return one === curHost;
                                        }
                                    }) >= 0) {
                                    // 只检查在屏蔽表中的数据
                                    if (!curNode.hasAttribute(flag)) {
                                        if (ACConfig.isBlockDisplay) { // 对于不显示的数据可以进行移除操作
                                            curNode.remove();
                                            continue;
                                        }
                                        let curTitle = curNode.querySelector(curSite.BlockType);
                                        curTitle = curTitle.innerText || curTitle.textContent;

                                        if (curNode.hasAttribute(flag)) {
                                            console.log("冲突了!!!");
                                            continue;
                                        }

                                        curNode.setAttribute(flag, "1");
                                        curNode.insertAdjacentHTML("afterBegin",
                                            `<span class="blockShow" title="如果需要一直显示,请在自定义中DIY目录移除本地址">${ curTitle }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -block by ${ curHost }</span>`
                                        );

                                        (function(xcur) {
                                            // 已经屏蔽之后的内容,点击一下显示原始内容
                                            xcur.querySelector(".blockShow").addEventListener(
                                                "click",
                                                function(env) {
                                                    this.parentNode.querySelector(
                                                        "button.ghhider").setAttribute(
                                                        "ac-user-alter", "1"
                                                    ); // 这个属性用于保持在DOM更新时,按钮不变
                                                    xcur.removeAttribute(flag);
                                                    safeFunction(function() {
                                                        xcur.querySelector(
                                                                ".blockShow")
                                                            .remove();
                                                    });
                                                    env.stopPropagation();
                                                });
                                        })(curNode);
                                    }
                                } else {
                                    curNode.removeAttribute(flag);
                                    safeFunction(function() {
                                        curNode.querySelector(".blockShow").remove();
                                    });
                                }
                                curNode.dataset.md5 = md5_tag
                            } catch (e) {}
                        }

                        otherData.other.isBlockChecking = false
                    }, 50)
                };

                function preLoadGMStyle() {
                    function loadResource(resourceName) {
                        const data = GM_getResourceText(resourceName)
                        curSite.GMStyleList[resourceName] = data
                    }
                    loadResource(CONST.useItem.name + "CommonStyle")
                    loadResource(CONST.useItem.name + "OnePageStyle")
                    loadResource(CONST.useItem.name + "TwoPageStyle")
                }

                function addStyle(css) { //添加CSS的代码--copy的
                    let pi = document.createProcessingInstruction(
                        'xml-stylesheet',
                        'type="text/css" must="false" href="data:text/css;utf-8,' + encodeURIComponent(
                            css) + '"'
                    );
                    return document.insertBefore(pi, document.documentElement);
                }

                if (ACConfig.isAdsEnable) {
                    // display已经无法隐藏他们了,需要用绝对的隐藏
                    CONST.flushNode.insert(await create_CSS_Node(
                        "#bottomads{display:none;} #content_left>div:not([id])>div[cmatchid], #content_left>div[id*='300']:not([class*='result']),#content_right td>div:not([id]),#content_right>br{position:absolute;top:-6666px;}",
                        'AC-AdsStyle'))
                }
                if (ACConfig.isFaviconEnable) {
                    CONST.flushNode.insert(await create_CSS_Node(
                        "h3::before, h2::before {content: ' ';display:inline-block}", "AC-Style-Favicon"
                    ))
                }
                if (ACConfig.isBlockEnable) {
                    SiteBlock.initStyle() // 初始化拦截样式
                }
                if (curSite.SiteTypeID === SiteType.GOOGLE && ACConfig.isGooleInBaiduModeEnable) {
                    safeWaitFunc("#logo img, #logocont img", function(node) {
                        let faNode = node.parentNode.parentNode;
                        faNode.classList.add("baidu");
                        node.removeAttribute("src");
                        node.src = "https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png";
                        node.width = "125";
                        node.removeAttribute("height");
                    });
                    safeWaitFunc("#main .logo img[alt='Google']", function(node) {
                        node.removeAttribute("srcset");
                        node.src = "https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png";
                        node.setAttribute("height", "40");
                    }, 300);
                    safeWaitFunc("form[role='search'] .logo img", function(node) {
                        node.removeAttribute("srcset");
                        node.src = "https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png";
                        node.setAttribute("height", "40");
                    }, 300);
                    document.title = document.title.replace(/^Google/, "百度一下,你就知道")
                        .replace(/ - Google 搜索/, "_百度搜索")
                        .replace(/ - Google Search/, "_百度搜索");
                    safeWaitFunc("head", function() {
                        let linkTarget = document.querySelector("link[type='image/x-icon']") || document
                            .createElement('link');
                        linkTarget.type = 'image/x-icon';
                        linkTarget.rel = 'shortcut icon';
                        linkTarget.href = 'https://www.baidu.com/favicon.ico';
                        document.head.appendChild(linkTarget);
                    })
                }
                if (curSite.SiteTypeID === SiteType.DUCK) {
                    addStyle = AC_addStyle // 兼容Duck的CSP同源规则
                    if (ACConfig.normalizeDuck) {
                        setTimeout(function() {
                            try {
                                DDG.settings.set("kn", 1, { // 新窗口打开页面
                                    saveToCloud: true,
                                    forceTheme: true
                                });
                                DDG.settings.set("kav", 1, { // 连续显示搜索结果
                                    saveToCloud: true,
                                    forceTheme: true
                                });
                            } catch (e) {}
                        }, 5000);
                    }
                }
                try {
                    if (curSite.SiteTypeID !== SiteType.OTHERS) {
                        document.addEventListener('DOMNodeInserted', MainCallback, false);
                        document.addEventListener('keyup', MainCallback, false);
                        safeWaitFunc("body", () => {
                            !document.body.hasAttribute(CONST.useItem.name) && document.body
                                .setAttribute(CONST.useItem.name, "1");
                            !document.body.classList.contains(CONST.useItem.name) && document.body
                                .classList.add(CONST.useItem.name);
                            if (ACConfig.AdsStyleEnable) { // 单独不需要定时器-頻繁触发-载入css
                                CONST.fsBaidu.init();
                                AddCustomStyle();
                            }
                            InsertSettingMenuCSS()
                            rapidDeal() // 预先执行一次,保证该函数不延迟,避免样式插入有延迟
                        })
                        if (ACConfig.isAdsEnable) { // 先来移除多余的广告内容
                            removeAD_baidu_sogou();
                        }
                        CONST.flushNode.flush()
                        setInterval(() => {
                            CONST.flushNode.flush()
                        }, 200)
                        setInterval(function() {
                            if (document.body) {
                                rapidDeal(); // 定期调用,避免有时候DOM插入没有执行导致的问题
                            }
                        }, 800);
                        setTimeout(() => {
                            InsertSettingMenu(); // 等待menu样式加载,延迟插入menu
                            ShowSetting();
                        }, 200)
                    }
                } catch (e) {
                    console.log(e);
                }
                safeWaitFunc("#sp-ac-content", function(checkNode) {
                    var options = {
                        el: checkNode,
                        data: function() {
                            return {
                                ...AllData,
                                LiveConfig: {
                                    css_has_error: false
                                },
                                resetCSS_text: '重置CSS',
                                calc_block_data: {}
                            }
                        },
                        methods: {
                            async labelShowHideEnv(e) {
                                let cur = e.srcElement || e.target;
                                let className = cur.parentNode.className.replace(
                                    "container-label ", "");
                                CONST.flushNode.insert(await create_CSS_Node(
                                    ".XX>label,.XX>br{display:unset !important;}.XX>.label_hide{display:none !important;}"
                                    .replace(/XX/gm, className),
                                    "AC-ShowHideItem-" + className), 'body')
                                e.stopPropagation();
                            },
                            syncToBlockList(env) {
                                this.ACConfig.UserBlockList = env.target.value.split("\n").filter(
                                    item => item !== '');
                            },
                            removeABlockListItem(e) {
                                // 点击移除某个host数据时
                                let target = e.srcElement || e.target;
                                if (target.tagName.toLowerCase() === "label") {
                                    let host = target.dataset.host;
                                    ACConfig.UserBlockList.acremove(host);
                                }
                            },
                            ckAddRule() {
                                // 手动增加移除规则
                                ACConfig.UserBlockList.acpush(this.other.addBlockItem);
                                this.other.addBlockItem = "";
                            },
                            loadCustomStyle() {
                                less.render(ACConfig.UserStyleText, async (e, css) => {
                                    if (e) {
                                        this.LiveConfig.css_has_error = true
                                    } else {
                                        this.LiveConfig.css_has_error = false
                                        css = css.css || ''
                                        CONST.flushNode.insert(await create_CSS_Node(
                                            css, "AC-userStyle"), 'head', {
                                            isReload: true
                                        })
                                    }
                                });
                            },
                            saveConfig() {
                                if (this.other.curTab === 1 && !this.ACConfig.acceptLicense) {
                                    this.other.curTab = 3
                                    return
                                }
                                this.ACConfig.acceptLicense = true

                                this.ACConfig.lastSaveTime = new Date().getTime();
                                ACSetValue("Config", JSON.stringify(this.ACConfig));
                                if (!this.ACConfig.doDisableSug) {
                                    acSetCookie("ORIGIN", 1, "www.baidu.com", new Date().getTime() -
                                        86400000);
                                    acSetCookie("ISSW", 1, null, new Date().getTime() - 86400000);
                                    acSetCookie("ISSW", 1, "www.baidu.com", new Date().getTime() -
                                        86400000);
                                }
                                setTimeout(function() {
                                    window.location.reload();
                                }, 200);
                            },
                            changeResetText() {
                                this.lan.zh_cn.fieldset_panel.setting_panel.resetBtn_text = '双击重置'
                                this.lan.en.fieldset_panel.setting_panel.resetBtn_text =
                                    'DBl click to Reset'
                            },
                            resetConfig() {
                                // 显示为双击重置
                                ACSetValue("Config", '{}');
                                setTimeout(function() {
                                    window.location.reload();
                                }, 200);
                            },
                            closePanel() {
                                document.querySelector("#sp-ac-content").style.display = 'none';
                            },
                            resetCSS() {
                                if (this.resetCSS_text.includes('重置CSS')) {
                                    this.resetCSS_text = '确认重置'
                                    return
                                }
                                if (this.resetCSS_text.includes('确认重置')) {
                                    this.ACConfig.UserStyleText = DefaultConfig.UserStyleText
                                    this.resetCSS_text = '重置CSS'
                                    this.loadCustomStyle()
                                }
                            },
                            useThisHuyanColor(env) {
                                this.ACConfig.defaultHuYanColor = env.target.value || env.target
                                    .dataset.value;
                                console.log(this.ACConfig.defaultHuYanColor);
                                CONST.fsBaidu.loadHuYanStyle(this.ACConfig.defaultHuYanColor);
                            }
                        },
                        computed: {
                            getBlockList() { // 会自动的render到html上去,不用手动去渲染一遍
                                let insHTML = "";
                                let {
                                    list: UserBlockRegList
                                } = this.cal_UserBlockListRegex;
                                for (let i = 0; i < this.ACConfig.UserBlockList.length; i++) {
                                    let insClass = this.other.curHosts.findIndex(m => {
                                        try {
                                            let [curHost, curUrl] = m.split("###");
                                            return UserBlockRegList[i].test(curHost) ||
                                                UserBlockRegList[i].test(curUrl);
                                        } catch (e) {
                                            return (m || '').includes(this.ACConfig
                                                .UserBlockList[i])
                                        }
                                    }) >= 0 ? " ac-block-high" : ""; // 如果当前页面存在,则高亮
                                    insHTML +=
                                        `<li><label class="ac-block-item${ insClass }" data-host="${ this.ACConfig.UserBlockList[i] }">${ this.ACConfig.UserBlockList[i] }</label><label class="ac-block-item ac-block-itemdel" data-host="${ this.ACConfig.UserBlockList[i] }">x</label></li>\n`;
                                }
                                return insHTML;
                            },
                            cal_diyBlockListBtn() {
                                if (this.other.showBlockListArea) {
                                    return this.lan.use.fieldset_panel.setting_panel
                                        .setting_panel_second.blockEditBtnEnd_text;
                                } else {
                                    return this.lan.use.fieldset_panel.setting_panel
                                        .setting_panel_second.blockEditBtn_text;
                                }
                            },
                            async cal_UserBlockListRegex() {
                                var list = [];
                                this.ACConfig.UserBlockList.forEach(one => {
                                    safeFunction(() => {
                                        one !== null && list.push(new RegExp(one
                                            .replace("*", ".*")));
                                    }, () => {
                                        list.push(one);
                                    })
                                })
                                if (typeof(this.other.addBlockItem) !== "undefined" && this
                                    .other.addBlockItem !== "") {
                                    safeFunction(() => {
                                        list.push(new RegExp(this.other.addBlockItem
                                            .replace("*", ".*")));
                                    }, () => {
                                        list.push(this.other.addBlockItem);
                                    })
                                }
                                this.calc_block_data = {
                                    md5: await md5WASM(new TextEncoder().encode(list.join(
                                        '=='))), // 编码虽然有问题,但是计算md5足够用了
                                    list
                                }
                                return this.calc_block_data
                            },
                            AdsStyleModeChange() {
                                return {
                                    v1: CONST.useItem.AdsStyleMode,
                                    v2: CONST.useItem.HuYanMode,
                                    v3: ACConfig.Style_BaiduLite,
                                    v4: ACConfig.isFaviconEnable,
                                    v5: CONST.isGoogleSpecial,
                                    v6: ACConfig.isRightDisplayEnable,
                                    v7: CONST.useItem.BgFit,
                                    v8: ACConfig.AdsStyleEnable,
                                };
                            },
                            UserStyleEnableChange() {
                                return {
                                    v1: ACConfig.isUserStyleEnable
                                }
                            },
                            lanChange() {
                                return {
                                    v1: ACConfig.isEnLang
                                };
                            },
                            isSaveButtonCanBeSee() {
                                return isElementVisible(this.$refs.bottomSaveButton)
                            }
                        },
                        watch: {
                            'other.faviconListMap': {
                                immediate: true,
                                deep: true,
                                async handler(val) {
                                    if (!ACConfig.isFaviconEnable) return
                                    // 遍历所有的数据,然后生成新的数据内容
                                    const baseCSS =
                                        '*[data-favicon-t]:before{width: 16px; height: 16px; margin-right: 4px; background-size: 100% 100%; vertical-align: text-top;}'
                                    const css = Object.entries(val).reduce((preCSS, cur) => {
                                        const [, {
                                            tagName = '',
                                            url = ''
                                        }] = cur
                                        let nowCSS = ''
                                        if (url) {
                                            // https://www.xtwind.com/api/index.php?url=???? 挂了。。。
                                            // https://statics.dnspod.cn/proxy_favicon/_/favicon?domain=sina.cn
                                            // www.google.com/s2/favicons?domain=764350177.lofter.com
                                            //如果地址不正确,那么丢弃
                                            // const imgUrl =
                                            //     "https://favicon.yandex.net/favicon/v2/" +
                                            //     url + "?size=32"
                                            const imgUrl = ACConfig.defaultFaviconUrl;
                                            nowCSS = tagName +
                                                `[data-favicon-t='${ url }']:before{background-image: url('${ imgUrl }');}`
                                        }
                                        return preCSS + nowCSS
                                    }, baseCSS)
                                    CONST.flushNode.insert(await create_CSS_Node(css,
                                        'AC-faviconTStyle'), 'head', {
                                        isReload: true
                                    })
                                }
                            },
                            'ACConfig.isALineEnable': {
                                immediate: true,
                                async handler(isEnable) {
                                    // 动态下划线
                                    if (!isEnable) {
                                        CONST.flushNode.insert(await create_CSS_Node(
                                            "a,a em{text-decoration:none !important}",
                                            "AC-NoLine"))
                                    } else {
                                        safeRemove("style[class='AC-NoLine']")
                                    }
                                }
                            },
                            // 当前站点的护眼模式变更
                            'CONST.useItem.HuYanMode': {
                                immediate: true,
                                handler(val) {
                                    if (val) CONST.fsBaidu.loadHuYanStyle()
                                }
                            },
                            // 当前站点的背景图片地址更换
                            'CONST.useItem.defaultBgUrl': {
                                handler(imageUrl) {
                                    changeSiteBackground(imageUrl)
                                }
                            },
                            calc_block_data: {
                                handler() {
                                    SiteBlock.renderDisplay()
                                }
                            },
                            AdsStyleModeChange: {
                                handler(curVal, preVal) {
                                    // 如果数据真的变了,那么调用后续更新,如果没变,那么跳过
                                    try {
                                        const curStr = JSON.stringify(curVal)
                                        const preStr = JSON.stringify(preVal)
                                        if (curStr === preStr) return
                                    } catch (e) {}

                                    // 需要先删除原有的节点数据
                                    while (true) {
                                        const {
                                            res,
                                            node
                                        } = checkDocmentHasNode("AC-")
                                        if (res) node.remove();
                                        else break;
                                    }

                                    safeRemove(
                                        "style[class='AC-Style-expand'],style[class='AC-TwoPageExStyle'],style[class='AC-ThreePageExStyle'],style[class='AC-FourPageExStyle'],style[class='AC-style-logo'],style[class='AC-baiduLiteStyle'],style[class*='HuYanStyle-File']"
                                    );
                                    acCssLoadFlag = false;
                                    if (ACConfig.AdsStyleEnable) {
                                        CONST.fsBaidu.init()
                                    }
                                }
                            },
                            UserStyleEnableChange() {
                                if (ACConfig.isUserStyleEnable) {
                                    this.loadCustomStyle();
                                } else {
                                    safeRemove("style[class='AC-userStyle']")
                                }
                            },
                            lanChange() {
                                AllData.lan.use = ACConfig.isEnLang ? AllData.lan.en : AllData.lan
                                    .zh_cn;
                                document.querySelector("#myuser").remove();
                            }
                        }
                    };
                    if (typeof(Vue) != "undefined") {
                        if (+Vue.version.charAt(0) === 2) {
                            vueVM = new Vue(options);
                        } else {
                            vueVM = Vue.createApp(options).mount(checkNode);
                        }
                    } else {
                        console.error("Vue 未完成初始化--程序无法有效执行");
                    }
                }, 250);

                function MainCallback(e) {
                    if (e.target != null && typeof(e.target.className) === "string" && e.target.className
                        .toUpperCase().indexOf("AC-") === 0) {
                        return;
                    } //屏蔽掉因为增加css导致的触发insert动作
                }

                /*以下代码大部分来源于SuprePreloader 感谢 swdyh && ywzhaiqi && NLF 以及 mach6 大佬*/

                /*
				Super_preloaderPlus_one_New: Preload and Autopager.
				Copyright (C) 2020 Mach6

				This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3.

				This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

				You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
				 */
                function ac_spfunc(e) {
                    console.error("这里有问题")
                    e.stopPropagation();
                    var t, r = e.currentTarget;
                    const Tween = {
                        Linear: function Linear(e, t, r, n) {
                            return r * e / n + t;
                        },
                        Quad: {
                            easeIn: function easeIn(e, t, r, n) {
                                return r * (e /= n) * e + t;
                            },
                            easeOut: function easeOut(e, t, r, n) {
                                return -r * (e /= n) * (e - 2) + t;
                            },
                            easeInOut: function easeInOut(e, t, r, n) {
                                return (e /= n / 2) < 1 ? r / 2 * e * e + t : -r / 2 * (--e * (e - 2) -
                                    1) + t;
                            }
                        },
                        Cubic: {
                            easeIn: function easeIn(e, t, r, n) {
                                return r * (e /= n) * e * e + t;
                            },
                            easeOut: function easeOut(e, t, r, n) {
                                return r * ((e = e / n - 1) * e * e + 1) + t;
                            },
                            easeInOut: function easeInOut(e, t, r, n) {
                                return (e /= n / 2) < 1 ? r / 2 * e * e * e + t : r / 2 * ((e -= 2) *
                                    e * e + 2) + t;
                            }
                        },
                        Quart: {
                            easeIn: function easeIn(e, t, r, n) {
                                return r * (e /= n) * e * e * e + t;
                            },
                            easeOut: function easeOut(e, t, r, n) {
                                return -r * ((e = e / n - 1) * e * e * e - 1) + t;
                            },
                            easeInOut: function easeInOut(e, t, r, n) {
                                return (e /= n / 2) < 1 ? r / 2 * e * e * e * e + t : -r / 2 * ((e -=
                                    2) * e * e * e - 2) + t;
                            }
                        },
                        Quint: {
                            easeIn: function easeIn(e, t, r, n) {
                                return r * (e /= n) * e * e * e * e + t;
                            },
                            easeOut: function easeOut(e, t, r, n) {
                                return r * ((e = e / n - 1) * e * e * e * e + 1) + t;
                            },
                            easeInOut: function easeInOut(e, t, r, n) {
                                return (e /= n / 2) < 1 ? r / 2 * e * e * e * e * e + t : r / 2 * ((e -=
                                    2) * e * e * e * e + 2) + t;
                            }
                        },
                        Sine: {
                            easeIn: function easeIn(e, t, r, n) {
                                return -r * Math.cos(e / n * (Math.PI / 2)) + r + t;
                            },
                            easeOut: function easeOut(e, t, r, n) {
                                return r * Math.sin(e / n * (Math.PI / 2)) + t;
                            },
                            easeInOut: function easeInOut(e, t, r, n) {
                                return -r / 2 * (Math.cos(Math.PI * e / n) - 1) + t;
                            }
                        },
                        Expo: {
                            easeIn: function easeIn(e, t, r, n) {
                                return 0 == e ? t : r * Math.pow(2, 10 * (e / n - 1)) + t;
                            },
                            easeOut: function easeOut(e, t, r, n) {
                                return e == n ? t + r : r * (1 - Math.pow(2, -10 * e / n)) + t;
                            },
                            easeInOut: function easeInOut(e, t, r, n) {
                                return 0 == e ? t : e == n ? t + r : (e /= n / 2) < 1 ? r / 2 * Math
                                    .pow(2, 10 * (e - 1)) + t : r / 2 * (2 - Math.pow(2, -10 * --e)) +
                                    t;
                            }
                        },
                        Circ: {
                            easeIn: function easeIn(e, t, r, n) {
                                return -r * (Math.sqrt(1 - (e /= n) * e) - 1) + t;
                            },
                            easeOut: function easeOut(e, t, r, n) {
                                return r * Math.sqrt(1 - (e = e / n - 1) * e) + t;
                            },
                            easeInOut: function easeInOut(e, t, r, n) {
                                return (e /= n / 2) < 1 ? -r / 2 * (Math.sqrt(1 - e * e) - 1) + t : r /
                                    2 * (Math.sqrt(1 - (e -= 2) * e) + 1) + t;
                            }
                        },
                        Elastic: {
                            easeIn: function easeIn(e, t, r, n, a, o) {
                                return 0 == e ? t : 1 == (e /= n) ? t + r : (o || (o = .3 * n), !a ||
                                    a < Math.abs(r) ? (a = r,
                                        i = o / 4) : i = o / (2 * Math.PI) * Math.asin(r / a), -a *
                                    Math.pow(2, 10 * (e -= 1)) * Math.sin((e * n - i) * (2 * Math
                                        .PI) / o) + t);
                                var i;
                            },
                            easeOut: function easeOut(e, t, r, n, a, o) {
                                return 0 == e ? t : 1 == (e /= n) ? t + r : (o || (o = .3 * n), !a ||
                                    a < Math.abs(r) ? (a = r,
                                        i = o / 4) : i = o / (2 * Math.PI) * Math.asin(r / a), a *
                                    Math.pow(2, -10 * e) * Math.sin((e * n - i) * (2 * Math.PI) /
                                        o) + r + t);
                                var i;
                            },
                            easeInOut: function easeInOut(e, t, r, n, a, o) {
                                return 0 == e ? t : 2 == (e /= n / 2) ? t + r : (o || (o = n * (.3 *
                                        1.5)), !a || a < Math.abs(r) ? (a = r,
                                        i = o / 4) : i = o / (2 * Math.PI) * Math.asin(r / a), e <
                                    1 ? a * Math.pow(2, 10 * (e -= 1)) * Math.sin((e * n - i) * (2 *
                                        Math.PI) / o) * -.5 + t : a * Math.pow(2, -10 * (e -= 1)) *
                                    Math.sin((e * n - i) * (2 * Math.PI) / o) * .5 + r + t);
                                var i;
                            }
                        },
                        Back: {
                            easeIn: function easeIn(e, t, r, n, a) {
                                return null == a && (a = 1.70158), r * (e /= n) * e * ((a + 1) * e -
                                    a) + t;
                            },
                            easeOut: function easeOut(e, t, r, n, a) {
                                return null == a && (a = 1.70158), r * ((e = e / n - 1) * e * ((a + 1) *
                                    e + a) + 1) + t;
                            },
                            easeInOut: function easeInOut(e, t, r, n, a) {
                                return null == a && (a = 1.70158), (e /= n / 2) < 1 ? r / 2 * (e * e * (
                                    (1 + (a *= 1.525)) * e - a)) + t : r / 2 * ((e -= 2) * e * ((1 +
                                    (a *= 1.525)) * e + a) + 2) + t;
                            }
                        },
                        Bounce: {
                            easeIn: function easeIn(e, t, r, n) {
                                return r - Tween.Bounce.easeOut(n - e, 0, r, n) + t;
                            },
                            easeOut: function easeOut(e, t, r, n) {
                                return (e /= n) < 1 / 2.75 ? r * (7.5625 * e * e) + t : e < 2 / 2.75 ?
                                    r * (7.5625 * (e -= 1.5 / 2.75) * e + .75) + t : e < 2.5 / 2.75 ?
                                    r * (7.5625 * (e -= 2.25 / 2.75) * e + .9375) + t : r * (7.5625 * (
                                        e -= 2.625 / 2.75) * e + .984375) + t;
                            },
                            easeInOut: function easeInOut(e, t, r, n) {
                                return e < n / 2 ? .5 * Tween.Bounce.easeIn(2 * e, 0, r, n) + t : .5 *
                                    Tween.Bounce.easeOut(2 * e - n, 0, r, n) + .5 * r + t;
                            }
                        }
                    };
                    const TweenM = ["Linear", "Quad", "Cubic", "Quart", "Quint", "Sine", "Expo", "Circ",
                        "Elastic", "Back", "Bounce"
                    ];
                    const TweenEase = ["easeIn", "easeOut", "easeInOut"];
                    var prefs = {
                        s_method: 3,
                        s_ease: 2,
                        s_FPS: 60,
                        s_duration: 333,
                    };

                    function getRelativeDiv(e) {
                        var t = r.id;
                        return (t = t.replace(/(sp-separator-)(.+)/, (function(t, r, n) {
                            return r + String(Number(n) + ("pre" == e ? -1 : 1));
                        }))) ? document.getElementById(t) : null;
                    }

                    function sp_transition(e, t) {
                        var r = sp_transition.TweenF;
                        r || (r = (r = Tween[TweenM[prefs.s_method]])[TweenEase[prefs.s_ease]] || r,
                            sp_transition.TweenF = r);
                        var n = 1e3 / prefs.s_FPS,
                            a = 0,
                            o = e,
                            i = t - e,
                            s = Math.ceil(prefs.s_duration / n),
                            c = window.scrollX;
                        ! function transition() {
                            var e = Math.ceil(r(a, o, i, s));
                            window.scroll(c, e), a < s && (a++, setTimeout(transition, n));
                        }();
                    }

                    function scrollIt(e, t) {
                        sp_transition(e, t);
                    }

                    switch (e.target.id) {
                        case "sp-sp-gotop":
                            scrollIt(window.scrollY, 0);
                            break;

                        case "sp-sp-gopre":
                            var n = getRelativeDiv("pre");
                            if (!n) return;
                            t = window.scrollY;
                            var a = n.getBoundingClientRect().top;
                            a = t - (r.getBoundingClientRect().top - a);
                            scrollIt(t, a);
                            break;

                        case "sp-sp-gonext":
                            var o = getRelativeDiv("next");
                            if (!o) return;
                            t = window.scrollY;
                            var i = o.getBoundingClientRect().top;
                            i = t + (-r.getBoundingClientRect().top + i);
                            scrollIt(t, i);
                            break;

                        case "sp-sp-gobottom":
                            scrollIt(window.scrollY, Math.max(document.documentElement.scrollHeight, document
                                .body.scrollHeight));
                    }
                }

                function windowscroll(fn = () => {}) {
                    safeWaitFunc(() => document.documentElement, () => {
                        var beforeScrollTop = document.documentElement.scrollTop
                        window.addEventListener("scroll", function(e) {
                            var afterScrollTop = document.documentElement.scrollTop,
                                delta = afterScrollTop - beforeScrollTop;
                            if (delta === 0) return false;
                            fn(delta > 0 ? "down" : "up", e);
                            beforeScrollTop = afterScrollTop;
                        }, false);
                    })
                }

                // 2秒后才绑定滚动事件
                safeWaitFunc('body', () => {
                    setTimeout(() => {
                        windowscroll(async function(direction, e) {
                            if (direction === "down") { // 下滑才准备翻页
                                let spl = document.querySelector("#sp-fw-a_enable");
                                // 开启后,且在非(suprepreloader启用)时均可
                                if (ACConfig.isAutopage === true && !(spl && spl
                                        .checked === true)) {
                                    var scrollTop = document.documentElement
                                        .scrollTop || window.pageYOffset || document
                                        .body.scrollTop;
                                    let scrollDelta = 666;
                                    if (curSite.SiteTypeID === SiteType.GOOGLE)
                                        scrollDelta = 1024; // 毕竟谷歌加载缓慢的问题
                                    if (document.documentElement.scrollHeight <=
                                        document.documentElement.clientHeight +
                                        scrollTop + scrollDelta && curSite
                                        .pageLoading === false) {
                                        curSite.pageLoading = true;
                                        if (curSite.SiteTypeID === SiteType
                                            .DUCK) { // 可以用已有的方法来实现了
                                            if (!ACConfig.normalizeDuck || +ACConfig
                                                .duck.AdsStyleMode >= 3
                                            ) { // 如果没有开启,那么手动翻页 || 如果是双列的时候,似乎并不会自动触发翻页效果
                                                document.querySelector(
                                                        "#links .result--more a")
                                                    .click();
                                                setTimeout(function() {
                                                    curSite.pageLoading =
                                                        false;
                                                }, 5000);
                                            }
                                        } else {
                                            ShowPager.loadMorePage();
                                            if (curSite.pager && curSite.pager
                                                .stylish) {
                                                CONST.flushNode.insert(
                                                    await create_CSS_Node(
                                                        curSite.pager.stylish,
                                                        "AC-pager-stylish"))
                                            }
                                        }
                                    }
                                }
                            }
                        });
                    }, 2000)
                })
                var ShowPager = {
                    getFullHref: function(e) {
                        if (e === null) return '';
                        "string" != typeof e && (e = e.getAttribute("href"));
                        var t = this.getFullHref.a;
                        return t || (this.getFullHref.a = t = document.createElement("a")), t.href = e,
                            t.href;
                    },
                    createDocumentByString: function(str) {
                        // string转为DOM
                        if (!str) {
                            console.error("[AC-Script]", 'No string found to be converted to DOM');
                            return;
                        }

                        if (document.documentElement.nodeName !== 'HTML') {
                            return new DOMParser().parseFromString(str, 'application/xhtml+xml');
                        }
                        /**@type {HTMLDocument} */


                        var doc;

                        try {
                            // firefox and chrome 30+,Opera 12 会报错
                            doc = new DOMParser().parseFromString(str, 'text/html');
                        } catch (ex) {}

                        if (doc) {
                            return doc;
                        }

                        if (document.implementation.createHTMLDocument) {
                            doc = document.implementation.createHTMLDocument('superPreloader');
                        } else {
                            try {
                                //@ts-ignore
                                doc = document.cloneNode(false);
                                doc.appendChild(doc.importNode(document.documentElement, false));
                                doc.documentElement.appendChild(doc.createElement('head'));
                                doc.documentElement.appendChild(doc.createElement('body'));
                            } catch (e) {}
                        }

                        if (!doc) return;
                        var range = document.createRange();
                        range.selectNodeContents(document.body);
                        var fragment = range.createContextualFragment(str);
                        doc.body.appendChild(fragment);
                        var headChildNames = {
                            TITLE: true,
                            META: true,
                            LINK: true,
                            STYLE: true,
                            BASE: true
                        };
                        var child;
                        var body = doc.body;
                        var bchilds = body.childNodes;

                        for (var i = bchilds.length - 1; i >= 0; i--) {
                            // 移除head的子元素
                            child = bchilds[i];
                            if (headChildNames[child.nodeName]) body.removeChild(child);
                        }

                        return doc;
                    },
                    loadMorePage: async function() {
                        if (curSite.pager) {
                            let curPageEle = getElementByXpath(curSite.pager.nextLink);
                            var url = this.getFullHref(curPageEle);
                            if (curSite.SiteTypeID === SiteType.GOOGLE) {
                                if (navigator.userAgent.toLowerCase().includes('macintosh')) {
                                    // MARK 为了兼容百度在safari下的
                                    url = url.replace('https://', 'http://');
                                }
                            }
                            if (url === '') return;
                            var sepImgs = {
                                top: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWtJREFUeNrclE0rRGEUx8c1GUpRJIVIZGdhZCVr38GGhaI0ZXwCkliglChZEcvJxhdgYWOjLEUpm/EyiLzze+o8dTzdO3PljoVTv7rPc8/5d+6555xYrEhWop6boda5+6l9wjWcWpF+WIbqCJJ9hFRcDr3QAIkIhKugz5PDfkSixkphz5aiAnqgE8rgWRxGoSOPyBkswQuUwyscw4HrmFCZL8Kt/JAg7mEFPEmo4FdPwk0BUcsdzIap0TQ8qMAPuICcEjLnd+VjSjcfJNgIc/DkZGSymYGsnK9EZMrxe4MFaNGiZjC2fT5zQ3p7QDK1dR2GSljziclAvRUe8nHYVA4jjvC43NfAuk/smB2QNqcsWxKcLbAKTFnS0hWD6n27Fd6FLqiDI5iQmQ9jpiVT0sNJ6aYd7dAE3QHBbinSAX5JWWaxuLo8F35jh/bBK9Y+/r/Cl6pLcnna8NvuDGMnslpbZRpXZYT/3r4EGACZL3ZL2afNFAAAAABJRU5ErkJggg==",
                                bottom: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXFJREFUeNrM1c8rBGEcx/FdtCEkLqYtpdwkKSUHUhxwITdK+Z3yM2cOLnJ39Cc44SgHScmJwlFxsIdlCScO6/2t76Onp52dXTtbnno1M8+Pz84+zzMzkcg/KA3oRTzM0A4cI4VTdIUVPIM3pPGO5aABJTkGx1BqjYmFFZxW7nnBwXmXogWX6bEGc2jEIU7+kNWDUSSwZyqndSvJ3N1g2Bm0oLtB2j+w7rQP4MpqXzRT0YRaPW/BthMedYLs60HsoE2vq9BsPwAJa8XFLUa0fUrvROo/saT1Q9adGimdlt8yj6TT6Q6d2vaida9YRbtP6EqmBZC5fHA6X+AAz1bwEc6cfk9+oaZM4NoZJL70+J2hTaZtNpet041zK8yP/Mgl+rOF1emr0UM1xnAfEPyISd0Jno6vtx+QuM6PZ22lpO7dbEV2Siv6rPeIjNs1HdYC7ixfG+YBqdTVDqPIv6iIWvO7iXGUFxAqi72PraJ9IH8EGACQcYjYRd5GHwAAAABJRU5ErkJggg==",
                                pre: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAASlJREFUeNpiYBjOoBiIrwJxFRAzUsvQViD+CMT/gfgTEPdRy9BPUENh+AsQ91JiaAuSS9HxZ3INb8Hi0v+UurwF6qL/ROBvQNxDrKFfkTT+A+JnQPwBKfJA/L9Ian7ic7kMEHcC8Q80F3UAcRsQv4by30INaUJT9weaWhSQDRUB4uVYvLkYiAWAOBopvEFBlArEPEA8G4ue9UAsATM4EYuCJUgKMtAMLoSKCwPxXCx6c1igClTQgmUZVPNrHMEGy3mgYCkCYiYgTkCSV4UZvA2IjYBYDIgvQbPvOyJTECid5wHxbyA2BuL3QLwRWYEsEJvg0IweFEU41IEMlgcxWJAEH0MxJeAsjMFEq6Jw+Br8BimVfMCTDEkG7EBcA8T3oWUJx4DVYwABBgCannnSzbgwIQAAAABJRU5ErkJggg==",
                                next: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAT1JREFUeNrc1b1KA0EYheEl/iARFFEkKl6D0UK8CrEVrCwEexFCtBIlRWIjsfEiLL0FKzs7QUWxM2piFMUkvhPOwLAs2TGuCn7wkNll5jC7+w0Jgv9avdjAObbQn1TwCu7QwhWW4xakPIOHMKzxGCaSCm6ioXHLZ0Hqpz7KrwRPIvvNvBlM2zYyNY8cMjhDHo9fCBzErnIqKNjgRSxpvIABbOLes2MKWHfuXdhXcR2avKrJ4zGhI9gLhQbq9XaZgGO1kutIOzIHpKp7NawhjYOINSeY6lFwHacw17P6NTWHd4xqnNbcS83LObtsaCPbEW+gXUW8ODswC27xoOsn3ODDmfOGss9XLuE54jGjvPqGuuG1mFDzZIfdNHynnde7DbW1r5DwTstJHP2iE55YqD36ebXZDvr+7L/sU4ABAIpVZWnoA5GkAAAAAElFTkSuQmCC",
                                next_gray: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtxJREFUeNrclc9L2mEcx7/6NbVZqRVj7pIOlIUuZ1HMgv0BDcqT7JrskH13ELPBF7eTvz10HznWQBlBRIfBXIfBLmqXscvYZWPKrMNIU9Apmrr34/w6i0ovMZjw+H0+z/N8Xt+Pn/fn80hR/+WHYRhBIpFwRKPRz/F4/KnD4RB28xH0Ah4cHHyoUCjsIpFIIZPJHkml0m9Yfn2ZD78XcL1eH6rValIMCmMUtqKbD7/HbNQxaq15oxcH/lXpcmXgtnh2u/2mXC6/DqE+sSxLlUqlniE0TVPBYJAqFot6+GV9Pt+PJthms80sLS2xEonkhlgs/jgwMOBcXV3N5fP5rlCcp9bX1yWLi4uecrk8U6lUshDY3wRbLJYFGKZsNksq4N78/LwY9hOn05k5Ojqi+PzTGePxeFwZUl6vd8hkMvkPDg6sZJ2M5eXlr1wqUu2kA5JOpy2IAO+oO9fW1n5mMpk2nDjmcjkKNU25XC652Wx2pVIp65mXJ2nyjUPpqakpNZxuA8Y5T87OzsobjcYHpVKpGhsbe1CtVkXYqxQKhTdqtfqL1Wr1JpPJxxyU5Lq/vz8aCoX8TTDatYiFhF6vxx5tAJwm8OPj48m5ubmKSqUaAWwSa9eQw6JGo/luNBoNh4eHbAe0JhAINsLh8LNAIJCiudhxB+Qh2ludTifDAQLvI3AIch+Rkl8jJlrhCbOqgfoLmDepOF/BfGNra2sFFZFtvqgzMbFYjAiyp9Vqh4VC4cTJyYmQ90epIQJtHRO1bA5aRhAvdnZ2GI/H87cEz5YPgeOS2RsfHx9B7u+gOi68yQAtYX9zd3eXgZCna/s8By5ypGUUzhOISHgO9BfWXwG6chZ6IbiVc6LwnsFgGIVAepLzjk4rYW1ze3ubcbvd53fjZV2FaqGQ63fT09PDMO9i9BEoon0J9Rm/339xm3dr2f39fVLX7wFvoMVvoYWfRyIRFndD/Z/8nf0WYAA8EC1Z/ZNm4gAAAABJRU5ErkJggg==",
                                pre_gray: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAslJREFUeNrclTtMWmEUxz/uvTzlIUhpNMR0aGNjrNHSmHTqRJyadujQDbSGRwJUaYCmDizqUEw6ODVNGgbpYCfSpFINCQzFR9oyMXRsXFCsAXkIKNL/R7gGWxOsSdPEk5zc3O+e87vn+59zv0vIpbSJiQmyubn5LBKJpNbX11+4XC5Buxy2XYDNZiMOh2OW4ziPTCbTi8XikeHh4SsSieQTXnIxsN1uJ1ardVYgEDgPDw+V9Xqd1Go1Mcuyg7AuuVy+sra29ndgVEnGx8dnhEKhs1qtKgE/eXZ8fCzC+q3+/n6tSqVaSSQS5wM7nU5iMplmsF1XpVI5BeXt6OhIBFkGAe9SKpV/wNmzKjWbzRT6tFwuK86CUqPrkIVWPjQwMKBWKBSn4Ozv0LGxsRmRSDSFSjua0Do8TRWAS+B5+B68g/IhixCNvQPN1WjuieZsS/f1aNQ0wzBuaCqlUCQRtVr9Es1K4kVDWJNhrQjAIiqMlkqle804FnkjBoOhEzv4vrGxkW2ALRaLFrq+QoAV2nE8tLe3dzEYDE5vb2939vX1PcBkiKVSaQ1jForFYq+NRqMum83ebsYzmJq7sGu4xhkKxsDfB/AxnO860ev1oeXlZU8gEMgmk0kFqmw8o9dUKiWfn58vhMPh54h7S+OpQXNSLBYfejyeR1yzw9dbRon09PS8W11dnfL5fJl8Pk+0Wi3hk5vyCNBY4vV6f0Im9+joKJNOp818o8G70ah4aWnpIzSKYCa/dXd3B+PxuHNycjKzs7NzAms1+qFQy+VydDRz0WjUpdPp3tB8TFM0FAqFGxXPzc19plJrNJqraMoXt9tNt3Suc+Tg4ICeJfmFhQVLoVAwoKG7fr//B8cHAL6Fy9ZFDinaG/r5w77ya8y/OhEvKRhjtIup2YMTeBb3mXY53HnAmNkP+/v7NzHTTwAO4f79f/ud/RJgAOLcRNZqLojMAAAAAElFTkSuQmCC",
                            };
                            CONST.flushNode.insert(await create_CSS_Node(
                                ".sp-separator{line-height:1.8 !important;opacity:1 !important;position:relative !important;float:none !important;top:0 !important;left:0 !important;min-width:366px;width:auto;text-align:center !important;font-size:14px !important;display:block !important;padding:3px 0 !important;margin:5px 10px 8px;clear:both !important;border-style:solid !important;border-color:#cccccc !important;border-width:1px !important;-moz-border-radius:30px !important;border-radius:30px !important;background-color:#ffffff !important;}.sp-separator:hover{box-shadow:0 0 11px rgba(33,33,33,0.2);}#sp-separator-hover{display:none;}.sp-separator:hover #sp-separator-hover{display:block;}.sp-separator .sp-someinfo{position:absolute !important;right:10px !important;font-size:12px !important;font-style:italic !important;background:none !important;}.sp-separator span{vertical-align: middle;cursor: pointer;padding: 0;margin: 0 5px;display: inline-block; width:22px;height:22px;}.sp-separator a{margin:0 20px 0 -6px !important;display:inline !important;text-shadow:#fff 0 1px 0 !important;background:none !important;color:#595959 !important;}.sp-separator input{padding:0 !important;line-height:23px !important;}.sp-separator .sp-md-span{font-weight:bold !important;margin:0 20px !important;}#sp-sp-md-number{width:6ch !important;vertical-align:middle !important;display:inline-block !important;text-align:left !important;}" +
                                `.ac_sp_top{background-image:url('${ sepImgs.top }')}` +
                                `.ac_sp_pre{background-image:url('${ sepImgs.pre }')}` +
                                `.ac_sp_next{background-image:url('${ sepImgs.next }')}` +
                                `.ac_sp_bottom{background-image:url('${ sepImgs.bottom }')}` +
                                `.ac_sp_next_gray{background-image:url('${ sepImgs.next_gray }')}` +
                                `.ac_sp_pre_gray{background-image:url('${ sepImgs.pre_gray }')}`,
                                "AC-Preload"))
                            if (curSite.pageUrl === url) {
                                console.error("[AC-Script]", "翻页到达底部了 - 或者异常 - 出现异常请直接反馈作者修改");
                                return;
                            } // 不会重复加载相同的页面
                            console.log("加载翻页地址:" + url)
                            curSite.pageUrl = url;
                            // 对url的数据进行读取
                            curSite.pager.startFilter && curSite.pager.startFilter();
                            GM_xmlhttpRequest({
                                url: url,
                                method: "GET",
                                timeout: 5000,
                                onload: function(response) {
                                    try {
                                        var newBody = ShowPager.createDocumentByString(
                                            response.responseText);

                                        let pageElems = getAllElements(curSite.pager
                                            .pageElement, newBody, newBody);
                                        const scriptElems = getAllElements('//script',
                                            newBody, newBody);

                                        let toElement = getAllElements(curSite.pager
                                            .HT_insert[0])[0];
                                        if (pageElems.length >= 0) {
                                            // 处理最后一个翻页按钮
                                            let nextEs = document.querySelectorAll(
                                                "#sp-sp-gonext");
                                            if (nextEs.length > 0) {
                                                let lastE = nextEs[nextEs.length - 1];
                                                lastE.classList.replace("ac_sp_next_gray",
                                                    "ac_sp_next");
                                            }
                                            // 插入翻页按钮元素
                                            curSite.pageNum++;
                                            let addTo = "beforeend";
                                            if (curSite.pager.HT_insert[1] === 1) addTo =
                                                "beforebegin";
                                            toElement.insertAdjacentHTML(addTo, `<div class='sp-separator AC' id='sp-separator-ACX'>
                          <a class='sp-sp-nextlink' target='_blank'><b>第 <span style='color:#595959!important;'>ACX</span> 页</b></a>
                          <span id="sp-sp-gotop" class='ac_sp_top' title='去到顶部'></span>
                          <span id="sp-sp-gopre" class='${ curSite.pageNum <= 2 ? "ac_sp_pre_gray" : "ac_sp_pre" }' title='上滚一页' ></span>
                          <span id="sp-sp-gonext" class='ac_sp_next_gray' title='下滚一页'></span>
                          <span id="sp-sp-gobottom" class='ac_sp_bottom' title='去到底部' ></span></div>`
                                                .replace(/ACX/gm, curSite.pageNum));
                                            // 插入新页面元素
                                            pageElems.forEach(function(one) {
                                                toElement.insertAdjacentElement(
                                                    addTo, one);
                                            });
                                            document.querySelectorAll(
                                                ".sp-separator.AC:not([bind])").forEach(
                                                function(per) {
                                                    per.setAttribute("bind", 1);
                                                    per.addEventListener("click",
                                                        ac_spfunc);
                                                });

                                            // 插入scripts & style - 保证js加载
                                            if (curSite.SiteTypeID === SiteType.GOOGLE) {
                                                var scriptText = "";
                                                scriptElems.forEach((one) => {
                                                    scriptText += one.innerHTML;
                                                });

                                                const scriptNode = document.createElement(
                                                    "script");
                                                scriptNode.innerHTML = scriptText;
                                                toElement.appendChild(scriptNode)
                                            }

                                            // 替换待替换元素
                                            try {
                                                if (curSite.pager.replaceE) {
                                                    let oriE = getAllElements(curSite.pager
                                                        .replaceE);
                                                    let repE = getAllElements(curSite.pager
                                                        .replaceE, newBody, newBody);
                                                    if (oriE.length === repE.length) {
                                                        if (oriE.length === 0) {
                                                            throw "翻页-替换翻页元素 'replaceE' 失效";
                                                        }
                                                        for (var i = 0; i < oriE
                                                            .length; i++) {
                                                            oriE[i].outerHTML = repE[i]
                                                                .outerHTML;
                                                        }
                                                    }
                                                }
                                            } catch (e) {
                                                console.log(e);
                                            }
                                        }
                                    } catch (e) {
                                        console.log(e);
                                    }
                                    curSite.pageLoading = false;
                                },
                                onerror: function() {
                                    curSite.pageLoading = false;
                                }
                            });
                        }
                    },
                };

                async function AddCustomStyle() {
                    if (ACConfig.isUserStyleEnable) {
                        less.render(ACConfig.UserStyleText, async (e, css) => {
                            if (!e) {
                                css = css.css || ''
                                CONST.flushNode.insert(await create_CSS_Node(css,
                                    "AC-userStyle"), 'head', {
                                    isReload: true
                                })
                            }
                        });
                    } else {
                        // 为了方便调整样式和查看效果,暂时不移除
                        // safeRemove("style[class='AC-userStyle']")
                    }
                    CONST.flushNode.insert(await create_CSS_Node(
                        ".opr-recommends-merge-imgtext{display:none!important;}" + // 移除百度浏览器推广
                        ".res_top_banner{display:none!important;}" + // 移除可能的百度HTTPS劫持显示问题
                        ".headBlock, body>div.result-op{display:none;}" // 移除百度的搜索结果顶部一条的建议文字 & 移除可能出现的白屏现象
                        , "AC-special-BAIDU"))

                    // 添加 自定义的动画
                    const aniStyle = `@keyframes ani_leftToright {
    0% {
        transform: translateX(-32px);
        opacity: 0.2;
    }
    20% {
        opacity: 0.5;
    }
    30% {
        opacity: 0.8;
    }
    100% {
        opacity: 1;
    }
}
/* ani */
@keyframes ani_bottomTotop {
    0% {
        transform: translateY(32px);
        opacity: 0.2;
    }
    20% {
        opacity: 0.5;
    }
    30% {
        opacity: 0.8;
    }
    100% {
        opacity: 1;
    }
}
@-webkit-keyframes ani_topTobuttom {
    0% {
        transform: translateY(-32px);
        opacity: 0.2;
    }
    20% {
        opacity: 0.5;
    }
    30% {
        opacity: 0.8;
    }
    100% {
        opacity: 1;
    }
}
@-webkit-keyframes ani_hideToShow {
    0% {
        display:none;
        opacity: 0.2;
    }
    20% {
        opacity: 0.5;
    }
    30% {
        opacity: 0.8;
    }
    100% {
        opacity: 1;
    }
}
@-webkit-keyframes ani_showToHide {
    0% {
        display:none;
        opacity: 1;
    }
    20% {
        opacity: 0.8;
    }
    30% {
        opacity: 0.5;
    }
    100% {
        opacity: 0.3;
    }
}
.aniDelete{transition: all 0.15s cubic-bezier(0.4, 0, 1, 1);opacity: 0.1}
`;
                    CONST.flushNode.insert(await create_CSS_Node(aniStyle, "AC-AnimationStyle"))
                }

                /**这东西以后会用上**/
                function getSearchValue() {
                    let kvl = location.search.substr(1).split("&");
                    let searchV = "";
                    for (let i = 0; i < kvl.length; i++) {
                        let value = kvl[i].replace(/^(wd|query|q)=/, "");
                        if (value !== kvl[i]) {
                            searchV = value;
                        }
                    }
                    //  '+' 百度、搜狗、必应、谷歌、好搜
                    searchV = searchV.replace("+", " ");
                    return searchV;
                }

                async function rapidDeal() {
                    try {
                        if (curSite.SiteTypeID !== SiteType.OTHERS) {
                            try {
                                if (ACConfig.isAdsEnable) { // 移除多余的广告内容
                                    removeAD_baidu_sogou();
                                }
                                RedirectHandle(); // 处理主重定向
                                if (ACConfig.isFaviconEnable && typeof(curSite.FaviconType) !==
                                    'undefined') { // 显示favicon图标
                                    // 延迟2秒加载,减少可能出现的问题
                                    addFavicon(document.querySelectorAll(curSite
                                        .FaviconType)); // 添加Favicon显示
                                } else {
                                    safeRemove(".AC-faviconTStyle");
                                    document.querySelectorAll(curSite.FaviconType).forEach((one) => {
                                        one.removeAttribute("ac_faviconstatus");
                                    })
                                }
                                if (ACConfig.isCounterEnable) {
                                    // 延迟加载,避免页面出现js问题
                                    setTimeout(() => {
                                        addCounter(document.querySelectorAll(curSite
                                            .CounterType)); // 显示计数器
                                    }, 800)
                                } else {
                                    document.querySelectorAll(".AC-CounterT").forEach(one => {
                                        one.parentElement.removeAttribute('SortIndex');
                                        one.remove()
                                    })
                                }
                                if (ACConfig.doDisableSug) { // 不启用移动预测[默认]
                                    acSetCookie("ORIGIN", 2, "www.baidu.com");
                                    acSetCookie("ISSW", 1);
                                    acSetCookie("ISSW", 1, "www.baidu.com");
                                }
                                // if(CONST.useItem.HuYanMode === false && document.querySelector("style[class*='darkreader']") != null) {
                                //   CONST.useItem.HuYanMode = true;
                                // }
                                if (ACConfig.isBlockEnable && curSite.SiteTypeID !== SiteType
                                    .SOGOU) { // 启用屏蔽功能- 对每一个新增的地址都要处理
                                    // 延迟执行,减少页面损耗
                                    SiteBlock.init();
                                }
                                if (document.body) {
                                    if (!ACConfig.isRightDisplayEnable) { // 右侧栏显示
                                        document.body.classList.remove("showRight")
                                    } else if (!document.body.classList.contains('showRight')) {
                                        document.body.classList.add("showRight")
                                    }
                                    if (curSite.SiteTypeID === SiteType.BAIDU && location.href.includes(
                                            "tn=news")) {
                                        if (!document.body.hasAttribute('news')) document.body.setAttribute(
                                            "news", "1");
                                    } else {
                                        document.body.removeAttribute("news");
                                    }
                                }

                            } catch (e) {
                                console.error(e)
                            }
                        }

                    } catch (e) {
                        console.log(e);
                    }
                }

                function acSetCookie(cname, cvalue, domain, exdays) {
                    try {
                        exdays = exdays || 30;
                        let d = new Date();
                        domain = (domain ? "domain=" + domain : "") + ";";
                        d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
                        let expires = "expires=" + d.toUTCString();
                        document.cookie = cname + "=" + cvalue + "; " + domain + expires +
                            ";path=/;SameSite=None;Secure";
                    } catch (e) {}
                }

                /**
                 * isBaiduLink = 是否为未处理之前的百度链接
                 * */
                function getNodeHost(sitetpNode) {
                    if (curSite.SiteTypeID === SiteType.BAIDU) {
                        const href = sitetpNode.getAttribute("href");
                        if (href != null && !href.includes("baidu.com/link")) {
                            // 已经解析出来了
                            return {
                                curHost: getTextHost(href),
                                curUrl: href
                            };
                        } else {
                            const host = getTextHost(sitetpNode.innerText || sitetpNode.textContent)
                            return {
                                curHost: host,
                                curUrl: host,
                                isBaiduLink: true
                            }; // 未被解密
                        }
                    } else if (sitetpNode instanceof HTMLAnchorElement) {
                        return {
                            curHost: sitetpNode.host,
                            curUrl: sitetpNode.href
                        };
                    } else {
                        const host = getTextHost(sitetpNode.innerText || sitetpNode.textContent)
                        return {
                            curHost: host,
                            curUrl: host
                        };
                    }
                }

                function RedirectHandle() {
                    // 处理主重定向
                    if (curSite.SiteTypeID === SiteType.OTHERS || curSite.SiteTypeID === SiteType.SOGOU) return;
                    if (ACConfig.isRedirectEnable) {
                        if (curSite.Stype_Normal) { // 如果定义了,那么就去处理重定向
                            // 百度搜狗去重定向
                            resetURLNormal();
                            if (checkISBaiduMain()) {
                                document.querySelectorAll(
                                    ".s_form .index-logo-src[src*='gif'], .s_form .index-logo-srcnew[src*='gif']"
                                ).forEach(function(per) {
                                    per.src =
                                        "https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png";
                                    // 神奇的百度百家号
                                    // https://imgsa.baidu.com/fex/pic/item/8718367adab44aedcc91ab2bbe1c8701a08bfb26.jpg
                                    // https://baidu.ntaow.com/newcss/baidu.png
                                });
                            }
                        }
                        if (curSite.SiteTypeID === SiteType.GOOGLE)
                            removeOnMouseDownFunc(); // 移除onMouseDown事件,谷歌去重定向
                        if (curSite.SiteTypeID === SiteType.MBAIDU)
                            removeMobileBaiduDirectLink(); // 处理百度手机版本的重定向地址
                        removeRedirectLinkTarget(); // 只移除知乎的重定向问题 & 百度学术重定向问题
                        safeRemove(".res_top_banner"); // 移除百度可能显示的劫持
                    }

                    try { // 放入异常捕获,防止由于html插入过慢导致的js终止
                        if (!ACConfig.AdsStyleEnable) {
                            document.querySelectorAll("input[name*='sp-ac-a_force_style_']").forEach(per => {
                                per.setAttribute("disabled", "disabled");
                                per.parentNode.setAttribute("title", "请开启自定义样式")
                            });
                        } else {
                            document.querySelectorAll("input[name*='sp-ac-a_force_style_']").forEach(per => {
                                per.removeAttribute("disabled");
                                per.parentNode.setAttribute("title", "AC-自定义样式内容")
                            });
                        }
                        if (!ACConfig.isBlockEnable) {
                            document.querySelectorAll("#sp-ac-removeBlock, #sp-ac-blockBtnDisplay").forEach(
                                per => {
                                    per.setAttribute("disabled", "disabled");
                                    per.parentNode.setAttribute("title", "请开启拦截功能")
                                });
                        } else {
                            document.querySelectorAll("#sp-ac-removeBlock, #sp-ac-blockBtnDisplay").forEach(
                                per => {
                                    per.removeAttribute("disabled");
                                    per.parentNode.setAttribute("title", "AC-自主拦截功能")
                                });
                        }
                    } catch (e) {}
                }

                function ACtoggleSettingDisplay(e) {
                    e.stopPropagation();

                    // 显示、隐藏设置界面
                    setTimeout(function() {
                        if (document.querySelector("#sp-ac-content").style.display === 'block') {
                            document.querySelector("#sp-ac-content").style.display = 'none';
                        } else {
                            DBConfig.oldVersion = ACConfig.oldVersion = GM_info.script
                                .version; // 只需要写出一部分的关键数据即可
                            ACSetValue("Config", JSON.stringify(DBConfig));
                            document.querySelector(".ac-newversionDisplay").style.display = 'none';
                            document.querySelector("#sp-ac-content").style.display = 'block';
                        }
                    }, 100);
                    return false;
                }

                function ShowSetting() {
                    if (curSite.SiteTypeID === SiteType.OTHERS) return;
                    // 如果不存在的话,那么自己创建一个-copy from superPreload
                    if (document.body !== null && document.querySelector("#sp-ac-container") === null) {
                        let Container = document.createElement('div');
                        Container.id = "sp-ac-container";
                        Container.innerHTML =
                            `<div id="sp-ac-content" style="display: none;" xmlns="http://www.w3.org/1999/html">
                <div id="sp-ac-main">
                  <fieldset id="sp-ac-autopager-field" style="display:block;">
                    <legend class="iframe-father">
                       <a class="linkhref" href="#" v-text="lan.use.fieldset_panel.panel_title"></a>
                    </legend>
                    <ul class="setting-main" v-show="other.curTab === 1">
                      <li>
                        <label :title="lan.use.fieldset_panel.setting_panel.redirect_title">
                          <input id="sp-ac-redirect" name="sp-ac-a_separator" type="checkbox"  v-model="ACConfig.isRedirectEnable">
                          {{ lan.use.fieldset_panel.setting_panel.redirect_text }}
                        </label>
                        <label>
                          <input id="sp-ac-isEnLang" name="sp-ac-a_force" type="checkbox" v-model="ACConfig.isEnLang">
                          {{ lan.use.fieldset_panel.setting_panel.useEn_text }}
                        </label>
                        <span id="sp-ac-savebutton" @click="saveConfig" class="sp-ac-spanbutton endbutton" :title="lan.use.fieldset_panel.setting_panel.okBtn_text" style="position: relative;float: right;margin-top: -6px;" v-text="lan.use.fieldset_panel.setting_panel.okBtn_text"></span>
                        <span id="sp-ac-resetbutton" @click="changeResetText" @dblclick="resetConfig" class="sp-ac-spanbutton endbutton" :title="lan.use.fieldset_panel.setting_panel.resetBtn_text" style="position: relative;float: right;margin-top: -6px;" v-text="lan.use.fieldset_panel.setting_panel.resetBtn_text"></span>
                      </li>
                      <li>
                        <label :title="lan.use.fieldset_panel.setting_panel.ads_title">
                          <input id="sp-ac-ads" name="sp-ac-a_force" type="checkbox" v-model="ACConfig.isAdsEnable">
                          {{ lan.use.fieldset_panel.setting_panel.ads_text }}
                        </label>
                        <label :title="lan.use.fieldset_panel.setting_panel.autopage_title" class="">
                          <input id="sp-ac-isAutopage" name="sp-ac-a_force" type="checkbox" v-model="ACConfig.isAutopage">
                          {{ lan.use.fieldset_panel.setting_panel.autopage_text }}
                        </label>
                      </li>
                      <li>
                        <label title="lan.use.fieldset_panel.setting_panel.blockenable_title">
                          <input id="sp-ac-block" name="sp-ac-a_force" type="checkbox" v-model="ACConfig.isBlockEnable">
                          {{ lan.use.fieldset_panel.setting_panel.blockenable_text }}
                        </label>
                        <span id="sp-ac-blockdiybutton" class="sp-ac-spanbutton" @click="other.curTab = 2" :title="lan.use.fieldset_panel.setting_panel.blockDiyBtn_title" style="margin-left: 5px;color: #888888;" v-text="lan.use.fieldset_panel.setting_panel.blockDiyBtn_text"></span>
                        <label :title="lan.use.fieldset_panel.setting_panel.blockenable_text">
                          <input :title="lan.use.fieldset_panel.setting_panel.blockAutoRemove_title" v-model="ACConfig.isBlockDisplay" id="sp-ac-removeBlock" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.blockAutoRemove_text }}
                        </label>
                        <label :title="lan.use.fieldset_panel.setting_panel.blockBtnShow_title">
                          <input :title="lan.use.fieldset_panel.setting_panel.blockBtnShow_title"  v-model="ACConfig.isBlockBtnNotDisplay" id="sp-ac-blockBtnDisplay" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.blockBtnShow_text }}
                        </label>
                      </li>
                      <li>
                        <label :title="lan.use.fieldset_panel.setting_panel.userStyle_text">
                          <input id="sp-ac-style" name="sp-ac-a_force" type="checkbox" v-model="ACConfig.AdsStyleEnable">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_text }}
                        </label>
                      </li>
                      <li>
                        <!------------百度样式-------------->
                        <label class="container-label baidu">
                          <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_baidu_lable" @click="labelShowHideEnv"></label>
                          <label style="margin-left:20px"><input name="sp-ac-a_force_style_baidu" value="0" v-model="ACConfig.baidu.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_origin }}
                          </label>
                          <label>
                          <input  name='sp-ac-huyan_style_baidu' type='checkbox' v-model="ACConfig.baidu.HuYanMode">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_huyan }}
                          </label>
                          <label class=""><input name="sp-ac-a_force_style_baidulite" type="checkbox" v-model="ACConfig.Style_BaiduLite">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_baiduLite }}
                          </label>
                          <br>
                          <label style="margin-left:20px"><input name="sp-ac-a_force_style_baidu" value="1" v-model="ACConfig.baidu.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_1line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_baidu" value="2" type="radio" v-model="ACConfig.baidu.AdsStyleMode">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_1line_enter }}
                          </label>
                          <label><input name="sp-ac-a_force_style_baidu" value="3" type="radio" v-model="ACConfig.baidu.AdsStyleMode">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_2line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_baidu" value="4" type="radio" v-model="ACConfig.baidu.AdsStyleMode">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_3line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_baidu" value="5" type="radio" v-model="ACConfig.baidu.AdsStyleMode">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_4line }}
                          </label>
                          <br>
                          <label class="display-block" style="margin: 3px 0 3px 25px;">
                            {{ lan.use.fieldset_panel.setting_panel.backgroundImage_text }}
                            <input :placeholder="lan.use.fieldset_panel.setting_panel.backgroundImage_text_hint" :title="lan.use.fieldset_panel.setting_panel.backgroundImage_text_hint" id="sp-ac-backgroundImage" name="sp-ac-a_force_style_bgImg" v-model="ACConfig.baidu.defaultBgUrl" style="width:55%;margin-top:-0.3em;" type="input">
                            <label :title="lan.use.fieldset_panel.setting_panel.backgroundImageAutoFit_text_hint">
                              <input type="checkbox" name="sp-ac-a_autoFitSStyle" v-model="ACConfig.baidu.BgFit" :disabled="!ACConfig.baidu.defaultBgUrl || !ACConfig.AdsStyleEnable">
                              {{ lan.use.fieldset_panel.setting_panel.backgroundImageAutoFit_text }}
                            </label>
                          </label>
                        </label>
                        <!------------百度样式-------------->
                        <div style="height: 1px;width:267px;margin-left:25px;background-color:#d8d8d8;margin-top:1px;"></div>
                        <!------------谷歌样式-------------->
                        <label class="container-label google">
                          <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_google_lable" @click="labelShowHideEnv"></label>
                          <label style="margin-left:20px">
                          <input name="sp-ac-a_force_style_google" value="0" type="radio" v-model="ACConfig.google.AdsStyleMode">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_google_origin }}
                          </label>
                          <label :title="lan.use.fieldset_panel.setting_panel.userStyle_google_huyan"><input name="sp-ac-huyan_style_google" v-model="ACConfig.google.HuYanMode" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_google_huyan }}
                          </label>
                          <label :title="lan.use.fieldset_panel.setting_panel.userStyle_google_googleLite" style=""><input name="sp-ac-google_in_baidumode" v-model="ACConfig.isGooleInBaiduModeEnable" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_google_googleLite }}
                          </label>
                          <br>
                          <label style="margin-left:20px"><input name="sp-ac-a_force_style_google" value="1" v-model="ACConfig.google.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_google_1line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_google" value="2" v-model="ACConfig.google.AdsStyleMode" type="radio" checked="">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_google_1line_enter }}
                          </label>
                          <label><input name="sp-ac-a_force_style_google" value="3" v-model="ACConfig.google.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_google_2line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_google" value="4" v-model="ACConfig.google.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_google_3line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_google" value="5" v-model="ACConfig.google.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_google_4line }}
                          </label>
                          <br>
                          <label class="display-block" style="margin: 3px 0 3px 25px;">
                            {{ lan.use.fieldset_panel.setting_panel.backgroundImage_text }}
                            <input :placeholder="lan.use.fieldset_panel.setting_panel.backgroundImage_text_hint" id="sp-ac-backgroundImage" name="sp-ac-a_force_style_bgImg" v-model="ACConfig.google.defaultBgUrl" style="width:55%;margin-top:-0.3em;" type="input">
                            <label :title="lan.use.fieldset_panel.setting_panel.backgroundImageAutoFit_text_hint">
                              <input type="checkbox" name="sp-ac-a_autoFitSStyle" v-model="ACConfig.google.BgFit" :disabled="!ACConfig.google.defaultBgUrl || !ACConfig.AdsStyleEnable">
                              {{ lan.use.fieldset_panel.setting_panel.backgroundImageAutoFit_text }}
                            </label>
                          </label>
                        </label>
                        <!------------谷歌样式-------------->
                        <div style="height: 1px;width:267px;margin-left:25px;background-color:#d8d8d8;margin-top:1px;"></div>
                        <!------------必应样式-------------->
                        <label class="container-label bing">
                          <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_bing_lable" @click="labelShowHideEnv"></label>
                          <label style="margin-left:20px"><input name="sp-ac-a_force_style_bing" v-model="ACConfig.bing.AdsStyleMode" value="0" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_origin }}
                          </label>
                          <label :title="lan.use.fieldset_panel.setting_panel.userStyle_bing_huyan"><input name="sp-ac-huyan_style_bing" v-model="ACConfig.bing.HuYanMode" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_huyan }}
                          </label>
                          <br>
                          <label style="margin-left:20px"><input name="sp-ac-a_force_style_bing" v-model="ACConfig.bing.AdsStyleMode" value="1" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_1line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_bing" value="2" v-model="ACConfig.bing.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_1line_enter }}
                          </label>
                          <label><input name="sp-ac-a_force_style_bing" value="3" v-model="ACConfig.bing.AdsStyleMode" type="radio" checked="">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_2line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_bing" value="4" v-model="ACConfig.bing.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_3line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_bing" value="5" v-model="ACConfig.bing.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_4line }}
                          </label>
                          <br>
                          <label class="display-block" style="margin: 3px 0 3px 25px;">
                            {{ lan.use.fieldset_panel.setting_panel.backgroundImage_text }}
                            <input :placeholder="lan.use.fieldset_panel.setting_panel.backgroundImage_text_hint" id="sp-ac-backgroundImage" name="sp-ac-a_force_style_bgImg" v-model="ACConfig.bing.defaultBgUrl" style="width:55%;margin-top:-0.3em;" type="input">
                            <label :title="lan.use.fieldset_panel.setting_panel.backgroundImageAutoFit_text_hint">
                              <input type="checkbox" name="sp-ac-a_autoFitSStyle" v-model="ACConfig.bing.BgFit" :disabled="!ACConfig.bing.defaultBgUrl || !ACConfig.AdsStyleEnable">
                              {{ lan.use.fieldset_panel.setting_panel.backgroundImageAutoFit_text }}
                            </label>
                          </label>
                        </label>
                        <!------------必应样式-------------->
<!--                        <div style="height: 1px;width:267px;margin-left:25px;background-color:#d8d8d8;margin-top:1px;"></div>-->
<!--                        &lt;!&ndash;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;搜狗样式&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&ndash;&gt;-->
<!--                        <label class="container-label sogou">-->
<!--                          <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_sogou_lable" @click="labelShowHideEnv"></label>-->
<!--                          <label style="margin-left:20px"><input name="sp-ac-a_force_style_sogou" v-model="ACConfig.sogou.AdsStyleMode" value="0" type="radio">-->
<!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_origin }}-->
<!--                          </label>-->
<!--                          <label :title="lan.use.fieldset_panel.setting_panel.userStyle_sogou_huyan"><input name="sp-ac-huyan_style_sogou" v-model="ACConfig.sogou.HuYanMode" type="checkbox">-->
<!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_huyan }}-->
<!--                          </label>-->
<!--                          <br>-->
<!--                          <label style="margin-left:20px">-->
<!--                          <input name="sp-ac-a_force_style_sogou" value="1" v-model="ACConfig.sogou.AdsStyleMode" type="radio">-->
<!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_1line }}-->
<!--                          </label>-->
<!--                          <label><input name="sp-ac-a_force_style_sogou" value="2" v-model="ACConfig.sogou.AdsStyleMode" type="radio">-->
<!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_1line_enter }}-->
<!--                          </label>-->
<!--                          <label><input name="sp-ac-a_force_style_sogou" value="3" v-model="ACConfig.sogou.AdsStyleMode" type="radio" checked="">-->
<!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_2line }}-->
<!--                          </label>-->
<!--                          <label><input name="sp-ac-a_force_style_sogou" value="4" v-model="ACConfig.sogou.AdsStyleMode" type="radio">-->
<!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_3line }}-->
<!--                          </label>-->
<!--                          <label><input name="sp-ac-a_force_style_sogou" value="5" v-model="ACConfig.sogou.AdsStyleMode" type="radio">-->
<!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_4line }}-->
<!--                          </label>-->
<!--                        </label>-->
<!--                        &lt;!&ndash;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;搜狗样式&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&ndash;&gt;-->
                        <div style="height: 1px;width:267px;margin-left:25px;background-color:#d8d8d8;margin-top:1px;"></div>
                        <!------------鸭鸭搜样式-------------->
                        <label class="container-label duck">
                          <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_duck_lable" @click="labelShowHideEnv"></label>
                          <label style="margin-left:20px"><input name="sp-ac-a_force_style_duck" v-model="ACConfig.duck.AdsStyleMode" value="0" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_origin }}
                          </label>
                          <label :title="lan.use.fieldset_panel.setting_panel.userStyle_duck_huyan"><input name="sp-ac-huyan_style_duck" v-model="ACConfig.duck.HuYanMode" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_huyan }}
                          </label>
                           <label :title="lan.use.fieldset_panel.setting_panel.userStyle_duck_normal" style=""><input v-model="ACConfig.normalizeDuck" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_normal }}
                          </label>
                          <br>
                          <label style="margin-left:20px">
                          <input name="sp-ac-a_force_style_duck" value="1" v-model="ACConfig.duck.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_1line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_duck" value="2" v-model="ACConfig.duck.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_1line_enter }}
                          </label>
                          <label><input name="sp-ac-a_force_style_duck" value="3" v-model="ACConfig.duck.AdsStyleMode" type="radio" checked="">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_2line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_duck" value="4" v-model="ACConfig.duck.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_3line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_duck" value="5" v-model="ACConfig.duck.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_4line }}
                          </label>
                          <br>
                        </label>
                        <!------------鸭鸭搜样式-------------->
                        <div style="height: 1px;width:267px;margin-left:25px;background-color:#d8d8d8;margin-top:1px;"></div>
                        <!------------多吉样式-------------->
                        <label class="container-label doge">
                          <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_doge_lable" @click="labelShowHideEnv"></label>
                          <label style="margin-left:20px"><input name="sp-ac-a_force_style_doge" v-model="ACConfig.doge.AdsStyleMode" value="0" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_origin }}
                          </label>
                          <label :title="lan.use.fieldset_panel.setting_panel.userStyle_doge_huyan"><input name="sp-ac-huyan_style_doge" v-model="ACConfig.doge.HuYanMode" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_huyan }}
                          </label>
                           <label :title="lan.use.fieldset_panel.setting_panel.userStyle_doge_normal" style=""><input v-model="ACConfig.normalizeDoge" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_normal }}
                          </label>
                          <br>
                          <label style="margin-left:20px">
                          <input name="sp-ac-a_force_style_doge" value="1" v-model="ACConfig.doge.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_1line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_doge" value="2" v-model="ACConfig.doge.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_1line_enter }}
                          </label>
                          <label><input name="sp-ac-a_force_style_doge" value="3" v-model="ACConfig.doge.AdsStyleMode" type="radio" checked="">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_2line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_doge" value="4" v-model="ACConfig.doge.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_3line }}
                          </label>
                          <label><input name="sp-ac-a_force_style_doge" value="5" v-model="ACConfig.doge.AdsStyleMode" type="radio">
                          {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_4line }}
                          </label>
                          <br>
                        </label>
                      <!------------多吉样式-------------->
                      </li>
                      <!------------护眼模式设置-------------->
                      <li>
                        <label :title="lan.use.fieldset_panel.setting_panel.huyanMode_title">
                          <input id="sp-ac-usercolor" v-model="ACConfig.isUserColorEnable" name="sp-ac-a_force" type="checkbox" checked="">
                          {{ lan.use.fieldset_panel.setting_panel.huyanMode_text }}
                        </label>
                      </li>
                      <li>
                        <label class="menu-box-container" :title="lan.use.fieldset_panel.setting_panel.huyanMode_title">
                          <label style="margin-left:20px;" v-text="lan.use.fieldset_panel.setting_panel.huyanColor_text"></label>
                          <input class="sp-ac-menuhuyanColor" @input.stop="useThisHuyanColor" v-model="ACConfig.defaultHuYanColor" type="color" :title="lan.use.fieldset_panel.setting_panel.huyanColor_title" style="cursor: pointer;margin-top:-0.05rem;height:23px;">
                          <label class="menu-box-small" data-value="#DEF1EF" @click.stop="useThisHuyanColor" style="background-color:#DEF1EF;">&nbsp;&nbsp;&nbsp;&nbsp;</label>
                          <label class="menu-box-small" data-value="#F3F2EE" @click.stop="useThisHuyanColor" style="background-color:#F3F2EE;">&nbsp;&nbsp;&nbsp;&nbsp;</label>
                          <label class="menu-box-small" data-value="#E5E5E5" @click.stop="useThisHuyanColor" style="background-color:#E5E5E5;">&nbsp;&nbsp;&nbsp;&nbsp;</label>
                          <label class="linkhref" data-href="https://www.ntaow.com/colorpicker.html" style="cursor:pointer;margin-right: 10px;" onclick="window.open(this.dataset.href)" v-text="lan.use.fieldset_panel.setting_panel.huyanColorMore_text"></label>
                        </label>
                      </li>
                      <!------------Favicon图标设置-------------->
                      <li>
                        <label>
                          <input :title="lan.use.fieldset_panel.setting_panel.favicon_title" v-model="ACConfig.isFaviconEnable" id="sp-ac-favicon" name="sp-ac-a_force" type="checkbox" checked="">
                          {{ lan.use.fieldset_panel.setting_panel.favicon_text }}
                        </label>
                      </li>
                      <li>
                        <label>
                          <label style="margin-left:20px;" v-text="lan.use.fieldset_panel.setting_panel.favicon_defaultIcon_text"></label>
                          <input id="sp-ac-faviconUrl" name="sp-ac-a_force" v-model="ACConfig.defaultFaviconUrl" value="https://ae01.alicdn.com/kf/HTB1dRY0X8OD3KVjSZFFq6An9pXay.jpg" style="width:55%;margin-top:-0.3em;" type="input">
                        </label>
                      </li>
                      <!------------移除百度搜索预测-------------->
                      <li>
                        <label>
                          <input :title="lan.use.fieldset_panel.setting_panel.searchOrigin_title" v-model="ACConfig.doDisableSug" id="sp-ac-sug_origin" name="sp-ac-a_force" type="checkbox" checked="">
                          {{ lan.use.fieldset_panel.setting_panel.searchOrigin_text }}
                        </label>
                      </li>
                      <!------------附加7、8、9-------------->
                      <li>
                        <label>
                          <input id="sp-ac-right" v-model="ACConfig.isRightDisplayEnable" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.showRight_text }}
                        </label>
                        <label>
                          <input id="sp-ac-counter" v-model="ACConfig.isCounterEnable" name="sp-ac-a_force" type="checkbox">
                          <span :title="lan.use.fieldset_panel.setting_panel.hintShowCounter_text">{{ lan.use.fieldset_panel.setting_panel.showCounter_text }}</span>
                        </label>
                        <label>
                          <input id="sp-ac-aline" v-model="ACConfig.isALineEnable" name="sp-ac-a_force" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.showALine_text }}
                        </label>
                      </li>
                      <!------------自定义样式内容-------------->
                      <li>
                        <label>
                          <input id="sp-ac-userstyle" v-model="ACConfig.isUserStyleEnable" name="sp-ac-a_force" type="checkbox">
                          {{ lan.use.fieldset_panel.setting_panel.showUserStyle_text }}
                        </label>
                        <label v-if="LiveConfig.css_has_error" style="color: red; font-weight: bold;">error</label>
                        <span class="sp-ac-spanbutton" @click="resetCSS" title="Reset CSS" v-text="resetCSS_text"></span>
                      </li>
                      <li>
                        <textarea id="sp-ac-userstyleTEXT" v-model="ACConfig.UserStyleText" @keyup="loadCustomStyle" @change="loadCustomStyle" @paste="loadCustomStyle" name="sp-ac-a_force" style="width:85%;height: 66px;margin-left:30px;" type="input" ></textarea>
                      </li>
                      <li>
                        <a class="linkhref" target="_blank" :href="lan.use.fieldset_panel.setting_panel.contactMe_url" v-text="lan.use.fieldset_panel.setting_panel.contactMe_text"></a>
                      </li>
                    </ul>
                    <!------------拦截域名设置panel-------------->
                    <ul class="setting-second" v-show="other.curTab === 2">
                      <li style='margin-bottom: 8px !important;'>
                        <label>
                          <span id='sp-ac-blockdiybutton-back' @click="other.curTab=1,other.showBlockListArea = false" class='sp-ac-spanbutton'>{{ lan.use.fieldset_panel.setting_panel.setting_panel_second.backBtn_text }}</span>
                        </label>
                        {{ lan.use.fieldset_panel.setting_panel.setting_panel_second.blockLabel_text }}}
                      </li>
                      <li style='margin-bottom: 8px !important;'>
                        <span id='sp-ac-blockdiybutton-diylist' class='sp-ac-spanbutton' @click="other.showBlockListArea = !other.showBlockListArea" v-text="cal_diyBlockListBtn"></span>
                      </li>
                      <li class='ac-blockList' @click="removeABlockListItem" style='max-height:60vh;overflow-y: scroll;'>
                        <ul v-show="!other.showBlockListArea" v-html="getBlockList"></ul>
                      </li>
                      <li class='ac-blockBoxCon' style='max-height: 60vh;text-align: center;margin-left: 26px;'>
                        <textarea v-show="other.showBlockListArea"  @keyup="syncToBlockList" @change="syncToBlockList" @paste="syncToBlockList" rows="20" v-text="ACConfig.UserBlockList.join('\\n')"></textarea>
                      </li>
                      <li>
                        {{ lan.use.fieldset_panel.setting_panel.setting_panel_second.addBlockLabel_text }}<input class="sp-ac-addRuleOne" @keyup.enter="ckAddRule" v-model="other.addBlockItem" style='width:55%;'>
                        <span id='sp-ac-addRulebutton' class='sp-ac-spanbutton endbutton' @click="ckAddRule" style='position: relative !important;line-height: 17px;' v-text="lan.use.fieldset_panel.setting_panel.setting_panel_second.addBtnLabel_text">新增</span>
                      </li>
                    </ul>
                    <ul v-show="other.curTab === 3" style="width: 300px">
                      <li>
                        <div class="dialog-body">
                          <label>
                            <span id='sp-ac-blockdiybutton-back' @click="other.curTab=1" class='sp-ac-spanbutton'>返回</span>
                          </label>
                          <div>
                            <div>使用说明:</div>
                            <div>-</div>
                            <p>1. 本脚本不包含任何广告内容,也无意于破坏网站现有功能的完整性,仅希望通过一些显示效果的变更能更好的留存对应网站现有的用户,一定程度上更好地保证了目标网站的日活。</p>
                            <p>
                              2. 同时本脚本中所有功能均为学习和研究web前端技术的发展而开发,希望为学习前端技术的研究人员提供一个更好的参考代码,促进web前端技术的发展,便于技术的学习和交流,仅用于学习研究使用,无意于损害任何网站利益,不使用任何盈利方案或参与任何盈利组织。
                            </p>
                            <p>
                              3. 因使用本脚本引起的或与本脚本有关的任何争议,各方应友好协商解决,本脚本对使用本脚本所提供的软件时可能对用户自己或他人造成的任何形式的损失和伤害不承担任何责任。如用户下载、安装和使用本产品中所提供的软件,即表明用户信任本作者及其相关协议和免责声明。
                            </p>
                          </div>
                        </div>
                      </li>
                    </ul>
                    <!------------保存、取消按钮-------------->
                    <span id="sp-ac-cancelbutton" class="sp-ac-spanbutton endbutton" @click="closePanel" :title="lan.use.fieldset_panel.setting_panel.cancelBtn_text" style="position: relative;float: left;" v-text="lan.use.fieldset_panel.setting_panel.cancelBtn_text"></span>
                    <span id="sp-ac-savebutton" ref="bottomSaveButton" @click="saveConfig" class="sp-ac-spanbutton endbutton" :title="lan.use.fieldset_panel.setting_panel.okBtn_text" style="position: relative;float: right;" v-text="lan.use.fieldset_panel.setting_panel.okBtn_text"></span>
                  </fieldset>
                </div>
              </div>`;
                        try {
                            document.body.appendChild(Container);
                        } catch (e) {
                            console.log(e);
                        }
                    }
                    try {
                        document.querySelector("body #sp-ac-container").addEventListener('click', function(e) {
                            e.stopPropagation(); // 阻止点击自身的时候关闭
                        }, false);
                        document.querySelector("body").addEventListener('click', function(e) {
                            safeFunction(() => {
                                document.querySelector("#sp-ac-content").style.display = 'none';
                            })
                        }, false);
                    } catch (e) {}

                }

                function isElementVisible(dom) {
                    const scrTop = document.documentElement.scrollTop || document.body.scrollTop;
                    return !(scrTop > (dom.offsetTop + dom.offsetHeight) || (scrTop + window.innerHeight) < dom
                        .offsetTop);
                }

                function removeMobileBaiduDirectLink() {
                    let nodes = document.querySelectorAll(
                        "#page #page-bd #results .result:not([ac_redirectStatus])");
                    for (let i = 0; i < nodes.length; i++) {
                        let curNode = nodes[i];
                        safeFunction(function() {
                            let curData = JSON.parse(curNode.dataset.log.replace(/'/gm, "\""));
                            let trueLink = curData.mu;
                            curNode.querySelector("article").setAttribute("rl-link-href", trueLink);
                            curNode.querySelectorAll("a").forEach(function(per) {
                                per.setAttribute("href", trueLink);
                            });
                        });
                        curNode.setAttribute("ac_redirectStatus", "1");
                    }
                }

                function removeOnMouseDownFunc() {
                    try {
                        let resultNodes = document.querySelectorAll(".g .rc a, #rs, #rso .g a");
                        for (let i = 0; i < resultNodes.length; i++) {
                            let one = resultNodes[i];
                            one.setAttribute("onmousedown", ""); // 谷歌去重定向干扰
                            one.setAttribute("target", "_blank"); // 谷歌链接新标签打开
                            one.setAttribute("data-jsarwt", "0"); // Firefox谷歌去重定向干扰
                        }
                    } catch (e) {
                        console.log(e);
                    }
                }

                function removeRedirectLinkTarget() {
                    if (curSite.SiteTypeID === SiteType.ZHIHU) {
                        let nodes = document.querySelectorAll(".RichText a[href*='//link.zhihu.com/?target']");
                        for (let i = 0; i < nodes.length; i++) {
                            let url = decodeURIComponent(nodes[i].href.replace(
                                /https?:\/\/link\.zhihu\.com\/\?target=/, ""));
                            nodes[i].href = url;
                        }
                    } else if (curSite.SiteTypeID === SiteType.BAIDU_XUESHU) {
                        let xnodes = document.querySelectorAll("a[href*='sc_vurl=http']");
                        for (let j = 0; i < xnodes.length; j++) {
                            let xurl = getUrlAttribute(xnodes[j].href, "sc_vurl", true);
                            xnodes[j].href = xurl;
                        }
                    }
                }

                // 提取url元素的参数值
                function getUrlAttribute(url, attribute, needDecode) {
                    let searchValueS = (url.substr(1) + "").split("&");
                    for (let i = 0; i < searchValueS.length; i++) {
                        let key_value = searchValueS[i].split("=");
                        let reg = new RegExp("^" + attribute + "$");
                        if (reg.test(key_value[0])) {
                            let searchWords = key_value[1];
                            return needDecode ? decodeURIComponent(searchWords) : searchWords;
                        }
                    }
                }

                function resetURLNormal() {
                    const mainList = document.querySelectorAll(curSite.MainType)

                    // 注意有重复的地址,尽量对重复地址进行去重
                    var hasDealHrefSet = new Set();
                    for (var i = 0; i < mainList.length; i++) {
                        // 此方法是异步,故在结束的时候使用i会出问题-严重!
                        // 采用闭包的方法来进行数据的传递
                        const curNode = mainList[i];

                        if (curNode !== null && curNode.getAttribute("ac_redirectStatus") === null) {
                            curNode.setAttribute("ac_redirectStatus", "0");

                            const linkNode = curNode.querySelector(curSite.Stype_Normal);
                            if (linkNode === null) {
                                continue
                            }

                            // 跳过特殊链接的处理
                            if (linkNode.href && (linkNode.href.startsWith('javascript') || linkNode.href
                                    .startsWith('#'))) {
                                continue
                            }

                            let linkHref = linkNode.href;
                            let len1 = hasDealHrefSet.size;
                            hasDealHrefSet.add(linkHref);
                            let len2 = hasDealHrefSet.size;
                            if (len1 === len2) continue; // 说明数据已经处理过,存在相同的记录
                            const dealAttrLink = () => {
                                // 如果当前节点存在mu参数,或者link节点存在data-mdurl,那么就算成功
                                let trueLink = curNode.getAttribute('mu') || linkNode.getAttribute(
                                    'data-mdurl')
                                if (trueLink && !trueLink.includes('nourl')) {
                                    trueLink = getBaiduEncodingHandle(trueLink)
                                    DealRedirect(null, linkHref, trueLink);
                                    return true
                                }
                            }
                            const getBaiduEncodingHandle = (linkUrl) => {
                                let resLink = linkUrl
                                if (curSite.SiteTypeID === SiteType.BAIDU && linkUrl.includes(
                                        'baidu.com')) {
                                    const [, first = ''] = /(ie=[^&]+)/.exec(location.search) || []
                                    resLink = linkUrl.replace(/(ie=[^&]+)/, first)
                                }
                                return resLink
                            }
                            if (dealAttrLink()) {
                                continue
                            }
                            // 走接口重定向处理
                            if (linkHref.includes("www.baidu.com/link") ||
                                linkHref.includes("m.baidu.com/from") ||
                                linkHref.includes("www.sogou.com/link") ||
                                linkHref.includes("so.com/link")) {
                                (function(c_curnode, c_curhref) {
                                    let url = c_curhref.replace(/^http:/, "https:");
                                    if (curSite.SiteTypeID === SiteType.BAIDU && !url.includes("eqid")) {
                                        // 如果是百度,并且没有带有解析参数,那么手动带上
                                        url = url + "&wd=&eqid=";
                                    }
                                    let gmRequestNode = GM_xmlhttpRequest({
                                        // from: "acxhr",
                                        extData: c_curhref, // 用于扩展
                                        url: url,
                                        headers: {
                                            "Accept": "*/*",
                                            "Referer": c_curhref.replace(/^http:/, "https:")
                                        },
                                        method: "GET",
                                        timeout: 8000,
                                        onreadystatechange: function(
                                            response) { // MARK 有时候这个函数根本不进来 - 调试的问题 - timeout
                                            if (response.responseText || response
                                                .responseHeaders) {
                                                // 由于是特殊返回-并且好搜-搜狗-百度都是这个格式,故提出
                                                DealRedirect(gmRequestNode, c_curhref, response
                                                    .responseText, "URL='([^']+)'")
                                                // 这个是在上面无法处理的情况下,备用的 tm-finalurldhdg  tm-finalurlmfdh

                                                if (response.responseHeaders.includes(
                                                        "tm-finalurl")) {
                                                    let relURL = Reg_Get(response
                                                        .responseHeaders,
                                                        "tm-finalurl\\w+: ([^\\s]+)");
                                                    if (relURL === null || relURL === "" ||
                                                        relURL.includes(
                                                            "www.baidu.com/search/error"))
                                                        return;
                                                    DealRedirect(gmRequestNode, c_curhref,
                                                        relURL);
                                                }
                                            }
                                        }
                                    });
                                })(curNode, linkHref); //传递旧的网址过去,读作c_curhref
                            }
                            // curNode.addEventListener("mouseover", ()=> {
                            //   const ABKey = RedirectMap.get(curNode.href); // 原始 -> 之后的链接
                            //   if(ABKey) curNode.href = ABKey;
                            // })
                            // curNode.addEventListener("mouseout", ()=> {
                            //   const BAKey = RedirectMap.get(curNode.href); // 之后的连接 -> 原始
                            //   if(BAKey) curNode.href = BAKey;
                            // })
                        }
                    }
                    if (hasDealHrefSet.size > 0 && mainList.length - hasDealHrefSet.size > 0) console.log("丢弃掉",
                        mainList.length - hasDealHrefSet.size, "个重复链接");
                }

                function DealRedirect(request, curNodeHref, respText, RegText) {
                    if (respText === null || typeof(respText) === "undefined") return;
                    let resultResponseUrl = "";
                    if (RegText != null) {
                        resultResponseUrl = Reg_Get(respText, RegText);
                    } else {
                        resultResponseUrl = respText;
                    }
                    if (resultResponseUrl !== null && resultResponseUrl !== "" && !resultResponseUrl.includes(
                            "www.baidu.com/link")) {
                        try {
                            if (curSite.SiteTypeID === SiteType.SOGOU) curNodeHref = curNodeHref.replace(
                                /^https:\/\/www.sogou.com/, "");
                            let host = getTextHost(resultResponseUrl);
                            // RedirectMap.set(curNodeHref, resultResponseUrl); // 进行一个数据关联
                            // RedirectMap.set(resultResponseUrl, curNodeHref); // 进行一个数据关联
                            document.querySelectorAll("*[href*='" + curNodeHref + "']").forEach(per => {
                                let changeNode = per;

                                changeNode.setAttribute("ac_redirectStatus", "2");
                                changeNode.href = resultResponseUrl;
                                // changeNode.setAttribute("data-orihref", changeNode.href);
                                if (changeNode.hasAttribute("meta")) {
                                    changeNode.setAttribute("meta", host);
                                    changeNode.dataset.host = host;
                                }
                                debug('changeNode.text', changeNode.text, changeNode.text == '')
                                if (changeNode.text && changeNode.text.length < 10 && !changeNode.text
                                    .includes(host)
                                    // 不能是redirect url 不能是h2\h3下直属链接
                                    &&
                                    !changeNode.parentElement.tagName.toLowerCase().includes("h") &&
                                    changeNode.text != '') {
                                    // 显示完整链接
                                    changeNode.insertAdjacentHTML("beforeEnd", "&nbsp;-&nbsp;" +
                                        resultResponseUrl);
                                }
                            })

                            otherData.other.curHosts.acpush(host + "###" + resultResponseUrl);
                            request && request.abort();
                        } catch (e) {
                            // console.log(e);
                        }
                    }
                }

                function removeAD_baidu_sogou() { // 移除网站自有广告
                    if (curSite.SiteTypeID === SiteType.BAIDU || curSite.SiteTypeID === SiteType.MBAIDU) {
                        /****移除PC模式上的部分广告****/
                        // 移除shadowDOM广告;搜索关键字:淘宝;然后点击搜索框,广告会多次重现shadowdom
                        safeFunction(function() {
                            $('.c-container >>> .c-container').has('.f13>span:starts-with("广告")')
                                .remove();
                        });

                        // 移除右侧栏广告
                        safeRemove_xpath("id('content_right')/div[.//a[starts-with(text(), '广告')]]");
                        // 移除标准广告
                        safeRemove_xpath(
                            "id('content_left')/div[.//span[contains(@class, 'tuiguang') or contains(@class, 'brand')][contains(text(), '广告')]]"
                        );
                        // 移除标准广告 - 新
                        safeRemove_xpath("id('content_left')/div[.//a[text()='广告']]");
                        // 移除右侧栏顶部-底部无用广告
                        safeRemove_xpath("id('content_right')/br");
                        safeRemove_xpath("id('content_right')/div[not(@id)]");
                        // 移除顶部可能出现的 "为您推荐"
                        safeRemove_xpath("id('content_left')//div[contains(@class, '_rs')]");

                        /****移除Mobile模式上的部分广告****/
                        safeRemove_xpath("id('page-bd')/div[not(contains(@class, 'result'))]");
                        safeRemove_xpath("id('page-bd')/div[not(@class)]");
                        safeRemove_xpath("//div[@class='na-like-container']");
                        // safeFunction(function () {
                        //   $('#page-bd #results>div:not([class*="result"])').remove();
                        // });
                        // safeFunction(function () {
                        //   $('#page-bd #results>div:not([class])').remove();
                        // });
                    } else if (curSite.SiteTypeID === SiteType.SO) {
                        safeRemoveAd("#so_kw-ad");
                        safeRemoveAd("#m-spread-left");
                        // 移除搜索中底部广告
                        safeRemoveAd("#m-spread-bottom");
                        // 移除右侧栏顶部广告
                        safeRemove_xpath("id('righttop_box')//li[.//span[contains(text(), '广告')]]");
                    } else if (curSite.SiteTypeID === SiteType.BING) {
                        safeRemoveAd(".b_ad");
                        safeRemove_xpath("id('b_results')/li[./div[@class='ad_fls']]");


                        // 移除特殊tag,带url标记的广告类
                        const resList = [...document.querySelectorAll("ol>li")].filter(one => one.querySelector(
                            'p')) // 定位到所有包含p标签的li
                        const adList = resList.filter(one => window.getComputedStyle(one.querySelector('p'),
                            '::before').getPropertyValue('content').includes(
                            'url')) // 检查每一个p标签,里面存在before伪元素,且伪元素中是链接的,均为广告
                        safeRemoveAd(adList);

                    } else if (curSite.SiteTypeID === SiteType.GOOGLE) {
                        safeRemoveAd("#bottomads");
                        safeRemoveAd('div[aria-label="广告"]');
                        safeRemoveAd('div[aria-label="Ads"]');
                    }
                }

                function addCounter(citeList) {
                    let cssText =
                        "font-style:normal;position:relative;z-index:1;margin-right:4px;display:inline-block;color:white;font-family:'微软雅黑';font-size:16px;text-align:center;width:22px;line-height:22px;border-radius:50%;";
                    let div = document.createElement('div');
                    for (let i = 0; i < citeList.length; i++) {
                        let cur = citeList[i]
                        const index = cur.getAttribute('SortIndex');
                        if (index === null || typeof(index) === "undefined") {
                            cur.setAttribute('SortIndex', CONST.sortIndex);
                            cur.inner = cur.innerHTML;
                            div.innerHTML = "<em class='AC-CounterT' style=" + cssText + ">" + CONST.sortIndex +
                                "</em>";
                            cur.innerHTML = div.innerHTML + cur.inner;
                            CONST.sortIndex++;
                        } else {
                            const curCounter = cur.querySelector(".AC-CounterT")
                            const oriIndex = curCounter.innerText
                            const checkValue = (i + 1) % 100;
                            // 数据值不同
                            // 数据没有被翻译
                            if (+index !== checkValue && !/^\d+$/.test(oriIndex)) { // 按需更新
                                curCounter.innerText = checkValue;
                                cur.setAttribute('SortIndex', checkValue);
                            }
                        }
                    }
                }

                function getTextHost(sbefore) {
                    sbefore = (sbefore && sbefore.trim()).replace(/\s-\s\d{4}-\d{1,2}-\d{1,2}/, "") || "";
                    let send;
                    let result = sbefore.split('-');
                    // --搜狗百度专用;如果第一个是中文的话,地址就是第二个
                    if ((result.length > 1 && new RegExp("[\\u4E00-\\u9FFF]+", "g").test(sbefore)) && (curSite
                            .SiteTypeID === SiteType.BAIDU || curSite.SiteTypeID === SiteType.SOGOU)) {
                        sbefore = result[1];
                    }
                    // 此时sbefore几乎是等于网址了,但是有时候会有多的空格,多的内容,多的前缀http,多余的路径
                    let res = new RegExp(/(https?:\/\/)?([^/\s]+)/i).exec(sbefore);
                    send = (res && res[2].trim()) || "";
                    // send = sbefore.replace(/(\/[^/]*|\s*)/, "").replace(/<[^>]*>/g, "").replace(/https?:\/\//g, "").replace(/<\/?strong>/g, "").replace(/<\/?b>/g, "").replace(/<?>?/g, "").replace(/( |\/).*/g, "").replace(/\.\..*/, "");
                    if (send === "") return null;
                    if (send.indexOf(".") < 0) return null;
                    if (send.indexOf("↵") >= 0) return null;
                    return send.trim();
                }

                function addFavicon(citeList) {
                    const insertList = []
                    if (curSite.SiteTypeID !== SiteType.DOGE) {
                        for (let index = 0; index < citeList.length; index++) {
                            if (null === citeList[index].getAttribute("ac_faviconStatus")) {
                                let curNode = citeList[index];
                                let targetNode = curNode;
                                let {
                                    curHost,
                                    curUrl
                                } = getNodeHost(targetNode);
                                if (!curHost) { // 跳过解不出来的地址
                                    continue;
                                } else {
                                    otherData.other.curHosts.acpush(curHost + "###" + curUrl);
                                }
                                let faviconUrl = curHost;
                                let II = 0;
                                for (; II <= 5; II++) {
                                    targetNode = targetNode.parentNode;
                                    if (targetNode != null && targetNode.querySelector(curSite.FaviconAddTo) !=
                                        null) {
                                        break;
                                    }
                                }
                                if (targetNode.parentNode.hasAttribute('tpl') && targetNode.parentNode
                                    .getAttribute('tpl').includes('stock')) {
                                    curNode.setAttribute("ac_faviconStatus", "-3");
                                    continue
                                }
                                //console.log(index+"."+faviconUrl+"--"+II);
                                if (II <= 5) {
                                    // 先用父节点判断一下是否存在img
                                    let tmpHTML = targetNode.innerHTML;
                                    let pos = tmpHTML.indexOf("fav-url") &
                                        tmpHTML.indexOf("wr_fav") &
                                        tmpHTML.indexOf("favurl") &
                                        tmpHTML.indexOf("tit-ico") &
                                        tmpHTML.indexOf("img_fav rms_img") &
                                        tmpHTML.indexOf("c-tool-") &
                                        tmpHTML.indexOf("span class=\"c-icon c-icon-") &
                                        tmpHTML.indexOf("img class=\"xA33Gc");
                                    //他自己已经做了favicon了
                                    if (pos > -1) {
                                        // console.log("已有图片:");
                                        curNode.setAttribute("ac_faviconStatus", "-2");
                                        continue;
                                    }
                                    targetNode = targetNode.querySelector(curSite.FaviconAddTo);
                                    let host = faviconUrl.replace(/[^.]+\.([^.]+)\.([^.]+)/, "$1.$2");

                                    if (!targetNode.hasAttribute("data-favicon-t") && host.length >= 3) {
                                        let faviconUrl = curNode.href || host
                                        if (curSite.SiteTypeID === SiteType.BAIDU && faviconUrl.includes(
                                                "baidu.com/link")) {
                                            faviconUrl = host
                                        }

                                        targetNode.setAttribute('data-favicon-t', faviconUrl)
                                        insertList.push({
                                            tagName: targetNode.tagName.toLowerCase(),
                                            url: faviconUrl
                                        })
                                    }
                                }
                            }
                        }
                    } else {
                        var checkNodes = document.querySelectorAll("#links_wrapper #links .nrn-react-div");
                        for (let faNode of checkNodes) {
                            let faviconNode = faNode.querySelector(".result__icon img");
                            let beforeNode = faNode.querySelector(".result__title a");
                            if (faviconNode && beforeNode) {
                                faviconNode.style = "vertical-align:middle;margin-right:5px;";
                                beforeNode.parentNode.insertBefore(faviconNode, beforeNode);
                            }
                        }
                    }
                    if (insertList.length) {
                        insertList.map(one => {
                            if (vueVM) {
                                vueVM.$set(vueVM.other.faviconListMap, one.url,
                                    one) // 之后的更新用这个 - 用于触发watch
                            } else {
                                // 此时还没有vueVM
                                otherData.other.faviconListMap[one.url] = one // 初始化的更新用这个
                            }
                        })
                    }
                }

                async function InsertSettingMenuCSS() {
                    /*"自定义"按钮效果*/
                    CONST.flushNode.insert(await create_CSS_Node(
                        ".achide{display:none;} .newFuncHighLight{color:red;font-weight: 100;background-color: yellow;font-weight: 600;}#sp-ac-container label{display:inline;}#u{width:319px}#u #myuser{display:inline-block;margin: 13px -10px 0 24px;}.site-wrapper #myuser,.sogou-set-box #myuser,#gbw #myuser{margin-right:15px;} #myuser,#myuser .myuserconfig{padding:0;margin:0}#myuser{display:inline-block;}#myuser .myuserconfig{display:inline-block;line-height:1.5;background:#4e6ef2;color:#fff;font-weight:700;text-align:center;padding:6px;border:2px solid #E5E5E5;}#myuser .myuserconfig{box-shadow:0 0 10px 3px rgba(0,0,0,.1);border-radius: 6px}#myuser .myuserconfig:hover{background:#4662d9 !important;color:#fff;cursor:pointer;border:2px solid #73A6F8;}body[doge] #header{max-width: unset;}body[doge] #myuser{position: absolute;right: 40px;}",
                        "AC-MENU_Btn"))
                    /*自定义页面内容效果*/
                    CONST.flushNode.insert(await create_CSS_Node(
                        'body[baidu] #sp-ac-container .container-label:not([class*="baidu"])>label:not([class="label_hide"]),\n' +
                        '  body[google] #sp-ac-container .container-label:not([class*="google"])>label:not([class="label_hide"]),\n' +
                        '  body[bing] #sp-ac-container .container-label:not([class*="bing"])>label:not([class="label_hide"]),\n' +
                        '  body[sogou] #sp-ac-container .container-label:not([class*="sogou"])>label:not([class="label_hide"]),\n' +
                        '  body[duck] #sp-ac-container .container-label:not([class*="duck"])>label:not([class="label_hide"]),\n' +
                        '  body[doge] #sp-ac-container .container-label:not([class*="doge"])>label:not([class="label_hide"]),\n' +
                        '  body[baidu] #sp-ac-container .container-label:not([class*="baidu"])>br,\n' +
                        '  body[google] #sp-ac-container .container-label:not([class*="google"])>br,\n' +
                        '  body[bing] #sp-ac-container .container-label:not([class*="bing"])>br,\n' +
                        '  body[duck] #sp-ac-container .container-label:not([class*="duck"])>br,\n' +
                        '  body[doge] #sp-ac-container .container-label:not([class*="doge"])>br,\n' +
                        '  body[sogou] #sp-ac-container .container-label:not([class*="sogou"])>br,\n' +
                        '  body[baidu] #sp-ac-container .container-label[class*="baidu"]>.label_hide,\n' +
                        '  body[google] #sp-ac-container .container-label[class*="google"]>.label_hide,\n' +
                        '  body[bing] #sp-ac-container .container-label[class*="bing"]>.label_hide,\n' +
                        '  body[sogou] #sp-ac-container .container-label[class*="sogou"]>.label_hide,\n' +
                        '  body[duck] #sp-ac-container .container-label[class*="duck"]>.label_hide,\n' +
                        '  body[doge] #sp-ac-container .container-label[class*="doge"]>.label_hide\n' +
                        // 注意尾部逗号
                        '{' +
                        'display:none;\n' +
                        '}#sp-ac-container .display-block{display:block;}#sp-ac-container .label_hide{cursor:pointer;margin-left:8%;color:blue}#sp-ac-container .linkhref,#sp-ac-container .label_hide:hover{color:red}#sp-ac-container .linkhref:hover{font-weight:bold}#sp-ac-container label.menu-box-small{max-width:16px;max-height:16px;cursor:pointer;display:inline-block}.AC-CounterT{background:#FD9999}body  #sp-ac-container{position:fixed;top:3.9vw;right:8.8vw}#sp-ac-container{z-index:999999;text-align:left;background-color:white}#sp-ac-container *{font-size:13px;color:black;float:none}#sp-ac-main-head{position:relative;top:0;left:0}#sp-ac-span-info{position:absolute;right:1px;top:0;font-size:10px;line-height:10px;background:none;font-style:italic;color:#5a5a5a;text-shadow:white 0px 1px 1px}#sp-ac-container input{vertical-align:middle;display:inline-block;outline:none;height:auto;padding:0px;margin-bottom:0px;margin-top:0px}#sp-ac-container input[type="number"]{width:50px;text-align:left}#sp-ac-container input[type="checkbox"]{border:1px solid #B4B4B4;padding:1px;margin:3px;width:13px;height:13px;background:none;cursor:pointer;visibility:visible;position:static}#sp-ac-container input[type="button"]{border:1px solid #ccc;cursor:pointer;background:none;width:auto;height:auto}#sp-ac-container li{list-style:none;margin:3px 0;border:none;float:none;cursor:default;}#sp-ac-container fieldset{border:2px groove #ccc;-moz-border-radius:3px;border-radius:3px;padding:4px 9px 6px 9px;margin:2px;display:block;width:auto;height:auto}#sp-ac-container legend{line-height:20px;margin-bottom:0px}#sp-ac-container fieldset > ul{padding:0;margin:0}#sp-ac-container ul#sp-ac-a_useiframe-extend{padding-left:40px}#sp-ac-rect{position:relative;top:0;left:0;float:right;height:10px;width:10px;padding:0;margin:0;-moz-border-radius:3px;border-radius:3px;border:1px solid white;-webkit-box-shadow:inset 0 5px 0 rgba(255,255,255,0.3),0 0 3px rgba(0,0,0,0.8);-moz-box-shadow:inset 0 5px 0 rgba(255,255,255,0.3),0 0 3px rgba(0,0,0,0.8);box-shadow:inset 0 5px 0 rgba(255,255,255,0.3),0 0 3px rgba(0,0,0,0.8);opacity:0.8}#sp-ac-dot,#sp-ac-cur-mode{position:absolute;z-index:9999;width:5px;height:5px;padding:0;-moz-border-radius:3px;border-radius:3px;border:1px solid white;opacity:1;-webkit-box-shadow:inset 0 -2px 1px rgba(0,0,0,0.3),inset 0 2px 1px rgba(255,255,255,0.3),0px 1px 2px rgba(0,0,0,0.9);-moz-box-shadow:inset 0 -2px 1px rgba(0,0,0,0.3),inset 0 2px 1px rgba(255,255,255,0.3),0px 1px 2px rgba(0,0,0,0.9);box-shadow:inset 0 -2px 1px rgba(0,0,0,0.3),inset 0 2px 1px rgba(255,255,255,0.3),0px 1px 2px rgba(0,0,0,0.9)}#sp-ac-dot{right:-3px;top:-3px}#sp-ac-cur-mode{left:-3px;top:-3px;width:6px;height:6px}#sp-ac-content{padding:0;margin:0px;-moz-border-radius:3px;border-radius:3px;border:1px solid #A0A0A0;-webkit-box-shadow:-2px 2px 5px rgba(0,0,0,0.3);-moz-box-shadow:-2px 2px 5px rgba(0,0,0,0.3);box-shadow:-2px 2px 5px rgba(0,0,0,0.3)}#sp-ac-main{padding:5px;border:1px solid white;-moz-border-radius:3px;border-radius:3px;background-color:#F2F2F7;background:-moz-linear-gradient(top,#FCFCFC,#F2F2F7 100%);background:-webkit-gradient(linear,0 0,0 100%,from(#FCFCFC),to(#F2F2F7))}#sp-ac-foot{position:relative;left:0;right:0;min-height:20px}#sp-ac-savebutton{position:absolute;top:0;right:2px}#sp-ac-container .endbutton{margin-top:8px}#sp-ac-container .sp-ac-spanbutton{user-select: none;border:1px solid #ccc;-moz-border-radius:3px;border-radius:3px;padding:2px 3px;cursor:pointer;background-color:#F9F9F9;-webkit-box-shadow:inset 0 10px 5px white;-moz-box-shadow:inset 0 10px 5px white;box-shadow:inset 0 10px 5px white}#sp-ac-container .sp-ac-spanbutton:hover{background-color:#DDD}label[class="newFunc"]{color:blue}',
                        "AC-MENU_Page"))
                }

                function InsertSettingMenu() {
                    if ((curSite.SiteTypeID !== SiteType.OTHERS) && document.querySelector("#myuser") ===
                        null) {
                        //baidu; google; bing; 搜狗
                        safeWaitFunc(
                            "#u, #gb>div>div>div, #b_header>#id_h, .top-bar .sogou-set-box, #header_wrapper .js-hl-button, body[doge] #header_wrapper #header",
                            parent => {
                                parent.style = "width: auto;";
                                let userAdiv = document.createElement("div");
                                userAdiv.id = "myuser";
                                userAdiv.innerHTML =
                                    `<input type='submit' class='myuserconfig' value='${ AllData.lan.use.menu_text }'/><span class='ac-newversionDisplay' style='background-color: red;float: left;height: 8px;width: 8px;border-radius: 4px;display:${ (CONST.hasNewFuncNeedDisplay ? "unset" : "none") }'>&nbsp;</span>`;
                                parent.insertBefore(userAdiv, parent.childNodes[0]);
                                document.querySelector("#myuser .myuserconfig").addEventListener("click",
                                    function(e) {
                                        return ACtoggleSettingDisplay(e);
                                    }, true);
                            }, 300)
                    }
                }
            }(); // 读取个人设置信息

            async function create_CSS_Node(css, className = '', initType = "text/css") {
                let cssNode = document.createElement("style");
                if (className) {
                    cssNode.className = className
                    const xclass = '.' + className.split(' ').join('.')
                    cssNode.dataset.xclass = xclass
                }

                // 针对less进行单独处理
                if (initType.includes('less')) {
                    // parseHTML 耗时 没必要
                    const {
                        css: renderCSS = ''
                    } = await less.render(css);
                    css = renderCSS
                    initType = "text/css"
                }

                cssNode.setAttribute("type", initType);
                cssNode.appendChild(document.createTextNode(css))

                return cssNode
            }

            function AC_addStyle(css, className, addToTarget, isReload = false, initType =
                "text/css") { // 添加CSS代码,不考虑文本载入时间,只执行一次-无论成功与否,带有className
                RAFInterval(async () => {
                    /**
                     * addToTarget这里不要使用head标签,head标签的css会在html载入时加载,
                     * html加载后似乎不会再次加载,body会自动加载
                     * **/
                    let addTo = document.querySelector(addToTarget);
                    if (typeof(addToTarget) === "undefined")
                        addTo = (document.head || document.body || document.documentElement);
                    // 如果没有目标节点(则直接加) || 有目标节点且找到了节点(进行新增)
                    if (typeof(addToTarget) === "undefined" || (typeof(addToTarget) != "undefined" &&
                            document.querySelector(addToTarget) != null)) {
                        // clearInterval(tout);
                        // 如果true 强行覆盖,不管有没有--先删除
                        // 如果false,不覆盖,但是如果有的话,要退出,不存在则新增--无需删除
                        if (isReload === true) {
                            safeRemove("." + className);
                        } else if (isReload === false && document.querySelector("." + className) !=
                            null) {
                            // 节点存在 && 不准备覆盖
                            return true;
                        }

                        let cssNode = document.createElement("style");
                        if (className != null) cssNode.className = className;

                        // 针对less进行单独处理
                        if (initType.includes('less')) {
                            // parseHTML 耗时 没必要
                            const {
                                css: renderCSS = ''
                            } = await less.render(css);
                            css = renderCSS
                            initType = "text/css"
                        }

                        cssNode.setAttribute("type", initType);
                        cssNode.appendChild(document.createTextNode(css))

                        try {
                            debug('执行添加样式:', className)
                            addTo.appendChild(cssNode);
                        } catch (e) {
                            console.log(e.message);
                        }
                        return true;
                    }
                }, 20, true);
            }

            function hideNode(node) {
                if (node.hasAttribute('ac-ad-hide')) return
                node.setAttribute('ac-ad-hide', '1')
                node.style = 'display: none !important;'
            }

            function safeRemove_xpath(xpathSelector, option = {
                isHide: false, // 隐藏模式
                withAni: true // 带动画效果
            }) {
                const {
                    isHide = false, withAni = false
                } = option
                safeFunction(() => {
                    let removeNodes = getAllElements(xpathSelector);
                    if (isHide) {
                        for (let i = 0; i < removeNodes.length; i++) {
                            hideNode(removeNodes[i])
                        }
                    } else {
                        for (let i = 0; i < removeNodes.length; i++) {
                            removeNodes[i].remove() // 避免卡顿现象
                        }
                    }
                })
            }

            function checkISBaiduMain() { // 首页=true;非首页=false
                // 如果是百度 &&  没有(百度搜索结果的标志-[存在]百度的内容) return;
                return !(curSite.SiteTypeID === SiteType.BAIDU && !(location.href.replace(/(&|\?)(wd|word)=/,
                        "") !== location.href || document.querySelector("#content_left") ||
                    ((document.querySelector("#kw") && document.querySelector("#kw").getAttribute(
                        "value")) || "") !== ""))
            }

            /**
             * 检查document的子节点是否含有元素
             * @param nodeClass 待检查元素
             * @returns {boolean} T|F
             */
            function checkDocmentHasNode(nodeClass) {
                for (let i = 0; i < document.childNodes.length; i++) {
                    if (document.childNodes[i].data && document.childNodes[i].data.indexOf(nodeClass) > 0)
                        return {
                            res: true,
                            node: document.childNodes[i],
                            index: i
                        };
                }
                return {
                    res: false,
                    node: null,
                    index: -1
                };
            }

            async function changeSiteBackground(imageUrl) { // 这个图片地址可能为:动态图片返回、静态跨域图片
                const css =
                    `body:before{pointer-events: none;position: fixed;width: 100%;height: 100%;top: 0;left: 0;content: '';background-image: url('${imageUrl}');background-size: 100% auto;opacity: 0.6;`
                CONST.flushNode.insert(await create_CSS_Node(css, 'AC-BackGroundImage'), 'head', {
                    isReload: true
                })
            }

            async function asyncGMHttpRequestGet(url) {
                return new Promise((resolve, reject) => {
                    GM_xmlhttpRequest({
                        url: url,
                        method: "GET",
                        timeout: 5000,
                        onload: function(response) {
                            const {
                                responseText = ''
                            } = response
                            resolve(responseText)
                        },
                        onerror: function(err) {
                            reject(err)
                        }
                    })
                })
            }

            function FSBaidu() { // thanks for code from 浮生@未歇 @page https://greasyfork.org/zh-TW/scripts/31642
                // debug("初始化FSBAIDU");

                const StyleManger = {
                    /**
                     * 导入css内容为【文本格式】!!!
                     * @param data css内容
                     * @param toClassName 预期的类名
                     */
                    importStyle: async (data, toClassName, useNormalCSS = false, mustLoad = false) => {
                        if (typeof(data) === "undefined" || data === null) {
                            // 这个居然在VM上出问题了,很奇怪
                            console.error("GM_getResourceText获取内容数据异常:", toClassName);
                            return
                        }
                        if (data.startsWith('http')) {
                            // 网址开头的,那么尝试去加载数据去
                            data = await asyncGMHttpRequestGet(data)
                        }
                        // 普通浏览器模式--但是似乎样式加载的优先级低于head中的style优先级
                        if (!useNormalCSS && curSite.SiteTypeID !== SiteType.DUCK) { // Duck拒绝了外部样式插入
                            // 通过must参数来判定style是否加载
                            // data = data.replace(/baidu.com#\$#/igm, '');
                            const {
                                css: renderCSS = ''
                            } = await less.render(data);
                            data = renderCSS || data
                            if (data.indexOf("http") !== 0) data = "data:text/css;utf-8," +
                                encodeURIComponent(data);
                            var {
                                res,
                            } = checkDocmentHasNode(toClassName);
                            if (!res) {
                                let pi = document.createProcessingInstruction(
                                    "xml-stylesheet",
                                    `type="text/css" must="${mustLoad}" class="${toClassName}" href="${data}"`
                                ); // 注意必须要双引号
                                debug('import执行添加样式 doing', toClassName)
                                return pi
                                // document.appendChild(pi);
                            }
                        } else {
                            /* **********多重样式-兼容edge && 黑夜脚本************ */
                            return await create_CSS_Node(data, toClassName)
                            // AC_addStyle(data, toClassName, "head", false, "less");
                            /* **********多重样式-兼容edge && 黑夜脚本************ */
                        }
                    },
                    loadStyle: async function(styleName, insClassName, setUrl, useNormalCSS = false, mustLoad =
                        false) {
                        // 全部采用text/css的内容来载入
                        // 如果是debug模式。或者是gm模式
                        if (isLocalDebug) {
                            debug("本地-加载样式:" + insClassName);
                            setUrl = setUrl || "http://debug.baidu.com/" + styleName + ".less?t=" + Math
                                .random() * new Date().getTime();
                            return await this.importStyle(setUrl, "AC-" + insClassName, useNormalCSS,
                                mustLoad);
                        } else {
                            debug("加载样式:" + insClassName);
                            // TamperMonkey + GreaseMonkey < 4.0 + ViolentMonkey (4.0GreaseMonkey不支持GetResource方法)
                            const style = curSite.GMStyleList[styleName] || await GM_getResourceText(
                                styleName)
                            return await this.importStyle(style, "AC-" + insClassName, useNormalCSS,
                                mustLoad);
                        }
                    },
                    //加载护眼模式样式
                    loadHuYanStyle: async function(color) {
                        if (ACConfig.isUserColorEnable) {
                            color = color || ACConfig.defaultHuYanColor || "#FFFFFF";
                        } else {
                            color = color || "#FFFFFF";
                        }
                        if (color.indexOf("#") !== 0 || color.length < 7) return;
                        const style = GM_getResourceText("MainHuYanStyle")
                            .replace(/#aaa(a*)/igm, color)
                            .replace(/#bbb(b*)/igm, this.Lighter(color, -40))
                            .replace(/#ccc(c*)/igm, this.Lighter(color, 45));
                        CONST.flushNode.insert(await create_CSS_Node(style, "AC-" + CONST.useItem.name +
                            "HuYanStyle-File"), 'head', {
                            isReload: true
                        })
                    },
                    clip255: function(value) {
                        if (value > 255) return 255;
                        if (value < 0) return 0;
                        return value;
                    },
                    Lighter: function(oriRGB, deltaY) {
                        // 按比例缩放 + 1/deltaY
                        // HEX 2 RGB
                        let rgb = oriRGB.replace("#", "");
                        let R = parseInt("0x" + rgb.substr(0, 2));
                        let G = parseInt("0x" + rgb.substr(2, 2));
                        let B = parseInt("0x" + rgb.substr(4, 2));
                        // RGB 2 YUV
                        let Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
                        let U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
                        let V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;
                        Y = Y * (1 + 1.0 / deltaY); // 提高亮度
                        // YUV 2 RGB
                        R = this.clip255((298 * (Y - 16) + 409 * (V - 128) + 128) >> 8);
                        G = this.clip255((298 * (Y - 16) - 100 * (U - 128) - 208 * (V - 128) + 128) >> 8);
                        B = this.clip255((298 * (Y - 16) + 516 * (U - 128) + 128) >> 8);
                        return "#" + ((R << 16) + (G << 8) + B).toString(16);
                    },
                    loadBaiduLiteStyle: async function() {
                        const node = await this.loadStyle("baiduLiteStyle", "baiduLiteStyle");
                        this.flushDom.insert(node, 'DOM')
                    },
                    loadBgImage: async function() {
                        if (CONST.useItem.defaultBgUrl && CONST.useItem.defaultBgUrl.trim()) {
                            changeSiteBackground(CONST.useItem.defaultBgUrl)
                        }
                    },
                    loadBgAutoFit: async function() {
                        const node = await this.loadStyle("BgAutoFit", "BgAutoFit");
                        this.flushDom.insert(node, 'DOM')
                    },
                    //加载普通样式
                    loadCommonStyle: async function() {
                        const node = await this.loadStyle(CONST.useItem.name + "CommonStyle", CONST.useItem
                            .name + "CommonStyle");
                        this.flushDom.insert(node, 'DOM')
                    },
                    //加载单页样式
                    loadOnePageStyle: async function() {
                        const node = await this.loadStyle(CONST.useItem.name + "OnePageStyle", CONST.useItem
                            .name + "OnePageStyle");
                        this.flushDom.insert(node, 'DOM')
                    },
                    //加载双页样式
                    loadTwoPageStyle: async function() {
                        const node = await this.loadStyle(CONST.useItem.name + "TwoPageStyle", CONST.useItem
                            .name + "TwoPageStyle");
                        this.flushDom.insert(node, 'DOM')
                        let cssHead = "";
                        if (curSite.SiteTypeID === SiteType.BAIDU || curSite.SiteTypeID === SiteType.MBAIDU)
                            cssHead =
                            "#container #content_left, body[news] #container #content_left>div:not([class]):not([id])";
                        if (curSite.SiteTypeID === SiteType.GOOGLE) cssHead =
                            ".srg, #rso, div[two-father], #rso>div:not(.g), #kp-wp-tab-overview";
                        if (curSite.SiteTypeID === SiteType.BING) cssHead = "#b_content #b_results";
                        if (curSite.SiteTypeID === SiteType.SOGOU) cssHead = "#main .results";
                        if (curSite.SiteTypeID === SiteType.DUCK) cssHead =
                            "#links_wrapper .results--main #links";
                        if (curSite.SiteTypeID === SiteType.DOGE) cssHead =
                            "#links_wrapper .results--main #links";
                        const node2 = await create_CSS_Node(cssHead +
                            "{grid-template-columns: repeat(2, minmax(50%,1fr));grid-template-areas:'xmain xmain';}.AC.sp-separator{grid-column-start: 1;grid-column-end: xmain-end;}",
                            "AC-TwoPageExStyle");
                        this.flushDom.insert(node2, 'head')
                    },
                    // 加载三列样式
                    loadThreePageStyle: async function() {
                        let cssHead = "";
                        if (curSite.SiteTypeID === SiteType.BAIDU || curSite.SiteTypeID === SiteType.MBAIDU)
                            cssHead =
                            "#container #content_left, body[news] #container #content_left>div:not([class]):not([id])";
                        if (curSite.SiteTypeID === SiteType.GOOGLE) cssHead =
                            ".srg, #rso, div[two-father], #rso>div:not(.g), #kp-wp-tab-overview";
                        if (curSite.SiteTypeID === SiteType.BING) cssHead = "#b_content #b_results";
                        if (curSite.SiteTypeID === SiteType.SOGOU) cssHead = "#main .results";
                        if (curSite.SiteTypeID === SiteType.DUCK) cssHead =
                            "#links_wrapper .results--main #links";
                        if (curSite.SiteTypeID === SiteType.DOGE) cssHead =
                            "#links_wrapper .results--main #links";
                        const node2 = await create_CSS_Node(cssHead +
                            "{grid-template-columns: repeat(3, minmax(33.3%,1fr));grid-template-areas:'xmain xmain xmain';}",
                            "AC-ThreePageExStyle");
                        this.flushDom.insert(node2, 'head')
                    },
                    // 加载四列样式
                    loadFourPageStyle: async function() {
                        let cssHead = "";
                        if (curSite.SiteTypeID === SiteType.BAIDU || curSite.SiteTypeID === SiteType.MBAIDU)
                            cssHead =
                            "#container #content_left, body[news] #container #content_left>div:not([class]):not([id])";
                        if (curSite.SiteTypeID === SiteType.GOOGLE) cssHead =
                            ".srg, #rso, div[two-father], #rso>div:not(.g), #kp-wp-tab-overview";
                        if (curSite.SiteTypeID === SiteType.BING) cssHead = "#b_content #b_results";
                        if (curSite.SiteTypeID === SiteType.SOGOU) cssHead = "#main .results";
                        if (curSite.SiteTypeID === SiteType.DOGE) cssHead =
                            "#links_wrapper .results--main #links";
                        if (curSite.SiteTypeID === SiteType.DOGE) cssHead =
                            "#links_wrapper .results--main #links";
                        const node2 = await create_CSS_Node(cssHead +
                            "{grid-template-columns: repeat(4, minmax(25%,1fr));grid-template-areas:'xmain xmain xmain xmain';}",
                            "AC-FourPageExStyle");
                        this.flushDom.insert(node2, 'head')
                    },
                    findPosibleTwoLine() {
                        // 通过.g来往上查找
                        // 如果其拥有的子节点的className具有两个以上的相同项,那么认为是grid布局,需要遍历,增加标记位
                        function checkOne(element) {
                            const res = {
                                exist: false,
                                skipFind: false
                            }

                            if (element.children.length <= 2) return res

                            // 如果已经有这个参数了,或者当前节点是右侧栏,那么跳过
                            if (element.hasAttribute('two-checked') || element.id.includes("rhs")) {
                                res.skipFind = true
                                return res
                            }

                            element.setAttribute('two-checked', 'true')
                            const childNodeClassNameList = [...element.children].map(one => one.className)
                                .filter(one => one && one !== '')
                            const childNodeClassNameSet = new Set(childNodeClassNameList)
                            const tf = childNodeClassNameSet.size !== childNodeClassNameList.length
                            if (tf) {
                                // debugger
                                res.exist = true
                            }
                            return res
                        }

                        const gList = document.querySelectorAll(".g")
                        const possibleList = []
                        for (const perG of gList) {
                            let curIndex = 2
                            let curNode = perG.parentNode

                            while (curIndex-- > 0) {
                                const {
                                    exist = false, skipFind = false
                                } = checkOne(curNode)
                                if (skipFind) {
                                    break
                                }
                                if (exist) {
                                    possibleList.push(curNode)
                                    break
                                }
                                curNode = curNode.parentNode
                            }
                        }
                        // console.log(possibleList)
                        return possibleList
                    },
                    googleFatherChildTag: async function() {
                        if (curSite.SiteTypeID === SiteType.GOOGLE) {
                            let nodeList = this.findPosibleTwoLine()
                            // console.log(nodeList)

                            // 对于这些块,都判定一下结构,如果子节点中div数量不足2个的,那么丢弃grid布局
                            if (nodeList.length > 0) {
                                nodeList.forEach((node) => {
                                    const divChildren = [...node.children].filter(one => one.tagName
                                        .toUpperCase() === 'DIV')
                                    if (divChildren.length >= 2) {
                                        node.setAttribute('two-father', 1)
                                        divChildren.forEach(one => {
                                            // 不显示那些应该隐藏的元素
                                            if (one.innerText.length > 0 || one.children
                                                .length > 0) {
                                                one.setAttribute('two-child', 1)
                                            } else {
                                                one.style = 'display:none'
                                            }
                                        })
                                    } else {
                                        node.removeAttribute('two-father')
                                    }

                                    // 两列的时候,增加对应的grid布局
                                    if (CONST.useItem.AdsStyleMode >= 3) {
                                        if (divChildren.length >= 2) {
                                            node.style.display !== 'grid' ? node.style.display =
                                                'grid' : ''
                                        } else {
                                            node.style.display !== 'unset' ? node.style.display =
                                                'unset' : ''
                                        }
                                    }
                                })
                            }
                            // 特殊元素一行处理
                            document.querySelectorAll("#rso>div:not(.g)>div[jsmodel]").forEach(one => {
                                one.parentNode.style.display = "unset"
                            })
                        }
                    },
                    loadPlainToCSS: function() {
                        for (let i = 0; i < document.childNodes.length; i++) {
                            let curNode = document.childNodes[i];
                            if (curNode.del) curNode.remove();
                        }
                        safeRemove("style[class*='AC'][del='1']");
                    },
                    // 禁止独立的样式加载
                    loadCSSToPlain: function() {
                        for (let i = 0; i < document.childNodes.length; i++) {
                            let curNode = document.childNodes[i];
                            // 如果是存在css, 且非必须数据
                            if (curNode.target === "xml-stylesheet" && curNode.data.indexOf("must=\"true") <
                                0) {
                                curNode.data = "";
                                curNode.del = true;

                                // 对于edge和safari都特殊处理一下吧
                                if (navigator.userAgent.toLowerCase().indexOf("edge") > 0 || navigator
                                    .userAgent.toLowerCase().indexOf("safari") > 0) {
                                    curNode.remove();
                                }
                            }
                        }
                    }
                };
                const ControlManager = {
                    ...StyleManger,
                    //居中显示 --- 必须是百度和谷歌的搜索结果页面,其他页面不能加载的--已经通过脚本include标签限制了一部分
                    centerDisplay: async function() {
                        // flush完成之后,等一等变更,渲染差不多之后再刷新
                        setInterval(() => {
                            this.googleFatherChildTag()
                        }, 600)
                        // 如果是百度 && ((地址替换->包含wd关键词[替换之后不等-是百度结果页面]) || 有右边栏-肯定是百度搜索结果页 || value中存在搜索内容) return;
                        if (!checkISBaiduMain()) {
                            console.log('not good At Baidu')
                            this.loadCSSToPlain();
                            return;
                        }
                        this.flushDom.insert(await create_CSS_Node(
                            ".minidiv #logo img{width: 100px;height: unset;margin-top: 0.3rem;} body.purecss-mode:before{display: none;}",
                            "AC-style-logo"))
                        let result = parseInt(CONST.useItem.AdsStyleMode || -1);
                        if (acCssLoadFlag === false && document.querySelector(".ACExtension") === null) {
                            debug("in样式即将加载:" + result);
                            let expandStyle = `
							#container{
								width: 100% !important;
								margin:0 !important;
							}
							#content_left {
							    width: 100% !important;
							}
							#wrapper #rs,
							#wrapper #content_left .result,
							#wrapper #content_left>.c-container {
								min-width: 670px;
								margin:0 !important;
								width:100%;
								padding: 0.3rem;
							}
							.c-span12 {
								width: 100% !important;
							}
							.c-span18 {
								width: 78% !important;
								min-width: 550px;
							}
							.c-span24 {
								width: auto !important;
							}
							`;

                            if (result === 1) { // 单列模式
                                this.flushDom.insert(await create_CSS_Node(expandStyle, "AC-Style-expand"))
                                await this.loadCommonStyle();
                            } else if (result === 2) { //单页居中
                                this.flushDom.insert(await create_CSS_Node(expandStyle, "AC-Style-expand"))
                                await this.loadCommonStyle();
                                await this.loadOnePageStyle();
                            } else if (result === 3) { //双页居中
                                await this.loadCommonStyle();
                                await this.loadTwoPageStyle();
                            } else if (result === 4) { // 三列
                                await this.loadCommonStyle();
                                await this.loadTwoPageStyle();
                                await this.loadThreePageStyle();
                            } else if (result === 5) { // 四列
                                await this.loadCommonStyle();
                                await this.loadTwoPageStyle();
                                await this.loadFourPageStyle();
                            }
                            acCssLoadFlag = true;
                            debug("in样式运行结束");
                            if (curSite.SiteTypeID === SiteType.BAIDU && ACConfig.Style_BaiduLite ===
                                true) {
                                // AC_addStyle(GM_getResourceText("baiduLiteStyle"), "AC-baiduLiteStyle", "head")
                                await this.loadBaiduLiteStyle();
                            }

                            safeWaitFunc('body', async () => {
                                if (result > 0) { // 非原始模式下
                                    await this.loadBgImage()
                                    CONST.useItem.defaultBgUrl && CONST.useItem.BgFit &&
                                        await this.loadBgAutoFit()
                                    document.body.classList.remove('purecss-mode')
                                } else {
                                    document.body.classList.add('purecss-mode')
                                }
                            })
                            this.flushDom.flush()
                        }
                        this.loadPlainToCSS();
                        if (curSite.SiteTypeID !== SiteType.BAIDU && curSite.SiteTypeID !== SiteType
                            .BAIDU_XUESHU && curSite.SiteTypeID !== SiteType.GOOGLE && curSite
                            .SiteTypeID !== SiteType.BING && curSite.SiteTypeID !== SiteType.SOGOU &&
                            curSite.SiteTypeID !== SiteType.DUCK && curSite.SiteTypeID !== SiteType.DOGE)
                            return;

                        // 如果是谷歌 && (地址替换->是谷歌图像页面 || 是地图页面)[替换要变] return;
                        if (curSite.SiteTypeID === SiteType.GOOGLE && location.href.replace(
                                /tbm=(isch|lcl|shop|flm)/, "") !== location.href) {
                            this.loadCSSToPlain();
                            return;
                        }
                        this.huyanCheckAndLoad()
                        this.flushCheckAndLoad()
                    },
                    flushDom: new FlushDomFragment(),
                    huyanTimer: 0,
                    flushTimer: 0,
                    huyanCheckAndLoad: function() {
                        /**护眼Style最后载入**/
                        if (CONST.useItem.HuYanMode === true) {
                            this.loadHuYanStyle()
                        }
                        if (!this.huyanTimer) {
                            this.huyanTimer = setInterval(() => {
                                if (document.querySelector("style[class*='darkreader']") != null) {
                                    this.loadHuYanStyle()
                                    clearInterval(this.huyanTimer)
                                    this.huyanTimer = 0
                                }
                            }, 100)
                        }
                    },
                    flushCheckAndLoad: function() {
                        if (!this.flushTimer) {
                            this.flushTimer = setInterval(() => {
                                this.flushDom.flush()
                            }, 600)
                        }
                    },
                    init: function() {
                        if (CONST.isGoogleImageUrl) return;
                        this.centerDisplay();
                    }
                };
                return ControlManager
            }
        }
    })();
}();