Greasy Fork

Greasy Fork is available in English.

GM Api Test

用于测试您的油猴脚本管理器对油猴函数的支持程度

当前为 2025-09-11 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         GM Api Test
// @namespace    https://github.com/WhiteSevs/TamperMonkeyScript
// @version      2025.9.11
// @author       WhiteSevs
// @description  用于测试您的油猴脚本管理器对油猴函数的支持程度
// @license      GPL-3.0-only
// @icon         data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAACM9JREFUeF7tnUmsFUUUhj9klFmMsxiJGsUBFk4xbDAa16AG1EQUQSDRMBjBuHFrBCNDNBFkUEhUiApro9EFxKi4AAc0xmBEcUrQx6SIov2Te5+Xy323q/t2v9fd59Ty3erq+k99r7rqVNWpfuSb5gL3A2OAUcAwYAgwEDgj31eXrvQTwHHgT+AI0AUcADYBq/NS0y+Hgh+qNfqkWkPn8ApzRQqMHTUY1mepPisAxgGq2A3A8Cwr6GWdZoHDwE5A/2h7O7VPFgBsBqYAgzqtjD+fyAJ/AduA6YmeasrcCQArgZnAiE4q4M92bIFDwAZgQZqS0gBwDfA2cGGaF/ozuVlgP3AH8HmSNyQFYEbU8GuAwUle4nl7zQLHgDnAxtA3JgFgaTQ9WRxasOfrUwssA5aE1CAUgK21gV5ImZ6nGBbQAHFqXFVCAFgLzIoryH8vpAXWAbPb1SwOAI3yM3U8FNJM1a6U/AWaJbRM7QCYDLxXbduYUXcr8H4rtT0BMBbYDYw2Y6JqC/0dmBB9yvc1y+wJgO+Bi6ptE3PqfgAuDgFAHr755sxjQ/CqZo9hqx7goLt3K0uD3MYjG9U1A6CFnWmVle/CZIEtjQtIjQBoSfdLX9WrPCVaRbyqvpTcCICmfJr6eaq+BTQl1NSQRgCOAmdWX7srBP4AhjYCsDDas7fcTWPKAosiP8+Keg+wq+YoMGUB42Ll6JtYB+BvoL9xg1iT/w8wQAB492+t6f/Xu0gAbAe0hduTPQvsEABfAOPtaXfFkUNojwDQIoFv8LTJw34BoKVCHdvyZM8CXQJAZ9F8l6+9xpfiYwJA0wE/qGkTgBMC4F+b2l113RXsABhmwXsAw43vPYDxxncAHICT+wF8DGAYBAfAcOP7J8B44zsADoCPAawz4GMA4wQ4AA6ATwMtM+A9gOXWrx0McUeQYQi8BzDc+O4HMN74DoAD4I4g6wz4GMA4AQ6AA+COIMsMeA9gufXdEWS89R0AB8A/AcYZcAAcAJ8FWGbAewDLre+DQOOt7wA4AP4JMM6AA+AA+CzAMgPeA1hufR8EGm99B8AB8E+AcQZ6GwBFJVdo2q+B74BvatfU1K8819X0us7ksujG0kuAy6M7bq4GBpa0nQqvtzcAOAzsjBp1UwfX0N4d3XHzAHALcHbBYSiV3jwB6Ioun3wphyvn5wJPFTC+cSn15gGAbqV6C7g35//UF2u9wpCc3xNXfKn1Zg2AbqPSbdV746yW0e/nRWOG1/vwtrPS680KAB0wXQPMy6hhkxaj3mBO0y1oSctIkr8yerMAQFeQXVG7dyCJEbPOq8uuNbvI++q7SuntFIDuCwizbs0OysvzAszK6e0EgF8AfYOLmH4Gzs24YpXUmxaAE8A50TXzBzI2clbFjQF+zfAehMrqTQvAE9HVo0uzaq2cylkSjQeeyajsyupNA0ARv4M9tXMW44FK600KwClXj2f035VnMeNqaw2DUr5E9yldCmhMUYakMdm3QLBzLCkAcrrk7eHL2tCvRRDck7LQ1X3o20hZZeQTkbs8KCUBQL7u0UGlFi9Tmqvx9kdrGfItlDEF3wWZBIBnc1jY6S3jLgMeT/gyeTXVA5QxqQdQTxCbQgE4CgyLLa3YGY5EM5ehgVVUj3FWYN6iZvstpMcOBeBj4KaiKg2s10fAjYF5yzTy70lS0AwoFIBFEU0rAo1X1GwLoytylwdWbmY0+n85MG9Rsz0IbIirXAgAull0QFxBJfldW7T6x9RVecq6Ba1Z2vG4tgsB4DPgupI0cFw1PwWujcmkPBPiCirJ77vj2i4EgDcB7cmrQnoDuCtGiCm9IQDou/lYFVofeA7QeKZdMqU3BIBHo5W/FyoCwCPA8zFaTOkNAeB24N2KAHAb8E6MFlN6QwC4IPKH/1QRAM6P/OQ/xmgxpdcBOJ0GB6DJJqa6RMCU3pAewNSgCDClNwQAU9OimrvYzLRXAMjVe0abgZEpx0jkObOk94QA0LanwW0AkDtxYkVmAbsC3LyW9B4TAHG7ZUwtjgCW9HYJgJDtQ7M6ONtflM5Dh1bXBVbGit79AkARO8bHGMbMBomaHazo3SMAtgOTYgBQ1IsRgf89Rc12CBgeWDkrencIgNANhNY2hVrQO08AKOnAR9wuGGvbwquuV7uFBtUBCNpAWIvGYelgSJUPwpwc59QBCB0hWzsaVmW9J2c6dQD0GQgdJJVphBzas7UbG1ZRb/cgtxGAJMYqw5m5RGfkYmYHVdPbDXUjAElO0ipI0tgCxAXqqd10pm9fhkGjqqT3lM9aIwAy5ubIMTQtcK6sYEmhR60Ci8wsm46yZR0sqip6twDT65ZuBkB/P5jA6VPE72OST1lS4squV+O8kY2iWwGwMor9Mz+BZRQ8Sa7kvo4XpLhAe3IIDtVsijLrXQUsiANAv4csEDWWoyBKT/Zh3CDFA3o6w6BQcfyXUW/LeAetegCJV9j2T2L2CbQyUm+HTtXAdb2hULFp9R4DrgfqYfm7264nAJRhBvBK3L9Ci997K3iyQr/cKXdmijpm+UgZ9CrU/sZWotsBoPwKBbc4pbXyCp+uaB8PR3v3RqWsV16PFVWv7KVPZMsUB4Ae2gpM6cBqmpKp63m1gxgDOtt/X+3TVNSpZ91ERdK7DZjaru1CANDzayPHinzHnSZtQNVI/avAK2OurM0w4s70d1qvvJ7vS73a/TQ7TlgoACpHUTM04PJUfAtocS82OohkJAFA+SfXPgllDRdX/KbrrIba4KsuX7OxoJQUABWqNYAPShxDL8gwJcwk340u1dIaSHBKA0C9cHkM9Vko+17BYGMVNKPcu+ruT/Hwhda1EwDq79ACkmYJfT0fD9VclXzyP2iU372wk0ZYFgDovXUP1c05rMKl0VXlZ7Qq+WFWl3NlBUCjwTVn16dB7uSyTt+KBpCmk/KlqKvPNF5jHgA0w6AIY1qpk+dO4WYVylw7kNsdSC1aA/RGfbTApJ26OqupsLbyLGqFVZHNMm30RjH/AX1V4etVAz1zAAAAAElFTkSuQmCC
// @supportURL   https://github.com/WhiteSevs/TamperMonkeyScript/issues
// @match        *://*/*
// @require      https://fastly.jsdelivr.net/gh/WhiteSevs/TamperMonkeyScript@86be74b83fca4fa47521cded28377b35e1d7d2ac/lib/CoverUMD/index.js
// @resource     ViewerCSS  https://fastly.jsdelivr.net/npm/[email protected]/dist/viewer.min.css
// @connect      *
// @grant        GM.addElement
// @grant        GM.addStyle
// @grant        GM.addValueChangeListener
// @grant        GM.audio
// @grant        GM.cookie
// @grant        GM.deleteValue
// @grant        GM.deleteValues
// @grant        GM.download
// @grant        GM.getResourceText
// @grant        GM.getResourceUrl
// @grant        GM.getTab
// @grant        GM.getTabs
// @grant        GM.getValue
// @grant        GM.getValues
// @grant        GM.info
// @grant        GM.listValues
// @grant        GM.log
// @grant        GM.notification
// @grant        GM.openInTab
// @grant        GM.registerMenuCommand
// @grant        GM.removeValueChangeListener
// @grant        GM.saveTab
// @grant        GM.setClipboard
// @grant        GM.setValue
// @grant        GM.setValues
// @grant        GM.unregisterMenuCommand
// @grant        GM.webRequest
// @grant        GM.xmlHttpRequest
// @grant        GM_addElement
// @grant        GM_addStyle
// @grant        GM_addValueChangeListener
// @grant        GM_audio
// @grant        GM_cookie
// @grant        GM_deleteValue
// @grant        GM_deleteValues
// @grant        GM_download
// @grant        GM_getResourceText
// @grant        GM_getResourceURL
// @grant        GM_getTab
// @grant        GM_getTabs
// @grant        GM_getValue
// @grant        GM_getValues
// @grant        GM_info
// @grant        GM_listValues
// @grant        GM_log
// @grant        GM_notification
// @grant        GM_openInTab
// @grant        GM_registerMenuCommand
// @grant        GM_removeValueChangeListener
// @grant        GM_saveTab
// @grant        GM_setClipboard
// @grant        GM_setValue
// @grant        GM_setValues
// @grant        GM_unregisterMenuCommand
// @grant        GM_webRequest
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @grant        window.close
// @grant        window.focus
// @grant        window.onurlchange
// @run-at       document-start
// ==/UserScript==

(function () {
  'use strict';

  var _GM = (() => typeof GM != "undefined" ? GM : void 0)();
  var _GM_addElement = (() => typeof GM_addElement != "undefined" ? GM_addElement : void 0)();
  var _GM_addStyle = (() => typeof GM_addStyle != "undefined" ? GM_addStyle : void 0)();
  var _GM_addValueChangeListener = (() => typeof GM_addValueChangeListener != "undefined" ? GM_addValueChangeListener : void 0)();
  var _GM_cookie = (() => typeof GM_cookie != "undefined" ? GM_cookie : void 0)();
  var _GM_deleteValue = (() => typeof GM_deleteValue != "undefined" ? GM_deleteValue : void 0)();
  var _GM_deleteValues = (() => typeof GM_deleteValues != "undefined" ? GM_deleteValues : void 0)();
  var _GM_download = (() => typeof GM_download != "undefined" ? GM_download : void 0)();
  var _GM_getResourceText = (() => typeof GM_getResourceText != "undefined" ? GM_getResourceText : void 0)();
  var _GM_getResourceURL = (() => typeof GM_getResourceURL != "undefined" ? GM_getResourceURL : void 0)();
  var _GM_getTab = (() => typeof GM_getTab != "undefined" ? GM_getTab : void 0)();
  var _GM_getTabs = (() => typeof GM_getTabs != "undefined" ? GM_getTabs : void 0)();
  var _GM_getValue = (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
  var _GM_getValues = (() => typeof GM_getValues != "undefined" ? GM_getValues : void 0)();
  var _GM_info = (() => typeof GM_info != "undefined" ? GM_info : void 0)();
  var _GM_listValues = (() => typeof GM_listValues != "undefined" ? GM_listValues : void 0)();
  var _GM_log = (() => typeof GM_log != "undefined" ? GM_log : void 0)();
  var _GM_notification = (() => typeof GM_notification != "undefined" ? GM_notification : void 0)();
  var _GM_openInTab = (() => typeof GM_openInTab != "undefined" ? GM_openInTab : void 0)();
  var _GM_registerMenuCommand = (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : void 0)();
  var _GM_removeValueChangeListener = (() => typeof GM_removeValueChangeListener != "undefined" ? GM_removeValueChangeListener : void 0)();
  var _GM_saveTab = (() => typeof GM_saveTab != "undefined" ? GM_saveTab : void 0)();
  var _GM_setClipboard = (() => typeof GM_setClipboard != "undefined" ? GM_setClipboard : void 0)();
  var _GM_setValue = (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
  var _GM_setValues = (() => typeof GM_setValues != "undefined" ? GM_setValues : void 0)();
  var _GM_unregisterMenuCommand = (() => typeof GM_unregisterMenuCommand != "undefined" ? GM_unregisterMenuCommand : void 0)();
  var _GM_webRequest = (() => typeof GM_webRequest != "undefined" ? GM_webRequest : void 0)();
  var _GM_xmlhttpRequest = (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)();
  var _GM_audio = (() => typeof GM_audio != "undefined" ? GM_audio : void 0)();
  var _unsafeWindow = (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)();
  var _monkeyWindow = (() => window)();
  function CompatibleProcessing() {
    try {
      if (typeof Object.assign !== "function") {
        Object.assign = function(target) {
          target = Object(target);
          if (arguments.length > 1) {
            let sourceList = [...arguments].splice(1, arguments.length - 1);
            sourceList.forEach((sourceItem) => {
              for (var sourceKey in sourceItem) {
                if (Object.prototype.hasOwnProperty.call(sourceItem, sourceKey)) {
                  target[sourceKey] = sourceItem[sourceKey];
                }
              }
            });
          }
          return target;
        };
      }
    } catch (error) {
      console.warn("Qmsg CompatibleProcessing Object.assign error", error);
    }
    try {
      if (!("classList" in document.documentElement)) {
        Object.defineProperty(HTMLElement.prototype, "classList", {
          get: function() {
            var self2 = this;
            function update(fn) {
              return function(value) {
                var classes = self2.className.split(/\s+/g), index = classes.indexOf(value);
                fn(classes, index, value);
                self2.className = classes.join(" ");
              };
            }
            return {
              add: update(function(classes, index, value) {
                if (!~index)
                  classes.push(value);
              }),
              remove: update(function(classes, index) {
                if (~index)
                  classes.splice(index, 1);
              }),
              toggle: update(function(classes, index, value) {
                if (~index)
                  classes.splice(index, 1);
                else
                  classes.push(value);
              }),
              contains: function(value) {
                return !!~self2.className.split(/\s+/g).indexOf(value);
              },
              item: function(index) {
                return self2.className.split(/\s+/g)[index] || null;
              }
            };
          }
        });
      }
    } catch (error) {
      console.warn("Qmsg CompatibleProcessing HTMLElement.prototype.classList warning", error);
    }
  }
  const QmsgDefaultConfig = {
get PLUGIN_NAME() {
      return "qmsg";
    },
get NAMESPACE() {
      return "qmsg";
    },
INS_DEFAULT: {},
get config() {
      return {
        parent: document.body || document.documentElement,
        useShadowRoot: true,
        shadowRootMode: "open",
        animation: true,
        autoClose: true,
        listenEventToPauseAutoClose: true,
        content: "",
        isHTML: false,
        position: "top",
        showClose: false,
        maxNums: 5,
        onClose: null,
        showIcon: true,
        showMoreContent: false,
        showReverse: false,
        timeout: 2500,
        type: "info",
        zIndex: 5e4,
        style: "",
        customClass: "",
        isLimitWidth: false,
        limitWidthNum: 200,
        limitWidthWrap: "no-wrap",
        consoleLogContent: false,
        afterRender: null
      };
    }
  };
  const QmsgHeaderCloseIcon = (
`
	<svg width="16" height="16" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
		<rect width="48" height="48" fill="white" fill-opacity="0.01"/>
		<path d="M14 14L34 34" stroke="#909399" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
		<path d="M14 34L34 14" stroke="#909399" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
	</svg>`
  );
  const QmsgIcon = {
    info: (
`
		<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
			<path d="M512 64q190.016 4.992 316.512 131.488T960 512q-4.992 190.016-131.488 316.512T512 960q-190.016-4.992-316.512-131.488T64 512q4.992-190.016 131.488-316.512T512 64zm67.008 275.008q26.016 0 43.008-15.488t16.992-41.504-16.992-41.504-42.496-15.488-42.496 15.488-16.992 41.504 16.992 41.504 42.016 15.488zm12 360q0-6.016.992-16T592 664l-52.992 60.992q-8 8.992-16.512 14.016T508 742.016q-8.992-4-8-14.016l88-276.992q4.992-28-8.992-48t-44.992-24q-35.008.992-76.512 29.504t-72.512 72.512v15.008q-.992 10.016 0 19.008l52.992-60.992q8-8.992 16.512-14.016T468 437.024q10.016 4.992 7.008 16l-87.008 276q-7.008 24.992 7.008 44.512T444 800.032q50.016-.992 84-28.992t63.008-72z" fill="#909399"/>
		</svg>`
    ),
    warning: (
`

		<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
			<path d="M512 64C264.64 64 64 264.64 64 512c0 247.424 200.64 448 448 448 247.488 0 448-200.576 448-448 0-247.36-200.512-448-448-448zm0 704c-26.432 0-48-21.504-48-48s21.568-48 48-48c26.624 0 48 21.504 48 48s-21.376 48-48 48zm48-240c0 26.56-21.376 48-48 48-26.432 0-48-21.44-48-48V304c0-26.56 21.568-48 48-48 26.624 0 48 21.44 48 48v224z" fill="#E6A23C"/>
		</svg>`
    ),
    error: (
`

		<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
			<path d="M512 64C264.58 64 64 264.58 64 512s200.58 448 448 448 448-200.57 448-448S759.42 64 512 64zm158.39 561.14a32 32 0 1 1-45.25 45.26L512 557.26 398.86 670.4a32 32 0 0 1-45.25-45.26L466.75 512 353.61 398.86a32 32 0 0 1 45.25-45.25L512 466.74l113.14-113.13a32 32 0 0 1 45.25 45.25L557.25 512z" fill="#F56C6C"/>
		</svg>`
    ),
    success: (
`

		<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
			<path d="M512 64q190.016 4.992 316.512 131.488T960 512q-4.992 190.016-131.488 316.512T512 960q-190.016-4.992-316.512-131.488T64 512q4.992-190.016 131.488-316.512T512 64zm-56 536l-99.008-99.008q-12-11.008-27.488-11.008t-27.008 11.488-11.488 26.496 11.008 27.008l127.008 127.008q11.008 11.008 27.008 11.008t27.008-11.008l263.008-263.008q15.008-15.008 9.504-36.512t-27.008-27.008-36.512 9.504z" fill="#67C23A"/>
		</svg>`
    ),
    loading: (
`
		<svg class="animate-turn" width="16" height="16" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
			<path fill="#fff" fill-opacity=".01" d="M0 0h48v48H0z"/>
			<path d="M4 24c0 11.046 8.954 20 20 20s20-8.954 20-20S35.046 4 24 4" stroke="#409eff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
			<path d="M36 24c0-6.627-5.373-12-12-12s-12 5.373-12 12 5.373 12 12 12" stroke="#409eff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
		</svg>`
    )
  };
  const QmsgInstStorage = {
insInfoList: [],
remove(uuid) {
      let flag = false;
      for (let index = 0; index < QmsgInstStorage.insInfoList.length; index++) {
        if (QmsgInstStorage.insInfoList[index].uuid === uuid) {
          QmsgInstStorage.insInfoList.splice(index, 1);
          flag = true;
          break;
        }
      }
      return flag;
    }
  };
  const createCache$3 = (lastNumberWeakMap) => {
    return (collection, nextNumber) => {
      lastNumberWeakMap.set(collection, nextNumber);
      return nextNumber;
    };
  };
  const MAX_SAFE_INTEGER$3 = Number.MAX_SAFE_INTEGER === void 0 ? 9007199254740991 : Number.MAX_SAFE_INTEGER;
  const TWO_TO_THE_POWER_OF_TWENTY_NINE$3 = 536870912;
  const TWO_TO_THE_POWER_OF_THIRTY$3 = TWO_TO_THE_POWER_OF_TWENTY_NINE$3 * 2;
  const createGenerateUniqueNumber$3 = (cache2, lastNumberWeakMap) => {
    return (collection) => {
      const lastNumber = lastNumberWeakMap.get(collection);
      let nextNumber = lastNumber === void 0 ? collection.size : lastNumber < TWO_TO_THE_POWER_OF_THIRTY$3 ? lastNumber + 1 : 0;
      if (!collection.has(nextNumber)) {
        return cache2(collection, nextNumber);
      }
      if (collection.size < TWO_TO_THE_POWER_OF_TWENTY_NINE$3) {
        while (collection.has(nextNumber)) {
          nextNumber = Math.floor(Math.random() * TWO_TO_THE_POWER_OF_THIRTY$3);
        }
        return cache2(collection, nextNumber);
      }
      if (collection.size > MAX_SAFE_INTEGER$3) {
        throw new Error("Congratulations, you created a collection of unique numbers which uses all available integers!");
      }
      while (collection.has(nextNumber)) {
        nextNumber = Math.floor(Math.random() * MAX_SAFE_INTEGER$3);
      }
      return cache2(collection, nextNumber);
    };
  };
  const LAST_NUMBER_WEAK_MAP$3 = new WeakMap();
  const cache$3 = createCache$3(LAST_NUMBER_WEAK_MAP$3);
  const generateUniqueNumber$3 = createGenerateUniqueNumber$3(cache$3, LAST_NUMBER_WEAK_MAP$3);
  const isMessagePort$3 = (sender) => {
    return typeof sender.start === "function";
  };
  const PORT_MAP$3 = new WeakMap();
  const extendBrokerImplementation$3 = (partialBrokerImplementation) => ({
    ...partialBrokerImplementation,
    connect: ({ call }) => {
      return async () => {
        const { port1, port2 } = new MessageChannel();
        const portId = await call("connect", { port: port1 }, [port1]);
        PORT_MAP$3.set(port2, portId);
        return port2;
      };
    },
    disconnect: ({ call }) => {
      return async (port) => {
        const portId = PORT_MAP$3.get(port);
        if (portId === void 0) {
          throw new Error("The given port is not connected.");
        }
        await call("disconnect", { portId });
      };
    },
    isSupported: ({ call }) => {
      return () => call("isSupported");
    }
  });
  const ONGOING_REQUESTS$3 = new WeakMap();
  const createOrGetOngoingRequests$3 = (sender) => {
    if (ONGOING_REQUESTS$3.has(sender)) {
      return ONGOING_REQUESTS$3.get(sender);
    }
    const ongoingRequests = new Map();
    ONGOING_REQUESTS$3.set(sender, ongoingRequests);
    return ongoingRequests;
  };
  const createBroker$3 = (brokerImplementation) => {
    const fullBrokerImplementation = extendBrokerImplementation$3(brokerImplementation);
    return (sender) => {
      const ongoingRequests = createOrGetOngoingRequests$3(sender);
      sender.addEventListener("message", (({ data: message }) => {
        const { id } = message;
        if (id !== null && ongoingRequests.has(id)) {
          const { reject, resolve } = ongoingRequests.get(id);
          ongoingRequests.delete(id);
          if (message.error === void 0) {
            resolve(message.result);
          } else {
            reject(new Error(message.error.message));
          }
        }
      }));
      if (isMessagePort$3(sender)) {
        sender.start();
      }
      const call = (method, params = null, transferables = []) => {
        return new Promise((resolve, reject) => {
          const id = generateUniqueNumber$3(ongoingRequests);
          ongoingRequests.set(id, { reject, resolve });
          if (params === null) {
            sender.postMessage({ id, method }, transferables);
          } else {
            sender.postMessage({ id, method, params }, transferables);
          }
        });
      };
      const notify = (method, params, transferables = []) => {
        sender.postMessage({ id: null, method, params }, transferables);
      };
      let functions = {};
      for (const [key, handler] of Object.entries(fullBrokerImplementation)) {
        functions = { ...functions, [key]: handler({ call, notify }) };
      }
      return { ...functions };
    };
  };
  const scheduledIntervalsState$3 = new Map([[0, null]]);
  const scheduledTimeoutsState$3 = new Map([[0, null]]);
  const wrap$3 = createBroker$3({
    clearInterval: ({ call }) => {
      return (timerId) => {
        if (typeof scheduledIntervalsState$3.get(timerId) === "symbol") {
          scheduledIntervalsState$3.set(timerId, null);
          call("clear", { timerId, timerType: "interval" }).then(() => {
            scheduledIntervalsState$3.delete(timerId);
          });
        }
      };
    },
    clearTimeout: ({ call }) => {
      return (timerId) => {
        if (typeof scheduledTimeoutsState$3.get(timerId) === "symbol") {
          scheduledTimeoutsState$3.set(timerId, null);
          call("clear", { timerId, timerType: "timeout" }).then(() => {
            scheduledTimeoutsState$3.delete(timerId);
          });
        }
      };
    },
    setInterval: ({ call }) => {
      return (func, delay = 0, ...args) => {
        const symbol = Symbol();
        const timerId = generateUniqueNumber$3(scheduledIntervalsState$3);
        scheduledIntervalsState$3.set(timerId, symbol);
        const schedule = () => call("set", {
          delay,
          now: performance.timeOrigin + performance.now(),
          timerId,
          timerType: "interval"
        }).then(() => {
          const state = scheduledIntervalsState$3.get(timerId);
          if (state === void 0) {
            throw new Error("The timer is in an undefined state.");
          }
          if (state === symbol) {
            func(...args);
            if (scheduledIntervalsState$3.get(timerId) === symbol) {
              schedule();
            }
          }
        });
        schedule();
        return timerId;
      };
    },
    setTimeout: ({ call }) => {
      return (func, delay = 0, ...args) => {
        const symbol = Symbol();
        const timerId = generateUniqueNumber$3(scheduledTimeoutsState$3);
        scheduledTimeoutsState$3.set(timerId, symbol);
        call("set", {
          delay,
          now: performance.timeOrigin + performance.now(),
          timerId,
          timerType: "timeout"
        }).then(() => {
          const state = scheduledTimeoutsState$3.get(timerId);
          if (state === void 0) {
            throw new Error("The timer is in an undefined state.");
          }
          if (state === symbol) {
            scheduledTimeoutsState$3.delete(timerId);
            func(...args);
          }
        });
        return timerId;
      };
    }
  });
  const load$3 = (url) => {
    const worker2 = new Worker(url);
    return wrap$3(worker2);
  };
  const createLoadOrReturnBroker$3 = (loadBroker, worker2) => {
    let broker = null;
    return () => {
      if (broker !== null) {
        return broker;
      }
      const blob = new Blob([worker2], { type: "application/javascript; charset=utf-8" });
      const url = URL.createObjectURL(blob);
      broker = loadBroker(url);
      setTimeout(() => URL.revokeObjectURL(url));
      return broker;
    };
  };
  const worker$3 = `(()=>{var e={455:function(e,t){!function(e){"use strict";var t=function(e){return function(t){var r=e(t);return t.add(r),r}},r=function(e){return function(t,r){return e.set(t,r),r}},n=void 0===Number.MAX_SAFE_INTEGER?9007199254740991:Number.MAX_SAFE_INTEGER,o=536870912,s=2*o,a=function(e,t){return function(r){var a=t.get(r),i=void 0===a?r.size:a<s?a+1:0;if(!r.has(i))return e(r,i);if(r.size<o){for(;r.has(i);)i=Math.floor(Math.random()*s);return e(r,i)}if(r.size>n)throw new Error("Congratulations, you created a collection of unique numbers which uses all available integers!");for(;r.has(i);)i=Math.floor(Math.random()*n);return e(r,i)}},i=new WeakMap,u=r(i),c=a(u,i),l=t(c);e.addUniqueNumber=l,e.generateUniqueNumber=c}(t)}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var s=t[n]={exports:{}};return e[n].call(s.exports,s,s.exports,r),s.exports}(()=>{"use strict";const e=-32603,t=-32602,n=-32601,o=(e,t)=>Object.assign(new Error(e),{status:t}),s=t=>o('The handler of the method called "'.concat(t,'" returned an unexpected result.'),e),a=(t,r)=>async({data:{id:a,method:i,params:u}})=>{const c=r[i];try{if(void 0===c)throw(e=>o('The requested method called "'.concat(e,'" is not supported.'),n))(i);const r=void 0===u?c():c(u);if(void 0===r)throw(t=>o('The handler of the method called "'.concat(t,'" returned no required result.'),e))(i);const l=r instanceof Promise?await r:r;if(null===a){if(void 0!==l.result)throw s(i)}else{if(void 0===l.result)throw s(i);const{result:e,transferables:r=[]}=l;t.postMessage({id:a,result:e},r)}}catch(e){const{message:r,status:n=-32603}=e;t.postMessage({error:{code:n,message:r},id:a})}};var i=r(455);const u=new Map,c=(e,r,n)=>({...r,connect:({port:t})=>{t.start();const n=e(t,r),o=(0,i.generateUniqueNumber)(u);return u.set(o,(()=>{n(),t.close(),u.delete(o)})),{result:o}},disconnect:({portId:e})=>{const r=u.get(e);if(void 0===r)throw(e=>o('The specified parameter called "portId" with the given value "'.concat(e,'" does not identify a port connected to this worker.'),t))(e);return r(),{result:null}},isSupported:async()=>{if(await new Promise((e=>{const t=new ArrayBuffer(0),{port1:r,port2:n}=new MessageChannel;r.onmessage=({data:t})=>e(null!==t),n.postMessage(t,[t])}))){const e=n();return{result:e instanceof Promise?await e:e}}return{result:!1}}}),l=(e,t,r=()=>!0)=>{const n=c(l,t,r),o=a(e,n);return e.addEventListener("message",o),()=>e.removeEventListener("message",o)},d=(e,t)=>r=>{const n=t.get(r);if(void 0===n)return Promise.resolve(!1);const[o,s]=n;return e(o),t.delete(r),s(!1),Promise.resolve(!0)},f=(e,t,r,n)=>(o,s,a)=>{const i=o+s-t.timeOrigin,u=i-t.now();return new Promise((t=>{e.set(a,[r(n,u,i,e,t,a),t])}))},m=new Map,h=d(globalThis.clearTimeout,m),p=new Map,v=d(globalThis.clearTimeout,p),w=((e,t)=>{const r=(n,o,s,a)=>{const i=n-e.now();i>0?o.set(a,[t(r,i,n,o,s,a),s]):(o.delete(a),s(!0))};return r})(performance,globalThis.setTimeout),g=f(m,performance,globalThis.setTimeout,w),T=f(p,performance,globalThis.setTimeout,w);l(self,{clear:async({timerId:e,timerType:t})=>({result:await("interval"===t?h(e):v(e))}),set:async({delay:e,now:t,timerId:r,timerType:n})=>({result:await("interval"===n?g:T)(e,t,r)})})})()})();`;
  const loadOrReturnBroker$3 = createLoadOrReturnBroker$3(load$3, worker$3);
  const clearInterval$3 = (timerId) => loadOrReturnBroker$3().clearInterval(timerId);
  const clearTimeout$2 = (timerId) => loadOrReturnBroker$3().clearTimeout(timerId);
  const setInterval$3 = (...args) => loadOrReturnBroker$3().setInterval(...args);
  const setTimeout$1$3 = (...args) => loadOrReturnBroker$3().setTimeout(...args);
  const QmsgUtils = {
getNameSpacify(...args) {
      let result = QmsgDefaultConfig.NAMESPACE;
      for (let index = 0; index < args.length; ++index) {
        result += "-" + args[index];
      }
      return result;
    },
isNumber(text) {
      let isNumberPattern = /^\d+$/;
      return isNumberPattern.test(text);
    },
getUUID() {
      return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(value) {
        let randValue = Math.random() * 16 | 0, newValue = value == "x" ? randValue : randValue & 3 | 8;
        return newValue.toString(16);
      });
    },
mergeArgs(content = "", config) {
      let opts = {};
      if (arguments.length === 0) {
        return opts;
      }
      if (config != null) {
        opts.content = content;
        if (typeof config === "object" && config != null) {
          return Object.assign(opts, config);
        }
      } else {
        if (typeof content === "object" && content != null) {
          return Object.assign(opts, content);
        } else {
          opts.content = content;
        }
      }
      return opts;
    },
toDynamicObject(obj, ...other_objs) {
      let __obj__ = Object.assign({}, obj ?? {});
      Object.keys(__obj__).forEach((keyName) => {
        let objValue = __obj__[keyName];
        Object.defineProperty(__obj__, keyName, {
          get() {
            let findIndex = other_objs.findIndex((other_obj) => {
              return typeof other_obj === "object" && other_obj != null && other_obj.hasOwnProperty.call(other_obj, keyName);
            });
            if (findIndex !== -1) {
              let other_objValue = other_objs[findIndex][keyName];
              return other_objValue;
            } else {
              return objValue;
            }
          },
          set(newValue) {
            objValue = newValue;
          }
        });
      });
      return __obj__;
    },
setTimeout(callback, timeout) {
      try {
        return setTimeout$1$3(callback, timeout);
      } catch (error) {
        return globalThis.setTimeout(callback, timeout);
      }
    },
clearTimeout(timeId) {
      try {
        if (timeId != null) {
          clearTimeout$2(timeId);
        }
      } catch (error) {
      } finally {
        globalThis.clearTimeout(timeId);
      }
    },
setInterval(callback, timeout) {
      try {
        return setInterval$3(callback, timeout);
      } catch (error) {
        return globalThis.setInterval(callback, timeout);
      }
    },
clearInterval(timeId) {
      try {
        if (timeId != null) {
          clearInterval$3(timeId);
        }
      } catch (error) {
      } finally {
        globalThis.clearInterval(timeId);
      }
    },
setSafeHTML($el, text) {
      try {
        $el.innerHTML = text;
      } catch (error) {
        if (globalThis.trustedTypes) {
          const policy = globalThis.trustedTypes.createPolicy("safe-innerHTML", {
            createHTML: (html) => html
          });
          $el.innerHTML = policy.createHTML(text);
        } else {
          throw new Error("QmsgUtils trustedTypes is not defined");
        }
      }
    }
  };
  const QmsgAnimation = {
$state: {
      opening: "MessageMoveIn",
      done: "",
      closing: "MessageMoveOut"
    },
    $name: {
      startNameList: [
        "animationName",
        "WebkitAnimationName",
        "MozAnimationName",
        "msAnimationName",
        "OAnimationName"
      ],
      endNameList: [
        "animationend",
        "webkitAnimationEnd",
        "mozAnimationEnd",
        "MSAnimationEnd",
        "oanimationend"
      ]
    },
__CAN_ANIMATION__: void 0,
get CAN_ANIMATION() {
      this.__CAN_ANIMATION__ = this.__CAN_ANIMATION__ ?? this.getStyleAnimationNameValue(document.createElement("div")) != null;
      return this.__CAN_ANIMATION__;
    },
getStyleAnimationNameValue(element) {
      for (let index = 0; index < this.$name.startNameList.length; index++) {
        let animationName = this.$name.startNameList[index];
        let animationNameValue = element.style[animationName];
        if (animationNameValue != null) {
          return animationNameValue;
        }
      }
    },
setStyleAnimationName(element, animationNameValue = "") {
      this.$name.startNameList.forEach((animationName) => {
        if (animationName in element.style) {
          element.style[animationName] = animationNameValue;
        }
      });
    }
  };
  const QmsgCSS = {
    css: (
`@charset "utf-8";
      .qmsg.qmsg-wrapper{position:fixed;top:16px;left:0;z-index:50000;display:flex;box-sizing:border-box;margin:0;padding:0;width:100%;color:rgba(0,0,0,.55);list-style:none;font-variant:tabular-nums;font-size:13px;line-height:1;font-feature-settings:"tnum";pointer-events:none;flex-direction:column;}
      .qmsg.qmsg-data-position-center,.qmsg.qmsg-data-position-left,.qmsg.qmsg-data-position-right{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);}
      .qmsg.qmsg-data-position-bottom,.qmsg.qmsg-data-position-bottomleft,.qmsg.qmsg-data-position-bottomright{position:fixed;top:unset;bottom:0;bottom:8px;left:50%;transform:translate(-50%,0);}
      .qmsg.qmsg-data-position-bottomleft .qmsg-item,.qmsg.qmsg-data-position-left .qmsg-item,.qmsg.qmsg-data-position-topleft .qmsg-item{text-align:left;}
      .qmsg.qmsg-data-position-bottom .qmsg-item,.qmsg.qmsg-data-position-center .qmsg-item,.qmsg.qmsg-data-position-top .qmsg-item{text-align:center;}
      .qmsg.qmsg-data-position-bottomright .qmsg-item,.qmsg.qmsg-data-position-right .qmsg-item,.qmsg.qmsg-data-position-topright .qmsg-item{text-align:right;}
      .qmsg .qmsg-item{position:relative;padding:8px;text-align:center;-webkit-animation-duration:.3s;animation-duration:.3s;}
      .qmsg .qmsg-item .qmsg-count{position:absolute;top:-4px;left:-4px;display:inline-block;height:16px;min-width:16px;border-radius:2px;background-color:red;color:#fff;text-align:center;font-size:12px;line-height:16px;-webkit-animation-duration:.3s;animation-duration:.3s;}
      .qmsg .qmsg-item:first-child{margin-top:-8px;}
      .qmsg .qmsg-content{position:relative;display:inline-block;padding:10px 12px;max-width:80%;min-width:40px;border-radius:4px;background:#fff;box-shadow:0 4px 12px rgba(0,0,0,.15);text-align:center;pointer-events:all;}
      .qmsg .qmsg-content [class^=qmsg-content-]{display:flex;align-items:center;}
      .qmsg .qmsg-icon{position:relative;top:1px;display:inline-block;margin-right:8px;color:inherit;vertical-align:-.125em;text-align:center;text-transform:none;font-style:normal;font-size:16px;line-height:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}
      .qmsg .qmsg-icon svg{display:inline-block;}
      .qmsg .qmsg-content .qmsg-show-more-content{display:flex;align-items:center;white-space:unset;overflow:unset;text-overflow:unset;padding-right:unset}
      .qmsg .qmsg-content-info .qmsg-icon{color:#1890ff;}
      .qmsg .qmsg-icon-close{margin:0;margin-left:8px;padding:0;outline:0;border:none;background-color:transparent;color:rgba(0,0,0,.45);font-size:12px;cursor:pointer;transition:color .3s;}
      .qmsg .qmsg-icon-close:hover>svg path{stroke:#555;}
      .qmsg .qmsg-icon-close.qmsg-show-more-content{position:unset;overflow:unset;padding-left:6px;margin-right:0}
      .qmsg .animate-turn{animation:MessageTurn 1s linear infinite;-webkit-animation:MessageTurn 1s linear infinite;}
      @keyframes MessageTurn{
            0%{-webkit-transform:rotate(0);}
            25%{-webkit-transform:rotate(90deg);}
            50%{-webkit-transform:rotate(180deg);}
            75%{-webkit-transform:rotate(270deg);}
            100%{-webkit-transform:rotate(360deg);}
      }
      @-webkit-keyframes MessageTurn{
            0%{-webkit-transform:rotate(0);}
            25%{-webkit-transform:rotate(90deg);}
            50%{-webkit-transform:rotate(180deg);}
            75%{-webkit-transform:rotate(270deg);}
            100%{-webkit-transform:rotate(360deg);}
      }
      @-webkit-keyframes MessageMoveOut{
            0%{max-height:150px;opacity:1;}
            to{max-height:0;opacity:0;}
      }
      @keyframes MessageMoveOut{
            0%{max-height:150px;opacity:1;}
            to{max-height:0;opacity:0;}
      }
      @-webkit-keyframes MessageMoveIn{
            0%{opacity:0;transform:translateY(-100%);transform-origin:0 0;}
            to{opacity:1;transform:translateY(0);transform-origin:0 0;}
      }
      @keyframes MessageMoveIn{
            0%{opacity:0;transform:translateY(-100%);transform-origin:0 0;}
            to{opacity:1;transform:translateY(0);transform-origin:0 0;}
      }
      @-webkit-keyframes MessageShake{
            0%,100%{opacity:1;transform:translateX(0);}
            25%,75%{opacity:.75;transform:translateX(-4px);}
            50%{opacity:.25;transform:translateX(4px);}
      }
      @keyframes MessageShake{
            0%,100%{opacity:1;transform:translateX(0);}
            25%,75%{opacity:.75;transform:translateX(-4px);}
            50%{opacity:.25;transform:translateX(4px);}
      }`
    ),
getStyleElement() {
      let $style = document.createElement("style");
      $style.setAttribute("type", "text/css");
      $style.setAttribute("data-type", QmsgDefaultConfig.PLUGIN_NAME);
      QmsgUtils.setSafeHTML($style, this.css);
      return $style;
    }
  };
  class QmsgMsg {
timeId = void 0;
startTime;
endTime;
setting;
uuid;
state;
repeatNum;
$Qmsg;
    constructor(config, uuid) {
      this.timeId = void 0;
      this.startTime = Date.now();
      this.endTime = null;
      this.setting = QmsgUtils.toDynamicObject(QmsgDefaultConfig.config, config, QmsgDefaultConfig.INS_DEFAULT);
      this.uuid = uuid;
      this.state = "opening";
      this.$Qmsg = document.createElement("div");
      this.repeatNum = 1;
      this.detectionType();
      this.init();
      let consoleLogContent = typeof this.setting.consoleLogContent === "function" ? this.setting.consoleLogContent(this) : this.setting.consoleLogContent;
      if (consoleLogContent) {
        console.log(this.setting.content);
      }
      if (typeof this.setting.afterRender === "function") {
        this.setting.afterRender(this);
      }
    }
getSetting() {
      return this.setting;
    }
getRepeatNum() {
      return this.repeatNum;
    }
setRepeatNum(num) {
      this.repeatNum = num;
    }
setRepeatNumIncreasing() {
      this.repeatNum++;
    }
init() {
      let QmsgContext = this;
      if (this.setting.customClass && typeof this.setting.customClass === "string") {
        this.$Qmsg.classList.add(this.setting.customClass);
      }
      let $svg = QmsgIcon[this.setting.type || "info"];
      let contentClassName = QmsgUtils.getNameSpacify("content-" + this.setting.type || "info");
      if (this.setting.showClose) {
        contentClassName += " " + QmsgUtils.getNameSpacify("content-with-close");
      }
      let content = this.setting.content || "";
      let extraCloseIconClassName = "";
      let $closeSvg = QmsgHeaderCloseIcon;
      if (this.setting.showMoreContent) {
        contentClassName += "qmsg-show-more-content";
        extraCloseIconClassName += "qmsg-show-more-content";
      }
      let $closeIcon = "";
      if (this.setting.showClose) {
        $closeIcon =
`<i class="qmsg-icon qmsg-icon-close ${extraCloseIconClassName}">${$closeSvg}</i>`;
      }
      let $content = document.createElement("span");
      let $positionClassName = QmsgUtils.getNameSpacify("data-position", this.setting.position.toLowerCase());
      let isHTML = this.setting.isHTML;
      if (isHTML) {
        QmsgUtils.setSafeHTML($content, content);
      } else {
        $content.innerText = content;
      }
      if (this.setting.isLimitWidth) {
        let limitWidthNum = this.setting.limitWidthNum;
        if (typeof limitWidthNum === "string") {
          if (QmsgUtils.isNumber(limitWidthNum)) {
            limitWidthNum = limitWidthNum + "px";
          }
        } else {
          limitWidthNum = limitWidthNum.toString() + "px";
        }
        $content.style.maxWidth = limitWidthNum;
        $content.style.width = limitWidthNum;
        if (this.setting.limitWidthWrap === "no-wrap") {
          $content.style.whiteSpace = "nowrap";
        } else if (this.setting.limitWidthWrap === "ellipsis") {
          $content.style.whiteSpace = "nowrap";
          $content.style.overflow = "hidden";
          $content.style.textOverflow = "ellipsis";
        } else if (this.setting.limitWidthWrap === "wrap") {
          $content.style.whiteSpace = "";
        }
      }
      QmsgUtils.setSafeHTML(
        this.$Qmsg,
`
			<div class="qmsg-content">
				<div class="${contentClassName}">
				${this.setting.showIcon ? `<i class="qmsg-icon">${$svg}</i>` : ""}
					${$content.outerHTML}
					${$closeIcon}
				</div>
			</div>
			`
      );
      let $contentContainer = this.$Qmsg.querySelector(".qmsg-content");
      this.$Qmsg.classList.add(QmsgUtils.getNameSpacify("item"));
      this.$Qmsg.setAttribute(QmsgUtils.getNameSpacify("uuid"), this.uuid);
      let $shadowContainer;
      let $shadowRoot;
      let $wrapper;
      $shadowContainer = document.querySelector(".qmsg-shadow-container");
      $shadowRoot = this.setting.useShadowRoot ? $shadowContainer?.shadowRoot : $shadowContainer;
      if (!$shadowContainer) {
        $shadowContainer = document.createElement("div");
        $shadowContainer.className = "qmsg-shadow-container";
        if (this.setting.useShadowRoot) {
          $shadowRoot = $shadowContainer.attachShadow({
            mode: this.setting.shadowRootMode
          });
        } else {
          $shadowRoot = $shadowContainer;
        }
        $shadowRoot.appendChild(QmsgCSS.getStyleElement());
        if (this.setting.style != null) {
          let __$ownStyle__ = document.createElement("style");
          __$ownStyle__.setAttribute("type", "text/css");
          __$ownStyle__.setAttribute("data-id", this.uuid);
          QmsgUtils.setSafeHTML(__$ownStyle__, this.setting.style);
          $contentContainer.insertAdjacentElement("afterend", __$ownStyle__);
        }
        this.setting.parent.appendChild($shadowContainer);
      }
      if ($shadowRoot == null) {
        throw new Error("QmsgInst " + QmsgDefaultConfig.PLUGIN_NAME + " $shadowRoot is null");
      }
      $wrapper = $shadowRoot.querySelector(`.${QmsgDefaultConfig.NAMESPACE}.${$positionClassName}`);
      if (!$wrapper) {
        $wrapper = document.createElement("div");
        $wrapper.classList.add(QmsgDefaultConfig.NAMESPACE, QmsgUtils.getNameSpacify("wrapper"), QmsgUtils.getNameSpacify("is-initialized"), $positionClassName);
        $shadowRoot.appendChild($wrapper);
      }
      if (this.setting.showReverse) {
        $wrapper.style.flexDirection = "column-reverse";
      } else {
        $wrapper.style.flexDirection = "column";
      }
      let zIndex = this.setting.zIndex;
      if (typeof zIndex === "function") {
        zIndex = zIndex();
      }
      if (!isNaN(zIndex)) {
        $wrapper.style.zIndex = zIndex.toString();
      }
      $wrapper.appendChild(this.$Qmsg);
      this.setState(this.$Qmsg, "opening");
      if (this.setting.showClose) {
        let $closeIcon2 = this.$Qmsg.querySelector(".qmsg-icon-close");
        if ($closeIcon2) {
          $closeIcon2.addEventListener("click", (evt) => {
            QmsgContext.close();
          });
        }
      }
      let animationendEvent = (event) => {
        let animationNameValue = QmsgAnimation.getStyleAnimationNameValue(QmsgContext.$Qmsg);
        if (animationNameValue === QmsgAnimation.$state.closing) {
          QmsgContext.endTime = Date.now();
          QmsgContext.destroy();
        }
        QmsgAnimation.setStyleAnimationName(QmsgContext.$Qmsg);
      };
      QmsgAnimation.$name.endNameList.forEach(function(animationendName) {
        QmsgContext.$Qmsg.addEventListener(animationendName, animationendEvent);
      });
      if (this.setting.autoClose && this.setting.listenEventToPauseAutoClose) {
        this.resetAutoCloseTimer();
        let enterEvent = (event) => {
          this.clearAutoCloseTimer();
        };
        let leaveEvent = (event) => {
          if (this.timeId != null) {
            console.warn("QmsgInst timeId is not null,mouseenter may be not first trigger,timeId:" + this.timeId);
            return;
          }
          this.startAutoCloseTimer();
        };
        let isRemoveMouseEvent = false;
        this.$Qmsg.addEventListener("mouseenter", enterEvent);
        this.$Qmsg.addEventListener("mouseleave", leaveEvent);
        this.$Qmsg.addEventListener("touchstart", (evt) => {
          if (!isRemoveMouseEvent) {
            isRemoveMouseEvent = true;
            this.$Qmsg.removeEventListener("mouseenter", enterEvent);
            this.$Qmsg.removeEventListener("mouseleave", leaveEvent);
          }
          enterEvent();
        });
        this.$Qmsg.addEventListener("touchend", leaveEvent);
        this.$Qmsg.addEventListener("touchcancel", leaveEvent);
      }
    }
detectionType() {
      if (this.setting.timeout != null && typeof this.setting.timeout === "string") {
        this.setting.timeout = parseInt(this.setting.timeout);
      }
      if (isNaN(this.setting.timeout)) {
        this.setting.timeout = QmsgDefaultConfig.config.timeout;
      }
      if (!(this.setting.timeout != null && parseInt(this.setting.timeout.toString()) >= 0 && parseInt(this.setting.timeout.toString()) <= Number.MAX_VALUE)) {
        this.setting.timeout = QmsgDefaultConfig.config.timeout;
      }
      if (typeof this.setting.zIndex === "function") {
        this.setting.zIndex = this.setting.zIndex();
      }
      if (this.setting.zIndex != null && typeof this.setting.zIndex === "string") {
        this.setting.zIndex = parseInt(this.setting.zIndex);
      }
      if (isNaN(this.setting.zIndex)) {
        this.setting.zIndex = typeof QmsgDefaultConfig.config.zIndex === "function" ? QmsgDefaultConfig.config.zIndex() : QmsgDefaultConfig.config.zIndex;
      }
    }
setState(element, state) {
      if (!state || !QmsgAnimation.$state[state])
        return;
      this.state = state;
      QmsgAnimation.setStyleAnimationName(element, QmsgAnimation.$state[state]);
    }
setMsgCount() {
      let countClassName = QmsgUtils.getNameSpacify("count");
      let wrapperClassName = `div.${QmsgUtils.getNameSpacify("data-position", this.setting.position.toLowerCase())} [class^="qmsg-content-"]`;
      let $content = this.$Qmsg.querySelector(wrapperClassName);
      if (!$content) {
        throw new Error("QmsgInst $content is null");
      }
      let $count = $content.querySelector("." + countClassName);
      if (!$count) {
        $count = document.createElement("span");
        $count.classList.add(countClassName);
        $content.appendChild($count);
      }
      let repeatNum = this.getRepeatNum();
      QmsgUtils.setSafeHTML($count, repeatNum.toString());
      QmsgAnimation.setStyleAnimationName($count);
      QmsgAnimation.setStyleAnimationName($count, "MessageShake");
      this.resetAutoCloseTimer();
    }
clearAutoCloseTimer() {
      QmsgUtils.clearTimeout(this.timeId);
      this.timeId = void 0;
      this.startTime = null;
      this.endTime = null;
    }
startAutoCloseTimer() {
      if (this.setting.autoClose && this.setting.listenEventToPauseAutoClose) {
        this.startTime = Date.now();
        this.endTime = null;
        this.timeId = QmsgUtils.setTimeout(() => {
          this.close();
        }, this.setting.timeout);
      }
    }
resetAutoCloseTimer() {
      this.clearAutoCloseTimer();
      this.startAutoCloseTimer();
    }
close() {
      this.setState(this.$Qmsg, "closing");
      if (QmsgAnimation.CAN_ANIMATION) {
        QmsgInstStorage.remove(this.uuid);
      } else {
        this.destroy();
      }
      let onCloseCallBack = this.setting.onClose;
      if (onCloseCallBack && typeof onCloseCallBack === "function") {
        onCloseCallBack.call(this);
      }
    }
destroy() {
      this.endTime = Date.now();
      this.$Qmsg.remove();
      QmsgUtils.clearTimeout(this.timeId);
      QmsgInstStorage.remove(this.uuid);
      this.timeId = void 0;
    }
get $content() {
      let $content = this.$Qmsg.querySelector("div[class^=qmsg-content-] > span");
      if (!$content) {
        throw new Error("QmsgInst $content is null");
      }
      return $content;
    }
setText(text) {
      let $content = this.$content;
      $content.innerText = text;
      this.setting.content = text;
    }
setHTML(text) {
      let $content = this.$content;
      QmsgUtils.setSafeHTML($content, text);
      this.setting.content = text;
    }
  }
  function QmsgInstHandler(config = {}) {
    let optionString = JSON.stringify(config);
    let findQmsgItemInfo = QmsgInstStorage.insInfoList.find((item) => {
      return item.config === optionString;
    });
    let QmsgInstance = findQmsgItemInfo?.instance;
    if (QmsgInstance == null) {
      let uuid = QmsgUtils.getUUID();
      let qmsgInstStorageInfo = {
        uuid,
        config: optionString,
        instance: new QmsgMsg(config, uuid)
      };
      QmsgInstStorage.insInfoList.push(qmsgInstStorageInfo);
      let QmsgListLength = QmsgInstStorage.insInfoList.length;
      let maxNums = qmsgInstStorageInfo.instance.getSetting().maxNums;
      if (QmsgListLength > maxNums) {
        for (let index = 0; index < QmsgListLength - maxNums; index++) {
          let item = QmsgInstStorage.insInfoList[index];
          item && item.instance.getSetting().autoClose && item.instance.close();
        }
      }
      findQmsgItemInfo = qmsgInstStorageInfo;
      QmsgInstance = qmsgInstStorageInfo.instance;
    } else {
      if (!QmsgInstance.getRepeatNum()) {
        QmsgInstance.setRepeatNum(2);
      } else {
        if (QmsgInstance.getRepeatNum() >= 99) ;
        else {
          QmsgInstance.setRepeatNumIncreasing();
        }
      }
      QmsgInstance.setMsgCount();
    }
    if (QmsgInstance) {
      QmsgInstance.$Qmsg.setAttribute("data-count", QmsgInstance?.getRepeatNum().toString());
    } else {
      throw new Error("QmsgInst is null");
    }
    return QmsgInstance;
  }
  const QmsgEvent = {
    visibilitychange: {
      eventConfig: {
callback() {
          if (document.visibilityState === "visible") {
            for (let index = 0; index < QmsgInstStorage.insInfoList.length; index++) {
              let qmsgInst = QmsgInstStorage.insInfoList[index];
              if (
qmsgInst.instance.setting.type !== "loading" && qmsgInst.instance.endTime == null && qmsgInst.instance.startTime != null && Date.now() - qmsgInst.instance.startTime >= qmsgInst.instance.getSetting().timeout
              ) {
                qmsgInst.instance.close();
              }
            }
          }
        },
        option: {
          capture: true
        }
      },
      addEvent() {
        if ("visibilityState" in document) {
          document.addEventListener("visibilitychange", QmsgEvent.visibilitychange.eventConfig.callback, QmsgEvent.visibilitychange.eventConfig.option);
        } else {
          console.error("Qmsg addEvent visibilityState not support");
        }
      },
      removeEvent() {
        document.removeEventListener("visibilitychange", QmsgEvent.visibilitychange.eventConfig.callback, QmsgEvent.visibilitychange.eventConfig.option);
      }
    }
  };
  CompatibleProcessing();
  class Qmsg {
$data;
$eventUtils;
constructor(config) {
      this.$data = {
        version: "2025.7.28",
        config: QmsgDefaultConfig,
        icon: QmsgIcon,
        instanceStorage: QmsgInstStorage
      };
      this.$eventUtils = QmsgEvent;
      this.$eventUtils.visibilitychange.addEvent();
      this.config(config);
    }
config(config) {
      if (config == null)
        return;
      if (typeof config !== "object")
        return;
      QmsgDefaultConfig.INS_DEFAULT = null;
      QmsgDefaultConfig.INS_DEFAULT = config;
    }
    info(content, config) {
      let params = QmsgUtils.mergeArgs(content, config);
      params.type = "info";
      return QmsgInstHandler.call(this, params);
    }
    warning(content, config) {
      let params = QmsgUtils.mergeArgs(content, config);
      params.type = "warning";
      return QmsgInstHandler.call(this, params);
    }
    success(content, config) {
      let params = QmsgUtils.mergeArgs(content, config);
      params.type = "success";
      return QmsgInstHandler.call(this, params);
    }
    error(content, config) {
      let params = QmsgUtils.mergeArgs(content, config);
      params.type = "error";
      return QmsgInstHandler.call(this, params);
    }
    loading(content, config) {
      let params = QmsgUtils.mergeArgs(content, config);
      params.type = "loading";
      params.autoClose = false;
      return QmsgInstHandler.call(this, params);
    }
remove(uuid) {
      QmsgInstStorage.remove(uuid);
    }
closeAll() {
      for (let index = QmsgInstStorage.insInfoList.length - 1; index >= 0; index--) {
        let item = QmsgInstStorage.insInfoList[index];
        item && item.instance && item.instance.close();
      }
    }
  }
  let qmsg = new Qmsg();
  let WindowApi$1 = class WindowApi {
defaultApi = {
      document,
      window,
      globalThis,
      self,
      top,
      setTimeout: globalThis.setTimeout.bind(globalThis),
      setInterval: globalThis.setInterval.bind(globalThis),
      clearTimeout: globalThis.clearTimeout.bind(globalThis),
      clearInterval: globalThis.clearInterval.bind(globalThis)
    };
api;
    constructor(option) {
      if (option) {
        if (option.globalThis == null) {
          option.globalThis = option.window;
        }
        if (option.self == null) {
          option.self = option.window;
        }
      }
      if (!option) {
        option = Object.assign({}, this.defaultApi);
      }
      this.api = Object.assign({}, option);
    }
    get document() {
      return this.api.document;
    }
    get window() {
      return this.api.window;
    }
    get globalThis() {
      return this.api.globalThis;
    }
    get self() {
      return this.api.self;
    }
    get top() {
      return this.api.top;
    }
    get setTimeout() {
      return this.api.setTimeout;
    }
    get clearTimeout() {
      return this.api.clearTimeout;
    }
    get setInterval() {
      return this.api.setInterval;
    }
    get clearInterval() {
      return this.api.clearInterval;
    }
  };
  const createCache$2 = (lastNumberWeakMap) => {
    return (collection, nextNumber) => {
      lastNumberWeakMap.set(collection, nextNumber);
      return nextNumber;
    };
  };
  const MAX_SAFE_INTEGER$2 = Number.MAX_SAFE_INTEGER === void 0 ? 9007199254740991 : Number.MAX_SAFE_INTEGER;
  const TWO_TO_THE_POWER_OF_TWENTY_NINE$2 = 536870912;
  const TWO_TO_THE_POWER_OF_THIRTY$2 = TWO_TO_THE_POWER_OF_TWENTY_NINE$2 * 2;
  const createGenerateUniqueNumber$2 = (cache2, lastNumberWeakMap) => {
    return (collection) => {
      const lastNumber = lastNumberWeakMap.get(collection);
      let nextNumber = lastNumber === void 0 ? collection.size : lastNumber < TWO_TO_THE_POWER_OF_THIRTY$2 ? lastNumber + 1 : 0;
      if (!collection.has(nextNumber)) {
        return cache2(collection, nextNumber);
      }
      if (collection.size < TWO_TO_THE_POWER_OF_TWENTY_NINE$2) {
        while (collection.has(nextNumber)) {
          nextNumber = Math.floor(Math.random() * TWO_TO_THE_POWER_OF_THIRTY$2);
        }
        return cache2(collection, nextNumber);
      }
      if (collection.size > MAX_SAFE_INTEGER$2) {
        throw new Error("Congratulations, you created a collection of unique numbers which uses all available integers!");
      }
      while (collection.has(nextNumber)) {
        nextNumber = Math.floor(Math.random() * MAX_SAFE_INTEGER$2);
      }
      return cache2(collection, nextNumber);
    };
  };
  const LAST_NUMBER_WEAK_MAP$2 = new WeakMap();
  const cache$2 = createCache$2(LAST_NUMBER_WEAK_MAP$2);
  const generateUniqueNumber$2 = createGenerateUniqueNumber$2(cache$2, LAST_NUMBER_WEAK_MAP$2);
  const isMessagePort$2 = (sender) => {
    return typeof sender.start === "function";
  };
  const PORT_MAP$2 = new WeakMap();
  const extendBrokerImplementation$2 = (partialBrokerImplementation) => ({
    ...partialBrokerImplementation,
    connect: ({ call }) => {
      return async () => {
        const { port1, port2 } = new MessageChannel();
        const portId = await call("connect", { port: port1 }, [port1]);
        PORT_MAP$2.set(port2, portId);
        return port2;
      };
    },
    disconnect: ({ call }) => {
      return async (port) => {
        const portId = PORT_MAP$2.get(port);
        if (portId === void 0) {
          throw new Error("The given port is not connected.");
        }
        await call("disconnect", { portId });
      };
    },
    isSupported: ({ call }) => {
      return () => call("isSupported");
    }
  });
  const ONGOING_REQUESTS$2 = new WeakMap();
  const createOrGetOngoingRequests$2 = (sender) => {
    if (ONGOING_REQUESTS$2.has(sender)) {
      return ONGOING_REQUESTS$2.get(sender);
    }
    const ongoingRequests = new Map();
    ONGOING_REQUESTS$2.set(sender, ongoingRequests);
    return ongoingRequests;
  };
  const createBroker$2 = (brokerImplementation) => {
    const fullBrokerImplementation = extendBrokerImplementation$2(brokerImplementation);
    return (sender) => {
      const ongoingRequests = createOrGetOngoingRequests$2(sender);
      sender.addEventListener("message", (({ data: message }) => {
        const { id } = message;
        if (id !== null && ongoingRequests.has(id)) {
          const { reject, resolve } = ongoingRequests.get(id);
          ongoingRequests.delete(id);
          if (message.error === void 0) {
            resolve(message.result);
          } else {
            reject(new Error(message.error.message));
          }
        }
      }));
      if (isMessagePort$2(sender)) {
        sender.start();
      }
      const call = (method, params = null, transferables = []) => {
        return new Promise((resolve, reject) => {
          const id = generateUniqueNumber$2(ongoingRequests);
          ongoingRequests.set(id, { reject, resolve });
          if (params === null) {
            sender.postMessage({ id, method }, transferables);
          } else {
            sender.postMessage({ id, method, params }, transferables);
          }
        });
      };
      const notify = (method, params, transferables = []) => {
        sender.postMessage({ id: null, method, params }, transferables);
      };
      let functions = {};
      for (const [key, handler] of Object.entries(fullBrokerImplementation)) {
        functions = { ...functions, [key]: handler({ call, notify }) };
      }
      return { ...functions };
    };
  };
  const scheduledIntervalsState$2 = new Map([[0, null]]);
  const scheduledTimeoutsState$2 = new Map([[0, null]]);
  const wrap$2 = createBroker$2({
    clearInterval: ({ call }) => {
      return (timerId) => {
        if (typeof scheduledIntervalsState$2.get(timerId) === "symbol") {
          scheduledIntervalsState$2.set(timerId, null);
          call("clear", { timerId, timerType: "interval" }).then(() => {
            scheduledIntervalsState$2.delete(timerId);
          });
        }
      };
    },
    clearTimeout: ({ call }) => {
      return (timerId) => {
        if (typeof scheduledTimeoutsState$2.get(timerId) === "symbol") {
          scheduledTimeoutsState$2.set(timerId, null);
          call("clear", { timerId, timerType: "timeout" }).then(() => {
            scheduledTimeoutsState$2.delete(timerId);
          });
        }
      };
    },
    setInterval: ({ call }) => {
      return (func, delay = 0, ...args) => {
        const symbol = Symbol();
        const timerId = generateUniqueNumber$2(scheduledIntervalsState$2);
        scheduledIntervalsState$2.set(timerId, symbol);
        const schedule = () => call("set", {
          delay,
          now: performance.timeOrigin + performance.now(),
          timerId,
          timerType: "interval"
        }).then(() => {
          const state = scheduledIntervalsState$2.get(timerId);
          if (state === void 0) {
            throw new Error("The timer is in an undefined state.");
          }
          if (state === symbol) {
            func(...args);
            if (scheduledIntervalsState$2.get(timerId) === symbol) {
              schedule();
            }
          }
        });
        schedule();
        return timerId;
      };
    },
    setTimeout: ({ call }) => {
      return (func, delay = 0, ...args) => {
        const symbol = Symbol();
        const timerId = generateUniqueNumber$2(scheduledTimeoutsState$2);
        scheduledTimeoutsState$2.set(timerId, symbol);
        call("set", {
          delay,
          now: performance.timeOrigin + performance.now(),
          timerId,
          timerType: "timeout"
        }).then(() => {
          const state = scheduledTimeoutsState$2.get(timerId);
          if (state === void 0) {
            throw new Error("The timer is in an undefined state.");
          }
          if (state === symbol) {
            scheduledTimeoutsState$2.delete(timerId);
            func(...args);
          }
        });
        return timerId;
      };
    }
  });
  const load$2 = (url) => {
    const worker2 = new Worker(url);
    return wrap$2(worker2);
  };
  const createLoadOrReturnBroker$2 = (loadBroker, worker2) => {
    let broker = null;
    return () => {
      if (broker !== null) {
        return broker;
      }
      const blob = new Blob([worker2], { type: "application/javascript; charset=utf-8" });
      const url = URL.createObjectURL(blob);
      broker = loadBroker(url);
      setTimeout(() => URL.revokeObjectURL(url));
      return broker;
    };
  };
  const worker$2 = `(()=>{var e={455:function(e,t){!function(e){"use strict";var t=function(e){return function(t){var r=e(t);return t.add(r),r}},r=function(e){return function(t,r){return e.set(t,r),r}},n=void 0===Number.MAX_SAFE_INTEGER?9007199254740991:Number.MAX_SAFE_INTEGER,o=536870912,s=2*o,a=function(e,t){return function(r){var a=t.get(r),i=void 0===a?r.size:a<s?a+1:0;if(!r.has(i))return e(r,i);if(r.size<o){for(;r.has(i);)i=Math.floor(Math.random()*s);return e(r,i)}if(r.size>n)throw new Error("Congratulations, you created a collection of unique numbers which uses all available integers!");for(;r.has(i);)i=Math.floor(Math.random()*n);return e(r,i)}},i=new WeakMap,u=r(i),c=a(u,i),l=t(c);e.addUniqueNumber=l,e.generateUniqueNumber=c}(t)}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var s=t[n]={exports:{}};return e[n].call(s.exports,s,s.exports,r),s.exports}(()=>{"use strict";const e=-32603,t=-32602,n=-32601,o=(e,t)=>Object.assign(new Error(e),{status:t}),s=t=>o('The handler of the method called "'.concat(t,'" returned an unexpected result.'),e),a=(t,r)=>async({data:{id:a,method:i,params:u}})=>{const c=r[i];try{if(void 0===c)throw(e=>o('The requested method called "'.concat(e,'" is not supported.'),n))(i);const r=void 0===u?c():c(u);if(void 0===r)throw(t=>o('The handler of the method called "'.concat(t,'" returned no required result.'),e))(i);const l=r instanceof Promise?await r:r;if(null===a){if(void 0!==l.result)throw s(i)}else{if(void 0===l.result)throw s(i);const{result:e,transferables:r=[]}=l;t.postMessage({id:a,result:e},r)}}catch(e){const{message:r,status:n=-32603}=e;t.postMessage({error:{code:n,message:r},id:a})}};var i=r(455);const u=new Map,c=(e,r,n)=>({...r,connect:({port:t})=>{t.start();const n=e(t,r),o=(0,i.generateUniqueNumber)(u);return u.set(o,()=>{n(),t.close(),u.delete(o)}),{result:o}},disconnect:({portId:e})=>{const r=u.get(e);if(void 0===r)throw(e=>o('The specified parameter called "portId" with the given value "'.concat(e,'" does not identify a port connected to this worker.'),t))(e);return r(),{result:null}},isSupported:async()=>{if(await new Promise(e=>{const t=new ArrayBuffer(0),{port1:r,port2:n}=new MessageChannel;r.onmessage=({data:t})=>e(null!==t),n.postMessage(t,[t])})){const e=n();return{result:e instanceof Promise?await e:e}}return{result:!1}}}),l=(e,t,r=()=>!0)=>{const n=c(l,t,r),o=a(e,n);return e.addEventListener("message",o),()=>e.removeEventListener("message",o)},d=(e,t)=>r=>{const n=t.get(r);if(void 0===n)return Promise.resolve(!1);const[o,s]=n;return e(o),t.delete(r),s(!1),Promise.resolve(!0)},f=(e,t,r,n)=>(o,s,a)=>{const i=o+s-t.timeOrigin,u=i-t.now();return new Promise(t=>{e.set(a,[r(n,u,i,e,t,a),t])})},m=new Map,h=d(globalThis.clearTimeout,m),p=new Map,v=d(globalThis.clearTimeout,p),w=((e,t)=>{const r=(n,o,s,a)=>{const i=n-e.now();i>0?o.set(a,[t(r,i,n,o,s,a),s]):(o.delete(a),s(!0))};return r})(performance,globalThis.setTimeout),g=f(m,performance,globalThis.setTimeout,w),T=f(p,performance,globalThis.setTimeout,w);l(self,{clear:async({timerId:e,timerType:t})=>({result:await("interval"===t?h(e):v(e))}),set:async({delay:e,now:t,timerId:r,timerType:n})=>({result:await("interval"===n?g:T)(e,t,r)})})})()})();`;
  const loadOrReturnBroker$2 = createLoadOrReturnBroker$2(load$2, worker$2);
  const clearInterval$1$1 = (timerId) => loadOrReturnBroker$2().clearInterval(timerId);
  const clearTimeout$1$2 = (timerId) => loadOrReturnBroker$2().clearTimeout(timerId);
  const setInterval$1$1 = (...args) => loadOrReturnBroker$2().setInterval(...args);
  const setTimeout$1$2 = (...args) => loadOrReturnBroker$2().setTimeout(...args);
  const DOMUtilsCommonUtils = {
    windowApi: new WindowApi$1({
      document,
      window,
      top,
      setTimeout,
      clearTimeout,
      setInterval,
      clearInterval
    }),
isShow(element) {
      return Boolean(element.getClientRects().length);
    },
getSafeHTML(text) {
      if (globalThis.trustedTypes) {
        const policy = globalThis.trustedTypes.createPolicy("safe-innerHTML", {
          createHTML: (html) => html
        });
        return policy.createHTML(text);
      } else {
        return text;
      }
    },
setSafeHTML($el, text) {
      $el.innerHTML = this.getSafeHTML(text);
    },
showElement(element) {
      let dupNode = element.cloneNode(true);
      dupNode.setAttribute("style", "visibility: hidden !important;display:block !important;");
      this.windowApi.document.documentElement.appendChild(dupNode);
      return {
recovery() {
          dupNode.remove();
        }
      };
    },
getStyleValue(element, styleName) {
      let view = null;
      let styles = null;
      if (element instanceof CSSStyleDeclaration) {
        styles = element;
      } else {
        view = element.ownerDocument.defaultView;
        if (!view || !view.opener) {
          view = window;
        }
        styles = view.getComputedStyle(element);
      }
      let value = parseFloat(styles[styleName]);
      if (isNaN(value)) {
        return 0;
      } else {
        return value;
      }
    },
isWin(target) {
      if (typeof target !== "object") {
        return false;
      }
      if (target instanceof Node) {
        return false;
      }
      if (target === globalThis) {
        return true;
      }
      if (target === window) {
        return true;
      }
      if (target === self) {
        return true;
      }
      if (target === globalThis) {
        return true;
      }
      if (target === window) {
        return true;
      }
      if (target === self) {
        return true;
      }
      if (typeof unsafeWindow !== "undefined" && target === unsafeWindow) {
        return true;
      }
      if (target?.Math?.toString() !== "[object Math]") {
        return false;
      }
      return true;
    },
delete(target, propName) {
      if (typeof Reflect === "object" && Reflect.deleteProperty) {
        Reflect.deleteProperty(target, propName);
      } else {
        delete target[propName];
      }
    },
setTimeout(callback, timeout = 0) {
      try {
        return setTimeout$1$2(callback, timeout);
      } catch (error) {
        return this.windowApi.setTimeout(callback, timeout);
      }
    },
clearTimeout(timeId) {
      try {
        if (timeId != null) {
          clearTimeout$1$2(timeId);
        }
      } catch (error) {
      } finally {
        this.windowApi.clearTimeout(timeId);
      }
    },
setInterval(callback, timeout = 0) {
      try {
        return setInterval$1$1(callback, timeout);
      } catch (error) {
        return this.windowApi.setInterval(callback, timeout);
      }
    },
clearInterval(timeId) {
      try {
        if (timeId != null) {
          clearInterval$1$1(timeId);
        }
      } catch (error) {
      } finally {
        this.windowApi.clearInterval(timeId);
      }
    },
isNodeList($ele) {
      return Array.isArray($ele) || $ele instanceof NodeList;
    },
getAnimationEndNameList() {
      return ["webkitAnimationEnd", "mozAnimationEnd", "MSAnimationEnd", "oanimationend", "animationend"];
    },
getTransitionEndNameList() {
      return ["webkitTransitionEnd", "mozTransitionEnd", "MSTransitionEnd", "otransitionend", "transitionend"];
    }
  };
  const DOMUtilsData = {
SymbolEvents: Symbol("events_" + ((1 + Math.random()) * 65536 | 0).toString(16).substring(1))
  };
  const OriginPrototype$1 = {
    Object: {
      defineProperty: Object.defineProperty
    }
  };
  class DOMUtilsEvent {
    windowApi;
    constructor(windowApiOption) {
      this.windowApi = new WindowApi$1(windowApiOption);
    }
    on(element, eventType, selector, callback, option) {
      function getOption(args2, startIndex, option2) {
        let currentParam = args2[startIndex];
        if (typeof currentParam === "boolean") {
          option2.capture = currentParam;
          if (typeof args2[startIndex + 1] === "boolean") {
            option2.once = args2[startIndex + 1];
          }
          if (typeof args2[startIndex + 2] === "boolean") {
            option2.passive = args2[startIndex + 2];
          }
        } else if (typeof currentParam === "object" && ("capture" in currentParam || "once" in currentParam || "passive" in currentParam || "isComposedPath" in currentParam)) {
          option2.capture = currentParam.capture;
          option2.once = currentParam.once;
          option2.passive = currentParam.passive;
          option2.isComposedPath = currentParam.isComposedPath;
        }
        return option2;
      }
      let DOMUtilsContext = this;
      let args = arguments;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      let elementList = [];
      if (element instanceof NodeList || Array.isArray(element)) {
        element = element;
        elementList = [...element];
      } else {
        elementList.push(element);
      }
      let eventTypeList = [];
      if (Array.isArray(eventType)) {
        eventTypeList = eventTypeList.concat(eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== ""));
      } else if (typeof eventType === "string") {
        eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
      }
      let selectorList = [];
      if (Array.isArray(selector)) {
        selectorList = selectorList.concat(selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== ""));
      } else if (typeof selector === "string") {
        selectorList.push(selector);
      }
      let listenerCallBack = callback;
      let listenerOption = {
        capture: false,
        once: false,
        passive: false,
        isComposedPath: false
      };
      if (typeof selector === "function") {
        listenerCallBack = selector;
        listenerOption = getOption(args, 3, listenerOption);
      } else {
        listenerOption = getOption(args, 4, listenerOption);
      }
      function checkOptionOnceToRemoveEventListener() {
        if (listenerOption.once) {
          DOMUtilsContext.off(element, eventType, selector, callback, option);
        }
      }
      elementList.forEach((elementItem) => {
        function domUtilsEventCallBack(event) {
          if (selectorList.length) {
            let eventTarget = listenerOption.isComposedPath ? event.composedPath()[0] : event.target;
            let totalParent = elementItem;
            if (DOMUtilsCommonUtils.isWin(totalParent)) {
              if (totalParent === DOMUtilsContext.windowApi.document) {
                totalParent = DOMUtilsContext.windowApi.document.documentElement;
              }
            }
            let findValue = selectorList.find((selectorItem) => {
              if (DOMUtilsContext.matches(eventTarget, selectorItem)) {
                return true;
              }
              let $closestMatches = DOMUtilsContext.closest(eventTarget, selectorItem);
              if ($closestMatches && totalParent?.contains($closestMatches)) {
                eventTarget = $closestMatches;
                return true;
              }
              return false;
            });
            if (findValue) {
              try {
                OriginPrototype$1.Object.defineProperty(event, "target", {
                  get() {
                    return eventTarget;
                  }
                });
              } catch (error) {
              }
              listenerCallBack.call(eventTarget, event, eventTarget);
              checkOptionOnceToRemoveEventListener();
            }
          } else {
            listenerCallBack.call(elementItem, event);
            checkOptionOnceToRemoveEventListener();
          }
        }
        eventTypeList.forEach((eventName) => {
          elementItem.addEventListener(eventName, domUtilsEventCallBack, listenerOption);
          let elementEvents = Reflect.get(elementItem, DOMUtilsData.SymbolEvents) || {};
          elementEvents[eventName] = elementEvents[eventName] || [];
          elementEvents[eventName].push({
            selector: selectorList,
            option: listenerOption,
            callback: domUtilsEventCallBack,
            originCallBack: listenerCallBack
          });
          Reflect.set(elementItem, DOMUtilsData.SymbolEvents, elementEvents);
        });
      });
    }
    off(element, eventType, selector, callback, option, filter) {
      function getOption(args1, startIndex, option2) {
        let currentParam = args1[startIndex];
        if (typeof currentParam === "boolean") {
          option2.capture = currentParam;
        } else if (typeof currentParam === "object" && "capture" in currentParam) {
          option2.capture = currentParam.capture;
        }
        return option2;
      }
      let DOMUtilsContext = this;
      let args = arguments;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      let elementList = [];
      if (element instanceof NodeList || Array.isArray(element)) {
        element = element;
        elementList = [...element];
      } else {
        elementList.push(element);
      }
      let eventTypeList = [];
      if (Array.isArray(eventType)) {
        eventTypeList = eventTypeList.concat(eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== ""));
      } else if (typeof eventType === "string") {
        eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
      }
      let selectorList = [];
      if (Array.isArray(selector)) {
        selectorList = selectorList.concat(selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== ""));
      } else if (typeof selector === "string") {
        selectorList.push(selector);
      }
      let listenerCallBack = callback;
      let listenerOption = {
        capture: false
      };
      if (typeof selector === "function") {
        listenerCallBack = selector;
        listenerOption = getOption(args, 3, listenerOption);
      } else {
        listenerOption = getOption(args, 4, listenerOption);
      }
      let isRemoveAll = false;
      if (args.length === 2) {
        isRemoveAll = true;
      } else if (args.length === 3 && typeof args[2] === "string" || Array.isArray(args[2])) {
        isRemoveAll = true;
      }
      elementList.forEach((elementItem) => {
        let elementEvents = Reflect.get(elementItem, DOMUtilsData.SymbolEvents) || {};
        eventTypeList.forEach((eventName) => {
          let handlers = elementEvents[eventName] || [];
          if (typeof filter === "function") {
            handlers = handlers.filter(filter);
          }
          for (let index = 0; index < handlers.length; index++) {
            let handler = handlers[index];
            let flag = true;
            if (flag && listenerCallBack && handler.originCallBack !== listenerCallBack) {
              flag = false;
            }
            if (flag && selectorList.length && Array.isArray(handler.selector)) {
              if (JSON.stringify(handler.selector) !== JSON.stringify(selectorList)) {
                flag = false;
              }
            }
            if (flag && listenerOption.capture !== handler.option.capture) {
              flag = false;
            }
            if (flag || isRemoveAll) {
              elementItem.removeEventListener(eventName, handler.callback, handler.option);
              handlers.splice(index--, 1);
            }
          }
          if (handlers.length === 0) {
            DOMUtilsCommonUtils.delete(elementEvents, eventType);
          }
        });
        Reflect.set(elementItem, DOMUtilsData.SymbolEvents, elementEvents);
      });
    }
offAll(element, eventType) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      let elementList = [];
      if (element instanceof NodeList || Array.isArray(element)) {
        elementList = [...element];
      } else {
        elementList.push(element);
      }
      let eventTypeList = [];
      if (Array.isArray(eventType)) {
        eventTypeList = eventTypeList.concat(eventType);
      } else if (typeof eventType === "string") {
        eventTypeList = eventTypeList.concat(eventType.split(" "));
      }
      elementList.forEach((elementItem) => {
        Object.getOwnPropertySymbols(elementItem).forEach((symbolEvents) => {
          if (!symbolEvents.toString().startsWith("Symbol(events_")) {
            return;
          }
          let elementEvents = elementItem[symbolEvents] || {};
          let iterEventNameList = eventTypeList.length ? eventTypeList : Object.keys(elementEvents);
          iterEventNameList.forEach((eventName) => {
            let handlers = elementEvents[eventName];
            if (!handlers) {
              return;
            }
            for (const handler of handlers) {
              elementItem.removeEventListener(eventName, handler.callback, {
                capture: handler["option"]["capture"]
              });
            }
            let events = Reflect.get(elementItem, symbolEvents);
            DOMUtilsCommonUtils.delete(events, eventName);
          });
        });
      });
    }
ready(callback) {
      if (typeof callback !== "function") {
        return;
      }
      let DOMUtilsContext = this;
      function checkDOMReadyState() {
        try {
          if (DOMUtilsContext.windowApi.document.readyState === "complete" || DOMUtilsContext.windowApi.document.readyState !== "loading" && !DOMUtilsContext.windowApi.document.documentElement.doScroll) {
            return true;
          } else {
            return false;
          }
        } catch (error) {
          return false;
        }
      }
      function completed() {
        removeDomReadyListener();
        callback();
      }
      let targetList = [
        {
          target: DOMUtilsContext.windowApi.document,
          eventType: "DOMContentLoaded",
          callback: completed
        },
        {
          target: DOMUtilsContext.windowApi.window,
          eventType: "load",
          callback: completed
        }
      ];
      function addDomReadyListener() {
        for (let index = 0; index < targetList.length; index++) {
          let item = targetList[index];
          item.target.addEventListener(item.eventType, item.callback);
        }
      }
      function removeDomReadyListener() {
        for (let index = 0; index < targetList.length; index++) {
          let item = targetList[index];
          item.target.removeEventListener(item.eventType, item.callback);
        }
      }
      if (checkDOMReadyState()) {
        DOMUtilsCommonUtils.setTimeout(callback);
      } else {
        addDomReadyListener();
      }
    }
trigger(element, eventType, details, useDispatchToTriggerEvent = true) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      let elementList = [];
      if (element instanceof NodeList || Array.isArray(element)) {
        element = element;
        elementList = [...element];
      } else {
        elementList = [element];
      }
      let eventTypeList = [];
      if (Array.isArray(eventType)) {
        eventTypeList = eventType;
      } else if (typeof eventType === "string") {
        eventTypeList = eventType.split(" ");
      }
      elementList.forEach((elementItem) => {
        let events = elementItem[DOMUtilsData.SymbolEvents] || {};
        eventTypeList.forEach((_eventType_) => {
          let event = null;
          if (details && details instanceof Event) {
            event = details;
          } else {
            event = new Event(_eventType_);
            if (details) {
              Object.keys(details).forEach((keyName) => {
                event[keyName] = details[keyName];
              });
            }
          }
          if (useDispatchToTriggerEvent == false && _eventType_ in events) {
            events[_eventType_].forEach((eventsItem) => {
              eventsItem.callback(event);
            });
          } else {
            elementItem.dispatchEvent(event);
          }
        });
      });
    }
click(element, handler, details, useDispatchToTriggerEvent) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.click($ele, handler, details, useDispatchToTriggerEvent);
        });
        return;
      }
      if (handler == null) {
        DOMUtilsContext.trigger(element, "click", details, useDispatchToTriggerEvent);
      } else {
        DOMUtilsContext.on(element, "click", null, handler);
      }
    }
blur(element, handler, details, useDispatchToTriggerEvent) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.focus($ele, handler, details, useDispatchToTriggerEvent);
        });
        return;
      }
      if (handler === null) {
        DOMUtilsContext.trigger(element, "blur", details, useDispatchToTriggerEvent);
      } else {
        DOMUtilsContext.on(element, "blur", null, handler);
      }
    }
focus(element, handler, details, useDispatchToTriggerEvent) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.focus($ele, handler, details, useDispatchToTriggerEvent);
        });
        return;
      }
      if (handler == null) {
        DOMUtilsContext.trigger(element, "focus", details, useDispatchToTriggerEvent);
      } else {
        DOMUtilsContext.on(element, "focus", null, handler);
      }
    }
hover(element, handler, option) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.hover($ele, handler, option);
        });
        return;
      }
      DOMUtilsContext.on(element, "mouseenter", null, handler, option);
      DOMUtilsContext.on(element, "mouseleave", null, handler, option);
    }
animationend(element, handler, option) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      const defaultOption = {
        once: true
      };
      Object.assign(defaultOption, option || {});
      const eventNameList = DOMUtilsCommonUtils.getAnimationEndNameList();
      DOMUtilsContext.on(element, eventNameList, null, handler, defaultOption);
      if (!defaultOption.once) {
        return {
          off() {
            DOMUtilsContext.off(element, eventNameList, null, handler, defaultOption);
          }
        };
      }
    }
transitionend(element, handler, option) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      const defaultOption = {
        once: true
      };
      Object.assign(defaultOption, option || {});
      const eventNameList = DOMUtilsCommonUtils.getTransitionEndNameList();
      DOMUtilsContext.on(element, eventNameList, null, handler, defaultOption);
      if (!defaultOption.once) {
        return {
          off() {
            DOMUtilsContext.off(element, eventNameList, null, handler, defaultOption);
          }
        };
      }
    }
keyup(element, handler, option) {
      let DOMUtilsContext = this;
      if (element == null) {
        return;
      }
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.keyup($ele, handler, option);
        });
        return;
      }
      DOMUtilsContext.on(element, "keyup", null, handler, option);
    }
keydown(element, handler, option) {
      let DOMUtilsContext = this;
      if (element == null) {
        return;
      }
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.keydown($ele, handler, option);
        });
        return;
      }
      DOMUtilsContext.on(element, "keydown", null, handler, option);
    }
keypress(element, handler, option) {
      let DOMUtilsContext = this;
      if (element == null) {
        return;
      }
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.keypress($ele, handler, option);
        });
        return;
      }
      DOMUtilsContext.on(element, "keypress", null, handler, option);
    }
listenKeyboard(element, eventName = "keypress", callback, options) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      let keyboardEventCallBack = function(event) {
        let keyName = event.key || event.code;
        let keyValue = event.charCode || event.keyCode || event.which;
        let otherCodeList = [];
        if (event.ctrlKey) {
          otherCodeList.push("ctrl");
        }
        if (event.altKey) {
          otherCodeList.push("alt");
        }
        if (event.metaKey) {
          otherCodeList.push("meta");
        }
        if (event.shiftKey) {
          otherCodeList.push("shift");
        }
        if (typeof callback === "function") {
          callback(keyName, keyValue, otherCodeList, event);
        }
      };
      DOMUtilsContext.on(element, eventName, keyboardEventCallBack, options);
      return {
        removeListen: () => {
          DOMUtilsContext.off(element, eventName, keyboardEventCallBack, options);
        }
      };
    }
    selector(selector, parent) {
      return this.selectorAll(selector, parent)[0];
    }
    selectorAll(selector, parent) {
      const context = this;
      parent = parent || context.windowApi.document;
      selector = selector.trim();
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
          return $ele?.innerHTML?.trim() === "";
        });
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
        let text = textMatch[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
          return ($ele?.textContent || $ele?.innerText)?.includes(text);
        });
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
        let pattern = textMatch[2];
        let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        let regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
          return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
        });
      } else {
        return Array.from(parent.querySelectorAll(selector));
      }
    }
matches($el, selector) {
      selector = selector.trim();
      if ($el == null) {
        return false;
      }
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return $el.matches(selector) && $el?.innerHTML?.trim() === "";
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
        let text = textMatch[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        let content = $el?.textContent || $el?.innerText;
        if (typeof content !== "string") {
          content = "";
        }
        return $el.matches(selector) && content?.includes(text);
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
        let pattern = textMatch[2];
        let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        let regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        let content = $el?.textContent || $el?.innerText;
        if (typeof content !== "string") {
          content = "";
        }
        return $el.matches(selector) && Boolean(content?.match(regexp));
      } else {
        return $el.matches(selector);
      }
    }
    closest($el, selector) {
      selector = selector.trim();
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        let $closest = $el?.closest(selector);
        if ($closest && $closest?.innerHTML?.trim() === "") {
          return $closest;
        }
        return null;
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
        let text = textMatch[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        let $closest = $el?.closest(selector);
        if ($closest) {
          let content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.includes(text)) {
            return $closest;
          }
        }
        return null;
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
        let pattern = textMatch[2];
        let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        let regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        let $closest = $el?.closest(selector);
        if ($closest) {
          let content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.match(regexp)) {
            return $closest;
          }
        }
        return null;
      } else {
        let $closest = $el?.closest(selector);
        return $closest;
      }
    }
  }
  let DOMUtils$1 = class DOMUtils extends DOMUtilsEvent {
    constructor(option) {
      super(option);
    }
version = "2025.8.11";
    attr(element, attrName, attrValue) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        if (attrValue == null) {
          return DOMUtilsContext.attr(element[0], attrName, attrValue);
        } else {
          element.forEach(($ele) => {
            DOMUtilsContext.attr($ele, attrName, attrValue);
          });
          return;
        }
      }
      if (attrValue == null) {
        return element.getAttribute(attrName);
      } else {
        element.setAttribute(attrName, attrValue);
      }
    }
    createElement(tagName, property, attributes) {
      let DOMUtilsContext = this;
      let tempElement = DOMUtilsContext.windowApi.document.createElement(tagName);
      if (typeof property === "string") {
        DOMUtilsContext.html(tempElement, property);
        return tempElement;
      }
      if (property == null) {
        property = {};
      }
      if (attributes == null) {
        attributes = {};
      }
      Object.keys(property).forEach((key) => {
        let value = property[key];
        if (key === "innerHTML") {
          DOMUtilsContext.html(tempElement, value);
          return;
        }
        tempElement[key] = value;
      });
      Object.keys(attributes).forEach((key) => {
        let value = attributes[key];
        if (typeof value === "object") {
          value = JSON.stringify(value);
        } else if (typeof value === "function") {
          value = value.toString();
        }
        tempElement.setAttribute(key, value);
      });
      return tempElement;
    }
    css(element, property, value) {
      let DOMUtilsContext = this;
      function handlePixe(propertyName, propertyValue) {
        let allowAddPixe = ["width", "height", "top", "left", "right", "bottom", "font-size"];
        if (typeof propertyValue === "number") {
          propertyValue = propertyValue.toString();
        }
        if (typeof propertyValue === "string" && allowAddPixe.includes(propertyName) && propertyValue.match(/[0-9]$/gi)) {
          propertyValue = propertyValue + "px";
        }
        return propertyValue;
      }
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        if (typeof property === "string") {
          if (value == null) {
            return DOMUtilsContext.css(element[0], property);
          } else {
            element.forEach(($ele) => {
              DOMUtilsContext.css($ele, property);
            });
            return;
          }
        } else if (typeof property === "object") {
          element.forEach(($ele) => {
            DOMUtilsContext.css($ele, property);
          });
          return;
        } else ;
        return;
      }
      let setStyleProperty = (propertyName, propertyValue) => {
        if (typeof propertyValue === "string" && propertyValue.trim().endsWith("!important")) {
          propertyValue = propertyValue.trim().replace(/!important$/gi, "").trim();
          element.style.setProperty(propertyName, propertyValue, "important");
        } else {
          propertyValue = handlePixe(propertyName, propertyValue);
          element.style.setProperty(propertyName, propertyValue);
        }
      };
      if (typeof property === "string") {
        if (value == null) {
          return DOMUtilsContext.windowApi.globalThis.getComputedStyle(element).getPropertyValue(property);
        } else {
          setStyleProperty(property, value);
        }
      } else if (typeof property === "object") {
        for (let prop in property) {
          let value2 = property[prop];
          setStyleProperty(prop, value2);
        }
      } else {
        throw new TypeError("property must be string or object");
      }
    }
    text(element, text) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        if (text == null) {
          return DOMUtilsContext.text(element[0]);
        } else {
          element.forEach(($ele) => {
            DOMUtilsContext.text($ele, text);
          });
        }
        return;
      }
      if (text == null) {
        return element.textContent || element.innerText;
      } else {
        if (text instanceof Node) {
          text = text.textContent || text.innerText;
        }
        if ("textContent" in element) {
          element.textContent = text;
        } else if ("innerText" in element) {
          element.innerText = text;
        }
      }
    }
    html(element, html) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        if (html == null) {
          return DOMUtilsContext.html(element[0]);
        } else {
          element.forEach(($ele) => {
            DOMUtilsContext.html($ele, html);
          });
        }
        return;
      }
      if (html == null) {
        return element.innerHTML;
      } else {
        if (html instanceof Element) {
          html = html.innerHTML;
        }
        if ("innerHTML" in element) {
          DOMUtilsCommonUtils.setSafeHTML(element, html);
        }
      }
    }
getTransform(element, isShow = false) {
      let DOMUtilsContext = this;
      let transform_left = 0;
      let transform_top = 0;
      if (!(isShow || !isShow && DOMUtilsCommonUtils.isShow(element))) {
        let { recovery } = DOMUtilsCommonUtils.showElement(element);
        let transformInfo = DOMUtilsContext.getTransform(element, true);
        recovery();
        return transformInfo;
      }
      let elementTransform = DOMUtilsContext.windowApi.globalThis.getComputedStyle(element).transform;
      if (elementTransform != null && elementTransform !== "none" && elementTransform !== "") {
        let elementTransformSplit = elementTransform.match(/\((.+)\)/)?.[1].split(",");
        if (elementTransformSplit) {
          transform_left = Math.abs(parseInt(elementTransformSplit[4]));
          transform_top = Math.abs(parseInt(elementTransformSplit[5]));
        } else {
          transform_left = 0;
          transform_top = 0;
        }
      }
      return {
        transformLeft: transform_left,
        transformTop: transform_top
      };
    }
    val(element, value) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        if (value == null) {
          return DOMUtilsContext.val(element[0]);
        } else {
          element.forEach(($ele) => {
            DOMUtilsContext.val($ele, value);
          });
        }
        return;
      }
      if (value == null) {
        if (element.localName === "input" && (element.type === "checkbox" || element.type === "radio")) {
          return element.checked;
        } else {
          return element.value;
        }
      } else {
        if (element.localName === "input" && (element.type === "checkbox" || element.type === "radio")) {
          element.checked = !!value;
        } else {
          element.value = value;
        }
      }
    }
    prop(element, propName, propValue) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        if (propValue == null) {
          return DOMUtilsContext.prop(element[0], propName);
        } else {
          element.forEach(($ele) => {
            DOMUtilsContext.prop($ele, propName, propValue);
          });
        }
        return;
      }
      if (propValue == null) {
        return Reflect.get(element, propName);
      } else {
        if (element instanceof Element && propName === "innerHTML") {
          DOMUtilsContext.html(element, propValue);
        } else {
          Reflect.set(element, propName, propValue);
        }
      }
    }
removeAttr(element, attrName) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.removeAttr($ele, attrName);
        });
        return;
      }
      element.removeAttribute(attrName);
    }
removeClass(element, className) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.removeClass($ele, className);
        });
        return;
      }
      if (className == null) {
        element.className = "";
      } else {
        if (!Array.isArray(className)) {
          className = className.trim().split(" ");
        }
        className.forEach((itemClassName) => {
          element.classList.remove(itemClassName);
        });
      }
    }
removeProp(element, propName) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.removeProp($ele, propName);
        });
        return;
      }
      DOMUtilsCommonUtils.delete(element, propName);
    }
replaceWith(element, newElement) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.replaceWith($ele, newElement);
        });
        return;
      }
      if (typeof newElement === "string") {
        newElement = DOMUtilsContext.parseHTML(newElement, false, false);
      }
      let $parent = element.parentElement;
      if ($parent) {
        $parent.replaceChild(newElement, element);
      } else {
        DOMUtilsContext.after(element, newElement);
        element.remove();
      }
    }
addClass(element, className) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.addClass($ele, className);
        });
        return;
      }
      if (!Array.isArray(className)) {
        className = className.split(" ");
      }
      className.forEach((itemClassName) => {
        if (itemClassName.trim() == "") {
          return;
        }
        element.classList.add(itemClassName);
      });
    }
hasClass(element, className) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return false;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        let flag = true;
        for (let index = 0; index < element.length; index++) {
          const $ele = element[index];
          flag = flag && DOMUtilsContext.hasClass($ele, className);
        }
        return flag;
      }
      if (!element?.classList) {
        return false;
      }
      if (!Array.isArray(className)) {
        className = className.split(" ");
      }
      for (let index = 0; index < className.length; index++) {
        const item = className[index].trim();
        if (!element.classList.contains(item)) {
          return false;
        }
      }
      return true;
    }
append(element, content) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.append($ele, content);
        });
        return;
      }
      function elementAppendChild(ele, text) {
        if (typeof content === "string") {
          if (ele instanceof DocumentFragment) {
            if (typeof text === "string") {
              text = DOMUtilsContext.parseHTML(text, true, false);
            }
            ele.appendChild(text);
          } else {
            ele.insertAdjacentHTML("beforeend", DOMUtilsCommonUtils.getSafeHTML(text));
          }
        } else {
          ele.appendChild(text);
        }
      }
      if (Array.isArray(content) || content instanceof NodeList) {
        let fragment = DOMUtilsContext.windowApi.document.createDocumentFragment();
        content.forEach((ele) => {
          if (typeof ele === "string") {
            ele = DOMUtilsContext.parseHTML(ele, true, false);
          }
          fragment.appendChild(ele);
        });
        element.appendChild(fragment);
      } else {
        elementAppendChild(element, content);
      }
    }
prepend(element, content) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.prepend($ele, content);
        });
        return;
      }
      if (typeof content === "string") {
        if (element instanceof DocumentFragment) {
          content = DOMUtilsContext.parseHTML(content, true, false);
          element.prepend(content);
        } else {
          element.insertAdjacentHTML("afterbegin", DOMUtilsCommonUtils.getSafeHTML(content));
        }
      } else {
        let $firstChild = element.firstChild;
        if ($firstChild == null) {
          element.prepend(content);
        } else {
          element.insertBefore(content, element.firstChild);
        }
      }
    }
after(element, content) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.after($ele, content);
        });
        return;
      }
      if (typeof content === "string") {
        element.insertAdjacentHTML("afterend", DOMUtilsCommonUtils.getSafeHTML(content));
      } else {
        let $parent = element.parentElement;
        let $nextSlibling = element.nextSibling;
        if (!$parent || $nextSlibling) {
          element.after(content);
        } else {
          element.parentElement.insertBefore(content, element.nextSibling);
        }
      }
    }
before(element, content) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.before($ele, content);
        });
        return;
      }
      if (typeof content === "string") {
        element.insertAdjacentHTML("beforebegin", DOMUtilsCommonUtils.getSafeHTML(content));
      } else {
        let $parent = element.parentElement;
        if (!$parent) {
          element.before(content);
        } else {
          $parent.insertBefore(content, element);
        }
      }
    }
remove(element) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.remove($ele);
        });
        return;
      }
      if (typeof element.remove === "function") {
        element.remove();
      } else if (element.parentElement) {
        element.parentElement.removeChild(element);
      } else if (element.parentNode) {
        element.parentNode.removeChild(element);
      }
    }
empty(element) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.empty($ele);
        });
        return;
      }
      if (element.innerHTML) {
        element.innerHTML = "";
      } else if (element.textContent) {
        element.textContent = "";
      }
    }
offset(element) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      let rect = element.getBoundingClientRect();
      return {
top: rect.top + DOMUtilsContext.windowApi.globalThis.scrollY,
left: rect.left + DOMUtilsContext.windowApi.globalThis.scrollX
      };
    }
    width(element, isShow = false) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isWin(element)) {
        return DOMUtilsContext.windowApi.window.document.documentElement.clientWidth;
      }
      if (element.nodeType === 9) {
        element = element;
        return Math.max(element.body.scrollWidth, element.documentElement.scrollWidth, element.body.offsetWidth, element.documentElement.offsetWidth, element.documentElement.clientWidth);
      }
      if (isShow || !isShow && DOMUtilsCommonUtils.isShow(element)) {
        element = element;
        if (parseFloat(DOMUtilsCommonUtils.getStyleValue(element, "width").toString()) > 0) {
          return parseFloat(DOMUtilsCommonUtils.getStyleValue(element, "width").toString());
        }
        if (element.offsetWidth > 0) {
          let borderLeftWidth = DOMUtilsCommonUtils.getStyleValue(element, "borderLeftWidth");
          let borderRightWidth = DOMUtilsCommonUtils.getStyleValue(element, "borderRightWidth");
          let paddingLeft = DOMUtilsCommonUtils.getStyleValue(element, "paddingLeft");
          let paddingRight = DOMUtilsCommonUtils.getStyleValue(element, "paddingRight");
          let backHeight = parseFloat(element.offsetWidth.toString()) - parseFloat(borderLeftWidth.toString()) - parseFloat(borderRightWidth.toString()) - parseFloat(paddingLeft.toString()) - parseFloat(paddingRight.toString());
          return parseFloat(backHeight.toString());
        }
        return 0;
      } else {
        element = element;
        let { recovery } = DOMUtilsCommonUtils.showElement(element);
        let width = DOMUtilsContext.width(element, true);
        recovery();
        return width;
      }
    }
    height(element, isShow = false) {
      let DOMUtilsContext = this;
      if (DOMUtilsCommonUtils.isWin(element)) {
        return DOMUtilsContext.windowApi.window.document.documentElement.clientHeight;
      }
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      if (element.nodeType === 9) {
        element = element;
        return Math.max(element.body.scrollHeight, element.documentElement.scrollHeight, element.body.offsetHeight, element.documentElement.offsetHeight, element.documentElement.clientHeight);
      }
      if (isShow || !isShow && DOMUtilsCommonUtils.isShow(element)) {
        element = element;
        if (parseFloat(DOMUtilsCommonUtils.getStyleValue(element, "height").toString()) > 0) {
          return parseFloat(DOMUtilsCommonUtils.getStyleValue(element, "height").toString());
        }
        if (element.offsetHeight > 0) {
          let borderTopWidth = DOMUtilsCommonUtils.getStyleValue(element, "borderTopWidth");
          let borderBottomWidth = DOMUtilsCommonUtils.getStyleValue(element, "borderBottomWidth");
          let paddingTop = DOMUtilsCommonUtils.getStyleValue(element, "paddingTop");
          let paddingBottom = DOMUtilsCommonUtils.getStyleValue(element, "paddingBottom");
          let backHeight = parseFloat(element.offsetHeight.toString()) - parseFloat(borderTopWidth.toString()) - parseFloat(borderBottomWidth.toString()) - parseFloat(paddingTop.toString()) - parseFloat(paddingBottom.toString());
          return parseFloat(backHeight.toString());
        }
        return 0;
      } else {
        element = element;
        let { recovery } = DOMUtilsCommonUtils.showElement(element);
        let height = DOMUtilsContext.height(element, true);
        recovery();
        return height;
      }
    }
    outerWidth(element, isShow = false) {
      let DOMUtilsContext = this;
      if (DOMUtilsCommonUtils.isWin(element)) {
        return DOMUtilsContext.windowApi.window.innerWidth;
      }
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      element = element;
      if (isShow || !isShow && DOMUtilsCommonUtils.isShow(element)) {
        let style = DOMUtilsContext.windowApi.globalThis.getComputedStyle(element, null);
        let marginLeft = DOMUtilsCommonUtils.getStyleValue(style, "marginLeft");
        let marginRight = DOMUtilsCommonUtils.getStyleValue(style, "marginRight");
        return element.offsetWidth + marginLeft + marginRight;
      } else {
        let { recovery } = DOMUtilsCommonUtils.showElement(element);
        let outerWidth = DOMUtilsContext.outerWidth(element, true);
        recovery();
        return outerWidth;
      }
    }
    outerHeight(element, isShow = false) {
      let DOMUtilsContext = this;
      if (DOMUtilsCommonUtils.isWin(element)) {
        return DOMUtilsContext.windowApi.window.innerHeight;
      }
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      element = element;
      if (isShow || !isShow && DOMUtilsCommonUtils.isShow(element)) {
        let style = DOMUtilsContext.windowApi.globalThis.getComputedStyle(element, null);
        let marginTop = DOMUtilsCommonUtils.getStyleValue(style, "marginTop");
        let marginBottom = DOMUtilsCommonUtils.getStyleValue(style, "marginBottom");
        return element.offsetHeight + marginTop + marginBottom;
      } else {
        let { recovery } = DOMUtilsCommonUtils.showElement(element);
        let outerHeight = DOMUtilsContext.outerHeight(element, true);
        recovery();
        return outerHeight;
      }
    }
animate(element, styles, duration = 1e3, callback = null) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.animate($ele, styles, duration, callback);
        });
        return;
      }
      if (typeof duration !== "number" || duration <= 0) {
        throw new TypeError("duration must be a positive number");
      }
      if (typeof callback !== "function" && callback !== void 0) {
        throw new TypeError("callback must be a function or null");
      }
      if (typeof styles !== "object" || styles === void 0) {
        throw new TypeError("styles must be an object");
      }
      if (Object.keys(styles).length === 0) {
        throw new Error("styles must contain at least one property");
      }
      let start = performance.now();
      let from = {};
      let to = {};
      for (let prop in styles) {
        from[prop] = element.style[prop] || DOMUtilsContext.windowApi.globalThis.getComputedStyle(element)[prop];
        to[prop] = styles[prop];
      }
      let timer = DOMUtilsCommonUtils.setInterval(function() {
        let timePassed = performance.now() - start;
        let progress = timePassed / duration;
        if (progress > 1) {
          progress = 1;
        }
        for (let prop in styles) {
          element.style[prop] = from[prop] + (to[prop] - from[prop]) * progress + "px";
        }
        if (progress === 1) {
          DOMUtilsCommonUtils.clearInterval(timer);
          if (callback) {
            callback();
          }
        }
      }, 10);
    }
wrap(element, wrapperHTML) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.wrap($ele, wrapperHTML);
        });
        return;
      }
      element = element;
      let wrapper = DOMUtilsContext.windowApi.document.createElement("div");
      DOMUtilsContext.html(wrapper, wrapperHTML);
      let wrapperFirstChild = wrapper.firstChild;
      let parentElement = element.parentElement;
      parentElement.insertBefore(wrapperFirstChild, element);
      wrapperFirstChild.appendChild(element);
    }
    prev(element) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      return element.previousElementSibling;
    }
    next(element) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      return element.nextElementSibling;
    }
noConflict() {
      let DOMUtilsContext = this;
      if (DOMUtilsContext.windowApi.window.DOMUtils) {
        DOMUtilsCommonUtils.delete(window, "DOMUtils");
      }
      DOMUtilsContext.windowApi.window.DOMUtils = this;
      return this;
    }
    siblings(element) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      return Array.from(element.parentElement.children).filter((child) => child !== element);
    }
parent(element) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selector(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        let resultArray = [];
        element.forEach(($ele) => {
          resultArray.push(DOMUtilsContext.parent($ele));
        });
        return resultArray;
      } else {
        return element.parentElement;
      }
    }
    parseHTML(html, useParser = false, isComplete = false) {
      let DOMUtilsContext = this;
      html = html.trim();
      function parseHTMLByDOMParser() {
        let parser = new DOMParser();
        if (isComplete) {
          return parser.parseFromString(html, "text/html");
        } else {
          return parser.parseFromString(html, "text/html").body.firstChild;
        }
      }
      function parseHTMLByCreateDom() {
        let tempDIV = DOMUtilsContext.windowApi.document.createElement("div");
        DOMUtilsContext.html(tempDIV, html);
        if (isComplete) {
          return tempDIV;
        } else {
          return tempDIV.firstChild;
        }
      }
      if (useParser) {
        return parseHTMLByDOMParser();
      } else {
        return parseHTMLByCreateDom();
      }
    }
serialize($form) {
      const elements = $form.elements;
      let serializedArray = [];
      for (let i2 = 0; i2 < elements.length; i2++) {
        const element = elements[i2];
        if (element.name && !element.disabled && (element.checked || ["text", "hidden", "password", "textarea", "select-one", "select-multiple"].includes(element.type))) {
          if (element.type === "select-multiple") {
            for (let j2 = 0; j2 < element.options.length; j2++) {
              if (element.options[j2].selected) {
                serializedArray.push({
                  name: element.name,
                  value: element.options[j2].value
                });
              }
            }
          } else {
            serializedArray.push({ name: element.name, value: element.value });
          }
        }
      }
      return serializedArray.map((item) => `${encodeURIComponent(item.name)}=${encodeURIComponent(item.value)}`).join("&");
    }
show(target, checkVisiblie = true) {
      let DOMUtilsContext = this;
      if (target == null) {
        return;
      }
      if (typeof target === "string") {
        target = DOMUtilsContext.selectorAll(target);
      }
      if (target instanceof NodeList || target instanceof Array) {
        target = target;
        for (const element of target) {
          DOMUtilsContext.show(element, checkVisiblie);
        }
      } else {
        target = target;
        target.style.display = "";
        if (checkVisiblie) {
          if (!DOMUtilsCommonUtils.isShow(target)) {
            target.style.setProperty("display", "unset", "important");
          }
        }
      }
    }
hide(target, checkVisiblie = true) {
      let DOMUtilsContext = this;
      if (target == null) {
        return;
      }
      if (typeof target === "string") {
        target = DOMUtilsContext.selectorAll(target);
      }
      if (target instanceof NodeList || target instanceof Array) {
        target = target;
        for (const element of target) {
          DOMUtilsContext.hide(element, checkVisiblie);
        }
      } else {
        target = target;
        target.style.display = "none";
        if (checkVisiblie) {
          if (DOMUtilsCommonUtils.isShow(target)) {
            target.style.setProperty("display", "none", "important");
          }
        }
      }
    }
fadeIn(element, duration = 400, callback) {
      if (element == null) {
        return;
      }
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.fadeIn($ele, duration, callback);
        });
        return;
      }
      element.style.opacity = "0";
      element.style.display = "";
      let start = null;
      let timer = null;
      function step(timestamp) {
        if (!start)
          start = timestamp;
        let progress = timestamp - start;
        element = element;
        element.style.opacity = Math.min(progress / duration, 1).toString();
        if (progress < duration) {
          DOMUtilsContext.windowApi.window.requestAnimationFrame(step);
        } else {
          if (callback && typeof callback === "function") {
            callback();
          }
          DOMUtilsContext.windowApi.window.cancelAnimationFrame(timer);
        }
      }
      timer = DOMUtilsContext.windowApi.window.requestAnimationFrame(step);
    }
fadeOut(element, duration = 400, callback) {
      let DOMUtilsContext = this;
      if (element == null) {
        return;
      }
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.fadeOut($ele, duration, callback);
        });
        return;
      }
      element.style.opacity = "1";
      let start = null;
      let timer = null;
      function step(timestamp) {
        if (!start)
          start = timestamp;
        let progress = timestamp - start;
        element = element;
        element.style.opacity = Math.max(1 - progress / duration, 0).toString();
        if (progress < duration) {
          DOMUtilsContext.windowApi.window.requestAnimationFrame(step);
        } else {
          element.style.display = "none";
          if (typeof callback === "function") {
            callback();
          }
          DOMUtilsContext.windowApi.window.cancelAnimationFrame(timer);
        }
      }
      timer = DOMUtilsContext.windowApi.window.requestAnimationFrame(step);
    }
toggle(element, checkVisiblie) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      if (DOMUtilsCommonUtils.isNodeList(element)) {
        element.forEach(($ele) => {
          DOMUtilsContext.toggle($ele);
        });
        return;
      }
      if (DOMUtilsContext.windowApi.globalThis.getComputedStyle(element).getPropertyValue("display") === "none") {
        DOMUtilsContext.show(element, checkVisiblie);
      } else {
        DOMUtilsContext.hide(element, checkVisiblie);
      }
    }
createDOMUtils(option) {
      return new DOMUtils(option);
    }
getTextBoundingRect($input, selectionStart, selectionEnd) {
      let DOMUtilsContext = this;
      if (!$input || !("value" in $input))
        return $input;
      if (selectionStart == null) {
        selectionStart = $input.selectionStart || 0;
      }
      if (selectionEnd == null) {
        selectionEnd = $input.selectionEnd || 0;
      }
      if (typeof selectionStart == "string")
        selectionStart = parseFloat(selectionStart);
      if (typeof selectionStart != "number" || isNaN(selectionStart)) {
        selectionStart = 0;
      }
      if (selectionStart < 0)
        selectionStart = 0;
      else
        selectionStart = Math.min($input.value.length, selectionStart);
      if (typeof selectionEnd == "string")
        selectionEnd = parseFloat(selectionEnd);
      if (typeof selectionEnd != "number" || isNaN(selectionEnd) || selectionEnd < selectionStart) {
        selectionEnd = selectionStart;
      }
      if (selectionEnd < 0)
        selectionEnd = 0;
      else
        selectionEnd = Math.min($input.value.length, selectionEnd);
      if (typeof $input.createTextRange == "function") {
        let range = $input.createTextRange();
        range.collapse(true);
        range.moveStart("character", selectionStart);
        range.moveEnd("character", selectionEnd - selectionStart);
        return range.getBoundingClientRect();
      }
      let offset = getInputOffset(), topPos = offset.top, leftPos = offset.left, width = getInputCSS("width", true), height = getInputCSS("height", true);
      let cssDefaultStyles = "white-space:pre;padding:0;margin:0;", listOfModifiers = [
        "direction",
        "font-family",
        "font-size",
        "font-size-adjust",
        "font-variant",
        "font-weight",
        "font-style",
        "letter-spacing",
        "line-height",
        "text-align",
        "text-indent",
        "text-transform",
        "word-wrap",
        "word-spacing"
      ];
      topPos += getInputCSS("padding-top", true);
      topPos += getInputCSS("border-top-width", true);
      leftPos += getInputCSS("padding-left", true);
      leftPos += getInputCSS("border-left-width", true);
      leftPos += 1;
      for (let index = 0; index < listOfModifiers.length; index++) {
        let property = listOfModifiers[index];
        cssDefaultStyles += property + ":" + getInputCSS(property) + ";";
      }
      let text = $input.value || "G", textLen = text.length, fakeClone = DOMUtilsContext.windowApi.document.createElement("div");
      if (selectionStart > 0)
        appendPart(0, selectionStart);
      var fakeRange = appendPart(selectionStart, selectionEnd);
      if (textLen > selectionEnd)
        appendPart(selectionEnd, textLen);
      fakeClone.style.cssText = cssDefaultStyles;
      fakeClone.style.position = "absolute";
      fakeClone.style.top = topPos + "px";
      fakeClone.style.left = leftPos + "px";
      fakeClone.style.width = width + "px";
      fakeClone.style.height = height + "px";
      DOMUtilsContext.windowApi.document.body.appendChild(fakeClone);
      var returnValue = fakeRange.getBoundingClientRect();
      fakeClone?.parentNode?.removeChild(fakeClone);
      return returnValue;
      function appendPart(start, end) {
        var span = DOMUtilsContext.windowApi.document.createElement("span");
        span.style.cssText = cssDefaultStyles;
        span.textContent = text.substring(start, end);
        fakeClone.appendChild(span);
        return span;
      }
      function getInputOffset() {
        let body = DOMUtilsContext.windowApi.document.body, win = DOMUtilsContext.windowApi.document.defaultView, docElem = DOMUtilsContext.windowApi.document.documentElement, $box = DOMUtilsContext.windowApi.document.createElement("div");
        $box.style.paddingLeft = $box.style.width = "1px";
        body.appendChild($box);
        var isBoxModel = $box.offsetWidth == 2;
        body.removeChild($box);
        let $boxRect = $input.getBoundingClientRect();
        var clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, scrollTop = win.pageYOffset || isBoxModel && docElem.scrollTop || body.scrollTop, scrollLeft = win.pageXOffset || isBoxModel && docElem.scrollLeft || body.scrollLeft;
        return {
          top: $boxRect.top + scrollTop - clientTop,
          left: $boxRect.left + scrollLeft - clientLeft
        };
      }
      function getInputCSS(prop, isNumber) {
        var val = DOMUtilsContext.windowApi.document.defaultView.getComputedStyle($input, null).getPropertyValue(prop);
        return isNumber ? parseFloat(val) : val;
      }
    }
getAnimationEndNameList() {
      return DOMUtilsCommonUtils.getAnimationEndNameList();
    }
getTransitionEndNameList() {
      return DOMUtilsCommonUtils.getTransitionEndNameList();
    }
  };
  let domUtils$2 = new DOMUtils$1();
  class ColorConversion {
isHex(str) {
      if (typeof str !== "string") {
        return false;
      }
      if (!str.match(/^(\#|)[0-9a-fA-F]{6}$/)) {
        return false;
      }
      return true;
    }
hexToRgba(hex, opacity) {
      if (!this.isHex(hex)) {
        throw new TypeError("输入错误的hex:" + hex);
      }
      return hex && hex.replace(/\s+/g, "").length === 7 ? "rgba(" + parseInt("0x" + hex.slice(1, 3)) + "," + parseInt("0x" + hex.slice(3, 5)) + "," + parseInt("0x" + hex.slice(5, 7)) + "," + opacity + ")" : "";
    }
hexToRgb(str) {
      if (!this.isHex(str)) {
        throw new TypeError("输入错误的hex:" + str);
      }
      str = str.replace("#", "");
      let hxs = str.match(/../g);
      for (let index = 0; index < 3; index++) {
        hxs[index] = parseInt(hxs[index], 16);
      }
      return hxs;
    }
rgbToHex(redValue, greenValue, blueValue) {
      let validPattern = /^\d{1,3}$/;
      if (!validPattern.test(redValue.toString()) || !validPattern.test(greenValue.toString()) || !validPattern.test(blueValue.toString()))
        throw new TypeError("输入错误的rgb颜色值");
      let hexs = [redValue.toString(16), greenValue.toString(16), blueValue.toString(16)];
      for (let index = 0; index < 3; index++)
        if (hexs[index].length == 1)
          hexs[index] = "0" + hexs[index];
      return "#" + hexs.join("");
    }
getDarkColor(color, level) {
      if (!this.isHex(color)) {
        throw new TypeError("输入错误的hex:" + color);
      }
      let rgbc = this.hexToRgb(color);
      for (let index = 0; index < 3; index++) {
        rgbc[index] = Math.floor(rgbc[index] * (1 - level));
      }
      return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
    }
getLightColor(color, level) {
      if (!this.isHex(color)) {
        throw new TypeError("输入错误的hex:" + color);
      }
      let rgbc = this.hexToRgb(color);
      for (let index = 0; index < 3; index++) {
        rgbc[index] = Math.floor((255 - rgbc[index]) * level + rgbc[index]);
      }
      return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
    }
  }
  class GBKEncoder {
    #data = [];
    #U2Ghash = {};
    #G2Uhash = {};
    constructor() {
      let dataText = this.handleText("4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364");
      let index = 0;
      this.#data = dataText.match(/..../g);
      for (let i2 = 129; i2 <= 254; i2++) {
        for (let j2 = 64; j2 <= 254; j2++) {
          this.#U2Ghash[this.#data[index++]] = ("%" + i2.toString(16) + "%" + j2.toString(16)).toUpperCase();
        }
      }
      for (let key in this.#U2Ghash) {
        this.#G2Uhash[this.#U2Ghash[key]] = key;
      }
    }
    handleText(text) {
      text = text.replace(/#(\d+)\$/g, function(a2, b2) {
        return Array(+b2 + 3).join("#");
      }).replace(/#/g, "####").replace(/(\w\w):([\w#]+)(?:,|$)/g, function(a2, hd, dt) {
        return dt.replace(/../g, function(a3) {
          if (a3 != "##") {
            return hd + a3;
          } else {
            return a3;
          }
        });
      });
      return text;
    }
    isAscii(unicode) {
      return unicode <= 127 && unicode >= 0;
    }
encode(str) {
      let that = this;
      return [...str].reduce((result, val, i2) => {
        return result + toGBK(val);
      }, "");
      function toGBK(val) {
        let result = "";
        for (let i2 = 0; i2 < val.length; i2++) {
          const codePoint = val.codePointAt(i2);
          const code = String.fromCodePoint(codePoint);
          let key = codePoint.toString(16);
          key.length != 4 && (key = ("000" + key).match(/....$/)?.[0]);
          i2 += code.length - 1;
          if (that.isAscii(codePoint)) {
            result += encodeURIComponent(code);
            continue;
          }
          if (that.#U2Ghash[key]) {
            result += that.#U2Ghash[key];
            continue;
          }
          result += toGBK(`&#${codePoint};`);
        }
        return result;
      }
    }
decode(str) {
      let GBKMatcher = /%[0-9A-F]{2}%[0-9A-F]{2}/;
      let UTFMatcher = /%[0-9A-F]{2}/;
      let utf = true;
      const that = this;
      while (utf) {
        let gbkMatch = str.match(GBKMatcher);
        let utfMatch = str.match(UTFMatcher);
        utf = Boolean(utfMatch);
        if (gbkMatch && gbkMatch in that.#G2Uhash) {
          str = str.replace(gbkMatch, String.fromCharCode("0x" + that.#G2Uhash[gbkMatch]));
        } else {
          str = str.replace(utfMatch, decodeURIComponent(utfMatch));
        }
      }
      return str;
    }
  }
  const TryCatch = function(...args) {
    let callbackFunction = null;
    let context = null;
    let handleError = (error) => {
    };
    let defaultDetails = {
      log: true
    };
    const TryCatchCore = {
config(paramDetails) {
        defaultDetails = Object.assign(defaultDetails, paramDetails);
        return TryCatchCore;
      },
error(handler) {
        handleError = handler;
        return TryCatchCore;
      },
run(callback, __context__) {
        callbackFunction = callback;
        context = __context__ || this;
        let result = executeTryCatch(callbackFunction, handleError, context);
        return result !== void 0 ? result : TryCatchCore;
      }
    };
    function executeTryCatch(callback, handleErrorFunc, funcThis) {
      let result = void 0;
      try {
        if (typeof callback === "string") {
          result = new Function(callback).apply(funcThis, args);
        } else {
          result = callback.apply(funcThis, args);
        }
      } catch (error) {
        if (defaultDetails.log) {
          callback = callback;
          console.log(`%c ${callback?.name ? callback?.name : callback + "出现错误"} `, "color: #f20000");
          console.log(`%c 错误原因:${error}`, "color: #f20000");
          console.trace(callback);
        }
        if (handleErrorFunc) {
          if (typeof handleErrorFunc === "string") {
            result = new Function(handleErrorFunc).apply(funcThis, [...args, error]);
          } else {
            result = handleErrorFunc.apply(funcThis, [...args, error]);
          }
        }
      }
      return result;
    }
    return TryCatchCore;
  };
  let CommonUtil$1 = class CommonUtil {
    assign(target = {}, source = {}, isAdd = false) {
      let UtilsContext = this;
      if (Array.isArray(source)) {
        let canTraverse = source.filter((item) => {
          return typeof item === "object";
        });
        if (!canTraverse.length) {
          return source;
        }
      }
      if (source == null) {
        return target;
      }
      if (target == null) {
        target = {};
      }
      if (isAdd) {
        for (const sourceKeyName in source) {
          const targetKeyName = sourceKeyName;
          let targetValue = target[targetKeyName];
          let sourceValue = source[sourceKeyName];
          if (typeof sourceValue === "object" && sourceValue != null && sourceKeyName in target && !UtilsContext.isDOM(sourceValue)) {
            target[sourceKeyName] = UtilsContext.assign(targetValue, sourceValue, isAdd);
            continue;
          }
          target[sourceKeyName] = sourceValue;
        }
      } else {
        for (const targetKeyName in target) {
          if (targetKeyName in source) {
            let targetValue = target[targetKeyName];
            let sourceValue = source[targetKeyName];
            if (typeof sourceValue === "object" && sourceValue != null && !UtilsContext.isDOM(sourceValue) && Object.keys(sourceValue).length) {
              target[targetKeyName] = UtilsContext.assign(targetValue, sourceValue, isAdd);
              continue;
            }
            target[targetKeyName] = sourceValue;
          }
        }
      }
      return target;
    }
    isNull(...args) {
      let result = true;
      let checkList = [...args];
      for (const objItem of checkList) {
        let itemResult = false;
        if (objItem === null || objItem === void 0) {
          itemResult = true;
        } else {
          switch (typeof objItem) {
            case "object":
              if (typeof objItem[Symbol.iterator] === "function") {
                itemResult = objItem.length === 0;
              } else {
                itemResult = Object.keys(objItem).length === 0;
              }
              break;
            case "number":
              itemResult = objItem === 0;
              break;
            case "string":
              itemResult = objItem.trim() === "" || objItem === "null" || objItem === "undefined";
              break;
            case "boolean":
              itemResult = !objItem;
              break;
            case "function":
              let funcStr = objItem.toString().replace(/\s/g, "");
              itemResult = Boolean(funcStr.match(/^\(.*?\)=>\{\}$|^function.*?\(.*?\)\{\}$/));
              break;
          }
        }
        result = result && itemResult;
      }
      return result;
    }
isDOM(target) {
      return target instanceof Node;
    }
    isNotNull(...args) {
      let UtilsContext = this;
      return !UtilsContext.isNull.apply(this, args);
    }
    deepClone(obj) {
      let UtilsContext = this;
      if (obj === void 0)
        return void 0;
      if (obj === null)
        return null;
      let clone = obj instanceof Array ? [] : {};
      for (const [key, value] of Object.entries(obj)) {
        clone[key] = typeof value === "object" ? UtilsContext.deepClone(value) : value;
      }
      return clone;
    }
coverObjectFunctionThis(target, objectThis) {
      if (typeof target !== "object" || target === null) {
        throw new Error("target must be object");
      }
      objectThis = objectThis || target;
      Object.keys(target).forEach((key) => {
        if (typeof target[key] === "function") {
          target[key] = target[key].bind(objectThis);
        }
      });
    }
    toJSON(data, errorCallBack) {
      let result = {};
      if (typeof data === "object") {
        return data;
      }
      TryCatch().config({ log: false }).error((error) => {
        TryCatch().error(() => {
          try {
            result = new Function("return " + data)();
          } catch (error2) {
            if (typeof errorCallBack === "function") {
              errorCallBack(error2);
            }
          }
        }).run(() => {
          if (data && /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
            result = new Function("return " + data)();
          } else {
            if (typeof errorCallBack === "function") {
              errorCallBack(new Error("target is not a JSON"));
            }
          }
        });
      }).run(() => {
        data = data.trim();
        result = JSON.parse(data);
      });
      return result;
    }
  };
  let commonUtil = new CommonUtil$1();
  class UtilsGMCookie {
    windowApi = {
      window,
      document
    };
    constructor(windowApiOption) {
      if (windowApiOption) {
        this.windowApi = Object.assign({}, windowApiOption);
      }
    }
getCookiesList() {
      if (this.windowApi.document.cookie.trim() === "") {
        return [];
      }
      return this.windowApi.document.cookie.split(";");
    }
get(cookieName) {
      if (typeof cookieName !== "string") {
        throw new TypeError("Utils.GMCookie.get 参数cookieName 必须为字符串");
      }
      let cookies = this.getCookiesList();
      let findValue = void 0;
      for (const cookieItem of cookies) {
        let item = cookieItem.trim();
        let itemSplit = item.split("=");
        let itemName = itemSplit[0];
        itemSplit.splice(0, 1);
        let itemValue = decodeURIComponent(itemSplit.join(""));
        if (itemName === cookieName) {
          findValue = {
            domain: this.windowApi.window.location.hostname,
            expirationDate: null,
            hostOnly: true,
            httpOnly: false,
            name: cookieName,
            path: "/",
            sameSite: "unspecified",
            secure: true,
            session: false,
            value: itemValue
          };
          break;
        }
      }
      return findValue;
    }
list(option, callback) {
      if (option == null) {
        throw new Error("Utils.GMCookie.list 参数不能为空");
      }
      let resultData = [];
      try {
        let defaultOption = {
          url: this.windowApi.window.location.href,
          domain: this.windowApi.window.location.hostname,
          name: "",
          path: "/"
        };
        defaultOption = commonUtil.assign(defaultOption, option);
        let cookies = this.getCookiesList();
        cookies.forEach((item) => {
          item = item.trim();
          let itemSplit = item.split("=");
          let itemName = itemSplit[0];
          itemSplit.splice(0, 1);
          let itemValue = decodeURIComponent(itemSplit.join(""));
          let nameRegexp = defaultOption.name instanceof RegExp ? defaultOption.name : new RegExp("^" + defaultOption.name, "g");
          if (itemName.match(nameRegexp)) {
            resultData.push({
              domain: this.windowApi.window.location.hostname,
              expirationDate: null,
              hostOnly: true,
              httpOnly: false,
              name: itemName,
              path: "/",
              sameSite: "unspecified",
              secure: true,
              session: false,
              value: itemValue
            });
          }
        });
        if (typeof callback === "function") {
          callback(resultData);
        }
      } catch (error) {
        if (typeof callback === "function") {
          callback(resultData, error);
        }
      }
    }
getList(option) {
      if (option == null) {
        throw new Error("Utils.GMCookie.list 参数不能为空");
      }
      let resultData = [];
      let defaultOption = {
        url: this.windowApi.window.location.href,
        domain: this.windowApi.window.location.hostname,
        name: "",
        path: "/"
      };
      defaultOption = commonUtil.assign(defaultOption, option);
      let cookies = this.getCookiesList();
      cookies.forEach((item) => {
        item = item.trim();
        let itemSplit = item.split("=");
        let itemName = itemSplit[0];
        itemSplit.splice(0, 1);
        let itemValue = decodeURIComponent(itemSplit.join(""));
        let nameRegexp = defaultOption.name instanceof RegExp ? defaultOption.name : new RegExp("^" + defaultOption.name, "g");
        if (itemName.match(nameRegexp)) {
          resultData.push({
            domain: this.windowApi.window.location.hostname,
            expirationDate: null,
            hostOnly: true,
            httpOnly: false,
            name: itemName,
            path: "/",
            sameSite: "unspecified",
            secure: true,
            session: false,
            value: itemValue
          });
        }
      });
      return resultData;
    }
set(option, callback) {
      let errorInfo;
      try {
        let defaultOption = {
          url: this.windowApi.window.location.href,
          name: "",
          value: "",
          domain: "",
          path: "/",
          secure: true,
          httpOnly: false,
expirationDate: Math.floor(Date.now()) + 60 * 60 * 24 * 30
        };
        defaultOption = commonUtil.assign(defaultOption, option);
        let life = defaultOption.expirationDate ? defaultOption.expirationDate : Math.floor(Date.now()) + 60 * 60 * 24 * 30;
        let cookieStr = defaultOption.name + "=" + decodeURIComponent(defaultOption.value) + ";expires=" + new Date(life).toGMTString() + "; path=/";
        if (commonUtil.isNull(defaultOption.domain)) {
          cookieStr += "; domain=" + defaultOption.domain;
        }
        this.windowApi.document.cookie = cookieStr;
      } catch (error) {
        errorInfo = error;
      } finally {
        if (typeof callback === "function") {
          callback(errorInfo);
        }
      }
    }
delete(option, callback) {
      let errorInfo;
      try {
        let defaultOption = {
          url: this.windowApi.window.location.href,
          name: "",
          path: "/",
          firstPartyDomain: ""
        };
        defaultOption = commonUtil.assign(defaultOption, option);
        let cookieStr = `${defaultOption.name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${defaultOption.path}`;
        if (commonUtil.isNull(defaultOption.firstPartyDomain)) {
          cookieStr += `; domain=${defaultOption.firstPartyDomain};`;
        }
        this.windowApi.document.cookie = cookieStr;
      } catch (error) {
        errorInfo = error;
      } finally {
        if (typeof callback === "function") {
          callback(errorInfo);
        }
      }
    }
parseCookie(cookieStr) {
      if (cookieStr.trim() === "") {
        return [];
      }
      let cookies = cookieStr.split(";");
      let result = [];
      for (const cookieItem of cookies) {
        let item = cookieItem.trim();
        let itemSplit = item.split("=");
        let itemName = itemSplit[0];
        itemSplit.splice(0, 1);
        let itemValue = decodeURIComponent(itemSplit.join(""));
        result.push({
          key: itemName,
          value: itemValue
        });
      }
      return result;
    }
  }
  // @license      GNU LGPL-3.0
  const ajaxHooker = function() {
    const version = "1.4.8";
    const hookInst = {
      hookFns: [],
      filters: []
    };
    const win = window.unsafeWindow || document.defaultView || window;
    let winAh = win.__ajaxHooker;
    const resProto = win.Response.prototype;
    const xhrResponses = ["response", "responseText", "responseXML"];
    const fetchResponses = ["arrayBuffer", "blob", "formData", "json", "text"];
    const xhrExtraProps = ["responseType", "timeout", "withCredentials"];
    const fetchExtraProps = [
      "cache",
      "credentials",
      "integrity",
      "keepalive",
      "mode",
      "priority",
      "redirect",
      "referrer",
      "referrerPolicy",
      "signal"
    ];
    const xhrAsyncEvents = ["readystatechange", "load", "loadend"];
    const getType = {}.toString.call.bind({}.toString);
    const getDescriptor = Object.getOwnPropertyDescriptor.bind(Object);
    const emptyFn = () => {
    };
    const errorFn = (e2) => console.error(e2);
    function isThenable(obj) {
      return obj && ["object", "function"].includes(typeof obj) && typeof obj.then === "function";
    }
    function catchError(fn, ...args) {
      try {
        const result = fn(...args);
        if (isThenable(result)) return result.then(null, errorFn);
        return result;
      } catch (err) {
        console.error(err);
      }
    }
    function defineProp(obj, prop, getter, setter) {
      Object.defineProperty(obj, prop, {
        configurable: true,
        enumerable: true,
        get: getter,
        set: setter
      });
    }
    function readonly(obj, prop, value = obj[prop]) {
      defineProp(obj, prop, () => value, emptyFn);
    }
    function writable(obj, prop, value = obj[prop]) {
      Object.defineProperty(obj, prop, {
        configurable: true,
        enumerable: true,
        writable: true,
        value
      });
    }
    function parseHeaders(obj) {
      const headers = {};
      switch (getType(obj)) {
        case "[object String]":
          for (const line of obj.trim().split(/[\r\n]+/)) {
            const [header, value] = line.split(new RegExp("(?<=^[^:]+)\\s*:\\s*"));
            if (!value) continue;
            const lheader = header.toLowerCase();
            headers[lheader] = lheader in headers ? `${headers[lheader]}, ${value}` : value;
          }
          break;
        case "[object Headers]":
          for (const [key, val] of obj) {
            headers[key] = val;
          }
          break;
        case "[object Object]":
          return { ...obj };
      }
      return headers;
    }
    function stopImmediatePropagation() {
      this.ajaxHooker_isStopped = true;
    }
    class SyncThenable {
      then(fn) {
        fn && fn();
        return new SyncThenable();
      }
    }
    class AHRequest {
      constructor(request) {
        this.request = request;
        this.requestClone = { ...this.request };
      }
      _recoverRequestKey(key) {
        if (key in this.requestClone) this.request[key] = this.requestClone[key];
        else delete this.request[key];
      }
      shouldFilter(filters) {
        const { type, url, method, async } = this.request;
        return filters.length && !filters.find((obj) => {
          switch (true) {
            case (obj.type && obj.type !== type):
            case (getType(obj.url) === "[object String]" && !url.includes(obj.url)):
            case (getType(obj.url) === "[object RegExp]" && !obj.url.test(url)):
            case (obj.method && obj.method.toUpperCase() !== method.toUpperCase()):
            case ("async" in obj && obj.async !== async):
              return false;
          }
          return true;
        });
      }
      waitForRequestKeys() {
        if (!this.request.async) {
          win.__ajaxHooker.hookInsts.forEach(({ hookFns, filters }) => {
            if (this.shouldFilter(filters)) return;
            hookFns.forEach((fn) => {
              if (getType(fn) === "[object Function]") catchError(fn, this.request);
            });
            for (const key in this.request) {
              if (isThenable(this.request[key])) this._recoverRequestKey(key);
            }
          });
          return new SyncThenable();
        }
        const promises = [];
        const ignoreKeys = new Set(["type", "async", "response"]);
        win.__ajaxHooker.hookInsts.forEach(({ hookFns, filters }) => {
          if (this.shouldFilter(filters)) return;
          promises.push(
            Promise.all(hookFns.map((fn) => catchError(fn, this.request))).then(() => {
              const requestKeys = [];
              for (const key in this.request) !ignoreKeys.has(key) && requestKeys.push(key);
              return Promise.all(
                requestKeys.map(
                  (key) => Promise.resolve(this.request[key]).then(
                    (val) => this.request[key] = val,
                    () => this._recoverRequestKey(key)
                  )
                )
              );
            })
          );
        });
        return Promise.all(promises);
      }
      waitForResponseKeys(response) {
        const responseKeys = this.request.type === "xhr" ? xhrResponses : fetchResponses;
        if (!this.request.async) {
          if (getType(this.request.response) === "[object Function]") {
            catchError(this.request.response, response);
            responseKeys.forEach((key) => {
              if ("get" in getDescriptor(response, key) || isThenable(response[key])) {
                delete response[key];
              }
            });
          }
          return new SyncThenable();
        }
        return Promise.resolve(catchError(this.request.response, response)).then(
          () => Promise.all(
            responseKeys.map((key) => {
              const descriptor = getDescriptor(response, key);
              if (descriptor && "value" in descriptor) {
                return Promise.resolve(descriptor.value).then(
                  (val) => response[key] = val,
                  () => delete response[key]
                );
              } else {
                delete response[key];
              }
            })
          )
        );
      }
    }
    const proxyHandler = {
      get(target, prop) {
        const descriptor = getDescriptor(target, prop);
        if (descriptor && !descriptor.configurable && !descriptor.writable && !descriptor.get)
          return target[prop];
        const ah = target.__ajaxHooker;
        if (ah && ah.proxyProps) {
          if (prop in ah.proxyProps) {
            const pDescriptor = ah.proxyProps[prop];
            if ("get" in pDescriptor) return pDescriptor.get();
            if (typeof pDescriptor.value === "function") return pDescriptor.value.bind(ah);
            return pDescriptor.value;
          }
          if (typeof target[prop] === "function") return target[prop].bind(target);
        }
        return target[prop];
      },
      set(target, prop, value) {
        const descriptor = getDescriptor(target, prop);
        if (descriptor && !descriptor.configurable && !descriptor.writable && !descriptor.set) return true;
        const ah = target.__ajaxHooker;
        if (ah && ah.proxyProps && prop in ah.proxyProps) {
          const pDescriptor = ah.proxyProps[prop];
          pDescriptor.set ? pDescriptor.set(value) : pDescriptor.value = value;
        } else {
          target[prop] = value;
        }
        return true;
      }
    };
    class XhrHooker {
      constructor(xhr) {
        const ah = this;
        Object.assign(ah, {
          originalXhr: xhr,
          proxyXhr: new Proxy(xhr, proxyHandler),
          resThenable: new SyncThenable(),
          proxyProps: {},
          proxyEvents: {}
        });
        xhr.addEventListener("readystatechange", (e2) => {
          if (ah.proxyXhr.readyState === 4 && ah.request && typeof ah.request.response === "function") {
            const response = {
              finalUrl: ah.proxyXhr.responseURL,
              status: ah.proxyXhr.status,
              responseHeaders: parseHeaders(ah.proxyXhr.getAllResponseHeaders())
            };
            const tempValues = {};
            for (const key of xhrResponses) {
              try {
                tempValues[key] = ah.originalXhr[key];
              } catch (err) {
              }
              defineProp(
                response,
                key,
                () => {
                  return response[key] = tempValues[key];
                },
                (val) => {
                  delete response[key];
                  response[key] = val;
                }
              );
            }
            ah.resThenable = new AHRequest(ah.request).waitForResponseKeys(response).then(() => {
              for (const key of xhrResponses) {
                ah.proxyProps[key] = {
                  get: () => {
                    if (!(key in response)) response[key] = tempValues[key];
                    return response[key];
                  }
                };
              }
            });
          }
          ah.dispatchEvent(e2);
        });
        xhr.addEventListener("load", (e2) => ah.dispatchEvent(e2));
        xhr.addEventListener("loadend", (e2) => ah.dispatchEvent(e2));
        for (const evt of xhrAsyncEvents) {
          const onEvt = "on" + evt;
          ah.proxyProps[onEvt] = {
            get: () => ah.proxyEvents[onEvt] || null,
            set: (val) => ah.addEvent(onEvt, val)
          };
        }
        for (const method of ["setRequestHeader", "addEventListener", "removeEventListener", "open", "send"]) {
          ah.proxyProps[method] = { value: ah[method] };
        }
      }
      toJSON() {
      }
addEvent(type, event) {
        if (type.startsWith("on")) {
          this.proxyEvents[type] = typeof event === "function" ? event : null;
        } else {
          if (typeof event === "object" && event !== null) event = event.handleEvent;
          if (typeof event !== "function") return;
          this.proxyEvents[type] = this.proxyEvents[type] || new Set();
          this.proxyEvents[type].add(event);
        }
      }
      removeEvent(type, event) {
        if (type.startsWith("on")) {
          this.proxyEvents[type] = null;
        } else {
          if (typeof event === "object" && event !== null) event = event.handleEvent;
          this.proxyEvents[type] && this.proxyEvents[type].delete(event);
        }
      }
      dispatchEvent(e2) {
        e2.stopImmediatePropagation = stopImmediatePropagation;
        defineProp(e2, "target", () => this.proxyXhr);
        defineProp(e2, "currentTarget", () => this.proxyXhr);
        defineProp(e2, "srcElement", () => this.proxyXhr);
        this.proxyEvents[e2.type] && this.proxyEvents[e2.type].forEach((fn) => {
          this.resThenable.then(() => !e2.ajaxHooker_isStopped && fn.call(this.proxyXhr, e2));
        });
        if (e2.ajaxHooker_isStopped) return;
        const onEvent = this.proxyEvents["on" + e2.type];
        onEvent && this.resThenable.then(onEvent.bind(this.proxyXhr, e2));
      }
      setRequestHeader(header, value) {
        this.originalXhr.setRequestHeader(header, value);
        if (!this.request) return;
        const headers = this.request.headers;
        headers[header] = header in headers ? `${headers[header]}, ${value}` : value;
      }
      addEventListener(...args) {
        if (xhrAsyncEvents.includes(args[0])) {
          this.addEvent(args[0], args[1]);
        } else {
          this.originalXhr.addEventListener(...args);
        }
      }
      removeEventListener(...args) {
        if (xhrAsyncEvents.includes(args[0])) {
          this.removeEvent(args[0], args[1]);
        } else {
          this.originalXhr.removeEventListener(...args);
        }
      }
      open(method, url, async = true, ...args) {
        this.request = {
          type: "xhr",
          url: url.toString(),
          method: method.toUpperCase(),
          abort: false,
          headers: {},
          data: null,
          response: null,
          async: !!async
        };
        this.openArgs = args;
        this.resThenable = new SyncThenable();
        ["responseURL", "readyState", "status", "statusText", ...xhrResponses].forEach((key) => {
          delete this.proxyProps[key];
        });
        return this.originalXhr.open(method, url, async, ...args);
      }
      send(data) {
        const ah = this;
        const xhr = ah.originalXhr;
        const request = ah.request;
        if (!request) return xhr.send(data);
        request.data = data;
        new AHRequest(request).waitForRequestKeys().then(() => {
          if (request.abort) {
            if (typeof request.response === "function") {
              Object.assign(ah.proxyProps, {
                responseURL: { value: request.url },
                readyState: { value: 4 },
                status: { value: 200 },
                statusText: { value: "OK" }
              });
              xhrAsyncEvents.forEach((evt) => xhr.dispatchEvent(new Event(evt)));
            }
          } else {
            xhr.open(request.method, request.url, request.async, ...ah.openArgs);
            for (const header in request.headers) {
              xhr.setRequestHeader(header, request.headers[header]);
            }
            for (const prop of xhrExtraProps) {
              if (prop in request) xhr[prop] = request[prop];
            }
            xhr.send(request.data);
          }
        });
      }
    }
    function fakeXHR() {
      const xhr = new winAh.realXHR();
      if ("__ajaxHooker" in xhr) console.warn("检测到不同版本的ajaxHooker,可能发生冲突!");
      xhr.__ajaxHooker = new XhrHooker(xhr);
      return xhr.__ajaxHooker.proxyXhr;
    }
    fakeXHR.prototype = win.XMLHttpRequest.prototype;
    Object.keys(win.XMLHttpRequest).forEach((key) => fakeXHR[key] = win.XMLHttpRequest[key]);
    function fakeFetch(url, options = {}) {
      if (!url) return winAh.realFetch.call(win, url, options);
      return new Promise(async (resolve, reject) => {
        const init = {};
        if (getType(url) === "[object Request]") {
          init.method = url.method;
          init.headers = url.headers;
          if (url.body) init.body = await url.arrayBuffer();
          for (const prop of fetchExtraProps) init[prop] = url[prop];
          url = url.url;
        }
        url = url.toString();
        Object.assign(init, options);
        init.method = init.method || "GET";
        init.headers = init.headers || {};
        const request = {
          type: "fetch",
          url,
          method: init.method.toUpperCase(),
          abort: false,
          headers: parseHeaders(init.headers),
          data: init.body,
          response: null,
          async: true
        };
        const req = new AHRequest(request);
        await req.waitForRequestKeys();
        if (request.abort) {
          if (typeof request.response === "function") {
            const response = {
              finalUrl: request.url,
              status: 200,
              responseHeaders: {}
            };
            await req.waitForResponseKeys(response);
            const key = fetchResponses.find((k) => k in response);
            let val = response[key];
            if (key === "json" && typeof val === "object") {
              val = catchError(JSON.stringify.bind(JSON), val);
            }
            const res = new Response(val, {
              status: 200,
              statusText: "OK"
            });
            defineProp(res, "type", () => "basic");
            defineProp(res, "url", () => request.url);
            resolve(res);
          } else {
            reject(new DOMException("aborted", "AbortError"));
          }
          return;
        }
        init.method = request.method;
        init.headers = request.headers;
        init.body = request.data;
        for (const prop of fetchExtraProps) {
          if (prop in request) init[prop] = request[prop];
        }
        winAh.realFetch.call(win, request.url, init).then((res) => {
          if (typeof request.response === "function") {
            const response = {
              finalUrl: res.url,
              status: res.status,
              responseHeaders: parseHeaders(res.headers)
            };
            if (res.ok) {
              fetchResponses.forEach(
                (key) => res[key] = function() {
                  if (key in response) return Promise.resolve(response[key]);
                  return resProto[key].call(this).then((val) => {
                    response[key] = val;
                    return req.waitForResponseKeys(response).then(() => key in response ? response[key] : val);
                  });
                }
              );
            } else {
              catchError(request.response, response);
            }
          }
          resolve(res);
        }, reject);
      });
    }
    function fakeFetchClone() {
      const descriptors = Object.getOwnPropertyDescriptors(this);
      const res = winAh.realFetchClone.call(this);
      Object.defineProperties(res, descriptors);
      return res;
    }
    winAh = win.__ajaxHooker = winAh || {
      version,
      fakeXHR,
      fakeFetch,
      fakeFetchClone,
      realXHR: win.XMLHttpRequest,
      realFetch: win.fetch,
      realFetchClone: resProto.clone,
      hookInsts: new Set()
    };
    if (winAh.version !== version) console.warn("检测到不同版本的ajaxHooker,可能发生冲突!");
    win.XMLHttpRequest = winAh.fakeXHR;
    win.fetch = winAh.fakeFetch;
    resProto.clone = winAh.fakeFetchClone;
    winAh.hookInsts.add(hookInst);
    class AHFunction extends Function {
      call(thisArg, ...args) {
        if (thisArg && thisArg.__ajaxHooker && thisArg.__ajaxHooker.proxyXhr === thisArg) {
          thisArg = thisArg.__ajaxHooker.originalXhr;
        }
        return Reflect.apply(this, thisArg, args);
      }
      apply(thisArg, args) {
        if (thisArg && thisArg.__ajaxHooker && thisArg.__ajaxHooker.proxyXhr === thisArg) {
          thisArg = thisArg.__ajaxHooker.originalXhr;
        }
        return Reflect.apply(this, thisArg, args || []);
      }
    }
    function hookSecsdk(csrf) {
      Object.setPrototypeOf(csrf.nativeXMLHttpRequestSetRequestHeader, AHFunction.prototype);
      Object.setPrototypeOf(csrf.nativeXMLHttpRequestOpen, AHFunction.prototype);
      Object.setPrototypeOf(csrf.nativeXMLHttpRequestSend, AHFunction.prototype);
    }
    if (win.secsdk) {
      if (win.secsdk.csrf && win.secsdk.csrf.nativeXMLHttpRequestOpen) hookSecsdk(win.secsdk.csrf);
    } else {
      defineProp(win, "secsdk", emptyFn, (secsdk) => {
        delete win.secsdk;
        win.secsdk = secsdk;
        defineProp(secsdk, "csrf", emptyFn, (csrf) => {
          delete secsdk.csrf;
          secsdk.csrf = csrf;
          if (csrf.nativeXMLHttpRequestOpen) hookSecsdk(csrf);
        });
      });
    }
    return {
      hook: (fn) => hookInst.hookFns.push(fn),
      filter: (arr) => {
        if (Array.isArray(arr)) hookInst.filters = arr;
      },
      protect: () => {
        readonly(win, "XMLHttpRequest", winAh.fakeXHR);
        readonly(win, "fetch", winAh.fakeFetch);
        readonly(resProto, "clone", winAh.fakeFetchClone);
      },
      unhook: () => {
        winAh.hookInsts.delete(hookInst);
        if (!winAh.hookInsts.size) {
          writable(win, "XMLHttpRequest", winAh.realXHR);
          writable(win, "fetch", winAh.realFetch);
          writable(resProto, "clone", winAh.realFetchClone);
          delete win.__ajaxHooker;
        }
      }
    };
  };
  const AjaxHooker1_2_4 = function() {
    return (function() {
      const win = window.unsafeWindow || document.defaultView || window;
      const hookFns = [];
      const realXhr = win.XMLHttpRequest;
      const resProto = win.Response.prototype;
      const toString = Object.prototype.toString;
      const realFetch = win.fetch;
      const xhrResponses = ["response", "responseText", "responseXML"];
      const fetchResponses = ["arrayBuffer", "blob", "formData", "json", "text"];
      const xhrAsyncEvents = ["readystatechange", "load", "loadend"];
      let filter;
      function emptyFn() {
      }
      function errorFn(err) {
        console.error(err);
      }
      function defineProp(obj, prop, getter, setter) {
        Object.defineProperty(obj, prop, {
          configurable: true,
          enumerable: true,
          get: getter,
          set: setter
        });
      }
      function readonly(obj, prop, value = obj[prop]) {
        defineProp(obj, prop, () => value, emptyFn);
      }
      function writable(obj, prop, value = obj[prop]) {
        Object.defineProperty(obj, prop, {
          configurable: true,
          enumerable: true,
          writable: true,
          value
        });
      }
      function toFilterObj(obj) {
        return {
          type: obj.type,
          url: obj.url,
          method: obj.method && obj.method.toUpperCase()
        };
      }
      function shouldFilter(type, url, method) {
        return filter && !filter.find(
          (obj) => (!obj.type || obj.type === type) && (!obj.url || (toString.call(obj.url) === "[object String]" ? url.includes(obj.url) : obj.url.test(url))) && (!obj.method || obj.method === method.toUpperCase())
        );
      }
      function lookupGetter(obj, prop) {
        let getter;
        let proto = obj;
        while (proto) {
          const descriptor = Object.getOwnPropertyDescriptor(proto, prop);
          getter = descriptor && descriptor.get;
          if (getter) break;
          proto = Object.getPrototypeOf(proto);
        }
        return getter ? getter.bind(obj) : emptyFn;
      }
      function waitForHookFns(request) {
        return Promise.all(
          hookFns.map((fn) => Promise.resolve(fn(request)).then(emptyFn, errorFn))
        );
      }
      function waitForRequestKeys(request, requestClone) {
        return Promise.all(
          ["url", "method", "abort", "headers", "data"].map((key) => {
            return Promise.resolve(request[key]).then(
              (val) => request[key] = val,
              () => request[key] = requestClone[key]
            );
          })
        );
      }
      function fakeEventSIP() {
        this.ajaxHooker_stopped = true;
      }
      function xhrDelegateEvent(e2) {
        const xhr = e2.target;
        e2.stopImmediatePropagation = fakeEventSIP;
        xhr.__ajaxHooker.hookedEvents[e2.type].forEach(
          (fn) => !e2.ajaxHooker_stopped && fn.call(xhr, e2)
        );
        const onEvent = xhr.__ajaxHooker.hookedEvents["on" + e2.type];
        typeof onEvent === "function" && onEvent.call(xhr, e2);
      }
      function xhrReadyStateChange(e2) {
        if (e2.target.readyState === 4) {
          e2.target.dispatchEvent(
            new CustomEvent("ajaxHooker_responseReady", { detail: e2 })
          );
        } else {
          e2.target.__ajaxHooker.delegateEvent(e2);
        }
      }
      function xhrLoadAndLoadend(e2) {
        e2.target.__ajaxHooker.delegateEvent(e2);
      }
      function fakeXhrOpen(method, url, ...args) {
        const ah = this.__ajaxHooker;
        ah.url = url.toString();
        ah.method = method.toUpperCase();
        ah.openArgs = args;
        ah.headers = {};
        return ah.originalMethods.open(method, url, ...args);
      }
      function fakeXhr() {
        const xhr = new realXhr();
        let ah = xhr.__ajaxHooker;
        if (!ah) {
          ah = xhr.__ajaxHooker = {
            headers: {},
            hookedEvents: {
              readystatechange: new Set(),
              load: new Set(),
              loadend: new Set()
            },
            delegateEvent: xhrDelegateEvent,
            originalGetters: {},
            originalMethods: {}
          };
          xhr.addEventListener("readystatechange", xhrReadyStateChange);
          xhr.addEventListener("load", xhrLoadAndLoadend);
          xhr.addEventListener("loadend", xhrLoadAndLoadend);
          for (const key of xhrResponses) {
            ah.originalGetters[key] = lookupGetter(xhr, key);
          }
          for (const method of [
            "open",
            "setRequestHeader",
            "addEventListener",
            "removeEventListener"
          ]) {
            ah.originalMethods[method] = xhr[method].bind(xhr);
          }
          xhr.open = fakeXhrOpen;
          xhr.setRequestHeader = (header, value) => {
            ah.originalMethods.setRequestHeader(header, value);
            if (xhr.readyState === 1) {
              if (ah.headers[header]) {
                ah.headers[header] += ", " + value;
              } else {
                ah.headers[header] = value;
              }
            }
          };
          xhr.addEventListener = function(...args) {
            if (xhrAsyncEvents.includes(args[0])) {
              ah.hookedEvents[args[0]].add(args[1]);
            } else {
              ah.originalMethods.addEventListener(...args);
            }
          };
          xhr.removeEventListener = function(...args) {
            if (xhrAsyncEvents.includes(args[0])) {
              ah.hookedEvents[args[0]].delete(args[1]);
            } else {
              ah.originalMethods.removeEventListener(...args);
            }
          };
          xhrAsyncEvents.forEach((evt) => {
            const onEvt = "on" + evt;
            defineProp(
              xhr,
              onEvt,
              () => {
                return ah.hookedEvents[onEvt] || null;
              },
              (val) => {
                ah.hookedEvents[onEvt] = typeof val === "function" ? val : null;
              }
            );
          });
        }
        const realSend = xhr.send.bind(xhr);
        xhr.send = function(data) {
          if (xhr.readyState !== 1) return realSend(data);
          ah.delegateEvent = xhrDelegateEvent;
          xhrResponses.forEach((prop) => {
            delete xhr[prop];
          });
          if (shouldFilter("xhr", ah.url, ah.method)) {
            xhr.addEventListener("ajaxHooker_responseReady", (e2) => {
              ah.delegateEvent(e2.detail);
            });
            return realSend(data);
          }
          try {
            const request = {
              type: "xhr",
              url: ah.url,
              method: ah.method,
              abort: false,
              headers: ah.headers,
              data,
              response: null
            };
            const requestClone = { ...request };
            waitForHookFns(request).then(() => {
              waitForRequestKeys(request, requestClone).then(() => {
                if (request.abort) return;
                ah.originalMethods.open(
                  request.method,
                  request.url,
                  ...ah.openArgs
                );
                for (const header in request.headers) {
                  ah.originalMethods.setRequestHeader(
                    header,
                    request.headers[header]
                  );
                }
                data = request.data;
                xhr.addEventListener("ajaxHooker_responseReady", (e2) => {
                  try {
                    if (typeof request.response === "function") {
                      const arg = {
                        finalUrl: xhr.responseURL,
                        status: xhr.status,
                        responseHeaders: {}
                      };
                      for (const line of xhr.getAllResponseHeaders().trim().split(/[\r\n]+/)) {
                        const parts = line.split(/:\s*/);
                        if (parts.length === 2) {
                          const lheader = parts[0].toLowerCase();
                          if (arg.responseHeaders[lheader]) {
                            arg.responseHeaders[lheader] += ", " + parts[1];
                          } else {
                            arg.responseHeaders[lheader] = parts[1];
                          }
                        }
                      }
                      xhrResponses.forEach((prop) => {
                        defineProp(
                          arg,
                          prop,
                          () => {
                            return arg[prop] = ah.originalGetters[prop]();
                          },
                          (val) => {
                            delete arg[prop];
                            arg[prop] = val;
                          }
                        );
                        defineProp(xhr, prop, () => {
                          const val = ah.originalGetters[prop]();
                          xhr.dispatchEvent(
                            new CustomEvent("ajaxHooker_readResponse", {
                              detail: { prop, val }
                            })
                          );
                          return val;
                        });
                      });
                      xhr.addEventListener("ajaxHooker_readResponse", (e3) => {
                        arg[e3.detail.prop] = e3.detail.val;
                      });
                      const resPromise = Promise.resolve(
                        request.response(arg)
                      ).then(() => {
                        const task = [];
                        xhrResponses.forEach((prop) => {
                          const descriptor = Object.getOwnPropertyDescriptor(
                            arg,
                            prop
                          );
                          if (descriptor && "value" in descriptor) {
                            task.push(
                              Promise.resolve(descriptor.value).then((val) => {
                                arg[prop] = val;
                                defineProp(xhr, prop, () => {
                                  xhr.dispatchEvent(
                                    new CustomEvent("ajaxHooker_readResponse", {
                                      detail: { prop, val }
                                    })
                                  );
                                  return val;
                                });
                              }, emptyFn)
                            );
                          }
                        });
                        return Promise.all(task);
                      }, errorFn);
                      const eventsClone = {};
                      xhrAsyncEvents.forEach((type) => {
                        eventsClone[type] = new Set([...ah.hookedEvents[type]]);
                        eventsClone["on" + type] = ah.hookedEvents["on" + type];
                      });
                      ah.delegateEvent = (event) => resPromise.then(() => {
                        event.stopImmediatePropagation = fakeEventSIP;
                        eventsClone[event.type].forEach(
                          (fn) => !event.ajaxHooker_stopped && fn.call(xhr, event)
                        );
                        const onEvent = eventsClone["on" + event.type];
                        typeof onEvent === "function" && onEvent.call(xhr, event);
                      });
                    }
                  } catch (err) {
                    console.error(err);
                  }
                  ah.delegateEvent(e2.detail);
                });
                realSend(data);
              });
            });
          } catch (err) {
            console.error(err);
            realSend(data);
          }
        };
        return xhr;
      }
      function hookFetchResponse(response, arg, callback) {
        fetchResponses.forEach((prop) => {
          response[prop] = () => new Promise((resolve, reject) => {
            resProto[prop].call(response).then((res) => {
              if (prop in arg) {
                resolve(arg[prop]);
              } else {
                try {
                  arg[prop] = res;
                  Promise.resolve(callback(arg)).then(() => {
                    if (prop in arg) {
                      Promise.resolve(arg[prop]).then(
                        (val) => resolve(arg[prop] = val),
                        () => resolve(res)
                      );
                    } else {
                      resolve(res);
                    }
                  }, errorFn);
                } catch (err) {
                  console.error(err);
                  resolve(res);
                }
              }
            }, reject);
          });
        });
      }
      function fakeFetch(url, init) {
        if (url && typeof url.toString === "function") {
          url = url.toString();
          init = init || {};
          init.method = init.method || "GET";
          init.headers = init.headers || {};
          if (shouldFilter("fetch", url, init.method))
            return realFetch.call(win, url, init);
          const request = {
            type: "fetch",
            url,
            method: init.method.toUpperCase(),
            abort: false,
            headers: {},
            data: init.body,
            response: null
          };
          if (toString.call(init.headers) === "[object Headers]") {
            for (const [key, val] of init.headers) {
              request.headers[key] = val;
            }
          } else {
            request.headers = { ...init.headers };
          }
          const requestClone = { ...request };
          return new Promise((resolve, reject) => {
            try {
              waitForHookFns(request).then(() => {
                waitForRequestKeys(request, requestClone).then(() => {
                  if (request.abort) return reject("aborted");
                  url = request.url;
                  init.method = request.method;
                  init.headers = request.headers;
                  init.body = request.data;
                  realFetch.call(win, url, init).then((response) => {
                    if (typeof request.response === "function") {
                      const arg = {
                        finalUrl: response.url,
                        status: response.status,
                        responseHeaders: {}
                      };
                      for (const [key, val] of response.headers) {
                        arg.responseHeaders[key] = val;
                      }
                      hookFetchResponse(response, arg, request.response);
                      response.clone = () => {
                        const resClone = resProto.clone.call(response);
                        hookFetchResponse(resClone, arg, request.response);
                        return resClone;
                      };
                    }
                    resolve(response);
                  }, reject);
                });
              });
            } catch (err) {
              console.error(err);
              return realFetch.call(win, url, init);
            }
          });
        } else {
          return realFetch.call(win, url, init);
        }
      }
      win.XMLHttpRequest = fakeXhr;
      Object.keys(realXhr).forEach((key) => fakeXhr[key] = realXhr[key]);
      fakeXhr.prototype = realXhr.prototype;
      win.fetch = fakeFetch;
      return {
        hook: (fn) => hookFns.push(fn),
        filter: (arr) => {
          filter = Array.isArray(arr) && arr.map(toFilterObj);
        },
        protect: () => {
          readonly(win, "XMLHttpRequest", fakeXhr);
          readonly(win, "fetch", fakeFetch);
        },
        unhook: () => {
          writable(win, "XMLHttpRequest", realXhr);
          writable(win, "fetch", realFetch);
        }
      };
    })();
  };
  class GMMenu {
    GM_Api = {
getValue: null,
setValue: null,
registerMenuCommand: null,
unregisterMenuCommand: null
    };
    MenuHandle = {
      context: this,
      $data: {
data: [],
key: "GM_Menu_Local_Map"
      },
      $default: {
autoReload: true,
isStoreValue: true
      },
      $emoji: {
success: "✅",
error: "❌"
      },
init() {
        for (let index = 0; index < this.$data.data.length; index++) {
          let menuOption = this.$data.data[index]["data"];
          menuOption.enable = Boolean(this.getLocalMenuData(menuOption.key, menuOption.enable));
          if (typeof menuOption.showText !== "function") {
            menuOption.showText = (menuText, menuEnable) => {
              if (menuEnable) {
                return this.$emoji.success + " " + menuText;
              } else {
                return this.$emoji.error + " " + menuText;
              }
            };
          }
        }
      },
register(menuOptions) {
        let that = this;
        if (menuOptions == null) {
          throw new TypeError("register菜单数据不能为空");
        }
        if (!Array.isArray(menuOptions)) {
          menuOptions = [menuOptions];
        }
        for (let index = 0; index < menuOptions.length; index++) {
          let cloneMenuOptionData = commonUtil.deepClone(menuOptions[index].data);
          const { showText, clickCallBack } = this.handleMenuData(cloneMenuOptionData);
          let menuId = that.context.GM_Api.registerMenuCommand(showText, clickCallBack);
          menuOptions[index].id = menuId;
          cloneMenuOptionData.deleteMenu = function() {
            that.context.GM_Api.unregisterMenuCommand(menuId);
          };
          Reflect.deleteProperty(menuOptions[index], "handleData");
          menuOptions[index].handleData = cloneMenuOptionData;
        }
      },
getLocalMenuData(key, defaultValue) {
        let localData = this.context.GM_Api.getValue(this.$data.key, {});
        if (key in localData) {
          return localData[key];
        } else {
          return defaultValue;
        }
      },
setLocalMenuData(key, value) {
        let localData = this.context.GM_Api.getValue(this.$data.key, {});
        localData[key] = value;
        this.context.GM_Api.setValue(this.$data.key, localData);
      },
handleInitDetail(menuOption) {
        menuOption.enable = Boolean(this.getLocalMenuData(menuOption.key, menuOption.enable));
        if (typeof menuOption.showText !== "function") {
          menuOption.showText = (menuText, menuEnable) => {
            if (menuEnable) {
              return this.$emoji.success + " " + menuText;
            } else {
              return this.$emoji.error + " " + menuText;
            }
          };
        }
        return menuOption;
      },
handleMenuData(menuOption) {
        let that = this;
        let menuLocalDataItemKey = menuOption.key;
        let defaultEnable = Boolean(this.getLocalMenuData(menuLocalDataItemKey, menuOption.enable));
        let showText = menuOption.showText(menuOption.text, defaultEnable);
        menuOption.autoReload = typeof menuOption.autoReload !== "boolean" ? this.$default.autoReload : menuOption.autoReload;
        menuOption.isStoreValue = typeof menuOption.isStoreValue !== "boolean" ? this.$default.isStoreValue : menuOption.isStoreValue;
        function clickCallBack(event) {
          let localEnable = Boolean(that.getLocalMenuData(menuLocalDataItemKey, defaultEnable));
          if (menuOption.isStoreValue) {
            that.setLocalMenuData(menuLocalDataItemKey, !localEnable);
          }
          if (typeof menuOption.callback === "function") {
            menuOption.callback({
              key: menuLocalDataItemKey,
              enable: !localEnable,
              oldEnable: localEnable,
              event,
              storeValue(value) {
                that.setLocalMenuData(menuLocalDataItemKey, value);
              }
            });
          }
          if (menuOption.autoReload) {
            window.location.reload();
          } else {
            that.context.update();
          }
        }
        return {
          showText,
          clickCallBack
        };
      },
getMenuData(menuKey) {
        return this.$data.data.find((item) => item.data.key === menuKey);
      },
getMenuOption(menuKey) {
        return this.$data.data.find((item) => item.data.key === menuKey)?.data;
      },
getMenuHandledOption(menuKey) {
        return this.$data.data.find((item) => item.handleData.key === menuKey)?.handleData;
      }
    };
    constructor(details) {
      this.GM_Api.getValue = details.GM_getValue;
      this.GM_Api.setValue = details.GM_setValue;
      this.GM_Api.registerMenuCommand = details.GM_registerMenuCommand;
      this.GM_Api.unregisterMenuCommand = details.GM_unregisterMenuCommand;
      this.MenuHandle.$default.autoReload = typeof details.autoReload === "boolean" ? details.autoReload : true;
      for (const keyName of Object.keys(this.GM_Api)) {
        if (typeof this.GM_Api[keyName] !== "function") {
          throw new Error(`Utils.GM_Menu 请在脚本开头加上 @grant  ${keyName},且传入该对象`);
        }
      }
      this.add(details?.data || []);
    }
__add(menuOption) {
      if (Array.isArray(menuOption)) {
        for (let index = 0; index < menuOption.length; index++) {
          const option = menuOption[index];
          this.MenuHandle.$data.data.push({
            data: option,
            id: void 0
          });
        }
      } else {
        this.MenuHandle.$data.data.push({
          data: menuOption,
          id: void 0
        });
      }
    }
add(menuOption) {
      this.__add(menuOption);
      this.update();
    }
update(options) {
      let menuOptionList = [];
      if (Array.isArray(options)) {
        menuOptionList = [...menuOptionList, ...options];
      } else if (options != null) {
        menuOptionList = [...menuOptionList, options];
      }
      menuOptionList.forEach((menuOption) => {
        let oldMenuOption = this.MenuHandle.getMenuOption(menuOption.key);
        if (oldMenuOption) {
          Object.assign(oldMenuOption, menuOption);
        } else {
          this.__add(menuOption);
        }
      });
      this.MenuHandle.$data.data.forEach((value) => {
        if (value.handleData) {
          value.handleData.deleteMenu();
        }
      });
      this.MenuHandle.init();
      this.MenuHandle.register(this.MenuHandle.$data.data);
    }
delete(menuId) {
      this.GM_Api.unregisterMenuCommand(menuId);
    }
get(menuKey) {
      return this.getEnable(menuKey);
    }
getEnable(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey).enable;
    }
getText(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey).text;
    }
getShowTextValue(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey).showText(this.getText(menuKey), this.getEnable(menuKey));
    }
getMenuId(menuKey) {
      let result = null;
      for (let index = 0; index < this.MenuHandle.$data.data.length; index++) {
        const optionData = this.MenuHandle.$data.data[index];
        if (optionData.handleData.key === menuKey) {
          result = optionData.id;
          break;
        }
      }
      return result;
    }
getAccessKey(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey)?.accessKey;
    }
getAutoClose(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey)?.autoClose;
    }
getAutoReload(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey)?.autoReload;
    }
getCallBack(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey)?.callback;
    }
getEnableTrueEmoji() {
      return this.MenuHandle.$emoji.success;
    }
getEnableFalseEmoji() {
      return this.MenuHandle.$emoji.error;
    }
getLocalStorageKeyName() {
      return this.MenuHandle.$data.key;
    }
setValue(menuKey, value) {
      this.MenuHandle.setLocalMenuData(menuKey, value);
    }
setEnable(menuKey, value) {
      this.setValue(menuKey, Boolean(value));
    }
setEnableTrueEmoji(emojiString) {
      if (typeof emojiString !== "string") {
        throw new Error("参数emojiString必须是string类型");
      }
      this.MenuHandle.$emoji.success = emojiString;
    }
setEnableFalseEmoji(emojiString) {
      if (typeof emojiString !== "string") {
        throw new Error("参数emojiString必须是string类型");
      }
      this.MenuHandle.$emoji.error = emojiString;
    }
setLocalStorageKeyName(keyName) {
      if (typeof keyName !== "string") {
        throw new Error("参数keyName必须是string类型");
      }
      this.MenuHandle.$data.key = keyName;
    }
  }
  class Hooks {
initEnv() {
      Function.prototype.hook = function(realFunc, hookFunc, context) {
        let _context = null;
        let _funcName = null;
        _context = context || window;
        _funcName = getFuncName(this);
        _context["realFunc_" + _funcName] = this;
        if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {
          console.log("Already has been hooked,unhook first");
          return false;
        }
        function getFuncName(fn) {
          let strFunc = fn.toString();
          let _regex = /function\s+(\w+)\s*\(/;
          let patten = strFunc.match(_regex);
          if (patten) {
            return patten[1];
          }
          return "";
        }
        try {
          new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
        let args = Array.prototype.slice.call(arguments, 0);
        let obj = this;
        hookFunc.apply(obj, args);
        return _context['realFunc_${_funcName}'].apply(obj, args);
    };`)(_context, _funcName, hookFunc);
          _context[_funcName].prototype.isHooked = true;
          return true;
        } catch (e2) {
          console.log("Hook failed,check the params.");
          return false;
        }
      };
      Function.prototype.unhook = function(realFunc, funcName, context) {
        let _context = null;
        let _funcName = null;
        _context = context || window;
        _funcName = funcName;
        if (!_context[_funcName].prototype.isHooked) {
          console.log("No function is hooked on");
          return false;
        }
        _context[_funcName] = _context["realFunc" + _funcName];
        Reflect.deleteProperty(_context, "realFunc_" + _funcName);
        return true;
      };
    }
cleanEnv() {
      if (Function.prototype.hasOwnProperty("hook")) {
        Reflect.deleteProperty(Function.prototype, "hook");
      }
      if (Function.prototype.hasOwnProperty("unhook")) {
        Reflect.deleteProperty(Function.prototype, "unhook");
      }
      return true;
    }
  }
  const GenerateUUID = function() {
    if (typeof window?.crypto?.randomUUID === "function") {
      return window.crypto.randomUUID();
    } else {
      return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(charStr) {
        var randomValue = Math.random() * 16 | 0, randomCharValue = charStr === "x" ? randomValue : randomValue & 3 | 8;
        return randomCharValue.toString(16);
      });
    }
  };
  class Httpx {
    GM_Api = {
      xmlHttpRequest: null
    };
    HttpxRequestHook = {
$config: {
        configList: []
      },
async beforeRequestCallBack(details) {
        if (typeof details.allowInterceptConfig === "boolean") {
          if (!details.allowInterceptConfig) {
            return details;
          }
        } else {
          if (details.allowInterceptConfig != null) {
            if (typeof details.allowInterceptConfig.beforeRequest === "boolean" && !details.allowInterceptConfig.beforeRequest) {
              return details;
            }
          }
        }
        for (let index = 0; index < this.$config.configList.length; index++) {
          let item = this.$config.configList[index];
          if (typeof item.fn === "function") {
            let result = await item.fn(details);
            if (result == null) {
              return;
            }
          }
        }
        return details;
      },
add(fn) {
        if (typeof fn === "function") {
          let uuid = GenerateUUID();
          this.$config.configList.push({
            id: uuid,
            fn
          });
          return uuid;
        } else {
          console.warn("[Httpx-HttpxRequestHook.addBeforeRequestCallBack] fn is not a function");
        }
      },
delete(id) {
        if (typeof id === "string") {
          let findIndex = this.$config.configList.findIndex((item) => item.id === id);
          if (findIndex !== -1) {
            this.$config.configList.splice(findIndex, 1);
            return true;
          }
        }
        return false;
      },
clearAll() {
        this.$config.configList = [];
      }
    };
    HttpxResponseHook = {
$config: {
        configList: []
      },
async successResponseCallBack(response, details) {
        if (typeof details.allowInterceptConfig === "boolean") {
          if (!details.allowInterceptConfig) {
            return details;
          }
        } else {
          if (details.allowInterceptConfig != null) {
            if (typeof details.allowInterceptConfig.afterResponseSuccess === "boolean" && !details.allowInterceptConfig.afterResponseSuccess) {
              return details;
            }
          }
        }
        for (let index = 0; index < this.$config.configList.length; index++) {
          let item = this.$config.configList[index];
          if (typeof item.successFn === "function") {
            let result = await item.successFn(response, details);
            if (result == null) {
              return;
            }
          }
        }
        return response;
      },
async errorResponseCallBack(data) {
        if (typeof data.details.allowInterceptConfig === "boolean") {
          if (!data.details.allowInterceptConfig) {
            return data;
          }
        } else {
          if (data.details.allowInterceptConfig != null) {
            if (typeof data.details.allowInterceptConfig.afterResponseError === "boolean" && !data.details.allowInterceptConfig.afterResponseError) {
              return data;
            }
          }
        }
        for (let index = 0; index < this.$config.configList.length; index++) {
          let item = this.$config.configList[index];
          if (typeof item.errorFn === "function") {
            let result = await item.errorFn(data);
            if (result == null) {
              return;
            }
          }
        }
        return data;
      },
add(successFn, errorFn) {
        let id = GenerateUUID();
        this.$config.configList.push({
          id,
          successFn,
          errorFn
        });
        return id;
      },
delete(id) {
        if (typeof id === "string") {
          let findIndex = this.$config.configList.findIndex((item) => item.id === id);
          if (findIndex !== -1) {
            this.$config.configList.splice(findIndex, 1);
            return true;
          }
        }
        return false;
      },
clearAll() {
        this.$config.configList = [];
      }
    };
    HttpxRequestOption = {
      context: this,
handleBeforeRequestOptionArgs(...args) {
        let option = {
          url: void 0
        };
        if (typeof args[0] === "string") {
          let url = args[0];
          option.url = url;
          if (typeof args[1] === "object") {
            let optionArg = args[1];
            commonUtil.assign(option, optionArg, true);
            option.url = url;
          }
        } else {
          let optionArg = args[0];
          commonUtil.assign(option, optionArg, true);
        }
        return option;
      },
getRequestOption(method, userRequestOption, resolve, reject) {
        let that = this;
        let url = userRequestOption.url || this.context.#defaultRequestOption.url;
        if (typeof url === "string") {
          url = url.trim();
          if (url.startsWith("http://") || url.startsWith("https://")) ;
          else {
            if (typeof this.context.#defaultInitOption.baseURL === "string") {
              url = this.context.#defaultInitOption.baseURL + url;
            }
          }
        }
        let requestOption = {
          url,
          method: (method || "GET").toString().toUpperCase().trim(),
          timeout: userRequestOption.timeout || this.context.#defaultRequestOption.timeout,
          responseType: userRequestOption.responseType || this.context.#defaultRequestOption.responseType,
headers: commonUtil.deepClone(this.context.#defaultRequestOption.headers),
          data: userRequestOption.data || this.context.#defaultRequestOption.data,
          redirect: userRequestOption.redirect || this.context.#defaultRequestOption.redirect,
          cookie: userRequestOption.cookie || this.context.#defaultRequestOption.cookie,
          cookiePartition: userRequestOption.cookiePartition || this.context.#defaultRequestOption.cookiePartition,
          binary: userRequestOption.binary || this.context.#defaultRequestOption.binary,
          nocache: userRequestOption.nocache || this.context.#defaultRequestOption.nocache,
          revalidate: userRequestOption.revalidate || this.context.#defaultRequestOption.revalidate,
context: commonUtil.deepClone(userRequestOption.context || this.context.#defaultRequestOption.context),
          overrideMimeType: userRequestOption.overrideMimeType || this.context.#defaultRequestOption.overrideMimeType,
          anonymous: userRequestOption.anonymous || this.context.#defaultRequestOption.anonymous,
          fetch: userRequestOption.fetch || this.context.#defaultRequestOption.fetch,
fetchInit: commonUtil.deepClone(this.context.#defaultRequestOption.fetchInit),
          allowInterceptConfig: {
            beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig.beforeRequest,
            afterResponseSuccess: this.context.#defaultRequestOption.allowInterceptConfig.afterResponseSuccess,
            afterResponseError: this.context.#defaultRequestOption.allowInterceptConfig.afterResponseError
          },
          user: userRequestOption.user || this.context.#defaultRequestOption.user,
          password: userRequestOption.password || this.context.#defaultRequestOption.password,
          onabort(...args) {
            that.context.HttpxResponseCallBack.onAbort(userRequestOption, resolve, reject, args);
          },
          onerror(...args) {
            that.context.HttpxResponseCallBack.onError(userRequestOption, resolve, reject, args);
          },
          onloadstart(...args) {
            that.context.HttpxResponseCallBack.onLoadStart(userRequestOption, args);
          },
          onprogress(...args) {
            that.context.HttpxResponseCallBack.onProgress(userRequestOption, args);
          },
          onreadystatechange(...args) {
            that.context.HttpxResponseCallBack.onReadyStateChange(userRequestOption, args);
          },
          ontimeout(...args) {
            that.context.HttpxResponseCallBack.onTimeout(userRequestOption, resolve, reject, args);
          },
          onload(...args) {
            that.context.HttpxResponseCallBack.onLoad(userRequestOption, resolve, reject, args);
          }
        };
        if (typeof userRequestOption.allowInterceptConfig === "boolean") {
          Object.keys(requestOption.allowInterceptConfig).forEach((keyName) => {
            Reflect.set(requestOption.allowInterceptConfig, keyName, userRequestOption.allowInterceptConfig);
          });
        } else {
          if (typeof userRequestOption.allowInterceptConfig === "object" && userRequestOption.allowInterceptConfig != null) {
            Object.keys(userRequestOption.allowInterceptConfig).forEach((keyName) => {
              let value = Reflect.get(userRequestOption.allowInterceptConfig, keyName);
              if (typeof value === "boolean" && Reflect.has(requestOption.allowInterceptConfig, keyName)) {
                Reflect.set(requestOption.allowInterceptConfig, keyName, value);
              }
            });
          }
        }
        if (typeof this.context.GM_Api.xmlHttpRequest !== "function") {
          requestOption.fetch = true;
        }
        if (typeof requestOption.headers === "object") {
          if (typeof userRequestOption.headers === "object") {
            Object.keys(userRequestOption.headers).forEach((keyName, index) => {
              if (keyName in requestOption.headers && userRequestOption.headers?.[keyName] == null) {
                Reflect.deleteProperty(requestOption.headers, keyName);
              } else {
                requestOption.headers[keyName] = userRequestOption?.headers?.[keyName];
              }
            });
          }
        } else {
          Reflect.set(requestOption, "headers", userRequestOption.headers);
        }
        if (typeof requestOption.fetchInit === "object") {
          if (typeof userRequestOption.fetchInit === "object") {
            Object.keys(userRequestOption.fetchInit).forEach((keyName, index) => {
              if (keyName in requestOption.fetchInit && userRequestOption.fetchInit[keyName] == null) {
                Reflect.deleteProperty(requestOption.fetchInit, keyName);
              } else {
                Reflect.set(requestOption.fetchInit, keyName, Reflect.get(userRequestOption.fetchInit, keyName));
              }
            });
          }
        } else {
          Reflect.set(requestOption, "fetchInit", userRequestOption.fetchInit);
        }
        if (typeof requestOption.cookiePartition === "object" && requestOption.cookiePartition != null) {
          if (Reflect.has(requestOption.cookiePartition, "topLevelSite") && typeof requestOption.cookiePartition.topLevelSite !== "string") {
            Reflect.deleteProperty(requestOption.cookiePartition, "topLevelSite");
          }
        }
        try {
          new URL(requestOption.url);
        } catch (error) {
          if (requestOption.url.startsWith("//")) {
            requestOption.url = globalThis.location.protocol + requestOption.url;
          } else if (requestOption.url.startsWith("/")) {
            requestOption.url = globalThis.location.origin + requestOption.url;
          } else {
            requestOption.url = globalThis.location.origin + "/" + requestOption.url;
          }
        }
        if (requestOption.fetchInit && !requestOption.fetch) {
          Reflect.deleteProperty(requestOption, "fetchInit");
        }
        try {
          let processData = userRequestOption.processData ?? true;
          if (requestOption.data != null && processData) {
            let method2 = requestOption.method;
            if (method2 === "GET" || method2 === "HEAD") {
              let urlObj = new URL(requestOption.url);
              let urlSearch = "";
              let isHandler = false;
              if (typeof requestOption.data === "string") {
                isHandler = true;
                urlSearch = requestOption.data;
              } else if (typeof requestOption.data === "object") {
                isHandler = true;
                let searchParams = new URLSearchParams(requestOption.data);
                urlSearch = searchParams.toString();
              }
              if (isHandler) {
                Reflect.deleteProperty(requestOption, "data");
              }
              if (urlSearch != "") {
                if (urlObj.search === "") {
                  urlObj.search = urlSearch;
                } else {
                  if (urlObj.search.endsWith("&")) {
                    urlObj.search = urlObj.search + urlSearch;
                  } else {
                    urlObj.search = urlObj.search + "&" + urlSearch;
                  }
                }
              }
              requestOption.url = urlObj.toString();
            } else if (method2 === "POST" && requestOption.headers != null) {
              let headersKeyList = Object.keys(requestOption.headers);
              let ContentTypeIndex = headersKeyList.findIndex((headerKey) => {
                return headerKey.trim().toLowerCase() === "content-type" && typeof requestOption.headers[headerKey] === "string";
              });
              if (ContentTypeIndex !== -1) {
                let ContentTypeKey = headersKeyList[ContentTypeIndex];
                let ContentType = requestOption.headers[ContentTypeKey];
                if (ContentType.includes("application/json")) {
                  if (requestOption.data instanceof FormData) {
                    const entries = {};
                    requestOption.data.forEach((value, key) => {
                      entries[key] = value;
                    });
                    requestOption.data = JSON.stringify(entries);
                  } else if (typeof requestOption.data === "object") {
                    requestOption.data = JSON.stringify(requestOption.data);
                  }
                } else if (ContentType.includes("application/x-www-form-urlencoded")) {
                  if (typeof requestOption.data === "object") {
                    requestOption.data = new URLSearchParams(requestOption.data).toString();
                  }
                } else if (ContentType.includes("multipart/form-data")) {
                  if (requestOption.data instanceof FormData) {
                    Reflect.deleteProperty(requestOption.headers, ContentTypeKey);
                  }
                }
              }
            }
          }
        } catch (error) {
          console.warn("Httpx ==> 转换data参数错误", error);
        }
        return requestOption;
      },
removeRequestNullOption(option) {
        Object.keys(option).forEach((keyName) => {
          if (option[keyName] == null || option[keyName] instanceof Function && commonUtil.isNull(option[keyName])) {
            Reflect.deleteProperty(option, keyName);
            return;
          }
        });
        if (commonUtil.isNull(option.url)) {
          throw new TypeError(`Utils.Httpx 参数url不能为空:${option.url}`);
        }
        return option;
      },
handleFetchOption(option) {
        let fetchRequestOption = {};
        if ((option.method === "GET" || option.method === "HEAD") && option.data != null) {
          Reflect.deleteProperty(option, "data");
        }
        let abortController = new AbortController();
        let signal = abortController.signal;
        signal.onabort = () => {
          option.onabort({
            isFetch: true,
            responseText: "",
            response: null,
            readyState: 4,
            responseHeaders: "",
            status: 0,
            statusText: "",
            error: "aborted"
          });
        };
        fetchRequestOption.method = option.method ?? "GET";
        fetchRequestOption.headers = option.headers;
        fetchRequestOption.body = option.data;
        fetchRequestOption.mode = "cors";
        fetchRequestOption.credentials = "include";
        fetchRequestOption.cache = "no-cache";
        fetchRequestOption.redirect = "follow";
        fetchRequestOption.referrerPolicy = "origin-when-cross-origin";
        fetchRequestOption.signal = signal;
        Object.assign(fetchRequestOption, option.fetchInit || {});
        return {
          fetchOption: option,
          fetchRequestOption,
          abortController
        };
      }
    };
    HttpxResponseCallBack = {
      context: this,
async onAbort(details, resolve, reject, argsResult) {
        if (typeof details?.onabort === "function") {
          details.onabort.apply(this, argsResult);
        } else if (typeof this.context.#defaultRequestOption?.onabort === "function") {
          this.context.#defaultRequestOption.onabort.apply(this, argsResult);
        }
        let response = argsResult;
        if (response.length) {
          response = response[0];
        }
        if (await this.context.HttpxResponseHook.errorResponseCallBack({
          type: "onabort",
          error: new Error("request canceled"),
          response: null,
          details
        }) == null) {
          return;
        }
        resolve({
          data: response,
          details,
          msg: "请求被取消",
          status: false,
          statusCode: -1,
          type: "onabort"
        });
      },
async onTimeout(details, resolve, reject, argsResult) {
        if (typeof details?.ontimeout === "function") {
          details.ontimeout.apply(this, argsResult);
        } else if (typeof this.context.#defaultRequestOption?.ontimeout === "function") {
          this.context.#defaultRequestOption.ontimeout.apply(this, argsResult);
        }
        let response = argsResult;
        if (response.length) {
          response = response[0];
        }
        if (await this.context.HttpxResponseHook.errorResponseCallBack({
          type: "ontimeout",
          error: new Error("request timeout"),
          response,
          details
        }) == null) {
          return;
        }
        resolve({
          data: response,
          details,
          msg: "请求超时",
          status: false,
          statusCode: 0,
          type: "ontimeout"
        });
      },
async onError(details, resolve, reject, argsResult) {
        if (typeof details?.onerror === "function") {
          details.onerror.apply(this, argsResult);
        } else if (typeof this.context.#defaultRequestOption?.onerror === "function") {
          this.context.#defaultRequestOption.onerror.apply(this, argsResult);
        }
        let response = argsResult;
        if (response.length) {
          response = response[0];
        }
        if (await this.context.HttpxResponseHook.errorResponseCallBack({
          type: "onerror",
          error: new Error("request error"),
          response,
          details
        }) == null) {
          return;
        }
        resolve({
          data: response,
          details,
          msg: "请求异常",
          status: false,
          statusCode: response["status"],
          type: "onerror"
        });
      },
async onLoad(details, resolve, reject, argsResult) {
        let originResponse = argsResult[0];
        if (commonUtil.isNull(originResponse["responseText"]) && commonUtil.isNotNull(originResponse["response"])) {
          if (typeof originResponse["response"] === "object") {
            TryCatch().run(() => {
              originResponse["responseText"] = JSON.stringify(originResponse["response"]);
            });
          } else {
            originResponse["responseText"] = originResponse["response"];
          }
        }
        if (originResponse["response"] == null && typeof originResponse["responseText"] === "string" && originResponse["responseText"].trim() !== "") {
          let httpxResponseText = originResponse.responseText;
          let httpxResponse = httpxResponseText;
          if (details.responseType === "json") {
            httpxResponse = commonUtil.toJSON(httpxResponseText);
          } else if (details.responseType === "document") {
            let parser = new DOMParser();
            httpxResponse = parser.parseFromString(httpxResponseText, "text/html");
          } else if (details.responseType === "arraybuffer") {
            let encoder = new TextEncoder();
            let arrayBuffer = encoder.encode(httpxResponseText);
            httpxResponse = arrayBuffer;
          } else if (details.responseType === "blob") {
            let encoder = new TextEncoder();
            let arrayBuffer = encoder.encode(httpxResponseText);
            httpxResponse = new Blob([arrayBuffer]);
          }
          try {
            let setStatus = Reflect.set(originResponse, "response", httpxResponse);
            if (!setStatus) {
              console.warn("[Httpx-HttpxCallBack.oonLoad] 覆盖原始 response 失败,尝试添加新的httpxResponse");
              try {
                Reflect.set(originResponse, "httpxResponse", httpxResponse);
              } catch (error) {
                console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
              }
            }
          } catch (error) {
            console.warn("[Httpx-HttpxCallBack.oonLoad] 原始 response 无法被覆盖,尝试添加新的httpxResponse");
            try {
              Reflect.set(originResponse, "httpxResponse", httpxResponse);
            } catch (error2) {
              console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
            }
          }
        }
        let originResponseURL = Reflect.get(originResponse, "responseURL");
        if (originResponse["finalUrl"] == null && originResponseURL != null) {
          Reflect.set(originResponse, "finalUrl", originResponseURL);
        }
        if (Math.floor(originResponse.status / 100) === 2) {
          if (await this.context.HttpxResponseHook.successResponseCallBack(originResponse, details) == null) {
            return;
          }
          resolve({
            data: originResponse,
            details,
            msg: "请求成功",
            status: true,
            statusCode: originResponse.status,
            type: "onload"
          });
        } else {
          this.context.HttpxResponseCallBack.onError(details, resolve, reject, argsResult);
        }
      },
onLoadStart(details, argsResult) {
        if (typeof details?.onloadstart === "function") {
          details.onloadstart.apply(this, argsResult);
        } else if (typeof this.context.#defaultRequestOption?.onloadstart === "function") {
          this.context.#defaultRequestOption.onloadstart.apply(this, argsResult);
        }
      },
onReadyStateChange(details, argsResult) {
        if (typeof details?.onreadystatechange === "function") {
          details.onreadystatechange.apply(this, argsResult);
        } else if (typeof this.context.#defaultRequestOption?.onreadystatechange === "function") {
          this.context.#defaultRequestOption.onreadystatechange.apply(this, argsResult);
        }
      },
onProgress(details, argsResult) {
        if (typeof details?.onprogress === "function") {
          details.onprogress.apply(this, argsResult);
        } else if (typeof this.context.#defaultRequestOption?.onprogress === "function") {
          this.context.#defaultRequestOption.onprogress.apply(this, argsResult);
        }
      }
    };
    HttpxRequest = {
      context: this,
async request(details) {
        if (this.context.#defaultInitOption.logDetails) {
          console.log("[Httpx-HttpxRequest.request] 请求前的配置👇", details);
        }
        if (typeof this.context.HttpxRequestHook.beforeRequestCallBack === "function") {
          let hookResult = await this.context.HttpxRequestHook.beforeRequestCallBack(details);
          if (hookResult == null) {
            return;
          }
        }
        if (details.fetch) {
          const { fetchOption, fetchRequestOption, abortController } = this.context.HttpxRequestOption.handleFetchOption(details);
          return this.fetch(fetchOption, fetchRequestOption, abortController);
        } else {
          return this.xmlHttpRequest(details);
        }
      },
xmlHttpRequest(details) {
        return this.context.GM_Api.xmlHttpRequest(details);
      },
fetch(option, fetchRequestOption, abortController) {
        fetch(option.url, fetchRequestOption).then(async (fetchResponse) => {
          let httpxResponse = {
            isFetch: true,
            finalUrl: fetchResponse.url,
            readyState: 4,
            status: fetchResponse.status,
            statusText: fetchResponse.statusText,
            response: "",
            responseFetchHeaders: fetchResponse.headers,
            responseHeaders: "",
            responseText: "",
            responseType: option.responseType,
            responseXML: void 0
          };
          Object.assign(httpxResponse, option.context || {});
          for (const [key, value] of fetchResponse.headers.entries()) {
            httpxResponse.responseHeaders += `${key}: ${value}
`;
          }
          const fetchResponseType = fetchResponse.headers.get("Content-Type");
          if (option.responseType === "stream" || fetchResponse.headers.has("Content-Type") && fetchResponse.headers.get("Content-Type").includes("text/event-stream")) {
            Reflect.set(httpxResponse, "isStream", true);
            Reflect.set(httpxResponse, "response", fetchResponse.body);
            Reflect.deleteProperty(httpxResponse, "responseText");
            Reflect.deleteProperty(httpxResponse, "responseXML");
            option.onload(httpxResponse);
            return;
          }
          let response = "";
          let responseText = "";
          let responseXML = "";
          let arrayBuffer = await fetchResponse.arrayBuffer();
          let encoding = "utf-8";
          if (fetchResponse.headers.has("Content-Type")) {
            let charsetMatched = fetchResponse.headers.get("Content-Type")?.match(/charset=(.+)/);
            if (charsetMatched) {
              encoding = charsetMatched[1];
              encoding = encoding.toLowerCase();
            }
          }
          encoding = encoding.replace(/('|")/gi, "");
          let textDecoder = new TextDecoder(encoding);
          responseText = textDecoder.decode(arrayBuffer);
          response = responseText;
          if (option.responseType === "arraybuffer") {
            response = arrayBuffer;
          } else if (option.responseType === "blob") {
            response = new Blob([arrayBuffer]);
          } else if (option.responseType === "json" || typeof fetchResponseType === "string" && fetchResponseType.includes("application/json")) {
            response = commonUtil.toJSON(responseText);
          } else if (option.responseType === "document" || option.responseType == null) {
            let parser2 = new DOMParser();
            response = parser2.parseFromString(responseText, "text/html");
          }
          let parser = new DOMParser();
          responseXML = parser.parseFromString(responseText, "text/xml");
          httpxResponse.response = response;
          httpxResponse.responseText = responseText;
          httpxResponse.responseXML = responseXML;
          option.onload(httpxResponse);
        }).catch((error) => {
          if (error.name === "AbortError") {
            return;
          }
          option.onerror({
            isFetch: true,
            finalUrl: option.url,
            readyState: 4,
            status: 0,
            statusText: "",
            responseHeaders: "",
            responseText: "",
            error
          });
        });
        option.onloadstart({
          isFetch: true,
          finalUrl: option.url,
          readyState: 1,
          responseHeaders: "",
          responseText: "",
          status: 0,
          statusText: ""
        });
        return {
          abort() {
            abortController.abort();
          }
        };
      }
    };
#defaultRequestOption = {
      url: void 0,
      timeout: 5e3,
      async: false,
      responseType: void 0,
      headers: void 0,
      data: void 0,
      redirect: void 0,
      cookie: void 0,
      cookiePartition: void 0,
      binary: void 0,
      nocache: void 0,
      revalidate: void 0,
      context: void 0,
      overrideMimeType: void 0,
      anonymous: void 0,
      fetch: void 0,
      fetchInit: void 0,
      allowInterceptConfig: {
        beforeRequest: true,
        afterResponseSuccess: true,
        afterResponseError: true
      },
      user: void 0,
      password: void 0,
      onabort() {
      },
      onerror() {
      },
      ontimeout() {
      },
      onloadstart() {
      },
      onreadystatechange() {
      },
      onprogress() {
      }
    };
    #defaultInitOption = {
baseURL: void 0,
logDetails: false
    };
constructor(option = {}) {
      if (typeof option.xmlHttpRequest !== "function") {
        console.warn("[Httpx-constructor] 未传入GM_xmlhttpRequest函数或传入的GM_xmlhttpRequest不是Function,将默认使用window.fetch");
      }
      commonUtil.coverObjectFunctionThis(this);
      this.interceptors.request.context = this;
      this.interceptors.response.context = this;
      this.config(option);
    }
config(option = {}) {
      if (typeof option.xmlHttpRequest === "function") {
        this.GM_Api.xmlHttpRequest = option.xmlHttpRequest;
      }
      this.#defaultRequestOption = commonUtil.assign(this.#defaultRequestOption, option);
      this.#defaultInitOption = commonUtil.assign(this.#defaultInitOption, option);
    }
interceptors = {
request: {
        context: null,
use(fn) {
          if (typeof fn !== "function") {
            console.warn("[Httpx-interceptors-request] 请传入拦截器函数");
            return;
          }
          return this.context.HttpxRequestHook.add(fn);
        },
eject(id) {
          return this.context.HttpxRequestHook.delete(id);
        },
ejectAll() {
          this.context.HttpxRequestHook.clearAll();
        }
      },
response: {
        context: null,
use(successFn, errorFn) {
          if (typeof successFn !== "function" && typeof errorFn !== "function") {
            console.warn("[Httpx-interceptors-response] 必须传入一个拦截器函数");
            return;
          }
          return this.context.HttpxResponseHook.add(successFn, errorFn);
        },
eject(id) {
          return this.context.HttpxResponseHook.delete(id);
        },
ejectAll() {
          this.context.HttpxResponseHook.clearAll();
        }
      }
    };
setXMLHttpRequest(httpRequest) {
      this.GM_Api.xmlHttpRequest = httpRequest;
    }
get(...args) {
      let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      useRequestOption.method = "GET";
      return this.request(useRequestOption, (option) => {
        Reflect.deleteProperty(option, "onprogress");
      });
    }
post(...args) {
      let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      useRequestOption.method = "POST";
      return this.request(useRequestOption);
    }
head(...args) {
      let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      useRequestOption.method = "HEAD";
      return this.request(useRequestOption, (option) => {
        Reflect.deleteProperty(option, "onprogress");
      });
    }
options(...args) {
      let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      useRequestOption.method = "OPTIONS";
      return this.request(useRequestOption, (option) => {
        Reflect.deleteProperty(option, "onprogress");
      });
    }
delete(...args) {
      let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      useRequestOption.method = "DELETE";
      return this.request(useRequestOption, (option) => {
        Reflect.deleteProperty(option, "onprogress");
      });
    }
put(...args) {
      let userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      userRequestOption.method = "PUT";
      return this.request(userRequestOption);
    }
request(details, beforeRequestOption) {
      let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(details);
      let abortFn = null;
      let promise = new globalThis.Promise(async (resolve, reject) => {
        let requestOption = this.HttpxRequestOption.getRequestOption(useRequestOption.method, useRequestOption, resolve, reject);
        if (typeof beforeRequestOption === "function") {
          beforeRequestOption(requestOption);
        }
        requestOption = this.HttpxRequestOption.removeRequestNullOption(requestOption);
        const requestResult = await this.HttpxRequest.request(requestOption);
        if (requestResult != null && typeof requestResult.abort === "function") {
          abortFn = requestResult.abort;
        }
      });
      promise.abort = () => {
        if (typeof abortFn === "function") {
          abortFn();
        }
      };
      return promise;
    }
  }
  class indexedDB {
    #dbName;
    #storeName;
    #dbVersion;


#indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
#db = {};

#statusCode = {
      operationSuccess: {
        code: 200,
        msg: "操作成功"
      },
      operationFailed: {
        code: 401,
        msg: "操作失败"
      },
      empty: {
        code: 201,
        msg: "操作成功,但是没有数据"
      },
      openFailed: { code: 91001, msg: "打开数据库失败" },
      saveFailed: { code: 91002, msg: "保存数据失败" },
      getFailed: { code: 91003, msg: "获取数据失败" },
      deleteFailed: { code: 91004, msg: "删除数据失败" },
      deleteAllFailed: { code: 91005, msg: "清空数据库失败" },
      regexpGetFailed: { code: 91006, msg: "正则获取数据失败" }
    };
constructor(dbName = "default_db", storeName = "default_form", dbVersion = 1) {
      this.#dbName = dbName;
      this.#storeName = storeName;
      this.#dbVersion = dbVersion;
      if (!this.#indexedDB) {
        alert("很抱歉,您的浏览器不支持indexedDB");
        throw new TypeError("很抱歉,您的浏览器不支持indexedDB");
      }
    }
createStore(dbName) {
      let txn, store;
      txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
      store = txn.objectStore(this.#storeName);
      return store;
    }
open(callback, dbName) {
      let that = this;
      if (!that.#db[dbName]) {
        let request = that.#indexedDB.open(dbName, that.#dbVersion);
        request.onerror = function(event) {
          callback(null, {
            code: that.#statusCode.openFailed.code,
            msg: that.#statusCode.openFailed.msg,
            event
          });
        };
        request.onsuccess = function(event) {
          if (!that.#db[dbName]) {
            let target = event.target;
            that.#db[dbName] = target.result;
          }
          let store = that.createStore(dbName);
          callback(store);
        };
        request.onupgradeneeded = function(event) {
          let target = event.target;
          that.#db[dbName] = target.result;
          let store = that.#db[dbName].createObjectStore(that.#storeName, {
            keyPath: "key"
          });
          store.transaction.oncomplete = function(event2) {
            callback(store);
          };
        };
      } else {
        let store = this.createStore(dbName);
        callback(store);
      }
    }
async save(key, value) {
      let that = this;
      return new Promise((resolve) => {
        let dbName = this.#dbName;
        let inData = {
          key,
          value
        };
        this.open(function(idbStore) {
          if (idbStore == null) {
            resolve({
              success: false,
              code: that.#statusCode.saveFailed.code,
              msg: that.#statusCode.saveFailed.msg
            });
          } else {
            let request = idbStore.put(inData);
            request.onsuccess = function(event) {
              resolve({
                success: true,
                code: that.#statusCode.operationSuccess.code,
                msg: that.#statusCode.operationSuccess.msg,
                event
              });
            };
            request.onerror = function(event) {
              resolve({
                success: false,
                code: that.#statusCode.saveFailed.code,
                msg: that.#statusCode.saveFailed.msg,
                event
              });
            };
          }
        }, dbName);
      });
    }
async has(key) {
      let that = this;
      return new Promise((resolve) => {
        let dbName = this.#dbName;
        this.open(function(idbStore) {
          if (idbStore == null) {
            resolve({
              success: false,
              code: that.#statusCode.getFailed.code,
              msg: that.#statusCode.getFailed.msg
            });
          } else {
            let request = idbStore.get(key);
            request.onsuccess = function(event) {
              resolve({
                success: true,
                code: that.#statusCode.operationSuccess.code,
                msg: that.#statusCode.operationSuccess.msg,
                event
              });
            };
            request.onerror = function(event) {
              resolve({
                success: false,
                code: that.#statusCode.getFailed.code,
                msg: that.#statusCode.getFailed.msg,
                event
              });
            };
          }
        }, dbName);
      });
    }
async get(key) {
      let that = this;
      return new Promise((resolve) => {
        let dbName = this.#dbName;
        this.open(function(idbStore) {
          if (idbStore == null) {
            resolve({
              success: false,
              code: that.#statusCode.getFailed.code,
              msg: that.#statusCode.getFailed.msg,
              data: void 0
            });
          } else {
            let request = idbStore.get(key);
            request.onsuccess = function(event) {
              let target = event.target;
              let result = target.result;
              let data = result ? result.value : void 0;
              if (data == null) {
                resolve({
                  success: true,
                  code: that.#statusCode.empty.code,
                  msg: that.#statusCode.empty.msg,
                  data,
                  event,
                  result
                });
              } else {
                resolve({
                  success: true,
                  code: that.#statusCode.operationSuccess.code,
                  msg: that.#statusCode.operationSuccess.msg,
                  data,
                  event,
                  result
                });
              }
            };
            request.onerror = function(event) {
              resolve({
                success: false,
                code: that.#statusCode.getFailed.code,
                msg: that.#statusCode.getFailed.msg,
                data: void 0,
                event
              });
            };
          }
        }, dbName);
      });
    }
async regexpGet(key) {
      let list = [];
      let that = this;
      return new Promise((resolve) => {
        let dbName = that.#dbName;
        this.open(function(idbStore) {
          if (idbStore == null) {
            resolve({
              success: false,
              code: that.#statusCode.regexpGetFailed.code,
              msg: that.#statusCode.regexpGetFailed.msg,
              data: []
            });
          } else {
            let request = idbStore.getAll();
            request.onsuccess = function(event) {
              let target = event.target;
              let result = target.result;
              if (result.length !== 0) {
                result.forEach((dataItem, index) => {
                  let __key = dataItem["key"];
                  let __value = dataItem["value"];
                  if (__key.match(key)) {
                    list = list.concat(__value);
                  }
                });
              }
              resolve({
                success: true,
                code: that.#statusCode.operationSuccess.code,
                msg: that.#statusCode.operationSuccess.msg,
                data: list,
                event
              });
            };
            request.onerror = function(event) {
              resolve({
                success: false,
                code: that.#statusCode.getFailed.code,
                msg: that.#statusCode.getFailed.msg,
                data: [],
                event
              });
            };
          }
        }, dbName);
      });
    }
async delete(key) {
      let that = this;
      return new Promise((resolve) => {
        let dbName = that.#dbName;
        this.open(function(idbStore) {
          if (idbStore == null) {
            resolve({
              success: false,
              code: that.#statusCode.deleteFailed.code,
              msg: that.#statusCode.deleteFailed.msg
            });
          } else {
            let request = idbStore.delete(key);
            request.onsuccess = function(event) {
              resolve({
                success: true,
                code: that.#statusCode.operationSuccess.code,
                msg: that.#statusCode.operationSuccess.msg,
                event
              });
            };
            request.onerror = function(event) {
              resolve({
                success: false,
                code: that.#statusCode.deleteFailed.code,
                msg: that.#statusCode.deleteFailed.msg,
                event
              });
            };
          }
        }, dbName);
      });
    }
async deleteAll() {
      let that = this;
      return new Promise((resolve) => {
        let dbName = that.#dbName;
        this.open(function(idbStore) {
          if (idbStore == null) {
            resolve({
              success: false,
              code: that.#statusCode.deleteAllFailed.code,
              msg: that.#statusCode.deleteAllFailed.msg
            });
          } else {
            let operateResult = idbStore.clear();
            operateResult.onsuccess = function(event) {
              resolve({
                success: true,
                code: that.#statusCode.operationSuccess.code,
                msg: that.#statusCode.operationSuccess.msg,
                event
              });
            };
            operateResult.onerror = function(event) {
              resolve({
                success: false,
                code: that.#statusCode.deleteAllFailed.code,
                msg: that.#statusCode.deleteAllFailed.msg,
                event
              });
            };
          }
        }, dbName);
      });
    }
  }
  class LockFunction {
    #flag = false;
    #delayTime = 0;
    #callback;
    #timeId = void 0;
    lock;
    unlock;
    run;
    isLock;
    constructor(callback, context, delayTime) {
      let that = this;
      this.#callback = callback;
      if (typeof context === "number") {
        this.#delayTime = context;
      } else {
        this.#delayTime = delayTime;
      }
      this.lock = function() {
        that.#flag = true;
        clearTimeout(that.#timeId);
      };
      this.unlock = function() {
        that.#timeId = setTimeout(() => {
          that.#flag = false;
        }, that.#delayTime);
      };
      this.isLock = function() {
        return that.#flag;
      };
      this.run = async function(...args) {
        if (that.isLock()) {
          return;
        }
        that.lock();
        await that.#callback.apply(this, args);
        that.unlock();
      };
    }
  }
  class Log {
#disable = false;
tag = "Utils.Log";
#console = null;
#logCount = 0;
#details = {
      tag: true,
      successColor: "#0000FF",
      errorColor: "#FF0000",
      infoColor: "0",
      warnColor: "0",
      debug: false,
      autoClearConsole: false,
      logMaxCount: 999
    };
#msgColorDetails = [
      "font-weight: bold; color: cornflowerblue",
      "font-weight: bold; color: cornflowerblue",
      "font-weight: bold; color: darkorange",
      "font-weight: bold; color: cornflowerblue"
    ];
constructor(__GM_info, console2 = window.console) {
      if (typeof __GM_info === "string") {
        this.tag = __GM_info;
      } else if (typeof __GM_info === "object" && typeof __GM_info?.script?.name === "string") {
        this.tag = __GM_info.script.name;
      }
      this.#console = console2;
    }
parseErrorStack(stack) {
      let result = {
        name: "",
        position: ""
      };
      for (let stackString of stack) {
        stackString = stackString.trim();
        let stackFunctionNameMatch = stackString.match(/^at[\s]+(.+?)[\s]+/i);
        let stackFunctionNamePositionMatch = stackString.match(/^at[\s]+.+[\s]+\((.+?)\)/i);
        if (stackFunctionNameMatch == null) {
          continue;
        }
        if (stackFunctionNamePositionMatch == null) {
          continue;
        }
        let stackFunctionName = stackFunctionNameMatch[stackFunctionNameMatch.length - 1];
        let stackFunctionNamePosition = stackFunctionNamePositionMatch[stackFunctionNamePositionMatch.length - 1];
        if (stackFunctionName === "" || stackFunctionName.match(/^(Utils\.|)Log(\.|)|.<anonymous>$|^Function.each|^NodeList.forEach|^k.fn.init.each/g)) {
          continue;
        } else {
          result.name = stackFunctionName;
          result.position = stackFunctionNamePosition;
          break;
        }
      }
      if (result.position === "") {
        let lastStackString = stack[stack.length - 1].trim();
        if (lastStackString.startsWith("at chrome-extension://")) {
          let lastStackMatch = lastStackString.match(/^at[\s]+(.+)/);
          if (lastStackMatch) {
            result.position = lastStackMatch[lastStackMatch.length - 1];
          }
        }
      }
      if (result.position === "") {
        result.position = stack[stack.length - 1].trim().replace(/^at[\s]*/g, "");
      }
      return result;
    }
checkClearConsole() {
      this.#logCount++;
      if (this.#details.autoClearConsole && this.#logCount > this.#details.logMaxCount) {
        this.#console.clear();
        this.#logCount = 0;
      }
    }
printContent(msg, color, otherStyle) {
      this.checkClearConsole();
      otherStyle = otherStyle || "";
      let stackSplit = new Error().stack.split("\n");
      stackSplit.splice(0, 2);
      let { name: callerName, position: callerPosition } = this.parseErrorStack(stackSplit);
      let tagName = this.tag;
      let that = this;
      let tagNameHTML = `%c[${tagName}%c`;
      let callerNameHTML = `%c${callerName}%c]%c`;
      callerName.trim() !== "" && (callerNameHTML = "-" + callerNameHTML);
      function consoleMsg(message) {
        if (typeof message === "string") {
          that.#console.log(`${tagNameHTML}${callerNameHTML} %s`, ...that.#msgColorDetails, `color: ${color};${otherStyle}`, message);
        } else if (typeof message === "number") {
          that.#console.log(`${tagNameHTML}${callerNameHTML} %d`, ...that.#msgColorDetails, `color: ${color};${otherStyle}`, message);
        } else if (typeof message === "object") {
          that.#console.log(`${tagNameHTML}${callerNameHTML} %o`, ...that.#msgColorDetails, `color: ${color};${otherStyle}`, message);
        } else {
          that.#console.log(message);
        }
      }
      if (Array.isArray(msg)) {
        for (let index = 0; index < msg.length; index++) {
          consoleMsg(msg[index]);
        }
      } else {
        consoleMsg(msg);
      }
      if (this.#details.debug) {
        this.#console.log(callerPosition);
      }
    }
info(...args) {
      if (this.#disable)
        return;
      this.printContent(args, this.#details.infoColor);
    }
warn(...args) {
      if (this.#disable)
        return;
      this.printContent(args, this.#details.warnColor, "background: #FEF6D5;padding: 4px 6px 4px 0px;");
    }
error(...args) {
      if (this.#disable)
        return;
      this.printContent(args, this.#details.errorColor);
    }
success(...args) {
      if (this.#disable)
        return;
      this.printContent(args, this.#details.successColor);
    }
table(msg) {
      if (this.#disable)
        return;
      this.checkClearConsole();
      let stack = new Error().stack.split("\n");
      stack.splice(0, 1);
      let errorStackParse = this.parseErrorStack(stack);
      let stackFunctionName = errorStackParse.name;
      let stackFunctionNamePosition = errorStackParse.position;
      let callerName = stackFunctionName;
      this.#console.log(`%c[${this.tag}%c-%c${callerName}%c]%c`, ...this.#msgColorDetails, `color: ${this.#details.infoColor};`);
      this.#console.table(msg);
      if (this.#details.debug) {
        this.#console.log(stackFunctionNamePosition);
      }
    }
config(paramDetails) {
      this.#details = Object.assign(this.#details, paramDetails);
    }
disable() {
      this.#disable = true;
    }
recovery() {
      this.#disable = false;
    }
  }
  class Progress {
    #config = {
canvasNode: null,
deg: 95,
progress: 0,
lineWidth: 10,
lineBgColor: "#1e637c",
lineColor: "#25deff",
textColor: "#000000",
fontSize: 22,
circleRadius: 50
    };
    #ctx = null;
    #width = null;
    #height = null;
constructor(paramConfig) {
      this.#config = commonUtil.assign(this.#config, paramConfig);
      if (!(this.#config.canvasNode instanceof HTMLCanvasElement)) {
        throw new Error("Utils.Progress 参数 canvasNode 必须是 HTMLCanvasElement");
      }
      this.init();
    }
init() {
      let ctx = this.#config.canvasNode.getContext("2d");
      if (ctx == null) {
        throw new Error("Utils.Progress 获取画笔失败");
      }
      this.#ctx = ctx;
      this.#width = this.#config.canvasNode.width;
      this.#height = this.#config.canvasNode.height;
      if (window.devicePixelRatio) {
        this.#config.canvasNode.style.width = this.#width + "px";
        this.#config.canvasNode.style.height = this.#height + "px";
        this.#config.canvasNode.height = this.#height * window.devicePixelRatio;
        this.#config.canvasNode.width = this.#width * window.devicePixelRatio;
        this.#ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
      }
      this.#ctx.lineWidth = this.#config.lineWidth;
    }
draw() {
      let degActive = this.#config.progress * 360 / 100;
      this.#ctx.clearRect(0, 0, this.#width, this.#height);
      this.#ctx.beginPath();
      this.#ctx.arc(this.#width / 2, this.#height / 2, this.#config.circleRadius, 1, 8);
      this.#ctx.strokeStyle = this.#config.lineBgColor;
      this.#ctx.stroke();
      this.#ctx.beginPath();
      this.#ctx.arc(this.#width / 2, this.#height / 2, this.#config.circleRadius, -Math.PI / 2, degActive * Math.PI / 180 - Math.PI / 2);
      this.#ctx.strokeStyle = this.#config.lineColor;
      this.#ctx.stroke();
      let txt = parseInt(this.#config.progress.toString()) + "%";
      this.#ctx.font = this.#config.fontSize + "px SimHei";
      let w = this.#ctx.measureText(txt).width;
      let h2 = this.#config.fontSize / 2;
      this.#ctx.fillStyle = this.#config.textColor;
      this.#ctx.fillText(txt, this.#width / 2 - w / 2, this.#height / 2 + h2 / 2);
    }
  }
  class UtilsDictionary {
    items;
    constructor(key, value) {
      this.items = new Map();
      if (key != null) {
        this.set(key, value);
      }
    }
get length() {
      return this.size();
    }
get entries() {
      let that = this;
      return function* () {
        let itemKeys = Object.keys(that.getItems());
        for (const keyName of itemKeys) {
          yield [keyName, that.get(keyName)];
        }
      };
    }
get [Symbol.iterator]() {
      let that = this;
      return function() {
        return that.entries();
      };
    }
has(key) {
      return this.items.has(key);
    }
get(key) {
      return this.items.get(key);
    }
set(key, val) {
      if (key === void 0) {
        throw new Error("Utils.Dictionary().set 参数 key 不能为空");
      }
      this.items.set(key, val);
    }
delete(key) {
      if (this.has(key)) {
        return this.items.delete(key);
      }
      return false;
    }
keys() {
      return this.items.keys().toArray();
    }
values() {
      return this.items.values().toArray();
    }
clear() {
      this.items.clear();
    }
size() {
      return this.items.size;
    }
getItems() {
      return this.items;
    }
concat(data) {
      data.forEach((value, key) => {
        this.items.set(key, value);
      });
    }
forEach(callbackfn) {
      this.items.forEach((value, key, self2) => {
        callbackfn(value, key, this);
      });
    }
startsWith(key) {
      const keys = this.keys();
      for (const keyName of keys) {
        if (String(keyName).startsWith(key)) {
          return true;
        }
      }
      return false;
    }
getStartsWith(key) {
      let result = void 0;
      const keys = this.keys();
      for (const keyName of keys) {
        if (String(keyName).startsWith(String(key))) {
          result = this.get(keyName);
          break;
        }
      }
      return result;
    }
  }
  class WindowApi2 {
defaultApi = {
      document,
      window,
      globalThis,
      self,
      top,
      setTimeout: globalThis.setTimeout.bind(globalThis),
      setInterval: globalThis.setInterval.bind(globalThis),
      clearTimeout: globalThis.clearTimeout.bind(globalThis),
      clearInterval: globalThis.clearInterval.bind(globalThis)
    };
api;
    constructor(option) {
      if (option) {
        if (option.globalThis == null) {
          option.globalThis = option.window;
        }
        if (option.self == null) {
          option.self = option.window;
        }
      }
      if (!option) {
        option = Object.assign({}, this.defaultApi);
      }
      this.api = Object.assign({}, option);
    }
    get document() {
      return this.api.document;
    }
    get window() {
      return this.api.window;
    }
    get globalThis() {
      return this.api.globalThis;
    }
    get self() {
      return this.api.self;
    }
    get top() {
      return this.api.top;
    }
    get setTimeout() {
      return this.api.setTimeout;
    }
    get setInterval() {
      return this.api.setInterval;
    }
    get clearTimeout() {
      return this.api.clearTimeout;
    }
    get clearInterval() {
      return this.api.clearInterval;
    }
  }
  const VueUtils = {
ReactiveFlags: {
      IS_REACTIVE: Symbol("isReactive")
    },
isObject(value) {
      return typeof value === "object" && value !== null;
    },
isFunction(val) {
      return typeof val === "function";
    },
isReactive(value) {
      return !!(value && value[VueUtils.ReactiveFlags.IS_REACTIVE]);
    },
isArray(value) {
      return Array.isArray(value);
    }
  };
  class ReactiveEffect {
    deps = [];
    active = true;
    fn;
constructor(fn, scheduler) {
      this.fn = fn;
    }
    run(cb) {
      if (!this.active) {
        this.fn();
      }
      try {
        if (typeof cb === "function") {
          cb(this);
        }
        return this.fn();
      } finally {
        if (typeof cb === "function") {
          cb(void 0);
        }
      }
    }
  }
  class RefImpl {
    _value;
    _isRef = true;
    _rawValue;
    _vue;
    constructor(vueIns, rawValue) {
      this._vue = vueIns;
      this._rawValue = rawValue;
      this._value = this._vue.toReactive(rawValue);
    }
    get value() {
      return this._value;
    }
    set value(newValue) {
      if (newValue !== this._rawValue) {
        this._value = this._vue.toReactive(newValue);
        this._rawValue = newValue;
      }
    }
  }
  class ObjectRefImpl {
    object;
    key;
    constructor(object, key) {
      this.object = object;
      this.key = key;
    }
    get value() {
      return this.object[this.key];
    }
    set value(newValue) {
      this.object[this.key] = newValue;
    }
  }
  class Vue {
    reactMap = new WeakMap();
    targetMap = new WeakMap();
    activeEffect = void 0;
    constructor() {
    }
reactive(target) {
      const that = this;
      if (!(typeof target === "object" && target !== null)) {
        return void 0;
      }
      if (VueUtils.isReactive(target)) {
        return target;
      }
      let exisProxy = this.reactMap.get(target);
      if (exisProxy) {
        return exisProxy;
      }
      const proxy = new Proxy(target, {
        get(target2, key, receiver) {
          if (key === VueUtils.ReactiveFlags.IS_REACTIVE) {
            return true;
          }
          that.track(target2, "get", key);
          return Reflect.get(target2, key, receiver);
        },
        set(target2, key, value, receiver) {
          let oldValue = target2[key];
          let result = Reflect.set(target2, key, value, receiver);
          if (oldValue !== value) {
            that.trigger(target2, "set", key, oldValue, value);
          }
          return result;
        }
      });
      that.reactMap.set(target, proxy);
      return proxy;
    }
watch(source, changeCallBack) {
      let getter;
      if (VueUtils.isReactive(source)) {
        getter = () => this.traversal(source);
      } else if (VueUtils.isFunction(source)) {
        getter = source;
      } else {
        return;
      }
      let oldValue;
      const job = () => {
        const newValue = effect.run((activeEffect) => {
          this.activeEffect = activeEffect;
        });
        changeCallBack(newValue, oldValue);
        oldValue = newValue;
      };
      const effect = new ReactiveEffect(getter, job);
      oldValue = effect.run((activeEffect) => {
        this.activeEffect = activeEffect;
      });
    }
    toReactive(value) {
      return VueUtils.isObject(value) ? this.reactive(value) : value;
    }
    ref(value) {
      return new RefImpl(this, value);
    }
    toRef(object, key) {
      return new ObjectRefImpl(object, key);
    }
    toRefs(object) {
      const result = VueUtils.isArray(object) ? new Array(object.length) : {};
      for (let key in object) {
        result[key] = this.toRef(object, key);
      }
      return result;
    }
    trigger(target, type, key, oldValue, value) {
      const depsMap = this.targetMap.get(target);
      if (!depsMap)
        return;
      const effects = depsMap.get(key);
      this.triggerEffect(effects, "effects");
    }
    triggerEffect(effects, name) {
      effects && effects.forEach((effect) => {
        if (effect.scheduler) {
          effect.scheduler();
        } else {
          effect.run();
        }
      });
    }
    track(target, type, key) {
      if (!this.activeEffect)
        return;
      let depsMap = this.targetMap.get(target);
      if (!depsMap) {
        this.targetMap.set(target, depsMap = new Map());
      }
      let dep = depsMap.get(key);
      if (!dep) {
        depsMap.set(key, dep = new Set());
      }
      this.trackEffect(dep);
    }
    trackEffect(dep) {
      if (this.activeEffect) {
        let shouldTrack = !dep.has(this.activeEffect);
        if (shouldTrack) {
          dep.add(this.activeEffect);
          this.activeEffect.deps.push(dep);
        }
      }
    }
    traversal(value, set = new Set()) {
      if (!VueUtils.isObject(value))
        return value;
      if (set.has(value)) {
        return value;
      }
      set.add(value);
      for (let key in value) {
        this.traversal(value[key], set);
      }
      return value;
    }
  }
  const createCache$1 = (lastNumberWeakMap) => {
    return (collection, nextNumber) => {
      lastNumberWeakMap.set(collection, nextNumber);
      return nextNumber;
    };
  };
  const MAX_SAFE_INTEGER$1 = Number.MAX_SAFE_INTEGER === void 0 ? 9007199254740991 : Number.MAX_SAFE_INTEGER;
  const TWO_TO_THE_POWER_OF_TWENTY_NINE$1 = 536870912;
  const TWO_TO_THE_POWER_OF_THIRTY$1 = TWO_TO_THE_POWER_OF_TWENTY_NINE$1 * 2;
  const createGenerateUniqueNumber$1 = (cache2, lastNumberWeakMap) => {
    return (collection) => {
      const lastNumber = lastNumberWeakMap.get(collection);
      let nextNumber = lastNumber === void 0 ? collection.size : lastNumber < TWO_TO_THE_POWER_OF_THIRTY$1 ? lastNumber + 1 : 0;
      if (!collection.has(nextNumber)) {
        return cache2(collection, nextNumber);
      }
      if (collection.size < TWO_TO_THE_POWER_OF_TWENTY_NINE$1) {
        while (collection.has(nextNumber)) {
          nextNumber = Math.floor(Math.random() * TWO_TO_THE_POWER_OF_THIRTY$1);
        }
        return cache2(collection, nextNumber);
      }
      if (collection.size > MAX_SAFE_INTEGER$1) {
        throw new Error("Congratulations, you created a collection of unique numbers which uses all available integers!");
      }
      while (collection.has(nextNumber)) {
        nextNumber = Math.floor(Math.random() * MAX_SAFE_INTEGER$1);
      }
      return cache2(collection, nextNumber);
    };
  };
  const LAST_NUMBER_WEAK_MAP$1 = new WeakMap();
  const cache$1 = createCache$1(LAST_NUMBER_WEAK_MAP$1);
  const generateUniqueNumber$1 = createGenerateUniqueNumber$1(cache$1, LAST_NUMBER_WEAK_MAP$1);
  const isMessagePort$1 = (sender) => {
    return typeof sender.start === "function";
  };
  const PORT_MAP$1 = new WeakMap();
  const extendBrokerImplementation$1 = (partialBrokerImplementation) => ({
    ...partialBrokerImplementation,
    connect: ({ call }) => {
      return async () => {
        const { port1, port2 } = new MessageChannel();
        const portId = await call("connect", { port: port1 }, [port1]);
        PORT_MAP$1.set(port2, portId);
        return port2;
      };
    },
    disconnect: ({ call }) => {
      return async (port) => {
        const portId = PORT_MAP$1.get(port);
        if (portId === void 0) {
          throw new Error("The given port is not connected.");
        }
        await call("disconnect", { portId });
      };
    },
    isSupported: ({ call }) => {
      return () => call("isSupported");
    }
  });
  const ONGOING_REQUESTS$1 = new WeakMap();
  const createOrGetOngoingRequests$1 = (sender) => {
    if (ONGOING_REQUESTS$1.has(sender)) {
      return ONGOING_REQUESTS$1.get(sender);
    }
    const ongoingRequests = new Map();
    ONGOING_REQUESTS$1.set(sender, ongoingRequests);
    return ongoingRequests;
  };
  const createBroker$1 = (brokerImplementation) => {
    const fullBrokerImplementation = extendBrokerImplementation$1(brokerImplementation);
    return (sender) => {
      const ongoingRequests = createOrGetOngoingRequests$1(sender);
      sender.addEventListener("message", (({ data: message }) => {
        const { id } = message;
        if (id !== null && ongoingRequests.has(id)) {
          const { reject, resolve } = ongoingRequests.get(id);
          ongoingRequests.delete(id);
          if (message.error === void 0) {
            resolve(message.result);
          } else {
            reject(new Error(message.error.message));
          }
        }
      }));
      if (isMessagePort$1(sender)) {
        sender.start();
      }
      const call = (method, params = null, transferables = []) => {
        return new Promise((resolve, reject) => {
          const id = generateUniqueNumber$1(ongoingRequests);
          ongoingRequests.set(id, { reject, resolve });
          if (params === null) {
            sender.postMessage({ id, method }, transferables);
          } else {
            sender.postMessage({ id, method, params }, transferables);
          }
        });
      };
      const notify = (method, params, transferables = []) => {
        sender.postMessage({ id: null, method, params }, transferables);
      };
      let functions = {};
      for (const [key, handler] of Object.entries(fullBrokerImplementation)) {
        functions = { ...functions, [key]: handler({ call, notify }) };
      }
      return { ...functions };
    };
  };
  const scheduledIntervalsState$1 = new Map([[0, null]]);
  const scheduledTimeoutsState$1 = new Map([[0, null]]);
  const wrap$1 = createBroker$1({
    clearInterval: ({ call }) => {
      return (timerId) => {
        if (typeof scheduledIntervalsState$1.get(timerId) === "symbol") {
          scheduledIntervalsState$1.set(timerId, null);
          call("clear", { timerId, timerType: "interval" }).then(() => {
            scheduledIntervalsState$1.delete(timerId);
          });
        }
      };
    },
    clearTimeout: ({ call }) => {
      return (timerId) => {
        if (typeof scheduledTimeoutsState$1.get(timerId) === "symbol") {
          scheduledTimeoutsState$1.set(timerId, null);
          call("clear", { timerId, timerType: "timeout" }).then(() => {
            scheduledTimeoutsState$1.delete(timerId);
          });
        }
      };
    },
    setInterval: ({ call }) => {
      return (func, delay = 0, ...args) => {
        const symbol = Symbol();
        const timerId = generateUniqueNumber$1(scheduledIntervalsState$1);
        scheduledIntervalsState$1.set(timerId, symbol);
        const schedule = () => call("set", {
          delay,
          now: performance.timeOrigin + performance.now(),
          timerId,
          timerType: "interval"
        }).then(() => {
          const state = scheduledIntervalsState$1.get(timerId);
          if (state === void 0) {
            throw new Error("The timer is in an undefined state.");
          }
          if (state === symbol) {
            func(...args);
            if (scheduledIntervalsState$1.get(timerId) === symbol) {
              schedule();
            }
          }
        });
        schedule();
        return timerId;
      };
    },
    setTimeout: ({ call }) => {
      return (func, delay = 0, ...args) => {
        const symbol = Symbol();
        const timerId = generateUniqueNumber$1(scheduledTimeoutsState$1);
        scheduledTimeoutsState$1.set(timerId, symbol);
        call("set", {
          delay,
          now: performance.timeOrigin + performance.now(),
          timerId,
          timerType: "timeout"
        }).then(() => {
          const state = scheduledTimeoutsState$1.get(timerId);
          if (state === void 0) {
            throw new Error("The timer is in an undefined state.");
          }
          if (state === symbol) {
            scheduledTimeoutsState$1.delete(timerId);
            func(...args);
          }
        });
        return timerId;
      };
    }
  });
  const load$1 = (url) => {
    const worker2 = new Worker(url);
    return wrap$1(worker2);
  };
  const createLoadOrReturnBroker$1 = (loadBroker, worker2) => {
    let broker = null;
    return () => {
      if (broker !== null) {
        return broker;
      }
      const blob = new Blob([worker2], { type: "application/javascript; charset=utf-8" });
      const url = URL.createObjectURL(blob);
      broker = loadBroker(url);
      setTimeout(() => URL.revokeObjectURL(url));
      return broker;
    };
  };
  const worker$1 = `(()=>{var e={455:function(e,t){!function(e){"use strict";var t=function(e){return function(t){var r=e(t);return t.add(r),r}},r=function(e){return function(t,r){return e.set(t,r),r}},n=void 0===Number.MAX_SAFE_INTEGER?9007199254740991:Number.MAX_SAFE_INTEGER,o=536870912,s=2*o,a=function(e,t){return function(r){var a=t.get(r),i=void 0===a?r.size:a<s?a+1:0;if(!r.has(i))return e(r,i);if(r.size<o){for(;r.has(i);)i=Math.floor(Math.random()*s);return e(r,i)}if(r.size>n)throw new Error("Congratulations, you created a collection of unique numbers which uses all available integers!");for(;r.has(i);)i=Math.floor(Math.random()*n);return e(r,i)}},i=new WeakMap,u=r(i),c=a(u,i),l=t(c);e.addUniqueNumber=l,e.generateUniqueNumber=c}(t)}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var s=t[n]={exports:{}};return e[n].call(s.exports,s,s.exports,r),s.exports}(()=>{"use strict";const e=-32603,t=-32602,n=-32601,o=(e,t)=>Object.assign(new Error(e),{status:t}),s=t=>o('The handler of the method called "'.concat(t,'" returned an unexpected result.'),e),a=(t,r)=>async({data:{id:a,method:i,params:u}})=>{const c=r[i];try{if(void 0===c)throw(e=>o('The requested method called "'.concat(e,'" is not supported.'),n))(i);const r=void 0===u?c():c(u);if(void 0===r)throw(t=>o('The handler of the method called "'.concat(t,'" returned no required result.'),e))(i);const l=r instanceof Promise?await r:r;if(null===a){if(void 0!==l.result)throw s(i)}else{if(void 0===l.result)throw s(i);const{result:e,transferables:r=[]}=l;t.postMessage({id:a,result:e},r)}}catch(e){const{message:r,status:n=-32603}=e;t.postMessage({error:{code:n,message:r},id:a})}};var i=r(455);const u=new Map,c=(e,r,n)=>({...r,connect:({port:t})=>{t.start();const n=e(t,r),o=(0,i.generateUniqueNumber)(u);return u.set(o,()=>{n(),t.close(),u.delete(o)}),{result:o}},disconnect:({portId:e})=>{const r=u.get(e);if(void 0===r)throw(e=>o('The specified parameter called "portId" with the given value "'.concat(e,'" does not identify a port connected to this worker.'),t))(e);return r(),{result:null}},isSupported:async()=>{if(await new Promise(e=>{const t=new ArrayBuffer(0),{port1:r,port2:n}=new MessageChannel;r.onmessage=({data:t})=>e(null!==t),n.postMessage(t,[t])})){const e=n();return{result:e instanceof Promise?await e:e}}return{result:!1}}}),l=(e,t,r=()=>!0)=>{const n=c(l,t,r),o=a(e,n);return e.addEventListener("message",o),()=>e.removeEventListener("message",o)},d=(e,t)=>r=>{const n=t.get(r);if(void 0===n)return Promise.resolve(!1);const[o,s]=n;return e(o),t.delete(r),s(!1),Promise.resolve(!0)},f=(e,t,r,n)=>(o,s,a)=>{const i=o+s-t.timeOrigin,u=i-t.now();return new Promise(t=>{e.set(a,[r(n,u,i,e,t,a),t])})},m=new Map,h=d(globalThis.clearTimeout,m),p=new Map,v=d(globalThis.clearTimeout,p),w=((e,t)=>{const r=(n,o,s,a)=>{const i=n-e.now();i>0?o.set(a,[t(r,i,n,o,s,a),s]):(o.delete(a),s(!0))};return r})(performance,globalThis.setTimeout),g=f(m,performance,globalThis.setTimeout,w),T=f(p,performance,globalThis.setTimeout,w);l(self,{clear:async({timerId:e,timerType:t})=>({result:await("interval"===t?h(e):v(e))}),set:async({delay:e,now:t,timerId:r,timerType:n})=>({result:await("interval"===n?g:T)(e,t,r)})})})()})();`;
  const loadOrReturnBroker$1 = createLoadOrReturnBroker$1(load$1, worker$1);
  const clearInterval$2 = (timerId) => loadOrReturnBroker$1().clearInterval(timerId);
  const clearTimeout$1$1 = (timerId) => loadOrReturnBroker$1().clearTimeout(timerId);
  const setInterval$2 = (...args) => loadOrReturnBroker$1().setInterval(...args);
  const setTimeout$1$1 = (...args) => loadOrReturnBroker$1().setTimeout(...args);
  // @license      MIT
  class ModuleRaid {
constructor(opts) {
      this.moduleID = Math.random().toString(36).substring(7);
      this.functionArguments = [
        [
          [0],
          [
            (_e, _t, i2) => {
              this.modules = i2.c;
              this.constructors = i2.m;
              this.get = i2;
            }
          ]
        ],
        [
          [1e3],
          {
            [this.moduleID]: (_e, _t, i2) => {
              this.modules = i2.c;
              this.constructors = i2.m;
              this.get = i2;
            }
          },
          [[this.moduleID]]
        ]
      ];
      this.arrayArguments = [
        [
          [this.moduleID],
          {},
          (e2) => {
            const mCac = e2.m;
            Object.keys(mCac).forEach((mod) => {
              try {
                this.modules[mod] = e2(mod);
              } catch (err) {
                this.log(`[arrayArguments/1] Failed to require(${mod}) with error:
${err}
${err.stack}`);
              }
            });
            this.get = e2;
          }
        ],
        this.functionArguments[1]
      ];
      this.modules = {};
      this.constructors = [];
      let options = {
        target: window,
        entrypoint: "webpackJsonp",
        debug: false,
        strict: false
      };
      if (typeof opts === "object") {
        options = Object.assign(Object.assign({}, options), opts);
      }
      this.target = options.target;
      this.entrypoint = options.entrypoint;
      this.debug = options.debug;
      this.strict = options.strict;
      this.detectEntrypoint();
      this.fillModules();
      this.replaceGet();
      this.setupPushEvent();
    }
log(message) {
      if (this.debug) {
        console.warn(`[moduleRaid] ${message}`);
      }
    }
replaceGet() {
      if (this.get === null) {
        this.get = (key) => this.modules[key];
      }
    }
fillModules() {
      if (typeof this.target[this.entrypoint] === "function") {
        this.functionArguments.forEach((argument, index) => {
          try {
            if (this.modules && Object.keys(this.modules).length > 0)
              return;
            this.target[this.entrypoint](...argument);
          } catch (err) {
            this.log(`moduleRaid.functionArguments[${index}] failed:
${err}
${err.stack}`);
          }
        });
      } else {
        this.arrayArguments.forEach((argument, index) => {
          try {
            if (this.modules && Object.keys(this.modules).length > 0)
              return;
            this.target[this.entrypoint].push(argument);
          } catch (err) {
            this.log(`Pushing moduleRaid.arrayArguments[${index}] into ${this.entrypoint} failed:
${err}
${err.stack}`);
          }
        });
      }
      if (this.modules && Object.keys(this.modules).length == 0) {
        let moduleEnd = false;
        let moduleIterator = 0;
        if (typeof this.target[this.entrypoint] != "function" || !this.target[this.entrypoint]([], [], [moduleIterator])) {
          throw Error("Unknown Webpack structure");
        }
        while (!moduleEnd) {
          try {
            this.modules[moduleIterator] = this.target[this.entrypoint]([], [], [moduleIterator]);
            moduleIterator++;
          } catch (err) {
            moduleEnd = true;
          }
        }
      }
    }
setupPushEvent() {
      const originalPush = this.target[this.entrypoint].push;
      this.target[this.entrypoint].push = (...args) => {
        const result = Reflect.apply(originalPush, this.target[this.entrypoint], args);
        document.dispatchEvent(new CustomEvent("moduleraid:webpack-push", { detail: args }));
        return result;
      };
    }
detectEntrypoint() {
      if (this.target[this.entrypoint] != void 0) {
        return;
      }
      if (this.strict) {
        throw Error(`Strict mode is enabled and entrypoint at window.${this.entrypoint} couldn't be found. Please specify the correct one!`);
      }
      let windowObjects = Object.keys(this.target);
      windowObjects = windowObjects.filter((object) => object.toLowerCase().includes("chunk") || object.toLowerCase().includes("webpack")).filter((object) => typeof this.target[object] === "function" || Array.isArray(this.target[object]));
      if (windowObjects.length > 1) {
        throw Error(`Multiple possible endpoints have been detected, please create a new moduleRaid instance with a specific one:
${windowObjects.join(", ")}`);
      }
      if (windowObjects.length === 0) {
        throw Error("No Webpack JSONP entrypoints could be detected");
      }
      this.log(`Entrypoint has been detected at window.${windowObjects[0]} and set for injection`);
      this.entrypoint = windowObjects[0];
    }
searchObject(object, query) {
      for (const key in object) {
        const value = object[key];
        const lowerCaseQuery = query.toLowerCase();
        if (typeof value != "object") {
          const lowerCaseKey = key.toString().toLowerCase();
          if (lowerCaseKey.includes(lowerCaseQuery))
            return true;
          if (typeof value != "object") {
            const lowerCaseValue = value.toString().toLowerCase();
            if (lowerCaseValue.includes(lowerCaseQuery))
              return true;
          } else {
            if (this.searchObject(value, query))
              return true;
          }
        }
      }
      return false;
    }
findModule(query) {
      const results = [];
      const modules = Object.keys(this.modules);
      if (modules.length === 0) {
        throw new Error("There are no modules to search through!");
      }
      modules.forEach((key) => {
        const module = this.modules[key.toString()];
        if (module === void 0)
          return;
        try {
          if (typeof query === "string") {
            query = query.toLowerCase();
            switch (typeof module) {
              case "string":
                if (module.toLowerCase().includes(query))
                  results.push(module);
                break;
              case "function":
                if (module.toString().toLowerCase().includes(query))
                  results.push(module);
                break;
              case "object":
                if (this.searchObject(module, query))
                  results.push(module);
                break;
            }
          } else if (typeof query === "function") {
            if (query(module))
              results.push(module);
          } else {
            throw new TypeError(`findModule can only find via string and function, ${typeof query} was passed`);
          }
        } catch (err) {
          this.log(`There was an error while searching through module '${key}':
${err}
${err.stack}`);
        }
      });
      return results;
    }
findConstructor(query) {
      const results = [];
      const constructors = Object.keys(this.constructors);
      if (constructors.length === 0) {
        throw new Error("There are no constructors to search through!");
      }
      constructors.forEach((key) => {
        const constructor = this.constructors[key];
        try {
          if (typeof query === "string") {
            query = query.toLowerCase();
            if (constructor.toString().toLowerCase().includes(query))
              results.push([this.constructors[key], this.modules[key]]);
          } else if (typeof query === "function") {
            if (query(constructor))
              results.push([this.constructors[key], this.modules[key]]);
          }
        } catch (err) {
          this.log(`There was an error while searching through constructor '${key}':
${err}
${err.stack}`);
        }
      });
      return results;
    }
  }
  class DOMUtils2 {
    windowApi;
    constructor(option) {
      this.windowApi = new WindowApi2(option);
    }
    selector(selector, parent) {
      return this.selectorAll(selector, parent)[0];
    }
    selectorAll(selector, parent) {
      const context = this;
      parent = parent || context.windowApi.document;
      selector = selector.trim();
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
          return $ele?.innerHTML?.trim() === "";
        });
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
        let text = textMatch[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
          return ($ele?.textContent || $ele?.innerText)?.includes(text);
        });
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
        let pattern = textMatch[2];
        let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        let regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
          return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
        });
      } else {
        return Array.from(parent.querySelectorAll(selector));
      }
    }
matches($el, selector) {
      selector = selector.trim();
      if ($el == null) {
        return false;
      }
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return $el.matches(selector) && $el?.innerHTML?.trim() === "";
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
        let text = textMatch[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        let content = $el?.textContent || $el?.innerText;
        if (typeof content !== "string") {
          content = "";
        }
        return $el.matches(selector) && content?.includes(text);
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
        let pattern = textMatch[2];
        let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        let regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        let content = $el?.textContent || $el?.innerText;
        if (typeof content !== "string") {
          content = "";
        }
        return $el.matches(selector) && Boolean(content?.match(regexp));
      } else {
        return $el.matches(selector);
      }
    }
    closest($el, selector) {
      selector = selector.trim();
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        let $closest = $el?.closest(selector);
        if ($closest && $closest?.innerHTML?.trim() === "") {
          return $closest;
        }
        return null;
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
        let text = textMatch[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        let $closest = $el?.closest(selector);
        if ($closest) {
          let content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.includes(text)) {
            return $closest;
          }
        }
        return null;
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
        let pattern = textMatch[2];
        let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        let regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        let $closest = $el?.closest(selector);
        if ($closest) {
          let content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.match(regexp)) {
            return $closest;
          }
        }
        return null;
      } else {
        let $closest = $el?.closest(selector);
        return $closest;
      }
    }
  }
  let domUtils$1 = new DOMUtils2();
  class Utils {
    windowApi;
    constructor(option) {
      this.windowApi = new WindowApi2(option);
    }
version = "2025.9.8";
    addStyle(cssText) {
      if (typeof cssText !== "string") {
        throw new Error("Utils.addStyle 参数cssText 必须为String类型");
      }
      let cssNode = this.windowApi.document.createElement("style");
      cssNode.setAttribute("type", "text/css");
      cssNode.innerHTML = cssText;
      if (this.windowApi.document.head) {
        this.windowApi.document.head.appendChild(cssNode);
      } else if (this.windowApi.document.body) {
        this.windowApi.document.body.appendChild(cssNode);
      } else if (this.windowApi.document.documentElement.childNodes.length === 0) {
        this.windowApi.document.documentElement.appendChild(cssNode);
      } else {
        this.windowApi.document.documentElement.insertBefore(cssNode, this.windowApi.document.documentElement.childNodes[0]);
      }
      return cssNode;
    }
assign = commonUtil.assign.bind(commonUtil);
    async asyncReplaceAll(string, pattern, asyncFn) {
      let UtilsContext = this;
      if (typeof string !== "string") {
        throw new TypeError("string必须是字符串");
      }
      if (typeof asyncFn !== "function") {
        throw new TypeError("asyncFn必须是函数");
      }
      let reg;
      if (typeof pattern === "string") {
        reg = new RegExp(UtilsContext.parseStringToRegExpString(pattern), "g");
      } else if (pattern instanceof RegExp) {
        if (!pattern.global) {
          throw new TypeError("pattern必须是全局匹配");
        }
        reg = new RegExp(pattern);
      } else {
        throw new TypeError("pattern必须是正则对象");
      }
      let result = [];
      let match;
      let lastIndex = 0;
      while ((match = reg.exec(string)) !== null) {
        const item = asyncFn(match[0]);
        const prefix = string.slice(lastIndex, match.index);
        lastIndex = match.index + match[0].length;
        result.push(item);
        result.push(prefix);
      }
      result.push(string.slice(lastIndex));
      result = await Promise.all(result);
      return result.join("");
    }
ajaxHooker = (useOldVersion = false) => {
      if (useOldVersion) {
        return AjaxHooker1_2_4();
      } else {
        return ajaxHooker();
      }
    };
    canvasClickByPosition(canvasElement, clientX = 0, clientY = 0, view = this.windowApi.window) {
      if (!(canvasElement instanceof HTMLCanvasElement)) {
        throw new Error("Utils.canvasClickByPosition 参数canvasElement必须是canvas元素");
      }
      clientX = parseInt(clientX.toString());
      clientY = parseInt(clientY.toString());
      const eventInit = {
        cancelBubble: true,
        cancelable: true,
        clientX,
        clientY,
        view,
        detail: 1
      };
      canvasElement.dispatchEvent(new MouseEvent("mousedown", eventInit));
      canvasElement.dispatchEvent(new MouseEvent("mouseup", eventInit));
    }
    checkUserClickInNode(element) {
      let UtilsContext = this;
      if (!UtilsContext.isDOM(element)) {
        throw new Error("Utils.checkUserClickInNode 参数 targetNode 必须为 Element|Node 类型");
      }
      let clickEvent = UtilsContext.windowApi.window.event;
      let touchEvent = UtilsContext.windowApi.window.event;
      let $click = clickEvent?.composedPath()?.[0];
      let clickPosX = clickEvent?.clientX != null ? clickEvent.clientX : touchEvent.touches[0].clientX;
      let clickPosY = clickEvent?.clientY != null ? clickEvent.clientY : touchEvent.touches[0].clientY;
      let {
left: elementPosXLeft,
right: elementPosXRight,
top: elementPosYTop,
bottom: elementPosYBottom
      } = element.getBoundingClientRect();
      if (clickPosX >= elementPosXLeft && clickPosX <= elementPosXRight && clickPosY >= elementPosYTop && clickPosY <= elementPosYBottom) {
        return true;
      } else if ($click && element.contains($click) || $click == element) {
        return true;
      } else {
        return false;
      }
    }
cloneFormData(formData, filterFn) {
      let clonedFormData = new FormData();
      for (let [key, value] of formData.entries()) {
        let isFilter = typeof filterFn === "function" ? filterFn(key, value) : false;
        if (typeof isFilter === "boolean" && isFilter) {
          continue;
        }
        clonedFormData.append(key, value);
      }
      return clonedFormData;
    }
    createOverload() {
      let fnMap = new Map();
      function overload(...args) {
        let key = args.map((it) => typeof it).join(",");
        let fn = fnMap.get(key);
        if (!fn) {
          throw new TypeError("没有找到对应的实现");
        }
        return fn.apply(this, args);
      }
      overload.addImpl = function(...args) {
        let fn = args.pop();
        if (typeof fn !== "function") {
          throw new TypeError("最后一个参数必须是函数");
        }
        let key = args.join(",");
        fnMap.set(key, fn);
      };
      return overload;
    }
ColorConversion = ColorConversion;
deepClone = commonUtil.deepClone.bind(commonUtil);
    debounce(fn, delay = 0) {
      let timer = null;
      let UtilsContext = this;
      return function(...args) {
        UtilsContext.workerClearTimeout(timer);
        timer = UtilsContext.workerSetTimeout(function() {
          fn.apply(UtilsContext, args);
        }, delay);
      };
    }
    deleteParentNode(element, targetSelector) {
      let UtilsContext = this;
      if (element == null) {
        return;
      }
      if (!UtilsContext.isDOM(element)) {
        throw new Error("Utils.deleteParentNode 参数 target 必须为 Node|HTMLElement 类型");
      }
      if (typeof targetSelector !== "string") {
        throw new Error("Utils.deleteParentNode 参数 targetSelector 必须为 string 类型");
      }
      let result = false;
      let needRemoveDOM = domUtils$1.closest(element, targetSelector);
      if (needRemoveDOM) {
        needRemoveDOM.remove();
        result = true;
      }
      return result;
    }
Dictionary = UtilsDictionary;
    dispatchEvent(element, eventName, details) {
      let eventNameList = [];
      if (typeof eventName === "string") {
        eventNameList = [eventName];
      }
      if (Array.isArray(eventName)) {
        eventNameList = [...eventName];
      }
      eventNameList.forEach((_eventName_) => {
        let event = new Event(_eventName_);
        if (details) {
          Object.assign(event, details);
        }
        element.dispatchEvent(event);
      });
    }
    downloadBase64(base64Data, fileName, isIFrame = false) {
      let UtilsContext = this;
      if (typeof base64Data !== "string") {
        throw new Error("Utils.downloadBase64 参数 base64Data 必须为 string 类型");
      }
      if (typeof fileName !== "string") {
        throw new Error("Utils.downloadBase64 参数 fileName 必须为 string 类型");
      }
      if (isIFrame) {
        const iframeElement = this.windowApi.document.createElement("iframe");
        iframeElement.style.display = "none";
        iframeElement.src = base64Data;
        this.windowApi.document.body.appendChild(iframeElement);
        UtilsContext.workerSetTimeout(() => {
          iframeElement.contentWindow.document.execCommand("SaveAs", true, fileName);
          this.windowApi.document.body.removeChild(iframeElement);
        }, 100);
      } else {
        const linkElement = this.windowApi.document.createElement("a");
        linkElement.setAttribute("target", "_blank");
        linkElement.download = fileName;
        linkElement.href = base64Data;
        linkElement.click();
      }
    }
    findWebPageVisibleText(str = "", caseSensitive = false) {
      let TRange = null;
      let strFound;
      if (this.windowApi.globalThis.find) {
        let windowFind = this.windowApi.self.find;
        strFound = windowFind(str, caseSensitive, true, true, false);
        if (strFound && this.windowApi.self.getSelection && !this.windowApi.self.getSelection().anchorNode) {
          strFound = windowFind(str, caseSensitive, true, true, false);
        }
        if (!strFound) {
          strFound = windowFind(str, 0, 1);
          while (windowFind(str, 0, 1))
            continue;
        }
      } else if (navigator.appName.indexOf("Microsoft") != -1) {
        if (TRange != null) {
          TRange = TRange;
          TRange.collapse(false);
          strFound = TRange.findText(str);
          if (strFound)
            TRange.select();
        }
        if (TRange == null || strFound == 0) {
          TRange = this.windowApi.self.document.body.createTextRange();
          strFound = TRange.findText(str);
          if (strFound)
            TRange.select();
        }
      } else if (navigator.appName == "Opera") {
        alert("Opera browsers not supported, sorry...");
        return;
      }
      return strFound ? true : false;
    }
    *findElementsWithText(element, text, filter) {
      let that = this;
      if (element.outerHTML.includes(text)) {
        if (element.children.length === 0) {
          let filterResult = typeof filter === "function" ? filter(element) : false;
          if (!filterResult) {
            yield element;
          }
        } else {
          let textElement = Array.from(element.childNodes).filter((ele) => ele.nodeType === Node.TEXT_NODE);
          for (let $child of textElement) {
            if ($child.textContent.includes(text)) {
              let filterResult = typeof filter === "function" ? filter(element) : false;
              if (!filterResult) {
                yield $child;
              }
            }
          }
        }
      }
      for (let index = 0; index < element.children.length; index++) {
        let $child = element.children[index];
        yield* that.findElementsWithText($child, text, filter);
      }
    }
findVisibleElement(element) {
      let currentElement = element;
      while (currentElement) {
        let elementRect = currentElement.getBoundingClientRect();
        if (Boolean(elementRect.length)) {
          return currentElement;
        }
        currentElement = currentElement.parentElement;
      }
      return null;
    }
    formatByteToSize(byteSize, addType = true) {
      byteSize = parseInt(byteSize.toString());
      if (isNaN(byteSize)) {
        throw new Error("Utils.formatByteToSize 参数 byteSize 格式不正确");
      }
      let result = 0;
      let resultType = "KB";
      let sizeData = {};
      sizeData.B = 1;
      sizeData.KB = 1024;
      sizeData.MB = sizeData.KB * sizeData.KB;
      sizeData.GB = sizeData.MB * sizeData.KB;
      sizeData.TB = sizeData.GB * sizeData.KB;
      sizeData.PB = sizeData.TB * sizeData.KB;
      sizeData.EB = sizeData.PB * sizeData.KB;
      sizeData.ZB = sizeData.EB * sizeData.KB;
      sizeData.YB = sizeData.ZB * sizeData.KB;
      sizeData.BB = sizeData.YB * sizeData.KB;
      sizeData.NB = sizeData.BB * sizeData.KB;
      sizeData.DB = sizeData.NB * sizeData.KB;
      for (let key in sizeData) {
        result = byteSize / sizeData[key];
        resultType = key;
        if (sizeData.KB >= result) {
          break;
        }
      }
      result = result.toFixed(2);
      result = addType ? result + resultType.toString() : parseFloat(result.toString());
      return result;
    }
    getNodeListValue(...args) {
      let resultArray = [];
      for (let arg of args) {
        let value = arg;
        if (typeof arg === "function") {
          value = arg();
        }
        if (value.length !== 0) {
          resultArray = [...value];
          break;
        }
      }
      return resultArray;
    }
    getNonNullValue(...args) {
      let resultValue = args[args.length - 1];
      let UtilsContext = this;
      for (const argValue of args) {
        if (UtilsContext.isNotNull(argValue)) {
          resultValue = argValue;
          break;
        }
      }
      return resultValue;
    }
    formatTime(text = new Date(), formatType = "yyyy-MM-dd HH:mm:ss") {
      let time = text == null ? new Date() : new Date(text);
      function checkTime(timeNum) {
        if (timeNum < 10)
          return "0" + timeNum;
        return timeNum;
      }
      function timeSystemChange(hourNum) {
        return hourNum > 12 ? hourNum - 12 : hourNum;
      }
      let timeRegexp = {
        yyyy: time.getFullYear(),
MM: checkTime(time.getMonth() + 1),
dd: checkTime(time.getDate()),
HH: checkTime(time.getHours()),
hh: checkTime(timeSystemChange(time.getHours())),
mm: checkTime(time.getMinutes()),
ss: checkTime(time.getSeconds())
};
      Object.keys(timeRegexp).forEach(function(key) {
        let replaecRegexp = new RegExp(key, "g");
        formatType = formatType.replace(replaecRegexp, timeRegexp[key]);
      });
      return formatType;
    }
    formatToTimeStamp(text) {
      if (typeof text !== "string") {
        throw new Error("Utils.formatToTimeStamp 参数 text 必须为 string 类型");
      }
      if (text.length === 8) {
        let today = new Date();
        text = today.getFullYear() + "-" + (today.getMonth() + 1) + "-" + today.getDate() + " " + text;
      }
      text = text.substring(0, 19);
      text = text.replace(/-/g, "/");
      let timestamp = new Date(text).getTime();
      return timestamp;
    }
GBKEncoder = GBKEncoder;
getTransitionEndNameList() {
      return ["webkitTransitionEnd", "mozTransitionEnd", "MSTransitionEnd", "otransitionend", "transitionend"];
    }
getAnimationEndNameList() {
      return ["webkitAnimationEnd", "mozAnimationEnd", "MSAnimationEnd", "oanimationend", "animationend"];
    }
    getArrayLastValue(targetObj) {
      return targetObj[targetObj.length - 1];
    }
    getArrayRealValue(...args) {
      let result = null;
      for (let arg of args) {
        if (typeof arg === "function") {
          arg = arg();
        }
        if (arg != null) {
          result = arg;
          break;
        }
      }
      return result;
    }
    getDaysDifference(timestamp1 = Date.now(), timestamp2 = Date.now(), type = "天") {
      type = type.trim();
      if (timestamp1.toString().length === 10) {
        timestamp1 = timestamp1 * 1e3;
      }
      if (timestamp2.toString().length === 10) {
        timestamp2 = timestamp2 * 1e3;
      }
      let smallTimeStamp = timestamp1 > timestamp2 ? timestamp2 : timestamp1;
      let bigTimeStamp = timestamp1 > timestamp2 ? timestamp1 : timestamp2;
      let oneSecond = 1e3;
      let oneMinute = 60 * oneSecond;
      let oneHour = 60 * oneMinute;
      let oneDay = 24 * oneHour;
      let oneMonth = 30 * oneDay;
      let oneYear = 12 * oneMonth;
      let bigDate = new Date(bigTimeStamp);
      let smallDate = new Date(smallTimeStamp);
      let remainderValue = 1;
      if (type === "年") {
        remainderValue = oneYear;
      } else if (type === "月") {
        remainderValue = oneMonth;
      } else if (type === "天") {
        remainderValue = oneDay;
      } else if (type === "时") {
        remainderValue = oneHour;
      } else if (type === "分") {
        remainderValue = oneMinute;
      } else if (type === "秒") {
        remainderValue = oneSecond;
      }
      let diffValue = Math.round(Math.abs((bigDate - smallDate) / remainderValue));
      if (type === "auto") {
        let timeDifference = bigTimeStamp - smallTimeStamp;
        diffValue = Math.floor(timeDifference / (24 * 3600 * 1e3));
        if (diffValue > 0) {
          diffValue = diffValue + "天";
        } else {
          let leave1 = timeDifference % (24 * 3600 * 1e3);
          let hours = Math.floor(leave1 / (3600 * 1e3));
          if (hours > 0) {
            diffValue = hours + "小时";
          } else {
            let leave2 = leave1 % (3600 * 1e3);
            let minutes = Math.floor(leave2 / (60 * 1e3));
            if (minutes > 0) {
              diffValue = minutes + "分钟";
            } else {
              let leave3 = leave2 % (60 * 1e3);
              let seconds = Math.round(leave3 / 1e3);
              diffValue = seconds + "秒";
            }
          }
        }
      }
      return diffValue;
    }
    getElementSelector(element) {
      let UtilsContext = this;
      if (!element)
        return void 0;
      if (!element.parentElement)
        return void 0;
      if (element.id)
        return "#" + element.id;
      let selector = UtilsContext.getElementSelector(element.parentElement);
      if (!selector) {
        return element.tagName.toLowerCase();
      }
      if (element.parentElement.querySelectorAll(element.tagName).length > 1) {
        let index = Array.prototype.indexOf.call(element.parentElement.children, element) + 1;
        selector += " > " + element.tagName.toLowerCase() + ":nth-child(" + index + ")";
      } else {
        selector += " > " + element.tagName.toLowerCase();
      }
      return selector;
    }
getMaxValue(...args) {
      let result = [...args];
      let newResult = [];
      if (result.length === 0) {
        return void 0;
      }
      if (result.length > 1) {
        if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
          let data = result[0];
          let handleDataFunc = result[1];
          Object.keys(data).forEach((keyName) => {
            newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
          });
        } else {
          result.forEach((item) => {
            if (!isNaN(parseFloat(item))) {
              newResult = [...newResult, parseFloat(item)];
            }
          });
        }
        return Math.max(...newResult);
      } else {
        result[0].forEach((item) => {
          if (!isNaN(parseFloat(item))) {
            newResult = [...newResult, parseFloat(item)];
          }
        });
        return Math.max(...newResult);
      }
    }
    getMaxZIndexNodeInfo(deviation = 1, target = this.windowApi.document, ignoreCallBack) {
      deviation = Number.isNaN(deviation) ? 1 : deviation;
      const UtilsContext = this;
      const maxZIndexCompare = 2 * Math.pow(10, 9);
      let zIndex = 0;
      let maxZIndexNode = null;
      function isVisibleNode($css) {
        return $css.position !== "static" && $css.display !== "none";
      }
      function queryMaxZIndex($ele) {
        if (typeof ignoreCallBack === "function") {
          let ignoreResult = ignoreCallBack($ele);
          if (typeof ignoreResult === "boolean" && !ignoreResult) {
            return;
          }
        }
        const nodeStyle = UtilsContext.windowApi.window.getComputedStyle($ele);
        if (isVisibleNode(nodeStyle)) {
          let nodeZIndex = parseInt(nodeStyle.zIndex);
          if (!isNaN(nodeZIndex)) {
            if (nodeZIndex > zIndex) {
              zIndex = nodeZIndex;
              maxZIndexNode = $ele;
            }
          }
          if ($ele.shadowRoot != null && $ele instanceof ShadowRoot) {
            $ele.shadowRoot.querySelectorAll("*").forEach(($shadowEle) => {
              queryMaxZIndex($shadowEle);
            });
          }
        }
      }
      target.querySelectorAll("*").forEach(($ele, index) => {
        queryMaxZIndex($ele);
      });
      zIndex += deviation;
      if (zIndex >= maxZIndexCompare) {
        zIndex = maxZIndexCompare;
      }
      return {
        node: maxZIndexNode,
        zIndex
      };
    }
    getMaxZIndex(deviation = 1, target = this.windowApi.document, ignoreCallBack) {
      return this.getMaxZIndexNodeInfo(deviation, target, ignoreCallBack).zIndex;
    }
    getMinValue(...args) {
      let result = [...args];
      let newResult = [];
      if (result.length === 0) {
        return void 0;
      }
      if (result.length > 1) {
        if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
          let data = result[0];
          let handleDataFunc = result[1];
          Object.keys(data).forEach((keyName) => {
            newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
          });
        } else {
          result.forEach((item) => {
            if (!isNaN(parseFloat(item))) {
              newResult = [...newResult, parseFloat(item)];
            }
          });
        }
        return Math.min(...newResult);
      } else {
        result[0].forEach((item) => {
          if (!isNaN(parseFloat(item))) {
            newResult = [...newResult, parseFloat(item)];
          }
        });
        return Math.min(...newResult);
      }
    }
getRandomAndroidUA() {
      let UtilsContext = this;
      let mobileNameList = [
        "LDN-LX3",
        "RNE-L03",
        "ASUS_X00ID Build/NMF26F",
        "WAS-LX3",
        "PRA-LX3",
        "MYA-L03",
        "Moto G Play",
        "Moto C Build/NRD90M.063",
        "Redmi Note 4 Build/NRD90M",
        "HUAWEI VNS-L21 Build/HUAWEIVNS-L21",
        "VTR-L09",
        "TRT-LX3",
        "M2003J15SC Build/RP1A.200720.011; wv",
        "MI 13 Build/OPR1.170623.027; wv"
      ];
      let androidVersion = UtilsContext.getRandomValue(12, 14);
      let randomMobile = UtilsContext.getRandomValue(mobileNameList);
      let chromeVersion1 = UtilsContext.getRandomValue(120, 132);
      let chromeVersion2 = UtilsContext.getRandomValue(0, 0);
      let chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
      let chromeVersion4 = UtilsContext.getRandomValue(1, 218);
      return `Mozilla/5.0 (Linux; Android ${androidVersion}; ${randomMobile}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Mobile Safari/537.36`;
    }
getRandomPCUA() {
      let UtilsContext = this;
      let chromeVersion1 = UtilsContext.getRandomValue(120, 132);
      let chromeVersion2 = UtilsContext.getRandomValue(0, 0);
      let chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
      let chromeVersion4 = UtilsContext.getRandomValue(1, 218);
      return `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Safari/537.36`;
    }
    getRandomValue(...args) {
      let result = [...args];
      if (result.length > 1) {
        if (result.length === 2 && typeof result[0] === "number" && typeof result[1] === "number") {
          let leftNumber = result[0] > result[1] ? result[1] : result[0];
          let rightNumber = result[0] > result[1] ? result[0] : result[1];
          return Math.round(Math.random() * (rightNumber - leftNumber)) + leftNumber;
        } else {
          return result[Math.floor(Math.random() * result.length)];
        }
      } else if (result.length === 1) {
        let paramData = result[0];
        if (Array.isArray(paramData)) {
          return paramData[Math.floor(Math.random() * paramData.length)];
        } else if (typeof paramData === "object" && Object.keys(paramData).length > 0) {
          let paramObjDataKey = Object.keys(paramData)[Math.floor(Math.random() * Object.keys(paramData).length)];
          return paramData[paramObjDataKey];
        } else {
          return paramData;
        }
      }
    }
getReactObj(element) {
      let result = {};
      if (element == null) {
        return result;
      }
      const keys = Object.keys(element);
      keys.forEach((domPropsName) => {
        if (domPropsName.startsWith("__react")) {
          const propsName = domPropsName.replace(/__(.+)\$.+/i, "$1");
          const propsValue = Reflect.get(element, domPropsName);
          if (propsName in result) ;
          else {
            Reflect.set(result, propsName, propsValue);
          }
        }
      });
      return result;
    }
getSymbol(target, keyName) {
      if (typeof target !== "object") {
        throw new TypeError("target不是一个对象");
      }
      let objectsSymbols = Object.getOwnPropertySymbols(target);
      if (typeof keyName === "string") {
        let findSymbol = objectsSymbols.find((key) => {
          return key.toString() === keyName;
        });
        if (findSymbol) {
          return target[findSymbol];
        }
      } else if (typeof keyName === "symbol") {
        let findSymbol = objectsSymbols.find((key) => {
          return key === keyName;
        });
        if (findSymbol) {
          return target[findSymbol];
        }
      } else {
        let result = {};
        objectsSymbols.forEach((item) => {
          result[item] = target[item];
        });
        return result;
      }
    }
getTextLength(text) {
      let encoder = new TextEncoder();
      let bytes = encoder.encode(text);
      return bytes.length;
    }
    getTextStorageSize(text, addType = true) {
      let UtilsContext = this;
      return UtilsContext.formatByteToSize(UtilsContext.getTextLength(text), addType);
    }
    getThunderUrl(url) {
      if (url == null) {
        throw new TypeError("url不能为空");
      }
      if (typeof url !== "string") {
        throw new TypeError("url必须是string类型");
      }
      if (url.trim() === "") {
        throw new TypeError("url不能为空字符串或纯空格");
      }
      return `thunder://${this.windowApi.globalThis.btoa("AA" + url + "ZZ")}`;
    }
GM_Cookie = UtilsGMCookie;
GM_Menu = GMMenu;
Hooks = Hooks;
Httpx = Httpx;
indexedDB = indexedDB;
    isNativeFunc(target) {
      return Boolean(target.toString().match(/^function .*\(\) { \[native code\] }$/));
    }
    isNearBottom(...args) {
      let nearBottomHeight = 50;
      let checkWindow = () => {
        let scrollTop = this.windowApi.window.pageYOffset || this.windowApi.document.documentElement.scrollTop;
        let viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
        let maxScrollHeight = this.windowApi.document.documentElement.scrollHeight - nearBottomHeight;
        return scrollTop + viewportHeight >= maxScrollHeight;
      };
      let checkNode = ($ele) => {
        let scrollTop = $ele.scrollTop;
        let viewportHeight = $ele.clientHeight;
        let maxScrollHeight = $ele.scrollHeight - viewportHeight - nearBottomHeight;
        return scrollTop >= maxScrollHeight;
      };
      let firstArg = args[0];
      if (args.length === 0 || typeof args[0] === "number") {
        return checkWindow();
      } else if (typeof args[0] === "object" && args[0] instanceof HTMLElement) {
        if (typeof args[1] === "number" && !Number.isNaN(args[1])) {
          nearBottomHeight = args[1];
        }
        return checkNode(args[0]);
      } else {
        throw new TypeError("参数1类型错误" + typeof firstArg);
      }
    }
isDOM = commonUtil.isDOM.bind(commonUtil);
    isFullscreenEnabled() {
      return !!(this.windowApi.document.fullscreenEnabled || this.windowApi.document.webkitFullScreenEnabled || this.windowApi.document.mozFullScreenEnabled || this.windowApi.document.msFullScreenEnabled);
    }
    isJQuery(target) {
      let result = false;
      if (typeof jQuery === "object" && target instanceof jQuery) {
        result = true;
      }
      if (target == null) {
        return false;
      }
      if (typeof target === "object") {
        let jQueryProps = [
          "add",
          "addBack",
          "addClass",
          "after",
          "ajaxComplete",
          "ajaxError",
          "ajaxSend",
          "ajaxStart",
          "ajaxStop",
          "ajaxSuccess",
          "animate",
          "append",
          "appendTo",
          "attr",
          "before",
          "bind",
          "blur",
          "change",
          "children",
          "clearQueue",
          "click",
          "clone",
          "closest",
          "constructor",
          "contents",
          "contextmenu",
          "css",
          "data",
          "dblclick",
          "delay",
          "delegate",
          "dequeue",
          "each",
          "empty",
          "end",
          "eq",
          "extend",
          "fadeIn",
          "fadeOut",
          "fadeTo",
          "fadeToggle",
          "filter",
          "find",
          "first",
          "focus",
          "focusin",
          "focusout",
          "get",
          "has",
          "hasClass",
          "height",
          "hide",
          "hover",
          "html",
          "index",
          "init",
          "innerHeight",
          "innerWidth",
          "insertAfter",
          "insertBefore",
          "is",
          "jquery",
          "keydown",
          "keypress",
          "keyup",
          "last",
          "load",
          "map",
          "mousedown",
          "mouseenter",
          "mouseleave",
          "mousemove",
          "mouseout",
          "mouseover",
          "mouseup",
          "next",
          "nextAll",
          "not",
          "off",
          "offset",
          "offsetParent",
          "on",
          "one",
          "outerHeight",
          "outerWidth",
          "parent",
          "parents",
          "position",
          "prepend",
          "prependTo",
          "prev",
          "prevAll",
          "prevUntil",
          "promise",
          "prop",
          "pushStack",
          "queue",
          "ready",
          "remove",
          "removeAttr",
          "removeClass",
          "removeData",
          "removeProp",
          "replaceAll",
          "replaceWith",
          "resize",
          "scroll",
          "scrollLeft",
          "scrollTop",
          "select",
          "show",
          "siblings",
          "slice",
          "slideDown",
          "slideToggle",
          "slideUp",
          "sort",
          "splice",
          "text",
          "toArray",
          "toggle",
          "toggleClass",
          "trigger",
          "triggerHandler",
          "unbind",
          "width",
          "wrap"
        ];
        for (const jQueryPropsName of jQueryProps) {
          if (!(jQueryPropsName in target)) {
            result = false;
            break;
          } else {
            result = true;
          }
        }
      }
      return result;
    }
    isPhone(userAgent = navigator.userAgent) {
      return Boolean(/(iPhone|iPad|iPod|iOS|Android|Mobile)/i.test(userAgent));
    }
    isSameChars(targetStr, coefficient = 1) {
      if (typeof targetStr !== "string") {
        throw new TypeError("参数 str 必须是 string 类型");
      }
      if (targetStr.length < 2) {
        return false;
      }
      targetStr = targetStr.toLowerCase();
      const targetCharMap = {};
      let targetStrLength = 0;
      for (const char of targetStr) {
        if (Reflect.has(targetCharMap, char)) {
          targetCharMap[char]++;
        } else {
          targetCharMap[char] = 1;
        }
        targetStrLength++;
      }
      let result = false;
      for (const char in targetCharMap) {
        if (targetCharMap[char] / targetStrLength >= coefficient) {
          result = true;
          break;
        }
      }
      return result;
    }
isNotNull = commonUtil.isNotNull.bind(commonUtil);
isNull = commonUtil.isNull.bind(commonUtil);
    isThemeDark() {
      return this.windowApi.globalThis.matchMedia("(prefers-color-scheme: dark)").matches;
    }
isVisible(element, inView = false) {
      let needCheckDomList = [];
      if (element instanceof Array || element instanceof NodeList) {
        element = element;
        needCheckDomList = [...element];
      } else {
        needCheckDomList = [element];
      }
      let result = true;
      for (const domItem of needCheckDomList) {
        let domDisplay = this.windowApi.window.getComputedStyle(domItem);
        if (domDisplay.display === "none") {
          result = false;
        } else {
          let domClientRect = domItem.getBoundingClientRect();
          if (inView) {
            let viewportWidth = this.windowApi.window.innerWidth || this.windowApi.document.documentElement.clientWidth;
            let viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
            result = !(domClientRect.right < 0 || domClientRect.left > viewportWidth || domClientRect.bottom < 0 || domClientRect.top > viewportHeight);
          } else {
            result = Boolean(domItem.getClientRects().length);
          }
        }
        if (!result) {
          break;
        }
      }
      return result;
    }
    isWebView_Via() {
      let result = true;
      let UtilsContext = this;
      if (typeof this.windowApi.top.window.via === "object") {
        for (const key in Object.values(this.windowApi.top.window.via)) {
          if (Reflect.has(this.windowApi.top.window.via, key)) {
            let objValueFunc = this.windowApi.top.window.via[key];
            if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
              result = true;
            } else {
              result = false;
              break;
            }
          }
        }
      } else {
        result = false;
      }
      return result;
    }
    isWebView_X() {
      let result = true;
      let UtilsContext = this;
      if (typeof this.windowApi.top.window.mbrowser === "object") {
        for (const key in Object.values(this.windowApi.top.window.mbrowser)) {
          if (Reflect.has(this.windowApi.top.window.mbrowser, key)) {
            let objValueFunc = this.windowApi.top.window.mbrowser[key];
            if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
              result = true;
            } else {
              result = false;
              break;
            }
          }
        }
      } else {
        result = false;
      }
      return result;
    }
    parseObjectToArray(target) {
      if (typeof target !== "object") {
        throw new Error("Utils.parseObjectToArray 参数 target 必须为 object 类型");
      }
      let result = [];
      Object.keys(target).forEach(function(keyName) {
        result = result.concat(target[keyName]);
      });
      return result;
    }
LockFunction = LockFunction;
Log = Log;
    mergeArrayToString(data, handleFunc) {
      if (!(data instanceof Array)) {
        throw new Error("Utils.mergeArrayToString 参数 data 必须为 Array 类型");
      }
      let content = "";
      if (typeof handleFunc === "function") {
        data.forEach((item) => {
          content += handleFunc(item);
        });
      } else if (typeof handleFunc === "string") {
        data.forEach((item) => {
          content += item[handleFunc];
        });
      } else {
        data.forEach((item) => {
          Object.values(item).filter((item2) => typeof item2 === "string").forEach((item3) => {
            content += item3;
          });
        });
      }
      return content;
    }
    mutationObserver(target, observer_config) {
      let UtilsContext = this;
      let default_obverser_config = {
callback: () => {
        },
        config: {
subtree: void 0,
childList: void 0,
attributes: void 0,
attributeFilter: void 0,
attributeOldValue: void 0,
characterData: void 0,
characterDataOldValue: void 0
        },
        immediate: false
      };
      observer_config = UtilsContext.assign(default_obverser_config, observer_config);
      let windowMutationObserver = this.windowApi.window.MutationObserver || this.windowApi.window.webkitMutationObserver || this.windowApi.window.MozMutationObserver;
      let mutationObserver = new windowMutationObserver(function(mutations, observer) {
        if (typeof observer_config.callback === "function") {
          observer_config.callback(mutations, observer);
        }
      });
      if (Array.isArray(target) || target instanceof NodeList) {
        target.forEach((item) => {
          mutationObserver.observe(item, observer_config.config);
        });
      } else if (UtilsContext.isJQuery(target)) {
        target.each((index, item) => {
          mutationObserver.observe(item, observer_config.config);
        });
      } else {
        mutationObserver.observe(target, observer_config.config);
      }
      if (observer_config.immediate) {
        if (typeof observer_config.callback === "function") {
          observer_config.callback([], mutationObserver);
        }
      }
      return mutationObserver;
    }
mutationVisible(target, callback, options) {
      if (typeof IntersectionObserver === "undefined") {
        throw new TypeError("IntersectionObserver is not defined");
      }
      if (target == null) {
        throw new TypeError("mutatuinVisible target is null");
      }
      let defaultOptions = {
        root: null,
        rootMargin: "0px 0px 0px 0px",
        threshold: [0.01, 0.99]
      };
      defaultOptions = this.assign(defaultOptions, options || {});
      let intersectionObserver = new IntersectionObserver((entries, observer) => {
        if (entries[0].isIntersecting) {
          if (typeof callback === "function") {
            callback(entries, observer);
          }
        }
      }, defaultOptions);
      if (Array.isArray(target)) {
        target.forEach((item) => {
          intersectionObserver.observe(item);
        });
      } else {
        intersectionObserver.observe(target);
      }
    }
noConflict() {
      if (this.windowApi.window.Utils) {
        Reflect.deleteProperty(this.windowApi.window, "Utils");
      }
      this.windowApi.window.Utils = utils$1;
      return utils$1;
    }
    noConflictFunc(needReleaseObject, needReleaseName, functionNameList = [], release = true) {
      let UtilsContext = this;
      if (typeof needReleaseObject !== "object") {
        throw new Error("Utils.noConflictFunc 参数 needReleaseObject 必须为 object 类型");
      }
      if (typeof needReleaseName !== "string") {
        throw new Error("Utils.noConflictFunc 参数 needReleaseName 必须为 string 类型");
      }
      if (!Array.isArray(functionNameList)) {
        throw new Error("Utils.noConflictFunc 参数 functionNameList 必须为 Array 类型");
      }
      let needReleaseKey = "__" + needReleaseName;
      function releaseAll() {
        if (typeof UtilsContext.windowApi.window[needReleaseKey] !== "undefined") {
          return;
        }
        UtilsContext.windowApi.window[needReleaseKey] = UtilsContext.deepClone(needReleaseObject);
        Object.values(needReleaseObject).forEach((value) => {
          if (typeof value === "function") {
            needReleaseObject[value.name] = () => {
            };
          }
        });
      }
      function releaseOne() {
        Array.from(functionNameList).forEach((item) => {
          Object.values(needReleaseObject).forEach((value) => {
            if (typeof value === "function") {
              if (typeof UtilsContext.windowApi.window[needReleaseKey] === "undefined") {
                UtilsContext.windowApi.window[needReleaseKey] = {};
              }
              if (item === value.name) {
                UtilsContext.windowApi.window[needReleaseKey][value.name] = needReleaseObject[value.name];
                needReleaseObject[value.name] = () => {
                };
              }
            }
          });
        });
      }
      function recoveryAll() {
        if (typeof UtilsContext.windowApi.window[needReleaseKey] === "undefined") {
          return;
        }
        Object.assign(needReleaseObject, UtilsContext.windowApi.window[needReleaseKey]);
        Reflect.deleteProperty(UtilsContext.windowApi.window, "needReleaseKey");
      }
      function recoveryOne() {
        if (typeof UtilsContext.windowApi.window[needReleaseKey] === "undefined") {
          return;
        }
        Array.from(functionNameList).forEach((item) => {
          if (UtilsContext.windowApi.window[needReleaseKey][item]) {
            needReleaseObject[item] = UtilsContext.windowApi.window[needReleaseKey][item];
            Reflect.deleteProperty(UtilsContext.windowApi.window[needReleaseKey], item);
            if (Object.keys(UtilsContext.windowApi.window[needReleaseKey]).length === 0) {
              Reflect.deleteProperty(window, needReleaseKey);
            }
          }
        });
      }
      if (release) {
        if (functionNameList.length === 0) {
          releaseAll();
        } else {
          releaseOne();
        }
      } else {
        if (functionNameList.length === 0) {
          recoveryAll();
        } else {
          recoveryOne();
        }
      }
    }
    parseBase64ToBlob(dataUri) {
      if (typeof dataUri !== "string") {
        throw new Error("Utils.parseBase64ToBlob 参数 dataUri 必须为 string 类型");
      }
      let dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]), dataUriLength = dataUriBase64Str.length, u8arr = new Uint8Array(dataUriLength);
      while (dataUriLength--) {
        u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
      }
      return new Blob([u8arr], {
        type: dataUriMime
      });
    }
    parseBase64ToFile(dataUri, fileName = "example") {
      if (typeof dataUri !== "string") {
        throw new Error("Utils.parseBase64ToFile 参数 dataUri 必须为 string 类型");
      }
      if (typeof fileName !== "string") {
        throw new Error("Utils.parseBase64ToFile 参数 fileName 必须为 string 类型");
      }
      let dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]), dataUriLength = dataUriBase64Str.length, u8arr = new Uint8Array(dataUriLength);
      while (dataUriLength--) {
        u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
      }
      return new File([u8arr], fileName, {
        type: dataUriMime
      });
    }
    parseInt(matchList = [], defaultValue = 0) {
      if (matchList == null) {
        return parseInt(defaultValue.toString());
      }
      let parseValue = parseInt(matchList[matchList.length - 1]);
      if (isNaN(parseValue)) {
        parseValue = parseInt(defaultValue.toString());
      }
      return parseValue;
    }
    async parseBlobToFile(blobUrl, fileName = "example") {
      return new Promise((resolve, reject) => {
        fetch(blobUrl).then((response) => response.blob()).then((blob) => {
          const file = new File([blob], fileName, { type: blob.type });
          resolve(file);
        }).catch((error) => {
          console.error("Error:", error);
          reject(error);
        });
      });
    }
    parseCDATA(text = "") {
      let result = "";
      let cdataRegexp = /<\!\[CDATA\[([\s\S]*)\]\]>/;
      let cdataMatch = cdataRegexp.exec(text.trim());
      if (cdataMatch && cdataMatch.length > 1) {
        result = cdataMatch[cdataMatch.length - 1];
      }
      return result;
    }
    async parseFileToBase64(fileObj) {
      let reader = new FileReader();
      reader.readAsDataURL(fileObj);
      return new Promise((resolve) => {
        reader.onload = function(event) {
          resolve(event.target.result);
        };
      });
    }
    parseFromString(text, mimeType = "text/html") {
      let parser = new DOMParser();
      return parser.parseFromString(text, mimeType);
    }
    parseStringToRegExpString(text) {
      if (typeof text !== "string") {
        throw new TypeError("string必须是字符串");
      }
      let regString = text.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
      return regString;
    }
    preventEvent(element, eventNameList = [], capture) {
      function stopEvent(event) {
        event?.preventDefault();
        event?.stopPropagation();
        event?.stopImmediatePropagation();
        return false;
      }
      if (arguments.length === 1) {
        return stopEvent(arguments[0]);
      } else {
        if (typeof eventNameList === "string") {
          eventNameList = [eventNameList];
        }
        eventNameList.forEach((eventName) => {
          element.addEventListener(eventName, stopEvent, {
            capture: Boolean(capture)
          });
        });
      }
    }
Progress = Progress;
    registerTrustClickEvent(isTrustValue = true, filter) {
      function trustEvent(event) {
        return new Proxy(event, {
          get: function(target, property) {
            if (property === "isTrusted") {
              return isTrustValue;
            } else {
              return Reflect.get(target, property);
            }
          }
        });
      }
      if (filter == null) {
        filter = function(typeName) {
          return typeName === "click";
        };
      }
      const originalListener = EventTarget.prototype.addEventListener;
      EventTarget.prototype.addEventListener = function(...args) {
        let type = args[0];
        let callback = args[1];
        if (filter(type)) {
          if (typeof callback === "function") {
            args[1] = function(event) {
              callback.call(this, trustEvent(event));
            };
          } else if (typeof callback === "object" && "handleEvent" in callback) {
            let oldHandleEvent = callback["handleEvent"];
            args[1]["handleEvent"] = function(event) {
              if (event == null) {
                return;
              }
              try {
                event instanceof Proxy;
                oldHandleEvent.call(this, trustEvent(event));
              } catch (error) {
                Reflect.set(event, "isTrusted", isTrustValue);
              }
            };
          }
        }
        return originalListener.apply(this, args);
      };
    }
    reverseNumber(num) {
      let reversedNum = 0;
      let isNegative = false;
      if (num < 0) {
        isNegative = true;
        num = Math.abs(num);
      }
      while (num > 0) {
        reversedNum = reversedNum * 10 + num % 10;
        num = Math.floor(num / 10);
      }
      return isNegative ? -reversedNum : reversedNum;
    }
    selectElementText(element, childTextNode, startIndex, endIndex) {
      let range = this.windowApi.document.createRange();
      range.selectNodeContents(element);
      if (childTextNode) {
        if (childTextNode.nodeType !== Node.TEXT_NODE) {
          throw new TypeError("childTextNode必须是#text元素");
        }
        if (startIndex != null && endIndex != null) {
          range.setStart(childTextNode, startIndex);
          range.setEnd(childTextNode, endIndex);
        }
      }
      let selection = this.windowApi.globalThis.getSelection();
      if (selection) {
        selection.removeAllRanges();
        selection.addRange(range);
      }
    }
    setClip(data, info = {
      type: "text",
      mimetype: "text/plain"
    }) {
      if (typeof data === "object") {
        if (data instanceof Element) {
          data = data.outerHTML;
        } else {
          data = JSON.stringify(data);
        }
      } else if (typeof data !== "string") {
        data = data.toString();
      }
      let textType = typeof info === "object" ? info.type : info;
      if (textType.includes("html")) {
        textType = "text/html";
      } else {
        textType = "text/plain";
      }
      let UtilsContext = this;
      class UtilsClipboard {
        #resolve;
        #copyData;
        #copyDataType;
        constructor(resolve, copyData, copyDataType) {
          this.#resolve = resolve;
          this.#copyData = copyData;
          this.#copyDataType = copyDataType;
        }
        async init() {
          let copyStatus = false;
          let requestPermissionStatus = await this.requestClipboardPermission();
          console.log(requestPermissionStatus);
          if (this.hasClipboard() && (this.hasClipboardWrite() || this.hasClipboardWriteText())) {
            try {
              copyStatus = await this.copyDataByClipboard();
            } catch (error) {
              console.error("复制失败,使用第二种方式,error👉", error);
              copyStatus = this.copyTextByTextArea();
            }
          } else {
            copyStatus = this.copyTextByTextArea();
          }
          this.#resolve(copyStatus);
          this.destroy();
        }
        destroy() {
          this.#resolve = null;
          this.#copyData = null;
          this.#copyDataType = null;
        }
        isText() {
          return this.#copyDataType.includes("text");
        }
        hasClipboard() {
          return navigator?.clipboard != null;
        }
        hasClipboardWrite() {
          return navigator?.clipboard?.write != null;
        }
        hasClipboardWriteText() {
          return navigator?.clipboard?.writeText != null;
        }
copyTextByTextArea() {
          try {
            let copyElement = UtilsContext.windowApi.document.createElement("textarea");
            copyElement.value = this.#copyData;
            copyElement.setAttribute("type", "text");
            copyElement.setAttribute("style", "opacity:0;position:absolute;");
            copyElement.setAttribute("readonly", "readonly");
            UtilsContext.windowApi.document.body.appendChild(copyElement);
            copyElement.select();
            UtilsContext.windowApi.document.execCommand("copy");
            UtilsContext.windowApi.document.body.removeChild(copyElement);
            return true;
          } catch (error) {
            console.error("复制失败,error👉", error);
            return false;
          }
        }
requestClipboardPermission() {
          return new Promise((resolve, reject) => {
            if (navigator.permissions && navigator.permissions.query) {
              navigator.permissions.query({
                name: "clipboard-write"
              }).then((permissionStatus) => {
                resolve(true);
              }).catch((error) => {
                console.error([
                  "申请剪贴板权限失败,尝试直接写入👉",
                  error.message ?? error.name ?? error.stack
                ]);
                resolve(false);
              });
            } else {
              resolve(false);
            }
          });
        }
copyDataByClipboard() {
          return new Promise((resolve, reject) => {
            if (this.isText()) {
              navigator.clipboard.writeText(this.#copyData).then(() => {
                resolve(true);
              }).catch((error) => {
                reject(error);
              });
            } else {
              let textBlob = new Blob([this.#copyData], {
                type: this.#copyDataType
              });
              navigator.clipboard.write([
                new ClipboardItem({
                  [this.#copyDataType]: textBlob
                })
              ]).then(() => {
                resolve(true);
              }).catch((error) => {
                reject(error);
              });
            }
          });
        }
      }
      return new Promise((resolve) => {
        const utilsClipboard = new UtilsClipboard(resolve, data, textType);
        if (UtilsContext.windowApi.document.hasFocus()) {
          utilsClipboard.init();
        } else {
          UtilsContext.windowApi.window.addEventListener("focus", () => {
            utilsClipboard.init();
          }, { once: true });
        }
      });
    }
    setTimeout(callback, delayTime = 0) {
      let UtilsContext = this;
      if (typeof callback !== "function" && typeof callback !== "string") {
        throw new TypeError("Utils.setTimeout 参数 callback 必须为 function|string 类型");
      }
      if (typeof delayTime !== "number") {
        throw new TypeError("Utils.setTimeout 参数 delayTime 必须为 number 类型");
      }
      return new Promise((resolve) => {
        UtilsContext.workerSetTimeout(() => {
          resolve(UtilsContext.tryCatch().run(callback));
        }, delayTime);
      });
    }
    sleep(delayTime = 0) {
      let UtilsContext = this;
      if (typeof delayTime !== "number") {
        throw new Error("Utils.sleep 参数 delayTime 必须为 number 类型");
      }
      return new Promise((resolve) => {
        UtilsContext.workerSetTimeout(() => {
          resolve(void 0);
        }, delayTime);
      });
    }
    dragSlider(selector, offsetX = this.windowApi.window.innerWidth) {
      let UtilsContext = this;
      function initMouseEvent(eventName, offSetX, offSetY) {
        let win = typeof unsafeWindow === "undefined" ? globalThis : unsafeWindow;
        let mouseEvent = UtilsContext.windowApi.document.createEvent("MouseEvents");
        mouseEvent.initMouseEvent(eventName, true, true, win, 0, offSetX, offSetY, offSetX, offSetY, false, false, false, false, 0, null);
        return mouseEvent;
      }
      let sliderElement = typeof selector === "string" ? domUtils$1.selector(selector) : selector;
      if (!(sliderElement instanceof Node) || !(sliderElement instanceof Element)) {
        throw new Error("Utils.dragSlider 参数selector 必须为Node/Element类型");
      }
      let rect = sliderElement.getBoundingClientRect(), x0 = rect.x || rect.left, y0 = rect.y || rect.top, x1 = x0 + offsetX, y1 = y0;
      sliderElement.dispatchEvent(initMouseEvent("mousedown", x0, y0));
      sliderElement.dispatchEvent(initMouseEvent("mousemove", x1, y1));
      sliderElement.dispatchEvent(initMouseEvent("mouseleave", x1, y1));
      sliderElement.dispatchEvent(initMouseEvent("mouseout", x1, y1));
    }
    enterFullScreen(element = this.windowApi.document.documentElement, options) {
      try {
        if (element.requestFullscreen) {
          element.requestFullscreen(options);
        } else if (element.webkitRequestFullScreen) {
          element.webkitRequestFullScreen();
        } else if (element.mozRequestFullScreen) {
          element.mozRequestFullScreen();
        } else if (element.msRequestFullscreen) {
          element.msRequestFullscreen();
        } else {
          throw new TypeError("该浏览器不支持全屏API");
        }
      } catch (err) {
        console.error(err);
      }
    }
    exitFullScreen(element = this.windowApi.document.documentElement) {
      if (this.windowApi.document.exitFullscreen) {
        return this.windowApi.document.exitFullscreen();
      } else if (this.windowApi.document.msExitFullscreen) {
        return this.windowApi.document.msExitFullscreen();
      } else if (this.windowApi.document.mozCancelFullScreen) {
        return this.windowApi.document.mozCancelFullScreen();
      } else if (this.windowApi.document.webkitCancelFullScreen) {
        return this.windowApi.document.webkitCancelFullScreen();
      } else {
        return new Promise((resolve, reject) => {
          reject(new TypeError("该浏览器不支持全屏API"));
        });
      }
    }
    sortListByProperty(data, getPropertyValueFunc, sortByDesc = true) {
      let UtilsContext = this;
      if (typeof getPropertyValueFunc !== "function" && typeof getPropertyValueFunc !== "string") {
        throw new Error("Utils.sortListByProperty 参数 getPropertyValueFunc 必须为 function|string 类型");
      }
      if (typeof sortByDesc !== "boolean") {
        throw new Error("Utils.sortListByProperty 参数 sortByDesc 必须为 boolean 类型");
      }
      let getObjValue = function(obj) {
        return typeof getPropertyValueFunc === "string" ? obj[getPropertyValueFunc] : getPropertyValueFunc(obj);
      };
      let sortFunc = function(after_obj, before_obj) {
        let beforeValue = getObjValue(before_obj);
        let afterValue = getObjValue(after_obj);
        if (sortByDesc) {
          if (afterValue > beforeValue) {
            return -1;
          } else if (afterValue < beforeValue) {
            return 1;
          } else {
            return 0;
          }
        } else {
          if (afterValue < beforeValue) {
            return -1;
          } else if (afterValue > beforeValue) {
            return 1;
          } else {
            return 0;
          }
        }
      };
      let sortNodeFunc = function(nodeList, getNodeListFunc) {
        let nodeListLength = nodeList.length;
        for (let i2 = 0; i2 < nodeListLength - 1; i2++) {
          for (let j2 = 0; j2 < nodeListLength - 1 - i2; j2++) {
            let beforeNode = nodeList[j2];
            let afterNode = nodeList[j2 + 1];
            let beforeValue = getObjValue(beforeNode);
            let afterValue = getObjValue(afterNode);
            if (sortByDesc == true && beforeValue < afterValue || sortByDesc == false && beforeValue > afterValue) {
              let temp = beforeNode.nextElementSibling;
              afterNode.after(beforeNode);
              if (temp == null) {
                temp.parentNode.appendChild(afterNode);
              } else {
                temp.before(afterNode);
              }
              nodeList = getNodeListFunc();
            }
          }
        }
      };
      let result = data;
      let getDataFunc = null;
      if (data instanceof Function) {
        getDataFunc = data;
        data = data();
      }
      if (Array.isArray(data)) {
        data.sort(sortFunc);
      } else if (data instanceof NodeList || UtilsContext.isJQuery(data)) {
        sortNodeFunc(data, getDataFunc);
        result = getDataFunc();
      } else {
        throw new Error("Utils.sortListByProperty 参数 data 必须为 Array|NodeList|jQuery 类型");
      }
      return result;
    }
    stringToRegular(targetString, flags = "ig") {
      let reg;
      flags = flags.toLowerCase();
      if (typeof targetString === "string") {
        reg = new RegExp(targetString.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"), flags);
      } else if (targetString instanceof RegExp) {
        reg = targetString;
      } else {
        throw new Error("Utils.stringToRegular 参数targetString必须是string|Regexp类型");
      }
      return reg;
    }
    stringTitleToUpperCase(targetString, otherStrToLowerCase = false) {
      let newTargetString = targetString.slice(0, 1).toUpperCase();
      if (otherStrToLowerCase) {
        newTargetString = newTargetString + targetString.slice(1).toLowerCase();
      } else {
        newTargetString = newTargetString + targetString.slice(1);
      }
      return newTargetString;
    }
    startsWith(target, searchString, position = 0) {
      let UtilsContext = this;
      if (position > target.length) {
        return false;
      }
      if (position !== 0) {
        target = target.slice(position, target.length);
      }
      let searchStringRegexp = searchString;
      if (typeof searchString === "string") {
        searchStringRegexp = new RegExp(`^${searchString}`);
      } else if (Array.isArray(searchString)) {
        let flag = false;
        for (const searcStr of searchString) {
          if (!UtilsContext.startsWith(target, searcStr, position)) {
            flag = true;
            break;
          }
        }
        return flag;
      }
      return Boolean(target.match(searchStringRegexp));
    }
    stringTitleToLowerCase(targetString, otherStrToUpperCase = false) {
      let newTargetString = targetString.slice(0, 1).toLowerCase();
      if (otherStrToUpperCase) {
        newTargetString = newTargetString + targetString.slice(1).toUpperCase();
      } else {
        newTargetString = newTargetString + targetString.slice(1);
      }
      return newTargetString;
    }
toJSON = commonUtil.toJSON.bind(commonUtil);
    toSearchParamsStr(obj, addPrefix) {
      let UtilsContext = this;
      let searhParamsStr = "";
      if (Array.isArray(obj)) {
        obj.forEach((item) => {
          if (searhParamsStr === "") {
            searhParamsStr += UtilsContext.toSearchParamsStr(item);
          } else {
            searhParamsStr += "&" + UtilsContext.toSearchParamsStr(item);
          }
        });
      } else {
        searhParamsStr = new URLSearchParams(Object.entries(obj)).toString();
      }
      if (addPrefix && !searhParamsStr.startsWith("?")) {
        searhParamsStr = "?" + searhParamsStr;
      }
      return searhParamsStr;
    }
searchParamStrToObj(searhParamsStr) {
      if (typeof searhParamsStr !== "string") {
        return {};
      }
      return Object.fromEntries(new URLSearchParams(searhParamsStr));
    }
tryCatch = TryCatch;
    uniqueArray(uniqueArrayData = [], compareArrayData, compareFun = (item, item2) => {
      return item === item2;
    }) {
      if (typeof compareArrayData === "function") {
        const compareFn = compareArrayData;
        const seen = new Set();
        const result = [];
        for (const item of uniqueArrayData) {
          const identfier = compareFn(item);
          if (!seen.has(identfier)) {
            seen.add(identfier);
            result.push(item);
          }
        }
        return result;
      } else {
        return Array.from(uniqueArrayData).filter((item) => !Array.from(compareArrayData).some(function(item2) {
          return compareFun(item, item2);
        }));
      }
    }
    waitArrayLoopToEnd(data, handleFunc) {
      let UtilsContext = this;
      if (typeof handleFunc !== "function" && typeof handleFunc !== "string") {
        throw new Error("Utils.waitArrayLoopToEnd 参数 handleDataFunction 必须为 function|string 类型");
      }
      return Promise.all(Array.from(data).map(async (item, index) => {
        await UtilsContext.tryCatch(index, item).run(handleFunc);
      }));
    }
    wait(checkFn, timeout, parent) {
      const UtilsContext = this;
      let __timeout__ = typeof timeout === "number" ? timeout : 0;
      return new Promise((resolve) => {
        let observer = UtilsContext.mutationObserver(parent || UtilsContext.windowApi.document, {
          config: {
            subtree: true,
            childList: true,
            attributes: true
          },
          immediate: true,
          callback(mutations, __observer__) {
            let result = checkFn();
            if (result.success) {
              if (typeof __observer__?.disconnect === "function") {
                __observer__.disconnect();
              }
              resolve(result.data);
            }
          }
        });
        if (__timeout__ > 0) {
          UtilsContext.workerSetTimeout(() => {
            if (typeof observer?.disconnect === "function") {
              observer.disconnect();
            }
            resolve(null);
          }, __timeout__);
        }
      });
    }
    waitNode(...args) {
      args = args.filter((arg) => arg !== void 0);
      let UtilsContext = this;
      let selector = args[0];
      let parent = UtilsContext.windowApi.document;
      let timeout = 0;
      if (typeof args[0] !== "string" && !Array.isArray(args[0]) && typeof args[0] !== "function") {
        throw new TypeError("Utils.waitNode 第一个参数必须是string|string[]|Function");
      }
      if (args.length === 1) ;
      else if (args.length === 2) {
        let secondParam = args[1];
        if (typeof secondParam === "number") {
          timeout = secondParam;
        } else if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
        } else {
          throw new TypeError("Utils.waitNode 第二个参数必须是number|Node");
        }
      } else if (args.length === 3) {
        let secondParam = args[1];
        let thirdParam = args[2];
        if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
          if (typeof thirdParam === "number") {
            timeout = thirdParam;
          } else {
            throw new TypeError("Utils.waitNode 第三个参数必须是number");
          }
        } else {
          throw new TypeError("Utils.waitNode 第二个参数必须是Node");
        }
      } else {
        throw new TypeError("Utils.waitNode 参数个数错误");
      }
      function getNode() {
        if (Array.isArray(selector)) {
          let result = [];
          for (let index = 0; index < selector.length; index++) {
            let node = domUtils$1.selector(selector[index]);
            if (node) {
              result.push(node);
            }
          }
          if (result.length === selector.length) {
            return result;
          }
        } else if (typeof selector === "function") {
          return selector();
        } else {
          return domUtils$1.selector(selector, parent);
        }
      }
      return UtilsContext.wait(() => {
        let node = getNode();
        if (node) {
          return {
            success: true,
            data: node
          };
        } else {
          return {
            success: false,
            data: node
          };
        }
      }, timeout, parent);
    }
    waitAnyNode(...args) {
      args = args.filter((arg) => arg !== void 0);
      let UtilsContext = this;
      let selectorList = args[0];
      let parent = UtilsContext.windowApi.document;
      let timeout = 0;
      if (typeof args[0] !== "object" && !Array.isArray(args[0])) {
        throw new TypeError("Utils.waitAnyNode 第一个参数必须是string[]");
      }
      if (args.length === 1) ;
      else if (args.length === 2) {
        let secondParam = args[1];
        if (typeof secondParam === "number") {
          timeout = secondParam;
        } else if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
        } else {
          throw new TypeError("Utils.waitAnyNode 第二个参数必须是number|Node");
        }
      } else if (args.length === 3) {
        let secondParam = args[1];
        let thirdParam = args[2];
        if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
          if (typeof thirdParam === "number") {
            timeout = thirdParam;
          } else {
            throw new TypeError("Utils.waitAnyNode 第三个参数必须是number");
          }
        } else {
          throw new TypeError("Utils.waitAnyNode 第二个参数必须是Node");
        }
      } else {
        throw new TypeError("Utils.waitAnyNode 参数个数错误");
      }
      let promiseList = selectorList.map((selector) => {
        return UtilsContext.waitNode(selector, parent, timeout);
      });
      return Promise.any(promiseList);
    }
    waitNodeList(...args) {
      args = args.filter((arg) => arg !== void 0);
      let UtilsContext = this;
      let selector = args[0];
      let parent = UtilsContext.windowApi.document;
      let timeout = 0;
      if (typeof args[0] !== "string" && !Array.isArray(args[0])) {
        throw new TypeError("Utils.waitNodeList 第一个参数必须是string|string[]");
      }
      if (args.length === 1) ;
      else if (args.length === 2) {
        let secondParam = args[1];
        if (typeof secondParam === "number") {
          timeout = secondParam;
        } else if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
        } else {
          throw new TypeError("Utils.waitNodeList 第二个参数必须是number|Node");
        }
      } else if (args.length === 3) {
        let secondParam = args[1];
        let thirdParam = args[2];
        if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
          if (typeof thirdParam === "number") {
            timeout = thirdParam;
          } else {
            throw new TypeError("Utils.waitNodeList 第三个参数必须是number");
          }
        } else {
          throw new TypeError("Utils.waitNodeList 第二个参数必须是Node");
        }
      } else {
        throw new TypeError("Utils.waitNodeList 参数个数错误");
      }
      function getNodeList() {
        if (Array.isArray(selector)) {
          let result = [];
          for (let index = 0; index < selector.length; index++) {
            let nodeList = domUtils$1.selectorAll(selector[index], parent);
            if (nodeList.length) {
              result.push(nodeList);
            }
          }
          if (result.length === selector.length) {
            return result;
          }
        } else {
          let nodeList = domUtils$1.selectorAll(selector, parent);
          if (nodeList.length) {
            return nodeList;
          }
        }
      }
      return UtilsContext.wait(() => {
        let node = getNodeList();
        if (node) {
          return {
            success: true,
            data: node
          };
        } else {
          return {
            success: false,
            data: node
          };
        }
      }, timeout, parent);
    }
    waitAnyNodeList(...args) {
      args = args.filter((arg) => arg !== void 0);
      let UtilsContext = this;
      let selectorList = args[0];
      let parent = UtilsContext.windowApi.document;
      let timeout = 0;
      if (!Array.isArray(args[0])) {
        throw new TypeError("Utils.waitAnyNodeList 第一个参数必须是string[]");
      }
      if (args.length === 1) ;
      else if (args.length === 2) {
        let secondParam = args[1];
        if (typeof secondParam === "number") {
          timeout = secondParam;
        } else if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
        } else {
          throw new TypeError("Utils.waitAnyNodeList 第二个参数必须是number|Node");
        }
      } else if (args.length === 3) {
        let secondParam = args[1];
        let thirdParam = args[2];
        if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
          if (typeof thirdParam === "number") {
            timeout = thirdParam;
          } else {
            throw new TypeError("Utils.waitAnyNodeList 第三个参数必须是number");
          }
        } else {
          throw new TypeError("Utils.waitAnyNodeList 第二个参数必须是Node");
        }
      } else {
        throw new TypeError("Utils.waitAnyNodeList 参数个数错误");
      }
      let promiseList = selectorList.map((selector) => {
        return UtilsContext.waitNodeList(selector, parent, timeout);
      });
      return Promise.any(promiseList);
    }
    waitProperty(checkObj, checkPropertyName) {
      return new Promise((resolve) => {
        let obj = checkObj;
        if (typeof checkObj === "function") {
          obj = checkObj();
        }
        if (Reflect.has(obj, checkPropertyName)) {
          resolve(obj[checkPropertyName]);
        } else {
          Object.defineProperty(obj, checkPropertyName, {
            set: function(value) {
              try {
                resolve(value);
              } catch (error) {
                console.error("Error setting property:", error);
              }
            }
          });
        }
      });
    }
    waitPropertyByInterval(checkObj, checkPropertyName, intervalTimer = 250, maxTime = -1) {
      let UtilsContext = this;
      if (checkObj == null) {
        throw new TypeError("checkObj 不能为空对象 ");
      }
      let isResolve = false;
      return new Promise((resolve, reject) => {
        let interval = UtilsContext.workerSetInterval(() => {
          let obj = checkObj;
          if (typeof checkObj === "function") {
            obj = checkObj();
          }
          if (typeof obj !== "object") {
            return;
          }
          if (obj == null) {
            return;
          }
          if (typeof checkPropertyName === "function" && checkPropertyName(obj) || Reflect.has(obj, checkPropertyName)) {
            isResolve = true;
            UtilsContext.workerClearInterval(interval);
            resolve(obj[checkPropertyName]);
          }
        }, intervalTimer);
        if (maxTime !== -1) {
          UtilsContext.workerSetTimeout(() => {
            if (!isResolve) {
              UtilsContext.workerClearInterval(interval);
              reject();
            }
          }, maxTime);
        }
      });
    }
    async waitVueByInterval(element, propertyName, timer = 250, maxTime = -1, vueName = "__vue__") {
      if (element == null) {
        throw new Error("Utils.waitVueByInterval 参数element 不能为空");
      }
      let flag = false;
      let UtilsContext = this;
      try {
        await UtilsContext.waitPropertyByInterval(element, function(targetElement) {
          if (targetElement == null) {
            return false;
          }
          if (!(vueName in targetElement)) {
            return false;
          }
          if (propertyName == null) {
            return true;
          }
          let vueObject = targetElement[vueName];
          if (typeof propertyName === "string") {
            if (propertyName in vueObject) {
              flag = true;
              return true;
            }
          } else {
            if (propertyName(vueObject)) {
              flag = true;
              return true;
            }
          }
          return false;
        }, timer, maxTime);
      } catch (error) {
        return flag;
      }
      return flag;
    }
    watchObject(target, propertyName, getCallBack, setCallBack) {
      if (typeof getCallBack !== "function" && typeof setCallBack !== "function") {
        return;
      }
      if (typeof getCallBack === "function") {
        Object.defineProperty(target, propertyName, {
          get() {
            if (typeof getCallBack === "function") {
              return getCallBack(target[propertyName]);
            } else {
              return target[propertyName];
            }
          }
        });
      } else if (typeof setCallBack === "function") {
        Object.defineProperty(target, propertyName, {
          set(value) {
            if (typeof setCallBack === "function") {
              setCallBack(value);
            }
          }
        });
      } else {
        Object.defineProperty(target, propertyName, {
          get() {
            if (typeof getCallBack === "function") {
              return getCallBack(target[propertyName]);
            } else {
              return target[propertyName];
            }
          },
          set(value) {
            if (typeof setCallBack === "function") {
              setCallBack(value);
            }
          }
        });
      }
    }
queryProperty(target, handler) {
      if (target == null) {
        return;
      }
      let handleResult = handler(target);
      if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
        return handleResult.data;
      }
      return this.queryProperty(handleResult.data, handler);
    }
async asyncQueryProperty(target, handler) {
      if (target == null) {
        return;
      }
      let handleResult = await handler(target);
      if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
        return handleResult.data;
      }
      return await this.asyncQueryProperty(handleResult.data, handler);
    }
createUtils(option) {
      return new Utils(option);
    }
toFormData(data, isEncode = false, valueAutoParseToStr = false) {
      const formData = new FormData();
      Object.keys(data).forEach((key) => {
        let value = data[key];
        if (valueAutoParseToStr) {
          value = JSON.stringify(value);
        }
        if (typeof value === "number") {
          value = value.toString();
        }
        if (isEncode && typeof value === "string") {
          value = encodeURIComponent(value);
        }
        if (value instanceof File) {
          formData.append(key, value, value.name);
        } else {
          formData.append(key, value);
        }
      });
      return formData;
    }
toUrl(text) {
      if (typeof text !== "string") {
        throw new TypeError("toUrl: text must be string");
      }
      text = text.trim();
      if (text === "") {
        throw new TypeError("toUrl: text must not be empty");
      }
      if (text.startsWith("//")) {
        text = this.windowApi.globalThis.location.protocol + text;
      } else if (text.startsWith("/")) {
        text = this.windowApi.globalThis.location.origin + text;
      }
      return new URL(text);
    }
coverObjectFunctionThis = commonUtil.coverObjectFunctionThis.bind(commonUtil);
generateUUID = GenerateUUID;
Vue = Vue;
    ModuleRaid = ModuleRaid;
workerSetTimeout(callback, timeout = 0) {
      try {
        return setTimeout$1$1(callback, timeout);
      } catch (error) {
        return this.windowApi.setTimeout(callback, timeout);
      }
    }
workerClearTimeout(timeId) {
      try {
        if (timeId != null) {
          clearTimeout$1$1(timeId);
        }
      } catch (error) {
      } finally {
        this.windowApi.clearTimeout(timeId);
      }
    }
workerSetInterval(callback, timeout = 0) {
      try {
        return setInterval$2(callback, timeout);
      } catch (error) {
        return this.windowApi.setInterval(callback, timeout);
      }
    }
workerClearInterval(timeId) {
      try {
        if (timeId != null) {
          clearInterval$2(timeId);
        }
      } catch (error) {
      } finally {
        this.windowApi.clearInterval(timeId);
      }
    }
async getClipboardInfo() {
      return new Promise((resolve) => {
        function readClipboardText() {
          navigator.clipboard.readText().then((clipboardText) => {
            resolve({
              error: null,
              content: clipboardText
            });
          }).catch((error) => {
            resolve({
              error,
              content: ""
            });
          });
        }
        function requestPermissionsWithClipboard() {
          navigator.permissions.query({
            name: "clipboard-read"
          }).then((permissionStatus) => {
            readClipboardText();
          }).catch((error) => {
            readClipboardText();
          });
        }
        function checkClipboardApi() {
          if (typeof navigator?.clipboard?.readText !== "function") {
            return false;
          }
          if (typeof navigator?.permissions?.query !== "function") {
            return false;
          }
          return true;
        }
        if (!checkClipboardApi()) {
          resolve({
            error: new Error("当前环境不支持读取剪贴板Api"),
            content: ""
          });
          return;
        }
        if (document.hasFocus()) {
          requestPermissionsWithClipboard();
        } else {
          window.addEventListener("focus", () => {
            requestPermissionsWithClipboard();
          }, {
            once: true
          });
        }
      });
    }
  }
  let utils$1 = new Utils();
  const GlobalConfig = {
    config: {},
setGlobalConfig(config) {
      Reflect.ownKeys(config).forEach((keyName) => {
        Reflect.set(GlobalConfig.config, keyName, Reflect.get(config, keyName));
      });
    },
getGlobalConfig() {
      let result = {};
      Object.keys(GlobalConfig.config).forEach((keyName) => {
        let configValue = Reflect.get(GlobalConfig.config, keyName);
        if (keyName === "style") {
          let style = configValue == null ? "" : typeof configValue === "function" ? configValue() : configValue;
          if (typeof style === "string") {
            result.style = style;
          }
        } else if (keyName === "zIndex") {
          let zIndex = configValue == null ? "" : typeof configValue === "function" ? configValue() : configValue;
          if (typeof zIndex === "string") {
            let newIndex = zIndex = Number(zIndex);
            if (!isNaN(newIndex)) {
              result.zIndex = newIndex;
            }
          } else {
            if (!isNaN(zIndex)) {
              result.zIndex = zIndex;
            }
          }
        } else if (keyName === "mask") {
          let mask = GlobalConfig.config.mask == null ? {} : GlobalConfig.config.mask;
          if (typeof mask === "object" && mask != null) {
            result.mask = mask;
          }
        } else {
          Reflect.set(result, keyName, configValue);
        }
      });
      return result;
    }
  };
  var SVG_min = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M128 544h768a32 32 0 1 0 0-64H128a32 32 0 0 0 0 64z"></path>\r\n</svg>\r\n';
  var SVG_mise = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M885.333333 85.333333H330.410667a53.333333 53.333333 0 0 0-53.333334 53.333334v106.666666H138.666667A53.333333 53.333333 0 0 0 85.333333 298.666667v586.666666a53.333333 53.333333 0 0 0 53.333334 53.333334H725.333333a53.333333 53.333333 0 0 0 53.333334-53.333334V746.154667h106.666666c29.44 0 53.333333-23.893333 53.333334-53.333334V138.666667A53.333333 53.333333 0 0 0 885.333333 85.333333zM725.333333 692.821333v192.512H138.666667V298.666667H725.333333v394.154666z m157.866667 0H778.666667V298.666667a53.333333 53.333333 0 0 0-53.333334-53.333334H330.410667v-106.666666h554.922666l-2.133333 554.154666z"></path>\r\n</svg>\r\n';
  var SVG_max = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="m160 96.064 192 .192a32 32 0 0 1 0 64l-192-.192V352a32 32 0 0 1-64 0V96h64v.064zm0 831.872V928H96V672a32 32 0 1 1 64 0v191.936l192-.192a32 32 0 1 1 0 64l-192 .192zM864 96.064V96h64v256a32 32 0 1 1-64 0V160.064l-192 .192a32 32 0 1 1 0-64l192-.192zm0 831.872-192-.192a32 32 0 0 1 0-64l192 .192V672a32 32 0 1 1 64 0v256h-64v-.064z"></path>\r\n</svg>\r\n';
  var SVG_close = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="close">\r\n	<path\r\n		fill="currentColor"\r\n		d="M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"></path>\r\n</svg>\r\n';
  var SVG_edit = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M832 512a32 32 0 1 1 64 0v352a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h352a32 32 0 0 1 0 64H192v640h640V512z"></path>\r\n	<path\r\n		fill="currentColor"\r\n		d="m469.952 554.24 52.8-7.552L847.104 222.4a32 32 0 1 0-45.248-45.248L477.44 501.44l-7.552 52.8zm422.4-422.4a96 96 0 0 1 0 135.808l-331.84 331.84a32 32 0 0 1-18.112 9.088L436.8 623.68a32 32 0 0 1-36.224-36.224l15.104-105.6a32 32 0 0 1 9.024-18.112l331.904-331.84a96 96 0 0 1 135.744 0z"></path>\r\n</svg>\r\n';
  var SVG_share = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="m679.872 348.8-301.76 188.608a127.808 127.808 0 0 1 5.12 52.16l279.936 104.96a128 128 0 1 1-22.464 59.904l-279.872-104.96a128 128 0 1 1-16.64-166.272l301.696-188.608a128 128 0 1 1 33.92 54.272z"></path>\r\n</svg>\r\n';
  var SVG_delete = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32V256zm448-64v-64H416v64h192zM224 896h576V256H224v640zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32zm192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32z"></path>\r\n</svg>\r\n';
  var SVG_search = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704z"></path>\r\n</svg>\r\n';
  var SVG_upload = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64zm384-578.304V704h-64V247.296L237.248 490.048 192 444.8 508.8 128l316.8 316.8-45.312 45.248L544 253.696z"></path>\r\n</svg>\r\n';
  var SVG_loading = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"></path>\r\n</svg>\r\n';
  var SVG_next = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"></path>\r\n</svg>\r\n';
  var SVG_prev = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M609.408 149.376 277.76 489.6a32 32 0 0 0 0 44.672l331.648 340.352a29.12 29.12 0 0 0 41.728 0 30.592 30.592 0 0 0 0-42.752L339.264 511.936l311.872-319.872a30.592 30.592 0 0 0 0-42.688 29.12 29.12 0 0 0-41.728 0z"></path>\r\n</svg>\r\n';
  var SVG_eleme = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M300.032 188.8c174.72-113.28 408-63.36 522.24 109.44 5.76 10.56 11.52 20.16 17.28 30.72v.96a22.4 22.4 0 0 1-7.68 26.88l-352.32 228.48c-9.6 6.72-22.08 3.84-28.8-5.76l-18.24-27.84a54.336 54.336 0 0 1 16.32-74.88l225.6-146.88c9.6-6.72 12.48-19.2 5.76-28.8-.96-1.92-1.92-3.84-3.84-4.8a267.84 267.84 0 0 0-315.84-17.28c-123.84 81.6-159.36 247.68-78.72 371.52a268.096 268.096 0 0 0 370.56 78.72 54.336 54.336 0 0 1 74.88 16.32l17.28 26.88c5.76 9.6 3.84 21.12-4.8 27.84-8.64 7.68-18.24 14.4-28.8 21.12a377.92 377.92 0 0 1-522.24-110.4c-113.28-174.72-63.36-408 111.36-522.24zm526.08 305.28a22.336 22.336 0 0 1 28.8 5.76l23.04 35.52a63.232 63.232 0 0 1-18.24 87.36l-35.52 23.04c-9.6 6.72-22.08 3.84-28.8-5.76l-46.08-71.04c-6.72-9.6-3.84-22.08 5.76-28.8l71.04-46.08z"></path>\r\n</svg>\r\n';
  var SVG_elemePlus = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		d="M839.7 734.7c0 33.3-17.9 41-17.9 41S519.7 949.8 499.2 960c-10.2 5.1-20.5 5.1-30.7 0 0 0-314.9-184.3-325.1-192-5.1-5.1-10.2-12.8-12.8-20.5V368.6c0-17.9 20.5-28.2 20.5-28.2L466 158.6c12.8-5.1 25.6-5.1 38.4 0 0 0 279 161.3 309.8 179.2 17.9 7.7 28.2 25.6 25.6 46.1-.1-5-.1 317.5-.1 350.8zM714.2 371.2c-64-35.8-217.6-125.4-217.6-125.4-7.7-5.1-20.5-5.1-30.7 0L217.6 389.1s-17.9 10.2-17.9 23v297c0 5.1 5.1 12.8 7.7 17.9 7.7 5.1 256 148.5 256 148.5 7.7 5.1 17.9 5.1 25.6 0 15.4-7.7 250.9-145.9 250.9-145.9s12.8-5.1 12.8-30.7v-74.2l-276.5 169v-64c0-17.9 7.7-30.7 20.5-46.1L745 535c5.1-7.7 10.2-20.5 10.2-30.7v-66.6l-279 169v-69.1c0-15.4 5.1-30.7 17.9-38.4l220.1-128zM919 135.7c0-5.1-5.1-7.7-7.7-7.7h-58.9V66.6c0-5.1-5.1-5.1-10.2-5.1l-30.7 5.1c-5.1 0-5.1 2.6-5.1 5.1V128h-56.3c-5.1 0-5.1 5.1-7.7 5.1v38.4h69.1v64c0 5.1 5.1 5.1 10.2 5.1l30.7-5.1c5.1 0 5.1-2.6 5.1-5.1v-56.3h64l-2.5-38.4z"\r\n		fill="currentColor"></path>\r\n</svg>\r\n';
  var SVG_chromeFilled = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" xml:space="preserve" data-type="chromeFilled">\r\n	<path\r\n		d="M938.67 512.01c0-44.59-6.82-87.6-19.54-128H682.67a212.372 212.372 0 0 1 42.67 128c.06 38.71-10.45 76.7-30.42 109.87l-182.91 316.8c235.65-.01 426.66-191.02 426.66-426.67z"\r\n		fill="currentColor"></path>\r\n	<path\r\n		d="M576.79 401.63a127.92 127.92 0 0 0-63.56-17.6c-22.36-.22-44.39 5.43-63.89 16.38s-35.79 26.82-47.25 46.02a128.005 128.005 0 0 0-2.16 127.44l1.24 2.13a127.906 127.906 0 0 0 46.36 46.61 127.907 127.907 0 0 0 63.38 17.44c22.29.2 44.24-5.43 63.68-16.33a127.94 127.94 0 0 0 47.16-45.79v-.01l1.11-1.92a127.984 127.984 0 0 0 .29-127.46 127.957 127.957 0 0 0-46.36-46.91z"\r\n		fill="currentColor"></path>\r\n	<path\r\n		d="M394.45 333.96A213.336 213.336 0 0 1 512 298.67h369.58A426.503 426.503 0 0 0 512 85.34a425.598 425.598 0 0 0-171.74 35.98 425.644 425.644 0 0 0-142.62 102.22l118.14 204.63a213.397 213.397 0 0 1 78.67-94.21zM512.01 938.68H512zM414.76 701.95a213.284 213.284 0 0 1-89.54-86.81L142.48 298.6c-36.35 62.81-57.13 135.68-57.13 213.42 0 203.81 142.93 374.22 333.95 416.55h.04l118.19-204.71a213.315 213.315 0 0 1-122.77-21.91z"\r\n		fill="currentColor"></path>\r\n</svg>\r\n';
  var SVG_cpu = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M320 256a64 64 0 0 0-64 64v384a64 64 0 0 0 64 64h384a64 64 0 0 0 64-64V320a64 64 0 0 0-64-64H320zm0-64h384a128 128 0 0 1 128 128v384a128 128 0 0 1-128 128H320a128 128 0 0 1-128-128V320a128 128 0 0 1 128-128z"></path>\r\n	<path\r\n		fill="currentColor"\r\n		d="M512 64a32 32 0 0 1 32 32v128h-64V96a32 32 0 0 1 32-32zm160 0a32 32 0 0 1 32 32v128h-64V96a32 32 0 0 1 32-32zm-320 0a32 32 0 0 1 32 32v128h-64V96a32 32 0 0 1 32-32zm160 896a32 32 0 0 1-32-32V800h64v128a32 32 0 0 1-32 32zm160 0a32 32 0 0 1-32-32V800h64v128a32 32 0 0 1-32 32zm-320 0a32 32 0 0 1-32-32V800h64v128a32 32 0 0 1-32 32zM64 512a32 32 0 0 1 32-32h128v64H96a32 32 0 0 1-32-32zm0-160a32 32 0 0 1 32-32h128v64H96a32 32 0 0 1-32-32zm0 320a32 32 0 0 1 32-32h128v64H96a32 32 0 0 1-32-32zm896-160a32 32 0 0 1-32 32H800v-64h128a32 32 0 0 1 32 32zm0-160a32 32 0 0 1-32 32H800v-64h128a32 32 0 0 1 32 32zm0 320a32 32 0 0 1-32 32H800v-64h128a32 32 0 0 1 32 32z"></path>\r\n</svg>\r\n';
  var SVG_videoPlay = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm0 832a384 384 0 0 0 0-768 384 384 0 0 0 0 768zm-48-247.616L668.608 512 464 375.616v272.768zm10.624-342.656 249.472 166.336a48 48 0 0 1 0 79.872L474.624 718.272A48 48 0 0 1 400 678.336V345.6a48 48 0 0 1 74.624-39.936z"></path>\r\n</svg>\r\n';
  var SVG_videoPause = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm0 832a384 384 0 0 0 0-768 384 384 0 0 0 0 768zm-96-544q32 0 32 32v256q0 32-32 32t-32-32V384q0-32 32-32zm192 0q32 0 32 32v256q0 32-32 32t-32-32V384q0-32 32-32z"></path>\r\n</svg>\r\n';
  var SVG_headset = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M896 529.152V512a384 384 0 1 0-768 0v17.152A128 128 0 0 1 320 640v128a128 128 0 1 1-256 0V512a448 448 0 1 1 896 0v256a128 128 0 1 1-256 0V640a128 128 0 0 1 192-110.848zM896 640a64 64 0 0 0-128 0v128a64 64 0 0 0 128 0V640zm-768 0v128a64 64 0 0 0 128 0V640a64 64 0 1 0-128 0z"></path>\r\n</svg>\r\n';
  var SVG_monitor = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M544 768v128h192a32 32 0 1 1 0 64H288a32 32 0 1 1 0-64h192V768H192A128 128 0 0 1 64 640V256a128 128 0 0 1 128-128h640a128 128 0 0 1 128 128v384a128 128 0 0 1-128 128H544zM192 192a64 64 0 0 0-64 64v384a64 64 0 0 0 64 64h640a64 64 0 0 0 64-64V256a64 64 0 0 0-64-64H192z"></path>\r\n</svg>\r\n';
  var SVG_documentCopy = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M128 320v576h576V320H128zm-32-64h640a32 32 0 0 1 32 32v640a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V288a32 32 0 0 1 32-32zM960 96v704a32 32 0 0 1-32 32h-96v-64h64V128H384v64h-64V96a32 32 0 0 1 32-32h576a32 32 0 0 1 32 32zM256 672h320v64H256v-64zm0-192h320v64H256v-64z"></path>\r\n</svg>\r\n';
  var SVG_picture = '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		fill="currentColor"\r\n		d="M160 160v704h704V160H160zm-32-64h768a32 32 0 0 1 32 32v768a32 32 0 0 1-32 32H128a32 32 0 0 1-32-32V128a32 32 0 0 1 32-32z"></path>\r\n	<path\r\n		fill="currentColor"\r\n		d="M384 288q64 0 64 64t-64 64q-64 0-64-64t64-64zM185.408 876.992l-50.816-38.912L350.72 556.032a96 96 0 0 1 134.592-17.856l1.856 1.472 122.88 99.136a32 32 0 0 0 44.992-4.864l216-269.888 49.92 39.936-215.808 269.824-.256.32a96 96 0 0 1-135.04 14.464l-122.88-99.072-.64-.512a32 32 0 0 0-44.8 5.952L185.408 876.992z"></path>\r\n</svg>\r\n';
  var SVG_circleClose = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" data-type="circleClose">\r\n	<path\r\n		fill="currentColor"\r\n		d="m466.752 512-90.496-90.496a32 32 0 0 1 45.248-45.248L512 466.752l90.496-90.496a32 32 0 1 1 45.248 45.248L557.248 512l90.496 90.496a32 32 0 1 1-45.248 45.248L512 557.248l-90.496 90.496a32 32 0 0 1-45.248-45.248z"></path>\r\n	<path\r\n		fill="currentColor"\r\n		d="M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"></path>\r\n</svg>\r\n';
  var SVG_view = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">\r\n	<path\r\n		fill="currentColor"\r\n		d="M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352m0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288zm0 64a224 224 0 1 1 0 448 224 224 0 0 1 0-448m0 64a160.192 160.192 0 0 0-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160"></path>\r\n</svg>\r\n';
  var SVG_hide = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">\r\n	<path\r\n		fill="currentColor"\r\n		d="M876.8 156.8c0-9.6-3.2-16-9.6-22.4-6.4-6.4-12.8-9.6-22.4-9.6-9.6 0-16 3.2-22.4 9.6L736 220.8c-64-32-137.6-51.2-224-60.8-160 16-288 73.6-377.6 176C44.8 438.4 0 496 0 512s48 73.6 134.4 176c22.4 25.6 44.8 48 73.6 67.2l-86.4 89.6c-6.4 6.4-9.6 12.8-9.6 22.4 0 9.6 3.2 16 9.6 22.4 6.4 6.4 12.8 9.6 22.4 9.6 9.6 0 16-3.2 22.4-9.6l704-710.4c3.2-6.4 6.4-12.8 6.4-22.4Zm-646.4 528c-76.8-70.4-128-128-153.6-172.8 28.8-48 80-105.6 153.6-172.8C304 272 400 230.4 512 224c64 3.2 124.8 19.2 176 44.8l-54.4 54.4C598.4 300.8 560 288 512 288c-64 0-115.2 22.4-160 64s-64 96-64 160c0 48 12.8 89.6 35.2 124.8L256 707.2c-9.6-6.4-19.2-16-25.6-22.4Zm140.8-96c-12.8-22.4-19.2-48-19.2-76.8 0-44.8 16-83.2 48-112 32-28.8 67.2-48 112-48 28.8 0 54.4 6.4 73.6 19.2zM889.599 336c-12.8-16-28.8-28.8-41.6-41.6l-48 48c73.6 67.2 124.8 124.8 150.4 169.6-28.8 48-80 105.6-153.6 172.8-73.6 67.2-172.8 108.8-284.8 115.2-51.2-3.2-99.2-12.8-140.8-28.8l-48 48c57.6 22.4 118.4 38.4 188.8 44.8 160-16 288-73.6 377.6-176C979.199 585.6 1024 528 1024 512s-48.001-73.6-134.401-176Z"></path>\r\n	<path\r\n		fill="currentColor"\r\n		d="M511.998 672c-12.8 0-25.6-3.2-38.4-6.4l-51.2 51.2c28.8 12.8 57.6 19.2 89.6 19.2 64 0 115.2-22.4 160-64 41.6-41.6 64-96 64-160 0-32-6.4-64-19.2-89.6l-51.2 51.2c3.2 12.8 6.4 25.6 6.4 38.4 0 44.8-16 83.2-48 112-32 28.8-67.2 48-112 48Z"></path>\r\n</svg>\r\n';
  var SVG_keyboard = '<svg viewBox="0 0 1123 1024" xmlns="http://www.w3.org/2000/svg">\r\n	<path\r\n		d="M1014.122186 1024H109.753483A109.753483 109.753483 0 0 1 0 914.246517V392.917471a109.753483 109.753483 0 0 1 109.753483-109.753484h904.368703a109.753483 109.753483 0 0 1 109.753484 109.753484v521.329046a109.753483 109.753483 0 0 1-109.753484 109.753483zM109.753483 370.966774a21.950697 21.950697 0 0 0-21.950696 21.950697v521.329046a21.950697 21.950697 0 0 0 21.950696 21.950696h904.368703a21.950697 21.950697 0 0 0 21.950697-21.950696V392.917471a21.950697 21.950697 0 0 0-21.950697-21.950697z"></path>\r\n	<path\r\n		d="M687.056806 891.198285H307.309753a43.901393 43.901393 0 0 1 0-87.802787h379.747053a43.901393 43.901393 0 0 1 0 87.802787zM175.605573 803.395498a43.901393 43.901393 0 1 0 43.901394 43.901394 43.901393 43.901393 0 0 0-43.901394-43.901394zM432.428725 414.868167a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM561.937835 414.868167a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM690.349411 414.868167a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM818.760986 414.868167a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM947.172562 414.868167a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM175.605573 546.572347a43.901393 43.901393 0 1 0 43.901394 43.901394 43.901393 43.901393 0 0 0-43.901394-43.901394zM304.017149 546.572347a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM432.428725 546.572347a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM561.937835 546.572347a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM690.349411 546.572347a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM818.760986 546.572347a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM818.760986 803.395498a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM175.605573 678.276527a43.901393 43.901393 0 1 0 43.901394 43.901394 43.901393 43.901393 0 0 0-43.901394-43.901394zM304.017149 678.276527a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM432.428725 678.276527a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM561.937835 678.276527a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM948.270096 803.395498a43.901393 43.901393 0 1 0 43.901394 43.901394 43.901393 43.901393 0 0 0-43.901394-43.901394z"></path>\r\n	<path\r\n		d="M881.320472 766.079314H689.251876a43.901393 43.901393 0 0 1 0-87.802787h192.068596a21.950697 21.950697 0 0 0 21.950696-21.950696v-65.85209a43.901393 43.901393 0 0 1 87.802787 0v65.85209a109.753483 109.753483 0 0 1-109.753483 109.753483zM305.114684 502.670954H175.605573a43.901393 43.901393 0 0 1 0-87.802787h129.509111a43.901393 43.901393 0 0 1 0 87.802787zM563.03537 365.4791a43.901393 43.901393 0 0 1-43.901394-43.901394v-105.363344A109.753483 109.753483 0 0 1 628.88746 106.460879h61.461951a21.950697 21.950697 0 0 0 21.950696-21.950697V43.901393a43.901393 43.901393 0 0 1 87.802787 0v40.608789a109.753483 109.753483 0 0 1-109.753483 109.753484h-61.461951a21.950697 21.950697 0 0 0-21.950697 21.950696v105.363344a43.901393 43.901393 0 0 1-43.901393 43.901394z"></path>\r\n</svg>\r\n';
  var SVG_arrowRight = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" data-type="arrowRight">\r\n	<path\r\n		d="M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"></path>\r\n</svg>\r\n';
  var SVG_arrowLeft = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" data-type="arrowLeft">\r\n	<path\r\n		d="M609.408 149.376 277.76 489.6a32 32 0 0 0 0 44.672l331.648 340.352a29.12 29.12 0 0 0 41.728 0 30.592 30.592 0 0 0 0-42.752L339.264 511.936l311.872-319.872a30.592 30.592 0 0 0 0-42.688 29.12 29.12 0 0 0-41.728 0z"></path>\r\n</svg>\r\n';
  const PopsIconData = {
    min: SVG_min,
    mise: SVG_mise,
    max: SVG_max,
    close: SVG_close,
    edit: SVG_edit,
    share: SVG_share,
    delete: SVG_delete,
    search: SVG_search,
    upload: SVG_upload,
    loading: SVG_loading,
    next: SVG_next,
    prev: SVG_prev,
    eleme: SVG_eleme,
    elemePlus: SVG_elemePlus,
    chromeFilled: SVG_chromeFilled,
    cpu: SVG_cpu,
    videoPlay: SVG_videoPlay,
    videoPause: SVG_videoPause,
    headset: SVG_headset,
    monitor: SVG_monitor,
    documentCopy: SVG_documentCopy,
    picture: SVG_picture,
    circleClose: SVG_circleClose,
    view: SVG_view,
    hide: SVG_hide,
    keyboard: SVG_keyboard,
    arrowRight: SVG_arrowRight,
    arrowLeft: SVG_arrowLeft
  };
  const PopsIcon = {
    $data: PopsIconData,
hasIcon(iconName) {
      return Object.keys(PopsIcon.$data).includes(iconName);
    },
getIcon(iconName) {
      return PopsIcon.$data[iconName];
    },
deleteIcon(iconName) {
      return Reflect.deleteProperty(PopsIcon.$data, iconName);
    },
setIcon(iconName, iconHTML) {
      Reflect.set(PopsIcon.$data, iconName, iconHTML);
    }
  };
  const SymbolEvents = Symbol("events_" + ((1 + Math.random()) * 65536 | 0).toString(16).substring(1));
  const PopsCoreDefaultEnv = {
    document,
    window,
    globalThis,
    self,
    setTimeout: globalThis.setTimeout.bind(globalThis),
    setInterval: globalThis.setInterval.bind(globalThis),
    clearTimeout: globalThis.clearTimeout.bind(globalThis),
    clearInterval: globalThis.clearInterval.bind(globalThis)
  };
  const PopsCoreEnv = Object.assign({}, PopsCoreDefaultEnv);
  const PopsCore = {
    init(option) {
      if (!option) {
        option = Object.assign({}, PopsCoreDefaultEnv);
      }
      Object.assign(PopsCoreEnv, option);
    },
    get document() {
      return PopsCoreEnv.document;
    },
    get window() {
      return PopsCoreEnv.window;
    },
    get globalThis() {
      return PopsCoreEnv.globalThis;
    },
    get self() {
      return PopsCoreEnv.self;
    },
    get setTimeout() {
      return PopsCoreEnv.setTimeout;
    },
    get setInterval() {
      return PopsCoreEnv.setInterval;
    },
    get clearTimeout() {
      return PopsCoreEnv.clearTimeout;
    },
    get clearInterval() {
      return PopsCoreEnv.clearInterval;
    }
  };
  const OriginPrototype = {
    Object: {
      defineProperty: Object.defineProperty
    }
  };
  const createCache = (lastNumberWeakMap) => {
    return (collection, nextNumber) => {
      lastNumberWeakMap.set(collection, nextNumber);
      return nextNumber;
    };
  };
  const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER === void 0 ? 9007199254740991 : Number.MAX_SAFE_INTEGER;
  const TWO_TO_THE_POWER_OF_TWENTY_NINE = 536870912;
  const TWO_TO_THE_POWER_OF_THIRTY = TWO_TO_THE_POWER_OF_TWENTY_NINE * 2;
  const createGenerateUniqueNumber = (cache2, lastNumberWeakMap) => {
    return (collection) => {
      const lastNumber = lastNumberWeakMap.get(collection);
      let nextNumber = lastNumber === void 0 ? collection.size : lastNumber < TWO_TO_THE_POWER_OF_THIRTY ? lastNumber + 1 : 0;
      if (!collection.has(nextNumber)) {
        return cache2(collection, nextNumber);
      }
      if (collection.size < TWO_TO_THE_POWER_OF_TWENTY_NINE) {
        while (collection.has(nextNumber)) {
          nextNumber = Math.floor(Math.random() * TWO_TO_THE_POWER_OF_THIRTY);
        }
        return cache2(collection, nextNumber);
      }
      if (collection.size > MAX_SAFE_INTEGER) {
        throw new Error("Congratulations, you created a collection of unique numbers which uses all available integers!");
      }
      while (collection.has(nextNumber)) {
        nextNumber = Math.floor(Math.random() * MAX_SAFE_INTEGER);
      }
      return cache2(collection, nextNumber);
    };
  };
  const LAST_NUMBER_WEAK_MAP = new WeakMap();
  const cache = createCache(LAST_NUMBER_WEAK_MAP);
  const generateUniqueNumber = createGenerateUniqueNumber(cache, LAST_NUMBER_WEAK_MAP);
  const isMessagePort = (sender) => {
    return typeof sender.start === "function";
  };
  const PORT_MAP = new WeakMap();
  const extendBrokerImplementation = (partialBrokerImplementation) => ({
    ...partialBrokerImplementation,
    connect: ({ call }) => {
      return async () => {
        const { port1, port2 } = new MessageChannel();
        const portId = await call("connect", { port: port1 }, [port1]);
        PORT_MAP.set(port2, portId);
        return port2;
      };
    },
    disconnect: ({ call }) => {
      return async (port) => {
        const portId = PORT_MAP.get(port);
        if (portId === void 0) {
          throw new Error("The given port is not connected.");
        }
        await call("disconnect", { portId });
      };
    },
    isSupported: ({ call }) => {
      return () => call("isSupported");
    }
  });
  const ONGOING_REQUESTS = new WeakMap();
  const createOrGetOngoingRequests = (sender) => {
    if (ONGOING_REQUESTS.has(sender)) {
      return ONGOING_REQUESTS.get(sender);
    }
    const ongoingRequests = new Map();
    ONGOING_REQUESTS.set(sender, ongoingRequests);
    return ongoingRequests;
  };
  const createBroker = (brokerImplementation) => {
    const fullBrokerImplementation = extendBrokerImplementation(brokerImplementation);
    return (sender) => {
      const ongoingRequests = createOrGetOngoingRequests(sender);
      sender.addEventListener("message", (({ data: message }) => {
        const { id } = message;
        if (id !== null && ongoingRequests.has(id)) {
          const { reject, resolve } = ongoingRequests.get(id);
          ongoingRequests.delete(id);
          if (message.error === void 0) {
            resolve(message.result);
          } else {
            reject(new Error(message.error.message));
          }
        }
      }));
      if (isMessagePort(sender)) {
        sender.start();
      }
      const call = (method, params = null, transferables = []) => {
        return new Promise((resolve, reject) => {
          const id = generateUniqueNumber(ongoingRequests);
          ongoingRequests.set(id, { reject, resolve });
          if (params === null) {
            sender.postMessage({ id, method }, transferables);
          } else {
            sender.postMessage({ id, method, params }, transferables);
          }
        });
      };
      const notify = (method, params, transferables = []) => {
        sender.postMessage({ id: null, method, params }, transferables);
      };
      let functions = {};
      for (const [key, handler] of Object.entries(fullBrokerImplementation)) {
        functions = { ...functions, [key]: handler({ call, notify }) };
      }
      return { ...functions };
    };
  };
  const scheduledIntervalsState = new Map([[0, null]]);
  const scheduledTimeoutsState = new Map([[0, null]]);
  const wrap = createBroker({
    clearInterval: ({ call }) => {
      return (timerId) => {
        if (typeof scheduledIntervalsState.get(timerId) === "symbol") {
          scheduledIntervalsState.set(timerId, null);
          call("clear", { timerId, timerType: "interval" }).then(() => {
            scheduledIntervalsState.delete(timerId);
          });
        }
      };
    },
    clearTimeout: ({ call }) => {
      return (timerId) => {
        if (typeof scheduledTimeoutsState.get(timerId) === "symbol") {
          scheduledTimeoutsState.set(timerId, null);
          call("clear", { timerId, timerType: "timeout" }).then(() => {
            scheduledTimeoutsState.delete(timerId);
          });
        }
      };
    },
    setInterval: ({ call }) => {
      return (func, delay = 0, ...args) => {
        const symbol = Symbol();
        const timerId = generateUniqueNumber(scheduledIntervalsState);
        scheduledIntervalsState.set(timerId, symbol);
        const schedule = () => call("set", {
          delay,
          now: performance.timeOrigin + performance.now(),
          timerId,
          timerType: "interval"
        }).then(() => {
          const state = scheduledIntervalsState.get(timerId);
          if (state === void 0) {
            throw new Error("The timer is in an undefined state.");
          }
          if (state === symbol) {
            func(...args);
            if (scheduledIntervalsState.get(timerId) === symbol) {
              schedule();
            }
          }
        });
        schedule();
        return timerId;
      };
    },
    setTimeout: ({ call }) => {
      return (func, delay = 0, ...args) => {
        const symbol = Symbol();
        const timerId = generateUniqueNumber(scheduledTimeoutsState);
        scheduledTimeoutsState.set(timerId, symbol);
        call("set", {
          delay,
          now: performance.timeOrigin + performance.now(),
          timerId,
          timerType: "timeout"
        }).then(() => {
          const state = scheduledTimeoutsState.get(timerId);
          if (state === void 0) {
            throw new Error("The timer is in an undefined state.");
          }
          if (state === symbol) {
            scheduledTimeoutsState.delete(timerId);
            func(...args);
          }
        });
        return timerId;
      };
    }
  });
  const load = (url) => {
    const worker2 = new Worker(url);
    return wrap(worker2);
  };
  const createLoadOrReturnBroker = (loadBroker, worker2) => {
    let broker = null;
    return () => {
      if (broker !== null) {
        return broker;
      }
      const blob = new Blob([worker2], { type: "application/javascript; charset=utf-8" });
      const url = URL.createObjectURL(blob);
      broker = loadBroker(url);
      setTimeout(() => URL.revokeObjectURL(url));
      return broker;
    };
  };
  const worker = `(()=>{var e={455:function(e,t){!function(e){"use strict";var t=function(e){return function(t){var r=e(t);return t.add(r),r}},r=function(e){return function(t,r){return e.set(t,r),r}},n=void 0===Number.MAX_SAFE_INTEGER?9007199254740991:Number.MAX_SAFE_INTEGER,o=536870912,s=2*o,a=function(e,t){return function(r){var a=t.get(r),i=void 0===a?r.size:a<s?a+1:0;if(!r.has(i))return e(r,i);if(r.size<o){for(;r.has(i);)i=Math.floor(Math.random()*s);return e(r,i)}if(r.size>n)throw new Error("Congratulations, you created a collection of unique numbers which uses all available integers!");for(;r.has(i);)i=Math.floor(Math.random()*n);return e(r,i)}},i=new WeakMap,u=r(i),c=a(u,i),l=t(c);e.addUniqueNumber=l,e.generateUniqueNumber=c}(t)}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var s=t[n]={exports:{}};return e[n].call(s.exports,s,s.exports,r),s.exports}(()=>{"use strict";const e=-32603,t=-32602,n=-32601,o=(e,t)=>Object.assign(new Error(e),{status:t}),s=t=>o('The handler of the method called "'.concat(t,'" returned an unexpected result.'),e),a=(t,r)=>async({data:{id:a,method:i,params:u}})=>{const c=r[i];try{if(void 0===c)throw(e=>o('The requested method called "'.concat(e,'" is not supported.'),n))(i);const r=void 0===u?c():c(u);if(void 0===r)throw(t=>o('The handler of the method called "'.concat(t,'" returned no required result.'),e))(i);const l=r instanceof Promise?await r:r;if(null===a){if(void 0!==l.result)throw s(i)}else{if(void 0===l.result)throw s(i);const{result:e,transferables:r=[]}=l;t.postMessage({id:a,result:e},r)}}catch(e){const{message:r,status:n=-32603}=e;t.postMessage({error:{code:n,message:r},id:a})}};var i=r(455);const u=new Map,c=(e,r,n)=>({...r,connect:({port:t})=>{t.start();const n=e(t,r),o=(0,i.generateUniqueNumber)(u);return u.set(o,()=>{n(),t.close(),u.delete(o)}),{result:o}},disconnect:({portId:e})=>{const r=u.get(e);if(void 0===r)throw(e=>o('The specified parameter called "portId" with the given value "'.concat(e,'" does not identify a port connected to this worker.'),t))(e);return r(),{result:null}},isSupported:async()=>{if(await new Promise(e=>{const t=new ArrayBuffer(0),{port1:r,port2:n}=new MessageChannel;r.onmessage=({data:t})=>e(null!==t),n.postMessage(t,[t])})){const e=n();return{result:e instanceof Promise?await e:e}}return{result:!1}}}),l=(e,t,r=()=>!0)=>{const n=c(l,t,r),o=a(e,n);return e.addEventListener("message",o),()=>e.removeEventListener("message",o)},d=(e,t)=>r=>{const n=t.get(r);if(void 0===n)return Promise.resolve(!1);const[o,s]=n;return e(o),t.delete(r),s(!1),Promise.resolve(!0)},f=(e,t,r,n)=>(o,s,a)=>{const i=o+s-t.timeOrigin,u=i-t.now();return new Promise(t=>{e.set(a,[r(n,u,i,e,t,a),t])})},m=new Map,h=d(globalThis.clearTimeout,m),p=new Map,v=d(globalThis.clearTimeout,p),w=((e,t)=>{const r=(n,o,s,a)=>{const i=n-e.now();i>0?o.set(a,[t(r,i,n,o,s,a),s]):(o.delete(a),s(!0))};return r})(performance,globalThis.setTimeout),g=f(m,performance,globalThis.setTimeout,w),T=f(p,performance,globalThis.setTimeout,w);l(self,{clear:async({timerId:e,timerType:t})=>({result:await("interval"===t?h(e):v(e))}),set:async({delay:e,now:t,timerId:r,timerType:n})=>({result:await("interval"===n?g:T)(e,t,r)})})})()})();`;
  const loadOrReturnBroker = createLoadOrReturnBroker(load, worker);
  const clearInterval$1 = (timerId) => loadOrReturnBroker().clearInterval(timerId);
  const clearTimeout$1 = (timerId) => loadOrReturnBroker().clearTimeout(timerId);
  const setInterval$1 = (...args) => loadOrReturnBroker().setInterval(...args);
  const setTimeout$1 = (...args) => loadOrReturnBroker().setTimeout(...args);
  let t$1 = class t {
    constructor() {
      this.__map = {};
    }
    beforeEach(t3) {
      this.__interceptor = t3;
    }
    on(t3, i2) {
      const s2 = Array.isArray(t3) ? t3 : [t3];
      for (const t4 of s2) {
        this.__map[t4] = this.__map[t4] || [];
        const s3 = this.__map[t4];
        s3 && s3.push(i2);
      }
      return this;
    }
    emit(t3, i2, s2) {
      void 0 !== this.__interceptor ? this.__interceptor(t3, (() => {
        this.__emit(t3, i2), s2 && s2();
      })) : (this.__emit(t3, i2), s2 && s2());
    }
    __emit(t3, i2) {
      const s2 = this.__map[t3];
      if (Array.isArray(s2) && (null == s2 ? void 0 : s2.length)) for (const _ of s2) _(i2, t3);
      this.event = i2;
    }
    off(t3, i2) {
      const s2 = this.__map[t3];
      if (void 0 !== s2) if (void 0 === i2) delete this.__map[t3];
      else {
        const t4 = s2.findIndex(((t5) => t5 === i2));
        s2.splice(t4, 1);
      }
    }
    destroy() {
      this.__map = {};
    }
  };
  const n$1 = "clientX", e$2 = "clientY", t2 = 16, c$3 = "start", o$1 = "move", s$1 = "cancel", u$3 = "end", a$2 = "left", i$3 = "right", r$4 = "up", d$1 = "down", m$2 = { 4: "start", 5: "move", 1: "end", 3: "cancel" };
  function v$1(n2) {
    return m$2[n2];
  }
  function b(n2, e2, t3) {
    const c2 = { 1: { 0: { move: 4 }, 4: { move: 5, end: 1, cancel: 3 }, 5: { move: 5, end: 1, cancel: 3 } }, 0: { 4: { move: 2, end: 1, cancel: 3 }, 5: { start: 2, move: 2, end: 1, cancel: 3 } } }[Number(n2)][e2];
    return void 0 !== c2 && c2[t3] || 0;
  }
  function g$1(n2) {
    [1, 3, 2].includes(n2.state) && (n2.state = 0);
  }
  function h$3(n2) {
    return [5, 1, 3].includes(n2);
  }
  function j(n2) {
    if (n2.disabled) return n2.state = 0, true;
  }
  function O(n2, e2) {
    return Object.assign(Object.assign(Object.assign({}, n2), e2), { state: 0, disabled: false });
  }
  function p$3(n2) {
    return Math.round(100 * n2) / 100;
  }
  function r$3() {
    let t3, o2, i2, r2, a2 = 0;
    return function(u2) {
      if (t3 = o2, void 0 !== u2) {
        a2 = Number.MAX_SAFE_INTEGER > a2 ? ++a2 : 1;
        const h2 = (function(t4, o3) {
          const { phase: i3, points: r3, changedPoints: a3, nativeEvent: u3 } = t4, h3 = r3.length, p3 = c$3 === i3, g3 = u$3 === i3 && 0 === h3 || s$1 === i3, l3 = Date.now(), { x: d2, y: m2 } = c$2(r3) || c$2(a3), { currentTarget: v2 } = u3;
          return Object.assign(t4, { id: o3, x: d2, y: m2, timestamp: l3, isStart: p3, isEnd: g3, pointLength: h3, currentTarget: v2, getOffset(t5 = v2) {
            const e2 = t5.getBoundingClientRect();
            return { x: d2 - Math.round(e2.left), y: m2 - Math.round(e2.top) };
          } });
        })(u2, a2);
        o2 = h2;
        const { isStart: p2, pointLength: g2 } = h2;
        return p2 && (i2 = h2, t3 = void 0, r2 = 1 < g2 ? h2 : void 0), Object.assign(Object.assign({}, h2), { prevInput: t3, startMultiInput: r2, startInput: i2 });
      }
    };
  }
  function c$2(t3) {
    const { length: e2 } = t3;
    if (0 < e2) {
      if (1 === e2) {
        const { clientX: e3, clientY: n3 } = t3[0];
        return { x: Math.round(e3), y: Math.round(n3) };
      }
      const n2 = t3.reduce(((t4, e3) => (t4.x += e3[n$1], t4.y += e3[e$2], t4)), { x: 0, y: 0 });
      return { x: Math.round(n2.x / e2), y: Math.round(n2.y / e2) };
    }
  }
  function a$1(t3, e2, n2, s2) {
    const o2 = {};
    for (const t4 in n2) ["target", "currentTarget", "type"].includes(t4) || (o2[t4] = n2[t4]);
    let i2;
    return document.createEvent ? (i2 = document.createEvent("HTMLEvents"), i2.initEvent(t3, null == s2 ? void 0 : s2.bubbles, null == s2 ? void 0 : s2.cancelable)) : i2 = new Event(t3, s2), Object.assign(i2, o2, { match: () => n2.targets && 0 < n2.targets.length && n2.targets.every(((t4) => i2.currentTarget.contains(t4))) }), e2.dispatchEvent(i2);
  }
  function u$2(t3, e2) {
    const { preventDefault: n2 } = e2;
    return s2 = n2, "[object Function]" === Object.prototype.toString.call(s2) ? n2(t3) : !!n2;
    var s2;
  }
  const h$2 = ["touchstart", "touchmove", "touchend", "touchcancel", "mousedown"], p$2 = ["mousemove", "mouseup"];
  const g = { domEvents: { bubbles: true, cancelable: true }, preventDefault: (t3) => {
    if (t3.target && "tagName" in t3.target) {
      const { tagName: e2 } = t3.target;
      return !/^(?:INPUT|TEXTAREA|BUTTON|SELECT)$/.test(e2);
    }
    return false;
  } };
  let l$1 = class l extends t$1 {
    constructor(t3, e2) {
      super(), this.v = "2.1.3", this.__computeFunctionList = [], this.__computeFunctionCreatorList = [], this.__pluginContexts = [], this.__isIgnoreMouse = false, this.el = t3, this.c = {}, this.__options = Object.assign(Object.assign({}, g), e2);
      const n2 = (function(t4) {
        const e3 = r$3();
        return function(n3) {
          const s3 = [], o2 = [];
          Array.from(n3.touches).forEach((({ clientX: e4, clientY: n4, target: i3 }) => {
            (null == t4 ? void 0 : t4.contains(i3)) && (s3.push(i3), o2.push({ clientX: e4, clientY: n4, target: i3 }));
          }));
          const i2 = Array.from(n3.changedTouches).map((({ clientX: t5, clientY: e4, target: n4 }) => ({ clientX: t5, clientY: e4, target: n4 })));
          return e3({ phase: n3.type.replace("touch", ""), changedPoints: i2, points: o2, nativeEvent: n3, target: n3.target, targets: s3 });
        };
      })(this.el), s2 = (function() {
        let t4, e3 = false, n3 = null;
        const s3 = r$3();
        return function(o2) {
          const { clientX: i2, clientY: r2, type: c2, button: a2, target: u2 } = o2;
          let h2, p2 = [{ clientX: i2, clientY: r2, target: u2 }];
          if ("mousedown" === c2 && 0 === a2) n3 = u2, e3 = true, h2 = "start";
          else {
            if (!e3) return;
            "mousemove" === c2 ? h2 = "move" : "mouseup" === c2 && (p2 = [], h2 = "end", e3 = false);
          }
          const g2 = t4 || [{ clientX: i2, clientY: r2, target: u2 }];
          if (t4 = [{ clientX: i2, clientY: r2, target: u2 }], void 0 !== h2) return s3({ phase: h2, changedPoints: g2, points: p2, target: n3, targets: [n3], nativeEvent: o2 });
        };
      })();
      if (this.__inputCreatorMap = { touchstart: n2, touchmove: n2, touchend: n2, touchcancel: n2, mousedown: s2, mousemove: s2, mouseup: s2 }, this.on("at:after", ((t4) => {
        const { target: e3, __type: n3 } = t4, { domEvents: s3 } = this.__options;
        s3 && void 0 !== this.el && e3 && (a$1(n3, e3, t4, s3), a$1("at:after", e3, t4, s3));
      })), void 0 !== t3) {
        t3.style.webkitTapHighlightColor = "rgba(0,0,0,0)";
        let e3 = false;
        try {
          const t4 = {};
          Object.defineProperty(t4, "passive", { get() {
            e3 = true;
          } }), window.addEventListener("_", (() => {
          }), t4);
        } catch (t4) {
        }
        this.on("u", (function(t4, e4, n3) {
          return h$2.forEach(((s3) => {
            t4.addEventListener(s3, e4, n3);
          })), p$2.forEach(((t5) => {
            window.addEventListener(t5, e4, n3);
          })), () => {
            h$2.forEach(((n4) => {
              t4.removeEventListener(n4, e4);
            })), p$2.forEach(((t5) => {
              window.removeEventListener(t5, e4);
            }));
          };
        })(t3, this.catchEvent.bind(this), false === this.__options.preventDefault && e3 ? { passive: true } : { passive: false }));
      }
    }
    use(t3, e2) {
      this.__pluginContexts.push(t3(this, e2));
    }
    catchEvent(t3) {
      const e2 = this.__inputCreatorMap[t3.type](t3);
      if (void 0 !== e2) {
        const n2 = () => t3.stopPropagation(), s2 = () => t3.stopImmediatePropagation(), o2 = () => t3.preventDefault();
        if (u$2(t3, this.__options)) o2();
        else if ("touchstart" === t3.type ? this.__isIgnoreMouse = true : "touchmove" === t3.type && (this.__isIgnoreMouse = false), this.__isIgnoreMouse && t3.type.startsWith("mouse")) return void ("mouseup" === t3.type && (this.__isIgnoreMouse = false));
        this.emit("input", e2), this.emit2(`at:${e2.phase}`, e2, {});
        const i2 = {};
        this.__computeFunctionList.forEach(((t4) => {
          const n3 = t4(e2, i2);
          if (void 0 !== n3) for (const t5 in n3) i2[t5] = n3[t5];
        })), this.emit("computed", Object.assign(Object.assign(Object.assign({}, e2), i2), { stopPropagation: n2, stopImmediatePropagation: s2, preventDefault: o2 }));
      }
    }
    compute(t3, e2) {
      for (const e3 of t3) this.__computeFunctionCreatorList.includes(e3) || (this.__computeFunctionCreatorList.push(e3), this.__computeFunctionList.push(e3()));
      this.on("computed", e2);
    }
    beforeEach(t3) {
      super.beforeEach(((e2, n2) => {
        var s2;
        (null === (s2 = this.c) || void 0 === s2 ? void 0 : s2.name) ? t3(e2, n2) : n2();
      }));
    }
    get(t3) {
      return this.__pluginContexts.find(((e2) => t3 === e2.name));
    }
    set(t3) {
      this.__options = Object.assign(Object.assign({}, this.__options), t3);
    }
    emit2(t3, e2, n2) {
      this.c = n2, this.emit(t3, Object.assign(Object.assign({}, e2), { type: t3 }), (() => {
        this.emit("at:after", Object.assign(Object.assign({}, e2), { name: t3, __type: t3 }));
      }));
    }
    destroy() {
      this.emit("u"), super.destroy();
    }
  };
  var x = (r2) => Math.sqrt(r2.x * r2.x + r2.y * r2.y), y = (r2, a2) => r2.x * a2.x + r2.y * a2.y, e$1 = (r2, a2) => {
    var t3 = x(r2) * x(a2);
    if (0 === t3) return 0;
    var h2 = y(r2, a2) / t3;
    return h2 > 1 && (h2 = 1), Math.acos(h2);
  }, n = (r2, a2) => r2.x * a2.y - a2.x * r2.y, o = (r2) => r2 / Math.PI * 180, s = (r2, a2) => {
    var t3 = e$1(r2, a2);
    return n(r2, a2) > 0 && (t3 *= -1), o(t3);
  }, u$1 = (x2, y2) => {
    if (0 !== x2 || 0 !== y2) return Math.abs(x2) >= Math.abs(y2) ? 0 < x2 ? i$3 : a$2 : 0 < y2 ? d$1 : r$4;
  };
  function p$1() {
    let n2 = 0, e2 = 0;
    return function(o2, r2) {
      const { prevVecotr: i2, startVecotr: a2, activeVecotr: c2 } = r2;
      return c2 && (e2 = Math.round(s(c2, i2)), n2 = Math.round(s(c2, a2))), { angle: n2, deltaAngle: e2 };
    };
  }
  function d() {
    return function(t3) {
      const { prevInput: e2 } = t3;
      let o$12 = 0, r2 = 0, i2 = 0;
      if (void 0 !== e2 && (o$12 = t3.x - e2.x, r2 = t3.y - e2.y, 0 !== o$12 || 0 !== r2)) {
        const t4 = Math.sqrt(Math.pow(o$12, 2) + Math.pow(r2, 2));
        i2 = Math.round(o(Math.acos(Math.abs(o$12) / t4)));
      }
      return { deltaX: o$12, deltaY: r2, deltaXYAngle: i2 };
    };
  }
  function h$1() {
    let t3, n2 = 0, u2 = 0, s2 = 0, p2 = 0, d2 = 0;
    return function(h2) {
      const { phase: l3, startInput: f2 } = h2;
      return c$3 === l3 ? (n2 = 0, u2 = 0, s2 = 0, p2 = 0, d2 = 0) : o$1 === l3 && (n2 = Math.round(h2.points[0][n$1] - f2.points[0][n$1]), u2 = Math.round(h2.points[0][e$2] - f2.points[0][e$2]), s2 = Math.abs(n2), p2 = Math.abs(u2), d2 = Math.round(x({ x: s2, y: p2 })), t3 = u$1(n2, u2)), { displacementX: n2, displacementY: u2, distanceX: s2, distanceY: p2, distance: d2, overallDirection: t3 };
    };
  }
  function l2() {
    let t3 = 1;
    return function(n2, o2) {
      let r2 = 1;
      const { prevVecotr: i2, startVecotr: a2, activeVecotr: c2 } = o2;
      return c2 && (r2 = p$3(x(c2) / x(i2)), t3 = p$3(x(c2) / x(a2))), { scale: t3, deltaScale: r2 };
    };
  }
  function f() {
    let t$12, n2, e2 = 0, r2 = 0, i2 = 0, a2 = 0;
    return function(c2) {
      if (void 0 !== c2) {
        n2 = n2 || c2.startInput;
        const u2 = c2.timestamp - n2.timestamp;
        if (t2 < u2) {
          const s2 = c2.x - n2.x, p2 = c2.y - n2.y;
          i2 = Math.round(s2 / u2 * 100) / 100, a2 = Math.round(p2 / u2 * 100) / 100, e2 = Math.abs(i2), r2 = Math.abs(a2), t$12 = u$1(s2, p2), n2 = c2;
        }
      }
      return { velocityX: e2, velocityY: r2, speedX: i2, speedY: a2, direction: t$12 };
    };
  }
  function M() {
    let t3 = 0;
    return function(n2) {
      const { phase: e2 } = n2;
      return c$3 === e2 && (t3 = n2.pointLength), { maxPointLength: t3 };
    };
  }
  function v(t3) {
    return { x: t3.points[1][n$1] - t3.points[0][n$1], y: t3.points[1][e$2] - t3.points[0][e$2] };
  }
  function m$1() {
    let t3, n2, e2;
    return function(o2) {
      const { prevInput: r2, startMultiInput: i2 } = o2;
      return void 0 !== i2 && void 0 !== r2 && o2.id !== i2.id && 1 < r2.pointLength && 1 < o2.pointLength ? (t3 = v(i2), n2 = v(r2), e2 = v(o2)) : e2 = void 0, { startVecotr: t3, prevVecotr: n2, activeVecotr: e2 };
    };
  }
  const m = { name: "tap", pointLength: 1, tapTimes: 1, waitNextTapTime: 300, maxDistance: 2, maxDistanceFromPrevTap: 9, maxPressTime: 250 };
  function r$2(r2, s2) {
    const c2 = O(m, s2);
    let p2, u2, x$1, T = 0;
    function f2() {
      T = 0, p2 = void 0, u2 = void 0;
    }
    return r2.compute([h$1, M], ((t3) => {
      if (j(c2)) return;
      const { phase: i2, x: o2, y: m2 } = t3;
      u$3 === i2 && (c2.state = 0, !(function() {
        const { startInput: e2, pointLength: n2, timestamp: a2 } = t3, i3 = a2 - e2.timestamp, { distance: o3, maxPointLength: m3 } = t3;
        return m3 === c2.pointLength && 0 === n2 && c2.maxDistance >= o3 && c2.maxPressTime > i3;
      })() ? (f2(), c2.state = 2) : (clearTimeout(x$1), (function(t4, e2) {
        if (void 0 !== p2) {
          const n2 = x({ x: t4.x - p2.x, y: t4.y - p2.y });
          return p2 = t4, e2.maxDistanceFromPrevTap >= n2;
        }
        return p2 = t4, true;
      })({ x: o2, y: m2 }, c2) && (function(t4) {
        const e2 = performance.now();
        if (void 0 === u2) return u2 = e2, true;
        {
          const n2 = e2 - u2;
          return u2 = e2, n2 < t4;
        }
      })(c2.waitNextTapTime) ? T++ : T = 1, 0 == T % c2.tapTimes ? (c2.state = 1, r2.emit2(c2.name, t3, c2), f2()) : x$1 = setTimeout((() => {
        c2.state = 2, f2();
      }), c2.waitNextTapTime)));
    })), c2;
  }
  const p = { name: "pan", threshold: 10, pointLength: 1 };
  function u(u2, d$12) {
    const f$1 = O(p, d$12);
    return u2.compute([f, h$1, d], ((t3) => {
      if (g$1(f$1), j(f$1)) return;
      const c2 = (function() {
        const { pointLength: e2, distance: n2 } = t3;
        return f$1.pointLength === e2 && f$1.threshold <= n2;
      })();
      if (f$1.state = b(c2, f$1.state, t3.phase), c2 || h$3(f$1.state)) {
        const { name: e2 } = f$1;
        u2.emit2(e2, t3, f$1), u2.emit2(e2 + v$1(f$1.state), t3, f$1), ![u$3, s$1].includes(t3.phase) && t3.direction && u2.emit2(e2 + t3.direction, t3, f$1);
      }
    })), f$1;
  }
  const c$1 = { name: "swipe", threshold: 10, velocity: 0.3, pointLength: 1 };
  function a(a2, r2) {
    const s2 = O(c$1, r2);
    return a2.compute([h$1, f, M], ((t3) => {
      if (s2.state = 0, !s2.disabled && (function() {
        if (u$3 !== t3.phase) return false;
        const { velocityX: o2, velocityY: n2, distance: i2, maxPointLength: c2 } = t3;
        return c2 === s2.pointLength && 0 === t3.points.length && s2.threshold < i2 && s2.velocity < Math.max(o2, n2);
      })()) {
        const { name: e2 } = s2;
        s2.state = 1, a2.emit2(e2, t3, s2), a2.emit2(e2 + t3.direction, t3, s2);
      }
    })), s2;
  }
  const r$1 = { name: "press", pointLength: 1, maxDistance: 9, minPressTime: 251 };
  function c(c2, u2) {
    const p2 = O(r$1, u2);
    let f2 = 0;
    return c2.compute([h$1], ((t3) => {
      if (j(p2)) return;
      const { phase: o2, startInput: r2, pointLength: u3 } = t3;
      if (c$3 === o2 && p2.pointLength === u3) g$1(p2), clearTimeout(f2), f2 = setTimeout((() => {
        p2.state = 1, c2.emit2(p2.name, t3, p2);
      }), p2.minPressTime);
      else if (u$3 === o2 && 1 === p2.state) c2.emit2(`${p2.name}${r$4}`, t3, p2);
      else if (1 !== p2.state) {
        const e2 = t3.timestamp - r2.timestamp;
        (!(function() {
          const { distance: e3 } = t3;
          return e3 && p2.maxDistance > e3;
        })() || p2.minPressTime > e2 && [u$3, s$1].includes(o2)) && (clearTimeout(f2), p2.state = 2);
      }
    })), p2;
  }
  const i$2 = { name: "pinch", threshold: 0, pointLength: 2 };
  function r(r2, m2) {
    const p2 = O(i$2, m2);
    return r2.compute([m$1, l2], ((t3) => {
      if (g$1(p2), j(p2)) return;
      const c2 = (function() {
        const { pointLength: e2, scale: n2, deltaScale: o2, phase: a2 } = t3;
        return p2.pointLength === e2 && p2.threshold < Math.abs(n2 - 1);
      })();
      p2.state = b(c2, p2.state, t3.phase);
      const { name: h2 } = p2;
      if (c2 || h$3(p2.state)) {
        r2.emit2(h2, t3, p2);
        const { deltaScale: e2 } = t3;
        1 !== e2 && r2.emit2(h2 + (1 < e2 ? "in" : "out"), t3, p2);
      }
      const i2 = v$1(p2.state);
      i2 && r2.emit2(h2 + i2, t3, p2);
    })), p2;
  }
  const h = { name: "rotate", threshold: 0, pointLength: 2 };
  function i$1(i2, m2) {
    const u2 = O(h, m2);
    return i2.compute([m$1, p$1], ((t3) => {
      if (j(u2)) return;
      g$1(u2);
      const r2 = (function() {
        const { pointLength: e2, angle: n2 } = t3;
        return u2.pointLength === e2 && u2.threshold < Math.abs(n2);
      })();
      u2.state = b(r2, u2.state, t3.phase);
      const { name: c2 } = u2;
      (r2 || h$3(u2.state)) && i2.emit2(c2, t3, u2);
      const h2 = v$1(u2.state);
      h2 && i2.emit2(c2 + h2, t3, u2);
    })), u2;
  }
  function e(e2) {
    e2.use(r$2, { name: "doubletap", tapTimes: 2 });
    const a2 = e2.get("doubletap");
    let o2;
    return e2.beforeEach(((t3, e3) => {
      "tap" === t3 ? (clearTimeout(o2), o2 = setTimeout((() => {
        [0, 2].includes(a2.state) && e3();
      }), 300)) : e3();
    })), a2;
  }
  class i extends l$1 {
    constructor(t3, u$12) {
      super(t3, u$12), this.use(r$2), this.use(u), this.use(a), this.use(c), this.use(r), this.use(i$1);
    }
  }
  i.STATE_POSSIBLE = 0, i.STATE_START = 4, i.STATE_MOVE = 5, i.STATE_END = 1, i.STATE_CANCELLED = 3, i.STATE_FAILED = 2, i.STATE_RECOGNIZED = 1, i.tap = r$2, i.pan = u, i.swipe = a, i.press = c, i.rotate = i$1, i.pinch = r, i.doubletap = e;
  class PopsUtils {
isWin(target) {
      if (typeof target !== "object") {
        return false;
      }
      if (target instanceof Node) {
        return false;
      }
      if (target === globalThis) {
        return true;
      }
      if (target === window) {
        return true;
      }
      if (target === self) {
        return true;
      }
      if (target === PopsCore.globalThis) {
        return true;
      }
      if (target === PopsCore.window) {
        return true;
      }
      if (target === PopsCore.self) {
        return true;
      }
      if (typeof unsafeWindow !== "undefined" && target === unsafeWindow) {
        return true;
      }
      if (target?.Math?.toString() !== "[object Math]") {
        return false;
      }
      return true;
    }
    isDOM(target) {
      return target instanceof Node;
    }
delete(target, propName) {
      if (typeof Reflect === "object" && Reflect.deleteProperty) {
        Reflect.deleteProperty(target, propName);
      } else {
        delete target[propName];
      }
    }
    assign(target = {}, source = {}, isAdd = false) {
      let UtilsContext = this;
      if (source == null) {
        return target;
      }
      if (target == null) {
        target = {};
      }
      if (Array.isArray(source)) {
        let canTraverse = source.filter((item) => {
          return typeof item === "object";
        });
        if (!canTraverse.length) {
          return source;
        }
      }
      if (isAdd) {
        for (const sourceKeyName in source) {
          const targetKeyName = sourceKeyName;
          let targetValue = target[targetKeyName];
          let sourceValue = source[sourceKeyName];
          if (typeof sourceValue === "object" && sourceValue != null && sourceKeyName in target && !UtilsContext.isDOM(sourceValue)) {
            target[sourceKeyName] = UtilsContext.assign(targetValue, sourceValue, isAdd);
            continue;
          }
          target[sourceKeyName] = sourceValue;
        }
      } else {
        for (const targetKeyName in target) {
          if (targetKeyName in source) {
            let targetValue = target[targetKeyName];
            let sourceValue = source[targetKeyName];
            if (typeof sourceValue === "object" && sourceValue != null && !UtilsContext.isDOM(sourceValue) && Object.keys(sourceValue).length) {
              target[targetKeyName] = UtilsContext.assign(targetValue, sourceValue, isAdd);
              continue;
            }
            target[targetKeyName] = sourceValue;
          }
        }
      }
      return target;
    }
getRandomGUID() {
      if (typeof PopsCore.globalThis?.crypto?.randomUUID === "function") {
        return PopsCore.globalThis.crypto.randomUUID();
      } else {
        return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(charStr) {
          var randomValue = Math.random() * 16 | 0, randomCharValue = charStr === "x" ? randomValue : randomValue & 3 | 8;
          return randomCharValue.toString(16);
        });
      }
    }
    contains(context, target) {
      if (arguments.length === 1) {
        return this.contains(PopsCore.document.body || PopsCore.document.documentElement, arguments[0]);
      } else {
        if (target == null) {
          return false;
        }
        if (typeof target[Symbol.iterator] === "function") {
          let flag = true;
          for (const targetNode of target) {
            if (!context.contains(targetNode)) {
              flag = false;
              break;
            }
          }
          return flag;
        } else {
          return context.contains(target);
        }
      }
    }
    formatTime(text = new Date(), formatType = "yyyy-MM-dd HH:mm:ss") {
      let time = text == null ? new Date() : new Date(text);
      function checkTime(timeNum) {
        if (timeNum < 10)
          return "0" + timeNum;
        return timeNum;
      }
      function timeSystemChange(hourNum) {
        return hourNum > 12 ? hourNum - 12 : hourNum;
      }
      let timeRegexp = {
        yyyy: time.getFullYear(),
MM: checkTime(time.getMonth() + 1),
dd: checkTime(time.getDate()),
HH: checkTime(time.getHours()),
hh: checkTime(timeSystemChange(time.getHours())),
mm: checkTime(time.getMinutes()),
ss: checkTime(time.getSeconds())
};
      Object.keys(timeRegexp).forEach(function(key) {
        let replaecRegexp = new RegExp(key, "g");
        formatType = formatType.replace(replaecRegexp, timeRegexp[key]);
      });
      return formatType;
    }
    formatByteToSize(byteSize, addType = true) {
      byteSize = parseInt(byteSize.toString());
      if (isNaN(byteSize)) {
        throw new TypeError("Utils.formatByteToSize 参数 byteSize 格式不正确");
      }
      let result = 0;
      let resultType = "KB";
      let sizeData = {};
      sizeData.B = 1;
      sizeData.KB = 1024;
      sizeData.MB = sizeData.KB * sizeData.KB;
      sizeData.GB = sizeData.MB * sizeData.KB;
      sizeData.TB = sizeData.GB * sizeData.KB;
      sizeData.PB = sizeData.TB * sizeData.KB;
      sizeData.EB = sizeData.PB * sizeData.KB;
      sizeData.ZB = sizeData.EB * sizeData.KB;
      sizeData.YB = sizeData.ZB * sizeData.KB;
      sizeData.BB = sizeData.YB * sizeData.KB;
      sizeData.NB = sizeData.BB * sizeData.KB;
      sizeData.DB = sizeData.NB * sizeData.KB;
      for (let key in sizeData) {
        result = byteSize / sizeData[key];
        resultType = key;
        if (sizeData.KB >= result) {
          break;
        }
      }
      result = result.toFixed(2);
      result = addType ? result + resultType.toString() : parseFloat(result.toString());
      return result;
    }
    AnyTouch = () => {
      return i;
    };
isPhone(userAgent = PopsCore.globalThis.navigator.userAgent) {
      return Boolean(/(iPhone|iPad|iPod|iOS|Android)/i.test(userAgent));
    }
setTimeout(callback, timeout = 0) {
      try {
        return setTimeout$1(callback, timeout);
      } catch (error) {
        return PopsCore.setTimeout(callback, timeout);
      }
    }
clearTimeout(timeId) {
      try {
        if (timeId != null) {
          clearTimeout$1(timeId);
        }
      } catch (error) {
      } finally {
        PopsCore.clearTimeout(timeId);
      }
    }
setInterval(callback, timeout = 0) {
      try {
        return setInterval$1(callback, timeout);
      } catch (error) {
        return PopsCore.setInterval(callback, timeout);
      }
    }
clearInterval(timeId) {
      try {
        if (timeId != null) {
          clearInterval$1(timeId);
        }
      } catch (error) {
      } finally {
        PopsCore.clearInterval(timeId);
      }
    }
  }
  const popsUtils = new PopsUtils();
  const PopsSafeUtils = {
getSafeHTML(text) {
      if (globalThis.trustedTypes) {
        const policy = globalThis.trustedTypes.createPolicy("safe-innerHTML", {
          createHTML: (html) => html
        });
        return policy.createHTML(text);
      } else {
        return text;
      }
    },
setSafeHTML($el, text) {
      $el.innerHTML = this.getSafeHTML(text);
    }
  };
  const PopsCommonCSSClassName = {
    flexCenter: "pops-flex-items-center",
    flexYCenter: "pops-flex-y-center",
    hide: "pops-hide",
    hideImportant: "pops-hide-important",
    userSelectNone: "pops-user-select-none",
    textIsDisabled: "pops-text-is-disabled"
  };
  class PopsDOMUtilsEvent {
    on(element, eventType, selector, callback, option) {
      function getOption(args2, startIndex, option2) {
        let currentParam = args2[startIndex];
        if (typeof currentParam === "boolean") {
          option2.capture = currentParam;
          if (typeof args2[startIndex + 1] === "boolean") {
            option2.once = args2[startIndex + 1];
          }
          if (typeof args2[startIndex + 2] === "boolean") {
            option2.passive = args2[startIndex + 2];
          }
        } else if (typeof currentParam === "object" && ("capture" in currentParam || "once" in currentParam || "passive" in currentParam || "isComposedPath" in currentParam)) {
          option2.capture = currentParam.capture;
          option2.once = currentParam.once;
          option2.passive = currentParam.passive;
          option2.isComposedPath = currentParam.isComposedPath;
        }
        return option2;
      }
      let DOMUtilsContext = this;
      let args = arguments;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      let elementList = [];
      if (element instanceof NodeList || Array.isArray(element)) {
        element = element;
        elementList = [...element];
      } else {
        elementList.push(element);
      }
      let eventTypeList = [];
      if (Array.isArray(eventType)) {
        eventTypeList = eventTypeList.concat(eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== ""));
      } else if (typeof eventType === "string") {
        eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
      }
      let selectorList = [];
      if (Array.isArray(selector)) {
        selectorList = selectorList.concat(selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== ""));
      } else if (typeof selector === "string") {
        selectorList.push(selector);
      }
      let listenerCallBack = callback;
      let listenerOption = {
        capture: false,
        once: false,
        passive: false,
        isComposedPath: false
      };
      if (typeof selector === "function") {
        listenerCallBack = selector;
        listenerOption = getOption(args, 3, listenerOption);
      } else {
        listenerOption = getOption(args, 4, listenerOption);
      }
      function checkOptionOnceToRemoveEventListener() {
        if (listenerOption.once) {
          DOMUtilsContext.off(element, eventType, selector, callback, option);
        }
      }
      elementList.forEach((elementItem) => {
        function domUtilsEventCallBack(event) {
          if (selectorList.length) {
            let eventTarget = listenerOption.isComposedPath ? event.composedPath()[0] : event.target;
            let totalParent = elementItem;
            if (popsUtils.isWin(totalParent)) {
              if (totalParent === PopsCore.document) {
                totalParent = PopsCore.document.documentElement;
              }
            }
            let findValue = selectorList.find((selectorItem) => {
              if (DOMUtilsContext.matches(eventTarget, selectorItem)) {
                return true;
              }
              let $closestMatches = DOMUtilsContext.closest(eventTarget, selectorItem);
              if ($closestMatches && totalParent?.contains($closestMatches)) {
                eventTarget = $closestMatches;
                return true;
              }
              return false;
            });
            if (findValue) {
              try {
                OriginPrototype.Object.defineProperty(event, "target", {
                  get() {
                    return eventTarget;
                  }
                });
              } catch (error) {
              }
              listenerCallBack.call(eventTarget, event, eventTarget);
              checkOptionOnceToRemoveEventListener();
            }
          } else {
            listenerCallBack.call(elementItem, event);
            checkOptionOnceToRemoveEventListener();
          }
        }
        eventTypeList.forEach((eventName) => {
          elementItem.addEventListener(eventName, domUtilsEventCallBack, listenerOption);
          let elementEvents = Reflect.get(elementItem, SymbolEvents) || {};
          elementEvents[eventName] = elementEvents[eventName] || [];
          elementEvents[eventName].push({
            selector: selectorList,
            option: listenerOption,
            callback: domUtilsEventCallBack,
            originCallBack: listenerCallBack
          });
          Reflect.set(elementItem, SymbolEvents, elementEvents);
        });
      });
    }
    off(element, eventType, selector, callback, option, filter) {
      function getOption(args1, startIndex, option2) {
        let currentParam = args1[startIndex];
        if (typeof currentParam === "boolean") {
          option2.capture = currentParam;
        } else if (typeof currentParam === "object" && "capture" in currentParam) {
          option2.capture = currentParam.capture;
        }
        return option2;
      }
      let DOMUtilsContext = this;
      let args = arguments;
      if (typeof element === "string") {
        element = DOMUtilsContext.selectorAll(element);
      }
      if (element == null) {
        return;
      }
      let elementList = [];
      if (element instanceof NodeList || Array.isArray(element)) {
        element = element;
        elementList = [...element];
      } else {
        elementList.push(element);
      }
      let eventTypeList = [];
      if (Array.isArray(eventType)) {
        eventTypeList = eventTypeList.concat(eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== ""));
      } else if (typeof eventType === "string") {
        eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
      }
      let selectorList = [];
      if (Array.isArray(selector)) {
        selectorList = selectorList.concat(selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== ""));
      } else if (typeof selector === "string") {
        selectorList.push(selector);
      }
      let listenerCallBack = callback;
      let listenerOption = {
        capture: false
      };
      if (typeof selector === "function") {
        listenerCallBack = selector;
        listenerOption = getOption(args, 3, listenerOption);
      } else {
        listenerOption = getOption(args, 4, listenerOption);
      }
      let isRemoveAll = false;
      if (args.length === 2) {
        isRemoveAll = true;
      } else if (args.length === 3 && typeof args[2] === "string" || Array.isArray(args[2])) {
        isRemoveAll = true;
      }
      elementList.forEach((elementItem) => {
        let elementEvents = Reflect.get(elementItem, SymbolEvents) || {};
        eventTypeList.forEach((eventName) => {
          let handlers = elementEvents[eventName] || [];
          if (typeof filter === "function") {
            handlers = handlers.filter(filter);
          }
          for (let index = 0; index < handlers.length; index++) {
            let handler = handlers[index];
            let flag = true;
            if (flag && listenerCallBack && handler.originCallBack !== listenerCallBack) {
              flag = false;
            }
            if (flag && selectorList.length && Array.isArray(handler.selector)) {
              if (JSON.stringify(handler.selector) !== JSON.stringify(selectorList)) {
                flag = false;
              }
            }
            if (flag && listenerOption.capture !== handler.option.capture) {
              flag = false;
            }
            if (flag || isRemoveAll) {
              elementItem.removeEventListener(eventName, handler.callback, handler.option);
              handlers.splice(index--, 1);
            }
          }
          if (handlers.length === 0) {
            popsUtils.delete(elementEvents, eventType);
          }
        });
        Reflect.set(elementItem, SymbolEvents, elementEvents);
      });
    }
offAll(element, eventType) {
      if (typeof element === "string") {
        element = PopsCore.document.querySelectorAll(element);
      }
      if (element == null) {
        return;
      }
      let elementList = [];
      if (element instanceof NodeList || Array.isArray(element)) {
        elementList = [...element];
      } else {
        elementList.push(element);
      }
      let eventTypeList = [];
      if (Array.isArray(eventType)) {
        eventTypeList = eventTypeList.concat(eventType);
      } else if (typeof eventType === "string") {
        eventTypeList = eventTypeList.concat(eventType.split(" "));
      }
      elementList.forEach((elementItem) => {
        Object.getOwnPropertySymbols(elementItem).forEach((__symbolEvents) => {
          if (!__symbolEvents.toString().startsWith("Symbol(events_")) {
            return;
          }
          let elementEvents = elementItem[__symbolEvents] || {};
          let iterEventNameList = eventTypeList.length ? eventTypeList : Object.keys(elementEvents);
          iterEventNameList.forEach((eventName) => {
            let handlers = elementEvents[eventName];
            if (!handlers) {
              return;
            }
            for (const handler of handlers) {
              elementItem.removeEventListener(eventName, handler.callback, {
                capture: handler["option"]["capture"]
              });
            }
            popsUtils.delete(elementItem[__symbolEvents], eventName);
          });
        });
      });
    }
ready(callback) {
      const that = this;
      if (typeof callback !== "function") {
        return;
      }
      function checkDOMReadyState() {
        try {
          if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) {
            return true;
          } else {
            return false;
          }
        } catch (error) {
          return false;
        }
      }
      function completed() {
        removeDomReadyListener();
        callback();
      }
      let targetList = [
        {
          target: PopsCore.document,
          eventType: "DOMContentLoaded",
          callback: completed
        },
        {
          target: PopsCore.window,
          eventType: "load",
          callback: completed
        }
      ];
      function addDomReadyListener() {
        for (let index = 0; index < targetList.length; index++) {
          let item = targetList[index];
          that.on(item.target, item.eventType, item.callback);
        }
      }
      function removeDomReadyListener() {
        for (let index = 0; index < targetList.length; index++) {
          let item = targetList[index];
          that.off(item.target, item.eventType, item.callback);
        }
      }
      if (checkDOMReadyState()) {
        popsUtils.setTimeout(callback, 0);
      } else {
        addDomReadyListener();
      }
    }
trigger(element, eventType, details, useDispatchToTriggerEvent = true) {
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      let elementList = [];
      if (element instanceof NodeList || Array.isArray(element)) {
        element = element;
        elementList = [...element];
      } else {
        elementList = [element];
      }
      let eventTypeList = [];
      if (Array.isArray(eventType)) {
        eventTypeList = eventType;
      } else if (typeof eventType === "string") {
        eventTypeList = eventType.split(" ");
      }
      elementList.forEach((elementItem) => {
        let events = elementItem[SymbolEvents] || {};
        eventTypeList.forEach((_eventType_) => {
          let event = null;
          if (details && details instanceof Event) {
            event = details;
          } else {
            event = new Event(_eventType_);
            if (details) {
              Object.keys(details).forEach((keyName) => {
                event[keyName] = details[keyName];
              });
            }
          }
          if (useDispatchToTriggerEvent == false && _eventType_ in events) {
            events[_eventType_].forEach((eventsItem) => {
              eventsItem.callback(event);
            });
          } else {
            elementItem.dispatchEvent(event);
          }
        });
      });
    }
click(element, handler, details, useDispatchToTriggerEvent) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      if (handler == null) {
        DOMUtilsContext.trigger(element, "click", details, useDispatchToTriggerEvent);
      } else {
        DOMUtilsContext.on(element, "click", null, handler);
      }
    }
blur(element, handler, details, useDispatchToTriggerEvent) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      if (handler === null) {
        DOMUtilsContext.trigger(element, "blur", details, useDispatchToTriggerEvent);
      } else {
        DOMUtilsContext.on(element, "blur", null, handler);
      }
    }
focus(element, handler, details, useDispatchToTriggerEvent) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      if (handler == null) {
        DOMUtilsContext.trigger(element, "focus", details, useDispatchToTriggerEvent);
      } else {
        DOMUtilsContext.on(element, "focus", null, handler);
      }
    }
hover(element, handler, option) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      DOMUtilsContext.on(element, "mouseenter", null, handler, option);
      DOMUtilsContext.on(element, "mouseleave", null, handler, option);
    }
keyup(target, handler, option) {
      let DOMUtilsContext = this;
      if (target == null) {
        return;
      }
      if (typeof target === "string") {
        target = PopsCore.document.querySelector(target);
      }
      DOMUtilsContext.on(target, "keyup", null, handler, option);
    }
keydown(target, handler, option) {
      let DOMUtilsContext = this;
      if (target == null) {
        return;
      }
      if (typeof target === "string") {
        target = PopsCore.document.querySelector(target);
      }
      DOMUtilsContext.on(target, "keydown", null, handler, option);
    }
keypress(target, handler, option) {
      let DOMUtilsContext = this;
      if (target == null) {
        return;
      }
      if (typeof target === "string") {
        target = PopsCore.document.querySelector(target);
      }
      DOMUtilsContext.on(target, "keypress", null, handler, option);
    }
    preventEvent(element, eventNameList = [], capture) {
      function stopEvent(event) {
        event?.preventDefault();
        event?.stopPropagation();
        event?.stopImmediatePropagation();
        return false;
      }
      if (arguments.length === 1) {
        return stopEvent(arguments[0]);
      } else {
        if (typeof eventNameList === "string") {
          eventNameList = [eventNameList];
        }
        eventNameList.forEach((eventName) => {
          this.on(element, eventName, stopEvent, { capture: Boolean(capture) });
        });
      }
    }
    selector(selector) {
      return this.selectorAll(selector)[0];
    }
    selectorAll(selector) {
      selector = selector.trim();
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return Array.from(PopsCore.document.querySelectorAll(selector)).filter(($ele) => {
          return $ele?.innerHTML?.trim() === "";
        });
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
        let text = textMatch[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        return Array.from(PopsCore.document.querySelectorAll(selector)).filter(($ele) => {
          return ($ele?.textContent || $ele?.innerText)?.includes(text);
        });
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
        let pattern = textMatch[2];
        let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        let regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        return Array.from(PopsCore.document.querySelectorAll(selector)).filter(($ele) => {
          return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
        });
      } else {
        return Array.from(PopsCore.document.querySelectorAll(selector));
      }
    }
matches($el, selector) {
      selector = selector.trim();
      if ($el == null) {
        return false;
      }
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return $el.matches(selector) && $el?.innerHTML?.trim() === "";
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
        let text = textMatch[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        let content = $el?.textContent || $el?.innerText;
        if (typeof content !== "string") {
          content = "";
        }
        return $el.matches(selector) && content?.includes(text);
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
        let pattern = textMatch[2];
        let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        let regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        let content = $el?.textContent || $el?.innerText;
        if (typeof content !== "string") {
          content = "";
        }
        return $el.matches(selector) && Boolean(content?.match(regexp));
      } else {
        return $el.matches(selector);
      }
    }
    closest($el, selector) {
      selector = selector.trim();
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        let $closest = $el?.closest(selector);
        if ($closest && $closest?.innerHTML?.trim() === "") {
          return $closest;
        }
        return null;
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
        let text = textMatch[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        let $closest = $el?.closest(selector);
        if ($closest) {
          let content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.includes(text)) {
            return $closest;
          }
        }
        return null;
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
        let pattern = textMatch[2];
        let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        let regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        let $closest = $el?.closest(selector);
        if ($closest) {
          let content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.match(regexp)) {
            return $closest;
          }
        }
        return null;
      } else {
        let $closest = $el?.closest(selector);
        return $closest;
      }
    }
  }
  class PopsDOMUtils extends PopsDOMUtilsEvent {
getAnimationEndNameList() {
      return ["webkitAnimationEnd", "mozAnimationEnd", "MSAnimationEnd", "oanimationend", "animationend"];
    }
getTransitionEndNameList() {
      return ["webkitTransitionEnd", "mozTransitionEnd", "MSTransitionEnd", "otransitionend", "transitionend"];
    }
offset(element, calcScroll = true) {
      let rect = element.getBoundingClientRect();
      let win = element.ownerDocument.defaultView;
      let resultRect = new DOMRect(calcScroll ? parseFloat((rect.left + (win?.pageXOffset || 0)).toString()) : rect.left, calcScroll ? parseFloat((rect.top + (win?.pageYOffset || 0)).toString()) : rect.top, rect.width, rect.height);
      return resultRect;
    }
    width(element, isShow = false, parent) {
      let DOMUtilsContext = this;
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      if (popsUtils.isWin(element)) {
        return PopsCore.window.document.documentElement.clientWidth;
      }
      if (element.nodeType === 9) {
        element = element;
        return Math.max(element.body.scrollWidth, element.documentElement.scrollWidth, element.body.offsetWidth, element.documentElement.offsetWidth, element.documentElement.clientWidth);
      }
      if (isShow || !isShow && popsDOMUtils.isShow(element)) {
        element = element;
        if (parseFloat(popsDOMUtils.getStyleValue(element, "width").toString()) > 0) {
          return parseFloat(popsDOMUtils.getStyleValue(element, "width").toString());
        }
        if (element.offsetWidth > 0) {
          let borderLeftWidth = popsDOMUtils.getStyleValue(element, "borderLeftWidth");
          let borderRightWidth = popsDOMUtils.getStyleValue(element, "borderRightWidth");
          let paddingLeft = popsDOMUtils.getStyleValue(element, "paddingLeft");
          let paddingRight = popsDOMUtils.getStyleValue(element, "paddingRight");
          let backHeight = parseFloat(element.offsetWidth.toString()) - parseFloat(borderLeftWidth.toString()) - parseFloat(borderRightWidth.toString()) - parseFloat(paddingLeft.toString()) - parseFloat(paddingRight.toString());
          return parseFloat(backHeight.toString());
        }
        return 0;
      } else {
        element = element;
        let { cloneNode, recovery } = popsDOMUtils.showElement(element, parent);
        let width = DOMUtilsContext.width(cloneNode, true, parent);
        recovery();
        return width;
      }
    }
    height(element, isShow = false, parent) {
      let DOMUtilsContext = this;
      if (popsUtils.isWin(element)) {
        return PopsCore.window.document.documentElement.clientHeight;
      }
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      if (element.nodeType === 9) {
        element = element;
        return Math.max(element.body.scrollHeight, element.documentElement.scrollHeight, element.body.offsetHeight, element.documentElement.offsetHeight, element.documentElement.clientHeight);
      }
      if (isShow || !isShow && popsDOMUtils.isShow(element)) {
        element = element;
        if (parseFloat(popsDOMUtils.getStyleValue(element, "height").toString()) > 0) {
          return parseFloat(popsDOMUtils.getStyleValue(element, "height").toString());
        }
        if (element.offsetHeight > 0) {
          let borderTopWidth = popsDOMUtils.getStyleValue(element, "borderTopWidth");
          let borderBottomWidth = popsDOMUtils.getStyleValue(element, "borderBottomWidth");
          let paddingTop = popsDOMUtils.getStyleValue(element, "paddingTop");
          let paddingBottom = popsDOMUtils.getStyleValue(element, "paddingBottom");
          let backHeight = parseFloat(element.offsetHeight.toString()) - parseFloat(borderTopWidth.toString()) - parseFloat(borderBottomWidth.toString()) - parseFloat(paddingTop.toString()) - parseFloat(paddingBottom.toString());
          return parseFloat(backHeight.toString());
        }
        return 0;
      } else {
        element = element;
        let { cloneNode, recovery } = popsDOMUtils.showElement(element, parent);
        let height = DOMUtilsContext.height(cloneNode, true, parent);
        recovery();
        return height;
      }
    }
    outerWidth(element, isShow = false, parent) {
      let DOMUtilsContext = this;
      if (popsUtils.isWin(element)) {
        return PopsCore.window.innerWidth;
      }
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      element = element;
      if (isShow || !isShow && popsDOMUtils.isShow(element)) {
        let style = getComputedStyle(element, null);
        let marginLeft = popsDOMUtils.getStyleValue(style, "marginLeft");
        let marginRight = popsDOMUtils.getStyleValue(style, "marginRight");
        return element.offsetWidth + marginLeft + marginRight;
      } else {
        let { cloneNode, recovery } = popsDOMUtils.showElement(element, parent);
        let outerWidth = DOMUtilsContext.outerWidth(cloneNode, true, parent);
        recovery();
        return outerWidth;
      }
    }
    outerHeight(element, isShow = false, parent) {
      let DOMUtilsContext = this;
      if (popsUtils.isWin(element)) {
        return PopsCore.window.innerHeight;
      }
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      element = element;
      if (isShow || !isShow && popsDOMUtils.isShow(element)) {
        let style = getComputedStyle(element, null);
        let marginTop = popsDOMUtils.getStyleValue(style, "marginTop");
        let marginBottom = popsDOMUtils.getStyleValue(style, "marginBottom");
        return element.offsetHeight + marginTop + marginBottom;
      } else {
        let { cloneNode, recovery } = popsDOMUtils.showElement(element, parent);
        let outerHeight = DOMUtilsContext.outerHeight(cloneNode, true, parent);
        recovery();
        return outerHeight;
      }
    }
addClassName($el, className) {
      if ($el == null) {
        return;
      }
      if (typeof className !== "string") {
        return;
      }
      if (className.trim() === "") {
        return;
      }
      const classNameList = className.split(" ").filter((item) => item.trim() !== "");
      $el.classList.add(...classNameList);
    }
removeClassName($el, className) {
      if ($el == null) {
        return;
      }
      if (typeof className !== "string") {
        return;
      }
      if (className.trim() === "") {
        return;
      }
      const classNameList = className.split(" ").filter((item) => item.trim() !== "");
      $el.classList.remove(...classNameList);
    }
containsClassName($el, className) {
      if ($el == null) {
        return false;
      }
      if (typeof className !== "string") {
        return false;
      }
      if (className.trim() === "") {
        return false;
      }
      return $el.classList.contains(className);
    }
    css(element, property, value) {
      function handlePixe(propertyName, propertyValue) {
        let allowAddPixe = ["width", "height", "top", "left", "right", "bottom", "font-size"];
        if (typeof propertyValue === "number") {
          propertyValue = propertyValue.toString();
        }
        if (typeof propertyValue === "string" && allowAddPixe.includes(propertyName) && propertyValue.match(/[0-9]$/gi)) {
          propertyValue = propertyValue + "px";
        }
        return propertyValue;
      }
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      let setStyleProperty = (propertyName, propertyValue) => {
        if (typeof propertyValue === "string" && propertyValue.trim().endsWith("!important")) {
          propertyValue = propertyValue.trim().replace(/!important$/gi, "").trim();
          element.style.setProperty(propertyName, propertyValue, "important");
        } else {
          propertyValue = handlePixe(propertyName, propertyValue);
          element.style.setProperty(propertyName, propertyValue);
        }
      };
      if (typeof property === "string") {
        if (value == null) {
          return getComputedStyle(element).getPropertyValue(property);
        } else {
          setStyleProperty(property, value);
        }
      } else if (typeof property === "object") {
        for (let prop in property) {
          let value2 = property[prop];
          setStyleProperty(prop, value2);
        }
      }
    }
createElement(tagName, property, attributes) {
      let tempElement = PopsCore.document.createElement(tagName);
      if (typeof property === "string") {
        PopsSafeUtils.setSafeHTML(tempElement, property);
        return tempElement;
      }
      if (property == null) {
        property = {};
      }
      if (attributes == null) {
        attributes = {};
      }
      Object.keys(property).forEach((key) => {
        let value = property[key];
        if (key === "innerHTML") {
          PopsSafeUtils.setSafeHTML(tempElement, value);
          return;
        }
        tempElement[key] = value;
      });
      Object.keys(attributes).forEach((key) => {
        let value = attributes[key];
        if (typeof value === "object") {
          value = JSON.stringify(value);
        } else if (typeof value === "function") {
          value = value.toString();
        }
        tempElement.setAttribute(key, value);
      });
      return tempElement;
    }
parseTextToDOM(elementString) {
      elementString = elementString.replace(/^[\n|\s]*/g, "").replace(/[\n|\s]*$/g, "");
      let targetElement = this.createElement("div", {
        innerHTML: elementString
      });
      return targetElement.firstChild;
    }
getTextBoundingRect(input, selectionStart, selectionEnd, debug) {
      if (!input || !("value" in input))
        return input;
      if (typeof selectionStart == "string")
        selectionStart = parseFloat(selectionStart);
      if (typeof selectionStart != "number" || isNaN(selectionStart)) {
        selectionStart = 0;
      }
      if (selectionStart < 0)
        selectionStart = 0;
      else
        selectionStart = Math.min(input.value.length, selectionStart);
      if (typeof selectionEnd == "string")
        selectionEnd = parseFloat(selectionEnd);
      if (typeof selectionEnd != "number" || isNaN(selectionEnd) || selectionEnd < selectionStart) {
        selectionEnd = selectionStart;
      }
      if (selectionEnd < 0)
        selectionEnd = 0;
      else
        selectionEnd = Math.min(input.value.length, selectionEnd);
      if (typeof input.createTextRange == "function") {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveStart("character", selectionStart);
        range.moveEnd("character", selectionEnd - selectionStart);
        return range.getBoundingClientRect();
      }
      var offset = getInputOffset(), topPos = offset.top, leftPos = offset.left, width = getInputCSS("width", true), height = getInputCSS("height", true);
      var cssDefaultStyles = "white-space:pre;padding:0;margin:0;", listOfModifiers = [
        "direction",
        "font-family",
        "font-size",
        "font-size-adjust",
        "font-variant",
        "font-weight",
        "font-style",
        "letter-spacing",
        "line-height",
        "text-align",
        "text-indent",
        "text-transform",
        "word-wrap",
        "word-spacing"
      ];
      topPos += getInputCSS("padding-top", true);
      topPos += getInputCSS("border-top-width", true);
      leftPos += getInputCSS("padding-left", true);
      leftPos += getInputCSS("border-left-width", true);
      leftPos += 1;
      for (var i2 = 0; i2 < listOfModifiers.length; i2++) {
        var property = listOfModifiers[i2];
        cssDefaultStyles += property + ":" + getInputCSS(property) + ";";
      }
      var text = input.value || "G", textLen = text.length, fakeClone = document.createElement("div");
      if (selectionStart > 0)
        appendPart(0, selectionStart);
      var fakeRange = appendPart(selectionStart, selectionEnd);
      if (textLen > selectionEnd)
        appendPart(selectionEnd, textLen);
      fakeClone.style.cssText = cssDefaultStyles;
      fakeClone.style.position = "absolute";
      fakeClone.style.top = topPos + "px";
      fakeClone.style.left = leftPos + "px";
      fakeClone.style.width = width + "px";
      fakeClone.style.height = height + "px";
      PopsCore.document.body.appendChild(fakeClone);
      var returnValue = fakeRange.getBoundingClientRect();
      if (!debug)
        fakeClone.parentNode.removeChild(fakeClone);
      return returnValue;
      function appendPart(start, end) {
        var span = document.createElement("span");
        span.style.cssText = cssDefaultStyles;
        span.textContent = text.substring(start, end);
        fakeClone.appendChild(span);
        return span;
      }
      function getInputOffset() {
        var body = document.body, win = document.defaultView, docElem = document.documentElement, box = document.createElement("div");
        box.style.paddingLeft = box.style.width = "1px";
        body.appendChild(box);
        var isBoxModel = box.offsetWidth == 2;
        body.removeChild(box);
        box = input.getBoundingClientRect();
        var clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, scrollTop = (
win.pageYOffset || isBoxModel && docElem.scrollTop || body.scrollTop
        ), scrollLeft = (
win.pageXOffset || isBoxModel && docElem.scrollLeft || body.scrollLeft
        );
        return {
top: box.top + scrollTop - clientTop,
left: box.left + scrollLeft - clientLeft
        };
      }
      function getInputCSS(prop, isnumber) {
        var val = PopsCore.document.defaultView.getComputedStyle(input, null).getPropertyValue(prop);
        return isnumber ? parseFloat(val) : val;
      }
    }
cssHide(ele, isImportant = false) {
      if (ele == null) {
        return;
      }
      if (isImportant) {
        popsDOMUtils.addClassName(ele, PopsCommonCSSClassName.hideImportant);
      } else {
        popsDOMUtils.addClassName(ele, PopsCommonCSSClassName.hide);
      }
    }
cssShow(ele) {
      if (ele == null) {
        return;
      }
      popsDOMUtils.removeClassName(ele, PopsCommonCSSClassName.hide);
      popsDOMUtils.removeClassName(ele, PopsCommonCSSClassName.hideImportant);
    }
    parseHTML(html, useParser = false, isComplete = false) {
      function parseHTMLByDOMParser() {
        let parser = new DOMParser();
        if (isComplete) {
          return parser.parseFromString(html, "text/html");
        } else {
          return parser.parseFromString(html, "text/html").body.firstChild;
        }
      }
      function parseHTMLByCreateDom() {
        let tempDIV = PopsCore.document.createElement("div");
        PopsSafeUtils.setSafeHTML(tempDIV, html);
        if (isComplete) {
          return tempDIV;
        } else {
          return tempDIV.firstChild;
        }
      }
      if (useParser) {
        return parseHTMLByDOMParser();
      } else {
        return parseHTMLByCreateDom();
      }
    }
append(element, content) {
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      function elementAppendChild(ele, text) {
        if (typeof content === "string") {
          ele.insertAdjacentHTML("beforeend", PopsSafeUtils.getSafeHTML(text));
        } else {
          ele.appendChild(text);
        }
      }
      if (Array.isArray(content) || content instanceof NodeList) {
        let fragment = PopsCore.document.createDocumentFragment();
        content.forEach((ele) => {
          if (typeof ele === "string") {
            ele = this.parseHTML(ele, true, false);
          }
          fragment.appendChild(ele);
        });
        element.appendChild(fragment);
      } else {
        elementAppendChild(element, content);
      }
    }
appendHead($ele) {
      if (PopsCore.document.head) {
        PopsCore.document.head.appendChild($ele);
      } else {
        PopsCore.document.documentElement.appendChild($ele);
      }
    }
appendBody($ele) {
      if (PopsCore.document.body) {
        PopsCore.document.body.appendChild($ele);
      } else {
        PopsCore.document.documentElement.appendChild($ele);
      }
    }
isShow(element) {
      return Boolean(element.getClientRects().length);
    }
showElement($ele, ownParent) {
      let $cloneNode = $ele.cloneNode(true);
      $cloneNode.setAttribute("style", "visibility: hidden !important;display:block !important;");
      let $parent = PopsCore.document.documentElement;
      let $root = $ele.getRootNode();
      if (ownParent == null) {
        if ($root == $ele) {
          $parent = PopsCore.document.documentElement;
        } else {
          $parent = $root;
        }
      } else {
        $parent = ownParent;
      }
      $parent.appendChild($cloneNode);
      return {
cloneNode: $cloneNode,
recovery() {
          $cloneNode.remove();
        }
      };
    }
getStyleValue(element, styleName) {
      let view = null;
      let styles = null;
      if (element instanceof CSSStyleDeclaration) {
        styles = element;
      } else {
        view = element.ownerDocument.defaultView;
        if (!view || !view.opener) {
          view = window;
        }
        styles = view.getComputedStyle(element);
      }
      let value = parseFloat(styles[styleName]);
      if (isNaN(value)) {
        return 0;
      } else {
        return value;
      }
    }
before(element, content) {
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      if (typeof content === "string") {
        element.insertAdjacentHTML("beforebegin", PopsSafeUtils.getSafeHTML(content));
      } else {
        element.parentElement.insertBefore(content, element);
      }
    }
after(element, content) {
      if (typeof element === "string") {
        element = PopsCore.document.querySelector(element);
      }
      if (element == null) {
        return;
      }
      if (typeof content === "string") {
        element.insertAdjacentHTML("afterend", PopsSafeUtils.getSafeHTML(content));
      } else {
        element.parentElement.insertBefore(content, element.nextSibling);
      }
    }
getKeyFrames(sheet) {
      let result = {};
      Object.keys(sheet.cssRules).forEach((key) => {
        if (sheet.cssRules[key].type === 7 && sheet.cssRules[key].name.startsWith("pops-anim-")) {
          result[sheet.cssRules[key].name] = sheet.cssRules[key];
        }
      });
      return result;
    }
calcColor() {
      function useChangeColor() {
        const hexToRgb = (str) => {
          let hexs = "";
          let reg = /^#(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;
          if (!reg.test(str)) {
            console.warn("输入错误的hex");
            return "";
          }
          str = str.replace("#", "");
          hexs = str.match(/../g);
          for (let i2 = 0; i2 < 3; i2++)
            hexs[i2] = parseInt(hexs[i2], 16);
          return hexs;
        };
        const rgbToHex = (r2, g2, b2) => {
          let reg = /^\d{1,3}$/;
          if (!reg.test(r2) || !reg.test(g2) || !reg.test(b2)) {
            console.warn("输入错误的rgb颜色值");
            return "";
          }
          let hexs = [r2.toString(16), g2.toString(16), b2.toString(16)];
          for (let i2 = 0; i2 < 3; i2++)
            if (hexs[i2].length == 1)
              hexs[i2] = `0${hexs[i2]}`;
          return `#${hexs.join("")}`;
        };
        const getDarkColor = (color, level) => {
          let reg = /^#(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;
          if (!reg.test(color)) {
            console.warn("输入错误的hex颜色值");
            return "";
          }
          let rgb = useChangeColor().hexToRgb(color);
          for (let i2 = 0; i2 < 3; i2++)
            rgb[i2] = Math.floor(rgb[i2] * (1 - level));
          return useChangeColor().rgbToHex(rgb[0], rgb[1], rgb[2]);
        };
        const getLightColor = (color, level) => {
          let reg = /^#(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;
          if (!reg.test(color)) {
            console.warn("输入错误的hex颜色值");
            return "";
          }
          let rgb = useChangeColor().hexToRgb(color);
          for (let i2 = 0; i2 < 3; i2++)
            rgb[i2] = Math.floor((255 - rgb[i2]) * level + rgb[i2]);
          return useChangeColor().rgbToHex(rgb[0], rgb[1], rgb[2]);
        };
        return {
          hexToRgb,
          rgbToHex,
          getDarkColor,
          getLightColor
        };
      }
      return useChangeColor();
    }
getTransform(element) {
      let transform_left = 0;
      let transform_top = 0;
      let elementTransform = PopsCore.globalThis.getComputedStyle(element).transform;
      if (elementTransform !== "none" && elementTransform != null && elementTransform !== "") {
        let elementTransformSplit = elementTransform.match(/\((.+)\)/)?.[1].split(",");
        transform_left = Math.abs(parseInt(elementTransformSplit[4]));
        transform_top = Math.abs(parseInt(elementTransformSplit[5]));
      }
      return {
        transformLeft: transform_left,
        transformTop: transform_top
      };
    }
onInput($el, callback, option) {
      let isComposite = false;
      let __callback = async (event) => {
        if (isComposite)
          return;
        await callback(event);
      };
      let __composition_start_callback = () => {
        isComposite = true;
      };
      let __composition_end_callback = () => {
        isComposite = false;
        this.trigger($el, "input", {
          isComposite
        });
      };
      this.on($el, "input", __callback, option);
      this.on($el, "compositionstart", __composition_start_callback, option);
      this.on($el, "compositionend", __composition_end_callback, option);
      return {
        off: () => {
          this.off($el, "input", __callback, option);
          this.off($el, "compositionstart", __composition_start_callback, option);
          this.off($el, "compositionend", __composition_end_callback, option);
        }
      };
    }
  }
  const popsDOMUtils = new PopsDOMUtils();
  const PopsElementHandler = {
createMask(guid, zIndex = 101, style = "") {
      zIndex = zIndex - 100;
      if (style.startsWith(";")) {
        style = style.replace(";", "");
      }
      return (
`<div class="pops-mask" data-guid="${guid}" style="z-index:${zIndex};${style}"></div>`
      );
    },
createAnim(guid, type, config, html = "", bottomBtnHTML = "", zIndex) {
      let __config = config;
      let popsAnimStyle = "";
      let popsStyle = "";
      let popsPosition = __config.position || "";
      if (config.zIndex != null) {
        popsAnimStyle += `z-index: ${zIndex};`;
        popsStyle += `z-index: ${zIndex};`;
      }
      if (__config.width != null) {
        popsStyle += `width: ${__config.width};`;
      }
      if (__config.height != null) {
        popsStyle += `height: ${__config.height};`;
      }
      let hasBottomBtn = bottomBtnHTML.trim() === "" ? false : true;
      return (
`
		<div class="pops-anim" anim="${__config.animation || ""}" style="${popsAnimStyle}" data-guid="${guid}">${config.style != null ? `<style tyle="text/css">${config.style}</style>` : ""}
			<div class="pops ${config.class || ""}" data-bottom-btn="${hasBottomBtn}" type-value="${type}" style="${popsStyle}" position="${popsPosition}" data-guid="${guid}">${html}</div>
		</div>`
      );
    },
createHeader(type, config) {
      if (!config.btn) {
        return "";
      }
      let confirm_config = config;
      if (type !== "iframe" && !confirm_config.btn?.close?.enable) {
        return "";
      }
      let resultHTML = "";
      let closeHTML = "";
      let iframe_config = config;
      if (type === "iframe" && iframe_config.topRightButton?.trim() !== "") {
        let topRightButtonHTML = "";
        iframe_config.topRightButton.split("|").forEach((item) => {
          item = item.toLowerCase();
          topRightButtonHTML +=
`
                <button class="pops-header-control" type="button" data-type="${item}">
                    <i class="pops-icon">${PopsIcon.getIcon(item)}</i>
                </button>`;
        });
        resultHTML =
`
            <div class="pops-header-controls" data-margin>${topRightButtonHTML}</div>`;
      } else {
        if (confirm_config.btn?.close?.enable) {
          closeHTML =
`
                <div class="pops-header-controls">
                    <button class="pops-header-control" type="button" data-type="close" data-header>
                    	<i class="pops-icon">${PopsIcon.getIcon("close")}</i>
                    </button>
                </div>`;
        }
        resultHTML = closeHTML;
      }
      return resultHTML;
    },
createHeaderStyle(type, config) {
      return {
        headerStyle: config?.title?.html ? config?.title?.style || "" : "",
        headerPStyle: config?.title?.html ? "" : config?.title?.style || ""
      };
    },
createBottom(type, config) {
      if (config.btn == null) {
        return "";
      }
      let confirm_config = config;
      if (!(config.btn?.ok?.enable || confirm_config.btn?.cancel?.enable || confirm_config.btn?.other?.enable)) {
        return "";
      }
      let btnStyle = "";
      let resultHTML = "";
      let okHTML = "";
      let cancelHTML = "";
      let ohterHTML = "";
      if (config.btn.position) {
        btnStyle += `justify-content: ${config.btn.position};`;
      }
      if (confirm_config.btn.reverse) {
        btnStyle += "flex-direction: row-reverse;";
      }
      if (config.btn?.ok?.enable) {
        let okButtonSizeClassName = "";
        if (config.btn.ok.size === "large") {
          okButtonSizeClassName = "pops-button-" + config.btn.ok.size;
        } else if (config.btn.ok.size === "small") {
          okButtonSizeClassName = "pops-button-" + config.btn.ok.size;
        }
        let okIconHTML = "";
        let okIcon = confirm_config.btn.ok.icon;
        if (okIcon !== "") {
          let iconHTML = "";
          if (PopsIcon.hasIcon(okIcon)) {
            iconHTML = PopsIcon.getIcon(okIcon);
          } else {
            iconHTML = okIcon;
          }
          iconHTML = iconHTML || "";
          okIconHTML =
`<i class="pops-bottom-icon" is-loading="${config.btn.ok.iconIsLoading}">${iconHTML}</i>`;
        }
        okHTML =
`
            <button 
				class="pops-${type}-btn-ok ${okButtonSizeClassName}"
				type="button"
				data-type="${confirm_config.btn.ok?.type}"
				data-has-icon="${(confirm_config.btn.ok.icon || "") !== ""}"
				data-rightIcon="${confirm_config.btn.ok?.rightIcon}"
            >${okIconHTML}<span>${config.btn.ok.text}</span>
            </button>`;
      }
      if (confirm_config.btn?.cancel?.enable) {
        let cancelButtonSizeClassName = "";
        if (confirm_config.btn.cancel.size === "large") {
          cancelButtonSizeClassName = "pops-button-" + confirm_config.btn.cancel.size;
        } else if (confirm_config.btn.cancel.size === "small") {
          cancelButtonSizeClassName = "pops-button-" + confirm_config.btn.cancel.size;
        }
        let cancelIconHTML = "";
        let cancelIcon = confirm_config.btn.cancel.icon;
        if (cancelIcon !== "") {
          let iconHTML = "";
          if (PopsIcon.hasIcon(cancelIcon)) {
            iconHTML = PopsIcon.getIcon(cancelIcon);
          } else {
            iconHTML = cancelIcon;
          }
          iconHTML = iconHTML || "";
          cancelIconHTML =
`<i class="pops-bottom-icon" is-loading="${confirm_config.btn.cancel.iconIsLoading}">${iconHTML}</i>`;
        }
        cancelHTML =
`
            <button
				class="pops-${type}-btn-cancel ${cancelButtonSizeClassName}"
				type="button"
				data-type="${confirm_config.btn.cancel.type}"
				data-has-icon="${(confirm_config.btn.cancel.icon || "") !== ""}"
				data-rightIcon="${confirm_config.btn.cancel.rightIcon}"
            >${cancelIconHTML}<span>${confirm_config.btn.cancel.text}</span>
            </button>`;
      }
      if (confirm_config.btn?.other?.enable) {
        let otherButtonSizeClassName = "";
        if (confirm_config.btn.other.size === "large") {
          otherButtonSizeClassName = "pops-button-" + confirm_config.btn.other.size;
        } else if (confirm_config.btn.other.size === "small") {
          otherButtonSizeClassName = "pops-button-" + confirm_config.btn.other.size;
        }
        let otherIconHTML = "";
        let otherIcon = confirm_config.btn.other.icon;
        if (otherIcon !== "") {
          let iconHTML = "";
          if (PopsIcon.hasIcon(otherIcon)) {
            iconHTML = PopsIcon.getIcon(otherIcon);
          }
          iconHTML = iconHTML || "";
          otherIconHTML =
`<i class="pops-bottom-icon" is-loading="${confirm_config.btn.other.iconIsLoading}">${iconHTML}</i>`;
        }
        ohterHTML =
`
            <button
				class="pops-${type}-btn-other ${otherButtonSizeClassName}"
				type="button"
				data-type="${confirm_config.btn.other.type}"
				data-has-icon="${(confirm_config.btn.other.icon || "") !== ""}"
				data-rightIcon="${confirm_config.btn.other.rightIcon}"
            >${otherIconHTML}<span>${confirm_config.btn.other.text}</span>
            </button>`;
      }
      if (confirm_config.btn.merge) {
        let flexStyle = "display: flex;";
        if (confirm_config.btn.mergeReverse) {
          flexStyle += "flex-direction: row-reverse;";
        } else {
          flexStyle += "flex-direction: row;";
        }
        resultHTML =
`
            <div class="pops-botttom-btn-controls pops-${type}-btn" style="${btnStyle}">${ohterHTML}<div 
                    class="pops-${type}-btn-merge"
                    style="${flexStyle}">${okHTML}${cancelHTML}</div>
            </div>
            `;
      } else {
        resultHTML =
`<div class="pops-botttom-btn-controls pops-${type}-btn" style="${btnStyle}">${okHTML}${cancelHTML}${ohterHTML}</div>`;
      }
      return resultHTML;
    },
createContentStyle(type, config) {
      return {
        contentStyle: config?.content?.html ? config?.content?.style || "" : "",
        contentPStyle: config?.content?.html ? "" : config?.content?.style || ""
      };
    },
parseElement(html) {
      return popsDOMUtils.parseTextToDOM(html);
    }
  };
  var indexCSS = '@charset "utf-8";\n.pops * {\n	-webkit-box-sizing: border-box;\n	box-sizing: border-box;\n	margin: 0;\n	padding: 0;\n	-webkit-tap-highlight-color: transparent;\n	/* 代替::-webkit-scrollbar */\n	scrollbar-width: thin;\n}\n.pops {\n	--pops-bg-opacity: 1;\n	--pops-bd-opacity: 1;\n	--pops-font-size: 16px;\n	interpolate-size: allow-keywords;\n	--pops-color: #000000;\n	--pops-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n	--pops-bd-color: rgb(235, 238, 245, var(--pops-bd-opacity));\n	--pops-box-shadow-color: rgba(0, 0, 0, 0.12);\n	--pops-title-color: #000000;\n	--pops-title-border-color: var(--pops-bd-color);\n	--pops-content-color: #000000;\n	--pops-bottom-btn-controls-border-color: var(--pops-bd-color);\n	--pops-components-is-disabled-text-color: #a8abb2;\n	--pops-components-is-disabled-bg-color: #f5f7fa;\n}\n@media (prefers-color-scheme: dark) {\n	.pops {\n		--pops-mask-bg-opacity: 0.8;\n		--pops-color: #ffffff;\n		--pops-bg-color: rgb(17, 17, 17, var(--pops-bg-opacity));\n		--pops-bd-color: rgb(55, 55, 55, var(--pops-bd-opacity));\n		--pops-box-shadow-color: rgba(81, 81, 81, 0.12);\n		--pops-title-color: #e8e8e8;\n		--pops-title-border-color: var(--pops-bd-color);\n		--pops-content-color: #e5e5e5;\n		--pops-components-is-disabled-text-color: #a8abb2;\n		--pops-components-is-disabled-bg-color: #262727;\n	}\n}\n.pops {\n	color: var(--pops-color);\n	background-color: var(--pops-bg-color);\n	border: 1px solid var(--pops-bd-color);\n	border-radius: 4px;\n	font-size: var(--pops-font-size);\n	line-height: normal;\n	box-shadow: 0 0 12px var(--pops-box-shadow-color);\n	box-sizing: border-box;\n	overflow: hidden;\n	transition: all 0.35s;\n	display: flex;\n	flex-direction: column;\n}\n.pops-anim {\n	position: fixed;\n	top: 0;\n	right: 0;\n	bottom: 0;\n	left: 0;\n	width: 100%;\n	height: 100%;\n}\n.pops-anim[anim=""] {\n	top: unset;\n	right: unset;\n	bottom: unset;\n	left: unset;\n	width: unset;\n	height: unset;\n	transition: none;\n}\n/* 底部图标动画和样式 */\n.pops i.pops-bottom-icon[is-loading="true"] {\n	animation: rotating 2s linear infinite;\n}\n.pops i.pops-bottom-icon {\n	height: 1em;\n	width: 1em;\n	line-height: normal;\n	display: inline-flex;\n	justify-content: center;\n	align-items: center;\n	position: relative;\n	fill: currentColor;\n	color: inherit;\n	font-size: inherit;\n}\n\n/* 遮罩层样式 */\n.pops-mask {\n	--pops-mask-bg-opacity: 0.4;\n	--pops-mask-bg-color: rgba(0, 0, 0, var(--pops-mask-bg-opacity));\n}\n.pops-mask {\n	position: fixed;\n	top: 0;\n	right: 0;\n	bottom: 0;\n	left: 0;\n	width: 100%;\n	height: 100%;\n	border: 0;\n	border-radius: 0;\n	background-color: var(--pops-mask-bg-color);\n	box-shadow: none;\n	transition: none;\n}\n\n.pops-header-controls button.pops-header-control[type][data-header] {\n	float: right;\n	margin: 0 0;\n	outline: 0;\n	border: 0;\n	border-color: rgb(136, 136, 136, var(--pops-bd-opacity));\n	background-color: transparent;\n	color: #888;\n	cursor: pointer;\n}\n.pops-header-controls button.pops-header-control[data-type="max"],\n.pops-header-controls button.pops-header-control[data-type="mise"],\n.pops-header-controls button.pops-header-control[data-type="min"] {\n	outline: 0 !important;\n	border: 0;\n	border-color: rgb(136, 136, 136, var(--pops-bd-opacity));\n	background-color: transparent;\n	color: rgb(136, 136, 136);\n	cursor: pointer;\n	transition: all 0.3s ease-in-out;\n}\nbutton.pops-header-control i {\n	color: rgb(144, 147, 153);\n	font-size: inherit;\n	display: inline-flex;\n	justify-content: center;\n	align-items: center;\n	position: relative;\n	fill: currentColor;\n}\nbutton.pops-header-control svg {\n	height: 1.25em;\n	width: 1.25em;\n}\nbutton.pops-header-control {\n	right: 15px;\n	padding: 0;\n	border: none;\n	outline: 0;\n	background: 0 0;\n	cursor: pointer;\n	position: unset;\n	line-height: normal;\n}\nbutton.pops-header-control i:hover {\n	color: rgb(64, 158, 255);\n}\n.pops-header-controls[data-margin] button.pops-header-control {\n	margin: 0 6px;\n	display: flex;\n	align-items: center;\n}\n.pops[type-value] .pops-header-controls {\n	display: flex;\n	gap: 6px;\n}\n\n/* 代码块 <code> */\n.pops code {\n	font-family: Menlo, Monaco, Consolas, "Courier New", monospace;\n	font-size: 0.85em;\n	color: #000;\n	background-color: #f0f0f0;\n	border-radius: 3px;\n	border: 0;\n	padding: 0.2em 0;\n	white-space: normal;\n	background: #f5f5f5;\n	text-wrap: wrap;\n	text-align: left;\n	word-spacing: normal;\n	word-break: normal;\n	word-wrap: normal;\n	line-height: 1.4;\n	-moz-tab-size: 8;\n	-o-tab-size: 8;\n	tab-size: 8;\n	-webkit-hyphens: none;\n	-moz-hyphens: none;\n	-ms-hyphens: none;\n	hyphens: none;\n	direction: ltr;\n}\n\n.pops code::before,\n.pops code::after {\n	letter-spacing: -0.2em;\n	content: "\\00a0";\n}\n\n/* 标题 */\n.pops .pops-title {\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n	user-select: none;\n\n	display: flex;\n	align-items: center;\n	justify-content: space-between;\n	border-bottom: 1px solid var(--pops-title-border-color);\n	width: 100%;\n	height: var(--container-title-height);\n}\n/* 标题-普通文本 */\n.pops .pops-title p[pops] {\n	color: var(--pops-title-color);\n	width: 100%;\n	overflow: hidden;\n	text-indent: 15px;\n	text-overflow: ellipsis;\n	white-space: nowrap;\n	font-weight: 500;\n	line-height: normal;\n}\n\n/* 内容 */\n.pops .pops-content {\n	width: 100%;\n	/*height: calc(\n		100% - var(--container-title-height) - var(--container-bottom-btn-height)\n	);*/\n	flex: 1;\n	overflow: auto;\n	word-break: break-word;\n}\n/* 内容-普通文本 */\n.pops .pops-content p[pops] {\n	color: var(--pops-content-color);\n	padding: 5px 10px;\n	text-indent: 15px;\n}\n\n/* 底部-按钮组 */\n.pops .pops-botttom-btn-controls {\n	display: flex;\n	padding: 10px 10px 10px 10px;\n	width: 100%;\n	height: var(--container-bottom-btn-height);\n	max-height: var(--container-bottom-btn-height);\n	line-height: normal;\n	border-top: 1px solid var(--pops-bottom-btn-controls-border-color);\n	text-align: right;\n	align-items: center;\n}\n';
  var ninePalaceGridPositionCSS = '.pops[position="top_left"] {\n	position: fixed;\n	top: 0;\n	left: 0;\n}\n.pops[position="top"] {\n	position: fixed;\n	top: 0;\n	left: 50%;\n	transform: translateX(-50%);\n}\n.pops[position="top_right"] {\n	position: fixed;\n	top: 0;\n	right: 0;\n}\n.pops[position="center_left"] {\n	position: fixed;\n	top: 50%;\n	left: 0;\n	transform: translateY(-50%);\n}\n.pops[position="center"] {\n	position: fixed;\n	top: 50%;\n	left: 50%;\n	transform: translate(-50%, -50%);\n}\n.pops[position="center_right"] {\n	position: fixed;\n	top: 50%;\n	right: 0;\n	transform: translateY(-50%);\n}\n.pops[position="bottom_left"] {\n	position: fixed;\n	bottom: 0;\n	left: 0;\n}\n.pops[position="bottom"] {\n	position: fixed;\n	bottom: 0;\n	left: 50%;\n	transform: translate(-50%, 0);\n}\n.pops[position="bottom_right"] {\n	position: fixed;\n	right: 0;\n	bottom: 0;\n}\n';
  var scrollbarCSS = "/* ::-webkit-scrollbar 是非标准的css */\n/* https://caniuse.com/?search=%20%3A%3A-webkit-scrollbar */\n.pops ::-webkit-scrollbar {\n	width: 6px;\n	height: 0;\n}\n\n/* 滚动条轨道 */\n.pops ::-webkit-scrollbar-track {\n	width: 0;\n}\n/* 滚动条滑块 */\n.pops ::-webkit-scrollbar-thumb {\n	min-height: 28px;\n	border-radius: 2em;\n	background: rgb(204, 204, 204, var(--pops-bg-opacity, 1));\n	background-clip: padding-box;\n}\n/* 滚动条滑块 */\n.pops ::-webkit-scrollbar-thumb:hover {\n	background: rgb(178, 178, 178, var(--pops-bg-opacity, 1));\n}\n";
  var buttonCSS = '.pops {\n	--button-font-size: 14px;\n	--button-height: 32px;\n	--button-color: rgb(51, 51, 51);\n	--button-bd-color: rgb(220, 223, 230, var(--pops-bd-opacity));\n	--button-bg-color: rgb(220, 223, 230, var(--pops-bg-opacity));\n	--button-margin-top: 0px;\n	--button-margin-bottom: 0px;\n	--button-margin-left: 5px;\n	--button-margin-right: 5px;\n	--button-padding-top: 6px;\n	--button-padding-bottom: 6px;\n	--button-padding-left: 12px;\n	--button-padding-right: 12px;\n	--button-radius: 4px;\n\n	--container-title-height: 55px;\n	--container-bottom-btn-height: 55px;\n\n	/* default按钮 */\n	--button-default-color: #333333;\n	--button-default-bd-color: #dcdfe6;\n	--button-default-bg-color: #ffffff;\n	--button-default-active-color: #409eff;\n	--button-default-active-bd-color: #409eff;\n	--button-default-active-bg-color: #ecf5ff;\n	--button-default-hover-color: #409eff;\n	--button-default-hover-bd-color: #c6e2ff;\n	--button-default-hover-bg-color: #ecf5ff;\n	--button-default-focus-visible-outline-color: #a0cfff;\n	--button-default-focus-visible-outline: 2px solid var(--button-default-focus-visible-outline-color);\n	--button-default-focus-visible-outline-offset: 1px;\n	--button-default-disabled-color: #a8abb2;\n	--button-default-disabled-bd-color: #ffffff;\n	--button-default-disabled-bg-color: #e4e7ed;\n\n	/* primary按钮 */\n	--button-primary-color: #ffffff;\n	--button-primary-bd-color: #409eff;\n	--button-primary-bg-color: #409eff;\n	--button-primary-active-color: #ffffff;\n	--button-primary-active-bd-color: #337ecc;\n	--button-primary-active-bg-color: #337ecc;\n	--button-primary-hover-color: #ffffff;\n	--button-primary-hover-bd-color: #79bbff;\n	--button-primary-hover-bg-color: #79bbff;\n	--button-primary-focus-visible-outline-color: #a0cfff;\n	--button-primary-focus-visible-outline: 2px solid var(--button-primary-focus-visible-outline-color);\n	--button-primary-focus-visible-outline-offset: 1px;\n	--button-primary-disabled-color: #ffffff80;\n	--button-primary-disabled-bd-color: #a0cfff;\n	--button-primary-disabled-bg-color: #a0cfff;\n\n	/* success按钮 */\n	--button-success-color: #ffffff;\n	--button-success-bd-color: #4cae4c;\n	--button-success-bg-color: #5cb85c;\n	--button-success-active-color: #ffffff;\n	--button-success-active-bd-color: #529b2e;\n	--button-success-active-bg-color: #529b2e;\n	--button-success-hover-color: #ffffff;\n	--button-success-hover-bd-color: #95d475;\n	--button-success-hover-bg-color: #95d475;\n	--button-success-focus-visible-outline-color: #b3e19d;\n	--button-success-focus-visible-outline: 2px solid var(--button-success-focus-visible-outline-color);\n	--button-success-focus-visible-outline-offset: 1px;\n	--button-success-disabled-color: #ffffff80;\n	--button-success-disabled-bd-color: #b3e19d;\n	--button-success-disabled-bg-color: #b3e19d;\n\n	/* info按钮 */\n	--button-info-color: #ffffff;\n	--button-info-bd-color: #909399;\n	--button-info-bg-color: #909399;\n	--button-info-active-color: #ffffff;\n	--button-info-active-bd-color: #73767a;\n	--button-info-active-bg-color: #73767a;\n	--button-info-hover-color: #ffffff;\n	--button-info-hover-bd-color: #b1b3b8;\n	--button-info-hover-bg-color: #b1b3b8;\n	--button-info-focus-visible-outline-color: #c8c9cc;\n	--button-info-focus-visible-outline: 2px solid var(--button-info-focus-visible-outline-color);\n	--button-info-focus-visible-outline-offset: 1px;\n	--button-info-disabled-color: #ffffff80;\n	--button-info-disabled-bd-color: #c8c9cc;\n	--button-info-disabled-bg-color: #c8c9cc;\n\n	/* warning按钮 */\n	--button-warning-color: #ffffff;\n	--button-warning-bd-color: #e6a23c;\n	--button-warning-bg-color: #e6a23c;\n	--button-warning-active-color: #ffffff;\n	--button-warning-active-bd-color: #b88230;\n	--button-warning-active-bg-color: #b88230;\n	--button-warning-hover-color: #ffffff80;\n	--button-warning-hover-bd-color: #eebe77;\n	--button-warning-hover-bg-color: #eebe77;\n	--button-warning-focus-visible-outline-color: #f3d19e;\n	--button-warning-focus-visible-outline: 2px solid var(--button-warning-focus-visible-outline-color);\n	--button-warning-focus-visible-outline-offset: 1px;\n	--button-warning-disabled-color: #ffffff80;\n	--button-warning-disabled-bd-color: #f3d19e;\n	--button-warning-disabled-bg-color: #f3d19e;\n\n	/* danger按钮 */\n	--button-danger-color: #ffffff;\n	--button-danger-bd-color: #f56c6c;\n	--button-danger-bg-color: #f56c6c;\n	--button-danger-active-color: #ffffff;\n	--button-danger-active-bd-color: #c45656;\n	--button-danger-active-bg-color: #c45656;\n	--button-danger-hover-color: #ffffff;\n	--button-danger-hover-bd-color: #f89898;\n	--button-danger-hover-bg-color: #f89898;\n	--button-danger-focus-visible-outline-color: #fab6b6;\n	--button-danger-focus-visible-outline: 2px solid var(--button-danger-focus-visible-outline-color);\n	--button-danger-focus-visible-outline-offset: 1px;\n	--button-danger-disabled-color: #ffffff80;\n	--button-danger-disabled-bd-color: #fab6b6;\n	--button-danger-disabled-bg-color: #fab6b6;\n\n	/* xiaomi-primary按钮 */\n	--button-xiaomi-primary-color: #ffffff;\n	--button-xiaomi-primary-bd-color: #ff5c00;\n	--button-xiaomi-primary-bg-color: #ff5c00;\n	--button-xiaomi-primary-active-color: #ffffff;\n	--button-xiaomi-primary-active-bd-color: #da4f00;\n	--button-xiaomi-primary-active-bg-color: #da4f00;\n	--button-xiaomi-primary-hover-color: #ffffff;\n	--button-xiaomi-primary-hover-bd-color: #ff7e29;\n	--button-xiaomi-primary-hover-bg-color: #ff7e29;\n	--button-xiaomi-primary-focus-visible-outline-color: #ffa061;\n	--button-xiaomi-primary-focus-visible-outline: 2px solid\n		var(--button-xiaomi-primary-focus-visible-outline-color);\n	--button-xiaomi-primary-focus-visible-outline-offset: 1px;\n	--button-xiaomi-primary-disabled-color: #ffffff80;\n	--button-xiaomi-primary-disabled-bd-color: #fad5b6;\n	--button-xiaomi-primary-disabled-bg-color: #fad5b6;\n\n	/* violet按钮 */\n	--button-violet-color: #ffffff;\n	--button-violet-bd-color: #626aef;\n	--button-violet-bg-color: #626aef;\n	--button-violet-active-color: #ffffff;\n	--button-violet-active-bd-color: #8188f2;\n	--button-violet-active-bg-color: #8188f2;\n	--button-violet-hover-color: #ffffff;\n	--button-violet-hover-bd-color: #4b50ad;\n	--button-violet-hover-bg-color: #4b50ad;\n	--button-violet-focus-visible-outline-color: #2a598a;\n	--button-violet-focus-visible-outline: 2px solid var(--button-violet-focus-visible-outline-color);\n	--button-violet-focus-visible-outline-offset: 1px;\n	--button-violet-disabled-color: #ffffff80;\n	--button-violet-disabled-bd-color: #3b3f82;\n	--button-violet-disabled-bg-color: #3b3f82;\n}\n\n@media (prefers-color-scheme: dark) {\n	.pops {\n		/* default按钮 */\n		--button-default-color: #cfd3dc;\n		--button-default-bd-color: #4c4d4f;\n		--button-default-bg-color: transparent;\n		--button-default-active-color: #409eff;\n		--button-default-active-bd-color: #409eff;\n		--button-default-active-bg-color: #18222c;\n		--button-default-hover-color: #409eff;\n		--button-default-hover-bd-color: #213d5b;\n		--button-default-hover-bg-color: #18222c;\n		--button-default-focus-visible-outline-color: #2a598a;\n		--button-default-focus-visible-outline: 2px solid var(--button-default-focus-visible-outline-color);\n		--button-default-focus-visible-outline-offset: 1px;\n		--button-default-disabled-color: #ffffff80;\n		--button-default-disabled-bd-color: #414243;\n		--button-default-disabled-bg-color: transparent;\n\n		/* primary按钮 */\n		--button-primary-color: #ffffff;\n		--button-primary-bd-color: #409eff;\n		--button-primary-bg-color: #409eff;\n		--button-primary-active-color: #ffffff;\n		--button-primary-active-bd-color: #66b1ff;\n		--button-primary-active-bg-color: #66b1ff;\n		--button-primary-hover-color: #ffffff;\n		--button-primary-hover-bd-color: #3375b9;\n		--button-primary-hover-bg-color: #3375b9;\n		--button-primary-focus-visible-outline-color: #2a598a;\n		--button-primary-focus-visible-outline: 2px solid var(--button-primary-focus-visible-outline-color);\n		--button-primary-focus-visible-outline-offset: 1px;\n		--button-primary-disabled-color: #ffffff80;\n		--button-primary-disabled-bd-color: #2a598a;\n		--button-primary-disabled-bg-color: #2a598a;\n\n		/* success按钮 */\n		--button-success-color: #ffffff;\n		--button-success-bd-color: #67c23a;\n		--button-success-bg-color: #67c23a;\n		--button-success-active-color: #ffffff;\n		--button-success-active-bd-color: #85ce61;\n		--button-success-active-bg-color: #85ce61;\n		--button-success-hover-color: #ffffff;\n		--button-success-hover-bd-color: #4e8e2f;\n		--button-success-hover-bg-color: #4e8e2f;\n		--button-success-focus-visible-outline-color: #3e6b27;\n		--button-success-focus-visible-outline: 2px solid var(--button-success-focus-visible-outline-color);\n		--button-success-focus-visible-outline-offset: 1px;\n		--button-success-disabled-color: #ffffff80;\n		--button-success-disabled-bd-color: #3e6b27;\n		--button-success-disabled-bg-color: #3e6b27;\n\n		/* info按钮 */\n		--button-info-color: #ffffff;\n		--button-info-bd-color: #909399;\n		--button-info-bg-color: #909399;\n		--button-info-active-color: #ffffff;\n		--button-info-active-bd-color: #a6a9ad;\n		--button-info-active-bg-color: #a6a9ad;\n		--button-info-hover-color: #ffffff;\n		--button-info-hover-bd-color: #6b6d71;\n		--button-info-hover-bg-color: #6b6d71;\n		--button-info-focus-visible-outline-color: #525457;\n		--button-info-focus-visible-outline: 2px solid var(--button-info-focus-visible-outline-color);\n		--button-info-focus-visible-outline-offset: 1px;\n		--button-info-disabled-color: #ffffff80;\n		--button-info-disabled-bd-color: #525457;\n		--button-info-disabled-bg-color: #525457;\n\n		/* warning按钮 */\n		--button-warning-color: #ffffff;\n		--button-warning-bd-color: #e6a23c;\n		--button-warning-bg-color: #e6a23c;\n		--button-warning-active-color: #ffffff;\n		--button-warning-active-bd-color: #ebb563;\n		--button-warning-active-bg-color: #ebb563;\n		--button-warning-hover-color: #ffffff80;\n		--button-warning-hover-bd-color: #a77730;\n		--button-warning-hover-bg-color: #a77730;\n		--button-warning-focus-visible-outline-color: #7d5b28;\n		--button-warning-focus-visible-outline: 2px solid var(--button-warning-focus-visible-outline-color);\n		--button-warning-focus-visible-outline-offset: 1px;\n		--button-warning-disabled-color: #ffffff80;\n		--button-warning-disabled-bd-color: #7d5b28;\n		--button-warning-disabled-bg-color: #7d5b28;\n\n		/* danger按钮 */\n		--button-danger-color: #ffffff;\n		--button-danger-bd-color: #f56c6c;\n		--button-danger-bg-color: #f56c6c;\n		--button-danger-active-color: #ffffff;\n		--button-danger-active-bd-color: #f78989;\n		--button-danger-active-bg-color: #f78989;\n		--button-danger-hover-color: #ffffff;\n		--button-danger-hover-bd-color: #b25252;\n		--button-danger-hover-bg-color: #b25252;\n		--button-danger-focus-visible-outline-color: #854040;\n		--button-danger-focus-visible-outline: 2px solid var(--button-danger-focus-visible-outline-color);\n		--button-danger-focus-visible-outline-offset: 1px;\n		--button-danger-disabled-color: #ffffff80;\n		--button-danger-disabled-bd-color: #854040;\n		--button-danger-disabled-bg-color: #854040;\n	}\n}\n.pops[data-bottom-btn="false"] {\n	--container-bottom-btn-height: 0px;\n}\n.pops button {\n	white-space: nowrap;\n	float: right;\n	display: inline-block;\n	margin: var(--button-margin-top) var(--button-margin-right) var(--button-margin-bottom)\n		var(--button-margin-left);\n	padding: var(--button-padding-top) var(--button-padding-right) var(--button-padding-bottom)\n		var(--button-padding-left);\n	outline: 0;\n}\n.pops button[data-has-icon="false"] .pops-bottom-icon {\n	display: none;\n}\n.pops button {\n	border-radius: var(--button-radius);\n	box-shadow: none;\n	font-weight: 400;\n	font-size: var(--button-font-size);\n	cursor: pointer;\n	transition: all 0.3s ease-in-out;\n}\n.pops button {\n	display: flex;\n	align-items: center;\n	height: var(--button-height);\n	line-height: normal;\n	box-sizing: border-box;\n	user-select: none;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n	border: 1px solid var(--button-bd-color);\n}\n.pops button {\n	color: var(--button-color);\n	border-color: var(--button-bd-color);\n	background-color: var(--button-bg-color);\n}\n.pops button:active {\n	color: var(--button-color);\n	border-color: var(--button-bd-color);\n	background-color: var(--button-bg-color);\n	outline: 0;\n}\n.pops button:hover {\n	color: var(--button-color);\n	border-color: var(--button-bd-color);\n	background-color: var(--button-bg-color);\n}\n.pops button:focus-visible {\n	color: var(--button-color);\n	border-color: var(--button-bd-color);\n	background-color: var(--button-bg-color);\n}\n.pops button:disabled {\n	cursor: not-allowed;\n	color: var(--button-color);\n	border-color: var(--button-bd-color);\n	background-color: var(--button-bg-color);\n}\n.pops button.pops-button-large {\n	--button-height: 32px;\n	--button-padding-top: 12px;\n	--button-padding-bottom: 12px;\n	--button-padding-left: 19px;\n	--button-padding-right: 19px;\n	--button-font-size: 14px;\n	--button-border-radius: 4px;\n}\n\n.pops button.pops-button-small {\n	--button-height: 24px;\n	--button-padding-top: 5px;\n	--button-padding-bottom: 5px;\n	--button-padding-left: 11px;\n	--button-padding-right: 11px;\n	--button-font-size: 12px;\n	--button-border-radius: 4px;\n}\n.pops-panel-button-no-icon .pops-panel-button_inner i {\n	display: none;\n}\n.pops-panel-button-right-icon .pops-panel-button_inner {\n	flex-direction: row-reverse;\n}\n.pops-panel-button .pops-panel-button_inner i:has(svg),\n.pops-panel-button-right-icon .pops-panel-button-text {\n	margin-right: 6px;\n}\n\n.pops button[data-type="default"] {\n	--button-color: var(--button-default-color);\n	--button-bd-color: var(--button-default-bd-color);\n	--button-bg-color: var(--button-default-bg-color);\n}\n.pops button[data-type="default"]:active {\n	--button-color: var(--button-default-active-color);\n	--button-bd-color: var(--button-default-active-bd-color);\n	--button-bg-color: var(--button-default-active-bg-color);\n}\n.pops button[data-type="default"]:hover {\n	--button-color: var(--button-default-hover-color);\n	--button-bd-color: var(--button-default-hover-bd-color);\n	--button-bg-color: var(--button-default-hover-bg-color);\n}\n.pops button[data-type="default"]:focus-visible {\n	outline: var(--button-default-focus-visible-outline);\n	outline-offset: var(--button-default-focus-visible-outline-offset);\n}\n.pops button[data-type="default"]:disabled {\n	--button-color: var(--button-default-disabled-color);\n	--button-bd-color: var(--button-default-disabled-bd-color);\n	--button-bg-color: var(--button-default-disabled-bg-color);\n}\n\n.pops button[data-type="primary"] {\n	--button-color: var(--button-primary-color);\n	--button-bd-color: var(--button-primary-bd-color);\n	--button-bg-color: var(--button-primary-bg-color);\n}\n.pops button[data-type="primary"]:active {\n	--button-color: var(--button-primary-active-color);\n	--button-bd-color: var(--button-primary-active-bd-color);\n	--button-bg-color: var(--button-primary-active-bg-color);\n}\n.pops button[data-type="primary"]:hover {\n	--button-color: var(--button-primary-hover-color);\n	--button-bd-color: var(--button-primary-hover-bd-color);\n	--button-bg-color: var(--button-primary-hover-bg-color);\n}\n.pops button[data-type="primary"]:focus-visible {\n	outline: var(--button-primary-focus-visible-outline);\n	outline-offset: var(--button-primary-focus-visible-outline-offset);\n}\n.pops button[data-type="primary"]:disabled {\n	--button-color: var(--button-primary-disabled-color);\n	--button-bd-color: var(--button-primary-disabled-bd-color);\n	--button-bg-color: var(--button-primary-disabled-bg-color);\n}\n\n.pops button[data-type="success"] {\n	--button-color: var(--button-success-color);\n	--button-bd-color: var(--button-success-bd-color);\n	--button-bg-color: var(--button-success-bg-color);\n}\n.pops button[data-type="success"]:active {\n	--button-color: var(--button-success-active-color);\n	--button-bd-color: var(--button-success-active-bd-color);\n	--button-bg-color: var(--button-success-active-bg-color);\n}\n.pops button[data-type="success"]:hover {\n	--button-color: var(--button-success-hover-color);\n	--button-bd-color: var(--button-success-hover-bd-color);\n	--button-bg-color: var(--button-success-hover-bg-color);\n}\n.pops button[data-type="success"]:focus-visible {\n	outline: var(--button-success-focus-visible-outline);\n	outline-offset: var(--button-success-focus-visible-outline-offset);\n}\n.pops button[data-type="success"]:disabled {\n	--button-color: var(--button-success-disabled-color);\n	--button-bd-color: var(--button-success-disabled-bd-color);\n	--button-bg-color: var(--button-success-disabled-bg-color);\n}\n\n.pops button[data-type="info"] {\n	--button-color: var(--button-info-color);\n	--button-bd-color: var(--button-info-bd-color);\n	--button-bg-color: var(--button-info-bg-color);\n}\n.pops button[data-type="info"]:active {\n	--button-color: var(--button-info-active-color);\n	--button-bd-color: var(--button-info-active-bd-color);\n	--button-bg-color: var(--button-info-active-bg-color);\n}\n.pops button[data-type="info"]:hover {\n	--button-color: var(--button-info-hover-color);\n	--button-bd-color: var(--button-info-hover-bd-color);\n	--button-bg-color: var(--button-info-hover-bg-color);\n}\n.pops button[data-type="info"]:focus-visible {\n	outline: var(--button-info-focus-visible-outline);\n	outline-offset: var(--button-info-focus-visible-outline-offset);\n}\n.pops button[data-type="info"]:disabled {\n	--button-color: var(--button-info-disabled-color);\n	--button-bd-color: var(--button-info-disabled-bd-color);\n	--button-bg-color: var(--button-info-disabled-bg-color);\n}\n\n.pops button[data-type="warning"] {\n	--button-color: var(--button-warning-color);\n	--button-bd-color: var(--button-warning-bd-color);\n	--button-bg-color: var(--button-warning-bg-color);\n}\n.pops button[data-type="warning"]:active {\n	--button-color: var(--button-warning-active-color);\n	--button-bd-color: var(--button-warning-active-bd-color);\n	--button-bg-color: var(--button-warning-active-bg-color);\n}\n.pops button[data-type="warning"]:hover {\n	--button-color: var(--button-warning-hover-color);\n	--button-bd-color: var(--button-warning-hover-bd-color);\n	--button-bg-color: var(--button-warning-hover-bg-color);\n}\n.pops button[data-type="warning"]:focus-visible {\n	outline: var(--button-warning-focus-visible-outline);\n	outline-offset: var(--button-warning-focus-visible-outline-offset);\n}\n.pops button[data-type="warning"]:disabled {\n	--button-color: var(--button-warning-disabled-color);\n	--button-bd-color: var(--button-warning-disabled-bd-color);\n	--button-bg-color: var(--button-warning-disabled-bg-color);\n}\n\n.pops button[data-type="danger"] {\n	--button-color: var(--button-danger-color);\n	--button-bd-color: var(--button-danger-bd-color);\n	--button-bg-color: var(--button-danger-bg-color);\n}\n.pops button[data-type="danger"]:active {\n	--button-color: var(--button-danger-active-color);\n	--button-bd-color: var(--button-danger-active-bd-color);\n	--button-bg-color: var(--button-danger-active-bg-color);\n}\n.pops button[data-type="danger"]:hover {\n	--button-color: var(--button-danger-hover-color);\n	--button-bd-color: var(--button-danger-hover-bd-color);\n	--button-bg-color: var(--button-danger-hover-bg-color);\n}\n.pops button[data-type="danger"]:focus-visible {\n	outline: var(--button-danger-focus-visible-outline);\n	outline-offset: var(--button-danger-focus-visible-outline-offset);\n}\n.pops button[data-type="danger"]:disabled {\n	--button-color: var(--button-danger-disabled-color);\n	--button-bd-color: var(--button-danger-disabled-bd-color);\n	--button-bg-color: var(--button-danger-disabled-bg-color);\n}\n\n.pops button[data-type="xiaomi-primary"] {\n	--button-color: var(--button-xiaomi-primary-color);\n	--button-bd-color: var(--button-xiaomi-primary-bd-color);\n	--button-bg-color: var(--button-xiaomi-primary-bg-color);\n}\n.pops button[data-type="xiaomi-primary"]:active {\n	--button-color: var(--button-xiaomi-primary-active-color);\n	--button-bd-color: var(--button-xiaomi-primary-active-bd-color);\n	--button-bg-color: var(--button-xiaomi-primary-active-bg-color);\n}\n.pops button[data-type="xiaomi-primary"]:hover {\n	--button-color: var(--button-xiaomi-primary-hover-color);\n	--button-bd-color: var(--button-xiaomi-primary-hover-bd-color);\n	--button-bg-color: var(--button-xiaomi-primary-hover-bg-color);\n}\n.pops button[data-type="xiaomi-primary"]:focus-visible {\n	outline: var(--button-xiaomi-primary-focus-visible-outline);\n	outline-offset: var(--button-xiaomi-primary-focus-visible-outline-offset);\n}\n.pops button[data-type="xiaomi-primary"]:disabled {\n	--button-color: var(--button-xiaomi-primary-disabled-color);\n	--button-bd-color: var(--button-xiaomi-primary-disabled-bd-color);\n	--button-bg-color: var(--button-xiaomi-primary-disabled-bg-color);\n}\n\n.pops button[data-type="violet"] {\n	--button-color: var(--button-violet-color);\n	--button-bd-color: var(--button-violet-bd-color);\n	--button-bg-color: var(--button-violet-bg-color);\n}\n.pops button[data-type="violet"]:active {\n	--button-color: var(--button-violet-active-color);\n	--button-bd-color: var(--button-violet-active-bd-color);\n	--button-bg-color: var(--button-violet-active-bg-color);\n}\n.pops button[data-type="violet"]:hover {\n	--button-color: var(--button-violet-hover-color);\n	--button-bd-color: var(--button-violet-hover-bd-color);\n	--button-bg-color: var(--button-violet-hover-bg-color);\n}\n.pops button[data-type="violet"]:focus-visible {\n	outline: var(--button-violet-focus-visible-outline);\n	outline-offset: var(--button-violet-focus-visible-outline-offset);\n}\n.pops button[data-type="violet"]:disabled {\n	--button-color: var(--button-violet-disabled-color);\n	--button-bd-color: var(--button-violet-disabled-bd-color);\n	--button-bg-color: var(--button-violet-disabled-bg-color);\n}\n';
  var commonCSS = ".pops-flex-items-center {\n	display: flex;\n	align-items: center;\n}\n.pops-flex-y-center {\n	display: flex;\n	justify-content: space-between;\n}\n.pops-flex-x-center {\n	display: flex;\n	align-content: center;\n}\n.pops-hide {\n	display: none;\n}\n.pops-hide-important {\n	display: none !important;\n}\n.pops-no-border {\n	border: 0;\n}\n.pops-no-border-important {\n	border: 0 !important;\n}\n.pops-user-select-none {\n	user-select: none;\n	-webkit-user-select: none;\n	-ms-user-select: none;\n	-moz-user-select: none;\n}\n.pops-line-height-center {\n	line-height: normal;\n	align-content: center;\n}\n.pops-width-fill {\n	width: -webkit-fill-available;\n	width: -moz-available;\n}\n.pops-text-is-disabled {\n	--pops-text-is-disabled-color: #a8abb2;\n	color: var(--pops-text-is-disabled-color);\n	--pops-panel-forms-container-item-left-desc-text-color: var(--pops-text-is-disabled-color);\n}\n.pops-text-is-disabled-important {\n	--pops-text-is-disabled-color: #a8abb2;\n	color: var(--pops-text-is-disabled-color) !important;\n	--pops-panel-forms-container-item-left-desc-text-color: var(--pops-text-is-disabled-color) !important;\n}\n";
  var animCSS = '@keyframes rotating {\n	0% {\n		transform: rotate(0);\n	}\n	to {\n		transform: rotate(360deg);\n	}\n}\n@keyframes iframeLoadingChange_85 {\n	0% {\n		background: linear-gradient(to right, #4995dd, #fff, rgb(202 224 246));\n	}\n	20% {\n		background: linear-gradient(to right, #4995dd, #ead0d0, rgb(123 185 246));\n	}\n	40% {\n		background: linear-gradient(to right, #4995dd, #f4b7b7, rgb(112 178 244));\n	}\n	60% {\n		background: linear-gradient(to right, #4995dd, #ec9393, rgb(80 163 246));\n	}\n	80% {\n		background: linear-gradient(to right, #4995dd, #e87f7f, rgb(25 139 253));\n	}\n	100% {\n		background: linear-gradient(to right, #4995dd, #ee2c2c, rgb(0 124 247));\n	}\n	from {\n		width: 75%;\n	}\n	to {\n		width: 100%;\n	}\n}\n@keyframes iframeLoadingChange {\n	0% {\n		background: linear-gradient(to right, #4995dd, #fff, rgb(202 224 246));\n	}\n	20% {\n		background: linear-gradient(to right, #4995dd, #ead0d0, rgb(123 185 246));\n	}\n	40% {\n		background: linear-gradient(to right, #4995dd, #f4b7b7, rgb(112 178 244));\n	}\n	60% {\n		background: linear-gradient(to right, #4995dd, #ec9393, rgb(80 163 246));\n	}\n	80% {\n		background: linear-gradient(to right, #4995dd, #e87f7f, rgb(25 139 253));\n	}\n	100% {\n		background: linear-gradient(to right, #4995dd, #ee2c2c, rgb(0 124 247));\n	}\n	from {\n		width: 0;\n	}\n	to {\n		width: 75%;\n	}\n}\n\n@keyframes searchSelectFalIn {\n	from {\n		opacity: 0;\n		display: none;\n	}\n	to {\n		display: block;\n		opacity: 1;\n	}\n}\n@keyframes searchSelectFalOut {\n	from {\n		display: block;\n		opacity: 1;\n	}\n	to {\n		opacity: 0;\n		display: none;\n	}\n}\n\n@keyframes pops-anim-wait-rotate {\n	form {\n		transform: rotate(0);\n	}\n	to {\n		transform: rotate(360deg);\n	}\n}\n@keyframes pops-anim-spread {\n	0% {\n		opacity: 0;\n		transform: scaleX(0);\n	}\n	100% {\n		opacity: 1;\n		transform: scaleX(1);\n	}\n}\n@keyframes pops-anim-shake {\n	0%,\n	100% {\n		transform: translateX(0);\n	}\n	10%,\n	30%,\n	50%,\n	70%,\n	90% {\n		transform: translateX(-10px);\n	}\n	20%,\n	40%,\n	60%,\n	80% {\n		transform: translateX(10px);\n	}\n}\n@keyframes pops-anim-rolling-left {\n	0% {\n		opacity: 0;\n		transform: translateX(-100%) rotate(-120deg);\n	}\n	100% {\n		opacity: 1;\n		transform: translateX(0) rotate(0);\n	}\n}\n@keyframes pops-anim-rolling-right {\n	0% {\n		opacity: 0;\n		transform: translateX(100%) rotate(120deg);\n	}\n	100% {\n		opacity: 1;\n		transform: translateX(0) rotate(0);\n	}\n}\n@keyframes pops-anim-slide-top {\n	0% {\n		opacity: 0;\n		transform: translateY(-200%);\n	}\n	100% {\n		opacity: 1;\n		transform: translateY(0);\n	}\n}\n@keyframes pops-anim-slide-bottom {\n	0% {\n		opacity: 0;\n		transform: translateY(200%);\n	}\n	100% {\n		opacity: 1;\n		transform: translateY(0);\n	}\n}\n@keyframes pops-anim-slide-left {\n	0% {\n		opacity: 0;\n		transform: translateX(-200%);\n	}\n	100% {\n		opacity: 1;\n		transform: translateX(0);\n	}\n}\n@keyframes pops-anim-slide-right {\n	0% {\n		transform: translateX(200%);\n	}\n	100% {\n		opacity: 1;\n		transform: translateX(0);\n	}\n}\n@keyframes pops-anim-fadein {\n	0% {\n		opacity: 0;\n	}\n	100% {\n		opacity: 1;\n	}\n}\n@keyframes pops-anim-fadein-zoom {\n	0% {\n		opacity: 0;\n		transform: scale(0.5);\n	}\n	100% {\n		opacity: 1;\n		transform: scale(1);\n	}\n}\n@keyframes pops-anim-fadein-alert {\n	0% {\n		transform: scale(0.5);\n	}\n	45% {\n		transform: scale(1.05);\n	}\n	80% {\n		transform: scale(0.95);\n	}\n	100% {\n		transform: scale(1);\n	}\n}\n@keyframes pops-anim-don {\n	0% {\n		opacity: 0;\n		transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	2.08333% {\n		transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	4.16667% {\n		transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	6.25% {\n		transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	8.33333% {\n		transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	10.4167% {\n		transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	12.5% {\n		transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	14.5833% {\n		transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	16.6667% {\n		transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	18.75% {\n		transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	20.8333% {\n		transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	22.9167% {\n		transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	25% {\n		transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	27.0833% {\n		transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	29.1667% {\n		transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	31.25% {\n		transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	33.3333% {\n		transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	35.4167% {\n		transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	37.5% {\n		transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	39.5833% {\n		transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	41.6667% {\n		transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	43.75% {\n		transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	45.8333% {\n		transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	47.9167% {\n		transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	50% {\n		opacity: 1;\n		transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	52.0833% {\n		transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	54.1667% {\n		transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	56.25% {\n		transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	58.3333% {\n		transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	60.4167% {\n		transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	62.5% {\n		transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	64.5833% {\n		transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	66.6667% {\n		transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	68.75% {\n		transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	70.8333% {\n		transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	72.9167% {\n		transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	75% {\n		transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	77.0833% {\n		transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	79.1667% {\n		transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	81.25% {\n		transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	83.3333% {\n		transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	85.4167% {\n		transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	87.5% {\n		transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	89.5833% {\n		transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	91.6667% {\n		transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	93.75% {\n		transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	95.8333% {\n		transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	97.9167% {\n		transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	100% {\n		opacity: 1;\n		transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n}\n@keyframes pops-anim-roll {\n	0% {\n		transform: perspective(1000px) rotate3d(1, 0, 0, 90deg);\n	}\n	100% {\n		transform: perspective(1000px) rotate3d(1, 0, 0, 0deg);\n	}\n}\n@keyframes pops-anim-sandra {\n	0% {\n		opacity: 0;\n		transform: scale3d(1.1, 1.1, 1);\n	}\n	100% {\n		opacity: 1;\n		transform: scale3d(1, 1, 1);\n	}\n}\n@keyframes pops-anim-gather {\n	0% {\n		opacity: 0;\n		transform: scale(5, 0);\n	}\n	100% {\n		opacity: 1;\n		transform: scale(1, 1);\n	}\n}\n@keyframes pops-anim-spread-reverse {\n	0% {\n		opacity: 1;\n		transform: scaleX(1);\n	}\n	100% {\n		opacity: 0;\n		transform: scaleX(0);\n	}\n}\n@keyframes pops-anim-shake-reverse {\n	0%,\n	100% {\n		transform: translateX(10px);\n	}\n	10%,\n	30%,\n	50%,\n	70%,\n	90% {\n		transform: translateX(-10px);\n	}\n	20%,\n	40%,\n	60%,\n	80% {\n		transform: translateX(0);\n	}\n}\n@keyframes pops-anim-rolling-left-reverse {\n	0% {\n		opacity: 1;\n		transform: translateX(0) rotate(0);\n	}\n	100% {\n		opacity: 0;\n		transform: translateX(-100%) rotate(-120deg);\n	}\n}\n@keyframes pops-anim-rolling-right-reverse {\n	0% {\n		opacity: 1;\n		transform: translateX(0) rotate(0);\n	}\n	100% {\n		opacity: 0;\n		transform: translateX(100%) rotate(120deg);\n	}\n}\n@keyframes pops-anim-slide-top-reverse {\n	0% {\n		opacity: 1;\n		transform: translateY(0);\n	}\n	100% {\n		opacity: 0;\n		transform: translateY(-200%);\n	}\n}\n@keyframes pops-anim-slide-bottom-reverse {\n	0% {\n		opacity: 1;\n		transform: translateY(0);\n	}\n	100% {\n		opacity: 0;\n		transform: translateY(200%);\n	}\n}\n@keyframes pops-anim-slide-left-reverse {\n	0% {\n		opacity: 1;\n		transform: translateX(0);\n	}\n	100% {\n		opacity: 0;\n		transform: translateX(-200%);\n	}\n}\n@keyframes pops-anim-slide-right-reverse {\n	0% {\n		opacity: 1;\n		transform: translateX(0);\n	}\n	100% {\n		transform: translateX(200%);\n	}\n}\n@keyframes pops-anim-fadein-reverse {\n	0% {\n		opacity: 1;\n	}\n	100% {\n		opacity: 0;\n	}\n}\n@keyframes pops-anim-fadein-zoom-reverse {\n	0% {\n		opacity: 1;\n		transform: scale(1);\n	}\n	100% {\n		opacity: 0;\n		transform: scale(0.5);\n	}\n}\n@keyframes pops-anim-fadein-alert-reverse {\n	0% {\n		transform: scale(1);\n	}\n	45% {\n		transform: scale(0.95);\n	}\n	80% {\n		transform: scale(1.05);\n	}\n	100% {\n		transform: scale(0.5);\n	}\n}\n@keyframes pops-anim-don-reverse {\n	100% {\n		opacity: 0;\n		transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	97.9167% {\n		transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	95.8333% {\n		transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	93.75% {\n		transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	91.6667% {\n		transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	89.5833% {\n		transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	87.5% {\n		transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	85.4167% {\n		transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	83.3333% {\n		transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	81.25% {\n		transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	79.1667% {\n		transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	77.0833% {\n		transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	75% {\n		transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	72.9167% {\n		transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	70.8333% {\n		transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	68.75% {\n		transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	66.6667% {\n		transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	64.5833% {\n		transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	62.5% {\n		transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	60.4167% {\n		transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	58.3333% {\n		transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	56.25% {\n		transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	54.1667% {\n		transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	52.0833% {\n		transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	50% {\n		opacity: 1;\n		transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	47.9167% {\n		transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	45.8333% {\n		transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	43.75% {\n		transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	41.6667% {\n		transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	39.5833% {\n		transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	37.5% {\n		transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	35.4167% {\n		transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	33.3333% {\n		transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	31.25% {\n		transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	29.1667% {\n		transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	27.0833% {\n		transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	25% {\n		transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	22.9167% {\n		transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	20.8333% {\n		transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	18.75% {\n		transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	16.6667% {\n		transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	14.5833% {\n		transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	12.5% {\n		transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	10.4167% {\n		transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	8.33333% {\n		transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	6.25% {\n		transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	4.16667% {\n		transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	2.08333% {\n		transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n	0% {\n		opacity: 1;\n		transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n	}\n}\n@keyframes pops-anim-roll-reverse {\n	0% {\n		transform: perspective(1000px) rotate3d(1, 0, 0, 0deg);\n	}\n	100% {\n		transform: perspective(1000px) rotate3d(1, 0, 0, 90deg);\n	}\n}\n@keyframes pops-anim-sandra-reverse {\n	0% {\n		opacity: 1;\n		transform: scale3d(1, 1, 1);\n	}\n	100% {\n		opacity: 0;\n		transform: scale3d(1.1, 1.1, 1);\n	}\n}\n@keyframes pops-anim-gather-reverse {\n	0% {\n		opacity: 0;\n		transform: scale(5, 0);\n	}\n	100% {\n		opacity: 0;\n		transform: scale(5, 0);\n	}\n}\n\n@-webkit-keyframes pops-motion-fadeInTop {\n	0% {\n		opacity: 0;\n		-webkit-transform: translateY(-30px);\n		transform: translateY(-30px);\n	}\n	100% {\n		opacity: 1;\n		-webkit-transform: translateX(0);\n		transform: translateX(0);\n	}\n}\n@keyframes pops-motion-fadeInTop {\n	0% {\n		opacity: 0;\n		transform: translateY(-30px);\n		-ms-transform: translateY(-30px);\n	}\n	100% {\n		opacity: 1;\n		transform: translateX(0);\n		-ms-transform: translateX(0);\n	}\n}\n@-webkit-keyframes pops-motion-fadeOutTop {\n	0% {\n		opacity: 10;\n		-webkit-transform: translateY(0);\n		transform: translateY(0);\n	}\n	100% {\n		opacity: 0;\n		-webkit-transform: translateY(-30px);\n		transform: translateY(-30px);\n	}\n}\n@keyframes pops-motion-fadeOutTop {\n	0% {\n		opacity: 1;\n		transform: translateY(0);\n		-ms-transform: translateY(0);\n	}\n	100% {\n		opacity: 0;\n		transform: translateY(-30px);\n		-ms-transform: translateY(-30px);\n	}\n}\n@-webkit-keyframes pops-motion-fadeInBottom {\n	0% {\n		opacity: 0;\n		-webkit-transform: translateY(20px);\n		transform: translateY(20px);\n	}\n	100% {\n		opacity: 1;\n		-webkit-transform: translateY(0);\n		transform: translateY(0);\n	}\n}\n@keyframes pops-motion-fadeInBottom {\n	0% {\n		opacity: 0;\n		-webkit-transform: translateY(20px);\n		transform: translateY(20px);\n		-ms-transform: translateY(20px);\n	}\n	100% {\n		opacity: 1;\n		-webkit-transform: translateY(0);\n		transform: translateY(0);\n		-ms-transform: translateY(0);\n	}\n}\n@-webkit-keyframes pops-motion-fadeOutBottom {\n	0% {\n		opacity: 1;\n		-webkit-transform: translateY(0);\n		transform: translateY(0);\n	}\n	100% {\n		opacity: 0;\n		-webkit-transform: translateY(20px);\n		transform: translateY(20px);\n	}\n}\n@keyframes pops-motion-fadeOutBottom {\n	0% {\n		opacity: 1;\n		-webkit-transform: translateY(0);\n		transform: translateY(0);\n		-ms-transform: translateY(0);\n	}\n	100% {\n		opacity: 0;\n		-webkit-transform: translateY(20px);\n		transform: translateY(20px);\n		-ms-transform: translateY(20px);\n	}\n}\n@-webkit-keyframes pops-motion-fadeInLeft {\n	0% {\n		opacity: 0;\n		-webkit-transform: translateX(-20px);\n		transform: translateX(-20px);\n	}\n	100% {\n		opacity: 1;\n		-webkit-transform: translateX(0);\n		transform: translateX(0);\n	}\n}\n@keyframes pops-motion-fadeInLeft {\n	0% {\n		opacity: 0;\n		-webkit-transform: translateX(-30px);\n		transform: translateX(-30px);\n		-ms-transform: translateX(-30px);\n	}\n	100% {\n		opacity: 1;\n		-webkit-transform: translateX(0);\n		transform: translateX(0);\n		-ms-transform: translateX(0);\n	}\n}\n@-webkit-keyframes pops-motion-fadeOutLeft {\n	0% {\n		opacity: 1;\n		-webkit-transform: translateX(0);\n		transform: translateX(0);\n	}\n	100% {\n		opacity: 0;\n		-webkit-transform: translateX(-30px);\n		transform: translateX(-30px);\n	}\n}\n@keyframes pops-motion-fadeOutLeft {\n	0% {\n		opacity: 1;\n		-webkit-transform: translateX(0);\n		transform: translateX(0);\n		-ms-transform: translateX(0);\n	}\n	100% {\n		opacity: 0;\n		-webkit-transform: translateX(-20px);\n		transform: translateX(-20px);\n		-ms-transform: translateX(-20px);\n	}\n}\n@-webkit-keyframes pops-motion-fadeInRight {\n	0% {\n		opacity: 0;\n		-webkit-transform: translateX(20px);\n		transform: translateX(20px);\n	}\n	100% {\n		opacity: 1;\n		-webkit-transform: translateX(0);\n		transform: translateX(0);\n	}\n}\n@keyframes pops-motion-fadeInRight {\n	0% {\n		opacity: 0;\n		-webkit-transform: translateX(20px);\n		transform: translateX(20px);\n		-ms-transform: translateX(20px);\n	}\n	100% {\n		opacity: 1;\n		-webkit-transform: translateX(0);\n		transform: translateX(0);\n		-ms-transform: translateX(0);\n	}\n}\n@-webkit-keyframes pops-motion-fadeOutRight {\n	0% {\n		opacity: 1;\n		-webkit-transform: translateX(0);\n		transform: translateX(0);\n	}\n	100% {\n		opacity: 0;\n		-webkit-transform: translateX(20px);\n		transform: translateX(20px);\n	}\n}\n@keyframes pops-motion-fadeOutRight {\n	0% {\n		opacity: 1;\n		-webkit-transform: translateX(0);\n		transform: translateX(0);\n		-ms-transform: translateX(0);\n	}\n	100% {\n		opacity: 0;\n		-webkit-transform: translateX(20px);\n		transform: translateX(20px);\n		-ms-transform: translateX(20px);\n	}\n}\n\n/* 动画 */\n.pops-anim[anim="pops-anim-spread"] {\n	animation: pops-anim-spread 0.3s;\n}\n.pops-anim[anim="pops-anim-shake"] {\n	animation: pops-anim-shake 0.3s;\n}\n.pops-anim[anim="pops-anim-rolling-left"] {\n	animation: pops-anim-rolling-left 0.3s;\n}\n.pops-anim[anim="pops-anim-rolling-right"] {\n	animation: pops-anim-rolling-right 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-top"] {\n	animation: pops-anim-slide-top 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-bottom"] {\n	animation: pops-anim-slide-bottom 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-left"] {\n	animation: pops-anim-slide-left 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-right"] {\n	animation: pops-anim-slide-right 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein"] {\n	animation: pops-anim-fadein 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein-zoom"] {\n	animation: pops-anim-fadein-zoom 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein-alert"] {\n	animation: pops-anim-fadein-alert 0.3s;\n}\n.pops-anim[anim="pops-anim-don"] {\n	animation: pops-anim-don 0.3s;\n}\n.pops-anim[anim="pops-anim-roll"] {\n	animation: pops-anim-roll 0.3s;\n}\n.pops-anim[anim="pops-anim-sandra"] {\n	animation: pops-anim-sandra 0.3s;\n}\n.pops-anim[anim="pops-anim-gather"] {\n	animation: pops-anim-gather 0.3s;\n}\n.pops-anim[anim="pops-anim-spread-reverse"] {\n	animation: pops-anim-spread-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-shake-reverse"] {\n	animation: pops-anim-shake-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-rolling-left-reverse"] {\n	animation: pops-anim-rolling-left-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-rolling-right-reverse"] {\n	animation: pops-anim-rolling-right-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-top-reverse"] {\n	animation: pops-anim-slide-top-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-bottom-reverse"] {\n	animation: pops-anim-slide-bottom-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-left-reverse"] {\n	animation: pops-anim-slide-left-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-right-reverse"] {\n	animation: pops-anim-slide-right-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein-reverse"] {\n	animation: pops-anim-fadein-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein-zoom-reverse"] {\n	animation: pops-anim-fadein-zoom-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein-alert-reverse"] {\n	animation: pops-anim-fadein-alert-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-don-reverse"] {\n	animation: pops-anim-don-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-roll-reverse"] {\n	animation: pops-anim-roll-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-sandra-reverse"] {\n	animation: pops-anim-sandra-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-gather-reverse"] {\n	animation: pops-anim-gather-reverse 0.3s;\n}\n';
  var alertCSS = "";
  var confirmCSS = "";
  var promptCSS = '.pops[type-value="prompt"] {\n	--input-color: #000000;\n	--input-bg-color: none;\n	--input-placeholder-color: #a1a4ac;\n}\n.pops[type-value="prompt"] input[pops],\n.pops[type-value="prompt"] textarea[pops] {\n	width: 100%;\n	height: 100%;\n	outline: 0;\n	border: 0;\n	color: var(--input-color);\n	background-color: var(--input-bg-color);\n}\n\n.pops[type-value="prompt"] input[pops] {\n	padding: 5px 10px;\n}\n.pops[type-value="prompt"] textarea[pops] {\n	padding: 5px 10px;\n	resize: none;\n}\n\n.pops[type-value="prompt"] input[pops]::placeholder,\n.pops[type-value="prompt"] textarea[pops]::placeholder {\n	color: var(--input-placeholder-color);\n}\n@media (prefers-color-scheme: dark) {\n	.pops[type-value="prompt"] {\n		--input-color: #ffffff;\n		--input-bg-color: #333333;\n		--input-placeholder-color: #8d9095;\n	}\n}\n';
  var loadingCSS = '.pops[type-value="loading"] {\n	--loading-bd-color: rgba(0, 0, 0, 0.2);\n	--loading-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n	--loading-box-shadow-color: rgb(0 0 0 / 50%);\n	--loading-icon-color: rgba(100, 149, 237, 0.1);\n	--loading-icon-bd-top-color: rgb(100, 149, 237, var(--pops-bd-opacity));\n}\n.pops[type-value="loading"] {\n	position: absolute;\n	top: 272.5px;\n	top: 50%;\n	left: 26px;\n	left: 50%;\n	display: flex;\n	overflow: hidden;\n	padding: 10px 15px;\n	max-width: 100%;\n	max-height: 100%;\n	min-width: 0;\n	min-height: 0;\n	border: 1px solid var(--loading-bd-color);\n	border-radius: 5px;\n	background-color: var(--loading-bg-color);\n	box-shadow: 0 0 5px var(--loading-box-shadow-color);\n	vertical-align: middle;\n	transition: all 0.35s;\n	transform: translate(-50%, -50%);\n	user-select: none;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n	flex-direction: column;\n	align-items: center;\n	justify-content: center;\n	align-content: center;\n}\n.pops[type-value="loading"]:before {\n	float: left;\n	display: inline-block;\n	width: 2em;\n	height: 2em;\n	border: 0.3em solid var(--loading-icon-color);\n	border-top: 0.3em solid var(--loading-icon-bd-top-color);\n	border-radius: 50%;\n	content: " ";\n	vertical-align: middle;\n	font-size: inherit;\n	animation: pops-anim-wait-rotate 1.2s linear infinite;\n}\n.pops[type-value="loading"] .pops-loading-content {\n	position: static;\n	top: 0;\n	bottom: 0;\n	float: left;\n	overflow: hidden;\n	width: auto;\n	font-size: inherit;\n	line-height: normal;\n	align-content: center;\n}\n\n@media (prefers-color-scheme: dark) {\n	.pops[type-value="loading"] {\n		--loading-bg-color: #222222;\n	}\n}\n';
  var iframeCSS = '.pops[type-value="iframe"] {\n	--container-title-height: 55px;\n	transition:\n		width 0.35s ease,\n		height 0.35s ease;\n}\n.pops[type-value="iframe"] .pops-content {\n	overflow: hidden;\n}\n.pops-loading {\n	position: absolute;\n	top: 40px;\n	right: 0;\n	bottom: 0;\n	left: 0;\n	z-index: 5;\n	background-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n}\n.pops-loading:before {\n	position: absolute;\n	top: 50%;\n	left: 50%;\n	z-index: 3;\n	display: block;\n	margin: -20px 0 0 -20px;\n	padding: 20px;\n	border: 4px solid rgb(221, 221, 221, var(--pops-bd-opacity));\n	border-radius: 50%;\n	content: "";\n	border-top-color: transparent;\n	animation: pops-anim-wait-rotate 1.2s linear infinite;\n}\n.pops[type-value="iframe"].pops[type-module="min"] {\n	bottom: 0;\n	max-width: 200px;\n	max-height: 53px;\n	position: unset;\n}\n.pops[type-value="iframe"].pops[type-module="min"] .pops-header-control[data-type="min"] {\n	display: none;\n}\n.pops[type-value="iframe"].pops-iframe-unset-top {\n	top: unset !important;\n}\n.pops[type-value="iframe"].pops-iframe-unset-left {\n	left: unset !important;\n}\n.pops[type-value="iframe"].pops-iframe-unset-transform {\n	transform: none !important;\n}\n.pops[type-value="iframe"].pops-iframe-unset-transition {\n	transition: none !important;\n}\n.pops[type-value="iframe"].pops[type-module="max"] {\n	width: 100% !important;\n	height: 100% !important;\n}\n.pops[type-value="iframe"] iframe[pops] {\n	width: 100%;\n	height: 100%;\n	border: 0;\n}\n.pops-iframe-content-global-loading {\n	position: absolute;\n	top: 0;\n	left: 0;\n	z-index: 999999;\n	width: 0;\n	height: 4px;\n	background: linear-gradient(to right, #4995dd, #fff, rgb(202 224 246));\n	animation: iframeLoadingChange 2s forwards;\n}\n\n.pops-anim:has(.pops[type-value="iframe"].pops[type-module="min"]) {\n	position: unset;\n}\n';
  var tooltipCSS = '.pops-tip {\n	--pops-bg-opacity: 1;\n	--tooltip-color: #4e4e4e;\n	--tooltip-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n	--tooltip-bd-radius: 2px;\n	--tooltip-box-shadow-left-color: rgba(0, 0, 0, 0.24);\n	--tooltip-box-shadow-right-color: rgba(0, 0, 0, 0.12);\n	--tooltip-font-size: 14px;\n	--tooltip-padding-top: 13px;\n	--tooltip-padding-right: 13px;\n	--tooltip-padding-bottom: 13px;\n	--tooltip-padding-left: 13px;\n\n	--tooltip-arrow-box-shadow-left-color: rgba(0, 0, 0, 0.24);\n	--tooltip-arrow-box-shadow-right-color: rgba(0, 0, 0, 0.12);\n	--tooltip-arrow--after-color: rgb(78, 78, 78);\n	--tooltip-arrow--after-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n	--tooltip-arrow--after-width: 12px;\n	--tooltip-arrow--after-height: 12px;\n}\n.pops-tip {\n	padding: var(--tooltip-padding-top) var(--tooltip-padding-right) var(--tooltip-padding-bottom)\n		var(--tooltip-padding-left);\n	max-width: 400px;\n	max-height: 300px;\n	border-radius: var(--tooltip-bd-radius);\n	background-color: var(--tooltip-bg-color);\n	box-shadow:\n		0 1.5px 4px var(--tooltip-box-shadow-left-color),\n		0 1.5px 6px var(--tooltip-box-shadow-right-color);\n	color: var(--tooltip-color);\n	font-size: var(--tooltip-font-size);\n}\n.pops-tip[data-position="absolute"] {\n	position: absolute;\n}\n.pops-tip[data-position="fixed"] {\n	position: fixed;\n}\n\n.pops-tip .pops-tip-arrow {\n	position: absolute;\n	top: 100%;\n	left: 50%;\n	overflow: hidden;\n	width: 100%;\n	height: 12.5px;\n	transform: translateX(-50%);\n}\n\n.pops-tip .pops-tip-arrow::after {\n	position: absolute;\n	top: 0;\n	left: 50%;\n	width: var(--tooltip-arrow--after-width);\n	height: var(--tooltip-arrow--after-height);\n	background: var(--tooltip-arrow--after-bg-color);\n	color: var(--tooltip-arrow--after-color);\n	box-shadow:\n		0 1px 7px var(--tooltip-arrow-box-shadow-left-color),\n		0 1px 7px var(--tooltip-arrow-box-shadow-right-color);\n	content: "";\n	transform: translateX(-50%) translateY(-50%) rotate(45deg);\n}\n\n.pops-tip .pops-tip-arrow[data-position="bottom"] {\n	position: absolute;\n	top: 100%;\n	left: 50%;\n	overflow: hidden;\n	width: 100%;\n	height: 12.5px;\n	transform: translateX(-50%);\n}\n\n.pops-tip .pops-tip-arrow[data-position="bottom"]:after {\n	position: absolute;\n	top: 0;\n	left: 50%;\n	width: var(--tooltip-arrow--after-width);\n	height: var(--tooltip-arrow--after-height);\n	background: var(--tooltip-arrow--after-bg-color);\n	box-shadow:\n		0 1px 7px var(--tooltip-arrow-box-shadow-left-color),\n		0 1px 7px var(--tooltip-arrow-box-shadow-right-color);\n	content: "";\n	transform: translateX(-50%) translateY(-50%) rotate(45deg);\n}\n\n.pops-tip .pops-tip-arrow[data-position="left"] {\n	top: 50%;\n	left: -12.5px;\n	width: 12.5px;\n	height: 50px;\n	transform: translateY(-50%);\n}\n\n.pops-tip .pops-tip-arrow[data-position="left"]:after {\n	position: absolute;\n	top: 50%;\n	left: 100%;\n	content: "";\n}\n\n.pops-tip .pops-tip-arrow[data-position="right"] {\n	top: 50%;\n	right: -12.5px;\n	left: auto;\n	width: 12.5px;\n	height: 50px;\n	transform: translateY(-50%);\n}\n\n.pops-tip .pops-tip-arrow[data-position="right"]:after {\n	position: absolute;\n	top: 50%;\n	left: 0;\n	content: "";\n}\n\n.pops-tip .pops-tip-arrow[data-position="top"] {\n	top: -12.5px;\n	left: 50%;\n	transform: translateX(-50%);\n}\n\n.pops-tip .pops-tip-arrow[data-position="top"]:after {\n	position: absolute;\n	top: 100%;\n	left: 50%;\n	content: "";\n}\n\n.pops-tip[data-motion] {\n	-webkit-animation-duration: 0.25s;\n	animation-duration: 0.25s;\n	-webkit-animation-fill-mode: forwards;\n	animation-fill-mode: forwards;\n}\n.pops-tip[data-motion="fadeOutRight"] {\n	-webkit-animation-name: pops-motion-fadeOutRight;\n	animation-name: pops-motion-fadeOutRight;\n}\n.pops-tip[data-motion="fadeInTop"] {\n	-webkit-animation-name: pops-motion-fadeInTop;\n	animation-name: pops-motion-fadeInTop;\n	animation-timing-function: cubic-bezier(0.49, 0.49, 0.13, 1.3);\n}\n.pops-tip[data-motion="fadeOutTop"] {\n	-webkit-animation-name: pops-motion-fadeOutTop;\n	animation-name: pops-motion-fadeOutTop;\n	animation-timing-function: cubic-bezier(0.32, 0.37, 0.06, 0.87);\n}\n.pops-tip[data-motion="fadeInBottom"] {\n	-webkit-animation-name: pops-motion-fadeInBottom;\n	animation-name: pops-motion-fadeInBottom;\n}\n.pops-tip[data-motion="fadeOutBottom"] {\n	-webkit-animation-name: pops-motion-fadeOutBottom;\n	animation-name: pops-motion-fadeOutBottom;\n}\n.pops-tip[data-motion="fadeInLeft"] {\n	-webkit-animation-name: pops-motion-fadeInLeft;\n	animation-name: pops-motion-fadeInLeft;\n}\n.pops-tip[data-motion="fadeOutLeft"] {\n	-webkit-animation-name: pops-motion-fadeOutLeft;\n	animation-name: pops-motion-fadeOutLeft;\n}\n.pops-tip[data-motion="fadeInRight"] {\n	-webkit-animation-name: pops-motion-fadeInRight;\n	animation-name: pops-motion-fadeInRight;\n}\n\n/* github的样式 */\n.pops-tip.github-tooltip {\n	--tooltip-bg-opacity: 1;\n	--tooltip-color: #ffffff;\n	--tooltip-bg-color: rgb(36, 41, 47, var(--tooltip-bg-opacity));\n	--tooltip-bd-radius: 6px;\n	--tooltip-padding-top: 6px;\n	--tooltip-padding-right: 8px;\n	--tooltip-padding-bottom: 6px;\n	--tooltip-padding-left: 8px;\n\n	--tooltip-arrow--after-color: rgb(255, 255, 255);\n	--tooltip-arrow--after-bg-color: rgb(36, 41, 47, var(--tooltip-bg-opacity));\n	--tooltip-arrow--after-width: 8px;\n	--tooltip-arrow--after-height: 8px;\n}\n\n@media (prefers-color-scheme: dark) {\n	.pops-tip {\n		--tooltip-color: #ffffff;\n		--tooltip-bg-color: #fafafa;\n		--tooltip-arrow--after-color: #fafafa;\n		--tooltip-arrow--after-bg-color: rgb(250, 250, 250, var(--pops-bg-opacity));\n	}\n}\n';
  var drawerCSS = '.pops[type-value="drawer"] {\n	position: fixed;\n	box-sizing: border-box;\n	display: flex;\n	flex-direction: column;\n	box-shadow:\n		0px 16px 48px 16px rgba(0, 0, 0, 0.08),\n		0px 12px 32px rgba(0, 0, 0, 0.12),\n		0px 8px 16px -8px rgba(0, 0, 0, 0.16);\n	overflow: hidden;\n	transition: all 0.3s;\n}\n\n.pops[type-value="drawer"][direction="top"] {\n	width: 100%;\n	left: 0;\n	right: 0;\n	top: 0;\n}\n.pops[type-value="drawer"][direction="bottom"] {\n	width: 100%;\n	left: 0;\n	right: 0;\n	bottom: 0;\n}\n.pops[type-value="drawer"][direction="left"] {\n	height: 100%;\n	top: 0;\n	bottom: 0;\n	left: 0;\n}\n.pops[type-value="drawer"][direction="right"] {\n	height: 100%;\n	top: 0;\n	bottom: 0;\n	right: 0;\n}\n';
  var folderCSS = '.pops-folder-list {\n	--folder-arrow-fill-color: #d4d7de;\n	--folder-arrow-active-fill-color: #06a7ff;\n	--header-breadcrumb-text-color: #06a7ff;\n	--header-breadcrumb-all-files-text-color: var(--header-breadcrumb-text-color);\n	--header-breadcrumb-all-files-first-text-color: var(--header-breadcrumb-text-color);\n	--header-breadcrumb-all-files-last-text-color: #999999;\n	--table-header-row-text-color: #818999;\n	--table-body-td-text-color: rgb(247, 248, 250, var(--pops-bg-opacity));\n	--table-body-th-text-color: rgb(247, 248, 250, var(--pops-bg-opacity));\n	--table-body-row-text-color: #05082c;\n	--table-body-row-file-name-text-color: #05082c;\n	--table-body-row-hover-bd-color: rgb(245, 246, 247, var(--pops-bg-opacity));\n	--table-body-row-hover-bg-color: rgb(245, 246, 247, var(--pops-bg-opacity));\n	--table-body-row-file-name-hover-text-color: #06a7ff;\n	--table-body-row-content-text-color: #818999;\n}\n.pops-folder-list .cursor-p {\n	cursor: pointer;\n}\n.pops-folder-list a {\n	background: 0 0;\n	text-decoration: none;\n	-webkit-tap-highlight-color: transparent;\n	color: var(--header-breadcrumb-text-color);\n}\ntable.pops-folder-list-table__body,\ntable.pops-folder-list-table__header {\n	width: 100%;\n	table-layout: fixed;\n	border-collapse: collapse;\n	border-spacing: 0;\n	padding: 0 20px;\n}\ntable.pops-folder-list-table__body,\ntable.pops-folder-list-table__header {\n	height: 100%;\n	background: 0 0;\n	overflow: hidden;\n	display: -webkit-box;\n	display: -ms-flexbox;\n	-ms-flex-direction: column;\n	-webkit-box-orient: vertical;\n	-webkit-box-direction: normal;\n}\ntable.pops-folder-list-table__body {\n	height: 100%;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n	user-select: none;\n}\n.pops-folder-list table tr {\n	line-height: normal;\n	align-content: center;\n}\n.pops-folder-list-table__header-row {\n	height: 50px;\n	line-height: normal;\n	align-content: center;\n	color: var(--table-header-row-text-color);\n	text-align: left;\n	font-size: 12px;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n	user-select: none;\n}\n.pops-folder-list-table__body-row {\n	height: 50px;\n	line-height: normal;\n	align-content: center;\n	color: var(--table-body-row-text-color);\n	font-size: 12px;\n}\n.pops-folder-list-table__body-row:hover {\n	background-color: var(--table-body-row-hover-bg-color);\n	border-color: var(--table-body-row-hover-bd-color);\n	border: 0;\n	outline: none;\n}\n.pops-folder-list table th {\n	border: 0;\n	border-bottom: 1px solid var(--table-body-th-text-color);\n}\n.pops-folder-list table td {\n	border: 0;\n	border-bottom: 1px solid var(--table-body-td-text-color);\n	position: relative;\n}\n.pops-folder-list .list-name-text {\n	display: inline-block;\n	padding-left: 12px;\n	line-height: normal;\n	align-content: center;\n	max-width: 176px;\n}\n.pops-folder-list-file-name > div {\n	display: flex;\n	align-items: center;\n}\n\n.pops-mobile-folder-list-file-name {\n	display: flex;\n	align-items: center;\n}\n.pops-mobile-folder-list-file-name > div {\n	display: flex;\n	flex-wrap: wrap;\n	justify-content: flex-start;\n	align-items: flex-start;\n	padding: 6px 0px;\n	flex-direction: column;\n}\n.pops-mobile-folder-list-file-name img.pops-folder-list-file-icon {\n	width: 45px;\n	height: 45px;\n}\n.pops-mobile-folder-list-file-name a.pops-folder-list-file-name-title-text {\n	padding-left: unset;\n	max-width: 250px;\n	overflow-x: hidden;\n	font-weight: 400;\n	line-height: unset;\n	margin-bottom: 4px;\n	white-space: normal;\n	text-overflow: unset;\n}\n\n/* 修改滚动 */\n.pops-folder-content {\n	overflow: hidden !important;\n}\n.pops-folder-content .pops-folder-list {\n	height: 100%;\n	display: flex;\n	flex-direction: column;\n}\n.pops-folder-content .pops-folder-list-table__body-div {\n	height: 100%;\n	flex: 1 auto;\n	overflow: auto;\n	padding-bottom: 0;\n}\n.pops-mobile-folder-content .pops-folder-list-table__body-div {\n	height: 100%;\n	flex: 1 auto;\n	overflow: auto;\n	padding-bottom: 0;\n}\n.pops-folder-content table.pops-folder-list-table__body {\n	overflow: auto;\n}\n.pops-folder-content .pops-folder-list-table__header-div {\n	flex: 0;\n}\n.pops-mobile-folder-content .pops-folder-list-table__header-div {\n	display: none;\n}\n\n.pops-folder-list .pops-folder-list-file-name-title-text {\n	color: var(--table-body-row-file-name-text-color);\n}\n.pops-folder-list .pops-folder-list-file-name-title-text:hover {\n	text-decoration: none;\n	color: var(--table-body-row-file-name-hover-text-color);\n}\n.pops-folder-list .text-ellip {\n	overflow: hidden;\n	white-space: nowrap;\n	text-overflow: ellipsis;\n}\n.pops-folder-list .content {\n	color: var(--table-body-row-content-text-color);\n	position: relative;\n	width: 100%;\n	text-align: left;\n}\n.pops-folder-list .inline-block-v-middle {\n	display: inline-block;\n	vertical-align: middle;\n}\n.pops-folder-list .flex-a-i-center {\n	display: flex;\n	align-items: center;\n}\n.pops-folder-list .u-file-icon {\n	display: inline-block;\n	vertical-align: middle;\n}\n.pops-folder-list .u-file-icon--list {\n	width: 32px;\n	height: 32px;\n}\n.pops-folder-list .pops-folder-list-file-icon {\n	line-height: normal;\n	align-content: center;\n	position: relative;\n	vertical-align: middle;\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb-primary {\n	flex: 1;\n	display: -webkit-box;\n	display: -webkit-flex;\n	display: -ms-flexbox;\n	display: flex;\n	-webkit-box-align: center;\n	-webkit-align-items: center;\n	-ms-flex-align: center;\n	align-items: center;\n	-webkit-box-orient: horizontal;\n	-webkit-box-direction: normal;\n	-webkit-flex-direction: row;\n	-ms-flex-direction: row;\n	flex-direction: row;\n	min-height: 17px;\n	flex-wrap: wrap;\n}\n.pops-folder-list .pops-folder-list-table__sort {\n	display: inline-flex;\n	margin-left: 4px;\n	flex-direction: column;\n}\n\n.pops-folder-list .pops-folder-icon-arrow {\n	width: 10px;\n	height: 10px;\n	fill: var(--folder-arrow-fill-color);\n}\n.pops-folder-list .pops-folder-icon-active {\n	fill: var(--folder-arrow-active-fill-color);\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb {\n	padding: 4px 20px;\n	-webkit-box-sizing: border-box;\n	box-sizing: border-box;\n	display: -webkit-box;\n	display: -webkit-flex;\n	display: -ms-flexbox;\n	display: flex;\n	-webkit-box-align: center;\n	-webkit-align-items: center;\n	-ms-flex-align: center;\n	align-items: center;\n	-webkit-box-orient: horizontal;\n	-webkit-box-direction: normal;\n	-webkit-flex-direction: row;\n	-ms-flex-direction: row;\n	flex-direction: row;\n	-webkit-box-pack: start;\n	-webkit-justify-content: start;\n	-ms-flex-pack: start;\n	justify-content: flex-start;\n	min-height: 35px;\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb-allFiles {\n	font-size: 12px;\n	color: var(--header-breadcrumb-all-files-text-color);\n	line-height: normal;\n	align-content: center;\n	font-weight: 700;\n	display: inline-block;\n	max-width: 140px;\n	overflow: hidden;\n	text-overflow: ellipsis;\n	white-space: nowrap;\n	word-wrap: normal;\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb-allFiles:last-child a {\n	color: var(--header-breadcrumb-all-files-last-text-color);\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb-allFiles:first-child a {\n	font-size: 14px;\n	color: var(--header-breadcrumb-all-files-first-text-color);\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb .iconArrow {\n	width: 16px;\n	height: 16px;\n}\n.pops-folder-list .iconArrow {\n	background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAASCAMAAABYd88+AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABFUExURUdwTOLi4uLi4t7e3uPj49/f397e3t3d3f///97e3vDw8N3d3d7e3t3d3d3d3ejo6N/f397e3t7e3t3d3d/f393d3d3d3RK+NoEAAAAWdFJOUwAnM4YPU/iQA+UIeMDaHhY41i7zX7UebpjFAAAAUElEQVQI15XOORaAIAwE0LATXHCd+x9VfCiksXCq+UUWou8oZ1vXHrt7YVBiYkW4gdMKYFIC4CSATWCNHWPuM6HuHkr1x3N0ZrBu/9gl0b9c3+kF7C7hS1YAAAAASUVORK5CYII=)\n		55% 50%/6px 9px no-repeat;\n}\n\n@media (prefers-color-scheme: dark) {\n	.pops[type-value="folder"] {\n		--pops-title-border-color: rgb(73, 83, 102, var(--pops-bg-opacity));\n		--pops-bottom-btn-controls-border-color: rgb(73, 83, 102, var(--pops-bg-opacity));\n	}\n	.pops-folder-list {\n		--header-breadcrumb-text-color: #06a7ff;\n		--header-breadcrumb-all-files-text-color: var(--header-breadcrumb-text-color);\n		--header-breadcrumb-all-files-first-text-color: var(--header-breadcrumb-text-color);\n		--header-breadcrumb-all-files-last-text-color: #818999;\n		--table-body-row-text-color: #f7f8fa;\n		--table-body-td-text-color: rgb(73, 83, 102, var(--pops-bg-opacity));\n		--table-body-th-text-color: rgb(73, 83, 102, var(--pops-bg-opacity));\n		--table-body-td-text-color: #495366;\n		--table-body-row-hover-bd-color: #1f2022;\n		--table-body-row-hover-bg-color: #1f2022;\n		--table-body-row-file-name-text-color: #f7f8fa;\n	}\n}\n';
  var panelCSS = '.pops[type-value="panel"] {\n	--pops-bg-color: #f2f2f2;\n	--pops-color: #333333;\n	--panel-title-bg-color: #ffffff;\n\n	--panel-aside-bg-color: #ffffff;\n	--panel-aside-hover-color: rgb(64, 158, 255);\n	--panel-aside-hover-bg-color: rgba(64, 158, 255, 0.1);\n\n	--pops-panel-forms-margin-top-bottom: 10px;\n	--pops-panel-forms-margin-left-right: 20px;\n	--pops-panel-forms-header-icon-size: calc(var(--pops-panel-forms-container-li-padding-left-right) + 1px);\n	--pops-panel-forms-header-padding-top-bottom: 15px;\n	--pops-panel-forms-header-padding-left-right: 10px;\n	--pops-panel-forms-container-item-left-text-gap: 6px;\n	--pops-panel-forms-container-item-left-desc-text-size: 0.8em;\n	--pops-panel-forms-container-item-left-desc-text-color: #6c6c6c;\n	--pops-panel-forms-container-item-bg-color: #ffffff;\n	--pops-panel-forms-container-item-title-color: #333;\n	--pops-panel-forms-container-item-border-radius: 6px;\n	--pops-panel-forms-container-item-margin-top-bottom: 10px;\n	--pops-panel-forms-container-item-margin-left-right: var(--pops-panel-forms-margin-left-right);\n	--pops-panel-forms-container-li-border-color: var(--pops-bd-color);\n	--pops-panel-forms-container-li-padding-top-bottom: 12px;\n	--pops-panel-forms-container-li-padding-left-right: 16px;\n\n	--pops-panel-forms-container-deepMenu-item-active-bg: #e9e9e9;\n}\n.pops[type-value="panel"] {\n	color: var(--pops-color);\n	background: var(--pops-bg-color);\n}\n.pops[type-value] .pops-panel-title {\n	background: var(--panel-title-bg-color);\n}\n\n/* ↓panel的CSS↓ */\n/* 左侧的列表 */\naside.pops-panel-aside {\n	box-sizing: border-box;\n	flex-shrink: 0;\n	max-width: 200px;\n	min-width: 100px;\n	height: 100%;\n	background: var(--panel-aside-bg-color);\n	border-right: 1px solid var(--panel-aside-bg-color);\n	font-size: 0.9em;\n	display: flex;\n	flex-direction: column;\n	justify-content: space-between;\n}\naside.pops-panel-aside {\n	user-select: none;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n}\naside.pops-panel-aside .pops-panel-aside-top-container {\n	overflow: auto;\n}\naside.pops-panel-aside ul li {\n	margin: 6px 8px;\n	border-radius: 4px;\n	padding: 6px 10px;\n	cursor: default;\n	display: flex;\n	align-items: center;\n	justify-content: flex-start;\n}\naside.pops-panel-aside .pops-is-visited,\naside.pops-panel-aside ul li:not(.pops-panel-disabled-aside-hover-css):hover {\n	color: var(--panel-aside-hover-color);\n	background: var(--panel-aside-hover-bg-color);\n}\n/* 左侧的列表 */\n\n.pops-panel-content {\n	display: flex;\n	flex-direction: row;\n	flex: 1;\n	overflow: auto;\n	flex-basis: auto;\n	box-sizing: border-box;\n	min-width: 0;\n	bottom: 0 !important;\n}\n\n.pops-panel-section-wrapper {\n	width: 100%;\n	overflow: hidden;\n	display: flex;\n	flex-direction: column;\n}\n\nsection.pops-panel-container {\n	width: 100%;\n	overflow: hidden;\n	display: flex;\n	flex-direction: column;\n}\nsection.pops-panel-container .pops-panel-container-header-ul,\nsection.pops-panel-container .pops-panel-deepMenu-container-header-ul {\n	border-bottom: 1px solid rgba(223, 223, 223, var(--pops-bg-opacity));\n	flex: 0 auto;\n}\nsection.pops-panel-container .pops-panel-container-header-ul li,\nsection.pops-panel-container .pops-panel-container-header-ul li.pops-panel-container-header-title-text {\n	display: flex;\n	justify-content: flex-start !important;\n	margin: 0px !important;\n	padding: var(--pops-panel-forms-header-padding-top-bottom)\n		calc(var(--pops-panel-forms-margin-left-right) + var(--pops-panel-forms-container-li-padding-left-right));\n	text-align: left;\n}\nsection.pops-panel-container ul.pops-panel-container-main-ul {\n	overflow: auto;\n	/*flex: 1;*/\n}\nsection.pops-panel-container > ul li:not(.pops-panel-forms-container-item) {\n	display: flex;\n	justify-content: space-between;\n	align-items: center;\n	margin: var(--pops-panel-forms-margin-top-bottom)\n		calc(var(--pops-panel-forms-margin-left-right) + var(--pops-panel-forms-margin-left-right));\n	gap: 10px;\n}\nsection.pops-panel-container .pops-panel-forms-container-item-header-text {\n	margin: 10px;\n	margin-left: calc(\n		var(--pops-panel-forms-margin-left-right) + var(--pops-panel-forms-container-li-padding-left-right)\n	);\n	font-size: 0.9em;\n	text-align: left;\n	color: var(--pops-panel-forms-container-item-title-color);\n}\nsection.pops-panel-container li.pops-panel-forms-container-item {\n	/* 去除<li>左侧的圆点 */\n	display: block;\n}\nsection.pops-panel-container .pops-panel-forms-container-item ul.pops-panel-forms-container-item-formlist {\n	border-radius: var(--pops-panel-forms-container-item-border-radius);\n	background: var(--pops-panel-forms-container-item-bg-color);\n	margin: var(--pops-panel-forms-container-item-margin-top-bottom) var(--pops-panel-forms-margin-left-right);\n}\nsection.pops-panel-container .pops-panel-forms-container-item ul.pops-panel-forms-container-item-formlist li {\n	display: flex;\n	justify-content: space-between;\n	align-items: center;\n	padding: var(--pops-panel-forms-container-li-padding-top-bottom)\n		var(--pops-panel-forms-container-li-padding-left-right);\n	margin: 0px 0px;\n	border-bottom: 1px solid var(--pops-panel-forms-container-li-border-color);\n	text-align: left;\n}\n/*section.pops-panel-container\n	.pops-panel-forms-container-item\n	ul\n	li.pops-panel-deepMenu-nav-item {\n	padding: var(--pops-panel-forms-container-li-padding-top-bottom) 0px;\n	margin: 0px var(--pops-panel-forms-container-li-padding-left-right);\n	border-bottom: 1px solid var(--pops-panel-forms-container-li-border-color);\n}*/\nsection.pops-panel-container\n	.pops-panel-forms-container-item\n	ul.pops-panel-forms-container-item-formlist\n	li:last-child {\n	border: 0px;\n}\n/* 左侧的文字 */\nsection.pops-panel-container .pops-panel-item-left-text {\n	display: flex;\n	flex-direction: column;\n	gap: var(--pops-panel-forms-container-item-left-text-gap);\n}\n\n/* 左侧的主文字 */\n/*section.pops-panel-container .pops-panel-item-left-main-text {\n	\n}*/\n/* 左侧的描述文字 */\nsection.pops-panel-container .pops-panel-item-left-desc-text {\n	font-size: var(--pops-panel-forms-container-item-left-desc-text-size);\n	color: var(--pops-panel-forms-container-item-left-desc-text-color);\n}\n\n/* 折叠面板 */\nsection.pops-panel-container .pops-panel-forms-fold {\n	border-radius: var(--pops-panel-forms-container-item-border-radius);\n	background: var(--pops-panel-forms-container-item-bg-color);\n	margin: var(--pops-panel-forms-margin-top-bottom) var(--pops-panel-forms-margin-left-right);\n}\nsection.pops-panel-container .pops-panel-forms-fold .pops-panel-forms-fold-container {\n	display: flex;\n	align-items: center;\n	fill: #6c6c6c;\n	justify-content: space-between;\n	margin: 0px var(--pops-panel-forms-container-li-padding-left-right) !important;\n	padding: var(--pops-panel-forms-container-li-padding-top-bottom) 0px !important;\n}\nsection.pops-panel-container .pops-panel-forms-fold[data-fold-enable] .pops-panel-forms-fold-container-icon {\n	transform: rotate(90deg);\n}\nsection.pops-panel-container .pops-panel-forms-fold .pops-panel-forms-fold-container-icon {\n	width: 15px;\n	height: 15px;\n	display: flex;\n	align-items: center;\n	transform: rotate(-90deg);\n	transition: transform 0.3s;\n}\n/* 折叠状态 */\nsection.pops-panel-container\n	.pops-panel-forms-fold[data-fold-enable]\n	.pops-panel-forms-container-item-formlist {\n	height: 0;\n}\n/* 非折叠状态 */\nsection.pops-panel-container .pops-panel-forms-fold ul.pops-panel-forms-container-item-formlist {\n	margin: 0;\n}\nsection.pops-panel-container .pops-panel-forms-fold .pops-panel-forms-container-item-formlist {\n	transition: height 0.3s;\n	overflow: hidden;\n	border-radius: unset;\n	background: unset;\n	margin: 0;\n	height: calc-size(auto, size);\n}\n/* 折叠面板 */\n\n/* 姑且认为小于600px的屏幕为移动端 */\n@media (max-width: 600px) {\n	/* 兼容移动端CSS */\n	.pops[type-value="panel"] {\n		--pops-panel-forms-margin-left-right: 10px;\n	}\n	.pops[type-value="panel"] {\n		width: 92%;\n		width: 92vw;\n		width: 92dvw;\n	}\n	.pops[type-value="panel"] .pops-panel-content aside.pops-panel-aside {\n		max-width: 20%;\n		min-width: auto;\n	}\n	.pops[type-value="panel"] section.pops-panel-container .pops-panel-forms-container-item > div {\n		text-align: left;\n		--pops-panel-forms-margin-left-right: 0px;\n	}\n	.pops[type-value="panel"] section.pops-panel-container .pops-panel-forms-container-item ul {\n		margin: 0px !important;\n	}\n	.pops[type-value="panel"] section.pops-panel-container > ul > li {\n		margin: 10px 10px;\n	}\n	.pops[type-value="panel"] section.pops-panel-container > ul > li div:nth-child(2) {\n		max-width: 55%;\n	}\n	.pops[type-value="panel"] section.pops-panel-container .pops-panel-select select {\n		min-width: 88px !important;\n		width: -webkit-fill-available;\n		width: -moz-available;\n	}\n	.pops[type-value="panel"] section.pops-panel-container .pops-panel-container-header-ul li {\n		font-size: 16px;\n	}\n	.pops[type-value="panel"] .pops-panel-title p[pops],\n	.pops[type-value="panel"] section.pops-panel-container > ul li,\n	.pops[type-value="panel"] aside.pops-panel-aside ul li {\n		font-size: 14px;\n	}\n}\n/* switch的CSS */\n.pops-panel-switch {\n	--panel-switch-core-bd-color: rgb(220, 223, 230, var(--pops-bd-opacity));\n	--panel-switch-core-bg-color: rgb(220, 223, 230, var(--pops-bg-opacity));\n	--panel-switch-circle-color: #dcdfe6;\n	--panel-switch-circle-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n	--panel-switch-checked-circle-color: #409eff;\n	--panel-switch-checked-core-bd-color: rgb(64, 158, 255, var(--pops-bd-opacity));\n	--panel-switch-checked-core-bg-color: rgb(64, 158, 255, var(--pops-bg-opacity));\n}\n.pops-panel-switch {\n	display: inline-flex;\n	flex-direction: row-reverse;\n	align-items: center;\n	position: relative;\n	font-size: 14px;\n	line-height: normal;\n	align-content: center;\n	height: 32px;\n	vertical-align: middle;\n	user-select: none;\n	-webkit-user-select: none;\n	-ms-user-select: none;\n	-moz-user-select: none;\n}\n.pops-panel-switch input.pops-panel-switch__input {\n	position: absolute;\n	width: 0;\n	height: 0;\n	opacity: 0;\n	margin: 0;\n}\n.pops-panel-switch:has(input.pops-panel-switch__input:disabled),\n.pops-panel-switch[data-disabled],\n.pops-panel-switch[data-disabled] .pops-panel-switch__core,\n.pops-panel-switch input.pops-panel-switch__input:disabled + .pops-panel-switch__core {\n	cursor: not-allowed;\n	opacity: 0.6;\n}\n.pops-panel-switch span.pops-panel-switch__core {\n	display: inline-flex;\n	position: relative;\n	align-items: center;\n	min-width: 40px;\n	height: 20px;\n	border: 1px solid var(--panel-switch-core-bd-color);\n	outline: 0;\n	border-radius: 10px;\n	box-sizing: border-box;\n	background: var(--panel-switch-core-bg-color);\n	cursor: pointer;\n	transition:\n		border-color 0.3s,\n		background-color 0.3s;\n}\n.pops-panel-switch .pops-panel-switch__action {\n	position: absolute;\n	left: 1px;\n	border-radius: 100%;\n	transition: all 0.3s;\n	width: 16px;\n	height: 16px;\n	display: flex;\n	justify-content: center;\n	align-items: center;\n	background-color: var(--panel-switch-circle-bg-color);\n	color: var(--panel-switch-circle-color);\n}\n.pops-panel-switch.pops-panel-switch-is-checked span.pops-panel-switch__core {\n	border-color: var(--panel-switch-checked-core-bd-color);\n	background-color: var(--panel-switch-checked-core-bg-color);\n}\n.pops-panel-switch.pops-panel-switch-is-checked .pops-panel-switch__action {\n	left: calc(100% - 17px);\n	color: var(--panel-switch-checked-circle-color);\n}\n/* switch的CSS */\n\n/* slider旧的CSS */\nsection.pops-panel-container .pops-panel-slider:has(> input[type="range"]) {\n	overflow: hidden;\n	height: 25px;\n	line-height: normal;\n	align-content: center;\n	display: flex;\n	align-items: center;\n}\nsection.pops-panel-container .pops-panel-slider input[type="range"] {\n	height: 6px;\n	background: rgb(228, 231, 237, var(--pops-bg-opacity));\n	outline: 0;\n	-webkit-appearance: none;\n	appearance: none;\n	width: 100%;\n}\nsection.pops-panel-container .pops-panel-slider input[type="range"]::-webkit-slider-thumb {\n	width: 20px;\n	height: 20px;\n	border-radius: 50%;\n	border: 1px solid rgb(64, 158, 255, var(--pops-bd-opacity));\n	background-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n	box-shadow:\n		0 0 2px rgba(0, 0, 0, 0.3),\n		0 3px 5px rgba(0, 0, 0, 0.2);\n	cursor: pointer;\n	-webkit-appearance: none;\n	appearance: none;\n	border-image: linear-gradient(#409eff, #409eff) 0 fill/9 25 9 0/0 0 0 100vw;\n}\nsection.pops-panel-container .pops-panel-slider input[type="range"]::-moz-range-thumb {\n	width: 20px;\n	height: 20px;\n	border-radius: 50%;\n	border: 1px solid rgb(64, 159, 255, var(--pops-bd-opacity));\n	background-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n	box-shadow:\n		0 0 2px rgba(0, 0, 0, 0.3),\n		0 3px 5px rgba(0, 0, 0, 0.2);\n	cursor: pointer;\n	-webkit-appearance: none;\n	appearance: none;\n}\nsection.pops-panel-container .pops-panel-slider input[type="range"]::-moz-range-progress {\n	height: 6px;\n	border-image: linear-gradient(#409eff, #409eff) 0 fill/9 25 9 0/0 0 0 100vw;\n}\n/* slider旧的CSS */\n\n/* slider的CSS */\n.pops-slider {\n	--pops-slider-color-white: #ffffff;\n	--pops-slider-color-primary: #409eff;\n	--pops-slider-color-info: #909399;\n	--pops-slider-text-color-placeholder: #a8abb2;\n	--pops-slider-border-color-light: #e4e7ed;\n	--pops-slider-border-radius-circle: 100%;\n	--pops-slider-transition-duration-fast: 0.2s;\n\n	--pops-slider-main-bg-color: var(--pops-slider-color-primary);\n	--pops-slider-runway-bg-color: var(--pops-slider-border-color-light);\n	--pops-slider-stop-bg-color: var(--pops-slider-color-white);\n	--pops-slider-disabled-color: var(--pops-slider-text-color-placeholder);\n	--pops-slider-border-radius: 3px;\n	--pops-slider-height: 6px;\n	--pops-slider-button-size: 20px;\n	--pops-slider-button-wrapper-size: 36px;\n	--pops-slider-button-wrapper-offset: -15px;\n}\n\n.pops-slider {\n	width: 100%;\n	height: 32px;\n	display: flex;\n	align-items: center;\n	user-select: none;\n	-webkit-user-select: none;\n	-ms-user-select: none;\n	-moz-user-select: none;\n}\n\n.pops-slider-width {\n	flex: 0 0 52%;\n	margin-left: 10px;\n}\n\n.pops-slider__runway {\n	flex: 1;\n	height: var(--pops-slider-height);\n	background-color: var(--pops-slider-runway-bg-color);\n	border-radius: var(--pops-slider-border-radius);\n	position: relative;\n	cursor: pointer;\n}\n\n.pops-slider__runway.show-input {\n	margin-right: 30px;\n	width: auto;\n}\n\n.pops-slider__runway.pops-slider-is-disabled {\n	cursor: default;\n}\n\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__bar {\n	background-color: var(--pops-slider-disabled-color);\n}\n\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button {\n	border-color: var(--pops-slider-disabled-color);\n}\n\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button:hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.dragging {\n	cursor: not-allowed;\n}\n\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button:hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.dragging {\n	transform: scale(1);\n}\n\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button:hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.dragging {\n	cursor: not-allowed;\n}\n\n.pops-slider__input {\n	flex-shrink: 0;\n	width: 130px;\n}\n\n.pops-slider__bar {\n	height: var(--pops-slider-height);\n	background-color: var(--pops-slider-main-bg-color);\n	border-top-left-radius: var(--pops-slider-border-radius);\n	border-bottom-left-radius: var(--pops-slider-border-radius);\n	position: absolute;\n}\n\n.pops-slider__button-wrapper {\n	height: var(--pops-slider-button-wrapper-size);\n	width: var(--pops-slider-button-wrapper-size);\n	position: absolute;\n	z-index: 1;\n	top: var(--pops-slider-button-wrapper-offset);\n	transform: translate(-50%);\n	background-color: transparent;\n	text-align: center;\n	user-select: none;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n	line-height: normal;\n	outline: none;\n}\n\n.pops-slider__button-wrapper:after {\n	display: inline-block;\n	content: "";\n	height: 100%;\n	vertical-align: middle;\n}\n\n.pops-slider__button:hover,\n.pops-slider__button.hover {\n	cursor: grab;\n}\n\n.pops-slider__button {\n	display: inline-block;\n	width: var(--pops-slider-button-size);\n	height: var(--pops-slider-button-size);\n	vertical-align: middle;\n	border: solid 2px var(--pops-slider-main-bg-color);\n	background-color: var(--pops-slider-color-white);\n	border-radius: 50%;\n	box-sizing: border-box;\n	transition: var(--pops-slider-transition-duration-fast);\n	user-select: none;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n}\n\n.pops-slider__button:hover,\n.pops-slider__button.hover,\n.pops-slider__button.dragging {\n	transform: scale(1.2);\n}\n\n.pops-slider__button:hover,\n.pops-slider__button.hover {\n	cursor: grab;\n}\n\n.pops-slider__button.dragging {\n	cursor: grabbing;\n}\n\n.pops-slider__stop {\n	position: absolute;\n	height: var(--pops-slider-height);\n	width: var(--pops-slider-height);\n	border-radius: var(--pops-slider-border-radius-circle);\n	background-color: var(--pops-slider-stop-bg-color);\n	transform: translate(-50%);\n}\n\n.pops-slider__marks {\n	top: 0;\n	left: 12px;\n	width: 18px;\n	height: 100%;\n}\n\n.pops-slider__marks-text {\n	position: absolute;\n	transform: translate(-50%);\n	font-size: 14px;\n	color: var(--pops-slider-color-info);\n	margin-top: 15px;\n	white-space: pre;\n}\n\n.pops-slider.is-vertical {\n	position: relative;\n	display: inline-flex;\n	width: auto;\n	height: 100%;\n	flex: 0;\n}\n\n.pops-slider.is-vertical .pops-slider__runway {\n	width: var(--pops-slider-height);\n	height: 100%;\n	margin: 0 16px;\n}\n\n.pops-slider.is-vertical .pops-slider__bar {\n	width: var(--pops-slider-height);\n	height: auto;\n	border-radius: 0 0 3px 3px;\n}\n\n.pops-slider.is-vertical .pops-slider__button-wrapper {\n	top: auto;\n	left: var(--pops-slider-button-wrapper-offset);\n	transform: translateY(50%);\n}\n\n.pops-slider.is-vertical .pops-slider__stop {\n	transform: translateY(50%);\n}\n\n.pops-slider.is-vertical .pops-slider__marks-text {\n	margin-top: 0;\n	left: 15px;\n	transform: translateY(50%);\n}\n\n.pops-slider--large {\n	height: 40px;\n}\n\n.pops-slider--small {\n	height: 24px;\n}\n/* slider的CSS */\n\n/* input的CSS */\n.pops-panel-input {\n	--el-disabled-text-color: #a8abb2;\n	--el-disabled-bg-color: #f5f7fa;\n	--el-disabled-border-color: #e4e7ed;\n\n	--pops-panel-components-input-text-color: #000000;\n	--pops-panel-components-input-text-bg-color: transparent;\n	--pops-panel-components-input-text-default-padding: 8px;\n	--pops-panel-components-input-bd-color: #dcdfe6;\n	--pops-panel-components-input-bg-color: #ffffff;\n	--pops-panel-components-input-hover-bd-color: #c0c4cc;\n	--pops-panel-components-input-focus-bd-color: #409eff;\n	--pops-panel-components-input-suffix-color: #a8abb2;\n	--pops-panel-components-input-suffix-bg-color: #ffffff;\n}\n.pops-panel-input {\n	display: flex;\n	align-items: center;\n	border: 1px solid var(--pops-panel-components-input-bd-color);\n	border-radius: 4px;\n	background-color: var(--pops-panel-components-input-bg-color);\n	position: relative;\n	box-shadow: none;\n}\n.pops-panel-input:hover {\n	border: 1px solid var(--pops-panel-components-input-hover-bd-color);\n}\n.pops-panel-input:has(input:disabled):hover {\n	--pops-panel-components-input-hover-bd-color: var(--pops-panel-components-input-bd-color);\n}\n.pops-panel-input:has(input:focus) {\n	outline: 0;\n	border: 1px solid var(--pops-panel-components-input-focus-bd-color);\n	border-radius: 4px;\n	box-shadow: none;\n}\n.pops-panel-input input {\n	display: inline-flex;\n	justify-content: center;\n	text-align: start;\n	align-items: center;\n	align-content: center;\n	white-space: nowrap;\n	cursor: text;\n	box-sizing: border-box;\n	user-select: none;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n	vertical-align: middle;\n	-webkit-appearance: none;\n	appearance: none;\n	color: var(--pops-panel-components-input-text-color);\n	background-color: var(--pops-panel-components-input-text-bg-color);\n	outline: 0;\n	transition: 0.1s;\n	border: 0;\n	font-size: 14px;\n	font-weight: 500;\n	line-height: normal;\n	height: 32px;\n	width: 100%;\n	flex: 1;\n	/*margin-right: calc(1em + 8px);*/\n	margin: 0px;\n	padding: var(--pops-panel-components-input-text-default-padding);\n}\n.pops-panel-input span.pops-panel-input__suffix {\n	display: inline-flex;\n	white-space: nowrap;\n	flex-shrink: 0;\n	flex-wrap: nowrap;\n	height: 100%;\n	text-align: center;\n	color: var(--pops-panel-components-input-suffix-color);\n	background: var(--pops-panel-components-input-suffix-bg-color);\n	transition: all 0.3s;\n	pointer-events: none;\n	padding: 0 8px;\n	position: absolute;\n	right: 0px;\n	border-top-right-radius: 4px;\n	border-bottom-right-radius: 4px;\n	border: 1px solid transparent;\n}\n.pops-panel-input span.pops-panel-input__suffix-inner {\n	pointer-events: all;\n	display: inline-flex;\n	align-items: center;\n	justify-content: center;\n}\n/* 如果包含清空图标的按钮,则默认隐藏清空图标,当:hover、:focus、:focus-within、:active时显示清空图标 */\n.pops-panel-input span.pops-panel-input__suffix:has(svg[data-type="circleClose"]) {\n	display: none;\n}\n.pops-panel-input:hover span.pops-panel-input__suffix:has(svg[data-type="circleClose"]),\n.pops-panel-input:focus span.pops-panel-input__suffix:has(svg[data-type="circleClose"]),\n.pops-panel-input:focus-within span.pops-panel-input__suffix:has(svg[data-type="circleClose"]),\n.pops-panel-input:active span.pops-panel-input__suffix:has(svg[data-type="circleClose"]) {\n	display: inline-flex;\n}\n.pops-panel-input .pops-panel-icon {\n	cursor: pointer;\n}\n.pops-panel-input .pops-panel-icon {\n	height: inherit;\n	line-height: normal;\n	align-content: center;\n	display: flex;\n	justify-content: center;\n	align-items: center;\n	transition: all 0.3s;\n}\n.pops-panel-input .pops-panel-icon svg {\n	height: 1em;\n	width: 1em;\n}\n\n.pops-input-disabled {\n	background-color: var(--pops-components-is-disabled-bg-color);\n}\n.pops-panel-input.pops-input-disabled:hover {\n	--pops-panel-components-input-hover-bd-color: var(--pops-panel-components-input-bd-color);\n}\n.pops-panel-input input:disabled,\n.pops-panel-input input:disabled + .pops-panel-input__suffix {\n	user-select: none;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n	color: var(--el-disabled-text-color);\n	-webkit-text-fill-color: var(--el-disabled-text-color);\n	cursor: not-allowed;\n}\n.pops-panel-input input:disabled + .pops-panel-input__suffix {\n	display: none;\n}\n/* input的CSS */\n\n/* textarea的CSS */\n.pops-panel-textarea {\n	--pops-panel-components-textarea-text-color: #000000;\n	--pops-panel-components-textarea-text-bg-color: #ffffff;\n	--pops-panel-components-textarea-bd-color: #dcdfe6;\n	--pops-panel-components-textarea-hover-bd-color: #c0c4cc;\n	--pops-panel-components-textarea-focus-bd-color: #409eff;\n}\n.pops-panel-textarea textarea {\n	width: 100%;\n	/*vertical-align: bottom;*/\n	position: relative;\n	display: block;\n	resize: none;\n	padding: 5px 11px;\n	/*line-height: 1;*/\n	box-sizing: border-box;\n	font-size: inherit;\n	font-family: inherit;\n	color: var(--pops-panel-components-textarea-text-color);\n	background-color: var(--pops-panel-components-textarea-text-bg-color);\n	background-image: none;\n	-webkit-appearance: none;\n	appearance: none;\n	box-shadow: none;\n	border-radius: 0;\n	transition: box-shadow 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);\n	border: 1px solid var(--pops-panel-components-textarea-bd-color);\n}\n.pops-panel-textarea textarea:hover {\n	border-color: var(--pops-panel-components-textarea-hover-bd-color);\n}\n.pops-panel-textarea:has(textarea:disabled):hover {\n	--pops-panel-components-textarea-hover-bd-color: var(--pops-panel-components-textarea-bd-color);\n}\n.pops-panel-textarea-disable {\n	--pops-panel-components-textarea-text-bg-color: var(--pops-components-is-disabled-bg-color) !important;\n	--pops-panel-components-textarea-text-color: var(--pops-components-is-disabled-text-color);\n}\n.pops-panel-textarea-disable textarea {\n	cursor: not-allowed;\n}\n.pops-panel-textarea textarea:focus {\n	outline: 0;\n	border-color: var(--pops-panel-components-textarea-focus-bd-color);\n}\n/* textarea的CSS */\n\n/* select的CSS */\n.pops-panel-select {\n	--pops-panel-components-select-text-color: #000000;\n	--pops-panel-components-select-bd-color: rgb(184, 184, 184, var(--pops-bd-opacity));\n	--pops-panel-components-select-hover-bd-color: rgb(184, 184, 184, var(--pops-bd-opacity));\n	--pops-panel-components-select-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n}\n.pops-panel-select {\n	border: 0;\n}\n.pops-panel-select select {\n	height: 32px;\n	line-height: normal;\n	align-content: center;\n	min-width: 200px;\n	border: 1px solid var(--pops-panel-components-select-bd-color);\n	border-radius: 5px;\n	text-align: center;\n	outline: 0;\n	color: var(--pops-panel-components-select-text-color);\n	background-color: var(--pops-panel-components-select-bg-color);\n	box-shadow: none;\n}\n.pops-panel-select select:hover {\n	border: 1px solid var(--pops-panel-components-select-hover-bd-color);\n}\n.pops-panel-select-disable {\n	--pops-panel-components-select-text-color: var(--pops-components-is-disabled-text-color);\n	--pops-panel-components-select-bg-color: var(--pops-components-is-disabled-bg-color);\n}\n.pops-panel-select-disable select {\n	cursor: not-allowed;\n}\n.pops-panel-select-disable select:hover {\n	box-shadow: none;\n	--pops-panel-components-select-hover-bd-color: var(--pops-panel-components-select-bd-color);\n}\n.pops-panel-select select:focus {\n	border: 1px solid rgb(64, 158, 255, var(--pops-bd-opacity));\n	box-shadow: none;\n}\n/* select的CSS */\n\n/* select-multiple的CSS*/\n.pops-panel-select-multiple {\n	--el-border-radius-base: 4px;\n	--el-fill-color-blank: #ffffff;\n	--el-transition-duration: 0.3s;\n	--el-border-color: #cbcbcb;\n	--el-text-color-placeholder: #a8abb2;\n	--color: inherit;\n	--el-select-input-color: #a8abb2;\n	--el-select-input-font-size: 14px;\n	--el-text-color-regular: #606266;\n	--el-color-info: #909399;\n	--el-color-info-light-9: #f4f4f5;\n	--el-color-info-light-8: #e9e9eb;\n	--el-color-primary-light-9: #ecf5ff;\n	--el-color-primary-light-8: #d9ecff;\n	--el-color-primary: #409eff;\n	--el-color-white: #ffffff;\n	width: 200px;\n}\n.pops-panel-select-multiple .el-select__wrapper {\n	display: flex;\n	align-items: center;\n	position: relative;\n	box-sizing: border-box;\n	cursor: pointer;\n	text-align: left;\n	font-size: 14px;\n	padding: 4px 12px;\n	gap: 6px;\n	min-height: 32px;\n	line-height: normal;\n	align-content: center;\n	border-radius: var(--el-border-radius-base);\n	background-color: var(--el-fill-color-blank);\n	transition: var(--el-transition-duration);\n	transform: translateZ(0);\n	border: 1px solid var(--el-border-color);\n}\n.pops-panel-select-multiple .el-select__wrapper.is-focused {\n	--el-border-color: var(--el-color-primary);\n}\n.pops-panel-select-multiple .el-select__selection {\n	position: relative;\n	display: flex;\n	flex-wrap: wrap;\n	align-items: center;\n	flex: 1;\n	min-width: 0;\n	gap: 6px;\n}\n.pops-panel-select-multiple .el-select__selected-item {\n	display: flex;\n	flex-wrap: wrap;\n	-webkit-user-select: none;\n	user-select: none;\n}\n.pops-panel-select-multiple .el-select__selected-item.el-select__choose_tag .el-tag {\n	max-width: 200px;\n}\n.pops-panel-select-multiple .el-select__input-wrapper {\n	max-width: 100%;\n}\n.pops-panel-select-multiple .el-select__selection.is-near {\n	margin-left: -8px;\n}\n.pops-panel-select-multiple .el-select__placeholder {\n	position: absolute;\n	display: block;\n	top: 50%;\n	transform: translateY(-50%);\n	width: 100%;\n	overflow: hidden;\n	text-overflow: ellipsis;\n	white-space: nowrap;\n	color: var(--el-input-text-color, var(--el-text-color-regular));\n}\n.pops-panel-select-multiple .el-select__placeholder.is-transparent {\n	-webkit-user-select: none;\n	user-select: none;\n	color: var(--el-text-color-placeholder);\n}\n.pops-panel-select-multiple .el-select__prefix,\n.pops-panel-select-multiple .el-select__suffix {\n	display: flex;\n	align-items: center;\n	flex-shrink: 0;\n	gap: 6px;\n	color: var(--el-input-icon-color, var(--el-text-color-placeholder));\n}\n.pops-panel-select-multiple .el-icon {\n	--color: inherit;\n	height: 1em;\n	width: 1em;\n	line-height: normal;\n	align-content: center;\n	display: inline-flex;\n	justify-content: center;\n	align-items: center;\n	position: relative;\n	fill: currentColor;\n	color: var(--color);\n	font-size: inherit;\n}\n.pops-panel-select-multiple .el-icon svg {\n	height: 1em;\n	width: 1em;\n}\n.pops-panel-select-multiple .el-select__caret {\n	color: var(--el-select-input-color);\n	font-size: var(--el-select-input-font-size);\n	transition: var(--el-transition-duration);\n	transform: rotate(0);\n	cursor: pointer;\n}\n.pops-panel-select-multiple .el-tag {\n	--el-tag-font-size: 12px;\n	--el-tag-border-radius: 4px;\n	--el-tag-border-radius-rounded: 9999px;\n}\n.pops-panel-select-multiple .el-tag {\n	background-color: var(--el-tag-bg-color);\n	border-color: var(--el-tag-border-color);\n	color: var(--el-tag-text-color);\n	display: inline-flex;\n	justify-content: center;\n	align-items: center;\n	vertical-align: middle;\n	height: 24px;\n	padding: 0 9px;\n	font-size: var(--el-tag-font-size);\n	line-height: normal;\n	align-content: center;\n	border-width: 1px;\n	border-style: solid;\n	border-radius: var(--el-tag-border-radius);\n	box-sizing: border-box;\n	white-space: nowrap;\n	--el-icon-size: 14px;\n	--el-tag-bg-color: var(--el-color-primary-light-9);\n	--el-tag-border-color: var(--el-color-primary-light-8);\n	--el-tag-hover-color: var(--el-color-primary);\n}\n.pops-panel-select-multiple .el-select__selection .el-tag {\n	cursor: pointer;\n	border-color: transparent;\n}\n.pops-panel-select-multiple .el-tag.el-tag--info {\n	--el-tag-bg-color: var(--el-color-info-light-9);\n	--el-tag-border-color: var(--el-color-info-light-8);\n	--el-tag-hover-color: var(--el-color-info);\n}\n.pops-panel-select-multiple .el-tag.el-tag--info {\n	--el-tag-text-color: var(--el-color-info);\n}\n.pops-panel-select-multiple .el-tag.is-closable {\n	padding-right: 5px;\n}\n.pops-panel-select-multiple .el-select__selection .el-tag .el-tag__content {\n	min-width: 0;\n}\n.pops-panel-select-multiple .el-tag .el-tag__close {\n	flex-shrink: 0;\n	color: var(--el-tag-text-color);\n}\n.pops-panel-select-multiple .el-tag .el-tag__close:hover {\n	color: var(--el-color-white);\n	background-color: var(--el-tag-hover-color);\n}\n.pops-panel-select-multiple .el-tag .el-icon {\n	border-radius: 50%;\n	cursor: pointer;\n	font-size: calc(var(--el-icon-size) - 2px);\n	height: var(--el-icon-size);\n	width: var(--el-icon-size);\n}\n.pops-panel-select-multiple .el-tag .el-tag__close {\n	margin-left: 6px;\n}\n.pops-panel-select-multiple .el-select__tags-text {\n	display: block;\n	line-height: normal;\n	align-content: center;\n	overflow: hidden;\n	text-overflow: ellipsis;\n	white-space: nowrap;\n}\n.pops-panel-select-multiple-disable {\n	--el-fill-color-blank: #f5f7fa;\n	--color: #a8abb2;\n	--el-border-color: #cbcbcb;\n}\n.pops-panel-select-multiple-disable .el-tag.el-tag--info {\n	--el-tag-bg-color: #e7e7e7;\n	--el-tag-text-color: var(--pops-components-is-disabled-text-color);\n}\n.pops-panel-select-multiple-disable .el-select__selection .el-tag,\n.pops-panel-select-multiple-disable .el-tag .el-tag__close:hover,\n.pops-panel-select-multiple-disable .el-select__wrapper,\n.pops-panel-select-multiple-disable .el-select__caret {\n	cursor: not-allowed;\n}\n/* select-multiple的CSS*/\n\n/* deepMenu的css */\n.pops-panel-deepMenu-nav-item {\n	cursor: pointer;\n}\n.pops-panel-deepMenu-nav-item:active {\n	background: var(--pops-panel-forms-container-deepMenu-item-active-bg);\n	user-select: none;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n}\nsection.pops-panel-container .pops-panel-forms-container-item ul li.pops-panel-deepMenu-nav-item:active {\n	padding: var(--pops-panel-forms-container-li-padding-top-bottom)\n		var(--pops-panel-forms-container-li-padding-left-right);\n	margin: 0px;\n}\n/* 去除上个兄弟item的底部边框颜色 */\nsection.pops-panel-container\n	.pops-panel-forms-container-item\n	ul\n	li:has(+ .pops-panel-deepMenu-nav-item:active) {\n	border-bottom: 1px solid transparent;\n}\n/* 第一个和最后一个跟随圆角 */\nsection.pops-panel-container\n	.pops-panel-forms-container-item\n	ul\n	li.pops-panel-deepMenu-nav-item:first-child:active {\n	border-top-left-radius: var(--pops-panel-forms-container-item-border-radius);\n	border-top-right-radius: var(--pops-panel-forms-container-item-border-radius);\n}\nsection.pops-panel-container\n	.pops-panel-forms-container-item\n	ul\n	li.pops-panel-deepMenu-nav-item:last-child:active {\n	border-bottom-left-radius: var(--pops-panel-forms-container-item-border-radius);\n	border-bottom-right-radius: var(--pops-panel-forms-container-item-border-radius);\n}\n.pops-panel-deepMenu-nav-item .pops-panel-deepMenu {\n	display: flex;\n	align-items: center;\n	color: #6c6c6c;\n	fill: #6c6c6c;\n}\n.pops-panel-deepMenu-nav-item .pops-panel-deepMenu-arrowRight-icon {\n	width: 15px;\n	height: 15px;\n	display: flex;\n	align-items: center;\n}\nsection.pops-panel-deepMenu-container\n	.pops-panel-container-header-ul\n	li.pops-panel-deepMenu-container-header {\n	display: flex;\n	align-items: center;\n	width: -webkit-fill-available;\n	width: -moz-available;\n	padding: var(--pops-panel-forms-header-padding-top-bottom)\n		calc(\n			var(--pops-panel-forms-margin-left-right) + var(--pops-panel-forms-container-li-padding-left-right) -\n				var(--pops-panel-forms-header-icon-size)\n		);\n	gap: 0px;\n}\n.pops-panel-deepMenu-container .pops-panel-deepMenu-container-left-arrow-icon {\n	width: var(--pops-panel-forms-header-icon-size);\n	height: var(--pops-panel-forms-header-icon-size);\n	display: flex;\n	align-items: center;\n	cursor: pointer;\n}\n/* 修复safari上图标大小未正常显示 */\n.pops-panel-deepMenu-container .pops-panel-deepMenu-container-left-arrow-icon > svg {\n	width: inherit;\n	height: inherit;\n}\n/* deepMenu的css */\n\n/* 文字对齐 */\n.pops-panel-item-left-desc-text:has(code) {\n	display: flex;\n	align-items: baseline;\n	flex-wrap: wrap;\n}\n\n@media (prefers-color-scheme: dark) {\n	.pops[type-value="panel"] {\n		--pops-bg-color: #000000;\n		--pops-color: #f2f2f2;\n		--panel-title-bg-color: #000000;\n		--panel-aside-bg-color: #262626;\n		--pops-panel-forms-container-item-left-desc-text-color: #6c6c6c;\n		--pops-panel-forms-container-item-bg-color: #262626;\n		--pops-panel-forms-container-item-title-color: #c1c1c1;\n\n		--pops-panel-forms-container-li-border-color: rgb(51, 51, 51, var(--pops-bd-opacity));\n		--pops-panel-forms-container-deepMenu-item-active-bg: #333333;\n	}\n	.pops[type-value="panel"] .pops-panel-deepMenu-container .pops-panel-deepMenu-container-left-arrow-icon {\n		fill: #f2f2f2;\n	}\n\n	/* switch的CSS */\n	.pops-panel-switch {\n		--panel-switch-core-bd-color: rgb(220, 223, 230, var(--pops-bd-opacity));\n		--panel-switch-core-bg-color: rgb(220, 223, 230, var(--pops-bg-opacity));\n		--panel-switch-circle-color: #dcdfe6;\n		--panel-switch-circle-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n		--panel-switch-checked-circle-color: #409eff;\n		--panel-switch-checked-core-bd-color: rgb(64, 158, 255, var(--pops-bd-opacity));\n		--panel-switch-checked-core-bg-color: rgb(64, 158, 255, var(--pops-bg-opacity));\n	}\n	/* select的CSS */\n	.pops-panel-select {\n		--pops-panel-components-select-text-color: #f2f2f2;\n		--pops-panel-components-select-bd-color: rgb(51, 51, 51, var(--pops-bd-opacity));\n		--pops-panel-components-select-bg-color: #141414;\n	}\n	/* select-multiple的CSS*/\n	.pops-panel-select-multiple {\n		--el-fill-color-blank: #141414;\n		--el-border-color: #4c4d4f;\n		--el-text-color-placeholder: #a8abb2;\n		--el-select-input-color: #a8abb2;\n		--el-text-color-regular: #606266;\n		--el-color-info: #909399;\n		--el-color-info-light-8: #e9e9eb;\n		--el-color-primary-light-9: #ecf5ff;\n		--el-color-primary-light-8: #d9ecff;\n		--el-color-primary: #409eff;\n		--el-color-white: #ffffff;\n	}\n	.pops-panel-select-multiple .el-tag {\n		--el-color-info-light-9: #202121;\n	}\n	.pops-panel-select-multiple-disable {\n		--el-border-color: rgb(51, 51, 51, var(--pops-bd-opacity));\n	}\n	.pops-panel-select-multiple-disable .el-tag.el-tag--info {\n		--el-tag-bg-color: #2f2f2f;\n	}\n	/* select-multiple的CSS*/\n	/* slider的CSS */\n	.pops-slider {\n		--pops-slider-border-color-light: #414243;\n	}\n	/* input的CSS */\n	.pops-panel-input {\n		--pops-panel-components-input-text-color: #f2f2f2;\n		--pops-panel-components-input-bd-color: #4f5052;\n		--pops-panel-components-input-bg-color: #141414;\n		--pops-panel-components-input-hover-bd-color: #6f7175;\n		--pops-panel-components-input-focus-bd-color: #409eff;\n		--pops-panel-components-input-suffix-color: #a8abb2;\n	}\n	/* textarea的CSS */\n	.pops-panel-textarea {\n		--pops-panel-components-textarea-text-color: #f2f2f2;\n		--pops-panel-components-textarea-text-bg-color: #141414;\n		--pops-panel-components-textarea-bd-color: #4f5052;\n		--pops-panel-components-textarea-hover-bd-color: #6f7175;\n		--pops-panel-components-textarea-focus-bd-color: #409eff;\n	}\n	.pops-panel-textarea-disable {\n		--pops-panel-components-textarea-text-color: var(--pops-components-is-disabled-text-color);\n		--pops-panel-components-textarea-text-bg-color: var(--pops-components-is-disabled-bg-color);\n	}\n	/* slider */\n	.pops-slider {\n		--pops-slider-text-color-placeholder: #8d9095;\n	}\n}\n';
  var rightClickMenuCSS = '.pops-rightClickMenu {\n	--pops-right-context-color: #000000;\n	--pops-right-context-bg-color: rgb(255, 255, 255, 0.733);\n	--pops-right-context-backdrop-filter: blur(10px);\n	--pops-right-context-z-index: 10000;\n	--pops-right-context-bd-radius: 6px;\n	--pops-right-context-menu-shadow-color: rgb(114, 114, 114, 0.251);\n	--pops-right-context-menu-row-bd-radius: 6px;\n	--pops-right-context-menu-row-visited-color: rgb(0, 0, 0, 0.067);\n	--pops-right-context-menu-row-hover-color: rgb(0, 0, 0, 0.067);\n}\n.pops-rightClickMenu * {\n	-webkit-box-sizing: border-box;\n	box-sizing: border-box;\n	margin: 0;\n	padding: 0;\n	-webkit-tap-highlight-color: transparent;\n	scrollbar-width: thin;\n}\n.pops-rightClickMenu {\n	position: fixed;\n	z-index: var(--pops-right-context-z-index);\n	text-align: center;\n	border-radius: var(--pops-right-context-bd-radius);\n	font-size: 16px;\n	font-weight: 500;\n	color: var(--pops-right-context-color);\n	background: var(--pops-right-context-bg-color);\n	box-shadow: 0 0.25rem 0.5rem 0.125rem var(--pops-right-context-menu-shadow-color);\n	-webkit-backdrop-filter: var(--pops-right-context-backdrop-filter);\n	backdrop-filter: var(--pops-right-context-backdrop-filter);\n}\n/* scale动画 */\n.pops-rightClickMenu-anim-scale {\n	transition:\n		opacity 150ms cubic-bezier(0.2, 0, 0.2, 1),\n		transform 150ms cubic-bezier(0.2, 0, 0.2, 1);\n	transform: scale(0.85);\n}\n.pops-rightClickMenu-anim-scale-open {\n	transform: scale(1);\n}\n.pops-rightClickMenu-anim-scale-not-open {\n	opacity: 0;\n}\n/* 展开动画 */\n.pops-rightClickMenu-anim-grid {\n	display: grid;\n	transition: 0.3s;\n	grid-template-rows: 0fr;\n}\n.pops-rightClickMenu-anim-show {\n	grid-template-rows: 1fr;\n}\n.pops-rightClickMenu-is-visited {\n	background: var(--pops-right-context-menu-row-visited-color);\n}\ni.pops-rightClickMenu-icon {\n	height: 1em;\n	width: 1em;\n	line-height: normal;\n	align-content: center;\n	display: inline-flex;\n	justify-content: center;\n	align-items: center;\n	position: relative;\n	fill: currentColor;\n	color: inherit;\n	font-size: inherit;\n	margin-right: 6px;\n}\ni.pops-rightClickMenu-icon[is-loading="true"] {\n	animation: rotating 2s linear infinite;\n}\n.pops-rightClickMenu li:hover {\n	background: var(--pops-right-context-menu-row-hover-color);\n	cursor: pointer;\n}\n.pops-rightClickMenu ul {\n	margin: 0;\n	padding: 0;\n	display: flex;\n	flex-direction: column;\n	align-items: flex-start;\n	justify-content: center;\n	overflow: hidden;\n}\n.pops-rightClickMenu ul li {\n	padding: 5px 10px;\n	margin: 5px 5px;\n	border-radius: var(--pops-right-context-menu-row-bd-radius);\n	display: flex;\n	width: -webkit-fill-available;\n	width: -moz-available;\n	text-align: left;\n	user-select: none;\n	-webkit-user-select: none;\n	-moz-user-select: none;\n	-ms-user-select: none;\n	align-items: center;\n}\n\n@media (prefers-color-scheme: dark) {\n	/*.pops-rightClickMenu {\n		--pops-right-context-menu-shadow-color: #3c3c3c;\n	}*/\n}\n@media (hover: hover) {\n	.pops-rightClickMenu ul li:active {\n		transform: scale(0.98);\n	}\n}\n';
  const PopsCSS = {
index: indexCSS,
ninePalaceGridPosition: ninePalaceGridPositionCSS,
scrollbar: scrollbarCSS,
button: buttonCSS,
common: commonCSS,
anim: animCSS,
alertCSS,
confirmCSS,
promptCSS,
loadingCSS,
iframeCSS,
tooltipCSS,
drawerCSS,
folderCSS,
panelCSS,
rightClickMenu: rightClickMenuCSS
  };
  const PopsAnimation = {
    $data: {},
    $flag: {
isInit: false
    },
    init() {
      if (!this.$flag.isInit) {
        this.$flag.isInit = true;
        let animationStyle = document.createElement("style");
        PopsSafeUtils.setSafeHTML(animationStyle, PopsCSS.anim);
        popsDOMUtils.appendHead(animationStyle);
        this.$data = null;
        this.$data = popsDOMUtils.getKeyFrames(animationStyle.sheet);
        popsUtils.setTimeout(() => {
          animationStyle.remove();
        }, 50);
      }
    },
hasAnim(name) {
      return this.$data.hasOwnProperty(name);
    }
  };
  const PopsInstData = {
    alert: [],
    confirm: [],
    drawer: [],
    folder: [],
    iframe: [],
    loading: [],
    panel: [],
    prompt: [],
    rightClickMenu: [],
tooltip: []
  };
  const PopsInstanceUtils = {
getMaxZIndexNodeInfo(deviation = 1, target = PopsCore.document, ignoreCallBack) {
      deviation = Number.isNaN(deviation) ? 1 : deviation;
      const maxZIndexCompare = 2 * Math.pow(10, 9);
      let zIndex = 0;
      let maxZIndexNode = null;
      function isVisibleNode($css) {
        return $css.position !== "static" && $css.display !== "none";
      }
      function queryMaxZIndex($ele) {
        if (typeof ignoreCallBack === "function") {
          let ignoreResult = ignoreCallBack($ele);
          if (typeof ignoreResult === "boolean" && !ignoreResult) {
            return;
          }
        }
        const nodeStyle = PopsCore.window.getComputedStyle($ele);
        if (isVisibleNode(nodeStyle)) {
          let nodeZIndex = parseInt(nodeStyle.zIndex);
          if (!isNaN(nodeZIndex)) {
            if (nodeZIndex > zIndex) {
              zIndex = nodeZIndex;
              maxZIndexNode = $ele;
            }
          }
          if ($ele.shadowRoot != null && $ele instanceof ShadowRoot) {
            $ele.shadowRoot.querySelectorAll("*").forEach(($shadowEle) => {
              queryMaxZIndex($shadowEle);
            });
          }
        }
      }
      target.querySelectorAll("*").forEach(($ele, index) => {
        queryMaxZIndex($ele);
      });
      zIndex += deviation;
      if (zIndex >= maxZIndexCompare) {
        zIndex = maxZIndexCompare;
      }
      return {
        node: maxZIndexNode,
        zIndex
      };
    },
getPopsMaxZIndex(deviation = 1) {
      deviation = Number.isNaN(deviation) ? 1 : deviation;
      const maxZIndex = 2 * Math.pow(10, 9);
      let zIndex = 0;
      let maxZIndexNode = null;
      function isVisibleNode($css) {
        return $css.position !== "static" && $css.display !== "none";
      }
      Object.keys(PopsInstData).forEach((instKeyName) => {
        let instData = PopsInstData[instKeyName];
        for (let index = 0; index < instData.length; index++) {
          const inst = instData[index];
          let nodeStyle = window.getComputedStyle(inst.animElement);
          if (isVisibleNode(nodeStyle)) {
            let nodeZIndex = parseInt(nodeStyle.zIndex);
            if (!isNaN(nodeZIndex)) {
              if (nodeZIndex > zIndex) {
                zIndex = nodeZIndex;
                maxZIndexNode = inst.animElement;
              }
            }
          }
        }
      });
      zIndex += deviation;
      let isOverMaxZIndex = zIndex >= maxZIndex;
      if (isOverMaxZIndex) {
        zIndex = maxZIndex;
      }
      return { zIndex, animElement: maxZIndexNode, isOverMaxZIndex };
    },
getMaxZIndex(deviation = 1) {
      return this.getMaxZIndexNodeInfo(deviation).zIndex;
    },
removeInstance(instConfigList, guid, isAll = false) {
      function removeItem(instCommonConfig) {
        if (typeof instCommonConfig.beforeRemoveCallBack === "function") {
          instCommonConfig.beforeRemoveCallBack(instCommonConfig);
        }
        instCommonConfig?.animElement?.remove();
        instCommonConfig?.popsElement?.remove();
        instCommonConfig?.maskElement?.remove();
        instCommonConfig?.$shadowContainer?.remove();
      }
      instConfigList.forEach((instConfigList2) => {
        instConfigList2.forEach((instConfigItem, index) => {
          if (isAll || instConfigItem["guid"] === guid) {
            let animName = instConfigItem.animElement.getAttribute("anim");
            if (PopsAnimation.hasAnim(animName)) {
              let reverseAnimName = animName + "-reverse";
              instConfigItem.animElement.style.width = "100%";
              instConfigItem.animElement.style.height = "100%";
              instConfigItem.animElement.style["animation-name"] = reverseAnimName;
              if (PopsAnimation.hasAnim(instConfigItem.animElement.style["animation-name"])) {
                popsDOMUtils.on(instConfigItem.animElement, popsDOMUtils.getAnimationEndNameList(), function() {
                  removeItem(instConfigItem);
                }, {
                  capture: true
                });
              } else {
                removeItem(instConfigItem);
              }
            } else {
              removeItem(instConfigItem);
            }
            instConfigList2.splice(index, 1);
          }
        });
      });
      return instConfigList;
    },
hide(popsType, instConfigList, guid, config, animElement, maskElement) {
      return new Promise((resolve) => {
        let popsElement = animElement.querySelector(".pops[type-value]");
        if (popsType === "drawer") {
          let drawerConfig = config;
          popsUtils.setTimeout(() => {
            maskElement.style.setProperty("display", "none");
            if (["top", "bottom"].includes(drawerConfig.direction)) {
              popsElement.style.setProperty("height", "0");
            } else if (["left", "right"].includes(drawerConfig.direction)) {
              popsElement.style.setProperty("width", "0");
            } else {
              console.error("未知direction:", drawerConfig.direction);
            }
            resolve();
          }, drawerConfig.closeDelay);
        } else {
          let fintInst = instConfigList.find((instConfigItem) => instConfigItem.guid === guid);
          if (fintInst) {
            let instConfigItem = fintInst;
            instConfigItem.animElement.style.width = "100%";
            instConfigItem.animElement.style.height = "100%";
            instConfigItem.animElement.style["animation-name"] = instConfigItem.animElement.getAttribute("anim") + "-reverse";
            if (PopsAnimation.hasAnim(
instConfigItem.animElement.style["animation-name"]
            )) {
              let animationendCallBack2 = function() {
                instConfigItem.animElement.style.display = "none";
                if (instConfigItem.maskElement) {
                  instConfigItem.maskElement.style.display = "none";
                }
                popsDOMUtils.off(instConfigItem.animElement, popsDOMUtils.getAnimationEndNameList(), animationendCallBack2, {
                  capture: true
                });
                resolve();
              };
              popsDOMUtils.on(instConfigItem.animElement, popsDOMUtils.getAnimationEndNameList(), animationendCallBack2, {
                capture: true
              });
            } else {
              instConfigItem.animElement.style.display = "none";
              if (instConfigItem.maskElement) {
                instConfigItem.maskElement.style.display = "none";
              }
              resolve();
            }
          }
        }
      });
    },
show(popsType, instConfigList, guid, config, animElement, maskElement) {
      return new Promise((resolve) => {
        let popsElement = animElement.querySelector(".pops[type-value]");
        if (popsType === "drawer") {
          let drawerConfig = config;
          popsUtils.setTimeout(() => {
            popsDOMUtils.css(maskElement, "display", "");
            let direction = drawerConfig.direction;
            let size = drawerConfig.size.toString();
            if (["top", "bottom"].includes(direction)) {
              popsElement.style.setProperty("height", size);
            } else if (["left", "right"].includes(direction)) {
              popsElement.style.setProperty("width", size);
            } else {
              console.error("未知direction:", direction);
            }
            resolve();
          }, drawerConfig.openDelay ?? 0);
        } else {
          let fintInst = instConfigList.find((instConfigItem) => instConfigItem.guid === guid);
          if (fintInst) {
            let instConfigItem = fintInst;
            instConfigItem.animElement.style.width = "";
            instConfigItem.animElement.style.height = "";
            instConfigItem.animElement.style["animation-name"] = instConfigItem.animElement.getAttribute("anim").replace("-reverse", "");
            if (PopsAnimation.hasAnim(
instConfigItem.animElement.style["animation-name"]
            )) {
              let animationendCallBack2 = function() {
                popsDOMUtils.off(instConfigItem.animElement, popsDOMUtils.getAnimationEndNameList(), animationendCallBack2, {
                  capture: true
                });
                resolve();
              };
              instConfigItem.animElement.style.display = "";
              if (instConfigItem.maskElement) {
                instConfigItem.maskElement.style.display = "";
              }
              popsDOMUtils.on(instConfigItem.animElement, popsDOMUtils.getAnimationEndNameList(), animationendCallBack2, {
                capture: true
              });
            } else {
              instConfigItem.animElement.style.display = "";
              if (instConfigItem.maskElement) {
                instConfigItem.maskElement.style.display = "";
              }
              resolve();
            }
          }
        }
      });
    },
close(popsType, instConfigList, guid, config, animElement) {
      return new Promise((resolve) => {
        let popsElement = animElement.querySelector(".pops[type-value]");
        let drawerConfig = config;
        function transitionendEvent() {
          function closeCallBack(event) {
            if (event.propertyName !== "transform") {
              return;
            }
            popsDOMUtils.off(popsElement, popsDOMUtils.getTransitionEndNameList(), void 0, closeCallBack);
            PopsInstanceUtils.removeInstance([instConfigList], guid);
            resolve();
          }
          popsDOMUtils.on(popsElement, popsDOMUtils.getTransitionEndNameList(), closeCallBack);
          let popsTransForm = getComputedStyle(popsElement).transform;
          if (popsTransForm !== "none") {
            popsDOMUtils.trigger(popsElement, popsDOMUtils.getTransitionEndNameList(), void 0, true);
            return;
          }
          if (["top"].includes(drawerConfig.direction)) {
            popsElement.style.setProperty("transform", "translateY(-100%)");
          } else if (["bottom"].includes(drawerConfig.direction)) {
            popsElement.style.setProperty("transform", "translateY(100%)");
          } else if (["left"].includes(drawerConfig.direction)) {
            popsElement.style.setProperty("transform", "translateX(-100%)");
          } else if (["right"].includes(drawerConfig.direction)) {
            popsElement.style.setProperty("transform", "translateX(100%)");
          } else {
            console.error("未知direction:", drawerConfig.direction);
          }
        }
        if (popsType === "drawer") {
          popsUtils.setTimeout(() => {
            transitionendEvent();
          }, drawerConfig.closeDelay);
        } else {
          PopsInstanceUtils.removeInstance([instConfigList], guid);
          resolve();
        }
      });
    },
drag(moveElement, options) {
      options = Object.assign({
        limit: true,
        extraDistance: 3,
        container: PopsCore.globalThis,
        triggerClick: true
      }, options);
      let isMove = false;
      let clickElementLeftOffset = 0;
      let clickElementTopOffset = 0;
      let AnyTouch = popsUtils.AnyTouch();
      let anyTouchElement = new AnyTouch(options.dragElement, {
        preventDefault(event) {
          if (typeof options.preventEvent === "function") {
            return options.preventEvent(event);
          } else {
            return true;
          }
        }
      });
      popsDOMUtils.css(options.dragElement, {
        cursor: "move"
      });
      function changeMoveElementStyle(element) {
        let old_transitionDuration = element.style.transitionDuration;
        if (globalThis.getComputedStyle(element).transitionDuration !== "0s") {
          element.style.transitionDuration = "0s";
        }
        return () => {
          element.style.transitionDuration = old_transitionDuration;
        };
      }
      function getContainerWidthOrHeight(container) {
        container = container ?? globalThis;
        return {
          width: popsDOMUtils.width(container),
          height: popsDOMUtils.height(container)
        };
      }
      function getContainerTopOrLeft(container) {
        container = container ?? globalThis;
        if (popsUtils.isWin(container)) {
          return {
            left: 0,
            top: 0
          };
        } else {
          let rect = container.getBoundingClientRect();
          return {
            left: rect.left,
            top: rect.top
          };
        }
      }
      let transformInfo = popsDOMUtils.getTransform(moveElement);
      let resumeMoveElementStyle = null;
      anyTouchElement.on("pan", function(event) {
        if (!isMove) {
          isMove = true;
          let rect = options.dragElement.getBoundingClientRect();
          clickElementLeftOffset = event.x - rect.left;
          clickElementTopOffset = event.y - rect.top;
          transformInfo = popsDOMUtils.getTransform(moveElement);
          resumeMoveElementStyle = changeMoveElementStyle(moveElement);
        }
        let currentMoveLeftOffset = event.x - clickElementLeftOffset + transformInfo.transformLeft;
        let currentMoveTopOffset = event.y - clickElementTopOffset + transformInfo.transformTop;
        if (event.phase === "move") {
          if (options.limit) {
            let maxLeftOffset = getContainerWidthOrHeight(options.container).width - popsDOMUtils.width(moveElement) + transformInfo.transformLeft;
            let { left: minLeftOffset, top: minTopOffset } = getContainerTopOrLeft(options.container);
            let maxTopOffset = getContainerWidthOrHeight(options.container).height - popsDOMUtils.height(moveElement) + transformInfo.transformTop;
            if (currentMoveLeftOffset > maxLeftOffset) {
              currentMoveLeftOffset = maxLeftOffset;
            }
            if (currentMoveTopOffset > maxTopOffset) {
              currentMoveTopOffset = maxTopOffset;
            }
            if (currentMoveLeftOffset - options.extraDistance * 2 < minLeftOffset + transformInfo.transformLeft) {
              currentMoveLeftOffset = minLeftOffset + transformInfo.transformLeft;
              currentMoveLeftOffset += options.extraDistance;
            } else {
              currentMoveLeftOffset -= options.extraDistance;
            }
            if (currentMoveTopOffset - options.extraDistance * 2 < minTopOffset + transformInfo.transformTop) {
              currentMoveTopOffset = minTopOffset + transformInfo.transformTop;
              currentMoveTopOffset += options.extraDistance;
            } else {
              currentMoveTopOffset -= options.extraDistance;
            }
          }
          if (typeof options.moveCallBack === "function") {
            options.moveCallBack(moveElement, currentMoveLeftOffset, currentMoveTopOffset);
          }
          popsDOMUtils.css(moveElement, {
            left: currentMoveLeftOffset + "px",
            top: currentMoveTopOffset + "px"
          });
        }
        if (event.phase === "end") {
          isMove = false;
          if (typeof resumeMoveElementStyle === "function") {
            resumeMoveElementStyle();
            resumeMoveElementStyle = null;
          }
          if (typeof options.endCallBack === "function") {
            options.endCallBack(moveElement, currentMoveLeftOffset, currentMoveTopOffset);
          }
        }
      });
      if (options.triggerClick) {
        anyTouchElement.on(["tap"], function(event) {
          event.changedPoints.forEach((item) => {
            popsDOMUtils.trigger(item.target, "click", void 0, true);
          });
        });
      }
    },
sortElementListByProperty(getBeforeValueFun, getAfterValueFun, sortByDesc = true) {
      if (typeof sortByDesc !== "boolean") {
        throw new TypeError("参数 sortByDesc 必须为boolean类型");
      }
      if (getBeforeValueFun == null || getAfterValueFun == null) {
        throw new Error("获取前面的值或后面的值的方法不能为空");
      }
      return function(after_obj, before_obj) {
        var beforeValue = getBeforeValueFun(before_obj);
        var afterValue = getAfterValueFun(after_obj);
        if (sortByDesc) {
          if (afterValue > beforeValue) {
            return -1;
          } else if (afterValue < beforeValue) {
            return 1;
          } else {
            return 0;
          }
        } else {
          if (afterValue < beforeValue) {
            return -1;
          } else if (afterValue > beforeValue) {
            return 1;
          } else {
            return 0;
          }
        }
      };
    }
  };
  const PopsHandler = {
handlerShadow(config) {
      let $shadowContainer = document.createElement("div");
      $shadowContainer.className = "pops-shadow-container";
      if (config.useShadowRoot) {
        let $shadowRoot = $shadowContainer.attachShadow({ mode: "open" });
        return {
          $shadowContainer,
          $shadowRoot
        };
      } else {
        return {
          $shadowContainer,
          $shadowRoot: $shadowContainer
        };
      }
    },
handleInit($styleParent, css) {
      PopsAnimation.init();
      if (!arguments.length) {
        return;
      }
      if ($styleParent == null) {
        return;
      }
      if (css == null) {
        return;
      }
      if (typeof css === "string") {
        if (css.trim() === "") {
          return;
        }
        css = [
          {
            css
          }
        ];
      } else {
        css = css.map((item) => {
          if (typeof item === "string") {
            return {
              css: item
            };
          } else {
            return item;
          }
        });
      }
      for (const cssItem of css) {
        let $css = popsDOMUtils.createElement("style", {}, {
          "data-type": "PopsHandler.handleInit"
        });
        $css.textContent = cssItem.css;
        if (typeof cssItem.name === "string") {
          $css.setAttribute("data-name", cssItem.name);
        }
        $styleParent.appendChild($css);
      }
    },
handleMask(details = {}) {
      let result = {
        maskElement: popsDOMUtils.parseTextToDOM(details.maskHTML)
      };
      let isMaskClick = false;
      function clickEvent(event) {
        popsDOMUtils.preventEvent(event);
        let targetInst = PopsInstData[details.type];
        function originalRun() {
          if (details.config.mask.clickEvent.toClose) {
            return PopsInstanceUtils.close(details.type, targetInst, details.guid, details.config, details.animElement);
          } else if (details.config.mask.clickEvent.toHide) {
            return PopsInstanceUtils.hide(details.type, targetInst, details.guid, details.config, details.animElement, result.maskElement);
          }
        }
        if (typeof details.config.mask.clickCallBack === "function") {
          details.config.mask.clickCallBack(originalRun, details.config);
        } else {
          originalRun();
        }
        return false;
      }
      if (details.config.mask.clickEvent.toClose || details.config.mask.clickEvent.toHide) {
        let isAnimElement2 = function(element) {
          return Boolean(element?.localName?.toLowerCase() === "div" && element.className && element.className === "pops-anim" && element.hasAttribute("anim"));
        };
        popsDOMUtils.on(details.animElement, ["touchstart", "mousedown"], void 0, (event) => {
          let $click = event.composedPath()[0];
          isMaskClick = isAnimElement2($click);
        });
        popsDOMUtils.on(details.animElement, "click", void 0, (event) => {
          let $click = event.composedPath()[0];
          if (isAnimElement2($click) && isMaskClick) {
            return clickEvent(event);
          }
        });
        popsDOMUtils.on(result.maskElement, "click", void 0, (event) => {
          isMaskClick = true;
          clickEvent(event);
        });
      }
      return result;
    },
handleQueryElement(animElement, type) {
      return {
popsElement: animElement.querySelector(".pops[type-value"),
btnOkElement: animElement.querySelector(`.pops-${type}-btn-ok`),
btnCancelElement: animElement.querySelector(`.pops-${type}-btn-cancel`),
btnOtherElement: animElement.querySelector(`.pops-${type}-btn-other`),
titleElement: animElement.querySelector(`.pops-${type}-title`),
inputElement: animElement.querySelector(`.pops-${type}-content textarea[pops]`) ? animElement.querySelector(`.pops-${type}-content textarea[pops]`) : animElement.querySelector(`.pops-${type}-content input[pops]`),
headerControlsElement: animElement.querySelector(".pops-header-controls"),
iframeElement: animElement.querySelector("iframe[pops]"),
loadingElement: animElement.querySelector(".pops-loading"),
contentElement: animElement.querySelector(`.pops-${type}-content`),
panelSectionWrapper: animElement.querySelector(`.pops-${type}-section-wrapper`),
contentAsideElement: animElement.querySelector(`.pops-${type}-content aside.pops-${type}-aside`),
contentSectionContainerElement: animElement.querySelector(`.pops-${type}-content section.pops-${type}-container`),
contentLoadingElement: animElement.querySelector(`.pops-${type}-content-global-loading`),
headerMinBtnElement: animElement.querySelector(".pops-header-control[data-type='min']"),
headerMaxBtnElement: animElement.querySelector(".pops-header-control[data-type='max']"),
headerMiseBtnElement: animElement.querySelector(".pops-header-control[data-type='mise']"),
headerCloseBtnElement: animElement.querySelector(".pops-header-control[data-type='close']"),
folderListElement: animElement.querySelector(".pops-folder-list"),
folderListHeaderElement: animElement.querySelector(".pops-folder-list .pops-folder-list-table__header-div"),
folderListHeaderRowElement: animElement.querySelector(".pops-folder-list .pops-folder-list-table__header-div .pops-folder-list-table__header-row"),
folderListBodyElement: animElement.querySelector(".pops-folder-list .pops-folder-list-table__body-div tbody"),
folderFileListBreadcrumbPrimaryElement: animElement.querySelector(".pops-folder-list .pops-folder-file-list-breadcrumb-primary"),
folderListSortFileNameElement: animElement.querySelector('.pops-folder-list-table__sort[data-sort="fileName"]'),
folderListSortLatestTimeElement: animElement.querySelector('.pops-folder-list-table__sort[data-sort="latestTime"]'),
folderListSortFileSizeElement: animElement.querySelector('.pops-folder-list-table__sort[data-sort="fileSize"]')
      };
    },
handleEventDetails(guid, $shadowContainer, $shadowRoot, mode, animElement, popsElement, maskElement, config) {
      return {
        $shadowContainer,
        $shadowRoot,
        element: animElement,
        animElement,
        popsElement,
        maskElement,
        mode,
        guid,
        close() {
          return PopsInstanceUtils.close(mode, PopsInstData[mode], guid, config, animElement);
        },
        hide() {
          return PopsInstanceUtils.hide(mode, PopsInstData[mode], guid, config, animElement, maskElement);
        },
        show() {
          return PopsInstanceUtils.show(mode, PopsInstData[mode], guid, config, animElement, maskElement);
        }
      };
    },
handleLoadingEventDetails(guid, mode, animElement, popsElement, maskElement, config) {
      return {
        element: animElement,
        animElement,
        popsElement,
        maskElement,
        mode,
        guid,
        close() {
          return PopsInstanceUtils.close(mode, PopsInstData[mode], guid, config, animElement);
        },
        hide() {
          return PopsInstanceUtils.hide(mode, PopsInstData[mode], guid, config, animElement, maskElement);
        },
        show() {
          return PopsInstanceUtils.show(mode, PopsInstData[mode], guid, config, animElement, maskElement);
        }
      };
    },
handleResultDetails(details) {
      let resultDetails = Object.assign({}, details);
      popsUtils.delete(resultDetails, "type");
      popsUtils.delete(resultDetails, "function");
      return resultDetails;
    },
handleClickEvent(type, $btn, eventDetails, callback) {
      popsDOMUtils.on($btn, "click", (event) => {
        let extraParam = {
          type
        };
        callback(Object.assign(eventDetails, extraParam), event);
      }, {
        capture: true
      });
    },
handleKeyboardEvent(keyName, otherKeyList = [], callback) {
      let keyboardEvent = function(event) {
        let _keyName = event.code || event.key;
        let _keyValue = event.charCode || event.keyCode || event.which;
        if (otherKeyList.includes("ctrl") && !event.ctrlKey) {
          return;
        }
        if (otherKeyList.includes("alt") && !event.altKey) {
          return;
        }
        if (otherKeyList.includes("meta") && !event.metaKey) {
          return;
        }
        if (otherKeyList.includes("shift") && !event.shiftKey) {
          return;
        }
        if (typeof keyName === "string" && keyName === _keyName) {
          callback && callback(event);
        } else if (typeof keyName === "number" && keyName === _keyValue) {
          callback && callback(event);
        }
      };
      popsDOMUtils.on(PopsCore.globalThis, "keydown", keyboardEvent, {
        capture: true
      });
      return {
        removeKeyboardEvent() {
          popsDOMUtils.off(globalThis, "keydown", keyboardEvent, {
            capture: true
          });
        }
      };
    },
handlePromptClickEvent(type, inputElement, $btn, eventDetails, callback) {
      popsDOMUtils.on($btn, "click", (event) => {
        let extraParam = {
          type,
          text: inputElement.value
        };
        callback(Object.assign(eventDetails, extraParam), event);
      }, {
        capture: true
      });
    },
handleZIndex(zIndex) {
      if (typeof zIndex === "function") {
        return zIndex();
      } else {
        return zIndex;
      }
    },
handleOnly(type, config) {
      if (config.only) {
        if (type === "loading" || type === "tooltip" || type === "rightClickMenu") {
          let inst = PopsInstData[type];
          if (inst) {
            PopsInstanceUtils.removeInstance([inst], "", true);
          }
        } else {
          PopsInstanceUtils.removeInstance([
            PopsInstData.alert,
            PopsInstData.confirm,
            PopsInstData.prompt,
            PopsInstData.iframe,
            PopsInstData.drawer,
            PopsInstData.folder,
            PopsInstData.panel
          ], "", true);
        }
      } else {
        let originZIndex = config.zIndex;
        config.zIndex = () => {
          const { zIndex: maxZIndex } = PopsInstanceUtils.getPopsMaxZIndex(PopsHandler.handleZIndex(originZIndex) + 100);
          return maxZIndex;
        };
      }
      return config;
    },
handlePush(type, value) {
      PopsInstData[type].push(value);
    }
  };
  const PopsAlertConfig = () => {
    return {
      title: {
        text: "默认标题",
        position: "left",
        html: false,
        style: ""
      },
      content: {
        text: "默认内容",
        html: false,
        style: ""
      },
      btn: {
        position: "flex-end",
        ok: {
          size: void 0,
          enable: true,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "确定",
          type: "primary",
          callback: function(details) {
            details.close();
          }
        },
        close: {
          enable: true,
          callback: function(details) {
            details.close();
          }
        }
      },
      useShadowRoot: true,
      class: "",
      only: false,
      width: window.innerWidth < 550 ? "88vw" : "350px",
      height: window.innerHeight < 450 ? "70vh" : "200px",
      position: "center",
      animation: "pops-anim-fadein-zoom",
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false
        },
        clickCallBack: null
      },
      drag: false,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {
      },
      dragEndCallBack() {
      },
      forbiddenScroll: false,
      style: null,
      beforeAppendToPageCallBack() {
      }
    };
  };
  const PopsAlert = {
    init(details) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "alert";
      let config = PopsAlertConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      config = PopsHandler.handleOnly(popsType, config);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar
        },
        {
          name: "button",
          css: PopsCSS.button
        },
        {
          name: "anim",
          css: PopsCSS.anim
        },
        {
          name: "common",
          css: PopsCSS.common
        },
        {
          name: "alertCSS",
          css: PopsCSS.alertCSS
        }
      ]);
      let zIndex = PopsHandler.handleZIndex(config.zIndex);
      let maskHTML = PopsElementHandler.createMask(guid, zIndex);
      let headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      let bottomBtnHTML = PopsElementHandler.createBottom(popsType, config);
      let { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      let { contentStyle, contentPStyle } = PopsElementHandler.createContentStyle(popsType, config);
      let animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
`
			<div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" style="${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>
			<div class="pops-content pops-${popsType}-content" style="${contentStyle}">${config.content.html ? config.content.text : `<p pops class="pops-${popsType}-content-text" style="${contentPStyle}">${config.content.text}</p>`}</div>${bottomBtnHTML}`,
        bottomBtnHTML,
        zIndex
      );
      let $anim = PopsElementHandler.parseElement(animHTML);
      let { popsElement: $pops, headerCloseBtnElement: $headerCloseBtn, btnOkElement, titleElement: $title } = PopsHandler.handleQueryElement($anim, popsType);
      let $mask = null;
      let elementList = [$anim];
      if (config.mask.enable) {
        let _handleMask_ = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML
        });
        $mask = _handleMask_.maskElement;
        elementList.push($mask);
      }
      let eventDetails = PopsHandler.handleEventDetails(guid, $shadowContainer, $shadowRoot, popsType, $anim, $pops, $mask, config);
      PopsHandler.handleClickEvent("close", $headerCloseBtn, eventDetails, config.btn.close.callback);
      PopsHandler.handleClickEvent("ok", btnOkElement, eventDetails, config.btn.ok.callback);
      popsDOMUtils.append($shadowRoot, elementList);
      if (typeof config.beforeAppendToPageCallBack === "function") {
        config.beforeAppendToPageCallBack($shadowRoot, $shadowContainer);
      }
      popsDOMUtils.appendBody($shadowContainer);
      if ($mask != null) {
        $anim.after($mask);
      }
      PopsHandler.handlePush(popsType, {
        guid,
        animElement: $anim,
        popsElement: $pops,
        maskElement: $mask,
        $shadowContainer,
        $shadowRoot
      });
      if (config.drag) {
        PopsInstanceUtils.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack
        });
      }
      let result = PopsHandler.handleResultDetails(eventDetails);
      return result;
    }
  };
  const PopsConfirmConfig = () => {
    return {
      title: {
        text: "默认标题",
        position: "left",
        html: false,
        style: ""
      },
      content: {
        text: "默认内容",
        html: false,
        style: ""
      },
      btn: {
        merge: false,
        mergeReverse: false,
        reverse: false,
        position: "flex-end",
        ok: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "确定",
          type: "primary",
          callback(detail) {
            detail.close();
          }
        },
        cancel: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "关闭",
          type: "default",
          callback(detail) {
            detail.close();
          }
        },
        other: {
          enable: false,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "其它按钮",
          type: "default",
          callback(detail) {
            detail.close();
          }
        },
        close: {
          enable: true,
          callback(detail) {
            detail.close();
          }
        }
      },
      useShadowRoot: true,
      class: "",
      only: false,
      width: window.innerWidth < 550 ? "88vw" : "350px",
      height: window.innerHeight < 450 ? "70vh" : "200px",
      position: "center",
      animation: "pops-anim-fadein-zoom",
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false
        },
        clickCallBack: null
      },
      drag: false,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {
      },
      dragEndCallBack() {
      },
      forbiddenScroll: false,
      style: null,
      beforeAppendToPageCallBack() {
      }
    };
  };
  const PopsConfirm = {
    init(details) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "confirm";
      let config = PopsConfirmConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      config = PopsHandler.handleOnly(popsType, config);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar
        },
        {
          name: "button",
          css: PopsCSS.button
        },
        {
          name: "anim",
          css: PopsCSS.anim
        },
        {
          name: "common",
          css: PopsCSS.common
        },
        {
          name: "confirmCSS",
          css: PopsCSS.confirmCSS
        }
      ]);
      let zIndex = PopsHandler.handleZIndex(config.zIndex);
      let maskHTML = PopsElementHandler.createMask(guid, zIndex);
      let headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      let bottomBtnHTML = PopsElementHandler.createBottom(popsType, config);
      let { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      let { contentStyle, contentPStyle } = PopsElementHandler.createContentStyle(popsType, config);
      let animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
`
            <div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" style="${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>
                        <div class="pops-content pops-${popsType}-content" style="${contentStyle}">${config.content.html ? config.content.text : `<p pops class="pops-${popsType}-content-text" style="${contentPStyle}">${config.content.text}</p>`}</div>${bottomBtnHTML}`,
        bottomBtnHTML,
        zIndex
      );
      let $anim = PopsElementHandler.parseElement(animHTML);
      let { popsElement: $pops, titleElement: $title, headerCloseBtnElement: $btnClose, btnOkElement: $btnOk, btnCancelElement: $btnCancel, btnOtherElement: $btnOther } = PopsHandler.handleQueryElement($anim, popsType);
      let $mask = null;
      let elementList = [$anim];
      if (config.mask.enable) {
        let _handleMask_ = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML
        });
        $mask = _handleMask_.maskElement;
        elementList.push($mask);
      }
      let eventDetails = PopsHandler.handleEventDetails(guid, $shadowContainer, $shadowRoot, popsType, $anim, $pops, $mask, config);
      PopsHandler.handleClickEvent("close", $btnClose, eventDetails, config.btn.close.callback);
      PopsHandler.handleClickEvent("ok", $btnOk, eventDetails, config.btn.ok.callback);
      PopsHandler.handleClickEvent("cancel", $btnCancel, eventDetails, config.btn.cancel.callback);
      PopsHandler.handleClickEvent("other", $btnOther, eventDetails, config.btn.other.callback);
      popsDOMUtils.append($shadowRoot, elementList);
      if (typeof config.beforeAppendToPageCallBack === "function") {
        config.beforeAppendToPageCallBack($shadowRoot, $shadowContainer);
      }
      popsDOMUtils.appendBody($shadowContainer);
      if ($mask != null) {
        $anim.after($mask);
      }
      PopsHandler.handlePush(popsType, {
        guid,
        animElement: $anim,
        popsElement: $pops,
        maskElement: $mask,
        $shadowContainer,
        $shadowRoot
      });
      if (config.drag) {
        PopsInstanceUtils.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack
        });
      }
      let result = PopsHandler.handleResultDetails(eventDetails);
      return result;
    }
  };
  const PopsDrawerConfig = () => {
    return {
      title: {
        enable: true,
        position: "center",
        text: "默认标题",
        html: false,
        style: ""
      },
      content: {
        text: "默认内容",
        html: false,
        style: ""
      },
      btn: {
        merge: false,
        mergeReverse: false,
        reverse: false,
        position: "flex-end",
        ok: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "确定",
          type: "primary",
          callback(detail) {
            detail.close();
          }
        },
        cancel: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "关闭",
          type: "default",
          callback(detail) {
            detail.close();
          }
        },
        other: {
          enable: false,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "其它按钮",
          type: "default",
          callback(detail) {
            detail.close();
          }
        },
        close: {
          enable: true,
          callback(detail) {
            detail.close();
          }
        }
      },
      mask: {
        enable: true,
        clickEvent: {
          toClose: true,
          toHide: false
        },
        clickCallBack: null
      },
      useShadowRoot: true,
      class: "",
      zIndex: 1e4,
      only: false,
      direction: "right",
      size: "30%",
      lockScroll: false,
      closeOnPressEscape: true,
      openDelay: 0,
      closeDelay: 0,
      borderRadius: 0,
      style: null,
      beforeAppendToPageCallBack() {
      },
      forbiddenScroll: false
    };
  };
  const PopsDrawer = {
    init(details) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "drawer";
      let config = PopsDrawerConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      config = PopsHandler.handleOnly(popsType, config);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar
        },
        {
          name: "button",
          css: PopsCSS.button
        },
        {
          name: "anim",
          css: PopsCSS.anim
        },
        {
          name: "common",
          css: PopsCSS.common
        },
        {
          name: "drawerCSS",
          css: PopsCSS.drawerCSS
        }
      ]);
      let zIndex = PopsHandler.handleZIndex(config.zIndex);
      let maskHTML = PopsElementHandler.createMask(guid, zIndex);
      let headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      let bottomBtnHTML = PopsElementHandler.createBottom(popsType, config);
      let { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      let { contentStyle, contentPStyle } = PopsElementHandler.createContentStyle(popsType, config);
      let animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
`
            ${config.title.enable ? (
`<div class="pops-title pops-${popsType}-title" style="${headerStyle}">${config.title.html ? config.title.text : (
`<p pops class="pops-${popsType}-title-text" style="width: 100%;text-align: ${config.title.position};${headerPStyle}">${config.title.text}</p>`
        )}${headerBtnHTML}</div>`
      ) : ""}
            <div class="pops-content pops-${popsType}-content" style="${contentStyle}">${config.content.html ? config.content.text : `<p pops class="pops-${popsType}-content-text" style="${contentPStyle}">${config.content.text}</p>`}</div>${bottomBtnHTML}`,
        bottomBtnHTML,
        zIndex
      );
      let $anim = PopsElementHandler.parseElement(animHTML);
      let { popsElement, headerCloseBtnElement, btnCancelElement, btnOkElement, btnOtherElement } = PopsHandler.handleQueryElement($anim, popsType);
      let $pops = popsElement;
      let $headerCloseBtn = headerCloseBtnElement;
      let $btnCancel = btnCancelElement;
      let $btnOk = btnOkElement;
      let $btnOther = btnOtherElement;
      let $mask = null;
      let elementList = [$anim];
      if (config.mask.enable) {
        let _handleMask_ = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML
        });
        $mask = _handleMask_.maskElement;
        elementList.push($mask);
      }
      let eventDetails = PopsHandler.handleEventDetails(guid, $shadowContainer, $shadowRoot, popsType, $anim, $pops, $mask, config);
      $pops.setAttribute("direction", config.direction);
      if (config.direction === "top") {
        $pops.style.setProperty("height", "0");
        $pops.style.setProperty("border-radius", `0px 0px ${config.borderRadius}px ${config.borderRadius}px`);
      } else if (config.direction === "bottom") {
        $pops.style.setProperty("height", "0");
        $pops.style.setProperty("border-radius", `${config.borderRadius}px ${config.borderRadius}px 0px 0px`);
      } else if (config.direction === "left") {
        $pops.style.setProperty("width", "0");
        $pops.style.setProperty("border-radius", `0px ${config.borderRadius}px 0px ${config.borderRadius}px`);
      } else if (config.direction === "right") {
        $pops.style.setProperty("width", "0");
        $pops.style.setProperty("border-radius", `${config.borderRadius}px 0px ${config.borderRadius}px 0px`);
      }
      if (config.closeOnPressEscape) {
        PopsHandler.handleKeyboardEvent("Escape", [], function() {
          eventDetails.close();
        });
      }
      let needHandleClickEventList = [
        {
          type: "close",
          ele: $headerCloseBtn
        },
        {
          type: "cancel",
          ele: $btnCancel
        },
        {
          type: "ok",
          ele: $btnOk
        },
        {
          type: "other",
          ele: $btnOther
        }
      ];
      needHandleClickEventList.forEach((item) => {
        PopsHandler.handleClickEvent(item.type, item.ele, eventDetails, (_eventDetails_) => {
          if (typeof config.btn[item.type].callback === "function") {
            config.btn[item.type].callback(_eventDetails_);
          }
        });
      });
      elementList.forEach((element) => {
        element.style.setProperty("display", "none");
        if (["top"].includes(config.direction)) {
          $pops.style.setProperty("height", config.size.toString());
          $pops.style.setProperty("transform", "translateY(-100%)");
        } else if (["bottom"].includes(config.direction)) {
          $pops.style.setProperty("height", config.size.toString());
          $pops.style.setProperty("transform", "translateY(100%)");
        } else if (["left"].includes(config.direction)) {
          $pops.style.setProperty("width", config.size.toString());
          $pops.style.setProperty("transform", "translateX(-100%)");
        } else if (["right"].includes(config.direction)) {
          $pops.style.setProperty("width", config.size.toString());
          $pops.style.setProperty("transform", "translateX(100%)");
        }
        element.style.setProperty("display", "");
      });
      popsDOMUtils.append($shadowRoot, elementList);
      if (typeof config.beforeAppendToPageCallBack === "function") {
        config.beforeAppendToPageCallBack($shadowRoot, $shadowContainer);
      }
      popsDOMUtils.appendBody($shadowContainer);
      popsUtils.setTimeout(() => {
        popsUtils.setTimeout(() => {
          $pops.style.setProperty("transform", "");
        }, config.openDelay);
      }, 50);
      if ($mask != null) {
        $anim.after($mask);
      }
      PopsHandler.handlePush(popsType, {
        guid,
        animElement: $anim,
        popsElement: $pops,
        maskElement: $mask,
        $shadowContainer,
        $shadowRoot
      });
      let result = PopsHandler.handleResultDetails(eventDetails);
      return result;
    }
  };
  const PopsLoadingConfig = () => {
    return {
      parent: document.body,
      content: {
        text: "加载中...",
        icon: "loading",
        style: ""
      },
      useShadowRoot: true,
      class: "",
      only: false,
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false
        },
        clickCallBack: null
      },
      animation: "pops-anim-fadein-zoom",
      forbiddenScroll: false,
      isAbsolute: false,
      style: null,
      addIndexCSS: true
    };
  };
  const PopsLoading = {
    init(details) {
      let config = PopsLoadingConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      let guid = popsUtils.getRandomGUID();
      const PopsType = "loading";
      config = PopsHandler.handleOnly(PopsType, config);
      let zIndex = PopsHandler.handleZIndex(config.zIndex);
      let maskHTML = PopsElementHandler.createMask(guid, zIndex);
      let { contentPStyle } = PopsElementHandler.createContentStyle("loading", config);
      let animHTML = PopsElementHandler.createAnim(
        guid,
        PopsType,
        config,
`
            <div class="pops-content pops-${PopsType}-content">${config.addIndexCSS ? (
`
                <style data-model-name="index">${PopsCSS.index}</style>
                <style data-model-name="anim">${PopsCSS.anim}</style>
                <style data-model-name="common">${PopsCSS.common}</style>
                `
      ) : ""}
                <style data-model-name="loadingCSS">
                    ${PopsCSS.loadingCSS}
                </style>
            ${config.style != null ? `<style>${config.style}</style>` : ""}
            	<p pops class="pops-${PopsType}-content-text" style="${contentPStyle}">${config.content.text}</p>
            </div>`,
        "",
        zIndex
      );
      let $anim = PopsElementHandler.parseElement(animHTML);
      let { popsElement: $pops } = PopsHandler.handleQueryElement($anim, PopsType);
      let $mask = null;
      let elementList = [$anim];
      if (config.mask.enable) {
        let _handleMask_ = PopsHandler.handleMask({
          type: PopsType,
          guid,
          config,
          animElement: $anim,
          maskHTML
        });
        $mask = _handleMask_.maskElement;
        elementList.push($mask);
      }
      let eventDetails = PopsHandler.handleLoadingEventDetails(guid, PopsType, $anim, $pops, $mask, config);
      popsDOMUtils.append(config.parent, elementList);
      if ($mask != null) {
        $anim.after($mask);
      }
      PopsHandler.handlePush(PopsType, {
        guid,
        animElement: $anim,
        popsElement: $pops,
        maskElement: $mask
      });
      if (config.isAbsolute) {
        popsDOMUtils.css($anim, "position", "absolute !important");
        $mask && popsDOMUtils.css($mask, "position", "absolute !important");
      }
      let result = PopsHandler.handleResultDetails(eventDetails);
      return result;
    }
  };
  const PopsFolderConfig = () => {
    return {
      title: {
        text: "pops.Folder",
        position: "center",
        html: false,
        style: ""
      },
      sort: {
        name: "latestTime",
        isDesc: false,
callback() {
        }
      },
      folder: [
        {
          fileName: "测试文件夹",
          fileSize: 0,
          fileType: "",
          createTime: 0,
          latestTime: 0,
          isFolder: true,
          index: 0,
clickEvent() {
            return [
              {
                fileName: "测试文件夹2222",
                fileSize: 0,
                fileType: "",
                createTime: 0,
                latestTime: 0,
                isFolder: true,
                index: 0,
clickEvent() {
                  return [
                    {
                      fileName: "内部-测试文件.zip",
                      fileSize: 1025e3,
                      fileType: "zip",
                      createTime: 1702038410440,
                      latestTime: 1702039602126,
                      isFolder: false,
                      index: 1,
                      clickEvent() {
                        console.log("下载文件:", this.fileName);
                        return "https://update.greasyfork.icu/scripts/456485/pops.js";
                      }
                    }
                  ];
                }
              }
            ];
          }
        },
        {
          fileName: "测试文件.apk",
          fileSize: 30125682,
          fileType: "apk",
          createTime: 1702036410440,
          latestTime: 1702039410440,
          isFolder: false,
          index: 1,
clickEvent() {
            console.log("下载文件:", this.fileName);
            return "https://update.greasyfork.icu/scripts/456485/pops.js";
          }
        }
      ],
      btn: {
        merge: false,
        mergeReverse: false,
        reverse: false,
        position: "flex-end",
        ok: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "确定",
          type: "primary",
          callback(detail) {
            detail.close();
          }
        },
        cancel: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "关闭",
          type: "default",
          callback(detail) {
            detail.close();
          }
        },
        other: {
          enable: false,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "其它按钮",
          type: "default",
          callback(detail) {
            detail.close();
          }
        },
        close: {
          enable: true,
          callback(detail) {
            detail.close();
          }
        }
      },
      useShadowRoot: true,
      class: "",
      only: false,
      width: window.innerWidth < 550 ? "88vw" : "500px",
      height: window.innerHeight < 450 ? "70vh" : "400px",
      position: "center",
      animation: "pops-anim-fadein-zoom",
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false
        },
        clickCallBack: null
      },
      drag: false,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {
      },
      dragEndCallBack() {
      },
      forbiddenScroll: false,
      style: null,
      beforeAppendToPageCallBack() {
      }
    };
  };
  const Folder_ICON = {
    folder: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABRUExURUxpcf++Hv/ZU//OPv/DL/+9Gv/BI/+4Bf+4Ef/XcP/LOP/TSf/RRP/WTv/JM/+3Ef+9Ff/bhf+5BP/DJf+yDv/imv/kqv/bXP/w0v/fd//calQXUgwAAAAKdFJOUwB///8d3L9enl8sr20gAAACN0lEQVRYw+2Y65abIBRGE1EzVbyNSW18/wctHA6XYw4q9Ee7Vt2AgOHbcVyTOMztdnFxcXFMWf7gKHN190VRKDpFC0iNqB5ZvqpXzJRxHoF7hrAa9/hK9j2oYIA2QA/UqXeyNg5QDBrshhHbUH8xxO+uT7sOJ/tU5a4wh0eK8KmKHTxd28Bfo16pqphep5l6I+R/p8xr668kVghVceH8M5EZYnGhnBKRceGqmaZXPPw2xbO+1xU+8axwe8NfzkIV7xVZdF0AVhi+rWdxIfgmwloE6CkrDCPwJbYUeFgK61icxFcNKyxIxE+WgnllQ0y4+HffzZ8WZtJlCDtz+CzqaaFaVGiWBNEOZZ15zihsT2CFnXk4QStsLohTU3FC+Af8I8JWV1fa1jy8u+hnOUy2vnd5SkeGrJBfHZwDbxe87pfxQvejmMZZYxxdYSoyVyixSvtXFLJ7hWq5xCRNSTozczzHCj8T54kI5d8QCtvZAodDIa7DgRkJaII2hBfaJC7EOE7D076XuIoVBu8oN3kpBLVt4YXBVaUSFSbS5Akb00znSoPn9KCJCN0am7SnGhganC4kKhR2MV0vvEn4M7bFhM3GIZqtgfiPr9BdSAYnrnCX3rQeB/2xsKcHouiBBhpO+phQL9CdjmKqsRkXpkMz57dmfTY1v3k8is26zvN2A6yIbKVqm/tMjFBMp5jpxrWKbsB1dJw/AsC3Lt/YEaK7x1t5r7aLj3ned/fRj1TK3H9wXFxc/F/8BgM0jBZ4nc19AAAAAElFTkSuQmCC",
    zip: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAFQUExURUxpcYHaOWDM+pryU4TbPXLU/XHT/X3Y/nrZpIffP/+gI4La/+9QTvhycXjQL4fbQvBUUoXaQHrSMf+cJPl2dfBXVf+KMDu99IveRv+ZJf+NLv+PLIncRPdvbV7L+VnJ+P/u5HDS/P+DD1PG93fV/U3D9kTB9WfP+2vR/GLN+nvSM86bL33UNf/69f/+/XzTNP+vVf/iyf/06sOCRsGhYP2Jh/t8e4TVPX3QNat7jnzCMfxfXXrUMP/UqJPoTX/cM/aDLOVjKP/jw/9yC/98HP+GLP/Ec2C63f+iQ4TjNvOiasmpZLuTpfaQgfjEu4HGOPKGeHDC4s2YXU+02/Ozn/B0J+1oYHvSNGnM9P/r291KSNGeZIHGObeOn5zzVM6PHkS978mNUt+EO/GadPOgbZzyVJvyVNG6g66AksCer4LGOc7Mp/eWh/SZVu6adP6VKOSF/TkAAAAKdFJOUwDf39+Af5/9MKAONWYwAAADB0lEQVRYw+3Y+U/TYBjAcUDYIahlA3bCimM3Y64MERWdeExFOhDoxkTnDuTm///R9+jx9MjbtcT4S78sIVnCh+c9mjDGxry8vLz+TwGffxp2/Ql0vYJbJuXzE76AvTc1rc9//gx0vqxg+XwON+XY8+8+BO22NayQKxQKSzZiwMj5D/TgQZtORjASe9U+QKHQfplAilEuhfIxQT/g6P4bwEZbGS1FS08wQR1GzpOCYfSFX7XGEtDSJPaEQCPH2cagwmEwpdfSmQwbXIEaOlAMhsNkRvQ9jEANy9CYoA7Dt6PdqIVBtUY6rdOy2SwbVLEcvR5G8DCjWkSzA3VPAbkcJlCHZbORCBPUY+h+pKzArKZF7MAcvLf4PDUwRsDfikU1O9DwFKDzPKzFYjGMkW8yGIExQbpO9SlAB0BANQxGDDFBdbS0ctdMYMQReHn5Te0n6aIPwf7WBWoLdsEEN57PoR6RFnGSVIdgfV6J47gZHPdqVBBzG6IobutCb+w5B+dkcE5Ys0iQZJBzPOENAsvG1oQ910u+EcplvroDqvLlsrDveEJlyXvox8Xbz6BbEf2KfdcTIlA4On4KOj4SNJBzAQpmUHAxobrkE4E3gyf7YECHE1qAPAWd7+EiAXleHMI/RYYiz5/c41AQaO4+YNXKq7oHpe2dqqmd7XnXhyJJg8Hd8CtoeDcYSDPuwflOp/NOF3qjwzm42Oc/SN/ler3eer8O6q+b6jHBszfRaDSZTD7BzaI2m6UEqPTyxWqrUiwWQ6HQY9zrt1+Y4B8ZTDLASoV4o4G/EJiMat7s5un9QDKhDBLSPGGl4mTJeA+T8pLphFeleCIeTyTwK04mJJvofg9PS3GQMqGjPdSfsjVYdA82jSA6lJa7CWdNEy6QCVedLPnMYg8XQHTJFecTwottAJ3dwwcWSzaBrRY8lHEmGJQvtjbhlQWomzDI/vAIn5TRlmzzkXnSvIcfQWZw0u4D86Rhyc3uB1CXgOCUbT206uA4PJRm9z2oKz/LFBwPjvAvAi8vL69/0l8fxm2XCv5p+gAAAABJRU5ErkJggg==",
    mp4: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABXUExURUxpcZKU/5eZ/4SG/5CS/5eb/6Sm/4WG/5uc/6eq/4uM/4iJ/6Ci/5ye/6eo/6Ol/46P/5mb/5eY/5GS//39/5SV//X1/6Ol/+3u/+Li/3Z498/Q/7u8/zCK/WcAAAAKdFJOUwB7Pf+fHN2gn59fp7PNAAACSElEQVRYw+3Ya3OjIBQG4FqamnDzTkT9/79zOQdUzG0PJjP7YX2DeAR5EtKZTu3X15EjR46Q851dnuY7nTtd9Kv8nlK9X60/Kl60/qh4wjUFNjx8XSznIlHMClgICadC+2PWYShFvFwpSRAvBSl0MYDyVpB7xfOyLXmVrl2h99cQPw49VTzLV7lGNVF8DW5CExNAeSaCSsHdyi9SUPi2Ds2h/KY4K+epbZANpYoKmRHBGy6qbt7qnAzKaZzU86SDtje91Z8Ddd+2renHIh6sEsFKVS64stKmhRg7rRi2yrM0MEoAW2Osrh4kFaxnEPd9/SiI+94N1jW0qu5icN13Xfl7iCBqPlsQ9y3nObyJCNYr2G9Bt28VzRPBroYWQGNMiy+Dlel116WBP24BrOlcGgC9NaNWdjjV4T0/NHAJgnF6O/Fo/l2wt6Nm4i2w6OOMExtYmQ42Tdd00BxoV85O9TCI0k26hDckgc2acgXtKIeB8WabvaCFL89xZfMuKG1vgZsa2O2dRwbdUng1vBut48bK7dZ9ezgOrC/diQSWUdg0jrhb4a3bJIOCVYrDD6N8HCLol0PP2QC7fexxTgN5yctF4Mxz8wE953gDdHQwSiDQmK9Lr3IamJCcAObPl4u9oBAL4EohRESGC+FrGoiOX+E/lYD4y3kg0CRQJOSfggwbFksZZhg2GKOAGQscrFrE+RrachaC8hfsN7uLCJ24myE9BuQb52HmGcqO3fPtc2jXB3RiTuNy+hPpKcv/mmzHfzOOHDny/+YPi6+BG+WQsHsAAAAASUVORK5CYII=",
    apk: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABXUExURUxpcXnGVmm8P2q8QHzIV4bNYXXDTWu8P3nFUYfNY26/RIPLXoDJWobNYXHASH3HVnXDTXnFUfT/7onPZej/2/v/+Ov+4cDypVmtLqvjjt38y57afsvyti89dh4AAAAKdFJOUwAQ3/8n3Xugn58KiJgCAAACeElEQVRYw+2Y2ZajIBBAuxuTtIhsKgTx/79zisUlaZ0pPPM048WwBa6FkpyYj4+Li4sLNNW9PqQq133W3e+4lSqr24GpPWms08S23ZhCmnvatsxYtZE4/a229BQZ78nxk27TXWKsWwwFRhA2ITXz3FBp1maxsc6OLF1Usb6cocBYNynAnKcs55tm22CNdYPl9vmXhUhj3bA8PpaMLdUNqc1qZIQggRRUi42lPIvmEzDMZazZBiHYOy9dd4TwezPXj1Pzqgxd7dpVlwnVNAzjS0SiM4N2a893mVC6MF2BsvO+64QQzTgMfadKhSIdQvFJD9p3duyNMf3khB0G44gSLCWcUKxwBhEZM2S0Af/E5TqgVKiI18MrRnKV3mRnhNy/+QbdbQIsF3oTFmr0vGJY8sjUGaGCBEcPht65UIDK2+C3UuUhaKFKSUmngen5tCE07Z+kh7bxMp9RKZRQLYg+CgmZQqk94SaUli8jyoTSx/lmsrHUvR1TqU4KuY3zddKtFVjzOSEd9S7G8UJhDEBKAp+4Hg7Itpg+C6WSKKEMgE8Se4CnaYAsEAbo8wDC5yGFQndAd1II13AfR08JOYlfg3BTTCzD3UktRwqFHJLk/DjCcBE5Wgi6BLH7xtHHuxKG4IRACJKTdhr3sISmM0r+QAgffIaS1u3uwlnIC4WckP1tuPhKhRDjHquvdMlrSdcmncvQgRLCDEpTtr6SNjX5klGkEM+/IyTxmF/bKlkLghbGrZE2SPLFFs1dZLuXMMJ71m1m0vkMdOmI71KC+QVbkQJQjyoPvA+zYnig/8L6vpDPUhUyxgfuSSr9ifH4I/cT/2ZcXFz8v/wC1sx9JR+88xQAAAAASUVORK5CYII=",
    gif: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABpUExURUxpcf+ubP+eUP+iWP+xcP+nX/+lXf+SO/uPSv+dUP6kX/+XRP+VQP+SO/+jWf+oYf+hVf///f+mXf+tav+ubf+rZ/+eUP+wcP+pZP/s3P+aSf/z6P/48v/UsvqFOf+6hP/jzf/Hmv/cwS4F5mYAAAALdFJOUwDdez2foByg/p/2onNSOQAAAh5JREFUWMPtmNuSoyAQQGeMUaZUxBveRfP/H7lc1VRJptF92Kr1INqtcKqNSSrk6+vm5uYGzMPzrTzcdYFff+I7cPV91/VfNZr6ykNb6WwMypW6tOBk9EoALka/KMtCTCr05OKi0S9AwI02YXXW+KwqMVluMqw4SimjtUGNzwoK0HgobC4Yn42iat6DanfKnPZdhCAersK0KcfXWOtYbPtrTeNBhGnapCt1n2VZX6cWnjDhjjETjNeFudrhWQpfeS7PqJ5vI0DCXJLKPVmkcMH5MQ5CBaGvIRtehIhkGVp2VmgqwgixhSEkciYeDz4jxDkWyD1F0zQhKrJZ3zzG+jKPQMLNJiAd6ogImHw1+1UngQh/8DHqefMS9/ycFhJVIC+ROAvJnrodRn7ARBfIS+TJirOwEp88JsTGx0skF4Tyfd3nZCtQ+c8KG3OXW4FZ1lJHIeUQ1dVXQzY0vMDBbLJEKjsFCxX1oOmHPe02wlHYDsewk0LWW5jPCfPZJuyZm7BTbWmtzHoMTNgpcPuBUg+CCSkfSTv2wTdXskKoUFGMdhhyqlASTcjOlLgLu3iyk0QOwjDqePsFfgeiA4VqykefCUK40KZ457wwuiaMBZFokc7EQTUTiigGCWMH/m1hAhR624TETFSh7Em8Np5DfsE+EgdAy4BQD473M9+SNYPcMV/fImh9CLiWCkKYL4SvSAMv/BXvxL8ZNzc3/y9/ADVfok94AIhIAAAAAElFTkSuQmCC",
    txt: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABIUExURUxpcTOL+DSL+DqO+Veb/mKl/kmX+zWL+U6a+2ao/0aW+0CS+kyZ/GCk/mWn/1yi/lef/VGc/Pr9/+jz/2+s+46//b3a/4O3/AJIojgAAAAKdFJOUwDf//8d3U+en52O09RGAAACF0lEQVRYw+2Y63ajIBCAW8ZqHC5KrZv3f9MFhpuJTQfrjz1n/SDIbT4npw2pfXu7uLi4YNOP39O367rRvOKja/V9GHOqcTTmVGNnzLlGl6A2WvvWxGsqJo9ajKMuGP0dDcbxSWTShKlGfOOoebCNRTidYxynDXrb1dUU0ziGEF3ZdHHoza14xocMXzJyhLdpmme/e6ag2XeobqYCnBRvs98fm32meId56nnCErk+czfVhlub0CyfOyzaHhTa9XOX9aDQqnU/w7uyjULrcC3i+ocI4iUOVkQ7+8IVeptXWgUgMXD3xjv1UYCyCa6QUAiC0E64fMUBYBTOrUJnROmBryCEMEAsCbYKrSIkCSXS0LYLla8U6K4KSYi+H5ZsWmcJY1ohmpos3OLWmoSF9JajX9m8ckyIRfjIrzM8KERfq5J/yridZwrDx0HF6suOMF24QoXJGijCR/gZboB/TZgDYyd9lqU8mqGPlGQMJR8OfiDjZNjDEQ5S0hlDZ4ushWkqwxSWJCgezOKYIMsw7Ri4wi0g3HfBKuF55bBQTNod1WcKw9kv6yShTQgUQA6A6IsjAEmFJ4RXOF24W+gBcIUxAaiapChi/zolw5rfC+GYUKTqG1G11Vxo2Bn6AJLk8NiPC6JBKOjXLv0ZEruwN2AJe8GCnKzHgEGw4STonm/fub535rNUx8xx4D+RdsPP9Af+m3FxcfH/8hcLt2QJ3T9wuwAAAABJRU5ErkJggg==",
    exe: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAB4UExURUxpcVq2/kOv/0uw/163/1Cz/0+x/zGp/zad+0Ku/165/Tms/zWq/zKp/1i1/1W1/1K0/0Wv/0Cu/06y//7//0qx/1q2/1y3/1+3/j6p/vf7/y+o/9zu/+r2/yqM9xCa/4LK/8De/3ay/p7P/n3B/rLW/12n+xyf/0XRgzgAAAALdFJOUwDdez2eoByg/Z+vFPUOhAAAAoZJREFUWMPtmOt2mzAMgNuEBDquhhgwgWwMQt//DSfJ3BJIJ3P6a+MLviDkDxE4OaVvbzs7OztsjgfrJUdz3flH/hXvZ1Pfe55/q9HK8iyDluOW4xz3cHcYzIxnMqSZNi3BuJHxALIsTXHLsB+nuOlzmRktbUl71RIKGhitNA3gMxEM3TgxM1rog2UB0vcoopAezIxWwIRrPM0XhX17jJgZT+ETwWwSPBzgGRfCL7C4wojSI91FEfVDJBo2hPNLcYqeCKmFs71pcuAJw0cbkCRREq1wMq4wQVnQNkAbJtuESYKWiAbUtXVVENU9p1iiT4NzrjChRQnNmqK4DBSNDuoj0NjCkbScdGgsUzlXmgplWl4eKcpkZjQVSnHv6yuqapjdhZycLKGUkI+bFK22VOW9ae79xRe5NkInWcIPSOxR5IC7292ArqYqi1qNCfKDIxyzRV7pp8W53RxstX56oMRNQqEaEpTdzVGAc+tKCjRqNLIuWYpBWOsCwScAMOoSaxIKdoWCkEI4dYm06JNkbClQO32KFAZCIWLnN9GBUOoSOwq0TjzkGAnxGhFHxU8B/RUYC2PlEGpcrobIxgpjpYmfI1OAJ4zjWOCaWN+UBTUdxyyeMB5wq8sqlTummAn9V0Jvs7BYpfS3CstqlQ1CRdnX9tcqraFQwcNB98T7/LnKp0cJ+PywhG7s9vjXVXxXp0DHE7qT0lXuK+gIR2g/ydSjV01zZSR8Xdoc26jCbxN6rut5HuZTR/s0eH03xVlCz4B/Q3hYWefDxxua7/s6CAPnL9ijv8DzX8F6DbB9Npwrhvdb5wq5V4bPYb5Lne3lrwKcYDG1+W+k54P9Vw4b/puxs7Pz//IHkvGjBU3hWj4AAAAASUVORK5CYII=",
    qm: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAA2UExURUxpcdbc4MzO1dTZ3dTZ3s/T2c/T083Q1tXb4NDX287R19HV2+zv8PX29/3+/uPn6b3CzcTI0ZN/xtQAAAAKdFJOUwD////dexCfoCcDaycKAAACJElEQVRYw+2Y4XaDIAyFF2gnEizy/i87SJCCa13i9m9eLAQlHxfsOdZ+fFy6dOmSWPPdvdM063GfDo500yLnG8CfEh3AnxLnQ5bVE+810XYAu4dqiK7m2wH8C4+OKbahcsSfVnQeHTSLjLLNsW0boCE6u5nYbNrNFwe1a6VEVzM3hrUjic5Qc/uUOnyqslsHhosyoutYe/Zek9rhT5oVQNzl4qv4Lgbi92QsIY5UJwRiPUoO5gpiFmDDtsbpHCIXCMsjawnAE2AzjEIgki2kFMRIOEJGLDjEOpPM4UQZvOIiaLxMBKxnGSoEjgqPTmF38QQQHoOgu2RlQDcC4wiMv3XowwgMfrg86YDl+5dvCR/lnjyWJUQ4DczfPxaRngpwDhiZ9UpwCrgcCFRATyUeAaNXOfQFGN7jwkI3O48SAb2n6cNChY7abJ1cW08SLrnIUvZGCT2yVLQKL3aYZcKhvMIhD03xiBeTHugPiNHqgWaFGN6UCKtRA31a6UkSC4BrDsrTZU3KPSzzm7QafjjFWtcJIK3J6IA8PBNJaatrf914xsiBI3KnZGiAkTrcllMcmJfiLREDeXbDKYbrSqDQdD3xXa5J1HLsa98/O164h93Kvke7Uzrguy3spASafwK8a4CSX7BzGZj6rLSL66c0oleVyfRJyYyInipacX6hvzVbae8ymX4G6bvUPA0rTa+WTv5kb1L8J8b0o+4n/s24dOnS/9UX8vFAaEzio+4AAAAASUVORK5CYII=",
    php: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUxpcTbUrDrbszvetTXYrDnasjXQqTPIojfTrDvftTTMpjPKpDnZsTPIozXOqDjXrzHGoTbRqjfUre7/++T++Pf//SfCmxm3j1fXt7Hx4UvNrNL78XHfw8T26o3o0eeFKfsAAAAKdFJOUwA9//8c3Xign5/8SMcgAAADDklEQVRYw+2Y65qjIAyGp9ppRxBERcTj/V/mJsHTtN3dMNt/66dAEsjbgE/7jPPxcerUqVNsXW7Zb3WJx12z9E/6vMbyPtP0rcQsTd9KvKbpe4k3SkneR8wWVrL0yb8SM2QkQYGZYEsITnckMUteKX2KsImvgS/EJT4B86XtXhwx2xD5kp3nCwVHaHTnbOJXsuWv2Utd+WOJ+RcLmJOSpREw30T01U7yCx9Y0H0g+W6YIZRsYRxvfODGK/KiQHtqGjsePwU/MmMCi+84GArfgEZ0izBHHecQvzAFQaGyMBTFDDzbV2iuYWhcYBEgB1Ww42Yw1fdoDHDR3I00JhaAs1ndOCCUUS2lzLa2HgNj3TT1OIKLxIruiAorFPQz1GU9muEIx+CHeRxYQFwaUih/dmCVeISTMx1EBl9t4gKD/FAjz6AJoHp2znV1U0/+Z0A/1XXdOaex1hrYvRBtT8H8J8AcUyflBO64A3sQZSmJaOdIYInXDAzbtxIdPVCxYJoWnjQ86hhgCXkgKsoYNEsPkHo0OGN6/KAZglg5E4gSdIRTT/CRqhXEhmJt1+uwKgYYTmvqwdahWr3zXDxQOyDCF2NKwEHK7IhnkdeqMhqIRD9Za6cKjhC/cnCE/cIzOgqo6SrFQhz1DP0gZElG4C1rmEAQVKiR2A1dLzos1AmtyQWepjUgFlBvAqLyvYONWjhC9HuvWiTrCOB9X66la9vWjMCzHurSBlwndTRQaIFVQJPGGUFHqJBD7r4BLbhbFmsGkiUeYbdsFPxwhTV3ToVrfQKToZlxGqbRoRlmwhTNsYFbCsg4P3rY6pNgngWUa4IMjZ6MO0TlNssDEoS6BaLgl1qtrkTRiEt4wJAm9pKUXIuSa30xFUqp5IPEY0CqEOIB1Yo8cNSjFRZxgUrReuzRRlfto5ShgVjALU+9lDyabCBXHOBtW20eLBOaMSaM4HL+gr1gmtlBmG82NjrrHFys14A7MgizGQepbQpuzo7xBfw74lnrNPdd6no3LN35b6TX2/2vuv3gvxmnTp36f/ULf0R1znQ7804AAAAASUVORK5CYII=",
    pdf: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABUUExURUxpcf9zfP9ldv98gP92fP9+gf9we/9md/9yfP9/gv9/gf93fv90ff9od/9ref9ve/9ldv/x8f/q6v/8/PlYaP/g4f6lq/63vP2Ejv6Um/7Iy//S1LO+3cAAAAAKdFJOUwA93/8c3Xugn58XiwqYAAACVklEQVRYw+2Y23KjMAxAmzolxXc7tYHw//+5kmxI2tBWMDx0ZjkhMr6dkWoeSl5eDg4ODticmvZbTut151b+xNt5re9Nyl2NrZS7Gs9S7mts5M7GVu5sJKH4KhDbjS1shu2CKA36yj2ZaZ5vbGdNbT9zH+MaW8GFaeQLmcYF4XAbu37J2HKFiparyReu12ta+oOKEztDVXwKP+mKdKV3H8a7ZkWGqmxWihIEoVLT+FyA4tTc4g68VI39LHyGI3yva0WVKl1KzroOimkOvu8rhJNWmY6Eg17IcL0QcFRzkGovofZYc/C7ZahNBuHNbs+wpHKPrscH2yqt4YIBbGlOc4WPYK8rp/w4WhexhPoJem6SeJ7YKMRTDteQdxN2odDvIXRwpRBSjhD6rUJXL/xoPUBynRohjkL0Geh1nWILYblzk/cWQhx0DymGFDFCvqSDFSyhc64YCzKisBvDA1HqsoAvLBmil44khk/EXNesEhIiF1eMMaVaMWa8UahyimRLacy98xmdwM3ZTcKhbE+pG9xHIY+QaOf9JmFGW4hpIJU31npsMZgtJZMP60MJ2GDIGl/cbo3QAs5aUeqNqfe2DtVgax86bCFQE0wZ6lvSERzhpW6hE0np5r198sysEBqL5wm+D/sDlxUZep+73MMJ7CQs5/mLjys0pqSIj4uh8mdM7dTIE8KmCZLXW1MnHma5Qj4sofnrwmZhn3+I0Ph5gvMf7Am2ELjX0z21ZKozJUDDeg24eDaciuH99pXre2W+S52ZOV74b6Tn5vIrzYZfMw4ODv5f/gEm33Cvx+zPHgAAAABJRU5ErkJggg==",
    Null: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAA2UExURUxpcdbc4MzO1dTZ3dTZ3s/T2c/T083Q1tXb4NDX287R19HV2+zv8PX29/3+/uPn6b3CzcTI0ZN/xtQAAAAKdFJOUwD////dexCfoCcDaycKAAACJElEQVRYw+2Y4XaDIAyFF2gnEizy/i87SJCCa13i9m9eLAQlHxfsOdZ+fFy6dOmSWPPdvdM063GfDo500yLnG8CfEh3AnxLnQ5bVE+810XYAu4dqiK7m2wH8C4+OKbahcsSfVnQeHTSLjLLNsW0boCE6u5nYbNrNFwe1a6VEVzM3hrUjic5Qc/uUOnyqslsHhosyoutYe/Zek9rhT5oVQNzl4qv4Lgbi92QsIY5UJwRiPUoO5gpiFmDDtsbpHCIXCMsjawnAE2AzjEIgki2kFMRIOEJGLDjEOpPM4UQZvOIiaLxMBKxnGSoEjgqPTmF38QQQHoOgu2RlQDcC4wiMv3XowwgMfrg86YDl+5dvCR/lnjyWJUQ4DczfPxaRngpwDhiZ9UpwCrgcCFRATyUeAaNXOfQFGN7jwkI3O48SAb2n6cNChY7abJ1cW08SLrnIUvZGCT2yVLQKL3aYZcKhvMIhD03xiBeTHugPiNHqgWaFGN6UCKtRA31a6UkSC4BrDsrTZU3KPSzzm7QafjjFWtcJIK3J6IA8PBNJaatrf914xsiBI3KnZGiAkTrcllMcmJfiLREDeXbDKYbrSqDQdD3xXa5J1HLsa98/O164h93Kvke7Uzrguy3spASafwK8a4CSX7BzGZj6rLSL66c0oleVyfRJyYyInipacX6hvzVbae8ymX4G6bvUPA0rTa+WTv5kb1L8J8b0o+4n/s24dOnS/9UX8vFAaEzio+4AAAAASUVORK5CYII=",
    ipa: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABUUExURUxpcUOv/zar/1K0/1Cz/0+x/1q2/jGp/0Ku/163/zGp/1a1/zus/1q2/02y/0ew/0Gu//f8/164/+/4/+f1/9fu/yek/73j/6TY/xad/43O/3nG/21bnhoAAAAKdFJOUwB7//+gJ92gn59E+c9oAAACbUlEQVRYw+2Y27aqIBRAd5iVsLiICKT//5+Hi5hmdcD2wxnjOIPF4jZdPXX5+Tk4ODjIpj41b6l3+Br5iUupsr5I+avGVB99GvcaayqpI4ioz2MWJnGl0HiiNCpfIuNeibFZ6OQ6ysdqgbGhWeQbvZDQGMjCQOYlUmZsCHFXSIoTNEWvjXu5xjNZQVOgC3Hkskv4ict+YfXa2GQJq4r4lkI1z+UoSUhj9w+p84QrSEqGvpeLaeC0QzhBTdca8bx63i+0bavGvULmG1sNUrXKIu7SxU6ZcLoV7jM2qN5ixKJwkrJMIVtRxWG0g9Z8teQpEKZbZLB2kAzf9WiNsXL9uOIKiVVd23bKDLZ3icss+UpovMWTxlYZUii8hZPcvRgfZs+MkYKFPR/YLUfI3VkP41RtfL3Ugk/brmcKw3F3YdwU2A0a0q7nnC0MmI1QUeBLbkVC4YTzKzZViS+EYLpnFOd7hOK9UO4QCi6CUsCgNkYreNp2TeQJEzCqFyWKJdlC7hvwPji6h1d1hkSVr7O0QoGNCjqlQvdDp/phT4WTcOyjxvuS+hshCKM2GATlQogd9FTign7UMD0NMoUw4S4gbZ+MvdUo7PltgDxhOu3QyARj7/Gj4RoWFFXoC0GaGacydhhsSEgoML2FYiEAvovRjuzuAPdBxe8YSiu8wpPRox0hWfvyhWgOgLHWGDnc6JLZFbJrltDfjneQv4fiEJdR3ExZlhB9BFazXxCif0aIF/ExxmQKOE94SofxQxrTqWMHig3lfIOt8Qb0dpr1U+WKs8l5xw7I9UHmb6n6+qv1xT8xrn/ltOffjIODg/+WP3HMcIG4JOLbAAAAAElFTkSuQmCC",
    doc: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABIUExURUxpcTSL+DmO+VSd/k6Y/Vmg/kOT+jSL+UeW+1uh/1ig/k6a/T6R+l2i/0SU+0mX/Oz1//n8/y6G99fp/3ex/J7I/77b/4u9/gFOo+kAAAAKdFJOUwD///8n3Xugn58WcbRuAAACn0lEQVRYw+2Ya3ekIAyGCzozHQFRUPz//3RzQaSXbYPtOfthfccoCcljEM9pZ15eLl26dEms/v78q/oTvKf7SrdWZH9z7leJT+d+ldhTzQCfooH9oUw0Ee8D1qPyZXBsOxDdFuJzkKiBKAM2EIVAObEGdtlqv0SkRAB2XTfgQSMao5M/FKHpmxDYvdHO2G9S69YE/FD+5i5szxMdfq1eBDSYasiMYY8DJkcPuwuAr12uxNO2LgaHGWCM29Yhe3g7yZpfTa41xq/THJ3BNunUGZ8gMnAAs15FQBbUjHGe57W4IDfN87T44suAXUZ6WwFZCwDnZSx+S4cA1AeQnwEBp2X054DjAVxiXPclzyeAno4d6I2DwbT5/Rky0IuBnnjeH8AVrrC7PgPtniED+l0Z6D1txTwn7w8gp5wEJuLh+1KA/jRwWv2GFGwymR8CFQEH7DMmRG0ZOLYCucAyEFFx0REvWwGOcuAIgnw4qwgrRdCUVNhgMEFgQiBO4yEGkqyielB0IahEw5mBWSeBcQ1KB7fjfw5MXlmrw5rdRf8QGJegrbVqTNltBtrRVsC4agU+tLjECkhJIiA0A+koBqYBGsSI4kUD0I6cJAVSOjw12ljcEcJDi0PKQBKkSDvkfAJGeAU138PSy5iBvIYmIO1rTAu8MiUwJogYVVIkwMcBVAb+jFKDOQCL3lZ3BOyjCQhLROkKSBHVDNRQSqb28gyliOIImQioK0ExC2E5oqp5GZBrbVX3PmJ3p7nD7/TPgEpXD0oVU8XN00oGpEqsUQc5UxWb2k0EVG/F2Ix4LwnwXld+AtF1WPIfbK8aJPqq8pDzJCsG4YICV4S9NByUUFwt/C7VP7AgUBGcw0cmTQZhf/wjxuNb3c/8mnHp0qX/Vn8A5AVWOPvxckoAAAAASUVORK5CYII=",
    xls: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUxpcYXMX2m8Pmm8P3zJWYbNYXvGVGu9QHrGU4jOZITMX4fOY4HKW3fET3LBSm+/RnrGU37IV2u9QWm7P22+Q+r94PP/7dv2zfv/+GGyNlmsLsfrtaTZiLPhm5TQdN9r514AAAAKdFJOUwB/e98c3T2gn5+4KvYSAAACu0lEQVRYw+2Y63qjIBCGmzRtqhwV1Arq/V/mDgMeYtLtkM2/9ROBGWZe0aB96NvboUOHDpH1eSp+1Gc+7lKwv+njksv7YOylxIKxlxIvjL2WeGIvJhYlY1BYiRU0ZahZcqYjh1ggJCqmL8bcCVejE4tyL/awSybeA38QlXgL5PsuzyYWMYmvhfNECS3nWDCGRiw4T0lr2bjwLCOSnyjAL56hz2wg2yNuHadM4NA0vpyNCs6pa7ot8osIrGI6a76/Wx96FVZ8Asc3OmIAEVghDw7WQX47Qq8KNo+212ihjwSsFsmxjcQo1oHZdpNYIzKBVnokDmiVvgV1Q/88UPQCic0EhvZN5Cn9DDAmyb5Kt1lV8Is3TTc4k3iaDNRah/DQaOngwYWJMZgg8MYeblhrHIOWDFxl3QREmKMeuq4bVS8TLooIrDZE44bw7FpvpnGYeYvyZ6iF6cdAbCbn3J6XCxSR6JDYTb2RuzEaUKQMEbLgkH2a45A8cw0tDXgjAMve+kTc6wmgECOsPhGJ7BXA8D43ggdi05X/DsTvQ8Nc6fFN4c8AJRyhBOEXsPXKwAJHYnimOChzZihThmRxUVe9hAWORB8vJCOXBJSAk1E8vMiN186KhTjKTQAFeMVwgVn43HzpDFgKliMShwQTdOCsMgC6CXkr0as1IhMoPHxhht4kgnXKw1+9wa4R1yygMnoYJ9cvM6qdHMfB1PnAhDAufGHU5gpgoiP6FA2oIFBFGUi30UQIOmqFXaXIwK2supW1N5584C8iAu+mdW+kmga04caCQpqdLWXTwDwaeiSgzRAVWGNZzrVb12tTk4E1CKuUbdGyyZWGoijAc30nu1xhrzNl8/0o0dSPRdoGXGuTVMezNvVibioQ5Y5hf/u+JPygefiduJe6XA1JV/qO9HK+/qrzE//NOHTo0P+rP7x4jQVHYv00AAAAAElFTkSuQmCC",
    ppt: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAByUExURUxpcf+ubP+iWP+SO/+nX/+lXfyPQv+SO/+dUP+xcP+ua/+VQP+jWf+XRP+cS/+eT/+UPf+ZSP+gVP+qZf+saP+SOv+mXv+wcP+ta/+ubf+oYv/79//x5f/m0vmEO//MpP/Sr/+9i//Zu/7Dl/ufY/2zfqeIp1YAAAALdFJOUwDdPXugHPygn596VuVMqAAAAl1JREFUWMPtmOtyqjAQgNuqUBQSEi9cDHJR3v8Vzy5JJHi03dAz0x+HD3LZTfIZ6tCZ+Pa2sLCwQOZjG73kw1+3ibKveN/4+t6z7J8a7f6Kp7bC27gp7mTFC7yM28nS/OfGKC9y0OSIafJi6A1FJ3IPY5SToBuj/JAfDkMxNSzHzpDN9e1jXB+IUI1/CfemjJGfcb0HDvbe23rvZGxMM673dCKqsJwsK+916SYQyn+KdemQVec7qmqy8oGtr7A5T6kfhGsP4QlLd/7aSBKeRuJueFSNUmi8nspxfJ6wuWn6Gv+gleM7neYI1fViucIeVTtLGOv5slMg5FITXGCLqo6dCTRhfIoRqLVQ2lA0Sqkujk0MGZLQrEZAqKwQ4ChspDOBIvyMR2QzEUr4plXNnQmfnkI+FbYQVf0coTRlFGZt22KgOm78UlKFckQL4VuulaHqA2dczhFWICwro6uuAfuJkDXVIJSNfvu69jLZIFnIXWHLZXKrkf52Cbi/kHOORmg4q2FbLePMvnwJw5HhA3GcU4UWK+QiQATjD/gKhRW+4idCePCZQjaihQK7nLnYyFeYjMKnPjZnh90TIfMSCsG0QrDk2lVdD5EQOoE9HDYTBE2IizRJ33RNkYgJzOkTdzgKg6zNggeh8BSGxqWF8HYEj5bkXtGEiUsa7IYWDM8IvYXf8GvCHZLglZgIG33ZLvZ2JOHOg98Vpvc2HQOHNKUJV6kHK8rh+8m64ysh6RgQpsdjaq7hhmK6OmeGIU95YjjfBkciAfEstQlpvpB+It2swm9Zzfg1Y2Fh4f/lD1FNqKcd3wCLAAAAAElFTkSuQmCC",
    png: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABpUExURUxpcf+ubP+eUP+iWP+xcP+nX/+lXf+SO/uPSv+dUP6kX/+XRP+VQP+SO/+jWf+oYf+hVf///f+mXf+tav+ubf+rZ/+eUP+wcP+pZP/s3P+aSf/z6P/48v/UsvqFOf+6hP/jzf/Hmv/cwS4F5mYAAAALdFJOUwDdez2foByg/p/2onNSOQAAAh5JREFUWMPtmNuSoyAQQGeMUaZUxBveRfP/H7lc1VRJptF92Kr1INqtcKqNSSrk6+vm5uYGzMPzrTzcdYFff+I7cPV91/VfNZr6ykNb6WwMypW6tOBk9EoALka/KMtCTCr05OKi0S9AwI02YXXW+KwqMVluMqw4SimjtUGNzwoK0HgobC4Yn42iat6DanfKnPZdhCAersK0KcfXWOtYbPtrTeNBhGnapCt1n2VZX6cWnjDhjjETjNeFudrhWQpfeS7PqJ5vI0DCXJLKPVmkcMH5MQ5CBaGvIRtehIhkGVp2VmgqwgixhSEkciYeDz4jxDkWyD1F0zQhKrJZ3zzG+jKPQMLNJiAd6ogImHw1+1UngQh/8DHqefMS9/ycFhJVIC+ROAvJnrodRn7ARBfIS+TJirOwEp88JsTGx0skF4Tyfd3nZCtQ+c8KG3OXW4FZ1lJHIeUQ1dVXQzY0vMDBbLJEKjsFCxX1oOmHPe02wlHYDsewk0LWW5jPCfPZJuyZm7BTbWmtzHoMTNgpcPuBUg+CCSkfSTv2wTdXskKoUFGMdhhyqlASTcjOlLgLu3iyk0QOwjDqePsFfgeiA4VqykefCUK40KZ457wwuiaMBZFokc7EQTUTiigGCWMH/m1hAhR624TETFSh7Em8Np5DfsE+EgdAy4BQD473M9+SNYPcMV/fImh9CLiWCkKYL4SvSAMv/BXvxL8ZNzc3/y9/ADVfok94AIhIAAAAAElFTkSuQmCC",
    html: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUxpcTbUrDrbszvetTXYrDnasjXQqTPIojfTrDvftTTMpjPKpDnZsTPIozXOqDjXrzHGoTbRqjfUre7/++T++Pf//SfCmxm3j1fXt7Hx4UvNrNL78XHfw8T26o3o0eeFKfsAAAAKdFJOUwA9//8c3Xign5/8SMcgAAADDklEQVRYw+2Y65qjIAyGp9ppRxBERcTj/V/mJsHTtN3dMNt/66dAEsjbgE/7jPPxcerUqVNsXW7Zb3WJx12z9E/6vMbyPtP0rcQsTd9KvKbpe4k3SkneR8wWVrL0yb8SM2QkQYGZYEsITnckMUteKX2KsImvgS/EJT4B86XtXhwx2xD5kp3nCwVHaHTnbOJXsuWv2Utd+WOJ+RcLmJOSpREw30T01U7yCx9Y0H0g+W6YIZRsYRxvfODGK/KiQHtqGjsePwU/MmMCi+84GArfgEZ0izBHHecQvzAFQaGyMBTFDDzbV2iuYWhcYBEgB1Ww42Yw1fdoDHDR3I00JhaAs1ndOCCUUS2lzLa2HgNj3TT1OIKLxIruiAorFPQz1GU9muEIx+CHeRxYQFwaUih/dmCVeISTMx1EBl9t4gKD/FAjz6AJoHp2znV1U0/+Z0A/1XXdOaex1hrYvRBtT8H8J8AcUyflBO64A3sQZSmJaOdIYInXDAzbtxIdPVCxYJoWnjQ86hhgCXkgKsoYNEsPkHo0OGN6/KAZglg5E4gSdIRTT/CRqhXEhmJt1+uwKgYYTmvqwdahWr3zXDxQOyDCF2NKwEHK7IhnkdeqMhqIRD9Za6cKjhC/cnCE/cIzOgqo6SrFQhz1DP0gZElG4C1rmEAQVKiR2A1dLzos1AmtyQWepjUgFlBvAqLyvYONWjhC9HuvWiTrCOB9X66la9vWjMCzHurSBlwndTRQaIFVQJPGGUFHqJBD7r4BLbhbFmsGkiUeYbdsFPxwhTV3ToVrfQKToZlxGqbRoRlmwhTNsYFbCsg4P3rY6pNgngWUa4IMjZ6MO0TlNssDEoS6BaLgl1qtrkTRiEt4wJAm9pKUXIuSa30xFUqp5IPEY0CqEOIB1Yo8cNSjFRZxgUrReuzRRlfto5ShgVjALU+9lDyabCBXHOBtW20eLBOaMSaM4HL+gr1gmtlBmG82NjrrHFys14A7MgizGQepbQpuzo7xBfw74lnrNPdd6no3LN35b6TX2/2vuv3gvxmnTp36f/ULf0R1znQ7804AAAAASUVORK5CYII=",
    js: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABpUExURUxpcUOv/0uw/zar/0+x/0Gj/Fq2/jOp/0ew/123/zKp/1S0/zqs/1Gz/123/02y/1i2/kWv/0mx/0Ct/1y1/vb7/1i2//7//zel+zOe+e32/9zt/5nN/ieV9oDG/avZ/83m/77h/2S6/HhIljsAAAAKdFJOUwB7Pf8c+92gn59dd850AAAC8klEQVRYw+3Yi3KjIBQG4CbGpgaMNyQIiJf3f8g9B8Rqp9mCszO7M5u/Kgj6iRrb2Le3V1555ZXgnE/Z05zjuUt2/13eL7He+/0+457zlpk/i1jRjo/ZCQC2Hx6LH+MF92EOhIJt9LtviRJPFsMgY0vPr2aUmDmFlY5i68q2ZBFiVpYcf3jpwjnDFoZ15mZsChczRKxkC86Xlc+4erCY+T34TvENnPuxh4rZdiR8M0BeLlfCwcFiRqxGcOJYJxB3AEJ4STiuEuzhYWJGvqYkz5IdA58FDnQ+AOb5bOY8/948BYAfFoEJZ6gWWraK5S5kaffLkHP+yPepxsejHep9I1nKj3iwThWAOi3y7xIIbnYuPOiHCH0Fzm6jIBC2LZZ9IJUHi2JpsYsocJeqW8Fv8g+AtQcrEOuDYF3Xbl8oNmBtJiXlONxtb23nILDepfEgmdr2AdVWGduBxz0Cpp1qARTVAFwrJSwVX3vjwapZwEI+HnLSelKtNHFgZYNYBROCLYB3BLu+F2YYWGW7YItgsK58PJjjpTRCdL0QYu2NGOFXMJ3wGqrBFEI0fwIUbJT2Jkv96R0AGw/SjuhR2Q+OjgWbBqHakAZCEZRaNKLrajPgMOUM/bBFEw5CcngqNJQilwAaATTckG6GS9kOjU8QaLekGh2dixnPWDHBBk0o3GRzEBRGoQgBTw6dgAdPDXda2D8INBqE09Mo2siRdWKQ9smDRw/GSw+MsOv0KG3UxPoOnmV7i/GzqLsVvAaPkMJTxvQ0juOgU/AoHGBSSqpxgseFokgDwSsFjuIt7fsUvlqmPXo0gWduNsbMokcPN4FFGOgCJ927oOcPsa65xIA0ARIjbsnSkMDvBZHQo+AC7ISdFgwmid8xwfqmZjtcxdWDwGQNXebniQR/zl8Eb3Za8rV2s/MtEDwlN4hdLFkbkm2LXQn5Bnu+hQbIoNeAa7B4CzljeL9NQ7008F3qEjjGa/gb6eV0/TGnA//NeOWVV/7f/AJAsosfySCrjgAAAABJRU5ErkJggg==",
    css: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABaUExURUxpcXvGVGm8P3zGVXzJWYbNYXbDTWu8QHnFUofNZITMX3zHVXTCS22+Q3jEUIHKW4jOZGq9QHDAR////mi6PvP97pbRd/v++tXwx+b33afbjV2vMrznpsnquGjfsnAAAAAKdFJOUwA936wc3Xign58XA1ZcAAACuUlEQVRYw+2Y2XbjIAyGm540qc1qAl7j93/NkQTEdJsKtxdzzvg3iSVAH8JRFufp6dChQ4fYOl2aL3Wqx50b+ze9nGt5L9b+KrGx9leJZ4ppv2C11KqIlxTUUnib6akn2TXEBigY3RKtJdncgRb1VBCb9o0Ikq0Hvob4Dvil2EQukE18CzSfmlXEJoaaTDCtMYmFZ2Oo0SCP2BiTgrZWdNGjjUjTsIEP2TvIRrsv7KRTJbDtpwCaKEkb7b4EXhjA1zJgHG63YYiQfhrQG8vxVz5QECMAYRrv5Oj7OAEx9MUEJlCkJhA49cJLjJZe9BMChcnju4DjsihtBEgtC1wCAAph4sEDik0EVJpsYGqVgVk1QJOBMjkgHYFGxGbErgzl5uufZPgZUBJQ7wbqeYC6ewcc5t1AM0PdDfcMBI5coRCn2USPD9QUYMcAvGmW6FC8lj0uEcYWHc0F6igxwwW8DasjJ/ZJhynewpzmaDYQAbhh3LEuRHuGrHWaVJOh1PcplNmgMOsw3p2szRCB3vf4oq7ybYLD2HuvdwC18wvUIZRNAaSyWbyrBErasZaKCttFj9agwu6kTBeFCZQQgA2qJAJpAVQEYoeMs1hAuSkCNz8Ciwk7gMOofgi8FvHx83DrUONtV4auBIbZJldYKsPe1QJdIjpn4TtkCGHUDnvGEPCzwbo0DBOunC3jRJJ0ag30VrPo2onex6tym3jAjHPOt+sEWuMS0bY+DspaIEotvp/n2SDDeQFmr5a9GZL8QurQ7qLtdwEfQcqDusJWJY8LVBClElahMj06xRALqB5y6jtVAtU/Duw+I3TpGQ9oHOAF5r6TSo8PHYrzC/bUcQVI1m3AFSd7FpKzY7i/fQaaj0Sf0dsCNOLpeGbeS52vnY/K52R3yeji6cq/Iz1frt/qsuPfjEOHDv2/+gP0toi4gXoofgAAAABJRU5ErkJggg==",
    epub: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUxpcXXDTXvGVGm8P33HVnzJWYbNYWm7PYjOZXPBSmu8QG6/RXPBSoHKW4TMX37IV3nFUYbNYonOZOv+4fX/7/z/+1utMK3gkuL412O1OFOpJ7ripNf4xXK6TKHWhX88Tv4AAAAKdFJOUwB7Pd+gHN2gn59lNj8pAAACeklEQVRYw+3Y2XaqMBQG4GK10gxCgDII8v6P2T0kMhR7dujl4QcMCcm3Ni7tkr69HTly5Ig4pyR9mVM8d0mL3/JxifU+Xkhup5jyQudmkpuNuEjx4ii0fHlWUIt7lJiwsZVpOEZMnSQRYnpzsGH8WmyphxdcGJaL6U0WsSgFxeIStOtTGy2eeZGddmu9gq21tNMcmXi21i+adtsMQ8MdOm5M2lQMrtKUVVU2GxdO+8Cm/IJsickukL1N8SwEM9wzS2cZeVXlRT9uuZGBmfey7OmVfU9Nk3HoKhwiMFuEvaaum4XoEw8G736ve7rr8W8gfF64PqXqrsX3sv8TSF4Lns5zPWKF7ZjvAHPcYZt5jFft2Bm+RpsYpCBRVegpxqEz1p3BSzQHDhFI2JPg+3162LGjYy4CRKKt8AuM9c086BRDC+8kJwI0AxDVsPYMeNAZIsBPD/ZYYfsAIh/beX34l6c30aDOeyxrKHyB8/rKPtPxYP3AGksQDbxrw8J71FGggS033T2IpstHu/Du+OHBaZ+yClei6+7wVf7pQWSgMQYPTWJZloPt6g48N0CnJY9n5EYEhsn5JN40jJBXes+TQjBkEp33qD7ttXhwLi69kFhwJm568eAkbnpScL5IPcXJ09EVatq4CSJ5ylvabyKQpkKoEC/Cb5vg8bjhCTJQMxeCd62KQqG3jhA0k0ivCr973gvXTAz4I6qr6436ZOBVb4lqi9P6KgSV5vXzVz8YXvlEDoZlrE2KmholrVC9iN4Yk4AJLdW0XqvQeO454HXJL9iTiojoMeAq9yR3DM+371LvXfgsdRHWeJU/kV6S6z+T7PhvxpEjR/7ffAMGOojXQYbbiwAAAABJRU5ErkJggg==",
    psd: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUxpcUOv/0uw/zer/123/0+x/1q2/jOp/zSm+Uew/zKp/zys/1O0/1e1/0Ku/0+z/1q2/0mx//7//164/vf8/9vw/+r2/yie86HX/sno/7Dd/5TR/W6//H/H/Eyv911ykpAAAAAKdFJOUwB7Pf+fHN2g/p8jQekrAAACx0lEQVRYw+2Y7WKrIAyG12JXJn4xEQG193+ZJwnYOdedE7r9O74qBQyPARNb+/Jy6NChQ2ydT8W3OufjLkX/N71ecnmvff+rxC/+dT8jXnB8162sLhK7T/As4glgHR1xT0Vs0iW6PGKxYXxo35FBJGC9B37p4BOLdXhd42e9QdaxXecRi5opLpEN5BITsKL9oao8YkGoqkpIrJAIRY2azuFR8IB31bvPXQuY5zzgA8hOJwbwbTWevY3yof+GV3Hm/NZG29ab9yhjrOsq6E57C2Ub9zcWMEoP7x8yvqPOalOicoANAu0AsuCqce0j5QJNmPt+cQMQ7fwzoI7AaURNdueizgRq3CJQKiXl6GH2Xn/QyIAN1BqsdQS6BmvSAXDQO6ERF6hX4BSrAYGNnp3HqJw1eYhlDlCRh1TtcA2DmixFJkTl3ct8IE65whC3S49YSzG0PAt8H1wIAaPGeFxI46cJmiY8DYS0M4YyZZawkGaGIJpDmJs8YANbAqZk9ouUOPFwgyAapWySEQvYRBHQrI+bUSoKb+unVkoVTXTDA9LFCWiG4JxbejnKppG0mHiTa4JpKHM9TKk3Iq+RcvKDoRvUJptngBJFU1RyvM3BU14/AxQEVI1aByNxHG/OYtb8ALiqcq5SAlYTgW0+UO2BkHjWzbqZTPRQsYEwS4Xzi0BFY2Gb4R5jFGEawlMNjOAcDxgFgWzspO6S0xC/tYwNcJsQp9Q1B7h4COgNEHLOD9YO3kUeigO8rgB5629SbYljvSzLfBtH8QxQYJBsgfhdEKP8zssCAlEKsQViD4V5arGBQgmBKEGVeNBwkZpCxS4hWECRoWyg+m3gb3lYRvPyXpapsjlRZnlYpm2tf7pEmcqSBzyVDyUe9nJ+wZ73gx+jolivAdeSLc6M4f1WcnmS+S51Yfp45b+RXk7Xf+r0xL8Zhw4d+n/1B13vfAhtdKi2AAAAAElFTkSuQmCC",
    dwg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABaUExURUxpcXvGVIbNYXvHVHzJWYbNYXbDTWu9QHrGU4jOZHLBSW+/RYDJWmy+QoXMYHzHVYjOZHfET2m7P4LLXf3/+/T+7u3+5MXrsaXbiVyuMZjUeNb2xOP81bPjmuZ7vy0AAAAKdFJOUwA9z1wc33ign591Bg7OAAACdUlEQVRYw+2Yi3KjIBRAm51UI4gKxMei+f/f3PsQNU3SXtzOdGfWo0W4wBGFau3b28HBwYGYU1a85JSuOxfNZ/w6p/rem895TzQWTfOtxjP1qWCDtJoLK1WyMcM+VUUu1pJ3ls6nSDEW1UpTvSLBWFRf0iQZXwn93jFuhd7fK/2SJhgL9Hh0ecp5P4tn3xzwYmPhX0En2SL7nXkirEIPNA/xspAIL9Cw9CUmsV85dG3bBcjNgSUjeVJcykeG9nrtAmX9/MNJtk9Yk7B5cqbLvymsdwjr2LOmBIVtU3OMQ9xGJIQOQHSFGzBegR5zoV4Qj7DeQiumbVGIx26gEXICpAvr4bqlHe5r04WWhB1BQvsdwo5uX4/GvxCGgejBMv4mJpwZjoY0IY7C9nSZNB+jI1DY8tXfsJGVCi3Rt8tUjBoDelrn5mbBJxVi29qqG60XXDLtqFjYXudQd1N8VqEQUUNPTNA/jhCyE0cHRUNMEiq+cbiwV2E3cFTvGKHjqQ34bB0Jespy1NlkIQwR0aG7I2iOJwmVje1BG6atbwpQxbUqZYRq3ej9NIJ1GjGHwk21SKgiFndL7xQU0jvFLlWERJhHE3ehuQnTNI2WZmOxUQuhcDsK44xzJCx5vdyRJFzRYQShf6xQ+U8J9VOh3inU4NMAaTULccWUmopUrRQ3kAkfqQJgn1TsFBpaO+77hHp+xOwXmo9DhNVoOLipMlKh0dibd8waLq7HWDBGJDQJ/IgwM3zHIm5JlpQ33CV/wZ6wj1t7UT4KaLY5R4noMyB3EXN32BRiRHLF8H2rnRAt/JY65zJfLv8iPWf5l2Q7/ptxcHDw//IHYWiLelDcDu8AAAAASUVORK5CYII="
  };
  const PopsFolder = {
    init(details) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "folder";
      let config = PopsFolderConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      config = PopsHandler.handleOnly(popsType, config);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar
        },
        {
          name: "button",
          css: PopsCSS.button
        },
        {
          name: "anim",
          css: PopsCSS.anim
        },
        {
          name: "common",
          css: PopsCSS.common
        },
        {
          name: "folderCSS",
          css: PopsCSS.folderCSS
        }
      ]);
      Folder_ICON.docx = Folder_ICON.doc;
      Folder_ICON.rtf = Folder_ICON.doc;
      Folder_ICON.xlsx = Folder_ICON.xls;
      Folder_ICON.pptx = Folder_ICON.ppt;
      Folder_ICON.dmg = Folder_ICON.ipa;
      Folder_ICON.json = Folder_ICON.js;
      let zipIconList = [
        "rar",
        "7z",
        "arj",
        "bz2",
        "cab",
        "iso",
        "jar",
        "lz",
        "lzh",
        "tar",
        "uue",
        "xz",
        "z",
        "zipx",
        "zst",
        "001"
      ];
      let imageIconList = ["jpg", "jpeg", "ico", "webp"];
      let codeLanguageIconList = ["htm", "py", "vue", "bat", "sh", "vbs", "java", "kt"];
      let androidIconList = ["apk", "apkm", "xapk"];
      zipIconList.forEach((keyName) => {
        Folder_ICON[keyName] = Folder_ICON.zip;
      });
      imageIconList.forEach((keyName) => {
        Folder_ICON[keyName] = Folder_ICON.png;
      });
      codeLanguageIconList.forEach((keyName) => {
        Folder_ICON[keyName] = Folder_ICON.html;
      });
      androidIconList.forEach((keyName) => {
        Folder_ICON[keyName] = Folder_ICON.apk;
      });
      if (details?.folder) {
        config.folder = details.folder;
      }
      let zIndex = PopsHandler.handleZIndex(config.zIndex);
      let maskHTML = PopsElementHandler.createMask(guid, zIndex);
      let headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      let bottomBtnHTML = PopsElementHandler.createBottom(popsType, config);
      let { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      let animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
`
            <div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" style="${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>
			<div class="pops-content pops-${popsType}-content ${popsUtils.isPhone() ? "pops-mobile-folder-content" : ""}">
                <div class="pops-folder-list">
                    <div class="pops-folder-file-list-breadcrumb">
						<div class="pops-folder-file-list-breadcrumb-primary">
							<span class="pops-folder-file-list-breadcrumb-allFiles cursor-p" title="全部文件">
								<a>全部文件</a>
							</span>
						</div>
                    </div>
                    <div class="pops-folder-list-table__header-div">
						<table class="pops-folder-list-table__header">
							<colgroup>
								<col width="52%">
								<col width="24%">
								<col width="16%">
							</colgroup>
							<thead>
								<tr class="pops-folder-list-table__header-row">
									<th class="pops-folder-list-table__header-th cursor-p">
										<div class="text-ellip content flex-a-i-center">
											<span>文件名</span>
											<div class="pops-folder-list-table__sort" data-sort="fileName">
												<div class="pops-folder-icon-arrow" data-sort="按文件名排序">
													<svg
														viewBox="0 0 1024 1024"
														xmlns="http://www.w3.org/2000/svg">
														<path
															d="M509.624392 5.882457 57.127707 458.379143 962.121078 458.379143Z"
															class="pops-folder-icon-arrow-up"></path>
														<path
															d="M509.624392 1024 962.121078 571.503314 57.127707 571.503314Z"
															class="pops-folder-icon-arrow-down"></path>
													</svg>
												</div>
											</div>
										</div>
									</th>
									<th class="pops-folder-list-table__header-th cursor-p">
										<div class="text-ellip content flex-a-i-center">
											<span>修改时间</span>
											<div class="pops-folder-list-table__sort" data-sort="latestTime">
												<div class="pops-folder-icon-arrow" title="按修改时间排序">
													<svg
														viewBox="0 0 1024 1024"
														xmlns="http://www.w3.org/2000/svg">
														<path
															d="M509.624392 5.882457 57.127707 458.379143 962.121078 458.379143Z"
															class="pops-folder-icon-arrow-up"></path>
														<path
															d="M509.624392 1024 962.121078 571.503314 57.127707 571.503314Z"
															class="pops-folder-icon-arrow-down"></path>
													</svg>
												</div>
											</div>
										</div>
									</th>
									<th class="pops-folder-list-table__header-th cursor-p">
										<div class="text-ellip content flex-a-i-center">
											<span>大小</span>
											<div class="pops-folder-list-table__sort" data-sort="fileSize">
												<div class="pops-folder-icon-arrow" title="按大小排序">
													<svg
														viewBox="0 0 1024 1024"
														xmlns="http://www.w3.org/2000/svg">
														<path
															d="M509.624392 5.882457 57.127707 458.379143 962.121078 458.379143Z"
															class="pops-folder-icon-arrow-up"></path>
														<path
															d="M509.624392 1024 962.121078 571.503314 57.127707 571.503314Z"
															class="pops-folder-icon-arrow-down"></path>
													</svg>
												</div>
											</div>
										</div>
									</th>
								</tr>
							</thead>
						</table>
                    </div>
                    <div class="pops-folder-list-table__body-div">
						<table class="pops-folder-list-table__body">
							<colgroup>
							${popsUtils.isPhone() ? `<col width="100%">` : `
								<col width="52%">
								<col width="24%">
								<col width="16%">`}
							</colgroup>
							<tbody></tbody>
						</table>
                    </div>
                </div>
            </div>${bottomBtnHTML}`,
        bottomBtnHTML,
        zIndex
      );
      let $anim = PopsElementHandler.parseElement(animHTML);
      let {
        popsElement: $pops,
        titleElement: $title,
        contentElement: $content,


folderListBodyElement,
        folderFileListBreadcrumbPrimaryElement,
        headerCloseBtnElement: $btnCloseBtn,
        btnOkElement,
        btnCancelElement,
        btnOtherElement,
        folderListSortFileNameElement,
        folderListSortLatestTimeElement,
        folderListSortFileSizeElement
      } = PopsHandler.handleQueryElement($anim, popsType);
      let $mask = null;
      let elementList = [$anim];
      if (config.mask.enable) {
        let _handleMask_ = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML
        });
        $mask = _handleMask_.maskElement;
        elementList.push($mask);
      }
      let eventDetails = PopsHandler.handleEventDetails(guid, $shadowContainer, $shadowRoot, popsType, $anim, $pops, $mask, config);
      PopsHandler.handleClickEvent("close", $btnCloseBtn, eventDetails, config.btn.close.callback);
      PopsHandler.handleClickEvent("ok", btnOkElement, eventDetails, config.btn.ok.callback);
      PopsHandler.handleClickEvent("cancel", btnCancelElement, eventDetails, config.btn.cancel.callback);
      PopsHandler.handleClickEvent("other", btnOtherElement, eventDetails, config.btn.other.callback);
      popsDOMUtils.append($shadowRoot, elementList);
      if (typeof config.beforeAppendToPageCallBack === "function") {
        config.beforeAppendToPageCallBack($shadowRoot, $shadowContainer);
      }
      popsDOMUtils.appendBody($shadowContainer);
      if ($mask != null) {
        $anim.after($mask);
      }
      class PopsFolder2 {
        init() {
          config.folder.sort();
          this.initFolderView(config.folder);
          let allFilesElement = folderFileListBreadcrumbPrimaryElement.querySelector(".pops-folder-list .pops-folder-file-list-breadcrumb-allFiles:first-child");
          Reflect.set(allFilesElement, "_config_", config.folder);
          popsDOMUtils.on(allFilesElement, "click", (event) => {
            this.setBreadcrumbClickEvent(event, true, config.folder);
          });
          popsDOMUtils.on(folderListSortFileNameElement.closest("th"), "click", (event) => {
            this.arrowToSortFolderInfoView(folderListSortFileNameElement, event, "fileName");
          }, {
            capture: true
          });
          popsDOMUtils.on(folderListSortLatestTimeElement.closest("th"), "click", (event) => {
            this.arrowToSortFolderInfoView(folderListSortLatestTimeElement, event, "latestTime");
          }, {
            capture: true
          });
          popsDOMUtils.on(folderListSortFileSizeElement.closest("th"), "click", (event) => {
            this.arrowToSortFolderInfoView(folderListSortFileSizeElement, event, "fileSize");
          }, {
            capture: true
          });
          if (config.sort.name === "fileName") {
            popsDOMUtils.trigger(folderListSortFileNameElement, "click", {
              notChangeSortRule: true
            });
          } else if (config.sort.name === "latestTime") {
            popsDOMUtils.trigger(folderListSortLatestTimeElement, "click", {
              notChangeSortRule: true
            });
          } else if (config.sort.name === "fileSize") {
            popsDOMUtils.trigger(folderListSortFileSizeElement, "click", {
              notChangeSortRule: true
            });
          }
        }
createFolderRowElement(fileName, latestTime = "-", fileSize = "-", isFolder = false) {
          let origin_fileName = fileName;
          let origin_latestTime = latestTime;
          let origin_fileSize = fileSize;
          let folderElement = popsDOMUtils.createElement("tr");
          let fileNameElement = popsDOMUtils.createElement("td");
          let fileTimeElement = popsDOMUtils.createElement("td");
          let fileFormatSize = popsDOMUtils.createElement("td");
          let fileType = "";
          let fileIcon = Folder_ICON.folder;
          if (isFolder) {
            latestTime = "";
            fileSize = "";
          } else {
            fileIcon = "";
            if (typeof latestTime === "number") {
              latestTime = popsUtils.formatTime(latestTime);
            }
            if (typeof fileSize === "number") {
              fileSize = popsUtils.formatByteToSize(fileSize);
            }
            for (let keyName in Folder_ICON) {
              if (fileName.toLowerCase().endsWith("." + keyName)) {
                fileType = keyName;
                fileIcon = Folder_ICON[keyName];
                break;
              }
            }
            if (!Boolean(fileIcon)) {
              fileType = "Null";
              fileIcon = Folder_ICON.Null;
            }
          }
          folderElement.className = "pops-folder-list-table__body-row";
          fileNameElement.className = "pops-folder-list-table__body-td";
          fileTimeElement.className = "pops-folder-list-table__body-td";
          fileFormatSize.className = "pops-folder-list-table__body-td";
          PopsSafeUtils.setSafeHTML(
            fileNameElement,
`
				<div class="pops-folder-list-file-name cursor-p">
					<div>
						<img src="${fileIcon}" alt="${fileType}" class="pops-folder-list-file-icon u-file-icon u-file-icon--list">
						<a title="${fileName}" class="pops-folder-list-file-name-title-text inline-block-v-middle text-ellip list-name-text">
						${fileName}
						</a>
					</div>
				</div>
            `
          );
          PopsSafeUtils.setSafeHTML(
            fileTimeElement,
`
				<div class="pops-folder-list__time">
					<span>${latestTime}</span>
				</div>
				`
          );
          PopsSafeUtils.setSafeHTML(
            fileFormatSize,
`
				<div class="pops-folder-list-format-size">
					<span>${fileSize}</span>
				</div>
				`
          );
          let __value__ = {
            fileName: origin_fileName,
            latestTime: origin_latestTime,
            fileSize: origin_fileSize,
            isFolder
          };
          Reflect.set(fileNameElement, "__value__", __value__);
          Reflect.set(fileTimeElement, "__value__", __value__);
          Reflect.set(fileFormatSize, "__value__", __value__);
          Reflect.set(folderElement, "__value__", __value__);
          folderElement.appendChild(fileNameElement);
          folderElement.appendChild(fileTimeElement);
          folderElement.appendChild(fileFormatSize);
          return {
            folderElement,
            fileNameElement,
            fileTimeElement,
            fileFormatSize
          };
        }
createFolderRowElementByMobile(fileName, latestTime = "-", fileSize = "-", isFolder = false) {
          let origin_fileName = fileName;
          let origin_latestTime = latestTime;
          let origin_fileSize = fileSize;
          let folderElement = popsDOMUtils.createElement("tr");
          let fileNameElement = popsDOMUtils.createElement("td");
          let fileType = "";
          let fileIcon = Folder_ICON.folder;
          if (isFolder) {
            latestTime = "";
            fileSize = "";
          } else {
            fileIcon = "";
            if (typeof latestTime === "number") {
              latestTime = popsUtils.formatTime(latestTime);
            }
            if (typeof fileSize === "number") {
              fileSize = popsUtils.formatByteToSize(fileSize);
            }
            for (let keyName in Folder_ICON) {
              if (fileName.toLowerCase().endsWith("." + keyName)) {
                fileType = keyName;
                fileIcon = Folder_ICON[keyName];
                break;
              }
            }
            if (!Boolean(fileIcon)) {
              fileType = "Null";
              fileIcon = Folder_ICON.Null;
            }
          }
          folderElement.className = "pops-folder-list-table__body-row";
          fileNameElement.className = "pops-folder-list-table__body-td";
          PopsSafeUtils.setSafeHTML(
            fileNameElement,
`
				<div class="pops-folder-list-file-name pops-mobile-folder-list-file-name cursor-p">
					<img src="${fileIcon}" alt="${fileType}" class="pops-folder-list-file-icon u-file-icon u-file-icon--list">
					<div>
						<a title="${fileName}" class="pops-folder-list-file-name-title-text inline-block-v-middle text-ellip list-name-text">${fileName}</a>
						<span>${latestTime} ${fileSize}</span>
					</div>
				</div>
			`
          );
          let __value__ = {
            fileName: origin_fileName,
            latestTime: origin_latestTime,
            fileSize: origin_fileSize,
            isFolder
          };
          Reflect.set(fileNameElement, "__value__", __value__);
          Reflect.set(folderElement, "__value__", __value__);
          folderElement.appendChild(fileNameElement);
          return {
            folderElement,
            fileNameElement
          };
        }
clearFolderInfoView() {
          PopsSafeUtils.setSafeHTML(folderListBodyElement, "");
        }
createHeaderArrowIcon() {
          let $arrowIcon = popsDOMUtils.createElement("div", {
            className: "iconArrow"
          });
          return $arrowIcon;
        }
createBreadcrumb(folderName, folderDataConfig) {
          let $breadcrumb = popsDOMUtils.createElement("span", {
            className: "pops-folder-file-list-breadcrumb-allFiles cursor-p",
            innerHTML: `<a>${folderName}</a>`,
            _config_: folderDataConfig
          }, {
            title: folderName
          });
          return $breadcrumb;
        }
setBreadcrumbClickEvent(clickEvent, isTop, dataConfigList) {
          this.clearFolderInfoView();
          let $click = clickEvent.target;
          let currentBreadcrumb = $click.closest("span.pops-folder-file-list-breadcrumb-allFiles");
          if (currentBreadcrumb) {
            while (currentBreadcrumb.nextElementSibling) {
              currentBreadcrumb.nextElementSibling.remove();
            }
          } else {
            console.error("获取导航按钮失败");
          }
          let loadingMask = PopsLoading.init({
            parent: $content,
            content: {
              text: "获取文件列表中..."
            },
            mask: {
              enable: true,
              clickEvent: {
                toClose: false,
                toHide: false
              }
            },
            addIndexCSS: false
          });
          this.initFolderView(dataConfigList);
          loadingMask.close();
        }
async enterFolder(clickEvent, dataConfig) {
          this.clearFolderInfoView();
          let loadingMask = PopsLoading.init({
            parent: $content,
            content: {
              text: "获取文件列表中..."
            },
            mask: {
              enable: true
            },
            addIndexCSS: false
          });
          if (typeof dataConfig.clickEvent === "function") {
            let childConfig = await dataConfig.clickEvent(clickEvent, dataConfig);
            folderFileListBreadcrumbPrimaryElement.appendChild(this.createHeaderArrowIcon());
            let breadcrumbAllFilesElement = this.createBreadcrumb(dataConfig.fileName, childConfig);
            folderFileListBreadcrumbPrimaryElement.appendChild(breadcrumbAllFilesElement);
            popsDOMUtils.on(breadcrumbAllFilesElement, "click", (event) => {
              this.setBreadcrumbClickEvent(event, false, childConfig);
            });
            this.initFolderView(childConfig);
          }
          loadingMask.close();
        }
async downloadFile(clickEvent, $row, dataConfig) {
          popsDOMUtils.preventEvent(clickEvent);
          let $link = $row.querySelector("a");
          if (typeof dataConfig.clickEvent === "function") {
            let downloadInfo = await dataConfig.clickEvent(clickEvent, dataConfig);
            if (downloadInfo != null && typeof downloadInfo === "object" && !Array.isArray(downloadInfo) && typeof downloadInfo.url === "string" && downloadInfo.url.trim() !== "") {
              $link.setAttribute("href", downloadInfo.url);
              $link.setAttribute("target", "_blank");
              if (downloadInfo.autoDownload) {
                if (downloadInfo.mode == null || downloadInfo.mode === "") {
                  downloadInfo.mode = "aBlank";
                }
                if (downloadInfo.mode === "a" || downloadInfo.mode === "aBlank") {
                  let downloadLinkElement = document.createElement("a");
                  if (downloadInfo.mode === "aBlank") {
                    downloadLinkElement.setAttribute("target", "_blank");
                  }
                  downloadLinkElement.href = downloadInfo.url;
                  downloadLinkElement.click();
                } else if (downloadInfo.mode === "open" || downloadInfo.mode === "openBlank") {
                  if (downloadInfo.mode === "openBlank") {
                    globalThis.open(downloadInfo.url, "_blank");
                  } else {
                    globalThis.open(downloadInfo.url);
                  }
                } else if (downloadInfo.mode === "iframe") {
                  let downloadIframeLinkElement = document.createElement("iframe");
                  downloadIframeLinkElement.src = downloadInfo.url;
                  downloadIframeLinkElement.onload = function() {
                    popsUtils.setTimeout(() => {
                      downloadIframeLinkElement.remove();
                    }, 1e3);
                  };
                  $shadowRoot.appendChild(downloadIframeLinkElement);
                  popsUtils.setTimeout(() => {
                    downloadIframeLinkElement.remove();
                  }, 3 * 60 * 1e3);
                } else {
                  console.error("未知的下载模式", downloadInfo);
                }
              }
            }
          }
        }
sortFolderConfig(folderDataConfigList, sortName = "fileName", isDesc = false) {
          if (sortName === "fileName") {
            let onlyFolderDataConfigList = folderDataConfigList.filter((value) => {
              return value.isFolder;
            });
            let onlyFileDataConfigList = folderDataConfigList.filter((value) => {
              return !value.isFolder;
            });
            onlyFolderDataConfigList.sort((leftConfig, rightConfig) => {
              let beforeVal = leftConfig[sortName].toString();
              let afterVal = rightConfig[sortName].toString();
              let compareVal = beforeVal.localeCompare(afterVal);
              if (isDesc) {
                if (compareVal > 0) {
                  compareVal = -1;
                } else if (compareVal < 0) {
                  compareVal = 1;
                }
              }
              return compareVal;
            });
            onlyFileDataConfigList.sort((leftConfig, rightConfig) => {
              let beforeVal = leftConfig[sortName].toString();
              let afterVal = rightConfig[sortName].toString();
              let compareVal = beforeVal.localeCompare(afterVal);
              if (isDesc) {
                if (compareVal > 0) {
                  compareVal = -1;
                } else if (compareVal < 0) {
                  compareVal = 1;
                }
              }
              return compareVal;
            });
            if (isDesc) {
              return [...onlyFileDataConfigList, ...onlyFolderDataConfigList];
            } else {
              return [...onlyFolderDataConfigList, ...onlyFileDataConfigList];
            }
          } else {
            folderDataConfigList.sort((beforeConfig, afterConfig) => {
              let beforeVal = beforeConfig[sortName];
              let afterVal = afterConfig[sortName];
              if (sortName === "fileSize") {
                beforeVal = parseFloat(beforeVal.toString());
                afterVal = parseFloat(afterVal.toString());
              } else if (sortName === "latestTime") {
                beforeVal = new Date(beforeVal).getTime();
                afterVal = new Date(afterVal).getTime();
              }
              if (beforeVal > afterVal) {
                if (isDesc) {
                  return -1;
                } else {
                  return 1;
                }
              } else if (beforeVal < afterVal) {
                if (isDesc) {
                  return 1;
                } else {
                  return -1;
                }
              } else {
                return 0;
              }
            });
            return folderDataConfigList;
          }
        }
initFolderView(dataConfig) {
          this.sortFolderConfig(dataConfig, config.sort.name, config.sort.isDesc);
          dataConfig.forEach((item) => {
            if (item.isFolder) {
              let { folderElement, fileNameElement } = popsUtils.isPhone() ? this.createFolderRowElementByMobile(item.fileName, "", "", true) : this.createFolderRowElement(item.fileName, "", "", true);
              popsDOMUtils.on(fileNameElement, "click", (event) => {
                this.enterFolder(event, item);
              });
              folderListBodyElement.appendChild(folderElement);
            } else {
              let { folderElement, fileNameElement } = popsUtils.isPhone() ? this.createFolderRowElementByMobile(item.fileName, item.latestTime, item.fileSize, false) : this.createFolderRowElement(item.fileName, item.latestTime, item.fileSize, false);
              popsDOMUtils.on(fileNameElement, "click", (event) => {
                this.downloadFile(event, fileNameElement, item);
              });
              folderListBodyElement.appendChild(folderElement);
            }
          });
        }
removeArrowActiveStatus() {
          [
            ...Array.from(folderListSortFileNameElement.querySelectorAll(".pops-folder-icon-active")),
            ...Array.from(folderListSortLatestTimeElement.querySelectorAll(".pops-folder-icon-active")),
            ...Array.from(folderListSortFileSizeElement.querySelectorAll(".pops-folder-icon-active"))
          ].forEach((ele) => ele.classList.remove("pops-folder-icon-active"));
        }
changeArrowActive(arrowUp, arrowDown, isDesc) {
          this.removeArrowActiveStatus();
          if (isDesc) {
            arrowDown.classList.add("pops-folder-icon-active");
          } else {
            arrowUp.classList.add("pops-folder-icon-active");
          }
        }
arrowToSortFolderInfoView(target, event, sortName) {
          const notChangeSortRule = Reflect.get(event, "notChangeSortRule");
          if (!notChangeSortRule) {
            config.sort.name = sortName;
            config.sort.isDesc = !config.sort.isDesc;
          }
          let arrowUp = target.querySelector(".pops-folder-icon-arrow-up");
          let arrowDown = target.querySelector(".pops-folder-icon-arrow-down");
          this.changeArrowActive(arrowUp, arrowDown, config.sort.isDesc);
          if (typeof config.sort.callback === "function" && config.sort.callback(target, event, config.sort.name, config.sort.isDesc)) {
            return;
          }
          let childrenList = [];
          Array.from(folderListBodyElement.children).forEach((trElement) => {
            let __value__ = Reflect.get(trElement, "__value__");
            Reflect.set(__value__, "target", trElement);
            childrenList.push(__value__);
          });
          let sortedConfigList = this.sortFolderConfig(childrenList, config.sort.name, config.sort.isDesc);
          sortedConfigList.forEach((item) => {
            folderListBodyElement.appendChild(item.target);
          });
        }
      }
      const popsFolder = new PopsFolder2();
      popsFolder.init();
      Reflect.set($pops, "data-pops-folder", popsFolder);
      if (config.drag) {
        PopsInstanceUtils.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack
        });
      }
      PopsHandler.handlePush(popsType, {
        guid,
        animElement: $anim,
        popsElement: $pops,
        maskElement: $mask,
        $shadowContainer,
        $shadowRoot
      });
      let result = PopsHandler.handleResultDetails(eventDetails);
      return result;
    }
  };
  const PopsIframeConfig = () => {
    return {
      title: {
        position: "center",
        text: "",
        html: false,
        style: ""
      },
      loading: {
        enable: true,
        icon: true,
        text: ""
      },
      useShadowRoot: true,
      class: "",
      url: window.location.href,
      only: false,
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false
        },
        clickCallBack: null
      },
      animation: "pops-anim-fadein-zoom",
      position: "center",
      drag: true,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {
      },
      dragEndCallBack() {
      },
      width: window.innerWidth < 550 ? "88vw" : "350px",
      height: window.innerHeight < 450 ? "70vh" : "200px",
      topRightButton: "min|max|mise|close",
      sandbox: false,
      forbiddenScroll: false,
      loadEndCallBack() {
      },
      btn: {
        min: {
          callback() {
          }
        },
        max: {
          callback() {
          }
        },
        mise: {
          callback() {
          }
        },
        close: {
          callback() {
          }
        }
      },
      style: null,
      beforeAppendToPageCallBack() {
      }
    };
  };
  const PopsIframe = {
    init(details) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "iframe";
      let config = PopsIframeConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      if (config.url == null) {
        throw new Error("config.url不能为空");
      }
      config = PopsHandler.handleOnly(popsType, config);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar
        },
        {
          name: "anim",
          css: PopsCSS.anim
        },
        {
          name: "common",
          css: PopsCSS.common
        },
        {
          name: "iframeCSS",
          css: PopsCSS.iframeCSS
        }
      ]);
      let maskExtraStyle = (
config.animation != null && config.animation != "" ? "position:absolute;" : ""
      );
      let zIndex = PopsHandler.handleZIndex(config.zIndex);
      let maskHTML = PopsElementHandler.createMask(guid, zIndex, maskExtraStyle);
      let headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      let iframeLoadingHTML = '<div class="pops-loading"></div>';
      let titleText = config.title.text.trim() !== "" ? config.title.text : config.url;
      let { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      let animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
`
            <div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? titleText : `<p pops class="pops-${popsType}-title-text" style="${headerPStyle}">${titleText}</p>`}${headerBtnHTML}</div>
			<div class="pops-content pops-${popsType}-content">
                <div class="pops-${popsType}-content-global-loading"></div>
                <iframe src="${config.url}" pops ${config.sandbox ? "sandbox='allow-forms allow-same-origin allow-scripts'" : ""}>
                </iframe>
			</div>${config.loading.enable ? iframeLoadingHTML : ""}`,
        "",
        zIndex
      );
      let $anim = PopsElementHandler.parseElement(animHTML);
      let { popsElement: $pops, headerCloseBtnElement, headerControlsElement, titleElement: $title, iframeElement: $iframe, loadingElement, contentLoadingElement: $contentLoading, headerMinBtnElement, headerMaxBtnElement, headerMiseBtnElement } = PopsHandler.handleQueryElement($anim, popsType);
      let $iframeContainer = PopsCore.document.querySelector(".pops-iframe-container");
      if (!$iframeContainer) {
        $iframeContainer = PopsCore.document.createElement("div");
        $iframeContainer.className = "pops-iframe-container";
        $iframeContainer.style.cssText = "display: flex;position: fixed;bottom: 0px;flex-flow: wrap-reverse;user-select: none;-webkit-user-select: none;-ms-user-select: none;-moz-user-select: none;";
        popsDOMUtils.appendBody($iframeContainer);
      }
      let $mask = null;
      let elementList = [$anim];
      if (config.mask.enable) {
        let _handleMask_ = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML
        });
        $mask = _handleMask_.maskElement;
        elementList.push($mask);
      }
      let eventDetails = PopsHandler.handleEventDetails(guid, $shadowContainer, $shadowRoot, popsType, $anim, $pops, $mask, config);
      eventDetails["iframeElement"] = $iframe;
      popsDOMUtils.on($anim, popsDOMUtils.getAnimationEndNameList(), function() {
        $anim.style.width = "0%";
        $anim.style.height = "0%";
      });
      popsDOMUtils.on($iframe, "load", () => {
        loadingElement?.remove();
        $contentLoading.style.animation = "iframeLoadingChange_85 0.3s forwards";
        popsDOMUtils.on($contentLoading, popsDOMUtils.getAnimationEndNameList(), () => {
          $contentLoading.remove();
        });
        if (config.title.text.trim() === "" && $iframe.contentDocument) {
          $title.querySelector("p").innerText = $iframe.contentDocument.title;
        }
        config.loadEndCallBack(eventDetails);
      });
      popsDOMUtils.append($shadowRoot, elementList);
      if (typeof config.beforeAppendToPageCallBack === "function") {
        config.beforeAppendToPageCallBack($shadowRoot, $shadowContainer);
      }
      $iframeContainer.appendChild($shadowContainer);
      if ($mask != null) {
        $anim.after($mask);
      }
      if (config.drag) {
        PopsInstanceUtils.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack
        });
      }
      const TYPE_MODULE = "type-module";
      let origin_left = "";
      let origin_top = "";
      let origin_is_max = false;
      popsDOMUtils.on(headerMinBtnElement, "click", (event) => {
        event.preventDefault();
        event.stopPropagation();
        origin_left = $pops.style.left;
        origin_top = $pops.style.top;
        $pops.classList.add("pops-iframe-unset-top");
        $pops.classList.add("pops-iframe-unset-left");
        $pops.classList.add("pops-iframe-unset-transform");
        $pops.style.transitionDuration = "";
        $pops.setAttribute(TYPE_MODULE, "min");
        headerControlsElement.setAttribute("type", "min");
        headerMaxBtnElement.style.setProperty("display", "none");
        headerMiseBtnElement.style.setProperty("display", "");
        if (typeof config?.btn?.min?.callback === "function") {
          config.btn.min.callback(eventDetails, event);
        }
      }, {
        capture: true
      });
      popsDOMUtils.on(headerMaxBtnElement, "click", (event) => {
        event.preventDefault();
        event.stopPropagation();
        if ($pops.getAttribute(TYPE_MODULE) !== "min") {
          origin_left = $pops.style.left;
          origin_top = $pops.style.top;
        }
        origin_is_max = true;
        $pops.style.transitionDuration = "";
        $pops.style.transform = "";
        $pops.removeAttribute(TYPE_MODULE);
        $pops.classList.add("pops-iframe-unset-transition");
        $pops.classList.add("pops-iframe-unset-left");
        $pops.classList.add("pops-iframe-unset-top");
        $pops.classList.add("pops-iframe-unset-transform");
        $pops.classList.remove("pops-iframe-unset-transition");
        $pops.setAttribute(TYPE_MODULE, "max");
        headerControlsElement.setAttribute("type", "max");
        headerMaxBtnElement.style.setProperty("display", "none");
        headerMiseBtnElement.style.setProperty("display", "");
        if (typeof config?.btn?.max?.callback === "function") {
          config.btn.max.callback(eventDetails, event);
        }
      }, {
        capture: true
      });
      headerMiseBtnElement?.style?.setProperty("display", "none");
      popsDOMUtils.on(headerMiseBtnElement, "click", (event) => {
        event.preventDefault();
        event.stopPropagation();
        if (origin_is_max && $pops.getAttribute(TYPE_MODULE) === "min") {
          $pops.classList.add("pops-iframe-unset-transition");
          $pops.classList.add("pops-iframe-unset-left");
          $pops.classList.add("pops-iframe-unset-top");
          $pops.classList.add("pops-iframe-unset-transform");
          $pops.classList.remove("pops-iframe-unset-transition");
          $pops.setAttribute(TYPE_MODULE, "max");
          headerControlsElement.setAttribute("type", "max");
        } else {
          origin_is_max = false;
          $pops.style.left = origin_left;
          $pops.style.top = origin_top;
          $pops.style.transitionDuration = "";
          $pops.style.transform = "";
          headerControlsElement.removeAttribute("type");
          $pops.removeAttribute(TYPE_MODULE);
          $pops.classList.remove("pops-iframe-unset-top");
          $pops.classList.remove("pops-iframe-unset-left");
          $pops.classList.remove("pops-iframe-unset-transform");
          headerMaxBtnElement.style.setProperty("display", "");
          headerMiseBtnElement.style.setProperty("display", "none");
        }
        if (typeof config?.btn?.mise?.callback === "function") {
          config.btn.mise.callback(eventDetails, event);
        }
      }, {
        capture: true
      });
      popsDOMUtils.on(headerCloseBtnElement, "click", (event) => {
        event.preventDefault();
        event.stopPropagation();
        PopsInstanceUtils.removeInstance([PopsInstData.iframe], guid, false);
        if (typeof config?.btn?.close?.callback === "function") {
          config.btn.close.callback(eventDetails, event);
        }
      }, {
        capture: true
      });
      PopsHandler.handlePush(popsType, {
        guid,
        animElement: $anim,
        popsElement: $pops,
        maskElement: $mask,
        $shadowContainer,
        $shadowRoot
      });
      let result = PopsHandler.handleResultDetails(eventDetails);
      return result;
    }
  };
  const PopsPanelConfig = () => {
    return {
      title: {
        text: "默认标题",
        position: "center",
        html: false,
        style: ""
      },
      content: [
        {
          id: "whitesev-panel-config-1",
          title: "菜单配置1",
          headerTitle: "菜单配置1",
          isDefault: false,
          attributes: [
            {
              "data-test": "test",
              "data-test-2": "test2"
            }
          ],
          forms: [
            {
              className: "forms-1",
              text: "区域设置",
              type: "forms",
              attributes: [],
              forms: [
                {
                  className: "panel-switch",
                  text: "switch",
                  type: "switch",
props: {},
                  attributes: [],
                  getValue() {
                    return true;
                  },
                  callback(event, value) {
                    console.log("按钮开启状态:", value);
                  }
                },
                {
                  className: "panel-slider",
                  text: "slider",
                  type: "slider",
props: {},
                  attributes: [],
                  getValue() {
                    return 50;
                  },
                  callback(event, value) {
                    console.log("滑块当前数值:", value);
                  },
                  min: 1,
                  max: 100
                },
                {
                  className: "panel-button",
                  text: "button",
                  type: "button",
props: {},
                  attributes: [],
                  buttonIcon: "view",
                  buttonIconIsLoading: true,
                  buttonType: "default",
                  buttonText: "default按钮",
                  callback(event) {
                    console.log("点击按钮", event);
                  }
                },
                {
                  className: "panel-button",
                  text: "button",
                  type: "button",
props: {},
                  attributes: [],
                  buttonIcon: "eleme",
                  buttonIconIsLoading: true,
                  buttonType: "warning",
                  buttonText: "warning按钮",
                  callback(event) {
                    console.log("点击按钮", event);
                  }
                },
                {
                  className: "panel-button",
                  text: "button",
props: {},
                  type: "button",
                  attributes: [],
                  buttonIcon: "chromeFilled",
                  buttonIconIsLoading: true,
                  buttonType: "danger",
                  buttonText: "danger按钮",
                  callback(event) {
                    console.log("点击按钮", event);
                  }
                },
                {
                  className: "panel-button",
                  text: "button",
                  type: "button",
                  attributes: [],
props: {},
                  buttonIcon: "upload",
                  buttonIconIsLoading: false,
                  buttonType: "info",
                  buttonText: "info按钮",
                  callback(event) {
                    console.log("点击按钮", event);
                  }
                }
              ]
            }
          ]
        },
        {
          id: "whitesev-panel-config-2",
          title: "菜单配置2",
          headerTitle: "菜单配置2",
          isDefault: true,
          attributes: [
            {
              "data-value": "value",
              "data-value-2": "value2"
            }
          ],
          forms: [
            {
              className: "panel-input",
              text: "input",
              type: "input",
props: {},
              attributes: [],
              getValue() {
                return "50";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                console.log("输入框内容改变:", value);
              },
              placeholder: "请输入内容"
            },
            {
              className: "panel-input-password",
              text: "input-password",
              type: "input",
props: {},
              attributes: [],
              getValue() {
                return "123456";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                console.log("密码输入框内容改变:", value);
              },
              isPassword: true,
              placeholder: "请输入密码"
            },
            {
              className: "panel-textarea",
              text: "textarea",
              type: "textarea",
props: {},
              attributes: [],
              getValue() {
                return "50";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                console.log("textarea输入框内容改变:", value);
              },
              placeholder: "请输入内容"
            },
            {
              className: "panel-select",
              text: "select",
              type: "select",
              disabled: true,
props: {},
              attributes: [],
              getValue() {
                return 50;
              },
              callback(event, isSelectedValue, isSelectedText) {
                console.log(`select当前选项:${isSelectedValue},当前选项文本:${isSelectedText}`);
              },
              data: [
                {
                  value: "all",
                  text: "所有",
                  disable() {
                    return false;
                  },
                  forms: []
                },
                {
                  value: "text",
                  text: "文本",
                  disable() {
                    return false;
                  },
                  forms: []
                },
                {
                  value: "html",
                  text: "超文本",
                  disable() {
                    return false;
                  },
                  forms: []
                }
              ]
            },
            {
              className: "panel-select-multiple",
              type: "select-multiple",
              text: "select-multiple",
              disabled: true,
props: {},
              attributes: [],
              placeholder: "请至少选择一个选项",
              getValue() {
                return ["select-1", "select-2"];
              },
              callback(selectInfo) {
                console.log(`select值改变,多选信息`, selectInfo);
              },
              clickCallBack(event, isSelectedInfo) {
                console.log("点击", event, isSelectedInfo);
              },
              closeIconClickCallBack(event, data) {
                console.log("点击关闭图标的事件", data);
              },
              data: [
                {
                  value: "select-1",
                  text: "单选1",
                  isHTML: false,
                  disable(value, allSelectedInfo) {
                    return allSelectedInfo.findIndex((it) => ["select-5"].includes(it.value)) !== -1;
                  }
                },
                {
                  value: "select-2",
                  text: "单选2",
                  isHTML: false,
                  disable(value, allSelectedInfo) {
                    return allSelectedInfo.findIndex((it) => ["select-5"].includes(it.value)) !== -1;
                  }
                },
                {
                  value: "select-3",
                  text: "单选3",
                  isHTML: false,
                  disable(value, allSelectedInfo) {
                    return allSelectedInfo.findIndex((it) => ["select-2", "select-5"].includes(it.value)) !== -1;
                  }
                },
                {
                  value: "select-4",
                  text: "单选4",
                  isHTML: false,
                  disable(value, allSelectedInfo) {
                    return allSelectedInfo.findIndex((it) => ["select-3", "select-5"].includes(it.value)) !== -1;
                  }
                },
                {
                  value: "select-5",
                  text(value, allSelectedInfo) {
                    return allSelectedInfo.findIndex((it) => ["select-4"].includes(it.value)) !== -1 ? "单选5-禁用" : "单选5";
                  },
                  isHTML: false,
                  disable(value, allSelectedInfo) {
                    return allSelectedInfo.findIndex((it) => ["select-4"].includes(it.value)) !== -1;
                  }
                }
              ]
            },
            {
              type: "forms",
              text: "deep菜单",
              forms: [
                {
                  type: "deepMenu",
                  className: "panel-deepMenu",
                  text: "deepMenu",
                  description: "二级菜单",
                  rightText: "自定义配置",
                  arrowRightIcon: true,
                  afterAddToUListCallBack(formConfig, container) {
                    console.log(formConfig, container);
                  },
                  clickCallBack(event, formConfig) {
                    console.log("进入子配置", event, formConfig);
                  },
                  forms: [
                    {
                      className: "forms-1",
                      text: "区域设置",
                      type: "forms",
                      attributes: [],
                      forms: [
                        {
                          className: "panel-switch",
                          text: "switch",
                          type: "switch",
props: {},
                          attributes: [],
                          getValue() {
                            return true;
                          },
                          callback(event, value) {
                            console.log("按钮开启状态:", value);
                          }
                        },
                        {
                          className: "panel-slider",
                          text: "slider",
props: {},
                          type: "slider",
                          attributes: [],
                          getValue() {
                            return 50;
                          },
                          callback(event, value) {
                            console.log("滑块当前数值:", value);
                          },
                          min: 1,
                          max: 100
                        },
                        {
                          className: "panel-button",
                          text: "button",
props: {},
                          type: "button",
                          attributes: [],
                          buttonIcon: "eleme",
                          buttonIconIsLoading: true,
                          buttonType: "warning",
                          buttonText: "warning按钮",
                          callback(event) {
                            console.log("点击按钮", event);
                          }
                        },
                        {
                          className: "panel-button",
                          text: "button",
                          type: "button",
props: {},
                          attributes: [],
                          buttonIcon: "chromeFilled",
                          buttonIconIsLoading: true,
                          buttonType: "danger",
                          buttonText: "danger按钮",
                          callback(event) {
                            console.log("点击按钮", event);
                          }
                        },
                        {
                          className: "panel-button",
                          text: "button",
props: {},
                          type: "button",
                          attributes: [],
                          buttonIcon: "upload",
                          buttonIconIsLoading: false,
                          buttonType: "info",
                          buttonText: "info按钮",
                          callback(event) {
                            console.log("点击按钮", event);
                          }
                        }
                      ]
                    }
                  ]
                },
                {
                  type: "deepMenu",
                  className: "panel-deepMenu2",
                  attributes: {},
props: {},
                  text: "deepMenu2",
                  description: "二级菜单",
                  rightText: "自定义配置",
                  arrowRightIcon: true,
                  afterAddToUListCallBack(formConfig, container) {
                    console.log(formConfig, container);
                  },
                  clickCallBack(event, formConfig) {
                    console.log("进入子配置", event, formConfig);
                  },
                  forms: []
                }
              ]
            },
            {
              type: "forms",
              isFold: true,
              text: "折叠菜单",
              afterAddToUListCallBack(formConfig, container) {
                console.log(formConfig, container);
              },
              forms: [
                {
                  className: "panel-switch",
                  text: "switch",
props: {},
                  type: "switch",
                  attributes: [],
                  getValue() {
                    return true;
                  },
                  callback(event, value) {
                    console.log("按钮开启状态:", value);
                  }
                }
              ]
            }
          ]
        },
        {
          id: "whitesev-panel-bottom-config-1",
          title: (
`
					<a rel="nofollow" href="https://www.npmjs.com/package/@whitesev/pops" target="_blank"><img src="https://img.shields.io/npm/v/@whitesev/pops?label=pops" alt="npm pops version"></a>
				`
          ),
          isBottom: true,
          disableAsideItemHoverCSS: true,
          attributes: [
            {
              "data-value": "value",
              "data-value-2": "value2"
            }
          ],
props: {},
          forms: [],
          clickFirstCallback: function(event, rightHeaderElement, rightContainerElement) {
            return false;
          }
        },
        {
          id: "whitesev-panel-bottom-config-2",
          title: "版本:xxx.xx.xx",
          isBottom: true,
          attributes: [
            {
              "data-value": "value",
              "data-value-2": "value2"
            }
          ],
props: {},
          forms: [],
          clickFirstCallback: function(event, rightHeaderElement, rightContainerElement) {
            return false;
          }
        }
      ],
      btn: {
        close: {
          enable: true,
          callback(event) {
            event.close();
          }
        }
      },
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false
        },
        clickCallBack: null
      },
      useShadowRoot: true,
      class: "",
      mobileClassName: "pops-panel-is-mobile",
      isMobile: false,
      only: false,
      width: window.innerWidth < 550 ? "88vw" : "700px",
      height: window.innerHeight < 450 ? "70vh" : "500px",
      position: "center",
      animation: "pops-anim-fadein-zoom",
      useDeepMenuSwtichAnimation: true,
      zIndex: 1e4,
      drag: false,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {
      },
      dragEndCallBack() {
      },
      forbiddenScroll: false,
      style: null,
      beforeAppendToPageCallBack() {
      }
    };
  };
  const PopsMathFloatUtils = {
isFloat(num) {
      return Number(num) === num && num % 1 !== 0;
    },
add(number1, number2) {
      let number1length, number2length, powValue;
      try {
        number1length = number1.toString().split(".")[1].length;
      } catch (error) {
        number1length = 0;
      }
      try {
        number2length = number2.toString().split(".")[1].length;
      } catch (error) {
        number2length = 0;
      }
      powValue = Math.pow(10, Math.max(number1length, number2length));
      return Math.round(number1 * powValue + number2 * powValue) / powValue;
    },
sub(number1, number2) {
      let number1length, number2length, powValue;
      try {
        number1length = number1.toString().split(".")[1].length;
      } catch (error) {
        number1length = 0;
      }
      try {
        number2length = number2.toString().split(".")[1].length;
      } catch (error) {
        number2length = 0;
      }
      powValue = Math.pow(10, Math.max(number1length, number2length));
      let fixedValue = number1length >= number2length ? number1length : number2length;
      return (Math.round(number1 * powValue - number2 * powValue) / powValue).toFixed(fixedValue);
    },
division(number1, number2) {
      let number1length, number2length, number1ReplaceValue, number2ReplaceValue;
      try {
        number1length = number1.toString().split(".")[1].length;
      } catch (error) {
        number1length = 0;
      }
      try {
        number2length = number2.toString().split(".")[1].length;
      } catch (error) {
        number2length = 0;
      }
      number1ReplaceValue = Number(number1.toString().replace(".", ""));
      number2ReplaceValue = Number(number2.toString().replace(".", ""));
      return number1ReplaceValue / number2ReplaceValue * Math.pow(10, number2length - number1length);
    }
  };
  const PopsTooltipConfig = () => {
    return {
      useShadowRoot: true,
      target: null,
      content: "默认文字",
      isDiffContent: false,
      position: "top",
      className: "",
      isFixed: false,
      alwaysShow: false,
      triggerShowEventName: "mouseenter touchstart",
      triggerCloseEventName: "mouseleave touchend",
      zIndex: 1e4,
      only: false,
      eventOption: {
        passive: false,
        capture: true,
        once: false
      },
      showBeforeCallBack() {
      },
      showAfterCallBack() {
      },
      closeBeforeCallBack() {
      },
      closeAfterCallBack() {
      },
      delayCloseTime: 100,
      showArrow: true,
      arrowDistance: 12.5,
      otherDistance: 0,
      style: "",
      beforeAppendToPageCallBack() {
      }
    };
  };
  class ToolTip {
    $el = {
      $shadowContainer: null,
      $shadowRoot: null,
      $toolTip: null,
      $content: null,
      $arrow: null
    };
    $data = {
      config: null,
      guid: null,
      timeId_close_TouchEvent: [],
      timeId_close_MouseEvent: []
    };
    constructor(config, guid, ShadowInfo) {
      this.$data.config = config;
      this.$data.guid = guid;
      this.$el.$shadowContainer = ShadowInfo.$shadowContainer;
      this.$el.$shadowRoot = ShadowInfo.$shadowRoot;
      this.show = this.show.bind(this);
      this.close = this.close.bind(this);
      this.toolTipAnimationFinishEvent = this.toolTipAnimationFinishEvent.bind(this);
      this.toolTipMouseEnterEvent = this.toolTipMouseEnterEvent.bind(this);
      this.toolTipMouseLeaveEvent = this.toolTipMouseLeaveEvent.bind(this);
      this.init();
    }
    init() {
      let toolTipInfo = this.createToolTip();
      this.$el.$toolTip = toolTipInfo.$toolTipContainer;
      this.$el.$content = toolTipInfo.$toolTipContent;
      this.$el.$arrow = toolTipInfo.$toolTipArrow;
      this.changeContent();
      this.changeZIndex();
      this.changePosition();
      if (!this.$data.config.alwaysShow) {
        this.offEvent();
        this.onEvent();
      }
    }
createToolTip() {
      let $toolTipContainer = popsDOMUtils.createElement("div", {
        className: "pops-tip",
        innerHTML: (
`
				<div class="pops-tip-content" style="text-align: center;"></div>
				<div class="pops-tip-arrow"></div>
			`
        )
      }, {
        "data-position": this.$data.config.isFixed ? "fixed" : "absolute",
        "data-guid": this.$data.guid
      });
      let $toolTipContent = $toolTipContainer.querySelector(".pops-tip-content");
      let $toolTipArrow = $toolTipContainer.querySelector(".pops-tip-arrow");
      if (typeof this.$data.config.className === "string" && this.$data.config.className.trim() !== "") {
        popsDOMUtils.addClassName($toolTipContainer, this.$data.config.className);
      }
      $toolTipContainer.style.zIndex = PopsHandler.handleZIndex(this.$data.config.zIndex).toString();
      if (this.$data.config.style != null) {
        let cssNode = popsDOMUtils.createElement("style", {
          type: "text/css",
          innerHTML: this.$data.config.style
        });
        $toolTipContainer.appendChild(cssNode);
      }
      if (!this.$data.config.showArrow) {
        $toolTipArrow.remove();
      }
      return {
        $toolTipContainer,
        $toolTipArrow,
        $toolTipContent
      };
    }
getContent() {
      return typeof this.$data.config.content === "function" ? this.$data.config.content() : this.$data.config.content;
    }
changeContent(text) {
      if (text == null) {
        text = this.getContent();
      }
      if (this.$data.config.isDiffContent) {
        let contentPropKey = "data-content";
        let originContentText = this.$el.$content[contentPropKey];
        if (typeof originContentText === "string") {
          if (originContentText === text) {
            return;
          }
        }
        this.$el.$content[contentPropKey] = text;
      }
      PopsSafeUtils.setSafeHTML(this.$el.$content, text);
    }
getZIndex() {
      const zIndex = PopsHandler.handleZIndex(this.$data.config.zIndex);
      return zIndex;
    }
changeZIndex() {
      const zIndex = this.getZIndex();
      this.$el.$toolTip.style.setProperty("z-index", zIndex.toString());
    }
calcToolTipPosition(targetElement, arrowDistance, otherDistance, event) {
      let offsetInfo = popsDOMUtils.offset(targetElement, !this.$data.config.isFixed);
      let targetElement_width = offsetInfo.width;
      let targetElement_height = offsetInfo.height;
      let targetElement_top = offsetInfo.top;
      let targetElement_left = offsetInfo.left;
      let toolTipElement_width = popsDOMUtils.outerWidth(this.$el.$toolTip);
      let toolTipElement_height = popsDOMUtils.outerHeight(this.$el.$toolTip);
      let targetElement_X_center_pos = targetElement_left + targetElement_width / 2 - toolTipElement_width / 2;
      let targetElement_Y_center_pos = targetElement_top + targetElement_height / 2 - toolTipElement_height / 2;
      let mouseX = 0;
      let mouseY = 0;
      if (event != null) {
        if (event instanceof MouseEvent || event instanceof PointerEvent) {
          mouseX = event.pageX;
          mouseY = event.y;
        } else if (event instanceof TouchEvent) {
          let touchEvent = event.touches[0];
          mouseX = touchEvent.pageX;
          mouseY = touchEvent.pageY;
        } else {
          if (typeof event.clientX === "number") {
            mouseX = event.clientX;
          }
          if (typeof event.clientY === "number") {
            mouseY = event.clientY;
          }
        }
      }
      return {
        TOP: {
          left: targetElement_X_center_pos - otherDistance,
          top: targetElement_top - toolTipElement_height - arrowDistance,
          arrow: "bottom",
          motion: "fadeInTop"
        },
        RIGHT: {
          left: targetElement_left + targetElement_width + arrowDistance,
          top: targetElement_Y_center_pos + otherDistance,
          arrow: "left",
          motion: "fadeInRight"
        },
        BOTTOM: {
          left: targetElement_X_center_pos - otherDistance,
          top: targetElement_top + targetElement_height + arrowDistance,
          arrow: "top",
          motion: "fadeInBottom"
        },
        LEFT: {
          left: targetElement_left - toolTipElement_width - arrowDistance,
          top: targetElement_Y_center_pos + otherDistance,
          arrow: "right",
          motion: "fadeInLeft"
        },
        FOLLOW: {
          left: mouseX + otherDistance,
          top: mouseY + otherDistance,
          arrow: "follow",
          motion: ""
        }
      };
    }
changePosition(event) {
      let positionInfo = this.calcToolTipPosition(this.$data.config.target, this.$data.config.arrowDistance, this.$data.config.otherDistance, event);
      let positionKey = this.$data.config.position.toUpperCase();
      let positionDetail = positionInfo[positionKey];
      if (positionDetail) {
        this.$el.$toolTip.style.left = positionDetail.left + "px";
        this.$el.$toolTip.style.top = positionDetail.top + "px";
        this.$el.$toolTip.setAttribute("data-motion", positionDetail.motion);
        this.$el.$arrow.setAttribute("data-position", positionDetail.arrow);
      } else {
        console.error("不存在该位置", this.$data.config.position);
      }
    }
onEvent() {
      this.onToolTipAnimationFinishEvent();
      this.onShowEvent();
      this.onCloseEvent();
      this.onToolTipMouseEnterEvent();
      this.onToolTipMouseLeaveEvent();
    }
offEvent() {
      this.offToolTipAnimationFinishEvent();
      this.offShowEvent();
      this.offCloseEvent();
      this.offToolTipMouseEnterEvent();
      this.offToolTipMouseLeaveEvent();
    }
addCloseTimeoutId(type, timeId) {
      if (type === "MouseEvent") {
        this.$data.timeId_close_MouseEvent.push(timeId);
      } else {
        this.$data.timeId_close_TouchEvent.push(timeId);
      }
    }
clearCloseTimeoutId(type, timeId) {
      let timeIdList = type === "MouseEvent" ? this.$data.timeId_close_MouseEvent : this.$data.timeId_close_TouchEvent;
      for (let index = 0; index < timeIdList.length; index++) {
        const currentTimeId = timeIdList[index];
        if (typeof timeId === "number") {
          if (timeId == currentTimeId) {
            popsUtils.clearTimeout(timeId);
            timeIdList.splice(index, 1);
            break;
          }
        } else {
          popsUtils.clearTimeout(currentTimeId);
          timeIdList.splice(index, 1);
          index--;
        }
      }
    }
show(...args) {
      let event = args[0];
      let eventType = event instanceof MouseEvent ? "MouseEvent" : "TouchEvent";
      this.clearCloseTimeoutId(eventType);
      if (typeof this.$data.config.showBeforeCallBack === "function") {
        let result = this.$data.config.showBeforeCallBack(this.$el.$toolTip);
        if (typeof result === "boolean" && !result) {
          return;
        }
      }
      if (!popsUtils.contains(this.$el.$shadowRoot, this.$el.$toolTip)) {
        this.init();
        popsDOMUtils.append(this.$el.$shadowRoot, this.$el.$toolTip);
      }
      if (!popsUtils.contains(this.$el.$shadowContainer)) {
        if (typeof this.$data.config.beforeAppendToPageCallBack === "function") {
          this.$data.config.beforeAppendToPageCallBack(this.$el.$shadowRoot, this.$el.$shadowContainer);
        }
        popsDOMUtils.append(document.body, this.$el.$shadowContainer);
      }
      this.changeContent();
      this.changePosition(event);
      if (typeof this.$data.config.showAfterCallBack === "function") {
        this.$data.config.showAfterCallBack(this.$el.$toolTip);
      }
    }
onShowEvent() {
      popsDOMUtils.on(this.$data.config.target, this.$data.config.triggerShowEventName, this.show, this.$data.config.eventOption);
    }
offShowEvent() {
      popsDOMUtils.off(this.$data.config.target, this.$data.config.triggerShowEventName, this.show, {
        capture: true
      });
    }
close(...args) {
      let event = args[0];
      let eventType = event instanceof MouseEvent ? "MouseEvent" : "TouchEvent";
      if (event && event instanceof MouseEvent) {
        let $target = event.composedPath()[0];
        if ($target != this.$data.config.target && $target != this.$el.$toolTip) {
          return;
        }
      }
      if (typeof this.$data.config.closeBeforeCallBack === "function") {
        let result = this.$data.config.closeBeforeCallBack(this.$el.$toolTip);
        if (typeof result === "boolean" && !result) {
          return;
        }
      }
      if (this.$data.config.delayCloseTime == null || typeof this.$data.config.delayCloseTime === "number" && this.$data.config.delayCloseTime <= 0) {
        this.$data.config.delayCloseTime = 100;
      }
      let timeId = popsUtils.setTimeout(() => {
        this.clearCloseTimeoutId(eventType, timeId);
        if (this.$el.$toolTip == null) {
          return;
        }
        let motion = this.$el.$toolTip.getAttribute("data-motion");
        if (motion == null || motion.trim() === "") {
          this.toolTipAnimationFinishEvent();
        } else {
          this.$el.$toolTip.setAttribute("data-motion", this.$el.$toolTip.getAttribute("data-motion").replace("fadeIn", "fadeOut"));
        }
      }, this.$data.config.delayCloseTime);
      this.addCloseTimeoutId(eventType, timeId);
      if (typeof this.$data.config.closeAfterCallBack === "function") {
        this.$data.config.closeAfterCallBack(this.$el.$toolTip);
      }
    }
onCloseEvent() {
      popsDOMUtils.on(this.$data.config.target, this.$data.config.triggerCloseEventName, this.close, this.$data.config.eventOption);
    }
offCloseEvent() {
      popsDOMUtils.off(this.$data.config.target, this.$data.config.triggerCloseEventName, this.close, {
        capture: true
      });
    }
destory() {
      if (this.$el.$toolTip) {
        this.$el.$shadowRoot.removeChild(this.$el.$toolTip);
      }
      this.$el.$toolTip = null;
      this.$el.$arrow = null;
      this.$el.$content = null;
    }
toolTipAnimationFinishEvent() {
      if (!this.$el.$toolTip) {
        return;
      }
      if (this.$el.$toolTip.getAttribute("data-motion").includes("In")) {
        return;
      }
      this.destory();
    }
onToolTipAnimationFinishEvent() {
      popsDOMUtils.on(this.$el.$toolTip, popsDOMUtils.getAnimationEndNameList(), this.toolTipAnimationFinishEvent);
    }
offToolTipAnimationFinishEvent() {
      popsDOMUtils.off(this.$el.$toolTip, popsDOMUtils.getAnimationEndNameList(), this.toolTipAnimationFinishEvent);
    }
toolTipMouseEnterEvent() {
      this.clearCloseTimeoutId("MouseEvent");
      this.clearCloseTimeoutId("TouchEvent");
    }
onToolTipMouseEnterEvent() {
      this.clearCloseTimeoutId("MouseEvent");
      this.clearCloseTimeoutId("TouchEvent");
      popsDOMUtils.on(this.$el.$toolTip, "mouseenter touchstart", this.toolTipMouseEnterEvent, this.$data.config.eventOption);
    }
offToolTipMouseEnterEvent() {
      popsDOMUtils.off(this.$el.$toolTip, "mouseenter touchstart", this.toolTipMouseEnterEvent, this.$data.config.eventOption);
    }
toolTipMouseLeaveEvent(event) {
      this.close(event);
    }
onToolTipMouseLeaveEvent() {
      popsDOMUtils.on(this.$el.$toolTip, "mouseleave touchend", this.toolTipMouseLeaveEvent, this.$data.config.eventOption);
    }
offToolTipMouseLeaveEvent() {
      popsDOMUtils.off(this.$el.$toolTip, "mouseleave touchend", this.toolTipMouseLeaveEvent, this.$data.config.eventOption);
    }
  }
  const PopsTooltip = {
    init(details) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "tooltip";
      let config = PopsTooltipConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      if (!(config.target instanceof HTMLElement)) {
        throw new TypeError("config.target 必须是HTMLElement类型");
      }
      config = PopsHandler.handleOnly(popsType, config);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index
        },
        {
          name: "anim",
          css: PopsCSS.anim
        },
        {
          name: "common",
          css: PopsCSS.common
        },
        {
          name: "tooltipCSS",
          css: PopsCSS.tooltipCSS
        }
      ]);
      let toolTip = new ToolTip(config, guid, {
        $shadowContainer,
        $shadowRoot
      });
      if (config.alwaysShow) {
        toolTip.show();
      }
      return {
        guid,
        config,
        $shadowContainer,
        $shadowRoot,
        toolTip
      };
    }
  };
  const PanelHandlerComponents = () => {
    return {
asideULElement: null,
asideBottomULElement: null,
sectionContainerHeaderULElement: null,
sectionContainerULElement: null,
$el: {
$pops: null,
$content: null,
$sectionWrapper: null,
$contentAside: null,
$contentSectionContainer: null
      },
      $config: {},
init(details) {
        const PopsType = "panel";
        this.$el = {
          ...details.$el
        };
        this.$config = details.config;
        this.asideULElement = this.$el.$contentAside.querySelector(`ul.pops-${PopsType}-aside-top-container`);
        this.asideBottomULElement = this.$el.$contentAside.querySelector(`ul.pops-${PopsType}-aside-bottom-container`);
        this.sectionContainerHeaderULElement = this.$el.$contentSectionContainer.querySelector(`ul.pops-${PopsType}-container-header-ul`);
        this.sectionContainerULElement = this.$el.$contentSectionContainer.querySelector(`ul.pops-${PopsType}-container-main-ul`);
        let $defaultAsideItem = null;
        let isScrollToDefaultView = false;
        details.config.content.forEach((asideItemConfig) => {
          let $asideLiElement = this.createAsideItem(asideItemConfig);
          this.setAsideItemClickEvent($asideLiElement, asideItemConfig);
          let isBottom = typeof asideItemConfig.isBottom === "function" ? asideItemConfig.isBottom() : asideItemConfig.isBottom;
          if (isBottom) {
            this.asideBottomULElement.appendChild($asideLiElement);
          } else {
            this.asideULElement.appendChild($asideLiElement);
          }
          if ($defaultAsideItem == null) {
            let flag = false;
            if (typeof asideItemConfig.isDefault === "function") {
              flag = Boolean(asideItemConfig.isDefault());
            } else {
              flag = Boolean(asideItemConfig.isDefault);
            }
            if (flag) {
              $defaultAsideItem = $asideLiElement;
              isScrollToDefaultView = Boolean(asideItemConfig.scrollToDefaultView);
            }
          }
          if (typeof asideItemConfig.afterRender === "function") {
            asideItemConfig.afterRender({
              asideConfig: asideItemConfig,
              $asideLiElement
            });
          }
        });
        if ($defaultAsideItem == null && this.asideULElement.children.length) {
          $defaultAsideItem = this.asideULElement.children[0];
        }
        if ($defaultAsideItem) {
          $defaultAsideItem.click();
          if (isScrollToDefaultView) {
            $defaultAsideItem?.scrollIntoView();
          }
        } else {
          console.error("pops.panel:左侧容器没有项");
        }
      },
clearContainer() {
        Reflect.deleteProperty(this.$el.$contentSectionContainer, "__formConfig__");
        PopsSafeUtils.setSafeHTML(this.sectionContainerHeaderULElement, "");
        PopsSafeUtils.setSafeHTML(this.sectionContainerULElement, "");
        this.clearDeepMenuContainer();
      },
clearDeepMenuContainer() {
        this.$el.$sectionWrapper?.querySelectorAll("section.pops-panel-deepMenu-container").forEach(($el) => $el.remove());
      },
clearAsideItemIsVisited() {
        this.$el.$contentAside.querySelectorAll(".pops-is-visited").forEach(($el) => {
          popsDOMUtils.removeClassName($el, "pops-is-visited");
        });
      },
setAsideItemIsVisited(element) {
        popsDOMUtils.addClassName(element, "pops-is-visited");
      },
setElementAttributes(element, attributes) {
        if (attributes == null) {
          return;
        }
        if (Array.isArray(attributes)) {
          attributes.forEach((attrObject) => {
            this.setElementAttributes(element, attrObject);
          });
        } else {
          Object.keys(attributes).forEach((attributeName) => {
            element.setAttribute(attributeName, attributes[attributeName]);
          });
        }
      },
setElementProps(element, props) {
        if (props == null) {
          return;
        }
        Object.keys(props).forEach((propName) => {
          let value = props[propName];
          if (propName === "innerHTML") {
            PopsSafeUtils.setSafeHTML(element, value);
            return;
          }
          Reflect.set(element, propName, value);
        });
      },
setElementClassName(element, className) {
        if (className == null) {
          return;
        }
        if (typeof className === "function") {
          className = className();
        }
        if (typeof className === "string") {
          let splitClassName = className.split(" ");
          splitClassName.forEach((classNameStr) => {
            element.classList.add(classNameStr);
          });
        } else if (Array.isArray(className)) {
          className.forEach((classNameStr) => {
            this.setElementClassName(element, classNameStr);
          });
        }
      },
createAsideItem(asideConfig) {
        let $li = document.createElement("li");
        $li.id = asideConfig.id;
        Reflect.set($li, "__forms__", asideConfig.forms);
        let title = typeof asideConfig.title === "function" ? asideConfig.title() : asideConfig.title;
        PopsSafeUtils.setSafeHTML($li, title);
        this.setElementClassName($li, "pops-panel-aside-item");
        this.setElementClassName($li, asideConfig.className);
        this.setElementAttributes($li, asideConfig.attributes);
        this.setElementProps($li, asideConfig.props);
        const disableAsideItemHoverCSSClassName = "pops-panel-disabled-aside-hover-css";
        let disableAsideItemHoverCSS = typeof asideConfig.disableAsideItemHoverCSS === "function" ? asideConfig.disableAsideItemHoverCSS() : asideConfig.disableAsideItemHoverCSS;
        if (disableAsideItemHoverCSS) {
          $li.classList.add(disableAsideItemHoverCSSClassName);
        } else {
          $li.classList.remove(disableAsideItemHoverCSSClassName);
        }
        return $li;
      },
createSectionContainerItem_switch(formConfig) {
        let $li = document.createElement("li");
        Reflect.set($li, "__formConfig__", formConfig);
        this.setElementClassName($li, formConfig.className);
        this.setElementAttributes($li, formConfig.attributes);
        this.setElementProps($li, formConfig.props);
        let leftDescriptionText = "";
        if (Boolean(formConfig.description)) {
          leftDescriptionText =
`<p class="pops-panel-item-left-desc-text">${formConfig.description}</p>`;
        }
        PopsSafeUtils.setSafeHTML(
          $li,
`
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${formConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-switch">
					<input class="pops-panel-switch__input" type="checkbox">
					<span class="pops-panel-switch__core">
						<div class="pops-panel-switch__action">
						</div>
					</span>
				</div>`
        );
        const PopsPanelSwitch = {
          [Symbol.toStringTag]: "PopsPanelSwitch",
          $data: {
            value: Boolean(formConfig.getValue())
          },
          $ele: {
            itemLeftTextContainer: $li.querySelector(".pops-panel-item-left-text"),
            switch: $li.querySelector(".pops-panel-switch"),
            input: $li.querySelector(".pops-panel-switch__input"),
            core: $li.querySelector(".pops-panel-switch__core")
          },
          init() {
            this.setStatus(this.$data.value);
            let disabled = typeof formConfig.disabled === "function" ? formConfig.disabled() : formConfig.disabled;
            if (disabled) {
              this.disable();
            }
            this.setClickEvent();
          },
setClickEvent() {
            let that = this;
            popsDOMUtils.on(this.$ele.core, "click", function(event) {
              if (that.$ele.input.disabled || that.$ele.switch.hasAttribute("data-disabled")) {
                return;
              }
              that.$data.value = that.getStatus();
              that.setStatus(that.$data.value);
              if (typeof formConfig.callback === "function") {
                formConfig.callback(event, that.$data.value);
              }
            });
          },
setStatus(isChecked = false) {
            isChecked = Boolean(isChecked);
            this.$ele.input.checked = isChecked;
            if (isChecked) {
              popsDOMUtils.addClassName(this.$ele.switch, "pops-panel-switch-is-checked");
            } else {
              popsDOMUtils.removeClassName(this.$ele.switch, "pops-panel-switch-is-checked");
            }
          },
getStatus() {
            let checkedValue = false;
            if (!popsDOMUtils.containsClassName(this.$ele.switch, "pops-panel-switch-is-checked")) {
              checkedValue = true;
            }
            return checkedValue;
          },
disable() {
            this.$ele.input.disabled = true;
            this.$ele.switch.setAttribute("data-disabled", "true");
            popsDOMUtils.addClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
notDisable() {
            this.$ele.input.disabled = false;
            this.$ele.switch.removeAttribute("data-disabled");
            popsDOMUtils.removeClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          }
        };
        PopsPanelSwitch.init();
        Reflect.set($li, "data-switch", PopsPanelSwitch);
        return $li;
      },
createSectionContainerItem_slider(formConfig) {
        let $li = document.createElement("li");
        Reflect.set($li, "__formConfig__", formConfig);
        this.setElementClassName($li, formConfig.className);
        this.setElementAttributes($li, formConfig.attributes);
        this.setElementProps($li, formConfig.props);
        let leftDescriptionText = "";
        if (Boolean(formConfig.description)) {
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${formConfig.description}</p>`;
        }
        PopsSafeUtils.setSafeHTML(
          $li,
`
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${formConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-slider">
					<input type="range" min="${formConfig.min}" max="${formConfig.max}">
				</div>
			`
        );
        let $rangeInput = $li.querySelector(".pops-panel-slider input[type=range]");
        if (formConfig.step) {
          $rangeInput.setAttribute("step", formConfig.step.toString());
        }
        $rangeInput.value = formConfig.getValue().toString();
        let getToolTipContent = function(value) {
          if (typeof formConfig.getToolTipContent === "function") {
            return formConfig.getToolTipContent(value);
          } else {
            return value;
          }
        };
        let tooltip = PopsTooltip.init({
          target: $rangeInput.parentElement,
          content: () => {
            return getToolTipContent($rangeInput.value);
          },
          zIndex: () => {
            return PopsInstanceUtils.getPopsMaxZIndex().zIndex;
          },
          className: "github-tooltip",
          alwaysShow: false,
          only: false,
          position: "top",
          arrowDistance: 10
        });
        popsDOMUtils.on($rangeInput, ["input", "propertychange"], void 0, function(event) {
          tooltip.toolTip.changeContent(getToolTipContent($rangeInput.value));
          if (typeof formConfig.callback === "function") {
            formConfig.callback(event, $rangeInput.valueAsNumber);
          }
        });
        return $li;
      },
createSectionContainerItem_slider_new(formConfig) {
        let $li = document.createElement("li");
        Reflect.set($li, "__formConfig__", formConfig);
        this.setElementClassName($li, formConfig.className);
        this.setElementAttributes($li, formConfig.attributes);
        this.setElementProps($li, formConfig.props);
        let leftDescriptionText = "";
        if (Boolean(formConfig.description)) {
          leftDescriptionText =
`<p class="pops-panel-item-left-desc-text">${formConfig.description}</p>`;
        }
        PopsSafeUtils.setSafeHTML(
          $li,
`
				<div class="pops-panel-item-left-text" style="flex: 1;">
					<p class="pops-panel-item-left-main-text">${formConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-slider pops-slider-width">
					<div class="pops-slider__runway">
						<div class="pops-slider__bar" style="width: 0%; left: 0%"></div>
						<div class="pops-slider__button-wrapper" style="left: 0%">
							<div class="pops-slider__button"></div>
						</div>
					</div>
				</div>`
        );
        const PopsPanelSlider = {
          [Symbol.toStringTag]: "PopsPanelSlider",
value: formConfig.getValue(),
min: formConfig.min,
max: formConfig.max,
step: formConfig.step || 1,
          $data: {
isMove: false,
isInitDragPosition: false,
isCheckingStopDragMove: false,
totalWidth: 0,
stepPx: 0,
dragWidth: 0,
dragPercent: 0,
stepBlockMap: new Map(),
            tooltip: null
          },
          $ele: {
            itemLeftTextContainer: $li.querySelector(".pops-panel-item-left-text"),
            slider: $li.querySelector(".pops-slider"),
            runAway: $li.querySelector(".pops-slider__runway"),
            bar: $li.querySelector(".pops-slider__bar"),
            buttonWrapper: $li.querySelector(".pops-slider__button-wrapper"),
            button: $li.querySelector(".pops-slider__button")
          },
          $interval: {
            isCheck: false
          },
          $tooltip: null,
          init() {
            this.initEleData();
            this.setToolTipEvent();
            this.setPanEvent();
            this.setRunAwayClickEvent();
            this.intervalInit();
            if (this.isFormConfigDisabledDrag()) {
              this.disableDrag();
            }
          },
intervalInit(checkStepTime = 200, maxTime = 1e4) {
            if (this.$interval.isCheck) {
              return;
            }
            this.$interval.isCheck = true;
            let isSuccess = false;
            let oldTotalWidth = this.$data.totalWidth;
            let timer = void 0;
            let interval = setInterval(() => {
              if (isSuccess) {
                this.$interval.isCheck = false;
                clearTimeout(timer);
                clearInterval(interval);
              } else {
                this.initTotalWidth();
                if (this.$data.totalWidth !== 0) {
                  isSuccess = true;
                  if (this.$data.totalWidth !== oldTotalWidth) {
                    if (PopsMathFloatUtils.isFloat(this.step)) {
                      this.initFloatStepMap();
                    } else {
                      this.initStepMap();
                    }
                    this.initSliderPosition();
                  }
                }
              }
            }, checkStepTime);
            timer = setTimeout(() => {
              clearInterval(interval);
            }, maxTime);
          },
initEleData() {
            this.$ele.slider.setAttribute("data-min", this.min.toString());
            this.$ele.slider.setAttribute("data-max", this.max.toString());
            this.$ele.slider.setAttribute("data-value", this.value.toString());
            this.$ele.slider.setAttribute("data-step", this.step.toString());
            Reflect.set(this.$ele.slider, "data-min", this.min);
            Reflect.set(this.$ele.slider, "data-max", this.max);
            Reflect.set(this.$ele.slider, "data-value", this.value);
            Reflect.set(this.$ele.slider, "data-step", this.step);
          },
initTotalWidth() {
            this.$data.totalWidth = popsDOMUtils.width(this.$ele.runAway);
          },
initStepMap() {
            let index = 0;
            let blockNums = (this.max - this.min) / this.step;
            this.$data.stepPx = this.$data.totalWidth / blockNums;
            let widthPx = 0;
            for (let stepValue = this.min; stepValue <= this.max; stepValue += this.step) {
              let value = this.formatValue(stepValue);
              let info;
              if (value === this.min) {
                info = {
                  value,
                  px: 0,
                  pxLeft: 0,
                  pxRight: this.$data.stepPx / 2,
                  percent: 0
                };
              } else {
                info = {
                  value,
                  px: widthPx,
                  pxLeft: widthPx - this.$data.stepPx / 2,
                  pxRight: widthPx + this.$data.stepPx / 2,
                  percent: widthPx / this.$data.totalWidth
                };
              }
              this.$data.stepBlockMap.set(index, info);
              index++;
              widthPx += this.$data.stepPx;
            }
          },
initFloatStepMap() {
            let index = 0;
            let blockNums = (this.max - this.min) / this.step;
            this.$data.stepPx = this.$data.totalWidth / blockNums;
            let widthPx = 0;
            for (let stepValue = this.min; stepValue <= this.max; stepValue = PopsMathFloatUtils.add(stepValue, this.step)) {
              let value = this.formatValue(stepValue);
              let info;
              if (value === this.min) {
                info = {
                  value,
                  px: 0,
                  pxLeft: 0,
                  pxRight: this.$data.stepPx / 2,
                  percent: 0
                };
              } else {
                info = {
                  value,
                  px: widthPx,
                  pxLeft: widthPx - this.$data.stepPx / 2,
                  pxRight: widthPx + this.$data.stepPx / 2,
                  percent: widthPx / this.$data.totalWidth
                };
              }
              this.$data.stepBlockMap.set(index, info);
              index++;
              widthPx += this.$data.stepPx;
            }
          },
initSliderPosition() {
            let percent = 0;
            for (const [, stepBlockInfo] of this.$data.stepBlockMap.entries()) {
              if (stepBlockInfo.value == this.value) {
                percent = stepBlockInfo.percent;
                this.$data.dragWidth = stepBlockInfo.px;
                break;
              }
            }
            percent = this.formatValue(percent * 100);
            this.setSliderPosition(percent);
          },
isFloat(num) {
            return Number(num) === num && num % 1 !== 0;
          },
valueChangeCallBack(event, value) {
            if (typeof formConfig.callback === "function") {
              formConfig.callback(event, value);
            }
          },
getDragInfo(dragX) {
            let result = this.$data.stepBlockMap.get(0);
            for (const [, stepBlockInfo] of this.$data.stepBlockMap.entries()) {
              if (stepBlockInfo.pxLeft <= dragX && dragX < stepBlockInfo.pxRight) {
                result = stepBlockInfo;
                break;
              }
            }
            return result;
          },
getSliderPositonPercent(dragWidth) {
            return dragWidth / this.$data.totalWidth;
          },
formatValue(num) {
            if (PopsMathFloatUtils.isFloat(this.step)) {
              num = parseFloat(num.toFixed(2));
            } else {
              num = parseInt(num.toString());
            }
            return num;
          },
setSliderPosition(percent) {
            if (parseInt(percent.toString()) === 1) {
              percent = 1;
            }
            if (percent > 1) {
              percent = percent / 100;
            }
            this.$ele.buttonWrapper.style.left = `${percent * 100}%`;
            this.$ele.bar.style.width = `${percent * 100}%`;
          },
disableDrag() {
            popsDOMUtils.addClassName(this.$ele.runAway, "pops-slider-is-disabled");
            popsDOMUtils.addClassName(this.$ele.runAway, PopsCommonCSSClassName.textIsDisabled);
          },
allowDrag() {
            popsDOMUtils.removeClassName(this.$ele.runAway, "pops-slider-is-disabled");
            popsDOMUtils.removeClassName(this.$ele.runAway, PopsCommonCSSClassName.textIsDisabled);
          },
isDisabledDrag() {
            return popsDOMUtils.containsClassName(this.$ele.runAway, "pops-slider-is-disabled");
          },
isFormConfigDisabledDrag() {
            let isDisabled = typeof formConfig.disabled === "function" ? formConfig.disabled() : formConfig.disabled;
            if (typeof isDisabled === "boolean") {
              return isDisabled;
            } else {
              return false;
            }
          },
setRunAwayClickEvent() {
            popsDOMUtils.on(this.$ele.runAway, "click", (event) => {
              if (event.target !== this.$ele.runAway && event.target !== this.$ele.bar) {
                return;
              }
              let clickX = parseFloat(event.offsetX.toString());
              let dragStartResult = this.dragStartCallBack();
              if (!dragStartResult) {
                return;
              }
              this.dragMoveCallBack(event, clickX, this.value);
              this.dragEndCallBack(clickX);
            }, {
              capture: false
            });
          },
dragStartCallBack() {
            if (this.isFormConfigDisabledDrag()) {
              this.disableDrag();
              return false;
            }
            if (!this.$data.isMove) {
              if (this.isDisabledDrag()) {
                this.allowDrag();
              }
              this.$data.isMove = true;
            }
            return true;
          },
dragMoveCallBack(event, dragX, oldValue) {
            let dragPercent = 0;
            if (dragX <= 0) {
              dragPercent = 0;
              this.value = this.min;
            } else if (dragX >= this.$data.totalWidth) {
              dragPercent = 1;
              this.value = this.max;
            } else {
              const dragInfo = this.getDragInfo(dragX);
              dragPercent = dragInfo.percent;
              this.value = this.formatValue(dragInfo.value);
            }
            this.$data.dragPercent = dragPercent;
            this.setSliderPosition(this.$data.dragPercent);
            this.showToolTip();
            if (oldValue !== this.value) {
              this.valueChangeCallBack(event, this.value);
            }
          },
dragEndCallBack(dragX) {
            this.$data.isMove = false;
            if (dragX <= 0) {
              this.$data.dragWidth = 0;
            } else if (dragX >= this.$data.totalWidth) {
              this.$data.dragWidth = this.$data.totalWidth;
            } else {
              this.$data.dragWidth = dragX;
            }
            this.closeToolTip();
          },
setPanEvent() {
            const AnyTouch = popsUtils.AnyTouch();
            this.$tooltip = new AnyTouch(this.$ele.button, {
              preventDefault() {
                return false;
              }
            });
            let currentDragX = 0;
            this.$tooltip.on("at:move", (event) => {
              if (!this.dragStartCallBack()) {
                return;
              }
              let oldValue = this.value;
              const runAwayRect = this.$ele.runAway.getBoundingClientRect();
              let displacementX = event.x - (runAwayRect.left + globalThis.screenX);
              if (displacementX <= 0) {
                displacementX = 0;
              } else if (displacementX >= runAwayRect.width) {
                displacementX = runAwayRect.width;
              }
              currentDragX = displacementX;
              this.dragMoveCallBack(event, currentDragX, oldValue);
            });
            this.$tooltip.on("at:end", (event) => {
              this.dragEndCallBack(currentDragX);
            });
          },
showToolTip() {
            this.$data.tooltip.toolTip.show();
          },
closeToolTip() {
            this.$data.tooltip.toolTip.close();
          },
checkStopDragMove() {
            if (this.$data.isCheckingStopDragMove) {
              return;
            }
            this.$data.isCheckingStopDragMove = true;
            let interval = setInterval(() => {
              if (!this.$data.isMove) {
                this.$data.isCheckingStopDragMove = false;
                this.closeToolTip();
                clearInterval(interval);
              }
            }, 200);
            setTimeout(() => {
              this.$data.isCheckingStopDragMove = false;
              clearInterval(interval);
            }, 2e3);
          },
setToolTipEvent() {
            function getToolTipContent() {
              if (typeof formConfig.getToolTipContent === "function") {
                return formConfig.getToolTipContent(PopsPanelSlider.value);
              } else {
                return PopsPanelSlider.value.toString();
              }
            }
            let tooltip = PopsTooltip.init({
              target: this.$ele.button,
              content: getToolTipContent,
              zIndex: () => {
                return PopsInstanceUtils.getPopsMaxZIndex().zIndex;
              },
              isFixed: true,
              className: "github-tooltip",
              only: false,
              eventOption: {
                capture: true,
                passive: true
              },
              showBeforeCallBack: () => {
                let isShowHoverTip = typeof formConfig.isShowHoverTip === "function" ? formConfig.isShowHoverTip() : typeof formConfig.isShowHoverTip === "boolean" ? formConfig.isShowHoverTip : true;
                if (!isShowHoverTip) {
                  return false;
                }
                this.intervalInit();
              },
              showAfterCallBack: (toolTipNode) => {
                tooltip.toolTip.changeContent(getToolTipContent());
              },
              closeBeforeCallBack: () => {
                if (this.$data.isMove) {
                  this.checkStopDragMove();
                  return false;
                }
              },
              alwaysShow: false,
              position: "top",
              arrowDistance: 10
            });
            this.$data.tooltip = tooltip;
          }
        };
        PopsPanelSlider.init();
        Reflect.set($li, "data-slider", PopsPanelSlider);
        return $li;
      },
createSectionContainerItem_input(formConfig) {
        let $li = document.createElement("li");
        Reflect.set($li, "__formConfig__", formConfig);
        this.setElementClassName($li, formConfig.className);
        this.setElementAttributes($li, formConfig.attributes);
        this.setElementProps($li, formConfig.props);
        let inputType = "text";
        if (formConfig.isPassword) {
          inputType = "password";
        } else if (formConfig.isNumber) {
          inputType = "number";
        }
        let leftDescriptionText = "";
        if (Boolean(formConfig.description)) {
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${formConfig.description}</p>`;
        }
        PopsSafeUtils.setSafeHTML(
          $li,
`
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${formConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-input">
					<input type="${inputType}" placeholder="${formConfig.placeholder ?? ""}">
				</div>
				`
        );
        const PopsPanelInput = {
          [Symbol.toStringTag]: "PopsPanelInput",
          $ele: {
            itemLeftTextContainer: $li.querySelector(".pops-panel-item-left-text"),
            panelInput: $li.querySelector(".pops-panel-input"),
            input: $li.querySelector("input"),
            inputSpanIcon: document.createElement("span"),
            inputSpanIconInner: null,
            icon: null
          },
          $data: {
            value: formConfig.getValue(),
            isView: false
          },
          init() {
            this.initEle();
            this.setInputValue(this.$data.value);
            if (formConfig.isPassword) {
              this.setCircleIcon(PopsIcon.getIcon("view"));
              this.setCircleIconClickEvent();
            } else {
              if (this.$ele.input.value != "") {
                this.setCircleIcon(PopsIcon.getIcon("circleClose"));
                this.setCircleIconClickEvent();
              }
            }
            this.setInputChangeEvent();
            let disabled = typeof formConfig.disabled === "function" ? formConfig.disabled() : formConfig.disabled;
            if (disabled) {
              this.disable();
            }
            if (typeof formConfig.handlerCallBack === "function") {
              formConfig.handlerCallBack($li, this.$ele.input);
            }
          },
initEle() {
            this.$ele.input.parentElement.insertBefore(this.$ele.inputSpanIcon, this.$ele.input.nextSibling);
            this.$ele.inputSpanIcon.className = "pops-panel-input__suffix";
            PopsSafeUtils.setSafeHTML(
              this.$ele.inputSpanIcon,
`
						<span class="pops-panel-input__suffix-inner">
							<i class="pops-panel-icon"></i>
						</span>
					`
            );
            this.$ele.inputSpanIconInner = this.$ele.inputSpanIcon.querySelector(".pops-panel-input__suffix-inner");
            this.$ele.icon = this.$ele.inputSpanIcon.querySelector(".pops-panel-icon");
            popsDOMUtils.addClassName(this.$ele.panelInput, PopsCommonCSSClassName.userSelectNone);
          },
disable() {
            this.$ele.input.disabled = true;
            popsDOMUtils.addClassName(this.$ele.panelInput, "pops-input-disabled");
            popsDOMUtils.addClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
notDisable() {
            this.$ele.input.disabled = false;
            popsDOMUtils.removeClassName(this.$ele.panelInput, "pops-input-disabled");
            popsDOMUtils.removeClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
isDisabled() {
            return this.$ele.input.disabled;
          },
setInputValue(value = "") {
            this.$ele.input.value = value;
          },
setInputType(typeValue = "text") {
            this.$ele.input.setAttribute("type", typeValue);
          },
removeCircleIcon() {
            PopsSafeUtils.setSafeHTML(this.$ele.icon, "");
          },
setCircleIcon(svgHTML = PopsIcon.getIcon("circleClose")) {
            PopsSafeUtils.setSafeHTML(this.$ele.icon, svgHTML);
          },
setCircleIconClickEvent() {
            popsDOMUtils.on(this.$ele.icon, "click", void 0, () => {
              if (this.isDisabled()) {
                return;
              }
              this.removeCircleIcon();
              if (formConfig.isPassword) {
                if (this.$data.isView) {
                  this.$data.isView = false;
                  this.setInputType("text");
                  this.setCircleIcon(PopsIcon.getIcon("hide"));
                } else {
                  this.$data.isView = true;
                  this.setInputType("password");
                  this.setCircleIcon(PopsIcon.getIcon("view"));
                }
              } else {
                this.setInputValue("");
                this.$ele.input.focus();
                this.$ele.input.dispatchEvent(new Event("input"));
              }
            });
          },
setInputChangeEvent() {
            popsDOMUtils.on(this.$ele.input, ["input", "propertychange"], void 0, (event) => {
              this.$data.value = this.$ele.input.value;
              if (!formConfig.isPassword) {
                if (this.$ele.input.value !== "" && this.$ele.icon.innerHTML === "") {
                  this.setCircleIcon(PopsIcon.getIcon("circleClose"));
                  this.setCircleIconClickEvent();
                } else if (this.$ele.input.value === "") {
                  this.removeCircleIcon();
                }
              }
              if (typeof formConfig.callback === "function") {
                if (formConfig.isNumber) {
                  formConfig.callback(event, this.$ele.input.value, this.$ele.input.valueAsNumber);
                } else {
                  formConfig.callback(event, this.$ele.input.value);
                }
              }
            });
          }
        };
        PopsPanelInput.init();
        Reflect.set($li, "data-input", PopsPanelInput);
        return $li;
      },
createSectionContainerItem_textarea(formConfig) {
        let $li = document.createElement("li");
        Reflect.set($li, "__formConfig__", formConfig);
        this.setElementClassName($li, formConfig.className);
        this.setElementAttributes($li, formConfig.attributes);
        this.setElementProps($li, formConfig.props);
        let leftDescriptionText = "";
        if (Boolean(formConfig.description)) {
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${formConfig.description}</p>`;
        }
        PopsSafeUtils.setSafeHTML(
          $li,
`
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${formConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-textarea">
					<textarea placeholder="${formConfig.placeholder ?? ""}"></textarea>
				</div>
			`
        );
        const PopsPanelTextArea = {
          [Symbol.toStringTag]: "PopsPanelTextArea",
          $ele: {
            itemLeftTextContainer: $li.querySelector(".pops-panel-item-left-text"),
            panelTextarea: $li.querySelector(".pops-panel-textarea"),
            textarea: $li.querySelector(".pops-panel-textarea textarea")
          },
          $data: {
            value: formConfig.getValue()
          },
          init() {
            this.setValue(this.$data.value);
            this.setChangeEvent();
            let disabled = typeof formConfig.disabled === "function" ? formConfig.disabled() : formConfig.disabled;
            if (disabled) {
              this.disable();
            }
          },
          disable() {
            this.$ele.textarea.setAttribute("disabled", "true");
            popsDOMUtils.addClassName(this.$ele.panelTextarea, "pops-panel-textarea-disable");
            popsDOMUtils.addClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
          notDisable() {
            this.$ele.textarea.removeAttribute("disabled");
            popsDOMUtils.removeClassName(this.$ele.panelTextarea, "pops-panel-textarea-disable");
            popsDOMUtils.removeClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
          isDisabled() {
            return this.$ele.textarea.hasAttribute("disabled") || popsDOMUtils.containsClassName(this.$ele.panelTextarea, "pops-panel-textarea-disable");
          },
          setValue(value) {
            this.$ele.textarea.value = value;
          },
setChangeEvent() {
            popsDOMUtils.on(this.$ele.textarea, ["input", "propertychange"], (event) => {
              let value = this.$ele.textarea.value;
              this.$data.value = value;
              if (typeof formConfig.callback === "function") {
                formConfig.callback(event, value);
              }
            });
          }
        };
        PopsPanelTextArea.init();
        Reflect.set($li, "data-textarea", PopsPanelTextArea);
        return $li;
      },
createSectionContainerItem_select(formConfig) {
        const that = this;
        let $li = document.createElement("li");
        Reflect.set($li, "__formConfig__", formConfig);
        this.setElementClassName($li, formConfig.className);
        this.setElementAttributes($li, formConfig.attributes);
        this.setElementProps($li, formConfig.props);
        let leftDescriptionText = "";
        if (Boolean(formConfig.description)) {
          leftDescriptionText =
`<p class="pops-panel-item-left-desc-text">${formConfig.description}</p>`;
        }
        PopsSafeUtils.setSafeHTML(
          $li,
`
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${formConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-select">
					<select></select>
				</div>
				`
        );
        const PopsPanelSelect = {
          [Symbol.toStringTag]: "PopsPanelSelect",
          $ele: {
            itemLeftTextContainer: $li.querySelector(".pops-panel-item-left-text"),
            panelSelect: $li.querySelector(".pops-panel-select"),
            select: $li.querySelector(".pops-panel-select select")
          },
          $eleKey: {
            disable: "__disable__",
            value: "__value__",
            forms: "__forms__"
          },
          $data: {
            defaultValue: formConfig.getValue()
          },
          init() {
            popsDOMUtils.addClassName(this.$ele.panelSelect, PopsCommonCSSClassName.userSelectNone);
            this.initOption();
            this.setChangeEvent();
            this.setClickEvent();
            let disabled = typeof formConfig.disabled === "function" ? formConfig.disabled() : formConfig.disabled;
            if (disabled) {
              this.disable();
            }
          },
setNodeValue($ele, key, value) {
            Reflect.set($ele, key, value);
          },
getNodeValue($ele, key) {
            return Reflect.get($ele, key);
          },
disable() {
            this.$ele.select.setAttribute("disabled", "true");
            popsDOMUtils.addClassName(this.$ele.panelSelect, "pops-panel-select-disable");
            popsDOMUtils.addClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
notDisable() {
            this.$ele.select.removeAttribute("disabled");
            popsDOMUtils.removeClassName(this.$ele.panelSelect, "pops-panel-select-disable");
            popsDOMUtils.removeClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
isDisabled() {
            return this.$ele.select.hasAttribute("disabled") || popsDOMUtils.containsClassName(this.$ele.panelSelect, "pops-panel-select-disable");
          },
initOption() {
            formConfig.data.forEach((dataItem) => {
              let optionElement = document.createElement("option");
              this.setNodeValue(optionElement, this.$eleKey.value, dataItem.value);
              this.setNodeValue(optionElement, this.$eleKey.disable, dataItem.disable);
              this.setNodeValue(optionElement, this.$eleKey.forms, dataItem.forms);
              if (dataItem.value === this.$data.defaultValue) {
                this.setOptionSelected(optionElement);
              }
              optionElement.innerText = dataItem.text;
              this.$ele.select.appendChild(optionElement);
            });
          },
setOptionSelected($option) {
            $option.setAttribute("selected", "true");
          },
setSelectOptionsDisableStatus() {
            if (this.$ele.select.options && this.$ele.select.options.length) {
              Array.from(this.$ele.select.options).forEach((optionItem) => {
                this.setOptionDisableStatus(optionItem);
              });
            }
          },
setOptionDisableStatus(optionElement) {
            let disable = false;
            let optionDisableAttr = this.getNodeValue(optionElement, this.$eleKey.disable);
            if (optionDisableAttr === "function") {
              let value = this.getNodeValue(optionElement, this.$eleKey.value);
              disable = Boolean(optionDisableAttr(value));
            }
            if (disable) {
              optionElement.setAttribute("disabled", "true");
            } else {
              optionElement.removeAttribute("disabled");
            }
          },
getSelectOptionInfo($option) {
            let optionValue = this.getNodeValue($option, this.$eleKey.value);
            let optionText = $option.innerText || $option.textContent;
            let optionForms = this.getNodeValue($option, this.$eleKey.forms);
            return {
              value: optionValue,
              text: optionText,
              forms: optionForms,
              $option
            };
          },
setChangeEvent() {
            popsDOMUtils.on(this.$ele.select, "change", void 0, (event) => {
              let $isSelectedElement = this.$ele.select[this.$ele.select.selectedIndex];
              let selectInfo = this.getSelectOptionInfo($isSelectedElement);
              this.setSelectOptionsDisableStatus();
              if (typeof formConfig.callback === "function") {
                formConfig.callback(event, selectInfo.value, selectInfo.text);
              }
              let forms = typeof selectInfo.forms === "function" ? selectInfo.forms() : selectInfo.forms;
              if (Array.isArray(forms)) {
                let childUListClassName = "pops-panel-select-child-forms";
                while ($li.nextElementSibling) {
                  if ($li.nextElementSibling.classList.contains(childUListClassName)) {
                    $li.nextElementSibling.remove();
                  } else {
                    break;
                  }
                }
                let $childUList = document.createElement("ul");
                $childUList.className = childUListClassName;
                popsDOMUtils.after($li, $childUList);
                that.uListContainerAddItem(formConfig, {
                  ulElement: $childUList
                });
              }
            });
          },
setClickEvent() {
            popsDOMUtils.on(this.$ele.select, "click", void 0, (event) => {
              this.setSelectOptionsDisableStatus();
              if (typeof formConfig.clickCallBack === "function") {
                formConfig.clickCallBack(event, this.$ele.select);
              }
            });
          }
        };
        PopsPanelSelect.init();
        Reflect.set($li, "data-select", PopsPanelSelect);
        return $li;
      },
createSectionContainerItem_select_multiple_new(formConfig) {
        let $li = document.createElement("li");
        Reflect.set($li, "__formConfig__", formConfig);
        this.setElementClassName($li, formConfig.className);
        this.setElementAttributes($li, formConfig.attributes);
        this.setElementProps($li, formConfig.props);
        let leftDescriptionText = "";
        if (Boolean(formConfig.description)) {
          leftDescriptionText =
`<p class="pops-panel-item-left-desc-text">${formConfig.description}</p>`;
        }
        PopsSafeUtils.setSafeHTML(
          $li,
`
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${formConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-select-multiple">
					<div class="el-select__wrapper">
						<div class="el-select__selection">
							<!-- 这个是用于手动输入的,这里暂不适配 -->
							<div class="el-select__selected-item el-select__input-wrapper">
		
							</div>
							<!-- 这个是placeholder -->
							<div class="el-select__selected-item el-select__placeholder">
							</div>
						</div>
						<!-- 下拉箭头 -->
						<div class="el-select__suffix">
							<i class="el-icon el-select__caret el-select__icon">
								<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
									<path fill="currentColor" d="M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.712a29.12 29.12 0 0 0 0-41.728 30.592 30.592 0 0 0-42.752 0z"></path>
								</svg>
							</i>
						</div>
					</div>
				</div>
				`
        );
        const PopsPanelSelectMultiple = {
          [Symbol.toStringTag]: "PopsPanelSelectMultiple",
          $el: {
itemLeftTextContainer: $li.querySelector(".pops-panel-item-left-text"),
$container: void 0,
$wrapper: void 0,
$section: void 0,
$selectedInputWrapper: void 0,
$selectedPlaceHolderWrapper: void 0,
$suffix: void 0,
$suffixIcon: void 0,
$selectContainer: void 0
          },
          $data: {
defaultValue: formConfig.getValue(),
            selectInfo: []
          },
init() {
            this.initDefault();
            this.inintEl();
            this.initPlaceHolder();
            this.initTagElement();
            this.setSelectContainerClickEvent();
            let disabled = typeof formConfig.disabled === "function" ? formConfig.disabled() : formConfig.disabled;
            if (disabled) {
              this.disable();
            }
          },
initDefault() {
            formConfig.data.forEach((dataItem) => {
              if (this.$data.defaultValue.includes(dataItem.value)) {
                this.$data.selectInfo.push({
                  text: dataItem.text,
                  value: dataItem.value,
                  isHTML: Boolean(dataItem.isHTML),
                  disable: dataItem.disable?.bind(dataItem)
                });
              }
            });
          },
inintEl() {
            this.$el.$container = $li.querySelector(".pops-panel-select-multiple");
            this.$el.$wrapper = $li.querySelector(".el-select__wrapper");
            this.$el.$section = $li.querySelector(".el-select__selection");
            this.$el.$selectedInputWrapper = $li.querySelector(".el-select__selected-item.el-select__input-wrapper");
            this.$el.$selectedPlaceHolderWrapper = $li.querySelector(".el-select__selected-item.el-select__placeholder");
            this.$el.$suffix = $li.querySelector(".el-select__suffix");
            this.$el.$suffixIcon = $li.querySelector(".el-select__suffix .el-icon");
            this.hideInputWrapper();
          },
initPlaceHolder() {
            let placeholder = "";
            if (typeof formConfig.placeholder === "string") {
              placeholder = formConfig.placeholder;
            } else if (typeof formConfig.placeholder === "function") {
              let placeholderResult = formConfig.placeholder();
              if (typeof placeholderResult === "string") {
                placeholder = placeholderResult;
              }
            }
            let $placeholder = popsDOMUtils.createElement("span", {
              innerText: placeholder
            });
            this.$el.$selectedPlaceHolderWrapper.appendChild($placeholder);
          },
initTagElement() {
            formConfig.data.forEach((dataItem) => {
              let findValue = this.$data.selectInfo.find((item) => item.value === dataItem.value);
              if (findValue) {
                let selectedInfo = this.createSelectedTagItem(dataItem);
                this.addSelectedTagItem(selectedInfo.$tag);
                this.setSelectedItemCloseIconClickEvent({
                  $tag: selectedInfo.$tag,
                  $closeIcon: selectedInfo.$closeIcon,
                  value: dataItem.value,
                  text: dataItem.text
                });
              }
            });
            this.checkTagEmpty();
          },
createSelectedTagItem(data) {
            const $selectedItem = popsDOMUtils.createElement("div", {
              className: "el-select__selected-item el-select__choose_tag",
              innerHTML: (
`
						<span class="el-tag is-closable el-tag--info el-tag--default el-tag--light">
							<span class="el-tag__content">
								<span class="el-select__tags-text"></span>
							</span>
							<!-- 关闭tag的图标 -->
							<i class="el-icon el-tag__close">
								<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
									<path fill="currentColor" d="M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"></path>
								</svg>
							</i>
						</span>
						`
              )
            });
            const $tagText = $selectedItem.querySelector(".el-select__tags-text");
            const $closeIcon = $selectedItem.querySelector(".el-icon.el-tag__close");
            let text = typeof data.text === "function" ? data.text(data, this.$data.selectInfo) : data.text;
            if (data.isHTML) {
              PopsSafeUtils.setSafeHTML($tagText, text);
            } else {
              $tagText.innerText = text;
            }
            return {
              $tag: $selectedItem,
              $tagText,
              $closeIcon
            };
          },
addSelectedTagItem($tag) {
            this.setSectionIsNear();
            if (this.$el.$section.contains(this.$el.$selectedInputWrapper)) {
              let $prev = this.$el.$selectedInputWrapper.previousElementSibling;
              if ($prev) {
                popsDOMUtils.after($prev, $tag);
              } else {
                popsDOMUtils.before(this.$el.$selectedInputWrapper, $tag);
              }
            } else if (this.$el.$section.contains(this.$el.$selectedPlaceHolderWrapper)) {
              let $prev = this.$el.$selectedPlaceHolderWrapper.previousElementSibling;
              if ($prev) {
                popsDOMUtils.after($prev, $tag);
              } else {
                popsDOMUtils.before(this.$el.$selectedPlaceHolderWrapper, $tag);
              }
            } else {
              this.$el.$section.appendChild($tag);
            }
            this.hideInputWrapper();
            this.hidePlaceHolderWrapper();
          },
updateSelectTagItem() {
            this.$el.$section.querySelectorAll(".el-select__choose_tag").forEach(($ele) => {
              $ele.remove();
            });
            this.initTagElement();
          },
selectValueChangeCallBack(selectedDataList) {
            this.updateSelectItem();
            if (typeof formConfig.callback === "function") {
              formConfig.callback(selectedDataList || this.$data.selectInfo);
            }
          },
updateSelectItem() {
            this.getAllSelectItemInfo(false).forEach(($selectInfo) => {
              const { data, $select } = $selectInfo;
              this.setSelectItemText(data, $selectInfo.$select);
              if (typeof data.disable === "function" && data.disable(data.value, this.$data.selectInfo)) {
                this.setSelectItemDisabled($select);
                this.removeSelectedInfo(data, false);
                this.removeSelectItemSelected($select);
              } else {
                this.removeSelectItemDisabled($select);
              }
              let findValue = this.$data.selectInfo.find((it) => it.value === data.value);
              if (findValue) {
                this.setSelectItemSelected($select);
              } else {
                this.removeSelectItemSelected($select);
              }
            });
          },
setSelectItemSelected($select) {
            if (this.isSelectItemSelected($select))
              return;
            $select.classList.add("select-item-is-selected");
          },
removeSelectItemSelected($select) {
            $select.classList.remove("select-item-is-selected");
          },
isSelectItemSelected($select) {
            return $select.classList.contains("select-item-is-selected");
          },
addSelectedItemInfo(dataList, $select) {
            let info = this.getSelectedItemInfo($select);
            let findValue = dataList.find((item) => item.value === info.value);
            if (!findValue) {
              dataList.push({
                value: info.value,
                text: info.text,
                isHTML: Boolean(info.isHTML),
                disable: info.disable?.bind(info)
              });
            }
            this.selectValueChangeCallBack(dataList);
          },
getSelectedItemInfo($select) {
            return Reflect.get($select, "data-info");
          },
removeSelectedItemInfo(dataList, $select) {
            let info = this.getSelectedItemInfo($select);
            let findIndex = dataList.findIndex((item) => item.value === info.value);
            if (findIndex !== -1) {
              dataList.splice(findIndex, 1);
            }
            this.selectValueChangeCallBack(dataList);
          },
getAllSelectItemInfo(onlySelected = true) {
            return Array.from(this.$el.$selectContainer?.querySelectorAll(".select-item") ?? []).map(($select) => {
              let data = this.getSelectedItemInfo($select);
              let result = {
data,
$select
              };
              if (onlySelected) {
                let isSelected = this.isSelectItemSelected($select);
                if (isSelected) {
                  return result;
                }
                return;
              } else {
                return result;
              }
            }).filter((item) => {
              return item != null;
            });
          },
createSelectItemElement(data) {
            let $select = popsDOMUtils.createElement("li", {
              className: "select-item",
              innerHTML: (
`
							<span class="select-item-text"></span>
						`
              )
            });
            this.setSelectItemText(data, $select);
            Reflect.set($select, "data-info", data);
            return $select;
          },
setSelectItemText(data, $select) {
            let text = typeof data.text === "function" ? data.text(data.value, this.$data.selectInfo) : data.text;
            let $selectSpan = $select.querySelector(".select-item-text");
            if (data.isHTML) {
              PopsSafeUtils.setSafeHTML($selectSpan, text);
            } else {
              $selectSpan.innerText = text;
            }
          },
setSelectItemDisabled($select) {
            $select.setAttribute("aria-disabled", "true");
            $select.setAttribute("disabled", "true");
          },
removeSelectItemDisabled($select) {
            $select.removeAttribute("aria-disabled");
            $select.removeAttribute("disabled");
          },
isSelectItemDisabled($select) {
            return $select.hasAttribute("disabled") || $select.ariaDisabled;
          },
setSelectElementClickEvent(dataList, $select) {
            popsDOMUtils.on($select, "click", (event) => {
              popsDOMUtils.preventEvent(event);
              if (this.isSelectItemDisabled($select)) {
                return;
              }
              if (typeof formConfig.clickCallBack === "function") {
                let allSelectedInfo = this.getAllSelectItemInfo().map((it) => it.data);
                let clickResult = formConfig.clickCallBack(event, allSelectedInfo);
                if (typeof clickResult === "boolean" && !clickResult) {
                  return;
                }
              }
              if (this.isSelectItemSelected($select)) {
                this.removeSelectItemSelected($select);
                this.removeSelectedItemInfo(dataList, $select);
              } else {
                this.setSelectItemSelected($select);
                this.addSelectedItemInfo(dataList, $select);
              }
            });
          },
setSelectContainerClickEvent() {
            const that = this;
            popsDOMUtils.on(this.$el.$container, "click", (event) => {
              if (this.isDisabled()) {
                return;
              }
              let selectedInfo = that.$data.selectInfo;
              let { style, ...userConfirmDetails } = formConfig.selectConfirmDialogDetails || {};
              let confirmDetails = popsUtils.assign({
                title: {
                  text: "请勾选需要选择的选项",
                  position: "center"
                },
                content: {
                  text: (
`
									<ul class="select-container"></ul>
									`
                  ),
                  html: true
                },
                btn: {
                  ok: {
                    enable: false
                  },
                  close: {
                    enable: true,
                    callback(details, event2) {
                      that.$data.selectInfo = [...selectedInfo];
                      that.updateSelectTagItem();
                      that.$el.$selectContainer = null;
                      details.close();
                    }
                  }
                },
                mask: {
                  enable: true,
                  clickCallBack(originalRun, config) {
                    originalRun();
                    that.$data.selectInfo = [...selectedInfo];
                    that.updateSelectTagItem();
                    that.$el.$selectContainer = null;
                  },
                  clickEvent: {
                    toClose: true
                  }
                },
                drag: true,
                dragLimit: true,
                width: "300px",
                height: "300px",
                style: (
`
								.select-container{
									--el-font-size-base: 14px;
									--el-text-color-regular: #606266;
									--el-color-primary: #409eff;
									--el-fill-color-light: #f5f7fa;
									--el-disable-color: #a8abb2;
								}
								.select-item{
									cursor: pointer;
									font-size: var(--el-font-size-base);
									padding: 0 32px 0 20px;
									position: relative;
									white-space: nowrap;
									overflow: hidden;
									text-overflow: ellipsis;
									color: var(--el-text-color-regular);
									height: 34px;
									line-height: 34px;
									box-sizing: border-box;
								}
								.select-item[aria-disabled],
								.select-item[disabled]{
									cursor: not-allowed;
									color: var(--el-disable-color);
									background: unset;
								}
								.select-item:hover{
									background-color: var(--el-fill-color-light);
								}
								.select-item.select-item-is-selected{
									color: var(--el-color-primary);
									font-weight: 700;
								}
								.select-item.select-item-is-selected::after{
									content: "";
									position: absolute;
									top: 50%;
									right: 20px;
									border-top: none;
									border-right: none;
									background-repeat: no-repeat;
									background-position: center;
									background-color: var(--el-color-primary);
									mask: url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;
									mask-size: 100% 100%;
									-webkit-mask: url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;
									-webkit-mask-size: 100% 100%;
									transform: translateY(-50%);
									width: 12px;
									height: 12px;
								}

								
								@media (prefers-color-scheme: dark) {
									.select-container{
										--el-text-color-regular: #f2f2f2;
										--el-disable-color: #8D9095;
										--el-fill-color-light: #262727;
									}
								}

								${style || ""}
								`
                )
              }, userConfirmDetails);
              let $dialog = PopsAlert.init(confirmDetails);
              let $selectContainer = $dialog.$shadowRoot.querySelector(".select-container");
              this.$el.$selectContainer = $selectContainer;
              formConfig.data.forEach((item) => {
                let $select = this.createSelectItemElement(item);
                $selectContainer.appendChild($select);
                this.setSelectElementClickEvent(selectedInfo, $select);
              });
              this.updateSelectItem();
            });
          },
setSelectedItemCloseIconClickEvent(data) {
            popsDOMUtils.on(data.$closeIcon, "click", (event) => {
              popsDOMUtils.preventEvent(event);
              if (this.isDisabled()) {
                return;
              }
              if (typeof formConfig.closeIconClickCallBack === "function") {
                let result = formConfig.closeIconClickCallBack(event, {
                  $tag: data.$tag,
                  $closeIcon: data.$closeIcon,
                  value: data.value,
                  text: typeof data.text === "function" ? data.text.bind(data) : data.text
                });
                if (typeof result === "boolean" && !result) {
                  return;
                }
              }
              this.removeSelectedTagItem(data.$tag);
              this.removeSelectedInfo({
                value: data.value,
                text: data.text
              });
            }, {
              capture: true
            });
          },
checkTagEmpty() {
            if (!this.$el.$section.querySelectorAll(".el-select__choose_tag").length) {
              this.showPlaceHolderWrapper();
              this.removeSectionIsNear();
            }
          },
removeSelectedTagItem($tag) {
            $tag.remove();
            this.checkTagEmpty();
          },
removeSelectedInfo(data, triggerValueChangeCallBack = true) {
            for (let index = 0; index < this.$data.selectInfo.length; index++) {
              const selectInfo = this.$data.selectInfo[index];
              if (selectInfo.value === data.value) {
                this.$data.selectInfo.splice(index, 1);
                break;
              }
            }
            triggerValueChangeCallBack && this.selectValueChangeCallBack();
          },
showInputWrapper() {
            popsDOMUtils.cssShow(this.$el.$selectedInputWrapper);
          },
hideInputWrapper() {
            popsDOMUtils.cssHide(this.$el.$selectedInputWrapper, true);
          },
showPlaceHolderWrapper() {
            popsDOMUtils.cssShow(this.$el.$selectedPlaceHolderWrapper);
          },
hidePlaceHolderWrapper() {
            popsDOMUtils.cssHide(this.$el.$selectedPlaceHolderWrapper, true);
          },
setSectionIsNear() {
            this.$el.$section.classList.add("is-near");
          },
removeSectionIsNear() {
            this.$el.$section.classList.remove("is-near");
          },
disable() {
            popsDOMUtils.addClassName(this.$el.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
            popsDOMUtils.addClassName(this.$el.$container, "pops-panel-select-multiple-disable");
          },
isDisabled() {
            return popsDOMUtils.containsClassName(this.$el.$container, "pops-panel-select-multiple-disable");
          },
cancleDisable() {
            popsDOMUtils.removeClassName(this.$el.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
            popsDOMUtils.removeClassName(this.$el.$container, "pops-panel-select-multiple-disable");
          }
        };
        PopsPanelSelectMultiple.init();
        Reflect.set($li, "data-select-multiple", PopsPanelSelectMultiple);
        return $li;
      },
createSectionContainerItem_button(formConfig) {
        let $li = document.createElement("li");
        Reflect.set($li, "__formConfig__", formConfig);
        this.setElementClassName($li, formConfig.className);
        this.setElementAttributes($li, formConfig.attributes);
        this.setElementProps($li, formConfig.props);
        let leftDescriptionText = "";
        if (Boolean(formConfig.description)) {
          leftDescriptionText =
`<p class="pops-panel-item-left-desc-text">${formConfig.description}</p>`;
        }
        PopsSafeUtils.setSafeHTML(
          $li,
`
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${formConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-button">
					<button class="pops-panel-button_inner" type="button">
						<i class="pops-bottom-icon"></i>
						<span class="pops-panel-button-text"></span>
					</button>
				</div>
				`
        );
        const PopsPanelButton = {
          [Symbol.toStringTag]: "PopsPanelButton",
          $ele: {
            panelButton: $li.querySelector(".pops-panel-button"),
            button: $li.querySelector(".pops-panel-button .pops-panel-button_inner"),
            icon: $li.querySelector(".pops-panel-button .pops-bottom-icon"),
            spanText: $li.querySelector(".pops-panel-button .pops-panel-button-text")
          },
          $data: {},
          init() {
            this.$ele.panelButton.appendChild(this.$ele.button);
            this.initButton();
            this.setClickEvent();
          },
          initButton() {
            if (typeof formConfig.buttonIcon === "string" && formConfig.buttonIcon.trim() !== "") {
              if (PopsIcon.hasIcon(formConfig.buttonIcon)) {
                this.setIconSVG(PopsIcon.getIcon(formConfig.buttonIcon));
              } else {
                this.setIconSVG(formConfig.buttonIcon);
              }
              this.showIcon();
            } else {
              this.hideIcon();
            }
            let buttonText = formConfig.buttonText;
            if (typeof formConfig.buttonText === "function") {
              buttonText = formConfig.buttonText();
            }
            this.setButtonType(formConfig.buttonType);
            if (formConfig.buttonIsRightIcon) {
              this.setIconRight();
            } else {
              this.setIconLeft();
            }
            if (formConfig.disable) {
              this.disable();
            }
            this.setButtonText(buttonText);
            this.setIconLoadingStatus(formConfig.buttonIconIsLoading);
          },
          disable() {
            this.$ele.button.setAttribute("disabled", "true");
          },
          notDisable() {
            this.$ele.button.removeAttribute("disabled");
          },
hideIcon() {
            this.$ele.panelButton.classList.add("pops-panel-button-no-icon");
          },
showIcon() {
            this.$ele.panelButton.classList.remove("pops-panel-button-no-icon");
          },
setIconSVG(svgHTML) {
            PopsSafeUtils.setSafeHTML(this.$ele.icon, svgHTML);
          },
setIconLoadingStatus(status) {
            this.$ele.icon.setAttribute("is-loading", Boolean(status).toString());
          },
setHasIcon(value) {
            this.$ele.button.setAttribute("data-icon", Boolean(value).toString());
          },
setButtonType(typeValue) {
            this.$ele.button.setAttribute("data-type", typeValue);
          },
setIconRight() {
            this.$ele.button.classList.add("pops-panel-button-right-icon");
          },
setIconLeft() {
            this.$ele.button.classList.remove("pops-panel-button-right-icon");
          },
setButtonText(text) {
            PopsSafeUtils.setSafeHTML(this.$ele.spanText, text);
          },
          setClickEvent() {
            popsDOMUtils.on(this.$ele.button, "click", void 0, (event) => {
              if (typeof formConfig.callback === "function") {
                formConfig.callback(event);
              }
            });
          }
        };
        PopsPanelButton.init();
        Reflect.set($li, "data-button", PopsPanelButton);
        return $li;
      },
createSectionContainerItem_deepMenu(formConfig) {
        let that = this;
        let $li = document.createElement("li");
        popsDOMUtils.addClassName($li, "pops-panel-deepMenu-nav-item");
        Reflect.set($li, "__formConfig__", formConfig);
        this.setElementClassName($li, formConfig.className);
        this.setElementAttributes($li, formConfig.attributes);
        this.setElementProps($li, formConfig.props);
        let leftDescriptionText = "";
        if (Boolean(formConfig.description)) {
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${formConfig.description}</p>`;
        }
        let arrowRightIcon = typeof formConfig.arrowRightIcon === "boolean" ? formConfig.arrowRightIcon : true;
        let arrowRightIconHTML = "";
        if (arrowRightIcon) {
          arrowRightIconHTML = `<i class="pops-panel-deepMenu-arrowRight-icon">${PopsIcon.getIcon("arrowRight")}</i>`;
        }
        let rightText = "";
        if (formConfig.rightText) {
          rightText =
`<p class="pops-panel-item-right-text">${formConfig.rightText}</p>`;
        }
        PopsSafeUtils.setSafeHTML(
          $li,
`
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${formConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-deepMenu">${rightText}${arrowRightIconHTML}</div>
				`
        );
        const PopsPanelDeepMenu = {
          [Symbol.toStringTag]: "PopsPanelDeepMenu",
          $ele: {
            get parentSection() {
              return that.$el.$contentSectionContainer;
            }
          },
          init() {
            this.setLiClickEvent();
          },
initFormItem($container, formItemConfig) {
            let formConfig_forms = formItemConfig;
            if (formConfig_forms.type === "forms") {
              let childForms = formConfig_forms["forms"];
              let formContainerListElement = document.createElement("li");
              let formContainerULElement = document.createElement("ul");
              formContainerULElement.classList.add("pops-panel-forms-container-item-formlist");
              formContainerListElement.classList.add("pops-panel-forms-container-item");
              let formHeaderDivElement = popsDOMUtils.createElement("div", {
                className: "pops-panel-forms-container-item-header-text"
              });
              PopsSafeUtils.setSafeHTML(formHeaderDivElement, formConfig_forms["text"]);
              if (formConfig_forms.isFold) {
                PopsSafeUtils.setSafeHTML(
                  formHeaderDivElement,
`
								<p>${formConfig_forms.text}</p>
								<i class="pops-panel-forms-fold-container-icon">
									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
										<path d="M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"></path>
									</svg>
								</i>
							`
                );
                popsDOMUtils.on(formHeaderDivElement, "click", (event) => {
                  if (formContainerListElement.hasAttribute("data-fold-enable")) {
                    formContainerListElement.removeAttribute("data-fold-enable");
                  } else {
                    formContainerListElement.setAttribute("data-fold-enable", "");
                  }
                });
                popsDOMUtils.addClassName(formHeaderDivElement, "pops-panel-forms-fold-container");
                popsDOMUtils.addClassName(formHeaderDivElement, PopsCommonCSSClassName.userSelectNone);
                formContainerListElement.setAttribute("data-fold-enable", "");
                popsDOMUtils.addClassName(formHeaderDivElement, "pops-panel-forms-fold");
                formContainerListElement.appendChild(formHeaderDivElement);
              } else {
                formContainerListElement.appendChild(formHeaderDivElement);
              }
              that.setElementClassName(formContainerListElement, formItemConfig.className);
              that.setElementAttributes(formContainerListElement, formItemConfig.attributes);
              that.setElementProps(formContainerListElement, formItemConfig.props);
              childForms.forEach((childFormConfig) => {
                that.uListContainerAddItem(childFormConfig, {
                  ulElement: formContainerULElement,
                  sectionContainerULElement: that.sectionContainerULElement,
                  formContainerListElement,
                  formHeaderDivElement
                });
              });
              formContainerListElement.appendChild(formContainerULElement);
              $container.appendChild(formContainerListElement);
              if (typeof formConfig_forms.afterAddToUListCallBack === "function") {
                formConfig_forms.afterAddToUListCallBack(formConfig, {
                  target: formContainerListElement,
                  ulElement: formContainerULElement,
                  sectionContainerULElement: that.sectionContainerULElement,
                  formContainerListElement,
                  formHeaderDivElement
                });
              }
            } else {
              that.uListContainerAddItem(formConfig, {
                ulElement: that.sectionContainerULElement
              });
            }
          },
async gotoDeepMenu(event, liElement) {
            let $currentSection = liElement.closest("section.pops-panel-container");
            let $deepMenuSection = popsDOMUtils.createElement("section", {
              className: "pops-panel-container pops-panel-deepMenu-container"
            });
            Reflect.set($deepMenuSection, "__formConfig__", formConfig);
            let $deepMenuHeaderUL = popsDOMUtils.createElement("ul", {
              className: "pops-panel-container-header-ul pops-panel-deepMenu-container-header-ul"
            });
            let $deepMenuMain = popsDOMUtils.createElement("ul", {
              className: "pops-panel-container-main-ul"
            });
            let headerTitleText = formConfig.headerTitle ?? formConfig.text;
            let $header = popsDOMUtils.createElement("li", {
              className: "pops-panel-container-header-title-text pops-panel-deepMenu-container-header",
              innerHTML: (
`<p class="pops-panel-deepMenu-container-header-title-text">${headerTitleText}</p>`
              )
            });
            let $headerLeftArrow = popsDOMUtils.createElement("i", {
              className: "pops-panel-deepMenu-container-left-arrow-icon",
              innerHTML: PopsIcon.getIcon("arrowLeft")
            });
            const animOptions = {
duration: 220,
              easing: "ease-in-out"
            };
            const enterViewTransition = () => {
              popsDOMUtils.cssHide($currentSection, true);
              popsDOMUtils.on($headerLeftArrow, "click", async (event2) => {
                popsDOMUtils.preventEvent(event2);
                const leaveViewTransition = () => {
                  const $prev = $currentSection;
                  popsDOMUtils.cssShow($prev);
                  $deepMenuSection.remove();
                };
                if (that.$config.useDeepMenuSwtichAnimation && document.startViewTransition) {
                  const leaveTransition = document.startViewTransition(leaveViewTransition);
                  await leaveTransition.ready;
                  await Promise.all([
                    $deepMenuSection.animate([
                      {
transform: "translateX(0)"
                      },
                      {
transform: "translateX(100%)"
                      }
                    ], animOptions).finished,
$currentSection.animate([
                      {
transform: "translateX(-100%)"
                      },
                      {
transform: "translateX(0)"
                      }
                    ], animOptions).finished
                  ]);
                  await leaveTransition.finished;
                } else {
                  leaveViewTransition();
                }
                that.triggerRenderRightContainer($currentSection);
              }, {
                once: true
              });
              popsDOMUtils.before($header.firstElementChild, $headerLeftArrow);
              $deepMenuHeaderUL.appendChild($header);
              $deepMenuSection.appendChild($deepMenuHeaderUL);
              $deepMenuSection.appendChild($deepMenuMain);
              if (formConfig.forms && Array.isArray(formConfig.forms)) {
                for (let index = 0; index < formConfig.forms.length; index++) {
                  let formItemConfig = formConfig.forms[index];
                  this.initFormItem($deepMenuMain, formItemConfig);
                }
              }
              that.$el.$sectionWrapper.appendChild($deepMenuSection);
            };
            if (that.$config.useDeepMenuSwtichAnimation && document.startViewTransition) {
              const transition = document.startViewTransition(enterViewTransition);
              await transition.ready;
              await $deepMenuSection.animate([
                {
transform: "translateX(100%)"
                },
                {
transform: "translateX(0)"
                }
              ], animOptions).finished;
              await transition.finished;
            } else {
              enterViewTransition();
            }
            if (typeof formConfig.afterEnterDeepMenuCallBack === "function") {
              formConfig.afterEnterDeepMenuCallBack(formConfig, {
                sectionContainer: $deepMenuSection,
                sectionContainerHeaderContainer: $deepMenuHeaderUL,
                sectionContainerHeader: $header,
                sectionBodyContainer: $deepMenuMain
              });
            }
            that.triggerRenderRightContainer($deepMenuSection);
          },
setLiClickEvent() {
            popsDOMUtils.on($li, "click", void 0, async (event) => {
              if (typeof formConfig.clickCallBack === "function") {
                let result = await formConfig.clickCallBack(event, formConfig);
                if (result) {
                  return;
                }
              }
              await this.gotoDeepMenu(event, $li);
            });
          }
        };
        PopsPanelDeepMenu.init();
        Reflect.set($li, "data-deepMenu", PopsPanelDeepMenu);
        return $li;
      },
createSectionContainerItem_own(formConfig) {
        let $li = document.createElement("li");
        Reflect.set($li, "__formConfig__", formConfig);
        if (formConfig.className) {
          $li.className = formConfig.className;
        }
        $li = formConfig.getLiElementCallBack($li);
        return $li;
      },
createSectionContainerItem(formConfig) {
        let formType = formConfig.type;
        if (formType === "switch") {
          return this.createSectionContainerItem_switch(formConfig);
        } else if (formType === "slider") {
          return this.createSectionContainerItem_slider_new(formConfig);
        } else if (formType === "input") {
          return this.createSectionContainerItem_input(formConfig);
        } else if (formType === "textarea") {
          return this.createSectionContainerItem_textarea(formConfig);
        } else if (formType === "select") {
          return this.createSectionContainerItem_select(formConfig);
        } else if (formType === "select-multiple") {
          return this.createSectionContainerItem_select_multiple_new(formConfig);
        } else if (formType === "button") {
          return this.createSectionContainerItem_button(formConfig);
        } else if (formType === "deepMenu") {
          return this.createSectionContainerItem_deepMenu(formConfig);
        } else if (formType === "own") {
          return this.createSectionContainerItem_own(formConfig);
        } else {
          console.error("尚未实现的type类型", formConfig);
        }
      },
createSectionContainerItem_forms(formConfig) {
        let that = this;
        let formConfig_forms = formConfig;
        if (formConfig_forms.type === "forms") {
          let childForms = formConfig["forms"];
          let formContainerListElement = document.createElement("li");
          let formContainerULElement = document.createElement("ul");
          formContainerListElement.classList.add("pops-panel-forms-container-item");
          formContainerULElement.classList.add("pops-panel-forms-container-item-formlist");
          let formHeaderDivElement = popsDOMUtils.createElement("div", {
            className: "pops-panel-forms-container-item-header-text"
          });
          PopsSafeUtils.setSafeHTML(formHeaderDivElement, formConfig_forms["text"]);
          if (formConfig_forms.isFold) {
            PopsSafeUtils.setSafeHTML(
              formHeaderDivElement,
`
						<p>${formConfig_forms.text}</p>
						<i class="pops-panel-forms-fold-container-icon">
							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
								<path d="M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"></path>
							</svg>
						</i>
					`
            );
            popsDOMUtils.on(formHeaderDivElement, "click", (event) => {
              if (formContainerListElement.hasAttribute("data-fold-enable")) {
                formContainerListElement.removeAttribute("data-fold-enable");
              } else {
                formContainerListElement.setAttribute("data-fold-enable", "");
              }
            });
            popsDOMUtils.addClassName(formHeaderDivElement, "pops-panel-forms-fold-container");
            popsDOMUtils.addClassName(formHeaderDivElement, PopsCommonCSSClassName.userSelectNone);
            formContainerListElement.setAttribute("data-fold-enable", "");
            popsDOMUtils.addClassName(formContainerListElement, "pops-panel-forms-fold");
            formContainerListElement.appendChild(formHeaderDivElement);
          } else {
            formContainerListElement.appendChild(formHeaderDivElement);
          }
          that.setElementClassName(formContainerListElement, formConfig.className);
          that.setElementAttributes(formContainerListElement, formConfig.attributes);
          that.setElementProps(formContainerListElement, formConfig.props);
          childForms.forEach((childFormConfig) => {
            that.uListContainerAddItem(childFormConfig, {
              ulElement: formContainerULElement,
              sectionContainerULElement: that.sectionContainerULElement,
              formContainerListElement,
              formHeaderDivElement
            });
          });
          formContainerListElement.appendChild(formContainerULElement);
          that.sectionContainerULElement.appendChild(formContainerListElement);
          if (typeof formConfig_forms.afterAddToUListCallBack === "function") {
            formConfig_forms.afterAddToUListCallBack(formConfig_forms, {
              target: formContainerListElement,
              ulElement: formContainerULElement,
              sectionContainerULElement: that.sectionContainerULElement,
              formContainerListElement,
              formHeaderDivElement
            });
          }
        } else {
          that.uListContainerAddItem(formConfig, {
            ulElement: that.sectionContainerULElement
          });
        }
      },
triggerRenderRightContainer($container) {
        let __formConfig__ = Reflect.get($container, "__formConfig__");
        this.$el.$pops.dispatchEvent(new CustomEvent("pops:renderRightContainer", {
          detail: {
            formConfig: __formConfig__
          }
        }));
      },
uListContainerAddItem(formConfig, containerOptions) {
        let itemLiElement = this.createSectionContainerItem(formConfig);
        if (itemLiElement) {
          containerOptions["ulElement"].appendChild(itemLiElement);
        }
        if (typeof formConfig.afterAddToUListCallBack === "function") {
          formConfig.afterAddToUListCallBack(formConfig, {
            ...containerOptions,
            target: itemLiElement
          });
        }
      },
setAsideItemClickEvent(asideLiElement, asideConfig) {
        popsDOMUtils.on(asideLiElement, "click", async (event) => {
          if (typeof asideConfig.clickFirstCallback === "function") {
            let clickFirstCallbackResult = await asideConfig.clickFirstCallback(event, this.sectionContainerHeaderULElement, this.sectionContainerULElement);
            if (typeof clickFirstCallbackResult === "boolean" && !clickFirstCallbackResult) {
              return;
            }
          }
          this.clearContainer();
          let rightContainerFormConfig = Reflect.get(asideLiElement, "__forms__");
          Reflect.set(this.$el.$contentSectionContainer, "__formConfig__", rightContainerFormConfig);
          popsDOMUtils.cssShow(this.$el.$contentSectionContainer);
          this.clearAsideItemIsVisited();
          this.setAsideItemIsVisited(asideLiElement);
          let title = typeof asideConfig.title === "function" ? asideConfig.title() : asideConfig.title;
          let headerTitleText = typeof asideConfig.headerTitle === "function" ? asideConfig.headerTitle() : asideConfig.headerTitle;
          headerTitleText = headerTitleText ?? title;
          if (typeof headerTitleText === "string" && headerTitleText.trim() !== "") {
            let $containerHeaderTitle = document.createElement("li");
            $containerHeaderTitle.classList.add("pops-panel-container-header-title-text");
            Reflect.set($containerHeaderTitle, "__asideConfig__", asideConfig);
            PopsSafeUtils.setSafeHTML($containerHeaderTitle, headerTitleText);
            this.sectionContainerHeaderULElement.appendChild($containerHeaderTitle);
          }
          rightContainerFormConfig.forEach((formConfig) => {
            this.createSectionContainerItem_forms(formConfig);
          });
          if (typeof asideConfig.clickCallback === "function") {
            let asideClickCallbackResult = await asideConfig.clickCallback(event, this.sectionContainerHeaderULElement, this.sectionContainerULElement);
            if (typeof asideClickCallbackResult === "boolean" && !asideClickCallbackResult) {
              return;
            }
          }
          this.triggerRenderRightContainer(this.$el.$contentSectionContainer);
        });
      }
    };
  };
  const PopsPanel = {
    init(details) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "panel";
      let config = PopsPanelConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      if (details && Array.isArray(details.content)) {
        config.content = details.content;
      }
      config = PopsHandler.handleOnly(popsType, config);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar
        },
        {
          name: "button",
          css: PopsCSS.button
        },
        {
          name: "anim",
          css: PopsCSS.anim
        },
        {
          name: "common",
          css: PopsCSS.common
        },
        {
          name: "panelCSS",
          css: PopsCSS.panelCSS
        }
      ]);
      let zIndex = PopsHandler.handleZIndex(config.zIndex);
      let maskHTML = PopsElementHandler.createMask(guid, zIndex);
      let headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      let { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      let animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
`
			<div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" class="pops-${popsType}-title-text" style="${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>
			<div class="pops-content pops-${popsType}-content">
				<aside class="pops-${popsType}-aside">
					<ul class="pops-${popsType}-aside-top-container"></ul>
					<ul class="pops-${popsType}-aside-bottom-container"></ul>
				</aside>
				<div class="pops-${popsType}-section-wrapper">
					<section class="pops-${popsType}-container">
						<ul class="pops-${popsType}-container-header-ul"></ul>
						<ul class="pops-${popsType}-container-main-ul"></ul>
					</section>
				</div>
			</div>`,
        "",
        zIndex
      );
      let $anim = PopsElementHandler.parseElement(animHTML);
      let { popsElement: $pops, headerCloseBtnElement: $headerCloseBtn, titleElement: $title, contentElement: $content, panelSectionWrapper: $panelSectionWrapper, contentAsideElement: $contentAside, contentSectionContainerElement: $contentSectionContainer } = PopsHandler.handleQueryElement($anim, popsType);
      if (config.isMobile || popsUtils.isPhone()) {
        popsDOMUtils.addClassName($pops, config.mobileClassName);
      }
      let $mask = null;
      let isCreatedElementList = [$anim];
      if (config.mask.enable) {
        let { maskElement } = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML
        });
        $mask = maskElement;
        isCreatedElementList.push($mask);
      }
      let eventDetails = PopsHandler.handleEventDetails(guid, $shadowContainer, $shadowRoot, popsType, $anim, $pops, $mask, config);
      PopsHandler.handleClickEvent("close", $headerCloseBtn, eventDetails, config.btn.close.callback);
      popsDOMUtils.append($shadowRoot, isCreatedElementList);
      if (typeof config.beforeAppendToPageCallBack === "function") {
        config.beforeAppendToPageCallBack($shadowRoot, $shadowContainer);
      }
      popsDOMUtils.appendBody($shadowContainer);
      if ($mask != null) {
        $anim.after($mask);
      }
      let panelHandlerComponents = PanelHandlerComponents();
      panelHandlerComponents.init({
        config,
        $el: {
          $pops,
          $content,
          $sectionWrapper: $panelSectionWrapper,
          $contentAside,
          $contentSectionContainer
        }
      });
      PopsHandler.handlePush(popsType, {
        guid,
        animElement: $anim,
        popsElement: $pops,
        maskElement: $mask,
        $shadowContainer,
        $shadowRoot
      });
      if (config.drag) {
        PopsInstanceUtils.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack
        });
      }
      let result = PopsHandler.handleResultDetails(eventDetails);
      return {
        ...result,
        addEventListener: (event, listener, options) => {
          $pops.addEventListener(event, listener, options);
        },
        removeEventListener: (event, listener, options) => {
          $pops.removeEventListener(event, listener, options);
        }
      };
    }
  };
  const PopsPromptConfig = () => {
    return {
      title: {
        text: "默认标题",
        position: "left",
        html: false,
        style: ""
      },
      content: {
        text: "",
        select: false,
        password: false,
        row: false,
        focus: true,
        placeholder: "默认提示",
        style: ""
      },
      btn: {
        merge: false,
        mergeReverse: false,
        reverse: false,
        position: "flex-end",
        ok: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "确定",
          type: "success",
          callback(detail) {
            detail.close();
          }
        },
        cancel: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "关闭",
          type: "default",
          callback(detail) {
            detail.close();
          }
        },
        other: {
          enable: false,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "其它按钮",
          type: "default",
          callback(detail) {
            detail.close();
          }
        },
        close: {
          enable: true,
          callback(detail) {
            detail.close();
          }
        }
      },
      useShadowRoot: true,
      class: "",
      only: false,
      width: window.innerWidth < 550 ? "88vw" : "350px",
      height: window.innerHeight < 450 ? "70vh" : "200px",
      position: "center",
      animation: "pops-anim-fadein-zoom",
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false
        },
        clickCallBack: null
      },
      drag: false,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {
      },
      dragEndCallBack() {
      },
      forbiddenScroll: false,
      style: null,
      beforeAppendToPageCallBack() {
      }
    };
  };
  const PopsPrompt = {
    init(details) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "prompt";
      let config = PopsPromptConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      config = PopsHandler.handleOnly(popsType, config);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar
        },
        {
          name: "button",
          css: PopsCSS.button
        },
        {
          name: "anim",
          css: PopsCSS.anim
        },
        {
          name: "common",
          css: PopsCSS.common
        },
        {
          name: "promptCSS",
          css: PopsCSS.promptCSS
        }
      ]);
      let zIndex = PopsHandler.handleZIndex(config.zIndex);
      let maskHTML = PopsElementHandler.createMask(guid, zIndex);
      let headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      let bottomBtnHTML = PopsElementHandler.createBottom(popsType, config);
      let { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      let { contentPStyle } = PopsElementHandler.createContentStyle(popsType, config);
      let animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
`
            <div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" style="${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>
            <div class="pops-content pops-${popsType}-content" style="${contentPStyle}">${config.content.row ? '<textarea name="pops-input-text" pops="" placeholder="' + config.content.placeholder + '"></textarea>' : '<input name="pops-input-text" pops="" placeholder="' + config.content.placeholder + '" type="' + (config.content.password ? "password" : "text") + '">'}</div>${bottomBtnHTML}`,
        bottomBtnHTML,
        zIndex
      );
      let $anim = PopsElementHandler.parseElement(animHTML);
      let { popsElement: $pops, inputElement: $input, headerCloseBtnElement: $btnClose, btnOkElement: $btnOk, btnCancelElement: $btnCancel, btnOtherElement: $btnOther, titleElement: $title } = PopsHandler.handleQueryElement($anim, popsType);
      let $mask = null;
      let elementList = [$anim];
      if (config.mask.enable) {
        let _handleMask_ = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML
        });
        $mask = _handleMask_.maskElement;
        elementList.push($mask);
      }
      let eventDetails = PopsHandler.handleEventDetails(guid, $shadowContainer, $shadowRoot, popsType, $anim, $pops, $mask, config);
      $input.value = config.content.text;
      PopsHandler.handlePromptClickEvent("close", $input, $btnClose, eventDetails, config.btn.close.callback);
      PopsHandler.handlePromptClickEvent("ok", $input, $btnOk, eventDetails, config.btn.ok.callback);
      PopsHandler.handlePromptClickEvent("cancel", $input, $btnCancel, eventDetails, config.btn.cancel.callback);
      PopsHandler.handlePromptClickEvent("other", $input, $btnOther, eventDetails, config.btn.other.callback);
      popsDOMUtils.append($shadowRoot, elementList);
      if (typeof config.beforeAppendToPageCallBack === "function") {
        config.beforeAppendToPageCallBack($shadowRoot, $shadowContainer);
      }
      popsDOMUtils.appendBody($shadowContainer);
      if ($mask != null) {
        $anim.after($mask);
      }
      PopsHandler.handlePush(popsType, {
        guid,
        animElement: $anim,
        popsElement: $pops,
        maskElement: $mask,
        $shadowContainer,
        $shadowRoot
      });
      if (config.drag) {
        PopsInstanceUtils.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack
        });
      }
      if (config.content.focus) {
        $input.focus();
      }
      if (config.content.select) {
        $input.select();
      }
      let result = PopsHandler.handleResultDetails(eventDetails);
      return result;
    }
  };
  const rightClickMenuConfig = () => {
    return {
      target: document.documentElement,
      targetSelector: null,
      data: [
        {
          icon: PopsIcon.getIcon("search"),
          iconIsLoading: false,
          text: "搜索",
          item: [],
          callback(clickEvent, contextMenuEvent, liElement) {
            console.log("点击:" + this.text, [clickEvent, contextMenuEvent, liElement]);
          }
        },
        {
          icon: PopsIcon.getIcon("documentCopy"),
          iconIsLoading: false,
          text: "复制",
          item: [],
          callback(clickEvent, contextMenuEvent, liElement) {
            console.log("点击:" + this.text, [clickEvent, contextMenuEvent, liElement]);
          }
        },
        {
          icon: PopsIcon.getIcon("delete"),
          text: "删除",
          iconIsLoading: false,
          item: [],
          callback(clickEvent, contextMenuEvent, liElement) {
            console.log("点击:" + this.text, [clickEvent, contextMenuEvent, liElement]);
          }
        },
        {
          icon: PopsIcon.getIcon("loading"),
          iconIsLoading: true,
          text: "加载",
          item: [],
          callback(clickEvent, contextMenuEvent, liElement) {
            console.log("点击:" + this.text, [clickEvent, contextMenuEvent, liElement]);
            return false;
          }
        },
        {
          icon: PopsIcon.getIcon("elemePlus"),
          iconIsLoading: true,
          text: "饿了么",
          callback(clickEvent, contextMenuEvent, liElement) {
            console.log("点击:" + this.text, [clickEvent, contextMenuEvent, liElement]);
            return false;
          },
          item: [
            {
              icon: "",
              iconIsLoading: false,
              text: "处理文件",
              item: [],
              callback(clickEvent, contextMenuEvent, liElement) {
                console.log("点击:" + this.text, [clickEvent, contextMenuEvent, liElement]);
              }
            },
            {
              icon: "",
              iconIsLoading: false,
              text: "其它处理",
              callback(clickEvent, contextMenuEvent, liElement) {
                console.log("点击:" + this.text, [clickEvent, contextMenuEvent, liElement]);
              },
              item: [
                {
                  icon: PopsIcon.getIcon("view"),
                  iconIsLoading: false,
                  text: "查看",
                  item: [],
                  callback(clickEvent, contextMenuEvent, liElement) {
                    console.log("点击:" + this.text, [clickEvent, contextMenuEvent, liElement]);
                  }
                }
              ]
            }
          ]
        }
      ],
      chileMenuLeftOrRightDistance: 0,
      childMenuTopOrBottomDistance: 0,
      useShadowRoot: true,
      className: "",
      isAnimation: false,
      useScaleAnimation: true,
      only: false,
      zIndex: 1e4,
      preventDefault: true,
      style: null,
      beforeAppendToPageCallBack() {
      }
    };
  };
  const PopsRightClickMenu = {
    init(details) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "rightClickMenu";
      let config = rightClickMenuConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      config = PopsHandler.handleOnly(popsType, config);
      if (config.target == null) {
        throw new Error("config.target 不能为空");
      }
      if (details.data) {
        config.data = details.data;
      }
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index
        },
        {
          name: "anim",
          css: PopsCSS.anim
        },
        {
          name: "common",
          css: PopsCSS.common
        },
        {
          name: "rightClickMenu",
          css: PopsCSS.rightClickMenu
        }
      ]);
      if (config.style != null) {
        let cssNode = popsDOMUtils.createElement("style", {
          innerHTML: config.style
        }, {
          type: "text/css"
        });
        $shadowRoot.appendChild(cssNode);
      }
      const PopsContextMenu = {
rootElement: null,
windowCheckClickEvent(event) {
          if (!PopsContextMenu.rootElement) {
            return;
          }
          let $click = event.target;
          if ($click.closest(`.pops-${popsType}`)) {
            return;
          }
          if ($click.className && $click.className === "pops-shadow-container" && $click.shadowRoot != null) {
            return;
          }
          PopsContextMenu.closeAllMenu(PopsContextMenu.rootElement);
        },
shadowRootCheckClickEvent(event) {
          if (!PopsContextMenu.rootElement) {
            return;
          }
          let $click = event.target;
          if ($click.closest(`.pops-${popsType}`)) {
            return;
          }
          PopsContextMenu.closeAllMenu(PopsContextMenu.rootElement);
        },
addWindowCheckClickListener() {
          popsDOMUtils.on(globalThis, "click touchstart", void 0, PopsContextMenu.windowCheckClickEvent, {
            capture: true
          });
          if (config.target instanceof Node) {
            const $shadowRoot2 = config.target.getRootNode();
            if ($shadowRoot2 instanceof ShadowRoot) {
              popsDOMUtils.on($shadowRoot2, "click touchstart", void 0, PopsContextMenu.shadowRootCheckClickEvent, {
                capture: true
              });
            }
          }
        },
removeWindowCheckClickListener() {
          popsDOMUtils.off(globalThis, "click touchstart", void 0, PopsContextMenu.windowCheckClickEvent, {
            capture: true
          });
          if (config.target instanceof Node) {
            const $shadowRoot2 = config.target.getRootNode();
            if ($shadowRoot2 instanceof ShadowRoot) {
              popsDOMUtils.off($shadowRoot2, "click touchstart", void 0, PopsContextMenu.windowCheckClickEvent, {
                capture: true
              });
            }
          }
        },
contextMenuEvent(event, selectorTarget) {
          if (config.preventDefault) {
            popsDOMUtils.preventEvent(event);
          }
          PopsHandler.handleOnly(popsType, config);
          if (PopsContextMenu.rootElement) {
            PopsContextMenu.closeAllMenu(PopsContextMenu.rootElement);
          }
          let rootElement = PopsContextMenu.showMenu(event, config.data, selectorTarget);
          PopsContextMenu.rootElement = rootElement;
          if (config.only) {
            PopsHandler.handlePush(popsType, {
              $shadowRoot,
              $shadowContainer,
              guid,
              animElement: rootElement,
              popsElement: rootElement,
              beforeRemoveCallBack(instCommonConfig) {
                PopsContextMenu.closeAllMenu(instCommonConfig.popsElement);
              }
            });
          }
        },
addContextMenuEvent(target, selector) {
          popsDOMUtils.on(target, "contextmenu", selector, PopsContextMenu.contextMenuEvent);
        },
removeContextMenuEvent(target, selector) {
          popsDOMUtils.off(target, "contextmenu", selector, PopsContextMenu.contextMenuEvent);
        },
animationCloseMenu($menu) {
          let transitionEndEvent = (event) => {
            popsDOMUtils.off($menu, popsDOMUtils.getTransitionEndNameList(), transitionEndEvent, {
              capture: true
            });
            $menu.remove();
          };
          popsDOMUtils.containsClassName;
          if (popsDOMUtils.containsClassName($menu, `pops-${popsType}-anim-show`)) {
            popsDOMUtils.on($menu, popsDOMUtils.getTransitionEndNameList(), transitionEndEvent, {
              capture: true
            });
            popsDOMUtils.removeClassName($menu, `pops-${popsType}-anim-show`);
          } else if (popsDOMUtils.containsClassName($menu, `pops-${popsType}-anim-scale`) && popsDOMUtils.containsClassName($menu, `pops-${popsType}-anim-scale-open`)) {
            popsDOMUtils.on($menu, popsDOMUtils.getTransitionEndNameList(), transitionEndEvent, {
              capture: true
            });
            popsDOMUtils.removeClassName($menu, `pops-${popsType}-anim-scale-open`);
            popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-scale-not-open`);
          } else {
            $menu.remove();
          }
        },
closeAllMenu(rootElement) {
          if (rootElement == null) {
            return;
          }
          const rootElementMenuData = Reflect.get(rootElement, "__menuData__");
          if (rootElementMenuData?.root) {
            rootElement = rootElementMenuData.root;
          }
          let childMenuList = rootElementMenuData.child;
          childMenuList.forEach((childMenuElement) => {
            this.animationCloseMenu(childMenuElement);
          });
          this.animationCloseMenu(rootElement);
          PopsContextMenu.rootElement = null;
        },
createMenuContainerElement(isChildren) {
          let $menu = popsDOMUtils.createElement("div", {
            className: `pops-${popsType}`,
            innerHTML: (
`<ul class="pops-${popsType}-wrapper"></ul>`
            )
          });
          let zIndex = this.getMenuZIndex();
          if (zIndex > 1e4) {
            $menu.style.zIndex = zIndex.toString();
          }
          if (isChildren) {
            $menu.setAttribute("is-children", "true");
          }
          if (config.isAnimation) {
            popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-grid`);
          }
          if (config.useScaleAnimation) {
            popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-scale`);
            popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-scale-not-open`);
          }
          return $menu;
        },
getMenuZIndex() {
          return PopsHandler.handleZIndex(config.zIndex);
        },
getOffset(menuElement, mousePosition, parentInfo) {
          let result = {
            top: 0,
            right: 0,
            bottom: 0,
            left: 0
          };
          let menuElementWidth = popsDOMUtils.width(menuElement);
          let menuElementHeight = popsDOMUtils.height(menuElement);
          let limitDistance = 1;
          let maxPageLeftOffset = popsDOMUtils.width(globalThis) - limitDistance;
          let maxPageTopOffset = popsDOMUtils.height(globalThis) - limitDistance;
          let maxLeftOffset = maxPageLeftOffset - menuElementWidth;
          let maxTopOffset = maxPageTopOffset - menuElementHeight;
          let chileMenuLeftOrRightDistance = config.chileMenuLeftOrRightDistance;
          let childMenuTopOrBottomDistance = config.childMenuTopOrBottomDistance;
          let currentLeftOffset = mousePosition.x;
          let currentTopOffset = mousePosition.y;
          currentLeftOffset = currentLeftOffset < 0 ? 0 : currentLeftOffset;
          if (currentLeftOffset + chileMenuLeftOrRightDistance >= maxLeftOffset) {
            if (parentInfo) {
              let mainMenuOffset = popsDOMUtils.offset(parentInfo.$menu);
              currentLeftOffset = maxPageLeftOffset - mainMenuOffset.left - chileMenuLeftOrRightDistance + limitDistance;
            } else {
              currentLeftOffset = limitDistance + chileMenuLeftOrRightDistance;
            }
            if (currentLeftOffset < 0) {
              currentLeftOffset = 0;
            } else if (currentLeftOffset > maxLeftOffset) {
              currentLeftOffset = maxLeftOffset;
            }
            result.right = currentLeftOffset;
            Reflect.deleteProperty(result, "left");
          } else {
            currentLeftOffset = currentLeftOffset + chileMenuLeftOrRightDistance;
            result.left = currentLeftOffset;
            Reflect.deleteProperty(result, "right");
          }
          currentTopOffset = currentTopOffset < 0 ? 0 : currentTopOffset;
          if (currentTopOffset + childMenuTopOrBottomDistance >= maxTopOffset) {
            if (parentInfo) {
              let parentItemOffset = popsDOMUtils.offset(parentInfo.$parentItem, false);
              currentTopOffset = maxPageTopOffset - parentItemOffset.bottom - childMenuTopOrBottomDistance + limitDistance;
            } else {
              currentTopOffset = limitDistance + childMenuTopOrBottomDistance;
            }
            if (currentTopOffset < 0) {
              currentTopOffset = limitDistance;
            } else if (currentTopOffset > maxTopOffset) {
              currentTopOffset = maxTopOffset;
            }
            result.bottom = currentTopOffset;
            Reflect.deleteProperty(result, "top");
          } else {
            currentTopOffset = currentTopOffset + childMenuTopOrBottomDistance;
            result.top = currentTopOffset;
            Reflect.deleteProperty(result, "bottom");
          }
          return result;
        },
showMenu(menuEvent, _config_, menuListenerRootNode) {
          let menuElement = this.createMenuContainerElement(false);
          Reflect.set(menuElement, "__menuData__", {
            child: []
          });
          PopsContextMenu.addMenuLiELement(menuEvent, menuElement, menuElement, _config_, menuListenerRootNode);
          popsDOMUtils.append($shadowRoot, menuElement);
          if (!document.contains($shadowContainer)) {
            if (typeof config.beforeAppendToPageCallBack === "function") {
              config.beforeAppendToPageCallBack($shadowRoot, $shadowContainer);
            }
            popsDOMUtils.appendBody($shadowContainer);
          }
          this.handlerShowMenuCSS(menuElement, menuEvent);
          return menuElement;
        },
showClildMenu(menuEvent, posInfo, _config_, rootElement, targetLiElement, menuListenerRootNode) {
          let menuElement = this.createMenuContainerElement(true);
          Reflect.set(menuElement, "__menuData__", {
            parent: targetLiElement,
            root: rootElement
          });
          let rootElementMenuData = Reflect.get(rootElement, "__menuData__");
          rootElementMenuData.child.push(menuElement);
          PopsContextMenu.addMenuLiELement(menuEvent, rootElement, menuElement, _config_, menuListenerRootNode);
          popsDOMUtils.append($shadowRoot, menuElement);
          let $parentMenu = targetLiElement.closest(".pops-rightClickMenu");
          this.handlerShowMenuCSS(menuElement, posInfo, {
            $menu: $parentMenu,
            $parentItem: targetLiElement
          });
          return menuElement;
        },
handlerShowMenuCSS($menu, posInfo, parentInfo) {
          let offset = this.getOffset($menu, {
            x: posInfo.clientX,
            y: posInfo.clientY
          }, parentInfo);
          popsDOMUtils.css($menu, {
            ...offset
          });
          if (config.isAnimation) {
            popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-show`);
          }
          if (config.useScaleAnimation) {
            popsDOMUtils.removeClassName($menu, `pops-${popsType}-anim-scale-not-open`);
            popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-scale-open`);
          }
        },
addMenuLiELement(menuEvent, rootElement, menuElement, _config_, menuListenerRootNode) {
          let menuEventTarget = menuEvent.target;
          let menuULElement = menuElement.querySelector("ul");
          _config_.forEach((item) => {
            let menuLiElement = popsDOMUtils.parseTextToDOM(`<li></li>`);
            if (typeof item.icon === "string" && item.icon.trim() !== "") {
              let iconSVGHTML = PopsIcon.getIcon(item.icon) ?? item.icon;
              let iconElement = popsDOMUtils.parseTextToDOM(
`<i class="pops-${popsType}-icon" is-loading="${item.iconIsLoading ?? false}">${iconSVGHTML}</i>`
              );
              menuLiElement.appendChild(iconElement);
            }
            menuLiElement.insertAdjacentHTML("beforeend", PopsSafeUtils.getSafeHTML(`<span>${item.text}</span>`));
            if (item.item && Array.isArray(item.item)) {
              popsDOMUtils.addClassName(menuLiElement, `pops-${popsType}-item`);
            }
            let isTriggerTouchEvent = false;
            function liElementHoverEvent(event) {
              if (event.type === "touchstart") {
                isTriggerTouchEvent = true;
              }
              if (isTriggerTouchEvent && event.type === "mouseenter") {
                return;
              }
              Array.from(menuULElement.children).forEach((liElement) => {
                popsDOMUtils.removeClassName(liElement, `pops-${popsType}-is-visited`);
                let li_menuData = Reflect.get(liElement, "__menuData__");
                if (!li_menuData) {
                  return;
                }
                function removeElement(element) {
                  element.querySelectorAll("ul li").forEach(($ele) => {
                    let menuData = Reflect.get($ele, "__menuData__");
                    if (menuData?.child) {
                      removeElement(menuData.child);
                    }
                  });
                  element.remove();
                }
                removeElement(li_menuData.child);
              });
              let root_menuData = Reflect.get(rootElement, "__menuData__");
              for (let index = 0; index < root_menuData.child.length; index++) {
                let element = root_menuData.child[index];
                if (!$shadowRoot.contains(element)) {
                  root_menuData.child.splice(index, 1);
                  index--;
                }
              }
              popsDOMUtils.addClassName(menuLiElement, `pops-${popsType}-is-visited`);
              if (!item.item) {
                return;
              }
              let rect = menuLiElement.getBoundingClientRect();
              let childMenu = PopsContextMenu.showClildMenu(menuEvent, {
                clientX: rect.left + popsDOMUtils.outerWidth(menuLiElement),
                clientY: rect.top
              }, item.item, rootElement, menuLiElement, menuListenerRootNode);
              Reflect.set(menuLiElement, "__menuData__", {
                child: childMenu
              });
            }
            async function liElementClickEvent(clickEvent) {
              if (typeof item.callback === "function") {
                try {
                  OriginPrototype.Object.defineProperty(menuEvent, "target", {
                    get() {
                      return menuEventTarget;
                    }
                  });
                } catch (error) {
                }
                let callbackResult = await item.callback(clickEvent, menuEvent, menuLiElement, menuListenerRootNode);
                if (typeof callbackResult === "boolean" && callbackResult == false) {
                  return;
                }
              }
              Array.from(menuULElement.children).forEach((liEle) => {
                popsDOMUtils.off(liEle, "mouseenter touchstart");
              });
              PopsContextMenu.closeAllMenu(rootElement);
            }
            popsDOMUtils.on(menuLiElement, "mouseenter touchstart", liElementHoverEvent);
            popsDOMUtils.on(menuLiElement, "click", liElementClickEvent);
            menuULElement.appendChild(menuLiElement);
          });
        }
      };
      PopsContextMenu.addContextMenuEvent(config.target, config.targetSelector);
      PopsContextMenu.addWindowCheckClickListener();
      return {
        guid,
        config,
        removeWindowCheckClickListener: PopsContextMenu.removeWindowCheckClickListener,
        addWindowCheckClickListener: PopsContextMenu.addWindowCheckClickListener,
        removeContextMenuEvent: PopsContextMenu.removeContextMenuEvent,
        addContextMenuEvent: PopsContextMenu.addContextMenuEvent
      };
    }
  };
  const searchSuggestionConfig = () => {
    const data = [];
    for (let index = 0; index < 10; index++) {
      data.push({
        value: `测试${index}`,
        enableDeleteButton: true,
        deleteButtonClickCallback(event, $dataItem, dataItem, config) {
          console.log("删除当前项", [event, $dataItem, dataItem, config]);
          return true;
        },
        itemView(dateItem, $parent) {
          return `测试${index}-html`;
        },
        clickCallback(event, $dataItem, dataItem, config) {
          console.log("item项的点击回调", [event, $dataItem, data, config]);
          return index % 2 === 0 ? true : false;
        },
        selectCallback(event, $dataItem, dataItem, config) {
          console.log("item项的选中回调", [event, $dataItem, data, config]);
        }
      });
    }
    return {
target: null,
inputTarget: null,
      selfDocument: document,
      data,
      useShadowRoot: true,
      className: "",
      isAbsolute: true,
      isAnimation: false,
      useFoldAnimation: true,
      useArrow: false,
      width: "250px",
      maxHeight: "300px",
      followTargetWidth: true,
      topDistance: 0,
      position: "auto",
      positionTopToReverse: true,
      zIndex: 1e4,
      searchingTip: "正在搜索中...",
      toSearhNotResultHTML: '<li data-none="true">暂无其它数据</li>',
      toHideWithNotResult: false,
      followPosition: "target",
      async inputTargetChangeRefreshShowDataCallback(value, data2) {
        console.log("当前输入框的值是:", value);
        return data2.filter((it) => it.value.includes(value));
      },
      style: ""
    };
  };
  const PopsSearchSuggestion = {
    init(details) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "searchSuggestion";
      let config = searchSuggestionConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, details);
      if (config.target == null) {
        throw new Error("config.target 不能为空");
      }
      if (config.inputTarget == null) {
        config.inputTarget = config.target;
      }
      if (details.data) {
        config.data = details.data;
      }
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index
        },
        {
          name: "anim",
          css: PopsCSS.anim
        },
        {
          name: "common",
          css: PopsCSS.common
        }
      ]);
      if (config.style != null) {
        let cssNode = document.createElement("style");
        popsDOMUtils.createElement("style", {
          innerHTML: config.style
        }, {
          type: "text/css"
        });
        $shadowRoot.appendChild(cssNode);
      }
      const SearchSuggestion = {
selfDocument: config.selfDocument,
        $el: {
root: null,
$hintULContainer: null,
$dynamicCSS: null
        },
        $evt: {
          offInputChangeEvtHandler: []
        },
        $data: {
isEmpty: true
        },
init(parentElement = document.body || document.documentElement) {
          SearchSuggestion.initEl();
          SearchSuggestion.update(SearchSuggestion.getData());
          SearchSuggestion.updateStyleSheet();
          SearchSuggestion.hide();
          $shadowRoot.appendChild(SearchSuggestion.$el.root);
          parentElement.appendChild($shadowContainer);
        },
initEl() {
          SearchSuggestion.$el.root = SearchSuggestion.createSearchSelectElement();
          Reflect.set(SearchSuggestion.$el.root, "data-SearchSuggestion", SearchSuggestion);
          SearchSuggestion.$el.$dynamicCSS = SearchSuggestion.$el.root.querySelector("style[data-dynamic]");
          SearchSuggestion.$el.$hintULContainer = SearchSuggestion.$el.root.querySelector("ul");
        },
getData() {
          return typeof config.data === "function" ? config.data() : config.data;
        },
setData(data) {
          config.data = data;
        },
createSearchSelectElement() {
          let $el = popsDOMUtils.createElement("div", {
            className: `pops pops-${popsType}-search-suggestion`,
            innerHTML: (
`
						<style type="text/css">
							.pops-${popsType}-animation{
								-moz-animation: searchSelectFalIn 0.5s 1 linear;
								-webkit-animation: searchSelectFalIn 0.5s 1 linear;
								-o-animation: searchSelectFalIn 0.5s 1 linear;
								-ms-animation: searchSelectFalIn 0.5s 1 linear;
							}
						</style>
						<style type="text/css">
							.pops-${popsType}-search-suggestion-arrow{
								--suggestion-arrow-box-shadow-left-color: rgba(0, 0, 0, 0.24);
								--suggestion-arrow-box-shadow-right-color: rgba(0, 0, 0, 0.12);
								--suggestion-arrow--after-color: rgb(78, 78, 78);
								--suggestion-arrow--after-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));
								--suggestion-arrow--after-width: 10px;
								--suggestion-arrow--after-height: 10px;
							}
							.pops-${popsType}-search-suggestion-arrow{
								position: absolute;
								top: 100%;
								left: 50%;
								overflow: hidden;
								width: 100%;
								height: 12.5px;
								transform: translateX(-50%);
							}
							.pops-${popsType}-search-suggestion-arrow::after{
								position: absolute;
								top: 0;
								left: 50%;
								width: var(--suggestion-arrow--after-width);
								height: var(--suggestion-arrow--after-height);
								background: var(--suggestion-arrow--after-bg-color);
								color: var(--suggestion-arrow--after-color);
								box-shadow:
									0 1px 7px var(--suggestion-arrow-box-shadow-left-color),
									0 1px 7px var(--suggestion-arrow-box-shadow-right-color);
								content: "";
								transform: translateX(-50%) translateY(-50%) rotate(45deg);
							}
							.pops-${popsType}-search-suggestion[data-popper-placement^="top"] .pops-${popsType}-search-suggestion-arrow{
								position: absolute;
								top: 100%;
								left: 50%;
								overflow: hidden;
								width: 100%;
								height: 12.5px;
								transform: translateX(-50%);
							}
							.pops-${popsType}-search-suggestion[data-popper-placement^="top"] .pops-${popsType}-search-suggestion-arrow::after{
								position: absolute;
								top: 0;
								left: 50%;
								width: var(--suggestion-arrow--after-width);
								height: var(--suggestion-arrow--after-height);
								background: var(--suggestion-arrow--after-bg-color);
								box-shadow:
									0 1px 7px var(--suggestion-arrow-box-shadow-left-color),
									0 1px 7px var(--suggestion-arrow-box-shadow-right-color);
								content: "";
								transform: translateX(-50%) translateY(-50%) rotate(45deg);
							}
							.pops-${popsType}-search-suggestion[data-popper-placement^="bottom"] .pops-${popsType}-search-suggestion-arrow{
								top: -12.5px;
								left: 50%;
								transform: translateX(-50%);
							}
							.pops-${popsType}-search-suggestion[data-popper-placement^="bottom"] .pops-${popsType}-search-suggestion-arrow::after{
								position: absolute;
								top: 100%;
								left: 50%;
								content: "";
							}
						</style>
						<style type="text/css" data-dynamic="true">
							${SearchSuggestion.getDynamicCSS()}
						</style>
						<style>
							.el-zoom-in-top-animation{
								--el-transition-md-fade: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1),
									opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1);
								transition: var(--el-transition-md-fade);
								transform-origin: center top;
							}
							.el-zoom-in-top-animation[data-popper-placement^="top"] {
								transform-origin: center bottom;
							}
							.el-zoom-in-top-animation-hide{
								opacity: 0;
								transform: scaleY(0);
							}
							.el-zoom-in-top-animation-show{
								opacity: 1;
								transform: scaleY(1);
							}
						</style>
						<style type="text/css" data-user-css>
							${config.style || ""}
						</style>
						<ul class="pops-${popsType}-search-suggestion-hint ${PopsCommonCSSClassName.userSelectNone}">${config.toSearhNotResultHTML}</ul>
						${config.useArrow ? (
`<div class="pops-${popsType}-search-suggestion-arrow"></div>`
            ) : ""}
         				 `
            )
          }, {
            "data-guid": guid,
            "type-value": popsType
          });
          if (config.className !== "" && config.className != null) {
            popsDOMUtils.addClassName($el, config.className);
          }
          if (config.isAnimation) {
            popsDOMUtils.addClassName($el, `pops-${popsType}-animation`);
          }
          if (config.useFoldAnimation) {
            popsDOMUtils.addClassName($el, "el-zoom-in-top-animation");
          }
          return $el;
        },
getDynamicCSS() {
          return (
`
				.pops-${popsType}-search-suggestion{
					--search-suggestion-bg-color: #ffffff;
					--search-suggestion-box-shadow-color: rgb(0 0 0 / 20%);
					--search-suggestion-item-color: #515a6e;
					--search-suggestion-item-none-color: #8e8e8e;
					--search-suggestion-item-is-hover-bg-color: #f5f7fa;
					--search-suggestion-item-is-select-bg-color: #409eff;
				}
				.pops-${popsType}-search-suggestion{
					border: initial;
					overflow: initial;
					position: ${config.isAbsolute ? "absolute" : "fixed"};
					z-index: ${PopsHandler.handleZIndex(config.zIndex)};
				}
				ul.pops-${popsType}-search-suggestion-hint{
					max-height: ${config.maxHeight};
					overflow-x: hidden;
					overflow-y: auto;
					padding: 5px 0;
					background-color: var(--search-suggestion-bg-color);
					box-sizing: border-box;
					border-radius: 4px;
					box-shadow: 0 1px 6px var(--search-suggestion-box-shadow-color);
				}
				/* 建议框在上面时 */
				.pops-${popsType}-search-suggestion[data-top-reverse] ul.pops-${popsType}-search-suggestion-hint{
					display: flex;
					flex-direction: column-reverse;
				}
				.pops-${popsType}-search-suggestion[data-top-reverse] ul.pops-${popsType}-search-suggestion-hint li{
					flex-shrink: 0;
				}
				ul.pops-${popsType}-search-suggestion-hint li{
					padding: 7px;
					margin: 0;
					clear: both;
					color: var(--search-suggestion-item-color);
					font-size: 14px;
					list-style: none;
					cursor: pointer;
					transition: background .2s ease-in-out;
					overflow: hidden;
					text-overflow: ellipsis;
					width: 100%;
				}
				ul.pops-${popsType}-search-suggestion-hint li[data-none]{
					text-align: center;
					font-size: 12px;
					color: var(--search-suggestion-item-none-color);
				}
				ul.pops-${popsType}-search-suggestion-hint li:not([data-none]):hover{
					background-color: var(--search-suggestion-item-is-hover-bg-color);
				}
				@media (prefers-color-scheme: dark){
					.pops-${popsType}-search-suggestion{
						--search-suggestion-bg-color: #1d1e1f;
						--search-suggestion-item-color: #cfd3d4;
						--search-suggestion-item-is-hover-bg-color: rgba(175, 175, 175, .1);
					}
				}
				`
          );
        },
getItemDataValue(data) {
          return data;
        },
createSearchItemLiElement(dataItem, dateItemIndex) {
          const dataValue = SearchSuggestion.getItemDataValue(dataItem);
          let $li = popsDOMUtils.createElement("li", {
            className: `pops-${popsType}-search-suggestion-hint-item`,
            "data-index": dateItemIndex,
            "data-value": dataValue
          });
          Reflect.set($li, "data-index", dateItemIndex);
          Reflect.set($li, "data-value", dataValue);
          let $itemInner = dataItem.itemView(dataItem, $li, config);
          if (typeof $itemInner === "string") {
            PopsSafeUtils.setSafeHTML($li, $itemInner);
          } else {
            popsDOMUtils.append($li, $itemInner);
          }
          const enableDeleteButton = dataItem.enableDeleteButton;
          if (typeof enableDeleteButton === "boolean" && enableDeleteButton) {
            let $deleteIcon = SearchSuggestion.createItemDeleteIcon();
            popsDOMUtils.append($li, $deleteIcon);
          }
          popsDOMUtils.addClassName($li, PopsCommonCSSClassName.flexCenter);
          popsDOMUtils.addClassName($li, PopsCommonCSSClassName.flexYCenter);
          return $li;
        },
setSearchItemClickEvent($searchItem) {
          popsDOMUtils.on($searchItem, "click", async (event) => {
            popsDOMUtils.preventEvent(event);
            let $click = event.target;
            const data = SearchSuggestion.getData();
            const dataItem = Reflect.get($searchItem, "data-value");
            let isDelete = Boolean($click.closest(`.pops-${popsType}-delete-icon`));
            if (isDelete) {
              if (typeof dataItem.deleteButtonClickCallback === "function") {
                let result = await dataItem.deleteButtonClickCallback(event, $searchItem, dataItem, config);
                if (typeof result === "boolean" && result) {
                  data.splice(data.indexOf(dataItem), 1);
                  $searchItem.remove();
                }
              }
              if (!SearchSuggestion.$el.$hintULContainer.children.length) {
                SearchSuggestion.clear();
              }
              SearchSuggestion.updateStyleSheet();
            } else {
              if (typeof dataItem.clickCallback === "function") {
                let result = await dataItem.clickCallback(event, $searchItem, dataItem, config);
                if (typeof result === "boolean" && result) {
                  if (config.inputTarget instanceof HTMLInputElement || config.inputTarget instanceof HTMLTextAreaElement) {
                    config.inputTarget.value = String(dataItem.value);
                  }
                }
              }
            }
          }, {
            capture: true
          });
        },
setSearchItemSelectEvent(liElement) {
        },
setInputChangeEvent(option = {
          capture: true
        }) {
          if (!(config.inputTarget instanceof HTMLInputElement || config.inputTarget instanceof HTMLTextAreaElement)) {
            return;
          }
          config.inputTarget.setAttribute("autocomplete", "off");
          const listenerHandler = popsDOMUtils.onInput(config.inputTarget, async (event) => {
            const data = SearchSuggestion.getData();
            let queryDataResult = await config.inputTargetChangeRefreshShowDataCallback(config.inputTarget.value, data, config);
            SearchSuggestion.update(queryDataResult);
            SearchSuggestion.updateStyleSheet();
          }, option);
          SearchSuggestion.$evt.offInputChangeEvtHandler.push(listenerHandler.off);
        },
removeInputChangeEvent(option = {
          capture: true
        }) {
          for (let index = 0; index < SearchSuggestion.$evt.offInputChangeEvtHandler.length; index++) {
            const handler = SearchSuggestion.$evt.offInputChangeEvtHandler[index];
            handler();
            SearchSuggestion.$evt.offInputChangeEvtHandler.splice(index, 1);
            index--;
          }
        },
showEvent() {
          SearchSuggestion.updateStyleSheet();
          if (config.toHideWithNotResult) {
            if (SearchSuggestion.$data.isEmpty) {
              SearchSuggestion.hide(true);
            } else {
              SearchSuggestion.show();
            }
          } else {
            SearchSuggestion.show();
          }
        },
setShowEvent(option = {
          capture: true
        }) {
          if (config.followPosition === "target") {
            popsDOMUtils.on([config.target], ["focus", "click"], void 0, SearchSuggestion.showEvent, option);
          } else if (config.followPosition === "input") {
            popsDOMUtils.on([config.inputTarget], ["focus", "click"], void 0, SearchSuggestion.showEvent, option);
          } else if (config.followPosition === "inputCursor") {
            popsDOMUtils.on([config.inputTarget], ["focus", "click", "input"], void 0, SearchSuggestion.showEvent, option);
          } else {
            throw new Error("未知followPosition:" + config.followPosition);
          }
        },
removeShowEvent(option = {
          capture: true
        }) {
          popsDOMUtils.off([config.target, config.inputTarget], ["focus", "click"], void 0, SearchSuggestion.showEvent, option);
          popsDOMUtils.off([config.inputTarget], ["input"], void 0, SearchSuggestion.showEvent, option);
        },
hideEvent(event) {
          if (event.target instanceof Node) {
            if ($shadowContainer.contains(event.target)) {
              return;
            }
            if (config.target.contains(event.target)) {
              return;
            }
            if (config.inputTarget.contains(event.target)) {
              return;
            }
            SearchSuggestion.hide(true);
          }
        },
setHideEvent(option = {
          capture: true
        }) {
          if (Array.isArray(SearchSuggestion.selfDocument)) {
            SearchSuggestion.selfDocument.forEach(($checkParent) => {
              popsDOMUtils.on($checkParent, ["click", "touchstart"], void 0, SearchSuggestion.hideEvent, option);
            });
          } else {
            popsDOMUtils.on(SearchSuggestion.selfDocument, ["click", "touchstart"], void 0, SearchSuggestion.hideEvent, option);
          }
        },
removeHideEvent(option = {
          capture: true
        }) {
          if (Array.isArray(SearchSuggestion.selfDocument)) {
            SearchSuggestion.selfDocument.forEach(($checkParent) => {
              popsDOMUtils.off($checkParent, ["click", "touchstart"], void 0, SearchSuggestion.hideEvent, option);
            });
          } else {
            popsDOMUtils.off(SearchSuggestion.selfDocument, ["click", "touchstart"], void 0, SearchSuggestion.hideEvent, option);
          }
        },
setAllEvent(option = {
          capture: true
        }) {
          SearchSuggestion.setInputChangeEvent(option);
          SearchSuggestion.setHideEvent(option);
          SearchSuggestion.setShowEvent(option);
        },
removeAllEvent(option = {
          capture: true
        }) {
          SearchSuggestion.removeInputChangeEvent(option);
          SearchSuggestion.removeHideEvent(option);
          SearchSuggestion.removeShowEvent(option);
        },
createItemDeleteIcon(size = 16, fill = "#bababa") {
          let $svg = popsDOMUtils.parseTextToDOM(
`
					<svg class="pops-${popsType}-delete-icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" fill="${fill}">
						<path d="M512 883.2A371.2 371.2 0 1 0 140.8 512 371.2 371.2 0 0 0 512 883.2z m0 64a435.2 435.2 0 1 1 435.2-435.2 435.2 435.2 0 0 1-435.2 435.2z"></path>
						<path d="M557.056 512l122.368 122.368a31.744 31.744 0 1 1-45.056 45.056L512 557.056l-122.368 122.368a31.744 31.744 0 1 1-45.056-45.056L466.944 512 344.576 389.632a31.744 31.744 0 1 1 45.056-45.056L512 466.944l122.368-122.368a31.744 31.744 0 1 1 45.056 45.056z"></path>
					</svg>
        			`
          );
          return $svg;
        },
setPromptsInSearch() {
          let $isSearching = popsDOMUtils.createElement("li", {
            className: `pops-${popsType}-search-suggestion-hint-searching-item`,
            innerHTML: config.searchingTip
          });
          SearchSuggestion.addItem($isSearching);
        },
removePromptsInSearch() {
          SearchSuggestion.$el.$hintULContainer.querySelector(`li.pops-${popsType}-search-suggestion-hint-searching-item`)?.remove();
        },
changeHintULElementPosition(target = config.target ?? config.inputTarget, checkPositonAgain = true) {
          let targetRect = null;
          if (config.followPosition === "inputCursor") {
            targetRect = popsDOMUtils.getTextBoundingRect(config.inputTarget, config.inputTarget.selectionStart || 0, config.inputTarget.selectionEnd || 0, false);
          } else {
            targetRect = config.isAbsolute ? popsDOMUtils.offset(target) : target.getBoundingClientRect();
          }
          if (targetRect == null) {
            return;
          }
          let documentHeight = document.documentElement.clientHeight;
          if (config.isAbsolute) {
            documentHeight = popsDOMUtils.height(document);
          }
          let documentWidth = popsDOMUtils.width(document);
          let position = config.position;
          if (config.position === "auto") {
            let targetBottom = targetRect.bottom;
            let searchSuggestionContainerHeight = popsDOMUtils.height(SearchSuggestion.$el.$hintULContainer);
            if (targetBottom + searchSuggestionContainerHeight > documentHeight) {
              position = "top";
            } else {
              position = "bottom";
            }
          }
          if (position === "top") {
            if (config.positionTopToReverse) {
              SearchSuggestion.$el.root.setAttribute("data-top-reverse", "true");
            }
            if (config.useFoldAnimation) {
              SearchSuggestion.$el.root.setAttribute("data-popper-placement", "top");
            }
            let bottom = documentHeight - targetRect.top + config.topDistance;
            SearchSuggestion.$el.root.style.top = "";
            SearchSuggestion.$el.root.style.bottom = bottom + "px";
          } else if (position === "bottom") {
            if (config.useFoldAnimation) {
              SearchSuggestion.$el.root.setAttribute("data-popper-placement", "bottom-center");
            }
            let top2 = targetRect.height + targetRect.top + config.topDistance;
            SearchSuggestion.$el.root.removeAttribute("data-top-reverse");
            SearchSuggestion.$el.root.style.bottom = "";
            SearchSuggestion.$el.root.style.top = top2 + "px";
          }
          let left = targetRect.left;
          let hintUIWidth = popsDOMUtils.width(SearchSuggestion.$el.$hintULContainer);
          if (hintUIWidth > documentWidth) {
            left = left + documentWidth - hintUIWidth;
          }
          SearchSuggestion.$el.root.style.left = left + "px";
          if (checkPositonAgain) {
            SearchSuggestion.changeHintULElementPosition(target, !checkPositonAgain);
          }
        },
changeHintULElementWidth(target = config.target ?? config.inputTarget) {
          let targetRect = target.getBoundingClientRect();
          if (config.followTargetWidth) {
            SearchSuggestion.$el.$hintULContainer.style.width = targetRect.width + "px";
          } else {
            SearchSuggestion.$el.$hintULContainer.style.width = config.width;
          }
        },
updateDynamicCSS() {
          let cssText = SearchSuggestion.getDynamicCSS();
          PopsSafeUtils.setSafeHTML(SearchSuggestion.$el.$dynamicCSS, cssText);
        },
updateStyleSheet() {
          SearchSuggestion.updateDynamicCSS();
          SearchSuggestion.changeHintULElementWidth();
          SearchSuggestion.changeHintULElementPosition();
        },
addItem($item) {
          SearchSuggestion.$el.$hintULContainer.appendChild($item);
        },
update(updateData = []) {
          if (!Array.isArray(updateData)) {
            throw new TypeError("传入的数据不是数组");
          }
          const data = updateData;
          if (data.length) {
            SearchSuggestion.$data.isEmpty = false;
            if (config.toHideWithNotResult) {
              SearchSuggestion.show();
            }
            SearchSuggestion.clear(true);
            let fragment = document.createDocumentFragment();
            data.forEach((item, index) => {
              let $item = SearchSuggestion.createSearchItemLiElement(item, index);
              SearchSuggestion.setSearchItemClickEvent($item);
              SearchSuggestion.setSearchItemSelectEvent($item);
              fragment.appendChild($item);
            });
            SearchSuggestion.addItem(fragment);
          } else {
            SearchSuggestion.clear();
          }
        },
clear(onlyClearView = false) {
          PopsSafeUtils.setSafeHTML(SearchSuggestion.$el.$hintULContainer, "");
          if (onlyClearView) {
            return;
          }
          SearchSuggestion.$data.isEmpty = true;
          let $noResult;
          if (typeof config.toSearhNotResultHTML === "string") {
            $noResult = popsDOMUtils.parseTextToDOM(config.toSearhNotResultHTML);
          } else {
            $noResult = config.toSearhNotResultHTML();
          }
          SearchSuggestion.addItem($noResult);
          if (config.toHideWithNotResult) {
            SearchSuggestion.hide();
          }
        },
hide(useAnimationToHide = false) {
          if (config.useFoldAnimation) {
            if (!useAnimationToHide) {
              popsDOMUtils.removeClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation");
            }
            popsDOMUtils.addClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation");
            popsDOMUtils.addClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation-hide");
            popsDOMUtils.removeClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation-show");
          } else {
            SearchSuggestion.$el.root.style.display = "none";
          }
        },
show() {
          SearchSuggestion.$el.root.style.display = "";
          if (config.useFoldAnimation) {
            popsDOMUtils.addClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation");
            popsDOMUtils.removeClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation-hide");
            popsDOMUtils.addClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation-show");
          }
        }
      };
      return SearchSuggestion;
    }
  };
  class Pops {
config = {
version: "2025.9.4",
      cssText: PopsCSS,
iconSVG: PopsIcon.$data,
animation: PopsAnimation.$data,
instData: PopsInstData,
forbiddenScroll: {
        event(event) {
          return popsDOMUtils.preventEvent(event);
        }
      },
Utils: popsUtils,
DOMUtils: popsDOMUtils,
InstanceUtils: PopsInstanceUtils,
MathFloatUtils: PopsMathFloatUtils,
PanelHandlerComponents
    };
    init() {
    }
noConflict() {
      if (typeof PopsCore.globalThis.pops === "object") {
        popsUtils.delete(PopsCore.globalThis, "pops");
      }
      if (typeof unsafeWindow === "object" && unsafeWindow != null && typeof unsafeWindow.pops === "object") {
        popsUtils.delete(unsafeWindow, "pops");
      }
      return new Pops();
    }
isPhone(userAgent) {
      return popsUtils.isPhone(userAgent);
    }
GlobalConfig = GlobalConfig;
alert = (details) => {
      let dialog = PopsAlert.init(details);
      return dialog;
    };
confirm = (details) => {
      let dialog = PopsConfirm.init(details);
      return dialog;
    };
prompt = (details) => {
      let dialog = PopsPrompt.init(details);
      return dialog;
    };
loading = (details) => {
      let popsLoading = PopsLoading.init(details);
      return popsLoading;
    };
iframe = (details) => {
      let dialog = PopsIframe.init(details);
      return dialog;
    };
tooltip = (details) => {
      let popsTooltip = PopsTooltip.init(details);
      return popsTooltip;
    };
drawer = (details) => {
      let dialog = PopsDrawer.init(details);
      return dialog;
    };
folder = (details) => {
      let dialog = PopsFolder.init(details);
      return dialog;
    };
panel = (details) => {
      let dialog = PopsPanel.init(details);
      return dialog;
    };
rightClickMenu = (details) => {
      let popsRightClickMenu = PopsRightClickMenu.init(details);
      return popsRightClickMenu;
    };
searchSuggestion = (details) => {
      let popsSearchSuggestion = PopsSearchSuggestion.init(details);
      return popsSearchSuggestion;
    };
  }
  const pops = new Pops();
  const CommonUtil2 = {
waitRemove(...args) {
      args.forEach((selector) => {
        if (typeof selector !== "string") {
          return;
        }
        utils.waitNodeList(selector).then((nodeList) => {
          nodeList.forEach(($el) => $el.remove());
        });
      });
    },
createBlockCSSNode(...args) {
      let selectorList = [];
      if (args.length === 0) {
        return;
      }
      if (args.length === 1 && typeof args[0] === "string" && args[0].trim() === "") {
        return;
      }
      args.forEach((selector) => {
        if (Array.isArray(selector)) {
          selectorList = selectorList.concat(selector);
        } else {
          selectorList.push(selector);
        }
      });
      return domUtils$2.createElement("style", {
        type: "text/css",
        innerHTML: `${selectorList.join(",\n")}{display: none !important;}`
      });
    },
addBlockCSS(...args) {
      let selectorList = [];
      if (args.length === 0) {
        return;
      }
      if (args.length === 1 && typeof args[0] === "string" && args[0].trim() === "") {
        return;
      }
      args.forEach((selector) => {
        if (Array.isArray(selector)) {
          selectorList = selectorList.concat(selector);
        } else {
          selectorList.push(selector);
        }
      });
      return addStyle(`${selectorList.join(",\n")}{display: none !important;}`);
    },
setGMResourceCSS(resourceMapData) {
      let cssText = typeof _GM_getResourceText === "function" ? _GM_getResourceText(resourceMapData.keyName) : null;
      if (typeof cssText === "string" && cssText) {
        addStyle(cssText);
      } else {
        CommonUtil2.loadStyleLink(resourceMapData.url);
      }
    },
async loadStyleLink(url) {
      let $link = document.createElement("link");
      $link.rel = "stylesheet";
      $link.type = "text/css";
      $link.href = url;
      domUtils$2.ready(() => {
        document.head.appendChild($link);
      });
    },
async loadScript(url) {
      let $script = document.createElement("script");
      $script.src = url;
      return new Promise((resolve) => {
        $script.onload = () => {
          resolve(null);
        };
        (document.head || document.documentElement).appendChild($script);
      });
    },
fixUrl(url) {
      url = url.trim();
      if (url.match(/^http(s|):\/\//i)) {
        return url;
      } else if (url.startsWith("//")) {
        if (url.startsWith("///")) ;
        else {
          url = window.location.protocol + url;
        }
        return url;
      } else {
        if (!url.startsWith("/")) {
          url += "/";
        }
        url = window.location.origin + url;
        return url;
      }
    },
fixHttps(url) {
      if (url.startsWith("https://")) {
        return url;
      }
      if (!url.startsWith("http://")) {
        return url;
      }
      let urlInstance = new URL(url);
      urlInstance.protocol = "https:";
      return urlInstance.toString();
    },
lockScroll(...args) {
      let $hidden = document.createElement("style");
      $hidden.innerHTML =
`
			.pops-overflow-hidden-important {
				overflow: hidden !important;
			}
		`;
      let $elList = [document.documentElement, document.body].concat(...args || []);
      $elList.forEach(($el) => {
        $el.classList.add("pops-overflow-hidden-important");
      });
      (document.head || document.documentElement).appendChild($hidden);
      return {
recovery() {
          $elList.forEach(($el) => {
            $el.classList.remove("pops-overflow-hidden-important");
          });
          $hidden.remove();
        }
      };
    },
async getClipboardText() {
      function readClipboardText(resolve) {
        navigator.clipboard.readText().then((clipboardText) => {
          resolve(clipboardText);
        }).catch((error) => {
          log.error("读取剪贴板内容失败👉", error);
          resolve("");
        });
      }
      function requestPermissionsWithClipboard(resolve) {
        navigator.permissions.query({
name: "clipboard-read"
        }).then((permissionStatus) => {
          readClipboardText(resolve);
        }).catch((error) => {
          log.error("申请剪贴板权限失败,尝试直接读取👉", error.message ?? error.name ?? error.stack);
          readClipboardText(resolve);
        });
      }
      function checkClipboardApi() {
        if (typeof navigator?.clipboard?.readText !== "function") {
          return false;
        }
        if (typeof navigator?.permissions?.query !== "function") {
          return false;
        }
        return true;
      }
      return new Promise((resolve) => {
        if (!checkClipboardApi()) {
          resolve("");
          return;
        }
        if (document.hasFocus()) {
          requestPermissionsWithClipboard(resolve);
        } else {
          window.addEventListener(
            "focus",
            () => {
              requestPermissionsWithClipboard(resolve);
            },
            {
              once: true
            }
          );
        }
      });
    },
escapeHtml(unsafe) {
      return unsafe.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;").replace(/©/g, "&copy;").replace(/®/g, "&reg;").replace(/™/g, "&trade;").replace(/→/g, "&rarr;").replace(/←/g, "&larr;").replace(/↑/g, "&uarr;").replace(/↓/g, "&darr;").replace(/—/g, "&mdash;").replace(/–/g, "&ndash;").replace(/…/g, "&hellip;").replace(/ /g, "&nbsp;").replace(/\r\n/g, "<br>").replace(/\r/g, "<br>").replace(/\n/g, "<br>").replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;");
    },
interval(fn, intervalTime, timeout = 5e3) {
      let timeId;
      let maxTimeout = timeout - intervalTime;
      let intervalTimeCount = intervalTime;
      let loop = async (isTimeout) => {
        let result = await fn(isTimeout);
        if (typeof result === "boolean" && !result || isTimeout) {
          utils.workerClearTimeout(timeId);
          return;
        }
        intervalTimeCount += intervalTime;
        if (intervalTimeCount > maxTimeout) {
          loop(true);
          return;
        }
        timeId = utils.workerSetTimeout(() => {
          loop(false);
        }, intervalTime);
      };
      loop(false);
    },
findParentNode($el, selector, parentSelector) {
      if (parentSelector) {
        let $parent = domUtils$2.closest($el, parentSelector);
        if ($parent) {
          let $target = $parent.querySelector(selector);
          return $target;
        }
      } else {
        if (domUtils$2.matches($el, selector)) {
          return $el;
        }
        let $parent = domUtils$2.closest($el, selector);
        return $parent;
      }
    }
  };
  const PanelSettingConfig = {
qmsg_config_position: {
      key: "qmsg-config-position",
      defaultValue: "bottom"
    },
qmsg_config_maxnums: {
      key: "qmsg-config-maxnums",
      defaultValue: 3
    },
qmsg_config_showreverse: {
      key: "qmsg-config-showreverse",
      defaultValue: false
    }
  };
  const utils = utils$1.noConflict();
  const domUtils = domUtils$2.noConflict();
  const __pops = pops;
  const log = new utils.Log(
    _GM_info,
    _unsafeWindow.console || _monkeyWindow.console
  );
  let SCRIPT_NAME = _GM_info?.script?.name || void 0;
  pops.config.Utils.AnyTouch();
  const DEBUG = false;
  log.config({
    debug: DEBUG,
    logMaxCount: 1e3,
    autoClearConsole: true,
    tag: true
  });
  qmsg.config({
    isHTML: true,
    autoClose: true,
    showClose: false,
    consoleLogContent(qmsgInst) {
      const qmsgType = qmsgInst.getSetting().type;
      if (qmsgType === "loading") {
        return false;
      }
      const content = qmsgInst.getSetting().content;
      if (qmsgType === "warning") {
        log.warn(content);
      } else if (qmsgType === "error") {
        log.error(content);
      } else {
        log.info(content);
      }
      return true;
    },
    get position() {
      return Panel.getValue(
        PanelSettingConfig.qmsg_config_position.key,
        PanelSettingConfig.qmsg_config_position.defaultValue
      );
    },
    get maxNums() {
      return Panel.getValue(
        PanelSettingConfig.qmsg_config_maxnums.key,
        PanelSettingConfig.qmsg_config_maxnums.defaultValue
      );
    },
    get showReverse() {
      return Panel.getValue(
        PanelSettingConfig.qmsg_config_showreverse.key,
        PanelSettingConfig.qmsg_config_showreverse.defaultValue
      );
    },
    get zIndex() {
      let maxZIndex = utils$1.getMaxZIndex();
      let popsMaxZIndex = pops.config.InstanceUtils.getPopsMaxZIndex().zIndex;
      return utils$1.getMaxValue(maxZIndex, popsMaxZIndex) + 100;
    }
  });
  __pops.GlobalConfig.setGlobalConfig({
    zIndex: () => {
      let maxZIndex = utils$1.getMaxZIndex(void 0, void 0, ($ele) => {
        if ($ele?.classList?.contains("qmsg-shadow-container")) {
          return false;
        }
        if ($ele?.closest("qmsg") && $ele.getRootNode() instanceof ShadowRoot) {
          return false;
        }
      });
      let popsMaxZIndex = pops.config.InstanceUtils.getPopsMaxZIndex().zIndex;
      return utils$1.getMaxValue(maxZIndex, popsMaxZIndex) + 100;
    },
    mask: {
enable: true,
clickEvent: {
        toClose: false,
        toHide: false
      }
    },
    drag: true
  });
  const GM_Menu = new utils.GM_Menu({
    GM_getValue: _GM_getValue,
    GM_setValue: _GM_setValue,
    GM_registerMenuCommand: _GM_registerMenuCommand,
    GM_unregisterMenuCommand: _GM_unregisterMenuCommand
  });
  const httpx = new utils.Httpx({
    xmlHttpRequest: _GM_xmlhttpRequest,
    logDetails: DEBUG
  });
  httpx.interceptors.request.use((data) => {
    return data;
  });
  httpx.interceptors.response.use(void 0, (data) => {
    log.error("拦截器-请求错误", data);
    if (data.type === "onabort") {
      qmsg.warning("请求取消", { consoleLogContent: true });
    } else if (data.type === "onerror") {
      qmsg.error("请求异常", { consoleLogContent: true });
    } else if (data.type === "ontimeout") {
      qmsg.error("请求超时", { consoleLogContent: true });
    } else {
      qmsg.error("其它错误", { consoleLogContent: true });
    }
    return data;
  });
  ({
    Object: {
      defineProperty: _unsafeWindow.Object.defineProperty
    },
    Function: {
      apply: _unsafeWindow.Function.prototype.apply,
      call: _unsafeWindow.Function.prototype.call
    },
    Element: {
      appendChild: _unsafeWindow.Element.prototype.appendChild
    },
    setTimeout: _unsafeWindow.setTimeout
  });
  const addStyle = utils.addStyle.bind(utils);
  domUtils$2.selector.bind(domUtils$2);
  domUtils$2.selectorAll.bind(domUtils$2);
  new utils.GM_Cookie();
  const KEY = "GM_Panel";
  const ATTRIBUTE_INIT = "data-init";
  const ATTRIBUTE_KEY = "data-key";
  const ATTRIBUTE_DEFAULT_VALUE = "data-default-value";
  const ATTRIBUTE_INIT_MORE_VALUE = "data-init-more-value";
  const PanelSizeUtil = {
get width() {
      return globalThis.innerWidth;
    },
get height() {
      return globalThis.innerHeight;
    }
  };
  const PanelUISize = {
setting: {
      get width() {
        if (PanelSizeUtil.width < 550) {
          return "88vw";
        } else if (PanelSizeUtil.width < 700) {
          return "550px";
        } else {
          return "700px";
        }
      },
      get height() {
        if (PanelSizeUtil.height < 450) {
          return "70vh";
        } else if (PanelSizeUtil.height < 550) {
          return "450px";
        } else {
          return "550px";
        }
      }
    },
settingMiddle: {
      get width() {
        return PanelSizeUtil.width < 350 ? "88vw" : "350px";
      },
      get height() {
        return PanelSizeUtil.height < 450 ? "88vh" : "450px";
      }
    },
settingBig: {
      get width() {
        return PanelSizeUtil.width < 800 ? "92vw" : "800px";
      },
      get height() {
        return PanelSizeUtil.height < 600 ? "80vh" : "600px";
      }
    },
info: {
      get width() {
        return PanelSizeUtil.width < 350 ? "88vw" : "350px";
      },
      get height() {
        return PanelSizeUtil.height < 250 ? "88vh" : "250px";
      }
    }
  };
  class StorageUtils {
storageKey;
    listenerData;
constructor(key) {
      if (typeof key === "string") {
        let trimKey = key.trim();
        if (trimKey == "") {
          throw new Error("key参数不能为空字符串");
        }
        this.storageKey = trimKey;
      } else {
        throw new Error("key参数类型错误,必须是字符串");
      }
      this.listenerData = new utils$1.Dictionary();
    }
getLocalValue() {
      let localValue = _GM_getValue(this.storageKey);
      if (localValue == null) {
        localValue = {};
        this.setLocalValue(localValue);
      }
      return localValue;
    }
setLocalValue(value) {
      _GM_setValue(this.storageKey, value);
    }
set(key, value) {
      let oldValue = this.get(key);
      let localValue = this.getLocalValue();
      Reflect.set(localValue, key, value);
      this.setLocalValue(localValue);
      this.triggerValueChangeListener(key, oldValue, value);
    }
get(key, defaultValue) {
      let localValue = this.getLocalValue();
      return Reflect.get(localValue, key) ?? defaultValue;
    }
getAll() {
      let localValue = this.getLocalValue();
      return localValue;
    }
delete(key) {
      let oldValue = this.get(key);
      let localValue = this.getLocalValue();
      Reflect.deleteProperty(localValue, key);
      this.setLocalValue(localValue);
      this.triggerValueChangeListener(key, oldValue, void 0);
    }
has(key) {
      let localValue = this.getLocalValue();
      return Reflect.has(localValue, key);
    }
keys() {
      let localValue = this.getLocalValue();
      return Reflect.ownKeys(localValue);
    }
values() {
      let localValue = this.getLocalValue();
      return Reflect.ownKeys(localValue).map(
        (key) => Reflect.get(localValue, key)
      );
    }
clear() {
      _GM_deleteValue(this.storageKey);
    }
addValueChangeListener(key, callback) {
      let listenerId = Math.random();
      let listenerData = this.listenerData.get(key) || [];
      listenerData.push({
        id: listenerId,
        key,
        callback
      });
      this.listenerData.set(key, listenerData);
      return listenerId;
    }
removeValueChangeListener(listenerId) {
      let flag = false;
      for (const [key, listenerData] of this.listenerData.entries()) {
        for (let index = 0; index < listenerData.length; index++) {
          const value = listenerData[index];
          if (typeof listenerId === "string" && value.key === listenerId || typeof listenerId === "number" && value.id === listenerId) {
            listenerData.splice(index, 1);
            index--;
            flag = true;
          }
        }
        this.listenerData.set(key, listenerData);
      }
      return flag;
    }
triggerValueChangeListener(key, oldValue, newValue) {
      if (!this.listenerData.has(key)) {
        return;
      }
      let listenerData = this.listenerData.get(key);
      for (let index = 0; index < listenerData.length; index++) {
        const data = listenerData[index];
        if (typeof data.callback === "function") {
          let value = this.get(key);
          let __newValue;
          let __oldValue;
          if (typeof oldValue !== "undefined" && arguments.length >= 2) {
            __oldValue = oldValue;
          } else {
            __oldValue = value;
          }
          if (typeof newValue !== "undefined" && arguments.length > 2) {
            __newValue = newValue;
          } else {
            __newValue = value;
          }
          data.callback(key, __oldValue, __newValue);
        }
      }
    }
  }
  const PopsPanelStorageApi = new StorageUtils(KEY);
  const PanelContent = {
    $data: {
__contentConfig: null,
      get contentConfig() {
        if (this.__contentConfig == null) {
          this.__contentConfig = new utils.Dictionary();
        }
        return this.__contentConfig;
      }
    },
addContentConfig(configList) {
      if (!Array.isArray(configList)) {
        configList = [configList];
      }
      let index = this.$data.contentConfig.keys().length;
      this.$data.contentConfig.set(index, configList);
    },
getAllContentConfig() {
      return this.$data.contentConfig.values().flat();
    },
getConfig(index = 0) {
      return this.$data.contentConfig.get(index) ?? [];
    },
getDefaultBottomContentConfig() {
      return [
        {
          id: "script-version",
          title: `版本:${_GM_info?.script?.version || "未知"}`,
          isBottom: true,
          forms: [],
          clickFirstCallback(event, rightHeaderElement, rightContainerElement) {
            let supportURL = _GM_info?.script?.supportURL || _GM_info?.script?.namespace;
            if (typeof supportURL === "string" && utils.isNotNull(supportURL)) {
              window.open(supportURL, "_blank");
            }
            return false;
          }
        }
      ];
    }
  };
  const PanelMenu = {
    $data: {
      __menuOption: [
        {
          key: "show_pops_panel_setting",
          text: "⚙ 设置",
          autoReload: false,
          isStoreValue: false,
          showText(text) {
            return text;
          },
          callback: () => {
            Panel.showPanel(PanelContent.getConfig(0));
          }
        }
      ],
      get menuOption() {
        return this.__menuOption;
      }
    },
    init() {
      this.initExtensionsMenu();
    },
initExtensionsMenu() {
      if (!Panel.isTopWindow()) {
        return;
      }
      GM_Menu.add(this.$data.menuOption);
    },
addMenuOption(option) {
      if (!Array.isArray(option)) {
        option = [option];
      }
      this.$data.menuOption.push(...option);
    },
updateMenuOption(option) {
      if (!Array.isArray(option)) {
        option = [option];
      }
      option.forEach((optionItem) => {
        let findIndex = this.$data.menuOption.findIndex((it) => {
          return it.key === optionItem.key;
        });
        if (findIndex !== -1) {
          this.$data.menuOption[findIndex] = optionItem;
        }
      });
    },
getMenuOption(index = 0) {
      return this.$data.menuOption[index];
    },
deleteMenuOption(index = 0) {
      this.$data.menuOption.splice(index, 1);
    }
  };
  const Panel = {
$data: {
__contentConfigInitDefaultValue: null,
__onceExecMenuData: null,
__urlChangeReloadMenuExecOnce: null,
__onceExecData: null,
__panelConfig: {},
$panel: null,
panelContent: [],
get contentConfigInitDefaultValue() {
        if (this.__contentConfigInitDefaultValue == null) {
          this.__contentConfigInitDefaultValue = new utils.Dictionary();
        }
        return this.__contentConfigInitDefaultValue;
      },
contentConfigInitDisabledKeys: [],
get onceExecMenuData() {
        if (this.__onceExecMenuData == null) {
          this.__onceExecMenuData = new utils.Dictionary();
        }
        return this.__onceExecMenuData;
      },
get urlChangeReloadMenuExecOnce() {
        if (this.__urlChangeReloadMenuExecOnce == null) {
          this.__urlChangeReloadMenuExecOnce = new utils.Dictionary();
        }
        return this.__urlChangeReloadMenuExecOnce;
      },
get onceExecData() {
        if (this.__onceExecData == null) {
          this.__onceExecData = new utils.Dictionary();
        }
        return this.__onceExecData;
      },
get scriptName() {
        return SCRIPT_NAME;
      },
get panelConfig() {
        return this.__panelConfig;
      },
      set panelConfig(value) {
        this.__panelConfig = value;
      },
key: KEY,
attributeKeyName: ATTRIBUTE_KEY,
attributeDefaultValueName: ATTRIBUTE_DEFAULT_VALUE
    },
    init() {
      this.initContentDefaultValue();
      PanelMenu.init();
    },
isTopWindow() {
      return _unsafeWindow.top === _unsafeWindow.self;
    },
initContentDefaultValue() {
      const initDefaultValue = (config) => {
        if (!config.attributes) {
          return;
        }
        if (config.type === "button" || config.type === "forms" || config.type === "deepMenu") {
          return;
        }
        let __attr_init__ = config.attributes[ATTRIBUTE_INIT];
        if (typeof __attr_init__ === "function") {
          let __attr_result__ = __attr_init__();
          if (typeof __attr_result__ === "boolean" && !__attr_result__) {
            return;
          }
        }
        let menuDefaultConfig = new Map();
        let key = config.attributes[ATTRIBUTE_KEY];
        if (key != null) {
          const defaultValue = config.attributes[ATTRIBUTE_DEFAULT_VALUE];
          menuDefaultConfig.set(key, defaultValue);
        }
        let moreMenuDefaultConfig = config.attributes[ATTRIBUTE_INIT_MORE_VALUE];
        if (typeof moreMenuDefaultConfig === "object" && moreMenuDefaultConfig) {
          Object.keys(moreMenuDefaultConfig).forEach((key2) => {
            menuDefaultConfig.set(key2, moreMenuDefaultConfig[key2]);
          });
        }
        if (!menuDefaultConfig.size) {
          log.warn(["请先配置键", config]);
          return;
        }
        if (config.type === "switch") {
          let disabled = typeof config.disabled === "function" ? config.disabled() : config.disabled;
          if (typeof disabled === "boolean" && disabled) {
            this.$data.contentConfigInitDisabledKeys.push(...menuDefaultConfig.keys());
          }
        }
        for (const [__key, __defaultValue] of menuDefaultConfig.entries()) {
          this.setDefaultValue(__key, __defaultValue);
        }
      };
      const loopInitDefaultValue = (configList) => {
        for (let index = 0; index < configList.length; index++) {
          let configItem = configList[index];
          initDefaultValue(configItem);
          let child_forms = configItem.forms;
          if (child_forms && Array.isArray(child_forms)) {
            loopInitDefaultValue(child_forms);
          }
        }
      };
      const contentConfigList = [...PanelContent.getAllContentConfig()];
      for (let index = 0; index < contentConfigList.length; index++) {
        let leftContentConfigItem = contentConfigList[index];
        if (!leftContentConfigItem.forms) {
          continue;
        }
        const rightContentConfigList = leftContentConfigItem.forms;
        if (rightContentConfigList && Array.isArray(rightContentConfigList)) {
          loopInitDefaultValue(rightContentConfigList);
        }
      }
      this.$data.contentConfigInitDisabledKeys = [...new Set(this.$data.contentConfigInitDisabledKeys)];
    },
setDefaultValue(key, defaultValue) {
      if (this.$data.contentConfigInitDefaultValue.has(key)) {
        log.warn("请检查该key(已存在): " + key);
      }
      this.$data.contentConfigInitDefaultValue.set(key, defaultValue);
    },
setValue(key, value) {
      PopsPanelStorageApi.set(key, value);
    },
getValue(key, defaultValue) {
      let localValue = PopsPanelStorageApi.get(key);
      if (localValue == null) {
        if (this.$data.contentConfigInitDefaultValue.has(key)) {
          return this.$data.contentConfigInitDefaultValue.get(key);
        }
        return defaultValue;
      }
      return localValue;
    },
deleteValue(key) {
      PopsPanelStorageApi.delete(key);
    },
hasKey(key) {
      return PopsPanelStorageApi.has(key);
    },
addValueChangeListener(key, callback) {
      let listenerId = PopsPanelStorageApi.addValueChangeListener(key, (__key, __newValue, __oldValue) => {
        callback(key, __oldValue, __newValue);
      });
      return listenerId;
    },
removeValueChangeListener(listenerId) {
      PopsPanelStorageApi.removeValueChangeListener(listenerId);
    },
triggerMenuValueChange(key, newValue, oldValue) {
      PopsPanelStorageApi.triggerValueChangeListener(key, oldValue, newValue);
    },
exec(queryKey, callback, checkExec, once = true) {
      const that = this;
      let queryKeyFn;
      if (typeof queryKey === "string" || Array.isArray(queryKey)) {
        queryKeyFn = () => queryKey;
      } else {
        queryKeyFn = queryKey;
      }
      let isArrayKey = false;
      let queryKeyResult = queryKeyFn();
      let keyList = [];
      if (Array.isArray(queryKeyResult)) {
        isArrayKey = true;
        keyList = queryKeyResult;
      } else {
        keyList.push(queryKeyResult);
      }
      let findNotInDataKey = keyList.find((it) => !this.$data.contentConfigInitDefaultValue.has(it));
      if (findNotInDataKey) {
        log.warn(`${findNotInDataKey} 键不存在`);
        return;
      }
      let storageKey = JSON.stringify(keyList);
      if (once) {
        if (this.$data.onceExecMenuData.has(storageKey)) {
          return this.$data.onceExecMenuData.get(storageKey);
        }
      }
      let storeValueList = [];
      let listenerIdList = [];
      let dynamicAddStyleNodeCallback = (value, $style) => {
        let dynamicResultList = [];
        if (!Array.isArray($style)) {
          $style = [$style];
        }
        $style.forEach(($styleItem) => {
          if ($styleItem == null) {
            return;
          }
          if ($styleItem instanceof HTMLStyleElement) {
            dynamicResultList.push($styleItem);
            return;
          }
        });
        {
          storeValueList = storeValueList.concat(dynamicResultList);
        }
      };
      let getMenuValue = (key) => {
        let value = this.getValue(key);
        return value;
      };
      let clearBeforeStoreValue = () => {
        for (let index = 0; index < storeValueList.length; index++) {
          let $css = storeValueList[index];
          $css.remove();
          storeValueList.splice(index, 1);
          index--;
        }
      };
      let checkMenuExec = () => {
        let flag = false;
        if (typeof checkExec === "function") {
          flag = checkExec(keyList);
        } else {
          flag = keyList.every((key) => getMenuValue(key));
        }
        return flag;
      };
      let valueChangeCallback = (valueOption) => {
        let execFlag = checkMenuExec();
        let resultList = [];
        if (execFlag) {
          let valueList = keyList.map((key) => this.getValue(key));
          let callbackResult = callback({
            value: isArrayKey ? valueList : valueList[0],
            addStyleElement: (...args) => {
              return dynamicAddStyleNodeCallback(true, ...args);
            }
          });
          if (!Array.isArray(callbackResult)) {
            callbackResult = [callbackResult];
          }
          callbackResult.forEach((it) => {
            if (it == null) {
              return;
            }
            if (it instanceof HTMLStyleElement) {
              resultList.push(it);
              return;
            }
          });
        }
        clearBeforeStoreValue();
        storeValueList = [...resultList];
      };
      once && keyList.forEach((key) => {
        let listenerId = this.addValueChangeListener(key, (key2, newValue, oldValue) => {
          valueChangeCallback();
        });
        listenerIdList.push(listenerId);
      });
      valueChangeCallback();
      let result = {
reload() {
          valueChangeCallback();
        },
clear() {
          this.clearStoreStyleElements();
          this.removeValueChangeListener();
          once && that.$data.onceExecMenuData.delete(storageKey);
        },
clearStoreStyleElements: () => {
          return clearBeforeStoreValue();
        },
removeValueChangeListener: () => {
          listenerIdList.forEach((listenerId) => {
            this.removeValueChangeListener(listenerId);
          });
        }
      };
      this.$data.onceExecMenuData.set(storageKey, result);
      return result;
    },
execMenu(key, callback, isReverse = false, once = false) {
      return this.exec(
        key,
        (option) => {
          return callback(option);
        },
        (keyList) => {
          let execFlag = keyList.every((__key__) => {
            let flag = !!this.getValue(__key__);
            let disabled = Panel.$data.contentConfigInitDisabledKeys.includes(__key__);
            if (disabled) {
              flag = false;
              log.warn(`.execMenu${once ? "Once" : ""} ${__key__} 被禁用`);
            }
            isReverse && (flag = !flag);
            return flag;
          });
          return execFlag;
        },
        once
      );
    },
execMenuOnce(key, callback, isReverse = false, listenUrlChange = false) {
      const result = this.execMenu(key, callback, isReverse, true);
      if (listenUrlChange) {
        if (result) {
          const urlChangeEvent = () => {
            result.reload();
          };
          this.removeUrlChangeWithExecMenuOnceListener(key);
          this.addUrlChangeWithExecMenuOnceListener(key, urlChangeEvent);
          const originClear = result.clear;
          result.clear = () => {
            originClear();
            this.removeUrlChangeWithExecMenuOnceListener(key);
          };
        }
      }
      return result;
    },
deleteExecMenuOnce(key) {
      key = this.transformKey(key);
      this.$data.onceExecMenuData.delete(key);
      this.$data.urlChangeReloadMenuExecOnce.delete(key);
      let flag = PopsPanelStorageApi.removeValueChangeListener(key);
      return flag;
    },
onceExec(key, callback) {
      key = this.transformKey(key);
      if (typeof key !== "string") {
        throw new TypeError("key 必须是字符串");
      }
      if (this.$data.onceExecData.has(key)) {
        return;
      }
      callback();
      this.$data.onceExecData.set(key, 1);
    },
deleteOnceExec(key) {
      key = this.transformKey(key);
      this.$data.onceExecData.delete(key);
    },
addUrlChangeWithExecMenuOnceListener(key, callback) {
      key = this.transformKey(key);
      this.$data.urlChangeReloadMenuExecOnce.set(key, callback);
    },
removeUrlChangeWithExecMenuOnceListener(key) {
      key = this.transformKey(key);
      this.$data.urlChangeReloadMenuExecOnce.delete(key);
    },
triggerUrlChangeWithExecMenuOnceEvent(config) {
      this.$data.urlChangeReloadMenuExecOnce.forEach((callback, key) => {
        callback(config);
      });
    },
showPanel(content, title = `${SCRIPT_NAME}-设置`, preventDefaultContentConfig = false, preventRegisterSearchPlugin = false) {
      this.$data.$panel = null;
      this.$data.panelContent = [];
      let checkHasBottomVersionContentConfig = content.findIndex((it) => {
        let isBottom = typeof it.isBottom === "function" ? it.isBottom() : Boolean(it.isBottom);
        return isBottom && it.id === "script-version";
      }) !== -1;
      if (!preventDefaultContentConfig && !checkHasBottomVersionContentConfig) {
        content.push(...PanelContent.getDefaultBottomContentConfig());
      }
      let $panel = __pops.panel({
        ...{
          title: {
            text: title,
            position: "center",
            html: false,
            style: ""
          },
          content,
          btn: {
            close: {
              enable: true,
              callback: (details, event) => {
                details.close();
                this.$data.$panel = null;
              }
            }
          },
          mask: {
            enable: true,
            clickEvent: {
              toClose: true,
              toHide: false
            },
            clickCallBack: (originalRun, config) => {
              originalRun();
              this.$data.$panel = null;
            }
          },
          width: PanelUISize.setting.width,
          height: PanelUISize.setting.height,
          drag: true,
          only: true
        },
        ...this.$data.panelConfig
      });
      this.$data.$panel = $panel;
      this.$data.panelContent = content;
      if (!preventRegisterSearchPlugin) {
        this.registerConfigSearch({ $panel, content });
      }
    },
registerConfigSearch(config) {
      const { $panel, content } = config;
      let asyncQueryProperty = async (target, handler) => {
        if (target == null) {
          return;
        }
        let handleResult = await handler(target);
        if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
          return handleResult.data;
        }
        return await asyncQueryProperty(handleResult.data, handler);
      };
      let scrollToElementAndListen = ($el, callback) => {
        const observer = new IntersectionObserver(
          (entries) => {
            entries.forEach((entry) => {
              if (entry.isIntersecting) {
                callback?.();
                observer.disconnect();
              }
            });
          },
          {
            root: null,
threshold: 1
}
        );
        observer.observe($el);
        $el.scrollIntoView({ behavior: "smooth", block: "center" });
      };
      let addFlashingClass = ($el) => {
        const flashingClassName = "pops-flashing";
        domUtils.animationend($el, () => {
          $el.classList.remove(flashingClassName);
        });
        $el.classList.add(flashingClassName);
      };
      let dbclick_event = (evt, selectorTarget) => {
        utils.preventEvent(evt);
        let $alert = __pops.alert({
          title: {
            text: "搜索配置",
            position: "center"
          },
          content: {
            text: (
`
						<div class="search-wrapper">
							<input class="search-config-text" name="search-config" type="text" placeholder="请输入需要搜素的配置名称">
						</div>
						<div class="search-result-wrapper"></div>
					`
            ),
            html: true
          },
          btn: {
            ok: { enable: false }
          },
          mask: {
            clickEvent: {
              toClose: true
            }
          },
          width: PanelUISize.settingMiddle.width,
          height: "auto",
          drag: true,
          style: (
`
					${__pops.config.cssText.panelCSS}

					.search-wrapper{
						border-bottom: 1px solid rgb(235, 238, 245, 1);
					}
					.pops-content:has(.search-result-wrapper:empty) .search-wrapper{
						border-bottom: 0;
					}
					.search-config-text{
						width: 100%;
						border: 0;
						height: 32px;
						padding: 0px 10px;
						outline: none;
					}
					.search-result-wrapper{
						max-height: 400px;
						overflow: auto;
					}
					.search-result-item{
						cursor: pointer;
						padding: 5px 10px;
						display: flex;
						flex-direction: column;
					}
					.search-result-item:hover{
						background-color: #D8F1FD;
					}
					.search-result-item-path{
						display: flex;
    					align-items: center;
					}
					.search-result-item-description{
						font-size: 0.8em;
						color: #6c6c6c;
					}
					${config.searchDialogStyle ?? ""}
				`
          )
        });
        $alert.$shadowRoot.querySelector(".search-wrapper");
        let $searchInput = $alert.$shadowRoot.querySelector(".search-config-text");
        let $searchResultWrapper = $alert.$shadowRoot.querySelector(".search-result-wrapper");
        $searchInput.focus();
        let clearSearchResult = () => {
          domUtils.empty($searchResultWrapper);
        };
        let createSearchResultItem = (pathInfo) => {
          const searchPath = utils.queryProperty(pathInfo, (target) => {
            if (target?.next) {
              return {
                isFind: false,
                data: target.next
              };
            } else {
              return {
                isFind: true,
                data: target
              };
            }
          });
          let $item = domUtils.createElement("div", {
            className: "search-result-item",
            innerHTML: (
`
							<div class="search-result-item-path">${searchPath.matchedData?.path}</div>
							<div class="search-result-item-description">${searchPath.matchedData?.description ?? ""}</div>
						`
            )
          });
          domUtils.on($item, "click", (clickItemEvent) => {
            let $asideItems = $panel.$shadowRoot.querySelectorAll(
              "aside.pops-panel-aside .pops-panel-aside-top-container li"
            );
            let $targetAsideItem = $asideItems[pathInfo.index];
            if (!$targetAsideItem) {
              qmsg.error(`左侧项下标${pathInfo.index}不存在`);
              return;
            }
            $targetAsideItem.scrollIntoView({
              behavior: "smooth",
              block: "center"
            });
            $targetAsideItem.click();
            asyncQueryProperty(pathInfo.next, async (target) => {
              if (target?.next) {
                let $findDeepMenu = await utils.waitNode(() => {
                  return Array.from(
                    $panel.$shadowRoot.querySelectorAll(".pops-panel-deepMenu-nav-item")
                  ).find(($deepMenu) => {
                    const __formConfig__ = Reflect.get($deepMenu, "__formConfig__");
                    return typeof __formConfig__ === "object" && __formConfig__ != null && __formConfig__.text === target.name;
                  });
                }, 2500);
                if ($findDeepMenu) {
                  $findDeepMenu.click();
                } else {
                  qmsg.error("未找到对应的二级菜单");
                  return {
                    isFind: true,
                    data: target
                  };
                }
                return {
                  isFind: false,
                  data: target.next
                };
              } else {
                let $findTargetMenu = await utils.waitNode(() => {
                  return Array.from(
                    $panel.$shadowRoot.querySelectorAll(`li:not(.pops-panel-deepMenu-nav-item)`)
                  ).find(($menuItem) => {
                    const __formConfig__ = Reflect.get($menuItem, "__formConfig__");
                    return __formConfig__ === target.matchedData?.formConfig;
                  });
                }, 2500);
                if ($findTargetMenu) {
                  scrollToElementAndListen($findTargetMenu);
                  let $fold = $findTargetMenu.closest(`.pops-panel-forms-fold[data-fold-enable]`);
                  if ($fold) {
                    let $foldWrapper = $fold.querySelector(".pops-panel-forms-fold-container");
                    $foldWrapper.click();
                    await utils.sleep(500);
                  }
                  scrollToElementAndListen($findTargetMenu, () => {
                    addFlashingClass($findTargetMenu);
                  });
                } else {
                  qmsg.error("未找到对应的菜单项");
                }
                return {
                  isFind: true,
                  data: target
                };
              }
            });
          });
          return $item;
        };
        let execSearch = (searchText) => {
          const searchTextRegExp = new RegExp(searchText, "i");
          const searchConfigResult = [];
          const loopContentConfig = (configList, path) => {
            for (let index = 0; index < configList.length; index++) {
              const configItem = configList[index];
              let child_forms = configItem.forms;
              if (child_forms && Array.isArray(child_forms)) {
                const deepMenuPath = utils.deepClone(path);
                if (configItem.type === "deepMenu") {
                  const deepNext = utils.queryProperty(deepMenuPath, (target) => {
                    if (target?.next) {
                      return {
                        isFind: false,
                        data: target.next
                      };
                    } else {
                      return {
                        isFind: true,
                        data: target
                      };
                    }
                  });
                  deepNext.next = {
                    name: configItem.text
                  };
                }
                loopContentConfig(child_forms, deepMenuPath);
              } else {
                let text = Reflect.get(configItem, "text");
                let description = Reflect.get(configItem, "description");
                const delayMatchedTextList = [text, description];
                let matchedIndex = delayMatchedTextList.findIndex((configText) => {
                  if (typeof configText !== "string") {
                    return;
                  }
                  return configText.match(searchTextRegExp);
                });
                if (matchedIndex !== -1) {
                  const matchedPath = utils.deepClone(path);
                  const deepNext = utils.queryProperty(matchedPath, (target) => {
                    if (target?.next) {
                      return {
                        isFind: false,
                        data: target.next
                      };
                    } else {
                      return {
                        isFind: true,
                        data: target
                      };
                    }
                  });
                  deepNext.next = {
                    name: text,
                    matchedData: {
                      path: "",
                      formConfig: configItem,
                      matchedText: delayMatchedTextList[matchedIndex],
                      description
                    }
                  };
                  const pathList = [];
                  utils.queryProperty(matchedPath, (target) => {
                    const name = target?.name;
                    if (typeof name === "string" && name.trim() !== "") {
                      pathList.push(name);
                    }
                    if (target?.next) {
                      return {
                        isFind: false,
                        data: target.next
                      };
                    } else {
                      return {
                        isFind: true,
                        data: target
                      };
                    }
                  });
                  const pathStr = pathList.join(CommonUtil2.escapeHtml(" - "));
                  deepNext.next.matchedData.path = pathStr;
                  searchConfigResult.push(matchedPath);
                }
              }
            }
          };
          for (let index = 0; index < content.length; index++) {
            const leftContentConfigItem = content[index];
            if (!leftContentConfigItem.forms) {
              continue;
            }
            if (leftContentConfigItem.isBottom && leftContentConfigItem.id === "script-version") {
              continue;
            }
            const rightContentConfigList = leftContentConfigItem.forms;
            if (rightContentConfigList && Array.isArray(rightContentConfigList)) {
              let text = leftContentConfigItem.title;
              if (typeof text === "function") {
                text = text();
              }
              loopContentConfig(rightContentConfigList, {
                index,
                name: text
              });
            }
          }
          let fragment = document.createDocumentFragment();
          for (const pathInfo of searchConfigResult) {
            let $resultItem = createSearchResultItem(pathInfo);
            fragment.appendChild($resultItem);
          }
          clearSearchResult();
          $searchResultWrapper.append(fragment);
        };
        domUtils.on(
          $searchInput,
          "input",
          utils.debounce((evt2) => {
            utils.preventEvent(evt2);
            let searchText = domUtils.val($searchInput).trim();
            if (searchText === "") {
              clearSearchResult();
              return;
            }
            execSearch(searchText);
          }, 200)
        );
      };
      let clickElement = null;
      let isDoubleClick = false;
      let timer = void 0;
      domUtils.on(
        $panel.$shadowRoot,
        "dblclick",
        `aside.pops-panel-aside .pops-panel-aside-item:not(#script-version)`,
        dbclick_event
      );
      domUtils.on(
        $panel.$shadowRoot,
        "touchend",
        `aside.pops-panel-aside .pops-panel-aside-item:not(#script-version)`,
        (evt, selectorTarget) => {
          clearTimeout(timer);
          timer = void 0;
          if (isDoubleClick && clickElement === selectorTarget) {
            isDoubleClick = false;
            clickElement = null;
            dbclick_event(evt);
          } else {
            timer = setTimeout(() => {
              isDoubleClick = false;
            }, 200);
            isDoubleClick = true;
            clickElement = selectorTarget;
          }
        },
        {
          capture: true
        }
      );
      $panel.$shadowRoot.appendChild(
        domUtils.createElement("style", {
          type: "text/css",
          textContent: (
`
					.pops-flashing{
						animation: double-blink 1.5s ease-in-out;
					}
					@keyframes double-blink {
						 0% {
							background-color: initial;
						}
						25% {
							background-color: yellow;
						}
						50% {
							background-color: initial;
						}
						75% {
							background-color: yellow;
						}
						100% {
							background-color: initial;
						}
					}
				`
          )
        })
      );
    },
transformKey(key) {
      if (Array.isArray(key)) {
        const keyArray = key.sort();
        return JSON.stringify(keyArray);
      } else {
        return key;
      }
    }
  };
  let injectDocumentTime = "";
  if (document.documentElement) {
    if (document.head) {
      if (document.body) {
        injectDocumentTime = `<html>
    <head>
	    ...${document.head.childNodes.length} nodes
	</head>
    <body>
        ...${document.body.childNodes.length} nodes
    </body>
</html>

注入速度等级:4
`;
      } else {
        if (document.head.childNodes.length) {
          injectDocumentTime = `<html>
	<head>
	    ...${document.head.childNodes.length} nodes
	</head>
</html>
		
注入速度等级:3`;
        } else {
          injectDocumentTime = `<html>
	<head></head>
</html>

注入速度等级:2`;
        }
      }
    } else {
      injectDocumentTime = `<html>
</html>

注入速度等级:1`;
    }
  } else {
    injectDocumentTime = `document.documentElement is null
	
注入速度等级:0`;
  }
  const setTimeoutLog = (handler, timeout, ...args) => {
    return setTimeout(async () => {
      try {
        await handler(...args);
      } catch (error) {
        qmsg.error(error.toString(), { consoleLogContent: true });
      }
    }, timeout);
  };
  const Tag = {
    success: "√ ",
    error: "× ",
    warn: "!!! ",
    info: ""
  };
  const TagUtil = {
setTagList($el, tagList) {
      domUtils.html($el, "");
      let tagHTML = "";
      tagList.forEach((tagItem) => {
        tagHTML +=
`
				<p class="${tagItem.tag}">${tagItem.text ?? ""}</p>
			`;
      });
      domUtils.html($el, tagHTML);
    },
setTag($el, tag, text) {
      TagUtil.clearTag($el);
      domUtils.addClass($el, tag);
      if (typeof text === "string") {
        domUtils.html($el, text);
      }
    },
clearTag($el) {
      Object.keys(Tag).forEach((tagName) => {
        domUtils.removeClass($el, tagName);
      });
    }
  };
  const UIInfo = (config) => {
    let result = {
      type: "own",
      getLiElementCallBack($li) {
        let $item = domUtils.createElement("div", {
          className: "pops-panel-item-left-text",
          innerHTML: (
`
					<p class="pops-panel-item-left-main-text"></p>
					<p class="pops-panel-item-left-desc-text"></p>
				`
          )
        });
        $li.appendChild($item);
        return $li;
      },
      async afterAddToUListCallBack(formConfig, container) {
        let $target = container.target;
        let $leftContainer = $target.querySelector(".pops-panel-item-left-text");
        let $text = $target.querySelector(".pops-panel-item-left-main-text");
        let $desc = $target.querySelector(".pops-panel-item-left-desc-text");
        let detail = await config();
        if (detail.tag == null) {
          domUtils.html($text, detail.text);
        } else {
          domUtils.html($text, Tag[detail.tag] + detail.text);
        }
        if (detail.description == null || detail.description === "") {
          domUtils.hide($desc, false);
        }
        domUtils.html($desc, detail.description || "");
        let classNameList = ["support-info"];
        if (detail.tag != null) {
          classNameList.push(detail.tag);
        }
        domUtils.addClass($text, classNameList);
        if (typeof detail.afterRender === "function") {
          try {
            detail.afterRender({
              ...container,
              $leftContainer,
              $leftText: $text,
              $leftDesc: $desc
            });
          } catch (error) {
            console.log(error);
            TagUtil.setTag($text, "error", "afterRender 函数执行错误" + error);
          }
        }
      }
    };
    return result;
  };
  const PanelKeyConfig = {
    asideLastVisit: "aside-last-visit"
  };
  const GlobalUtil = {
    getWindow() {
      return GMTotal.unsafeWindow.isSupport() ? _unsafeWindow : window;
    }
  };
  class TestUIBase {
  }
  class ApiTestBase extends TestUIBase {
isSupportGM() {
      return typeof _GM === "object" && _GM != null;
    }
  }
  class ApiAsyncTestBase extends ApiTestBase {
  }
  const TamperMonkeyUtils = {
getApiDocUrl(navName, text) {
      text = text ?? navName;
      return `<a href="https://www.tampermonkey.net/documentation.php?ext=gcal&version=#api:${navName}" target="_blank">${text}</a>`;
    }
  };
  class ApiTest_addElement extends ApiAsyncTestBase {
    getApiName() {
      return "GM_addElement";
    }
    getAsyncApiOption() {
      return {
        name: "GM.addElement",
        isSupport: this.isSupportGM() && typeof _GM.addElement === "function"
      };
    }
    isSupport() {
      return typeof _GM_addElement === "function";
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                let fnResult = Reflect.apply(_GM_addElement, this, args);
                resolve(fnResult);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.addElement,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          let apiNameTag = data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(async () => {
              let $script = null;
              let $script_page = null;
              let win = GlobalUtil.getWindow();
              let el_script_id = apiNameTag + "_test_script_exec";
              let winPropName = `${el_script_id}_test_str`;
              try {
                $script = await data.fn("script", {
                  id: el_script_id,
                  textContent: `window["${winPropName}"] = "bar";`
                });
                $script_page = document.querySelector("#" + el_script_id);
                if ($script == null) {
                  return {
                    text: `${data.name} returns is null`,
                    tag: "error"
                  };
                }
                if (!($script instanceof HTMLElement)) {
                  return {
                    text: `${data.name} returns is not style element`,
                    tag: "error"
                  };
                }
                if (typeof win[winPropName] !== "string") {
                  return {
                    text: `${data.name} script element is not work`,
                    tag: "error"
                  };
                }
                Reflect.deleteProperty(win, winPropName);
                return {
                  text: CommonUtil2.escapeHtml("支持添加<script>元素且执行js"),
                  tag: "success"
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
                if ($script_page) {
                  $script_page.remove();
                }
              }
            }),
            UIInfo(async () => {
              let $el_div = null;
              let $el_page = null;
              let el_id = apiNameTag + "_test2";
              try {
                $el_div = await data.fn(document.body, "div", {
                  "data-src": "https://example.com/image.png",
                  id: el_id
                });
                if ($el_div == null) {
                  return {
                    text: data.name + " returns is null",
                    tag: "error"
                  };
                }
                if (!($el_div instanceof HTMLElement)) {
                  return {
                    text: data.name + " returns is not style element",
                    tag: "error"
                  };
                }
                $el_page = document.querySelector("#" + el_id);
                if (!$el_page) {
                  return {
                    text: "不支持3个参数",
                    tag: "error"
                  };
                }
                const shadowRoot = $el_page.attachShadow({
                  mode: "closed"
                });
                await data.fn(shadowRoot, "style", {
                  textContent: "div { color: black; };"
                });
                if (!shadowRoot.querySelector("style")) {
                  return {
                    text: "不支持3个参数的shadowRoot",
                    tag: "error"
                  };
                }
                if ($el_div == null) {
                  return {
                    text: "传入3个参数但是返回为空",
                    tag: "error"
                  };
                }
                if (!$el_page.hasAttribute("data-src")) {
                  return {
                    text: "不支持设置自定义属性data-src",
                    tag: "error"
                  };
                }
                return {
                  text: "支持3个参数并返回元素对象",
                  tag: "success"
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
                if ($el_page) {
                  $el_page.remove();
                }
              }
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_addStyle extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_addStyle === "function";
    }
    getApiName() {
      return "GM_addStyle";
    }
    getAsyncApiOption() {
      return {
        name: "GM.addStyle",
        isSupport: this.isSupportGM() && typeof _GM.addStyle === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-GM_addStyle" + apiName,
        title: apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                let fnResult = Reflect.apply(_GM_addStyle, this, args);
                resolve(fnResult);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.addStyle,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          let apiNameTag = data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(async () => {
              let $test = null;
              let $testCSS = null;
              try {
                $test = domUtils.createElement("div", {
                  id: apiNameTag,
                  innerText: apiNameTag + " test"
                });
                document.body.appendChild($test);
                $testCSS = await data.fn(
`
							#${apiNameTag} {
								background-color: rgb(255, 0, 0);
							}
						`
                );
                if ($testCSS == null) {
                  return {
                    text: `${data.name} returns is null`,
                    tag: "error"
                  };
                }
                if (!($testCSS instanceof HTMLStyleElement)) {
                  return {
                    text: `${data.name} returns is not HTMLStyleElement`,
                    tag: "error"
                  };
                }
                const computedStyle = window.getComputedStyle($test);
                if (computedStyle.backgroundColor !== "rgb(255, 0, 0)") {
                  return {
                    text: `${data.name} test element background is not rgb(255, 0, 0)`,
                    tag: "error"
                  };
                }
                return {
                  text: CommonUtil2.escapeHtml("支持添加CSS字符串并返回元素对象"),
                  tag: "success"
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
                $test?.remove();
                $testCSS?.remove();
              }
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_addValueChangeListener extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_addValueChangeListener === "function";
    }
    getApiName() {
      return "GM_addValueChangeListener";
    }
    getAsyncApiOption() {
      return {
        name: "GM.addValueChangeListener",
        isSupport: this.isSupportGM() && typeof _GM.addValueChangeListener === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_addValueChangeListener(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.addValueChangeListener,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          let apiNameTag = data.name;
          data.formList.push(
            (() => {
              let localStorageDataKey = apiNameTag + "_key_1";
              return UIInfo(() => {
                return {
                  text: "测试监听数据存储改变",
                  description: ``,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let timeoutId = void 0;
                    let listenerId = void 0;
                    let tagTextList = [];
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        tagTextList = [];
                        clearTimeout(timeoutId);
                        TagUtil.setTag(container.$leftText, "info", "等待触发回调");
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let delaySetValue = utils.formatTime(Date.now());
                        listenerId = listenerId ?? await data.fn(
                          localStorageDataKey,
                          function(key, oldValue, newValue, remote) {
                            console.log(arguments);
                            clearTimeout(timeoutId);
                            tagTextList.push({
                              tag: "success",
                              text: "支持触发回调"
                            });
                            if (typeof key !== "string") {
                              tagTextList.push({
                                tag: "error",
                                text: `不支持回调参数key,当前类型:${typeof key}`
                              });
                            } else {
                              tagTextList.push({
                                tag: "success",
                                text: `支持回调参数key,当前类型:${typeof key}`
                              });
                            }
                            if (typeof newValue !== typeof delaySetValue) {
                              tagTextList.push({
                                tag: "error",
                                text: `不支持回调参数newValue,当前类型:${typeof delaySetValue}`
                              });
                            } else {
                              tagTextList.push({
                                tag: "success",
                                text: `支持回调参数newValue,当前类型:${typeof delaySetValue}`
                              });
                            }
                            if (typeof remote !== "boolean") {
                              tagTextList.push({
                                tag: "error",
                                text: `不支持回调参数remote,当前类型:${typeof remote}`
                              });
                            } else {
                              tagTextList.push({
                                tag: "success",
                                text: `支持回调参数remote,当前类型:${typeof remote}`
                              });
                            }
                            TagUtil.setTagList(container.$leftText, tagTextList);
                          }
                        );
                        console.log(data.name + " listenerId:" + listenerId + " typeof:" + typeof listenerId);
                        if (typeof listenerId !== "number" && typeof listenerId !== "string") {
                          tagTextList.push({
                            tag: "warn",
                            text: "listenerId类型不是number或string"
                          });
                        } else {
                          tagTextList.push({
                            tag: "success",
                            text: "listenerId类型:" + typeof listenerId
                          });
                        }
                        timeoutId = setTimeout(() => {
                          tagTextList.push({
                            tag: "error",
                            text: "不支持触发回调"
                          });
                          TagUtil.setTagList(container.$leftText, tagTextList);
                        }, 3e3);
                        _GM_setValue(localStorageDataKey, delaySetValue);
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              });
            })()
          );
        });
      }
      return result;
    }
  }
  class ApiTest_cookie extends ApiAsyncTestBase {
    isSupport() {
      return (typeof _GM_cookie === "object" || typeof _GM_cookie === "function") && _GM_cookie != null;
    }
    getApiOption() {
      let isSupport = this.isSupport();
      return {
        isSupportList: isSupport && typeof _GM_cookie.list === "function",
        isSupportSet: isSupport && typeof _GM_cookie.set === "function",
        isSupportDelete: isSupport && typeof _GM_cookie.delete === "function"
      };
    }
    getApiName() {
      return "GM_cookie";
    }
    getAsyncApiOption() {
      let isSupportAsync = this.isSupportGM() && (typeof _GM.cookie === "object" || typeof _GM.cookie === "function") && _GM.cookie != null;
      return {
        name: "GM.cookie",
        isSupport: isSupportAsync,
        isSupportList: isSupportAsync && typeof _GM.cookie.list === "function",
        isSupportSet: isSupportAsync && typeof _GM.cookie.set === "function",
        isSupportDelete: isSupportAsync && typeof _GM.cookie.delete === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiInfo = this.getApiOption();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(
        apiName + ".list",
        `${apiName} & ${apiAsyncInfo.name}`
      )}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: `支持 ${apiName},类型 ${typeof _GM_cookie}`,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      let firstFormList = result["forms"][0].forms;
      if (this.isSupport()) {
        firstFormList.push(
          UIInfo(() => {
            return apiInfo.isSupportList ? {
              text: `支持 ${apiName}.list`,
              tag: "success"
            } : {
              text: `不支持 ${apiName}.list`,
              tag: "error"
            };
          }),
          UIInfo(() => {
            return apiInfo.isSupportSet ? {
              text: `支持 ${apiName}.set`,
              tag: "success"
            } : {
              text: `不支持 ${apiName}.set`,
              tag: "error"
            };
          }),
          UIInfo(() => {
            return apiInfo.isSupportDelete ? {
              text: `支持 ${apiName}.delete`,
              tag: "success"
            } : {
              text: `不支持 ${apiName}.delete`,
              tag: "error"
            };
          })
        );
      }
      if (apiAsyncInfo.isSupport) {
        firstFormList.push(
          UIInfo(() => {
            return apiAsyncInfo.isSupportList ? {
              text: `支持 ${apiAsyncInfo.name}.list`,
              tag: "success"
            } : {
              text: `不支持 ${apiAsyncInfo.name}.list`,
              tag: "error"
            };
          }),
          UIInfo(() => {
            return apiAsyncInfo.isSupportSet ? {
              text: `支持 ${apiAsyncInfo.name}.set`,
              tag: "success"
            } : {
              text: `不支持 ${apiAsyncInfo.name}.set`,
              tag: "error"
            };
          }),
          UIInfo(() => {
            return apiAsyncInfo.isSupportDelete ? {
              text: `支持 ${apiAsyncInfo.name}.delete`,
              tag: "success"
            } : {
              text: `不支持 ${apiAsyncInfo.name}.delete`,
              tag: "error"
            };
          })
        );
      } else {
        firstFormList.push(
          UIInfo(() => {
            return { text: "不支持 " + apiAsyncInfo.name, tag: "error" };
          })
        );
      }
      if (this.isSupport()) {
        let newCookieInfo = {
          name: "test",
          value: "1",
          expirationDate: (Date.now() + 24 * 60 * 60 * 1e3) / 1e3
        };
        [
          {
            name: apiName,
            list: async (...args) => {
              return new Promise((resolve, reject) => {
                const [details, cb] = args;
                _GM_cookie.list(details, (cookies, error) => {
                  if (error) {
                    reject(error);
                  } else {
                    resolve(cookies);
                  }
                });
              });
            },
            set: async (...args) => {
              return new Promise((resolve, reject) => {
                const [details, cb] = args;
                _GM_cookie.set(details, (error) => {
                  if (error) {
                    reject(error);
                  } else {
                    resolve(void 0);
                  }
                });
              });
            },
            delete: async (...args) => {
              return new Promise((resolve, reject) => {
                const [details, cb] = args;
                _GM_cookie.delete(details, (error) => {
                  if (error) {
                    reject(error);
                  } else {
                    resolve(void 0);
                  }
                });
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            list: _GM.cookie?.list,
            set: _GM.cookie?.set,
            delete: _GM.cookie?.delete,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name;
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil2.escapeHtml("测试list获取所有Cookie"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        const cookies = await data.list({});
                        console.log(cookies);
                        if (Array.isArray(cookies)) {
                          __pops.alert({
                            title: {
                              text: data.name + ".list",
                              position: "center"
                            },
                            content: {
                              text: JSON.stringify(cookies, null, 4),
                              html: true
                            },
                            drag: true,
                            mask: {
                              enable: true
                            },
                            width: PanelUISize.setting.width,
                            height: PanelUISize.setting.height,
                            style: (
`
															.pops-alert-content{
																white-space: pre-wrap;
															}
														`
                            )
                          });
                        } else {
                          alert("获取的cookie信息不是数组");
                        }
                      } catch (error) {
                        qmsg.error(error.toString(), {
                          consoleLogContent: true
                        });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil2.escapeHtml("测试set新增Cookie"),
                  tag: "info",
                  description: JSON.stringify(newCookieInfo),
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        await data.set(newCookieInfo);
                        qmsg.success(data.name + " set cookie success");
                      } catch (error) {
                        qmsg.error(error.toString(), {
                          consoleLogContent: true
                        });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            }),
            UIInfo(() => {
              try {
                let deleteCookieInfo = {
                  name: "test"
                };
                return {
                  text: CommonUtil2.escapeHtml("测试delete删除Cookie"),
                  tag: "info",
                  description: JSON.stringify(deleteCookieInfo),
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        await data.delete(deleteCookieInfo);
                        qmsg.success(data.name + " delete cookie success");
                      } catch (error) {
                        qmsg.error(error.toString(), {
                          consoleLogContent: true
                        });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_deleteValue extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_deleteValue === "function";
    }
    getApiName() {
      return "GM_deleteValue";
    }
    getAsyncApiOption() {
      return {
        name: "GM.deleteValue",
        isSupport: this.isSupportGM() && typeof _GM.deleteValue === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.name ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_deleteValue(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.deleteValue,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          let apiNameTag = data.name;
          data.formList.push(
            (() => {
              let localStorageDataKey = `Test ${apiNameTag} null`;
              let localStorageDataValue = null;
              return UIInfo(() => {
                return {
                  text: "测试存储null值并删除",
                  description: `"${localStorageDataKey}": ${localStorageDataValue}`,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        _GM_setValue(localStorageDataKey, localStorageDataValue);
                        await data.fn(localStorageDataKey);
                        let value = _GM_getValue(localStorageDataKey);
                        if (typeof value === "object" && value === null) {
                          qmsg.error("该值未删除,读取的值:" + value);
                        } else {
                          qmsg.success("成功删除该值");
                        }
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              });
            })()
          );
        });
      }
      return result;
    }
  }
  class ApiTest_deleteValues extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_deleteValues === "function";
    }
    getApiName() {
      return "GM_deleteValues";
    }
    getAsyncApiOption() {
      return {
        name: "GM.deleteValues",
        isSupport: this.isSupportGM() && typeof _GM.deleteValues === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_deleteValues(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.deleteValues,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name;
          data.formList.push(
            (() => {
              let localStorageDataValue = {
                GM_deleteValues_key_1: 555,
                "GM.deleteValues_key_2": 666
              };
              return UIInfo(() => {
                return {
                  text: "测试存储对象然后删除再读取",
                  description: `${JSON.stringify(localStorageDataValue)}`,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        _GM_setValues(localStorageDataValue);
                        let localKeys = Object.keys(localStorageDataValue);
                        let values = _GM_getValues(localKeys);
                        if (JSON.stringify(values) !== JSON.stringify(localStorageDataValue)) {
                          qmsg.error("写入失败,写入的数据和读取的数据不相同");
                          return;
                        }
                        await data.fn(localKeys);
                        let values2 = _GM_getValues(localKeys);
                        if (values2 == null) {
                          qmsg.warning("删除情况未知,因为读取到的数据为null");
                        } else if (typeof values2 === "object" && JSON.stringify(values2) === "{}") {
                          qmsg.success("删除成功,读取的数据为{}");
                        } else {
                          qmsg.error("删除情况未知,因为读取到的数据类型不是object");
                          console.log(values2);
                        }
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              });
            })()
          );
        });
      }
      return result;
    }
  }
  class ApiTest_download extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_download === "function";
    }
    getApiName() {
      return "GM_download";
    }
    getAsyncApiOption() {
      return {
        name: "GM.download",
        isSupport: this.isSupportGM() && typeof _GM.download === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        result["forms"][1].forms.push(
          UIInfo(() => {
            return {
              text: CommonUtil2.escapeHtml("TODO"),
              tag: "info",
              afterRender(container) {
                container.target?.querySelector(".support-info");
              }
            };
          })
        );
      }
      return result;
    }
  }
  class ApiTest_getResourceText extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getResourceText === "function";
    }
    getApiName() {
      return "GM_getResourceText";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getResourceText",
        isSupport: this.isSupportGM() && typeof _GM.getResourceText === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_getResourceText(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getResourceText,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(async () => {
              try {
                let resourceText = await data.fn("ViewerCSS");
                if (typeof resourceText === "string") {
                  return {
                    text: CommonUtil2.escapeHtml("支持通过@resource引用资源字符串"),
                    tag: "success"
                  };
                } else {
                  return {
                    text: CommonUtil2.escapeHtml(data.name + " return is not string"),
                    tag: "error"
                  };
                }
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_getResourceUrl extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getResourceURL === "function";
    }
    getApiName() {
      return "GM_getResourceURL";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getResourceUrl",
        isSupport: this.isSupportGM() && typeof _GM.getResourceUrl === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                let fnResult = Reflect.apply(_GM_getResourceURL, this, args);
                resolve(fnResult);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getResourceUrl,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(async () => {
              try {
                let resourceBase64Data = await data.fn("ViewerCSS");
                if (typeof resourceBase64Data !== "string") {
                  return {
                    text: CommonUtil2.escapeHtml(`${data.name} return is not string`),
                    tag: "error"
                  };
                }
                resourceBase64Data = resourceBase64Data.trim();
                if (resourceBase64Data.startsWith("data:text/css;base64")) {
                  if (resourceBase64Data.startsWith(
                    "data:text/css;base64,LyohCiAqIFZpZXdlci5qcyB2MS4xMS43CiAqIGh0dHBzOi8vZmVuZ3"
                  )) {
                    return {
                      text: CommonUtil2.escapeHtml("支持通过@resource引用资源并进行base64编码"),
                      tag: "success"
                    };
                  } else {
                    return {
                      text: CommonUtil2.escapeHtml(
                        "支持通过@resource引用资源并进行base64编码,但是base64编码的实现方式不同"
                      ),
                      tag: "warn"
                    };
                  }
                } else {
                  return {
                    text: CommonUtil2.escapeHtml("支持通过@resource引用资源,但是未对资源进行base64编码"),
                    tag: "warn"
                  };
                }
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_getTab extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getTab === "function";
    }
    getApiName() {
      return "GM_getTab";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getTab",
        isSupport: this.isSupportGM() && typeof _GM.getTab === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async () => {
              return new Promise((resolve) => {
                _GM_getTab((...args) => {
                  resolve(...args);
                });
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getTab,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(() => {
              return {
                text: "测试获取当前Tab",
                description: "",
                tag: "info",
                afterRender(container) {
                  let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                    false,
                    false
                  );
                  domUtils.after(container.$leftContainer, $button);
                  let timeId;
                  domUtils.on($button, "click", async (event) => {
                    utils.preventEvent(event);
                    try {
                      clearTimeout(timeId);
                      TagUtil.setTag(container.$leftText, "error", "等待3s内触发回调函数");
                      timeId = setTimeoutLog(() => {
                        TagUtil.setTag(container.$leftText, "error", "超时,不支持触发回调函数");
                      }, 3e3);
                      let tab = await data.fn();
                      clearTimeout(timeId);
                      console.log(data.name + " callback tab", tab);
                      if (typeof tab === "object" && tab != null) {
                        TagUtil.setTagList(container.$leftText, [
                          {
                            tag: "success",
                            text: "支持触发回调函数"
                          },
                          {
                            tag: "success",
                            text: "入参tab为object类型"
                          }
                        ]);
                      } else {
                        TagUtil.setTagList(container.$leftText, [
                          {
                            tag: "success",
                            text: "支持触发回调函数"
                          },
                          {
                            tag: "error",
                            text: "入参tab不为object类型"
                          }
                        ]);
                      }
                      alert(JSON.stringify(tab));
                    } catch (error) {
                      qmsg.error(error.toString(), { consoleLogContent: true });
                    }
                  });
                }
              };
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_getTabs extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getTabs === "function";
    }
    getApiName() {
      return "GM_getTabs";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getTabs",
        isSupport: this.isSupportGM() && typeof _GM.getTabs === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async () => {
              return new Promise((resolve) => {
                _GM_getTabs((...args) => {
                  resolve(...args);
                });
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getTabs,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(() => {
              return {
                text: "测试获取所有Tab",
                description: "",
                tag: "info",
                afterRender(container) {
                  let $button = domUtils.parseHTML(
`
								<div class="pops-panel-button pops-panel-button-no-icon">
									<button class="pops-panel-button_inner" type="button" data-type="default">
										<i class="pops-bottom-icon" is-loading="false"></i>
										<span class="pops-panel-button-text">点击测试</span>
									</button>
								</div>
								`,
                    false,
                    false
                  );
                  domUtils.after(container.$leftContainer, $button);
                  let timeId;
                  domUtils.on($button, "click", async (event) => {
                    try {
                      utils.preventEvent(event);
                      clearTimeout(timeId);
                      TagUtil.setTag(container.$leftText, "error", "等待3s内触发回调函数");
                      timeId = setTimeoutLog(() => {
                        TagUtil.setTag(container.$leftText, "error", "超时,不支持触发回调函数");
                      }, 3e3);
                      let tabs = await data.fn();
                      clearTimeout(timeId);
                      console.log(data.name + " callback tabs", tabs);
                      if (typeof tabs === "object" && tabs != null) {
                        TagUtil.setTagList(container.$leftText, [
                          {
                            tag: "success",
                            text: "支持触发回调函数"
                          },
                          {
                            tag: "success",
                            text: "入参tab为object类型"
                          }
                        ]);
                      } else {
                        TagUtil.setTagList(container.$leftText, [
                          {
                            tag: "success",
                            text: "支持触发回调函数"
                          },
                          {
                            tag: "error",
                            text: "入参tab不为object类型"
                          }
                        ]);
                      }
                      alert(JSON.stringify(tabs));
                    } catch (error) {
                      qmsg.error(error.toString(), { consoleLogContent: true });
                    }
                  });
                }
              };
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_getValue extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getValue === "function";
    }
    getApiName() {
      return "GM_getValue";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getValue",
        isSupport: this.isSupportGM() && typeof _GM.getValue === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_getValue(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getValue,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          let apiNameTag = data.name;
          data.formList.push(
            ...[
              {
                key: `Test ${apiNameTag} boolean`,
                value: true,
                text: function() {
                  return `存储boolean类型并读取`;
                },
                desc: function() {
                  return `"${this.key}": ${this.value}`;
                }
              },
              {
                key: `Test ${apiNameTag} number`,
                value: 1,
                text: function() {
                  return `存储number类型并读取`;
                },
                desc: function() {
                  return `"${this.key}": ${this.value}`;
                }
              },
              {
                key: `Test ${apiNameTag} string`,
                value: "测试字符串",
                text: function() {
                  return `存储string类型并读取`;
                },
                desc: function() {
                  return `"${this.key}": "${this.value}"`;
                }
              },
              {
                key: `Test ${apiNameTag} undefined`,
                value: void 0,
                text: function() {
                  return `存储undefined类型并读取`;
                },
                desc: function() {
                  return `"${this.key}": ${this.value}`;
                }
              },
              {
                key: `Test ${apiNameTag} null`,
                value: null,
                text: function() {
                  return `存储object类型的null并读取`;
                },
                desc: function() {
                  return `"${this.key}": ${this.value}`;
                }
              },
              {
                key: `Test ${apiNameTag} object`,
                value: { "object key": "object value" },
                text: function() {
                  return `存储object类型并读取`;
                },
                desc: function() {
                  return `"${this.key}": ${JSON.stringify(this.value)}`;
                }
              }
            ].map((it) => {
              return (() => {
                let localStorageDataKey = it.key;
                let localStorageDataValue = it.value;
                return UIInfo(() => {
                  return {
                    text: it.text(),
                    description: it.desc(),
                    tag: "info",
                    afterRender(container) {
                      let $button = domUtils.parseHTML(
`
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                        false,
                        false
                      );
                      domUtils.after(container.$leftContainer, $button);
                      domUtils.on($button, "click", async (event) => {
                        utils.preventEvent(event);
                        try {
                          _GM_setValue(localStorageDataKey, localStorageDataValue);
                          let value = await data.fn(localStorageDataKey);
                          if (typeof value === typeof localStorageDataValue) {
                            if (localStorageDataValue === null && localStorageDataValue != value) {
                              qmsg.error(
                                "读取成功,但存储类型和读取类型不同,存储类型为null,但读取类型不为null"
                              );
                              return;
                            }
                            qmsg.success("读取成功,存储类型和读取类型一致");
                          } else {
                            qmsg.error("读取成功,但存储类型和读取类型不同");
                          }
                        } catch (error) {
                          qmsg.error(error.toString(), { consoleLogContent: true });
                        }
                      });
                    }
                  };
                });
              })();
            }),
            (() => {
              let localStorageDataKey = `Test ${apiNameTag} null with defaultValue`;
              let localStorageDefaultValue = 123;
              return UIInfo(() => {
                return {
                  text: "存储object类型的null,读取时指定默认值为" + localStorageDefaultValue,
                  description: `${apiNameTag}("${localStorageDataKey}", ${localStorageDefaultValue})`,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        await data.fn(localStorageDataKey, null);
                        let value = await data.fn(localStorageDataKey, localStorageDefaultValue);
                        if (typeof value === "object" && value == null) {
                          qmsg.success("读取的值是存储的值:" + value);
                        } else {
                          qmsg.error("读取的值不是存储的值:" + value);
                        }
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              });
            })(),
            (() => {
              let localStorageDataKey = `Test ${apiNameTag} defaultValue`;
              let localStorageDefaultValue = 123;
              return UIInfo(() => {
                return {
                  text: "不存储,测试调用默认值",
                  description: `${apiNameTag}("${localStorageDataKey}", ${localStorageDefaultValue})`,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        let value = await data.fn(localStorageDataKey, localStorageDefaultValue);
                        if (typeof value === typeof localStorageDefaultValue) {
                          qmsg.success("读取的值是默认值:" + value);
                        } else {
                          qmsg.error("读取的值不是默认值:" + value);
                        }
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              });
            })()
          );
        });
      }
      return result;
    }
  }
  class ApiTest_getValues extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getValues === "function";
    }
    getApiName() {
      return "GM_getValues";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getValues",
        isSupport: this.isSupportGM() && typeof _GM.getValues === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_getValues(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getValues,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          let apiNameTag = data.name;
          data.formList.push(
            (() => {
              return UIInfo(() => {
                return {
                  text: "测试直接读取",
                  description: "没有入参",
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        let value = await data.fn();
                        qmsg.info("请在控制台查看读取的数据");
                        console.log(value);
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              });
            })(),
            (() => {
              return UIInfo(() => {
                let localStorageDataValue = utils.toJSON(`{
								"${apiNameTag}-test-key-non-exists-1": 1111,
								"${apiNameTag}-test-key-non-exists-2": 2222,
							}`);
                return {
                  text: "测试读取不存在的数据",
                  description: "数据默认值:" + JSON.stringify(localStorageDataValue),
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        let value = await data.fn(localStorageDataValue);
                        console.log(value);
                        if (value == null) {
                          qmsg.error("读取失败,读取的数据为null");
                        } else if (JSON.stringify(value) === JSON.stringify(localStorageDataValue)) {
                          qmsg.success("读取成功,读取的数据和默认值相同");
                        } else {
                          qmsg.error("读取成功,但读取的数据和默认值不同");
                        }
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              });
            })(),
            (() => {
              let localStorageDataValue = utils.toJSON(`{
							"${apiNameTag}-test-key-1": 1,
							"${apiNameTag}-test-key-2": 2,
						}`);
              return UIInfo(() => {
                return {
                  text: "测试存储对象并读取",
                  description: JSON.stringify(localStorageDataValue),
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        _GM_setValues(localStorageDataValue);
                        let keys = Object.keys(localStorageDataValue);
                        let value = await data.fn(keys);
                        console.log(value);
                        if (value == null) {
                          qmsg.error("读取失败,读取的数据为null");
                        } else if (JSON.stringify(value) === JSON.stringify(localStorageDataValue)) {
                          qmsg.success("读取成功,写入的数据和读取的数据相同");
                        } else {
                          qmsg.error("读取成功,但写入的数据和读取的数据不同");
                        }
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              });
            })()
          );
        });
      }
      return result;
    }
  }
  class ApiTest_info extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_info === "object" && _GM_info != null;
    }
    getApiName() {
      return "GM_info";
    }
    getAsyncApiOption() {
      return {
        name: "GM.info",
        isSupport: this.isSupportGM() && typeof _GM.info === "object"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(GM)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: _GM_info,
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.info,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name;
          data.formList.push(
            ...[
              {
                value: data.fn?.downloadMode,
                type: "string",
                text: `${data.name}.downloadMode`,
                notExistsTag: "error"
              },
              {
                value: data.fn?.scriptHandler,
                type: "string",
                text: `${data.name}.scriptHandler`
              },
              {
                value: data.fn?.scriptMetaStr,
                type: "string",
                text: `${data.name}.scriptMetaStr`
              },
              {
                value: data.fn?.version,
                type: "string",
                text: `${data.name}.version`
              },
              {
                value: data.fn?.script,
                type: "object",
                text: `${data.name}.script`
              },
              {
                value: data.fn?.script?.name,
                type: "string",
                text: `${data.name}.script.name`
              },
              {
                value: data.fn?.script?.author,
                type: "string",
                text: `${data.name}.script.author`
              },
              {
                value: data.fn?.script?.description,
                type: "string",
                text: `${data.name}.script.description`
              },
              {
                value: data.fn?.script?.version,
                type: "string",
                text: `${data.name}.script.version`
              }
            ].map(
              (it) => UIInfo(() => {
                try {
                  if (it.value != null && typeof it.value === it.type) {
                    return {
                      text: "支持 " + it.text + " 类型:" + it.type,
                      tag: "success"
                    };
                  } else {
                    return {
                      text: "不支持 " + it.text + " 类型:" + it.type,
                      tag: it.notExistsTag ?? "error"
                    };
                  }
                } catch (error) {
                  console.error(error);
                  return {
                    text: "执行错误 " + error,
                    tag: "error"
                  };
                } finally {
                }
              })
            )
          );
        });
      }
      return result;
    }
  }
  class ApiTest_listValues extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_listValues === "function";
    }
    getApiName() {
      return "GM_listValues";
    }
    getAsyncApiOption() {
      return {
        name: "GM.listValues",
        isSupport: this.isSupportGM() && typeof _GM.listValues === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_listValues(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.listValues,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name;
          data.formList.push(
            UIInfo(() => {
              return {
                text: "查看存储的所有键名",
                tag: "info",
                afterRender(container) {
                  let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                    false,
                    false
                  );
                  domUtils.after(container.$leftContainer, $button);
                  domUtils.on($button, "click", async (event) => {
                    utils.preventEvent(event);
                    try {
                      let ret = await data.fn();
                      console.log(data.name + " call result", ret);
                      if (Array.isArray(ret)) {
                        let isNotTotalStr = ret.find((it) => typeof it !== "string");
                        if (isNotTotalStr) {
                          qmsg.error("返回值数组中存在非string类型");
                        } else {
                          alert(JSON.stringify(ret, null, 4));
                        }
                      } else {
                        qmsg.error("返回值不是数组");
                      }
                    } catch (error) {
                      qmsg.error(error.toString(), { consoleLogContent: true });
                    }
                  });
                }
              };
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_log extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_log === "function";
    }
    getApiName() {
      return "GM_log";
    }
    getAsyncApiOption() {
      return {
        name: "GM.log",
        isSupport: this.isSupportGM() && typeof _GM.log === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_log(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.log,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name;
          data.formList.push(
            UIInfo(() => {
              try {
                let logText = "test " + data.name;
                return {
                  text: CommonUtil2.escapeHtml("请在控制台查看输出"),
                  tag: "info",
                  description: "test " + data.name,
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        await data.fn(logText);
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_notification extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_notification === "function";
    }
    getApiName() {
      return "GM_notification";
    }
    getAsyncApiOption() {
      return {
        name: "GM.notification",
        isSupport: this.isSupportGM() && typeof _GM.notification === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (details) => {
              return new Promise((resolve) => {
                let originClick = details.onclick;
                let fnResult = _GM_notification({
                  ...details,
                  onclick(...args) {
                    if (typeof originClick === "function") {
                      Reflect.apply(originClick, this, args);
                    }
                    resolve(fnResult ?? true);
                  }
                });
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.notification,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil2.escapeHtml("点击通知的内容测试url"),
                  tag: "info",
                  description: "https://example.com/",
                  afterRender(container) {
                    let $target = container.target;
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        await data.fn({
                          title: `测试 ${data.name} 标题`,
                          text: `测试 ${data.name} 内容`,
                          url: "https://example.com/"
                        });
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              }
            }),
            UIInfo(() => {
              try {
                let $target = void 0;
                let $info = void 0;
                let isClick = false;
                let isDone = false;
                return {
                  text: "测试通知的timeout",
                  description: "请勿点击通知",
                  tag: "info",
                  afterRender(container) {
                    $target = container.target;
                    $info = container.$leftContainer;
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    let timeId = void 0;
                    let updateText = utils.debounce(() => {
                      try {
                        clearTimeout(timeId);
                        let clickText = "测试成功,触发";
                        let clickTag = "success";
                        domUtils.html(
                          container.$leftText,
`<p class="${clickTag}">${clickText}</p>`
                        );
                        isClick = false;
                        isDone = false;
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    }, 800);
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        clearTimeout(timeId);
                        let timeCount = 10;
                        let calcTimeCount = timeCount;
                        let tipInfoText = () => {
                          let result2 = `正在等待触发超时:5000ms`;
                          calcTimeCount--;
                          return result2;
                        };
                        TagUtil.setTag(container.$leftText, "info", tipInfoText());
                        timeId = setTimeoutLog(() => {
                          TagUtil.setTag(container.$leftText, "error", "测试超时,未触发ondone回调");
                        }, timeCount * 1e3);
                        const clicked = await data.fn({
                          title: `测试 ${data.name} 标题`,
                          text: `测试 ${data.name} 内容`,
                          url: "https://example.com/",
                          timeout: 5e3,
                          ondone() {
                            updateText();
                          }
                        });
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                    domUtils.after($info, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            }),
            UIInfo(() => {
              try {
                let $target = void 0;
                let $info = void 0;
                let isClick = false;
                let isPrevent = false;
                let isDone = false;
                let text = "点击通知的内容测试onclick、ondone函数";
                let desc = "https://example.com/";
                return {
                  text,
                  description: desc,
                  tag: "info",
                  afterRender(container) {
                    $target = container.target;
                    $info = container.$leftContainer;
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    let timeId = void 0;
                    let intervalId = void 0;
                    let updateText = utils.debounce(() => {
                      try {
                        clearTimeout(timeId);
                        clearInterval(intervalId);
                        let clickText = "";
                        let clickTag = "success";
                        let doneText = "";
                        let doneTag = "success";
                        if (isClick) {
                          clickText += "支持 onclick 函数";
                          if (isPrevent) {
                            clickText = clickText.trim();
                            clickText += "且支持提供 event 参数";
                          } else {
                            clickText += "但是不支持提供 event 参数";
                            clickTag = "warn";
                          }
                        } else {
                          clickText += "不支持 onclick 函数";
                          clickTag = "error";
                        }
                        if (isDone) {
                          doneText += "支持 ondone 函数";
                        } else {
                          doneText += "不支持 ondone 函数";
                          doneTag = "error";
                        }
                        domUtils.html(
                          container.$leftText,
`
												<p class="${clickTag}">${clickText}</p>
												<p class="${doneTag}">${doneText}</p>`
                        );
                        isClick = false;
                        isDone = false;
                        isPrevent = false;
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    }, 800);
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        clearTimeout(timeId);
                        clearInterval(intervalId);
                        let timeCount = 10;
                        let calcTimeCount = timeCount;
                        let tipInfoText = () => {
                          let result2 = `正在等待触发回调,请在规定时间内点击弹窗的【关闭】按钮或者内容:${calcTimeCount}s`;
                          calcTimeCount--;
                          return result2;
                        };
                        domUtils.text(container.$leftText, tipInfoText());
                        domUtils.text(container.$leftDesc, text);
                        domUtils.show(container.$leftDesc, false);
                        timeId = setTimeoutLog(() => {
                          clearInterval(intervalId);
                          TagUtil.setTag(container.$leftText, "error", "测试超时,未触发回调");
                        }, timeCount * 1e3);
                        intervalId = setInterval(() => {
                          domUtils.text(container.$leftText, tipInfoText());
                        }, 1e3);
                        await data.fn({
                          title: `测试 ${data.name} 标题`,
                          text: `测试 ${data.name} 内容`,
                          url: "https://example.com/",
                          onclick: (event2) => {
                            console.log(event2);
                            isClick = true;
                            if (event2 && typeof event2.preventDefault === "function") {
                              isPrevent = true;
                              event2.preventDefault();
                            }
                            updateText();
                          },
                          ondone() {
                            isDone = true;
                            updateText();
                          }
                        });
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                    domUtils.after($info, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            }),
            UIInfo(() => {
              try {
                let $target = void 0;
                let $info = void 0;
                let isClick = false;
                let isPrevent = false;
                let isDone = false;
                let beforeContent = "123";
                let afterContent = "456";
                let tag = "notification_tag_" + Date.now();
                let notificationOption = {
                  title: "测试通知的内容更新(tag)",
                  text: beforeContent,
                  tag
                };
                let desc = `更新前:${beforeContent},更新后:${afterContent}`;
                return {
                  text: notificationOption.title,
                  description: desc,
                  tag: "info",
                  afterRender(container) {
                    $target = container.target;
                    $info = container.$leftContainer;
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    let timeId = void 0;
                    let intervalId = void 0;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        clearTimeout(timeId);
                        clearInterval(intervalId);
                        let timeCount = 5;
                        let calcTimeCount = timeCount;
                        let tipInfoText = () => {
                          let result2 = `${calcTimeCount}s后通知的内容将更新为:${afterContent}`;
                          calcTimeCount--;
                          return result2;
                        };
                        domUtils.text(container.$leftDesc, tipInfoText());
                        domUtils.show(container.$leftDesc, false);
                        timeId = setTimeout(async () => {
                          clearInterval(intervalId);
                          domUtils.text(container.$leftDesc, desc);
                          data.fn({
                            ...notificationOption,
                            text: afterContent
                          });
                        }, timeCount * 1e3);
                        intervalId = setInterval(() => {
                          domUtils.text(container.$leftDesc, tipInfoText());
                        }, 1e3);
                        await data.fn(notificationOption);
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                    domUtils.after($info, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_openInTab extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_openInTab === "function";
    }
    getApiName() {
      return "GM_openInTab";
    }
    getAsyncApiOption() {
      return {
        name: "GM.openInTab",
        isSupport: this.isSupportGM() && typeof _GM.openInTab === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_openInTab(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.openInTab,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: "后台打开:https://www.example.com/",
                  tag: "info",
                  afterRender(container) {
                    let $target = container.target;
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let result2 = await data.fn("https://www.example.com/");
                        if (typeof result2 === "object") {
                          if (result2 == null) {
                            TagUtil.setTag(container.$leftText, "error", "返回值为null");
                          } else {
                            let support_close = "close" in result2 && typeof result2.close === "function";
                            let support_closed = "closed" in result2 && typeof result2.closed === "boolean";
                            let support_onclose = "onclose" in result2;
                            domUtils.html(
                              container.$leftText,
`
													${support_close ? `<p class="success">支持 .close()</p>` : `<p class="error">不支持 .close()</p>`}
													${support_closed ? `<p class="success">支持 .closed</p>` : `<p class="error">不支持 .closed</p>`}
													${support_onclose ? `<p class="success">支持设置属性 .onclose</p>` : `<p class="error">不支持设置属性 .onclose</p>`}
										`
                            );
                          }
                        } else {
                          TagUtil.setTag(container.$leftText, "error", "返回值不是对象:" + typeof result2);
                        }
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: "配置 active: true",
                  description: "",
                  tag: "info",
                  afterRender(container) {
                    let $target = container.target;
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    let timeId;
                    let blurEvent = () => {
                      clearTimeout(timeId);
                      TagUtil.setTag(container.$leftText, "success", "测试新标签页打开成功");
                    };
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        domUtils.off(_unsafeWindow, "blur", blurEvent, {
                          capture: true
                        });
                        clearTimeout(timeId);
                        TagUtil.setTag(container.$leftText, "info", "等待页面失去焦点...");
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        domUtils.on(_unsafeWindow, "blur", blurEvent, {
                          capture: true,
                          once: true
                        });
                        await data.fn("https://www.example.com/", {
                          active: true
                        });
                        timeId = setTimeoutLog(() => {
                          domUtils.off(_unsafeWindow, "blur", blurEvent, {
                            capture: true
                          });
                          TagUtil.setTag(container.$leftText, "error", "测试超时,未打开新标签页并获取焦点");
                        }, 3e3);
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: "测试调用返回值 .close()",
                  tag: "info",
                  afterRender(container) {
                    let $target = container.target;
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    let timeId;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        clearTimeout(timeId);
                        TagUtil.setTag(container.$leftText, "info", "等待调用 .close()");
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let result2 = await data.fn("https://www.example.com/");
                        if (result2 && typeof result2?.close === "function") {
                          timeId = setTimeoutLog(() => {
                            try {
                              result2.close();
                              TagUtil.setTag(container.$leftText, "success", "成功调用 .close()");
                            } catch (error) {
                              TagUtil.setTag(container.$leftText, "error", "调用 .close() 方法失败 " + error);
                            }
                          }, 1e3);
                        } else {
                          TagUtil.setTag(container.$leftText, "error", "返回对象中不支持 .close() 方法");
                        }
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: "测试监听关闭是否生效 .onclose",
                  tag: "info",
                  afterRender(container) {
                    let $target = container.target;
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    let timeId;
                    let timeId2;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        clearTimeout(timeId2);
                        clearTimeout(timeId);
                        TagUtil.setTag(container.$leftText, "info", "等待触发监听 .onclose");
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let result2 = await data.fn("https://www.example.com/");
                        if (typeof result2 === "object" && result2 != null) {
                          result2.onclose = () => {
                            clearTimeout(timeId);
                            clearTimeout(timeId2);
                            TagUtil.setTag(container.$leftText, "success", "成功触发 .onclose");
                          };
                        }
                        if (result2 && typeof result2?.close === "function") {
                          timeId = setTimeoutLog(() => {
                            try {
                              result2.close();
                              timeId2 = setTimeoutLog(() => {
                                TagUtil.setTag(container.$leftText, "error", "测试超时,未触发回调 .onclose");
                              }, 2e3);
                            } catch (error) {
                              TagUtil.setTag(container.$leftText, "error", "调用 .close() 方法失败 " + error);
                            }
                          }, 1e3);
                        } else {
                          TagUtil.setTag(container.$leftText, "error", "返回对象中不支持 .close() 方法");
                        }
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              }
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_registerMenuCommand extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_registerMenuCommand === "function";
    }
    getApiName() {
      return "GM_registerMenuCommand";
    }
    getAsyncApiOption() {
      return {
        name: "GM.registerMenuCommand",
        isSupport: this.isSupportGM() && typeof _GM.registerMenuCommand === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_registerMenuCommand(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.registerMenuCommand,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: "注册菜单 ==> Test Menu",
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let timeId;
                    let intervalId;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        clearTimeout(timeId);
                        clearInterval(intervalId);
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let intervalCheckCount = 10;
                        let setCheckText = () => {
                          let result2 = `已执行注册菜单,请在${intervalCheckCount}s内点击菜单项`;
                          intervalCheckCount--;
                          return result2;
                        };
                        TagUtil.setTag(container.$leftText, "info", setCheckText());
                        intervalId = setInterval(() => {
                          TagUtil.setTag(container.$leftText, "info", setCheckText());
                        }, 1e3);
                        timeId = setTimeoutLog(() => {
                          clearInterval(intervalId);
                          TagUtil.setTag(container.$leftText, "error", "测试超时,未触发回调");
                        }, 10 * 1e3);
                        const menuCommandId = await data.fn("Test Menu", (event2) => {
                          try {
                            clearInterval(intervalId);
                            clearTimeout(timeId);
                            TagUtil.clearTag(container.$leftText);
                            let checkResultText = [];
                            checkResultText.push({
                              tag: "success",
                              text: "支持注册菜单"
                            });
                            if (event2) {
                              checkResultText.push({
                                tag: "success",
                                text: "支持点击回调且有event参数"
                              });
                            } else {
                              checkResultText.push({
                                tag: "warn",
                                text: "支持点击回调但是没有event参数"
                              });
                            }
                            if (typeof menuCommandId === "number" || typeof menuCommandId === "string") {
                              checkResultText.push({
                                tag: "success",
                                text: "函数返回值是string|number"
                              });
                            } else {
                              checkResultText.push({
                                tag: "error",
                                text: "函数返回值不是string|number:" + typeof menuCommandId
                              });
                            }
                            domUtils.html(
                              container.$leftText,
                              checkResultText.map((it) => `<p class="${it.tag}">${it.text}</p>`).join("\n")
                            );
                          } catch (error) {
                            qmsg.error(error.toString(), {
                              consoleLogContent: true
                            });
                          }
                        });
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: "注册并更新菜单 ==> Test Update Menu",
                  description: "请自行验证是否成功更新菜单文字为:Test Update Menu Success!!!",
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let timeId;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        clearTimeout(timeId);
                        const menuCommandId = await data.fn("Test Update Menu", (event2) => {
                        });
                        qmsg.info("已注册菜单,3s后自动更新", {
                          timeout: 3e3
                        });
                        clearTimeout(timeId);
                        timeId = setTimeoutLog(async () => {
                          await data.fn("Test Update Menu Success!!!", () => {
                          }, {
                            id: menuCommandId
                          });
                          qmsg.success("已执行更新菜单命令,请自行验证");
                        }, 3e3);
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_removeValueChangeListener extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_removeValueChangeListener === "function";
    }
    getApiName() {
      return "GM_removeValueChangeListener";
    }
    getAsyncApiOption() {
      return {
        name: "GM.removeValueChangeListener",
        isSupport: this.isSupportGM() && typeof _GM.removeValueChangeListener === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_removeValueChangeListener(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.removeValueChangeListener,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name;
          data.formList.push(
            (() => {
              let localStorageDataKey = apiName + "_key_1";
              return UIInfo(() => {
                return {
                  text: "测试移除监听器",
                  description: ``,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let tagTextList = [];
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        tagTextList = [];
                        TagUtil.setTag(container.$leftText, "info", "等待移除监听器");
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let delaySetValue = utils.formatTime(Date.now());
                        let listenerId = _GM_addValueChangeListener(
                          localStorageDataKey,
                          function(key, oldValue, newValue, remote) {
                            console.log(arguments);
                            tagTextList.push({
                              tag: "error",
                              text: "未成功移除监听器"
                            });
                            TagUtil.setTagList(container.$leftText, tagTextList);
                          }
                        );
                        await data.fn(listenerId);
                        tagTextList.push({
                          tag: "success",
                          text: "支持移除监听器"
                        });
                        TagUtil.setTagList(container.$leftText, tagTextList);
                        _GM_setValue(localStorageDataKey, delaySetValue);
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              });
            })()
          );
        });
      }
      return result;
    }
  }
  class ApiTest_saveTab extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_saveTab === "function";
    }
    getApiName() {
      return "GM_saveTab";
    }
    getAsyncApiOption() {
      return {
        name: "GM.saveTab",
        isSupport: this.isSupportGM() && typeof _GM.saveTab === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        result["forms"][1].forms.push(
          UIInfo(() => {
            try {
              return {
                text: CommonUtil2.escapeHtml("TODO"),
                tag: "info"
              };
            } catch (error) {
              console.error(error);
              return {
                text: "执行错误 " + error,
                tag: "error"
              };
            } finally {
            }
          })
        );
      }
      return result;
    }
  }
  class ApiTest_setClipboard extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_setClipboard === "function";
    }
    getApiName() {
      return "GM_setClipboard";
    }
    getAsyncApiOption() {
      return {
        name: "GM.setClipboard",
        isSupport: this.isSupportGM() && typeof _GM.setClipboard === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                if (typeof args[2] === "function") {
                  const cb = args[2];
                  args[2] = (...args2) => {
                    cb(...args2);
                    resolve(void 0);
                  };
                }
                _GM_setClipboard(...args);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: async (...args) => {
              const cb = args[2];
              await _GM.setClipboard(...args);
              if (typeof cb === "function") {
                cb();
              }
            },
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.formList.push(
            UIInfo(() => {
              return {
                text: "复制内容到剪贴板:Test " + data.name,
                tag: "info",
                afterRender(container) {
                  let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                    false,
                    false
                  );
                  domUtils.after(container.$leftContainer, $button);
                  let timeId;
                  domUtils.on($button, "click", async (event) => {
                    try {
                      utils.preventEvent(event);
                      clearTimeout(timeId);
                      qmsg.info("等待3s内触发成功复制的回调");
                      timeId = setTimeoutLog(() => {
                        TagUtil.setTag(container.$leftText, "error", "不支持触发回调函数");
                      }, 3e3);
                      await data.fn("Test " + data.name, "text", () => {
                        clearTimeout(timeId);
                        TagUtil.setTag(container.$leftText, "success", "支持触发回调函数");
                      });
                    } catch (error) {
                      qmsg.error(error.toString(), { consoleLogContent: true });
                    }
                  });
                }
              };
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_setValue extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_setValue === "function";
    }
    getApiName() {
      return "GM_setValue";
    }
    getAsyncApiOption() {
      return {
        name: "GM.setValue",
        isSupport: this.isSupportGM() && typeof _GM.setValue === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_setValue(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.setValue,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          let apiNameTag = data.name;
          data.formList.push(
            ...[
              {
                key: `Test ${apiNameTag} boolean`,
                value: true,
                text: function() {
                  return `存储boolean类型`;
                },
                desc: function() {
                  return `"${this.key}": ${this.value}`;
                }
              },
              {
                key: `Test ${apiNameTag} number`,
                value: 1,
                text: function() {
                  return `存储number类型`;
                },
                desc: function() {
                  return `"${this.key}": ${this.value}`;
                }
              },
              {
                key: `Test ${apiNameTag} string`,
                value: "测试字符串",
                text: function() {
                  return `存储string类型`;
                },
                desc: function() {
                  return `"${this.key}": "${this.value}"`;
                }
              },
              {
                key: `Test ${apiNameTag} undefined`,
                value: void 0,
                text: function() {
                  return `存储undefined类型`;
                },
                desc: function() {
                  return `"${this.key}": ${this.value}`;
                }
              },
              {
                key: `Test ${apiNameTag} null`,
                value: null,
                text: function() {
                  return `存储object类型的null`;
                },
                desc: function() {
                  return `"${this.key}": ${this.value}`;
                }
              },
              {
                key: `Test ${apiNameTag} object`,
                value: { "object key": "object value" },
                text: function() {
                  return `存储object类型`;
                },
                desc: function() {
                  return `"${this.key}": ${JSON.stringify(this.value)}`;
                }
              }
            ].map((it) => {
              return (() => {
                let localStorageDataKey = it.key;
                let localStorageDataValue = it.value;
                return UIInfo(() => {
                  return {
                    text: it.text(),
                    description: it.desc(),
                    tag: "info",
                    afterRender(container) {
                      let $button = domUtils.parseHTML(
`
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                        false,
                        false
                      );
                      domUtils.after(container.$leftContainer, $button);
                      domUtils.on($button, "click", async (event) => {
                        utils.preventEvent(event);
                        try {
                          await data.fn(localStorageDataKey, localStorageDataValue);
                          qmsg.info("执行写入完毕,请自行查看是否成功写入");
                        } catch (error) {
                          qmsg.error(error.toString(), { consoleLogContent: true });
                        }
                      });
                    }
                  };
                });
              })();
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_setValues extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_setValues === "function";
    }
    getApiName() {
      return "GM_setValues";
    }
    getAsyncApiOption() {
      return {
        name: "GM.setValues",
        isSupport: this.isSupportGM() && typeof _GM.setValues === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_setValues(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.setValues,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name;
          data.formList.push(
            (() => {
              let localStorageDataValue = { foo: 1, bar: 2 };
              return UIInfo(() => {
                return {
                  text: "测试存储对象",
                  description: JSON.stringify(localStorageDataValue),
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      utils.preventEvent(event);
                      try {
                        await data.fn(localStorageDataValue);
                        qmsg.info("执行写入完毕,请自行查看是否成功写入");
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              });
            })()
          );
        });
      }
      return result;
    }
  }
  class ApiTest_unregisterMenuCommand extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_unregisterMenuCommand === "function";
    }
    getApiName() {
      return "GM_unregisterMenuCommand";
    }
    getAsyncApiOption() {
      return {
        name: "GM.unregisterMenuCommand",
        isSupport: this.isSupportGM() && typeof _GM.unregisterMenuCommand === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                const ret = _GM_unregisterMenuCommand(...args);
                resolve(ret);
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.unregisterMenuCommand,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: "注册并卸载菜单 ==> Test UnRegister Menu",
                  description: "请自行验证是否成功卸载菜单",
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let timeId;
                    domUtils.on($button, "click", (event) => {
                      try {
                        utils.preventEvent(event);
                        clearTimeout(timeId);
                        const menuCommandId = _GM_registerMenuCommand("Test UnRegister Menu", (event2) => {
                        });
                        qmsg.info("已注册菜单,10s后自动执行卸载", {
                          timeout: 10 * 1e3
                        });
                        clearTimeout(timeId);
                        timeId = setTimeoutLog(async () => {
                          await data.fn(menuCommandId);
                          qmsg.success("已执行卸载菜单命令,请自行验证");
                        }, 10 * 1e3);
                      } catch (error) {
                        qmsg.error(error.toString(), { consoleLogContent: true });
                      }
                    });
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            })
          );
        });
      }
      return result;
    }
  }
  class ApiTest_unsafeWindow extends ApiAsyncTestBase {
    getApiName() {
      return "unsafeWindow";
    }
    getAsyncApiOption() {
      return void 0;
    }
    isSupport() {
      return typeof _unsafeWindow === "object" && _unsafeWindow != null;
    }
    getUIOption() {
      let apiName = this.getApiName();
      let result = {
        id: "aside-" + apiName,
        title: apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        result["forms"][1].forms.push(
          UIInfo(() => {
            let key = "test-gm-window";
            let flag = _monkeyWindow == _unsafeWindow;
            _monkeyWindow[key] = key;
            flag = typeof _unsafeWindow[key] !== "string";
            Reflect.deleteProperty(_monkeyWindow, key);
            if (flag) {
              return {
                text: "window已被Proxy代理",
                tag: "success"
              };
            } else {
              return {
                text: "window未被Proxy代理,定义全局变量时会影响到页面变量",
                tag: "warn"
              };
            }
          })
        );
      }
      return result;
    }
  }
  class ApiTest_webRequest extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_webRequest === "function";
    }
    getApiName() {
      return "GM_webRequest";
    }
    getAsyncApiOption() {
      return {
        name: "GM.webRequest",
        isSupport: this.isSupportGM() && typeof _GM.webRequest === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        result["forms"][1].forms.push(
          UIInfo(() => {
            try {
              return {
                text: CommonUtil2.escapeHtml("TODO"),
                tag: "info"
              };
            } catch (error) {
              console.error(error);
              return {
                text: "执行错误 " + error,
                tag: "error"
              };
            } finally {
            }
          })
        );
      }
      return result;
    }
  }
  class ApiTest_xmlHttpRequest extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_xmlhttpRequest === "function";
    }
    getApiName() {
      return "GM_xmlhttpRequest";
    }
    getAsyncApiOption() {
      return {
        name: "GM.xmlHttpRequest",
        isSupport: this.isSupportGM() && typeof _GM.xmlHttpRequest === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: "支持 " + apiName,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              ),
              UIInfo(
                () => apiAsyncInfo.isSupport ? {
                  text: "支持 " + apiAsyncInfo.name,
                  tag: "success"
                } : {
                  text: "不支持 " + apiAsyncInfo.name,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          }
        ]
      };
      if (this.isSupport()) {
        result["forms"][1].forms.push(
          UIInfo(() => {
            try {
              return {
                text: CommonUtil2.escapeHtml("TODO"),
                tag: "info"
              };
            } catch (error) {
              console.error(error);
              return {
                text: "执行错误 " + error,
                tag: "error"
              };
            } finally {
            }
          })
        );
      }
      return result;
    }
  }
  class ApiTest_GM extends ApiAsyncTestBase {
    getApiName() {
      return "GM";
    }
    getAsyncApiOption() {
      return void 0;
    }
    isSupport() {
      return typeof _GM === "object" && _GM != null;
    }
    getUIOption() {
      return void 0;
    }
  }
  class ApiTest_audio extends ApiAsyncTestBase {
    isSupport() {
      return (typeof _GM_audio === "object" || typeof _GM_audio === "function") && _GM_audio != null && typeof _GM_audio?.setMute === "function" && typeof _GM_audio?.getState === "function" && typeof _GM_audio?.addStateChangeListener === "function" && typeof _GM_audio?.removeStateChangeListener === "function";
    }
    getApiOption() {
      let isSupport = this.isSupport();
      return {
        isSupport_setMute: isSupport && typeof _GM_audio?.setMute === "function",
        isSupport_getState: isSupport && typeof _GM_audio?.getState === "function",
        isSupport_addStateChangeListener: isSupport && typeof _GM_audio?.addStateChangeListener === "function",
        isSupport_removeStateChangeListener: isSupport && typeof _GM_audio?.removeStateChangeListener === "function"
      };
    }
    getApiName() {
      return "GM_audio";
    }
    getAsyncApiOption() {
      let isSupportAsync = this.isSupportGM() && (typeof _GM.audio === "object" || typeof _GM.audio === "function") && _GM.audio != null && typeof _GM.audio?.setMute === "function" && typeof _GM.audio?.getState === "function" && typeof _GM.audio?.addStateChangeListener === "function" && typeof _GM.audio?.removeStateChangeListener === "function";
      return {
        name: "GM.audio",
        isSupport: isSupportAsync,
        isSupport_setMute: isSupportAsync && typeof _GM.audio?.setMute === "function",
        isSupport_getState: isSupportAsync && typeof _GM.audio?.getState === "function",
        isSupport_addStateChangeListener: isSupportAsync && typeof _GM.audio?.addStateChangeListener === "function",
        isSupport_removeStateChangeListener: isSupportAsync && typeof _GM.audio?.removeStateChangeListener === "function"
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiInfo = this.getApiOption();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(
        apiName + ".setMute",
        `${apiName} & ${apiAsyncInfo.name}`
      )}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "函数测试",
            forms: [
              UIInfo(
                () => this.isSupport() ? {
                  text: `支持 ${apiName},类型:${typeof _GM_audio}`,
                  tag: "success"
                } : {
                  text: "不支持 " + apiName,
                  tag: "error"
                }
              )
            ]
          },
          {
            type: "forms",
            text: "功能测试",
            forms: []
          },
          {
            type: "forms",
            text: "功能测试(异步)",
            forms: []
          }
        ]
      };
      let firstFormList = result["forms"][0].forms;
      if (this.isSupport()) {
        firstFormList.push(
          UIInfo(() => {
            return apiInfo.isSupport_setMute ? {
              text: `支持 ${apiName}.setMute`,
              tag: "success"
            } : {
              text: `不支持 ${apiName}.setMute`,
              tag: "error"
            };
          }),
          UIInfo(() => {
            return apiInfo.isSupport_getState ? {
              text: `支持 ${apiName}.getState`,
              tag: "success"
            } : {
              text: `不支持 ${apiName}.getState`,
              tag: "error"
            };
          }),
          UIInfo(() => {
            return apiInfo.isSupport_addStateChangeListener ? {
              text: `支持 ${apiName}.addStateChangeListener`,
              tag: "success"
            } : {
              text: `不支持 ${apiName}.addStateChangeListener`,
              tag: "error"
            };
          }),
          UIInfo(() => {
            return apiInfo.isSupport_removeStateChangeListener ? {
              text: `支持 ${apiName}.removeStateChangeListener`,
              tag: "success"
            } : {
              text: `不支持 ${apiName}.removeStateChangeListener`,
              tag: "error"
            };
          })
        );
      }
      if (apiAsyncInfo.isSupport) {
        firstFormList.push(
          UIInfo(() => {
            return apiAsyncInfo.isSupport_setMute ? {
              text: `支持 ${apiAsyncInfo.name}.setMute`,
              tag: "success"
            } : {
              text: `不支持 ${apiAsyncInfo.name}.setMute`,
              tag: "error"
            };
          }),
          UIInfo(() => {
            return apiAsyncInfo.isSupport_getState ? {
              text: `支持 ${apiAsyncInfo.name}.getState`,
              tag: "success"
            } : {
              text: `不支持 ${apiAsyncInfo.name}.getState`,
              tag: "error"
            };
          }),
          UIInfo(() => {
            return apiAsyncInfo.isSupport_addStateChangeListener ? {
              text: `支持 ${apiAsyncInfo.name}.addStateChangeListener`,
              tag: "success"
            } : {
              text: `不支持 ${apiAsyncInfo.name}.addStateChangeListener`,
              tag: "error"
            };
          }),
          UIInfo(() => {
            return apiAsyncInfo.isSupport_removeStateChangeListener ? {
              text: `支持 ${apiAsyncInfo.name}.removeStateChangeListener`,
              tag: "success"
            } : {
              text: `不支持 ${apiAsyncInfo.name}.removeStateChangeListener`,
              tag: "error"
            };
          })
        );
      } else {
        firstFormList.push(
          UIInfo(() => {
            return { text: "不支持 " + apiAsyncInfo.name, tag: "error" };
          })
        );
      }
      if (this.isSupport()) {
        [
          {
            name: apiName,
            setMute: async (...args) => {
              return new Promise((resolve, reject) => {
                const [details, cb] = args;
                _GM_audio.setMute(details, (error) => {
                  if (error) {
                    reject(error);
                  } else {
                    resolve(void 0);
                  }
                });
              });
            },
            getState: async (...args) => {
              return new Promise((resolve, reject) => {
                const [details, cb] = args;
                _GM_audio.getState((info) => {
                  if (!info) reject(new Error("failed to read state"));
                  resolve(info);
                });
              });
            },
            addStateChangeListener: async (...args) => {
              return new Promise((resolve, reject) => {
                const [cb] = args;
                _GM_audio.addStateChangeListener(cb, (err) => {
                  if (err) {
                    reject(err);
                  } else {
                    resolve(void 0);
                  }
                });
              });
            },
            removeStateChangeListener: async (...args) => {
              return new Promise((resolve, reject) => {
                const [cb] = args;
                _GM_audio.removeStateChangeListener(cb, (err) => {
                  if (err) {
                    reject(err);
                  } else {
                    resolve(void 0);
                  }
                });
              });
            },
            formList: result["forms"][1].forms
          },
          {
            name: apiAsyncInfo.name,
            setMute: async (...args) => {
              const [details] = args;
              const stat = await _GM.audio?.setMute(details);
              return stat;
            },
            getState: async (...args) => {
              const stat = await _GM.audio?.getState();
              if (typeof stat === "object" && stat != null) {
                if (typeof stat?.isMuted !== "boolean") {
                  throw new Error("GM.audio.getState 返回值类型错误");
                }
                return stat;
              } else {
                throw new Error("返回值不是一个对象");
              }
            },
            addStateChangeListener: _GM.audio?.addStateChangeListener,
            removeStateChangeListener: _GM.audio?.removeStateChangeListener,
            formList: result["forms"][2].forms
          }
        ].forEach((data) => {
          data.name;
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil2.escapeHtml("测试设置当前tab静音"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
                                        <div class="pops-panel-button pops-panel-button-no-icon">
                                            <button class="pops-panel-button_inner" type="button" data-type="default">
                                                <i class="pops-bottom-icon" is-loading="false"></i>
                                                <span class="pops-panel-button-text">点击执行</span>
                                            </button>
                                        </div>
                                        `,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        const stat = await data.setMute({ isMuted: true });
                        console.log(data.name + ".setMute result:", stat);
                        if (stat === void 0) {
                          TagUtil.setTag(container.$leftText, "success", "执行成功");
                        } else {
                          TagUtil.setTag(container.$leftText, "warn", "执行成功,但返回值类型不同:" + stat);
                        }
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                      } catch (error) {
                        qmsg.error(error.toString(), {
                          consoleLogContent: true
                        });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil2.escapeHtml("测试取消当前tab静音"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
                                        <div class="pops-panel-button pops-panel-button-no-icon">
                                            <button class="pops-panel-button_inner" type="button" data-type="default">
                                                <i class="pops-bottom-icon" is-loading="false"></i>
                                                <span class="pops-panel-button-text">点击执行</span>
                                            </button>
                                        </div>
                                        `,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        const state = await data.setMute({ isMuted: false });
                        console.log(data.name + ".setMute result:", state);
                        if (state === void 0) {
                          TagUtil.setTag(container.$leftText, "success", "执行成功");
                        } else {
                          TagUtil.setTag(container.$leftText, "warn", "执行成功,但返回值类型不同:" + state);
                        }
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                      } catch (error) {
                        qmsg.error(error.toString(), {
                          consoleLogContent: true
                        });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil2.escapeHtml("获取当前tab静音状态信息"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        const stateInfo = await data.getState();
                        console.log(data.name + ".getState result:", stateInfo);
                        if (typeof stateInfo === "object" && stateInfo !== null) {
                          const propSupport = [];
                          if (typeof stateInfo?.isMuted === "boolean") {
                            propSupport.push(
`
                                                        <p class="support-info success">支持属性:isMuted,当前类型:${typeof stateInfo?.isMuted}</p>    
                                                    `
                            );
                          } else {
                            propSupport.push(
`
                                                        <p class="support-info error">不支持属性:isMuted,当前类型:${typeof stateInfo?.isMuted}</p>    
                                                    `
                            );
                          }
                          if ("muteReason" in stateInfo && typeof stateInfo?.muteReason === "string" || stateInfo?.muteReason === void 0) {
                            propSupport.push(
`
                                                        <p class="support-info success">支持属性:muteReason,当前类型:${typeof stateInfo?.muteReason}</p>    
                                                    `
                            );
                          } else {
                            propSupport.push(
`
                                                        <p class="support-info error">不支持属性:muteReason,当前类型:${typeof stateInfo?.muteReason}</p>    
                                                    `
                            );
                          }
                          if (typeof stateInfo?.isAudible === "boolean") {
                            propSupport.push(
`
                                                        <p class="support-info success">支持属性:isAudible,当前类型:${typeof stateInfo?.isAudible}</p>
                                                    `
                            );
                          } else {
                            propSupport.push(
`
                                                        <p class="support-info error">不支持属性:isAudible,当前类型:${typeof stateInfo?.isAudible}</p>
                                                    `
                            );
                          }
                          TagUtil.setTag(container.$leftText, "success", propSupport.join("\n"));
                        } else {
                          TagUtil.setTag(container.$leftText, "error", "返回值类型错误:" + typeof stateInfo);
                        }
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        alert(JSON.stringify(stateInfo, null, 4));
                      } catch (error) {
                        qmsg.error(error.toString(), {
                          consoleLogContent: true
                        });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil2.escapeHtml("测试监听静音状态改变"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    let timeId;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        await data.addStateChangeListener((statusInfo) => {
                          console.log(
                            data.name + ".addStateChangeListener callback change value:",
                            statusInfo
                          );
                          alert(JSON.stringify(statusInfo, null, 4));
                        });
                        await utils.sleep(500);
                        await data.setMute({ isMuted: true });
                        await utils.sleep(500);
                        await data.setMute({ isMuted: false });
                      } catch (error) {
                        qmsg.error(error.toString(), {
                          consoleLogContent: true
                        });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil2.escapeHtml("测试移除监听器"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.parseHTML(
`
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    let isSuccessRemove = true;
                    let $loading;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        utils.preventEvent(event);
                        let listener = (statusInfo) => {
                          isSuccessRemove = false;
                          qmsg.error("移除监听器失败");
                        };
                        $loading = qmsg.loading("处理监听器中...");
                        await data.addStateChangeListener(listener);
                        await data.removeStateChangeListener(listener);
                        $loading.setText("等待500ms,设置当前Tab静音");
                        await utils.sleep(500);
                        await data.setMute({ isMuted: true });
                        $loading.setText("等待500ms,设置当前Tab取消静音");
                        await utils.sleep(500);
                        await data.setMute({ isMuted: false });
                        $loading.close();
                        if (isSuccessRemove) {
                          qmsg.success("移除监听器成功");
                        }
                      } catch (error) {
                        $loading?.close();
                        qmsg.error(error.toString(), {
                          consoleLogContent: true
                        });
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  }
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error"
                };
              } finally {
              }
            })
          );
        });
      }
      return result;
    }
  }
  const GMTotal = {
    unsafeWindow: new ApiTest_unsafeWindow(),
    GM: new ApiTest_GM(),
    addElement: new ApiTest_addElement(),
    addStyle: new ApiTest_addStyle(),
    download: new ApiTest_download(),
    getResourceText: new ApiTest_getResourceText(),
    getResourceUrl: new ApiTest_getResourceUrl(),
    info: new ApiTest_info(),
    log: new ApiTest_log(),
    notification: new ApiTest_notification(),
    openInTab: new ApiTest_openInTab(),
    registerMenuCommand: new ApiTest_registerMenuCommand(),
    unregisterMenuCommand: new ApiTest_unregisterMenuCommand(),
    setClipboard: new ApiTest_setClipboard(),
    getTab: new ApiTest_getTab(),
    saveTab: new ApiTest_saveTab(),
    getTabs: new ApiTest_getTabs(),
    setValue: new ApiTest_setValue(),
    getValue: new ApiTest_getValue(),
    deleteValue: new ApiTest_deleteValue(),
    listValues: new ApiTest_listValues(),
    setValues: new ApiTest_setValues(),
    getValues: new ApiTest_getValues(),
    deleteValues: new ApiTest_deleteValues(),
    addValueChangeListener: new ApiTest_addValueChangeListener(),
    removeValueChangeListener: new ApiTest_removeValueChangeListener(),
    xmlHttpRequest: new ApiTest_xmlHttpRequest(),
    webRequest: new ApiTest_webRequest(),
    cookie: new ApiTest_cookie(),
    audio: new ApiTest_audio()
  };
  const LocalStorageApi = {
    $storageKey: "gm-api-test-storage-config",
    set(key, value) {
      let config = window.localStorage.getItem(LocalStorageApi.$storageKey) ?? "{}";
      let configJSON = utils.toJSON(config);
      configJSON[key] = value;
      window.localStorage.setItem(
        LocalStorageApi.$storageKey,
        JSON.stringify(configJSON, (key2, value2) => {
          return typeof value2 === "function" ? value2.tString() : value2;
        })
      );
    },
    get(key, defaultValue) {
      let config = window.localStorage.getItem(LocalStorageApi.$storageKey) ?? "{}";
      let configJSON = utils.toJSON(config);
      return configJSON[key] ?? defaultValue;
    },
    delete(key) {
      let config = window.localStorage.getItem(LocalStorageApi.$storageKey) ?? "{}";
      let configJSON = utils.toJSON(config);
      Reflect.deleteProperty(configJSON, key);
      window.localStorage.setItem(
        LocalStorageApi.$storageKey,
        JSON.stringify(configJSON, (key2, value) => {
          return typeof value === "function" ? value.tString() : value;
        })
      );
    }
  };
  const StorageApi = {
set(key, value) {
      if (GMTotal.setValue.isSupport() && GMTotal.getValue.isSupport() && GMTotal.deleteValue.isSupport()) {
        _GM_setValue(key, value);
      } else {
        LocalStorageApi.set(key, value);
      }
    },
get(key, defaultValue) {
      if (GMTotal.setValue.isSupport() && GMTotal.getValue.isSupport() && GMTotal.deleteValue.isSupport()) {
        return _GM_getValue(key, defaultValue);
      } else {
        return LocalStorageApi.get(key, defaultValue);
      }
    },
delete(key) {
      if (GMTotal.setValue.isSupport() && GMTotal.getValue.isSupport() && GMTotal.deleteValue.isSupport()) {
        _GM_deleteValue(key);
      } else {
        LocalStorageApi.delete(key);
      }
    }
  };
  const Component_Common = () => {
    let supportApiNameList = [];
    let notSupportApiNameList = [];
    Object.keys(GMTotal).forEach((keyName) => {
      let value = GMTotal[keyName];
      let apiName = value.getApiName();
      let isSupport = value.isSupport();
      let apiAsyncInfo = value.getAsyncApiOption();
      if (isSupport) {
        supportApiNameList.push({
          name: apiName,
          isSupport
        });
      } else {
        notSupportApiNameList.push({
          name: apiName,
          isSupport
        });
      }
      if (apiAsyncInfo) {
        if (apiAsyncInfo.isSupport) {
          supportApiNameList.push({
            name: apiAsyncInfo.name,
            isSupport: apiAsyncInfo.isSupport,
            leftTargetSelector: "#aside-" + apiName
          });
        } else {
          notSupportApiNameList.push({
            name: apiAsyncInfo.name,
            isSupport: apiAsyncInfo.isSupport,
            leftTargetSelector: "#aside-" + apiName
          });
        }
      }
    });
    let createFeatureItem = (config) => {
      let $item = domUtils.createElement("div", {
        className: "gm-api-features-item",
        innerHTML: (
`
				<div class="gm-api-features-item__label">${config.name}</div>
				<div class="gm-api-features-item__value">
					<span style="font-size: 16px; font-weight: 700;">
						${config.isSupport ? (
`
							<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 512 512" fill="currentColor">
								<path d="M448 71.9c-17.3-13.4-41.5-9.3-54.1 9.1L214 344.2l-99.1-107.3c-14.6-16.6-39.1-17.4-54.7-1.8-15.6 15.5-16.4 41.6-1.7 58.1 0 0 120.4 133.6 137.7 147 17.3 13.4 41.5 9.3 54.1-9.1l206.3-301.7c12.6-18.5 8.7-44.2-8.6-57.5z" fill="#3b9f04"></path>
							</svg>
						`
        ) : (
`
							<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 512 512" fill="currentColor">
								<path fill="#FF473E" d="m330.443 256l136.765-136.765c14.058-14.058 14.058-36.85 0-50.908l-23.535-23.535c-14.058-14.058-36.85-14.058-50.908 0L256 181.557L119.235 44.792c-14.058-14.058-36.85-14.058-50.908 0L44.792 68.327c-14.058 14.058-14.058 36.85 0 50.908L181.557 256L44.792 392.765c-14.058 14.058-14.058 36.85 0 50.908l23.535 23.535c14.058 14.058 36.85 14.058 50.908 0L256 330.443l136.765 136.765c14.058 14.058 36.85 14.058 50.908 0l23.535-23.535c14.058-14.058 14.058-36.85 0-50.908L330.443 256z"></path>
							</svg>
						`
        )}
						
					</span>
				</div>
			`
        )
      });
      domUtils.on($item, "click", (event) => {
        utils.preventEvent(event);
        let shadowRoot = $item.getRootNode();
        let selector = utils.isNotNull(config.leftTargetSelector) ? config.leftTargetSelector : "#aside-" + config.name;
        let $left = shadowRoot.querySelector(selector);
        if ($left) {
          $left.click();
          $left.scrollIntoView({ behavior: "smooth" });
        }
      });
      return $item;
    };
    return {
      id: "component-common",
      title: "通用",
      scrollToDefaultView: true,
      isDefault() {
        return StorageApi.get(PanelKeyConfig.asideLastVisit) === "component-common";
      },
      clickCallback(data) {
        StorageApi.set(PanelKeyConfig.asideLastVisit, "component-common");
      },
      forms: [
        {
          type: "forms",
          text: "@run-at document-start<br>注:注入速度等级越低,注入的速度越快<br>范围:0~4",
          forms: [
            UIInfo(() => {
              return {
                text: CommonUtil2.escapeHtml(injectDocumentTime),
                tag: "info"
              };
            })
          ]
        },
        {
          type: "forms",
          text: "特性",
          afterAddToUListCallBack(formConfig, container) {
            container.formHeaderDivElement.style.fontSize = "1.2em";
            container.formHeaderDivElement.style.fontWeight = "700";
          },
          forms: []
        },
        {
          type: "forms",
          text: "不支持列表",
          afterAddToUListCallBack(formConfig, container) {
            container.formHeaderDivElement.style.color = "rgb(216, 30, 6)";
            container.formHeaderDivElement.style.fontWeight = "600";
            if (notSupportApiNameList.length === 0) {
              container.formContainerListElement?.remove();
            }
          },
          forms: [
            {
              type: "own",
              getLiElementCallBack(liElement) {
                let $container = domUtils.createElement("div", {
                  className: "gm-api-features-not-support"
                });
                let $fragment = document.createDocumentFragment();
                notSupportApiNameList.forEach((config) => {
                  $fragment.append(createFeatureItem(config));
                });
                $container.appendChild($fragment);
                liElement.appendChild($container);
                return liElement;
              }
            }
          ]
        },
        {
          type: "forms",
          text: "支持列表",
          afterAddToUListCallBack(formConfig, container) {
            container.formHeaderDivElement.style.fontWeight = "600";
            if (supportApiNameList.length === 0) {
              container.formContainerListElement?.remove();
            }
          },
          forms: [
            {
              type: "own",
              getLiElementCallBack(liElement) {
                let $container = domUtils.createElement("div", {
                  className: "gm-api-features-support"
                });
                let $fragment = document.createDocumentFragment();
                supportApiNameList.forEach((config) => {
                  $fragment.append(createFeatureItem(config));
                });
                $container.appendChild($fragment);
                liElement.appendChild($container);
                return liElement;
              }
            }
          ]
        }
      ]
    };
  };
  class GrantTest_onurlchange extends ApiTestBase {
    getApiName() {
      return "window.onurlchange ";
    }
    getAsyncApiOption() {
      return void 0;
    }
    isSupport() {
      return true;
    }
    getUIOption() {
      let apiName = this.getApiName();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "功能测试",
            forms: [
              UIInfo(() => {
                try {
                  return {
                    text: CommonUtil2.escapeHtml("测试window.onurlchange"),
                    tag: "info",
                    description: "点击按钮进行测试",
                    afterRender(container) {
                      let $button = domUtils.parseHTML(
`
											<div class="pops-panel-button pops-panel-button-no-icon">
												<button class="pops-panel-button_inner" type="button" data-type="default">
													<i class="pops-bottom-icon" is-loading="false"></i>
													<span class="pops-panel-button-text">点击执行</span>
												</button>
											</div>
											`,
                        false,
                        false
                      );
                      let urlChangeEvent = (info) => {
                        clearTimeout(timeId);
                        console.log("urlchange event info ==> ", info);
                        qmsg.success("urlchange event ==> url is changed");
                      };
                      let timeId;
                      domUtils.on($button, "click", (event) => {
                        try {
                          utils.preventEvent(event);
                          clearTimeout(timeId);
                          if (_monkeyWindow.onurlchange === null) {
                            _monkeyWindow.removeEventListener("urlchange", urlChangeEvent);
                            _monkeyWindow.addEventListener("urlchange", urlChangeEvent);
                            window.history.pushState({}, "", "#/onurlchange");
                            timeId = setTimeout(() => {
                              qmsg.error("urlchange event is not trigger");
                            }, 1e3);
                          } else {
                            qmsg.error("window.onurlchange is not null");
                          }
                        } catch (error) {
                          qmsg.error(error.toString(), {
                            consoleLogContent: true
                          });
                        }
                      });
                      domUtils.after(container.$leftContainer, $button);
                    }
                  };
                } catch (error) {
                  console.error(error);
                  return {
                    text: "执行错误 " + error,
                    tag: "error"
                  };
                } finally {
                }
              })
            ]
          }
        ]
      };
      return result;
    }
  }
  class GrantTest_close extends ApiTestBase {
    getApiName() {
      return "window.close ";
    }
    getAsyncApiOption() {
      return void 0;
    }
    isSupport() {
      return true;
    }
    getUIOption() {
      let apiName = this.getApiName();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "功能测试",
            forms: [
              UIInfo(() => {
                try {
                  return {
                    text: CommonUtil2.escapeHtml("测试window.close"),
                    tag: "info",
                    description: "点击按钮执行该函数",
                    afterRender(container) {
                      let $button = domUtils.parseHTML(
`
											<div class="pops-panel-button pops-panel-button-no-icon">
												<button class="pops-panel-button_inner" type="button" data-type="default">
													<i class="pops-bottom-icon" is-loading="false"></i>
													<span class="pops-panel-button-text">点击执行</span>
												</button>
											</div>
											`,
                        false,
                        false
                      );
                      domUtils.on($button, "click", (event) => {
                        utils.preventEvent(event);
                        try {
                          _monkeyWindow.close();
                        } catch (error) {
                          qmsg.error(error.toString(), {
                            consoleLogContent: true
                          });
                        }
                      });
                      domUtils.after(container.$leftContainer, $button);
                    }
                  };
                } catch (error) {
                  console.error(error);
                  return {
                    text: "执行错误 " + error,
                    tag: "error"
                  };
                } finally {
                }
              })
            ]
          }
        ]
      };
      return result;
    }
  }
  class GrantTest_focus extends ApiTestBase {
    getApiName() {
      return "window.focus ";
    }
    getAsyncApiOption() {
      return void 0;
    }
    isSupport() {
      return true;
    }
    getUIOption() {
      let apiName = this.getApiName();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        forms: [
          {
            type: "forms",
            text: "功能测试",
            forms: [
              UIInfo(() => {
                try {
                  return {
                    text: CommonUtil2.escapeHtml("测试window.focus"),
                    tag: "info",
                    description: "点击按钮执行该函数",
                    afterRender(container) {
                      let $button = domUtils.parseHTML(
`
											<div class="pops-panel-button pops-panel-button-no-icon">
												<button class="pops-panel-button_inner" type="button" data-type="default">
													<i class="pops-bottom-icon" is-loading="false"></i>
													<span class="pops-panel-button-text">点击执行</span>
												</button>
											</div>
										`,
                        false,
                        false
                      );
                      let blurEvent = () => {
                        setTimeout(() => {
                          _monkeyWindow.focus();
                        }, 3e3);
                      };
                      domUtils.on($button, "click", (event) => {
                        utils.preventEvent(event);
                        window.removeEventListener("blur", blurEvent, {
                          capture: true
                        });
                        window.addEventListener("blur", blurEvent, {
                          capture: true,
                          once: true
                        });
                        try {
                          qmsg.info("请切换至其它Tab页面,切换完毕3秒后会自动调用该函数");
                        } catch (error) {
                          qmsg.error(error.toString(), {
                            consoleLogContent: true
                          });
                        }
                      });
                      domUtils.after(container.$leftContainer, $button);
                    }
                  };
                } catch (error) {
                  console.error(error);
                  return {
                    text: "执行错误 " + error,
                    tag: "error"
                  };
                } finally {
                }
              })
            ]
          }
        ]
      };
      return result;
    }
  }
  if (Panel.isTopWindow()) {
    let showPanel = () => {
      Panel.showPanel(PanelContent.getConfig(0), void 0, void 0, true);
    };
    let defaultMenuOption = PanelMenu.getMenuOption(0);
    defaultMenuOption.callback = () => {
      showPanel();
    };
    PanelMenu.updateMenuOption(defaultMenuOption);
    let configList = [Component_Common()];
    Object.keys(GMTotal).forEach((keyName) => {
      let value = GMTotal[keyName];
      let option = value.getUIOption();
      if (option) {
        configList.push(option);
      }
    });
    configList.push(new GrantTest_onurlchange().getUIOption());
    configList.push(new GrantTest_close().getUIOption());
    configList.push(new GrantTest_focus().getUIOption());
    PanelContent.addContentConfig(configList);
    Panel.$data.panelConfig = {
      style: (
`
		.success{
			color: green;
		}
		.error{
			color: red;
		}
		.warn,.warning{
			color: orange;
		}
		.info{
			color: #909090;
		}
		.support-info{
			font-weight: bold;
		}


		.gm-api-features-not-support,
		.gm-api-features-support{
			display: flex;
			gap: 8px;
			flex-wrap: wrap;
		}
		.gm-api-features-item{
			display: flex;
			align-items: center;
			width: 200px;
			max-width: 200px !important;
			justify-content: space-between;
			cursor: pointer;
			transition: all ease-out .1s;
			padding: 8px 16px;
			border-radius: 4px;
			font-size: 14px;
		}
		.gm-api-features-item:hover{
			box-shadow: 0 2px 5px 3px #0000001a;
		}
		.gm-api-features-item__label{
		}
		.gm-api-features-item__value span{
			display: flex;
			align-items: center;
		}
	`
      )
    };
    Panel.init();
    showPanel();
  }

})();